From a85b25f04f6ba5bb45c116927c9e5d0e4639dc97 Mon Sep 17 00:00:00 2001
From: phil <phil>
Date: Fri, 25 Jul 2003 18:10:53 +0000
Subject: [PATCH] merge b_devel into HEAD, which will become 0.7.3  - dozens
 and dozens of fixes for working with 2.6 kernels  - new 2.4 kernel APIs  -
 uncountable bug fixes

---
 lnet/tests/Makefile.mk                        |      9 +
 lnet/utils/Makefile.mk                        |      6 +
 lustre/include/linux/lustre_commit_confd.h    |     73 +
 lustre/include/linux/lustre_log.h             |     81 +
 lustre/include/linux/lustre_mgmt.h            |     34 +
 lustre/include/linux/obd_filter.h             |    104 -
 .../kernel_configs/kgdb-vmware-2.5.73         |    908 +
 .../patches/2.6.0-test1-mm2.patch             | 179799 +++++++++++++++
 .../kernel_patches/patches/dump_netdev.patch  |    340 +
 .../patches/ext3-2.4.18-fixes.patch           |    353 -
 .../patches/ext3-2.5-noread.patch             |    266 -
 .../kernel_patches/patches/ext3-2.5.63.patch  |    150 -
 .../patches/ext3-error-export.patch           |     16 +
 .../patches/ext3-map_inode_page.patch         |     84 +
 .../patches/ext3-map_inode_page_2.4.18.patch  |     86 +
 .../patches/ext3-noread-inode.patch           |    177 +
 ...-san.patch => ext3-san-jdike-2.5.73.patch} |     26 +-
 .../ext3-truncate_blocks-chaos.patch.patch    |     92 -
 .../ext3_delete_thread_2.4.20_chaos.patch     |    477 +
 .../patches/extN-delete_thread.patch          |    278 -
 .../patches/extN-iget-debug.patch             |     48 -
 .../patches/gpl_header-chaos-2.4.20.patch     |     11 +
 .../inode-protection-from-pdflush.patch       |     29 +
 .../invalidate_show_2.4.20_chaos.patch        |    112 +
 .../kernel_patches/patches/iopen-2.5.73.patch |    403 +
 .../patches/jbd-transno-cb.patch              |    240 -
 .../patches/kexec-2.5.73-full.patch           |   1479 +
 .../patches/kexec-2.6.0-full.patch            |   1428 +
 .../patches/kgdb-ga-2.5.73.patch              |   5046 +
 .../patches/kgdb-ga-docco-fixes-2.5.73.patch  |    347 +
 .../patches/kgdb-use-ggdb-2.5.73.patch        |     17 +
 .../patches/lkcd-cvs-2.5.69.patch             |   6418 +
 .../patches/lkcd-kernel-changes-2.5.73.patch  |    608 +
 .../lkcd-kernel-changes-2.6.0-test1.patch     |    588 +
 .../patches/lustre-2.5.63.patch               |    862 -
 .../kernel_patches/patches/lustre_build.patch |     33 +
 .../patches/netconsole_sysrq.patch            |     41 -
 .../patches/qla2xxx-v8.00.00b1-2.5.73.patch   |  58389 +++++
 .../patches/tcp_zero_copy_2.4.20_chaos.patch  |    459 +
 .../patches/tg3_netconsole.patch              |    247 -
 ....4.20-4.patch => uml-patch-2.4.20-6.patch} |   6406 +-
 .../patches/uml_compile_fixes.patch           |     18 -
 ...tch => vfs_intent-2.4.18-18-chaos65.patch} |    955 +-
 .../patches/vfs_intent-2.4.20-hp.patch        |   1793 +
 .../patches/vfs_intent_2.4.20_chaos.patch     |   1716 +
 .../patches/vfs_intent_2.5.72_rev1.patch      |   1031 +
 .../patches/vfs_intent_2.6.0-test1.patch      |    764 +
 .../patches/vfs_mntcwd_2.5.72_rev1.patch      |      0
 .../patches/vfs_nointent_2.5.69_rev1.patch    |    409 +
 .../patches/vfs_races_2.5.72_rev1.patch       |     83 +
 lustre/kernel_patches/pc/2.6.0-test1-mm2.pc   |   1202 +
 lustre/kernel_patches/pc/dump_netdev.pc       |      9 +
 lustre/kernel_patches/pc/ext3-2.4.18-fixes.pc |      7 -
 lustre/kernel_patches/pc/ext3-2.5.63.pc       |      4 -
 lustre/kernel_patches/pc/ext3-error-export.pc |      1 +
 .../kernel_patches/pc/ext3-map_inode_page.pc  |      3 +
 .../pc/ext3-map_inode_page_2.4.18.pc          |      3 +
 ...xt3-2.5-noread.pc => ext3-noread-inode.pc} |      0
 .../{extN-san.pc => ext3-san-jdike-2.5.73.pc} |      0
 .../pc/ext3-truncate_blocks-chaos.patch.pc    |      1 -
 ....pc => ext3_delete_thread_2.4.20_chaos.pc} |      4 +-
 lustre/kernel_patches/pc/extN-iget-debug.pc   |      2 -
 .../pc/gpl_header-chaos-2.4.20.pc             |      1 +
 .../pc/inode-protection-from-pdflush.pc       |      2 +
 .../kernel_patches/pc/inode-unhash_2.5.75.pc  |      2 +
 .../pc/invalidate_show_2.4.20_chaos.pc        |      4 +
 lustre/kernel_patches/pc/iopen-2.5.73.pc      |      8 +
 lustre/kernel_patches/pc/jbd-transno-cb.pc    |      4 -
 lustre/kernel_patches/pc/kexec-2.5.73-full.pc |     23 +
 lustre/kernel_patches/pc/kexec-2.6.0-full.pc  |     23 +
 lustre/kernel_patches/pc/kgdb-ga-2.5.73.pc    |     28 +
 .../pc/kgdb-ga-docco-fixes-2.5.73.pc          |      1 +
 .../kernel_patches/pc/kgdb-use-ggdb-2.5.73.pc |      1 +
 lustre/kernel_patches/pc/lkcd-cvs-2.5.69.pc   |     19 +
 .../pc/lkcd-kernel-changes-2.5.73.pc          |     25 +
 .../pc/lkcd-kernel-changes-2.6.0-test1.pc     |     25 +
 lustre/kernel_patches/pc/lustre_build.pc      |      5 +
 lustre/kernel_patches/pc/netconsole_sysrq.pc  |      2 -
 .../pc/qla2xxx-v8.00.00b1-2.5.73.pc           |     42 +
 .../pc/tcp_zero_copy_2.4.20_chaos.pc          |      5 +
 lustre/kernel_patches/pc/tg3_netconsole.pc    |      1 -
 ...atch-2.4.20-4.pc => uml-patch-2.4.20-6.pc} |     78 +-
 lustre/kernel_patches/pc/uml_compile_fixes.pc |      1 -
 ...-18.pc => vfs_intent-2.4.18-18-chaos65.pc} |      8 +-
 .../kernel_patches/pc/vfs_intent-2.4.20-hp.pc |     14 +
 .../pc/vfs_intent_2.4.20_chaos.pc             |     14 +
 ...re-2.5.63.pc => vfs_intent_2.5.72_rev1.pc} |     14 +-
 .../pc/vfs_intent_2.6.0-test1.pc              |     14 +
 .../pc/vfs_mntcwd_2.5.72_rev1.pc              |      0
 .../pc/vfs_nointent_2.5.69_rev1.pc            |      4 +
 .../pc/vfs_races_2.5.72_rev1.pc               |      3 +
 .../series/{chaos => chaos-2.4.18}            |      5 +-
 lustre/kernel_patches/series/chaos-2.4.20     |     24 +
 lustre/kernel_patches/series/kgdb-2.5.73      |     19 +
 lustre/kernel_patches/series/kgdb_2.6.0_test1 |     15 +
 lustre/kernel_patches/series/rh-2.4.18-18     |     24 -
 lustre/kernel_patches/series/vanilla-2.5      |      2 -
 ...pile_fixes.txt => ext3-map_inode_page.txt} |      0
 .../txt/ext3-map_inode_page_2.4.18.txt        |      3 +
 lustre/ldlm/Makefile.mk                       |     10 +
 lustre/llite/llite_lib.c                      |    951 +
 lustre/lov/lov_internal.h                     |     26 +
 lustre/mdc/Makefile.mk                        |      9 +
 lustre/mds/commit_confd.c                     |     76 +
 lustre/obdclass/obdo.c                        |    343 +
 lustre/obdclass/recov_log.c                   |    470 +
 lustre/obdfilter/filter_internal.h            |    152 +
 lustre/obdfilter/filter_io.c                  |    806 +
 lustre/obdfilter/filter_log.c                 |    380 +
 lustre/obdfilter/filter_san.c                 |    124 +
 lustre/ost/Makefile.mk                        |      9 +
 lustre/portals/tests/Makefile.mk              |      9 +
 lustre/portals/utils/Makefile.mk              |      6 +
 lustre/ptlrpc/Makefile.mk                     |     11 +
 lustre/ptlrpc/recov_thread.c                  |    358 +
 lustre/tests/client-echo.cfg                  |      3 -
 lustre/tests/client-mount.cfg                 |      6 -
 lustre/tests/client-mount2.cfg                |     10 -
 lustre/tests/common.sh                        |    713 -
 lustre/tests/elan-client.cfg                  |      5 -
 lustre/tests/elan-server.cfg                  |      5 -
 lustre/tests/ext2_10000.gz                    |    Bin 10228 -> 0 bytes
 lustre/tests/ext2_25000.gz                    |    Bin 25136 -> 0 bytes
 lustre/tests/ext3_10000.gz                    |    Bin 12172 -> 0 bytes
 lustre/tests/fs.sh                            |     27 -
 lustre/tests/intent-test.sh                   |    122 -
 lustre/tests/intent-test2.sh                  |     70 -
 lustre/tests/ldlm.cfg                         |      3 -
 lustre/tests/llcleanup.sh                     |     19 -
 lustre/tests/lldlm.sh                         |     40 -
 lustre/tests/llext3.sh                        |     10 -
 lustre/tests/llmodules.sh                     |     41 -
 lustre/tests/llmount-client.sh                |      9 -
 lustre/tests/llmount-server.sh                |      9 -
 lustre/tests/llrext3.sh                       |     10 -
 lustre/tests/llrsetup.sh                      |     15 -
 lustre/tests/llsetup.sh                       |     15 -
 lustre/tests/llsimple.sh                      |     11 -
 lustre/tests/lustre.cfg                       |     49 -
 lustre/tests/mdcreq.sh                        |     37 -
 lustre/tests/mdcreqcleanup.sh                 |     34 -
 lustre/tests/mds.cfg                          |      7 -
 lustre/tests/modules.cfg                      |      3 -
 lustre/tests/net-client.cfg                   |      6 -
 lustre/tests/net-local.cfg                    |      6 -
 lustre/tests/net-server.cfg                   |      6 -
 lustre/tests/obddisk.cfg                      |      6 -
 lustre/tests/obdecho.cfg                      |      4 -
 lustre/tests/obdfilter.cfg                    |      7 -
 lustre/tests/ostreq.sh                        |     37 -
 lustre/tests/replay-single.sh                 |     81 +
 lustre/tests/runfailure-client-mds-recover.sh |    103 -
 lustre/tests/small_write.c                    |    134 +
 lustre/tests/snaprun.sh                       |     36 -
 lustre/tests/trivial.sh                       |     11 -
 155 files changed, 272701 insertions(+), 7787 deletions(-)
 create mode 100644 lnet/tests/Makefile.mk
 create mode 100644 lnet/utils/Makefile.mk
 create mode 100644 lustre/include/linux/lustre_commit_confd.h
 create mode 100644 lustre/include/linux/lustre_log.h
 create mode 100644 lustre/include/linux/lustre_mgmt.h
 delete mode 100644 lustre/include/linux/obd_filter.h
 create mode 100644 lustre/kernel_patches/kernel_configs/kgdb-vmware-2.5.73
 create mode 100644 lustre/kernel_patches/patches/2.6.0-test1-mm2.patch
 create mode 100644 lustre/kernel_patches/patches/dump_netdev.patch
 delete mode 100644 lustre/kernel_patches/patches/ext3-2.4.18-fixes.patch
 delete mode 100644 lustre/kernel_patches/patches/ext3-2.5-noread.patch
 delete mode 100644 lustre/kernel_patches/patches/ext3-2.5.63.patch
 create mode 100644 lustre/kernel_patches/patches/ext3-error-export.patch
 create mode 100644 lustre/kernel_patches/patches/ext3-map_inode_page.patch
 create mode 100644 lustre/kernel_patches/patches/ext3-map_inode_page_2.4.18.patch
 create mode 100644 lustre/kernel_patches/patches/ext3-noread-inode.patch
 rename lustre/kernel_patches/patches/{extN-san.patch => ext3-san-jdike-2.5.73.patch} (78%)
 delete mode 100644 lustre/kernel_patches/patches/ext3-truncate_blocks-chaos.patch.patch
 create mode 100644 lustre/kernel_patches/patches/ext3_delete_thread_2.4.20_chaos.patch
 delete mode 100644 lustre/kernel_patches/patches/extN-delete_thread.patch
 delete mode 100644 lustre/kernel_patches/patches/extN-iget-debug.patch
 create mode 100644 lustre/kernel_patches/patches/gpl_header-chaos-2.4.20.patch
 create mode 100644 lustre/kernel_patches/patches/inode-protection-from-pdflush.patch
 create mode 100644 lustre/kernel_patches/patches/invalidate_show_2.4.20_chaos.patch
 create mode 100644 lustre/kernel_patches/patches/iopen-2.5.73.patch
 delete mode 100644 lustre/kernel_patches/patches/jbd-transno-cb.patch
 create mode 100644 lustre/kernel_patches/patches/kexec-2.5.73-full.patch
 create mode 100644 lustre/kernel_patches/patches/kexec-2.6.0-full.patch
 create mode 100644 lustre/kernel_patches/patches/kgdb-ga-2.5.73.patch
 create mode 100644 lustre/kernel_patches/patches/kgdb-ga-docco-fixes-2.5.73.patch
 create mode 100644 lustre/kernel_patches/patches/kgdb-use-ggdb-2.5.73.patch
 create mode 100644 lustre/kernel_patches/patches/lkcd-cvs-2.5.69.patch
 create mode 100644 lustre/kernel_patches/patches/lkcd-kernel-changes-2.5.73.patch
 create mode 100644 lustre/kernel_patches/patches/lkcd-kernel-changes-2.6.0-test1.patch
 delete mode 100644 lustre/kernel_patches/patches/lustre-2.5.63.patch
 create mode 100644 lustre/kernel_patches/patches/lustre_build.patch
 delete mode 100644 lustre/kernel_patches/patches/netconsole_sysrq.patch
 create mode 100644 lustre/kernel_patches/patches/qla2xxx-v8.00.00b1-2.5.73.patch
 create mode 100644 lustre/kernel_patches/patches/tcp_zero_copy_2.4.20_chaos.patch
 delete mode 100644 lustre/kernel_patches/patches/tg3_netconsole.patch
 rename lustre/kernel_patches/patches/{uml-patch-2.4.20-4.patch => uml-patch-2.4.20-6.patch} (93%)
 delete mode 100644 lustre/kernel_patches/patches/uml_compile_fixes.patch
 rename lustre/kernel_patches/patches/{vfs_intent-2.4.18-18.patch => vfs_intent-2.4.18-18-chaos65.patch} (64%)
 create mode 100644 lustre/kernel_patches/patches/vfs_intent-2.4.20-hp.patch
 create mode 100644 lustre/kernel_patches/patches/vfs_intent_2.4.20_chaos.patch
 create mode 100644 lustre/kernel_patches/patches/vfs_intent_2.5.72_rev1.patch
 create mode 100644 lustre/kernel_patches/patches/vfs_intent_2.6.0-test1.patch
 create mode 100644 lustre/kernel_patches/patches/vfs_mntcwd_2.5.72_rev1.patch
 create mode 100644 lustre/kernel_patches/patches/vfs_nointent_2.5.69_rev1.patch
 create mode 100644 lustre/kernel_patches/patches/vfs_races_2.5.72_rev1.patch
 create mode 100644 lustre/kernel_patches/pc/2.6.0-test1-mm2.pc
 create mode 100644 lustre/kernel_patches/pc/dump_netdev.pc
 delete mode 100644 lustre/kernel_patches/pc/ext3-2.4.18-fixes.pc
 delete mode 100644 lustre/kernel_patches/pc/ext3-2.5.63.pc
 create mode 100644 lustre/kernel_patches/pc/ext3-error-export.pc
 create mode 100644 lustre/kernel_patches/pc/ext3-map_inode_page.pc
 create mode 100644 lustre/kernel_patches/pc/ext3-map_inode_page_2.4.18.pc
 rename lustre/kernel_patches/pc/{ext3-2.5-noread.pc => ext3-noread-inode.pc} (100%)
 rename lustre/kernel_patches/pc/{extN-san.pc => ext3-san-jdike-2.5.73.pc} (100%)
 delete mode 100644 lustre/kernel_patches/pc/ext3-truncate_blocks-chaos.patch.pc
 rename lustre/kernel_patches/pc/{extN-delete_thread.pc => ext3_delete_thread_2.4.20_chaos.pc} (68%)
 delete mode 100644 lustre/kernel_patches/pc/extN-iget-debug.pc
 create mode 100644 lustre/kernel_patches/pc/gpl_header-chaos-2.4.20.pc
 create mode 100644 lustre/kernel_patches/pc/inode-protection-from-pdflush.pc
 create mode 100644 lustre/kernel_patches/pc/inode-unhash_2.5.75.pc
 create mode 100644 lustre/kernel_patches/pc/invalidate_show_2.4.20_chaos.pc
 create mode 100644 lustre/kernel_patches/pc/iopen-2.5.73.pc
 delete mode 100644 lustre/kernel_patches/pc/jbd-transno-cb.pc
 create mode 100644 lustre/kernel_patches/pc/kexec-2.5.73-full.pc
 create mode 100644 lustre/kernel_patches/pc/kexec-2.6.0-full.pc
 create mode 100644 lustre/kernel_patches/pc/kgdb-ga-2.5.73.pc
 create mode 100644 lustre/kernel_patches/pc/kgdb-ga-docco-fixes-2.5.73.pc
 create mode 100644 lustre/kernel_patches/pc/kgdb-use-ggdb-2.5.73.pc
 create mode 100644 lustre/kernel_patches/pc/lkcd-cvs-2.5.69.pc
 create mode 100644 lustre/kernel_patches/pc/lkcd-kernel-changes-2.5.73.pc
 create mode 100644 lustre/kernel_patches/pc/lkcd-kernel-changes-2.6.0-test1.pc
 create mode 100644 lustre/kernel_patches/pc/lustre_build.pc
 delete mode 100644 lustre/kernel_patches/pc/netconsole_sysrq.pc
 create mode 100644 lustre/kernel_patches/pc/qla2xxx-v8.00.00b1-2.5.73.pc
 create mode 100644 lustre/kernel_patches/pc/tcp_zero_copy_2.4.20_chaos.pc
 delete mode 100644 lustre/kernel_patches/pc/tg3_netconsole.pc
 rename lustre/kernel_patches/pc/{uml-patch-2.4.20-4.pc => uml-patch-2.4.20-6.pc} (99%)
 delete mode 100644 lustre/kernel_patches/pc/uml_compile_fixes.pc
 rename lustre/kernel_patches/pc/{vfs_intent-2.4.18-18.pc => vfs_intent-2.4.18-18-chaos65.pc} (74%)
 create mode 100644 lustre/kernel_patches/pc/vfs_intent-2.4.20-hp.pc
 create mode 100644 lustre/kernel_patches/pc/vfs_intent_2.4.20_chaos.pc
 rename lustre/kernel_patches/pc/{lustre-2.5.63.pc => vfs_intent_2.5.72_rev1.pc} (63%)
 create mode 100644 lustre/kernel_patches/pc/vfs_intent_2.6.0-test1.pc
 create mode 100644 lustre/kernel_patches/pc/vfs_mntcwd_2.5.72_rev1.pc
 create mode 100644 lustre/kernel_patches/pc/vfs_nointent_2.5.69_rev1.pc
 create mode 100644 lustre/kernel_patches/pc/vfs_races_2.5.72_rev1.pc
 rename lustre/kernel_patches/series/{chaos => chaos-2.4.18} (82%)
 create mode 100644 lustre/kernel_patches/series/chaos-2.4.20
 create mode 100644 lustre/kernel_patches/series/kgdb-2.5.73
 create mode 100644 lustre/kernel_patches/series/kgdb_2.6.0_test1
 delete mode 100644 lustre/kernel_patches/series/rh-2.4.18-18
 delete mode 100644 lustre/kernel_patches/series/vanilla-2.5
 rename lustre/kernel_patches/txt/{uml_compile_fixes.txt => ext3-map_inode_page.txt} (100%)
 create mode 100644 lustre/kernel_patches/txt/ext3-map_inode_page_2.4.18.txt
 create mode 100644 lustre/ldlm/Makefile.mk
 create mode 100644 lustre/llite/llite_lib.c
 create mode 100644 lustre/lov/lov_internal.h
 create mode 100644 lustre/mdc/Makefile.mk
 create mode 100644 lustre/mds/commit_confd.c
 create mode 100644 lustre/obdclass/obdo.c
 create mode 100644 lustre/obdclass/recov_log.c
 create mode 100644 lustre/obdfilter/filter_internal.h
 create mode 100644 lustre/obdfilter/filter_io.c
 create mode 100644 lustre/obdfilter/filter_log.c
 create mode 100644 lustre/obdfilter/filter_san.c
 create mode 100644 lustre/ost/Makefile.mk
 create mode 100644 lustre/portals/tests/Makefile.mk
 create mode 100644 lustre/portals/utils/Makefile.mk
 create mode 100644 lustre/ptlrpc/Makefile.mk
 create mode 100644 lustre/ptlrpc/recov_thread.c
 delete mode 100644 lustre/tests/client-echo.cfg
 delete mode 100644 lustre/tests/client-mount.cfg
 delete mode 100644 lustre/tests/client-mount2.cfg
 delete mode 100644 lustre/tests/common.sh
 delete mode 100644 lustre/tests/elan-client.cfg
 delete mode 100644 lustre/tests/elan-server.cfg
 delete mode 100644 lustre/tests/ext2_10000.gz
 delete mode 100644 lustre/tests/ext2_25000.gz
 delete mode 100644 lustre/tests/ext3_10000.gz
 delete mode 100644 lustre/tests/fs.sh
 delete mode 100755 lustre/tests/intent-test.sh
 delete mode 100644 lustre/tests/intent-test2.sh
 delete mode 100644 lustre/tests/ldlm.cfg
 delete mode 100755 lustre/tests/llcleanup.sh
 delete mode 100755 lustre/tests/lldlm.sh
 delete mode 100755 lustre/tests/llext3.sh
 delete mode 100644 lustre/tests/llmodules.sh
 delete mode 100644 lustre/tests/llmount-client.sh
 delete mode 100644 lustre/tests/llmount-server.sh
 delete mode 100755 lustre/tests/llrext3.sh
 delete mode 100644 lustre/tests/llrsetup.sh
 delete mode 100644 lustre/tests/llsetup.sh
 delete mode 100755 lustre/tests/llsimple.sh
 delete mode 100644 lustre/tests/lustre.cfg
 delete mode 100644 lustre/tests/mdcreq.sh
 delete mode 100755 lustre/tests/mdcreqcleanup.sh
 delete mode 100644 lustre/tests/mds.cfg
 delete mode 100755 lustre/tests/modules.cfg
 delete mode 100644 lustre/tests/net-client.cfg
 delete mode 100644 lustre/tests/net-local.cfg
 delete mode 100644 lustre/tests/net-server.cfg
 delete mode 100644 lustre/tests/obddisk.cfg
 delete mode 100644 lustre/tests/obdecho.cfg
 delete mode 100644 lustre/tests/obdfilter.cfg
 delete mode 100644 lustre/tests/ostreq.sh
 create mode 100755 lustre/tests/replay-single.sh
 delete mode 100755 lustre/tests/runfailure-client-mds-recover.sh
 create mode 100644 lustre/tests/small_write.c
 delete mode 100755 lustre/tests/snaprun.sh
 delete mode 100755 lustre/tests/trivial.sh

diff --git a/lnet/tests/Makefile.mk b/lnet/tests/Makefile.mk
new file mode 100644
index 0000000000..751c0a002a
--- /dev/null
+++ b/lnet/tests/Makefile.mk
@@ -0,0 +1,9 @@
+# Copyright (C) 2001  Cluster File Systems, Inc.
+#
+# This code is issued under the GNU General Public License.
+# See the file COPYING in this distribution
+
+include $(src)/../Kernelenv
+
+obj-y += ping_cli.o
+obj-y += ping_srv.o
diff --git a/lnet/utils/Makefile.mk b/lnet/utils/Makefile.mk
new file mode 100644
index 0000000000..cbbe6d5e99
--- /dev/null
+++ b/lnet/utils/Makefile.mk
@@ -0,0 +1,6 @@
+include $(src)/../Kernelenv
+
+host-progs := acceptor ptlctl
+always := $(host-progs)
+
+ptlctl-objs := ptlctl.o $(PTLCTLOBJS)
diff --git a/lustre/include/linux/lustre_commit_confd.h b/lustre/include/linux/lustre_commit_confd.h
new file mode 100644
index 0000000000..980e6ced80
--- /dev/null
+++ b/lustre/include/linux/lustre_commit_confd.h
@@ -0,0 +1,73 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ *  Copyright (C) 2001 Cluster File Systems, Inc. <info@clusterfs.com>
+ *
+ *   This file is part of Lustre, http://www.lustre.org.
+ *
+ *   Lustre 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.
+ *
+ *   Lustre 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 Lustre; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Structures relating to the log commit thread.
+ */
+
+#ifndef _LUSTRE_COMMIT_CONFD_H
+#define _LUSTRE_COMMIT_CONFD_H
+
+#include <linux/lustre_log.h>
+
+struct llog_commit_data {
+        struct list_head           llcd_list;  /* free or pending struct list */
+        struct obd_import         *llcd_import;
+        struct llog_commit_master *llcd_lcm;
+        int                        llcd_tries; /* number of tries to send */
+        int                        llcd_cookiebytes;
+        struct llog_cookie         llcd_cookies[0];
+};
+
+struct llog_commit_master {
+        struct list_head        lcm_thread_busy;  /* list of busy daemons */
+        struct list_head        lcm_thread_idle;  /* list of idle daemons */
+        spinlock_t              lcm_thread_lock;  /* protects thread_list */
+        atomic_t                lcm_thread_numidle;/* number of idle threads */
+        atomic_t                lcm_thread_total; /* total number of threads */
+        int                     lcm_thread_max;   /* <= num_osts normally */
+
+        int                     lcm_flags;
+        wait_queue_head_t       lcm_waitq;
+
+        struct list_head        lcm_llcd_pending; /* llog_commit_data to send */
+        struct list_head        lcm_llcd_resend;  /* try to resend this data */
+        struct list_head        lcm_llcd_free;    /* free llog_commit_data */
+        spinlock_t              lcm_llcd_lock;    /* protects llcd_free */
+        atomic_t                lcm_llcd_numfree; /* items on llcd_free */
+        int                     lcm_llcd_minfree; /* min free on llcd_free */
+        int                     lcm_llcd_maxfree; /* max free on llcd_free */
+};
+
+#define LLOG_LCM_FL_EXIT        0x01
+#define LLOG_LCM_FL_EXIT_FORCE  0x02
+
+/* the thread data that collects local commits and makes rpc's */
+struct llog_commit_daemon {
+        struct list_head           lcd_lcm_list;  /* list of daemon threads */
+        struct list_head           lcd_llcd_list; /* list of pending RPCs */
+        struct llog_commit_master *lcd_lcm;       /* pointer back to parent */
+};
+
+/* ptlrpc/recov_thread.c */
+int llog_start_commit_thread(void);
+struct llog_commit_data *llcd_grab(void);
+void llcd_send(struct llog_commit_data *llcd);
+
+#endif /* _LUSTRE_COMMIT_CONFD_H */
diff --git a/lustre/include/linux/lustre_log.h b/lustre/include/linux/lustre_log.h
new file mode 100644
index 0000000000..2f215839f9
--- /dev/null
+++ b/lustre/include/linux/lustre_log.h
@@ -0,0 +1,81 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ *  Copyright (C) 2001 Cluster File Systems, Inc. <info@clusterfs.com>
+ *
+ *   This file is part of Lustre, http://www.lustre.org.
+ *
+ *   Lustre 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.
+ *
+ *   Lustre 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 Lustre; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Generic infrastructure for managing a collection of logs.
+ *
+ * These logs are used for:
+ *
+ * - orphan recovery: OST adds record on create
+ * - mtime/size consistency: the OST adds a record on first write
+ * - open/unlinked objects: OST adds a record on destroy
+ *
+ * - mds unlink log: the MDS adds an entry upon delete
+ *
+ * - raid1 replication log between OST's
+ * - MDS replication logs
+ */
+
+#ifndef _LUSTRE_LOG_H
+#define _LUSTRE_LOG_H
+
+#include <linux/lustre_idl.h>
+
+struct obd_trans_info;
+struct obd_device;
+struct lov_stripe_md;
+
+/* In-memory descriptor for a log object or log catalog */
+struct llog_handle {
+        struct list_head        lgh_list;
+        struct llog_cookie      lgh_cookie;
+        struct semaphore        lgh_lock;
+        struct obd_device      *lgh_obd;
+        void                   *lgh_hdr;
+        struct file            *lgh_file;
+        struct obd_uuid        *lgh_tgtuuid;
+        struct llog_handle     *lgh_current;
+        struct llog_handle     *(*lgh_log_create)(struct obd_device *obd);
+        struct llog_handle     *(*lgh_log_open)(struct obd_device *obd,
+                                                struct llog_cookie *logcookie);
+        int                     (*lgh_log_close)(struct llog_handle *cathandle,
+                                                 struct llog_handle *loghandle);
+        int                     lgh_index;
+};
+
+extern int llog_add_record(struct llog_handle *cathandle,
+                           struct llog_trans_hdr *rec,
+                           struct llog_cookie *logcookies);
+
+extern int llog_cancel_records(struct llog_handle *cathandle, int count,
+                               struct llog_cookie *cookies);
+
+extern struct llog_handle *llog_alloc_handle(void);
+extern void llog_free_handle(struct llog_handle *handle);
+extern int llog_init_catalog(struct llog_handle *cathandle,
+                             struct obd_uuid *tgtuuid);
+extern int llog_delete_log(struct llog_handle *cathandle,
+                           struct llog_handle *loghandle);
+extern int llog_close_log(struct llog_handle *cathandle,
+                          struct llog_handle *loghandle);
+extern struct llog_handle *llog_new_log(struct llog_handle *cathandle,
+                                        struct obd_uuid *tgtuuid);
+
+#endif
+
diff --git a/lustre/include/linux/lustre_mgmt.h b/lustre/include/linux/lustre_mgmt.h
new file mode 100644
index 0000000000..91a8113380
--- /dev/null
+++ b/lustre/include/linux/lustre_mgmt.h
@@ -0,0 +1,34 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ * Copyright (C) 2001  Cluster File Systems, Inc.
+ *
+ * This code is issued under the GNU General Public License.
+ * See the file COPYING in this distribution
+ */
+
+#ifndef LUSTRE_MGMT_H
+#define LUSTRE_MGMT_H
+
+#define LUSTRE_MGMTCLI_NAME "mgmt_cli"
+
+/* For the convenience and type-safety of inter_module_getters. */
+
+struct obd_device;
+struct obd_uuid;
+
+/*
+ * The caller is responsible for ensuring that relevant_uuid -- if non-NULL --
+ * points to valid memory until deregister is called.  If relevant_uuid is NULL,
+ * all management events will be propagated to the registrant.  Notice that
+ * deregister doesn't take a relevant_uuid-matching parameter; I should probably
+ * fix that at some point.
+ */
+typedef int (*mgmtcli_register_for_events_t)(struct obd_device *mgmt_obd,
+                                             struct obd_device *notify_obd,
+                                             struct obd_uuid *relevant_uuid);
+
+typedef int (*mgmtcli_deregister_for_events_t)(struct obd_device *mgmt_obd,
+                                               struct obd_device *notify_obd);
+
+#endif /* LUSTRE_MGMT_H */
diff --git a/lustre/include/linux/obd_filter.h b/lustre/include/linux/obd_filter.h
deleted file mode 100644
index 3d8188a6fe..0000000000
--- a/lustre/include/linux/obd_filter.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
- *  Copyright (C) 2002 Cluster File Systems, Inc.
- *
- *   This file is part of Lustre, http://www.lustre.org.
- *
- *   Lustre 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.
- *
- *   Lustre 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 Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-#ifndef _OBD_FILTER_H
-#define _OBD_FILTER_H
-
-#ifdef __KERNEL__
-#include <linux/spinlock.h>
-#endif
-#include <linux/lustre_handles.h>
-
-#ifndef OBD_FILTER_DEVICENAME
-#define OBD_FILTER_DEVICENAME "obdfilter"
-#endif
-
-#define FILTER_LR_SERVER_SIZE    512
-
-#define FILTER_LR_CLIENT_START   8192
-#define FILTER_LR_CLIENT_SIZE    128
-
-#define FILTER_SUBDIR_COUNT      32            /* set to zero for no subdirs */
-
-#define FILTER_MOUNT_RECOV 2
-#define FILTER_RECOVERY_TIMEOUT (obd_timeout * 5 * HZ / 2) /* *waves hands* */
-
-/* Data stored per server at the head of the last_rcvd file.  In le32 order. */
-struct filter_server_data {
-        __u8  fsd_uuid[37];        /* server UUID */
-        __u8  fsd_uuid_padding[3]; /* unused */
-        __u64 fsd_last_objid;      /* last created object ID */
-        __u64 fsd_last_rcvd;       /* last completed transaction ID */
-        __u64 fsd_mount_count;     /* FILTER incarnation number */
-        __u32 fsd_feature_compat;  /* compatible feature flags */
-        __u32 fsd_feature_rocompat;/* read-only compatible feature flags */
-        __u32 fsd_feature_incompat;/* incompatible feature flags */
-        __u32 fsd_server_size;     /* size of server data area */
-        __u32 fsd_client_start;    /* start of per-client data area */
-        __u16 fsd_client_size;     /* size of per-client data area */
-        __u16 fsd_subdir_count;    /* number of subdirectories for objects */
-        __u8  fsd_padding[FILTER_LR_SERVER_SIZE - 88];
-};
-
-/* Data stored per client in the last_rcvd file.  In le32 order. */
-struct filter_client_data {
-        __u8  fcd_uuid[37];        /* client UUID */
-        __u8  fcd_uuid_padding[3]; /* unused */
-        __u64 fcd_last_rcvd;       /* last completed transaction ID */
-        __u64 fcd_mount_count;     /* FILTER incarnation number */
-        __u64 fcd_last_xid;        /* client RPC xid for the last transaction */
-        __u8  fcd_padding[FILTER_LR_CLIENT_SIZE - 64];
-};
-
-#ifndef OBD_FILTER_SAN_DEVICENAME
-#define OBD_FILTER_SAN_DEVICENAME "sanobdfilter"
-#endif
-
-/* In-memory access to client data from OST struct */
-struct filter_export_data {
-        struct list_head  fed_open_head; /* files to close on disconnect */
-        spinlock_t        fed_lock;      /* protects fed_open_head */
-        struct filter_client_data  *fed_fcd;
-        loff_t            fed_lr_off;
-        int               fed_lr_idx;
-};
-
-/* file data for open files on OST */
-struct filter_file_data {
-        struct portals_handle ffd_handle;
-        atomic_t              ffd_refcount;
-        struct list_head      ffd_export_list; /* export open list - fed_lock */
-        struct file          *ffd_file;         /* file handle */
-};
-
-struct filter_dentry_data {
-        obd_id                  fdd_objid;
-        __u32                   fdd_magic;
-        atomic_t                fdd_open_count;
-        int                     fdd_flags;
-};
-
-#define FILTER_DENTRY_MAGIC 0x9efba101
-#define FILTER_FLAG_DESTROY 0x0001      /* destroy dentry on last file close */
-
-
-#endif
diff --git a/lustre/kernel_patches/kernel_configs/kgdb-vmware-2.5.73 b/lustre/kernel_patches/kernel_configs/kgdb-vmware-2.5.73
new file mode 100644
index 0000000000..4033739d41
--- /dev/null
+++ b/lustre/kernel_patches/kernel_configs/kgdb-vmware-2.5.73
@@ -0,0 +1,908 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_X86=y
+CONFIG_MMU=y
+CONFIG_UID16=y
+CONFIG_GENERIC_ISA_DMA=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+
+#
+# General setup
+#
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_LOG_BUF_SHIFT=15
+# CONFIG_EMBEDDED is not set
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+CONFIG_OBSOLETE_MODPARM=y
+# CONFIG_MODVERSIONS is not set
+CONFIG_KMOD=y
+
+#
+# Processor type and features
+#
+CONFIG_X86_PC=y
+# CONFIG_X86_VOYAGER is not set
+# CONFIG_X86_NUMAQ is not set
+# CONFIG_X86_SUMMIT is not set
+# CONFIG_X86_BIGSMP is not set
+# CONFIG_X86_VISWS is not set
+# CONFIG_X86_GENERICARCH is not set
+# CONFIG_X86_ES7000 is not set
+# CONFIG_M386 is not set
+# CONFIG_M486 is not set
+# CONFIG_M586 is not set
+# CONFIG_M586TSC is not set
+# CONFIG_M586MMX is not set
+# CONFIG_M686 is not set
+# CONFIG_MPENTIUMII is not set
+CONFIG_MPENTIUMIII=y
+# CONFIG_MPENTIUM4 is not set
+# CONFIG_MK6 is not set
+# CONFIG_MK7 is not set
+# CONFIG_MK8 is not set
+# CONFIG_MELAN is not set
+# CONFIG_MCRUSOE is not set
+# CONFIG_MWINCHIPC6 is not set
+# CONFIG_MWINCHIP2 is not set
+# CONFIG_MWINCHIP3D is not set
+# CONFIG_MCYRIXIII is not set
+# CONFIG_MVIAC3_2 is not set
+# CONFIG_X86_GENERIC is not set
+CONFIG_X86_CMPXCHG=y
+CONFIG_X86_XADD=y
+CONFIG_X86_L1_CACHE_SHIFT=5
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_X86_WP_WORKS_OK=y
+CONFIG_X86_INVLPG=y
+CONFIG_X86_BSWAP=y
+CONFIG_X86_POPAD_OK=y
+CONFIG_X86_GOOD_APIC=y
+CONFIG_X86_INTEL_USERCOPY=y
+CONFIG_X86_USE_PPRO_CHECKSUM=y
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_SMP=y
+CONFIG_NR_CPUS=16
+# CONFIG_PREEMPT is not set
+CONFIG_X86_LOCAL_APIC=y
+CONFIG_X86_IO_APIC=y
+CONFIG_X86_TSC=y
+CONFIG_X86_MCE=y
+# CONFIG_X86_MCE_NONFATAL is not set
+CONFIG_X86_MCE_P4THERMAL=y
+# CONFIG_TOSHIBA is not set
+# CONFIG_I8K is not set
+# CONFIG_MICROCODE is not set
+# CONFIG_X86_MSR is not set
+# CONFIG_X86_CPUID is not set
+CONFIG_EDD=y
+CONFIG_NOHIGHMEM=y
+# CONFIG_HIGHMEM4G is not set
+# CONFIG_HIGHMEM64G is not set
+# CONFIG_MATH_EMULATION is not set
+CONFIG_MTRR=y
+CONFIG_HAVE_DEC_LOCK=y
+
+#
+# Power management options (ACPI, APM)
+#
+# CONFIG_PM is not set
+
+#
+# ACPI Support
+#
+# CONFIG_ACPI is not set
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ is not set
+
+#
+# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
+#
+CONFIG_PCI=y
+# CONFIG_PCI_GOBIOS is not set
+# CONFIG_PCI_GODIRECT is not set
+CONFIG_PCI_GOANY=y
+CONFIG_PCI_BIOS=y
+CONFIG_PCI_DIRECT=y
+# CONFIG_PCI_LEGACY_PROC is not set
+CONFIG_PCI_NAMES=y
+CONFIG_ISA=y
+# CONFIG_EISA is not set
+# CONFIG_MCA is not set
+# CONFIG_SCx200 is not set
+CONFIG_HOTPLUG=y
+
+#
+# PCMCIA/CardBus support
+#
+CONFIG_PCMCIA=y
+# CONFIG_YENTA is not set
+# CONFIG_I82092 is not set
+# CONFIG_I82365 is not set
+# CONFIG_TCIC is not set
+CONFIG_PCMCIA_PROBE=y
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# Executable file formats
+#
+CONFIG_KCORE_ELF=y
+# CONFIG_KCORE_AOUT is not set
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_AOUT=y
+CONFIG_BINFMT_MISC=y
+
+#
+# Generic Driver Options
+#
+# CONFIG_FW_LOADER is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+CONFIG_PNP=y
+CONFIG_PNP_NAMES=y
+# CONFIG_PNP_DEBUG is not set
+
+#
+# Protocols
+#
+# CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_LBD=y
+
+#
+# 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_IDE is not set
+# CONFIG_BLK_DEV_HD is not set
+CONFIG_BLK_DEV_IDEDISK=y
+CONFIG_IDEDISK_MULTI_MODE=y
+# CONFIG_IDEDISK_STROKE is not set
+# CONFIG_BLK_DEV_IDECS is not set
+CONFIG_BLK_DEV_IDECD=y
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_BLK_DEV_IDESCSI is not set
+# CONFIG_IDE_TASK_IOCTL is not set
+CONFIG_IDE_TASKFILE_IO=y
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_BLK_DEV_CMD640=y
+# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
+# CONFIG_BLK_DEV_IDEPNP is not set
+CONFIG_BLK_DEV_IDEPCI=y
+CONFIG_BLK_DEV_GENERIC=y
+CONFIG_IDEPCI_SHARE_IRQ=y
+CONFIG_BLK_DEV_IDEDMA_PCI=y
+# CONFIG_BLK_DEV_IDE_TCQ is not set
+# 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_IDEDMA_PCI_WIP is not set
+CONFIG_BLK_DEV_ADMA=y
+# CONFIG_BLK_DEV_AEC62XX is not set
+# CONFIG_BLK_DEV_ALI15X3 is not set
+# CONFIG_BLK_DEV_AMD74XX is not set
+# CONFIG_BLK_DEV_CMD64X is not set
+# CONFIG_BLK_DEV_TRIFLEX is not set
+# CONFIG_BLK_DEV_CY82C693 is not set
+# CONFIG_BLK_DEV_CS5520 is not set
+# CONFIG_BLK_DEV_HPT34X is not set
+# CONFIG_BLK_DEV_HPT366 is not set
+# CONFIG_BLK_DEV_SC1200 is not set
+CONFIG_BLK_DEV_PIIX=y
+# CONFIG_BLK_DEV_NS87415 is not set
+# CONFIG_BLK_DEV_OPTI621 is not set
+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
+CONFIG_BLK_DEV_RZ1000=y
+# CONFIG_BLK_DEV_SVWKS is not set
+# CONFIG_BLK_DEV_SIIMAGE is not set
+# CONFIG_BLK_DEV_SIS5513 is not set
+# CONFIG_BLK_DEV_SLC90E66 is not set
+# CONFIG_BLK_DEV_TRM290 is not set
+# CONFIG_BLK_DEV_VIA82CXXX is not set
+# CONFIG_IDE_CHIPSETS is not set
+CONFIG_IDEDMA_AUTO=y
+# CONFIG_IDEDMA_IVB is not set
+CONFIG_BLK_DEV_IDE_MODES=y
+
+#
+# SCSI device support
+#
+CONFIG_SCSI=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+CONFIG_BLK_DEV_SR=y
+CONFIG_BLK_DEV_SR_VENDOR=y
+CONFIG_CHR_DEV_SG=y
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_SCSI_REPORT_LUNS=y
+CONFIG_SCSI_CONSTANTS=y
+# CONFIG_SCSI_LOGGING is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_7000FASST is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AHA152X is not set
+# CONFIG_SCSI_AHA1542 is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_IN2000 is not set
+# CONFIG_SCSI_AM53C974 is not set
+# CONFIG_SCSI_MEGARAID is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_CPQFCTS is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_DTC3280 is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_EATA_PIO is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_GENERIC_NCR5380 is not set
+# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_NCR53C406A is not set
+CONFIG_SCSI_SYM53C8XX_2=y
+CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
+CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
+CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
+# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
+# CONFIG_SCSI_PAS16 is not set
+# CONFIG_SCSI_PCI2000 is not set
+# CONFIG_SCSI_PCI2220I is not set
+# CONFIG_SCSI_PSI240I is not set
+# CONFIG_SCSI_QLOGIC_FAS is not set
+# CONFIG_SCSI_QLOGIC_ISP is not set
+# CONFIG_SCSI_QLOGIC_FC is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_SEAGATE is not set
+# CONFIG_SCSI_SYM53C416 is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_T128 is not set
+# CONFIG_SCSI_U14_34F is not set
+# CONFIG_SCSI_ULTRASTOR is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_DEBUG is not set
+
+#
+# PCMCIA SCSI adapter support
+#
+# CONFIG_PCMCIA_AHA152X is not set
+# CONFIG_PCMCIA_FDOMAIN is not set
+# CONFIG_PCMCIA_NINJA_SCSI is not set
+# CONFIG_PCMCIA_QLOGIC is not set
+
+#
+# Old CD-ROM drivers (not SCSI, not IDE)
+#
+# CONFIG_CD_NO_IDESCSI is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+# CONFIG_NETLINK_DEV is not set
+# CONFIG_NETFILTER is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+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_INET_IPCOMP is not set
+# CONFIG_IPV6 is not set
+# CONFIG_XFRM_USER 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_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 is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+CONFIG_DUMMY=m
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_ETHERTAP is not set
+# CONFIG_NET_SB1000 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
+# CONFIG_LANCE is not set
+# CONFIG_NET_VENDOR_SMC is not set
+# CONFIG_NET_VENDOR_RACAL is not set
+
+#
+# Tulip family network device support
+#
+# CONFIG_NET_TULIP is not set
+# CONFIG_AT1700 is not set
+# CONFIG_DEPCA is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_ISA is not set
+CONFIG_NET_PCI=y
+CONFIG_PCNET32=y
+# CONFIG_AMD8111_ETH is not set
+# CONFIG_ADAPTEC_STARFIRE is not set
+# CONFIG_AC3200 is not set
+# CONFIG_APRICOT is not set
+# CONFIG_B44 is not set
+# CONFIG_CS89x0 is not set
+# CONFIG_DGRS is not set
+CONFIG_EEPRO100=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_8139CP is not set
+# CONFIG_8139TOO is not set
+# CONFIG_SIS900 is not set
+# CONFIG_EPIC100 is not set
+# CONFIG_SUNDANCE is not set
+# CONFIG_TLAN is not set
+# CONFIG_VIA_RHINE is not set
+# CONFIG_NET_POCKET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_R8169 is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_TIGON3 is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_IXGB is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Token Ring devices (depends on LLC=y)
+#
+# CONFIG_NET_FC is not set
+# CONFIG_RCPCI is not set
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+# CONFIG_PCMCIA_3C589 is not set
+# CONFIG_PCMCIA_3C574 is not set
+# CONFIG_PCMCIA_FMVJ18X is not set
+CONFIG_PCMCIA_PCNET=y
+# CONFIG_PCMCIA_NMCLAN is not set
+# CONFIG_PCMCIA_SMC91C92 is not set
+# CONFIG_PCMCIA_XIRC2PS is not set
+# CONFIG_PCMCIA_AXNET is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+# CONFIG_IRDA is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN_BOOL is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+# CONFIG_SERIO is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_INPORT is not set
+# CONFIG_MOUSE_LOGIBM is not set
+# CONFIG_MOUSE_PC110PAD is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=256
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# I2C Hardware Sensors Mainboard support
+#
+
+#
+# I2C Hardware Sensors Chip support
+#
+# CONFIG_I2C_SENSOR is not set
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+# CONFIG_QIC02_TAPE is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_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
+# CONFIG_SONYPI is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+CONFIG_AGP=y
+# CONFIG_AGP_ALI is not set
+# CONFIG_AGP_AMD is not set
+# CONFIG_AGP_AMD_8151 is not set
+# CONFIG_AGP_INTEL is not set
+# CONFIG_AGP_NVIDIA is not set
+# CONFIG_AGP_SIS is not set
+# CONFIG_AGP_SWORKS is not set
+# CONFIG_AGP_VIA is not set
+# CONFIG_DRM is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_MWAVE is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_HANGCHECK_TIMER is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=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_EXT3_FS_SECURITY 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
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+CONFIG_DEVPTS_FS=y
+# CONFIG_DEVPTS_FS_XATTR is not set
+CONFIG_TMPFS=y
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+# CONFIG_NFS_V3 is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=y
+# CONFIG_EXPORTFS 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_LUSTRE_FS=y
+# CONFIG_INTERMEZZO_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_NLS=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_ISO8859_1=y
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Graphics support
+#
+# CONFIG_FB is not set
+CONFIG_VIDEO_SELECT=y
+
+#
+# Console display driver support
+#
+CONFIG_VGA_CONSOLE=y
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+# CONFIG_USB is not set
+# CONFIG_USB_GADGET is not set
+
+#
+# Bluetooth support
+#
+# CONFIG_BT is not set
+
+#
+# Profiling support
+#
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=y
+
+#
+# Kernel hacking
+#
+# CONFIG_CRASH_DUMP is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_IOVIRT is not set
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_SPINLOCK=y
+CONFIG_KALLSYMS=y
+CONFIG_DEBUG_SPINLOCK_SLEEP=y
+CONFIG_KGDB=y
+# CONFIG_KGDB_9600BAUD is not set
+# CONFIG_KGDB_19200BAUD is not set
+# CONFIG_KGDB_38400BAUD is not set
+# CONFIG_KGDB_57600BAUD is not set
+CONFIG_KGDB_115200BAUD=y
+CONFIG_KGDB_PORT=0x3f8
+CONFIG_KGDB_IRQ=4
+CONFIG_DEBUG_INFO=y
+# CONFIG_KGDB_MORE is not set
+CONFIG_NO_KGDB_CPUS=16
+# CONFIG_KGDB_TS is not set
+# CONFIG_STACK_OVERFLOW_TEST is not set
+CONFIG_KGDB_CONSOLE=y
+CONFIG_KGDB_SYSRQ=y
+CONFIG_FRAME_POINTER=y
+CONFIG_X86_EXTRA_IRQS=y
+CONFIG_X86_FIND_SMP_CONFIG=y
+CONFIG_X86_MPPARSE=y
+
+#
+# Security options
+#
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+# CONFIG_CRC32 is not set
+CONFIG_X86_SMP=y
+CONFIG_X86_HT=y
+CONFIG_X86_BIOS_REBOOT=y
+CONFIG_X86_TRAMPOLINE=y
diff --git a/lustre/kernel_patches/patches/2.6.0-test1-mm2.patch b/lustre/kernel_patches/patches/2.6.0-test1-mm2.patch
new file mode 100644
index 0000000000..9f476e05b6
--- /dev/null
+++ b/lustre/kernel_patches/patches/2.6.0-test1-mm2.patch
@@ -0,0 +1,179799 @@
+--- linux-2.6.0-test1/arch/alpha/kernel/irq.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/arch/alpha/kernel/irq.c	2003-07-19 17:03:49.000000000 -0700
+@@ -601,7 +601,7 @@ handle_irq(int irq, struct pt_regs * reg
+ 	if ((unsigned) irq > ACTUAL_NR_IRQS && illegal_count < MAX_ILLEGAL_IRQS ) {
+ 		irq_err_count++;
+ 		illegal_count++;
+-		printk(KERN_CRIT "device_interrupt: illegal interrupt %d\n",
++		printk(KERN_CRIT "device_interrupt: invalid interrupt %d\n",
+ 		       irq);
+ 		return;
+ 	}
+--- linux-2.6.0-test1/arch/alpha/kernel/smp.c	2003-06-14 12:18:05.000000000 -0700
++++ 25/arch/alpha/kernel/smp.c	2003-07-19 17:04:06.000000000 -0700
+@@ -71,7 +71,7 @@ static int smp_secondary_alive __initdat
+ 
+ /* Which cpus ids came online.  */
+ unsigned long cpu_present_mask;
+-volatile unsigned long cpu_online_map;
++cpumask_t cpu_online_map;
+ 
+ /* cpus reported in the hwrpb */
+ static unsigned long hwrpb_cpu_present_mask __initdata = 0;
+@@ -132,7 +132,7 @@ smp_callin(void)
+ {
+ 	int cpuid = hard_smp_processor_id();
+ 
+-	if (test_and_set_bit(cpuid, &cpu_online_map)) {
++	if (cpu_test_and_set(cpuid, cpu_online_map)) {
+ 		printk("??, cpu 0x%x already present??\n", cpuid);
+ 		BUG();
+ 	}
+@@ -575,8 +575,8 @@ smp_prepare_boot_cpu(void)
+ 	/*
+ 	 * Mark the boot cpu (current cpu) as both present and online
+ 	 */ 
+-	set_bit(smp_processor_id(), &cpu_present_mask);
+-	set_bit(smp_processor_id(), &cpu_online_map);
++	cpu_set(smp_processor_id(), cpu_present_mask);
++	cpu_set(smp_processor_id(), cpu_online_map);
+ }
+ 
+ int __devinit
+--- linux-2.6.0-test1/arch/alpha/mm/init.c	2003-06-14 12:18:33.000000000 -0700
++++ 25/arch/alpha/mm/init.c	2003-07-19 17:03:49.000000000 -0700
+@@ -20,9 +20,6 @@
+ #include <linux/init.h>
+ #include <linux/bootmem.h> /* max_low_pfn */
+ #include <linux/vmalloc.h>
+-#ifdef CONFIG_BLK_DEV_INITRD
+-#include <linux/blk.h>
+-#endif
+ 
+ #include <asm/system.h>
+ #include <asm/uaccess.h>
+--- linux-2.6.0-test1/arch/alpha/mm/remap.c	2003-06-14 12:17:56.000000000 -0700
++++ 25/arch/alpha/mm/remap.c	2003-07-19 17:07:16.000000000 -0700
+@@ -73,7 +73,7 @@ __alpha_remap_area_pages(unsigned long a
+ 	spin_lock(&init_mm.page_table_lock);
+ 	do {
+ 		pmd_t *pmd;
+-		pmd = pmd_alloc(&init_mm, dir, address);
++		pmd = pmd_alloc_kernel(&init_mm, dir, address);
+ 		error = -ENOMEM;
+ 		if (!pmd)
+ 			break;
+--- linux-2.6.0-test1/arch/arm26/kernel/setup.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/arm26/kernel/setup.c	2003-07-19 17:03:49.000000000 -0700
+@@ -14,7 +14,7 @@
+ #include <linux/ioport.h>
+ #include <linux/delay.h>
+ #include <linux/utsname.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/console.h>
+ #include <linux/bootmem.h>
+ #include <linux/seq_file.h>
+--- linux-2.6.0-test1/arch/arm26/mm/init.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/arm26/mm/init.c	2003-07-19 17:03:49.000000000 -0700
+@@ -22,7 +22,7 @@
+ #include <linux/init.h>
+ #include <linux/initrd.h>
+ #include <linux/bootmem.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ 
+ #include <asm/segment.h>
+ #include <asm/mach-types.h>
+--- linux-2.6.0-test1/arch/arm26/mm/mm-memc.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/arm26/mm/mm-memc.c	2003-07-19 17:07:16.000000000 -0700
+@@ -79,7 +79,7 @@ pgd_t *get_pgd_slow(struct mm_struct *mm
+ 		goto no_pgd;
+ 
+ 	/*
+-	 * This lock is here just to satisfy pmd_alloc and pte_lock
++	 * This lock is here just to satisfy pmd_alloc_kernel() and pte_lock
+          * FIXME: I bet we could avoid taking it pretty much altogether
+ 	 */
+ 	spin_lock(&mm->page_table_lock);
+@@ -88,7 +88,7 @@ pgd_t *get_pgd_slow(struct mm_struct *mm
+ 	 * On ARM, first page must always be allocated since it contains
+ 	 * the machine vectors.
+ 	 */
+-	new_pmd = pmd_alloc(mm, new_pgd, 0);
++	new_pmd = pmd_alloc_kernel(mm, new_pgd, 0);
+ 	if (!new_pmd)
+ 		goto no_pmd;
+ 
+--- linux-2.6.0-test1/arch/arm/mach-arc/mm.c	2003-06-14 12:18:08.000000000 -0700
++++ 25/arch/arm/mach-arc/mm.c	2003-07-19 17:07:16.000000000 -0700
+@@ -66,7 +66,7 @@ pgd_t *get_pgd_slow(struct mm_struct *mm
+ 		goto no_pgd;
+ 
+ 	/*
+-	 * This lock is here just to satisfy pmd_alloc and pte_lock
++	 * This lock is here just to satisfy pmd_alloc_map() and pte_lock
+ 	 */
+ 	spin_lock(&mm->page_table_lock);
+ 
+@@ -74,13 +74,15 @@ pgd_t *get_pgd_slow(struct mm_struct *mm
+ 	 * On ARM, first page must always be allocated since it contains
+ 	 * the machine vectors.
+ 	 */
+-	new_pmd = pmd_alloc(mm, new_pgd, 0);
++	new_pmd = pmd_alloc_map(mm, new_pgd, 0);
+ 	if (!new_pmd)
+ 		goto no_pmd;
+ 
+-	new_pte = pte_alloc_map(mm, new_pmd, 0);
+-	if (!new_pte)
++	new_pte = pte_alloc_map(mm, new_pgd, &new_pmd, 0);
++	if (!new_pte) {
++		pmd_unmap(new_pmd);
+ 		goto no_pte;
++	}
+ 
+ 	init_pgd = pgd_offset_k(0);
+ 	init_pmd = pmd_offset(init_pgd, 0);
+@@ -88,6 +90,7 @@ pgd_t *get_pgd_slow(struct mm_struct *mm
+ 	set_pte(new_pte, *init_pte);
+ 	pte_unmap_nested(init_pte);
+ 	pte_unmap(new_pte);
++	pmd_unmap(new_pmd);
+ 
+ 	/*
+ 	 * most of the page table entries are zeroed
+--- linux-2.6.0-test1/arch/arm/mach-clps711x/autcpu12.c	2003-06-14 12:18:04.000000000 -0700
++++ 25/arch/arm/mach-clps711x/autcpu12.c	2003-07-19 17:03:49.000000000 -0700
+@@ -21,7 +21,6 @@
+ #include <linux/init.h>
+ #include <linux/types.h>
+ #include <linux/string.h>
+-#include <linux/blk.h>
+ #include <linux/mm.h>
+ 
+ #include <asm/hardware.h>
+--- linux-2.6.0-test1/arch/arm/mm/consistent.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/arch/arm/mm/consistent.c	2003-07-19 17:07:16.000000000 -0700
+@@ -325,7 +325,7 @@ static int __init consistent_init(void)
+ 
+ 	do {
+ 		pgd = pgd_offset(&init_mm, CONSISTENT_BASE);
+-		pmd = pmd_alloc(&init_mm, pgd, CONSISTENT_BASE);
++		pmd = pmd_alloc_kernel(&init_mm, pgd, CONSISTENT_BASE);
+ 		if (!pmd) {
+ 			printk(KERN_ERR "consistent_init: out of pmd tables\n");
+ 			return -ENOMEM;
+--- linux-2.6.0-test1/arch/arm/mm/ioremap.c	2003-06-14 12:18:24.000000000 -0700
++++ 25/arch/arm/mm/ioremap.c	2003-07-19 17:07:16.000000000 -0700
+@@ -95,7 +95,7 @@ static int remap_area_pages(unsigned lon
+ 	spin_lock(&init_mm.page_table_lock);
+ 	do {
+ 		pmd_t *pmd;
+-		pmd = pmd_alloc(&init_mm, dir, address);
++		pmd = pmd_alloc_kernel(&init_mm, dir, address);
+ 		error = -ENOMEM;
+ 		if (!pmd)
+ 			break;
+--- linux-2.6.0-test1/arch/arm/mm/minicache.c	2003-06-14 12:18:25.000000000 -0700
++++ 25/arch/arm/mm/minicache.c	2003-07-19 17:07:16.000000000 -0700
+@@ -57,7 +57,7 @@ static int __init minicache_init(void)
+ 	pmd_t *pmd;
+ 
+ 	pgd = pgd_offset_k(minicache_address);
+-	pmd = pmd_alloc(&init_mm, pgd, minicache_address);
++	pmd = pmd_alloc_kernel(&init_mm, pgd, minicache_address);
+ 	if (!pmd)
+ 		BUG();
+ 	minicache_pte = pte_alloc_kernel(&init_mm, pmd, minicache_address);
+--- linux-2.6.0-test1/arch/arm/mm/mm-armv.c	2003-06-22 12:04:43.000000000 -0700
++++ 25/arch/arm/mm/mm-armv.c	2003-07-19 17:07:16.000000000 -0700
+@@ -131,7 +131,7 @@ pgd_t *get_pgd_slow(struct mm_struct *mm
+ 
+ 	if (vectors_base() == 0) {
+ 		/*
+-		 * This lock is here just to satisfy pmd_alloc and pte_lock
++		 * This lock is here just to satisfy pmd_alloc_map() and pte_lock
+ 		 */
+ 		spin_lock(&mm->page_table_lock);
+ 
+@@ -139,20 +139,22 @@ pgd_t *get_pgd_slow(struct mm_struct *mm
+ 		 * On ARM, first page must always be allocated since it
+ 		 * contains the machine vectors.
+ 		 */
+-		new_pmd = pmd_alloc(mm, new_pgd, 0);
++		new_pmd = pmd_alloc_map(mm, new_pgd, 0);
+ 		if (!new_pmd)
+ 			goto no_pmd;
+ 
+-		new_pte = pte_alloc_map(mm, new_pmd, 0);
+-		if (!new_pte)
++		new_pte = pte_alloc_map(mm, new_pgd, &new_pmd, 0);
++		if (!new_pte) {
++			pmd_unmap(new_pmd);
+ 			goto no_pte;
++		}
+ 
+ 		init_pmd = pmd_offset(init_pgd, 0);
+ 		init_pte = pte_offset_map_nested(init_pmd, 0);
+ 		set_pte(new_pte, *init_pte);
+ 		pte_unmap_nested(init_pte);
+ 		pte_unmap(new_pte);
+-
++		pmd_unmap(new_pmd);
+ 		spin_unlock(&mm->page_table_lock);
+ 	}
+ 
+--- linux-2.6.0-test1/arch/cris/mm/ioremap.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/cris/mm/ioremap.c	2003-07-19 17:07:16.000000000 -0700
+@@ -78,7 +78,7 @@ static int remap_area_pages(unsigned lon
+ 	spin_lock(&init_mm.page_table_lock);
+ 	do {
+ 		pmd_t *pmd;
+-		pmd = pmd_alloc(&init_mm, dir, address);
++		pmd = pmd_alloc_kernel(&init_mm, dir, address);
+ 		error = -ENOMEM;
+ 		if (!pmd)
+ 			break;
+--- linux-2.6.0-test1/arch/h8300/kernel/setup.c	2003-06-14 12:17:58.000000000 -0700
++++ 25/arch/h8300/kernel/setup.c	2003-07-19 17:03:49.000000000 -0700
+@@ -35,7 +35,6 @@
+ #include <asm/irq.h>
+ 
+ #ifdef CONFIG_BLK_DEV_INITRD
+-#include <linux/blk.h>
+ #include <asm/pgtable.h>
+ #endif
+ 
+--- linux-2.6.0-test1/arch/h8300/mm/init.c	2003-06-14 12:18:21.000000000 -0700
++++ 25/arch/h8300/mm/init.c	2003-07-19 17:03:49.000000000 -0700
+@@ -23,9 +23,6 @@
+ #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>
+--- linux-2.6.0-test1/arch/i386/Kconfig	2003-07-13 21:44:34.000000000 -0700
++++ 25/arch/i386/Kconfig	2003-07-19 17:07:16.000000000 -0700
+@@ -438,9 +438,9 @@ config SMP
+ 	  If you don't know what to do here, say N.
+ 
+ config NR_CPUS
+-	int "Maximum number of CPUs (2-32)"
++	int "Maximum number of CPUs (2-255)"
+ 	depends on SMP
+-	default "32"
++	default "8"
+ 	help
+ 	  This allows you to specify the maximum number of CPUs which this
+ 	  kernel will support.  The maximum supported value is 32 and the
+@@ -723,6 +723,16 @@ config HIGHPTE
+ 	  low memory.  Setting this option will put user-space page table
+ 	  entries in high memory.
+ 
++config HIGHPMD
++	bool "Allocate 2nd-level pagetables from highmem"
++	depends on HIGHMEM64G && HIGHPTE
++	help
++	  The VM uses one lowmem-allocated pmd entry for each pagetable
++	  page of physical memory allocated, and preallocates them all
++	  for 12KB of per-process lowmem overhead. For systems with
++	  extreme amounts of highmem, this cannot be tolerated. Setting
++	  this option will put userspace 2nd-level pagetables in highmem.
++
+ config MATH_EMULATION
+ 	bool "Math emulation"
+ 	---help---
+@@ -1347,6 +1357,15 @@ config DEBUG_PAGEALLOC
+ 	  This results in a large slowdown, but helps to find certain types
+ 	  of memory corruptions.
+ 
++config SPINLINE
++	bool "Spinlock inlining"
++	depends on DEBUG_KERNEL
++	help
++	  This will change spinlocks from out of line to inline, making them
++	  account cost to the callers in readprofile, rather than the lock
++	  itself (as ".text.lock.filename"). This can be helpful for finding
++	  the callers of locks.
++
+ config DEBUG_HIGHMEM
+ 	bool "Highmem debugging"
+ 	depends on DEBUG_KERNEL && HIGHMEM
+@@ -1354,20 +1373,207 @@ config DEBUG_HIGHMEM
+ 	  This options enables addition error checking for high memory systems.
+ 	  Disable for production systems.
+ 
++config LOCKMETER
++	bool "Kernel lock metering"
++	depends on SMP && !PREEMPT
++	help
++	  Say Y to enable kernel lock metering, which adds overhead to SMP locks,
++	  but allows you to see various statistics using the lockstat command.
++
+ 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.	
+ 
++config KGDB
++	bool "Include kgdb kernel debugger"
++	depends on DEBUG_KERNEL
++	help  
++	  If you say Y here, the system will be compiled with the debug
++	  option (-g) and a debugging stub will be included in the
++	  kernel.  This stub communicates with gdb on another (host)
++	  computer via a serial port.  The host computer should have
++	  access to the kernel binary file (vmlinux) and a serial port
++	  that is connected to the target machine.  Gdb can be made to
++	  configure the serial port or you can use stty and setserial to
++	  do this. See the 'target' command in gdb. This option also
++	  configures in the ability to request a breakpoint early in the
++	  boot process.  To request the breakpoint just include 'kgdb'
++	  as a boot option when booting the target machine.  The system
++	  will then break as soon as it looks at the boot options.  This
++	  option also installs a breakpoint in panic and sends any
++	  kernel faults to the debugger. For more information see the
++	  Documentation/i386/kgdb.txt file.
++
++choice
++	depends on KGDB
++    	prompt "Debug serial port BAUD" 
++	default KGDB_115200BAUD
++	help  
++	  Gdb and the kernel stub need to agree on the baud rate to be
++	  used.  Some systems (x86 family at this writing) allow this to
++	  be configured.
++
++config KGDB_9600BAUD
++	bool "9600"
++
++config KGDB_19200BAUD
++	bool "19200"
++
++config KGDB_38400BAUD
++	bool "38400"
++
++config KGDB_57600BAUD
++	bool "57600"
++
++config KGDB_115200BAUD
++	bool "115200"
++endchoice
++
++config KGDB_PORT
++	hex "hex I/O port address of the debug serial port"
++	depends on KGDB
++	default  3f8
++	help  
++	  Some systems (x86 family at this writing) allow the port
++	  address to be configured.  The number entered is assumed to be
++	  hex, don't put 0x in front of it.  The standard address are:
++	  COM1 3f8 , irq 4 and COM2 2f8 irq 3.  Setserial /dev/ttySx
++	  will tell you what you have.  It is good to test the serial
++	  connection with a live system before trying to debug.
++
++config KGDB_IRQ
++	int "IRQ of the debug serial port"
++	depends on KGDB
++	default 4
++	help  
++	  This is the irq for the debug port.  If everything is working
++	  correctly and the kernel has interrupts on a control C to the
++	  port should cause a break into the kernel debug stub.
++
++config DEBUG_INFO
++	bool
++	default y
++
++config KGDB_MORE
++	bool "Add any additional compile options"
++	depends on KGDB
++	default n
++	help  
++	  Saying yes here turns on the ability to enter additional
++	  compile options.
++
++
++config KGDB_OPTIONS
++	depends on KGDB_MORE
++	string "Additional compile arguments"
++	default "-O1"
++	help  
++	  This option allows you enter additional compile options for
++	  the whole kernel compile.  Each platform will have a default
++	  that seems right for it.  For example on PPC "-ggdb -O1", and
++	  for i386 "-O1".  Note that by configuring KGDB "-g" is already
++	  turned on.  In addition, on i386 platforms
++	  "-fomit-frame-pointer" is deleted from the standard compile
++	  options.
++
++config NO_KGDB_CPUS
++	int "Number of CPUs"
++	depends on KGDB && SMP
++	default NR_CPUS
++	help
++	  
++	  This option sets the number of cpus for kgdb ONLY.  It is used
++	  to prune some internal structures so they look "nice" when
++	  displayed with gdb.  This is to overcome possibly larger
++	  numbers that may have been entered above.  Enter the real
++	  number to get nice clean kgdb_info displays.
++
++config KGDB_TS
++	bool "Enable kgdb time stamp macros?"
++	depends on KGDB
++	default n
++	help	  
++	  Kgdb event macros allow you to instrument your code with calls
++	  to the kgdb event recording function.  The event log may be
++	  examined with gdb at a break point.  Turning on this
++	  capability also allows you to choose how many events to
++	  keep. Kgdb always keeps the lastest events.
++
++choice 
++	depends on KGDB_TS
++	prompt "Max number of time stamps to save?"
++	default KGDB_TS_128
++
++config KGDB_TS_64
++	bool "64"
++
++config KGDB_TS_128
++	bool "128"
++
++config KGDB_TS_256
++	bool "256"
++
++config KGDB_TS_512
++	bool "512"
++
++config KGDB_TS_1024
++	bool "1024"
++
++endchoice
++
++config STACK_OVERFLOW_TEST
++	bool "Turn on kernel stack overflow testing?"
++	depends on KGDB
++	default n
++	help  
++	  This option enables code in the front line interrupt handlers
++	  to check for kernel stack overflow on interrupts and system
++	  calls.  This is part of the kgdb code on x86 systems.
++
++config KGDB_CONSOLE
++	bool "Enable serial console thru kgdb port"
++	depends on KGDB
++	default n
++	help
++	  This option enables the command line "console=kgdb" option.
++	  When the system is booted with this option in the command line
++	  all kernel printk output is sent to gdb (as well as to other
++	  consoles).  For this to work gdb must be connected.  For this
++	  reason, this command line option will generate a breakpoint if
++	  gdb has not yet connected.  After the gdb continue command is
++	  given all pent up console output will be printed by gdb on the
++	  host machine.  Neither this option, nor KGDB require the
++	  serial driver to be configured.
++
++config KGDB_SYSRQ
++	bool "Turn on SysRq 'G' command to do a break?"
++	depends on KGDB
++	default y
++	help
++	  This option includes an option in the SysRq code that allows
++	  you to enter SysRq G which generates a breakpoint to the KGDB
++	  stub.  This will work if the keyboard is alive and can
++	  interrupt the system.  Because of constraints on when the
++	  serial port interrupt can be enabled, this code may allow you
++	  to interrupt the system before the serial port control C is
++	  available.  Just say yes here.
++
+ config FRAME_POINTER
+ 	bool "Compile the kernel with frame pointers"
++	default KGDB
+ 	help
+ 	  If you say Y here the resulting kernel image will be slightly larger
+ 	  and slower, but it will give very useful debugging information.
+ 	  If you don't debug the kernel, you can say N, but we may not be able
+ 	  to solve problems without frame pointers.
+ 
++config MAGIC_SYSRQ
++	bool
++	depends on KGDB_SYSRQ
++	default y
++
+ config X86_EXTRA_IRQS
+ 	bool
+ 	depends on X86_LOCAL_APIC || X86_VOYAGER
+--- linux-2.6.0-test1/arch/i386/kernel/apic.c	2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/i386/kernel/apic.c	2003-07-19 17:04:06.000000000 -0700
+@@ -1137,7 +1137,7 @@ int __init APIC_init_uniprocessor (void)
+ 
+ 	connect_bsp_APIC();
+ 
+-	phys_cpu_present_map = 1 << boot_cpu_physical_apicid;
++	phys_cpu_present_map = physid_mask_of_physid(boot_cpu_physical_apicid);
+ 
+ 	setup_local_APIC();
+ 
+--- linux-2.6.0-test1/arch/i386/kernel/apm.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/arch/i386/kernel/apm.c	2003-07-19 17:04:06.000000000 -0700
+@@ -508,16 +508,16 @@ static void apm_error(char *str, int err
+  
+ #ifdef CONFIG_SMP
+ 
+-static unsigned long apm_save_cpus(void)
++static cpumask_t apm_save_cpus(void)
+ {
+-	unsigned long x = current->cpus_allowed;
++	cpumask_t x = current->cpus_allowed;
+ 	/* Some bioses don't like being called from CPU != 0 */
+-	set_cpus_allowed(current, 1UL << 0);
++	set_cpus_allowed(current, cpumask_of_cpu(0));
+ 	BUG_ON(smp_processor_id() != 0);
+ 	return x;
+ }
+ 
+-static inline void apm_restore_cpus(unsigned long mask)
++static inline void apm_restore_cpus(cpumask_t mask)
+ {
+ 	set_cpus_allowed(current, mask);
+ }
+@@ -528,7 +528,7 @@ static inline void apm_restore_cpus(unsi
+  *	No CPU lockdown needed on a uniprocessor
+  */
+  
+-#define apm_save_cpus()	0
++#define apm_save_cpus()		(current->cpus_allowed)
+ #define apm_restore_cpus(x)	(void)(x)
+ 
+ #endif
+@@ -593,7 +593,7 @@ static u8 apm_bios_call(u32 func, u32 eb
+ {
+ 	APM_DECL_SEGS
+ 	unsigned long		flags;
+-	unsigned long		cpus;
++	cpumask_t		cpus;
+ 	int			cpu;
+ 	struct desc_struct	save_desc_40;
+ 
+@@ -635,7 +635,7 @@ static u8 apm_bios_call_simple(u32 func,
+ 	u8			error;
+ 	APM_DECL_SEGS
+ 	unsigned long		flags;
+-	unsigned long		cpus;
++	cpumask_t		cpus;
+ 	int			cpu;
+ 	struct desc_struct	save_desc_40;
+ 
+@@ -913,7 +913,7 @@ static void apm_power_off(void)
+ 	 */
+ #ifdef CONFIG_SMP
+ 	/* Some bioses don't like being called from CPU != 0 */
+-	set_cpus_allowed(current, 1UL << 0);
++	set_cpus_allowed(current, cpumask_of_cpu(0));
+ 	BUG_ON(smp_processor_id() != 0);
+ #endif
+ 	if (apm_info.realmode_power_off)
+@@ -1704,7 +1704,7 @@ static int apm(void *unused)
+ 	 * Some bioses don't like being called from CPU != 0.
+ 	 * Method suggested by Ingo Molnar.
+ 	 */
+-	set_cpus_allowed(current, 1UL << 0);
++	set_cpus_allowed(current, cpumask_of_cpu(0));
+ 	BUG_ON(smp_processor_id() != 0);
+ #endif
+ 
+--- linux-2.6.0-test1/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c	2003-06-14 12:18:33.000000000 -0700
++++ 25/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c	2003-07-19 17:04:06.000000000 -0700
+@@ -53,10 +53,9 @@ static int stock_freq;
+ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate)
+ {
+ 	u32 l, h;
+-	unsigned long cpus_allowed;
++	cpumask_t cpus_allowed, affected_cpu_map;
+ 	struct cpufreq_freqs freqs;
+ 	int hyperthreading = 0;
+-	int affected_cpu_map = 0;
+ 	int sibling = 0;
+ 
+ 	if (!cpu_online(cpu) || (newstate > DC_DISABLE) || 
+@@ -67,16 +66,16 @@ static int cpufreq_p4_setdc(unsigned int
+ 	cpus_allowed = current->cpus_allowed;
+ 
+ 	/* only run on CPU to be set, or on its sibling */
+-	affected_cpu_map = 1 << cpu;
++       affected_cpu_map = cpumask_of_cpu(cpu);
+ #ifdef CONFIG_X86_HT
+ 	hyperthreading = ((cpu_has_ht) && (smp_num_siblings == 2));
+ 	if (hyperthreading) {
+ 		sibling = cpu_sibling_map[cpu];
+-		affected_cpu_map |= (1 << sibling);
++                cpu_set(sibling, affected_cpu_map);
+ 	}
+ #endif
+ 	set_cpus_allowed(current, affected_cpu_map);
+-	BUG_ON(!(affected_cpu_map & (1 << smp_processor_id())));
++        BUG_ON(!cpu_isset(smp_processor_id(), affected_cpu_map));
+ 
+ 	/* get current state */
+ 	rdmsr(MSR_IA32_THERM_CONTROL, l, h);
+--- linux-2.6.0-test1/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c	2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c	2003-07-19 17:05:02.000000000 -0700
+@@ -156,14 +156,15 @@ static struct cpufreq_frequency_table op
+ };
+ #undef OP
+ 
+-#define CPU(max)	\
+-	{ "Intel(R) Pentium(R) M processor " #max "MHz", (max)*1000, op_##max }
++#define _CPU(max, name)	\
++	{ "Intel(R) Pentium(R) M processor " name "MHz", (max)*1000, op_##max }
++#define CPU(max)	_CPU(max, #max)
+ 
+ /* CPU models, their operating frequency range, and freq/voltage
+    operating points */
+ static const struct cpu_model models[] = 
+ {
+-	CPU( 900),
++       _CPU( 900, " 900"),
+ 	CPU(1100),
+ 	CPU(1200),
+ 	CPU(1300),
+--- linux-2.6.0-test1/arch/i386/kernel/cpu/cpufreq/speedstep-ich.c	2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/i386/kernel/cpu/cpufreq/speedstep-ich.c	2003-07-19 17:08:59.000000000 -0700
+@@ -77,15 +77,17 @@ static void speedstep_set_state (unsigne
+ 	u8			value;
+ 	unsigned long		flags;
+ 	struct cpufreq_freqs	freqs;
++	int			newfreq;
+ 
+ 	if (!speedstep_chipset_dev || (state > 0x1))
+ 		return;
+ 
+ 	freqs.old = speedstep_get_processor_frequency(speedstep_processor);
+-	freqs.new = speedstep_freqs[SPEEDSTEP_LOW].frequency;
++	freqs.new = speedstep_freqs[state].frequency;
+ 	freqs.cpu = 0; /* speedstep.c is UP only driver */
+ 	
+-	if (notify)
++	/* make sure we've initialized before calling notify */
++	if (notify && (freqs.new != 0))
+ 		cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
+ 
+ 	/* get PMBASE */
+@@ -136,13 +138,16 @@ static void speedstep_set_state (unsigne
+ 
+ 	dprintk(KERN_DEBUG "cpufreq: read at pmbase 0x%x + 0x50 returned 0x%x\n", pmbase, value);
+ 
++	/* freqs.new may not be set yet - need local copy */
++	newfreq = speedstep_get_processor_frequency(speedstep_processor);
+ 	if (state == (value & 0x1)) {
+-		dprintk (KERN_INFO "cpufreq: change to %u MHz succeeded\n", (freqs.new / 1000));
++		dprintk (KERN_INFO "cpufreq: change to %u MHz succeeded\n", (newfreq / 1000));
+ 	} else {
+ 		printk (KERN_ERR "cpufreq: change failed - I/O error\n");
+ 	}
+ 
+-	if (notify)
++	/* Make sure we're initialized before calling notify */
++	if (notify && (freqs.new != 0))
+ 		cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
+ 
+ 	return;
+@@ -295,7 +300,7 @@ static int speedstep_cpu_init(struct cpu
+ 		return -EIO;
+ 
+ 	dprintk(KERN_INFO "cpufreq: currently at %s speed setting - %i MHz\n", 
+-		(speed == speedstep_low_freq) ? "low" : "high",
++		(speed == speedstep_freqs[SPEEDSTEP_LOW].frequency) ? "low" : "high",
+ 		(speed / 1000));
+ 
+ 	/* cpuinfo and default policy values */
+--- linux-2.6.0-test1/arch/i386/kernel/cpuid.c	2003-06-14 12:17:55.000000000 -0700
++++ 25/arch/i386/kernel/cpuid.c	2003-07-19 17:04:06.000000000 -0700
+@@ -136,7 +136,7 @@ static int cpuid_open(struct inode *inod
+   int cpu = minor(file->f_dentry->d_inode->i_rdev);
+   struct cpuinfo_x86 *c = &(cpu_data)[cpu];
+ 
+-  if ( !(cpu_online_map & (1UL << cpu)) )
++  if (!cpu_online(cpu))
+     return -ENXIO;		/* No such CPU */
+   if ( c->cpuid_level < 0 )
+     return -EIO;		/* CPUID not supported */
+--- linux-2.6.0-test1/arch/i386/kernel/cpu/mtrr/cyrix.c	2003-06-14 12:18:22.000000000 -0700
++++ 25/arch/i386/kernel/cpu/mtrr/cyrix.c	2003-07-19 17:03:49.000000000 -0700
+@@ -330,16 +330,16 @@ cyrix_arr_init(void)
+ 	set_mtrr_done(&ctxt);	/* flush cache and disable MAPEN */
+ 
+ 	if (ccrc[5])
+-		printk("mtrr: ARR usage was not enabled, enabled manually\n");
++		printk(KERN_INFO "mtrr: ARR usage was not enabled, enabled manually\n");
+ 	if (ccrc[3])
+-		printk("mtrr: ARR3 cannot be changed\n");
++		printk(KERN_INFO "mtrr: ARR3 cannot be changed\n");
+ /*
+     if ( ccrc[1] & 0x80) printk ("mtrr: SMM memory access through ARR3 disabled\n");
+     if ( ccrc[1] & 0x04) printk ("mtrr: SMM memory access disabled\n");
+     if ( ccrc[1] & 0x02) printk ("mtrr: SMM mode disabled\n");
+ */
+ 	if (ccrc[6])
+-		printk("mtrr: ARR3 was write protected, unprotected\n");
++		printk(KERN_INFO "mtrr: ARR3 was write protected, unprotected\n");
+ }
+ 
+ static struct mtrr_ops cyrix_mtrr_ops = {
+--- linux-2.6.0-test1/arch/i386/kernel/cpu/mtrr/main.c	2003-06-26 22:07:22.000000000 -0700
++++ 25/arch/i386/kernel/cpu/mtrr/main.c	2003-07-19 17:04:57.000000000 -0700
+@@ -64,7 +64,7 @@ __initdata char *mtrr_if_name[] = {
+ static void set_mtrr(unsigned int reg, unsigned long base,
+ 		     unsigned long size, mtrr_type type);
+ 
+-static unsigned int arr3_protected;
++extern int arr3_protected;
+ 
+ void set_mtrr_ops(struct mtrr_ops * ops)
+ {
+@@ -75,23 +75,25 @@ void set_mtrr_ops(struct mtrr_ops * ops)
+ /*  Returns non-zero if we have the write-combining memory type  */
+ static int have_wrcomb(void)
+ {
+-	struct pci_dev *dev = NULL;
+-
+-	/* WTF is this?
+-	 * Someone, please shoot me.
+-	 */
+-
+-	/* ServerWorks LE chipsets have problems with write-combining 
+-	   Don't allow it and leave room for other chipsets to be tagged */
+-
++	struct pci_dev *dev;
++	
+ 	if ((dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, NULL)) != NULL) {
+-		if ((dev->vendor == PCI_VENDOR_ID_SERVERWORKS) &&
+-		    (dev->device == PCI_DEVICE_ID_SERVERWORKS_LE)) {
+-			printk(KERN_INFO
+-			       "mtrr: Serverworks LE detected. Write-combining disabled.\n");
++		/* ServerWorks LE chipsets have problems with write-combining 
++		   Don't allow it and leave room for other chipsets to be tagged */
++		if (dev->vendor == PCI_VENDOR_ID_SERVERWORKS &&
++		    dev->device == PCI_DEVICE_ID_SERVERWORKS_LE) {
++			printk(KERN_INFO "mtrr: Serverworks LE detected. Write-combining disabled.\n");
+ 			return 0;
+ 		}
+-	}
++		/* Intel 450NX errata # 23. Non ascending cachline evictions to
++		   write combining memory may resulting in data corruption */
++		if (dev->vendor == PCI_VENDOR_ID_INTEL &&
++		    dev->device == PCI_DEVICE_ID_INTEL_82451NX)
++		{
++			printk(KERN_INFO "mtrr: Intel 450NX MMC detected. Write-combining disabled.\n");
++			return 0;
++		}
++	}		
+ 	return (mtrr_if->have_wrcomb ? mtrr_if->have_wrcomb() : 0);
+ }
+ 
+@@ -121,7 +123,7 @@ static void init_table(void)
+ 	max = num_var_ranges;
+ 	if ((usage_table = kmalloc(max * sizeof *usage_table, GFP_KERNEL))
+ 	    == NULL) {
+-		printk("mtrr: could not allocate\n");
++		printk(KERN_ERR "mtrr: could not allocate\n");
+ 		return;
+ 	}
+ 	for (i = 0; i < max; i++)
+@@ -310,7 +312,7 @@ int mtrr_add_page(unsigned long base, un
+ 		return error;
+ 
+ 	if (type >= MTRR_NUM_TYPES) {
+-		printk("mtrr: type: %u illegal\n", type);
++		printk(KERN_WARNING "mtrr: type: %u invalid\n", type);
+ 		return -EINVAL;
+ 	}
+ 
+@@ -322,7 +324,7 @@ int mtrr_add_page(unsigned long base, un
+ 	}
+ 
+ 	if (base & size_or_mask || size & size_or_mask) {
+-		printk("mtrr: base or size exceeds the MTRR width\n");
++		printk(KERN_WARNING "mtrr: base or size exceeds the MTRR width\n");
+ 		return -EINVAL;
+ 	}
+ 
+@@ -348,7 +350,7 @@ int mtrr_add_page(unsigned long base, un
+ 		if (ltype != type) {
+ 			if (type == MTRR_TYPE_UNCACHABLE)
+ 				continue;
+-			printk ("mtrr: type mismatch for %lx000,%lx000 old: %s new: %s\n",
++			printk (KERN_WARNING "mtrr: type mismatch for %lx000,%lx000 old: %s new: %s\n",
+ 			     base, size, attrib_to_str(ltype),
+ 			     attrib_to_str(type));
+ 			goto out;
+@@ -364,7 +366,7 @@ int mtrr_add_page(unsigned long base, un
+ 		set_mtrr(i, base, size, type);
+ 		usage_table[i] = 1;
+ 	} else
+-		printk("mtrr: no more MTRRs available\n");
++		printk(KERN_INFO "mtrr: no more MTRRs available\n");
+ 	error = i;
+  out:
+ 	up(&main_lock);
+@@ -412,8 +414,8 @@ mtrr_add(unsigned long base, unsigned lo
+ 	 char increment)
+ {
+ 	if ((base & (PAGE_SIZE - 1)) || (size & (PAGE_SIZE - 1))) {
+-		printk("mtrr: size and base must be multiples of 4 kiB\n");
+-		printk("mtrr: size: 0x%lx  base: 0x%lx\n", size, base);
++		printk(KERN_WARNING "mtrr: size and base must be multiples of 4 kiB\n");
++		printk(KERN_DEBUG "mtrr: size: 0x%lx  base: 0x%lx\n", size, base);
+ 		return -EINVAL;
+ 	}
+ 	return mtrr_add_page(base >> PAGE_SHIFT, size >> PAGE_SHIFT, type,
+@@ -458,28 +460,28 @@ int mtrr_del_page(int reg, unsigned long
+ 			}
+ 		}
+ 		if (reg < 0) {
+-			printk("mtrr: no MTRR for %lx000,%lx000 found\n", base,
++			printk(KERN_DEBUG "mtrr: no MTRR for %lx000,%lx000 found\n", base,
+ 			       size);
+ 			goto out;
+ 		}
+ 	}
+ 	if (reg >= max) {
+-		printk("mtrr: register: %d too big\n", reg);
++		printk(KERN_WARNING "mtrr: register: %d too big\n", reg);
+ 		goto out;
+ 	}
+ 	if (is_cpu(CYRIX) && !use_intel()) {
+ 		if ((reg == 3) && arr3_protected) {
+-			printk("mtrr: ARR3 cannot be changed\n");
++			printk(KERN_WARNING "mtrr: ARR3 cannot be changed\n");
+ 			goto out;
+ 		}
+ 	}
+ 	mtrr_if->get(reg, &lbase, &lsize, &ltype);
+ 	if (lsize < 1) {
+-		printk("mtrr: MTRR %d not used\n", reg);
++		printk(KERN_WARNING "mtrr: MTRR %d not used\n", reg);
+ 		goto out;
+ 	}
+ 	if (usage_table[reg] < 1) {
+-		printk("mtrr: reg: %d has count=0\n", reg);
++		printk(KERN_WARNING "mtrr: reg: %d has count=0\n", reg);
+ 		goto out;
+ 	}
+ 	if (--usage_table[reg] < 1)
+@@ -508,8 +510,8 @@ int
+ mtrr_del(int reg, unsigned long base, unsigned long size)
+ {
+ 	if ((base & (PAGE_SIZE - 1)) || (size & (PAGE_SIZE - 1))) {
+-		printk("mtrr: size and base must be multiples of 4 kiB\n");
+-		printk("mtrr: size: 0x%lx  base: 0x%lx\n", size, base);
++		printk(KERN_INFO "mtrr: size and base must be multiples of 4 kiB\n");
++		printk(KERN_DEBUG "mtrr: size: 0x%lx  base: 0x%lx\n", size, base);
+ 		return -EINVAL;
+ 	}
+ 	return mtrr_del_page(reg, base >> PAGE_SHIFT, size >> PAGE_SHIFT);
+@@ -677,7 +679,7 @@ static int __init mtrr_init(void)
+ 			break;
+ 		}
+ 	}
+-	printk("mtrr: v%s\n",MTRR_VERSION);
++	printk(KERN_INFO "mtrr: v%s\n",MTRR_VERSION);
+ 
+ 	if (mtrr_if) {
+ 		set_num_var_ranges();
+@@ -701,5 +703,5 @@ char *mtrr_strings[MTRR_NUM_TYPES] =
+     "write-back",               /* 6 */
+ };
+ 
+-subsys_initcall(mtrr_init);
++core_initcall(mtrr_init);
+ 
+--- linux-2.6.0-test1/arch/i386/kernel/cpu/proc.c	2003-06-14 12:18:33.000000000 -0700
++++ 25/arch/i386/kernel/cpu/proc.c	2003-07-19 17:04:06.000000000 -0700
+@@ -60,7 +60,7 @@ static int show_cpuinfo(struct seq_file 
+ 	int fpu_exception;
+ 
+ #ifdef CONFIG_SMP
+-	if (!(cpu_online_map & (1<<n)))
++	if (!cpu_online(n))
+ 		return 0;
+ #endif
+ 	seq_printf(m, "processor\t: %d\n"
+--- linux-2.6.0-test1/arch/i386/kernel/entry.S	2003-07-13 21:44:34.000000000 -0700
++++ 25/arch/i386/kernel/entry.S	2003-07-19 17:06:37.000000000 -0700
+@@ -48,6 +48,18 @@
+ #include <asm/smp.h>
+ #include <asm/page.h>
+ #include "irq_vectors.h"
++        /* We do not recover from a stack overflow, but at least
++         * we know it happened and should be able to track it down.
++         */
++#ifdef CONFIG_STACK_OVERFLOW_TEST
++#define STACK_OVERFLOW_TEST \
++        testl $7680,%esp;    \
++        jnz   10f;            \
++        call  stack_overflow; \
++10:
++#else
++#define STACK_OVERFLOW_TEST
++#endif
+ 
+ EBX		= 0x00
+ ECX		= 0x04
+@@ -98,7 +110,8 @@ TSS_ESP0_OFFSET = (4 - 0x200)
+ 	pushl %ebx; \
+ 	movl $(__USER_DS), %edx; \
+ 	movl %edx, %ds; \
+-	movl %edx, %es;
++	movl %edx, %es; \
++        STACK_OVERFLOW_TEST
+ 
+ #define RESTORE_INT_REGS \
+ 	popl %ebx;	\
+@@ -298,6 +311,19 @@ syscall_exit:
+ 	testw $_TIF_ALLWORK_MASK, %cx	# current->work
+ 	jne syscall_exit_work
+ restore_all:
++#ifdef CONFIG_TRAP_BAD_SYSCALL_EXITS
++	movl EFLAGS(%esp), %eax		# mix EFLAGS and CS
++	movb CS(%esp), %al
++	testl $(VM_MASK | 3), %eax
++	jz resume_kernelX		# returning to kernel or vm86-space
++
++	cmpl $0,TI_PRE_COUNT(%ebx)	# non-zero preempt_count ?
++	jz resume_kernelX
++        
++        int $3
++        
++resume_kernelX:
++#endif
+ 	RESTORE_ALL
+ 
+ 	# perform work that needs to be done immediately before resumption
+@@ -878,5 +904,6 @@ ENTRY(sys_call_table)
+ 	.long sys_fstatfs64	
+ 	.long sys_tgkill	/* 270 */
+ 	.long sys_utimes
+- 
++	.long sys_mknod64
++
+ nr_syscalls=(.-sys_call_table)/4
+--- linux-2.6.0-test1/arch/i386/kernel/io_apic.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/i386/kernel/io_apic.c	2003-07-19 17:04:06.000000000 -0700
+@@ -249,14 +249,14 @@ static void clear_IO_APIC (void)
+ 			clear_IO_APIC_pin(apic, pin);
+ }
+ 
+-static void set_ioapic_affinity (unsigned int irq, unsigned long cpu_mask)
++static void set_ioapic_affinity(unsigned int irq, cpumask_t cpumask)
+ {
+ 	unsigned long flags;
+ 	int pin;
+ 	struct irq_pin_list *entry = irq_2_pin + irq;
+ 	unsigned int apicid_value;
+ 	
+-	apicid_value = cpu_mask_to_apicid(cpu_mask);
++	apicid_value = cpu_mask_to_apicid(mk_cpumask_const(cpumask));
+ 	/* Prepare to do the io_apic_write */
+ 	apicid_value = apicid_value << 24;
+ 	spin_lock_irqsave(&ioapic_lock, flags);
+@@ -286,9 +286,9 @@ static void set_ioapic_affinity (unsigne
+ #  define Dprintk(x...) 
+ # endif
+ 
+-extern unsigned long irq_affinity[NR_IRQS];
++extern cpumask_t irq_affinity[NR_IRQS];
+ 
+-static int __cacheline_aligned pending_irq_balance_cpumask[NR_IRQS];
++static cpumask_t __cacheline_aligned pending_irq_balance_cpumask[NR_IRQS];
+ 
+ #define IRQBALANCE_CHECK_ARCH -999
+ static int irqbalance_disabled = IRQBALANCE_CHECK_ARCH;
+@@ -307,8 +307,7 @@ struct irq_cpu_info {
+ #define IDLE_ENOUGH(cpu,now) \
+ 		(idle_cpu(cpu) && ((now) - irq_stat[(cpu)].idle_timestamp > 1))
+ 
+-#define IRQ_ALLOWED(cpu,allowed_mask) \
+-		((1 << cpu) & (allowed_mask))
++#define IRQ_ALLOWED(cpu, allowed_mask)	cpu_isset(cpu, allowed_mask)
+ 
+ #define CPU_TO_PACKAGEINDEX(i) \
+ 		((physical_balance && i > cpu_sibling_map[i]) ? cpu_sibling_map[i] : i)
+@@ -320,7 +319,7 @@ struct irq_cpu_info {
+ 
+ long balanced_irq_interval = MAX_BALANCED_IRQ_INTERVAL;
+ 
+-static unsigned long move(int curr_cpu, unsigned long allowed_mask,
++static unsigned long move(int curr_cpu, cpumask_t allowed_mask,
+ 			unsigned long now, int direction)
+ {
+ 	int search_idle = 1;
+@@ -350,20 +349,20 @@ inside:
+ static inline void balance_irq(int cpu, int irq)
+ {
+ 	unsigned long now = jiffies;
+-	unsigned long allowed_mask;
++	cpumask_t allowed_mask;
+ 	unsigned int new_cpu;
+ 		
+ 	if (irqbalance_disabled)
+ 		return; 
+ 
+-	allowed_mask = cpu_online_map & irq_affinity[irq];
++	cpus_and(allowed_mask, cpu_online_map, irq_affinity[irq]);
+ 	new_cpu = move(cpu, allowed_mask, now, 1);
+ 	if (cpu != new_cpu) {
+ 		irq_desc_t *desc = irq_desc + irq;
+ 		unsigned long flags;
+ 
+ 		spin_lock_irqsave(&desc->lock, flags);
+-		pending_irq_balance_cpumask[irq] = 1 << new_cpu;
++		pending_irq_balance_cpumask[irq] = cpumask_of_cpu(new_cpu);
+ 		spin_unlock_irqrestore(&desc->lock, flags);
+ 	}
+ }
+@@ -399,8 +398,7 @@ static void do_irq_balance(void)
+ 	int tmp_loaded, first_attempt = 1;
+ 	unsigned long tmp_cpu_irq;
+ 	unsigned long imbalance = 0;
+-	unsigned long allowed_mask;
+-	unsigned long target_cpu_mask;
++	cpumask_t allowed_mask, target_cpu_mask, tmp;
+ 
+ 	for (i = 0; i < NR_CPUS; i++) {
+ 		int package_index;
+@@ -549,10 +547,11 @@ tryanotherirq:
+ 					CPU_IRQ(cpu_sibling_map[min_loaded]))
+ 		min_loaded = cpu_sibling_map[min_loaded];
+ 
+-	allowed_mask = cpu_online_map & irq_affinity[selected_irq];
+-	target_cpu_mask = 1 << min_loaded;
++	cpus_and(allowed_mask, cpu_online_map, irq_affinity[selected_irq]);
++	target_cpu_mask = cpumask_of_cpu(min_loaded);
++	cpus_and(tmp, target_cpu_mask, allowed_mask);
+ 
+-	if (target_cpu_mask & allowed_mask) {
++	if (!cpus_empty(tmp)) {
+ 		irq_desc_t *desc = irq_desc + selected_irq;
+ 		unsigned long flags;
+ 
+@@ -560,7 +559,8 @@ tryanotherirq:
+ 				selected_irq, min_loaded);
+ 		/* mark for change destination */
+ 		spin_lock_irqsave(&desc->lock, flags);
+-		pending_irq_balance_cpumask[selected_irq] = 1 << min_loaded;
++		pending_irq_balance_cpumask[selected_irq] =
++					cpumask_of_cpu(min_loaded);
+ 		spin_unlock_irqrestore(&desc->lock, flags);
+ 		/* Since we made a change, come back sooner to 
+ 		 * check for more variation.
+@@ -591,8 +591,9 @@ int balanced_irq(void *unused)
+ 	daemonize("kirqd");
+ 	
+ 	/* push everything to CPU 0 to give us a starting point.  */
+-	for (i = 0 ; i < NR_IRQS ; i++)
+-		pending_irq_balance_cpumask[i] = 1;
++	for (i = 0 ; i < NR_IRQS ; i++) {
++		pending_irq_balance_cpumask[i] = cpumask_of_cpu(0);
++	}
+ 
+ repeat:
+ 	set_current_state(TASK_INTERRUPTIBLE);
+@@ -611,7 +612,9 @@ static int __init balanced_irq_init(void
+ {
+ 	int i;
+ 	struct cpuinfo_x86 *c;
++	cpumask_t tmp;
+ 
++	cpus_shift_right(tmp, cpu_online_map, 2);
+         c = &boot_cpu_data;
+ 	/* When not overwritten by the command line ask subarchitecture. */
+ 	if (irqbalance_disabled == IRQBALANCE_CHECK_ARCH)
+@@ -628,7 +631,7 @@ static int __init balanced_irq_init(void
+ 	 * Enable physical balance only if more than 1 physical processor
+ 	 * is present
+ 	 */
+-	if (smp_num_siblings > 1 && cpu_online_map >> 2)
++	if (smp_num_siblings > 1 && !cpus_empty(tmp))
+ 		physical_balance = 1;
+ 
+ 	for (i = 0; i < NR_CPUS; i++) {
+@@ -667,14 +670,14 @@ static int __init irqbalance_disable(cha
+ 
+ __setup("noirqbalance", irqbalance_disable);
+ 
+-static void set_ioapic_affinity (unsigned int irq, unsigned long mask);
++static void set_ioapic_affinity(unsigned int irq, cpumask_t mask);
+ 
+ static inline void move_irq(int irq)
+ {
+ 	/* note - we hold the desc->lock */
+-	if (unlikely(pending_irq_balance_cpumask[irq])) {
++	if (unlikely(!cpus_empty(pending_irq_balance_cpumask[irq]))) {
+ 		set_ioapic_affinity(irq, pending_irq_balance_cpumask[irq]);
+-		pending_irq_balance_cpumask[irq] = 0;
++		cpus_clear(pending_irq_balance_cpumask[irq]);
+ 	}
+ }
+ 
+@@ -682,6 +685,21 @@ __initcall(balanced_irq_init);
+ 
+ #else /* !SMP */
+ static inline void move_irq(int irq) { }
++
++void send_IPI_self(int vector)
++{
++	unsigned int cfg;
++
++	/*
++	 * Wait for idle.
++	 */
++	apic_wait_icr_idle();
++	cfg = APIC_DM_FIXED | APIC_DEST_SELF | vector | APIC_DEST_LOGICAL;
++	/*
++	 * Send the IPI. The write to APIC_ICR fires this off.
++	 */
++	apic_write_around(APIC_ICR, cfg);
++}
+ #endif /* defined(CONFIG_SMP) */
+ 
+ 
+@@ -822,7 +840,7 @@ int IO_APIC_get_PCI_irq_vector(int bus, 
+  * we need to reprogram the ioredtbls to cater for the cpus which have come online
+  * so mask in all cases should simply be TARGET_CPUS
+  */
+-void __init setup_ioapic_dest (unsigned long mask)
++void __init setup_ioapic_dest(cpumask_t mask)
+ {
+ 	int pin, ioapic, irq, irq_entry;
+ 
+@@ -1598,7 +1616,7 @@ void disable_IO_APIC(void)
+ static void __init setup_ioapic_ids_from_mpc(void)
+ {
+ 	union IO_APIC_reg_00 reg_00;
+-	unsigned long phys_id_present_map;
++	physid_mask_t phys_id_present_map;
+ 	int apic;
+ 	int i;
+ 	unsigned char old_id;
+@@ -1608,6 +1626,10 @@ static void __init setup_ioapic_ids_from
+ 		/* This gets done during IOAPIC enumeration for ACPI. */
+ 		return;
+ 
++	/*
++	 * This is broken; anything with a real cpu count has to
++	 * circumvent this idiocy regardless.
++	 */
+ 	phys_id_present_map = ioapic_phys_id_map(phys_cpu_present_map);
+ 
+ 	/*
+@@ -1639,18 +1661,20 @@ static void __init setup_ioapic_ids_from
+ 					mp_ioapics[apic].mpc_apicid)) {
+ 			printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n",
+ 				apic, mp_ioapics[apic].mpc_apicid);
+-			for (i = 0; i < 0xf; i++)
+-				if (!(phys_id_present_map & (1 << i)))
++			for (i = 0; i < APIC_BROADCAST_ID; i++)
++				if (!physid_isset(i, phys_id_present_map))
+ 					break;
+-			if (i >= 0xf)
++			if (i >= APIC_BROADCAST_ID)
+ 				panic("Max APIC ID exceeded!\n");
+ 			printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
+ 				i);
+-			phys_id_present_map |= 1 << i;
++			physid_set(i, phys_id_present_map);
+ 			mp_ioapics[apic].mpc_apicid = i;
+ 		} else {
++			physid_mask_t tmp;
++			tmp = apicid_to_cpu_present(mp_ioapics[apic].mpc_apicid);
+ 			printk("Setting %d in the phys_id_present_map\n", mp_ioapics[apic].mpc_apicid);
+-			phys_id_present_map |= apicid_to_cpu_present(mp_ioapics[apic].mpc_apicid);
++			physids_or(phys_id_present_map, phys_id_present_map, tmp);
+ 		}
+ 
+ 
+@@ -2220,7 +2244,8 @@ late_initcall(io_apic_bug_finalize);
+ int __init io_apic_get_unique_id (int ioapic, int apic_id)
+ {
+ 	union IO_APIC_reg_00 reg_00;
+-	static unsigned long apic_id_map = 0;
++	static physid_mask_t apic_id_map = PHYSID_MASK_NONE;
++	physid_mask_t tmp;
+ 	unsigned long flags;
+ 	int i = 0;
+ 
+@@ -2233,8 +2258,8 @@ int __init io_apic_get_unique_id (int io
+ 	 *      advantage of new APIC bus architecture.
+ 	 */
+ 
+-	if (!apic_id_map)
+-		apic_id_map = phys_cpu_present_map;
++	if (physids_empty(apic_id_map))
++		apic_id_map = ioapic_phys_id_map(phys_cpu_present_map);
+ 
+ 	spin_lock_irqsave(&ioapic_lock, flags);
+ 	reg_00.raw = io_apic_read(ioapic, 0);
+@@ -2266,7 +2291,8 @@ int __init io_apic_get_unique_id (int io
+ 		apic_id = i;
+ 	} 
+ 
+-	apic_id_map |= apicid_to_cpu_present(apic_id);
++	tmp = apicid_to_cpu_present(apic_id);
++	physids_or(apic_id_map, apic_id_map, tmp);
+ 
+ 	if (reg_00.bits.ID != apic_id) {
+ 		reg_00.bits.ID = apic_id;
+--- linux-2.6.0-test1/arch/i386/kernel/irq.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/i386/kernel/irq.c	2003-07-19 17:04:06.000000000 -0700
+@@ -45,8 +45,6 @@
+ #include <asm/desc.h>
+ #include <asm/irq.h>
+ 
+-
+-
+ /*
+  * Linux has a controller-independent x86 interrupt architecture.
+  * every controller has a 'controller-template', that is used
+@@ -889,13 +887,13 @@ int setup_irq(unsigned int irq, struct i
+ static struct proc_dir_entry * root_irq_dir;
+ static struct proc_dir_entry * irq_dir [NR_IRQS];
+ 
+-#define HEX_DIGITS 8
++#define HEX_DIGITS (2*sizeof(cpumask_t))
+ 
+-static unsigned int parse_hex_value (const char __user *buffer,
+-		unsigned long count, unsigned long *ret)
++static unsigned int parse_hex_value(const char __user *buffer,
++		unsigned long count, cpumask_t *ret)
+ {
+-	unsigned char hexnum [HEX_DIGITS];
+-	unsigned long value;
++	unsigned char hexnum[HEX_DIGITS];
++	cpumask_t value = CPU_MASK_NONE;
+ 	int i;
+ 
+ 	if (!count)
+@@ -909,10 +907,10 @@ static unsigned int parse_hex_value (con
+ 	 * Parse the first 8 characters as a hex string, any non-hex char
+ 	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
+ 	 */
+-	value = 0;
+ 
+ 	for (i = 0; i < count; i++) {
+ 		unsigned int c = hexnum[i];
++		int k;
+ 
+ 		switch (c) {
+ 			case '0' ... '9': c -= '0'; break;
+@@ -921,7 +919,10 @@ static unsigned int parse_hex_value (con
+ 		default:
+ 			goto out;
+ 		}
+-		value = (value << 4) | c;
++		cpus_shift_left(value, value, 4);
++		for (k = 0; k < 4; ++k)
++			if (test_bit(k, (unsigned long *)&c))
++				cpu_set(k, value);
+ 	}
+ out:
+ 	*ret = value;
+@@ -930,22 +931,35 @@ out:
+ 
+ #ifdef CONFIG_SMP
+ 
+-static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
++static struct proc_dir_entry *smp_affinity_entry[NR_IRQS];
++
++cpumask_t irq_affinity[NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL };
+ 
+-unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };
+-static int irq_affinity_read_proc (char *page, char **start, off_t off,
++static int irq_affinity_read_proc(char *page, char **start, off_t off,
+ 			int count, int *eof, void *data)
+ {
++	int k, len;
++	cpumask_t tmp = irq_affinity[(long)data];
++
+ 	if (count < HEX_DIGITS+1)
+ 		return -EINVAL;
+-	return sprintf (page, "%08lx\n", irq_affinity[(long)data]);
++
++	len = 0;
++	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
++		len += j;
++		page += j;
++		cpus_shift_right(tmp, tmp, 16);
++	}
++	len += sprintf(page, "\n");
++	return len;
+ }
+ 
+-static int irq_affinity_write_proc (struct file *file, const char __user *buffer,
++static int irq_affinity_write_proc(struct file *file, const char __user *buffer,
+ 					unsigned long count, void *data)
+ {
+-	int irq = (long) data, full_count = count, err;
+-	unsigned long new_value;
++	int irq = (long)data, full_count = count, err;
++	cpumask_t new_value, tmp;
+ 
+ 	if (!irq_desc[irq].handler->set_affinity)
+ 		return -EIO;
+@@ -957,11 +971,13 @@ static int irq_affinity_write_proc (stru
+ 	 * way to make the system unusable accidentally :-) At least
+ 	 * one online CPU still has to be targeted.
+ 	 */
+-	if (!(new_value & cpu_online_map))
++	cpus_and(tmp, new_value, cpu_online_map);
++	if (cpus_empty(tmp))
+ 		return -EINVAL;
+ 
+ 	irq_affinity[irq] = new_value;
+-	irq_desc[irq].handler->set_affinity(irq, new_value);
++	irq_desc[irq].handler->set_affinity(irq,
++					cpumask_of_cpu(first_cpu(new_value)));
+ 
+ 	return full_count;
+ }
+@@ -980,8 +996,9 @@ static int prof_cpu_mask_read_proc (char
+ static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer,
+ 					unsigned long count, void *data)
+ {
+-	unsigned long *mask = (unsigned long *) data, full_count = count, err;
+-	unsigned long new_value;
++	cpumask_t *mask = (cpumask_t *)data;
++	unsigned long full_count = count, err;
++	cpumask_t new_value;
+ 
+ 	err = parse_hex_value(buffer, count, &new_value);
+ 	if (err)
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/i386/kernel/kgdb_stub.c	2003-07-19 17:04:14.000000000 -0700
+@@ -0,0 +1,2215 @@
++/*
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2, or (at your option) any
++ * later version.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
++ * General Public License for more details.
++ *
++ */
++
++/*
++ * Copyright (c) 2000 VERITAS Software Corporation.
++ * 
++ */
++/****************************************************************************
++ *  Header: remcom.c,v 1.34 91/03/09 12:29:49 glenne Exp $
++ *
++ *  Module name: remcom.c $
++ *  Revision: 1.34 $
++ *  Date: 91/03/09 12:29:49 $
++ *  Contributor:     Lake Stevens Instrument Division$
++ *
++ *  Description:     low level support for gdb debugger. $
++ *
++ *  Considerations:  only works on target hardware $
++ *
++ *  Written by:	     Glenn Engel $
++ *  Updated by:	     David Grothe <dave@gcom.com>
++ *  ModuleState:     Experimental $
++ *
++ *  NOTES:	     See Below $
++ *
++ *  Modified for 386 by Jim Kingdon, Cygnus Support.
++ *  Compatibility with 2.1.xx kernel by David Grothe <dave@gcom.com>
++ *
++ *  Changes to allow auto initilization.  All that is needed is that it
++ *  be linked with the kernel and a break point (int 3) be executed.
++ *  The header file <asm/kgdb.h> defines BREAKPOINT to allow one to do
++ *  this. It should also be possible, once the interrupt system is up, to
++ *  call putDebugChar("+").  Once this is done, the remote debugger should
++ *  get our attention by sending a ^C in a packet. George Anzinger 
++ *  <george@mvista.com>
++ *  Integrated into 2.2.5 kernel by Tigran Aivazian <tigran@sco.com>
++ *  Added thread support, support for multiple processors,
++ *	support for ia-32(x86) hardware debugging.
++ *	Amit S. Kale ( akale@veritas.com )
++ *
++ *
++ *  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 an int 3.
++ *
++ *************
++ *
++ *    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 KGDB_VERSION "<20030530.0126.22>"
++#include <linux/config.h>
++#include <linux/types.h>
++#include <asm/string.h>		/* for strcpy */
++#include <linux/kernel.h>
++#include <linux/sched.h>
++#include <asm/vm86.h>
++#include <asm/system.h>
++#include <asm/ptrace.h>		/* for linux pt_regs struct */
++#include <asm/kgdb_local.h>
++#include <linux/list.h>
++#include <asm/atomic.h>
++#include <asm/processor.h>
++#include <linux/irq.h>
++#include <asm/desc.h>
++
++/************************************************************************
++ *
++ * external low-level support routines
++ */
++typedef void (*Function) (void);	/* pointer to a function */
++
++/* Thread reference */
++typedef unsigned char threadref[8];
++
++extern void putDebugChar(int);	/* write a single character	 */
++extern int getDebugChar(void);	/* read and return a single char */
++
++/************************************************************************/
++/* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/
++/* at least NUMREGBYTES*2 are needed for register packets */
++/* Longer buffer is needed to list all threads */
++#define BUFMAX 1024
++
++char *kgdb_version = KGDB_VERSION;
++
++/*  debug >  0 prints ill-formed commands in valid packets & checksum errors */
++int debug_regs = 0;		/* set to non-zero to print registers */
++
++/* filled in by an external module */
++char *gdb_module_offsets;
++
++static const char hexchars[] = "0123456789abcdef";
++
++/* Number of bytes of registers.  */
++#define NUMREGBYTES 64
++/*
++ * Note that this register image is in a different order than
++ * the register image that Linux produces at interrupt time.
++ *
++ * Linux's register image is defined by struct pt_regs in ptrace.h.
++ * Just why GDB uses a different order is a historical mystery.
++ */
++enum regnames { _EAX,		/* 0 */
++	_ECX,			/* 1 */
++	_EDX,			/* 2 */
++	_EBX,			/* 3 */
++	_ESP,			/* 4 */
++	_EBP,			/* 5 */
++	_ESI,			/* 6 */
++	_EDI,			/* 7 */
++	_PC /* 8 also known as eip */ ,
++	_PS /* 9 also known as eflags */ ,
++	_CS,			/* 10 */
++	_SS,			/* 11 */
++	_DS,			/* 12 */
++	_ES,			/* 13 */
++	_FS,			/* 14 */
++	_GS			/* 15 */
++};
++
++/***************************  ASSEMBLY CODE MACROS *************************/
++/*
++ * Put the error code here just in case the user cares.	
++ * Likewise, the vector number here (since GDB only gets the signal
++ * number through the usual means, and that's not very specific). 
++ * The called_from is the return address so he can tell how we entered kgdb.
++ * This will allow him to seperate out the various possible entries. 
++ */
++#define REMOTE_DEBUG 0		/* set != to turn on printing (also available in info) */
++
++#define PID_MAX PID_MAX_DEFAULT
++
++#ifdef CONFIG_SMP
++void smp_send_nmi_allbutself(void);
++#define IF_SMP(x) x
++#undef MAX_NO_CPUS
++#ifndef CONFIG_NO_KGDB_CPUS
++#define CONFIG_NO_KGDB_CPUS 2
++#endif
++#if CONFIG_NO_KGDB_CPUS > NR_CPUS
++#define MAX_NO_CPUS NR_CPUS
++#else
++#define MAX_NO_CPUS CONFIG_NO_KGDB_CPUS
++#endif
++#define hold_init hold_on_sstep: 1,
++#define MAX_CPU_MASK (unsigned long)((1LL << MAX_NO_CPUS) - 1LL)
++#define NUM_CPUS num_online_cpus()
++#else
++#define IF_SMP(x)
++#define hold_init
++#undef MAX_NO_CPUS
++#define MAX_NO_CPUS 1
++#define NUM_CPUS 1
++#endif
++#define NOCPU (struct task_struct *)0xbad1fbad
++/* *INDENT-OFF*	 */
++struct kgdb_info {
++	int used_malloc;
++	void *called_from;
++	long long entry_tsc;
++	int errcode;
++	int vector;
++	int print_debug_info;
++#ifdef CONFIG_SMP
++	int hold_on_sstep;
++	struct {
++		volatile struct task_struct *task;
++		int pid;
++		int hold;
++		struct pt_regs *regs;
++	} cpus_waiting[MAX_NO_CPUS];
++#endif
++} kgdb_info = {hold_init print_debug_info:REMOTE_DEBUG, vector:-1};
++
++/* *INDENT-ON*	*/
++
++#define used_m kgdb_info.used_malloc
++/*
++ * This is little area we set aside to contain the stack we 
++ * need to build to allow gdb to call functions.  We use one
++ * per cpu to avoid locking issues.  We will do all this work
++ * with interrupts off so that should take care of the protection
++ * issues.
++ */
++#define LOOKASIDE_SIZE 200	/* should be more than enough */
++#define MALLOC_MAX   200	/* Max malloc size */
++struct {
++	unsigned int esp;
++	int array[LOOKASIDE_SIZE];
++} fn_call_lookaside[MAX_NO_CPUS];
++
++static int trap_cpu;
++static unsigned int OLD_esp;
++
++#define END_OF_LOOKASIDE  &fn_call_lookaside[trap_cpu].array[LOOKASIDE_SIZE]
++#define IF_BIT 0x200
++#define TF_BIT 0x100
++
++#define MALLOC_ROUND 8-1
++
++static char malloc_array[MALLOC_MAX];
++IF_SMP(static void to_gdb(const char *mess));
++void *
++malloc(int size)
++{
++
++	if (size <= (MALLOC_MAX - used_m)) {
++		int old_used = used_m;
++		used_m += ((size + MALLOC_ROUND) & (~MALLOC_ROUND));
++		return &malloc_array[old_used];
++	} else {
++		return NULL;
++	}
++}
++
++/*
++ * Gdb calls functions by pushing agruments, including a return address 
++ * on the stack and the adjusting EIP to point to the function.	 The 
++ * whole assumption in GDB is that we are on a different stack than the
++ * one the "user" i.e. code that hit the break point, is on.  This, of
++ * course is not true in the kernel.  Thus various dodges are needed to
++ * do the call without directly messing with EIP (which we can not change
++ * as it is just a location and not a register.	 To adjust it would then
++ * require that we move every thing below EIP up or down as needed.  This
++ * will not work as we may well have stack relative pointer on the stack
++ * (such as the pointer to regs, for example).
++
++ * So here is what we do:
++ * We detect gdb attempting to store into the stack area and instead, store
++ * into the fn_call_lookaside.array at the same relative location as if it 
++ * were the area ESP pointed at.  We also trap ESP modifications
++ * and uses these to adjust fn_call_lookaside.esp.  On entry 
++ * fn_call_lookaside.esp will be set to point at the last entry in
++ * fn_call_lookaside.array.  This allows us to check if it has changed, and 
++ * if so, on exit, we add the registers we will use to do the move and a
++ * trap/ interrupt return exit sequence.  We then adjust the eflags in the
++ * regs array (remember we now have a copy in the fn_call_lookaside.array) to
++ * kill the interrupt bit, AND we change EIP to point at our set up stub.
++ * As part of the register set up we preset the registers to point at the
++ * begining and end of the fn_call_lookaside.array, so all the stub needs to
++ * do is move words from the array to the stack until ESP= the desired value
++ * then do the rti.  This will then transfer to the desired function with 
++ * all the correct registers.  Nifty huh?
++ */
++extern asmlinkage void fn_call_stub(void);
++extern asmlinkage void fn_rtn_stub(void);
++/*					   *INDENT-OFF*	 */
++__asm__("fn_rtn_stub:\n\t"
++	"movl %eax,%esp\n\t"
++	"fn_call_stub:\n\t"
++	"1:\n\t"
++	"addl $-4,%ebx\n\t"
++	"movl (%ebx), %eax\n\t"
++	"pushl %eax\n\t"
++	"cmpl %esp,%ecx\n\t"
++	"jne  1b\n\t"
++	"popl %eax\n\t" 
++	"popl %ebx\n\t" 
++	"popl %ecx\n\t" 
++	"iret \n\t");
++/*					     *INDENT-ON*  */
++#define gdb_i386vector	kgdb_info.vector
++#define gdb_i386errcode kgdb_info.errcode
++#define waiting_cpus	kgdb_info.cpus_waiting
++#define remote_debug	kgdb_info.print_debug_info
++#define hold_cpu(cpu)	kgdb_info.cpus_waiting[cpu].hold
++/* gdb locks */
++
++#ifdef CONFIG_SMP
++static int in_kgdb_called;
++static spinlock_t waitlocks[MAX_NO_CPUS] =
++    {[0 ... MAX_NO_CPUS - 1] = SPIN_LOCK_UNLOCKED };
++/*
++ * The following array has the thread pointer of each of the "other"
++ * cpus.  We make it global so it can be seen by gdb.
++ */
++volatile int in_kgdb_entry_log[MAX_NO_CPUS];
++volatile struct pt_regs *in_kgdb_here_log[MAX_NO_CPUS];
++/*
++static spinlock_t continuelocks[MAX_NO_CPUS];
++*/
++spinlock_t kgdb_spinlock = SPIN_LOCK_UNLOCKED;
++/* waiters on our spinlock plus us */
++static atomic_t spinlock_waiters = ATOMIC_INIT(1);
++static int spinlock_count = 0;
++static int spinlock_cpu = 0;
++/*
++ * Note we use nested spin locks to account for the case where a break
++ * point is encountered when calling a function by user direction from
++ * kgdb. Also there is the memory exception recursion to account for.
++ * Well, yes, but this lets other cpus thru too.  Lets add a
++ * cpu id to the lock.
++ */
++#define KGDB_SPIN_LOCK(x) if( spinlock_count == 0 || \
++			      spinlock_cpu != smp_processor_id()){\
++				      atomic_inc(&spinlock_waiters); \
++				      while (! spin_trylock(x)) {\
++					    in_kgdb(&regs);\
++				      }\
++				      atomic_dec(&spinlock_waiters); \
++				      spinlock_count = 1; \
++				      spinlock_cpu = smp_processor_id(); \
++			  }else{  \
++				      spinlock_count++; \
++			  }
++#define KGDB_SPIN_UNLOCK(x) if( --spinlock_count == 0) spin_unlock(x)
++#else
++unsigned kgdb_spinlock = 0;
++#define KGDB_SPIN_LOCK(x) --*x
++#define KGDB_SPIN_UNLOCK(x) ++*x
++#endif
++
++int
++hex(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>	*/
++void
++getpacket(char *buffer)
++{
++	unsigned char checksum;
++	unsigned char xmitcsum;
++	int i;
++	int count;
++	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;
++		}
++		buffer[count] = 0;
++
++		if (ch == '#') {
++			xmitcsum = hex(getDebugChar() & 0x7f) << 4;
++			xmitcsum += hex(getDebugChar() & 0x7f);
++			if ((remote_debug) && (checksum != xmitcsum)) {
++				printk
++				    ("bad checksum.	My count = 0x%x, sent=0x%x. buf=%s\n",
++				     checksum, xmitcsum, buffer);
++			}
++
++			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);
++
++	if (remote_debug)
++		printk("R:%s\n", buffer);
++}
++
++/* send the packet in buffer.  */
++
++void
++putpacket(char *buffer)
++{
++	unsigned char checksum;
++	int count;
++	char ch;
++
++	/*  $<packet info>#<checksum>. */
++	do {
++		if (remote_debug)
++			printk("T:%s\n", buffer);
++		putDebugChar('$');
++		checksum = 0;
++		count = 0;
++
++		while ((ch = buffer[count])) {
++			putDebugChar(ch);
++			checksum += ch;
++			count += 1;
++		}
++
++		putDebugChar('#');
++		putDebugChar(hexchars[checksum >> 4]);
++		putDebugChar(hexchars[checksum % 16]);
++
++	} while ((getDebugChar() & 0x7f) != '+');
++
++}
++
++static char remcomInBuffer[BUFMAX];
++static char remcomOutBuffer[BUFMAX];
++static short error;
++
++void
++debug_error(char *format, char *parm)
++{
++	if (remote_debug)
++		printk(format, parm);
++}
++
++static void
++print_regs(struct pt_regs *regs)
++{
++	printk("EAX=%08lx ", regs->eax);
++	printk("EBX=%08lx ", regs->ebx);
++	printk("ECX=%08lx ", regs->ecx);
++	printk("EDX=%08lx ", regs->edx);
++	printk("\n");
++	printk("ESI=%08lx ", regs->esi);
++	printk("EDI=%08lx ", regs->edi);
++	printk("EBP=%08lx ", regs->ebp);
++	printk("ESP=%08lx ", (long) &regs->esp);
++	printk("\n");
++	printk(" DS=%08x ", regs->xds);
++	printk(" ES=%08x ", regs->xes);
++	printk(" SS=%08x ", __KERNEL_DS);
++	printk(" FL=%08lx ", regs->eflags);
++	printk("\n");
++	printk(" CS=%08x ", regs->xcs);
++	printk(" IP=%08lx ", regs->eip);
++#if 0
++	printk(" FS=%08x ", regs->fs);
++	printk(" GS=%08x ", regs->gs);
++#endif
++	printk("\n");
++
++}				/* print_regs */
++
++#define NEW_esp fn_call_lookaside[trap_cpu].esp
++
++static void
++regs_to_gdb_regs(int *gdb_regs, struct pt_regs *regs)
++{
++	gdb_regs[_EAX] = regs->eax;
++	gdb_regs[_EBX] = regs->ebx;
++	gdb_regs[_ECX] = regs->ecx;
++	gdb_regs[_EDX] = regs->edx;
++	gdb_regs[_ESI] = regs->esi;
++	gdb_regs[_EDI] = regs->edi;
++	gdb_regs[_EBP] = regs->ebp;
++	gdb_regs[_DS] = regs->xds;
++	gdb_regs[_ES] = regs->xes;
++	gdb_regs[_PS] = regs->eflags;
++	gdb_regs[_CS] = regs->xcs;
++	gdb_regs[_PC] = regs->eip;
++	/* Note, as we are a debugging the kernel, we will always 
++	 * trap in kernel code, this means no priviledge change,
++	 * and so the pt_regs structure is not completely valid.  In a non
++	 * privilege change trap, only EFLAGS, CS and EIP are put on the stack,
++	 * SS and ESP are not stacked, this means that the last 2 elements of
++	 * pt_regs is not valid (they would normally refer to the user stack)
++	 * also, using regs+1 is no good because you end up will a value that is 
++	 * 2 longs (8) too high.  This used to cause stepping over functions
++	 * to fail, so my fix is to use the address of regs->esp, which 
++	 * should point at the end of the stack frame.	Note I have ignored
++	 * completely exceptions that cause an error code to be stacked, such
++	 * as double fault.  Stuart Hughes, Zentropix.
++	 * original code: gdb_regs[_ESP] =  (int) (regs + 1) ; 
++
++	 * this is now done on entry and moved to OLD_esp (as well as NEW_esp).
++	 */
++	gdb_regs[_ESP] = NEW_esp;
++	gdb_regs[_SS] = __KERNEL_DS;
++	gdb_regs[_FS] = 0xFFFF;
++	gdb_regs[_GS] = 0xFFFF;
++}				/* regs_to_gdb_regs */
++
++static void
++gdb_regs_to_regs(int *gdb_regs, struct pt_regs *regs)
++{
++	regs->eax = gdb_regs[_EAX];
++	regs->ebx = gdb_regs[_EBX];
++	regs->ecx = gdb_regs[_ECX];
++	regs->edx = gdb_regs[_EDX];
++	regs->esi = gdb_regs[_ESI];
++	regs->edi = gdb_regs[_EDI];
++	regs->ebp = gdb_regs[_EBP];
++	regs->xds = gdb_regs[_DS];
++	regs->xes = gdb_regs[_ES];
++	regs->eflags = gdb_regs[_PS];
++	regs->xcs = gdb_regs[_CS];
++	regs->eip = gdb_regs[_PC];
++	NEW_esp = gdb_regs[_ESP];	/* keep the value */
++#if 0				/* can't change these */
++	regs->esp = gdb_regs[_ESP];
++	regs->xss = gdb_regs[_SS];
++	regs->fs = gdb_regs[_FS];
++	regs->gs = gdb_regs[_GS];
++#endif
++
++}				/* gdb_regs_to_regs */
++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)
++
++int thread_list = 0;
++
++void
++get_gdb_regs(struct task_struct *p, struct pt_regs *regs, int *gdb_regs)
++{
++	unsigned long stack_page;
++	int count = 0;
++	IF_SMP(int i);
++	if (!p || p == current) {
++		regs_to_gdb_regs(gdb_regs, regs);
++		return;
++	}
++#ifdef CONFIG_SMP
++	for (i = 0; i < MAX_NO_CPUS; i++) {
++		if (p == kgdb_info.cpus_waiting[i].task) {
++			regs_to_gdb_regs(gdb_regs,
++					 kgdb_info.cpus_waiting[i].regs);
++			gdb_regs[_ESP] =
++			    (int) &kgdb_info.cpus_waiting[i].regs->esp;
++
++			return;
++		}
++	}
++#endif
++	memset(gdb_regs, 0, NUMREGBYTES);
++	gdb_regs[_ESP] = p->thread.esp;
++	gdb_regs[_PC] = p->thread.eip;
++	gdb_regs[_EBP] = *(int *) gdb_regs[_ESP];
++	gdb_regs[_EDI] = *(int *) (gdb_regs[_ESP] + 4);
++	gdb_regs[_ESI] = *(int *) (gdb_regs[_ESP] + 8);
++
++/*
++ * This code is to give a more informative notion of where a process 
++ * is waiting.	It is used only when the user asks for a thread info
++ * list.  If he then switches to the thread, s/he will find the task
++ * is in schedule, but a back trace should show the same info we come
++ * up with.  This code was shamelessly purloined from process.c.  It was
++ * then enhanced to provide more registers than simply the program 
++ * counter.
++ */
++
++	if (!thread_list) {
++		return;
++	}
++
++	if (p->state == TASK_RUNNING)
++		return;
++	stack_page = (unsigned long) p->thread_info;
++	if (gdb_regs[_ESP] < stack_page || gdb_regs[_ESP] > 8188 + stack_page)
++		return;
++	/* include/asm-i386/system.h:switch_to() pushes ebp last. */
++	do {
++		if (gdb_regs[_EBP] < stack_page ||
++		    gdb_regs[_EBP] > 8184 + stack_page)
++			return;
++		gdb_regs[_PC] = *(unsigned long *) (gdb_regs[_EBP] + 4);
++		gdb_regs[_ESP] = gdb_regs[_EBP] + 8;
++		gdb_regs[_EBP] = *(unsigned long *) gdb_regs[_EBP];
++		if (gdb_regs[_PC] < first_sched || gdb_regs[_PC] >= last_sched)
++			return;
++	} while (count++ < 16);
++	return;
++}
++
++/* Indicate to caller of mem2hex or hex2mem that there has been an
++   error.  */
++static volatile int mem_err = 0;
++static volatile int mem_err_expected = 0;
++static volatile int mem_err_cnt = 0;
++static int garbage_loc = -1;
++
++int
++get_char(char *addr)
++{
++	return *addr;
++}
++
++void
++set_char(char *addr, int val, int may_fault)
++{
++	/*
++	 * This code traps references to the area mapped to the kernel
++	 * stack as given by the regs and, instead, stores to the
++	 * fn_call_lookaside[cpu].array
++	 */
++	if (may_fault &&
++	    (unsigned int) addr < OLD_esp &&
++	    ((unsigned int) addr > (OLD_esp - (unsigned int) LOOKASIDE_SIZE))) {
++		addr = (char *) END_OF_LOOKASIDE - ((char *) OLD_esp - addr);
++	}
++	*addr = val;
++}
++
++/* convert the memory pointed to by mem into hex, placing result in buf */
++/* return a pointer to the last char put in buf (null) */
++/* If MAY_FAULT is non-zero, then we should set mem_err in response to
++   a fault; if zero treat a fault like any other fault in the stub.  */
++char *
++mem2hex(char *mem, char *buf, int count, int may_fault)
++{
++	int i;
++	unsigned char ch;
++
++	if (may_fault) {
++		mem_err_expected = 1;
++		mem_err = 0;
++	}
++	for (i = 0; i < count; i++) {
++		/* printk("%lx = ", mem) ; */
++
++		ch = get_char(mem++);
++
++		/* printk("%02x\n", ch & 0xFF) ; */
++		if (may_fault && mem_err) {
++			if (remote_debug)
++				printk("Mem fault fetching from addr %lx\n",
++				       (long) (mem - 1));
++			*buf = 0;	/* truncate buffer */
++			return (buf);
++		}
++		*buf++ = hexchars[ch >> 4];
++		*buf++ = hexchars[ch % 16];
++	}
++	*buf = 0;
++	if (may_fault)
++		mem_err_expected = 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 */
++/* NOTE: We use the may fault flag to also indicate if the write is to
++ * the registers (0) or "other" memory (!=0) 
++ */
++char *
++hex2mem(char *buf, char *mem, int count, int may_fault)
++{
++	int i;
++	unsigned char ch;
++
++	if (may_fault) {
++		mem_err_expected = 1;
++		mem_err = 0;
++	}
++	for (i = 0; i < count; i++) {
++		ch = hex(*buf++) << 4;
++		ch = ch + hex(*buf++);
++		set_char(mem++, ch, may_fault);
++
++		if (may_fault && mem_err) {
++			if (remote_debug)
++				printk("Mem fault storing to addr %lx\n",
++				       (long) (mem - 1));
++			return (mem);
++		}
++	}
++	if (may_fault)
++		mem_err_expected = 0;
++	return (mem);
++}
++
++/**********************************************/
++/* WHILE WE FIND NICE HEX CHARS, BUILD AN INT */
++/* RETURN NUMBER OF CHARS PROCESSED	      */
++/**********************************************/
++int
++hexToInt(char **ptr, int *intValue)
++{
++	int numChars = 0;
++	int hexValue;
++
++	*intValue = 0;
++
++	while (**ptr) {
++		hexValue = hex(**ptr);
++		if (hexValue >= 0) {
++			*intValue = (*intValue << 4) | hexValue;
++			numChars++;
++		} else
++			break;
++
++		(*ptr)++;
++	}
++
++	return (numChars);
++}
++
++#define stubhex(h) hex(h)
++
++static int
++stub_unpack_int(char *buff, int fieldlength)
++{
++	int nibble;
++	int retval = 0;
++
++	while (fieldlength) {
++		nibble = stubhex(*buff++);
++		retval |= nibble;
++		fieldlength--;
++		if (fieldlength)
++			retval = retval << 4;
++	}
++	return retval;
++}
++
++static char *
++pack_hex_byte(char *pkt, int byte)
++{
++	*pkt++ = hexchars[(byte >> 4) & 0xf];
++	*pkt++ = hexchars[(byte & 0xf)];
++	return pkt;
++}
++
++#define BUF_THREAD_ID_SIZE 16
++
++static char *
++pack_threadid(char *pkt, threadref * id)
++{
++	char *limit;
++	unsigned char *altid;
++
++	altid = (unsigned char *) id;
++	limit = pkt + BUF_THREAD_ID_SIZE;
++	while (pkt < limit)
++		pkt = pack_hex_byte(pkt, *altid++);
++	return pkt;
++}
++
++static char *
++unpack_byte(char *buf, int *value)
++{
++	*value = stub_unpack_int(buf, 2);
++	return buf + 2;
++}
++
++static char *
++unpack_threadid(char *inbuf, threadref * id)
++{
++	char *altref;
++	char *limit = inbuf + BUF_THREAD_ID_SIZE;
++	int x, y;
++
++	altref = (char *) id;
++
++	while (inbuf < limit) {
++		x = stubhex(*inbuf++);
++		y = stubhex(*inbuf++);
++		*altref++ = (x << 4) | y;
++	}
++	return inbuf;
++}
++
++void
++int_to_threadref(threadref * id, int value)
++{
++	unsigned char *scan;
++
++	scan = (unsigned char *) id;
++	{
++		int i = 4;
++		while (i--)
++			*scan++ = 0;
++	}
++	*scan++ = (value >> 24) & 0xff;
++	*scan++ = (value >> 16) & 0xff;
++	*scan++ = (value >> 8) & 0xff;
++	*scan++ = (value & 0xff);
++}
++
++static int
++threadref_to_int(threadref * ref)
++{
++	int i, value = 0;
++	unsigned char *scan;
++
++	scan = (char *) ref;
++	scan += 4;
++	i = 4;
++	while (i-- > 0)
++		value = (value << 8) | ((*scan++) & 0xff);
++	return value;
++}
++
++#if 1				/* this is a hold over from 2.4 where O(1) was "sometimes" */
++extern struct task_struct *kgdb_get_idle(int cpu);
++#define idle_task(cpu) kgdb_get_idle(cpu)
++#else
++#define idle_task(cpu) init_tasks[cpu]
++#endif
++
++struct task_struct *
++getthread(int pid)
++{
++	struct task_struct *thread;
++	if (pid >= PID_MAX && pid <= (PID_MAX + MAX_NO_CPUS)) {
++
++		return idle_task(pid - PID_MAX);
++	} else {
++		/*
++		 * find_task_by_pid is relatively safe all the time
++		 * Other pid functions require lock downs which imply
++		 * that we may be interrupting them (as we get here
++		 * in the middle of most any lock down)
++		 */
++		thread = find_task_by_pid(pid);
++		if (thread) {
++			return thread;
++		}
++	}
++	return NULL;
++}
++/* *INDENT-OFF*	 */
++struct hw_breakpoint {
++	unsigned enabled;
++	unsigned type;
++	unsigned len;
++	unsigned addr;
++} breakinfo[4] = { {enabled:0}, 
++		   {enabled:0}, 
++		   {enabled:0}, 
++		   {enabled:0}};
++/* *INDENT-ON*	*/
++unsigned hw_breakpoint_status;
++void
++correct_hw_break(void)
++{
++	int breakno;
++	int correctit;
++	int breakbit;
++	unsigned dr7;
++
++	asm volatile ("movl %%db7, %0\n":"=r" (dr7)
++		      :);
++	/* *INDENT-OFF*	 */
++	do {
++		unsigned addr0, addr1, addr2, addr3;
++		asm volatile ("movl %%db0, %0\n"
++			      "movl %%db1, %1\n"
++			      "movl %%db2, %2\n"
++			      "movl %%db3, %3\n"
++			      :"=r" (addr0), "=r"(addr1),
++			      "=r"(addr2), "=r"(addr3)
++			      :);
++	} while (0);
++	/* *INDENT-ON*	*/
++	correctit = 0;
++	for (breakno = 0; breakno < 3; breakno++) {
++		breakbit = 2 << (breakno << 1);
++		if (!(dr7 & breakbit) && breakinfo[breakno].enabled) {
++			correctit = 1;
++			dr7 |= breakbit;
++			dr7 &= ~(0xf0000 << (breakno << 2));
++			dr7 |= (((breakinfo[breakno].len << 2) |
++				 breakinfo[breakno].type) << 16) <<
++			    (breakno << 2);
++			switch (breakno) {
++			case 0:
++				asm volatile ("movl %0, %%dr0\n"::"r"
++					      (breakinfo[breakno].addr));
++				break;
++
++			case 1:
++				asm volatile ("movl %0, %%dr1\n"::"r"
++					      (breakinfo[breakno].addr));
++				break;
++
++			case 2:
++				asm volatile ("movl %0, %%dr2\n"::"r"
++					      (breakinfo[breakno].addr));
++				break;
++
++			case 3:
++				asm volatile ("movl %0, %%dr3\n"::"r"
++					      (breakinfo[breakno].addr));
++				break;
++			}
++		} else if ((dr7 & breakbit) && !breakinfo[breakno].enabled) {
++			correctit = 1;
++			dr7 &= ~breakbit;
++			dr7 &= ~(0xf0000 << (breakno << 2));
++		}
++	}
++	if (correctit) {
++		asm volatile ("movl %0, %%db7\n"::"r" (dr7));
++	}
++}
++
++int
++remove_hw_break(unsigned breakno)
++{
++	if (!breakinfo[breakno].enabled) {
++		return -1;
++	}
++	breakinfo[breakno].enabled = 0;
++	return 0;
++}
++
++int
++set_hw_break(unsigned breakno, unsigned type, unsigned len, unsigned addr)
++{
++	if (breakinfo[breakno].enabled) {
++		return -1;
++	}
++	breakinfo[breakno].enabled = 1;
++	breakinfo[breakno].type = type;
++	breakinfo[breakno].len = len;
++	breakinfo[breakno].addr = addr;
++	return 0;
++}
++
++#ifdef CONFIG_SMP
++static int in_kgdb_console = 0;
++
++int
++in_kgdb(struct pt_regs *regs)
++{
++	unsigned flags;
++	int cpu = smp_processor_id();
++	in_kgdb_called = 1;
++	if (!spin_is_locked(&kgdb_spinlock)) {
++		if (in_kgdb_here_log[cpu] ||	/* we are holding this cpu */
++		    in_kgdb_console) {	/* or we are doing slow i/o */
++			return 1;
++		}
++		return 0;
++	}
++
++	/* As I see it the only reason not to let all cpus spin on
++	 * the same spin_lock is to allow selected ones to proceed.
++	 * This would be a good thing, so we leave it this way.
++	 * Maybe someday....  Done !
++
++	 * in_kgdb() is called from an NMI so we don't pretend
++	 * to have any resources, like printk() for example.  
++	 */
++
++	kgdb_local_irq_save(flags);	/* only local here, to avoid hanging */
++	/*
++	 * log arival of this cpu
++	 * The NMI keeps on ticking.  Protect against recurring more
++	 * than once, and ignor the cpu that has the kgdb lock
++	 */
++	in_kgdb_entry_log[cpu]++;
++	in_kgdb_here_log[cpu] = regs;
++	if (cpu == spinlock_cpu || waiting_cpus[cpu].task) {
++		goto exit_in_kgdb;
++	}
++	/*
++	 * For protection of the initilization of the spin locks by kgdb
++	 * it locks the kgdb spinlock before it gets the wait locks set
++	 * up.	We wait here for the wait lock to be taken.  If the
++	 * kgdb lock goes away first??	Well, it could be a slow exit
++	 * sequence where the wait lock is removed prior to the kgdb lock
++	 * so if kgdb gets unlocked, we just exit.
++	 */
++	while (spin_is_locked(&kgdb_spinlock) &&
++	       !spin_is_locked(waitlocks + cpu)) ;
++	if (!spin_is_locked(&kgdb_spinlock)) {
++		goto exit_in_kgdb;
++	}
++	waiting_cpus[cpu].task = current;
++	waiting_cpus[cpu].pid = (current->pid) ? : (PID_MAX + cpu);
++	waiting_cpus[cpu].regs = regs;
++
++	spin_unlock_wait(waitlocks + cpu);
++	/*
++	 * log departure of this cpu
++	 */
++	waiting_cpus[cpu].task = 0;
++	waiting_cpus[cpu].pid = 0;
++	waiting_cpus[cpu].regs = 0;
++	correct_hw_break();
++      exit_in_kgdb:
++	in_kgdb_here_log[cpu] = 0;
++	kgdb_local_irq_restore(flags);
++	return 1;
++	/*
++	   spin_unlock(continuelocks + smp_processor_id());
++	 */
++}
++
++void
++smp__in_kgdb(struct pt_regs regs)
++{
++	ack_APIC_irq();
++	in_kgdb(&regs);
++}
++#else
++int
++in_kgdb(struct pt_regs *regs)
++{
++	return (kgdb_spinlock);
++}
++#endif
++
++void
++printexceptioninfo(int exceptionNo, int errorcode, char *buffer)
++{
++	unsigned dr6;
++	int i;
++	switch (exceptionNo) {
++	case 1:		/* debug exception */
++		break;
++	case 3:		/* breakpoint */
++		sprintf(buffer, "Software breakpoint");
++		return;
++	default:
++		sprintf(buffer, "Details not available");
++		return;
++	}
++	asm volatile ("movl %%db6, %0\n":"=r" (dr6)
++		      :);
++	if (dr6 & 0x4000) {
++		sprintf(buffer, "Single step");
++		return;
++	}
++	for (i = 0; i < 4; ++i) {
++		if (dr6 & (1 << i)) {
++			sprintf(buffer, "Hardware breakpoint %d", i);
++			return;
++		}
++	}
++	sprintf(buffer, "Unknown trap");
++	return;
++}
++
++/*
++ * This function does all command procesing for interfacing to gdb.
++ *
++ * NOTE:  The INT nn instruction leaves the state of the interrupt
++ *	  enable flag UNCHANGED.  That means that when this routine
++ *	  is entered via a breakpoint (INT 3) instruction from code
++ *	  that has interrupts enabled, then interrupts will STILL BE
++ *	  enabled when this routine is entered.	 The first thing that
++ *	  we do here is disable interrupts so as to prevent recursive
++ *	  entries and bothersome serial interrupts while we are
++ *	  trying to run the serial port in polled mode.
++ *
++ * For kernel version 2.1.xx the kgdb_cli() actually gets a spin lock so
++ * it is always necessary to do a restore_flags before returning
++ * so as to let go of that lock.
++ */
++int
++kgdb_handle_exception(int exceptionVector,
++		      int signo, int err_code, struct pt_regs *linux_regs)
++{
++	struct task_struct *usethread = NULL;
++	struct task_struct *thread_list_start = 0, *thread = NULL;
++	int addr, length;
++	int breakno, breaktype;
++	char *ptr;
++	int newPC;
++	threadref thref;
++	int threadid;
++	int thread_min = PID_MAX + MAX_NO_CPUS;
++	int maxthreads;
++	int nothreads;
++	unsigned long flags;
++	int gdb_regs[NUMREGBYTES / 4];
++	int dr6;
++	IF_SMP(int entry_state = 0);	/* 0, ok, 1, no nmi, 2 sync failed */
++#define NO_NMI 1
++#define NO_SYNC 2
++#define	regs	(*linux_regs)
++#define NUMREGS NUMREGBYTES/4
++	/*
++	 * If the entry is not from the kernel then return to the Linux
++	 * trap handler and let it process the interrupt normally.
++	 */
++	if ((linux_regs->eflags & VM_MASK) || (3 & linux_regs->xcs)) {
++		printk("ignoring non-kernel exception\n");
++		print_regs(&regs);
++		return (0);
++	}
++
++	kgdb_local_irq_save(flags);
++
++	/* Get kgdb spinlock */
++
++	KGDB_SPIN_LOCK(&kgdb_spinlock);
++	rdtscll(kgdb_info.entry_tsc);
++	/*
++	 * We depend on this spinlock and the NMI watch dog to control the 
++	 * other cpus.	They will arrive at "in_kgdb()" as a result of the
++	 * NMI and will wait there for the following spin locks to be 
++	 * released.
++	 */
++#ifdef CONFIG_SMP
++
++#if 0
++	if (cpu_callout_map & ~MAX_CPU_MASK) {
++		printk("kgdb : too many cpus, possibly not mapped"
++		       " in contiguous space, change MAX_NO_CPUS"
++		       " in kgdb_stub and make new kernel.\n"
++		       " cpu_callout_map is %lx\n", cpu_callout_map);
++		goto exit_just_unlock;
++	}
++#endif
++	if (spinlock_count == 1) {
++		int time, end_time, dum;
++		int i;
++		int cpu_logged_in[MAX_NO_CPUS] = {[0 ... MAX_NO_CPUS - 1] = (0)
++		};
++		if (remote_debug) {
++			printk("kgdb : cpu %d entry, syncing others\n",
++			       smp_processor_id());
++		}
++		for (i = 0; i < MAX_NO_CPUS; i++) {
++			/*
++			 * Use trylock as we may already hold the lock if
++			 * we are holding the cpu.  Net result is all
++			 * locked.
++			 */
++			spin_trylock(&waitlocks[i]);
++		}
++		for (i = 0; i < MAX_NO_CPUS; i++)
++			cpu_logged_in[i] = 0;
++		/*
++		 * Wait for their arrival.  We know the watch dog is active if 
++		 * in_kgdb() has ever been called, as it is always called on a 
++		 * watchdog tick.
++		 */
++		rdtsc(dum, time);
++		end_time = time + 2;	/* Note: we use the High order bits! */
++		i = 1;
++		if (num_online_cpus() > 1) {
++			int me_in_kgdb = in_kgdb_entry_log[smp_processor_id()];
++			smp_send_nmi_allbutself();
++			while (i < num_online_cpus() && time != end_time) {
++				int j;
++				for (j = 0; j < MAX_NO_CPUS; j++) {
++					if (waiting_cpus[j].task &&
++					    !cpu_logged_in[j]) {
++						i++;
++						cpu_logged_in[j] = 1;
++						if (remote_debug) {
++							printk
++							    ("kgdb : cpu %d arrived at kgdb\n",
++							     j);
++						}
++						break;
++					} else if (!waiting_cpus[j].task &&
++						   !cpu_online(j)) {
++						waiting_cpus[j].task = NOCPU;
++						cpu_logged_in[j] = 1;
++						waiting_cpus[j].hold = 1;
++						break;
++					}
++					if (!waiting_cpus[j].task &&
++					    in_kgdb_here_log[j]) {
++
++						int wait = 100000;
++						while (wait--) ;
++						if (!waiting_cpus[j].task &&
++						    in_kgdb_here_log[j]) {
++							printk
++							    ("kgdb : cpu %d stall"
++							     " in in_kgdb\n",
++							     j);
++							i++;
++							cpu_logged_in[j] = 1;
++							waiting_cpus[j].task =
++							    (struct task_struct
++							     *) 1;
++						}
++					}
++				}
++
++				if (in_kgdb_entry_log[smp_processor_id()] >
++				    (me_in_kgdb + 10)) {
++					break;
++				}
++
++				rdtsc(dum, time);
++			}
++			if (i < num_online_cpus()) {
++				printk
++				    ("kgdb : time out, proceeding without sync\n");
++#if 0
++				printk("kgdb : Waiting_cpus: 0 = %d, 1 = %d\n",
++				       waiting_cpus[0].task != 0,
++				       waiting_cpus[1].task != 0);
++				printk("kgdb : Cpu_logged in: 0 = %d, 1 = %d\n",
++				       cpu_logged_in[0], cpu_logged_in[1]);
++				printk
++				    ("kgdb : in_kgdb_here_log in: 0 = %d, 1 = %d\n",
++				     in_kgdb_here_log[0] != 0,
++				     in_kgdb_here_log[1] != 0);
++#endif
++				entry_state = NO_SYNC;
++			} else {
++#if 0
++				int ent =
++				    in_kgdb_entry_log[smp_processor_id()] -
++				    me_in_kgdb;
++				printk("kgdb : sync after %d entries\n", ent);
++#endif
++			}
++		} else {
++			if (remote_debug) {
++				printk
++				    ("kgdb : %d cpus, but watchdog not active\n"
++				     "proceeding without locking down other cpus\n",
++				     num_online_cpus());
++				entry_state = NO_NMI;
++			}
++		}
++	}
++#endif
++
++	if (remote_debug) {
++		unsigned long *lp = (unsigned long *) &linux_regs;
++
++		printk("handle_exception(exceptionVector=%d, "
++		       "signo=%d, err_code=%d, linux_regs=%p)\n",
++		       exceptionVector, signo, err_code, linux_regs);
++		if (debug_regs) {
++			print_regs(&regs);
++			printk("Stk: %8lx %8lx %8lx %8lx"
++			       "  %8lx %8lx %8lx %8lx\n",
++			       lp[0], lp[1], lp[2], lp[3],
++			       lp[4], lp[5], lp[6], lp[7]);
++			printk("     %8lx %8lx %8lx %8lx"
++			       "  %8lx %8lx %8lx %8lx\n",
++			       lp[8], lp[9], lp[10], lp[11],
++			       lp[12], lp[13], lp[14], lp[15]);
++			printk("     %8lx %8lx %8lx %8lx  "
++			       "%8lx %8lx %8lx %8lx\n",
++			       lp[16], lp[17], lp[18], lp[19],
++			       lp[20], lp[21], lp[22], lp[23]);
++			printk("     %8lx %8lx %8lx %8lx  "
++			       "%8lx %8lx %8lx %8lx\n",
++			       lp[24], lp[25], lp[26], lp[27],
++			       lp[28], lp[29], lp[30], lp[31]);
++		}
++	}
++
++	/* Disable hardware debugging while we are in kgdb */
++	/* Get the debug register status register */
++/*				       *INDENT-OFF*  */
++      __asm__("movl %0,%%db7"
++	      :	/* no output */
++	      :"r"(0));
++
++	asm volatile ("movl %%db6, %0\n"
++		      :"=r" (hw_breakpoint_status)
++		      :);
++
++/*				       *INDENT-ON*  */
++	switch (exceptionVector) {
++	case 0:		/* divide error */
++	case 1:		/* debug exception */
++	case 2:		/* NMI */
++	case 3:		/* breakpoint */
++	case 4:		/* overflow */
++	case 5:		/* bounds check */
++	case 6:		/* invalid opcode */
++	case 7:		/* device not available */
++	case 8:		/* double fault (errcode) */
++	case 10:		/* invalid TSS (errcode) */
++	case 12:		/* stack fault (errcode) */
++	case 16:		/* floating point error */
++	case 17:		/* alignment check (errcode) */
++	default:		/* any undocumented */
++		break;
++	case 11:		/* segment not present (errcode) */
++	case 13:		/* general protection (errcode) */
++	case 14:		/* page fault (special errcode) */
++	case 19:		/* cache flush denied */
++		if (mem_err_expected) {
++			/*
++			 * This fault occured because of the
++			 * get_char or set_char routines.  These
++			 * two routines use either eax of edx to
++			 * indirectly reference the location in
++			 * memory that they are working with.
++			 * For a page fault, when we return the
++			 * instruction will be retried, so we
++			 * have to make sure that these
++			 * registers point to valid memory. 
++			 */
++			mem_err = 1;	/* set mem error flag */
++			mem_err_expected = 0;
++			mem_err_cnt++;	/* helps in debugging */
++			/* make valid address */
++			regs.eax = (long) &garbage_loc;
++			/* make valid address */
++			regs.edx = (long) &garbage_loc;
++			if (remote_debug)
++				printk("Return after memory error: "
++				       "mem_err_cnt=%d\n", mem_err_cnt);
++			if (debug_regs)
++				print_regs(&regs);
++			goto exit_kgdb;
++		}
++		break;
++	}
++	if (remote_debug)
++		printk("kgdb : entered kgdb on cpu %d\n", smp_processor_id());
++
++	gdb_i386vector = exceptionVector;
++	gdb_i386errcode = err_code;
++	kgdb_info.called_from = __builtin_return_address(0);
++#ifdef CONFIG_SMP
++	/*
++	 * OK, we can now communicate, lets tell gdb about the sync.
++	 * but only if we had a problem.
++	 */
++	switch (entry_state) {
++	case NO_NMI:
++		to_gdb("NMI not active, other cpus not stopped\n");
++		break;
++	case NO_SYNC:
++		to_gdb("Some cpus not stopped, see 'kgdb_info' for details\n");
++	default:;
++	}
++
++#endif
++/*
++ * Set up the gdb function call area.
++ */
++	trap_cpu = smp_processor_id();
++	OLD_esp = NEW_esp = (int) (&linux_regs->esp);
++
++      IF_SMP(once_again:)
++	    /* reply to host that an exception has occurred */
++	    remcomOutBuffer[0] = 'S';
++	remcomOutBuffer[1] = hexchars[signo >> 4];
++	remcomOutBuffer[2] = hexchars[signo % 16];
++	remcomOutBuffer[3] = 0;
++
++	putpacket(remcomOutBuffer);
++
++	while (1 == 1) {
++		error = 0;
++		remcomOutBuffer[0] = 0;
++		getpacket(remcomInBuffer);
++		switch (remcomInBuffer[0]) {
++		case '?':
++			remcomOutBuffer[0] = 'S';
++			remcomOutBuffer[1] = hexchars[signo >> 4];
++			remcomOutBuffer[2] = hexchars[signo % 16];
++			remcomOutBuffer[3] = 0;
++			break;
++		case 'd':
++			remote_debug = !(remote_debug);	/* toggle debug flag */
++			printk("Remote debug %s\n",
++			       remote_debug ? "on" : "off");
++			break;
++		case 'g':	/* return the value of the CPU registers */
++			get_gdb_regs(usethread, &regs, gdb_regs);
++			mem2hex((char *) gdb_regs,
++				remcomOutBuffer, NUMREGBYTES, 0);
++			break;
++		case 'G':	/* set the value of the CPU registers - return OK */
++			hex2mem(&remcomInBuffer[1],
++				(char *) gdb_regs, NUMREGBYTES, 0);
++			if (!usethread || usethread == current) {
++				gdb_regs_to_regs(gdb_regs, &regs);
++				strcpy(remcomOutBuffer, "OK");
++			} else {
++				strcpy(remcomOutBuffer, "E00");
++			}
++			break;
++
++		case 'P':{	/* set the value of a single CPU register - 
++				   return OK */
++				/*
++				 * For some reason, gdb wants to talk about psudo
++				 * registers (greater than 15).	 These may have
++				 * meaning for ptrace, but for us it is safe to
++				 * ignor them.	We do this by dumping them into
++				 * _GS which we also ignor, but do have memory for.
++				 */
++				int regno;
++
++				ptr = &remcomInBuffer[1];
++				regs_to_gdb_regs(gdb_regs, &regs);
++				if ((!usethread || usethread == current) &&
++				    hexToInt(&ptr, &regno) &&
++				    *ptr++ == '=' && (regno >= 0)) {
++					regno =
++					    (regno >= NUMREGS ? _GS : regno);
++					hex2mem(ptr, (char *) &gdb_regs[regno],
++						4, 0);
++					gdb_regs_to_regs(gdb_regs, &regs);
++					strcpy(remcomOutBuffer, "OK");
++					break;
++				}
++				strcpy(remcomOutBuffer, "E01");
++				break;
++			}
++
++			/* mAA..AA,LLLL	 Read LLLL bytes at address AA..AA */
++		case 'm':
++			/* TRY TO READ %x,%x.  IF SUCCEED, SET PTR = 0 */
++			ptr = &remcomInBuffer[1];
++			if (hexToInt(&ptr, &addr) &&
++			    (*(ptr++) == ',') && (hexToInt(&ptr, &length))) {
++				ptr = 0;
++				/*
++				 * hex doubles the byte count
++				 */
++				if (length > (BUFMAX / 2))
++					length = BUFMAX / 2;
++				mem2hex((char *) addr,
++					remcomOutBuffer, length, 1);
++				if (mem_err) {
++					strcpy(remcomOutBuffer, "E03");
++					debug_error("memory fault\n", NULL);
++				}
++			}
++
++			if (ptr) {
++				strcpy(remcomOutBuffer, "E01");
++				debug_error
++				    ("malformed read memory command: %s\n",
++				     remcomInBuffer);
++			}
++			break;
++
++			/* MAA..AA,LLLL: 
++			   Write LLLL bytes at address AA.AA return OK */
++		case 'M':
++			/* TRY TO READ '%x,%x:'.  IF SUCCEED, SET PTR = 0 */
++			ptr = &remcomInBuffer[1];
++			if (hexToInt(&ptr, &addr) &&
++			    (*(ptr++) == ',') &&
++			    (hexToInt(&ptr, &length)) && (*(ptr++) == ':')) {
++				hex2mem(ptr, (char *) addr, length, 1);
++
++				if (mem_err) {
++					strcpy(remcomOutBuffer, "E03");
++					debug_error("memory fault\n", NULL);
++				} else {
++					strcpy(remcomOutBuffer, "OK");
++				}
++
++				ptr = 0;
++			}
++			if (ptr) {
++				strcpy(remcomOutBuffer, "E02");
++				debug_error
++				    ("malformed write memory command: %s\n",
++				     remcomInBuffer);
++			}
++			break;
++
++			/* cAA..AA  Continue at address AA..AA(optional) */
++			/* sAA..AA  Step one instruction from AA..AA(optional) */
++			/* D	    detach, reply OK and then continue */
++		case 'c':
++		case 's':
++		case 'D':
++
++			/* try to read optional parameter, 
++			   pc unchanged if no parm */
++			ptr = &remcomInBuffer[1];
++			if (hexToInt(&ptr, &addr)) {
++				if (remote_debug)
++					printk("Changing EIP to 0x%x\n", addr);
++
++				regs.eip = addr;
++			}
++
++			newPC = regs.eip;
++
++			/* clear the trace bit */
++			regs.eflags &= 0xfffffeff;
++
++			/* set the trace bit if we're stepping */
++			if (remcomInBuffer[0] == 's')
++				regs.eflags |= 0x100;
++
++			/* detach is a friendly version of continue. Note that
++			   debugging is still enabled (e.g hit control C)
++			   until the process that issued an ioctl TIOCGDB
++			   terminates
++			 */
++			if (remcomInBuffer[0] == 'D') {
++				strcpy(remcomOutBuffer, "OK");
++				putpacket(remcomOutBuffer);
++			}
++
++			if (remote_debug) {
++				printk("Resuming execution\n");
++				print_regs(&regs);
++			}
++			asm volatile ("movl %%db6, %0\n":"=r" (dr6)
++				      :);
++			if (!(dr6 & 0x4000)) {
++				for (breakno = 0; breakno < 4; ++breakno) {
++					if (dr6 & (1 << breakno) &&
++					    (breakinfo[breakno].type == 0)) {
++						/* Set restore flag */
++						regs.eflags |= 0x10000;
++						break;
++					}
++				}
++			}
++			correct_hw_break();
++			asm volatile ("movl %0, %%db6\n"::"r" (0));
++			goto exit_kgdb;
++
++			/* kill the program */
++		case 'k':	/* do nothing */
++			break;
++
++			/* query */
++		case 'q':
++			switch (remcomInBuffer[1]) {
++			case 'L':
++				/* List threads */
++				thread_list = 2;
++				thread_list_start = (usethread ? : current);
++				unpack_byte(remcomInBuffer + 3, &maxthreads);
++				unpack_threadid(remcomInBuffer + 5, &thref);
++				do {
++					int buf_thread_limit =
++					    (BUFMAX - 22) / BUF_THREAD_ID_SIZE;
++					if (maxthreads > buf_thread_limit) {
++						maxthreads = buf_thread_limit;
++					}
++				} while (0);
++				remcomOutBuffer[0] = 'q';
++				remcomOutBuffer[1] = 'M';
++				remcomOutBuffer[4] = '0';
++				pack_threadid(remcomOutBuffer + 5, &thref);
++
++				threadid = threadref_to_int(&thref);
++				for (nothreads = 0;
++				     nothreads < maxthreads &&
++				     threadid < PID_MAX + MAX_NO_CPUS;
++				     threadid++) {
++					thread = getthread(threadid);
++					if (thread) {
++						int_to_threadref(&thref,
++								 threadid);
++						pack_threadid(remcomOutBuffer +
++							      21 +
++							      nothreads * 16,
++							      &thref);
++						nothreads++;
++						if (thread_min > threadid)
++							thread_min = threadid;
++					}
++				}
++
++				if (threadid == PID_MAX + MAX_NO_CPUS) {
++					remcomOutBuffer[4] = '1';
++				}
++				pack_hex_byte(remcomOutBuffer + 2, nothreads);
++				remcomOutBuffer[21 + nothreads * 16] = '\0';
++				break;
++
++			case 'C':
++				/* Current thread id */
++				remcomOutBuffer[0] = 'Q';
++				remcomOutBuffer[1] = 'C';
++				threadid = current->pid;
++				if (!threadid) {
++					/*
++					 * idle thread
++					 */
++					for (threadid = PID_MAX;
++					     threadid < PID_MAX + MAX_NO_CPUS;
++					     threadid++) {
++						if (current ==
++						    idle_task(threadid -
++							      PID_MAX))
++							break;
++					}
++				}
++				int_to_threadref(&thref, threadid);
++				pack_threadid(remcomOutBuffer + 2, &thref);
++				remcomOutBuffer[18] = '\0';
++				break;
++
++			case 'E':
++				/* Print exception info */
++				printexceptioninfo(exceptionVector,
++						   err_code, remcomOutBuffer);
++				break;
++			}
++			break;
++
++			/* task related */
++		case 'H':
++			switch (remcomInBuffer[1]) {
++			case 'g':
++				ptr = &remcomInBuffer[2];
++				hexToInt(&ptr, &threadid);
++				thread = getthread(threadid);
++				if (!thread) {
++					remcomOutBuffer[0] = 'E';
++					remcomOutBuffer[1] = '\0';
++					break;
++				}
++				/*
++				 * Just in case I forget what this is all about,
++				 * the "thread info" command to gdb causes it
++				 * to ask for a thread list.  It then switches
++				 * to each thread and asks for the registers.
++				 * For this (and only this) usage, we want to
++				 * fudge the registers of tasks not on the run
++				 * list (i.e. waiting) to show the routine that
++				 * called schedule. Also, gdb, is a minimalist
++				 * in that if the current thread is the last
++				 * it will not re-read the info when done.
++				 * This means that in this case we must show
++				 * the real registers. So here is how we do it:
++				 * Each entry we keep track of the min
++				 * thread in the list (the last that gdb will)
++				 * get info for.  We also keep track of the
++				 * starting thread.
++				 * "thread_list" is cleared when switching back
++				 * to the min thread if it is was current, or
++				 * if it was not current, thread_list is set 
++				 * to 1.  When the switch to current comes,
++				 * if thread_list is 1, clear it, else do 
++				 * nothing.
++				 */
++				usethread = thread;
++				if ((thread_list == 1) &&
++				    (thread == thread_list_start)) {
++					thread_list = 0;
++				}
++				if (thread_list && (threadid == thread_min)) {
++					if (thread == thread_list_start) {
++						thread_list = 0;
++					} else {
++						thread_list = 1;
++					}
++				}
++				/* follow through */
++			case 'c':
++				remcomOutBuffer[0] = 'O';
++				remcomOutBuffer[1] = 'K';
++				remcomOutBuffer[2] = '\0';
++				break;
++			}
++			break;
++
++			/* Query thread status */
++		case 'T':
++			ptr = &remcomInBuffer[1];
++			hexToInt(&ptr, &threadid);
++			thread = getthread(threadid);
++			if (thread) {
++				remcomOutBuffer[0] = 'O';
++				remcomOutBuffer[1] = 'K';
++				remcomOutBuffer[2] = '\0';
++				if (thread_min > threadid)
++					thread_min = threadid;
++			} else {
++				remcomOutBuffer[0] = 'E';
++				remcomOutBuffer[1] = '\0';
++			}
++			break;
++
++		case 'Y':
++			ptr = &remcomInBuffer[1];
++			hexToInt(&ptr, &breakno);
++			ptr++;
++			hexToInt(&ptr, &breaktype);
++			ptr++;
++			hexToInt(&ptr, &length);
++			ptr++;
++			hexToInt(&ptr, &addr);
++			if (set_hw_break(breakno & 0x3,
++					 breaktype & 0x3,
++					 length & 0x3, addr) == 0) {
++				strcpy(remcomOutBuffer, "OK");
++			} else {
++				strcpy(remcomOutBuffer, "ERROR");
++			}
++			break;
++
++			/* Remove hardware breakpoint */
++		case 'y':
++			ptr = &remcomInBuffer[1];
++			hexToInt(&ptr, &breakno);
++			if (remove_hw_break(breakno & 0x3) == 0) {
++				strcpy(remcomOutBuffer, "OK");
++			} else {
++				strcpy(remcomOutBuffer, "ERROR");
++			}
++			break;
++
++		case 'r':	/* reboot */
++			strcpy(remcomOutBuffer, "OK");
++			putpacket(remcomOutBuffer);
++			/*to_gdb("Rebooting\n"); */
++			/* triplefault	 no return from here */
++			{
++				static long no_idt[2];
++				__asm__ __volatile__("lidt %0"::"m"(no_idt));
++				BREAKPOINT;
++			}
++
++		}		/* switch */
++
++		/* reply to the request */
++		putpacket(remcomOutBuffer);
++	}			/* while(1==1) */
++	/*
++	 *  reached by goto only.
++	 */
++      exit_kgdb:
++	/*
++	 * Here is where we set up to trap a gdb function call.	 NEW_esp
++	 * will be changed if we are trying to do this.	 We handle both
++	 * adding and subtracting, thus allowing gdb to put grung on 
++	 * the stack which it removes later.
++	 */
++	if (NEW_esp != OLD_esp) {
++		int *ptr = END_OF_LOOKASIDE;
++		if (NEW_esp < OLD_esp)
++			ptr -= (OLD_esp - NEW_esp) / sizeof (int);
++		*--ptr = linux_regs->eflags;
++		*--ptr = linux_regs->xcs;
++		*--ptr = linux_regs->eip;
++		*--ptr = linux_regs->ecx;
++		*--ptr = linux_regs->ebx;
++		*--ptr = linux_regs->eax;
++		linux_regs->ecx = NEW_esp - (sizeof (int) * 6);
++		linux_regs->ebx = (unsigned int) END_OF_LOOKASIDE;
++		if (NEW_esp < OLD_esp) {
++			linux_regs->eip = (unsigned int) fn_call_stub;
++		} else {
++			linux_regs->eip = (unsigned int) fn_rtn_stub;
++			linux_regs->eax = NEW_esp;
++		}
++		linux_regs->eflags &= ~(IF_BIT | TF_BIT);
++	}
++#ifdef CONFIG_SMP
++	/*
++	 * Release gdb wait locks 
++	 * Sanity check time.  Must have at least one cpu to run.  Also single
++	 * step must not be done if the current cpu is on hold.
++	 */
++	if (spinlock_count == 1) {
++		int ss_hold = (regs.eflags & 0x100) && kgdb_info.hold_on_sstep;
++		int cpu_avail = 0;
++		int i;
++
++		for (i = 0; i < MAX_NO_CPUS; i++) {
++			if (!cpu_online(i))
++				break;
++			if (!hold_cpu(i)) {
++				cpu_avail = 1;
++			}
++		}
++		/*
++		 * Early in the bring up there will be NO cpus on line...
++		 */
++		if (!cpu_avail && !cpus_empty(cpu_online_map)) {
++			to_gdb("No cpus unblocked, see 'kgdb_info.hold_cpu'\n");
++			goto once_again;
++		}
++		if (hold_cpu(smp_processor_id()) && (regs.eflags & 0x100)) {
++			to_gdb
++			    ("Current cpu must be unblocked to single step\n");
++			goto once_again;
++		}
++		if (!(ss_hold)) {
++			int i;
++			for (i = 0; i < MAX_NO_CPUS; i++) {
++				if (!hold_cpu(i)) {
++					spin_unlock(&waitlocks[i]);
++				}
++			}
++		} else {
++			spin_unlock(&waitlocks[smp_processor_id()]);
++		}
++		/* Release kgdb spinlock */
++		KGDB_SPIN_UNLOCK(&kgdb_spinlock);
++		/*
++		 * If this cpu is on hold, this is where we
++		 * do it.  Note, the NMI will pull us out of here,
++		 * but will return as the above lock is not held.
++		 * We will stay here till another cpu releases the lock for us.
++		 */
++		spin_unlock_wait(waitlocks + smp_processor_id());
++		kgdb_local_irq_restore(flags);
++		return (0);
++	}
++#if 0
++exit_just_unlock:
++#endif
++#endif
++	/* Release kgdb spinlock */
++	KGDB_SPIN_UNLOCK(&kgdb_spinlock);
++	kgdb_local_irq_restore(flags);
++	return (0);
++}
++
++/* this function is used to set up exception handlers for tracing and
++ * breakpoints. 
++ * This function is not needed as the above line does all that is needed.
++ * We leave it for backward compatitability...
++ */
++void
++set_debug_traps(void)
++{
++	/*
++	 * linux_debug_hook is defined in traps.c.  We store a pointer
++	 * to our own exception handler into it.
++
++	 * But really folks, every hear of labeled common, an old Fortran
++	 * concept.  Lots of folks can reference it and it is define if 
++	 * anyone does.	 Only one can initialize it at link time.  We do 
++	 * this with the hook.	See the statement above.  No need for any
++	 * executable code and it is ready as soon as the kernel is
++	 * loaded.  Very desirable in kernel debugging.
++
++	 linux_debug_hook = handle_exception ;
++	 */
++
++	/* In case GDB is started before us, ack any packets (presumably
++	   "$?#xx") sitting there. 
++	   putDebugChar ('+');
++
++	   initialized = 1;
++	 */
++}
++
++/* 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. */
++/* But really, just use the BREAKPOINT macro.  We will handle the int stuff
++ */
++
++#ifdef later
++/*
++ * possibly we should not go thru the traps.c code at all?  Someday.
++ */
++void
++do_kgdb_int3(struct pt_regs *regs, long error_code)
++{
++	kgdb_handle_exception(3, 5, error_code, regs);
++	return;
++}
++#endif
++#undef regs
++#ifdef CONFIG_TRAP_BAD_SYSCALL_EXITS
++asmlinkage void
++bad_sys_call_exit(int stuff)
++{
++	struct pt_regs *regs = (struct pt_regs *) &stuff;
++	printk("Sys call %d return with %x preempt_count\n",
++	       (int) regs->orig_eax, preempt_count());
++}
++#endif
++#ifdef CONFIG_STACK_OVERFLOW_TEST
++#include <asm/kgdb.h>
++asmlinkage void
++stack_overflow(void)
++{
++#ifdef BREAKPOINT
++	BREAKPOINT;
++#else
++	printk("Kernel stack overflow, looping forever\n");
++#endif
++	while (1) {
++	}
++}
++#endif
++
++#if defined(CONFIG_SMP) || defined(CONFIG_KGDB_CONSOLE)
++char gdbconbuf[BUFMAX];
++
++static void
++kgdb_gdb_message(const char *s, unsigned count)
++{
++	int i;
++	int wcount;
++	char *bufptr;
++	/*
++	 * This takes care of NMI while spining out chars to gdb
++	 */
++	IF_SMP(in_kgdb_console = 1);
++	gdbconbuf[0] = 'O';
++	bufptr = gdbconbuf + 1;
++	while (count > 0) {
++		if ((count << 1) > (BUFMAX - 2)) {
++			wcount = (BUFMAX - 2) >> 1;
++		} else {
++			wcount = count;
++		}
++		count -= wcount;
++		for (i = 0; i < wcount; i++) {
++			bufptr = pack_hex_byte(bufptr, s[i]);
++		}
++		*bufptr = '\0';
++		s += wcount;
++
++		putpacket(gdbconbuf);
++
++	}
++	IF_SMP(in_kgdb_console = 0);
++}
++#endif
++#ifdef CONFIG_SMP
++static void
++to_gdb(const char *s)
++{
++	int count = 0;
++	while (s[count] && (count++ < BUFMAX)) ;
++	kgdb_gdb_message(s, count);
++}
++#endif
++#ifdef CONFIG_KGDB_CONSOLE
++#include <linux/console.h>
++#include <linux/init.h>
++#include <linux/fs.h>
++#include <asm/uaccess.h>
++#include <asm/semaphore.h>
++
++void
++kgdb_console_write(struct console *co, const char *s, unsigned count)
++{
++
++	if (gdb_i386vector == -1) {
++		/*
++		 * We have not yet talked to gdb.  What to do...
++		 * lets break, on continue we can do the write.
++		 * But first tell him whats up. Uh, well no can do,
++		 * as this IS the console.  Oh well...
++		 * We do need to wait or the messages will be lost.
++		 * Other option would be to tell the above code to
++		 * ignore this breakpoint and do an auto return, 
++		 * but that might confuse gdb.	Also this happens 
++		 * early enough in boot up that we don't have the traps
++		 * set up yet, so...
++		 */
++		breakpoint();
++	}
++	kgdb_gdb_message(s, count);
++}
++
++/*
++ * ------------------------------------------------------------
++ * Serial KGDB driver 
++ * ------------------------------------------------------------
++ */
++
++static struct console kgdbcons = {
++	name:"kgdb",
++	write:kgdb_console_write,
++#ifdef CONFIG_KGDB_USER_CONSOLE
++	device:kgdb_console_device,
++#endif
++	flags:CON_PRINTBUFFER | CON_ENABLED,
++	index:-1,
++};
++
++/*
++ * The trick here is that this file gets linked before printk.o
++ * That means we get to peer at the console info in the command
++ * line before it does.	 If we are up, we register, otherwise,
++ * do nothing.	By returning 0, we allow printk to look also.
++ */
++static int kgdb_console_enabled;
++
++int __init
++kgdb_console_init(char *str)
++{
++	if ((strncmp(str, "kgdb", 4) == 0) || (strncmp(str, "gdb", 3) == 0)) {
++		register_console(&kgdbcons);
++		kgdb_console_enabled = 1;
++	}
++	return 0;		/* let others look at the string */
++}
++
++__setup("console=", kgdb_console_init);
++
++#ifdef CONFIG_KGDB_USER_CONSOLE
++static kdev_t kgdb_console_device(struct console *c);
++/* This stuff sort of works, but it knocks out telnet devices  
++ * we are leaving it here in case we (or you) find time to figure it out
++ * better..
++ */
++
++/*
++ * We need a real char device as well for when the console is opened for user
++ * space activities.
++ */
++
++static int
++kgdb_consdev_open(struct inode *inode, struct file *file)
++{
++	return 0;
++}
++
++static ssize_t
++kgdb_consdev_write(struct file *file, const char *buf,
++		   size_t count, loff_t * ppos)
++{
++	int size, ret = 0;
++	static char kbuf[128];
++	static DECLARE_MUTEX(sem);
++
++	/* We are not reentrant... */
++	if (down_interruptible(&sem))
++		return -ERESTARTSYS;
++
++	while (count > 0) {
++		/* need to copy the data from user space */
++		size = count;
++		if (size > sizeof (kbuf))
++			size = sizeof (kbuf);
++		if (copy_from_user(kbuf, buf, size)) {
++			ret = -EFAULT;
++			break;;
++		}
++		kgdb_console_write(&kgdbcons, kbuf, size);
++		count -= size;
++		ret += size;
++		buf += size;
++	}
++
++	up(&sem);
++
++	return ret;
++}
++
++struct file_operations kgdb_consdev_fops = {
++	open:kgdb_consdev_open,
++	write:kgdb_consdev_write
++};
++static kdev_t
++kgdb_console_device(struct console *c)
++{
++	return MKDEV(TTYAUX_MAJOR, 1);
++}
++
++/*
++ * This routine gets called from the serial stub in the i386/lib 
++ * This is so it is done late in bring up (just before the console open).
++ */
++void
++kgdb_console_finit(void)
++{
++	if (kgdb_console_enabled) {
++		char *cptr = cdevname(MKDEV(TTYAUX_MAJOR, 1));
++		char *cp = cptr;
++		while (*cptr && *cptr != '(')
++			cptr++;
++		*cptr = 0;
++		unregister_chrdev(TTYAUX_MAJOR, cp);
++		register_chrdev(TTYAUX_MAJOR, "kgdb", &kgdb_consdev_fops);
++	}
++}
++#endif
++#endif
++#ifdef CONFIG_KGDB_TS
++#include <asm/msr.h>		/* time stamp code */
++#include <asm/hardirq.h>	/* in_interrupt */
++#ifdef CONFIG_KGDB_TS_64
++#define DATA_POINTS 64
++#endif
++#ifdef CONFIG_KGDB_TS_128
++#define DATA_POINTS 128
++#endif
++#ifdef CONFIG_KGDB_TS_256
++#define DATA_POINTS 256
++#endif
++#ifdef CONFIG_KGDB_TS_512
++#define DATA_POINTS 512
++#endif
++#ifdef CONFIG_KGDB_TS_1024
++#define DATA_POINTS 1024
++#endif
++#ifndef DATA_POINTS
++#define DATA_POINTS 128		/* must be a power of two */
++#endif
++#define INDEX_MASK (DATA_POINTS - 1)
++#if (INDEX_MASK & DATA_POINTS)
++#error "CONFIG_KGDB_TS_COUNT must be a power of 2"
++#endif
++struct kgdb_and_then_struct {
++#ifdef CONFIG_SMP
++	int on_cpu;
++#endif
++	struct task_struct *task;
++	long long at_time;
++	int from_ln;
++	char *in_src;
++	void *from;
++	int *with_shpf;
++	int data0;
++	int data1;
++};
++struct kgdb_and_then_struct2 {
++#ifdef CONFIG_SMP
++	int on_cpu;
++#endif
++	struct task_struct *task;
++	long long at_time;
++	int from_ln;
++	char *in_src;
++	void *from;
++	int *with_shpf;
++	struct task_struct *t1;
++	struct task_struct *t2;
++};
++struct kgdb_and_then_struct kgdb_data[DATA_POINTS];
++
++struct kgdb_and_then_struct *kgdb_and_then = &kgdb_data[0];
++int kgdb_and_then_count;
++
++void
++kgdb_tstamp(int line, char *source, int data0, int data1)
++{
++	static spinlock_t ts_spin = SPIN_LOCK_UNLOCKED;
++	int flags;
++	kgdb_local_irq_save(flags);
++	spin_lock(&ts_spin);
++	rdtscll(kgdb_and_then->at_time);
++#ifdef CONFIG_SMP
++	kgdb_and_then->on_cpu = smp_processor_id();
++#endif
++	kgdb_and_then->task = current;
++	kgdb_and_then->from_ln = line;
++	kgdb_and_then->in_src = source;
++	kgdb_and_then->from = __builtin_return_address(0);
++	kgdb_and_then->with_shpf = (int *) (((flags & IF_BIT) >> 9) |
++					    (preempt_count() << 8));
++	kgdb_and_then->data0 = data0;
++	kgdb_and_then->data1 = data1;
++	kgdb_and_then = &kgdb_data[++kgdb_and_then_count & INDEX_MASK];
++	spin_unlock(&ts_spin);
++	kgdb_local_irq_restore(flags);
++#ifdef CONFIG_PREEMPT
++
++#endif
++	return;
++}
++#endif
++typedef int gdb_debug_hook(int exceptionVector,
++			   int signo, int err_code, struct pt_regs *linux_regs);
++gdb_debug_hook *linux_debug_hook = &kgdb_handle_exception;	/* histerical reasons... */
+--- linux-2.6.0-test1/arch/i386/kernel/ldt.c	2003-06-14 12:18:25.000000000 -0700
++++ 25/arch/i386/kernel/ldt.c	2003-07-19 17:04:06.000000000 -0700
+@@ -56,9 +56,11 @@ static int alloc_ldt(mm_context_t *pc, i
+ 
+ 	if (reload) {
+ #ifdef CONFIG_SMP
++		cpumask_t mask;
+ 		preempt_disable();
+ 		load_LDT(pc);
+-		if (current->mm->cpu_vm_mask != (1 << smp_processor_id()))
++		mask = cpumask_of_cpu(smp_processor_id());
++		if (!cpus_equal(current->mm->cpu_vm_mask, mask))
+ 			smp_call_function(flush_ldt, 0, 1, 1);
+ 		preempt_enable();
+ #else
+--- linux-2.6.0-test1/arch/i386/kernel/Makefile	2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/i386/kernel/Makefile	2003-07-19 17:04:02.000000000 -0700
+@@ -14,6 +14,7 @@ obj-y				+= timers/
+ obj-$(CONFIG_ACPI)		+= acpi/
+ obj-$(CONFIG_X86_BIOS_REBOOT)	+= reboot.o
+ obj-$(CONFIG_MCA)		+= mca.o
++obj-$(CONFIG_KGDB)		+= kgdb_stub.o 
+ obj-$(CONFIG_X86_MSR)		+= msr.o
+ obj-$(CONFIG_X86_CPUID)		+= cpuid.o
+ obj-$(CONFIG_MICROCODE)		+= microcode.o
+--- linux-2.6.0-test1/arch/i386/kernel/mpparse.c	2003-06-16 22:32:20.000000000 -0700
++++ 25/arch/i386/kernel/mpparse.c	2003-07-19 17:04:06.000000000 -0700
+@@ -71,7 +71,7 @@ unsigned int boot_cpu_logical_apicid = -
+ static unsigned int __initdata num_processors;
+ 
+ /* Bitmask of physically existing CPUs */
+-unsigned long phys_cpu_present_map;
++physid_mask_t phys_cpu_present_map;
+ 
+ u8 bios_cpu_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
+ 
+@@ -106,6 +106,7 @@ static struct mpc_config_translation *tr
+ void __init MP_processor_info (struct mpc_config_processor *m)
+ {
+  	int ver, apicid;
++	physid_mask_t tmp;
+  	
+ 	if (!(m->mpc_cpuflag & CPU_ENABLED))
+ 		return;
+@@ -176,7 +177,8 @@ void __init MP_processor_info (struct mp
+ 	}
+ 	ver = m->mpc_apicver;
+ 
+-	phys_cpu_present_map |= apicid_to_cpu_present(apicid);
++	tmp = apicid_to_cpu_present(apicid);
++	physids_or(phys_cpu_present_map, phys_cpu_present_map, tmp);
+ 	
+ 	/*
+ 	 * Validate version
+--- linux-2.6.0-test1/arch/i386/kernel/msr.c	2003-06-14 12:18:08.000000000 -0700
++++ 25/arch/i386/kernel/msr.c	2003-07-19 17:04:06.000000000 -0700
+@@ -242,7 +242,7 @@ static int msr_open(struct inode *inode,
+   int cpu = minor(file->f_dentry->d_inode->i_rdev);
+   struct cpuinfo_x86 *c = &(cpu_data)[cpu];
+   
+-  if ( !(cpu_online_map & (1UL << cpu)) )
++  if (!cpu_online(cpu))
+     return -ENXIO;		/* No such CPU */
+   if ( !cpu_has(c, X86_FEATURE_MSR) )
+     return -EIO;		/* MSR not supported */
+--- linux-2.6.0-test1/arch/i386/kernel/nmi.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/i386/kernel/nmi.c	2003-07-19 17:04:02.000000000 -0700
+@@ -31,7 +31,17 @@
+ #include <asm/mpspec.h>
+ #include <asm/nmi.h>
+ 
++#ifdef CONFIG_KGDB
++#include <asm/kgdb.h>
++#ifdef CONFIG_SMP
++unsigned int nmi_watchdog = NMI_IO_APIC;
++#else
++unsigned int nmi_watchdog = NMI_LOCAL_APIC;
++#endif
++#else
+ unsigned int nmi_watchdog = NMI_NONE;
++#endif
++
+ static unsigned int nmi_hz = HZ;
+ unsigned int nmi_perfctr_msr;	/* the MSR to reset in NMI handler */
+ extern void show_registers(struct pt_regs *regs);
+@@ -396,6 +406,9 @@ void touch_nmi_watchdog (void)
+ 	for (i = 0; i < NR_CPUS; i++)
+ 		alert_counter[i] = 0;
+ }
++#ifdef CONFIG_KGDB
++int tune_watchdog = 5*HZ;
++#endif
+ 
+ void nmi_watchdog_tick (struct pt_regs * regs)
+ {
+@@ -409,12 +422,24 @@ void nmi_watchdog_tick (struct pt_regs *
+ 
+ 	sum = irq_stat[cpu].apic_timer_irqs;
+ 
++#ifdef CONFIG_KGDB
++ 	if (! in_kgdb(regs) && last_irq_sums[cpu] == sum ) {
++  
++#else
+ 	if (last_irq_sums[cpu] == sum) {
++#endif
+ 		/*
+ 		 * Ayiee, looks like this CPU is stuck ...
+ 		 * wait a few IRQs (5 seconds) before doing the oops ...
+ 		 */
+ 		alert_counter[cpu]++;
++#ifdef CONFIG_KGDB
++                if (alert_counter[cpu] == tune_watchdog) {                      
++                        kgdb_handle_exception(2, SIGPWR, 0, regs);
++                        last_irq_sums[cpu] = sum;
++                        alert_counter[cpu] = 0;
++                }
++#endif
+ 		if (alert_counter[cpu] == 5*nmi_hz) {
+ 			spin_lock(&nmi_print_lock);
+ 			/*
+--- linux-2.6.0-test1/arch/i386/kernel/reboot.c	2003-06-14 12:18:06.000000000 -0700
++++ 25/arch/i386/kernel/reboot.c	2003-07-19 17:04:06.000000000 -0700
+@@ -226,7 +226,7 @@ void machine_restart(char * __unused)
+ 		   if its not, default to the BSP */
+ 		if ((reboot_cpu == -1) ||  
+ 		      (reboot_cpu > (NR_CPUS -1))  || 
+-		      !(phys_cpu_present_map & (1<<cpuid))) 
++		      !cpu_isset(cpuid, phys_cpu_present_map))
+ 			reboot_cpu = boot_cpu_physical_apicid;
+ 
+ 		reboot_smp = 0;  /* use this as a flag to only go through this once*/
+--- linux-2.6.0-test1/arch/i386/kernel/setup.c	2003-06-22 12:04:43.000000000 -0700
++++ 25/arch/i386/kernel/setup.c	2003-07-19 17:03:49.000000000 -0700
+@@ -42,6 +42,7 @@
+ #include <asm/edd.h>
+ #include <asm/setup.h>
+ #include <asm/arch_hooks.h>
++#include <asm/sections.h>
+ #include "setup_arch_pre.h"
+ #include "mach_resources.h"
+ 
+@@ -100,7 +101,7 @@ extern void early_cpu_init(void);
+ extern void dmi_scan_machine(void);
+ extern void generic_apic_probe(char *);
+ extern int root_mountflags;
+-extern char _text, _etext, _edata, _end;
++extern char _end[];
+ 
+ unsigned long saved_videomode;
+ 
+@@ -520,7 +521,7 @@ static void __init parse_cmdline_early (
+ 			acpi_disabled = 1;
+ 
+ 		/* "acpismp=force" turns on ACPI again */
+-		else if (!memcmp(from, "acpismp=force", 14))
++		if (c == ' ' && !memcmp(from, "acpismp=force", 13))
+ 			acpi_disabled = 0;
+ 
+ 		/*
+@@ -676,7 +677,7 @@ static unsigned long __init setup_memory
+ 	 * partially used pages are not usable - thus
+ 	 * we are rounding upwards:
+ 	 */
+-	start_pfn = PFN_UP(__pa(&_end));
++	start_pfn = PFN_UP(__pa(_end));
+ 
+ 	find_max_pfn();
+ 
+@@ -947,15 +948,15 @@ void __init setup_arch(char **cmdline_p)
+ 
+ 	if (!MOUNT_ROOT_RDONLY)
+ 		root_mountflags &= ~MS_RDONLY;
+-	init_mm.start_code = (unsigned long) &_text;
+-	init_mm.end_code = (unsigned long) &_etext;
+-	init_mm.end_data = (unsigned long) &_edata;
+-	init_mm.brk = (unsigned long) &_end;
+-
+-	code_resource.start = virt_to_phys(&_text);
+-	code_resource.end = virt_to_phys(&_etext)-1;
+-	data_resource.start = virt_to_phys(&_etext);
+-	data_resource.end = virt_to_phys(&_edata)-1;
++	init_mm.start_code = (unsigned long) _text;
++	init_mm.end_code = (unsigned long) _etext;
++	init_mm.end_data = (unsigned long) _edata;
++	init_mm.brk = (unsigned long) _end;
++
++	code_resource.start = virt_to_phys(_text);
++	code_resource.end = virt_to_phys(_etext)-1;
++	data_resource.start = virt_to_phys(_etext);
++	data_resource.end = virt_to_phys(_edata)-1;
+ 
+ 	parse_cmdline_early(cmdline_p);
+ 
+@@ -977,7 +978,7 @@ void __init setup_arch(char **cmdline_p)
+ 	generic_apic_probe(*cmdline_p);
+ #endif	
+ 
+-#ifdef CONFIG_ACPI_BOOT
++#ifdef CONFIG_ACPI
+ 	/*
+ 	 * Parse the ACPI tables for possible boot-time SMP configuration.
+ 	 */
+--- linux-2.6.0-test1/arch/i386/kernel/smpboot.c	2003-06-26 22:07:23.000000000 -0700
++++ 25/arch/i386/kernel/smpboot.c	2003-07-19 17:04:06.000000000 -0700
+@@ -61,12 +61,12 @@ static int __initdata smp_b_stepping;
+ int smp_num_siblings = 1;
+ int phys_proc_id[NR_CPUS]; /* Package ID of each logical CPU */
+ 
+-/* Bitmask of currently online CPUs */
+-unsigned long cpu_online_map;
++/* bitmap of online cpus */
++cpumask_t cpu_online_map;
+ 
+-static volatile unsigned long cpu_callin_map;
+-volatile unsigned long cpu_callout_map;
+-static unsigned long smp_commenced_mask;
++static cpumask_t cpu_callin_map;
++cpumask_t cpu_callout_map;
++static cpumask_t smp_commenced_mask;
+ 
+ /* Per CPU bogomips and other parameters */
+ struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned;
+@@ -268,7 +268,7 @@ static void __init synchronize_tsc_bp (v
+ 
+ 	sum = 0;
+ 	for (i = 0; i < NR_CPUS; i++) {
+-		if (test_bit(i, &cpu_callout_map)) {
++		if (cpu_isset(i, cpu_callout_map)) {
+ 			t0 = tsc_values[i];
+ 			sum += t0;
+ 		}
+@@ -277,7 +277,7 @@ static void __init synchronize_tsc_bp (v
+ 
+ 	sum = 0;
+ 	for (i = 0; i < NR_CPUS; i++) {
+-		if (!test_bit(i, &cpu_callout_map))
++		if (!cpu_isset(i, cpu_callout_map))
+ 			continue;
+ 		delta = tsc_values[i] - avg;
+ 		if (delta < 0)
+@@ -353,7 +353,7 @@ void __init smp_callin(void)
+ 	 */
+ 	phys_id = GET_APIC_ID(apic_read(APIC_ID));
+ 	cpuid = smp_processor_id();
+-	if (test_bit(cpuid, &cpu_callin_map)) {
++	if (cpu_isset(cpuid, cpu_callin_map)) {
+ 		printk("huh, phys CPU#%d, CPU#%d already present??\n",
+ 					phys_id, cpuid);
+ 		BUG();
+@@ -376,7 +376,7 @@ void __init smp_callin(void)
+ 		/*
+ 		 * Has the boot CPU finished it's STARTUP sequence?
+ 		 */
+-		if (test_bit(cpuid, &cpu_callout_map))
++		if (cpu_isset(cpuid, cpu_callout_map))
+ 			break;
+ 		rep_nop();
+ 	}
+@@ -417,7 +417,7 @@ void __init smp_callin(void)
+ 	/*
+ 	 * Allow the master to continue.
+ 	 */
+-	set_bit(cpuid, &cpu_callin_map);
++	cpu_set(cpuid, cpu_callin_map);
+ 
+ 	/*
+ 	 *      Synchronize the TSC with the BP
+@@ -442,7 +442,7 @@ int __init start_secondary(void *unused)
+ 	 */
+ 	cpu_init();
+ 	smp_callin();
+-	while (!test_bit(smp_processor_id(), &smp_commenced_mask))
++	while (!cpu_isset(smp_processor_id(), smp_commenced_mask))
+ 		rep_nop();
+ 	setup_secondary_APIC_clock();
+ 	if (nmi_watchdog == NMI_IO_APIC) {
+@@ -456,7 +456,7 @@ int __init start_secondary(void *unused)
+ 	 * the local TLBs too.
+ 	 */
+ 	local_flush_tlb();
+-	set_bit(smp_processor_id(), &cpu_online_map);
++	cpu_set(smp_processor_id(), cpu_online_map);
+ 	wmb();
+ 	return cpu_idle();
+ }
+@@ -499,16 +499,16 @@ static struct task_struct * __init fork_
+ #ifdef CONFIG_NUMA
+ 
+ /* which logical CPUs are on which nodes */
+-volatile unsigned long node_2_cpu_mask[MAX_NR_NODES] = 
+-						{ [0 ... MAX_NR_NODES-1] = 0 };
++cpumask_t node_2_cpu_mask[MAX_NR_NODES] =
++				{ [0 ... MAX_NR_NODES-1] = CPU_MASK_NONE };
+ /* which node each logical CPU is on */
+-volatile int cpu_2_node[NR_CPUS] = { [0 ... NR_CPUS-1] = 0 };
++int cpu_2_node[NR_CPUS] = { [0 ... NR_CPUS-1] = 0 };
+ 
+ /* set up a mapping between cpu and node. */
+ static inline void map_cpu_to_node(int cpu, int node)
+ {
+ 	printk("Mapping cpu %d to node %d\n", cpu, node);
+-	node_2_cpu_mask[node] |= (1 << cpu);
++	cpu_set(cpu, node_2_cpu_mask[node]);
+ 	cpu_2_node[cpu] = node;
+ }
+ 
+@@ -519,7 +519,7 @@ static inline void unmap_cpu_to_node(int
+ 
+ 	printk("Unmapping cpu %d from all nodes\n", cpu);
+ 	for (node = 0; node < MAX_NR_NODES; node ++)
+-		node_2_cpu_mask[node] &= ~(1 << cpu);
++		cpu_clear(cpu, node_2_cpu_mask[node]);
+ 	cpu_2_node[cpu] = -1;
+ }
+ #else /* !CONFIG_NUMA */
+@@ -529,7 +529,7 @@ static inline void unmap_cpu_to_node(int
+ 
+ #endif /* CONFIG_NUMA */
+ 
+-volatile u8 cpu_2_logical_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
++u8 cpu_2_logical_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
+ 
+ void map_cpu_to_logical_apicid(void)
+ {
+@@ -770,7 +770,7 @@ wakeup_secondary_cpu(int phys_apicid, un
+ }
+ #endif	/* WAKE_SECONDARY_VIA_INIT */
+ 
+-extern unsigned long cpu_initialized;
++extern cpumask_t cpu_initialized;
+ 
+ static int __init do_boot_cpu(int apicid)
+ /*
+@@ -836,19 +836,19 @@ static int __init do_boot_cpu(int apicid
+ 		 * allow APs to start initializing.
+ 		 */
+ 		Dprintk("Before Callout %d.\n", cpu);
+-		set_bit(cpu, &cpu_callout_map);
++		cpu_set(cpu, cpu_callout_map);
+ 		Dprintk("After Callout %d.\n", cpu);
+ 
+ 		/*
+ 		 * Wait 5s total for a response
+ 		 */
+ 		for (timeout = 0; timeout < 50000; timeout++) {
+-			if (test_bit(cpu, &cpu_callin_map))
++			if (cpu_isset(cpu, cpu_callin_map))
+ 				break;	/* It has booted */
+ 			udelay(100);
+ 		}
+ 
+-		if (test_bit(cpu, &cpu_callin_map)) {
++		if (cpu_isset(cpu, cpu_callin_map)) {
+ 			/* number CPUs logically, starting from 1 (BSP is 0) */
+ 			Dprintk("OK.\n");
+ 			printk("CPU%d: ", cpu);
+@@ -869,8 +869,8 @@ static int __init do_boot_cpu(int apicid
+ 	if (boot_error) {
+ 		/* Try to put things back the way they were before ... */
+ 		unmap_cpu_to_logical_apicid(cpu);
+-		clear_bit(cpu, &cpu_callout_map); /* was set here (do_boot_cpu()) */
+-		clear_bit(cpu, &cpu_initialized); /* was set by cpu_init() */
++		cpu_clear(cpu, cpu_callout_map); /* was set here (do_boot_cpu()) */
++		cpu_clear(cpu, cpu_initialized); /* was set by cpu_init() */
+ 		cpucount--;
+ 	}
+ 
+@@ -957,7 +957,7 @@ static void __init smp_boot_cpus(unsigne
+ 	if (!smp_found_config) {
+ 		printk(KERN_NOTICE "SMP motherboard not detected.\n");
+ 		smpboot_clear_io_apic_irqs();
+-		phys_cpu_present_map = 1;
++		phys_cpu_present_map = physid_mask_of_physid(0);
+ 		if (APIC_init_uniprocessor())
+ 			printk(KERN_NOTICE "Local APIC not detected."
+ 					   " Using dummy APIC emulation.\n");
+@@ -973,7 +973,7 @@ static void __init smp_boot_cpus(unsigne
+ 	if (!check_phys_apicid_present(boot_cpu_physical_apicid)) {
+ 		printk("weird, boot CPU (#%d) not listed by the BIOS.\n",
+ 				boot_cpu_physical_apicid);
+-		phys_cpu_present_map |= (1 << hard_smp_processor_id());
++		cpu_set(hard_smp_processor_id(), phys_cpu_present_map);
+ 	}
+ 
+ 	/*
+@@ -984,7 +984,7 @@ static void __init smp_boot_cpus(unsigne
+ 			boot_cpu_physical_apicid);
+ 		printk(KERN_ERR "... forcing use of dummy APIC emulation. (tell your hw vendor)\n");
+ 		smpboot_clear_io_apic_irqs();
+-		phys_cpu_present_map = 1;
++		phys_cpu_present_map = physid_mask_of_physid(0);
+ 		return;
+ 	}
+ 
+@@ -997,7 +997,7 @@ static void __init smp_boot_cpus(unsigne
+ 		smp_found_config = 0;
+ 		printk(KERN_INFO "SMP mode deactivated, forcing use of dummy APIC emulation.\n");
+ 		smpboot_clear_io_apic_irqs();
+-		phys_cpu_present_map = 1;
++		phys_cpu_present_map = physid_mask_of_physid(0);
+ 		return;
+ 	}
+ 
+@@ -1017,10 +1017,10 @@ static void __init smp_boot_cpus(unsigne
+ 	 * bits 0-3 are quad0, 4-7 are quad1, etc. A perverse twist on the 
+ 	 * clustered apic ID.
+ 	 */
+-	Dprintk("CPU present map: %lx\n", phys_cpu_present_map);
++	Dprintk("CPU present map: %lx\n", cpus_coerce(phys_cpu_present_map));
+ 
+ 	kicked = 1;
+-	for (bit = 0; kicked < NR_CPUS && bit < BITS_PER_LONG; bit++) {
++	for (bit = 0; kicked < NR_CPUS && bit < MAX_APICS; bit++) {
+ 		apicid = cpu_present_to_apicid(bit);
+ 		/*
+ 		 * Don't even attempt to start the boot CPU!
+@@ -1055,7 +1055,7 @@ static void __init smp_boot_cpus(unsigne
+ 	} else {
+ 		unsigned long bogosum = 0;
+ 		for (cpu = 0; cpu < NR_CPUS; cpu++)
+-			if (cpu_callout_map & (1<<cpu))
++			if (cpu_isset(cpu, cpu_callout_map))
+ 				bogosum += cpu_data[cpu].loops_per_jiffy;
+ 		printk(KERN_INFO "Total of %d processors activated (%lu.%02lu BogoMIPS).\n",
+ 			cpucount+1,
+@@ -1087,10 +1087,11 @@ static void __init smp_boot_cpus(unsigne
+ 		
+ 		for (cpu = 0; cpu < NR_CPUS; cpu++) {
+ 			int 	i;
+-			if (!test_bit(cpu, &cpu_callout_map)) continue;
++			if (!cpu_isset(cpu, cpu_callout_map))
++				continue;
+ 
+ 			for (i = 0; i < NR_CPUS; i++) {
+-				if (i == cpu || !test_bit(i, &cpu_callout_map))
++				if (i == cpu || !cpu_isset(i, cpu_callout_map))
+ 					continue;
+ 				if (phys_proc_id[cpu] == phys_proc_id[i]) {
+ 					cpu_sibling_map[cpu] = i;
+@@ -1125,28 +1126,28 @@ void __init smp_prepare_cpus(unsigned in
+ 
+ void __devinit smp_prepare_boot_cpu(void)
+ {
+-	set_bit(smp_processor_id(), &cpu_online_map);
+-	set_bit(smp_processor_id(), &cpu_callout_map);
++	cpu_set(smp_processor_id(), cpu_online_map);
++	cpu_set(smp_processor_id(), cpu_callout_map);
+ }
+ 
+ int __devinit __cpu_up(unsigned int cpu)
+ {
+ 	/* This only works at boot for x86.  See "rewrite" above. */
+-	if (test_bit(cpu, &smp_commenced_mask)) {
++	if (cpu_isset(cpu, smp_commenced_mask)) {
+ 		local_irq_enable();
+ 		return -ENOSYS;
+ 	}
+ 
+ 	/* In case one didn't come up */
+-	if (!test_bit(cpu, &cpu_callin_map)) {
++	if (!cpu_isset(cpu, cpu_callin_map)) {
+ 		local_irq_enable();
+ 		return -EIO;
+ 	}
+ 
+ 	local_irq_enable();
+ 	/* Unleash the CPU! */
+-	set_bit(cpu, &smp_commenced_mask);
+-	while (!test_bit(cpu, &cpu_online_map))
++	cpu_set(cpu, smp_commenced_mask);
++	while (!cpu_isset(cpu, cpu_online_map))
+ 		mb();
+ 	return 0;
+ }
+@@ -1154,7 +1155,8 @@ int __devinit __cpu_up(unsigned int cpu)
+ void __init smp_cpus_done(unsigned int max_cpus)
+ {
+ #ifdef CONFIG_X86_IO_APIC
+-	setup_ioapic_dest(TARGET_CPUS);
++	cpumask_t targets = CPU_MASK_ALL;
++	setup_ioapic_dest(targets);
+ #endif
+ 	zap_low_mappings();
+ }
+--- linux-2.6.0-test1/arch/i386/kernel/smp.c	2003-06-26 22:07:23.000000000 -0700
++++ 25/arch/i386/kernel/smp.c	2003-07-19 17:04:06.000000000 -0700
+@@ -155,8 +155,12 @@ void send_IPI_self(int vector)
+ 	__send_IPI_shortcut(APIC_DEST_SELF, vector);
+ }
+ 
+-inline void send_IPI_mask_bitmask(int mask, int vector)
++/*
++ * This is only used on smaller machines.
++ */
++inline void send_IPI_mask_bitmask(cpumask_t cpumask, int vector)
+ {
++	unsigned long mask = cpus_coerce(cpumask);
+ 	unsigned long cfg;
+ 	unsigned long flags;
+ 
+@@ -186,10 +190,10 @@ inline void send_IPI_mask_bitmask(int ma
+ 	local_irq_restore(flags);
+ }
+ 
+-inline void send_IPI_mask_sequence(int mask, int vector)
++inline void send_IPI_mask_sequence(cpumask_t mask, int vector)
+ {
+ 	unsigned long cfg, flags;
+-	unsigned int query_cpu, query_mask;
++	unsigned int query_cpu;
+ 
+ 	/*
+ 	 * Hack. The clustered APIC addressing mode doesn't allow us to send 
+@@ -200,8 +204,7 @@ inline void send_IPI_mask_sequence(int m
+ 	local_irq_save(flags);
+ 
+ 	for (query_cpu = 0; query_cpu < NR_CPUS; ++query_cpu) {
+-		query_mask = 1 << query_cpu;
+-		if (query_mask & mask) {
++		if (cpu_isset(query_cpu, mask)) {
+ 		
+ 			/*
+ 			 * Wait for idle.
+@@ -238,7 +241,7 @@ inline void send_IPI_mask_sequence(int m
+  *	Optimizations Manfred Spraul <manfred@colorfullife.com>
+  */
+ 
+-static volatile unsigned long flush_cpumask;
++static cpumask_t flush_cpumask;
+ static struct mm_struct * flush_mm;
+ static unsigned long flush_va;
+ static spinlock_t tlbstate_lock = SPIN_LOCK_UNLOCKED;
+@@ -255,7 +258,7 @@ static inline void leave_mm (unsigned lo
+ {
+ 	if (cpu_tlbstate[cpu].state == TLBSTATE_OK)
+ 		BUG();
+-	clear_bit(cpu, &cpu_tlbstate[cpu].active_mm->cpu_vm_mask);
++	cpu_clear(cpu, cpu_tlbstate[cpu].active_mm->cpu_vm_mask);
+ 	load_cr3(swapper_pg_dir);
+ }
+ 
+@@ -265,7 +268,7 @@ static inline void leave_mm (unsigned lo
+  * [cpu0: the cpu that switches]
+  * 1) switch_mm() either 1a) or 1b)
+  * 1a) thread switch to a different mm
+- * 1a1) clear_bit(cpu, &old_mm->cpu_vm_mask);
++ * 1a1) cpu_clear(cpu, old_mm->cpu_vm_mask);
+  * 	Stop ipi delivery for the old mm. This is not synchronized with
+  * 	the other cpus, but smp_invalidate_interrupt ignore flush ipis
+  * 	for the wrong mm, and in the worst case we perform a superflous
+@@ -275,7 +278,7 @@ static inline void leave_mm (unsigned lo
+  *	was in lazy tlb mode.
+  * 1a3) update cpu_tlbstate[].active_mm
+  * 	Now cpu0 accepts tlb flushes for the new mm.
+- * 1a4) set_bit(cpu, &new_mm->cpu_vm_mask);
++ * 1a4) cpu_set(cpu, new_mm->cpu_vm_mask);
+  * 	Now the other cpus will send tlb flush ipis.
+  * 1a4) change cr3.
+  * 1b) thread switch without mm change
+@@ -311,7 +314,7 @@ asmlinkage void smp_invalidate_interrupt
+ 
+ 	cpu = get_cpu();
+ 
+-	if (!test_bit(cpu, &flush_cpumask))
++	if (!cpu_isset(cpu, flush_cpumask))
+ 		goto out;
+ 		/* 
+ 		 * This was a BUG() but until someone can quote me the
+@@ -332,15 +335,17 @@ asmlinkage void smp_invalidate_interrupt
+ 			leave_mm(cpu);
+ 	}
+ 	ack_APIC_irq();
+-	clear_bit(cpu, &flush_cpumask);
+-
++	smp_mb__before_clear_bit();
++	cpu_clear(cpu, flush_cpumask);
++	smp_mb__after_clear_bit();
+ out:
+ 	put_cpu_no_resched();
+ }
+ 
+-static void flush_tlb_others (unsigned long cpumask, struct mm_struct *mm,
++static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm,
+ 						unsigned long va)
+ {
++	cpumask_t tmp;
+ 	/*
+ 	 * A couple of (to be removed) sanity checks:
+ 	 *
+@@ -348,14 +353,12 @@ static void flush_tlb_others (unsigned l
+ 	 * - current CPU must not be in mask
+ 	 * - mask must exist :)
+ 	 */
+-	if (!cpumask)
+-		BUG();
+-	if ((cpumask & cpu_online_map) != cpumask)
+-		BUG();
+-	if (cpumask & (1 << smp_processor_id()))
+-		BUG();
+-	if (!mm)
+-		BUG();
++	BUG_ON(cpus_empty(cpumask));
++
++	cpus_and(tmp, cpumask, cpu_online_map);
++	BUG_ON(!cpus_equal(cpumask, tmp));
++	BUG_ON(cpu_isset(smp_processor_id(), cpumask));
++	BUG_ON(!mm);
+ 
+ 	/*
+ 	 * i'm not happy about this global shared spinlock in the
+@@ -367,15 +370,26 @@ static void flush_tlb_others (unsigned l
+ 	
+ 	flush_mm = mm;
+ 	flush_va = va;
++#if NR_CPUS <= BITS_PER_LONG
+ 	atomic_set_mask(cpumask, &flush_cpumask);
++#else
++	{
++		int k;
++		unsigned long *flush_mask = (unsigned long *)&flush_cpumask;
++		unsigned long *cpu_mask = (unsigned long *)&cpumask;
++		for (k = 0; k < BITS_TO_LONGS(NR_CPUS); ++k)
++			atomic_set_mask(cpu_mask[k], &flush_mask[k]);
++	}
++#endif
+ 	/*
+ 	 * We have to send the IPI only to
+ 	 * CPUs affected.
+ 	 */
+ 	send_IPI_mask(cpumask, INVALIDATE_TLB_VECTOR);
+ 
+-	while (flush_cpumask)
+-		/* nothing. lockup detection does not belong here */;
++	while (!cpus_empty(flush_cpumask))
++		/* nothing. lockup detection does not belong here */
++		mb();
+ 
+ 	flush_mm = NULL;
+ 	flush_va = 0;
+@@ -385,23 +399,25 @@ static void flush_tlb_others (unsigned l
+ void flush_tlb_current_task(void)
+ {
+ 	struct mm_struct *mm = current->mm;
+-	unsigned long cpu_mask;
++	cpumask_t cpu_mask;
+ 
+ 	preempt_disable();
+-	cpu_mask = mm->cpu_vm_mask & ~(1UL << smp_processor_id());
++	cpu_mask = mm->cpu_vm_mask;
++	cpu_clear(smp_processor_id(), cpu_mask);
+ 
+ 	local_flush_tlb();
+-	if (cpu_mask)
++	if (!cpus_empty(cpu_mask))
+ 		flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
+ 	preempt_enable();
+ }
+ 
+ void flush_tlb_mm (struct mm_struct * mm)
+ {
+-	unsigned long cpu_mask;
++	cpumask_t cpu_mask;
+ 
+ 	preempt_disable();
+-	cpu_mask = mm->cpu_vm_mask & ~(1UL << smp_processor_id());
++	cpu_mask = mm->cpu_vm_mask;
++	cpu_clear(smp_processor_id(), cpu_mask);
+ 
+ 	if (current->active_mm == mm) {
+ 		if (current->mm)
+@@ -409,7 +425,7 @@ void flush_tlb_mm (struct mm_struct * mm
+ 		else
+ 			leave_mm(smp_processor_id());
+ 	}
+-	if (cpu_mask)
++	if (!cpus_empty(cpu_mask))
+ 		flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
+ 
+ 	preempt_enable();
+@@ -418,10 +434,11 @@ void flush_tlb_mm (struct mm_struct * mm
+ void flush_tlb_page(struct vm_area_struct * vma, unsigned long va)
+ {
+ 	struct mm_struct *mm = vma->vm_mm;
+-	unsigned long cpu_mask;
++	cpumask_t cpu_mask;
+ 
+ 	preempt_disable();
+-	cpu_mask = mm->cpu_vm_mask & ~(1UL << smp_processor_id());
++	cpu_mask = mm->cpu_vm_mask;
++	cpu_clear(smp_processor_id(), cpu_mask);
+ 
+ 	if (current->active_mm == mm) {
+ 		if(current->mm)
+@@ -430,7 +447,7 @@ void flush_tlb_page(struct vm_area_struc
+ 		 	leave_mm(smp_processor_id());
+ 	}
+ 
+-	if (cpu_mask)
++	if (!cpus_empty(cpu_mask))
+ 		flush_tlb_others(cpu_mask, mm, va);
+ 
+ 	preempt_enable();
+@@ -457,9 +474,19 @@ void flush_tlb_all(void)
+  */
+ void smp_send_reschedule(int cpu)
+ {
+-	send_IPI_mask(1 << cpu, RESCHEDULE_VECTOR);
++	send_IPI_mask(cpumask_of_cpu(cpu), RESCHEDULE_VECTOR);
+ }
+-
++#ifdef CONFIG_KGDB
++/*
++ * By using the NMI code instead of a vector we just sneak thru the 
++ * word generator coming out with just what we want.  AND it does
++ * not matter if clustered_apic_mode is set or not.
++ */
++void smp_send_nmi_allbutself(void)
++{
++	send_IPI_allbutself(APIC_DM_NMI);
++}
++#endif
+ /*
+  * Structure and data for smp_call_function(). This is designed to minimise
+  * static memory requirements. It also looks cleaner.
+@@ -533,7 +560,7 @@ static void stop_this_cpu (void * dummy)
+ 	/*
+ 	 * Remove this CPU:
+ 	 */
+-	clear_bit(smp_processor_id(), &cpu_online_map);
++	cpu_clear(smp_processor_id(), cpu_online_map);
+ 	local_irq_disable();
+ 	disable_local_APIC();
+ 	if (cpu_data[smp_processor_id()].hlt_works_ok)
+--- linux-2.6.0-test1/arch/i386/kernel/traps.c	2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/i386/kernel/traps.c	2003-07-19 17:06:40.000000000 -0700
+@@ -90,6 +90,42 @@ asmlinkage void alignment_check(void);
+ asmlinkage void spurious_interrupt_bug(void);
+ asmlinkage void machine_check(void);
+ 
++#ifdef CONFIG_KGDB
++extern void sysenter_entry(void);
++#include <asm/kgdb.h>
++#include <linux/init.h>
++extern void int3(void);
++extern void debug(void);
++void set_intr_gate(unsigned int n, void *addr);
++static void set_intr_usr_gate(unsigned int n, void *addr);
++/*
++ * Should be able to call this breakpoint() very early in
++ * bring up.  Just hard code the call where needed.
++ * The breakpoint() code is here because set_?_gate() functions
++ * are local (static) to trap.c.  They need be done only once,
++ * but it does not hurt to do them over.
++ */
++void breakpoint(void)
++{
++        set_intr_usr_gate(3,&int3); /* disable ints on trap */
++	set_intr_gate(1,&debug);
++	set_intr_gate(14,&page_fault);
++       
++        BREAKPOINT;
++}
++#define	CHK_REMOTE_DEBUG(trapnr,signr,error_code,regs,after)		\
++    {									\
++	if (!user_mode(regs)  ) \
++	{								\
++		kgdb_handle_exception(trapnr, signr, error_code, regs);	\
++		after;							\
++	} else if ((trapnr == 3) && (regs->eflags &0x200)) local_irq_enable(); \
++    }
++#else
++#define	CHK_REMOTE_DEBUG(trapnr,signr,error_code,regs,after)	
++#endif
++
++
+ static int kstack_depth_to_print = 24;
+ 
+ void show_trace(struct task_struct *task, unsigned long * stack)
+@@ -172,8 +208,9 @@ void show_registers(struct pt_regs *regs
+ 		ss = regs->xss & 0xffff;
+ 	}
+ 	print_modules();
+-	printk("CPU:    %d\nEIP:    %04x:[<%08lx>]    %s\nEFLAGS: %08lx\n",
+-		smp_processor_id(), 0xffff & regs->xcs, regs->eip, print_tainted(), regs->eflags);
++	printk("CPU:    %d\nEIP:    %04x:[<%08lx>]    %s VLI\nEFLAGS: %08lx\n",
++		smp_processor_id(), 0xffff & regs->xcs,
++		regs->eip, print_tainted(), regs->eflags);
+ 
+ 	print_symbol("EIP is at %s\n", regs->eip);
+ 	printk("eax: %08lx   ebx: %08lx   ecx: %08lx   edx: %08lx\n",
+@@ -189,23 +226,25 @@ void show_registers(struct pt_regs *regs
+ 	 * time of the fault..
+ 	 */
+ 	if (in_kernel) {
++		u8 *eip;
+ 
+ 		printk("\nStack: ");
+ 		show_stack(NULL, (unsigned long*)esp);
+ 
+ 		printk("Code: ");
+-		if(regs->eip < PAGE_OFFSET)
+-			goto bad;
+ 
+-		for(i=0;i<20;i++)
+-		{
++		eip = (u8 *)regs->eip - 43;
++		for (i = 0; i < 64; i++, eip++) {
+ 			unsigned char c;
+-			if(__get_user(c, &((unsigned char*)regs->eip)[i])) {
+-bad:
++
++			if (eip < (u8 *)PAGE_OFFSET || __get_user(c, eip)) {
+ 				printk(" Bad EIP value.");
+ 				break;
+ 			}
+-			printk("%02x ", c);
++			if (eip == (u8 *)regs->eip)
++				printk("<%02x> ", c);
++			else
++				printk("%02x ", c);
+ 		}
+ 	}
+ 	printk("\n");
+@@ -252,12 +291,36 @@ spinlock_t die_lock = SPIN_LOCK_UNLOCKED
+ void die(const char * str, struct pt_regs * regs, long err)
+ {
+ 	static int die_counter;
++	int nl = 0;
+ 
+ 	console_verbose();
+ 	spin_lock_irq(&die_lock);
+ 	bust_spinlocks(1);
+ 	handle_BUG(regs);
+ 	printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
++#ifdef CONFIG_PREEMPT
++	printk("PREEMPT ");
++	nl = 1;
++#endif
++#ifdef CONFIG_SMP
++	printk("SMP ");
++	nl = 1;
++#endif
++#ifdef CONFIG_DEBUG_PAGEALLOC
++	printk("DEBUG_PAGEALLOC");
++	nl = 1;
++#endif
++	if (nl)
++		printk("\n");
++#ifdef CONFIG_KGDB
++	/* This is about the only place we want to go to kgdb even if in 
++	 * user mode.  But we must go in via a trap so within kgdb we will
++	 * always be in kernel mode.
++	 */
++	if (user_mode(regs))
++		BREAKPOINT;
++#endif
++ 	CHK_REMOTE_DEBUG(0,SIGTRAP,err,regs,)
+ 	show_registers(regs);
+ 	bust_spinlocks(0);
+ 	spin_unlock_irq(&die_lock);
+@@ -327,6 +390,7 @@ static inline void do_trap(int trapnr, i
+ #define DO_ERROR(trapnr, signr, str, name) \
+ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
+ { \
++	CHK_REMOTE_DEBUG(trapnr,signr,error_code,regs,)\
+ 	do_trap(trapnr, signr, str, 0, regs, error_code, NULL); \
+ }
+ 
+@@ -344,7 +408,9 @@ asmlinkage void do_##name(struct pt_regs
+ #define DO_VM86_ERROR(trapnr, signr, str, name) \
+ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
+ { \
++	CHK_REMOTE_DEBUG(trapnr, signr, error_code,regs, return)\
+ 	do_trap(trapnr, signr, str, 1, regs, error_code, NULL); \
++	return; \
+ }
+ 
+ #define DO_VM86_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
+@@ -387,8 +453,10 @@ gp_in_vm86:
+ 	return;
+ 
+ gp_in_kernel:
+-	if (!fixup_exception(regs))
++	if (!fixup_exception(regs)){
++ 		CHK_REMOTE_DEBUG(13,SIGSEGV,error_code,regs,)
+ 		die("general protection fault", regs, error_code);
++	}
+ }
+ 
+ static void mem_parity_error(unsigned char reason, struct pt_regs * regs)
+@@ -550,8 +618,18 @@ asmlinkage void do_debug(struct pt_regs 
+ 		 * allowing programs to debug themselves without the ptrace()
+ 		 * interface.
+ 		 */
+-		if ((regs->xcs & 3) == 0)
++#ifdef CONFIG_KGDB
++		/*
++		 * I think this is the only "real" case of a TF in the kernel
++		 * that really belongs to user space.  Others are
++		 * "Ours all ours!"
++		 */
++		if (((regs->xcs & 3) == 0) && ((void *)regs->eip == sysenter_entry))
++			goto clear_TF_reenable;
++#else
++		if ((regs->xcs & 3) == 0)	
+ 			goto clear_TF_reenable;
++#endif
+ 		if ((tsk->ptrace & (PT_DTRACE|PT_PTRACED)) == PT_DTRACE)
+ 			goto clear_TF;
+ 	}
+@@ -563,6 +641,17 @@ asmlinkage void do_debug(struct pt_regs 
+ 	info.si_errno = 0;
+ 	info.si_code = TRAP_BRKPT;
+ 	
++#ifdef CONFIG_KGDB
++        /*
++	 * If this is a kernel mode trap, we need to reset db7 to allow us
++	 * to continue sanely ALSO skip the signal delivery 
++         */
++	if ((regs->xcs & 3) == 0)
++		goto clear_dr7;
++
++        /* if not kernel, allow ints but only if they were on */ 
++       if ( regs->eflags & 0x200) local_irq_enable(); 
++#endif
+ 	/* If this is a kernel mode trap, save the user PC on entry to 
+ 	 * the kernel, that's what the debugger can make sense of.
+ 	 */
+@@ -577,6 +666,7 @@ clear_dr7:
+ 	__asm__("movl %0,%%db7"
+ 		: /* no output */
+ 		: "r" (0));
++	CHK_REMOTE_DEBUG(1,SIGTRAP,error_code,regs,)
+ 	return;
+ 
+ debug_vm86:
+@@ -823,6 +913,12 @@ static void __init set_call_gate(void *a
+ {
+ 	_set_gate(a,12,3,addr,__KERNEL_CS);
+ }
++#ifdef CONFIG_KGDB
++void set_intr_usr_gate(unsigned int n, void *addr)
++{
++	_set_gate(idt_table+n,14,3,addr,__KERNEL_CS);
++}
++#endif
+ 
+ static void __init set_task_gate(unsigned int n, unsigned int gdt_entry)
+ {
+@@ -849,7 +945,11 @@ void __init trap_init(void)
+ 	set_trap_gate(0,&divide_error);
+ 	set_intr_gate(1,&debug);
+ 	set_intr_gate(2,&nmi);
++#ifndef CONFIG_KGDB
+ 	set_system_gate(3,&int3);	/* int3-5 can be called from all */
++#else
++	set_intr_usr_gate(3,&int3);	/* int3-5 can be called from all */
++#endif
+ 	set_system_gate(4,&overflow);
+ 	set_system_gate(5,&bounds);
+ 	set_trap_gate(6,&invalid_op);
+--- linux-2.6.0-test1/arch/i386/kernel/vm86.c	2003-06-14 12:17:58.000000000 -0700
++++ 25/arch/i386/kernel/vm86.c	2003-07-19 17:07:16.000000000 -0700
+@@ -144,12 +144,14 @@ static void mark_screen_rdonly(struct ta
+ 		pgd_clear(pgd);
+ 		goto out;
+ 	}
+-	pmd = pmd_offset(pgd, 0xA0000);
+-	if (pmd_none(*pmd))
++	pmd = pmd_offset_map(pgd, 0xA0000);
++	if (pmd_none(*pmd)) {
++		pmd_unmap(pmd);
+ 		goto out;
+-	if (pmd_bad(*pmd)) {
++	} else if (pmd_bad(*pmd)) {
+ 		pmd_ERROR(*pmd);
+ 		pmd_clear(pmd);
++		pmd_unmap(pmd);
+ 		goto out;
+ 	}
+ 	pte = mapped = pte_offset_map(pmd, 0xA0000);
+@@ -159,6 +161,7 @@ static void mark_screen_rdonly(struct ta
+ 		pte++;
+ 	}
+ 	pte_unmap(mapped);
++	pmd_unmap(pmd);
+ out:
+ 	spin_unlock(&tsk->mm->page_table_lock);
+ 	preempt_enable();
+--- linux-2.6.0-test1/arch/i386/lib/dec_and_lock.c	2003-06-26 22:07:23.000000000 -0700
++++ 25/arch/i386/lib/dec_and_lock.c	2003-07-19 17:06:40.000000000 -0700
+@@ -10,6 +10,7 @@
+ #include <linux/spinlock.h>
+ #include <asm/atomic.h>
+ 
++#ifndef ATOMIC_DEC_AND_LOCK
+ int atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
+ {
+ 	int counter;
+@@ -38,3 +39,5 @@ slow_path:
+ 	spin_unlock(lock);
+ 	return 0;
+ }
++#endif
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/i386/lib/kgdb_serial.c	2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,485 @@
++/*
++ * Serial interface GDB stub
++ *
++ * Written (hacked together) by David Grothe (dave@gcom.com)
++ * Modified to allow invokation early in boot see also
++ * kgdb.h for instructions by George Anzinger(george@mvista.com)
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/errno.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/timer.h>
++#include <linux/interrupt.h>
++#include <linux/tty.h>
++#include <linux/tty_flip.h>
++#include <linux/serial.h>
++#include <linux/serial_reg.h>
++#include <linux/config.h>
++#include <linux/major.h>
++#include <linux/string.h>
++#include <linux/fcntl.h>
++#include <linux/ptrace.h>
++#include <linux/ioport.h>
++#include <linux/mm.h>
++#include <linux/init.h>
++#include <linux/highmem.h>
++#include <asm/system.h>
++#include <asm/io.h>
++#include <asm/segment.h>
++#include <asm/bitops.h>
++#include <asm/system.h>
++#include <asm/kgdb_local.h>
++#ifdef CONFIG_KGDB_USER_CONSOLE
++extern void kgdb_console_finit(void);
++#endif
++#define PRNT_off
++#define TEST_EXISTANCE
++#ifdef PRNT
++#define dbprintk(s) printk s
++#else
++#define dbprintk(s)
++#endif
++#define TEST_INTERRUPT_off
++#ifdef TEST_INTERRUPT
++#define intprintk(s) printk s
++#else
++#define intprintk(s)
++#endif
++
++#define IRQ_T(info) ((info->flags & ASYNC_SHARE_IRQ) ? SA_SHIRQ : SA_INTERRUPT)
++
++#define	GDB_BUF_SIZE	512	/* power of 2, please */
++
++static char gdb_buf[GDB_BUF_SIZE];
++static int gdb_buf_in_inx;
++static atomic_t gdb_buf_in_cnt;
++static int gdb_buf_out_inx;
++
++struct async_struct *gdb_async_info;
++static int gdb_async_irq;
++
++#define outb_px(a,b) outb_p(b,a)
++
++static void program_uart(struct async_struct *info);
++static void write_char(struct async_struct *info, int chr);
++/*
++ * Get a byte from the hardware data buffer and return it
++ */
++static int
++read_data_bfr(struct async_struct *info)
++{
++	char it = inb_p(info->port + UART_LSR);
++
++	if (it & UART_LSR_DR)
++		return (inb_p(info->port + UART_RX));
++	/*
++	 * If we have a framing error assume somebody messed with
++	 * our uart.  Reprogram it and send '-' both ways...
++	 */
++	if (it & 0xc) {
++		program_uart(info);
++		write_char(info, '-');
++		return ('-');
++	}
++	return (-1);
++
++}				/* read_data_bfr */
++
++/*
++ * Get a char if available, return -1 if nothing available.
++ * Empty the receive buffer first, then look at the interface hardware.
++
++ * Locking here is a bit of a problem.	We MUST not lock out communication
++ * if we are trying to talk to gdb about a kgdb entry.	ON the other hand
++ * we can loose chars in the console pass thru if we don't lock.  It is also
++ * possible that we could hold the lock or be waiting for it when kgdb
++ * NEEDS to talk.  Since kgdb locks down the world, it does not need locks.
++ * We do, of course have possible issues with interrupting a uart operation,
++ * but we will just depend on the uart status to help keep that straight.
++
++ */
++static spinlock_t uart_interrupt_lock = SPIN_LOCK_UNLOCKED;
++#ifdef CONFIG_SMP
++extern spinlock_t kgdb_spinlock;
++#endif
++
++static int
++read_char(struct async_struct *info)
++{
++	int chr;
++	unsigned long flags;
++	local_irq_save(flags);
++#ifdef CONFIG_SMP
++	if (!spin_is_locked(&kgdb_spinlock)) {
++		spin_lock(&uart_interrupt_lock);
++	}
++#endif
++	if (atomic_read(&gdb_buf_in_cnt) != 0) {	/* intr routine has q'd chars */
++		chr = gdb_buf[gdb_buf_out_inx++];
++		gdb_buf_out_inx &= (GDB_BUF_SIZE - 1);
++		atomic_dec(&gdb_buf_in_cnt);
++	} else {
++		chr = read_data_bfr(info);
++	}
++#ifdef CONFIG_SMP
++	if (!spin_is_locked(&kgdb_spinlock)) {
++		spin_unlock(&uart_interrupt_lock);
++	}
++#endif
++	local_irq_restore(flags);
++	return (chr);
++}
++
++/*
++ * Wait until the interface can accept a char, then write it.
++ */
++static void
++write_char(struct async_struct *info, int chr)
++{
++	while (!(inb_p(info->port + UART_LSR) & UART_LSR_THRE)) ;
++
++	outb_p(chr, info->port + UART_TX);
++
++}				/* write_char */
++
++/*
++ * Mostly we don't need a spinlock, but since the console goes
++ * thru here with interrutps on, well, we need to catch those
++ * chars.
++ */
++/*
++ * This is the receiver interrupt routine for the GDB stub.
++ * It will receive a limited number of characters of input
++ * from the gdb  host machine and save them up in a buffer.
++ *
++ * When the gdb stub routine getDebugChar() is called it
++ * draws characters out of the buffer until it is empty and
++ * then reads directly from the serial port.
++ *
++ * We do not attempt to write chars from the interrupt routine
++ * since the stubs do all of that via putDebugChar() which
++ * writes one byte after waiting for the interface to become
++ * ready.
++ *
++ * The debug stubs like to run with interrupts disabled since,
++ * after all, they run as a consequence of a breakpoint in
++ * the kernel.
++ *
++ * Perhaps someone who knows more about the tty driver than I
++ * care to learn can make this work for any low level serial
++ * driver.
++ */
++static irqreturn_t
++gdb_interrupt(int irq, void *dev_id, struct pt_regs *regs)
++{
++	struct async_struct *info;
++	unsigned long flags;
++
++	info = gdb_async_info;
++	if (!info || !info->tty || irq != gdb_async_irq)
++		return IRQ_NONE;
++
++	local_irq_save(flags);
++	spin_lock(&uart_interrupt_lock);
++	do {
++		int chr = read_data_bfr(info);
++		intprintk(("Debug char on int: %x hex\n", chr));
++		if (chr < 0)
++			continue;
++
++		if (chr == 3) {	/* Ctrl-C means remote interrupt */
++			BREAKPOINT;
++			continue;
++		}
++
++		if (atomic_read(&gdb_buf_in_cnt) >= GDB_BUF_SIZE) {
++			/* buffer overflow tosses early char */
++			read_char(info);
++		}
++		gdb_buf[gdb_buf_in_inx++] = chr;
++		gdb_buf_in_inx &= (GDB_BUF_SIZE - 1);
++	} while (inb_p(info->port + UART_IIR) & UART_IIR_RDI);
++	spin_unlock(&uart_interrupt_lock);
++	local_irq_restore(flags);
++	return IRQ_HANDLED;
++}				/* gdb_interrupt */
++
++/*
++ * Just a NULL routine for testing.
++ */
++void
++gdb_null(void)
++{
++}				/* gdb_null */
++
++/* These structure are filled in with values defined in asm/kgdb_local.h
++ */
++static struct serial_state state = SB_STATE;
++static struct async_struct local_info = SB_INFO;
++static int ok_to_enable_ints = 0;
++static void kgdb_enable_ints_now(void);
++
++extern char *kgdb_version;
++/*
++ * Hook an IRQ for KGDB.
++ *
++ * This routine is called from putDebugChar, below.
++ */
++static int ints_disabled = 1;
++int
++gdb_hook_interrupt(struct async_struct *info, int verb)
++{
++	struct serial_state *state = info->state;
++	unsigned long flags;
++	int port;
++#ifdef TEST_EXISTANCE
++	int scratch, scratch2;
++#endif
++
++	/* The above fails if memory managment is not set up yet. 
++	 * Rather than fail the set up, just keep track of the fact
++	 * and pick up the interrupt thing later.
++	 */
++	gdb_async_info = info;
++	port = gdb_async_info->port;
++	gdb_async_irq = state->irq;
++	if (verb) {
++		printk("kgdb %s : port =%x, IRQ=%d, divisor =%d\n",
++		       kgdb_version,
++		       port,
++		       gdb_async_irq, gdb_async_info->state->custom_divisor);
++	}
++	local_irq_save(flags);
++#ifdef TEST_EXISTANCE
++	/* Existance test */
++	/* Should not need all this, but just in case.... */
++
++	scratch = inb_p(port + UART_IER);
++	outb_px(port + UART_IER, 0);
++	outb_px(0xff, 0x080);
++	scratch2 = inb_p(port + UART_IER);
++	outb_px(port + UART_IER, scratch);
++	if (scratch2) {
++		printk
++		    ("gdb_hook_interrupt: Could not clear IER, not a UART!\n");
++		local_irq_restore(flags);
++		return 1;	/* We failed; there's nothing here */
++	}
++	scratch2 = inb_p(port + UART_LCR);
++	outb_px(port + UART_LCR, 0xBF);	/* set up for StarTech test */
++	outb_px(port + UART_EFR, 0);	/* EFR is the same as FCR */
++	outb_px(port + UART_LCR, 0);
++	outb_px(port + UART_FCR, UART_FCR_ENABLE_FIFO);
++	scratch = inb_p(port + UART_IIR) >> 6;
++	if (scratch == 1) {
++		printk("gdb_hook_interrupt: Undefined UART type!"
++		       "  Not a UART! \n");
++		local_irq_restore(flags);
++		return 1;
++	} else {
++		dbprintk(("gdb_hook_interrupt: UART type "
++			  "is %d where 0=16450, 2=16550 3=16550A\n", scratch));
++	}
++	scratch = inb_p(port + UART_MCR);
++	outb_px(port + UART_MCR, UART_MCR_LOOP | scratch);
++	outb_px(port + UART_MCR, UART_MCR_LOOP | 0x0A);
++	scratch2 = inb_p(port + UART_MSR) & 0xF0;
++	outb_px(port + UART_MCR, scratch);
++	if (scratch2 != 0x90) {
++		printk("gdb_hook_interrupt: "
++		       "Loop back test failed! Not a UART!\n");
++		local_irq_restore(flags);
++		return scratch2 + 1000;	/* force 0 to fail */
++	}
++#endif				/* test existance */
++	program_uart(info);
++	local_irq_restore(flags);
++
++	return (0);
++
++}				/* gdb_hook_interrupt */
++
++static void
++program_uart(struct async_struct *info)
++{
++	int port = info->port;
++
++	(void) inb_p(port + UART_RX);
++	outb_px(port + UART_IER, 0);
++
++	(void) inb_p(port + UART_RX);	/* serial driver comments say */
++	(void) inb_p(port + UART_IIR);	/* this clears the interrupt regs */
++	(void) inb_p(port + UART_MSR);
++	outb_px(port + UART_LCR, UART_LCR_WLEN8 | UART_LCR_DLAB);
++	outb_px(port + UART_DLL, info->state->custom_divisor & 0xff);	/* LS */
++	outb_px(port + UART_DLM, info->state->custom_divisor >> 8);	/* MS  */
++	outb_px(port + UART_MCR, info->MCR);
++
++	outb_px(port + UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1 | UART_FCR_CLEAR_XMIT | UART_FCR_CLEAR_RCVR);	/* set fcr */
++	outb_px(port + UART_LCR, UART_LCR_WLEN8);	/* reset DLAB */
++	outb_px(port + UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1);	/* set fcr */
++	if (!ints_disabled) {
++		intprintk(("KGDB: Sending %d to port %x offset %d\n",
++			   gdb_async_info->IER,
++			   (int) gdb_async_info->port, UART_IER));
++		outb_px(gdb_async_info->port + UART_IER, gdb_async_info->IER);
++	}
++	return;
++}
++
++/*
++ * getDebugChar
++ *
++ * This is a GDB stub routine.	It waits for a character from the
++ * serial interface and then returns it.  If there is no serial
++ * interface connection then it returns a bogus value which will
++ * almost certainly cause the system to hang.  In the 
++ */
++int kgdb_in_isr = 0;
++int kgdb_in_lsr = 0;
++extern spinlock_t kgdb_spinlock;
++
++/* Caller takes needed protections */
++
++int
++getDebugChar(void)
++{
++	volatile int chr, dum, time, end_time;
++
++	dbprintk(("getDebugChar(port %x): ", gdb_async_info->port));
++
++	if (gdb_async_info == NULL) {
++		gdb_hook_interrupt(&local_info, 0);
++	}
++	/* 
++	 * This trick says if we wait a very long time and get
++	 * no char, return the -1 and let the upper level deal
++	 * with it.
++	 */
++	rdtsc(dum, time);
++	end_time = time + 2;
++	while (((chr = read_char(gdb_async_info)) == -1) &&
++	       (end_time - time) > 0) {
++		rdtsc(dum, time);
++	};
++	/*
++	 * This covers our butts if some other code messes with
++	 * our uart, hay, it happens :o)
++	 */
++	if (chr == -1)
++		program_uart(gdb_async_info);
++
++	dbprintk(("%c\n", chr > ' ' && chr < 0x7F ? chr : ' '));
++	return (chr);
++
++}				/* getDebugChar */
++
++static int count = 3;
++static spinlock_t one_at_atime = SPIN_LOCK_UNLOCKED;
++
++static int __init
++kgdb_enable_ints(void)
++{
++	if (gdb_async_info == NULL) {
++		gdb_hook_interrupt(&local_info, 1);
++	}
++	ok_to_enable_ints = 1;
++	kgdb_enable_ints_now();
++#ifdef CONFIG_KGDB_USER_CONSOLE
++	kgdb_console_finit();
++#endif
++	return 0;
++}
++
++#ifdef CONFIG_SERIAL_8250
++void shutdown_for_kgdb(struct async_struct *gdb_async_info);
++#endif
++
++#ifdef CONFIG_DISCONTIGMEM
++static inline int kgdb_mem_init_done(void)
++{
++	return highmem_start_page != NULL;
++}
++#else
++static inline int kgdb_mem_init_done(void)
++{
++	return max_mapnr != 0;
++}
++#endif
++
++static void
++kgdb_enable_ints_now(void)
++{
++	if (!spin_trylock(&one_at_atime))
++		return;
++	if (!ints_disabled)
++		goto exit;
++	if (kgdb_mem_init_done() &&
++			ints_disabled) {	/* don't try till mem init */
++#ifdef CONFIG_SERIAL_8250
++		/*
++		 * The ifdef here allows the system to be configured
++		 * without the serial driver.
++		 * Don't make it a module, however, it will steal the port
++		 */
++		shutdown_for_kgdb(gdb_async_info);
++#endif
++		ints_disabled = request_irq(gdb_async_info->state->irq,
++					    gdb_interrupt,
++					    IRQ_T(gdb_async_info),
++					    "KGDB-stub", NULL);
++		intprintk(("KGDB: request_irq returned %d\n", ints_disabled));
++	}
++	if (!ints_disabled) {
++		intprintk(("KGDB: Sending %d to port %x offset %d\n",
++			   gdb_async_info->IER,
++			   (int) gdb_async_info->port, UART_IER));
++		outb_px(gdb_async_info->port + UART_IER, gdb_async_info->IER);
++	}
++      exit:
++	spin_unlock(&one_at_atime);
++}
++
++/*
++ * putDebugChar
++ *
++ * This is a GDB stub routine.	It waits until the interface is ready
++ * to transmit a char and then sends it.  If there is no serial
++ * interface connection then it simply returns to its caller, having
++ * pretended to send the char.	Caller takes needed protections.
++ */
++void
++putDebugChar(int chr)
++{
++	dbprintk(("putDebugChar(port %x): chr=%02x '%c', ints_on=%d\n",
++		  gdb_async_info->port,
++		  chr,
++		  chr > ' ' && chr < 0x7F ? chr : ' ', ints_disabled ? 0 : 1));
++
++	if (gdb_async_info == NULL) {
++		gdb_hook_interrupt(&local_info, 0);
++	}
++
++	write_char(gdb_async_info, chr);	/* this routine will wait */
++	count = (chr == '#') ? 0 : count + 1;
++	if ((count == 2)) {	/* try to enable after */
++		if (ints_disabled & ok_to_enable_ints)
++			kgdb_enable_ints_now();	/* try to enable after */
++
++		/* We do this a lot because, well we really want to get these
++		 * interrupts.	The serial driver will clear these bits when it
++		 * initializes the chip.  Every thing else it does is ok, 
++		 * but this.
++		 */
++		if (!ints_disabled) {
++			outb_px(gdb_async_info->port + UART_IER,
++				gdb_async_info->IER);
++		}
++	}
++
++}				/* putDebugChar */
++
++module_init(kgdb_enable_ints);
+--- linux-2.6.0-test1/arch/i386/lib/Makefile	2003-06-26 22:07:23.000000000 -0700
++++ 25/arch/i386/lib/Makefile	2003-07-19 17:04:02.000000000 -0700
+@@ -9,4 +9,5 @@ lib-y = checksum.o delay.o \
+ 
+ lib-$(CONFIG_X86_USE_3DNOW) += mmx.o
+ lib-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o
++lib-$(CONFIG_KGDB) += kgdb_serial.o
+ lib-$(CONFIG_DEBUG_IOVIRT)  += iodebug.o
+--- linux-2.6.0-test1/arch/i386/mach-generic/bigsmp.c	2003-06-14 12:18:05.000000000 -0700
++++ 25/arch/i386/mach-generic/bigsmp.c	2003-07-19 17:04:13.000000000 -0700
+@@ -3,6 +3,10 @@
+  * Drives the local APIC in "clustered mode".
+  */
+ #define APIC_DEFINITION 1
++#include <linux/config.h>
++#include <linux/threads.h>
++#include <linux/cpumask.h>
++#include <asm/mpspec.h>
+ #include <asm/genapic.h>
+ #include <asm/fixmap.h>
+ #include <asm/apicdef.h>
+--- linux-2.6.0-test1/arch/i386/mach-generic/default.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/arch/i386/mach-generic/default.c	2003-07-19 17:04:13.000000000 -0700
+@@ -2,6 +2,10 @@
+  * Default generic APIC driver. This handles upto 8 CPUs.
+  */
+ #define APIC_DEFINITION 1
++#include <linux/config.h>
++#include <linux/threads.h>
++#include <linux/cpumask.h>
++#include <asm/mpspec.h>
+ #include <asm/mach-default/mach_apicdef.h>
+ #include <asm/genapic.h>
+ #include <asm/fixmap.h>
+--- linux-2.6.0-test1/arch/i386/mach-generic/probe.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/arch/i386/mach-generic/probe.c	2003-07-19 17:04:13.000000000 -0700
+@@ -3,11 +3,15 @@
+  * 
+  * Generic x86 APIC driver probe layer.
+  */  
++#include <linux/config.h>
++#include <linux/threads.h>
++#include <linux/cpumask.h>
+ #include <linux/string.h>
+ #include <linux/kernel.h>
+ #include <linux/ctype.h>
+ #include <linux/init.h>
+ #include <asm/fixmap.h>
++#include <asm/mpspec.h>
+ #include <asm/apicdef.h>
+ #include <asm/genapic.h>
+ 
+--- linux-2.6.0-test1/arch/i386/mach-generic/summit.c	2003-06-14 12:18:34.000000000 -0700
++++ 25/arch/i386/mach-generic/summit.c	2003-07-19 17:04:13.000000000 -0700
+@@ -2,6 +2,10 @@
+  * APIC driver for the IBM "Summit" chipset.
+  */
+ #define APIC_DEFINITION 1
++#include <linux/config.h>
++#include <linux/threads.h>
++#include <linux/cpumask.h>
++#include <asm/mpspec.h>
+ #include <asm/genapic.h>
+ #include <asm/fixmap.h>
+ #include <asm/apicdef.h>
+--- linux-2.6.0-test1/arch/i386/mach-visws/mpparse.c	2003-06-14 12:18:04.000000000 -0700
++++ 25/arch/i386/mach-visws/mpparse.c	2003-07-19 17:04:06.000000000 -0700
+@@ -26,7 +26,7 @@ unsigned int boot_cpu_physical_apicid = 
+ unsigned int boot_cpu_logical_apicid = -1U;
+ 
+ /* Bitmask of physically existing CPUs */
+-unsigned long phys_cpu_present_map;
++cpumask_t phys_cpu_present_map;
+ 
+ 
+ /*
+@@ -38,6 +38,7 @@ unsigned long phys_cpu_present_map;
+ void __init MP_processor_info (struct mpc_config_processor *m)
+ {
+  	int ver, logical_apicid;
++	cpumask_t apic_cpus;
+  	
+ 	if (!(m->mpc_cpuflag & CPU_ENABLED))
+ 		return;
+@@ -62,7 +63,8 @@ void __init MP_processor_info (struct mp
+ 	}
+ 	ver = m->mpc_apicver;
+ 
+-	phys_cpu_present_map |= apicid_to_cpu_present(m->mpc_apicid);
++	apic_cpus = apicid_to_cpu_present(m->mpc_apicid);
++	cpus_or(phys_cpu_present_map, phys_cpu_present_map, apic_cpus);
+ 	/*
+ 	 * Validate version
+ 	 */
+--- linux-2.6.0-test1/arch/i386/mach-voyager/voyager_smp.c	2003-06-14 12:18:07.000000000 -0700
++++ 25/arch/i386/mach-voyager/voyager_smp.c	2003-07-19 17:04:06.000000000 -0700
+@@ -75,15 +75,15 @@ static int voyager_extended_cpus = 1;
+ int smp_found_config = 0;
+ 
+ /* Used for the invalidate map that's also checked in the spinlock */
+-volatile unsigned long smp_invalidate_needed;
++static volatile unsigned long smp_invalidate_needed;
+ 
+ /* Bitmask of currently online CPUs - used by setup.c for
+    /proc/cpuinfo, visible externally but still physical */
+-unsigned long cpu_online_map = 0;
++cpumask_t cpu_online_map = CPU_MASK_NONE;
+ 
+ /* Bitmask of CPUs present in the system - exported by i386_syms.c, used
+  * by scheduler but indexed physically */
+-unsigned long phys_cpu_present_map = 0;
++cpumask_t phys_cpu_present_map = CPU_MASK_NONE;
+ 
+ /* estimate of time used to flush the SMP-local cache - used in
+  * processor affinity calculations */
+@@ -108,7 +108,7 @@ static void enable_local_vic_irq(unsigne
+ static void disable_local_vic_irq(unsigned int irq);
+ static void before_handle_vic_irq(unsigned int irq);
+ static void after_handle_vic_irq(unsigned int irq);
+-static void set_vic_irq_affinity(unsigned int irq, unsigned long mask);
++static void set_vic_irq_affinity(unsigned int irq, cpumask_t mask);
+ static void ack_vic_irq(unsigned int irq);
+ static void vic_enable_cpi(void);
+ static void do_boot_cpu(__u8 cpuid);
+@@ -128,13 +128,12 @@ send_one_QIC_CPI(__u8 cpu, __u8 cpi)
+ static inline void
+ send_QIC_CPI(__u32 cpuset, __u8 cpi)
+ {
+-	int mask;
+-	__u8 cpu;
++	int cpu;
+ 
+-	for_each_cpu(cpu, mask) {
++	for_each_cpu(cpu, mk_cpumask_const(cpu_online_map)) {
+ 		if(cpuset & (1<<cpu)) {
+ #ifdef VOYAGER_DEBUG
+-			if(!test_bit(cpu, cpu_online_map))
++			if(!cpu_isset(cpu, cpu_online_map))
+ 				VDEBUG(("CPU%d sending cpi %d to CPU%d not in cpu_online_map\n", hard_smp_processor_id(), cpi, cpu));
+ #endif
+ 			send_one_QIC_CPI(cpu, cpi - QIC_CPI_OFFSET);
+@@ -155,7 +154,7 @@ static inline void
+ send_CPI_allbutself(__u8 cpi)
+ {
+ 	__u8 cpu = smp_processor_id();
+-	__u32 mask = (cpu_online_map & (~(1<<cpu)));
++	__u32 mask = cpus_coerce(cpu_online_map) & ~(1 << cpu);
+ 	send_CPI(mask, cpi);
+ }
+ 
+@@ -243,11 +242,11 @@ static __u32 cpu_booted_map;
+ 
+ /* the synchronize flag used to hold all secondary CPUs spinning in
+  * a tight loop until the boot sequence is ready for them */
+-static unsigned long smp_commenced_mask = 0;
++static cpumask_t smp_commenced_mask = CPU_MASK_NONE;
+ 
+ /* This is for the new dynamic CPU boot code */
+-volatile unsigned long cpu_callin_map = 0;
+-volatile unsigned long cpu_callout_map = 0;
++volatile cpumask_t cpu_callin_map = CPU_MASK_NONE;
++volatile cpumask_t cpu_callout_map = CPU_MASK_NONE;
+ 
+ /* The per processor IRQ masks (these are usually kept in sync) */
+ static __u16 vic_irq_mask[NR_CPUS] __cacheline_aligned;
+@@ -395,7 +394,7 @@ find_smp_config(void)
+ 	for(i=0; i<NR_CPUS; i++) {
+ 		cpu_irq_affinity[i] = ~0;
+ 	}
+-	cpu_online_map = (1<<boot_cpu_id);
++	cpu_online_map = cpumask_of_cpu(boot_cpu_id);
+ 
+ 	/* The boot CPU must be extended */
+ 	voyager_extended_vic_processors = 1<<boot_cpu_id;
+@@ -404,11 +403,11 @@ find_smp_config(void)
+ 	/* set up everything for just this CPU, we can alter
+ 	 * this as we start the other CPUs later */
+ 	/* now get the CPU disposition from the extended CMOS */
+-	phys_cpu_present_map = voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK);
+-	phys_cpu_present_map |= voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK + 1) << 8;
+-	phys_cpu_present_map |= voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK + 2) << 16;
+-	phys_cpu_present_map |= voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK + 3) << 24;
+-	printk("VOYAGER SMP: phys_cpu_present_map = 0x%lx\n", phys_cpu_present_map);
++	phys_cpu_present_map = cpus_promote(voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK));
++	cpus_coerce(phys_cpu_present_map) |= voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK + 1) << 8;
++	cpus_coerce(phys_cpu_present_map) |= voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK + 2) << 16;
++	cpus_coerce(phys_cpu_present_map) |= voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK + 3) << 24;
++	printk("VOYAGER SMP: phys_cpu_present_map = 0x%lx\n", cpus_coerce(phys_cpu_present_map));
+ 	/* Here we set up the VIC to enable SMP */
+ 	/* enable the CPIs by writing the base vector to their register */
+ 	outb(VIC_DEFAULT_CPI_BASE, VIC_CPI_BASE_REGISTER);
+@@ -509,18 +508,18 @@ start_secondary(void *unused)
+ 	 * permission to proceed.  Without this, the new per CPU stuff
+ 	 * in the softirqs will fail */
+ 	local_irq_disable();
+-	set_bit(cpuid, &cpu_callin_map);
++	cpu_set(cpuid, cpu_callin_map);
+ 
+ 	/* signal that we're done */
+ 	cpu_booted_map = 1;
+ 
+-	while (!test_bit(cpuid, &smp_commenced_mask))
++	while (!cpu_isset(cpuid, smp_commenced_mask))
+ 		rep_nop();
+ 	local_irq_enable();
+ 
+ 	local_flush_tlb();
+ 
+-	set_bit(cpuid, &cpu_online_map);
++	cpu_set(cpuid, cpu_online_map);
+ 	wmb();
+ 	return cpu_idle();
+ }
+@@ -674,14 +673,14 @@ do_boot_cpu(__u8 cpu)
+ 	free_page((unsigned long)page_table_copies);
+ #endif
+ 	  
+-	if(cpu_booted_map) {
++	if (cpu_booted_map) {
+ 		VDEBUG(("CPU%d: Booted successfully, back in CPU %d\n",
+ 			cpu, smp_processor_id()));
+ 	
+ 		printk("CPU%d: ", cpu);
+ 		print_cpu_info(&cpu_data[cpu]);
+ 		wmb();
+-		set_bit(cpu, &cpu_callout_map);
++		cpu_set(cpu, cpu_callout_map);
+ 	}
+ 	else {
+ 		printk("CPU%d FAILED TO BOOT: ", cpu);
+@@ -708,13 +707,12 @@ smp_boot_cpus(void)
+ 		/* now that the cat has probed the Voyager System Bus, sanity
+ 		 * check the cpu map */
+ 		if( ((voyager_quad_processors | voyager_extended_vic_processors)
+-		     & phys_cpu_present_map) != phys_cpu_present_map) {
++		     & cpus_coerce(phys_cpu_present_map)) != cpus_coerce(phys_cpu_present_map)) {
+ 			/* should panic */
+ 			printk("\n\n***WARNING*** Sanity check of CPU present map FAILED\n");
+ 		}
+-	} else if(voyager_level == 4) {
+-		voyager_extended_vic_processors = phys_cpu_present_map;
+-	}
++	} else if(voyager_level == 4)
++		voyager_extended_vic_processors = cpus_coerce(phys_cpu_present_map);
+ 
+ 	/* this sets up the idle task to run on the current cpu */
+ 	voyager_extended_cpus = 1;
+@@ -740,13 +738,13 @@ smp_boot_cpus(void)
+ 	/* enable our own CPIs */
+ 	vic_enable_cpi();
+ 
+-	set_bit(boot_cpu_id, &cpu_online_map);
+-	set_bit(boot_cpu_id, &cpu_callout_map);
++	cpu_set(boot_cpu_id, cpu_online_map);
++	cpu_set(boot_cpu_id, cpu_callout_map);
+ 	
+ 	/* loop over all the extended VIC CPUs and boot them.  The 
+ 	 * Quad CPUs must be bootstrapped by their extended VIC cpu */
+ 	for(i = 0; i < NR_CPUS; i++) {
+-		if( i == boot_cpu_id || ((1<<i) & (phys_cpu_present_map) ) == 0)
++		if(i == boot_cpu_id || !cpu_isset(i, phys_cpu_present_map))
+ 			continue;
+ 		do_boot_cpu(i);
+ 		/* This udelay seems to be needed for the Quad boots
+@@ -758,7 +756,7 @@ smp_boot_cpus(void)
+ 	{
+ 		unsigned long bogosum = 0;
+ 		for (i = 0; i < NR_CPUS; i++)
+-			if (cpu_online_map & (1<<i))
++			if (cpu_isset(i, cpu_online_map))
+ 				bogosum += cpu_data[i].loops_per_jiffy;
+ 		printk(KERN_INFO "Total of %d processors activated (%lu.%02lu BogoMIPS).\n",
+ 			cpucount+1,
+@@ -865,7 +863,7 @@ leave_mm (unsigned long cpu)
+ {
+ 	if (cpu_tlbstate[cpu].state == TLBSTATE_OK)
+ 		BUG();
+-	clear_bit(cpu,  &cpu_tlbstate[cpu].active_mm->cpu_vm_mask);
++	cpu_clear(cpu,  cpu_tlbstate[cpu].active_mm->cpu_vm_mask);
+ 	load_cr3(swapper_pg_dir);
+ }
+ 
+@@ -878,7 +876,7 @@ smp_invalidate_interrupt(void)
+ {
+ 	__u8 cpu = get_cpu();
+ 
+-	if(!test_bit(cpu, &smp_invalidate_needed))
++	if (!(smp_invalidate_needed & (1UL << cpu)))
+ 		goto out;
+ 	/* This will flood messages.  Don't uncomment unless you see
+ 	 * Problems with cross cpu invalidation
+@@ -895,7 +893,7 @@ smp_invalidate_interrupt(void)
+ 		} else
+ 			leave_mm(cpu);
+ 	}
+-	clear_bit(cpu, &smp_invalidate_needed);
++	smp_invalidate_needed |= 1UL << cpu;
+  out:
+ 	put_cpu_no_resched();
+ }
+@@ -912,7 +910,7 @@ flush_tlb_others (unsigned long cpumask,
+ 
+ 	if (!cpumask)
+ 		BUG();
+-	if ((cpumask & cpu_online_map) != cpumask)
++	if ((cpumask & cpus_coerce(cpu_online_map)) != cpumask)
+ 		BUG();
+ 	if (cpumask & (1 << smp_processor_id()))
+ 		BUG();
+@@ -954,7 +952,7 @@ flush_tlb_current_task(void)
+ 
+ 	preempt_disable();
+ 
+-	cpu_mask = mm->cpu_vm_mask & ~(1 << smp_processor_id());
++	cpu_mask = cpus_coerce(mm->cpu_vm_mask) & ~(1 << smp_processor_id());
+ 	local_flush_tlb();
+ 	if (cpu_mask)
+ 		flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
+@@ -970,7 +968,7 @@ flush_tlb_mm (struct mm_struct * mm)
+ 
+ 	preempt_disable();
+ 
+-	cpu_mask = mm->cpu_vm_mask & ~(1 << smp_processor_id());
++	cpu_mask = cpus_coerce(mm->cpu_vm_mask) & ~(1 << smp_processor_id());
+ 
+ 	if (current->active_mm == mm) {
+ 		if (current->mm)
+@@ -991,7 +989,7 @@ void flush_tlb_page(struct vm_area_struc
+ 
+ 	preempt_disable();
+ 
+-	cpu_mask = mm->cpu_vm_mask & ~(1 << smp_processor_id());
++	cpu_mask = cpus_coerce(mm->cpu_vm_mask) & ~(1 << smp_processor_id());
+ 	if (current->active_mm == mm) {
+ 		if(current->mm)
+ 			__flush_tlb_one(va);
+@@ -1033,7 +1031,7 @@ static void
+ smp_stop_cpu_function(void *dummy)
+ {
+ 	VDEBUG(("VOYAGER SMP: CPU%d is STOPPING\n", smp_processor_id()));
+-	clear_bit(smp_processor_id(), &cpu_online_map);
++	cpu_clear(smp_processor_id(), cpu_online_map);
+ 	local_irq_disable();
+ 	for(;;)
+ 	       __asm__("hlt");
+@@ -1100,7 +1098,7 @@ smp_call_function (void (*func) (void *i
+ 		   int wait)
+ {
+ 	struct call_data_struct data;
+-	__u32 mask = cpu_online_map;
++	__u32 mask = cpus_coerce(cpu_online_map);
+ 
+ 	mask &= ~(1<<smp_processor_id());
+ 
+@@ -1451,8 +1449,7 @@ smp_intr_init(void)
+ static void
+ send_CPI(__u32 cpuset, __u8 cpi)
+ {
+-	int mask;
+-	__u8 cpu;
++	int cpu;
+ 	__u32 quad_cpuset = (cpuset & voyager_quad_processors);
+ 
+ 	if(cpi < VIC_START_FAKE_CPI) {
+@@ -1467,7 +1464,7 @@ send_CPI(__u32 cpuset, __u8 cpi)
+ 	cpuset &= 0xff;		/* only first 8 CPUs vaild for VIC CPI */
+ 	if(cpuset == 0)
+ 		return;
+-	for_each_cpu(cpu, mask) {
++	for_each_cpu(cpu, mk_cpumask_const(cpu_online_map)) {
+ 		if(cpuset & (1<<cpu))
+ 			set_bit(cpi, &vic_cpi_mailbox[cpu]);
+ 	}
+@@ -1571,10 +1568,9 @@ startup_vic_irq(unsigned int irq)
+ static void
+ enable_vic_irq(unsigned int irq)
+ {
+-	int tmpmask;
+ 	/* linux doesn't to processor-irq affinity, so enable on
+ 	 * all CPUs we know about */
+-	__u8 cpu = smp_processor_id(), real_cpu;
++	int cpu = smp_processor_id(), real_cpu;
+ 	__u16 mask = (1<<irq);
+ 	__u32 processorList = 0;
+ 	unsigned long flags;
+@@ -1582,7 +1578,7 @@ enable_vic_irq(unsigned int irq)
+ 	VDEBUG(("VOYAGER: enable_vic_irq(%d) CPU%d affinity 0x%lx\n",
+ 		irq, cpu, cpu_irq_affinity[cpu]));
+ 	spin_lock_irqsave(&vic_irq_lock, flags);
+-	for_each_cpu(real_cpu, tmpmask) {
++	for_each_cpu(real_cpu, mk_cpumask_const(cpu_online_map)) {
+ 		if(!(voyager_extended_vic_processors & (1<<real_cpu)))
+ 			continue;
+ 		if(!(cpu_irq_affinity[real_cpu] & mask)) {
+@@ -1727,7 +1723,7 @@ after_handle_vic_irq(unsigned int irq)
+ 
+ 			printk("VOYAGER SMP: CPU%d lost interrupt %d\n",
+ 			       cpu, irq);
+-			for_each_cpu(real_cpu, mask) {
++			for_each_cpu(real_cpu, mk_cpumask_const(mask)) {
+ 
+ 				outb(VIC_CPU_MASQUERADE_ENABLE | real_cpu,
+ 				     VIC_PROCESSOR_ID);
+@@ -1783,15 +1779,16 @@ after_handle_vic_irq(unsigned int irq)
+  * the selected processors */
+ 
+ void
+-set_vic_irq_affinity(unsigned int irq, unsigned long mask) 
++set_vic_irq_affinity(unsigned int irq, cpumask_t mask)
+ {
+ 	/* Only extended processors handle interrupts */
+-	unsigned long real_mask = mask & voyager_extended_vic_processors;
+-	unsigned long irq_mask = (1<<irq);
+-	int tmpmask;
+-	__u8 cpu;
++	unsigned long real_mask;
++	unsigned long irq_mask = 1 << irq;
++	int cpu;
++
++	real_mask = cpus_coerce(mask) & voyager_extended_vic_processors;
+ 	
+-	if(mask == 0)
++	if(cpus_coerce(mask) == 0)
+ 		/* can't have no cpu's to accept the interrupt -- extremely
+ 		 * bad things will happen */
+ 		return;
+@@ -1811,8 +1808,8 @@ set_vic_irq_affinity(unsigned int irq, u
+ 		 * bus) */
+ 		return;
+ 
+-	for_each_cpu(cpu, tmpmask) {
+-		unsigned long cpu_mask = (1<<cpu);
++	for_each_cpu(cpu, mk_cpumask_const(cpu_online_map)) {
++		unsigned long cpu_mask = 1 << cpu;
+ 		
+ 		if(cpu_mask & real_mask) {
+ 			/* enable the interrupt for this cpu */
+@@ -1874,11 +1871,10 @@ vic_enable_cpi(void)
+ void
+ voyager_smp_dump()
+ {
+-	int mask;
+-	__u8 old_cpu = smp_processor_id(), cpu;
++	int old_cpu = smp_processor_id(), cpu;
+ 
+ 	/* dump the interrupt masks of each processor */
+-	for_each_cpu(cpu, mask) {
++	for_each_cpu(cpu, mk_cpumask_const(cpu_online_map)) {
+ 		__u16 imr, isr, irr;
+ 		unsigned long flags;
+ 
+@@ -1936,23 +1932,23 @@ smp_prepare_cpus(unsigned int max_cpus)
+ 
+ void __devinit smp_prepare_boot_cpu(void)
+ {
+-	set_bit(smp_processor_id(), &cpu_online_map);
+-	set_bit(smp_processor_id(), &cpu_callout_map);
++	cpu_set(smp_processor_id(), cpu_online_map);
++	cpu_set(smp_processor_id(), cpu_callout_map);
+ }
+ 
+ int __devinit
+ __cpu_up(unsigned int cpu)
+ {
+ 	/* This only works at boot for x86.  See "rewrite" above. */
+-	if (test_bit(cpu, &smp_commenced_mask))
++	if (cpu_isset(cpu, smp_commenced_mask))
+ 		return -ENOSYS;
+ 
+ 	/* In case one didn't come up */
+-	if (!test_bit(cpu, &cpu_callin_map))
++	if (!cpu_isset(cpu, cpu_callin_map))
+ 		return -EIO;
+ 	/* Unleash the CPU! */
+-	set_bit(cpu, &smp_commenced_mask);
+-	while (!test_bit(cpu, &cpu_online_map))
++	cpu_set(cpu, smp_commenced_mask);
++	while (!cpu_isset(cpu, cpu_online_map))
+ 		mb();
+ 	return 0;
+ }
+--- linux-2.6.0-test1/arch/i386/Makefile	2003-06-26 22:07:23.000000000 -0700
++++ 25/arch/i386/Makefile	2003-07-19 17:04:05.000000000 -0700
+@@ -85,6 +85,9 @@ mcore-$(CONFIG_X86_ES7000)	:= mach-es700
+ # default subarch .h files
+ mflags-y += -Iinclude/asm-i386/mach-default
+ 
++mflags-$(CONFIG_KGDB) += -ggdb
++mflags-$(CONFIG_KGDB_MORE) += $(shell echo $(CONFIG_KGDB_OPTIONS) | sed -e 's/"//g')
++
+ head-y := arch/i386/kernel/head.o arch/i386/kernel/init_task.o
+ 
+ libs-y 					+= arch/i386/lib/
+--- linux-2.6.0-test1/arch/i386/mm/fault.c	2003-06-26 22:07:23.000000000 -0700
++++ 25/arch/i386/mm/fault.c	2003-07-19 17:07:16.000000000 -0700
+@@ -236,6 +236,12 @@ no_context:
+  * Oops. The kernel tried to access some bad page. We'll have to
+  * terminate things with extreme prejudice.
+  */
++#ifdef CONFIG_KGDB
++        if (!user_mode(regs)){
++                kgdb_handle_exception(14,SIGBUS, error_code, regs);
++                return;
++        }
++#endif
+ 
+ 	bust_spinlocks(1);
+ 
+@@ -247,6 +253,13 @@ no_context:
+ 	printk(" printing eip:\n");
+ 	printk("%08lx\n", regs->eip);
+ 	asm("movl %%cr3,%0":"=r" (page));
++#ifdef CONFIG_HIGHPMD /* Oh boy. Error reporting is going to blow major goats. */
++	printk(KERN_ALERT "%%cr3 = 0x%lx\n", page);
++	/* Mask off flag bits. It should end up 32B-aligned. */
++	page &= ~(PTRS_PER_PGD*sizeof(pgd_t) - 1);
++	printk(KERN_ALERT "*pdpte = 0x%Lx\n",
++			pgd_val(((pgd_t *)__va(page))[address >> PGDIR_SHIFT]));
++#else /* !CONFIG_HIGHPMD */
+ 	page = ((unsigned long *) __va(page))[address >> 22];
+ 	printk(KERN_ALERT "*pde = %08lx\n", page);
+ 	/*
+@@ -262,7 +275,8 @@ no_context:
+ 		page = ((unsigned long *) __va(page))[address >> PAGE_SHIFT];
+ 		printk(KERN_ALERT "*pte = %08lx\n", page);
+ 	}
+-#endif
++#endif /* !CONFIG_HIGHPTE */
++#endif /* CONFIG_HIGHPMD */
+ 	die("Oops", regs, error_code);
+ 	bust_spinlocks(0);
+ 	do_exit(SIGKILL);
+@@ -330,8 +344,8 @@ vmalloc_fault:
+ 		 * and redundant with the set_pmd() on non-PAE.
+ 		 */
+ 
+-		pmd = pmd_offset(pgd, address);
+-		pmd_k = pmd_offset(pgd_k, address);
++		pmd = pmd_offset_kernel(pgd, address);
++		pmd_k = pmd_offset_kernel(pgd_k, address);
+ 		if (!pmd_present(*pmd_k))
+ 			goto no_context;
+ 		set_pmd(pmd, *pmd_k);
+--- linux-2.6.0-test1/arch/i386/mm/hugetlbpage.c	2003-06-22 12:04:43.000000000 -0700
++++ 25/arch/i386/mm/hugetlbpage.c	2003-07-19 17:07:16.000000000 -0700
+@@ -87,8 +87,8 @@ static pte_t *huge_pte_alloc(struct mm_s
+ 	pmd_t *pmd = NULL;
+ 
+ 	pgd = pgd_offset(mm, addr);
+-	pmd = pmd_alloc(mm, pgd, addr);
+-	return (pte_t *) pmd;
++	pmd = pmd_alloc_map(mm, pgd, addr);
++	return (pte_t *)pmd;
+ }
+ 
+ static pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
+@@ -97,8 +97,8 @@ static pte_t *huge_pte_offset(struct mm_
+ 	pmd_t *pmd = NULL;
+ 
+ 	pgd = pgd_offset(mm, addr);
+-	pmd = pmd_offset(pgd, addr);
+-	return (pte_t *) pmd;
++	pmd = pmd_offset_map_nested(pgd, addr);
++	return (pte_t *)pmd;
+ }
+ 
+ static void set_huge_pte(struct mm_struct *mm, struct vm_area_struct *vma, struct page *page, pte_t * page_table, int write_access)
+@@ -145,6 +145,8 @@ int copy_hugetlb_page_range(struct mm_st
+ 		ptepage = pte_page(entry);
+ 		get_page(ptepage);
+ 		set_pte(dst_pte, entry);
++		pmd_unmap(dst_pte);
++		pmd_unmap_nested(src_pte);
+ 		dst->rss += (HPAGE_SIZE / PAGE_SIZE);
+ 		addr += HPAGE_SIZE;
+ 	}
+@@ -182,6 +184,7 @@ follow_hugetlb_page(struct mm_struct *mm
+ 
+ 			get_page(page);
+ 			pages[i] = page;
++			pmd_unmap_nested(pte);
+ 		}
+ 
+ 		if (vmas)
+@@ -271,6 +274,7 @@ follow_huge_pmd(struct mm_struct *mm, un
+ 		page += ((address & ~HPAGE_MASK) >> PAGE_SHIFT);
+ 		get_page(page);
+ 	}
++	pmd_unmap(pmd);
+ 	return page;
+ }
+ #endif
+@@ -314,6 +318,7 @@ void unmap_hugepage_range(struct vm_area
+ 		page = pte_page(*pte);
+ 		huge_page_release(page);
+ 		pte_clear(pte);
++		pmd_unmap_nested(pte);
+ 	}
+ 	mm->rss -= (end - start) >> PAGE_SHIFT;
+ 	flush_tlb_range(vma, start, end);
+@@ -348,8 +353,10 @@ int hugetlb_prefault(struct address_spac
+ 			ret = -ENOMEM;
+ 			goto out;
+ 		}
+-		if (!pte_none(*pte))
++		if (!pte_none(*pte)) {
++			pmd_unmap(pte);
+ 			continue;
++		}
+ 
+ 		idx = ((addr - vma->vm_start) >> HPAGE_SHIFT)
+ 			+ (vma->vm_pgoff >> (HPAGE_SHIFT - PAGE_SHIFT));
+@@ -358,16 +365,19 @@ int hugetlb_prefault(struct address_spac
+ 			page = alloc_hugetlb_page();
+ 			if (!page) {
+ 				ret = -ENOMEM;
++				pmd_unmap(pte);
+ 				goto out;
+ 			}
+ 			ret = add_to_page_cache(page, mapping, idx, GFP_ATOMIC);
+ 			unlock_page(page);
+ 			if (ret) {
+ 				free_huge_page(page);
++				pmd_unmap(pte);
+ 				goto out;
+ 			}
+ 		}
+ 		set_huge_pte(mm, vma, page, pte, vma->vm_flags & VM_WRITE);
++		pmd_unmap(pte);
+ 	}
+ out:
+ 	spin_unlock(&mm->page_table_lock);
+--- linux-2.6.0-test1/arch/i386/mm/init.c	2003-06-26 22:07:23.000000000 -0700
++++ 25/arch/i386/mm/init.c	2003-07-19 17:07:16.000000000 -0700
+@@ -20,9 +20,6 @@
+ #include <linux/swap.h>
+ #include <linux/smp.h>
+ #include <linux/init.h>
+-#ifdef CONFIG_BLK_DEV_INITRD
+-#include <linux/blk.h>
+-#endif
+ #include <linux/highmem.h>
+ #include <linux/pagemap.h>
+ #include <linux/bootmem.h>
+@@ -59,10 +56,10 @@ static pmd_t * __init one_md_table_init(
+ #ifdef CONFIG_X86_PAE
+ 	pmd_table = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
+ 	set_pgd(pgd, __pgd(__pa(pmd_table) | _PAGE_PRESENT));
+-	if (pmd_table != pmd_offset(pgd, 0)) 
++	if (pmd_table != pmd_offset_kernel(pgd, 0))
+ 		BUG();
+ #else
+-	pmd_table = pmd_offset(pgd, 0);
++	pmd_table = pmd_offset_kernel(pgd, 0);
+ #endif
+ 
+ 	return pmd_table;
+@@ -113,7 +110,7 @@ static void __init page_table_range_init
+ 		if (pgd_none(*pgd)) 
+ 			one_md_table_init(pgd);
+ 
+-		pmd = pmd_offset(pgd, vaddr);
++		pmd = pmd_offset_kernel(pgd, vaddr);
+ 		for (; (pmd_idx < PTRS_PER_PMD) && (vaddr != end); pmd++, pmd_idx++) {
+ 			if (pmd_none(*pmd)) 
+ 				one_page_table_init(pmd);
+@@ -194,7 +191,7 @@ pte_t *kmap_pte;
+ pgprot_t kmap_prot;
+ 
+ #define kmap_get_fixmap_pte(vaddr)					\
+-	pte_offset_kernel(pmd_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr))
++	pte_offset_kernel(pmd_offset_kernel(pgd_offset_k(vaddr), (vaddr)), (vaddr))
+ 
+ void __init kmap_init(void)
+ {
+@@ -218,7 +215,7 @@ void __init permanent_kmaps_init(pgd_t *
+ 	page_table_range_init(vaddr, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base);
+ 
+ 	pgd = swapper_pg_dir + pgd_index(vaddr);
+-	pmd = pmd_offset(pgd, vaddr);
++	pmd = pmd_offset_kernel(pgd, vaddr);
+ 	pte = pte_offset_kernel(pmd, vaddr);
+ 	pkmap_page_table = pte;	
+ }
+@@ -512,20 +509,19 @@ void __init mem_init(void)
+ #endif
+ }
+ 
+-#ifdef CONFIG_X86_PAE
+-struct kmem_cache_s *pae_pgd_cachep;
++kmem_cache_t *pgd_cache;
+ 
+ void __init pgtable_cache_init(void)
+ {
+-        /*
+-         * PAE pgds must be 16-byte aligned:
+-         */
+-        pae_pgd_cachep = kmem_cache_create("pae_pgd", 32, 0,
+-                SLAB_HWCACHE_ALIGN | SLAB_MUST_HWCACHE_ALIGN, NULL, NULL);
+-        if (!pae_pgd_cachep)
+-                panic("init_pae(): Cannot alloc pae_pgd SLAB cache");
++	pgd_cache = kmem_cache_create("pgd",
++				PTRS_PER_PGD*sizeof(pgd_t),
++				0,
++				SLAB_HWCACHE_ALIGN | SLAB_MUST_HWCACHE_ALIGN,
++				pgd_ctor,
++				PTRS_PER_PMD == 1 ? pgd_dtor : NULL);
++	if (!pgd_cache)
++		panic("pgtable_cache_init(): Cannot create pgd cache");
+ }
+-#endif
+ 
+ /*
+  * This function cannot be __init, since exceptions don't work in that
+@@ -565,7 +561,7 @@ void free_initmem(void)
+ 		free_page(addr);
+ 		totalram_pages++;
+ 	}
+-	printk (KERN_INFO "Freeing unused kernel memory: %dk freed\n", (&__init_end - &__init_begin) >> 10);
++	printk (KERN_INFO "Freeing unused kernel memory: %dk freed\n", (__init_end - __init_begin) >> 10);
+ }
+ 
+ #ifdef CONFIG_BLK_DEV_INITRD
+--- linux-2.6.0-test1/arch/i386/mm/ioremap.c	2003-06-14 12:18:04.000000000 -0700
++++ 25/arch/i386/mm/ioremap.c	2003-07-19 17:07:16.000000000 -0700
+@@ -82,7 +82,7 @@ static int remap_area_pages(unsigned lon
+ 	spin_lock(&init_mm.page_table_lock);
+ 	do {
+ 		pmd_t *pmd;
+-		pmd = pmd_alloc(&init_mm, dir, address);
++		pmd = pmd_alloc_kernel(&init_mm, dir, address);
+ 		error = -ENOMEM;
+ 		if (!pmd)
+ 			break;
+--- linux-2.6.0-test1/arch/i386/mm/pageattr.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/i386/mm/pageattr.c	2003-07-19 17:07:16.000000000 -0700
+@@ -23,7 +23,7 @@ static inline pte_t *lookup_address(unsi
+ 	pmd_t *pmd;
+ 	if (pgd_none(*pgd))
+ 		return NULL;
+-	pmd = pmd_offset(pgd, address); 	       
++	pmd = pmd_offset_kernel(pgd, address);
+ 	if (pmd_none(*pmd))
+ 		return NULL;
+ 	if (pmd_large(*pmd))
+@@ -67,19 +67,22 @@ static void flush_kernel_map(void *dummy
+ 
+ static void set_pmd_pte(pte_t *kpte, unsigned long address, pte_t pte) 
+ { 
++	struct page *page;
++	unsigned long flags;
++
+ 	set_pte_atomic(kpte, pte); 	/* change init_mm */
+-#ifndef CONFIG_X86_PAE
+-	{
+-		struct list_head *l;
+-		spin_lock(&mmlist_lock);
+-		list_for_each(l, &init_mm.mmlist) { 
+-			struct mm_struct *mm = list_entry(l, struct mm_struct, mmlist);
+-			pmd_t *pmd = pmd_offset(pgd_offset(mm, address), address);
+-			set_pte_atomic((pte_t *)pmd, pte);
+-		} 
+-		spin_unlock(&mmlist_lock);
++	if (PTRS_PER_PMD > 1)
++		return;
++
++	spin_lock_irqsave(&pgd_lock, flags);
++	list_for_each_entry(page, &pgd_list, lru) {
++		pgd_t *pgd;
++		pmd_t *pmd;
++		pgd = (pgd_t *)page_address(page) + pgd_index(address);
++		pmd = pmd_offset_kernel(pgd, address);
++		set_pte_atomic((pte_t *)pmd, pte);
+ 	}
+-#endif
++	spin_unlock_irqrestore(&pgd_lock, flags);
+ }
+ 
+ /* 
+@@ -89,7 +92,7 @@ static void set_pmd_pte(pte_t *kpte, uns
+ static inline void revert_page(struct page *kpte_page, unsigned long address)
+ {
+ 	pte_t *linear = (pte_t *) 
+-		pmd_offset(pgd_offset(&init_mm, address), address);
++		pmd_offset_kernel(pgd_offset_k(address), address);
+ 	set_pmd_pte(linear,  address,
+ 		    pfn_pte((__pa(address) & LARGE_PAGE_MASK) >> PAGE_SHIFT,
+ 			    PAGE_KERNEL_LARGE));
+--- linux-2.6.0-test1/arch/i386/mm/pgtable.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/i386/mm/pgtable.c	2003-07-19 17:07:16.000000000 -0700
+@@ -12,6 +12,7 @@
+ #include <linux/highmem.h>
+ #include <linux/slab.h>
+ #include <linux/pagemap.h>
++#include <linux/spinlock.h>
+ 
+ #include <asm/system.h>
+ #include <asm/pgtable.h>
+@@ -69,7 +70,7 @@ static void set_pte_pfn(unsigned long va
+ 		BUG();
+ 		return;
+ 	}
+-	pmd = pmd_offset(pgd, vaddr);
++	pmd = pmd_offset_kernel(pgd, vaddr);
+ 	if (pmd_none(*pmd)) {
+ 		BUG();
+ 		return;
+@@ -109,7 +110,7 @@ void set_pmd_pfn(unsigned long vaddr, un
+ 		printk ("set_pmd_pfn: pgd_none\n");
+ 		return; /* BUG(); */
+ 	}
+-	pmd = pmd_offset(pgd, vaddr);
++	pmd = pmd_offset_kernel(pgd, vaddr);
+ 	set_pmd(pmd, pfn_pmd(pfn, flags));
+ 	/*
+ 	 * It's enough to flush this one mapping.
+@@ -151,61 +152,89 @@ struct page *pte_alloc_one(struct mm_str
+ 	return pte;
+ }
+ 
+-#ifdef CONFIG_X86_PAE
++/*
++ * List of all pgd's needed for non-PAE so it can invalidate entries
++ * in both cached and uncached pgd's; not needed for PAE since the
++ * kernel pmd is shared. If PAE were not to share the pmd a similar
++ * tactic would be needed. This is essentially codepath-based locking
++ * against pageattr.c; it is the unique case in which a valid change
++ * of kernel pagetables can't be lazily synchronized by vmalloc faults.
++ * vmalloc faults work because attached pagetables are never freed.
++ * If the locking proves to be non-performant, a ticketing scheme with
++ * checks at dup_mmap(), exec(), and other mmlist addition points
++ * could be used. The locking scheme was chosen on the basis of
++ * manfred's recommendations and having no core impact whatsoever.
++ * -- wli
++ */
++spinlock_t pgd_lock = SPIN_LOCK_UNLOCKED;
++LIST_HEAD(pgd_list);
+ 
+-pgd_t *pgd_alloc(struct mm_struct *mm)
++void pgd_ctor(void *pgd, kmem_cache_t *cache, unsigned long unused)
+ {
+-	int i;
+-	pgd_t *pgd = kmem_cache_alloc(pae_pgd_cachep, GFP_KERNEL);
++	unsigned long flags;
+ 
+-	if (pgd) {
+-		for (i = 0; i < USER_PTRS_PER_PGD; i++) {
+-			unsigned long pmd = __get_free_page(GFP_KERNEL);
+-			if (!pmd)
+-				goto out_oom;
+-			clear_page(pmd);
+-			set_pgd(pgd + i, __pgd(1 + __pa(pmd)));
+-		}
+-		memcpy(pgd + USER_PTRS_PER_PGD,
++	if (PTRS_PER_PMD == 1)
++		spin_lock_irqsave(&pgd_lock, flags);
++
++	memcpy((pgd_t *)pgd + USER_PTRS_PER_PGD,
+ 			swapper_pg_dir + USER_PTRS_PER_PGD,
+ 			(PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
+-	}
+-	return pgd;
+-out_oom:
+-	for (i--; i >= 0; i--)
+-		free_page((unsigned long)__va(pgd_val(pgd[i])-1));
+-	kmem_cache_free(pae_pgd_cachep, pgd);
+-	return NULL;
++
++	if (PTRS_PER_PMD > 1)
++		return;
++
++	list_add(&virt_to_page(pgd)->lru, &pgd_list);
++	spin_unlock_irqrestore(&pgd_lock, flags);
++	memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t));
+ }
+ 
+-void pgd_free(pgd_t *pgd)
++/* never called when PTRS_PER_PMD > 1 */
++void pgd_dtor(void *pgd, kmem_cache_t *cache, unsigned long unused)
+ {
+-	int i;
++	unsigned long flags; /* can be called from interrupt context */
+ 
+-	for (i = 0; i < USER_PTRS_PER_PGD; i++)
+-		free_page((unsigned long)__va(pgd_val(pgd[i])-1));
+-	kmem_cache_free(pae_pgd_cachep, pgd);
++	spin_lock_irqsave(&pgd_lock, flags);
++	list_del(&virt_to_page(pgd)->lru);
++	spin_unlock_irqrestore(&pgd_lock, flags);
+ }
+ 
+-#else
+-
+ pgd_t *pgd_alloc(struct mm_struct *mm)
+ {
+-	pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL);
++	int i;
++	pgd_t *pgd = kmem_cache_alloc(pgd_cache, GFP_KERNEL);
+ 
+-	if (pgd) {
+-		memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
+-		memcpy(pgd + USER_PTRS_PER_PGD,
+-			swapper_pg_dir + USER_PTRS_PER_PGD,
+-			(PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
++	if (PTRS_PER_PMD == 1 || !pgd)
++		return pgd;
++
++	for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
++		struct page *pmd;
++#ifdef CONFIG_HIGHPMD
++		pmd = alloc_page(GFP_KERNEL|__GFP_HIGHMEM|__GFP_REPEAT);
++#else
++		pmd = alloc_page(GFP_KERNEL|__GFP_REPEAT);
++#endif
++		if (!pmd)
++			goto out_oom;
++		clear_highpage(pmd);
++		set_pgd(&pgd[i], __pgd(1ULL | (u64)page_to_pfn(pmd) << PAGE_SHIFT));
+ 	}
+ 	return pgd;
++
++out_oom:
++	for (i--; i >= 0; i--)
++		__free_page(pgd_page(pgd[i]));
++	kmem_cache_free(pgd_cache, pgd);
++	return NULL;
+ }
+ 
+ void pgd_free(pgd_t *pgd)
+ {
+-	free_page((unsigned long)pgd);
+-}
+-
+-#endif /* CONFIG_X86_PAE */
++	int i;
+ 
++	/* in the PAE case user pgd entries are overwritten before usage */
++	if (PTRS_PER_PMD > 1)
++		for (i = 0; i < USER_PTRS_PER_PGD; ++i)
++			__free_page(pgd_page(pgd[i]));
++	/* in the non-PAE case, clear_page_tables() clears user pgd entries */
++	kmem_cache_free(pgd_cache, pgd);
++}
+--- linux-2.6.0-test1/arch/i386/pci/legacy.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/i386/pci/legacy.c	2003-07-19 17:03:49.000000000 -0700
+@@ -24,7 +24,7 @@ static void __devinit pcibios_fixup_peer
+ 		for (devfn = 0; devfn < 256; devfn += 8) {
+ 			if (!raw_pci_ops->read(0, n, devfn, PCI_VENDOR_ID, 2, &l) &&
+ 			    l != 0x0000 && l != 0xffff) {
+-				DBG("Found device at %02x:%02x [%04x]\n", n, dev->devfn, l);
++				DBG("Found device at %02x:%02x [%04x]\n", n, devfn, l);
+ 				printk(KERN_INFO "PCI: Discovered peer bus %02x\n", n);
+ 				pci_scan_bus(n, &pci_root_ops, NULL);
+ 				break;
+--- linux-2.6.0-test1/arch/i386/pci/visws.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/arch/i386/pci/visws.c	2003-07-19 17:03:49.000000000 -0700
+@@ -17,7 +17,7 @@
+ 
+ int broken_hp_bios_irq9;
+ 
+-extern struct pci_ops pci_direct_conf1;
++extern struct pci_raw_ops pci_direct_conf1;
+ 
+ static int pci_visws_enable_irq(struct pci_dev *dev) { return 0; }
+ 
+@@ -101,8 +101,9 @@ static int __init pcibios_init(void)
+ 	printk(KERN_INFO "PCI: Lithium bridge A bus: %u, "
+ 		"bridge B (PIIX4) bus: %u\n", pci_bus1, pci_bus0);
+ 
+-	pci_scan_bus(pci_bus0, &pci_direct_conf1, NULL);
+-	pci_scan_bus(pci_bus1, &pci_direct_conf1, NULL);
++	raw_pci_ops = &pci_direct_conf1;
++	pci_scan_bus(pci_bus0, &pci_root_ops, NULL);
++	pci_scan_bus(pci_bus1, &pci_root_ops, NULL);
+ 	pci_fixup_irqs(visws_swizzle, visws_map_irq);
+ 	pcibios_resource_survey();
+ 	return 0;
+--- linux-2.6.0-test1/arch/ia64/hp/sim/simscsi.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/ia64/hp/sim/simscsi.c	2003-07-19 17:03:49.000000000 -0700
+@@ -9,7 +9,7 @@
+  * 99/12/18 David Mosberger	Added support for READ10/WRITE10 needed by linux v2.3.33
+  */
+ #include <linux/config.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+ #include <linux/kernel.h>
+--- linux-2.6.0-test1/arch/ia64/ia32/ia32_ioctl.c	2003-06-22 12:04:43.000000000 -0700
++++ 25/arch/ia64/ia32/ia32_ioctl.c	2003-07-19 17:03:49.000000000 -0700
+@@ -52,7 +52,7 @@
+ #include <linux/raw.h>
+ #include <linux/smb_fs.h>
+ #include <linux/blkpg.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/elevator.h>
+ #include <linux/rtc.h>
+ #include <linux/pci.h>
+--- linux-2.6.0-test1/arch/ia64/kernel/acpi.c	2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/ia64/kernel/acpi.c	2003-07-19 17:03:49.000000000 -0700
+@@ -720,7 +720,7 @@ acpi_register_irq (u32 gsi, u32 polarity
+ {
+ 	int vector = 0;
+ 
+-	if (acpi_madt->flags.pcat_compat && (gsi < 16))
++	if (has_8259 && (gsi < 16))
+ 		return isa_irq_to_vector(gsi);
+ 
+ 	if (!iosapic_register_intr)
+--- linux-2.6.0-test1/arch/ia64/kernel/entry.S	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/ia64/kernel/entry.S	2003-07-19 17:03:49.000000000 -0700
+@@ -61,7 +61,17 @@ ENTRY(ia64_execve)
+ 	mov out2=in2			// envp
+ 	add out3=16,sp			// regs
+ 	br.call.sptk.many rp=sys_execve
+-.ret0:	cmp4.ge p6,p7=r8,r0
++.ret0:
++#ifdef CONFIG_IA32_SUPPORT
++	/*
++	 * Check if we're returning to ia32 mode. If so, we need to restore ia32 registers
++	 * from pt_regs.
++	 */
++	adds r16=PT(CR_IPSR)+16,sp
++	;;
++	ld8 r16=[r16]
++#endif
++	cmp4.ge p6,p7=r8,r0
+ 	mov ar.pfs=loc1			// restore ar.pfs
+ 	sxt4 r8=r8			// return 64-bit result
+ 	;;
+@@ -89,6 +99,12 @@ ENTRY(ia64_execve)
+ 	ldf.fill f23=[sp];	ldf.fill f24=[sp];	mov f25=f0
+ 	ldf.fill f26=[sp];	ldf.fill f27=[sp];	mov f28=f0
+ 	ldf.fill f29=[sp];	ldf.fill f30=[sp];	mov f31=f0
++#ifdef CONFIG_IA32_SUPPORT
++	tbit.nz p6,p0=r16, IA64_PSR_IS_BIT
++	movl loc0=ia64_ret_from_ia32_execve
++	;;
++(p6)	mov rp=loc0
++#endif
+ 	br.ret.sptk.many rp
+ END(ia64_execve)
+ 
+@@ -688,7 +704,7 @@ GLOBAL_ENTRY(ia64_leave_syscall)
+ 	mov b7=r0		// clear b7
+ 	;;
+ (pUStk) st1 [r14]=r3
+-	movl r17=THIS_CPU(ia64_phys_stacked_size_p8)
++	addl r17=THIS_CPU(ia64_phys_stacked_size_p8),r0
+ 	;;
+ 	mov r16=ar.bsp		// get existing backing store pointer
+ 	srlz.i			// ensure interruption collection is off
+@@ -701,6 +717,19 @@ GLOBAL_ENTRY(ia64_leave_syscall)
+ 	br.cond.sptk.many rbs_switch
+ END(ia64_leave_syscall)
+ 
++#ifdef CONFIG_IA32_SUPPORT
++GLOBAL_ENTRY(ia64_ret_from_ia32_execve)
++	PT_REGS_UNWIND_INFO(0)
++	adds r2=PT(R8)+16,sp			// r2 = &pt_regs.r8
++	adds r3=PT(R10)+16,sp			// r3 = &pt_regs.r10
++	;;
++	.mem.offset 0,0
++	st8.spill [r2]=r8	// store return value in slot for r8 and set unat bit
++	.mem.offset 8,0
++	st8.spill [r3]=r0	// clear error indication in slot for r10 and set unat bit
++END(ia64_ret_from_ia32_execve_syscall)
++	// fall through
++#endif /* CONFIG_IA32_SUPPORT */
+ GLOBAL_ENTRY(ia64_leave_kernel)
+ 	PT_REGS_UNWIND_INFO(0)
+ 	/*
+@@ -841,7 +870,7 @@ GLOBAL_ENTRY(ia64_leave_kernel)
+ 	shr.u r18=r19,16	// get byte size of existing "dirty" partition
+ 	;;
+ 	mov r16=ar.bsp		// get existing backing store pointer
+-	movl r17=THIS_CPU(ia64_phys_stacked_size_p8)
++	addl r17=THIS_CPU(ia64_phys_stacked_size_p8),r0
+ 	;;
+ 	ld4 r17=[r17]		// r17 = cpu_data->phys_stacked_size_p8
+ (pKStk)	br.cond.dpnt skip_rbs_switch
+--- linux-2.6.0-test1/arch/ia64/kernel/fsys.S	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/ia64/kernel/fsys.S	2003-07-19 17:03:49.000000000 -0700
+@@ -165,7 +165,7 @@ ENTRY(fsys_gettimeofday)
+ 	.altrp b6
+ 	.body
+ 	add r9=TI_FLAGS+IA64_TASK_SIZE,r16
+-	movl r3=THIS_CPU(cpu_info)
++	addl r3=THIS_CPU(cpu_info),r0
+ 
+ 	mov.m r31=ar.itc		// put time stamp into r31 (ITC) == now		(35 cyc)
+ #ifdef CONFIG_SMP
+@@ -177,7 +177,7 @@ ENTRY(fsys_gettimeofday)
+ 	movl r19=xtime			// xtime is a timespec struct
+ 
+ 	ld8 r10=[r10]			// r10 <- __per_cpu_offset[0]
+-	movl r21=THIS_CPU(cpu_info)
++	addl r21=THIS_CPU(cpu_info),r0
+ 	;;
+ 	add r10=r21, r10		// r10 <- &cpu_data(time_keeper_id)
+ 	tbit.nz p8,p0 = r2, IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT_BIT
+--- linux-2.6.0-test1/arch/ia64/kernel/ia64_ksyms.c	2003-06-22 12:04:43.000000000 -0700
++++ 25/arch/ia64/kernel/ia64_ksyms.c	2003-07-19 17:03:49.000000000 -0700
+@@ -64,9 +64,10 @@ EXPORT_SYMBOL(ia64_pfn_valid);
+ #endif
+ 
+ #include <asm/processor.h>
+-EXPORT_SYMBOL(cpu_info__per_cpu);
++EXPORT_SYMBOL(per_cpu__cpu_info);
+ #ifdef CONFIG_SMP
+ EXPORT_SYMBOL(__per_cpu_offset);
++EXPORT_SYMBOL(per_cpu__local_per_cpu_offset);
+ #endif
+ EXPORT_SYMBOL(kernel_thread);
+ 
+--- linux-2.6.0-test1/arch/ia64/kernel/init_task.c	2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/ia64/kernel/init_task.c	2003-07-19 17:03:49.000000000 -0700
+@@ -2,7 +2,7 @@
+  * This is where we statically allocate and initialize the initial
+  * task.
+  *
+- * Copyright (C) 1999, 2002 Hewlett-Packard Co
++ * Copyright (C) 1999, 2002-2003 Hewlett-Packard Co
+  *	David Mosberger-Tang <davidm@hpl.hp.com>
+  */
+ 
+@@ -34,7 +34,7 @@ static union {
+ 		struct thread_info thread_info;
+ 	} s;
+ 	unsigned long stack[KERNEL_STACK_SIZE/sizeof (unsigned long)];
+-} init_task_mem __attribute__((section(".data.init_task"))) = {{
++} init_task_mem asm ("init_task_mem") __attribute__((section(".data.init_task"))) = {{
+ 	.task =		INIT_TASK(init_task_mem.s.task),
+ 	.thread_info =	INIT_THREAD_INFO(init_task_mem.s.task)
+ }};
+--- linux-2.6.0-test1/arch/ia64/kernel/iosapic.c	2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/ia64/kernel/iosapic.c	2003-07-19 17:04:06.000000000 -0700
+@@ -274,7 +274,7 @@ unmask_irq (unsigned int irq)
+ 
+ 
+ static void
+-iosapic_set_affinity (unsigned int irq, unsigned long mask)
++iosapic_set_affinity (unsigned int irq, cpumask_t mask)
+ {
+ #ifdef CONFIG_SMP
+ 	unsigned long flags;
+@@ -287,12 +287,10 @@ iosapic_set_affinity (unsigned int irq, 
+ 	irq &= (~IA64_IRQ_REDIRECTED);
+ 	vec = irq_to_vector(irq);
+ 
+-	mask &= cpu_online_map;
+-
+-	if (!mask || vec >= IA64_NUM_VECTORS)
++	if (cpus_empty(mask) || vec >= IA64_NUM_VECTORS)
+ 		return;
+ 
+-	dest = cpu_physical_id(ffz(~mask));
++	dest = cpu_physical_id(first_cpu(mask));
+ 
+ 	rte_index = iosapic_intr_info[vec].rte_index;
+ 	addr = iosapic_intr_info[vec].addr;
+@@ -717,6 +715,7 @@ iosapic_parse_prt (void)
+ 			register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY, IOSAPIC_POL_LOW,
+ 				      IOSAPIC_LEVEL);
+ 		}
++		entry->irq = vector;
+ 		snprintf(pci_id, sizeof(pci_id), "%02x:%02x:%02x[%c]",
+ 			 entry->id.segment, entry->id.bus, entry->id.device, 'A' + entry->pin);
+ 
+--- linux-2.6.0-test1/arch/ia64/kernel/irq.c	2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/ia64/kernel/irq.c	2003-07-19 17:04:06.000000000 -0700
+@@ -898,13 +898,14 @@ int setup_irq(unsigned int irq, struct i
+ static struct proc_dir_entry * root_irq_dir;
+ static struct proc_dir_entry * irq_dir [NR_IRQS];
+ 
+-#define HEX_DIGITS 8
++#define HEX_DIGITS (2*sizeof(cpumask_t))
+ 
+-static unsigned int parse_hex_value (const char *buffer,
+-		unsigned long count, unsigned long *ret)
++static unsigned int parse_hex_value(const char *buffer,
++		unsigned long count, cpumask_t *ret)
+ {
+-	unsigned char hexnum [HEX_DIGITS];
+-	unsigned long value, i;
++	unsigned char hexnum[HEX_DIGITS];
++	cpumask_t value = CPU_MASK_NONE;
++	unsigned long i;
+ 
+ 	if (!count)
+ 		return -EINVAL;
+@@ -917,10 +918,9 @@ static unsigned int parse_hex_value (con
+ 	 * Parse the first 8 characters as a hex string, any non-hex char
+ 	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
+ 	 */
+-	value = 0;
+-
+ 	for (i = 0; i < count; i++) {
+ 		unsigned int c = hexnum[i];
++		int k;
+ 
+ 		switch (c) {
+ 			case '0' ... '9': c -= '0'; break;
+@@ -929,7 +929,10 @@ static unsigned int parse_hex_value (con
+ 		default:
+ 			goto out;
+ 		}
+-		value = (value << 4) | c;
++		cpus_shift_left(value, value, 4);
++		for (k = 0; k < 4; ++k)
++			if (test_bit(k, (unsigned long *)&c))
++				cpu_set(k, value);
+ 	}
+ out:
+ 	*ret = value;
+@@ -940,12 +943,15 @@ out:
+ 
+ static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
+ 
+-static unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };
++static cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL };
++
+ static char irq_redir [NR_IRQS]; // = { [0 ... NR_IRQS-1] = 1 };
+ 
+ void set_irq_affinity_info (unsigned int irq, int hwid, int redir)
+ {
+-	unsigned long mask = 1UL<<cpu_logical_id(hwid);
++	cpumask_t mask = CPU_MASK_NONE;
++
++	cpu_set(cpu_logical_id(hwid), mask);
+ 
+ 	if (irq < NR_IRQS) {
+ 		irq_affinity[irq] = mask;
+@@ -956,10 +962,21 @@ void set_irq_affinity_info (unsigned int
+ static int irq_affinity_read_proc (char *page, char **start, off_t off,
+ 			int count, int *eof, void *data)
+ {
+-	if (count < HEX_DIGITS+3)
++	int k, len;
++	cpumask_t tmp = irq_affinity[(long)data];
++
++	if (count < HEX_DIGITS+1)
+ 		return -EINVAL;
+-	return sprintf (page, "%s%08lx\n", irq_redir[(unsigned long)data] ? "r " : "",
+-			irq_affinity[(unsigned long)data]);
++
++	len = 0;
++	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
++		len += j;
++		page += j;
++		cpus_shift_right(tmp, tmp, 16);
++	}
++	len += sprintf(page, "\n");
++	return len;
+ }
+ 
+ static int irq_affinity_write_proc (struct file *file, const char *buffer,
+@@ -967,7 +984,7 @@ static int irq_affinity_write_proc (stru
+ {
+ 	unsigned int irq = (unsigned long) data;
+ 	int full_count = count, err;
+-	unsigned long new_value;
++	cpumask_t new_value, tmp;
+ 	const char *buf = buffer;
+ 	irq_desc_t *desc = irq_descp(irq);
+ 	int redir;
+@@ -991,7 +1008,8 @@ static int irq_affinity_write_proc (stru
+ 	 * way to make the system unusable accidentally :-) At least
+ 	 * one online CPU still has to be targeted.
+ 	 */
+-	if (!(new_value & cpu_online_map))
++	cpus_and(tmp, new_value, cpu_online_map);
++	if (cpus_empty(tmp))
+ 		return -EINVAL;
+ 
+ 	desc->handler->set_affinity(irq | (redir? IA64_IRQ_REDIRECTED : 0), new_value);
+@@ -1003,18 +1021,28 @@ static int irq_affinity_write_proc (stru
+ static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
+ 			int count, int *eof, void *data)
+ {
+-	unsigned long *mask = (unsigned long *) data;
++	cpumask_t *mask = (cpumask_t *)data;
++	int k, len = 0;
++
+ 	if (count < HEX_DIGITS+1)
+ 		return -EINVAL;
+-	return sprintf (page, "%08lx\n", *mask);
++
++	for (k = 0; k < sizeof(cpumask_t)/sizeof(unsigned long); ++k) {
++		int j = sprintf(page, "%04hx", (u16)cpus_coerce(*mask));
++		len += j;
++		page += j;
++		cpus_shift_right(*mask, *mask, 16);
++	}
++	len += sprintf(page, "\n");
++	return len;
+ }
+ 
+ static int prof_cpu_mask_write_proc (struct file *file, const char *buffer,
+ 					unsigned long count, void *data)
+ {
+-	unsigned long *mask = (unsigned long *) data;
+-	int full_count = count, err;
+-	unsigned long new_value;
++	cpumask_t *mask = (cpumask_t *)data;
++	unsigned long full_count = count, err;
++	cpumask_t new_value;
+ 
+ 	err = parse_hex_value(buffer, count, &new_value);
+ 	if (err)
+@@ -1058,7 +1086,7 @@ static void register_irq_proc (unsigned 
+ #endif
+ }
+ 
+-unsigned long prof_cpu_mask = -1;
++cpumask_t prof_cpu_mask = CPU_MASK_ALL;
+ 
+ void init_irq_proc (void)
+ {
+--- linux-2.6.0-test1/arch/ia64/kernel/module.c	2003-06-22 12:04:43.000000000 -0700
++++ 25/arch/ia64/kernel/module.c	2003-07-19 17:03:49.000000000 -0700
+@@ -164,7 +164,7 @@ 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",
++		printk(KERN_ERR "%s: invalid slot number %d for IMM64\n",
+ 		       mod->name, slot(insn));
+ 		return 0;
+ 	}
+@@ -176,7 +176,7 @@ 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",
++		printk(KERN_ERR "%s: invalid slot number %d for IMM60\n",
+ 		       mod->name, slot(insn));
+ 		return 0;
+ 	}
+--- linux-2.6.0-test1/arch/ia64/kernel/perfmon.c	2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/ia64/kernel/perfmon.c	2003-07-19 17:04:06.000000000 -0700
+@@ -221,14 +221,6 @@
+ 
+ #define PFM_REG_RETFLAG_SET(flags, val)	do { flags &= ~PFM_REG_RETFL_MASK; flags |= (val); } while(0)
+ 
+-#ifdef CONFIG_SMP
+-#define PFM_CPU_ONLINE_MAP	cpu_online_map
+-#define cpu_is_online(i)	(PFM_CPU_ONLINE_MAP & (1UL << i))
+-#else
+-#define PFM_CPU_ONLINE_MAP	 1UL
+-#define cpu_is_online(i)	(i==0)
+-#endif
+-
+ /*
+  * cmp0 must be the value of pmc0
+  */
+@@ -566,7 +558,7 @@ static struct vm_operations_struct pfm_v
+ 
+ 
+ #define pfm_wait_task_inactive(t)	wait_task_inactive(t)
+-#define pfm_get_cpu_var(v)		__get_cpu_var(v)
++#define pfm_get_cpu_var(v)		__ia64_per_cpu_var(v)
+ #define pfm_get_cpu_data(a,b)		per_cpu(a, b)
+ typedef	irqreturn_t	pfm_irq_handler_t;
+ #define PFM_IRQ_HANDLER_RET(v)	do {  \
+@@ -5354,7 +5346,7 @@ pfm_proc_info(char *page)
+ 		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 overflow cycles     : %lu\n", i, pfm_stats[i].pfm_ovfl_intr_cycles);
+ 		p += sprintf(p, "CPU%-2d overflow min        : %lu\n", i, pfm_stats[i].pfm_ovfl_intr_cycles_min);
+@@ -5372,7 +5364,7 @@ pfm_proc_info(char *page)
+ 		p += sprintf(p, "CPU%-2d activations         : %lu\n", i, pfm_get_cpu_data(pmu_activation_number,i));
+ 	}
+ 
+-	if (hweight64(PFM_CPU_ONLINE_MAP) == 1)
++	if (num_online_cpus() == 1)
+ 	{
+ 		psr = pfm_get_psr();
+ 		ia64_srlz_d();
+--- linux-2.6.0-test1/arch/ia64/kernel/ptrace.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/ia64/kernel/ptrace.c	2003-07-19 17:03:49.000000000 -0700
+@@ -42,7 +42,7 @@
+ 	(IA64_PSR_UM | IA64_PSR_DB | IA64_PSR_IS | IA64_PSR_ID | IA64_PSR_DD | IA64_PSR_RI)
+ #define IPSR_READ_MASK	IPSR_WRITE_MASK
+ 
+-#define PTRACE_DEBUG	1
++#define PTRACE_DEBUG	0
+ 
+ #if PTRACE_DEBUG
+ # define dprintk(format...)	printk(format)
+--- linux-2.6.0-test1/arch/ia64/kernel/setup.c	2003-06-22 12:04:43.000000000 -0700
++++ 25/arch/ia64/kernel/setup.c	2003-07-19 17:04:07.000000000 -0700
+@@ -56,6 +56,7 @@ unsigned long __per_cpu_offset[NR_CPUS];
+ #endif
+ 
+ DEFINE_PER_CPU(struct cpuinfo_ia64, cpu_info);
++DEFINE_PER_CPU(unsigned long, local_per_cpu_offset);
+ DEFINE_PER_CPU(unsigned long, ia64_phys_stacked_size_p8);
+ unsigned long ia64_cycles_per_usec;
+ struct ia64_boot_param *ia64_boot_param;
+@@ -558,7 +559,7 @@ static void *
+ c_start (struct seq_file *m, loff_t *pos)
+ {
+ #ifdef CONFIG_SMP
+-	while (*pos < NR_CPUS && !(cpu_online_map & (1UL << *pos)))
++	while (*pos < NR_CPUS && !cpu_isset(*pos, cpu_online_map))
+ 		++*pos;
+ #endif
+ 	return *pos < NR_CPUS ? cpu_data(*pos) : NULL;
+@@ -709,6 +710,8 @@ cpu_init (void)
+ 			memcpy(cpu_data, __phys_per_cpu_start, __per_cpu_end - __per_cpu_start);
+ 			__per_cpu_offset[cpu] = (char *) cpu_data - __per_cpu_start;
+ 			cpu_data += PERCPU_PAGE_SIZE;
++
++			per_cpu(local_per_cpu_offset, cpu) = __per_cpu_offset[cpu];
+ 		}
+ 	}
+ 	cpu_data = __per_cpu_start + __per_cpu_offset[smp_processor_id()];
+@@ -716,19 +719,18 @@ cpu_init (void)
+ 	cpu_data = __phys_per_cpu_start;
+ #endif /* !CONFIG_SMP */
+ 
+-	cpu_info = cpu_data + ((char *) &__get_cpu_var(cpu_info) - __per_cpu_start);
+-#ifdef CONFIG_NUMA
+-	cpu_info->node_data = get_node_data_ptr();
+-#endif
+-
+ 	get_max_cacheline_size();
+ 
+ 	/*
+ 	 * We can't pass "local_cpu_data" to identify_cpu() because we haven't called
+ 	 * ia64_mmu_init() yet.  And we can't call ia64_mmu_init() first because it
+ 	 * depends on the data returned by identify_cpu().  We break the dependency by
+-	 * accessing cpu_data() the old way, through identity mapped space.
++	 * accessing cpu_data() through the canonical per-CPU address.
+ 	 */
++	cpu_info = cpu_data + ((char *) &__ia64_per_cpu_var(cpu_info) - __per_cpu_start);
++#ifdef CONFIG_NUMA
++	cpu_info->node_data = get_node_data_ptr();
++#endif
+ 	identify_cpu(cpu_info);
+ 
+ #ifdef CONFIG_MCKINLEY
+--- linux-2.6.0-test1/arch/ia64/kernel/smpboot.c	2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/ia64/kernel/smpboot.c	2003-07-19 17:04:07.000000000 -0700
+@@ -79,13 +79,13 @@ int cpucount;
+ task_t *task_for_booting_cpu;
+ 
+ /* Bitmask of currently online CPUs */
+-volatile unsigned long cpu_online_map;
+-unsigned long phys_cpu_present_map;
++cpumask_t cpu_online_map;
++cpumask_t phys_cpu_present_map;
+ 
+ /* which logical CPU number maps to which CPU (physical APIC ID) */
+ volatile int ia64_cpu_to_sapicid[NR_CPUS];
+ 
+-static volatile unsigned long cpu_callin_map;
++static volatile cpumask_t cpu_callin_map;
+ 
+ struct smp_boot_data smp_boot_data __initdata;
+ 
+@@ -282,7 +282,7 @@ smp_callin (void)
+ 	cpuid = smp_processor_id();
+ 	phys_id = hard_smp_processor_id();
+ 
+-	if (test_and_set_bit(cpuid, &cpu_online_map)) {
++	if (cpu_test_and_set(cpuid, cpu_online_map)) {
+ 		printk(KERN_ERR "huh, phys CPU#0x%x, CPU#0x%x already present??\n",
+ 		       phys_id, cpuid);
+ 		BUG();
+@@ -327,7 +327,7 @@ smp_callin (void)
+ 	/*
+ 	 * Allow the master to continue.
+ 	 */
+-	set_bit(cpuid, &cpu_callin_map);
++	cpu_set(cpuid, cpu_callin_map);
+ 	Dprintk("Stack on CPU %d at about %p\n",cpuid, &cpuid);
+ }
+ 
+@@ -391,19 +391,19 @@ do_boot_cpu (int sapicid, int cpu)
+ 	 */
+ 	Dprintk("Waiting on callin_map ...");
+ 	for (timeout = 0; timeout < 100000; timeout++) {
+-		if (test_bit(cpu, &cpu_callin_map))
++		if (cpu_isset(cpu, cpu_callin_map))
+ 			break;  /* It has booted */
+ 		udelay(100);
+ 	}
+ 	Dprintk("\n");
+ 
+-	if (test_bit(cpu, &cpu_callin_map)) {
++	if (cpu_isset(cpu, cpu_callin_map)) {
+ 		/* number CPUs logically, starting from 1 (BSP is 0) */
+ 		printk(KERN_INFO "CPU%d: CPU has booted.\n", cpu);
+ 	} else {
+ 		printk(KERN_ERR "Processor 0x%x/0x%x is stuck.\n", cpu, sapicid);
+ 		ia64_cpu_to_sapicid[cpu] = -1;
+-		clear_bit(cpu, &cpu_online_map);  /* was set in smp_callin() */
++		cpu_clear(cpu, cpu_online_map);  /* was set in smp_callin() */
+ 		return -EINVAL;
+ 	}
+ 	return 0;
+@@ -446,13 +446,14 @@ smp_build_cpu_map (void)
+ 		ia64_cpu_to_sapicid[cpu] = -1;
+ 
+ 	ia64_cpu_to_sapicid[0] = boot_cpu_id;
+-	phys_cpu_present_map = 1;
++	cpus_clear(phys_cpu_present_map);
++	cpu_set(0, phys_cpu_present_map);
+ 
+ 	for (cpu = 1, i = 0; i < smp_boot_data.cpu_count; i++) {
+ 		sapicid = smp_boot_data.cpu_phys_id[i];
+ 		if (sapicid == boot_cpu_id)
+ 			continue;
+-		phys_cpu_present_map |= (1UL << cpu);
++		cpu_set(cpu, phys_cpu_present_map);
+ 		ia64_cpu_to_sapicid[cpu] = sapicid;
+ 		cpu++;
+ 	}
+@@ -463,7 +464,7 @@ smp_build_cpu_map (void)
+ /* on which node is each logical CPU (one cacheline even for 64 CPUs) */
+ volatile char cpu_to_node_map[NR_CPUS] __cacheline_aligned;
+ /* which logical CPUs are on which nodes */
+-volatile unsigned long node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned;
++volatile cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned;
+ 
+ /*
+  * Build cpu to node mapping and initialize the per node cpu masks.
+@@ -474,7 +475,7 @@ build_cpu_to_node_map (void)
+ 	int cpu, i, node;
+ 
+ 	for(node=0; node<MAX_NUMNODES; node++)
+-		node_to_cpu_mask[node] = 0;
++		cpus_clear(node_to_cpu_mask[node]);
+ 	for(cpu = 0; cpu < NR_CPUS; ++cpu) {
+ 		/*
+ 		 * All Itanium NUMA platforms I know use ACPI, so maybe we
+@@ -492,7 +493,7 @@ build_cpu_to_node_map (void)
+ #endif
+ 		cpu_to_node_map[cpu] = node;
+ 		if (node >= 0)
+-			node_to_cpu_mask[node] |= (1UL << cpu);
++			cpu_set(cpu, node_to_cpu_mask[node]);
+ 	}
+ }
+ 
+@@ -515,8 +516,8 @@ smp_prepare_cpus (unsigned int max_cpus)
+ 	/*
+ 	 * We have the boot CPU online for sure.
+ 	 */
+-	set_bit(0, &cpu_online_map);
+-	set_bit(0, &cpu_callin_map);
++	cpu_set(0, cpu_online_map);
++	cpu_set(0, cpu_callin_map);
+ 
+ 	local_cpu_data->loops_per_jiffy = loops_per_jiffy;
+ 	ia64_cpu_to_sapicid[0] = boot_cpu_id;
+@@ -531,15 +532,18 @@ smp_prepare_cpus (unsigned int max_cpus)
+ 	 */
+ 	if (!max_cpus) {
+ 		printk(KERN_INFO "SMP mode deactivated.\n");
+-		cpu_online_map = phys_cpu_present_map = 1;
++		cpus_clear(cpu_online_map);
++		cpus_clear(phys_cpu_present_map);
++		cpu_set(1, cpu_online_map);
++		cpu_set(1, phys_cpu_present_map);
+ 		return;
+ 	}
+ }
+ 
+ void __devinit smp_prepare_boot_cpu(void)
+ {
+-	set_bit(smp_processor_id(), &cpu_online_map);
+-	set_bit(smp_processor_id(), &cpu_callin_map);
++	cpu_set(smp_processor_id(), cpu_online_map);
++	cpu_set(smp_processor_id(), cpu_callin_map);
+ }
+ 
+ void
+--- linux-2.6.0-test1/arch/ia64/kernel/smp.c	2003-06-14 12:18:50.000000000 -0700
++++ 25/arch/ia64/kernel/smp.c	2003-07-19 17:04:07.000000000 -0700
+@@ -72,7 +72,7 @@ static volatile struct call_data_struct 
+ #define IPI_CPU_STOP		1
+ 
+ /* This needs to be cacheline aligned because it is written to by *other* CPUs.  */
+-static DEFINE_PER_CPU(__u64, ipi_operation) ____cacheline_aligned;
++static DEFINE_PER_CPU(u64, ipi_operation) ____cacheline_aligned;
+ 
+ static void
+ stop_this_cpu (void)
+@@ -81,7 +81,7 @@ stop_this_cpu (void)
+ 	/*
+ 	 * Remove this CPU:
+ 	 */
+-	clear_bit(smp_processor_id(), &cpu_online_map);
++	cpu_clear(smp_processor_id(), cpu_online_map);
+ 	max_xtp();
+ 	local_irq_disable();
+ 	cpu_halt();
+@@ -91,7 +91,7 @@ irqreturn_t
+ handle_IPI (int irq, void *dev_id, struct pt_regs *regs)
+ {
+ 	int this_cpu = get_cpu();
+-	unsigned long *pending_ipis = &__get_cpu_var(ipi_operation);
++	unsigned long *pending_ipis = &__ia64_per_cpu_var(ipi_operation);
+ 	unsigned long ops;
+ 
+ 	/* Count this now; we may make a call that never returns. */
+--- linux-2.6.0-test1/arch/ia64/kernel/time.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/arch/ia64/kernel/time.c	2003-07-19 17:04:07.000000000 -0700
+@@ -40,13 +40,13 @@ unsigned long last_cli_ip;
+ static void
+ do_profile (unsigned long ip)
+ {
+-	extern unsigned long prof_cpu_mask;
++	extern cpumask_t prof_cpu_mask;
+ 	extern char _stext;
+ 
+ 	if (!prof_buffer)
+ 		return;
+ 
+-	if (!((1UL << smp_processor_id()) & prof_cpu_mask))
++	if (!cpu_isset(smp_processor_id(), prof_cpu_mask))
+ 		return;
+ 
+ 	ip -= (unsigned long) &_stext;
+@@ -83,12 +83,11 @@ unsigned long
+ itc_get_offset (void)
+ {
+ 	unsigned long elapsed_cycles, lost = jiffies - wall_jiffies;
+-	unsigned long now, last_tick;
++	unsigned long now = ia64_get_itc(), last_tick;
+ 
+ 	last_tick = (cpu_data(TIME_KEEPER_ID)->itm_next
+ 		     - (lost + 1)*cpu_data(TIME_KEEPER_ID)->itm_delta);
+ 
+-	now = ia64_get_itc();
+ 	if (unlikely((long) (now - last_tick) < 0)) {
+ 		printk(KERN_ERR "CPU %d: now < last_tick (now=0x%lx,last_tick=0x%lx)!\n",
+ 		       smp_processor_id(), now, last_tick);
+--- linux-2.6.0-test1/arch/ia64/Makefile	2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/ia64/Makefile	2003-07-19 17:03:49.000000000 -0700
+@@ -66,8 +66,7 @@ core-$(CONFIG_IA64_SGI_SN2)	+= arch/ia64
+ 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/
+-drivers-$(CONFIG_IA64_GENERIC)	+= arch/ia64/hp/common/ arch/ia64/hp/zx1/ arch/ia64/hp/sim/ \
+-				   arch/ia64/sn/
++drivers-$(CONFIG_IA64_GENERIC)	+= arch/ia64/hp/common/ arch/ia64/hp/zx1/ arch/ia64/hp/sim/
+ 
+ boot := arch/ia64/boot
+ 
+--- linux-2.6.0-test1/arch/ia64/mm/hugetlbpage.c	2003-06-22 12:04:43.000000000 -0700
++++ 25/arch/ia64/mm/hugetlbpage.c	2003-07-19 17:07:16.000000000 -0700
+@@ -60,9 +60,9 @@ huge_pte_alloc (struct mm_struct *mm, un
+ 	pte_t *pte = NULL;
+ 
+ 	pgd = pgd_offset(mm, taddr);
+-	pmd = pmd_alloc(mm, pgd, taddr);
++	pmd = pmd_alloc_map(mm, pgd, taddr);
+ 	if (pmd)
+-		pte = pte_alloc_map(mm, pmd, taddr);
++		pte = pte_alloc_map(mm, pgd, &pmd, taddr);
+ 	return pte;
+ }
+ 
+--- linux-2.6.0-test1/arch/ia64/mm/init.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/ia64/mm/init.c	2003-07-19 17:07:16.000000000 -0700
+@@ -286,10 +286,10 @@ put_kernel_page (struct page *page, unsi
+ 
+ 	spin_lock(&init_mm.page_table_lock);
+ 	{
+-		pmd = pmd_alloc(&init_mm, pgd, address);
++		pmd = pmd_alloc_kernel(&init_mm, pgd, address);
+ 		if (!pmd)
+ 			goto out;
+-		pte = pte_alloc_map(&init_mm, pmd, address);
++		pte = pte_alloc_map(&init_mm, pgd, &pmd, address);
+ 		if (!pte)
+ 			goto out;
+ 		if (!pte_none(*pte)) {
+--- linux-2.6.0-test1/arch/ia64/pci/pci.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/ia64/pci/pci.c	2003-07-19 17:03:49.000000000 -0700
+@@ -124,7 +124,7 @@ subsys_initcall(pci_acpi_init);
+ 
+ /* Called by ACPI when it finds a new root bus.  */
+ 
+-static struct pci_controller *
++static struct pci_controller * __devinit
+ alloc_pci_controller (int seg)
+ {
+ 	struct pci_controller *controller;
+@@ -138,7 +138,7 @@ alloc_pci_controller (int seg)
+ 	return controller;
+ }
+ 
+-static int
++static int __devinit
+ alloc_resource (char *name, struct resource *root, unsigned long start, unsigned long end, unsigned long flags)
+ {
+ 	struct resource *res;
+@@ -159,7 +159,7 @@ alloc_resource (char *name, struct resou
+ 	return 0;
+ }
+ 
+-static u64
++static u64 __devinit
+ add_io_space (struct acpi_resource_address64 *addr)
+ {
+ 	u64 offset;
+@@ -190,7 +190,7 @@ add_io_space (struct acpi_resource_addre
+ 	return IO_SPACE_BASE(i);
+ }
+ 
+-static acpi_status
++static acpi_status __devinit
+ count_window (struct acpi_resource *resource, void *data)
+ {
+ 	unsigned int *windows = (unsigned int *) data;
+@@ -211,7 +211,7 @@ struct pci_root_info {
+ 	char *name;
+ };
+ 
+-static acpi_status
++static acpi_status __devinit
+ add_window (struct acpi_resource *res, void *data)
+ {
+ 	struct pci_root_info *info = (struct pci_root_info *) data;
+@@ -252,7 +252,7 @@ add_window (struct acpi_resource *res, v
+ 	return AE_OK;
+ }
+ 
+-struct pci_bus *
++struct pci_bus * __devinit
+ pci_acpi_scan_root (struct acpi_device *device, int domain, int bus)
+ {
+ 	struct pci_root_info info;
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/ia64/scripts/check-model.c	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1 @@
++int __attribute__ ((__model__ (__small__))) x;
+--- linux-2.6.0-test1/arch/ia64/scripts/toolchain-flags	2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/ia64/scripts/toolchain-flags	2003-07-19 17:03:49.000000000 -0700
+@@ -2,6 +2,7 @@
+ #
+ # Check whether linker can handle cross-segment @segrel():
+ #
++CPPFLAGS=""
+ CC=$1
+ OBJDUMP=$2
+ dir=$(dirname $0)
+@@ -11,10 +12,17 @@ $CC -nostdlib -static -Wl,-T$dir/check-s
+ res=$($OBJDUMP --full --section .rodata $out | fgrep 000 | cut -f3 -d' ')
+ rm -f $out
+ if [ $res != 00000a00 ]; then
+-    echo " -DHAVE_BUGGY_SEGREL"
++    CPPFLAGS="$CPPFLAGS -DHAVE_BUGGY_SEGREL"
+     cat >&2 <<EOF
+ warning: your linker cannot handle cross-segment segment-relative relocations.
+          please upgrade to a newer version (it is safe to use this linker, but
+          the kernel will be bigger than strictly necessary).
+ EOF
+ fi
++
++if ! $CC -c $dir/check-model.c -o $out | grep -q 'attribute directive ignored'
++then
++    CPPFLAGS="$CPPFLAGS -DHAVE_MODEL_SMALL_ATTRIBUTE"
++fi
++rm -f $out
++echo $CPPFLAGS
+--- linux-2.6.0-test1/arch/m68k/apollo/dn_ints.c	2003-06-14 12:18:24.000000000 -0700
++++ 25/arch/m68k/apollo/dn_ints.c	2003-07-19 17:03:49.000000000 -0700
+@@ -46,7 +46,7 @@ void dn_init_IRQ(void) {
+ int dn_request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *devname, void *dev_id) {
+ 
+   if((irq<0) || (irq>15)) {
+-    printk("Trying to request illegal IRQ\n");
++    printk("Trying to request invalid IRQ\n");
+     return -ENXIO;
+   }
+ 
+@@ -72,7 +72,7 @@ int dn_request_irq(unsigned int irq, irq
+ void dn_free_irq(unsigned int irq, void *dev_id) {
+ 
+   if((irq<0) || (irq>15)) {
+-    printk("Trying to free illegal IRQ\n");
++    printk("Trying to free invalid IRQ\n");
+     return ;
+   }
+ 
+--- linux-2.6.0-test1/arch/m68k/atari/stram.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/arch/m68k/atari/stram.c	2003-07-19 17:03:49.000000000 -0700
+@@ -37,7 +37,6 @@
+ #define MAJOR_NR    Z2RAM_MAJOR
+ #define do_z2_request do_stram_request
+ #define DEVICE_NR(device) (minor(device))
+-#include <linux/blk.h>
+ #endif
+ 
+ #undef DEBUG
+--- linux-2.6.0-test1/arch/m68k/kernel/head.S	2003-06-14 12:18:51.000000000 -0700
++++ 25/arch/m68k/kernel/head.S	2003-07-19 17:07:16.000000000 -0700
+@@ -110,7 +110,7 @@
+  * 
+  *	These routines are used by other mmu routines to get a pointer into
+  * a table, if necessary a new table is allocated. These routines are working
+- * basically like pmd_alloc() and pte_alloc() in <asm/pgtable.h>. The root
++ * basically like pmd_alloc_map() and pte_alloc_map() in <asm/pgtable.h>. The root
+  * table needs of course only to be allocated once in mmu_get_root_table_entry,
+  * so that here also some mmu specific initialization is done. The second page
+  * at the start of the kernel (the first page is unmapped later) is used for
+--- linux-2.6.0-test1/arch/m68k/mm/init.c	2003-06-14 12:18:32.000000000 -0700
++++ 25/arch/m68k/mm/init.c	2003-07-19 17:03:49.000000000 -0700
+@@ -17,9 +17,6 @@
+ #include <linux/types.h>
+ #include <linux/init.h>
+ #include <linux/bootmem.h>
+-#ifdef CONFIG_BLK_DEV_RAM
+-#include <linux/blk.h>
+-#endif
+ 
+ #include <asm/setup.h>
+ #include <asm/uaccess.h>
+--- linux-2.6.0-test1/arch/m68k/mm/kmap.c	2003-06-14 12:18:35.000000000 -0700
++++ 25/arch/m68k/mm/kmap.c	2003-07-19 17:07:16.000000000 -0700
+@@ -189,7 +189,7 @@ void *__ioremap(unsigned long physaddr, 
+ 			printk ("\npa=%#lx va=%#lx ", physaddr, virtaddr);
+ #endif
+ 		pgd_dir = pgd_offset_k(virtaddr);
+-		pmd_dir = pmd_alloc(&init_mm, pgd_dir, virtaddr);
++		pmd_dir = pmd_alloc_kernel(&init_mm, pgd_dir, virtaddr);
+ 		if (!pmd_dir) {
+ 			printk("ioremap: no mem for pmd_dir\n");
+ 			return NULL;
+--- linux-2.6.0-test1/arch/m68k/mm/motorola.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/arch/m68k/mm/motorola.c	2003-07-19 17:03:49.000000000 -0700
+@@ -18,9 +18,6 @@
+ #include <linux/types.h>
+ #include <linux/init.h>
+ #include <linux/bootmem.h>
+-#ifdef CONFIG_BLK_DEV_RAM
+-#include <linux/blk.h>
+-#endif
+ 
+ #include <asm/setup.h>
+ #include <asm/uaccess.h>
+--- linux-2.6.0-test1/arch/m68k/mm/sun3mmu.c	2003-06-14 12:18:05.000000000 -0700
++++ 25/arch/m68k/mm/sun3mmu.c	2003-07-19 17:03:49.000000000 -0700
+@@ -16,9 +16,6 @@
+ #include <linux/string.h>
+ #include <linux/types.h>
+ #include <linux/init.h>
+-#ifdef CONFIG_BLK_DEV_RAM
+-#include <linux/blk.h>
+-#endif
+ #include <linux/bootmem.h>
+ 
+ #include <asm/setup.h>
+--- linux-2.6.0-test1/arch/m68knommu/kernel/setup.c	2003-06-16 22:32:20.000000000 -0700
++++ 25/arch/m68knommu/kernel/setup.c	2003-07-19 17:03:49.000000000 -0700
+@@ -37,7 +37,6 @@
+ #include <asm/machdep.h>
+ 
+ #ifdef CONFIG_BLK_DEV_INITRD
+-#include <linux/blk.h>
+ #include <asm/pgtable.h>
+ #endif
+ 
+--- linux-2.6.0-test1/arch/m68knommu/mm/init.c	2003-06-14 12:18:25.000000000 -0700
++++ 25/arch/m68knommu/mm/init.c	2003-07-19 17:03:49.000000000 -0700
+@@ -27,9 +27,6 @@
+ #include <linux/mm.h>
+ #include <linux/swap.h>
+ #include <linux/init.h>
+-#ifdef CONFIG_BLK_DEV_RAM
+-#include <linux/blk.h>
+-#endif
+ #include <linux/highmem.h>
+ #include <linux/pagemap.h>
+ #include <linux/bootmem.h>
+--- linux-2.6.0-test1/arch/m68k/q40/q40ints.c	2003-06-14 12:18:33.000000000 -0700
++++ 25/arch/m68k/q40/q40ints.c	2003-07-19 17:03:49.000000000 -0700
+@@ -171,7 +171,7 @@ void q40_free_irq(unsigned int irq, void
+ 	  {
+ 	  case 1: case 2: case 8: case 9:
+ 	  case 12: case 13:
+-	    printk("%s: ISA IRQ %d from %x illegal\n", __FUNCTION__, irq, (unsigned)dev_id);
++	    printk("%s: ISA IRQ %d from %x invalid\n", __FUNCTION__, irq, (unsigned)dev_id);
+ 	    return;
+ 	  case 11: irq=10;
+ 	  default:
+--- linux-2.6.0-test1/arch/m68k/sun3x/dvma.c	2003-06-14 12:17:59.000000000 -0700
++++ 25/arch/m68k/sun3x/dvma.c	2003-07-19 17:07:16.000000000 -0700
+@@ -102,7 +102,7 @@ inline int dvma_map_cpu(unsigned long ka
+ 		pmd_t *pmd;
+ 		unsigned long end2;
+ 
+-		if((pmd = pmd_alloc(&init_mm, pgd, vaddr)) == NULL) {
++		if((pmd = pmd_alloc_kernel(&init_mm, pgd, vaddr)) == NULL) {
+ 			ret = -ENOMEM;
+ 			goto out;
+ 		}
+--- linux-2.6.0-test1/arch/mips64/kernel/irq.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips64/kernel/irq.c	2003-07-19 17:04:07.000000000 -0700
+@@ -818,13 +818,13 @@ EXPORT_SYMBOL(probe_irq_mask);
+ static struct proc_dir_entry * root_irq_dir;
+ static struct proc_dir_entry * irq_dir [NR_IRQS];
+ 
+-#define HEX_DIGITS 8
++#define HEX_DIGITS (2*sizeof(cpumask_t))
+ 
+ static unsigned int parse_hex_value (const char *buffer,
+-		unsigned long count, unsigned long *ret)
++		unsigned long count, cpumask_t *ret)
+ {
+ 	unsigned char hexnum [HEX_DIGITS];
+-	unsigned long value;
++	cpumask_t value = CPU_MASK_NONE;
+ 	int i;
+ 
+ 	if (!count)
+@@ -838,10 +838,9 @@ static unsigned int parse_hex_value (con
+ 	 * Parse the first 8 characters as a hex string, any non-hex char
+ 	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
+ 	 */
+-	value = 0;
+ 
+ 	for (i = 0; i < count; i++) {
+-		unsigned int c = hexnum[i];
++		unsigned int k, c = hexnum[i];
+ 
+ 		switch (c) {
+ 			case '0' ... '9': c -= '0'; break;
+@@ -850,7 +849,10 @@ static unsigned int parse_hex_value (con
+ 		default:
+ 			goto out;
+ 		}
+-		value = (value << 4) | c;
++		cpus_shift_left(value, value, 4);
++		for (k = 0; k < 4; ++k)
++			if (c & (1 << k))
++				cpu_set(k, value);
+ 	}
+ out:
+ 	*ret = value;
+@@ -861,20 +863,31 @@ out:
+ 
+ static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
+ 
+-static unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };
++static cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL };
+ static int irq_affinity_read_proc (char *page, char **start, off_t off,
+ 			int count, int *eof, void *data)
+ {
++	int k, len = 0;
++	cpumask_t tmp = irq_affinity[(long)data];
++
+ 	if (count < HEX_DIGITS+1)
+ 		return -EINVAL;
+-	return sprintf (page, "%08lx\n", irq_affinity[(long)data]);
++
++	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
++		len += j;
++		page += j;
++		cpus_shift_right(tmp, tmp, 16);
++	}
++	len += sprintf(page, "\n");
++	return len;
+ }
+ 
+ static int irq_affinity_write_proc (struct file *file, const char *buffer,
+ 					unsigned long count, void *data)
+ {
+ 	int irq = (long) data, full_count = count, err;
+-	unsigned long new_value;
++	cpumask_t new_value, tmp;
+ 
+ 	if (!irq_desc[irq].handler->set_affinity)
+ 		return -EIO;
+@@ -886,7 +899,8 @@ static int irq_affinity_write_proc (stru
+ 	 * way to make the system unusable accidentally :-) At least
+ 	 * one online CPU still has to be targeted.
+ 	 */
+-	if (!(new_value & cpu_online_map))
++	cpus_and(tmp, new_value, cpu_online_map);
++	if (cpus_empty(tmp))
+ 		return -EINVAL;
+ 
+ 	irq_affinity[irq] = new_value;
+@@ -900,17 +914,28 @@ static int irq_affinity_write_proc (stru
+ static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
+ 			int count, int *eof, void *data)
+ {
+-	unsigned long *mask = (unsigned long *) data;
++	int k, len = 0;
++	cpumask_t *mask = (cpumask_t *)data, tmp;
++
+ 	if (count < HEX_DIGITS+1)
+ 		return -EINVAL;
+-	return sprintf (page, "%08lx\n", *mask);
++
++	tmp = *mask;
++	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
++		len += j;
++		page += j;
++		cpus_shift_right(tmp, tmp, 16);
++	}
++	len += sprintf(page, "\n");
++	return len;
+ }
+ 
+ static int prof_cpu_mask_write_proc (struct file *file, const char *buffer,
+ 					unsigned long count, void *data)
+ {
+-	unsigned long *mask = (unsigned long *) data, full_count = count, err;
+-	unsigned long new_value;
++	unsigned long full_count = count, err;
++	cpumask_t new_value, *mask = (cpumask_t *)data;
+ 
+ 	err = parse_hex_value(buffer, count, &new_value);
+ 	if (err)
+--- linux-2.6.0-test1/arch/mips64/kernel/proc.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips64/kernel/proc.c	2003-07-19 17:04:07.000000000 -0700
+@@ -81,7 +81,7 @@ static int show_cpuinfo(struct seq_file 
+ 	char fmt [64];
+ 
+ #ifdef CONFIG_SMP
+-	if (!CPUMASK_TSTB(cpu_online_map, n))
++	if (!cpu_isset(n, cpu_online_map))
+ 		return 0;
+ #endif
+ 
+--- linux-2.6.0-test1/arch/mips64/kernel/setup.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips64/kernel/setup.c	2003-07-19 17:03:49.000000000 -0700
+@@ -28,9 +28,6 @@
+ #include <linux/a.out.h>
+ #include <linux/tty.h>
+ #include <linux/bootmem.h>
+-#ifdef CONFIG_BLK_DEV_RAM
+-#include <linux/blk.h>
+-#endif
+ #include <linux/major.h>
+ #include <linux/kdev_t.h>
+ #include <linux/root_dev.h>
+--- linux-2.6.0-test1/arch/mips64/kernel/smp.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips64/kernel/smp.c	2003-07-19 17:04:07.000000000 -0700
+@@ -146,7 +146,7 @@ asmlinkage void start_secondary(void)
+ 	cpu_data[cpu].udelay_val = loops_per_jiffy;
+ 	prom_smp_finish();
+ 	printk("Slave cpu booted successfully\n");
+-	CPUMASK_SETB(cpu_online_map, cpu);
++	cpu_set(cpu, cpu_online_map);
+ 	atomic_inc(&cpus_booted);
+ 	cpu_idle();
+ }
+@@ -250,7 +250,7 @@ static void stop_this_cpu(void *dummy)
+ 	/*
+ 	 * Remove this CPU:
+ 	 */
+-	clear_bit(smp_processor_id(), &cpu_online_map);
++	cpu_clear(smp_processor_id(), cpu_online_map);
+ 	local_irq_enable();	/* May need to service _machine_restart IPI */
+ 	for (;;);		/* Wait if available. */
+ }
+--- linux-2.6.0-test1/arch/mips/kernel/irq.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/kernel/irq.c	2003-07-19 17:04:07.000000000 -0700
+@@ -861,20 +861,30 @@ out:
+ 
+ static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
+ 
+-static unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };
++static cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };
+ static int irq_affinity_read_proc (char *page, char **start, off_t off,
+ 			int count, int *eof, void *data)
+ {
++	int len, k;
++	cpumask_t tmp = irq_affinity[(long)data];
++
+ 	if (count < HEX_DIGITS+1)
+ 		return -EINVAL;
+-	return sprintf (page, "%08lx\n", irq_affinity[(long)data]);
++	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
++		len += j;
++		page += j;
++		cpus_shift_right(tmp, tmp, 16);
++	}
++	len += sprintf(page, "\n");
++	return len;
+ }
+ 
+ static int irq_affinity_write_proc (struct file *file, const char *buffer,
+ 					unsigned long count, void *data)
+ {
+ 	int irq = (long) data, full_count = count, err;
+-	unsigned long new_value;
++	cpumask_t new_value, tmp;
+ 
+ 	if (!irq_desc[irq].handler->set_affinity)
+ 		return -EIO;
+@@ -886,7 +896,8 @@ static int irq_affinity_write_proc (stru
+ 	 * way to make the system unusable accidentally :-) At least
+ 	 * one online CPU still has to be targeted.
+ 	 */
+-	if (!(new_value & cpu_online_map))
++	cpus_and(tmp, tmp, cpu_online_map);
++	if (cpus_empty(tmp))
+ 		return -EINVAL;
+ 
+ 	irq_affinity[irq] = new_value;
+@@ -900,17 +911,28 @@ static int irq_affinity_write_proc (stru
+ static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
+ 			int count, int *eof, void *data)
+ {
+-	unsigned long *mask = (unsigned long *) data;
++	int len, k;
++	cpumask_t *mask = (cpumask_t *)data, tmp;
++
+ 	if (count < HEX_DIGITS+1)
+ 		return -EINVAL;
+-	return sprintf (page, "%08lx\n", *mask);
++	tmp = *mask;
++
++	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
++		len += j;
++		page += j;
++		cpus_shift_right(tmp, tmp, 16);
++	}
++	len += sprintf(page, "\n");
++	return len;
+ }
+ 
+ static int prof_cpu_mask_write_proc (struct file *file, const char *buffer,
+ 					unsigned long count, void *data)
+ {
+-	unsigned long *mask = (unsigned long *) data, full_count = count, err;
+-	unsigned long new_value;
++	cpumask_t *mask = (cpumask_t *)data, new_value;
++	unsigned long full_count = count, err;
+ 
+ 	err = parse_hex_value(buffer, count, &new_value);
+ 	if (err)
+--- linux-2.6.0-test1/arch/mips/kernel/proc.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/kernel/proc.c	2003-07-19 17:04:07.000000000 -0700
+@@ -81,7 +81,7 @@ static int show_cpuinfo(struct seq_file 
+ 	char fmt [64];
+ 
+ #ifdef CONFIG_SMP
+-	if (!CPUMASK_TSTB(cpu_online_map, n))
++	if (!cpu_isset(n, cpu_online_map))
+ 		return 0;
+ #endif
+ 
+--- linux-2.6.0-test1/arch/mips/kernel/smp.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/kernel/smp.c	2003-07-19 17:04:07.000000000 -0700
+@@ -146,7 +146,7 @@ asmlinkage void start_secondary(void)
+ 	cpu_data[cpu].udelay_val = loops_per_jiffy;
+ 	prom_smp_finish();
+ 	printk("Slave cpu booted successfully\n");
+-	CPUMASK_SETB(cpu_online_map, cpu);
++	cpu_set(cpu, cpu_online_map);
+ 	atomic_inc(&cpus_booted);
+ 	cpu_idle();
+ }
+@@ -250,7 +250,7 @@ static void stop_this_cpu(void *dummy)
+ 	/*
+ 	 * Remove this CPU:
+ 	 */
+-	clear_bit(smp_processor_id(), &cpu_online_map);
++	cpu_clear(smp_processor_id(), cpu_online_map);
+ 	local_irq_enable();	/* May need to service _machine_restart IPI */
+ 	for (;;);		/* Wait if available. */
+ }
+--- linux-2.6.0-test1/arch/mips/mm/fault.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/mm/fault.c	2003-07-19 17:03:49.000000000 -0700
+@@ -162,7 +162,7 @@ bad_area:
+ 		tsk->thread.cp0_badvaddr = address;
+ 		tsk->thread.error_code = write;
+ #if 0
+-		printk("do_page_fault() #2: sending SIGSEGV to %s for illegal %s\n"
++		printk("do_page_fault() #2: sending SIGSEGV to %s for invalid %s\n"
+ 		       "%08lx (epc == %08lx, ra == %08lx)\n",
+ 		       tsk->comm,
+ 		       write ? "write access to" : "read access from",
+--- linux-2.6.0-test1/arch/mips/mm/init.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/mm/init.c	2003-07-19 17:03:49.000000000 -0700
+@@ -24,7 +24,7 @@
+ #include <linux/bootmem.h>
+ #include <linux/highmem.h>
+ #include <linux/swap.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ 
+ #include <asm/bootinfo.h>
+ #include <asm/cacheflush.h>
+--- linux-2.6.0-test1/arch/mips/mm/ioremap.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/mm/ioremap.c	2003-07-19 17:07:16.000000000 -0700
+@@ -81,7 +81,7 @@ static int remap_area_pages(unsigned lon
+ 	spin_lock(&init_mm.page_table_lock);
+ 	do {
+ 		pmd_t *pmd;
+-		pmd = pmd_alloc(&init_mm, dir, address);
++		pmd = pmd_alloc_kernel(&init_mm, dir, address);
+ 		error = -ENOMEM;
+ 		if (!pmd)
+ 			break;
+--- linux-2.6.0-test1/arch/mips/momentum/ocelot_c/setup.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/momentum/ocelot_c/setup.c	2003-07-19 17:03:49.000000000 -0700
+@@ -63,7 +63,7 @@
+ #include <asm/mc146818rtc.h>
+ #include <linux/version.h>
+ #include <linux/bootmem.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/mv64340.h>
+ #include "ocelot_c_fpga.h"
+ 
+--- linux-2.6.0-test1/arch/mips/momentum/ocelot_g/setup.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/momentum/ocelot_g/setup.c	2003-07-19 17:03:49.000000000 -0700
+@@ -64,7 +64,7 @@
+ #include <asm/mc146818rtc.h>
+ #include <linux/version.h>
+ #include <linux/bootmem.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "gt64240.h"
+ #include "ocelot_pld.h"
+ 
+--- linux-2.6.0-test1/arch/mips/ramdisk/Makefile	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/ramdisk/Makefile	2003-07-19 17:03:49.000000000 -0700
+@@ -2,7 +2,7 @@
+ # Makefile for a ramdisk image
+ #
+ 
+-O_FORMAT = $(shell $(OBJDUMP) -i | head -2 | grep elf32)
++O_FORMAT = $(shell $(OBJDUMP) -i | head -n 2 | grep elf32)
+ img = $(CONFIG_EMBEDDED_RAMDISK_IMAGE)
+ ramdisk.o: $(subst ",,$(img)) ld.script
+ 	echo "O_FORMAT:  " $(O_FORMAT)
+--- linux-2.6.0-test1/arch/mips/sgi-ip27/ip27-init.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/sgi-ip27/ip27-init.c	2003-07-19 17:04:07.000000000 -0700
+@@ -481,7 +481,7 @@ static int __init do_boot_cpu(int cpu, i
+ 	 */
+ 	__cpu_number_map[cpu] = num_cpus;
+ 	__cpu_logical_map[num_cpus] = cpu;
+-	CPUMASK_SETB(cpu_online_map, cpu);
++	cpu_set(cpu, cpu_online_map);
+ 
+ 	/*
+ 	 * Wait this cpu to start up and initialize its hub,
+--- linux-2.6.0-test1/arch/mips/sibyte/cfe/setup.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/sibyte/cfe/setup.c	2003-07-19 17:03:49.000000000 -0700
+@@ -20,7 +20,7 @@
+ #include <linux/init.h>
+ #include <linux/kernel.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/bootmem.h>
+ #include <linux/smp.h>
+ 
+--- linux-2.6.0-test1/arch/mips/sibyte/cfe/smp.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/sibyte/cfe/smp.c	2003-07-19 17:04:07.000000000 -0700
+@@ -63,7 +63,7 @@ void prom_setup_smp(void)
+ 	/* Use CFE to find out how many CPUs are available */
+ 	for (i=1; i<NR_CPUS; i++) {
+ 		if (cfe_cpu_stop(i) == 0) {
+-			CPUMASK_SETB(cpu_online_map, i);
++			cpu_set(i, cpu_online_map);
+ 		}
+ 	}
+ 	printk("Detected %i available CPU(s)\n", num_online_cpus());
+--- linux-2.6.0-test1/arch/mips/sibyte/sb1250/prom.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/sibyte/sb1250/prom.c	2003-07-19 17:03:49.000000000 -0700
+@@ -20,7 +20,7 @@
+ #include <linux/init.h>
+ #include <linux/kernel.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/bootmem.h>
+ #include <linux/smp.h>
+ 
+--- linux-2.6.0-test1/arch/mips/sibyte/sb1250/smp.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/sibyte/sb1250/smp.c	2003-07-19 17:04:07.000000000 -0700
+@@ -107,8 +107,8 @@ void __init smp_boot_cpus(void)
+ 	current_thread_info()->cpu = 0;
+ 	cpu_data[0].udelay_val = loops_per_jiffy;
+ 	cpu_data[0].asid_cache = ASID_FIRST_VERSION;
+-	CPUMASK_CLRALL(cpu_online_map);
+-	CPUMASK_SETB(cpu_online_map, 0);
++	cpus_clear(cpu_online_map);
++	cpu_set(0, cpu_online_map);
+ 	atomic_set(&cpus_booted, 1);  /* Master CPU is already booted... */
+ 	smp_tune_scheduling();
+ 
+--- linux-2.6.0-test1/arch/mips/sibyte/swarm/setup.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/sibyte/swarm/setup.c	2003-07-19 17:03:49.000000000 -0700
+@@ -23,7 +23,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/mm.h>
+ #include <linux/bootmem.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/init.h>
+ #include <linux/ide.h>
+ #include <linux/console.h>
+--- linux-2.6.0-test1/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c	2003-07-19 17:03:49.000000000 -0700
+@@ -134,7 +134,7 @@ JP7 is not bus master -- do NOT use -- o
+ #include <asm/time.h>
+ #include <linux/version.h>
+ #include <linux/bootmem.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #ifdef CONFIG_RTC_DS1742
+ #include <asm/rtc_ds1742.h>
+ #endif
+--- linux-2.6.0-test1/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c	2003-07-19 17:03:49.000000000 -0700
+@@ -62,7 +62,7 @@
+ #include <asm/time.h>
+ #include <linux/version.h>
+ #include <linux/bootmem.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/console.h>
+ #ifdef CONFIG_RTC_DS1742
+ #include <asm/rtc_ds1742.h>
+--- linux-2.6.0-test1/arch/mips/vr41xx/tanbac-tb0229/setup.c	2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/vr41xx/tanbac-tb0229/setup.c	2003-07-19 17:03:49.000000000 -0700
+@@ -18,7 +18,7 @@
+  *  option) any later version.
+  */
+ #include <linux/config.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/console.h>
+ #include <linux/init.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/arch/parisc/kernel/ioctl32.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/arch/parisc/kernel/ioctl32.c	2003-07-19 17:03:49.000000000 -0700
+@@ -48,7 +48,6 @@
+ #include <linux/raw.h>
+ #include <linux/smb_fs.h>
+ #include <linux/blkpg.h>
+-#include <linux/blk.h>
+ #include <linux/elevator.h>
+ #include <linux/rtc.h>
+ #include <linux/pci.h>
+--- linux-2.6.0-test1/arch/parisc/kernel/pci-dma.c	2003-06-14 12:18:33.000000000 -0700
++++ 25/arch/parisc/kernel/pci-dma.c	2003-07-19 17:07:16.000000000 -0700
+@@ -133,7 +133,7 @@ static inline int map_uncached_pages(uns
+ 	do {
+ 		pmd_t *pmd;
+ 		
+-		pmd = pmd_alloc(NULL, dir, vaddr);
++		pmd = pmd_alloc_kernel(NULL, dir, vaddr);
+ 		if (!pmd)
+ 			return -ENOMEM;
+ 		if (map_pmd_uncached(pmd, vaddr, end - vaddr, &paddr))
+--- linux-2.6.0-test1/arch/parisc/kernel/smp.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/parisc/kernel/smp.c	2003-07-19 17:04:07.000000000 -0700
+@@ -62,14 +62,14 @@ volatile struct task_struct *smp_init_cu
+ 
+ static volatile int smp_commenced = 0;   /* Set when the idlers are all forked */
+ static volatile int cpu_now_booting = 0;      /* track which CPU is booting */
+-volatile unsigned long cpu_online_map = 0;   /* Bitmap of online CPUs */
+-#define IS_LOGGED_IN(cpunum) (test_bit(cpunum, (atomic_t *)&cpu_online_map))
++cpumask_t cpu_online_map = CPU_MASK_NONE;   /* Bitmap of online CPUs */
++#define IS_LOGGED_IN(cpunum) (cpu_isset(cpunum, cpu_online_map))
+ 
+ int smp_num_cpus = 1;
+ int smp_threads_ready = 0;
+ unsigned long cache_decay_ticks;
+ static int max_cpus = -1;			     /* Command line */
+-unsigned long cpu_present_mask;
++cpumask_t cpu_present_mask;
+ 
+ struct smp_call_struct {
+ 	void (*func) (void *info);
+@@ -139,7 +139,7 @@ halt_processor(void) 
+ #else
+ 	/* REVISIT : redirect I/O Interrupts to another CPU? */
+ 	/* REVISIT : does PM *know* this CPU isn't available? */
+-	clear_bit(smp_processor_id(), (void *)&cpu_online_map);
++	cpu_clear(smp_processor_id(), cpu_online_map);
+ 	local_irq_disable();
+ 	for (;;)
+ 		;
+@@ -443,7 +443,7 @@ smp_cpu_init(int cpunum)
+ 	mb();
+ 
+ 	/* Well, support 2.4 linux scheme as well. */
+-	if (test_and_set_bit(cpunum, (unsigned long *) (&cpu_online_map)))
++	if (cpu_test_and_set(cpunum, cpu_online_map))
+ 	{
+ 		extern void machine_halt(void); /* arch/parisc.../process.c */
+ 
+@@ -624,13 +624,14 @@ void __init smp_boot_cpus(void)
+ 	printk(KERN_DEBUG "SMP: bootstrap CPU ID is %d\n",bootstrap_processor);
+ 	init_task.thread_info->cpu = bootstrap_processor; 
+ 	current->thread_info->cpu = bootstrap_processor;
+-	cpu_online_map = 1 << bootstrap_processor; /* Mark Boostrap processor as present */
++	/* Mark Boostrap processor as present */
++	cpu_online_map = cpumask_of_cpu(bootstrap_processor);
+ 	current->active_mm = &init_mm;
+ 
+ #ifdef ENTRY_SYS_CPUS
+ 	cpu_data[0].state = STATE_RUNNING;
+ #endif
+-	cpu_present_mask = 1UL << bootstrap_processor;
++	cpu_present_mask = cpumask_of_cpu(bootstrap_processor);
+ 
+ 	/* Nothing to do when told not to.  */
+ 	if (max_cpus == 0) {
+@@ -709,8 +710,8 @@ void __init smp_prepare_cpus(unsigned in
+ 
+ void __devinit smp_prepare_boot_cpu(void)
+ {
+-	set_bit(smp_processor_id(), &cpu_online_map);
+-	set_bit(smp_processor_id(), &cpu_present_mask);
++	cpu_set(smp_processor_id(), cpu_online_map);
++	cpu_set(smp_processor_id(), cpu_present_mask);
+ }
+ 
+ int __devinit __cpu_up(unsigned int cpu)
+--- linux-2.6.0-test1/arch/parisc/mm/ioremap.c	2003-06-14 12:18:07.000000000 -0700
++++ 25/arch/parisc/mm/ioremap.c	2003-07-19 17:07:16.000000000 -0700
+@@ -77,7 +77,7 @@ static int remap_area_pages(unsigned lon
+ 	spin_lock(&init_mm.page_table_lock);
+ 	do {
+ 		pmd_t *pmd;
+-		pmd = pmd_alloc(dir, address);
++		pmd = pmd_alloc_kernel(dir, address);
+ 		error = -ENOMEM;
+ 		if (!pmd)
+ 			break;
+--- linux-2.6.0-test1/arch/ppc64/boot/Makefile	2003-06-14 12:18:32.000000000 -0700
++++ 25/arch/ppc64/boot/Makefile	2003-07-19 17:03:49.000000000 -0700
+@@ -118,7 +118,7 @@ $(obj)/imagesize.c: vmlinux
+ 	ls -l vmlinux | \
+ 	awk '{printf "/* generated -- do not edit! */\n" \
+ 		"unsigned long vmlinux_filesize = %d;\n", $$5}' > $(obj)/imagesize.c
+-	$(CROSS_COMPILE)nm -n vmlinux | tail -1 | \
++	$(CROSS_COMPILE)nm -n vmlinux | tail -n 1 | \
+ 	awk '{printf "unsigned long vmlinux_memsize = 0x%s;\n", substr($$1,8)}' \
+ 		>> $(obj)/imagesize.c
+ 
+--- linux-2.6.0-test1/arch/ppc64/Kconfig	2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/ppc64/Kconfig	2003-07-19 17:04:07.000000000 -0700
+@@ -93,7 +93,7 @@ config IRQ_ALL_CPUS
+ 	  CPU.
+ 
+ config NR_CPUS
+-	int "Maximum number of CPUs (2-64)"
++	int "Maximum number of CPUs (2-128)"
+ 	depends on SMP
+ 	default "32"
+ 
+--- linux-2.6.0-test1/arch/ppc64/kernel/htab.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/arch/ppc64/kernel/htab.c	2003-07-19 17:04:07.000000000 -0700
+@@ -377,6 +377,7 @@ int hash_page(unsigned long ea, unsigned
+ 	int ret;
+ 	int user_region = 0;
+ 	int local = 0;
++	cpumask_t tmp;
+ 
+ 	/* Check for invalid addresses. */
+ 	if (!IS_VALID_EA(ea))
+@@ -431,7 +432,8 @@ int hash_page(unsigned long ea, unsigned
+ 	 */
+ 	spin_lock(&mm->page_table_lock);
+ 
+-	if (user_region && (mm->cpu_vm_mask == (1 << smp_processor_id())))
++	tmp = cpumask_of_cpu(smp_processor_id());
++	if (user_region && cpus_equal(mm->cpu_vm_mask, tmp))
+ 		local = 1;
+ 
+ 	ptep = find_linux_pte(pgdir, ea);
+--- linux-2.6.0-test1/arch/ppc64/kernel/irq.c	2003-06-14 12:18:08.000000000 -0700
++++ 25/arch/ppc64/kernel/irq.c	2003-07-19 17:04:07.000000000 -0700
+@@ -603,26 +603,37 @@ static struct proc_dir_entry * irq_dir [
+ static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
+ 
+ #ifdef CONFIG_IRQ_ALL_CPUS
+-unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = -1UL};
++cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL };
+ #else  /* CONFIG_IRQ_ALL_CPUS */
+-unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = 0x0};
++cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_NONE };
+ #endif /* CONFIG_IRQ_ALL_CPUS */
+ 
+-#define HEX_DIGITS 16
++#define HEX_DIGITS (2*sizeof(cpumask_t))
+ 
+ static int irq_affinity_read_proc (char *page, char **start, off_t off,
+ 			int count, int *eof, void *data)
+ {
++	int k, len;
++	cpumask_t tmp = irq_affinity[(long)data];
++
+ 	if (count < HEX_DIGITS+1)
+ 		return -EINVAL;
+-	return sprintf(page, "%16lx\n", irq_affinity[(long)data]);
++
++	for (k = 0; k < sizeof(cpumask_t) / sizeof(u16); ++k) {
++		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
++		len += j;
++		page += j;
++		cpus_shift_right(tmp, tmp, 16);
++	}
++	len += sprintf(page, "\n");
++	return len;
+ }
+ 
+ static unsigned int parse_hex_value (const char *buffer,
+-		unsigned long count, unsigned long *ret)
++		unsigned long count, cpumask_t *ret)
+ {
+ 	unsigned char hexnum [HEX_DIGITS];
+-	unsigned long value;
++	cpumask_t value = CPU_MASK_NONE;
+ 	int i;
+ 
+ 	if (!count)
+@@ -636,10 +647,10 @@ static unsigned int parse_hex_value (con
+ 	 * Parse the first 16 characters as a hex string, any non-hex char
+ 	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
+ 	 */
+-	value = 0;
+ 
+ 	for (i = 0; i < count; i++) {
+ 		unsigned int c = hexnum[i];
++		int k;
+ 
+ 		switch (c) {
+ 			case '0' ... '9': c -= '0'; break;
+@@ -648,7 +659,11 @@ static unsigned int parse_hex_value (con
+ 		default:
+ 			goto out;
+ 		}
+-		value = (value << 4) | c;
++		cpus_shift_left(value, value, 4);
++		for (k = 0; k < 4; ++k)
++			if (test_bit(k, (unsigned long *)&c))
++				cpu_set(k, value);
++
+ 	}
+ out:
+ 	*ret = value;
+@@ -659,7 +674,7 @@ static int irq_affinity_write_proc (stru
+ 					unsigned long count, void *data)
+ {
+ 	int irq = (long)data, full_count = count, err;
+-	unsigned long new_value;
++	cpumask_t new_value, tmp;
+ 
+ 	if (!irq_desc[irq].handler->set_affinity)
+ 		return -EIO;
+@@ -671,7 +686,8 @@ static int irq_affinity_write_proc (stru
+ 	 * way to make the system unusable accidentally :-) At least
+ 	 * one online CPU still has to be targeted.
+ 	 */
+-	if (!(new_value & cpu_online_map))
++	cpus_and(tmp, new_value, cpu_online_map);
++	if (cpus_empty(tmp))
+ 		return -EINVAL;
+ 
+ 	irq_affinity[irq] = new_value;
+@@ -692,8 +708,9 @@ static int prof_cpu_mask_read_proc (char
+ static int prof_cpu_mask_write_proc (struct file *file, const char *buffer,
+ 					unsigned long count, void *data)
+ {
+-	unsigned long *mask = (unsigned long *) data, full_count = count, err;
+-	unsigned long new_value;
++	cpumask_t *mask = (cpumask_t *)data;
++	unsigned long full_count = count, err;
++	cpumask_t new_value;
+ 
+ 	err = parse_hex_value(buffer, count, &new_value);
+ 	if (err)
+--- linux-2.6.0-test1/arch/ppc64/kernel/iSeries_irq.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/arch/ppc64/kernel/iSeries_irq.c	2003-07-19 17:03:49.000000000 -0700
+@@ -29,7 +29,6 @@
+ #include <linux/param.h>
+ #include <linux/string.h>
+ #include <linux/bootmem.h>
+-#include <linux/blk.h>
+ #include <linux/ide.h>
+ 
+ #include <linux/irq.h>
+--- linux-2.6.0-test1/arch/ppc64/kernel/open_pic.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/arch/ppc64/kernel/open_pic.c	2003-07-19 17:04:07.000000000 -0700
+@@ -46,7 +46,7 @@ static int broken_ipi_registers;
+ OpenPIC_SourcePtr ISU[OPENPIC_MAX_ISU];
+ 
+ static void openpic_end_irq(unsigned int irq_nr);
+-static void openpic_set_affinity(unsigned int irq_nr, unsigned long cpumask);
++static void openpic_set_affinity(unsigned int irq_nr, cpumask_t cpumask);
+ 
+ struct hw_interrupt_type open_pic = {
+ 	" OpenPIC  ",
+@@ -505,7 +505,7 @@ static void openpic_set_spurious(u_int v
+ void openpic_init_processor(u_int cpumask)
+ {
+ 	openpic_write(&OpenPIC->Global.Processor_Initialization,
+-		      cpumask & cpu_online_map);
++		      cpumask & cpus_coerce(cpu_online_map));
+ }
+ 
+ #ifdef CONFIG_SMP
+@@ -539,7 +539,7 @@ void openpic_cause_IPI(u_int ipi, u_int 
+ 	CHECK_THIS_CPU;
+ 	check_arg_ipi(ipi);
+ 	openpic_write(&OpenPIC->THIS_CPU.IPI_Dispatch(ipi),
+-		      cpumask & cpu_online_map);
++		      cpumask & cpus_coerce(cpu_online_map));
+ }
+ 
+ void openpic_request_IPIs(void)
+@@ -625,7 +625,7 @@ static void __init openpic_maptimer(u_in
+ {
+ 	check_arg_timer(timer);
+ 	openpic_write(&OpenPIC->Global.Timer[timer].Destination,
+-		      cpumask & cpu_online_map);
++		      cpumask & cpus_coerce(cpu_online_map));
+ }
+ 
+ 
+@@ -746,9 +746,12 @@ static void openpic_end_irq(unsigned int
+ 		openpic_eoi();
+ }
+ 
+-static void openpic_set_affinity(unsigned int irq_nr, unsigned long cpumask)
++static void openpic_set_affinity(unsigned int irq_nr, cpumask_t cpumask)
+ {
+-	openpic_mapirq(irq_nr - open_pic_irq_offset, cpumask & cpu_online_map);
++	cpumask_t tmp;
++
++	cpus_and(tmp, cpumask, cpu_online_map);
++	openpic_mapirq(irq_nr - open_pic_irq_offset, cpus_coerce(tmp));
+ }
+ 
+ #ifdef CONFIG_SMP
+--- linux-2.6.0-test1/arch/ppc64/kernel/open_pic.h	2003-06-14 12:17:58.000000000 -0700
++++ 25/arch/ppc64/kernel/open_pic.h	2003-07-19 17:04:07.000000000 -0700
+@@ -13,6 +13,7 @@
+ #define _PPC64_KERNEL_OPEN_PIC_H
+ 
+ #include <linux/config.h>
++#include <linux/cpumask.h>
+ 
+ #define OPENPIC_SIZE	0x40000
+ 
+--- linux-2.6.0-test1/arch/ppc64/kernel/pacaData.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/arch/ppc64/kernel/pacaData.c	2003-07-19 17:04:07.000000000 -0700
+@@ -134,5 +134,71 @@ struct paca_struct paca[NR_CPUS] __page_
+ 	PACAINITDATA(61, 0, 0, 0, 0),
+ 	PACAINITDATA(62, 0, 0, 0, 0),
+ 	PACAINITDATA(63, 0, 0, 0, 0),
++#if NR_CPUS > 64
++	PACAINITDATA(64, 0, 0, 0, 0),
++	PACAINITDATA(65, 0, 0, 0, 0),
++	PACAINITDATA(66, 0, 0, 0, 0),
++	PACAINITDATA(67, 0, 0, 0, 0),
++	PACAINITDATA(68, 0, 0, 0, 0),
++	PACAINITDATA(69, 0, 0, 0, 0),
++	PACAINITDATA(70, 0, 0, 0, 0),
++	PACAINITDATA(71, 0, 0, 0, 0),
++	PACAINITDATA(72, 0, 0, 0, 0),
++	PACAINITDATA(73, 0, 0, 0, 0),
++	PACAINITDATA(74, 0, 0, 0, 0),
++	PACAINITDATA(75, 0, 0, 0, 0),
++	PACAINITDATA(76, 0, 0, 0, 0),
++	PACAINITDATA(77, 0, 0, 0, 0),
++	PACAINITDATA(78, 0, 0, 0, 0),
++	PACAINITDATA(79, 0, 0, 0, 0),
++	PACAINITDATA(80, 0, 0, 0, 0),
++	PACAINITDATA(81, 0, 0, 0, 0),
++	PACAINITDATA(82, 0, 0, 0, 0),
++	PACAINITDATA(83, 0, 0, 0, 0),
++	PACAINITDATA(84, 0, 0, 0, 0),
++	PACAINITDATA(85, 0, 0, 0, 0),
++	PACAINITDATA(86, 0, 0, 0, 0),
++	PACAINITDATA(87, 0, 0, 0, 0),
++	PACAINITDATA(88, 0, 0, 0, 0),
++	PACAINITDATA(89, 0, 0, 0, 0),
++	PACAINITDATA(90, 0, 0, 0, 0),
++	PACAINITDATA(91, 0, 0, 0, 0),
++	PACAINITDATA(92, 0, 0, 0, 0),
++	PACAINITDATA(93, 0, 0, 0, 0),
++	PACAINITDATA(94, 0, 0, 0, 0),
++	PACAINITDATA(95, 0, 0, 0, 0),
++	PACAINITDATA(96, 0, 0, 0, 0),
++	PACAINITDATA(97, 0, 0, 0, 0),
++	PACAINITDATA(98, 0, 0, 0, 0),
++	PACAINITDATA(99, 0, 0, 0, 0),
++	PACAINITDATA(100, 0, 0, 0, 0),
++	PACAINITDATA(101, 0, 0, 0, 0),
++	PACAINITDATA(102, 0, 0, 0, 0),
++	PACAINITDATA(103, 0, 0, 0, 0),
++	PACAINITDATA(104, 0, 0, 0, 0),
++	PACAINITDATA(105, 0, 0, 0, 0),
++	PACAINITDATA(106, 0, 0, 0, 0),
++	PACAINITDATA(107, 0, 0, 0, 0),
++	PACAINITDATA(108, 0, 0, 0, 0),
++	PACAINITDATA(109, 0, 0, 0, 0),
++	PACAINITDATA(110, 0, 0, 0, 0),
++	PACAINITDATA(111, 0, 0, 0, 0),
++	PACAINITDATA(112, 0, 0, 0, 0),
++	PACAINITDATA(113, 0, 0, 0, 0),
++	PACAINITDATA(114, 0, 0, 0, 0),
++	PACAINITDATA(115, 0, 0, 0, 0),
++	PACAINITDATA(116, 0, 0, 0, 0),
++	PACAINITDATA(117, 0, 0, 0, 0),
++	PACAINITDATA(118, 0, 0, 0, 0),
++	PACAINITDATA(119, 0, 0, 0, 0),
++	PACAINITDATA(120, 0, 0, 0, 0),
++	PACAINITDATA(121, 0, 0, 0, 0),
++	PACAINITDATA(122, 0, 0, 0, 0),
++	PACAINITDATA(123, 0, 0, 0, 0),
++	PACAINITDATA(124, 0, 0, 0, 0),
++	PACAINITDATA(125, 0, 0, 0, 0),
++	PACAINITDATA(126, 0, 0, 0, 0),
++	PACAINITDATA(127, 0, 0, 0, 0),
++#endif
+ #endif
+ };
+--- linux-2.6.0-test1/arch/ppc64/kernel/prom.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/ppc64/kernel/prom.c	2003-07-19 17:04:07.000000000 -0700
+@@ -27,7 +27,6 @@
+ #include <linux/version.h>
+ #include <linux/threads.h>
+ #include <linux/spinlock.h>
+-#include <linux/blk.h>
+ #include <linux/types.h>
+ #include <linux/pci.h>
+ #include <asm/prom.h>
+@@ -1134,7 +1133,7 @@ prom_init(unsigned long r3, unsigned lon
+ 	_prom->cpu = (int)(unsigned long)getprop_rval;
+ 	_xPaca[_prom->cpu].active = 1;
+ #ifdef CONFIG_SMP
+-	RELOC(cpu_online_map) = 1UL << _prom->cpu;
++	cpu_set(_prom->cpu, RELOC(cpu_online_map));
+ #endif
+ 	RELOC(boot_cpuid) = _prom->cpu;
+ 
+--- linux-2.6.0-test1/arch/ppc64/kernel/rtasd.c	2003-06-14 12:18:06.000000000 -0700
++++ 25/arch/ppc64/kernel/rtasd.c	2003-07-19 17:04:07.000000000 -0700
+@@ -225,7 +225,7 @@ repeat:
+ 			continue;
+ 
+ 		DEBUG("scheduling on %d\n", cpu);
+-		set_cpus_allowed(current, 1UL << cpu);
++		set_cpus_allowed(current, cpumask_of_cpu(cpu));
+ 		DEBUG("watchdog scheduled on cpu %d\n", smp_processor_id());
+ 
+ 		do {
+--- linux-2.6.0-test1/arch/ppc64/kernel/semaphore.c	2003-06-26 22:07:24.000000000 -0700
++++ 25/arch/ppc64/kernel/semaphore.c	2003-07-19 17:04:51.000000000 -0700
+@@ -21,6 +21,7 @@
+ #include <asm/semaphore.h>
+ #include <asm/errno.h>
+ 
++#if 0
+ /*
+  * Atomically update sem->count.
+  * This does the equivalent of the following:
+@@ -129,3 +130,140 @@ int __down_interruptible(struct semaphor
+ 	wake_up(&sem->wait);
+ 	return retval;
+ }
++#else
++
++static __inline__ int atomic_add_negative(int i, atomic_t *v)
++{
++	if (atomic_add_return(i, v) < 0)
++		return 1;
++	else
++		return 0;
++}
++
++void __up(struct semaphore *sem)
++{
++	wake_up(&sem->wait);
++}
++
++void __down(struct semaphore * sem)
++{
++	struct task_struct *tsk = current;
++	DECLARE_WAITQUEUE(wait, tsk);
++	unsigned long flags;
++
++	tsk->state = TASK_UNINTERRUPTIBLE;
++	spin_lock_irqsave(&sem->wait.lock, flags);
++	add_wait_queue_exclusive_locked(&sem->wait, &wait);
++
++	sem->sleepers++;
++	for (;;) {
++		int sleepers = sem->sleepers;
++
++		/*
++		 * Add "everybody else" into it. They aren't
++		 * playing, because we own the spinlock in
++		 * the wait_queue_head.
++		 */
++		if (!atomic_add_negative(sleepers - 1, &sem->count)) {
++			sem->sleepers = 0;
++			break;
++		}
++		sem->sleepers = 1;	/* us - see -1 above */
++		spin_unlock_irqrestore(&sem->wait.lock, flags);
++
++		schedule();
++
++		spin_lock_irqsave(&sem->wait.lock, flags);
++		tsk->state = TASK_UNINTERRUPTIBLE;
++	}
++	remove_wait_queue_locked(&sem->wait, &wait);
++	wake_up_locked(&sem->wait);
++	spin_unlock_irqrestore(&sem->wait.lock, flags);
++	tsk->state = TASK_RUNNING;
++}
++
++int __down_interruptible(struct semaphore * sem)
++{
++	int retval = 0;
++	struct task_struct *tsk = current;
++	DECLARE_WAITQUEUE(wait, tsk);
++	unsigned long flags;
++
++	tsk->state = TASK_INTERRUPTIBLE;
++	spin_lock_irqsave(&sem->wait.lock, flags);
++	add_wait_queue_exclusive_locked(&sem->wait, &wait);
++
++	sem->sleepers++;
++	for (;;) {
++		int sleepers = sem->sleepers;
++
++		/*
++		 * With signals pending, this turns into
++		 * the trylock failure case - we won't be
++		 * sleeping, and we* can't get the lock as
++		 * it has contention. Just correct the count
++		 * and exit.
++		 */
++		if (signal_pending(current)) {
++			retval = -EINTR;
++			sem->sleepers = 0;
++			atomic_add(sleepers, &sem->count);
++			break;
++		}
++
++		/*
++		 * Add "everybody else" into it. They aren't
++		 * playing, because we own the spinlock in
++		 * wait_queue_head. The "-1" is because we're
++		 * still hoping to get the semaphore.
++		 */
++		if (!atomic_add_negative(sleepers - 1, &sem->count)) {
++			sem->sleepers = 0;
++			break;
++		}
++		sem->sleepers = 1;	/* us - see -1 above */
++		spin_unlock_irqrestore(&sem->wait.lock, flags);
++
++		schedule();
++
++		spin_lock_irqsave(&sem->wait.lock, flags);
++		tsk->state = TASK_INTERRUPTIBLE;
++	}
++	remove_wait_queue_locked(&sem->wait, &wait);
++	wake_up_locked(&sem->wait);
++	spin_unlock_irqrestore(&sem->wait.lock, flags);
++
++	tsk->state = TASK_RUNNING;
++	return retval;
++}
++
++/*
++ * Trylock failed - make sure we correct for
++ * having decremented the count.
++ *
++ * We could have done the trylock with a
++ * single "cmpxchg" without failure cases,
++ * but then it wouldn't work on a 386.
++ */
++int __down_trylock(struct semaphore * sem)
++{
++	int sleepers;
++	unsigned long flags;
++
++	spin_lock_irqsave(&sem->wait.lock, flags);
++	sleepers = sem->sleepers + 1;
++	sem->sleepers = 0;
++
++	/*
++	 * Add "everybody else" and us into it. They aren't
++	 * playing, because we own the spinlock in the
++	 * wait_queue_head.
++	 */
++	if (!atomic_add_negative(sleepers, &sem->count)) {
++		wake_up_locked(&sem->wait);
++	}
++
++	spin_unlock_irqrestore(&sem->wait.lock, flags);
++	return 1;
++}
++#endif
+--- linux-2.6.0-test1/arch/ppc64/kernel/setup.c	2003-06-14 12:18:09.000000000 -0700
++++ 25/arch/ppc64/kernel/setup.c	2003-07-19 17:04:07.000000000 -0700
+@@ -256,7 +256,7 @@ static int show_cpuinfo(struct seq_file 
+ 		return 0;
+ 	}
+ 
+-	if (!(cpu_online_map & (1UL << cpu_id)))
++	if (!cpu_online(cpu_id))
+ 		return 0;
+ 
+ #ifdef CONFIG_SMP
+--- linux-2.6.0-test1/arch/ppc64/kernel/smp.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/ppc64/kernel/smp.c	2003-07-19 17:04:07.000000000 -0700
+@@ -53,7 +53,7 @@ int smp_threads_ready;
+ unsigned long cache_decay_ticks;
+ 
+ /* initialised so it doesn't end up in bss */
+-unsigned long cpu_online_map = 0;
++cpumask_t cpu_online_map = CPU_MASK_NONE;
+ 
+ static struct smp_ops_t *smp_ops;
+ 
+@@ -570,7 +570,7 @@ void __init smp_prepare_cpus(unsigned in
+ 
+ void __devinit smp_prepare_boot_cpu(void)
+ {
+-	set_bit(smp_processor_id(), &cpu_online_map);
++	cpu_set(smp_processor_id(), cpu_online_map);
+ 	/* FIXME: what about cpu_possible()? */
+ }
+ 
+@@ -631,7 +631,7 @@ int __devinit __cpu_up(unsigned int cpu)
+ 
+ 	if (smp_ops->give_timebase)
+ 		smp_ops->give_timebase();
+-	set_bit(cpu, &cpu_online_map);
++	cpu_set(cpu, cpu_online_map);
+ 	return 0;
+ }
+ 
+--- linux-2.6.0-test1/arch/ppc64/kernel/xics.c	2003-06-14 12:18:22.000000000 -0700
++++ 25/arch/ppc64/kernel/xics.c	2003-07-19 17:04:07.000000000 -0700
+@@ -33,7 +33,7 @@ void xics_enable_irq(u_int irq);
+ void xics_disable_irq(u_int irq);
+ void xics_mask_and_ack_irq(u_int irq);
+ void xics_end_irq(u_int irq);
+-void xics_set_affinity(unsigned int irq_nr, unsigned long cpumask);
++void xics_set_affinity(unsigned int irq_nr, cpumask_t cpumask);
+ 
+ struct hw_interrupt_type xics_pic = {
+ 	" XICS     ",
+@@ -508,7 +508,7 @@ nextnode:
+ 	ppc64_boot_msg(0x21, "XICS Done");
+ }
+ 
+-void xics_set_affinity(unsigned int virq, unsigned long cpumask)
++void xics_set_affinity(unsigned int virq, cpumask_t cpumask)
+ {
+         irq_desc_t *desc = irq_desc + virq;
+ 	unsigned int irq;
+@@ -516,6 +516,8 @@ void xics_set_affinity(unsigned int virq
+ 	long status;
+ 	unsigned long xics_status[2];
+ 	unsigned long newmask;
++	cpumask_t allcpus = CPU_MASK_ALL;
++	cpumask_t tmp = CPU_MASK_NONE;
+ 
+ 	virq -= XICS_IRQ_OFFSET;
+ 	irq = virt_irq_to_real(virq);
+@@ -533,12 +535,13 @@ void xics_set_affinity(unsigned int virq
+ 	}
+ 
+ 	/* For the moment only implement delivery to all cpus or one cpu */
+-	if (cpumask == -1UL) {
++	if (cpus_equal(cpumask, allcpus)) {
+ 		newmask = default_distrib_server;
+ 	} else {
+-		if (!(cpumask & cpu_online_map))
++		cpus_and(tmp, cpu_online_map, cpumask);
++		if (cpus_empty(tmp))
+ 			goto out;
+-		newmask = find_first_bit(&cpumask, 8*sizeof(unsigned long));
++		newmask = first_cpu(cpumask);
+ 	}
+ 
+ 	status = rtas_call(ibm_set_xive, 3, 1, NULL,
+--- linux-2.6.0-test1/arch/ppc64/kernel/XmPciLpEvent.c	2003-06-14 12:18:21.000000000 -0700
++++ 25/arch/ppc64/kernel/XmPciLpEvent.c	2003-07-19 17:03:49.000000000 -0700
+@@ -12,7 +12,6 @@
+ #include <linux/param.h>
+ #include <linux/string.h>
+ #include <linux/bootmem.h>
+-#include <linux/blk.h>
+ #include <linux/ide.h>
+ 
+ #include <asm/iSeries/HvTypes.h>
+--- linux-2.6.0-test1/arch/ppc64/mm/init.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/ppc64/mm/init.c	2003-07-19 17:07:16.000000000 -0700
+@@ -37,9 +37,6 @@
+ #include <linux/bootmem.h>
+ #include <linux/highmem.h>
+ #include <linux/proc_fs.h>
+-#ifdef CONFIG_BLK_DEV_INITRD
+-#include <linux/blk.h>		/* for initrd_* */
+-#endif
+ 
+ #include <asm/pgalloc.h>
+ #include <asm/page.h>
+@@ -211,7 +208,7 @@ static void map_io_page(unsigned long ea
+ 	if (mem_init_done) {
+ 		spin_lock(&ioremap_mm.page_table_lock);
+ 		pgdp = pgd_offset_i(ea);
+-		pmdp = pmd_alloc(&ioremap_mm, pgdp, ea);
++		pmdp = pmd_alloc_kernel(&ioremap_mm, pgdp, ea);
+ 		ptep = pte_alloc_kernel(&ioremap_mm, pmdp, ea);
+ 
+ 		pa = absolute_to_phys(pa);
+@@ -253,7 +250,7 @@ flush_tlb_mm(struct mm_struct *mm)
+ 		__flush_tlb_range(mm, mp->vm_start, mp->vm_end);
+ 
+ 	/* XXX are there races with checking cpu_vm_mask? - Anton */
+-	mm->cpu_vm_mask = 0;
++	cpus_clear(mm->cpu_vm_mask);
+ 
+ 	spin_unlock(&mm->page_table_lock);
+ }
+@@ -270,6 +267,7 @@ flush_tlb_page(struct vm_area_struct *vm
+ 	pte_t *ptep;
+ 	pte_t pte;
+ 	int local = 0;
++	cpumask_t tmp;
+ 
+ 	switch( REGION_ID(vmaddr) ) {
+ 	case VMALLOC_REGION_ID:
+@@ -283,7 +281,8 @@ flush_tlb_page(struct vm_area_struct *vm
+ 		context = vma->vm_mm->context;
+ 
+ 		/* XXX are there races with checking cpu_vm_mask? - Anton */
+-		if (vma->vm_mm->cpu_vm_mask == (1 << smp_processor_id()))
++		tmp = cpumask_of_cpu(smp_processor_id());
++		if (cpus_equal(vma->vm_mm->cpu_vm_mask, tmp))
+ 			local = 1;
+ 
+ 		break;
+@@ -319,6 +318,7 @@ __flush_tlb_range(struct mm_struct *mm, 
+ 	struct ppc64_tlb_batch *batch = &ppc64_tlb_batch[smp_processor_id()];
+ 	unsigned long i = 0;
+ 	int local = 0;
++	cpumask_t tmp;
+ 
+ 	switch(REGION_ID(start)) {
+ 	case VMALLOC_REGION_ID:
+@@ -332,7 +332,8 @@ __flush_tlb_range(struct mm_struct *mm, 
+ 		context = mm->context;
+ 
+ 		/* XXX are there races with checking cpu_vm_mask? - Anton */
+-		if (mm->cpu_vm_mask == (1 << smp_processor_id()))
++		tmp = cpumask_of_cpu(smp_processor_id());
++		if (cpus_equal(mm->cpu_vm_mask, tmp))
+ 			local = 1;
+ 
+ 		break;
+@@ -698,6 +699,7 @@ void update_mmu_cache(struct vm_area_str
+ 	void *pgdir;
+ 	pte_t *ptep;
+ 	int local = 0;
++	cpumask_t tmp;
+ 
+ 	/* handle i-cache coherency */
+ 	if (!(cur_cpu_spec->cpu_features & CPU_FTR_NOEXECUTE)) {
+@@ -723,7 +725,8 @@ void update_mmu_cache(struct vm_area_str
+ 	ptep = find_linux_pte(pgdir, ea);
+ 	vsid = get_vsid(vma->vm_mm->context, ea);
+ 
+-	if (vma->vm_mm->cpu_vm_mask == (1 << smp_processor_id()))
++	tmp = cpumask_of_cpu(smp_processor_id());
++	if (cpus_equal(vma->vm_mm->cpu_vm_mask, tmp))
+ 		local = 1;
+ 
+ 	__hash_page(ea, pte_val(pte) & (_PAGE_USER|_PAGE_RW), vsid, ptep,
+--- linux-2.6.0-test1/arch/ppc/kernel/irq.c	2003-06-14 12:18:30.000000000 -0700
++++ 25/arch/ppc/kernel/irq.c	2003-07-19 17:04:07.000000000 -0700
+@@ -44,6 +44,7 @@
+ #include <linux/proc_fs.h>
+ #include <linux/random.h>
+ #include <linux/seq_file.h>
++#include <linux/cpumask.h>
+ 
+ #include <asm/uaccess.h>
+ #include <asm/bitops.h>
+@@ -420,10 +421,9 @@ void ppc_irq_dispatch_handler(struct pt_
+ {
+ 	int status;
+ 	struct irqaction *action;
+-	int cpu = smp_processor_id();
+ 	irq_desc_t *desc = irq_desc + irq;
+ 
+-	kstat_cpu(cpu).irqs[irq]++;
++	kstat_this_cpu.irqs[irq]++;
+ 	spin_lock(&desc->lock);
+ 	ack_irq(irq);	
+ 	/*
+@@ -565,29 +565,41 @@ static struct proc_dir_entry *irq_dir[NR
+ static struct proc_dir_entry *smp_affinity_entry[NR_IRQS];
+ 
+ #ifdef CONFIG_IRQ_ALL_CPUS
+-#define DEFAULT_CPU_AFFINITY 0xffffffff
++#define DEFAULT_CPU_AFFINITY CPU_MASK_ALL
+ #else
+-#define DEFAULT_CPU_AFFINITY 0x00000001
++#define DEFAULT_CPU_AFFINITY cpumask_of_cpu(0)
+ #endif
+ 
+-unsigned int irq_affinity [NR_IRQS] =
++cpumask_t irq_affinity [NR_IRQS] =
+ 	{ [0 ... NR_IRQS-1] = DEFAULT_CPU_AFFINITY };
+ 
+-#define HEX_DIGITS 8
++#define HEX_DIGITS (2*sizeof(cpumask_t))
+ 
+ static int irq_affinity_read_proc (char *page, char **start, off_t off,
+ 			int count, int *eof, void *data)
+ {
++	cpumask_t tmp = irq_affinity[(long)data];
++	int k, len = 0;
++
+ 	if (count < HEX_DIGITS+1)
+ 		return -EINVAL;
+-	return sprintf (page, "%08x\n", irq_affinity[(int)data]);
++
++	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
++		len += j;
++		page += j;
++		cpus_shift_right(tmp, tmp, 16);
++	}
++
++	len += sprintf(page, "\n");
++	return len;
+ }
+ 
+ static unsigned int parse_hex_value (const char __user *buffer,
+-		unsigned long count, unsigned long *ret)
++		unsigned long count, cpumask_t *ret)
+ {
+ 	unsigned char hexnum [HEX_DIGITS];
+-	unsigned long value;
++	cpumask_t value = CPU_MASK_NONE;
+ 	int i;
+ 
+ 	if (!count)
+@@ -601,10 +613,9 @@ static unsigned int parse_hex_value (con
+ 	 * Parse the first 8 characters as a hex string, any non-hex char
+ 	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
+ 	 */
+-	value = 0;
+-
+ 	for (i = 0; i < count; i++) {
+ 		unsigned int c = hexnum[i];
++		int k;
+ 
+ 		switch (c) {
+ 			case '0' ... '9': c -= '0'; break;
+@@ -613,7 +624,10 @@ static unsigned int parse_hex_value (con
+ 		default:
+ 			goto out;
+ 		}
+-		value = (value << 4) | c;
++		cpus_shift_left(value, value, 4);
++		for (k = 0; k < 4; ++k)
++			if (c & (1 << k))
++				cpu_set(k, value);
+ 	}
+ out:
+ 	*ret = value;
+@@ -624,7 +638,7 @@ static int irq_affinity_write_proc (stru
+ 					unsigned long count, void *data)
+ {
+ 	int irq = (int) data, full_count = count, err;
+-	unsigned long new_value;
++	cpumask_t new_value, tmp;
+ 
+ 	if (!irq_desc[irq].handler->set_affinity)
+ 		return -EIO;
+@@ -641,7 +655,8 @@ static int irq_affinity_write_proc (stru
+ 	 * are actually logical cpu #'s then we have no problem.
+ 	 *  -- Cort <cort@fsmlabs.com>
+ 	 */
+-	if (!(new_value & cpu_online_map))
++	cpus_and(tmp, new_value, cpu_online_map);
++	if (cpus_empty(tmp))
+ 		return -EINVAL;
+ 
+ 	irq_affinity[irq] = new_value;
+@@ -653,17 +668,27 @@ static int irq_affinity_write_proc (stru
+ static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
+ 			int count, int *eof, void *data)
+ {
+-	unsigned long *mask = (unsigned long *) data;
++	cpumask_t mask = *(cpumask_t *)data;
++	int k, len = 0;
++
+ 	if (count < HEX_DIGITS+1)
+ 		return -EINVAL;
+-	return sprintf (page, "%08lx\n", *mask);
++
++	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++		int j = sprintf(page, "%04hx", (u16)cpus_coerce(mask));
++		len += j;
++		page += j;
++		cpus_shift_right(mask, mask, 16);
++	}
++	len += sprintf(page, "\n");
++	return len;
+ }
+ 
+ static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer,
+ 					unsigned long count, void *data)
+ {
+-	unsigned long *mask = (unsigned long *) data, full_count = count, err;
+-	unsigned long new_value;
++	cpumask_t *mask = (cpumask_t *)data, full_count = count, err;
++	cpumask_t new_value;
+ 
+ 	err = parse_hex_value(buffer, count, &new_value);
+ 	if (err)
+--- linux-2.6.0-test1/arch/ppc/kernel/misc.S	2003-06-14 12:18:33.000000000 -0700
++++ 25/arch/ppc/kernel/misc.S	2003-07-19 17:03:49.000000000 -0700
+@@ -1375,3 +1375,8 @@ _GLOBAL(sys_call_table)
+ 	.long sys_clock_gettime
+ 	.long sys_clock_getres
+ 	.long sys_clock_nanosleep
++	.long sys_ni_syscall	/* reserved for swapcontext */
++	.long sys_tgkill	/* 250 */
++	.long sys_utimes
++	.long sys_statfs64
++	.long sys_fstatfs64
+--- linux-2.6.0-test1/arch/ppc/kernel/setup.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/ppc/kernel/setup.c	2003-07-19 17:04:07.000000000 -0700
+@@ -159,7 +159,7 @@ int show_cpuinfo(struct seq_file *m, voi
+ 	}
+ 
+ #ifdef CONFIG_SMP
+-	if (!(cpu_online_map & (1 << i)))
++	if (!cpu_online(i))
+ 		return 0;
+ 	pvr = cpu_data[i].pvr;
+ 	lpj = cpu_data[i].loops_per_jiffy;
+--- linux-2.6.0-test1/arch/ppc/kernel/smp.c	2003-06-14 12:18:34.000000000 -0700
++++ 25/arch/ppc/kernel/smp.c	2003-07-19 17:04:07.000000000 -0700
+@@ -47,7 +47,7 @@ atomic_t ipi_sent;
+ DEFINE_PER_CPU(unsigned int, prof_multiplier);
+ DEFINE_PER_CPU(unsigned int, prof_counter);
+ unsigned long cache_decay_ticks = HZ/100;
+-unsigned long cpu_online_map = 1UL;
++unsigned long cpu_online_map = cpumask_of_cpu(0);
+ unsigned long cpu_possible_map = 1UL;
+ int smp_hw_index[NR_CPUS];
+ struct thread_info *secondary_ti;
+@@ -361,8 +361,8 @@ void __init smp_prepare_cpus(unsigned in
+ 
+ void __devinit smp_prepare_boot_cpu(void)
+ {
+-	set_bit(smp_processor_id(), &cpu_online_map);
+-	set_bit(smp_processor_id(), &cpu_possible_map);
++	cpu_set(smp_processor_id(), cpu_online_map);
++	cpu_set(smp_processor_id(), cpu_possible_map);
+ }
+ 
+ int __init setup_profiling_timer(unsigned int multiplier)
+@@ -444,7 +444,7 @@ int __cpu_up(unsigned int cpu)
+ 	printk("Processor %d found.\n", cpu);
+ 
+ 	smp_ops->give_timebase();
+-	set_bit(cpu, &cpu_online_map);
++	cpu_set(cpu, cpu_online_map);
+ 	return 0;
+ }
+ 
+--- linux-2.6.0-test1/arch/ppc/kernel/syscalls.c	2003-06-14 12:18:34.000000000 -0700
++++ 25/arch/ppc/kernel/syscalls.c	2003-07-19 17:03:49.000000000 -0700
+@@ -20,7 +20,6 @@
+  *
+  */
+ 
+-#include <linux/config.h>
+ #include <linux/errno.h>
+ #include <linux/sched.h>
+ #include <linux/mm.h>
+@@ -59,10 +58,15 @@ sys_ipc (uint call, int first, int secon
+ 	version = call >> 16; /* hack for backward compatibility */
+ 	call &= 0xffff;
+ 
+-	ret = -EINVAL;
++	ret = -ENOSYS;
+ 	switch (call) {
+ 	case SEMOP:
+-		ret = sys_semop (first, (struct sembuf __user *)ptr, second);
++		ret = sys_semtimedop (first, (struct sembuf __user *)ptr,
++				      second, NULL);
++		break;
++	case SEMTIMEDOP:
++		ret = sys_semtimedop (first, (struct sembuf __user *)ptr,
++				      second, (const struct timespec *) fifth);
+ 		break;
+ 	case SEMGET:
+ 		ret = sys_semget (first, second, third);
+@@ -258,6 +262,4 @@ int sys_olduname(struct oldold_utsname _
+ 	return error;
+ }
+ 
+-cond_syscall(sys_pciconfig_read);
+-cond_syscall(sys_pciconfig_write);
+ cond_syscall(sys_pciconfig_iobase);
+--- linux-2.6.0-test1/arch/ppc/kernel/time.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/arch/ppc/kernel/time.c	2003-07-19 17:03:49.000000000 -0700
+@@ -244,7 +244,7 @@ int do_settimeofday(struct timespec *tv)
+ 	time_t wtm_sec, new_sec = tv->tv_sec;
+ 	long wtm_nsec, new_nsec = tv->tv_nsec;
+ 	unsigned long flags;
+-	int tb_delta, new_nsec, new_sec;
++	int tb_delta;
+ 
+ 	if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
+ 		return -EINVAL;
+--- linux-2.6.0-test1/arch/ppc/mm/mem_pieces.c	2003-06-14 12:17:56.000000000 -0700
++++ 25/arch/ppc/mm/mem_pieces.c	2003-07-19 17:03:49.000000000 -0700
+@@ -17,7 +17,6 @@
+ #include <linux/config.h>
+ #include <linux/kernel.h>
+ #include <linux/stddef.h>
+-#include <linux/blk.h>
+ #include <linux/init.h>
+ 
+ #include "mem_pieces.h"
+--- linux-2.6.0-test1/arch/ppc/platforms/4xx/beech.c	2003-06-14 12:18:22.000000000 -0700
++++ 25/arch/ppc/platforms/4xx/beech.c	2003-07-19 17:03:49.000000000 -0700
+@@ -25,7 +25,6 @@
+  *
+  */
+ 
+-#include <linux/blk.h>
+ #include <linux/config.h>
+ #include <linux/init.h>
+ #include <linux/module.h>
+--- linux-2.6.0-test1/arch/ppc/platforms/4xx/sycamore.c	2003-06-14 12:18:24.000000000 -0700
++++ 25/arch/ppc/platforms/4xx/sycamore.c	2003-07-19 17:03:49.000000000 -0700
+@@ -17,7 +17,6 @@
+ #include <linux/threads.h>
+ #include <linux/param.h>
+ #include <linux/string.h>
+-#include <linux/blk.h>
+ #include <linux/pci.h>
+ #include <linux/rtc.h>
+ 
+--- linux-2.6.0-test1/arch/ppc/platforms/4xx/walnut.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/arch/ppc/platforms/4xx/walnut.c	2003-07-19 17:03:49.000000000 -0700
+@@ -19,7 +19,6 @@
+ #include <linux/threads.h>
+ #include <linux/param.h>
+ #include <linux/string.h>
+-#include <linux/blk.h>
+ #include <linux/pci.h>
+ #include <linux/rtc.h>
+ 
+--- linux-2.6.0-test1/arch/ppc/platforms/pmac_cpufreq.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/arch/ppc/platforms/pmac_cpufreq.c	2003-07-19 17:03:49.000000000 -0700
+@@ -176,7 +176,7 @@ do_set_cpu_speed(int speed_mode)
+ 	
+ 	freqs.old = cur_freq;
+ 	freqs.new = (speed_mode == PMAC_CPU_HIGH_SPEED) ? hi_freq : low_freq;
+-	freqs.cpu = CPUFREQ_ALL_CPUS;
++	freqs.cpu = smp_processor_id();
+ 
+ 	cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
+ 	if (cpufreq_uses_pmu)
+--- linux-2.6.0-test1/arch/ppc/platforms/residual.c	2003-06-14 12:18:00.000000000 -0700
++++ 25/arch/ppc/platforms/residual.c	2003-07-19 17:03:49.000000000 -0700
+@@ -36,7 +36,6 @@
+ #include <linux/interrupt.h>
+ #include <linux/reboot.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
+ #include <linux/ioport.h>
+ #include <linux/pci.h>
+ #include <linux/ide.h>
+--- linux-2.6.0-test1/arch/s390/defconfig	2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/s390/defconfig	2003-07-19 17:03:49.000000000 -0700
+@@ -20,6 +20,7 @@ CONFIG_SYSVIPC=y
+ CONFIG_SYSCTL=y
+ CONFIG_LOG_BUF_SHIFT=17
+ # CONFIG_EMBEDDED is not set
++# CONFIG_KALLSYMS is not set
+ CONFIG_FUTEX=y
+ CONFIG_EPOLL=y
+ 
+@@ -169,7 +170,7 @@ CONFIG_IP_MULTICAST=y
+ # CONFIG_INET_AH is not set
+ # CONFIG_INET_ESP is not set
+ # CONFIG_INET_IPCOMP is not set
+-CONFIG_IPV6=m
++CONFIG_IPV6=y
+ # CONFIG_IPV6_PRIVACY is not set
+ # CONFIG_INET6_AH is not set
+ # CONFIG_INET6_ESP is not set
+@@ -180,7 +181,7 @@ CONFIG_IPV6=m
+ #
+ # SCTP Configuration (EXPERIMENTAL)
+ #
+-CONFIG_IPV6_SCTP__=m
++CONFIG_IPV6_SCTP__=y
+ # CONFIG_IP_SCTP is not set
+ # CONFIG_ATM is not set
+ # CONFIG_VLAN_8021Q is not set
+@@ -383,7 +384,6 @@ CONFIG_IBM_PARTITION=y
+ 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
+ 
+ #
+--- linux-2.6.0-test1/arch/s390/kernel/compat_ioctl.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/s390/kernel/compat_ioctl.c	2003-07-19 17:03:49.000000000 -0700
+@@ -23,7 +23,6 @@
+ #include <asm/types.h>
+ #include <asm/uaccess.h>
+ 
+-#include <linux/blk.h>
+ #include <linux/blkpg.h>
+ #include <linux/cdrom.h>
+ #include <linux/dm-ioctl.h>
+--- linux-2.6.0-test1/arch/s390/kernel/compat_linux.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/s390/kernel/compat_linux.c	2003-07-19 17:03:49.000000000 -0700
+@@ -250,14 +250,14 @@ asmlinkage long sys32_getegid16(void)
+ 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_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_sec, &o->tv_sec) ||
+ 		 __put_user(i->tv_usec, &o->tv_usec)));
+ }
+ 
+--- linux-2.6.0-test1/arch/s390/kernel/entry64.S	2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/s390/kernel/entry64.S	2003-07-19 17:03:49.000000000 -0700
+@@ -637,6 +637,7 @@ io_sigpending:     
+ ext_int_handler:
+         SAVE_ALL __LC_EXT_OLD_PSW,0
+         GET_THREAD_INFO                # load pointer to task_struct to R9
++	brasl   %r14,do_extint
+ 	llgh	%r6,__LC_EXT_INT_CODE  # get interruption code
+ 	lgr	%r1,%r6		       # calculate index = code & 0xff
+ 	nill	%r1,0xff
+--- linux-2.6.0-test1/arch/s390/kernel/entry.S	2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/s390/kernel/entry.S	2003-07-19 17:03:49.000000000 -0700
+@@ -606,6 +606,8 @@ ext_int_handler:
+ 	SAVE_ALL_BASE
+         SAVE_ALL __LC_EXT_OLD_PSW,0
+         GET_THREAD_INFO                # load pointer to task_struct to R9
++	l	%r1,BASED(.Ldo_extint)
++	basr	%r14,%r1
+ 	lh	%r6,__LC_EXT_INT_CODE  # get interruption code
+ 	lr	%r1,%r6		       # calculate index = code & 0xff
+ 	n	%r1,BASED(.Lc0xff)
+@@ -694,6 +696,7 @@ restart_go:
+  */
+ .Ls390_mcck:   .long  s390_do_machine_check
+ .Ldo_IRQ:      .long  do_IRQ
++.Ldo_extint:   .long  do_extint
+ .Ldo_signal:   .long  do_signal
+ .Ldo_softirq:  .long  do_softirq
+ .Lentry_base:  .long  entry_base
+--- linux-2.6.0-test1/arch/s390/kernel/s390_ext.c	2003-06-14 12:18:09.000000000 -0700
++++ 25/arch/s390/kernel/s390_ext.c	2003-07-19 17:03:49.000000000 -0700
+@@ -11,8 +11,11 @@
+ #include <linux/kernel.h>
+ #include <linux/slab.h>
+ #include <linux/errno.h>
++#include <linux/kernel_stat.h>
++
+ #include <asm/lowcore.h>
+ #include <asm/s390_ext.h>
++#include <asm/irq.h>
+ 
+ /*
+  * Simple hash strategy: index = code & 0xff;
+@@ -98,6 +101,11 @@ int unregister_early_external_interrupt(
+ 	return 0;
+ }
+ 
++void do_extint(void)
++{
++	kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++;
++}
++
+ EXPORT_SYMBOL(register_external_interrupt);
+ EXPORT_SYMBOL(unregister_external_interrupt);
+ 
+--- linux-2.6.0-test1/arch/s390/kernel/setup.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/s390/kernel/setup.c	2003-07-19 17:04:07.000000000 -0700
+@@ -34,12 +34,15 @@
+ #include <linux/root_dev.h>
+ #include <linux/console.h>
+ #include <linux/seq_file.h>
++#include <linux/kernel_stat.h>
++
+ #include <asm/uaccess.h>
+ #include <asm/system.h>
+ #include <asm/smp.h>
+ #include <asm/mmu_context.h>
+ #include <asm/cpcmd.h>
+ #include <asm/lowcore.h>
++#include <asm/irq.h>
+ 
+ /*
+  * Machine setup..
+@@ -53,7 +56,7 @@ struct { unsigned long addr, size, type;
+ #define CHUNK_READ_WRITE 0
+ #define CHUNK_READ_ONLY 1
+ int cpus_initialized = 0;
+-unsigned long cpu_initialized = 0;
++static cpumask_t cpu_initialized;
+ volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */
+ 
+ /*
+@@ -83,7 +86,7 @@ void __devinit cpu_init (void)
+         int nr = smp_processor_id();
+         int addr = hard_smp_processor_id();
+ 
+-        if (test_and_set_bit(nr,&cpu_initialized)) {
++        if (cpu_test_and_set(nr,cpu_initialized)) {
+                 printk("CPU#%d ALREADY INITIALIZED!!!!!!!!!\n", nr);
+                 for (;;) local_irq_enable();
+         }
+@@ -562,7 +565,7 @@ static int show_cpuinfo(struct seq_file 
+ 			       num_online_cpus(), loops_per_jiffy/(500000/HZ),
+ 			       (loops_per_jiffy/(5000/HZ))%100);
+ 	}
+-	if (cpu_online_map & (1 << n)) {
++	if (cpu_online(n)) {
+ #ifdef CONFIG_SMP
+ 		if (smp_processor_id() == n)
+ 			cpuinfo = &S390_lowcore.cpu_data;
+@@ -600,3 +603,40 @@ struct seq_operations cpuinfo_op = {
+ 	.stop	= c_stop,
+ 	.show	= show_cpuinfo,
+ };
++
++/*
++ * show_interrupts is needed by /proc/interrupts.
++ */
++
++static const char *intrclass_names[] = {
++	"EXT",
++	"I/O",
++};
++
++int show_interrupts(struct seq_file *p, void *v)
++{
++        int i, j;
++	
++        seq_puts(p, "           ");
++	
++        for (j=0; j<NR_CPUS; j++)
++                if (cpu_online(j))
++                        seq_printf(p, "CPU%d       ",j);
++	
++        seq_putc(p, '\n');
++	
++        for (i = 0 ; i < NR_IRQS ; i++) {
++		seq_printf(p, "%s: ", intrclass_names[i]);
++#ifndef CONFIG_SMP
++		seq_printf(p, "%10u ", kstat_irqs(i));
++#else
++		for (j = 0; j < NR_CPUS; j++)
++			if (cpu_online(j))
++				seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
++#endif
++                seq_putc(p, '\n');
++		
++        }
++	
++        return 0;
++}
+--- linux-2.6.0-test1/arch/s390/kernel/smp.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/s390/kernel/smp.c	2003-07-19 17:04:07.000000000 -0700
+@@ -51,8 +51,8 @@ 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;
++cpumask_t cpu_online_map;
++cpumask_t cpu_possible_map;
+ unsigned long    cache_decay_ticks = 0;
+ 
+ /*
+@@ -200,14 +200,14 @@ void smp_send_stop(void)
+ /*
+  * Reboot, halt and power_off routines for SMP.
+  */
+-static volatile unsigned long cpu_restart_map;
++static cpumask_t cpu_restart_map;
+ 
+ static void do_machine_restart(void * __unused)
+ {
+-	clear_bit(smp_processor_id(), &cpu_restart_map);
++	cpu_clear(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);
++		while (!cpus_empty(cpu_restart_map));
+ 		/* Store status of other cpus. */
+ 		do_store_status();
+ 		/*
+@@ -427,7 +427,7 @@ void __init smp_check_cpus(unsigned int 
+                 if (signal_processor(num_cpus, sigp_sense) ==
+                     sigp_not_operational)
+                         continue;
+-		set_bit(num_cpus, &cpu_possible_map);
++		cpu_set(num_cpus, cpu_possible_map);
+                 num_cpus++;
+         }
+         printk("Detected %d CPU's\n",(int) num_cpus);
+@@ -452,7 +452,7 @@ int __devinit start_secondary(void *cpuv
+ 	pfault_init();
+ #endif
+ 	/* Mark this cpu as online */
+-	set_bit(smp_processor_id(), &cpu_online_map);
++	cpu_set(smp_processor_id(), cpu_online_map);
+ 	/* Switch on interrupts */
+ 	local_irq_enable();
+         /* Print info about this processor */
+@@ -558,8 +558,8 @@ void __init smp_prepare_cpus(unsigned in
+ 
+ void __devinit smp_prepare_boot_cpu(void)
+ {
+-	set_bit(smp_processor_id(), &cpu_online_map);
+-	set_bit(smp_processor_id(), &cpu_possible_map);
++	cpu_set(smp_processor_id(), cpu_online_map);
++	cpu_set(smp_processor_id(), cpu_possible_map);
+ }
+ 
+ void smp_cpus_done(unsigned int max_cpus)
+--- linux-2.6.0-test1/arch/s390/mm/init.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/arch/s390/mm/init.c	2003-07-19 17:03:49.000000000 -0700
+@@ -22,9 +22,6 @@
+ #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>
+ 
+--- linux-2.6.0-test1/arch/s390/mm/ioremap.c	2003-06-14 12:17:58.000000000 -0700
++++ 25/arch/s390/mm/ioremap.c	2003-07-19 17:07:16.000000000 -0700
+@@ -83,7 +83,7 @@ static int remap_area_pages(unsigned lon
+ 	spin_lock(&init_mm.page_table_lock);
+ 	do {
+ 		pmd_t *pmd;
+-		pmd = pmd_alloc(&init_mm, dir, address);
++		pmd = pmd_alloc_kernel(&init_mm, dir, address);
+ 		error = -ENOMEM;
+ 		if (!pmd)
+ 			break;
+--- linux-2.6.0-test1/arch/sh/mm/init.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/sh/mm/init.c	2003-07-19 17:03:49.000000000 -0700
+@@ -22,9 +22,6 @@
+ #include <linux/swap.h>
+ #include <linux/smp.h>
+ #include <linux/init.h>
+-#ifdef CONFIG_BLK_DEV_INITRD
+-#include <linux/blk.h>
+-#endif
+ #include <linux/highmem.h>
+ #include <linux/bootmem.h>
+ 
+--- linux-2.6.0-test1/arch/sh/mm/ioremap.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/sh/mm/ioremap.c	2003-07-19 17:07:16.000000000 -0700
+@@ -45,7 +45,7 @@ static inline void remap_area_pte(pte_t 
+ 	} while (address && (address < end));
+ }
+ 
+-static inline int remap_area_pmd(pmd_t * pmd, unsigned long address,
++static inline int remap_area_pmd(pgd_t *pgd, pmd_t * pmd, unsigned long address,
+ 	unsigned long size, unsigned long phys_addr, unsigned long flags)
+ {
+ 	unsigned long end;
+@@ -83,11 +83,11 @@ int remap_area_pages(unsigned long addre
+ 	spin_lock(&init_mm.page_table_lock);
+ 	do {
+ 		pmd_t *pmd;
+-		pmd = pmd_alloc(&init_mm, dir, address);
++		pmd = pmd_alloc_map(&init_mm, dir, address);
+ 		error = -ENOMEM;
+ 		if (!pmd)
+ 			break;
+-		if (remap_area_pmd(pmd, address, end - address,
++		if (remap_area_pmd(dir, pmd, address, end - address,
+ 					phys_addr + address, flags))
+ 			break;
+ 		error = 0;
+--- linux-2.6.0-test1/arch/sparc64/kernel/devices.c	2003-06-26 22:07:24.000000000 -0700
++++ 25/arch/sparc64/kernel/devices.c	2003-07-19 17:06:40.000000000 -0700
+@@ -31,6 +31,8 @@ int linux_num_cpus = 0;
+ extern void cpu_probe(void);
+ extern void central_probe(void);
+ 
++unsigned long cpu_hz;
++
+ void __init device_scan(void)
+ {
+ 	char node_str[128];
+@@ -68,6 +70,8 @@ void __init device_scan(void)
+ 					prom_getproperty(scan, "portid",
+ 							 (char *) &thismid, sizeof(thismid));
+ 				}
++				if (!cpu_hz)
++					cpu_hz = prom_getint(scan, "clock-frequency");
+ 				linux_cpus[cpu_ctr].mid = thismid;
+ 				printk("Found CPU %d (node=%08x,mid=%d)\n",
+ 				       cpu_ctr, (unsigned) scan, thismid);
+--- linux-2.6.0-test1/arch/sparc64/kernel/head.S	2003-06-14 12:18:07.000000000 -0700
++++ 25/arch/sparc64/kernel/head.S	2003-07-19 17:03:49.000000000 -0700
+@@ -66,7 +66,7 @@ sparc_ramdisk_image:
+ sparc_ramdisk_size:
+         .word   0
+         .xword  reboot_command
+-	.xword	bootstr_len
++	.xword	bootstr_info
+ 	.word	_end
+ 
+ 	/* We must be careful, 32-bit OpenBOOT will get confused if it
+@@ -740,8 +740,9 @@ swapper_pg_dir:
+ 
+ 	.data
+ 	.align	8
+-	.globl	prom_tba
++	.globl	prom_tba, tlb_type
+ prom_tba:	.xword	0
++tlb_type:	.word	0	/* Must NOT end up in BSS */
+ 	.section	".fixup",#alloc,#execinstr
+ 	.globl	__ret_efault
+ __ret_efault:
+--- linux-2.6.0-test1/arch/sparc64/kernel/irq.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/sparc64/kernel/irq.c	2003-07-19 17:04:07.000000000 -0700
+@@ -110,6 +110,10 @@ static void register_irq_proc (unsigned 
+ 		action->flags |= __irq_ino(irq) << 48;
+ #define get_ino_in_irqaction(action)	(action->flags >> 48)
+ 
++#if NR_CPUS > 64
++#error irqaction embedded smp affinity does not work with > 64 cpus, FIXME
++#endif
++
+ #define put_smpaff_in_irqaction(action, smpaff)	(action)->mask = (smpaff)
+ #define get_smpaff_in_irqaction(action) 	((action)->mask)
+ 
+@@ -658,11 +662,11 @@ static inline void redirect_intr(int cpu
+ 	 *    Just Do It.
+ 	 */
+ 	struct irqaction *ap = bp->irq_info;
+-	unsigned long cpu_mask = get_smpaff_in_irqaction(ap);
++	cpumask_t cpu_mask = { .mask[0] = get_smpaff_in_irqaction(ap) };
+ 	unsigned int buddy, ticks;
+ 
+-	cpu_mask &= cpu_online_map;
+-	if (cpu_mask == 0)
++	cpus_and(cpu_mask, cpu_mask, cpu_online_map);
++	if (cpus_empty(cpu_mask))
+ 		cpu_mask = cpu_online_map;
+ 
+ 	if (this_is_starfire != 0 ||
+@@ -677,7 +681,7 @@ static inline void redirect_intr(int cpu
+ 		buddy = 0;
+ 
+ 	ticks = 0;
+-	while ((cpu_mask & (1UL << buddy)) == 0) {
++	while (!cpu_isset(buddy, cpu_mask)) {
+ 		if (++buddy >= NR_CPUS)
+ 			buddy = 0;
+ 		if (++ticks > NR_CPUS) {
+--- linux-2.6.0-test1/arch/sparc64/kernel/pci.c	2003-06-14 12:17:55.000000000 -0700
++++ 25/arch/sparc64/kernel/pci.c	2003-07-19 17:03:49.000000000 -0700
+@@ -804,25 +804,20 @@ int pci_mmap_page_range(struct pci_dev *
+ 
+ /* Return the domain nuber for this pci bus */
+ 
+-int pci_domain_nr(struct pci_bus *bus)
++int pci_domain_nr(struct pci_bus *pbus)
+ {
+-	struct pcidev_cookie *cookie = bus->sysdata;
++	struct pci_pbm_info *pbm = pbus->sysdata;
+ 	int ret;
+ 
+-	if (cookie != NULL) {
+-		struct pci_pbm_info *pbm = cookie->pbm;
+-		if (pbm == NULL || pbm->parent == NULL) {
+-			ret = -ENXIO;
+-		} else {
+-			struct pci_controller_info *p = pbm->parent;
+-
+-			ret = p->index;
+-			if (p->pbms_same_domain == 0)
+-				ret = ((ret << 1) +
+-				       ((pbm == &pbm->parent->pbm_B) ? 1 : 0));
+-		}
+-	} else {
++	if (pbm == NULL || pbm->parent == NULL) {
+ 		ret = -ENXIO;
++	} else {
++		struct pci_controller_info *p = pbm->parent;
++
++		ret = p->index;
++		if (p->pbms_same_domain == 0)
++			ret = ((ret << 1) +
++			       ((pbm == &pbm->parent->pbm_B) ? 1 : 0));
+ 	}
+ 
+ 	return ret;
+--- linux-2.6.0-test1/arch/sparc64/kernel/setup.c	2003-06-14 12:18:07.000000000 -0700
++++ 25/arch/sparc64/kernel/setup.c	2003-07-19 17:03:49.000000000 -0700
+@@ -24,7 +24,6 @@
+ #include <linux/kdev_t.h>
+ #include <linux/major.h>
+ #include <linux/string.h>
+-#include <linux/blk.h>
+ #include <linux/init.h>
+ #include <linux/inet.h>
+ #include <linux/console.h>
+--- linux-2.6.0-test1/arch/sparc64/kernel/smp.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/sparc64/kernel/smp.c	2003-07-19 17:04:07.000000000 -0700
+@@ -46,12 +46,11 @@ cpuinfo_sparc cpu_data[NR_CPUS];
+ /* Please don't make this stuff initdata!!!  --DaveM */
+ static unsigned char boot_cpu_id;
+ 
+-atomic_t sparc64_num_cpus_online = ATOMIC_INIT(0);
+-unsigned long cpu_online_map = 0;
++cpumask_t cpu_online_map = CPU_MASK_NONE;
+ atomic_t sparc64_num_cpus_possible = ATOMIC_INIT(0);
+-unsigned long phys_cpu_present_map = 0;
+-static unsigned long smp_commenced_mask;
+-static unsigned long cpu_callout_map;
++cpumask_t phys_cpu_present_map = CPU_MASK_NONE;
++static cpumask_t smp_commenced_mask;
++static cpumask_t cpu_callout_map;
+ 
+ void smp_info(struct seq_file *m)
+ {
+@@ -151,11 +150,10 @@ void __init smp_callin(void)
+ 	atomic_inc(&init_mm.mm_count);
+ 	current->active_mm = &init_mm;
+ 
+-	while (!test_bit(cpuid, &smp_commenced_mask))
++	while (!cpu_isset(cpuid, smp_commenced_mask))
+ 		membar("#LoadLoad");
+ 
+-	set_bit(cpuid, &cpu_online_map);
+-	atomic_inc(&sparc64_num_cpus_online);
++	cpu_set(cpuid, cpu_online_map);
+ }
+ 
+ void cpu_panic(void)
+@@ -334,7 +332,7 @@ static int __devinit smp_boot_one_cpu(un
+ 		if (linux_cpus[no].mid == cpu)
+ 			break;
+ 	cpu_new_thread = p->thread_info;
+-	set_bit(cpu, &cpu_callout_map);
++	cpu_set(cpu, cpu_callout_map);
+ 	prom_startcpu(linux_cpus[no].prom_node, entry, cookie);
+ 	for (timeout = 0; timeout < 5000000; timeout++) {
+ 		if (callin_flag)
+@@ -346,7 +344,7 @@ static int __devinit smp_boot_one_cpu(un
+ 		ret = 0;
+ 	} else {
+ 		printk("Processor %d is stuck.\n", cpu);
+-		clear_bit(cpu, &cpu_callout_map);
++		cpu_clear(cpu, cpu_callout_map);
+ 		ret = -ENODEV;
+ 	}
+ 	cpu_new_thread = NULL;
+@@ -420,17 +418,17 @@ again:
+ 	}
+ }
+ 
+-static __inline__ void spitfire_xcall_deliver(u64 data0, u64 data1, u64 data2, unsigned long mask)
++static __inline__ void spitfire_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mask)
+ {
+ 	u64 pstate;
+ 	int i;
+ 
+ 	__asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate));
+ 	for (i = 0; i < NR_CPUS; i++) {
+-		if (mask & (1UL << i)) {
++		if (cpu_isset(i, mask)) {
+ 			spitfire_xcall_helper(data0, data1, data2, pstate, i);
+-			mask &= ~(1UL << i);
+-			if (!mask)
++			cpu_clear(i, mask);
++			if (cpus_empty(mask))
+ 				break;
+ 		}
+ 	}
+@@ -443,12 +441,12 @@ static __inline__ void spitfire_xcall_de
+ #if NR_CPUS > 32
+ #error Fixup cheetah_xcall_deliver Dave...
+ #endif
+-static void cheetah_xcall_deliver(u64 data0, u64 data1, u64 data2, unsigned long mask)
++static void cheetah_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mask)
+ {
+ 	u64 pstate;
+ 	int nack_busy_id;
+ 
+-	if (!mask)
++	if (cpus_empty(mask))
+ 		return;
+ 
+ 	__asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate));
+@@ -469,11 +467,11 @@ retry:
+ 
+ 	nack_busy_id = 0;
+ 	{
+-		unsigned long work_mask = mask;
++		cpumask_t work_mask = mask;
+ 		int i;
+ 
+ 		for (i = 0; i < NR_CPUS; i++) {
+-			if (work_mask & (1UL << i)) {
++			if (cpu_isset(i, work_mask)) {
+ 				u64 target = (i << 14) | 0x70;
+ 
+ 				target |= (nack_busy_id++ << 24);
+@@ -482,8 +480,8 @@ retry:
+ 					"membar	#Sync\n\t"
+ 					: /* no outputs */
+ 					: "r" (target), "i" (ASI_INTR_W));
+-				work_mask &= ~(1UL << i);
+-				if (!work_mask)
++				cpu_clear(i, work_mask);
++				if (cpus_empty(work_mask))
+ 					break;
+ 			}
+ 		}
+@@ -518,7 +516,7 @@ retry:
+ 			printk("CPU[%d]: mondo stuckage result[%016lx]\n",
+ 			       smp_processor_id(), dispatch_stat);
+ 		} else {
+-			unsigned long work_mask = mask;
++			cpumask_t work_mask = mask;
+ 			int i, this_busy_nack = 0;
+ 
+ 			/* Delay some random time with interrupts enabled
+@@ -530,13 +528,13 @@ retry:
+ 			 * NACK us.
+ 			 */
+ 			for (i = 0; i < NR_CPUS; i++) {
+-				if (work_mask & (1UL << i)) {
++				if (cpu_isset(i, work_mask)) {
+ 					if ((dispatch_stat &
+ 					     (0x2 << this_busy_nack)) == 0)
+-						mask &= ~(1UL << i);
++						cpu_clear(i, mask);
+ 					this_busy_nack += 2;
+-					work_mask &= ~(1UL << i);
+-					if (!work_mask)
++					cpu_clear(i, work_mask);
++					if (cpus_empty(work_mask))
+ 						break;
+ 				}
+ 			}
+@@ -549,12 +547,12 @@ retry:
+ /* Send cross call to all processors mentioned in MASK
+  * except self.
+  */
+-static void smp_cross_call_masked(unsigned long *func, u32 ctx, u64 data1, u64 data2, unsigned long mask)
++static void smp_cross_call_masked(unsigned long *func, u32 ctx, u64 data1, u64 data2, cpumask_t mask)
+ {
+ 	u64 data0 = (((u64)ctx)<<32 | (((u64)func) & 0xffffffff));
+ 
+-	mask &= cpu_online_map;
+-	mask &= ~(1UL<<smp_processor_id());
++	cpus_and(mask, mask, cpu_online_map);
++	cpu_clear(smp_processor_id(), mask);
+ 
+ 	if (tlb_type == spitfire)
+ 		spitfire_xcall_deliver(data0, data1, data2, mask);
+@@ -567,9 +565,10 @@ extern unsigned long xcall_sync_tick;
+ 
+ static void smp_start_sync_tick_client(int cpu)
+ {
++	cpumask_t mask = cpumask_of_cpu(cpu);
++
+ 	smp_cross_call_masked(&xcall_sync_tick,
+-			      0, 0, 0,
+-			      (1UL << cpu));
++			      0, 0, 0, mask);
+ }
+ 
+ /* Send cross call to all processors except self. */
+@@ -685,14 +684,14 @@ static __inline__ void __local_flush_dca
+ 
+ void smp_flush_dcache_page_impl(struct page *page, int cpu)
+ {
+-	unsigned long mask = 1UL << cpu;
++	cpumask_t mask = cpumask_of_cpu(cpu);
+ 
+ #ifdef CONFIG_DEBUG_DCFLUSH
+ 	atomic_inc(&dcpage_flushes);
+ #endif
+ 	if (cpu == smp_processor_id()) {
+ 		__local_flush_dcache_page(page);
+-	} else if ((cpu_online_map & mask) != 0) {
++	} else if (cpu_online(cpu)) {
+ 		u64 data0;
+ 
+ 		if (tlb_type == spitfire) {
+@@ -719,13 +718,14 @@ void smp_flush_dcache_page_impl(struct p
+ 
+ void flush_dcache_page_all(struct mm_struct *mm, struct page *page)
+ {
+-	unsigned long mask = cpu_online_map & ~(1UL << smp_processor_id());
++	cpumask_t mask = cpu_online_map;
++	cpu_clear(smp_processor_id(), mask);
+ 	u64 data0;
+ 
+ #ifdef CONFIG_DEBUG_DCFLUSH
+ 	atomic_inc(&dcpage_flushes);
+ #endif
+-	if (mask == 0UL)
++	if (cpus_empty(mask))
+ 		goto flush_self;
+ 	if (tlb_type == spitfire) {
+ 		data0 = ((u64)&xcall_flush_dcache_page_spitfire);
+@@ -750,9 +750,9 @@ void flush_dcache_page_all(struct mm_str
+ 
+ void smp_receive_signal(int cpu)
+ {
+-	unsigned long mask = 1UL << cpu;
++	cpumask_t mask = cpumask_of_cpu(cpu);
+ 
+-	if ((cpu_online_map & mask) != 0) {
++	if (cpu_online(cpu)) {
+ 		u64 data0 = (((u64)&xcall_receive_signal) & 0xffffffff);
+ 
+ 		if (tlb_type == spitfire)
+@@ -854,7 +854,7 @@ void smp_flush_tlb_mm(struct mm_struct *
+ 
+ 		if (atomic_read(&mm->mm_users) == 1) {
+ 			/* See smp_flush_tlb_page for info about this. */
+-			mm->cpu_vm_mask = (1UL << cpu);
++			mm->cpu_vm_mask = cpumask_of_cpu(cpu);
+ 			goto local_flush_and_out;
+ 		}
+ 
+@@ -877,7 +877,7 @@ void smp_flush_tlb_range(struct mm_struc
+ 	end    = PAGE_ALIGN(end);
+ 
+ 	if (mm == current->active_mm && atomic_read(&mm->mm_users) == 1) {
+-		mm->cpu_vm_mask = (1UL << cpu);
++		mm->cpu_vm_mask = cpumask_of_cpu(cpu);
+ 		goto local_flush_and_out;
+ 	}
+ 
+@@ -921,14 +921,16 @@ void smp_flush_tlb_page(struct mm_struct
+ 			 * is almost certain that all TLB entries for this
+ 			 * context will be replaced by the time that happens.
+ 			 */
+-			mm->cpu_vm_mask = (1UL << cpu);
++			mm->cpu_vm_mask = cpumask_of_cpu(cpu);
+ 			goto local_flush_and_out;
+ 		} else {
++			cpumask_t this_cpu_mask = cpumask_of_cpu(cpu);
++
+ 			/* By virtue of running under the mm->page_table_lock,
+ 			 * and mmu_context.h:switch_mm doing the same, the
+ 			 * following operation is safe.
+ 			 */
+-			if (mm->cpu_vm_mask == (1UL << cpu))
++			if (cpus_equal(mm->cpu_vm_mask, this_cpu_mask))
+ 				goto local_flush_and_out;
+ 		}
+ 
+@@ -939,7 +941,7 @@ void smp_flush_tlb_page(struct mm_struct
+ 		smp_cross_call_masked(&xcall_flush_tlb_page,
+ 				      ctx, page, 0,
+ 				      mm->cpu_vm_mask);
+-		if (!(mm->cpu_vm_mask & (1UL << cpu)))
++		if (!cpu_isset(cpu, mm->cpu_vm_mask))
+ 			return;
+ 
+ 	local_flush_and_out:
+@@ -1122,8 +1124,7 @@ void __init smp_tick_init(void)
+ 		prom_halt();
+ 	}
+ 
+-	atomic_inc(&sparc64_num_cpus_online);
+-	set_bit(boot_cpu_id, &cpu_online_map);
++	cpu_set(boot_cpu_id, cpu_online_map);
+ 	prom_cpu_nodes[boot_cpu_id] = linux_cpus[0].prom_node;
+ 	prof_counter(boot_cpu_id) = prof_multiplier(boot_cpu_id) = 1;
+ }
+@@ -1241,16 +1242,14 @@ void __init smp_prepare_cpus(unsigned in
+ 
+ 	for (i = 0; i < linux_num_cpus; i++) {
+ 		if (linux_cpus[i].mid < max_cpus) {
+-			set_bit(linux_cpus[i].mid,
+-				&phys_cpu_present_map);
++			cpu_set(linux_cpus[i].mid, phys_cpu_present_map);
+ 			atomic_inc(&sparc64_num_cpus_possible);
+ 		}
+ 	}
+ 	if (atomic_read(&sparc64_num_cpus_possible) > max_cpus) {
+ 		for (i = linux_num_cpus - 1; i >= 0; i--) {
+ 			if (linux_cpus[i].mid != boot_cpu_id) {
+-				clear_bit(linux_cpus[i].mid,
+-					  &phys_cpu_present_map);
++				cpu_clear(linux_cpus[i].mid, phys_cpu_present_map);
+ 				atomic_dec(&sparc64_num_cpus_possible);
+ 				if (atomic_read(&sparc64_num_cpus_possible) <= max_cpus)
+ 					break;
+@@ -1263,8 +1262,8 @@ void __init smp_prepare_cpus(unsigned in
+ 
+ void __devinit smp_prepare_boot_cpu(void)
+ {
+-	set_bit(smp_processor_id(), &cpu_online_map);
+-	set_bit(smp_processor_id(), &phys_cpu_present_map);
++	cpu_set(smp_processor_id(), cpu_online_map);
++	cpu_set(smp_processor_id(), phys_cpu_present_map);
+ }
+ 
+ int __devinit __cpu_up(unsigned int cpu)
+@@ -1272,10 +1271,10 @@ int __devinit __cpu_up(unsigned int cpu)
+ 	int ret = smp_boot_one_cpu(cpu);
+ 
+ 	if (!ret) {
+-		set_bit(cpu, &smp_commenced_mask);
+-		while (!test_bit(cpu, &cpu_online_map))
++		cpu_set(cpu, smp_commenced_mask);
++		while (!cpu_isset(cpu, cpu_online_map))
+ 			mb();
+-		if (!test_bit(cpu, &cpu_online_map)) {
++		if (!cpu_isset(cpu, cpu_online_map)) {
+ 			ret = -ENODEV;
+ 		} else {
+ 			smp_synchronize_one_tick(cpu);
+--- linux-2.6.0-test1/arch/sparc64/kernel/sparc64_ksyms.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/sparc64/kernel/sparc64_ksyms.c	2003-07-19 17:04:07.000000000 -0700
+@@ -147,7 +147,6 @@ EXPORT_SYMBOL(cpu_data);
+ 
+ /* CPU online map and active count.  */
+ EXPORT_SYMBOL(cpu_online_map);
+-EXPORT_SYMBOL(sparc64_num_cpus_online);
+ EXPORT_SYMBOL(phys_cpu_present_map);
+ EXPORT_SYMBOL(sparc64_num_cpus_possible);
+ 
+@@ -176,6 +175,8 @@ EXPORT_SYMBOL(up);
+ /* Atomic counter implementation. */
+ EXPORT_SYMBOL(__atomic_add);
+ EXPORT_SYMBOL(__atomic_sub);
++EXPORT_SYMBOL(__atomic64_add);
++EXPORT_SYMBOL(__atomic64_sub);
+ #ifdef CONFIG_SMP
+ EXPORT_SYMBOL(atomic_dec_and_lock);
+ #endif
+--- linux-2.6.0-test1/arch/sparc64/kernel/time.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/arch/sparc64/kernel/time.c	2003-07-19 17:03:49.000000000 -0700
+@@ -41,6 +41,7 @@
+ #include <asm/isa.h>
+ #include <asm/starfire.h>
+ #include <asm/smp.h>
++#include <asm/sections.h>
+ 
+ spinlock_t mostek_lock = SPIN_LOCK_UNLOCKED;
+ spinlock_t rtc_lock = SPIN_LOCK_UNLOCKED;
+@@ -449,7 +450,6 @@ void sparc64_do_profile(struct pt_regs *
+ 		return;
+ 
+ 	{
+-		extern int _stext;
+ 		extern int rwlock_impl_begin, rwlock_impl_end;
+ 		extern int atomic_impl_begin, atomic_impl_end;
+ 		extern int __memcpy_begin, __memcpy_end;
+@@ -468,7 +468,7 @@ void sparc64_do_profile(struct pt_regs *
+ 		     pc < (unsigned long) &__bitops_end))
+ 			pc = o7;
+ 
+-		pc -= (unsigned long) &_stext;
++		pc -= (unsigned long) _stext;
+ 		pc >>= prof_shift;
+ 
+ 		if(pc >= prof_len)
+--- linux-2.6.0-test1/arch/sparc64/kernel/us2e_cpufreq.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/arch/sparc64/kernel/us2e_cpufreq.c	2003-07-19 17:04:07.000000000 -0700
+@@ -232,15 +232,16 @@ static unsigned long estar_to_divisor(un
+ 
+ static void us2e_set_cpu_divider_index(unsigned int cpu, unsigned int index)
+ {
+-	unsigned long new_bits, new_freq, cpus_allowed;
++	unsigned long new_bits, new_freq;
+ 	unsigned long clock_tick, divisor, old_divisor, estar;
++	cpumask_t cpus_allowed;
+ 	struct cpufreq_freqs freqs;
+ 
+ 	if (!cpu_online(cpu))
+ 		return;
+ 
+ 	cpus_allowed = current->cpus_allowed;
+-	set_cpus_allowed(current, (1UL << cpu));
++	set_cpus_allowed(current, cpumask_of_cpu(cpu));
+ 
+ 	new_freq = clock_tick = sparc64_get_clock_tick(cpu);
+ 	new_bits = index_to_estar_mode(index);
+--- linux-2.6.0-test1/arch/sparc64/kernel/us3_cpufreq.c	2003-06-14 12:17:56.000000000 -0700
++++ 25/arch/sparc64/kernel/us3_cpufreq.c	2003-07-19 17:04:07.000000000 -0700
+@@ -78,14 +78,15 @@ static unsigned long get_current_freq(un
+ 
+ static void us3_set_cpu_divider_index(unsigned int cpu, unsigned int index)
+ {
+-	unsigned long new_bits, new_freq, reg, cpus_allowed;
++	unsigned long new_bits, new_freq, reg;
++	cpumask_t cpus_allowed;
+ 	struct cpufreq_freqs freqs;
+ 
+ 	if (!cpu_online(cpu))
+ 		return;
+ 
+ 	cpus_allowed = current->cpus_allowed;
+-	set_cpus_allowed(current, (1UL << cpu));
++	set_cpus_allowed(current, cpumask_of_cpu(cpu));
+ 
+ 	new_freq = sparc64_get_clock_tick(cpu);
+ 	switch (index) {
+--- linux-2.6.0-test1/arch/sparc64/lib/atomic.S	2003-06-14 12:18:33.000000000 -0700
++++ 25/arch/sparc64/lib/atomic.S	2003-07-19 17:03:49.000000000 -0700
+@@ -33,4 +33,27 @@ __atomic_sub: /* %o0 = increment, %o1 = 
+ 	 membar	#StoreLoad | #StoreStore
+ 	retl
+ 	 sub	%g7, %o0, %o0
++
++	.globl	__atomic64_add
++__atomic64_add: /* %o0 = increment, %o1 = atomic_ptr */
++	ldx	[%o1], %g5
++	add	%g5, %o0, %g7
++	casx	[%o1], %g5, %g7
++	cmp	%g5, %g7
++	bne,pn	%xcc, __atomic64_add
++	 membar	#StoreLoad | #StoreStore
++	retl
++	 add	%g7, %o0, %o0
++
++	.globl	__atomic64_sub
++__atomic64_sub: /* %o0 = increment, %o1 = atomic_ptr */
++	ldx	[%o1], %g5
++	sub	%g5, %o0, %g7
++	casx	[%o1], %g5, %g7
++	cmp	%g5, %g7
++	bne,pn	%xcc, __atomic64_sub
++	 membar	#StoreLoad | #StoreStore
++	retl
++	 sub	%g7, %o0, %o0
++
+ atomic_impl_end:
+--- linux-2.6.0-test1/arch/sparc64/lib/rwlock.S	2003-06-26 22:07:24.000000000 -0700
++++ 25/arch/sparc64/lib/rwlock.S	2003-07-19 17:06:40.000000000 -0700
+@@ -63,5 +63,33 @@ __write_lock: /* %o0 = lock_ptr */
+ 	be,pt		%icc, 99b
+ 	 membar		#StoreLoad | #StoreStore
+ 	ba,a,pt		%xcc, 1b
++
++	.globl	__read_trylock
++__read_trylock: /* %o0 = lock_ptr */
++	ldsw		[%o0], %g5
++	brlz,pn		%g5, 100f
++	 add		%g5, 1, %g7
++	cas		[%o0], %g5, %g7
++	cmp		%g5, %g7
++	bne,pn		%icc, __read_trylock
++	 membar		#StoreLoad | #StoreStore
++	retl
++	 mov		1, %o0
++
++	.globl		__write_trylock
++__write_trylock: /* %o0 = lock_ptr */
++	sethi		%hi(0x80000000), %g2
++1:	lduw		[%o0], %g5
++4:	brnz,pn		%g5, 100f
++	 or		%g5, %g2, %g7
++	cas		[%o0], %g5, %g7
++	cmp		%g5, %g7
++	bne,pn		%icc, 1b
++	 membar		#StoreLoad | #StoreStore
++	retl
++	 mov		1, %o0
++100:	retl
++	 mov		0, %o0
++
+ rwlock_impl_end:
+ 
+--- linux-2.6.0-test1/arch/sparc64/mm/fault.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/sparc64/mm/fault.c	2003-07-19 17:03:49.000000000 -0700
+@@ -26,6 +26,7 @@
+ #include <asm/uaccess.h>
+ #include <asm/asi.h>
+ #include <asm/lsu.h>
++#include <asm/sections.h>
+ 
+ #define ELEMENTS(arr) (sizeof (arr)/sizeof (arr[0]))
+ 
+@@ -320,10 +321,9 @@ asmlinkage void do_sparc64_fault(struct 
+ 
+ 	if (regs->tstate & TSTATE_PRIV) {
+ 		unsigned long tpc = regs->tpc;
+-		extern unsigned int _etext;
+ 
+ 		/* Sanity check the PC. */
+-		if ((tpc >= KERNBASE && tpc < (unsigned long) &_etext) ||
++		if ((tpc >= KERNBASE && tpc < (unsigned long) _etext) ||
+ 		    (tpc >= MODULES_VADDR && tpc < MODULES_END)) {
+ 			/* Valid, no problems... */
+ 		} else {
+--- linux-2.6.0-test1/arch/sparc64/mm/generic.c	2003-06-14 12:18:30.000000000 -0700
++++ 25/arch/sparc64/mm/generic.c	2003-07-19 17:07:16.000000000 -0700
+@@ -85,7 +85,7 @@ static inline void io_remap_pte_range(pt
+ 	} while (address < end);
+ }
+ 
+-static inline int io_remap_pmd_range(pmd_t * pmd, unsigned long address, unsigned long size,
++static inline int io_remap_pmd_range(pgd_t *pgd, pmd_t * pmd, unsigned long address, unsigned long size,
+ 	unsigned long offset, pgprot_t prot, int space)
+ {
+ 	unsigned long end;
+@@ -96,7 +96,7 @@ static inline int io_remap_pmd_range(pmd
+ 		end = PGDIR_SIZE;
+ 	offset -= address;
+ 	do {
+-		pte_t * pte = pte_alloc_map(current->mm, pmd, address);
++		pte_t * pte = pte_alloc_map(current->mm, pgd, &pmd, address);
+ 		if (!pte)
+ 			return -ENOMEM;
+ 		io_remap_pte_range(pte, address, end - address, address + offset, prot, space);
+@@ -122,11 +122,11 @@ int io_remap_page_range(struct vm_area_s
+ 
+ 	spin_lock(&mm->page_table_lock);
+ 	while (from < end) {
+-		pmd_t *pmd = pmd_alloc(current->mm, dir, from);
++		pmd_t *pmd = pmd_alloc_map(current->mm, dir, from);
+ 		error = -ENOMEM;
+ 		if (!pmd)
+ 			break;
+-		error = io_remap_pmd_range(pmd, from, end - from, offset + from, prot, space);
++		error = io_remap_pmd_range(pgd, pmd, from, end - from, offset + from, prot, space);
+ 		if (error)
+ 			break;
+ 		from = (from + PGDIR_SIZE) & PGDIR_MASK;
+--- linux-2.6.0-test1/arch/sparc64/mm/hugetlbpage.c	2003-06-14 12:18:25.000000000 -0700
++++ 25/arch/sparc64/mm/hugetlbpage.c	2003-07-19 17:07:16.000000000 -0700
+@@ -107,9 +107,11 @@ static pte_t *huge_pte_alloc_map(struct 
+ 
+ 	pgd = pgd_offset(mm, addr);
+ 	if (pgd) {
+-		pmd = pmd_alloc(mm, pgd, addr);
+-		if (pmd)
+-			pte = pte_alloc_map(mm, pmd, addr);
++		pmd = pmd_alloc_map(mm, pgd, addr);
++		if (pmd) {
++			pte = pte_alloc_map(mm, pgd, &pmd, addr);
++			pmd_unmap(pmd);
++		}
+ 	}
+ 	return pte;
+ }
+@@ -122,9 +124,11 @@ static pte_t *huge_pte_offset_map(struct
+ 
+ 	pgd = pgd_offset(mm, addr);
+ 	if (pgd) {
+-		pmd = pmd_offset(pgd, addr);
+-		if (pmd)
++		pmd = pmd_offset_map(pgd, addr);
++		if (pmd) {
+ 			pte = pte_offset_map(pmd, addr);
++			pmd_unmap(pmd);
++		}
+ 	}
+ 	return pte;
+ }
+--- linux-2.6.0-test1/arch/sparc64/mm/init.c	2003-06-14 12:18:07.000000000 -0700
++++ 25/arch/sparc64/mm/init.c	2003-07-19 17:03:49.000000000 -0700
+@@ -35,6 +35,7 @@
+ #include <asm/starfire.h>
+ #include <asm/tlb.h>
+ #include <asm/spitfire.h>
++#include <asm/sections.h>
+ 
+ DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
+ 
+@@ -48,16 +49,14 @@ unsigned long *sparc64_valid_addr_bitmap
+ unsigned long phys_base;
+ unsigned long pfn_base;
+ 
+-enum ultra_tlb_layout tlb_type = spitfire;
+-
+ /* get_new_mmu_context() uses "cache + 1".  */
+ spinlock_t ctx_alloc_lock = SPIN_LOCK_UNLOCKED;
+ unsigned long tlb_context_cache = CTX_FIRST_VERSION - 1;
+ #define CTX_BMAP_SLOTS (1UL << (CTX_VERSION_SHIFT - 6))
+ unsigned long mmu_context_bmap[CTX_BMAP_SLOTS];
+ 
+-/* References to section boundaries */
+-extern char __init_begin, __init_end, _start, _end, etext, edata;
++/* References to special section boundaries */
++extern char  _start[], _end[];
+ 
+ /* Initial ramdisk setup */
+ extern unsigned int sparc_ramdisk_image;
+@@ -1333,7 +1332,7 @@ unsigned long __init bootmem_init(unsign
+ 	 * image.  The kernel is hard mapped below PAGE_OFFSET in a
+ 	 * 4MB locked TLB translation.
+ 	 */
+-	start_pfn  = PAGE_ALIGN((unsigned long) &_end) -
++	start_pfn  = PAGE_ALIGN((unsigned long) _end) -
+ 		((unsigned long) KERNBASE);
+ 
+ 	/* Adjust up to the physical address where the kernel begins. */
+@@ -1349,7 +1348,7 @@ unsigned long __init bootmem_init(unsign
+ #ifdef CONFIG_BLK_DEV_INITRD
+ 	/* Now have to check initial ramdisk, so that bootmap does not overwrite it */
+ 	if (sparc_ramdisk_image) {
+-		if (sparc_ramdisk_image >= (unsigned long)&_end - 2 * PAGE_SIZE)
++		if (sparc_ramdisk_image >= (unsigned long)_end - 2 * PAGE_SIZE)
+ 			sparc_ramdisk_image -= KERNBASE;
+ 		initrd_start = sparc_ramdisk_image + phys_base;
+ 		initrd_end = initrd_start + sparc_ramdisk_size;
+@@ -1426,7 +1425,7 @@ void __init paging_init(void)
+ 
+ 	set_bit(0, mmu_context_bmap);
+ 
+-	real_end = (unsigned long)&_end;
++	real_end = (unsigned long)_end;
+ 	if ((real_end > ((unsigned long)KERNBASE + 0x400000)))
+ 		bigkernel = 1;
+ #ifdef CONFIG_BLK_DEV_INITRD
+@@ -1718,7 +1717,7 @@ void __init mem_init(void)
+ 	memset(sparc64_valid_addr_bitmap, 0, i << 3);
+ 
+ 	addr = PAGE_OFFSET + phys_base;
+-	last = PAGE_ALIGN((unsigned long)&_end) -
++	last = PAGE_ALIGN((unsigned long)_end) -
+ 		((unsigned long) KERNBASE);
+ 	last += PAGE_OFFSET + phys_base;
+ 	while (addr < last) {
+@@ -1745,11 +1744,11 @@ void __init mem_init(void)
+ 	SetPageReserved(mem_map_zero);
+ 	clear_page(page_address(mem_map_zero));
+ 
+-	codepages = (((unsigned long) &etext) - ((unsigned long)&_start));
++	codepages = (((unsigned long) _etext) - ((unsigned long) _start));
+ 	codepages = PAGE_ALIGN(codepages) >> PAGE_SHIFT;
+-	datapages = (((unsigned long) &edata) - ((unsigned long)&etext));
++	datapages = (((unsigned long) _edata) - ((unsigned long) _etext));
+ 	datapages = PAGE_ALIGN(datapages) >> PAGE_SHIFT;
+-	initpages = (((unsigned long) &__init_end) - ((unsigned long) &__init_begin));
++	initpages = (((unsigned long) __init_end) - ((unsigned long) __init_begin));
+ 	initpages = PAGE_ALIGN(initpages) >> PAGE_SHIFT;
+ 
+ #ifndef CONFIG_SMP
+@@ -1812,8 +1811,8 @@ void free_initmem (void)
+ 	/*
+ 	 * The init section is aligned to 8k in vmlinux.lds. Page align for >8k pagesizes.
+ 	 */
+-	addr = PAGE_ALIGN((unsigned long)(&__init_begin));
+-	initend = (unsigned long)(&__init_end) & PAGE_MASK;
++	addr = PAGE_ALIGN((unsigned long)(__init_begin));
++	initend = (unsigned long)(__init_end) & PAGE_MASK;
+ 	for (; addr < initend; addr += PAGE_SIZE) {
+ 		unsigned long page;
+ 		struct page *p;
+--- linux-2.6.0-test1/arch/sparc64/prom/bootstr.c	2003-06-14 12:17:58.000000000 -0700
++++ 25/arch/sparc64/prom/bootstr.c	2003-07-19 17:03:49.000000000 -0700
+@@ -15,16 +15,22 @@
+  */
+ 
+ #define BARG_LEN  256
+-int bootstr_len = BARG_LEN;
+-static int bootstr_valid = 0;
+-static char bootstr_buf[BARG_LEN] = { 0 };
++struct {
++	int bootstr_len;
++	int bootstr_valid;
++	char bootstr_buf[BARG_LEN];
++} bootstr_info = {
++	.bootstr_len = BARG_LEN,
++};
+ 
+ char * __init
+ prom_getbootargs(void)
+ {
+ 	/* This check saves us from a panic when bootfd patches args. */
+-	if (bootstr_valid) return bootstr_buf;
+-	prom_getstring(prom_chosen_node, "bootargs", bootstr_buf, BARG_LEN);
+-	bootstr_valid = 1;
+-	return bootstr_buf;
++	if (bootstr_info.bootstr_valid)
++		return bootstr_info.bootstr_buf;
++	prom_getstring(prom_chosen_node, "bootargs",
++		       bootstr_info.bootstr_buf, BARG_LEN);
++	bootstr_info.bootstr_valid = 1;
++	return bootstr_info.bootstr_buf;
+ }
+--- linux-2.6.0-test1/arch/sparc/kernel/process.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/arch/sparc/kernel/process.c	2003-07-19 17:03:49.000000000 -0700
+@@ -590,16 +590,20 @@ int dump_fpu (struct pt_regs * regs, elf
+ 		put_psr(get_psr() | PSR_EF);
+ 		fpsave(&current->thread.float_regs[0], &current->thread.fsr,
+ 		       &current->thread.fpqueue[0], &current->thread.fpqdepth);
+-		regs->psr &= ~(PSR_EF);
+-		current->flags &= ~(PF_USEDFPU);
++		if (regs != NULL) {
++			regs->psr &= ~(PSR_EF);
++			current->flags &= ~(PF_USEDFPU);
++		}
+ 	}
+ #else
+ 	if (current == last_task_used_math) {
+ 		put_psr(get_psr() | PSR_EF);
+ 		fpsave(&current->thread.float_regs[0], &current->thread.fsr,
+ 		       &current->thread.fpqueue[0], &current->thread.fpqdepth);
+-		last_task_used_math = 0;
+-		regs->psr &= ~(PSR_EF);
++		if (regs != NULL) {
++			regs->psr &= ~(PSR_EF);
++			last_task_used_math = 0;
++		}
+ 	}
+ #endif
+ 	memcpy(&fpregs->pr_fr.pr_regs[0],
+--- linux-2.6.0-test1/arch/sparc/kernel/setup.c	2003-06-14 12:17:56.000000000 -0700
++++ 25/arch/sparc/kernel/setup.c	2003-07-19 17:03:49.000000000 -0700
+@@ -25,7 +25,6 @@
+ #include <linux/kdev_t.h>
+ #include <linux/major.h>
+ #include <linux/string.h>
+-#include <linux/blk.h>
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+ #include <linux/console.h>
+--- linux-2.6.0-test1/arch/sparc/mm/generic.c	2003-06-14 12:18:33.000000000 -0700
++++ 25/arch/sparc/mm/generic.c	2003-07-19 17:07:16.000000000 -0700
+@@ -67,7 +67,7 @@ static inline void io_remap_pte_range(pt
+ 	} while (address < end);
+ }
+ 
+-static inline int io_remap_pmd_range(pmd_t * pmd, unsigned long address, unsigned long size,
++static inline int io_remap_pmd_range(pgd_t *pgd, pmd_t * pmd, unsigned long address, unsigned long size,
+ 	unsigned long offset, pgprot_t prot, int space)
+ {
+ 	unsigned long end;
+@@ -78,7 +78,7 @@ static inline int io_remap_pmd_range(pmd
+ 		end = PGDIR_SIZE;
+ 	offset -= address;
+ 	do {
+-		pte_t * pte = pte_alloc_map(current->mm, pmd, address);
++		pte_t * pte = pte_alloc_map(current->mm, pgd, &pmd, address);
+ 		if (!pte)
+ 			return -ENOMEM;
+ 		io_remap_pte_range(pte, address, end - address, address + offset, prot, space);
+@@ -103,11 +103,11 @@ int io_remap_page_range(struct vm_area_s
+ 
+ 	spin_lock(&mm->page_table_lock);
+ 	while (from < end) {
+-		pmd_t *pmd = pmd_alloc(current->mm, dir, from);
++		pmd_t *pmd = pmd_alloc_map(current->mm, dir, from);
+ 		error = -ENOMEM;
+ 		if (!pmd)
+ 			break;
+-		error = io_remap_pmd_range(pmd, from, end - from, offset + from, prot, space);
++		error = io_remap_pmd_range(pgd, pmd, from, end - from, offset + from, prot, space);
+ 		if (error)
+ 			break;
+ 		from = (from + PGDIR_SIZE) & PGDIR_MASK;
+--- linux-2.6.0-test1/arch/sparc/mm/srmmu.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/arch/sparc/mm/srmmu.c	2003-07-19 17:07:16.000000000 -0700
+@@ -15,7 +15,6 @@
+ #include <linux/vmalloc.h>
+ #include <linux/pagemap.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
+ #include <linux/spinlock.h>
+ #include <linux/bootmem.h>
+ #include <linux/fs.h>
+@@ -2188,7 +2187,7 @@ void __init ld_mmu_srmmu(void)
+ 
+ 	BTFIXUPSET_CALL(pte_pfn, srmmu_pte_pfn, BTFIXUPCALL_NORM);
+ 	BTFIXUPSET_CALL(pmd_page, srmmu_pmd_page, BTFIXUPCALL_NORM);
+-	BTFIXUPSET_CALL(pgd_page, srmmu_pgd_page, BTFIXUPCALL_NORM);
++	BTFIXUPSET_CALL(__pgd_page, srmmu_pgd_page, BTFIXUPCALL_NORM);
+ 
+ 	BTFIXUPSET_SETHI(none_mask, 0xF0000000);
+ 
+@@ -2220,7 +2219,7 @@ void __init ld_mmu_srmmu(void)
+ 	BTFIXUPSET_CALL(pte_alloc_one_kernel, srmmu_pte_alloc_one_kernel, BTFIXUPCALL_NORM);
+ 	BTFIXUPSET_CALL(pte_alloc_one, srmmu_pte_alloc_one, BTFIXUPCALL_NORM);
+ 	BTFIXUPSET_CALL(free_pmd_fast, srmmu_pmd_free, BTFIXUPCALL_NORM);
+-	BTFIXUPSET_CALL(pmd_alloc_one, srmmu_pmd_alloc_one, BTFIXUPCALL_NORM);
++	BTFIXUPSET_CALL(__pmd_alloc_one, srmmu_pmd_alloc_one, BTFIXUPCALL_NORM);
+ 	BTFIXUPSET_CALL(free_pgd_fast, srmmu_free_pgd_fast, BTFIXUPCALL_NORM);
+ 	BTFIXUPSET_CALL(get_pgd_fast, srmmu_get_pgd_fast, BTFIXUPCALL_NORM);
+ 
+--- linux-2.6.0-test1/arch/sparc/mm/sun4c.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/arch/sparc/mm/sun4c.c	2003-07-19 17:07:16.000000000 -0700
+@@ -2211,7 +2211,7 @@ void __init ld_mmu_sun4c(void)
+ 	BTFIXUPSET_CALL(pte_alloc_one_kernel, sun4c_pte_alloc_one_kernel, BTFIXUPCALL_NORM);
+ 	BTFIXUPSET_CALL(pte_alloc_one, sun4c_pte_alloc_one, BTFIXUPCALL_NORM);
+ 	BTFIXUPSET_CALL(free_pmd_fast, sun4c_free_pmd_fast, BTFIXUPCALL_NOP);
+-	BTFIXUPSET_CALL(pmd_alloc_one, sun4c_pmd_alloc_one, BTFIXUPCALL_RETO0);
++	BTFIXUPSET_CALL(__pmd_alloc_one, sun4c_pmd_alloc_one, BTFIXUPCALL_RETO0);
+ 	BTFIXUPSET_CALL(free_pgd_fast, sun4c_free_pgd_fast, BTFIXUPCALL_NORM);
+ 	BTFIXUPSET_CALL(get_pgd_fast, sun4c_get_pgd_fast, BTFIXUPCALL_NORM);
+ 
+@@ -2252,5 +2252,5 @@ void __init ld_mmu_sun4c(void)
+ 
+ 	/* These should _never_ get called with two level tables. */
+ 	BTFIXUPSET_CALL(pgd_set, sun4c_pgd_set, BTFIXUPCALL_NOP);
+-	BTFIXUPSET_CALL(pgd_page, sun4c_pgd_page, BTFIXUPCALL_RETO0);
++	BTFIXUPSET_CALL(__pgd_page, sun4c_pgd_page, BTFIXUPCALL_RETO0);
+ }
+--- linux-2.6.0-test1/arch/um/drivers/ubd_kern.c	2003-06-14 12:18:20.000000000 -0700
++++ 25/arch/um/drivers/ubd_kern.c	2003-07-19 17:03:49.000000000 -0700
+@@ -15,7 +15,6 @@
+ 
+ #include "linux/config.h"
+ #include "linux/module.h"
+-#include "linux/blk.h"
+ #include "linux/blkdev.h"
+ #include "linux/hdreg.h"
+ #include "linux/init.h"
+--- linux-2.6.0-test1/arch/um/kernel/irq.c	2003-06-14 12:18:30.000000000 -0700
++++ 25/arch/um/kernel/irq.c	2003-07-19 17:04:07.000000000 -0700
+@@ -565,9 +565,9 @@ static struct proc_dir_entry * smp_affin
+ /* These are read and written as longs, so a read won't see a partial write
+  * even during a race.
+  */
+-static unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };
++static cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL };
+ 
+-#define HEX_DIGITS 8
++#define HEX_DIGITS (2*sizeof(cpumask_t))
+ 
+ static int irq_affinity_read_proc (char *page, char **start, off_t off,
+ 			int count, int *eof, void *data)
+@@ -578,10 +578,10 @@ static int irq_affinity_read_proc (char 
+ }
+ 
+ static unsigned int parse_hex_value (const char *buffer,
+-		unsigned long count, unsigned long *ret)
++		unsigned long count, cpumask_t *ret)
+ {
+ 	unsigned char hexnum [HEX_DIGITS];
+-	unsigned long value;
++	cpumask_t value = CPU_MASK_NONE;
+ 	int i;
+ 
+ 	if (!count)
+@@ -595,10 +595,9 @@ static unsigned int parse_hex_value (con
+ 	 * Parse the first 8 characters as a hex string, any non-hex char
+ 	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
+ 	 */
+-	value = 0;
+ 
+ 	for (i = 0; i < count; i++) {
+-		unsigned int c = hexnum[i];
++		unsigned int k, c = hexnum[i];
+ 
+ 		switch (c) {
+ 			case '0' ... '9': c -= '0'; break;
+@@ -607,7 +606,10 @@ static unsigned int parse_hex_value (con
+ 		default:
+ 			goto out;
+ 		}
+-		value = (value << 4) | c;
++		cpus_shift_left(value, value, 16);
++		for (k = 0; k < 4; ++k)
++			if (c & (1 << k))
++				cpu_set(k, value);
+ 	}
+ out:
+ 	*ret = value;
+@@ -618,7 +620,7 @@ static int irq_affinity_write_proc (stru
+ 					unsigned long count, void *data)
+ {
+ 	int irq = (long) data, full_count = count, err;
+-	unsigned long new_value;
++	cpumask_t new_value, tmp;
+ 
+ 	if (!irq_desc[irq].handler->set_affinity)
+ 		return -EIO;
+@@ -631,7 +633,8 @@ static int irq_affinity_write_proc (stru
+ 	 * way to make the system unusable accidentally :-) At least
+ 	 * one online CPU still has to be targeted.
+ 	 */
+-	if (!(new_value & cpu_online_map))
++	cpus_and(tmp, new_value, cpu_online_map);
++	if (cpus_empty(tmp))
+ 		return -EINVAL;
+ #endif
+ 
+@@ -644,17 +647,27 @@ static int irq_affinity_write_proc (stru
+ static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
+ 			int count, int *eof, void *data)
+ {
+-	unsigned long *mask = (unsigned long *) data;
++	cpumask_t tmp, *mask = (cpumask_t *) data;
++	int k, len = 0;
++
+ 	if (count < HEX_DIGITS+1)
+ 		return -EINVAL;
+-	return sprintf (page, "%08lx\n", *mask);
++	tmp = *mask;
++	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
++		len += j;
++		page += j;
++		cpus_shift_right(tmp, tmp, 16);
++	}
++	len += sprintf(page, "\n");
++	return len;
+ }
+ 
+ static int prof_cpu_mask_write_proc (struct file *file, const char *buffer,
+ 					unsigned long count, void *data)
+ {
+-	unsigned long *mask = (unsigned long *) data, full_count = count, err;
+-	unsigned long new_value;
++	cpumask_t *mask = (cpumask_t *)data, new_value;
++	unsigned long full_count = count, err;
+ 
+ 	err = parse_hex_value(buffer, count, &new_value);
+ 	if (err)
+@@ -693,7 +706,7 @@ static void register_irq_proc (unsigned 
+ }
+ 
+ /* Read and written as a long */
+-unsigned long prof_cpu_mask = -1;
++cpumask_t prof_cpu_mask = CPU_MASK_ALL;
+ 
+ void __init init_irq_proc (void)
+ {
+--- linux-2.6.0-test1/arch/um/kernel/skas/process_kern.c	2003-06-14 12:18:04.000000000 -0700
++++ 25/arch/um/kernel/skas/process_kern.c	2003-07-19 17:04:07.000000000 -0700
+@@ -152,7 +152,7 @@ static int start_kernel_proc(void *unuse
+ 	cpu_tasks[0].pid = pid;
+ 	cpu_tasks[0].task = current;
+ #ifdef CONFIG_SMP
+- 	cpu_online_map = 1;
++ 	cpu_online_map = cpumask_of_cpu(0);
+ #endif
+ 	start_kernel();
+ 	return(0);
+--- linux-2.6.0-test1/arch/um/kernel/smp.c	2003-06-14 12:18:03.000000000 -0700
++++ 25/arch/um/kernel/smp.c	2003-07-19 17:04:07.000000000 -0700
+@@ -5,9 +5,6 @@
+ 
+ #include "linux/config.h"
+ 
+-/* CPU online map, set by smp_boot_cpus */
+-unsigned long cpu_online_map = 1;
+-
+ #ifdef CONFIG_SMP
+ 
+ #include "linux/sched.h"
+@@ -24,6 +21,9 @@ unsigned long cpu_online_map = 1;
+ #include "irq_user.h"
+ #include "os.h"
+ 
++/* CPU online map, set by smp_boot_cpus */
++unsigned long cpu_online_map = cpumask_of_cpu(0);
++
+ /* Per CPU bogomips and other parameters
+  * The only piece used here is the ipi pipe, which is set before SMP is
+  * started and never changed.
+@@ -104,8 +104,8 @@ void smp_send_stop(void)
+ 	printk("done\n");
+ }
+ 
+-static unsigned long smp_commenced_mask;
+-static volatile unsigned long smp_callin_map = 0;
++static cpumask_t smp_commenced_mask;
++static cpumask_t smp_callin_map = CPU_MASK_NONE;
+ 
+ static int idle_proc(void *cpup)
+ {
+@@ -120,15 +120,15 @@ static int idle_proc(void *cpup)
+ 		     current->thread.mode.tt.extern_pid);
+  
+ 	wmb();
+-	if (test_and_set_bit(cpu, &smp_callin_map)) {
++	if (cpu_test_and_set(cpu, &smp_callin_map)) {
+ 		printk("huh, CPU#%d already present??\n", cpu);
+ 		BUG();
+ 	}
+ 
+-	while (!test_bit(cpu, &smp_commenced_mask))
++	while (!cpu_isset(cpu, &smp_commenced_mask))
+ 		cpu_relax();
+ 
+-	set_bit(cpu, &cpu_online_map);
++	cpu_set(cpu, cpu_online_map);
+ 	default_idle();
+ 	return(0);
+ }
+@@ -159,8 +159,8 @@ void smp_prepare_cpus(unsigned int maxcp
+ 	unsigned long waittime;
+ 	int err, cpu;
+ 
+-	set_bit(0, &cpu_online_map);
+-	set_bit(0, &smp_callin_map);
++	cpu_set(0, cpu_online_map);
++	cpu_set(0, smp_callin_map);
+ 
+ 	err = os_pipe(cpu_data[0].ipi_pipe, 1, 1);
+ 	if(err)	panic("CPU#0 failed to create IPI pipe, errno = %d", -err);
+@@ -177,10 +177,10 @@ void smp_prepare_cpus(unsigned int maxcp
+ 		unhash_process(idle);
+ 
+ 		waittime = 200000000;
+-		while (waittime-- && !test_bit(cpu, &smp_callin_map))
++		while (waittime-- && !cpu_isset(cpu, smp_callin_map))
+ 			cpu_relax();
+ 
+-		if (test_bit(cpu, &smp_callin_map))
++		if (cpu_isset(cpu, smp_callin_map))
+ 			printk("done\n");
+ 		else printk("failed\n");
+ 	}
+@@ -188,13 +188,13 @@ void smp_prepare_cpus(unsigned int maxcp
+ 
+ void smp_prepare_boot_cpu(void)
+ {
+-	set_bit(smp_processor_id(), &cpu_online_map);
++	cpu_set(smp_processor_id(), cpu_online_map);
+ }
+ 
+ int __cpu_up(unsigned int cpu)
+ {
+-	set_bit(cpu, &smp_commenced_mask);
+-	while (!test_bit(cpu, &cpu_online_map))
++	cpu_set(cpu, smp_commenced_mask);
++	while (!cpu_isset(cpu, cpu_online_map))
+ 		mb();
+ 	return(0);
+ }
+@@ -271,7 +271,7 @@ int smp_call_function(void (*_func)(void
+ 
+ 	for (i=0;i<NR_CPUS;i++)
+ 		if((i != current->thread_info->cpu) && 
+-		   test_bit(i, &cpu_online_map))
++		   cpu_isset(i, cpu_online_map))
+ 			write(cpu_data[i].ipi_pipe[1], "C", 1);
+ 
+ 	while (atomic_read(&scf_started) != cpus)
+--- linux-2.6.0-test1/arch/um/kernel/tt/process_kern.c	2003-06-14 12:18:30.000000000 -0700
++++ 25/arch/um/kernel/tt/process_kern.c	2003-07-19 17:04:07.000000000 -0700
+@@ -419,7 +419,7 @@ static int start_kernel_proc(void *unuse
+ 	cpu_tasks[0].pid = pid;
+ 	cpu_tasks[0].task = current;
+ #ifdef CONFIG_SMP
+- 	cpu_online_map = 1;
++ 	cpu_online_map = cpumask_of_cpu(0);
+ #endif
+ 	if(debug) os_stop_process(pid);
+ 	start_kernel();
+--- linux-2.6.0-test1/arch/um/kernel/um_arch.c	2003-06-14 12:18:30.000000000 -0700
++++ 25/arch/um/kernel/um_arch.c	2003-07-19 17:04:07.000000000 -0700
+@@ -57,7 +57,7 @@ static int show_cpuinfo(struct seq_file 
+ 
+ 	index = (struct cpuinfo_um *)v - cpu_data;
+ #ifdef CONFIG_SMP
+-	if (!(cpu_online_map & (1 << index)))
++	if (!cpu_online(index))
+ 		return 0;
+ #endif
+ 
+--- linux-2.6.0-test1/arch/v850/Kconfig	2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/v850/Kconfig	2003-07-19 17:03:49.000000000 -0700
+@@ -48,20 +48,24 @@ menu "Processor type and features"
+    choice
+ 	  prompt "Platform"
+ 	  default GDB
++      config V850E_SIM
++      	     bool "GDB"
+       config RTE_CB_MA1
+       	     bool "RTE-V850E/MA1-CB"
+       config RTE_CB_NB85E
+       	     bool "RTE-V850E/NB85E-CB"
+-      config V850E_SIM
+-      	     bool "GDB"
++      config RTE_CB_ME2
++      	     bool "RTE-V850E/ME2-CB"
++      config V850E_AS85EP1
++      	     bool "AS85EP1"
+       config V850E2_SIM85E2C
+       	     bool "sim85e2c"
++      config V850E2_SIM85E2S
++      	     bool "sim85e2s"
+       config V850E2_FPGA85E2C
+       	     bool "NA85E2C-FPGA"
+       config V850E2_ANNA
+       	     bool "Anna"
+-      config V850E_AS85EP1
+-      	     bool "AS85EP1"
+    endchoice
+ 
+ 
+@@ -78,41 +82,32 @@ menu "Processor type and features"
+    	  bool
+ 	  depends RTE_CB_MA1
+ 	  default y
+-   # Similarly for the RTE-V850E/MA1-CB - V850E/TEG
++   # Similarly for the RTE-V850E/NB85E-CB - V850E/TEG
+    config V850E_TEG
+    	  bool
+ 	  depends RTE_CB_NB85E
+ 	  default y
+-
+-   # NB85E processor core
+-   config V850E_NB85E
++   # ... and the RTE-V850E/ME2-CB - V850E/ME2
++   config V850E_ME2
+    	  bool
+-	  depends V850E_MA1 || V850E_TEG
++	  depends RTE_CB_ME2
+ 	  default y
+ 
+-   config V850E_MA1_HIGHRES_TIMER
+-   	  bool "High resolution timer support"
+-  	  depends V850E_MA1
+-
+ 
+-   #### V850E2 processor-specific config
++   #### sim85e2-specific config
+ 
+-   # V850E2 processors
+-   config V850E2
++   config V850E2_SIM85E2
+    	  bool
+-	  depends V850E2_SIM85E2C || V850E2_FPGA85E2C || V850E2_ANNA
++	  depends V850E2_SIM85E2C || V850E2_SIM85E2S
+ 	  default y
+ 
+-   # Processors based on the NA85E2A core
+-   config V850E2_NA85E2A
+-   	  bool
+-	  depends V850E2_ANNA
+-	  default y
+ 
+-   # Processors based on the NA85E2C core
+-   config V850E2_NA85E2C
++   #### V850E2 processor-specific config
++
++   # V850E2 processors
++   config V850E2
+    	  bool
+-	  depends V850E2_SIM85E2C || V850E2_FPGA85E2C
++	  depends V850E2_SIM85E2 || V850E2_FPGA85E2C || V850E2_ANNA
+ 	  default y
+ 
+ 
+@@ -121,7 +116,7 @@ menu "Processor type and features"
+    # Boards in the RTE-x-CB series
+    config RTE_CB
+    	  bool
+-	  depends RTE_CB_MA1 || RTE_CB_NB85E
++	  depends RTE_CB_MA1 || RTE_CB_NB85E || RTE_CB_ME2
+ 	  default y
+ 
+    config RTE_CB_MULTI
+@@ -129,7 +124,7 @@ menu "Processor type and features"
+ 	  # 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
++	  depends RTE_CB_MA1 || RTE_CB_NB85E
+ 	  default y
+ 
+    config RTE_CB_MULTI_DBTRAP
+@@ -156,14 +151,42 @@ menu "Processor type and features"
+    # The only PCI bus we support is on the RTE-MOTHER-A board
+    config PCI
+    	  bool
+-	  default y if RTE_MB_A_PCI
++	  default RTE_MB_A_PCI
++
++
++   #### Some feature-specific configs
++
++   # Everything except for the GDB simulator uses the same interrupt controller
++   config V850E_INTC
++   	  bool
++	  default !V850E_SIM
++
++   # Everything except for the various simulators uses the "Timer D" unit
++   config V850E_TIMER_D
++   	  bool
++	  default !V850E_SIM && !V850E2_SIM85E2
++
++   # Cache control used on some v850e1 processors
++   config V850E_CACHE
++          bool
++	  default V850E_TEG || V850E_ME2
++
++   # Cache control used on v850e2 processors; I think this should
++   # actually apply to more, but currently only the SIM85E2S uses it
++   config V850E2_CACHE
++   	  bool
++	  default V850E2_SIM85E2S
++
++   config NO_CACHE
++   	  bool
++	  default !V850E_CACHE && !V850E2_CACHE
+ 
+ 
+    #### Misc config
+ 
+    config ROM_KERNEL
+    	  bool "Kernel in ROM"
+-	  depends V850E2_ANNA || (RTE_CB && !RTE_CB_MULTI)
++	  depends V850E2_ANNA || V850E_AS85EP1 || RTE_CB_ME2
+ 
+    # Some platforms pre-zero memory, in which case the kernel doesn't need to
+    config ZERO_BSS
+@@ -177,9 +200,12 @@ menu "Processor type and features"
+    	  int
+ 	  default 8 if V850E2_SIM85E2C || V850E2_FPGA85E2C
+ 
++   config V850E_HIGHRES_TIMER
++   	  bool "High resolution timer support"
++	  depends V850E_TIMER_D
+    config TIME_BOOTUP
+    	  bool "Time bootup"
+-	  depends V850E_MA1_HIGHRES_TIMER
++	  depends V850E_HIGHRES_TIMER
+ 
+    config RESET_GUARD
+    	  bool "Reset Guard"
+@@ -241,6 +267,7 @@ config KCORE_AOUT
+ 	default y
+ 
+ config KCORE_ELF
++	bool
+ 	default y
+ 
+ source "fs/Kconfig.binfmt"
+--- linux-2.6.0-test1/arch/v850/kernel/anna.c	2003-06-14 12:18:21.000000000 -0700
++++ 25/arch/v850/kernel/anna.c	2003-07-19 17:03:49.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * arch/v850/kernel/anna.c -- Anna V850E2 evaluation chip/board
+  *
+- *  Copyright (C) 2002  NEC Corporation
+- *  Copyright (C) 2002  Miles Bader <miles@gnu.org>
++ *  Copyright (C) 2002,03  NEC Electronics Corporation
++ *  Copyright (C) 2002,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
+@@ -21,8 +21,8 @@
+ #include <asm/machdep.h>
+ #include <asm/atomic.h>
+ #include <asm/page.h>
+-#include <asm/nb85e_timer_d.h>
+-#include <asm/nb85e_uart.h>
++#include <asm/v850e_timer_d.h>
++#include <asm/v850e_uart.h>
+ 
+ #include "mach.h"
+ 
+@@ -41,32 +41,34 @@ static void anna_led_tick (void);
+ 
+ void __init mach_early_init (void)
+ {
+-	ANNA_ILBEN  = 0;
+-	ANNA_CSC(0) = 0x402F;
+-	ANNA_CSC(1) = 0x4000;
+-	ANNA_BPC    = 0;
+-	ANNA_BSC    = 0xAAAA;
+-	ANNA_BEC    = 0;
+-	ANNA_BHC    = 0xFFFF;	/* icache all memory, dcache all */
+-	ANNA_BCT(0) = 0xB088;
+-	ANNA_BCT(1) = 0x0008;
+-	ANNA_DWC(0) = 0x0027;
+-	ANNA_DWC(1) = 0;
+-	ANNA_BCC    = 0x0006;
+-	ANNA_ASC    = 0;
+-	ANNA_LBS    = 0x0089;
+-	ANNA_SCR3   = 0x21A9;
+-	ANNA_RFS3   = 0x8121;
++	ANNA_ILBEN    = 0;
+ 
+-	nb85e_intc_disable_irqs ();
++	V850E2_CSC(0) = 0x402F;
++	V850E2_CSC(1) = 0x4000;
++	V850E2_BPC    = 0;
++	V850E2_BSC    = 0xAAAA;
++	V850E2_BEC    = 0;
++
++#if 0
++	V850E2_BHC    = 0xFFFF;	/* icache all memory, dcache all */
++#else
++	V850E2_BHC    = 0;	/* cache no memory */
++#endif
++	V850E2_BCT(0) = 0xB088;
++	V850E2_BCT(1) = 0x0008;
++	V850E2_DWC(0) = 0x0027;
++	V850E2_DWC(1) = 0;
++	V850E2_BCC    = 0x0006;
++	V850E2_ASC    = 0;
++	V850E2_LBS    = 0x0089;
++	V850E2_SCR(3) = 0x21A9;
++	V850E2_RFS(3) = 0x8121;
++
++	v850e_intc_disable_irqs ();
+ }
+ 
+ void __init mach_setup (char **cmdline)
+ {
+-#ifdef CONFIG_V850E_NB85E_UART_CONSOLE
+-	nb85e_uart_cons_init (1);
+-#endif
+-
+ 	ANNA_PORT_PM (LEDS_PORT) = 0;	/* Make all LED pins output pins.  */
+ 	mach_tick = anna_led_tick;
+ }
+@@ -95,12 +97,12 @@ void mach_gettimeofday (struct timespec 
+ void __init mach_sched_init (struct irqaction *timer_action)
+ {
+ 	/* Start hardware timer.  */
+-	nb85e_timer_d_configure (0, HZ);
++	v850e_timer_d_configure (0, HZ);
+ 	/* Install timer interrupt handler.  */
+ 	setup_irq (IRQ_INTCMD(0), timer_action);
+ }
+ 
+-static struct nb85e_intc_irq_init irq_inits[] = {
++static struct v850e_intc_irq_init irq_inits[] = {
+ 	{ "IRQ", 0, 		NUM_MACH_IRQS,	1, 7 },
+ 	{ "PIN", IRQ_INTP(0),   IRQ_INTP_NUM,   1, 4 },
+ 	{ "CCC", IRQ_INTCCC(0),	IRQ_INTCCC_NUM, 1, 5 },
+@@ -118,7 +120,7 @@ static struct hw_interrupt_type hw_itype
+ 
+ void __init mach_init_irqs (void)
+ {
+-	nb85e_intc_init_irq_types (irq_inits, hw_itypes);
++	v850e_intc_init_irq_types (irq_inits, hw_itypes);
+ }
+ 
+ void machine_restart (char *__unused)
+--- linux-2.6.0-test1/arch/v850/kernel/as85ep1.c	2003-06-14 12:18:34.000000000 -0700
++++ 25/arch/v850/kernel/as85ep1.c	2003-07-19 17:03:49.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * arch/v850/kernel/as85ep1.c -- AS85EP1 V850E evaluation chip/board
+  *
+- *  Copyright (C) 2002  NEC Corporation
+- *  Copyright (C) 2002  Miles Bader <miles@gnu.org>
++ *  Copyright (C) 2002,03  NEC Electronics Corporation
++ *  Copyright (C) 2002,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
+@@ -21,8 +21,8 @@
+ #include <asm/machdep.h>
+ #include <asm/atomic.h>
+ #include <asm/page.h>
+-#include <asm/nb85e_timer_d.h>
+-#include <asm/nb85e_uart.h>
++#include <asm/v850e_timer_d.h>
++#include <asm/v850e_uart.h>
+ 
+ #include "mach.h"
+ 
+@@ -90,20 +90,14 @@ void __init mach_early_init (void)
+ 	AS85EP1_IRAMM = 0x0;	/* $BFbB"L?Na(BRAM$B$O!V(Bread-mode$B!W$K$J$j$^$9(B */
+ #endif /* !CONFIG_ROM_KERNEL */
+ 
+-	nb85e_intc_disable_irqs ();
++	v850e_intc_disable_irqs ();
+ }
+ 
+ void __init mach_setup (char **cmdline)
+ {
+-#ifdef CONFIG_V850E_NB85E_UART_CONSOLE
+-	nb85e_uart_cons_init (1);
+-#endif
+-
+ 	AS85EP1_PORT_PMC (LEDS_PORT) = 0; /* Make the LEDs port an I/O port. */
+ 	AS85EP1_PORT_PM (LEDS_PORT) = 0; /* Make all the bits output pins.  */
+ 	mach_tick = as85ep1_led_tick;
+-
+-	ROOT_DEV = MKDEV (BLKMEM_MAJOR, 0);
+ }
+ 
+ void __init mach_get_physical_ram (unsigned long *ram_start,
+@@ -137,21 +131,21 @@ void __init mach_reserve_bootmem ()
+ 				 root_fs_image_end - root_fs_image_start);
+ }
+ 
+-void mach_gettimeofday (struct timeval *tv)
++void mach_gettimeofday (struct timespec *tv)
+ {
+ 	tv->tv_sec = 0;
+-	tv->tv_usec = 0;
++	tv->tv_nsec = 0;
+ }
+ 
+ void __init mach_sched_init (struct irqaction *timer_action)
+ {
+ 	/* Start hardware timer.  */
+-	nb85e_timer_d_configure (0, HZ);
++	v850e_timer_d_configure (0, HZ);
+ 	/* Install timer interrupt handler.  */
+ 	setup_irq (IRQ_INTCMD(0), timer_action);
+ }
+ 
+-static struct nb85e_intc_irq_init irq_inits[] = {
++static struct v850e_intc_irq_init irq_inits[] = {
+ 	{ "IRQ", 0, 		NUM_MACH_IRQS,	1, 7 },
+ 	{ "CCC", IRQ_INTCCC(0),	IRQ_INTCCC_NUM, 1, 5 },
+ 	{ "CMD", IRQ_INTCMD(0), IRQ_INTCMD_NUM,	1, 5 },
+@@ -166,7 +160,7 @@ static struct hw_interrupt_type hw_itype
+ 
+ void __init mach_init_irqs (void)
+ {
+-	nb85e_intc_init_irq_types (irq_inits, hw_itypes);
++	v850e_intc_init_irq_types (irq_inits, hw_itypes);
+ }
+ 
+ void machine_restart (char *__unused)
+--- linux-2.6.0-test1/arch/v850/kernel/fpga85e2c.c	2003-06-14 12:18:33.000000000 -0700
++++ 25/arch/v850/kernel/fpga85e2c.c	2003-07-19 17:03:49.000000000 -0700
+@@ -2,8 +2,8 @@
+  * arch/v850/kernel/fpga85e2c.h -- Machine-dependent defs for
+  *	FPGA implementation of V850E2/NA85E2C
+  *
+- *  Copyright (C) 2002  NEC Corporation
+- *  Copyright (C) 2002  Miles Bader <miles@gnu.org>
++ *  Copyright (C) 2002,03  NEC Electronics Corporation
++ *  Copyright (C) 2002,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
+@@ -46,7 +46,7 @@ void __init mach_early_init (void)
+ 
+ 	/* Set bus sizes: CS0 32-bit, CS1 16-bit, CS7 8-bit,
+ 	   everything else 32-bit.  */
+-	BSC = 0x2AA6;
++	V850E2_BSC = 0x2AA6;
+ 	for (i = 2; i <= 6; i++)
+ 		CSDEV(i) = 0;	/* 32 bit */
+ 
+@@ -134,7 +134,7 @@ void machine_power_off (void)
+ 
+ /* Interrupts */
+ 
+-struct nb85e_intc_irq_init irq_inits[] = {
++struct v850e_intc_irq_init irq_inits[] = {
+ 	{ "IRQ", 0, 		NUM_MACH_IRQS,	1, 7 },
+ 	{ "RPU", IRQ_RPU(0),	IRQ_RPU_NUM,	1, 6 },
+ 	{ 0 }
+@@ -146,7 +146,7 @@ struct hw_interrupt_type hw_itypes[NUM_I
+ /* Initialize interrupts.  */
+ void __init mach_init_irqs (void)
+ {
+-	nb85e_intc_init_irq_types (irq_inits, hw_itypes);
++	v850e_intc_init_irq_types (irq_inits, hw_itypes);
+ }
+ 
+ 
+--- linux-2.6.0-test1/arch/v850/kernel/gbus_int.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/arch/v850/kernel/gbus_int.c	2003-07-19 17:03:49.000000000 -0700
+@@ -113,9 +113,7 @@ static irqreturn_t gbus_int_handle_irq (
+ 		/* Only pay attention to enabled interrupts.  */
+ 		status &= enable;
+ 		if (status) {
+-			unsigned base_irq
+-				= IRQ_GBUS_INT (w * GBUS_INT_BITS_PER_WORD);
+-			irq = base_irq;
++			irq = IRQ_GBUS_INT (w * GBUS_INT_BITS_PER_WORD);
+ 			do {
+ 				/* There's an active interrupt in word
+ 				   W, find out which one, and call its
+@@ -247,7 +245,7 @@ void __init gbus_int_init_irqs (void)
+ 	/* First initialize the shared gint interrupts.  */
+ 	for (i = 0; i < NUM_USED_GINTS; i++) {
+ 		unsigned gint = used_gint[i].gint;
+-		struct nb85e_intc_irq_init gint_irq_init[2];
++		struct v850e_intc_irq_init gint_irq_init[2];
+ 
+ 		/* We initialize one GINT interrupt at a time.  */
+ 		gint_irq_init[0].name = "GINT";
+@@ -258,7 +256,7 @@ void __init gbus_int_init_irqs (void)
+ 
+ 		gint_irq_init[1].name = 0; /* Terminate the vector.  */
+ 
+-		nb85e_intc_init_irq_types (gint_irq_init, gint_hw_itypes);
++		v850e_intc_init_irq_types (gint_irq_init, gint_hw_itypes);
+ 	}
+ 
+ 	/* Then the GBUS interrupts.  */
+--- linux-2.6.0-test1/arch/v850/kernel/head.S	2003-06-14 12:17:58.000000000 -0700
++++ 25/arch/v850/kernel/head.S	2003-07-19 17:03:49.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * arch/v850/kernel/head.S -- Lowest-level startup code
+  *
+- *  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
+@@ -115,7 +115,14 @@ C_ENTRY(start):
+ 	jarl	CSYM(memset), lp
+ #endif
+ 
+-	// Start Linux kernel.
++	// What happens if the main kernel function returns (it shouldn't)
+ 	mov	hilo(CSYM(machine_halt)), lp
+-	jr	CSYM(start_kernel)
++
++	// Start the linux kernel.  We use an indirect jump to get extra
++	// range, because on some platforms this initial startup code
++	// (and the associated platform-specific code in mach_early_init)
++	// are located far away from the main kernel, e.g. so that they
++	// can initialize RAM first and copy the kernel or something.
++	mov	hilo(CSYM(start_kernel)), r12
++	jmp	[r12]
+ C_END(start)
+--- linux-2.6.0-test1/arch/v850/kernel/highres_timer.c	2003-06-14 12:18:52.000000000 -0700
++++ 25/arch/v850/kernel/highres_timer.c	2003-07-19 17:03:49.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * arch/v850/kernel/highres_timer.c -- High resolution timing routines
+  *
+- *  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
+@@ -12,7 +12,7 @@
+  */
+ 
+ #include <asm/system.h>
+-#include <asm/nb85e_timer_d.h>
++#include <asm/v850e_timer_d.h>
+ #include <asm/highres_timer.h>
+ 
+ #define HIGHRES_TIMER_USEC_SHIFT   12
+@@ -42,7 +42,7 @@ void highres_timer_slow_tick_irq (void)
+ 
+ void highres_timer_reset (void)
+ {
+-	NB85E_TIMER_D_TMD (HIGHRES_TIMER_TIMER_D_UNIT) = 0;
++	V850E_TIMER_D_TMD (HIGHRES_TIMER_TIMER_D_UNIT) = 0;
+ 	HIGHRES_TIMER_SLOW_TICKS = 0;
+ }
+ 
+@@ -51,12 +51,12 @@ void highres_timer_start (void)
+ 	u32 fast_tick_rate;
+ 
+ 	/* Start hardware timer.  */
+-	nb85e_timer_d_configure (HIGHRES_TIMER_TIMER_D_UNIT,
++	v850e_timer_d_configure (HIGHRES_TIMER_TIMER_D_UNIT,
+ 				 HIGHRES_TIMER_SLOW_TICK_RATE);
+ 
+ 	fast_tick_rate =
+-		(NB85E_TIMER_D_BASE_FREQ
+-		 >> NB85E_TIMER_D_DIVLOG2 (HIGHRES_TIMER_TIMER_D_UNIT));
++		(V850E_TIMER_D_BASE_FREQ
++		 >> V850E_TIMER_D_DIVLOG2 (HIGHRES_TIMER_TIMER_D_UNIT));
+ 
+ 	/* The obvious way of calculating microseconds from fast ticks
+ 	   is to do:
+@@ -77,16 +77,16 @@ void highres_timer_start (void)
+ 
+ 	/* Enable the interrupt (which is hardwired to this use), and
+ 	   give it the highest priority.  */
+-	NB85E_INTC_IC (IRQ_INTCMD (HIGHRES_TIMER_TIMER_D_UNIT)) = 0;
++	V850E_INTC_IC (IRQ_INTCMD (HIGHRES_TIMER_TIMER_D_UNIT)) = 0;
+ }
+ 
+ void highres_timer_stop (void)
+ {
+ 	/* Stop the timer.  */
+-	NB85E_TIMER_D_TMCD (HIGHRES_TIMER_TIMER_D_UNIT) =
+-		NB85E_TIMER_D_TMCD_CAE;
++	V850E_TIMER_D_TMCD (HIGHRES_TIMER_TIMER_D_UNIT) =
++		V850E_TIMER_D_TMCD_CAE;
+ 	/* Disable its interrupt, just in case.  */
+-	nb85e_intc_disable_irq (IRQ_INTCMD (HIGHRES_TIMER_TIMER_D_UNIT));
++	v850e_intc_disable_irq (IRQ_INTCMD (HIGHRES_TIMER_TIMER_D_UNIT));
+ }
+ 
+ inline void highres_timer_read_ticks (u32 *slow_ticks, u32 *fast_ticks)
+@@ -95,9 +95,9 @@ inline void highres_timer_read_ticks (u3
+ 	u32 fast_ticks_1, fast_ticks_2, _slow_ticks;
+ 
+ 	local_irq_save (flags);
+-	fast_ticks_1 = NB85E_TIMER_D_TMD (HIGHRES_TIMER_TIMER_D_UNIT);
++	fast_ticks_1 = V850E_TIMER_D_TMD (HIGHRES_TIMER_TIMER_D_UNIT);
+ 	_slow_ticks = HIGHRES_TIMER_SLOW_TICKS;
+-	fast_ticks_2 = NB85E_TIMER_D_TMD (HIGHRES_TIMER_TIMER_D_UNIT);
++	fast_ticks_2 = V850E_TIMER_D_TMD (HIGHRES_TIMER_TIMER_D_UNIT);
+ 	local_irq_restore (flags);
+ 
+ 	if (fast_ticks_2 < fast_ticks_1)
+--- linux-2.6.0-test1/arch/v850/kernel/intv.S	2003-06-14 12:18:22.000000000 -0700
++++ 25/arch/v850/kernel/intv.S	2003-07-19 17:03:49.000000000 -0700
+@@ -16,7 +16,7 @@
+ #include <asm/machdep.h>
+ #include <asm/entry.h>
+ 
+-#ifdef CONFIG_V850E_MA1_HIGHRES_TIMER
++#ifdef CONFIG_V850E_HIGHRES_TIMER
+ #include <asm/highres_timer.h>
+ #endif
+ 
+@@ -59,7 +59,7 @@
+ 	.section	.intv.mach, "ax"
+ 	.org	0x0
+ 
+-#if defined (CONFIG_V850E_MA1_HIGHRES_TIMER) && defined (IRQ_INTCMD)
++#if defined (CONFIG_V850E_HIGHRES_TIMER) && defined (IRQ_INTCMD)
+ 
+ 	/* Interrupts before the highres timer interrupt.  */
+ 	.rept	IRQ_INTCMD (HIGHRES_TIMER_TIMER_D_UNIT)
+--- linux-2.6.0-test1/arch/v850/kernel/ma.c	2003-06-14 12:17:58.000000000 -0700
++++ 25/arch/v850/kernel/ma.c	2003-07-19 17:03:49.000000000 -0700
+@@ -22,19 +22,19 @@
+ #include <asm/atomic.h>
+ #include <asm/page.h>
+ #include <asm/machdep.h>
+-#include <asm/nb85e_timer_d.h>
++#include <asm/v850e_timer_d.h>
+ 
+ #include "mach.h"
+ 
+ void __init mach_sched_init (struct irqaction *timer_action)
+ {
+ 	/* Start hardware timer.  */
+-	nb85e_timer_d_configure (0, HZ);
++	v850e_timer_d_configure (0, HZ);
+ 	/* Install timer interrupt handler.  */
+ 	setup_irq (IRQ_INTCMD(0), timer_action);
+ }
+ 
+-static struct nb85e_intc_irq_init irq_inits[] = {
++static struct v850e_intc_irq_init irq_inits[] = {
+ 	{ "IRQ", 0, 		NUM_MACH_IRQS,	1, 7 },
+ 	{ "CMD", IRQ_INTCMD(0), IRQ_INTCMD_NUM,	1, 5 },
+ 	{ "DMA", IRQ_INTDMA(0), IRQ_INTDMA_NUM,	1, 2 },
+@@ -51,7 +51,7 @@ static struct hw_interrupt_type hw_itype
+ /* Initialize MA chip interrupts.  */
+ void __init ma_init_irqs (void)
+ {
+-	nb85e_intc_init_irq_types (irq_inits, hw_itypes);
++	v850e_intc_init_irq_types (irq_inits, hw_itypes);
+ }
+ 
+ /* Called before configuring an on-chip UART.  */
+--- linux-2.6.0-test1/arch/v850/kernel/Makefile	2003-06-14 12:18:51.000000000 -0700
++++ 25/arch/v850/kernel/Makefile	2003-07-19 17:03:49.000000000 -0700
+@@ -15,24 +15,26 @@ obj-y += intv.o entry.o process.o syscal
+ 	 signal.o irq.o mach.o ptrace.o bug.o
+ obj-$(CONFIG_MODULES)		+= module.o v850_ksyms.o
+ # chip-specific code
+-obj-$(CONFIG_V850E_NB85E)	+= nb85e_intc.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
++obj-$(CONFIG_V850E_MA1)		+= ma.o
++obj-$(CONFIG_V850E_ME2)		+= me2.o
++obj-$(CONFIG_V850E_TEG)		+= teg.o
++obj-$(CONFIG_V850E_AS85EP1)	+= as85ep1.o
++obj-$(CONFIG_V850E2_ANNA)	+= anna.o
+ # platform-specific code
+ obj-$(CONFIG_V850E_SIM)		+= sim.o simcons.o
+-obj-$(CONFIG_V850E2_SIM85E2C)	+= sim85e2c.o nb85e_intc.o memcons.o
+-obj-$(CONFIG_V850E2_FPGA85E2C)	+= fpga85e2c.o nb85e_intc.o memcons.o
++obj-$(CONFIG_V850E2_SIM85E2)	+= sim85e2.o memcons.o
++obj-$(CONFIG_V850E2_FPGA85E2C)	+= fpga85e2c.o memcons.o
+ obj-$(CONFIG_RTE_CB)		+= rte_cb.o rte_cb_leds.o
+ obj-$(CONFIG_RTE_CB_MA1)	+= rte_ma1_cb.o
++obj-$(CONFIG_RTE_CB_ME2)	+= rte_me2_cb.o
+ obj-$(CONFIG_RTE_CB_NB85E)	+= rte_nb85e_cb.o
+ obj-$(CONFIG_RTE_CB_MULTI)	+= rte_cb_multi.o
+ obj-$(CONFIG_RTE_MB_A_PCI)	+= rte_mb_a_pci.o
+ obj-$(CONFIG_RTE_GBUS_INT)	+= gbus_int.o
+ # feature-specific code
+-obj-$(CONFIG_V850E_MA1_HIGHRES_TIMER)	+= highres_timer.o
++obj-$(CONFIG_V850E_INTC)	+= v850e_intc.o
++obj-$(CONFIG_V850E_TIMER_D)	+= v850e_timer_d.o v850e_utils.o
++obj-$(CONFIG_V850E_CACHE)	+= v850e_cache.o
++obj-$(CONFIG_V850E2_CACHE)	+= v850e2_cache.o
++obj-$(CONFIG_V850E_HIGHRES_TIMER) += highres_timer.o
+ obj-$(CONFIG_PROC_FS)		+= procfs.o
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/kernel/me2.c	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,74 @@
++/*
++ * arch/v850/kernel/me2.c -- V850E/ME2 chip-specific support
++ *
++ *  Copyright (C) 2003  NEC 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 <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/v850e_timer_d.h>
++
++#include "mach.h"
++
++void __init mach_sched_init (struct irqaction *timer_action)
++{
++	/* Start hardware timer.  */
++	v850e_timer_d_configure (0, HZ);
++	/* Install timer interrupt handler.  */
++	setup_irq (IRQ_INTCMD(0), timer_action);
++}
++
++static struct v850e_intc_irq_init irq_inits[] = {
++	{ "IRQ",    0,                NUM_CPU_IRQS,      1, 7 },
++	{ "INTP",   IRQ_INTP(0),      IRQ_INTP_NUM,      1, 5 },
++	{ "CMD",    IRQ_INTCMD(0),    IRQ_INTCMD_NUM,    1, 3 },
++	{ "UBTIRE", IRQ_INTUBTIRE(0), IRQ_INTUBTIRE_NUM, 5, 4 },
++	{ "UBTIR",  IRQ_INTUBTIR(0),  IRQ_INTUBTIR_NUM,  5, 4 },
++	{ "UBTIT",  IRQ_INTUBTIT(0),  IRQ_INTUBTIT_NUM,  5, 4 },
++	{ "UBTIF",  IRQ_INTUBTIF(0),  IRQ_INTUBTIF_NUM,  5, 4 },
++	{ "UBTITO", IRQ_INTUBTITO(0), IRQ_INTUBTITO_NUM, 5, 4 },
++	{ 0 }
++};
++#define NUM_IRQ_INITS ((sizeof irq_inits / sizeof irq_inits[0]) - 1)
++
++static struct hw_interrupt_type hw_itypes[NUM_IRQ_INITS];
++
++/* Initialize V850E/ME2 chip interrupts.  */
++void __init me2_init_irqs (void)
++{
++	v850e_intc_init_irq_types (irq_inits, hw_itypes);
++}
++
++/* Called before configuring an on-chip UART.  */
++void me2_uart_pre_configure (unsigned chan, unsigned cflags, unsigned baud)
++{
++	if (chan == 0) {
++		/* Specify that the relevent pins on the chip should do
++		   serial I/O, not direct I/O.  */
++		ME2_PORT1_PMC |= 0xC;
++		/* Specify that we're using the UART, not the CSI device. */
++		ME2_PORT1_PFC |= 0xC;
++	} else if (chan == 1) {
++		/* Specify that the relevent pins on the chip should do
++		   serial I/O, not direct I/O.  */
++		ME2_PORT2_PMC |= 0x6;
++		/* Specify that we're using the UART, not the CSI device. */
++		ME2_PORT2_PFC |= 0x6;
++	}
++}
+--- linux-2.6.0-test1/arch/v850/kernel/nb85e_cache.c	2003-06-14 12:18:25.000000000 -0700
++++ /dev/null	2002-08-30 16:31:37.000000000 -0700
+@@ -1,178 +0,0 @@
+-/*
+- * 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 ();
+-}
+--- linux-2.6.0-test1/arch/v850/kernel/nb85e_intc.c	2003-06-14 12:18:06.000000000 -0700
++++ /dev/null	2002-08-30 16:31:37.000000000 -0700
+@@ -1,104 +0,0 @@
+-/*
+- * arch/v850/kernel/nb85e_intc.c -- NB85E cpu core interrupt controller (INTC)
+- *
+- *  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/kernel.h>
+-#include <linux/init.h>
+-#include <linux/irq.h>
+-
+-#include <asm/nb85e_intc.h>
+-
+-static void irq_nop (unsigned irq) { }
+-
+-static unsigned nb85e_intc_irq_startup (unsigned irq)
+-{
+-	nb85e_intc_clear_pending_irq (irq);
+-	nb85e_intc_enable_irq (irq);
+-	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,
+-				       struct hw_interrupt_type *hw_irq_types)
+-{
+-	struct nb85e_intc_irq_init *init;
+-	for (init = inits; init->name; init++) {
+-		unsigned i;
+-		struct hw_interrupt_type *hwit = hw_irq_types++;
+-
+-		hwit->typename = init->name;
+-
+-		hwit->startup  = nb85e_intc_irq_startup;
+-		hwit->shutdown = nb85e_intc_disable_irq;
+-		hwit->enable   = nb85e_intc_enable_irq;
+-		hwit->disable  = nb85e_intc_disable_irq;
+-		hwit->ack      = 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);
+-
+-		/* Set the interrupt priorities.  */
+-		for (i = 0; i < init->num; i++) {
+-			unsigned irq = init->base + i * init->interval;
+-
+-			/* If the interrupt is currently enabled (all
+-			   interrupts are initially disabled), then
+-			   assume whoever enabled it has set things up
+-			   properly, and avoid messing with it.  */
+-			if (! nb85e_intc_irq_enabled (irq))
+-				/* This write also (1) disables the
+-				   interrupt, and (2) clears any pending
+-				   interrupts.  */
+-				NB85E_INTC_IC (irq)
+-					= (NB85E_INTC_IC_PR (init->priority)
+-					   | NB85E_INTC_IC_MK);
+-		}
+-	}
+-}
+--- linux-2.6.0-test1/arch/v850/kernel/nb85e_timer_d.c	2003-06-14 12:18:21.000000000 -0700
++++ /dev/null	2002-08-30 16:31:37.000000000 -0700
+@@ -1,54 +0,0 @@
+-/*
+- * include/asm-v850/nb85e_timer_d.c -- `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>
+- *
+- * 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/kernel.h>
+-
+-#include <asm/nb85e_utils.h>
+-#include <asm/nb85e_timer_d.h>
+-
+-/* Start interval timer TIMER (0-3).  The timer will issue the
+-   corresponding INTCMD interrupt RATE times per second.
+-   This function does not enable the interrupt.  */
+-void nb85e_timer_d_configure (unsigned timer, unsigned rate)
+-{
+-	unsigned divlog2, count;
+-
+-	/* Calculate params for timer.  */
+-	if (! calc_counter_params (
+-		    NB85E_TIMER_D_BASE_FREQ, rate,
+-		    NB85E_TIMER_D_TMCD_CS_MIN, NB85E_TIMER_D_TMCD_CS_MAX, 16,
+-		    &divlog2, &count))
+-		printk (KERN_WARNING
+-			"Cannot find interval timer %d setting suitable"
+-			" for rate of %dHz.\n"
+-			"Using rate of %dHz instead.\n",
+-			timer, rate,
+-			(NB85E_TIMER_D_BASE_FREQ >> divlog2) >> 16);
+-
+-	/* Do the actual hardware timer initialization:  */
+-
+-	/* Enable timer.  */
+-	NB85E_TIMER_D_TMCD(timer) = NB85E_TIMER_D_TMCD_CAE;
+-	/* Set clock divider.  */
+-	NB85E_TIMER_D_TMCD(timer)
+-		= NB85E_TIMER_D_TMCD_CAE
+-		| NB85E_TIMER_D_TMCD_CS(divlog2);
+-	/* Set timer compare register.  */
+-	NB85E_TIMER_D_CMD(timer) = count;
+-	/* Start counting.  */
+-	NB85E_TIMER_D_TMCD(timer)
+-		= NB85E_TIMER_D_TMCD_CAE
+-		| NB85E_TIMER_D_TMCD_CS(divlog2)
+-		| NB85E_TIMER_D_TMCD_CE;
+-}
+--- linux-2.6.0-test1/arch/v850/kernel/nb85e_utils.c	2003-06-14 12:17:59.000000000 -0700
++++ /dev/null	2002-08-30 16:31:37.000000000 -0700
+@@ -1,65 +0,0 @@
+-/*
+- * include/asm-v850/nb85e_utils.h -- Utility functions associated with
+- *	the NB85E cpu core
+- *
+- *  Copyright (C) 2001,02  NEC Corporation
+- *  Copyright (C) 2001,02  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>
+- */
+-
+-/* Note: these functions are often associated with the N85E cpu core,
+-   but not always, which is why they're not in `nb85e.c'.  */
+-
+-#include <asm/nb85e_utils.h>
+-
+-/* Calculate counter clock-divider and count values to attain the
+-   desired frequency RATE from the base frequency BASE_FREQ.  The
+-   counter is expected to have a clock-divider, which can divide the
+-   system cpu clock by a power of two value from MIN_DIVLOG2 to
+-   MAX_DIV_LOG2, and a word-size of COUNTER_SIZE bits (the counter
+-   counts up and resets whenever it's equal to the compare register,
+-   generating an interrupt or whatever when it does so).  The returned
+-   values are: *DIVLOG2 -- log2 of the desired clock divider and *COUNT
+-   -- the counter compare value to use.  Returns true if it was possible
+-   to find a reasonable value, otherwise false (and the other return
+-   values will be set to be as good as possible).  */
+-int calc_counter_params (unsigned long base_freq,
+-			 unsigned long rate,
+-			 unsigned min_divlog2, unsigned max_divlog2,
+-			 unsigned counter_size,
+-			 unsigned *divlog2, unsigned *count)
+-{
+-	unsigned _divlog2;
+-	int ok = 0;
+-
+-	/* Find the lowest clock divider setting that can represent RATE.  */
+-	for (_divlog2 = min_divlog2; _divlog2 <= max_divlog2; _divlog2++) {
+-		/* Minimum interrupt rate possible using this divider.  */
+-		unsigned min_int_rate
+-			= (base_freq >> _divlog2) >> counter_size;
+-
+-		if (min_int_rate <= rate) {
+-			/* This setting is the highest resolution
+-			   setting that's slow enough enough to attain
+-			   RATE interrupts per second, so use it.  */
+-			ok = 1;
+-			break;
+-		}
+-	}
+-
+-	if (_divlog2 > max_divlog2)
+-		/* Can't find correct setting.  */
+-		_divlog2 = max_divlog2;
+-
+-	if (divlog2)
+-		*divlog2 = _divlog2;
+-	if (count)
+-		*count = ((base_freq >> _divlog2) + rate/2) / rate;
+-
+-	return ok;
+-}
+--- linux-2.6.0-test1/arch/v850/kernel/rte_cb.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/arch/v850/kernel/rte_cb.c	2003-07-19 17:03:49.000000000 -0700
+@@ -17,7 +17,7 @@
+ #include <linux/fs.h>
+ 
+ #include <asm/machdep.h>
+-#include <asm/nb85e_uart.h>
++#include <asm/v850e_uart.h>
+ 
+ #include "mach.h"
+ 
+@@ -34,7 +34,7 @@ extern void multi_init (void);
+ 
+ void __init rte_cb_early_init (void)
+ {
+-	nb85e_intc_disable_irqs ();
++	v850e_intc_disable_irqs ();
+ 
+ #ifdef CONFIG_RTE_CB_MULTI
+ 	multi_init ();
+@@ -43,6 +43,7 @@ void __init rte_cb_early_init (void)
+ 
+ void __init mach_setup (char **cmdline)
+ {
++#ifdef CONFIG_RTE_MB_A_PCI
+ 	/* Probe for Mother-A, and print a message if we find it.  */
+ 	*(volatile unsigned long *)MB_A_SRAM_ADDR = 0xDEADBEEF;
+ 	if (*(volatile unsigned long *)MB_A_SRAM_ADDR == 0xDEADBEEF) {
+@@ -52,23 +53,11 @@ void __init mach_setup (char **cmdline)
+ 				"          NEC SolutionGear/Midas lab"
+ 				" RTE-MOTHER-A motherboard\n");
+ 	}
+-
+-#if defined (CONFIG_V850E_NB85E_UART_CONSOLE) && !defined (CONFIG_TIME_BOOTUP)
+-	nb85e_uart_cons_init (0);
+-#endif
++#endif /* CONFIG_RTE_MB_A_PCI */
+ 
+ 	mach_tick = led_tick;
+ }
+ 
+-#ifdef CONFIG_TIME_BOOTUP
+-void initial_boot_done (void)
+-{
+-#ifdef CONFIG_V850E_NB85E_UART_CONSOLE
+-	nb85e_uart_cons_init (0);
+-#endif
+-}
+-#endif
+-
+ void machine_restart (char *__unused)
+ {
+ #ifdef CONFIG_RESET_GUARD
+@@ -194,6 +183,7 @@ static struct hw_interrupt_type gbus_hw_
+ 
+ #endif /* CONFIG_RTE_GBUS_INT */
+ 
++
+ void __init rte_cb_init_irqs (void)
+ {
+ #ifdef CONFIG_RTE_GBUS_INT
+--- linux-2.6.0-test1/arch/v850/kernel/rte_ma1_cb.c	2003-06-14 12:18:30.000000000 -0700
++++ 25/arch/v850/kernel/rte_ma1_cb.c	2003-07-19 17:03:49.000000000 -0700
+@@ -20,7 +20,7 @@
+ #include <asm/page.h>
+ #include <asm/ma1.h>
+ #include <asm/rte_ma1_cb.h>
+-#include <asm/nb85e_timer_c.h>
++#include <asm/v850e_timer_c.h>
+ 
+ #include "mach.h"
+ 
+@@ -89,14 +89,14 @@ void __init mach_init_irqs (void)
+ 	rte_cb_init_irqs ();
+ 
+ 	/* Use falling-edge-sensitivity for interrupts .  */
+-	NB85E_TIMER_C_SESC (0) &= ~0xC;
+-	NB85E_TIMER_C_SESC (1) &= ~0xF;
++	V850E_TIMER_C_SESC (0) &= ~0xC;
++	V850E_TIMER_C_SESC (1) &= ~0xF;
+ 
+ 	/* INTP000-INTP011 are shared with `Timer C', so we have to set
+ 	   up Timer C to pass them through as raw interrupts.  */
+ 	for (tc = 0; tc < 2; tc++)
+ 		/* Turn on the timer.  */
+-		NB85E_TIMER_C_TMCC0 (tc) |= NB85E_TIMER_C_TMCC0_CAE;
++		V850E_TIMER_C_TMCC0 (tc) |= V850E_TIMER_C_TMCC0_CAE;
+ 
+ 	/* Make sure the relevant port0/port1 pins are assigned
+ 	   interrupt duty.  We used INTP001-INTP011 (don't screw with
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/kernel/rte_me2_cb.c	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,308 @@
++/*
++ * arch/v850/kernel/rte_me2_cb.c -- Midas labs RTE-V850E/ME2-CB board
++ *
++ *  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/bootmem.h>
++#include <linux/irq.h>
++#include <linux/fs.h>
++#include <linux/major.h>
++#include <linux/sched.h>
++#include <linux/delay.h>
++
++#include <asm/atomic.h>
++#include <asm/page.h>
++#include <asm/me2.h>
++#include <asm/rte_me2_cb.h>
++#include <asm/machdep.h>
++#include <asm/v850e_intc.h>
++#include <asm/v850e_cache.h>
++#include <asm/irq.h>
++
++#include "mach.h"
++
++extern unsigned long *_intv_start;
++extern unsigned long *_intv_end;
++
++/* LED access routines.  */
++extern unsigned read_leds (int pos, char *buf, int len);
++extern unsigned write_leds (int pos, const char *buf, int len);
++
++
++/* SDRAM are almost contiguous (with a small hole in between;
++   see mach_reserve_bootmem for details), so just use both as one big area.  */
++#define RAM_START 	SDRAM_ADDR
++#define RAM_END		(SDRAM_ADDR + SDRAM_SIZE)
++
++
++void __init mach_get_physical_ram (unsigned long *ram_start,
++				   unsigned long *ram_len)
++{
++	*ram_start = RAM_START;
++	*ram_len = RAM_END - RAM_START;
++}
++
++void __init mach_reserve_bootmem ()
++{
++	extern char _root_fs_image_start, _root_fs_image_end;
++	u32 root_fs_image_start = (u32)&_root_fs_image_start;
++	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)
++		reserve_bootmem (root_fs_image_start,
++				 root_fs_image_end - root_fs_image_start);
++}
++
++void mach_gettimeofday (struct timespec *tv)
++{
++	tv->tv_sec = 0;
++	tv->tv_nsec = 0;
++}
++
++/* Called before configuring an on-chip UART.  */
++void rte_me2_cb_uart_pre_configure (unsigned chan,
++				    unsigned cflags, unsigned baud)
++{
++	/* The RTE-V850E/ME2-CB connects some general-purpose I/O
++	   pins on the CPU to the RTS/CTS lines of UARTB channel 0's
++	   serial connection.
++	   I/O pins P21 and P22 are RTS and CTS respectively.  */
++	if (chan == 0) {
++		/* Put P21 & P22 in I/O port mode.  */
++		ME2_PORT2_PMC &= ~0x6;
++		/* Make P21 and output, and P22 an input.  */
++		ME2_PORT2_PM = (ME2_PORT2_PM & ~0xC) | 0x4;
++	}
++
++	me2_uart_pre_configure (chan, cflags, baud);
++}
++
++void __init mach_init_irqs (void)
++{
++	/* Initialize interrupts.  */
++	me2_init_irqs ();
++	rte_me2_cb_init_irqs ();
++}
++
++#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 */
++
++static void install_interrupt_vectors (void)
++{
++	unsigned long *p1, *p2;
++
++	ME2_IRAMM = 0x03; /* V850E/ME2 iRAM write mode */
++
++	/* vector copy to iRAM */
++	p1 = (unsigned long *)0; /* v85x vector start */
++	p2 = (unsigned long *)&_intv_start;
++	while (p2 < (unsigned long *)&_intv_end)
++		*p1++ = *p2++;
++
++	ME2_IRAMM = 0x00; /* V850E/ME2 iRAM read mode */
++}
++
++/* CompactFlash */
++
++static void cf_power_on (void)
++{
++	/* CF card detected? */
++	if (CB_CF_STS0 & 0x0030)
++		return;
++
++	CB_CF_REG0 = 0x0002; /* reest on */
++	mdelay (10);
++	CB_CF_REG0 = 0x0003; /* power on */
++	mdelay (10);
++	CB_CF_REG0 = 0x0001; /* reset off */
++	mdelay (10);
++}
++
++static void cf_power_off (void)
++{
++	CB_CF_REG0 = 0x0003; /* power on */
++	mdelay (10);
++	CB_CF_REG0 = 0x0002; /* reest on */
++	mdelay (10);
++}
++
++void __init mach_early_init (void)
++{
++	install_interrupt_vectors ();
++
++	/* CS1 SDRAM instruction cache enable */
++	v850e_cache_enable (0x04, 0x03, 0);
++
++	rte_cb_early_init ();
++
++	/* CompactFlash power on */
++	cf_power_on ();
++
++#if defined (CONFIG_ROM_KERNEL)
++	rom_kernel_init ();
++#endif
++}
++
++
++/* RTE-V850E/ME2-CB Programmable Interrupt Controller.  */
++
++static struct cb_pic_irq_init cb_pic_irq_inits[] = {
++	{ "CB_EXTTM0",       IRQ_CB_EXTTM0,       1, 1, 6 },
++	{ "CB_EXTSIO",       IRQ_CB_EXTSIO,       1, 1, 6 },
++	{ "CB_TOVER",        IRQ_CB_TOVER,        1, 1, 6 },
++	{ "CB_GINT0",        IRQ_CB_GINT0,        1, 1, 6 },
++	{ "CB_USB",          IRQ_CB_USB,          1, 1, 6 },
++	{ "CB_LANC",         IRQ_CB_LANC,         1, 1, 6 },
++	{ "CB_USB_VBUS_ON",  IRQ_CB_USB_VBUS_ON,  1, 1, 6 },
++	{ "CB_USB_VBUS_OFF", IRQ_CB_USB_VBUS_OFF, 1, 1, 6 },
++	{ "CB_EXTTM1",       IRQ_CB_EXTTM1,       1, 1, 6 },
++	{ "CB_EXTTM2",       IRQ_CB_EXTTM2,       1, 1, 6 },
++	{ 0 }
++};
++#define NUM_CB_PIC_IRQ_INITS  \
++   ((sizeof cb_pic_irq_inits / sizeof cb_pic_irq_inits[0]) - 1)
++
++static struct hw_interrupt_type cb_pic_hw_itypes[NUM_CB_PIC_IRQ_INITS];
++static unsigned char cb_pic_active_irqs = 0;
++
++void __init rte_me2_cb_init_irqs (void)
++{
++	cb_pic_init_irq_types (cb_pic_irq_inits, cb_pic_hw_itypes);
++
++	/* Initalize on board PIC1 (not PIC0) enable */
++	CB_PIC_INT0M  = 0x0000;
++	CB_PIC_INT1M  = 0x0000;
++	CB_PIC_INTR   = 0x0000;
++	CB_PIC_INTEN |= CB_PIC_INT1EN;
++
++	ME2_PORT2_PMC 	 |= 0x08;	/* INTP23/SCK1 mode */
++	ME2_PORT2_PFC 	 &= ~0x08;	/* INTP23 mode */
++	ME2_INTR(2) 	 &= ~0x08;	/* INTP23 falling-edge detect */
++	ME2_INTF(2) 	 &= ~0x08;	/*   " */
++
++	rte_cb_init_irqs ();	/* gbus &c */
++}
++
++
++/* Enable interrupt handling for interrupt IRQ.  */
++void cb_pic_enable_irq (unsigned irq)
++{
++	CB_PIC_INT1M |= 1 << (irq - CB_PIC_BASE_IRQ);
++}
++
++void cb_pic_disable_irq (unsigned irq)
++{
++	CB_PIC_INT1M &= ~(1 << (irq - CB_PIC_BASE_IRQ));
++}
++
++void cb_pic_shutdown_irq (unsigned irq)
++{
++	cb_pic_disable_irq (irq);
++
++	if (--cb_pic_active_irqs == 0)
++		free_irq (IRQ_CB_PIC, 0);
++
++	CB_PIC_INT1M &= ~(1 << (irq - CB_PIC_BASE_IRQ));
++}
++
++static void cb_pic_handle_irq (int irq, void *dev_id, struct pt_regs *regs)
++{
++	unsigned status = CB_PIC_INTR;
++	unsigned enable = CB_PIC_INT1M;
++
++	/* Only pay attention to enabled interrupts.  */
++	status &= enable;
++
++	CB_PIC_INTEN &= ~CB_PIC_INT1EN;
++
++	if (status) {
++		unsigned mask = 1;
++
++		irq = CB_PIC_BASE_IRQ;
++		do {
++			/* There's an active interrupt, find out which one,
++			   and call its handler.  */
++			while (! (status & mask)) {
++				irq++;
++				mask <<= 1;
++			}
++			status &= ~mask;
++
++			CB_PIC_INTR = mask;
++
++			/* Recursively call handle_irq to handle it. */
++			handle_irq (irq, regs);
++		} while (status);
++	}
++
++	CB_PIC_INTEN |= CB_PIC_INT1EN;
++}
++
++
++static void irq_nop (unsigned irq) { }
++
++static unsigned cb_pic_startup_irq (unsigned irq)
++{
++	int rval;
++
++	if (cb_pic_active_irqs == 0) {
++		rval = request_irq (IRQ_CB_PIC, cb_pic_handle_irq,
++				    SA_INTERRUPT, "cb_pic_handler", 0);
++		if (rval != 0)
++			return rval;
++	}
++
++	cb_pic_active_irqs++;
++
++	cb_pic_enable_irq (irq);
++
++	return 0;
++}
++
++/* 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 cb_pic_init_irq_types (struct cb_pic_irq_init *inits,
++				   struct hw_interrupt_type *hw_irq_types)
++{
++	struct cb_pic_irq_init *init;
++	for (init = inits; init->name; init++) {
++		struct hw_interrupt_type *hwit = hw_irq_types++;
++
++		hwit->typename = init->name;
++
++		hwit->startup  = cb_pic_startup_irq;
++		hwit->shutdown = cb_pic_shutdown_irq;
++		hwit->enable   = cb_pic_enable_irq;
++		hwit->disable  = cb_pic_disable_irq;
++		hwit->ack      = irq_nop;
++		hwit->end      = irq_nop;
++
++		/* Initialize kernel IRQ infrastructure for this interrupt.  */
++		init_irq_handlers(init->base, init->num, init->interval, hwit);
++	}
++}
+--- linux-2.6.0-test1/arch/v850/kernel/rte_nb85e_cb.c	2003-06-14 12:18:34.000000000 -0700
++++ 25/arch/v850/kernel/rte_nb85e_cb.c	2003-07-19 17:03:49.000000000 -0700
+@@ -21,7 +21,7 @@
+ 
+ #include <asm/atomic.h>
+ #include <asm/page.h>
+-#include <asm/nb85e.h>
++#include <asm/v850e.h>
+ #include <asm/rte_nb85e_cb.h>
+ 
+ #include "mach.h"
+@@ -41,7 +41,7 @@ void __init mach_early_init (void)
+ 
+ 	   Unfortunately, the dcache seems to be buggy, so we only use the
+ 	   icache for now.  */
+-	nb85e_cache_enable (0x0040 /* BHC */, 0x0000 /* DCC */);
++	v850e_cache_enable (0x0040 /*BHC*/, 0x0003 /*ICC*/, 0x0000 /*DCC*/);
+ 
+ 	rte_cb_early_init ();
+ }
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/kernel/sim85e2.c	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,211 @@
++/*
++ * arch/v850/kernel/sim85e2.c -- Machine-specific stuff for
++ *	V850E2 RTL simulator
++ *
++ *  Copyright (C) 2002,03  NEC Electronics Corporation
++ *  Copyright (C) 2002,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 "mach.h"
++
++
++/* There are 4 possible areas we can use:
++
++     IRAM (1MB) is fast for instruction fetches, but slow for data
++     DRAM (1020KB) is fast for data, but slow for instructions
++     ERAM is cached, so should be fast for both insns and data
++     SDRAM is external DRAM, similar to ERAM
++*/
++
++#define INIT_MEMC_FOR_SDRAM
++#define USE_SDRAM_AREA
++#define KERNEL_IN_SDRAM_AREA
++
++#define DCACHE_MODE	V850E2_CACHE_BTSC_DCM_WT
++/*#define DCACHE_MODE	V850E2_CACHE_BTSC_DCM_WB_ALLOC*/
++
++#ifdef USE_SDRAM_AREA
++#define RAM_START 	SDRAM_ADDR
++#define RAM_END		(SDRAM_ADDR + SDRAM_SIZE)
++#else
++/* When we use DRAM, we need to account for the fact that the end of it is
++   used for R0_RAM.  */
++#define RAM_START	DRAM_ADDR
++#define RAM_END		R0_RAM_ADDR
++#endif
++
++
++extern void memcons_setup (void);
++
++
++#ifdef KERNEL_IN_SDRAM_AREA
++#define EARLY_INIT_SECTION_ATTR __attribute__ ((section (".early.text")))
++#else
++#define EARLY_INIT_SECTION_ATTR __init
++#endif
++
++void EARLY_INIT_SECTION_ATTR mach_early_init (void)
++{
++	extern int panic_timeout;
++
++	/* The sim85e2 simulator tracks `undefined' values, so to make
++	   debugging easier, we begin by zeroing out all otherwise
++	   undefined registers.  This is not strictly necessary.
++
++	   The registers we zero are:
++	       Every GPR except:
++	           stack-pointer (r3)
++		   task-pointer (r16)
++		   our return addr (r31)
++	       Every system register (SPR) that we know about except for
++	       the PSW (SPR 5), which we zero except for the
++	       disable-interrupts bit.
++	*/
++
++	/* GPRs */
++	asm volatile ("             mov r0, r1 ; mov r0, r2              ");
++	asm volatile ("mov r0, r4 ; mov r0, r5 ; mov r0, r6 ; mov r0, r7 ");
++	asm volatile ("mov r0, r8 ; mov r0, r9 ; mov r0, r10; mov r0, r11");
++	asm volatile ("mov r0, r12; mov r0, r13; mov r0, r14; mov r0, r15");
++	asm volatile ("             mov r0, r17; mov r0, r18; mov r0, r19");
++	asm volatile ("mov r0, r20; mov r0, r21; mov r0, r22; mov r0, r23");
++	asm volatile ("mov r0, r24; mov r0, r25; mov r0, r26; mov r0, r27");
++	asm volatile ("mov r0, r28; mov r0, r29; mov r0, r30");
++
++	/* SPRs */
++	asm volatile ("ldsr r0, 0;  ldsr r0, 1;  ldsr r0, 2;  ldsr r0, 3");
++	asm volatile ("ldsr r0, 4");
++	asm volatile ("addi 0x20, r0, r1; ldsr r1, 5"); /* PSW */
++	asm volatile ("ldsr r0, 16; ldsr r0, 17; ldsr r0, 18; ldsr r0, 19");
++	asm volatile ("ldsr r0, 20");
++
++
++#ifdef INIT_MEMC_FOR_SDRAM
++	/* Settings for SDRAM controller.  */
++	V850E2_VSWC   = 0x0042;
++	V850E2_BSC    = 0x9286;
++	V850E2_BCT(0) = 0xb000;	/* was: 0 */
++	V850E2_BCT(1) = 0x000b;
++	V850E2_ASC    = 0;
++	V850E2_LBS    = 0xa9aa;	/* was: 0xaaaa */
++	V850E2_LBC(0) = 0;
++	V850E2_LBC(1) = 0;	/* was: 0x3 */
++	V850E2_BCC    = 0;
++	V850E2_RFS(4) = 0x800a;	/* was: 0xf109 */
++	V850E2_SCR(4) = 0x2091;	/* was: 0x20a1 */
++	V850E2_RFS(3) = 0x800c;
++	V850E2_SCR(3) = 0x20a1;
++	V850E2_DWC(0) = 0;
++	V850E2_DWC(1) = 0;
++#endif
++
++#if 0
++#ifdef CONFIG_V850E2_SIM85E2S
++	/* Turn on the caches.  */
++	V850E2_CACHE_BTSC = V850E2_CACHE_BTSC_ICM | DCACHE_MODE;
++	V850E2_BHC  = 0x1010;
++#elif CONFIG_V850E2_SIM85E2C
++	V850E2_CACHE_BTSC |= (V850E2_CACHE_BTSC_ICM | V850E2_CACHE_BTSC_DCM0);
++	V850E2_BUSM_BHC = 0xFFFF;
++#endif
++#else
++	V850E2_BHC  = 0;
++#endif
++
++	/* Don't stop the simulator at `halt' instructions.  */
++	SIM85E2_NOTHAL = 1;
++
++	/* Ensure that the simulator halts on a panic, instead of going
++	   into an infinite loop inside the panic function.  */
++	panic_timeout = -1;
++}
++
++void __init mach_setup (char **cmdline)
++{
++	memcons_setup ();
++}
++
++void mach_get_physical_ram (unsigned long *ram_start, unsigned long *ram_len)
++{
++	*ram_start = RAM_START;
++	*ram_len = RAM_END - RAM_START;
++}
++
++void __init mach_reserve_bootmem ()
++{
++	extern char _root_fs_image_start, _root_fs_image_end;
++	u32 root_fs_image_start = (u32)&_root_fs_image_start;
++	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_end > root_fs_image_start
++	    && root_fs_image_start >= RAM_START
++	    && root_fs_image_start < RAM_END)
++		reserve_bootmem (root_fs_image_start,
++				 root_fs_image_end - root_fs_image_start);
++}
++
++void __init mach_sched_init (struct irqaction *timer_action)
++{
++	/* The simulator actually cycles through all interrupts
++	   periodically.  We just pay attention to IRQ0, which gives us
++	   1/64 the rate of the periodic interrupts.  */
++	setup_irq (0, timer_action);
++}
++
++void mach_gettimeofday (struct timespec *tv)
++{
++	tv->tv_sec = 0;
++	tv->tv_nsec = 0;
++}
++
++/* Interrupts */
++
++struct v850e_intc_irq_init irq_inits[] = {
++	{ "IRQ", 0, NUM_MACH_IRQS, 1, 7 },
++	{ 0 }
++};
++struct hw_interrupt_type hw_itypes[1];
++
++/* Initialize interrupts.  */
++void __init mach_init_irqs (void)
++{
++	v850e_intc_init_irq_types (irq_inits, hw_itypes);
++}
++
++
++void machine_halt (void) __attribute__ ((noreturn));
++void machine_halt (void)
++{
++	SIM85E2_SIMFIN = 0;	/* Halt immediately.  */
++	for (;;) {}
++}
++
++void machine_restart (char *__unused)
++{
++	machine_halt ();
++}
++
++void machine_power_off (void)
++{
++	machine_halt ();
++}
+--- linux-2.6.0-test1/arch/v850/kernel/sim85e2c.c	2003-06-14 12:18:22.000000000 -0700
++++ /dev/null	2002-08-30 16:31:37.000000000 -0700
+@@ -1,145 +0,0 @@
+-/*
+- * arch/v850/kernel/sim85e2c.c -- Machine-specific stuff for
+- *	V850E2 RTL simulator
+- *
+- *  Copyright (C) 2002  NEC Corporation
+- *  Copyright (C) 2002  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 "mach.h"
+-
+-extern void memcons_setup (void);
+-
+-
+-void __init mach_early_init (void)
+-{
+-	extern int panic_timeout;
+-
+-	/* Don't stop the simulator at `halt' instructions.  */
+-	NOTHAL = 1;
+-
+-	/* The sim85e2c simulator tracks `undefined' values, so to make
+-	   debugging easier, we begin by zeroing out all otherwise
+-	   undefined registers.  This is not strictly necessary.
+-
+-	   The registers we zero are:
+-	       Every GPR except:
+-	           stack-pointer (r3)
+-		   task-pointer (r16)
+-		   our return addr (r31)
+-	       Every system register (SPR) that we know about except for
+-	       the PSW (SPR 5), which we zero except for the
+-	       disable-interrupts bit.
+-	*/
+-
+-	/* GPRs */
+-	asm volatile ("             mov r0, r1 ; mov r0, r2              ");
+-	asm volatile ("mov r0, r4 ; mov r0, r5 ; mov r0, r6 ; mov r0, r7 ");
+-	asm volatile ("mov r0, r8 ; mov r0, r9 ; mov r0, r10; mov r0, r11");
+-	asm volatile ("mov r0, r12; mov r0, r13; mov r0, r14; mov r0, r15");
+-	asm volatile ("             mov r0, r17; mov r0, r18; mov r0, r19");
+-	asm volatile ("mov r0, r20; mov r0, r21; mov r0, r22; mov r0, r23");
+-	asm volatile ("mov r0, r24; mov r0, r25; mov r0, r26; mov r0, r27");
+-	asm volatile ("mov r0, r28; mov r0, r29; mov r0, r30");
+-
+-	/* SPRs */
+-	asm volatile ("ldsr r0, 0;  ldsr r0, 1;  ldsr r0, 2;  ldsr r0, 3");
+-	asm volatile ("ldsr r0, 4");
+-	asm volatile ("addi 0x20, r0, r1; ldsr r1, 5"); /* PSW */
+-	asm volatile ("ldsr r0, 16; ldsr r0, 17; ldsr r0, 18; ldsr r0, 19");
+-	asm volatile ("ldsr r0, 20");
+-
+-	/* Turn on the caches.  */
+-	NA85E2C_CACHE_BTSC
+-		|= (NA85E2C_CACHE_BTSC_ICM | NA85E2C_CACHE_BTSC_DCM0);
+-	NA85E2C_BUSM_BHC = 0xFFFF;
+-
+-	/* Ensure that the simulator halts on a panic, instead of going
+-	   into an infinite loop inside the panic function.  */
+-	panic_timeout = -1;
+-}
+-
+-void __init mach_setup (char **cmdline)
+-{
+-	memcons_setup ();
+-}
+-
+-void mach_get_physical_ram (unsigned long *ram_start, unsigned long *ram_len)
+-{
+-	/* There are 3 possible areas we can use:
+-	     IRAM (1MB) is fast for instruction fetches, but slow for data
+-	     DRAM (1020KB) is fast for data, but slow for instructions
+-	     ERAM is cached, so should be fast for both insns and data,
+-	          _but_ currently only supports write-through caching, so
+-		  writes are slow.
+-	   Since there's really no area that's good for general kernel
+-	   use, we use DRAM -- it won't be good for user programs
+-	   (which will be loaded into kernel allocated memory), but
+-	   currently we're more concerned with testing the kernel.  */
+-	*ram_start = DRAM_ADDR;
+-	*ram_len = R0_RAM_ADDR - DRAM_ADDR;
+-}
+-
+-void __init mach_sched_init (struct irqaction *timer_action)
+-{
+-	/* The simulator actually cycles through all interrupts
+-	   periodically.  We just pay attention to IRQ0, which gives us
+-	   1/64 the rate of the periodic interrupts.  */
+-	setup_irq (0, timer_action);
+-}
+-
+-void mach_gettimeofday (struct timespec *tv)
+-{
+-	tv->tv_sec = 0;
+-	tv->tv_nsec = 0;
+-}
+-
+-/* Interrupts */
+-
+-struct nb85e_intc_irq_init irq_inits[] = {
+-	{ "IRQ", 0, NUM_MACH_IRQS, 1, 7 },
+-	{ 0 }
+-};
+-struct hw_interrupt_type hw_itypes[1];
+-
+-/* Initialize interrupts.  */
+-void __init mach_init_irqs (void)
+-{
+-	nb85e_intc_init_irq_types (irq_inits, hw_itypes);
+-}
+-
+-
+-void machine_halt (void) __attribute__ ((noreturn));
+-void machine_halt (void)
+-{
+-	SIMFIN = 0;		/* Halt immediately.  */
+-	for (;;) {}
+-}
+-
+-void machine_restart (char *__unused)
+-{
+-	machine_halt ();
+-}
+-
+-void machine_power_off (void)
+-{
+-	machine_halt ();
+-}
+--- linux-2.6.0-test1/arch/v850/kernel/teg.c	2003-06-14 12:18:25.000000000 -0700
++++ 25/arch/v850/kernel/teg.c	2003-07-19 17:03:49.000000000 -0700
+@@ -22,7 +22,7 @@
+ #include <asm/atomic.h>
+ #include <asm/page.h>
+ #include <asm/machdep.h>
+-#include <asm/nb85e_timer_d.h>
++#include <asm/v850e_timer_d.h>
+ 
+ #include "mach.h"
+ 
+@@ -31,12 +31,12 @@ void __init mach_sched_init (struct irqa
+ 	/* Select timer interrupt instead of external pin.  */
+ 	TEG_ISS |= 0x1;
+ 	/* Start hardware timer.  */
+-	nb85e_timer_d_configure (0, HZ);
++	v850e_timer_d_configure (0, HZ);
+ 	/* Install timer interrupt handler.  */
+ 	setup_irq (IRQ_INTCMD(0), timer_action);
+ }
+ 
+-static struct nb85e_intc_irq_init irq_inits[] = {
++static struct v850e_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 },
+@@ -51,7 +51,7 @@ static struct hw_interrupt_type hw_itype
+ /* Initialize MA chip interrupts.  */
+ void __init teg_init_irqs (void)
+ {
+-	nb85e_intc_init_irq_types (irq_inits, hw_itypes);
++	v850e_intc_init_irq_types (irq_inits, hw_itypes);
+ }
+ 
+ /* Called before configuring an on-chip UART.  */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/kernel/v850e2_cache.c	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,127 @@
++/*
++ * arch/v850/kernel/v850e2_cache.c -- Cache control for V850E2 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 <linux/mm.h>
++
++#include <asm/v850e2_cache.h>
++
++/* Cache operations we can do.  The encoding corresponds directly to the
++   value we need to write into the COPR register.  */
++enum cache_op {
++	OP_SYNC_IF_DIRTY 	   = V850E2_CACHE_COPR_CFC(0), /* 000 */
++	OP_SYNC_IF_VALID 	   = V850E2_CACHE_COPR_CFC(1), /* 001 */
++	OP_SYNC_IF_VALID_AND_CLEAR = V850E2_CACHE_COPR_CFC(3), /* 011 */
++	OP_WAY_CLEAR 		   = V850E2_CACHE_COPR_CFC(4), /* 100 */
++	OP_FILL 		   = V850E2_CACHE_COPR_CFC(5), /* 101 */
++	OP_CLEAR 		   = V850E2_CACHE_COPR_CFC(6), /* 110 */
++	OP_CREATE_DIRTY 	   = V850E2_CACHE_COPR_CFC(7)  /* 111 */
++};
++
++/* Which cache to use.  This encoding also corresponds directly to the
++   value we need to write into the COPR register. */
++enum cache {
++	ICACHE = 0,
++	DCACHE = V850E2_CACHE_COPR_LBSL
++};
++
++/* Returns ADDR rounded down to the beginning of its cache-line.  */
++#define CACHE_LINE_ADDR(addr)  \
++   ((addr) & ~(V850E2_CACHE_LINE_SIZE - 1))
++/* Returns END_ADDR rounded up to the `limit' of its cache-line.  */
++#define CACHE_LINE_END_ADDR(end_addr)  \
++   CACHE_LINE_ADDR(end_addr + (V850E2_CACHE_LINE_SIZE - 1))
++
++
++/* Low-level cache ops.  */
++
++/* Apply cache-op OP to all entries in CACHE.  */
++static inline void cache_op_all (enum cache_op op, enum cache cache)
++{
++	int cmd = op | cache | V850E2_CACHE_COPR_WSLE | V850E2_CACHE_COPR_STRT;
++
++	if (op != OP_WAY_CLEAR) {
++		/* The WAY_CLEAR operation does the whole way, but other
++		   ops take begin-index and count params; we just indicate
++		   the entire cache.  */
++		V850E2_CACHE_CADL = 0;
++		V850E2_CACHE_CADH = 0;
++		V850E2_CACHE_CCNT = V850E2_CACHE_WAY_SIZE - 1;
++	}
++
++	V850E2_CACHE_COPR = cmd | V850E2_CACHE_COPR_WSL(0); /* way 0 */
++	V850E2_CACHE_COPR = cmd | V850E2_CACHE_COPR_WSL(1); /* way 1 */
++	V850E2_CACHE_COPR = cmd | V850E2_CACHE_COPR_WSL(2); /* way 2 */
++	V850E2_CACHE_COPR = cmd | V850E2_CACHE_COPR_WSL(3); /* way 3 */
++}
++
++/* Apply cache-op OP to all entries in CACHE covering addresses ADDR
++   through ADDR+LEN.  */
++static inline void cache_op_range (enum cache_op op, u32 addr, u32 len,
++				   enum cache cache)
++{
++	u32 start = CACHE_LINE_ADDR (addr);
++	u32 end = CACHE_LINE_END_ADDR (addr + len);
++	u32 num_lines = (end - start) >> V850E2_CACHE_LINE_SIZE_BITS;
++
++	V850E2_CACHE_CADL = start & 0xFFFF;
++	V850E2_CACHE_CADH = start >> 16;
++	V850E2_CACHE_CCNT = num_lines - 1;
++
++	V850E2_CACHE_COPR = op | cache | V850E2_CACHE_COPR_STRT;
++}
++
++
++/* High-level ops.  */
++
++static void cache_exec_after_store_all (void)
++{
++	cache_op_all (OP_SYNC_IF_DIRTY, DCACHE);
++	cache_op_all (OP_WAY_CLEAR, ICACHE);
++}
++
++static void cache_exec_after_store_range (u32 start, u32 len)
++{
++	cache_op_range (OP_SYNC_IF_DIRTY, start, len, DCACHE);
++	cache_op_range (OP_CLEAR, start, len, ICACHE);
++}
++
++
++/* Exported functions.  */
++
++void flush_icache (void)
++{
++	cache_exec_after_store_all ();
++}
++
++void flush_icache_range (unsigned long start, unsigned long end)
++{
++	cache_exec_after_store_range (start, end - start);
++}
++
++void flush_icache_page (struct vm_area_struct *vma, struct page *page)
++{
++	cache_exec_after_store_range (page_to_virt (page), PAGE_SIZE);
++}
++
++void flush_icache_user_range (struct vm_area_struct *vma, struct page *page,
++			      unsigned long addr, int len)
++{
++	cache_exec_after_store_range (addr, len);
++}
++
++void flush_cache_sigtramp (unsigned long addr)
++{
++	/* For the exact size, see signal.c, but 16 bytes should be enough.  */
++	cache_exec_after_store_range (addr, 16);
++}
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/kernel/v850e_cache.c	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,173 @@
++/*
++ * arch/v850/kernel/v850e_cache.c -- Cache control for V850E 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>
++ */
++
++/* This file implements cache control for the rather simple cache used on
++   some V850E CPUs, specifically the NB85E/TEG CPU-core and the V850E/ME2
++   CPU.  V850E2 processors have their own (better) cache
++   implementation.  */
++
++#include <asm/entry.h>
++#include <asm/v850e_cache.h>
++
++#define WAIT_UNTIL_CLEAR(value) while (value) {}
++
++/* Set caching params via the BHC and DCC registers.  */
++void v850e_cache_enable (u16 bhc, u16 icc, u16 dcc)
++{
++	unsigned long *r0_ram = (unsigned long *)R0_RAM_ADDR;
++	register u16 bhc_val asm ("r6") = bhc;
++
++	/* Read the instruction cache control register (ICC) and confirm
++	   that bits 0 and 1 (TCLR0, TCLR1) are all cleared.  */
++	WAIT_UNTIL_CLEAR (V850E_CACHE_ICC & 0x3);
++	V850E_CACHE_ICC = icc;
++
++#ifdef V850E_CACHE_DCC
++	/* Configure data-cache.  */
++	V850E_CACHE_DCC = dcc;
++#endif /* V850E_CACHE_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.  */
++#ifdef V850E_CACHE_WRITE_IBS
++	*r0_ram++ 	= 0xf0720760;	/* st.h r0, 0xfffff072[r0] */
++#endif
++	*r0_ram++ 	= 0xf06a3760;	/* st.h r6, 0xfffff06a[r0] */
++	*r0_ram 	= 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 (V850E_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 (V850E_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.  */
++	V850E_CACHE_ICC |= 0x3;
++	WAIT_UNTIL_CLEAR (V850E_CACHE_ICC & 0x3);
++
++#ifdef V850E_CACHE_REPEAT_ICC_WRITE
++	/* Do it again.  */
++	V850E_CACHE_ICC |= 0x3;
++	WAIT_UNTIL_CLEAR (V850E_CACHE_ICC & 0x3);
++#endif
++}
++
++#ifdef V850E_CACHE_DCC
++/* 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 (V850E_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.  */
++	V850E_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.  */
++	V850E_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 (V850E_CACHE_DCC & flags);
++}
++#endif /* V850E_CACHE_DCC */
++
++/* Flushes the contents of the dcache to memory.  */
++static inline void flush_dcache (void)
++{
++#ifdef V850E_CACHE_DCC
++	/* We only need to do something if in write-back mode.  */
++	if (V850E_CACHE_DCC & 0x0400)
++		dcache_op (0x30);
++#endif /* V850E_CACHE_DCC */
++}
++
++/* Flushes the contents of the dcache to memory, and then clears it.  */
++static inline void clear_dcache (void)
++{
++#ifdef V850E_CACHE_DCC
++	/* We only need to do something if the dcache is enabled.  */
++	if (V850E_CACHE_DCC & 0x0C00)
++		dcache_op (0x33);
++#endif /* V850E_CACHE_DCC */
++}
++
++/* Clears the dcache without flushing to memory first.  */
++static inline void clear_dcache_no_flush (void)
++{
++#ifdef V850E_CACHE_DCC
++	/* We only need to do something if the dcache is enabled.  */
++	if (V850E_CACHE_DCC & 0x0C00)
++		dcache_op (0x3);
++#endif /* V850E_CACHE_DCC */
++}
++
++static inline void cache_exec_after_store (void)
++{
++	flush_dcache ();
++	clear_icache ();
++}
++
++
++/* Exported functions.  */
++
++void flush_icache (void)
++{
++	cache_exec_after_store ();
++}
++
++void flush_icache_range (unsigned long start, unsigned long end)
++{
++	cache_exec_after_store ();
++}
++
++void flush_icache_page (struct vm_area_struct *vma, struct page *page)
++{
++	cache_exec_after_store ();
++}
++
++void flush_icache_user_range (struct vm_area_struct *vma, struct page *page,
++			      unsigned long adr, int len)
++{
++	cache_exec_after_store ();
++}
++
++void flush_cache_sigtramp (unsigned long addr)
++{
++	cache_exec_after_store ();
++}
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/kernel/v850e_intc.c	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,104 @@
++/*
++ * arch/v850/kernel/v850e_intc.c -- V850E interrupt controller (INTC)
++ *
++ *  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/kernel.h>
++#include <linux/init.h>
++#include <linux/irq.h>
++
++#include <asm/v850e_intc.h>
++
++static void irq_nop (unsigned irq) { }
++
++static unsigned v850e_intc_irq_startup (unsigned irq)
++{
++	v850e_intc_clear_pending_irq (irq);
++	v850e_intc_enable_irq (irq);
++	return 0;
++}
++
++static void v850e_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 v850e_intc_init_irq_types (struct v850e_intc_irq_init *inits,
++				       struct hw_interrupt_type *hw_irq_types)
++{
++	struct v850e_intc_irq_init *init;
++	for (init = inits; init->name; init++) {
++		unsigned i;
++		struct hw_interrupt_type *hwit = hw_irq_types++;
++
++		hwit->typename = init->name;
++
++		hwit->startup  = v850e_intc_irq_startup;
++		hwit->shutdown = v850e_intc_disable_irq;
++		hwit->enable   = v850e_intc_enable_irq;
++		hwit->disable  = v850e_intc_disable_irq;
++		hwit->ack      = irq_nop;
++		hwit->end      = v850e_intc_end_irq;
++		
++		/* Initialize kernel IRQ infrastructure for this interrupt.  */
++		init_irq_handlers(init->base, init->num, init->interval, hwit);
++
++		/* Set the interrupt priorities.  */
++		for (i = 0; i < init->num; i++) {
++			unsigned irq = init->base + i * init->interval;
++
++			/* If the interrupt is currently enabled (all
++			   interrupts are initially disabled), then
++			   assume whoever enabled it has set things up
++			   properly, and avoid messing with it.  */
++			if (! v850e_intc_irq_enabled (irq))
++				/* This write also (1) disables the
++				   interrupt, and (2) clears any pending
++				   interrupts.  */
++				V850E_INTC_IC (irq)
++					= (V850E_INTC_IC_PR (init->priority)
++					   | V850E_INTC_IC_MK);
++		}
++	}
++}
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/kernel/v850e_timer_d.c	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,54 @@
++/*
++ * include/asm-v850/v850e_timer_d.c -- `Timer D' component often used
++ *	with V850E CPUs
++ *
++ *  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/kernel.h>
++
++#include <asm/v850e_utils.h>
++#include <asm/v850e_timer_d.h>
++
++/* Start interval timer TIMER (0-3).  The timer will issue the
++   corresponding INTCMD interrupt RATE times per second.
++   This function does not enable the interrupt.  */
++void v850e_timer_d_configure (unsigned timer, unsigned rate)
++{
++	unsigned divlog2, count;
++
++	/* Calculate params for timer.  */
++	if (! calc_counter_params (
++		    V850E_TIMER_D_BASE_FREQ, rate,
++		    V850E_TIMER_D_TMCD_CS_MIN, V850E_TIMER_D_TMCD_CS_MAX, 16,
++		    &divlog2, &count))
++		printk (KERN_WARNING
++			"Cannot find interval timer %d setting suitable"
++			" for rate of %dHz.\n"
++			"Using rate of %dHz instead.\n",
++			timer, rate,
++			(V850E_TIMER_D_BASE_FREQ >> divlog2) >> 16);
++
++	/* Do the actual hardware timer initialization:  */
++
++	/* Enable timer.  */
++	V850E_TIMER_D_TMCD(timer) = V850E_TIMER_D_TMCD_CAE;
++	/* Set clock divider.  */
++	V850E_TIMER_D_TMCD(timer)
++		= V850E_TIMER_D_TMCD_CAE
++		| V850E_TIMER_D_TMCD_CS(divlog2);
++	/* Set timer compare register.  */
++	V850E_TIMER_D_CMD(timer) = count;
++	/* Start counting.  */
++	V850E_TIMER_D_TMCD(timer)
++		= V850E_TIMER_D_TMCD_CAE
++		| V850E_TIMER_D_TMCD_CS(divlog2)
++		| V850E_TIMER_D_TMCD_CE;
++}
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/kernel/v850e_utils.c	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,62 @@
++/*
++ * include/asm-v850/v850e_utils.h -- Utility functions associated with
++ *	V850E CPUs
++ *
++ *  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 <asm/v850e_utils.h>
++
++/* Calculate counter clock-divider and count values to attain the
++   desired frequency RATE from the base frequency BASE_FREQ.  The
++   counter is expected to have a clock-divider, which can divide the
++   system cpu clock by a power of two value from MIN_DIVLOG2 to
++   MAX_DIV_LOG2, and a word-size of COUNTER_SIZE bits (the counter
++   counts up and resets whenever it's equal to the compare register,
++   generating an interrupt or whatever when it does so).  The returned
++   values are: *DIVLOG2 -- log2 of the desired clock divider and *COUNT
++   -- the counter compare value to use.  Returns true if it was possible
++   to find a reasonable value, otherwise false (and the other return
++   values will be set to be as good as possible).  */
++int calc_counter_params (unsigned long base_freq,
++			 unsigned long rate,
++			 unsigned min_divlog2, unsigned max_divlog2,
++			 unsigned counter_size,
++			 unsigned *divlog2, unsigned *count)
++{
++	unsigned _divlog2;
++	int ok = 0;
++
++	/* Find the lowest clock divider setting that can represent RATE.  */
++	for (_divlog2 = min_divlog2; _divlog2 <= max_divlog2; _divlog2++) {
++		/* Minimum interrupt rate possible using this divider.  */
++		unsigned min_int_rate
++			= (base_freq >> _divlog2) >> counter_size;
++
++		if (min_int_rate <= rate) {
++			/* This setting is the highest resolution
++			   setting that's slow enough enough to attain
++			   RATE interrupts per second, so use it.  */
++			ok = 1;
++			break;
++		}
++	}
++
++	if (_divlog2 > max_divlog2)
++		/* Can't find correct setting.  */
++		_divlog2 = max_divlog2;
++
++	if (divlog2)
++		*divlog2 = _divlog2;
++	if (count)
++		*count = ((base_freq >> _divlog2) + rate/2) / rate;
++
++	return ok;
++}
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/rte_me2_cb.ld	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,30 @@
++/* Linker script for the Midas labs RTE-V850E/ME2-CB evaluation board
++   (CONFIG_RTE_CB_ME2), with kernel in SDRAM.  */
++
++MEMORY {
++	/* 128Kbyte of IRAM */
++	IRAM : ORIGIN = 0x00000000, LENGTH = 0x00020000
++	
++	/* 32MB of SDRAM.  */
++	SDRAM : ORIGIN = 0x00800000, LENGTH = 0x02000000
++}
++
++#define KRAM SDRAM
++
++SECTIONS {
++	.text : {
++		__kram_start = . ;
++		TEXT_CONTENTS
++		INTV_CONTENTS	/* copy to iRAM (0x0-0x620) */
++	} > KRAM
++
++	.data : {
++		DATA_CONTENTS
++		BSS_CONTENTS
++		RAMK_INIT_CONTENTS
++		__kram_end = . ;
++		BOOTMAP_CONTENTS
++	} > KRAM
++	
++	.root ALIGN (4096) : { ROOT_FS_CONTENTS } > SDRAM
++}
+--- linux-2.6.0-test1/arch/v850/sim85e2c.ld	2003-06-14 12:18:34.000000000 -0700
++++ /dev/null	2002-08-30 16:31:37.000000000 -0700
+@@ -1,44 +0,0 @@
+-/* Linker script for the sim85e2c simulator, which is a verilog simulation of
+-   the V850E2 NA85E2C cpu core (CONFIG_V850E2_SIM85E2C).  */
+-
+-MEMORY {
+-	/* 1MB of `instruction RAM', starting at 0.
+-	   Instruction fetches are much faster from IRAM than from DRAM.
+-	   This should match IRAM_ADDR in "include/asm-v580/sim85e2c.h".    */
+-	IRAM	: ORIGIN = 0x00000000, LENGTH = 0x00100000
+-
+-	/* 1MB of `data RAM', below and contiguous with the I/O space.
+-	   Data fetches are much faster from DRAM than from IRAM.
+-	   This should match DRAM_ADDR in "include/asm-v580/sim85e2c.h".  */
+-	DRAM	: ORIGIN = 0xfff00000, LENGTH = 0x000ff000
+-	/* We have to load DRAM at a mirror-address of 0x1ff00000,
+-	   because the simulator's preprocessing script isn't smart
+-	   enough to deal with the above LMA.  */
+-	DRAM_LOAD : ORIGIN = 0x1ff00000, LENGTH = 0x000ff000
+-
+-	/* `external ram' (CS1 area), comes after IRAM.
+-	   This should match ERAM_ADDR in "include/asm-v580/sim85e2c.h".  */
+-	ERAM	: ORIGIN = 0x00100000, LENGTH = 0x07f00000
+-}
+-
+-SECTIONS {
+-	.iram : {
+-		INTV_CONTENTS
+-		TEXT_CONTENTS
+-		RAMK_INIT_CONTENTS
+-	} > IRAM
+-	.data : {
+-		__kram_start = . ;
+-		DATA_CONTENTS
+-		BSS_CONTENTS
+-		ROOT_FS_CONTENTS
+-
+-		/* We stick console output into a buffer here.  */
+-		_memcons_output = . ;
+-		. = . + 0x8000 ;
+-		_memcons_output_end = . ;
+-
+-		__kram_end = . ;
+-		BOOTMAP_CONTENTS
+-	} > DRAM  AT> DRAM_LOAD
+-}
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/sim85e2.ld	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,44 @@
++/* Linker script for the sim85e2c simulator, which is a verilog simulation of
++   the V850E2 NA85E2C cpu core (CONFIG_V850E2_SIM85E2C).  */
++
++MEMORY {
++	/* 1MB of `instruction RAM', starting at 0.
++	   Instruction fetches are much faster from IRAM than from DRAM.
++	   This should match IRAM_ADDR in "include/asm-v580/sim85e2c.h".    */
++	IRAM		: ORIGIN = 0x00000000, LENGTH = 0x00100000
++
++	/* 1MB of `data RAM', below and contiguous with the I/O space.
++	   Data fetches are much faster from DRAM than from IRAM.
++	   This should match DRAM_ADDR in "include/asm-v580/sim85e2c.h".  */
++	DRAM		: ORIGIN = 0xfff00000, LENGTH = 0x000ff000
++	/* We have to load DRAM at a mirror-address of 0x1ff00000,
++	   because the simulator's preprocessing script isn't smart
++	   enough to deal with the above LMA.  */
++	DRAM_LOAD 	: ORIGIN = 0x1ff00000, LENGTH = 0x000ff000
++
++	/* `external ram' (CS1 area), comes after IRAM.
++	   This should match ERAM_ADDR in "include/asm-v580/sim85e2c.h".  */
++	ERAM		: ORIGIN = 0x00100000, LENGTH = 0x07f00000
++
++	/* Dynamic RAM; uses memory controller.  */
++	/* SDRAM	: ORIGIN = 0x10000000, LENGTH = 0x01000000 */
++	SDRAM		: ORIGIN = 0x10000000, LENGTH = 0x00200000/*use 2MB*/
++}
++
++SECTIONS {
++	.iram : {
++		INTV_CONTENTS
++		*arch/v850/kernel/head.o
++		*(.early.text)
++	} > IRAM
++	.dram : {
++		_memcons_output = . ;
++		. = . + 0x8000 ;
++		_memcons_output_end = . ;
++	} > DRAM
++	.sdram : {
++		/* We stick console output into a buffer here.  */
++		RAMK_KRAM_CONTENTS
++		ROOT_FS_CONTENTS
++	} > SDRAM
++}
+--- linux-2.6.0-test1/arch/v850/vmlinux.lds.S	2003-06-22 12:04:44.000000000 -0700
++++ 25/arch/v850/vmlinux.lds.S	2003-07-19 17:03:49.000000000 -0700
+@@ -206,8 +206,8 @@ _jiffies = _jiffies_64 ;
+ # include "sim.ld"
+ #endif
+ 
+-#ifdef CONFIG_V850E2_SIM85E2C
+-# include "sim85e2c.ld"
++#ifdef CONFIG_V850E2_SIM85E2
++# include "sim85e2.ld"
+ #endif
+ 
+ #ifdef CONFIG_V850E2_FPGA85E2C
+@@ -247,3 +247,8 @@ _jiffies = _jiffies_64 ;
+ #  include "rte_nb85e_cb.ld"
+ # endif
+ #endif
++
++#ifdef CONFIG_RTE_CB_ME2
++#  include "rte_me2_cb.ld"
++#endif
++
+--- linux-2.6.0-test1/arch/x86_64/boot/compressed/head.S	2003-06-26 22:07:24.000000000 -0700
++++ 25/arch/x86_64/boot/compressed/head.S	2003-07-19 17:04:53.000000000 -0700
+@@ -26,6 +26,7 @@
+ .code32
+ .text
+ 
++#define IN_BOOTLOADER
+ #include <linux/linkage.h>
+ #include <asm/segment.h>
+ 
+--- linux-2.6.0-test1/arch/x86_64/boot/compressed/misc.c	2003-06-26 22:07:24.000000000 -0700
++++ 25/arch/x86_64/boot/compressed/misc.c	2003-07-19 17:04:53.000000000 -0700
+@@ -9,6 +9,7 @@
+  * High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
+  */
+ 
++#define IN_BOOTLOADER
+ #include "miscsetup.h"
+ #include <asm/io.h>
+ 
+--- linux-2.6.0-test1/arch/x86_64/ia32/syscall32.c	2003-06-14 12:18:24.000000000 -0700
++++ 25/arch/x86_64/ia32/syscall32.c	2003-07-19 17:07:16.000000000 -0700
+@@ -29,12 +29,15 @@ char *syscall32_page; 
+    and let it be handled by generic VM */ 
+ int map_syscall32(struct mm_struct *mm, unsigned long address) 
+ { 
++	pgd_t *pgd;
++	pmd_t *pmd;
+ 	pte_t *pte;
+ 	int err = 0;
+ 	down_read(&mm->mmap_sem);
+ 	spin_lock(&mm->page_table_lock); 
+-	pmd_t *pmd = pmd_alloc(mm, pgd_offset(mm, address), address); 
+-	if (pmd && (pte = pte_alloc_map(mm, pmd, address)) != NULL) { 
++	pgd = pgd_offset(mm, address);
++	pmd = pmd_alloc_map(mm, pgd, address);
++	if (pmd && (pte = pte_alloc_map(mm, pgd, &pmd, address)) != NULL) {
+ 		if (pte_none(*pte)) { 
+ 			set_pte(pte, 
+ 				mk_pte(virt_to_page(syscall32_page), 
+--- linux-2.6.0-test1/arch/x86_64/kernel/apic.c	2003-06-16 22:32:20.000000000 -0700
++++ 25/arch/x86_64/kernel/apic.c	2003-07-19 17:04:07.000000000 -0700
+@@ -298,8 +298,8 @@ void __init setup_local_APIC (void)
+ 	 * Double-check whether this APIC is really registered.
+ 	 * This is meaningless in clustered apic mode, so we skip it.
+ 	 */
+-	if (!clustered_apic_mode && 
+-	    !test_bit(GET_APIC_ID(apic_read(APIC_ID)), &phys_cpu_present_map))
++	if (!clustered_apic_mode &&
++		!cpu_isset(GET_APIC_ID(apic_read(APIC_ID)), phys_cpu_present_map))
+ 		BUG();
+ 
+ 	/*
+@@ -997,7 +997,7 @@ int __init APIC_init_uniprocessor (void)
+ 
+ 	connect_bsp_APIC();
+ 
+-	phys_cpu_present_map = 1;
++	phys_cpu_present_map = cpumask_of_cpu(0);
+ 	apic_write_around(APIC_ID, boot_cpu_id);
+ 
+ 	setup_local_APIC();
+--- linux-2.6.0-test1/arch/x86_64/kernel/io_apic.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/x86_64/kernel/io_apic.c	2003-07-19 17:04:07.000000000 -0700
+@@ -1014,7 +1014,7 @@ void disable_IO_APIC(void)
+ static void __init setup_ioapic_ids_from_mpc (void)
+ {
+ 	union IO_APIC_reg_00 reg_00;
+-	unsigned long phys_id_present_map = phys_cpu_present_map;
++	cpumask_t phys_id_present_map = phys_cpu_present_map;
+ 	int apic;
+ 	int i;
+ 	unsigned char old_id;
+@@ -1047,22 +1047,22 @@ static void __init setup_ioapic_ids_from
+ 		 * system must have a unique ID or we get lots of nice
+ 		 * 'stuck on smp_invalidate_needed IPI wait' messages.
+ 	 	 */
+-		if (phys_id_present_map & (1 << mp_ioapics[apic].mpc_apicid)) {
++		if (cpu_isset(mp_ioapics[apic].mpc_apicid, phys_id_present_map)) {
+ 			printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n",
+ 				apic, mp_ioapics[apic].mpc_apicid);
+ 			for (i = 0; i < 0xf; i++)
+-				if (!(phys_id_present_map & (1 << i)))
++				if (!cpu_isset(i, phys_id_present_map))
+ 					break;
+ 			if (i >= 0xf)
+ 				panic("Max APIC ID exceeded!\n");
+ 			printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
+ 				i);
+-			phys_id_present_map |= 1 << i;
++			cpu_set(i, phys_id_present_map);
+ 			mp_ioapics[apic].mpc_apicid = i;
+ 		} else {
+ 			printk(KERN_INFO 
+ 			       "Using IO-APIC %d\n", mp_ioapics[apic].mpc_apicid);
+-			phys_id_present_map |= 1 << mp_ioapics[apic].mpc_apicid;
++			cpu_set(mp_ioapics[apic].mpc_apicid, phys_id_present_map);
+ 		}
+ 
+ 
+@@ -1638,7 +1638,7 @@ void __init mp_config_ioapic_for_sci(int
+ int __init io_apic_get_unique_id (int ioapic, int apic_id)
+ {
+ 	union IO_APIC_reg_00 reg_00;
+-	static unsigned long apic_id_map = 0;
++	static cpumask_t apic_id_map;
+ 	unsigned long flags;
+ 	int i = 0;
+ 
+@@ -1651,7 +1651,7 @@ int __init io_apic_get_unique_id (int io
+ 	 *      advantage of new APIC bus architecture.
+ 	 */
+ 
+-	if (!apic_id_map)
++	if (!cpus_empty(apic_id_map))
+ 		apic_id_map = phys_cpu_present_map;
+ 
+ 	spin_lock_irqsave(&ioapic_lock, flags);
+@@ -1668,10 +1668,10 @@ int __init io_apic_get_unique_id (int io
+ 	 * Every APIC in a system must have a unique ID or we get lots of nice 
+ 	 * 'stuck on smp_invalidate_needed IPI wait' messages.
+ 	 */
+-	if (apic_id_map & (1 << apic_id)) {
++	if (cpu_isset(apic_id, apic_id_map)) {
+ 
+ 		for (i = 0; i < IO_APIC_MAX_ID; i++) {
+-			if (!(apic_id_map & (1 << i)))
++			if (!cpu_isset(i, apic_id_map))
+ 				break;
+ 		}
+ 
+@@ -1684,7 +1684,7 @@ int __init io_apic_get_unique_id (int io
+ 		apic_id = i;
+ 	} 
+ 
+-	apic_id_map |= (1 << apic_id);
++	cpu_set(apic_id, apic_id_map);
+ 
+ 	if (reg_00.bits.ID != apic_id) {
+ 		reg_00.bits.ID = apic_id;
+--- linux-2.6.0-test1/arch/x86_64/kernel/irq.c	2003-06-14 12:18:08.000000000 -0700
++++ 25/arch/x86_64/kernel/irq.c	2003-07-19 17:04:07.000000000 -0700
+@@ -792,13 +792,13 @@ int setup_irq(unsigned int irq, struct i
+ static struct proc_dir_entry * root_irq_dir;
+ static struct proc_dir_entry * irq_dir [NR_IRQS];
+ 
+-#define HEX_DIGITS 8
++#define HEX_DIGITS (2*sizeof(cpumask_t))
+ 
+ static unsigned int parse_hex_value (const char *buffer,
+-		unsigned long count, unsigned long *ret)
++		unsigned long count, cpumask_t *ret)
+ {
+ 	unsigned char hexnum [HEX_DIGITS];
+-	unsigned long value;
++	cpumask_t value = CPU_MASK_NONE;
+ 	unsigned i;
+ 
+ 	if (!count)
+@@ -812,10 +812,9 @@ static unsigned int parse_hex_value (con
+ 	 * Parse the first 8 characters as a hex string, any non-hex char
+ 	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
+ 	 */
+-	value = 0;
+ 
+ 	for (i = 0; i < count; i++) {
+-		unsigned int c = hexnum[i];
++		unsigned int k, c = hexnum[i];
+ 
+ 		switch (c) {
+ 			case '0' ... '9': c -= '0'; break;
+@@ -824,7 +823,10 @@ static unsigned int parse_hex_value (con
+ 		default:
+ 			goto out;
+ 		}
+-		value = (value << 4) | c;
++		cpus_shift_left(value, value, 4);
++		for (k = 0; k < 4; ++k)
++			if (c & (1 << k))
++				cpu_set(k, value);
+ 	}
+ out:
+ 	*ret = value;
+@@ -835,20 +837,31 @@ out:
+ 
+ static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
+ 
+-static unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };
++static cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL };
+ static int irq_affinity_read_proc (char *page, char **start, off_t off,
+ 			int count, int *eof, void *data)
+ {
++	int k, len;
++	cpumask_t tmp = irq_affinity[(long)data];
++
+ 	if (count < HEX_DIGITS+1)
+ 		return -EINVAL;
+-	return sprintf (page, "%08lx\n", irq_affinity[(long)data]);
++
++	for (k = len = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
++		len += j;
++		page += j;
++		cpus_shift_right(tmp, tmp, 16);
++	}
++	len += sprintf(page, "\n");
++	return len;
+ }
+ 
+ static int irq_affinity_write_proc (struct file *file, const char *buffer,
+ 					unsigned long count, void *data)
+ {
+ 	int irq = (long) data, full_count = count, err;
+-	unsigned long new_value;
++	cpumask_t tmp, new_value;
+ 
+ 	if (!irq_desc[irq].handler->set_affinity)
+ 		return -EIO;
+@@ -860,7 +873,8 @@ static int irq_affinity_write_proc (stru
+ 	 * way to make the system unusable accidentally :-) At least
+ 	 * one online CPU still has to be targeted.
+ 	 */
+-	if (!(new_value & cpu_online_map))
++	cpus_and(tmp, new_value, cpu_online_map);
++	if (cpus_empty(tmp))
+ 		return -EINVAL;
+ 
+ 	irq_affinity[irq] = new_value;
+@@ -874,17 +888,28 @@ static int irq_affinity_write_proc (stru
+ static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
+ 			int count, int *eof, void *data)
+ {
+-	unsigned long *mask = (unsigned long *) data;
++	cpumask_t tmp, *mask = (cpumask_t *) data;
++	int k, len;
++
+ 	if (count < HEX_DIGITS+1)
+ 		return -EINVAL;
+-	return sprintf (page, "%08lx\n", *mask);
++
++	tmp = *mask;
++	for (k = len = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
++		len += j;
++		page += j;
++		cpus_shift_right(tmp, tmp, 16);
++	}
++	len += sprintf(page, "\n");
++	return len;
+ }
+ 
+ static int prof_cpu_mask_write_proc (struct file *file, const char *buffer,
+ 					unsigned long count, void *data)
+ {
+-	unsigned long *mask = (unsigned long *) data, full_count = count, err;
+-	unsigned long new_value;
++	unsigned long full_count = count, err;
++	cpumask_t new_value, *mask = (cpumask_t *)data;
+ 
+ 	err = parse_hex_value(buffer, count, &new_value);
+ 	if (err)
+--- linux-2.6.0-test1/arch/x86_64/kernel/ldt.c	2003-06-16 22:32:20.000000000 -0700
++++ 25/arch/x86_64/kernel/ldt.c	2003-07-19 17:04:07.000000000 -0700
+@@ -60,9 +60,12 @@ static int alloc_ldt(mm_context_t *pc, u
+ 	wmb();
+ 	if (reload) {
+ #ifdef CONFIG_SMP
++		cpumask_t mask;
++
+ 		preempt_disable();
++		mask = cpumask_of_cpu(smp_processor_id());
+ 		load_LDT(pc);
+-		if (current->mm->cpu_vm_mask != (1UL<<smp_processor_id()))
++		if (!cpus_equal(current->mm->cpu_vm_mask, mask))
+ 			smp_call_function(flush_ldt, 0, 1, 1);
+ 		preempt_enable();
+ #else
+--- linux-2.6.0-test1/arch/x86_64/kernel/mpparse.c	2003-06-14 12:18:06.000000000 -0700
++++ 25/arch/x86_64/kernel/mpparse.c	2003-07-19 17:04:07.000000000 -0700
+@@ -65,7 +65,7 @@ unsigned int boot_cpu_id = -1U;
+ static unsigned int num_processors = 0;
+ 
+ /* Bitmask of physically existing CPUs */
+-unsigned long phys_cpu_present_map = 0;
++cpumask_t phys_cpu_present_map = CPU_MASK_NONE;
+ 
+ /* ACPI MADT entry parsing functions */
+ #ifdef CONFIG_ACPI_BOOT
+@@ -124,7 +124,7 @@ static void __init MP_processor_info (st
+ 	}
+ 	ver = m->mpc_apicver;
+ 
+-	phys_cpu_present_map |= 1 << m->mpc_apicid;
++	cpu_set(m->mpc_apicid, phys_cpu_present_map);
+ 	/*
+ 	 * Validate version
+ 	 */
+--- linux-2.6.0-test1/arch/x86_64/kernel/msr.c	2003-06-16 22:32:20.000000000 -0700
++++ 25/arch/x86_64/kernel/msr.c	2003-07-19 17:04:07.000000000 -0700
+@@ -242,7 +242,7 @@ static int msr_open(struct inode *inode,
+   int cpu = minor(file->f_dentry->d_inode->i_rdev);
+   struct cpuinfo_x86 *c = &(cpu_data)[cpu];
+   
+-  if ( !(cpu_online_map & (1UL << cpu)) )
++  if (!cpu_online(cpu))
+     return -ENXIO;		/* No such CPU */
+   if ( !cpu_has(c, X86_FEATURE_MSR) )
+     return -EIO;		/* MSR not supported */
+--- linux-2.6.0-test1/arch/x86_64/kernel/reboot.c	2003-06-14 12:18:30.000000000 -0700
++++ 25/arch/x86_64/kernel/reboot.c	2003-07-19 17:04:07.000000000 -0700
+@@ -110,7 +110,7 @@ static void smp_halt(void)
+ 	}
+ 
+ 	/* Wait for all other CPUs to have run smp_stop_cpu */
+-	while (cpu_online_map) 
++	while (!cpus_empty(cpu_online_map))
+ 		rep_nop(); 
+ }
+ #endif
+--- linux-2.6.0-test1/arch/x86_64/kernel/setup.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/x86_64/kernel/setup.c	2003-07-19 17:04:07.000000000 -0700
+@@ -643,7 +643,7 @@ static int show_cpuinfo(struct seq_file 
+ 
+ 
+ #ifdef CONFIG_SMP
+-	if (!(cpu_online_map & (1<<(c-cpu_data))))
++	if (!cpu_online(c-cpu_data))
+ 		return 0;
+ #endif
+ 
+--- linux-2.6.0-test1/arch/x86_64/kernel/smpboot.c	2003-06-16 22:32:20.000000000 -0700
++++ 25/arch/x86_64/kernel/smpboot.c	2003-07-19 17:04:07.000000000 -0700
+@@ -54,11 +54,11 @@
+ #include <asm/proto.h>
+ 
+ /* Bitmask of currently online CPUs */
+-unsigned long cpu_online_map = 1;
++cpumask_t cpu_online_map;
+ 
+-static volatile unsigned long cpu_callin_map;
+-volatile unsigned long cpu_callout_map;
+-static unsigned long smp_commenced_mask;
++static cpumask_t cpu_callin_map;
++cpumask_t cpu_callout_map;
++static cpumask_t smp_commenced_mask;
+ 
+ /* Per CPU bogomips and other parameters */
+ struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned;
+@@ -174,7 +174,7 @@ static void __init synchronize_tsc_bp (v
+ 
+ 	sum = 0;
+ 	for (i = 0; i < NR_CPUS; i++) {
+-		if (test_bit(i, &cpu_callout_map)) {
++		if (cpu_isset(i, cpu_callout_map)) {
+ 		t0 = tsc_values[i];
+ 		sum += t0;
+ 	}
+@@ -183,7 +183,7 @@ static void __init synchronize_tsc_bp (v
+ 
+ 	sum = 0;
+ 	for (i = 0; i < NR_CPUS; i++) {
+-		if (!test_bit(i, &cpu_callout_map))
++		if (!cpu_isset(i, cpu_callout_map))
+ 			continue;
+ 
+ 		delta = tsc_values[i] - avg;
+@@ -258,7 +258,7 @@ void __init smp_callin(void)
+ 	 */
+ 	phys_id = GET_APIC_ID(apic_read(APIC_ID));
+ 	cpuid = smp_processor_id();
+-	if (test_and_set_bit(cpuid, &cpu_callin_map)) {
++	if (cpu_test_and_set(cpuid, cpu_callin_map)) {
+ 		panic("smp_callin: phys CPU#%d, CPU#%d already present??\n",
+ 					phys_id, cpuid);
+ 	}
+@@ -280,7 +280,7 @@ void __init smp_callin(void)
+ 		/*
+ 		 * Has the boot CPU finished it's STARTUP sequence?
+ 		 */
+-		if (test_bit(cpuid, &cpu_callout_map))
++		if (cpu_isset(cpuid, cpu_callout_map))
+ 			break;
+ 		rep_nop();
+ 	}
+@@ -320,7 +320,7 @@ void __init smp_callin(void)
+ 	/*
+ 	 * Allow the master to continue.
+ 	 */
+-	set_bit(cpuid, &cpu_callin_map);
++	cpu_set(cpuid, cpu_callin_map);
+ 
+ 	/*
+ 	 *      Synchronize the TSC with the BP
+@@ -348,7 +348,7 @@ void __init start_secondary(void)
+ 	barrier();
+ 
+ 	Dprintk("cpu %d: waiting for commence\n", smp_processor_id()); 
+-	while (!test_bit(smp_processor_id(), &smp_commenced_mask))
++	while (!cpu_isset(smp_processor_id(), smp_commenced_mask))
+ 		rep_nop();
+ 
+ 	Dprintk("cpu %d: setting up apic clock\n", smp_processor_id()); 	
+@@ -372,7 +372,7 @@ void __init start_secondary(void)
+ 	local_flush_tlb();
+ 
+ 	Dprintk("cpu %d eSetting cpu_online_map\n", smp_processor_id()); 
+-	set_bit(smp_processor_id(), &cpu_online_map);
++	cpu_set(smp_processor_id(), cpu_online_map);
+ 	wmb();
+ 	
+ 	cpu_idle();
+@@ -630,19 +630,19 @@ static void __init do_boot_cpu (int apic
+ 		 * allow APs to start initializing.
+ 		 */
+ 		Dprintk("Before Callout %d.\n", cpu);
+-		set_bit(cpu, &cpu_callout_map);
++		cpu_set(cpu, cpu_callout_map);
+ 		Dprintk("After Callout %d.\n", cpu);
+ 
+ 		/*
+ 		 * Wait 5s total for a response
+ 		 */
+ 		for (timeout = 0; timeout < 50000; timeout++) {
+-			if (test_bit(cpu, &cpu_callin_map))
++			if (cpu_isset(cpu, cpu_callin_map))
+ 				break;	/* It has booted */
+ 			udelay(100);
+ 		}
+ 
+-		if (test_bit(cpu, &cpu_callin_map)) {
++		if (cpu_isset(cpu, cpu_callin_map)) {
+ 			/* number CPUs logically, starting from 1 (BSP is 0) */
+ 			Dprintk("OK.\n");
+ 			printk(KERN_INFO "CPU%d: ", cpu);
+@@ -663,7 +663,7 @@ static void __init do_boot_cpu (int apic
+ 		}
+ 	}
+ 	if (boot_error) {
+-		clear_bit(cpu, &cpu_callout_map); /* was set here (do_boot_cpu()) */
++		cpu_clear(cpu, cpu_callout_map); /* was set here (do_boot_cpu()) */
+ 		clear_bit(cpu, &cpu_initialized); /* was set by cpu_init() */
+ 		cpucount--;
+ 	}
+@@ -734,10 +734,10 @@ static void __init smp_boot_cpus(unsigne
+ 	current_thread_info()->cpu = 0;
+ 	smp_tune_scheduling();
+ 
+-	if (!test_bit(hard_smp_processor_id(), &phys_cpu_present_map)) {
++	if (!cpu_isset(hard_smp_processor_id(), phys_cpu_present_map)) {
+ 		printk("weird, boot CPU (#%d) not listed by the BIOS.\n",
+ 		       hard_smp_processor_id());
+-		phys_cpu_present_map |= (1 << hard_smp_processor_id());
++		cpu_set(hard_smp_processor_id(), phys_cpu_present_map);
+ 	}
+ 
+ 	/*
+@@ -747,8 +747,8 @@ static void __init smp_boot_cpus(unsigne
+ 	if (!smp_found_config) {
+ 		printk(KERN_NOTICE "SMP motherboard not detected.\n");
+ 		io_apic_irqs = 0;
+-		cpu_online_map = phys_cpu_present_map = 1;
+-		phys_cpu_present_map = 1;
++		cpu_online_map = cpumask_of_cpu(0);
++		phys_cpu_present_map = cpumask_of_cpu(0);
+ 		if (APIC_init_uniprocessor())
+ 			printk(KERN_NOTICE "Local APIC not detected."
+ 					   " Using dummy APIC emulation.\n");
+@@ -759,10 +759,10 @@ static void __init smp_boot_cpus(unsigne
+ 	 * Should not be necessary because the MP table should list the boot
+ 	 * CPU too, but we do it for the sake of robustness anyway.
+ 	 */
+-	if (!test_bit(boot_cpu_id, &phys_cpu_present_map)) {
++	if (!cpu_isset(boot_cpu_id, phys_cpu_present_map)) {
+ 		printk(KERN_NOTICE "weird, boot CPU (#%d) not listed by the BIOS.\n",
+ 								 boot_cpu_id);
+-		phys_cpu_present_map |= (1 << hard_smp_processor_id());
++		cpu_set(hard_smp_processor_id(), phys_cpu_present_map);
+ 	}
+ 
+ 	/*
+@@ -773,8 +773,8 @@ static void __init smp_boot_cpus(unsigne
+ 			boot_cpu_id);
+ 		printk(KERN_ERR "... forcing use of dummy APIC emulation. (tell your hw vendor)\n");
+ 		io_apic_irqs = 0;
+-		cpu_online_map = phys_cpu_present_map = 1;
+-		phys_cpu_present_map = 1;
++		cpu_online_map = cpumask_of_cpu(0);
++		phys_cpu_present_map = cpumask_of_cpu(0);
+ 		disable_apic = 1;
+ 		goto smp_done;
+ 	}
+@@ -788,8 +788,8 @@ static void __init smp_boot_cpus(unsigne
+ 		smp_found_config = 0;
+ 		printk(KERN_INFO "SMP mode deactivated, forcing use of dummy APIC emulation.\n");
+ 		io_apic_irqs = 0;
+-		cpu_online_map = phys_cpu_present_map = 1;
+-		phys_cpu_present_map = 1;
++		cpu_online_map = cpumask_of_cpu(0);
++		phys_cpu_present_map = cpumask_of_cpu(0);
+ 		disable_apic = 1;
+ 		goto smp_done;
+ 	}
+@@ -812,7 +812,7 @@ static void __init smp_boot_cpus(unsigne
+ 		if (apicid == boot_cpu_id)
+ 			continue;
+ 
+-		if (!(phys_cpu_present_map & (1 << apicid)))
++		if (!cpu_isset(apicid, phys_cpu_present_map))
+ 			continue;
+ 		if ((max_cpus >= 0) && (max_cpus <= cpucount+1))
+ 			continue;
+@@ -848,7 +848,7 @@ static void __init smp_boot_cpus(unsigne
+ 	} else {
+ 		unsigned long bogosum = 0;
+ 		for (cpu = 0; cpu < NR_CPUS; cpu++)
+-			if (cpu_callout_map & (1<<cpu))
++			if (cpu_isset(cpu, cpu_callout_map))
+ 				bogosum += cpu_data[cpu].loops_per_jiffy;
+ 		printk(KERN_INFO "Total of %d processors activated (%lu.%02lu BogoMIPS).\n",
+ 			cpucount+1,
+@@ -889,20 +889,20 @@ void __init smp_prepare_cpus(unsigned in
+ 
+ void __devinit smp_prepare_boot_cpu(void)
+ {
+-	set_bit(smp_processor_id(), &cpu_online_map);
+-	set_bit(smp_processor_id(), &cpu_callout_map);
++	cpu_set(smp_processor_id(), cpu_online_map);
++	cpu_set(smp_processor_id(), cpu_callout_map);
+ }
+ 
+ int __devinit __cpu_up(unsigned int cpu)
+ {
+ 	/* This only works at boot for x86.  See "rewrite" above. */
+-	if (test_bit(cpu, &smp_commenced_mask)) { 
++	if (cpu_isset(cpu, smp_commenced_mask)) {
+ 		local_irq_enable();
+ 		return -ENOSYS;
+ 	}
+ 
+ 	/* In case one didn't come up */
+-	if (!test_bit(cpu, &cpu_callin_map)) { 
++	if (!cpu_isset(cpu, cpu_callin_map)) {
+ 		local_irq_enable();
+ 		return -EIO;
+ 	}
+@@ -911,8 +911,8 @@ int __devinit __cpu_up(unsigned int cpu)
+ 	/* Unleash the CPU! */
+ 	Dprintk("waiting for cpu %d\n", cpu);
+ 
+-	set_bit(cpu, &smp_commenced_mask);
+-	while (!test_bit(cpu, &cpu_online_map))
++	cpu_set(cpu, smp_commenced_mask);
++	while (!cpu_isset(cpu, cpu_online_map))
+ 		mb();
+ 	return 0;
+ }
+--- linux-2.6.0-test1/arch/x86_64/kernel/smp.c	2003-06-14 12:18:04.000000000 -0700
++++ 25/arch/x86_64/kernel/smp.c	2003-07-19 17:04:07.000000000 -0700
+@@ -92,8 +92,9 @@ void send_IPI_self(int vector)
+ 	__send_IPI_shortcut(APIC_DEST_SELF, vector);
+ }
+ 
+-static inline void send_IPI_mask(int mask, int vector)
++static inline void send_IPI_mask(cpumask_t cpumask, int vector)
+ {
++	unsigned long mask = cpus_coerce(cpumask);
+ 	unsigned long cfg;
+ 	unsigned long flags;
+ 
+@@ -133,7 +134,7 @@ static inline void send_IPI_mask(int mas
+  *	Optimizations Manfred Spraul <manfred@colorfullife.com>
+  */
+ 
+-static volatile unsigned long flush_cpumask;
++static volatile cpumask_t flush_cpumask;
+ static struct mm_struct * flush_mm;
+ static unsigned long flush_va;
+ static spinlock_t tlbstate_lock = SPIN_LOCK_UNLOCKED;
+@@ -203,7 +204,7 @@ asmlinkage void smp_invalidate_interrupt
+ 
+ 	cpu = get_cpu();
+ 
+-	if (!test_bit(cpu, &flush_cpumask))
++	if (!cpu_isset(cpu, flush_cpumask))
+ 		goto out;
+ 		/* 
+ 		 * This was a BUG() but until someone can quote me the
+@@ -224,15 +225,16 @@ asmlinkage void smp_invalidate_interrupt
+ 			leave_mm(cpu);
+ 	}
+ 	ack_APIC_irq();
+-	clear_bit(cpu, &flush_cpumask);
++	cpu_clear(cpu, flush_cpumask);
+ 
+ out:
+ 	put_cpu_no_resched();
+ }
+ 
+-static void flush_tlb_others (unsigned long cpumask, struct mm_struct *mm,
++static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm,
+ 						unsigned long va)
+ {
++	cpumask_t tmp;
+ 	/*
+ 	 * A couple of (to be removed) sanity checks:
+ 	 *
+@@ -240,12 +242,10 @@ static void flush_tlb_others (unsigned l
+ 	 * - current CPU must not be in mask
+ 	 * - mask must exist :)
+ 	 */
+-	if (!cpumask)
+-		BUG();
+-	if ((cpumask & cpu_online_map) != cpumask)
+-		BUG();
+-	if (cpumask & (1 << smp_processor_id()))
+-		BUG();
++	BUG_ON(cpus_empty(cpumask));
++	cpus_and(tmp, cpumask, cpu_online_map);
++	BUG_ON(!cpus_equal(tmp, cpumask));
++	BUG_ON(cpu_isset(smp_processor_id(), cpumask));
+ 	if (!mm)
+ 		BUG();
+ 
+@@ -259,14 +259,15 @@ static void flush_tlb_others (unsigned l
+ 	
+ 	flush_mm = mm;
+ 	flush_va = va;
+-	atomic_set_mask(cpumask, &flush_cpumask);
++	cpus_or(flush_cpumask, cpumask, flush_cpumask);
++
+ 	/*
+ 	 * We have to send the IPI only to
+ 	 * CPUs affected.
+ 	 */
+ 	send_IPI_mask(cpumask, INVALIDATE_TLB_VECTOR);
+ 
+-	while (flush_cpumask)
++	while (!cpus_empty(flush_cpumask))
+ 		/* nothing. lockup detection does not belong here */;
+ 
+ 	flush_mm = NULL;
+@@ -277,23 +278,25 @@ static void flush_tlb_others (unsigned l
+ void flush_tlb_current_task(void)
+ {
+ 	struct mm_struct *mm = current->mm;
+-	unsigned long cpu_mask;
++	cpumask_t cpu_mask;
+ 
+ 	preempt_disable();
+-	cpu_mask = mm->cpu_vm_mask & ~(1UL << smp_processor_id());
++	cpu_mask = mm->cpu_vm_mask;
++	cpu_clear(smp_processor_id(), cpu_mask);
+ 
+ 	local_flush_tlb();
+-	if (cpu_mask)
++	if (!cpus_empty(cpu_mask))
+ 		flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
+ 	preempt_enable();
+ }
+ 
+ void flush_tlb_mm (struct mm_struct * mm)
+ {
+-	unsigned long cpu_mask;
++	cpumask_t cpu_mask;
+ 
+ 	preempt_disable();
+-	cpu_mask = mm->cpu_vm_mask & ~(1UL << smp_processor_id());
++	cpu_mask = mm->cpu_vm_mask;
++	cpu_clear(smp_processor_id(), cpu_mask);
+ 
+ 	if (current->active_mm == mm) {
+ 		if (current->mm)
+@@ -301,7 +304,7 @@ void flush_tlb_mm (struct mm_struct * mm
+ 		else
+ 			leave_mm(smp_processor_id());
+ 	}
+-	if (cpu_mask)
++	if (!cpus_empty(cpu_mask))
+ 		flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
+ 
+ 	preempt_enable();
+@@ -310,10 +313,11 @@ void flush_tlb_mm (struct mm_struct * mm
+ void flush_tlb_page(struct vm_area_struct * vma, unsigned long va)
+ {
+ 	struct mm_struct *mm = vma->vm_mm;
+-	unsigned long cpu_mask;
++	cpumask_t cpu_mask;
+ 
+ 	preempt_disable();
+-	cpu_mask = mm->cpu_vm_mask & ~(1UL << smp_processor_id());
++	cpu_mask = mm->cpu_vm_mask;
++	cpu_clear(smp_processor_id(), cpu_mask);
+ 
+ 	if (current->active_mm == mm) {
+ 		if(current->mm)
+@@ -322,7 +326,7 @@ void flush_tlb_page(struct vm_area_struc
+ 		 	leave_mm(smp_processor_id());
+ 	}
+ 
+-	if (cpu_mask)
++	if (!cpus_empty(cpu_mask))
+ 		flush_tlb_others(cpu_mask, mm, va);
+ 
+ 	preempt_enable();
+@@ -355,7 +359,7 @@ void smp_kdb_stop(void)
+ 
+ void smp_send_reschedule(int cpu)
+ {
+-	send_IPI_mask(1 << cpu, RESCHEDULE_VECTOR);
++	send_IPI_mask(cpumask_of_cpu(cpu), RESCHEDULE_VECTOR);
+ }
+ 
+ /*
+@@ -430,7 +434,7 @@ void smp_stop_cpu(void)
+ 	/*
+ 	 * Remove this CPU:
+ 	 */
+-	clear_bit(smp_processor_id(), &cpu_online_map);
++	cpu_clear(smp_processor_id(), cpu_online_map);
+ 	local_irq_disable();
+ 	disable_local_APIC();
+ 	local_irq_enable(); 
+@@ -491,8 +495,8 @@ int slow_smp_processor_id(void)
+ 	unsigned long sp = (unsigned long)&stack_location; 
+ 	int offset = 0, cpu;
+ 
+-	for (offset = 0; (cpu_online_map >> offset); offset = cpu + 1) { 
+-		cpu = ffz(~(cpu_online_map >> offset));
++	for (offset = 0; next_cpu(offset, cpu_online_map) < NR_CPUS; offset = cpu + 1) {
++		cpu = next_cpu(offset, cpu_online_map);
+ 
+ 		if (sp >= (u64)cpu_pda[cpu].irqstackptr - IRQSTACKSIZE && 
+ 		    sp <= (u64)cpu_pda[cpu].irqstackptr)
+--- linux-2.6.0-test1/arch/x86_64/mm/init.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/x86_64/mm/init.c	2003-07-19 17:03:49.000000000 -0700
+@@ -19,9 +19,6 @@
+ #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 <linux/proc_fs.h>
+--- linux-2.6.0-test1/arch/x86_64/mm/ioremap.c	2003-06-14 12:18:34.000000000 -0700
++++ 25/arch/x86_64/mm/ioremap.c	2003-07-19 17:07:16.000000000 -0700
+@@ -82,7 +82,7 @@ static int remap_area_pages(unsigned lon
+ 	spin_lock(&init_mm.page_table_lock);
+ 	do {
+ 		pmd_t *pmd;
+-		pmd = pmd_alloc(&init_mm, dir, address);
++		pmd = pmd_alloc_kernel(&init_mm, dir, address);
+ 		error = -ENOMEM;
+ 		if (!pmd)
+ 			break;
+--- linux-2.6.0-test1/arch/x86_64/mm/numa.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/x86_64/mm/numa.c	2003-07-19 17:03:49.000000000 -0700
+@@ -8,7 +8,6 @@
+ #include <linux/init.h>
+ #include <linux/bootmem.h>
+ #include <linux/mmzone.h>
+-#include <linux/blk.h>
+ #include <linux/ctype.h>
+ #include <asm/e820.h>
+ #include <asm/proto.h>
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/Documentation/fb/neofb.txt	2003-07-19 17:04:55.000000000 -0700
+@@ -0,0 +1,27 @@
++the neofb framebuffer driver supports the following Neomagic chipsets:
++
++NM2070 MagicGraph 128
++NM2090 MagicGraph 128V
++NM2093 MagicGraph 128ZV
++NM2097 MagicGraph 128ZV+
++NM2160 MagicGraph 128XD
++NM2200 MagicGraph 256AV
++NM2230 MagicGraph 256AV+
++NM2360 MagicGraph 256ZX
++NM2380 MagicGraph 256XL+
++
++with the following options:
++
++disabled	Disable this driver's initialization.
++internal	Enable output on internal LCD Display.
++external	Enable output on external CRT.
++nostretch	Disable stretching of modes smaller than LCD.
++nopciburst	Disable PCI burst mode.
++libretto	Force Libretto 100/110 800x480 LCD.
++picturebook	Force Picturebook 1024x480 LCD.
++
++at the boot prompt:
++	video=neofb:picturebook
++
++as a module:
++	modprobe neofb picturebook=1
+--- linux-2.6.0-test1/Documentation/filesystems/proc.txt	2003-06-26 22:07:24.000000000 -0700
++++ 25/Documentation/filesystems/proc.txt	2003-07-19 17:04:56.000000000 -0700
+@@ -222,6 +222,7 @@ Table 1-3: Kernel info in /proc 
+  partitions  Table of partitions known to the system           
+  pci	     Depreciated info of PCI bus (new way -> /proc/bus/pci/, 
+              decoupled by lspci					(2.4)
++ rcu	     Read-Copy Update information			(2.5)
+  rtc         Real time clock                                   
+  scsi        SCSI info (see text)                              
+  slabinfo    Slab pool info                                    
+@@ -346,6 +347,9 @@ available.  In this case, there are 0 ch
+ ZONE_DMA, 4 chunks of 2^1*PAGE_SIZE in ZONE_DMA, 101 chunks of 2^4*PAGE_SIZE 
+ available in ZONE_NORMAL, etc... 
+ 
++The rcu file gives information about Read-Copy Update synchronization
++primitive. It indicates the number for RCU requests and actual
++updates for every CPU.
+ 
+ 1.3 IDE devices in /proc/ide
+ ----------------------------
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/Documentation/i386/kgdb/andthen	2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,100 @@
++
++define	set_andthen
++	set var $thp=0
++	set var $thp=(struct kgdb_and_then_struct *)&kgdb_data[0]
++	set var $at_size = (sizeof kgdb_data)/(sizeof *$thp)
++	set var $at_oc=kgdb_and_then_count
++	set var $at_cc=$at_oc
++end
++
++define andthen_next
++	set var $at_cc=$arg0
++end
++
++define andthen
++	andthen_set_edge
++	if ($at_cc >= $at_oc)
++		printf "Outside window.  Window size is %d\n",($at_oc-$at_low)
++	else
++		printf "%d: ",$at_cc
++		output *($thp+($at_cc++ % $at_size ))
++		printf "\n"
++	end
++end
++define andthen_set_edge
++	set var $at_oc=kgdb_and_then_count
++	set var $at_low = $at_oc - $at_size
++	if ($at_low < 0 )
++		set var $at_low = 0
++	end
++	if (( $at_cc > $at_oc) || ($at_cc < $at_low))
++		printf "Count outside of window, setting count to "
++		if ($at_cc >= $at_oc)
++			set var $at_cc = $at_oc
++		else
++			set var $at_cc = $at_low
++		end
++		printf "%d\n",$at_cc
++	end
++end
++
++define beforethat
++	andthen_set_edge
++	if ($at_cc <= $at_low)
++		printf "Outside window.  Window size is %d\n",($at_oc-$at_low)
++	else
++		printf "%d: ",$at_cc-1
++		output *($thp+(--$at_cc % $at_size ))
++		printf "\n"
++	end
++end
++
++document andthen_next
++	andthen_next <count>
++	.	sets the number of the event to display next. If this event
++	.	is not in the event pool, either andthen or beforethat will
++	.	correct it to the nearest event pool edge.  The event pool
++	.	ends at the last event recorded and begins <number of events>
++	.	prior to that.  If beforethat is used next, it will display
++	.	event <count> -1.
++.
++	andthen commands are: set_andthen, andthen_next, andthen and beforethat
++end
++	
++			
++document andthen
++	andthen 
++.	displays the next event in the list.  <set_andthen> sets up to display
++.	the oldest saved event first. 
++.	<count> (optional) count of the event to display.
++.	note the number of events saved is specified at configure time.
++.	if events are saved between calls to andthen the index will change
++.	but the displayed event will be the next one (unless the event buffer
++.	is overrun).
++.
++.	andthen commands are: set_andthen, andthen_next, andthen and beforethat
++end
++
++document set_andthen
++	set_andthen
++.	sets up to use the <andthen> and <beforethat> commands. 
++.		if you have defined your own struct, use the above and
++.		then enter the following:
++.		p $thp=(struct kgdb_and_then_structX *)&kgdb_data[0]
++.		where <kgdb_and_then_structX> is the name of your structure.
++.
++.	andthen commands are: set_andthen, andthen_next, andthen and beforethat
++end
++
++document beforethat
++	beforethat 
++.	displays the next prior event in the list. <set_andthen> sets up to
++.	display the last occuring event first.
++.
++.	note the number of events saved is specified at configure time.
++.	if events are saved between calls to beforethat the index will change
++.	but the displayed event will be the next one (unless the event buffer
++.	is overrun).
++.
++.	andthen commands are: set_andthen, andthen_next, andthen and beforethat
++end
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/Documentation/i386/kgdb/debug-nmi.txt	2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,37 @@
++Subject: Debugging with NMI
++Date: Mon, 12 Jul 1999 11:28:31 -0500
++From: David Grothe <dave@gcom.com>
++Organization: Gcom, Inc
++To: David Grothe <dave@gcom.com>
++
++Kernel hackers:
++
++Maybe this is old hat, but it is new to me --
++
++On an ISA bus machine, if you short out the A1 and B1 pins of an ISA
++slot you will generate an NMI to the CPU.  This interrupts even a
++machine that is hung in a loop with interrupts disabled.  Used in
++conjunction with kgdb <
++ftp://ftp.gcom.com/pub/linux/src/kgdb-2.3.35/kgdb-2.3.35.tgz > you can
++gain debugger control of a machine that is hung in the kernel!  Even
++without kgdb the kernel will print a stack trace so you can find out
++where it was hung.
++
++The A1/B1 pins are directly opposite one another and the farthest pins
++towards the bracket end of the ISA bus socket.  You can stick a paper
++clip or multi-meter probe between them to short them out.
++
++I had a spare ISA bus to PC104 bus adapter around.  The PC104 end of the
++board consists of two rows of wire wrap pins.  So I wired a push button
++between the A1/B1 pins and now have an ISA board that I can stick into
++any ISA bus slot for debugger entry.
++
++Microsoft has a circuit diagram of a PCI card at
++http://www.microsoft.com/hwdev/DEBUGGING/DMPSW.HTM.  If you want to
++build one you will have to mail them and ask for the PAL equations.
++Nobody makes one comercially.
++
++[THIS TIP COMES WITH NO WARRANTY WHATSOEVER.  It works for me, but if
++your machine catches fire, it is your problem, not mine.]
++
++-- Dave (the kgdb guy)
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/Documentation/i386/kgdb/gdb-globals.txt	2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,71 @@
++Sender: akale@veritas.com
++Date: Fri, 23 Jun 2000 19:26:35 +0530
++From: "Amit S. Kale" <akale@veritas.com>
++Organization: Veritas Software (India)
++To: Dave Grothe <dave@gcom.com>, linux-kernel@vger.rutgers.edu
++CC: David Milburn <dmilburn@wirespeed.com>,
++        "Edouard G. Parmelan" <Edouard.Parmelan@quadratec.fr>,
++        ezannoni@cygnus.com, Keith Owens <kaos@ocs.com.au>
++Subject: Re: Module debugging using kgdb
++
++Dave Grothe wrote:
++> 
++> Amit:
++> 
++> There is a 2.4.0 version of kgdb on our ftp site:
++> ftp://ftp.gcom.com/pub/linux/src/kgdb.  I mirrored your version of gdb
++> and loadmodule.sh there.
++> 
++> Have a look at the README file and see if I go it right.  If not, send
++> me some corrections and I will update it.
++> 
++> Does your version of gdb solve the global variable problem?
++
++Yes. 
++Thanks to Elena Zanoni, gdb (developement version) can now calculate 
++correctly addresses  of dynamically loaded object files. I have not been 
++following gdb developement for sometime and am not sure when symbol
++address calculation fix is going to appear in a gdb stable version.
++
++Elena, any idea when the fix will make it to a prebuilt gdb from a
++redhat release?
++
++For the time being I have built a gdb developement version. It can be
++used for module debugging with loadmodule.sh script.
++
++The problem with calculating of module addresses with previous versions
++of gdb was as follows:
++gdb did not use base address of a section while calculating address of
++a symbol in the section in an object file loaded via 'add-symbol-file'. 
++It used address of .text segment instead. Due to this addresses of
++symbols in .data, .bss etc. (e.g. global variables) were calculated incorrectly.
++
++Above mentioned fix allow gdb to use base address of a segment while
++calculating address of a symbol in it. It adds a parameter '-s' to
++'add-symbol-file' command for specifying base address of a segment.
++
++loadmodule.sh script works as follows.
++
++1. Copy a module file to target machine.
++2. Load the module on the target machine using insmod with -m parameter.
++insmod produces a module load map which contains base addresses of all
++sections in the module and addresses of symbols in the module file.
++3. Find all sections and their base addresses in the module from 
++the module map.
++4. Generate a script that loads the module file. The script uses
++'add-symbol-file' and specifies address of text segment followed by
++addresses of all segments in the module.
++
++Here is an example gdb script produced by loadmodule.sh script.
++
++add-symbol-file foo 0xd082c060 -s .text.lock 0xd08cbfb5 
++-s .fixup 0xd08cfbdf -s .rodata 0xd08cfde0 -s __ex_table 0xd08e3b38 
++-s .data 0xd08e3d00 -s .bss 0xd08ec8c0 -s __ksymtab 0xd08ee838
++
++With this command gdb can calculate addresses of symbols in ANY segment
++in a module file.
++
++Regards.
++-- 
++Amit Kale
++Veritas Software ( http://www.veritas.com )
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/Documentation/i386/kgdb/gdbinit	2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,14 @@
++shell echo -e "\003" >/dev/ttyS0
++set remotebaud 38400
++target remote /dev/ttyS0
++define si
++stepi
++printf "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n", $eax, $ebx, $ecx, $edx
++printf "ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n", $esi, $edi, $ebp, $esp
++x/i $eip
++end
++define ni
++nexti
++printf "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n", $eax, $ebx, $ecx, $edx
++printf "ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n", $esi, $edi, $ebp, $esp
++x/i $eip
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/Documentation/i386/kgdb/gdbinit.hw	2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,117 @@
++
++#Using ia-32 hardware breakpoints.
++#
++#4 hardware breakpoints are available in ia-32 processors. These breakpoints
++#do not need code modification. They are set using debug registers.
++#
++#Each hardware breakpoint can be of one of the
++#three types: execution, write, access.
++#1. An Execution breakpoint is triggered when code at the breakpoint address is
++#executed.
++#2. A write breakpoint ( aka watchpoints ) is triggered when memory location
++#at the breakpoint address is written.
++#3. An access breakpoint is triggered when memory location at the breakpoint
++#address is either read or written.
++#
++#As hardware breakpoints are available in limited number, use software
++#breakpoints ( br command in gdb ) instead of execution hardware breakpoints.
++#
++#Length of an access or a write breakpoint defines length of the datatype to
++#be watched. Length is 1 for char, 2 short , 3 int.
++#
++#For placing execution, write and access breakpoints, use commands
++#hwebrk, hwwbrk, hwabrk
++#To remove a breakpoint use hwrmbrk command.
++#
++#These commands take following types of arguments. For arguments associated
++#with each command, use help command.
++#1. breakpointno: 0 to 3
++#2. length: 1 to 3
++#3. address: Memory location in hex ( without 0x ) e.g c015e9bc
++#
++#Use the command exinfo to find which hardware breakpoint occured.
++
++#hwebrk breakpointno address
++define hwebrk
++	maintenance packet Y$arg0,0,0,$arg1
++end
++document hwebrk
++	hwebrk <breakpointno> <address>
++	Places a hardware execution breakpoint
++	<breakpointno> = 0 - 3
++	<address> = Hex digits without leading "0x".
++end
++
++#hwwbrk breakpointno length address
++define hwwbrk
++	maintenance packet Y$arg0,1,$arg1,$arg2
++end
++document hwwbrk
++	hwwbrk <breakpointno> <length> <address>
++	Places a hardware write breakpoint
++	<breakpointno> = 0 - 3
++	<length> = 1 (1 byte), 2 (2 byte), 3 (4 byte)
++	<address> = Hex digits without leading "0x".
++end
++
++#hwabrk breakpointno length address
++define hwabrk
++	maintenance packet Y$arg0,1,$arg1,$arg2
++end
++document hwabrk
++	hwabrk <breakpointno> <length> <address>
++	Places a hardware access breakpoint
++	<breakpointno> = 0 - 3
++	<length> = 1 (1 byte), 2 (2 byte), 3 (4 byte)
++	<address> = Hex digits without leading "0x".
++end
++
++#hwrmbrk breakpointno
++define hwrmbrk
++	maintenance packet y$arg0
++end
++document hwrmbrk
++	hwrmbrk <breakpointno>
++	<breakpointno> = 0 - 3
++	Removes a hardware breakpoint
++end
++
++define reboot
++        maintenance packet r
++end
++#exinfo 
++define exinfo
++	maintenance packet qE
++end
++document exinfo
++	exinfo 
++	Gives information about a breakpoint.
++end
++define get_th
++	p $th=(struct thread_info *)((int)$esp & ~8191)
++end
++document get_th
++	get_tu
++	Gets and prints the current thread_info pointer, Defines th to be it.
++end
++define get_cu
++	p $cu=(struct thread_info *)((int)$esp & ~8191)->task
++end
++document get_cu
++	get_cu
++	Gets and print the "current" value.  Defines $cu to be it.
++end
++define int_off
++	set var $flags=$eflags
++	set $eflags=$eflags&~0x200
++	end
++define int_on
++	set var $eflags|=$flags&0x200
++	end
++document int_off
++	saves the current interrupt state and clears the processor interrupt 
++	flag.  Use int_on to restore the saved flag.
++end
++document int_on
++	Restores the interrupt flag saved by int_off.
++end
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/Documentation/i386/kgdb/gdbinit-modules	2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,146 @@
++#
++# Usefull GDB user-command to debug Linux Kernel Modules with gdbstub.
++#
++# This don't work for Linux-2.0 or older.
++#
++# Author Edouard G. Parmelan <Edouard.Parmelan@quadratec.fr>
++#
++#
++# Fri Apr 30 20:33:29 CEST 1999
++#   First public release.
++#
++#   Major cleanup after experiment Linux-2.0 kernel without success.
++#   Symbols of a module are not in the correct order, I can't explain
++#   why :(
++#
++# Fri Mar 19 15:41:40 CET 1999
++#   Initial version.
++#
++# Thu Jan  6 16:29:03 CST 2000
++#   A little fixing by Dave Grothe <dave@gcom.com>
++#
++# Mon Jun 19 09:33:13 CDT 2000
++#   Alignment changes from Edouard Parmelan
++#
++# The basic idea is to find where insmod load the module and inform
++# GDB to load the symbol table of the module with the GDB command 
++# ``add-symbol-file <object> <address>''.
++#
++# The Linux kernel holds the list of all loaded modules in module_list,
++# this list end with &kernel_module (exactly with module->next == NULL,
++# but the last module is not a real module).
++#
++# Insmod allocates the struct module before the object file.  Since
++# Linux-2.1, this structure contain his size.  The real address of
++# the object file is then (char*)module + module->size_of_struct.
++#
++# You can use three user functions ``mod-list'', ``mod-print-symbols''
++# and ``add-module-symbols''.
++#
++# mod-list list all loaded modules with the format:
++#    <module-address> <module-name>
++#
++# As soon as you have found the address of your module, you can
++# print its exported symbols (mod-print-symbols) or inform GDB to add
++# symbols from your module file (mod-add-symbols).
++#
++# The argument that you give to mod-print-symbols or mod-add-symbols
++# is the <module-address> from the mod-list command.
++#
++# When using the mod-add-symbols command you must also give the full
++# pathname of the modules object code file.
++#
++# The command mod-add-lis is an example of how to make this easier.
++# You can edit this macro to contain the path name of your own
++# favorite module and then use it as a shorthand to load it.  You
++# still need the module-address, however.
++#
++# The internal function ``mod-validate'' set the GDB variable $mod
++# as a ``struct module*'' if the kernel known the module otherwise
++# $mod is set to NULL.  This ensure to not add symbols for a wrong
++# address.
++# 
++# Have a nice hacking day !
++#
++#
++define mod-list
++    set $mod = (struct module*)module_list
++    # the last module is the kernel, ignore it
++    while $mod != &kernel_module
++    	printf "%p\t%s\n", (long)$mod, ($mod)->name
++	set $mod = $mod->next
++    end
++end
++document mod-list
++List all modules in the form: <module-address> <module-name>
++Use the <module-address> as the argument for the other
++mod-commands: mod-print-symbols, mod-add-symbols.
++end
++
++define mod-validate
++    set $mod = (struct module*)module_list
++    while ($mod != $arg0) && ($mod != &kernel_module)
++    	set $mod = $mod->next
++    end
++    if $mod == &kernel_module
++	set $mod = 0
++    	printf "%p is not a module\n", $arg0
++    end
++end
++document mod-validate
++mod-validate <module-address>
++Internal user-command used to validate the module parameter.
++If <module> is a real loaded module, set $mod to it otherwise set $mod to 0.
++end
++
++
++define mod-print-symbols
++    mod-validate $arg0
++    if $mod != 0
++	set $i = 0
++	while $i < $mod->nsyms
++	    set $sym = $mod->syms[$i]
++	    printf "%p\t%s\n", $sym->value, $sym->name
++	    set $i = $i + 1
++	end
++    end
++end
++document mod-print-symbols
++mod-print-symbols <module-address>
++Print all exported symbols of the module.  see mod-list
++end
++
++
++define mod-add-symbols-align
++    mod-validate $arg0
++    if $mod != 0
++	set $mod_base = ($mod->size_of_struct + (long)$mod)
++	if ($arg2 != 0) && (($mod_base & ($arg2 - 1)) != 0)
++	    set $mod_base = ($mod_base | ($arg2 - 1)) + 1
++	end
++	add-symbol-file $arg1 $mod_base
++    end
++end
++document mod-add-symbols-align
++mod-add-symbols-align <module-address> <object file path name> <align>
++Load the symbols table of the module from the object file where
++first section aligment is <align>.
++To retreive alignment, use `objdump -h <object file path name>'.
++end
++
++define mod-add-symbols
++    mod-add-symbols-align $arg0 $arg1 sizeof(long)
++end
++document mod-add-symbols
++mod-add-symbols <module-address> <object file path name>
++Load the symbols table of the module from the object file.
++Default alignment is 4.  See mod-add-symbols-align.
++end
++
++define mod-add-lis
++    mod-add-symbols-align $arg0 /usr/src/LiS/streams.o 16
++end
++document mod-add-lis
++mod-add-lis <module-address>
++Does mod-add-symbols <module-address> /usr/src/LiS/streams.o
++end
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/Documentation/i386/kgdb/kgdb.txt	2003-07-19 17:04:05.000000000 -0700
+@@ -0,0 +1,716 @@
++Last edit: <20030506.1615.42>
++This file has information specific to the i386 kgdb option.  Other
++platforms with the kgdb option may behave in a similar fashion.
++
++New features: 
++============
++20030505.1827.27
++We are starting to align with the sourceforge version, at least in 
++commands.  To this end, the boot command string to start kgdb at
++boot time has been changed from "kgdb" to "gdb".
++
++Andrew Morton sent a couple of patches which are now included as follows:
++1.) We now return a flag to the interrupt handler.
++2.) We no longer use smp_num_cpus (a conflict with the lock meter).
++3.) And from William Lee Irwin III <wli@holomorphy.com> code to make
++    sure high-mem is set up before we attempt to register our interrupt
++    handler.
++We now include asm/kgdb.h from config.h so you will most likely never
++have to include it.  It also 'NULLS' the kgdb macros you might have in
++your code when CONFIG_KGDB is not defined.  This allows you to just
++turn off CONFIG_KGDB to turn off all the kgdb_ts() calls and such.
++This include is conditioned on the machine being an x86 so as to not
++mess with other archs.
++
++20020801.1129.03
++This is currently the version for the 2.4.18 (and beyond?) kernel.
++
++We have several new "features" beginning with this version:
++ 
++1.) Kgdb now syncs the "other" CPUs with a cross-CPU NMI.  No more
++    waiting and it will pull that guy out of an IRQ off spin lock :)
++
++2.) We doctored up the code that tells where a task is waiting and
++    included it so that the "info thread" command will show a bit more
++    than "schedule()".  Try it...
++
++3.) Added the ability to call a function from gdb.  All the standard gdb
++    issues apply, i.e. if you hit a breakpoint in the function, you are
++    not allowed to call another (gdb limitation, not kgdb).  To help
++    this capability we added a memory allocation function.  Gdb does not
++    return this memory (it is used for strings that you pass to that function
++    you are calling from gdb) so we fixed up a way to allow you to
++    manually return the memory (see below).
++
++4.) Kgdb time stamps (kgdb_ts()) are enhanced to expand what was the
++    interrupt flag to now also include the preemption count and the
++    "in_interrupt" info.  The flag is now called "with_pif" to indicate
++    the order, preempt_count, in_interrupt, flag.  The preempt_count is
++    shifted left by 4 bits so you can read the count in hex by dropping
++    the low order digit.  In_interrupt is in bit 1, and the flag is in
++    bit 0.
++
++5.) The command: "p kgdb_info" is now expanded and prints something
++    like:
++(gdb) p kgdb_info
++$2 = {used_malloc = 0, called_from = 0xc0107506, entry_tsc = 67468627259, 
++  errcode = 0, vector = 3, print_debug_info = 0, hold_on_sstep = 1, 
++  cpus_waiting = {{task = 0xc027a000, pid = 32768, hold = 0, 
++      regs = 0xc027bf84}, {task = 0x0, pid = 0, hold = 0, regs = 0x0}}}
++    
++    Things to note here: a.) used_malloc is the amount of memory that
++    has been malloc'ed to do calls from gdb.  You can reclaim this
++    memory like this: "p kgdb_info.used_malloc=0" Cool, huh?  b.)
++    cpus_waiting is now "sized" by the number of CPUs you enter at
++    configure time in the kgdb configure section.  This is NOT used
++    anywhere else in the system, but it is "nice" here.  c.)  The task's
++    "pid" is now in the structure.  This is the pid you will need to use
++    to decode to the thread id to get gdb to look at that thread.
++    Remember that the "info thread" command prints a list of threads
++    wherein it numbers each thread with its reference number followed
++    by the thread's pid.  Note that the per-CPU idle threads actually
++    have pids of 0 (yes, there is more than one pid 0 in an SMP system).
++    To avoid confusion, kgdb numbers these threads with numbers beyond
++    the MAX_PID.  That is why you see 32768 and above.
++
++6.) A subtle change, we now provide the complete register set for tasks
++    that are active on the other CPUs.  This allows better trace back on
++    those tasks.
++
++    And, let's mention what we could not fix.  Back-trace from all but the
++    thread that we trapped will, most likely, have a bogus entry in it.
++    The problem is that gdb does not recognize the entry code for
++    functions that use "current" near (at all?) the entry.  The compiler
++    is putting the "current" decode as the first two instructions of the
++    function where gdb expects to find %ebp changing code.  Back trace
++    also has trouble with interrupt frames.  I am talking with Daniel
++    Jacobowitz about some way to fix this, but don't hold your breath.
++
++20011220.0050.35
++Major enhancement with this version is the ability to hold one or more
++CPUs in an SMP system while allowing the others to continue.  Also, by
++default only the current CPU is enabled on single-step commands (please
++note that gdb issues single-step commands at times other than when you
++use the si command).
++ 
++Another change is to collect some useful information in
++a global structure called "kgdb_info".  You should be able to just:
++
++p kgdb_info
++
++although I have seen cases where the first time this is done gdb just
++prints the first member but prints the whole structure if you then enter
++CR (carriage return or enter).  This also works:
++
++p *&kgdb_info
++
++Here is a sample:
++(gdb) p kgdb_info
++$4 = {called_from = 0xc010732c, entry_tsc = 32804123790856, errcode = 0, 
++  vector = 3, print_debug_info = 0}
++
++"Called_from" is the return address from the current entry into kgdb.  
++Sometimes it is useful to know why you are in kgdb, for example, was 
++it an NMI or a real breakpoint?  The simple way to interrogate this
++return address is:
++
++l *0xc010732c
++
++which will print the surrounding few lines of source code.
++
++"Entry_tsc" is the CPU TSC on entry to kgdb (useful to compare to the
++kgdb_ts entries).
++
++"errcode" and "vector" are other entry parameters which may be helpful on
++some traps.
++
++"print_debug_info" is the internal debugging kgdb print enable flag.  Yes,
++you can modify it.
++
++In SMP systems kgdb_info also includes the "cpus_waiting" structure and
++"hold_on_step": 
++
++(gdb) p kgdb_info
++$7 = {called_from = 0xc0112739, entry_tsc = 1034936624074, errcode = 0, 
++  vector = 2, print_debug_info = 0, hold_on_sstep = 1, cpus_waiting = {{
++      task = 0x0, hold = 0, regs = 0x0}, {task = 0xc71b8000, hold = 0, 
++      regs = 0xc71b9f70}, {task = 0x0, hold = 0, regs = 0x0}, {task = 0x0, 
++      hold = 0, regs = 0x0}, {task = 0x0, hold = 0, regs = 0x0}, {task = 0x0, 
++      hold = 0, regs = 0x0}, {task = 0x0, hold = 0, regs = 0x0}, {task = 0x0, 
++      hold = 0, regs = 0x0}}}
++
++"Cpus_waiting" has an entry for each CPU other than the current one that
++has been stopped.  Each entry contains the task_struct address for that
++CPU, the address of the regs for that task and a hold flag.  All these
++have the proper typing so that, for example:
++
++p *kgdb_info.cpus_waiting[1].regs
++
++will print the registers for CPU 1.
++
++"Hold_on_sstep" is a new feature with this version and comes up set or
++true.  What this means is that whenever kgdb is asked to single-step all
++other CPUs are held (i.e. not allowed to execute).  The flag applies to
++all but the current CPU and, again, can be changed:
++
++p kgdb_info.hold_on_sstep=0
++
++restores the old behavior of letting all CPUs run during single-stepping.
++
++Likewise, each CPU has a "hold" flag, which if set, locks that CPU out
++of execution.  Note that this has some risk in cases where the CPUs need
++to communicate with each other.  If kgdb finds no CPU available on exit,
++it will push a message thru gdb and stay in kgdb.  Note that it is legal
++to hold the current CPU as long as at least one CPU can execute.
++
++20010621.1117.09
++This version implements an event queue.  Events are signaled by calling
++a function in the kgdb stub and may be examined from gdb.  See EVENTS 
++below for details.  This version also tightens up the interrupt and SMP
++handling to not allow interrupts on the way to kgdb from a breakpoint 
++trap.  It is fine to allow these interrupts for user code, but not
++system debugging.
++
++Version
++=======
++
++This version of the kgdb package was developed and tested on
++kernel version 2.4.16.  It will not install on any earlier kernels.  
++It is possible that it will continue to work on later versions
++of 2.4 and then versions of 2.5 (I hope).
++
++
++Debugging Setup
++===============
++
++Designate one machine as the "development" machine.  This is the
++machine on which you run your compiles and which has your source
++code for the kernel.  Designate a second machine as the "target"
++machine.  This is the machine that will run your experimental
++kernel.
++
++The two machines will be connected together via a serial line out
++one or the other of the COM ports of the PC.  You will need the
++appropriate modem eliminator (null modem) cable(s) for this.
++
++Decide on which tty port you want the machines to communicate, then
++connect them up back-to-back using the null modem cable.  COM1 is
++/dev/ttyS0 and COM2 is /dev/ttyS1. You should test this connection
++with the two machines prior to trying to debug a kernel.  Once you
++have it working, on the TARGET machine, enter:
++
++setserial /dev/ttyS0 (or what ever tty you are using)
++
++and record the port address and the IRQ number.
++
++On the DEVELOPMENT machine you need to apply the patch for the kgdb
++hooks.  You have probably already done that if you are reading this
++file.
++
++On your DEVELOPMENT machine, go to your kernel source directory and do
++"make Xconfig" where X is one of "x", "menu", or "".  If you are
++configuring in the standard serial driver, it must not be a module.
++Either yes or no is ok, but making the serial driver a module means it
++will initialize after kgdb has set up the UART interrupt code and may
++cause a failure of the control-C option discussed below.  The configure
++question for the serial driver is under the "Character devices" heading
++and is:
++
++"Standard/generic (8250/16550 and compatible UARTs) serial support"
++
++Go down to the kernel debugging menu item and open it up.  Enable the
++kernel kgdb stub code by selecting that item.  You can also choose to
++turn on the "-ggdb -O1" compile options.  The -ggdb causes the compiler
++to put more debug info (like local symbols) in the object file.  On the
++i386 -g and -ggdb are the same so this option just reduces to "O1".  The
++-O1 reduces the optimization level.  This may be helpful in some cases,
++be aware, however, that this may also mask the problem you are looking
++for.
++
++The baud rate.  Default is 115200.  What ever you choose be sure that
++the host machine is set to the same speed.  I recommend the default.
++
++The port.  This is the I/O address of the serial UART that you should
++have gotten using setserial as described above.  The standard COM1 port
++(3f8) using IRQ 4 is default.  COM2 is 2f8 which by convention uses IRQ
++3.
++
++The port IRQ (see above).
++
++Stack overflow test.  This option makes a minor change in the trap,
++system call and interrupt code to detect stack overflow and transfer
++control to kgdb if it happens.  (Some platforms have this in the
++baseline code, but the i386 does not.)
++
++You can also configure the system to recognize the boot option
++"console=kgdb" which if given will cause all console output during
++booting to be put thru gdb as well as other consoles.  This option
++requires that gdb and kgdb be connected prior to sending console output
++so, if they are not, a breakpoint is executed to force the connection.
++This will happen before any kernel output (it is going thru gdb, right),
++and will stall the boot until the connection is made.
++
++You can also configure in a patch to SysRq to enable the kGdb SysRq.
++This request generates a breakpoint.  Since the serial port IRQ line is
++set up after any serial drivers, it is possible that this command will
++work when the control-C will not.
++
++Save and exit the Xconfig program.  Then do "make clean" , "make dep"
++and "make bzImage" (or whatever target you want to make).  This gets the
++kernel compiled with the "-g" option set -- necessary for debugging.
++
++You have just built the kernel on your DEVELOPMENT machine that you
++intend to run on your TARGET machine.
++
++To install this new kernel, use the following installation procedure.
++Remember, you are on the DEVELOPMENT machine patching the kernel source
++for the kernel that you intend to run on the TARGET machine.
++
++Copy this kernel to your target machine using your usual procedures.  I
++usually arrange to copy development:
++/usr/src/linux/arch/i386/boot/bzImage to /vmlinuz on the TARGET machine
++via a LAN based NFS access.  That is, I run the cp command on the target
++and copy from the development machine via the LAN.  Run Lilo (see "man
++lilo" for details on how to set this up) on the new kernel on the target
++machine so that it will boot!  Then boot the kernel on the target
++machine.
++
++On the DEVELOPMENT machine, create a file called .gdbinit in the
++directory /usr/src/linux.  An example .gdbinit file looks like this:
++
++shell echo -e "\003" >/dev/ttyS0
++set remotebaud 38400 (or what ever speed you have chosen)
++target remote /dev/ttyS0
++
++
++Change the "echo" and "target" definition so that it specifies the tty
++port that you intend to use.  Change the "remotebaud" definition to
++match the data rate that you are going to use for the com line.
++
++You are now ready to try it out.
++
++Boot your target machine with "kgdb" in the boot command i.e. something
++like:
++
++lilo> test kgdb
++
++or if you also want console output thru gdb:
++
++lilo> test kgdb console=kgdb
++
++You should see the lilo message saying it has loaded the kernel and then
++all output stops.  The kgdb stub is trying to connect with gdb.  Start
++gdb something like this:
++
++
++On your DEVELOPMENT machine, cd /usr/src/linux and enter "gdb vmlinux".
++When gdb gets the symbols loaded it will read your .gdbinit file and, if
++everything is working correctly, you should see gdb print out a few
++lines indicating that a breakpoint has been taken.  It will actually
++show a line of code in the target kernel inside the kgdb activation
++code.
++
++The gdb interaction should look something like this:
++
++    linux-dev:/usr/src/linux# gdb vmlinux
++    GDB is free software and you are welcome to distribute copies of it
++     under certain conditions; type "show copying" to see the conditions.
++    There is absolutely no warranty for GDB; type "show warranty" for details.
++    GDB 4.15.1 (i486-slackware-linux), 
++    Copyright 1995 Free Software Foundation, Inc...
++    breakpoint () at i386-stub.c:750
++    750     }
++    (gdb) 
++
++You can now use whatever gdb commands you like to set breakpoints.
++Enter "continue" to start your target machine executing again.  At this
++point the target system will run at full speed until it encounters
++your breakpoint or gets a segment violation in the kernel, or whatever.
++
++If you have the kgdb console enabled when you continue, gdb will print
++out all the console messages.
++
++The above example caused a breakpoint relatively early in the boot
++process.  For the i386 kgdb it is possible to code a break instruction
++as the first C-language point in init/main.c, i.e. as the first instruction
++in start_kernel().  This could be done as follows:
++
++#include <asm/kgdb.h>
++	 breakpoint();
++
++This breakpoint() is really a function that sets up the breakpoint and
++single-step hardware trap cells and then executes a breakpoint.  Any
++early hard coded breakpoint will need to use this function.  Once the
++trap cells are set up they need not be set again, but doing it again
++does not hurt anything, so you don't need to be concerned about which
++breakpoint is hit first.  Once the trap cells are set up (and the kernel
++sets them up in due course even if breakpoint() is never called) the
++macro:
++
++BREAKPOINT;
++
++will generate an inline breakpoint.  This may be more useful as it stops
++the processor at the instruction instead of in a function a step removed
++from the location of interest.  In either case <asm/kgdb.h> must be
++included to define both breakpoint() and BREAKPOINT.
++
++Triggering kgdbstub at other times
++==================================
++
++Often you don't need to enter the debugger until much later in the boot
++or even after the machine has been running for some time.  Once the
++kernel is booted and interrupts are on, you can force the system to
++enter the debugger by sending a control-C to the debug port. This is
++what the first line of the recommended .gdbinit file does.  This allows
++you to start gdb any time after the system is up as well as when the
++system is already at a breakpoint.  (In the case where the system is
++already at a breakpoint the control-C is not needed, however, it will
++be ignored by the target so no harm is done.  Also note the the echo
++command assumes that the port speed is already set.  This will be true
++once gdb has connected, but it is best to set the port speed before you
++run gdb.)
++
++Another simple way to do this is to put the following file in you ~/bin
++directory:
++
++#!/bin/bash
++echo  -e "\003"  > /dev/ttyS0 
++
++Here, the ttyS0 should be replaced with what ever port you are using.
++The "\003" is control-C.  Once you are connected with gdb, you can enter
++control-C at the command prompt.
++
++An alternative way to get control to the debugger is to enable the kGdb
++SysRq command.  Then you would enter Alt-SysRq-g (all three keys at the
++same time, but push them down in the order given).  To refresh your
++memory of the available SysRq commands try Alt-SysRq-=.  Actually any
++undefined command could replace the "=", but I like to KNOW that what I
++am pushing will never be defined.
++ 
++Debugging hints
++===============
++
++You can break into the target machine at any time from the development
++machine by typing ^C (see above paragraph).  If the target machine has
++interrupts enabled this will stop it in the kernel and enter the
++debugger.
++
++There is unfortunately no way of breaking into the kernel if it is
++in a loop with interrupts disabled, so if this happens to you then
++you need to place exploratory breakpoints or printk's into the kernel
++to find out where it is looping.  The exploratory breakpoints can be
++entered either thru gdb or hard coded into the source.  This is very
++handy if you do something like:
++
++if (<it hurts>) BREAKPOINT;
++
++
++There is a copy of an e-mail in the Documentation/i386/kgdb/ directory
++(debug-nmi.txt) which describes how to create an NMI on an ISA bus
++machine using a paper clip.  I have a sophisticated version of this made
++by wiring a push button switch into a PC104/ISA bus adapter card.  The
++adapter card nicely furnishes wire wrap pins for all the ISA bus
++signals.
++
++When you are done debugging the kernel on the target machine it is a
++good idea to leave it in a running state.  This makes reboots faster,
++bypassing the fsck.  So do a gdb "continue" as the last gdb command if
++this is possible.  To terminate gdb itself on the development machine
++and leave the target machine running, first clear all breakpoints and
++continue, then type ^Z to suspend gdb and then kill it with "kill %1" or
++something similar.
++
++If gdbstub Does Not Work
++========================
++
++If it doesn't work, you will have to troubleshoot it.  Do the easy
++things first like double checking your cabling and data rates.  You
++might try some non-kernel based programs to see if the back-to-back
++connection works properly.  Just something simple like cat /etc/hosts
++>/dev/ttyS0 on one machine and cat /dev/ttyS0 on the other will tell you
++if you can send data from one machine to the other.  Make sure it works
++in both directions.  There is no point in tearing out your hair in the
++kernel if the line doesn't work.
++
++All of the real action takes place in the file
++/usr/src/linux/arch/i386/kernel/kgdb_stub.c.  That is the code on the target
++machine that interacts with gdb on the development machine.  In gdb you can
++turn on a debug switch with the following command:
++
++	set remotedebug
++
++This will print out the protocol messages that gdb is exchanging with
++the target machine.
++
++Another place to look is /usr/src/arch/i386/lib/kgdb_serial.c. This is
++the code that talks to the serial port on the target side.  There might
++be a problem there.  In particular there is a section of this code that
++tests the UART which will tell you what UART you have if you define
++"PRNT" (just remove "_off" from the #define PRNT_off).  To view this
++report you will need to boot the system without any beakpoints.  This
++allows the kernel to run to the point where it calls kgdb to set up
++interrupts.  At this time kgdb will test the UART and print out the type
++it finds.  (You need to wait so that the printks are actually being
++printed.  Early in the boot they are cached, waiting for the console to
++be enabled.  Also, if kgdb is entered thru a breakpoint it is possible
++to cause a dead lock by calling printk when the console is locked.  The
++stub thus avoids doing printks from breakpoints, especially in the
++serial code.)  At this time, if the UART fails to do the expected thing,
++kgdb will print out (using printk) information on what failed.  (These
++messages will be buried in all the other boot up messages.  Look for
++lines that start with "gdb_hook_interrupt:".  You may want to use dmesg
++once the system is up to view the log.  If this fails or if you still
++don't connect, review your answers for the port address.  Use:
++
++setserial /dev/ttyS0 
++
++to get the current port and IRQ information.  This command will also
++tell you what the system found for the UART type. The stub recognizes
++the following UART types:
++
++16450, 16550, and 16550A
++
++If you are really desperate you can use printk debugging in the
++kgdbstub code in the target kernel until you get it working.  In particular,
++there is a global variable in /usr/src/linux/arch/i386/kernel/kgdb_stub.c
++named "remote_debug".  Compile your kernel with this set to 1, rather
++than 0 and the debug stub will print out lots of stuff as it does
++what it does.  Likewise there are debug printks in the kgdb_serial.c
++code that can be turned on with simple changes in the macro defines.
++
++
++Debugging Loadable Modules
++==========================
++
++This technique comes courtesy of Edouard Parmelan
++<Edouard.Parmelan@quadratec.fr>
++
++When you run gdb, enter the command
++
++source gdbinit-modules
++
++This will read in a file of gdb macros that was installed in your
++kernel source directory when kgdb was installed.  This file implements
++the following commands:
++
++mod-list
++    Lists the loaded modules in the form <module-address> <module-name>
++
++mod-print-symbols <module-address>
++    Prints all the symbols in the indicated module.
++
++mod-add-symbols <module-address> <object-file-path-name>
++    Loads the symbols from the object file and associates them
++    with the indicated module.
++
++After you have loaded the module that you want to debug, use the command
++mod-list to find the <module-address> of your module.  Then use that
++address in the mod-add-symbols command to load your module's symbols.
++From that point onward you can debug your module as if it were a part
++of the kernel.
++
++The file gdbinit-modules also contains a command named mod-add-lis as
++an example of how to construct a command of your own to load your
++favorite module.  The idea is to "can" the pathname of the module
++in the command so you don't have to type so much.
++
++Threads
++=======
++
++Each process in a target machine is seen as a gdb thread. gdb thread
++related commands (info threads, thread n) can be used.
++
++ia-32 hardware breakpoints
++==========================
++
++kgdb stub contains support for hardware breakpoints using debugging features
++of ia-32(x86) processors. These breakpoints do not need code modification.
++They use debugging registers. 4 hardware breakpoints are available in ia-32
++processors.
++
++Each hardware breakpoint can be of one of the following three types.
++
++1. Execution breakpoint - An Execution breakpoint is triggered when code
++	at the breakpoint address is executed.
++
++	As limited number of hardware breakpoints are available, it is
++	advisable to use software breakpoints ( break command ) instead
++	of execution hardware breakpoints, unless modification of code
++	is to be avoided.
++
++2. Write breakpoint - A write breakpoint is triggered when memory
++	location at the breakpoint address is written.
++
++	A write or can be placed for data of variable length. Length of
++	a write breakpoint indicates length of the datatype to be
++	watched. Length is 1 for 1 byte data , 2 for 2 byte data, 3 for
++	4 byte data.
++
++3. Access breakpoint - An access breakpoint is triggered when memory
++	location at the breakpoint address is either read or written.
++
++	Access breakpoints also have lengths similar to write breakpoints.
++
++IO breakpoints in ia-32 are not supported.
++
++Since gdb stub at present does not use the protocol used by gdb for hardware
++breakpoints, hardware breakpoints are accessed through gdb macros. gdb macros
++for hardware breakpoints are described below.
++
++hwebrk	- Places an execution breakpoint
++	hwebrk breakpointno address
++hwwbrk	- Places a write breakpoint
++	hwwbrk breakpointno length address
++hwabrk	- Places an access breakpoint
++	hwabrk breakpointno length address
++hwrmbrk	- Removes a breakpoint
++	hwrmbrk breakpointno
++exinfo	- Tells whether a software or hardware breakpoint has occurred.
++	Prints number of the hardware breakpoint if a hardware breakpoint has
++	occurred.
++
++Arguments required by these commands are as follows
++breakpointno	- 0 to 3
++length		- 1 to 3
++address		- Memory location in hex digits ( without 0x ) e.g c015e9bc
++
++SMP support
++==========
++
++When a breakpoint occurs or user issues a break ( Ctrl + C ) to gdb
++client, all the processors are forced to enter the debugger. Current
++thread corresponds to the thread running on the processor where
++breakpoint occurred.  Threads running on other processor(s) appear
++similar to other non-running threads in the 'info threads' output.
++Within the kgdb stub there is a structure "waiting_cpus" in which kgdb
++records the values of "current" and "regs" for each CPU other than the
++one that hit the breakpoint.  "current" is a pointer to the task
++structure for the task that CPU is running, while "regs" points to the
++saved registers for the task.  This structure can be examined with the
++gdb "p" command.
++
++ia-32 hardware debugging registers on all processors are set to same
++values.  Hence any hardware breakpoints may occur on any processor.
++
++gdb troubleshooting
++===================
++
++1. gdb hangs
++Kill it. restart gdb. Connect to target machine.
++
++2. gdb cannot connect to target machine (after killing a gdb and
++restarting another) If the target machine was not inside debugger when
++you killed gdb, gdb cannot connect because the target machine won't
++respond.  In this case echo "Ctrl+C"(ASCII 3) to the serial line.
++e.g. echo -e "\003" > /dev/ttyS1
++This forces that target machine into the debugger, after which you
++can connect.
++
++3. gdb cannot connect even after echoing Ctrl+C into serial line
++Try changing serial line settings min to 1 and time to 0
++e.g. stty min 1 time 0 < /dev/ttyS1
++Try echoing again
++
++Check serial line speed and set it to correct value if required
++e.g. stty ispeed 115200 ospeed 115200 < /dev/ttyS1
++
++EVENTS
++======
++
++Ever want to know the order of things happening?  Which CPU did what and
++when?  How did the spinlock get the way it is?  Then events are for
++you.  Events are defined by calls to an event collection interface and
++saved for later examination.  In this case, kgdb events are saved by a
++very fast bit of code in kgdb which is fully SMP and interrupt protected
++and they are examined by using gdb to display them.  Kgdb keeps only
++the last N events, where N must be a power of two and is defined at
++configure time.
++
++
++Events are signaled to kgdb by calling:
++
++kgdb_ts(data0,data1)
++
++For each call kgdb records each call in an array along with other info.
++Here is the array definition:
++
++struct kgdb_and_then_struct {
++#ifdef CONFIG_SMP
++	int	on_cpu;
++#endif
++	long long at_time;
++	int  	from_ln;
++	char	* in_src;
++	void	*from;
++        int     with_if;
++	int	data0;
++	int	data1;
++};
++
++For SMP machines the CPU is recorded, for all machines the TSC is
++recorded (gets a time stamp) as well as the line number and source file
++the call was made from.  The address of the (from), the "if" (interrupt
++flag) and the two data items are also recorded.  The macro kgdb_ts casts
++the types to int, so you can put any 32-bit values here.  There is a
++configure option to select the number of events you want to keep.  A
++nice number might be 128, but you can keep up to 1024 if you want.  The
++number must be a power of two.  An "andthen" macro library is provided
++for gdb to help you look at these events.  It is also possible to define
++a different structure for the event storage and cast the data to this
++structure.  For example the following structure is defined in kgdb:
++
++struct kgdb_and_then_struct2 {
++#ifdef CONFIG_SMP
++	int	on_cpu;
++#endif
++	long long at_time;
++	int  	from_ln;
++	char	* in_src;
++	void	*from;
++        int     with_if;
++	struct task_struct *t1;
++	struct task_struct *t2;
++};
++
++If you use this for display, the data elements will be displayed as
++pointers to task_struct entries.  You may want to define your own
++structure to use in casting.  You should only change the last two items
++and you must keep the structure size the same.  Kgdb will handle these
++as 32-bit ints, but within that constraint you can define a structure to
++cast to any 32-bit quantity.  This need only be available to gdb and is
++only used for casting in the display code.
++
++Final Items
++===========
++
++I picked up this code from Amit S. Kale and enhanced it.
++
++If you make some really cool modification to this stuff, or if you 
++fix a bug, please let me know.
++
++George Anzinger
++<george@mvista.com>
++
++Amit S. Kale
++<akale@veritas.com>
++
++(First kgdb by David Grothe <dave@gcom.com>)
++
++(modified by Tigran Aivazian <tigran@sco.com>)
++    Putting gdbstub into the kernel config menu.
++
++(modified by Scott Foehner <sfoehner@engr.sgi.com>)
++    Hooks for entering gdbstub at boot time.
++
++(modified by Amit S. Kale <akale@veritas.com>)
++    Threads, ia-32 hw debugging, mp support, console support,
++    nmi watchdog handling.
++
++(modified by George Anzinger <george@mvista.com>)
++    Extended threads to include the idle threads.
++    Enhancements to allow breakpoint() at first C code.
++    Use of module_init() and __setup() to automate the configure.
++    Enhanced the cpu "collection" code to work in early bring-up.
++    Added ability to call functions from gdb
++    Print info thread stuff without going back to schedule()
++    Now collect the "other" cpus with an IPI/ NMI.
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/Documentation/i386/kgdb/loadmodule.sh	2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,78 @@
++#/bin/sh
++# This script loads a module on a target machine and generates a gdb script.
++# source generated gdb script to load the module file at appropriate addresses
++# in gdb.
++#
++# Usage: 
++# Loading the module on target machine and generating gdb script)
++#	[foo]$ loadmodule.sh <modulename>
++#
++# Loading the module file into gdb
++#	(gdb) source <gdbscriptpath>
++#
++# Modify following variables according to your setup. 
++#	TESTMACHINE - Name of the target machine
++#	GDBSCRIPTS - The directory where a gdb script will be generated
++#
++# Author: Amit S. Kale (akale@veritas.com).
++#
++# If you run into problems, please check files pointed to by following
++# variables.
++#	ERRFILE - /tmp/<modulename>.errs contains stderr output of insmod
++#	MAPFILE - /tmp/<modulename>.map contains stdout output of insmod
++#	GDBSCRIPT - $GDBSCRIPTS/load<modulename> gdb script.
++
++TESTMACHINE=foo
++GDBSCRIPTS=/home/bar
++
++if [ $# -lt 1 ] ; then {
++	echo Usage: $0 modulefile
++	exit
++} ; fi
++
++MODULEFILE=$1
++MODULEFILEBASENAME=`basename $1`
++
++if [ $MODULEFILE = $MODULEFILEBASENAME ] ; then {
++	MODULEFILE=`pwd`/$MODULEFILE
++} fi
++
++ERRFILE=/tmp/$MODULEFILEBASENAME.errs
++MAPFILE=/tmp/$MODULEFILEBASENAME.map
++GDBSCRIPT=$GDBSCRIPTS/load$MODULEFILEBASENAME
++
++function findaddr() {
++	local ADDR=0x$(echo "$SEGMENTS" | \
++		grep "$1" | sed 's/^[^ ]*[ ]*[^ ]*[ ]*//' | \
++		sed 's/[ ]*[^ ]*$//')
++	echo $ADDR
++}
++
++function checkerrs() {
++	if [ "`cat $ERRFILE`" != "" ] ; then {
++		cat $ERRFILE
++		exit
++	} fi
++}
++
++#load the module
++echo Copying $MODULEFILE to $TESTMACHINE
++rcp $MODULEFILE root@${TESTMACHINE}:
++
++echo Loading module $MODULEFILE
++rsh -l root $TESTMACHINE  /sbin/insmod -m ./`basename $MODULEFILE` \
++	> $MAPFILE 2> $ERRFILE
++checkerrs
++
++SEGMENTS=`head -n 11 $MAPFILE | tail -n 10`
++TEXTADDR=$(findaddr "\\.text[^.]")
++LOADSTRING="add-symbol-file $MODULEFILE $TEXTADDR"
++SEGADDRS=`echo "$SEGMENTS" | awk '//{
++	if ($1 != ".text" && $1 != ".this" &&
++	    $1 != ".kstrtab" && $1 != ".kmodtab") {
++		print " -s " $1 " 0x" $3 " "
++	}
++}'`
++LOADSTRING="$LOADSTRING $SEGADDRS"
++echo Generating script $GDBSCRIPT
++echo $LOADSTRING > $GDBSCRIPT
+--- linux-2.6.0-test1/Documentation/magic-number.txt	2003-06-14 12:18:23.000000000 -0700
++++ 25/Documentation/magic-number.txt	2003-07-19 17:03:49.000000000 -0700
+@@ -51,6 +51,13 @@ kernel before 2.6.x yet.
+ 					<pasky@ucw.cz>
+ 					03 Nov 2002
+ 
++Updated the magic table to Linux 2.5.74.
++
++					Fabian Frederick
++					<ffrederick@users.sourceforge.net>
++					09 Jul 2003
++
++
+ Magic Name            Number      Structure            File
+ ===========================================================================
+ PG_MAGIC              'P'         pg_{read,write}_hdr include/linux/pg.h
+@@ -62,10 +69,12 @@ AURORA_MAGIC          0x0A18      Aurora
+ HDLC_MAGIC            0x239e      n_hdlc            drivers/char/n_hdlc.c
+ APM_BIOS_MAGIC        0x4101      apm_user          arch/i386/kernel/apm.c
+ CYCLADES_MAGIC        0x4359      cyclades_port     include/linux/cyclades.h
++DB_MAGIC              0x4442      fc_info           drivers/net/iph5526_novram.c
++DL_MAGIC              0x444d      fc_info           drivers/net/iph5526_novram.c
+ FASYNC_MAGIC          0x4601      fasync_struct     include/linux/fs.h
++FF_MAGIC              0x4646      fc_info           drivers/net/iph5526_novram.c
+ ISICOM_MAGIC          0x4d54      isi_port          include/linux/isicom.h
+-PTY_MAGIC             0x5001      (none at the moment)
+-                                                    drivers/char/pty.c
++PTY_MAGIC             0x5001                        drivers/char/pty.c
+ PPP_MAGIC             0x5002      ppp               include/linux/if_pppvar.h
+ SERIAL_MAGIC          0x5301      async_struct      include/linux/serial.h
+ SSTATE_MAGIC          0x5302      serial_state      include/linux/serial.h
+@@ -81,9 +90,9 @@ TTY_DRIVER_MAGIC      0x5402      tty_dr
+ MGSLPC_MAGIC          0x5402      mgslpc_info       drivers/char/pcmcia/synclink_cs.c
+ TTY_LDISC_MAGIC       0x5403      tty_ldisc         include/linux/tty_ldisc.h
+ USB_SERIAL_MAGIC      0x6702      usb_serial        drivers/usb/serial/usb-serial.h
++FULL_DUPLEX_MAGIC     0x6969                        drivers/net/tulip/de2104x.c
+ USB_BLUETOOTH_MAGIC   0x6d02      usb_bluetooth     drivers/usb/class/bluetty.c
+-RFCOMM_TTY_MAGIC      0x6d02      (note at the moment)
+-                                                    net/bluetooth/rfcomm/tty.c
++RFCOMM_TTY_MAGIC      0x6d02                        net/bluetooth/rfcomm/tty.c
+ USB_SERIAL_PORT_MAGIC 0x7301      usb_serial_port   drivers/usb/serial/usb-serial.h
+ CG_MAGIC              0x00090255  ufs_cylinder_group include/linux/ufs_fs.h
+ A2232_MAGIC           0x000a2232  gs_port           drivers/char/ser_a2232.h
+@@ -91,6 +100,7 @@ SOLARIS_SOCKET_MAGIC  0x000ADDED  sol_so
+ RPORT_MAGIC           0x00525001  r_port            drivers/char/rocket_int.h
+ LSEMAGIC              0x05091998  lse               drivers/fc4/fc.c
+ GDTIOCTL_MAGIC        0x06030f07  gdth_iowr_str     drivers/scsi/gdth_ioctl.h
++RIEBL_MAGIC           0x09051990                    drivers/net/atarilance.c
+ RIO_MAGIC             0x12345678  gs_port           drivers/char/rio/rio_linux.c
+ SX_MAGIC              0x12345678  gs_port           drivers/char/sx.h
+ NBD_REQUEST_MAGIC     0x12560953  nbd_request       include/linux/nbd.h
+@@ -120,6 +130,7 @@ SAVEKMSG_MAGIC1       0x53415645  savekm
+ GDA_MAGIC             0x58464552  gda               include/asm-mips64/sn/gda.h
+ RED_MAGIC1            0x5a2cf071  (any)             mm/slab.c
+ STL_PORTMAGIC         0x5a7182c9  stlport           include/linux/stallion.h
++EEPROM_MAGIC_VALUE    0X5ab478d2  lanai_dev         drivers/atm/lanai.c
+ HDLCDRV_MAGIC         0x5ac6e778  hdlcdrv_state     include/linux/hdlcdrv.h
+ EPCA_MAGIC            0x5c6df104  channel           include/linux/epca.h
+ PCXX_MAGIC            0x5c6df104  channel           drivers/char/pcxx.h
+@@ -127,9 +138,11 @@ KV_MAGIC              0x5f4b565f  kernel
+ I810_STATE_MAGIC      0x63657373  i810_state        sound/oss/i810_audio.c
+ TRIDENT_STATE_MAGIC   0x63657373  trient_state      sound/oss/trident.c
+ M3_CARD_MAGIC         0x646e6f50  m3_card           sound/oss/maestro3.c
++FW_HEADER_MAGIC       0x65726F66  fw_header         drivers/atm/fore200e.h
+ SLOT_MAGIC            0x67267321  slot              drivers/hotplug/cpqphp.h
+ SLOT_MAGIC            0x67267322  slot              drivers/hotplug/acpiphp.h
+ LO_MAGIC              0x68797548  nbd_device        include/linux/nbd.h
++OPROFILE_MAGIC        0x6f70726f  super_block       drivers/oprofile/oprofilefs.h
+ M3_STATE_MAGIC        0x734d724d  m3_state          sound/oss/maestro3.c
+ STL_PANELMAGIC        0x7ef621a1  stlpanel          include/linux/stallion.h
+ VMALLOC_MAGIC         0x87654320  snd_alloc_track   sound/core/memory.c
+@@ -137,11 +150,15 @@ KMALLOC_MAGIC         0x87654321  snd_al
+ PWC_MAGIC             0x89DC10AB  pwc_device        drivers/usb/media/pwc.h
+ NBD_REPLY_MAGIC       0x96744668  nbd_reply         include/linux/nbd.h
+ STL_BOARDMAGIC        0xa2267f52  stlbrd            include/linux/stallion.h
++ENI155_MAGIC          0xa54b872d  midway_eprom	    drivers/atm/eni.h
+ SCI_MAGIC             0xbabeface  gs_port           drivers/char/sh-sci.h
+ CODA_MAGIC            0xC0DAC0DA  coda_file_info    include/linux/coda_fs_i.h
++DPMEM_MAGIC           0xc0ffee11  gdt_pci_sram      drivers/scsi/gdth.h
+ STLI_PORTMAGIC        0xe671c7a1  stliport          include/linux/istallion.h
+ YAM_MAGIC             0xF10A7654  yam_port          drivers/net/hamradio/yam.c
+ CCB_MAGIC             0xf2691ad2  ccb               drivers/scsi/ncr53c8xx.c
++QUEUE_MAGIC_FREE      0xf7e1c9a3  queue_entry       drivers/scsi/arm/queue.c
++QUEUE_MAGIC_USED      0xf7e1cc33  queue_entry       drivers/scsi/arm/queue.c
+ HTB_CMAGIC            0xFEFAFEF1  htb_class         net/sched/sch_htb.c
+ NMI_MAGIC             0x48414d4d455201 nmi_s        include/asm-mips64/sn/nmi.h
+ 
+--- linux-2.6.0-test1/Documentation/networking/vortex.txt	2003-06-14 12:18:00.000000000 -0700
++++ 25/Documentation/networking/vortex.txt	2003-07-19 17:05:08.000000000 -0700
+@@ -216,19 +216,6 @@ watchdog=N
+   to increase this value on LANs which have very high collision rates.
+   The default value is 5000 (5.0 seconds).
+ 
+-enable_wol=N1,N2,N3,...
+-
+-  Enable Wake-on-LAN support for the relevant interface.  Donald
+-  Becker's `ether-wake' application may be used to wake suspended
+-  machines.
+-
+-  Also enables the NIC's power management support.
+-
+-global_enable_wol=N
+-
+-  Sets enable_wol mode for all 3c59x NICs in the machine.  Entries in
+-  the `enable_wol' array above will override any setting of this.
+-
+ Media selection
+ ---------------
+ 
+--- linux-2.6.0-test1/Documentation/pnp.txt	2003-06-14 12:17:58.000000000 -0700
++++ 25/Documentation/pnp.txt	2003-07-19 17:03:49.000000000 -0700
+@@ -22,7 +22,7 @@ user interface is integrated into driver
+ In addition to the standard driverfs file the following are created in each 
+ device's directory:
+ id - displays a list of support EISA IDs
+-possible - displays possible resource configurations
++options - displays possible resource configurations
+ resources - displays currently allocated resources and allows resource changes
+ 
+ -activating a device
+@@ -60,7 +60,7 @@ DISABLED
+ - Notice the string "DISABLED".  THis means the device is not active.
+ 
+ 3.) check the device's possible configurations (optional)
+-# cat possible
++# cat options
+ Dependent: 01 - Priority acceptable
+     port 0x3f0-0x3f0, align 0x7, size 0x6, 16-bit address decoding
+     port 0x3f7-0x3f7, align 0x0, size 0x1, 16-bit address decoding
+--- linux-2.6.0-test1/drivers/acorn/block/fd1772.c	2003-06-14 12:18:06.000000000 -0700
++++ 25/drivers/acorn/block/fd1772.c	2003-07-19 17:03:49.000000000 -0700
+@@ -152,8 +152,6 @@
+ #include <asm/uaccess.h>
+ 
+ 
+-#include <linux/blk.h>
+-
+ /* Note: FD_MAX_UNITS could be redefined to 2 for the Atari (with
+  * little additional rework in this file). But I'm not yet sure if
+  * some other code depends on the number of floppies... (It is defined
+--- linux-2.6.0-test1/drivers/acorn/block/mfmhd.c	2003-06-14 12:18:01.000000000 -0700
++++ 25/drivers/acorn/block/mfmhd.c	2003-07-19 17:03:49.000000000 -0700
+@@ -111,7 +111,6 @@
+ #include <linux/major.h>
+ #include <linux/ioport.h>
+ #include <linux/delay.h>
+-#include <linux/blk.h>
+ #include <linux/blkpg.h>
+ 
+ #include <asm/system.h>
+--- linux-2.6.0-test1/drivers/acpi/executer/exutils.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/acpi/executer/exutils.c	2003-07-19 17:03:49.000000000 -0700
+@@ -290,7 +290,7 @@ acpi_ex_digits_needed (
+ 	 * acpi_integer is unsigned, so we don't worry about a '-'
+ 	 */
+ 	if ((current_value = value) == 0) {
+-	    return_VALUE (1);
++		return_VALUE (1);
+ 	}
+ 
+ 	num_digits = 0;
+--- linux-2.6.0-test1/drivers/acpi/hardware/hwregs.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/acpi/hardware/hwregs.c	2003-07-19 17:03:49.000000000 -0700
+@@ -357,9 +357,9 @@ acpi_set_register (
+ 
+ 	/*
+ 	 * Decode the Register ID
+-	 * Register id = Register block id | bit id
++	 * Register ID = [Register block ID] | [bit ID]
+ 	 *
+-	 * Check bit id to fine locate Register offset.
++	 * Check bit ID to fine locate Register offset.
+ 	 * Check Mask to determine Register offset, and then read-write.
+ 	 */
+ 	switch (bit_reg_info->parent_register) {
+@@ -367,9 +367,9 @@ acpi_set_register (
+ 
+ 		/*
+ 		 * Status Registers are different from the rest.  Clear by
+-		 * writing 1, writing 0 has no effect.  So, the only relevant
++		 * writing 1, and writing 0 has no effect.  So, the only relevant
+ 		 * information is the single bit we're interested in, all others should
+-		 * be written as 0 so they will be left unchanged
++		 * be written as 0 so they will be left unchanged.
+ 		 */
+ 		value = ACPI_REGISTER_PREPARE_BITS (value,
+ 				 bit_reg_info->bit_position, bit_reg_info->access_bit_mask);
+@@ -394,17 +394,17 @@ acpi_set_register (
+ 	case ACPI_REGISTER_PM1_CONTROL:
+ 
+ 		/*
+-		 * Read the PM1 Control register.
++		 * Write the PM1 Control register.
+ 		 * Note that at this level, the fact that there are actually TWO
+-		 * registers (A and B - and that B may not exist) is abstracted.
++		 * registers (A and B - and B may not exist) is abstracted.
+ 		 */
+ 		ACPI_DEBUG_PRINT ((ACPI_DB_IO, "PM1 control: Read %X\n", register_value));
+ 
+ 		ACPI_REGISTER_INSERT_VALUE (register_value, bit_reg_info->bit_position,
+ 				bit_reg_info->access_bit_mask, value);
+ 
+-		status = acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK, register_id,
+-				(u16) register_value);
++		status = acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK,
++				  ACPI_REGISTER_PM1_CONTROL, (u16) register_value);
+ 		break;
+ 
+ 
+@@ -724,7 +724,7 @@ acpi_hw_low_level_read (
+ 
+ 	/*
+ 	 * Three address spaces supported:
+-	 * Memory, Io, or PCI config.
++	 * Memory, IO, or PCI_Config.
+ 	 */
+ 	switch (reg->address_space_id) {
+ 	case ACPI_ADR_SPACE_SYSTEM_MEMORY:
+@@ -808,9 +808,10 @@ acpi_hw_low_level_write (
+ 		(!reg->address)) {
+ 		return (AE_OK);
+ 	}
++
+ 	/*
+ 	 * Three address spaces supported:
+-	 * Memory, Io, or PCI config.
++	 * Memory, IO, or PCI_Config.
+ 	 */
+ 	switch (reg->address_space_id) {
+ 	case ACPI_ADR_SPACE_SYSTEM_MEMORY:
+--- linux-2.6.0-test1/drivers/acpi/osl.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/acpi/osl.c	2003-07-19 17:03:49.000000000 -0700
+@@ -35,6 +35,7 @@
+ #include <linux/kmod.h>
+ #include <linux/delay.h>
+ #include <linux/workqueue.h>
++#include <linux/nmi.h>
+ #include <acpi/acpi.h>
+ #include <asm/io.h>
+ #include <acpi/acpi_bus.h>
+@@ -291,11 +292,14 @@ acpi_os_sleep(u32 sec, u32 ms)
+ void
+ acpi_os_stall(u32 us)
+ {
+-	if (us > 10000) {
+-		mdelay(us / 1000);
+-	}
+-	else {
+-		udelay(us);
++	while (us) {
++		u32 delay = 1000;
++
++		if (delay > us)
++			delay = us;
++		udelay(delay);
++		touch_nmi_watchdog();
++		us -= delay;
+ 	}
+ }
+ 
+--- linux-2.6.0-test1/drivers/acpi/processor.c	2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/acpi/processor.c	2003-07-19 17:03:49.000000000 -0700
+@@ -1351,7 +1351,7 @@ static int acpi_processor_throttling_ope
+ 						PDE(inode)->data);
+ }
+ 
+-static int
++static ssize_t
+ acpi_processor_write_throttling (
+         struct file		*file,
+         const char		*buffer,
+@@ -1414,7 +1414,7 @@ static int acpi_processor_limit_open_fs(
+ 						PDE(inode)->data);
+ }
+ 
+-static int
++static ssize_t
+ acpi_processor_write_limit (
+ 	struct file		*file,
+ 	const char		*buffer,
+--- linux-2.6.0-test1/drivers/acpi/tables.c	2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/acpi/tables.c	2003-07-19 17:03:49.000000000 -0700
+@@ -33,6 +33,7 @@
+ #include <linux/irq.h>
+ #include <linux/errno.h>
+ #include <linux/acpi.h>
++#include <linux/bootmem.h>
+ 
+ #define PREFIX			"ACPI: "
+ 
+@@ -61,16 +62,14 @@ static char *acpi_table_signatures[ACPI_
+ 
+ /* System Description Table (RSDT/XSDT) */
+ struct acpi_table_sdt {
+-	unsigned long		pa;		/* Physical Address */
+-	unsigned long		count;		/* Table count */
+-	struct {
+-		unsigned long		pa;
+-		enum acpi_table_id	id;
+-		unsigned long		size;
+-	}			entry[ACPI_MAX_TABLES];
++	unsigned long		pa;
++	enum acpi_table_id	id;
++	unsigned long		size;
+ } __attribute__ ((packed));
+ 
+-static struct acpi_table_sdt	sdt;
++static unsigned long		sdt_pa;		/* Physical Address */
++static unsigned long		sdt_count;	/* Table count */
++static struct acpi_table_sdt	*sdt_entry;
+ 
+ void
+ acpi_table_print (
+@@ -236,11 +235,11 @@ acpi_get_table_header_early (
+ 
+ 	/* Locate the table. */
+ 
+-	for (i = 0; i < sdt.count; i++) {
+-		if (sdt.entry[i].id != temp_id)
++	for (i = 0; i < sdt_count; i++) {
++		if (sdt_entry[i].id != temp_id)
+ 			continue;
+ 		*header = (void *)
+-			__acpi_map_table(sdt.entry[i].pa, sdt.entry[i].size);
++			__acpi_map_table(sdt_entry[i].pa, sdt_entry[i].size);
+ 		if (!*header) {
+ 			printk(KERN_WARNING PREFIX "Unable to map %s\n",
+ 			       acpi_table_signatures[temp_id]);
+@@ -289,11 +288,11 @@ acpi_table_parse_madt_family (
+ 
+ 	/* Locate the MADT (if exists). There should only be one. */
+ 
+-	for (i = 0; i < sdt.count; i++) {
+-		if (sdt.entry[i].id != id)
++	for (i = 0; i < sdt_count; i++) {
++		if (sdt_entry[i].id != id)
+ 			continue;
+ 		madt = (void *)
+-			__acpi_map_table(sdt.entry[i].pa, sdt.entry[i].size);
++			__acpi_map_table(sdt_entry[i].pa, sdt_entry[i].size);
+ 		if (!madt) {
+ 			printk(KERN_WARNING PREFIX "Unable to map %s\n",
+ 			       acpi_table_signatures[id]);
+@@ -308,7 +307,7 @@ acpi_table_parse_madt_family (
+ 		return -ENODEV;
+ 	}
+ 
+-	madt_end = (unsigned long) madt + sdt.entry[i].size;
++	madt_end = (unsigned long) madt + sdt_entry[i].size;
+ 
+ 	/* Parse all entries looking for a match. */
+ 
+@@ -349,10 +348,10 @@ acpi_table_parse (
+ 	if (!handler)
+ 		return -EINVAL;
+ 
+-	for (i = 0; i < sdt.count; i++) {
+-		if (sdt.entry[i].id != id)
++	for (i = 0; i < sdt_count; i++) {
++		if (sdt_entry[i].id != id)
+ 			continue;
+-		handler(sdt.entry[i].pa, sdt.entry[i].size);
++		handler(sdt_entry[i].pa, sdt_entry[i].size);
+ 		count++;
+ 	}
+ 
+@@ -377,11 +376,11 @@ acpi_table_get_sdt (
+ 			
+ 		struct acpi_table_xsdt	*mapped_xsdt = NULL;
+ 
+-		sdt.pa = ((struct acpi20_table_rsdp*)rsdp)->xsdt_address;
++		sdt_pa = ((struct acpi20_table_rsdp*)rsdp)->xsdt_address;
+ 
+ 		/* map in just the header */
+ 		header = (struct acpi_table_header *)
+-			__acpi_map_table(sdt.pa, sizeof(struct acpi_table_header));
++			__acpi_map_table(sdt_pa, sizeof(struct acpi_table_header));
+ 
+ 		if (!header) {
+ 			printk(KERN_WARNING PREFIX "Unable to map XSDT header\n");
+@@ -390,7 +389,7 @@ acpi_table_get_sdt (
+ 
+ 		/* remap in the entire table before processing */
+ 		mapped_xsdt = (struct acpi_table_xsdt *)
+-			__acpi_map_table(sdt.pa, header->length);
++			__acpi_map_table(sdt_pa, header->length);
+ 		if (!mapped_xsdt) {
+ 			printk(KERN_WARNING PREFIX "Unable to map XSDT\n");
+ 			return -ENODEV;
+@@ -407,15 +406,21 @@ acpi_table_get_sdt (
+ 			return -ENODEV;
+ 		}
+ 
+-		sdt.count = (header->length - sizeof(struct acpi_table_header)) >> 3;
+-		if (sdt.count > ACPI_MAX_TABLES) {
++		sdt_count = (header->length - sizeof(struct acpi_table_header)) >> 3;
++		if (sdt_count > ACPI_MAX_TABLES) {
+ 			printk(KERN_WARNING PREFIX "Truncated %lu XSDT entries\n",
+-				(sdt.count - ACPI_MAX_TABLES));
+-			sdt.count = ACPI_MAX_TABLES;
++				(sdt_count - ACPI_MAX_TABLES));
++			sdt_count = ACPI_MAX_TABLES;
+ 		}
+ 
+-		for (i = 0; i < sdt.count; i++)
+-			sdt.entry[i].pa = (unsigned long) mapped_xsdt->entry[i];
++		sdt_entry = alloc_bootmem(sdt_count * sizeof(struct acpi_table_sdt));
++		if (!sdt_entry) {
++			printk(KERN_ERR "ACPI: Could not allocate mem for SDT entries!\n");
++			return -ENOMEM;
++		}
++
++		for (i = 0; i < sdt_count; i++)
++			sdt_entry[i].pa = (unsigned long) mapped_xsdt->entry[i];
+ 	}
+ 
+ 	/* Then check RSDT */
+@@ -424,11 +429,11 @@ acpi_table_get_sdt (
+ 
+ 		struct acpi_table_rsdt	*mapped_rsdt = NULL;
+ 
+-		sdt.pa = rsdp->rsdt_address;
++		sdt_pa = rsdp->rsdt_address;
+ 
+ 		/* map in just the header */
+ 		header = (struct acpi_table_header *)
+-			__acpi_map_table(sdt.pa, sizeof(struct acpi_table_header));
++			__acpi_map_table(sdt_pa, sizeof(struct acpi_table_header));
+ 		if (!header) {
+ 			printk(KERN_WARNING PREFIX "Unable to map RSDT header\n");
+ 			return -ENODEV;
+@@ -436,7 +441,7 @@ acpi_table_get_sdt (
+ 
+ 		/* remap in the entire table before processing */
+ 		mapped_rsdt = (struct acpi_table_rsdt *)
+-			__acpi_map_table(sdt.pa, header->length);
++			__acpi_map_table(sdt_pa, header->length);
+ 		if (!mapped_rsdt) {
+ 			printk(KERN_WARNING PREFIX "Unable to map RSDT\n");
+ 			return -ENODEV;
+@@ -453,15 +458,21 @@ acpi_table_get_sdt (
+ 			return -ENODEV;
+ 		}
+ 
+-		sdt.count = (header->length - sizeof(struct acpi_table_header)) >> 2;
+-		if (sdt.count > ACPI_MAX_TABLES) {
++		sdt_count = (header->length - sizeof(struct acpi_table_header)) >> 2;
++		if (sdt_count > ACPI_MAX_TABLES) {
+ 			printk(KERN_WARNING PREFIX "Truncated %lu RSDT entries\n",
+-				(sdt.count - ACPI_TABLE_COUNT));
+-			sdt.count = ACPI_MAX_TABLES;
++				(sdt_count - ACPI_MAX_TABLES));
++			sdt_count = ACPI_MAX_TABLES;
+ 		}
+ 
+-		for (i = 0; i < sdt.count; i++)
+-			sdt.entry[i].pa = (unsigned long) mapped_rsdt->entry[i];
++		sdt_entry = alloc_bootmem(sdt_count * sizeof(struct acpi_table_sdt));
++		if (!sdt_entry) {
++			printk(KERN_ERR "ACPI: Could not allocate mem for SDT entries!\n");
++			return -ENOMEM;
++		}
++
++		for (i = 0; i < sdt_count; i++)
++			sdt_entry[i].pa = (unsigned long) mapped_rsdt->entry[i];
+ 	}
+ 
+ 	else {
+@@ -469,38 +480,38 @@ acpi_table_get_sdt (
+ 		return -ENODEV;
+ 	}
+ 
+-	acpi_table_print(header, sdt.pa);
++	acpi_table_print(header, sdt_pa);
+ 
+-	for (i = 0; i < sdt.count; i++) {
++	for (i = 0; i < sdt_count; i++) {
+ 
+ 		/* map in just the header */
+ 		header = (struct acpi_table_header *)
+-			__acpi_map_table(sdt.entry[i].pa,
++			__acpi_map_table(sdt_entry[i].pa,
+ 				sizeof(struct acpi_table_header));
+ 		if (!header)
+ 			continue;
+ 
+ 		/* remap in the entire table before processing */
+ 		header = (struct acpi_table_header *)
+-			__acpi_map_table(sdt.entry[i].pa,
++			__acpi_map_table(sdt_entry[i].pa,
+ 				header->length);
+ 		if (!header)
+ 			continue;
+ 	               
+-		acpi_table_print(header, sdt.entry[i].pa);
++		acpi_table_print(header, sdt_entry[i].pa);
+ 
+ 		if (acpi_table_compute_checksum(header, header->length)) {
+ 			printk(KERN_WARNING "  >>> ERROR: Invalid checksum\n");
+ 			continue;
+ 		}
+ 
+-		sdt.entry[i].size = header->length;
++		sdt_entry[i].size = header->length;
+ 
+ 		for (id = 0; id < ACPI_TABLE_COUNT; id++) {
+ 			if (!strncmp((char *) &header->signature,
+ 				acpi_table_signatures[id],
+ 				sizeof(header->signature))) {
+-				sdt.entry[i].id = id;
++				sdt_entry[i].id = id;
+ 			}
+ 		}
+ 	}
+@@ -525,8 +536,6 @@ acpi_table_init (void)
+ 	unsigned long		rsdp_phys = 0;
+ 	int			result = 0;
+ 
+-	memset(&sdt, 0, sizeof(struct acpi_table_sdt));
+-
+ 	/* Locate and map the Root System Description Table (RSDP) */
+ 
+ 	rsdp_phys = acpi_find_rsdp();
+--- linux-2.6.0-test1/drivers/acpi/tables/tbconvrt.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/acpi/tables/tbconvrt.c	2003-07-19 17:03:49.000000000 -0700
+@@ -75,14 +75,10 @@ acpi_tb_get_table_count (
+ 	ACPI_FUNCTION_ENTRY ();
+ 
+ 
+-#if ACPI_MACHINE_WIDTH != 64
+-
+ 	if (RSDP->revision < 2) {
+ 		pointer_size = sizeof (u32);
+ 	}
+-	else
+-#endif
+-	{
++	else {
+ 		pointer_size = sizeof (u64);
+ 	}
+ 
+--- linux-2.6.0-test1/drivers/acpi/tables/tbget.c	2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/acpi/tables/tbget.c	2003-07-19 17:03:49.000000000 -0700
+@@ -145,7 +145,7 @@ acpi_tb_get_table_header (
+ 		/* Create a logical address for the physical pointer*/
+ 
+ 		status = acpi_os_map_memory (address->pointer.physical, sizeof (struct acpi_table_header),
+-				  (void **) &header);
++				  (void *) &header);
+ 		if (ACPI_FAILURE (status)) {
+ 			ACPI_REPORT_ERROR (("Could not map memory at %8.8X%8.8X for length %X\n",
+ 				ACPI_HIDWORD (address->pointer.physical),
+@@ -361,7 +361,7 @@ acpi_tb_get_this_table (
+ 		 * into our address space.
+ 		 */
+ 		status = acpi_os_map_memory (address->pointer.physical, (acpi_size) header->length,
+-				  (void **) &full_table);
++				  (void *) &full_table);
+ 		if (ACPI_FAILURE (status)) {
+ 			ACPI_REPORT_ERROR (("Could not map memory for table [%4.4s] at %8.8X%8.8X for length %X\n",
+ 				header->signature,
+--- linux-2.6.0-test1/drivers/acpi/tables/tbinstal.c	2003-06-14 12:18:03.000000000 -0700
++++ 25/drivers/acpi/tables/tbinstal.c	2003-07-19 17:03:49.000000000 -0700
+@@ -271,22 +271,40 @@ acpi_tb_init_table_descriptor (
+ 		if (list_head->next) {
+ 			return_ACPI_STATUS (AE_ALREADY_EXISTS);
+ 		}
+-	}
+ 
+-	/*
+-	 * Link the new table in to the list of tables of this type.
+-	 * Just insert at the start of the list, order unimportant.
+-	 *
+-	 * table_desc->Prev is already NULL from calloc()
+-	 */
+-	table_desc->next = list_head->next;
+-	list_head->next = table_desc;
++		table_desc->next = list_head->next;
++		list_head->next = table_desc;
+ 
+-	if (table_desc->next) {
+-		table_desc->next->prev = table_desc;
++		if (table_desc->next) {
++			table_desc->next->prev = table_desc;
++		}
++
++		list_head->count++;
+ 	}
++	else {
++		/*
++		 * Link the new table in to the list of tables of this type.
++		 * Insert at the end of the list, order IS IMPORTANT.
++		 *
++		 * table_desc->Prev & Next are already NULL from calloc()
++		 */
++		list_head->count++;
++
++		if (!list_head->next) {
++			list_head->next = table_desc;
++		}
++		else {
++			table_desc->next = list_head->next;
+ 
+-	list_head->count++;
++			while (table_desc->next->next) {
++				table_desc->next = table_desc->next->next;
++			}
++
++			table_desc->next->next = table_desc;
++			table_desc->prev = table_desc->next;
++			table_desc->next = NULL;
++		}
++	}
+ 
+ 	/* Finish initialization of the table descriptor */
+ 
+--- linux-2.6.0-test1/drivers/acpi/tables/tbrsdt.c	2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/acpi/tables/tbrsdt.c	2003-07-19 17:03:49.000000000 -0700
+@@ -85,7 +85,7 @@ acpi_tb_verify_rsdp (
+ 		 * Obtain access to the RSDP structure
+ 		 */
+ 		status = acpi_os_map_memory (address->pointer.physical, sizeof (struct rsdp_descriptor),
+-				  (void **) &rsdp);
++				  (void *) &rsdp);
+ 		if (ACPI_FAILURE (status)) {
+ 			return_ACPI_STATUS (status);
+ 		}
+--- linux-2.6.0-test1/drivers/acpi/tables/tbxfroot.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/acpi/tables/tbxfroot.c	2003-07-19 17:03:49.000000000 -0700
+@@ -179,7 +179,7 @@ acpi_get_firmware_table (
+ 
+ 		if ((flags & ACPI_MEMORY_MODE) == ACPI_LOGICAL_ADDRESSING) {
+ 			status = acpi_os_map_memory (rsdp_address.pointer.physical, sizeof (struct rsdp_descriptor),
+-					  (void **) &acpi_gbl_RSDP);
++					  (void *) &acpi_gbl_RSDP);
+ 			if (ACPI_FAILURE (status)) {
+ 				return_ACPI_STATUS (status);
+ 			}
+@@ -423,7 +423,7 @@ acpi_tb_find_rsdp (
+ 		 * 1) Search EBDA (low memory) paragraphs
+ 		 */
+ 		status = acpi_os_map_memory ((u64) ACPI_LO_RSDP_WINDOW_BASE, ACPI_LO_RSDP_WINDOW_SIZE,
+-				  (void **) &table_ptr);
++				  (void *) &table_ptr);
+ 		if (ACPI_FAILURE (status)) {
+ 			ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not map memory at %X for length %X\n",
+ 				ACPI_LO_RSDP_WINDOW_BASE, ACPI_LO_RSDP_WINDOW_SIZE));
+@@ -447,7 +447,7 @@ acpi_tb_find_rsdp (
+ 		 * 2) Search upper memory: 16-byte boundaries in E0000h-F0000h
+ 		 */
+ 		status = acpi_os_map_memory ((u64) ACPI_HI_RSDP_WINDOW_BASE, ACPI_HI_RSDP_WINDOW_SIZE,
+-				  (void **) &table_ptr);
++				  (void *) &table_ptr);
+ 		if (ACPI_FAILURE (status)) {
+ 			ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not map memory at %X for length %X\n",
+ 				ACPI_HI_RSDP_WINDOW_BASE, ACPI_HI_RSDP_WINDOW_SIZE));
+--- linux-2.6.0-test1/drivers/acpi/thermal.c	2003-06-14 12:18:32.000000000 -0700
++++ 25/drivers/acpi/thermal.c	2003-07-19 17:03:49.000000000 -0700
+@@ -84,11 +84,11 @@ static int acpi_thermal_remove (struct a
+ static int acpi_thermal_state_open_fs(struct inode *inode, struct file *file);
+ static int acpi_thermal_temp_open_fs(struct inode *inode, struct file *file);
+ static int acpi_thermal_trip_open_fs(struct inode *inode, struct file *file);
+-static int acpi_thermal_write_trip_points (struct file*,const char *,size_t,loff_t *);
++static ssize_t acpi_thermal_write_trip_points (struct file*,const char *,size_t,loff_t *);
+ static int acpi_thermal_cooling_open_fs(struct inode *inode, struct file *file);
+-static int acpi_thermal_write_cooling_mode (struct file*,const char *,size_t,loff_t *);
++static ssize_t acpi_thermal_write_cooling_mode (struct file*,const char *,size_t,loff_t *);
+ static int acpi_thermal_polling_open_fs(struct inode *inode, struct file *file);
+-static int acpi_thermal_write_polling(struct file*,const char *,size_t,loff_t *);
++static ssize_t acpi_thermal_write_polling(struct file*,const char *,size_t,loff_t *);
+ 
+ static struct acpi_driver acpi_thermal_driver = {
+ 	.name =		ACPI_THERMAL_DRIVER_NAME,
+@@ -881,7 +881,7 @@ static int acpi_thermal_trip_open_fs(str
+ 	return single_open(file, acpi_thermal_trip_seq_show, PDE(inode)->data);
+ }
+ 
+-static int
++static ssize_t
+ acpi_thermal_write_trip_points (
+         struct file		*file,
+         const char		*buffer,
+@@ -950,7 +950,7 @@ static int acpi_thermal_cooling_open_fs(
+ 							PDE(inode)->data);
+ }
+ 
+-static int
++static ssize_t
+ acpi_thermal_write_cooling_mode (
+ 	struct file		*file,
+ 	const char		*buffer,
+@@ -1011,7 +1011,7 @@ static int acpi_thermal_polling_open_fs(
+ 							PDE(inode)->data);
+ }
+ 
+-static int
++static ssize_t
+ acpi_thermal_write_polling (
+ 	struct file		*file,
+ 	const char		*buffer,
+--- linux-2.6.0-test1/drivers/acpi/utilities/utglobal.c	2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/acpi/utilities/utglobal.c	2003-07-19 17:03:49.000000000 -0700
+@@ -307,9 +307,9 @@ struct acpi_table_support           acpi
+ 	/***********    Name,   Signature, Global typed pointer     Signature size,      Type                  How many allowed?,    Contains valid AML? */
+ 
+ 	/* RSDP 0 */ {RSDP_NAME, RSDP_SIG, NULL,                    sizeof (RSDP_SIG)-1, ACPI_TABLE_ROOT     | ACPI_TABLE_SINGLE},
+-	/* DSDT 1 */ {DSDT_SIG,  DSDT_SIG, (void **) &acpi_gbl_DSDT, sizeof (DSDT_SIG)-1, ACPI_TABLE_SECONDARY| ACPI_TABLE_SINGLE  | ACPI_TABLE_EXECUTABLE},
+-	/* FADT 2 */ {FADT_SIG,  FADT_SIG, (void **) &acpi_gbl_FADT, sizeof (FADT_SIG)-1, ACPI_TABLE_PRIMARY | ACPI_TABLE_SINGLE},
+-	/* FACS 3 */ {FACS_SIG,  FACS_SIG, (void **) &acpi_gbl_FACS, sizeof (FACS_SIG)-1, ACPI_TABLE_SECONDARY| ACPI_TABLE_SINGLE},
++	/* DSDT 1 */ {DSDT_SIG,  DSDT_SIG, (void *) &acpi_gbl_DSDT, sizeof (DSDT_SIG)-1, ACPI_TABLE_SECONDARY| ACPI_TABLE_SINGLE  | ACPI_TABLE_EXECUTABLE},
++	/* FADT 2 */ {FADT_SIG,  FADT_SIG, (void *) &acpi_gbl_FADT, sizeof (FADT_SIG)-1, ACPI_TABLE_PRIMARY | ACPI_TABLE_SINGLE},
++	/* FACS 3 */ {FACS_SIG,  FACS_SIG, (void *) &acpi_gbl_FACS, sizeof (FACS_SIG)-1, ACPI_TABLE_SECONDARY| ACPI_TABLE_SINGLE},
+ 	/* PSDT 4 */ {PSDT_SIG,  PSDT_SIG, NULL,                    sizeof (PSDT_SIG)-1, ACPI_TABLE_PRIMARY  | ACPI_TABLE_MULTIPLE | ACPI_TABLE_EXECUTABLE},
+ 	/* SSDT 5 */ {SSDT_SIG,  SSDT_SIG, NULL,                    sizeof (SSDT_SIG)-1, ACPI_TABLE_PRIMARY  | ACPI_TABLE_MULTIPLE | ACPI_TABLE_EXECUTABLE},
+ 	/* XSDT 6 */ {XSDT_SIG,  XSDT_SIG, NULL,                    sizeof (RSDT_SIG)-1, ACPI_TABLE_ROOT     | ACPI_TABLE_SINGLE},
+--- linux-2.6.0-test1/drivers/atm/atmtcp.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/atm/atmtcp.c	2003-07-19 17:03:49.000000000 -0700
+@@ -66,7 +66,7 @@ static int atmtcp_send_control(struct at
+ 	*(struct atm_vcc **) &new_msg->vcc = vcc;
+ 	old_test = test_bit(flag,&vcc->flags);
+ 	out_vcc->push(out_vcc,skb);
+-	add_wait_queue(&vcc->sleep,&wait);
++	add_wait_queue(vcc->sk->sk_sleep, &wait);
+ 	while (test_bit(flag,&vcc->flags) == old_test) {
+ 		mb();
+ 		out_vcc = PRIV(vcc->dev) ? PRIV(vcc->dev)->vcc : NULL;
+@@ -78,7 +78,7 @@ static int atmtcp_send_control(struct at
+ 		schedule();
+ 	}
+ 	current->state = TASK_RUNNING;
+-	remove_wait_queue(&vcc->sleep,&wait);
++	remove_wait_queue(vcc->sk->sk_sleep, &wait);
+ 	return error;
+ }
+ 
+@@ -90,7 +90,7 @@ static int atmtcp_recv_control(const str
+ 	vcc->vpi = msg->addr.sap_addr.vpi;
+ 	vcc->vci = msg->addr.sap_addr.vci;
+ 	vcc->qos = msg->qos;
+-	vcc->reply = msg->result;
++	vcc->sk->sk_err = -msg->result;
+ 	switch (msg->type) {
+ 	    case ATMTCP_CTRL_OPEN:
+ 		change_bit(ATM_VF_READY,&vcc->flags);
+@@ -103,7 +103,7 @@ static int atmtcp_recv_control(const str
+ 		    msg->type);
+ 		return -EINVAL;
+ 	}
+-	wake_up(&vcc->sleep);
++	wake_up(vcc->sk->sk_sleep);
+ 	return 0;
+ }
+ 
+@@ -134,7 +134,7 @@ static int atmtcp_v_open(struct atm_vcc 
+ 	clear_bit(ATM_VF_READY,&vcc->flags); /* just in case ... */
+ 	error = atmtcp_send_control(vcc,ATMTCP_CTRL_OPEN,&msg,ATM_VF_READY);
+ 	if (error) return error;
+-	return vcc->reply;
++	return -vcc->sk->sk_err;
+ }
+ 
+ 
+@@ -257,7 +257,7 @@ static void atmtcp_c_close(struct atm_vc
+ 		walk = atm_sk(s);
+ 		if (walk->dev != atmtcp_dev)
+ 			continue;
+-		wake_up(&walk->sleep);
++		wake_up(walk->sk->sk_sleep);
+ 	}
+ 	read_unlock(&vcc_sklist_lock);
+ }
+--- linux-2.6.0-test1/drivers/base/node.c	2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/base/node.c	2003-07-19 17:04:07.000000000 -0700
+@@ -7,6 +7,7 @@
+ #include <linux/init.h>
+ #include <linux/mm.h>
+ #include <linux/node.h>
++#include <linux/cpumask.h>
+ #include <linux/topology.h>
+ 
+ static struct sysdev_class node_class = {
+@@ -17,7 +18,17 @@ static struct sysdev_class node_class = 
+ static ssize_t node_read_cpumap(struct sys_device * dev, char * buf)
+ {
+ 	struct node *node_dev = to_node(dev);
+-        return sprintf(buf,"%lx\n",node_dev->cpumap);
++	cpumask_t tmp = node_dev->cpumap;
++	int k, len = 0;
++
++	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++		int j = sprintf(buf, "%04hx", (u16)cpus_coerce(tmp));
++		len += j;
++		buf += j;
++		cpus_shift_right(tmp, tmp, 16);
++	}
++        len += sprintf(buf, "\n");
++	return len;
+ }
+ static SYSDEV_ATTR(cpumap,S_IRUGO,node_read_cpumap,NULL);
+ 
+--- linux-2.6.0-test1/drivers/block/acsi.c	2003-06-14 12:18:51.000000000 -0700
++++ 25/drivers/block/acsi.c	2003-07-19 17:03:49.000000000 -0700
+@@ -55,7 +55,6 @@
+ #include <linux/delay.h>
+ #include <linux/mm.h>
+ #include <linux/major.h>
+-#include <linux/blk.h>
+ #include <linux/slab.h>
+ #include <linux/interrupt.h>
+ #include <scsi/scsi.h> /* for SCSI_IOCTL_GET_IDLUN */
+--- linux-2.6.0-test1/drivers/block/amiflop.c	2003-06-14 12:18:09.000000000 -0700
++++ 25/drivers/block/amiflop.c	2003-07-19 17:03:49.000000000 -0700
+@@ -79,7 +79,6 @@
+ #include <asm/amigahw.h>
+ #include <asm/amigaints.h>
+ #include <asm/irq.h>
+-#include <linux/blk.h>
+ 
+ #undef DEBUG /* print _LOTS_ of infos */
+ 
+--- linux-2.6.0-test1/drivers/block/as-iosched.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/block/as-iosched.c	2003-07-19 17:03:49.000000000 -0700
+@@ -12,7 +12,6 @@
+ #include <linux/blkdev.h>
+ #include <linux/elevator.h>
+ #include <linux/bio.h>
+-#include <linux/blk.h>
+ #include <linux/config.h>
+ #include <linux/module.h>
+ #include <linux/slab.h>
+@@ -834,10 +833,11 @@ static void as_update_iohist(struct as_i
+ 							+ 2*1024*64);
+ 
+ 		aic->seek_samples += 256;
+-		aic->seek_total += 256*seek_dist;
++		aic->seek_total += (u64)256*seek_dist;
+ 		if (aic->seek_samples) {
+-			aic->seek_mean = aic->seek_total + 128;
+-			sector_div(aic->seek_mean, aic->seek_samples);
++			u64 total = aic->seek_total + (aic->seek_samples>>1);
++			do_div(total, aic->seek_samples);
++			aic->seek_mean = (sector_t)total;
+ 		}
+ 		aic->seek_samples = (aic->seek_samples>>1)
+ 					+ (aic->seek_samples>>2);
+@@ -1306,6 +1306,15 @@ static void as_add_request(struct as_dat
+ 	as_update_arq(ad, arq); /* keep state machine up to date */
+ }
+ 
++/*
++ * FIXME: HACK for AS requeue problems
++ */
++static void as_requeue_request(request_queue_t *q, struct request *rq)
++{
++	elv_completed_request(q, rq);
++	__elv_add_request(q, rq, 0, 0);
++}
++
+ static void
+ as_insert_request(request_queue_t *q, struct request *rq,
+ 			struct list_head *insert_here)
+@@ -1821,6 +1830,7 @@ elevator_t iosched_as = {
+ 	.elevator_next_req_fn =		as_next_request,
+ 	.elevator_add_req_fn =		as_insert_request,
+ 	.elevator_remove_req_fn =	as_remove_request,
++	.elevator_requeue_req_fn = 	as_requeue_request,
+ 	.elevator_queue_empty_fn =	as_queue_empty,
+ 	.elevator_completed_req_fn =	as_completed_request,
+ 	.elevator_former_req_fn =	as_former_request,
+--- linux-2.6.0-test1/drivers/block/ataflop.c	2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/block/ataflop.c	2003-07-19 17:03:49.000000000 -0700
+@@ -91,7 +91,6 @@
+ #include <asm/atariints.h>
+ #include <asm/atari_stdma.h>
+ #include <asm/atari_stram.h>
+-#include <linux/blk.h>
+ #include <linux/blkpg.h>
+ 
+ #define	FD_MAX_UNITS 2
+--- linux-2.6.0-test1/drivers/block/cciss.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/drivers/block/cciss.c	2003-07-19 17:03:49.000000000 -0700
+@@ -41,7 +41,6 @@
+ #include <asm/uaccess.h>
+ #include <asm/io.h>
+ 
+-#include <linux/blk.h>
+ #include <linux/blkdev.h>
+ #include <linux/genhd.h>
+ #include <linux/completion.h>
+--- linux-2.6.0-test1/drivers/block/cciss_scsi.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/block/cciss_scsi.c	2003-07-19 17:03:49.000000000 -0700
+@@ -712,7 +712,8 @@ cciss_scsi_detect(int ctlr)
+ 	sh->hostdata[0] = (unsigned long) hba[ctlr];
+ 	sh->irq = hba[ctlr]->intr;
+ 	sh->unique_id = sh->irq;
+-	scsi_add_host(sh, &hba[ctlr]->pdev->dev);
++	scsi_add_host(sh, &hba[ctlr]->pdev->dev); /* XXX handle failure */
++	scsi_scan_host(sh);
+ 
+ 	return 1;
+ }
+--- linux-2.6.0-test1/drivers/block/cpqarray.c	2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/block/cpqarray.c	2003-07-19 17:03:49.000000000 -0700
+@@ -38,7 +38,6 @@
+ #include <linux/init.h>
+ #include <linux/hdreg.h>
+ #include <linux/spinlock.h>
+-#include <linux/blk.h>
+ #include <linux/blkdev.h>
+ #include <linux/genhd.h>
+ #include <asm/uaccess.h>
+--- linux-2.6.0-test1/drivers/block/cryptoloop.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/block/cryptoloop.c	2003-07-19 17:03:49.000000000 -0700
+@@ -26,7 +26,6 @@
+ #include <linux/crypto.h>
+ #include <linux/blkdev.h>
+ #include <linux/loop.h>
+-#include <linux/blk.h>
+ #include <asm/semaphore.h>
+ #include <asm/uaccess.h>
+ 
+--- linux-2.6.0-test1/drivers/block/DAC960.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/block/DAC960.c	2003-07-19 17:03:49.000000000 -0700
+@@ -23,7 +23,6 @@
+ #include <linux/version.h>
+ #include <linux/module.h>
+ #include <linux/types.h>
+-#include <linux/blk.h>
+ #include <linux/blkdev.h>
+ #include <linux/bio.h>
+ #include <linux/completion.h>
+--- linux-2.6.0-test1/drivers/block/deadline-iosched.c	2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/block/deadline-iosched.c	2003-07-19 17:03:49.000000000 -0700
+@@ -10,7 +10,6 @@
+ #include <linux/blkdev.h>
+ #include <linux/elevator.h>
+ #include <linux/bio.h>
+-#include <linux/blk.h>
+ #include <linux/config.h>
+ #include <linux/module.h>
+ #include <linux/slab.h>
+--- linux-2.6.0-test1/drivers/block/elevator.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/drivers/block/elevator.c	2003-07-19 17:03:49.000000000 -0700
+@@ -29,7 +29,6 @@
+ #include <linux/blkdev.h>
+ #include <linux/elevator.h>
+ #include <linux/bio.h>
+-#include <linux/blk.h>
+ #include <linux/config.h>
+ #include <linux/module.h>
+ #include <linux/slab.h>
+@@ -214,6 +213,18 @@ void elv_merge_requests(request_queue_t 
+ 		e->elevator_merge_req_fn(q, rq, next);
+ }
+ 
++void elv_requeue_request(request_queue_t *q, struct request *rq)
++{
++	/*
++	 * if iosched has an explicit requeue hook, then use that. otherwise
++	 * just put the request at the front of the queue
++	 */
++	if (q->elevator.elevator_requeue_req_fn)
++		q->elevator.elevator_requeue_req_fn(q, rq);
++	else
++		__elv_add_request(q, rq, 0, 0);
++}
++
+ void __elv_add_request(request_queue_t *q, struct request *rq, int at_end,
+ 		       int plug)
+ {
+@@ -417,6 +428,7 @@ EXPORT_SYMBOL(elevator_noop);
+ 
+ EXPORT_SYMBOL(elv_add_request);
+ EXPORT_SYMBOL(__elv_add_request);
++EXPORT_SYMBOL(elv_requeue_request);
+ EXPORT_SYMBOL(elv_next_request);
+ EXPORT_SYMBOL(elv_remove_request);
+ EXPORT_SYMBOL(elv_queue_empty);
+--- linux-2.6.0-test1/drivers/block/floppy98.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/block/floppy98.c	2003-07-19 17:03:49.000000000 -0700
+@@ -277,7 +277,6 @@ 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>
+--- linux-2.6.0-test1/drivers/block/floppy.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/drivers/block/floppy.c	2003-07-19 17:15:21.000000000 -0700
+@@ -242,7 +242,7 @@ static int irqdma_allocated;
+ #define LOCAL_END_REQUEST
+ #define DEVICE_NAME "floppy"
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/blkpg.h>
+ #include <linux/cdrom.h> /* for the compatibility eject ioctl */
+ #include <linux/completion.h>
+@@ -4261,6 +4261,7 @@ int __init floppy_init(void)
+ 			floppy_sizes[i] = MAX_DISK_SIZE << 1;
+ 
+ 	blk_init_queue(&floppy_queue, do_fd_request, &floppy_lock);
++	blk_queue_max_hw_segments(&floppy_queue, 1);
+ 	reschedule_timeout(MAXTIMEOUT, "floppy init", MAXTIMEOUT);
+ 	config_types();
+ 
+--- linux-2.6.0-test1/drivers/block/genhd.c	2003-07-10 18:50:30.000000000 -0700
++++ 25/drivers/block/genhd.c	2003-07-19 17:06:13.000000000 -0700
+@@ -7,7 +7,7 @@
+ #include <linux/fs.h>
+ #include <linux/genhd.h>
+ #include <linux/kernel.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/init.h>
+ #include <linux/spinlock.h>
+ #include <linux/seq_file.h>
+@@ -336,7 +336,7 @@ static struct sysfs_ops disk_sysfs_ops =
+ static ssize_t disk_dev_read(struct gendisk * disk, char *page)
+ {
+ 	dev_t base = MKDEV(disk->major, disk->first_minor); 
+-	return sprintf(page, "%04x\n", (unsigned)base);
++	return print_dev_t(page, base);
+ }
+ static ssize_t disk_range_read(struct gendisk * disk, char *page)
+ {
+--- linux-2.6.0-test1/drivers/block/ioctl.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/block/ioctl.c	2003-07-19 17:03:49.000000000 -0700
+@@ -1,5 +1,5 @@
+ #include <linux/sched.h>		/* for capable() */
+-#include <linux/blk.h>			/* for set_device_ro() */
++#include <linux/blkdev.h>
+ #include <linux/blkpg.h>
+ #include <linux/backing-dev.h>
+ #include <linux/buffer_head.h>
+@@ -166,13 +166,11 @@ int blkdev_ioctl(struct inode *inode, st
+ 			return -EINVAL;
+ 		if (get_user(n, (int *) arg))
+ 			return -EFAULT;
+-		if (n > PAGE_SIZE || n < 512 || (n & (n - 1)))
+-			return -EINVAL;
+ 		if (bd_claim(bdev, &holder) < 0)
+ 			return -EBUSY;
+-		set_blocksize(bdev, n);
++		ret = set_blocksize(bdev, n);
+ 		bd_release(bdev);
+-		return 0;
++		return ret;
+ 	case BLKPG:
+ 		return blkpg_ioctl(bdev, (struct blkpg_ioctl_arg *) arg);
+ 	case BLKRRPART:
+--- linux-2.6.0-test1/drivers/block/Kconfig	2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/block/Kconfig	2003-07-19 17:03:49.000000000 -0700
+@@ -264,6 +264,7 @@ config BLK_DEV_LOOP
+ 
+ config BLK_DEV_CRYPTOLOOP
+ 	tristate "Cryptoloop Support"
++	select CRYPTO
+ 	depends on BLK_DEV_LOOP
+ 	---help---
+ 	  Say Y here if you want to be able to use the ciphers that are 
+@@ -339,7 +340,7 @@ config BLK_DEV_INITRD
+ 
+ config LBD
+ 	bool "Support for Large Block Devices"
+-	depends on X86
++	depends on X86 || MIPS32 || PPC32 || ARCH_S390_31 || SUPERH
+ 	help
+ 	  Say Y here if you want to attach large (bigger than 2TB) discs to
+ 	  your machine, or if you want to have a raid or loopback device
+--- linux-2.6.0-test1/drivers/block/ll_rw_blk.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/block/ll_rw_blk.c	2003-07-19 17:06:49.000000000 -0700
+@@ -17,7 +17,7 @@
+ #include <linux/module.h>
+ #include <linux/backing-dev.h>
+ #include <linux/bio.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/highmem.h>
+ #include <linux/mm.h>
+ #include <linux/kernel_stat.h>
+@@ -371,6 +371,20 @@ void blk_queue_hardsect_size(request_que
+ }
+ 
+ /**
++ * blk_queue_stack_limits - inherit underlying queue limits for stacked drivers
++ * @t:	the stacking driver (top)
++ * @b:  the underlying device (bottom)
++ **/
++void blk_queue_stack_limits(request_queue_t *t, request_queue_t *b)
++{
++	t->max_sectors = min(t->max_sectors,b->max_sectors);
++	t->max_phys_segments = min(t->max_phys_segments,b->max_phys_segments);
++	t->max_hw_segments = min(t->max_hw_segments,b->max_hw_segments);
++	t->max_segment_size = min(t->max_segment_size,b->max_segment_size);
++	t->hardsect_size = max(t->hardsect_size,b->hardsect_size);
++}
++
++/**
+  * blk_queue_segment_boundary - set boundary rules for segment merging
+  * @q:  the request queue for the device
+  * @mask:  the memory boundary mask
+@@ -1494,6 +1508,23 @@ struct request *blk_get_request(request_
+ 
+ 	return rq;
+ }
++/**
++ * blk_requeue_request - put a request back on queue
++ * @q:		request queue where request should be inserted
++ * @rq:		request to be inserted
++ *
++ * Description:
++ *    Drivers often keep queueing requests until the hardware cannot accept
++ *    more, when that condition happens we need to put the request back
++ *    on the queue. Must be called with queue lock held.
++ */
++void blk_requeue_request(request_queue_t *q, struct request *rq)
++{
++	if (blk_rq_tagged(rq))
++		blk_queue_end_tag(q, rq);
++
++	elv_requeue_request(q, rq);
++}
+ 
+ /**
+  * blk_insert_request - insert a special request in to a request queue
+@@ -1659,25 +1690,50 @@ void blk_put_request(struct request *req
+ }
+ 
+ /**
+- * blk_congestion_wait - wait for a queue to become uncongested
++ * blk_congestion_wait_wq - wait for a queue to become uncongested,
+  * @rw: READ or WRITE
+  * @timeout: timeout in jiffies
++ * @wait : wait queue entry to use for waiting or async notification
++ * (NULL defaults to synchronous behaviour)
+  *
+  * Waits for up to @timeout jiffies for a queue (any queue) to exit congestion.
+  * If no queues are congested then just wait for the next request to be
+  * returned.
++ *
++ * If the wait queue parameter specifies an async i/o callback,
++ * then instead of blocking, just register the callback on the wait
++ * queue for async notification when the queue gets uncongested.
+  */
+-void blk_congestion_wait(int rw, long timeout)
++int blk_congestion_wait_wq(int rw, long timeout, wait_queue_t *wait)
+ {
+-	DEFINE_WAIT(wait);
+ 	wait_queue_head_t *wqh = &congestion_wqh[rw];
++	DEFINE_WAIT(local_wait);
++
++	if (!wait)
++		wait = &local_wait;
+ 
+ 	blk_run_queues();
+-	prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
++	prepare_to_wait(wqh, wait, TASK_UNINTERRUPTIBLE);
++	if (!is_sync_wait(wait)) {
++		/*
++		 * if we've queued an async wait queue
++		 * callback do not block; just tell the
++		 * caller to return and retry later when
++		 * the callback is notified
++		 */
++		return -EIOCBRETRY;
++	}
+ 	io_schedule_timeout(timeout);
+-	finish_wait(wqh, &wait);
++	finish_wait(wqh, wait);
++	return 0;
++}
++
++void blk_congestion_wait(int rw, long timeout)
++{
++	blk_congestion_wait_wq(rw, timeout, NULL);
+ }
+ 
++
+ /*
+  * Has to be called with the request spinlock acquired
+  */
+@@ -2720,6 +2776,7 @@ EXPORT_SYMBOL(blk_queue_max_phys_segment
+ EXPORT_SYMBOL(blk_queue_max_hw_segments);
+ EXPORT_SYMBOL(blk_queue_max_segment_size);
+ EXPORT_SYMBOL(blk_queue_hardsect_size);
++EXPORT_SYMBOL(blk_queue_stack_limits);
+ EXPORT_SYMBOL(blk_queue_segment_boundary);
+ EXPORT_SYMBOL(blk_queue_dma_alignment);
+ EXPORT_SYMBOL(blk_rq_map_sg);
+@@ -2730,6 +2787,7 @@ EXPORT_SYMBOL(blk_hw_contig_segment);
+ EXPORT_SYMBOL(blk_get_request);
+ EXPORT_SYMBOL(blk_put_request);
+ EXPORT_SYMBOL(blk_insert_request);
++EXPORT_SYMBOL(blk_requeue_request);
+ 
+ EXPORT_SYMBOL(blk_queue_prep_rq);
+ EXPORT_SYMBOL(blk_queue_merge_bvec);
+--- linux-2.6.0-test1/drivers/block/nbd.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/block/nbd.c	2003-07-19 17:03:49.000000000 -0700
+@@ -44,7 +44,6 @@
+ 
+ #include <linux/major.h>
+ 
+-#include <linux/blk.h>
+ #include <linux/blkdev.h>
+ #include <linux/module.h>
+ #include <linux/init.h>
+@@ -55,8 +54,6 @@
+ #include <linux/errno.h>
+ #include <linux/file.h>
+ #include <linux/ioctl.h>
+-#include <linux/blkdev.h>
+-#include <linux/blk.h>
+ #include <net/sock.h>
+ 
+ #include <linux/devfs_fs_kernel.h>
+@@ -261,7 +258,8 @@ void nbd_send_req(struct nbd_device *lo,
+ 	dprintk(DBG_TX, "%s: request %p: sending control (%s@%llu,%luB)\n",
+ 			lo->disk->disk_name, req,
+ 			nbdcmd_to_ascii(nbd_cmd(req)),
+-			req->sector << 9, req->nr_sectors << 9);
++			(unsigned long long)req->sector << 9,
++			req->nr_sectors << 9);
+ 	result = sock_xmit(sock, 1, &request, sizeof(request),
+ 			(nbd_cmd(req) == NBD_CMD_WRITE)? MSG_MORE: 0);
+ 	if (result <= 0) {
+--- linux-2.6.0-test1/drivers/block/paride/pcd.c	2003-06-14 12:18:35.000000000 -0700
++++ 25/drivers/block/paride/pcd.c	2003-07-19 17:03:49.000000000 -0700
+@@ -137,7 +137,7 @@ enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV,
+ #include <linux/delay.h>
+ #include <linux/cdrom.h>
+ #include <linux/spinlock.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/uaccess.h>
+ 
+ static spinlock_t pcd_lock;
+--- linux-2.6.0-test1/drivers/block/paride/pd.c	2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/block/paride/pd.c	2003-07-19 17:03:49.000000000 -0700
+@@ -150,7 +150,7 @@ enum {D_PRT, D_PRO, D_UNI, D_MOD, D_GEO,
+ #include <linux/delay.h>
+ #include <linux/hdreg.h>
+ #include <linux/cdrom.h>	/* for the eject ioctl */
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/blkpg.h>
+ #include <asm/uaccess.h>
+ 
+--- linux-2.6.0-test1/drivers/block/paride/pf.c	2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/block/paride/pf.c	2003-07-19 17:03:49.000000000 -0700
+@@ -150,7 +150,7 @@ enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV,
+ #include <linux/hdreg.h>
+ #include <linux/cdrom.h>
+ #include <linux/spinlock.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/blkpg.h>
+ #include <asm/uaccess.h>
+ 
+@@ -222,9 +222,6 @@ MODULE_PARM(drive3, "1-7i");
+ #define ATAPI_READ_10		0x28
+ #define ATAPI_WRITE_10		0x2a
+ 
+-#ifdef MODULE
+-void cleanup_module(void);
+-#endif
+ static int pf_open(struct inode *inode, struct file *file);
+ static void do_pf_request(request_queue_t * q);
+ static int pf_ioctl(struct inode *inode, struct file *file,
+--- linux-2.6.0-test1/drivers/block/ps2esdi.c	2003-06-14 12:17:55.000000000 -0700
++++ 25/drivers/block/ps2esdi.c	2003-07-19 17:03:49.000000000 -0700
+@@ -38,7 +38,7 @@
+ #include <linux/kernel.h>
+ #include <linux/genhd.h>
+ #include <linux/ps2esdi.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/mca.h>
+ #include <linux/init.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/block/swim3.c	2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/block/swim3.c	2003-07-19 17:03:49.000000000 -0700
+@@ -24,7 +24,6 @@
+ #include <linux/delay.h>
+ #include <linux/fd.h>
+ #include <linux/ioctl.h>
+-#include <linux/blk.h>
+ #include <linux/devfs_fs_kernel.h>
+ #include <asm/io.h>
+ #include <asm/dbdma.h>
+--- linux-2.6.0-test1/drivers/block/swim_iop.c	2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/block/swim_iop.c	2003-07-19 17:03:49.000000000 -0700
+@@ -30,7 +30,6 @@
+ #include <linux/timer.h>
+ #include <linux/delay.h>
+ #include <linux/fd.h>
+-#include <linux/blk.h>
+ #include <linux/ioctl.h>
+ #include <asm/io.h>
+ #include <asm/uaccess.h>
+--- linux-2.6.0-test1/drivers/block/umem.c	2003-06-14 12:18:51.000000000 -0700
++++ 25/drivers/block/umem.c	2003-07-19 17:03:49.000000000 -0700
+@@ -99,7 +99,7 @@ static int pci_cmds;
+ 
+ static int major_nr;
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/blkpg.h>
+ 
+ struct cardinfo {
+--- linux-2.6.0-test1/drivers/block/xd.c	2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/block/xd.c	2003-07-19 17:03:49.000000000 -0700
+@@ -46,7 +46,7 @@
+ #include <linux/init.h>
+ #include <linux/wait.h>
+ #include <linux/devfs_fs_kernel.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/blkpg.h>
+ 
+ #include <asm/system.h>
+--- linux-2.6.0-test1/drivers/block/z2ram.c	2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/block/z2ram.c	2003-07-19 17:03:49.000000000 -0700
+@@ -30,7 +30,6 @@
+ #include <linux/major.h>
+ #include <linux/slab.h>
+ #include <linux/vmalloc.h>
+-#include <linux/blk.h>
+ #include <linux/init.h>
+ #include <linux/module.h>
+ 
+--- linux-2.6.0-test1/drivers/cdrom/aztcd.c	2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/cdrom/aztcd.c	2003-07-19 17:03:49.000000000 -0700
+@@ -166,7 +166,7 @@
+ */
+ 
+ #include <linux/version.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "aztcd.h"
+ 
+ #include <linux/module.h>
+--- linux-2.6.0-test1/drivers/cdrom/cdrom.c	2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/cdrom/cdrom.c	2003-07-19 17:03:49.000000000 -0700
+@@ -268,6 +268,7 @@
+ #include <linux/init.h>
+ #include <linux/fcntl.h>
+ #include <linux/blkdev.h>
++#include <linux/times.h>
+ 
+ #include <asm/uaccess.h>
+ 
+@@ -2171,6 +2172,7 @@ static int mmc_ioctl(struct cdrom_device
+ 			return -ENOSYS;
+ 		cdinfo(CD_DO_IOCTL, "entering CDROM_SEND_PACKET\n"); 
+ 		IOCTL_IN(arg, struct cdrom_generic_command, cgc);
++		cgc.timeout = clock_t_to_jiffies(cgc.timeout);
+ 		return cdrom_do_cmd(cdi, &cgc);
+ 		}
+ 	case CDROM_NEXT_WRITABLE: {
+--- linux-2.6.0-test1/drivers/cdrom/cdu31a.c	2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/cdrom/cdu31a.c	2003-07-19 17:03:49.000000000 -0700
+@@ -177,7 +177,7 @@
+ #include "cdu31a.h"
+ 
+ #define MAJOR_NR CDU31A_CDROM_MAJOR
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ 
+ #define CDU31A_READAHEAD 4	/* 128 sector, 64kB, 32 reads read-ahead */
+ #define CDU31A_MAX_CONSECUTIVE_ATTENTIONS 10
+--- linux-2.6.0-test1/drivers/cdrom/cm206.c	2003-06-14 12:18:33.000000000 -0700
++++ 25/drivers/cdrom/cm206.c	2003-07-19 17:03:49.000000000 -0700
+@@ -199,7 +199,7 @@ History:
+ 
+ #define MAJOR_NR CM206_CDROM_MAJOR
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ 
+ #undef DEBUG
+ #define STATISTICS		/* record times and frequencies of events */
+--- linux-2.6.0-test1/drivers/cdrom/gscd.c	2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/cdrom/gscd.c	2003-07-19 17:03:49.000000000 -0700
+@@ -69,7 +69,7 @@
+ #include <asm/uaccess.h>
+ 
+ #define MAJOR_NR GOLDSTAR_CDROM_MAJOR
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #define gscd_port gscd		/* for compatible parameter passing with "insmod" */
+ #include "gscd.h"
+ 
+--- linux-2.6.0-test1/drivers/cdrom/mcd.c	2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/cdrom/mcd.c	2003-07-19 17:03:49.000000000 -0700
+@@ -101,7 +101,7 @@
+ #include <asm/io.h>
+ #include <asm/current.h>
+ #include <asm/uaccess.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ 
+ #define mcd_port mcd		/* for compatible parameter passing with "insmod" */
+ #include "mcd.h"
+--- linux-2.6.0-test1/drivers/cdrom/mcdx.c	2003-06-14 12:18:09.000000000 -0700
++++ 25/drivers/cdrom/mcdx.c	2003-07-19 17:03:49.000000000 -0700
+@@ -74,7 +74,7 @@ static const char *mcdx_c_version
+ 
+ #include <linux/major.h>
+ #define MAJOR_NR MITSUMI_X_CDROM_MAJOR
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/devfs_fs_kernel.h>
+ 
+ /* for compatible parameter passing with "insmod" */
+--- linux-2.6.0-test1/drivers/cdrom/optcd.c	2003-06-14 12:18:04.000000000 -0700
++++ 25/drivers/cdrom/optcd.c	2003-07-19 17:03:49.000000000 -0700
+@@ -73,7 +73,7 @@
+ #include <linux/init.h>
+ 
+ #include <asm/io.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ 
+ #include <linux/cdrom.h>
+ #include "optcd.h"
+--- linux-2.6.0-test1/drivers/cdrom/sbpcd.c	2003-06-14 12:17:59.000000000 -0700
++++ 25/drivers/cdrom/sbpcd.c	2003-07-19 17:03:49.000000000 -0700
+@@ -387,7 +387,7 @@
+ #include "sbpcd.h"
+ 
+ #define MAJOR_NR MATSUSHITA_CDROM_MAJOR
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ 
+ /*==========================================================================*/
+ #if SBPCD_DIS_IRQ
+--- linux-2.6.0-test1/drivers/cdrom/sjcd.c	2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/cdrom/sjcd.c	2003-07-19 17:03:49.000000000 -0700
+@@ -74,7 +74,7 @@
+ #include <asm/system.h>
+ #include <asm/io.h>
+ #include <asm/uaccess.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "sjcd.h"
+ 
+ static int sjcd_present = 0;
+--- linux-2.6.0-test1/drivers/cdrom/sonycd535.c	2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/cdrom/sonycd535.c	2003-07-19 17:03:49.000000000 -0700
+@@ -134,7 +134,7 @@
+ #include <linux/cdrom.h>
+ 
+ #define MAJOR_NR CDU535_CDROM_MAJOR
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ 
+ #define sony535_cd_base_io sonycd535 /* for compatible parameter passing with "insmod" */
+ #include "sonycd535.h"
+--- linux-2.6.0-test1/drivers/char/agp/i460-agp.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/char/agp/i460-agp.c	2003-07-19 17:03:49.000000000 -0700
+@@ -608,7 +608,7 @@ static struct pci_driver agp_intel_i460_
+ 	.name		= "agpgart-intel-i460",
+ 	.id_table	= agp_intel_i460_pci_table,
+ 	.probe		= agp_intel_i460_probe,
+-	.remove		= agp_intel_i460_remove,
++	.remove		= __devexit_p(agp_intel_i460_remove),
+ };
+ 
+ static int __init agp_intel_i460_init(void)
+--- linux-2.6.0-test1/drivers/char/busmouse.c	2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/char/busmouse.c	2003-07-19 17:03:49.000000000 -0700
+@@ -357,25 +357,23 @@ int register_busmouse(struct busmouse *o
+ {
+ 	unsigned int msedev = MINOR_TO_MOUSE(ops->minor);
+ 	struct busmouse_data *mse;
+-	int ret;
++	int ret = -EINVAL;
+ 
+ 	if (msedev >= NR_MICE) {
+ 		printk(KERN_ERR "busmouse: trying to allocate mouse on minor %d\n",
+ 		       ops->minor);
+-		return -EINVAL;
++		goto out;
+ 	}
+ 
++	ret = -ENOMEM;
+ 	mse = kmalloc(sizeof(*mse), GFP_KERNEL);
+ 	if (!mse)
+-		return -ENOMEM;
++		goto out;
+ 
+ 	down(&mouse_sem);
++	ret = -EBUSY;
+ 	if (busmouse_data[msedev])
+-	{
+-		up(&mouse_sem);
+-		kfree(mse);
+-		return -EBUSY;
+-	}
++		goto freemem;
+ 
+ 	memset(mse, 0, sizeof(*mse));
+ 
+@@ -386,14 +384,22 @@ int register_busmouse(struct busmouse *o
+ 	mse->lock = (spinlock_t)SPIN_LOCK_UNLOCKED;
+ 	init_waitqueue_head(&mse->wait);
+ 
+-	busmouse_data[msedev] = mse;
+ 
+ 	ret = misc_register(&mse->miscdev);
+-	if (!ret)
+-		ret = msedev;
++
++	if (ret < 0) 
++		goto freemem;
++
++	busmouse_data[msedev] = mse;
++	ret = msedev;
++out:
+ 	up(&mouse_sem);
+-	
+ 	return ret;
++
++
++freemem:
++	kfree(mse);
++	goto out;
+ }
+ 
+ /**
+--- linux-2.6.0-test1/drivers/char/drm/drm_memory.h	2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/char/drm/drm_memory.h	2003-07-19 17:07:16.000000000 -0700
+@@ -128,7 +128,7 @@ static inline unsigned long
+ drm_follow_page (void *vaddr)
+ {
+ 	pgd_t *pgd = pgd_offset_k((unsigned long) vaddr);
+-	pmd_t *pmd = pmd_offset(pgd, (unsigned long) vaddr);
++	pmd_t *pmd = pmd_offset_kernel(pgd, (unsigned long)vaddr);
+ 	pte_t *ptep = pte_offset_kernel(pmd, (unsigned long) vaddr);
+ 	return pte_pfn(*ptep) << PAGE_SHIFT;
+ }
+--- linux-2.6.0-test1/drivers/char/ftape/lowlevel/fdc-io.c	2003-06-14 12:18:04.000000000 -0700
++++ 25/drivers/char/ftape/lowlevel/fdc-io.c	2003-07-19 17:03:49.000000000 -0700
+@@ -66,6 +66,7 @@ int ft_mach2             = CONFIG_FT_MAC
+ 
+ /*      Local vars.
+  */
++static spinlock_t fdc_io_lock; 
+ static unsigned int fdc_calibr_count;
+ static unsigned int fdc_calibr_time;
+ static int fdc_status;
+@@ -89,14 +90,13 @@ void fdc_catch_stray_interrupts(int coun
+ {
+ 	unsigned long flags;
+ 
+-	save_flags(flags);
+-	cli();
++	spin_lock_irqsave(&fdc_io_lock, flags);
+ 	if (count == 0) {
+ 		ft_expected_stray_interrupts = 0;
+ 	} else {
+ 		ft_expected_stray_interrupts += count;
+ 	}
+-	restore_flags(flags);
++	spin_unlock_irqrestore(&fdc_io_lock, flags);
+ }
+ 
+ /*  Wait during a timeout period for a given FDC status.
+@@ -194,8 +194,7 @@ int fdc_command(const __u8 * cmd_data, i
+ 	TRACE_FUN(ft_t_any);
+ 
+ 	fdc_usec_wait(FT_RQM_DELAY);	/* wait for valid RQM status */
+-	save_flags(flags);
+-	cli();
++	spin_lock_irqsave(&fdc_io_lock, flags);
+ 	if (!in_interrupt())
+ 		/* Yes, I know, too much comments inside this function
+ 		 * ...
+@@ -242,12 +241,11 @@ int fdc_command(const __u8 * cmd_data, i
+ 
+ 			}
+ 			fdc_usec_wait(FT_RQM_DELAY);	/* wait for valid RQM status */
+-			save_flags(flags);
+-			cli();
++			spin_lock_irqsave(&fdc_io_lock, flags);
+ 		}
+ 	fdc_status = inb(fdc.msr);
+ 	if ((fdc_status & FDC_DATA_READY_MASK) != FDC_DATA_IN_READY) {
+-		restore_flags(flags);
++		spin_unlock_irqrestore(&fdc_io_lock, flags);
+ 		TRACE_ABORT(-EBUSY, ft_t_err, "fdc not ready");
+ 	} 
+ 	fdc_mode = *cmd_data;	/* used by isr */
+@@ -289,7 +287,7 @@ int fdc_command(const __u8 * cmd_data, i
+ 		last_time = ftape_timestamp();
+ 	}
+ #endif
+-	restore_flags(flags);
++	spin_unlock_irqrestore(&fdc_io_lock, flags);
+ 	TRACE_EXIT result;
+ }
+ 
+@@ -305,15 +303,14 @@ int fdc_result(__u8 * res_data, int res_
+ 	int retry = 0;
+ 	TRACE_FUN(ft_t_any);
+ 
+-	save_flags(flags);
+-	cli();
++	spin_lock_irqsave(&fdc_io_lock, flags);
+ 	fdc_status = inb(fdc.msr);
+ 	if ((fdc_status & FDC_DATA_READY_MASK) != FDC_DATA_OUT_READY) {
+ 		TRACE(ft_t_err, "fdc not ready");
+ 		result = -EBUSY;
+ 	} else while (count) {
+ 		if (!(fdc_status & FDC_BUSY)) {
+-			restore_flags(flags);
++			spin_unlock_irqrestore(&fdc_io_lock, flags);
+ 			TRACE_ABORT(-EIO, ft_t_err, "premature end of result phase");
+ 		}
+ 		result = fdc_read(res_data);
+@@ -336,7 +333,7 @@ int fdc_result(__u8 * res_data, int res_
+ 			++res_data;
+ 		}
+ 	}
+-	restore_flags(flags);
++	spin_unlock_irqrestore(&fdc_io_lock, flags);
+ 	fdc_usec_wait(FT_RQM_DELAY);	/* allow FDC to negate BSY */
+ 	TRACE_EXIT result;
+ }
+@@ -609,8 +606,7 @@ void fdc_reset(void)
+ 	unsigned long flags;
+ 	TRACE_FUN(ft_t_any);
+ 
+-	save_flags(flags);
+-	cli();
++	spin_lock_irqsave(&fdc_io_lock, flags);
+ 
+ 	fdc_dor_reset(1); /* keep unit selected */
+ 
+@@ -629,7 +625,7 @@ void fdc_reset(void)
+ 	 */
+ 	fdc_update_dsr();               /* restore data rate and precomp */
+ 
+-	restore_flags(flags);
++	spin_unlock_irqrestore(&fdc_io_lock, flags);
+ 
+         /*
+          *	Wait for first polling cycle to complete
+@@ -928,8 +924,7 @@ int fdc_setup_formatting(buffer_struct *
+ 	 */
+         TRACE(ft_t_fdc_dma,
+ 	      "phys. addr. = %lx", virt_to_bus((void*) buff->ptr));
+-	save_flags(flags);
+-	cli();			/* could be called from ISR ! */
++	spin_lock_irqsave(&fdc_io_lock, flags);
+ 	fdc_setup_dma(DMA_MODE_WRITE, buff->ptr, FT_SECTORS_PER_SEGMENT * 4);
+ 	/* Issue FDC command to start reading/writing.
+ 	 */
+@@ -937,7 +932,7 @@ int fdc_setup_formatting(buffer_struct *
+ 	out[4] = buff->gap3;
+ 	TRACE_CATCH(fdc_setup_error = fdc_command(out, sizeof(out)),
+ 		    restore_flags(flags); fdc_mode = fdc_idle);
+-	restore_flags(flags);
++	spin_unlock_irqrestore(&fdc_io_lock, flags);
+ 	TRACE_EXIT 0;
+ }
+ 
+@@ -977,11 +972,10 @@ int fdc_setup_read_write(buffer_struct *
+ 		break;
+ 	default:
+ 		TRACE_ABORT(-EIO,
+-			    ft_t_bug, "bug: illegal operation parameter");
++			    ft_t_bug, "bug: invalid operation parameter");
+ 	}
+ 	TRACE(ft_t_fdc_dma, "phys. addr. = %lx",virt_to_bus((void*)buff->ptr));
+-	save_flags(flags);
+-	cli();			/* could be called from ISR ! */
++	spin_lock_irqsave(&fdc_io_lock, flags);
+ 	if (operation != FDC_VERIFY) {
+ 		fdc_setup_dma(dma_mode, buff->ptr,
+ 			      FT_SECTOR_SIZE * buff->sector_count);
+@@ -999,7 +993,7 @@ int fdc_setup_read_write(buffer_struct *
+ 	out[8] = 0xff;		/* No limit to transfer size. */
+ 	TRACE(ft_t_fdc_dma, "C: 0x%02x, H: 0x%02x, R: 0x%02x, cnt: 0x%02x",
+ 		out[2], out[3], out[4], out[6] - out[4] + 1);
+-	restore_flags(flags);
++	spin_unlock_irqrestore(&fdc_io_lock, flags);
+ 	TRACE_CATCH(fdc_setup_error = fdc_command(out, 9),fdc_mode = fdc_idle);
+ 	TRACE_EXIT 0;
+ }
+--- linux-2.6.0-test1/drivers/char/ftape/lowlevel/ftape-calibr.c	2003-06-14 12:18:05.000000000 -0700
++++ 25/drivers/char/ftape/lowlevel/ftape-calibr.c	2003-07-19 17:03:49.000000000 -0700
+@@ -49,6 +49,8 @@
+ static unsigned long ps_per_cycle = 0;
+ #endif
+ 
++static spinlock_t calibr_lock;
++
+ /*
+  * Note: On Intel PCs, the clock ticks at 100 Hz (HZ==100) which is
+  * too slow for certain timeouts (and that clock doesn't even tick
+@@ -75,13 +77,12 @@ unsigned int ftape_timestamp(void)
+ 	__u16 lo;
+ 	__u16 hi;
+ 
+-	save_flags(flags);
+-	cli();
++	spin_lock_irqsave(&calibr_lock, flags);
+ 	outb_p(0x00, 0x43);	/* latch the count ASAP */
+ 	lo = inb_p(0x40);	/* read the latched count */
+ 	lo |= inb(0x40) << 8;
+ 	hi = jiffies;
+-	restore_flags(flags);
++	spin_unlock_irqrestore(&calibr_lock, flags);
+ 	return ((hi + 1) * (unsigned int) LATCH) - lo;  /* downcounter ! */
+ #endif
+ }
+@@ -94,12 +95,11 @@ static unsigned int short_ftape_timestam
+ 	unsigned int count;
+  	unsigned long flags;
+  
+- 	save_flags(flags);
+- 	cli();
++	spin_lock_irqsave(&calibr_lock, flags);
+  	outb_p(0x00, 0x43);	/* latch the count ASAP */
+ 	count = inb_p(0x40);	/* read the latched count */
+ 	count |= inb(0x40) << 8;
+- 	restore_flags(flags);
++	spin_unlock_irqrestore(&calibr_lock, flags);
+ 	return (LATCH - count);	/* normal: downcounter */
+ #endif
+ }
+@@ -150,14 +150,13 @@ static void time_inb(void)
+ 	int status;
+ 	TRACE_FUN(ft_t_any);
+ 
+-	save_flags(flags);
+-	cli();
++	spin_lock_irqsave(&calibr_lock, flags);
+ 	t0 = short_ftape_timestamp();
+ 	for (i = 0; i < 1000; ++i) {
+ 		status = inb(fdc.msr);
+ 	}
+ 	t1 = short_ftape_timestamp();
+-	restore_flags(flags);
++	spin_unlock_irqrestore(&calibr_lock, flags);
+ 	TRACE(ft_t_info, "inb() duration: %d nsec", ftape_timediff(t0, t1));
+ 	TRACE_EXIT;
+ }
+@@ -241,8 +240,7 @@ void ftape_calibrate(char *name,
+ 
+ 		*calibr_count =
+ 		*calibr_time = count;	/* set TC to 1 */
+-		save_flags(flags);
+-		cli();
++		spin_lock_irqsave(&calibr_lock, flags);
+ 		fun(0);		/* dummy, get code into cache */
+ 		t0 = short_ftape_timestamp();
+ 		fun(0);		/* overhead + one test */
+@@ -252,7 +250,7 @@ void ftape_calibrate(char *name,
+ 		fun(count);		/* overhead + count tests */
+ 		t1 = short_ftape_timestamp();
+ 		multiple = diff(t0, t1);
+-		restore_flags(flags);
++		spin_unlock_irqrestore(&calibr_lock, flags);
+ 		time = ftape_timediff(0, multiple - once);
+ 		tc = (1000 * time) / (count - 1);
+ 		TRACE(ft_t_any, "once:%3d us,%6d times:%6d us, TC:%5d ns",
+--- linux-2.6.0-test1/drivers/char/ftape/lowlevel/ftape-format.c	2003-06-14 12:18:21.000000000 -0700
++++ 25/drivers/char/ftape/lowlevel/ftape-format.c	2003-07-19 17:03:49.000000000 -0700
+@@ -44,6 +44,8 @@
+ #define FT_FMT_SEGS_PER_BUF (FT_BUFF_SIZE/(4*FT_SECTORS_PER_SEGMENT))
+ #endif
+ 
++static spinlock_t ftape_format_lock;
++
+ /*
+  *  first segment of the new buffer
+  */
+@@ -129,9 +131,9 @@ int ftape_format_track(const unsigned in
+ 	head->status = formatting;
+ 	TRACE_CATCH(ftape_seek_head_to_track(track),);
+ 	TRACE_CATCH(ftape_command(QIC_LOGICAL_FORWARD),);
+-	save_flags(flags); cli();
++	spin_lock_irqsave(&ftape_format_lock, flags);
+ 	TRACE_CATCH(fdc_setup_formatting(head), restore_flags(flags));
+-	restore_flags(flags);	
++	spin_unlock_irqrestore(&ftape_format_lock, flags);
+ 	TRACE_EXIT 0;
+ }
+ 
+--- linux-2.6.0-test1/drivers/char/ftape/zftape/zftape-init.c	2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/char/ftape/zftape/zftape-init.c	2003-07-19 17:03:49.000000000 -0700
+@@ -118,7 +118,7 @@ static int zft_open(struct inode *ino, s
+ 	     > 
+ 	    FTAPE_SEL_D) {
+ 		clear_bit(0,&busy_flag);
+-		TRACE_ABORT(-ENXIO, ft_t_err, "failed: illegal unit nr");
++		TRACE_ABORT(-ENXIO, ft_t_err, "failed: invalid unit nr");
+ 	}
+ 	orig_sigmask = current->blocked;
+ 	sigfillset(&current->blocked);
+--- linux-2.6.0-test1/drivers/char/ip2.c	2003-06-14 12:18:20.000000000 -0700
++++ 25/drivers/char/ip2.c	2003-07-19 17:03:49.000000000 -0700
+@@ -38,16 +38,14 @@ static int irq[IP2_MAX_BOARDS] = { -1, -
+ 
+ static int poll_only = 0;
+ 
+-#	if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0)
+-		MODULE_AUTHOR("Doug McNash");
+-		MODULE_DESCRIPTION("Computone IntelliPort Plus Driver");
+-		MODULE_PARM(irq,"1-"__MODULE_STRING(IP2_MAX_BOARDS) "i");
+-		MODULE_PARM_DESC(irq,"Interrupts for IntelliPort Cards");
+-		MODULE_PARM(io,"1-"__MODULE_STRING(IP2_MAX_BOARDS) "i");
+-		MODULE_PARM_DESC(io,"I/O ports for IntelliPort Cards");
+-		MODULE_PARM(poll_only,"1i");
+-		MODULE_PARM_DESC(poll_only,"Do not use card interrupts");
+-#	endif	/* LINUX_VERSION */
++MODULE_AUTHOR("Doug McNash");
++MODULE_DESCRIPTION("Computone IntelliPort Plus Driver");
++MODULE_PARM(irq,"1-"__MODULE_STRING(IP2_MAX_BOARDS) "i");
++MODULE_PARM_DESC(irq,"Interrupts for IntelliPort Cards");
++MODULE_PARM(io,"1-"__MODULE_STRING(IP2_MAX_BOARDS) "i");
++MODULE_PARM_DESC(io,"I/O ports for IntelliPort Cards");
++MODULE_PARM(poll_only,"1i");
++MODULE_PARM_DESC(poll_only,"Do not use card interrupts");
+ 
+ 
+ //======================================================================
+--- linux-2.6.0-test1/drivers/char/ip2/i2lib.c	2003-06-14 12:18:51.000000000 -0700
++++ 25/drivers/char/ip2/i2lib.c	2003-07-19 17:03:49.000000000 -0700
+@@ -1089,7 +1089,7 @@ i2Output(i2ChanStrPtr pCh, const char *p
+ 
+ 			// Move the data
+ 			if ( user ) {
+-				COPY_FROM_USER(rc, (char*)(DATA_OF(pInsert)), pSource,
++				rc = copy_from_user((char*)(DATA_OF(pInsert)), pSource,
+ 						amountToMove );
+ 			} else {
+ 				memcpy( (char*)(DATA_OF(pInsert)), pSource, amountToMove );
+--- linux-2.6.0-test1/drivers/char/ip2/i2os.h	2003-06-14 12:18:09.000000000 -0700
++++ 25/drivers/char/ip2/i2os.h	2003-07-19 17:03:49.000000000 -0700
+@@ -19,8 +19,6 @@
+ #ifndef I2OS_H    /* To prevent multiple includes */
+ #define I2OS_H 1
+ 
+-#define VERSION(ver,rel,seq) (((ver)<<16) | ((rel)<<8) | (seq))
+-
+ //-------------------------------------------------
+ // Required Includes
+ //-------------------------------------------------
+@@ -46,22 +44,6 @@
+ // Interrupt control
+ //--------------------------------------------
+ 
+-#if LINUX_VERSION_CODE < 0x00020100
+-typedef int spinlock_t;
+-#define spin_lock_init() 
+-#define spin_lock(a)
+-#define spin_unlock(a)
+-#define spin_lock_irqsave(a,b)			{save_flags((b));cli();}
+-#define spin_unlock_irqrestore(a,b)		{restore_flags((b));}
+-#define write_lock_irqsave(a,b)			spin_lock_irqsave(a,b)
+-#define write_unlock_irqrestore(a,b)	spin_unlock_irqrestore(a,b)
+-#define read_lock_irqsave(a,b)			spin_lock_irqsave(a,b)
+-#define read_unlock_irqrestore(a,b)		spin_unlock_irqrestore(a,b)
+-#endif
+-
+-//#define SAVE_AND_DISABLE_INTS(a,b)	spin_lock_irqsave(a,b)
+-//#define RESTORE_INTS(a,b)         	spin_unlock_irqrestore(a,b)
+-
+ #define LOCK_INIT(a)	rwlock_init(a)
+ 
+ #define SAVE_AND_DISABLE_INTS(a,b) { \
+--- linux-2.6.0-test1/drivers/char/ip2main.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/char/ip2main.c	2003-07-19 17:03:49.000000000 -0700
+@@ -83,7 +83,6 @@
+ /* Includes */
+ /************/
+ #include <linux/config.h>
+-// Uncomment the following if you want it compiled with modversions
+ 
+ #include <linux/version.h>
+ 
+@@ -120,82 +119,11 @@
+ #include <asm/irq.h>
+ #include <asm/bitops.h>
+ 
+-#ifndef KERNEL_VERSION
+-#define KERNEL_VERSION(ver,rel,seq) (((ver)<<16) | ((rel)<<8) | (seq))
+-#endif
+-
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0)
+-#	include <linux/vmalloc.h>
+-#	include <linux/init.h>
+-#	include <asm/serial.h>
+-#else
+-#	include <linux/bios32.h>
+-#endif
++#include <linux/vmalloc.h>
++#include <linux/init.h>
++#include <asm/serial.h>
+ 
+-// These VERSION switches maybe inexact because I simply don't know
+-// when the various features appeared in the 2.1.XX kernels.
+-// They are good enough for 2.0 vs 2.2 and if you are fooling with
+-// the 2.1.XX stuff then it would be trivial for you to fix.
+-// Most of these macros were stolen from some other drivers
+-// so blame them.
+-
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,4)
+-#	define GET_USER(error,value,addr) error = get_user(value,addr)
+-#	define COPY_FROM_USER(error,dest,src,size) error = copy_from_user(dest,src,size) ? -EFAULT : 0
+-#	define PUT_USER(error,value,addr) error = put_user(value,addr)
+-#	define COPY_TO_USER(error,dest,src,size) error = copy_to_user(dest,src,size) ? -EFAULT : 0
+-
+-#	if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,5)
+-#		include <asm/uaccess.h>
+-#		define		pcibios_strerror(status)	\
+-					printk( KERN_ERR "IP2: PCI error 0x%x \n", status );
+-#	endif
+-
+-#else  /* 2.0.x and 2.1.x before 2.1.4 */
+-
+-#	define		proc_register_dynamic(a,b) proc_register(a,b) 
+-
+-#	define GET_USER(error,value,addr)					  \
+-	do {									  \
+-		error = verify_area (VERIFY_READ, (void *) addr, sizeof (value)); \
+-		if (error == 0)							  \
+-			value = get_user(addr);					  \
+-	} while (0)
+-
+-#	define COPY_FROM_USER(error,dest,src,size)				  \
+-	do {									  \
+-		error = verify_area (VERIFY_READ, (void *) src, size);		  \
+-		if (error == 0)							  \
+-			memcpy_fromfs (dest, src, size);			  \
+-	} while (0)
+-
+-#	define PUT_USER(error,value,addr)					   \
+-	do {									   \
+-		error = verify_area (VERIFY_WRITE, (void *) addr, sizeof (value)); \
+-		if (error == 0)							   \
+-			put_user (value, addr);					   \
+-	} while (0)
+-
+-#	define COPY_TO_USER(error,dest,src,size)				  \
+-	do {									  \
+-		error = verify_area (VERIFY_WRITE, (void *) dest, size);		  \
+-		if (error == 0)							  \
+-			memcpy_tofs (dest, src, size);				  \
+-	} while (0)
+-
+-#endif
+-
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
+-#define __init
+-#define __initfunc(a) a
+-#define __initdata
+-#define ioremap(a,b) vremap((a),(b))
+-#define iounmap(a) vfree((a))
+-#define SERIAL_TYPE_NORMAL	1
+-#define schedule_timeout(a){current->timeout = jiffies + (a); schedule();}
+-#define signal_pending(a) ((a)->signal & ~(a)->blocked)
+-#define in_interrupt()	intr_count
+-#endif
++#include <asm/uaccess.h>
+ 
+ #include "./ip2/ip2types.h"
+ #include "./ip2/ip2trace.h"
+@@ -276,11 +204,7 @@ static int set_modem_info(i2ChanStrPtr, 
+ static int get_serial_info(i2ChanStrPtr, struct serial_struct *);
+ static int set_serial_info(i2ChanStrPtr, struct serial_struct *);
+ 
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
+-static int     ip2_ipl_read(struct inode *, char *, size_t , loff_t *);
+-#else
+-static ssize_t ip2_ipl_read(struct file *, char *, size_t, loff_t *) ;
+-#endif
++static ssize_t ip2_ipl_read(struct file *, char *, size_t, loff_t *);
+ static ssize_t ip2_ipl_write(struct file *, const char *, size_t, loff_t *);
+ static int ip2_ipl_ioctl(struct inode *, struct file *, UINT, ULONG);
+ static int ip2_ipl_open(struct inode *, struct file *);
+@@ -354,9 +278,6 @@ static int tracewrap;
+ #define DBG_CNT(s)
+ #endif
+ 
+-#define MIN(a,b)	( ( (a) < (b) ) ? (a) : (b) )
+-#define MAX(a,b)	( ( (a) > (b) ) ? (a) : (b) )
+-
+ /********/
+ /* Code */
+ /********/
+@@ -366,12 +287,9 @@ static int tracewrap;
+ #include "./ip2/i2lib.c"      /* High level interface services */
+ 
+ /* Configuration area for modprobe */
+-#ifdef MODULE
+-#	if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0)
+-		MODULE_AUTHOR("Doug McNash");
+-		MODULE_DESCRIPTION("Computone IntelliPort Plus Driver");
+-#	endif	/* LINUX_VERSION */
+-#endif	/* MODULE */
++
++MODULE_AUTHOR("Doug McNash");
++MODULE_DESCRIPTION("Computone IntelliPort Plus Driver");
+ 
+ static int poll_only = 0;
+ 
+@@ -660,53 +578,6 @@ ip2_loadmain(int *iop, int *irqp, unsign
+ 			break;
+ 		case PCI:
+ #ifdef CONFIG_PCI
+-#if (LINUX_VERSION_CODE < 0x020163) /* 2.1.99 */
+-			if (pcibios_present()) {
+-				unsigned char pci_bus, pci_devfn;
+-				int Pci_index = 0;
+-				status = pcibios_find_device(PCI_VENDOR_ID_COMPUTONE,
+-							  PCI_DEVICE_ID_COMPUTONE_IP2EX, Pci_index,
+-							  &pci_bus, &pci_devfn);
+-				if (status == 0) {
+-					unsigned int addr;
+-					unsigned char pci_irq;
+-
+-					ip2config.type[i] = PCI;
+-					/* 
+-					 * Update Pci_index, so that the next time we go
+-					 * searching for a PCI board we find a different
+-					 * one.
+-					 */
+-					++Pci_index;
+-
+-					pcibios_read_config_dword(pci_bus, pci_devfn,
+-								  PCI_BASE_ADDRESS_1, &addr);
+-					if ( addr & 1 ) {
+-						ip2config.addr[i]=(USHORT)(addr&0xfffe);
+-					} else {
+-						printk( KERN_ERR "IP2: PCI I/O address error\n");
+-					}
+-					pcibios_read_config_byte(pci_bus, pci_devfn,
+-								  PCI_INTERRUPT_LINE, &pci_irq);
+-
+-//		If the PCI BIOS assigned it, lets try and use it.  If we
+-//		can't acquire it or it screws up, deal with it then.
+-
+-//					if (!is_valid_irq(pci_irq)) {
+-//						printk( KERN_ERR "IP2: Bad PCI BIOS IRQ(%d)\n",pci_irq);
+-//						pci_irq = 0;
+-//					}
+-					ip2config.irq[i] = pci_irq;
+-				} else {	// ann error
+-					ip2config.addr[i] = 0;
+-					if (status == PCIBIOS_DEVICE_NOT_FOUND) {
+-						printk( KERN_ERR "IP2: PCI board %d not found\n", i );
+-					} else {
+-						pcibios_strerror(status);
+-					}
+-				} 
+-			} 
+-#else /* LINUX_VERSION_CODE > 2.1.99 */
+ 			{
+ 				struct pci_dev *pci_dev_i = NULL;
+ 				pci_dev_i = pci_find_device(PCI_VENDOR_ID_COMPUTONE,
+@@ -739,11 +610,10 @@ ip2_loadmain(int *iop, int *irqp, unsign
+ 					if (status == PCIBIOS_DEVICE_NOT_FOUND) {
+ 						printk( KERN_ERR "IP2: PCI board %d not found\n", i );
+ 					} else {
+-						pcibios_strerror(status);
++						printk( KERN_ERR "IP2: PCI error 0x%x \n", status );
+ 					}
+ 				} 
+ 			}
+-#endif	/* ! 2_0_X */
+ #else
+ 			printk( KERN_ERR "IP2: PCI card specified but PCI support not\n");
+ 			printk( KERN_ERR "IP2: configured in this kernel.\n");
+@@ -2193,7 +2063,7 @@ ip2_ioctl ( PTTY tty, struct file *pFile
+ 
+ 		ip2trace (CHANN, ITRC_IOCTL, 6, 1, rc );
+ 
+-			PUT_USER(rc,C_CLOCAL(tty) ? 1 : 0, (unsigned long *) arg);
++			rc = put_user(C_CLOCAL(tty) ? 1 : 0, (unsigned long *) arg);
+ 		if (rc)	
+ 			return rc;
+ 	break;
+@@ -2202,7 +2072,7 @@ ip2_ioctl ( PTTY tty, struct file *pFile
+ 
+ 		ip2trace (CHANN, ITRC_IOCTL, 7, 1, rc );
+ 
+-		GET_USER(rc,arg,(unsigned long *) arg);
++		rc = get_user(arg,(unsigned long *) arg);
+ 		if (rc) 
+ 			return rc;
+ 		tty->termios->c_cflag = ((tty->termios->c_cflag & ~CLOCAL)
+@@ -2243,7 +2113,7 @@ ip2_ioctl ( PTTY tty, struct file *pFile
+ 			return -EINTR;
+ 		}
+ #endif
+-		PUT_USER(rc,
++		rc = put_user(
+ 				    ((pCh->dataSetOut & I2_RTS) ? TIOCM_RTS : 0)
+ 				  | ((pCh->dataSetOut & I2_DTR) ? TIOCM_DTR : 0)
+ 				  | ((pCh->dataSetIn  & I2_DCD) ? TIOCM_CAR : 0)
+@@ -2333,17 +2203,17 @@ ip2_ioctl ( PTTY tty, struct file *pFile
+ 		cnow = pCh->icount;
+ 		restore_flags(flags);
+ 		p_cuser = (struct serial_icounter_struct *) arg;
+-		PUT_USER(rc,cnow.cts, &p_cuser->cts);
+-		PUT_USER(rc,cnow.dsr, &p_cuser->dsr);
+-		PUT_USER(rc,cnow.rng, &p_cuser->rng);
+-		PUT_USER(rc,cnow.dcd, &p_cuser->dcd);
+-		PUT_USER(rc,cnow.rx, &p_cuser->rx);
+-		PUT_USER(rc,cnow.tx, &p_cuser->tx);
+-		PUT_USER(rc,cnow.frame, &p_cuser->frame);
+-		PUT_USER(rc,cnow.overrun, &p_cuser->overrun);
+-		PUT_USER(rc,cnow.parity, &p_cuser->parity);
+-		PUT_USER(rc,cnow.brk, &p_cuser->brk);
+-		PUT_USER(rc,cnow.buf_overrun, &p_cuser->buf_overrun);
++		rc = put_user(cnow.cts, &p_cuser->cts);
++		rc = put_user(cnow.dsr, &p_cuser->dsr);
++		rc = put_user(cnow.rng, &p_cuser->rng);
++		rc = put_user(cnow.dcd, &p_cuser->dcd);
++		rc = put_user(cnow.rx, &p_cuser->rx);
++		rc = put_user(cnow.tx, &p_cuser->tx);
++		rc = put_user(cnow.frame, &p_cuser->frame);
++		rc = put_user(cnow.overrun, &p_cuser->overrun);
++		rc = put_user(cnow.parity, &p_cuser->parity);
++		rc = put_user(cnow.brk, &p_cuser->brk);
++		rc = put_user(cnow.buf_overrun, &p_cuser->buf_overrun);
+ 		break;
+ 
+ 	/*
+@@ -2387,7 +2257,7 @@ set_modem_info(i2ChanStrPtr pCh, unsigne
+ 	int rc;
+ 	unsigned int arg;
+ 
+-	GET_USER(rc,arg,value);
++	rc = get_user(arg,value);
+ 	if (rc)
+ 		return rc;
+ 	switch(cmd) {
+@@ -2469,7 +2339,7 @@ get_serial_info ( i2ChanStrPtr pCh, stru
+ 	tmp.close_delay = pCh->ClosingDelay;
+ 	tmp.closing_wait = pCh->ClosingWaitTime;
+ 	tmp.custom_divisor = pCh->BaudDivisor;
+-   	COPY_TO_USER(rc,retinfo,&tmp,sizeof(*retinfo));
++   	rc = copy_to_user(retinfo,&tmp,sizeof(*retinfo));
+    return rc;
+ }
+ 
+@@ -2489,15 +2359,15 @@ set_serial_info( i2ChanStrPtr pCh, struc
+ {
+ 	struct serial_struct ns;
+ 	int   old_flags, old_baud_divisor;
+-	int     rc = 0;
+ 
+ 	if ( !new_info ) {
+ 		return -EFAULT;
+ 	}
+-	COPY_FROM_USER(rc, &ns, new_info, sizeof (ns) );
+-	if (rc) {
+-		return rc;
++
++	if (copy_from_user(&ns, new_info, sizeof (ns))) {
++		return -EFAULT;
+ 	}
++
+ 	/*
+ 	 * We don't allow setserial to change IRQ, board address, type or baud
+ 	 * base. Also line nunber as such is meaningless but we use it for our
+@@ -2537,7 +2407,7 @@ set_serial_info( i2ChanStrPtr pCh, struc
+ 		set_params( pCh, NULL );
+ 	}
+ 
+-	return rc;
++	return 0;
+ }
+ 
+ /******************************************************************************/
+@@ -2860,16 +2730,10 @@ service_it:
+ /******************************************************************************/
+ 
+ static 
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
+-int
+-ip2_ipl_read(struct inode *pInode, char *pData, size_t count, loff_t *off )
+-	unsigned int minor = minor( pInode->i_rdev );
+-#else
+ ssize_t
+ ip2_ipl_read(struct file *pFile, char *pData, size_t count, loff_t *off )
+ {
+ 	unsigned int minor = minor( pFile->f_dentry->d_inode->i_rdev );
+-#endif
+ 	int rc = 0;
+ 
+ #ifdef IP2DEBUG_IPL
+@@ -2904,7 +2768,7 @@ DumpFifoBuffer ( char *pData, int count 
+ {
+ #ifdef DEBUG_FIFO
+ 	int rc;
+-	COPY_TO_USER(rc, pData, DBGBuf, count);
++	rc = copy_to_user(pData, DBGBuf, count);
+ 
+ 	printk(KERN_DEBUG "Last index %d\n", I );
+ 
+@@ -2925,10 +2789,10 @@ DumpTraceBuffer ( char *pData, int count
+ 	if ( count < (sizeof(int) * 6) ) {
+ 		return -EIO;
+ 	}
+-	PUT_USER(rc, tracewrap, pIndex );
+-	PUT_USER(rc, TRACEMAX, ++pIndex );
+-	PUT_USER(rc, tracestrip, ++pIndex );
+-	PUT_USER(rc, tracestuff, ++pIndex );
++	rc = put_user(tracewrap, pIndex );
++	rc = put_user(TRACEMAX, ++pIndex );
++	rc = put_user(tracestrip, ++pIndex );
++	rc = put_user(tracestuff, ++pIndex );
+ 	pData += sizeof(int) * 6;
+ 	count -= sizeof(int) * 6;
+ 
+@@ -2941,7 +2805,7 @@ DumpTraceBuffer ( char *pData, int count
+ 	}
+ 	chunk = TRACEMAX - tracestrip;
+ 	if ( dumpcount > chunk ) {
+-		COPY_TO_USER(rc, pData, &tracebuf[tracestrip],
++		rc = copy_to_user(pData, &tracebuf[tracestrip],
+ 			      chunk * sizeof(tracebuf[0]) );
+ 		pData += chunk * sizeof(tracebuf[0]);
+ 		tracestrip = 0;
+@@ -2949,13 +2813,13 @@ DumpTraceBuffer ( char *pData, int count
+ 	} else {
+ 		chunk = dumpcount;
+ 	}
+-	COPY_TO_USER(rc, pData, &tracebuf[tracestrip],
++	rc = copy_to_user(pData, &tracebuf[tracestrip],
+ 		      chunk * sizeof(tracebuf[0]) );
+ 	tracestrip += chunk;
+ 	tracewrap = 0;
+ 
+-	PUT_USER(rc, tracestrip, ++pIndex );
+-	PUT_USER(rc, tracestuff, ++pIndex );
++	rc = put_user(tracestrip, ++pIndex );
++	rc = put_user(tracestuff, ++pIndex );
+ 
+ 	return dumpcount;
+ #else
+@@ -3019,15 +2883,15 @@ ip2_ipl_ioctl ( struct inode *pInode, st
+ 	case 13:
+ 		switch ( cmd ) {
+ 		case 64:	/* Driver - ip2stat */
+-			PUT_USER(rc, ip2_tty_driver->refcount, pIndex++ );
+-			PUT_USER(rc, irq_counter, pIndex++  );
+-			PUT_USER(rc, bh_counter, pIndex++  );
++			rc = put_user(ip2_tty_driver->refcount, pIndex++ );
++			rc = put_user(irq_counter, pIndex++  );
++			rc = put_user(bh_counter, pIndex++  );
+ 			break;
+ 
+ 		case 65:	/* Board  - ip2stat */
+ 			if ( pB ) {
+-				COPY_TO_USER(rc, (char*)arg, (char*)pB, sizeof(i2eBordStr) );
+-				PUT_USER(rc, INB(pB->i2eStatus),
++				rc = copy_to_user((char*)arg, (char*)pB, sizeof(i2eBordStr) );
++				rc = put_user(INB(pB->i2eStatus),
+ 					(ULONG*)(arg + (ULONG)(&pB->i2eStatus) - (ULONG)pB ) );
+ 			} else {
+ 				rc = -ENODEV;
+@@ -3039,7 +2903,7 @@ ip2_ipl_ioctl ( struct inode *pInode, st
+ 				pCh = DevTable[cmd];
+ 				if ( pCh )
+ 				{
+-					COPY_TO_USER(rc, (char*)arg, (char*)pCh, sizeof(i2ChanStr) );
++					rc = copy_to_user((char*)arg, (char*)pCh, sizeof(i2ChanStr) );
+ 				} else {
+ 					rc = -ENODEV;
+ 				}
+@@ -3054,60 +2918,60 @@ ip2_ipl_ioctl ( struct inode *pInode, st
+ 		break;
+ 	case 3:	    // Trace device
+ 		if ( cmd == 1 ) {
+-			PUT_USER(rc, iiSendPendingMail, pIndex++ );
+-			PUT_USER(rc, i2InitChannels, pIndex++ );
+-			PUT_USER(rc, i2QueueNeeds, pIndex++ );
+-			PUT_USER(rc, i2QueueCommands, pIndex++ );
+-			PUT_USER(rc, i2GetStatus, pIndex++ );
+-			PUT_USER(rc, i2Input, pIndex++ );
+-			PUT_USER(rc, i2InputFlush, pIndex++ );
+-			PUT_USER(rc, i2Output, pIndex++ );
+-			PUT_USER(rc, i2FlushOutput, pIndex++ );
+-			PUT_USER(rc, i2DrainWakeup, pIndex++ );
+-			PUT_USER(rc, i2DrainOutput, pIndex++ );
+-			PUT_USER(rc, i2OutputFree, pIndex++ );
+-			PUT_USER(rc, i2StripFifo, pIndex++ );
+-			PUT_USER(rc, i2StuffFifoBypass, pIndex++ );
+-			PUT_USER(rc, i2StuffFifoFlow, pIndex++ );
+-			PUT_USER(rc, i2StuffFifoInline, pIndex++ );
+-			PUT_USER(rc, i2ServiceBoard, pIndex++ );
+-			PUT_USER(rc, serviceOutgoingFifo, pIndex++ );
+-			// PUT_USER(rc, ip2_init, pIndex++ );
+-			PUT_USER(rc, ip2_init_board, pIndex++ );
+-			PUT_USER(rc, find_eisa_board, pIndex++ );
+-			PUT_USER(rc, set_irq, pIndex++ );
+-			PUT_USER(rc, ip2_interrupt, pIndex++ );
+-			PUT_USER(rc, ip2_poll, pIndex++ );
+-			PUT_USER(rc, service_all_boards, pIndex++ );
+-			PUT_USER(rc, do_input, pIndex++ );
+-			PUT_USER(rc, do_status, pIndex++ );
++			rc = put_user(iiSendPendingMail, pIndex++ );
++			rc = put_user(i2InitChannels, pIndex++ );
++			rc = put_user(i2QueueNeeds, pIndex++ );
++			rc = put_user(i2QueueCommands, pIndex++ );
++			rc = put_user(i2GetStatus, pIndex++ );
++			rc = put_user(i2Input, pIndex++ );
++			rc = put_user(i2InputFlush, pIndex++ );
++			rc = put_user(i2Output, pIndex++ );
++			rc = put_user(i2FlushOutput, pIndex++ );
++			rc = put_user(i2DrainWakeup, pIndex++ );
++			rc = put_user(i2DrainOutput, pIndex++ );
++			rc = put_user(i2OutputFree, pIndex++ );
++			rc = put_user(i2StripFifo, pIndex++ );
++			rc = put_user(i2StuffFifoBypass, pIndex++ );
++			rc = put_user(i2StuffFifoFlow, pIndex++ );
++			rc = put_user(i2StuffFifoInline, pIndex++ );
++			rc = put_user(i2ServiceBoard, pIndex++ );
++			rc = put_user(serviceOutgoingFifo, pIndex++ );
++			// rc = put_user(ip2_init, pIndex++ );
++			rc = put_user(ip2_init_board, pIndex++ );
++			rc = put_user(find_eisa_board, pIndex++ );
++			rc = put_user(set_irq, pIndex++ );
++			rc = put_user(ip2_interrupt, pIndex++ );
++			rc = put_user(ip2_poll, pIndex++ );
++			rc = put_user(service_all_boards, pIndex++ );
++			rc = put_user(do_input, pIndex++ );
++			rc = put_user(do_status, pIndex++ );
+ #ifndef IP2DEBUG_OPEN
+-			PUT_USER(rc, 0, pIndex++ );
++			rc = put_user(0, pIndex++ );
+ #else
+-			PUT_USER(rc, open_sanity_check, pIndex++ );
++			rc = put_user(open_sanity_check, pIndex++ );
+ #endif
+-			PUT_USER(rc, ip2_open, pIndex++ );
+-			PUT_USER(rc, ip2_close, pIndex++ );
+-			PUT_USER(rc, ip2_hangup, pIndex++ );
+-			PUT_USER(rc, ip2_write, pIndex++ );
+-			PUT_USER(rc, ip2_putchar, pIndex++ );
+-			PUT_USER(rc, ip2_flush_chars, pIndex++ );
+-			PUT_USER(rc, ip2_write_room, pIndex++ );
+-			PUT_USER(rc, ip2_chars_in_buf, pIndex++ );
+-			PUT_USER(rc, ip2_flush_buffer, pIndex++ );
+-
+-			//PUT_USER(rc, ip2_wait_until_sent, pIndex++ );
+-			PUT_USER(rc, 0, pIndex++ );
+-
+-			PUT_USER(rc, ip2_throttle, pIndex++ );
+-			PUT_USER(rc, ip2_unthrottle, pIndex++ );
+-			PUT_USER(rc, ip2_ioctl, pIndex++ );
+-			PUT_USER(rc, set_modem_info, pIndex++ );
+-			PUT_USER(rc, get_serial_info, pIndex++ );
+-			PUT_USER(rc, set_serial_info, pIndex++ );
+-			PUT_USER(rc, ip2_set_termios, pIndex++ );
+-			PUT_USER(rc, ip2_set_line_discipline, pIndex++ );
+-			PUT_USER(rc, set_params, pIndex++ );
++			rc = put_user(ip2_open, pIndex++ );
++			rc = put_user(ip2_close, pIndex++ );
++			rc = put_user(ip2_hangup, pIndex++ );
++			rc = put_user(ip2_write, pIndex++ );
++			rc = put_user(ip2_putchar, pIndex++ );
++			rc = put_user(ip2_flush_chars, pIndex++ );
++			rc = put_user(ip2_write_room, pIndex++ );
++			rc = put_user(ip2_chars_in_buf, pIndex++ );
++			rc = put_user(ip2_flush_buffer, pIndex++ );
++
++			//rc = put_user(ip2_wait_until_sent, pIndex++ );
++			rc = put_user(0, pIndex++ );
++
++			rc = put_user(ip2_throttle, pIndex++ );
++			rc = put_user(ip2_unthrottle, pIndex++ );
++			rc = put_user(ip2_ioctl, pIndex++ );
++			rc = put_user(set_modem_info, pIndex++ );
++			rc = put_user(get_serial_info, pIndex++ );
++			rc = put_user(set_serial_info, pIndex++ );
++			rc = put_user(ip2_set_termios, pIndex++ );
++			rc = put_user(ip2_set_line_discipline, pIndex++ );
++			rc = put_user(set_params, pIndex++ );
+ 		} else {
+ 			rc = -EINVAL;
+ 		}
+--- linux-2.6.0-test1/drivers/char/istallion.c	2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/char/istallion.c	2003-07-19 17:03:49.000000000 -0700
+@@ -650,8 +650,6 @@ static unsigned int	stli_baudrates[] = {
+  */
+ 
+ #ifdef MODULE
+-int		init_module(void);
+-void		cleanup_module(void);
+ static void	stli_argbrds(void);
+ static int	stli_parsebrd(stlconf_t *confp, char **argp);
+ 
+--- linux-2.6.0-test1/drivers/char/keyboard.c	2003-06-26 22:07:24.000000000 -0700
++++ 25/drivers/char/keyboard.c	2003-07-19 17:04:02.000000000 -0700
+@@ -1055,6 +1055,9 @@ void kbd_keycode(unsigned int keycode, i
+ 	}
+ 	if (sysrq_down && down && !rep) {
+ 		handle_sysrq(kbd_sysrq_xlate[keycode], regs, tty);
++#ifdef CONFIG_KGDB_SYSRQ
++                sysrq_down = 0;        /* in case we miss the "up" event */
++#endif
+ 		return;
+ 	}
+ #endif
+--- linux-2.6.0-test1/drivers/char/moxa.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/char/moxa.c	2003-07-19 17:03:49.000000000 -0700
+@@ -216,10 +216,7 @@ static struct timer_list moxaEmptyTimer[
+ static struct semaphore moxaBuffSem;
+ 
+ int moxa_init(void);
+-#ifdef MODULE
+-int init_module(void);
+-void cleanup_module(void);
+-#endif
++
+ /*
+  * static functions:
+  */
+--- linux-2.6.0-test1/drivers/char/nwbutton.h	2003-06-14 12:18:04.000000000 -0700
++++ 25/drivers/char/nwbutton.h	2003-07-19 17:03:49.000000000 -0700
+@@ -32,10 +32,6 @@ int button_init (void);
+ int button_add_callback (void (*callback) (void), int count);
+ int button_del_callback (void (*callback) (void));
+ static void button_consume_callbacks (int bpcount);
+-#ifdef MODULE
+-int init_module (void);
+-void cleanup_module (void);
+-#endif /* MODULE */
+ 
+ #else /* Not compiling the driver itself */
+ 
+--- linux-2.6.0-test1/drivers/char/pcxx.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/char/pcxx.c	2003-07-19 17:03:49.000000000 -0700
+@@ -209,17 +209,9 @@ static void cleanup_board_resources(void
+ 
+ #ifdef MODULE
+ 
+-/*
+- * pcxe_init() is our init_module():
+- */
+-#define pcxe_init init_module
+-
+-void	cleanup_module(void);
+-
+-
+ /*****************************************************************************/
+ 
+-void cleanup_module()
++static void pcxe_cleanup()
+ {
+ 
+ 	unsigned long	flags;
+@@ -240,6 +232,12 @@ void cleanup_module()
+ 	kfree(digi_channels);
+ 	restore_flags(flags);
+ }
++
++/*
++ * pcxe_init() is our init_module():
++ */
++module_init(pcxe_init);
++module_cleanup(pcxe_cleanup);
+ #endif
+ 
+ static inline struct channel *chan(register struct tty_struct *tty)
+--- linux-2.6.0-test1/drivers/char/stallion.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/char/stallion.c	2003-07-19 17:03:49.000000000 -0700
+@@ -472,8 +472,6 @@ static unsigned int	stl_baudrates[] = {
+  */
+ 
+ #ifdef MODULE
+-int		init_module(void);
+-void		cleanup_module(void);
+ static void	stl_argbrds(void);
+ static int	stl_parsebrd(stlconf_t *confp, char **argp);
+ 
+--- linux-2.6.0-test1/drivers/char/sysrq.c	2003-06-26 22:07:24.000000000 -0700
++++ 25/drivers/char/sysrq.c	2003-07-19 17:04:02.000000000 -0700
+@@ -35,6 +35,19 @@
+ #include <linux/spinlock.h>
+ 
+ #include <asm/ptrace.h>
++#ifdef CONFIG_KGDB_SYSRQ
++
++#define  GDB_OP &kgdb_op
++static struct sysrq_key_op kgdb_op={
++	handler:	(void*)breakpoint,
++	help_msg:	"kGdb ",
++	action_msg:	"Debug breakpoint\n",
++};
++
++#else
++#define  GDB_OP NULL
++#endif
++
+ 
+ extern void reset_vc(unsigned int);
+ extern struct list_head super_blocks;
+@@ -240,7 +253,7 @@ static struct sysrq_key_op *sysrq_key_ta
+ /* d */	NULL,
+ /* e */	&sysrq_term_op,
+ /* f */	NULL,
+-/* g */	NULL,
++/* g */	GDB_OP,
+ /* h */	NULL,
+ /* i */	&sysrq_kill_op,
+ /* j */	NULL,
+--- linux-2.6.0-test1/drivers/char/tty_io.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/char/tty_io.c	2003-07-19 17:06:13.000000000 -0700
+@@ -2106,7 +2106,7 @@ static spinlock_t tty_dev_list_lock = SP
+ static ssize_t show_dev(struct class_device *class_dev, char *buf)
+ {
+ 	struct tty_dev *tty_dev = to_tty_dev(class_dev);
+-	return sprintf(buf, "%04lx\n", (unsigned long)tty_dev->dev);
++	return print_dev_t(buf, tty_dev->dev);
+ }
+ static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
+ 
+--- linux-2.6.0-test1/drivers/char/watchdog/acquirewdt.c	2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/char/watchdog/acquirewdt.c	2003-07-19 17:03:49.000000000 -0700
+@@ -143,7 +143,7 @@ static int acq_open(struct inode *inode,
+ 			return -EBUSY;
+ 		}
+ 		if (nowayout)
+-			MOD_INC_USE_COUNT;
++			__module_get(THIS_MODULE);
+ 
+ 		/* Activate */
+ 		acq_is_open=1;
+--- linux-2.6.0-test1/drivers/char/watchdog/i810-tco.c	2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/char/watchdog/i810-tco.c	2003-07-19 17:03:49.000000000 -0700
+@@ -25,7 +25,8 @@
+  *	82801AA & 82801AB  chip : document number 290655-003, 290677-004,
+  *	82801BA & 82801BAM chip : document number 290687-002, 298242-005,
+  *	82801CA & 82801CAM chip : document number 290716-001, 290718-001,
+- *	82801DB & 82801E   chip : document number 290744-001, 273599-001
++ *	82801DB & 82801E   chip : document number 290744-001, 273599-001,
++ *	82801EB & 82801ER  chip : document number 252516-001
+  *
+  *  20000710 Nils Faerber
+  *	Initial Version 0.01
+@@ -42,9 +43,11 @@
+  *	     clean up ioctls (WDIOC_GETSTATUS, WDIOC_GETBOOTSTATUS and
+  *	     WDIOC_SETOPTIONS), made i810tco_getdevice __init,
+  *	     removed boot_status, removed tco_timer_read,
+- *	     added support for 82801DB and 82801E chipset, general cleanup.
++ *	     added support for 82801DB and 82801E chipset,
++ *	     added support for 82801EB and 8280ER chipset,
++ *	     general cleanup.
+  */
+- 
++
+ #include <linux/module.h>
+ #include <linux/types.h>
+ #include <linux/miscdevice.h>
+@@ -164,7 +167,7 @@ static int tco_timer_settimer (unsigned 
+  * Reload (trigger) the timer. Lock is needed so we don't reload it during
+  * a reprogramming event
+  */
+- 
++
+ static void tco_timer_reload (void)
+ {
+ 	spin_lock(&tco_lock);
+@@ -307,6 +310,7 @@ static struct pci_device_id i810tco_pci_
+ 	{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12,	PCI_ANY_ID, PCI_ANY_ID, },
+ 	{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0,	PCI_ANY_ID, PCI_ANY_ID, },
+ 	{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801E_0,	PCI_ANY_ID, PCI_ANY_ID, },
++	{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0,	PCI_ANY_ID, PCI_ANY_ID, },
+ 	{ 0, },
+ };
+ MODULE_DEVICE_TABLE (pci, i810tco_pci_tbl);
+--- linux-2.6.0-test1/drivers/char/watchdog/i810-tco.h	2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/char/watchdog/i810-tco.h	2003-07-19 17:03:49.000000000 -0700
+@@ -1,5 +1,5 @@
+ /*
+- *	i810-tco 0.05:	TCO timer driver for i8xx chipsets
++ *	i810-tco:	TCO timer driver for i8xx chipsets
+  *
+  *	(c) Copyright 2000 kernel concepts <nils@kernelconcepts.de>, All Rights Reserved.
+  *				http://www.kernelconcepts.de
+@@ -8,7 +8,7 @@
+  *	modify it under the terms of the GNU General Public License
+  *	as published by the Free Software Foundation; either version
+  *	2 of the License, or (at your option) any later version.
+- *	
++ *
+  *	Neither kernel concepts nor Nils Faerber admit liability nor provide
+  *	warranty for any of this software. This material is provided
+  *	"AS-IS" and at no charge.
+--- linux-2.6.0-test1/drivers/char/watchdog/ib700wdt.c	2003-06-14 12:18:33.000000000 -0700
++++ 25/drivers/char/watchdog/ib700wdt.c	2003-07-19 17:03:49.000000000 -0700
+@@ -230,7 +230,7 @@ ibwdt_open(struct inode *inode, struct f
+ 			return -EBUSY;
+ 		}
+ 		if (nowayout)
+-			MOD_INC_USE_COUNT;
++			__module_get(THIS_MODULE);
+ 
+ 		/* Activate */
+ 		ibwdt_is_open = 1;
+--- linux-2.6.0-test1/drivers/char/watchdog/indydog.c	2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/char/watchdog/indydog.c	2003-07-19 17:03:49.000000000 -0700
+@@ -54,7 +54,7 @@ static int indydog_open(struct inode *in
+ 		return -EBUSY;
+ 
+ 	if (nowayout)
+-		MOD_INC_USE_COUNT;
++		__module_get(THIS_MODULE);
+ 
+ 	/*
+ 	 *	Activate timer
+--- linux-2.6.0-test1/drivers/char/watchdog/machzwd.c	2003-06-14 12:17:59.000000000 -0700
++++ 25/drivers/char/watchdog/machzwd.c	2003-07-19 17:03:49.000000000 -0700
+@@ -392,7 +392,7 @@ static int zf_open(struct inode *inode, 
+ 			}
+ 
+ 			if (nowayout)
+-				MOD_INC_USE_COUNT;
++				__module_get(THIS_MODULE);
+ 
+ 			zf_is_open = 1;
+ 
+--- linux-2.6.0-test1/drivers/char/watchdog/pcwd.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/char/watchdog/pcwd.c	2003-07-19 17:03:49.000000000 -0700
+@@ -431,7 +431,7 @@ static int pcwd_open(struct inode *ino, 
+ 			atomic_inc( &open_allowed );
+ 			return -EBUSY;
+ 		}
+-		MOD_INC_USE_COUNT;
++		__module_get(THIS_MODULE);
+ 		/*  Enable the port  */
+ 		if (revision == PCWD_REVISION_C) {
+ 			spin_lock(&io_lock);
+--- linux-2.6.0-test1/drivers/char/watchdog/sbc60xxwdt.c	2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/char/watchdog/sbc60xxwdt.c	2003-07-19 17:03:49.000000000 -0700
+@@ -207,9 +207,8 @@ static int fop_open(struct inode * inode
+ 			/* Just in case we're already talking to someone... */
+ 			if(wdt_is_open)
+ 				return -EBUSY;
+-			if (nowayout) {
+-				MOD_INC_USE_COUNT;
+-			}
++			if (nowayout) 
++				__module_get(THIS_MODULE);
+ 			/* Good, fire up the show */
+ 			wdt_is_open = 1;
+ 			wdt_startup();
+--- linux-2.6.0-test1/drivers/char/watchdog/sc520_wdt.c	2003-06-14 12:18:20.000000000 -0700
++++ 25/drivers/char/watchdog/sc520_wdt.c	2003-07-19 17:03:49.000000000 -0700
+@@ -231,7 +231,7 @@ static int fop_open(struct inode * inode
+ 			/* Good, fire up the show */
+ 			wdt_startup();
+ 			if (nowayout)
+-				MOD_INC_USE_COUNT;
++				__module_get(THIS_MODULE);
+ 
+ 			return 0;
+ 		default:
+--- linux-2.6.0-test1/drivers/char/watchdog/shwdt.c	2003-06-14 12:18:06.000000000 -0700
++++ 25/drivers/char/watchdog/shwdt.c	2003-07-19 17:03:49.000000000 -0700
+@@ -3,7 +3,7 @@
+  *
+  * Watchdog driver for integrated watchdog in the SuperH processors.
+  *
+- * Copyright (C) 2001, 2002 Paul Mundt <lethal@0xd6.org>
++ * Copyright (C) 2001, 2002, 2003 Paul Mundt <lethal@linux-sh.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
+@@ -12,6 +12,10 @@
+  *
+  * 14-Dec-2001 Matt Domsch <Matt_Domsch@dell.com>
+  *     Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT
++ *
++ * 19-Apr-2002 Rob Radez <rob@osinvestor.com>
++ *     Added expect close support, made emulated timeout runtime changeable
++ *     general cleanups, add some ioctls
+  */
+ #include <linux/config.h>
+ #include <linux/module.h>
+@@ -22,76 +26,50 @@
+ #include <linux/reboot.h>
+ #include <linux/notifier.h>
+ #include <linux/ioport.h>
++#include <linux/fs.h>
+ 
+ #include <asm/io.h>
+ #include <asm/uaccess.h>
+-
+-#if defined(CONFIG_CPU_SH5)
+-  #define WTCNT		CPRC_BASE + 0x10
+-  #define WTCSR		CPRC_BASE + 0x18
+-#elif defined(CONFIG_CPU_SH4)
+-  #define WTCNT		0xffc00008
+-  #define WTCSR		0xffc0000c
+-#elif defined(CONFIG_CPU_SH3)
+-  #define WTCNT		0xffffff84
+-  #define WTCSR		0xffffff86
+-#else
+-  #error "Can't use SuperH watchdog on this platform"
+-#endif
+-
+-#define WTCNT_HIGH	0x5a00
+-#define WTCSR_HIGH	0xa500
+-
+-#define WTCSR_TME	0x80
+-#define WTCSR_WT	0x40
+-#define WTCSR_RSTS	0x20
+-#define WTCSR_WOVF	0x10
+-#define WTCSR_IOVF	0x08
+-#define WTCSR_CKS2	0x04
+-#define WTCSR_CKS1	0x02
+-#define WTCSR_CKS0	0x01
+-
+-/*
+- * CKS0-2 supports a number of clock division ratios. At the time the watchdog
+- * is enabled, it defaults to a 41 usec overflow period .. we overload this to
+- * something a little more reasonable, and really can't deal with anything
+- * lower than WTCSR_CKS_1024, else we drop back into the usec range.
+- *
+- * Clock Division Ratio         Overflow Period
+- * --------------------------------------------
+- *     1/32 (initial value)       41 usecs
+- *     1/64                       82 usecs
+- *     1/128                     164 usecs
+- *     1/256                     328 usecs
+- *     1/512                     656 usecs
+- *     1/1024                   1.31 msecs
+- *     1/2048                   2.62 msecs
+- *     1/4096                   5.25 msecs
+- */
+-#define WTCSR_CKS_32	0x00
+-#define WTCSR_CKS_64	0x01
+-#define WTCSR_CKS_128	0x02
+-#define WTCSR_CKS_256	0x03
+-#define WTCSR_CKS_512	0x04
+-#define WTCSR_CKS_1024	0x05
+-#define WTCSR_CKS_2048	0x06
+-#define WTCSR_CKS_4096	0x07
++#include <asm/watchdog.h>
+ 
+ /*
+- * Default clock division ratio is 5.25 msecs. Overload this at module load
+- * time. Any value not in the msec range will default to a timeout of one
+- * jiffy, which exceeds the usec overflow periods.
++ * Default clock division ratio is 5.25 msecs. For an additional table of
++ * values, consult the asm-sh/watchdog.h. Overload this at module load
++ * time. 
++ *
++ * In order for this to work reliably we need to have HZ set to 1000 or
++ * something quite higher than 100 (or we need a proper high-res timer
++ * implementation that will deal with this properly), otherwise the 10ms
++ * resolution of a jiffy is enough to trigger the overflow. For things like
++ * the SH-4 and SH-5, this isn't necessarily that big of a problem, though
++ * for the SH-2 and SH-3, this isn't recommended unless the WDT is absolutely
++ * necssary.
++ *
++ * As a result of this timing problem, the only modes that are particularly
++ * feasible are the 4096 and the 2048 divisors, which yeild 5.25 and 2.62ms
++ * overflow periods respectively.
++ *
++ * Also, since we can't really expect userspace to be responsive enough
++ * before the overflow happens, we maintain two seperate timers .. One in
++ * the kernel for clearing out WOVF every 2ms or so (again, this depends on
++ * HZ == 1000), and another for monitoring userspace writes to the WDT device.
++ *
++ * As such, we currently use a configurable heartbeat interval which defaults
++ * to 30s. In this case, the userspace daemon is only responsible for periodic
++ * writes to the device before the next heartbeat is scheduled. If the daemon
++ * misses its deadline, the kernel timer will allow the WDT to overflow.
+  */
+ static int clock_division_ratio = WTCSR_CKS_4096;
+ 
+-#define msecs_to_jiffies(msecs)	(jiffies + ((HZ * msecs + 999) / 1000))
++#define msecs_to_jiffies(msecs)	(jiffies + (HZ * msecs + 9999) / 10000)
+ #define next_ping_period(cks)	msecs_to_jiffies(cks - 4)
+-#define user_ping_period(cks)	(next_ping_period(cks) * 10)
+ 
+-static unsigned long sh_is_open = 0;
++static unsigned long shwdt_is_open;
+ static struct watchdog_info sh_wdt_info;
++static char shwdt_expect_close;
+ static struct timer_list timer;
+ static unsigned long next_heartbeat;
++static int heartbeat = 30;
+ 
+ #ifdef CONFIG_WATCHDOG_NOWAYOUT
+ static int nowayout = 1;
+@@ -99,35 +77,6 @@ static int nowayout = 1;
+ static int nowayout = 0;
+ #endif
+ 
+-MODULE_PARM(nowayout,"i");
+-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+-
+-/**
+- *	sh_wdt_write_cnt - Write to Counter
+- *
+- *	@val: Value to write
+- *
+- *	Writes the given value @val to the lower byte of the timer counter.
+- *	The upper byte is set manually on each write.
+- */
+-static void sh_wdt_write_cnt(__u8 val)
+-{
+-	ctrl_outw(WTCNT_HIGH | (__u16)val, WTCNT);
+-}
+-
+-/**
+- * 	sh_wdt_write_csr - Write to Control/Status Register
+- *
+- * 	@val: Value to write
+- *
+- * 	Writes the given value @val to the lower byte of the control/status
+- * 	register. The upper byte is set manually on each write.
+- */
+-static void sh_wdt_write_csr(__u8 val)
+-{
+-	ctrl_outw(WTCSR_HIGH | (__u16)val, WTCSR);
+-}
+-
+ /**
+  * 	sh_wdt_start - Start the Watchdog
+  *
+@@ -135,13 +84,44 @@ static void sh_wdt_write_csr(__u8 val)
+  */
+ static void sh_wdt_start(void)
+ {
+-	timer.expires = next_ping_period(clock_division_ratio);
+-	next_heartbeat = user_ping_period(clock_division_ratio);
+-	add_timer(&timer);
++	__u8 csr;
++
++	mod_timer(&timer, next_ping_period(clock_division_ratio));
++	next_heartbeat = jiffies + (heartbeat * HZ);
++
++	csr = sh_wdt_read_csr();
++	csr |= WTCSR_WT | clock_division_ratio;
++	sh_wdt_write_csr(csr);
+ 
+-	sh_wdt_write_csr(WTCSR_WT | WTCSR_CKS_4096);
+ 	sh_wdt_write_cnt(0);
+-	sh_wdt_write_csr((ctrl_inb(WTCSR) | WTCSR_TME));
++
++	/*
++	 * These processors have a bit of an inconsistent initialization
++	 * process.. starting with SH-3, RSTS was moved to WTCSR, and the
++	 * RSTCSR register was removed.
++	 *
++	 * On the SH-2 however, in addition with bits being in different
++	 * locations, we must deal with RSTCSR outright..
++	 */
++	csr = sh_wdt_read_csr();
++	csr |= WTCSR_TME;
++	csr &= ~WTCSR_RSTS;
++	sh_wdt_write_csr(csr);
++
++#ifdef CONFIG_CPU_SH2
++	/*
++	 * Whoever came up with the RSTCSR semantics must've been smoking
++	 * some of the good stuff, since in addition to the WTCSR/WTCNT write
++	 * brain-damage, it's managed to fuck things up one step further..
++	 *
++	 * If we need to clear the WOVF bit, the upper byte has to be 0xa5..
++	 * but if we want to touch RSTE or RSTS, the upper byte has to be
++	 * 0x5a..
++	 */
++	csr = sh_wdt_read_rstcsr();
++	csr &= ~RSTCSR_RSTS;
++	sh_wdt_write_rstcsr(csr);
++#endif	
+ }
+ 
+ /**
+@@ -151,9 +131,13 @@ static void sh_wdt_start(void)
+  */
+ static void sh_wdt_stop(void)
+ {
++	__u8 csr;
++
+ 	del_timer(&timer);
+ 
+-	sh_wdt_write_csr((ctrl_inb(WTCSR) & ~WTCSR_TME));
++	csr = sh_wdt_read_csr();
++	csr &= ~WTCSR_TME;
++	sh_wdt_write_csr(csr);
+ }
+ 
+ /**
+@@ -166,11 +150,15 @@ static void sh_wdt_stop(void)
+ static void sh_wdt_ping(unsigned long data)
+ {
+ 	if (time_before(jiffies, next_heartbeat)) {
+-		sh_wdt_write_csr((ctrl_inb(WTCSR) & ~WTCSR_IOVF));
++		__u8 csr;
++
++		csr = sh_wdt_read_csr();
++		csr &= ~WTCSR_IOVF;
++		sh_wdt_write_csr(csr);
++
+ 		sh_wdt_write_cnt(0);
+ 
+-		timer.expires = next_ping_period(clock_division_ratio);
+-		add_timer(&timer);
++		mod_timer(&timer, next_ping_period(clock_division_ratio));
+ 	}
+ }
+ 
+@@ -184,21 +172,12 @@ static void sh_wdt_ping(unsigned long da
+  */
+ static int sh_wdt_open(struct inode *inode, struct file *file)
+ {
+-	switch (minor(inode->i_rdev)) {
+-		case WATCHDOG_MINOR:
+-			if (test_and_set_bit(0, &sh_is_open))
+-				return -EBUSY;
++	if (test_and_set_bit(0, &shwdt_is_open))
++		return -EBUSY;
++	if (nowayout)
++		__module_get(THIS_MODULE);
+ 
+-			if (nowayout) {
+-				MOD_INC_USE_COUNT;
+-			}
+-
+-			sh_wdt_start();
+-
+-			break;
+-		default:
+-			return -ENODEV;
+-	}
++	sh_wdt_start();
+ 
+ 	return 0;
+ }
+@@ -213,33 +192,20 @@ static int sh_wdt_open(struct inode *ino
+  */
+ static int sh_wdt_close(struct inode *inode, struct file *file)
+ {
+-	if (minor(inode->i_rdev) == WATCHDOG_MINOR) {
+-		if (!nowayout) {
+-			sh_wdt_stop();
+-		}
+-		clear_bit(0, &sh_is_open);
++	if (!nowayout && shwdt_expect_close == 42) {
++		sh_wdt_stop();
++	} else {
++		printk(KERN_CRIT "shwdt: Unexpected close, not stopping watchdog!\n");
++		next_heartbeat = jiffies + (heartbeat * HZ);
+ 	}
++
++	clear_bit(0, &shwdt_is_open);
++	shwdt_expect_close = 0;
+ 	
+ 	return 0;
+ }
+ 
+ /**
+- * 	sh_wdt_read - Read from Device
+- *
+- * 	@file: file handle of device
+- * 	@buf: buffer to write to
+- * 	@count: length of buffer
+- * 	@ppos: offset
+- *
+- * 	Unsupported.
+- */
+-static ssize_t sh_wdt_read(struct file *file, char *buf,
+-			   size_t count, loff_t *ppos)
+-{
+-	return -EINVAL;
+-}
+-
+-/**
+  * 	sh_wdt_write - Write to Device
+  *
+  * 	@file: file handle of device
+@@ -257,11 +223,21 @@ static ssize_t sh_wdt_write(struct file 
+ 		return -ESPIPE;
+ 
+ 	if (count) {
+-		next_heartbeat = user_ping_period(clock_division_ratio);
+-		return 1;
++		size_t i;
++
++		shwdt_expect_close = 0;
++
++		for (i = 0; i != count; i++) {
++			char c;
++			if (get_user(c, buf + i))
++				return -EFAULT;
++			if (c == 'V')
++				shwdt_expect_close = 42;
++		}
++		next_heartbeat = jiffies + (heartbeat * HZ);
+ 	}
+ 
+-	return 0;
++	return count;
+ }
+ 
+ /**
+@@ -278,6 +254,8 @@ static ssize_t sh_wdt_write(struct file 
+ static int sh_wdt_ioctl(struct inode *inode, struct file *file,
+ 			unsigned int cmd, unsigned long arg)
+ {
++	int new_timeout;
++
+ 	switch (cmd) {
+ 		case WDIOC_GETSUPPORT:
+ 			if (copy_to_user((struct watchdog_info *)arg,
+@@ -288,17 +266,41 @@ static int sh_wdt_ioctl(struct inode *in
+ 			
+ 			break;
+ 		case WDIOC_GETSTATUS:
+-			if (copy_to_user((int *)arg,
+-					 &sh_is_open,
+-					 sizeof(int))) {
++		case WDIOC_GETBOOTSTATUS:
++			return put_user(0, (int *)arg);
++		case WDIOC_KEEPALIVE:
++			next_heartbeat = jiffies + (heartbeat * HZ);
++
++			break;
++		case WDIOC_SETTIMEOUT:
++			if (get_user(new_timeout, (int *)arg))
+ 				return -EFAULT;
++			if (new_timeout < 1 || new_timeout > 3600) /* arbitrary upper limit */
++				return -EINVAL;
++			heartbeat = new_timeout;
++			next_heartbeat = jiffies + (heartbeat * HZ);
++			/* Fall */
++		case WDIOC_GETTIMEOUT:
++			return put_user(heartbeat, (int *)arg);
++		case WDIOC_SETOPTIONS:
++		{
++			int options, retval = -EINVAL;
++
++			if (get_user(options, (int *)arg))
++				return -EFAULT;
++
++			if (options & WDIOS_DISABLECARD) {
++				sh_wdt_stop();
++				retval = 0;
+ 			}
+ 
+-			break;
+-		case WDIOC_KEEPALIVE:
+-			next_heartbeat = user_ping_period(clock_division_ratio);
++			if (options & WDIOS_ENABLECARD) {
++				sh_wdt_start();
++				retval = 0;
++			}
+ 			
+-			break;
++			return retval;
++		}
+ 		default:
+ 			return -ENOTTY;
+ 	}
+@@ -328,7 +330,7 @@ static int sh_wdt_notify_sys(struct noti
+ 
+ static struct file_operations sh_wdt_fops = {
+ 	.owner		= THIS_MODULE,
+-	.read		= sh_wdt_read,
++	.llseek		= no_llseek,
+ 	.write		= sh_wdt_write,
+ 	.ioctl		= sh_wdt_ioctl,
+ 	.open		= sh_wdt_open,
+@@ -336,21 +338,20 @@ static struct file_operations sh_wdt_fop
+ };
+ 
+ static struct watchdog_info sh_wdt_info = {
+-	.options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE,
+-	.firmware_version = 1,
+-	.identity = "SH WDT",
++	.options		= WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE,
++	.firmware_version	= 1,
++	.identity		= "SH WDT",
+ };
+ 
+ static struct notifier_block sh_wdt_notifier = {
+-	.notifier_call = sh_wdt_notify_sys,
+-	.next = NULL,
+-	.priority = 0
++	.notifier_call		= sh_wdt_notify_sys,
++	.priority		= 0,
+ };
+ 
+ static struct miscdevice sh_wdt_miscdev = {
+-	.minor = WATCHDOG_MINOR,
+-	.name = "watchdog",
+-	.fops &sh_wdt_fops,
++	.minor		= WATCHDOG_MINOR,
++	.name		= "watchdog",
++	.fops		= &sh_wdt_fops,
+ };
+ 
+ /**
+@@ -366,23 +367,8 @@ static int __init sh_wdt_init(void)
+ 		return -EINVAL;
+ 	}
+ 
+-	if (!request_region(WTCNT, 1, "shwdt")) {
+-		printk(KERN_ERR "shwdt: Can't request WTCNT region\n");
+-		misc_deregister(&sh_wdt_miscdev);
+-		return -ENXIO;
+-	}
+-
+-	if (!request_region(WTCSR, 1, "shwdt")) {
+-		printk(KERN_ERR "shwdt: Can't request WTCSR region\n");
+-		release_region(WTCNT, 1);
+-		misc_deregister(&sh_wdt_miscdev);
+-		return -ENXIO;
+-	}
+-
+ 	if (register_reboot_notifier(&sh_wdt_notifier)) {
+ 		printk(KERN_ERR "shwdt: Can't register reboot notifier\n");
+-		release_region(WTCSR, 1);
+-		release_region(WTCNT, 1);
+ 		misc_deregister(&sh_wdt_miscdev);
+ 		return -EINVAL;
+ 	}
+@@ -403,16 +389,16 @@ static int __init sh_wdt_init(void)
+ static void __exit sh_wdt_exit(void)
+ {
+ 	unregister_reboot_notifier(&sh_wdt_notifier);
+-	release_region(WTCSR, 1);
+-	release_region(WTCNT, 1);
+ 	misc_deregister(&sh_wdt_miscdev);
+ }
+ 
+-MODULE_AUTHOR("Paul Mundt <lethal@0xd6.org>");
++MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>");
+ MODULE_DESCRIPTION("SuperH watchdog driver");
+ MODULE_LICENSE("GPL");
+ MODULE_PARM(clock_division_ratio, "i");
+ MODULE_PARM_DESC(clock_division_ratio, "Clock division ratio. Valid ranges are from 0x5 (1.31ms) to 0x7 (5.25ms). Defaults to 0x7.");
++MODULE_PARM(nowayout,"i");
++MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+ 
+ module_init(sh_wdt_init);
+ module_exit(sh_wdt_exit);
+--- linux-2.6.0-test1/drivers/char/watchdog/softdog.c	2003-06-14 12:18:08.000000000 -0700
++++ 25/drivers/char/watchdog/softdog.c	2003-07-19 17:03:49.000000000 -0700
+@@ -104,9 +104,8 @@ static int softdog_open(struct inode *in
+ {
+ 	if(test_and_set_bit(0, &timer_alive))
+ 		return -EBUSY;
+-	if (nowayout) {
+-		MOD_INC_USE_COUNT;
+-	}
++	if (nowayout) 
++		__module_get(THIS_MODULE);
+ 	/*
+ 	 *	Activate timer
+ 	 */
+--- linux-2.6.0-test1/drivers/char/watchdog/wdt977.c	2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/char/watchdog/wdt977.c	2003-07-19 17:03:49.000000000 -0700
+@@ -16,6 +16,8 @@
+  *	19-Dec-2001 Woody Suwalski: Netwinder fixes, ioctl interface
+  *	06-Jan-2002 Woody Suwalski: For compatibility, convert all timeouts
+  *				    from minutes to seconds.
++ *      07-Jul-2003 Daniele Bellucci: Audit return code of misc_register in
++ *                                    nwwatchdog_init.
+  */
+ 
+ #include <linux/module.h>
+@@ -99,7 +101,7 @@ static int wdt977_open(struct inode *ino
+ 
+ 	if (nowayout)
+ 	{
+-		MOD_INC_USE_COUNT;
++		__module_get(THIS_MODULE);
+ 
+ 		/* do not permit disabling the watchdog by writing 0 to reg. 0xF2 */
+ 		if (!timeoutM) timeoutM = DEFAULT_TIMEOUT;
+@@ -343,12 +345,14 @@ static struct miscdevice wdt977_miscdev=
+ 
+ static int __init nwwatchdog_init(void)
+ {
++	int retval;
+ 	if (!machine_is_netwinder())
+ 		return -ENODEV;
+ 
+-	misc_register(&wdt977_miscdev);
+-	printk(KERN_INFO "Wdt977 Watchdog sleeping.\n");
+-	return 0;
++	retval = misc_register(&wdt977_miscdev);
++	if (!retval)
++		printk(KERN_INFO "Wdt977 Watchdog sleeping.\n");
++	return retval;
+ }
+ 
+ static void __exit nwwatchdog_exit(void)
+--- linux-2.6.0-test1/drivers/char/watchdog/wdt_pci.c	2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/char/watchdog/wdt_pci.c	2003-07-19 17:03:49.000000000 -0700
+@@ -367,7 +367,7 @@ static int wdtpci_open(struct inode *ino
+ 				return -EBUSY;
+ 
+ 			if (nowayout) {
+-				MOD_INC_USE_COUNT;
++				__module_get(THIS_MODULE);
+ 			}
+ 			/*
+ 			 *	Activate 
+--- linux-2.6.0-test1/drivers/fc4/fc.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/fc4/fc.c	2003-07-19 17:03:49.000000000 -0700
+@@ -33,7 +33,6 @@
+ #include <linux/slab.h>
+ #include <linux/string.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
+ 
+ #include <asm/pgtable.h>
+ #include <asm/irq.h>
+--- linux-2.6.0-test1/drivers/fc4/fcp_impl.h	2003-06-14 12:18:08.000000000 -0700
++++ 25/drivers/fc4/fcp_impl.h	2003-07-19 17:03:49.000000000 -0700
+@@ -8,7 +8,6 @@
+ #define _FCP_SCSI_H
+ 
+ #include <linux/types.h>
+-#include <linux/blk.h>
+ #include "../scsi/scsi.h"
+ 
+ #include "fc.h"
+--- linux-2.6.0-test1/drivers/i2c/i2c-dev.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/i2c/i2c-dev.c	2003-07-19 17:06:13.000000000 -0700
+@@ -118,7 +118,7 @@ static void return_i2c_dev(struct i2c_de
+ static ssize_t show_dev(struct class_device *class_dev, char *buf)
+ {
+ 	struct i2c_dev *i2c_dev = to_i2c_dev(class_dev);
+-	return sprintf(buf, "%04x\n", MKDEV(I2C_MAJOR, i2c_dev->minor));
++	return print_dev_t(buf, MKDEV(I2C_MAJOR, i2c_dev->minor));
+ }
+ static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
+ 
+--- linux-2.6.0-test1/drivers/ide/ide-disk.c	2003-06-16 22:32:21.000000000 -0700
++++ 25/drivers/ide/ide-disk.c	2003-07-19 17:07:19.000000000 -0700
+@@ -1665,6 +1665,10 @@ static void idedisk_setup (ide_drive_t *
+ 	drive->no_io_32bit = id->dword_io ? 1 : 0;
+ 	if (drive->id->cfs_enable_2 & 0x3000)
+ 		write_cache(drive, (id->cfs_enable_2 & 0x3000));
++
++#ifdef CONFIG_BLK_DEV_IDE_TCQ_DEFAULT
++	HWIF(drive)->ide_dma_queued_on(drive);
++#endif
+ }
+ 
+ static int idedisk_cleanup (ide_drive_t *drive)
+--- linux-2.6.0-test1/drivers/ide/ide-dma.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/ide/ide-dma.c	2003-07-19 17:07:19.000000000 -0700
+@@ -442,9 +442,10 @@ static int config_drive_for_dma (ide_dri
+  *	the driver to resolve the problem, if a DMA transfer is still
+  *	in progress we continue to wait (arguably we need to add a 
+  *	secondary 'I don't care what the drive thinks' timeout here)
+- *	Finally if we have an interrupt but for some reason got the
+- *	timeout first we complete the I/O. This can occur if an 
+- *	interrupt is lost or due to bugs.
++ *	Finally if we have an interrupt we let it complete the I/O.
++ *	But only one time - we clear expiry and if it's still not
++ *	completed after WAIT_CMD, we error and retry in PIO.
++ *	This can occur if an interrupt is lost or due to hang or bugs.
+  */
+  
+ static int dma_timer_expiry (ide_drive_t *drive)
+@@ -461,19 +462,16 @@ static int dma_timer_expiry (ide_drive_t
+ 	HWGROUP(drive)->expiry = NULL;	/* one free ride for now */
+ 
+ 	/* 1 dmaing, 2 error, 4 intr */
+-	
+-	if (dma_stat & 2) {	/* ERROR */
+-		(void) hwif->ide_dma_end(drive);
+-		return DRIVER(drive)->error(drive,
+-			"dma_timer_expiry", hwif->INB(IDE_STATUS_REG));
+-	}
++	if (dma_stat & 2)	/* ERROR */
++		return -1;
++
+ 	if (dma_stat & 1)	/* DMAing */
+ 		return WAIT_CMD;
+ 
+ 	if (dma_stat & 4)	/* Got an Interrupt */
+-		HWGROUP(drive)->handler(drive);
++		return WAIT_CMD;
+ 
+-	return 0;
++	return 0;	/* Status is unknown -- reset the bus */
+ }
+ 
+ /**
+@@ -572,10 +570,6 @@ int __ide_dma_on (ide_drive_t *drive)
+ 	if (HWIF(drive)->ide_dma_host_on(drive))
+ 		return 1;
+ 
+-#ifdef CONFIG_BLK_DEV_IDE_TCQ_DEFAULT
+-	HWIF(drive)->ide_dma_queued_on(drive);
+-#endif
+-
+ 	return 0;
+ }
+ 
+--- linux-2.6.0-test1/drivers/ide/ide-io.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/ide/ide-io.c	2003-07-19 17:03:49.000000000 -0700
+@@ -949,14 +949,14 @@ queue_next:
+ 		 * happens anyway when any interrupt comes in, IDE or otherwise
+ 		 *  -- the kernel masks the IRQ while it is being handled.
+ 		 */
+-		if (masked_irq != IDE_NO_IRQ && hwif->irq != masked_irq)
++		if (hwif->irq != masked_irq)
+ 			disable_irq_nosync(hwif->irq);
+ 		spin_unlock(&ide_lock);
+ 		local_irq_enable();
+ 			/* allow other IRQs while we start this request */
+ 		startstop = start_request(drive, rq);
+ 		spin_lock_irq(&ide_lock);
+-		if (masked_irq != IDE_NO_IRQ && hwif->irq != masked_irq)
++		if (hwif->irq != masked_irq)
+ 			enable_irq(hwif->irq);
+ 		if (startstop == ide_released)
+ 			goto queue_next;
+@@ -980,21 +980,25 @@ void do_ide_request(request_queue_t *q)
+  * retry the current request in pio mode instead of risking tossing it
+  * all away
+  */
+-void ide_dma_timeout_retry(ide_drive_t *drive)
++static ide_startstop_t ide_dma_timeout_retry(ide_drive_t *drive, int error)
+ {
+ 	ide_hwif_t *hwif = HWIF(drive);
+ 	struct request *rq;
++	ide_startstop_t ret = ide_stopped;
+ 
+ 	/*
+ 	 * end current dma transaction
+ 	 */
+-	(void) hwif->ide_dma_end(drive);
+ 
+-	/*
+-	 * complain a little, later we might remove some of this verbosity
+-	 */
+-	printk(KERN_WARNING "%s: timeout waiting for DMA\n", drive->name);
+-	(void) hwif->ide_dma_timeout(drive);
++	if (error < 0) {
++		printk(KERN_WARNING "%s: DMA timeout error\n", drive->name);
++		(void)HWIF(drive)->ide_dma_end(drive);
++		ret = DRIVER(drive)->error(drive, "dma timeout error",
++						hwif->INB(IDE_STATUS_REG));
++	} else {
++		printk(KERN_WARNING "%s: DMA timeout retry\n", drive->name);
++		(void) hwif->ide_dma_timeout(drive);
++	}
+ 
+ 	/*
+ 	 * disable dma for now, but remember that we did so because of
+@@ -1018,9 +1022,9 @@ void ide_dma_timeout_retry(ide_drive_t *
+ 	rq->hard_cur_sectors = rq->current_nr_sectors;
+ 	if (rq->bio)
+ 		rq->buffer = NULL;
+-}
+ 
+-EXPORT_SYMBOL(ide_dma_timeout_retry);
++	return ret;
++}
+ 
+ /**
+  *	ide_timer_expiry	-	handle lack of an IDE interrupt
+@@ -1041,11 +1045,10 @@ void ide_timer_expiry (unsigned long dat
+ 	ide_hwgroup_t	*hwgroup = (ide_hwgroup_t *) data;
+ 	ide_handler_t	*handler;
+ 	ide_expiry_t	*expiry;
+- 	unsigned long	flags;
+-	unsigned long	wait;
++	unsigned long	flags;
++	unsigned long	wait = -1;
+ 
+ 	spin_lock_irqsave(&ide_lock, flags);
+-	del_timer(&hwgroup->timer);
+ 
+ 	if ((handler = hwgroup->handler) == NULL) {
+ 		/*
+@@ -1072,7 +1075,7 @@ void ide_timer_expiry (unsigned long dat
+ 			}
+ 			if ((expiry = hwgroup->expiry) != NULL) {
+ 				/* continue */
+-				if ((wait = expiry(drive)) != 0) {
++				if ((wait = expiry(drive)) > 0) {
+ 					/* reset timer */
+ 					hwgroup->timer.expires  = jiffies + wait;
+ 					add_timer(&hwgroup->timer);
+@@ -1107,15 +1110,15 @@ void ide_timer_expiry (unsigned long dat
+ 				startstop = handler(drive);
+ 			} else {
+ 				if (drive->waiting_for_dma) {
+-					startstop = ide_stopped;
+-					ide_dma_timeout_retry(drive);
++					startstop = ide_dma_timeout_retry(drive, wait);
+ 				} else
+-					startstop = DRIVER(drive)->error(drive, "irq timeout", hwif->INB(IDE_STATUS_REG));
++					startstop =
++					DRIVER(drive)->error(drive, "irq timeout", hwif->INB(IDE_STATUS_REG));
+ 			}
+ 			set_recovery_timer(hwif);
+ 			drive->service_time = jiffies - drive->service_start;
+-			enable_irq(hwif->irq);
+ 			spin_lock_irq(&ide_lock);
++			enable_irq(hwif->irq);
+ 			if (startstop == ide_stopped)
+ 				hwgroup->busy = 0;
+ 		}
+--- linux-2.6.0-test1/drivers/ide/Kconfig	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/ide/Kconfig	2003-07-19 17:03:49.000000000 -0700
+@@ -521,7 +521,7 @@ config BLK_DEV_ALI15X3
+ 
+ 	  If you say Y here, you also need to say Y to "Use DMA by default
+ 	  when available", above.  Please read the comments at the top of
+-	  <file:drivers/ide/alim15x3.c>.
++	  <file:drivers/ide/pci/alim15x3.c>.
+ 
+ 	  If unsure, say N.
+ 
+@@ -608,7 +608,7 @@ config HPT34X_AUTODMA
+ 	depends on BLK_DEV_HPT34X && IDEDMA_PCI_WIP
+ 	help
+ 	  This is a dangerous thing to attempt currently! Please read the
+-	  comments at the top of <file:drivers/ide/hpt34x.c>.  If you say Y
++	  comments at the top of <file:drivers/ide/pci/hpt34x.c>.  If you say Y
+ 	  here, then say Y to "Use DMA by default when available" as well.
+ 
+ 	  If unsure, say N.
+@@ -670,14 +670,14 @@ config BLK_DEV_NS87415
+ 	  This driver adds detection and support for the NS87415 chip
+ 	  (used in SPARC64, among others).
+ 
+-	  Please read the comments at the top of <file:drivers/ide/ns87415.c>.
++	  Please read the comments at the top of <file:drivers/ide/pci/ns87415.c>.
+ 
+ config BLK_DEV_OPTI621
+ 	tristate "OPTi 82C621 chipset enhanced support (EXPERIMENTAL)"
+ 	depends on PCI && BLK_DEV_IDEPCI && EXPERIMENTAL
+ 	help
+ 	  This is a driver for the OPTi 82C621 EIDE controller.
+-	  Please read the comments at the top of <file:drivers/ide/opti621.c>.
++	  Please read the comments at the top of <file:drivers/ide/pci/opti621.c>.
+ 
+ config BLK_DEV_PDC202XX_OLD
+ 	tristate "PROMISE PDC202{46|62|65|67} support"
+@@ -696,7 +696,7 @@ config PDC202XX_BURST
+ 	  when the PDC20265 BIOS has been disabled (for faster boot up).
+ 
+ 	  Please read the comments at the top of
+-	  <file:drivers/ide/pdc202xx.c>.
++	  <file:drivers/ide/pci/pdc202xx_old.c>.
+ 
+ 	  If unsure, say N.
+ 
+@@ -754,7 +754,7 @@ config BLK_DEV_SIS5513
+ 	  If you say Y here, you need to say Y to "Use DMA by default when
+ 	  available" as well.
+ 
+-	  Please read the comments at the top of <file:drivers/ide/sis5513.c>.
++	  Please read the comments at the top of <file:drivers/ide/pci/sis5513.c>.
+ 
+ config BLK_DEV_SLC90E66
+ 	tristate "SLC90E66 chipset support"
+@@ -770,7 +770,7 @@ config BLK_DEV_SLC90E66
+ 	  available" as well.
+ 
+ 	  Please read the comments at the top of
+-	  drivers/ide/slc90e66.c.
++	  drivers/ide/pci/slc90e66.c.
+ 
+ config BLK_DEV_TRM290
+ 	tristate "Tekram TRM290 chipset support"
+@@ -779,7 +779,7 @@ config BLK_DEV_TRM290
+ 	  This driver adds support for bus master DMA transfers
+ 	  using the Tekram TRM290 PCI IDE chip. Volunteers are
+ 	  needed for further tweaking and development.
+-	  Please read the comments at the top of <file:drivers/ide/trm290.c>.
++	  Please read the comments at the top of <file:drivers/ide/pci/trm290.c>.
+ 
+ config BLK_DEV_VIA82CXXX
+ 	tristate "VIA82CXXX chipset support"
+@@ -1010,7 +1010,7 @@ config BLK_DEV_ALI14XX
+ 	  boot parameter.  It enables support for the secondary IDE interface
+ 	  of the ALI M1439/1443/1445/1487/1489 chipsets, and permits faster
+ 	  I/O speeds to be set as well.  See the files
+-	  <file:Documentation/ide.txt> and <file:drivers/ide/ali14xx.c> for
++	  <file:Documentation/ide.txt> and <file:drivers/ide/legacy/ali14xx.c> for
+ 	  more info.
+ 
+ config BLK_DEV_DTC2278
+@@ -1021,7 +1021,7 @@ config BLK_DEV_DTC2278
+ 	  boot parameter. It enables support for the secondary IDE interface
+ 	  of the DTC-2278 card, and permits faster I/O speeds to be set as
+ 	  well. See the <file:Documentation/ide.txt> and
+-	  <file:drivers/ide/dtc2278.c> files for more info.
++	  <file:drivers/ide/legacy/dtc2278.c> files for more info.
+ 
+ config BLK_DEV_HT6560B
+ 	tristate "Holtek HT6560B support"
+@@ -1031,7 +1031,7 @@ config BLK_DEV_HT6560B
+ 	  boot parameter. It enables support for the secondary IDE interface
+ 	  of the Holtek card, and permits faster I/O speeds to be set as well.
+ 	  See the <file:Documentation/ide.txt> and
+-	  <file:drivers/ide/ht6560b.c> files for more info.
++	  <file:drivers/ide/legacy/ht6560b.c> files for more info.
+ 
+ config BLK_DEV_PDC4030
+ 	tristate "PROMISE DC4030 support (EXPERIMENTAL)"
+@@ -1044,7 +1044,7 @@ config BLK_DEV_PDC4030
+ 	  supported (and probably never will be since I don't think the cards
+ 	  support them). This driver is enabled at runtime using the "ide0=dc4030"
+ 	  or "ide1=dc4030" kernel boot parameter. See the
+-	  <file:drivers/ide/pdc4030.c> file for more info.
++	  <file:drivers/ide/legacy/pdc4030.c> file for more info.
+ 
+ config BLK_DEV_QD65XX
+ 	tristate "QDI QD65xx support"
+@@ -1052,7 +1052,7 @@ config BLK_DEV_QD65XX
+ 	help
+ 	  This driver is enabled at runtime using the "ide0=qd65xx" kernel
+ 	  boot parameter.  It permits faster I/O speeds to be set.  See the
+-	  <file:Documentation/ide.txt> and <file:drivers/ide/qd65xx.c> for
++	  <file:Documentation/ide.txt> and <file:drivers/ide/legacy/qd65xx.c> for
+ 	  more info.
+ 
+ config BLK_DEV_UMC8672
+@@ -1063,7 +1063,7 @@ config BLK_DEV_UMC8672
+ 	  boot parameter. It enables support for the secondary IDE interface
+ 	  of the UMC-8672, and permits faster I/O speeds to be set as well.
+ 	  See the files <file:Documentation/ide.txt> and
+-	  <file:drivers/ide/umc8672.c> for more info.
++	  <file:drivers/ide/legacy/umc8672.c> for more info.
+ 
+ config BLK_DEV_HD_ONLY
+ 	bool "Old hard disk (MFM/RLL/IDE) driver"
+@@ -1132,7 +1132,7 @@ config BLK_DEV_PDC202XX
+ 	  available" as well.
+ 
+ 	  Please read the comments at the top of
+-	  <file:drivers/ide/pdc202xx.c>.
++	  <file:drivers/ide/pdc202xx_old.c>.
+ 
+ 	  If unsure, say N.
+ 
+--- linux-2.6.0-test1/drivers/ide/legacy/hd98.c	2003-06-14 12:18:28.000000000 -0700
++++ 25/drivers/ide/legacy/hd98.c	2003-07-19 17:03:49.000000000 -0700
+@@ -46,8 +46,6 @@
+ #include <asm/io.h>
+ #include <asm/uaccess.h>
+ 
+-#include <linux/blk.h>
+-
+ #include "io_ports.h"
+ 
+ #ifdef __arm__
+--- linux-2.6.0-test1/drivers/ide/legacy/hd.c	2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/ide/legacy/hd.c	2003-07-19 17:03:49.000000000 -0700
+@@ -26,7 +26,7 @@
+ /* Uncomment the following if you want verbose error reports. */
+ /* #define VERBOSE_ERRORS */
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/errno.h>
+ #include <linux/signal.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/ide/ppc/mpc8xx.c	2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/ide/ppc/mpc8xx.c	2003-07-19 17:03:49.000000000 -0700
+@@ -27,7 +27,6 @@
+ #include <linux/interrupt.h>
+ #include <linux/reboot.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
+ #include <linux/ioport.h>
+ #include <linux/ide.h>
+ #include <linux/bootmem.h>
+--- linux-2.6.0-test1/drivers/ieee1394/amdtp.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/ieee1394/amdtp.c	2003-07-19 17:03:49.000000000 -0700
+@@ -62,6 +62,12 @@
+  * - Maybe make an ALSA interface, that is, create a file_ops
+  *   implementation that recognizes ALSA ioctls and uses defaults for
+  *   things that can't be controlled through ALSA (iso channel).
++ *
++ *   Changes:
++ *
++ * - Audit copy_from_user in amdtp_write.
++ *                           Daniele Bellucci <bellucda@tiscali.it>
++ *
+  */
+ 
+ #include <linux/module.h>
+@@ -1112,7 +1118,8 @@ static ssize_t amdtp_write(struct file *
+ 
+ 	for (i = 0; i < count; i += length) {
+ 		p = buffer_put_bytes(s->input, count - i, &length);
+-		copy_from_user(p, buffer + i, length);
++		if (copy_from_user(p, buffer + i, length))
++			return -EFAULT;
+ 		if (s->input->length < s->input->size)
+ 			continue;
+ 		
+--- linux-2.6.0-test1/drivers/ieee1394/sbp2.c	2003-07-10 18:50:31.000000000 -0700
++++ 25/drivers/ieee1394/sbp2.c	2003-07-19 17:03:49.000000000 -0700
+@@ -52,7 +52,7 @@
+ #include <linux/delay.h>
+ #include <linux/sched.h>
+ #include <linux/proc_fs.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/smp_lock.h>
+ #include <linux/init.h>
+ #include <linux/version.h>
+--- linux-2.6.0-test1/drivers/input/keyboard/sunkbd.c	2003-06-16 22:32:21.000000000 -0700
++++ 25/drivers/input/keyboard/sunkbd.c	2003-07-19 17:03:49.000000000 -0700
+@@ -80,8 +80,8 @@ struct sunkbd {
+ 	char name[64];
+ 	char phys[32];
+ 	char type;
+-	char reset;
+-	char layout;
++	volatile char reset;
++	volatile char layout;
+ };
+ 
+ /*
+--- linux-2.6.0-test1/drivers/input/mouse/psmouse-base.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/input/mouse/psmouse-base.c	2003-07-19 17:07:16.000000000 -0700
+@@ -200,7 +200,7 @@ int psmouse_command(struct psmouse *psmo
+ 	psmouse->cmdcnt = receive;
+ 
+ 	if (command == PSMOUSE_CMD_RESET_BAT)
+-                timeout = 2000000; /* 2 sec */
++                timeout = 4000000; /* 4 sec */
+ 
+ 	if (command & 0xff)
+ 		if (psmouse_sendbyte(psmouse, command & 0xff))
+--- linux-2.6.0-test1/drivers/md/dm.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/md/dm.c	2003-07-19 17:03:49.000000000 -0700
+@@ -8,7 +8,6 @@
+ 
+ #include <linux/init.h>
+ #include <linux/module.h>
+-#include <linux/blk.h>
+ #include <linux/blkpg.h>
+ #include <linux/bio.h>
+ #include <linux/mempool.h>
+@@ -63,6 +62,12 @@ struct mapped_device {
+ 	 * io objects are allocated from here.
+ 	 */
+ 	mempool_t *io_pool;
++
++	/*
++	 * Event handling.
++	 */
++	uint32_t event_nr;
++	wait_queue_head_t eventq;
+ };
+ 
+ #define MIN_IOS 256
+@@ -510,6 +515,11 @@ static int dm_request(request_queue_t *q
+ 		down_read(&md->lock);
+ 	}
+ 
++	if (!md->map) {
++		bio_io_error(bio, bio->bi_size);
++		return 0;
++	}
++
+ 	__split_bio(md, bio);
+ 	up_read(&md->lock);
+ 	return 0;
+@@ -619,6 +629,8 @@ static struct mapped_device *alloc_dev(u
+ 
+ 	atomic_set(&md->pending, 0);
+ 	init_waitqueue_head(&md->wait);
++	init_waitqueue_head(&md->eventq);
++
+ 	return md;
+ }
+ 
+@@ -634,6 +646,16 @@ static void free_dev(struct mapped_devic
+ /*
+  * Bind a table to the device.
+  */
++static void event_callback(void *context)
++{
++	struct mapped_device *md = (struct mapped_device *) context;
++
++	down_write(&md->lock);
++	md->event_nr++;
++	wake_up_interruptible(&md->eventq);
++	up_write(&md->lock);
++}
++
+ static int __bind(struct mapped_device *md, struct dm_table *t)
+ {
+ 	request_queue_t *q = &md->queue;
+@@ -645,6 +667,8 @@ static int __bind(struct mapped_device *
+ 	if (size == 0)
+ 		return 0;
+ 
++	dm_table_event_callback(md->map, event_callback, md);
++
+ 	dm_table_get(t);
+ 	dm_table_set_restrictions(t, q);
+ 	return 0;
+@@ -652,6 +676,10 @@ static int __bind(struct mapped_device *
+ 
+ static void __unbind(struct mapped_device *md)
+ {
++	if (!md->map)
++		return;
++
++	dm_table_event_callback(md->map, NULL, NULL);
+ 	dm_table_put(md->map);
+ 	md->map = NULL;
+ 	set_capacity(md->disk, 0);
+@@ -661,35 +689,26 @@ static void __unbind(struct mapped_devic
+  * Constructor for a new device.
+  */
+ static int create_aux(unsigned int minor, int persistent,
+-		      struct dm_table *table, struct mapped_device **result)
++		      struct mapped_device **result)
+ {
+-	int r;
+ 	struct mapped_device *md;
+ 
+ 	md = alloc_dev(minor, persistent);
+ 	if (!md)
+ 		return -ENXIO;
+ 
+-	r = __bind(md, table);
+-	if (r) {
+-		free_dev(md);
+-		return r;
+-	}
+-	dm_table_resume_targets(md->map);
+-
+ 	*result = md;
+ 	return 0;
+ }
+ 
+-int dm_create(struct dm_table *table, struct mapped_device **result)
++int dm_create(struct mapped_device **result)
+ {
+-	return create_aux(0, 0, table, result);
++	return create_aux(0, 0, result);
+ }
+ 
+-int dm_create_with_minor(unsigned int minor,
+-			 struct dm_table *table, struct mapped_device **result)
++int dm_create_with_minor(unsigned int minor, struct mapped_device **result)
+ {
+-	return create_aux(minor, 1, table, result);
++	return create_aux(minor, 1, result);
+ }
+ 
+ void dm_get(struct mapped_device *md)
+@@ -700,7 +719,7 @@ void dm_get(struct mapped_device *md)
+ void dm_put(struct mapped_device *md)
+ {
+ 	if (atomic_dec_and_test(&md->holders)) {
+-		if (!test_bit(DMF_SUSPENDED, &md->flags))
++		if (!test_bit(DMF_SUSPENDED, &md->flags) && md->map)
+ 			dm_table_suspend_targets(md->map);
+ 		__unbind(md);
+ 		free_dev(md);
+@@ -790,7 +809,8 @@ int dm_suspend(struct mapped_device *md)
+ 	down_write(&md->lock);
+ 	remove_wait_queue(&md->wait, &wait);
+ 	set_bit(DMF_SUSPENDED, &md->flags);
+-	dm_table_suspend_targets(md->map);
++	if (md->map)
++		dm_table_suspend_targets(md->map);
+ 	up_write(&md->lock);
+ 
+ 	return 0;
+@@ -801,7 +821,8 @@ int dm_resume(struct mapped_device *md)
+ 	struct deferred_io *def;
+ 
+ 	down_write(&md->lock);
+-	if (!test_bit(DMF_SUSPENDED, &md->flags) ||
++	if (!md->map ||
++	    !test_bit(DMF_SUSPENDED, &md->flags) ||
+ 	    !dm_table_get_size(md->map)) {
+ 		up_write(&md->lock);
+ 		return -EINVAL;
+@@ -820,6 +841,42 @@ int dm_resume(struct mapped_device *md)
+ 	return 0;
+ }
+ 
++/*-----------------------------------------------------------------
++ * Event notification.
++ *---------------------------------------------------------------*/
++uint32_t dm_get_event_nr(struct mapped_device *md)
++{
++	uint32_t r;
++
++	down_read(&md->lock);
++	r = md->event_nr;
++	up_read(&md->lock);
++
++	return r;
++}
++
++int dm_add_wait_queue(struct mapped_device *md, wait_queue_t *wq,
++		      uint32_t event_nr)
++{
++	down_write(&md->lock);
++	if (event_nr != md->event_nr) {
++		up_write(&md->lock);
++		return 1;
++	}
++
++	add_wait_queue(&md->eventq, wq);
++	up_write(&md->lock);
++
++	return 0;
++}
++
++void dm_remove_wait_queue(struct mapped_device *md, wait_queue_t *wq)
++{
++	down_write(&md->lock);
++	remove_wait_queue(&md->eventq, wq);
++	up_write(&md->lock);
++}
++
+ /*
+  * The gendisk is only valid as long as you have a reference
+  * count on 'md'.
+@@ -835,7 +892,8 @@ struct dm_table *dm_get_table(struct map
+ 
+ 	down_read(&md->lock);
+ 	t = md->map;
+-	dm_table_get(t);
++	if (t)
++		dm_table_get(t);
+ 	up_read(&md->lock);
+ 
+ 	return t;
+--- linux-2.6.0-test1/drivers/md/dm.h	2003-06-16 22:32:21.000000000 -0700
++++ 25/drivers/md/dm.h	2003-07-19 17:03:49.000000000 -0700
+@@ -51,9 +51,8 @@ struct mapped_device;
+  * Functions for manipulating a struct mapped_device.
+  * Drop the reference with dm_put when you finish with the object.
+  *---------------------------------------------------------------*/
+-int dm_create(struct dm_table *table, struct mapped_device **md);
+-int dm_create_with_minor(unsigned int minor, struct dm_table *table,
+-			 struct mapped_device **md);
++int dm_create(struct mapped_device **md);
++int dm_create_with_minor(unsigned int minor, struct mapped_device **md);
+ 
+ /*
+  * Reference counting for md.
+@@ -79,6 +78,14 @@ int dm_swap_table(struct mapped_device *
+ struct dm_table *dm_get_table(struct mapped_device *md);
+ 
+ /*
++ * Event functions.
++ */
++uint32_t dm_get_event_nr(struct mapped_device *md);
++int dm_add_wait_queue(struct mapped_device *md, wait_queue_t *wq,
++		      uint32_t event_nr);
++void dm_remove_wait_queue(struct mapped_device *md, wait_queue_t *wq);
++
++/*
+  * Info functions.
+  */
+ struct gendisk *dm_disk(struct mapped_device *md);
+@@ -96,6 +103,8 @@ void dm_table_put(struct dm_table *t);
+ int dm_table_add_target(struct dm_table *t, const char *type,
+ 			sector_t start,	sector_t len, char *params);
+ int dm_table_complete(struct dm_table *t);
++void dm_table_event_callback(struct dm_table *t,
++			     void (*fn)(void *), void *context);
+ void dm_table_event(struct dm_table *t);
+ sector_t dm_table_get_size(struct dm_table *t);
+ struct dm_target *dm_table_get_target(struct dm_table *t, unsigned int index);
+@@ -104,7 +113,6 @@ void dm_table_set_restrictions(struct dm
+ unsigned int dm_table_get_num_targets(struct dm_table *t);
+ struct list_head *dm_table_get_devices(struct dm_table *t);
+ int dm_table_get_mode(struct dm_table *t);
+-void dm_table_add_wait_queue(struct dm_table *t, wait_queue_t *wq);
+ void dm_table_suspend_targets(struct dm_table *t);
+ void dm_table_resume_targets(struct dm_table *t);
+ 
+--- linux-2.6.0-test1/drivers/md/dm-ioctl.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/md/dm-ioctl.c	2003-07-19 17:03:49.000000000 -0700
+@@ -1,1134 +1,13 @@
+ /*
+- * Copyright (C) 2001, 2002 Sistina Software (UK) Limited.
++ * Copyright (C) 2003 Sistina Software (UK) Limited.
+  *
+  * This file is released under the GPL.
+  */
+ 
+-#include "dm.h"
+-
+-#include <linux/module.h>
+-#include <linux/vmalloc.h>
+-#include <linux/miscdevice.h>
+ #include <linux/dm-ioctl.h>
+-#include <linux/init.h>
+-#include <linux/wait.h>
+-#include <linux/blk.h>
+-#include <linux/slab.h>
+-#include <linux/devfs_fs_kernel.h>
+-
+-#include <asm/uaccess.h>
+-
+-#define DM_DRIVER_EMAIL "dm@uk.sistina.com"
+-
+-/*-----------------------------------------------------------------
+- * The ioctl interface needs to be able to look up devices by
+- * name or uuid.
+- *---------------------------------------------------------------*/
+-struct hash_cell {
+-	struct list_head name_list;
+-	struct list_head uuid_list;
+-
+-	char *name;
+-	char *uuid;
+-	struct mapped_device *md;
+-};
+-
+-#define NUM_BUCKETS 64
+-#define MASK_BUCKETS (NUM_BUCKETS - 1)
+-static struct list_head _name_buckets[NUM_BUCKETS];
+-static struct list_head _uuid_buckets[NUM_BUCKETS];
+-
+-void dm_hash_remove_all(void);
+-
+-/*
+- * Guards access to all three tables.
+- */
+-static DECLARE_RWSEM(_hash_lock);
+-
+-static void init_buckets(struct list_head *buckets)
+-{
+-	unsigned int i;
+-
+-	for (i = 0; i < NUM_BUCKETS; i++)
+-		INIT_LIST_HEAD(buckets + i);
+-}
+-
+-int dm_hash_init(void)
+-{
+-	init_buckets(_name_buckets);
+-	init_buckets(_uuid_buckets);
+-	devfs_mk_dir(DM_DIR);
+-	return 0;
+-}
+-
+-void dm_hash_exit(void)
+-{
+-	dm_hash_remove_all();
+-	devfs_remove(DM_DIR);
+-}
+-
+-/*-----------------------------------------------------------------
+- * Hash function:
+- * We're not really concerned with the str hash function being
+- * fast since it's only used by the ioctl interface.
+- *---------------------------------------------------------------*/
+-static unsigned int hash_str(const char *str)
+-{
+-	const unsigned int hash_mult = 2654435387U;
+-	unsigned int h = 0;
+-
+-	while (*str)
+-		h = (h + (unsigned int) *str++) * hash_mult;
+-
+-	return h & MASK_BUCKETS;
+-}
+-
+-/*-----------------------------------------------------------------
+- * Code for looking up a device by name
+- *---------------------------------------------------------------*/
+-static struct hash_cell *__get_name_cell(const char *str)
+-{
+-	struct list_head *tmp;
+-	struct hash_cell *hc;
+-	unsigned int h = hash_str(str);
+-
+-	list_for_each (tmp, _name_buckets + h) {
+-		hc = list_entry(tmp, struct hash_cell, name_list);
+-		if (!strcmp(hc->name, str))
+-			return hc;
+-	}
+-
+-	return NULL;
+-}
+-
+-static struct hash_cell *__get_uuid_cell(const char *str)
+-{
+-	struct list_head *tmp;
+-	struct hash_cell *hc;
+-	unsigned int h = hash_str(str);
+-
+-	list_for_each (tmp, _uuid_buckets + h) {
+-		hc = list_entry(tmp, struct hash_cell, uuid_list);
+-		if (!strcmp(hc->uuid, str))
+-			return hc;
+-	}
+-
+-	return NULL;
+-}
+-
+-/*-----------------------------------------------------------------
+- * Inserting, removing and renaming a device.
+- *---------------------------------------------------------------*/
+-static inline char *kstrdup(const char *str)
+-{
+-	char *r = kmalloc(strlen(str) + 1, GFP_KERNEL);
+-	if (r)
+-		strcpy(r, str);
+-	return r;
+-}
+-
+-static struct hash_cell *alloc_cell(const char *name, const char *uuid,
+-				    struct mapped_device *md)
+-{
+-	struct hash_cell *hc;
+-
+-	hc = kmalloc(sizeof(*hc), GFP_KERNEL);
+-	if (!hc)
+-		return NULL;
+-
+-	hc->name = kstrdup(name);
+-	if (!hc->name) {
+-		kfree(hc);
+-		return NULL;
+-	}
+-
+-	if (!uuid)
+-		hc->uuid = NULL;
+-
+-	else {
+-		hc->uuid = kstrdup(uuid);
+-		if (!hc->uuid) {
+-			kfree(hc->name);
+-			kfree(hc);
+-			return NULL;
+-		}
+-	}
+-
+-	INIT_LIST_HEAD(&hc->name_list);
+-	INIT_LIST_HEAD(&hc->uuid_list);
+-	hc->md = md;
+-	return hc;
+-}
+-
+-static void free_cell(struct hash_cell *hc)
+-{
+-	if (hc) {
+-		kfree(hc->name);
+-		kfree(hc->uuid);
+-		kfree(hc);
+-	}
+-}
+-
+-/*
+- * devfs stuff.
+- */
+-static int register_with_devfs(struct hash_cell *hc)
+-{
+-	struct gendisk *disk = dm_disk(hc->md);
+-
+-	devfs_mk_bdev(MKDEV(disk->major, disk->first_minor),
+-		       S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP,
+-		       DM_DIR "/%s", hc->name);
+-	return 0;
+-}
+-
+-static int unregister_with_devfs(struct hash_cell *hc)
+-{
+-	devfs_remove(DM_DIR"/%s", hc->name);
+-	return 0;
+-}
+-
+-/*
+- * The kdev_t and uuid of a device can never change once it is
+- * initially inserted.
+- */
+-int dm_hash_insert(const char *name, const char *uuid, struct mapped_device *md)
+-{
+-	struct hash_cell *cell;
+-
+-	/*
+-	 * Allocate the new cells.
+-	 */
+-	cell = alloc_cell(name, uuid, md);
+-	if (!cell)
+-		return -ENOMEM;
+-
+-	/*
+-	 * Insert the cell into all three hash tables.
+-	 */
+-	down_write(&_hash_lock);
+-	if (__get_name_cell(name))
+-		goto bad;
+-
+-	list_add(&cell->name_list, _name_buckets + hash_str(name));
+-
+-	if (uuid) {
+-		if (__get_uuid_cell(uuid)) {
+-			list_del(&cell->name_list);
+-			goto bad;
+-		}
+-		list_add(&cell->uuid_list, _uuid_buckets + hash_str(uuid));
+-	}
+-	register_with_devfs(cell);
+-	dm_get(md);
+-	up_write(&_hash_lock);
+-
+-	return 0;
+-
+- bad:
+-	up_write(&_hash_lock);
+-	free_cell(cell);
+-	return -EBUSY;
+-}
+-
+-void __hash_remove(struct hash_cell *hc)
+-{
+-	/* remove from the dev hash */
+-	list_del(&hc->uuid_list);
+-	list_del(&hc->name_list);
+-	unregister_with_devfs(hc);
+-	dm_put(hc->md);
+-	free_cell(hc);
+-}
+-
+-void dm_hash_remove_all(void)
+-{
+-	int i;
+-	struct hash_cell *hc;
+-	struct list_head *tmp, *n;
+-
+-	down_write(&_hash_lock);
+-	for (i = 0; i < NUM_BUCKETS; i++) {
+-		list_for_each_safe (tmp, n, _name_buckets + i) {
+-			hc = list_entry(tmp, struct hash_cell, name_list);
+-			__hash_remove(hc);
+-		}
+-	}
+-	up_write(&_hash_lock);
+-}
+-
+-int dm_hash_rename(const char *old, const char *new)
+-{
+-	char *new_name, *old_name;
+-	struct hash_cell *hc;
+-
+-	/*
+-	 * duplicate new.
+-	 */
+-	new_name = kstrdup(new);
+-	if (!new_name)
+-		return -ENOMEM;
+-
+-	down_write(&_hash_lock);
+-
+-	/*
+-	 * Is new free ?
+-	 */
+-	hc = __get_name_cell(new);
+-	if (hc) {
+-		DMWARN("asked to rename to an already existing name %s -> %s",
+-		       old, new);
+-		up_write(&_hash_lock);
+-		kfree(new_name);
+-		return -EBUSY;
+-	}
+-
+-	/*
+-	 * Is there such a device as 'old' ?
+-	 */
+-	hc = __get_name_cell(old);
+-	if (!hc) {
+-		DMWARN("asked to rename a non existent device %s -> %s",
+-		       old, new);
+-		up_write(&_hash_lock);
+-		kfree(new_name);
+-		return -ENXIO;
+-	}
+-
+-	/*
+-	 * rename and move the name cell.
+-	 */
+-	unregister_with_devfs(hc);
+-
+-	list_del(&hc->name_list);
+-	old_name = hc->name;
+-	hc->name = new_name;
+-	list_add(&hc->name_list, _name_buckets + hash_str(new_name));
+-
+-	/* rename the device node in devfs */
+-	register_with_devfs(hc);
+-
+-	up_write(&_hash_lock);
+-	kfree(old_name);
+-	return 0;
+-}
+-
+-
+-/*-----------------------------------------------------------------
+- * Implementation of the ioctl commands
+- *---------------------------------------------------------------*/
+-
+-/*
+- * All the ioctl commands get dispatched to functions with this
+- * prototype.
+- */
+-typedef int (*ioctl_fn)(struct dm_ioctl *param, struct dm_ioctl *user);
+-
+-/*
+- * Check a string doesn't overrun the chunk of
+- * memory we copied from userland.
+- */
+-static int valid_str(char *str, void *begin, void *end)
+-{
+-	while (((void *) str >= begin) && ((void *) str < end))
+-		if (!*str++)
+-			return 0;
+-
+-	return -EINVAL;
+-}
+-
+-static int next_target(struct dm_target_spec *last, uint32_t next,
+-		       void *begin, void *end,
+-		       struct dm_target_spec **spec, char **params)
+-{
+-	*spec = (struct dm_target_spec *)
+-	    ((unsigned char *) last + next);
+-	*params = (char *) (*spec + 1);
+-
+-	if (*spec < (last + 1) || ((void *) *spec > end))
+-		return -EINVAL;
+-
+-	return valid_str(*params, begin, end);
+-}
+-
+-static int populate_table(struct dm_table *table, struct dm_ioctl *args)
+-{
+-	int r, first = 1;
+-	unsigned int i = 0;
+-	struct dm_target_spec *spec;
+-	char *params;
+-	void *begin, *end;
+-
+-	if (!args->target_count) {
+-		DMWARN("populate_table: no targets specified");
+-		return -EINVAL;
+-	}
+-
+-	begin = (void *) args;
+-	end = begin + args->data_size;
+-
+-	for (i = 0; i < args->target_count; i++) {
+-
+-		if (first)
+-			r = next_target((struct dm_target_spec *) args,
+-					args->data_start,
+-					begin, end, &spec, &params);
+-		else
+-			r = next_target(spec, spec->next, begin, end,
+-					&spec, &params);
+-
+-		if (r) {
+-			DMWARN("unable to find target");
+-			return -EINVAL;
+-		}
+-
+-		r = dm_table_add_target(table, spec->target_type,
+-					(sector_t) spec->sector_start,
+-					(sector_t) spec->length,
+-					params);
+-		if (r) {
+-			DMWARN("internal error adding target to table");
+-			return -EINVAL;
+-		}
+-
+-		first = 0;
+-	}
+-
+-	return dm_table_complete(table);
+-}
+-
+-/*
+- * Round up the ptr to the next 'align' boundary.  Obviously
+- * 'align' must be a power of 2.
+- */
+-static inline void *align_ptr(void *ptr, unsigned int align)
+-{
+-	align--;
+-	return (void *) (((unsigned long) (ptr + align)) & ~align);
+-}
+-
+-/*
+- * Copies a dm_ioctl and an optional additional payload to
+- * userland.
+- */
+-static int results_to_user(struct dm_ioctl *user, struct dm_ioctl *param,
+-			   void *data, uint32_t len)
+-{
+-	int r;
+-	void *ptr = NULL;
+-
+-	if (data) {
+-		ptr = align_ptr(user + 1, sizeof(unsigned long));
+-		param->data_start = ptr - (void *) user;
+-	}
+-
+-	/*
+-	 * The version number has already been filled in, so we
+-	 * just copy later fields.
+-	 */
+-	r = copy_to_user(&user->data_size, &param->data_size,
+-			 sizeof(*param) - sizeof(param->version));
+-	if (r)
+-		return -EFAULT;
+-
+-	if (data) {
+-		if (param->data_start + len > param->data_size)
+-			return -ENOSPC;
+-
+-		if (copy_to_user(ptr, data, len))
+-			r = -EFAULT;
+-	}
+-
+-	return r;
+-}
+-
+-/*
+- * Fills in a dm_ioctl structure, ready for sending back to
+- * userland.
+- */
+-static int __info(struct mapped_device *md, struct dm_ioctl *param)
+-{
+-	struct dm_table *table;
+-	struct block_device *bdev;
+-	struct gendisk *disk = dm_disk(md);
+-
+-	param->flags = DM_EXISTS_FLAG;
+-	if (dm_suspended(md))
+-		param->flags |= DM_SUSPEND_FLAG;
+-
+-	bdev = bdget_disk(disk, 0);
+-	if (!bdev)
+-		return -ENXIO;
+-
+-	param->dev = bdev->bd_dev;
+-	param->open_count = bdev->bd_openers;
+-	bdput(bdev);
+-
+-	if (disk->policy)
+-		param->flags |= DM_READONLY_FLAG;
+-
+-	table = dm_get_table(md);
+-	param->target_count = dm_table_get_num_targets(table);
+-	dm_table_put(table);
+-
+-	return 0;
+-}
+-
+-/*
+- * Always use UUID for lookups if it's present, otherwise use name.
+- */
+-static inline struct mapped_device *find_device(struct dm_ioctl *param)
+-{
+-	struct hash_cell *hc;
+-	struct mapped_device *md = NULL;
+-
+-	down_read(&_hash_lock);
+-	hc = *param->uuid ? __get_uuid_cell(param->uuid) :
+-		__get_name_cell(param->name);
+-	if (hc) {
+-		md = hc->md;
+-
+-		/*
+-		 * Sneakily write in both the name and the uuid
+-		 * while we have the cell.
+-		 */
+-		strlcpy(param->name, hc->name, sizeof(param->name));
+-		if (hc->uuid)
+-			strlcpy(param->uuid, hc->uuid, sizeof(param->uuid));
+-		else
+-			param->uuid[0] = '\0';
+-
+-		dm_get(md);
+-	}
+-	up_read(&_hash_lock);
+-
+-	return md;
+-}
+-
+-#define ALIGNMENT sizeof(int)
+-static void *_align(void *ptr, unsigned int a)
+-{
+-	register unsigned long align = --a;
+-
+-	return (void *) (((unsigned long) ptr + align) & ~align);
+-}
+-
+-/*
+- * Copies device info back to user space, used by
+- * the create and info ioctls.
+- */
+-static int info(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-	struct mapped_device *md;
+-
+-	param->flags = 0;
+-
+-	md = find_device(param);
+-	if (!md)
+-		/*
+-		 * Device not found - returns cleared exists flag.
+-		 */
+-		goto out;
+-
+-	__info(md, param);
+-	dm_put(md);
+-
+-      out:
+-	return results_to_user(user, param, NULL, 0);
+-}
+-
+-static inline int get_mode(struct dm_ioctl *param)
+-{
+-	int mode = FMODE_READ | FMODE_WRITE;
+-
+-	if (param->flags & DM_READONLY_FLAG)
+-		mode = FMODE_READ;
+-
+-	return mode;
+-}
+-
+-static int check_name(const char *name)
+-{
+-	if (name[0] == '/') {
+-		DMWARN("invalid device name");
+-		return -EINVAL;
+-	}
+-
+-	return 0;
+-}
+-
+-static int create(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-	int r;
+-	struct dm_table *t;
+-	struct mapped_device *md;
+-
+-	r = check_name(param->name);
+-	if (r)
+-		return r;
+-
+-	r = dm_table_create(&t, get_mode(param));
+-	if (r)
+-		return r;
+-
+-	r = populate_table(t, param);
+-	if (r) {
+-		dm_table_put(t);
+-		return r;
+-	}
+-
+-	if (param->flags & DM_PERSISTENT_DEV_FLAG)
+-		r = dm_create_with_minor(minor(to_kdev_t(param->dev)), t, &md);
+-	else
+-		r = dm_create(t, &md);
+-
+-	if (r) {
+-		dm_table_put(t);
+-		return r;
+-	}
+-	dm_table_put(t);	/* md will have grabbed its own reference */
+-
+-	set_disk_ro(dm_disk(md), (param->flags & DM_READONLY_FLAG) ? 1 : 0);
+-	r = dm_hash_insert(param->name, *param->uuid ? param->uuid : NULL, md);
+-	dm_put(md);
+-
+-	return r ? r : info(param, user);
+-}
+-
+-/*
+- * Build up the status struct for each target
+- */
+-static int __status(struct mapped_device *md, struct dm_ioctl *param,
+-		    char *outbuf, size_t *len)
+-{
+-	unsigned int i, num_targets;
+-	struct dm_target_spec *spec;
+-	char *outptr;
+-	status_type_t type;
+-	struct dm_table *table = dm_get_table(md);
+-
+-	if (param->flags & DM_STATUS_TABLE_FLAG)
+-		type = STATUSTYPE_TABLE;
+-	else
+-		type = STATUSTYPE_INFO;
+-
+-	outptr = outbuf;
+-
+-	/* Get all the target info */
+-	num_targets = dm_table_get_num_targets(table);
+-	for (i = 0; i < num_targets; i++) {
+-		struct dm_target *ti = dm_table_get_target(table, i);
+-
+-		if (outptr - outbuf +
+-		    sizeof(struct dm_target_spec) > param->data_size) {
+-			dm_table_put(table);
+-			return -ENOMEM;
+-		}
+-
+-		spec = (struct dm_target_spec *) outptr;
+-
+-		spec->status = 0;
+-		spec->sector_start = ti->begin;
+-		spec->length = ti->len;
+-		strlcpy(spec->target_type, ti->type->name,
+-			sizeof(spec->target_type));
+-
+-		outptr += sizeof(struct dm_target_spec);
+-
+-		/* Get the status/table string from the target driver */
+-		if (ti->type->status)
+-			ti->type->status(ti, type, outptr,
+-					 outbuf + param->data_size - outptr);
+-		else
+-			outptr[0] = '\0';
+-
+-		outptr += strlen(outptr) + 1;
+-		_align(outptr, ALIGNMENT);
+-		spec->next = outptr - outbuf;
+-	}
+-
+-	param->target_count = num_targets;
+-	*len = outptr - outbuf;
+-	dm_table_put(table);
+-
+-	return 0;
+-}
+-
+-/*
+- * Return the status of a device as a text string for each
+- * target.
+- */
+-static int get_status(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-	struct mapped_device *md;
+-	size_t len = 0;
+-	int ret;
+-	char *outbuf = NULL;
+-
+-	md = find_device(param);
+-	if (!md)
+-		/*
+-		 * Device not found - returns cleared exists flag.
+-		 */
+-		goto out;
+-
+-	/* We haven't a clue how long the resultant data will be so
+-	   just allocate as much as userland has allowed us and make sure
+-	   we don't overun it */
+-	outbuf = kmalloc(param->data_size, GFP_KERNEL);
+-	if (!outbuf)
+-		goto out;
+-	/*
+-	 * Get the status of all targets
+-	 */
+-	__status(md, param, outbuf, &len);
+-
+-	/*
+-	 * Setup the basic dm_ioctl structure.
+-	 */
+-	__info(md, param);
+-
+-      out:
+-	if (md)
+-		dm_put(md);
+-
+-	ret = results_to_user(user, param, outbuf, len);
+-
+-	if (outbuf)
+-		kfree(outbuf);
+-
+-	return ret;
+-}
+-
+-/*
+- * Wait for a device to report an event
+- */
+-static int wait_device_event(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-	struct mapped_device *md;
+-	struct dm_table *table;
+-	DECLARE_WAITQUEUE(wq, current);
+-
+-	md = find_device(param);
+-	if (!md)
+-		/*
+-		 * Device not found - returns cleared exists flag.
+-		 */
+-		goto out;
+-
+-	/*
+-	 * Setup the basic dm_ioctl structure.
+-	 */
+-	__info(md, param);
+-
+-	/*
+-	 * Wait for a notification event
+-	 */
+-	set_current_state(TASK_INTERRUPTIBLE);
+-	table = dm_get_table(md);
+-	dm_table_add_wait_queue(table, &wq);
+-	dm_table_put(table);
+-	dm_put(md);
+-
+-	schedule();
+-
+-      out:
+-	return results_to_user(user, param, NULL, 0);
+-}
+-
+-/*
+- * Retrieves a list of devices used by a particular dm device.
+- */
+-static int dep(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-	int r;
+-	unsigned int count;
+-	struct mapped_device *md;
+-	struct list_head *tmp;
+-	size_t len = 0;
+-	struct dm_target_deps *deps = NULL;
+-	struct dm_table *table;
+-
+-	md = find_device(param);
+-	if (!md)
+-		goto out;
+-	table = dm_get_table(md);
+-
+-	/*
+-	 * Setup the basic dm_ioctl structure.
+-	 */
+-	__info(md, param);
+-
+-	/*
+-	 * Count the devices.
+-	 */
+-	count = 0;
+-	list_for_each(tmp, dm_table_get_devices(table))
+-	    count++;
+-
+-	/*
+-	 * Allocate a kernel space version of the dm_target_status
+-	 * struct.
+-	 */
+-	if (array_too_big(sizeof(*deps), sizeof(*deps->dev), count)) {
+-		dm_table_put(table);
+-		dm_put(md);
+-		return -ENOMEM;
+-	}
+-
+-	len = sizeof(*deps) + (sizeof(*deps->dev) * count);
+-	deps = kmalloc(len, GFP_KERNEL);
+-	if (!deps) {
+-		dm_table_put(table);
+-		dm_put(md);
+-		return -ENOMEM;
+-	}
+-
+-	/*
+-	 * Fill in the devices.
+-	 */
+-	deps->count = count;
+-	count = 0;
+-	list_for_each(tmp, dm_table_get_devices(table)) {
+-		struct dm_dev *dd = list_entry(tmp, struct dm_dev, list);
+-		deps->dev[count++] = dd->bdev->bd_dev;
+-	}
+-	dm_table_put(table);
+-	dm_put(md);
+-
+-      out:
+-	r = results_to_user(user, param, deps, len);
+-
+-	kfree(deps);
+-	return r;
+-}
+-
+-static int remove(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-	struct hash_cell *hc;
+-
+-	down_write(&_hash_lock);
+-	hc = *param->uuid ? __get_uuid_cell(param->uuid) :
+-		__get_name_cell(param->name);
+-	if (!hc) {
+-		DMWARN("device doesn't appear to be in the dev hash table.");
+-		up_write(&_hash_lock);
+-		return -EINVAL;
+-	}
+-
+-	/*
+-	 * You may ask the interface to drop its reference to an
+-	 * in use device.  This is no different to unlinking a
+-	 * file that someone still has open.  The device will not
+-	 * actually be destroyed until the last opener closes it.
+-	 * The name and uuid of the device (both are interface
+-	 * properties) will be available for reuse immediately.
+-	 *
+-	 * You don't want to drop a _suspended_ device from the
+-	 * interface, since that will leave you with no way of
+-	 * resuming it.
+-	 */
+-	if (dm_suspended(hc->md)) {
+-		DMWARN("refusing to remove a suspended device.");
+-		up_write(&_hash_lock);
+-		return -EPERM;
+-	}
+-
+-	__hash_remove(hc);
+-	up_write(&_hash_lock);
+-	return 0;
+-}
+-
+-static int remove_all(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-	dm_hash_remove_all();
+-	return 0;
+-}
+-
+-static int suspend(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-	int r;
+-	struct mapped_device *md;
+-
+-	md = find_device(param);
+-	if (!md)
+-		return -ENXIO;
+-
+-	if (param->flags & DM_SUSPEND_FLAG)
+-		r = dm_suspend(md);
+-	else
+-		r = dm_resume(md);
+-
+-	dm_put(md);
+-	return r;
+-}
+-
+-static int reload(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-	int r;
+-	struct mapped_device *md;
+-	struct dm_table *t;
+-
+-	r = dm_table_create(&t, get_mode(param));
+-	if (r)
+-		return r;
+-
+-	r = populate_table(t, param);
+-	if (r) {
+-		dm_table_put(t);
+-		return r;
+-	}
+-
+-	md = find_device(param);
+-	if (!md) {
+-		dm_table_put(t);
+-		return -ENXIO;
+-	}
+-
+-	r = dm_swap_table(md, t);
+-	if (r) {
+-		dm_put(md);
+-		dm_table_put(t);
+-		return r;
+-	}
+-	dm_table_put(t);	/* md will have taken its own reference */
+-
+-	set_disk_ro(dm_disk(md), (param->flags & DM_READONLY_FLAG) ? 1 : 0);
+-	dm_put(md);
+-
+-	r = info(param, user);
+-	return r;
+-}
+-
+-static int rename(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-	int r;
+-	char *new_name = (char *) param + param->data_start;
+-
+-	if (valid_str(new_name, (void *) param,
+-		      (void *) param + param->data_size)) {
+-		DMWARN("Invalid new logical volume name supplied.");
+-		return -EINVAL;
+-	}
+-
+-	r = check_name(new_name);
+-	if (r)
+-		return r;
+-
+-	return dm_hash_rename(param->name, new_name);
+-}
+-
+-
+-/*-----------------------------------------------------------------
+- * Implementation of open/close/ioctl on the special char
+- * device.
+- *---------------------------------------------------------------*/
+-static ioctl_fn lookup_ioctl(unsigned int cmd)
+-{
+-	static struct {
+-		int cmd;
+-		ioctl_fn fn;
+-	} _ioctls[] = {
+-		{DM_VERSION_CMD, NULL},	/* version is dealt with elsewhere */
+-		{DM_REMOVE_ALL_CMD, remove_all},
+-		{DM_DEV_CREATE_CMD, create},
+-		{DM_DEV_REMOVE_CMD, remove},
+-		{DM_DEV_RELOAD_CMD, reload},
+-		{DM_DEV_RENAME_CMD, rename},
+-		{DM_DEV_SUSPEND_CMD, suspend},
+-		{DM_DEV_DEPS_CMD, dep},
+-		{DM_DEV_STATUS_CMD, info},
+-		{DM_TARGET_STATUS_CMD, get_status},
+-		{DM_TARGET_WAIT_CMD, wait_device_event},
+-	};
+-
+-	return (cmd >= ARRAY_SIZE(_ioctls)) ? NULL : _ioctls[cmd].fn;
+-}
+-
+-/*
+- * As well as checking the version compatibility this always
+- * copies the kernel interface version out.
+- */
+-static int check_version(unsigned int cmd, struct dm_ioctl *user)
+-{
+-	uint32_t version[3];
+-	int r = 0;
+-
+-	if (copy_from_user(version, user->version, sizeof(version)))
+-		return -EFAULT;
+-
+-	if ((DM_VERSION_MAJOR != version[0]) ||
+-	    (DM_VERSION_MINOR < version[1])) {
+-		DMWARN("ioctl interface mismatch: "
+-		       "kernel(%u.%u.%u), user(%u.%u.%u), cmd(%d)",
+-		       DM_VERSION_MAJOR, DM_VERSION_MINOR,
+-		       DM_VERSION_PATCHLEVEL,
+-		       version[0], version[1], version[2], cmd);
+-		r = -EINVAL;
+-	}
+-
+-	/*
+-	 * Fill in the kernel version.
+-	 */
+-	version[0] = DM_VERSION_MAJOR;
+-	version[1] = DM_VERSION_MINOR;
+-	version[2] = DM_VERSION_PATCHLEVEL;
+-	if (copy_to_user(user->version, version, sizeof(version)))
+-		return -EFAULT;
+-
+-	return r;
+-}
+-
+-static void free_params(struct dm_ioctl *param)
+-{
+-	vfree(param);
+-}
+-
+-static int copy_params(struct dm_ioctl *user, struct dm_ioctl **param)
+-{
+-	struct dm_ioctl tmp, *dmi;
+-
+-	if (copy_from_user(&tmp, user, sizeof(tmp)))
+-		return -EFAULT;
+-
+-	if (tmp.data_size < sizeof(tmp))
+-		return -EINVAL;
+-
+-	dmi = (struct dm_ioctl *) vmalloc(tmp.data_size);
+-	if (!dmi)
+-		return -ENOMEM;
+-
+-	if (copy_from_user(dmi, user, tmp.data_size)) {
+-		vfree(dmi);
+-		return -EFAULT;
+-	}
+-
+-	*param = dmi;
+-	return 0;
+-}
+-
+-static int validate_params(uint cmd, struct dm_ioctl *param)
+-{
+-	/* Ignores parameters */
+-	if (cmd == DM_REMOVE_ALL_CMD)
+-		return 0;
+-
+-	/* Unless creating, either name of uuid but not both */
+-	if (cmd != DM_DEV_CREATE_CMD) {
+-		if ((!*param->uuid && !*param->name) ||
+-		    (*param->uuid && *param->name)) {
+-			DMWARN("one of name or uuid must be supplied");
+-			return -EINVAL;
+-		}
+-	}
+-
+-	/* Ensure strings are terminated */
+-	param->name[DM_NAME_LEN - 1] = '\0';
+-	param->uuid[DM_UUID_LEN - 1] = '\0';
+-
+-	return 0;
+-}
+-
+-static int ctl_ioctl(struct inode *inode, struct file *file,
+-		     uint command, ulong u)
+-{
+-	int r = 0;
+-	unsigned int cmd;
+-	struct dm_ioctl *param;
+-	struct dm_ioctl *user = (struct dm_ioctl *) u;
+-	ioctl_fn fn = NULL;
+-
+-	/* only root can play with this */
+-	if (!capable(CAP_SYS_ADMIN))
+-		return -EACCES;
+-
+-	if (_IOC_TYPE(command) != DM_IOCTL)
+-		return -ENOTTY;
+-
+-	cmd = _IOC_NR(command);
+-
+-	/*
+-	 * Check the interface version passed in.  This also
+-	 * writes out the kernels interface version.
+-	 */
+-	r = check_version(cmd, user);
+-	if (r)
+-		return r;
+-
+-	/*
+-	 * Nothing more to do for the version command.
+-	 */
+-	if (cmd == DM_VERSION_CMD)
+-		return 0;
+-
+-	fn = lookup_ioctl(cmd);
+-	if (!fn) {
+-		DMWARN("dm_ctl_ioctl: unknown command 0x%x", command);
+-		return -ENOTTY;
+-	}
+-
+-	/*
+-	 * Copy the parameters into kernel space.
+-	 */
+-	r = copy_params(user, &param);
+-	if (r)
+-		return r;
+-
+-	r = validate_params(cmd, param);
+-	if (r) {
+-		free_params(param);
+-		return r;
+-	}
+-
+-	r = fn(param, user);
+-	free_params(param);
+-	return r;
+-}
+-
+-static struct file_operations _ctl_fops = {
+-	.ioctl	 = ctl_ioctl,
+-	.owner	 = THIS_MODULE,
+-};
+-
+-static struct miscdevice _dm_misc = {
+-	.minor		= MISC_DYNAMIC_MINOR,
+-	.name		= DM_NAME,
+-	.devfs_name	= "mapper/control",
+-	.fops		= &_ctl_fops
+-};
+-
+-/*
+- * Create misc character device and link to DM_DIR/control.
+- */
+-int __init dm_interface_init(void)
+-{
+-	int r;
+-
+-	r = dm_hash_init();
+-	if (r)
+-		return r;
+-
+-	r = misc_register(&_dm_misc);
+-	if (r) {
+-		DMERR("misc_register failed for control device");
+-		dm_hash_exit();
+-		return r;
+-	}
+-
+-	DMINFO("%d.%d.%d%s initialised: %s", DM_VERSION_MAJOR,
+-	       DM_VERSION_MINOR, DM_VERSION_PATCHLEVEL, DM_VERSION_EXTRA,
+-	       DM_DRIVER_EMAIL);
+-	return 0;
+-
+-	if (misc_deregister(&_dm_misc) < 0)
+-		DMERR("misc_deregister failed for control device");
+-	dm_hash_exit();
+-	return r;
+-}
+ 
+-void dm_interface_exit(void)
+-{
+-	if (misc_deregister(&_dm_misc) < 0)
+-		DMERR("misc_deregister failed for control device");
+-	dm_hash_exit();
+-}
++#ifdef CONFIG_DM_IOCTL_V4
++#include "dm-ioctl-v4.c"
++#else
++#include "dm-ioctl-v1.c"
++#endif
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/md/dm-ioctl-v1.c	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,1160 @@
++/*
++ * Copyright (C) 2001, 2002 Sistina Software (UK) Limited.
++ *
++ * This file is released under the GPL.
++ */
++
++#include "dm.h"
++
++#include <linux/module.h>
++#include <linux/vmalloc.h>
++#include <linux/miscdevice.h>
++#include <linux/dm-ioctl.h>
++#include <linux/init.h>
++#include <linux/wait.h>
++#include <linux/blk.h>
++#include <linux/slab.h>
++#include <linux/devfs_fs_kernel.h>
++
++#include <asm/uaccess.h>
++
++#define DM_DRIVER_EMAIL "dm@uk.sistina.com"
++
++/*-----------------------------------------------------------------
++ * The ioctl interface needs to be able to look up devices by
++ * name or uuid.
++ *---------------------------------------------------------------*/
++struct hash_cell {
++	struct list_head name_list;
++	struct list_head uuid_list;
++
++	char *name;
++	char *uuid;
++	struct mapped_device *md;
++};
++
++#define NUM_BUCKETS 64
++#define MASK_BUCKETS (NUM_BUCKETS - 1)
++static struct list_head _name_buckets[NUM_BUCKETS];
++static struct list_head _uuid_buckets[NUM_BUCKETS];
++
++void dm_hash_remove_all(void);
++
++/*
++ * Guards access to all three tables.
++ */
++static DECLARE_RWSEM(_hash_lock);
++
++static void init_buckets(struct list_head *buckets)
++{
++	unsigned int i;
++
++	for (i = 0; i < NUM_BUCKETS; i++)
++		INIT_LIST_HEAD(buckets + i);
++}
++
++int dm_hash_init(void)
++{
++	init_buckets(_name_buckets);
++	init_buckets(_uuid_buckets);
++	devfs_mk_dir(DM_DIR);
++	return 0;
++}
++
++void dm_hash_exit(void)
++{
++	dm_hash_remove_all();
++	devfs_remove(DM_DIR);
++}
++
++/*-----------------------------------------------------------------
++ * Hash function:
++ * We're not really concerned with the str hash function being
++ * fast since it's only used by the ioctl interface.
++ *---------------------------------------------------------------*/
++static unsigned int hash_str(const char *str)
++{
++	const unsigned int hash_mult = 2654435387U;
++	unsigned int h = 0;
++
++	while (*str)
++		h = (h + (unsigned int) *str++) * hash_mult;
++
++	return h & MASK_BUCKETS;
++}
++
++/*-----------------------------------------------------------------
++ * Code for looking up a device by name
++ *---------------------------------------------------------------*/
++static struct hash_cell *__get_name_cell(const char *str)
++{
++	struct list_head *tmp;
++	struct hash_cell *hc;
++	unsigned int h = hash_str(str);
++
++	list_for_each (tmp, _name_buckets + h) {
++		hc = list_entry(tmp, struct hash_cell, name_list);
++		if (!strcmp(hc->name, str))
++			return hc;
++	}
++
++	return NULL;
++}
++
++static struct hash_cell *__get_uuid_cell(const char *str)
++{
++	struct list_head *tmp;
++	struct hash_cell *hc;
++	unsigned int h = hash_str(str);
++
++	list_for_each (tmp, _uuid_buckets + h) {
++		hc = list_entry(tmp, struct hash_cell, uuid_list);
++		if (!strcmp(hc->uuid, str))
++			return hc;
++	}
++
++	return NULL;
++}
++
++/*-----------------------------------------------------------------
++ * Inserting, removing and renaming a device.
++ *---------------------------------------------------------------*/
++static inline char *kstrdup(const char *str)
++{
++	char *r = kmalloc(strlen(str) + 1, GFP_KERNEL);
++	if (r)
++		strcpy(r, str);
++	return r;
++}
++
++static struct hash_cell *alloc_cell(const char *name, const char *uuid,
++				    struct mapped_device *md)
++{
++	struct hash_cell *hc;
++
++	hc = kmalloc(sizeof(*hc), GFP_KERNEL);
++	if (!hc)
++		return NULL;
++
++	hc->name = kstrdup(name);
++	if (!hc->name) {
++		kfree(hc);
++		return NULL;
++	}
++
++	if (!uuid)
++		hc->uuid = NULL;
++
++	else {
++		hc->uuid = kstrdup(uuid);
++		if (!hc->uuid) {
++			kfree(hc->name);
++			kfree(hc);
++			return NULL;
++		}
++	}
++
++	INIT_LIST_HEAD(&hc->name_list);
++	INIT_LIST_HEAD(&hc->uuid_list);
++	hc->md = md;
++	return hc;
++}
++
++static void free_cell(struct hash_cell *hc)
++{
++	if (hc) {
++		kfree(hc->name);
++		kfree(hc->uuid);
++		kfree(hc);
++	}
++}
++
++/*
++ * devfs stuff.
++ */
++static int register_with_devfs(struct hash_cell *hc)
++{
++	struct gendisk *disk = dm_disk(hc->md);
++
++	devfs_mk_bdev(MKDEV(disk->major, disk->first_minor),
++		       S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP,
++		       DM_DIR "/%s", hc->name);
++	return 0;
++}
++
++static int unregister_with_devfs(struct hash_cell *hc)
++{
++	devfs_remove(DM_DIR"/%s", hc->name);
++	return 0;
++}
++
++/*
++ * The kdev_t and uuid of a device can never change once it is
++ * initially inserted.
++ */
++int dm_hash_insert(const char *name, const char *uuid, struct mapped_device *md)
++{
++	struct hash_cell *cell;
++
++	/*
++	 * Allocate the new cells.
++	 */
++	cell = alloc_cell(name, uuid, md);
++	if (!cell)
++		return -ENOMEM;
++
++	/*
++	 * Insert the cell into all three hash tables.
++	 */
++	down_write(&_hash_lock);
++	if (__get_name_cell(name))
++		goto bad;
++
++	list_add(&cell->name_list, _name_buckets + hash_str(name));
++
++	if (uuid) {
++		if (__get_uuid_cell(uuid)) {
++			list_del(&cell->name_list);
++			goto bad;
++		}
++		list_add(&cell->uuid_list, _uuid_buckets + hash_str(uuid));
++	}
++	register_with_devfs(cell);
++	dm_get(md);
++	up_write(&_hash_lock);
++
++	return 0;
++
++ bad:
++	up_write(&_hash_lock);
++	free_cell(cell);
++	return -EBUSY;
++}
++
++void __hash_remove(struct hash_cell *hc)
++{
++	/* remove from the dev hash */
++	list_del(&hc->uuid_list);
++	list_del(&hc->name_list);
++	unregister_with_devfs(hc);
++	dm_put(hc->md);
++	free_cell(hc);
++}
++
++void dm_hash_remove_all(void)
++{
++	int i;
++	struct hash_cell *hc;
++	struct list_head *tmp, *n;
++
++	down_write(&_hash_lock);
++	for (i = 0; i < NUM_BUCKETS; i++) {
++		list_for_each_safe (tmp, n, _name_buckets + i) {
++			hc = list_entry(tmp, struct hash_cell, name_list);
++			__hash_remove(hc);
++		}
++	}
++	up_write(&_hash_lock);
++}
++
++int dm_hash_rename(const char *old, const char *new)
++{
++	char *new_name, *old_name;
++	struct hash_cell *hc;
++
++	/*
++	 * duplicate new.
++	 */
++	new_name = kstrdup(new);
++	if (!new_name)
++		return -ENOMEM;
++
++	down_write(&_hash_lock);
++
++	/*
++	 * Is new free ?
++	 */
++	hc = __get_name_cell(new);
++	if (hc) {
++		DMWARN("asked to rename to an already existing name %s -> %s",
++		       old, new);
++		up_write(&_hash_lock);
++		kfree(new_name);
++		return -EBUSY;
++	}
++
++	/*
++	 * Is there such a device as 'old' ?
++	 */
++	hc = __get_name_cell(old);
++	if (!hc) {
++		DMWARN("asked to rename a non existent device %s -> %s",
++		       old, new);
++		up_write(&_hash_lock);
++		kfree(new_name);
++		return -ENXIO;
++	}
++
++	/*
++	 * rename and move the name cell.
++	 */
++	unregister_with_devfs(hc);
++
++	list_del(&hc->name_list);
++	old_name = hc->name;
++	hc->name = new_name;
++	list_add(&hc->name_list, _name_buckets + hash_str(new_name));
++
++	/* rename the device node in devfs */
++	register_with_devfs(hc);
++
++	up_write(&_hash_lock);
++	kfree(old_name);
++	return 0;
++}
++
++
++/*-----------------------------------------------------------------
++ * Implementation of the ioctl commands
++ *---------------------------------------------------------------*/
++
++/*
++ * All the ioctl commands get dispatched to functions with this
++ * prototype.
++ */
++typedef int (*ioctl_fn)(struct dm_ioctl *param, struct dm_ioctl *user);
++
++/*
++ * Check a string doesn't overrun the chunk of
++ * memory we copied from userland.
++ */
++static int valid_str(char *str, void *begin, void *end)
++{
++	while (((void *) str >= begin) && ((void *) str < end))
++		if (!*str++)
++			return 0;
++
++	return -EINVAL;
++}
++
++static int next_target(struct dm_target_spec *last, uint32_t next,
++		       void *begin, void *end,
++		       struct dm_target_spec **spec, char **params)
++{
++	*spec = (struct dm_target_spec *)
++	    ((unsigned char *) last + next);
++	*params = (char *) (*spec + 1);
++
++	if (*spec < (last + 1) || ((void *) *spec > end))
++		return -EINVAL;
++
++	return valid_str(*params, begin, end);
++}
++
++static int populate_table(struct dm_table *table, struct dm_ioctl *args)
++{
++	int r, first = 1;
++	unsigned int i = 0;
++	struct dm_target_spec *spec;
++	char *params;
++	void *begin, *end;
++
++	if (!args->target_count) {
++		DMWARN("populate_table: no targets specified");
++		return -EINVAL;
++	}
++
++	begin = (void *) args;
++	end = begin + args->data_size;
++
++	for (i = 0; i < args->target_count; i++) {
++
++		if (first)
++			r = next_target((struct dm_target_spec *) args,
++					args->data_start,
++					begin, end, &spec, &params);
++		else
++			r = next_target(spec, spec->next, begin, end,
++					&spec, &params);
++
++		if (r) {
++			DMWARN("unable to find target");
++			return -EINVAL;
++		}
++
++		r = dm_table_add_target(table, spec->target_type,
++					(sector_t) spec->sector_start,
++					(sector_t) spec->length,
++					params);
++		if (r) {
++			DMWARN("internal error adding target to table");
++			return -EINVAL;
++		}
++
++		first = 0;
++	}
++
++	return dm_table_complete(table);
++}
++
++/*
++ * Round up the ptr to the next 'align' boundary.  Obviously
++ * 'align' must be a power of 2.
++ */
++static inline void *align_ptr(void *ptr, unsigned int align)
++{
++	align--;
++	return (void *) (((unsigned long) (ptr + align)) & ~align);
++}
++
++/*
++ * Copies a dm_ioctl and an optional additional payload to
++ * userland.
++ */
++static int results_to_user(struct dm_ioctl *user, struct dm_ioctl *param,
++			   void *data, uint32_t len)
++{
++	int r;
++	void *ptr = NULL;
++
++	if (data) {
++		ptr = align_ptr(user + 1, sizeof(unsigned long));
++		param->data_start = ptr - (void *) user;
++	}
++
++	/*
++	 * The version number has already been filled in, so we
++	 * just copy later fields.
++	 */
++	r = copy_to_user(&user->data_size, &param->data_size,
++			 sizeof(*param) - sizeof(param->version));
++	if (r)
++		return -EFAULT;
++
++	if (data) {
++		if (param->data_start + len > param->data_size)
++			return -ENOSPC;
++
++		if (copy_to_user(ptr, data, len))
++			r = -EFAULT;
++	}
++
++	return r;
++}
++
++/*
++ * Fills in a dm_ioctl structure, ready for sending back to
++ * userland.
++ */
++static int __info(struct mapped_device *md, struct dm_ioctl *param)
++{
++	struct dm_table *table;
++	struct block_device *bdev;
++	struct gendisk *disk = dm_disk(md);
++
++	param->flags = DM_EXISTS_FLAG;
++	if (dm_suspended(md))
++		param->flags |= DM_SUSPEND_FLAG;
++
++	bdev = bdget_disk(disk, 0);
++	if (!bdev)
++		return -ENXIO;
++
++	param->dev = bdev->bd_dev;
++	param->open_count = bdev->bd_openers;
++	bdput(bdev);
++
++	if (disk->policy)
++		param->flags |= DM_READONLY_FLAG;
++
++	table = dm_get_table(md);
++	param->target_count = dm_table_get_num_targets(table);
++	dm_table_put(table);
++
++	return 0;
++}
++
++/*
++ * Always use UUID for lookups if it's present, otherwise use name.
++ */
++static inline struct mapped_device *find_device(struct dm_ioctl *param)
++{
++	struct hash_cell *hc;
++	struct mapped_device *md = NULL;
++
++	down_read(&_hash_lock);
++	hc = *param->uuid ? __get_uuid_cell(param->uuid) :
++		__get_name_cell(param->name);
++	if (hc) {
++		md = hc->md;
++
++		/*
++		 * Sneakily write in both the name and the uuid
++		 * while we have the cell.
++		 */
++		strlcpy(param->name, hc->name, sizeof(param->name));
++		if (hc->uuid)
++			strlcpy(param->uuid, hc->uuid, sizeof(param->uuid));
++		else
++			param->uuid[0] = '\0';
++
++		dm_get(md);
++	}
++	up_read(&_hash_lock);
++
++	return md;
++}
++
++#define ALIGNMENT sizeof(int)
++static void *_align(void *ptr, unsigned int a)
++{
++	register unsigned long align = --a;
++
++	return (void *) (((unsigned long) ptr + align) & ~align);
++}
++
++/*
++ * Copies device info back to user space, used by
++ * the create and info ioctls.
++ */
++static int info(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++	struct mapped_device *md;
++
++	param->flags = 0;
++
++	md = find_device(param);
++	if (!md)
++		/*
++		 * Device not found - returns cleared exists flag.
++		 */
++		goto out;
++
++	__info(md, param);
++	dm_put(md);
++
++      out:
++	return results_to_user(user, param, NULL, 0);
++}
++
++static inline int get_mode(struct dm_ioctl *param)
++{
++	int mode = FMODE_READ | FMODE_WRITE;
++
++	if (param->flags & DM_READONLY_FLAG)
++		mode = FMODE_READ;
++
++	return mode;
++}
++
++static int check_name(const char *name)
++{
++	if (name[0] == '/') {
++		DMWARN("invalid device name");
++		return -EINVAL;
++	}
++
++	return 0;
++}
++
++static int create(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++	int r;
++	struct dm_table *t;
++	struct mapped_device *md;
++
++	r = check_name(param->name);
++	if (r)
++		return r;
++
++	r = dm_table_create(&t, get_mode(param));
++	if (r)
++		return r;
++
++	r = populate_table(t, param);
++	if (r) {
++		dm_table_put(t);
++		return r;
++	}
++
++	if (param->flags & DM_PERSISTENT_DEV_FLAG)
++		r = dm_create_with_minor(minor(to_kdev_t(param->dev)), &md);
++	else
++		r = dm_create(&md);
++
++	if (r) {
++		dm_table_put(t);
++		return r;
++	}
++
++	/* suspend the device */
++	r = dm_suspend(md);
++	if (r) {
++		DMWARN("suspend failed");
++		dm_table_put(t);
++		dm_put(md);
++		return r;
++	}
++	/* swap in the table */
++	r = dm_swap_table(md, t);
++	if (r) {
++		DMWARN("table swap failed");
++		dm_table_put(t);
++		dm_put(md);
++		return r;
++	}
++
++	/* resume the device */
++	r = dm_resume(md);
++	if (r) {
++		DMWARN("resume failed");
++		dm_table_put(t);
++		dm_put(md);
++		return r;
++	}
++
++	dm_table_put(t);	/* md will have grabbed its own reference */
++
++	set_disk_ro(dm_disk(md), (param->flags & DM_READONLY_FLAG) ? 1 : 0);
++	r = dm_hash_insert(param->name, *param->uuid ? param->uuid : NULL, md);
++	dm_put(md);
++
++	return r ? r : info(param, user);
++}
++
++/*
++ * Build up the status struct for each target
++ */
++static int __status(struct mapped_device *md, struct dm_ioctl *param,
++		    char *outbuf, size_t *len)
++{
++	unsigned int i, num_targets;
++	struct dm_target_spec *spec;
++	char *outptr;
++	status_type_t type;
++	struct dm_table *table = dm_get_table(md);
++
++	if (param->flags & DM_STATUS_TABLE_FLAG)
++		type = STATUSTYPE_TABLE;
++	else
++		type = STATUSTYPE_INFO;
++
++	outptr = outbuf;
++
++	/* Get all the target info */
++	num_targets = dm_table_get_num_targets(table);
++	for (i = 0; i < num_targets; i++) {
++		struct dm_target *ti = dm_table_get_target(table, i);
++
++		if (outptr - outbuf +
++		    sizeof(struct dm_target_spec) > param->data_size) {
++			dm_table_put(table);
++			return -ENOMEM;
++		}
++
++		spec = (struct dm_target_spec *) outptr;
++
++		spec->status = 0;
++		spec->sector_start = ti->begin;
++		spec->length = ti->len;
++		strlcpy(spec->target_type, ti->type->name,
++			sizeof(spec->target_type));
++
++		outptr += sizeof(struct dm_target_spec);
++
++		/* Get the status/table string from the target driver */
++		if (ti->type->status)
++			ti->type->status(ti, type, outptr,
++					 outbuf + param->data_size - outptr);
++		else
++			outptr[0] = '\0';
++
++		outptr += strlen(outptr) + 1;
++		_align(outptr, ALIGNMENT);
++		spec->next = outptr - outbuf;
++	}
++
++	param->target_count = num_targets;
++	*len = outptr - outbuf;
++	dm_table_put(table);
++
++	return 0;
++}
++
++/*
++ * Return the status of a device as a text string for each
++ * target.
++ */
++static int get_status(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++	struct mapped_device *md;
++	size_t len = 0;
++	int ret;
++	char *outbuf = NULL;
++
++	md = find_device(param);
++	if (!md)
++		/*
++		 * Device not found - returns cleared exists flag.
++		 */
++		goto out;
++
++	/* We haven't a clue how long the resultant data will be so
++	   just allocate as much as userland has allowed us and make sure
++	   we don't overun it */
++	outbuf = kmalloc(param->data_size, GFP_KERNEL);
++	if (!outbuf)
++		goto out;
++	/*
++	 * Get the status of all targets
++	 */
++	__status(md, param, outbuf, &len);
++
++	/*
++	 * Setup the basic dm_ioctl structure.
++	 */
++	__info(md, param);
++
++      out:
++	if (md)
++		dm_put(md);
++
++	ret = results_to_user(user, param, outbuf, len);
++
++	if (outbuf)
++		kfree(outbuf);
++
++	return ret;
++}
++
++/*
++ * Wait for a device to report an event
++ */
++static int wait_device_event(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++	struct mapped_device *md;
++	DECLARE_WAITQUEUE(wq, current);
++
++	md = find_device(param);
++	if (!md)
++		/*
++		 * Device not found - returns cleared exists flag.
++		 */
++		goto out;
++
++	/*
++	 * Setup the basic dm_ioctl structure.
++	 */
++	__info(md, param);
++
++	/*
++	 * Wait for a notification event
++	 */
++	set_current_state(TASK_INTERRUPTIBLE);
++ 	if (!dm_add_wait_queue(md, &wq, dm_get_event_nr(md))) {
++ 		schedule();
++ 		dm_remove_wait_queue(md, &wq);
++ 	}
++  	set_current_state(TASK_RUNNING);
++ 	dm_put(md);
++
++      out:
++	return results_to_user(user, param, NULL, 0);
++}
++
++/*
++ * Retrieves a list of devices used by a particular dm device.
++ */
++static int dep(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++	int r;
++	unsigned int count;
++	struct mapped_device *md;
++	struct list_head *tmp;
++	size_t len = 0;
++	struct dm_target_deps *deps = NULL;
++	struct dm_table *table;
++
++	md = find_device(param);
++	if (!md)
++		goto out;
++	table = dm_get_table(md);
++
++	/*
++	 * Setup the basic dm_ioctl structure.
++	 */
++	__info(md, param);
++
++	/*
++	 * Count the devices.
++	 */
++	count = 0;
++	list_for_each(tmp, dm_table_get_devices(table))
++	    count++;
++
++	/*
++	 * Allocate a kernel space version of the dm_target_status
++	 * struct.
++	 */
++	if (array_too_big(sizeof(*deps), sizeof(*deps->dev), count)) {
++		dm_table_put(table);
++		dm_put(md);
++		return -ENOMEM;
++	}
++
++	len = sizeof(*deps) + (sizeof(*deps->dev) * count);
++	deps = kmalloc(len, GFP_KERNEL);
++	if (!deps) {
++		dm_table_put(table);
++		dm_put(md);
++		return -ENOMEM;
++	}
++
++	/*
++	 * Fill in the devices.
++	 */
++	deps->count = count;
++	count = 0;
++	list_for_each(tmp, dm_table_get_devices(table)) {
++		struct dm_dev *dd = list_entry(tmp, struct dm_dev, list);
++		deps->dev[count++] = dd->bdev->bd_dev;
++	}
++	dm_table_put(table);
++	dm_put(md);
++
++      out:
++	r = results_to_user(user, param, deps, len);
++
++	kfree(deps);
++	return r;
++}
++
++static int remove(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++	struct hash_cell *hc;
++
++	down_write(&_hash_lock);
++	hc = *param->uuid ? __get_uuid_cell(param->uuid) :
++		__get_name_cell(param->name);
++	if (!hc) {
++		DMWARN("device doesn't appear to be in the dev hash table.");
++		up_write(&_hash_lock);
++		return -EINVAL;
++	}
++
++	/*
++	 * You may ask the interface to drop its reference to an
++	 * in use device.  This is no different to unlinking a
++	 * file that someone still has open.  The device will not
++	 * actually be destroyed until the last opener closes it.
++	 * The name and uuid of the device (both are interface
++	 * properties) will be available for reuse immediately.
++	 *
++	 * You don't want to drop a _suspended_ device from the
++	 * interface, since that will leave you with no way of
++	 * resuming it.
++	 */
++	if (dm_suspended(hc->md)) {
++		DMWARN("refusing to remove a suspended device.");
++		up_write(&_hash_lock);
++		return -EPERM;
++	}
++
++	__hash_remove(hc);
++	up_write(&_hash_lock);
++	return 0;
++}
++
++static int remove_all(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++	dm_hash_remove_all();
++	return 0;
++}
++
++static int suspend(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++	int r;
++	struct mapped_device *md;
++
++	md = find_device(param);
++	if (!md)
++		return -ENXIO;
++
++	if (param->flags & DM_SUSPEND_FLAG)
++		r = dm_suspend(md);
++	else
++		r = dm_resume(md);
++
++	dm_put(md);
++	return r;
++}
++
++static int reload(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++	int r;
++	struct mapped_device *md;
++	struct dm_table *t;
++
++	r = dm_table_create(&t, get_mode(param));
++	if (r)
++		return r;
++
++	r = populate_table(t, param);
++	if (r) {
++		dm_table_put(t);
++		return r;
++	}
++
++	md = find_device(param);
++	if (!md) {
++		dm_table_put(t);
++		return -ENXIO;
++	}
++
++	r = dm_swap_table(md, t);
++	if (r) {
++		dm_put(md);
++		dm_table_put(t);
++		return r;
++	}
++	dm_table_put(t);	/* md will have taken its own reference */
++
++	set_disk_ro(dm_disk(md), (param->flags & DM_READONLY_FLAG) ? 1 : 0);
++	dm_put(md);
++
++	r = info(param, user);
++	return r;
++}
++
++static int rename(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++	int r;
++	char *new_name = (char *) param + param->data_start;
++
++	if (valid_str(new_name, (void *) param,
++		      (void *) param + param->data_size)) {
++		DMWARN("Invalid new logical volume name supplied.");
++		return -EINVAL;
++	}
++
++	r = check_name(new_name);
++	if (r)
++		return r;
++
++	return dm_hash_rename(param->name, new_name);
++}
++
++
++/*-----------------------------------------------------------------
++ * Implementation of open/close/ioctl on the special char
++ * device.
++ *---------------------------------------------------------------*/
++static ioctl_fn lookup_ioctl(unsigned int cmd)
++{
++	static struct {
++		int cmd;
++		ioctl_fn fn;
++	} _ioctls[] = {
++		{DM_VERSION_CMD, NULL},	/* version is dealt with elsewhere */
++		{DM_REMOVE_ALL_CMD, remove_all},
++		{DM_DEV_CREATE_CMD, create},
++		{DM_DEV_REMOVE_CMD, remove},
++		{DM_DEV_RELOAD_CMD, reload},
++		{DM_DEV_RENAME_CMD, rename},
++		{DM_DEV_SUSPEND_CMD, suspend},
++		{DM_DEV_DEPS_CMD, dep},
++		{DM_DEV_STATUS_CMD, info},
++		{DM_TARGET_STATUS_CMD, get_status},
++		{DM_TARGET_WAIT_CMD, wait_device_event},
++	};
++
++	return (cmd >= ARRAY_SIZE(_ioctls)) ? NULL : _ioctls[cmd].fn;
++}
++
++/*
++ * As well as checking the version compatibility this always
++ * copies the kernel interface version out.
++ */
++static int check_version(unsigned int cmd, struct dm_ioctl *user)
++{
++	uint32_t version[3];
++	int r = 0;
++
++	if (copy_from_user(version, user->version, sizeof(version)))
++		return -EFAULT;
++
++	if ((DM_VERSION_MAJOR != version[0]) ||
++	    (DM_VERSION_MINOR < version[1])) {
++		DMWARN("ioctl interface mismatch: "
++		       "kernel(%u.%u.%u), user(%u.%u.%u), cmd(%d)",
++		       DM_VERSION_MAJOR, DM_VERSION_MINOR,
++		       DM_VERSION_PATCHLEVEL,
++		       version[0], version[1], version[2], cmd);
++		r = -EINVAL;
++	}
++
++	/*
++	 * Fill in the kernel version.
++	 */
++	version[0] = DM_VERSION_MAJOR;
++	version[1] = DM_VERSION_MINOR;
++	version[2] = DM_VERSION_PATCHLEVEL;
++	if (copy_to_user(user->version, version, sizeof(version)))
++		return -EFAULT;
++
++	return r;
++}
++
++static void free_params(struct dm_ioctl *param)
++{
++	vfree(param);
++}
++
++static int copy_params(struct dm_ioctl *user, struct dm_ioctl **param)
++{
++	struct dm_ioctl tmp, *dmi;
++
++	if (copy_from_user(&tmp, user, sizeof(tmp)))
++		return -EFAULT;
++
++	if (tmp.data_size < sizeof(tmp))
++		return -EINVAL;
++
++	dmi = (struct dm_ioctl *) vmalloc(tmp.data_size);
++	if (!dmi)
++		return -ENOMEM;
++
++	if (copy_from_user(dmi, user, tmp.data_size)) {
++		vfree(dmi);
++		return -EFAULT;
++	}
++
++	*param = dmi;
++	return 0;
++}
++
++static int validate_params(uint cmd, struct dm_ioctl *param)
++{
++	/* Ignores parameters */
++	if (cmd == DM_REMOVE_ALL_CMD)
++		return 0;
++
++	/* Unless creating, either name of uuid but not both */
++	if (cmd != DM_DEV_CREATE_CMD) {
++		if ((!*param->uuid && !*param->name) ||
++		    (*param->uuid && *param->name)) {
++			DMWARN("one of name or uuid must be supplied");
++			return -EINVAL;
++		}
++	}
++
++	/* Ensure strings are terminated */
++	param->name[DM_NAME_LEN - 1] = '\0';
++	param->uuid[DM_UUID_LEN - 1] = '\0';
++
++	return 0;
++}
++
++static int ctl_ioctl(struct inode *inode, struct file *file,
++		     uint command, ulong u)
++{
++	int r = 0;
++	unsigned int cmd;
++	struct dm_ioctl *param;
++	struct dm_ioctl *user = (struct dm_ioctl *) u;
++	ioctl_fn fn = NULL;
++
++	/* only root can play with this */
++	if (!capable(CAP_SYS_ADMIN))
++		return -EACCES;
++
++	if (_IOC_TYPE(command) != DM_IOCTL)
++		return -ENOTTY;
++
++	cmd = _IOC_NR(command);
++
++	/*
++	 * Check the interface version passed in.  This also
++	 * writes out the kernels interface version.
++	 */
++	r = check_version(cmd, user);
++	if (r)
++		return r;
++
++	/*
++	 * Nothing more to do for the version command.
++	 */
++	if (cmd == DM_VERSION_CMD)
++		return 0;
++
++	fn = lookup_ioctl(cmd);
++	if (!fn) {
++		DMWARN("dm_ctl_ioctl: unknown command 0x%x", command);
++		return -ENOTTY;
++	}
++
++	/*
++	 * Copy the parameters into kernel space.
++	 */
++	r = copy_params(user, &param);
++	if (r)
++		return r;
++
++	r = validate_params(cmd, param);
++	if (r) {
++		free_params(param);
++		return r;
++	}
++
++	r = fn(param, user);
++	free_params(param);
++	return r;
++}
++
++static struct file_operations _ctl_fops = {
++	.ioctl	 = ctl_ioctl,
++	.owner	 = THIS_MODULE,
++};
++
++static struct miscdevice _dm_misc = {
++	.minor		= MISC_DYNAMIC_MINOR,
++	.name		= DM_NAME,
++	.devfs_name	= "mapper/control",
++	.fops		= &_ctl_fops
++};
++
++/*
++ * Create misc character device and link to DM_DIR/control.
++ */
++int __init dm_interface_init(void)
++{
++	int r;
++
++	r = dm_hash_init();
++	if (r)
++		return r;
++
++	r = misc_register(&_dm_misc);
++	if (r) {
++		DMERR("misc_register failed for control device");
++		dm_hash_exit();
++		return r;
++	}
++
++	DMINFO("%d.%d.%d%s initialised: %s", DM_VERSION_MAJOR,
++	       DM_VERSION_MINOR, DM_VERSION_PATCHLEVEL, DM_VERSION_EXTRA,
++	       DM_DRIVER_EMAIL);
++	return 0;
++
++	if (misc_deregister(&_dm_misc) < 0)
++		DMERR("misc_deregister failed for control device");
++	dm_hash_exit();
++	return r;
++}
++
++void dm_interface_exit(void)
++{
++	if (misc_deregister(&_dm_misc) < 0)
++		DMERR("misc_deregister failed for control device");
++	dm_hash_exit();
++}
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/md/dm-ioctl-v4.c	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,1252 @@
++/*
++ * Copyright (C) 2001, 2002 Sistina Software (UK) Limited.
++ *
++ * This file is released under the GPL.
++ */
++
++#include "dm.h"
++
++#include <linux/module.h>
++#include <linux/vmalloc.h>
++#include <linux/miscdevice.h>
++#include <linux/init.h>
++#include <linux/wait.h>
++#include <linux/blk.h>
++#include <linux/slab.h>
++#include <linux/devfs_fs_kernel.h>
++
++#include <asm/uaccess.h>
++
++#define DM_DRIVER_EMAIL "dm@uk.sistina.com"
++
++/*-----------------------------------------------------------------
++ * The ioctl interface needs to be able to look up devices by
++ * name or uuid.
++ *---------------------------------------------------------------*/
++struct hash_cell {
++	struct list_head name_list;
++	struct list_head uuid_list;
++
++	char *name;
++	char *uuid;
++	struct mapped_device *md;
++	struct dm_table *new_map;
++};
++
++#define NUM_BUCKETS 64
++#define MASK_BUCKETS (NUM_BUCKETS - 1)
++static struct list_head _name_buckets[NUM_BUCKETS];
++static struct list_head _uuid_buckets[NUM_BUCKETS];
++
++void dm_hash_remove_all(void);
++
++/*
++ * Guards access to both hash tables.
++ */
++static DECLARE_RWSEM(_hash_lock);
++
++static void init_buckets(struct list_head *buckets)
++{
++	unsigned int i;
++
++	for (i = 0; i < NUM_BUCKETS; i++)
++		INIT_LIST_HEAD(buckets + i);
++}
++
++int dm_hash_init(void)
++{
++	init_buckets(_name_buckets);
++	init_buckets(_uuid_buckets);
++	devfs_mk_dir(DM_DIR);
++	return 0;
++}
++
++void dm_hash_exit(void)
++{
++	dm_hash_remove_all();
++	devfs_remove(DM_DIR);
++}
++
++/*-----------------------------------------------------------------
++ * Hash function:
++ * We're not really concerned with the str hash function being
++ * fast since it's only used by the ioctl interface.
++ *---------------------------------------------------------------*/
++static unsigned int hash_str(const char *str)
++{
++	const unsigned int hash_mult = 2654435387U;
++	unsigned int h = 0;
++
++	while (*str)
++		h = (h + (unsigned int) *str++) * hash_mult;
++
++	return h & MASK_BUCKETS;
++}
++
++/*-----------------------------------------------------------------
++ * Code for looking up a device by name
++ *---------------------------------------------------------------*/
++static struct hash_cell *__get_name_cell(const char *str)
++{
++	struct list_head *tmp;
++	struct hash_cell *hc;
++	unsigned int h = hash_str(str);
++
++	list_for_each (tmp, _name_buckets + h) {
++		hc = list_entry(tmp, struct hash_cell, name_list);
++		if (!strcmp(hc->name, str))
++			return hc;
++	}
++
++	return NULL;
++}
++
++static struct hash_cell *__get_uuid_cell(const char *str)
++{
++	struct list_head *tmp;
++	struct hash_cell *hc;
++	unsigned int h = hash_str(str);
++
++	list_for_each (tmp, _uuid_buckets + h) {
++		hc = list_entry(tmp, struct hash_cell, uuid_list);
++		if (!strcmp(hc->uuid, str))
++			return hc;
++	}
++
++	return NULL;
++}
++
++/*-----------------------------------------------------------------
++ * Inserting, removing and renaming a device.
++ *---------------------------------------------------------------*/
++static inline char *kstrdup(const char *str)
++{
++	char *r = kmalloc(strlen(str) + 1, GFP_KERNEL);
++	if (r)
++		strcpy(r, str);
++	return r;
++}
++
++static struct hash_cell *alloc_cell(const char *name, const char *uuid,
++				    struct mapped_device *md)
++{
++	struct hash_cell *hc;
++
++	hc = kmalloc(sizeof(*hc), GFP_KERNEL);
++	if (!hc)
++		return NULL;
++
++	hc->name = kstrdup(name);
++	if (!hc->name) {
++		kfree(hc);
++		return NULL;
++	}
++
++	if (!uuid)
++		hc->uuid = NULL;
++
++	else {
++		hc->uuid = kstrdup(uuid);
++		if (!hc->uuid) {
++			kfree(hc->name);
++			kfree(hc);
++			return NULL;
++		}
++	}
++
++	INIT_LIST_HEAD(&hc->name_list);
++	INIT_LIST_HEAD(&hc->uuid_list);
++	hc->md = md;
++	hc->new_map = NULL;
++	return hc;
++}
++
++static void free_cell(struct hash_cell *hc)
++{
++	if (hc) {
++		kfree(hc->name);
++		kfree(hc->uuid);
++		kfree(hc);
++	}
++}
++
++/*
++ * devfs stuff.
++ */
++static int register_with_devfs(struct hash_cell *hc)
++{
++	struct gendisk *disk = dm_disk(hc->md);
++
++	devfs_mk_bdev(MKDEV(disk->major, disk->first_minor),
++		      S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP,
++		      DM_DIR "/%s", hc->name);
++	return 0;
++}
++
++static int unregister_with_devfs(struct hash_cell *hc)
++{
++	devfs_remove(DM_DIR"/%s", hc->name);
++	return 0;
++}
++
++/*
++ * The kdev_t and uuid of a device can never change once it is
++ * initially inserted.
++ */
++int dm_hash_insert(const char *name, const char *uuid, struct mapped_device *md)
++{
++	struct hash_cell *cell;
++
++	/*
++	 * Allocate the new cells.
++	 */
++	cell = alloc_cell(name, uuid, md);
++	if (!cell)
++		return -ENOMEM;
++
++	/*
++	 * Insert the cell into both hash tables.
++	 */
++	down_write(&_hash_lock);
++	if (__get_name_cell(name))
++		goto bad;
++
++	list_add(&cell->name_list, _name_buckets + hash_str(name));
++
++	if (uuid) {
++		if (__get_uuid_cell(uuid)) {
++			list_del(&cell->name_list);
++			goto bad;
++		}
++		list_add(&cell->uuid_list, _uuid_buckets + hash_str(uuid));
++	}
++	register_with_devfs(cell);
++	dm_get(md);
++	up_write(&_hash_lock);
++
++	return 0;
++
++ bad:
++	up_write(&_hash_lock);
++	free_cell(cell);
++	return -EBUSY;
++}
++
++void __hash_remove(struct hash_cell *hc)
++{
++	/* remove from the dev hash */
++	list_del(&hc->uuid_list);
++	list_del(&hc->name_list);
++	unregister_with_devfs(hc);
++	dm_put(hc->md);
++	if (hc->new_map)
++		dm_table_put(hc->new_map);
++	free_cell(hc);
++}
++
++void dm_hash_remove_all(void)
++{
++	int i;
++	struct hash_cell *hc;
++	struct list_head *tmp, *n;
++
++	down_write(&_hash_lock);
++	for (i = 0; i < NUM_BUCKETS; i++) {
++		list_for_each_safe (tmp, n, _name_buckets + i) {
++			hc = list_entry(tmp, struct hash_cell, name_list);
++			__hash_remove(hc);
++		}
++	}
++	up_write(&_hash_lock);
++}
++
++int dm_hash_rename(const char *old, const char *new)
++{
++	char *new_name, *old_name;
++	struct hash_cell *hc;
++
++	/*
++	 * duplicate new.
++	 */
++	new_name = kstrdup(new);
++	if (!new_name)
++		return -ENOMEM;
++
++	down_write(&_hash_lock);
++
++	/*
++	 * Is new free ?
++	 */
++	hc = __get_name_cell(new);
++	if (hc) {
++		DMWARN("asked to rename to an already existing name %s -> %s",
++		       old, new);
++		up_write(&_hash_lock);
++		kfree(new_name);
++		return -EBUSY;
++	}
++
++	/*
++	 * Is there such a device as 'old' ?
++	 */
++	hc = __get_name_cell(old);
++	if (!hc) {
++		DMWARN("asked to rename a non existent device %s -> %s",
++		       old, new);
++		up_write(&_hash_lock);
++		kfree(new_name);
++		return -ENXIO;
++	}
++
++	/*
++	 * rename and move the name cell.
++	 */
++	unregister_with_devfs(hc);
++
++	list_del(&hc->name_list);
++	old_name = hc->name;
++	hc->name = new_name;
++	list_add(&hc->name_list, _name_buckets + hash_str(new_name));
++
++	/* rename the device node in devfs */
++	register_with_devfs(hc);
++
++	up_write(&_hash_lock);
++	kfree(old_name);
++	return 0;
++}
++
++/*-----------------------------------------------------------------
++ * Implementation of the ioctl commands
++ *---------------------------------------------------------------*/
++/*
++ * All the ioctl commands get dispatched to functions with this
++ * prototype.
++ */
++typedef int (*ioctl_fn)(struct dm_ioctl *param, size_t param_size);
++
++static int remove_all(struct dm_ioctl *param, size_t param_size)
++{
++	dm_hash_remove_all();
++	param->data_size = 0;
++	return 0;
++}
++
++/*
++ * Round up the ptr to an 8-byte boundary.
++ */
++#define ALIGN_MASK 7
++static inline void *align_ptr(void *ptr)
++{
++	return (void *) (((size_t) (ptr + ALIGN_MASK)) & ~ALIGN_MASK);
++}
++
++/*
++ * Retrieves the data payload buffer from an already allocated
++ * struct dm_ioctl.
++ */
++static void *get_result_buffer(struct dm_ioctl *param, size_t param_size,
++			       size_t *len)
++{
++	param->data_start = align_ptr(param + 1) - (void *) param;
++
++	if (param->data_start < param_size)
++		*len = param_size - param->data_start;
++	else
++		*len = 0;
++
++	return ((void *) param) + param->data_start;
++}
++
++static int list_devices(struct dm_ioctl *param, size_t param_size)
++{
++	unsigned int i;
++	struct hash_cell *hc;
++	size_t len, needed = 0;
++	struct gendisk *disk;
++	struct dm_name_list *nl, *old_nl = NULL;
++
++	down_write(&_hash_lock);
++
++	/*
++	 * Loop through all the devices working out how much
++	 * space we need.
++	 */
++	for (i = 0; i < NUM_BUCKETS; i++) {
++		list_for_each_entry (hc, _name_buckets + i, name_list) {
++			needed += sizeof(struct dm_name_list);
++			needed += strlen(hc->name);
++			needed += ALIGN_MASK;
++		}
++	}
++
++	/*
++	 * Grab our output buffer.
++	 */
++	nl = get_result_buffer(param, param_size, &len);
++	if (len < needed) {
++		param->flags |= DM_BUFFER_FULL_FLAG;
++		goto out;
++	}
++	param->data_size = param->data_start + needed;
++
++	nl->dev = 0;	/* Flags no data */
++
++	/*
++	 * Now loop through filling out the names.
++	 */
++	for (i = 0; i < NUM_BUCKETS; i++) {
++		list_for_each_entry (hc, _name_buckets + i, name_list) {
++			if (old_nl)
++				old_nl->next = (uint32_t) ((void *) nl -
++							   (void *) old_nl);
++			disk = dm_disk(hc->md);
++			nl->dev = MKDEV(disk->major, disk->first_minor);
++			nl->next = 0;
++			strcpy(nl->name, hc->name);
++
++			old_nl = nl;
++			nl = align_ptr(((void *) ++nl) + strlen(hc->name) + 1);
++		}
++	}
++
++ out:
++	up_write(&_hash_lock);
++	return 0;
++}
++
++static int check_name(const char *name)
++{
++	if (strchr(name, '/')) {
++		DMWARN("invalid device name");
++		return -EINVAL;
++	}
++
++	return 0;
++}
++
++/*
++ * Fills in a dm_ioctl structure, ready for sending back to
++ * userland.
++ */
++static int __dev_status(struct mapped_device *md, struct dm_ioctl *param)
++{
++	struct gendisk *disk = dm_disk(md);
++	struct dm_table *table;
++	struct block_device *bdev;
++
++	param->flags &= ~(DM_SUSPEND_FLAG | DM_READONLY_FLAG |
++			  DM_ACTIVE_PRESENT_FLAG);
++
++	if (dm_suspended(md))
++		param->flags |= DM_SUSPEND_FLAG;
++
++	bdev = bdget_disk(disk, 0);
++	if (!bdev)
++		return -ENXIO;
++
++	param->dev = MKDEV(disk->major, disk->first_minor);
++
++	/*
++	 * Yes, this will be out of date by the time it gets back
++	 * to userland, but it is still very useful ofr
++	 * debugging.
++	 */
++	param->open_count = bdev->bd_openers;
++	bdput(bdev);
++
++	if (disk->policy)
++		param->flags |= DM_READONLY_FLAG;
++
++	param->event_nr = dm_get_event_nr(md);
++
++	table = dm_get_table(md);
++	if (table) {
++		param->flags |= DM_ACTIVE_PRESENT_FLAG;
++		param->target_count = dm_table_get_num_targets(table);
++		dm_table_put(table);
++	} else
++		param->target_count = 0;
++
++	return 0;
++}
++
++static int dev_create(struct dm_ioctl *param, size_t param_size)
++{
++	int r;
++	struct mapped_device *md;
++
++	r = check_name(param->name);
++	if (r)
++		return r;
++
++	if (param->flags & DM_PERSISTENT_DEV_FLAG)
++		r = dm_create_with_minor(minor(to_kdev_t(param->dev)), &md);
++	else
++		r = dm_create(&md);
++
++	if (r)
++		return r;
++
++	r = dm_hash_insert(param->name, *param->uuid ? param->uuid : NULL, md);
++	if (r) {
++		dm_put(md);
++		return r;
++	}
++
++	param->flags &= ~DM_INACTIVE_PRESENT_FLAG;
++
++	r = __dev_status(md, param);
++	dm_put(md);
++
++	return r;
++}
++
++/*
++ * Always use UUID for lookups if it's present, otherwise use name.
++ */
++static inline struct hash_cell *__find_device_hash_cell(struct dm_ioctl *param)
++{
++	return *param->uuid ?
++	    __get_uuid_cell(param->uuid) : __get_name_cell(param->name);
++}
++
++static inline struct mapped_device *find_device(struct dm_ioctl *param)
++{
++	struct hash_cell *hc;
++	struct mapped_device *md = NULL;
++
++	down_read(&_hash_lock);
++	hc = __find_device_hash_cell(param);
++	if (hc) {
++		md = hc->md;
++
++		/*
++		 * Sneakily write in both the name and the uuid
++		 * while we have the cell.
++		 */
++		strncpy(param->name, hc->name, sizeof(param->name));
++		if (hc->uuid)
++			strncpy(param->uuid, hc->uuid, sizeof(param->uuid)-1);
++		else
++			param->uuid[0] = '\0';
++
++		if (hc->new_map)
++			param->flags |= DM_INACTIVE_PRESENT_FLAG;
++		else
++			param->flags &= ~DM_INACTIVE_PRESENT_FLAG;
++
++		dm_get(md);
++	}
++	up_read(&_hash_lock);
++
++	return md;
++}
++
++static int dev_remove(struct dm_ioctl *param, size_t param_size)
++{
++	struct hash_cell *hc;
++
++	down_write(&_hash_lock);
++	hc = __find_device_hash_cell(param);
++
++	if (!hc) {
++		DMWARN("device doesn't appear to be in the dev hash table.");
++		up_write(&_hash_lock);
++		return -ENXIO;
++	}
++
++	__hash_remove(hc);
++	up_write(&_hash_lock);
++	param->data_size = 0;
++	return 0;
++}
++
++/*
++ * Check a string doesn't overrun the chunk of
++ * memory we copied from userland.
++ */
++static int invalid_str(char *str, void *end)
++{
++	while ((void *) str < end)
++		if (!*str++)
++			return 0;
++
++	return -EINVAL;
++}
++
++static int dev_rename(struct dm_ioctl *param, size_t param_size)
++{
++	int r;
++	char *new_name = (char *) param + param->data_start;
++
++	if (new_name < (char *) (param + 1) ||
++	    invalid_str(new_name, (void *) param + param_size)) {
++		DMWARN("Invalid new logical volume name supplied.");
++		return -EINVAL;
++	}
++
++	r = check_name(new_name);
++	if (r)
++		return r;
++
++	param->data_size = 0;
++	return dm_hash_rename(param->name, new_name);
++}
++
++static int suspend(struct dm_ioctl *param)
++{
++	int r = 0;
++	struct mapped_device *md;
++
++	md = find_device(param);
++	if (!md)
++		return -ENXIO;
++
++	if (!dm_suspended(md))
++		r = dm_suspend(md);
++
++	if (!r)
++		r = __dev_status(md, param);
++
++	dm_put(md);
++	return r;
++}
++
++static int resume(struct dm_ioctl *param)
++{
++	int r = 0;
++	struct hash_cell *hc;
++	struct mapped_device *md;
++	struct dm_table *new_map;
++
++	down_write(&_hash_lock);
++
++	hc = __find_device_hash_cell(param);
++	if (!hc) {
++		DMWARN("device doesn't appear to be in the dev hash table.");
++		up_write(&_hash_lock);
++		return -ENXIO;
++	}
++
++	md = hc->md;
++	dm_get(md);
++
++	new_map = hc->new_map;
++	hc->new_map = NULL;
++	param->flags &= ~DM_INACTIVE_PRESENT_FLAG;
++
++	up_write(&_hash_lock);
++
++	/* Do we need to load a new map ? */
++	if (new_map) {
++		/* Suspend if it isn't already suspended */
++		if (!dm_suspended(md))
++			dm_suspend(md);
++
++		r = dm_swap_table(md, new_map);
++		if (r) {
++			dm_put(md);
++			dm_table_put(new_map);
++			return r;
++		}
++
++		if (dm_table_get_mode(new_map) & FMODE_WRITE)
++			set_disk_ro(dm_disk(md), 0);
++		else
++			set_disk_ro(dm_disk(md), 1);
++
++		dm_table_put(new_map);
++	}
++
++	if (dm_suspended(md))
++		r = dm_resume(md);
++
++	if (!r)
++		r = __dev_status(md, param);
++
++	dm_put(md);
++	return r;
++}
++
++/*
++ * Set or unset the suspension state of a device.
++ * If the device already is in the requested state we just return its status.
++ */
++static int dev_suspend(struct dm_ioctl *param, size_t param_size)
++{
++	if (param->flags & DM_SUSPEND_FLAG)
++		return suspend(param);
++
++	return resume(param);
++}
++
++/*
++ * Copies device info back to user space, used by
++ * the create and info ioctls.
++ */
++static int dev_status(struct dm_ioctl *param, size_t param_size)
++{
++	int r;
++	struct mapped_device *md;
++
++	md = find_device(param);
++	if (!md)
++		return -ENXIO;
++
++	r = __dev_status(md, param);
++	dm_put(md);
++	return r;
++}
++
++/*
++ * Wait for a device to report an event
++ */
++static int dev_wait(struct dm_ioctl *param, size_t param_size)
++{
++	int r;
++	struct mapped_device *md;
++	DECLARE_WAITQUEUE(wq, current);
++
++	md = find_device(param);
++	if (!md)
++		return -ENXIO;
++
++	/*
++	 * Wait for a notification event
++	 */
++	set_current_state(TASK_INTERRUPTIBLE);
++	if (!dm_add_wait_queue(md, &wq, param->event_nr)) {
++		schedule();
++		dm_remove_wait_queue(md, &wq);
++	}
++ 	set_current_state(TASK_RUNNING);
++
++	/*
++	 * The userland program is going to want to know what
++	 * changed to trigger the event, so we may as well tell
++	 * him and save an ioctl.
++	 */
++	r = __dev_status(md, param);
++
++	dm_put(md);
++	return r;
++}
++
++static inline int get_mode(struct dm_ioctl *param)
++{
++	int mode = FMODE_READ | FMODE_WRITE;
++
++	if (param->flags & DM_READONLY_FLAG)
++		mode = FMODE_READ;
++
++	return mode;
++}
++
++static int next_target(struct dm_target_spec *last, uint32_t next, void *end,
++		       struct dm_target_spec **spec, char **target_params)
++{
++	*spec = (struct dm_target_spec *) ((unsigned char *) last + next);
++	*target_params = (char *) (*spec + 1);
++
++	if (*spec < (last + 1))
++		return -EINVAL;
++
++	return invalid_str(*target_params, end);
++}
++
++static int populate_table(struct dm_table *table,
++			  struct dm_ioctl *param, size_t param_size)
++{
++	int r;
++	unsigned int i = 0;
++	struct dm_target_spec *spec = (struct dm_target_spec *) param;
++	uint32_t next = param->data_start;
++	void *end = (void *) param + param_size;
++	char *target_params;
++
++	if (!param->target_count) {
++		DMWARN("populate_table: no targets specified");
++		return -EINVAL;
++	}
++
++	for (i = 0; i < param->target_count; i++) {
++
++		r = next_target(spec, next, end, &spec, &target_params);
++		if (r) {
++			DMWARN("unable to find target");
++			return r;
++		}
++
++		r = dm_table_add_target(table, spec->target_type,
++					(sector_t) spec->sector_start,
++					(sector_t) spec->length,
++					target_params);
++		if (r) {
++			DMWARN("error adding target to table");
++			return r;
++		}
++
++		next = spec->next;
++	}
++
++	return dm_table_complete(table);
++}
++
++static int table_load(struct dm_ioctl *param, size_t param_size)
++{
++	int r;
++	struct hash_cell *hc;
++	struct dm_table *t;
++
++	r = dm_table_create(&t, get_mode(param));
++	if (r)
++		return r;
++
++	r = populate_table(t, param, param_size);
++	if (r) {
++		dm_table_put(t);
++		return r;
++	}
++
++	down_write(&_hash_lock);
++	hc = __find_device_hash_cell(param);
++	if (!hc) {
++		DMWARN("device doesn't appear to be in the dev hash table.");
++		up_write(&_hash_lock);
++		return -ENXIO;
++	}
++
++	hc->new_map = t;
++	param->flags |= DM_INACTIVE_PRESENT_FLAG;
++
++	r = __dev_status(hc->md, param);
++	up_write(&_hash_lock);
++	return r;
++}
++
++static int table_clear(struct dm_ioctl *param, size_t param_size)
++{
++	int r;
++	struct hash_cell *hc;
++
++	down_write(&_hash_lock);
++
++	hc = __find_device_hash_cell(param);
++	if (!hc) {
++		DMWARN("device doesn't appear to be in the dev hash table.");
++		up_write(&_hash_lock);
++		return -ENXIO;
++	}
++
++	if (hc->new_map) {
++		dm_table_put(hc->new_map);
++		hc->new_map = NULL;
++	}
++
++	param->flags &= ~DM_INACTIVE_PRESENT_FLAG;
++
++	r = __dev_status(hc->md, param);
++	up_write(&_hash_lock);
++	return r;
++}
++
++/*
++ * Retrieves a list of devices used by a particular dm device.
++ */
++static void retrieve_deps(struct dm_table *table,
++			  struct dm_ioctl *param, size_t param_size)
++{
++	unsigned int count = 0;
++	struct list_head *tmp;
++	size_t len, needed;
++	struct dm_target_deps *deps;
++
++	deps = get_result_buffer(param, param_size, &len);
++
++	/*
++	 * Count the devices.
++	 */
++	list_for_each(tmp, dm_table_get_devices(table))
++		count++;
++
++	/*
++	 * Check we have enough space.
++	 */
++	needed = sizeof(*deps) + (sizeof(*deps->dev) * count);
++	if (len < needed) {
++		param->flags |= DM_BUFFER_FULL_FLAG;
++		return;
++	}
++
++	/*
++	 * Fill in the devices.
++	 */
++	deps->count = count;
++	count = 0;
++	list_for_each(tmp, dm_table_get_devices(table)) {
++		struct dm_dev *dd = list_entry(tmp, struct dm_dev, list);
++		deps->dev[count++] = dd->bdev->bd_dev;
++	}
++
++	param->data_size = param->data_start + needed;
++}
++
++static int table_deps(struct dm_ioctl *param, size_t param_size)
++{
++	int r = 0;
++	struct mapped_device *md;
++	struct dm_table *table;
++
++	md = find_device(param);
++	if (!md)
++		return -ENXIO;
++
++	r = __dev_status(md, param);
++	if (r)
++		goto out;
++
++	table = dm_get_table(md);
++	if (table) {
++		retrieve_deps(table, param, param_size);
++		dm_table_put(table);
++	}
++
++ out:
++	dm_put(md);
++	return r;
++}
++
++/*
++ * Build up the status struct for each target
++ */
++static void retrieve_status(struct dm_table *table,
++			    struct dm_ioctl *param, size_t param_size)
++{
++	unsigned int i, num_targets;
++	struct dm_target_spec *spec;
++	char *outbuf, *outptr;
++	status_type_t type;
++	size_t remaining, len, used = 0;
++
++	outptr = outbuf = get_result_buffer(param, param_size, &len);
++
++	if (param->flags & DM_STATUS_TABLE_FLAG)
++		type = STATUSTYPE_TABLE;
++	else
++		type = STATUSTYPE_INFO;
++
++	/* Get all the target info */
++	num_targets = dm_table_get_num_targets(table);
++	for (i = 0; i < num_targets; i++) {
++		struct dm_target *ti = dm_table_get_target(table, i);
++
++		remaining = len - (outptr - outbuf);
++		if (remaining < sizeof(struct dm_target_spec)) {
++			param->flags |= DM_BUFFER_FULL_FLAG;
++			break;
++		}
++
++		spec = (struct dm_target_spec *) outptr;
++
++		spec->status = 0;
++		spec->sector_start = ti->begin;
++		spec->length = ti->len;
++		strncpy(spec->target_type, ti->type->name,
++			sizeof(spec->target_type));
++
++		outptr += sizeof(struct dm_target_spec);
++		remaining = len - (outptr - outbuf);
++
++		/* Get the status/table string from the target driver */
++		if (ti->type->status) {
++			if (ti->type->status(ti, type, outptr, remaining)) {
++				param->flags |= DM_BUFFER_FULL_FLAG;
++				break;
++			}
++		} else
++			outptr[0] = '\0';
++
++		outptr += strlen(outptr) + 1;
++		used = param->data_start + (outptr - outbuf);
++
++		align_ptr(outptr);
++		spec->next = outptr - outbuf;
++	}
++
++	if (used)
++		param->data_size = used;
++
++	param->target_count = num_targets;
++}
++
++/*
++ * Return the status of a device as a text string for each
++ * target.
++ */
++static int table_status(struct dm_ioctl *param, size_t param_size)
++{
++	int r;
++	struct mapped_device *md;
++	struct dm_table *table;
++
++	md = find_device(param);
++	if (!md)
++		return -ENXIO;
++
++	r = __dev_status(md, param);
++	if (r)
++		goto out;
++
++	table = dm_get_table(md);
++	if (table) {
++		retrieve_status(table, param, param_size);
++		dm_table_put(table);
++	}
++
++ out:
++	dm_put(md);
++	return r;
++}
++
++/*-----------------------------------------------------------------
++ * Implementation of open/close/ioctl on the special char
++ * device.
++ *---------------------------------------------------------------*/
++static ioctl_fn lookup_ioctl(unsigned int cmd)
++{
++	static struct {
++		int cmd;
++		ioctl_fn fn;
++	} _ioctls[] = {
++		{DM_VERSION_CMD, NULL},	/* version is dealt with elsewhere */
++		{DM_REMOVE_ALL_CMD, remove_all},
++		{DM_LIST_DEVICES_CMD, list_devices},
++
++		{DM_DEV_CREATE_CMD, dev_create},
++		{DM_DEV_REMOVE_CMD, dev_remove},
++		{DM_DEV_RENAME_CMD, dev_rename},
++		{DM_DEV_SUSPEND_CMD, dev_suspend},
++		{DM_DEV_STATUS_CMD, dev_status},
++		{DM_DEV_WAIT_CMD, dev_wait},
++
++		{DM_TABLE_LOAD_CMD, table_load},
++		{DM_TABLE_CLEAR_CMD, table_clear},
++		{DM_TABLE_DEPS_CMD, table_deps},
++		{DM_TABLE_STATUS_CMD, table_status}
++	};
++
++	return (cmd >= ARRAY_SIZE(_ioctls)) ? NULL : _ioctls[cmd].fn;
++}
++
++/*
++ * As well as checking the version compatibility this always
++ * copies the kernel interface version out.
++ */
++static int check_version(unsigned int cmd, struct dm_ioctl *user)
++{
++	uint32_t version[3];
++	int r = 0;
++
++	if (copy_from_user(version, user->version, sizeof(version)))
++		return -EFAULT;
++
++	if ((DM_VERSION_MAJOR != version[0]) ||
++	    (DM_VERSION_MINOR < version[1])) {
++		DMWARN("ioctl interface mismatch: "
++		       "kernel(%u.%u.%u), user(%u.%u.%u), cmd(%d)",
++		       DM_VERSION_MAJOR, DM_VERSION_MINOR,
++		       DM_VERSION_PATCHLEVEL,
++		       version[0], version[1], version[2], cmd);
++		r = -EINVAL;
++	}
++
++	/*
++	 * Fill in the kernel version.
++	 */
++	version[0] = DM_VERSION_MAJOR;
++	version[1] = DM_VERSION_MINOR;
++	version[2] = DM_VERSION_PATCHLEVEL;
++	if (copy_to_user(user->version, version, sizeof(version)))
++		return -EFAULT;
++
++	return r;
++}
++
++static void free_params(struct dm_ioctl *param)
++{
++	vfree(param);
++}
++
++static int copy_params(struct dm_ioctl *user, struct dm_ioctl **param)
++{
++	struct dm_ioctl tmp, *dmi;
++
++	if (copy_from_user(&tmp, user, sizeof(tmp)))
++		return -EFAULT;
++
++	if (tmp.data_size < sizeof(tmp))
++		return -EINVAL;
++
++	dmi = (struct dm_ioctl *) vmalloc(tmp.data_size);
++	if (!dmi)
++		return -ENOMEM;
++
++	if (copy_from_user(dmi, user, tmp.data_size)) {
++		vfree(dmi);
++		return -EFAULT;
++	}
++
++	*param = dmi;
++	return 0;
++}
++
++static int validate_params(uint cmd, struct dm_ioctl *param)
++{
++	/* Always clear this flag */
++	param->flags &= ~DM_BUFFER_FULL_FLAG;
++
++	/* Ignores parameters */
++	if (cmd == DM_REMOVE_ALL_CMD || cmd == DM_LIST_DEVICES_CMD)
++		return 0;
++
++	/* Unless creating, either name or uuid but not both */
++	if (cmd != DM_DEV_CREATE_CMD) {
++		if ((!*param->uuid && !*param->name) ||
++		    (*param->uuid && *param->name)) {
++			DMWARN("one of name or uuid must be supplied, cmd(%u)",
++			       cmd);
++			return -EINVAL;
++		}
++	}
++
++	/* Ensure strings are terminated */
++	param->name[DM_NAME_LEN - 1] = '\0';
++	param->uuid[DM_UUID_LEN - 1] = '\0';
++
++	return 0;
++}
++
++static int ctl_ioctl(struct inode *inode, struct file *file,
++		     uint command, ulong u)
++{
++	int r = 0;
++	unsigned int cmd;
++	struct dm_ioctl *param;
++	struct dm_ioctl *user = (struct dm_ioctl *) u;
++	ioctl_fn fn = NULL;
++	size_t param_size;
++
++	/* only root can play with this */
++	if (!capable(CAP_SYS_ADMIN))
++		return -EACCES;
++
++	if (_IOC_TYPE(command) != DM_IOCTL)
++		return -ENOTTY;
++
++	cmd = _IOC_NR(command);
++
++	/*
++	 * Check the interface version passed in.  This also
++	 * writes out the kernel's interface version.
++	 */
++	r = check_version(cmd, user);
++	if (r)
++		return r;
++
++	/*
++	 * Nothing more to do for the version command.
++	 */
++	if (cmd == DM_VERSION_CMD)
++		return 0;
++
++	fn = lookup_ioctl(cmd);
++	if (!fn) {
++		DMWARN("dm_ctl_ioctl: unknown command 0x%x", command);
++		return -ENOTTY;
++	}
++
++	/*
++	 * Trying to avoid low memory issues when a device is
++	 * suspended.
++	 */
++	current->flags |= PF_MEMALLOC;
++
++	/*
++	 * Copy the parameters into kernel space.
++	 */
++	r = copy_params(user, &param);
++	if (r) {
++		current->flags &= ~PF_MEMALLOC;
++		return r;
++	}
++
++	/*
++	 * FIXME: eventually we will remove the PF_MEMALLOC flag
++	 * here.  However the tools still do nasty things like
++	 * 'load' while a device is suspended.
++	 */
++
++	r = validate_params(cmd, param);
++	if (r)
++		goto out;
++
++	param_size = param->data_size;
++	param->data_size = sizeof(*param);
++	r = fn(param, param_size);
++
++	/*
++	 * Copy the results back to userland.
++	 */
++	if (!r && copy_to_user(user, param, param->data_size))
++		r = -EFAULT;
++
++ out:
++	free_params(param);
++	current->flags &= ~PF_MEMALLOC;
++	return r;
++}
++
++static struct file_operations _ctl_fops = {
++	.ioctl	 = ctl_ioctl,
++	.owner	 = THIS_MODULE,
++};
++
++static struct miscdevice _dm_misc = {
++	.minor 		= MISC_DYNAMIC_MINOR,
++	.name  		= DM_NAME,
++	.devfs_name 	= "mapper/control",
++	.fops  		= &_ctl_fops
++};
++
++/*
++ * Create misc character device and link to DM_DIR/control.
++ */
++int __init dm_interface_init(void)
++{
++	int r;
++
++	r = dm_hash_init();
++	if (r)
++		return r;
++
++	r = misc_register(&_dm_misc);
++	if (r) {
++		DMERR("misc_register failed for control device");
++		dm_hash_exit();
++		return r;
++	}
++
++	DMINFO("%d.%d.%d%s initialised: %s", DM_VERSION_MAJOR,
++	       DM_VERSION_MINOR, DM_VERSION_PATCHLEVEL, DM_VERSION_EXTRA,
++	       DM_DRIVER_EMAIL);
++	return 0;
++}
++
++void dm_interface_exit(void)
++{
++	if (misc_deregister(&_dm_misc) < 0)
++		DMERR("misc_deregister failed for control device");
++
++	dm_hash_exit();
++}
+--- linux-2.6.0-test1/drivers/md/dm-table.c	2003-06-14 12:18:35.000000000 -0700
++++ 25/drivers/md/dm-table.c	2003-07-19 17:03:49.000000000 -0700
+@@ -48,11 +48,9 @@ struct dm_table {
+ 	 */
+ 	struct io_restrictions limits;
+ 
+-	/*
+-	 * A waitqueue for processes waiting for something
+-	 * interesting to happen to this table.
+-	 */
+-	wait_queue_head_t eventq;
++	/* events get handed up using this callback */
++	void (*event_fn)(void *);
++	void *event_context;
+ };
+ 
+ /*
+@@ -222,7 +220,6 @@ int dm_table_create(struct dm_table **re
+ 		return -ENOMEM;
+ 	}
+ 
+-	init_waitqueue_head(&t->eventq);
+ 	t->mode = mode;
+ 	*result = t;
+ 	return 0;
+@@ -243,9 +240,6 @@ void table_destroy(struct dm_table *t)
+ {
+ 	unsigned int i;
+ 
+-	/* destroying the table counts as an event */
+-	dm_table_event(t);
+-
+ 	/* free the indexes (see dm_table_complete) */
+ 	if (t->depth >= 2)
+ 		vfree(t->index[t->depth - 2]);
+@@ -694,9 +688,22 @@ int dm_table_complete(struct dm_table *t
+ 	return r;
+ }
+ 
++static spinlock_t _event_lock = SPIN_LOCK_UNLOCKED;
++void dm_table_event_callback(struct dm_table *t,
++			     void (*fn)(void *), void *context)
++{
++	spin_lock_irq(&_event_lock);
++	t->event_fn = fn;
++	t->event_context = context;
++	spin_unlock_irq(&_event_lock);
++}
++
+ void dm_table_event(struct dm_table *t)
+ {
+-	wake_up_interruptible(&t->eventq);
++	spin_lock(&_event_lock);
++	if (t->event_fn)
++		t->event_fn(t->event_context);
++	spin_unlock(&_event_lock);
+ }
+ 
+ sector_t dm_table_get_size(struct dm_table *t)
+@@ -761,11 +768,6 @@ int dm_table_get_mode(struct dm_table *t
+ 	return t->mode;
+ }
+ 
+-void dm_table_add_wait_queue(struct dm_table *t, wait_queue_t *wq)
+-{
+-	add_wait_queue(&t->eventq, wq);
+-}
+-
+ void dm_table_suspend_targets(struct dm_table *t)
+ {
+ 	int i;
+--- linux-2.6.0-test1/drivers/md/Kconfig	2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/md/Kconfig	2003-07-19 17:03:49.000000000 -0700
+@@ -145,5 +145,12 @@ config BLK_DEV_DM
+ 
+ 	  If unsure, say N.
+ 
++config DM_IOCTL_V4
++	bool "ioctl interface version 4"
++	depends on BLK_DEV_DM
++	---help---
++	  Recent tools use a new version of the ioctl interface, only
++          select this option if you intend using such tools.
++
+ endmenu
+ 
+--- linux-2.6.0-test1/drivers/md/linear.c	2003-06-14 12:18:08.000000000 -0700
++++ 25/drivers/md/linear.c	2003-07-19 17:04:58.000000000 -0700
+@@ -114,6 +114,8 @@ static int linear_run (mddev_t *mddev)
+ 		}
+ 
+ 		disk->rdev = rdev;
++		blk_queue_stack_limits(&mddev->queue,
++				       rdev->bdev->bd_disk->queue);
+ 		disk->size = rdev->size;
+ 		mddev->array_size += rdev->size;
+ 
+--- linux-2.6.0-test1/drivers/md/md.c	2003-06-14 12:18:06.000000000 -0700
++++ 25/drivers/md/md.c	2003-07-19 17:03:49.000000000 -0700
+@@ -52,8 +52,6 @@
+ #define MD_DRIVER
+ #define DEVICE_NR(device) (minor(device))
+ 
+-#include <linux/blk.h>
+-
+ #define DEBUG 0
+ #define dprintk(x...) ((void)(DEBUG && printk(x)))
+ 
+--- linux-2.6.0-test1/drivers/md/multipath.c	2003-06-14 12:18:09.000000000 -0700
++++ 25/drivers/md/multipath.c	2003-07-19 17:04:58.000000000 -0700
+@@ -271,6 +271,8 @@ static int multipath_add_disk(mddev_t *m
+ 	for (path=0; path<mddev->raid_disks; path++) 
+ 		if ((p=conf->multipaths+path)->rdev == NULL) {
+ 			p->rdev = rdev;
++			blk_queue_stack_limits(&mddev->queue,
++					       rdev->bdev->bd_disk->queue);
+ 			conf->working_disks++;
+ 			rdev->raid_disk = path;
+ 			rdev->in_sync = 1;
+@@ -408,6 +410,8 @@ static int multipath_run (mddev_t *mddev
+ 
+ 		disk = conf->multipaths + disk_idx;
+ 		disk->rdev = rdev;
++		blk_queue_stack_limits(&mddev->queue,
++				       rdev->bdev->bd_disk->queue);
+ 		if (!rdev->faulty) 
+ 			conf->working_disks++;
+ 	}
+--- linux-2.6.0-test1/drivers/md/raid0.c	2003-06-14 12:18:22.000000000 -0700
++++ 25/drivers/md/raid0.c	2003-07-19 17:04:58.000000000 -0700
+@@ -113,6 +113,8 @@ static int create_strip_zones (mddev_t *
+ 			goto abort;
+ 		}
+ 		zone->dev[j] = rdev1;
++		blk_queue_stack_limits(&mddev->queue,
++				       rdev1->bdev->bd_disk->queue);
+ 		if (!smallest || (rdev1->size <smallest->size))
+ 			smallest = rdev1;
+ 		cnt++;
+@@ -293,7 +295,6 @@ static int raid0_run (mddev_t *mddev)
+ 		conf->hash_spacing++;
+ 	}
+ 
+-	blk_queue_max_sectors(&mddev->queue, mddev->chunk_size >> 9);
+ 	blk_queue_merge_bvec(&mddev->queue, raid0_mergeable_bvec);
+ 	return 0;
+ 
+--- linux-2.6.0-test1/drivers/md/raid1.c	2003-06-14 12:18:22.000000000 -0700
++++ 25/drivers/md/raid1.c	2003-07-19 17:04:58.000000000 -0700
+@@ -678,6 +678,8 @@ static int raid1_add_disk(mddev_t *mddev
+ 	for (mirror=0; mirror < mddev->raid_disks; mirror++)
+ 		if ( !(p=conf->mirrors+mirror)->rdev) {
+ 			p->rdev = rdev;
++			blk_queue_stack_limits(&mddev->queue,
++					       rdev->bdev->bd_disk->queue);
+ 			p->head_position = 0;
+ 			rdev->raid_disk = mirror;
+ 			found = 1;
+@@ -1076,6 +1078,8 @@ static int run(mddev_t *mddev)
+ 		disk = conf->mirrors + disk_idx;
+ 
+ 		disk->rdev = rdev;
++		blk_queue_stack_limits(&mddev->queue,
++				       rdev->bdev->bd_disk->queue);
+ 		disk->head_position = 0;
+ 		if (!rdev->faulty && rdev->in_sync)
+ 			conf->working_disks++;
+--- linux-2.6.0-test1/drivers/media/common/Makefile	2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/media/common/Makefile	2003-07-19 17:03:49.000000000 -0700
+@@ -1,5 +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  
++saa7146_vv-objs := saa7146_vv_ksyms.o saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o  
+ 
+ obj-$(CONFIG_VIDEO_SAA7146) += saa7146.o saa7146_vv.o
+ 
+--- linux-2.6.0-test1/drivers/media/common/saa7146_core.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/common/saa7146_core.c	2003-07-19 17:03:49.000000000 -0700
+@@ -373,6 +373,9 @@ static int saa7146_init_one(struct pci_d
+ 	dev->module = THIS_MODULE;
+ 	init_waitqueue_head(&dev->i2c_wq);
+ 
++	/* set some default values */
++	saa7146_write(dev, BCS_CTRL, 0x80400040);
++
+ 	if( 0 != ext->probe) {
+ 		if( 0 != ext->probe(dev) ) {
+ 			DEB_D(("ext->probe() failed for %p. skipping device.\n",dev));
+@@ -391,9 +394,6 @@ static int saa7146_init_one(struct pci_d
+ 	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:
+--- linux-2.6.0-test1/drivers/media/common/saa7146_fops.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/common/saa7146_fops.c	2003-07-19 17:03:49.000000000 -0700
+@@ -106,10 +106,21 @@ void saa7146_buffer_next(struct saa7146_
+ 			// fixme: fix this for vflip != 0
+ 
+ 			saa7146_write(dev, PROT_ADDR1, 0);
++			saa7146_write(dev, MC2, (MASK_02|MASK_18));		
++
+ 			/* write the address of the rps-program */
+ 			saa7146_write(dev, RPS_ADDR0, dev->d_rps0.dma_handle);
+ 			/* turn on rps */
+ 			saa7146_write(dev, MC1, (MASK_12 | MASK_28));
++				
++/*
++			printk("vdma%d.base_even:     0x%08x\n", 1,saa7146_read(dev,BASE_EVEN1));
++			printk("vdma%d.base_odd:      0x%08x\n", 1,saa7146_read(dev,BASE_ODD1));
++			printk("vdma%d.prot_addr:     0x%08x\n", 1,saa7146_read(dev,PROT_ADDR1));
++			printk("vdma%d.base_page:     0x%08x\n", 1,saa7146_read(dev,BASE_PAGE1));
++			printk("vdma%d.pitch:         0x%08x\n", 1,saa7146_read(dev,PITCH1));
++			printk("vdma%d.num_line_byte: 0x%08x\n", 1,saa7146_read(dev,NUM_LINE_BYTE1));
++*/
+ 		}
+ 		del_timer(&q->timeout);
+ 	}
+@@ -374,7 +385,7 @@ static struct video_device device_templa
+ 	.minor		= -1,
+ };
+ 
+-int saa7146_vv_init(struct saa7146_dev* dev)
++int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv)
+ {
+ 	struct saa7146_vv *vv = kmalloc (sizeof(struct saa7146_vv),GFP_KERNEL);
+ 	if( NULL == vv ) {
+@@ -385,6 +396,11 @@ int saa7146_vv_init(struct saa7146_dev* 
+ 
+ 	DEB_EE(("dev:%p\n",dev));
+ 	
++	/* save per-device extension data (one extension can
++	   handle different devices that might need different
++	   configuration data) */
++	dev->ext_vv_data = ext_vv;
++	
+ 	vv->video_minor = -1;
+ 	vv->vbi_minor = -1;
+ 
+@@ -475,13 +491,6 @@ static void __exit saa7146_vv_cleanup_mo
+ 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");
+--- linux-2.6.0-test1/drivers/media/common/saa7146_hlp.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/common/saa7146_hlp.c	2003-07-19 17:03:49.000000000 -0700
+@@ -242,7 +242,9 @@ static int calculate_v_scale_registers(s
+ 		if( 2*out_y >= in_y) {
+ 			lpi = 1;
+ 		}
+-	} else if (field == V4L2_FIELD_TOP || field == V4L2_FIELD_BOTTOM) {
++	} else if (field == V4L2_FIELD_TOP
++		|| field == V4L2_FIELD_ALTERNATE
++		|| field == V4L2_FIELD_BOTTOM) {
+ 		if( 4*out_y >= in_y ) {
+ 			lpi = 1;
+ 		}
+@@ -468,9 +470,7 @@ static void calculate_clipping_registers
+ 	*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) {
++	} else {
+ 		*clip_format |= 0x00000000;
+ 	}
+ }
+@@ -593,6 +593,10 @@ static void saa7146_set_position(struct 
+ 	}
+ 	
+ 	if (V4L2_FIELD_HAS_BOTH(field)) {
++	} else if (field == V4L2_FIELD_ALTERNATE) {
++		/* fixme */
++		vdma1.base_odd = vdma1.prot_addr;
++		vdma1.pitch /= 2;
+ 	} else if (field == V4L2_FIELD_TOP) {
+ 		vdma1.base_odd = vdma1.prot_addr;
+ 		vdma1.pitch /= 2;
+@@ -706,7 +710,7 @@ void saa7146_write_out_dma(struct saa714
+ 	/* calculate starting address */
+ 	where  = (which-1)*0x18;
+ 
+-	if( 0 != (dev->ext->ext_vv_data->flags & SAA7146_EXT_SWAP_ODD_EVEN)) {
++	if( 0 != (dev->ext_vv_data->flags & SAA7146_EXT_SWAP_ODD_EVEN)) {
+ 		saa7146_write(dev, where, 	vdma->base_even);
+ 		saa7146_write(dev, where+0x04, 	vdma->base_odd);
+ 	} else {
+@@ -760,6 +764,16 @@ static int calculate_video_dma_grab_pack
+ 	}
+ 
+ 	if (V4L2_FIELD_HAS_BOTH(field)) {
++	} else if (field == V4L2_FIELD_ALTERNATE) {
++		/* fixme */
++		if ( vv->last_field == V4L2_FIELD_TOP ) {
++			vdma1.base_odd	= vdma1.prot_addr;
++			vdma1.pitch /= 2;
++		} else if ( vv->last_field == V4L2_FIELD_BOTTOM ) {
++			vdma1.base_odd	= vdma1.base_even;
++			vdma1.base_even = vdma1.prot_addr;
++			vdma1.pitch /= 2;
++		}
+ 	} else if (field == V4L2_FIELD_TOP) {
+ 		vdma1.base_odd	= vdma1.prot_addr;
+ 		vdma1.pitch /= 2;
+@@ -896,6 +910,14 @@ static int calculate_video_dma_grab_plan
+ 	}
+ 
+ 	if (V4L2_FIELD_HAS_BOTH(field)) {
++	} else if (field == V4L2_FIELD_ALTERNATE) {
++		/* fixme */
++		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_TOP) {
+ 		vdma1.base_odd	= vdma1.prot_addr;
+ 		vdma1.pitch /= 2;
+@@ -935,21 +957,22 @@ static int calculate_video_dma_grab_plan
+ 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;
+ 
+-	if( 0 != (dev->ext->ext_vv_data->flags & SAA7146_EXT_SWAP_ODD_EVEN)) {
++	if( 0 != (dev->ext_vv_data->flags & SAA7146_EXT_SWAP_ODD_EVEN)) {
+ 		unsigned long tmp = e_wait;
+ 		e_wait = o_wait;
+ 		o_wait = tmp;
+ 	}
+ 
+-	/* wait for o_fid_a/b / e_fid_a/b toggle only if bit 0 is not set*/
+-	WRITE_RPS0(CMD_PAUSE | CMD_OAN | CMD_SIG0 | e_wait);
++	/* wait for o_fid_a/b / e_fid_a/b toggle only if rps register 0 is not set*/
+ 	WRITE_RPS0(CMD_PAUSE | CMD_OAN | CMD_SIG0 | o_wait);
++	WRITE_RPS0(CMD_PAUSE | CMD_OAN | CMD_SIG0 | e_wait);
+ 
+-	/* set bit 0 */
++	/* set rps register 0 */
+ 	WRITE_RPS0(CMD_WR_REG | (1 << 8) | (MC2/4)); 	
+ 	WRITE_RPS0(MASK_27 | MASK_11);
+ 	
+@@ -970,8 +993,14 @@ static void program_capture_engine(struc
+ 	}
+ 	
+ 	/* wait for o_fid_a/b / e_fid_a/b toggle */
++	if ( vv->last_field == V4L2_FIELD_INTERLACED ) {
++		WRITE_RPS0(CMD_PAUSE | o_wait);
+ 	WRITE_RPS0(CMD_PAUSE | e_wait);
++	} else if ( vv->last_field == V4L2_FIELD_TOP ) {
+ 	WRITE_RPS0(CMD_PAUSE | o_wait);
++	} else if ( vv->last_field == V4L2_FIELD_BOTTOM ) {
++		WRITE_RPS0(CMD_PAUSE | e_wait);
++	}
+ 
+ 	/* turn off video-dma1 */
+ 	WRITE_RPS0(CMD_WR_REG_MASK | (MC1/4));
+@@ -999,13 +1028,39 @@ static void program_capture_engine(struc
+ 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);
++	struct saa7146_vv *vv = dev->vv_data;
++	u32 vdma1_prot_addr;
+ 
+ 	DEB_CAP(("buf:%p, next:%p\n",buf,next));
+ 
++/*
++	printk("vdma%d.base_even:     0x%08x\n", 1,saa7146_read(dev,BASE_EVEN1));
++	printk("vdma%d.base_odd:      0x%08x\n", 1,saa7146_read(dev,BASE_ODD1));
++	printk("vdma%d.prot_addr:     0x%08x\n", 1,saa7146_read(dev,PROT_ADDR1));
++	printk("vdma%d.base_page:     0x%08x\n", 1,saa7146_read(dev,BASE_PAGE1));
++	printk("vdma%d.pitch:         0x%08x\n", 1,saa7146_read(dev,PITCH1));
++	printk("vdma%d.num_line_byte: 0x%08x\n", 1,saa7146_read(dev,NUM_LINE_BYTE1));
++	printk("vdma%d => vptr      : 0x%08x\n", 1,saa7146_read(dev,PCI_VDP1));
++*/
++
++	vdma1_prot_addr = saa7146_read(dev, PROT_ADDR1);
++	if( 0 == vdma1_prot_addr ) {
++		/* clear out beginning of streaming bit (rps register 0)*/
++		DEB_CAP(("forcing sync to new frame\n"));
++		saa7146_write(dev, MC2, MASK_27 );
++	}
++
+ 	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 ( vv->last_field == V4L2_FIELD_INTERLACED ) {
++	} else if ( vv->last_field == V4L2_FIELD_TOP ) {
++		vv->last_field = V4L2_FIELD_BOTTOM;
++	} else if ( vv->last_field == V4L2_FIELD_BOTTOM ) {
++		vv->last_field = V4L2_FIELD_TOP;
++	}
++
+ 	if( 0 != IS_PLANAR(sfmt->trans)) {
+ 		calculate_video_dma_grab_planar(dev, buf);
+ 		program_capture_engine(dev,1);
+--- linux-2.6.0-test1/drivers/media/common/saa7146_i2c.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/common/saa7146_i2c.c	2003-07-19 17:03:49.000000000 -0700
+@@ -181,9 +181,10 @@ static int saa7146_i2c_reset(struct saa7
+ /* 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)
++static int saa7146_i2c_writeout(struct saa7146_dev *dev, u32* dword, int short_delay)
+ {
+ 	u32 status = 0, mc2 = 0;
++	int trial = 0;
+ 	int timeout;
+ 
+ 	/* write out i2c-command */
+@@ -224,10 +225,13 @@ static int saa7146_i2c_writeout(struct s
+ 		/* wait until we get a transfer done or error */
+ 		timeout = jiffies + HZ/100 + 1; /* 10ms */
+ 		while(1) {
++			/**
++			 *  first read usually delivers bogus results...
++			 */
++			saa7146_i2c_status(dev);
+ 			status = saa7146_i2c_status(dev);
+-			if( (0x3 == (status & 0x3)) || (0 == (status & 0x1)) ) {
++			if ((status & 0x3) != 1)
+ 				break;
+-			}
+ 			if (jiffies > timeout) {
+ 				/* this is normal when probing the bus
+ 				 * (no answer from nonexisistant device...)
+@@ -235,6 +239,9 @@ static int saa7146_i2c_writeout(struct s
+ 				DEB_I2C(("saa7146_i2c_writeout: timed out waiting for end of xfer\n"));
+ 				return -EIO;
+ 			}
++			if ((++trial < 20) && short_delay)
++				udelay(10);
++			else
+ 			my_wait(dev,1);
+ 		}
+ 	}
+@@ -277,6 +284,7 @@ int saa7146_i2c_transfer(struct saa7146_
+ 	u32* buffer = dev->d_i2c.cpu_addr;
+ 	int err = 0;
+         int address_err = 0;
++        int short_delay = 0;
+ 	
+ 	if (down_interruptible (&dev->i2c_lock))
+ 		return -ERESTARTSYS;
+@@ -292,6 +300,8 @@ int saa7146_i2c_transfer(struct saa7146_
+ 		goto out;
+ 	}
+ 
++        if (count > 3) short_delay = 1;
++  
+ 	do {
+ 		/* reset the i2c-device if necessary */
+ 		err = saa7146_i2c_reset(dev);
+@@ -302,7 +312,7 @@ int saa7146_i2c_transfer(struct saa7146_
+ 
+ 		/* write out the u32s one after another */
+ 		for(i = 0; i < count; i++) {
+-			err = saa7146_i2c_writeout(dev, &buffer[i] );
++			err = saa7146_i2c_writeout(dev, &buffer[i], short_delay);
+ 			if ( 0 != err) {
+ 				/* this one is unsatisfying: some i2c slaves on some
+ 				   dvb cards don't acknowledge correctly, so the saa7146
+@@ -357,7 +367,7 @@ out:
+ 	if( 0 == dev->revision ) {
+ 		u32 zero = 0;
+ 		saa7146_i2c_reset(dev);
+-		if( 0 != saa7146_i2c_writeout(dev, &zero)) {
++		if( 0 != saa7146_i2c_writeout(dev, &zero, short_delay)) {
+ 			INFO(("revision 0 error. this should never happen.\n"));
+ 		}
+ 	}
+@@ -397,8 +407,13 @@ int saa7146_i2c_adapter_prepare(struct s
+ 
+ 	if( NULL != i2c_adapter ) {
+ 		memset(i2c_adapter,0,sizeof(struct i2c_adapter));
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
++		strcpy(i2c_adapter->name, dev->name);	
++		i2c_adapter->data = dev;
++#else
+ 		strcpy(i2c_adapter->dev.name, dev->name);	
+ 		i2c_set_adapdata(i2c_adapter,dev);
++#endif
+ 		i2c_adapter->algo	   = &saa7146_algo;
+ 		i2c_adapter->algo_data     = NULL;
+ 		i2c_adapter->id 	   = I2C_ALGO_SAA7146;
+--- linux-2.6.0-test1/drivers/media/common/saa7146_vbi.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/common/saa7146_vbi.c	2003-07-19 17:03:49.000000000 -0700
+@@ -9,6 +9,7 @@ static int vbi_workaround(struct saa7146
+         u32          *cpu;
+         dma_addr_t   dma_addr;
+ 	
++	int count = 0;
+ 	int i;
+ 
+ 	DECLARE_WAITQUEUE(wait, current);
+@@ -443,5 +444,3 @@ struct saa7146_use_ops saa7146_vbi_uops 
+ 	.irq_done	= vbi_irq_done,
+ 	.read 		= vbi_read,
+ };
+-
+-EXPORT_SYMBOL_GPL(saa7146_vbi_uops);
+--- linux-2.6.0-test1/drivers/media/common/saa7146_video.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/common/saa7146_video.c	2003-07-19 17:03:49.000000000 -0700
+@@ -137,6 +137,7 @@ static int try_win(struct saa7146_dev *d
+         switch (field) {
+         case V4L2_FIELD_TOP:
+         case V4L2_FIELD_BOTTOM:
++        case V4L2_FIELD_ALTERNATE:
+                 maxh = maxh / 2;
+                 break;
+         case V4L2_FIELD_INTERLACED:
+@@ -186,11 +187,18 @@ static int try_fmt(struct saa7146_fh *fh
+ 				: V4L2_FIELD_BOTTOM;
+ 		}
+ 		switch (field) {
++		case V4L2_FIELD_ALTERNATE: {
++			vv->last_field = V4L2_FIELD_TOP;
++			maxh = maxh / 2;
++			break;
++		}
+ 		case V4L2_FIELD_TOP:
+ 		case V4L2_FIELD_BOTTOM:
++			vv->last_field = V4L2_FIELD_INTERLACED;
+ 			maxh = maxh / 2;
+ 			break;
+ 		case V4L2_FIELD_INTERLACED:
++			vv->last_field = V4L2_FIELD_INTERLACED;
+ 			break;
+ 		default: {
+ 			DEB_D(("no known field mode '%d'.\n",field));
+@@ -220,7 +228,7 @@ static int try_fmt(struct saa7146_fh *fh
+ 	}
+ }
+ 
+-static int start_preview(struct saa7146_fh *fh)
++int saa7146_start_preview(struct saa7146_fh *fh)
+ {
+ 	struct saa7146_dev *dev = fh->dev;
+ 	struct saa7146_vv *vv = dev->vv_data;
+@@ -266,12 +274,12 @@ static int start_preview(struct saa7146_
+ 	return 0;
+ }
+ 
+-static int stop_preview(struct saa7146_fh *fh)
++int saa7146_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"));
++	DEB_EE(("saa7146.o: saa7146_stop_preview()\n"));
+ 
+ 	/* check if overlay is running */
+ 	if( 0 == vv->ov_data ) {
+@@ -333,8 +341,8 @@ static int s_fmt(struct saa7146_fh *fh, 
+ 		if( vv->ov_data != NULL ) {
+ 			if( fh == vv->ov_data->fh) {
+ 				spin_lock_irqsave(&dev->slock,flags);
+-				stop_preview(fh);
+-				start_preview(fh);
++				saa7146_stop_preview(fh);
++				saa7146_start_preview(fh);
+ 				spin_unlock_irqrestore(&dev->slock,flags);
+ 			}
+ 		}
+@@ -522,8 +530,8 @@ static int set_control(struct saa7146_fh
+ 		if( 0 != vv->ov_data ) {
+ 			if( fh == vv->ov_data->fh ) {
+ 				spin_lock_irqsave(&dev->slock,flags);
+-				stop_preview(fh);
+-				start_preview(fh);
++				saa7146_stop_preview(fh);
++				saa7146_start_preview(fh);
+ 				spin_unlock_irqrestore(&dev->slock,flags);
+ 			}
+ 		}
+@@ -561,7 +569,7 @@ static int saa7146_pgtable_build(struct 
+ 				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);
++				DEB_CAP(("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n",size,m1,m2,m3,o1,o2));
+ 				break;
+ 			}
+ 			case 16: {
+@@ -571,7 +579,7 @@ static int saa7146_pgtable_build(struct 
+ 				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);
++				DEB_CAP(("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n",size,m1,m2,m3,o1,o2));
+ 				break;
+ 			}
+ 			default: {
+@@ -674,7 +682,7 @@ static int video_begin(struct saa7146_fh
+ 
+ 	spin_lock_irqsave(&dev->slock,flags);
+ 
+-	/* clear out beginning of streaming bit */
++	/* clear out beginning of streaming bit (rps register 0)*/
+ 	saa7146_write(dev, MC2, MASK_27 );
+ 
+ 	/* enable rps0 irqs */
+@@ -740,19 +748,19 @@ int saa7146_video_do_ioctl(struct inode 
+ 	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 )
++	for(ee = 0; dev->ext_vv_data->ioctls[ee].flags != 0; ee++) {
++		if( cmd == dev->ext_vv_data->ioctls[ee].cmd )
+ 			break;
+ 	}
+ 	
+-	if( 0 != (dev->ext->ext_vv_data->ioctls[ee].flags & SAA7146_EXCLUSIVE) ) {
++	if( 0 != (dev->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);
++		result = dev->ext_vv_data->ioctl(fh, cmd, arg);
+ 		return result;
+ 	}
+-	if( 0 != (dev->ext->ext_vv_data->ioctls[ee].flags & SAA7146_BEFORE) ) {
++	if( 0 != (dev->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);
++		result = dev->ext_vv_data->ioctl(fh, cmd, arg);
+ 		if( -EAGAIN != result ) {
+ 			return result;
+ 		}
+@@ -793,7 +801,7 @@ int saa7146_video_do_ioctl(struct inode 
+ 			V4L2_CAP_VIDEO_OVERLAY |
+ 			V4L2_CAP_READWRITE | 
+ 			V4L2_CAP_STREAMING;
+-		cap->capabilities |= dev->ext->ext_vv_data->capabilities;
++		cap->capabilities |= dev->ext_vv_data->capabilities;
+ 		return 0;
+ 	}
+ 	case VIDIOC_G_FBUF:
+@@ -942,9 +950,10 @@ int saa7146_video_do_ioctl(struct inode 
+ 		struct v4l2_standard *e = arg;
+ 		if (e->index < 0 )
+ 			return -EINVAL;
+-		if( e->index < dev->ext->ext_vv_data->num_stds ) {
++		if( e->index < dev->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);
++			v4l2_video_std_construct(e, dev->ext_vv_data->stds[e->index].id, dev->ext_vv_data->stds[e->index].name);
++			return 0;
+ 		}
+ 		return -EINVAL;
+ 	}
+@@ -968,22 +977,22 @@ int saa7146_video_do_ioctl(struct inode 
+ 
+ 		if( vv->ov_data != NULL ) {
+ 			ov_fh = vv->ov_data->fh;
+-			stop_preview(ov_fh);
++			saa7146_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)
++		for(i = 0; i < dev->ext_vv_data->num_stds; i++)
++			if (*id & dev->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);
++		if (i != dev->ext_vv_data->num_stds) {
++			vv->standard = &dev->ext_vv_data->stds[i];
++			if( NULL != dev->ext_vv_data->std_callback )
++				dev->ext_vv_data->std_callback(dev, vv->standard);
+ 			found = 1;
+ 		}
+ 
+ 		if( 0 != restart_overlay ) {
+-			start_preview(ov_fh);
++			saa7146_start_preview(ov_fh);
+ 		}
+ 		up(&dev->lock);
+ 
+@@ -1000,7 +1009,7 @@ int saa7146_video_do_ioctl(struct inode 
+ 		int on = *(int *)arg;
+ 		int err = 0;
+ 
+-		if( NULL == vv->ov_fmt ) {
++		if( NULL == vv->ov_fmt && on != 0 ) {
+ 			DEB_D(("VIDIOC_OVERLAY: no framebuffer informations. call S_FBUF first!\n"));
+ 			return -EAGAIN;
+ 		}
+@@ -1013,7 +1022,7 @@ int saa7146_video_do_ioctl(struct inode 
+ 				}
+ 			}
+ 			spin_lock_irqsave(&dev->slock,flags);
+-			err = start_preview(fh);
++			err = saa7146_start_preview(fh);
+ 			spin_unlock_irqrestore(&dev->slock,flags);
+ 		} else {
+ 			if( vv->ov_data != NULL ) {
+@@ -1022,7 +1031,7 @@ int saa7146_video_do_ioctl(struct inode 
+ 				}
+ 			}
+ 			spin_lock_irqsave(&dev->slock,flags);
+-			err = stop_preview(fh);
++			err = saa7146_stop_preview(fh);
+ 			spin_unlock_irqrestore(&dev->slock,flags);
+ 		}
+ 		return err;
+@@ -1036,12 +1045,18 @@ int saa7146_video_do_ioctl(struct inode 
+ 		return videobuf_querybuf(q,arg);
+ 	}
+ 	case VIDIOC_QBUF: {
+-		DEB_D(("VIDIOC_QBUF \n"));
+-		return videobuf_qbuf(file,q,arg);
++		struct v4l2_buffer *b = arg;
++		int ret = 0;
++		ret = videobuf_qbuf(file,q,b);
++		DEB_D(("VIDIOC_QBUF: ret:%d, index:%d\n",ret,b->index));
++		return ret;
+ 	}
+ 	case VIDIOC_DQBUF: {
+-		DEB_D(("VIDIOC_DQBUF \n"));
+-		return videobuf_dqbuf(file,q,arg);
++		struct v4l2_buffer *b = arg;
++		int ret = 0;
++		ret = videobuf_dqbuf(file,q,b);
++		DEB_D(("VIDIOC_DQBUF: ret:%d, index:%d\n",ret,b->index));
++		return ret;
+ 	}
+ 	case VIDIOC_STREAMON: {
+ 		DEB_D(("VIDIOC_STREAMON \n"));
+@@ -1075,7 +1090,7 @@ int saa7146_video_do_ioctl(struct inode 
+ 
+ 		q = &fh->video_q;
+ 		down(&q->lock);
+-		err = videobuf_mmap_setup(file,q,gbuffers,gbufsize);
++		err = videobuf_mmap_setup(file,q,gbuffers,gbufsize); // ,V4L2_MEMORY_MMAP);
+ 		if (err < 0) {
+ 			up(&q->lock);
+ 			return err;
+@@ -1250,7 +1265,7 @@ static void video_init(struct saa7146_de
+ 	vv->video_q.dev              = dev;
+ 
+ 	/* set some default values */
+-	vv->standard = &dev->ext->ext_vv_data->stds[0];
++	vv->standard = &dev->ext_vv_data->stds[0];
+ 
+ 	/* FIXME: what's this? */
+ 	vv->current_hps_source = SAA7146_HPS_SOURCE_PORT_A;
+@@ -1287,7 +1302,7 @@ static void video_close(struct saa7146_d
+ 	if( 0 != vv->ov_data ) {
+ 		if( fh == vv->ov_data->fh ) {
+ 			spin_lock_irqsave(&dev->slock,flags);
+-			stop_preview(fh);
++			saa7146_stop_preview(fh);
+ 			spin_unlock_irqrestore(&dev->slock,flags);
+ 		}
+ 	}
+@@ -1331,7 +1346,7 @@ static ssize_t video_read(struct file *f
+ 
+ 	if( vv->ov_data != NULL ) {
+ 		ov_fh = vv->ov_data->fh;
+-		stop_preview(ov_fh);
++		saa7146_stop_preview(ov_fh);
+ 		restart_overlay = 1;
+ 	}
+ 
+@@ -1343,7 +1358,7 @@ static ssize_t video_read(struct file *f
+ 
+ 	/* restart overlay if it was active before */
+ 	if( 0 != restart_overlay ) {
+-		start_preview(ov_fh);
++		saa7146_start_preview(ov_fh);
+ 	}
+ 	
+ 	return ret;
+@@ -1358,5 +1373,3 @@ struct saa7146_use_ops saa7146_video_uop
+ 	.capture_begin = video_begin,
+ 	.capture_end = video_end,
+ };
+-
+-EXPORT_SYMBOL_GPL(saa7146_video_uops);
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/common/saa7146_vv_ksyms.c	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,15 @@
++#include <linux/module.h>
++#include <media/saa7146_vv.h>
++
++EXPORT_SYMBOL_GPL(saa7146_vbi_uops);
++EXPORT_SYMBOL_GPL(saa7146_video_uops);
++
++EXPORT_SYMBOL_GPL(saa7146_start_preview);
++EXPORT_SYMBOL_GPL(saa7146_stop_preview);
++
++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);
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/b2c2/Kconfig	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,8 @@
++config DVB_B2C2_SKYSTAR
++	tristate "Technisat Skystar2 PCI"
++	depends on DVB_CORE
++	help
++	  Support for the Skystar2 PCI DVB card by Technisat, which
++	  is equipped with the FlexCopII chipset by B2C2.
++
++	  Say Y if you own such a device and want to use it.
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/b2c2/Makefile	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,3 @@
++obj-$(CONFIG_DVB_B2C2_SKYSTAR) += skystar2.o
++
++EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/b2c2/skystar2.c	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,2506 @@
++/*
++ * skystar2.c - driver for the Technisat SkyStar2 PCI DVB card
++ *              based on the FlexCopII by B2C2,Inc.
++ *
++ * Copyright (C) 2003  V.C. , skystar@moldova.cc
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public License
++ * as published by the Free Software Foundation; either version 2.1
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
++ */
++#include <linux/module.h>
++#include <linux/delay.h>
++#include <linux/pci.h>
++
++#include "dvb_i2c.h"
++#include "dvb_frontend.h"
++#include "dvb_functions.h"
++
++#include <linux/dvb/frontend.h>
++#include <linux/dvb/dmx.h>
++#include "dvb_demux.h"
++#include "dmxdev.h"
++#include "dvb_filter.h"
++#include "dvbdev.h"
++#include "demux.h"
++#include "dvb_net.h"
++
++static int debug = 0;
++#define dprintk(x...) do { if (debug) printk(x); } while (0)
++
++#define SizeOfBufDMA1	0x3AC00
++#define SizeOfBufDMA2	0x758
++
++struct dmaq {
++
++	u32 bus_addr;
++	u32 head;
++	u32 tail;
++	u32 buffer_size;
++	u8 *buffer;
++};
++
++struct packet_header {
++
++	u32 sync_byte;
++	u32 transport_error_indicator;
++	u32 payload_unit_start_indicator;
++	u32 transport_priority;
++	u32 pid;
++	u32 transport_scrambling_control;
++	u32 adaptation_field_control;
++	u32 continuity_counter;
++};
++
++struct adapter {
++
++	struct pci_dev *pdev;
++
++	u8 card_revision;
++	u32 b2c2_revision;
++	u32 PidFilterMax;
++	u32 MacFilterMax;
++	u32 irq;
++	u32 io_mem;
++	u32 io_port;
++	u8 mac_addr[8];
++	u32 dwSramType;
++
++	struct dvb_adapter *dvb_adapter;
++	struct dvb_demux demux;
++	struct dmxdev dmxdev;
++	struct dmx_frontend hw_frontend;
++	struct dmx_frontend mem_frontend;
++	struct dvb_i2c_bus *i2c_bus;
++	struct dvb_net dvbnet;
++
++	struct semaphore i2c_sem;
++
++	struct dmaq dmaq1;
++	struct dmaq dmaq2;
++
++	u32 dma_ctrl;
++	u32 dma_status;
++
++	u32 capturing;
++
++	spinlock_t lock;
++
++	u16 pids[0x27];
++	u32 mac_filter;
++};
++
++#define WriteRegDW(adapter,reg,value) writel(value, adapter->io_mem + reg)
++#define ReadRegDW(adapter,reg) readl(adapter->io_mem + reg)
++
++static void WriteRegOp(struct adapter *adapter, u32 reg, u32 operation, u32 andvalue, u32 orvalue)
++{
++	u32 tmp;
++
++	tmp = ReadRegDW(adapter, reg);
++
++	if (operation == 1)
++		tmp = tmp | orvalue;
++	if (operation == 2)
++		tmp = tmp & andvalue;
++	if (operation == 3)
++		tmp = (tmp & andvalue) | orvalue;
++
++	WriteRegDW(adapter, reg, tmp);
++}
++
++/* i2c functions */
++static int i2cMainWriteForFlex2(struct adapter * adapter, u32 command, u8 * buf, u32 retries)
++{
++	u32 i;
++	u32 value;
++
++	WriteRegDW(adapter, 0x100, 0);
++	WriteRegDW(adapter, 0x100, command);
++
++	for (i = 0; i < retries; i++) {
++		value = ReadRegDW(adapter, 0x100);
++
++		if ((value & 0x40000000) == 0) {
++			if ((value & 0x81000000) == 0x80000000) {
++				if (buf != 0)
++					*buf = (value >> 0x10) & 0xff;
++
++				return 1;
++			}
++
++		} else {
++
++			WriteRegDW(adapter, 0x100, 0);
++			WriteRegDW(adapter, 0x100, command);
++		}
++	}
++
++	return 0;
++}
++
++/* device = 0x10000000 for tuner, 0x20000000 for eeprom */
++static void i2cMainSetup(u32 device, u32 chip_addr, u8 op, u8 addr, u32 value, u32 len, u32 *command)
++{
++	*command = device | ((len - 1) << 26) | (value << 16) | (addr << 8) | chip_addr;
++
++	if (op != 0)
++		*command = *command | 0x03000000;
++	else
++		*command = *command | 0x01000000;
++}
++
++static int FlexI2cRead4(struct adapter * adapter, u32 device, u32 chip_addr, u16 addr, u8 * buf, u8 len)
++{
++	u32 command;
++	u32 value;
++
++	int result, i;
++
++	i2cMainSetup(device, chip_addr, 1, addr, 0, len, &command);
++
++	result = i2cMainWriteForFlex2(adapter, command, buf, 100000);
++
++	if ((result & 0xff) != 0) {
++		if (len > 1) {
++			value = ReadRegDW(adapter, 0x104);
++
++			for (i = 1; i < len; i++) {
++				buf[i] = value & 0xff;
++				value = value >> 8;
++			}
++		}
++	}
++
++	return result;
++}
++
++static int FlexI2cWrite4(struct adapter * adapter, u32 device, u32 chip_addr, u32 addr, u8 * buf, u8 len)
++{
++	u32 command;
++	u32 value;
++	int i;
++
++	if (len > 1) {
++		value = 0;
++
++		for (i = len; i > 1; i--) {
++			value = value << 8;
++			value = value | buf[i - 1];
++		}
++
++		WriteRegDW(adapter, 0x104, value);
++	}
++
++	i2cMainSetup(device, chip_addr, 0, addr, buf[0], len, &command);
++
++	return i2cMainWriteForFlex2(adapter, command, 0, 100000);
++}
++
++static void fixchipaddr(u32 device, u32 bus, u32 addr, u32 *ret)
++{
++	if (device == 0x20000000)
++		*ret = bus | ((addr >> 8) & 3);
++
++	*ret = bus;
++}
++
++static u32 FLEXI2C_read(struct adapter * adapter, u32 device, u32 bus, u32 addr, u8 * buf, u32 len)
++{
++	u32 chipaddr;
++	u32 bytes_to_transfer;
++	u8 *start;
++
++//  dprintk("%s:\n", __FUNCTION__);
++
++	start = buf;
++
++	while (len != 0) {
++		bytes_to_transfer = len;
++
++		if (bytes_to_transfer > 4)
++			bytes_to_transfer = 4;
++
++		fixchipaddr(device, bus, addr, &chipaddr);
++
++		if (FlexI2cRead4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
++			return buf - start;
++
++		buf = buf + bytes_to_transfer;
++		addr = addr + bytes_to_transfer;
++		len = len - bytes_to_transfer;
++	};
++
++	return buf - start;
++}
++
++static u32 FLEXI2C_write(struct adapter * adapter, u32 device, u32 bus, u32 addr, u8 * buf, u32 len)
++{
++	u32 chipaddr;
++	u32 bytes_to_transfer;
++	u8 *start;
++
++//  dprintk("%s:\n", __FUNCTION__);
++
++	start = buf;
++
++	while (len != 0) {
++		bytes_to_transfer = len;
++
++		if (bytes_to_transfer > 4)
++			bytes_to_transfer = 4;
++
++		fixchipaddr(device, bus, addr, &chipaddr);
++
++		if (FlexI2cWrite4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
++			return buf - start;
++
++		buf = buf + bytes_to_transfer;
++		addr = addr + bytes_to_transfer;
++		len = len - bytes_to_transfer;
++	}
++
++	return buf - start;
++}
++
++static int master_xfer(struct dvb_i2c_bus *i2c, const struct i2c_msg *msgs, int num)
++{
++	struct adapter *tmp = i2c->data;
++	int i, ret = 0;
++
++	if (down_interruptible(&tmp->i2c_sem))
++		return -ERESTARTSYS;
++
++	if (0) {
++		dprintk("%s:\n", __FUNCTION__);
++
++		for (i = 0; i < num; i++) {
++			printk("message %d: flags=%x, addr=0x%04x, buf=%x, len=%d \n", i, msgs[i].flags, msgs[i].addr, (u32) msgs[i].buf, msgs[i].len);
++		}
++	}
++	
++	/* allow only the vp310 frontend to access the bus */
++	if ((msgs[0].addr != 0x0E) && (msgs[0].addr != 0x61)) {
++		up(&tmp->i2c_sem);
++
++		return -EREMOTEIO;
++	}
++
++	if ((num == 1) && (msgs[0].buf != NULL)) {
++		if (msgs[0].flags == I2C_M_RD) {
++			ret = -EINVAL;
++
++		} else {
++
++			// single writes do have the reg addr in buf[0] and data in buf[1] to buf[n]
++			ret = FLEXI2C_write(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], &msgs[0].buf[1], msgs[0].len - 1);
++
++			if (ret != msgs[0].len - 1)
++				ret = -EREMOTEIO;
++			else
++				ret = num;
++		}
++
++	} else if ((num == 2) && (msgs[1].buf != NULL)) {
++
++		// i2c reads consist of a reg addr _write_ followed by a data read, so msg[1].flags has to be examined
++		if (msgs[1].flags == I2C_M_RD) {
++			ret = FLEXI2C_read(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
++
++		} else {
++
++			ret = FLEXI2C_write(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
++		}
++
++		if (ret != msgs[1].len)
++			ret = -EREMOTEIO;
++		else
++			ret = num;
++	}
++
++	up(&tmp->i2c_sem);
++
++	/* master xfer functions always return the number of successfully
++	   transmitted messages, not the number of transmitted bytes.
++	   return -EREMOTEIO in case of failure. */
++	return ret;
++}
++
++/* SRAM (Skystar2 rev2.3 has one "ISSI IS61LV256" chip on board,
++   but it seems that FlexCopII can work with more than one chip) */
++static void SRAMSetNetDest(struct adapter * adapter, u8 dest)
++{
++	u32 tmp;
++
++	udelay(1000);
++
++	tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFFC) | (dest & 3);
++
++	udelay(1000);
++
++	WriteRegDW(adapter, 0x714, tmp);
++	WriteRegDW(adapter, 0x714, tmp);
++
++	udelay(1000);
++
++	/* return value is never used? */
++/*	return tmp; */
++}
++
++static void SRAMSetCaiDest(struct adapter * adapter, u8 dest)
++{
++	u32 tmp;
++
++	udelay(1000);
++
++	tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFF3) | ((dest & 3) << 2);
++
++	udelay(1000);
++	udelay(1000);
++
++	WriteRegDW(adapter, 0x714, tmp);
++	WriteRegDW(adapter, 0x714, tmp);
++
++	udelay(1000);
++
++	/* return value is never used? */
++/*	return tmp; */
++}
++
++static void SRAMSetCaoDest(struct adapter * adapter, u8 dest)
++{
++	u32 tmp;
++
++	udelay(1000);
++
++	tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFCF) | ((dest & 3) << 4);
++
++	udelay(1000);
++	udelay(1000);
++
++	WriteRegDW(adapter, 0x714, tmp);
++	WriteRegDW(adapter, 0x714, tmp);
++
++	udelay(1000);
++
++	/* return value is never used? */
++/*	return tmp; */
++}
++
++static void SRAMSetMediaDest(struct adapter * adapter, u8 dest)
++{
++	u32 tmp;
++
++	udelay(1000);
++
++	tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFF3F) | ((dest & 3) << 6);
++
++	udelay(1000);
++	udelay(1000);
++
++	WriteRegDW(adapter, 0x714, tmp);
++	WriteRegDW(adapter, 0x714, tmp);
++
++	udelay(1000);
++
++	/* return value is never used? */
++/*	return tmp; */
++}
++
++/* SRAM memory is accessed through a buffer register in the FlexCop
++   chip (0x700). This register has the following structure:
++    bits 0-14  : address
++    bit  15    : read/write flag
++    bits 16-23 : 8-bit word to write
++    bits 24-27 : = 4
++    bits 28-29 : memory bank selector
++    bit  31    : busy flag
++*/
++static void FlexSramWrite(struct adapter *adapter, u32 bank, u32 addr, u8 * buf, u32 len)
++{
++	u32 i, command, retries;
++
++	for (i = 0; i < len; i++) {
++		command = bank | addr | 0x04000000 | (*buf << 0x10);
++
++		retries = 2;
++
++		while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
++			mdelay(1);
++			retries--;
++		};
++
++		if (retries == 0)
++			printk("%s: SRAM timeout\n", __FUNCTION__);
++
++		WriteRegDW(adapter, 0x700, command);
++
++		buf++;
++		addr++;
++	}
++}
++
++static void FlexSramRead(struct adapter *adapter, u32 bank, u32 addr, u8 * buf, u32 len)
++{
++	u32 i, command, value, retries;
++
++	for (i = 0; i < len; i++) {
++		command = bank | addr | 0x04008000;
++
++		retries = 10000;
++
++		while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
++			mdelay(1);
++			retries--;
++		};
++
++		if (retries == 0)
++			printk("%s: SRAM timeout\n", __FUNCTION__);
++
++		WriteRegDW(adapter, 0x700, command);
++
++		retries = 10000;
++
++		while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
++			mdelay(1);
++			retries--;
++		};
++
++		if (retries == 0)
++			printk("%s: SRAM timeout\n", __FUNCTION__);
++
++		value = ReadRegDW(adapter, 0x700) >> 0x10;
++
++		*buf = (value & 0xff);
++
++		addr++;
++		buf++;
++	}
++}
++
++static void SRAM_writeChunk(struct adapter *adapter, u32 addr, u8 * buf, u16 len)
++{
++	u32 bank;
++
++	bank = 0;
++
++	if (adapter->dwSramType == 0x20000) {
++		bank = (addr & 0x18000) << 0x0D;
++	}
++
++	if (adapter->dwSramType == 0x00000) {
++		if ((addr >> 0x0F) == 0)
++			bank = 0x20000000;
++		else
++			bank = 0x10000000;
++	}
++
++	FlexSramWrite(adapter, bank, addr & 0x7FFF, buf, len);
++}
++
++static void SRAM_readChunk(struct adapter *adapter, u32 addr, u8 * buf, u16 len)
++{
++	u32 bank;
++
++	bank = 0;
++
++	if (adapter->dwSramType == 0x20000) {
++		bank = (addr & 0x18000) << 0x0D;
++	}
++
++	if (adapter->dwSramType == 0x00000) {
++		if ((addr >> 0x0F) == 0)
++			bank = 0x20000000;
++		else
++			bank = 0x10000000;
++	}
++
++	FlexSramRead(adapter, bank, addr & 0x7FFF, buf, len);
++}
++
++static void SRAM_read(struct adapter *adapter, u32 addr, u8 * buf, u32 len)
++{
++	u32 length;
++
++	while (len != 0) {
++		length = len;
++
++		// check if the address range belongs to the same 
++		// 32K memory chip. If not, the data is read from 
++		// one chip at a time.
++		if ((addr >> 0x0F) != ((addr + len - 1) >> 0x0F)) {
++			length = (((addr >> 0x0F) + 1) << 0x0F) - addr;
++		}
++
++		SRAM_readChunk(adapter, addr, buf, length);
++
++		addr = addr + length;
++		buf = buf + length;
++		len = len - length;
++	}
++}
++
++static void SRAM_write(struct adapter *adapter, u32 addr, u8 * buf, u32 len)
++{
++	u32 length;
++
++	while (len != 0) {
++		length = len;
++
++		// check if the address range belongs to the same 
++		// 32K memory chip. If not, the data is written to
++		// one chip at a time.
++		if ((addr >> 0x0F) != ((addr + len - 1) >> 0x0F)) {
++			length = (((addr >> 0x0F) + 1) << 0x0F) - addr;
++		}
++
++		SRAM_writeChunk(adapter, addr, buf, length);
++
++		addr = addr + length;
++		buf = buf + length;
++		len = len - length;
++	}
++}
++
++static void SRAM_setSize(struct adapter *adapter, u32 mask)
++{
++	WriteRegDW(adapter, 0x71C, (mask | (~0x30000 & ReadRegDW(adapter, 0x71C))));
++}
++
++static void SRAM_init(struct adapter *adapter)
++{
++	u32 tmp;
++
++	tmp = ReadRegDW(adapter, 0x71C);
++
++	WriteRegDW(adapter, 0x71C, 1);
++
++	if (ReadRegDW(adapter, 0x71C) != 0) {
++		WriteRegDW(adapter, 0x71C, tmp);
++
++		adapter->dwSramType = tmp & 0x30000;
++
++		dprintk("%s: dwSramType = %x\n", __FUNCTION__, adapter->dwSramType);
++
++	} else {
++
++		adapter->dwSramType = 0x10000;
++
++		dprintk("%s: dwSramType = %x\n", __FUNCTION__, adapter->dwSramType);
++	}
++
++	/* return value is never used? */
++/*	return adapter->dwSramType; */
++}
++
++static int SRAM_testLocation(struct adapter *adapter, u32 mask, u32 addr)
++{
++	u8 tmp1, tmp2;
++
++	dprintk("%s: mask = %x, addr = %x\n", __FUNCTION__, mask, addr);
++
++	SRAM_setSize(adapter, mask);
++	SRAM_init(adapter);
++
++	tmp2 = 0xA5;
++	tmp1 = 0x4F;
++
++	SRAM_write(adapter, addr, &tmp2, 1);
++	SRAM_write(adapter, addr + 4, &tmp1, 1);
++
++	tmp2 = 0;
++
++	mdelay(20);
++
++	SRAM_read(adapter, addr, &tmp2, 1);
++	SRAM_read(adapter, addr, &tmp2, 1);
++
++	dprintk("%s: wrote 0xA5, read 0x%2x\n", __FUNCTION__, tmp2);
++
++	if (tmp2 != 0xA5)
++		return 0;
++
++	tmp2 = 0x5A;
++	tmp1 = 0xF4;
++
++	SRAM_write(adapter, addr, &tmp2, 1);
++	SRAM_write(adapter, addr + 4, &tmp1, 1);
++
++	tmp2 = 0;
++
++	mdelay(20);
++
++	SRAM_read(adapter, addr, &tmp2, 1);
++	SRAM_read(adapter, addr, &tmp2, 1);
++
++	dprintk("%s: wrote 0x5A, read 0x%2x\n", __FUNCTION__, tmp2);
++
++	if (tmp2 != 0x5A)
++		return 0;
++
++	return 1;
++}
++
++static u32 SRAM_length(struct adapter * adapter)
++{
++	if (adapter->dwSramType == 0x10000)
++		return 32768;	//  32K
++	if (adapter->dwSramType == 0x00000)
++		return 65536;	//  64K        
++	if (adapter->dwSramType == 0x20000)
++		return 131072;	// 128K
++
++	return 32768;		// 32K
++}
++
++/* FlexcopII can work with 32K, 64K or 128K of external SRAM memory.
++    - for 128K there are 4x32K chips at bank 0,1,2,3.
++    - for  64K there are 2x32K chips at bank 1,2.
++    - for  32K there is one 32K chip at bank 0.
++
++   FlexCop works only with one bank at a time. The bank is selected
++   by bits 28-29 of the 0x700 register.
++  
++   bank 0 covers addresses 0x00000-0x07FFF
++   bank 1 covers addresses 0x08000-0x0FFFF
++   bank 2 covers addresses 0x10000-0x17FFF
++   bank 3 covers addresses 0x18000-0x1FFFF
++*/
++static int SramDetectForFlex2(struct adapter *adapter)
++{
++	u32 tmp, tmp2, tmp3;
++
++	dprintk("%s:\n", __FUNCTION__);
++
++	tmp = ReadRegDW(adapter, 0x208);
++	WriteRegDW(adapter, 0x208, 0);
++
++	tmp2 = ReadRegDW(adapter, 0x71C);
++
++	dprintk("%s: tmp2 = %x\n", __FUNCTION__, tmp2);
++
++	WriteRegDW(adapter, 0x71C, 1);
++
++	tmp3 = ReadRegDW(adapter, 0x71C);
++
++	dprintk("%s: tmp3 = %x\n", __FUNCTION__, tmp3);
++
++	WriteRegDW(adapter, 0x71C, tmp2);
++
++	// check for internal SRAM ???
++	tmp3--;
++	if (tmp3 != 0) {
++		SRAM_setSize(adapter, 0x10000);
++		SRAM_init(adapter);
++		WriteRegDW(adapter, 0x208, tmp);
++
++		dprintk("%s: sram size = 32K\n", __FUNCTION__);
++
++		return 32;
++	}
++
++	if (SRAM_testLocation(adapter, 0x20000, 0x18000) != 0) {
++		SRAM_setSize(adapter, 0x20000);
++		SRAM_init(adapter);
++		WriteRegDW(adapter, 0x208, tmp);
++
++		dprintk("%s: sram size = 128K\n", __FUNCTION__);
++
++		return 128;
++	}
++
++	if (SRAM_testLocation(adapter, 0x00000, 0x10000) != 0) {
++		SRAM_setSize(adapter, 0x00000);
++		SRAM_init(adapter);
++		WriteRegDW(adapter, 0x208, tmp);
++
++		dprintk("%s: sram size = 64K\n", __FUNCTION__);
++
++		return 64;
++	}
++
++	if (SRAM_testLocation(adapter, 0x10000, 0x00000) != 0) {
++		SRAM_setSize(adapter, 0x10000);
++		SRAM_init(adapter);
++		WriteRegDW(adapter, 0x208, tmp);
++
++		dprintk("%s: sram size = 32K\n", __FUNCTION__);
++
++		return 32;
++	}
++
++	SRAM_setSize(adapter, 0x10000);
++	SRAM_init(adapter);
++	WriteRegDW(adapter, 0x208, tmp);
++
++	dprintk("%s: SRAM detection failed. Set to 32K \n", __FUNCTION__);
++
++	return 0;
++}
++
++static void SLL_detectSramSize(struct adapter *adapter)
++{
++	SramDetectForFlex2(adapter);
++}
++/* EEPROM (Skystar2 has one "24LC08B" chip on board) */
++/*
++static int EEPROM_write(struct adapter *adapter, u16 addr, u8 * buf, u16 len)
++{
++	return FLEXI2C_write(adapter, 0x20000000, 0x50, addr, buf, len);
++}
++*/
++
++static int EEPROM_read(struct adapter *adapter, u16 addr, u8 * buf, u16 len)
++{
++	return FLEXI2C_read(adapter, 0x20000000, 0x50, addr, buf, len);
++}
++
++u8 calc_LRC(u8 * buf, u32 len)
++{
++	u32 i;
++	u8 sum;
++
++	sum = 0;
++
++	for (i = 0; i < len; i++)
++		sum = sum ^ buf[i];
++
++	return sum;
++}
++
++static int EEPROM_LRC_read(struct adapter *adapter, u32 addr, u32 len, u8 * buf, u32 retries)
++{
++	int i;
++
++	for (i = 0; i < retries; i++) {
++		if (EEPROM_read(adapter, addr, buf, len) == len) {
++			if (calc_LRC(buf, len - 1) == buf[len - 1])
++				return 1;
++		}
++	}
++
++	return 0;
++}
++
++/*
++static int EEPROM_LRC_write(struct adapter *adapter, u32 addr, u32 len, u8 * wbuf, u8 * rbuf, u32 retries)
++{
++	int i;
++
++	for (i = 0; i < retries; i++) {
++		if (EEPROM_write(adapter, addr, wbuf, len) == len) {
++			if (EEPROM_LRC_read(adapter, addr, len, rbuf, retries) == 1)
++				return 1;
++		}
++	}
++
++	return 0;
++}
++*/
++
++/* These functions could be called from the initialization routine 
++   to unlock SkyStar2 cards, locked by "Europe On Line".
++        
++   in cards from "Europe On Line" the key is:
++
++       u8 key[20] = {
++ 	    0xB2, 0x01, 0x00, 0x00,
++ 	    0x00, 0x00, 0x00, 0x00,
++ 	    0x00, 0x00, 0x00, 0x00,
++ 	    0x00, 0x00, 0x00, 0x00,
++       };
++
++       LRC = 0xB3;
++
++  in unlocked cards the key is:
++
++       u8 key[20] = {
++ 	    0xB2, 0x00, 0x00, 0x00,
++ 	    0x00, 0x00, 0x00, 0x00,
++ 	    0x00, 0x00, 0x00, 0x00,
++ 	    0x00, 0x00, 0x00, 0x00,
++       };
++
++      LRC = 0xB2;
++*/
++/*
++static int EEPROM_writeKey(struct adapter *adapter, u8 * key, u32 len)
++{
++	u8 rbuf[20];
++	u8 wbuf[20];
++
++	if (len != 16)
++		return 0;
++
++	memcpy(wbuf, key, len);
++
++	wbuf[16] = 0;
++	wbuf[17] = 0;
++	wbuf[18] = 0;
++	wbuf[19] = calc_LRC(wbuf, 19);
++
++	return EEPROM_LRC_write(adapter, 0x3E4, 20, wbuf, rbuf, 4);
++}
++*/
++static int EEPROM_readKey(struct adapter *adapter, u8 * key, u32 len)
++{
++	u8 buf[20];
++
++	if (len != 16)
++		return 0;
++
++	if (EEPROM_LRC_read(adapter, 0x3E4, 20, buf, 4) == 0)
++		return 0;
++
++	memcpy(key, buf, len);
++
++	return 1;
++}
++
++static int EEPROM_getMacAddr(struct adapter *adapter, char type, u8 * mac)
++{
++	u8 tmp[8];
++
++	if (EEPROM_LRC_read(adapter, 0x3F8, 8, tmp, 4) != 0) {
++		if (type != 0) {
++			mac[0] = tmp[0];
++			mac[1] = tmp[1];
++			mac[2] = tmp[2];
++			mac[3] = 0xFE;
++			mac[4] = 0xFF;
++			mac[5] = tmp[3];
++			mac[6] = tmp[4];
++			mac[7] = tmp[5];
++
++		} else {
++
++			mac[0] = tmp[0];
++			mac[1] = tmp[1];
++			mac[2] = tmp[2];
++			mac[3] = tmp[3];
++			mac[4] = tmp[4];
++			mac[5] = tmp[5];
++		}
++
++		return 1;
++
++	} else {
++
++		if (type == 0) {
++			memset(mac, 0, 6);
++
++		} else {
++
++			memset(mac, 0, 8);
++		}
++
++		return 0;
++	}
++}
++
++/*
++static char EEPROM_setMacAddr(struct adapter *adapter, char type, u8 * mac)
++{
++	u8 tmp[8];
++
++	if (type != 0) {
++		tmp[0] = mac[0];
++		tmp[1] = mac[1];
++		tmp[2] = mac[2];
++		tmp[3] = mac[5];
++		tmp[4] = mac[6];
++		tmp[5] = mac[7];
++
++	} else {
++
++		tmp[0] = mac[0];
++		tmp[1] = mac[1];
++		tmp[2] = mac[2];
++		tmp[3] = mac[3];
++		tmp[4] = mac[4];
++		tmp[5] = mac[5];
++	}
++
++	tmp[6] = 0;
++	tmp[7] = calc_LRC(tmp, 7);
++
++	if (EEPROM_write(adapter, 0x3F8, tmp, 8) == 8)
++		return 1;
++
++	return 0;
++}
++*/
++
++/* PID filter */
++static void FilterEnableStream1Filter(struct adapter *adapter, u32 op)
++{
++	dprintk("%s: op=%x\n", __FUNCTION__, op);
++
++	if (op == 0) {
++		WriteRegOp(adapter, 0x208, 2, ~0x00000001, 0);
++
++	} else {
++
++		WriteRegOp(adapter, 0x208, 1, 0, 0x00000001);
++	}
++}
++
++static void FilterEnableStream2Filter(struct adapter *adapter, u32 op)
++{
++	dprintk("%s: op=%x\n", __FUNCTION__, op);
++
++	if (op == 0) {
++		WriteRegOp(adapter, 0x208, 2, ~0x00000002, 0);
++
++	} else {
++
++		WriteRegOp(adapter, 0x208, 1, 0, 0x00000002);
++	}
++}
++
++static void FilterEnablePcrFilter(struct adapter *adapter, u32 op)
++{
++	dprintk("%s: op=%x\n", __FUNCTION__, op);
++
++	if (op == 0) {
++		WriteRegOp(adapter, 0x208, 2, ~0x00000004, 0);
++
++	} else {
++
++		WriteRegOp(adapter, 0x208, 1, 0, 0x00000004);
++	}
++}
++
++static void FilterEnablePmtFilter(struct adapter *adapter, u32 op)
++{
++	dprintk("%s: op=%x\n", __FUNCTION__, op);
++
++	if (op == 0) {
++		WriteRegOp(adapter, 0x208, 2, ~0x00000008, 0);
++
++	} else {
++
++		WriteRegOp(adapter, 0x208, 1, 0, 0x00000008);
++	}
++}
++
++static void FilterEnableEmmFilter(struct adapter *adapter, u32 op)
++{
++	dprintk("%s: op=%x\n", __FUNCTION__, op);
++
++	if (op == 0) {
++		WriteRegOp(adapter, 0x208, 2, ~0x00000010, 0);
++
++	} else {
++
++		WriteRegOp(adapter, 0x208, 1, 0, 0x00000010);
++	}
++}
++
++static void FilterEnableEcmFilter(struct adapter *adapter, u32 op)
++{
++	dprintk("%s: op=%x\n", __FUNCTION__, op);
++
++	if (op == 0) {
++		WriteRegOp(adapter, 0x208, 2, ~0x00000020, 0);
++
++	} else {
++
++		WriteRegOp(adapter, 0x208, 1, 0, 0x00000020);
++	}
++}
++
++/*
++static void FilterEnableNullFilter(struct adapter *adapter, u32 op)
++{
++	dprintk("%s: op=%x\n", __FUNCTION__, op);
++
++	if (op == 0) {
++		WriteRegOp(adapter, 0x208, 2, ~0x00000040, 0);
++
++	} else {
++
++		WriteRegOp(adapter, 0x208, 1, 0, 0x00000040);
++	}
++}
++*/
++
++static void FilterEnableMaskFilter(struct adapter *adapter, u32 op)
++{
++	dprintk("%s: op=%x\n", __FUNCTION__, op);
++
++	if (op == 0) {
++		WriteRegOp(adapter, 0x208, 2, ~0x00000080, 0);
++
++	} else {
++
++		WriteRegOp(adapter, 0x208, 1, 0, 0x00000080);
++	}
++}
++
++
++static void CtrlEnableMAC(struct adapter *adapter, u32 op)
++{
++	if (op == 0) {
++		WriteRegOp(adapter, 0x208, 2, ~0x00004000, 0);
++
++	} else {
++
++		WriteRegOp(adapter, 0x208, 1, 0, 0x00004000);
++	}
++}
++
++static int CASetMacDstAddrFilter(struct adapter *adapter, u8 * mac)
++{
++	u32 tmp1, tmp2;
++
++	tmp1 = (mac[3] << 0x18) | (mac[2] << 0x10) | (mac[1] << 0x08) | mac[0];
++	tmp2 = (mac[5] << 0x08) | mac[4];
++
++	WriteRegDW(adapter, 0x418, tmp1);
++	WriteRegDW(adapter, 0x41C, tmp2);
++
++	return 0;
++}
++
++/*
++static void SetIgnoreMACFilter(struct adapter *adapter, u8 op)
++{
++	if (op != 0) {
++		WriteRegOp(adapter, 0x208, 2, ~0x00004000, 0);
++
++		adapter->mac_filter = 1;
++
++	} else {
++
++		if (adapter->mac_filter != 0) {
++			adapter->mac_filter = 0;
++
++			WriteRegOp(adapter, 0x208, 1, 0, 0x00004000);
++		}
++	}
++}
++*/
++
++/*
++static void CheckNullFilterEnable(struct adapter *adapter)
++{
++	FilterEnableNullFilter(adapter, 1);
++	FilterEnableMaskFilter(adapter, 1);
++}
++*/
++
++static void InitPIDsInfo(struct adapter *adapter)
++{
++	int i;
++
++	for (i = 0; i < 0x27; i++)
++		adapter->pids[i] = 0x1FFF;
++}
++
++static int CheckPID(struct adapter *adapter, u16 pid)
++{
++	u32 i;
++
++	if (pid == 0x1FFF)
++		return 0;
++
++	for (i = 0; i < 0x27; i++) {
++		if (adapter->pids[i] == pid)
++			return 1;
++	}
++
++	return 0;
++}
++
++static void PidSetGroupPID(struct adapter * adapter, u32 pid)
++{
++	u32 value;
++
++	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
++
++	value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x30C) & 0xFFFF0000);
++
++	WriteRegDW(adapter, 0x30C, value);
++
++	/* return value is never used? */
++/*	return value; */
++}
++
++static void PidSetGroupMASK(struct adapter * adapter, u32 pid)
++{
++	u32 value;
++
++	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
++
++	value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x30C) & 0xFFFF);
++
++	WriteRegDW(adapter, 0x30C, value);
++
++	/* return value is never used? */
++/*	return value; */
++}
++
++static void PidSetStream1PID(struct adapter * adapter, u32 pid)
++{
++	u32 value;
++
++	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
++
++	value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x300) & 0xFFFFC000);
++
++	WriteRegDW(adapter, 0x300, value);
++
++	/* return value is never used? */
++/*	return value; */
++}
++
++static void PidSetStream2PID(struct adapter * adapter, u32 pid)
++{
++	u32 value;
++
++	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
++
++	value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x300) & 0xFFFF);
++
++	WriteRegDW(adapter, 0x300, value);
++
++	/* return value is never used? */
++/*	return value; */
++}
++
++static void PidSetPcrPID(struct adapter * adapter, u32 pid)
++{
++	u32 value;
++
++	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
++
++	value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x304) & 0xFFFFC000);
++
++	WriteRegDW(adapter, 0x304, value);
++
++	/* return value is never used? */
++/*	return value; */
++}
++
++static void PidSetPmtPID(struct adapter * adapter, u32 pid)
++{
++	u32 value;
++
++	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
++
++	value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x304) & 0x3FFF);
++
++	WriteRegDW(adapter, 0x304, value);
++
++	/* return value is never used? */
++/*	return value; */
++}
++
++static void PidSetEmmPID(struct adapter * adapter, u32 pid)
++{
++	u32 value;
++
++	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
++
++	value = (pid & 0xFFFF) | (ReadRegDW(adapter, 0x308) & 0xFFFF0000);
++
++	WriteRegDW(adapter, 0x308, value);
++
++	/* return value is never used? */
++/*	return value; */
++}
++
++static void PidSetEcmPID(struct adapter * adapter, u32 pid)
++{
++	u32 value;
++
++	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
++
++	value = (pid << 0x10) | (ReadRegDW(adapter, 0x308) & 0xFFFF);
++
++	WriteRegDW(adapter, 0x308, value);
++
++	/* return value is never used? */
++/*	return value; */
++}
++
++static int PidGetStream1PID(struct adapter * adapter)
++{
++	return ReadRegDW(adapter, 0x300) & 0x00001FFF;
++}
++
++static int PidGetStream2PID(struct adapter * adapter)
++{
++	return (ReadRegDW(adapter, 0x300) >> 0x10)& 0x00001FFF;
++}
++
++static int PidGetPcrPID(struct adapter * adapter)
++{
++	return ReadRegDW(adapter, 0x304) & 0x00001FFF;
++}
++
++static int PidGetPmtPID(struct adapter * adapter)
++{
++	return (ReadRegDW(adapter, 0x304) >> 0x10)& 0x00001FFF;
++}
++
++static int PidGetEmmPID(struct adapter * adapter)
++{
++	return ReadRegDW(adapter, 0x308) & 0x00001FFF;
++}
++
++static int PidGetEcmPID(struct adapter * adapter)
++{
++	return (ReadRegDW(adapter, 0x308) >> 0x10)& 0x00001FFF;
++}
++
++static int PidGetGroupPID(struct adapter * adapter)
++{
++	return ReadRegDW(adapter, 0x30C) & 0x00001FFF;
++}
++
++static int PidGetGroupMASK(struct adapter * adapter)
++{
++	return (ReadRegDW(adapter, 0x30C) >> 0x10)& 0x00001FFF;
++}
++
++/*
++static void ResetHardwarePIDFilter(struct adapter *adapter)
++{
++	PidSetStream1PID(adapter, 0x1FFF);
++
++	PidSetStream2PID(adapter, 0x1FFF);
++	FilterEnableStream2Filter(adapter, 0);
++
++	PidSetPcrPID(adapter, 0x1FFF);
++	FilterEnablePcrFilter(adapter, 0);
++
++	PidSetPmtPID(adapter, 0x1FFF);
++	FilterEnablePmtFilter(adapter, 0);
++
++	PidSetEcmPID(adapter, 0x1FFF);
++	FilterEnableEcmFilter(adapter, 0);
++
++	PidSetEmmPID(adapter, 0x1FFF);
++	FilterEnableEmmFilter(adapter, 0);
++}
++*/
++
++static void OpenWholeBandwidth(struct adapter *adapter)
++{
++	PidSetGroupPID(adapter, 0);
++
++	PidSetGroupMASK(adapter, 0);
++
++	FilterEnableMaskFilter(adapter, 1);
++}
++
++static int AddHwPID(struct adapter *adapter, u32 pid)
++{
++	dprintk("%s: pid=%d\n", __FUNCTION__, pid);
++
++	if (pid <= 0x1F)
++		return 1;
++
++	if ((PidGetGroupMASK(adapter) == 0) && (PidGetGroupPID(adapter) == 0))
++		return 0;
++
++	if (PidGetStream1PID(adapter) == 0x1FFF) {
++		PidSetStream1PID(adapter, pid & 0xFFFF);
++
++		FilterEnableStream1Filter(adapter, 1);
++
++		return 1;
++	}
++
++	if (PidGetStream2PID(adapter) == 0x1FFF) {
++		PidSetStream2PID(adapter, (pid & 0xFFFF));
++
++		FilterEnableStream2Filter(adapter, 1);
++
++		return 1;
++	}
++
++	if (PidGetPcrPID(adapter) == 0x1FFF) {
++		PidSetPcrPID(adapter, (pid & 0xFFFF));
++
++		FilterEnablePcrFilter(adapter, 1);
++
++		return 1;
++	}
++
++	if ((PidGetPmtPID(adapter) & 0x1FFF) == 0x1FFF) {
++		PidSetPmtPID(adapter, (pid & 0xFFFF));
++
++		FilterEnablePmtFilter(adapter, 1);
++
++		return 1;
++	}
++
++	if ((PidGetEmmPID(adapter) & 0x1FFF) == 0x1FFF) {
++		PidSetEmmPID(adapter, (pid & 0xFFFF));
++
++		FilterEnableEmmFilter(adapter, 1);
++
++		return 1;
++	}
++
++	if ((PidGetEcmPID(adapter) & 0x1FFF) == 0x1FFF) {
++		PidSetEcmPID(adapter, (pid & 0xFFFF));
++
++		FilterEnableEcmFilter(adapter, 1);
++
++		return 1;
++	}
++
++	return -1;
++}
++
++static int RemoveHwPID(struct adapter *adapter, u32 pid)
++{
++	dprintk("%s: pid=%d\n", __FUNCTION__, pid);
++
++	if (pid <= 0x1F)
++		return 1;
++
++	if (PidGetStream1PID(adapter) == pid) {
++		PidSetStream1PID(adapter, 0x1FFF);
++
++		return 1;
++	}
++
++	if (PidGetStream2PID(adapter) == pid) {
++		PidSetStream2PID(adapter, 0x1FFF);
++
++		FilterEnableStream2Filter(adapter, 0);
++
++		return 1;
++	}
++
++	if (PidGetPcrPID(adapter) == pid) {
++		PidSetPcrPID(adapter, 0x1FFF);
++
++		FilterEnablePcrFilter(adapter, 0);
++
++		return 1;
++	}
++
++	if (PidGetPmtPID(adapter) == pid) {
++		PidSetPmtPID(adapter, 0x1FFF);
++
++		FilterEnablePmtFilter(adapter, 0);
++
++		return 1;
++	}
++
++	if (PidGetEmmPID(adapter) == pid) {
++		PidSetEmmPID(adapter, 0x1FFF);
++
++		FilterEnableEmmFilter(adapter, 0);
++
++		return 1;
++	}
++
++	if (PidGetEcmPID(adapter) == pid) {
++		PidSetEcmPID(adapter, 0x1FFF);
++
++		FilterEnableEcmFilter(adapter, 0);
++
++		return 1;
++	}
++
++	return -1;
++}
++
++static int AddPID(struct adapter *adapter, u32 pid)
++{
++	int i;
++
++	dprintk("%s: pid=%d\n", __FUNCTION__, pid);
++
++	if (pid > 0x1FFE)
++		return -1;
++
++	if (CheckPID(adapter, pid) == 1)
++		return 1;
++
++	for (i = 0; i < 0x27; i++) {
++		if (adapter->pids[i] == 0x1FFF)	// find free pid filter
++		{
++			adapter->pids[i] = pid;
++
++			if (AddHwPID(adapter, pid) < 0)
++				OpenWholeBandwidth(adapter);
++
++			return 1;
++		}
++	}
++
++	return -1;
++}
++
++static int RemovePID(struct adapter *adapter, u32 pid)
++{
++	u32 i;
++
++	dprintk("%s: pid=%d\n", __FUNCTION__, pid);
++
++	if (pid > 0x1FFE)
++		return -1;
++
++	for (i = 0; i < 0x27; i++) {
++		if (adapter->pids[i] == pid) {
++			adapter->pids[i] = 0x1FFF;
++
++			RemoveHwPID(adapter, pid);
++
++			return 1;
++		}
++	}
++
++	return -1;
++}
++
++/* dma & irq */
++static void CtrlEnableSmc(struct adapter *adapter, u32 op)
++{
++	if (op == 0) {
++		WriteRegOp(adapter, 0x208, 2, ~0x00000800, 0);
++
++	} else {
++
++		WriteRegOp(adapter, 0x208, 1, 0, 0x00000800);
++	}
++}
++
++static void DmaEnableDisableIrq(struct adapter *adapter, u32 flag1, u32 flag2, u32 flag3)
++{
++	adapter->dma_ctrl = adapter->dma_ctrl & 0x000F0000;
++
++	if (flag1 == 0) {
++		if (flag2 == 0)
++			adapter->dma_ctrl = adapter->dma_ctrl & ~0x00010000;
++		else
++			adapter->dma_ctrl = adapter->dma_ctrl | 0x00010000;
++
++		if (flag3 == 0)
++			adapter->dma_ctrl = adapter->dma_ctrl & ~0x00020000;
++		else
++			adapter->dma_ctrl = adapter->dma_ctrl | 0x00020000;
++
++	} else {
++
++		if (flag2 == 0)
++			adapter->dma_ctrl = adapter->dma_ctrl & ~0x00040000;
++		else
++			adapter->dma_ctrl = adapter->dma_ctrl | 0x00040000;
++
++		if (flag3 == 0)
++			adapter->dma_ctrl = adapter->dma_ctrl & ~0x00080000;
++		else
++			adapter->dma_ctrl = adapter->dma_ctrl | 0x00080000;
++	}
++}
++
++static void IrqDmaEnableDisableIrq(struct adapter * adapter, u32 op)
++{
++	u32 value;
++
++	value = ReadRegDW(adapter, 0x208) & 0xFFF0FFFF;
++
++	if (op != 0)
++		value = value | (adapter->dma_ctrl & 0x000F0000);
++
++	WriteRegDW(adapter, 0x208, value);
++}
++
++/* FlexCopII has 2 dma channels. DMA1 is used to transfer TS data to
++   system memory.
++
++   The DMA1 buffer is divided in 2 subbuffers of equal size.
++   FlexCopII will transfer TS data to one subbuffer, signal an interrupt
++   when the subbuffer is full and continue fillig the second subbuffer.
++
++   For DMA1:
++       subbuffer size in 32-bit words is stored in the first 24 bits of
++       register 0x004. The last 8 bits of register 0x004 contain the number
++       of subbuffers.
++       
++       the first 30 bits of register 0x000 contain the address of the first
++       subbuffer. The last 2 bits contain 0, when dma1 is disabled and 1,
++       when dma1 is enabled.
++
++       the first 30 bits of register 0x00C contain the address of the second
++       subbuffer. the last 2 bits contain 1.
++
++       register 0x008 will contain the address of the subbuffer that was filled
++       with TS data, when FlexCopII will generate an interrupt.
++
++   For DMA2:
++       subbuffer size in 32-bit words is stored in the first 24 bits of
++       register 0x014. The last 8 bits of register 0x014 contain the number
++       of subbuffers.
++       
++       the first 30 bits of register 0x010 contain the address of the first
++       subbuffer.  The last 2 bits contain 0, when dma1 is disabled and 1,
++       when dma1 is enabled.
++
++       the first 30 bits of register 0x01C contain the address of the second
++       subbuffer. the last 2 bits contain 1.
++
++       register 0x018 contains the address of the subbuffer that was filled
++       with TS data, when FlexCopII generates an interrupt.
++*/
++static int DmaInitDMA(struct adapter *adapter, u32 dma_channel)
++{
++	u32 subbuffers, subbufsize, subbuf0, subbuf1;
++
++	if (dma_channel == 0) {
++		dprintk("%s: Initializing DMA1 channel\n", __FUNCTION__);
++
++		subbuffers = 2;
++
++		subbufsize = (((adapter->dmaq1.buffer_size / 2) / 4) << 8) | subbuffers;
++
++		subbuf0 = adapter->dmaq1.bus_addr & 0xFFFFFFFC;
++
++		subbuf1 = ((adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) & 0xFFFFFFFC) | 1;
++
++		dprintk("%s: first subbuffer address = 0x%x\n", __FUNCTION__, subbuf0);
++		udelay(1000);
++		WriteRegDW(adapter, 0x000, subbuf0);
++
++		dprintk("%s: subbuffer size = 0x%x\n", __FUNCTION__, (subbufsize >> 8) * 4);
++		udelay(1000);
++		WriteRegDW(adapter, 0x004, subbufsize);
++
++		dprintk("%s: second subbuffer address = 0x%x\n", __FUNCTION__, subbuf1);
++		udelay(1000);
++		WriteRegDW(adapter, 0x00C, subbuf1);
++
++		dprintk("%s: counter = 0x%x\n", __FUNCTION__, adapter->dmaq1.bus_addr & 0xFFFFFFFC);
++		WriteRegDW(adapter, 0x008, adapter->dmaq1.bus_addr & 0xFFFFFFFC);
++		udelay(1000);
++
++		if (subbuffers == 0)
++			DmaEnableDisableIrq(adapter, 0, 1, 0);
++		else
++			DmaEnableDisableIrq(adapter, 0, 1, 1);
++
++		IrqDmaEnableDisableIrq(adapter, 1);
++
++		SRAMSetMediaDest(adapter, 1);
++		SRAMSetNetDest(adapter, 1);
++		SRAMSetCaiDest(adapter, 2);
++		SRAMSetCaoDest(adapter, 2);
++	}
++
++	if (dma_channel == 1) {
++		dprintk("%s: Initializing DMA2 channel\n", __FUNCTION__);
++
++		subbuffers = 2;
++
++		subbufsize = (((adapter->dmaq2.buffer_size / 2) / 4) << 8) | subbuffers;
++
++		subbuf0 = adapter->dmaq2.bus_addr & 0xFFFFFFFC;
++
++		subbuf1 = ((adapter->dmaq2.bus_addr + adapter->dmaq2.buffer_size / 2) & 0xFFFFFFFC) | 1;
++
++		dprintk("%s: first subbuffer address = 0x%x\n", __FUNCTION__, subbuf0);
++		udelay(1000);
++		WriteRegDW(adapter, 0x010, subbuf0);
++
++		dprintk("%s: subbuffer size = 0x%x\n", __FUNCTION__, (subbufsize >> 8) * 4);
++		udelay(1000);
++		WriteRegDW(adapter, 0x014, subbufsize);
++
++		dprintk("%s: second buffer address = 0x%x\n", __FUNCTION__, subbuf1);
++		udelay(1000);
++		WriteRegDW(adapter, 0x01C, subbuf1);
++
++		SRAMSetCaiDest(adapter, 2);
++	}
++
++	return 0;
++}
++
++static void CtrlEnableReceiveData(struct adapter *adapter, u32 op)
++{
++	if (op == 0) {
++		WriteRegOp(adapter, 0x208, 2, ~0x00008000, 0);
++
++		adapter->dma_status = adapter->dma_status & ~0x00000004;
++
++	} else {
++
++		WriteRegOp(adapter, 0x208, 1, 0, 0x00008000);
++
++		adapter->dma_status = adapter->dma_status | 0x00000004;
++	}
++}
++
++/* bit 0 of dma_mask is set to 1 if dma1 channel has to be enabled/disabled
++   bit 1 of dma_mask is set to 1 if dma2 channel has to be enabled/disabled
++*/
++static void DmaStartStop0x2102(struct adapter *adapter, u32 dma_mask, u32 start_stop)
++{
++	u32 dma_enable, dma1_enable, dma2_enable;
++
++	dprintk("%s: dma_mask=%x\n", __FUNCTION__, dma_mask);
++
++	if (start_stop == 1) {
++		dprintk("%s: starting dma\n", __FUNCTION__);
++
++		dma1_enable = 0;
++		dma2_enable = 0;
++
++		if (((dma_mask & 1) != 0) && ((adapter->dma_status & 1) == 0) && (adapter->dmaq1.bus_addr != 0)) {
++			adapter->dma_status = adapter->dma_status | 1;
++			dma1_enable = 1;
++		}
++
++		if (((dma_mask & 2) != 0) && ((adapter->dma_status & 2) == 0) && (adapter->dmaq2.bus_addr != 0)) {
++			adapter->dma_status = adapter->dma_status | 2;
++			dma2_enable = 1;
++		}
++		// enable dma1 and dma2
++		if ((dma1_enable == 1) && (dma2_enable == 1)) {
++			WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
++			WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
++			WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
++
++			CtrlEnableReceiveData(adapter, 1);
++
++			return;
++		}
++		// enable dma1
++		if ((dma1_enable == 1) && (dma2_enable == 0)) {
++			WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
++			WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
++
++			CtrlEnableReceiveData(adapter, 1);
++
++			return;
++		}
++		// enable dma2
++		if ((dma1_enable == 0) && (dma2_enable == 1)) {
++			WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
++
++			CtrlEnableReceiveData(adapter, 1);
++
++			return;
++		}
++		// start dma
++		if ((dma1_enable == 0) && (dma2_enable == 0)) {
++			CtrlEnableReceiveData(adapter, 1);
++
++			return;
++		}
++
++	} else {
++
++		dprintk("%s: stoping dma\n", __FUNCTION__);
++
++		dma_enable = adapter->dma_status & 0x00000003;
++
++		if (((dma_mask & 1) != 0) && ((adapter->dma_status & 1) != 0)) {
++			dma_enable = dma_enable & 0xFFFFFFFE;
++		}
++
++		if (((dma_mask & 2) != 0) && ((adapter->dma_status & 2) != 0)) {
++			dma_enable = dma_enable & 0xFFFFFFFD;
++		}
++		//stop dma
++		if ((dma_enable == 0) && ((adapter->dma_status & 4) != 0)) {
++			CtrlEnableReceiveData(adapter, 0);
++
++			udelay(3000);
++		}
++		//disable dma1
++		if (((dma_mask & 1) != 0) && ((adapter->dma_status & 1) != 0) && (adapter->dmaq1.bus_addr != 0)) {
++			WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr);
++			WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
++
++			adapter->dma_status = adapter->dma_status & ~0x00000001;
++		}
++		//disable dma2
++		if (((dma_mask & 2) != 0) && ((adapter->dma_status & 2) != 0) && (adapter->dmaq2.bus_addr != 0)) {
++			WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr);
++
++			adapter->dma_status = adapter->dma_status & ~0x00000002;
++		}
++	}
++}
++
++static void OpenStream(struct adapter *adapter, u32 pid)
++{
++	u32 dma_mask;
++
++	if (adapter->capturing == 0)
++		adapter->capturing = 1;
++
++	FilterEnableMaskFilter(adapter, 1);
++
++	AddPID(adapter, pid);
++
++	dprintk("%s: adapter->dma_status=%x\n", __FUNCTION__, adapter->dma_status);
++
++	if ((adapter->dma_status & 7) != 7) {
++		dma_mask = 0;
++
++		if (((adapter->dma_status & 0x10000000) != 0) && ((adapter->dma_status & 1) == 0)) {
++			dma_mask = dma_mask | 1;
++
++			adapter->dmaq1.head = 0;
++			adapter->dmaq1.tail = 0;
++
++			memset(adapter->dmaq1.buffer, 0, adapter->dmaq1.buffer_size);
++		}
++
++		if (((adapter->dma_status & 0x20000000) != 0) && ((adapter->dma_status & 2) == 0)) {
++			dma_mask = dma_mask | 2;
++
++			adapter->dmaq2.head = 0;
++			adapter->dmaq2.tail = 0;
++		}
++
++		if (dma_mask != 0) {
++			IrqDmaEnableDisableIrq(adapter, 1);
++
++			DmaStartStop0x2102(adapter, dma_mask, 1);
++		}
++	}
++}
++
++static void CloseStream(struct adapter *adapter, u32 pid)
++{
++	u32 dma_mask;
++
++	if (adapter->capturing != 0)
++		adapter->capturing = 0;
++
++	dprintk("%s: dma_status=%x\n", __FUNCTION__, adapter->dma_status);
++
++	dma_mask = 0;
++
++	if ((adapter->dma_status & 1) != 0)
++		dma_mask = dma_mask | 0x00000001;
++	if ((adapter->dma_status & 2) != 0)
++		dma_mask = dma_mask | 0x00000002;
++
++	if (dma_mask != 0) {
++		DmaStartStop0x2102(adapter, dma_mask, 0);
++	}
++
++	RemovePID(adapter, pid);
++}
++
++static void InterruptServiceDMA1(struct adapter *adapter)
++{
++	struct dvb_demux *dvbdmx = &adapter->demux;
++	struct packet_header packet_header;
++
++	int nCurDmaCounter;
++	u32 nNumBytesParsed;
++	u32 nNumNewBytesTransferred;
++	u32 dwDefaultPacketSize = 188;
++	u8 gbTmpBuffer[188];
++	u8 *pbDMABufCurPos;
++
++	nCurDmaCounter = readl(adapter->io_mem + 0x008) - adapter->dmaq1.bus_addr;
++	nCurDmaCounter = (nCurDmaCounter / dwDefaultPacketSize) * dwDefaultPacketSize;
++
++	if ((nCurDmaCounter < 0) || (nCurDmaCounter > adapter->dmaq1.buffer_size)) {
++		dprintk("%s: dma counter outside dma buffer\n", __FUNCTION__);
++		return;
++	}
++
++	adapter->dmaq1.head = nCurDmaCounter;
++
++	if (adapter->dmaq1.tail <= nCurDmaCounter) {
++		nNumNewBytesTransferred = nCurDmaCounter - adapter->dmaq1.tail;
++
++	} else {
++
++		nNumNewBytesTransferred = (adapter->dmaq1.buffer_size - adapter->dmaq1.tail) + nCurDmaCounter;
++	}
++
++//  dprintk("%s: nCurDmaCounter   = %d\n" , __FUNCTION__, nCurDmaCounter);
++//	dprintk("%s: dmaq1.tail       = %d\n" , __FUNCTION__, adapter->dmaq1.tail):
++//  dprintk("%s: BytesTransferred = %d\n" , __FUNCTION__, nNumNewBytesTransferred);
++
++	if (nNumNewBytesTransferred < dwDefaultPacketSize)
++		return;
++
++	nNumBytesParsed = 0;
++
++	while (nNumBytesParsed < nNumNewBytesTransferred) {
++		pbDMABufCurPos = adapter->dmaq1.buffer + adapter->dmaq1.tail;
++
++		if (adapter->dmaq1.buffer + adapter->dmaq1.buffer_size < adapter->dmaq1.buffer + adapter->dmaq1.tail + 188) {
++			memcpy(gbTmpBuffer, adapter->dmaq1.buffer + adapter->dmaq1.tail, adapter->dmaq1.buffer_size - adapter->dmaq1.tail);
++			memcpy(gbTmpBuffer + (adapter->dmaq1.buffer_size - adapter->dmaq1.tail), adapter->dmaq1.buffer, (188 - (adapter->dmaq1.buffer_size - adapter->dmaq1.tail)));
++
++			pbDMABufCurPos = gbTmpBuffer;
++		}
++
++		if (adapter->capturing != 0) {
++			u32 *dq = (u32 *) pbDMABufCurPos;
++
++			packet_header.sync_byte = *dq & 0x000000FF;
++			packet_header.transport_error_indicator = *dq & 0x00008000;
++			packet_header.payload_unit_start_indicator = *dq & 0x00004000;
++			packet_header.transport_priority = *dq & 0x00002000;
++			packet_header.pid = ((*dq & 0x00FF0000) >> 0x10) | (*dq & 0x00001F00);
++			packet_header.transport_scrambling_control = *dq >> 0x1E;
++			packet_header.adaptation_field_control = (*dq & 0x30000000) >> 0x1C;
++			packet_header.continuity_counter = (*dq & 0x0F000000) >> 0x18;
++
++			if ((packet_header.sync_byte == 0x47) && (packet_header.transport_error_indicator == 0) && (packet_header.pid != 0x1FFF)) {
++				if (CheckPID(adapter, packet_header.pid & 0x0000FFFF) != 0) {
++					dvb_dmx_swfilter_packets(dvbdmx, pbDMABufCurPos, dwDefaultPacketSize / 188);
++
++				} else {
++
++//                  dprintk("%s: pid=%x\n", __FUNCTION__, packet_header.pid);
++				}
++			}
++		}
++
++		nNumBytesParsed = nNumBytesParsed + dwDefaultPacketSize;
++
++		adapter->dmaq1.tail = adapter->dmaq1.tail + dwDefaultPacketSize;
++
++		if (adapter->dmaq1.tail >= adapter->dmaq1.buffer_size)
++			adapter->dmaq1.tail = adapter->dmaq1.tail - adapter->dmaq1.buffer_size;
++	};
++}
++
++static void InterruptServiceDMA2(struct adapter *adapter)
++{
++	printk("%s:\n", __FUNCTION__);
++}
++
++static irqreturn_t isr(int irq, void *dev_id, struct pt_regs *regs)
++{
++	struct adapter *tmp = dev_id;
++
++	u32 value;
++
++//  dprintk("%s:\n", __FUNCTION__);
++
++	spin_lock_irq(&tmp->lock);
++
++	if (0 == ((value = ReadRegDW(tmp, 0x20C)) & 0x0F)) {
++		spin_unlock_irq(&tmp->lock);
++		return IRQ_NONE;
++	}
++	
++	while (value != 0) {
++		if ((value & 0x03) != 0)
++			InterruptServiceDMA1(tmp);
++		if ((value & 0x0C) != 0)
++			InterruptServiceDMA2(tmp);
++		value = ReadRegDW(tmp, 0x20C) & 0x0F;
++	}
++
++	spin_unlock_irq(&tmp->lock);
++	return IRQ_HANDLED;
++}
++
++static void Initdmaqueue(struct adapter *adapter)
++{
++	dma_addr_t dma_addr;
++
++	if (adapter->dmaq1.buffer != 0)
++		return;
++
++	adapter->dmaq1.head = 0;
++	adapter->dmaq1.tail = 0;
++	adapter->dmaq1.buffer = 0;
++
++	adapter->dmaq1.buffer = pci_alloc_consistent(adapter->pdev, SizeOfBufDMA1 + 0x80, &dma_addr);
++
++	if (adapter->dmaq1.buffer != 0) {
++		memset(adapter->dmaq1.buffer, 0, SizeOfBufDMA1);
++
++		adapter->dmaq1.bus_addr = dma_addr;
++		adapter->dmaq1.buffer_size = SizeOfBufDMA1;
++
++		DmaInitDMA(adapter, 0);
++
++		adapter->dma_status = adapter->dma_status | 0x10000000;
++
++		dprintk("%s: allocated dma buffer at 0x%x, length=%d\n", __FUNCTION__, (int) adapter->dmaq1.buffer, SizeOfBufDMA1);
++
++	} else {
++
++		adapter->dma_status = adapter->dma_status & ~0x10000000;
++	}
++
++	if (adapter->dmaq2.buffer != 0)
++		return;
++
++	adapter->dmaq2.head = 0;
++	adapter->dmaq2.tail = 0;
++	adapter->dmaq2.buffer = 0;
++
++	adapter->dmaq2.buffer = pci_alloc_consistent(adapter->pdev, SizeOfBufDMA2 + 0x80, &dma_addr);
++
++	if (adapter->dmaq2.buffer != 0) {
++		memset(adapter->dmaq2.buffer, 0, SizeOfBufDMA2);
++
++		adapter->dmaq2.bus_addr = dma_addr;
++		adapter->dmaq2.buffer_size = SizeOfBufDMA2;
++
++		DmaInitDMA(adapter, 1);
++
++		adapter->dma_status = adapter->dma_status | 0x20000000;
++
++		dprintk("%s: allocated dma buffer at 0x%x, length=%d\n", __FUNCTION__, (int) adapter->dmaq2.buffer, (int) SizeOfBufDMA2);
++
++	} else {
++
++		adapter->dma_status = adapter->dma_status & ~0x20000000;
++	}
++}
++
++static void Freedmaqueue(struct adapter *adapter)
++{
++	if (adapter->dmaq1.buffer != 0) {
++		pci_free_consistent(adapter->pdev, SizeOfBufDMA1 + 0x80, adapter->dmaq1.buffer, adapter->dmaq1.bus_addr);
++
++		adapter->dmaq1.bus_addr = 0;
++		adapter->dmaq1.head = 0;
++		adapter->dmaq1.tail = 0;
++		adapter->dmaq1.buffer_size = 0;
++		adapter->dmaq1.buffer = 0;
++	}
++
++	if (adapter->dmaq2.buffer != 0) {
++		pci_free_consistent(adapter->pdev, SizeOfBufDMA2 + 0x80, adapter->dmaq2.buffer, adapter->dmaq2.bus_addr);
++
++		adapter->dmaq2.bus_addr = 0;
++		adapter->dmaq2.head = 0;
++		adapter->dmaq2.tail = 0;
++		adapter->dmaq2.buffer_size = 0;
++		adapter->dmaq2.buffer = 0;
++	}
++}
++
++static void FreeAdapterObject(struct adapter *adapter)
++{
++	dprintk("%s:\n", __FUNCTION__);
++
++	CloseStream(adapter, 0);
++
++	if (adapter->irq != 0)
++		free_irq(adapter->irq, adapter);
++
++	Freedmaqueue(adapter);
++
++	if (adapter->io_mem != 0)
++		iounmap((void *) adapter->io_mem);
++
++	if (adapter != 0)
++		kfree(adapter);
++}
++
++static struct pci_driver skystar2_pci_driver;
++
++static int ClaimAdapter(struct adapter *adapter)
++{
++	struct pci_dev *pdev = adapter->pdev;
++
++	u16 var;
++
++	if (!request_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1), skystar2_pci_driver.name))
++		return -EBUSY;
++
++	if (!request_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0), skystar2_pci_driver.name))
++		return -EBUSY;
++
++	pci_read_config_byte(pdev, PCI_CLASS_REVISION, &adapter->card_revision);
++
++	dprintk("%s: card revision %x \n", __FUNCTION__, adapter->card_revision);
++
++	if (pci_enable_device(pdev))
++		return -EIO;
++
++	pci_read_config_word(pdev, 4, &var);
++
++	if ((var & 4) == 0)
++		pci_set_master(pdev);
++
++	adapter->io_port = pdev->resource[1].start;
++
++	adapter->io_mem = (u32) ioremap(pdev->resource[0].start, 0x800);
++
++	if (adapter->io_mem == 0) {
++		dprintk("%s: can not map io memory\n", __FUNCTION__);
++
++		return 2;
++	}
++
++	dprintk("%s: io memory maped at %x\n", __FUNCTION__, adapter->io_mem);
++
++	return 1;
++}
++
++/*
++static int SLL_reset_FlexCOP(struct adapter *adapter)
++{
++	WriteRegDW(adapter, 0x208, 0);
++	WriteRegDW(adapter, 0x210, 0xB2FF);
++
++	return 0;
++}
++*/
++
++static int DriverInitialize(struct pci_dev * pdev)
++{
++	struct adapter *adapter;
++	u32 tmp;
++	u8 key[16];
++
++	if (!(adapter = kmalloc(sizeof(struct adapter), GFP_KERNEL))) {
++		dprintk("%s: out of memory!\n", __FUNCTION__);
++
++		return -ENOMEM;
++	}
++
++	memset(adapter, 0, sizeof(struct adapter));
++
++	pci_set_drvdata(pdev,adapter);
++
++	adapter->pdev = pdev;
++	adapter->irq = pdev->irq;
++
++	if ((ClaimAdapter(adapter)) != 1) {
++		FreeAdapterObject(adapter);
++
++		return -ENODEV;
++	}
++
++	IrqDmaEnableDisableIrq(adapter, 0);
++
++	if (request_irq(pdev->irq, isr, 0x4000000, "Skystar2", adapter) != 0) {
++		dprintk("%s: unable to allocate irq=%d !\n", __FUNCTION__, pdev->irq);
++
++		FreeAdapterObject(adapter);
++
++		return -ENODEV;
++	}
++
++	ReadRegDW(adapter, 0x208);
++	WriteRegDW(adapter, 0x208, 0);
++	WriteRegDW(adapter, 0x210, 0xB2FF);
++	WriteRegDW(adapter, 0x208, 0x40);
++
++	InitPIDsInfo(adapter);
++
++	PidSetGroupPID(adapter, 0);
++	PidSetGroupMASK(adapter, 0x1FE0);
++	PidSetStream1PID(adapter, 0x1FFF);
++	PidSetStream2PID(adapter, 0x1FFF);
++	PidSetPmtPID(adapter, 0x1FFF);
++	PidSetPcrPID(adapter, 0x1FFF);
++	PidSetEcmPID(adapter, 0x1FFF);
++	PidSetEmmPID(adapter, 0x1FFF);
++
++	Initdmaqueue(adapter);
++
++	if ((adapter->dma_status & 0x30000000) == 0) {
++		FreeAdapterObject(adapter);
++
++		return -ENODEV;
++	}
++
++	adapter->b2c2_revision = (ReadRegDW(adapter, 0x204) >> 0x18);
++
++	if ((adapter->b2c2_revision != 0x82) && (adapter->b2c2_revision != 0xC3))
++		if (adapter->b2c2_revision != 0x82) {
++			dprintk("%s: The revision of the FlexCopII chip on your card is - %d\n", __FUNCTION__, adapter->b2c2_revision);
++			dprintk("%s: This driver works now only with FlexCopII(rev.130) and FlexCopIIB(rev.195).\n", __FUNCTION__);
++
++			FreeAdapterObject(adapter);
++
++			return -ENODEV;
++		}
++
++	tmp = ReadRegDW(adapter, 0x204);
++
++	WriteRegDW(adapter, 0x204, 0);
++	mdelay(20);
++
++	WriteRegDW(adapter, 0x204, tmp);
++	mdelay(10);
++
++	tmp = ReadRegDW(adapter, 0x308);
++	WriteRegDW(adapter, 0x308, 0x4000 | tmp);
++
++	adapter->dwSramType = 0x10000;
++
++	SLL_detectSramSize(adapter);
++
++	dprintk("%s sram length = %d, sram type= %x\n", __FUNCTION__, SRAM_length(adapter), adapter->dwSramType);
++
++	SRAMSetMediaDest(adapter, 1);
++	SRAMSetNetDest(adapter, 1);
++
++	CtrlEnableSmc(adapter, 0);
++
++	SRAMSetCaiDest(adapter, 2);
++	SRAMSetCaoDest(adapter, 2);
++
++	DmaEnableDisableIrq(adapter, 1, 0, 0);
++
++	if (EEPROM_getMacAddr(adapter, 0, adapter->mac_addr) != 0) {
++		printk("%s MAC address = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x \n", __FUNCTION__, adapter->mac_addr[0], adapter->mac_addr[1], adapter->mac_addr[2], adapter->mac_addr[3], adapter->mac_addr[4], adapter->mac_addr[5], adapter->mac_addr[6], adapter->mac_addr[7]
++		    );
++
++		CASetMacDstAddrFilter(adapter, adapter->mac_addr);
++		CtrlEnableMAC(adapter, 1);
++	}
++
++	EEPROM_readKey(adapter, key, 16);
++
++	printk("%s key = \n %02x %02x %02x %02x \n %02x %02x %02x %02x \n %02x %02x %02x %02x \n %02x %02x %02x %02x \n", __FUNCTION__, key[0], key[1], key[2], key[3], key[4], key[5], key[6], key[7], key[8], key[9], key[10], key[11], key[12], key[13], key[14], key[15]);
++
++	adapter->lock = SPIN_LOCK_UNLOCKED;
++
++	return 0;
++}
++
++static void DriverHalt(struct pci_dev *pdev)
++{
++	struct adapter *adapter;
++
++	adapter = pci_get_drvdata(pdev);
++
++	IrqDmaEnableDisableIrq(adapter, 0);
++
++	CtrlEnableReceiveData(adapter, 0);
++
++	FreeAdapterObject(adapter);
++
++	pci_set_drvdata(pdev, NULL);
++
++	release_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1));
++
++	release_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
++}
++
++static int dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
++{
++	struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
++	struct adapter *adapter = (struct adapter *) dvbdmx->priv;
++
++	dprintk("%s: PID=%d, type=%d\n", __FUNCTION__, dvbdmxfeed->pid, dvbdmxfeed->type);
++
++	OpenStream(adapter, dvbdmxfeed->pid);
++
++	return 0;
++}
++
++static int dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
++{
++	struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
++	struct adapter *adapter = (struct adapter *) dvbdmx->priv;
++
++	dprintk("%s: PID=%d, type=%d\n", __FUNCTION__, dvbdmxfeed->pid, dvbdmxfeed->type);
++
++	CloseStream(adapter, dvbdmxfeed->pid);
++
++	return 0;
++}
++
++/* lnb control */
++static void set_tuner_tone(struct adapter *adapter, u8 tone)
++{
++	u16 wzHalfPeriodFor45MHz[] = { 0x01FF, 0x0154, 0x00FF, 0x00CC };
++	u16 ax;
++
++	dprintk("%s: %u\n", __FUNCTION__, tone);
++
++	switch (tone) {
++	case 1:
++		ax = wzHalfPeriodFor45MHz[0];
++		break;
++	case 2:
++		ax = wzHalfPeriodFor45MHz[1];
++		break;
++	case 3:
++		ax = wzHalfPeriodFor45MHz[2];
++		break;
++	case 4:
++		ax = wzHalfPeriodFor45MHz[3];
++		break;
++
++	default:
++		ax = 0;
++	}
++
++	if (ax != 0) {
++		WriteRegDW(adapter, 0x200, ((ax << 0x0F) + (ax & 0x7FFF)) | 0x40000000);
++
++	} else {
++
++		WriteRegDW(adapter, 0x200, 0x40FF8000);
++	}
++}
++
++static void set_tuner_polarity(struct adapter *adapter, u8 polarity)
++{
++	u32 var;
++
++	dprintk("%s : polarity = %u \n", __FUNCTION__, polarity);
++
++	var = ReadRegDW(adapter, 0x204);
++
++	if (polarity == 0) {
++		dprintk("%s: LNB power off\n", __FUNCTION__);
++		var = var | 1;
++	};
++
++	if (polarity == 1) {
++		var = var & ~1;
++		var = var & ~4;
++	};
++
++	if (polarity == 2) {
++		var = var & ~1;
++		var = var | 4;
++	}
++
++	WriteRegDW(adapter, 0x204, var);
++}
++
++static int flexcop_diseqc_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
++{
++	struct adapter *adapter = fe->before_after_data;
++
++	switch (cmd) {
++	case FE_SLEEP:
++		{
++			printk("%s: FE_SLEEP\n", __FUNCTION__);
++
++			set_tuner_polarity(adapter, 0);
++
++			// return -EOPNOTSUPP, to make DVB core also send "FE_SLEEP" command to frontend.
++			return -EOPNOTSUPP;
++		}
++
++	case FE_SET_VOLTAGE:
++		{
++			dprintk("%s: FE_SET_VOLTAGE\n", __FUNCTION__);
++
++			switch ((fe_sec_voltage_t) arg) {
++			case SEC_VOLTAGE_13:
++
++				printk("%s: SEC_VOLTAGE_13, %x\n", __FUNCTION__, SEC_VOLTAGE_13);
++
++				set_tuner_polarity(adapter, 1);
++
++				break;
++
++			case SEC_VOLTAGE_18:
++
++				printk("%s: SEC_VOLTAGE_18, %x\n", __FUNCTION__, SEC_VOLTAGE_18);
++
++				set_tuner_polarity(adapter, 2);
++
++				break;
++
++			default:
++
++				return -EINVAL;
++			};
++
++			break;
++		}
++
++	case FE_SET_TONE:
++		{
++			dprintk("%s: FE_SET_TONE\n", __FUNCTION__);
++
++			switch ((fe_sec_tone_mode_t) arg) {
++			case SEC_TONE_ON:
++
++				printk("%s: SEC_TONE_ON, %x\n", __FUNCTION__, SEC_TONE_ON);
++
++				set_tuner_tone(adapter, 1);
++
++				break;
++
++			case SEC_TONE_OFF:
++
++				printk("%s: SEC_TONE_OFF, %x\n", __FUNCTION__, SEC_TONE_OFF);
++
++				set_tuner_tone(adapter, 0);
++
++				break;
++
++			default:
++
++				return -EINVAL;
++			};
++
++			break;
++		}
++
++	default:
++
++		return -EOPNOTSUPP;
++	};
++
++	return 0;
++}
++
++static int skystar2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
++{
++	struct adapter *adapter;
++	struct dvb_adapter *dvb_adapter;
++	struct dvb_demux *dvbdemux;
++
++	int ret;
++
++	if (pdev == NULL)
++		return -ENODEV;
++
++	if (DriverInitialize(pdev) != 0)
++		return -ENODEV;
++
++	dvb_register_adapter(&dvb_adapter, skystar2_pci_driver.name);
++
++	if (dvb_adapter == NULL) {
++		printk("%s: Error registering DVB adapter\n", __FUNCTION__);
++
++		DriverHalt(pdev);
++
++		return -ENODEV;
++	}
++
++	adapter = (struct adapter *) pci_get_drvdata(pdev);
++
++	adapter->dvb_adapter = dvb_adapter;
++
++	init_MUTEX(&adapter->i2c_sem);
++
++	adapter->i2c_bus = dvb_register_i2c_bus(master_xfer, adapter, adapter->dvb_adapter, 0);
++
++	if (!adapter->i2c_bus)
++		return -ENOMEM;
++
++	dvb_add_frontend_ioctls(adapter->dvb_adapter, flexcop_diseqc_ioctl, NULL, adapter);
++
++	dvbdemux = &adapter->demux;
++
++	dvbdemux->priv = (void *) adapter;
++	dvbdemux->filternum = 32;
++	dvbdemux->feednum = 32;
++	dvbdemux->start_feed = dvb_start_feed;
++	dvbdemux->stop_feed = dvb_stop_feed;
++	dvbdemux->write_to_decoder = 0;
++	dvbdemux->dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING | DMX_MEMORY_BASED_FILTERING);
++
++	dvb_dmx_init(&adapter->demux);
++
++	adapter->hw_frontend.source = DMX_FRONTEND_0;
++
++	adapter->dmxdev.filternum = 32;
++	adapter->dmxdev.demux = &dvbdemux->dmx;
++	adapter->dmxdev.capabilities = 0;
++
++	dvb_dmxdev_init(&adapter->dmxdev, adapter->dvb_adapter);
++
++	ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &adapter->hw_frontend);
++	if (ret < 0)
++		return ret;
++
++	adapter->mem_frontend.source = DMX_MEMORY_FE;
++
++	ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &adapter->mem_frontend);
++	if (ret < 0)
++		return ret;
++
++	ret = dvbdemux->dmx.connect_frontend(&dvbdemux->dmx, &adapter->hw_frontend);
++	if (ret < 0)
++		return ret;
++
++	dvb_net_init(adapter->dvb_adapter, &adapter->dvbnet, &dvbdemux->dmx);
++	return 0;
++}
++
++static void skystar2_remove(struct pci_dev *pdev)
++{
++	struct adapter *adapter;
++	struct dvb_demux *dvbdemux;
++
++	if (pdev == NULL)
++		return;
++
++	adapter = pci_get_drvdata(pdev);
++
++	if (adapter != NULL) {
++		dvb_net_release(&adapter->dvbnet);
++		dvbdemux = &adapter->demux;
++
++		dvbdemux->dmx.close(&dvbdemux->dmx);
++		dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &adapter->hw_frontend);
++		dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &adapter->mem_frontend);
++
++		dvb_dmxdev_release(&adapter->dmxdev);
++		dvb_dmx_release(&adapter->demux);
++
++		if (adapter->dvb_adapter != NULL) {
++			dvb_remove_frontend_ioctls(adapter->dvb_adapter, flexcop_diseqc_ioctl, NULL);
++
++			if (adapter->i2c_bus != NULL)
++				dvb_unregister_i2c_bus(master_xfer, adapter->i2c_bus->adapter, adapter->i2c_bus->id);
++
++			dvb_unregister_adapter(adapter->dvb_adapter);
++		}
++
++		DriverHalt(pdev);
++	}
++}
++
++static struct pci_device_id skystar2_pci_tbl[] = {
++	{0x000013D0, 0x00002103, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000},
++	{0,},
++};
++
++static struct pci_driver skystar2_pci_driver = {
++	.name = "Technisat SkyStar2 driver",
++	.id_table = skystar2_pci_tbl,
++	.probe = skystar2_probe,
++	.remove = skystar2_remove,
++};
++
++static int skystar2_init(void)
++{
++	return pci_module_init(&skystar2_pci_driver);
++}
++
++static void skystar2_cleanup(void)
++{
++	pci_unregister_driver(&skystar2_pci_driver);
++}
++
++module_init(skystar2_init);
++module_exit(skystar2_cleanup);
++
++MODULE_DESCRIPTION("Technisat SkyStar2 DVB PCI Driver");
++MODULE_LICENSE("GPL");
+--- linux-2.6.0-test1/drivers/media/dvb/dvb-core/dvb_demux.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/dvb-core/dvb_demux.c	2003-07-19 17:03:49.000000000 -0700
+@@ -403,13 +403,16 @@ void dvb_dmx_swfilter(struct dvb_demux *
+ {
+ 	int p = 0,i, j;
+ 	
++	spin_lock(&demux->lock);
++
+ 	if ((i = demux->tsbufp)) {
+ 		if (count < (j=188-i)) {
+ 			memcpy(&demux->tsbuf[i], buf, count);
+ 			demux->tsbufp += count;
+-			return;
++			goto bailout;
+ 		}
+ 		memcpy(&demux->tsbuf[i], buf, j);
++		if (demux->tsbuf[0] == 0x47)
+ 		dvb_dmx_swfilter_packet(demux, demux->tsbuf);
+ 		demux->tsbufp = 0;
+ 		p += j;
+@@ -424,11 +427,14 @@ void dvb_dmx_swfilter(struct dvb_demux *
+ 				i = count-p;
+ 				memcpy(demux->tsbuf, buf+p, i);
+ 				demux->tsbufp=i;
+-				return;
++				goto bailout;
+ 			}
+ 		} else 
+ 			p++;
+ 	}
++
++bailout:
++	spin_unlock(&demux->lock);
+ }
+ 
+ 
+@@ -1030,9 +1036,11 @@ static int dvbdmx_write(struct dmx_demux
+ 
+ 	if (down_interruptible (&dvbdemux->mutex))
+ 		return -ERESTARTSYS;
+-
+ 	dvb_dmx_swfilter(dvbdemux, buf, count);
+ 	up(&dvbdemux->mutex);
++
++	if (signal_pending(current))
++		return -EINTR;
+ 	return count;
+ }
+ 
+@@ -1110,8 +1118,8 @@ static int dvbdmx_get_pes_pids(struct dm
+ 	return 0;
+ }
+ 
+-int 
+-dvb_dmx_init(struct dvb_demux *dvbdemux)
++
++int dvb_dmx_init(struct dvb_demux *dvbdemux)
+ {
+ 	int i, err;
+ 	struct dmx_demux *dmx = &dvbdemux->dmx;
+@@ -1181,8 +1189,8 @@ dvb_dmx_init(struct dvb_demux *dvbdemux)
+ 	return 0;
+ }
+ 
+-int 
+-dvb_dmx_release(struct dvb_demux *dvbdemux)
++
++int dvb_dmx_release(struct dvb_demux *dvbdemux)
+ {
+ 	struct dmx_demux *dmx = &dvbdemux->dmx;
+ 
+--- linux-2.6.0-test1/drivers/media/dvb/dvb-core/dvbdev.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/dvb-core/dvbdev.c	2003-07-19 17:03:49.000000000 -0700
+@@ -29,8 +29,6 @@
+ #include <linux/sched.h>
+ #include <linux/init.h>
+ #include <linux/slab.h>
+-#include <linux/version.h>
+-#include <asm/semaphore.h>
+ 
+ #include "dvbdev.h"
+ #include "dvb_functions.h"
+--- linux-2.6.0-test1/drivers/media/dvb/dvb-core/dvbdev.h	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/dvb-core/dvbdev.h	2003-07-19 17:03:49.000000000 -0700
+@@ -27,8 +27,9 @@
+ #include <linux/types.h>
+ #include <linux/poll.h>
+ #include <linux/fs.h>
+-#include <linux/devfs_fs_kernel.h>
+ #include <linux/list.h>
++#include <linux/version.h>
++#include <linux/devfs_fs_kernel.h>
+ 
+ #define DVB_MAJOR 250
+ 
+@@ -48,6 +49,7 @@ struct dvb_adapter {
+ 	struct list_head list_head;
+ 	struct list_head device_list;
+ 	const char *name;
++	u8 proposed_mac [6];
+ };
+ 
+ 
+--- linux-2.6.0-test1/drivers/media/dvb/dvb-core/dvb_frontend.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/dvb-core/dvb_frontend.c	2003-07-19 17:03:49.000000000 -0700
+@@ -263,8 +263,14 @@ static int dvb_frontend_get_event (struc
+                 if (flags & O_NONBLOCK)
+                         return -EWOULDBLOCK;
+ 
++		up(&fe->sem);
++
+                 ret = wait_event_interruptible (events->wait_queue,
+                                                 events->eventw != events->eventr);
++
++        	if (down_interruptible (&fe->sem))
++			return -ERESTARTSYS;
++
+                 if (ret < 0)
+                         return ret;
+         }
+--- linux-2.6.0-test1/drivers/media/dvb/dvb-core/dvb_functions.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/dvb-core/dvb_functions.c	2003-07-19 17:03:49.000000000 -0700
+@@ -1,11 +1,11 @@
+ #include <linux/version.h>
+-#include <linux/string.h>
+-#include <linux/smp_lock.h>
+-#include <linux/fs.h>
+ #include <linux/errno.h>
++#include <linux/fs.h>
++#include <linux/string.h>
+ #include <linux/module.h>
+ #include <linux/ioctl.h>
+ #include <linux/slab.h>
++#include <linux/smp_lock.h>
+ #include <asm/uaccess.h>
+ 
+ void dvb_kernel_thread_setup (const char *thread_name)
+--- linux-2.6.0-test1/drivers/media/dvb/dvb-core/dvb_functions.h	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/dvb-core/dvb_functions.h	2003-07-19 17:03:49.000000000 -0700
+@@ -1,6 +1,8 @@
+ #ifndef __DVB_FUNCTIONS_H__
+ #define __DVB_FUNCTIONS_H__
+ 
++#include <linux/version.h>
++
+ /**
+  *  a sleeping delay function, waits i ms
+  *
+--- linux-2.6.0-test1/drivers/media/dvb/dvb-core/dvb_net.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/dvb-core/dvb_net.c	2003-07-19 17:03:49.000000000 -0700
+@@ -24,22 +24,25 @@
+  * 
+  */
+ 
+-#include <linux/errno.h>
+-#include <linux/kernel.h>
+-#include <linux/string.h>
+-#include <linux/ioctl.h>
+-#include <linux/slab.h>
+-#include <asm/uaccess.h>
+-
+ #include <linux/dvb/net.h>
++#include <asm/uaccess.h>
+ 
+ #include "dvb_demux.h"
+ #include "dvb_net.h"
+ #include "dvb_functions.h"
+ 
++
++#if 1
++#define dprintk(x...) printk(x)
++#else
++#define dprintk(x...)
++#endif
++
++
+ #define DVB_NET_MULTICAST_MAX 10
+ 
+ struct dvb_net_priv {
++	int in_use;
+         struct net_device_stats stats;
+         char name[6];
+ 	u16 pid;
+@@ -49,10 +52,17 @@ struct dvb_net_priv {
+ 	int multi_num;
+ 	struct dmx_section_filter *multi_secfilter[DVB_NET_MULTICAST_MAX];
+ 	unsigned char multi_macs[DVB_NET_MULTICAST_MAX][6];
+-	int mode;
++	int rx_mode;
++#define RX_MODE_UNI 0
++#define RX_MODE_MULTI 1
++#define RX_MODE_ALL_MULTI 2
++#define RX_MODE_PROMISC 3
++	struct work_struct set_multicast_list_wq;
++	struct work_struct restart_net_feed_wq;
+ };
+ 
+-/*
++
++/**
+  *	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.
+  *	This is normal practice and works for any 'now in use' protocol.
+@@ -60,8 +70,8 @@ struct dvb_net_priv {
+  *  stolen from eth.c out of the linux kernel, hacked for dvb-device
+  *  by Michael Holzt <kju@debian.org>
+  */
+- 
+-unsigned short my_eth_type_trans(struct sk_buff *skb, struct net_device *dev)
++static unsigned short dvb_net_eth_type_trans(struct sk_buff *skb,
++				      struct net_device *dev)
+ {
+ 	struct ethhdr *eth;
+ 	unsigned char *rawp;
+@@ -70,8 +80,7 @@ unsigned short my_eth_type_trans(struct 
+ 	skb_pull(skb,dev->hard_header_len);
+ 	eth= skb->mac.ethernet;
+ 	
+-	if(*eth->h_dest&1)
+-	{
++	if (*eth->h_dest & 1) {
+ 		if(memcmp(eth->h_dest,dev->broadcast, ETH_ALEN)==0)
+ 			skb->pkt_type=PACKET_BROADCAST;
+ 		else
+@@ -83,7 +92,7 @@ unsigned short my_eth_type_trans(struct 
+ 		
+ 	rawp = skb->data;
+ 	
+-	/*
++	/**
+ 	 *	This is a magic hack to spot IPX packets. Older Novell breaks
+ 	 *	the protocol design and runs IPX over 802.3 without an 802.2 LLC
+ 	 *	layer. We look for FFFF which isn't a used 802.2 SSAP/DSAP. This
+@@ -92,42 +101,73 @@ unsigned short my_eth_type_trans(struct 
+ 	if (*(unsigned short *)rawp == 0xFFFF)
+ 		return htons(ETH_P_802_3);
+ 		
+-	/*
++	/**
+ 	 *	Real 802.2 LLC
+ 	 */
+ 	return htons(ETH_P_802_2);
+ }
+ 
+-static void dvb_net_sec(struct net_device *dev, const u8 *pkt, int pkt_len)
++
++static void dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len)
+ {
+         u8 *eth;
+         struct sk_buff *skb;
+ 
+-        if (pkt_len<13) {
+-                printk("%s: IP/MPE packet length = %d too small.\n", dev->name, pkt_len);
++	/* note: pkt_len includes a 32bit checksum */
++	if (pkt_len < 16) {
++		printk("%s: IP/MPE packet length = %d too small.\n",
++			dev->name, pkt_len);
++		((struct dvb_net_priv *) dev->priv)->stats.rx_errors++;
++		((struct dvb_net_priv *) dev->priv)->stats.rx_length_errors++;
++		return;
++	}
++	if ((pkt[5] & 0xfd) != 0xc1) {
++		/* drop scrambled or broken packets */
++		((struct dvb_net_priv *) dev->priv)->stats.rx_errors++;
++		((struct dvb_net_priv *) dev->priv)->stats.rx_crc_errors++;
+ 		return;
+ 	}
+-        skb = dev_alloc_skb(pkt_len+2);
+-        if (skb == NULL) {
+-                printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n",
+-                       dev->name);
++	if (pkt[5] & 0x02) {
++		//FIXME: handle LLC/SNAP
+                 ((struct dvb_net_priv *)dev->priv)->stats.rx_dropped++;
+                 return;
+         }
+-        eth=(u8 *) skb_put(skb, pkt_len+2);
+-        memcpy(eth+14, (void*)pkt+12, pkt_len-12);
++	if (pkt[7]) {
++		/* FIXME: assemble datagram from multiple sections */
++		((struct dvb_net_priv *) dev->priv)->stats.rx_errors++;
++		((struct dvb_net_priv *) dev->priv)->stats.rx_frame_errors++;
++		return;
++	}
+ 
++	/* we have 14 byte ethernet header (ip header follows);
++	 * 12 byte MPE header; 4 byte checksum; + 2 byte alignment
++	 */
++	if (!(skb = dev_alloc_skb(pkt_len - 4 - 12 + 14 + 2))) {
++		//printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n", dev->name);
++		((struct dvb_net_priv *) dev->priv)->stats.rx_dropped++;
++		return;
++	}
++	skb_reserve(skb, 2);    /* longword align L3 header */
++	skb->dev = dev;
++
++	/* copy L3 payload */
++	eth = (u8 *) skb_put(skb, pkt_len - 12 - 4 + 14);
++	memcpy(eth + 14, pkt + 12, pkt_len - 12 - 4);
++
++	/* create ethernet header: */
+         eth[0]=pkt[0x0b];
+         eth[1]=pkt[0x0a];
+         eth[2]=pkt[0x09];
+         eth[3]=pkt[0x08];
+         eth[4]=pkt[0x04];
+         eth[5]=pkt[0x03];
++
+         eth[6]=eth[7]=eth[8]=eth[9]=eth[10]=eth[11]=0;
+-        eth[12]=0x08; eth[13]=0x00;
+ 
+-	skb->protocol=my_eth_type_trans(skb,dev);
+-        skb->dev=dev;
++	eth[12] = 0x08;	/* ETH_P_IP */
++	eth[13] = 0x00;
++
++	skb->protocol = dvb_net_eth_type_trans(skb, dev);
+         
+         ((struct dvb_net_priv *)dev->priv)->stats.rx_packets++;
+         ((struct dvb_net_priv *)dev->priv)->stats.rx_bytes+=skb->len;
+@@ -141,9 +181,11 @@ static int dvb_net_callback(const u8 *bu
+ {
+         struct net_device *dev=(struct net_device *) filter->priv;
+ 
+-	/* FIXME: this only works if exactly one complete section is
+-	          delivered in buffer1 only */
+-	dvb_net_sec(dev, buffer1, buffer1_len);
++	/**
++	 * we rely on the DVB API definition where exactly one complete
++	 * section is delivered in buffer1
++	 */
++	dvb_net_sec (dev, (u8*) buffer1, buffer1_len);
+ 	return 0;
+ }
+ 
+@@ -178,24 +220,27 @@ static int dvb_net_filter_set(struct net
+ 	memset((*secfilter)->filter_mode,  0xff, DMX_MAX_FILTER_SIZE);
+ 
+ 	(*secfilter)->filter_value[0]=0x3e;
+-	(*secfilter)->filter_mask[0]=0xff;
+-
+ 	(*secfilter)->filter_value[3]=mac[5];
+-	(*secfilter)->filter_mask[3]=mac_mask[5];
+ 	(*secfilter)->filter_value[4]=mac[4];
+-	(*secfilter)->filter_mask[4]=mac_mask[4];
+ 	(*secfilter)->filter_value[8]=mac[3];
+-	(*secfilter)->filter_mask[8]=mac_mask[3];
+ 	(*secfilter)->filter_value[9]=mac[2];
+-	(*secfilter)->filter_mask[9]=mac_mask[2];
+-
+ 	(*secfilter)->filter_value[10]=mac[1];
+-	(*secfilter)->filter_mask[10]=mac_mask[1];
+ 	(*secfilter)->filter_value[11]=mac[0];
++
++	(*secfilter)->filter_mask[0] = 0xff;
++	(*secfilter)->filter_mask[3] = mac_mask[5];
++	(*secfilter)->filter_mask[4] = mac_mask[4];
++	(*secfilter)->filter_mask[8] = mac_mask[3];
++	(*secfilter)->filter_mask[9] = mac_mask[2];
++	(*secfilter)->filter_mask[10] = mac_mask[1];
+ 	(*secfilter)->filter_mask[11]=mac_mask[0];
+ 
+-	printk("%s: filter mac=%02x %02x %02x %02x %02x %02x\n", 
++	dprintk("%s: filter mac=%02x %02x %02x %02x %02x %02x\n",
+ 	       dev->name, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
++	dprintk("%s: filter mask=%02x %02x %02x %02x %02x %02x\n",
++	       dev->name, mac_mask[0], mac_mask[1], mac_mask[2],
++	       mac_mask[3], mac_mask[4], mac_mask[5]);
++
+ 	return 0;
+ }
+ 
+@@ -206,46 +251,57 @@ static int dvb_net_feed_start(struct net
+         struct dmx_demux *demux = priv->demux;
+         unsigned char *mac = (unsigned char *) dev->dev_addr;
+ 		
++	dprintk("%s: rx_mode %i\n", __FUNCTION__, priv->rx_mode);
++	if (priv->secfeed || priv->secfilter || priv->multi_secfilter[0])
++		printk("%s: BUG %d\n", __FUNCTION__, __LINE__);
++
+ 	priv->secfeed=0;
+ 	priv->secfilter=0;
+ 
++	dprintk("%s: alloc secfeed\n", __FUNCTION__);
+ 	ret=demux->allocate_section_feed(demux, &priv->secfeed, 
+ 					 dvb_net_callback);
+ 	if (ret<0) {
+-		printk("%s: could not get section feed\n", dev->name);
++		printk("%s: could not allocate section feed\n", dev->name);
+ 		return ret;
+ 	}
+ 
+-	ret=priv->secfeed->set(priv->secfeed, priv->pid, 32768, 0, 0);
++	ret = priv->secfeed->set(priv->secfeed, priv->pid, 32768, 0, 1);
++
+ 	if (ret<0) {
+ 		printk("%s: could not set section feed\n", dev->name);
+-		priv->demux->
+-		        release_section_feed(priv->demux, priv->secfeed);
++		priv->demux->release_section_feed(priv->demux, priv->secfeed);
+ 		priv->secfeed=0;
+ 		return ret;
+ 	}
+-	/* fixme: is this correct? */
+-	try_module_get(THIS_MODULE);
+ 
+-	if (priv->mode<3) 
++	if (priv->rx_mode != RX_MODE_PROMISC) {
++		dprintk("%s: set secfilter\n", __FUNCTION__);
+ 		dvb_net_filter_set(dev, &priv->secfilter, mac, mask_normal);
++	}
+ 
+-	switch (priv->mode) {
+-	case 1:
+-		for (i=0; i<priv->multi_num; i++) 
++	switch (priv->rx_mode) {
++	case RX_MODE_MULTI:
++		for (i = 0; i < priv->multi_num; i++) {
++			dprintk("%s: set multi_secfilter[%d]\n", __FUNCTION__, i);
+ 			dvb_net_filter_set(dev, &priv->multi_secfilter[i],
+ 					   priv->multi_macs[i], mask_normal);
++		}
+ 		break;
+-	case 2:
++	case RX_MODE_ALL_MULTI:
+ 		priv->multi_num=1;
+-		dvb_net_filter_set(dev, &priv->multi_secfilter[0], mac_allmulti, mask_allmulti);
++		dprintk("%s: set multi_secfilter[0]\n", __FUNCTION__);
++		dvb_net_filter_set(dev, &priv->multi_secfilter[0],
++				   mac_allmulti, mask_allmulti);
+ 		break;
+-	case 3:
++	case RX_MODE_PROMISC:
+ 		priv->multi_num=0;
++		dprintk("%s: set secfilter\n", __FUNCTION__);
+ 		dvb_net_filter_set(dev, &priv->secfilter, mac, mask_promisc);
+ 		break;
+ 	}
+ 	
++	dprintk("%s: start filtering\n", __FUNCTION__);
+ 	priv->secfeed->start_filtering(priv->secfeed);
+ 	return 0;
+ }
+@@ -255,89 +311,93 @@ static void dvb_net_feed_stop(struct net
+ 	struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
+ 	int i;
+ 
++	dprintk("%s\n", __FUNCTION__);
+         if (priv->secfeed) {
+-	        if (priv->secfeed->is_filtering)
++		if (priv->secfeed->is_filtering) {
++			dprintk("%s: stop secfeed\n", __FUNCTION__);
+ 		        priv->secfeed->stop_filtering(priv->secfeed);
+-	        if (priv->secfilter)
+-		        priv->secfeed->
+-			        release_filter(priv->secfeed, 
++		}
++
++		if (priv->secfilter) {
++			dprintk("%s: release secfilter\n", __FUNCTION__);
++			priv->secfeed->release_filter(priv->secfeed,
+ 					       priv->secfilter);
+ 		priv->secfilter=0;
++		}
+ 
+ 		for (i=0; i<priv->multi_num; i++) {
+-			if (priv->multi_secfilter[i])
+-				priv->secfeed->
+-					release_filter(priv->secfeed, 
++			if (priv->multi_secfilter[i]) {
++				dprintk("%s: release multi_filter[%d]\n", __FUNCTION__, i);
++				priv->secfeed->release_filter(priv->secfeed,
+ 						       priv->multi_secfilter[i]);
+ 			priv->multi_secfilter[i]=0;
+ 		}
+-		priv->demux->
+-		        release_section_feed(priv->demux, priv->secfeed);
++		}
++
++		priv->demux->release_section_feed(priv->demux, priv->secfeed);
+ 		priv->secfeed=0;
+-		/* fixme: is this correct? */
+-		module_put(THIS_MODULE);
+ 	} else
+ 		printk("%s: no feed to stop\n", dev->name);
+ }
+ 
+-static int dvb_add_mc_filter(struct net_device *dev, struct dev_mc_list *mc)
++
++static int dvb_set_mc_filter (struct net_device *dev, struct dev_mc_list *mc)
+ {
+ 	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;
+ 
+-	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 ret;
++	return 0;
+ }
+ 
+-static void dvb_net_set_multi(struct net_device *dev)
++
++static void wq_set_multicast_list (void *data)
+ {
++	struct net_device *dev = data;
+ 	struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
+-	struct dev_mc_list *mc;
+-	int mci;
+-	int update = 0;
++
++	dvb_net_feed_stop(dev);
++
++	priv->rx_mode = RX_MODE_UNI;
+ 	
+ 	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;
++		dprintk("%s: promiscuous mode\n", dev->name);
++		priv->rx_mode = RX_MODE_PROMISC;
++	} else if ((dev->flags & IFF_ALLMULTI)) {
++		dprintk("%s: allmulti mode\n", dev->name);
++		priv->rx_mode = RX_MODE_ALL_MULTI;
++	} else if (dev->mc_count) {
++		int mci;
++		struct dev_mc_list *mc;
++
++		dprintk("%s: set_mc_list, %d entries\n",
++			dev->name, dev->mc_count);
++
++		priv->rx_mode = RX_MODE_MULTI;
+ 		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;
++		     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);
+ 	}
++
++
++static void dvb_net_set_multicast_list (struct net_device *dev)
++{
++	struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
++	schedule_work(&priv->set_multicast_list_wq);
+ }
+ 
++
+ static int dvb_net_set_config(struct net_device *dev, struct ifmap *map)
+ {
+ 	if (netif_running(dev))
+@@ -345,29 +405,47 @@ static int dvb_net_set_config(struct net
+ 	return 0;
+ }
+ 
+-static int dvb_net_set_mac(struct net_device *dev, void *p)
++
++static void wq_restart_net_feed (void *data)
+ {
+-	struct sockaddr *addr=p;
+-	int update;
++	struct net_device *dev = data;
+ 
+-	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) != 0 && update > 0) {
++	if (netif_running(dev)) {
+ 		dvb_net_feed_stop(dev);
+ 		dvb_net_feed_start(dev);
+ 	}
++}
++
++
++static int dvb_net_set_mac (struct net_device *dev, void *p)
++{
++	struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
++	struct sockaddr *addr=p;
++
++	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
++
++	if (netif_running(dev))
++		schedule_work(&priv->restart_net_feed_wq);
++
+ 	return 0;
+ }
+ 
+ 
+ static int dvb_net_open(struct net_device *dev)
+ {
++	struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
++
++	priv->in_use++;
+ 	dvb_net_feed_start(dev);
+ 	return 0;
+ }
+ 
++
+ static int dvb_net_stop(struct net_device *dev)
+ {
++	struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
++
++	priv->in_use--;
+         dvb_net_feed_stop(dev);
+ 	return 0;
+ }
+@@ -386,16 +464,14 @@ static int dvb_net_init_dev(struct net_d
+ 	dev->stop		= dvb_net_stop;
+ 	dev->hard_start_xmit	= dvb_net_tx;
+ 	dev->get_stats		= dvb_net_get_stats;
+-	dev->set_multicast_list = dvb_net_set_multi;
++	dev->set_multicast_list = dvb_net_set_multicast_list;
+ 	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;
+ 
+-	//SET_MODULE_OWNER(dev);
++	dev->flags |= IFF_NOARP;
+ 	
+ 	return 0;
+ }
+@@ -404,18 +480,19 @@ static int get_if(struct dvb_net *dvbnet
+ {
+ 	int i;
+ 
+-	for (i=0; i<dvbnet->dev_num; i++) 
++	for (i=0; i<DVB_NET_DEVICES_MAX; i++)
+ 		if (!dvbnet->state[i])
+ 			break;
+-	if (i==dvbnet->dev_num)
++
++	if (i == DVB_NET_DEVICES_MAX)
+ 		return -1;
++
+ 	dvbnet->state[i]=1;
+ 	return i;
+ }
+ 
+ 
+-int 
+-dvb_net_add_if(struct dvb_net *dvbnet, u16 pid)
++static int dvb_net_add_if(struct dvb_net *dvbnet, u16 pid)
+ {
+         struct net_device *net;
+ 	struct dmx_demux *demux;
+@@ -423,59 +500,63 @@ dvb_net_add_if(struct dvb_net *dvbnet, u
+ 	int result;
+ 	int if_num;
+  
+-	if_num=get_if(dvbnet);
+-	if (if_num<0)
++	if ((if_num = get_if(dvbnet)) < 0)
+ 		return -EINVAL;
+ 
+ 	net=&dvbnet->device[if_num];
+ 	demux=dvbnet->demux;
+ 	
+-	net->base_addr = 0;
+-	net->irq       = 0;
+-	net->dma       = 0;
+-	net->mem_start = 0;
++	memset(net, 0, sizeof(struct net_device));
++
+         memcpy(net->name, "dvb0_0", 7);
+-        net->name[3]=dvbnet->card_num+0x30;
+-        net->name[5]=if_num+0x30;
++	net->name[3]   = dvbnet->dvbdev->adapter->num + '0';
++	net->name[5]   = if_num + '0';
++	net->addr_len  = 6;
++	memcpy(net->dev_addr, dvbnet->dvbdev->adapter->proposed_mac, 6);
+         net->next      = NULL;
+         net->init      = dvb_net_init_dev;
+-        net->priv      = kmalloc(sizeof(struct dvb_net_priv), GFP_KERNEL);
+-	if (net->priv == NULL)
++
++	if (!(net->priv = kmalloc(sizeof(struct dvb_net_priv), GFP_KERNEL)))
+ 			return -ENOMEM;
+ 
+ 	priv = net->priv;
+ 	memset(priv, 0, sizeof(struct dvb_net_priv));
+         priv->demux = demux;
+         priv->pid = pid;
+-	priv->mode = 0;
++	priv->rx_mode = RX_MODE_UNI;
++
++	INIT_WORK(&priv->set_multicast_list_wq, wq_set_multicast_list, net);
++	INIT_WORK(&priv->restart_net_feed_wq, wq_restart_net_feed, net);
+ 
+         net->base_addr = pid;
+                 
+ 	if ((result = register_netdev(net)) < 0) {
+ 		return result;
+ 	}
+-	/* fixme: is this correct? */
+-	try_module_get(THIS_MODULE);
+ 
+         return if_num;
+ }
+ 
+-int 
+-dvb_net_remove_if(struct dvb_net *dvbnet, int num)
++
++static int dvb_net_remove_if(struct dvb_net *dvbnet, int num)
+ {
++	struct dvb_net_priv *priv = dvbnet->device[num].priv;
++
+ 	if (!dvbnet->state[num])
+ 		return -EINVAL;
++	if (priv->in_use)
++		return -EBUSY;
++
+ 	dvb_net_stop(&dvbnet->device[num]);
+-        kfree(dvbnet->device[num].priv);
++	flush_scheduled_work();
++	kfree(priv);
+         unregister_netdev(&dvbnet->device[num]);
+ 	dvbnet->state[num]=0;
+-	/* fixme: is this correct? */
+-	module_put(THIS_MODULE);
+-
+ 	return 0;
+ }
+ 
+-int dvb_net_do_ioctl(struct inode *inode, struct file *file, 
++
++static 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;
+@@ -490,6 +571,8 @@ int dvb_net_do_ioctl(struct inode *inode
+ 		struct dvb_net_if *dvbnetif=(struct dvb_net_if *)parg;
+ 		int result;
+ 		
++		if (!capable(CAP_SYS_ADMIN))
++			return -EPERM;
+ 		result=dvb_net_add_if(dvbnet, dvbnetif->pid);
+ 		if (result<0)
+ 			return result;
+@@ -502,7 +585,7 @@ int dvb_net_do_ioctl(struct inode *inode
+ 		struct dvb_net_priv *priv_data;
+ 		struct dvb_net_if *dvbnetif=(struct dvb_net_if *)parg;
+ 
+-		if (dvbnetif->if_num >= dvbnet->dev_num ||
++		if (dvbnetif->if_num >= DVB_NET_DEVICES_MAX ||
+ 		    !dvbnet->state[dvbnetif->if_num])
+ 			return -EFAULT;
+ 
+@@ -512,7 +595,9 @@ int dvb_net_do_ioctl(struct inode *inode
+ 		break;
+ 	}
+ 	case NET_REMOVE_IF:
+-		return dvb_net_remove_if(dvbnet, (long) parg);
++		if (!capable(CAP_SYS_ADMIN))
++			return -EPERM;
++		return dvb_net_remove_if(dvbnet, (int) parg);
+ 	default:
+ 		return -EINVAL;
+ 	}
+@@ -542,28 +627,29 @@ static struct dvb_device dvbdev_net = {
+         .fops = &dvb_net_fops,
+ };
+ 
+-void
+-dvb_net_release(struct dvb_net *dvbnet)
++
++void dvb_net_release (struct dvb_net *dvbnet)
+ {
+ 	int i;
+ 
+ 	dvb_unregister_device(dvbnet->dvbdev);
+-	for (i=0; i<dvbnet->dev_num; i++) {
++
++	for (i=0; i<DVB_NET_DEVICES_MAX; i++) {
+ 		if (!dvbnet->state[i])
+ 			continue;
+ 		dvb_net_remove_if(dvbnet, i);
+ 	}
+ }
+ 
+-int
+-dvb_net_init(struct dvb_adapter *adap, struct dvb_net *dvbnet, struct dmx_demux *dmx)
++
++int dvb_net_init (struct dvb_adapter *adap, struct dvb_net *dvbnet,
++		  struct dmx_demux *dmx)
+ {
+ 	int i;
+ 		
+ 	dvbnet->demux = dmx;
+-	dvbnet->dev_num = DVB_NET_DEVICES_MAX;
+ 
+-	for (i=0; i<dvbnet->dev_num; i++) 
++	for (i=0; i<DVB_NET_DEVICES_MAX; i++)
+ 		dvbnet->state[i] = 0;
+ 
+ 	dvb_register_device (adap, &dvbnet->dvbdev, &dvbdev_net,
+--- linux-2.6.0-test1/drivers/media/dvb/dvb-core/dvb_net.h	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/dvb-core/dvb_net.h	2003-07-19 17:03:49.000000000 -0700
+@@ -35,8 +35,6 @@
+ 
+ struct dvb_net {
+ 	struct dvb_device *dvbdev;
+-	int card_num;
+-	int dev_num;
+ 	struct net_device device[DVB_NET_DEVICES_MAX];
+ 	int state[DVB_NET_DEVICES_MAX];
+ 	struct dmx_demux *demux;
+--- linux-2.6.0-test1/drivers/media/dvb/frontends/alps_bsrv2.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/frontends/alps_bsrv2.c	2003-07-19 17:03:49.000000000 -0700
+@@ -55,7 +55,7 @@ static u8 init_1893_tab [] = {
+         0x01, 0xA4, 0x35, 0x81, 0x2A, 0x0d, 0x55, 0xC4,
+         0x09, 0x69, 0x00, 0x86, 0x4c, 0x28, 0x7F, 0x00,
+         0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+-        0x80, 0x00, 0x31, 0xb0, 0x14, 0x00, 0xDC, 0x20,
++        0x80, 0x00, 0x31, 0xb0, 0x14, 0x00, 0xDC, 0x00,
+         0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x55, 0x00, 0x00, 0x7f, 0x00
+@@ -158,6 +158,11 @@ static int ves1893_set_inversion (struct
+ {
+ 	u8 val;
+ 
++	/*
++	 * inversion on/off are interchanged because i and q seem to
++	 * be swapped on the hardware
++	 */
++
+ 	switch (inversion) {
+ 	case INVERSION_OFF:
+ 		val = 0xc0;
+@@ -166,13 +171,16 @@ static int ves1893_set_inversion (struct
+ 		val = 0x80;
+ 		break;
+ 	case INVERSION_AUTO:
+-		val = 0x40;
++		val = 0x00;
+ 		break;
+ 	default:
+ 		return -EINVAL;
+ 	}
+ 
+-	return ves1893_writereg (i2c, 0x0c, (init_1893_tab[0x0c] & 0x3f) | val);
++	/* needs to be saved for FE_GET_FRONTEND */
++	init_1893_tab[0x0c] = (init_1893_tab[0x0c] & 0x3f) | val;
++
++	return ves1893_writereg (i2c, 0x0c, init_1893_tab[0x0c]);
+ }
+ 
+ 
+@@ -383,8 +391,14 @@ static int bsrv2_ioctl (struct dvb_front
+ 		afc = (afc * (int)(p->u.qpsk.symbol_rate/1000/8))/16;
+ 
+ 		p->frequency -= afc;
++
++		/*
++		 * inversion indicator is only valid
++		 * if auto inversion was used
++		 */
++		if (!(init_1893_tab[0x0c] & 0x80))
+ 		p->inversion = (ves1893_readreg (i2c, 0x0f) & 2) ? 
+-					INVERSION_ON : INVERSION_OFF;
++					INVERSION_OFF : INVERSION_ON;
+ 		p->u.qpsk.fec_inner = ves1893_get_fec (i2c);
+ 	/*  XXX FIXME: timing offset !! */
+ 		break;
+--- linux-2.6.0-test1/drivers/media/dvb/frontends/alps_tdlb7.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/frontends/alps_tdlb7.c	2003-07-19 17:03:49.000000000 -0700
+@@ -349,6 +349,9 @@ static int tdlb7_ioctl (struct dvb_front
+ 
+ 		sp5659_set_tv_freq (i2c, p->frequency);
+ 
++		// read status reg in order to clear pending irqs
++		sp8870_readreg(i2c, 0x200);
++
+ 		// sample rate correction bit [23..17]
+ 		sp8870_writereg(i2c,0x0319,0x000A);
+ 		
+--- linux-2.6.0-test1/drivers/media/dvb/frontends/grundig_29504-401.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/frontends/grundig_29504-401.c	2003-07-19 17:03:49.000000000 -0700
+@@ -37,15 +37,15 @@ static int debug = 0;
+ 
+ 
+ struct dvb_frontend_info grundig_29504_401_info = {
+-	.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 | 
++	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*/
+@@ -109,15 +109,15 @@ static int tsa5060_set_tv_freq (struct d
+ 	div = (36125000 + freq) / 166666;
+ 	cfg = 0x88;
+ 
+-	cpump = div < 175000000 ? 2 : div < 390000000 ? 1 :
+-		div < 470000000 ? 2 : div < 750000000 ? 1 : 3;
++	cpump = freq < 175000000 ? 2 : freq < 390000000 ? 1 :
++		freq < 470000000 ? 2 : freq < 750000000 ? 1 : 3;
+ 
+-	band_select = div < 175000000 ? 0x0e : div < 470000000 ? 0x05 : 0x03;
++	band_select = freq < 175000000 ? 0x0e : freq < 470000000 ? 0x05 : 0x03;
+ 
+ 	buf [0] = (div >> 8) & 0x7f;
+ 	buf [1] = div & 0xff;
+ 	buf [2] = ((div >> 10) & 0x60) | cfg;
+-	buf [3] = cpump | band_select;
++	buf [3] = (cpump << 6) | band_select;
+ 
+ 	return tsa5060_write (i2c, buf);
+ }
+@@ -267,12 +267,12 @@ static int apply_frontend_param (struct 
+ }
+ 
+ 
+-static void reset_and_configure (struct dvb_i2c_bus *i2c)
++static int reset_and_configure (struct dvb_i2c_bus *i2c)
+ {
+ 	u8 buf [] = { 0x06 };
+ 	struct i2c_msg msg = { .addr = 0x00, .flags = 0, .buf = buf, .len = 1 };
+ 
+-	i2c->xfer (i2c, &msg, 1);
++	return (i2c->xfer (i2c, &msg, 1) == 1) ? 0 : -ENODEV;
+ }
+ 
+ 
+@@ -391,7 +391,7 @@ int grundig_29504_401_ioctl (struct dvb_
+ 		struct dvb_frontend_parameters *p = arg;
+ 
+ 		tsa5060_set_tv_freq (i2c, p->frequency);
+-		apply_frontend_param (i2c, p);
++		return apply_frontend_param (i2c, p);
+ 	}
+         case FE_GET_FRONTEND:
+ 		/*  we could correct the frequency here, but...
+@@ -417,25 +417,61 @@ int grundig_29504_401_ioctl (struct dvb_
+ 
+ static int l64781_attach (struct dvb_i2c_bus *i2c)
+ {
++	u8 reg0x3e;
+ 	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 } };
+ 
+-	if (i2c->xfer (i2c, msg, 2) == 2)   /*  probably an EEPROM... */
++	/**
++	 *  the L64781 won't show up before we send the reset_and_configure()
++	 *  broadcast. If nothing responds there is no L64781 on the bus...
++	 */
++	if (reset_and_configure(i2c) < 0) {
++		dprintk("no response on reset_and_configure() broadcast, bailing out...\n");
+ 		return -ENODEV;
++	}
+ 
+-	reset_and_configure (i2c);
+-
+-	if (i2c->xfer (i2c, msg, 2) != 2)   /*  nothing... */
++	/* The chip always responds to reads */
++	if (i2c->xfer(i2c, msg, 2) != 2) {  
++	        dprintk("no response to read on I2C bus\n");
+ 		return -ENODEV;
++	}
+ 
+-	if (b1[0] != 0xa1)
++	/* Save current register contents for bailout */
++	reg0x3e = l64781_readreg(i2c, 0x3e);
++
++	/* Reading the POWER_DOWN register always returns 0 */
++	if (reg0x3e != 0) {
++	        dprintk("Device doesn't look like L64781\n");
+ 		return -ENODEV;
++	}
++
++	/* Turn the chip off */
++	l64781_writereg (i2c, 0x3e, 0x5a);
++
++	/* Responds to all reads with 0 */
++	if (l64781_readreg(i2c, 0x1a) != 0) {
++ 	        dprintk("Read 1 returned unexpcted value\n");
++	        goto bailout;
++	}	  
++
++	/* Turn the chip on */
++	l64781_writereg (i2c, 0x3e, 0xa5);
++	
++	/* Responds with register default value */
++	if (l64781_readreg(i2c, 0x1a) != 0xa1) { 
++ 	        dprintk("Read 2 returned unexpcted value\n");
++	        goto bailout;
++	}
+ 
+ 	dvb_register_frontend (grundig_29504_401_ioctl, i2c, NULL,
+ 			       &grundig_29504_401_info);
+ 	return 0;
++
++ bailout:
++	l64781_writereg (i2c, 0x3e, reg0x3e);  /* restore reg 0x3e */
++	return -ENODEV;
+ }
+ 
+ 
+--- linux-2.6.0-test1/drivers/media/dvb/frontends/grundig_29504-491.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/frontends/grundig_29504-491.c	2003-07-19 17:03:49.000000000 -0700
+@@ -179,10 +179,7 @@ static fe_code_rate_t tda8083_get_fec (s
+ 	static fe_code_rate_t fec_tab [] = { FEC_8_9, FEC_1_2, FEC_2_3, FEC_3_4,
+ 				       FEC_4_5, FEC_5_6, FEC_6_7, FEC_7_8 };
+ 
+-	index = tda8083_readreg (i2c, 0x0e) & 0x3;
+-
+-	if (index > 7)
+-		return FEC_NONE;
++	index = tda8083_readreg(i2c, 0x0e) & 0x07;
+ 
+ 	return fec_tab [index];
+ }
+--- linux-2.6.0-test1/drivers/media/dvb/frontends/Kconfig	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/frontends/Kconfig	2003-07-19 17:03:49.000000000 -0700
+@@ -93,6 +93,16 @@ config DVB_GRUNDIG_29504_401
+ 	  DVB adapter simply enable all supported frontends, the 
+ 	  right one will get autodetected.
+ 
++config DVB_MT312
++	tristate "Zarlink MT312 Satellite Channel Decoder (QPSK)"
++	depends on DVB_CORE
++	help
++	  A DVB-S 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 
++	  right one will get autodetected.
++
+ config DVB_VES1820
+ 	tristate "Frontends with external VES1820 demodulator (QAM)"
+ 	depends on DVB_CORE
+@@ -105,3 +115,23 @@ config DVB_VES1820
+ 	  DVB adapter simply enable all supported frontends, the 
+ 	  right one will get autodetected.
+ 
++config DVB_TDA1004X
++	tristate "Frontends with external TDA1004X demodulators (OFDM)"
++	depends on DVB_CORE
++	help
++	  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
++	  right one will get autodetected.
++
++config DVB_TDA1004X_FIRMWARE_FILE
++        string "Full pathname of tda1004x.bin firmware file"
++        depends on DVB_TDA1004X
++        default "/etc/dvb/tda1004x.bin"
++        help
++          The TDA1004X requires additional firmware in order to function.
++          The firmware file can obtained as follows:
++            wget http://www.technotrend.de/new/215/TTweb_215a_budget_20_05_2003.zip
++            unzip -j TTweb_215a_budget_20_05_2003.zip Software/Oem/PCI/App/ttlcdacc.dll
++            mv ttlcdacc.dll /etc/dvb/tda1004x.bin
+--- linux-2.6.0-test1/drivers/media/dvb/frontends/Makefile	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/frontends/Makefile	2003-07-19 17:03:49.000000000 -0700
+@@ -12,4 +12,6 @@ obj-$(CONFIG_DVB_ATMEL_AT76C651) += at76
+ obj-$(CONFIG_DVB_CX24110) += cx24110.o
+ obj-$(CONFIG_DVB_GRUNDIG_29504_491) += grundig_29504-491.o
+ obj-$(CONFIG_DVB_GRUNDIG_29504_401) += grundig_29504-401.o
++obi-$(CONFIG_DVB_MT312) += mt312.o
+ obj-$(CONFIG_DVB_VES1820) += ves1820.o
++obj-$(CONFIG_DVB_TDA1004X) += tda1004x.o
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/frontends/mt312.c	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,749 @@
++/* 
++    Driver for Zarlink MT312 Satellite Channel Decoder
++
++    Copyright (C) 2003 Andreas Oberritter <obi@saftware.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.
++
++    References:
++    http://products.zarlink.com/product_profiles/MT312.htm
++    http://products.zarlink.com/product_profiles/SL1935.htm
++*/
++
++#include <linux/delay.h>
++#include <linux/errno.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++
++#include "dvb_frontend.h"
++#include "mt312.h"
++
++#define I2C_ADDR_MT312		0x0e
++#define I2C_ADDR_SL1935		0x61
++#define I2C_ADDR_TSA5059	0x61
++
++#define MT312_DEBUG		0
++
++#define MT312_SYS_CLK		90000000UL	/* 90 MHz */
++#define MT312_PLL_CLK		10000000UL	/* 10 MHz */
++
++static struct dvb_frontend_info mt312_info = {
++	.name = "Zarlink MT312",
++	.type = FE_QPSK,
++	.frequency_min = 950000,
++	.frequency_max = 2150000,
++	.frequency_stepsize = (MT312_PLL_CLK / 1000) / 128,
++	/*.frequency_tolerance = 29500,         FIXME: binary compatibility waste? */
++	.symbol_rate_min = MT312_SYS_CLK / 128,
++	.symbol_rate_max = MT312_SYS_CLK / 2,
++	/*.symbol_rate_tolerance = 500,         FIXME: binary compatibility waste? 2% */
++	.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_5_6 | FE_CAN_FEC_7_8 |
++	    FE_CAN_FEC_AUTO | FE_CAN_QPSK | FE_CAN_RECOVER |
++	    FE_CAN_CLEAN_SETUP | FE_CAN_MUTE_TS
++};
++
++static int mt312_read(struct dvb_i2c_bus *i2c,
++		      const enum mt312_reg_addr reg, void *buf,
++		      const size_t count)
++{
++	int ret;
++	struct i2c_msg msg[2];
++	u8 regbuf[1] = { reg };
++
++	msg[0].addr = I2C_ADDR_MT312;
++	msg[0].flags = 0;
++	msg[0].buf = regbuf;
++	msg[0].len = 1;
++	msg[1].addr = I2C_ADDR_MT312;
++	msg[1].flags = I2C_M_RD;
++	msg[1].buf = buf;
++	msg[1].len = count;
++
++	ret = i2c->xfer(i2c, msg, 2);
++
++	if (ret != 2) {
++		printk(KERN_ERR "%s: ret == %d\n", __FUNCTION__, ret);
++		return -EREMOTEIO;
++	}
++#ifdef MT312_DEBUG
++	{
++		int i;
++		printk(KERN_INFO "R(%d):", reg & 0x7f);
++		for (i = 0; i < count; i++)
++			printk(" %02x", ((const u8 *) buf)[i]);
++		printk("\n");
++	}
++#endif
++
++	return 0;
++}
++
++static int mt312_write(struct dvb_i2c_bus *i2c,
++		       const enum mt312_reg_addr reg, const void *src,
++		       const size_t count)
++{
++	int ret;
++	u8 buf[count + 1];
++	struct i2c_msg msg;
++
++#ifdef MT312_DEBUG
++	{
++		int i;
++		printk(KERN_INFO "W(%d):", reg & 0x7f);
++		for (i = 0; i < count; i++)
++			printk(" %02x", ((const u8 *) src)[i]);
++		printk("\n");
++	}
++#endif
++
++	buf[0] = reg;
++	memcpy(&buf[1], src, count);
++
++	msg.addr = I2C_ADDR_MT312;
++	msg.flags = 0;
++	msg.buf = buf;
++	msg.len = count + 1;
++
++	ret = i2c->xfer(i2c, &msg, 1);
++
++	if (ret != 1) {
++		printk(KERN_ERR "%s: ret == %d\n", __FUNCTION__, ret);
++		return -EREMOTEIO;
++	}
++
++	return 0;
++}
++
++static inline int mt312_readreg(struct dvb_i2c_bus *i2c,
++				const enum mt312_reg_addr reg, u8 * val)
++{
++	return mt312_read(i2c, reg, val, 1);
++}
++
++static inline int mt312_writereg(struct dvb_i2c_bus *i2c,
++				 const enum mt312_reg_addr reg, const u8 val)
++{
++	return mt312_write(i2c, reg, &val, 1);
++}
++
++static int mt312_pll_write(struct dvb_i2c_bus *i2c, const u8 addr,
++			   u8 * buf, const u8 len)
++{
++	int ret;
++	struct i2c_msg msg;
++
++	msg.addr = addr;
++	msg.flags = 0;
++	msg.buf = buf;
++	msg.len = len;
++
++	if ((ret = mt312_writereg(i2c, GPP_CTRL, 0x40)) < 0)
++		return ret;
++
++	if ((ret = i2c->xfer(i2c, &msg, 1)) != 1)
++		printk(KERN_ERR "%s: i/o error (ret == %d)\n", __FUNCTION__, ret);
++
++	if ((ret = mt312_writereg(i2c, GPP_CTRL, 0x00)) < 0)
++		return ret;
++
++	return 0;
++}
++
++static inline u32 mt312_div(u32 a, u32 b)
++{
++	return (a + (b / 2)) / b;
++}
++
++static int sl1935_set_tv_freq(struct dvb_i2c_bus *i2c, u32 freq, u32 sr)
++{
++	/* 155 uA, Baseband Path B */
++	u8 buf[4] = { 0x00, 0x00, 0x80, 0x00 };
++
++	u8 exp;
++	u32 ref;
++	u32 div;
++
++	if (sr < 10000000) {	/* 1-10 MSym/s: ratio 2 ^ 3 */
++		exp = 3;
++		buf[2] |= 0x40;	/* 690 uA */
++	} else if (sr < 15000000) {	/* 10-15 MSym/s: ratio 2 ^ 4 */
++		exp = 4;
++		buf[2] |= 0x20;	/* 330 uA */
++	} else {		/* 15-45 MSym/s: ratio 2 ^ 7 */
++		exp = 7;
++		buf[3] |= 0x08;	/* Baseband Path A */
++	}
++
++	div = mt312_div(MT312_PLL_CLK, 1 << exp);
++	ref = mt312_div(freq * 1000, div);
++	mt312_info.frequency_stepsize = mt312_div(div, 1000);
++
++	buf[0] = (ref >> 8) & 0x7f;
++	buf[1] = (ref >> 0) & 0xff;
++	buf[2] |= (exp - 1);
++
++	if (freq < 1550000)
++		buf[3] |= 0x10;
++
++	printk(KERN_INFO "synth dword = %02x%02x%02x%02x\n", buf[0],
++	       buf[1], buf[2], buf[3]);
++
++	return mt312_pll_write(i2c, I2C_ADDR_SL1935, buf, sizeof(buf));
++}
++
++static int tsa5059_set_tv_freq(struct dvb_i2c_bus *i2c, u32 freq, u32 sr)
++{
++	u8 buf[4];
++
++	u32 ref = mt312_div(freq, 125);
++
++	buf[0] = (ref >> 8) & 0x7f;
++	buf[1] = (ref >> 0) & 0xff;
++	buf[2] = 0x84 | ((ref >> 10) & 0x60);
++	buf[3] = 0x80;
++	
++	if (freq < 1550000)
++		buf[3] |= 0x02;
++
++	printk(KERN_INFO "synth dword = %02x%02x%02x%02x\n", buf[0],
++	       buf[1], buf[2], buf[3]);
++
++	return mt312_pll_write(i2c, I2C_ADDR_TSA5059, buf, sizeof(buf));
++}
++
++static int mt312_reset(struct dvb_i2c_bus *i2c, const u8 full)
++{
++	return mt312_writereg(i2c, RESET, full ? 0x80 : 0x40);
++}
++
++static int mt312_init(struct dvb_i2c_bus *i2c, const long id)
++{
++	int ret;
++	u8 buf[2];
++
++	/* wake up */
++	if ((ret = mt312_writereg(i2c, CONFIG, 0x8c)) < 0)
++		return ret;
++
++	/* wait at least 150 usec */
++	udelay(150);
++
++	/* full reset */
++	if ((ret = mt312_reset(i2c, 1)) < 0)
++		return ret;
++
++	/* SYS_CLK */
++	buf[0] = mt312_div(MT312_SYS_CLK * 2, 1000000);
++
++	/* DISEQC_RATIO */
++	buf[1] = mt312_div(MT312_PLL_CLK, 15000 * 4);
++
++	if ((ret = mt312_write(i2c, SYS_CLK, buf, sizeof(buf))) < 0)
++		return ret;
++
++	if ((ret = mt312_writereg(i2c, SNR_THS_HIGH, 0x32)) < 0)
++		return ret;
++
++	if ((ret = mt312_writereg(i2c, OP_CTRL, 0x53)) < 0)
++		return ret;
++
++	/* TS_SW_LIM */
++	buf[0] = 0x8c;
++	buf[1] = 0x98;
++
++	if ((ret = mt312_write(i2c, TS_SW_LIM_L, buf, sizeof(buf))) < 0)
++		return ret;
++
++	if ((ret = mt312_writereg(i2c, CS_SW_LIM, 0x69)) < 0)
++		return ret;
++
++	return 0;
++}
++
++static int mt312_send_master_cmd(struct dvb_i2c_bus *i2c,
++				 const struct dvb_diseqc_master_cmd *c)
++{
++	int ret;
++	u8 diseqc_mode;
++
++	if ((c->msg_len == 0) || (c->msg_len > sizeof(c->msg)))
++		return -EINVAL;
++
++	if ((ret = mt312_readreg(i2c, DISEQC_MODE, &diseqc_mode)) < 0)
++		return ret;
++
++	if ((ret =
++	     mt312_write(i2c, (0x80 | DISEQC_INSTR), c->msg, c->msg_len)) < 0)
++		return ret;
++
++	if ((ret =
++	     mt312_writereg(i2c, DISEQC_MODE,
++			    (diseqc_mode & 0x40) | ((c->msg_len - 1) << 3)
++			    | 0x04)) < 0)
++		return ret;
++
++	/* set DISEQC_MODE[2:0] to zero if a return message is expected */
++	if (c->msg[0] & 0x02)
++		if ((ret =
++		     mt312_writereg(i2c, DISEQC_MODE, (diseqc_mode & 0x40))) < 0)
++			return ret;
++
++	return 0;
++}
++
++static int mt312_recv_slave_reply(struct dvb_i2c_bus *i2c,
++				  struct dvb_diseqc_slave_reply *r)
++{
++	/* TODO */
++	return -EOPNOTSUPP;
++}
++
++static int mt312_send_burst(struct dvb_i2c_bus *i2c, const fe_sec_mini_cmd_t c)
++{
++	const u8 mini_tab[2] = { 0x02, 0x03 };
++
++	int ret;
++	u8 diseqc_mode;
++
++	if (c > SEC_MINI_B)
++		return -EINVAL;
++
++	if ((ret = mt312_readreg(i2c, DISEQC_MODE, &diseqc_mode)) < 0)
++		return ret;
++
++	if ((ret =
++	     mt312_writereg(i2c, DISEQC_MODE,
++			    (diseqc_mode & 0x40) | mini_tab[c])) < 0)
++		return ret;
++
++	return 0;
++}
++
++static int mt312_set_tone(struct dvb_i2c_bus *i2c, const fe_sec_tone_mode_t t)
++{
++	const u8 tone_tab[2] = { 0x01, 0x00 };
++
++	int ret;
++	u8 diseqc_mode;
++
++	if (t > SEC_TONE_OFF)
++		return -EINVAL;
++
++	if ((ret = mt312_readreg(i2c, DISEQC_MODE, &diseqc_mode)) < 0)
++		return ret;
++
++	if ((ret =
++	     mt312_writereg(i2c, DISEQC_MODE,
++			    (diseqc_mode & 0x40) | tone_tab[t])) < 0)
++		return ret;
++
++	return 0;
++}
++
++static int mt312_set_voltage(struct dvb_i2c_bus *i2c, const fe_sec_voltage_t v)
++{
++	const u8 volt_tab[3] = { 0x00, 0x40, 0x00 };
++
++	if (v > SEC_VOLTAGE_OFF)
++		return -EINVAL;
++
++	return mt312_writereg(i2c, DISEQC_MODE, volt_tab[v]);
++}
++
++static int mt312_read_status(struct dvb_i2c_bus *i2c, fe_status_t * s)
++{
++	int ret;
++	u8 status[3];
++
++	*s = 0;
++
++	if ((ret = mt312_read(i2c, QPSK_STAT_H, status, sizeof(status))) < 0)
++		return ret;
++
++	if (status[0] & 0xc0)
++		*s |= FE_HAS_SIGNAL;	/* signal noise ratio */
++	if (status[0] & 0x04)
++		*s |= FE_HAS_CARRIER;	/* qpsk carrier lock */
++	if (status[2] & 0x02)
++		*s |= FE_HAS_VITERBI;	/* viterbi lock */
++	if (status[2] & 0x04)
++		*s |= FE_HAS_SYNC;	/* byte align lock */
++	if (status[0] & 0x01)
++		*s |= FE_HAS_LOCK;	/* qpsk lock */
++
++	return 0;
++}
++
++static int mt312_read_bercnt(struct dvb_i2c_bus *i2c, u32 * ber)
++{
++	int ret;
++	u8 buf[3];
++
++	if ((ret = mt312_read(i2c, RS_BERCNT_H, buf, 3)) < 0)
++		return ret;
++
++	*ber = ((buf[0] << 16) | (buf[1] << 8) | buf[2]) * 64;
++
++	return 0;
++}
++
++static int mt312_read_agc(struct dvb_i2c_bus *i2c, u16 * signal_strength)
++{
++	int ret;
++	u8 buf[3];
++	u16 agc;
++	s16 err_db;
++
++	if ((ret = mt312_read(i2c, AGC_H, buf, sizeof(buf))) < 0)
++		return ret;
++
++	agc = (buf[0] << 6) | (buf[1] >> 2);
++	err_db = (s16) (((buf[1] & 0x03) << 14) | buf[2] << 6) >> 6;
++
++	*signal_strength = agc;
++
++	printk(KERN_DEBUG "agc=%08x err_db=%hd\n", agc, err_db);
++
++	return 0;
++}
++
++static int mt312_read_snr(struct dvb_i2c_bus *i2c, u16 * snr)
++{
++	int ret;
++	u8 buf[2];
++
++	if ((ret = mt312_read(i2c, M_SNR_H, &buf, sizeof(buf))) < 0)
++		return ret;
++
++	*snr = 0xFFFF - ((((buf[0] & 0x7f) << 8) | buf[1]) << 1);
++
++	return 0;
++}
++
++static int mt312_read_ubc(struct dvb_i2c_bus *i2c, u32 * ubc)
++{
++	int ret;
++	u8 buf[2];
++
++	if ((ret = mt312_read(i2c, RS_UBC_H, &buf, sizeof(buf))) < 0)
++		return ret;
++
++	*ubc = (buf[0] << 8) | buf[1];
++
++	return 0;
++}
++
++static int mt312_set_frontend(struct dvb_i2c_bus *i2c,
++			      const struct dvb_frontend_parameters *p,
++			      const long id)
++{
++	int ret;
++	u8 buf[5];
++	u16 sr;
++
++	const u8 fec_tab[10] =
++	    { 0x00, 0x01, 0x02, 0x04, 0x3f, 0x08, 0x10, 0x20, 0x3f, 0x3f };
++	const u8 inv_tab[3] = { 0x00, 0x40, 0x80 };
++
++	int (*set_tv_freq)(struct dvb_i2c_bus *i2c, u32 freq, u32 sr);
++
++	if ((p->frequency < mt312_info.frequency_min)
++	    || (p->frequency > mt312_info.frequency_max))
++		return -EINVAL;
++
++	if ((p->inversion < INVERSION_OFF)
++	    || (p->inversion > INVERSION_AUTO))
++		return -EINVAL;
++
++	if ((p->u.qpsk.symbol_rate < mt312_info.symbol_rate_min)
++	    || (p->u.qpsk.symbol_rate > mt312_info.symbol_rate_max))
++		return -EINVAL;
++
++	if ((p->u.qpsk.fec_inner < FEC_NONE)
++	    || (p->u.qpsk.fec_inner > FEC_AUTO))
++		return -EINVAL;
++
++	if ((p->u.qpsk.fec_inner == FEC_4_5)
++	    || (p->u.qpsk.fec_inner == FEC_8_9))
++		return -EINVAL;
++
++	switch (id) {
++	case ID_VP310:
++		set_tv_freq = tsa5059_set_tv_freq;
++		break;
++	case ID_MT312:
++		set_tv_freq = sl1935_set_tv_freq;
++		break;
++	default:
++		return -EINVAL;
++	}
++
++	if ((ret = set_tv_freq(i2c, p->frequency, p->u.qpsk.symbol_rate)) < 0)
++		return ret;
++
++	/* sr = (u16)(sr * 256.0 / 1000000.0) */
++	sr = mt312_div(p->u.qpsk.symbol_rate * 4, 15625);
++
++	/* SYM_RATE */
++	buf[0] = (sr >> 8) & 0x3f;
++	buf[1] = (sr >> 0) & 0xff;
++
++	/* VIT_MODE */
++	buf[2] = inv_tab[p->inversion] | fec_tab[p->u.qpsk.fec_inner];
++
++	/* QPSK_CTRL */
++	buf[3] = 0x40;		/* swap I and Q before QPSK demodulation */
++
++	if (p->u.qpsk.symbol_rate < 10000000)
++		buf[3] |= 0x04;	/* use afc mode */
++
++	/* GO */
++	buf[4] = 0x01;
++
++	if ((ret = mt312_write(i2c, SYM_RATE_H, buf, sizeof(buf))) < 0)
++		return ret;
++
++	return 0;
++}
++
++static int mt312_get_inversion(struct dvb_i2c_bus *i2c,
++			       fe_spectral_inversion_t * i)
++{
++	int ret;
++	u8 vit_mode;
++
++	if ((ret = mt312_readreg(i2c, VIT_MODE, &vit_mode)) < 0)
++		return ret;
++
++	if (vit_mode & 0x80)	/* auto inversion was used */
++		*i = (vit_mode & 0x40) ? INVERSION_ON : INVERSION_OFF;
++
++	return 0;
++}
++
++static int mt312_get_symbol_rate(struct dvb_i2c_bus *i2c, u32 * sr)
++{
++	int ret;
++	u8 sym_rate_h;
++	u8 dec_ratio;
++	u16 sym_rat_op;
++	u16 monitor;
++	u8 buf[2];
++
++	if ((ret = mt312_readreg(i2c, SYM_RATE_H, &sym_rate_h)) < 0)
++		return ret;
++
++	if (sym_rate_h & 0x80) {	/* symbol rate search was used */
++		if ((ret = mt312_writereg(i2c, MON_CTRL, 0x03)) < 0)
++			return ret;
++
++		if ((ret = mt312_read(i2c, MONITOR_H, buf, sizeof(buf))) < 0)
++			return ret;
++
++		monitor = (buf[0] << 8) | buf[1];
++
++		printk(KERN_DEBUG "sr(auto) = %u\n",
++		       mt312_div(monitor * 15625, 4));
++	} else {
++		if ((ret = mt312_writereg(i2c, MON_CTRL, 0x05)) < 0)
++			return ret;
++
++		if ((ret = mt312_read(i2c, MONITOR_H, buf, sizeof(buf))) < 0)
++			return ret;
++
++		dec_ratio = ((buf[0] >> 5) & 0x07) * 32;
++
++		if ((ret = mt312_read(i2c, SYM_RAT_OP_H, buf, sizeof(buf))) < 0)
++			return ret;
++
++		sym_rat_op = (buf[0] << 8) | buf[1];
++
++		printk(KERN_DEBUG "sym_rat_op=%d dec_ratio=%d\n",
++		       sym_rat_op, dec_ratio);
++		printk(KERN_DEBUG "*sr(manual) = %lu\n",
++		       (((MT312_PLL_CLK * 8192) / (sym_rat_op + 8192)) *
++			2) - dec_ratio);
++	}
++
++	return 0;
++}
++
++static int mt312_get_code_rate(struct dvb_i2c_bus *i2c, fe_code_rate_t * cr)
++{
++	const fe_code_rate_t fec_tab[8] =
++	    { FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_6_7, FEC_7_8,
++		FEC_AUTO, FEC_AUTO };
++
++	int ret;
++	u8 fec_status;
++
++	if ((ret = mt312_readreg(i2c, FEC_STATUS, &fec_status)) < 0)
++		return ret;
++
++	*cr = fec_tab[(fec_status >> 4) & 0x07];
++
++	return 0;
++}
++
++static int mt312_get_frontend(struct dvb_i2c_bus *i2c,
++			      struct dvb_frontend_parameters *p)
++{
++	int ret;
++
++	if ((ret = mt312_get_inversion(i2c, &p->inversion)) < 0)
++		return ret;
++
++	if ((ret = mt312_get_symbol_rate(i2c, &p->u.qpsk.symbol_rate)) < 0)
++		return ret;
++
++	if ((ret = mt312_get_code_rate(i2c, &p->u.qpsk.fec_inner)) < 0)
++		return ret;
++
++	return 0;
++}
++
++static int mt312_sleep(struct dvb_i2c_bus *i2c)
++{
++	int ret;
++	u8 config;
++
++	/* reset all registers to defaults */
++	if ((ret = mt312_reset(i2c, 1)) < 0)
++		return ret;
++
++	if ((ret = mt312_readreg(i2c, CONFIG, &config)) < 0)
++		return ret;
++
++	/* enter standby */
++	if ((ret = mt312_writereg(i2c, CONFIG, config & 0x7f)) < 0)
++		return ret;
++
++	return 0;
++}
++
++static int mt312_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
++{
++	struct dvb_i2c_bus *i2c = fe->i2c;
++
++	switch (cmd) {
++	case FE_GET_INFO:
++		memcpy(arg, &mt312_info, sizeof(struct dvb_frontend_info));
++		break;
++
++	case FE_DISEQC_RESET_OVERLOAD:
++		return -EOPNOTSUPP;
++
++	case FE_DISEQC_SEND_MASTER_CMD:
++		return mt312_send_master_cmd(i2c, arg);
++
++	case FE_DISEQC_RECV_SLAVE_REPLY:
++		if ((long) fe->data == ID_MT312)
++			return mt312_recv_slave_reply(i2c, arg);
++		else
++			return -EOPNOTSUPP;
++
++	case FE_DISEQC_SEND_BURST:
++		return mt312_send_burst(i2c, (fe_sec_mini_cmd_t) arg);
++
++	case FE_SET_TONE:
++		return mt312_set_tone(i2c, (fe_sec_tone_mode_t) arg);
++
++	case FE_SET_VOLTAGE:
++		return mt312_set_voltage(i2c, (fe_sec_voltage_t) arg);
++
++	case FE_ENABLE_HIGH_LNB_VOLTAGE:
++		return -EOPNOTSUPP;
++
++	case FE_READ_STATUS:
++		return mt312_read_status(i2c, arg);
++
++	case FE_READ_BER:
++		return mt312_read_bercnt(i2c, arg);
++
++	case FE_READ_SIGNAL_STRENGTH:
++		return mt312_read_agc(i2c, arg);
++
++	case FE_READ_SNR:
++		return mt312_read_snr(i2c, arg);
++
++	case FE_READ_UNCORRECTED_BLOCKS:
++		return mt312_read_ubc(i2c, arg);
++
++	case FE_SET_FRONTEND:
++		return mt312_set_frontend(i2c, arg, (long) fe->data);
++
++	case FE_GET_FRONTEND:
++		return mt312_get_frontend(i2c, arg);
++
++	case FE_GET_EVENT:
++		return -EOPNOTSUPP;
++
++	case FE_SLEEP:
++		return mt312_sleep(i2c);
++
++	case FE_INIT:
++		return mt312_init(i2c, (long) fe->data);
++
++	case FE_RESET:
++		return mt312_reset(i2c, 0);
++
++	default:
++		return -ENOIOCTLCMD;
++	}
++
++	return 0;
++}
++
++static int mt312_attach(struct dvb_i2c_bus *i2c)
++{
++	int ret;
++	u8 id;
++
++	if ((ret = mt312_readreg(i2c, ID, &id)) < 0)
++		return ret;
++
++	if ((id != ID_VP310) && (id != ID_MT312))
++		return -ENODEV;
++
++	return dvb_register_frontend(mt312_ioctl, i2c, (void *) (long) id,
++				     &mt312_info);
++}
++
++static void mt312_detach(struct dvb_i2c_bus *i2c)
++{
++	dvb_unregister_frontend(mt312_ioctl, i2c);
++}
++
++static int __init mt312_module_init(void)
++{
++	return dvb_register_i2c_device(THIS_MODULE, mt312_attach, mt312_detach);
++}
++
++static void __exit mt312_module_exit(void)
++{
++	dvb_unregister_i2c_device(mt312_attach);
++}
++
++module_init(mt312_module_init);
++module_exit(mt312_module_exit);
++
++MODULE_DESCRIPTION("MT312 Satellite Channel Decoder Driver");
++MODULE_AUTHOR("Andreas Oberritter <obi@saftware.de>");
++MODULE_LICENSE("GPL");
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/frontends/mt312.h	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,162 @@
++/* 
++    Driver for Zarlink MT312 QPSK Frontend
++
++    Copyright (C) 2003 Andreas Oberritter <obi@saftware.de>
++
++    This program is free software; you can redistribute it and/or modify
++    it under the terms of the GNU General Public License as published by
++    the Free Software Foundation; either version 2 of the License, or
++    (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++
++    GNU General Public License for more details.
++
++    You should have received a copy of the GNU General Public License
++    along with this program; if not, write to the Free Software
++    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++*/
++
++#ifndef _DVB_FRONTENDS_MT312
++#define _DVB_FRONTENDS_MT312
++
++enum mt312_reg_addr {
++	QPSK_INT_H = 0,
++	QPSK_INT_M = 1,
++	QPSK_INT_L = 2,
++	FEC_INT = 3,
++	QPSK_STAT_H = 4,
++	QPSK_STAT_L = 5,
++	FEC_STATUS = 6,
++	LNB_FREQ_H = 7,
++	LNB_FREQ_L = 8,
++	M_SNR_H = 9,
++	M_SNR_L = 10,
++	VIT_ERRCNT_H = 11,
++	VIT_ERRCNT_M = 12,
++	VIT_ERRCNT_L = 13,
++	RS_BERCNT_H = 14,
++	RS_BERCNT_M = 15,
++	RS_BERCNT_L = 16,
++	RS_UBC_H = 17,
++	RS_UBC_L = 18,
++	SIG_LEVEL = 19,
++	GPP_CTRL = 20,
++	RESET = 21,
++	DISEQC_MODE = 22,
++	SYM_RATE_H = 23,
++	SYM_RATE_L = 24,
++	VIT_MODE = 25,
++	QPSK_CTRL = 26,
++	GO = 27,
++	IE_QPSK_H = 28,
++	IE_QPSK_M = 29,
++	IE_QPSK_L = 30,
++	IE_FEC = 31,
++	QPSK_STAT_EN = 32,
++	FEC_STAT_EN = 33,
++	SYS_CLK = 34,
++	DISEQC_RATIO = 35,
++	DISEQC_INSTR = 36,
++	FR_LIM = 37,
++	FR_OFF = 38,
++	AGC_CTRL = 39,
++	AGC_INIT = 40,
++	AGC_REF = 41,
++	AGC_MAX = 42,
++	AGC_MIN = 43,
++	AGC_LK_TH = 44,
++	TS_AGC_LK_TH = 45,
++	AGC_PWR_SET = 46,
++	QPSK_MISC = 47,
++	SNR_THS_LOW = 48,
++	SNR_THS_HIGH = 49,
++	TS_SW_RATE = 50,
++	TS_SW_LIM_L = 51,
++	TS_SW_LIM_H = 52,
++	CS_SW_RATE_1 = 53,
++	CS_SW_RATE_2 = 54,
++	CS_SW_RATE_3 = 55,
++	CS_SW_RATE_4 = 56,
++	CS_SW_LIM = 57,
++	TS_LPK = 58,
++	TS_LPK_M = 59,
++	TS_LPK_L = 60,
++	CS_KPROP_H = 61,
++	CS_KPROP_L = 62,
++	CS_KINT_H = 63,
++	CS_KINT_L = 64,
++	QPSK_SCALE = 65,
++	TLD_OUTCLK_TH = 66,
++	TLD_INCLK_TH = 67,
++	FLD_TH = 68,
++	PLD_OUTLK3 = 69,
++	PLD_OUTLK2 = 70,
++	PLD_OUTLK1 = 71,
++	PLD_OUTLK0 = 72,
++	PLD_INLK3 = 73,
++	PLD_INLK2 = 74,
++	PLD_INLK1 = 75,
++	PLD_INLK0 = 76,
++	PLD_ACC_TIME = 77,
++	SWEEP_PAR = 78,
++	STARTUP_TIME = 79,
++	LOSSLOCK_TH = 80,
++	FEC_LOCK_TM = 81,
++	LOSSLOCK_TM = 82,
++	VIT_ERRPER_H = 83,
++	VIT_ERRPER_M = 84,
++	VIT_ERRPER_L = 85,
++	VIT_SETUP = 86,
++	VIT_REF0 = 87,
++	VIT_REF1 = 88,
++	VIT_REF2 = 89,
++	VIT_REF3 = 90,
++	VIT_REF4 = 91,
++	VIT_REF5 = 92,
++	VIT_REF6 = 93,
++	VIT_MAXERR = 94,
++	BA_SETUPT = 95,
++	OP_CTRL = 96,
++	FEC_SETUP = 97,
++	PROG_SYNC = 98,
++	AFC_SEAR_TH = 99,
++	CSACC_DIF_TH = 100,
++	QPSK_LK_CT = 101,
++	QPSK_ST_CT = 102,
++	MON_CTRL = 103,
++	QPSK_RESET = 104,
++	QPSK_TST_CT = 105,
++	QPSK_TST_ST = 106,
++	TEST_R = 107,
++	AGC_H = 108,
++	AGC_M = 109,
++	AGC_L = 110,
++	FREQ_ERR1_H = 111,
++	FREQ_ERR1_M = 112,
++	FREQ_ERR1_L = 113,
++	FREQ_ERR2_H = 114,
++	FREQ_ERR2_L = 115,
++	SYM_RAT_OP_H = 116,
++	SYM_RAT_OP_L = 117,
++	DESEQC2_INT = 118,
++	DISEQC2_STAT = 119,
++	DISEQC2_FIFO = 120,
++	DISEQC2_CTRL1 = 121,
++	DISEQC2_CTRL2 = 122,
++	MONITOR_H = 123,
++	MONITOR_L = 124,
++	TEST_MODE = 125,
++	ID = 126,
++	CONFIG = 127
++};
++
++enum mt312_model_id {
++	ID_VP310 = 1,
++	ID_MT312 = 3
++};
++
++#endif				/* DVB_FRONTENDS_MT312 */
+--- linux-2.6.0-test1/drivers/media/dvb/frontends/nxt6000.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/frontends/nxt6000.c	2003-07-19 17:03:49.000000000 -0700
+@@ -6,8 +6,10 @@
+ 	
+ 	Alps TDME7 (Tuner: MITEL SP5659)
+ 	Alps TDED4 (Tuner: TI ALP510, external Nxt6000)
++	Comtech DVBT-6k07 (PLL IC: SP5730)
+ 
+     Copyright (C) 2002-2003 Florian Schirmer <schirmer@taytron.net>
++    Copyright (C) 2003 Paul Andreassen <paul@andreassen.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
+@@ -78,6 +80,7 @@ struct nxt6000_config {
+ 
+ #define TUNER_TYPE_ALP510	0
+ #define TUNER_TYPE_SP5659	1
++#define TUNER_TYPE_SP5730	2
+ 
+ #define FE2NXT(fe) ((struct nxt6000_config *)&(fe->data))
+ #define FREQ2DIV(freq) ((freq + 36166667) / 166667)
+@@ -212,6 +215,39 @@ static int alp510_set_tv_freq(struct dvb
+ 	
+ }
+ 
++static int sp5730_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] = 0x93;
++
++	if ((freq >= 51000000) && (freq < 132100000))
++		buf[3] = 0x05;
++	else if ((freq >= 132100000) && (freq < 143000000))
++		buf[3] = 0x45;
++	else if ((freq >= 146000000) && (freq < 349100000))
++		buf[3] = 0x06;
++	else if ((freq >= 349100000) && (freq < 397100000))
++		buf[3] = 0x46;
++	else if ((freq >= 397100000) && (freq < 426000000))
++		buf[3] = 0x86;
++	else if ((freq >= 430000000) && (freq < 659100000))
++		buf[3] = 0x03;
++	else if ((freq >= 659100000) && (freq < 759100000))
++		buf[3] = 0x43;
++	else if ((freq >= 759100000) && (freq < 858000000))
++		buf[3] = 0x83;
++	else
++		return -EINVAL;
++
++	return pll_write(fe->i2c, nxt->demod_addr, nxt->tuner_addr, buf, 4);
++	
++}
++
+ static void nxt6000_reset(struct dvb_frontend *fe)
+ {
+ 
+@@ -756,6 +792,13 @@ static int nxt6000_ioctl(struct dvb_fron
+ 						
+ 					break;
+ 					
++				case TUNER_TYPE_SP5730:
++
++					if ((result = sp5730_set_tv_freq(fe, param->frequency)) < 0)
++						return result;
++
++					break;
++
+ 				default:
+ 				
+ 					return -EFAULT;
+@@ -816,6 +859,14 @@ static int nxt6000_attach(struct dvb_i2c
+ 	
+ 			dprintk("nxt6000: detected MITEL SP5659 tuner at 0x%02X\n", nxt.tuner_addr);
+ 		
++		} else if (pll_write(i2c, demod_addr_tbl[addr_nr], 0xC0, NULL, 0) == 0) {
++
++			nxt.tuner_addr = 0xC0;
++			nxt.tuner_type = TUNER_TYPE_SP5730;
++			nxt.clock_inversion = 0;
++	
++			dprintk("nxt6000: detected SP5730 tuner at 0x%02X\n", nxt.tuner_addr);
++		
+ 		} else {
+ 
+ 			printk("nxt6000: unable to detect tuner\n");
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/frontends/tda1004x.c	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,1158 @@
++  /*
++     Driver for Philips tda1004x OFDM Frontend
++
++     This program is free software; you can redistribute it and/or modify
++     it under the terms of the GNU General Public License as published by
++     the Free Software Foundation; either version 2 of the License, or
++     (at your option) any later version.
++
++     This program is distributed in the hope that it will be useful,
++     but WITHOUT ANY WARRANTY; without even the implied warranty of
++     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++
++     GNU General Public License for more details.
++
++     You should have received a copy of the GNU General Public License
++     along with this program; if not, write to the Free Software
++     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++   */
++
++/*
++    This driver needs a copy of the DLL "ttlcdacc.dll" from the Haupauge or Technotrend
++    windows driver saved as '/etc/dvb/tda1004x.mc'.
++    You can also pass the complete file name with the module parameter 'tda1004x_firmware'.
++
++    Currently the DLL from v2.15a of the technotrend driver is supported. Other versions can
++    be added reasonably painlessly.
++
++    Windows driver URL: http://www.technotrend.de/
++ */
++
++
++#define __KERNEL_SYSCALLS__
++#include <linux/kernel.h>
++#include <linux/vmalloc.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/string.h>
++#include <linux/slab.h>
++#include <linux/fs.h>
++#include <linux/unistd.h>
++#include <linux/fcntl.h>
++#include <linux/errno.h>
++#include "dvb_frontend.h"
++#include "dvb_functions.h"
++
++#ifndef CONFIG_TDA1004X_MC_LOCATION
++#define CONFIG_TDA1004X_MC_LOCATION "/etc/dvb/tda1004x.mc"
++#endif
++
++static int tda1004x_debug = 0;
++static char *tda1004x_firmware = CONFIG_TDA1004X_MC_LOCATION;
++
++
++#define TDA10045H_ADDRESS        0x08
++#define TD1344_ADDRESS           0x61
++#define TDM1316L_ADDRESS         0x63
++#define MC44BC374_ADDRESS        0x65
++
++#define TDA1004X_CHIPID          0x00
++#define TDA1004X_AUTO            0x01
++#define TDA1004X_IN_CONF1        0x02
++#define TDA1004X_IN_CONF2        0x03
++#define TDA1004X_OUT_CONF1       0x04
++#define TDA1004X_OUT_CONF2       0x05
++#define TDA1004X_STATUS_CD       0x06
++#define TDA1004X_CONFC4          0x07
++#define TDA1004X_DSSPARE2        0x0C
++#define TDA1004X_CODE_IN         0x0D
++#define TDA1004X_FWPAGE          0x0E
++#define TDA1004X_SCAN_CPT        0x10
++#define TDA1004X_DSP_CMD         0x11
++#define TDA1004X_DSP_ARG         0x12
++#define TDA1004X_DSP_DATA1       0x13
++#define TDA1004X_DSP_DATA2       0x14
++#define TDA1004X_CONFADC1        0x15
++#define TDA1004X_CONFC1          0x16
++#define TDA1004X_SIGNAL_STRENGTH 0x1a
++#define TDA1004X_SNR             0x1c
++#define TDA1004X_REG1E           0x1e
++#define TDA1004X_REG1F           0x1f
++#define TDA1004X_CBER_RESET      0x20
++#define TDA1004X_CBER_MSB        0x21
++#define TDA1004X_CBER_LSB        0x22
++#define TDA1004X_CVBER_LUT       0x23
++#define TDA1004X_VBER_MSB        0x24
++#define TDA1004X_VBER_MID        0x25
++#define TDA1004X_VBER_LSB        0x26
++#define TDA1004X_UNCOR           0x27
++#define TDA1004X_CONFPLL_P       0x2D
++#define TDA1004X_CONFPLL_M_MSB   0x2E
++#define TDA1004X_CONFPLL_M_LSB   0x2F
++#define TDA1004X_CONFPLL_N       0x30
++#define TDA1004X_UNSURW_MSB      0x31
++#define TDA1004X_UNSURW_LSB      0x32
++#define TDA1004X_WREF_MSB        0x33
++#define TDA1004X_WREF_MID        0x34
++#define TDA1004X_WREF_LSB        0x35
++#define TDA1004X_MUXOUT          0x36
++#define TDA1004X_CONFADC2        0x37
++#define TDA1004X_IOFFSET         0x38
++
++#define dprintk if (tda1004x_debug) printk
++
++static struct dvb_frontend_info tda10045h_info = {
++	.name = "Philips TDA10045H",
++	.type = FE_OFDM,
++	.frequency_min = 51000000,
++	.frequency_max = 858000000,
++	.frequency_stepsize = 166667,
++	.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 | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
++	    FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO
++};
++
++#pragma pack(1)
++struct tda1004x_state {
++	u8 tda1004x_address;
++	u8 tuner_address;
++	u8 initialised:1;
++};
++#pragma pack()
++
++struct fwinfo {
++	int file_size;
++	int fw_offset;
++	int fw_size;
++};
++static struct fwinfo tda10045h_fwinfo[] = { {.file_size = 286720,.fw_offset = 0x34cc5,.fw_size = 30555} };
++static int tda10045h_fwinfo_count = sizeof(tda10045h_fwinfo) / sizeof(struct fwinfo);
++
++static int errno;
++
++
++static int tda1004x_write_byte(struct dvb_i2c_bus *i2c, struct tda1004x_state *tda_state, int reg, int data)
++{
++	int ret;
++	u8 buf[] = { reg, data };
++	struct i2c_msg msg = { .addr=0, .flags=0, .buf=buf, .len=2 };
++
++	dprintk("%s: reg=0x%x, data=0x%x\n", __FUNCTION__, reg, data);
++
++        msg.addr = tda_state->tda1004x_address;
++	ret = i2c->xfer(i2c, &msg, 1);
++
++	if (ret != 1)
++		dprintk("%s: error reg=0x%x, data=0x%x, ret=%i\n",
++		       __FUNCTION__, reg, data, ret);
++
++	dprintk("%s: success reg=0x%x, data=0x%x, ret=%i\n", __FUNCTION__,
++		reg, data, ret);
++	return (ret != 1) ? -1 : 0;
++}
++
++static int tda1004x_read_byte(struct dvb_i2c_bus *i2c, struct tda1004x_state *tda_state, int reg)
++{
++	int ret;
++	u8 b0[] = { reg };
++	u8 b1[] = { 0 };
++	struct i2c_msg msg[] = {{ .addr=0, .flags=0, .buf=b0, .len=1},
++	                        { .addr=0, .flags=I2C_M_RD, .buf=b1, .len = 1}};
++
++	dprintk("%s: reg=0x%x\n", __FUNCTION__, reg);
++
++        msg[0].addr = tda_state->tda1004x_address;
++        msg[1].addr = tda_state->tda1004x_address;
++	ret = i2c->xfer(i2c, msg, 2);
++
++	if (ret != 2) {
++		dprintk("%s: error reg=0x%x, ret=%i\n", __FUNCTION__, reg,
++		       ret);
++		return -1;
++	}
++
++	dprintk("%s: success reg=0x%x, data=0x%x, ret=%i\n", __FUNCTION__,
++		reg, b1[0], ret);
++	return b1[0];
++}
++
++static int tda1004x_write_mask(struct dvb_i2c_bus *i2c, struct tda1004x_state *tda_state, int reg, int mask, int data)
++{
++        int val;
++	dprintk("%s: reg=0x%x, mask=0x%x, data=0x%x\n", __FUNCTION__, reg,
++		mask, data);
++
++	// read a byte and check
++	val = tda1004x_read_byte(i2c, tda_state, reg);
++	if (val < 0)
++		return val;
++
++	// mask if off
++	val = val & ~mask;
++	val |= data & 0xff;
++
++	// write it out again
++	return tda1004x_write_byte(i2c, tda_state, reg, val);
++}
++
++static int tda1004x_write_buf(struct dvb_i2c_bus *i2c, struct tda1004x_state *tda_state, int reg, unsigned char *buf, int len)
++{
++	int i;
++	int result;
++
++	dprintk("%s: reg=0x%x, len=0x%x\n", __FUNCTION__, reg, len);
++
++	result = 0;
++	for (i = 0; i < len; i++) {
++		result = tda1004x_write_byte(i2c, tda_state, reg + i, buf[i]);
++		if (result != 0)
++			break;
++	}
++
++	return result;
++}
++
++static int tda1004x_enable_tuner_i2c(struct dvb_i2c_bus *i2c, struct tda1004x_state *tda_state)
++{
++        int result;
++	dprintk("%s\n", __FUNCTION__);
++
++	result = tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC4, 2, 2);
++	dvb_delay(1);
++	return result;
++}
++
++static int tda1004x_disable_tuner_i2c(struct dvb_i2c_bus *i2c, struct tda1004x_state *tda_state)
++{
++
++	dprintk("%s\n", __FUNCTION__);
++
++	return tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC4, 2, 0);
++}
++
++
++static int tda10045h_set_bandwidth(struct dvb_i2c_bus *i2c,
++	                           struct tda1004x_state *tda_state,
++		                   fe_bandwidth_t bandwidth)
++{
++        static u8 bandwidth_6mhz[] = { 0x02, 0x00, 0x3d, 0x00, 0x60, 0x1e, 0xa7, 0x45, 0x4f };
++        static u8 bandwidth_7mhz[] = { 0x02, 0x00, 0x37, 0x00, 0x4a, 0x2f, 0x6d, 0x76, 0xdb };
++        static u8 bandwidth_8mhz[] = { 0x02, 0x00, 0x3d, 0x00, 0x48, 0x17, 0x89, 0xc7, 0x14 };
++
++        switch (bandwidth) {
++	case BANDWIDTH_6_MHZ:
++		tda1004x_write_byte(i2c, tda_state, TDA1004X_DSSPARE2, 0x14);
++		tda1004x_write_buf(i2c, tda_state, TDA1004X_CONFPLL_P, bandwidth_6mhz, sizeof(bandwidth_6mhz));
++		break;
++
++	case BANDWIDTH_7_MHZ:
++		tda1004x_write_byte(i2c, tda_state, TDA1004X_DSSPARE2, 0x80);
++		tda1004x_write_buf(i2c, tda_state, TDA1004X_CONFPLL_P, bandwidth_7mhz, sizeof(bandwidth_7mhz));
++		break;
++
++	case BANDWIDTH_8_MHZ:
++		tda1004x_write_byte(i2c, tda_state, TDA1004X_DSSPARE2, 0x14);
++		tda1004x_write_buf(i2c, tda_state, TDA1004X_CONFPLL_P, bandwidth_8mhz, sizeof(bandwidth_8mhz));
++		break;
++
++	default:
++		return -EINVAL;
++	}
++
++	tda1004x_write_byte(i2c, tda_state, TDA1004X_IOFFSET, 0);
++
++        // done
++        return 0;
++}
++
++
++static int tda1004x_init(struct dvb_i2c_bus *i2c, struct tda1004x_state *tda_state)
++{
++	u8 fw_buf[65];
++	struct i2c_msg fw_msg = {.addr = 0,.flags = 0,.buf = fw_buf,.len = 0 };
++	struct i2c_msg tuner_msg = {.addr = 0,.flags = 0,.buf = 0,.len = 0 };
++	unsigned char *firmware = NULL;
++	int filesize;
++	int fd;
++	int fwinfo_idx;
++	int fw_size = 0;
++	int fw_pos;
++	int tx_size;
++        static u8 disable_mc44BC374c[] = { 0x1d, 0x74, 0xa0, 0x68 };
++	mm_segment_t fs = get_fs();
++
++	dprintk("%s\n", __FUNCTION__);
++
++	// Load the firmware
++	set_fs(get_ds());
++	fd = open(tda1004x_firmware, 0, 0);
++	if (fd < 0) {
++		printk("%s: Unable to open firmware %s\n", __FUNCTION__,
++		       tda1004x_firmware);
++		return -EIO;
++	}
++	filesize = lseek(fd, 0L, 2);
++	if (filesize <= 0) {
++		printk("%s: Firmware %s is empty\n", __FUNCTION__,
++		       tda1004x_firmware);
++		sys_close(fd);
++		return -EIO;
++	}
++
++	// find extraction parameters
++	for (fwinfo_idx = 0; fwinfo_idx < tda10045h_fwinfo_count; fwinfo_idx++) {
++		if (tda10045h_fwinfo[fwinfo_idx].file_size == filesize)
++			break;
++	}
++	if (fwinfo_idx >= tda10045h_fwinfo_count) {
++		printk("%s: Unsupported firmware %s\n", __FUNCTION__, tda1004x_firmware);
++		sys_close(fd);
++		return -EIO;
++	}
++	fw_size = tda10045h_fwinfo[fwinfo_idx].fw_size;
++
++	// allocate buffer for it
++	firmware = vmalloc(fw_size);
++	if (firmware == NULL) {
++		printk("%s: Out of memory loading firmware\n",
++		       __FUNCTION__);
++		sys_close(fd);
++		return -EIO;
++	}
++
++	// read it!
++	lseek(fd, tda10045h_fwinfo[fwinfo_idx].fw_offset, 0);
++	if (read(fd, firmware, fw_size) != fw_size) {
++		printk("%s: Failed to read firmware\n", __FUNCTION__);
++		vfree(firmware);
++		sys_close(fd);
++		return -EIO;
++	}
++	sys_close(fd);
++	set_fs(fs);
++
++	// Disable the MC44BC374C
++	tda1004x_enable_tuner_i2c(i2c, tda_state);
++	tuner_msg.addr = MC44BC374_ADDRESS;
++	tuner_msg.buf = disable_mc44BC374c;
++	tuner_msg.len = sizeof(disable_mc44BC374c);
++	if (i2c->xfer(i2c, &tuner_msg, 1) != 1) {
++		i2c->xfer(i2c, &tuner_msg, 1);
++	}
++	tda1004x_disable_tuner_i2c(i2c, tda_state);
++
++	// set some valid bandwith parameters
++        switch(tda_state->tda1004x_address) {
++        case TDA10045H_ADDRESS:
++                tda10045h_set_bandwidth(i2c, tda_state, BANDWIDTH_8_MHZ);
++                break;
++        }
++	dvb_delay(500);
++
++	// do the firmware upload
++	tda1004x_write_byte(i2c, tda_state, TDA1004X_FWPAGE, 0);
++        fw_msg.addr = tda_state->tda1004x_address;
++	fw_pos = 0;
++	while (fw_pos != fw_size) {
++		// work out how much to send this time
++		tx_size = fw_size - fw_pos;
++		if (tx_size > 64) {
++			tx_size = 64;
++		}
++		// send the chunk
++		fw_buf[0] = TDA1004X_CODE_IN;
++		memcpy(fw_buf + 1, firmware + fw_pos, tx_size);
++		fw_msg.len = tx_size + 1;
++		if (i2c->xfer(i2c, &fw_msg, 1) != 1) {
++			vfree(firmware);
++			return -EIO;
++		}
++		fw_pos += tx_size;
++
++		dprintk("%s: fw_pos=0x%x\n", __FUNCTION__, fw_pos);
++	}
++	dvb_delay(100);
++	vfree(firmware);
++
++	// Initialise the DSP and check upload was OK
++	tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC4, 0x10, 0);
++	tda1004x_write_byte(i2c, tda_state, TDA1004X_DSP_CMD, 0x67);
++	if ((tda1004x_read_byte(i2c, tda_state, TDA1004X_DSP_DATA1) != 0x67) ||
++	    (tda1004x_read_byte(i2c, tda_state, TDA1004X_DSP_DATA2) != 0x2c)) {
++		printk("%s: firmware upload failed!\n", __FUNCTION__);
++		return -EIO;
++	}
++
++	// tda setup
++	tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 8, 0);
++        tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 0x10, 0x10);
++        tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF2, 0xC0, 0x0);
++        tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC4, 0x20, 0);
++        tda1004x_write_byte(i2c, tda_state, TDA1004X_CONFADC1, 0x2e);
++	tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC1, 0x80, 0x80);
++	tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC1, 0x40, 0);
++	tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC1, 0x10, 0);
++        tda1004x_write_byte(i2c, tda_state, TDA1004X_REG1E, 0);
++	tda1004x_write_byte(i2c, tda_state, TDA1004X_REG1F, 0);
++	tda1004x_write_mask(i2c, tda_state, TDA1004X_VBER_MSB, 0xe0, 0xa0);
++
++	// done
++	return 0;
++}
++
++static int tda1004x_encode_fec(int fec)
++{
++	// convert known FEC values
++	switch (fec) {
++	case FEC_1_2:
++		return 0;
++	case FEC_2_3:
++		return 1;
++	case FEC_3_4:
++		return 2;
++	case FEC_5_6:
++		return 3;
++	case FEC_7_8:
++		return 4;
++	}
++
++	// unsupported
++	return -EINVAL;
++}
++
++static int tda1004x_decode_fec(int tdafec)
++{
++	// convert known FEC values
++	switch (tdafec) {
++	case 0:
++		return FEC_1_2;
++	case 1:
++		return FEC_2_3;
++	case 2:
++		return FEC_3_4;
++	case 3:
++		return FEC_5_6;
++	case 4:
++		return FEC_7_8;
++	}
++
++	// unsupported
++	return -1;
++}
++
++static int tda1004x_set_frequency(struct dvb_i2c_bus *i2c,
++			   struct tda1004x_state *tda_state,
++			   struct dvb_frontend_parameters *fe_params)
++{
++	u8 tuner_buf[4];
++	struct i2c_msg tuner_msg = {.addr=0, .flags=0, .buf=tuner_buf, .len=sizeof(tuner_buf) };
++	int tuner_frequency;
++        u8 band, cp, filter;
++	int counter, counter2;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	// setup the frequency buffer
++	switch (tda_state->tuner_address) {
++	case TD1344_ADDRESS:
++
++		// setup tuner buffer
++		tuner_frequency =
++                        (((fe_params->frequency / 1000) * 6) + 217502) / 1000;
++		tuner_buf[0] = tuner_frequency >> 8;
++		tuner_buf[1] = tuner_frequency & 0xff;
++		tuner_buf[2] = 0x88;
++		if (fe_params->frequency < 550000000) {
++			tuner_buf[3] = 0xab;
++		} else {
++			tuner_buf[3] = 0xeb;
++		}
++
++		// tune it
++		tda1004x_enable_tuner_i2c(i2c, tda_state);
++		tuner_msg.addr = tda_state->tuner_address;
++		tuner_msg.len = 4;
++		i2c->xfer(i2c, &tuner_msg, 1);
++
++		// wait for it to finish
++		tuner_msg.len = 1;
++		tuner_msg.flags = I2C_M_RD;
++		counter = 0;
++		counter2 = 0;
++		while (counter++ < 100) {
++			if (i2c->xfer(i2c, &tuner_msg, 1) == 1) {
++				if (tuner_buf[0] & 0x40) {
++					counter2++;
++				} else {
++					counter2 = 0;
++				}
++			}
++
++			if (counter2 > 10) {
++				break;
++			}
++		}
++		tda1004x_disable_tuner_i2c(i2c, tda_state);
++		break;
++
++	case TDM1316L_ADDRESS:
++		// determine charge pump
++		tuner_frequency = fe_params->frequency + 36130000;
++		if (tuner_frequency < 87000000) {
++			return -EINVAL;
++		} else if (tuner_frequency < 130000000) {
++                        cp = 3;
++		} else if (tuner_frequency < 160000000) {
++			cp = 5;
++		} else if (tuner_frequency < 200000000) {
++			cp = 6;
++		} else if (tuner_frequency < 290000000) {
++			cp = 3;
++		} else if (tuner_frequency < 420000000) {
++			cp = 5;
++		} else if (tuner_frequency < 480000000) {
++			cp = 6;
++		} else if (tuner_frequency < 620000000) {
++			cp = 3;
++		} else if (tuner_frequency < 830000000) {
++			cp = 5;
++		} else if (tuner_frequency < 895000000) {
++			cp = 7;
++		} else {
++			return -EINVAL;
++		}
++
++		// determine band
++		if (fe_params->frequency < 49000000) {
++                        return -EINVAL;
++		} else if (fe_params->frequency < 159000000) {
++                        band = 1;
++		} else if (fe_params->frequency < 444000000) {
++			band = 2;
++		} else if (fe_params->frequency < 861000000) {
++			band = 4;
++		} else {
++			return -EINVAL;
++		}
++
++		// work out filter
++		switch (fe_params->u.ofdm.bandwidth) {
++		case BANDWIDTH_6_MHZ:
++                        // 6 MHz isn't supported directly, but set this to
++                        // the 8 MHz setting in case we can fiddle it later
++                        filter = 1;
++                        break;
++
++                case BANDWIDTH_7_MHZ:
++			filter = 0;
++			break;
++
++		case BANDWIDTH_8_MHZ:
++			filter = 1;
++			break;
++
++		default:
++			return -EINVAL;
++		}
++
++		// calculate tuner parameters
++		tuner_frequency =
++                        (((fe_params->frequency / 1000) * 6) + 217280) / 1000;
++		tuner_buf[0] = tuner_frequency >> 8;
++		tuner_buf[1] = tuner_frequency & 0xff;
++		tuner_buf[2] = 0xca;
++		tuner_buf[3] = (cp << 5) | (filter << 3) | band;
++
++		// tune it
++		tda1004x_enable_tuner_i2c(i2c, tda_state);
++		tuner_msg.addr = tda_state->tuner_address;
++		tuner_msg.len = 4;
++                if (i2c->xfer(i2c, &tuner_msg, 1) != 1) {
++			return -EIO;
++		}
++		dvb_delay(1);
++		tda1004x_disable_tuner_i2c(i2c, tda_state);
++		break;
++
++	default:
++		return -EINVAL;
++	}
++
++	dprintk("%s: success\n", __FUNCTION__);
++
++	// done
++	return 0;
++}
++
++static int tda1004x_set_fe(struct dvb_i2c_bus *i2c,
++	 	           struct tda1004x_state *tda_state,
++		           struct dvb_frontend_parameters *fe_params)
++{
++	int tmp;
++
++	dprintk("%s\n", __FUNCTION__);
++
++
++	// set frequency
++	tmp = tda1004x_set_frequency(i2c, tda_state, fe_params);
++	if (tmp < 0)
++		return tmp;
++
++        // hardcoded to use auto as much as possible
++        fe_params->u.ofdm.code_rate_HP = FEC_AUTO;
++        fe_params->u.ofdm.guard_interval = GUARD_INTERVAL_AUTO;
++        fe_params->u.ofdm.transmission_mode = TRANSMISSION_MODE_AUTO;
++
++	// Set standard params.. or put them to auto
++	if ((fe_params->u.ofdm.code_rate_HP == FEC_AUTO) ||
++	    (fe_params->u.ofdm.code_rate_LP == FEC_AUTO) ||
++	    (fe_params->u.ofdm.constellation == QAM_AUTO) ||
++	    (fe_params->u.ofdm.hierarchy_information == HIERARCHY_AUTO)) {
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 1, 1);	// enable auto
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x03, 0);	// turn off constellation bits
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x60, 0);	// turn off hierarchy bits
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF2, 0x3f, 0);	// turn off FEC bits
++	} else {
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 1, 0);	// disable auto
++
++		// set HP FEC
++		tmp = tda1004x_encode_fec(fe_params->u.ofdm.code_rate_HP);
++		if (tmp < 0) return tmp;
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF2, 7, tmp);
++
++		// set LP FEC
++		if (fe_params->u.ofdm.code_rate_LP != FEC_NONE) {
++			tmp = tda1004x_encode_fec(fe_params->u.ofdm.code_rate_LP);
++			if (tmp < 0) return tmp;
++			tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF2, 0x38, tmp << 3);
++		}
++
++		// set constellation
++		switch (fe_params->u.ofdm.constellation) {
++		case QPSK:
++			tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 3, 0);
++			break;
++
++		case QAM_16:
++			tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 3, 1);
++			break;
++
++		case QAM_64:
++			tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 3, 2);
++			break;
++
++		default:
++			return -EINVAL;
++		}
++
++		// set hierarchy
++		switch (fe_params->u.ofdm.hierarchy_information) {
++		case HIERARCHY_NONE:
++			tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x60, 0 << 5);
++			break;
++
++		case HIERARCHY_1:
++			tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x60, 1 << 5);
++			break;
++
++		case HIERARCHY_2:
++			tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x60, 2 << 5);
++			break;
++
++		case HIERARCHY_4:
++			tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x60, 3 << 5);
++			break;
++
++		default:
++			return -EINVAL;
++		}
++	}
++
++        // set bandwidth
++        switch(tda_state->tda1004x_address) {
++        case TDA10045H_ADDRESS:
++                tda10045h_set_bandwidth(i2c, tda_state, fe_params->u.ofdm.bandwidth);
++                break;
++        }
++
++	// set inversion
++	switch (fe_params->inversion) {
++	case INVERSION_OFF:
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC1, 0x20, 0);
++		break;
++
++	case INVERSION_ON:
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC1, 0x20, 0x20);
++		break;
++
++	default:
++		return -EINVAL;
++	}
++
++	// set guard interval
++	switch (fe_params->u.ofdm.guard_interval) {
++	case GUARD_INTERVAL_1_32:
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 2, 0);
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x0c, 0 << 2);
++		break;
++
++	case GUARD_INTERVAL_1_16:
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 2, 0);
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x0c, 1 << 2);
++		break;
++
++	case GUARD_INTERVAL_1_8:
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 2, 0);
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x0c, 2 << 2);
++		break;
++
++	case GUARD_INTERVAL_1_4:
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 2, 0);
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x0c, 3 << 2);
++		break;
++
++	case GUARD_INTERVAL_AUTO:
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 2, 2);
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x0c, 0 << 2);
++		break;
++
++	default:
++		return -EINVAL;
++	}
++
++	// set transmission mode
++	switch (fe_params->u.ofdm.transmission_mode) {
++	case TRANSMISSION_MODE_2K:
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 4, 0);
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x10, 0 << 4);
++		break;
++
++	case TRANSMISSION_MODE_8K:
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 4, 0);
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x10, 1 << 4);
++		break;
++
++	case TRANSMISSION_MODE_AUTO:
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 4, 4);
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x10, 0);
++		break;
++
++	default:
++		return -EINVAL;
++	}
++
++	// reset DSP
++	tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC4, 8, 8);
++	tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC4, 8, 0);
++	dvb_delay(10);
++
++	// done
++	return 0;
++}
++
++
++static int tda1004x_get_fe(struct dvb_i2c_bus *i2c, struct tda1004x_state* tda_state, struct dvb_frontend_parameters *fe_params)
++{
++
++	dprintk("%s\n", __FUNCTION__);
++
++	// inversion status
++	fe_params->inversion = INVERSION_OFF;
++	if (tda1004x_read_byte(i2c, tda_state, TDA1004X_CONFC1) & 0x20) {
++		fe_params->inversion = INVERSION_ON;
++	}
++
++	// bandwidth
++	switch (tda1004x_read_byte(i2c, tda_state, TDA1004X_WREF_LSB)) {
++	case 0x14:
++		fe_params->u.ofdm.bandwidth = BANDWIDTH_8_MHZ;
++		break;
++	case 0xdb:
++		fe_params->u.ofdm.bandwidth = BANDWIDTH_7_MHZ;
++		break;
++	case 0x4f:
++		fe_params->u.ofdm.bandwidth = BANDWIDTH_6_MHZ;
++		break;
++	}
++
++	// FEC
++	fe_params->u.ofdm.code_rate_HP =
++	    tda1004x_decode_fec(tda1004x_read_byte(i2c, tda_state, TDA1004X_OUT_CONF2) & 7);
++	fe_params->u.ofdm.code_rate_LP =
++	    tda1004x_decode_fec((tda1004x_read_byte(i2c, tda_state, TDA1004X_OUT_CONF2) >> 3) & 7);
++
++	// constellation
++	switch (tda1004x_read_byte(i2c, tda_state, TDA1004X_OUT_CONF1) & 3) {
++	case 0:
++		fe_params->u.ofdm.constellation = QPSK;
++		break;
++	case 1:
++		fe_params->u.ofdm.constellation = QAM_16;
++		break;
++	case 2:
++		fe_params->u.ofdm.constellation = QAM_64;
++		break;
++	}
++
++	// transmission mode
++	fe_params->u.ofdm.transmission_mode = TRANSMISSION_MODE_2K;
++	if (tda1004x_read_byte(i2c, tda_state, TDA1004X_OUT_CONF1) & 0x10) {
++		fe_params->u.ofdm.transmission_mode = TRANSMISSION_MODE_8K;
++	}
++
++	// guard interval
++	switch ((tda1004x_read_byte(i2c, tda_state, TDA1004X_OUT_CONF1) & 0x0c) >> 2) {
++	case 0:
++		fe_params->u.ofdm.guard_interval = GUARD_INTERVAL_1_32;
++		break;
++	case 1:
++		fe_params->u.ofdm.guard_interval = GUARD_INTERVAL_1_16;
++		break;
++	case 2:
++		fe_params->u.ofdm.guard_interval = GUARD_INTERVAL_1_8;
++		break;
++	case 3:
++		fe_params->u.ofdm.guard_interval = GUARD_INTERVAL_1_4;
++		break;
++	}
++
++	// hierarchy
++	switch ((tda1004x_read_byte(i2c, tda_state, TDA1004X_OUT_CONF1) & 0x60) >> 5) {
++	case 0:
++		fe_params->u.ofdm.hierarchy_information = HIERARCHY_NONE;
++		break;
++	case 1:
++		fe_params->u.ofdm.hierarchy_information = HIERARCHY_1;
++		break;
++	case 2:
++		fe_params->u.ofdm.hierarchy_information = HIERARCHY_2;
++		break;
++	case 3:
++		fe_params->u.ofdm.hierarchy_information = HIERARCHY_4;
++		break;
++	}
++
++	// done
++	return 0;
++}
++
++
++static int tda1004x_read_status(struct dvb_i2c_bus *i2c, struct tda1004x_state* tda_state, fe_status_t * fe_status)
++{
++	int status;
++        int cber;
++        int vber;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	// read status
++	status = tda1004x_read_byte(i2c, tda_state, TDA1004X_STATUS_CD);
++	if (status == -1) {
++		return -EIO;
++	}
++
++        // decode
++	*fe_status = 0;
++        if (status & 4) *fe_status |= FE_HAS_SIGNAL;
++        if (status & 2) *fe_status |= FE_HAS_CARRIER;
++        if (status & 8) *fe_status |= FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
++
++        // if we don't already have VITERBI (i.e. not LOCKED), see if the viterbi
++        // is getting anything valid
++        if (!(*fe_status & FE_HAS_VITERBI)) {
++                // read the CBER
++                cber = tda1004x_read_byte(i2c, tda_state, TDA1004X_CBER_LSB);
++                if (cber == -1) return -EIO;
++                status = tda1004x_read_byte(i2c, tda_state, TDA1004X_CBER_MSB);
++                if (status == -1) return -EIO;
++                cber |= (status << 8);
++                tda1004x_read_byte(i2c, tda_state, TDA1004X_CBER_RESET);
++
++                if (cber != 65535) {
++                        *fe_status |= FE_HAS_VITERBI;
++                }
++        }
++
++        // if we DO have some valid VITERBI output, but don't already have SYNC
++        // bytes (i.e. not LOCKED), see if the RS decoder is getting anything valid.
++        if ((*fe_status & FE_HAS_VITERBI) && (!(*fe_status & FE_HAS_SYNC))) {
++                // read the VBER
++                vber = tda1004x_read_byte(i2c, tda_state, TDA1004X_VBER_LSB);
++                if (vber == -1) return -EIO;
++                status = tda1004x_read_byte(i2c, tda_state, TDA1004X_VBER_MID);
++                if (status == -1) return -EIO;
++                vber |= (status << 8);
++                status = tda1004x_read_byte(i2c, tda_state, TDA1004X_VBER_MSB);
++                if (status == -1) return -EIO;
++                vber |= ((status << 16) & 0x0f);
++                tda1004x_read_byte(i2c, tda_state, TDA1004X_CVBER_LUT);
++
++                // if RS has passed some valid TS packets, then we must be
++                // getting some SYNC bytes
++                if (vber < 16632) {
++                        *fe_status |= FE_HAS_SYNC;
++                }
++        }
++
++	// success
++	dprintk("%s: fe_status=0x%x\n", __FUNCTION__, *fe_status);
++	return 0;
++}
++
++static int tda1004x_read_signal_strength(struct dvb_i2c_bus *i2c, struct tda1004x_state* tda_state, u16 * signal)
++{
++	int tmp;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	// read it
++	tmp = tda1004x_read_byte(i2c, tda_state, TDA1004X_SIGNAL_STRENGTH);
++	if (tmp < 0)
++		return -EIO;
++
++	// done
++	*signal = (tmp << 8) | tmp;
++	dprintk("%s: signal=0x%x\n", __FUNCTION__, *signal);
++	return 0;
++}
++
++
++static int tda1004x_read_snr(struct dvb_i2c_bus *i2c, struct tda1004x_state* tda_state, u16 * snr)
++{
++	int tmp;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	// read it
++	tmp = tda1004x_read_byte(i2c, tda_state, TDA1004X_SNR);
++	if (tmp < 0)
++		return -EIO;
++        if (tmp) {
++                tmp = 255 - tmp;
++        }
++
++        // done
++	*snr = ((tmp << 8) | tmp);
++	dprintk("%s: snr=0x%x\n", __FUNCTION__, *snr);
++	return 0;
++}
++
++static int tda1004x_read_ucblocks(struct dvb_i2c_bus *i2c, struct tda1004x_state* tda_state, u32* ucblocks)
++{
++	int tmp;
++	int tmp2;
++	int counter;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	// read the UCBLOCKS and reset
++	counter = 0;
++	tmp = tda1004x_read_byte(i2c, tda_state, TDA1004X_UNCOR);
++	if (tmp < 0)
++		return -EIO;
++        tmp &= 0x7f;
++	while (counter++ < 5) {
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_UNCOR, 0x80, 0);
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_UNCOR, 0x80, 0);
++		tda1004x_write_mask(i2c, tda_state, TDA1004X_UNCOR, 0x80, 0);
++
++		tmp2 = tda1004x_read_byte(i2c, tda_state, TDA1004X_UNCOR);
++		if (tmp2 < 0)
++			return -EIO;
++		tmp2 &= 0x7f;
++		if ((tmp2 < tmp) || (tmp2 == 0))
++			break;
++	}
++
++	// done
++	if (tmp != 0x7f) {
++		*ucblocks = tmp;
++	} else {
++		*ucblocks = 0xffffffff;
++	}
++	dprintk("%s: ucblocks=0x%x\n", __FUNCTION__, *ucblocks);
++	return 0;
++}
++
++static int tda1004x_read_ber(struct dvb_i2c_bus *i2c, struct tda1004x_state* tda_state, u32* ber)
++{
++        int tmp;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	// read it in
++        tmp = tda1004x_read_byte(i2c, tda_state, TDA1004X_CBER_LSB);
++        if (tmp < 0) return -EIO;
++        *ber = tmp << 1;
++        tmp = tda1004x_read_byte(i2c, tda_state, TDA1004X_CBER_MSB);
++        if (tmp < 0) return -EIO;
++        *ber |= (tmp << 9);
++        tda1004x_read_byte(i2c, tda_state, TDA1004X_CBER_RESET);
++
++	// done
++	dprintk("%s: ber=0x%x\n", __FUNCTION__, *ber);
++	return 0;
++}
++
++
++static int tda1004x_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
++{
++	int status = 0;
++	struct dvb_i2c_bus *i2c = fe->i2c;
++	struct tda1004x_state *tda_state = (struct tda1004x_state *) &(fe->data);
++
++	dprintk("%s: cmd=0x%x\n", __FUNCTION__, cmd);
++
++	switch (cmd) {
++	case FE_GET_INFO:
++                switch(tda_state->tda1004x_address) {
++                case TDA10045H_ADDRESS:
++        		memcpy(arg, &tda10045h_info, sizeof(struct dvb_frontend_info));
++                        break;
++                }
++		break;
++
++	case FE_READ_STATUS:
++		return tda1004x_read_status(i2c, tda_state, (fe_status_t *) arg);
++
++	case FE_READ_BER:
++		return tda1004x_read_ber(i2c, tda_state, (u32 *) arg);
++
++	case FE_READ_SIGNAL_STRENGTH:
++		return tda1004x_read_signal_strength(i2c, tda_state, (u16 *) arg);
++
++	case FE_READ_SNR:
++		return tda1004x_read_snr(i2c, tda_state, (u16 *) arg);
++
++	case FE_READ_UNCORRECTED_BLOCKS:
++		return tda1004x_read_ucblocks(i2c, tda_state, (u32 *) arg);
++
++	case FE_SET_FRONTEND:
++		return tda1004x_set_fe(i2c, tda_state, (struct dvb_frontend_parameters*) arg);
++
++	case FE_GET_FRONTEND:
++		return tda1004x_get_fe(i2c, tda_state, (struct dvb_frontend_parameters*) arg);
++
++	case FE_INIT:
++		// don't bother reinitialising
++		if (tda_state->initialised)
++			return 0;
++
++		// OK, perform initialisation
++                status = tda1004x_init(i2c, tda_state);
++		if (status == 0)
++			tda_state->initialised = 1;
++		return status;
++
++	default:
++		return -EOPNOTSUPP;
++	}
++
++	return 0;
++}
++
++
++static int tda1004x_attach(struct dvb_i2c_bus *i2c)
++{
++        int tda1004x_address = -1;
++	int tuner_address = -1;
++	struct tda1004x_state tda_state;
++	struct i2c_msg tuner_msg = {.addr=0, .flags=0, .buf=0, .len=0 };
++        static u8 td1344_init[] = { 0x0b, 0xf5, 0x88, 0xab };
++        static u8 tdm1316l_init[] = { 0x0b, 0xf5, 0x85, 0xab };
++
++	dprintk("%s\n", __FUNCTION__);
++
++	// probe for frontend
++        tda_state.tda1004x_address = TDA10045H_ADDRESS;
++	if (tda1004x_read_byte(i2c, &tda_state, TDA1004X_CHIPID) == 0x25) {
++                tda1004x_address = TDA10045H_ADDRESS;
++                printk("tda1004x: Detected Philips TDA10045H.\n");
++        }
++
++        // did we find a frontend?
++        if (tda1004x_address == -1) {
++		return -ENODEV;
++        }
++
++	// supported tuner?
++	tda1004x_enable_tuner_i2c(i2c, &tda_state);
++	tuner_msg.addr = TD1344_ADDRESS;
++	tuner_msg.buf = td1344_init;
++	tuner_msg.len = sizeof(td1344_init);
++	if (i2c->xfer(i2c, &tuner_msg, 1) == 1) {
++                dvb_delay(1);
++		tuner_address = TD1344_ADDRESS;
++		printk("tda1004x: Detected Philips TD1344 tuner. PLEASE CHECK THIS AND REPORT BACK!.\n");
++	} else {
++		tuner_msg.addr = TDM1316L_ADDRESS;
++                tuner_msg.buf = tdm1316l_init;
++                tuner_msg.len = sizeof(tdm1316l_init);
++                if (i2c->xfer(i2c, &tuner_msg, 1) == 1) {
++                        dvb_delay(1);
++			tuner_address = TDM1316L_ADDRESS;
++			printk("tda1004x: Detected Philips TDM1316L tuner.\n");
++		}
++	}
++	tda1004x_disable_tuner_i2c(i2c, &tda_state);
++
++	// did we find a tuner?
++	if (tuner_address == -1) {
++		printk("tda1004x: Detected, but with unknown tuner.\n");
++		return -ENODEV;
++	}
++
++        // create state
++        tda_state.tda1004x_address = tda1004x_address;
++	tda_state.tuner_address = tuner_address;
++	tda_state.initialised = 0;
++
++	// register
++        switch(tda_state.tda1004x_address) {
++        case TDA10045H_ADDRESS:
++        	dvb_register_frontend(tda1004x_ioctl, i2c, (void *)(*((u32*) &tda_state)), &tda10045h_info);
++                break;
++        }
++
++	// success
++	return 0;
++}
++
++
++static
++void tda1004x_detach(struct dvb_i2c_bus *i2c)
++{
++	dprintk("%s\n", __FUNCTION__);
++
++	dvb_unregister_frontend(tda1004x_ioctl, i2c);
++}
++
++
++static
++int __init init_tda1004x(void)
++{
++	return dvb_register_i2c_device(THIS_MODULE, tda1004x_attach, tda1004x_detach);
++}
++
++
++static
++void __exit exit_tda1004x(void)
++{
++	dvb_unregister_i2c_device(tda1004x_attach);
++}
++
++module_init(init_tda1004x);
++module_exit(exit_tda1004x);
++
++MODULE_DESCRIPTION("Philips TDA10045H DVB-T Frontend");
++MODULE_AUTHOR("Andrew de Quincey & Robert Schlabbach");
++MODULE_LICENSE("GPL");
++
++MODULE_PARM(tda1004x_debug, "i");
++MODULE_PARM_DESC(tda1004x_debug, "enable verbose debug messages");
++
++MODULE_PARM(tda1004x_firmware, "s");
++MODULE_PARM_DESC(tda1004x_firmware, "Where to find the firmware file");
+--- linux-2.6.0-test1/drivers/media/dvb/frontends/ves1820.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/frontends/ves1820.c	2003-07-19 17:03:49.000000000 -0700
+@@ -95,7 +95,7 @@ static struct dvb_frontend_info ves1820_
+ 
+ static u8 ves1820_inittab [] =
+ {
+-	0x69, 0x6A, 0x9B, 0x0A, 0x52, 0x46, 0x26, 0x1A,
++	0x69, 0x6A, 0x9B, 0x12, 0x12, 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,
+@@ -109,7 +109,7 @@ static int ves1820_writereg (struct dvb_
+ {
+ 	u8 addr = GET_DEMOD_ADDR(fe->data);
+         u8 buf[] = { 0x00, reg, data };
+-	struct i2c_msg msg = { addr: addr, .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;
+ 
+@@ -130,8 +130,8 @@ static u8 ves1820_readreg (struct dvb_fr
+ 	u8 b0 [] = { 0x00, reg };
+ 	u8 b1 [] = { 0 };
+ 	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 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;
+ 
+@@ -147,7 +147,7 @@ static u8 ves1820_readreg (struct dvb_fr
+ static 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);
+ 
+--- linux-2.6.0-test1/drivers/media/dvb/Kconfig	2003-06-14 12:18:06.000000000 -0700
++++ 25/drivers/media/dvb/Kconfig	2003-07-19 17:03:49.000000000 -0700
+@@ -33,9 +33,19 @@ source "drivers/media/dvb/dvb-core/Kconf
+ source "drivers/media/dvb/frontends/Kconfig"
+ 
+ comment "Supported SAA7146 based PCI Adapters"
+-	depends on DVB
++	depends on DVB && PCI
+ 
+ source "drivers/media/dvb/ttpci/Kconfig"
+ 
++comment "Supported USB Adapters"
++	depends on DVB && USB
++
++source "drivers/media/dvb/ttusb-budget/Kconfig"
++source "drivers/media/dvb/ttusb-dec/Kconfig"
++
++comment "Supported FlexCopII (B2C2) Adapters"
++	depends on DVB && PCI
++source "drivers/media/dvb/b2c2/Kconfig"
++
+ endmenu
+ 
+--- linux-2.6.0-test1/drivers/media/dvb/Makefile	2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/media/dvb/Makefile	2003-07-19 17:03:49.000000000 -0700
+@@ -2,4 +2,5 @@
+ # Makefile for the kernel multimedia device drivers.
+ #
+ 
+-obj-y        := dvb-core/ frontends/ ttpci/ # ttusb-budget/
++obj-y        := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/
++
+--- linux-2.6.0-test1/drivers/media/dvb/ttpci/av7110.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/av7110.c	2003-07-19 17:03:49.000000000 -0700
+@@ -86,6 +86,7 @@
+ 	#define DEB_EE(x)
+ #endif
+ 
++#include "ttpci-eeprom.h"
+ #include "av7110.h"
+ #include "av7110_ipack.h"
+ 
+@@ -110,7 +111,8 @@ static int hw_sections = 1;
+ 
+ int av7110_num = 0;
+ 
+-#define FW_CI_LL_SUPPORT(arm_app) (((arm_app) >> 16) & 0x8000)
++#define FW_CI_LL_SUPPORT(arm_app) ((arm_app) & 0x80000000)
++#define FW_VERSION(arm_app)       ((arm_app) & 0x0000FFFF)
+ 
+ /****************************************************************************
+  * DEBI functions
+@@ -1089,7 +1091,7 @@ static int OutCommand(struct av7110 *av7
+         u32 stat;
+ #endif
+ 
+-	DEB_EE(("av7110: %p\n",av7110));
++//	DEB_EE(("av7110: %p\n",av7110));
+ 
+ 	if (!av7110->arm_ready) {
+ 		DEB_D(("arm not ready.\n"));
+@@ -1166,7 +1168,7 @@ static inline int SOutCommand(struct av7
+ {
+         int ret;
+         
+- 	DEB_EE(("av7110: %p\n",av7110));
++// 	DEB_EE(("av7110: %p\n",av7110));
+ 
+         if (!av7110->arm_ready) {
+ 		DEB_D(("arm not ready.\n"));
+@@ -1190,7 +1192,7 @@ static int outcom(struct av7110 *av7110,
+         u16 buf[num+2];
+         int i, ret;
+ 
+- 	DEB_EE(("av7110: %p\n",av7110));
++// 	DEB_EE(("av7110: %p\n",av7110));
+ 
+         buf[0]=(( type << 8 ) | com);
+         buf[1]=num;
+@@ -1332,7 +1334,7 @@ static inline int msp_writereg(struct av
+ 
+ static inline int SendDAC(struct av7110 *av7110, u8 addr, u8 data)
+ {
+- 	DEB_EE(("av7110: %p\n",av7110));
++// 	DEB_EE(("av7110: %p\n",av7110));
+ 
+         return outcom(av7110, COMTYPE_AUDIODAC, AudioDAC, 2, addr, data);
+ }
+@@ -1659,6 +1661,24 @@ static void OSDSetColor(struct av7110 *a
+                   color, ((blend>>4)&0x0f));
+ }
+ 
++static int OSDSetPalette(struct av7110 *av7110, u32 *colors, u8 first, u8 last)
++{
++       int i;
++       int length = last - first + 1;
++
++       if (length * 4 > DATA_BUFF3_SIZE)
++               return -1;
++
++       for (i=0; i<length; i++) {
++               u32 blend = (colors[i] & 0xF0000000) >> 4;
++               u32 yuv = blend ? RGB2YUV(colors[i] & 0xFF, (colors[i] >> 8) & 0xFF, (colors[i] >> 16) & 0xFF) | blend : 0;
++               yuv = ((yuv & 0xFFFF0000) >> 16) | ((yuv & 0x0000FFFF) << 16); // TODO kls2003-06-15: not sure if this is endian-proof
++               wdebi(av7110, DEBINOSWAP, DATA_BUFF3_BASE + i*4, yuv, 4);
++       }
++       return outcom(av7110, COMTYPE_OSD, Set_Palette, 4,
++               av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]], first, last);
++}
++
+ static int OSDSetBlock(struct av7110 *av7110, int x0, int y0, int x1, int y1, int inc, u8 *data)
+ {
+         uint w, h, bpp, bpl, size, lpb, bnum, brest;
+@@ -1721,6 +1741,9 @@ static int OSD_DrawCommand(struct av7110
+                 return 0;
+         case OSD_SetPalette:
+         {      
++                if (FW_VERSION(av7110->arm_app) >= 0x2618)
++                        OSDSetPalette(av7110, (u32 *)dc->data, dc->color, dc->x0);
++                else {
+                 int i, len=dc->x0-dc->color+1;
+                 u8 *colors=(u8 *)dc->data;
+ 
+@@ -1728,6 +1751,7 @@ static int OSD_DrawCommand(struct av7110
+                         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: 
+@@ -2087,28 +2111,28 @@ static void SetMode(struct av7110 *av711
+ 
+ static inline void TestMode(struct av7110 *av7110, int mode)
+ {
+- 	DEB_EE(("av7110: %p\n",av7110));
++//	DEB_EE(("av7110: %p\n",av7110));
+         outcom(av7110, COMTYPE_ENCODER, SetTestMode, 1, mode);
+ }
+ 
+ static inline void VidMode(struct av7110 *av7110, int mode)
+ {
+- 	DEB_EE(("av7110: %p\n",av7110));
++// 	DEB_EE(("av7110: %p\n",av7110));
+         outcom(av7110, COMTYPE_ENCODER, SetVidMode, 1, mode);
+ }
+            
+ 
+-static inline int vidcom(struct av7110 *av7110, u32 com, u32 arg)
++static int inline vidcom(struct av7110 *av7110, u32 com, u32 arg)
+ {
+- 	DEB_EE(("av7110: %p\n",av7110));
++// 	DEB_EE(("av7110: %p\n",av7110));
+         return outcom(av7110, 0x80, 0x02, 4, 
+                       (com>>16), (com&0xffff), 
+                       (arg>>16), (arg&0xffff));
+ }
+ 
+-static inline int audcom(struct av7110 *av7110, u32 com)
++static int inline audcom(struct av7110 *av7110, u32 com)
+ {
+-	DEB_EE(("av7110: %p\n",av7110));
++//	DEB_EE(("av7110: %p\n",av7110));
+ 	return outcom(av7110, 0x80, 0x03, 4, 
+                       (com>>16), (com&0xffff));
+ }
+@@ -2583,38 +2607,274 @@ void p_to_t(u8 const *buf, long int leng
+  * V4L SECTION
+  ****************************************************************************/
+ 
+-int av7110_ioctl(struct saa7146_dev *dev, unsigned int cmd, void *arg) 
++static struct v4l2_input inputs[2] = {
++	{ 0,	"DVB",		V4L2_INPUT_TYPE_CAMERA,	1, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, 
++	{ 1,	"ANALOG",	V4L2_INPUT_TYPE_TUNER,	2, 1, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++};
++
++/* taken from ves1820.c */
++static int ves1820_writereg(struct saa7146_dev *dev, u8 reg, u8 data)
++{
++	u8 addr = 0x09;
++        u8 buf[] = { 0x00, reg, data };
++	struct i2c_msg msg = { .addr = addr, .flags = 0, .buf = buf, .len = 3 };
++
++  	DEB_EE(("av7710: dev: %p\n",dev));
++
++	if( 1 != saa7146_i2c_transfer(dev, &msg, 1, 1)) {
++		return -1;
++	}
++	return 0;
++}
++
++static int tuner_write(struct saa7146_dev *dev, u8 addr, u8 data [4])
++{
++        struct i2c_msg msg = { .addr = addr, .flags = 0, .buf = data, .len = 4 };
++
++  	DEB_EE(("av7710: dev: %p\n",dev));
++
++	if( 1 != saa7146_i2c_transfer(dev, &msg, 1, 1)) {
++		return -1;
++	}
++	return 0;
++}
++
++
++/**
++ *   set up the downconverter frequency divisor for a
++ *   reference clock comparision frequency of 62.5 kHz.
++ */
++static int tuner_set_tv_freq (struct saa7146_dev *dev, u32 freq)
++{
++        u32 div;
++	u8 config;
++        u8 buf [4];
++
++ 	DEB_EE(("av7710: freq: 0x%08x\n",freq));
++
++	/* magic number: 56. tuning with the frequency given by v4l2
++	   is always off by 56*62.5 kHz...*/
++	div = freq + 56;
++
++	buf[0] = (div >> 8) & 0x7f;
++	buf[1] = div & 0xff;
++	buf[2] = 0x8e;
++
++	if (freq < 16*168.25 ) 
++		config = 0xa0;
++	else if (freq < 16*447.25) 
++		config = 0x90;
++	else
++		config = 0x30;
++	config &= ~0x02;
++
++	buf[3] = config;
++
++        return tuner_write (dev, 0x61, buf);
++}
++
++static struct saa7146_standard analog_standard[];
++static struct saa7146_standard dvb_standard[];
++static struct saa7146_standard standard[];
++
++int av7110_dvb_c_switch(struct saa7146_fh *fh)
++{
++	struct saa7146_dev *dev = fh->dev;
++	struct saa7146_vv *vv = dev->vv_data;
++	struct av7110 *av7110 = (struct av7110*)dev->ext_priv;
++	u16 buf[3] = { ((COMTYPE_AUDIODAC << 8) + ADSwitch), 1, 1 };
++
++	u8 band = 0;
++	int source, sync;
++	struct saa7146_fh *ov_fh = NULL;
++	int restart_overlay = 0;
++
++	DEB_EE(("av7110: %p\n",av7110));
++
++	if( vv->ov_data != NULL ) {
++		ov_fh = vv->ov_data->fh;
++		saa7146_stop_preview(ov_fh);
++		restart_overlay = 1;
++	}
++
++	if( 0 != av7110->current_input ) {
++		buf[2] = 0;
++		band = 0x68; /* analog band */
++		source = SAA7146_HPS_SOURCE_PORT_B;
++		sync = SAA7146_HPS_SYNC_PORT_B;
++		memcpy(standard,analog_standard,sizeof(struct saa7146_standard)*2);
++	} else {
++		buf[2] = 1;
++		band = 0x28; /* digital band */	
++		source = SAA7146_HPS_SOURCE_PORT_A;
++		sync = SAA7146_HPS_SYNC_PORT_A;
++		memcpy(standard,dvb_standard,sizeof(struct saa7146_standard)*2);
++	}
++
++	/* hmm, this does not do anything!? */
++	if (OutCommand(av7110, buf, 3)) {
++		printk("ADSwitch error\n");
++	}
++
++	if( 0 != ves1820_writereg(dev, 0x0f, band )) {
++		printk("setting band in demodulator failed.\n");
++	}
++	saa7146_set_hps_source_and_sync(dev, source, sync);
++
++	/* restart overlay if it was active before */
++	if( 0 != restart_overlay ) {
++		saa7146_start_preview(ov_fh);
++	}
++
++	return 0;
++}
++
++int av7110_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) 
+ {
++	struct saa7146_dev *dev = fh->dev;
++	struct av7110 *av7110 = (struct av7110*)dev->ext_priv;
+  	DEB_EE(("saa7146_dev: %p\n",dev));
+ 
+ 	switch(cmd) {
++	case VIDIOC_G_TUNER:
++	{
++		struct v4l2_tuner *t = arg;
++
++		DEB_EE(("VIDIOC_G_TUNER: %d\n", t->index));
++
++		if( 0 == av7110->has_analog_tuner || av7110->current_input != 1 ) {
++			return -EINVAL;
++		}
++
++		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;		
++		/* fixme: real autodetection here */
++		t->rxsubchans 	= V4L2_TUNER_SUB_STEREO | V4L2_TUNER_SUB_MONO;
++
++		return 0;
++	}
++	case VIDIOC_S_TUNER:
++	{
++		struct v4l2_tuner *t = arg;
++		
++		DEB_EE(("VIDIOC_S_TUNER: %d\n", t->index));
++
++		if( 0 == av7110->has_analog_tuner || av7110->current_input != 1 ) {
++			return -EINVAL;
++		}
++
++
++		switch(t->audmode) {
++			case V4L2_TUNER_MODE_STEREO: {
++				DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_STEREO\n"));
++				break;
++			}
++			case V4L2_TUNER_MODE_LANG1: {
++				DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG1\n"));
++				break;
++			}
++			case V4L2_TUNER_MODE_LANG2: {
++				DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG2\n"));
++				break;
++			}
++			default: { /* case V4L2_TUNER_MODE_MONO: {*/
++				DEB_D(("VIDIOC_S_TUNER: TDA9840_SET_MONO\n"));
++				break;
++			}
++		}
++
++		return 0;
++	}
++	case VIDIOC_G_FREQUENCY:
++	{
++		struct v4l2_frequency *f = arg;
++
++		DEB_EE(("VIDIOC_G_FREQ: freq:0x%08x.\n", f->frequency));
++
++		if( 0 == av7110->has_analog_tuner || av7110->current_input != 1 ) {
++			return -EINVAL;
++		}
++
++		memset(f,0,sizeof(*f));
++		f->type = V4L2_TUNER_ANALOG_TV;
++		f->frequency =  av7110->current_freq;
++
++		return 0;
++	}
++	case VIDIOC_S_FREQUENCY:
++	{
++		struct v4l2_frequency *f = arg;
++
++		DEB_EE(("VIDIOC_S_FREQUENCY: freq:0x%08x.\n",f->frequency));
++
++		if( 0 == av7110->has_analog_tuner || av7110->current_input != 1 ) {
++			return -EINVAL;
++		}
++
++		if (V4L2_TUNER_ANALOG_TV != f->type)
++			return -EINVAL;
++
++		/* tune in desired frequency */			
++		tuner_set_tv_freq(dev, f->frequency);
++		av7110->current_freq = f->frequency;
++
++		return 0;
++	}
+ 	case VIDIOC_ENUMINPUT:
+ 	{
+ 		struct v4l2_input *i = arg;
+ 		
++		DEB_EE(("VIDIOC_ENUMINPUT: %d\n", i->index));
++
++		if( 0 != av7110->has_analog_tuner ) {
++			if( i->index < 0 || i->index >= 2) {
++				return -EINVAL;
++			}
++		} else {
+ 		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;
++		memcpy(i, &inputs[i->index], sizeof(struct v4l2_input));
+ 		
+ 		return 0;
+ 	}
+ 	case VIDIOC_G_INPUT:
+ 	{
+ 		int *input = (int *)arg;
+-		*input = 0;
++		*input = av7110->current_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));
++
++		if( 0 == av7110->has_analog_tuner ) {
+ 		return 0;		
+ 	}	
++		
++		if( input < 0 || input >= 2) {
++			return -EINVAL;
++		}
++		
++		/* fixme: switch inputs here */
++		av7110->current_input = input;
++		return av7110_dvb_c_switch(fh);
++	}	
+ 	default:
++		printk("no such ioctl\n");
+ 		return -ENOIOCTLCMD;
+ 	}
+ 	return 0;
+@@ -2997,7 +3257,7 @@ static int dvb_get_stc(struct dmx_demux 
+ 	DEB_EE(("av7110: fwstc = %04hx %04hx %04hx %04hx\n",
+ 			fwstc[0], fwstc[1], fwstc[2], fwstc[3]));
+ 
+-	*stc =  (((uint64_t)fwstc[2] & 1) << 32) |
++	*stc =  (((uint64_t)(~fwstc[2]) & 1) << 32) |
+ 		(((uint64_t)fwstc[1])     << 16) | ((uint64_t)fwstc[0]);
+ 	*base = 1;
+ 
+@@ -4006,7 +4266,6 @@ static int av7110_register(struct av7110
+ #endif
+ //        }
+         
+-        av7110->dvb_net.card_num=av7110->dvb_adapter->num;
+         dvb_net_init(av7110->dvb_adapter, &av7110->dvb_net, &dvbdemux->dmx);
+ 
+ 	return 0;
+@@ -4061,9 +4320,16 @@ struct saa7146_extension_ioctls ioctls[]
+ 	{ VIDIOC_ENUMINPUT, 	SAA7146_EXCLUSIVE },
+ 	{ VIDIOC_G_INPUT,	SAA7146_EXCLUSIVE },
+ 	{ VIDIOC_S_INPUT,	SAA7146_EXCLUSIVE },
++	{ VIDIOC_G_FREQUENCY,	SAA7146_EXCLUSIVE },
++	{ VIDIOC_S_FREQUENCY, 	SAA7146_EXCLUSIVE },
++	{ VIDIOC_G_TUNER, 	SAA7146_EXCLUSIVE },
++	{ VIDIOC_S_TUNER, 	SAA7146_EXCLUSIVE },
+ 	{ 0, 0 }
+ };
+ 
++static struct saa7146_ext_vv av7110_vv_data_st;
++static struct saa7146_ext_vv av7110_vv_data_c;
++
+ static int av7110_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_data *pci_ext)
+ {
+ 	struct av7110 *av7110 = NULL;
+@@ -4081,7 +4347,16 @@ static int av7110_attach (struct saa7146
+ 
+ 	DEB_EE(("dev: %p, av7110: %p\n",dev,av7110));
+ 
+-	if (saa7146_vv_init(dev)) {
++	/* special case DVB-C: these cards have an analog tuner
++	   plus need some special handling, so we have separate
++	   saa7146_ext_vv data for these... */
++	if (dev->pci->subsystem_vendor == 0x110a) {
++		ret = saa7146_vv_init(dev, &av7110_vv_data_c);
++	} else {
++		ret = saa7146_vv_init(dev, &av7110_vv_data_st);
++	}
++	
++	if ( 0 != ret) {
+ 		ERR(("cannot init capture device. skipping.\n"));
+ 		kfree(av7110);
+ 		return -1;
+@@ -4114,6 +4389,8 @@ static int av7110_attach (struct saa7146
+ 		return -ENOMEM;
+ 	}
+ 
++	ttpci_eeprom_parse_mac(av7110->i2c_bus);
++
+ 	saa7146_write(dev, PCI_BT_V1, 0x1c00101f);
+ 	saa7146_write(dev, BCS_CTRL, 0x80400040);
+ 
+@@ -4186,9 +4463,9 @@ static int av7110_attach (struct saa7146
+ 	bootarm(av7110);
+ 	firmversion(av7110);
+ 
+-	if ((av7110->arm_app&0xffff)<0x2501)
++	if (FW_VERSION(av7110->arm_app)<0x2501)
+ 		printk ("av7110: Warning, firmware version 0x%04x is too old. "
+-			"System might be unstable!\n", av7110->arm_app&0xffff);
++			"System might be unstable!\n", FW_VERSION(av7110->arm_app));
+ 
+ 	kernel_thread(arm_thread, (void *) av7110, 0);
+ 
+@@ -4199,6 +4476,8 @@ static int av7110_attach (struct saa7146
+ 	VidMode(av7110, vidmode);
+ 
+ 	/* remaining inits according to card and frontend type */
++	av7110->has_analog_tuner = 0;
++	av7110->current_input = 0;
+ 	if (i2c_writereg(av7110, 0x20, 0x00, 0x00)==1) {
+ 		printk ("av7110(%d): Crystal audio DAC detected\n",
+ 			av7110->dvb_adapter->num);
+@@ -4225,6 +4504,31 @@ static int av7110_attach (struct saa7146
+ 			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
++		
++		if (i2c_writereg(av7110, 0x48, 0x01, 0x00)!=1) {
++			INFO(("saa7113 not accessible.\n"));
++		} else {
++			av7110->has_analog_tuner = 1;
++			/* init the saa7113 */
++			i2c_writereg(av7110, 0x48, 0x02, 0xd0); i2c_writereg(av7110, 0x48, 0x03, 0x23); i2c_writereg(av7110, 0x48, 0x04, 0x00);
++			i2c_writereg(av7110, 0x48, 0x05, 0x00); i2c_writereg(av7110, 0x48, 0x06, 0xe9); i2c_writereg(av7110, 0x48, 0x07, 0x0d);
++			i2c_writereg(av7110, 0x48, 0x08, 0x98); i2c_writereg(av7110, 0x48, 0x09, 0x02); i2c_writereg(av7110, 0x48, 0x0a, 0x80);
++			i2c_writereg(av7110, 0x48, 0x0b, 0x40); i2c_writereg(av7110, 0x48, 0x0c, 0x40); i2c_writereg(av7110, 0x48, 0x0d, 0x00);
++			i2c_writereg(av7110, 0x48, 0x0e, 0x01);	i2c_writereg(av7110, 0x48, 0x0f, 0x7c); i2c_writereg(av7110, 0x48, 0x10, 0x48);
++			i2c_writereg(av7110, 0x48, 0x11, 0x0c);	i2c_writereg(av7110, 0x48, 0x12, 0x8b);	i2c_writereg(av7110, 0x48, 0x13, 0x10);
++			i2c_writereg(av7110, 0x48, 0x14, 0x00);	i2c_writereg(av7110, 0x48, 0x15, 0x00);	i2c_writereg(av7110, 0x48, 0x16, 0x00);
++			i2c_writereg(av7110, 0x48, 0x17, 0x00);	i2c_writereg(av7110, 0x48, 0x18, 0x00);	i2c_writereg(av7110, 0x48, 0x19, 0x00);
++			i2c_writereg(av7110, 0x48, 0x1a, 0x00);	i2c_writereg(av7110, 0x48, 0x1b, 0x00);	i2c_writereg(av7110, 0x48, 0x1c, 0x00);
++			i2c_writereg(av7110, 0x48, 0x1d, 0x00);	i2c_writereg(av7110, 0x48, 0x1e, 0x00);
++		}	
++
++		memcpy(standard,dvb_standard,sizeof(struct saa7146_standard)*2);
++		/* set dd1 stream a & b */
++      		saa7146_write(dev, DD1_STREAM_B, 0x00000000);
++		saa7146_write(dev, DD1_INIT, 0x0200700);
++		saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
++
++
+ 	} else if (dev->pci->subsystem_vendor == 0x110a) {
+ 		printk("av7110(%d): DVB-C w/o analog module detected\n",
+ 			av7110->dvb_adapter->num);
+@@ -4330,6 +4634,16 @@ static struct saa7146_standard standard[
+ 	{ "NTSC", V4L2_STD_NTSC, 0x10, 244, 480, 0x40, 708, 709, 480, 640 },
+ };
+ 
++static struct saa7146_standard analog_standard[] = {
++	{ "PAL", V4L2_STD_PAL, 0x18, 288, 576, 0x08, 708, 709, 576, 768 },
++	{ "NTSC", V4L2_STD_NTSC, 0x10, 244, 480, 0x40, 708, 709, 480, 640 },
++};
++
++static struct saa7146_standard dvb_standard[] = {
++	{ "PAL", V4L2_STD_PAL, 0x14, 288, 576, 0x4a, 708, 709, 576, 768 },
++	{ "NTSC", V4L2_STD_NTSC, 0x10, 244, 480, 0x40, 708, 709, 480, 640 },
++};
++
+ static struct saa7146_extension av7110_extension;
+ 
+ #define MAKE_AV7110_INFO(x_var,x_name) \
+@@ -4387,7 +4701,7 @@ static int std_callback(struct saa7146_d
+ }
+ 
+ 
+-static struct saa7146_ext_vv av7110_vv_data = {
++static struct saa7146_ext_vv av7110_vv_data_st = {
+ 	.inputs		= 1,
+ 	.audios 	= 1,
+ 	.capabilities	= 0,
+@@ -4401,9 +4715,23 @@ static struct saa7146_ext_vv av7110_vv_d
+ 	.ioctl		= av7110_ioctl,
+ };
+ 
++static struct saa7146_ext_vv av7110_vv_data_c = {
++	.inputs		= 1,
++	.audios 	= 1,
++	.capabilities	= V4L2_CAP_TUNER,
++	.flags		= 0,
++
++	.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],
+@@ -4442,7 +4770,11 @@ MODULE_LICENSE("GPL");
+ 
+ MODULE_PARM(av7110_debug,"i");
+ MODULE_PARM(vidmode,"i");
++MODULE_PARM_DESC(vidmode,"analog video out: 0 off, 1 CVBS+RGB (default), 2 CVBS+YC, 3 YC");
+ MODULE_PARM(pids_off,"i");
++MODULE_PARM_DESC(pids_off,"clear video/audio/PCR PID filters when demux is closed");
+ MODULE_PARM(adac,"i");
++MODULE_PARM_DESC(adac,"audio DAC type: 0 TI, 1 CRYSTAL, 2 MSP (use if autodetection fails)");
+ MODULE_PARM(hw_sections, "i");
++MODULE_PARM_DESC(hw_sections, "0 use software section filter, 1 use hardware");
+ 
+--- linux-2.6.0-test1/drivers/media/dvb/ttpci/av7110.h	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/av7110.h	2003-07-19 17:03:49.000000000 -0700
+@@ -153,7 +153,8 @@ enum av7110_osd_command {	
+ 	BlitBmp,
+ 	ReleaseBmp,
+ 	SetWTrans,
+-	SetWNoTrans
++        SetWNoTrans,
++        Set_Palette
+ };
+ 
+ enum av7110_pid_command { 
+@@ -405,6 +406,11 @@ struct av7110 {
+ 	struct dvb_i2c_bus	*i2c_bus;	
+ 	char			*card_name;
+ 
++	/* support for analog module of dvb-c */
++	int			has_analog_tuner;
++	int			current_input;
++	u32			current_freq;
++				
+ 	struct tasklet_struct   debi_tasklet;
+ 	struct tasklet_struct   gpio_tasklet;
+ 
+@@ -572,6 +578,9 @@ struct av7110 {
+ #define DATA_BUFF2_BASE	(DATA_BUFF1_BASE+DATA_BUFF1_SIZE)
+ #define DATA_BUFF2_SIZE	0x0800
+ 
++#define DATA_BUFF3_BASE (DATA_BUFF2_BASE+DATA_BUFF2_SIZE)
++#define DATA_BUFF3_SIZE 0x0400
++
+ #define Reserved	(DPRAM_BASE + 0x1E00)
+ #define Reserved_SIZE	0x1C0
+ 
+--- linux-2.6.0-test1/drivers/media/dvb/ttpci/budget-av.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/budget-av.c	2003-07-19 17:03:49.000000000 -0700
+@@ -170,6 +170,7 @@ static int budget_av_detach (struct saa7
+ 	return err;
+ }
+ 
++static struct saa7146_ext_vv vv_data;
+ 
+ static int budget_av_attach (struct saa7146_dev* dev,
+ 		      struct saa7146_pci_extension_data *info)
+@@ -207,16 +208,22 @@ static int budget_av_attach (struct saa7
+ 	dvb_delay(500);
+ 
+ 	if ((err = saa7113_init (budget_av))) {
+-		budget_av_detach(dev);
++		/* fixme: proper cleanup here */
++		ERR(("cannot init saa7113.\n"));
++		return err;
++	}
++
++	if ( 0 != saa7146_vv_init(dev,&vv_data)) {
++		/* fixme: proper cleanup here */
++		ERR(("cannot init vv subsystem.\n"));
+ 		return err;
+ 	}
+ 
+-	saa7146_vv_init(dev);
+ 	if ((err = saa7146_register_device(&budget_av->vd, dev, "knc1",
+ 					   VFL_TYPE_GRABBER)))
+ 	{
++		/* fixme: proper cleanup here */
+ 		ERR(("cannot register capture v4l2 device.\n"));
+-		budget_av_detach(dev);
+ 		return err;
+ 	}
+ 
+@@ -256,8 +263,9 @@ static struct saa7146_extension_ioctls i
+ };
+ 
+ 
+-static int av_ioctl(struct saa7146_dev *dev, unsigned int cmd, void *arg) 
++static int av_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) 
+ {
++	struct saa7146_dev *dev = fh->dev;
+ 	struct budget_av *budget_av = (struct budget_av*) dev->ext_priv;
+ /*
+ 	struct saa7146_vv *vv = dev->vv_data; 
+@@ -299,11 +307,19 @@ static int av_ioctl(struct saa7146_dev *
+ }
+ 
+ static struct saa7146_standard standard[] = {
+-	{ "PAL",	V4L2_STD_PAL,	SAA7146_PAL_VALUES },
+-	{ "NTSC",	V4L2_STD_NTSC,	SAA7146_NTSC_VALUES },
++	{
++		.name	= "PAL", 	.id	= V4L2_STD_PAL,
++		.v_offset	= 0x17,	.v_field 	= 288,	.v_calc		= 576,
++		.h_offset	= 0x14,	.h_pixels 	= 680,	.h_calc		= 680+1,
++		.v_max_out	= 576,	.h_max_out	= 768,
++	}, {
++		.name	= "NTSC", 	.id	= V4L2_STD_NTSC,
++		.v_offset	= 0x16,	.v_field 	= 240,	.v_calc		= 480,
++		.h_offset	= 0x06,	.h_pixels 	= 708,	.h_calc		= 708+1,
++		.v_max_out	= 480,	.h_max_out	= 640,
++	}
+ };
+ 
+-
+ static struct saa7146_ext_vv vv_data = {
+ 	.inputs		= 2,
+ 	.capabilities	= 0, // perhaps later: V4L2_CAP_VBI_CAPTURE, but that need tweaking with the saa7113
+@@ -338,8 +354,6 @@ static struct saa7146_extension budget_e
+ 	.attach		= budget_av_attach,
+ 	.detach		= budget_av_detach,
+ 
+-	.ext_vv_data	= &vv_data,
+-
+ 	.irq_mask	= MASK_10,
+ 	.irq_func	= ttpci_budget_irq10_handler,
+ };	
+--- linux-2.6.0-test1/drivers/media/dvb/ttpci/budget.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/budget.c	2003-07-19 17:03:49.000000000 -0700
+@@ -192,6 +192,7 @@ static struct saa7146_extension budget_e
+ MAKE_BUDGET_INFO(ttbs,	"TT-Budget/WinTV-NOVA-S  PCI",	BUDGET_TT);
+ MAKE_BUDGET_INFO(ttbc,	"TT-Budget/WinTV-NOVA-C  PCI",	BUDGET_TT);
+ MAKE_BUDGET_INFO(ttbt,	"TT-Budget/WinTV-NOVA-T  PCI",	BUDGET_TT);
++MAKE_BUDGET_INFO(ttbt2,	"TT-Budget/WinTV-NOVA-T  PCI",	BUDGET_TT);
+ MAKE_BUDGET_INFO(satel,	"SATELCO Multimedia PCI",	BUDGET_TT_HW_DISEQC);
+ /* Uncomment for Budget Patch */
+ /*MAKE_BUDGET_INFO(fs_1_3,"Siemens/Technotrend/Hauppauge PCI rev1.3+Budget_Patch", BUDGET_PATCH);*/
+@@ -202,6 +203,7 @@ static struct pci_device_id pci_tbl[] = 
+ 	MAKE_EXTENSION_PCI(ttbs,  0x13c2, 0x1003),
+ 	MAKE_EXTENSION_PCI(ttbc,  0x13c2, 0x1004),
+ 	MAKE_EXTENSION_PCI(ttbt,  0x13c2, 0x1005),
++	MAKE_EXTENSION_PCI(ttbt2,  0x13c2, 0x1011),	
+ 	MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013),
+ 	{
+ 		.vendor    = 0,
+@@ -213,7 +215,6 @@ MODULE_DEVICE_TABLE(pci, pci_tbl);
+ static struct saa7146_extension budget_extension = {
+ 	.name		= "budget dvb\0",
+ 	.flags	 	= 0,
+-	.ext_vv_data	= NULL,
+ 	
+ 	.module		= THIS_MODULE,
+ 	.pci_tbl	= pci_tbl,
+--- linux-2.6.0-test1/drivers/media/dvb/ttpci/budget-ci.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/budget-ci.c	2003-07-19 17:03:49.000000000 -0700
+@@ -371,7 +371,6 @@ MODULE_DEVICE_TABLE(pci, pci_tbl);
+ 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],
+--- linux-2.6.0-test1/drivers/media/dvb/ttpci/budget-core.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/budget-core.c	2003-07-19 17:03:49.000000000 -0700
+@@ -1,4 +1,5 @@
+ #include "budget.h"
++#include "ttpci-eeprom.h"
+ 
+ int budget_debug = 0;
+ 
+@@ -165,7 +166,6 @@ static int budget_register(struct budget
+         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;
+@@ -222,7 +222,7 @@ int ttpci_budget_init (struct budget *bu
+            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);
++	saa7146_i2c_adapter_prepare(dev, NULL, SAA7146_I2C_BUS_BIT_RATE_120);
+ 
+ 	budget->i2c_bus = dvb_register_i2c_bus (master_xfer, dev,
+ 						budget->dvb_adapter, 0);
+@@ -232,6 +232,8 @@ int ttpci_budget_init (struct budget *bu
+ 		return -ENOMEM;
+ 	}
+ 
++	ttpci_eeprom_parse_mac(budget->i2c_bus);
++
+ 	if( NULL == (budget->grabbing = saa7146_vmalloc_build_pgtable(dev->pci,length,&budget->pt))) {
+ 		ret = -ENOMEM;
+ 		goto err;
+--- linux-2.6.0-test1/drivers/media/dvb/ttpci/budget-patch.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/budget-patch.c	2003-07-19 17:03:49.000000000 -0700
+@@ -165,6 +165,7 @@ static int budget_patch_attach (struct s
+ {
+         struct budget_patch *budget;
+         int err;
++	int count = 0;
+ 
+         if (!(budget = kmalloc (sizeof(struct budget_patch), GFP_KERNEL)))
+                 return -ENOMEM;
+@@ -263,7 +264,6 @@ static void __exit budget_patch_exit(voi
+ static struct saa7146_extension budget_extension = {
+         .name           = "budget_patch dvb\0",
+         .flags          = 0,
+-        .ext_vv_data    = NULL,
+         
+         .module         = THIS_MODULE,
+         .pci_tbl        = pci_tbl,
+--- linux-2.6.0-test1/drivers/media/dvb/ttpci/Makefile	2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/Makefile	2003-07-19 17:03:49.000000000 -0700
+@@ -3,16 +3,12 @@
+ # 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
++obj-$(CONFIG_DVB_BUDGET) += budget-core.o budget.o ttpci-eeprom.o
++obj-$(CONFIG_DVB_BUDGET_AV) += budget-core.o budget-av.o ttpci-eeprom.o
++obj-$(CONFIG_DVB_BUDGET_CI) += budget-core.o budget-ci.o ttpci-eeprom.o
++obj-$(CONFIG_DVB_BUDGET_PATCH) += budget-core.o budget-patch.o ttpci-eeprom.o
++obj-$(CONFIG_DVB_AV7110) += dvb-ttpci.o ttpci-eeprom.o
+ 
+ EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/ttpci-eeprom.c	2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,120 @@
++/*
++    Retrieve encoded MAC address from 24C16 serial 2-wire EEPROM,
++    decode it and store it in the associated adapter struct for
++    use by dvb_net.c
++
++    This code was tested on TT-Budget/WinTV-NOVA-CI PCI boards with
++    Atmel and ST Microelectronics EEPROMs.
++
++    This card appear to have the 24C16 write protect held to ground,
++    thus permitting normal read/write operation. Theoretically it
++    would be possible to write routines to burn a different (encoded)
++    MAC address into the EEPROM.
++
++    Robert Schlabbach	GMX
++    Michael Glaum	KVH Industries
++    Holger Waechtler	Convergence
++
++    This program is free software; you can redistribute it and/or modify
++    it under the terms of the GNU General Public License as published by
++    the Free Software Foundation; either version 2 of the License, or
++    (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU General Public License for more details.
++
++    You should have received a copy of the GNU General Public License
++    along with this program; if not, write to the Free Software
++    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++*/
++
++#include <asm/errno.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/string.h>
++
++#include "dvb_i2c.h"
++#include "dvb_functions.h"
++
++#if 1
++#define dprintk(x...) printk(x)
++#else
++#define dprintk(x...)
++#endif
++
++
++static int ttpci_eeprom_read_encodedMAC(struct dvb_i2c_bus *i2c, u8 * encodedMAC)
++{
++	int ret;
++	u8 b0[] = { 0xd4 };
++
++	struct i2c_msg msg[] = {
++		{.addr = 0x50,.flags = 0,.buf = b0,.len = 1},
++		{.addr = 0x50,.flags = I2C_M_RD,.buf = encodedMAC,.len = 6}
++	};
++
++	dprintk("%s\n", __FUNCTION__);
++
++	ret = i2c->xfer(i2c, msg, 2);
++
++	if (ret != 2)		/* Assume EEPROM isn't there */
++		return (-ENODEV);
++
++	return 0;
++}
++
++static void decodeMAC(u8 * decodedMAC, const u8 * encodedMAC)
++{
++	u8 ormask0[3] = { 0x54, 0x7B, 0x9E };
++	u8 ormask1[3] = { 0xD3, 0xF1, 0x23 };
++	u8 low;
++	u8 high;
++	u8 shift;
++	int i;
++
++	decodedMAC[0] = 0x00;
++	decodedMAC[1] = 0xD0;
++	decodedMAC[2] = 0x5C;
++
++	for (i = 0; i < 3; i++) {
++		low = encodedMAC[2 * i] ^ ormask0[i];
++		high = encodedMAC[2 * i + 1] ^ ormask1[i];
++		shift = (high >> 6) & 0x3;
++
++		decodedMAC[5 - i] = ((high << 8) | low) >> shift;
++	}
++
++}
++
++
++int ttpci_eeprom_parse_mac(struct dvb_i2c_bus *i2c)
++{
++	int ret;
++	u8 encodedMAC[6];
++	u8 decodedMAC[6];
++
++	ret = ttpci_eeprom_read_encodedMAC(i2c, encodedMAC);
++
++	if (ret != 0) {		/* Will only be -ENODEV */
++		dprintk("Couldn't read from EEPROM: not there?\n");
++		memset(i2c->adapter->proposed_mac, 0, 6);
++		return ret;
++	}
++
++	decodeMAC(decodedMAC, encodedMAC);
++	memcpy(i2c->adapter->proposed_mac, decodedMAC, 6);
++
++	dprintk("%s adapter %i has MAC addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
++		i2c->adapter->name, i2c->adapter->num,
++		decodedMAC[0], decodedMAC[1], decodedMAC[2],
++		decodedMAC[3], decodedMAC[4], decodedMAC[5]);
++	dprintk("encoded MAC was %02x:%02x:%02x:%02x:%02x:%02x\n",
++		encodedMAC[0], encodedMAC[1], encodedMAC[2],
++		encodedMAC[3], encodedMAC[4], encodedMAC[5]);
++	return 0;
++}
++
++EXPORT_SYMBOL(ttpci_eeprom_parse_mac);
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/ttpci-eeprom.h	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,32 @@
++/*
++    Retrieve encoded MAC address from ATMEL ttpci_eeprom serial 2-wire EEPROM,
++    decode it and store it in associated adapter net device
++
++    Robert Schlabbach	GMX
++    Michael Glaum	KVH Industries
++    Holger Waechtler	Convergence
++
++    This program is free software; you can redistribute it and/or modify
++    it under the terms of the GNU General Public License as published by
++    the Free Software Foundation; either version 2 of the License, or
++    (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU General Public License for more details.
++
++    You should have received a copy of the GNU General Public License
++    along with this program; if not, write to the Free Software
++    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++*/
++
++#ifndef __TTPCI_EEPROM_H__
++#define __TTPCI_EEPROM_H__
++
++#include "dvb_i2c.h"
++
++extern int ttpci_eeprom_parse_mac(struct dvb_i2c_bus *i2c);
++
++#endif
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,1271 @@
++/*
++ * TTUSB DVB driver
++ *
++ * Copyright (c) 2002 Holger Waechtler <holger@convergence.de>
++ * Copyright (c) 2003 Felix Domke <tmbinc@gmx.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.
++ */
++#include <linux/init.h>
++#include <linux/slab.h>
++#include <linux/wait.h>
++#include <linux/module.h>
++#include <linux/usb.h>
++#include <linux/delay.h>
++#include <linux/time.h>
++#include <linux/errno.h>
++#include <asm/semaphore.h>
++
++#include "dvb_frontend.h"
++#include "dmxdev.h"
++#include "dvb_demux.h"
++#include "dvb_net.h"
++
++#include <linux/dvb/frontend.h>
++#include <linux/dvb/dmx.h>
++#include <linux/pci.h>
++#include <linux/usb.h>
++
++#include "dvb_functions.h"
++
++/*
++  TTUSB_HWSECTIONS:
++    the DSP supports filtering in hardware, however, since the "muxstream"
++    is a bit braindead (no matching channel masks or no matching filter mask),
++    we won't support this - yet. it doesn't event support negative filters,
++    so the best way is maybe to keep TTUSB_HWSECTIONS undef'd and just
++    parse TS data. USB bandwith will be a problem when having large
++    datastreams, especially for dvb-net, but hey, that's not my problem.
++	
++  TTUSB_DISEQC, TTUSB_TONE:
++    let the STC do the diseqc/tone stuff. this isn't supported at least with
++    my TTUSB, so let it undef'd unless you want to implement another
++    frontend. never tested.
++		
++  DEBUG:
++    define it to > 3 for really hardcore debugging. you probably don't want
++    this unless the device doesn't load at all. > 2 for bandwidth statistics.
++*/
++
++static int debug = 0;
++
++#define dprintk(x...) do { if (debug) printk(KERN_DEBUG x); } while (0)
++
++#define ISO_BUF_COUNT      4
++#define FRAMES_PER_ISO_BUF 4
++#define ISO_FRAME_SIZE     912
++#define TTUSB_MAXCHANNEL   32
++#ifdef TTUSB_HWSECTIONS
++#define TTUSB_MAXFILTER    16	/* ??? */
++#endif
++
++#define TTUSB_BUDGET_NAME "ttusb_stc_fw"
++
++/**
++ *  since we're casting (struct ttusb*) <-> (struct dvb_demux*) around
++ *  the dvb_demux field must be the first in struct!!
++ */
++struct ttusb {
++	struct dvb_demux dvb_demux;
++	struct dmxdev dmxdev;
++	struct dvb_net dvbnet;
++
++	/* our semaphore, for channel allocation/deallocation */
++	struct semaphore sem;
++	/* and one for USB access. */
++	struct semaphore semusb;
++
++	struct dvb_adapter *adapter;
++	struct usb_device *dev;
++
++	int disconnecting;
++	int iso_streaming;
++
++	unsigned int bulk_out_pipe;
++	unsigned int bulk_in_pipe;
++	unsigned int isoc_in_pipe;
++
++	void *iso_buffer;
++	dma_addr_t iso_dma_handle;
++
++	struct urb *iso_urb[ISO_BUF_COUNT];
++
++	int running_feed_count;
++	int last_channel;
++	int last_filter;
++
++	u8 c;			/* transaction counter, wraps around...  */
++	fe_sec_tone_mode_t tone;
++	fe_sec_voltage_t voltage;
++
++	int mux_state;		// 0..2 - MuxSyncWord, 3 - nMuxPacks,    4 - muxpack
++	u8 mux_npacks;
++	u8 muxpack[256 + 8];
++	int muxpack_ptr, muxpack_len;
++
++	int insync;
++
++	u16 cc;			/* MuxCounter - will increment on EVERY MUX PACKET */
++	/* (including stuffing. yes. really.) */
++
++	u8 last_result[32];
++
++	struct ttusb_channel {
++		struct ttusb *ttusb;
++		struct dvb_demux_feed *dvbdmxfeed;
++
++		int active;
++		int id;
++		int pid;
++		int type;	/* 1 - TS, 2 - Filter */
++#ifdef TTUSB_HWSECTIONS
++		int filterstate[TTUSB_MAXFILTER];	/* 0: not busy, 1: busy */
++#endif
++	} channel[TTUSB_MAXCHANNEL];
++#if 0
++	devfs_handle_t stc_devfs_handle;
++#endif
++};
++
++/* ugly workaround ... don't know why it's neccessary to read */
++/* all result codes. */
++
++#define DEBUG 0
++static int ttusb_cmd(struct ttusb *ttusb,
++	      const u8 * data, int len, int needresult)
++{
++	int actual_len;
++	int err;
++#if DEBUG >= 3
++	int i;
++
++	printk(">");
++	for (i = 0; i < len; ++i)
++		printk(" %02x", data[i]);
++	printk("\n");
++#endif
++
++	if (down_interruptible(&ttusb->semusb) < 0)
++		return -EAGAIN;
++
++	err = usb_bulk_msg(ttusb->dev, ttusb->bulk_out_pipe,
++			   (u8 *) data, len, &actual_len, HZ);
++	if (err != 0) {
++		dprintk("%s: usb_bulk_msg(send) failed, err == %i!\n",
++			__FUNCTION__, err);
++		up(&ttusb->semusb);
++		return err;
++	}
++	if (actual_len != len) {
++		dprintk("%s: only wrote %d of %d bytes\n", __FUNCTION__,
++			actual_len, len);
++		up(&ttusb->semusb);
++		return -1;
++	}
++
++	err = usb_bulk_msg(ttusb->dev, ttusb->bulk_in_pipe,
++			   ttusb->last_result, 32, &actual_len, HZ);
++
++	if (err != 0) {
++		printk("%s: failed, receive error %d\n", __FUNCTION__,
++		       err);
++		up(&ttusb->semusb);
++		return err;
++	}
++#if DEBUG >= 3
++	actual_len = ttusb->last_result[3] + 4;
++	printk("<");
++	for (i = 0; i < actual_len; ++i)
++		printk(" %02x", ttusb->last_result[i]);
++	printk("\n");
++#endif
++	if (!needresult)
++		up(&ttusb->semusb);
++	return 0;
++}
++
++static int ttusb_result(struct ttusb *ttusb, u8 * data, int len)
++{
++	memcpy(data, ttusb->last_result, len);
++	up(&ttusb->semusb);
++	return 0;
++}
++
++static int ttusb_i2c_msg(struct ttusb *ttusb,
++		  u8 addr, u8 * snd_buf, u8 snd_len, u8 * rcv_buf,
++		  u8 rcv_len)
++{
++	u8 b[0x28];
++	u8 id = ++ttusb->c;
++	int i, err;
++
++	if (snd_len > 0x28 - 7 || rcv_len > 0x20 - 7)
++		return -EINVAL;
++
++	b[0] = 0xaa;
++	b[1] = id;
++	b[2] = 0x31;
++	b[3] = snd_len + 3;
++	b[4] = addr << 1;
++	b[5] = snd_len;
++	b[6] = rcv_len;
++
++	for (i = 0; i < snd_len; i++)
++		b[7 + i] = snd_buf[i];
++
++	err = ttusb_cmd(ttusb, b, snd_len + 7, 1);
++
++	if (err)
++		return -EREMOTEIO;
++
++	err = ttusb_result(ttusb, b, 0x20);
++
++	if (rcv_len > 0) {
++
++		if (err || b[0] != 0x55 || b[1] != id) {
++			dprintk
++			    ("%s: usb_bulk_msg(recv) failed, err == %i, id == %02x, b == ",
++			     __FUNCTION__, err, id);
++			return -EREMOTEIO;
++		}
++
++		for (i = 0; i < rcv_len; i++)
++			rcv_buf[i] = b[7 + i];
++	}
++
++	return rcv_len;
++}
++
++static int ttusb_i2c_xfer(struct dvb_i2c_bus *i2c, const struct i2c_msg msg[],
++		   int num)
++{
++	struct ttusb *ttusb = i2c->data;
++	int i = 0;
++	int inc;
++
++	if (down_interruptible(&ttusb->sem) < 0)
++		return -EAGAIN;
++
++	while (i < num) {
++		u8 addr, snd_len, rcv_len, *snd_buf, *rcv_buf;
++		int err;
++
++		if (num > i + 1 && (msg[i + 1].flags & I2C_M_RD)) {
++			addr = msg[i].addr;
++			snd_buf = msg[i].buf;
++			snd_len = msg[i].len;
++			rcv_buf = msg[i + 1].buf;
++			rcv_len = msg[i + 1].len;
++			inc = 2;
++		} else {
++			addr = msg[i].addr;
++			snd_buf = msg[i].buf;
++			snd_len = msg[i].len;
++			rcv_buf = NULL;
++			rcv_len = 0;
++			inc = 1;
++		}
++
++		err = ttusb_i2c_msg(ttusb, addr,
++				    snd_buf, snd_len, rcv_buf, rcv_len);
++
++		if (err < rcv_len) {
++			printk("%s: i == %i\n", __FUNCTION__, i);
++			break;
++		}
++
++		i += inc;
++	}
++
++	up(&ttusb->sem);
++	return i;
++}
++
++#include "dvb-ttusb-dspbootcode.h"
++
++static int ttusb_boot_dsp(struct ttusb *ttusb)
++{
++	int i, err;
++	u8 b[40];
++
++	/* BootBlock */
++	b[0] = 0xaa;
++	b[2] = 0x13;
++	b[3] = 28;
++
++	/* upload dsp code in 32 byte steps (36 didn't work for me ...) */
++	/* 32 is max packet size, no messages should be splitted. */
++	for (i = 0; i < sizeof(dsp_bootcode); i += 28) {
++		memcpy(&b[4], &dsp_bootcode[i], 28);
++
++		b[1] = ++ttusb->c;
++
++		err = ttusb_cmd(ttusb, b, 32, 0);
++		if (err)
++			goto done;
++	}
++
++	/* last block ... */
++	b[1] = ++ttusb->c;
++	b[2] = 0x13;
++	b[3] = 0;
++
++	err = ttusb_cmd(ttusb, b, 4, 0);
++	if (err)
++		goto done;
++
++	/* BootEnd */
++	b[1] = ++ttusb->c;
++	b[2] = 0x14;
++	b[3] = 0;
++
++	err = ttusb_cmd(ttusb, b, 4, 0);
++
++      done:
++	if (err) {
++		dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
++			__FUNCTION__, err);
++	}
++
++	return err;
++}
++
++static int ttusb_set_channel(struct ttusb *ttusb, int chan_id, int filter_type,
++		      int pid)
++{
++	int err;
++	/* SetChannel */
++	u8 b[] = { 0xaa, ++ttusb->c, 0x22, 4, chan_id, filter_type,
++		(pid >> 8) & 0xff, pid & 0xff
++	};
++
++	err = ttusb_cmd(ttusb, b, sizeof(b), 0);
++	return err;
++}
++
++static int ttusb_del_channel(struct ttusb *ttusb, int channel_id)
++{
++	int err;
++	/* DelChannel */
++	u8 b[] = { 0xaa, ++ttusb->c, 0x23, 1, channel_id };
++
++	err = ttusb_cmd(ttusb, b, sizeof(b), 0);
++	return err;
++}
++
++#ifdef TTUSB_HWSECTIONS
++static int ttusb_set_filter(struct ttusb *ttusb, int filter_id,
++		     int associated_chan, u8 filter[8], u8 mask[8])
++{
++	int err;
++	/* SetFilter */
++	u8 b[] = { 0xaa, 0, 0x24, 0x1a, filter_id, associated_chan,
++		filter[0], filter[1], filter[2], filter[3],
++		filter[4], filter[5], filter[6], filter[7],
++		filter[8], filter[9], filter[10], filter[11],
++		mask[0], mask[1], mask[2], mask[3],
++		mask[4], mask[5], mask[6], mask[7],
++		mask[8], mask[9], mask[10], mask[11]
++	};
++
++	err = ttusb_cmd(ttusb, b, sizeof(b), 0);
++	return err;
++}
++
++static int ttusb_del_filter(struct ttusb *ttusb, int filter_id)
++{
++	int err;
++	/* DelFilter */
++	u8 b[] = { 0xaa, ++ttusb->c, 0x25, 1, filter_id };
++
++	err = ttusb_cmd(ttusb, b, sizeof(b), 0);
++	return err;
++}
++#endif
++
++static int ttusb_init_controller(struct ttusb *ttusb)
++{
++	u8 b0[] = { 0xaa, ++ttusb->c, 0x15, 1, 0 };
++	u8 b1[] = { 0xaa, ++ttusb->c, 0x15, 1, 1 };
++	u8 b2[] = { 0xaa, ++ttusb->c, 0x32, 1, 0 };
++	/* i2c write read: 5 bytes, addr 0x10, 0x02 bytes write, 1 bytes read. */
++	u8 b3[] =
++	    { 0xaa, ++ttusb->c, 0x31, 5, 0x10, 0x02, 0x01, 0x00, 0x1e };
++	u8 b4[] =
++	    { 0x55, ttusb->c, 0x31, 4, 0x10, 0x02, 0x01, 0x00, 0x1e };
++
++	u8 get_version[] = { 0xaa, ++ttusb->c, 0x17, 5, 0, 0, 0, 0, 0 };
++	u8 get_dsp_version[0x20] =
++	    { 0xaa, ++ttusb->c, 0x26, 28, 0, 0, 0, 0, 0 };
++	int err;
++
++	/* reset board */
++	if ((err = ttusb_cmd(ttusb, b0, sizeof(b0), 0)))
++		return err;
++
++	/* reset board (again?) */
++	if ((err = ttusb_cmd(ttusb, b1, sizeof(b1), 0)))
++		return err;
++
++	ttusb_boot_dsp(ttusb);
++
++	/* set i2c bit rate */
++	if ((err = ttusb_cmd(ttusb, b2, sizeof(b2), 0)))
++		return err;
++
++	if ((err = ttusb_cmd(ttusb, b3, sizeof(b3), 1)))
++		return err;
++
++	err = ttusb_result(ttusb, b4, sizeof(b4));
++
++	if ((err = ttusb_cmd(ttusb, get_version, sizeof(get_version), 1)))
++		return err;
++
++	if ((err = ttusb_result(ttusb, get_version, sizeof(get_version))))
++		return err;
++
++	dprintk("%s: stc-version: %c%c%c%c%c\n", __FUNCTION__,
++		get_version[4], get_version[5], get_version[6],
++		get_version[7], get_version[8]);
++
++	if (memcmp(get_version + 4, "V 0.0", 5) &&
++	    memcmp(get_version + 4, "V 1.1", 5)) {
++		printk
++		    ("%s: unknown STC version %c%c%c%c%c, please report!\n",
++		     __FUNCTION__, get_version[4], get_version[5],
++		     get_version[6], get_version[7], get_version[8]);
++	}
++
++	err =
++	    ttusb_cmd(ttusb, get_dsp_version, sizeof(get_dsp_version), 1);
++	if (err)
++		return err;
++
++	err =
++	    ttusb_result(ttusb, get_dsp_version, sizeof(get_dsp_version));
++	if (err)
++		return err;
++	printk("%s: dsp-version: %c%c%c\n", __FUNCTION__,
++	       get_dsp_version[4], get_dsp_version[5], get_dsp_version[6]);
++	return 0;
++}
++
++#ifdef TTUSB_DISEQC
++static int ttusb_send_diseqc(struct ttusb *ttusb,
++		      const struct dvb_diseqc_master_cmd *cmd)
++{
++	u8 b[12] = { 0xaa, ++ttusb->c, 0x18 };
++
++	int err;
++
++	b[3] = 4 + 2 + cmd->msg_len;
++	b[4] = 0xFF;		/* send diseqc master, not burst */
++	b[5] = cmd->msg_len;
++
++	memcpy(b + 5, cmd->msg, cmd->msg_len);
++
++	/* Diseqc */
++	if ((err = ttusb_cmd(ttusb, b, 4 + b[3], 0))) {
++		dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
++			__FUNCTION__, err);
++	}
++
++	return err;
++}
++#endif
++
++static int ttusb_update_lnb(struct ttusb *ttusb)
++{
++	u8 b[] = { 0xaa, ++ttusb->c, 0x16, 5, /*power: */ 1,
++		ttusb->voltage == SEC_VOLTAGE_18 ? 0 : 1,
++		ttusb->tone == SEC_TONE_ON ? 1 : 0, 1, 1
++	};
++	int err;
++
++	/* SetLNB */
++	if ((err = ttusb_cmd(ttusb, b, sizeof(b), 0))) {
++		dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
++			__FUNCTION__, err);
++	}
++
++	return err;
++}
++
++static int ttusb_set_voltage(struct ttusb *ttusb, fe_sec_voltage_t voltage)
++{
++	ttusb->voltage = voltage;
++	return ttusb_update_lnb(ttusb);
++}
++
++#ifdef TTUSB_TONE
++static int ttusb_set_tone(struct ttusb *ttusb, fe_sec_tone_mode_t tone)
++{
++	ttusb->tone = tone;
++	return ttusb_update_lnb(ttusb);
++}
++#endif
++
++static int ttusb_lnb_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
++{
++	struct ttusb *ttusb = fe->i2c->data;
++
++	switch (cmd) {
++	case FE_SET_VOLTAGE:
++		return ttusb_set_voltage(ttusb, (fe_sec_voltage_t) arg);
++#ifdef TTUSB_TONE
++	case FE_SET_TONE:
++		return ttusb_set_tone(ttusb, (fe_sec_tone_mode_t) arg);
++#endif
++#ifdef TTUSB_DISEQC
++	case FE_DISEQC_SEND_MASTER_CMD:
++		return ttusb_send_diseqc(ttusb,
++					 (struct dvb_diseqc_master_cmd *)
++					 arg);
++#endif
++	default:
++		return -EOPNOTSUPP;
++	};
++}
++
++#if 0
++static void ttusb_set_led_freq(struct ttusb *ttusb, u8 freq)
++{
++	u8 b[] = { 0xaa, ++ttusb->c, 0x19, 1, freq };
++	int err, actual_len;
++
++	err = ttusb_cmd(ttusb, b, sizeof(b), 0);
++	if (err) {
++		dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
++			__FUNCTION__, err);
++	}
++}
++#endif
++
++/*****************************************************************************/
++
++#ifdef TTUSB_HWSECTIONS
++static void ttusb_handle_ts_data(struct ttusb_channel *channel,
++				 const u8 * data, int len);
++static void ttusb_handle_sec_data(struct ttusb_channel *channel,
++				  const u8 * data, int len);
++#endif
++
++int numpkt = 0, lastj, numts, numstuff, numsec, numinvalid;
++
++static void ttusb_process_muxpack(struct ttusb *ttusb, const u8 * muxpack,
++			   int len)
++{
++	u16 csum = 0, cc;
++	int i;
++	for (i = 0; i < len; i += 2)
++		csum ^= le16_to_cpup((u16 *) (muxpack + i));
++	if (csum) {
++		printk("%s: muxpack with incorrect checksum, ignoring\n",
++		       __FUNCTION__);
++		numinvalid++;
++		return;
++	}
++
++	cc = (muxpack[len - 4] << 8) | muxpack[len - 3];
++	cc &= 0x7FFF;
++	if (cc != ttusb->cc)
++		printk("%s: cc discontinuity (%d frames missing)\n",
++		       __FUNCTION__, (cc - ttusb->cc) & 0x7FFF);
++	ttusb->cc = (cc + 1) & 0x7FFF;
++	if (muxpack[0] & 0x80) {
++#ifdef TTUSB_HWSECTIONS
++		/* section data */
++		int pusi = muxpack[0] & 0x40;
++		int channel = muxpack[0] & 0x1F;
++		int payload = muxpack[1];
++		const u8 *data = muxpack + 2;
++		/* check offset flag */
++		if (muxpack[0] & 0x20)
++			data++;
++
++		ttusb_handle_sec_data(ttusb->channel + channel, data,
++				      payload);
++		data += payload;
++
++		if ((!!(ttusb->muxpack[0] & 0x20)) ^
++		    !!(ttusb->muxpack[1] & 1))
++			data++;
++#warning TODO: pusi
++		printk("cc: %04x\n", (data[0] << 8) | data[1]);
++#endif
++		numsec++;
++	} else if (muxpack[0] == 0x47) {
++#ifdef TTUSB_HWSECTIONS
++		/* we have TS data here! */
++		int pid = ((muxpack[1] & 0x0F) << 8) | muxpack[2];
++		int channel;
++		for (channel = 0; channel < TTUSB_MAXCHANNEL; ++channel)
++			if (ttusb->channel[channel].active
++			    && (pid == ttusb->channel[channel].pid))
++				ttusb_handle_ts_data(ttusb->channel +
++						     channel, muxpack,
++						     188);
++#endif
++		numts++;
++		dvb_dmx_swfilter_packets(&ttusb->dvb_demux, muxpack, 1);
++	} else if (muxpack[0] != 0) {
++		numinvalid++;
++		printk("illegal muxpack type %02x\n", muxpack[0]);
++	} else
++		numstuff++;
++}
++
++static void ttusb_process_frame(struct ttusb *ttusb, u8 * data, int len)
++{
++	int maxwork = 1024;
++	while (len) {
++		if (!(maxwork--)) {
++			printk("%s: too much work\n", __FUNCTION__);
++			break;
++		}
++
++		switch (ttusb->mux_state) {
++		case 0:
++		case 1:
++		case 2:
++			len--;
++			if (*data++ == 0xAA)
++				++ttusb->mux_state;
++			else {
++				ttusb->mux_state = 0;
++#if DEBUG > 3
++				if (ttusb->insync)
++					printk("%02x ", data[-1]);
++#else
++				if (ttusb->insync) {
++					printk("%s: lost sync.\n",
++					       __FUNCTION__);
++					ttusb->insync = 0;
++				}
++#endif
++			}
++			break;
++		case 3:
++			ttusb->insync = 1;
++			len--;
++			ttusb->mux_npacks = *data++;
++			++ttusb->mux_state;
++			ttusb->muxpack_ptr = 0;
++			/* maximum bytes, until we know the length */
++			ttusb->muxpack_len = 2;
++			break;
++		case 4:
++			{
++				int avail;
++				avail = len;
++				if (avail >
++				    (ttusb->muxpack_len -
++				     ttusb->muxpack_ptr))
++					avail =
++					    ttusb->muxpack_len -
++					    ttusb->muxpack_ptr;
++				memcpy(ttusb->muxpack + ttusb->muxpack_ptr,
++				       data, avail);
++				ttusb->muxpack_ptr += avail;
++				if (ttusb->muxpack_ptr > 264)
++					BUG();
++				data += avail;
++				len -= avail;
++				/* determine length */
++				if (ttusb->muxpack_ptr == 2) {
++					if (ttusb->muxpack[0] & 0x80) {
++						ttusb->muxpack_len =
++						    ttusb->muxpack[1] + 2;
++						if (ttusb->
++						    muxpack[0] & 0x20)
++							ttusb->
++							    muxpack_len++;
++						if ((!!
++						     (ttusb->
++						      muxpack[0] & 0x20)) ^
++						    !!(ttusb->
++						       muxpack[1] & 1))
++							ttusb->
++							    muxpack_len++;
++						ttusb->muxpack_len += 4;
++					} else if (ttusb->muxpack[0] ==
++						   0x47)
++						ttusb->muxpack_len =
++						    188 + 4;
++					else if (ttusb->muxpack[0] == 0x00)
++						ttusb->muxpack_len =
++						    ttusb->muxpack[1] + 2 +
++						    4;
++					else {
++						dprintk
++						    ("%s: invalid state: first byte is %x\n",
++						     __FUNCTION__,
++						     ttusb->muxpack[0]);
++						ttusb->mux_state = 0;
++					}
++				}
++
++			/**
++			 * if length is valid and we reached the end:
++			 * goto next muxpack
++			 */
++				if ((ttusb->muxpack_ptr >= 2) &&
++				    (ttusb->muxpack_ptr ==
++				     ttusb->muxpack_len)) {
++					ttusb_process_muxpack(ttusb,
++							      ttusb->
++							      muxpack,
++							      ttusb->
++							      muxpack_ptr);
++					ttusb->muxpack_ptr = 0;
++					/* maximum bytes, until we know the length */
++					ttusb->muxpack_len = 2;
++
++				/**
++				 * no muxpacks left?
++				 * return to search-sync state
++				 */
++					if (!ttusb->mux_npacks--) {
++						ttusb->mux_state = 0;
++						break;
++					}
++				}
++				break;
++			}
++		default:
++			BUG();
++			break;
++		}
++	}
++}
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++static void ttusb_iso_irq(struct urb *urb)
++#else
++static void ttusb_iso_irq(struct urb *urb, struct pt_regs *ptregs)
++#endif
++{
++	struct ttusb *ttusb = urb->context;
++
++	if (!ttusb->iso_streaming)
++		return;
++
++#if 0
++	printk("%s: status %d, errcount == %d, length == %i\n",
++	       __FUNCTION__,
++	       urb->status, urb->error_count, urb->actual_length);
++#endif
++
++	if (!urb->status) {
++		int i;
++		for (i = 0; i < urb->number_of_packets; ++i) {
++			struct usb_iso_packet_descriptor *d;
++			u8 *data;
++			int len;
++			numpkt++;
++			if ((jiffies - lastj) >= HZ) {
++#if DEBUG > 2
++				printk
++				    ("frames/s: %d (ts: %d, stuff %d, sec: %d, invalid: %d, all: %d)\n",
++				     numpkt * HZ / (jiffies - lastj),
++				     numts, numstuff, numsec, numinvalid,
++				     numts + numstuff + numsec +
++				     numinvalid);
++#endif
++				numts = numstuff = numsec = numinvalid = 0;
++				lastj = jiffies;
++				numpkt = 0;
++			}
++			d = &urb->iso_frame_desc[i];
++			data = urb->transfer_buffer + d->offset;
++			len = d->actual_length;
++			d->actual_length = 0;
++			d->status = 0;
++			ttusb_process_frame(ttusb, data, len);
++		}
++	}
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
++	usb_submit_urb(urb, GFP_KERNEL);
++#endif
++}
++
++static void ttusb_free_iso_urbs(struct ttusb *ttusb)
++{
++	int i;
++
++	for (i = 0; i < ISO_BUF_COUNT; i++)
++		if (ttusb->iso_urb[i])
++			usb_free_urb(ttusb->iso_urb[i]);
++
++	pci_free_consistent(NULL,
++			    ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF *
++			    ISO_BUF_COUNT, ttusb->iso_buffer,
++			    ttusb->iso_dma_handle);
++}
++
++static int ttusb_alloc_iso_urbs(struct ttusb *ttusb)
++{
++	int i;
++
++	ttusb->iso_buffer = pci_alloc_consistent(NULL,
++						 ISO_FRAME_SIZE *
++						 FRAMES_PER_ISO_BUF *
++						 ISO_BUF_COUNT,
++						 &ttusb->iso_dma_handle);
++
++	memset(ttusb->iso_buffer, 0,
++	       ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF * ISO_BUF_COUNT);
++
++	for (i = 0; i < ISO_BUF_COUNT; i++) {
++		struct urb *urb;
++
++		if (!
++		    (urb =
++		     usb_alloc_urb(FRAMES_PER_ISO_BUF, GFP_KERNEL))) {
++			ttusb_free_iso_urbs(ttusb);
++			return -ENOMEM;
++		}
++
++		ttusb->iso_urb[i] = urb;
++	}
++
++	return 0;
++}
++
++static void ttusb_stop_iso_xfer(struct ttusb *ttusb)
++{
++	int i;
++
++	for (i = 0; i < ISO_BUF_COUNT; i++)
++		usb_unlink_urb(ttusb->iso_urb[i]);
++
++	ttusb->iso_streaming = 0;
++}
++
++static int ttusb_start_iso_xfer(struct ttusb *ttusb)
++{
++	int i, j, err, buffer_offset = 0;
++
++	if (ttusb->iso_streaming) {
++		printk("%s: iso xfer already running!\n", __FUNCTION__);
++		return 0;
++	}
++
++	ttusb->insync = 0;
++	ttusb->mux_state = 0;
++
++	for (i = 0; i < ISO_BUF_COUNT; i++) {
++		int frame_offset = 0;
++		struct urb *urb = ttusb->iso_urb[i];
++
++		urb->dev = ttusb->dev;
++		urb->context = ttusb;
++		urb->complete = ttusb_iso_irq;
++		urb->pipe = ttusb->isoc_in_pipe;
++		urb->transfer_flags = URB_ISO_ASAP;
++		urb->number_of_packets = FRAMES_PER_ISO_BUF;
++		urb->transfer_buffer_length =
++		    ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF;
++		urb->transfer_buffer = ttusb->iso_buffer + buffer_offset;
++		buffer_offset += ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF;
++
++		for (j = 0; j < FRAMES_PER_ISO_BUF; j++) {
++			urb->iso_frame_desc[j].offset = frame_offset;
++			urb->iso_frame_desc[j].length = ISO_FRAME_SIZE;
++			frame_offset += ISO_FRAME_SIZE;
++		}
++	}
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++	for (i = 0; i < ISO_BUF_COUNT; i++) {
++		int next = (i + 1) % ISO_BUF_COUNT;
++		ttusb->iso_urb[i]->next = ttusb->iso_urb[next];
++	}
++#endif
++
++	for (i = 0; i < ISO_BUF_COUNT; i++) {
++		if ((err = usb_submit_urb(ttusb->iso_urb[i], GFP_KERNEL))) {
++			ttusb_stop_iso_xfer(ttusb);
++			printk
++			    ("%s: failed urb submission (%i: err = %i)!\n",
++			     __FUNCTION__, i, err);
++			return err;
++		}
++	}
++
++	ttusb->iso_streaming = 1;
++
++	return 0;
++}
++
++#ifdef TTUSB_HWSECTIONS
++static void ttusb_handle_ts_data(struct ttusb_channel *channel, const u8 * data,
++			  int len)
++{
++	struct dvb_demux_feed *dvbdmxfeed = channel->dvbdmxfeed;
++
++	dvbdmxfeed->cb.ts(data, len, 0, 0, &dvbdmxfeed->feed.ts, 0);
++}
++
++static void ttusb_handle_sec_data(struct ttusb_channel *channel, const u8 * data,
++			   int len)
++{
++//      struct dvb_demux_feed *dvbdmxfeed = channel->dvbdmxfeed;
++#error TODO: handle ugly stuff
++//      dvbdmxfeed->cb.sec(data, len, 0, 0, &dvbdmxfeed->feed.sec, 0);
++}
++#endif
++
++static struct ttusb_channel *ttusb_channel_allocate(struct ttusb *ttusb)
++{
++	int i;
++
++	if (down_interruptible(&ttusb->sem))
++		return NULL;
++
++	/* lock! */
++	for (i = 0; i < TTUSB_MAXCHANNEL; ++i) {
++		if (!ttusb->channel[i].active) {
++			ttusb->channel[i].active = 1;
++			up(&ttusb->sem);
++			return ttusb->channel + i;
++		}
++	}
++
++	up(&ttusb->sem);
++
++	return NULL;
++}
++
++static int ttusb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
++{
++	struct ttusb *ttusb = (struct ttusb *) dvbdmxfeed->demux;
++	struct ttusb_channel *channel;
++
++	printk("ttusb_start_feed\n");
++
++	switch (dvbdmxfeed->type) {
++	case DMX_TYPE_TS:
++		break;
++	case DMX_TYPE_SEC:
++		break;
++	default:
++		return -EINVAL;
++	}
++
++	if (dvbdmxfeed->type == DMX_TYPE_TS) {
++		switch (dvbdmxfeed->pes_type) {
++		case DMX_TS_PES_VIDEO:
++		case DMX_TS_PES_AUDIO:
++		case DMX_TS_PES_TELETEXT:
++		case DMX_TS_PES_PCR:
++		case DMX_TS_PES_OTHER:
++			channel = ttusb_channel_allocate(ttusb);
++			break;
++		default:
++			return -EINVAL;
++		}
++	} else {
++		channel = ttusb_channel_allocate(ttusb);
++	}
++
++	if (!channel)
++		return -EBUSY;
++
++	dvbdmxfeed->priv = channel;
++	channel->dvbdmxfeed = dvbdmxfeed;
++
++	channel->pid = dvbdmxfeed->pid;
++
++#ifdef TTUSB_HWSECTIONS
++	if (dvbdmxfeed->type == DMX_TYPE_TS) {
++		channel->type = 1;
++	} else if (dvbdmxfeed->type == DMX_TYPE_SEC) {
++		channel->type = 2;
++#error TODO: allocate filters
++	}
++#else
++	channel->type = 1;
++#endif
++
++	ttusb_set_channel(ttusb, channel->id, channel->type, channel->pid);
++
++	if (0 == ttusb->running_feed_count++)
++		ttusb_start_iso_xfer(ttusb);
++
++	return 0;
++}
++
++static int ttusb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
++{
++	struct ttusb_channel *channel =
++	    (struct ttusb_channel *) dvbdmxfeed->priv;
++	struct ttusb *ttusb = (struct ttusb *) dvbdmxfeed->demux;
++
++	ttusb_del_channel(channel->ttusb, channel->id);
++
++	if (--ttusb->running_feed_count == 0)
++		ttusb_stop_iso_xfer(ttusb);
++
++	channel->active = 0;
++
++	return 0;
++}
++
++static int ttusb_setup_interfaces(struct ttusb *ttusb)
++{
++	usb_set_configuration(ttusb->dev, 1);
++	usb_set_interface(ttusb->dev, 1, 1);
++
++	ttusb->bulk_out_pipe = usb_sndbulkpipe(ttusb->dev, 1);
++	ttusb->bulk_in_pipe = usb_rcvbulkpipe(ttusb->dev, 1);
++	ttusb->isoc_in_pipe = usb_rcvisocpipe(ttusb->dev, 2);
++
++	return 0;
++}
++
++#if 0
++static u8 stc_firmware[8192];
++
++static int stc_open(struct inode *inode, struct file *file)
++{
++	struct ttusb *ttusb = file->private_data;
++	int addr;
++
++	for (addr = 0; addr < 8192; addr += 16) {
++		u8 snd_buf[2] = { addr >> 8, addr & 0xFF };
++		ttusb_i2c_msg(ttusb, 0x50, snd_buf, 2, stc_firmware + addr,
++			      16);
++	}
++
++	return 0;
++}
++
++static ssize_t stc_read(struct file *file, char *buf, size_t count,
++		 loff_t * offset)
++{
++	int tc = count;
++
++	if ((tc + *offset) > 8192)
++		tc = 8192 - *offset;
++
++	if (tc < 0)
++		return 0;
++
++	copy_to_user(buf, stc_firmware + *offset, tc);
++
++	*offset += tc;
++
++	return tc;
++}
++
++static int stc_release(struct inode *inode, struct file *file)
++{
++	return 0;
++}
++
++static struct file_operations stc_fops = {
++	.owner = THIS_MODULE,
++	.read = stc_read,
++	.open = stc_open,
++	.release = stc_release,
++};
++#endif
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++static void *ttusb_probe(struct usb_device *udev, unsigned int ifnum,
++		  const struct usb_device_id *id)
++{
++	struct ttusb *ttusb;
++	int result, channel;
++
++	if (ifnum != 0)
++		return NULL;
++
++	dprintk("%s: TTUSB DVB connected\n", __FUNCTION__);
++
++	if (!(ttusb = kmalloc(sizeof(struct ttusb), GFP_KERNEL)))
++		return NULL;
++
++#else
++static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
++{
++	struct usb_device *udev;
++	struct ttusb *ttusb;
++	int result, channel;
++
++	dprintk("%s: TTUSB DVB connected\n", __FUNCTION__);
++
++	udev = interface_to_usbdev(intf);
++
++	if (!(ttusb = kmalloc(sizeof(struct ttusb), GFP_KERNEL)))
++		return -ENOMEM;
++
++#endif
++
++	memset(ttusb, 0, sizeof(struct ttusb));
++
++	for (channel = 0; channel < TTUSB_MAXCHANNEL; ++channel) {
++		ttusb->channel[channel].id = channel;
++		ttusb->channel[channel].ttusb = ttusb;
++	}
++
++	ttusb->dev = udev;
++	ttusb->c = 0;
++	ttusb->mux_state = 0;
++	sema_init(&ttusb->sem, 0);
++	sema_init(&ttusb->semusb, 1);
++
++	ttusb_setup_interfaces(ttusb);
++
++	ttusb_alloc_iso_urbs(ttusb);
++	if (ttusb_init_controller(ttusb))
++		printk("ttusb_init_controller: error\n");
++
++	up(&ttusb->sem);
++
++	dvb_register_adapter(&ttusb->adapter,
++			     "Technotrend/Hauppauge Nova-USB");
++
++	dvb_register_i2c_bus(ttusb_i2c_xfer, ttusb, ttusb->adapter, 0);
++	dvb_add_frontend_ioctls(ttusb->adapter, ttusb_lnb_ioctl, NULL,
++				ttusb);
++
++	memset(&ttusb->dvb_demux, 0, sizeof(ttusb->dvb_demux));
++
++	ttusb->dvb_demux.dmx.capabilities =
++	    DMX_TS_FILTERING | DMX_SECTION_FILTERING;
++	ttusb->dvb_demux.priv = 0;
++#ifdef TTUSB_HWSECTIONS
++	ttusb->dvb_demux.filternum = TTUSB_MAXFILTER;
++#else
++	ttusb->dvb_demux.filternum = 32;
++#endif
++	ttusb->dvb_demux.feednum = TTUSB_MAXCHANNEL;
++	ttusb->dvb_demux.start_feed = ttusb_start_feed;
++	ttusb->dvb_demux.stop_feed = ttusb_stop_feed;
++	ttusb->dvb_demux.write_to_decoder = 0;
++
++	if ((result = dvb_dmx_init(&ttusb->dvb_demux)) < 0) {
++		printk("ttusb_dvb: dvb_dmx_init failed (errno = %d)\n",
++		       result);
++		goto err;
++	}
++//FIXME dmxdev (nur WAS?)
++	ttusb->dmxdev.filternum = ttusb->dvb_demux.filternum;
++	ttusb->dmxdev.demux = &ttusb->dvb_demux.dmx;
++	ttusb->dmxdev.capabilities = 0;
++
++	if ((result = dvb_dmxdev_init(&ttusb->dmxdev, ttusb->adapter)) < 0) {
++		printk("ttusb_dvb: dvb_dmxdev_init failed (errno = %d)\n",
++		       result);
++		dvb_dmx_release(&ttusb->dvb_demux);
++		goto err;
++	}
++
++	if (dvb_net_init
++	    (ttusb->adapter, &ttusb->dvbnet, &ttusb->dvb_demux.dmx)) {
++		printk("ttusb_dvb: dvb_net_init failed!\n");
++	}
++
++      err:
++#if 0
++	ttusb->stc_devfs_handle =
++	    devfs_register(ttusb->adapter->devfs_handle, TTUSB_BUDGET_NAME,
++			   DEVFS_FL_DEFAULT, 0, 192,
++			   S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP
++			   | S_IROTH | S_IWOTH, &stc_fops, ttusb);
++#endif
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++	return (void *) ttusb;
++#else
++	usb_set_intfdata(intf, (void *) ttusb);
++
++	return 0;
++#endif
++}
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++static void ttusb_disconnect(struct usb_device *udev, void *data)
++{
++	struct ttusb *ttusb = data;
++#else
++static void ttusb_disconnect(struct usb_interface *intf)
++{
++	struct ttusb *ttusb = usb_get_intfdata(intf);
++
++	usb_set_intfdata(intf, NULL);
++#endif
++
++	ttusb->disconnecting = 1;
++
++	ttusb_stop_iso_xfer(ttusb);
++
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,69))
++#undef devfs_remove
++#define devfs_remove(x)	devfs_unregister(ttusb->stc_devfs_handle);
++#endif
++#if 0
++	devfs_remove(TTUSB_BUDGET_NAME);
++#endif
++	ttusb->dvb_demux.dmx.close(&ttusb->dvb_demux.dmx);
++	dvb_net_release(&ttusb->dvbnet);
++	dvb_dmxdev_release(&ttusb->dmxdev);
++	dvb_dmx_release(&ttusb->dvb_demux);
++
++	dvb_unregister_i2c_bus(ttusb_i2c_xfer, ttusb->adapter, 0);
++	dvb_unregister_adapter(ttusb->adapter);
++
++	ttusb_free_iso_urbs(ttusb);
++
++	kfree(ttusb);
++
++	dprintk("%s: TTUSB DVB disconnected\n", __FUNCTION__);
++}
++
++static struct usb_device_id ttusb_table[] = {
++	{USB_DEVICE(0xb48, 0x1003)},
++	{USB_DEVICE(0xb48, 0x1004)},	/* to be confirmed ????  */
++	{USB_DEVICE(0xb48, 0x1005)},	/* to be confirmed ????  */
++	{}
++};
++
++MODULE_DEVICE_TABLE(usb, ttusb_table);
++
++static struct usb_driver ttusb_driver = {
++      .name 		= "Technotrend/Hauppauge USB-Nova",
++      .probe 		= ttusb_probe,
++      .disconnect 	= ttusb_disconnect,
++      .id_table 	= ttusb_table,
++};
++
++static int __init ttusb_init(void)
++{
++	int err;
++
++	if ((err = usb_register(&ttusb_driver)) < 0) {
++		printk("%s: usb_register failed! Error number %d",
++		       __FILE__, err);
++		return -1;
++	}
++
++	return 0;
++}
++
++static void __exit ttusb_exit(void)
++{
++	usb_deregister(&ttusb_driver);
++}
++
++module_init(ttusb_init);
++module_exit(ttusb_exit);
++
++MODULE_PARM(debug, "i");
++MODULE_PARM_DESC(debug, "Debug or not");
++
++MODULE_AUTHOR("Holger Waechtler <holger@convergence.de>");
++MODULE_DESCRIPTION("TTUSB DVB Driver");
++MODULE_LICENSE("GPL");
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-budget/dvb-ttusb-dspbootcode.h	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,1644 @@
++
++#include <asm/types.h>
++
++u8 dsp_bootcode [] __initdata = {
++	0x08, 0xaa, 0x00, 0x18, 0x00, 0x03, 0x08, 0x00, 
++	0x00, 0x10, 0x00, 0x00, 0x01, 0x80, 0x18, 0x5f, 
++	0x00, 0x00, 0x01, 0x80, 0x77, 0x18, 0x2a, 0xeb, 
++	0x6b, 0xf8, 0x00, 0x18, 0x03, 0xff, 0x68, 0xf8, 
++	0x00, 0x18, 0xff, 0xfe, 0xf7, 0xb8, 0xf7, 0xbe, 
++	0xf6, 0xb9, 0xf4, 0xa0, 0xf6, 0xb7, 0xf6, 0xb5, 
++	0xf6, 0xb6, 0xf0, 0x20, 0x19, 0xdf, 0xf1, 0x00, 
++	0x00, 0x01, 0xf8, 0x4d, 0x01, 0xab, 0xf6, 0xb8, 
++	0xf0, 0x20, 0x19, 0xdf, 0xf0, 0x73, 0x01, 0xa5, 
++	0x7e, 0xf8, 0x00, 0x12, 0xf0, 0x00, 0x00, 0x01, 
++	0x47, 0xf8, 0x00, 0x11, 0x7e, 0x92, 0x00, 0xf8, 
++	0x00, 0x11, 0xf0, 0x00, 0x00, 0x01, 0x7e, 0xf8, 
++	0x00, 0x11, 0xf0, 0x00, 0x00, 0x01, 0x6c, 0x89, 
++	0x01, 0x9a, 0xf7, 0xb8, 0xee, 0xfc, 0xf0, 0x20, 
++	0xff, 0xff, 0xf1, 0x00, 0x00, 0x01, 0xf8, 0x4d, 
++	0x01, 0xbf, 0xf2, 0x73, 0x01, 0xb9, 0x4e, 0x02, 
++	0xf4, 0x95, 0xf5, 0xe3, 0x56, 0x02, 0x7e, 0x00, 
++	0x11, 0x00, 0xfa, 0x4c, 0x01, 0xb7, 0x6b, 0x03, 
++	0x00, 0x01, 0xf6, 0xb8, 0xee, 0x04, 0xf0, 0x74, 
++	0x0d, 0xa7, 0xf0, 0x74, 0x01, 0xc5, 0x4a, 0x11, 
++	0x4a, 0x16, 0x72, 0x11, 0x2a, 0xe6, 0x10, 0xf8, 
++	0x00, 0x11, 0xfa, 0x45, 0x01, 0xdb, 0xf4, 0x95, 
++	0xee, 0xff, 0x48, 0x11, 0xf0, 0x00, 0x2a, 0xc6, 
++	0x88, 0x16, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0xee, 
++	0xff, 0xff, 0xf4, 0xe3, 0x6c, 0xe9, 0xff, 0xff, 
++	0x01, 0xd5, 0x10, 0xf8, 0x2a, 0xe7, 0xf8, 0x45, 
++	0x01, 0xe2, 0x10, 0xf8, 0x2a, 0xe7, 0xf4, 0xe3, 
++	0xf0, 0x74, 0x01, 0xff, 0xee, 0x01, 0x8a, 0x16, 
++	0x8a, 0x11, 0xfc, 0x00, 0xf7, 0xb8, 0xe9, 0x20, 
++	0x4a, 0x11, 0x09, 0xf8, 0x2a, 0xe6, 0xf8, 0x4e, 
++	0x01, 0xf3, 0xf2, 0x73, 0x01, 0xfd, 0xf4, 0x95, 
++	0xe8, 0x01, 0x72, 0x11, 0x2a, 0xe6, 0x49, 0x11, 
++	0x80, 0xe1, 0x2a, 0xc6, 0xf3, 0x00, 0x00, 0x01, 
++	0xe8, 0x00, 0x81, 0xf8, 0x2a, 0xe6, 0x8a, 0x11, 
++	0xfc, 0x00, 0xf4, 0x95, 0xf0, 0x73, 0x02, 0x00, 
++	0x10, 0xf8, 0x2a, 0x0f, 0xfc, 0x00, 0x4a, 0x11, 
++	0xf0, 0x74, 0x02, 0x02, 0x80, 0xf8, 0x2a, 0x10, 
++	0x73, 0x08, 0x00, 0x09, 0x40, 0xf8, 0x2a, 0x15, 
++	0x82, 0xf8, 0x00, 0x11, 0xf4, 0x95, 0x77, 0x10, 
++	0x03, 0xe8, 0xf5, 0xa9, 0xf8, 0x30, 0x02, 0x21, 
++	0x71, 0xf8, 0x2a, 0x10, 0x2a, 0x15, 0x56, 0xf8, 
++	0x2a, 0x0c, 0xf0, 0xe3, 0x4e, 0xf8, 0x2a, 0x16, 
++	0xe8, 0x00, 0x4e, 0xf8, 0x2a, 0x0c, 0x8a, 0x11, 
++	0xfc, 0x00, 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1d, 
++	0x68, 0xf8, 0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 
++	0x00, 0x07, 0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 
++	0xff, 0xfc, 0x6b, 0xf8, 0x2a, 0x0f, 0x00, 0x01, 
++	0x8a, 0x1d, 0x8a, 0x07, 0x8a, 0x06, 0xf4, 0xeb, 
++	0xee, 0xfd, 0x76, 0xf8, 0x2a, 0x0f, 0x00, 0x00, 
++	0x76, 0x00, 0x00, 0x00, 0xfb, 0x80, 0x19, 0x4c, 
++	0xf4, 0x95, 0xe8, 0x00, 0x80, 0xf8, 0x2a, 0x11, 
++	0xf9, 0x80, 0x19, 0x07, 0x80, 0xf8, 0x2a, 0x0e, 
++	0xf9, 0x80, 0x16, 0x66, 0x76, 0x00, 0x2a, 0x12, 
++	0x10, 0xf8, 0x2a, 0x11, 0xf9, 0x80, 0x18, 0xe3, 
++	0x10, 0xf8, 0x2a, 0x0e, 0xf9, 0x80, 0x16, 0x66, 
++	0x10, 0xf8, 0x2a, 0x0e, 0xf9, 0x80, 0x16, 0x87, 
++	0xee, 0x03, 0xfc, 0x00, 0x4a, 0x11, 0xf6, 0xb8, 
++	0xf4, 0x95, 0xf0, 0x20, 0x80, 0x00, 0x11, 0xf8, 
++	0x2a, 0x5a, 0xf8, 0x4d, 0x02, 0x93, 0x11, 0xf8, 
++	0x2a, 0x9f, 0xf8, 0x4c, 0x02, 0x7c, 0x77, 0x12, 
++	0x2a, 0x39, 0x49, 0x12, 0x01, 0xf8, 0x2a, 0x9f, 
++	0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x71, 0x81, 
++	0x00, 0x11, 0x6c, 0xe1, 0xff, 0xab, 0x02, 0x93, 
++	0x6b, 0xf8, 0x2a, 0x9f, 0x00, 0x01, 0xe9, 0x05, 
++	0x01, 0xe2, 0x00, 0x03, 0x81, 0xf8, 0x2a, 0xa0, 
++	0xf0, 0x73, 0x02, 0x95, 0x72, 0x11, 0x2a, 0x9f, 
++	0xf4, 0x95, 0x10, 0xe1, 0x2a, 0x39, 0x6b, 0xf8, 
++	0x2a, 0x9f, 0x00, 0x01, 0x11, 0xf8, 0x2a, 0x9f, 
++	0x09, 0xf8, 0x2a, 0xa0, 0xf8, 0x4c, 0x02, 0x93, 
++	0x76, 0xf8, 0x2a, 0x5a, 0x00, 0x00, 0x76, 0xf8, 
++	0x2a, 0x9f, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa0, 
++	0x00, 0x00, 0x88, 0x11, 0xf4, 0x95, 0x48, 0x11, 
++	0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 
++	0x10, 0xf8, 0x2a, 0x5a, 0xf8, 0x44, 0x02, 0xb2, 
++	0x76, 0xf8, 0x2a, 0x5a, 0x00, 0x01, 0xf0, 0x74, 
++	0x02, 0x58, 0x88, 0x11, 0xf4, 0x95, 0x77, 0x10, 
++	0x80, 0x00, 0xf4, 0xa9, 0xf8, 0x30, 0x02, 0xb2, 
++	0x48, 0x11, 0xf0, 0x30, 0x00, 0xff, 0x80, 0x00, 
++	0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x18, 0xd6, 
++	0xee, 0x02, 0x8a, 0x11, 0xfc, 0x00, 0xf4, 0x95, 
++	0x4a, 0x08, 0x4a, 0x09, 0x4a, 0x0a, 0x4a, 0x0b, 
++	0x4a, 0x0c, 0x4a, 0x0d, 0x4a, 0x10, 0x4a, 0x11, 
++	0x4a, 0x12, 0x4a, 0x13, 0x4a, 0x14, 0x4a, 0x15, 
++	0x4a, 0x16, 0x4a, 0x17, 0x4a, 0x17, 0x4a, 0x19, 
++	0x4a, 0x0e, 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1a, 
++	0x4a, 0x1d, 0x4a, 0x1b, 0x4a, 0x1c, 0x68, 0xf8, 
++	0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07, 
++	0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc, 
++	0x48, 0x18, 0x68, 0xf8, 0x00, 0x18, 0xff, 0xfe, 
++	0xf4, 0x95, 0xf4, 0x95, 0x4a, 0x08, 0xee, 0xfd, 
++	0xf0, 0x74, 0x02, 0x58, 0x88, 0x11, 0xf4, 0x95, 
++	0x77, 0x10, 0x80, 0x00, 0xf4, 0xa9, 0xf8, 0x30, 
++	0x02, 0xef, 0x48, 0x11, 0xf0, 0x30, 0x00, 0xff, 
++	0x80, 0x00, 0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 
++	0x18, 0xd6, 0xee, 0x03, 0x8a, 0x18, 0xf4, 0x95, 
++	0x8a, 0x1c, 0x8a, 0x1b, 0x8a, 0x1d, 0x8a, 0x1a, 
++	0x8a, 0x07, 0x8a, 0x06, 0x8a, 0x0e, 0x8a, 0x19, 
++	0x8a, 0x17, 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x15, 
++	0x8a, 0x14, 0x8a, 0x13, 0x8a, 0x12, 0x8a, 0x11, 
++	0x8a, 0x10, 0x8a, 0x0d, 0x8a, 0x0c, 0x8a, 0x0b, 
++	0x8a, 0x0a, 0x8a, 0x09, 0x8a, 0x08, 0xf4, 0xeb, 
++	0x4a, 0x11, 0x77, 0x11, 0x2a, 0x39, 0x76, 0x81, 
++	0x00, 0x55, 0x77, 0x12, 0x2a, 0x18, 0x10, 0xe2, 
++	0x00, 0x01, 0x80, 0xe1, 0x00, 0x01, 0x10, 0xe2, 
++	0x00, 0x02, 0x80, 0xe1, 0x00, 0x02, 0x76, 0xe1, 
++	0x00, 0x03, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x04, 
++	0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 0x8a, 0x11, 
++	0xfc, 0x00, 0x4a, 0x11, 0x88, 0x11, 0xf4, 0x95, 
++	0xf4, 0x95, 0x10, 0x81, 0x6f, 0xf8, 0x2a, 0x9e, 
++	0x0c, 0x88, 0xe8, 0xff, 0x18, 0xe1, 0x00, 0x01, 
++	0x1a, 0xf8, 0x2a, 0x9e, 0xf0, 0x30, 0x1f, 0xff, 
++	0x80, 0xf8, 0x2a, 0x9e, 0x8a, 0x11, 0xfc, 0x00, 
++	0x4a, 0x11, 0x77, 0x11, 0x2a, 0x39, 0x76, 0x81, 
++	0x00, 0x55, 0x77, 0x12, 0x2a, 0x18, 0x11, 0xe2, 
++	0x00, 0x01, 0x81, 0xe1, 0x00, 0x01, 0x11, 0xe2, 
++	0x00, 0x02, 0x81, 0xe1, 0x00, 0x02, 0x76, 0xe1, 
++	0x00, 0x03, 0x00, 0x02, 0x48, 0x08, 0x6f, 0xe1, 
++	0x00, 0x04, 0x0c, 0x98, 0xf0, 0x30, 0x00, 0xff, 
++	0x80, 0xe1, 0x00, 0x05, 0x76, 0xe1, 0x00, 0x06, 
++	0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 0x8a, 0x11, 
++	0xfc, 0x00, 0x4a, 0x11, 0x77, 0x11, 0x2a, 0x39, 
++	0x76, 0x81, 0x00, 0x55, 0x77, 0x12, 0x2a, 0x18, 
++	0x10, 0xe2, 0x00, 0x01, 0x80, 0xe1, 0x00, 0x01, 
++	0x10, 0xe2, 0x00, 0x02, 0x80, 0xe1, 0x00, 0x02, 
++	0x76, 0xe1, 0x00, 0x03, 0x00, 0x04, 0x48, 0x11, 
++	0xf0, 0x00, 0x00, 0x04, 0x88, 0x12, 0xf4, 0x95, 
++	0x77, 0x13, 0x2a, 0x76, 0xe9, 0x00, 0xe5, 0x98, 
++	0xf3, 0x00, 0x00, 0x01, 0xf6, 0xb8, 0x48, 0x0b, 
++	0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43, 0x03, 0x71, 
++	0x76, 0x82, 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 
++	0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xf0, 
++	0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x71, 0x81, 
++	0x00, 0x14, 0x71, 0xe1, 0x00, 0x01, 0x00, 0x15, 
++	0x49, 0x11, 0xf3, 0x00, 0x00, 0x02, 0x89, 0x11, 
++	0xe7, 0x82, 0x6d, 0xea, 0x00, 0x04, 0xe7, 0x83, 
++	0x6d, 0xeb, 0x00, 0x0a, 0x77, 0x1a, 0x00, 0x05, 
++	0xf0, 0x72, 0x03, 0xaa, 0x11, 0x81, 0xf2, 0xe8, 
++	0x80, 0x82, 0xe9, 0xff, 0x19, 0xe1, 0x00, 0x01, 
++	0xf1, 0xa0, 0x81, 0x92, 0x11, 0xe1, 0x00, 0x0c, 
++	0xf2, 0xe8, 0x80, 0x83, 0xe9, 0xff, 0x19, 0xe1, 
++	0x00, 0x0d, 0xf1, 0xa0, 0x81, 0x93, 0x6d, 0xe9, 
++	0x00, 0x02, 0x48, 0x18, 0x49, 0x18, 0x70, 0x00, 
++	0x00, 0x15, 0xf0, 0x00, 0x00, 0x04, 0xf3, 0x00, 
++	0x00, 0x0a, 0x80, 0x01, 0x81, 0x02, 0xf2, 0x74, 
++	0x0e, 0x54, 0xf4, 0x95, 0x48, 0x14, 0xee, 0x10, 
++	0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xf0, 0x74, 
++	0x0c, 0x5e, 0x80, 0xf8, 0x2a, 0x5c, 0x77, 0x12, 
++	0x2a, 0x39, 0x76, 0x82, 0x00, 0x55, 0x77, 0x11, 
++	0x2a, 0x18, 0x10, 0xe1, 0x00, 0x01, 0x80, 0xe2, 
++	0x00, 0x01, 0x10, 0xe1, 0x00, 0x02, 0x80, 0xe2, 
++	0x00, 0x02, 0x76, 0xe2, 0x00, 0x03, 0x00, 0x1c, 
++	0xf6, 0xb8, 0x56, 0xf8, 0x2a, 0x16, 0xf0, 0xf0, 
++	0xf0, 0xf8, 0x80, 0xe2, 0x00, 0x07, 0x56, 0xf8, 
++	0x2a, 0x16, 0xf1, 0xf0, 0xe8, 0xff, 0xf2, 0x80, 
++	0x80, 0xe2, 0x00, 0x06, 0x56, 0xf8, 0x2a, 0x16, 
++	0xf1, 0xf8, 0xe8, 0xff, 0xf2, 0x80, 0x80, 0xe2, 
++	0x00, 0x05, 0x57, 0xf8, 0x2a, 0x16, 0xe8, 0xff, 
++	0xf2, 0x80, 0x80, 0xe2, 0x00, 0x04, 0x56, 0xf8, 
++	0x27, 0x6c, 0xf0, 0xf0, 0xf0, 0xf8, 0x80, 0xe2, 
++	0x00, 0x0b, 0x56, 0xf8, 0x27, 0x6c, 0xf1, 0xf0, 
++	0xe8, 0xff, 0xf2, 0x80, 0x80, 0xe2, 0x00, 0x0a, 
++	0x56, 0xf8, 0x27, 0x6c, 0xf1, 0xf8, 0xe8, 0xff, 
++	0xf2, 0x80, 0x80, 0xe2, 0x00, 0x09, 0xe8, 0xff, 
++	0x57, 0xf8, 0x27, 0x6c, 0xf2, 0x80, 0x80, 0xe2, 
++	0x00, 0x08, 0x56, 0xf8, 0x27, 0x6a, 0xf0, 0xf0, 
++	0xf0, 0xf8, 0x80, 0xe2, 0x00, 0x0f, 0x56, 0xf8, 
++	0x27, 0x6a, 0xf1, 0xf0, 0xe8, 0xff, 0xf2, 0x80, 
++	0x80, 0xe2, 0x00, 0x0e, 0x56, 0xf8, 0x27, 0x6a, 
++	0xf1, 0xf8, 0xe8, 0xff, 0xf2, 0x80, 0x80, 0xe2, 
++	0x00, 0x0d, 0x57, 0xf8, 0x27, 0x6a, 0xe8, 0xff, 
++	0xf2, 0x80, 0x80, 0xe2, 0x00, 0x0c, 0x76, 0xe2, 
++	0x00, 0x13, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x12, 
++	0x00, 0x00, 0x6f, 0xf8, 0x2a, 0x5c, 0x0c, 0x58, 
++	0x80, 0xe2, 0x00, 0x11, 0xe8, 0xff, 0x18, 0xf8, 
++	0x2a, 0x5c, 0x80, 0xe2, 0x00, 0x10, 0x76, 0xe2, 
++	0x00, 0x17, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x16, 
++	0x00, 0x00, 0x6f, 0xf8, 0x2a, 0x9e, 0x0c, 0x58, 
++	0x80, 0xe2, 0x00, 0x15, 0xe8, 0xff, 0x18, 0xf8, 
++	0x2a, 0x9e, 0x80, 0xe2, 0x00, 0x14, 0x76, 0xe2, 
++	0x00, 0x1b, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x1a, 
++	0x00, 0x00, 0x76, 0xe2, 0x00, 0x19, 0x00, 0x00, 
++	0x70, 0xe2, 0x00, 0x18, 0x27, 0x6e, 0x76, 0xe2, 
++	0x00, 0x1f, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x1e, 
++	0x00, 0x00, 0x76, 0xe2, 0x00, 0x1d, 0x00, 0x00, 
++	0x76, 0xe2, 0x00, 0x1c, 0x00, 0x00, 0x76, 0xe2, 
++	0x00, 0x20, 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 
++	0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 
++	0x10, 0xf8, 0x2a, 0x38, 0xf8, 0x45, 0x04, 0xed, 
++	0x77, 0x12, 0x2a, 0x18, 0x10, 0xe2, 0x00, 0x02, 
++	0x88, 0x11, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x08, 
++	0x6d, 0xe9, 0xff, 0xdf, 0xf6, 0xa9, 0xf8, 0x20, 
++	0x04, 0x75, 0xf0, 0x73, 0x04, 0x7d, 0xf0, 0x10, 
++	0x00, 0x21, 0xf0, 0x00, 0x1a, 0x83, 0x48, 0x08, 
++	0x7e, 0xf8, 0x00, 0x08, 0xf4, 0xe2, 0xf0, 0x74, 
++	0x03, 0x0a, 0xf0, 0x73, 0x04, 0xea, 0x48, 0x12, 
++	0xf2, 0x74, 0x03, 0x23, 0xf0, 0x00, 0x00, 0x04, 
++	0xf2, 0x74, 0x03, 0x36, 0xf4, 0x95, 0xe8, 0x00, 
++	0xf0, 0x73, 0x04, 0xea, 0x77, 0x11, 0x2a, 0x18, 
++	0xe8, 0xff, 0x6f, 0xe1, 0x00, 0x04, 0x0d, 0x48, 
++	0x18, 0xe1, 0x00, 0x05, 0xf2, 0x74, 0x09, 0x69, 
++	0xf4, 0x95, 0xf2, 0xa0, 0xf0, 0x74, 0x03, 0x36, 
++	0xf0, 0x73, 0x04, 0xea, 0x77, 0x11, 0x2a, 0x18, 
++	0xe8, 0xff, 0x6f, 0xe1, 0x00, 0x04, 0x0d, 0x48, 
++	0x18, 0xe1, 0x00, 0x05, 0xf2, 0x74, 0x09, 0x41, 
++	0xf4, 0x95, 0xf2, 0xa0, 0xf0, 0x74, 0x03, 0x36, 
++	0xf0, 0x73, 0x04, 0xea, 0xf0, 0x74, 0x03, 0x57, 
++	0xf0, 0x73, 0x04, 0xea, 0x10, 0xf8, 0x2a, 0x1c, 
++	0xf0, 0x74, 0x12, 0xa4, 0xf2, 0x74, 0x03, 0x36, 
++	0xf4, 0x95, 0xe8, 0x00, 0xf0, 0x73, 0x04, 0xea, 
++	0x48, 0x12, 0xf2, 0x74, 0x03, 0x80, 0xf0, 0x00, 
++	0x00, 0x04, 0xf2, 0x74, 0x03, 0x36, 0xf4, 0x95, 
++	0xe8, 0x00, 0xf0, 0x73, 0x04, 0xea, 0x10, 0xf8, 
++	0x2a, 0x1c, 0xf0, 0x74, 0x12, 0xc5, 0xf2, 0x74, 
++	0x03, 0x36, 0xf4, 0x95, 0xe8, 0x00, 0xf0, 0x73, 
++	0x04, 0xea, 0x77, 0x11, 0x2a, 0x18, 0xe8, 0xff, 
++	0x6f, 0xe1, 0x00, 0x06, 0x0d, 0x48, 0x18, 0xe1, 
++	0x00, 0x07, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++	0xf2, 0xa0, 0x70, 0x00, 0x00, 0x12, 0x80, 0x01, 
++	0x10, 0xe1, 0x00, 0x04, 0xf0, 0x74, 0x0e, 0x7a, 
++	0xf2, 0x74, 0x03, 0x36, 0xf4, 0x95, 0xe8, 0x00, 
++	0xf0, 0x73, 0x04, 0xea, 0xf0, 0x74, 0x03, 0xbc, 
++	0x76, 0xf8, 0x2a, 0x38, 0x00, 0x00, 0xee, 0x02, 
++	0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x77, 0x11, 
++	0x2a, 0x39, 0x76, 0x81, 0x00, 0x55, 0x77, 0x12, 
++	0x2a, 0x18, 0x10, 0xe2, 0x00, 0x01, 0x80, 0xe1, 
++	0x00, 0x01, 0x10, 0xe2, 0x00, 0x02, 0x80, 0xe1, 
++	0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 0x00, 0x09, 
++	0x48, 0x11, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x12, 
++	0xf4, 0x95, 0x77, 0x13, 0x2a, 0x86, 0xe9, 0x00, 
++	0xe5, 0x98, 0xf3, 0x00, 0x00, 0x01, 0xf6, 0xb8, 
++	0x48, 0x0b, 0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43, 
++	0x05, 0x0a, 0x76, 0x82, 0x00, 0xaa, 0xf0, 0x74, 
++	0x02, 0x98, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
++	0x77, 0x11, 0x2a, 0x39, 0x76, 0x81, 0x00, 0x55, 
++	0x77, 0x13, 0x2a, 0x18, 0x10, 0xe3, 0x00, 0x01, 
++	0x80, 0xe1, 0x00, 0x01, 0x10, 0xe3, 0x00, 0x02, 
++	0x80, 0xe1, 0x00, 0x02, 0x13, 0xe3, 0x00, 0x03, 
++	0x81, 0xe1, 0x00, 0x03, 0x48, 0x11, 0x77, 0x11, 
++	0x00, 0x00, 0xf8, 0x4d, 0x05, 0x44, 0xf0, 0x00, 
++	0x00, 0x04, 0x88, 0x12, 0x48, 0x13, 0xf0, 0x00, 
++	0x00, 0x04, 0x88, 0x13, 0xf4, 0x95, 0xf4, 0x95, 
++	0xe5, 0x98, 0x6d, 0x91, 0xf6, 0xb8, 0x48, 0x11, 
++	0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43, 0x05, 0x3a, 
++	0xf0, 0x20, 0x2a, 0x39, 0x49, 0x11, 0xf5, 0x00, 
++	0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x76, 0xe1, 
++	0x00, 0x04, 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 
++	0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x77, 0x11, 
++	0x2a, 0x39, 0x76, 0x81, 0x00, 0x55, 0x77, 0x12, 
++	0x2a, 0x18, 0x10, 0xe2, 0x00, 0x01, 0x80, 0xe1, 
++	0x00, 0x01, 0x10, 0xe2, 0x00, 0x02, 0x80, 0xe1, 
++	0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 0x00, 0x0c, 
++	0x48, 0x11, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x12, 
++	0xf4, 0x95, 0x77, 0x13, 0x2a, 0x7a, 0xe9, 0x00, 
++	0xe5, 0x98, 0xf3, 0x00, 0x00, 0x01, 0xf6, 0xb8, 
++	0x48, 0x0b, 0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43, 
++	0x05, 0x6a, 0x76, 0x82, 0x00, 0xaa, 0xf0, 0x74, 
++	0x02, 0x98, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
++	0x77, 0x11, 0x2a, 0x39, 0x76, 0x81, 0x00, 0x55, 
++	0x77, 0x12, 0x2a, 0x18, 0x10, 0xe2, 0x00, 0x01, 
++	0x80, 0xe1, 0x00, 0x01, 0x10, 0xe2, 0x00, 0x02, 
++	0x80, 0xe1, 0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 
++	0x00, 0x19, 0x48, 0x11, 0xf0, 0x00, 0x00, 0x04, 
++	0x88, 0x12, 0xf4, 0x95, 0x77, 0x13, 0x2a, 0x5d, 
++	0xe9, 0x00, 0xe5, 0x98, 0xf3, 0x00, 0x00, 0x01, 
++	0xf6, 0xb8, 0x48, 0x0b, 0x08, 0xf8, 0x2a, 0x3c, 
++	0xf8, 0x43, 0x05, 0x93, 0x76, 0x82, 0x00, 0xaa, 
++	0xf0, 0x74, 0x02, 0x98, 0x8a, 0x11, 0xfc, 0x00, 
++	0x4a, 0x11, 0x88, 0x11, 0x10, 0xf8, 0x2a, 0x38, 
++	0xf8, 0x44, 0x05, 0xe3, 0x10, 0xf8, 0x2a, 0xa1, 
++	0xf8, 0x44, 0x05, 0xba, 0x6c, 0xe1, 0xff, 0x56, 
++	0x05, 0xe3, 0x72, 0x12, 0x2a, 0xa1, 0xf4, 0x95, 
++	0x70, 0xe2, 0x2a, 0x18, 0x00, 0x11, 0x6b, 0xf8, 
++	0x2a, 0xa1, 0x00, 0x01, 0xf0, 0x73, 0x05, 0xe3, 
++	0x72, 0x12, 0x2a, 0xa1, 0xf4, 0x95, 0x70, 0xe2, 
++	0x2a, 0x18, 0x00, 0x11, 0x10, 0xf8, 0x2a, 0xa1, 
++	0xf0, 0x00, 0x00, 0x01, 0x88, 0x12, 0xf4, 0x95, 
++	0xf4, 0x95, 0x6e, 0xe2, 0xff, 0xfc, 0x05, 0xd1, 
++	0x73, 0x12, 0x2a, 0xa1, 0x48, 0x11, 0xf0, 0x00, 
++	0x00, 0x05, 0x80, 0xf8, 0x2a, 0xa2, 0x10, 0xf8, 
++	0x2a, 0xa1, 0x08, 0xf8, 0x2a, 0xa2, 0xf8, 0x44, 
++	0x05, 0xe3, 0x6c, 0xe1, 0xff, 0xab, 0x05, 0xdd, 
++	0x76, 0xf8, 0x2a, 0x38, 0x00, 0x01, 0x76, 0xf8, 
++	0x2a, 0xa1, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa2, 
++	0x00, 0x00, 0x8a, 0x11, 0xfc, 0x00, 0xf4, 0x95, 
++	0x4a, 0x08, 0x4a, 0x09, 0x4a, 0x0a, 0x4a, 0x0b, 
++	0x4a, 0x0c, 0x4a, 0x0d, 0x4a, 0x10, 0x4a, 0x11, 
++	0x4a, 0x12, 0x4a, 0x13, 0x4a, 0x14, 0x4a, 0x15, 
++	0x4a, 0x16, 0x4a, 0x17, 0x4a, 0x17, 0x4a, 0x19, 
++	0x4a, 0x0e, 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1a, 
++	0x4a, 0x1d, 0x4a, 0x1b, 0x4a, 0x1c, 0x68, 0xf8, 
++	0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07, 
++	0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc, 
++	0x48, 0x18, 0x68, 0xf8, 0x00, 0x18, 0xff, 0xfe, 
++	0xf4, 0x95, 0xf4, 0x95, 0x4a, 0x08, 0xee, 0xff, 
++	0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x18, 0x04, 
++	0xf0, 0x74, 0x05, 0xa2, 0xee, 0x01, 0x8a, 0x18, 
++	0xf4, 0x95, 0x8a, 0x1c, 0x8a, 0x1b, 0x8a, 0x1d, 
++	0x8a, 0x1a, 0x8a, 0x07, 0x8a, 0x06, 0x8a, 0x0e, 
++	0x8a, 0x19, 0x8a, 0x17, 0x8a, 0x17, 0x8a, 0x16, 
++	0x8a, 0x15, 0x8a, 0x14, 0x8a, 0x13, 0x8a, 0x12, 
++	0x8a, 0x11, 0x8a, 0x10, 0x8a, 0x0d, 0x8a, 0x0c, 
++	0x8a, 0x0b, 0x8a, 0x0a, 0x8a, 0x09, 0x8a, 0x08, 
++	0xf4, 0xeb, 0xee, 0xfd, 0x76, 0xf8, 0x2a, 0x38, 
++	0x00, 0x00, 0x76, 0xf8, 0x2a, 0x5a, 0x00, 0x00, 
++	0xe8, 0x01, 0x4e, 0x00, 0xfb, 0x80, 0x17, 0xd6, 
++	0xf4, 0x95, 0xe8, 0x01, 0x80, 0xf8, 0x2a, 0x5b, 
++	0x76, 0x00, 0x2a, 0x8f, 0xf9, 0x80, 0x16, 0xaa, 
++	0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x17, 0x5c, 
++	0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x17, 0x6f, 
++	0xfb, 0x80, 0x16, 0x66, 0xf4, 0x95, 0xe8, 0x1a, 
++	0xfb, 0x80, 0x16, 0x87, 0xf4, 0x95, 0xe8, 0x1a, 
++	0xfb, 0x80, 0x16, 0x66, 0xf4, 0x95, 0xe8, 0x1b, 
++	0xfb, 0x80, 0x16, 0x87, 0xf4, 0x95, 0xe8, 0x1b, 
++	0xee, 0x03, 0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 
++	0x13, 0x02, 0x88, 0x11, 0xe8, 0x00, 0xf8, 0x4d, 
++	0x06, 0x6a, 0xf3, 0x10, 0x00, 0x01, 0x89, 0x1a, 
++	0xf4, 0x95, 0xf0, 0x72, 0x06, 0x69, 0x1c, 0x91, 
++	0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x88, 0x11, 
++	0x12, 0x03, 0x11, 0x02, 0xf8, 0x45, 0x06, 0x79, 
++	0xf0, 0x10, 0x00, 0x01, 0x88, 0x1a, 0xf4, 0x95, 
++	0xf0, 0x72, 0x06, 0x78, 0x81, 0x91, 0x8a, 0x11, 
++	0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 
++	0x00, 0x11, 0x11, 0x03, 0x61, 0xf8, 0x00, 0x11, 
++	0x00, 0x01, 0xf8, 0x30, 0x06, 0x91, 0xf6, 0xb8, 
++	0x6f, 0xf8, 0x00, 0x11, 0x0c, 0x1f, 0x88, 0x11, 
++	0xf3, 0xe8, 0xe8, 0xff, 0x18, 0x81, 0xf1, 0xa0, 
++	0x81, 0x81, 0xf0, 0x73, 0x06, 0x9d, 0xf6, 0xb8, 
++	0x6f, 0xf8, 0x00, 0x11, 0x0c, 0x1f, 0x88, 0x11, 
++	0xf3, 0x30, 0x00, 0xff, 0xf0, 0x20, 0xff, 0x00, 
++	0x18, 0x81, 0xf1, 0xa0, 0x81, 0x81, 0x8a, 0x11, 
++	0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 0x11, 0x02, 
++	0x61, 0xf8, 0x00, 0x0b, 0x00, 0x01, 0xf8, 0x20, 
++	0x06, 0xb1, 0x49, 0x0b, 0xf6, 0x1f, 0x88, 0x11, 
++	0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 0xf2, 0x73, 
++	0x06, 0xb8, 0xf0, 0x30, 0x00, 0xff, 0x49, 0x0b, 
++	0xf6, 0x1f, 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 
++	0x12, 0x81, 0xf4, 0x78, 0x8a, 0x11, 0xfc, 0x00, 
++	0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 0x00, 0x12, 
++	0x13, 0x03, 0x88, 0x11, 0xe8, 0x00, 0xf8, 0x4d, 
++	0x06, 0xcc, 0xf3, 0x10, 0x00, 0x01, 0x89, 0x1a, 
++	0xf4, 0x95, 0xf0, 0x72, 0x06, 0xcb, 0x11, 0x92, 
++	0xf2, 0xc0, 0x81, 0x91, 0x8a, 0x11, 0xfc, 0x00, 
++	0x88, 0x12, 0x12, 0x02, 0x71, 0x01, 0x00, 0x13, 
++	0xf8, 0x45, 0x06, 0xdb, 0xf0, 0x10, 0x00, 0x01, 
++	0x88, 0x1a, 0xf4, 0x95, 0xf0, 0x72, 0x06, 0xda, 
++	0xe5, 0x98, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 
++	0x88, 0x11, 0x11, 0x04, 0x10, 0x06, 0x71, 0x05, 
++	0x00, 0x12, 0x61, 0xf8, 0x00, 0x12, 0x00, 0x01, 
++	0xf8, 0x20, 0x06, 0xea, 0xf0, 0x00, 0x00, 0x01, 
++	0xf6, 0xb8, 0xf0, 0x00, 0x00, 0x01, 0x6f, 0xf8, 
++	0x00, 0x12, 0x0f, 0x1f, 0x48, 0x08, 0x81, 0x00, 
++	0xf4, 0x7f, 0x80, 0x01, 0xf2, 0x74, 0x06, 0xba, 
++	0xf4, 0x95, 0x48, 0x11, 0xee, 0x02, 0x8a, 0x11, 
++	0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 0x88, 0x12, 
++	0x11, 0x04, 0x10, 0x06, 0x71, 0x05, 0x00, 0x13, 
++	0x61, 0xf8, 0x00, 0x13, 0x00, 0x01, 0xf8, 0x20, 
++	0x07, 0x09, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00, 
++	0x00, 0x01, 0x88, 0x11, 0xf6, 0xb8, 0x6f, 0xf8, 
++	0x00, 0x13, 0x0f, 0x1f, 0x81, 0x00, 0x48, 0x11, 
++	0xf4, 0x7f, 0x80, 0x01, 0xf2, 0x74, 0x06, 0xce, 
++	0xf4, 0x95, 0x48, 0x12, 0x48, 0x11, 0xf0, 0x30, 
++	0xff, 0xfe, 0xee, 0x02, 0x8a, 0x11, 0xfc, 0x00, 
++	0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 0xee, 0xfc, 
++	0xf4, 0x95, 0x80, 0x02, 0x71, 0x08, 0x00, 0x16, 
++	0x10, 0x09, 0x71, 0x0b, 0x00, 0x17, 0x80, 0x03, 
++	0x71, 0x0a, 0x00, 0x11, 0x48, 0x17, 0xf8, 0x45, 
++	0x07, 0x3f, 0x70, 0x00, 0x00, 0x11, 0x10, 0x03, 
++	0xf0, 0x74, 0x06, 0x9f, 0x80, 0x01, 0x70, 0x00, 
++	0x00, 0x16, 0x10, 0x02, 0xf0, 0x74, 0x06, 0x7b, 
++	0x6d, 0x91, 0x6d, 0x96, 0x6c, 0xef, 0xff, 0xff, 
++	0x07, 0x2f, 0xee, 0x04, 0x8a, 0x17, 0x8a, 0x16, 
++	0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 
++	0x10, 0xf8, 0x2a, 0xe8, 0x08, 0xf8, 0x2a, 0xe9, 
++	0xf8, 0x45, 0x07, 0x64, 0x76, 0x00, 0x00, 0x01, 
++	0x62, 0xf8, 0x2a, 0xe9, 0x00, 0x5e, 0xf2, 0x74, 
++	0x12, 0x0b, 0xf0, 0x00, 0x30, 0x40, 0x72, 0x11, 
++	0x2a, 0xe9, 0x77, 0x10, 0x00, 0x0f, 0xf5, 0xa9, 
++	0xf8, 0x20, 0x07, 0x61, 0x6b, 0xf8, 0x2a, 0xe9, 
++	0x00, 0x01, 0xf0, 0x73, 0x07, 0x64, 0x76, 0xf8, 
++	0x2a, 0xe9, 0x00, 0x00, 0xee, 0x02, 0x8a, 0x11, 
++	0xfc, 0x00, 0x4a, 0x11, 0x88, 0x11, 0xe8, 0x00, 
++	0x75, 0xf8, 0x00, 0x08, 0x00, 0x08, 0xe8, 0x00, 
++	0x75, 0xf8, 0x00, 0x08, 0x00, 0x09, 0xf6, 0xb8, 
++	0xf4, 0x95, 0xf0, 0x20, 0xfc, 0x3f, 0x75, 0xf8, 
++	0x00, 0x08, 0x00, 0x0d, 0xf0, 0x20, 0x0c, 0x30, 
++	0x75, 0xf8, 0x00, 0x08, 0x00, 0x0c, 0x76, 0xf8, 
++	0x2a, 0xe8, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xe9, 
++	0x00, 0x00, 0x6c, 0x81, 0x07, 0x92, 0x76, 0xf8, 
++	0x2a, 0xea, 0x00, 0x00, 0xfb, 0x80, 0x16, 0x76, 
++	0xf4, 0x95, 0xe8, 0x10, 0xe8, 0x00, 0x75, 0xf8, 
++	0x00, 0x08, 0x00, 0x00, 0xf0, 0x73, 0x07, 0xa8, 
++	0x76, 0xf8, 0x2a, 0xea, 0x00, 0x01, 0xfb, 0x80, 
++	0x16, 0x66, 0xf4, 0x95, 0xe8, 0x10, 0xfb, 0x80, 
++	0x16, 0x87, 0xf4, 0x95, 0xe8, 0x10, 0xe8, 0x00, 
++	0x75, 0xf8, 0x00, 0x08, 0x00, 0x00, 0xf6, 0xb8, 
++	0xf4, 0x95, 0xf0, 0x20, 0xff, 0xff, 0x75, 0xf8, 
++	0x00, 0x08, 0x00, 0x00, 0x8a, 0x11, 0xfc, 0x00, 
++	0xf4, 0x95, 0x4a, 0x08, 0x4a, 0x09, 0x4a, 0x0a, 
++	0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1d, 0x68, 0xf8, 
++	0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07, 
++	0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc, 
++	0x10, 0xf8, 0x2a, 0xea, 0xf8, 0x45, 0x07, 0xe1, 
++	0x10, 0xf8, 0x2a, 0xe8, 0xf0, 0x00, 0x00, 0x01, 
++	0xf0, 0x30, 0x00, 0x0f, 0x80, 0xf8, 0x2a, 0xe8, 
++	0x10, 0xf8, 0x2a, 0xe8, 0xf8, 0x44, 0x07, 0xd6, 
++	0xf6, 0xb8, 0xf4, 0x95, 0xf0, 0x20, 0xfc, 0x3f, 
++	0x75, 0xf8, 0x00, 0x08, 0x00, 0x0d, 0xf0, 0x20, 
++	0x0c, 0x30, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x0c, 
++	0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x00, 
++	0xf6, 0xb8, 0xf4, 0x95, 0xf0, 0x20, 0xff, 0xff, 
++	0x75, 0xf8, 0x00, 0x08, 0x00, 0x00, 0x8a, 0x1d, 
++	0x8a, 0x07, 0x8a, 0x06, 0x8a, 0x0a, 0x8a, 0x09, 
++	0x8a, 0x08, 0xf4, 0xeb, 0xee, 0xff, 0xf2, 0x74, 
++	0x07, 0x67, 0xf4, 0x95, 0xe8, 0x01, 0xee, 0x01, 
++	0xfc, 0x00, 0x4a, 0x07, 0x4a, 0x1d, 0x68, 0xf8, 
++	0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07, 
++	0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc, 
++	0x8a, 0x1d, 0x8a, 0x07, 0xf4, 0xeb, 0x4a, 0x11, 
++	0x77, 0x11, 0x00, 0x28, 0x76, 0x81, 0x24, 0x00, 
++	0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 
++	0xf2, 0x74, 0x07, 0x67, 0xf4, 0x95, 0xe8, 0x00, 
++	0x77, 0x11, 0x00, 0x1d, 0x68, 0x81, 0x00, 0x7f, 
++	0xf6, 0xb8, 0xf4, 0x95, 0xf0, 0x20, 0xff, 0x80, 
++	0x77, 0x11, 0x00, 0x1d, 0xf0, 0x30, 0x01, 0x00, 
++	0x1a, 0x81, 0x80, 0x81, 0xf0, 0x74, 0x0a, 0x33, 
++	0xf0, 0x74, 0x11, 0xac, 0xf9, 0x80, 0x13, 0x25, 
++	0xf9, 0x80, 0x16, 0x53, 0xf9, 0x80, 0x17, 0x82, 
++	0xf0, 0x74, 0x06, 0x2f, 0xf9, 0x80, 0x14, 0xb2, 
++	0xf9, 0x80, 0x19, 0x10, 0xf0, 0x74, 0x0d, 0xe3, 
++	0xf0, 0x74, 0x07, 0xe8, 0xf0, 0x74, 0x02, 0x36, 
++	0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x60, 0xf8, 
++	0x27, 0x7b, 0xff, 0xff, 0xf8, 0x30, 0x08, 0x39, 
++	0x71, 0xf8, 0x27, 0x7b, 0x27, 0x79, 0x60, 0xf8, 
++	0x27, 0x79, 0xff, 0xff, 0xf8, 0x30, 0x08, 0xb2, 
++	0x10, 0xf8, 0x29, 0x86, 0x08, 0xf8, 0x27, 0x79, 
++	0xf0, 0x30, 0x7f, 0xff, 0x88, 0x11, 0xf4, 0x95, 
++	0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9, 0xf8, 0x30, 
++	0x08, 0x58, 0x10, 0xf8, 0x27, 0x79, 0x08, 0xf8, 
++	0x27, 0x7a, 0xf0, 0x30, 0x7f, 0xff, 0x88, 0x11, 
++	0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9, 
++	0xf8, 0x20, 0x08, 0x63, 0x76, 0xf8, 0x27, 0x79, 
++	0xff, 0xff, 0x76, 0xf8, 0x27, 0x7b, 0xff, 0xff, 
++	0xf7, 0xb8, 0xf2, 0x73, 0x08, 0xd9, 0xf0, 0x20, 
++	0xff, 0xff, 0xf6, 0xb8, 0x56, 0xf8, 0x27, 0x74, 
++	0xf0, 0xf9, 0x88, 0x11, 0x56, 0xf8, 0x27, 0x72, 
++	0xf0, 0xf9, 0x88, 0x12, 0xf4, 0x95, 0xf4, 0x95, 
++	0xe7, 0x20, 0xf4, 0xa9, 0xf8, 0x30, 0x08, 0x8f, 
++	0xf1, 0x20, 0x27, 0x7c, 0x48, 0x11, 0xf6, 0x00, 
++	0x88, 0x13, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x83, 
++	0x08, 0xf8, 0x27, 0x79, 0xf0, 0x30, 0x7f, 0xff, 
++	0x88, 0x13, 0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 
++	0xf5, 0xab, 0xf8, 0x30, 0x08, 0x8f, 0x6d, 0x91, 
++	0x48, 0x11, 0xf0, 0x30, 0x01, 0xff, 0x88, 0x11, 
++	0xf4, 0x95, 0xe7, 0x20, 0xf7, 0xa9, 0xf8, 0x30, 
++	0x08, 0x74, 0x6d, 0x89, 0x48, 0x11, 0xf0, 0x30, 
++	0x01, 0xff, 0xf0, 0xe7, 0xf4, 0x95, 0x48, 0x08, 
++	0x4e, 0xf8, 0x27, 0x74, 0x48, 0x08, 0xf1, 0xf9, 
++	0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x71, 0xe1, 
++	0x27, 0x7c, 0x27, 0x7a, 0x60, 0xf8, 0x27, 0x7b, 
++	0xff, 0xff, 0xf8, 0x30, 0x08, 0xab, 0x48, 0x08, 
++	0x4e, 0xf8, 0x27, 0x72, 0x76, 0xf8, 0x27, 0x7b, 
++	0xff, 0xff, 0x76, 0xf8, 0x27, 0x79, 0xff, 0xff, 
++	0xf2, 0x73, 0x08, 0xd9, 0xf4, 0x95, 0xe8, 0x00, 
++	0x44, 0xf8, 0x27, 0x73, 0x40, 0xf8, 0x27, 0x75, 
++	0x82, 0xf8, 0x00, 0x11, 0xf4, 0x95, 0x77, 0x10, 
++	0x80, 0x00, 0xf6, 0xa9, 0xf8, 0x20, 0x08, 0xd8, 
++	0xf6, 0xb8, 0x10, 0xf8, 0x27, 0x73, 0xf0, 0x00, 
++	0x80, 0x00, 0x48, 0x08, 0x4e, 0xf8, 0x27, 0x74, 
++	0x48, 0x08, 0xf0, 0xf9, 0x88, 0x11, 0xf4, 0x95, 
++	0xf4, 0x95, 0x71, 0xe1, 0x27, 0x7c, 0x27, 0x7a, 
++	0xf7, 0xb8, 0x57, 0xf8, 0x27, 0x74, 0xf0, 0x62, 
++	0xff, 0xff, 0xf0, 0x40, 0xff, 0x80, 0xf2, 0x80, 
++	0x4e, 0xf8, 0x27, 0x74, 0xe8, 0x00, 0x8a, 0x11, 
++	0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 0xee, 0xfb, 
++	0x11, 0xf8, 0x27, 0x71, 0x09, 0xf8, 0x27, 0x73, 
++	0x89, 0x11, 0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95, 
++	0xf6, 0xa9, 0xf8, 0x20, 0x08, 0xed, 0xf2, 0x73, 
++	0x09, 0x0e, 0xf4, 0x95, 0xe8, 0x00, 0xf6, 0x20, 
++	0x76, 0x00, 0x00, 0x41, 0xf0, 0x74, 0x12, 0xee, 
++	0x88, 0x16, 0xf4, 0x95, 0xf7, 0xb8, 0x6d, 0x96, 
++	0x10, 0xf8, 0x00, 0x16, 0xf8, 0x47, 0x09, 0x0a, 
++	0xe7, 0x61, 0x76, 0x00, 0x00, 0x00, 0x76, 0x01, 
++	0x00, 0x80, 0x76, 0x02, 0x00, 0xff, 0x76, 0x03, 
++	0x00, 0x00, 0xf2, 0x74, 0x0c, 0xb9, 0xf4, 0x95, 
++	0xe8, 0x00, 0x6c, 0xe9, 0xff, 0xff, 0x08, 0xfb, 
++	0x73, 0x16, 0x00, 0x0e, 0xf0, 0x66, 0x00, 0x41, 
++	0xee, 0x05, 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00, 
++	0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 0x00, 0x13, 
++	0xf6, 0xb8, 0x77, 0x11, 0x7f, 0xff, 0x57, 0xf8, 
++	0x27, 0x72, 0x48, 0x11, 0xf2, 0x80, 0xf0, 0x00, 
++	0x80, 0x00, 0x88, 0x11, 0xf6, 0x40, 0xf0, 0xe0, 
++	0xf1, 0xf1, 0xe8, 0x01, 0xf2, 0x80, 0x80, 0xf8, 
++	0x27, 0x78, 0x77, 0x12, 0x80, 0x00, 0x57, 0xf8, 
++	0x27, 0x72, 0x48, 0x12, 0xf2, 0x80, 0x88, 0x12, 
++	0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x82, 0x09, 0x38, 
++	0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 
++	0xf0, 0x73, 0x09, 0x3d, 0xf0, 0x20, 0x80, 0x01, 
++	0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 0x70, 0x81, 
++	0x00, 0x13, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
++	0xf0, 0x30, 0x7f, 0xff, 0x11, 0xf8, 0x29, 0x86, 
++	0xf5, 0x20, 0xf3, 0x30, 0x7f, 0xff, 0x89, 0x11, 
++	0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9, 
++	0xf8, 0x20, 0x09, 0x54, 0xf2, 0x73, 0x09, 0x67, 
++	0xf4, 0x95, 0xe8, 0x02, 0x6f, 0xf8, 0x27, 0x7a, 
++	0x0d, 0x20, 0xf3, 0x30, 0x7f, 0xff, 0x89, 0x11, 
++	0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9, 
++	0xf8, 0x20, 0x09, 0x64, 0xf2, 0x73, 0x09, 0x67, 
++	0xf4, 0x95, 0xe8, 0x01, 0x80, 0xf8, 0x27, 0x7b, 
++	0xe8, 0x00, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
++	0x11, 0xf8, 0x29, 0x86, 0xf5, 0x20, 0xf3, 0x30, 
++	0x7f, 0xff, 0x89, 0x11, 0xf4, 0x95, 0x77, 0x10, 
++	0x40, 0x00, 0xf6, 0xa9, 0xf8, 0x20, 0x09, 0x7a, 
++	0xf2, 0x73, 0x09, 0x8d, 0xf4, 0x95, 0xe8, 0x02, 
++	0x6f, 0xf8, 0x27, 0x7a, 0x0d, 0x20, 0xf3, 0x30, 
++	0x7f, 0xff, 0x89, 0x11, 0xf4, 0x95, 0x77, 0x10, 
++	0x40, 0x00, 0xf6, 0xa9, 0xf8, 0x20, 0x09, 0x8a, 
++	0xf2, 0x73, 0x09, 0x8d, 0xf4, 0x95, 0xe8, 0x01, 
++	0x80, 0xf8, 0x27, 0x79, 0xe8, 0x00, 0x8a, 0x11, 
++	0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 
++	0x00, 0x12, 0x88, 0x11, 0xf6, 0xb8, 0x57, 0xf8, 
++	0x27, 0x72, 0xf0, 0x20, 0x7f, 0xff, 0xf2, 0x80, 
++	0xf0, 0x00, 0x80, 0x00, 0x80, 0x81, 0x57, 0xf8, 
++	0x27, 0x72, 0xe8, 0x01, 0xf3, 0xf1, 0xf2, 0x80, 
++	0x80, 0xf8, 0x27, 0x78, 0x77, 0x11, 0x80, 0x00, 
++	0x48, 0x11, 0x57, 0xf8, 0x27, 0x72, 0xf2, 0x80, 
++	0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81, 
++	0x09, 0xb5, 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 
++	0x00, 0x01, 0xf0, 0x73, 0x09, 0xba, 0xf0, 0x20, 
++	0x80, 0x01, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 
++	0x45, 0xf8, 0x27, 0x71, 0x43, 0xf8, 0x27, 0x73, 
++	0x83, 0xf8, 0x00, 0x11, 0xf4, 0x95, 0xe7, 0x20, 
++	0xf6, 0xa9, 0xf8, 0x30, 0x09, 0xc9, 0xf2, 0x73, 
++	0x09, 0xe4, 0x77, 0x12, 0x00, 0x00, 0x57, 0xf8, 
++	0x27, 0x72, 0xf0, 0x20, 0x7f, 0xff, 0xf2, 0x80, 
++	0x49, 0x12, 0xf5, 0x00, 0xf3, 0x00, 0x80, 0x00, 
++	0x61, 0xf8, 0x00, 0x0b, 0x80, 0x00, 0xf8, 0x30, 
++	0x09, 0xdc, 0xf1, 0x20, 0x80, 0x00, 0xf5, 0x20, 
++	0x89, 0x12, 0xf4, 0x95, 0x48, 0x12, 0x6f, 0xf8, 
++	0x27, 0x73, 0x0d, 0x00, 0xf4, 0x95, 0x49, 0x0b, 
++	0x4f, 0xf8, 0x27, 0x72, 0x8a, 0x11, 0xfe, 0x00, 
++	0x48, 0x12, 0xf4, 0x95, 0x4a, 0x11, 0x4a, 0x16, 
++	0x4a, 0x17, 0xee, 0xfc, 0xf4, 0x95, 0x71, 0x08, 
++	0x00, 0x16, 0x88, 0x17, 0xf0, 0x74, 0x08, 0x30, 
++	0x48, 0x18, 0x70, 0x00, 0x00, 0x16, 0xf2, 0x74, 
++	0x09, 0x8f, 0xf0, 0x00, 0x00, 0x02, 0x88, 0x11, 
++	0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81, 0x0a, 0x0a, 
++	0xf2, 0x74, 0x08, 0xdb, 0xf4, 0x95, 0x48, 0x16, 
++	0x48, 0x18, 0x70, 0x00, 0x00, 0x16, 0xf2, 0x74, 
++	0x09, 0x8f, 0xf0, 0x00, 0x00, 0x02, 0x88, 0x11, 
++	0x10, 0x02, 0x70, 0x01, 0x00, 0x11, 0x80, 0x00, 
++	0xf2, 0x74, 0x06, 0xce, 0xf4, 0x95, 0x48, 0x17, 
++	0x49, 0x11, 0x48, 0x17, 0xf6, 0x00, 0x88, 0x17, 
++	0xe7, 0x60, 0xf5, 0xa9, 0xf8, 0x20, 0x0a, 0x2d, 
++	0x48, 0x16, 0xf6, 0x20, 0x88, 0x11, 0x48, 0x18, 
++	0x70, 0x00, 0x00, 0x11, 0xf2, 0x74, 0x09, 0x8f, 
++	0xf0, 0x00, 0x00, 0x02, 0x88, 0x11, 0x70, 0x01, 
++	0x00, 0x11, 0x10, 0x02, 0x80, 0x00, 0xf2, 0x74, 
++	0x06, 0xce, 0xf4, 0x95, 0x48, 0x17, 0xee, 0x04, 
++	0x48, 0x16, 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 
++	0xfc, 0x00, 0xee, 0xfd, 0xe8, 0x00, 0x4e, 0xf8, 
++	0x27, 0x70, 0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x72, 
++	0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x74, 0xe8, 0x00, 
++	0x4e, 0xf8, 0x27, 0x76, 0x76, 0xf8, 0x27, 0x79, 
++	0xff, 0xff, 0x76, 0xf8, 0x27, 0x7a, 0x00, 0x00, 
++	0x76, 0xf8, 0x27, 0x7b, 0xff, 0xff, 0x76, 0xf8, 
++	0x27, 0x78, 0x00, 0x00, 0xe8, 0x00, 0x75, 0xf8, 
++	0x00, 0x08, 0x00, 0x01, 0x76, 0x00, 0x00, 0x00, 
++	0x76, 0x01, 0x02, 0x00, 0xf2, 0x74, 0x12, 0xdc, 
++	0xf0, 0x20, 0x27, 0x7c, 0xee, 0x03, 0xfc, 0x00, 
++	0x4a, 0x11, 0xee, 0xfc, 0xf4, 0x95, 0x4e, 0x00, 
++	0x77, 0x12, 0x7f, 0xff, 0xf6, 0xb8, 0x49, 0x12, 
++	0xf1, 0x80, 0xf3, 0x00, 0x80, 0x00, 0x89, 0x12, 
++	0xf0, 0xe0, 0xf1, 0xf1, 0x4f, 0x02, 0xe9, 0x01, 
++	0xf4, 0x95, 0x48, 0x0b, 0xf5, 0x40, 0x56, 0x02, 
++	0xf1, 0x80, 0x81, 0xf8, 0x27, 0x78, 0x77, 0x11, 
++	0x80, 0x00, 0x56, 0x00, 0x49, 0x11, 0xf1, 0x80, 
++	0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81, 
++	0x0a, 0x81, 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 
++	0x00, 0x01, 0xf0, 0x73, 0x0a, 0x86, 0xf0, 0x20, 
++	0x80, 0x01, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 
++	0x10, 0x82, 0xee, 0x04, 0x8a, 0x11, 0xfc, 0x00, 
++	0x4a, 0x11, 0xee, 0xfe, 0xf4, 0x95, 0x4e, 0x00, 
++	0x77, 0x11, 0x7f, 0xff, 0xf6, 0xb8, 0x49, 0x11, 
++	0xf1, 0x80, 0xf3, 0x00, 0x80, 0x00, 0x89, 0x11, 
++	0xf0, 0xe0, 0xf1, 0xf1, 0xe8, 0x01, 0xf2, 0x80, 
++	0x80, 0xf8, 0x27, 0x78, 0x56, 0x00, 0xf1, 0x20, 
++	0x80, 0x00, 0xf1, 0x80, 0xf4, 0x95, 0x49, 0x0b, 
++	0xf8, 0x4d, 0x0a, 0xab, 0xf0, 0x20, 0x80, 0x01, 
++	0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 0xf0, 0x73, 
++	0x0a, 0xaf, 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 
++	0x00, 0x01, 0xee, 0x02, 0x48, 0x11, 0x8a, 0x11, 
++	0xfc, 0x00, 0x4a, 0x11, 0x88, 0x12, 0x13, 0x02, 
++	0x77, 0x11, 0x00, 0x00, 0xf8, 0x4d, 0x0a, 0xcb, 
++	0xf3, 0x10, 0x00, 0x01, 0x89, 0x1a, 0xf4, 0x95, 
++	0xf0, 0x72, 0x0a, 0xca, 0x48, 0x11, 0x1c, 0xf8, 
++	0x29, 0x7e, 0x88, 0x11, 0x11, 0xf8, 0x29, 0x7e, 
++	0xf2, 0x00, 0x00, 0x01, 0x80, 0xf8, 0x29, 0x7e, 
++	0x81, 0x92, 0x48, 0x11, 0x8a, 0x11, 0xfc, 0x00, 
++	0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 0x00, 0x11, 
++	0x88, 0x12, 0xf6, 0xb8, 0xf0, 0x20, 0x7f, 0xff, 
++	0x57, 0xf8, 0x27, 0x70, 0xf2, 0x80, 0xf0, 0x00, 
++	0x80, 0x00, 0x80, 0x82, 0x57, 0xf8, 0x27, 0x70, 
++	0xe8, 0x01, 0xf3, 0xf1, 0xf2, 0x80, 0x80, 0xf8, 
++	0x27, 0x78, 0x77, 0x12, 0x80, 0x00, 0x48, 0x12, 
++	0x57, 0xf8, 0x27, 0x70, 0xf2, 0x80, 0x88, 0x12, 
++	0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x82, 0x0a, 0xf4, 
++	0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 
++	0xf0, 0x73, 0x0a, 0xf9, 0xf0, 0x20, 0x80, 0x01, 
++	0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 0x45, 0xf8, 
++	0x27, 0x75, 0xe7, 0x10, 0x43, 0xf8, 0x27, 0x71, 
++	0x83, 0xf8, 0x00, 0x12, 0x6d, 0xe8, 0x00, 0x04, 
++	0x6d, 0x8a, 0xf6, 0xaa, 0xf8, 0x30, 0x0b, 0x0a, 
++	0xf2, 0x73, 0x0b, 0x25, 0x77, 0x11, 0x00, 0x00, 
++	0x57, 0xf8, 0x27, 0x70, 0xf0, 0x20, 0x7f, 0xff, 
++	0xf2, 0x80, 0x49, 0x11, 0xf5, 0x00, 0xf3, 0x00, 
++	0x80, 0x00, 0x61, 0xf8, 0x00, 0x0b, 0x80, 0x00, 
++	0xf8, 0x30, 0x0b, 0x1d, 0xf1, 0x20, 0x80, 0x00, 
++	0xf5, 0x20, 0x89, 0x11, 0xf4, 0x95, 0x48, 0x11, 
++	0x6f, 0xf8, 0x27, 0x71, 0x0d, 0x00, 0xf4, 0x95, 
++	0x49, 0x0b, 0x4f, 0xf8, 0x27, 0x70, 0x48, 0x11, 
++	0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 
++	0x4a, 0x17, 0xee, 0xf0, 0x88, 0x17, 0x10, 0x17, 
++	0x80, 0x05, 0x10, 0x16, 0x80, 0x06, 0x10, 0x15, 
++	0x80, 0x07, 0x71, 0x14, 0x00, 0x11, 0x10, 0x05, 
++	0xf0, 0x30, 0x00, 0x01, 0x88, 0x10, 0x10, 0x06, 
++	0xf0, 0x30, 0x00, 0x01, 0x80, 0x08, 0x49, 0x11, 
++	0x10, 0x05, 0xf6, 0x01, 0x80, 0x09, 0x10, 0x06, 
++	0x61, 0xf8, 0x00, 0x08, 0x00, 0x01, 0xf8, 0x20, 
++	0x0b, 0x4b, 0x10, 0x09, 0xf0, 0x00, 0x00, 0x01, 
++	0x80, 0x09, 0x71, 0x08, 0x00, 0x12, 0xf4, 0xaa, 
++	0xf8, 0x30, 0x0b, 0x54, 0x10, 0x09, 0xf0, 0x00, 
++	0x00, 0x01, 0x80, 0x09, 0x12, 0x09, 0x49, 0x11, 
++	0xf4, 0x7f, 0x80, 0x09, 0xf6, 0x20, 0x80, 0x0a, 
++	0x56, 0xf8, 0x27, 0x70, 0x4e, 0x0c, 0x10, 0x09, 
++	0x80, 0x00, 0x48, 0x18, 0xf2, 0x74, 0x0a, 0xce, 
++	0xf0, 0x00, 0x00, 0x04, 0x88, 0x16, 0xf4, 0x95, 
++	0xf4, 0x95, 0x6c, 0x86, 0x0b, 0x6d, 0xf2, 0x73, 
++	0x0c, 0x59, 0xf4, 0x95, 0xe8, 0x00, 0xf6, 0xb8, 
++	0xf4, 0x95, 0x56, 0x0c, 0xf0, 0xf9, 0x88, 0x12, 
++	0xf4, 0x95, 0xf4, 0x95, 0x70, 0xe2, 0x27, 0x7c, 
++	0x29, 0x86, 0xe8, 0x00, 0x80, 0x0e, 0x48, 0x11, 
++	0xf8, 0x45, 0x0b, 0xcc, 0x77, 0x10, 0x00, 0x01, 
++	0xf4, 0xa9, 0xf8, 0x30, 0x0b, 0x89, 0x6c, 0xe1, 
++	0xff, 0xfd, 0x0b, 0x8b, 0x10, 0xe7, 0x00, 0x02, 
++	0x80, 0x0e, 0xf0, 0x73, 0x0b, 0x8b, 0x10, 0x87, 
++	0x80, 0x0e, 0xe7, 0x10, 0xf5, 0xae, 0xf8, 0x20, 
++	0x0b, 0xb2, 0x70, 0x00, 0x00, 0x17, 0x70, 0x01, 
++	0x00, 0x16, 0x10, 0x04, 0xf0, 0x74, 0x06, 0xce, 
++	0x48, 0x17, 0x49, 0x16, 0xf6, 0x00, 0x88, 0x17, 
++	0x48, 0x11, 0xf6, 0x20, 0x88, 0x11, 0x10, 0x09, 
++	0xf6, 0x20, 0x80, 0x00, 0x48, 0x18, 0xf2, 0x74, 
++	0x0a, 0xce, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x16, 
++	0x10, 0x04, 0x70, 0x00, 0x00, 0x17, 0x70, 0x01, 
++	0x00, 0x11, 0xf0, 0x74, 0x06, 0xce, 0x48, 0x11, 
++	0x00, 0x04, 0x80, 0x04, 0xf0, 0x73, 0x0b, 0xbc, 
++	0x70, 0x00, 0x00, 0x17, 0x70, 0x01, 0x00, 0x11, 
++	0x10, 0x04, 0xf0, 0x74, 0x06, 0xce, 0x48, 0x11, 
++	0x00, 0x04, 0x80, 0x04, 0x49, 0x11, 0x48, 0x16, 
++	0xf6, 0x20, 0x88, 0x16, 0xf4, 0x95, 0xf4, 0x95, 
++	0x6c, 0x86, 0x0b, 0xcc, 0x10, 0x0a, 0x80, 0x00, 
++	0x48, 0x18, 0xf2, 0x74, 0x0a, 0xce, 0xf0, 0x00, 
++	0x00, 0x04, 0x88, 0x16, 0x12, 0x0a, 0xf8, 0x45, 
++	0x0c, 0x33, 0x71, 0x0a, 0x00, 0x10, 0xf4, 0xae, 
++	0xf8, 0x30, 0x0c, 0x1c, 0x48, 0x16, 0xf0, 0xe1, 
++	0x88, 0x11, 0x12, 0x08, 0xf8, 0x45, 0x0b, 0xdb, 
++	0x6d, 0x89, 0x12, 0x07, 0xf8, 0x45, 0x0b, 0xe9, 
++	0x10, 0x07, 0x80, 0x00, 0x70, 0x02, 0x00, 0x11, 
++	0x10, 0x06, 0x80, 0x01, 0x10, 0x04, 0xf0, 0x74, 
++	0x06, 0xdc, 0xf0, 0x73, 0x0b, 0xef, 0x48, 0x11, 
++	0x6f, 0x00, 0x0c, 0x9f, 0x10, 0x04, 0xf0, 0x74, 
++	0x0a, 0xb3, 0x11, 0x0e, 0xf1, 0xc0, 0x81, 0x0e, 
++	0x10, 0x06, 0x49, 0x11, 0xf6, 0x00, 0x80, 0x06, 
++	0x10, 0x05, 0xf6, 0x20, 0x88, 0x11, 0xf0, 0x00, 
++	0x00, 0x01, 0x48, 0x08, 0x6f, 0x00, 0x0c, 0x9f, 
++	0x48, 0x18, 0xf2, 0x74, 0x0a, 0xce, 0xf0, 0x00, 
++	0x00, 0x04, 0x12, 0x07, 0xf8, 0x45, 0x0c, 0x11, 
++	0x10, 0x07, 0x80, 0x00, 0x70, 0x02, 0x00, 0x11, 
++	0x10, 0x06, 0x80, 0x01, 0x10, 0x04, 0xf0, 0x74, 
++	0x06, 0xdc, 0xf0, 0x73, 0x0c, 0x17, 0x48, 0x11, 
++	0x6f, 0x00, 0x0c, 0x9f, 0x10, 0x04, 0xf0, 0x74, 
++	0x0a, 0xb3, 0x11, 0x0e, 0xf1, 0xc0, 0x81, 0x0e, 
++	0xf0, 0x73, 0x0c, 0x33, 0x12, 0x07, 0xf8, 0x45, 
++	0x0c, 0x2a, 0x10, 0x07, 0x80, 0x00, 0x10, 0x06, 
++	0x80, 0x01, 0x10, 0x05, 0x80, 0x02, 0x10, 0x04, 
++	0xf0, 0x74, 0x06, 0xdc, 0xf0, 0x73, 0x0c, 0x30, 
++	0x12, 0x05, 0x6f, 0x00, 0x0c, 0x9f, 0x10, 0x04, 
++	0xf0, 0x74, 0x0a, 0xb3, 0x11, 0x0e, 0xf1, 0xc0, 
++	0x81, 0x0e, 0x76, 0x00, 0x00, 0x01, 0x48, 0x18, 
++	0xf2, 0x74, 0x0a, 0xce, 0xf0, 0x00, 0x00, 0x04, 
++	0x71, 0x04, 0x00, 0x11, 0x70, 0x81, 0x29, 0x86, 
++	0x10, 0x0e, 0x1c, 0xf8, 0x29, 0x86, 0x80, 0x0e, 
++	0x76, 0x00, 0x00, 0x01, 0x48, 0x18, 0xf2, 0x74, 
++	0x0a, 0xce, 0xf0, 0x00, 0x00, 0x04, 0x10, 0x0e, 
++	0x71, 0x04, 0x00, 0x11, 0x80, 0x81, 0x10, 0xf8, 
++	0x29, 0x86, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x30, 
++	0x7f, 0xff, 0x80, 0xf8, 0x29, 0x86, 0x10, 0x09, 
++	0xf0, 0x00, 0x00, 0x02, 0x80, 0x09, 0xee, 0x10, 
++	0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00, 
++	0x10, 0xf8, 0x27, 0x75, 0x08, 0xf8, 0x27, 0x71, 
++	0xf0, 0x10, 0x00, 0x01, 0x48, 0x08, 0xfc, 0x00, 
++	0x4a, 0x11, 0x4a, 0x16, 0xee, 0xff, 0xf4, 0x95, 
++	0x71, 0x04, 0x00, 0x16, 0xf0, 0x00, 0x00, 0x01, 
++	0x48, 0x08, 0x4e, 0xf8, 0x29, 0x7c, 0x6d, 0xee, 
++	0xff, 0xfd, 0x48, 0x16, 0xf8, 0x45, 0x0c, 0x99, 
++	0x56, 0xf8, 0x29, 0x7c, 0xf0, 0x74, 0x0a, 0x5a, 
++	0x88, 0x11, 0x10, 0xf8, 0x29, 0x7d, 0xf0, 0x00, 
++	0x00, 0x01, 0x48, 0x08, 0x4e, 0xf8, 0x29, 0x7c, 
++	0x10, 0xf8, 0x29, 0x82, 0xf0, 0x00, 0x00, 0x01, 
++	0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xa9, 
++	0xfa, 0x30, 0x0c, 0x96, 0x80, 0xf8, 0x29, 0x82, 
++	0x56, 0xf8, 0x29, 0x80, 0xf0, 0x00, 0x00, 0x01, 
++	0x4e, 0xf8, 0x29, 0x80, 0x73, 0x11, 0x29, 0x82, 
++	0x6c, 0xee, 0xff, 0xff, 0x0c, 0x76, 0xee, 0x01, 
++	0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
++	0x76, 0xf8, 0x29, 0x84, 0x00, 0x00, 0x76, 0xf8, 
++	0x29, 0x85, 0x00, 0x01, 0xe8, 0x00, 0x4e, 0xf8, 
++	0x2a, 0x0c, 0x76, 0xf8, 0x29, 0x86, 0x00, 0x00, 
++	0x76, 0xf8, 0x29, 0x87, 0x00, 0x00, 0x77, 0x11, 
++	0x29, 0x88, 0x76, 0x81, 0xaa, 0xaa, 0x76, 0xe1, 
++	0x00, 0x01, 0xaa, 0xaa, 0x76, 0xe1, 0x00, 0x02, 
++	0x00, 0x00, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
++	0xee, 0xfc, 0xf4, 0x95, 0x71, 0x06, 0x00, 0x14, 
++	0x71, 0x07, 0x00, 0x13, 0x71, 0x08, 0x00, 0x12, 
++	0x71, 0x09, 0x00, 0x15, 0x77, 0x10, 0x00, 0xff, 
++	0xf4, 0xaa, 0xf8, 0x30, 0x0d, 0x44, 0x49, 0x13, 
++	0x53, 0xf8, 0x2a, 0x0c, 0x4f, 0xf8, 0x2a, 0x0c, 
++	0x73, 0x12, 0x00, 0x0e, 0xf1, 0x66, 0x00, 0x0d, 
++	0x89, 0x11, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x01, 
++	0x71, 0xe1, 0x24, 0x00, 0x00, 0x11, 0xf4, 0xa9, 
++	0xf8, 0x30, 0x0d, 0x17, 0x77, 0x10, 0x00, 0x02, 
++	0xf4, 0xa9, 0xf8, 0x30, 0x0c, 0xec, 0x77, 0x11, 
++	0x29, 0x8a, 0x76, 0x81, 0x00, 0x00, 0xe8, 0x00, 
++	0x77, 0x14, 0x00, 0x00, 0x77, 0x13, 0x00, 0x00, 
++	0xf0, 0x73, 0x0d, 0x48, 0x6c, 0x83, 0x0c, 0xfa, 
++	0x77, 0x11, 0x29, 0x8a, 0x48, 0x12, 0xf0, 0xe8, 
++	0xf0, 0x40, 0x80, 0x00, 0x80, 0x81, 0xe8, 0x00, 
++	0x77, 0x14, 0x00, 0x00, 0xf0, 0x73, 0x0d, 0x48, 
++	0x49, 0x13, 0xf3, 0x40, 0x80, 0x00, 0x81, 0xf8, 
++	0x29, 0x8a, 0x61, 0xf8, 0x00, 0x15, 0x00, 0x01, 
++	0xf8, 0x20, 0x0d, 0x07, 0x69, 0xf8, 0x29, 0x8a, 
++	0x40, 0x00, 0x61, 0xf8, 0x00, 0x14, 0x00, 0x01, 
++	0xf8, 0x20, 0x0d, 0x0f, 0x69, 0xf8, 0x29, 0x8a, 
++	0x20, 0x00, 0x77, 0x11, 0x29, 0x8a, 0x49, 0x12, 
++	0xf3, 0xe8, 0x1b, 0x81, 0x81, 0x81, 0xf0, 0x73, 
++	0x0d, 0x48, 0x11, 0xf8, 0x29, 0x84, 0xf8, 0x4c, 
++	0x0d, 0x37, 0x77, 0x11, 0x29, 0x88, 0x76, 0x81, 
++	0xaa, 0xaa, 0x11, 0xf8, 0x29, 0x85, 0xf3, 0x10, 
++	0x00, 0x01, 0xf3, 0x40, 0xaa, 0x00, 0x81, 0xe1, 
++	0x00, 0x01, 0x76, 0x00, 0x00, 0x02, 0x80, 0x01, 
++	0x70, 0x02, 0x00, 0x14, 0x70, 0x03, 0x00, 0x13, 
++	0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95, 0x48, 0x11, 
++	0x71, 0xf8, 0x29, 0x85, 0x29, 0x84, 0xf0, 0x73, 
++	0x0d, 0x73, 0x76, 0x00, 0x00, 0x00, 0x80, 0x01, 
++	0x76, 0x02, 0x00, 0x00, 0x70, 0x03, 0x00, 0x13, 
++	0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95, 0xe8, 0x00, 
++	0xf0, 0x73, 0x0d, 0x73, 0x77, 0x11, 0x29, 0x8a, 
++	0x70, 0x81, 0x00, 0x13, 0x11, 0xf8, 0x29, 0x84, 
++	0xf8, 0x4c, 0x0d, 0x68, 0x77, 0x11, 0x29, 0x88, 
++	0x76, 0x81, 0xaa, 0xaa, 0x11, 0xf8, 0x29, 0x85, 
++	0xf3, 0x10, 0x00, 0x01, 0xf3, 0x40, 0xaa, 0x00, 
++	0x81, 0xe1, 0x00, 0x01, 0x76, 0x00, 0x00, 0x03, 
++	0x80, 0x01, 0x70, 0x02, 0x00, 0x14, 0x70, 0x03, 
++	0x00, 0x13, 0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95, 
++	0x48, 0x11, 0x71, 0xf8, 0x29, 0x85, 0x29, 0x84, 
++	0xf0, 0x73, 0x0d, 0x73, 0x76, 0x00, 0x00, 0x01, 
++	0x80, 0x01, 0x70, 0x02, 0x00, 0x14, 0x70, 0x03, 
++	0x00, 0x13, 0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95, 
++	0x48, 0x11, 0x6b, 0xf8, 0x29, 0x84, 0xff, 0xff, 
++	0xee, 0x04, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
++	0xf5, 0x40, 0xf4, 0x95, 0x48, 0x0b, 0xf4, 0x78, 
++	0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0xe1, 
++	0xff, 0xb9, 0x0d, 0x88, 0xf2, 0x73, 0x0d, 0xa5, 
++	0xf4, 0x95, 0xe8, 0x60, 0xf2, 0x00, 0x00, 0x06, 
++	0x61, 0xf8, 0x00, 0x11, 0x00, 0x20, 0xf8, 0x30, 
++	0x0d, 0x98, 0x61, 0xf8, 0x00, 0x0b, 0x00, 0x01, 
++	0xf8, 0x20, 0x0d, 0xa3, 0xf2, 0x00, 0x00, 0x07, 
++	0xf0, 0x73, 0x0d, 0xa3, 0x61, 0xf8, 0x00, 0x0b, 
++	0x00, 0x01, 0xf8, 0x20, 0x0d, 0xa1, 0xf2, 0x73, 
++	0x0d, 0xa3, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00, 
++	0x00, 0x02, 0x48, 0x08, 0xf4, 0x7f, 0x8a, 0x11, 
++	0xfc, 0x00, 0xee, 0xff, 0xf0, 0x74, 0x07, 0xfd, 
++	0xf0, 0x74, 0x07, 0x44, 0xf0, 0x74, 0x0d, 0xb4, 
++	0xf0, 0x74, 0x02, 0x05, 0xf0, 0x74, 0x04, 0x60, 
++	0xf0, 0x73, 0x0d, 0xaa, 0xee, 0xfd, 0x10, 0xf8, 
++	0x2a, 0xa3, 0xf8, 0x44, 0x0d, 0xcb, 0x10, 0xf8, 
++	0x2a, 0xa4, 0xf8, 0x45, 0x0d, 0xd7, 0x76, 0x00, 
++	0x02, 0x00, 0xf2, 0x74, 0x09, 0xe8, 0xf0, 0x20, 
++	0x22, 0x00, 0x76, 0xf8, 0x2a, 0xa4, 0x00, 0x00, 
++	0x76, 0xf8, 0x2a, 0xa7, 0x00, 0x00, 0xf0, 0x73, 
++	0x0d, 0xd7, 0x76, 0x00, 0x02, 0x00, 0xf2, 0x74, 
++	0x09, 0xe8, 0xf0, 0x20, 0x20, 0x00, 0x76, 0xf8, 
++	0x2a, 0xa3, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa7, 
++	0x00, 0x01, 0xf0, 0x74, 0x0c, 0x5e, 0xf0, 0xe0, 
++	0xf0, 0x10, 0x3a, 0x98, 0xf8, 0x47, 0x0d, 0xe1, 
++	0x76, 0xf8, 0x27, 0x6e, 0x00, 0x00, 0xee, 0x03, 
++	0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 0x77, 0x11, 
++	0x20, 0x00, 0x76, 0x00, 0xaa, 0xaa, 0x76, 0x01, 
++	0x02, 0x00, 0xf2, 0x74, 0x06, 0x6c, 0xf4, 0x95, 
++	0x48, 0x11, 0x76, 0x00, 0x55, 0x55, 0x76, 0x01, 
++	0x02, 0x00, 0x48, 0x11, 0xf2, 0x74, 0x06, 0x6c, 
++	0xf0, 0x00, 0x02, 0x00, 0x76, 0xf8, 0x2a, 0xa3, 
++	0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa4, 0x00, 0x00, 
++	0xe8, 0x00, 0x4e, 0x00, 0xfb, 0x80, 0x15, 0x3e, 
++	0xf4, 0x95, 0xe8, 0x04, 0x80, 0xf8, 0x2a, 0xa5, 
++	0x76, 0x00, 0x2a, 0xa8, 0xf9, 0x80, 0x14, 0x87, 
++	0x76, 0x00, 0x2a, 0xad, 0xfb, 0x80, 0x13, 0x62, 
++	0xf4, 0x95, 0xe8, 0x02, 0x10, 0xf8, 0x2a, 0xa5, 
++	0xf9, 0x80, 0x14, 0x63, 0xfb, 0x80, 0x16, 0x66, 
++	0xf4, 0x95, 0xe8, 0x1c, 0xfb, 0x80, 0x16, 0x87, 
++	0xf4, 0x95, 0xe8, 0x1c, 0xe8, 0x01, 0x4e, 0x00, 
++	0xfb, 0x80, 0x17, 0xd6, 0xf4, 0x95, 0xe8, 0x00, 
++	0x80, 0xf8, 0x2a, 0xa6, 0x76, 0x00, 0x2a, 0xb7, 
++	0xf9, 0x80, 0x16, 0xaa, 0x10, 0xf8, 0x2a, 0xa6, 
++	0xf9, 0x80, 0x17, 0x5c, 0x10, 0xf8, 0x2a, 0xa6, 
++	0xf9, 0x80, 0x17, 0x6f, 0xee, 0x02, 0x8a, 0x11, 
++	0xfc, 0x00, 0xf4, 0x95, 0x4a, 0x08, 0x4a, 0x09, 
++	0x4a, 0x0a, 0x4a, 0x07, 0x4a, 0x1d, 0x68, 0xf8, 
++	0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07, 
++	0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc, 
++	0x10, 0xf8, 0x2a, 0xa7, 0xf8, 0x44, 0x0e, 0x4b, 
++	0x76, 0xf8, 0x2a, 0xa3, 0x00, 0x01, 0xf0, 0x73, 
++	0x0e, 0x4e, 0x76, 0xf8, 0x2a, 0xa4, 0x00, 0x01, 
++	0x8a, 0x1d, 0x8a, 0x07, 0x8a, 0x0a, 0x8a, 0x09, 
++	0x8a, 0x08, 0xf4, 0xeb, 0x4a, 0x11, 0x4a, 0x16, 
++	0x4a, 0x17, 0xee, 0xfe, 0x88, 0x0e, 0x71, 0x08, 
++	0x00, 0x16, 0x71, 0x06, 0x00, 0x17, 0x11, 0x07, 
++	0xf0, 0x66, 0x00, 0x0d, 0xf0, 0x00, 0x25, 0xa0, 
++	0x88, 0x11, 0x76, 0x01, 0x00, 0x06, 0x81, 0x00, 
++	0xf2, 0x74, 0x06, 0xce, 0xf0, 0x00, 0x00, 0x01, 
++	0x76, 0x01, 0x00, 0x06, 0x70, 0x00, 0x00, 0x16, 
++	0x48, 0x11, 0xf2, 0x74, 0x06, 0xce, 0xf0, 0x00, 
++	0x00, 0x07, 0x70, 0x81, 0x00, 0x17, 0xee, 0x02, 
++	0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00, 
++	0x4a, 0x11, 0x88, 0x0e, 0x71, 0x02, 0x00, 0x12, 
++	0x11, 0x03, 0xf0, 0x66, 0x00, 0x0d, 0xf0, 0x00, 
++	0x24, 0x00, 0x88, 0x11, 0xf4, 0x95, 0x70, 0x81, 
++	0x00, 0x12, 0x6e, 0xe2, 0xff, 0xfe, 0x0e, 0x8d, 
++	0xf4, 0x95, 0xe8, 0x00, 0xe8, 0x01, 0x80, 0xe1, 
++	0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 0x00, 0xff, 
++	0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x76, 0xe1, 
++	0x00, 0x0b, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x0c, 
++	0x00, 0x00, 0x81, 0xe1, 0x00, 0x01, 0x8a, 0x11, 
++	0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfc, 0x88, 0x0e, 
++	0xf4, 0x95, 0xf1, 0x66, 0x00, 0x0d, 0xf3, 0x00, 
++	0x24, 0x00, 0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 
++	0x76, 0xe1, 0x00, 0x0c, 0x00, 0x00, 0x76, 0xe1, 
++	0x00, 0x0b, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02, 
++	0x00, 0x01, 0x76, 0x00, 0x00, 0x00, 0x76, 0x01, 
++	0x00, 0x00, 0x80, 0x02, 0x76, 0x03, 0x00, 0x00, 
++	0xf2, 0x74, 0x0c, 0xb9, 0xf4, 0x95, 0xe8, 0x00, 
++	0xee, 0x04, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
++	0x88, 0x19, 0xf4, 0x95, 0x73, 0x19, 0x00, 0x0e, 
++	0xf1, 0x66, 0x00, 0x0d, 0xf2, 0x00, 0x24, 0x00, 
++	0x77, 0x15, 0x25, 0xa0, 0x77, 0x14, 0x00, 0x00, 
++	0x77, 0x1a, 0x00, 0x1f, 0xf0, 0x72, 0x0f, 0x14, 
++	0xf6, 0xb8, 0x49, 0x19, 0x09, 0x85, 0xf8, 0x4c, 
++	0x0f, 0x13, 0xf1, 0x00, 0x00, 0x05, 0x89, 0x11, 
++	0x49, 0x15, 0xf3, 0x00, 0x00, 0x01, 0x89, 0x13, 
++	0x49, 0x15, 0xf3, 0x00, 0x00, 0x07, 0x89, 0x12, 
++	0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10, 
++	0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13, 
++	0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10, 
++	0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13, 
++	0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10, 
++	0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13, 
++	0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10, 
++	0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13, 
++	0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10, 
++	0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13, 
++	0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x11, 
++	0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81, 0x0f, 0x13, 
++	0x6d, 0x94, 0x6d, 0xed, 0x00, 0x0d, 0x48, 0x14, 
++	0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 
++	0x4a, 0x17, 0xee, 0xf8, 0x88, 0x17, 0x10, 0x0d, 
++	0x80, 0x04, 0x10, 0x0c, 0x80, 0x05, 0x71, 0x0e, 
++	0x00, 0x16, 0x73, 0x17, 0x00, 0x0e, 0xf0, 0x66, 
++	0x00, 0x0d, 0xf0, 0x00, 0x24, 0x00, 0x88, 0x11, 
++	0x10, 0xf8, 0x27, 0x63, 0xf8, 0x45, 0x0f, 0x32, 
++	0xf2, 0x74, 0x0e, 0x9f, 0xf4, 0x95, 0x48, 0x17, 
++	0x10, 0xf8, 0x27, 0x60, 0xf8, 0x44, 0x0f, 0x3d, 
++	0x60, 0xe1, 0x00, 0x02, 0x00, 0x01, 0xf8, 0x20, 
++	0x0f, 0x6d, 0xf0, 0x73, 0x11, 0x33, 0x10, 0x04, 
++	0x80, 0x00, 0x10, 0x05, 0xf0, 0x74, 0x06, 0x9f, 
++	0x11, 0x04, 0xf3, 0x00, 0x00, 0x01, 0x81, 0x04, 
++	0x6d, 0x8e, 0x77, 0x10, 0x00, 0x01, 0x71, 0xe1, 
++	0x00, 0x02, 0x00, 0x12, 0xf4, 0xaa, 0xf8, 0x30, 
++	0x0f, 0x62, 0x77, 0x10, 0x00, 0x02, 0xf4, 0xaa, 
++	0xf8, 0x30, 0x0f, 0x6d, 0x45, 0xe1, 0x00, 0x0b, 
++	0x88, 0x10, 0x43, 0xe1, 0x00, 0x0c, 0x83, 0xf8, 
++	0x00, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xaa, 
++	0xf8, 0x30, 0x0f, 0x6d, 0xf0, 0x73, 0x0f, 0x96, 
++	0xf5, 0x00, 0x81, 0x04, 0x49, 0x16, 0xf5, 0x20, 
++	0x89, 0x16, 0x76, 0xe1, 0x00, 0x0c, 0x00, 0x00, 
++	0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x48, 0x16, 
++	0xf8, 0x45, 0x11, 0x33, 0xf7, 0xb8, 0x71, 0xe1, 
++	0x00, 0x02, 0x00, 0x12, 0x10, 0xf8, 0x00, 0x12, 
++	0xf0, 0x10, 0x00, 0x03, 0xf8, 0x46, 0x0f, 0x8c, 
++	0x10, 0xf8, 0x00, 0x12, 0xf0, 0x10, 0x00, 0x03, 
++	0xf8, 0x45, 0x10, 0x16, 0x77, 0x10, 0x00, 0x01, 
++	0xf4, 0xaa, 0xf8, 0x30, 0x0f, 0x9c, 0x77, 0x10, 
++	0x00, 0x02, 0xf4, 0xaa, 0xf8, 0x30, 0x0f, 0xa8, 
++	0xf0, 0x73, 0x0f, 0x96, 0x77, 0x10, 0x00, 0x04, 
++	0xf4, 0xaa, 0xf8, 0x30, 0x10, 0xb7, 0x77, 0x10, 
++	0x00, 0x05, 0xf4, 0xaa, 0xf8, 0x30, 0x10, 0xbc, 
++	0xf2, 0x74, 0x0e, 0x9f, 0xf4, 0x95, 0x48, 0x17, 
++	0xf0, 0x73, 0x11, 0x31, 0x76, 0xe1, 0x00, 0x0c, 
++	0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 0x00, 0x00, 
++	0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x76, 0xe1, 
++	0x00, 0x02, 0x00, 0x02, 0x11, 0xe1, 0x00, 0x0c, 
++	0xe8, 0x03, 0xf6, 0x20, 0x89, 0x12, 0xf4, 0x95, 
++	0x77, 0x10, 0x00, 0x03, 0xf5, 0xaa, 0xf8, 0x30, 
++	0x0f, 0xb6, 0x6b, 0xf8, 0x27, 0x6f, 0x00, 0x01, 
++	0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95, 0xf5, 0xae, 
++	0xf8, 0x20, 0x0f, 0xbd, 0x48, 0x16, 0x80, 0x06, 
++	0x88, 0x13, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x03, 
++	0xf6, 0xab, 0xf8, 0x20, 0x0f, 0xc8, 0x6b, 0xf8, 
++	0x27, 0x6f, 0x00, 0x01, 0x12, 0x06, 0xf8, 0x45, 
++	0x10, 0x00, 0x10, 0xe1, 0x00, 0x04, 0x80, 0x00, 
++	0x10, 0x05, 0x80, 0x01, 0x10, 0x04, 0x80, 0x02, 
++	0x10, 0x06, 0x80, 0x03, 0x48, 0x11, 0xf2, 0x74, 
++	0x07, 0x1e, 0xf0, 0x00, 0x00, 0x05, 0x10, 0x06, 
++	0x00, 0xe1, 0x00, 0x04, 0x80, 0xe1, 0x00, 0x04, 
++	0x10, 0x06, 0x00, 0xe1, 0x00, 0x0c, 0x80, 0xe1, 
++	0x00, 0x0c, 0x88, 0x12, 0x11, 0x06, 0x10, 0x04, 
++	0xf6, 0x00, 0x80, 0x04, 0x48, 0x16, 0xf6, 0x20, 
++	0x88, 0x16, 0x89, 0x13, 0xf4, 0x95, 0x77, 0x10, 
++	0x00, 0x03, 0xf6, 0xab, 0xf8, 0x20, 0x0f, 0xf5, 
++	0x6b, 0xf8, 0x27, 0x6f, 0x00, 0x01, 0x77, 0x10, 
++	0x00, 0x0c, 0x71, 0xe1, 0x00, 0x04, 0x00, 0x13, 
++	0xf6, 0xab, 0xf8, 0x20, 0x10, 0x00, 0x6b, 0xf8, 
++	0x27, 0x6f, 0x00, 0x01, 0x6c, 0xe2, 0xff, 0xfd, 
++	0x11, 0x31, 0xf6, 0xb8, 0x6f, 0xe1, 0x00, 0x05, 
++	0x0c, 0x48, 0x6f, 0xe1, 0x00, 0x06, 0x0c, 0x18, 
++	0xf0, 0x30, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x03, 
++	0x80, 0xe1, 0x00, 0x0b, 0x76, 0xe1, 0x00, 0x02, 
++	0x00, 0x03, 0x48, 0x16, 0xf8, 0x45, 0x11, 0x33, 
++	0x71, 0xe1, 0x00, 0x0c, 0x00, 0x12, 0x10, 0xe1, 
++	0x00, 0x0b, 0x49, 0x12, 0xf6, 0x20, 0x88, 0x13, 
++	0xe8, 0x0c, 0xf6, 0x20, 0x88, 0x10, 0xf4, 0x95, 
++	0xf4, 0x95, 0xf5, 0xab, 0xf8, 0x20, 0x10, 0x27, 
++	0x48, 0x13, 0x80, 0x06, 0x88, 0x10, 0xf4, 0x95, 
++	0xf4, 0x95, 0xf5, 0xae, 0xf8, 0x20, 0x10, 0x30, 
++	0x70, 0x06, 0x00, 0x16, 0x12, 0x06, 0xf8, 0x45, 
++	0x10, 0x5f, 0x10, 0xe1, 0x00, 0x04, 0x80, 0x00, 
++	0x10, 0x05, 0x80, 0x01, 0x10, 0x04, 0x80, 0x02, 
++	0x10, 0x06, 0x80, 0x03, 0x48, 0x11, 0xf2, 0x74, 
++	0x07, 0x1e, 0xf0, 0x00, 0x00, 0x05, 0x10, 0x06, 
++	0x00, 0xe1, 0x00, 0x04, 0x80, 0xe1, 0x00, 0x04, 
++	0x10, 0x06, 0x00, 0xe1, 0x00, 0x0c, 0x80, 0xe1, 
++	0x00, 0x0c, 0x88, 0x12, 0x11, 0x06, 0x10, 0x04, 
++	0xf6, 0x00, 0x80, 0x04, 0x48, 0x16, 0xf6, 0x20, 
++	0x88, 0x16, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x0c, 
++	0x71, 0xe1, 0x00, 0x04, 0x00, 0x13, 0xf6, 0xab, 
++	0xf8, 0x20, 0x10, 0x5f, 0x6b, 0xf8, 0x27, 0x6f, 
++	0x00, 0x01, 0x77, 0x10, 0x00, 0x0c, 0xf6, 0xaa, 
++	0xf8, 0x20, 0x10, 0x6b, 0xf2, 0x74, 0x0e, 0x9f, 
++	0xf4, 0x95, 0x48, 0x17, 0x71, 0xe1, 0x00, 0x0c, 
++	0x00, 0x12, 0x77, 0x10, 0x00, 0x0c, 0xf4, 0xaa, 
++	0xf8, 0x30, 0x10, 0x7c, 0x77, 0x10, 0x00, 0x0c, 
++	0x71, 0xe1, 0x00, 0x0b, 0x00, 0x13, 0xf6, 0xab, 
++	0xf8, 0x30, 0x10, 0xb4, 0xe7, 0x30, 0xf7, 0xaa, 
++	0xf8, 0x30, 0x10, 0xb4, 0xf2, 0x74, 0x0e, 0xc1, 
++	0xf4, 0x95, 0x48, 0x17, 0x88, 0x12, 0xf4, 0x95, 
++	0xf4, 0x95, 0x6c, 0x82, 0x10, 0x8d, 0x76, 0xe1, 
++	0x00, 0x04, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02, 
++	0x00, 0x05, 0xf0, 0x73, 0x10, 0xb4, 0x76, 0xe1, 
++	0x00, 0x02, 0x00, 0x04, 0x77, 0x10, 0x00, 0x0c, 
++	0x71, 0xe1, 0x00, 0x0b, 0x00, 0x12, 0xf5, 0xaa, 
++	0xf8, 0x20, 0x10, 0x9a, 0xf0, 0x73, 0x10, 0x9c, 
++	0x77, 0x12, 0x00, 0x0c, 0x76, 0x00, 0x00, 0x00, 
++	0x70, 0x01, 0x00, 0x12, 0x70, 0x02, 0x00, 0x17, 
++	0x76, 0x03, 0x00, 0x01, 0x48, 0x11, 0xf2, 0x74, 
++	0x0c, 0xb9, 0xf0, 0x00, 0x00, 0x05, 0x76, 0xe1, 
++	0x00, 0x04, 0x00, 0x00, 0x77, 0x10, 0x00, 0x0c, 
++	0x71, 0xe1, 0x00, 0x0b, 0x00, 0x12, 0xf6, 0xaa, 
++	0xf8, 0x20, 0x11, 0x1c, 0x48, 0x16, 0xf8, 0x45, 
++	0x11, 0x33, 0x60, 0xe1, 0x00, 0x02, 0x00, 0x05, 
++	0xf8, 0x20, 0x10, 0xdf, 0x10, 0xe1, 0x00, 0x0b, 
++	0x08, 0xe1, 0x00, 0x0c, 0x11, 0xe1, 0x00, 0x04, 
++	0xf8, 0x4d, 0x10, 0xc7, 0x6b, 0xf8, 0x27, 0x6f, 
++	0x00, 0x01, 0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95, 
++	0xf5, 0xae, 0xf8, 0x20, 0x10, 0xcf, 0x48, 0x16, 
++	0xf4, 0x95, 0x48, 0x08, 0xf8, 0x45, 0x11, 0x16, 
++	0x6f, 0xe1, 0x00, 0x0c, 0x0d, 0x00, 0x81, 0xe1, 
++	0x00, 0x0c, 0x11, 0x04, 0xf5, 0x00, 0x81, 0x04, 
++	0x49, 0x16, 0xf5, 0x20, 0x89, 0x16, 0xf0, 0x73, 
++	0x11, 0x0e, 0x10, 0xe1, 0x00, 0x0b, 0x71, 0xe1, 
++	0x00, 0x0c, 0x00, 0x12, 0x88, 0x10, 0xf4, 0x95, 
++	0xf4, 0x95, 0xf6, 0xaa, 0xf8, 0x30, 0x11, 0x16, 
++	0x49, 0x12, 0xf6, 0x20, 0x88, 0x10, 0xf4, 0x95, 
++	0xf4, 0x95, 0xf5, 0xae, 0xf8, 0x20, 0x10, 0xf3, 
++	0x48, 0x16, 0x80, 0x06, 0x48, 0x08, 0xf8, 0x45, 
++	0x11, 0x16, 0x10, 0x04, 0x70, 0x02, 0x00, 0x17, 
++	0x80, 0x00, 0x76, 0x03, 0x00, 0x00, 0x10, 0x06, 
++	0x80, 0x01, 0x10, 0x05, 0xf0, 0x74, 0x0c, 0xb9, 
++	0x10, 0x06, 0x00, 0xe1, 0x00, 0x0c, 0x80, 0xe1, 
++	0x00, 0x0c, 0x11, 0x06, 0x10, 0x04, 0xf6, 0x00, 
++	0x80, 0x04, 0x48, 0x16, 0xf6, 0x20, 0x88, 0x16, 
++	0x10, 0xe1, 0x00, 0x0c, 0x08, 0xe1, 0x00, 0x0b, 
++	0xf8, 0x45, 0x11, 0x1c, 0xf0, 0x73, 0x11, 0x31, 
++	0xf2, 0x74, 0x0e, 0x9f, 0xf4, 0x95, 0x48, 0x17, 
++	0xf0, 0x73, 0x11, 0x33, 0x76, 0xe1, 0x00, 0x0c, 
++	0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 0x00, 0x00, 
++	0x76, 0xe1, 0x00, 0x02, 0x00, 0x01, 0x10, 0x04, 
++	0x80, 0x00, 0x10, 0x05, 0xf0, 0x74, 0x06, 0x9f, 
++	0x88, 0x12, 0xf4, 0x95, 0x77, 0x10, 0x00, 0xff, 
++	0xf4, 0xaa, 0xf8, 0x30, 0x11, 0x33, 0x6c, 0x86, 
++	0x0f, 0x70, 0xee, 0x08, 0x8a, 0x17, 0x8a, 0x16, 
++	0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfc, 
++	0xf4, 0x95, 0x71, 0x06, 0x00, 0x12, 0x88, 0x11, 
++	0x73, 0x12, 0x00, 0x0e, 0xf1, 0x66, 0x00, 0x0d, 
++	0xf3, 0x00, 0x24, 0x00, 0x89, 0x14, 0x13, 0x81, 
++	0xf7, 0x7a, 0xf3, 0x30, 0x00, 0x01, 0x81, 0xf8, 
++	0x27, 0x60, 0x13, 0xe1, 0x00, 0x01, 0xf7, 0x7c, 
++	0xf3, 0x30, 0x00, 0x03, 0x81, 0xf8, 0x27, 0x61, 
++	0xe9, 0x0f, 0x19, 0xe1, 0x00, 0x01, 0x81, 0xf8, 
++	0x27, 0x62, 0x71, 0xe4, 0x00, 0x03, 0x00, 0x13, 
++	0xf6, 0xb8, 0x49, 0x13, 0xf3, 0x00, 0x00, 0x01, 
++	0xf3, 0x30, 0x00, 0x0f, 0x49, 0x0b, 0x09, 0xf8, 
++	0x27, 0x62, 0xf8, 0x4d, 0x11, 0x75, 0x77, 0x10, 
++	0x00, 0xff, 0xf4, 0xab, 0xf8, 0x30, 0x11, 0x75, 
++	0x57, 0xf8, 0x27, 0x6c, 0xf3, 0x00, 0x00, 0x01, 
++	0x4f, 0xf8, 0x27, 0x6c, 0x76, 0xf8, 0x27, 0x63, 
++	0x00, 0x01, 0xf0, 0x73, 0x11, 0x78, 0x76, 0xf8, 
++	0x27, 0x63, 0x00, 0x00, 0x70, 0xe4, 0x00, 0x03, 
++	0x27, 0x62, 0x76, 0xf8, 0x27, 0x64, 0x00, 0x00, 
++	0x11, 0xf8, 0x27, 0x61, 0x61, 0xf8, 0x00, 0x0b, 
++	0x00, 0x02, 0xf8, 0x20, 0x11, 0x8d, 0xe9, 0x01, 
++	0x6f, 0xe1, 0x00, 0x02, 0x0f, 0x18, 0x81, 0xf8, 
++	0x27, 0x64, 0x11, 0xf8, 0x27, 0x61, 0x61, 0xf8, 
++	0x00, 0x0b, 0x00, 0x01, 0xf8, 0x20, 0x11, 0xa9, 
++	0x10, 0xf8, 0x27, 0x64, 0xf1, 0x00, 0x00, 0x04, 
++	0x89, 0x13, 0xe9, 0xb8, 0xf5, 0x20, 0x81, 0xf8, 
++	0x27, 0x65, 0x60, 0x84, 0x00, 0x02, 0xf8, 0x20, 
++	0x11, 0xa9, 0x70, 0x00, 0x00, 0x11, 0x70, 0x01, 
++	0x00, 0x13, 0x70, 0x02, 0x27, 0x65, 0xf2, 0x74, 
++	0x0f, 0x18, 0xf4, 0x95, 0x48, 0x12, 0xee, 0x04, 
++	0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 
++	0x4a, 0x17, 0xee, 0xfc, 0xe8, 0x00, 0x4e, 0xf8, 
++	0x27, 0x66, 0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x68, 
++	0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x6c, 0xe8, 0x00, 
++	0x4e, 0xf8, 0x27, 0x6a, 0x77, 0x12, 0x27, 0x40, 
++	0x77, 0x11, 0x24, 0x00, 0x77, 0x1a, 0x00, 0x1f, 
++	0xf0, 0x72, 0x11, 0xdb, 0x70, 0x92, 0x00, 0x11, 
++	0x76, 0xe1, 0x00, 0x01, 0xff, 0xff, 0x76, 0x81, 
++	0x00, 0x00, 0x76, 0xe1, 0x00, 0x02, 0x00, 0x00, 
++	0x76, 0xe1, 0x00, 0x03, 0x00, 0xff, 0x76, 0xe1, 
++	0x00, 0x0c, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 
++	0x00, 0x00, 0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 
++	0x6d, 0xe9, 0x00, 0x0d, 0xf0, 0x20, 0x25, 0xa0, 
++	0xf1, 0x00, 0x00, 0x07, 0x89, 0x11, 0xf1, 0x00, 
++	0x00, 0x01, 0x81, 0x02, 0x88, 0x16, 0xf4, 0x95, 
++	0x77, 0x17, 0x00, 0x20, 0x76, 0x86, 0x00, 0xff, 
++	0x76, 0x00, 0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 
++	0x10, 0x02, 0xf0, 0x74, 0x06, 0x6c, 0x76, 0x00, 
++	0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 0xf2, 0x74, 
++	0x06, 0x6c, 0xf4, 0x95, 0x48, 0x11, 0x10, 0x02, 
++	0xf0, 0x00, 0x00, 0x0d, 0x80, 0x02, 0x6d, 0xe9, 
++	0x00, 0x0d, 0x6d, 0xee, 0x00, 0x0d, 0x6c, 0xef, 
++	0xff, 0xff, 0x11, 0xe8, 0xf0, 0x74, 0x0c, 0x9d, 
++	0xee, 0x04, 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 
++	0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 
++	0xee, 0xfa, 0x88, 0x11, 0x10, 0x0a, 0x49, 0x11, 
++	0xf8, 0x4d, 0x12, 0x9f, 0x48, 0x08, 0xf8, 0x45, 
++	0x12, 0x9f, 0x80, 0x04, 0x12, 0x81, 0xf5, 0x78, 
++	0x89, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0xe2, 
++	0xff, 0xb9, 0x12, 0x8a, 0x61, 0xf8, 0x00, 0x08, 
++	0x00, 0x80, 0xf8, 0x30, 0x12, 0x8a, 0x13, 0xe1, 
++	0x00, 0x01, 0xf0, 0xe8, 0xf7, 0x78, 0xf1, 0xa0, 
++	0xf2, 0x30, 0x1f, 0xff, 0x88, 0x17, 0xf4, 0x95, 
++	0x77, 0x12, 0x24, 0x00, 0x77, 0x16, 0x00, 0x00, 
++	0x77, 0x13, 0x00, 0x20, 0xf6, 0xb8, 0x48, 0x17, 
++	0x08, 0xe2, 0x00, 0x01, 0xf8, 0x45, 0x12, 0x42, 
++	0x6d, 0xea, 0x00, 0x0d, 0x6d, 0x96, 0x6c, 0xeb, 
++	0xff, 0xff, 0x12, 0x34, 0xf0, 0x73, 0x12, 0x90, 
++	0x56, 0xf8, 0x27, 0x6a, 0xf0, 0x00, 0x00, 0x01, 
++	0x4e, 0xf8, 0x27, 0x6a, 0x60, 0x82, 0x00, 0x01, 
++	0xf8, 0x30, 0x12, 0x54, 0x70, 0x00, 0x00, 0x16, 
++	0xf2, 0x74, 0x11, 0x38, 0xf4, 0x95, 0x48, 0x11, 
++	0xf0, 0x73, 0x12, 0x90, 0x70, 0x00, 0x00, 0x16, 
++	0xf2, 0x74, 0x11, 0x38, 0xf4, 0x95, 0x48, 0x11, 
++	0x72, 0x10, 0x2a, 0x9e, 0xf4, 0x95, 0xf4, 0xaf, 
++	0xf8, 0x30, 0x12, 0x6e, 0x76, 0x00, 0x00, 0x00, 
++	0x76, 0x01, 0x00, 0xbc, 0x70, 0x02, 0x00, 0x16, 
++	0x76, 0x03, 0x00, 0x00, 0xf2, 0x74, 0x0c, 0xb9, 
++	0xf4, 0x95, 0x48, 0x11, 0xf0, 0x73, 0x12, 0x90, 
++	0x10, 0xf8, 0x27, 0x6e, 0xf8, 0x44, 0x12, 0x90, 
++	0x76, 0x00, 0x00, 0x00, 0x76, 0x01, 0x00, 0xbc, 
++	0x70, 0x02, 0x00, 0x16, 0x76, 0x03, 0x00, 0x00, 
++	0xf2, 0x74, 0x0c, 0xb9, 0xf4, 0x95, 0x48, 0x11, 
++	0xf0, 0x74, 0x0c, 0x5e, 0xf0, 0xe0, 0xf0, 0x10, 
++	0x13, 0x88, 0xf8, 0x42, 0x12, 0x90, 0x76, 0xf8, 
++	0x27, 0x6e, 0x00, 0x01, 0xf0, 0x73, 0x12, 0x90, 
++	0x56, 0xf8, 0x27, 0x66, 0xf0, 0x00, 0x00, 0x01, 
++	0x4e, 0xf8, 0x27, 0x66, 0x6d, 0xe9, 0x00, 0x5e, 
++	0x56, 0xf8, 0x27, 0x68, 0xf0, 0x00, 0x00, 0x01, 
++	0x4e, 0xf8, 0x27, 0x68, 0x71, 0x04, 0x00, 0x12, 
++	0x6e, 0xea, 0xff, 0xff, 0x12, 0x18, 0x70, 0x04, 
++	0x00, 0x12, 0xee, 0x06, 0x8a, 0x17, 0x8a, 0x16, 
++	0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 
++	0x88, 0x0e, 0xf4, 0x95, 0xf0, 0x66, 0x00, 0x0d, 
++	0xf0, 0x00, 0x25, 0xa0, 0x88, 0x11, 0xf4, 0x95, 
++	0xf4, 0x95, 0x76, 0x81, 0x00, 0xff, 0x76, 0x00, 
++	0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 0xf2, 0x74, 
++	0x06, 0x6c, 0xf0, 0x00, 0x00, 0x01, 0x76, 0x00, 
++	0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 0x48, 0x11, 
++	0xf2, 0x74, 0x06, 0x6c, 0xf0, 0x00, 0x00, 0x07, 
++	0xee, 0x02, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
++	0x88, 0x0e, 0xf4, 0x95, 0xf0, 0x66, 0x00, 0x0d, 
++	0xf0, 0x00, 0x24, 0x00, 0x88, 0x11, 0xf4, 0x95, 
++	0xf4, 0x95, 0x76, 0xe1, 0x00, 0x01, 0xff, 0xff, 
++	0x76, 0x81, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02, 
++	0x00, 0x00, 0x76, 0xe1, 0x00, 0x03, 0x00, 0xff, 
++	0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 
++	0x13, 0x03, 0x88, 0x11, 0xfa, 0x4d, 0x12, 0xec, 
++	0x71, 0x02, 0x00, 0x12, 0xf3, 0x10, 0x00, 0x01, 
++	0x89, 0x1a, 0xf4, 0x95, 0xf0, 0x72, 0x12, 0xeb, 
++	0x70, 0x91, 0x00, 0x12, 0x8a, 0x11, 0xfc, 0x00, 
++	0xf4, 0x95, 0x4a, 0x0b, 0x4a, 0x0c, 0x4a, 0x0d, 
++	0xf7, 0xb8, 0xee, 0xfe, 0x10, 0xf8, 0x00, 0x08, 
++	0x11, 0x06, 0xf1, 0xc0, 0x83, 0x00, 0xf4, 0x85, 
++	0x11, 0x06, 0xf7, 0x85, 0x81, 0x06, 0xf6, 0xb8, 
++	0xec, 0x0f, 0x1e, 0x06, 0x61, 0x00, 0x80, 0x00, 
++	0xf8, 0x20, 0x13, 0x05, 0xf4, 0x84, 0xee, 0x02, 
++	0x8a, 0x0d, 0x8a, 0x0c, 0x8a, 0x0b, 0xfc, 0x00, 
++	0xf4, 0x95, 0x4a, 0x0b, 0x4a, 0x0c, 0x4a, 0x0d, 
++	0xee, 0xfe, 0xf7, 0xb8, 0x80, 0x00, 0x10, 0xf8, 
++	0x00, 0x08, 0xf4, 0x85, 0x11, 0x06, 0xf7, 0x85, 
++	0x81, 0x06, 0xf6, 0xb8, 0xec, 0x0f, 0x1e, 0x06, 
++	0xf0, 0xf0, 0x61, 0x00, 0x80, 0x00, 0xf8, 0x20, 
++	0x13, 0x20, 0xf4, 0x84, 0xee, 0x02, 0x8a, 0x0d, 
++	0x8a, 0x0c, 0x8a, 0x0b, 0xfc, 0x00, 0x4a, 0x11, 
++	0x77, 0x11, 0x00, 0x7b, 0x76, 0x81, 0x2e, 0xec, 
++	0x77, 0x11, 0x00, 0x7b, 0xee, 0xff, 0x71, 0x81, 
++	0x00, 0x11, 0xee, 0x01, 0x76, 0xe1, 0x00, 0x01, 
++	0x00, 0x00, 0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 
++	0x76, 0xe1, 0x00, 0x06, 0x00, 0x00, 0x76, 0xe1, 
++	0x00, 0x62, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x76, 
++	0x00, 0x00, 0x76, 0xe1, 0x00, 0x92, 0x00, 0x00, 
++	0x76, 0xe1, 0x00, 0x94, 0x00, 0x00, 0x76, 0xe1, 
++	0x00, 0xb0, 0x00, 0x00, 0x76, 0xe1, 0x00, 0xb3, 
++	0x00, 0x00, 0x76, 0xe1, 0x00, 0xbe, 0x00, 0x00, 
++	0x76, 0xe1, 0x00, 0xbf, 0x00, 0x00, 0x76, 0xe1, 
++	0x00, 0xc1, 0x00, 0x00, 0x76, 0xe1, 0x00, 0xc3, 
++	0x00, 0x00, 0x76, 0xe1, 0x00, 0xc5, 0x00, 0x00, 
++	0x76, 0xe1, 0x00, 0xc7, 0x00, 0x00, 0x76, 0x81, 
++	0x00, 0x00, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4, 
++	0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 0xee, 0xff, 
++	0xf4, 0x95, 0x71, 0x06, 0x00, 0x16, 0xfb, 0x80, 
++	0x16, 0xa2, 0x88, 0x17, 0xf4, 0x95, 0xf7, 0xb8, 
++	0x10, 0xf8, 0x00, 0x17, 0xf0, 0x10, 0x00, 0x02, 
++	0xfa, 0x46, 0x13, 0x88, 0x77, 0x11, 0x00, 0x00, 
++	0x10, 0xf8, 0x00, 0x17, 0xf0, 0x10, 0x00, 0x02, 
++	0xf8, 0x45, 0x13, 0xf9, 0x10, 0xf8, 0x00, 0x17, 
++	0xf8, 0x45, 0x14, 0x39, 0x10, 0xf8, 0x00, 0x17, 
++	0xf0, 0x10, 0x00, 0x01, 0xf8, 0x45, 0x14, 0x1f, 
++	0xf0, 0x73, 0x14, 0x52, 0x10, 0xf8, 0x00, 0x17, 
++	0xf0, 0x10, 0x00, 0x03, 0xf8, 0x45, 0x13, 0xd3, 
++	0x10, 0xf8, 0x00, 0x17, 0xf0, 0x10, 0x00, 0x06, 
++	0xf8, 0x44, 0x14, 0x52, 0x77, 0x12, 0x00, 0x7b, 
++	0x71, 0x82, 0x00, 0x14, 0x61, 0xe4, 0x00, 0x07, 
++	0x00, 0x40, 0xf8, 0x30, 0x14, 0x52, 0x49, 0x14, 
++	0x48, 0x17, 0xf6, 0x00, 0x88, 0x12, 0xf4, 0x95, 
++	0x77, 0x13, 0x00, 0x55, 0x77, 0x11, 0x00, 0x57, 
++	0x6d, 0xea, 0x00, 0x3b, 0xe5, 0x01, 0x10, 0xe6, 
++	0x00, 0x06, 0x80, 0x81, 0x48, 0x14, 0x00, 0xf8, 
++	0x00, 0x17, 0x88, 0x12, 0xf4, 0x95, 0x77, 0x11, 
++	0x00, 0x55, 0x10, 0xe2, 0x00, 0x40, 0x80, 0x81, 
++	0x77, 0x11, 0x00, 0x57, 0x10, 0xe6, 0x00, 0x07, 
++	0x80, 0x81, 0x77, 0x11, 0x00, 0x55, 0x10, 0xe2, 
++	0x00, 0x45, 0x80, 0x81, 0x10, 0xe6, 0x00, 0x08, 
++	0x77, 0x11, 0x00, 0x57, 0x80, 0x81, 0x77, 0x11, 
++	0x00, 0x55, 0x10, 0xe2, 0x00, 0x4a, 0x80, 0x81, 
++	0x77, 0x11, 0x00, 0x57, 0x10, 0xe6, 0x00, 0x09, 
++	0x80, 0x81, 0xf2, 0x73, 0x14, 0x52, 0x77, 0x11, 
++	0x03, 0xc0, 0x77, 0x12, 0x00, 0x7b, 0x10, 0x82, 
++	0xf0, 0x00, 0x00, 0x07, 0x88, 0x13, 0xf4, 0x95, 
++	0xf4, 0x95, 0x96, 0x1b, 0xf8, 0x30, 0x14, 0x52, 
++	0x10, 0xe3, 0x00, 0x35, 0x77, 0x12, 0x00, 0x55, 
++	0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0x10, 0xe6, 
++	0x00, 0x04, 0x80, 0x82, 0x77, 0x12, 0x00, 0x55, 
++	0x10, 0xe3, 0x00, 0x37, 0x80, 0x82, 0x77, 0x12, 
++	0x00, 0x57, 0x10, 0xe6, 0x00, 0x05, 0x80, 0x82, 
++	0x48, 0x11, 0xf0, 0x40, 0x00, 0x10, 0xf2, 0x73, 
++	0x14, 0x50, 0xf0, 0x40, 0x00, 0x20, 0x77, 0x12, 
++	0x00, 0x7b, 0x10, 0x82, 0xf0, 0x00, 0x00, 0x07, 
++	0x88, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0x96, 0x0d, 
++	0xf8, 0x30, 0x14, 0x52, 0x10, 0xe2, 0x00, 0x34, 
++	0x77, 0x13, 0x00, 0x55, 0x80, 0x83, 0x77, 0x13, 
++	0x00, 0x57, 0x10, 0xe6, 0x00, 0x02, 0x80, 0x83, 
++	0x10, 0xe2, 0x00, 0x36, 0x77, 0x12, 0x00, 0x55, 
++	0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0x10, 0xe6, 
++	0x00, 0x03, 0x80, 0x82, 0x48, 0x11, 0xf0, 0x40, 
++	0x00, 0x04, 0xf2, 0x73, 0x14, 0x50, 0xf0, 0x40, 
++	0x00, 0x08, 0x77, 0x12, 0x00, 0x7b, 0x10, 0x82, 
++	0xf0, 0x00, 0x00, 0x07, 0x88, 0x12, 0xf4, 0x95, 
++	0xf4, 0x95, 0x96, 0x0e, 0xf8, 0x30, 0x14, 0x52, 
++	0x10, 0xe2, 0x00, 0x33, 0x77, 0x12, 0x00, 0x55, 
++	0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0x10, 0xe6, 
++	0x00, 0x01, 0x80, 0x82, 0x48, 0x11, 0xf2, 0x73, 
++	0x14, 0x50, 0xf0, 0x40, 0x00, 0x02, 0x77, 0x12, 
++	0x00, 0x7b, 0x10, 0x82, 0xf0, 0x00, 0x00, 0x07, 
++	0x88, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0x96, 0x0f, 
++	0xf8, 0x30, 0x14, 0x52, 0x10, 0xe2, 0x00, 0x32, 
++	0x77, 0x12, 0x00, 0x55, 0x77, 0x13, 0x00, 0x57, 
++	0x80, 0x82, 0x48, 0x11, 0xe7, 0x62, 0xf0, 0x40, 
++	0x00, 0x01, 0xe5, 0x01, 0x88, 0x11, 0xf4, 0x95, 
++	0x77, 0x12, 0x00, 0x7b, 0x48, 0x11, 0x71, 0x82, 
++	0x00, 0x12, 0x1a, 0xe2, 0x00, 0x07, 0x80, 0xe2, 
++	0x00, 0x07, 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 
++	0x8a, 0x17, 0x48, 0x11, 0x8a, 0x16, 0x8a, 0x11, 
++	0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 0x77, 0x0e, 
++	0x00, 0x05, 0x77, 0x12, 0x00, 0x55, 0xe8, 0x04, 
++	0xf6, 0xb8, 0x28, 0xe1, 0x00, 0x02, 0xee, 0xff, 
++	0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0xf0, 0x20, 
++	0x80, 0x00, 0xee, 0x01, 0x1a, 0x82, 0x77, 0x12, 
++	0x00, 0x57, 0x80, 0x82, 0xe8, 0x01, 0x32, 0xe1, 
++	0x00, 0x02, 0xf5, 0x82, 0x77, 0x11, 0x00, 0x54, 
++	0xf6, 0x93, 0x18, 0x81, 0x77, 0x11, 0x00, 0x54, 
++	0xf2, 0xa0, 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 
++	0xf4, 0xe4, 0x4a, 0x11, 0x4a, 0x16, 0xf4, 0x95, 
++	0x71, 0x04, 0x00, 0x11, 0xfb, 0x80, 0x16, 0xa2, 
++	0x88, 0x16, 0xf4, 0x95, 0x77, 0x12, 0x00, 0x55, 
++	0x10, 0xe6, 0x00, 0x03, 0x80, 0x82, 0x77, 0x12, 
++	0x00, 0x56, 0x10, 0xe1, 0x00, 0x02, 0x77, 0x13, 
++	0x00, 0x56, 0x80, 0x82, 0x77, 0x12, 0x00, 0x56, 
++	0x10, 0xe1, 0x00, 0x03, 0x80, 0x82, 0x10, 0xe1, 
++	0x00, 0x04, 0x77, 0x12, 0x00, 0x56, 0x80, 0x82, 
++	0x77, 0x12, 0x00, 0x56, 0x10, 0xe1, 0x00, 0x01, 
++	0x80, 0x82, 0xe7, 0x12, 0xe5, 0x01, 0xf9, 0x80, 
++	0x16, 0x9a, 0x8a, 0x16, 0x8a, 0x11, 0xf4, 0xe4, 
++	0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 0xee, 0xf9, 
++	0x77, 0x11, 0x00, 0x7b, 0x76, 0x00, 0x00, 0x16, 
++	0x76, 0x01, 0x00, 0x17, 0x76, 0x02, 0x00, 0x1a, 
++	0x76, 0x03, 0x00, 0x1b, 0x76, 0x04, 0x00, 0x1c, 
++	0x76, 0x05, 0x00, 0x1d, 0x71, 0x81, 0x00, 0x17, 
++	0x71, 0xe7, 0x00, 0x06, 0x00, 0x11, 0x10, 0x81, 
++	0xf8, 0x44, 0x14, 0xdf, 0xf9, 0x80, 0x16, 0x53, 
++	0xf6, 0xb8, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x20, 
++	0xff, 0xff, 0xf6, 0xb8, 0xfb, 0x80, 0x16, 0x08, 
++	0xf0, 0x20, 0xff, 0xff, 0x77, 0x11, 0x00, 0x7b, 
++	0x71, 0x81, 0x00, 0x17, 0x76, 0xe7, 0x00, 0x06, 
++	0x00, 0x01, 0x48, 0x17, 0x77, 0x16, 0x00, 0x00, 
++	0x77, 0x10, 0x00, 0x04, 0x77, 0x15, 0x00, 0x03, 
++	0x77, 0x14, 0x00, 0x02, 0x77, 0x13, 0x00, 0x01, 
++	0xf0, 0x00, 0x00, 0x39, 0x76, 0xe7, 0x00, 0x08, 
++	0x00, 0x1f, 0x76, 0xe7, 0x00, 0x07, 0x00, 0x00, 
++	0x88, 0x0e, 0x77, 0x1a, 0x00, 0x05, 0x48, 0x17, 
++	0xf0, 0x00, 0x00, 0x09, 0x88, 0x12, 0x48, 0x18, 
++	0x88, 0x19, 0xe8, 0x00, 0xf0, 0x72, 0x15, 0x2c, 
++	0x73, 0x19, 0x00, 0x11, 0x76, 0x82, 0x00, 0x00, 
++	0x11, 0x91, 0x73, 0x11, 0x00, 0x19, 0x70, 0xe2, 
++	0x00, 0x03, 0x00, 0x16, 0x70, 0xe2, 0x00, 0x04, 
++	0x00, 0x13, 0x70, 0xe2, 0x00, 0x05, 0x00, 0x14, 
++	0x81, 0xe2, 0x00, 0x01, 0x70, 0xe2, 0x00, 0x06, 
++	0x00, 0x15, 0x70, 0xe2, 0x00, 0x07, 0x00, 0x10, 
++	0x80, 0xe2, 0x00, 0x02, 0x73, 0x0e, 0x00, 0x11, 
++	0xf1, 0x00, 0x00, 0x1e, 0x6d, 0xee, 0x00, 0x05, 
++	0x6d, 0xeb, 0x00, 0x05, 0x6d, 0xec, 0x00, 0x05, 
++	0x6d, 0xed, 0x00, 0x05, 0x6d, 0xe8, 0x00, 0x05, 
++	0xf0, 0x00, 0x00, 0x01, 0x81, 0x91, 0x6d, 0xea, 
++	0x00, 0x08, 0x73, 0x11, 0x00, 0x0e, 0xee, 0x07, 
++	0x76, 0xe7, 0x00, 0x41, 0x00, 0x24, 0x76, 0xe7, 
++	0x00, 0x46, 0x00, 0x25, 0x76, 0xe7, 0x00, 0x4b, 
++	0x00, 0x26, 0x76, 0xe7, 0x00, 0x50, 0x00, 0x27, 
++	0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 0xf4, 0xe4, 
++	0x4a, 0x11, 0x4a, 0x16, 0xee, 0xfe, 0x88, 0x11, 
++	0x56, 0x06, 0x4e, 0x00, 0xf9, 0x80, 0x16, 0xa2, 
++	0xf7, 0xb8, 0x10, 0xf8, 0x00, 0x11, 0xf0, 0x10, 
++	0xff, 0xff, 0xfa, 0x45, 0x15, 0x60, 0x77, 0x16, 
++	0xff, 0xff, 0x77, 0x12, 0x00, 0x7b, 0x49, 0x11, 
++	0x10, 0x82, 0xf6, 0x03, 0xf0, 0x00, 0x00, 0x09, 
++	0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 
++	0xf8, 0x44, 0x15, 0x71, 0xf2, 0x73, 0x15, 0x71, 
++	0xf4, 0x95, 0xe7, 0x16, 0x77, 0x11, 0x00, 0x7b, 
++	0x10, 0x81, 0xf0, 0x00, 0x00, 0x09, 0x88, 0x11, 
++	0xf4, 0x95, 0x77, 0x12, 0x00, 0x06, 0x10, 0x81, 
++	0xf8, 0x45, 0x15, 0x5c, 0x6e, 0xea, 0xff, 0xff, 
++	0x15, 0x69, 0x6d, 0xe9, 0x00, 0x08, 0x76, 0x86, 
++	0x00, 0x01, 0xe9, 0x01, 0x56, 0x00, 0xf1, 0x80, 
++	0x10, 0xf8, 0x00, 0x0b, 0xf8, 0x45, 0x15, 0x7e, 
++	0xfb, 0x80, 0x15, 0x85, 0xf4, 0x95, 0x48, 0x16, 
++	0xf9, 0x80, 0x16, 0x9a, 0xee, 0x02, 0x48, 0x16, 
++	0x8a, 0x16, 0x8a, 0x11, 0xf4, 0xe4, 0x4a, 0x11, 
++	0xee, 0xff, 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 
++	0xf4, 0x95, 0x77, 0x10, 0xff, 0xff, 0xf4, 0xa9, 
++	0xf8, 0x30, 0x15, 0xc4, 0x10, 0xe1, 0x00, 0x03, 
++	0x77, 0x12, 0x00, 0x55, 0x80, 0x82, 0x77, 0x12, 
++	0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12, 
++	0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12, 
++	0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12, 
++	0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12, 
++	0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x10, 0xe1, 
++	0x00, 0x02, 0xf0, 0x00, 0x00, 0x08, 0x32, 0xf8, 
++	0x00, 0x08, 0x77, 0x12, 0x00, 0x54, 0xe8, 0x01, 
++	0xf4, 0x82, 0xf4, 0x93, 0x18, 0x82, 0x77, 0x12, 
++	0x00, 0x54, 0xf0, 0x40, 0x00, 0x00, 0x80, 0x82, 
++	0x10, 0xe1, 0x00, 0x01, 0xf9, 0x80, 0x16, 0x76, 
++	0x10, 0xe1, 0x00, 0x01, 0xf9, 0x80, 0x16, 0x66, 
++	0xf0, 0x73, 0x16, 0x03, 0x77, 0x11, 0x00, 0x7b, 
++	0x71, 0x81, 0x00, 0x11, 0x71, 0xe1, 0x00, 0x07, 
++	0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x10, 0xe1, 
++	0x00, 0x09, 0xf9, 0x80, 0x15, 0x85, 0x77, 0x11, 
++	0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x10, 0xe1, 
++	0x00, 0x09, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x00, 
++	0x00, 0x08, 0x77, 0x11, 0x00, 0x7b, 0x71, 0x81, 
++	0x00, 0x11, 0x10, 0xe1, 0x00, 0x09, 0xfb, 0x80, 
++	0x15, 0x85, 0xf0, 0x00, 0x00, 0x10, 0x77, 0x11, 
++	0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x10, 0xe1, 
++	0x00, 0x09, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x00, 
++	0x00, 0x18, 0x77, 0x11, 0x00, 0x7b, 0x71, 0x81, 
++	0x00, 0x11, 0x10, 0xe1, 0x00, 0x09, 0xfb, 0x80, 
++	0x15, 0x85, 0xf0, 0x00, 0x00, 0x20, 0x77, 0x11, 
++	0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x10, 0xe1, 
++	0x00, 0x09, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x00, 
++	0x00, 0x28, 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 
++	0x8a, 0x11, 0xf4, 0xe4, 0x4a, 0x11, 0xee, 0xff, 
++	0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 0xf4, 0x95, 
++	0x77, 0x10, 0xff, 0xff, 0xf4, 0xa9, 0xf8, 0x30, 
++	0x16, 0x41, 0x77, 0x11, 0x00, 0x55, 0x76, 0x81, 
++	0x00, 0x1e, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
++	0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
++	0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
++	0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
++	0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
++	0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
++	0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
++	0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
++	0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
++	0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0xf2, 0x73, 
++	0x16, 0x4e, 0x76, 0x81, 0x00, 0x00, 0x77, 0x11, 
++	0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x71, 0xe1, 
++	0x00, 0x07, 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 
++	0x10, 0xe1, 0x00, 0x39, 0xf9, 0x80, 0x16, 0x08, 
++	0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 0x8a, 0x11, 
++	0xf4, 0xe4, 0x4a, 0x11, 0x77, 0x11, 0x00, 0x7b, 
++	0x10, 0x81, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x11, 
++	0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 0xfa, 0x44, 
++	0x16, 0x63, 0xf4, 0x95, 0xee, 0xff, 0x76, 0x81, 
++	0x00, 0x01, 0xee, 0x01, 0x8a, 0x11, 0xf4, 0xe4, 
++	0xf0, 0x10, 0x00, 0x10, 0x4a, 0x11, 0x32, 0xf8, 
++	0x00, 0x08, 0xee, 0xff, 0x77, 0x11, 0x00, 0x01, 
++	0xe8, 0x01, 0xee, 0x01, 0xf4, 0x82, 0x1a, 0x81, 
++	0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4, 
++	0xf0, 0x10, 0x00, 0x10, 0x4a, 0x11, 0x32, 0xf8, 
++	0x00, 0x08, 0xee, 0xff, 0xe8, 0x01, 0x77, 0x11, 
++	0x00, 0x00, 0xf4, 0x82, 0xee, 0x01, 0xf4, 0x93, 
++	0x18, 0x81, 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 
++	0xf4, 0xe4, 0x4a, 0x11, 0xf0, 0x10, 0x00, 0x10, 
++	0x77, 0x11, 0x00, 0x00, 0x32, 0xf8, 0x00, 0x08, 
++	0xee, 0xff, 0x11, 0x81, 0xe8, 0x01, 0xee, 0x01, 
++	0x77, 0x11, 0x00, 0x00, 0xf4, 0x82, 0xf2, 0xa0, 
++	0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4, 
++	0xf2, 0x73, 0x16, 0x9e, 0xf6, 0xbb, 0xf4, 0x95, 
++	0xf4, 0x95, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xe4, 
++	0xf2, 0x73, 0x16, 0xa6, 0xf7, 0xbb, 0xf4, 0x95, 
++	0xf4, 0x95, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xe4, 
++	0x4a, 0x11, 0x4a, 0x16, 0xf4, 0x95, 0x71, 0x04, 
++	0x00, 0x16, 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 
++	0xf4, 0x95, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++	0x76, 0x82, 0x00, 0x0e, 0x10, 0xe6, 0x00, 0x0e, 
++	0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x80, 0x82, 
++	0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 
++	0x00, 0x0d, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 
++	0x10, 0xe6, 0x00, 0x0d, 0x80, 0x82, 0x71, 0xe1, 
++	0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x0c, 
++	0x10, 0xe6, 0x00, 0x0c, 0x71, 0xe1, 0x00, 0x06, 
++	0x00, 0x12, 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 
++	0x00, 0x12, 0x76, 0x82, 0x00, 0x0b, 0x10, 0xe6, 
++	0x00, 0x0b, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 
++	0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++	0x76, 0x82, 0x00, 0x0a, 0x71, 0xe1, 0x00, 0x06, 
++	0x00, 0x12, 0x10, 0xe6, 0x00, 0x0a, 0x80, 0x82, 
++	0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 
++	0x00, 0x09, 0x10, 0xe6, 0x00, 0x09, 0x71, 0xe1, 
++	0x00, 0x06, 0x00, 0x12, 0x80, 0x82, 0x71, 0xe1, 
++	0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x08, 
++	0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x10, 0xe6, 
++	0x00, 0x08, 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 
++	0x00, 0x12, 0x76, 0x82, 0x00, 0x07, 0x10, 0xe6, 
++	0x00, 0x07, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 
++	0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++	0x76, 0x82, 0x00, 0x06, 0x71, 0xe1, 0x00, 0x06, 
++	0x00, 0x12, 0x10, 0xe6, 0x00, 0x06, 0x80, 0x82, 
++	0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 
++	0x00, 0x05, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 
++	0x10, 0xe6, 0x00, 0x05, 0x80, 0x82, 0x71, 0xe1, 
++	0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x04, 
++	0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x10, 0xe6, 
++	0x00, 0x04, 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 
++	0x00, 0x12, 0x76, 0x82, 0x00, 0x03, 0x71, 0xe1, 
++	0x00, 0x06, 0x00, 0x12, 0x10, 0xe6, 0x00, 0x03, 
++	0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++	0x76, 0x82, 0x00, 0x02, 0x10, 0xe6, 0x00, 0x02, 
++	0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x80, 0x82, 
++	0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 
++	0x00, 0x01, 0x10, 0xe6, 0x00, 0x01, 0x71, 0xe1, 
++	0x00, 0x06, 0x00, 0x12, 0x80, 0x82, 0x71, 0xe1, 
++	0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 
++	0x71, 0xe1, 0x00, 0x06, 0x00, 0x13, 0xe7, 0x62, 
++	0xe5, 0x01, 0xf9, 0x80, 0x16, 0x9a, 0x8a, 0x16, 
++	0x8a, 0x11, 0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 
++	0xf4, 0x95, 0xf4, 0x95, 0x71, 0xe1, 0x00, 0x05, 
++	0x00, 0x12, 0xee, 0xff, 0x76, 0x82, 0x00, 0x00, 
++	0xee, 0x01, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x11, 
++	0x69, 0x81, 0x00, 0x01, 0x8a, 0x11, 0xf4, 0x95, 
++	0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 0xf4, 0x95, 
++	0xf4, 0x95, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++	0xee, 0xff, 0x76, 0x82, 0x00, 0x01, 0xee, 0x01, 
++	0x71, 0xe1, 0x00, 0x06, 0x00, 0x11, 0x69, 0x81, 
++	0x00, 0x01, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4, 
++	0x4a, 0x11, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 
++	0xf0, 0x00, 0x00, 0x94, 0x88, 0x11, 0xf4, 0x95, 
++	0xf4, 0x95, 0x10, 0x81, 0xfa, 0x44, 0x17, 0x9c, 
++	0xf4, 0x95, 0xee, 0xff, 0xf9, 0x80, 0x16, 0x53, 
++	0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 0xf0, 0x00, 
++	0x00, 0x94, 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 
++	0x76, 0x81, 0x00, 0x01, 0xee, 0x01, 0x76, 0xe1, 
++	0x00, 0x01, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02, 
++	0x00, 0x21, 0x76, 0xe1, 0x00, 0x03, 0x00, 0x20, 
++	0x76, 0xe1, 0x00, 0x04, 0x00, 0x23, 0x76, 0xe1, 
++	0x00, 0x05, 0x00, 0x22, 0x76, 0xe1, 0x00, 0x06, 
++	0x00, 0x38, 0x76, 0xe1, 0x00, 0x07, 0x00, 0x39, 
++	0x76, 0xe1, 0x00, 0x08, 0x00, 0x15, 0x76, 0xe1, 
++	0x00, 0x09, 0x00, 0x14, 0x76, 0xe1, 0x00, 0x0a, 
++	0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 0x00, 0x41, 
++	0x76, 0xe1, 0x00, 0x0c, 0x00, 0x40, 0x76, 0xe1, 
++	0x00, 0x0d, 0x00, 0x43, 0x76, 0xe1, 0x00, 0x0e, 
++	0x00, 0x42, 0x76, 0xe1, 0x00, 0x0f, 0x00, 0x48, 
++	0x76, 0xe1, 0x00, 0x10, 0x00, 0x49, 0x76, 0xe1, 
++	0x00, 0x11, 0x00, 0x1b, 0x76, 0xe1, 0x00, 0x12, 
++	0x00, 0x1a, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4, 
++	0x4a, 0x11, 0xee, 0xfd, 0x88, 0x11, 0x56, 0x06, 
++	0x4e, 0x00, 0xf9, 0x80, 0x16, 0xa2, 0x77, 0x12, 
++	0x00, 0x7b, 0x77, 0x0e, 0x00, 0x09, 0x10, 0x82, 
++	0x28, 0xf8, 0x00, 0x11, 0xf0, 0x00, 0x00, 0x95, 
++	0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 
++	0xf8, 0x45, 0x17, 0xf0, 0xf2, 0x73, 0x17, 0xfd, 
++	0x77, 0x11, 0xff, 0xff, 0x76, 0x81, 0x00, 0x01, 
++	0xe9, 0x01, 0x56, 0x00, 0xf1, 0x80, 0x10, 0xf8, 
++	0x00, 0x0b, 0xf8, 0x45, 0x17, 0xfd, 0xfb, 0x80, 
++	0x18, 0x10, 0xf4, 0x95, 0x48, 0x11, 0xf9, 0x80, 
++	0x16, 0x9a, 0xee, 0x03, 0x48, 0x11, 0x8a, 0x11, 
++	0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 
++	0xf4, 0x95, 0xee, 0xff, 0x71, 0xe1, 0x00, 0x01, 
++	0x00, 0x11, 0xee, 0x01, 0x10, 0x81, 0x8a, 0x11, 
++	0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0xee, 0xff, 
++	0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 0xf4, 0x95, 
++	0x77, 0x10, 0xff, 0xff, 0xf4, 0xa9, 0xf8, 0x30, 
++	0x18, 0xc3, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++	0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 0x00, 0x06, 
++	0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 
++	0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x01, 
++	0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
++	0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++	0x76, 0x82, 0x00, 0x02, 0x71, 0xe1, 0x00, 0x06, 
++	0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 
++	0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x03, 
++	0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
++	0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++	0x76, 0x82, 0x00, 0x04, 0x71, 0xe1, 0x00, 0x06, 
++	0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 
++	0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x05, 
++	0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
++	0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++	0x76, 0x82, 0x00, 0x06, 0x71, 0xe1, 0x00, 0x06, 
++	0x00, 0x12, 0x76, 0x82, 0x00, 0x01, 0x71, 0xe1, 
++	0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x07, 
++	0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
++	0x20, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++	0x76, 0x82, 0x00, 0x08, 0x71, 0xe1, 0x00, 0x06, 
++	0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 
++	0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x09, 
++	0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
++	0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++	0x76, 0x82, 0x00, 0x0a, 0x71, 0xe1, 0x00, 0x06, 
++	0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 
++	0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x0b, 
++	0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
++	0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++	0x76, 0x82, 0x00, 0x0c, 0x71, 0xe1, 0x00, 0x06, 
++	0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 
++	0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x0d, 
++	0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
++	0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++	0x76, 0x82, 0x00, 0x0e, 0x71, 0xe1, 0x00, 0x06, 
++	0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x10, 0xe1, 
++	0x00, 0x07, 0xf9, 0x80, 0x16, 0x76, 0x10, 0xe1, 
++	0x00, 0x08, 0xf9, 0x80, 0x16, 0x76, 0x10, 0xe1, 
++	0x00, 0x07, 0xf9, 0x80, 0x16, 0x66, 0x10, 0xe1, 
++	0x00, 0x08, 0xf9, 0x80, 0x16, 0x66, 0xf0, 0x73, 
++	0x18, 0xd1, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 
++	0xfb, 0x80, 0x18, 0x10, 0xf0, 0x00, 0x00, 0x95, 
++	0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 0xfb, 0x80, 
++	0x18, 0x10, 0xf0, 0x00, 0x00, 0x9e, 0xf9, 0x80, 
++	0x16, 0x9a, 0xee, 0x01, 0x8a, 0x11, 0xf4, 0xe4, 
++	0x4a, 0x11, 0x88, 0x11, 0xee, 0xff, 0xf4, 0x95, 
++	0x10, 0x04, 0x71, 0xe1, 0x00, 0x03, 0x00, 0x11, 
++	0xee, 0x01, 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 
++	0xf4, 0xe4, 0x4a, 0x11, 0x4a, 0x16, 0xf4, 0x95, 
++	0x71, 0x04, 0x00, 0x16, 0xfb, 0x80, 0x16, 0xa2, 
++	0x88, 0x11, 0xf4, 0x95, 0x71, 0xe1, 0x00, 0x02, 
++	0x00, 0x12, 0x76, 0x82, 0x00, 0x10, 0x10, 0xe6, 
++	0x00, 0x01, 0x71, 0xe1, 0x00, 0x03, 0x00, 0x12, 
++	0x80, 0x82, 0x71, 0xe1, 0x00, 0x04, 0x00, 0x12, 
++	0x10, 0xe6, 0x00, 0x02, 0x80, 0x82, 0xe7, 0x62, 
++	0x71, 0xe1, 0x00, 0x02, 0x00, 0x13, 0xe5, 0x01, 
++	0xf9, 0x80, 0x16, 0x9a, 0x8a, 0x16, 0x8a, 0x11, 
++	0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 0xee, 0xff, 
++	0xee, 0x01, 0x10, 0xe1, 0x00, 0x01, 0x8a, 0x11, 
++	0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0x77, 0x11, 
++	0x00, 0x7b, 0x10, 0x81, 0xf0, 0x00, 0x00, 0xb3, 
++	0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 
++	0xfa, 0x44, 0x19, 0x2a, 0xf4, 0x95, 0xee, 0xff, 
++	0xf9, 0x80, 0x16, 0x53, 0x77, 0x11, 0x00, 0x7b, 
++	0x10, 0x81, 0xf0, 0x00, 0x00, 0xb3, 0x88, 0x11, 
++	0xf4, 0x95, 0xf4, 0x95, 0x76, 0x81, 0x00, 0x01, 
++	0xee, 0x01, 0x76, 0xe1, 0x00, 0x01, 0x00, 0x00, 
++	0x76, 0xe1, 0x00, 0x02, 0x00, 0x13, 0x76, 0xe1, 
++	0x00, 0x03, 0x00, 0x26, 0x76, 0xe1, 0x00, 0x04, 
++	0x00, 0x25, 0x76, 0xe1, 0x00, 0x05, 0x00, 0x24, 
++	0x76, 0xe1, 0x00, 0x06, 0x00, 0x00, 0x76, 0xe1, 
++	0x00, 0x07, 0x00, 0x17, 0x76, 0xe1, 0x00, 0x08, 
++	0x00, 0x32, 0x76, 0xe1, 0x00, 0x09, 0x00, 0x31, 
++	0x76, 0xe1, 0x00, 0x0a, 0x00, 0x30, 0x8a, 0x11, 
++	0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0x4a, 0x16, 
++	0x4a, 0x17, 0xee, 0xff, 0xf4, 0x95, 0x71, 0x06, 
++	0x00, 0x17, 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 
++	0xf4, 0x95, 0xf7, 0xb8, 0x10, 0xf8, 0x00, 0x11, 
++	0xf0, 0x10, 0xff, 0xff, 0xfa, 0x45, 0x19, 0x73, 
++	0x77, 0x16, 0xff, 0xff, 0x77, 0x12, 0x00, 0x7b, 
++	0x77, 0x0e, 0x00, 0x05, 0x10, 0x82, 0x28, 0xf8, 
++	0x00, 0x11, 0xf0, 0x00, 0x00, 0xb4, 0x88, 0x11, 
++	0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 0xf8, 0x44, 
++	0x19, 0x84, 0xf2, 0x73, 0x19, 0x84, 0xf4, 0x95, 
++	0xe7, 0x16, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 
++	0xf0, 0x00, 0x00, 0xb4, 0x88, 0x11, 0xf4, 0x95, 
++	0x77, 0x12, 0x00, 0x02, 0x10, 0x81, 0xf8, 0x45, 
++	0x19, 0x6f, 0x6e, 0xea, 0xff, 0xff, 0x19, 0x7c, 
++	0x6d, 0xe9, 0x00, 0x05, 0x61, 0xf8, 0x00, 0x17, 
++	0x00, 0x01, 0xfa, 0x20, 0x19, 0x8f, 0x76, 0x86, 
++	0x00, 0x01, 0xfb, 0x80, 0x19, 0x97, 0xf4, 0x95, 
++	0x48, 0x16, 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 
++	0x8a, 0x17, 0x48, 0x16, 0x8a, 0x16, 0x8a, 0x11, 
++	0xf4, 0xe4, 0x4a, 0x11, 0xee, 0xff, 0xfb, 0x80, 
++	0x16, 0xa2, 0x88, 0x11, 0xf4, 0x95, 0x77, 0x10, 
++	0xff, 0xff, 0xf4, 0xa9, 0xf8, 0x30, 0x19, 0xcc, 
++	0x71, 0xe1, 0x00, 0x02, 0x00, 0x12, 0x69, 0x82, 
++	0x00, 0x10, 0x71, 0xe1, 0x00, 0x02, 0x00, 0x12, 
++	0x68, 0x82, 0xf7, 0xff, 0x71, 0xe1, 0x00, 0x02, 
++	0x00, 0x12, 0x68, 0x82, 0xfb, 0xff, 0x71, 0xe1, 
++	0x00, 0x02, 0x00, 0x12, 0x68, 0x82, 0xff, 0xf0, 
++	0x71, 0xe1, 0x00, 0x03, 0x00, 0x12, 0x76, 0x82, 
++	0xff, 0xff, 0x71, 0xe1, 0x00, 0x04, 0x00, 0x12, 
++	0x76, 0x82, 0xff, 0xff, 0x71, 0xe1, 0x00, 0x02, 
++	0x00, 0x12, 0x69, 0x82, 0x00, 0x20, 0x71, 0xe1, 
++	0x00, 0x02, 0x00, 0x11, 0xf2, 0x73, 0x19, 0xda, 
++	0x68, 0x81, 0xff, 0xef, 0x77, 0x11, 0x00, 0x7b, 
++	0x10, 0x81, 0xfb, 0x80, 0x19, 0x97, 0xf0, 0x00, 
++	0x00, 0xb4, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 
++	0xfb, 0x80, 0x19, 0x97, 0xf0, 0x00, 0x00, 0xb9, 
++	0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 0x8a, 0x11, 
++	0xf4, 0xe4, 0x00, 0xa4, 0x00, 0x00, 0x19, 0xdf, 
++	0x00, 0x01, 0x2a, 0xe6, 0x00, 0x00, 0x00, 0x01, 
++	0x2a, 0xe7, 0x00, 0x00, 0x00, 0x03, 0x2a, 0x12, 
++	0x0c, 0x01, 0xc3, 0x4f, 0x00, 0x00, 0x00, 0x01, 
++	0x2a, 0x15, 0x00, 0x00, 0x00, 0x02, 0x2a, 0x16, 
++	0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x2a, 0x5d, 
++	0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 
++	0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 
++	0x00, 0x74, 0x00, 0x20, 0x00, 0x54, 0x00, 0x65, 
++	0x00, 0x63, 0x00, 0x68, 0x00, 0x6e, 0x00, 0x6f, 
++	0x00, 0x54, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6e, 
++	0x00, 0x64, 0x00, 0x20, 0x00, 0x41, 0x00, 0x47, 
++	0x00, 0x00, 0x00, 0x04, 0x2a, 0x76, 0x00, 0x30, 
++	0x00, 0x2e, 0x00, 0x30, 0x00, 0x00, 0x00, 0x0c, 
++	0x2a, 0x7a, 0x00, 0x46, 0x00, 0x65, 0x00, 0x62, 
++	0x00, 0x20, 0x00, 0x32, 0x00, 0x37, 0x00, 0x20, 
++	0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x31, 
++	0x00, 0x00, 0x00, 0x09, 0x2a, 0x86, 0x00, 0x31, 
++	0x00, 0x34, 0x00, 0x3a, 0x00, 0x33, 0x00, 0x35, 
++	0x00, 0x3a, 0x00, 0x33, 0x00, 0x33, 0x00, 0x00, 
++	0x00, 0x0f, 0x2a, 0x8f, 0x00, 0x00, 0x00, 0x00, 
++	0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 
++	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
++	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
++	0x00, 0x00, 0x00, 0x01, 0x2a, 0x9e, 0x00, 0x00, 
++	0x00, 0x01, 0x2a, 0x9f, 0x00, 0x00, 0x00, 0x01, 
++	0x2a, 0xa0, 0x00, 0x00, 0x00, 0x01, 0x2a, 0xa1, 
++	0x00, 0x00, 0x00, 0x01, 0x2a, 0xa2, 0x00, 0x00, 
++	0x00, 0x01, 0x29, 0x7e, 0x00, 0x00, 0x00, 0x02, 
++	0x29, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
++	0x29, 0x82, 0xff, 0xff, 0x00, 0x01, 0x2a, 0xa7, 
++	0x00, 0x00, 0x00, 0x05, 0x2a, 0xa8, 0x71, 0x41, 
++	0x20, 0x00, 0x20, 0x00, 0x00, 0x23, 0x04, 0x00, 
++	0x00, 0x0a, 0x2a, 0xad, 0x00, 0x00, 0x00, 0x00, 
++	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
++	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
++	0x00, 0x0f, 0x2a, 0xb7, 0x00, 0x00, 0x00, 0x00, 
++	0x00, 0x00, 0x00, 0x40, 0x00, 0xa0, 0x82, 0x40, 
++	0x00, 0x08, 0x30, 0x7f, 0x00, 0x80, 0x01, 0x80, 
++	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
++	0x00, 0x00, 0x00, 0x01, 0x27, 0x6e, 0x00, 0x00, 
++	0x00, 0x01, 0x27, 0x6f, 0x00, 0x00, 0x00, 0x00, 
++	0x00, 0x09, 0x00, 0x00, 0x1a, 0x83, 0x04, 0xe8, 
++	0x04, 0xcf, 0x04, 0xc5, 0x04, 0xba, 0x04, 0xb0, 
++	0x04, 0xac, 0x04, 0x9c, 0x04, 0x8c, 0x04, 0x81, 
++	0x00, 0x78, 0x00, 0x00, 0x01, 0x00, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xaa, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x02, 0x23, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x05, 0xe5, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x02, 0xb5, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x0e, 0x33, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++	0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0x00, 0x00, 
++};
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-budget/Kconfig	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,11 @@
++config DVB_TTUSB_BUDGET
++	tristate "Technotrend/Hauppauge Nova-USB devices"
++	depends on DVB_CORE && USB
++	help
++	  Support for external USB adapters designed by Technotrend and
++	  produced by Hauppauge, shipped under the brand name 'Nova-USB'.
++
++          These devices don't have a MPEG decoder built in, so you need
++	  an external software decoder to watch TV.	  
++
++	  Say Y if you own such a device and want to use it.
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-budget/Makefile	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,3 @@
++obj-$(CONFIG_DVB_TTUSB_BUDGET) += dvb-ttusb-budget.o
++
++EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-dec/dec2000_frontend.c	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,180 @@
++/*
++ * TTUSB DEC-2000-t Frontend
++ *
++ * Copyright (C) 2003 Alex Woods <linux-dvb@giblets.org>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++#include <linux/init.h>
++#include <linux/module.h>
++
++#include "dvb_frontend.h"
++#include "dvb_functions.h"
++
++static int debug = 0;
++
++#define dprintk	if (debug) printk
++
++static struct dvb_frontend_info dec2000_frontend_info = {
++	name:			"TechnoTrend/Hauppauge DEC-2000-t Frontend",
++	type:			FE_OFDM,
++	frequency_min:		51000000,
++	frequency_max:		858000000,
++	frequency_stepsize:	62500,
++	caps:	FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
++		FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
++		FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
++		FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
++		FE_CAN_HIERARCHY_AUTO,
++};
++
++static int dec2000_frontend_ioctl(struct dvb_frontend *fe, unsigned int cmd,
++				  void *arg)
++{
++	dprintk("%s\n", __FUNCTION__);
++
++	switch (cmd) {
++
++	case FE_GET_INFO:
++		dprintk("%s: FE_GET_INFO\n", __FUNCTION__);
++		memcpy(arg, &dec2000_frontend_info,
++		       sizeof (struct dvb_frontend_info));
++		break;
++
++	case FE_READ_STATUS: {
++			fe_status_t *status = (fe_status_t *)arg;
++			dprintk("%s: FE_READ_STATUS\n", __FUNCTION__);
++			*status = FE_HAS_SIGNAL | FE_HAS_VITERBI |
++				  FE_HAS_SYNC | FE_HAS_CARRIER | FE_HAS_LOCK;
++			break;
++		}
++
++	case FE_READ_BER: {
++			u32 *ber = (u32 *)arg;
++			dprintk("%s: FE_READ_BER\n", __FUNCTION__);
++			*ber = 0;
++			return -ENOSYS;
++			break;
++		}
++
++	case FE_READ_SIGNAL_STRENGTH: {
++			dprintk("%s: FE_READ_SIGNAL_STRENGTH\n", __FUNCTION__);
++			*(s32 *)arg = 0xFF;
++			return -ENOSYS;
++			break;
++		}
++
++	case FE_READ_SNR:
++		dprintk("%s: FE_READ_SNR\n", __FUNCTION__);
++		*(s32 *)arg = 0;
++		return -ENOSYS;
++		break;
++
++	case FE_READ_UNCORRECTED_BLOCKS:
++		dprintk("%s: FE_READ_UNCORRECTED_BLOCKS\n", __FUNCTION__);
++		*(u32 *)arg = 0;
++		return -ENOSYS;
++		break;
++
++	case FE_SET_FRONTEND:{
++			struct dvb_frontend_parameters *p =
++				(struct dvb_frontend_parameters *)arg;
++			u8 b[] = { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
++				   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
++				   0x00, 0xff, 0x00, 0x00, 0x00, 0xff };
++			u32 freq;
++			struct i2c_msg msg = { addr: 0x71, flags: 0, len:20 };
++
++			dprintk("%s: FE_SET_FRONTEND\n", __FUNCTION__);
++
++			dprintk("            frequency->%d\n", p->frequency);
++			dprintk("            symbol_rate->%d\n",
++				p->u.qam.symbol_rate);
++			dprintk("            inversion->%d\n", p->inversion);
++
++			freq = htonl(p->frequency / 1000);
++			memcpy(&b[4], &freq, sizeof (int));
++			msg.buf = b;
++			fe->i2c->xfer(fe->i2c, &msg, 1);
++
++			break;
++		}
++
++	case FE_GET_FRONTEND:
++		dprintk("%s: FE_GET_FRONTEND\n", __FUNCTION__);
++		break;
++
++	case FE_SLEEP:
++		dprintk("%s: FE_SLEEP\n", __FUNCTION__);
++		return -ENOSYS;
++		break;
++
++	case FE_INIT:
++		dprintk("%s: FE_INIT\n", __FUNCTION__);
++		break;
++
++	case FE_RESET:
++		dprintk("%s: FE_RESET\n", __FUNCTION__);
++		break;
++
++	default:
++		dprintk("%s: unknown IOCTL (0x%X)\n", __FUNCTION__, cmd);
++		return -EINVAL;
++
++	}
++
++	return 0;
++}
++
++static int dec2000_frontend_attach(struct dvb_i2c_bus *i2c)
++{
++	dprintk("%s\n", __FUNCTION__);
++
++	dvb_register_frontend(dec2000_frontend_ioctl, i2c, NULL,
++			      &dec2000_frontend_info);
++
++	return 0;
++}
++
++static void dec2000_frontend_detach(struct dvb_i2c_bus *i2c)
++{
++	dprintk("%s\n", __FUNCTION__);
++
++	dvb_unregister_frontend(dec2000_frontend_ioctl, i2c);
++}
++
++static int __init dec2000_frontend_init(void)
++{
++	return dvb_register_i2c_device(THIS_MODULE, dec2000_frontend_attach,
++				       dec2000_frontend_detach);
++}
++
++static void __exit dec2000_frontend_exit(void)
++{
++	dvb_unregister_i2c_device(dec2000_frontend_attach);
++}
++
++module_init(dec2000_frontend_init);
++module_exit(dec2000_frontend_exit);
++
++MODULE_DESCRIPTION("TechnoTrend/Hauppauge DEC-2000-t Frontend");
++MODULE_AUTHOR("Alex Woods <linux-dvb@giblets.org");
++MODULE_LICENSE("GPL");
++
++MODULE_PARM(debug, "i");
++MODULE_PARM_DESC(debug, "Debug level");
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-dec/fdump.c	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,36 @@
++#include <stdio.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <fcntl.h>
++#include <unistd.h>
++
++
++int main (int argc, char **argv)
++{
++	unsigned char buf[8];
++	unsigned int i, count, bytes = 0;
++	int fd;
++
++	if (argc != 3) {
++		fprintf (stderr, "\n\tusage: %s <ucode.bin> <array_name>\n\n",
++			 argv[0]);
++		return -1;
++	}
++
++	fd = open (argv[1], O_RDONLY);
++
++	printf ("\n#include <asm/types.h>\n\nu8 %s [] __initdata = {",
++		argv[2]);
++
++	while ((count = read (fd, buf, 8)) > 0) {
++		printf ("\n\t");
++		for (i=0;i<count;i++, bytes++)
++			printf ("0x%02x, ", buf[i]);
++	}
++
++	printf ("\n};\n\n");
++	close (fd);
++
++	return 0;
++}
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-dec/Kconfig	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,24 @@
++config DVB_TTUSB_DEC
++	tristate "Technotrend/Hauppauge USB DEC2000-T devices"
++	depends on DVB_CORE && USB
++	help
++	  Support for external USB adapters designed by Technotrend and
++	  produced by Hauppauge, shipped under the brand name 'DEC2000-T'.
++
++          Even if these devices have a MPEG decoder built in, they transmit
++	  only compressed MPEG data over the USB bus, so you need
++	  an external software decoder to watch TV on your computer.	  
++
++	  Say Y if you own such a device and want to use it.
++
++config DVB_TTUSB_DEC_FIRMWARE_FILE
++	string "Full pathname of dec2000t.bin firmware file"
++	depends on DVB_TTUSB_DEC
++	default "/etc/dvb/dec2000t.bin"
++	help
++	  The DEC2000-T requires a firmware in order to boot into a mode in
++	  which it is a slave to the PC.  The firmware file can obtained as
++	  follows:
++	    wget http://hauppauge.lightpath.net/de/dec215a.exe
++	    unzip -j dec215a.exe Software/Oem/STB/App/Boot/STB_PC_T.bin
++	    mv STB_PC_T.bin /etc/dvb/dec2000t.bin
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-dec/Makefile	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,11 @@
++
++obj-$(CONFIG_DVB_TTUSB_DEC) += ttusb_dec.o dec2000_frontend.o
++
++EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
++
++host-progs	:= fdump
++
++$(obj)/ttusb_dec.o: $(obj)/dsp_dec2000.h
++
++$(obj)/dsp_dec2000.h: $(patsubst "%", %, $(CONFIG_DVB_TTUSB_DEC_FIRMWARE_FILE)) $(obj)/fdump
++	$(obj)/fdump $< dsp_dec2000 > $@
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-dec/ttusb_dec.c	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,991 @@
++/*
++ * TTUSB DEC Driver
++ *
++ * Copyright (C) 2003 Alex Woods <linux-dvb@giblets.org>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/pci.h>
++#include <linux/slab.h>
++#include <linux/usb.h>
++
++#include "ttusb_dec.h"
++#include "dvb_frontend.h"
++
++static int debug = 0;
++
++#define dprintk	if (debug) printk
++
++static int ttusb_dec_send_command(struct ttusb_dec *dec, const u8 command,
++				  int param_length, const u8 params[],
++				  int *result_length, u8 cmd_result[])
++{
++	int result, actual_len, i;
++	u8 b[COMMAND_PACKET_SIZE + 4];
++	u8 c[COMMAND_PACKET_SIZE + 4];
++
++	dprintk("%s\n", __FUNCTION__);
++
++	if ((result = down_interruptible(&dec->usb_sem))) {
++		printk("%s: Failed to down usb semaphore.\n", __FUNCTION__);
++		return result;
++	}
++
++	b[0] = 0xaa;
++	b[1] = ++dec->trans_count;
++	b[2] = command;
++	b[3] = param_length;
++
++	if (params)
++		memcpy(&b[4], params, param_length);
++
++	if (debug) {
++		printk("%s: command: ", __FUNCTION__);
++		for (i = 0; i < param_length + 4; i++)
++			printk("0x%02X ", b[i]);
++		printk("\n");
++	}
++
++	result = usb_bulk_msg(dec->udev, dec->command_pipe, b, sizeof(b),
++			      &actual_len, HZ);
++
++	if (result) {
++		printk("%s: command bulk message failed: error %d\n",
++		       __FUNCTION__, result);
++		up(&dec->usb_sem);
++		return result;
++	}
++
++	result = usb_bulk_msg(dec->udev, dec->result_pipe, c, sizeof(c),
++			      &actual_len, HZ);
++
++	if (result) {
++		printk("%s: result bulk message failed: error %d\n",
++		       __FUNCTION__, result);
++		up(&dec->usb_sem);
++		return result;
++	} else {
++		if (debug) {
++			printk("%s: result: ", __FUNCTION__);
++			for (i = 0; i < actual_len; i++)
++				printk("0x%02X ", c[i]);
++			printk("\n");
++		}
++
++		if (result_length)
++			*result_length = c[3];
++		if (cmd_result && c[3] > 0)
++			memcpy(cmd_result, &c[4], c[3]);
++
++		up(&dec->usb_sem);
++
++		return 0;
++	}
++}
++
++static int ttusb_dec_av_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 void ttusb_dec_set_pids(struct ttusb_dec *dec)
++{
++	u8 b[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
++		   0xff, 0xff };
++
++	u16 pcr = htons(dec->pid[DMX_PES_PCR]);
++	u16 audio = htons(dec->pid[DMX_PES_AUDIO]);
++	u16 video = htons(dec->pid[DMX_PES_VIDEO]);
++
++	dprintk("%s\n", __FUNCTION__);
++
++	memcpy(&b[0], &pcr, 2);
++	memcpy(&b[2], &audio, 2);
++	memcpy(&b[4], &video, 2);
++
++	ttusb_dec_send_command(dec, 0x50, sizeof(b), b, NULL, NULL);
++
++	if (!down_interruptible(&dec->pes2ts_sem)) {
++		dvb_filter_pes2ts_init(&dec->a_pes2ts, dec->pid[DMX_PES_AUDIO],
++				       ttusb_dec_av_pes2ts_cb, dec->demux.feed);
++		dvb_filter_pes2ts_init(&dec->v_pes2ts, dec->pid[DMX_PES_VIDEO],
++				       ttusb_dec_av_pes2ts_cb, dec->demux.feed);
++
++		up(&dec->pes2ts_sem);
++	}
++}
++
++static int ttusb_dec_i2c_master_xfer(struct dvb_i2c_bus *i2c,
++				     const struct i2c_msg msgs[], int num)
++{
++	int result, i;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	for (i = 0; i < num; i++)
++		if ((result = ttusb_dec_send_command(i2c->data, msgs[i].addr,
++						     msgs[i].len, msgs[i].buf,
++						     NULL, NULL)))
++			return result;
++
++	return 0;
++}
++
++static void ttusb_dec_process_av_pes(struct ttusb_dec * dec, u8 * av_pes,
++				     int length)
++{
++	int i;
++	u16 csum = 0;
++	u8 c;
++
++	if (length < 16) {
++		printk("%s: packet too short.\n", __FUNCTION__);
++		return;
++	}
++
++	for (i = 0; i < length; i += 2) {
++		csum ^= le16_to_cpup((u16 *)(av_pes + i));
++		c = av_pes[i];
++		av_pes[i] = av_pes[i + 1];
++		av_pes[i + 1] = c;
++	}
++
++	if (csum) {
++		printk("%s: checksum failed.\n", __FUNCTION__);
++		return;
++	}
++
++	if (length > 8 + MAX_AV_PES_LENGTH + 4) {
++		printk("%s: packet too long.\n", __FUNCTION__);
++		return;
++	}
++
++	if (!(av_pes[0] == 'A' && av_pes[1] == 'V')) {
++		printk("%s: invalid AV_PES packet.\n", __FUNCTION__);
++		return;
++	}
++
++	switch (av_pes[2]) {
++
++	case 0x01: {		/* VideoStream */
++			int prebytes = av_pes[5] & 0x03;
++			int postbytes = (av_pes[5] & 0x0c) >> 2;
++			u16 v_pes_payload_length;
++
++			if (dec->v_pes_postbytes > 0 &&
++			    dec->v_pes_postbytes == prebytes) {
++				memcpy(&dec->v_pes[dec->v_pes_length],
++				       &av_pes[12], prebytes);
++
++				if (!down_interruptible(&dec->pes2ts_sem)) {
++					dvb_filter_pes2ts(&dec->v_pes2ts,
++							  dec->v_pes,
++							  dec->v_pes_length +
++							  prebytes);
++
++					up(&dec->pes2ts_sem);
++				}
++			}
++
++			if (av_pes[5] & 0x10) {
++				dec->v_pes[7] = 0x80;
++				dec->v_pes[8] = 0x05;
++
++				dec->v_pes[9] = 0x21 |
++						((av_pes[8] & 0xc0) >> 5);
++				dec->v_pes[10] = ((av_pes[8] & 0x3f) << 2) |
++						 ((av_pes[9] & 0xc0) >> 6);
++				dec->v_pes[11] = 0x01 |
++						 ((av_pes[9] & 0x3f) << 2) |
++						 ((av_pes[10] & 0x80) >> 6);
++				dec->v_pes[12] = ((av_pes[10] & 0x7f) << 1) |
++						 ((av_pes[11] & 0xc0) >> 7);
++				dec->v_pes[13] = 0x01 |
++						 ((av_pes[11] & 0x7f) << 1);
++
++				memcpy(&dec->v_pes[14], &av_pes[12 + prebytes],
++				       length - 16 - prebytes);
++				dec->v_pes_length = 14 + length - 16 - prebytes;
++			} else {
++				dec->v_pes[7] = 0x00;
++				dec->v_pes[8] = 0x00;
++
++				memcpy(&dec->v_pes[9], &av_pes[8], length - 12);
++				dec->v_pes_length = 9 + length - 12;
++			}
++
++			dec->v_pes_postbytes = postbytes;
++
++			if (dec->v_pes[9 + dec->v_pes[8]] == 0x00 &&
++			    dec->v_pes[10 + dec->v_pes[8]] == 0x00 &&
++			    dec->v_pes[11 + dec->v_pes[8]] == 0x01)
++				dec->v_pes[6] = 0x84;
++			else
++				dec->v_pes[6] = 0x80;
++
++			v_pes_payload_length = htons(dec->v_pes_length - 6 +
++						     postbytes);
++			memcpy(&dec->v_pes[4], &v_pes_payload_length, 2);
++
++			if (postbytes == 0) {
++				if (!down_interruptible(&dec->pes2ts_sem)) {
++					dvb_filter_pes2ts(&dec->v_pes2ts,
++							  dec->v_pes,
++							  dec->v_pes_length);
++
++					up(&dec->pes2ts_sem);
++				}
++			}
++
++			break;
++		}
++
++	case 0x02:		/* MainAudioStream */
++		dvb_filter_pes2ts(&dec->a_pes2ts, &av_pes[8], length - 12);
++		break;
++
++	default:
++		printk("%s: unknown AV_PES type: %02x.\n", __FUNCTION__,
++		       av_pes[2]);
++		break;
++
++	}
++}
++
++static void ttusb_dec_process_urb_frame(struct ttusb_dec * dec, u8 * b,
++					int length)
++{
++	while (length) {
++		switch (dec->av_pes_state) {
++
++		case 0:
++		case 1:
++		case 3:
++			if (*b++ == 0xaa) {
++				dec->av_pes_state++;
++				if (dec->av_pes_state == 4)
++					dec->av_pes_length = 0;
++			} else {
++				dec->av_pes_state = 0;
++			}
++
++			length--;
++			break;
++
++		case 2:
++			if (*b++ == 0x00) {
++				dec->av_pes_state++;
++			} else {
++				dec->av_pes_state = 0;
++			}
++
++			length--;
++			break;
++
++		case 4:
++			dec->av_pes[dec->av_pes_length++] = *b++;
++
++			if (dec->av_pes_length == 8) {
++				dec->av_pes_state++;
++				dec->av_pes_payload_length = le16_to_cpup(
++						(u16 *)(dec->av_pes + 6));
++			}
++
++			length--;
++			break;
++
++		case 5: {
++				int remainder = dec->av_pes_payload_length +
++						8 - dec->av_pes_length;
++
++				if (length >= remainder) {
++					memcpy(dec->av_pes + dec->av_pes_length,
++					       b, remainder);
++					dec->av_pes_length += remainder;
++					b += remainder;
++					length -= remainder;
++					dec->av_pes_state++;
++				} else {
++					memcpy(&dec->av_pes[dec->av_pes_length],
++					       b, length);
++					dec->av_pes_length += length;
++					length = 0;
++				}
++
++				break;
++			}
++
++		case 6:
++			dec->av_pes[dec->av_pes_length++] = *b++;
++
++			if (dec->av_pes_length ==
++			    8 + dec->av_pes_payload_length + 4) {
++				ttusb_dec_process_av_pes(dec, dec->av_pes,
++							 dec->av_pes_length);
++				dec->av_pes_state = 0;
++			}
++
++			length--;
++			break;
++
++		default:
++			printk("%s: illegal packet state encountered.\n",
++			       __FUNCTION__);
++			dec->av_pes_state = 0;
++
++		}
++
++	}
++}
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++static void ttusb_dec_process_urb(struct urb *urb)
++#else
++static void ttusb_dec_process_urb(struct urb *urb, struct pt_regs *ptregs)
++#endif
++{
++	struct ttusb_dec *dec = urb->context;
++
++	if (!urb->status) {
++		int i;
++
++		for (i = 0; i < FRAMES_PER_ISO_BUF; i++) {
++			struct usb_iso_packet_descriptor *d;
++			u8 *b;
++			int length;
++
++			d = &urb->iso_frame_desc[i];
++			b = urb->transfer_buffer + d->offset;
++			length = d->actual_length;
++
++			ttusb_dec_process_urb_frame(dec, b, length);
++		}
++	} else {
++		 /* -ENOENT is expected when unlinking urbs */
++		if (urb->status != -ENOENT)
++			dprintk("%s: urb error: %d\n", __FUNCTION__,
++				urb->status);
++	}
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
++	if (dec->iso_stream_count)
++		usb_submit_urb(urb, GFP_KERNEL);
++#endif
++}
++
++static void ttusb_dec_setup_urbs(struct ttusb_dec *dec)
++{
++	int i, j, buffer_offset = 0;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	for (i = 0; i < ISO_BUF_COUNT; i++) {
++		int frame_offset = 0;
++		struct urb *urb = dec->iso_urb[i];
++
++		urb->dev = dec->udev;
++		urb->context = dec;
++		urb->complete = ttusb_dec_process_urb;
++		urb->pipe = dec->stream_pipe;
++		urb->transfer_flags = URB_ISO_ASAP;
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
++		urb->interval = 1;
++#endif
++		urb->number_of_packets = FRAMES_PER_ISO_BUF;
++		urb->transfer_buffer_length = ISO_FRAME_SIZE *
++					      FRAMES_PER_ISO_BUF;
++		urb->transfer_buffer = dec->iso_buffer + buffer_offset;
++		buffer_offset += ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF;
++
++		for (j = 0; j < FRAMES_PER_ISO_BUF; j++) {
++			urb->iso_frame_desc[j].offset = frame_offset;
++			urb->iso_frame_desc[j].length = ISO_FRAME_SIZE;
++			frame_offset += ISO_FRAME_SIZE;
++		}
++	}
++}
++
++static void ttusb_dec_stop_iso_xfer(struct ttusb_dec *dec)
++{
++	int i;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	if (down_interruptible(&dec->iso_sem))
++		return;
++
++	dec->iso_stream_count--;
++
++	if (!dec->iso_stream_count) {
++		u8 b0[] = { 0x00 };
++
++		for (i = 0; i < ISO_BUF_COUNT; i++)
++			usb_unlink_urb(dec->iso_urb[i]);
++
++		ttusb_dec_send_command(dec, 0x81, sizeof(b0), b0, NULL, NULL);
++	}
++
++	up(&dec->iso_sem);
++}
++
++/* Setting the interface of the DEC tends to take down the USB communications
++ * for a short period, so it's important not to call this function just before
++ * trying to talk to it.
++ */
++static void ttusb_dec_set_streaming_interface(struct ttusb_dec *dec)
++{
++	if (!dec->interface) {
++		usb_set_interface(dec->udev, 0, 8);
++		dec->interface = 8;
++	}
++}
++
++static int ttusb_dec_start_iso_xfer(struct ttusb_dec *dec)
++{
++	int i, result;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	if (down_interruptible(&dec->iso_sem))
++		return -EAGAIN;
++
++	if (!dec->iso_stream_count) {
++		u8 b0[] = { 0x05 };
++
++		ttusb_dec_send_command(dec, 0x80, sizeof(b0), b0, NULL, NULL);
++
++		ttusb_dec_setup_urbs(dec);
++
++		for (i = 0; i < ISO_BUF_COUNT; i++) {
++			if ((result = usb_submit_urb(dec->iso_urb[i]
++						    , GFP_KERNEL))) {
++				printk("%s: failed urb submission %d: "
++				       "error %d\n", __FUNCTION__, i, result);
++
++				while (i) {
++					usb_unlink_urb(dec->iso_urb[i - 1]);
++					i--;
++				}
++
++				up(&dec->iso_sem);
++				return result;
++			}
++		}
++
++		dec->av_pes_state = 0;
++		dec->v_pes_postbytes = 0;
++	}
++
++	dec->iso_stream_count++;
++
++	up(&dec->iso_sem);
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++	ttusb_dec_set_streaming_interface(dec);
++#endif
++
++	return 0;
++}
++
++static int ttusb_dec_start_feed(struct dvb_demux_feed *dvbdmxfeed)
++{
++	struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
++	struct ttusb_dec *dec = dvbdmx->priv;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	if (!dvbdmx->dmx.frontend)
++		return -EINVAL;
++
++	dprintk("  pid: 0x%04X\n", dvbdmxfeed->pid);
++
++	switch (dvbdmxfeed->type) {
++
++	case DMX_TYPE_TS:
++		dprintk("  type: DMX_TYPE_TS\n");
++		break;
++
++	case DMX_TYPE_SEC:
++		dprintk("  type: DMX_TYPE_SEC\n");
++		break;
++
++	default:
++		dprintk("  type: unknown (%d)\n", dvbdmxfeed->type);
++		return -EINVAL;
++
++	}
++
++	dprintk("  ts_type:");
++
++	if (dvbdmxfeed->ts_type & TS_DECODER)
++		dprintk(" TS_DECODER");
++
++	if (dvbdmxfeed->ts_type & TS_PACKET)
++		dprintk(" TS_PACKET");
++
++	if (dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY)
++		dprintk(" TS_PAYLOAD_ONLY");
++
++	dprintk("\n");
++
++	switch (dvbdmxfeed->pes_type) {
++
++	case DMX_TS_PES_VIDEO:
++		dprintk("  pes_type: DMX_TS_PES_VIDEO\n");
++		dec->pid[DMX_PES_PCR] = dvbdmxfeed->pid;
++		dec->pid[DMX_PES_VIDEO] = dvbdmxfeed->pid;
++		ttusb_dec_set_pids(dec);
++		break;
++
++	case DMX_TS_PES_AUDIO:
++		dprintk("  pes_type: DMX_TS_PES_AUDIO\n");
++		dec->pid[DMX_PES_AUDIO] = dvbdmxfeed->pid;
++		ttusb_dec_set_pids(dec);
++		break;
++
++	case DMX_TS_PES_TELETEXT:
++		dec->pid[DMX_PES_TELETEXT] = dvbdmxfeed->pid;
++		dprintk("  pes_type: DMX_TS_PES_TELETEXT\n");
++		break;
++
++	case DMX_TS_PES_PCR:
++		dprintk("  pes_type: DMX_TS_PES_PCR\n");
++		dec->pid[DMX_PES_PCR] = dvbdmxfeed->pid;
++		ttusb_dec_set_pids(dec);
++		break;
++
++	case DMX_TS_PES_OTHER:
++		dprintk("  pes_type: DMX_TS_PES_OTHER\n");
++		break;
++
++	default:
++		dprintk("  pes_type: unknown (%d)\n", dvbdmxfeed->pes_type);
++		return -EINVAL;
++
++	}
++
++	ttusb_dec_start_iso_xfer(dec);
++
++	return 0;
++}
++
++static int ttusb_dec_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
++{
++	struct ttusb_dec *dec = dvbdmxfeed->demux->priv;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	ttusb_dec_stop_iso_xfer(dec);
++
++	return 0;
++}
++
++static void ttusb_dec_free_iso_urbs(struct ttusb_dec *dec)
++{
++	int i;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	for (i = 0; i < ISO_BUF_COUNT; i++)
++		if (dec->iso_urb[i])
++			usb_free_urb(dec->iso_urb[i]);
++
++	pci_free_consistent(NULL,
++			    ISO_FRAME_SIZE * (FRAMES_PER_ISO_BUF *
++					      ISO_BUF_COUNT),
++			    dec->iso_buffer, dec->iso_dma_handle);
++}
++
++static int ttusb_dec_alloc_iso_urbs(struct ttusb_dec *dec)
++{
++	int i;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	dec->iso_buffer = pci_alloc_consistent(NULL,
++					       ISO_FRAME_SIZE *
++					       (FRAMES_PER_ISO_BUF *
++						ISO_BUF_COUNT),
++				 	       &dec->iso_dma_handle);
++
++	memset(dec->iso_buffer, 0,
++	       sizeof(ISO_FRAME_SIZE * (FRAMES_PER_ISO_BUF * ISO_BUF_COUNT)));
++
++	for (i = 0; i < ISO_BUF_COUNT; i++) {
++		struct urb *urb;
++
++		if (!(urb = usb_alloc_urb(FRAMES_PER_ISO_BUF, GFP_KERNEL))) {
++			ttusb_dec_free_iso_urbs(dec);
++			return -ENOMEM;
++		}
++
++		dec->iso_urb[i] = urb;
++	}
++
++	ttusb_dec_setup_urbs(dec);
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++	for (i = 0; i < ISO_BUF_COUNT; i++) {
++		int next = (i + 1) % ISO_BUF_COUNT;
++		dec->iso_urb[i]->next = dec->iso_urb[next];
++	}
++#endif
++
++	return 0;
++}
++
++static void ttusb_dec_init_v_pes(struct ttusb_dec *dec)
++{
++	dprintk("%s\n", __FUNCTION__);
++
++	dec->v_pes[0] = 0x00;
++	dec->v_pes[1] = 0x00;
++	dec->v_pes[2] = 0x01;
++	dec->v_pes[3] = 0xe0;
++}
++
++static void ttusb_dec_init_usb(struct ttusb_dec *dec)
++{
++	dprintk("%s\n", __FUNCTION__);
++
++	sema_init(&dec->usb_sem, 1);
++	sema_init(&dec->iso_sem, 1);
++
++	dec->command_pipe = usb_sndbulkpipe(dec->udev, COMMAND_PIPE);
++	dec->result_pipe = usb_rcvbulkpipe(dec->udev, RESULT_PIPE);
++	dec->stream_pipe = usb_rcvisocpipe(dec->udev, STREAM_PIPE);
++
++	ttusb_dec_alloc_iso_urbs(dec);
++}
++
++#include "dsp_dec2000.h"
++
++static int ttusb_dec_boot_dsp(struct ttusb_dec *dec)
++{
++	int i, j, actual_len, result, size, trans_count;
++	u8 b0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xc8, 0x61,
++		    0x00 };
++	u8 b1[] = { 0x61 };
++	u8 b[ARM_PACKET_SIZE];
++	u32 dsp_length = htonl(sizeof(dsp_dec2000));
++
++	dprintk("%s\n", __FUNCTION__);
++
++	memcpy(b0, &dsp_length, 4);
++
++	result = ttusb_dec_send_command(dec, 0x41, sizeof(b0), b0, NULL, NULL);
++
++	if (result)
++		return result;
++
++	trans_count = 0;
++	j = 0;
++
++	for (i = 0; i < sizeof(dsp_dec2000); i += COMMAND_PACKET_SIZE) {
++		size = sizeof(dsp_dec2000) - i;
++		if (size > COMMAND_PACKET_SIZE)
++			size = COMMAND_PACKET_SIZE;
++
++		b[j + 0] = 0xaa;
++		b[j + 1] = trans_count++;
++		b[j + 2] = 0xf0;
++		b[j + 3] = size;
++		memcpy(&b[j + 4], &dsp_dec2000[i], size);
++
++		j += COMMAND_PACKET_SIZE + 4;
++
++		if (j >= ARM_PACKET_SIZE) {
++			result = usb_bulk_msg(dec->udev, dec->command_pipe, b,
++					      ARM_PACKET_SIZE, &actual_len,
++					      HZ / 10);
++			j = 0;
++		} else if (size < COMMAND_PACKET_SIZE) {
++			result = usb_bulk_msg(dec->udev, dec->command_pipe, b,
++					      j - COMMAND_PACKET_SIZE + size,
++					      &actual_len, HZ / 10);
++		}
++	}
++
++	result = ttusb_dec_send_command(dec, 0x43, sizeof(b1), b1, NULL, NULL);
++
++	return result;
++}
++
++static void ttusb_dec_init_stb(struct ttusb_dec *dec)
++{
++	u8 c[COMMAND_PACKET_SIZE];
++	int c_length;
++	int result;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	result = ttusb_dec_send_command(dec, 0x08, 0, NULL, &c_length, c);
++
++	if (!result)
++		if (c_length != 0x0c || (c_length == 0x0c && c[9] != 0x63))
++			ttusb_dec_boot_dsp(dec);
++}
++
++static int ttusb_dec_init_dvb(struct ttusb_dec *dec)
++{
++	int result;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	if ((result = dvb_register_adapter(&dec->adapter, "dec2000")) < 0) {
++		printk("%s: dvb_register_adapter failed: error %d\n",
++		       __FUNCTION__, result);
++
++		return result;
++	}
++
++	if (!(dec->i2c_bus = dvb_register_i2c_bus(ttusb_dec_i2c_master_xfer,
++						  dec, dec->adapter, 0))) {
++		printk("%s: dvb_register_i2c_bus failed\n", __FUNCTION__);
++
++		dvb_unregister_adapter(dec->adapter);
++
++		return -ENOMEM;
++	}
++
++	dec->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING;
++
++	dec->demux.priv = (void *)dec;
++	dec->demux.filternum = 31;
++	dec->demux.feednum = 31;
++	dec->demux.start_feed = ttusb_dec_start_feed;
++	dec->demux.stop_feed = ttusb_dec_stop_feed;
++	dec->demux.write_to_decoder = NULL;
++
++	if ((result = dvb_dmx_init(&dec->demux)) < 0) {
++		printk("%s: dvb_dmx_init failed: error %d\n", __FUNCTION__,
++		       result);
++
++		dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
++				       0);
++		dvb_unregister_adapter(dec->adapter);
++
++		return result;
++	}
++
++	dec->dmxdev.filternum = 32;
++	dec->dmxdev.demux = &dec->demux.dmx;
++	dec->dmxdev.capabilities = 0;
++
++	if ((result = dvb_dmxdev_init(&dec->dmxdev, dec->adapter)) < 0) {
++		printk("%s: dvb_dmxdev_init failed: error %d\n",
++		       __FUNCTION__, result);
++
++		dvb_dmx_release(&dec->demux);
++		dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
++				       0);
++		dvb_unregister_adapter(dec->adapter);
++
++		return result;
++	}
++
++	dec->frontend.source = DMX_FRONTEND_0;
++
++	if ((result = dec->demux.dmx.add_frontend(&dec->demux.dmx,
++						  &dec->frontend)) < 0) {
++		printk("%s: dvb_dmx_init failed: error %d\n", __FUNCTION__,
++		       result);
++
++		dvb_dmxdev_release(&dec->dmxdev);
++		dvb_dmx_release(&dec->demux);
++		dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
++				       0);
++		dvb_unregister_adapter(dec->adapter);
++
++		return result;
++	}
++
++	if ((result = dec->demux.dmx.connect_frontend(&dec->demux.dmx,
++						      &dec->frontend)) < 0) {
++		printk("%s: dvb_dmx_init failed: error %d\n", __FUNCTION__,
++		       result);
++
++		dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend);
++		dvb_dmxdev_release(&dec->dmxdev);
++		dvb_dmx_release(&dec->demux);
++		dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
++				       0);
++		dvb_unregister_adapter(dec->adapter);
++
++		return result;
++	}
++
++	sema_init(&dec->pes2ts_sem, 1);
++
++	dvb_net_init(dec->adapter, &dec->dvb_net, &dec->demux.dmx);
++
++	return 0;
++}
++
++static void ttusb_dec_exit_dvb(struct ttusb_dec *dec)
++{
++	dprintk("%s\n", __FUNCTION__);
++
++	dvb_net_release(&dec->dvb_net);
++	dec->demux.dmx.close(&dec->demux.dmx);
++	dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend);
++	dvb_dmxdev_release(&dec->dmxdev);
++	dvb_dmx_release(&dec->demux);
++	dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter, 0);
++	dvb_unregister_adapter(dec->adapter);
++}
++
++static void ttusb_dec_exit_usb(struct ttusb_dec *dec)
++{
++	int i;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	dec->iso_stream_count = 0;
++
++	for (i = 0; i < ISO_BUF_COUNT; i++)
++		usb_unlink_urb(dec->iso_urb[i]);
++
++	ttusb_dec_free_iso_urbs(dec);
++}
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++static void *ttusb_dec_probe(struct usb_device *udev, unsigned int ifnum,
++			     const struct usb_device_id *id)
++{
++	struct ttusb_dec *dec;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	if (ifnum != 0)
++		return NULL;
++
++	if (!(dec = kmalloc(sizeof(struct ttusb_dec), GFP_KERNEL))) {
++		printk("%s: couldn't allocate memory.\n", __FUNCTION__);
++		return NULL;
++	}
++
++	memset(dec, 0, sizeof(struct ttusb_dec));
++
++	dec->udev = udev;
++
++	ttusb_dec_init_usb(dec);
++	ttusb_dec_init_stb(dec);
++	ttusb_dec_init_dvb(dec);
++	ttusb_dec_init_v_pes(dec);
++
++	return (void *)dec;
++}
++#else
++static int ttusb_dec_probe(struct usb_interface *intf,
++			   const struct usb_device_id *id)
++{
++	struct usb_device *udev;
++	struct ttusb_dec *dec;
++
++	dprintk("%s\n", __FUNCTION__);
++
++	udev = interface_to_usbdev(intf);
++
++	if (!(dec = kmalloc(sizeof(struct ttusb_dec), GFP_KERNEL))) {
++		printk("%s: couldn't allocate memory.\n", __FUNCTION__);
++		return -ENOMEM;
++	}
++
++	memset(dec, 0, sizeof(struct ttusb_dec));
++
++	dec->udev = udev;
++
++	ttusb_dec_init_usb(dec);
++	ttusb_dec_init_stb(dec);
++	ttusb_dec_init_dvb(dec);
++	ttusb_dec_init_v_pes(dec);
++
++	usb_set_intfdata(intf, (void *)dec);
++	ttusb_dec_set_streaming_interface(dec);
++
++	return 0;
++}
++#endif
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++static void ttusb_dec_disconnect(struct usb_device *udev, void *data)
++{
++	struct ttusb_dec *dec = data;
++#else
++static void ttusb_dec_disconnect(struct usb_interface *intf)
++{
++	struct ttusb_dec *dec = usb_get_intfdata(intf);
++
++	usb_set_intfdata(intf, NULL);
++#endif
++
++	dprintk("%s\n", __FUNCTION__);
++
++	ttusb_dec_exit_usb(dec);
++	ttusb_dec_exit_dvb(dec);
++
++	kfree(dec);
++}
++
++static struct usb_device_id ttusb_dec_table[] = {
++	{USB_DEVICE(0x0b48, 0x1006)},	/* Unconfirmed */
++	{USB_DEVICE(0x0b48, 0x1007)},	/* Unconfirmed */
++	{USB_DEVICE(0x0b48, 0x1008)},	/* DEC 2000 t */
++	{}
++};
++
++static struct usb_driver ttusb_dec_driver = {
++      name:		DRIVER_NAME,
++      probe:		ttusb_dec_probe,
++      disconnect:	ttusb_dec_disconnect,
++      id_table:		ttusb_dec_table,
++};
++
++static int __init ttusb_dec_init(void)
++{
++	int result;
++
++	if ((result = usb_register(&ttusb_dec_driver)) < 0) {
++		printk("%s: initialisation failed: error %d.\n", __FUNCTION__,
++		       result);
++		return result;
++	}
++
++	return 0;
++}
++
++static void __exit ttusb_dec_exit(void)
++{
++	usb_deregister(&ttusb_dec_driver);
++}
++
++module_init(ttusb_dec_init);
++module_exit(ttusb_dec_exit);
++
++MODULE_AUTHOR("Alex Woods <linux-dvb@giblets.org>");
++MODULE_DESCRIPTION(DRIVER_NAME);
++MODULE_LICENSE("GPL");
++MODULE_DEVICE_TABLE(usb, ttusb_dec_table);
++
++MODULE_PARM(debug, "i");
++MODULE_PARM_DESC(debug, "Debug level");
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-dec/ttusb_dec.h	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,87 @@
++/*
++ * TTUSB DEC Driver
++ *
++ * Copyright (C) 2003 Alex Woods <linux-dvb@giblets.org>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++#ifndef _TTUSB_DEC_H
++#define _TTUSB_DEC_H
++
++#include "asm/semaphore.h"
++#include "dmxdev.h"
++#include "dvb_demux.h"
++#include "dvb_filter.h"
++#include "dvb_i2c.h"
++#include "dvb_net.h"
++
++#define DRIVER_NAME		"TechnoTrend/Hauppauge DEC USB"
++
++#define COMMAND_PIPE		0x03
++#define RESULT_PIPE		0x84
++#define STREAM_PIPE		0x88
++
++#define COMMAND_PACKET_SIZE	0x3c
++#define ARM_PACKET_SIZE		0x1000
++
++#define ISO_BUF_COUNT		0x04
++#define FRAMES_PER_ISO_BUF	0x04
++#define ISO_FRAME_SIZE		0x0380
++
++#define	MAX_AV_PES_LENGTH	6144
++
++struct ttusb_dec {
++	/* DVB bits */
++	struct dvb_adapter	*adapter;
++	struct dmxdev		dmxdev;
++	struct dvb_demux	demux;
++	struct dmx_frontend	frontend;
++	struct dvb_i2c_bus	*i2c_bus;
++	struct dvb_net		dvb_net;
++
++	u16			pid[DMX_PES_OTHER];
++
++	/* USB bits */
++	struct usb_device	*udev;
++	u8			trans_count;
++	unsigned int		command_pipe;
++	unsigned int		result_pipe;
++	unsigned int		stream_pipe;
++	int			interface;
++	struct semaphore	usb_sem;
++
++	void			*iso_buffer;
++	dma_addr_t		iso_dma_handle;
++	struct urb		*iso_urb[ISO_BUF_COUNT];
++	int			iso_stream_count;
++	struct semaphore	iso_sem;
++
++	u8			av_pes[MAX_AV_PES_LENGTH + 4];
++	int			av_pes_state;
++	int			av_pes_length;
++	int			av_pes_payload_length;
++
++	struct dvb_filter_pes2ts	a_pes2ts;
++	struct dvb_filter_pes2ts	v_pes2ts;
++	struct semaphore		pes2ts_sem;
++
++	u8			v_pes[16 + MAX_AV_PES_LENGTH];
++	int			v_pes_length;
++	int			v_pes_postbytes;
++};
++
++#endif
+--- linux-2.6.0-test1/drivers/media/video/dpc7146.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/video/dpc7146.c	2003-07-19 17:03:50.000000000 -0700
+@@ -173,6 +173,8 @@ static int dpc_init_done(struct saa7146_
+ 	return 0;
+ }
+ 
++static struct saa7146_ext_vv vv_data;
++
+ /* this function only gets called when the probing was successful */
+ static int dpc_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_data *info)
+ {
+@@ -183,7 +185,7 @@ static int dpc_attach(struct saa7146_dev
+ 	/* checking for i2c-devices can be omitted here, because we
+ 	   already did this in "dpc_vl42_probe" */
+ 
+-	saa7146_vv_init(dev);
++	saa7146_vv_init(dev,&vv_data);
+ 	if( 0 != saa7146_register_device(&dpc->video_dev, dev, "dpc", VFL_TYPE_GRABBER)) {
+ 		ERR(("cannot register capture v4l2 device. skipping.\n"));
+ 		return -1;
+@@ -246,8 +248,9 @@ int dpc_vbi_bypass(struct saa7146_dev* d
+ }
+ #endif
+ 
+-static int dpc_ioctl(struct saa7146_dev *dev, unsigned int cmd, void *arg) 
++static int dpc_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) 
+ {
++	struct saa7146_dev *dev = fh->dev;
+ 	struct dpc* dpc = (struct dpc*)dev->ext_priv;
+ /*
+ 	struct saa7146_vv *vv = dev->vv_data; 
+@@ -307,23 +310,32 @@ static int std_callback(struct saa7146_d
+ }
+ 
+ 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 },
++	{
++		.name	= "PAL", 	.id	= V4L2_STD_PAL,
++		.v_offset	= 0x17,	.v_field 	= 288,	.v_calc		= 576,
++		.h_offset	= 0x14,	.h_pixels 	= 680,	.h_calc		= 680+1,
++		.v_max_out	= 576,	.h_max_out	= 768,
++	}, {
++		.name	= "NTSC", 	.id	= V4L2_STD_NTSC,
++		.v_offset	= 0x16,	.v_field 	= 240,	.v_calc		= 480,
++		.h_offset	= 0x06,	.h_pixels 	= 708,	.h_calc		= 708+1,
++		.v_max_out	= 480,	.h_max_out	= 640,
++	}, {
++		.name	= "SECAM", 	.id	= V4L2_STD_SECAM,
++		.v_offset	= 0x14,	.v_field 	= 288,	.v_calc		= 576,
++		.h_offset	= 0x14,	.h_pixels 	= 720,	.h_calc		= 720+1,
++		.v_max_out	= 576,	.h_max_out	= 768,
++	}
+ };
+ 
+-static
+-struct saa7146_extension extension;
++static struct saa7146_extension extension;
+ 
+-static
+-struct saa7146_pci_extension_data dpc = {
++static struct saa7146_pci_extension_data dpc = {
+         .ext_priv = "Multimedia eXtension Board",
+         .ext = &extension,
+ };
+ 
+-static
+-struct pci_device_id pci_tbl[] = {
++static struct pci_device_id pci_tbl[] = {
+ 	{
+ 		.vendor    = PCI_VENDOR_ID_PHILIPS,
+ 		.device	   = PCI_DEVICE_ID_PHILIPS_SAA7146,
+@@ -337,8 +349,7 @@ struct pci_device_id pci_tbl[] = {
+ 
+ MODULE_DEVICE_TABLE(pci, pci_tbl);
+ 
+-static
+-struct saa7146_ext_vv vv_data = {
++static struct saa7146_ext_vv vv_data = {
+ 	.inputs		= DPC_INPUTS,
+ 	.capabilities	= V4L2_CAP_VBI_CAPTURE,
+ 	.stds		= &standard[0],
+@@ -348,14 +359,12 @@ struct saa7146_ext_vv vv_data = {
+ 	.ioctl		= dpc_ioctl,
+ };
+ 
+-static
+-struct saa7146_extension extension = {
++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,
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/video/hexium_gemini.c	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,411 @@
++/*
++    hexium_gemini.c - v4l2 driver for Hexium Gemini frame grabber cards
++               
++    Visit http://www.mihu.de/linux/saa7146/ and follow the link
++    to "hexium" for further details about this card.
++    
++    Copyright (C) 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>
++
++static int debug = 255;
++MODULE_PARM(debug, "i");
++MODULE_PARM_DESC(debug, "debug verbosity");
++
++/* global variables */
++int hexium_num = 0;
++
++#include "hexium_gemini.h"
++
++/* 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 hexium_init_done(struct saa7146_dev *dev)
++{
++	struct hexium *hexium = (struct hexium *) dev->ext_priv;
++	union i2c_smbus_data data;
++	int i = 0;
++
++	DEB_D(("hexium_init_done called.\n"));
++
++	/* initialize the helper ics to useful values */
++	for (i = 0; i < sizeof(hexium_ks0127b); i++) {
++		data.byte = hexium_ks0127b[i];
++		if (0 != i2c_smbus_xfer(&hexium->i2c_adapter, 0x6c, 0, I2C_SMBUS_WRITE, i, I2C_SMBUS_BYTE_DATA, &data)) {
++			printk("failed for address 0x%02x\n", i);
++		}
++	}
++
++	return 0;
++}
++
++static int hexium_set_input(struct hexium *hexium, int input)
++{
++	union i2c_smbus_data data;
++
++	DEB_D((".\n"));
++
++	data.byte = hexium_input_select[input].byte;
++	if (0 != i2c_smbus_xfer(&hexium->i2c_adapter, 0x6c, 0, I2C_SMBUS_WRITE, hexium_input_select[input].adr, I2C_SMBUS_BYTE_DATA, &data)) {
++		return -1;
++	}
++
++	return 0;
++}
++
++static int hexium_set_standard(struct hexium *hexium, struct hexium_data *vdec)
++{
++	union i2c_smbus_data data;
++	int i = 0;
++
++	DEB_D((".\n"));
++
++	while (vdec[i].adr != -1) {
++		data.byte = vdec[i].byte;
++		if (0 != i2c_smbus_xfer(&hexium->i2c_adapter, 0x6c, 0, I2C_SMBUS_WRITE, vdec[i].adr, I2C_SMBUS_BYTE_DATA, &data)) {
++			printk("failed for address 0x%02x\n", i);
++			return -1;
++		}
++		i++;
++	}
++	return 0;
++}
++
++static struct saa7146_ext_vv vv_data;
++
++/* this function only gets called when the probing was successful */
++static int hexium_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_data *info)
++{
++	struct hexium *hexium = (struct hexium *) dev->ext_priv;
++
++	DEB_EE((".\n"));
++
++	hexium = (struct hexium *) kmalloc(sizeof(struct hexium), GFP_KERNEL);
++	if (NULL == hexium) {
++		printk("hexium_v4l2.o: hexium_probe: not enough kernel memory.\n");
++		return -ENOMEM;
++	}
++	memset(hexium, 0x0, sizeof(struct hexium));
++	(struct hexium *) dev->ext_priv = hexium;
++
++	/* FIXME: enable i2c-port pins, video-port-pins
++	   video port pins should be enabled here ?! */
++	saa7146_write(dev, MC1, (MASK_08 | MASK_24 | MASK_10 | MASK_26));
++
++	saa7146_i2c_adapter_prepare(dev, &hexium->i2c_adapter, SAA7146_I2C_BUS_BIT_RATE_480);
++	if (i2c_add_adapter(&hexium->i2c_adapter) < 0) {
++		DEB_S(("cannot register i2c-device. skipping.\n"));
++		kfree(hexium);
++		return -EFAULT;
++	}
++
++	/*  set HWControl GPIO number 2 */
++	saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTHI);
++
++	saa7146_write(dev, DD1_INIT, 0x07000700);
++	saa7146_write(dev, DD1_STREAM_B, 0x00000000);
++	saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
++
++	/* the rest */
++	hexium->cur_input = 0;
++	hexium_init_done(dev);
++
++	hexium_set_standard(hexium, hexium_pal);
++	hexium->cur_std = V4L2_STD_PAL;
++
++	hexium_set_input(hexium, 0);
++	hexium->cur_input = 0;
++
++	saa7146_vv_init(dev, &vv_data);
++	if (0 != saa7146_register_device(&hexium->video_dev, dev, "hexium", VFL_TYPE_GRABBER)) {
++		ERR(("cannot register capture v4l2 device. skipping.\n"));
++		return -1;
++	}
++
++	printk("hexium: found 'hexium frame grabber'-%d.\n", hexium_num);
++	hexium_num++;
++
++	return 0;
++}
++
++static int hexium_detach(struct saa7146_dev *dev)
++{
++	struct hexium *hexium = (struct hexium *) dev->ext_priv;
++
++	DEB_EE(("dev:%p\n", dev));
++
++	saa7146_unregister_device(&hexium->video_dev, dev);
++	saa7146_vv_release(dev);
++
++	hexium_num--;
++
++	i2c_del_adapter(&hexium->i2c_adapter);
++	kfree(hexium);
++	return 0;
++}
++
++static int hexium_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg)
++{
++	struct saa7146_dev *dev = fh->dev;
++	struct hexium *hexium = (struct hexium *) 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 >= HEXIUM_INPUTS) {
++				return -EINVAL;
++			}
++
++			memcpy(i, &hexium_inputs[i->index], sizeof(struct v4l2_input));
++
++			DEB_D(("v4l2_ioctl: VIDIOC_ENUMINPUT %d.\n", i->index));
++			return 0;
++		}
++	case VIDIOC_G_INPUT:
++		{
++			int *input = (int *) arg;
++			*input = hexium->cur_input;
++
++			DEB_D(("VIDIOC_G_INPUT: %d\n", *input));
++			return 0;
++		}
++	case VIDIOC_S_INPUT:
++		{
++			int input = *(int *) arg;
++
++			DEB_EE(("VIDIOC_S_INPUT %d.\n", input));
++
++			if (input < 0 || input >= HEXIUM_INPUTS) {
++				return -EINVAL;
++			}
++
++			hexium->cur_input = input;
++			hexium_set_input(hexium, 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 = HEXIUM_CONTROLS - 1; i >= 0; i--) {
++				if (hexium_controls[i].id == qc->id) {
++					*qc = hexium_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 = HEXIUM_CONTROLS - 1; i >= 0; i--) {
++				if (hexium_controls[i].id == vc->id) {
++					break;
++				}
++			}
++
++			if (i < 0) {
++				return -EAGAIN;
++			}
++
++			switch (vc->id) {
++			case V4L2_CID_PRIVATE_BASE:{
++					vc->value = hexium->cur_bw;
++					DEB_D(("VIDIOC_G_CTRL BW:%d.\n", vc->value));
++					return 0;
++				}
++			}
++			return -EINVAL;
++		}
++
++	case VIDIOC_S_CTRL:
++		{
++			struct v4l2_control *vc = arg;
++			int i = 0;
++
++			for (i = HEXIUM_CONTROLS - 1; i >= 0; i--) {
++				if (hexium_controls[i].id == vc->id) {
++					break;
++				}
++			}
++
++			if (i < 0) {
++				return -EAGAIN;
++			}
++
++			switch (vc->id) {
++			case V4L2_CID_PRIVATE_BASE:{
++					hexium->cur_bw = vc->value;
++					break;
++				}
++			}
++
++			DEB_D(("VIDIOC_S_CTRL BW:%d.\n", hexium->cur_bw));
++
++			if (0 == hexium->cur_bw && V4L2_STD_PAL == hexium->cur_std) {
++				hexium_set_standard(hexium, hexium_pal);
++				return 0;
++			}
++			if (0 == hexium->cur_bw && V4L2_STD_NTSC == hexium->cur_std) {
++				hexium_set_standard(hexium, hexium_ntsc);
++				return 0;
++			}
++			if (0 == hexium->cur_bw && V4L2_STD_SECAM == hexium->cur_std) {
++				hexium_set_standard(hexium, hexium_secam);
++				return 0;
++			}
++			if (1 == hexium->cur_bw && V4L2_STD_PAL == hexium->cur_std) {
++				hexium_set_standard(hexium, hexium_pal_bw);
++				return 0;
++			}
++			if (1 == hexium->cur_bw && V4L2_STD_NTSC == hexium->cur_std) {
++				hexium_set_standard(hexium, hexium_ntsc_bw);
++				return 0;
++			}
++			if (1 == hexium->cur_bw && V4L2_STD_SECAM == hexium->cur_std) {
++				/* fixme: is there no bw secam mode? */
++				return -EINVAL;
++			}
++
++			return -EINVAL;
++		}
++	default:
++/*
++		DEB_D(("v4l2_ioctl does not handle this ioctl.\n"));
++*/
++		return -ENOIOCTLCMD;
++	}
++	return 0;
++}
++
++static int std_callback(struct saa7146_dev *dev, struct saa7146_standard *std)
++{
++	struct hexium *hexium = (struct hexium *) dev->ext_priv;
++
++	if (V4L2_STD_PAL == std->id) {
++		hexium_set_standard(hexium, hexium_pal);
++		hexium->cur_std = V4L2_STD_PAL;
++		return 0;
++	} else if (V4L2_STD_NTSC == std->id) {
++		hexium_set_standard(hexium, hexium_ntsc);
++		hexium->cur_std = V4L2_STD_NTSC;
++		return 0;
++	} else if (V4L2_STD_SECAM == std->id) {
++		hexium_set_standard(hexium, hexium_secam);
++		hexium->cur_std = V4L2_STD_SECAM;
++		return 0;
++	}
++
++	return -1;
++}
++
++static struct saa7146_extension hexium_extension;
++
++static struct saa7146_pci_extension_data hexium_gemini_4bnc = {
++	.ext_priv = "Hexium Gemini (4 BNC)",
++	.ext = &hexium_extension,
++};
++
++static struct saa7146_pci_extension_data hexium_gemini_dual_4bnc = {
++	.ext_priv = "Hexium Gemini Dual (4 BNC)",
++	.ext = &hexium_extension,
++};
++
++static struct pci_device_id pci_tbl[] = {
++	{
++	 .vendor = PCI_VENDOR_ID_PHILIPS,
++	 .device = PCI_DEVICE_ID_PHILIPS_SAA7146,
++	 .subvendor = 0x17c8,
++	 .subdevice = 0x2401,
++	 .driver_data = (unsigned long) &hexium_gemini_4bnc,
++	 },
++	{
++	 .vendor = PCI_VENDOR_ID_PHILIPS,
++	 .device = PCI_DEVICE_ID_PHILIPS_SAA7146,
++	 .subvendor = 0x17c8,
++	 .subdevice = 0x2402,
++	 .driver_data = (unsigned long) &hexium_gemini_dual_4bnc,
++	 },
++	{
++	 .vendor = 0,
++	 }
++};
++
++MODULE_DEVICE_TABLE(pci, pci_tbl);
++
++static struct saa7146_ext_vv vv_data = {
++	.inputs = HEXIUM_INPUTS,
++	.capabilities = 0,
++	.stds = &hexium_standards[0],
++	.num_stds = sizeof(hexium_standards) / sizeof(struct saa7146_standard),
++	.std_callback = &std_callback,
++	.ioctls = &ioctls[0],
++	.ioctl = hexium_ioctl,
++};
++
++static struct saa7146_extension hexium_extension = {
++	.name = "hexium gemini",
++	.flags = SAA7146_USE_I2C_IRQ,
++
++	.pci_tbl = &pci_tbl[0],
++	.module = THIS_MODULE,
++
++	.attach = hexium_attach,
++	.detach = hexium_detach,
++
++	.irq_mask = 0,
++	.irq_func = NULL,
++};
++
++int __init hexium_init_module(void)
++{
++	if (0 != saa7146_register_extension(&hexium_extension)) {
++		DEB_S(("failed to register extension.\n"));
++		return -ENODEV;
++	}
++
++	return 0;
++}
++
++void __exit hexium_cleanup_module(void)
++{
++	saa7146_unregister_extension(&hexium_extension);
++}
++
++module_init(hexium_init_module);
++module_exit(hexium_cleanup_module);
++
++MODULE_DESCRIPTION("video4linux-2 driver for Hexium Gemini frame grabber cards");
++MODULE_AUTHOR("Michael Hunold <michael@mihu.de>");
++MODULE_LICENSE("GPL");
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/video/hexium_gemini.h	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,103 @@
++#ifndef __HEXIUM_GEMINI__
++#define __HEXIUM_GEMINI__
++
++#include "hexium.h"
++
++static struct saa7146_extension_ioctls ioctls[] = {
++	{ VIDIOC_G_INPUT,	SAA7146_EXCLUSIVE },
++	{ VIDIOC_S_INPUT,	SAA7146_EXCLUSIVE },
++	{ VIDIOC_QUERYCTRL, 	SAA7146_BEFORE },
++	{ VIDIOC_ENUMINPUT, 	SAA7146_EXCLUSIVE },
++	{ VIDIOC_S_STD,		SAA7146_AFTER },
++	{ VIDIOC_G_CTRL,	SAA7146_BEFORE },
++	{ VIDIOC_S_CTRL,	SAA7146_BEFORE },
++	{ 0,			0 }
++};
++
++#define HEXIUM_CONTROLS	1
++static struct v4l2_queryctrl hexium_controls[] = {
++	{ V4L2_CID_PRIVATE_BASE, V4L2_CTRL_TYPE_BOOLEAN, "B/W", 0, 1, 1, 0, 0 },
++};
++
++#define HEXIUM_GEMUINI_V_1_0		1
++#define HEXIUM_GEMUINI_DUAL_V_1_0	2
++
++struct hexium
++{
++	int type;
++	struct video_device	video_dev;
++	struct i2c_adapter	i2c_adapter;
++		
++	int 		cur_input;	/* current input */
++	v4l2_std_id 	cur_std;	/* current standard */
++	int		cur_bw;		/* current black/white status */
++};
++
++/* Samsung KS0127B decoder default registers */
++static u8 hexium_ks0127b[0x100]={
++/*00*/ 0x00,0x52,0x30,0x40,0x01,0x0C,0x2A,0x10,
++/*08*/ 0x00,0x00,0x00,0x60,0x00,0x00,0x0F,0x06,
++/*10*/ 0x00,0x00,0xE4,0xC0,0x00,0x00,0x00,0x00,
++/*18*/ 0x14,0x9B,0xFE,0xFF,0xFC,0xFF,0x03,0x22,
++/*20*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*28*/ 0x00,0x00,0x00,0x00,0x00,0x2C,0x9B,0x00,
++/*30*/ 0x00,0x00,0x10,0x80,0x80,0x10,0x80,0x80,
++/*38*/ 0x01,0x04,0x00,0x00,0x00,0x29,0xC0,0x00,
++/*40*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*48*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*50*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*58*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*60*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*68*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*70*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*78*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*80*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*88*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*90*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*98*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*A0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*A8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*B0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*B8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*C0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*C8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*D0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*D8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*E0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*E8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*F0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*F8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
++};
++
++static struct hexium_data hexium_pal[] = {
++	{ 0x01, 0x52 }, { 0x12, 0x64 }, { 0x2D, 0x2C }, { 0x2E, 0x9B }, { -1 , 0xFF }
++};
++
++static struct hexium_data hexium_pal_bw[] = {
++	{ 0x01, 0x52 },	{ 0x12, 0x64 },	{ 0x2D, 0x2C },	{ 0x2E, 0x9B },	{ -1 , 0xFF }
++};
++
++static struct hexium_data hexium_ntsc[] = {
++	{ 0x01, 0x53 }, { 0x12, 0x04 }, { 0x2D, 0x23 }, { 0x2E, 0x81 }, { -1 , 0xFF }
++};
++
++static struct hexium_data hexium_ntsc_bw[] = {
++	{ 0x01, 0x53 }, { 0x12, 0x04 }, { 0x2D, 0x23 }, { 0x2E, 0x81 }, { -1 , 0xFF }
++};
++
++static struct hexium_data hexium_secam[] = {
++	{ 0x01, 0x52 }, { 0x12, 0x64 }, { 0x2D, 0x2C }, { 0x2E, 0x9B }, { -1 , 0xFF }
++};
++
++static struct hexium_data hexium_input_select[] = {
++	{ 0x02, 0x60 },
++	{ 0x02, 0x64 },
++	{ 0x02, 0x61 },
++	{ 0x02, 0x65 },
++	{ 0x02, 0x62 },
++	{ 0x02, 0x66 },
++	{ 0x02, 0x68 },
++	{ 0x02, 0x69 },
++	{ 0x02, 0x6A },
++};
++#endif
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/video/hexium.h	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,51 @@
++#ifndef __HEXIUM__
++#define __HEXIUM__
++
++#define HEXIUM_HV_PCI6_ORION		1
++#define HEXIUM_ORION_1SVHS_3BNC		2
++#define HEXIUM_ORION_4BNC		3
++#define HEXIUM_GEMUINI			4
++#define HEXIUM_GEMUINI_DUAL		5
++
++static struct saa7146_standard hexium_standards[] = {
++	{
++		.name	= "PAL", 	.id	= V4L2_STD_PAL,
++		.v_offset	= 0x17,	.v_field 	= 288,	.v_calc		= 576,
++		.h_offset	= 0x14,	.h_pixels 	= 680,	.h_calc		= 680+1,
++		.v_max_out	= 576,	.h_max_out	= 768,
++	}, {
++		.name	= "NTSC", 	.id	= V4L2_STD_NTSC,
++		.v_offset	= 0x17,	.v_field 	= 240,	.v_calc		= 480,
++		.h_offset	= 0x06,	.h_pixels 	= 640,	.h_calc		= 641+1,
++		.v_max_out	= 480,	.h_max_out	= 640,
++	}, {
++		.name	= "SECAM", 	.id	= V4L2_STD_SECAM,
++		.v_offset	= 0x14,	.v_field 	= 288,	.v_calc		= 576,
++		.h_offset	= 0x14,	.h_pixels 	= 720,	.h_calc		= 720+1,
++		.v_max_out	= 576,	.h_max_out	= 768,
++	}
++};		
++
++
++#define HEXIUM_INPUTS	9
++static struct v4l2_input hexium_inputs[HEXIUM_INPUTS] = {
++	{ 0, "CVBS 1",	V4L2_INPUT_TYPE_CAMERA,	2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++	{ 1, "CVBS 2",	V4L2_INPUT_TYPE_CAMERA,	2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++	{ 2, "CVBS 3",	V4L2_INPUT_TYPE_CAMERA,	2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++	{ 3, "CVBS 4",	V4L2_INPUT_TYPE_CAMERA,	2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++	{ 4, "CVBS 5",	V4L2_INPUT_TYPE_CAMERA,	2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++	{ 5, "CVBS 6",	V4L2_INPUT_TYPE_CAMERA,	2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++	{ 6, "Y/C 1",	V4L2_INPUT_TYPE_CAMERA,	2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++	{ 7, "Y/C 2",	V4L2_INPUT_TYPE_CAMERA,	2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++	{ 8, "Y/C 3",	V4L2_INPUT_TYPE_CAMERA,	2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++};
++
++#define HEXIUM_AUDIOS	0
++
++struct hexium_data
++{
++	s8 adr;
++	u8 byte;
++};
++
++#endif
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/video/hexium_orion.c	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,328 @@
++/*
++    hexium_orion.c - v4l2 driver for the Hexium Orion frame grabber cards
++
++    Visit http://www.mihu.de/linux/saa7146/ and follow the link
++    to "hexium" for further details about this card.
++    
++    Copyright (C) 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>
++
++static int debug = 255;
++MODULE_PARM(debug, "i");
++MODULE_PARM_DESC(debug, "debug verbosity");
++
++/* global variables */
++int hexium_num = 0;
++
++#include "hexium_orion.h"
++
++/* this is only called for old HV-PCI6/Orion cards
++   without eeprom */
++static int hexium_probe(struct saa7146_dev *dev)
++{
++	struct hexium *hexium = 0;
++	union i2c_smbus_data data;
++	int err = 0;
++
++	DEB_EE((".\n"));
++
++	/* there are no hexium orion cards with revision 0 saa7146s */
++	if (0 == dev->revision) {
++		return -EFAULT;
++	}
++
++	hexium = (struct hexium *) kmalloc(sizeof(struct hexium), GFP_KERNEL);
++	if (NULL == hexium) {
++		printk("hexium_orion.o: hexium_probe: not enough kernel memory.\n");
++		return -ENOMEM;
++	}
++	memset(hexium, 0x0, sizeof(struct hexium));
++
++	/* FIXME: enable i2c-port pins, video-port-pins
++	   video port pins should be enabled here ?! */
++	saa7146_write(dev, MC1, (MASK_08 | MASK_24 | MASK_10 | MASK_26));
++
++	saa7146_write(dev, DD1_INIT, 0x02000200);
++	saa7146_write(dev, DD1_STREAM_B, 0x00000000);
++	saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
++
++	saa7146_i2c_adapter_prepare(dev, &hexium->i2c_adapter, SAA7146_I2C_BUS_BIT_RATE_480);
++	if (i2c_add_adapter(&hexium->i2c_adapter) < 0) {
++		DEB_S(("cannot register i2c-device. skipping.\n"));
++		kfree(hexium);
++		return -EFAULT;
++	}
++
++	/* set SAA7110 control GPIO 0 */
++	saa7146_setgpio(dev, 0, SAA7146_GPIO_OUTHI);
++	/*  set HWControl GPIO number 2 */
++	saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTHI);
++
++	mdelay(10);
++
++	/* detect newer Hexium Orion cards by subsystem ids */
++	if (0x17c8 == dev->pci->subsystem_vendor && 0x0101 == dev->pci->subsystem_device) {
++		printk("hexium_orion.o: device is a Hexium Orion w/ 1 SVHS + 3 BNC inputs.\n");
++		/* we store the pointer in our private data field */
++		(struct hexium *) dev->ext_priv = hexium;
++		hexium->type = HEXIUM_ORION_1SVHS_3BNC;
++		return 0;
++	}
++
++	if (0x17c8 == dev->pci->subsystem_vendor && 0x2101 == dev->pci->subsystem_device) {
++		printk("hexium_orion.o: device is a Hexium Orion w/ 4 BNC inputs.\n");
++		/* we store the pointer in our private data field */
++		(struct hexium *) dev->ext_priv = hexium;
++		hexium->type = HEXIUM_ORION_4BNC;
++		return 0;
++	}
++
++	/* check if this is an old hexium Orion card by looking at 
++	   a saa7110 at address 0x4e */
++	if (0 == (err = i2c_smbus_xfer(&hexium->i2c_adapter, 0x4e, 0, I2C_SMBUS_READ, 0x00, I2C_SMBUS_BYTE_DATA, &data))) {
++		printk("hexium_orion.o: device is a Hexium HV-PCI6/Orion (old).\n");
++		/* we store the pointer in our private data field */
++		(struct hexium *) dev->ext_priv = hexium;
++		hexium->type = HEXIUM_HV_PCI6_ORION;
++		return 0;
++	}
++
++	i2c_del_adapter(&hexium->i2c_adapter);
++	kfree(hexium);
++	return -EFAULT;
++}
++
++/* 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 hexium_init_done(struct saa7146_dev *dev)
++{
++	struct hexium *hexium = (struct hexium *) dev->ext_priv;
++	union i2c_smbus_data data;
++	int i = 0;
++
++	DEB_D(("hexium_init_done called.\n"));
++
++	/* initialize the helper ics to useful values */
++	for (i = 0; i < sizeof(hexium_saa7110); i++) {
++		data.byte = hexium_saa7110[i];
++		if (0 != i2c_smbus_xfer(&hexium->i2c_adapter, 0x4e, 0, I2C_SMBUS_WRITE, i, I2C_SMBUS_BYTE_DATA, &data)) {
++			printk("hexium_orion: failed for address 0x%02x\n", i);
++		}
++	}
++
++	return 0;
++}
++
++static struct saa7146_ext_vv vv_data;
++
++/* this function only gets called when the probing was successful */
++static int hexium_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_data *info)
++{
++	struct hexium *hexium = (struct hexium *) dev->ext_priv;
++
++	DEB_EE((".\n"));
++
++	saa7146_vv_init(dev, &vv_data);
++	if (0 != saa7146_register_device(&hexium->video_dev, dev, "hexium", VFL_TYPE_GRABBER)) {
++		ERR(("cannot register capture v4l2 device. skipping.\n"));
++		return -1;
++	}
++
++	printk("hexium_orion.o: found 'hexium orion' frame grabber-%d.\n", hexium_num);
++	hexium_num++;
++
++	/* the rest */
++	hexium->cur_input = 0;
++	hexium_init_done(dev);
++
++	return 0;
++}
++
++static int hexium_detach(struct saa7146_dev *dev)
++{
++	struct hexium *hexium = (struct hexium *) dev->ext_priv;
++
++	DEB_EE(("dev:%p\n", dev));
++
++	saa7146_unregister_device(&hexium->video_dev, dev);
++	saa7146_vv_release(dev);
++
++	hexium_num--;
++
++	i2c_del_adapter(&hexium->i2c_adapter);
++	kfree(hexium);
++	return 0;
++}
++
++static int hexium_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg)
++{
++	struct saa7146_dev *dev = fh->dev;
++	struct hexium *hexium = (struct hexium *) 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 >= HEXIUM_INPUTS) {
++				return -EINVAL;
++			}
++
++			memcpy(i, &hexium_inputs[i->index], sizeof(struct v4l2_input));
++
++			DEB_D(("v4l2_ioctl: VIDIOC_ENUMINPUT %d.\n", i->index));
++			return 0;
++		}
++	case VIDIOC_G_INPUT:
++		{
++			int *input = (int *) arg;
++			*input = hexium->cur_input;
++
++			DEB_D(("VIDIOC_G_INPUT: %d\n", *input));
++			return 0;
++		}
++	case VIDIOC_S_INPUT:
++		{
++			int input = *(int *) arg;
++
++			if (input < 0 || input >= HEXIUM_INPUTS) {
++				return -EINVAL;
++			}
++
++			hexium->cur_input = input;
++
++			/* fixme: switch input here, switch audio, too! */
++//              saa7146_set_hps_source_and_sync(dev, input_port_selection[input].hps_source, input_port_selection[input].hps_sync);
++			printk("hexium_orion.o: VIDIOC_S_INPUT: fixme switch input.\n");
++
++			return 0;
++		}
++	default:
++/*
++		DEB_D(("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_extension extension;
++
++static struct saa7146_pci_extension_data hexium_hv_pci6 = {
++	.ext_priv = "Hexium HV-PCI6 / Orion",
++	.ext = &extension,
++};
++
++static struct saa7146_pci_extension_data hexium_orion_1svhs_3bnc = {
++	.ext_priv = "Hexium HV-PCI6 / Orion (1 SVHS/3 BNC)",
++	.ext = &extension,
++};
++
++static struct saa7146_pci_extension_data hexium_orion_4bnc = {
++	.ext_priv = "Hexium HV-PCI6 / Orion (4 BNC)",
++	.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) &hexium_hv_pci6,
++	 },
++	{
++	 .vendor = PCI_VENDOR_ID_PHILIPS,
++	 .device = PCI_DEVICE_ID_PHILIPS_SAA7146,
++	 .subvendor = 0x17c8,
++	 .subdevice = 0x0101,
++	 .driver_data = (unsigned long) &hexium_orion_1svhs_3bnc,
++	 },
++	{
++	 .vendor = PCI_VENDOR_ID_PHILIPS,
++	 .device = PCI_DEVICE_ID_PHILIPS_SAA7146,
++	 .subvendor = 0x17c8,
++	 .subdevice = 0x2101,
++	 .driver_data = (unsigned long) &hexium_orion_4bnc,
++	 },
++	{
++	 .vendor = 0,
++	 }
++};
++
++MODULE_DEVICE_TABLE(pci, pci_tbl);
++
++static struct saa7146_ext_vv vv_data = {
++	.inputs = HEXIUM_INPUTS,
++	.capabilities = 0,
++	.stds = &hexium_standards[0],
++	.num_stds = sizeof(hexium_standards) / sizeof(struct saa7146_standard),
++	.std_callback = &std_callback,
++	.ioctls = &ioctls[0],
++	.ioctl = hexium_ioctl,
++};
++
++static struct saa7146_extension extension = {
++	.name = "hexium HV-PCI6/Orion",
++	.flags = 0,		// SAA7146_USE_I2C_IRQ,
++
++	.pci_tbl = &pci_tbl[0],
++	.module = THIS_MODULE,
++
++	.probe = hexium_probe,
++	.attach = hexium_attach,
++	.detach = hexium_detach,
++
++	.irq_mask = 0,
++	.irq_func = NULL,
++};
++
++int __init hexium_init_module(void)
++{
++	if (0 != saa7146_register_extension(&extension)) {
++		DEB_S(("failed to register extension.\n"));
++		return -ENODEV;
++	}
++
++	return 0;
++}
++
++void __exit hexium_cleanup_module(void)
++{
++	saa7146_unregister_extension(&extension);
++}
++
++module_init(hexium_init_module);
++module_exit(hexium_cleanup_module);
++
++MODULE_DESCRIPTION("video4linux-2 driver for Hexium Orion frame grabber cards");
++MODULE_AUTHOR("Michael Hunold <michael@mihu.de>");
++MODULE_LICENSE("GPL");
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/video/hexium_orion.h	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,138 @@
++#ifndef __HEXIUM_ORION__
++#define __HEXIUM_ORION__
++
++#include "hexium.h"
++
++static struct saa7146_extension_ioctls ioctls[] = {
++	{ VIDIOC_G_INPUT,	SAA7146_EXCLUSIVE },
++	{ VIDIOC_S_INPUT,	SAA7146_EXCLUSIVE },
++	{ VIDIOC_ENUMINPUT, 	SAA7146_EXCLUSIVE },
++	{ VIDIOC_S_STD,		SAA7146_AFTER },
++	{ 0,			0 }
++};
++
++struct hexium
++{
++	int type;
++	struct video_device	video_dev;
++	struct i2c_adapter	i2c_adapter;	
++	int cur_input;	/* current input */
++};
++
++/* Philips SAA7110 decoder default registers */
++static u8 hexium_saa7110[53]={
++/*00*/ 0x4C,0x3C,0x0D,0xEF,0xBD,0xF0,0x00,0x00,
++/*08*/ 0xF8,0xF8,0x60,0x60,0x40,0x86,0x18,0x90,
++/*10*/ 0x00,0x2C,0x40,0x46,0x42,0x1A,0xFF,0xDA,
++/*18*/ 0xF0,0x8B,0x00,0x00,0x00,0x00,0x00,0x00,
++/*20*/ 0xD9,0x17,0x40,0x41,0x80,0x41,0x80,0x4F,
++/*28*/ 0xFE,0x01,0x0F,0x0F,0x03,0x01,0x81,0x03,
++/*30*/ 0x44,0x75,0x01,0x8C,0x03
++};
++
++static struct {
++	struct hexium_data data[8];	
++} hexium_input_select[] = {
++{
++	{ /* input 0 */
++		{ 0x06, 0x00 },
++		{ 0x20, 0xD9 },
++		{ 0x21, 0x17 }, // 0x16,
++		{ 0x22, 0x40 },
++		{ 0x2C, 0x03 },
++		{ 0x30, 0x44 },
++		{ 0x31, 0x75 }, // ??
++		{ 0x21, 0x16 }, // 0x03,
++	}
++}, {
++	{ /* input 1 */
++		{ 0x06, 0x00 },
++		{ 0x20, 0xD8 },
++		{ 0x21, 0x17 }, // 0x16,
++		{ 0x22, 0x40 },
++		{ 0x2C, 0x03 },
++		{ 0x30, 0x44 },
++		{ 0x31, 0x75 }, // ??
++		{ 0x21, 0x16 }, // 0x03,
++	}
++}, {
++	{ /* input 2 */
++		{ 0x06, 0x00 },
++		{ 0x20, 0xBA },
++		{ 0x21, 0x07 }, // 0x05,
++		{ 0x22, 0x91 },
++		{ 0x2C, 0x03 },
++		{ 0x30, 0x60 },
++		{ 0x31, 0xB5 }, // ??
++		{ 0x21, 0x05 }, // 0x03,
++	}
++}, {
++	{ /* input 3 */
++		{ 0x06, 0x00 },
++		{ 0x20, 0xB8 },
++		{ 0x21, 0x07 }, // 0x05,
++		{ 0x22, 0x91 },
++		{ 0x2C, 0x03 },
++		{ 0x30, 0x60 },
++		{ 0x31, 0xB5 }, // ??
++		{ 0x21, 0x05 }, // 0x03,
++	}
++}, {
++	{ /* input 4 */
++		{ 0x06, 0x00 },
++		{ 0x20, 0x7C },
++		{ 0x21, 0x07 }, // 0x03
++		{ 0x22, 0xD2 },
++		{ 0x2C, 0x83 },
++		{ 0x30, 0x60 },
++		{ 0x31, 0xB5 }, // ??
++		{ 0x21, 0x03 },
++	} 
++}, {
++	{ /* input 5 */
++		{ 0x06, 0x00 },
++		{ 0x20, 0x78 },
++		{ 0x21, 0x07 }, // 0x03,
++		{ 0x22, 0xD2 },
++		{ 0x2C, 0x83 },
++		{ 0x30, 0x60 },
++		{ 0x31, 0xB5 }, // ?
++		{ 0x21, 0x03 },
++	}
++}, {
++	{ /* input 6 */
++		{ 0x06, 0x80 },
++		{ 0x20, 0x59 },
++		{ 0x21, 0x17 },
++		{ 0x22, 0x42 },
++		{ 0x2C, 0xA3 },
++		{ 0x30, 0x44 },
++		{ 0x31, 0x75 },
++		{ 0x21, 0x12 },
++	}
++}, {
++	{ /* input 7 */
++		{ 0x06, 0x80 },
++		{ 0x20, 0x9A },
++		{ 0x21, 0x17 },
++		{ 0x22, 0xB1 },
++		{ 0x2C, 0x13 },
++		{ 0x30, 0x60 },
++		{ 0x31, 0xB5 },
++		{ 0x21, 0x14 },
++	}
++}, {
++	{ /* input 8 */
++		{ 0x06, 0x80 },
++		{ 0x20, 0x3C },
++		{ 0x21, 0x27 },
++		{ 0x22, 0xC1 },
++		{ 0x2C, 0x23 },
++		{ 0x30, 0x44 },
++		{ 0x31, 0x75 },
++		{ 0x21, 0x21 },
++	}
++}	
++};
++
++#endif
+--- linux-2.6.0-test1/drivers/media/video/Kconfig	2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/media/video/Kconfig	2003-07-19 17:03:50.000000000 -0700
+@@ -257,5 +257,30 @@ config VIDEO_DPC
+ 	  whenever you want). If you want to compile it as a module, say M
+ 	  here and read <file:Documentation/modules.txt>.
+ 
++config VIDEO_HEXIUM_ORION
++	tristate "Hexium HV-PCI6 and Orion frame grabber"
++	depends on VIDEO_DEV && PCI
++	---help---
++	  This is a video4linux driver for the Hexium HV-PCI6 and
++	  Orion frame grabber cards by Hexium.
++	  
++	  This driver is available as a module called hexium_orion
++	  ( = 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_HEXIUM_GEMINI
++	tristate "Hexium Gemini frame grabber"
++	depends on VIDEO_DEV && PCI
++	---help---
++	  This is a video4linux driver for the Hexium Gemini frame
++	  grabber card by Hexium. Please note that the Gemini Dual
++	  card is *not* fully supported.
++	  
++	  This driver is available as a module called hexium_gemini
++	  ( = 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
+ 
+--- linux-2.6.0-test1/drivers/media/video/Makefile	2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/media/video/Makefile	2003-07-19 17:03:50.000000000 -0700
+@@ -31,6 +31,8 @@ obj-$(CONFIG_VIDEO_CPIA_USB) += cpia_usb
+ obj-$(CONFIG_VIDEO_MEYE) += meye.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_HEXIUM_ORION) += hexium_orion.o
++obj-$(CONFIG_VIDEO_HEXIUM_GEMINI) += hexium_gemini.o
+ obj-$(CONFIG_VIDEO_DPC) += saa7111.o dpc7146.o
+ obj-$(CONFIG_TUNER_3036) += tuner-3036.o
+ 
+--- linux-2.6.0-test1/drivers/media/video/mxb.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/video/mxb.c	2003-07-19 17:03:50.000000000 -0700
+@@ -81,7 +81,7 @@ MODULE_PARM_DESC(debug, "debug verbosity
+ 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 }, 
++	{ TUNER,	"Tuner",		V4L2_INPUT_TYPE_TUNER,	1, 0, 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 },
+@@ -101,8 +101,8 @@ static struct {
+ 
+ /* 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 };
++static int video_audio_connect[MXB_INPUTS] =
++	{ 0, 1, 3, 3 };
+ 
+ /* these are the necessary input-output-pins for bringing one audio source
+ (see above) to the CD-output */
+@@ -173,8 +173,7 @@ struct mxb
+ 	int	cur_mute;	/* current mute status */
+ };
+ 
+-static
+-struct saa7146_extension extension;
++static struct saa7146_extension extension;
+ 
+ static int mxb_vbi_bypass(struct saa7146_dev* dev)
+ {
+@@ -431,10 +430,11 @@ static int mxb_init_done(struct saa7146_
+ 		   polling method ... */
+ 		extension.flags &= ~SAA7146_USE_I2C_IRQ;
+ 		for(i = 1;;i++) {
+-			msg.len = mxb_saa7740_init[i].length;		
+-			if (msg.len == -1U) {
++			if( -1 == mxb_saa7740_init[i].length ) {
+ 				break;
+ 			}
++
++			msg.len = mxb_saa7740_init[i].length;		
+ 			msg.buf = &mxb_saa7740_init[i].data[0];
+ 			if( 1 != (err = i2c_transfer(&mxb->i2c_adapter, &msg, 1))) {
+ 				DEB_D(("failed to initialize 'sound arena module'.\n"));
+@@ -472,6 +472,8 @@ void mxb_irq_bh(struct saa7146_dev* dev,
+ }
+ */
+ 
++static struct saa7146_ext_vv vv_data;
++
+ /* this function only gets called when the probing was successful */
+ static int mxb_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_data *info)
+ {
+@@ -482,7 +484,7 @@ static int mxb_attach(struct saa7146_dev
+ 	/* checking for i2c-devices can be omitted here, because we
+ 	   already did this in "mxb_vl42_probe" */
+ 
+-	saa7146_vv_init(dev);
++	saa7146_vv_init(dev,&vv_data);
+ 	if( 0 != saa7146_register_device(&mxb->video_dev, dev, "mxb", VFL_TYPE_GRABBER)) {
+ 		ERR(("cannot register capture v4l2 device. skipping.\n"));
+ 		return -1;
+@@ -566,8 +568,9 @@ static int saa7111_set_gpio(struct saa71
+ 	return 0;
+ }
+ 
+-static int mxb_ioctl(struct saa7146_dev *dev, unsigned int cmd, void *arg) 
++static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) 
+ {
++	struct saa7146_dev *dev = fh->dev;
+ 	struct mxb* mxb = (struct mxb*)dev->ext_priv;
+ 	struct saa7146_vv *vv = dev->vv_data; 
+ 	
+@@ -1002,20 +1005,35 @@ static int std_callback(struct saa7146_d
+ }
+ 
+ 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 },
++	{
++		.name	= "PAL-BG", 	.id	= V4L2_STD_PAL_BG,
++		.v_offset	= 0x17,	.v_field 	= 288,	.v_calc		= 576,
++		.h_offset	= 0x14,	.h_pixels 	= 680,	.h_calc		= 680+1,
++		.v_max_out	= 576,	.h_max_out	= 768,
++	}, {
++		.name	= "PAL-I", 	.id	= V4L2_STD_PAL_I,
++		.v_offset	= 0x17,	.v_field 	= 288,	.v_calc		= 576,
++		.h_offset	= 0x14,	.h_pixels 	= 680,	.h_calc		= 680+1,
++		.v_max_out	= 576,	.h_max_out	= 768,
++	}, {
++		.name	= "NTSC", 	.id	= V4L2_STD_NTSC,
++		.v_offset	= 0x16,	.v_field 	= 240,	.v_calc		= 480,
++		.h_offset	= 0x06,	.h_pixels 	= 708,	.h_calc		= 708+1,
++		.v_max_out	= 480,	.h_max_out	= 640,
++	}, {
++		.name	= "SECAM", 	.id	= V4L2_STD_SECAM,
++		.v_offset	= 0x14,	.v_field 	= 288,	.v_calc		= 576,
++		.h_offset	= 0x14,	.h_pixels 	= 720,	.h_calc		= 720+1,
++		.v_max_out	= 576,	.h_max_out	= 768,
++	}
+ };
+ 
+-static
+-struct saa7146_pci_extension_data mxb = {
++static struct saa7146_pci_extension_data mxb = {
+         .ext_priv = "Multimedia eXtension Board",
+         .ext = &extension,
+ };
+ 
+-static
+-struct pci_device_id pci_tbl[] = {
++static struct pci_device_id pci_tbl[] = {
+ 	{
+ 		.vendor    = PCI_VENDOR_ID_PHILIPS,
+ 		.device	   = PCI_DEVICE_ID_PHILIPS_SAA7146,
+@@ -1029,8 +1047,7 @@ struct pci_device_id pci_tbl[] = {
+ 
+ MODULE_DEVICE_TABLE(pci, pci_tbl);
+ 
+-static
+-struct saa7146_ext_vv vv_data = {
++static struct saa7146_ext_vv vv_data = {
+ 	.inputs		= MXB_INPUTS,
+ 	.capabilities	= V4L2_CAP_TUNER | V4L2_CAP_VBI_CAPTURE,
+ 	.stds		= &standard[0],
+@@ -1040,14 +1057,12 @@ struct saa7146_ext_vv vv_data = {
+ 	.ioctl		= mxb_ioctl,
+ };
+ 
+-static
+-struct saa7146_extension extension = {
++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,
+--- linux-2.6.0-test1/drivers/media/video/pms.c	2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/media/video/pms.c	2003-07-19 17:03:50.000000000 -0700
+@@ -12,6 +12,10 @@
+  *	Most of this code is directly derived from his userspace driver.
+  *	His driver works so send any reports to alan@redhat.com unless the
+  *	userspace driver also doesn't work for you...
++ *      
++ *      Changes:
++ *      08/07/2003        Daniele Bellucci <bellucda@tiscali.it>
++ *                        - pms_capture: report back -EFAULT 
+  */
+ 
+ #include <linux/module.h>
+@@ -659,7 +663,8 @@ static int pms_capture(struct pms_device
+ 			if(dt+len>count)
+ 				dt=count-len;
+ 			cnt += dev->height;
+-			copy_to_user(buf, tmp+32, dt);
++			if (copy_to_user(buf, tmp+32, dt))
++				return -EFAULT;
+ 			buf += dt;    
+ 			len += dt;
+ 		}
+--- linux-2.6.0-test1/drivers/message/fusion/mptctl.c	2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/message/fusion/mptctl.c	2003-07-19 17:03:50.000000000 -0700
+@@ -88,7 +88,6 @@
+ 
+ #include <linux/kdev_t.h>	/* needed for access to Scsi_Host struct */
+ #include <linux/blkdev.h>
+-#include <linux/blk.h>          /* for io_request_lock (spinlock) decl */
+ #include "../../scsi/scsi.h"
+ #include "../../scsi/hosts.h"
+ 
+--- linux-2.6.0-test1/drivers/message/fusion/mptscsih.c	2003-06-14 12:18:08.000000000 -0700
++++ 25/drivers/message/fusion/mptscsih.c	2003-07-19 17:03:50.000000000 -0700
+@@ -72,7 +72,6 @@
+ #include <linux/errno.h>
+ #include <linux/kdev_t.h>
+ #include <linux/blkdev.h>
+-#include <linux/blk.h>		/* for io_request_lock (spinlock) decl */
+ #include <linux/delay.h>	/* for mdelay */
+ #include <linux/interrupt.h>	/* needed for in_interrupt() proto */
+ #include <linux/reboot.h>	/* notifier code */
+--- linux-2.6.0-test1/drivers/message/i2o/i2o_block.c	2003-06-14 12:18:28.000000000 -0700
++++ 25/drivers/message/i2o/i2o_block.c	2003-07-19 17:03:50.000000000 -0700
+@@ -87,8 +87,6 @@
+ 
+ #define MAJOR_NR I2O_MAJOR
+ 
+-#include <linux/blk.h>
+-
+ #define MAX_I2OB	16
+ 
+ #define MAX_I2OB_DEPTH	8
+--- linux-2.6.0-test1/drivers/message/i2o/i2o_scsi.c	2003-07-10 18:50:31.000000000 -0700
++++ 25/drivers/message/i2o/i2o_scsi.c	2003-07-19 17:03:50.000000000 -0700
+@@ -54,7 +54,7 @@
+ #include <asm/system.h>
+ #include <asm/io.h>
+ #include <asm/atomic.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/i2o.h>
+ #include "../../scsi/scsi.h"
+ #include "../../scsi/hosts.h"
+--- linux-2.6.0-test1/drivers/mtd/devices/blkmtd.c	2003-06-26 22:07:24.000000000 -0700
++++ 25/drivers/mtd/devices/blkmtd.c	2003-07-19 17:07:03.000000000 -0700
+@@ -1189,6 +1189,7 @@ static int __init init_blkmtd(void)
+   INIT_LIST_HEAD(&mtd_rawdevice->as.locked_pages);
+   mtd_rawdevice->as.host = NULL;
+   init_MUTEX(&(mtd_rawdevice->as.i_shared_sem));
++  atomic_set(&(mtd_rawdevice->as.truncate_count), 0);
+ 
+   mtd_rawdevice->as.a_ops = &blkmtd_aops;
+   INIT_LIST_HEAD(&mtd_rawdevice->as.i_mmap);
+--- linux-2.6.0-test1/drivers/mtd/mtd_blkdevs.c	2003-07-10 18:50:31.000000000 -0700
++++ 25/drivers/mtd/mtd_blkdevs.c	2003-07-19 17:03:50.000000000 -0700
+@@ -15,7 +15,6 @@
+ #include <linux/mtd/blktrans.h>
+ #include <linux/mtd/mtd.h>
+ #include <linux/blkdev.h>
+-#include <linux/blk.h>
+ #include <linux/blkpg.h>
+ #include <linux/spinlock.h>
+ #include <linux/hdreg.h>
+--- linux-2.6.0-test1/drivers/net/3c59x.c	2003-06-14 12:17:55.000000000 -0700
++++ 25/drivers/net/3c59x.c	2003-07-19 17:06:13.000000000 -0700
+@@ -291,8 +291,6 @@ MODULE_PARM(global_full_duplex, "i");
+ MODULE_PARM(full_duplex, "1-" __MODULE_STRING(8) "i");
+ MODULE_PARM(hw_checksums, "1-" __MODULE_STRING(8) "i");
+ MODULE_PARM(flow_ctrl, "1-" __MODULE_STRING(8) "i");
+-MODULE_PARM(global_enable_wol, "i");
+-MODULE_PARM(enable_wol, "1-" __MODULE_STRING(8) "i");
+ MODULE_PARM(rx_copybreak, "i");
+ MODULE_PARM(max_interrupt_work, "i");
+ MODULE_PARM(compaq_ioaddr, "i");
+@@ -306,8 +304,6 @@ MODULE_PARM_DESC(full_duplex, "3c59x ful
+ MODULE_PARM_DESC(global_full_duplex, "3c59x: same as full_duplex, but applies to all NICs if options is unset");
+ MODULE_PARM_DESC(hw_checksums, "3c59x Hardware checksum checking by adapter(s) (0-1)");
+ MODULE_PARM_DESC(flow_ctrl, "3c59x 802.3x flow control usage (PAUSE only) (0-1)");
+-MODULE_PARM_DESC(enable_wol, "3c59x: Turn on Wake-on-LAN for adapter(s) (0-1)");
+-MODULE_PARM_DESC(global_enable_wol, "3c59x: same as enable_wol, but applies to all NICs if options is unset");
+ MODULE_PARM_DESC(rx_copybreak, "3c59x copy breakpoint for copy-only-tiny-frames");
+ MODULE_PARM_DESC(max_interrupt_work, "3c59x maximum events handled per interrupt");
+ MODULE_PARM_DESC(compaq_ioaddr, "3c59x PCI I/O base address (Compaq BIOS problem workaround)");
+@@ -484,10 +480,8 @@ static struct vortex_chip_info {
+ } vortex_info_tbl[] __devinitdata = {
+ 	{"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",
+@@ -819,7 +813,6 @@ struct vortex_private {
+ 		flow_ctrl:1,					/* Use 802.3x flow control (PAUSE only) */
+ 		partner_flow_ctrl:1,			/* Partner supports flow control */
+ 		has_nway:1,
+-		enable_wol:1,					/* Wake-on-LAN is enabled */
+ 		pm_state_valid:1,				/* power_state[] has sane contents */
+ 		open:1,
+ 		medialock:1,
+@@ -915,10 +908,8 @@ static int options[MAX_UNITS] = { -1, -1
+ static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
+ static int hw_checksums[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
+ static int flow_ctrl[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
+-static int enable_wol[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
+ static int global_options = -1;
+ static int global_full_duplex = -1;
+-static int global_enable_wol = -1;
+ 
+ /* #define dev_alloc_skb dev_alloc_skb_debug */
+ 
+@@ -960,8 +951,8 @@ static int vortex_resume (struct pci_dev
+ 
+ #ifdef CONFIG_EISA
+ static struct eisa_device_id vortex_eisa_ids[] = {
+-	{ "TCM5920", EISA_3C592_OFFSET },
+-	{ "TCM5970", EISA_3C597_OFFSET },
++	{ "TCM5920", CH_3C592 },
++	{ "TCM5970", CH_3C597 },
+ 	{ "" }
+ };
+ 
+@@ -1138,8 +1129,6 @@ static int __devinit vortex_probe1(struc
+ 			vortex_debug = 7;
+ 		if (option & 0x4000)
+ 			vortex_debug = 2;
+-		if (option & 0x0400)
+-			vp->enable_wol = 1;
+ 	}
+ 
+ 	print_info = (vortex_debug > 1);
+@@ -1227,16 +1216,12 @@ static int __devinit vortex_probe1(struc
+ 
+ 	if (global_full_duplex > 0)
+ 		vp->full_duplex = 1;
+-	if (global_enable_wol > 0)
+-		vp->enable_wol = 1;
+ 
+ 	if (card_idx < MAX_UNITS) {
+ 		if (full_duplex[card_idx] > 0)
+ 			vp->full_duplex = 1;
+ 		if (flow_ctrl[card_idx] > 0)
+ 			vp->flow_ctrl = 1;
+-		if (enable_wol[card_idx] > 0)
+-			vp->enable_wol = 1;
+ 	}
+ 
+ 	vp->force_fd = vp->full_duplex;
+@@ -1379,7 +1364,7 @@ static int __devinit vortex_probe1(struc
+ 	} else
+ 		dev->if_port = vp->default_media;
+ 
+-	if ((vp->available_media & 0x4b) || (vci->drv_flags & HAS_NWAY) ||
++	if ((vp->available_media & 0x40) || (vci->drv_flags & HAS_NWAY) ||
+ 		dev->if_port == XCVR_MII || dev->if_port == XCVR_NWAY) {
+ 		int phy, phy_idx = 0;
+ 		EL3WINDOW(4);
+@@ -1463,7 +1448,7 @@ static int __devinit vortex_probe1(struc
+ 	dev->set_multicast_list = set_rx_mode;
+ 	dev->tx_timeout = vortex_tx_timeout;
+ 	dev->watchdog_timeo = (watchdog * HZ) / 1000;
+-	if (pdev && vp->enable_wol) {
++	if (pdev) {
+ 		vp->pm_state_valid = 1;
+  		pci_save_state(VORTEX_PCI(vp), vp->power_state);
+  		acpi_set_WOL(dev);
+@@ -1520,7 +1505,7 @@ vortex_up(struct net_device *dev)
+ 	unsigned int config;
+ 	int i;
+ 
+-	if (VORTEX_PCI(vp) && vp->enable_wol) {
++	if (VORTEX_PCI(vp)) {
+ 		pci_set_power_state(VORTEX_PCI(vp), 0);	/* Go active */
+ 		pci_restore_state(VORTEX_PCI(vp), vp->power_state);
+ 	}
+@@ -2669,7 +2654,7 @@ vortex_down(struct net_device *dev)
+ 	if (vp->full_bus_master_tx)
+ 		outl(0, ioaddr + DownListPtr);
+ 
+-	if (VORTEX_PCI(vp) && vp->enable_wol) {
++	if (VORTEX_PCI(vp)) {
+ 		pci_save_state(VORTEX_PCI(vp), vp->power_state);
+ 		acpi_set_WOL(dev);
+ 	}
+@@ -3059,7 +3044,7 @@ static void __devexit vortex_remove_one 
+ 	/* Should really use issue_and_wait() here */
+ 	outw(TotalReset|0x14, dev->base_addr + EL3_CMD);
+ 
+-	if (VORTEX_PCI(vp) && vp->enable_wol) {
++	if (VORTEX_PCI(vp)) {
+ 		pci_set_power_state(VORTEX_PCI(vp), 0);	/* Go active */
+ 		if (vp->pm_state_valid)
+ 			pci_restore_state(VORTEX_PCI(vp), vp->power_state);
+--- linux-2.6.0-test1/drivers/net/eql.c	2003-06-14 12:18:33.000000000 -0700
++++ 25/drivers/net/eql.c	2003-07-19 17:03:50.000000000 -0700
+@@ -162,22 +162,12 @@ static void eql_timer(unsigned long para
+ static char version[] __initdata = 
+ 	"Equalizer2002: Simon Janes (simon@ncm.com) and David S. Miller (davem@redhat.com)\n";
+ 
+-static int __init eql_init(struct net_device *dev)
++static void __init eql_setup(struct net_device *dev)
+ {
+-	static unsigned int version_printed;
+-	equalizer_t *eql;
++	equalizer_t *eql = dev->priv;
+ 
+ 	SET_MODULE_OWNER(dev);
+ 
+-	if (version_printed++ == 0)
+-		printk(version);
+-
+-	dev->priv = kmalloc(sizeof (equalizer_t), GFP_KERNEL);
+-	if (dev->priv == NULL)
+-		return -ENOMEM;
+-	memset(dev->priv, 0, sizeof (equalizer_t));
+-	eql = dev->priv;
+-
+ 	init_timer(&eql->timer);
+ 	eql->timer.data     	= (unsigned long) dev->priv;
+ 	eql->timer.expires  	= jiffies + EQL_DEFAULT_RESCHED_IVAL;
+@@ -203,8 +193,6 @@ static int __init eql_init(struct net_de
+ 
+ 	dev->type       	= ARPHRD_SLIP;
+ 	dev->tx_queue_len 	= 5;		/* Hands them off fast */
+-
+-	return 0;
+ }
+ 
+ static int eql_open(struct net_device *dev)
+@@ -598,23 +586,28 @@ static int eql_s_master_cfg(struct net_d
+ 	return -EINVAL;
+ }
+ 
+-static struct net_device dev_eql;
++static struct net_device *dev_eql;
+ 
+ static int __init eql_init_module(void)
+ {
+-	strcpy(dev_eql.name, "eql");
+-	dev_eql.init = eql_init;
+-	if (register_netdev(&dev_eql) != 0) {
+-		printk("eql: register_netdev() returned non-zero.\n");
+-		return -EIO;
+-	}
+-	return 0;
++	int err;
++
++	printk(version);
++
++	dev_eql = alloc_netdev(sizeof(equalizer_t), "eql", eql_setup);
++	if (!dev_eql)
++		return -ENOMEM;
++
++	err = register_netdev(dev_eql);
++	if (err) 
++		kfree(dev_eql);
++	return err;
+ }
+ 
+ static void __exit eql_cleanup_module(void)
+ {
+-	kfree(dev_eql.priv);
+-	unregister_netdev(&dev_eql);
++	unregister_netdev(dev_eql);
++	kfree(dev_eql);
+ }
+ 
+ module_init(eql_init_module);
+--- linux-2.6.0-test1/drivers/net/fc/iph5526.c	2003-06-16 22:32:21.000000000 -0700
++++ 25/drivers/net/fc/iph5526.c	2003-07-19 17:03:50.000000000 -0700
+@@ -48,7 +48,6 @@ static const char *version =
+ #include <linux/timer.h>
+ #include <linux/spinlock.h>
+ #include <linux/netdevice.h>
+-#include <linux/blk.h>
+ #include <linux/fcdevice.h> /* had the declarations for init_fcdev among
+ 			       others + includes if_fcdevice.h */
+ 
+--- linux-2.6.0-test1/drivers/net/irda/vlsi_ir.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/net/irda/vlsi_ir.c	2003-07-19 17:03:50.000000000 -0700
+@@ -474,10 +474,8 @@ static ssize_t vlsi_proc_read(struct fil
+ 	if (pos + nbytes > size)
+ 		nbytes = size - pos;
+ 
+-	if (!access_ok(VERIFY_WRITE, buf, nbytes))
+-		return -EINVAL;
+-
+-	copy_to_user(buf, procdata->data + pos, nbytes);
++	if (copy_to_user(buf, procdata->data + pos, nbytes))
++		return -EFAULT;
+ 
+ 	*ppos += nbytes;
+ 
+--- linux-2.6.0-test1/drivers/net/Kconfig	2003-07-10 18:50:31.000000000 -0700
++++ 25/drivers/net/Kconfig	2003-07-19 17:03:50.000000000 -0700
+@@ -1153,7 +1153,7 @@ config ZNET
+ 
+ config SEEQ8005
+ 	tristate "SEEQ8005 support (EXPERIMENTAL)"
+-	depends on NET_ISA && OBSOLETE && EXPERIMENTAL
++	depends on NET_ISA && EXPERIMENTAL
+ 	help
+ 	  This is a driver for the SEEQ 8005 network (Ethernet) card.  If this
+ 	  is for you, read the Ethernet-HOWTO, available from
+--- linux-2.6.0-test1/drivers/net/ni65.c	2003-06-14 12:18:05.000000000 -0700
++++ 25/drivers/net/ni65.c	2003-07-19 17:03:50.000000000 -0700
+@@ -245,6 +245,7 @@ struct priv
+ 	int cmdr_addr;
+ 	int cardno;
+ 	int features;
++	spinlock_t ring_lock;
+ };
+ 
+ static int  ni65_probe1(struct net_device *dev,int);
+@@ -299,7 +300,7 @@ static int ni65_open(struct net_device *
+ 	int irqval = request_irq(dev->irq, &ni65_interrupt,0,
+                         cards[p->cardno].cardname,dev);
+ 	if (irqval) {
+-		printk ("%s: unable to get IRQ %d (irqval=%d).\n",
++		printk(KERN_ERR "%s: unable to get IRQ %d (irqval=%d).\n",
+ 		          dev->name,dev->irq, irqval);
+ 		return -EAGAIN;
+ 	}
+@@ -409,12 +410,14 @@ static int __init ni65_probe1(struct net
+ 	p = (struct priv *) dev->priv;
+ 	p->cmdr_addr = ioaddr + cards[i].cmd_offset;
+ 	p->cardno = i;
++	spin_lock_init(&p->ring_lock);
+ 
+-	printk("%s: %s found at %#3x, ", dev->name, cards[p->cardno].cardname , ioaddr);
++	printk(KERN_INFO "%s: %s found at %#3x, ", dev->name, cards[p->cardno].cardname , ioaddr);
+ 
+ 	outw(inw(PORT+L_RESET),PORT+L_RESET); /* first: reset the card */
+ 	if( (j=readreg(CSR0)) != 0x4) {
+-		 printk(KERN_ERR "can't RESET card: %04x\n",j);
++		 printk("failed.\n");
++		 printk(KERN_ERR "%s: Can't RESET card: %04x\n", dev->name, j);
+ 		 ni65_free_buffer(p);
+ 		 release_region(ioaddr, cards[p->cardno].total_size);
+ 		 return -EAGAIN;
+@@ -467,7 +470,8 @@ static int __init ni65_probe1(struct net
+ 					break;
+ 			}
+ 			if(i == 5) {
+-				printk("Can't detect DMA channel!\n");
++				printk("failed.\n");
++				printk(KERN_ERR "%s: Can't detect DMA channel!\n", dev->name);
+ 				ni65_free_buffer(p);
+ 				release_region(ioaddr, cards[p->cardno].total_size);
+ 				return -EAGAIN;
+@@ -480,13 +484,13 @@ static int __init ni65_probe1(struct net
+ 
+ 		if(dev->irq < 2)
+ 		{
+-			unsigned long irq_mask, delay;
++			unsigned long irq_mask;
+ 
+ 			ni65_init_lance(p,dev->dev_addr,0,0);
+ 			irq_mask = probe_irq_on();
+ 			writereg(CSR0_INIT|CSR0_INEA,CSR0); /* trigger interrupt */
+-			delay = jiffies + HZ/50;
+-			while (time_before(jiffies, delay)) ;
++			set_current_state(TASK_UNINTERRUPTIBLE);
++			schedule_timeout(HZ/50);
+ 			dev->irq = probe_irq_off(irq_mask);
+ 			if(!dev->irq)
+ 			{
+@@ -503,7 +507,7 @@ static int __init ni65_probe1(struct net
+ 
+ 	if(request_dma(dev->dma, cards[p->cardno].cardname ) != 0)
+ 	{
+-		printk("%s: Can't request dma-channel %d\n",dev->name,(int) dev->dma);
++		printk(KERN_ERR "%s: Can't request dma-channel %d\n",dev->name,(int) dev->dma);
+ 		ni65_free_buffer(p);
+ 		release_region(ioaddr, cards[p->cardno].total_size);
+ 		return -EAGAIN;
+@@ -570,7 +574,7 @@ static void *ni65_alloc_mem(struct net_d
+ 	if(type) {
+ 		ret = skb = alloc_skb(2+16+size,GFP_KERNEL|GFP_DMA);
+ 		if(!skb) {
+-			printk("%s: unable to allocate %s memory.\n",dev->name,what);
++			printk(KERN_WARNING "%s: unable to allocate %s memory.\n",dev->name,what);
+ 			return NULL;
+ 		}
+ 		skb->dev = dev;
+@@ -581,12 +585,12 @@ static void *ni65_alloc_mem(struct net_d
+ 	else {
+ 		ret = ptr = kmalloc(T_BUF_SIZE,GFP_KERNEL | GFP_DMA);
+ 		if(!ret) {
+-			printk("%s: unable to allocate %s memory.\n",dev->name,what);
++			printk(KERN_WARNING "%s: unable to allocate %s memory.\n",dev->name,what);
+ 			return NULL;
+ 		}
+ 	}
+ 	if( (u32) virt_to_phys(ptr+size) > 0x1000000) {
+-		printk("%s: unable to allocate %s memory in lower 16MB!\n",dev->name,what);
++		printk(KERN_WARNING "%s: unable to allocate %s memory in lower 16MB!\n",dev->name,what);
+ 		if(type)
+ 			kfree_skb(skb);
+ 		else
+@@ -692,7 +696,7 @@ static void ni65_stop_start(struct net_d
+ 	writedatareg(CSR0_STOP);
+ 
+ 	if(debuglevel > 1)
+-		printk("ni65_stop_start\n");
++		printk(KERN_DEBUG "ni65_stop_start\n");
+ 
+ 	if(p->features & INIT_RING_BEFORE_START) {
+ 		int i;
+@@ -846,6 +850,8 @@ static irqreturn_t ni65_interrupt(int ir
+ 
+ 	p = (struct priv *) dev->priv;
+ 
++	spin_lock(&p->ring_lock);
++	
+ 	while(--bcnt) {
+ 		csr0 = inw(PORT+L_DATAREG);
+ 
+@@ -867,7 +873,7 @@ static irqreturn_t ni65_interrupt(int ir
+ 		{
+ 			struct priv *p = (struct priv *) dev->priv;
+ 			if(debuglevel > 1)
+-				printk("%s: general error: %04x.\n",dev->name,csr0);
++				printk(KERN_ERR "%s: general error: %04x.\n",dev->name,csr0);
+ 			if(csr0 & CSR0_BABL)
+ 				p->stats.tx_errors++;
+ 			if(csr0 & CSR0_MISS) {
+@@ -879,7 +885,7 @@ static irqreturn_t ni65_interrupt(int ir
+ 			}
+ 			if(csr0 & CSR0_MERR) {
+ 				if(debuglevel > 1)
+-					printk("%s: Ooops .. memory error: %04x.\n",dev->name,csr0);
++					printk(KERN_ERR "%s: Ooops .. memory error: %04x.\n",dev->name,csr0);
+ 				ni65_stop_start(dev,p);
+ 			}
+ 		}
+@@ -932,12 +938,13 @@ static irqreturn_t ni65_interrupt(int ir
+ #endif
+ 
+ 	if( (csr0 & (CSR0_RXON | CSR0_TXON)) != (CSR0_RXON | CSR0_TXON) ) {
+-		printk("%s: RX or TX was offline -> restart\n",dev->name);
++		printk(KERN_DEBUG "%s: RX or TX was offline -> restart\n",dev->name);
+ 		ni65_stop_start(dev,p);
+ 	}
+ 	else
+ 		writedatareg(CSR0_INEA);
+ 
++	spin_unlock(&p->ring_lock);
+ 	return IRQ_HANDLED;
+ }
+ 
+@@ -1147,9 +1154,7 @@ static int ni65_send_packet(struct sk_bu
+ 				memset((char *)p->tmdbounce[p->tmdbouncenum]+skb->len, 0, len-skb->len);
+ 			dev_kfree_skb (skb);
+ 
+-			save_flags(flags);
+-			cli();
+-
++			spin_lock_irqsave(&p->ring_lock, flags);
+ 			tmdp = p->tmdhead + p->tmdnum;
+ 			tmdp->u.buffer = (u32) isa_virt_to_bus(p->tmdbounce[p->tmdbouncenum]);
+ 			p->tmdbouncenum = (p->tmdbouncenum + 1) & (TMDNUM - 1);
+@@ -1157,8 +1162,7 @@ static int ni65_send_packet(struct sk_bu
+ #ifdef XMT_VIA_SKB
+ 		}
+ 		else {
+-			save_flags(flags);
+-			cli();
++			spin_lock_irqsave(&p->ring_lock, flags);
+ 
+ 			tmdp = p->tmdhead + p->tmdnum;
+ 			tmdp->u.buffer = (u32) isa_virt_to_bus(skb->data);
+@@ -1178,8 +1182,8 @@ static int ni65_send_packet(struct sk_bu
+ 			
+ 		p->lock = 0;
+ 		dev->trans_start = jiffies;
+-
+-		restore_flags(flags);
++		
++		spin_unlock_irqrestore(&p->ring_lock, flags);
+ 	}
+ 
+ 	return 0;
+@@ -1238,10 +1242,8 @@ void cleanup_module(void)
+ {
+ 	struct priv *p;
+ 	p = (struct priv *) dev_ni65.priv;
+-	if(!p) {
+-		printk("Ooops .. no private struct\n");
+-		return;
+-	}
++	if(!p)
++		BUG();
+ 	disable_dma(dev_ni65.dma);
+ 	free_dma(dev_ni65.dma);
+ 	unregister_netdev(&dev_ni65);
+@@ -1250,6 +1252,7 @@ void cleanup_module(void)
+ 	dev_ni65.priv = NULL;
+ }
+ #endif /* MODULE */
++
+ MODULE_LICENSE("GPL");
+ 
+ /*
+--- linux-2.6.0-test1/drivers/net/ni65.h	2003-06-14 12:18:35.000000000 -0700
++++ 25/drivers/net/ni65.h	2003-07-19 17:03:50.000000000 -0700
+@@ -20,32 +20,32 @@
+ #define CSR0_BABL	0x4000	/* Babble transmitter timeout error (RC) */
+ #define CSR0_CERR	0x2000	/* Collision Error (RC) */
+ #define CSR0_MISS	0x1000	/* Missed packet (RC) */
+-#define CSR0_MERR	0x0800	/* Memory Error (RC) */ 
++#define CSR0_MERR	0x0800	/* Memory Error (RC) */
+ #define CSR0_RINT	0x0400	/* Receiver Interrupt (RC) */
+-#define CSR0_TINT       0x0200	/* Transmit Interrupt (RC) */ 
++#define CSR0_TINT       0x0200	/* Transmit Interrupt (RC) */
+ #define CSR0_IDON	0x0100	/* Initialization Done (RC) */
+ #define CSR0_INTR	0x0080	/* Interrupt Flag (R) */
+ #define CSR0_INEA	0x0040	/* Interrupt Enable (RW) */
+ #define CSR0_RXON	0x0020	/* Receiver on (R) */
+-#define CSR0_TXON	0x0010  /* Transmitter on (R) */
++#define CSR0_TXON	0x0010	/* Transmitter on (R) */
+ #define CSR0_TDMD	0x0008	/* Transmit Demand (RS) */
+-#define CSR0_STOP	0x0004 	/* Stop (RS) */
++#define CSR0_STOP	0x0004	/* Stop (RS) */
+ #define CSR0_STRT	0x0002	/* Start (RS) */
+ #define CSR0_INIT	0x0001	/* Initialize (RS) */
+ 
+-#define CSR0_CLRALL    0x7f00  /* mask for all clearable bits */
++#define CSR0_CLRALL    0x7f00	/* mask for all clearable bits */
+ /*
+  *	Initialization Block  Mode operation Bit Definitions.
+  */
+ 
+ #define M_PROM		0x8000	/* Promiscuous Mode */
+-#define M_INTL		0x0040  /* Internal Loopback */
+-#define M_DRTY		0x0020  /* Disable Retry */ 
++#define M_INTL		0x0040	/* Internal Loopback */
++#define M_DRTY		0x0020	/* Disable Retry */
+ #define M_COLL		0x0010	/* Force Collision */
+ #define M_DTCR		0x0008	/* Disable Transmit CRC) */
+ #define M_LOOP		0x0004	/* Loopback */
+-#define M_DTX		0x0002	/* Disable the Transmitter */ 
+-#define M_DRX		0x0001  /* Disable the Receiver */
++#define M_DTX		0x0002	/* Disable the Transmitter */
++#define M_DRX		0x0001	/* Disable the Receiver */
+ 
+ 
+ /*
+@@ -56,7 +56,7 @@
+ #define RCV_ERR		0x40	/* Error Summary */
+ #define RCV_FRAM	0x20	/* Framing Error */
+ #define RCV_OFLO	0x10	/* Overflow Error */
+-#define RCV_CRC		0x08	/* CRC Error */ 
++#define RCV_CRC		0x08	/* CRC Error */
+ #define RCV_BUF_ERR	0x04	/* Buffer Error */
+ #define RCV_START	0x02	/* Start of Packet */
+ #define RCV_END		0x01	/* End of Packet */
+@@ -67,7 +67,7 @@
+  */
+ 
+ #define XMIT_OWN	0x80	/* owner bit 0 = host, 1 = lance */
+-#define XMIT_ERR	0x40    /* Error Summary */
++#define XMIT_ERR	0x40	/* Error Summary */
+ #define XMIT_RETRY	0x10	/* more the 1 retry needed to Xmit */
+ #define XMIT_1_RETRY	0x08	/* one retry needed to Xmit */
+ #define XMIT_DEF	0x04	/* Deferred */
+@@ -78,53 +78,44 @@
+  * transmit status (2) (valid if XMIT_ERR == 1)
+  */
+ 
+-#define XMIT_TDRMASK    0x03ff  /* time-domain-reflectometer-value */
+-#define XMIT_RTRY 	0x0400  /* Failed after 16 retransmissions  */
+-#define XMIT_LCAR 	0x0800  /* Loss of Carrier */
+-#define XMIT_LCOL 	0x1000  /* Late collision */
+-#define XMIT_RESERV 	0x2000  /* Reserved */
+-#define XMIT_UFLO 	0x4000  /* Underflow (late memory) */
+-#define XMIT_BUFF 	0x8000  /* Buffering error (no ENP) */
+-
+-struct init_block 
+-{
+-  unsigned short mode;
+-  unsigned char eaddr[6];
+-  unsigned char filter[8];
+-  /* bit 29-31: number of rmd's (power of 2) */
+-  u32 rrp;   /* receive ring pointer (align 8) */
+-  /* bit 29-31: number of tmd's (power of 2) */
+-  u32 trp;   /* transmit ring pointer (align 8) */
++#define XMIT_TDRMASK    0x03ff	/* time-domain-reflectometer-value */
++#define XMIT_RTRY 	0x0400	/* Failed after 16 retransmissions  */
++#define XMIT_LCAR 	0x0800	/* Loss of Carrier */
++#define XMIT_LCOL 	0x1000	/* Late collision */
++#define XMIT_RESERV 	0x2000	/* Reserved */
++#define XMIT_UFLO 	0x4000	/* Underflow (late memory) */
++#define XMIT_BUFF 	0x8000	/* Buffering error (no ENP) */
++
++struct init_block {
++	unsigned short mode;
++	unsigned char eaddr[6];
++	unsigned char filter[8];
++	/* bit 29-31: number of rmd's (power of 2) */
++	u32 rrp;		/* receive ring pointer (align 8) */
++	/* bit 29-31: number of tmd's (power of 2) */
++	u32 trp;		/* transmit ring pointer (align 8) */
+ };
+ 
+-struct rmd /* Receive Message Descriptor */
+-{ 
+-  union
+-  {
+-    volatile u32 buffer;
+-    struct 
+-    {
+-      volatile unsigned char dummy[3];
+-      volatile unsigned char status; 
+-    } s;
+-  } u;
+-  volatile short blen;
+-  volatile unsigned short mlen;
++struct rmd {			/* Receive Message Descriptor */
++	union {
++		volatile u32 buffer;
++		struct {
++			volatile unsigned char dummy[3];
++			volatile unsigned char status;
++		} s;
++	} u;
++	volatile short blen;
++	volatile unsigned short mlen;
+ };
+ 
+-struct tmd
+-{
+-  union 
+-  {
+-    volatile u32 buffer;
+-    struct 
+-    {
+-      volatile unsigned char dummy[3];
+-      volatile unsigned char status;
+-    } s;
+-  } u;
+-  volatile unsigned short blen;
+-  volatile unsigned short status2;
++struct tmd {
++	union {
++		volatile u32 buffer;
++		struct {
++			volatile unsigned char dummy[3];
++			volatile unsigned char status;
++		} s;
++	} u;
++	volatile unsigned short blen;
++	volatile unsigned short status2;
+ };
+-
+-
+--- linux-2.6.0-test1/drivers/net/pcmcia/Kconfig	2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/net/pcmcia/Kconfig	2003-07-19 17:03:50.000000000 -0700
+@@ -113,7 +113,7 @@ config PCMCIA_XIRC2PS
+ 	  If unsure, say N.
+ 
+ config PCMCIA_AXNET
+-	tristate "broken NS8390-cards support"
++	tristate "Asix AX88190 PCMCIA support"
+ 	depends on NET_PCMCIA && PCMCIA
+ 	---help---
+ 	  Say Y here if you intend to attach an Asix AX88190-based PCMCIA
+--- linux-2.6.0-test1/drivers/net/seeq8005.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/net/seeq8005.c	2003-07-19 17:03:50.000000000 -0700
+@@ -700,7 +700,8 @@ static void hardware_send_packet(struct 
+  * wait_for_buffer
+  *
+  * This routine waits for the SEEQ chip to assert that the FIFO is ready
+- * by checking for a window interrupt, and then clearing it
++ * by checking for a window interrupt, and then clearing it. This has to
++ * occur in the interrupt handler!
+  */
+ inline void wait_for_buffer(struct net_device * dev)
+ {
+@@ -710,7 +711,7 @@ inline void wait_for_buffer(struct net_d
+ 	
+ 	tmp = jiffies + HZ;
+ 	while ( ( ((status=inw(SEEQ_STATUS)) & SEEQSTAT_WINDOW_INT) != SEEQSTAT_WINDOW_INT) && time_before(jiffies, tmp))
+-		mb();
++		cpu_relax();
+ 		
+ 	if ( (status & SEEQSTAT_WINDOW_INT) == SEEQSTAT_WINDOW_INT)
+ 		outw( SEEQCMD_WINDOW_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
+--- linux-2.6.0-test1/drivers/net/wan/comx-hw-comx.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/net/wan/comx-hw-comx.c	2003-07-19 17:03:50.000000000 -0700
+@@ -11,6 +11,7 @@
+  *
+  * Contributors:
+  * Arnaldo Carvalho de Melo <acme@conectiva.com.br> - 0.86
++ * Daniele Bellucci         <bellucda@tiscali.it>   - 0.87
+  *
+  * This program is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU General Public License
+@@ -42,9 +43,12 @@
+  *		- printk cleanups
+  * Version 0.86 (00/08/15):
+  * 		- resource release on failure at COMX_init
++ *
++ * Version 0.87 (03/07/09)
++ *              - audit copy_from_user in comxhw_write_proc
+  */
+ 
+-#define VERSION "0.86"
++#define VERSION "0.87"
+ 
+ #include <linux/module.h>
+ #include <linux/version.h>
+@@ -1084,7 +1088,8 @@ static int comxhw_write_proc(struct file
+ 		if (hw->firmware->data) {
+ 			kfree(hw->firmware->data);
+ 		}
+-		copy_from_user(tmp + file->f_pos, buffer, count);
++		if (copy_from_user(tmp + file->f_pos, buffer, count))
++			return -EFAULT;
+ 		hw->firmware->len = entry->size = file->f_pos + count;
+ 		hw->firmware->data = tmp;
+ 		file->f_pos += count;
+--- linux-2.6.0-test1/drivers/net/wan/sdladrv.c	2003-06-14 12:18:03.000000000 -0700
++++ 25/drivers/net/wan/sdladrv.c	2003-07-19 17:03:50.000000000 -0700
+@@ -160,10 +160,6 @@
+ 
+ /****** Function Prototypes *************************************************/
+ 
+-/* Module entry points. These are called by the OS and must be public. */
+-int init_module (void);
+-void cleanup_module (void);
+-
+ /* Hardware-specific functions */
+ static int sdla_detect	(sdlahw_t* hw);
+ static int sdla_autodpm	(sdlahw_t* hw);
+@@ -325,11 +321,7 @@ static int pci_slot_ar[MAX_S514_CARDS];
+  * Context:	process
+  */
+ 
+-#ifdef MODULE
+-int init_module (void)
+-#else
+ int sdladrv_init(void)
+-#endif
+ {
+ 	int i=0;
+ 
+@@ -354,9 +346,12 @@ int sdladrv_init(void)
+  * Module 'remove' entry point.
+  * o release all remaining system resources
+  */
+-void cleanup_module (void)
++static void sdladrv_cleanup(void)
+ {
+ }
++
++module_init(sdladrv_init);
++module_cleanup(sdladrv_cleanup);
+ #endif
+ 
+ /******* Kernel APIs ********************************************************/
+--- linux-2.6.0-test1/drivers/net/wan/sdlamain.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/net/wan/sdlamain.c	2003-07-19 17:03:50.000000000 -0700
+@@ -177,10 +177,6 @@ static void dbg_kfree(void * v, int line
+ extern void disable_irq(unsigned int);
+ extern void enable_irq(unsigned int);
+  
+-/* Module entry points */
+-int init_module (void);
+-void cleanup_module (void);
+-
+ /* WAN link driver entry points */
+ static int setup(struct wan_device* wandev, wandev_conf_t* conf);
+ static int shutdown(struct wan_device* wandev);
+@@ -246,11 +242,7 @@ static int wanpipe_bh_critical=0;
+  * Context:	process
+  */
+  
+-#ifdef MODULE
+-int init_module (void)
+-#else
+ int wanpipe_init(void)
+-#endif
+ {
+ 	int cnt, err = 0;
+ 
+@@ -313,7 +305,7 @@ int wanpipe_init(void)
+  * o unregister all adapters from the WAN router
+  * o release all remaining system resources
+  */
+-void cleanup_module (void)
++static void wanpipe_cleanup(void)
+ {
+ 	int i;
+ 
+@@ -329,6 +321,8 @@ void cleanup_module (void)
+ 	printk(KERN_INFO "\nwanpipe: WANPIPE Modules Unloaded.\n");
+ }
+ 
++module_init(wanpipe_init);
++module_exit(wanpipe_cleanup);
+ #endif
+ 
+ /******* WAN Device Driver Entry Points *************************************/
+--- linux-2.6.0-test1/drivers/net/wan/syncppp.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/net/wan/syncppp.c	2003-07-19 17:03:50.000000000 -0700
+@@ -161,7 +161,7 @@ static int debug;
+  * then put the packet into tx_queue, and call sppp_flush_xmit()
+  * after spinlock is released.
+  */
+-static void sppp_flush_xmit()
++static void sppp_flush_xmit(void)
+ {
+ 	struct sk_buff *skb;
+ 	while ((skb = skb_dequeue(&tx_queue)) != NULL)
+--- linux-2.6.0-test1/drivers/net/wireless/airo.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/net/wireless/airo.c	2003-07-19 17:06:31.000000000 -0700
+@@ -927,9 +927,8 @@ static int enable_MAC( struct airo_info 
+ static void disable_MAC(struct airo_info *ai);
+ static void enable_interrupts(struct airo_info*);
+ static void disable_interrupts(struct airo_info*);
+-static u16 issuecommand(struct airo_info*, Cmd *pCmd, Resp *pRsp);
+-static u16 sendcommand(struct airo_info *ai, Cmd *pCmd);
+-static void completecommand(struct airo_info *ai, Resp *pRsp);
++static int issuecommand(struct airo_info*, Cmd *pCmd, Resp *pRsp);
++static int issuecommand_nolock(struct airo_info*, Cmd *pCmd, Resp *pRsp);
+ static int bap_setup(struct airo_info*, u16 rid, u16 offset, int whichbap);
+ static int aux_bap_read(struct airo_info*, u16 *pu16Dst, int bytelen,
+ 			int whichbap);
+@@ -939,13 +938,14 @@ static int bap_write(struct airo_info*, 
+ 		     int whichbap);
+ static int PC4500_accessrid(struct airo_info*, u16 rid, u16 accmd);
+ static int PC4500_readrid(struct airo_info*, u16 rid, void *pBuf, int len);
++static int PC4500_readrid_nolock(struct airo_info*, u16 rid, void *pBuf, int len);
+ static int PC4500_writerid(struct airo_info*, u16 rid, const void
+ 			   *pBuf, int len);
+ static int do_writerid( struct airo_info*, u16 rid, const void *rid_data,
+ 			int len );
+ static u16 transmit_allocate(struct airo_info*, int lenPayload, int raw);
+-static int transmit_802_3_packet(struct airo_info*, int len, char *pPacket);
+-static int transmit_802_11_packet(struct airo_info*, int len, char *pPacket);
++static int transmit_802_3_packet(struct airo_info*, u16 txFid, char *pPacket, int len);
++static int transmit_802_11_packet(struct airo_info*, u16 txFid, char *pPacket, int len);
+ 
+ static irqreturn_t airo_interrupt( int irq, void* dev_id, struct pt_regs
+ 			    *regs);
+@@ -981,12 +981,11 @@ struct airo_info {
+ 	struct timer_list timer;
+ 	struct proc_dir_entry *proc_entry;
+ 	struct airo_info *next;
+-        spinlock_t aux_lock;
++	spinlock_t main_lock;
+         unsigned long flags;
+ #define FLAG_PROMISC   IFF_PROMISC	/* 0x100 - include/linux/if.h */
+ #define FLAG_RADIO_OFF 0x02		/* User disabling of MAC */
+ #define FLAG_RADIO_DOWN 0x08		/* ifup/ifdown disabling of MAC */
+-#define FLAG_LOCKED    2		/* 0x04 - use as a bit offset */
+ #define FLAG_FLASHING  0x10
+ #define FLAG_ADHOC        0x01 /* Needed by MIC */
+ #define FLAG_MIC_CAPABLE  0x20
+@@ -997,14 +996,8 @@ struct airo_info {
+ 			int whichbap);
+ 	unsigned short *flash;
+ 	tdsRssiEntry *rssi;
+-	struct semaphore sem;
+ 	struct task_struct *task;
+ 	struct work_struct promisc_task;
+-	struct {
+-		struct sk_buff *skb;
+-		int fid;
+-		struct work_struct task;
+-	} xmit, xmit11;
+ 	struct net_device *wifidev;
+ #ifdef WIRELESS_EXT
+ 	struct iw_statistics	wstats;		// wireless stats
+@@ -1045,10 +1038,8 @@ static int readBSSListRid(struct airo_in
+ 	if (first == 1) {
+ 			memset(&cmd, 0, sizeof(cmd));
+ 			cmd.cmd=CMD_LISTBSS;
+-			if (down_interruptible(&ai->sem))
+-				return -ERESTARTSYS;
+ 			issuecommand(ai, &cmd, &rsp);
+-			up(&ai->sem);
++
+ 			/* Let the command take effect */
+ 			set_current_state (TASK_INTERRUPTIBLE);
+ 			ai->task = current;
+@@ -1193,7 +1184,7 @@ static int readStatusRid(struct airo_inf
+ 	statr->len = le16_to_cpu(statr->len);
+ 	for(s = &statr->mode; s <= &statr->SSIDlen; s++) *s = le16_to_cpu(*s);
+ 
+-	for(s = &statr->beaconPeriod; s <= &statr->_reserved[9]; s++)
++	for(s = &statr->beaconPeriod; s <= &statr->_reserved1; s++)
+ 		*s = le16_to_cpu(*s);
+ 
+ 	return rc;
+@@ -1306,44 +1297,15 @@ static void get_tx_error(struct airo_inf
+ 	}
+ }
+ 
+-static void airo_do_xmit(struct net_device *dev) {
+-	u16 status;
+-	int i;
+-	struct airo_info *priv = dev->priv;
+-	struct sk_buff *skb = priv->xmit.skb;
+-	int fid = priv->xmit.fid;
+-	u32 *fids = priv->fids;
+-
+-	if (down_trylock(&priv->sem) != 0) {
+-		netif_stop_queue(dev);
+-		priv->xmit.task.func = (void (*)(void *))airo_do_xmit;
+-		priv->xmit.task.data = (void *)dev;
+-		schedule_work(&priv->xmit.task);
+-		return;
+-	}
+-	status = transmit_802_3_packet (priv, fids[fid], skb->data);
+-	up(&priv->sem);
+-
+-	i = 0;
+-	if ( status == SUCCESS ) {
+-		dev->trans_start = jiffies;
+-		for (; i < MAX_FIDS / 2 && (priv->fids[i] & 0xffff0000); i++);
+-	} else {
+-		priv->fids[fid] &= 0xffff;
+-		priv->stats.tx_window_errors++;
+-	}
+-	if (i < MAX_FIDS / 2)
+-		netif_wake_queue(dev);
+-	else
+-		netif_stop_queue(dev);
+-	dev_kfree_skb(skb);
+-}
+-
+-static int airo_start_xmit(struct sk_buff *skb, struct net_device *dev) {
+-	s16 len;
++static int airo_start_xmit(struct sk_buff *skb, struct net_device *dev)
++{
++	int len;
+ 	int i;
++	int ret = 0;
++	int status;
++	unsigned long flags;
+ 	struct airo_info *priv = dev->priv;
+-	u32 *fids = priv->fids;
++	int *fids = priv->fids;
+ 
+ 	if ( skb == NULL ) {
+ 		printk( KERN_ERR "airo:  skb == NULL!!!\n" );
+@@ -1351,61 +1313,50 @@ static int airo_start_xmit(struct sk_buf
+ 	}
+ 
+ 	/* Find a vacant FID */
+-	for( i = 0; i < MAX_FIDS / 2 && (fids[i] & 0xffff0000); i++ );
+-
+-	if ( i == MAX_FIDS / 2 ) {
+-		priv->stats.tx_fifo_errors++;
+-		dev_kfree_skb(skb);
+-	} else {
+-		/* check min length*/
+-		len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
+-	        /* Mark fid as used & save length for later */
+-		fids[i] |= (len << 16);
+-		priv->xmit.skb = skb;
+-		priv->xmit.fid = i;
+-		airo_do_xmit(dev);
+-	}
+-	return 0;
+-}
++	spin_lock_irqsave(&priv->main_lock, flags);
++	for (i = 0; i < MAX_FIDS / 2 && (fids[i] & 0xffff0000); i++);
+ 
+-static void airo_do_xmit11(struct net_device *dev) {
+-	u16 status;
+-	int i;
+-	struct airo_info *priv = dev->priv;
+-	struct sk_buff *skb = priv->xmit11.skb;
+-	int fid = priv->xmit11.fid;
+-	u32 *fids = priv->fids;
+-
+-	if (down_trylock(&priv->sem) != 0) {
++	if (i + 1 >= MAX_FIDS / 2) {
+ 		netif_stop_queue(dev);
+-		priv->xmit11.task.func = (void (*)(void *))airo_do_xmit11;
+-		priv->xmit11.task.data = (void *)dev;
+-		schedule_work(&priv->xmit11.task);
+-		return;
++
++		/* we cannot transmit */
++		if (i == MAX_FIDS / 2) {
++			priv->stats.tx_fifo_errors++;
++			ret = 1;
++			goto tx_done;
++		}
+ 	}
+-	status = transmit_802_11_packet (priv, fids[fid], skb->data);
+-	up(&priv->sem);
+ 
+-	i = MAX_FIDS / 2;
+-	if ( status == SUCCESS ) {
++	/* check min length*/
++	len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
++	status = transmit_802_3_packet (priv, fids[i], skb->data, len);
++
++	if (status == SUCCESS) {
++		/* Mark fid as used & save length for later */
++		fids[i] |= (len << 16);
+ 		dev->trans_start = jiffies;
+-		for (; i < MAX_FIDS && (priv->fids[i] & 0xffff0000); i++);
+-	} else {
+-		priv->fids[fid] &= 0xffff;
++	}
++	else {
+ 		priv->stats.tx_window_errors++;
++		ret = 1;
+ 	}
+-	if (i < MAX_FIDS)
+-		netif_wake_queue(dev);
+-	else
+-		netif_stop_queue(dev);
+-	dev_kfree_skb(skb);
++
++tx_done:
++	spin_unlock_irqrestore(&priv->main_lock, flags);
++	if (!ret)
++		dev_kfree_skb(skb);
++	return ret;
+ }
+ 
+-static int airo_start_xmit11(struct sk_buff *skb, struct net_device *dev) {
+-	s16 len;
++static int airo_start_xmit11(struct sk_buff *skb, struct net_device *dev)
++{
++	int len;
+ 	int i;
++	int ret = 0;
++	int status;
++	unsigned long flags;
+ 	struct airo_info *priv = dev->priv;
+-	u32 *fids = priv->fids;
++	int *fids = priv->fids;
+ 
+ 	if ( skb == NULL ) {
+ 		printk( KERN_ERR "airo:  skb == NULL!!!\n" );
+@@ -1413,21 +1364,39 @@ static int airo_start_xmit11(struct sk_b
+ 	}
+ 
+ 	/* Find a vacant FID */
++	spin_lock_irqsave(&priv->main_lock, flags);
+ 	for( i = MAX_FIDS / 2; i < MAX_FIDS && (fids[i] & 0xffff0000); i++ );
+ 
+-	if ( i == MAX_FIDS ) {
+-		priv->stats.tx_fifo_errors++;
+-		dev_kfree_skb(skb);
+-	} else {
+-		/* check min length*/
+-		len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
+-	        /* Mark fid as used & save length for later */
++	if (i + 1 >= MAX_FIDS) {
++		netif_stop_queue(dev);
++
++		/* we cannot transmit */
++		if (i == MAX_FIDS) {
++			priv->stats.tx_fifo_errors++;
++			ret = 1;
++			goto tx_done;
++		}
++	}
++
++	/* check min length*/
++	len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
++	status = transmit_802_11_packet (priv, fids[i], skb->data, len);
++
++	if (status == SUCCESS) {
++		/* Mark fid as used & save length for later */
+ 		fids[i] |= (len << 16);
+-		priv->xmit11.skb = skb;
+-		priv->xmit11.fid = i;
+-		airo_do_xmit11(dev);
++		dev->trans_start = jiffies;
+ 	}
+-	return 0;
++	else {
++		priv->stats.tx_window_errors++;
++		ret = 1;
++	}
++
++tx_done:
++	spin_unlock_irqrestore(&priv->main_lock, flags);
++	if (!ret)
++		dev_kfree_skb(skb);
++	return ret;
+ }
+ 
+ struct net_device_stats *airo_get_stats(struct net_device *dev)
+@@ -1457,36 +1426,19 @@ struct net_device_stats *airo_get_stats(
+ 	return &local->stats;
+ }
+ 
+-static void airo_end_promisc(struct airo_info *ai) {
+-	Resp rsp;
+-
+-	if ((IN4500(ai, EVSTAT) & EV_CMD) != 0) {
+-		completecommand(ai, &rsp);
+-		up(&ai->sem);
+-	} else {
+-		ai->promisc_task.func = (void (*)(void *))airo_end_promisc;
+-		ai->promisc_task.data = (void *)ai;
+-		schedule_work(&ai->promisc_task);
+-	}
+-}
+-
+-static void airo_set_promisc(struct airo_info *ai) {
++static void airo_set_promisc(struct airo_info *ai)
++{
+ 	Cmd cmd;
++	Resp rsp;
+ 
+-	if (down_trylock(&ai->sem) == 0) {
+-		memset(&cmd, 0, sizeof(cmd));
+-		cmd.cmd=CMD_SETMODE;
+-		cmd.parm0=(ai->flags&IFF_PROMISC) ? PROMISC : NOPROMISC;
+-		sendcommand(ai, &cmd);
+-		airo_end_promisc(ai);
+-	} else {
+-		ai->promisc_task.func = (void (*)(void *))airo_set_promisc;
+-		ai->promisc_task.data = (void *)ai;
+-		schedule_work(&ai->promisc_task);
+-	}
++	memset(&cmd, 0, sizeof(cmd));
++	cmd.cmd = CMD_SETMODE;
++	cmd.parm0 = (ai->flags & IFF_PROMISC) ? PROMISC : NOPROMISC;
++	issuecommand(ai, &cmd, &rsp);
+ }
+ 
+-static void airo_set_multicast_list(struct net_device *dev) {
++static void airo_set_multicast_list(struct net_device *dev)
++{
+ 	struct airo_info *ai = dev->priv;
+ 
+ 	if ((dev->flags ^ ai->flags) & IFF_PROMISC) {
+@@ -1551,11 +1503,10 @@ void stop_airo_card( struct net_device *
+ {
+ 	struct airo_info *ai = dev->priv;
+ 	flush_scheduled_work();
+-	if (ai->flash)
+-		kfree(ai->flash);
+-	if (ai->rssi)
+-		kfree(ai->rssi);
+-	takedown_proc_entry( dev, ai );
++
++	disable_interrupts(ai);
++	free_irq(dev->irq, dev);
++
+ 	if (ai->registered) {
+ 		unregister_netdev( dev );
+ 		if (ai->wifidev) {
+@@ -1565,9 +1516,15 @@ void stop_airo_card( struct net_device *
+ 		}
+ 		ai->registered = 0;
+ 	}
+-	disable_interrupts(ai);
+-	free_irq( dev->irq, dev );
+-	if (auto_wep) del_timer_sync(&ai->timer);
++
++	if (ai->flash)
++		kfree(ai->flash);
++	if (ai->rssi)
++		kfree(ai->rssi);
++	takedown_proc_entry( dev, ai );
++
++	if (auto_wep)
++	       	del_timer_sync(&ai->timer);
+ 	if (freeres) {
+ 		/* PCMCIA frees this stuff, so only for PCI and ISA */
+ 	        release_region( dev->base_addr, 64 );
+@@ -1664,8 +1621,7 @@ struct net_device *init_airo_card( unsig
+ 	ai->wifidev = 0;
+ 	ai->registered = 0;
+         ai->dev = dev;
+-	ai->aux_lock = SPIN_LOCK_UNLOCKED;
+-	sema_init(&ai->sem, 1);
++	ai->main_lock = SPIN_LOCK_UNLOCKED;
+ 	ai->need_commit = 0;
+ 	ai->config.len = 0;
+ 	rc = add_airo_dev( dev );
+@@ -1730,7 +1686,6 @@ struct net_device *init_airo_card( unsig
+ 			ai->fids[i] = transmit_allocate(ai,2312,i>=MAX_FIDS/2);
+ 
+ 	setup_proc_entry( dev, dev->priv ); /* XXX check for failure */
+-	netif_start_queue(dev);
+ 	SET_MODULE_OWNER(dev);
+ 	return dev;
+ 
+@@ -1794,47 +1749,31 @@ int reset_airo_card( struct net_device *
+ EXPORT_SYMBOL(reset_airo_card);
+ 
+ #if WIRELESS_EXT > 13
++/* must be called with lock held */
+ static void airo_send_event(struct net_device *dev) {
+ 	struct airo_info *ai = dev->priv;
+ 	union iwreq_data wrqu;
+ 	StatusRid status_rid;
+ 
+-	if (down_trylock(&ai->sem) == 0) {
+-		__set_bit(FLAG_LOCKED, &ai->flags);
+-		PC4500_readrid(ai, RID_STATUS, &status_rid, sizeof(status_rid));
+-		clear_bit(FLAG_LOCKED, &ai->flags);
+-		up(&ai->sem);
+-		wrqu.data.length = 0;
+-		wrqu.data.flags = 0;
+-		memcpy(wrqu.ap_addr.sa_data, status_rid.bssid[0], ETH_ALEN);
+-		wrqu.ap_addr.sa_family = ARPHRD_ETHER;
++	PC4500_readrid_nolock(ai, RID_STATUS, &status_rid, sizeof(status_rid));
+ 
+-		/* Send event to user space */
+-		wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL);
+-	} else {
+-		ai->event_task.func = (void (*)(void *))airo_send_event;
+-		ai->event_task.data = (void *)dev;
+-		schedule_work(&ai->event_task);
+-	}
++	wrqu.data.length = 0;
++	wrqu.data.flags = 0;
++	memcpy(wrqu.ap_addr.sa_data, status_rid.bssid[0], ETH_ALEN);
++	wrqu.ap_addr.sa_family = ARPHRD_ETHER;
++
++	/* Send event to user space */
++	wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL);
+ }
+ #endif
+ 
+ static void airo_read_mic(struct airo_info *ai) {
++#ifdef MICSUPPORT
+ 	MICRid mic_rid;
+ 
+-	if (down_trylock(&ai->sem) == 0) {
+-		__set_bit(FLAG_LOCKED, &ai->flags);
+-		PC4500_readrid(ai, RID_MIC, &mic_rid, sizeof(mic_rid));
+-		clear_bit(FLAG_LOCKED, &ai->flags);
+-		up(&ai->sem);
+-#ifdef MICSUPPORT
+-		micinit (ai, &mic_rid);
++	PC4500_readrid(ai, RID_MIC, &mic_rid, sizeof(mic_rid));
++	micinit (ai, &mic_rid);
+ #endif
+-	} else {
+-		ai->mic_task.func = (void (*)(void *))airo_read_mic;
+-		ai->mic_task.data = (void *)ai;
+-		schedule_work(&ai->mic_task);
+-	}
+ }
+ 
+ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) {
+@@ -1848,6 +1787,7 @@ static irqreturn_t airo_interrupt ( int 
+ 	if (!netif_device_present(dev))
+ 		return IRQ_NONE;
+ 
++	spin_lock(&apriv->main_lock);
+ 	for (;;) {
+ 		status = IN4500( apriv, EVSTAT );
+ 		if ( !(status & STATUS_INTS) || status == 0xffff ) break;
+@@ -1866,7 +1806,8 @@ static irqreturn_t airo_interrupt ( int 
+ 
+ 		if ( status & EV_MIC ) {
+ 			OUT4500( apriv, EVACK, EV_MIC );
+-			airo_read_mic( apriv );
++			if (apriv->flags & FLAG_MIC_CAPABLE)
++				airo_read_mic( apriv );
+ 		}
+ 		if ( status & EV_LINK ) {
+ #if WIRELESS_EXT > 13
+@@ -2115,10 +2056,14 @@ static irqreturn_t airo_interrupt ( int 
+ 					index = i;
+ 					/* Set up to be used again */
+ 					apriv->fids[i] &= 0xffff;
++
++					if (i < MAX_FIDS / 2)
++						netif_wake_queue(dev);
++					else
++						netif_wake_queue(apriv->wifidev);
+ 				}
+ 			}
+ 			if (index != -1) {
+-				netif_wake_queue(dev);
+ 				if (status & EV_TXEXC)
+ 					get_tx_error(apriv, index);
+ 			}
+@@ -2134,6 +2079,7 @@ static irqreturn_t airo_interrupt ( int 
+ 
+ 	if (savedInterrupts)
+ 		OUT4500( apriv, EVINTEN, savedInterrupts );
++	spin_unlock(&apriv->main_lock);
+ 
+ 	/* done.. */
+ 	return IRQ_RETVAL(handled);
+@@ -2169,8 +2115,8 @@ static u16 IN4500( struct airo_info *ai,
+ 	return rc;
+ }
+ 
+-static int enable_MAC( struct airo_info *ai, Resp *rsp ) {
+-	int rc;
++static int enable_MAC( struct airo_info *ai, Resp *rsp )
++{
+         Cmd cmd;
+ 
+ 	/* FLAG_RADIO_OFF : Radio disabled via /proc or Wireless Extensions
+@@ -2182,45 +2128,41 @@ static int enable_MAC( struct airo_info 
+ 	if (ai->flags & (FLAG_RADIO_OFF|FLAG_RADIO_DOWN)) return SUCCESS;
+ 	memset(&cmd, 0, sizeof(cmd));
+ 	cmd.cmd = MAC_ENABLE;
+-	if (test_bit(FLAG_LOCKED, &ai->flags) != 0)
+-		return issuecommand(ai, &cmd, rsp);
+-
+-	if (down_interruptible(&ai->sem))
+-		return -ERESTARTSYS;
+-	rc = issuecommand(ai, &cmd, rsp);
+-	up(&ai->sem);
+-	return rc;
++	return issuecommand(ai, &cmd, rsp);
+ }
+ 
+-static void disable_MAC( struct airo_info *ai ) {
++static void disable_MAC(struct airo_info *ai)
++{
+         Cmd cmd;
+ 	Resp rsp;
+ 
+ 	memset(&cmd, 0, sizeof(cmd));
+ 	cmd.cmd = MAC_DISABLE; // disable in case already enabled
+-	if (test_bit(FLAG_LOCKED, &ai->flags) != 0) {
+-		issuecommand(ai, &cmd, &rsp);
+-		return;
+-	}
+-
+-	if (down_interruptible(&ai->sem))
+-		return;
+ 	issuecommand(ai, &cmd, &rsp);
+-	up(&ai->sem);
+ }
+ 
+-static void enable_interrupts( struct airo_info *ai ) {
++static void enable_interrupts(struct airo_info *ai)
++{
++	unsigned long flags;
++	u16 status;
++	spin_lock_irqsave(&ai->main_lock, flags);
++
+ 	/* Reset the status register */
+-	u16 status = IN4500( ai, EVSTAT );
++	status = IN4500( ai, EVSTAT );
+ 	OUT4500( ai, EVACK, status );
++
+ 	/* Enable the interrupts */
+ 	OUT4500( ai, EVINTEN, STATUS_INTS );
+-	/* Note there is a race condition between the last two lines that
+-	   I don't know how to get rid of right now... */
++
++	spin_unlock_irqrestore(&ai->main_lock, flags);
+ }
+ 
+-static void disable_interrupts( struct airo_info *ai ) {
++static void disable_interrupts(struct airo_info *ai)
++{
++	unsigned long flags;
++	spin_lock_irqsave(&ai->main_lock, flags);
+ 	OUT4500( ai, EVINTEN, 0 );
++	spin_unlock_irqrestore(&ai->main_lock, flags);
+ }
+ 
+ static u16 setup_card(struct airo_info *ai, u8 *mac)
+@@ -2243,23 +2185,20 @@ static u16 setup_card(struct airo_info *
+ 	/* The NOP is the first step in getting the card going */
+ 	cmd.cmd = NOP;
+ 	cmd.parm0 = cmd.parm1 = cmd.parm2 = 0;
+-	if (down_interruptible(&ai->sem))
++	if (spin_is_locked(&ai->main_lock))
+ 		return ERROR;
+-	if ( issuecommand( ai, &cmd, &rsp ) != SUCCESS ) {
+-		up(&ai->sem);
++	if (issuecommand(ai, &cmd, &rsp) != SUCCESS)
+ 		return ERROR;
+-	}
++
+ 	memset(&cmd, 0, sizeof(cmd));
+ 	cmd.cmd = MAC_DISABLE; // disable in case already enabled
+-	if ( issuecommand( ai, &cmd, &rsp ) != SUCCESS ) {
+-		up(&ai->sem);
++	if (issuecommand( ai, &cmd, &rsp) != SUCCESS )
+ 		return ERROR;
+-	}
++
+ 
+ 	// Let's figure out if we need to use the AUX port
+ 	cmd.cmd = CMD_ENABLEAUX;
+ 	if (issuecommand(ai, &cmd, &rsp) != SUCCESS) {
+-		up(&ai->sem);
+ 		printk(KERN_ERR "airo: Error checking for AUX port\n");
+ 		return ERROR;
+ 	}
+@@ -2270,7 +2209,7 @@ static u16 setup_card(struct airo_info *
+ 		ai->bap_read = aux_bap_read;
+ 		printk(KERN_DEBUG "airo: Doing AUX bap_reads\n");
+ 	}
+-	up(&ai->sem);
++
+ 	if (ai->config.len == 0) {
+ 		tdsRssiRid rssi_rid;
+ 		CapabilityRid cap_rid;
+@@ -2375,50 +2314,35 @@ static u16 setup_card(struct airo_info *
+ 	}
+ 	return SUCCESS;
+ }
++static int issuecommand(struct airo_info *ai, Cmd *pCmd, Resp *pRsp) {
++	int rc;
++	unsigned long flags;
+ 
+-static u16 issuecommand(struct airo_info *ai, Cmd *pCmd, Resp *pRsp) {
+-        // Im really paranoid about letting it run forever!
+-	int max_tries = 600000;
+-
+-	if (sendcommand(ai, pCmd) == (u16)ERROR)
+-		return ERROR;
+-
+-	while (max_tries-- && (IN4500(ai, EVSTAT) & EV_CMD) == 0) {
+-		if (!in_interrupt() && (max_tries & 255) == 0)
+-			schedule();
+-	}
+-	if ( max_tries == -1 ) {
+-		printk( KERN_ERR
+-			"airo: Max tries exceeded waiting for command\n" );
+-                return ERROR;
+-	}
+-	completecommand(ai, pRsp);
+-	return SUCCESS;
++	spin_lock_irqsave(&ai->main_lock, flags);
++	rc = issuecommand_nolock(ai, pCmd, pRsp);
++	spin_unlock_irqrestore(&ai->main_lock, flags);
++	return rc;
+ }
+ 
+-static u16 sendcommand(struct airo_info *ai, Cmd *pCmd) {
+-        // Im really paranoid about letting it run forever!
++static int issuecommand_nolock(struct airo_info *ai, Cmd *pCmd, Resp *pRsp) {
++	// Im really paranoid about letting it run forever!
+ 	int max_tries = 600000;
+-	u16 cmd;
+ 
+ 	OUT4500(ai, PARAM0, pCmd->parm0);
+ 	OUT4500(ai, PARAM1, pCmd->parm1);
+ 	OUT4500(ai, PARAM2, pCmd->parm2);
+ 	OUT4500(ai, COMMAND, pCmd->cmd);
+-	while ( max_tries-- && (IN4500(ai, EVSTAT) & EV_CMD) == 0 &&
+-		(cmd = IN4500(ai, COMMAND)) != 0 )
+-			if (cmd == pCmd->cmd)
+-				// PC4500 didn't notice command, try again
+-				OUT4500(ai, COMMAND, pCmd->cmd);
+-	if ( max_tries == -1 ) {
++	while (max_tries-- && (IN4500(ai, EVSTAT) & EV_CMD) == 0) {
++		if (IN4500(ai, COMMAND) == pCmd->cmd) {
++			// PC4500 didn't notice command, try again
++			OUT4500(ai, COMMAND, pCmd->cmd);
++		}
++	}
++	if (max_tries == -1) {
+ 		printk( KERN_ERR
+ 			"airo: Max tries exceeded when issueing command\n" );
+                 return ERROR;
+ 	}
+-	return SUCCESS;
+-}
+-
+-static void completecommand(struct airo_info *ai, Resp *pRsp) {
+ 	// command completed
+ 	pRsp->status = IN4500(ai, STATUS);
+ 	pRsp->rsp0 = IN4500(ai, RESP0);
+@@ -2431,8 +2355,10 @@ static void completecommand(struct airo_
+ 	}
+ 	// acknowledge processing the status/response
+ 	OUT4500(ai, EVACK, EV_CMD);
++	return SUCCESS;
+ }
+ 
++
+ /* Sets up the bap to start exchange data.  whichbap should
+  * be one of the BAP0 or BAP1 defines.  Locks should be held before
+  * calling! */
+@@ -2497,9 +2423,7 @@ static int aux_bap_read(struct airo_info
+ 	u16 next;
+ 	int words;
+ 	int i;
+-	unsigned long flags;
+ 
+-	spin_lock_irqsave(&ai->aux_lock, flags);
+ 	page = IN4500(ai, SWS0+whichbap);
+ 	offset = IN4500(ai, SWS2+whichbap);
+ 	next = aux_setup(ai, page, offset, &len);
+@@ -2519,7 +2443,6 @@ static int aux_bap_read(struct airo_info
+ 			next = aux_setup(ai, next, 4, &len);
+ 		}
+ 	}
+-	spin_unlock_irqrestore(&ai->aux_lock, flags);
+ 	return SUCCESS;
+ }
+ 
+@@ -2558,7 +2481,7 @@ static int PC4500_accessrid(struct airo_
+ 	memset(&cmd, 0, sizeof(cmd));
+ 	cmd.cmd = accmd;
+ 	cmd.parm0 = rid;
+-	status = issuecommand(ai, &cmd, &rsp);
++	status = issuecommand_nolock(ai, &cmd, &rsp);
+ 	if (status != 0) return status;
+ 	if ( (rsp.status & 0x7F00) != 0) {
+ 		return (accmd << 8) + (rsp.rsp0 & 0xFF);
+@@ -2567,25 +2490,16 @@ static int PC4500_accessrid(struct airo_
+ }
+ 
+ /*  Note, that we are using BAP1 which is also used by transmit, so
+- *  we must get a lock. */
+-static int PC4500_readrid(struct airo_info *ai, u16 rid, void *pBuf, int len)
++ *  it must be called with main_lock held. */
++static int PC4500_readrid_nolock(struct airo_info *ai, u16 rid, void *pBuf, int len)
+ {
+-	u16 status, dolock = 0;
+-        int rc = SUCCESS;
++	u16 status;
++
++	if ((status = PC4500_accessrid(ai, rid, CMD_ACCESS)) != SUCCESS)
++                return status;
++	if (bap_setup(ai, rid, 0, BAP1) != SUCCESS)
++                return ERROR;
+ 
+-	if (test_bit(FLAG_LOCKED, &ai->flags) == 0) {
+-		dolock = 1;
+-		if (down_interruptible(&ai->sem))
+-			return ERROR;
+-	}
+-	if ( (status = PC4500_accessrid(ai, rid, CMD_ACCESS)) != SUCCESS) {
+-                rc = status;
+-                goto done;
+-        }
+-	if (bap_setup(ai, rid, 0, BAP1) != SUCCESS) {
+-		rc = ERROR;
+-                goto done;
+-        }
+ 	// read the rid length field
+ 	bap_read(ai, pBuf, 2, BAP1);
+ 	// length for remaining part of rid
+@@ -2596,30 +2510,34 @@ static int PC4500_readrid(struct airo_in
+ 			"airo: Rid %x has a length of %d which is too short\n",
+ 			(int)rid,
+ 			(int)len );
+-		rc = ERROR;
+-                goto done;
++		return ERROR;
+ 	}
+ 	// read remainder of the rid
+-	rc = bap_read(ai, ((u16*)pBuf)+1, len, BAP1);
+-done:
+-	if (dolock)
+-		up(&ai->sem);
+-	return rc;
++	return bap_read(ai, ((u16*)pBuf)+1, len, BAP1);
+ }
+ 
++static int PC4500_readrid(struct airo_info *ai, u16 rid, void *pBuf, int len)
++{
++	unsigned long flags;
++	int rc;
++
++	spin_lock_irqsave(&ai->main_lock, flags);
++	rc = PC4500_readrid_nolock(ai, rid, pBuf, len);
++	spin_unlock_irqrestore(&ai->main_lock, flags);
++	return rc;
++}
+ /*  Note, that we are using BAP1 which is also used by transmit, so
+  *  make sure this isnt called when a transmit is happening */
+ static int PC4500_writerid(struct airo_info *ai, u16 rid,
+ 			   const void *pBuf, int len)
+ {
+-	u16 status, dolock = 0;
++	u16 status;
++	unsigned long flags;
+ 	int rc = SUCCESS;
+ 
+-	if (test_bit(FLAG_LOCKED, &ai->flags) == 0) {
+-		dolock = 1;
+-		if (down_interruptible(&ai->sem))
+-			return ERROR;
+-	}
++	*(u16*)pBuf = cpu_to_le16((u16)len);
++
++	spin_lock_irqsave(&ai->main_lock, flags);
+ 	// --- first access so that we can write the rid data
+ 	if ( (status = PC4500_accessrid(ai, rid, CMD_ACCESS)) != 0) {
+                 rc = status;
+@@ -2633,9 +2551,8 @@ static int PC4500_writerid(struct airo_i
+ 	bap_write(ai, pBuf, len, BAP1);
+ 	// ---now commit the rid data
+ 	rc = PC4500_accessrid(ai, rid, 0x100|CMD_ACCESS);
+- done:
+-	if (dolock)
+-		up(&ai->sem);
++done:
++	spin_unlock_irqrestore(&ai->main_lock, flags);
+         return rc;
+ }
+ 
+@@ -2643,6 +2560,8 @@ static int PC4500_writerid(struct airo_i
+    one for now. */
+ static u16 transmit_allocate(struct airo_info *ai, int lenPayload, int raw)
+ {
++	unsigned long flags;
++	unsigned int loop = 3000;
+ 	Cmd cmd;
+ 	Resp rsp;
+ 	u16 txFid;
+@@ -2650,20 +2569,25 @@ static u16 transmit_allocate(struct airo
+ 
+ 	cmd.cmd = CMD_ALLOCATETX;
+ 	cmd.parm0 = lenPayload;
+-	if (down_interruptible(&ai->sem))
+-		return ERROR;
+-	if (issuecommand(ai, &cmd, &rsp) != SUCCESS) {
+-		txFid = 0;
++	spin_lock_irqsave(&ai->main_lock, flags);
++	if (issuecommand_nolock(ai, &cmd, &rsp) != SUCCESS) {
++		txFid = ERROR;
+ 		goto done;
+ 	}
+ 	if ( (rsp.status & 0xFF00) != 0) {
+-		txFid = 0;
++		txFid = ERROR;
+ 		goto done;
+ 	}
++
+ 	/* wait for the allocate event/indication
+-	 * It makes me kind of nervous that this can just sit here and spin,
+-	 * but in practice it only loops like four times. */
+-	while ( (IN4500(ai, EVSTAT) & EV_ALLOC) == 0) ;
++	 * in practice it only loops like four times. */
++	while (((IN4500(ai, EVSTAT) & EV_ALLOC) == 0) && --loop)
++	       ; /* nada */
++	if (!loop) {
++		txFid = ERROR;
++		goto done;
++	}
++
+ 	// get the allocated fid and acknowledge
+ 	txFid = IN4500(ai, TXALLOCFID);
+ 	OUT4500(ai, EVACK, EV_ALLOC);
+@@ -2685,7 +2609,7 @@ static u16 transmit_allocate(struct airo
+ 		bap_write(ai, &txControl, sizeof(txControl), BAP1);
+ 
+ done:
+-	up(&ai->sem);
++	spin_unlock_irqrestore(&ai->main_lock, flags);
+ 
+ 	return txFid;
+ }
+@@ -2693,17 +2617,14 @@ done:
+ /* In general BAP1 is dedicated to transmiting packets.  However,
+    since we need a BAP when accessing RIDs, we also use BAP1 for that.
+    Make sure the BAP1 spinlock is held when this is called. */
+-static int transmit_802_3_packet(struct airo_info *ai, int len, char *pPacket)
++static int transmit_802_3_packet(struct airo_info *ai, u16 txFid, char *pPacket, int len)
+ {
+ 	u16 payloadLen;
+ 	Cmd cmd;
+ 	Resp rsp;
+ 	int miclen = 0;
+-	u16 txFid = len;
+ 	MICBuffer pMic;
+ 
+-	len >>= 16;
+-
+ 	if (len < ETH_ALEN * 2) {
+ 		printk( KERN_WARNING "Short packet %d\n", len );
+ 		return ERROR;
+@@ -2734,12 +2655,12 @@ static int transmit_802_3_packet(struct 
+ 	memset( &cmd, 0, sizeof( cmd ) );
+ 	cmd.cmd = CMD_TRANSMIT;
+ 	cmd.parm0 = txFid;
+-	if (issuecommand(ai, &cmd, &rsp) != SUCCESS) return ERROR;
++	if (issuecommand_nolock(ai, &cmd, &rsp) != SUCCESS) return ERROR;
+ 	if ( (rsp.status & 0xFF00) != 0) return ERROR;
+ 	return SUCCESS;
+ }
+ 
+-static int transmit_802_11_packet(struct airo_info *ai, int len, char *pPacket)
++static int transmit_802_11_packet(struct airo_info *ai, u16 txFid, char *pPacket, int len)
+ {
+ 	u16 fc, payloadLen;
+ 	Cmd cmd;
+@@ -2750,8 +2671,6 @@ static int transmit_802_11_packet(struct
+ 		u16 gaplen;
+ 		u8 gap[6];
+ 	} gap;
+-	u16 txFid = len;
+-	len >>= 16;
+ 	gap.gaplen = 6;
+ 
+ 	fc = le16_to_cpu(*(const u16*)pPacket);
+@@ -2793,7 +2712,7 @@ static int transmit_802_11_packet(struct
+ 	memset( &cmd, 0, sizeof( cmd ) );
+ 	cmd.cmd = CMD_TRANSMIT;
+ 	cmd.parm0 = txFid;
+-	if (issuecommand(ai, &cmd, &rsp) != SUCCESS) return ERROR;
++	if (issuecommand_nolock(ai, &cmd, &rsp) != SUCCESS) return ERROR;
+ 	if ( (rsp.status & 0xFF00) != 0) return ERROR;
+ 	return SUCCESS;
+ }
+@@ -3857,10 +3776,7 @@ static int proc_BSSList_open( struct ino
+ 
+ 			memset(&cmd, 0, sizeof(cmd));
+ 			cmd.cmd=CMD_LISTBSS;
+-			if (down_interruptible(&ai->sem))
+-				return -ERESTARTSYS;
+ 			issuecommand(ai, &cmd, &rsp);
+-			up(&ai->sem);
+ 			data->readlen = 0;
+ 			return 0;
+ 		}
+@@ -3923,13 +3839,6 @@ static void timer_func( u_long data ) {
+ 
+ 	if (!(apriv->flags & FLAG_FLASHING) && (linkstat != 0x400)) {
+ /* We don't have a link so try changing the authtype */
+-		if (down_trylock(&apriv->sem) != 0) {
+-			apriv->timer.expires = RUN_AT(1);
+-			add_timer(&apriv->timer);
+-			return;
+-		}
+-		__set_bit(FLAG_LOCKED, &apriv->flags);
+-
+ 		readConfigRid(apriv);
+ 		disable_MAC(apriv);
+ 		switch(apriv->config.authType) {
+@@ -3955,8 +3864,6 @@ static void timer_func( u_long data ) {
+ 		apriv->need_commit = 1;
+ 		writeConfigRid(apriv);
+ 		enable_MAC(apriv, &rsp);
+-		clear_bit(FLAG_LOCKED, &apriv->flags);
+-		up(&apriv->sem);
+ 
+ /* Schedule check to see if the change worked */
+ 		apriv->timer.expires = RUN_AT(HZ*3);
+@@ -4135,7 +4042,11 @@ static int airo_get_freq(struct net_devi
+ 	struct airo_info *local = dev->priv;
+ 	StatusRid status_rid;		/* Card status info */
+ 
+-	readStatusRid(local, &status_rid);
++	if (local->config.opmode & MODE_STA_ESS)
++		status_rid.channel = local->config.channelSet;
++	else
++		readStatusRid(local, &status_rid);
++
+ 
+ 	/* Will return zero in infrastructure mode */
+ #ifdef WEXT_USECHANNELS
+@@ -4246,11 +4157,8 @@ static int airo_set_wap(struct net_devic
+ 		return -EINVAL;
+ 	else if (!memcmp(bcast, awrq->sa_data, ETH_ALEN)) {
+ 		memset(&cmd, 0, sizeof(cmd));
+-		cmd.cmd=CMD_LOSE_SYNC;
+-		if (down_interruptible(&local->sem))
+-			return -ERESTARTSYS;
++		cmd.cmd = CMD_LOSE_SYNC;
+ 		issuecommand(local, &cmd, &rsp);
+-		up(&local->sem);
+ 	} else {
+ 		memset(&APList_rid, 0, sizeof(APList_rid));
+ 		APList_rid.len = sizeof(APList_rid);
+@@ -5132,11 +5040,8 @@ static int airo_set_scan(struct net_devi
+ 	/* Initiate a scan command */
+ 	memset(&cmd, 0, sizeof(cmd));
+ 	cmd.cmd=CMD_LISTBSS;
+-	if (down_interruptible(&ai->sem))
+-		return -ERESTARTSYS;
+ 	issuecommand(ai, &cmd, &rsp);
+ 	ai->scan_timestamp = jiffies;
+-	up(&ai->sem);
+ 
+ 	/* At this point, just return to the user. */
+ 
+--- linux-2.6.0-test1/drivers/net/wireless/ray_cs.c	2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/net/wireless/ray_cs.c	2003-07-19 17:03:50.000000000 -0700
+@@ -25,6 +25,8 @@
+  * - reorganize kmallocs in ray_attach, checking all for failure
+  *   and releasing the previous allocations if one fails
+  *
++ * Daniele Bellucci <bellucda@tiscali.it> - 07/10/2003
++ * - Audit copy_to_user in ioctl(SIOCGIWESSID)
+  * 
+ =============================================================================*/
+ 
+@@ -1315,7 +1317,8 @@ static int ray_dev_ioctl(struct net_devi
+ 	  /* Push it out ! */
+ 	  wrq->u.data.length = strlen(essid) + 1;
+ 	  wrq->u.data.flags = 1; /* active */
+-	  copy_to_user(wrq->u.data.pointer, essid, sizeof(essid));
++	  if (copy_to_user(wrq->u.data.pointer, essid, sizeof(essid)))
++		  err = -EFAULT;
+ 	}
+       break;
+ 
+--- linux-2.6.0-test1/drivers/parisc/led.c	2003-06-16 22:32:21.000000000 -0700
++++ 25/drivers/parisc/led.c	2003-07-19 17:03:50.000000000 -0700
+@@ -14,6 +14,10 @@
+  * TODO:
+  *	- speed-up calculations with inlined assembler
+  *	- interface to write to second row of LCD from /proc (if technically possible)
++ *
++ * Changes:
++ *      - Audit copy_from_user in led_proc_write.
++ *                                Daniele Bellucci <bellucda@tiscali.it>
+  */
+ 
+ #include <linux/config.h>
+@@ -160,7 +164,9 @@ static int led_proc_write(struct file *f
+ 
+ 	memset(lbuf, 0, count);
+ 
+-	copy_from_user(lbuf, buf, count);
++	if (copy_from_user(lbuf, buf, count))
++		return -EFAULT;
++
+ 	cur = lbuf;
+ 
+ 	/* skip initial spaces */
+--- linux-2.6.0-test1/drivers/parport/parport_pc.c	2003-06-14 12:18:35.000000000 -0700
++++ 25/drivers/parport/parport_pc.c	2003-07-19 17:03:50.000000000 -0700
+@@ -94,7 +94,8 @@ static struct superio_struct {	/* For Su
+ } superios[NR_SUPERIOS] __devinitdata = { {0,},};
+ 
+ static int user_specified __devinitdata = 0;
+-#if defined(CONFIG_PARPORT_PC_FIFO) || defined(CONFIG_PARPORT_PC_SUPERIO)
++#if defined(CONFIG_PARPORT_PC_SUPERIO) || \
++       (defined(CONFIG_PARPORT_1284) && defined(CONFIG_PARPORT_PC_FIFO))
+ static int verbose_probing;
+ #endif
+ static int registered_parport;
+@@ -3116,7 +3117,8 @@ MODULE_PARM_DESC(irq, "IRQ line");
+ MODULE_PARM(irq, "1-" __MODULE_STRING(PARPORT_PC_MAX_PORTS) "s");
+ MODULE_PARM_DESC(dma, "DMA channel");
+ MODULE_PARM(dma, "1-" __MODULE_STRING(PARPORT_PC_MAX_PORTS) "s");
+-#if defined(CONFIG_PARPORT_PC_FIFO) || defined(CONFIG_PARPORT_PC_SUPERIO)
++#if defined(CONFIG_PARPORT_PC_SUPERIO) || \
++       (defined(CONFIG_PARPORT_1284) && defined(CONFIG_PARPORT_PC_FIFO))
+ MODULE_PARM_DESC(verbose_probing, "Log chit-chat during initialisation");
+ MODULE_PARM(verbose_probing, "i");
+ #endif
+--- linux-2.6.0-test1/drivers/pci/hotplug/acpiphp_glue.c	2003-07-10 18:50:31.000000000 -0700
++++ 25/drivers/pci/hotplug/acpiphp_glue.c	2003-07-19 17:03:50.000000000 -0700
+@@ -607,7 +607,7 @@ find_p2p_bridge (acpi_handle handle, u32
+ 
+ 	/* check if this bridge has ejectable slots */
+ 	if (detect_ejectable_slots(handle) > 0) {
+-		dbg("found PCI-to-PCI bridge at PCI %s\n", dev->slot_name);
++		dbg("found PCI-to-PCI bridge at PCI %s\n", pci_name(dev));
+ 		add_p2p_bridge(handle, seg, bus, device, function);
+ 	}
+ 
+@@ -693,7 +693,7 @@ static int power_on_slot (struct acpiphp
+ 
+ 		if (func->flags & FUNC_HAS_PS0) {
+ 			dbg("%s: executing _PS0 on %s\n", __FUNCTION__,
+-			    func->pci_dev->slot_name);
++			    pci_name(func->pci_dev));
+ 			status = acpi_evaluate_object(func->handle, "_PS0", NULL, NULL);
+ 			if (ACPI_FAILURE(status)) {
+ 				warn("%s: _PS0 failed\n", __FUNCTION__);
+--- linux-2.6.0-test1/drivers/pci/hotplug/acpiphp_pci.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/pci/hotplug/acpiphp_pci.c	2003-07-19 17:03:50.000000000 -0700
+@@ -212,7 +212,7 @@ static int detect_used_resource (struct 
+ 	int count;
+ 	struct pci_resource *res;
+ 
+-	dbg("Device %s\n", dev->slot_name);
++	dbg("Device %s\n", pci_name(dev));
+ 
+ 	for (count = 0; address[count]; count++) {	/* for 6 BARs */
+ 		pci_read_config_dword(dev, address[count], &bar);
+@@ -337,7 +337,7 @@ int acpiphp_init_func_resource (struct a
+ 	struct pci_dev *dev;
+ 
+ 	dev = func->pci_dev;
+-	dbg("Hot-pluggable device %s\n", dev->slot_name);
++	dbg("Hot-pluggable device %s\n", pci_name(dev));
+ 
+ 	for (count = 0; address[count]; count++) {	/* for 6 BARs */
+ 		pci_read_config_dword(dev, address[count], &bar);
+--- linux-2.6.0-test1/drivers/pci/hotplug.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/pci/hotplug.c	2003-07-19 17:03:50.000000000 -0700
+@@ -10,8 +10,6 @@
+ #define DBG(x...)
+ #endif
+ 
+-static void pci_free_resources(struct pci_dev *dev);
+-
+ int pci_hotplug (struct device *dev, char **envp, int num_envp,
+ 		 char *buffer, int buffer_size)
+ {
+@@ -57,7 +55,7 @@ int pci_hotplug (struct device *dev, cha
+ 
+ 	envp[i++] = scratch;
+ 	length += snprintf (scratch, buffer_size - length, "PCI_SLOT_NAME=%s",
+-			    pdev->slot_name);
++			    pci_name(pdev));
+ 	if ((buffer_size - length <= 0) || (i >= num_envp))
+ 		return -ENOMEM;
+ 
+@@ -172,105 +170,3 @@ int pci_visit_dev (struct pci_visit *fn,
+ }
+ EXPORT_SYMBOL(pci_visit_dev);
+ 
+-static void pci_destroy_dev(struct pci_dev *dev)
+-{
+-	pci_proc_detach_device(dev);
+-	device_unregister(&dev->dev);
+-
+-	/* Remove the device from the device lists, and prevent any further
+-	 * list accesses from this device */
+-	spin_lock(&pci_bus_lock);
+-	list_del(&dev->bus_list);
+-	list_del(&dev->global_list);
+-	dev->bus_list.next = dev->bus_list.prev = NULL;
+-	dev->global_list.next = dev->global_list.prev = NULL;
+-	spin_unlock(&pci_bus_lock);
+-
+-	pci_free_resources(dev);
+-	pci_dev_put(dev);
+-}
+-
+-/**
+- * pci_remove_device_safe - remove an unused hotplug device
+- * @dev: the device to remove
+- *
+- * Delete the device structure from the device lists and 
+- * notify userspace (/sbin/hotplug), but only if the device
+- * in question is not being used by a driver.
+- * Returns 0 on success.
+- */
+-int pci_remove_device_safe(struct pci_dev *dev)
+-{
+-	if (pci_dev_driver(dev))
+-		return -EBUSY;
+-	pci_destroy_dev(dev);
+-	return 0;
+-}
+-EXPORT_SYMBOL(pci_remove_device_safe);
+-
+-static void
+-pci_free_resources(struct pci_dev *dev)
+-{
+-	int i;
+-
+-	for (i = 0; i < PCI_NUM_RESOURCES; i++) {
+-		struct resource *res = dev->resource + i;
+-		if (res->parent)
+-			release_resource(res);
+-	}
+-}
+-
+-/**
+- * pci_remove_bus_device - remove a PCI device and any children
+- * @dev: the device to remove
+- *
+- * Remove a PCI device from the device lists, informing the drivers
+- * that the device has been removed.  We also remove any subordinate
+- * buses and children in a depth-first manner.
+- *
+- * For each device we remove, delete the device structure from the
+- * device lists, remove the /proc entry, and notify userspace
+- * (/sbin/hotplug).
+- */
+-void pci_remove_bus_device(struct pci_dev *dev)
+-{
+-	if (dev->subordinate) {
+-		struct pci_bus *b = dev->subordinate;
+-
+-		pci_remove_behind_bridge(dev);
+-		pci_proc_detach_bus(b);
+-
+-		spin_lock(&pci_bus_lock);
+-		list_del(&b->node);
+-		spin_unlock(&pci_bus_lock);
+-
+-		kfree(b);
+-		dev->subordinate = NULL;
+-	}
+-
+-	pci_destroy_dev(dev);
+-}
+-
+-/**
+- * pci_remove_behind_bridge - remove all devices behind a PCI bridge
+- * @dev: PCI bridge device
+- *
+- * Remove all devices on the bus, except for the parent bridge.
+- * This also removes any child buses, and any devices they may
+- * contain in a depth-first manner.
+- */
+-void pci_remove_behind_bridge(struct pci_dev *dev)
+-{
+-	struct list_head *l, *n;
+-
+-	if (dev->subordinate) {
+-		list_for_each_safe(l, n, &dev->subordinate->devices) {
+-			struct pci_dev *dev = pci_dev_b(l);
+-
+-			pci_remove_bus_device(dev);
+-		}
+-	}
+-}
+-
+-EXPORT_SYMBOL(pci_remove_bus_device);
+-EXPORT_SYMBOL(pci_remove_behind_bridge);
+--- linux-2.6.0-test1/drivers/pci/hotplug/cpci_hotplug_core.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/pci/hotplug/cpci_hotplug_core.c	2003-07-19 17:03:50.000000000 -0700
+@@ -427,34 +427,6 @@ cpci_hp_unregister_bus(struct pci_bus *b
+ 	return 0;
+ }
+ 
+-struct slot *
+-cpci_find_slot(struct pci_bus *bus, unsigned int devfn)
+-{
+-	struct slot *slot;
+-	struct slot *found;
+-	struct list_head *tmp;
+-
+-	if(!bus) {
+-		return NULL;
+-	}
+-
+-	spin_lock(&list_lock);
+-	if(!slots) {
+-		spin_unlock(&list_lock);
+-		return NULL;
+-	}
+-	found = NULL;
+-	list_for_each(tmp, &slot_list) {
+-		slot = list_entry(tmp, struct slot, slot_list);
+-		if(slot->bus == bus && slot->devfn == devfn) {
+-			found = slot;
+-			break;
+-		}
+-	}
+-	spin_unlock(&list_lock);
+-	return found;
+-}
+-
+ /* This is the interrupt mode interrupt handler */
+ irqreturn_t
+ cpci_hp_intr(int irq, void *data, struct pt_regs *regs)
+@@ -924,6 +896,5 @@ EXPORT_SYMBOL_GPL(cpci_hp_register_contr
+ EXPORT_SYMBOL_GPL(cpci_hp_unregister_controller);
+ EXPORT_SYMBOL_GPL(cpci_hp_register_bus);
+ EXPORT_SYMBOL_GPL(cpci_hp_unregister_bus);
+-EXPORT_SYMBOL_GPL(cpci_find_slot);
+ EXPORT_SYMBOL_GPL(cpci_hp_start);
+ EXPORT_SYMBOL_GPL(cpci_hp_stop);
+--- linux-2.6.0-test1/drivers/pci/hotplug/cpci_hotplug.h	2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/pci/hotplug/cpci_hotplug.h	2003-07-19 17:03:50.000000000 -0700
+@@ -75,7 +75,6 @@ extern int cpci_hp_register_controller(s
+ extern int cpci_hp_unregister_controller(struct cpci_hp_controller *controller);
+ extern int cpci_hp_register_bus(struct pci_bus *bus, u8 first, u8 last);
+ extern int cpci_hp_unregister_bus(struct pci_bus *bus);
+-extern struct slot *cpci_find_slot(struct pci_bus *bus, unsigned int devfn);
+ extern int cpci_hp_start(void);
+ extern int cpci_hp_stop(void);
+ 
+--- linux-2.6.0-test1/drivers/pci/hotplug/cpci_hotplug_pci.c	2003-07-10 18:50:31.000000000 -0700
++++ 25/drivers/pci/hotplug/cpci_hotplug_pci.c	2003-07-19 17:03:50.000000000 -0700
+@@ -448,7 +448,7 @@ static int cpci_configure_bridge(struct 
+ }
+ 
+ static int configure_visit_pci_dev(struct pci_dev_wrapped *wrapped_dev,
+-			struct pci_bus_wrapped *wrapped_bus)
++				   struct pci_bus_wrapped *wrapped_bus)
+ {
+ 	int rc;
+ 	struct pci_dev *dev = wrapped_dev->dev;
+@@ -461,8 +461,8 @@ static int configure_visit_pci_dev(struc
+ 	 * We need to fix up the hotplug representation with the Linux
+ 	 * representation.
+ 	 */
+-	slot = cpci_find_slot(dev->bus, dev->devfn);
+-	if(slot) {
++	if(wrapped_dev->data) {
++		slot = (struct slot*) wrapped_dev->data;
+ 		slot->dev = dev;
+ 	}
+ 
+@@ -494,9 +494,7 @@ static int unconfigure_visit_pci_dev_pha
+ 		return -ENODEV;
+ 
+ 	/* Remove the Linux representation */
+-	if(pci_remove_device_safe(dev) == 0) {
+-		kfree(dev);
+-	} else {
++	if(pci_remove_device_safe(dev)) {
+ 		err("Could not remove device\n");
+ 		return -1;
+ 	}
+@@ -504,8 +502,8 @@ static int unconfigure_visit_pci_dev_pha
+ 	/*
+ 	 * Now remove the hotplug representation.
+ 	 */
+-	slot = cpci_find_slot(dev->bus, dev->devfn);
+-	if(slot) {
++	if(wrapped_dev->data) {
++		slot = (struct slot*) wrapped_dev->data;
+ 		slot->dev = NULL;
+ 	} else {
+ 		dbg("No hotplug representation for %02x:%02x.%x",
+@@ -574,13 +572,18 @@ int cpci_configure_slot(struct slot* slo
+ 
+ 	/* Still NULL? Well then scan for it! */
+ 	if(slot->dev == NULL) {
++		int n;
+ 		dbg("pci_dev still null");
+ 
+ 		/*
+ 		 * This will generate pci_dev structures for all functions, but
+ 		 * we will only call this case when lookup fails.
+ 		 */
+-		slot->dev = pci_scan_slot(slot->bus, slot->devfn);
++		n = pci_scan_slot(slot->bus, slot->devfn);
++		dbg("%s: pci_scan_slot returned %d", __FUNCTION__, n);
++		if(n > 0)
++			pci_bus_add_devices(slot->bus);
++		slot->dev = pci_find_slot(slot->bus->number, slot->devfn);
+ 		if(slot->dev == NULL) {
+ 			err("Could not find PCI device for slot %02x", slot->number);
+ 			return 0;
+@@ -603,6 +606,10 @@ int cpci_configure_slot(struct slot* slo
+ 				continue;
+ 			wrapped_dev.dev = dev;
+ 			wrapped_bus.bus = slot->dev->bus;
++			if(i)
++				wrapped_dev.data = NULL;
++			else
++				wrapped_dev.data = (void*) slot;
+ 			rc = pci_visit_dev(&configure_functions, &wrapped_dev, &wrapped_bus);
+ 		}
+ 	}
+@@ -635,9 +642,14 @@ int cpci_unconfigure_slot(struct slot* s
+ 		if(dev) {
+ 			wrapped_dev.dev = dev;
+ 			wrapped_bus.bus = dev->bus;
++ 			if(i)
++ 				wrapped_dev.data = NULL;
++ 			else
++ 				wrapped_dev.data = (void*) slot;
+ 			dbg("%s - unconfigure phase 2", __FUNCTION__);
+ 			rc = pci_visit_dev(&unconfigure_functions_phase2,
+-					   &wrapped_dev, &wrapped_bus);
++					   &wrapped_dev,
++					   &wrapped_bus);
+ 			if(rc)
+ 				break;
+ 		}
+--- linux-2.6.0-test1/drivers/pci/hotplug/Kconfig	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/pci/hotplug/Kconfig	2003-07-19 17:03:50.000000000 -0700
+@@ -99,22 +99,17 @@ config HOTPLUG_PCI_ACPI
+ 	  When in doubt, say N.
+ 
+ config HOTPLUG_PCI_CPCI
+-	tristate "CompactPCI Hotplug driver"
++	bool "CompactPCI Hotplug driver"
+ 	depends on HOTPLUG_PCI
+ 	help
+ 	  Say Y here if you have a CompactPCI system card with CompactPCI
+ 	  hotswap support per the PICMG 2.1 specification.
+ 
+-	  This code is also available as a module ( = code which can be
+-	  inserted in and removed from the running kernel whenever you want).
+-	  The module will be called cpci_hotplug. If you want to compile it
+-	  as a module, say M here and read <file:Documentation/modules.txt>.
+-
+ 	  When in doubt, say N.
+ 
+ config HOTPLUG_PCI_CPCI_ZT5550
+ 	tristate "Ziatech ZT5550 CompactPCI Hotplug driver"
+-	depends on HOTPLUG_PCI_CPCI && X86
++	depends on HOTPLUG_PCI && HOTPLUG_PCI_CPCI && X86
+ 	help
+ 	  Say Y here if you have an Performance Technologies (formerly Intel,
+           formerly just Ziatech) Ziatech ZT5550 CompactPCI system card.
+@@ -128,7 +123,7 @@ config HOTPLUG_PCI_CPCI_ZT5550
+ 
+ config HOTPLUG_PCI_CPCI_GENERIC
+ 	tristate "Generic port I/O CompactPCI Hotplug driver"
+-	depends on HOTPLUG_PCI_CPCI && X86
++	depends on HOTPLUG_PCI && HOTPLUG_PCI_CPCI && X86
+ 	help
+ 	  Say Y here if you have a CompactPCI system card that exposes the #ENUM
+ 	  hotswap signal as a bit in a system register that can be read through
+--- linux-2.6.0-test1/drivers/pci/Makefile	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/pci/Makefile	2003-07-19 17:03:50.000000000 -0700
+@@ -2,7 +2,7 @@
+ # Makefile for the PCI bus specific drivers.
+ #
+ 
+-obj-y		+= access.o bus.o probe.o pci.o pool.o quirks.o \
++obj-y		+= access.o bus.o probe.o remove.o pci.o pool.o quirks.o \
+ 			names.o pci-driver.o search.o pci-sysfs.o
+ obj-$(CONFIG_PM)  += power.o
+ obj-$(CONFIG_PROC_FS) += proc.o
+--- linux-2.6.0-test1/drivers/pci/pci.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/pci/pci.c	2003-07-19 17:03:50.000000000 -0700
+@@ -506,7 +506,7 @@ err_out:
+ 		pci_resource_flags(pdev, bar) & IORESOURCE_IO ? "I/O" : "mem",
+ 		bar + 1, /* PCI BAR # */
+ 		pci_resource_len(pdev, bar), pci_resource_start(pdev, bar),
+-		pdev->slot_name);
++		pci_name(pdev));
+ 	return -EBUSY;
+ }
+ 
+@@ -555,7 +555,7 @@ err_out:
+ 		pci_resource_flags(pdev, i) & IORESOURCE_IO ? "I/O" : "mem",
+ 		i + 1, /* PCI BAR # */
+ 		pci_resource_len(pdev, i), pci_resource_start(pdev, i),
+-		pdev->slot_name);
++		pci_name(pdev));
+ 	while(--i >= 0)
+ 		pci_release_region(pdev, i);
+ 		
+@@ -576,7 +576,7 @@ pci_set_master(struct pci_dev *dev)
+ 
+ 	pci_read_config_word(dev, PCI_COMMAND, &cmd);
+ 	if (! (cmd & PCI_COMMAND_MASTER)) {
+-		DBG("PCI: Enabling bus mastering for device %s\n", dev->slot_name);
++		DBG("PCI: Enabling bus mastering for device %s\n", pci_name(dev));
+ 		cmd |= PCI_COMMAND_MASTER;
+ 		pci_write_config_word(dev, PCI_COMMAND, cmd);
+ 	}
+@@ -620,7 +620,7 @@ pci_generic_prep_mwi(struct pci_dev *dev
+ 		return 0;
+ 
+ 	printk(KERN_WARNING "PCI: cache line size of %d is not supported "
+-	       "by device %s\n", pci_cache_line_size << 2, dev->slot_name);
++	       "by device %s\n", pci_cache_line_size << 2, pci_name(dev));
+ 
+ 	return -EINVAL;
+ }
+@@ -653,7 +653,7 @@ pci_set_mwi(struct pci_dev *dev)
+ 
+ 	pci_read_config_word(dev, PCI_COMMAND, &cmd);
+ 	if (! (cmd & PCI_COMMAND_INVALIDATE)) {
+-		DBG("PCI: Enabling Mem-Wr-Inval for device %s\n", dev->slot_name);
++		DBG("PCI: Enabling Mem-Wr-Inval for device %s\n", pci_name(dev));
+ 		cmd |= PCI_COMMAND_INVALIDATE;
+ 		pci_write_config_word(dev, PCI_COMMAND, cmd);
+ 	}
+--- linux-2.6.0-test1/drivers/pci/pool.c	2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/pci/pool.c	2003-07-19 17:03:50.000000000 -0700
+@@ -233,7 +233,7 @@ pci_pool_destroy (struct pci_pool *pool)
+ 				struct pci_page, page_list);
+ 		if (is_page_busy (pool->blocks_per_page, page->bitmap)) {
+ 			printk (KERN_ERR "pci_pool_destroy %s/%s, %p busy\n",
+-				pool->dev ? pool->dev->slot_name : NULL,
++				pool->dev ? pci_name(pool->dev) : NULL,
+ 				pool->name, page->vaddr);
+ 			/* leak the still-in-use consistent memory */
+ 			list_del (&page->page_list);
+@@ -359,7 +359,7 @@ pci_pool_free (struct pci_pool *pool, vo
+ 
+ 	if ((page = pool_find_page (pool, dma)) == 0) {
+ 		printk (KERN_ERR "pci_pool_free %s/%s, %p/%lx (bad dma)\n",
+-			pool->dev ? pool->dev->slot_name : NULL,
++			pool->dev ? pci_name(pool->dev) : NULL,
+ 			pool->name, vaddr, (unsigned long) dma);
+ 		return;
+ 	}
+@@ -372,13 +372,13 @@ pci_pool_free (struct pci_pool *pool, vo
+ #ifdef	CONFIG_DEBUG_SLAB
+ 	if (((dma - page->dma) + (void *)page->vaddr) != vaddr) {
+ 		printk (KERN_ERR "pci_pool_free %s/%s, %p (bad vaddr)/%Lx\n",
+-			pool->dev ? pool->dev->slot_name : NULL,
++			pool->dev ? pci_name(pool->dev) : NULL,
+ 			pool->name, vaddr, (unsigned long long) dma);
+ 		return;
+ 	}
+ 	if (page->bitmap [map] & (1UL << block)) {
+ 		printk (KERN_ERR "pci_pool_free %s/%s, dma %Lx already free\n",
+-			pool->dev ? pool->dev->slot_name : NULL,
++			pool->dev ? pci_name(pool->dev) : NULL,
+ 			pool->name, (unsigned long long)dma);
+ 		return;
+ 	}
+--- linux-2.6.0-test1/drivers/pci/probe.c	2003-07-10 18:50:31.000000000 -0700
++++ 25/drivers/pci/probe.c	2003-07-19 17:04:50.000000000 -0700
+@@ -176,7 +176,7 @@ void __devinit pci_read_bridge_bases(str
+ 		limit |= (io_limit_hi << 16);
+ 	}
+ 
+-	if (base && base <= limit) {
++	if (base <= limit) {
+ 		res->flags = (io_base_lo & PCI_IO_RANGE_TYPE_MASK) | IORESOURCE_IO;
+ 		res->start = base;
+ 		res->end = limit + 0xfff;
+@@ -187,7 +187,7 @@ void __devinit pci_read_bridge_bases(str
+ 	pci_read_config_word(dev, PCI_MEMORY_LIMIT, &mem_limit_lo);
+ 	base = (mem_base_lo & PCI_MEMORY_RANGE_MASK) << 16;
+ 	limit = (mem_limit_lo & PCI_MEMORY_RANGE_MASK) << 16;
+-	if (base && base <= limit) {
++	if (base <= limit) {
+ 		res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM;
+ 		res->start = base;
+ 		res->end = limit + 0xfffff;
+@@ -213,7 +213,7 @@ void __devinit pci_read_bridge_bases(str
+ 		}
+ #endif
+ 	}
+-	if (base && base <= limit) {
++	if (base <= limit) {
+ 		res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM | IORESOURCE_PREFETCH;
+ 		res->start = base;
+ 		res->end = limit + 0xfffff;
+--- linux-2.6.0-test1/drivers/pci/quirks.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/pci/quirks.c	2003-07-19 17:03:50.000000000 -0700
+@@ -33,7 +33,7 @@ static void __devinit quirk_passive_rele
+ 	while ((d = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_0, d))) {
+ 		pci_read_config_byte(d, 0x82, &dlc);
+ 		if (!(dlc & 1<<1)) {
+-			printk(KERN_ERR "PCI: PIIX3: Enabling Passive Release on %s\n", d->slot_name);
++			printk(KERN_ERR "PCI: PIIX3: Enabling Passive Release on %s\n", pci_name(d));
+ 			dlc |= 1<<1;
+ 			pci_write_config_byte(d, 0x82, dlc);
+ 		}
+@@ -437,7 +437,7 @@ static void __devinit quirk_via_irqpic(s
+ 
+ 	if (new_irq != irq) {
+ 		printk(KERN_INFO "PCI: Via IRQ fixup for %s, from %d to %d\n",
+-		       dev->slot_name, irq, new_irq);
++		       pci_name(dev), irq, new_irq);
+ 
+ 		udelay(15);
+ 		pci_write_config_byte(dev, PCI_INTERRUPT_LINE, new_irq);
+@@ -598,7 +598,7 @@ static void __devinit quirk_ide_bases(st
+                return;
+ 
+        printk(KERN_INFO "PCI: Ignoring BAR%d-%d of IDE controller %s\n",
+-              first_bar, last_bar, dev->slot_name);
++              first_bar, last_bar, pci_name(dev));
+ }
+ 
+ /*
+@@ -856,7 +856,7 @@ static void pci_do_fixups(struct pci_dev
+  		    (f->vendor == dev->vendor || f->vendor == (u16) PCI_ANY_ID) &&
+  		    (f->device == dev->device || f->device == (u16) PCI_ANY_ID)) {
+ #ifdef DEBUG
+-			printk(KERN_INFO "PCI: Calling quirk %p for %s\n", f->hook, dev->slot_name);
++			printk(KERN_INFO "PCI: Calling quirk %p for %s\n", f->hook, pci_name(dev));
+ #endif
+ 			f->hook(dev);
+ 		}
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/pci/remove.c	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,113 @@
++#include <linux/pci.h>
++#include <linux/module.h>
++#include "pci.h"
++
++#undef DEBUG
++
++#ifdef DEBUG
++#define DBG(x...) printk(x)
++#else
++#define DBG(x...)
++#endif
++
++static void pci_free_resources(struct pci_dev *dev)
++{
++	int i;
++
++	for (i = 0; i < PCI_NUM_RESOURCES; i++) {
++		struct resource *res = dev->resource + i;
++		if (res->parent)
++			release_resource(res);
++	}
++}
++
++static void pci_destroy_dev(struct pci_dev *dev)
++{
++	pci_proc_detach_device(dev);
++	device_unregister(&dev->dev);
++
++	/* Remove the device from the device lists, and prevent any further
++	 * list accesses from this device */
++	spin_lock(&pci_bus_lock);
++	list_del(&dev->bus_list);
++	list_del(&dev->global_list);
++	dev->bus_list.next = dev->bus_list.prev = NULL;
++	dev->global_list.next = dev->global_list.prev = NULL;
++	spin_unlock(&pci_bus_lock);
++
++	pci_free_resources(dev);
++	pci_dev_put(dev);
++}
++
++/**
++ * pci_remove_device_safe - remove an unused hotplug device
++ * @dev: the device to remove
++ *
++ * Delete the device structure from the device lists and 
++ * notify userspace (/sbin/hotplug), but only if the device
++ * in question is not being used by a driver.
++ * Returns 0 on success.
++ */
++int pci_remove_device_safe(struct pci_dev *dev)
++{
++	if (pci_dev_driver(dev))
++		return -EBUSY;
++	pci_destroy_dev(dev);
++	return 0;
++}
++EXPORT_SYMBOL(pci_remove_device_safe);
++
++/**
++ * pci_remove_bus_device - remove a PCI device and any children
++ * @dev: the device to remove
++ *
++ * Remove a PCI device from the device lists, informing the drivers
++ * that the device has been removed.  We also remove any subordinate
++ * buses and children in a depth-first manner.
++ *
++ * For each device we remove, delete the device structure from the
++ * device lists, remove the /proc entry, and notify userspace
++ * (/sbin/hotplug).
++ */
++void pci_remove_bus_device(struct pci_dev *dev)
++{
++	if (dev->subordinate) {
++		struct pci_bus *b = dev->subordinate;
++
++		pci_remove_behind_bridge(dev);
++		pci_proc_detach_bus(b);
++
++		spin_lock(&pci_bus_lock);
++		list_del(&b->node);
++		spin_unlock(&pci_bus_lock);
++
++		kfree(b);
++		dev->subordinate = NULL;
++	}
++
++	pci_destroy_dev(dev);
++}
++
++/**
++ * pci_remove_behind_bridge - remove all devices behind a PCI bridge
++ * @dev: PCI bridge device
++ *
++ * Remove all devices on the bus, except for the parent bridge.
++ * This also removes any child buses, and any devices they may
++ * contain in a depth-first manner.
++ */
++void pci_remove_behind_bridge(struct pci_dev *dev)
++{
++	struct list_head *l, *n;
++
++	if (dev->subordinate) {
++		list_for_each_safe(l, n, &dev->subordinate->devices) {
++			struct pci_dev *dev = pci_dev_b(l);
++
++			pci_remove_bus_device(dev);
++		}
++	}
++}
++
++EXPORT_SYMBOL(pci_remove_bus_device);
++EXPORT_SYMBOL(pci_remove_behind_bridge);
+--- linux-2.6.0-test1/drivers/pci/setup-bus.c	2003-06-14 12:18:35.000000000 -0700
++++ 25/drivers/pci/setup-bus.c	2003-07-19 17:03:50.000000000 -0700
+@@ -81,7 +81,7 @@ pci_setup_cardbus(struct pci_bus *bus)
+ 	struct pci_bus_region region;
+ 
+ 	printk("PCI: Bus %d, cardbus bridge: %s\n",
+-		bus->number, bridge->slot_name);
++		bus->number, pci_name(bridge));
+ 
+ 	pcibios_resource_to_bus(bridge, &region, bus->resource[0]);
+ 	if (bus->resource[0]->flags & IORESOURCE_IO) {
+@@ -344,7 +344,7 @@ pbus_size_mem(struct pci_bus *bus, unsig
+ 			if (order > 11) {
+ 				printk(KERN_WARNING "PCI: region %s/%d "
+ 				       "too large: %lx-%lx\n",
+-				       dev->slot_name, i, r->start, r->end);
++				       pci_name(dev), i, r->start, r->end);
+ 				r->flags = 0;
+ 				continue;
+ 			}
+@@ -513,7 +513,7 @@ pci_bus_assign_resources(struct pci_bus 
+ 
+ 		default:
+ 			printk(KERN_INFO "PCI: not setting up bridge %s "
+-			       "for bus %d\n", dev->slot_name, b->number);
++			       "for bus %d\n", pci_name(dev), b->number);
+ 			break;
+ 		}
+ 	}
+--- linux-2.6.0-test1/drivers/pci/setup-res.c	2003-06-14 12:18:32.000000000 -0700
++++ 25/drivers/pci/setup-res.c	2003-07-19 17:03:50.000000000 -0700
+@@ -68,7 +68,7 @@ pci_update_resource(struct pci_dev *dev,
+ 
+ 	if ((new ^ check) & mask) {
+ 		printk(KERN_ERR "PCI: Error while updating region "
+-		       "%s/%d (%08x != %08x)\n", dev->slot_name, resno,
++		       "%s/%d (%08x != %08x)\n", pci_name(dev), resno,
+ 		       new, check);
+ 	}
+ 
+@@ -80,7 +80,7 @@ pci_update_resource(struct pci_dev *dev,
+ 		if (check != new) {
+ 			printk(KERN_ERR "PCI: Error updating region "
+ 			       "%s/%d (high %08x != %08x)\n",
+-			       dev->slot_name, resno, new, check);
++			       pci_name(dev), resno, new, check);
+ 		}
+ 	}
+ }
+@@ -101,7 +101,7 @@ pci_claim_resource(struct pci_dev *dev, 
+ 		printk(KERN_ERR "PCI: %s region %d of %s %s [%lx:%lx]\n",
+ 		       root ? "Address space collision on" :
+ 			      "No parent found for",
+-		       resource, dtype, dev->slot_name, res->start, res->end);
++		       resource, dtype, pci_name(dev), res->start, res->end);
+ 	}
+ 
+ 	return err;
+@@ -139,7 +139,7 @@ int pci_assign_resource(struct pci_dev *
+ 
+ 	if (ret) {
+ 		printk(KERN_ERR "PCI: Failed to allocate resource %d(%lx-%lx) for %s\n",
+-		       resno, res->start, res->end, dev->slot_name);
++		       resno, res->start, res->end, pci_name(dev));
+ 	} else if (resno < PCI_BRIDGE_RESOURCES) {
+ 		pci_update_resource(dev, res, resno);
+ 	}
+--- linux-2.6.0-test1/drivers/pcmcia/hd64465_ss.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/pcmcia/hd64465_ss.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * $Id: 2.6.0-test1-mm2.patch,v 1.1.2.2 2003/07/22 07:20:21 braam Exp $
++ * $Id: 2.6.0-test1-mm2.patch,v 1.1.2.2 2003/07/22 07:20:21 braam Exp $
+  *
+  * Device driver for the PCMCIA controller module of the
+  * Hitachi HD64465 handheld companion chip.
+@@ -24,7 +24,6 @@
+  *
+  * by Greg Banks <gbanks@pocketpenguins.com>
+  * (c) 2000 PocketPenguins Inc
+- *
+  */
+ 
+ #include <linux/types.h>
+@@ -37,28 +36,26 @@
+ #include <linux/vmalloc.h>
+ #include <asm/errno.h>
+ #include <linux/irq.h>
+-#include <linux/workqueue.h>
++#include <linux/interrupt.h>
+ #include <linux/device.h>
+ 
+ #include <asm/io.h>
+-#include <asm/hd64465.h>
++#include <asm/hd64465/hd64465.h>
++#include <asm/hd64465/io.h>
+ 
+ #include <pcmcia/version.h>
+ #include <pcmcia/cs_types.h>
+ #include <pcmcia/cs.h>
++#include <pcmcia/cistpl.h>
++#include <pcmcia/ds.h>
+ #include <pcmcia/ss.h>
+ #include <pcmcia/bulkmem.h>
+-#include <pcmcia/cistpl.h>
+ #include "cs_internal.h"
+ 
+ #define MODNAME "hd64465_ss"
+ 
+ /* #define HD64465_DEBUG 1 */
+ 
+-#ifndef HD64465_DEBUG
+-#define HD64465_DEBUG 0
+-#endif
+-
+ #if HD64465_DEBUG
+ #define DPRINTK(args...)	printk(MODNAME ": " args)
+ #else
+@@ -66,7 +63,8 @@
+ #endif
+ 
+ extern int hd64465_io_debug;
+-
++extern void * p3_ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags);
++extern void p3_iounmap(void *addr);
+ 
+ /*============================================================*/
+ 
+@@ -74,37 +72,22 @@ extern int hd64465_io_debug;
+ 
+ typedef struct hs_socket_t
+ {
++    unsigned int	number;
+     u_int   	    	irq;
+     u_long  	    	mem_base;
++    void		*io_base;
+     u_long  	    	mem_length;
+-    void	    	(*handler)(void *info, u_int events);
+-    void    	    	*handler_info;
+-    u_int   	    	pending_events;
+     u_int   	    	ctrl_base;
+     socket_state_t  	state;
+     pccard_io_map     	io_maps[MAX_IO_WIN];
+     pccard_mem_map  	mem_maps[MAX_WIN];
+-    struct vm_struct	*io_vma;    /* allocated kernel vm for mapping IO space */
++    struct pcmcia_socket	socket;
+ } hs_socket_t;
+ 
+-#define HS_MAX_SOCKETS 2
+-static hs_socket_t hs_sockets[HS_MAX_SOCKETS];
+-static spinlock_t hs_pending_event_lock = SPIN_LOCK_UNLOCKED;
+ 
+-/* Calculate socket number from ptr into hs_sockets[] */
+-#define hs_sockno(sp) 	(sp - hs_sockets)
+ 
+-static socket_cap_t hs_socket_cap =
+-{
+-    SS_CAP_PCCARD   	    /* support 16 bit cards */
+-    |SS_CAP_STATIC_MAP      /* mappings are fixed in host memory */
+-    ,
+-    0xffde/*0xffff*/, 	    /* IRQs mapped in s/w so can do any, really */
+-    HD64465_PCC_WINDOW,     /* 16MB fixed window size */
+-    0,	    	    	    /* no PCI support */
+-    0,	    	    	    /* no CardBus support */
+-    0	    	    	    /* no bus operations needed */
+-};
++#define HS_MAX_SOCKETS 2
++static hs_socket_t hs_sockets[HS_MAX_SOCKETS];
+ 
+ #define hs_in(sp, r)	    inb((sp)->ctrl_base + (r))
+ #define hs_out(sp, v, r)    outb(v, (sp)->ctrl_base + (r))
+@@ -179,7 +162,7 @@ static void hs_socket_enable_ireq(hs_soc
+ {
+     	unsigned short cscier;
+ 	
+-    	DPRINTK("hs_socket_enable_ireq(sock=%d)\n", hs_sockno(sp));
++    	DPRINTK("hs_socket_enable_ireq(sock=%d)\n", sp->number);
+ 
+     	cscier = hs_in(sp, CSCIER);
+ 	cscier &= ~HD64465_PCCCSCIER_PIREQE_MASK;
+@@ -191,7 +174,7 @@ static void hs_socket_disable_ireq(hs_so
+ {
+     	unsigned short cscier;
+ 	
+-    	DPRINTK("hs_socket_disable_ireq(sock=%d)\n", hs_sockno(sp));
++    	DPRINTK("hs_socket_disable_ireq(sock=%d)\n", sp->number);
+ 	
+     	cscier = hs_in(sp, CSCIER);
+ 	cscier &= ~HD64465_PCCCSCIER_PIREQE_MASK;
+@@ -255,7 +238,7 @@ static struct hw_interrupt_type hd64465_
+  */
+ static void hs_map_irq(hs_socket_t *sp, unsigned int irq)
+ {
+-    	DPRINTK("hs_map_irq(sock=%d irq=%d)\n", hs_sockno(sp), irq);
++    	DPRINTK("hs_map_irq(sock=%d irq=%d)\n", sp->number, irq);
+ 	
+ 	if (irq >= HS_NUM_MAPPED_IRQS)
+ 	    return;
+@@ -272,7 +255,7 @@ static void hs_map_irq(hs_socket_t *sp, 
+  */
+ static void hs_unmap_irq(hs_socket_t *sp, unsigned int irq)
+ {
+-    	DPRINTK("hs_unmap_irq(sock=%d irq=%d)\n", hs_sockno(sp), irq);
++    	DPRINTK("hs_unmap_irq(sock=%d irq=%d)\n", sp->number, irq);
+ 	
+ 	if (irq >= HS_NUM_MAPPED_IRQS)
+ 	    return;
+@@ -301,7 +284,7 @@ static int hs_set_voltages(hs_socket_t *
+ {
+     	u_int psr;
+ 	u_int vcci = 0;
+-	u_int sock = hs_sockno(sp);
++	u_int sock = sp->number;
+ 	
+     	DPRINTK("hs_set_voltage(%d, %d, %d)\n", sock, Vcc, Vpp);
+ 
+@@ -359,13 +342,12 @@ static void hs_reset_socket(hs_socket_t 
+ 
+ /*============================================================*/
+ 
+-static int hs_init(unsigned int sock)
++static int hs_init(struct pcmcia_socket *s)
+ {
+-    	hs_socket_t *sp = &hs_sockets[sock];
++    	hs_socket_t *sp = container_of(s, struct hs_socket_t, socket);
+ 	
+-    	DPRINTK("hs_init(%d)\n", sock);
++    	DPRINTK("hs_init(%d)\n", sp->number);
+ 	
+-	sp->pending_events = 0;
+ 	sp->state.Vcc = 0;
+ 	sp->state.Vpp = 0;
+ 	hs_set_voltages(sp, 0, 0);
+@@ -375,9 +357,12 @@ static int hs_init(unsigned int sock)
+ 
+ /*============================================================*/
+ 
+-static int hs_suspend(unsigned int sock)
++static int hs_suspend(struct pcmcia_socket *s)
+ {
+-    	DPRINTK("hs_suspend(%d)\n", sock);
++#ifdef HD64465_DEBUG
++    	hs_socket_t *sp = container_of(s, struct hs_socket_t, socket);
++    	DPRINTK("hs_suspend(%d)\n", sp->number);
++#endif
+ 
+     	/* TODO */
+ 	
+@@ -386,32 +371,10 @@ static int hs_suspend(unsigned int sock)
+ 
+ /*============================================================*/
+ 
+-static int hs_register_callback(unsigned int sock,
+-    	    void (*handler)(void *, unsigned int), void * info)
+-{
+-    	hs_socket_t *sp = &hs_sockets[sock];
+-	
+-    	DPRINTK("hs_register_callback(%d)\n", sock);
+-	sp->handler = handler;
+-	sp->handler_info = info;
+-	return 0;
+-}
+-
+-/*============================================================*/
+ 
+-static int hs_inquire_socket(unsigned int sock, socket_cap_t *cap)
++static int hs_get_status(struct pcmcia_socket *s, u_int *value)
+ {
+-    	DPRINTK("hs_inquire_socket(%d)\n", sock);
+-
+-	*cap = hs_socket_cap;
+-	return 0;
+-}
+-
+-/*============================================================*/
+-
+-static int hs_get_status(unsigned int sock, u_int *value)
+-{
+-    	hs_socket_t *sp = &hs_sockets[sock];
++    	hs_socket_t *sp = container_of(s, struct hs_socket_t, socket);
+     	unsigned int isr;
+ 	u_int status = 0;
+ 	
+@@ -473,9 +436,9 @@ static int hs_get_status(unsigned int so
+ 
+ /*============================================================*/
+ 
+-static int hs_get_socket(unsigned int sock, socket_state_t *state)
++static int hs_get_socket(struct pcmcia_socket *s, socket_state_t *state)
+ {
+-    	hs_socket_t *sp = &hs_sockets[sock];
++    	hs_socket_t *sp = container_of(s, struct hs_socket_t, socket);
+ 
+     	DPRINTK("hs_get_socket(%d)\n", sock);
+ 	
+@@ -485,9 +448,9 @@ static int hs_get_socket(unsigned int so
+ 
+ /*============================================================*/
+ 
+-static int hs_set_socket(unsigned int sock, socket_state_t *state)
++static int hs_set_socket(struct pcmcia_socket *s, socket_state_t *state)
+ {
+-    	hs_socket_t *sp = &hs_sockets[sock];
++    	hs_socket_t *sp = container_of(s, struct hs_socket_t, socket);
+     	u_long flags;
+ 	u_int changed;
+ 	unsigned short cscier;
+@@ -495,12 +458,12 @@ static int hs_set_socket(unsigned int so
+     	DPRINTK("hs_set_socket(sock=%d, flags=%x, csc_mask=%x, Vcc=%d, Vpp=%d, io_irq=%d)\n",
+ 	    sock, state->flags, state->csc_mask, state->Vcc, state->Vpp, state->io_irq);
+ 	
+-	save_and_cli(flags);	/* Don't want interrupts happening here */
++	local_irq_save(flags);	/* Don't want interrupts happening here */
+ 
+ 	if (state->Vpp != sp->state.Vpp ||
+ 	    state->Vcc != sp->state.Vcc) {
+ 	    if (!hs_set_voltages(sp, state->Vcc, state->Vpp)) {
+-	    	restore_flags(flags);
++	    	local_irq_restore(flags);
+ 	    	return -EINVAL;
+ 	    }
+ 	}
+@@ -588,7 +551,7 @@ static int hs_set_socket(unsigned int so
+ /*    	hd64465_io_debug = 0; */
+ 	sp->state = *state;
+ 	    
+-	restore_flags(flags);
++	local_irq_restore(flags);
+ 
+ #if HD64465_DEBUG > 10
+ 	if (state->flags & SS_OUTPUT_ENA)   
+@@ -599,10 +562,11 @@ static int hs_set_socket(unsigned int so
+ 
+ /*============================================================*/
+ 
+-static int hs_set_io_map(unsigned int sock, struct pccard_io_map *io)
++static int hs_set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io)
+ {
+-    	hs_socket_t *sp = &hs_sockets[sock];
++    	hs_socket_t *sp = container_of(s, struct hs_socket_t, socket);
+ 	int map = io->map;
++	int sock = sp->number;
+ 	struct pccard_io_map *sio;
+ 	pgprot_t prot;
+ 
+@@ -639,10 +603,9 @@ static int hs_set_io_map(unsigned int so
+ 	    printk(KERN_INFO MODNAME ": MAP_0WS unimplemented\n");
+ 
+ 	if (io->flags & MAP_ACTIVE) {
+-	    unsigned long pstart, psize, paddrbase, vaddrbase;
++	    unsigned long pstart, psize, paddrbase;
+ 	    
+ 	    paddrbase = virt_to_phys((void*)(sp->mem_base + 2 * HD64465_PCC_WINDOW));
+-	    vaddrbase = (unsigned long)sp->io_vma->addr;
+ 	    pstart = io->start & PAGE_MASK;
+ 	    psize = ((io->stop + PAGE_SIZE) & PAGE_MASK) - pstart;
+ 
+@@ -653,26 +616,17 @@ static int hs_set_io_map(unsigned int so
+ 	     * page will be mapped.  But the code allows for weird cards
+ 	     * that might want IO ports > 4K.
+ 	     */
+-	    DPRINTK("remap_page_range(vaddr=0x%08lx, paddr=0x%08lx, size=0x%08lxx)\n",
+-	    	vaddrbase + pstart, paddrbase + pstart, psize);
+-#error This does not work.  Firstly remap_page_range() uses current->mm for
+-#error the address space, which is wrong for kernel mappings.  remap_page_range
+-#error also does flush_{cache,tlb}_range() which ONLY works for user mappings.
+-#error Next, remap_page_range() now wants to take a vm_area_struct arg.
+-	    remap_page_range(vaddrbase + pstart, paddrbase + pstart, psize, prot);
++	    sp->io_base = p3_ioremap(paddrbase + pstart, psize, pgprot_val(prot));
+ 	    
+ 	    /*
+ 	     * Change the mapping used by inb() outb() etc
+ 	     */
+-	    hd64465_port_map(
+-	    	io->start,
++	    hd64465_port_map(io->start,
+ 		io->stop - io->start + 1,
+-	    	vaddrbase + io->start,0);
++	    	(unsigned long)sp->io_base + io->start, 0);
+ 	} else {
+-	    hd64465_port_unmap(
+-	    	sio->start,
+-		sio->stop - sio->start + 1);
+-	    /* TODO: remap_page_range() to mark pages not present ? */
++	    hd64465_port_unmap(sio->start, sio->stop - sio->start + 1);
++	    p3_iounmap(sp->io_base);
+ 	}
+ 	
+ 	*sio = *io;
+@@ -681,9 +635,9 @@ static int hs_set_io_map(unsigned int so
+ 
+ /*============================================================*/
+ 
+-static int hs_set_mem_map(unsigned int sock, struct pccard_mem_map *mem)
++static int hs_set_mem_map(struct pcmcia_socket *s, struct pccard_mem_map *mem)
+ {
+-    	hs_socket_t *sp = &hs_sockets[sock];
++    	hs_socket_t *sp = container_of(s, struct hs_socket_t, socket);
+ 	struct pccard_mem_map *smem;
+ 	int map = mem->map;
+ 	unsigned long paddr, size;
+@@ -722,13 +676,6 @@ static int hs_set_mem_map(unsigned int s
+ 
+ /*============================================================*/
+ 
+-static void hs_proc_setup(unsigned int sock, struct proc_dir_entry *base)
+-{
+-    	DPRINTK("hs_proc_setup(%d)\n", sock);
+-}
+-
+-/*============================================================*/
+-
+ /*
+  * This function is registered with the HD64465 glue code to do a
+  * secondary demux step on the PCMCIA interrupts.  It handles 
+@@ -756,35 +703,9 @@ static int hs_irq_demux(int irq, void *d
+ 
+ /*
+  * Interrupt handling routine.
+- *
+- * This uses the schedule_work() technique to cause reportable events
+- * such as card insertion and removal to be handled in keventd's
+- * process context.
+  */
+  
+-
+-static void hs_events_bh(void *dummy)
+-{
+-	hs_socket_t *sp;
+-	u_int events;
+-	int i;
+-
+-	for (i=0; i<HS_MAX_SOCKETS; i++) {
+-	    sp = &hs_sockets[i];
+-
+-	    spin_lock_irq(&hs_pending_event_lock);
+-	    events = sp->pending_events;
+-	    sp->pending_events = 0;
+-	    spin_unlock_irq(&hs_pending_event_lock);
+-	    
+-	    if (sp->handler)
+-		sp->handler(sp->handler_info, events);
+-	}
+-}
+-
+-static DECLARE_WORK(hs_events_task, hs_events_bh, NULL);
+-
+-static void hs_interrupt(int irq, void *dev, struct pt_regs *regs)
++static irqreturn_t hs_interrupt(int irq, void *dev, struct pt_regs *regs)
+ {
+     	hs_socket_t *sp = (hs_socket_t *)dev;
+ 	u_int events = 0;
+@@ -801,7 +722,7 @@ static void hs_interrupt(int irq, void *
+ 	    if ((hs_in(sp, ISR) & HD64465_PCCISR_PCD_MASK) != 0) {
+ 	    	printk(KERN_NOTICE MODNAME
+ 		    ": socket %d, card not a supported card type or not inserted correctly\n",
+-		    hs_sockno(sp));
++		    sp->number);
+ 		/* Don't do the rest unless a card is present */
+ 		cscr &= ~(HD64465_PCCCSCR_PCDC|
+ 		    	  HD64465_PCCCSCR_PRC|
+@@ -839,34 +760,22 @@ static void hs_interrupt(int irq, void *
+ 
+ 	hs_out(sp, cscr, CSCR);
+ 
+-	if (events) {
+-	    /*
+-    	     * Arrange for events to be reported to the registered
+-	     * event handler function (from CardServices) in a process
+-	     * context (keventd) "soon".
+-	     */
+-	    spin_lock(&hs_pending_event_lock);
+-	    sp->pending_events |= events;
+-	    spin_unlock(&hs_pending_event_lock);
+-	    
+-	    schedule_work(&hs_events_task);
+-	}
++	if (events)
++		pcmcia_parse_events(&sp->socket, events);
++
++	return IRQ_HANDLED;
+ }
+ 
+ /*============================================================*/
+ 
+ static struct pccard_operations hs_operations = {
+-	.owner			= THIS_MODULE,
+ 	.init			= hs_init,
+ 	.suspend		= hs_suspend,
+-	.register_callback	= hs_register_callback,
+-	.inquire_socket		= hs_inquire_socket,
+ 	.get_status		= hs_get_status,
+ 	.get_socket		= hs_get_socket,
+ 	.set_socket		= hs_set_socket,
+ 	.set_io_map		= hs_set_io_map,
+ 	.set_mem_map		= hs_set_mem_map,
+-	.proc_setup		= hs_proc_setup,
+ };
+ 
+ static int hs_init_socket(hs_socket_t *sp, int irq, unsigned long mem_base,
+@@ -886,9 +795,6 @@ static int hs_init_socket(hs_socket_t *s
+ 	for (i=0 ; i<MAX_WIN ; i++)
+ 	    sp->mem_maps[i].map = i;
+ 	
+-	if ((sp->io_vma = get_vm_area(HS_IO_MAP_SIZE, VM_IOREMAP)) == 0)
+-	    return -ENOMEM;
+-
+ 	hd64465_register_irq_demux(sp->irq, hs_irq_demux, sp);
+ 	
+     	if ((err = request_irq(sp->irq, hs_interrupt, SA_INTERRUPT, MODNAME, sp)) < 0)
+@@ -925,9 +831,8 @@ static int hs_init_socket(hs_socket_t *s
+ 	
+ 	hs_reset_socket(sp, 1);
+ 
+-	printk(KERN_INFO "HD64465 PCMCIA bridge socket %d at 0x%08lx irq %d io window %ldK@0x%08lx\n",
+-	    	i, sp->mem_base, sp->irq,
+-		sp->io_vma->size>>10, (unsigned long)sp->io_vma->addr);
++	printk(KERN_INFO "HD64465 PCMCIA bridge socket %d at 0x%08lx irq %d\n",
++	    	i, sp->mem_base, sp->irq);
+ 
+     	return 0;
+ }
+@@ -935,7 +840,10 @@ static int hs_init_socket(hs_socket_t *s
+ static void hs_exit_socket(hs_socket_t *sp)
+ {
+     	unsigned short cscier, gcr;
++	unsigned long flags;
+ 	
++	local_irq_save(flags);
++
+ 	/* turn off interrupts in hardware */
+     	cscier = hs_in(sp, CSCIER);
+ 	cscier = (cscier & IER_MASK) | IER_OFF;
+@@ -955,19 +863,13 @@ static void hs_exit_socket(hs_socket_t *
+ 	    free_irq(sp->irq, hs_interrupt);
+     	    hd64465_unregister_irq_demux(sp->irq);
+ 	}
+-	if (sp->io_vma != 0)
+-	    vfree(sp->io_vma->addr);
+-}
+ 
+-static struct pcmcia_socket_class_data hd64465_data = {
+-	.nsock = HS_MAX_SOCKETS,
+-	.ops = &hs_operations,
+-};
++	local_irq_restore(flags);
++}
+ 
+ static struct device_driver hd64465_driver = {
+ 	.name = "hd64465-pcmcia",
+ 	.bus = &platform_bus_type,
+-	.devclass = &pcmcia_socket_class,
+ 	.suspend = pcmcia_socket_dev_suspend,
+ 	.resume = pcmcia_socket_dev_resume,
+ };
+@@ -996,7 +898,8 @@ static int __init init_hs(void)
+ 	}
+ 
+ /*	hd64465_io_debug = 1; */
+-	register_driver(&hd64465_driver);
++	if (driver_register(&hd64465_driver))
++		return -EINVAL;
+ 	
+ 	/* Wake both sockets out of STANDBY mode */
+ 	/* TODO: wait 15ms */
+@@ -1014,14 +917,22 @@ static int __init init_hs(void)
+ 	v |= HD64465_PCCCSCR_PSWSEL;
+ 	outb(v, HD64465_REG_PCC0CSCR);
+ 
+-    	hs_set_voltages(&hs_sockets[0], 0, 0);
+-    	hs_set_voltages(&hs_sockets[1], 0, 0);
+-	
+ 	/*
+ 	 * Setup hs_sockets[] structures and request system resources.
+ 	 * TODO: on memory allocation failure, power down the socket
+ 	 *       before quitting.
+ 	 */
++	for (i=0; i<HS_MAX_SOCKETS; i++) {
++		hs_set_voltages(&hs_sockets[i], 0, 0);
++
++		hs_sockets[i].socket.features |=  SS_CAP_PCCARD | SS_CAP_STATIC_MAP;      /* mappings are fixed in host memory */
++		hs_sockets[i].socket.irq_mask =  0xffde;/*0xffff*/	    /* IRQs mapped in s/w so can do any, really */
++		hs_sockets[i].socket.map_size = HD64465_PCC_WINDOW;     /* 16MB fixed window size */
++
++		hs_sockets[i].socket.owner = THIS_MODULE;
++		hs_sockets[i].socket.ss_entry = &hs_operations;
++	}
++
+ 	i = hs_init_socket(&hs_sockets[0],
+ 	    HD64465_IRQ_PCMCIA0,
+ 	    HD64465_PCC0_BASE,
+@@ -1040,27 +951,31 @@ static int __init init_hs(void)
+ 	}
+ 
+ /*	hd64465_io_debug = 0; */
+-	hd64465_device.dev.class_data = &hd64465_data;
++
+ 	platform_device_register(&hd64465_device);
+ 
+-	return 0;
++	for (i=0; i<HS_MAX_SOCKETS; i++) {
++		unsigned int ret;
++		hs_sockets[i].socket.dev.dev = &hd64465_device.dev;		
++		hs_sockets[i].number = i;
++		ret = pcmcia_register_socket(&hs_sockets[i].socket);
++		if (ret && i)
++			pcmcia_unregister_socket(&hs_sockets[0].socket);
++	}
++
++    	return 0;
+ }
+ 
+ static void __exit exit_hs(void)
+ {
+-    	u_long flags;
+ 	int i;
+-	
+-	save_and_cli(flags);
+ 
+-    	/*
+-	 * Release kernel resources
+-	 */
+-	for (i=0 ; i<HS_MAX_SOCKETS ; i++)
+-	    hs_exit_socket(&hs_sockets[i]);
++	for (i=0 ; i<HS_MAX_SOCKETS ; i++) {
++		pcmcia_unregister_socket(&hs_sockets[i].socket);
++		hs_exit_socket(&hs_sockets[i]);
++	}
++
+ 	platform_device_unregister(&hd64465_device);
+-	
+-	restore_flags(flags);
+ 	unregister_driver(&hd64465_driver);
+ }
+ 
+--- linux-2.6.0-test1/drivers/pcmcia/ricoh.h	2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/pcmcia/ricoh.h	2003-07-19 17:03:50.000000000 -0700
+@@ -116,6 +116,8 @@
+ #define  RL5C4XX_CMD_SHIFT		4
+ #define  RL5C4XX_HOLD_MASK		0x1c00
+ #define  RL5C4XX_HOLD_SHIFT		10
++#define  RL5C4XX_MISC_CONTROL           0x2F /* 8 bit */
++#define  RL5C4XX_ZV_ENABLE              0x08
+ 
+ #ifdef __YENTA_H
+ 
+@@ -125,10 +127,41 @@
+ #define rl_mem(socket)		((socket)->private[3])
+ #define rl_config(socket)	((socket)->private[4])
+ 
++static void ricoh_zoom_video(struct pcmcia_socket *sock, int onoff)
++{
++        u8 reg;
++	struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
++
++        reg = config_readb(socket, RL5C4XX_MISC_CONTROL);
++        if (onoff)
++                /* Zoom zoom, we will all go together, zoom zoom, zoom zoom */
++                reg |=  RL5C4XX_ZV_ENABLE;
++        else
++                reg &= ~RL5C4XX_ZV_ENABLE;
++	
++        config_writeb(socket, RL5C4XX_MISC_CONTROL, reg);
++}
++
++static void ricoh_set_zv(struct pcmcia_socket *sock)
++{
++	struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
++        if(socket->dev->vendor == PCI_VENDOR_ID_RICOH)
++        {
++                switch(socket->dev->device)
++                {
++                        /* There may be more .. */
++		case  PCI_DEVICE_ID_RICOH_RL5C478:
++			sock->zoom_video = ricoh_zoom_video;
++			break;  
++                }
++        }
++}
++
+ static int ricoh_init(struct pcmcia_socket *sock)
+ {
+ 	struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
+ 	yenta_init(sock);
++	ricoh_set_zv(sock);
+ 
+ 	config_writew(socket, RL5C4XX_MISC, rl_misc(socket));
+ 	config_writew(socket, RL5C4XX_16BIT_CTL, rl_ctl(socket));
+--- linux-2.6.0-test1/drivers/pcmcia/ti113x.h	2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/pcmcia/ti113x.h	2003-07-19 17:03:50.000000000 -0700
+@@ -148,14 +148,96 @@ static int ti_intctl(struct yenta_socket
+ 	return 0;
+ }
+ 
++/*
++ *	Zoom video control for TI122x/113x chips
++ */
++
++static void ti_zoom_video(struct pcmcia_socket *sock, int onoff)
++{
++	u8 reg;
++	struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
++
++	/* If we don't have a Zoom Video switch this is harmless,
++	   we just tristate the unused (ZV) lines */
++	reg = config_readb(socket, TI113X_CARD_CONTROL);
++	if (onoff)
++		/* Zoom zoom, we will all go together, zoom zoom, zoom zoom */
++		reg |= TI113X_CCR_ZVENABLE;
++	else
++		reg &= ~TI113X_CCR_ZVENABLE;
++	config_writeb(socket, TI113X_CARD_CONTROL, reg);
++}
++
++/*
++ *	The 145x series can also use this. They have an additional
++ *	ZV autodetect mode we don't use but don't actually need.
++ *	FIXME: manual says its in func0 and func1 but disagrees with
++ *	itself about this - do we need to force func0, if so we need
++ *	to know a lot more about socket pairings in pcmcia_socket than
++ *	we do now.. uggh.
++ */
++ 
++static void ti1250_zoom_video(struct pcmcia_socket *sock, int onoff)
++{	
++	struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
++	int shift = 0;
++	u8 reg;
++
++	ti_zoom_video(sock, onoff);
++
++	reg = config_readb(socket, 0x84);
++	reg |= (1<<7);	/* ZV bus enable */
++
++	if(PCI_FUNC(socket->dev->devfn)==1)
++		shift = 1;
++	
++	if(onoff)
++	{
++		reg &= ~(1<<6); 	/* Clear select bit */
++		reg |= shift<<6;	/* Favour our socket */
++		reg |= 1<<shift;	/* Socket zoom video on */
++	}
++	else
++	{
++		reg &= ~(1<<6); 	/* Clear select bit */
++		reg |= (1^shift)<<6;	/* Favour other socket */
++		reg &= ~(1<<shift);	/* Socket zoon video off */
++	}
++
++	config_writeb(socket, 0x84, reg);
++}
++
++static void ti_set_zv(struct pcmcia_socket *sock)
++{
++	struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
++	if(socket->dev->vendor == PCI_VENDOR_ID_TI)
++	{
++		switch(socket->dev->device)
++		{
++			/* There may be more .. */
++			case PCI_DEVICE_ID_TI_1220:
++			case PCI_DEVICE_ID_TI_1221:
++			case PCI_DEVICE_ID_TI_1225:
++				sock->zoom_video = ti_zoom_video;
++				break;	
++			case PCI_DEVICE_ID_TI_1250:
++			case PCI_DEVICE_ID_TI_1251A:
++			case PCI_DEVICE_ID_TI_1251B:
++			case PCI_DEVICE_ID_TI_1450:
++				sock->zoom_video = ti1250_zoom_video;
++		}
++	}
++}
+ static int ti_init(struct pcmcia_socket *sock)
+ {
+ 	struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
+ 	yenta_init(sock);
++	ti_set_zv(sock);
+ 	ti_intctl(socket);
+ 	return 0;
+ }
+ 
++
+ /*
+  * Generic TI init - TI has an extension for the
+  * INTCTL register that sets the PCI CSC interrupt.
+@@ -176,9 +258,6 @@ static int ti_override(struct yenta_sock
+ 	if (new != reg)
+ 		exca_writeb(socket, I365_INTCTL, new);
+ 
+-#if 0
+-	/* THIS CAUSES HANGS! Disabled for now, do not know why */
+-
+ 	/*
+ 	 * If ISA interrupts don't work, then fall back to routing card
+ 	 * interrupts to the PCI interrupt of the socket.
+@@ -190,7 +269,7 @@ static int ti_override(struct yenta_sock
+ 		u8 irqmux, devctl;
+ 
+ 		devctl = config_readb(socket, TI113X_DEVICE_CONTROL);
+-		if (devctl & TI113X_DCR_IMODE_MASK != TI12XX_DCR_IMODE_ALL_SERIAL) {
++		if ((devctl & TI113X_DCR_IMODE_MASK) != TI12XX_DCR_IMODE_ALL_SERIAL) {
+ 			printk (KERN_INFO "ti113x: Routing card interrupts to PCI\n");
+ 
+ 			devctl &= ~TI113X_DCR_IMODE_MASK;
+@@ -203,7 +282,6 @@ static int ti_override(struct yenta_sock
+ 			config_writeb(socket, TI113X_DEVICE_CONTROL, devctl);
+ 		}
+ 	}
+-#endif
+ 
+ 	socket->socket.ops->init = ti_init;
+ 	return 0;
+@@ -220,6 +298,7 @@ static int ti113x_init(struct pcmcia_soc
+ {
+ 	struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
+ 	yenta_init(sock);
++	ti_set_zv(sock);
+ 
+ 	config_writel(socket, TI113X_SYSTEM_CONTROL, ti_sysctl(socket));
+ 	config_writeb(socket, TI113X_CARD_CONTROL, ti_cardctl(socket));
+@@ -248,6 +327,7 @@ static int ti1250_init(struct pcmcia_soc
+ 	struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
+ 	yenta_init(sock);
+ 	ti113x_init(sock);
++	ti_set_zv(sock);
+ 	ti_irqmux(socket) = config_readl(socket, TI122X_IRQMUX);
+ 	ti_irqmux(socket) = (ti_irqmux(socket) & ~0x0f) | 0x02; /* route INTA */
+ 	if (!(ti_sysctl(socket) & TI122X_SCR_INTRTIE))
+--- linux-2.6.0-test1/drivers/pcmcia/yenta_socket.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/pcmcia/yenta_socket.c	2003-07-19 17:03:50.000000000 -0700
+@@ -297,6 +297,8 @@ static int yenta_set_socket(struct pcmci
+ 		}
+ 		exca_writeb(socket, I365_CSCINT, reg);
+ 		exca_readb(socket, I365_CSC);
++		if(sock->zoom_video)
++			sock->zoom_video(sock, state->flags & SS_ZVCARD);
+ 	}
+ 	config_writew(socket, CB_BRIDGE_CONTROL, bridge);
+ 	/* Socket event mask: get card insert/remove events.. */
+--- linux-2.6.0-test1/drivers/pnp/isapnp/core.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/pnp/isapnp/core.c	2003-07-19 17:03:50.000000000 -0700
+@@ -255,14 +255,22 @@ static void __init isapnp_peek(unsigned 
+ static int isapnp_next_rdp(void)
+ {
+ 	int rdp = isapnp_rdp;
++	static int old_rdp = 0;
++	
++	if(old_rdp)
++	{
++		release_region(old_rdp, 1);
++		old_rdp = 0;
++	}
+ 	while (rdp <= 0x3ff) {
+ 		/*
+ 		 *	We cannot use NE2000 probe spaces for ISAPnP or we
+ 		 *	will lock up machines.
+ 		 */
+-		if ((rdp < 0x280 || rdp >  0x380) && !check_region(rdp, 1))
++		if ((rdp < 0x280 || rdp >  0x380) && request_region(rdp, 1, "ISAPnP"))
+ 		{
+ 			isapnp_rdp = rdp;
++			old_rdp = rdp;
+ 			return 0;
+ 		}
+ 		rdp += RDP_STEP;
+--- linux-2.6.0-test1/drivers/s390/block/dasd.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/s390/block/dasd.c	2003-07-19 17:03:50.000000000 -0700
+@@ -16,7 +16,6 @@
+ #include <linux/interrupt.h>
+ #include <linux/ctype.h>
+ #include <linux/major.h>
+-#include <linux/blk.h>
+ #include <linux/slab.h>
+ #include <linux/buffer_head.h>
+ 
+--- linux-2.6.0-test1/drivers/s390/block/dasd_genhd.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/s390/block/dasd_genhd.c	2003-07-19 17:03:50.000000000 -0700
+@@ -9,7 +9,7 @@
+  *
+  * Dealing with devices registered to multiple major numbers.
+  *
+- * $Revision: 1.1.2.2 $
++ * $Revision: 1.1.2.2 $
+  */
+ 
+ #include <linux/config.h>
+@@ -17,7 +17,6 @@
+ #include <linux/interrupt.h>
+ #include <linux/fs.h>
+ #include <linux/blkpg.h>
+-#include <linux/blk.h>
+ 
+ #include <asm/uaccess.h>
+ 
+@@ -200,7 +199,6 @@ void
+ dasd_destroy_partitions(struct dasd_device * device)
+ {
+ 	del_gendisk(device->gdp);
+-	put_disk(device->gdp);
+ }
+ 
+ int
+--- linux-2.6.0-test1/drivers/s390/block/dasd_int.h	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/s390/block/dasd_int.h	2003-07-19 17:06:39.000000000 -0700
+@@ -14,7 +14,8 @@
+ 
+ #ifdef __KERNEL__
+ 
+-#define DASD_PER_MAJOR ( 1U<<(MINORBITS-DASD_PARTN_BITS))
++#define DASD_MINORBITS 8
++#define DASD_PER_MAJOR ( 1U<<(DASD_MINORBITS-DASD_PARTN_BITS))
+ #define DASD_PARTN_MASK ((1 << DASD_PARTN_BITS) - 1)
+ 
+ /*
+--- linux-2.6.0-test1/drivers/s390/block/dasd_ioctl.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/s390/block/dasd_ioctl.c	2003-07-19 17:03:50.000000000 -0700
+@@ -14,7 +14,6 @@
+ #include <linux/major.h>
+ #include <linux/fs.h>
+ #include <linux/blkpg.h>
+-#include <linux/blk.h>
+ 
+ #include <asm/ccwdev.h>
+ #include <asm/uaccess.h>
+--- linux-2.6.0-test1/drivers/s390/block/xpram.c	2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/s390/block/xpram.c	2003-07-19 17:03:50.000000000 -0700
+@@ -31,7 +31,6 @@
+ #include <linux/errno.h>
+ #include <linux/init.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
+ #include <linux/blkpg.h>
+ #include <linux/hdreg.h>  /* HDIO_GETGEO */
+ #include <linux/sysdev.h>
+--- linux-2.6.0-test1/drivers/s390/char/sclp.c	2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/s390/char/sclp.c	2003-07-19 17:04:07.000000000 -0700
+@@ -468,17 +468,17 @@ static struct sclp_register sclp_state_c
+  * SCLP quiesce event handler
+  */
+ #ifdef CONFIG_SMP
+-static volatile unsigned long cpu_quiesce_map;
++static cpumask_t cpu_quiesce_map;
+ 
+ static void
+ do_load_quiesce_psw(void * __unused)
+ {
+ 	psw_t quiesce_psw;
+ 
+-	clear_bit(smp_processor_id(), &cpu_quiesce_map);
++	cpu_clear(smp_processor_id(), cpu_quiesce_map);
+ 	if (smp_processor_id() == 0) {
+ 		/* Wait for all other cpus to enter do_load_quiesce_psw */
+-		while (cpu_quiesce_map != 0);
++		while (!cpus_empty(cpu_quiesce_map));
+ 		/* Quiesce the last cpu with the special psw */
+ 		quiesce_psw.mask = PSW_BASE_BITS | PSW_MASK_WAIT;
+ 		quiesce_psw.addr = 0xfff;
+--- linux-2.6.0-test1/drivers/s390/char/tape_block.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/s390/char/tape_block.c	2003-07-19 17:03:50.000000000 -0700
+@@ -13,7 +13,6 @@
+ #include <linux/version.h>
+ #include <linux/module.h>
+ #include <linux/blkdev.h>
+-#include <linux/blk.h>
+ #include <linux/interrupt.h>
+ #include <linux/buffer_head.h>
+ 
+--- linux-2.6.0-test1/drivers/s390/cio/chsc.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/s390/cio/chsc.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  *  drivers/s390/cio/chsc.c
+  *   S/390 common I/O routines -- channel subsystem call
+- *   $Revision: 1.1.2.2 $
++ *   $Revision: 1.1.2.2 $
+  *
+  *    Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
+  *			      IBM Corporation
+@@ -206,6 +206,7 @@ chsc_get_sch_descriptions(void)
+ 	if (!page)
+ 		return -ENOMEM;
+ 
++	err = 0;
+ 	for (irq = 0; irq <= highest_subchannel; irq++) {
+ 		/*
+ 		 * retrieve information for each sch
+@@ -222,13 +223,14 @@ chsc_get_sch_descriptions(void)
+ 				       "not work\n", err);
+ 				cio_chsc_err_msg = 1;
+ 			}
+-			return err;
++			goto out;
+ 		}
+ 		clear_page(page);
+ 	}
+ 	cio_chsc_desc_avail = 1;
++out:
+ 	free_page((unsigned long)page);
+-	return 0;
++	return err;
+ }
+ 
+ __initcall(chsc_get_sch_descriptions);
+@@ -428,7 +430,7 @@ s390_process_res_acc (u8 chpid, __u16 fl
+ 			ret = css_probe_device(irq);
+ 			if (ret == -ENXIO)
+ 				/* We're through */
+-				return;
++				break;
+ 			continue;
+ 		}
+ 	
+--- linux-2.6.0-test1/drivers/s390/cio/cio.c	2003-06-14 12:18:48.000000000 -0700
++++ 25/drivers/s390/cio/cio.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  *  drivers/s390/cio/cio.c
+  *   S/390 common I/O routines -- low level i/o calls
+- *   $Revision: 1.1.2.2 $
++ *   $Revision: 1.1.2.2 $
+  *
+  *    Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
+  *			      IBM Corporation
+@@ -16,10 +16,12 @@
+ #include <linux/init.h>
+ #include <linux/slab.h>
+ #include <linux/device.h>
++#include <linux/kernel_stat.h>
+ 
+ #include <asm/hardirq.h>
+ #include <asm/cio.h>
+ #include <asm/delay.h>
++#include <asm/irq.h>
+ 
+ #include "airq.h"
+ #include "cio.h"
+@@ -442,6 +444,11 @@ cio_enable_subchannel (struct subchannel
+ 			if (sch->schib.pmcw.ena)
+ 				break;
+ 		}
++		if (ret == -EBUSY) {
++			struct irb irb;
++			if (tsch(sch->irq, &irb) != 0)
++				break;
++		}
+ 	}
+ 	sprintf (dbf_txt, "ret:%d", ret);
+ 	CIO_TRACE_EVENT (2, dbf_txt);
+@@ -608,6 +615,7 @@ do_IRQ (struct pt_regs regs)
+ 	tpi_info = (struct tpi_info *) __LC_SUBCHANNEL_ID;
+ 	irb = (struct irb *) __LC_IRB;
+ 	do {
++		kstat_cpu(smp_processor_id()).irqs[IO_INTERRUPT]++;
+ 		/*
+ 		 * Non I/O-subchannel thin interrupts are processed differently
+ 		 */
+--- linux-2.6.0-test1/drivers/s390/cio/device.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/s390/cio/device.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  *  drivers/s390/cio/device.c
+  *  bus driver for ccw devices
+- *   $Revision: 1.1.2.2 $
++ *   $Revision: 1.1.2.2 $
+  *
+  *    Copyright (C) 2002 IBM Deutschland Entwicklung GmbH,
+  *			 IBM Corporation
+@@ -434,6 +434,13 @@ ccw_device_register(struct ccw_device *c
+ 	return ret;
+ }
+ 
++void
++ccw_device_unregister(void *data)
++{
++	device_unregister((struct device *)data);
++}
++	
++
+ static void
+ ccw_device_release(struct device *dev)
+ {
+@@ -513,17 +520,11 @@ io_subchannel_recog_done(struct ccw_devi
+ 		wake_up(&ccw_device_init_wq);
+ }
+ 
+-static void
++static int
+ io_subchannel_recog(struct ccw_device *cdev, struct subchannel *sch)
+ {
+ 	int rc;
+ 
+-	if (!get_device(&sch->dev)) {
+-		if (cdev->dev.release)
+-			cdev->dev.release(&cdev->dev);
+-		return;
+-	}
+-
+ 	sch->dev.driver_data = cdev;
+ 	sch->driver = &io_subchannel_driver;
+ 	cdev->ccwlock = &sch->lock;
+@@ -540,9 +541,6 @@ io_subchannel_recog(struct ccw_device *c
+ 	snprintf (cdev->dev.bus_id, DEVICE_ID_SIZE, "0:%04x",
+ 		  sch->schib.pmcw.dev);
+ 
+-	/* Do first half of device_register. */
+-	device_initialize(&cdev->dev);
+-
+ 	/* Increase counter of devices currently in recognition. */
+ 	atomic_inc(&ccw_device_init_count);
+ 
+@@ -551,13 +549,10 @@ io_subchannel_recog(struct ccw_device *c
+ 	rc = ccw_device_recognition(cdev);
+ 	spin_unlock_irq(cdev->ccwlock);
+ 	if (rc) {
+-		sch->dev.driver_data = 0;
+-		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);
+ 	}
++	return rc;
+ }
+ 
+ static int
+@@ -565,6 +560,7 @@ io_subchannel_probe (struct device *pdev
+ {
+ 	struct subchannel *sch;
+ 	struct ccw_device *cdev;
++	int rc;
+ 
+ 	sch = to_subchannel(pdev);
+ 	if (sch->dev.driver_data) {
+@@ -573,8 +569,20 @@ io_subchannel_probe (struct device *pdev
+ 		 * Register it and exit. This happens for all early
+ 		 * device, e.g. the console.
+ 		 */
+-		ccw_device_register(sch->dev.driver_data);
++		cdev = sch->dev.driver_data;
++		device_initialize(&cdev->dev);
++		ccw_device_register(cdev);
+ 		subchannel_add_files(&sch->dev);
++		/*
++		 * Check if the device is already online. If it is
++		 * the reference count needs to be corrected
++		 * (see ccw_device_online and css_init_done for the
++		 * ugly details).
++		 */
++		if (cdev->private->state != DEV_STATE_NOT_OPER &&
++		    cdev->private->state != DEV_STATE_OFFLINE &&
++		    cdev->private->state != DEV_STATE_BOXED)
++			get_device(&cdev->dev);
+ 		return 0;
+ 	}
+ 	cdev  = kmalloc (sizeof(*cdev), GFP_KERNEL);
+@@ -592,7 +600,23 @@ io_subchannel_probe (struct device *pdev
+ 		.parent = pdev,
+ 		.release = ccw_device_release,
+ 	};
+-	io_subchannel_recog(cdev, to_subchannel(pdev));
++	/* Do first half of device_register. */
++	device_initialize(&cdev->dev);
++
++	if (!get_device(&sch->dev)) {
++		if (cdev->dev.release)
++			cdev->dev.release(&cdev->dev);
++		return 0;
++	}
++
++	rc = io_subchannel_recog(cdev, to_subchannel(pdev));
++	if (rc) {
++		sch->dev.driver_data = 0;
++		put_device(&sch->dev);
++		if (cdev->dev.release)
++			cdev->dev.release(&cdev->dev);
++	}
++
+ 	return 0;
+ }
+ 
+@@ -604,6 +628,8 @@ static int console_cdev_in_use;
+ static int
+ ccw_device_console_enable (struct ccw_device *cdev, struct subchannel *sch)
+ {
++	int rc;
++
+ 	/* Initialize the ccw_device structure. */
+ 	cdev->dev = (struct device) {
+ 		.parent = &sch->dev,
+@@ -613,7 +639,11 @@ ccw_device_console_enable (struct ccw_de
+ 		.parent = &css_bus_device,
+ 		.bus	= &css_bus_type,
+ 	};
+-	io_subchannel_recog(cdev, sch);
++
++	rc = io_subchannel_recog(cdev, sch);
++	if (rc)
++		return rc;
++
+ 	/* Now wait for the async. recognition to come to an end. */
+ 	while (!dev_fsm_final_state(cdev))
+ 		wait_cons_dev();
+--- linux-2.6.0-test1/drivers/s390/cio/device_fsm.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/s390/cio/device_fsm.c	2003-07-19 17:03:50.000000000 -0700
+@@ -188,7 +188,7 @@ ccw_device_done(struct ccw_device *cdev,
+ 
+ 	wake_up(&cdev->private->wait_q);
+ 
+-	if (state != DEV_STATE_ONLINE)
++	if (css_init_done && state != DEV_STATE_ONLINE)
+ 		put_device (&cdev->dev);
+ }
+ 
+@@ -293,7 +293,7 @@ ccw_device_online(struct ccw_device *cde
+ 	if (cdev->private->state != DEV_STATE_OFFLINE)
+ 		return -EINVAL;
+ 	sch = to_subchannel(cdev->dev.parent);
+-	if (!get_device(&cdev->dev))
++	if (css_init_done && !get_device(&cdev->dev))
+ 		return -ENODEV;
+ 	if (cio_enable_subchannel(sch, sch->schib.pmcw.isc) != 0) {
+ 		/* Couldn't enable the subchannel for i/o. Sick device. */
+@@ -384,7 +384,9 @@ static void
+ ccw_device_offline_notoper(struct ccw_device *cdev, enum dev_event dev_event)
+ {
+ 	cdev->private->state = DEV_STATE_NOT_OPER;
+-	device_unregister(&cdev->dev);
++	INIT_WORK(&cdev->private->kick_work,
++		  ccw_device_unregister, (void *) &cdev->dev);
++	queue_work(ccw_device_work, &cdev->private->kick_work);
+ 	wake_up(&cdev->private->wait_q);
+ }
+ 
+@@ -403,8 +405,10 @@ ccw_device_online_notoper(struct ccw_dev
+ 		// FIXME: not-oper indication to device driver ?
+ 		ccw_device_call_handler(cdev);
+ 	}
++	INIT_WORK(&cdev->private->kick_work,
++		  ccw_device_unregister, (void *) &cdev->dev);
++	queue_work(ccw_device_work, &cdev->private->kick_work);
+ 	wake_up(&cdev->private->wait_q);
+-	device_unregister(&cdev->dev);
+ }
+ 
+ /*
+--- linux-2.6.0-test1/drivers/s390/cio/device.h	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/s390/cio/device.h	2003-07-19 17:03:50.000000000 -0700
+@@ -65,6 +65,8 @@ extern struct workqueue_struct *ccw_devi
+ 
+ void io_subchannel_recog_done(struct ccw_device *cdev);
+ 
++void ccw_device_unregister(void *);
++
+ int ccw_device_recognition(struct ccw_device *);
+ int ccw_device_online(struct ccw_device *);
+ int ccw_device_offline(struct ccw_device *);
+--- linux-2.6.0-test1/drivers/s390/cio/qdio.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/s390/cio/qdio.c	2003-07-19 17:03:50.000000000 -0700
+@@ -55,7 +55,7 @@
+ #include "ioasm.h"
+ #include "chsc.h"
+ 
+-#define VERSION_QDIO_C "$Revision: 1.1.2.2 $"
++#define VERSION_QDIO_C "$Revision: 1.1.2.2 $"
+ 
+ /****************** MODULE PARAMETER VARIABLES ********************/
+ MODULE_AUTHOR("Utz Bacher <utz.bacher@de.ibm.com>");
+@@ -1643,6 +1643,7 @@ qdio_timeout_handler(struct ccw_device *
+ 	default:
+ 		BUG();
+ 	}
++	ccw_device_set_timeout(cdev, 0);
+ 	wake_up(&cdev->private->wait_q);
+ 
+ }
+@@ -1891,26 +1892,25 @@ tiqdio_check_chsc_availability(void)
+ 		result=-EIO;
+ 		goto exit;
+ 	}
+-	/* 4: request block
+-	 * 2: general char
+-	 * 512: chsc char */
+-	if ((scsc_area->general_char[1] & 0x00800000) != 0x00800000) {
++	/* Check for bit 41. */
++	if ((scsc_area->general_char[1] & 0x00400000) != 0x00400000) {
+ 		QDIO_PRINT_WARN("Adapter interruption facility not " \
+ 				"installed.\n");
+ 		result=-ENOENT;
+ 		goto exit;
+ 	}
+-	if ((scsc_area->chsc_char[2] & 0x00180000) != 0x00180000) {
++	/* Check for bits 107 and 108. */
++	if ((scsc_area->chsc_char[3] & 0x00180000) != 0x00180000) {
+ 		QDIO_PRINT_WARN("Set Chan Subsys. Char. & Fast-CHSCs " \
+ 				"not available.\n");
+ 		result=-ENOENT;
+ 		goto exit;
+ 	}
+ 
+-	/* Check for hydra thin interrupts. */
++	/* Check for hydra thin interrupts (bit 67). */
+ 	hydra_thinints = ((scsc_area->general_char[2] & 0x10000000)
+ 		== 0x10000000);
+-	sprintf(dbf_text,"hydra_ti%1x", hydra_thinints);
++	sprintf(dbf_text,"hydrati%1x", hydra_thinints);
+ 	QDIO_DBF_TEXT0(0,setup,dbf_text);
+ exit:
+ 	free_page ((unsigned long) scsc_area);
+@@ -2413,8 +2413,10 @@ qdio_establish_handle_irq(struct ccw_dev
+ 	QDIO_DBF_TEXT0(0,setup,dbf_text);
+ 	QDIO_DBF_TEXT0(0,trace,dbf_text);
+ 
+-	if (qdio_establish_irq_check_for_errors(cdev, cstat, dstat))
++	if (qdio_establish_irq_check_for_errors(cdev, cstat, dstat)) {
++		ccw_device_set_timeout(cdev, 0);
+ 		return;
++	}
+ 
+ 	irq_ptr = cdev->private->qdio_data;
+ 
+@@ -2439,7 +2441,7 @@ qdio_establish_handle_irq(struct ccw_dev
+ 	qdio_initialize_set_siga_flags_output(irq_ptr);
+ 
+ 	qdio_set_state(irq_ptr,QDIO_IRQ_STATE_ESTABLISHED);
+-
++	ccw_device_set_timeout(cdev, 0);
+ }
+ 
+ int
+@@ -2698,6 +2700,8 @@ qdio_establish(struct ccw_device *cdev)
+                            "returned %i, next try returned %i\n",
+                            irq_ptr->irq,result,result2);
+ 		result=result2;
++		if (result)
++			ccw_device_set_timeout(cdev, 0);
+ 	}
+ 
+ 	spin_unlock_irqrestore(get_ccwdev_lock(cdev),saveflags);
+@@ -3000,7 +3004,6 @@ qdio_perf_procfile_read(char *buffer, ch
+ 			int buffer_length, int *eof, void *data)
+ {
+         int c=0;
+-	int irq;
+ 
+         /* we are always called with buffer_length=4k, so we all
+            deliver on the first read */
+@@ -3020,7 +3023,7 @@ qdio_perf_procfile_read(char *buffer, ch
+ 		 perf_stats.siga_ins);
+ 	_OUTP_IT("Number of SIGA out's issued                     : %u\n",
+ 		 perf_stats.siga_outs);
+-	_OUTP_IT("Number of PCIs caught                          : %u\n",
++	_OUTP_IT("Number of PCIs caught                           : %u\n",
+ 		 perf_stats.pcis);
+ 	_OUTP_IT("Number of adapter interrupts caught             : %u\n",
+ 		 perf_stats.thinints);
+@@ -3037,27 +3040,6 @@ qdio_perf_procfile_read(char *buffer, ch
+ 		 perf_stats.outbound_cnt);
+ 	_OUTP_IT("\n");
+ 
+-	/* 
+-	 * FIXME: Rather use driver_for_each_dev, if we had it. 
+-	 * I know this loop destroys our layering, but at least gets the 
+-	 * performance stats out...
+-	 */
+-	for (irq=0;irq <= highest_subchannel; irq++) {
+-		struct qdio_irq *irq_ptr;
+-		struct ccw_device *cdev;
+-
+-		if (!ioinfo[irq])
+-			continue;
+-		cdev = ioinfo[irq]->dev.driver_data;
+-		if (!cdev)
+-			continue;
+-		irq_ptr = cdev->private->qdio_data;
+-		if (!irq_ptr)
+-			continue;
+-		_OUTP_IT("Polling time on irq %4x                        " \
+-			 ": %u\n",
+-			 irq_ptr->irq,irq_ptr->input_qs[0]->timing.threshold);
+-	}
+         return c;
+ }
+ 
+--- linux-2.6.0-test1/drivers/s390/net/qeth.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/s390/net/qeth.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1,6 +1,6 @@
+ /*
+  *
+- * linux/drivers/s390/net/qeth.c ($Revision: 1.1.2.2 $)
++ * linux/drivers/s390/net/qeth.c ($Revision: 1.1.2.2 $)
+  *
+  * Linux on zSeries OSA Express and HiperSockets support
+  *
+@@ -165,7 +165,7 @@ MODULE_PARM_DESC(qeth_sparebufs, "the nu
+ 		 "reserved for low memory situations");
+ 
+ /****************** MODULE STUFF **********************************/
+-#define VERSION_QETH_C "$Revision: 1.1.2.2 $"
++#define VERSION_QETH_C "$Revision: 1.1.2.2 $"
+ static const char *version = "qeth S/390 OSA-Express driver ("
+     VERSION_QETH_C "/" VERSION_QETH_H "/" VERSION_QETH_MPC_H
+     QETH_VERSION_IPV6 QETH_VERSION_VLAN ")";
+@@ -1156,7 +1156,7 @@ qeth_get_skb(unsigned int len)
+ 	return skb;
+ }
+ 
+-static struct sk_buff *
++static inline struct sk_buff *
+ qeth_get_next_skb(struct qeth_card *card,
+ 		  int *element_ptr, int *pos_in_el_ptr,
+ 		  void **hdr_ptr, struct qdio_buffer *buffer)
+@@ -1464,8 +1464,21 @@ __qeth_rebuild_skb(struct qeth_card *car
+ 	skb->ip_summed = card->options.checksum_type;
+ 	if (card->options.checksum_type == HW_CHECKSUMMING) {
+ 		/* do we have a checksummed packet? */
+-		if (*(__u8 *) (hdr_ptr + 11) & QETH_EXT_HEADER_CSUM_TRANSP_REQ) {
+-			/* skb->ip_summed is set already */
++
++		/* 
++		 * we only check for TCP/UDP checksums when the pseudo
++		 * header was also checked successfully -- for the
++		 * rest of the packets, it's not clear, whether the
++		 * upper layer csum is alright. And they shouldn't
++		 * occur too often anyway in real life 
++		 */
++
++		if ((*(__u8*)(hdr_ptr+11) & (QETH_EXT_HEADER_CSUM_HDR_REQ |
++					     QETH_EXT_HEADER_CSUM_TRANSP_REQ)) ==
++		    (QETH_EXT_HEADER_CSUM_HDR_REQ |
++		     QETH_EXT_HEADER_CSUM_TRANSP_REQ)) {
++#if 0
++			/* csum does not need to be set inbound anyway */
+ 			
+ 			/* 
+ 			 * vlan is not an issue here, it's still in
+@@ -1485,11 +1498,15 @@ __qeth_rebuild_skb(struct qeth_card *car
+ 					(&skb->data[ip_len +
+ 						    QETH_TCP_CSUM_OFFSET]);
+ 			}
++#endif /* 0 */
++			skb->ip_summed=CHECKSUM_UNNECESSARY;
+ 		} else {
+ 			/* make the stack check it */
+ 			skb->ip_summed = SW_CHECKSUMMING;
+ 		}
+-	}
++	} else
++		skb->ip_summed=card->options.checksum_type;
++
+ 	__qeth_rebuild_skb_vlan(card, skb, hdr_ptr);
+ }
+ 
+@@ -1596,7 +1613,7 @@ __qeth_fill_header_add_vlan(struct qeth_
+ #endif
+ }
+ 
+-static __u8
++static inline __u8
+ __qeth_get_flags_v4(int multicast)
+ {
+ 	if (multicast == RTN_MULTICAST)
+@@ -1606,7 +1623,7 @@ __qeth_get_flags_v4(int multicast)
+ 	return QETH_CAST_UNICAST;
+ }
+ 
+-static __u8
++static inline __u8
+ __qeth_get_flags_v6(int multicast)
+ {
+ 	if (multicast == RTN_MULTICAST)
+@@ -1625,7 +1642,7 @@ __qeth_get_flags_v6(int multicast)
+ 		QETH_HEADER_IPV6;
+ }
+ 
+-static void
++static inline void
+ qeth_fill_header(struct qeth_hdr *hdr, struct sk_buff *skb,
+ 		 int version, int multicast)
+ {
+@@ -1681,7 +1698,7 @@ qeth_fill_header(struct qeth_hdr *hdr, s
+ 		      __max(QETH_DBF_DATA_LEN, QETH_DBF_DATA_LEN));
+ }
+ 
+-static int inline
++static inline int
+ qeth_fill_buffer(struct qdio_buffer *buffer, char *dataptr,
+ 		 int length, int element)
+ {
+@@ -1735,7 +1752,7 @@ qeth_fill_buffer(struct qdio_buffer *buf
+ 	return element;
+ }
+ 
+-static void
++static inline void
+ qeth_flush_packed_packets(struct qeth_card *card, int queue, int under_int)
+ {
+ 	struct qdio_buffer *buffer;
+@@ -1900,7 +1917,7 @@ qeth_determine_send_error(int cc, int qd
+ 	return ERROR_LINK_FAILURE;	/* should never happen */
+ }
+ 
+-static void
++static inline void
+ qeth_free_buffer(struct qeth_card *card, int queue, int bufno,
+ 		 int qdio_error, int siga_error)
+ {
+@@ -2013,7 +2030,7 @@ qeth_free_buffer(struct qeth_card *card,
+ 	card->send_retries[queue][bufno] = 0;
+ }
+ 
+-static void
++static inline void
+ qeth_free_all_skbs(struct qeth_card *card)
+ {
+ 	int q, b;
+@@ -2049,7 +2066,7 @@ qeth_flush_buffer(struct qeth_card *card
+ }
+ 
+ #ifdef QETH_VLAN
+-void
++static inline void
+ qeth_insert_ipv6_vlan_tag(struct sk_buff *__skb)
+ {
+ 
+@@ -2088,7 +2105,7 @@ __qeth_add_vlan_tag(struct qeth_card *ca
+ #endif
+ }
+ 
+-static void
++static inline void
+ qeth_send_packet_fast(struct qeth_card *card, struct sk_buff *skb,
+ 		      struct net_device *dev,
+ 		      int queue, int version, int multicast)
+@@ -2183,7 +2200,7 @@ qeth_send_packet_fast(struct qeth_card *
+ 
+ /* no checks, if all elements are used, as then we would not be here (at most
+    127 buffers are enqueued) */
+-static void
++static inline void
+ qeth_send_packet_packed(struct qeth_card *card, struct sk_buff *skb,
+ 			struct net_device *dev,
+ 			int queue, int version, int multicast)
+@@ -2391,7 +2408,7 @@ __qeth_switch_state_if_needed(struct qet
+ 	}
+ }
+ 
+-static int
++static inline int
+ qeth_do_send_packet(struct qeth_card *card, struct sk_buff *skb,
+ 		    struct net_device *dev)
+ {
+@@ -2829,23 +2846,27 @@ qeth_send_ipa_cmd(struct qeth_card *card
+ 
+ 	if (!buffer) {
+ 		if (atomic_read(&card->escape_softsetup))
+-			result = 0;
++			return 0;
+ 		else
+-			result = -1;
+-	} else {
+-		reply = (struct ipa_cmd *) PDU_ENCAPSULATION(buffer);
+-		if ((update_cmd) && (reply))
+-			memcpy(cmd, reply, sizeof (struct ipa_cmd));
+-		result = reply->return_code;
+-
+-		/* some special sausages: */
+-		if ((ipa_cmd == IPA_CMD_SETASSPARMS) && (result == 0)) {
+-			result = reply->data.setassparms.return_code;
+-		}
+-		if ((ipa_cmd == IPA_CMD_SETADAPTERPARMS) && (result == 0)) {
+-			result = reply->data.setadapterparms.return_code;
+-		}
++			return -1;
++	}
++	reply = (struct ipa_cmd *) PDU_ENCAPSULATION(buffer);
++	if ((update_cmd) && (reply))
++		memcpy(cmd, reply, sizeof (struct ipa_cmd));
++	result = reply->return_code;
++
++	/* some special sausages: */
++	if ((ipa_cmd == IPA_CMD_SETASSPARMS) && (result == 0)) {
++		result = reply->data.setassparms.return_code;
++		if ((reply->data.setassparms.assist_no==IPA_INBOUND_CHECKSUM) &&
++		    (reply->data.setassparms.command_code == IPA_CMD_ASS_START))
++			card->csum_enable_mask =
++				reply->data.setassparms.data.flags_32bit;
++	}
++	if ((ipa_cmd == IPA_CMD_SETADAPTERPARMS) && (result == 0)) {
++		result = reply->data.setadapterparms.return_code;
+ 	}
++
+ 	return result;
+ }
+ 
+@@ -5599,7 +5620,7 @@ go_on_filt:
+ 			}
+ 			result=qeth_send_setassparms_simple_with_data
+ 				(card,IPA_INBOUND_CHECKSUM,
+-				 IPA_CMD_ASS_ENABLE, IPA_CHECKSUM_ENABLE_MASK);
++				 IPA_CMD_ASS_ENABLE, card->csum_enable_mask);
+ 			if (result) {
+ 				PRINT_WARN("Could not enable inbound " \
+ 					   "checksumming on %s: 0x%x, " \
+@@ -6881,6 +6902,14 @@ qeth_peer_func_level(int level)
+ 	return level;		/* hmmm... don't know what to do with that level. */
+ }
+ 
++/* returns last four digits of bus_id */
++static inline __u16
++__raw_devno_from_bus_id(char *id)
++{
++	id += (strlen(id) - 4); 
++	return (__u16) simple_strtoul(id, &id, 16);
++}
++
+ static int
+ qeth_idx_activate_read(struct qeth_card *card)
+ {
+@@ -6905,7 +6934,7 @@ qeth_idx_activate_read(struct qeth_card 
+ 	memcpy(QETH_IDX_ACT_FUNC_LEVEL(card->dma_stuff->sendbuf),
+ 	       &card->func_level, 2);
+ 
+-	temp = _ccw_device_get_device_number(card->ddev);
++	temp = __raw_devno_from_bus_id(card->ddev->dev.bus_id);
+ 	memcpy(QETH_IDX_ACT_QDIO_DEV_CUA(card->dma_stuff->sendbuf), &temp, 2);
+ 	temp = (card->cula << 8) + card->unit_addr2;
+ 	memcpy(QETH_IDX_ACT_QDIO_DEV_REALADDR(card->dma_stuff->sendbuf),
+@@ -7501,10 +7530,8 @@ qeth_verify_dev(struct net_device *dev)
+ 	for (; tmp && (!result); tmp = tmp->next) {
+ 		if (atomic_read(&tmp->shutdown_phase))
+ 			continue;
+-		if (dev == tmp->dev) {
+-			result = QETH_VERIFY_IS_REAL_DEV;
+-		}
+-		result = __qeth_verify_dev_vlan(dev, tmp);
++		result = (dev == tmp->dev)?
++			QETH_VERIFY_IS_REAL_DEV:__qeth_verify_dev_vlan(dev, tmp);
+ 	}
+ 	read_unlock(&list_lock);
+ 	return result;
+@@ -8547,6 +8574,8 @@ qeth_alloc_card(void)
+ 	card->ip_mc_new_state.ipm6_ifa = NULL;
+ #endif /* QETH_IPV6 */
+ 
++	card->csum_enable_mask = IPA_CHECKSUM_DEFAULT_ENABLE_MASK;
++
+ 	/* setup net_device stuff */
+ 	card->dev->priv = card;
+ 
+@@ -9087,21 +9116,19 @@ qeth_procfile_open(struct inode *inode, 
+ 		/* FIXME: this is really a mess... */
+ 
+ #ifdef QETH_IPV6
+-		if (atomic_read(&card->rt4fld) && atomic_read(&card->rt6fld))
+-			strcpy(router_str, "no");
+-		else if (atomic_read(&card->rt4fld)
+-			 || atomic_read(&card->rt6fld))
+-			strcpy(router_str, "mix");
++		if (atomic_read(&card->rt4fld) || atomic_read(&card->rt6fld))
++			strcpy(router_str, "FLD");
+ #else/* QETH_IPV6 */
+ 		if (atomic_read(&card->rt4fld))
+-			strcpy(router_str, "no");
++			strcpy(router_str, "FLD");
+ #endif /* QETH_IPV6 */
+ 		else if (((card->options.routing_type4 & ROUTER_MASK) ==
+ 			  PRIMARY_ROUTER)
+ #ifdef QETH_IPV6
+ 			 &&
+-			 ((card->options.routing_type6 & ROUTER_MASK) ==
+-			  PRIMARY_ROUTER)
++			 (((card->options.routing_type6 & ROUTER_MASK) ==
++			  PRIMARY_ROUTER) ||
++			  (!qeth_is_supported(IPA_IPv6)))
+ #endif /* QETH_IPV6 */
+ 		    ) {
+ 			strcpy(router_str, "pri");
+@@ -9110,8 +9137,9 @@ qeth_procfile_open(struct inode *inode, 
+ 			 SECONDARY_ROUTER)
+ #ifdef QETH_IPV6
+ 			&&
+-			((card->options.routing_type6 & ROUTER_MASK) ==
+-			 SECONDARY_ROUTER)
++			(((card->options.routing_type6 & ROUTER_MASK) ==
++			 SECONDARY_ROUTER) ||
++			 (!qeth_is_supported(IPA_IPv6)))
+ #endif /* QETH_IPV6 */
+ 		    ) {
+ 			strcpy(router_str, "sec");
+@@ -9120,8 +9148,9 @@ qeth_procfile_open(struct inode *inode, 
+ 			 MULTICAST_ROUTER)
+ #ifdef QETH_IPV6
+ 			&&
+-			((card->options.routing_type6 & ROUTER_MASK) ==
+-			 MULTICAST_ROUTER)
++			(((card->options.routing_type6 & ROUTER_MASK) ==
++			 MULTICAST_ROUTER) ||
++			 (!qeth_is_supported(IPA_IPv6)))
+ #endif /* QETH_IPV6 */
+ 		    ) {
+ 			strcpy(router_str, "mc");
+@@ -9130,8 +9159,9 @@ qeth_procfile_open(struct inode *inode, 
+ 			 PRIMARY_CONNECTOR)
+ #ifdef QETH_IPV6
+ 			&&
+-			((card->options.routing_type6 & ROUTER_MASK) ==
+-			 PRIMARY_CONNECTOR)
++			(((card->options.routing_type6 & ROUTER_MASK) ==
++			 PRIMARY_CONNECTOR) ||
++			 (!qeth_is_supported(IPA_IPv6)))
+ #endif /* QETH_IPV6 */
+ 		    ) {
+ 			strcpy(router_str, "p.c");
+@@ -9140,8 +9170,9 @@ qeth_procfile_open(struct inode *inode, 
+ 			 SECONDARY_CONNECTOR)
+ #ifdef QETH_IPV6
+ 			&&
+-			((card->options.routing_type6 & ROUTER_MASK) ==
+-			 SECONDARY_CONNECTOR)
++			(((card->options.routing_type6 & ROUTER_MASK) ==
++			 SECONDARY_CONNECTOR) ||
++			 (!qeth_is_supported(IPA_IPv6)))
+ #endif /* QETH_IPV6 */
+ 		    ) {
+ 			strcpy(router_str, "s.c");
+@@ -9150,8 +9181,9 @@ qeth_procfile_open(struct inode *inode, 
+ 			 NO_ROUTER)
+ #ifdef QETH_IPV6
+ 			&&
+-			((card->options.routing_type6 & ROUTER_MASK) ==
+-			 NO_ROUTER)
++			(((card->options.routing_type6 & ROUTER_MASK) ==
++			 NO_ROUTER) ||
++			 (!qeth_is_supported(IPA_IPv6)))
+ #endif /* QETH_IPV6 */
+ 		    ) {
+ 			strcpy(router_str, "no");
+@@ -10115,7 +10147,7 @@ qeth_route4_show(struct device *dev, cha
+ 		return -EINVAL;
+ 
+ 	if (atomic_read(&card->rt4fld))
+-		return sprintf(buf, "%s\n", "no");
++		return sprintf(buf, "%s\n", "FLD");
+ 
+ 	switch (card->options.routing_type4 & ROUTER_MASK) {
+ 	case PRIMARY_ROUTER:
+@@ -10202,7 +10234,10 @@ qeth_route6_show(struct device *dev, cha
+ 		return -EINVAL;
+ 
+ 	if (atomic_read(&card->rt6fld))
+-		return sprintf(buf, "%s\n", "no");
++		return sprintf(buf, "%s\n", "FLD");
++
++	if (!qeth_is_supported(IPA_IPv6))
++		return sprintf(buf, "%s\n", "n/a");
+ 
+ 	switch (card->options.routing_type6 & ROUTER_MASK) {
+ 	case PRIMARY_ROUTER:
+@@ -11061,6 +11096,10 @@ qeth_set_offline(struct ccwgroup_device 
+ 
+ 	QETH_DBF_TEXT4(0, trace, "freecard");
+ 
++	memset(card->dev, 0, sizeof (struct net_device));
++	card->dev->priv = card;
++	strncpy(card->dev->name, card->dev_name, IFNAMSIZ);
++
+ 	ccw_device_set_offline(card->ddev);
+ 	ccw_device_set_offline(card->wdev);
+ 	ccw_device_set_offline(card->rdev);
+--- linux-2.6.0-test1/drivers/s390/net/qeth.h	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/s390/net/qeth.h	2003-07-19 17:03:50.000000000 -0700
+@@ -14,7 +14,7 @@
+ 
+ #define QETH_NAME " qeth"
+ 
+-#define VERSION_QETH_H "$Revision: 1.1.2.2 $"
++#define VERSION_QETH_H "$Revision: 1.1.2.2 $"
+ 
+ /******************** CONFIG STUFF ***********************/
+ //#define QETH_DBF_LIKE_HELL
+@@ -938,6 +938,8 @@ struct qeth_card {	/* pointed to by dev-
+ 	__u32 ipa6_enabled;
+ 	__u32 adp_supported;
+ 
++	__u32 csum_enable_mask;
++
+ 	atomic_t startlan_attempts;
+ 	atomic_t enable_routing_attempts4;
+ 	atomic_t rt4fld;
+@@ -1021,7 +1023,7 @@ qeth_get_arphrd_type(int cardtype, int l
+ 		case QETH_MPC_LINK_TYPE_LANE_TR:
+ 			/* fallthrough */
+ 		case QETH_MPC_LINK_TYPE_HSTR:
+-			return ARPHRD_IEEE802;
++			return ARPHRD_IEEE802_TR;
+ 		default:
+ 			return ARPHRD_ETHER;
+ 		}
+--- linux-2.6.0-test1/drivers/s390/net/qeth_mpc.h	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/s390/net/qeth_mpc.h	2003-07-19 17:03:50.000000000 -0700
+@@ -10,7 +10,7 @@
+ #ifndef __QETH_MPC_H__
+ #define __QETH_MPC_H__
+ 
+-#define VERSION_QETH_MPC_H "$Revision: 1.1.2.2 $"
++#define VERSION_QETH_MPC_H "$Revision: 1.1.2.2 $"
+ 
+ #define QETH_IPA_TIMEOUT (card->ipa_timeout)
+ #define QETH_MPC_TIMEOUT 2000
+@@ -188,7 +188,7 @@ extern unsigned char DM_ACT[];
+ #define IPA_CMD_ASS_ARP_QUERY_INFO 0x0104
+ #define IPA_CMD_ASS_ARP_QUERY_STATS 0x0204
+ 
+-#define IPA_CHECKSUM_ENABLE_MASK 0x001a
++#define IPA_CHECKSUM_DEFAULT_ENABLE_MASK 0x001a
+ 
+ #define IPA_CMD_ASS_FILTER_SET_TYPES 0x0003
+ 
+--- linux-2.6.0-test1/drivers/sbus/char/envctrl.c	2003-06-14 12:17:59.000000000 -0700
++++ 25/drivers/sbus/char/envctrl.c	2003-07-19 17:03:50.000000000 -0700
+@@ -14,6 +14,9 @@
+  *
+  * EB - Added support for CP1500 Global Address and PS/Voltage monitoring.
+  * 		Eric Brower <ebrower@usa.net>
++ *
++ * DB - Audit every copy_to_user in envctrl_read.
++ *              Daniele Bellucci <bellucda@tiscali.it>
+  */
+ 
+ #include <linux/config.h>
+@@ -571,7 +574,8 @@ envctrl_read(struct file *file, char *bu
+ 
+ 		data[0] = (unsigned char)(warning_temperature);
+ 		ret = 1;
+-		copy_to_user((unsigned char *)buf, data, ret);
++		if (copy_to_user((unsigned char *)buf, data, ret))
++			ret = -EFAULT;
+ 		break;
+ 
+ 	case ENVCTRL_RD_SHUTDOWN_TEMPERATURE:
+@@ -580,14 +584,16 @@ envctrl_read(struct file *file, char *bu
+ 
+ 		data[0] = (unsigned char)(shutdown_temperature);
+ 		ret = 1;
+-		copy_to_user((unsigned char *)buf, data, ret);
++		if (copy_to_user((unsigned char *)buf, data, ret))
++			ret = -EFAULT;
+ 		break;
+ 
+ 	case ENVCTRL_RD_MTHRBD_TEMPERATURE:
+ 		if (!(pchild = envctrl_get_i2c_child(ENVCTRL_MTHRBDTEMP_MON)))
+ 			return 0;
+ 		ret = envctrl_read_noncpu_info(pchild, ENVCTRL_MTHRBDTEMP_MON, data);
+-		copy_to_user((unsigned char *)buf, data, ret);
++		if (copy_to_user((unsigned char *)buf, data, ret))
++			ret = -EFAULT;
+ 		break;
+ 
+ 	case ENVCTRL_RD_CPU_TEMPERATURE:
+@@ -596,7 +602,8 @@ envctrl_read(struct file *file, char *bu
+ 		ret = envctrl_read_cpu_info(read_cpu, pchild, ENVCTRL_CPUTEMP_MON, data);
+ 
+ 		/* Reset cpu to the default cpu0. */
+-		copy_to_user((unsigned char *)buf, data, ret);
++		if (copy_to_user((unsigned char *)buf, data, ret))
++			ret = -EFAULT;
+ 		break;
+ 
+ 	case ENVCTRL_RD_CPU_VOLTAGE:
+@@ -605,21 +612,24 @@ envctrl_read(struct file *file, char *bu
+ 		ret = envctrl_read_cpu_info(read_cpu, pchild, ENVCTRL_CPUVOLTAGE_MON, data);
+ 
+ 		/* Reset cpu to the default cpu0. */
+-		copy_to_user((unsigned char *)buf, data, ret);
++		if (copy_to_user((unsigned char *)buf, data, ret))
++			ret = -EFAULT;
+ 		break;
+ 
+ 	case ENVCTRL_RD_SCSI_TEMPERATURE:
+ 		if (!(pchild = envctrl_get_i2c_child(ENVCTRL_SCSITEMP_MON)))
+ 			return 0;
+ 		ret = envctrl_read_noncpu_info(pchild, ENVCTRL_SCSITEMP_MON, data);
+-		copy_to_user((unsigned char *)buf, data, ret);
++		if (copy_to_user((unsigned char *)buf, data, ret))
++			ret = -EFAULT;
+ 		break;
+ 
+ 	case ENVCTRL_RD_ETHERNET_TEMPERATURE:
+ 		if (!(pchild = envctrl_get_i2c_child(ENVCTRL_ETHERTEMP_MON)))
+ 			return 0;
+ 		ret = envctrl_read_noncpu_info(pchild, ENVCTRL_ETHERTEMP_MON, data);
+-		copy_to_user((unsigned char *)buf, data, ret);
++		if (copy_to_user((unsigned char *)buf, data, ret))
++			ret = -EFAULT;
+ 		break;
+ 
+ 	case ENVCTRL_RD_FAN_STATUS:
+@@ -627,7 +637,8 @@ envctrl_read(struct file *file, char *bu
+ 			return 0;
+ 		data[0] = envctrl_i2c_read_8574(pchild->addr);
+ 		ret = envctrl_i2c_fan_status(pchild,data[0], data);
+-		copy_to_user((unsigned char *)buf, data, ret);
++		if (copy_to_user((unsigned char *)buf, data, ret))
++			ret = -EFAULT;
+ 		break;
+ 	
+ 	case ENVCTRL_RD_GLOBALADDRESS:
+@@ -635,7 +646,8 @@ envctrl_read(struct file *file, char *bu
+ 			return 0;
+ 		data[0] = envctrl_i2c_read_8574(pchild->addr);
+ 		ret = envctrl_i2c_globaladdr(pchild, data[0], data);
+-		copy_to_user((unsigned char *)buf, data, ret);
++		if (copy_to_user((unsigned char *)buf, data, ret))
++			ret = -EFAULT;
+ 		break;
+ 
+ 	case ENVCTRL_RD_VOLTAGE_STATUS:
+@@ -645,7 +657,8 @@ envctrl_read(struct file *file, char *bu
+ 				return 0;
+ 		data[0] = envctrl_i2c_read_8574(pchild->addr);
+ 		ret = envctrl_i2c_voltage_status(pchild, data[0], data);
+-		copy_to_user((unsigned char *)buf, data, ret);
++		if (copy_to_user((unsigned char *)buf, data, ret))
++			ret = -EFAULT;
+ 		break;
+ 
+ 	default:
+--- linux-2.6.0-test1/drivers/sbus/char/jsflash.c	2003-06-14 12:18:09.000000000 -0700
++++ 25/drivers/sbus/char/jsflash.c	2003-07-19 17:03:50.000000000 -0700
+@@ -38,12 +38,8 @@
+ #include <linux/smp_lock.h>
+ #include <linux/genhd.h>
+ 
+-/*
+- * <linux/blk.h> is controlled from the outside with these definitions.
+- */
+ #define MAJOR_NR	JSFD_MAJOR
+ 
+-#include <linux/blk.h>
+ #include <asm/uaccess.h>
+ #include <asm/pgtable.h>
+ #include <asm/io.h>
+--- linux-2.6.0-test1/drivers/scsi/3w-xxxx.c	2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/scsi/3w-xxxx.c	2003-07-19 17:03:50.000000000 -0700
+@@ -187,7 +187,7 @@ MODULE_LICENSE("GPL");
+ #include <linux/proc_fs.h>
+ #include <linux/sched.h>
+ #include <linux/ioport.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/hdreg.h>
+ #include <linux/string.h>
+ #include <linux/delay.h>
+--- linux-2.6.0-test1/drivers/scsi/53c700.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/53c700.c	2003-07-19 17:03:50.000000000 -0700
+@@ -131,7 +131,7 @@
+ #include <asm/io.h>
+ #include <asm/pgtable.h>
+ #include <asm/byteorder.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/module.h>
+ #include <linux/interrupt.h>
+ 
+@@ -172,7 +172,7 @@ STATIC void NCR_700_chip_reset(struct Sc
+ STATIC int NCR_700_slave_configure(Scsi_Device *SDpnt);
+ STATIC void NCR_700_slave_destroy(Scsi_Device *SDpnt);
+ 
+-static struct device_attribute **NCR_700_dev_attrs = NULL;
++STATIC struct device_attribute *NCR_700_dev_attrs[];
+ 
+ static char *NCR_700_phase[] = {
+ 	"",
+@@ -2027,25 +2027,12 @@ static struct device_attribute NCR_700_a
+ 	.show = NCR_700_show_active_tags,
+ };
+ 
+-STATIC int __init
+-NCR_700_init(void)
+-{
+-	scsi_sysfs_modify_sdev_attribute(&NCR_700_dev_attrs,
+-					 &NCR_700_queue_depth_attr);
+-	scsi_sysfs_modify_sdev_attribute(&NCR_700_dev_attrs,
+-					 &NCR_700_active_tags_attr);
+-	return 0;
+-}
+-
+-/* NULL exit routine to keep modutils happy */
+-STATIC void __exit
+-NCR_700_exit(void)
+-{
+-}
++STATIC struct device_attribute *NCR_700_dev_attrs[] = {
++	&NCR_700_queue_depth_attr,
++	&NCR_700_active_tags_attr,
++	NULL,
++};
+ 
+ EXPORT_SYMBOL(NCR_700_detect);
+ EXPORT_SYMBOL(NCR_700_release);
+ EXPORT_SYMBOL(NCR_700_intr);
+-
+-module_init(NCR_700_init);
+-module_exit(NCR_700_exit);
+--- linux-2.6.0-test1/drivers/scsi/53c7xx.c	2003-06-14 12:18:52.000000000 -0700
++++ 25/drivers/scsi/53c7xx.c	2003-07-19 17:03:50.000000000 -0700
+@@ -249,7 +249,7 @@
+ #include <linux/mm.h>
+ #include <linux/ioport.h>
+ #include <linux/time.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/spinlock.h>
+ #include <linux/interrupt.h>
+ #include <asm/pgtable.h>
+--- linux-2.6.0-test1/drivers/scsi/a2091.c	2003-06-14 12:18:22.000000000 -0700
++++ 25/drivers/scsi/a2091.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1,6 +1,6 @@
+ #include <linux/types.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/sched.h>
+ #include <linux/version.h>
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/a3000.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/scsi/a3000.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1,6 +1,6 @@
+ #include <linux/types.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/sched.h>
+ #include <linux/version.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/aacraid/aachba.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/aacraid/aachba.c	2003-07-19 17:03:50.000000000 -0700
+@@ -33,7 +33,7 @@
+ #include <linux/completion.h>
+ #include <asm/semaphore.h>
+ #include <asm/uaccess.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+ 
+--- linux-2.6.0-test1/drivers/scsi/aacraid/commctrl.c	2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/scsi/aacraid/commctrl.c	2003-07-19 17:03:50.000000000 -0700
+@@ -37,7 +37,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/slab.h>
+ #include <linux/completion.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/semaphore.h>
+ #include <asm/uaccess.h>
+ #include "scsi.h"
+--- linux-2.6.0-test1/drivers/scsi/aacraid/comminit.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/scsi/aacraid/comminit.c	2003-07-19 17:03:50.000000000 -0700
+@@ -37,7 +37,7 @@
+ #include <linux/pci.h>
+ #include <linux/spinlock.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/completion.h>
+ #include <linux/mm.h>
+ #include <asm/semaphore.h>
+--- linux-2.6.0-test1/drivers/scsi/aacraid/commsup.c	2003-06-14 12:18:28.000000000 -0700
++++ 25/drivers/scsi/aacraid/commsup.c	2003-07-19 17:03:50.000000000 -0700
+@@ -41,7 +41,7 @@
+ #include <linux/slab.h>
+ #include <linux/completion.h>
+ #include <asm/semaphore.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+ 
+--- linux-2.6.0-test1/drivers/scsi/aacraid/dpcsup.c	2003-06-14 12:18:09.000000000 -0700
++++ 25/drivers/scsi/aacraid/dpcsup.c	2003-07-19 17:03:50.000000000 -0700
+@@ -38,7 +38,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/slab.h>
+ #include <linux/completion.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/semaphore.h>
+ #include "scsi.h"
+ #include "hosts.h"
+--- linux-2.6.0-test1/drivers/scsi/aacraid/linit.c	2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/scsi/aacraid/linit.c	2003-07-19 17:05:05.000000000 -0700
+@@ -50,7 +50,7 @@
+ #include <linux/completion.h>
+ #include <linux/interrupt.h>
+ #include <asm/semaphore.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+ #include <scsi/scsicam.h>
+@@ -295,7 +295,6 @@ static int aac_detect(Scsi_Host_Template
+ 			printk(KERN_WARNING "aacraid: unable to register \"aac\" device.\n");
+ 	}
+ 
+-	template->present = aac_count; /* # of cards of this type found */
+ 	return aac_count;
+ }
+ 
+--- linux-2.6.0-test1/drivers/scsi/aacraid/rx.c	2003-06-14 12:18:52.000000000 -0700
++++ 25/drivers/scsi/aacraid/rx.c	2003-07-19 17:03:50.000000000 -0700
+@@ -36,7 +36,7 @@
+ #include <linux/pci.h>
+ #include <linux/spinlock.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/delay.h>
+ #include <linux/completion.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/aacraid/sa.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/scsi/aacraid/sa.c	2003-07-19 17:03:50.000000000 -0700
+@@ -36,7 +36,7 @@
+ #include <linux/pci.h>
+ #include <linux/spinlock.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/delay.h>
+ #include <linux/completion.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/advansys.c	2003-06-14 12:18:06.000000000 -0700
++++ 25/drivers/scsi/advansys.c	2003-07-19 17:03:50.000000000 -0700
+@@ -798,7 +798,7 @@
+ #include <linux/mm.h>
+ #include <linux/proc_fs.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/stat.h>
+ #include <linux/spinlock.h>
+ 
+--- linux-2.6.0-test1/drivers/scsi/aha152x.c	2003-06-26 22:07:24.000000000 -0700
++++ 25/drivers/scsi/aha152x.c	2003-07-19 17:03:50.000000000 -0700
+@@ -225,7 +225,7 @@
+ #include <asm/irq.h>
+ #include <asm/io.h>
+ #include <linux/version.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+ #include <asm/system.h>
+@@ -241,9 +241,7 @@
+ #include <linux/isapnp.h>
+ #include <linux/spinlock.h>
+ #include <linux/workqueue.h>
+-#include <linux/blk.h>
+ #include <asm/semaphore.h>
+-#include <asm/io.h>
+ #include <scsi/scsicam.h>
+ 
+ #include "scsi.h"
+@@ -941,7 +939,8 @@ static irqreturn_t swintr(int irqno, voi
+ 	struct Scsi_Host *shpnt = lookup_irq(irqno);
+ 
+ 	if (!shpnt) {
+-        	printk(KERN_ERR "aha152x%d: catched software interrupt %d for unknown controller.\n", HOSTNO, irqno);
++		/* no point using HOSTNO here! */
++        	printk(KERN_ERR "aha152x: catched software interrupt %d for unknown controller.\n", irqno);
+ 		return IRQ_NONE;
+ 	}
+ 
+@@ -1049,6 +1048,10 @@ struct Scsi_Host *aha152x_probe_one(stru
+ 
+ 	printk(KERN_INFO "aha152x%d: trying software interrupt, ",
+ 			 shost->host_no);
++
++	/* need to have host registered before triggering any interrupt */
++	aha152x_host[registered_count] = shost;
++	mb();
+ 	SETPORT(DMACNTRL0, SWINT|INTEN);
+ 	mdelay(1000);
+ 	free_irq(shost->irq, shost);
+@@ -1064,7 +1067,7 @@ struct Scsi_Host *aha152x_probe_one(stru
+ 
+ 		printk(KERN_ERR "aha152x%d: IRQ %d possibly wrong.  "
+ 				"Please verify.\n", shost->host_no, shost->irq);
+-		goto out_release_region;
++		goto out_unregister_host;
+ 	}
+ 	printk("ok.\n");
+ 
+@@ -1077,12 +1080,12 @@ struct Scsi_Host *aha152x_probe_one(stru
+ 				"aha152x", shost) < 0) {
+ 		printk(KERN_ERR "aha152x%d: failed to reassign interrupt.\n",
+ 				shost->host_no);
+-		goto out_release_region;
++		goto out_unregister_host;
+ 	}
+-
+-	aha152x_host[registered_count] = shost;
+ 	return shost;	/* the pcmcia stub needs the return value; */
+ 
++out_unregister_host:
++	aha152x_host[registered_count] = NULL;
+ out_release_region:
+ 	release_region(shost->io_port, IO_RANGE);
+ out_unregister:
+--- linux-2.6.0-test1/drivers/scsi/aha1542.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/aha1542.c	2003-07-19 17:03:50.000000000 -0700
+@@ -38,7 +38,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/pci.h>
+ #include <linux/isapnp.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/mca.h>
+ #include <linux/mca-legacy.h>
+ 
+--- linux-2.6.0-test1/drivers/scsi/aha1542.h	2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/scsi/aha1542.h	2003-07-19 17:03:50.000000000 -0700
+@@ -130,7 +130,6 @@ struct ccb {			/* Command Control Block 
+ };
+ 
+ static int aha1542_detect(Scsi_Host_Template *);
+-static int aha1542_command(Scsi_Cmnd *);
+ static int aha1542_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
+ static int aha1542_abort(Scsi_Cmnd * SCpnt);
+ static int aha1542_bus_reset(Scsi_Cmnd * SCpnt);
+--- linux-2.6.0-test1/drivers/scsi/aha1740.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/aha1740.c	2003-07-19 17:03:50.000000000 -0700
+@@ -34,7 +34,7 @@
+  * are deemed to be part of the source code.
+  */
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/module.h>
+ #include <linux/kernel.h>
+@@ -375,7 +375,7 @@ static int aha1740_queuecommand(Scsi_Cmn
+ #endif
+ 
+ 	/* locate an available ecb */
+-	spin_lock_irqsave(&SCpnt->device->host->host_lock, flags);
++	spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
+ 	ecbno = host->last_ecb_used + 1; /* An optimization */
+ 	if (ecbno >= AHA1740_ECBS)
+ 		ecbno = 0;
+@@ -394,7 +394,7 @@ static int aha1740_queuecommand(Scsi_Cmn
+ 						    doubles as reserved flag */
+ 
+ 	host->last_ecb_used = ecbno;    
+-	spin_unlock_irqrestore(&SCpnt->device->host->host_lock, flags);
++	spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);
+ 
+ #ifdef DEBUG
+ 	printk("Sending command (%d %x)...", ecbno, done);
+@@ -491,7 +491,7 @@ static int aha1740_queuecommand(Scsi_Cmn
+ 		unsigned int base = SCpnt->device->host->io_port;
+ 		DEB(printk("aha1740[%d] critical section\n",ecbno));
+ 
+-		spin_lock_irqsave(&SCpnt->device->host->host_lock, flags);
++		spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
+ 		for (loopcnt = 0; ; loopcnt++) {
+ 			if (inb(G2STAT(base)) & G2STAT_MBXOUT) break;
+ 			if (loopcnt == LOOPCNT_WARN) {
+@@ -511,7 +511,7 @@ static int aha1740_queuecommand(Scsi_Cmn
+ 				panic("aha1740.c: attn wait failed!\n");
+ 		}
+ 		outb(ATTN_START | (target & 7), ATTN(base)); /* Start it up */
+-		spin_unlock_irqrestore(&SCpnt->device->host->host_lock, flags);
++		spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);
+ 		DEB(printk("aha1740[%d] request queued.\n",ecbno));
+ 	} else
+ 		printk(KERN_ALERT "aha1740_queuecommand: done can't be NULL\n");
+@@ -594,7 +594,7 @@ static int aha1740_probe (struct device 
+ 	if (!request_region(slotbase, SLOTSIZE, "aha1740")) /* See if in use */
+ 		return -EBUSY;
+ 	if (!aha1740_test_port(slotbase))
+-		goto err_release;
++		goto err_release_region;
+ 	aha1740_getconfig(slotbase,&irq_level,&translation);
+ 	if ((inb(G2STAT(slotbase)) &
+ 	     (G2STAT_MBXOUT|G2STAT_BUSY)) != G2STAT_MBXOUT) {
+@@ -609,7 +609,7 @@ static int aha1740_probe (struct device 
+ 	shpnt = scsi_host_alloc(&aha1740_template,
+ 			      sizeof(struct aha1740_hostdata));
+ 	if(shpnt == NULL)
+-		goto err_release;
++		goto err_release_region;
+ 
+ 	shpnt->base = 0;
+ 	shpnt->io_port = slotbase;
+@@ -625,21 +625,27 @@ static int aha1740_probe (struct device 
+ 	if (!host->ecb_dma_addr) {
+ 		printk (KERN_ERR "aha1740_probe: Couldn't map ECB, giving up\n");
+ 		scsi_unregister (shpnt);
+-		goto err_release;
++		goto err_host_put;
+ 	}
+ 	
+ 	DEB(printk("aha1740_probe: enable interrupt channel %d\n",irq_level));
+ 	if (request_irq(irq_level,aha1740_intr_handle,0,"aha1740",shpnt)) {
+ 		printk(KERN_ERR "aha1740_probe: Unable to allocate IRQ %d.\n",
+ 		       irq_level);
+-		goto err_release;
++		goto err_unmap;
+ 	}
+ 
+ 	eisa_set_drvdata (edev, shpnt);
+-	scsi_add_host (shpnt, dev);
++	scsi_add_host (shpnt, dev); /* XXX handle failure */
++	scsi_scan_host (shpnt);
+ 	return 0;
+ 
+- err_release:
++ err_unmap:
++	dma_unmap_single (&edev->dev, host->ecb_dma_addr,
++			  sizeof (host->ecb), DMA_BIDIRECTIONAL);
++ err_host_put:
++	scsi_host_put (shpnt);
++ err_release_region:
+ 	release_region(slotbase, SLOTSIZE);
+ 
+ 	return -ENODEV;
+--- linux-2.6.0-test1/drivers/scsi/aic7xxx/aic79xx_osm.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/aic7xxx/aic79xx_osm.c	2003-07-19 17:03:50.000000000 -0700
+@@ -2173,7 +2173,8 @@ ahd_linux_register_host(struct ahd_softc
+ 	ahd_unlock(ahd, &s);
+ 
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+-	scsi_add_host(host, &ahd->dev_softc->dev);
++	scsi_add_host(host, &ahd->dev_softc->dev); /* XXX handle failure */
++	scsi_scan_host(host);
+ #endif
+ 	return (0);
+ }
+--- linux-2.6.0-test1/drivers/scsi/aic7xxx/aic79xx_osm.h	2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/scsi/aic7xxx/aic79xx_osm.h	2003-07-19 17:03:50.000000000 -0700
+@@ -43,7 +43,6 @@
+ #define _AIC79XX_LINUX_H_
+ 
+ #include <linux/types.h>
+-#include <linux/blk.h>
+ #include <linux/blkdev.h>
+ #include <linux/delay.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/aic7xxx/aic7xxx_osm.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/aic7xxx/aic7xxx_osm.c	2003-07-19 17:03:50.000000000 -0700
+@@ -139,7 +139,7 @@
+ #endif
+ 
+ #include <linux/mm.h>		/* For fetching system memory size */
+-#include <linux/blk.h>		/* For block_size() */
++#include <linux/blkdev.h>		/* For block_size() */
+ 
+ /*
+  * Lock protecting manipulation of the ahc softc list.
+@@ -1811,7 +1811,8 @@ ahc_linux_register_host(struct ahc_softc
+ 	ahc_unlock(ahc, &s);
+ 
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+-	scsi_add_host(host, (ahc->dev_softc ? &ahc->dev_softc->dev : NULL));
++	scsi_add_host(host, (ahc->dev_softc ? &ahc->dev_softc->dev : NULL)); /* XXX handle failure */
++	scsi_scan_host(host);
+ #endif
+ 	return (0);
+ }
+--- linux-2.6.0-test1/drivers/scsi/aic7xxx/aic7xxx_osm.h	2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/scsi/aic7xxx/aic7xxx_osm.h	2003-07-19 17:03:50.000000000 -0700
+@@ -60,7 +60,6 @@
+ #define _AIC7XXX_LINUX_H_
+ 
+ #include <linux/types.h>
+-#include <linux/blk.h>
+ #include <linux/blkdev.h>
+ #include <linux/delay.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/aic7xxx/aiclib.c	2003-06-14 12:18:22.000000000 -0700
++++ 25/drivers/scsi/aic7xxx/aiclib.c	2003-07-19 17:03:50.000000000 -0700
+@@ -30,7 +30,6 @@
+  * $Id: 2.6.0-test1-mm2.patch,v 1.1.2.2 2003/07/22 07:20:21 braam Exp $
+  */
+ 
+-#include <linux/blk.h>
+ #include <linux/blkdev.h>
+ #include <linux/delay.h>
+ #include <linux/version.h>
+--- linux-2.6.0-test1/drivers/scsi/aic7xxx_old.c	2003-06-14 12:18:08.000000000 -0700
++++ 25/drivers/scsi/aic7xxx_old.c	2003-07-19 17:03:50.000000000 -0700
+@@ -233,11 +233,10 @@
+ #include <linux/sched.h>
+ #include <linux/pci.h>
+ #include <linux/proc_fs.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/init.h>
+ #include <linux/spinlock.h>
+ #include <linux/smp.h>
+-#include <linux/blk.h>
+ #include <linux/interrupt.h>
+ #include "scsi.h"
+ #include "hosts.h"
+--- linux-2.6.0-test1/drivers/scsi/AM53C974.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/AM53C974.c	2003-07-19 17:03:50.000000000 -0700
+@@ -7,7 +7,7 @@
+ #include <linux/errno.h>
+ #include <linux/pci.h>
+ #include <linux/string.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/init.h>
+ #include <linux/spinlock.h>
+ 
+--- linux-2.6.0-test1/drivers/scsi/amiga7xx.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/amiga7xx.c	2003-07-19 17:03:50.000000000 -0700
+@@ -9,7 +9,7 @@
+  */
+ #include <linux/types.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/sched.h>
+ #include <linux/version.h>
+ #include <linux/config.h>
+--- linux-2.6.0-test1/drivers/scsi/arm/acornscsi.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/arm/acornscsi.c	2003-07-19 17:03:50.000000000 -0700
+@@ -138,7 +138,7 @@
+ #include <linux/errno.h>
+ #include <linux/proc_fs.h>
+ #include <linux/ioport.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/delay.h>
+ #include <linux/interrupt.h>
+ #include <linux/init.h>
+@@ -3043,9 +3043,13 @@ acornscsi_probe(struct expansion_card *e
+ 	acornscsi_resetcard(ashost);
+ 
+ 	ret = scsi_add_host(host, &ec->dev);
+-	if (ret == 0)
+-		goto out;
++	if (ret)
++		goto err_7;
++
++	scsi_scan_host(host);
++	goto out;
+ 
++ err_7:
+ 	free_irq(host->irq, ashost);
+  err_6:
+ 	release_region(host->io_port, 2048);
+--- linux-2.6.0-test1/drivers/scsi/arm/arxescsi.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/arm/arxescsi.c	2003-07-19 17:03:50.000000000 -0700
+@@ -19,7 +19,7 @@
+  *  22-10-2000  SH		Updated for new registering scheme.
+  */
+ #include <linux/module.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/arm/cumana_1.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/arm/cumana_1.c	2003-07-19 17:03:50.000000000 -0700
+@@ -8,7 +8,7 @@
+ #include <linux/sched.h>
+ #include <linux/ioport.h>
+ #include <linux/delay.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/init.h>
+ 
+ #include <asm/ecard.h>
+@@ -297,9 +297,13 @@ cumanascsi1_probe(struct expansion_card 
+ 	printk("\n");
+ 
+ 	ret = scsi_add_host(host, &ec->dev);
+-	if (ret == 0)
+-		goto out;
++	if (ret)
++		goto out_free_irq;
++
++	scsi_scan_host(host);
++	goto out;
+ 
++ out_free_irq:
+ 	free_irq(host->irq, host);
+  out_release:
+ 	release_region(host->io_port, host->n_io_port);
+--- linux-2.6.0-test1/drivers/scsi/arm/cumana_2.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/arm/cumana_2.c	2003-07-19 17:03:50.000000000 -0700
+@@ -17,7 +17,7 @@
+  *   02-04-2000	RMK	0.0.4	Updated for new error handling code.
+  */
+ #include <linux/module.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/arm/ecoscsi.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/arm/ecoscsi.c	2003-07-19 17:03:50.000000000 -0700
+@@ -27,7 +27,7 @@
+ #include <linux/ioport.h>
+ #include <linux/delay.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ 
+ #include <asm/io.h>
+ #include <asm/system.h>
+@@ -205,7 +205,8 @@ static int __init ecoscsi_init(void)
+ 	NCR5380_print_options(host);
+ 	printk("\n");
+ 
+-	scsi_add_host(host, NULL);
++	scsi_add_host(host, NULL); /* XXX handle failure */
++	scsi_scan_host(host);
+ 	return 0;
+ 
+ release_reg:
+--- linux-2.6.0-test1/drivers/scsi/arm/eesox.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/arm/eesox.c	2003-07-19 17:03:50.000000000 -0700
+@@ -23,7 +23,7 @@
+  *				error handling code.
+  */
+ #include <linux/module.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/arm/fas216.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/arm/fas216.c	2003-07-19 17:03:50.000000000 -0700
+@@ -35,7 +35,7 @@
+  *			condition status from targets.
+  */
+ #include <linux/module.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/ioport.h>
+@@ -2861,6 +2861,8 @@ int fas216_add(struct Scsi_Host *host, s
+ 	ret = scsi_add_host(host, dev);
+ 	if (ret)
+ 		fas216_writeb(info, REG_CMD, CMD_RESETCHIP);
++	else
++		scsi_scan_host(host);
+ 
+ 	return ret;
+ }
+--- linux-2.6.0-test1/drivers/scsi/arm/oak.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/arm/oak.c	2003-07-19 17:03:50.000000000 -0700
+@@ -9,7 +9,7 @@
+ #include <linux/sched.h>
+ #include <linux/ioport.h>
+ #include <linux/delay.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/init.h>
+ 
+ #include <asm/ecard.h>
+@@ -158,9 +158,13 @@ oakscsi_probe(struct expansion_card *ec,
+ 	printk("\n");
+ 
+ 	ret = scsi_add_host(host, &ec->dev);
+-	if (ret == 0)
+-		goto out;
++	if (ret)
++		goto out_release;
++
++	scsi_scan_host(host);
++	goto out;
+ 
++ out_release:
+ 	release_region(host->io_port, host->n_io_port);
+  unreg:
+ 	scsi_host_put(host);
+--- linux-2.6.0-test1/drivers/scsi/arm/powertec.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/arm/powertec.c	2003-07-19 17:03:50.000000000 -0700
+@@ -8,7 +8,7 @@
+  * published by the Free Software Foundation.
+  */
+ #include <linux/module.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/arm/queue.c	2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/scsi/arm/queue.c	2003-07-19 17:03:50.000000000 -0700
+@@ -15,7 +15,7 @@
+  *   30-Aug-2000 RMK	Use Linux list handling and spinlocks
+  */
+ #include <linux/module.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+--- linux-2.6.0-test1/drivers/scsi/atari_scsi.c	2003-06-14 12:18:51.000000000 -0700
++++ 25/drivers/scsi/atari_scsi.c	2003-07-19 17:03:50.000000000 -0700
+@@ -86,7 +86,7 @@
+ #include <linux/ctype.h>
+ #include <linux/delay.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/sched.h>
+ #include <linux/interrupt.h>
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/atp870u.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/atp870u.c	2003-07-19 17:03:50.000000000 -0700
+@@ -26,7 +26,7 @@
+ #include <linux/proc_fs.h>
+ #include <linux/spinlock.h>
+ #include <linux/pci.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/stat.h>
+ 
+ #include <asm/system.h>
+--- linux-2.6.0-test1/drivers/scsi/blz1230.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/blz1230.c	2003-07-19 17:03:50.000000000 -0700
+@@ -22,7 +22,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/blz2060.c	2003-06-14 12:18:09.000000000 -0700
++++ 25/drivers/scsi/blz2060.c	2003-07-19 17:03:50.000000000 -0700
+@@ -22,7 +22,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/BusLogic.c	2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/scsi/BusLogic.c	2003-07-19 17:03:50.000000000 -0700
+@@ -36,7 +36,6 @@
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+ #include <linux/types.h>
+-#include <linux/blk.h>
+ #include <linux/blkdev.h>
+ #include <linux/delay.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/bvme6000.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/bvme6000.c	2003-07-19 17:03:50.000000000 -0700
+@@ -5,7 +5,7 @@
+  */
+ #include <linux/types.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/sched.h>
+ #include <linux/version.h>
+ #include <linux/zorro.h>
+--- linux-2.6.0-test1/drivers/scsi/constants.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/constants.c	2003-07-19 17:03:50.000000000 -0700
+@@ -9,7 +9,7 @@
+ #include <linux/module.h>
+ 
+ #include <linux/config.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include "scsi.h"
+ #include "hosts.h"
+--- linux-2.6.0-test1/drivers/scsi/cpqfcTScontrol.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/scsi/cpqfcTScontrol.c	2003-07-19 17:03:50.000000000 -0700
+@@ -30,7 +30,7 @@
+ 
+ #define LinuxVersionCode(v, p, s) (((v)<<16)+((p)<<8)+(s))
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/ioport.h>  // request_region() prototype
+--- linux-2.6.0-test1/drivers/scsi/cpqfcTSinit.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/scsi/cpqfcTSinit.c	2003-07-19 17:03:50.000000000 -0700
+@@ -35,7 +35,7 @@
+ #include <linux/interrupt.h>  
+ #include <linux/module.h>
+ #include <linux/version.h> 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/types.h>
+--- linux-2.6.0-test1/drivers/scsi/cpqfcTSworker.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/scsi/cpqfcTSworker.c	2003-07-19 17:03:50.000000000 -0700
+@@ -26,7 +26,7 @@
+ #include <linux/ioport.h>
+ #include <linux/kernel.h>
+ #include <linux/stat.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/delay.h>
+ #include <linux/smp_lock.h>
+--- linux-2.6.0-test1/drivers/scsi/cyberstorm.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/scsi/cyberstorm.c	2003-07-19 17:03:50.000000000 -0700
+@@ -25,7 +25,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/cyberstormII.c	2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/scsi/cyberstormII.c	2003-07-19 17:03:50.000000000 -0700
+@@ -21,7 +21,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/dc395x.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/dc395x.c	2003-07-19 17:03:50.000000000 -0700
+@@ -50,7 +50,7 @@
+ #include <linux/moduleparam.h>
+ #include <linux/delay.h>
+ #include <linux/ctype.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/io.h>
+ #include "scsi.h"
+ #include "hosts.h"
+@@ -6214,7 +6214,8 @@ int __devinit dc395x_init_one(struct pci
+ 	pci_set_drvdata(pdev, scsi_host);
+ 
+ 	/* get the scsi mid level to scan for new devices on the bus */
+-	scsi_add_host(scsi_host, &pdev->dev);
++	scsi_add_host(scsi_host, &pdev->dev);	/* XXX handle failure */
++	scsi_scan_host(scsi_host);
+ 
+ 	return 0;
+ }
+--- linux-2.6.0-test1/drivers/scsi/dec_esp.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/dec_esp.c	2003-07-19 17:03:50.000000000 -0700
+@@ -24,7 +24,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ 
+--- linux-2.6.0-test1/drivers/scsi/dmx3191d.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/scsi/dmx3191d.c	2003-07-19 17:03:50.000000000 -0700
+@@ -22,7 +22,7 @@
+ 
+ #include <asm/io.h>
+ #include <asm/system.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/init.h>
+ #include <linux/ioport.h>
+ #include <linux/module.h>
+--- linux-2.6.0-test1/drivers/scsi/dpt_i2o.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/dpt_i2o.c	2003-07-19 17:03:50.000000000 -0700
+@@ -47,7 +47,7 @@ MODULE_DESCRIPTION("Adaptec I2O RAID Dri
+ #include <linux/config.h>	/* for CONFIG_PCI */
+ #include <linux/pci.h>		/* for PCI support */
+ #include <linux/proc_fs.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/delay.h>	/* for udelay */
+ #include <linux/interrupt.h>
+ #include <linux/kernel.h>	/* for printk */
+--- linux-2.6.0-test1/drivers/scsi/dtc.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/dtc.c	2003-07-19 17:03:50.000000000 -0700
+@@ -76,7 +76,7 @@
+ #include <linux/module.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/delay.h>
+ #include <linux/stat.h>
+ #include <linux/string.h>
+--- linux-2.6.0-test1/drivers/scsi/eata.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/eata.c	2003-07-19 17:03:50.000000000 -0700
+@@ -486,7 +486,7 @@
+ #include <asm/system.h>
+ #include <asm/byteorder.h>
+ #include <linux/proc_fs.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/stat.h>
+ #include <linux/pci.h>
+--- linux-2.6.0-test1/drivers/scsi/eata_pio.c	2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/scsi/eata_pio.c	2003-07-19 17:03:50.000000000 -0700
+@@ -58,7 +58,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/stat.h>
+ #include <linux/config.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/spinlock.h>
+ #include <asm/io.h>
+ 
+--- linux-2.6.0-test1/drivers/scsi/esp.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/esp.c	2003-07-19 17:03:50.000000000 -0700
+@@ -19,7 +19,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/fastlane.c	2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/scsi/fastlane.c	2003-07-19 17:03:50.000000000 -0700
+@@ -30,7 +30,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/fcal.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/scsi/fcal.c	2003-07-19 17:03:50.000000000 -0700
+@@ -9,7 +9,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/fd_mcs.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/fd_mcs.c	2003-07-19 17:03:50.000000000 -0700
+@@ -79,7 +79,7 @@
+ 
+ #include <linux/module.h>
+ #include <linux/interrupt.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/errno.h>
+ #include <linux/string.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/fdomain.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/fdomain.c	2003-07-19 17:03:50.000000000 -0700
+@@ -270,7 +270,7 @@
+ #include <linux/module.h>
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/spinlock.h>
+ #include <linux/errno.h>
+ #include <linux/string.h>
+--- linux-2.6.0-test1/drivers/scsi/gdth.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/gdth.c	2003-07-19 17:03:50.000000000 -0700
+@@ -357,11 +357,8 @@
+ #include <asm/spinlock.h>
+ #endif
+ 
+-#if LINUX_VERSION_CODE >= 0x010300
+-#include <linux/blk.h>
+-#else
+-#include "../block/blk.h"
+-#endif
++#include <linux/blkdev.h>
++
+ #include "scsi.h"
+ #include "hosts.h"
+ #if LINUX_VERSION_CODE < 0x020503
+--- linux-2.6.0-test1/drivers/scsi/g_NCR5380.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/scsi/g_NCR5380.c	2003-07-19 17:03:50.000000000 -0700
+@@ -105,7 +105,7 @@
+ #include <asm/io.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+ #include "g_NCR5380.h"
+--- linux-2.6.0-test1/drivers/scsi/gvp11.c	2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/scsi/gvp11.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1,6 +1,6 @@
+ #include <linux/types.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/sched.h>
+ #include <linux/version.h>
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/hosts.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/hosts.c	2003-07-19 17:05:05.000000000 -0700
+@@ -81,19 +81,15 @@ int scsi_add_host(struct Scsi_Host *shos
+ 	printk(KERN_INFO "scsi%d : %s\n", shost->host_no,
+ 			sht->info ? sht->info(shost) : sht->name);
+ 
+-	error = scsi_sysfs_add_host(shost, dev);
+-
+ 	if (!shost->can_queue) {
+ 		printk(KERN_ERR "%s: can_queue = 0 no longer supported\n",
+ 				sht->name);
+ 		error = -EINVAL;
+ 	}
+ 
+-	if (!error) {
++	error = scsi_sysfs_add_host(shost, dev);
++	if (!error)
+ 		scsi_proc_host_add(shost);
+-		scsi_scan_host(shost);
+-	}
+-			
+ 	return error;
+ }
+ 
+@@ -112,7 +108,7 @@ void scsi_free_shost(struct Scsi_Host *s
+ 		shost->eh_notify = NULL;
+ 	}
+ 
+-	shost->hostt->present--;
++	scsi_proc_hostdir_rm(shost->hostt);
+ 	scsi_destroy_command_freelist(shost);
+ 	kfree(shost);
+ }
+@@ -151,12 +147,6 @@ struct Scsi_Host *scsi_host_alloc(struct
+ 		dump_stack();
+         }
+ 
+-	/* if its not set in the template, use the default */
+-	if (!sht->shost_attrs)
+-		 sht->shost_attrs = scsi_sysfs_shost_attrs;
+-	if (!sht->sdev_attrs)
+-		 sht->sdev_attrs = scsi_sysfs_sdev_attrs;
+-
+ 	shost = kmalloc(sizeof(struct Scsi_Host) + privsize, gfp_mask);
+ 	if (!shost)
+ 		return NULL;
+@@ -219,7 +209,7 @@ struct Scsi_Host *scsi_host_alloc(struct
+ 	kernel_thread((int (*)(void *))scsi_error_handler, shost, 0);
+ 	wait_for_completion(&complete);
+ 	shost->eh_notify = NULL;
+-	shost->hostt->present++;
++	scsi_proc_hostdir_add(shost->hostt);
+ 	return shost;
+  fail:
+ 	kfree(shost);
+@@ -283,8 +273,8 @@ struct Scsi_Host *scsi_host_lookup(unsig
+  **/
+ void scsi_host_get(struct Scsi_Host *shost)
+ {
+-	get_device(&shost->host_gendev);
+-	class_device_get(&shost->class_dev);
++	get_device(&shost->shost_gendev);
++	class_device_get(&shost->shost_classdev);
+ }
+ 
+ /**
+@@ -293,6 +283,6 @@ void scsi_host_get(struct Scsi_Host *sho
+  **/
+ void scsi_host_put(struct Scsi_Host *shost)
+ {
+-	class_device_put(&shost->class_dev);
+-	put_device(&shost->host_gendev);
++	class_device_put(&shost->shost_classdev);
++	put_device(&shost->shost_gendev);
+ }
+--- linux-2.6.0-test1/drivers/scsi/i91uscsi.c	2003-06-14 12:17:59.000000000 -0700
++++ 25/drivers/scsi/i91uscsi.c	2003-07-19 17:03:50.000000000 -0700
+@@ -81,7 +81,7 @@
+ 
+ #include <linux/jiffies.h>
+ #include <linux/delay.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/io.h>
+ 
+ #include "i91uscsi.h"
+--- linux-2.6.0-test1/drivers/scsi/ibmmca.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/ibmmca.c	2003-07-19 17:03:50.000000000 -0700
+@@ -32,7 +32,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/ioport.h>
+ #include <linux/delay.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/mca.h>
+--- linux-2.6.0-test1/drivers/scsi/ide-scsi.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/ide-scsi.c	2003-07-19 17:03:50.000000000 -0700
+@@ -978,8 +978,10 @@ static int idescsi_attach(ide_drive_t *d
+ 		idescsi_setup (drive, idescsi);
+ 		drive->disk->fops = &idescsi_ops;
+ 		err = scsi_add_host(host, &idescsi_primary);
+-		if (!err)
++		if (!err) {
++			scsi_scan_host(host);
+ 			return 0;
++		}
+ 		/* fall through on error */
+ 		ide_unregister_subdriver(drive);
+ 	}
+--- linux-2.6.0-test1/drivers/scsi/imm.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/imm.c	2003-07-19 17:03:50.000000000 -0700
+@@ -24,7 +24,7 @@
+ void imm_reset_pulse(unsigned int base);
+ static int device_check(int host_no);
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/io.h>
+ #include <linux/parport.h>
+ #include <linux/workqueue.h>
+--- linux-2.6.0-test1/drivers/scsi/imm.h	2003-06-14 12:17:55.000000000 -0700
++++ 25/drivers/scsi/imm.h	2003-07-19 17:03:50.000000000 -0700
+@@ -75,7 +75,7 @@
+ #include  <linux/delay.h>
+ #include  <linux/proc_fs.h>
+ #include  <linux/stat.h>
+-#include  <linux/blk.h>
++#include  <linux/blkdev.h>
+ #include  <linux/sched.h>
+ #include  <linux/interrupt.h>
+ 
+--- linux-2.6.0-test1/drivers/scsi/in2000.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/scsi/in2000.c	2003-07-19 17:03:50.000000000 -0700
+@@ -114,7 +114,6 @@
+  */
+ 
+ #include <linux/module.h>
+-#include <linux/blk.h>
+ #include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/string.h>
+--- linux-2.6.0-test1/drivers/scsi/ini9100u.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/ini9100u.c	2003-07-19 17:03:50.000000000 -0700
+@@ -119,7 +119,7 @@
+ #include <linux/delay.h>
+ #include <linux/pci.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/spinlock.h>
+ #include <linux/stat.h>
+ #include <linux/config.h>
+--- linux-2.6.0-test1/drivers/scsi/inia100.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/inia100.c	2003-07-19 17:03:50.000000000 -0700
+@@ -74,7 +74,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/pci.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/spinlock.h>
+ #include <linux/stat.h>
+ #include <linux/kernel.h>
+--- linux-2.6.0-test1/drivers/scsi/ips.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/ips.c	2003-07-19 17:03:50.000000000 -0700
+@@ -167,7 +167,7 @@
+ #include <linux/reboot.h>
+ #include <linux/interrupt.h>
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/types.h>
+ 
+ #include <scsi/sg.h>
+--- linux-2.6.0-test1/drivers/scsi/ips.h	2003-06-14 12:18:03.000000000 -0700
++++ 25/drivers/scsi/ips.h	2003-07-19 17:03:50.000000000 -0700
+@@ -111,7 +111,7 @@
+    #else
+       #define IPS_REGISTER_HOSTS(SHT)      (!ips_detect(SHT))
+       #define IPS_UNREGISTER_HOSTS(SHT)
+-      #define IPS_ADD_HOST(shost,device)   scsi_add_host(shost,device)
++      #define IPS_ADD_HOST(shost,device)   do { scsi_add_host(shost,device); scsi_scan_host(shost); } while (0)
+       #define IPS_REMOVE_HOST(shost)       scsi_remove_host(shost)
+       #define IPS_SCSI_SET_DEVICE(sh,ha)   scsi_set_device(sh, &(ha)->pcidev->dev)
+       #define IPS_PRINTK(level, pcidev, format, arg...)                 \
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/asm_1000.h	2003-07-19 17:06:32.000000000 -0700
+@@ -0,0 +1,3224 @@
++/* @(#)asm_1000.h 1.2 */
++/*
++ * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 Qlogic, Inc.
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms are permitted provided
++ * that the following conditions are met:
++ * 1. Redistribution of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistribution in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR 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	ISP_TARGET_MODE
++/*
++ *	Firmware Version 1.37.00 (11:28 Aug 28, 2000)
++ */
++static const u_int16_t isp_1000_risc_code[] = {
++	0x0078, 0x1041, 0x0000, 0x2757, 0x0000, 0x12ff, 0x2043, 0x4f50,
++	0x5952, 0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932,
++	0x2c31, 0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749,
++	0x4320, 0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049,
++	0x5350, 0x3130, 0x3030, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520,
++	0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, 0x312e, 0x3337, 0x2020,
++	0x2043, 0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20, 0x3135,
++	0x2050, 0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2000, 0x3030,
++	0x2024, 0x20b9, 0x1212, 0x20c1, 0x0008, 0x2071, 0x0010, 0x70c3,
++	0x0004, 0x20c9, 0x5cff, 0x2089, 0x10ee, 0x70c7, 0x4953, 0x70cb,
++	0x5020, 0x70cf, 0x2020, 0x70d3, 0x0001, 0x3f00, 0x70d6, 0x2031,
++	0x0030, 0x2079, 0x3800, 0x7863, 0x0000, 0x2fa0, 0x2009, 0x031b,
++	0x2011, 0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109, 0x00c0, 0x1062,
++	0x789b, 0x0101, 0x780b, 0x0002, 0x780f, 0x0002, 0x784f, 0x0bb8,
++	0x2009, 0x3835, 0x200b, 0x0003, 0x78bb, 0x0000, 0x78bf, 0x0000,
++	0x78c3, 0x0000, 0x2069, 0x3840, 0x00a8, 0x1085, 0x681b, 0x003c,
++	0x2009, 0x1313, 0x21b8, 0x0078, 0x1087, 0x681b, 0x0028, 0x6807,
++	0x0007, 0x680b, 0x00fa, 0x680f, 0x0008, 0x6813, 0x0005, 0x681f,
++	0x0000, 0x6823, 0x0006, 0x6817, 0x0008, 0x6827, 0x0000, 0x2069,
++	0x3a80, 0x2011, 0x0020, 0x2009, 0x0010, 0x680b, 0x0c19, 0x680f,
++	0x0019, 0x6803, 0xdd00, 0x6807, 0x001a, 0x6a1a, 0x2d00, 0xa0e8,
++	0x0008, 0xa290, 0x0004, 0x8109, 0x00c0, 0x109d, 0x2069, 0x3b00,
++	0x2009, 0x0002, 0x20a9, 0x0100, 0x683f, 0x0000, 0x2001, 0x0008,
++	0x8007, 0x6832, 0x6837, 0x000a, 0x680b, 0x0040, 0x6817, 0x0100,
++	0x681f, 0x0064, 0xade8, 0x0010, 0x0070, 0x10c8, 0x0078, 0x10b4,
++	0x8109, 0x00c0, 0x10b2, 0x1078, 0x1b64, 0x1078, 0x31c0, 0x1078,
++	0x1747, 0x1078, 0x368b, 0x3200, 0xa085, 0x000d, 0x2090, 0x70c3,
++	0x0000, 0x0090, 0x10e2, 0x70c0, 0xa086, 0x0002, 0x00c0, 0x10e2,
++	0x1078, 0x11e0, 0x1078, 0x1112, 0x1078, 0x18f2, 0x1078, 0x1aaf,
++	0x1078, 0x34fd, 0x1078, 0x184d, 0x0078, 0x10e2, 0x10f6, 0x10f8,
++	0x1d05, 0x1d05, 0x321e, 0x321e, 0x1d05, 0x1d05, 0x0078, 0x10f6,
++	0x0078, 0x10f8, 0x0078, 0x10fa, 0x0078, 0x10fc, 0x7008, 0x800c,
++	0x00c8, 0x110d, 0x7007, 0x0002, 0xa08c, 0x000c, 0x00c0, 0x110e,
++	0x8004, 0x8004, 0x00c8, 0x110d, 0x087a, 0x097a, 0x70c3, 0x4002,
++	0x0078, 0x11e3, 0x7814, 0xa005, 0x00c0, 0x111a, 0x0010, 0x1156,
++	0x0078, 0x1155, 0x2009, 0x3868, 0x2104, 0xa005, 0x00c0, 0x1155,
++	0x7814, 0xa086, 0x0001, 0x00c0, 0x1127, 0x1078, 0x15ae, 0x7817,
++	0x0000, 0x2009, 0x386f, 0x2104, 0xa065, 0x0040, 0x1143, 0x2009,
++	0x386a, 0x211c, 0x8108, 0x2114, 0x8108, 0x2104, 0xa210, 0xa399,
++	0x0000, 0x2009, 0x0018, 0x6083, 0x0103, 0x1078, 0x16d7, 0x00c0,
++	0x114f, 0x1078, 0x173e, 0x2009, 0x386f, 0x200b, 0x0000, 0x2009,
++	0x3869, 0x2104, 0x200b, 0x0000, 0xa005, 0x0040, 0x1153, 0x2001,
++	0x4005, 0x0078, 0x11e2, 0x0078, 0x11e0, 0x007c, 0x2061, 0x0000,
++	0x6018, 0xa084, 0x0001, 0x0040, 0x115e, 0x007c, 0x70c3, 0x0000,
++	0x70c7, 0x0000, 0x70cb, 0x0000, 0x70cf, 0x0000, 0x70c0, 0xa0bc,
++	0xffc0, 0x00c0, 0x11ae, 0x2038, 0x0079, 0x116e, 0x11e0, 0x122e,
++	0x11fc, 0x122e, 0x127f, 0x127f, 0x11f3, 0x1608, 0x128a, 0x11ef,
++	0x1200, 0x1202, 0x1204, 0x1206, 0x160d, 0x11ef, 0x1292, 0x12ba,
++	0x15bc, 0x1602, 0x1208, 0x14e3, 0x1505, 0x151f, 0x1548, 0x149c,
++	0x14aa, 0x14be, 0x14d2, 0x1357, 0x1332, 0x12e2, 0x12e9, 0x12ee,
++	0x12f3, 0x12f9, 0x12fe, 0x1303, 0x1308, 0x130d, 0x1311, 0x1326,
++	0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x1363, 0x136c, 0x137b,
++	0x13a1, 0x13ab, 0x13b2, 0x13d8, 0x13e7, 0x13f6, 0x1408, 0x147a,
++	0x11ef, 0x148a, 0x11ef, 0x11ef, 0x11ef, 0x1491, 0xa0bc, 0xffa0,
++	0x00c0, 0x11ef, 0x2038, 0xa084, 0x001f, 0x0079, 0x11b7, 0x11ef,
++	0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef,
++	0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x1665, 0x1674, 0x11ef,
++	0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef,
++	0x11ef, 0x16b3, 0x16bd, 0x16c1, 0x16cf, 0x167f, 0x169c, 0x72ca,
++	0x71c6, 0x2001, 0x4006, 0x0078, 0x11e2, 0x73ce, 0x72ca, 0x71c6,
++	0x2001, 0x4000, 0x70c2, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091,
++	0x5000, 0x2091, 0x4080, 0x007c, 0x71c6, 0x0078, 0x11e2, 0x70c3,
++	0x4001, 0x0078, 0x11e3, 0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9,
++	0x0005, 0x53a3, 0x0078, 0x11e0, 0x70c4, 0x70c3, 0x0004, 0x007a,
++	0x0078, 0x11e0, 0x0078, 0x11e0, 0x0078, 0x11e0, 0x0078, 0x11e0,
++	0x2091, 0x8000, 0x70c3, 0x0000, 0x70c7, 0x4953, 0x70cb, 0x5020,
++	0x70cf, 0x2020, 0x70d3, 0x0001, 0x3f00, 0x70d6, 0x2079, 0x0000,
++	0x781b, 0x0001, 0x2031, 0x0030, 0x2059, 0x1000, 0x2029, 0x0457,
++	0x2051, 0x0470, 0x2061, 0x0472, 0x20b9, 0xffff, 0x20c1, 0x0000,
++	0x2091, 0x5000, 0x2091, 0x4080, 0x0078, 0x0455, 0x71d0, 0x72c8,
++	0x73cc, 0x70c4, 0x20a0, 0x2098, 0x2031, 0x0030, 0x81ff, 0x0040,
++	0x11e0, 0x7007, 0x0004, 0x731a, 0x721e, 0x2051, 0x0012, 0x2049,
++	0x125d, 0x2041, 0x11e0, 0x7003, 0x0002, 0xa786, 0x0001, 0x00c0,
++	0x124f, 0x2049, 0x126b, 0x2041, 0x1277, 0x7003, 0x0003, 0x7017,
++	0x0000, 0x810b, 0x7112, 0x00c8, 0x1257, 0x7017, 0x0001, 0x7007,
++	0x0001, 0xa786, 0x0001, 0x0040, 0x126b, 0x700c, 0xa084, 0x007f,
++	0x8004, 0x2009, 0x0020, 0xa102, 0x0942, 0x094a, 0x20a8, 0x26a0,
++	0x53a6, 0x0078, 0x10fe, 0x700c, 0xa084, 0x007f, 0x0040, 0x126b,
++	0x80ac, 0x0048, 0x126b, 0x2698, 0x53a5, 0x0078, 0x10fe, 0x700c,
++	0xa084, 0x007f, 0x80ac, 0x2698, 0x53a5, 0x0078, 0x11e0, 0x71c4,
++	0x70c8, 0x2114, 0xa79e, 0x0004, 0x00c0, 0x1287, 0x200a, 0x72ca,
++	0x0078, 0x11df, 0x70c7, 0x0125, 0x70cb, 0x0000, 0x70cf, 0x0f00,
++	0x0078, 0x11e0, 0x70c4, 0x72c8, 0x73cc, 0x74d0, 0x70c6, 0x72ca,
++	0x73ce, 0x74d2, 0xa005, 0x0040, 0x12b4, 0x8001, 0x7872, 0xa084,
++	0xfc00, 0x0040, 0x12ab, 0x7898, 0xa085, 0x0001, 0x789a, 0x2001,
++	0x4005, 0x0078, 0x11e2, 0x7a7a, 0x7b7e, 0x7c76, 0x7898, 0xa084,
++	0xfffc, 0x789a, 0x0078, 0x12b8, 0x7898, 0xa085, 0x0001, 0x789a,
++	0x0078, 0x11e0, 0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6, 0x72ca,
++	0x73ce, 0x74d6, 0xa005, 0x0040, 0x12dc, 0x8001, 0x7886, 0xa084,
++	0xfc00, 0x0040, 0x12d3, 0x7898, 0xa085, 0x0100, 0x789a, 0x2001,
++	0x4005, 0x0078, 0x11e2, 0x7a8e, 0x7b92, 0x7c8a, 0x7898, 0xa084,
++	0xfcff, 0x789a, 0x0078, 0x12e0, 0x7898, 0xa085, 0x0100, 0x789a,
++	0x0078, 0x11e0, 0x2009, 0x3859, 0x210c, 0x2011, 0x0372, 0x0078,
++	0x11de, 0x2009, 0x3841, 0x210c, 0x0078, 0x11df, 0x2009, 0x3842,
++	0x210c, 0x0078, 0x11df, 0x2061, 0x3840, 0x610c, 0x6210, 0x0078,
++	0x11de, 0x2009, 0x3845, 0x210c, 0x0078, 0x11df, 0x2009, 0x3846,
++	0x210c, 0x0078, 0x11df, 0x2009, 0x3847, 0x210c, 0x0078, 0x11df,
++	0x2009, 0x3848, 0x210c, 0x0078, 0x11df, 0x7908, 0x7a0c, 0x0078,
++	0x11de, 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++	0xa0e8, 0x3a80, 0x6a00, 0x6804, 0xa084, 0x0008, 0x0040, 0x1323,
++	0x6b08, 0x0078, 0x1324, 0x6b0c, 0x0078, 0x11dd, 0x77c4, 0x1078,
++	0x1758, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708,
++	0x0078, 0x11dd, 0x2091, 0x8000, 0x7848, 0xa005, 0x00c0, 0x1346,
++	0x2061, 0x3b00, 0x20a9, 0x0100, 0x603c, 0xa005, 0x00c0, 0x1346,
++	0xace0, 0x0010, 0x00f0, 0x133c, 0x0078, 0x134e, 0x2019, 0x0000,
++	0x2011, 0x0000, 0x2009, 0x0000, 0x0078, 0x1353, 0x7bb8, 0x7abc,
++	0x79c0, 0x78c3, 0x0000, 0x2091, 0x8001, 0x0078, 0x11dd, 0x77c4,
++	0x1078, 0x1758, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, 0x2091,
++	0x8001, 0x0078, 0x11dd, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x11d8,
++	0x1078, 0x1be8, 0x0078, 0x11dd, 0x71c4, 0xa182, 0x0010, 0x00c8,
++	0x11d8, 0x2011, 0x3841, 0x2204, 0x007e, 0x2112, 0x1078, 0x1ba1,
++	0x017f, 0x0078, 0x11df, 0x71c4, 0x2011, 0x1399, 0x20a9, 0x0008,
++	0x2204, 0xa106, 0x0040, 0x138b, 0x8210, 0x0070, 0x1389, 0x0078,
++	0x1380, 0x0078, 0x11d8, 0xa292, 0x1399, 0x027e, 0x2011, 0x3842,
++	0x2204, 0x2112, 0x017f, 0x007e, 0x1078, 0x1bad, 0x017f, 0x0078,
++	0x11df, 0x03e8, 0x00fa, 0x01f4, 0x02ee, 0x0064, 0x0019, 0x0032,
++	0x004b, 0x2061, 0x3840, 0x610c, 0x6210, 0x70c4, 0x600e, 0x70c8,
++	0x6012, 0x0078, 0x11de, 0x2061, 0x3840, 0x6114, 0x70c4, 0x6016,
++	0x0078, 0x11df, 0x71c4, 0x2011, 0x0004, 0x2019, 0x1212, 0xa186,
++	0x0028, 0x0040, 0x13cb, 0x2011, 0x0005, 0x2019, 0x1212, 0xa186,
++	0x0032, 0x0040, 0x13cb, 0x2011, 0x0006, 0x2019, 0x1313, 0xa186,
++	0x003c, 0x00c0, 0x11d8, 0x2061, 0x3840, 0x6018, 0x007e, 0x611a,
++	0x23b8, 0x1078, 0x1bbe, 0x1078, 0x368b, 0x017f, 0x0078, 0x11df,
++	0x71c4, 0xa184, 0xffcf, 0x00c0, 0x11d8, 0x2011, 0x3847, 0x2204,
++	0x2112, 0x007e, 0x1078, 0x1be0, 0x017f, 0x0078, 0x11df, 0x71c4,
++	0xa182, 0x0010, 0x00c8, 0x11d8, 0x2011, 0x3848, 0x2204, 0x007e,
++	0x2112, 0x1078, 0x1bcf, 0x017f, 0x0078, 0x11df, 0x71c4, 0x72c8,
++	0xa184, 0xfffd, 0x00c0, 0x11d7, 0xa284, 0xfffd, 0x00c0, 0x11d7,
++	0x2100, 0x7908, 0x780a, 0x2200, 0x7a0c, 0x780e, 0x0078, 0x11de,
++	0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8,
++	0x3a80, 0x2019, 0x0000, 0x72c8, 0x6800, 0x007e, 0xa226, 0x0040,
++	0x1440, 0xa284, 0x0001, 0x0040, 0x1422, 0x2220, 0xa39d, 0x0002,
++	0xa294, 0xfffe, 0x6a02, 0xa484, 0x2000, 0x0040, 0x1429, 0xa39d,
++	0x0010, 0xa484, 0x1000, 0x0040, 0x142f, 0xa39d, 0x0008, 0xa484,
++	0x4000, 0x0040, 0x1440, 0x810f, 0xa284, 0x4000, 0x0040, 0x143c,
++	0x1078, 0x1c02, 0x0078, 0x1440, 0x1078, 0x1bf4, 0x0078, 0x1440,
++	0x72cc, 0x82ff, 0x0040, 0x1472, 0x6808, 0xa206, 0x0040, 0x1472,
++	0xa2a4, 0x00ff, 0x2061, 0x3840, 0x6118, 0xa186, 0x0028, 0x0040,
++	0x1459, 0xa186, 0x0032, 0x0040, 0x145f, 0xa186, 0x003c, 0x0040,
++	0x1465, 0xa482, 0x0064, 0x0048, 0x146f, 0x0078, 0x1469, 0xa482,
++	0x0050, 0x0048, 0x146f, 0x0078, 0x1469, 0xa482, 0x0043, 0x0048,
++	0x146f, 0x71c4, 0x71c6, 0x027f, 0x72ca, 0x0078, 0x11d9, 0x6a0a,
++	0xa39d, 0x000a, 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4,
++	0x0078, 0x11dd, 0x77c4, 0x1078, 0x1758, 0x2091, 0x8000, 0x6a14,
++	0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708,
++	0x0078, 0x11dd, 0x2011, 0x3835, 0x220c, 0x70c4, 0x2012, 0x0078,
++	0x11df, 0x71c4, 0x72c8, 0x73cc, 0xa182, 0x0010, 0x00c8, 0x11d8,
++	0x1078, 0x1c10, 0x0078, 0x11dd, 0x77c4, 0x1078, 0x1758, 0x2091,
++	0x8000, 0x6a08, 0xa295, 0x0002, 0x6a0a, 0x2091, 0x8001, 0x2708,
++	0x0078, 0x11de, 0x77c4, 0x1078, 0x1758, 0x2091, 0x8000, 0x6a08,
++	0xa294, 0xfff9, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x14b9, 0x1078,
++	0x1b49, 0x2091, 0x8001, 0x2708, 0x0078, 0x11de, 0x77c4, 0x1078,
++	0x1758, 0x2091, 0x8000, 0x6a08, 0xa295, 0x0004, 0x6a0a, 0x6804,
++	0xa005, 0x0040, 0x14cd, 0x1078, 0x1b49, 0x2091, 0x8001, 0x2708,
++	0x0078, 0x11de, 0x77c4, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051,
++	0x0020, 0x2091, 0x8000, 0x1078, 0x1765, 0x2091, 0x8001, 0x2708,
++	0x6a08, 0x0078, 0x11de, 0x77c4, 0x72c8, 0x73cc, 0x77c6, 0x72ca,
++	0x73ce, 0x1078, 0x17e6, 0x00c0, 0x1501, 0x6818, 0xa005, 0x0040,
++	0x14fb, 0x2708, 0x1078, 0x1c20, 0x00c0, 0x14fb, 0x7817, 0xffff,
++	0x2091, 0x8001, 0x007c, 0x2091, 0x8001, 0x2001, 0x4005, 0x0078,
++	0x11e2, 0x2091, 0x8001, 0x0078, 0x11e0, 0x77c4, 0x77c6, 0x2041,
++	0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078,
++	0x1765, 0x2061, 0x3840, 0x60a3, 0x0003, 0x67b6, 0x60a7, 0x0000,
++	0x7817, 0xffff, 0x1078, 0x1b49, 0x2091, 0x8001, 0x007c, 0x77c8,
++	0x77ca, 0x77c4, 0x77c6, 0xa7bc, 0xff00, 0x2091, 0x8000, 0x2061,
++	0x3840, 0x60a3, 0x0002, 0x60a7, 0x0000, 0x67b6, 0x7817, 0xffff,
++	0x1078, 0x1b49, 0x2091, 0x8001, 0x2041, 0x0021, 0x2049, 0x0004,
++	0x2051, 0x0010, 0x2091, 0x8000, 0x1078, 0x1765, 0x70c8, 0x683e,
++	0x8738, 0xa784, 0x001f, 0x00c0, 0x153c, 0x2091, 0x8001, 0x007c,
++	0x7898, 0xa084, 0x0003, 0x00c0, 0x156c, 0x2039, 0x0000, 0x2041,
++	0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x1078, 0x1758, 0x2091,
++	0x8000, 0x6808, 0xa80d, 0x690a, 0x2091, 0x8001, 0x8738, 0xa784,
++	0x001f, 0x00c0, 0x1555, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f,
++	0xa784, 0x0f00, 0x00c0, 0x1555, 0x2091, 0x8000, 0x2069, 0x0100,
++	0x6830, 0xa084, 0x0040, 0x0040, 0x1595, 0x684b, 0x0004, 0x20a9,
++	0x0014, 0x6848, 0xa084, 0x0004, 0x0040, 0x1582, 0x0070, 0x1582,
++	0x0078, 0x1579, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084,
++	0x0001, 0x0040, 0x158f, 0x0070, 0x158f, 0x0078, 0x1586, 0x20a9,
++	0x00fa, 0x0070, 0x1595, 0x0078, 0x1591, 0x2079, 0x3800, 0x7817,
++	0x0001, 0x2061, 0x3840, 0x60a3, 0x0001, 0x60a7, 0x0000, 0x60c3,
++	0x000f, 0x7898, 0xa085, 0x0002, 0x789a, 0x6808, 0xa084, 0xfffd,
++	0x680a, 0x681b, 0x0046, 0x2091, 0x8001, 0x007c, 0x7898, 0xa084,
++	0xfffd, 0x789a, 0xa084, 0x0001, 0x00c0, 0x15b8, 0x1078, 0x1830,
++	0x71c4, 0x71c6, 0x794a, 0x007c, 0x74c4, 0x73c8, 0x72cc, 0x74c6,
++	0x73ca, 0x72ce, 0x2079, 0x3800, 0x2009, 0x0040, 0x1078, 0x1735,
++	0x0040, 0x15fe, 0x1078, 0x1705, 0x0040, 0x15d2, 0x1078, 0x173e,
++	0x0078, 0x15fe, 0x6010, 0x2091, 0x8000, 0x7817, 0xffff, 0x2009,
++	0x3868, 0x200b, 0x0005, 0x8108, 0x200b, 0x0000, 0x8108, 0x230a,
++	0x8108, 0x220a, 0x8108, 0x240a, 0x8108, 0x200a, 0x8108, 0x200b,
++	0x0000, 0x8108, 0x2c0a, 0xa02e, 0x2530, 0x0e7e, 0x1078, 0x3199,
++	0x0e7f, 0x6592, 0x65a2, 0x6696, 0x66a6, 0x60ab, 0x0000, 0x60af,
++	0x0000, 0x1078, 0x1b49, 0x2091, 0x8001, 0x007c, 0x70c3, 0x4005,
++	0x0078, 0x11e3, 0x71c4, 0x70c7, 0x0000, 0x7906, 0x0078, 0x11e0,
++	0x71c4, 0x71c6, 0x2168, 0x0078, 0x160f, 0x2069, 0x1000, 0x690c,
++	0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x00c0, 0x1611, 0xa285,
++	0x0000, 0x00c0, 0x161f, 0x70c3, 0x4000, 0x0078, 0x1621, 0x70c3,
++	0x4003, 0x70ca, 0x0078, 0x11e3, 0x71c4, 0x72c8, 0x73cc, 0x2100,
++	0xa184, 0xfffc, 0x00c0, 0x11ef, 0x2100, 0x0079, 0x162f, 0x1646,
++	0x165b, 0x165d, 0x165f, 0x70c3, 0x4003, 0x71ce, 0x72d2, 0x73d6,
++	0x0078, 0x1642, 0x70c3, 0x4000, 0x70cf, 0x0000, 0x70d3, 0x0000,
++	0x70d7, 0x0000, 0x77c6, 0x71ca, 0x0078, 0x11e0, 0x2031, 0x1661,
++	0x2624, 0x8630, 0x2412, 0x2204, 0xa446, 0x00c0, 0x1633, 0xa484,
++	0xffff, 0x00c0, 0x1648, 0x2031, 0x1661, 0x8210, 0x8319, 0xa384,
++	0xffff, 0x00c0, 0x1648, 0x0078, 0x163a, 0x0078, 0x163a, 0x0078,
++	0x163a, 0x5555, 0xaaaa, 0xffff, 0x0000, 0x77c4, 0x1078, 0x1758,
++	0x2091, 0x8000, 0x6830, 0xa084, 0xff00, 0x8007, 0x2010, 0x2091,
++	0x8001, 0x2708, 0x0078, 0x11de, 0x77c4, 0x1078, 0x1758, 0x2091,
++	0x8000, 0x6a34, 0x2091, 0x8001, 0x2708, 0x0078, 0x11de, 0x77c4,
++	0x077e, 0xa7bc, 0xff00, 0x20a9, 0x0020, 0x72c8, 0x8217, 0xa294,
++	0xff00, 0x1078, 0x1758, 0x2091, 0x8000, 0x6c30, 0x6a32, 0x2091,
++	0x8001, 0x8738, 0x00f0, 0x1689, 0x077f, 0x2708, 0x8427, 0xa4a4,
++	0x00ff, 0x2410, 0x0078, 0x11de, 0x77c4, 0x077e, 0xa7bc, 0xff00,
++	0x20a9, 0x0020, 0x72c8, 0x1078, 0x1758, 0x2091, 0x8000, 0x6c34,
++	0x6a36, 0x2091, 0x8001, 0x8738, 0x00f0, 0x16a3, 0x077f, 0x2708,
++	0x2410, 0x0078, 0x11de, 0x7960, 0x71c6, 0x71c4, 0xa182, 0x0003,
++	0x00c8, 0x11d8, 0x7962, 0x0078, 0x11e0, 0x7960, 0x71c6, 0x0078,
++	0x11e0, 0x7954, 0x71c6, 0x71c4, 0x7956, 0x7958, 0x71ca, 0x71c8,
++	0x795a, 0x795c, 0x71ce, 0x71cc, 0x795e, 0x0078, 0x11e0, 0x7954,
++	0x71c6, 0x7958, 0x71ca, 0x795c, 0x71ce, 0x0078, 0x11e0, 0x700c,
++	0xa084, 0x007f, 0x0040, 0x16e3, 0x7007, 0x0004, 0x7004, 0xa084,
++	0x0004, 0x00c0, 0x16de, 0x7017, 0x0000, 0x7112, 0x721a, 0x731e,
++	0x8108, 0x810c, 0x81a9, 0x8c98, 0x20a1, 0x0030, 0x6080, 0x20a2,
++	0x53a6, 0x780c, 0xa085, 0x0000, 0x7002, 0x7007, 0x0001, 0x7108,
++	0x8104, 0x00c8, 0x16f7, 0x7007, 0x0002, 0xa184, 0x000c, 0x710c,
++	0xa184, 0x0300, 0x7003, 0x0000, 0x007c, 0x700c, 0xa084, 0x007f,
++	0x0040, 0x1711, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
++	0x170c, 0x7017, 0x0000, 0x7112, 0x721a, 0x731e, 0x2099, 0x0030,
++	0x8108, 0x81ac, 0x780c, 0xa085, 0x0001, 0x7002, 0x7007, 0x0001,
++	0x7008, 0x800c, 0x00c8, 0x1720, 0x7007, 0x0002, 0xa08c, 0x000c,
++	0x00c0, 0x1732, 0x710c, 0xa184, 0x0300, 0x00c0, 0x1732, 0x2ca0,
++	0x53a5, 0xa006, 0x7003, 0x0000, 0x007c, 0x7850, 0xa065, 0x0040,
++	0x173d, 0x2c04, 0x7852, 0x2063, 0x0000, 0x007c, 0x0f7e, 0x2079,
++	0x3800, 0x7850, 0x2062, 0x2c00, 0x7852, 0x0f7f, 0x007c, 0x2011,
++	0x5d00, 0x7a52, 0x2019, 0x0372, 0x8319, 0x0040, 0x1755, 0xa280,
++	0x002f, 0x2012, 0x2010, 0x0078, 0x174c, 0x2013, 0x0000, 0x007c,
++	0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003,
++	0x8003, 0xa105, 0xa0e8, 0x3b00, 0x007c, 0x1078, 0x1758, 0x2900,
++	0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xffef, 0xa80d, 0x690a,
++	0x2091, 0x8000, 0x2009, 0x384f, 0x210c, 0x6804, 0xa005, 0x0040,
++	0x1784, 0xa116, 0x00c0, 0x1784, 0x2060, 0x6000, 0x6806, 0x017e,
++	0x200b, 0x0000, 0x0078, 0x1787, 0x2009, 0x0000, 0x017e, 0x6804,
++	0xa065, 0x0040, 0x1798, 0x6000, 0x6806, 0x1078, 0x17ad, 0x1078,
++	0x18a4, 0x1078, 0x2b27, 0x6810, 0x8001, 0x6812, 0x00c0, 0x1787,
++	0x1078, 0x2b27, 0x017f, 0x6902, 0x6906, 0x2091, 0x8001, 0x007c,
++	0xa065, 0x0040, 0x17ac, 0x6098, 0x609b, 0x0000, 0x2008, 0x1078,
++	0x173e, 0x2100, 0x0078, 0x17a0, 0x007c, 0x6003, 0x0103, 0x20a9,
++	0x001c, 0xac80, 0x0004, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828,
++	0x6016, 0x682c, 0x601e, 0x007c, 0x0e7e, 0x2071, 0x3840, 0x7040,
++	0xa08c, 0x0200, 0x00c0, 0x17ca, 0xa088, 0x3880, 0x2d0a, 0x8000,
++	0x7042, 0xa006, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0x3840, 0x2009,
++	0x3880, 0x7240, 0x8221, 0x8211, 0x0048, 0x17e4, 0x2104, 0x8108,
++	0xad06, 0x00c0, 0x17d3, 0x8119, 0x211e, 0x8108, 0x8318, 0x8211,
++	0x00c8, 0x17dc, 0x7442, 0xa006, 0x0e7f, 0x007c, 0x1078, 0x1758,
++	0x2091, 0x8000, 0x6804, 0x781e, 0xa065, 0x0040, 0x182f, 0x0078,
++	0x17f7, 0x2c00, 0x781e, 0x6000, 0xa065, 0x0040, 0x182f, 0x600c,
++	0xa306, 0x00c0, 0x17f1, 0x6008, 0xa206, 0x00c0, 0x17f1, 0x2c28,
++	0x2001, 0x384f, 0x2004, 0xac06, 0x0040, 0x182f, 0x6804, 0xac06,
++	0x00c0, 0x1814, 0x6000, 0x2060, 0x6806, 0xa005, 0x00c0, 0x1814,
++	0x6803, 0x0000, 0x0078, 0x181e, 0x6400, 0x781c, 0x2060, 0x6402,
++	0xa486, 0x0000, 0x00c0, 0x181e, 0x2c00, 0x6802, 0x2560, 0x1078,
++	0x17ad, 0x6017, 0x0005, 0x601f, 0x0020, 0x1078, 0x18a4, 0x1078,
++	0x2b27, 0x6810, 0x8001, 0x6812, 0x2001, 0xffff, 0xa005, 0x007c,
++	0x2039, 0x0000, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008,
++	0x2091, 0x8000, 0x1078, 0x1765, 0x8738, 0xa784, 0x001f, 0x00c0,
++	0x183a, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00,
++	0x00c0, 0x183a, 0x2091, 0x8001, 0x007c, 0x0068, 0x185c, 0x2061,
++	0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x185c, 0x78ac, 0x78af,
++	0x0000, 0xa005, 0x00c0, 0x185d, 0x007c, 0xa08c, 0xfff0, 0x0040,
++	0x1863, 0x1078, 0x1ce7, 0x0079, 0x1865, 0x1875, 0x1877, 0x187d,
++	0x1881, 0x1875, 0x1885, 0x1875, 0x1875, 0x188b, 0x1875, 0x1892,
++	0x1896, 0x1875, 0x1875, 0x1875, 0x1875, 0x1078, 0x1ce7, 0x1078,
++	0x1830, 0x2001, 0x8001, 0x0078, 0x189c, 0x2001, 0x8003, 0x0078,
++	0x189c, 0x2001, 0x8004, 0x0078, 0x189c, 0x1078, 0x1830, 0x2001,
++	0x8006, 0x0078, 0x189c, 0x2001, 0x8009, 0x2011, 0x382c, 0x220c,
++	0x0078, 0x11ec, 0x2001, 0x800c, 0x0078, 0x189c, 0x1078, 0x1830,
++	0x2001, 0x800d, 0x0078, 0x189c, 0x70c2, 0x2061, 0x0000, 0x601b,
++	0x0001, 0x2091, 0x4080, 0x007c, 0x2c04, 0x6082, 0x2c08, 0x2063,
++	0x0000, 0x7864, 0x8000, 0x7866, 0x7868, 0xa005, 0x796a, 0x0040,
++	0x18b4, 0x2c02, 0x0078, 0x18b5, 0x796e, 0x007c, 0x0c7e, 0x2061,
++	0x3800, 0x6883, 0x0103, 0x2d08, 0x206b, 0x0000, 0x6064, 0x8000,
++	0x6066, 0x6068, 0xa005, 0x616a, 0x0040, 0x18c9, 0x2d02, 0x0078,
++	0x18cc, 0x616e, 0x1078, 0x2b41, 0x0c7f, 0x007c, 0x1078, 0x18df,
++	0x0040, 0x18de, 0x0c7e, 0x6098, 0xa065, 0x0040, 0x18d9, 0x1078,
++	0x17a0, 0x0c7f, 0x609b, 0x0000, 0x1078, 0x173e, 0x007c, 0x786c,
++	0xa065, 0x0040, 0x18f1, 0x2091, 0x8000, 0x7864, 0x8001, 0x7866,
++	0x2c04, 0x786e, 0xa005, 0x00c0, 0x18ef, 0x786a, 0x8000, 0x2091,
++	0x8001, 0x007c, 0x7898, 0xa005, 0x00c0, 0x194d, 0x7974, 0x70d0,
++	0x0005, 0x0005, 0x72d0, 0xa206, 0x00c0, 0x18f7, 0x2200, 0xa106,
++	0x00c0, 0x190e, 0x7804, 0xa005, 0x0040, 0x194d, 0x7807, 0x0000,
++	0x0068, 0x194d, 0x2091, 0x4080, 0x0078, 0x194d, 0x1078, 0x1735,
++	0x0040, 0x194d, 0x7a7c, 0x7b78, 0xa184, 0xff00, 0x0040, 0x1921,
++	0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0078,
++	0x1924, 0x8107, 0x8004, 0x8004, 0xa210, 0xa399, 0x0000, 0x2009,
++	0x0040, 0x1078, 0x1705, 0x0040, 0x1944, 0x1078, 0x173e, 0x7880,
++	0x8000, 0x7882, 0xa086, 0x0002, 0x00c0, 0x194d, 0x2091, 0x8000,
++	0x78af, 0x0002, 0x7883, 0x0000, 0x7898, 0xa085, 0x0003, 0x789a,
++	0x2091, 0x8001, 0x0078, 0x194d, 0x7883, 0x0000, 0x1078, 0x1a99,
++	0x6000, 0xa084, 0x0007, 0x0079, 0x194e, 0x007c, 0x1956, 0x1965,
++	0x1985, 0x1956, 0x1997, 0x1956, 0x1956, 0x1956, 0x2039, 0x0400,
++	0x78a8, 0xa705, 0x78aa, 0x6004, 0xa705, 0x6006, 0x1078, 0x19e2,
++	0x6018, 0x78a6, 0x1078, 0x1a81, 0x007c, 0x78a8, 0xa084, 0x0100,
++	0x0040, 0x196c, 0x0078, 0x1956, 0x78ab, 0x0000, 0x6000, 0x8007,
++	0xa084, 0x00ff, 0x789e, 0x8001, 0x609b, 0x0000, 0x0040, 0x1982,
++	0x1078, 0x19e2, 0x0040, 0x1982, 0x78a8, 0xa085, 0x0100, 0x78aa,
++	0x0078, 0x1984, 0x1078, 0x1a06, 0x007c, 0x78a8, 0xa08c, 0x0e00,
++	0x00c0, 0x198e, 0xa084, 0x0100, 0x00c0, 0x1990, 0x0078, 0x1956,
++	0x1078, 0x19e2, 0x00c0, 0x1996, 0x1078, 0x1a06, 0x007c, 0x78a8,
++	0xa084, 0x0100, 0x0040, 0x199e, 0x0078, 0x1956, 0x78ab, 0x0000,
++	0x6710, 0x2011, 0x0001, 0x20a9, 0x0001, 0x6014, 0xa084, 0x00ff,
++	0xa005, 0x0040, 0x19c1, 0x2011, 0x0001, 0xa7bc, 0xff00, 0x20a9,
++	0x0020, 0xa08e, 0x0001, 0x0040, 0x19c1, 0x2039, 0x0000, 0x2011,
++	0x0002, 0x20a9, 0x0100, 0xa08e, 0x0002, 0x0040, 0x19c1, 0x0078,
++	0x19df, 0x1078, 0x1758, 0x2d00, 0x2091, 0x8000, 0x682b, 0x0000,
++	0x682f, 0x0000, 0x6808, 0xa084, 0xffde, 0x680a, 0x2d00, 0xa080,
++	0x0010, 0x2068, 0x2091, 0x8001, 0x0070, 0x19d8, 0x0078, 0x19c4,
++	0x8211, 0x0040, 0x19df, 0x20a9, 0x0100, 0x0078, 0x19c4, 0x1078,
++	0x173e, 0x007c, 0x78a0, 0xa06d, 0x00c0, 0x19ed, 0x2c00, 0x78a2,
++	0x78a6, 0x609b, 0x0000, 0x0078, 0x19f9, 0x2c00, 0x689a, 0x609b,
++	0x0000, 0x78a2, 0x2d00, 0x6002, 0x78a4, 0xad06, 0x00c0, 0x19f9,
++	0x6002, 0x789c, 0x8001, 0x789e, 0x00c0, 0x1a05, 0x78a8, 0xa084,
++	0x0000, 0x78aa, 0x78a4, 0x2060, 0xa006, 0x007c, 0xa02e, 0x2530,
++	0x6118, 0xa184, 0x0060, 0x619e, 0x0040, 0x1a12, 0x0e7e, 0x1078,
++	0x3199, 0x0e7f, 0x6592, 0x65a2, 0x6696, 0x66a6, 0x60ab, 0x0000,
++	0x60af, 0x0000, 0x6710, 0x1078, 0x1758, 0x2091, 0x8000, 0x6808,
++	0xa084, 0x0001, 0x0040, 0x1a34, 0x2091, 0x8001, 0x1078, 0x17ad,
++	0x2091, 0x8000, 0x1078, 0x18a4, 0x2091, 0x8001, 0x78a3, 0x0000,
++	0x78a7, 0x0000, 0x0078, 0x1a80, 0x6020, 0xa096, 0x0001, 0x00c0,
++	0x1a3b, 0x8000, 0x6022, 0x6a10, 0x6814, 0x2091, 0x8001, 0xa202,
++	0x0048, 0x1a4a, 0x0040, 0x1a4a, 0x2039, 0x0200, 0x1078, 0x1a81,
++	0x0078, 0x1a80, 0x2c08, 0x2091, 0x8000, 0x6800, 0xa065, 0x0040,
++	0x1a52, 0x6102, 0x6902, 0x00c0, 0x1a56, 0x6906, 0x2160, 0x6003,
++	0x0000, 0x6810, 0x8000, 0x6812, 0x78b8, 0x8000, 0x78ba, 0x2091,
++	0x8001, 0x6808, 0xa08c, 0x0040, 0x0040, 0x1a76, 0xa086, 0x0040,
++	0x680a, 0x1078, 0x17bc, 0x017e, 0x007e, 0x6930, 0x2100, 0x810f,
++	0xa105, 0x6832, 0x6934, 0x693a, 0x007f, 0x017f, 0x2091, 0x8000,
++	0x1078, 0x1b49, 0x2091, 0x8001, 0x78a7, 0x0000, 0x78a3, 0x0000,
++	0x007c, 0x6004, 0xa705, 0x6006, 0x2091, 0x8000, 0x1078, 0x18a4,
++	0x2091, 0x8001, 0x78a4, 0xa065, 0x0040, 0x1a94, 0x6098, 0x78a6,
++	0x609b, 0x0000, 0x0078, 0x1a84, 0x78a3, 0x0000, 0x78a7, 0x0000,
++	0x007c, 0x7970, 0x7874, 0x8000, 0xa10a, 0x00c8, 0x1aa0, 0xa006,
++	0x7876, 0x70d2, 0x7804, 0xa005, 0x0040, 0x1aae, 0x8001, 0x7806,
++	0x00c0, 0x1aae, 0x0068, 0x1aae, 0x2091, 0x4080, 0x007c, 0x0068,
++	0x1ac9, 0x2029, 0x0000, 0x786c, 0xa065, 0x0040, 0x1ac4, 0x1078,
++	0x1aca, 0x0040, 0x1ac4, 0x057e, 0x1078, 0x1ae8, 0x057f, 0x00c0,
++	0x1ac4, 0x8528, 0x0078, 0x1ab3, 0x85ff, 0x0040, 0x1ac9, 0x2091,
++	0x4080, 0x007c, 0x2091, 0x8000, 0x7b84, 0x7988, 0x72d4, 0x0005,
++	0x0005, 0x70d4, 0xa206, 0x00c0, 0x1ace, 0x2200, 0xa102, 0x00c0,
++	0x1ade, 0x2300, 0x2091, 0x8001, 0xa005, 0x007c, 0x0048, 0x1ae4,
++	0xa302, 0x2091, 0x8001, 0x007c, 0x8002, 0x2091, 0x8001, 0x007c,
++	0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x1b3f,
++	0x7008, 0x7208, 0xa206, 0x00c0, 0x1b3f, 0xa286, 0x0002, 0x00c0,
++	0x1b3f, 0x2071, 0x0010, 0xa184, 0xff00, 0x0040, 0x1b08, 0x810f,
++	0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0078, 0x1b0b,
++	0x8107, 0x8004, 0x8004, 0x7a90, 0x7b8c, 0xa210, 0xa399, 0x0000,
++	0x2009, 0x0018, 0x6024, 0xa005, 0x0040, 0x1b18, 0x2009, 0x0040,
++	0x1078, 0x16d7, 0x0040, 0x1b31, 0x7894, 0x8000, 0x7896, 0xa086,
++	0x0002, 0x00c0, 0x1b3f, 0x2091, 0x8000, 0x78af, 0x0003, 0x7897,
++	0x0000, 0x7898, 0xa085, 0x0300, 0x789a, 0x2091, 0x8001, 0x0078,
++	0x1b3f, 0x7897, 0x0000, 0x1078, 0x18ce, 0x7984, 0x7888, 0x8000,
++	0xa10a, 0x00c8, 0x1b3c, 0xa006, 0x788a, 0x70d6, 0xa006, 0x2071,
++	0x0010, 0x2091, 0x8001, 0x007c, 0x2009, 0x3868, 0x2091, 0x8000,
++	0x200a, 0x0f7e, 0x2079, 0x0100, 0x2009, 0x3840, 0x2104, 0xa086,
++	0x0000, 0x00c0, 0x1b62, 0x2009, 0x3812, 0x2104, 0xa005, 0x00c0,
++	0x1b62, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x1b62, 0x0018, 0x1b62,
++	0x781b, 0x0044, 0x0f7f, 0x007c, 0x127e, 0x2091, 0x2300, 0x2071,
++	0x3840, 0x2079, 0x0100, 0x2019, 0x305e, 0x20a1, 0x012b, 0x2304,
++	0xa005, 0x0040, 0x1b7c, 0x789a, 0x8318, 0x23ac, 0x8318, 0x2398,
++	0x53a6, 0x3318, 0x0078, 0x1b6f, 0x789b, 0x0020, 0x20a9, 0x0010,
++	0x78af, 0x0000, 0x78af, 0x0220, 0x0070, 0x1b88, 0x0078, 0x1b80,
++	0x7003, 0x0000, 0x1078, 0x1c87, 0x7004, 0xa084, 0x000f, 0xa085,
++	0x6280, 0x7806, 0x780f, 0x9200, 0x7843, 0x00d8, 0x7853, 0x0080,
++	0x780b, 0x0008, 0x7047, 0x387f, 0x7043, 0x0000, 0x127f, 0x2000,
++	0x007c, 0xa18c, 0x000f, 0x2011, 0x0101, 0x2204, 0xa084, 0xfff0,
++	0xa105, 0x2012, 0x1078, 0x1c87, 0x007c, 0x2011, 0x0101, 0x20a9,
++	0x0009, 0x810b, 0x0070, 0x1bb6, 0x0078, 0x1bb1, 0xa18c, 0x0e00,
++	0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c, 0x2009, 0x0101,
++	0x20a9, 0x0005, 0x8213, 0x0070, 0x1bc7, 0x0078, 0x1bc2, 0xa294,
++	0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205, 0x200a, 0x007c, 0x2011,
++	0x0101, 0x20a9, 0x000c, 0x810b, 0x0070, 0x1bd8, 0x0078, 0x1bd3,
++	0xa18c, 0xf000, 0x2204, 0xa084, 0x0fff, 0xa105, 0x2012, 0x007c,
++	0x2011, 0x0102, 0x2204, 0xa084, 0xffcf, 0xa105, 0x2012, 0x007c,
++	0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100, 0x609a,
++	0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0022,
++	0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae,
++	0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0022, 0x0c7e, 0x2061,
++	0x0100, 0x609a, 0x60a4, 0xa085, 0x0020, 0x60ae, 0x0c7f, 0x007c,
++	0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100, 0x609a,
++	0x60a4, 0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018, 0x0c7f, 0x007c,
++	0x2091, 0x8000, 0x0c7e, 0x0e7e, 0x6818, 0xa005, 0x0040, 0x1c65,
++	0x2061, 0x5c00, 0x1078, 0x1c6d, 0x0040, 0x1c53, 0x20a9, 0x0000,
++	0x2061, 0x5b00, 0x0c7e, 0x1078, 0x1c6d, 0x0040, 0x1c3f, 0x0c7f,
++	0x8c60, 0x0070, 0x1c3d, 0x0078, 0x1c32, 0x0078, 0x1c65, 0x007f,
++	0xa082, 0x5b00, 0x2071, 0x3840, 0x70ba, 0x601c, 0xa085, 0x0800,
++	0x601e, 0x71b6, 0x60a7, 0x0000, 0x2001, 0x0004, 0x70a2, 0x1078,
++	0x1b44, 0x0078, 0x1c61, 0x2071, 0x3840, 0x601c, 0xa085, 0x0800,
++	0x601e, 0x71b6, 0x60a7, 0x0000, 0x2001, 0x0006, 0x70a2, 0x1078,
++	0x1b44, 0x2001, 0x0000, 0x0078, 0x1c67, 0x2001, 0x0001, 0x2091,
++	0x8001, 0xa005, 0x0e7f, 0x0c7f, 0x007c, 0x2c04, 0xa005, 0x0040,
++	0x1c84, 0x2060, 0x600c, 0xa306, 0x00c0, 0x1c81, 0x6008, 0xa206,
++	0x00c0, 0x1c81, 0x6010, 0xa106, 0x00c0, 0x1c81, 0xa006, 0x0078,
++	0x1c86, 0x6000, 0x0078, 0x1c6e, 0xa085, 0x0001, 0x007c, 0x2011,
++	0x3841, 0x220c, 0xa18c, 0x000f, 0x2011, 0x013b, 0x2204, 0xa084,
++	0x0100, 0x0040, 0x1c96, 0x2021, 0xff00, 0x2122, 0x007c, 0x0e7e,
++	0x68e4, 0xa08c, 0x0020, 0x0040, 0x1ce5, 0xa084, 0x0006, 0x00c0,
++	0x1ce5, 0x6010, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++	0xa0f0, 0x3a80, 0x7004, 0xa084, 0x000a, 0x00c0, 0x1ce5, 0x7108,
++	0xa194, 0xff00, 0x0040, 0x1ce5, 0xa18c, 0x00ff, 0x7104, 0xa084,
++	0x0014, 0x00c0, 0x1cd2, 0x017e, 0x611c, 0xa18d, 0x0002, 0x611e,
++	0x017f, 0xa085, 0x0014, 0x7006, 0x2001, 0x000c, 0xa106, 0x0040,
++	0x1cce, 0x2100, 0x8003, 0x2008, 0x0078, 0x1ce2, 0x2009, 0x0019,
++	0x0078, 0x1ce2, 0x2011, 0x0000, 0x7000, 0xa084, 0xdfff, 0x7002,
++	0x7004, 0xa084, 0xffef, 0x7006, 0x017e, 0x611c, 0xa18d, 0x0002,
++	0x611e, 0x017f, 0x2100, 0xa205, 0x700a, 0x0e7f, 0x007c, 0x0068,
++	0x1ce7, 0x007e, 0x2071, 0x0000, 0x7018, 0xa084, 0x0001, 0x00c0,
++	0x1cec, 0x007f, 0x2e08, 0x2071, 0x0010, 0x70ca, 0x007f, 0x70c6,
++	0x70c3, 0x8002, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080,
++	0x007f, 0x2070, 0x007f, 0x0078, 0x1d03, 0x107e, 0x007e, 0x127e,
++	0x2091, 0x2300, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0xa594, 0x003f,
++	0xa484, 0x4000, 0x0040, 0x1d1a, 0xa784, 0x007c, 0x00c0, 0x3022,
++	0x1078, 0x1ce7, 0xa49c, 0x000f, 0xa382, 0x0004, 0x0050, 0x1d22,
++	0x1078, 0x1ce7, 0x8507, 0xa084, 0x000f, 0x0079, 0x1d27, 0x21a1,
++	0x2251, 0x2277, 0x24cf, 0x2787, 0x27cf, 0x2808, 0x2883, 0x28dd,
++	0x2962, 0x1d4d, 0x1d37, 0x1fb8, 0x208d, 0x2766, 0x1d37, 0x1078,
++	0x1ce7, 0x0018, 0x1d0a, 0x127f, 0x2091, 0x8001, 0x007f, 0x107f,
++	0x007c, 0x7003, 0x0000, 0x703f, 0x0000, 0x7030, 0xa005, 0x0040,
++	0x1d4b, 0x7033, 0x0000, 0x0018, 0x1d0a, 0x705c, 0xa005, 0x00c0,
++	0x1df8, 0x70a0, 0xa084, 0x001f, 0x0079, 0x1d56, 0x1e18, 0x1d5e,
++	0x1d6c, 0x1d8d, 0x1db3, 0x1ddf, 0x1ddd, 0x1d5e, 0x7808, 0xa084,
++	0xfffd, 0x780a, 0x2009, 0x0046, 0x1078, 0x260f, 0x00c0, 0x1d6a,
++	0x7003, 0x0004, 0x0078, 0x1d39, 0x1078, 0x2fe4, 0x00c0, 0x1d8b,
++	0x70b4, 0x8007, 0x789b, 0x007e, 0x78aa, 0x789b, 0x0010, 0x78ab,
++	0x000c, 0x789b, 0x0060, 0x78ab, 0x0001, 0x785b, 0x0004, 0x2009,
++	0x00f7, 0x1078, 0x260d, 0x00c0, 0x1d8b, 0x7003, 0x0004, 0x70c3,
++	0x000f, 0x7033, 0x3870, 0x0078, 0x1d39, 0x1078, 0x2fe4, 0x00c0,
++	0x1db1, 0x71b4, 0x8107, 0x789b, 0x007e, 0x78aa, 0x789b, 0x0010,
++	0xa18c, 0x0007, 0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b,
++	0x0060, 0x78ab, 0x0002, 0x785b, 0x0004, 0x2009, 0x00f7, 0x1078,
++	0x260d, 0x00c0, 0x1db1, 0x7003, 0x0004, 0x70c3, 0x000f, 0x7033,
++	0x3870, 0x0078, 0x1d39, 0x1078, 0x2fe4, 0x00c0, 0x1ddb, 0x71b4,
++	0x8107, 0x789b, 0x007e, 0x78aa, 0x789b, 0x0010, 0xa18c, 0x0007,
++	0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0020, 0x71b8, 0x79aa, 0x78ab,
++	0x000d, 0x789b, 0x0060, 0x78ab, 0x0004, 0x785b, 0x0004, 0x2009,
++	0x00f7, 0x1078, 0x260d, 0x00c0, 0x1ddb, 0x7003, 0x0004, 0x70c3,
++	0x000f, 0x7033, 0x3870, 0x0078, 0x1d39, 0x0078, 0x1d8d, 0x1078,
++	0x2fe4, 0x00c0, 0x1d39, 0x70bc, 0x2068, 0x789b, 0x0010, 0x6f10,
++	0x1078, 0x2f11, 0x2c50, 0x6810, 0xa084, 0x001f, 0xa085, 0x0080,
++	0x78aa, 0x6e18, 0x2041, 0x0001, 0x2001, 0x0004, 0x0078, 0x1f41,
++	0x1078, 0x2fe4, 0x00c0, 0x1d39, 0x789b, 0x0010, 0x705c, 0x2068,
++	0x6f10, 0x1078, 0x2f11, 0x2c50, 0x6008, 0xa085, 0x0010, 0x600a,
++	0x6810, 0xa084, 0x001f, 0xa085, 0x0080, 0x78aa, 0x2031, 0x0020,
++	0x2041, 0x0001, 0x1078, 0x304b, 0x2001, 0x0003, 0x0078, 0x1f2c,
++	0x0018, 0x1d0a, 0x7440, 0xa485, 0x0000, 0x0040, 0x1e32, 0xa080,
++	0x3880, 0x2030, 0x7144, 0x8108, 0xa12a, 0x0048, 0x1e29, 0x2009,
++	0x3880, 0x2164, 0x6504, 0x85ff, 0x00c0, 0x1e3f, 0x8421, 0x00c0,
++	0x1e23, 0x7146, 0x7003, 0x0000, 0x703f, 0x0000, 0x0078, 0x1d39,
++	0x7640, 0xa6b0, 0x3880, 0x7144, 0x2600, 0x0078, 0x1e2e, 0x7146,
++	0x2568, 0x2558, 0x753e, 0x2c50, 0x603c, 0xa085, 0x0000, 0x00c0,
++	0x1e3c, 0x6708, 0x7736, 0xa784, 0x033f, 0x0040, 0x1e75, 0xa784,
++	0x0021, 0x00c0, 0x1e3c, 0xa784, 0x0002, 0x0040, 0x1e5e, 0xa784,
++	0x0004, 0x0040, 0x1e3c, 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0008,
++	0x00c0, 0x1e3c, 0xa784, 0x0010, 0x00c0, 0x1e3c, 0xa184, 0x0200,
++	0x00c0, 0x1e3c, 0xa784, 0x0100, 0x0040, 0x1e75, 0x6018, 0xa005,
++	0x00c0, 0x1e3c, 0xa7bc, 0xfeff, 0x670a, 0x681f, 0x0000, 0x6e18,
++	0xa684, 0x000e, 0x6118, 0x0040, 0x1e85, 0x601c, 0xa102, 0x0048,
++	0x1e92, 0x0040, 0x1e92, 0x0078, 0x1e38, 0x81ff, 0x0040, 0x1e92,
++	0x6828, 0x8007, 0xa084, 0x00ff, 0xa082, 0x0003, 0x0040, 0x1e92,
++	0x00c0, 0x1e38, 0xa184, 0x0400, 0x00c0, 0x1ea1, 0x6130, 0xa18c,
++	0xff00, 0x810f, 0x6030, 0xa084, 0xff00, 0xa105, 0x6032, 0x0078,
++	0x1ea5, 0x6034, 0x603a, 0xa7bc, 0xfbff, 0xa784, 0x0080, 0x00c0,
++	0x1eab, 0x700c, 0x6022, 0xa7bc, 0xff7f, 0x670a, 0x6b10, 0x8307,
++	0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x3a80, 0x2060,
++	0x2048, 0x704a, 0x6000, 0x704e, 0x6004, 0x7052, 0x2a60, 0x0018,
++	0x1d0a, 0x789b, 0x0010, 0xa046, 0x1078, 0x2fe4, 0x00c0, 0x1d39,
++	0x6b10, 0xa39c, 0x001f, 0xa39d, 0x00c0, 0x704c, 0xa084, 0x8000,
++	0x0040, 0x1ed6, 0xa684, 0x0001, 0x0040, 0x1ed8, 0xa39c, 0xffbf,
++	0xa684, 0x0010, 0x0040, 0x1ede, 0xa39d, 0x0020, 0x7baa, 0x8840,
++	0xa684, 0x000e, 0x00c0, 0x1ee9, 0xa7bd, 0x0010, 0x670a, 0x0078,
++	0x1f2a, 0x714c, 0xa18c, 0x0800, 0x0040, 0x2b74, 0x2011, 0x0021,
++	0x8004, 0x8004, 0x0048, 0x1f00, 0x2011, 0x0022, 0x8004, 0x0048,
++	0x1f00, 0x2011, 0x0020, 0x8004, 0x0048, 0x1f00, 0x0040, 0x1f2a,
++	0x7aaa, 0x8840, 0x1078, 0x2ffd, 0x6a10, 0x610c, 0x8108, 0xa18c,
++	0x00ff, 0xa1e0, 0x5b00, 0x2c64, 0x8cff, 0x0040, 0x1f21, 0x6010,
++	0xa206, 0x00c0, 0x1f0b, 0x60b4, 0x8001, 0x60b6, 0x00c0, 0x1f06,
++	0x0c7e, 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x0c7f, 0x0078,
++	0x1e18, 0x1078, 0x2fe4, 0x00c0, 0x1d39, 0x2a60, 0x610e, 0x79aa,
++	0x8840, 0x712e, 0x2001, 0x0001, 0x007e, 0x7150, 0xa184, 0x0018,
++	0x0040, 0x1f40, 0xa184, 0x0010, 0x0040, 0x1f3a, 0x1078, 0x2d3d,
++	0x00c0, 0x1f40, 0xa184, 0x0008, 0x0040, 0x1f40, 0x1078, 0x2c58,
++	0x007f, 0x7002, 0xa68c, 0x0060, 0x88ff, 0x0040, 0x1f49, 0xa18d,
++	0x0004, 0x795a, 0x69b2, 0x789b, 0x0060, 0x2800, 0x78aa, 0x789b,
++	0x0061, 0x6814, 0xa085, 0x8000, 0x6816, 0x78aa, 0x157e, 0x137e,
++	0x147e, 0x20a1, 0x012c, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80,
++	0x000a, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6810, 0x8007,
++	0x789b, 0x007e, 0x78aa, 0x6d90, 0x7dd6, 0x7dde, 0x6e94, 0x7ed2,
++	0x7eda, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x1f78, 0x0098, 0x1f80,
++	0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x2ffd, 0x0078, 0x1d41,
++	0x7200, 0xa284, 0x0007, 0xa086, 0x0001, 0x00c0, 0x1f8d, 0x781b,
++	0x0049, 0x1078, 0x2ffd, 0x0078, 0x1f9e, 0x6ab0, 0xa295, 0x2000,
++	0x7a5a, 0x781b, 0x0049, 0x1078, 0x2ffd, 0x7200, 0x2500, 0xa605,
++	0x0040, 0x1f9e, 0xa284, 0x0007, 0x1079, 0x1fae, 0xad80, 0x0008,
++	0x7032, 0xa284, 0x0007, 0xa086, 0x0001, 0x00c0, 0x1fac, 0x6018,
++	0x8000, 0x601a, 0x1078, 0x2b4b, 0x0078, 0x1d39, 0x1fb6, 0x3376,
++	0x3376, 0x3365, 0x3376, 0x1fb6, 0x1fb6, 0x1fb6, 0x1078, 0x1ce7,
++	0x7808, 0xa084, 0xfffd, 0x780a, 0x0f7e, 0x2079, 0x3800, 0x7898,
++	0x0f7f, 0xa084, 0x0001, 0x0040, 0x1fde, 0x70a0, 0xa086, 0x0001,
++	0x00c0, 0x1fcd, 0x70a2, 0x0078, 0x2071, 0x70a0, 0xa086, 0x0005,
++	0x00c0, 0x1fdc, 0x70bc, 0x2068, 0x6817, 0x0004, 0x6813, 0x0000,
++	0x681c, 0xa085, 0x0008, 0x681e, 0x70a3, 0x0000, 0x157e, 0x2011,
++	0x0004, 0x71a0, 0xa186, 0x0001, 0x0040, 0x2000, 0xa186, 0x0007,
++	0x00c0, 0x1ff0, 0x2009, 0x382b, 0x200b, 0x0005, 0x0078, 0x2000,
++	0x2009, 0x3813, 0x2104, 0x2009, 0x3812, 0x200a, 0x2009, 0x382b,
++	0x200b, 0x0001, 0x70a3, 0x0000, 0x70a7, 0x0001, 0x0078, 0x2002,
++	0x70a3, 0x0000, 0x1078, 0x314d, 0x20a9, 0x0010, 0x2039, 0x0000,
++	0x1078, 0x2e16, 0xa7b8, 0x0100, 0x0070, 0x2010, 0x0078, 0x2008,
++	0x7000, 0x2020, 0x0079, 0x2014, 0x2042, 0x202b, 0x202b, 0x201e,
++	0x2042, 0x2042, 0x201c, 0x201c, 0x1078, 0x1ce7, 0x2021, 0x3857,
++	0x2404, 0xa005, 0x0040, 0x202b, 0xad06, 0x00c0, 0x202b, 0x6800,
++	0x2022, 0x0078, 0x203b, 0x681c, 0xa084, 0x0001, 0x00c0, 0x2037,
++	0x6f10, 0x1078, 0x2f11, 0x1078, 0x2b06, 0x0078, 0x203b, 0x7054,
++	0x2060, 0x6800, 0x6002, 0x6a16, 0x681c, 0xa085, 0x0008, 0x681e,
++	0x1078, 0x18b6, 0x2021, 0x5c00, 0x1078, 0x2077, 0x2021, 0x3857,
++	0x1078, 0x2077, 0x20a9, 0x0000, 0x2021, 0x5b00, 0x1078, 0x2077,
++	0x8420, 0x0070, 0x2055, 0x0078, 0x204e, 0x1078, 0x2b55, 0x2061,
++	0x3b00, 0x2021, 0x0002, 0x20a9, 0x0100, 0x6018, 0x6110, 0xa102,
++	0x6012, 0x601b, 0x0000, 0xace0, 0x0010, 0x0070, 0x2069, 0x0078,
++	0x205d, 0x2009, 0x382f, 0x200b, 0x0000, 0x8421, 0x00c0, 0x205b,
++	0x157f, 0x7003, 0x0000, 0x703f, 0x0000, 0x0078, 0x1d39, 0x047e,
++	0x2404, 0xa005, 0x0040, 0x2089, 0x2068, 0x6800, 0x007e, 0x6a16,
++	0x681c, 0xa085, 0x0008, 0x681e, 0x1078, 0x18b6, 0x007f, 0x0078,
++	0x2079, 0x047f, 0x2023, 0x0000, 0x007c, 0xa282, 0x0003, 0x0050,
++	0x2093, 0x1078, 0x1ce7, 0x2300, 0x0079, 0x2096, 0x2099, 0x210c,
++	0x211a, 0xa282, 0x0002, 0x0040, 0x209f, 0x1078, 0x1ce7, 0x70a0,
++	0x70a3, 0x0000, 0x70c3, 0x0000, 0x0079, 0x20a6, 0x20ae, 0x20ae,
++	0x20b0, 0x20e4, 0x2b7a, 0x20ae, 0x20e4, 0x20ae, 0x1078, 0x1ce7,
++	0x77b4, 0x1078, 0x2e16, 0x77b4, 0xa7bc, 0x0f00, 0x1078, 0x2f11,
++	0x6018, 0xa005, 0x0040, 0x20db, 0x2021, 0x5c00, 0x2009, 0x0004,
++	0x2011, 0x0010, 0x1078, 0x216a, 0x0040, 0x20db, 0x157e, 0x20a9,
++	0x0000, 0x2021, 0x5b00, 0x047e, 0x2009, 0x0004, 0x2011, 0x0010,
++	0x1078, 0x216a, 0x047f, 0x0040, 0x20da, 0x8420, 0x0070, 0x20da,
++	0x0078, 0x20cb, 0x157f, 0x8738, 0xa784, 0x001f, 0x00c0, 0x20b6,
++	0x0078, 0x1d41, 0x0078, 0x1d41, 0x77b4, 0x1078, 0x2f11, 0x6018,
++	0xa005, 0x0040, 0x210a, 0x2021, 0x5c00, 0x2009, 0x0005, 0x2011,
++	0x0020, 0x1078, 0x216a, 0x0040, 0x210a, 0x157e, 0x20a9, 0x0000,
++	0x2021, 0x5b00, 0x047e, 0x2009, 0x0005, 0x2011, 0x0020, 0x1078,
++	0x216a, 0x047f, 0x0040, 0x2109, 0x8420, 0x0070, 0x2109, 0x0078,
++	0x20fa, 0x157f, 0x0078, 0x1d41, 0x2200, 0x0079, 0x210f, 0x2112,
++	0x2114, 0x2114, 0x1078, 0x1ce7, 0x70a3, 0x0000, 0x70a7, 0x0001,
++	0x0078, 0x1d39, 0x2200, 0x0079, 0x211d, 0x2122, 0x2114, 0x2120,
++	0x1078, 0x1ce7, 0x1078, 0x261c, 0x70a0, 0xa086, 0x0002, 0x00c0,
++	0x2159, 0x77b4, 0x1078, 0x2e16, 0x77b4, 0xa7bc, 0x0f00, 0x1078,
++	0x2f11, 0x6018, 0xa005, 0x0040, 0x2154, 0x2021, 0x5c00, 0x2009,
++	0x0005, 0x2011, 0x0020, 0x1078, 0x216a, 0x0040, 0x2154, 0x157e,
++	0x20a9, 0x0000, 0x2021, 0x5b00, 0x047e, 0x2009, 0x0005, 0x2011,
++	0x0020, 0x1078, 0x216a, 0x047f, 0x0040, 0x2153, 0x8420, 0x0070,
++	0x2153, 0x0078, 0x2144, 0x157f, 0x8738, 0xa784, 0x001f, 0x00c0,
++	0x212f, 0x7000, 0xa086, 0x0001, 0x00c0, 0x2acd, 0x1078, 0x2b1e,
++	0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x2ac0, 0x0040, 0x2acd,
++	0x0078, 0x1e18, 0x2404, 0xa005, 0x0040, 0x219d, 0x2068, 0x2d04,
++	0x007e, 0x6810, 0xa706, 0x0040, 0x2179, 0x2d20, 0x007f, 0x0078,
++	0x216b, 0x007f, 0x2022, 0x6916, 0x6814, 0xa086, 0x0050, 0x00c0,
++	0x218c, 0x6817, 0x0006, 0x2200, 0xa086, 0x0010, 0x00c0, 0x218c,
++	0x681c, 0xa084, 0xffef, 0x681e, 0x681c, 0xa205, 0x681e, 0x1078,
++	0x18b6, 0x1078, 0x2b27, 0x6010, 0x8001, 0x6012, 0x6008, 0xa084,
++	0xffef, 0x600a, 0x1078, 0x2b1e, 0x007c, 0xa085, 0x0001, 0x0078,
++	0x219c, 0x2300, 0x0079, 0x21a4, 0x21a9, 0x21a7, 0x21ec, 0x1078,
++	0x1ce7, 0x78e4, 0xa005, 0x00d0, 0x21cc, 0x0018, 0x21cc, 0x2008,
++	0xa084, 0x0030, 0x00c0, 0x21b8, 0x781b, 0x0049, 0x0078, 0x1d39,
++	0x78ec, 0xa084, 0x0003, 0x0040, 0x21b4, 0x2100, 0xa084, 0x0007,
++	0x0079, 0x21c2, 0x21da, 0x21e0, 0x21d4, 0x21ca, 0x2fde, 0x2fde,
++	0x21ca, 0x21e6, 0x1078, 0x1ce7, 0x7000, 0xa005, 0x0040, 0x1d41,
++	0x2001, 0x0003, 0x0078, 0x24e3, 0x1078, 0x2df9, 0x781b, 0x0055,
++	0x0078, 0x1d39, 0x1078, 0x2df9, 0x781b, 0x00dc, 0x0078, 0x1d39,
++	0x1078, 0x2df9, 0x781b, 0x00e3, 0x0078, 0x1d39, 0x1078, 0x2df9,
++	0x781b, 0x009d, 0x0078, 0x1d39, 0xa584, 0x000f, 0x00c0, 0x2216,
++	0x1078, 0x261c, 0x7000, 0x0079, 0x21f5, 0x21fd, 0x220a, 0x21fd,
++	0x2acd, 0x21ff, 0x2acd, 0x21fd, 0x21fd, 0x1078, 0x1ce7, 0x71a0,
++	0x70a3, 0x0000, 0xa186, 0x0004, 0x00c0, 0x2208, 0x0078, 0x2b7a,
++	0x0078, 0x2acd, 0x1078, 0x2b1e, 0x6008, 0xa084, 0xffef, 0x600a,
++	0x1078, 0x2ac0, 0x0040, 0x2acd, 0x0078, 0x1e18, 0x78e4, 0xa005,
++	0x00d0, 0x21cc, 0x0018, 0x21cc, 0x2008, 0xa084, 0x0030, 0x00c0,
++	0x2225, 0x781b, 0x0049, 0x0078, 0x1d39, 0x78ec, 0xa084, 0x0003,
++	0x0040, 0x2221, 0x2100, 0xa184, 0x0007, 0x0079, 0x222f, 0x223f,
++	0x2245, 0x2239, 0x2237, 0x2fde, 0x2fde, 0x2237, 0x2fd6, 0x1078,
++	0x1ce7, 0x1078, 0x2e01, 0x781b, 0x0055, 0x0078, 0x1d39, 0x1078,
++	0x2e01, 0x781b, 0x00dc, 0x0078, 0x1d39, 0x1078, 0x2e01, 0x781b,
++	0x00e3, 0x0078, 0x1d39, 0x1078, 0x2e01, 0x781b, 0x009d, 0x0078,
++	0x1d39, 0x2300, 0x0079, 0x2254, 0x2259, 0x2257, 0x225b, 0x1078,
++	0x1ce7, 0x0078, 0x2883, 0x6817, 0x0008, 0x78a3, 0x0000, 0x79e4,
++	0xa184, 0x0030, 0x0040, 0x2883, 0x78ec, 0xa084, 0x0003, 0x0040,
++	0x2883, 0xa184, 0x0007, 0x0079, 0x226d, 0x21da, 0x21e0, 0x21d4,
++	0x2fb6, 0x2fde, 0x2fde, 0x2275, 0x2fd6, 0x1078, 0x1ce7, 0xa282,
++	0x0005, 0x0050, 0x227d, 0x1078, 0x1ce7, 0x2300, 0x0079, 0x2280,
++	0x2283, 0x24b7, 0x24c3, 0x2200, 0x0079, 0x2286, 0x228b, 0x228d,
++	0x22a0, 0x228b, 0x249c, 0x1078, 0x1ce7, 0x789b, 0x0018, 0x78a8,
++	0xa084, 0x00ff, 0xa082, 0x0020, 0x0048, 0x2dda, 0xa08a, 0x0004,
++	0x00c8, 0x2dda, 0x0079, 0x229c, 0x2dda, 0x2dda, 0x2dda, 0x2d7c,
++	0x789b, 0x0018, 0x79a8, 0xa184, 0x0080, 0x0040, 0x22b5, 0xa184,
++	0x0018, 0x0040, 0x22b1, 0x0078, 0x2dda, 0x7000, 0xa005, 0x00c0,
++	0x22ab, 0x2011, 0x0003, 0x0078, 0x2970, 0xa184, 0x00ff, 0xa08c,
++	0x0080, 0x0040, 0x22e9, 0x7000, 0xa086, 0x0001, 0x00c0, 0x22c8,
++	0x1078, 0x2b1e, 0x1078, 0x314d, 0x7034, 0x600a, 0x0078, 0x22cd,
++	0x7000, 0xa086, 0x0003, 0x0040, 0x22c2, 0x7003, 0x0005, 0x2001,
++	0x5c10, 0x2068, 0x703e, 0x7032, 0x157e, 0x20a9, 0x002f, 0x2003,
++	0x0000, 0x8000, 0x0070, 0x22de, 0x0078, 0x22d7, 0x157f, 0x6813,
++	0x0000, 0x68b3, 0x0700, 0x681f, 0x0800, 0x6823, 0x0003, 0x0078,
++	0x2dda, 0xa08a, 0x0010, 0x00c8, 0x2dda, 0x0079, 0x22ef, 0x2301,
++	0x22ff, 0x2317, 0x2319, 0x23ab, 0x2dda, 0x2dda, 0x23ad, 0x2dda,
++	0x2dda, 0x2498, 0x2498, 0x2dda, 0x2dda, 0x2dda, 0x249a, 0x1078,
++	0x1ce7, 0xa684, 0x1000, 0x0040, 0x230e, 0x2001, 0x0300, 0x8000,
++	0x8000, 0x783a, 0x781b, 0x009a, 0x0078, 0x1d39, 0x6814, 0xa084,
++	0x8000, 0x0040, 0x2315, 0x6817, 0x0003, 0x0078, 0x2fb6, 0x1078,
++	0x1ce7, 0x691c, 0x691e, 0xa684, 0x1800, 0x00c0, 0x2333, 0x681c,
++	0xa084, 0x0001, 0x00c0, 0x233b, 0x6814, 0xa086, 0x0008, 0x00c0,
++	0x232b, 0x6817, 0x0000, 0xa684, 0x0400, 0x0040, 0x23a7, 0x781b,
++	0x0058, 0x0078, 0x1d39, 0xa684, 0x1000, 0x0040, 0x233b, 0x781b,
++	0x0058, 0x0078, 0x1d39, 0xa684, 0x0060, 0x0040, 0x23a3, 0xa684,
++	0x0800, 0x0040, 0x23a3, 0xa684, 0x8000, 0x00c0, 0x2349, 0x0078,
++	0x2363, 0xa6b4, 0x7fff, 0x7e5a, 0x6eb2, 0x789b, 0x0074, 0x7aac,
++	0x79ac, 0x78ac, 0x801b, 0x00c8, 0x2356, 0x8000, 0xa084, 0x003f,
++	0xa108, 0xa291, 0x0000, 0x6b94, 0x2100, 0xa302, 0x68ae, 0x6b90,
++	0x2200, 0xa303, 0x68aa, 0xa684, 0x4000, 0x0040, 0x236b, 0xa6b4,
++	0xbfff, 0x7e5a, 0x6eb2, 0x7000, 0xa086, 0x0003, 0x00c0, 0x2378,
++	0x1078, 0x31c0, 0x1078, 0x3365, 0x781b, 0x0067, 0x0078, 0x1d39,
++	0xa006, 0x1078, 0x3414, 0x6aac, 0x69a8, 0x6c94, 0x6b90, 0x2200,
++	0xa105, 0x0040, 0x2387, 0x2200, 0xa422, 0x2100, 0xa31b, 0x7cd2,
++	0x7bd6, 0x2300, 0xa405, 0x00c0, 0x2395, 0xa6b5, 0x4000, 0x7e5a,
++	0x6eb2, 0x781b, 0x0067, 0x0078, 0x1d39, 0x781b, 0x0067, 0x2200,
++	0xa115, 0x00c0, 0x239f, 0x1078, 0x3376, 0x0078, 0x1d39, 0x1078,
++	0x339d, 0x0078, 0x1d39, 0x781b, 0x006a, 0x0078, 0x1d39, 0x781b,
++	0x0058, 0x0078, 0x1d39, 0x1078, 0x1ce7, 0x0078, 0x240a, 0x691c,
++	0xa184, 0x0100, 0x0040, 0x23c5, 0xa18c, 0xfeff, 0x691e, 0x0c7e,
++	0x7048, 0x2060, 0x6000, 0xa084, 0xefff, 0x6002, 0x6004, 0xa084,
++	0xfff5, 0x6006, 0x0c7f, 0x0078, 0x23f9, 0xa184, 0x0200, 0x0040,
++	0x23f9, 0xa18c, 0xfdff, 0x691e, 0x0c7e, 0x7048, 0x2060, 0x6000,
++	0xa084, 0xdfff, 0x6002, 0x6004, 0xa084, 0xffef, 0x6006, 0x2008,
++	0x2c48, 0x0c7f, 0xa184, 0x0008, 0x0040, 0x23f9, 0x1078, 0x2f0d,
++	0x1078, 0x2c58, 0x88ff, 0x0040, 0x23f9, 0x789b, 0x0060, 0x2800,
++	0x78aa, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0,
++	0x23f5, 0x781b, 0x0055, 0x0078, 0x1d39, 0x781b, 0x0069, 0x0078,
++	0x1d39, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2402, 0x781b, 0x0058,
++	0x0078, 0x1d39, 0x781b, 0x006a, 0x0078, 0x1d39, 0x0078, 0x2de0,
++	0x0078, 0x2de0, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007, 0x0040,
++	0x2408, 0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001,
++	0x00c0, 0x242d, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040,
++	0x2425, 0x0048, 0x2425, 0x0078, 0x2427, 0x0078, 0x23af, 0x24a8,
++	0x7aa8, 0x00f0, 0x2427, 0x0078, 0x2413, 0xa284, 0x00f0, 0xa086,
++	0x0020, 0x00c0, 0x2489, 0x8318, 0x8318, 0x2300, 0xa102, 0x0040,
++	0x243d, 0x0048, 0x243d, 0x0078, 0x2486, 0xa286, 0x0023, 0x0040,
++	0x2408, 0x6818, 0xa084, 0xfff1, 0x681a, 0x7e58, 0xa684, 0xfff1,
++	0xa085, 0x0010, 0x2030, 0x7e5a, 0x6008, 0xa085, 0x0010, 0x600a,
++	0x0c7e, 0x7048, 0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xa184,
++	0x0010, 0x0040, 0x2461, 0x1078, 0x2f0d, 0x1078, 0x2d3d, 0x0078,
++	0x2470, 0x0c7e, 0x7048, 0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f,
++	0xa184, 0x0008, 0x0040, 0x23f9, 0x1078, 0x2f0d, 0x1078, 0x2c58,
++	0x88ff, 0x0040, 0x23f9, 0x789b, 0x0060, 0x2800, 0x78aa, 0xa6b5,
++	0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2482, 0x781b, 0x0055,
++	0x0078, 0x1d39, 0x781b, 0x0069, 0x0078, 0x1d39, 0x7aa8, 0x0078,
++	0x2413, 0x8318, 0x2300, 0xa102, 0x0040, 0x2492, 0x0048, 0x2492,
++	0x0078, 0x2413, 0xa284, 0x0080, 0x00c0, 0x2de6, 0x0078, 0x2de0,
++	0x0078, 0x2de6, 0x0078, 0x2dda, 0x789b, 0x0018, 0x78a8, 0xa084,
++	0x00ff, 0xa08e, 0x0001, 0x0040, 0x24a7, 0x1078, 0x1ce7, 0x7aa8,
++	0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8,
++	0x2dda, 0x0079, 0x24b3, 0x2dda, 0x2bab, 0x2dda, 0x2cd8, 0xa282,
++	0x0000, 0x00c0, 0x24bd, 0x1078, 0x1ce7, 0x1078, 0x2df9, 0x781b,
++	0x0069, 0x0078, 0x1d39, 0xa282, 0x0003, 0x00c0, 0x24c9, 0x1078,
++	0x1ce7, 0x1078, 0x2e09, 0x781b, 0x0069, 0x0078, 0x1d39, 0xa282,
++	0x0004, 0x0050, 0x24d5, 0x1078, 0x1ce7, 0x2300, 0x0079, 0x24d8,
++	0x24db, 0x25c6, 0x25f7, 0xa286, 0x0003, 0x0040, 0x24e1, 0x1078,
++	0x1ce7, 0x2001, 0x0000, 0x703a, 0x7000, 0xa084, 0x0007, 0x0079,
++	0x24e9, 0x24f1, 0x24f3, 0x24f3, 0x2703, 0x274c, 0x26cd, 0x24f1,
++	0x24f1, 0x1078, 0x1ce7, 0xa684, 0x1000, 0x00c0, 0x24fb, 0x1078,
++	0x314d, 0x0040, 0x25a0, 0x7868, 0xa08c, 0x00ff, 0x0040, 0x2557,
++	0xa186, 0x0008, 0x00c0, 0x2512, 0x6008, 0xa084, 0xffef, 0x600a,
++	0x1078, 0x2ac0, 0x0040, 0x2557, 0x1078, 0x2b1e, 0x1078, 0x314d,
++	0x0078, 0x253e, 0xa186, 0x0028, 0x00c0, 0x2557, 0x1078, 0x314d,
++	0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x2b34, 0x6018, 0xa005,
++	0x0040, 0x253e, 0x8001, 0x601a, 0xa005, 0x0040, 0x2534, 0x8001,
++	0xa005, 0x0040, 0x2534, 0x601e, 0x0078, 0x253e, 0x6813, 0x0028,
++	0x6817, 0x0000, 0x0078, 0x25b5, 0x6030, 0xa084, 0x00ff, 0xa005,
++	0x0040, 0x252e, 0x6008, 0xa085, 0x0200, 0x600a, 0x681c, 0xa084,
++	0x0001, 0x0040, 0x1d41, 0x681c, 0xa084, 0xfffe, 0x681e, 0x7054,
++	0x0c7e, 0x2060, 0x6800, 0x6002, 0x0c7f, 0x6004, 0x6802, 0xa005,
++	0x2d00, 0x00c0, 0x2554, 0x6002, 0x6006, 0x0078, 0x1d41, 0x017e,
++	0x1078, 0x261c, 0x017f, 0xa684, 0xdf00, 0x681a, 0x6827, 0x0000,
++	0x6f10, 0x81ff, 0x0040, 0x25a0, 0xa186, 0x0002, 0x00c0, 0x2598,
++	0xa684, 0x0800, 0x00c0, 0x2574, 0xa684, 0x0060, 0x0040, 0x2574,
++	0x78d8, 0x7adc, 0x682e, 0x6a2a, 0x8717, 0xa294, 0x000f, 0x8213,
++	0x8213, 0x8213, 0xa290, 0x3a80, 0xa290, 0x0000, 0x221c, 0xa384,
++	0x0100, 0x00c0, 0x2585, 0x0078, 0x258b, 0x8210, 0x2204, 0xa085,
++	0x0018, 0x2012, 0x8211, 0xa384, 0x0400, 0x0040, 0x2598, 0x689c,
++	0xa084, 0x0100, 0x00c0, 0x2598, 0x1078, 0x268c, 0x0078, 0x1d41,
++	0xa186, 0x0018, 0x0040, 0x25a0, 0xa186, 0x0014, 0x0040, 0x1d41,
++	0x6912, 0x6814, 0xa084, 0x8000, 0x0040, 0x25a8, 0x7038, 0x6816,
++	0xa68c, 0xdf00, 0x691a, 0x1078, 0x2b0d, 0x1078, 0x2b1e, 0x00c0,
++	0x25b5, 0x6008, 0xa084, 0xffef, 0x600a, 0x681c, 0xa084, 0x0001,
++	0x00c0, 0x25be, 0x1078, 0x2b06, 0x0078, 0x25c2, 0x7054, 0x2060,
++	0x6800, 0x6002, 0x1078, 0x18b6, 0x0078, 0x1d41, 0xa282, 0x0004,
++	0x0048, 0x25cc, 0x1078, 0x1ce7, 0x2200, 0x0079, 0x25cf, 0x25d3,
++	0x25d5, 0x25e2, 0x25d5, 0x1078, 0x1ce7, 0x7000, 0xa086, 0x0005,
++	0x0040, 0x25de, 0x1078, 0x2df9, 0x781b, 0x0069, 0x781b, 0x006a,
++	0x0078, 0x1d39, 0x7890, 0x8007, 0x8001, 0xa084, 0x0007, 0xa080,
++	0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff, 0xa186, 0x0003, 0x0040,
++	0x25f3, 0x0078, 0x2dda, 0x781b, 0x006a, 0x0078, 0x1d39, 0x681c,
++	0xa085, 0x0004, 0x681e, 0x82ff, 0x00c0, 0x2602, 0x1078, 0x2df9,
++	0x0078, 0x2609, 0x8211, 0x0040, 0x2607, 0x1078, 0x1ce7, 0x1078,
++	0x2e09, 0x781b, 0x0069, 0x0078, 0x1d39, 0x1078, 0x2ffd, 0x7830,
++	0xa084, 0x00c0, 0x00c0, 0x2619, 0x0018, 0x2619, 0x791a, 0xa006,
++	0x007c, 0xa085, 0x0001, 0x007c, 0xa684, 0x0060, 0x00c0, 0x2626,
++	0x682f, 0x0000, 0x682b, 0x0000, 0x0078, 0x268b, 0xa684, 0x0800,
++	0x00c0, 0x2635, 0x68b0, 0xa084, 0x4800, 0xa635, 0xa684, 0x0800,
++	0x00c0, 0x2635, 0x1078, 0x314d, 0x007c, 0xa684, 0x0020, 0x0040,
++	0x265f, 0x78d0, 0x8003, 0x00c8, 0x2643, 0xa006, 0x1078, 0x3414,
++	0x78d4, 0x1078, 0x3479, 0xa684, 0x4000, 0x0040, 0x264d, 0x682f,
++	0x0000, 0x682b, 0x0000, 0x0078, 0x2632, 0x68b0, 0xa084, 0x4800,
++	0xa635, 0xa684, 0x4000, 0x00c0, 0x2647, 0x7038, 0xa005, 0x00c0,
++	0x2659, 0x79d8, 0x7adc, 0x692e, 0x6a2a, 0x0078, 0x2632, 0xa684,
++	0x4000, 0x0040, 0x2669, 0x682f, 0x0000, 0x682b, 0x0000, 0x0078,
++	0x2632, 0x68b0, 0xa084, 0x4800, 0xa635, 0xa684, 0x4000, 0x00c0,
++	0x2663, 0x7038, 0xa005, 0x00c0, 0x2675, 0x79d8, 0x7adc, 0x78d0,
++	0x80f3, 0x00c8, 0x267c, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291,
++	0x0000, 0x692e, 0x6a2a, 0x2100, 0xa205, 0x00c0, 0x2689, 0x0078,
++	0x2632, 0x1078, 0x3414, 0x007c, 0xa384, 0x0200, 0x0040, 0x2694,
++	0x6008, 0xa085, 0x0002, 0x600a, 0x6817, 0x0006, 0x6a28, 0x692c,
++	0x6a3a, 0x693e, 0x682b, 0x0300, 0x682f, 0x0000, 0x6833, 0x2000,
++	0x6893, 0x0000, 0x6897, 0x0020, 0x7000, 0x0079, 0x26a7, 0x26af,
++	0x26b1, 0x26ba, 0x26af, 0x26af, 0x26af, 0x26af, 0x26af, 0x1078,
++	0x1ce7, 0x681c, 0xa084, 0x0001, 0x00c0, 0x26ba, 0x1078, 0x2b06,
++	0x0078, 0x26c0, 0x7054, 0x2c50, 0x2060, 0x6800, 0x6002, 0x2a60,
++	0x2021, 0x3857, 0x2404, 0xa005, 0x0040, 0x26c9, 0x2020, 0x0078,
++	0x26c2, 0x2d22, 0x206b, 0x0000, 0x007c, 0x77b4, 0x1078, 0x2e16,
++	0xa7bc, 0x0f00, 0x1078, 0x2f11, 0x6018, 0xa005, 0x0040, 0x26fc,
++	0x0d7e, 0x2001, 0x5c10, 0x2068, 0x0d7f, 0x2021, 0x5c00, 0x2009,
++	0x0004, 0x2011, 0x0010, 0x1078, 0x216a, 0x0040, 0x26fc, 0x157e,
++	0x20a9, 0x0000, 0x2021, 0x5b00, 0x047e, 0x2009, 0x0004, 0x2011,
++	0x0010, 0x1078, 0x216a, 0x047f, 0x0040, 0x26fb, 0x8420, 0x0070,
++	0x26fb, 0x0078, 0x26ec, 0x157f, 0x8738, 0xa784, 0x001f, 0x00c0,
++	0x26d2, 0x0078, 0x1d41, 0x1078, 0x2b0d, 0x1078, 0x2b1e, 0x6827,
++	0x0000, 0x789b, 0x000e, 0x6f10, 0x1078, 0x344a, 0x017e, 0xad88,
++	0x0010, 0xa188, 0x0006, 0x2104, 0x017f, 0x8007, 0xa084, 0x00ff,
++	0xa082, 0x0047, 0x0040, 0x271e, 0x0078, 0x272f, 0x0c7e, 0x6810,
++	0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e0, 0x3a80,
++	0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x1078, 0x2f6b, 0x6813,
++	0x0002, 0xa684, 0x0800, 0x0040, 0x2739, 0x6918, 0xa18d, 0x2000,
++	0x691a, 0x6814, 0xa084, 0x8000, 0x0040, 0x2740, 0x6817, 0x0000,
++	0x2021, 0x3857, 0x6800, 0x2022, 0x6a38, 0x693c, 0x6a2a, 0x692e,
++	0x1078, 0x18b6, 0x0078, 0x1d41, 0x1078, 0x261c, 0x6827, 0x0000,
++	0x789b, 0x000e, 0x6f10, 0x1078, 0x3002, 0xa08c, 0x00ff, 0x6912,
++	0x6814, 0xa084, 0x8000, 0x0040, 0x275f, 0x7038, 0x6816, 0xa68c,
++	0xdf00, 0x691a, 0x70a3, 0x0000, 0x0078, 0x1d41, 0xa006, 0x1078,
++	0x314d, 0x6813, 0x0000, 0x6817, 0x0001, 0xa68c, 0xdf00, 0x691a,
++	0x6827, 0x0000, 0x7000, 0x0079, 0x2775, 0x277d, 0x277f, 0x277f,
++	0x2781, 0x2781, 0x2781, 0x277d, 0x277d, 0x1078, 0x1ce7, 0x1078,
++	0x2b1e, 0x6008, 0xa084, 0xffef, 0x600a, 0x0078, 0x2ad8, 0x2300,
++	0x0079, 0x278a, 0x278d, 0x278f, 0x27cd, 0x1078, 0x1ce7, 0x7000,
++	0x0079, 0x2792, 0x279a, 0x279c, 0x279c, 0x27a7, 0x279c, 0x27ae,
++	0x279a, 0x279a, 0x1078, 0x1ce7, 0xa684, 0x2000, 0x00c0, 0x27a7,
++	0xa6b5, 0x2000, 0x7e5a, 0x1078, 0x3376, 0x0078, 0x2fb6, 0x6814,
++	0xa084, 0x8000, 0x0040, 0x27ae, 0x6817, 0x0007, 0x2009, 0x3818,
++	0x210c, 0xa186, 0x0000, 0x0040, 0x27c3, 0xa186, 0x0001, 0x0040,
++	0x27c7, 0x2009, 0x382b, 0x200b, 0x000b, 0x70a3, 0x0001, 0x781b,
++	0x0046, 0x0078, 0x1d39, 0x781b, 0x00dd, 0x0078, 0x1d39, 0x2009,
++	0x382b, 0x200b, 0x000a, 0x0078, 0x1d39, 0x1078, 0x1ce7, 0x2300,
++	0x0079, 0x27d2, 0x27d5, 0x27d7, 0x27fa, 0x1078, 0x1ce7, 0x7000,
++	0x0079, 0x27da, 0x27e2, 0x27e4, 0x27e4, 0x27ef, 0x27e4, 0x27f6,
++	0x27e2, 0x27e2, 0x1078, 0x1ce7, 0xa684, 0x2000, 0x00c0, 0x27ef,
++	0xa6b5, 0x2000, 0x7e5a, 0x1078, 0x3376, 0x0078, 0x2fb6, 0x6814,
++	0xa084, 0x8000, 0x0040, 0x27f6, 0x6817, 0x0007, 0x781b, 0x00e4,
++	0x0078, 0x1d39, 0x681c, 0xa085, 0x0004, 0x681e, 0x1078, 0x2f6b,
++	0xa6b5, 0x0800, 0x1078, 0x2df9, 0x781b, 0x0069, 0x0078, 0x1d39,
++	0x2300, 0x0079, 0x280b, 0x280e, 0x2810, 0x2812, 0x1078, 0x1ce7,
++	0x1078, 0x1ce7, 0xa684, 0x0400, 0x00c0, 0x2831, 0x782b, 0x3009,
++	0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x79e4,
++	0xa184, 0x0020, 0x0040, 0x2829, 0x78ec, 0xa084, 0x0003, 0x00c0,
++	0x282d, 0x2001, 0x0014, 0x0078, 0x24e3, 0xa184, 0x0007, 0x0079,
++	0x2869, 0x7a90, 0xa294, 0x0007, 0x789b, 0x0060, 0x79a8, 0x81ff,
++	0x0040, 0x2867, 0x789b, 0x0010, 0x7ba8, 0xa384, 0x0001, 0x00c0,
++	0x2858, 0x7ba8, 0x7ba8, 0xa386, 0x0001, 0x00c0, 0x284b, 0x2009,
++	0xfff7, 0x0078, 0x2851, 0xa386, 0x0003, 0x00c0, 0x2858, 0x2009,
++	0xffef, 0x0c7e, 0x7048, 0x2060, 0x6004, 0xa104, 0x6006, 0x0c7f,
++	0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x782b,
++	0x3009, 0x691c, 0xa18c, 0xfdff, 0xa18c, 0xfeff, 0x691e, 0x0078,
++	0x2fb6, 0x21da, 0x21e0, 0x2873, 0x287b, 0x2871, 0x2871, 0x2871,
++	0x2fb6, 0x1078, 0x1ce7, 0x691c, 0xa18c, 0xfdff, 0xa18c, 0xfeff,
++	0x691e, 0x0078, 0x2fbe, 0x691c, 0xa18c, 0xfdff, 0xa18c, 0xfeff,
++	0x691e, 0x0078, 0x2fb6, 0x79e4, 0xa184, 0x0030, 0x0040, 0x288d,
++	0x78ec, 0xa084, 0x0003, 0x00c0, 0x2895, 0x6814, 0xa085, 0x8000,
++	0x6816, 0x2001, 0x0014, 0x0078, 0x24e3, 0xa184, 0x0007, 0x0079,
++	0x2899, 0x2fb6, 0x2fb6, 0x28a1, 0x2fb6, 0x2fde, 0x2fde, 0x2fb6,
++	0x2fb6, 0xa684, 0x0400, 0x00c0, 0x28d2, 0x681c, 0xa084, 0x0001,
++	0x0040, 0x2fbe, 0xa68c, 0x2060, 0xa18c, 0xfffb, 0x795a, 0x69b2,
++	0x789b, 0x0060, 0x78ab, 0x0000, 0x789b, 0x0061, 0x6814, 0xa085,
++	0x8000, 0x6816, 0x78aa, 0x157e, 0x137e, 0x147e, 0x20a1, 0x012c,
++	0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000a, 0x2098, 0x53a6,
++	0x147f, 0x137f, 0x157f, 0x6810, 0x8007, 0x789b, 0x007e, 0x78aa,
++	0x0078, 0x2fbe, 0x6814, 0xa084, 0x8000, 0x0040, 0x28d9, 0x6817,
++	0x0008, 0x781b, 0x00d8, 0x0078, 0x1d39, 0x2300, 0x0079, 0x28e0,
++	0x28e5, 0x2960, 0x28e3, 0x1078, 0x1ce7, 0x7000, 0xa084, 0x0007,
++	0x0079, 0x28ea, 0x28f2, 0x28f4, 0x2910, 0x28f2, 0x28f2, 0x26cd,
++	0x28f2, 0x28f2, 0x1078, 0x1ce7, 0x691c, 0xa18d, 0x0001, 0x691e,
++	0x6800, 0x6006, 0xa005, 0x00c0, 0x28fe, 0x6002, 0x6818, 0xa084,
++	0x000e, 0x0040, 0x290a, 0x7014, 0x68b6, 0x712c, 0xa188, 0x5b00,
++	0x0078, 0x290c, 0x2009, 0x5c00, 0x2104, 0x6802, 0x2d0a, 0x7156,
++	0x6eb2, 0xa684, 0x0060, 0x0040, 0x295e, 0xa684, 0x0800, 0x00c0,
++	0x2922, 0xa684, 0x7fff, 0x68b2, 0x6890, 0x6894, 0x1078, 0x314d,
++	0x0078, 0x295e, 0xa684, 0x0020, 0x0040, 0x2934, 0xa006, 0x1078,
++	0x3414, 0x78d0, 0x8003, 0x00c8, 0x2930, 0x78d4, 0x1078, 0x3479,
++	0x79d8, 0x7adc, 0x0078, 0x2938, 0x1078, 0x2f1e, 0x1078, 0x3414,
++	0xa684, 0x8000, 0x0040, 0x295e, 0xa684, 0x7fff, 0x68b2, 0x789b,
++	0x0074, 0x1078, 0x3002, 0x2010, 0x1078, 0x3002, 0x2008, 0xa684,
++	0x0020, 0x00c0, 0x2956, 0x1078, 0x3002, 0x801b, 0x00c8, 0x2951,
++	0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b94, 0x2100,
++	0xa302, 0x68ae, 0x6b90, 0x2200, 0xa303, 0x68aa, 0x0078, 0x1d41,
++	0x0078, 0x2de6, 0x7033, 0x0000, 0xa282, 0x0005, 0x0050, 0x296a,
++	0x1078, 0x1ce7, 0x2300, 0x0079, 0x296d, 0x2970, 0x297a, 0x299d,
++	0x2200, 0x0079, 0x2973, 0x2978, 0x2de6, 0x2978, 0x29c6, 0x2a17,
++	0x1078, 0x1ce7, 0x7000, 0xa086, 0x0001, 0x00c0, 0x2987, 0x1078,
++	0x2b1e, 0x1078, 0x314d, 0x7034, 0x600a, 0x0078, 0x298c, 0x7000,
++	0xa086, 0x0003, 0x0040, 0x2981, 0x7003, 0x0005, 0x2001, 0x5c10,
++	0x2068, 0x703e, 0x7032, 0x2200, 0x0079, 0x2996, 0x2de6, 0x299b,
++	0x29c6, 0x299b, 0x2de6, 0x1078, 0x1ce7, 0x7000, 0xa086, 0x0001,
++	0x00c0, 0x29aa, 0x1078, 0x2b1e, 0x1078, 0x314d, 0x7034, 0x600a,
++	0x0078, 0x29af, 0x7000, 0xa086, 0x0003, 0x0040, 0x29a4, 0x7003,
++	0x0005, 0x2001, 0x5c10, 0x2068, 0x703e, 0x7032, 0x2200, 0x0079,
++	0x29b9, 0x29c0, 0x29be, 0x29c0, 0x29be, 0x29c0, 0x1078, 0x1ce7,
++	0x1078, 0x2e09, 0x781b, 0x0069, 0x0078, 0x1d39, 0x7000, 0xa086,
++	0x0001, 0x00c0, 0x29d3, 0x1078, 0x2b1e, 0x1078, 0x314d, 0x7034,
++	0x600a, 0x0078, 0x29d8, 0x7000, 0xa086, 0x0003, 0x0040, 0x29cd,
++	0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8,
++	0xa484, 0x001f, 0xa215, 0x2069, 0x5c00, 0x2d04, 0x2d08, 0x7156,
++	0x2068, 0xa005, 0x0040, 0x29f3, 0x6810, 0xa206, 0x0040, 0x2a0c,
++	0x6800, 0x0078, 0x29e6, 0x7003, 0x0005, 0x2001, 0x5c10, 0x2068,
++	0x703e, 0x7032, 0x157e, 0x20a9, 0x002f, 0x2003, 0x0000, 0x8000,
++	0x0070, 0x2a04, 0x0078, 0x29fd, 0x157f, 0x6a12, 0x68b3, 0x0700,
++	0x681f, 0x0800, 0x6823, 0x0003, 0x6eb0, 0x7e5a, 0x681c, 0xa084,
++	0x0c00, 0x0040, 0x2a6d, 0x1078, 0x2e01, 0x0078, 0x2a6d, 0x7000,
++	0xa086, 0x0001, 0x00c0, 0x2a24, 0x1078, 0x2b1e, 0x1078, 0x314d,
++	0x7034, 0x600a, 0x0078, 0x2a29, 0x7000, 0xa086, 0x0003, 0x0040,
++	0x2a1e, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018,
++	0x7ca8, 0xa484, 0x001f, 0xa215, 0x79a8, 0x79a8, 0xa18c, 0x00ff,
++	0xa1e8, 0x5b00, 0x2d04, 0x2d08, 0x7156, 0x2068, 0xa005, 0x0040,
++	0x2a48, 0x6810, 0xa206, 0x0040, 0x2a61, 0x6800, 0x0078, 0x2a3b,
++	0x7003, 0x0005, 0x2001, 0x5c10, 0x2068, 0x703e, 0x7032, 0x157e,
++	0x20a9, 0x002f, 0x2003, 0x0000, 0x8000, 0x0070, 0x2a59, 0x0078,
++	0x2a52, 0x157f, 0x6a12, 0x68b3, 0x0700, 0x681f, 0x0800, 0x6823,
++	0x0003, 0x6eb0, 0x7e5a, 0x681c, 0xa084, 0x0c00, 0x0040, 0x2a6d,
++	0x1078, 0x2dfd, 0x7e58, 0x0078, 0x2a6d, 0x027e, 0x8207, 0xa084,
++	0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x3a80, 0x2060, 0x704a,
++	0x6000, 0x704e, 0x6004, 0x7052, 0xa684, 0x0060, 0x0040, 0x2aa4,
++	0x6b94, 0x6c90, 0x69a8, 0x68ac, 0xa105, 0x00c0, 0x2a92, 0x7bd2,
++	0x7bda, 0x7cd6, 0x7cde, 0xa6b4, 0xb7ff, 0x7e5a, 0x1078, 0x3376,
++	0x0078, 0x2aa4, 0x68ac, 0xa31a, 0x2100, 0xa423, 0x2400, 0xa305,
++	0x0040, 0x2aa4, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68ac, 0xa6b4,
++	0xbfff, 0x7e5a, 0x1078, 0x339d, 0x077f, 0x1078, 0x2f11, 0x2009,
++	0x006a, 0xa684, 0x0008, 0x0040, 0x2aaf, 0x2009, 0x0069, 0xa6b5,
++	0x2000, 0x7e5a, 0x791a, 0x2d00, 0x703e, 0x8207, 0xa084, 0x000f,
++	0x8003, 0x8003, 0x8003, 0xa080, 0x3a80, 0x2048, 0x0078, 0x1d39,
++	0x6020, 0xa005, 0x0040, 0x2acc, 0x8001, 0x6022, 0x6008, 0xa085,
++	0x0008, 0x600a, 0x7010, 0x6026, 0x007c, 0xa006, 0x1078, 0x314d,
++	0x6813, 0x0000, 0x6817, 0x0001, 0x681f, 0x0040, 0x681b, 0x0100,
++	0x7000, 0xa084, 0x0007, 0x0079, 0x2add, 0x2ae5, 0x2ae7, 0x2ae7,
++	0x2b02, 0x2aef, 0x2ae5, 0x2ae5, 0x2ae5, 0x1078, 0x1ce7, 0x1078,
++	0x2b0d, 0x1078, 0x2b06, 0x1078, 0x18b6, 0x0078, 0x1d41, 0x70a0,
++	0x70a3, 0x0000, 0x0079, 0x2af4, 0x2afe, 0x2afe, 0x2afc, 0x2afc,
++	0x2afc, 0x2afe, 0x2afc, 0x2afe, 0x0079, 0x20a6, 0x70a3, 0x0000,
++	0x0078, 0x1d41, 0x6817, 0x0000, 0x0078, 0x2703, 0x6800, 0xa005,
++	0x00c0, 0x2b0b, 0x6002, 0x6006, 0x007c, 0x1078, 0x2b27, 0x6010,
++	0xa005, 0x0040, 0x2b18, 0x8001, 0x00d0, 0x2b18, 0x1078, 0x1ce7,
++	0x6012, 0x6008, 0xa084, 0xffef, 0x600a, 0x007c, 0x1078, 0x2b34,
++	0x6018, 0xa005, 0x0040, 0x2b26, 0x8001, 0x601a, 0x007c, 0x017e,
++	0x007e, 0x2009, 0x382e, 0x2104, 0xa005, 0x0040, 0x2b31, 0x8001,
++	0x200a, 0x007f, 0x017f, 0x007c, 0x017e, 0x007e, 0x2009, 0x382f,
++	0x2104, 0xa005, 0x0040, 0x2b3e, 0x8001, 0x200a, 0x007f, 0x017f,
++	0x007c, 0x017e, 0x007e, 0x2009, 0x3830, 0x2104, 0x8000, 0x200a,
++	0x007f, 0x017f, 0x007c, 0x017e, 0x007e, 0x2009, 0x382f, 0x2104,
++	0x8000, 0x200a, 0x007f, 0x017f, 0x007c, 0x027e, 0x037e, 0x007e,
++	0x2009, 0x382e, 0x2114, 0x2019, 0x382f, 0x2304, 0xa202, 0x200a,
++	0x201b, 0x0000, 0x2009, 0x3830, 0x007f, 0x037f, 0x027f, 0x007c,
++	0x1078, 0x2ffd, 0x6817, 0x0018, 0x0078, 0x2b98, 0x1078, 0x2ffd,
++	0x6817, 0x0019, 0x0078, 0x2b98, 0x1078, 0x2ffd, 0x6817, 0x001a,
++	0x0078, 0x2b98, 0x77b4, 0x1078, 0x2f11, 0x71b8, 0xa18c, 0x00ff,
++	0xa1e8, 0x5b00, 0x2d04, 0x2d08, 0x2068, 0xa005, 0x00c0, 0x2b8a,
++	0x0078, 0x1d41, 0x6810, 0x72b4, 0xa206, 0x0040, 0x2b92, 0x6800,
++	0x0078, 0x2b83, 0x6800, 0x200a, 0x6817, 0x0005, 0x70bf, 0x0000,
++	0x1078, 0x2b0d, 0x681c, 0xa084, 0x0001, 0x00c0, 0x2ba1, 0x1078,
++	0x2b06, 0x1078, 0x2b1e, 0x681b, 0x0000, 0x681f, 0x0020, 0x1078,
++	0x18b6, 0x0078, 0x1d41, 0xa282, 0x0003, 0x00c0, 0x2dda, 0x7da8,
++	0xa5ac, 0x00ff, 0x7ea8, 0xa6b4, 0x00ff, 0x691c, 0xa18d, 0x0080,
++	0x691e, 0xa184, 0x0100, 0x0040, 0x2c0b, 0xa18c, 0xfeff, 0x691e,
++	0xa6b4, 0x00ff, 0x0040, 0x2bf5, 0xa682, 0x000f, 0x0048, 0x2bcc,
++	0x0040, 0x2bcc, 0x2031, 0x000f, 0x852b, 0x852b, 0x1078, 0x2e94,
++	0x0040, 0x2bd6, 0x1078, 0x2ca4, 0x0078, 0x2bfe, 0x1078, 0x2e4f,
++	0x0c7e, 0x2960, 0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x2cc8,
++	0x0c7f, 0x691c, 0xa18d, 0x0100, 0x691e, 0x7e58, 0xa6b5, 0x0004,
++	0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2bf1, 0x781b, 0x0055, 0x0078,
++	0x1d39, 0x781b, 0x0069, 0x0078, 0x1d39, 0x0c7e, 0x2960, 0x6004,
++	0xa084, 0xfff5, 0x6006, 0x1078, 0x2cc8, 0x0c7f, 0x7e58, 0xa684,
++	0x0400, 0x00c0, 0x2c07, 0x781b, 0x0058, 0x0078, 0x1d39, 0x781b,
++	0x006a, 0x0078, 0x1d39, 0x0c7e, 0x7048, 0x2060, 0x6100, 0xa18c,
++	0x1000, 0x0040, 0x2c4b, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282,
++	0x000f, 0x0048, 0x2c1f, 0x0040, 0x2c1f, 0x2011, 0x000f, 0x2600,
++	0xa202, 0x00c8, 0x2c24, 0x2230, 0x6208, 0xa294, 0x00ff, 0x7018,
++	0xa086, 0x0028, 0x00c0, 0x2c34, 0xa282, 0x0019, 0x00c8, 0x2c3a,
++	0x2011, 0x0019, 0x0078, 0x2c3a, 0xa282, 0x000c, 0x00c8, 0x2c3a,
++	0x2011, 0x000c, 0x2200, 0xa502, 0x00c8, 0x2c3f, 0x2228, 0x1078,
++	0x2e53, 0x852b, 0x852b, 0x1078, 0x2e94, 0x0040, 0x2c4b, 0x1078,
++	0x2ca4, 0x0078, 0x2c4f, 0x1078, 0x2e4f, 0x1078, 0x2cc8, 0x7858,
++	0xa085, 0x0004, 0x785a, 0x0c7f, 0x781b, 0x0069, 0x0078, 0x1d39,
++	0x0c7e, 0x2960, 0x6000, 0xa084, 0x1000, 0x00c0, 0x2c72, 0xa084,
++	0x0040, 0x00c0, 0x2c6c, 0xa18c, 0x0002, 0x00c0, 0x2c6c, 0xa18c,
++	0xfff5, 0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019, 0x0000,
++	0x0078, 0x2c94, 0x6208, 0xa294, 0x00ff, 0x7018, 0xa086, 0x0028,
++	0x00c0, 0x2c82, 0xa282, 0x0019, 0x00c8, 0x2c88, 0x2011, 0x0019,
++	0x0078, 0x2c88, 0xa282, 0x000c, 0x00c8, 0x2c88, 0x2011, 0x000c,
++	0x6308, 0x831f, 0xa39c, 0x00ff, 0xa382, 0x000f, 0x0048, 0x2c94,
++	0x0040, 0x2c94, 0x2019, 0x000f, 0x78ab, 0x0001, 0x78ab, 0x0003,
++	0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x681c, 0xa085,
++	0x0100, 0x681e, 0x0c7f, 0x007c, 0x0c7e, 0x7148, 0x2160, 0x2008,
++	0xa084, 0xfff0, 0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae, 0x6612,
++	0x78a4, 0xa084, 0xfff8, 0xa18c, 0x0007, 0xa105, 0x78a6, 0x6016,
++	0x788a, 0xa6b4, 0x000f, 0x8637, 0x8204, 0x8004, 0xa084, 0x00ff,
++	0xa605, 0x600e, 0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x007c,
++	0x0c7e, 0x7048, 0x2060, 0x6018, 0x789a, 0x78a4, 0xa084, 0xfff0,
++	0x78a6, 0x6012, 0x7884, 0xa084, 0xfff0, 0x7886, 0x0c7f, 0x007c,
++	0xa282, 0x0002, 0x00c0, 0x2dda, 0x7aa8, 0x691c, 0xa18d, 0x0080,
++	0x691e, 0xa184, 0x0200, 0x0040, 0x2d1d, 0xa18c, 0xfdff, 0x691e,
++	0xa294, 0x00ff, 0xa282, 0x0002, 0x00c8, 0x2dda, 0x1078, 0x2d63,
++	0x1078, 0x2cc8, 0xa980, 0x0001, 0x200c, 0x1078, 0x2f0d, 0x1078,
++	0x2c58, 0x88ff, 0x0040, 0x2d10, 0x789b, 0x0060, 0x2800, 0x78aa,
++	0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2d0c,
++	0x781b, 0x0055, 0x0078, 0x1d39, 0x781b, 0x0069, 0x0078, 0x1d39,
++	0x7e58, 0xa684, 0x0400, 0x00c0, 0x2d19, 0x781b, 0x0058, 0x0078,
++	0x1d39, 0x781b, 0x006a, 0x0078, 0x1d39, 0xa282, 0x0002, 0x00c8,
++	0x2d25, 0xa284, 0x0001, 0x0040, 0x2d2f, 0x7148, 0xa188, 0x0000,
++	0x210c, 0xa18c, 0x2000, 0x00c0, 0x2d2f, 0x2011, 0x0000, 0x1078,
++	0x2e41, 0x1078, 0x2d63, 0x1078, 0x2cc8, 0x7858, 0xa085, 0x0004,
++	0x785a, 0x781b, 0x0069, 0x0078, 0x1d39, 0x0c7e, 0x027e, 0x2960,
++	0x6000, 0x2011, 0x0001, 0xa084, 0x2000, 0x00c0, 0x2d53, 0xa084,
++	0x0080, 0x00c0, 0x2d51, 0xa18c, 0xffef, 0x6106, 0xa006, 0x0078,
++	0x2d60, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab,
++	0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x681c, 0xa085, 0x0200, 0x681e,
++	0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x7048, 0x2060, 0x82ff, 0x0040,
++	0x2d6b, 0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a, 0x78a4,
++	0xa084, 0xffbf, 0xa205, 0x78a6, 0x6016, 0x788a, 0x6004, 0xa084,
++	0xffef, 0x6006, 0x0c7f, 0x007c, 0x007e, 0x7000, 0xa086, 0x0003,
++	0x0040, 0x2d85, 0x007f, 0x0078, 0x2d88, 0x007f, 0x0078, 0x2dd6,
++	0xa684, 0x0020, 0x0040, 0x2dd6, 0x7888, 0xa084, 0x0040, 0x0040,
++	0x2dd6, 0x78a8, 0x8001, 0x0040, 0x2d95, 0x7bb8, 0xa384, 0x003f,
++	0x831b, 0x00c8, 0x2d9c, 0x8000, 0xa005, 0x0040, 0x2dbd, 0x831b,
++	0x00c8, 0x2da5, 0x8001, 0x0040, 0x2dd2, 0xa006, 0x1078, 0x3414,
++	0x78b4, 0x1078, 0x3479, 0x0078, 0x2dd6, 0xa684, 0x4000, 0x0040,
++	0x2dbd, 0x78b8, 0x801b, 0x00c8, 0x2db6, 0x8000, 0xa084, 0x003f,
++	0x00c0, 0x2dd2, 0xa6b4, 0xbfff, 0x7e5a, 0x79d8, 0x7adc, 0x2001,
++	0x0001, 0xa108, 0x00c8, 0x2dc6, 0xa291, 0x0000, 0x79d2, 0x79da,
++	0x7ad6, 0x7ade, 0x1078, 0x3414, 0x781b, 0x0067, 0x1078, 0x32e4,
++	0x0078, 0x1d39, 0x781b, 0x0067, 0x0078, 0x1d39, 0x781b, 0x006a,
++	0x0078, 0x1d39, 0x1078, 0x2e0d, 0x781b, 0x0069, 0x0078, 0x1d39,
++	0x1078, 0x2df9, 0x781b, 0x0069, 0x0078, 0x1d39, 0x6823, 0x0002,
++	0x1078, 0x2e01, 0x691c, 0xa18d, 0x0020, 0x691e, 0x6814, 0xa084,
++	0x8000, 0x0040, 0x2df5, 0x6817, 0x0005, 0x781b, 0x0069, 0x0078,
++	0x1d39, 0x2001, 0x0005, 0x0078, 0x2e0f, 0x2001, 0x000c, 0x0078,
++	0x2e0f, 0x2001, 0x0006, 0x0078, 0x2e0f, 0x2001, 0x000d, 0x0078,
++	0x2e0f, 0x2001, 0x0009, 0x0078, 0x2e0f, 0x2001, 0x0007, 0x789b,
++	0x007f, 0x78aa, 0xa6b5, 0x0008, 0x7e5a, 0x007c, 0x077e, 0x873f,
++	0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0xa0e0, 0x3a80, 0xa7b8,
++	0x0020, 0x7f9a, 0x79a4, 0xa184, 0x000f, 0x0040, 0x2e2f, 0xa184,
++	0xfff0, 0x78a6, 0x6012, 0x6004, 0xa085, 0x0008, 0x6006, 0x8738,
++	0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040, 0x0040, 0x2e3f, 0xa184,
++	0xffbf, 0x78a6, 0x6016, 0x6004, 0xa085, 0x0010, 0x6006, 0x077f,
++	0x007c, 0x789b, 0x0010, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab,
++	0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab, 0x0004, 0x007c, 0x2031,
++	0x0000, 0x2029, 0x0032, 0x789b, 0x0010, 0x78ab, 0x0001, 0x78ab,
++	0x0003, 0x78ab, 0x0001, 0x7daa, 0x7eaa, 0x789b, 0x0060, 0x78ab,
++	0x0005, 0x007c, 0x157e, 0x8007, 0xa084, 0x00ff, 0x8003, 0x8003,
++	0xa080, 0x0020, 0x789a, 0x79a4, 0xa18c, 0xfff0, 0x2001, 0x3846,
++	0x2004, 0xa082, 0x0028, 0x0040, 0x2e7d, 0x2021, 0x2ef4, 0x2019,
++	0x0014, 0x20a9, 0x000c, 0x0078, 0x2e83, 0x2021, 0x2f00, 0x2019,
++	0x0019, 0x20a9, 0x000d, 0x2011, 0x0064, 0x2404, 0xa084, 0xfff0,
++	0xa106, 0x0040, 0x2e92, 0x8420, 0x2300, 0xa210, 0x0070, 0x2e92,
++	0x0078, 0x2e85, 0x157f, 0x007c, 0x157e, 0x2011, 0x3846, 0x2214,
++	0xa282, 0x0032, 0x0048, 0x2ea8, 0x0040, 0x2eac, 0x2021, 0x2ee6,
++	0x2019, 0x0011, 0x20a9, 0x000e, 0x2011, 0x0032, 0x0078, 0x2ebc,
++	0xa282, 0x0028, 0x0040, 0x2eb4, 0x2021, 0x2ef4, 0x2019, 0x0014,
++	0x20a9, 0x000c, 0x0078, 0x2eba, 0x2021, 0x2f00, 0x2019, 0x0019,
++	0x20a9, 0x000d, 0x2011, 0x0064, 0x2200, 0xa502, 0x0040, 0x2ecc,
++	0x0048, 0x2ecc, 0x8420, 0x2300, 0xa210, 0x0070, 0x2ec9, 0x0078,
++	0x2ebc, 0x157f, 0xa006, 0x007c, 0x157f, 0xa582, 0x0064, 0x00c8,
++	0x2ed5, 0x7808, 0xa085, 0x0070, 0x780a, 0x78ec, 0xa084, 0x0300,
++	0x0040, 0x2ee3, 0x2404, 0xa09e, 0x1201, 0x00c0, 0x2ee3, 0x2001,
++	0x2101, 0x0078, 0x2ee4, 0x2404, 0xa005, 0x007c, 0x1201, 0x3002,
++	0x3202, 0x4203, 0x4403, 0x5404, 0x5604, 0x6605, 0x6805, 0x7806,
++	0x7a06, 0x0a07, 0x0c07, 0x0e07, 0x3202, 0x4202, 0x5202, 0x6202,
++	0x7202, 0x6605, 0x7605, 0x7805, 0x7a05, 0x7c05, 0x7e05, 0x7f05,
++	0x2202, 0x3202, 0x4202, 0x5202, 0x5404, 0x6404, 0x7404, 0x7604,
++	0x7804, 0x7a04, 0x7c04, 0x7e04, 0x7f04, 0x789b, 0x0010, 0xa046,
++	0x007c, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003,
++	0x8003, 0x8003, 0xa105, 0xa0e0, 0x3b00, 0x007c, 0x79d8, 0x7adc,
++	0x78d0, 0x801b, 0x00c8, 0x2f25, 0x8000, 0xa084, 0x003f, 0xa108,
++	0xa291, 0x0000, 0x007c, 0x0f7e, 0x2079, 0x0100, 0x2009, 0x3840,
++	0x2091, 0x8000, 0x2104, 0x0079, 0x2f35, 0x2f67, 0x2f3f, 0x2f3f,
++	0x2f3f, 0x2f3f, 0x2f3f, 0x2f3d, 0x2f3d, 0x1078, 0x1ce7, 0x784b,
++	0x0004, 0x7848, 0xa084, 0x0004, 0x00c0, 0x2f41, 0x784b, 0x0008,
++	0x7848, 0xa084, 0x0008, 0x00c0, 0x2f48, 0x68b0, 0xa085, 0x4000,
++	0x68b2, 0x7858, 0xa085, 0x4000, 0x785a, 0x7830, 0xa084, 0x0080,
++	0x00c0, 0x2f67, 0x0018, 0x2f67, 0x6818, 0xa084, 0x0020, 0x00c0,
++	0x2f65, 0x781b, 0x00dd, 0x0078, 0x2f67, 0x781b, 0x00e4, 0x2091,
++	0x8001, 0x0f7f, 0x007c, 0x0c7e, 0x6810, 0x8007, 0xa084, 0x000f,
++	0x8003, 0x8003, 0x8003, 0xa0e0, 0x3a80, 0x6004, 0xa084, 0x000a,
++	0x00c0, 0x2fb4, 0x6108, 0xa194, 0xff00, 0x0040, 0x2fb4, 0xa18c,
++	0x00ff, 0x6004, 0xa084, 0x0014, 0x00c0, 0x2f9d, 0xa085, 0x0014,
++	0x6006, 0x017e, 0x691c, 0xa18d, 0x0002, 0x691e, 0x017f, 0x2001,
++	0x000c, 0xa106, 0x0040, 0x2f99, 0x2100, 0x8003, 0x2008, 0x0078,
++	0x2fad, 0x2009, 0x0019, 0x0078, 0x2fad, 0x2011, 0x0000, 0x6000,
++	0xa084, 0xdfff, 0x6002, 0x6004, 0xa084, 0xffef, 0x6006, 0x017e,
++	0x691c, 0xa18d, 0x0002, 0x691e, 0x017f, 0x2100, 0xa205, 0x600a,
++	0x6004, 0xa085, 0x000a, 0x6006, 0x0c7f, 0x007c, 0x781b, 0x006a,
++	0x0078, 0x1d39, 0x781b, 0x0069, 0x0078, 0x1d39, 0x781b, 0x0058,
++	0x0078, 0x1d39, 0x781b, 0x0055, 0x0078, 0x1d39, 0x781b, 0x00dd,
++	0x0078, 0x1d39, 0x781b, 0x00dc, 0x0078, 0x1d39, 0x781b, 0x00e4,
++	0x0078, 0x1d39, 0x781b, 0x00e3, 0x0078, 0x1d39, 0x781b, 0x009e,
++	0x0078, 0x1d39, 0x781b, 0x009d, 0x0078, 0x1d39, 0x70a3, 0x0001,
++	0x781b, 0x0046, 0x0078, 0x1d39, 0x007e, 0x7830, 0xa084, 0x00c0,
++	0x00c0, 0x2ffb, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0005, 0x0005,
++	0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, 0x2ffb, 0x7808,
++	0xa085, 0x0002, 0x780a, 0x007f, 0x007c, 0x7808, 0xa085, 0x0002,
++	0x780a, 0x007c, 0x7830, 0xa084, 0x0040, 0x00c0, 0x3002, 0x0098,
++	0x300b, 0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0005,
++	0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, 0x301a,
++	0x0098, 0x3018, 0x78ac, 0x007e, 0x7808, 0xa085, 0x0002, 0x780a,
++	0x007f, 0x007c, 0xa784, 0x0070, 0x0040, 0x302e, 0x0c7e, 0x2d60,
++	0x2f68, 0x1078, 0x1c97, 0x2d78, 0x2c68, 0x0c7f, 0x6817, 0x0003,
++	0x7858, 0xa084, 0x3f00, 0x681a, 0x682f, 0x0000, 0x682b, 0x0000,
++	0x784b, 0x0008, 0x78e4, 0xa005, 0x00d0, 0x21cc, 0xa084, 0x0020,
++	0x0040, 0x21cc, 0x78ec, 0xa084, 0x0003, 0x0040, 0x21cc, 0x0018,
++	0x21cc, 0x0078, 0x2de0, 0x0c7e, 0x6810, 0x8007, 0xa084, 0x000f,
++	0x8003, 0x8003, 0x8003, 0xa080, 0x3a80, 0x2060, 0x2048, 0x704a,
++	0x6000, 0x704e, 0x6004, 0x7052, 0x0c7f, 0x007c, 0x0020, 0x0020,
++	0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++	0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++	0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++	0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++	0x0062, 0x0009, 0x0014, 0x0014, 0x9847, 0x0014, 0x0014, 0x98f5,
++	0x98e7, 0x0014, 0x0014, 0x0080, 0x00bf, 0x0100, 0x0402, 0x2008,
++	0xf880, 0xa20a, 0x0014, 0x300b, 0xa20c, 0x0014, 0xa200, 0x8838,
++	0x817e, 0x842a, 0x84a0, 0x3806, 0x8839, 0x28c2, 0x9cc3, 0xa805,
++	0x0864, 0xa83b, 0x3008, 0x28c1, 0x9cc3, 0xa201, 0x300c, 0x2847,
++	0x8161, 0x846a, 0x8000, 0x84a4, 0x1856, 0x883a, 0xa808, 0x28e2,
++	0x9ca0, 0xa8f3, 0x0864, 0xa829, 0x300c, 0xa801, 0x3008, 0x28e1,
++	0x9ca0, 0x280d, 0xa204, 0x64c0, 0x67a0, 0x6fc0, 0x1814, 0x883b,
++	0x7023, 0x8576, 0x8677, 0xa80f, 0x786e, 0x883e, 0xa80c, 0x282b,
++	0xa205, 0x64a0, 0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7023, 0x8576,
++	0x8677, 0xa801, 0x883e, 0x2069, 0x28c1, 0x9cc3, 0x2044, 0x2103,
++	0x20a2, 0x2081, 0xa8dc, 0xa207, 0x0014, 0xa203, 0x8000, 0x84a8,
++	0x85a4, 0x1872, 0x849a, 0x883c, 0x1fe2, 0xf601, 0xa208, 0x856e,
++	0x866f, 0x0704, 0x3008, 0x9ca0, 0x0014, 0xa202, 0x8000, 0x85a4,
++	0x3009, 0x84a8, 0x19e2, 0xf848, 0x8174, 0x86eb, 0x85eb, 0x872e,
++	0x87a9, 0x883f, 0x08e6, 0xa8f1, 0xf861, 0xa8e8, 0xf801, 0x0014,
++	0xf881, 0x0016, 0x85b2, 0x80f0, 0x9532, 0xfaa2, 0x1de2, 0x0014,
++	0x8532, 0xf221, 0x0014, 0x1de2, 0x84a8, 0xd6e0, 0x1fe6, 0x0014,
++	0xa206, 0x6865, 0x817f, 0x842a, 0x1dc1, 0x8823, 0x0016, 0x6042,
++	0x8008, 0xa8fa, 0x8000, 0x84a4, 0x8160, 0x842a, 0xf021, 0x3008,
++	0x84a8, 0x1dc6, 0x20d7, 0x8822, 0x0016, 0x8000, 0x2848, 0x1011,
++	0xa8fc, 0x3008, 0x8000, 0xa000, 0x2802, 0x1011, 0xa8fd, 0xa887,
++	0x3008, 0x283d, 0x1011, 0xa8fd, 0xa209, 0x0017, 0x300c, 0x8000,
++	0x85a4, 0x1de2, 0xdac1, 0x0014, 0x26e0, 0x873a, 0xfaa2, 0x19f2,
++	0x1fe2, 0x0014, 0xa20b, 0x0014, 0xa20d, 0x817e, 0x842a, 0x84a0,
++	0x3806, 0x0210, 0x9ccd, 0x0704, 0x0000, 0x127e, 0x2091, 0x2200,
++	0x2049, 0x314d, 0x7000, 0x7204, 0xa205, 0x720c, 0xa215, 0x7008,
++	0xa084, 0xfffd, 0xa205, 0x0040, 0x315f, 0x0078, 0x3164, 0x7003,
++	0x0000, 0x127f, 0x2000, 0x007c, 0x7000, 0xa084, 0x0001, 0x00c0,
++	0x3192, 0x7108, 0x8104, 0x00c8, 0x3171, 0x1078, 0x322e, 0x0078,
++	0x3169, 0x700c, 0xa08c, 0x007f, 0x0040, 0x3192, 0x7004, 0x8004,
++	0x00c8, 0x3189, 0x7014, 0xa005, 0x00c0, 0x3185, 0x7010, 0xa005,
++	0x0040, 0x3189, 0xa102, 0x00c8, 0x3169, 0x7007, 0x0010, 0x0078,
++	0x3192, 0x8aff, 0x0040, 0x3192, 0x1078, 0x33eb, 0x00c0, 0x318c,
++	0x0040, 0x3169, 0x1078, 0x31dc, 0x7003, 0x0000, 0x127f, 0x2000,
++	0x007c, 0x6424, 0x84ff, 0x0040, 0x31b6, 0x2c70, 0x2039, 0x31bb,
++	0x2704, 0xae68, 0x680c, 0xa630, 0x6808, 0xa529, 0x8421, 0x0040,
++	0x31b6, 0x8738, 0x2704, 0xa005, 0x00c0, 0x31a1, 0x7098, 0xa075,
++	0x0040, 0x31b6, 0x2039, 0x31b8, 0x0078, 0x31a0, 0x007c, 0x0000,
++	0x0004, 0x0008, 0x000c, 0x0010, 0x0014, 0x0018, 0x001c, 0x0000,
++	0x127e, 0x2091, 0x2200, 0x2079, 0x3800, 0x2071, 0x0010, 0x7007,
++	0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2071, 0x0020, 0x7007,
++	0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2049, 0x0000, 0x78b7,
++	0x0000, 0x127f, 0x2000, 0x007c, 0x2049, 0x31dc, 0x7004, 0x8004,
++	0x00c8, 0x3208, 0x7007, 0x0012, 0x7108, 0x7008, 0xa106, 0x00c0,
++	0x31e4, 0xa184, 0x0030, 0x0040, 0x31f1, 0xa086, 0x0030, 0x00c0,
++	0x31e4, 0x7000, 0xa084, 0x0001, 0x00c0, 0x3208, 0x7008, 0xa084,
++	0x000c, 0x00c0, 0x3206, 0x710c, 0xa184, 0x0300, 0x00c0, 0x3206,
++	0xa184, 0x007f, 0x00c0, 0x31dc, 0x0078, 0x3208, 0x6817, 0x0003,
++	0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xa084, 0x0008, 0x00c0,
++	0x320c, 0x7007, 0x0012, 0x7108, 0x8104, 0x0048, 0x3211, 0x78b7,
++	0x0000, 0x7003, 0x0000, 0x2049, 0x0000, 0x007c, 0x107e, 0x007e,
++	0x127e, 0x157e, 0x2091, 0x2200, 0x7108, 0x1078, 0x322e, 0x157f,
++	0x127f, 0x2091, 0x8001, 0x007f, 0x107f, 0x007c, 0x7204, 0x2118,
++	0x7108, 0x700c, 0xa084, 0x0300, 0x00c0, 0x3270, 0xa184, 0x000c,
++	0x00c0, 0x3270, 0x8213, 0x8213, 0x8213, 0x8213, 0xa284, 0x0100,
++	0xa10d, 0x810b, 0x810b, 0x810f, 0xa184, 0x0007, 0x0079, 0x3248,
++	0x3252, 0x3262, 0x3270, 0x3262, 0x3284, 0x3284, 0x3270, 0x3282,
++	0x1078, 0x1ce7, 0x7007, 0x0002, 0x8aff, 0x00c0, 0x325b, 0x2049,
++	0x0000, 0x0078, 0x325f, 0x1078, 0x33eb, 0x00c0, 0x325b, 0x78b7,
++	0x0000, 0x007c, 0x7007, 0x0002, 0x8aff, 0x00c0, 0x3269, 0x0078,
++	0x326d, 0x1078, 0x33eb, 0x00c0, 0x3269, 0x78b7, 0x0000, 0x007c,
++	0x7007, 0x0002, 0x1078, 0x31dc, 0x1078, 0x2f2b, 0x6814, 0xa084,
++	0x8000, 0x0040, 0x327d, 0x6817, 0x0002, 0x007c, 0x1078, 0x1ce7,
++	0x1078, 0x1ce7, 0x1078, 0x32d6, 0x7210, 0x7114, 0x700c, 0xa09c,
++	0x007f, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000, 0x78b4, 0xa005,
++	0x0040, 0x3296, 0x78b7, 0x0000, 0x0078, 0x32b9, 0x1078, 0x32d6,
++	0x2704, 0x2c58, 0xac60, 0x630c, 0x2200, 0xa322, 0x6308, 0x2100,
++	0xa31b, 0x2400, 0xa305, 0x0040, 0x32af, 0x00c8, 0x32af, 0x8412,
++	0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078, 0x3296, 0x2b60,
++	0x8a07, 0xa7ba, 0x31b8, 0xa73d, 0x2c00, 0x6882, 0x6f86, 0x6c8e,
++	0x6b8a, 0x7007, 0x0012, 0x1078, 0x31dc, 0x007c, 0x8738, 0x2704,
++	0xa005, 0x00c0, 0x32ca, 0x6098, 0xa005, 0x0040, 0x32d3, 0x2060,
++	0x2039, 0x31b8, 0x8a51, 0x0040, 0x32d2, 0x7008, 0xa084, 0x00c0,
++	0xa086, 0x00c0, 0x007c, 0x2051, 0x0000, 0x007c, 0x8a50, 0x8739,
++	0x2704, 0xa004, 0x00c0, 0x32e3, 0x2039, 0x31be, 0x6000, 0xa064,
++	0x00c0, 0x32e3, 0x2d60, 0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200,
++	0x0d7f, 0x6880, 0x2060, 0x6884, 0x6b88, 0x6c8c, 0x8057, 0xaad4,
++	0x00ff, 0xa084, 0x00ff, 0xa0b8, 0x31b8, 0x7e08, 0xa6b5, 0x000c,
++	0x6818, 0xa084, 0x0040, 0x0040, 0x32ff, 0xa6b5, 0x0001, 0x0f7e,
++	0x2079, 0x0100, 0x7858, 0x0f7f, 0xa084, 0x0040, 0x0040, 0x330e,
++	0xa684, 0x0001, 0x00c0, 0x330e, 0xa6b5, 0x0001, 0x7007, 0x0004,
++	0x7004, 0xa084, 0x0004, 0x00c0, 0x3310, 0x7000, 0xa005, 0x0040,
++	0x331b, 0x1078, 0x1ce7, 0x2400, 0xa305, 0x00c0, 0x3321, 0x0078,
++	0x335e, 0x2c58, 0x2704, 0xac60, 0x6004, 0xa400, 0x007e, 0x701a,
++	0x6000, 0xa301, 0x701e, 0x2009, 0x04fd, 0x2104, 0xa086, 0x04fd,
++	0x007f, 0x00c0, 0x334e, 0xa084, 0x0001, 0x0040, 0x334e, 0xa684,
++	0x0001, 0x00c0, 0x334e, 0x7013, 0x0001, 0x7017, 0x0000, 0x7602,
++	0x7007, 0x0001, 0x78b7, 0x0001, 0xa4a0, 0x0001, 0xa399, 0x0000,
++	0x6004, 0xa400, 0x701a, 0x6000, 0xa301, 0x701e, 0x620c, 0x2400,
++	0xa202, 0x7012, 0x6208, 0x2300, 0xa203, 0x7016, 0x7602, 0x7007,
++	0x0001, 0x2b60, 0x1078, 0x32be, 0x0078, 0x3360, 0x1078, 0x33eb,
++	0x00c0, 0x335e, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091,
++	0x2200, 0x0d7f, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
++	0x336c, 0x7003, 0x0008, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e,
++	0x2091, 0x2200, 0x0d7f, 0x2049, 0x3376, 0x7007, 0x0004, 0x7004,
++	0xa084, 0x0004, 0x00c0, 0x337f, 0x7e08, 0xa6b5, 0x000c, 0x6818,
++	0xa084, 0x0040, 0x0040, 0x338e, 0xa6b5, 0x0001, 0x6824, 0xa005,
++	0x0040, 0x339a, 0x2050, 0x2039, 0x31bb, 0x2d60, 0x1078, 0x33eb,
++	0x00c0, 0x3396, 0x127f, 0x2000, 0x007c, 0x127e, 0x007e, 0x017e,
++	0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x037f, 0x047f, 0x7e08, 0xa6b5,
++	0x000c, 0x6818, 0xa084, 0x0040, 0x0040, 0x33b0, 0xa6b5, 0x0001,
++	0x2049, 0x339d, 0x6824, 0xa055, 0x0040, 0x33e8, 0x2d70, 0x2e60,
++	0x2039, 0x31bb, 0x2704, 0xae68, 0x680c, 0xa422, 0x6808, 0xa31b,
++	0x0048, 0x33d5, 0x8a51, 0x00c0, 0x33c7, 0x1078, 0x1ce7, 0x8738,
++	0x2704, 0xa005, 0x00c0, 0x33bb, 0x7098, 0xa075, 0x2060, 0x0040,
++	0x33e8, 0x2039, 0x31b8, 0x0078, 0x33ba, 0x8422, 0x8420, 0x831a,
++	0xa399, 0x0000, 0x690c, 0x2400, 0xa122, 0x6908, 0x2300, 0xa11b,
++	0x00c8, 0x33e4, 0x1078, 0x1ce7, 0x2071, 0x0020, 0x0078, 0x330e,
++	0x127f, 0x2000, 0x007c, 0x7008, 0xa084, 0x00c0, 0xa086, 0x00c0,
++	0x0040, 0x3413, 0x2704, 0xac08, 0x2104, 0x701e, 0x8108, 0x2104,
++	0x701a, 0x8108, 0x2104, 0x7016, 0x8108, 0x2104, 0x7012, 0x0f7e,
++	0x2079, 0x0100, 0x7858, 0x0f7f, 0xa084, 0x0040, 0x0040, 0x340e,
++	0xa684, 0x0001, 0x00c0, 0x340e, 0xa6b5, 0x0001, 0x7602, 0x7007,
++	0x0001, 0x1078, 0x32be, 0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091,
++	0x2200, 0x2049, 0x3414, 0x0d7f, 0x087f, 0x7108, 0xa184, 0x00c0,
++	0x00c0, 0x342a, 0x6824, 0xa005, 0x0040, 0x343a, 0x0078, 0x3164,
++	0x0078, 0x343a, 0x7108, 0x8104, 0x00c8, 0x3432, 0x1078, 0x322e,
++	0x0078, 0x341d, 0x7007, 0x0010, 0x7108, 0x8104, 0x00c8, 0x3434,
++	0x1078, 0x322e, 0x7008, 0xa086, 0x0002, 0x00c0, 0x341d, 0x7000,
++	0xa005, 0x00c0, 0x341d, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f,
++	0x2000, 0x007c, 0x127e, 0x147e, 0x137e, 0x157e, 0x0d7e, 0x2091,
++	0x2200, 0x0d7f, 0x2049, 0x344a, 0xad80, 0x0010, 0x20a0, 0x2099,
++	0x0031, 0x700c, 0xa084, 0x007f, 0x6826, 0x7007, 0x0008, 0x7007,
++	0x0002, 0x7003, 0x0001, 0x0040, 0x3468, 0x8000, 0x80ac, 0x53a5,
++	0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x346a, 0x2049,
++	0x0000, 0x7003, 0x0000, 0x157f, 0x137f, 0x147f, 0x127f, 0x2000,
++	0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x2049,
++	0x3479, 0x6880, 0x2060, 0x6884, 0x6b88, 0x6c8c, 0x8057, 0xaad4,
++	0x00ff, 0xa084, 0x00ff, 0xa0b8, 0x31b8, 0x7e08, 0xa6b5, 0x0004,
++	0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x3492, 0x2c58,
++	0x2704, 0xac60, 0x6004, 0xa400, 0x701a, 0x6000, 0xa301, 0x701e,
++	0x7013, 0x0001, 0x7017, 0x0000, 0x7602, 0x7007, 0x0001, 0x007f,
++	0x8007, 0x2009, 0x0031, 0x200a, 0x00a0, 0x34ac, 0x7108, 0x7007,
++	0x0002, 0x810c, 0x00c8, 0x34ac, 0x810c, 0x0048, 0x34b9, 0x0078,
++	0x3270, 0xa4a0, 0x0001, 0xa399, 0x0000, 0x6b8a, 0x6c8e, 0x7007,
++	0x0004, 0x2049, 0x0000, 0x7003, 0x0000, 0x127f, 0x2000, 0x007c,
++	0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, 0x00c8, 0x34d1,
++	0xa200, 0x00f0, 0x34cc, 0x8086, 0x818e, 0x007c, 0x157e, 0x20a9,
++	0x0010, 0xa005, 0x0040, 0x34f7, 0xa11a, 0x00c8, 0x34f7, 0x8213,
++	0x818d, 0x0048, 0x34ea, 0xa11a, 0x00c8, 0x34eb, 0x00f0, 0x34df,
++	0x0078, 0x34ef, 0xa11a, 0x2308, 0x8210, 0x00f0, 0x34df, 0x007e,
++	0x3200, 0xa084, 0xf7ff, 0x2080, 0x007f, 0x157f, 0x007c, 0x007e,
++	0x3200, 0xa085, 0x0800, 0x0078, 0x34f3, 0x00e0, 0x3563, 0x2091,
++	0x6000, 0x7820, 0x8001, 0x7822, 0x00c0, 0x355b, 0x7824, 0x7822,
++	0x2009, 0x3834, 0x2104, 0xa005, 0x00c0, 0x3510, 0x2001, 0x0010,
++	0x8001, 0x200a, 0x077e, 0x803f, 0x1078, 0x2f11, 0x077f, 0x20a9,
++	0x0020, 0x601f, 0x0064, 0xace0, 0x0010, 0x00f0, 0x3519, 0x2091,
++	0x8000, 0x2069, 0x3840, 0x6800, 0xa084, 0x0007, 0x0040, 0x3538,
++	0xa086, 0x0002, 0x0040, 0x3538, 0x6830, 0xa00d, 0x0040, 0x3538,
++	0x2104, 0xa005, 0x0040, 0x3538, 0x8001, 0x200a, 0x0040, 0x3640,
++	0x2061, 0x3b00, 0x2009, 0x0002, 0x20a9, 0x0100, 0x603c, 0xa005,
++	0x0040, 0x354e, 0x8001, 0x603e, 0x00c0, 0x354e, 0x6010, 0xa005,
++	0x0040, 0x354e, 0x017e, 0x1078, 0x1b49, 0x017f, 0xace0, 0x0010,
++	0x0070, 0x3554, 0x0078, 0x353e, 0x8109, 0x0040, 0x355b, 0x20a9,
++	0x0100, 0x0078, 0x353e, 0x1078, 0x3578, 0x1078, 0x3566, 0x1078,
++	0x359d, 0x1078, 0x3707, 0x2091, 0x8001, 0x007c, 0x783c, 0x8001,
++	0x783e, 0x00c0, 0x3577, 0x7840, 0x783e, 0x7848, 0xa005, 0x0040,
++	0x3577, 0x8001, 0x784a, 0x00c0, 0x3577, 0x1078, 0x1b49, 0x007c,
++	0x7834, 0x8001, 0x7836, 0x00c0, 0x359c, 0x7838, 0x7836, 0x2091,
++	0x8000, 0x7844, 0xa005, 0x00c0, 0x3587, 0x2001, 0x0101, 0x8001,
++	0x7846, 0xa080, 0x5b00, 0x2040, 0x2004, 0xa065, 0x0040, 0x359c,
++	0x6020, 0xa005, 0x0040, 0x3598, 0x8001, 0x6022, 0x0040, 0x35cc,
++	0x6000, 0x2c40, 0x0078, 0x358d, 0x007c, 0x7828, 0x8001, 0x782a,
++	0x00c0, 0x35cb, 0x782c, 0x782a, 0x7830, 0xa005, 0x00c0, 0x35aa,
++	0x2001, 0x0200, 0x8001, 0x7832, 0x8003, 0x8003, 0x8003, 0x8003,
++	0xa090, 0x3b00, 0xa298, 0x0002, 0x2304, 0xa084, 0x0008, 0x0040,
++	0x35cb, 0xa290, 0x0009, 0x2204, 0xa005, 0x0040, 0x35c3, 0x8001,
++	0x2012, 0x00c0, 0x35cb, 0x2304, 0xa084, 0xfff7, 0xa085, 0x0080,
++	0x201a, 0x1078, 0x1b49, 0x007c, 0x2069, 0x3840, 0x6800, 0xa005,
++	0x0040, 0x35d6, 0x683c, 0xac06, 0x0040, 0x3640, 0x6710, 0x6fb6,
++	0x1078, 0x1758, 0x6808, 0xa084, 0x0020, 0x00c0, 0x363d, 0x2009,
++	0x382b, 0x2104, 0xa005, 0x0040, 0x35e9, 0x6023, 0x0001, 0x0078,
++	0x363d, 0x6808, 0xa084, 0xffef, 0xa085, 0x0021, 0x6017, 0x0006,
++	0x60b0, 0xa084, 0x3f00, 0x601a, 0x601c, 0xa084, 0x00ff, 0xa085,
++	0x0060, 0x601e, 0x6000, 0x2042, 0x6710, 0x6fb6, 0x1078, 0x1758,
++	0x6818, 0xa005, 0x0040, 0x3606, 0x8001, 0x681a, 0x6808, 0xa084,
++	0xffef, 0x680a, 0x6810, 0x8001, 0x00d0, 0x3610, 0x1078, 0x1ce7,
++	0x6812, 0x602f, 0x0000, 0x602b, 0x0000, 0x2c68, 0x1078, 0x18b6,
++	0x2069, 0x3840, 0x6710, 0xa784, 0x0f00, 0x68b6, 0x2001, 0x0002,
++	0x1078, 0x1b44, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0030,
++	0x1078, 0x1765, 0x2011, 0x3835, 0x2214, 0x6a3e, 0x8738, 0xa784,
++	0x001f, 0x00c0, 0x3622, 0x2009, 0x382b, 0x200b, 0x0008, 0x2009,
++	0x382c, 0x2069, 0x3840, 0x68b4, 0x200a, 0x2091, 0x8001, 0x007c,
++	0x2009, 0x384f, 0x2164, 0x2069, 0x0100, 0x1078, 0x1c97, 0x6017,
++	0x0006, 0x6858, 0xa084, 0x3f00, 0x601a, 0x601c, 0xa084, 0x00ff,
++	0xa085, 0x0048, 0x601e, 0x602f, 0x0000, 0x602b, 0x0000, 0x6830,
++	0xa084, 0x0040, 0x0040, 0x367c, 0x684b, 0x0004, 0x20a9, 0x0014,
++	0x6848, 0xa084, 0x0004, 0x0040, 0x3669, 0x0070, 0x3669, 0x0078,
++	0x3660, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001,
++	0x0040, 0x3676, 0x0070, 0x3676, 0x0078, 0x366d, 0x20a9, 0x00fa,
++	0x0070, 0x367c, 0x0078, 0x3678, 0x6808, 0xa084, 0xfffd, 0x680a,
++	0x681b, 0x0046, 0x2009, 0x3868, 0x200b, 0x0007, 0x784c, 0x784a,
++	0x2091, 0x8001, 0x007c, 0x2079, 0x3800, 0x1078, 0x36de, 0x1078,
++	0x36a6, 0x1078, 0x36b4, 0x1078, 0x36c9, 0x1078, 0x36f3, 0x2009,
++	0x3833, 0x200b, 0x0000, 0x2009, 0x3834, 0x200b, 0x0000, 0x7833,
++	0x0000, 0x7847, 0x0000, 0x784b, 0x0000, 0x007c, 0x2019, 0x0003,
++	0x2011, 0x3846, 0x2204, 0xa086, 0x003c, 0x0040, 0x36b1, 0x2019,
++	0x0002, 0x7b2a, 0x7b2e, 0x007c, 0x2019, 0x0030, 0x2011, 0x3846,
++	0x2204, 0xa086, 0x0032, 0x0040, 0x36c6, 0x2019, 0x0039, 0x2204,
++	0xa086, 0x003c, 0x0040, 0x36c6, 0x2019, 0x0027, 0x7b36, 0x7b3a,
++	0x007c, 0x2019, 0x000f, 0x2011, 0x3846, 0x2204, 0xa086, 0x003c,
++	0x0040, 0x36db, 0x2019, 0x000d, 0x2204, 0xa086, 0x0032, 0x0040,
++	0x36db, 0x2019, 0x000a, 0x7b3e, 0x7b42, 0x007c, 0x2019, 0x2faf,
++	0x2011, 0x3846, 0x2204, 0xa086, 0x0032, 0x0040, 0x36f0, 0x2019,
++	0x3971, 0x2204, 0xa086, 0x003c, 0x0040, 0x36f0, 0x2019, 0x2626,
++	0x7b22, 0x7b26, 0x007c, 0x2019, 0x0001, 0x2011, 0x3846, 0x2204,
++	0xa086, 0x003c, 0x0040, 0x36fe, 0x2019, 0x0001, 0x017e, 0x2009,
++	0x3831, 0x230a, 0x2009, 0x3832, 0x230a, 0x017f, 0x007c, 0x2009,
++	0x3831, 0x2104, 0x8001, 0x200a, 0xa005, 0x00c0, 0x3755, 0x2009,
++	0x3832, 0x2104, 0x2009, 0x3831, 0x200a, 0x2009, 0x3833, 0x2104,
++	0xa005, 0x00c0, 0x371d, 0x2001, 0x0200, 0x8001, 0x200a, 0x8003,
++	0x8003, 0x8003, 0x8003, 0xa090, 0x3b00, 0x2208, 0xa298, 0x0002,
++	0x2304, 0xa084, 0x0200, 0x0040, 0x3755, 0xa290, 0x000e, 0x2204,
++	0xa005, 0x0040, 0x3740, 0x8001, 0x0040, 0x3740, 0x8001, 0x0040,
++	0x3740, 0x8001, 0x0040, 0x3740, 0x8001, 0x2012, 0x00c0, 0x3755,
++	0x2012, 0x2304, 0xa084, 0xfdff, 0xa085, 0x0400, 0x201a, 0xa188,
++	0x000c, 0x2104, 0x007e, 0xa084, 0x00ff, 0x8001, 0x027f, 0xa294,
++	0xff00, 0xa205, 0x200a, 0x1078, 0x1b49, 0x007c, 0x6ed0
++};
++#else
++/*
++ * Flakey, not quite functional, target mode code for ISP1000
++ * hacked out of PCI 7.55 initiator/target mode code.
++ */
++static const u_int16_t isp_1000_risc_code[] = {
++	0x0078, 0x103a, 0x0000, 0x3c1f, 0x0000, 0x2043, 0x4f50, 0x5952,
++	0x4947, 0x4854, 0x2031, 0x3939, 0x3520, 0x514c, 0x4f47, 0x4943,
++	0x2043, 0x4f52, 0x504f, 0x5241, 0x5449, 0x4f4e, 0x2049, 0x5350,
++	0x3130, 0x3030, 0x2049, 0x2f54, 0x2046, 0x6972, 0x6d77, 0x6172,
++	0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, 0x372e, 0x3535,
++	0x2020, 0x2043, 0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20,
++	0x3030, 0x2050, 0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020,
++	0x3031, 0x2024, 0x3700, 0xa086, 0xffff, 0x0040, 0x1043, 0x2079,
++	0x4d00, 0x7803, 0x0001, 0x20c1, 0x0008, 0x2071, 0x0010, 0x70c3,
++	0x0004, 0x20c9, 0x73ff, 0x2089, 0x116f, 0x70c7, 0x4953, 0x70cb,
++	0x5020, 0x70cf, 0x2020, 0x70d3, 0x0007, 0x3f00, 0x70d6, 0x20c1,
++	0x0008, 0x2019, 0x0000, 0x2009, 0xfeff, 0x2100, 0x200b, 0xa5a5,
++	0xa1ec, 0x7fff, 0x2d64, 0x206b, 0x0a0a, 0xaddc, 0x3fff, 0x2b54,
++	0x205b, 0x5050, 0x2114, 0xa286, 0xa5a5, 0x0040, 0x10b5, 0xa386,
++	0x000f, 0x0040, 0x107b, 0x2c6a, 0x2a5a, 0x20c1, 0x0000, 0x2019,
++	0x000f, 0x0078, 0x105b, 0x2c6a, 0x2a5a, 0x20c1, 0x0008, 0x2009,
++	0x7fff, 0x2148, 0x2944, 0x204b, 0x0a0a, 0xa9bc, 0x3fff, 0x2734,
++	0x203b, 0x5050, 0x2114, 0xa286, 0x0a0a, 0x0040, 0x109f, 0x284a,
++	0x263a, 0x20c1, 0x0004, 0x2009, 0x3fff, 0x2134, 0x200b, 0x5050,
++	0x2114, 0xa286, 0x5050, 0x0040, 0x10a0, 0x0078, 0x1177, 0x284a,
++	0x263a, 0x98c0, 0xa188, 0x1000, 0x212c, 0x200b, 0xa5a5, 0x2114,
++	0xa286, 0xa5a5, 0x0040, 0x10b2, 0x250a, 0xa18a, 0x1000, 0x98c1,
++	0x0078, 0x10b7, 0x250a, 0x0078, 0x10b7, 0x2c6a, 0x2a5a, 0x2130,
++	0xa18a, 0x0040, 0x2128, 0xa1a2, 0x4d00, 0x8424, 0x8424, 0x8424,
++	0x8424, 0x8424, 0x8424, 0xa192, 0x7400, 0x2009, 0x0000, 0x2001,
++	0x0031, 0x1078, 0x1bd8, 0x2218, 0x2079, 0x4d00, 0x2fa0, 0x2408,
++	0x2011, 0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109, 0x00c0, 0x10d2,
++	0x7ef2, 0x8528, 0x7de6, 0x7cea, 0x7bee, 0x7883, 0x0000, 0x2031,
++	0x0030, 0x78cf, 0x0101, 0x780b, 0x0002, 0x780f, 0x0002, 0x784f,
++	0x0003, 0x2069, 0x4d40, 0x00a8, 0x10f1, 0x681b, 0x003c, 0x0078,
++	0x10f3, 0x681b, 0x0028, 0x6807, 0x0007, 0x680b, 0x00fa, 0x680f,
++	0x0008, 0x6813, 0x0005, 0x6823, 0x0000, 0x6827, 0x0006, 0x6817,
++	0x0008, 0x682b, 0x0000, 0x681f, 0x0019, 0x2069, 0x4f80, 0x2011,
++	0x0020, 0x2009, 0x0010, 0x680b, 0x080c, 0x680f, 0x0019, 0x6803,
++	0xfd00, 0x6807, 0x0018, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290,
++	0x0004, 0x8109, 0x00c0, 0x110b, 0x2069, 0x5000, 0x2009, 0x0002,
++	0x20a9, 0x0100, 0x6837, 0x0000, 0x680b, 0x0040, 0x7bf0, 0xa386,
++	0xfeff, 0x00c0, 0x1131, 0x6817, 0x0100, 0x681f, 0x0064, 0x0078,
++	0x1135, 0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010, 0x0070,
++	0x113b, 0x0078, 0x1122, 0x8109, 0x00c0, 0x1120, 0x1078, 0x20d8,
++	0x1078, 0x43d1, 0x1078, 0x18a9, 0x1078, 0x48d9, 0x3200, 0xa085,
++	0x000d, 0x2090, 0x70c3, 0x0000, 0x0090, 0x1155, 0x70c0, 0xa086,
++	0x0002, 0x00c0, 0x1155, 0x1078, 0x126d, 0x1078, 0x117f, 0x78cc,
++	0xa005, 0x00c0, 0x1163, 0x1078, 0x1c01, 0x0010, 0x1169, 0x0068,
++	0x1169, 0x1078, 0x1fbd, 0x0010, 0x1169, 0x0068, 0x1169, 0x1078,
++	0x198e, 0x00e0, 0x1155, 0x1078, 0x4760, 0x0078, 0x1155, 0x1177,
++	0x1179, 0x22cc, 0x22cc, 0x4452, 0x4452, 0x22cc, 0x22cc, 0x0078,
++	0x1177, 0x0078, 0x1179, 0x0078, 0x117b, 0x0078, 0x117d, 0x0068,
++	0x11ea, 0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x11ea,
++	0x7814, 0xa005, 0x00c0, 0x1190, 0x0010, 0x11eb, 0x0078, 0x11ea,
++	0x2009, 0x4d5b, 0x2104, 0xa005, 0x00c0, 0x11ea, 0x2009, 0x4d64,
++	0x200b, 0x0000, 0x7914, 0xa186, 0x0042, 0x00c0, 0x11b5, 0x7816,
++	0x2009, 0x4d62, 0x2164, 0x200b, 0x0000, 0x6018, 0x70c6, 0x6014,
++	0x70ca, 0x611c, 0xa18c, 0xff00, 0x6020, 0xa084, 0x00ff, 0xa105,
++	0x70ce, 0x1078, 0x188e, 0x0078, 0x11e8, 0x7814, 0xa086, 0x0018,
++	0x00c0, 0x11bc, 0x1078, 0x15e0, 0x7817, 0x0000, 0x2009, 0x4d62,
++	0x2104, 0xa065, 0x0040, 0x11d8, 0x0c7e, 0x609c, 0x2060, 0x1078,
++	0x18f9, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x16a2, 0x2009, 0x000e,
++	0x6007, 0x0103, 0x1078, 0x186a, 0x00c0, 0x11e4, 0x1078, 0x188e,
++	0x2009, 0x4d62, 0x200b, 0x0000, 0x2009, 0x4d5c, 0x2104, 0x200b,
++	0x0000, 0xa005, 0x0040, 0x11e8, 0x2001, 0x4005, 0x0078, 0x126f,
++	0x0078, 0x126d, 0x007c, 0x70c3, 0x0000, 0x70c7, 0x0000, 0x70cb,
++	0x0000, 0x70cf, 0x0000, 0x70c0, 0xa0bc, 0xffc0, 0x00c0, 0x123b,
++	0x2038, 0x0079, 0x11fb, 0x126d, 0x12c4, 0x1292, 0x12d3, 0x12e2,
++	0x12e8, 0x1289, 0x16ba, 0x12ec, 0x1281, 0x1296, 0x1298, 0x129a,
++	0x129c, 0x16bf, 0x1281, 0x12f4, 0x1313, 0x15ee, 0x16b4, 0x129e,
++	0x1517, 0x1533, 0x154f, 0x157a, 0x14d0, 0x14de, 0x14f2, 0x1506,
++	0x1384, 0x1281, 0x1332, 0x1338, 0x133d, 0x1342, 0x1348, 0x134d,
++	0x1352, 0x1357, 0x135c, 0x1360, 0x1375, 0x1381, 0x1281, 0x1281,
++	0x1281, 0x1281, 0x1390, 0x1399, 0x13a8, 0x13ce, 0x13d8, 0x13df,
++	0x141a, 0x1429, 0x1438, 0x144a, 0x14b0, 0x14c0, 0x1281, 0x1281,
++	0x1281, 0x1281, 0x14c5, 0xa0bc, 0xffa0, 0x00c0, 0x1281, 0x2038,
++	0xa084, 0x001f, 0x0079, 0x1244, 0x16f8, 0x16fb, 0x170b, 0x1281,
++	0x1281, 0x1846, 0x1858, 0x1281, 0x1281, 0x1281, 0x185c, 0x1864,
++	0x1281, 0x1281, 0x1281, 0x1281, 0x1281, 0x1281, 0x1281, 0x1281,
++	0x1281, 0x16d6, 0x16ea, 0x1281, 0x1797, 0x1281, 0x1822, 0x182c,
++	0x1830, 0x183e, 0x1281, 0x1281, 0x72ca, 0x71c6, 0x2001, 0x4006,
++	0x0078, 0x126f, 0x73ce, 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2,
++	0x0068, 0x1270, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x5000,
++	0x00e0, 0x1278, 0x00e0, 0x127a, 0x0068, 0x127a, 0x2091, 0x4080,
++	0x007c, 0x70c3, 0x4001, 0x0078, 0x1270, 0x70c3, 0x4006, 0x0078,
++	0x1270, 0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3,
++	0x0078, 0x126d, 0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078, 0x126d,
++	0x0078, 0x126d, 0x0078, 0x126d, 0x0078, 0x126d, 0x2091, 0x8000,
++	0x70c3, 0x0000, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020,
++	0x70d3, 0x0007, 0x3f00, 0x70d6, 0x2079, 0x0000, 0x781b, 0x0001,
++	0x2031, 0x0030, 0x2059, 0x1000, 0x2029, 0x0457, 0x2051, 0x0470,
++	0x2061, 0x0472, 0x20b9, 0xffff, 0x20c1, 0x0000, 0x2091, 0x5000,
++	0x2091, 0x4080, 0x0078, 0x0455, 0x2029, 0x0000, 0x2520, 0x71d0,
++	0x73c8, 0x72cc, 0x70c4, 0x1078, 0x19d3, 0x0040, 0x126d, 0x70c3,
++	0x4002, 0x0078, 0x126d, 0x2029, 0x0000, 0x2520, 0x71d0, 0x73c8,
++	0x72cc, 0x70c4, 0x1078, 0x1a1f, 0x0040, 0x126d, 0x70c3, 0x4002,
++	0x0078, 0x126d, 0x71c4, 0x70c8, 0x2114, 0x200a, 0x0078, 0x126b,
++	0x71c4, 0x2114, 0x0078, 0x126b, 0x70c7, 0x0007, 0x70cb, 0x0037,
++	0x70cf, 0x0000, 0x0078, 0x126d, 0x2029, 0x0000, 0x2530, 0x70c4,
++	0x72c8, 0x73cc, 0x74d0, 0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005,
++	0x0040, 0x130d, 0x8001, 0x7892, 0x7a9a, 0x7b9e, 0x7c96, 0x78cc,
++	0xa084, 0xfffc, 0x78ce, 0x0078, 0x1311, 0x78cc, 0xa085, 0x0001,
++	0x78ce, 0x0078, 0x126d, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8,
++	0x73cc, 0x74d4, 0x70c6, 0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0040,
++	0x132c, 0x8001, 0x78ae, 0x7ab6, 0x7bba, 0x7cb2, 0x78cc, 0xa084,
++	0xfcff, 0x78ce, 0x0078, 0x1330, 0x78cc, 0xa085, 0x0100, 0x78ce,
++	0x0078, 0x126d, 0x2009, 0x4d61, 0x210c, 0x7aec, 0x0078, 0x126b,
++	0x2009, 0x4d41, 0x210c, 0x0078, 0x126c, 0x2009, 0x4d42, 0x210c,
++	0x0078, 0x126c, 0x2061, 0x4d40, 0x610c, 0x6210, 0x0078, 0x126b,
++	0x2009, 0x4d45, 0x210c, 0x0078, 0x126c, 0x2009, 0x4d46, 0x210c,
++	0x0078, 0x126c, 0x2009, 0x4d48, 0x210c, 0x0078, 0x126c, 0x2009,
++	0x4d49, 0x210c, 0x0078, 0x126c, 0x7908, 0x7a0c, 0x0078, 0x126b,
++	0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8,
++	0x4f80, 0x6a00, 0x6804, 0xa084, 0x0008, 0x0040, 0x1372, 0x6b08,
++	0x0078, 0x1373, 0x6b0c, 0x0078, 0x126a, 0x77c4, 0x1078, 0x18b9,
++	0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708, 0x0078,
++	0x126a, 0x794c, 0x0078, 0x126c, 0x77c4, 0x1078, 0x18b9, 0x2091,
++	0x8000, 0x6908, 0x6a18, 0x6b10, 0x2091, 0x8001, 0x0078, 0x126a,
++	0x71c4, 0xa182, 0x0010, 0x00c8, 0x1265, 0x1078, 0x21a3, 0x0078,
++	0x126a, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x1265, 0x2011, 0x4d41,
++	0x2204, 0x007e, 0x2112, 0x1078, 0x215c, 0x017f, 0x0078, 0x126c,
++	0x71c4, 0x2011, 0x13c6, 0x20a9, 0x0008, 0x2204, 0xa106, 0x0040,
++	0x13b8, 0x8210, 0x0070, 0x13b6, 0x0078, 0x13ad, 0x0078, 0x1265,
++	0xa292, 0x13c6, 0x027e, 0x2011, 0x4d42, 0x2204, 0x2112, 0x017f,
++	0x007e, 0x1078, 0x2168, 0x017f, 0x0078, 0x126c, 0x03e8, 0x00fa,
++	0x01f4, 0x02ee, 0x0064, 0x0019, 0x0032, 0x004b, 0x2061, 0x4d40,
++	0x610c, 0x6210, 0x70c4, 0x600e, 0x70c8, 0x6012, 0x0078, 0x126b,
++	0x2061, 0x4d40, 0x6114, 0x70c4, 0x6016, 0x0078, 0x126c, 0x2061,
++	0x4d40, 0x71c4, 0x2011, 0x0004, 0x601f, 0x0019, 0x2019, 0x1212,
++	0xa186, 0x0028, 0x0040, 0x1400, 0x2011, 0x0005, 0x601f, 0x0019,
++	0x2019, 0x1212, 0xa186, 0x0032, 0x0040, 0x1400, 0x2011, 0x0006,
++	0x601f, 0x000c, 0x2019, 0x2222, 0xa186, 0x003c, 0x00c0, 0x1265,
++	0x6018, 0x007e, 0x611a, 0x7800, 0xa084, 0x0001, 0x00c0, 0x1410,
++	0x0028, 0x140c, 0x0078, 0x1410, 0x2019, 0x2222, 0x0078, 0x1412,
++	0x2019, 0x1212, 0x23b8, 0x1078, 0x2179, 0x1078, 0x48d9, 0x017f,
++	0x0078, 0x126c, 0x71c4, 0xa184, 0xffcf, 0x00c0, 0x1265, 0x2011,
++	0x4d48, 0x2204, 0x2112, 0x007e, 0x1078, 0x219b, 0x017f, 0x0078,
++	0x126c, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x1265, 0x2011, 0x4d49,
++	0x2204, 0x007e, 0x2112, 0x1078, 0x218a, 0x017f, 0x0078, 0x126c,
++	0x71c4, 0x72c8, 0xa184, 0xfffd, 0x00c0, 0x1264, 0xa284, 0xfffd,
++	0x00c0, 0x1264, 0x2100, 0x7908, 0x780a, 0x2200, 0x7a0c, 0x780e,
++	0x0078, 0x126b, 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003,
++	0x8003, 0xa0e8, 0x4f80, 0x2019, 0x0000, 0x72c8, 0x6800, 0x007e,
++	0xa226, 0x0040, 0x1479, 0x6a02, 0xa484, 0x2000, 0x0040, 0x1462,
++	0xa39d, 0x0010, 0xa484, 0x1000, 0x0040, 0x1468, 0xa39d, 0x0008,
++	0xa484, 0x4000, 0x0040, 0x1479, 0x810f, 0xa284, 0x4000, 0x0040,
++	0x1475, 0x1078, 0x21bd, 0x0078, 0x1479, 0x1078, 0x21af, 0x0078,
++	0x1479, 0x72cc, 0x6808, 0xa206, 0x0040, 0x14a8, 0xa2a4, 0x00ff,
++	0x2061, 0x4d40, 0x6118, 0xa186, 0x0028, 0x0040, 0x148f, 0xa186,
++	0x0032, 0x0040, 0x1495, 0xa186, 0x003c, 0x0040, 0x149b, 0xa482,
++	0x0064, 0x0048, 0x14a5, 0x0078, 0x149f, 0xa482, 0x0050, 0x0048,
++	0x14a5, 0x0078, 0x149f, 0xa482, 0x0043, 0x0048, 0x14a5, 0x71c4,
++	0x71c6, 0x027f, 0x72ca, 0x0078, 0x1266, 0x6a0a, 0xa39d, 0x000a,
++	0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4, 0x0078, 0x126a,
++	0x77c4, 0x1078, 0x18b9, 0x2091, 0x8000, 0x6a14, 0x6b1c, 0x2091,
++	0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708, 0x0078, 0x126a,
++	0x70c4, 0x794c, 0x784e, 0x0078, 0x126c, 0x71c4, 0x72c8, 0x73cc,
++	0xa182, 0x0010, 0x00c8, 0x1265, 0x1078, 0x21cb, 0x0078, 0x126a,
++	0x77c4, 0x1078, 0x18b9, 0x2091, 0x8000, 0x6a08, 0xa295, 0x0002,
++	0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078, 0x126b, 0x77c4, 0x1078,
++	0x18b9, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9, 0x6a0a, 0x6804,
++	0xa005, 0x0040, 0x14ed, 0x1078, 0x20a0, 0x2091, 0x8001, 0x2708,
++	0x0078, 0x126b, 0x77c4, 0x1078, 0x18b9, 0x2091, 0x8000, 0x6a08,
++	0xa295, 0x0004, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x1501, 0x1078,
++	0x20a0, 0x2091, 0x8001, 0x2708, 0x0078, 0x126b, 0x77c4, 0x2041,
++	0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078,
++	0x18c6, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0078, 0x126b, 0x77c4,
++	0x72c8, 0x73cc, 0x77c6, 0x72ca, 0x73ce, 0x1078, 0x1927, 0x00c0,
++	0x152f, 0x6818, 0xa005, 0x0040, 0x152f, 0x2708, 0x1078, 0x21db,
++	0x00c0, 0x152f, 0x7817, 0x0015, 0x2091, 0x8001, 0x007c, 0x2091,
++	0x8001, 0x0078, 0x126d, 0x77c4, 0x77c6, 0x2041, 0x0021, 0x2049,
++	0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078, 0x18c6, 0x2061,
++	0x4d40, 0x606f, 0x0003, 0x6782, 0x6093, 0x000f, 0x6073, 0x0000,
++	0x7817, 0x0016, 0x1078, 0x20a0, 0x2091, 0x8001, 0x007c, 0x77c8,
++	0x77ca, 0x77c4, 0x77c6, 0xa7bc, 0xff00, 0x2091, 0x8000, 0x2061,
++	0x4d40, 0x606f, 0x0002, 0x6073, 0x0000, 0x6782, 0x6093, 0x000f,
++	0x7817, 0x0017, 0x1078, 0x20a0, 0x2091, 0x8001, 0x2041, 0x0021,
++	0x2049, 0x0004, 0x2051, 0x0010, 0x2091, 0x8000, 0x1078, 0x18c6,
++	0x70c8, 0x6836, 0x8738, 0xa784, 0x001f, 0x00c0, 0x156e, 0x2091,
++	0x8001, 0x007c, 0x78cc, 0xa084, 0x0003, 0x00c0, 0x159e, 0x2039,
++	0x0000, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x1078,
++	0x18b9, 0x2091, 0x8000, 0x6808, 0xa80d, 0x690a, 0x2091, 0x8001,
++	0x8738, 0xa784, 0x001f, 0x00c0, 0x1587, 0xa7bc, 0xff00, 0x873f,
++	0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1587, 0x2091, 0x8000,
++	0x2069, 0x0100, 0x6830, 0xa084, 0x0040, 0x0040, 0x15c7, 0x684b,
++	0x0004, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0004, 0x0040, 0x15b4,
++	0x0070, 0x15b4, 0x0078, 0x15ab, 0x684b, 0x0009, 0x20a9, 0x0014,
++	0x6848, 0xa084, 0x0001, 0x0040, 0x15c1, 0x0070, 0x15c1, 0x0078,
++	0x15b8, 0x20a9, 0x00fa, 0x0070, 0x15c7, 0x0078, 0x15c3, 0x2079,
++	0x4d00, 0x7817, 0x0018, 0x2061, 0x4d40, 0x606f, 0x0001, 0x6073,
++	0x0000, 0x6093, 0x000f, 0x78cc, 0xa085, 0x0002, 0x78ce, 0x6808,
++	0xa084, 0xfffd, 0x680a, 0x681b, 0x0048, 0x2091, 0x8001, 0x007c,
++	0x78cc, 0xa084, 0xfffd, 0x78ce, 0xa084, 0x0001, 0x00c0, 0x15ea,
++	0x1078, 0x1971, 0x71c4, 0x71c6, 0x794a, 0x007c, 0x2029, 0x0000,
++	0x2520, 0x71c4, 0x73c8, 0x72cc, 0x71c6, 0x73ca, 0x72ce, 0x2079,
++	0x4d00, 0x1078, 0x1874, 0x0040, 0x169e, 0x20a9, 0x0005, 0x20a1,
++	0x4d18, 0x2091, 0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0020,
++	0x1078, 0x186f, 0x0040, 0x1610, 0x1078, 0x188e, 0x0078, 0x169e,
++	0x6004, 0xa084, 0xff00, 0x8007, 0x8009, 0x0040, 0x166d, 0x0c7e,
++	0x2c68, 0x1078, 0x1874, 0x0040, 0x163e, 0x2c00, 0x689e, 0x8109,
++	0x00c0, 0x1618, 0x609f, 0x0000, 0x0c7f, 0x0c7e, 0x7218, 0x731c,
++	0x2c68, 0x689c, 0xa065, 0x0040, 0x166c, 0x2009, 0x0020, 0x1078,
++	0x186f, 0x00c0, 0x1655, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0002,
++	0x00c0, 0x163e, 0x2d00, 0x6002, 0x0078, 0x1626, 0x0c7f, 0x0c7e,
++	0x609c, 0x2060, 0x1078, 0x18f9, 0x0c7f, 0x609f, 0x0000, 0x1078,
++	0x16a2, 0x2009, 0x000e, 0x6008, 0xa085, 0x0200, 0x600a, 0x1078,
++	0x186a, 0x1078, 0x188e, 0x0078, 0x169e, 0x0c7f, 0x0c7e, 0x609c,
++	0x2060, 0x1078, 0x18f9, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x16a2,
++	0x2009, 0x000e, 0x6007, 0x0103, 0x601b, 0x0003, 0x1078, 0x186a,
++	0x1078, 0x188e, 0x0078, 0x169e, 0x0c7f, 0x74c4, 0x73c8, 0x72cc,
++	0x6014, 0x2091, 0x8000, 0x7817, 0x0012, 0x0e7e, 0x2071, 0x4d40,
++	0x706f, 0x0005, 0x7073, 0x0000, 0x7376, 0x727a, 0x747e, 0x7082,
++	0x7087, 0x0000, 0x2c00, 0x708a, 0x708f, 0x0000, 0xa02e, 0x2530,
++	0x611c, 0x61a2, 0xa184, 0x0060, 0x0040, 0x1690, 0x1078, 0x4367,
++	0x0e7f, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3,
++	0x0000, 0x1078, 0x20a0, 0x2091, 0x8001, 0x007c, 0x70c3, 0x4005,
++	0x0078, 0x1270, 0x20a9, 0x0005, 0x2099, 0x4d18, 0x2091, 0x8000,
++	0x530a, 0x2091, 0x8001, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1,
++	0x0000, 0xa5a9, 0x0000, 0x007c, 0x71c4, 0x70c7, 0x0000, 0x7906,
++	0x0078, 0x126d, 0x71c4, 0x71c6, 0x2168, 0x0078, 0x16c1, 0x2069,
++	0x1000, 0x690c, 0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x00c0,
++	0x16c3, 0xa285, 0x0000, 0x00c0, 0x16d1, 0x70c3, 0x4000, 0x0078,
++	0x16d3, 0x70c3, 0x4003, 0x70ca, 0x0078, 0x1270, 0x2011, 0x4d67,
++	0x220c, 0x70c4, 0x8003, 0x0048, 0x16e3, 0x1078, 0x398d, 0xa184,
++	0x7fff, 0x0078, 0x16e7, 0x1078, 0x3980, 0xa185, 0x8000, 0x2012,
++	0x0078, 0x126c, 0x71c4, 0x1078, 0x3977, 0x6100, 0x2001, 0x4d67,
++	0x2004, 0xa084, 0x8000, 0xa10d, 0x6204, 0x6308, 0x0078, 0x126a,
++	0x79e4, 0x0078, 0x126c, 0x71c4, 0x71c6, 0x2198, 0x20a1, 0x0042,
++	0x20a9, 0x0004, 0x53a3, 0x21a0, 0x2099, 0x0042, 0x20a9, 0x0004,
++	0x53a3, 0x0078, 0x126d, 0x70c4, 0x2068, 0x2079, 0x4d00, 0x1078,
++	0x1874, 0x0040, 0x1793, 0x6007, 0x0001, 0x600b, 0x0000, 0x602b,
++	0x0000, 0x601b, 0x0006, 0x6a10, 0xa28c, 0x000f, 0xa284, 0x00f0,
++	0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x6016, 0xa284, 0x0800,
++	0x0040, 0x172e, 0x601b, 0x000a, 0x0078, 0x1734, 0xa284, 0x1000,
++	0x0040, 0x1734, 0x601b, 0x000c, 0xa284, 0x0300, 0x0040, 0x173d,
++	0x602b, 0x0001, 0x8004, 0x8004, 0x8004, 0xa085, 0x0001, 0x601e,
++	0x6023, 0x0000, 0x6027, 0x0000, 0xa284, 0x0400, 0x0040, 0x174a,
++	0x602b, 0x0000, 0x20a9, 0x0006, 0xac80, 0x000b, 0x20a0, 0xad80,
++	0x0005, 0x2098, 0x53a3, 0xa284, 0x0300, 0x00c0, 0x175f, 0x604a,
++	0x6046, 0x6052, 0x604e, 0x6096, 0x609a, 0x0078, 0x1769, 0x6800,
++	0x604a, 0x6804, 0x6046, 0x6e08, 0x6652, 0x6d0c, 0x654e, 0x6596,
++	0x669a, 0x6014, 0x2091, 0x8000, 0x7817, 0x0042, 0x2c08, 0x2061,
++	0x4d40, 0x606f, 0x0005, 0x6073, 0x0000, 0x6077, 0x0000, 0x607b,
++	0x0000, 0x607f, 0x0000, 0x6082, 0x618a, 0xa284, 0x0400, 0x608e,
++	0x2091, 0x8001, 0x0e7e, 0x2071, 0x0020, 0x7007, 0x000a, 0x7007,
++	0x0002, 0x7003, 0x0000, 0x0e7f, 0x2091, 0x8000, 0x1078, 0x20a0,
++	0x2091, 0x8001, 0x007c, 0x70c3, 0x4005, 0x0078, 0x1270, 0x0c7e,
++	0x0d7e, 0x0e7e, 0x0f7e, 0x2091, 0x8000, 0x2071, 0x4d40, 0x2079,
++	0x0100, 0x2061, 0x0010, 0x70a0, 0xa06d, 0x0040, 0x1818, 0x6a04,
++	0xa294, 0x00ff, 0xa286, 0x0007, 0x0040, 0x17b2, 0xa286, 0x000f,
++	0x00c0, 0x1818, 0x6920, 0xa184, 0x0080, 0x00c0, 0x1818, 0x6824,
++	0xa18c, 0xff00, 0xa085, 0x0019, 0x6826, 0x71b8, 0x81ff, 0x0040,
++	0x17d3, 0x0d7e, 0x2069, 0x0020, 0x6908, 0x6808, 0xa106, 0x00c0,
++	0x17c4, 0x690c, 0x680c, 0xa106, 0x00c0, 0x17c9, 0xa184, 0x00ff,
++	0x00c0, 0x17c9, 0x0d7f, 0x78b8, 0xa084, 0x801f, 0x00c0, 0x17d3,
++	0x7848, 0xa085, 0x000c, 0x784a, 0x71b8, 0x81ff, 0x0040, 0x17f6,
++	0x70bb, 0x0000, 0x0d7e, 0x2069, 0x0020, 0x6807, 0x0008, 0x6804,
++	0xa084, 0x0008, 0x00c0, 0x17e7, 0x6807, 0x0008, 0x6804, 0xa084,
++	0x0008, 0x00c0, 0x17ee, 0x6807, 0x0002, 0x0d7f, 0x61c4, 0x62c8,
++	0x63cc, 0x61c6, 0x62ca, 0x63ce, 0x0e7e, 0x2071, 0x4d00, 0x7266,
++	0x736a, 0xae80, 0x0019, 0x0e7f, 0x1078, 0x42b7, 0x78a3, 0x0000,
++	0x7858, 0xa084, 0xedff, 0x785a, 0x70bc, 0xa080, 0x00da, 0x781a,
++	0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x2091, 0x8001, 0x0078, 0x126d,
++	0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x2091, 0x8001, 0x2001, 0x4005,
++	0x0078, 0x126f, 0x7980, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x00c8,
++	0x1265, 0x7982, 0x0078, 0x126d, 0x7980, 0x71c6, 0x0078, 0x126d,
++	0x7974, 0x71c6, 0x71c4, 0x7976, 0x7978, 0x71ca, 0x71c8, 0x797a,
++	0x797c, 0x71ce, 0x71cc, 0x797e, 0x0078, 0x126d, 0x7974, 0x71c6,
++	0x7978, 0x71ca, 0x797c, 0x71ce, 0x0078, 0x126d, 0x7900, 0x71c6,
++	0x71c4, 0x7902, 0x00a8, 0x1856, 0xa18c, 0x0001, 0x00c0, 0x1854,
++	0x20b9, 0x2222, 0x0078, 0x1856, 0x20b9, 0x1212, 0x0078, 0x126d,
++	0x7900, 0x71c6, 0x0078, 0x126d, 0x2009, 0x4d74, 0x2104, 0x70c6,
++	0x70c4, 0x200a, 0x0078, 0x126d, 0x2009, 0x4d74, 0x2104, 0x70c6,
++	0x0078, 0x126d, 0xac80, 0x0001, 0x1078, 0x1a3d, 0x007c, 0xac80,
++	0x0001, 0x1078, 0x19f1, 0x007c, 0x7850, 0xa065, 0x0040, 0x187c,
++	0x2c04, 0x7852, 0x2063, 0x0000, 0x007c, 0x0f7e, 0x2079, 0x4d00,
++	0x7850, 0xa06d, 0x0040, 0x188c, 0x2d04, 0x7852, 0x6803, 0x0000,
++	0x6807, 0x0000, 0x680b, 0x0000, 0x0f7f, 0x007c, 0x2091, 0x8000,
++	0x0f7e, 0x2079, 0x4d00, 0x7850, 0x2062, 0x2c00, 0xa005, 0x00c0,
++	0x189b, 0x1078, 0x22ac, 0x7852, 0x0f7f, 0x2091, 0x8001, 0x007c,
++	0x0f7e, 0x2079, 0x4d00, 0x7850, 0x206a, 0x2d00, 0x7852, 0x0f7f,
++	0x007c, 0x2011, 0x7400, 0x7a52, 0x7bec, 0x8319, 0x0040, 0x18b6,
++	0xa280, 0x0031, 0x2012, 0x2010, 0x0078, 0x18ad, 0x2013, 0x0000,
++	0x007c, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003,
++	0x8003, 0x8003, 0xa105, 0xa0e8, 0x5000, 0x007c, 0x1078, 0x18b9,
++	0x2900, 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xffef, 0xa80d,
++	0x690a, 0x2009, 0x4d52, 0x210c, 0x6804, 0xa005, 0x0040, 0x18f8,
++	0xa116, 0x00c0, 0x18e3, 0x2060, 0x6000, 0x6806, 0x017e, 0x200b,
++	0x0000, 0x0078, 0x18e6, 0x2009, 0x0000, 0x017e, 0x6804, 0xa065,
++	0x0040, 0x18f5, 0x6000, 0x6806, 0x1078, 0x1906, 0x1078, 0x1b7d,
++	0x6810, 0x8001, 0x6812, 0x00c0, 0x18e6, 0x017f, 0x6902, 0x6906,
++	0x007c, 0xa065, 0x0040, 0x1905, 0x609c, 0x609f, 0x0000, 0x2008,
++	0x1078, 0x188e, 0x2100, 0x0078, 0x18f9, 0x007c, 0x6007, 0x0103,
++	0x608f, 0x0000, 0x20a9, 0x001c, 0xac80, 0x0005, 0x20a0, 0x2001,
++	0x0000, 0x40a4, 0x6828, 0x601a, 0x682c, 0x6022, 0x007c, 0x0e7e,
++	0x2071, 0x4d40, 0x704c, 0xa08c, 0x0200, 0x00c0, 0x1925, 0xa088,
++	0x4d80, 0x2d0a, 0x8000, 0x704e, 0xa006, 0x0e7f, 0x007c, 0x1078,
++	0x18b9, 0x2091, 0x8000, 0x6804, 0x781e, 0xa065, 0x0040, 0x1970,
++	0x0078, 0x1938, 0x2c00, 0x781e, 0x6000, 0xa065, 0x0040, 0x1970,
++	0x6010, 0xa306, 0x00c0, 0x1932, 0x600c, 0xa206, 0x00c0, 0x1932,
++	0x2c28, 0x2001, 0x4d52, 0x2004, 0xac06, 0x00c0, 0x1949, 0x0078,
++	0x196e, 0x6804, 0xac06, 0x00c0, 0x1956, 0x6000, 0xa065, 0x6806,
++	0x00c0, 0x1960, 0x6803, 0x0000, 0x0078, 0x1960, 0x6400, 0x781c,
++	0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x1960, 0x2c00, 0x6802,
++	0x2560, 0x1078, 0x1906, 0x601b, 0x0005, 0x6023, 0x0020, 0x1078,
++	0x1b7d, 0x6810, 0x8001, 0x1050, 0x22ac, 0x6812, 0xa085, 0xffff,
++	0x007c, 0x2039, 0x0000, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051,
++	0x0008, 0x2091, 0x8000, 0x1078, 0x18c6, 0x8738, 0xa784, 0x001f,
++	0x00c0, 0x197b, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784,
++	0x0f00, 0x00c0, 0x197b, 0x2091, 0x8001, 0x007c, 0x2061, 0x0000,
++	0x6018, 0xa084, 0x0001, 0x00c0, 0x199f, 0x2091, 0x8000, 0x78e0,
++	0x78e3, 0x0000, 0x2091, 0x8001, 0xa005, 0x00c0, 0x19a0, 0x007c,
++	0xa08c, 0xfff0, 0x0040, 0x19a6, 0x1078, 0x22ac, 0x0079, 0x19a8,
++	0x19b8, 0x19bb, 0x19c1, 0x19c5, 0x19b9, 0x19c9, 0x19cf, 0x19b9,
++	0x19b9, 0x1b47, 0x1b6b, 0x1b6f, 0x19b9, 0x19b9, 0x19b9, 0x19b9,
++	0x007c, 0x1078, 0x22ac, 0x1078, 0x1971, 0x2001, 0x8001, 0x0078,
++	0x1b75, 0x2001, 0x8003, 0x0078, 0x1b75, 0x2001, 0x8004, 0x0078,
++	0x1b75, 0x1078, 0x1971, 0x2001, 0x8006, 0x0078, 0x1b75, 0x2001,
++	0x8007, 0x0078, 0x1b75, 0x2030, 0x2138, 0xa782, 0x0021, 0x0048,
++	0x19db, 0x2009, 0x0020, 0x2600, 0x1078, 0x19f1, 0x00c0, 0x19f0,
++	0xa7ba, 0x0020, 0x0048, 0x19ef, 0x0040, 0x19ef, 0x2708, 0xa6b0,
++	0x0020, 0xa290, 0x0040, 0xa399, 0x0000, 0x0078, 0x19d5, 0xa006,
++	0x007c, 0x81ff, 0x0040, 0x1a1c, 0x2099, 0x0030, 0x20a0, 0x700c,
++	0xa084, 0x00ff, 0x0040, 0x1a03, 0x7007, 0x0004, 0x7004, 0xa084,
++	0x0004, 0x00c0, 0x19fe, 0x21a8, 0x7017, 0x0000, 0x810b, 0x7112,
++	0x721a, 0x731e, 0x780c, 0xa085, 0x0001, 0x7002, 0x7007, 0x0001,
++	0x7008, 0x800c, 0x00c8, 0x1a10, 0x7007, 0x0002, 0xa08c, 0x000c,
++	0x00c0, 0x1a1c, 0x53a5, 0xa006, 0x7003, 0x0000, 0x007c, 0x2030,
++	0x2138, 0xa782, 0x0021, 0x0048, 0x1a27, 0x2009, 0x0020, 0x2600,
++	0x1078, 0x1a3d, 0x00c0, 0x1a3c, 0xa7ba, 0x0020, 0x0048, 0x1a3b,
++	0x0040, 0x1a3b, 0x2708, 0xa6b0, 0x0020, 0xa290, 0x0040, 0xa399,
++	0x0000, 0x0078, 0x1a21, 0xa006, 0x007c, 0x81ff, 0x0040, 0x1a6e,
++	0x2098, 0x20a1, 0x0030, 0x700c, 0xa084, 0x00ff, 0x0040, 0x1a4f,
++	0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x1a4a, 0x21a8,
++	0x7017, 0x0000, 0x810b, 0x7112, 0x721a, 0x731e, 0x780c, 0xa085,
++	0x0000, 0x7002, 0x53a6, 0x7007, 0x0001, 0x7010, 0xa084, 0xf000,
++	0x0040, 0x1a66, 0x7007, 0x0008, 0x0078, 0x1a6a, 0x7108, 0x8104,
++	0x00c8, 0x1a5d, 0x7007, 0x0002, 0xa184, 0x000c, 0x7003, 0x0000,
++	0x007c, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0004, 0x00c8, 0x1a7a,
++	0x0078, 0x1a7d, 0xa006, 0x0078, 0x1a7f, 0xa085, 0x0001, 0x007c,
++	0x0e7e, 0x2071, 0x4d00, 0x2d08, 0x7058, 0x6802, 0xa005, 0x00c0,
++	0x1a8a, 0x715e, 0x715a, 0x0e7f, 0x007c, 0x2c08, 0x7858, 0x6002,
++	0xa005, 0x00c0, 0x1a94, 0x795e, 0x795a, 0x007c, 0x2091, 0x8000,
++	0x6003, 0x0000, 0x2c08, 0x785c, 0xa065, 0x00c0, 0x1aa2, 0x795a,
++	0x0078, 0x1aa3, 0x6102, 0x795e, 0x2091, 0x8001, 0x1078, 0x20bd,
++	0x007c, 0x0e7e, 0x2071, 0x4d00, 0x7058, 0xa06d, 0x0040, 0x1ab7,
++	0x6800, 0x705a, 0xa005, 0x00c0, 0x1ab6, 0x705e, 0x8dff, 0x0e7f,
++	0x007c, 0x0d7e, 0x0c7e, 0x0f7e, 0x2079, 0x4d00, 0xaf80, 0x0016,
++	0x2060, 0x6000, 0xa005, 0x0040, 0x1ae7, 0x2068, 0x6814, 0xa306,
++	0x00c0, 0x1ad0, 0x6828, 0xa084, 0x00ff, 0xa406, 0x0040, 0x1ad3,
++	0x2d60, 0x0078, 0x1ac1, 0x6800, 0xa005, 0x6002, 0x00c0, 0x1adf,
++	0xaf80, 0x0016, 0xac06, 0x0040, 0x1ade, 0x2c00, 0x785e, 0x0d7e,
++	0x689c, 0xa005, 0x0040, 0x1ae6, 0x1078, 0x18f9, 0x007f, 0x0f7f,
++	0x0c7f, 0x0d7f, 0xa005, 0x007c, 0x0d7e, 0x0c7e, 0x0f7e, 0x2079,
++	0x4d00, 0xaf80, 0x0016, 0x2060, 0x6000, 0xa005, 0x0040, 0x1b16,
++	0x2068, 0x6814, 0xa084, 0x00ff, 0xa306, 0x0040, 0x1b02, 0x2d60,
++	0x0078, 0x1af4, 0x6800, 0xa005, 0x6002, 0x00c0, 0x1b0e, 0xaf80,
++	0x0016, 0xac06, 0x0040, 0x1b0d, 0x2c00, 0x785e, 0x0d7e, 0x689c,
++	0xa005, 0x0040, 0x1b15, 0x1078, 0x18f9, 0x007f, 0x0f7f, 0x0c7f,
++	0x0d7f, 0xa005, 0x007c, 0x0d7e, 0x0c7e, 0x0f7e, 0x2079, 0x4d00,
++	0xaf80, 0x0016, 0x2060, 0x6000, 0xa06d, 0x0040, 0x1b42, 0x6814,
++	0xa306, 0x0040, 0x1b2e, 0x2d60, 0x0078, 0x1b23, 0x6800, 0xa005,
++	0x6002, 0x00c0, 0x1b3a, 0xaf80, 0x0016, 0xac06, 0x0040, 0x1b39,
++	0x2c00, 0x785e, 0x0d7e, 0x689c, 0xa005, 0x0040, 0x1b41, 0x1078,
++	0x18f9, 0x007f, 0x0f7f, 0x0c7f, 0x0d7f, 0xa005, 0x007c, 0x2091,
++	0x8000, 0x2069, 0x4d40, 0x6800, 0xa086, 0x0000, 0x0040, 0x1b55,
++	0x2091, 0x8001, 0x78e3, 0x0009, 0x007c, 0x6880, 0xa0bc, 0xff00,
++	0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x1078, 0x18c6,
++	0x8738, 0xa784, 0x001f, 0x00c0, 0x1b5e, 0x2091, 0x8001, 0x2001,
++	0x800a, 0x0078, 0x1b75, 0x2001, 0x800c, 0x0078, 0x1b75, 0x1078,
++	0x1971, 0x2001, 0x800d, 0x0078, 0x1b75, 0x70c2, 0x2061, 0x0000,
++	0x601b, 0x0001, 0x2091, 0x4080, 0x007c, 0x6004, 0x2c08, 0x2063,
++	0x0000, 0x7884, 0x8000, 0x7886, 0x7888, 0xa005, 0x798a, 0x0040,
++	0x1b8c, 0x2c02, 0x0078, 0x1b8d, 0x798e, 0x007c, 0x6807, 0x0103,
++	0x0c7e, 0x2061, 0x4d00, 0x2d08, 0x206b, 0x0000, 0x6084, 0x8000,
++	0x6086, 0x6088, 0xa005, 0x618a, 0x0040, 0x1ba1, 0x2d02, 0x0078,
++	0x1ba2, 0x618e, 0x0c7f, 0x007c, 0x1078, 0x1bb5, 0x0040, 0x1bb4,
++	0x0c7e, 0x609c, 0xa065, 0x0040, 0x1baf, 0x1078, 0x18f9, 0x0c7f,
++	0x609f, 0x0000, 0x1078, 0x188e, 0x007c, 0x788c, 0xa065, 0x0040,
++	0x1bc7, 0x2091, 0x8000, 0x7884, 0x8001, 0x7886, 0x2c04, 0x788e,
++	0xa005, 0x00c0, 0x1bc5, 0x788a, 0x8000, 0x2091, 0x8001, 0x007c,
++	0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, 0x00c8, 0x1bd1,
++	0xa200, 0x0070, 0x1bd5, 0x0078, 0x1bcc, 0x8086, 0x818e, 0x007c,
++	0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x1bfb, 0xa11a, 0x00c8,
++	0x1bfb, 0x8213, 0x818d, 0x0048, 0x1bec, 0xa11a, 0x00c8, 0x1bed,
++	0x0070, 0x1bf3, 0x0078, 0x1be1, 0xa11a, 0x2308, 0x8210, 0x0070,
++	0x1bf3, 0x0078, 0x1be1, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080,
++	0x007f, 0x157f, 0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078,
++	0x1bf7, 0x7994, 0x70d0, 0xa106, 0x0040, 0x1c6d, 0x2091, 0x8000,
++	0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x1c6d, 0x7008, 0x7208,
++	0xa206, 0x00c0, 0x1c6d, 0xa286, 0x0002, 0x00c0, 0x1c6d, 0x2071,
++	0x0010, 0x1078, 0x1874, 0x0040, 0x1c6d, 0x7a9c, 0x7b98, 0xa184,
++	0xff00, 0x0040, 0x1c3b, 0x2031, 0x0000, 0x810b, 0x86b5, 0x810b,
++	0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b,
++	0x86b5, 0x2100, 0xa210, 0x2600, 0xa319, 0xa4a1, 0x0000, 0xa5a9,
++	0x0000, 0x0078, 0x1c45, 0x8107, 0x8004, 0x8004, 0xa210, 0xa399,
++	0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x2009, 0x0020, 0x1078,
++	0x186f, 0x2091, 0x8001, 0x0040, 0x1c64, 0x1078, 0x188e, 0x78a8,
++	0x8000, 0x78aa, 0xa086, 0x0002, 0x00c0, 0x1c6d, 0x2091, 0x8000,
++	0x78e3, 0x0002, 0x78ab, 0x0000, 0x78cc, 0xa085, 0x0003, 0x78ce,
++	0x2091, 0x8001, 0x0078, 0x1c6d, 0x78ab, 0x0000, 0x1078, 0x1fa1,
++	0x6004, 0xa084, 0x000f, 0x0079, 0x1c72, 0x2071, 0x0010, 0x2091,
++	0x8001, 0x007c, 0x1c82, 0x1c91, 0x1cb1, 0x1c82, 0x1cce, 0x1c82,
++	0x1e29, 0x1e40, 0x1c82, 0x1c82, 0x1c82, 0x1d16, 0x1d7f, 0x1dcf,
++	0x1de1, 0x1c82, 0x2039, 0x0400, 0x78dc, 0xa705, 0x78de, 0x6008,
++	0xa705, 0x600a, 0x1078, 0x1ebc, 0x609c, 0x78da, 0x1078, 0x1f89,
++	0x007c, 0x78dc, 0xa084, 0x0100, 0x0040, 0x1c98, 0x0078, 0x1c82,
++	0x78df, 0x0000, 0x6004, 0x8007, 0xa084, 0x00ff, 0x78d2, 0x8001,
++	0x609f, 0x0000, 0x0040, 0x1cae, 0x1078, 0x1ebc, 0x0040, 0x1cae,
++	0x78dc, 0xa085, 0x0100, 0x78de, 0x0078, 0x1cb0, 0x1078, 0x1ee0,
++	0x007c, 0x78dc, 0xa08c, 0x0e00, 0x00c0, 0x1cba, 0xa084, 0x0100,
++	0x00c0, 0x1cbc, 0x0078, 0x1c82, 0x1078, 0x1ebc, 0x00c0, 0x1ccd,
++	0x6104, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x1e72, 0xa186,
++	0x000f, 0x0040, 0x1e72, 0x1078, 0x1ee0, 0x007c, 0x78dc, 0xa084,
++	0x0100, 0x0040, 0x1cd5, 0x0078, 0x1c82, 0x78df, 0x0000, 0x6714,
++	0x2011, 0x0001, 0x20a9, 0x0001, 0x6018, 0xa084, 0x00ff, 0xa005,
++	0x0040, 0x1cf8, 0x2011, 0x0001, 0xa7bc, 0xff00, 0x20a9, 0x0020,
++	0xa08e, 0x0001, 0x0040, 0x1cf8, 0x2039, 0x0000, 0x2011, 0x0002,
++	0x20a9, 0x0100, 0xa08e, 0x0002, 0x0040, 0x1cf8, 0x0078, 0x1d13,
++	0x1078, 0x18b9, 0x2091, 0x8000, 0x682b, 0x0000, 0x682f, 0x0000,
++	0x6808, 0xa084, 0xffde, 0x680a, 0xade8, 0x0010, 0x2091, 0x8001,
++	0x0070, 0x1d0c, 0x0078, 0x1cfa, 0x8211, 0x0040, 0x1d13, 0x20a9,
++	0x0100, 0x0078, 0x1cfa, 0x1078, 0x188e, 0x007c, 0x2001, 0x4d67,
++	0x2004, 0xa084, 0x8000, 0x0040, 0x1ea1, 0x6114, 0x1078, 0x1fb7,
++	0x6900, 0xa184, 0x0001, 0x0040, 0x1d37, 0x6028, 0xa084, 0x00ff,
++	0x00c0, 0x1e99, 0x6800, 0xa084, 0x0001, 0x0040, 0x1ea1, 0x6803,
++	0x0000, 0x680b, 0x0000, 0x6807, 0x0000, 0x0078, 0x1ea9, 0x2011,
++	0x0001, 0x601c, 0xa084, 0x4000, 0x0040, 0x1d40, 0xa295, 0x0002,
++	0x601c, 0xa084, 0x0100, 0x0040, 0x1d47, 0xa295, 0x0008, 0x6020,
++	0xa084, 0x0002, 0x0040, 0x1d4e, 0xa295, 0x0004, 0x602c, 0xa08c,
++	0x00ff, 0xa182, 0x0002, 0x0048, 0x1ea5, 0xa182, 0x0019, 0x00c8,
++	0x1ea5, 0x690e, 0x602c, 0x8007, 0xa08c, 0x00ff, 0xa182, 0x0002,
++	0x0048, 0x1ea5, 0xa182, 0x0019, 0x00c8, 0x1ea5, 0x6912, 0x6030,
++	0xa005, 0x00c0, 0x1d6d, 0x2001, 0x001e, 0x8000, 0x6816, 0x6028,
++	0xa084, 0x00ff, 0x0040, 0x1ea1, 0x6806, 0x6028, 0x8007, 0xa084,
++	0x00ff, 0x0040, 0x1ea1, 0x680a, 0x6a02, 0x0078, 0x1ea9, 0x2001,
++	0x4d67, 0x2004, 0xa084, 0x8000, 0x0040, 0x1ea1, 0x6114, 0x1078,
++	0x1fb7, 0x2091, 0x8000, 0x6a04, 0x6b08, 0x6418, 0xa484, 0x0003,
++	0x0040, 0x1da5, 0x6128, 0xa18c, 0x00ff, 0x8001, 0x00c0, 0x1d9e,
++	0x2100, 0xa210, 0x0048, 0x1dcb, 0x0078, 0x1da5, 0x8001, 0x00c0,
++	0x1dcb, 0x2100, 0xa212, 0x0048, 0x1dcb, 0xa484, 0x000c, 0x0040,
++	0x1dbf, 0x6128, 0x810f, 0xa18c, 0x00ff, 0xa082, 0x0004, 0x00c0,
++	0x1db7, 0x2100, 0xa318, 0x0048, 0x1dcb, 0x0078, 0x1dbf, 0xa082,
++	0x0004, 0x00c0, 0x1dcb, 0x2100, 0xa31a, 0x0048, 0x1dcb, 0x6030,
++	0xa005, 0x0040, 0x1dc5, 0x8000, 0x6816, 0x6a06, 0x6b0a, 0x2091,
++	0x8001, 0x0078, 0x1ea9, 0x2091, 0x8001, 0x0078, 0x1ea5, 0x6114,
++	0x1078, 0x1fb7, 0x2091, 0x8000, 0x6b08, 0x8318, 0x0048, 0x1ddd,
++	0x6b0a, 0x2091, 0x8001, 0x0078, 0x1eb8, 0x2091, 0x8001, 0x0078,
++	0x1ea5, 0x6024, 0x8007, 0xa084, 0x00ff, 0x0040, 0x1dff, 0xa086,
++	0x0080, 0x00c0, 0x1e27, 0x20a9, 0x0008, 0x2069, 0x7110, 0x2091,
++	0x8000, 0x6800, 0xa084, 0xfcff, 0x6802, 0xade8, 0x0008, 0x0070,
++	0x1dfb, 0x0078, 0x1df1, 0x2091, 0x8001, 0x0078, 0x1ea9, 0x6028,
++	0xa015, 0x0040, 0x1e27, 0x6114, 0x1078, 0x1fb7, 0x0d7e, 0xade8,
++	0x0007, 0x2091, 0x8000, 0x6800, 0xa00d, 0x0040, 0x1e24, 0xa206,
++	0x0040, 0x1e15, 0x2168, 0x0078, 0x1e0b, 0x0c7e, 0x2160, 0x6000,
++	0x6802, 0x1078, 0x188e, 0x0c7f, 0x0d7f, 0x6808, 0x8000, 0x680a,
++	0x2091, 0x8001, 0x0078, 0x1eb8, 0x2091, 0x8001, 0x0d7f, 0x0078,
++	0x1ea1, 0x6114, 0x1078, 0x1fb7, 0x6800, 0xa084, 0x0001, 0x0040,
++	0x1e91, 0x2091, 0x8000, 0x6a04, 0x8210, 0x0048, 0x1e3c, 0x6a06,
++	0x2091, 0x8001, 0x0078, 0x1eb8, 0x2091, 0x8001, 0x0078, 0x1ea5,
++	0x6114, 0x1078, 0x1fb7, 0x60be, 0x6900, 0xa184, 0x0008, 0x0040,
++	0x1e4d, 0x601c, 0xa085, 0x0100, 0x601e, 0xa184, 0x0001, 0x0040,
++	0x1ea1, 0xa184, 0x0100, 0x00c0, 0x1e8d, 0xa184, 0x0200, 0x00c0,
++	0x1e89, 0x681c, 0xa005, 0x00c0, 0x1e95, 0x78df, 0x0000, 0x6004,
++	0x8007, 0xa084, 0x00ff, 0x78d2, 0x8001, 0x609f, 0x0000, 0x0040,
++	0x1e72, 0x1078, 0x1ebc, 0x0040, 0x1e72, 0x78dc, 0xa085, 0x0100,
++	0x78de, 0x007c, 0x78d7, 0x0000, 0x78db, 0x0000, 0x6024, 0xa084,
++	0xff00, 0x6026, 0x6020, 0xa084, 0x8000, 0x0040, 0x1e85, 0x1078,
++	0x37e7, 0x0040, 0x1c01, 0x0078, 0x1e91, 0x1078, 0x1a96, 0x0078,
++	0x1c01, 0x2009, 0x0017, 0x0078, 0x1eab, 0x2009, 0x000e, 0x0078,
++	0x1eab, 0x2009, 0x0007, 0x0078, 0x1eab, 0x2009, 0x0035, 0x0078,
++	0x1eab, 0x2009, 0x003e, 0x0078, 0x1eab, 0x2009, 0x0004, 0x0078,
++	0x1eab, 0x2009, 0x0006, 0x0078, 0x1eab, 0x2009, 0x0016, 0x0078,
++	0x1eab, 0x2009, 0x0001, 0x6024, 0xa084, 0xff00, 0xa105, 0x6026,
++	0x2091, 0x8000, 0x1078, 0x1b7d, 0x2091, 0x8001, 0x0078, 0x1c01,
++	0x1078, 0x188e, 0x0078, 0x1c01, 0x78d4, 0xa06d, 0x00c0, 0x1ec7,
++	0x2c00, 0x78d6, 0x78da, 0x609f, 0x0000, 0x0078, 0x1ed3, 0x2c00,
++	0x689e, 0x609f, 0x0000, 0x78d6, 0x2d00, 0x6002, 0x78d8, 0xad06,
++	0x00c0, 0x1ed3, 0x6002, 0x78d0, 0x8001, 0x78d2, 0x00c0, 0x1edf,
++	0x78dc, 0xa084, 0xfeff, 0x78de, 0x78d8, 0x2060, 0xa006, 0x007c,
++	0xa02e, 0x2530, 0x611c, 0x61a2, 0xa184, 0xe1ff, 0x601e, 0xa184,
++	0x0060, 0x0040, 0x1eef, 0x0e7e, 0x1078, 0x4367, 0x0e7f, 0x6596,
++	0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x6714,
++	0x1078, 0x18b9, 0x2091, 0x8000, 0x60a0, 0xa084, 0x8000, 0x00c0,
++	0x1f16, 0x6808, 0xa084, 0x0001, 0x0040, 0x1f16, 0x2091, 0x8001,
++	0x1078, 0x1906, 0x2091, 0x8000, 0x1078, 0x1b7d, 0x2091, 0x8001,
++	0x78d7, 0x0000, 0x78db, 0x0000, 0x0078, 0x1f88, 0x6024, 0xa096,
++	0x0001, 0x00c0, 0x1f1d, 0x8000, 0x6026, 0x6a10, 0x6814, 0x2091,
++	0x8001, 0xa202, 0x0048, 0x1f2c, 0x0040, 0x1f2c, 0x2039, 0x0200,
++	0x1078, 0x1f89, 0x0078, 0x1f88, 0x2c08, 0x2091, 0x8000, 0x60a0,
++	0xa084, 0x8000, 0x0040, 0x1f59, 0x6800, 0xa065, 0x0040, 0x1f5e,
++	0x6a04, 0x0e7e, 0x2071, 0x4d40, 0x7000, 0xa084, 0x0001, 0x0040,
++	0x1f53, 0x7048, 0xa206, 0x00c0, 0x1f53, 0x6b04, 0x231c, 0x2160,
++	0x6302, 0x2300, 0xa005, 0x00c0, 0x1f4e, 0x6902, 0x2260, 0x6102,
++	0x0e7f, 0x0078, 0x1f65, 0x2160, 0x6202, 0x6906, 0x0e7f, 0x0078,
++	0x1f65, 0x6800, 0xa065, 0x0040, 0x1f5e, 0x6102, 0x6902, 0x00c0,
++	0x1f62, 0x6906, 0x2160, 0x6003, 0x0000, 0x2160, 0x60a0, 0xa084,
++	0x8000, 0x0040, 0x1f6f, 0x6808, 0xa084, 0xfffc, 0x680a, 0x6810,
++	0x8000, 0x6812, 0x2091, 0x8001, 0x6808, 0xa08c, 0x0040, 0x0040,
++	0x1f7e, 0xa086, 0x0040, 0x680a, 0x1078, 0x1917, 0x2091, 0x8000,
++	0x1078, 0x20a0, 0x2091, 0x8001, 0x78db, 0x0000, 0x78d7, 0x0000,
++	0x007c, 0x6008, 0xa705, 0x600a, 0x2091, 0x8000, 0x1078, 0x1b7d,
++	0x2091, 0x8001, 0x78d8, 0xa065, 0x0040, 0x1f9c, 0x609c, 0x78da,
++	0x609f, 0x0000, 0x0078, 0x1f8c, 0x78d7, 0x0000, 0x78db, 0x0000,
++	0x007c, 0x7990, 0x7894, 0x8000, 0xa10a, 0x00c8, 0x1fa8, 0xa006,
++	0x7896, 0x70d2, 0x7804, 0xa005, 0x0040, 0x1fb6, 0x8001, 0x7806,
++	0x00c0, 0x1fb6, 0x0068, 0x1fb6, 0x2091, 0x4080, 0x007c, 0x0c7e,
++	0x1078, 0x3977, 0x2c68, 0x0c7f, 0x007c, 0x0010, 0x202e, 0x0068,
++	0x202e, 0x2029, 0x0000, 0x78cb, 0x0000, 0x788c, 0xa065, 0x0040,
++	0x2027, 0x2009, 0x4d74, 0x2104, 0xa084, 0x0001, 0x0040, 0x1ff5,
++	0x6004, 0xa086, 0x0103, 0x00c0, 0x1ff5, 0x6018, 0xa005, 0x00c0,
++	0x1ff5, 0x6014, 0xa005, 0x00c0, 0x1ff5, 0x0d7e, 0x2069, 0x0000,
++	0x6818, 0xa084, 0x0001, 0x00c0, 0x1ff4, 0x6010, 0x70c6, 0x600c,
++	0x70ca, 0x70c3, 0x8020, 0x681b, 0x0001, 0x2091, 0x4080, 0x0d7f,
++	0x1078, 0x1ba4, 0x0078, 0x202c, 0x0d7f, 0x1078, 0x202f, 0x0040,
++	0x2027, 0x6204, 0xa294, 0x00ff, 0xa296, 0x0003, 0x0040, 0x2007,
++	0x6204, 0xa296, 0x0110, 0x00c0, 0x2015, 0x78cb, 0x0001, 0x6204,
++	0xa294, 0xff00, 0x8217, 0x8211, 0x0040, 0x2015, 0x85ff, 0x00c0,
++	0x2027, 0x8210, 0xa202, 0x00c8, 0x2027, 0x057e, 0x1078, 0x203e,
++	0x057f, 0x0040, 0x2022, 0x78e0, 0xa086, 0x0003, 0x0040, 0x2027,
++	0x0078, 0x2015, 0x8528, 0x78c8, 0xa005, 0x0040, 0x1fc5, 0x85ff,
++	0x0040, 0x202e, 0x2091, 0x4080, 0x78b0, 0x70d6, 0x007c, 0x7bac,
++	0x79b0, 0x70d4, 0xa102, 0x00c0, 0x2038, 0x2300, 0xa005, 0x007c,
++	0x0048, 0x203c, 0xa302, 0x007c, 0x8002, 0x007c, 0x2001, 0x04fd,
++	0x2004, 0xa082, 0x0005, 0x00c8, 0x2058, 0x2091, 0x8000, 0x2071,
++	0x0020, 0x7004, 0xa005, 0x00c0, 0x208d, 0x7008, 0x7208, 0xa206,
++	0x00c0, 0x208d, 0xa286, 0x0002, 0x00c0, 0x208d, 0x2071, 0x0010,
++	0x1078, 0x2092, 0x2009, 0x0020, 0x6004, 0xa086, 0x0103, 0x00c0,
++	0x2067, 0x6028, 0xa005, 0x00c0, 0x2067, 0x2009, 0x000e, 0x1078,
++	0x186a, 0x0040, 0x2080, 0x78c4, 0x8000, 0x78c6, 0xa086, 0x0002,
++	0x00c0, 0x208d, 0x2091, 0x8000, 0x78e3, 0x0003, 0x78c7, 0x0000,
++	0x78cc, 0xa085, 0x0300, 0x78ce, 0x2091, 0x8001, 0x0078, 0x208d,
++	0x78c7, 0x0000, 0x1078, 0x1ba4, 0x79ac, 0x78b0, 0x8000, 0xa10a,
++	0x00c8, 0x208b, 0xa006, 0x78b2, 0xa006, 0x2071, 0x0010, 0x2091,
++	0x8001, 0x007c, 0x8107, 0x8004, 0x8004, 0x7ab8, 0x7bb4, 0xa210,
++	0xa399, 0x0000, 0x007c, 0x2009, 0x4d5b, 0x2091, 0x8000, 0x200a,
++	0x0f7e, 0x0e7e, 0x2071, 0x4d40, 0x7000, 0xa086, 0x0000, 0x00c0,
++	0x20ba, 0x2009, 0x4d12, 0x2104, 0xa005, 0x00c0, 0x20ba, 0x2079,
++	0x0100, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x20ba, 0x0018, 0x20ba,
++	0x781b, 0x004b, 0x0e7f, 0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x2071,
++	0x4d40, 0x2091, 0x8000, 0x7000, 0xa086, 0x0000, 0x00c0, 0x20d3,
++	0x2079, 0x0100, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x20d3, 0x0018,
++	0x20d3, 0x781b, 0x004d, 0x2091, 0x8001, 0x0e7f, 0x0f7f, 0x007c,
++	0x127e, 0x2091, 0x2300, 0x2071, 0x4d40, 0x2079, 0x0100, 0x784b,
++	0x000f, 0x0098, 0x20e6, 0x7838, 0x0078, 0x20df, 0x20a9, 0x0040,
++	0x7800, 0xa082, 0x0004, 0x0048, 0x20ef, 0x20a9, 0x0060, 0x789b,
++	0x0000, 0x78af, 0x0000, 0x78af, 0x0000, 0x0070, 0x20f9, 0x0078,
++	0x20f1, 0x7800, 0xa082, 0x0004, 0x0048, 0x2108, 0x70bf, 0x009f,
++	0x2019, 0x4ab1, 0x1078, 0x2137, 0x702f, 0x8001, 0x0078, 0x2114,
++	0x70bf, 0x0000, 0x2019, 0x4916, 0x1078, 0x2137, 0x2019, 0x4955,
++	0x1078, 0x2137, 0x702f, 0x8000, 0x7003, 0x0000, 0x1078, 0x2240,
++	0x7004, 0xa084, 0x000f, 0x017e, 0x0028, 0x2122, 0xa085, 0x6280,
++	0x0078, 0x2124, 0xa085, 0x62c0, 0x017f, 0x7806, 0x780f, 0xb204,
++	0x7843, 0x00d8, 0x7853, 0x0080, 0x780b, 0x0008, 0x7047, 0x0008,
++	0x7053, 0x4d7f, 0x704f, 0x0000, 0x127f, 0x2000, 0x007c, 0x137e,
++	0x147e, 0x157e, 0x047e, 0x20a1, 0x012b, 0x2304, 0xa005, 0x789a,
++	0x0040, 0x2157, 0x8318, 0x2324, 0x8318, 0x2398, 0x24a8, 0xa484,
++	0xff00, 0x0040, 0x214f, 0xa482, 0x0100, 0x20a9, 0x0100, 0x2020,
++	0x53a6, 0xa005, 0x00c0, 0x2146, 0x3318, 0x0078, 0x213d, 0x047f,
++	0x157f, 0x147f, 0x137f, 0x007c, 0xa18c, 0x000f, 0x2011, 0x0101,
++	0x2204, 0xa084, 0xfff0, 0xa105, 0x2012, 0x1078, 0x2240, 0x007c,
++	0x2011, 0x0101, 0x20a9, 0x0009, 0x810b, 0x0070, 0x2171, 0x0078,
++	0x216c, 0xa18c, 0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012,
++	0x007c, 0x2009, 0x0101, 0x20a9, 0x0005, 0x8213, 0x0070, 0x2182,
++	0x0078, 0x217d, 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205,
++	0x200a, 0x007c, 0x2011, 0x0101, 0x20a9, 0x000c, 0x810b, 0x0070,
++	0x2193, 0x0078, 0x218e, 0xa18c, 0xf000, 0x2204, 0xa084, 0x0fff,
++	0xa105, 0x2012, 0x007c, 0x2011, 0x0102, 0x2204, 0xa084, 0xffcf,
++	0xa105, 0x2012, 0x007c, 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e,
++	0x2061, 0x0100, 0x609a, 0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x8103,
++	0x8003, 0xa080, 0x0022, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4,
++	0xa084, 0xffdf, 0x60ae, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080,
++	0x0022, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0xa085, 0x0020,
++	0x60ae, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e,
++	0x2061, 0x0100, 0x609a, 0x60a4, 0x62ae, 0x2010, 0x60a4, 0x63ae,
++	0x2018, 0x0c7f, 0x007c, 0x2091, 0x8000, 0x0c7e, 0x0e7e, 0x6818,
++	0xa005, 0x0040, 0x221e, 0x2061, 0x7100, 0x1078, 0x2226, 0x0040,
++	0x220a, 0x20a9, 0x0000, 0x2061, 0x7000, 0x0c7e, 0x1078, 0x2226,
++	0x0040, 0x21fa, 0x0c7f, 0x8c60, 0x0070, 0x21f8, 0x0078, 0x21ed,
++	0x0078, 0x221e, 0x007f, 0xa082, 0x7000, 0x2071, 0x4d40, 0x7086,
++	0x7182, 0x2001, 0x0004, 0x706e, 0x7093, 0x000f, 0x1078, 0x209b,
++	0x0078, 0x221a, 0x60c0, 0xa005, 0x00c0, 0x221e, 0x2071, 0x4d40,
++	0x7182, 0x2c00, 0x708a, 0x2001, 0x0006, 0x706e, 0x7093, 0x000f,
++	0x1078, 0x209b, 0x2001, 0x0000, 0x0078, 0x2220, 0x2001, 0x0001,
++	0x2091, 0x8001, 0xa005, 0x0e7f, 0x0c7f, 0x007c, 0x2c04, 0xa005,
++	0x0040, 0x223d, 0x2060, 0x6010, 0xa306, 0x00c0, 0x223a, 0x600c,
++	0xa206, 0x00c0, 0x223a, 0x6014, 0xa106, 0x00c0, 0x223a, 0xa006,
++	0x0078, 0x223f, 0x6000, 0x0078, 0x2227, 0xa085, 0x0001, 0x007c,
++	0x2011, 0x4d41, 0x220c, 0xa18c, 0x000f, 0x2011, 0x013b, 0x2204,
++	0xa084, 0x0100, 0x0040, 0x2256, 0x2021, 0xff04, 0x2122, 0x810b,
++	0x810b, 0x810b, 0x810b, 0xa18d, 0x0f00, 0x2104, 0x007c, 0x0e7e,
++	0x68e4, 0xa08c, 0x0020, 0x0040, 0x22aa, 0xa084, 0x0006, 0x00c0,
++	0x22aa, 0x6014, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++	0xa0f0, 0x4f80, 0x7004, 0xa084, 0x000a, 0x00c0, 0x22aa, 0x7108,
++	0xa194, 0xff00, 0x0040, 0x22aa, 0xa18c, 0x00ff, 0x2001, 0x000c,
++	0xa106, 0x0040, 0x2291, 0x2001, 0x0012, 0xa106, 0x0040, 0x2295,
++	0x2001, 0x0014, 0xa106, 0x0040, 0x2299, 0x2001, 0x0019, 0xa106,
++	0x0040, 0x229d, 0x2001, 0x0032, 0xa106, 0x0040, 0x22a1, 0x0078,
++	0x22a5, 0x2009, 0x0012, 0x0078, 0x22a7, 0x2009, 0x0014, 0x0078,
++	0x22a7, 0x2009, 0x0019, 0x0078, 0x22a7, 0x2009, 0x0020, 0x0078,
++	0x22a7, 0x2009, 0x003f, 0x0078, 0x22a7, 0x2011, 0x0000, 0x2100,
++	0xa205, 0x700a, 0x0e7f, 0x007c, 0x0068, 0x22ac, 0x2091, 0x8000,
++	0x2071, 0x0000, 0x007e, 0x7018, 0xa084, 0x0001, 0x00c0, 0x22b3,
++	0x007f, 0x2071, 0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002,
++	0x70db, 0x0737, 0x70df, 0x0000, 0x2071, 0x0000, 0x701b, 0x0001,
++	0x2091, 0x4080, 0x0078, 0x22ca, 0x107e, 0x007e, 0x127e, 0x2091,
++	0x2300, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x77c2, 0x74c6, 0x76ca,
++	0x75ce, 0xa594, 0x003f, 0xa49c, 0x0003, 0xa484, 0x000f, 0x0079,
++	0x22e1, 0x22f3, 0x22f3, 0x22f3, 0x2624, 0x3741, 0x22f1, 0x2322,
++	0x232c, 0x22f1, 0x22f1, 0x22f1, 0x22f1, 0x22f1, 0x22f1, 0x22f1,
++	0x22f1, 0x1078, 0x22ac, 0x8507, 0xa084, 0x001f, 0x0079, 0x22f8,
++	0x2336, 0x2624, 0x27d8, 0x28d5, 0x28fd, 0x2b6d, 0x2e18, 0x2e5b,
++	0x2ea6, 0x2f2b, 0x2fb1, 0x3056, 0x2322, 0x26fc, 0x2ded, 0x2318,
++	0x3a92, 0x3ab2, 0x3be5, 0x3bf1, 0x3ca2, 0x2318, 0x2318, 0x3d53,
++	0x3d57, 0x3a90, 0x2318, 0x3b8c, 0x2318, 0x399a, 0x232c, 0x2318,
++	0x1078, 0x22ac, 0x0018, 0x22d1, 0x127f, 0x2091, 0x8001, 0x007f,
++	0x107f, 0x007c, 0x2019, 0x4a07, 0x1078, 0x2137, 0x702f, 0x0001,
++	0x781b, 0x004f, 0x0078, 0x231a, 0x2019, 0x4955, 0x1078, 0x2137,
++	0x702f, 0x8000, 0x781b, 0x00e1, 0x0078, 0x231a, 0x7242, 0x2009,
++	0x4d0f, 0x200b, 0x0000, 0xa584, 0x0001, 0x00c0, 0x39a6, 0x0040,
++	0x2353, 0x1078, 0x22ac, 0x7003, 0x0000, 0x704b, 0x0000, 0x7043,
++	0x0000, 0x7037, 0x0000, 0x1078, 0x371d, 0x0018, 0x22d1, 0x2009,
++	0x4d0f, 0x200b, 0x0000, 0x7068, 0xa005, 0x00c0, 0x2426, 0x706c,
++	0xa084, 0x0007, 0x0079, 0x235c, 0x245d, 0x2364, 0x2370, 0x238f,
++	0x23b3, 0x2404, 0x23db, 0x2364, 0x1078, 0x3705, 0x2009, 0x0048,
++	0x1078, 0x2cc3, 0x00c0, 0x236e, 0x7003, 0x0004, 0x0078, 0x231a,
++	0x1078, 0x3705, 0x00c0, 0x238d, 0x7080, 0x8007, 0x789b, 0x0080,
++	0x78aa, 0x789b, 0x0010, 0x78ab, 0x000c, 0x789b, 0x0060, 0x78ab,
++	0x0001, 0x785b, 0x0004, 0x2009, 0x00f2, 0x1078, 0x2cb7, 0x00c0,
++	0x238d, 0x7003, 0x0004, 0x7093, 0x000f, 0x0078, 0x231a, 0x1078,
++	0x3705, 0x00c0, 0x23b1, 0x7180, 0x8107, 0x789b, 0x0080, 0x78aa,
++	0x789b, 0x0010, 0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0x78ab,
++	0x0006, 0x789b, 0x0060, 0x78ab, 0x0002, 0x785b, 0x0004, 0x2009,
++	0x00f2, 0x1078, 0x2cb7, 0x00c0, 0x23b1, 0x7003, 0x0004, 0x7093,
++	0x000f, 0x0078, 0x231a, 0x1078, 0x3705, 0x00c0, 0x23d9, 0x7180,
++	0x8107, 0x789b, 0x0080, 0x78aa, 0x789b, 0x0010, 0xa18c, 0x001f,
++	0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0020, 0x7184, 0x79aa, 0x78ab,
++	0x000d, 0x789b, 0x0060, 0x78ab, 0x0004, 0x785b, 0x0004, 0x2009,
++	0x00f2, 0x1078, 0x2cb7, 0x00c0, 0x23d9, 0x7003, 0x0004, 0x7093,
++	0x000f, 0x0078, 0x231a, 0x1078, 0x3705, 0x00c0, 0x2402, 0x7180,
++	0x8107, 0x789b, 0x0080, 0x78aa, 0x789b, 0x0010, 0xa18c, 0x001f,
++	0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab,
++	0x0002, 0x785b, 0x0004, 0x2009, 0x00f2, 0x1078, 0x2cb7, 0x00c0,
++	0x2402, 0x7088, 0x708b, 0x0000, 0x2068, 0x704a, 0x7003, 0x0002,
++	0x7093, 0x000f, 0x0078, 0x231a, 0x1078, 0x3705, 0x00c0, 0x231a,
++	0x7088, 0x2068, 0x6f14, 0x1078, 0x35fc, 0x2c50, 0x1078, 0x37b5,
++	0x789b, 0x0010, 0x6814, 0xa084, 0x001f, 0xa085, 0x0080, 0x78aa,
++	0x6e1c, 0x2041, 0x0001, 0x708c, 0xa084, 0x0400, 0x2001, 0x0004,
++	0x0040, 0x2424, 0x2001, 0x0006, 0x0078, 0x2545, 0x1078, 0x3705,
++	0x00c0, 0x231a, 0x789b, 0x0010, 0x7068, 0x2068, 0x6f14, 0x1078,
++	0x35fc, 0x2c50, 0x1078, 0x37b5, 0x6008, 0xa085, 0x0010, 0x600a,
++	0x6824, 0xa005, 0x0040, 0x2444, 0xa082, 0x0006, 0x0048, 0x2442,
++	0x0078, 0x2444, 0x6827, 0x0005, 0x6b14, 0xa39c, 0x001f, 0xa39d,
++	0x00c0, 0x7058, 0xa084, 0x8000, 0x0040, 0x2452, 0xa684, 0x0001,
++	0x0040, 0x2454, 0xa39c, 0xffbf, 0x7baa, 0x2031, 0x0020, 0x2041,
++	0x0001, 0x2001, 0x0003, 0x0078, 0x2545, 0x0018, 0x22d1, 0x744c,
++	0xa485, 0x0000, 0x0040, 0x2477, 0xa080, 0x4d80, 0x2030, 0x7150,
++	0x8108, 0xa12a, 0x0048, 0x246e, 0x2009, 0x4d80, 0x2164, 0x6504,
++	0x85ff, 0x00c0, 0x2488, 0x8421, 0x00c0, 0x2468, 0x7152, 0x7003,
++	0x0000, 0x704b, 0x0000, 0x7040, 0xa005, 0x0040, 0x39a6, 0x0078,
++	0x231a, 0x764c, 0xa6b0, 0x4d80, 0x7150, 0x2600, 0x0078, 0x2473,
++	0x7152, 0x2568, 0x2558, 0x754a, 0x2c50, 0x6034, 0xa085, 0x0000,
++	0x00c0, 0x2485, 0x6708, 0x773a, 0xa784, 0x033f, 0x0040, 0x24be,
++	0xa784, 0x0021, 0x00c0, 0x2485, 0xa784, 0x0002, 0x0040, 0x24a7,
++	0xa784, 0x0004, 0x0040, 0x2485, 0xa7bc, 0xfffb, 0x670a, 0xa784,
++	0x0008, 0x00c0, 0x2485, 0xa784, 0x0010, 0x00c0, 0x2485, 0xa784,
++	0x0200, 0x00c0, 0x2485, 0xa784, 0x0100, 0x0040, 0x24be, 0x6018,
++	0xa005, 0x00c0, 0x2485, 0xa7bc, 0xfeff, 0x670a, 0x6823, 0x0000,
++	0x6e1c, 0xa684, 0x000e, 0x6118, 0x0040, 0x24ce, 0x601c, 0xa102,
++	0x0048, 0x24d1, 0x0040, 0x24d1, 0x0078, 0x2481, 0x81ff, 0x00c0,
++	0x2481, 0x68c3, 0x0000, 0xa784, 0x0080, 0x00c0, 0x24d9, 0x700c,
++	0x6022, 0xa7bc, 0xff7f, 0x670a, 0x1078, 0x37b5, 0x0018, 0x22d1,
++	0x789b, 0x0010, 0xa046, 0x1078, 0x3705, 0x00c0, 0x231a, 0x6b14,
++	0xa39c, 0x001f, 0xa39d, 0x00c0, 0x7058, 0xa084, 0x8000, 0x0040,
++	0x24f5, 0xa684, 0x0001, 0x0040, 0x24f7, 0xa39c, 0xffbf, 0xa684,
++	0x0010, 0x0040, 0x24fd, 0xa39d, 0x0020, 0x7baa, 0x8840, 0xa684,
++	0x000e, 0x00c0, 0x2508, 0xa7bd, 0x0010, 0x670a, 0x0078, 0x2543,
++	0x7158, 0xa18c, 0x0800, 0x0040, 0x322a, 0x2011, 0x0020, 0xa684,
++	0x0008, 0x00c0, 0x2519, 0x8210, 0xa684, 0x0002, 0x00c0, 0x2519,
++	0x8210, 0x7aaa, 0x8840, 0x1078, 0x371d, 0x6a14, 0x610c, 0x8108,
++	0xa18c, 0x00ff, 0xa1e0, 0x7000, 0x2c64, 0x8cff, 0x0040, 0x253a,
++	0x6014, 0xa206, 0x00c0, 0x2524, 0x60b8, 0x8001, 0x60ba, 0x00c0,
++	0x251f, 0x0c7e, 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x0c7f,
++	0x0078, 0x245d, 0x1078, 0x3705, 0x00c0, 0x231a, 0x2a60, 0x610e,
++	0x79aa, 0x8840, 0x7132, 0x2001, 0x0001, 0x007e, 0x715c, 0xa184,
++	0x0018, 0x0040, 0x2560, 0xa184, 0x0010, 0x0040, 0x2553, 0x1078,
++	0x3429, 0x00c0, 0x2583, 0xa184, 0x0008, 0x0040, 0x2560, 0x69a0,
++	0xa184, 0x0600, 0x00c0, 0x2560, 0x1078, 0x331a, 0x0078, 0x2583,
++	0x69a0, 0xa184, 0x0800, 0x0040, 0x2577, 0x0c7e, 0x027e, 0x2960,
++	0x6000, 0xa085, 0x2000, 0x6002, 0x6104, 0xa18d, 0x0010, 0x6106,
++	0x027f, 0x0c7f, 0x1078, 0x3429, 0x00c0, 0x2583, 0x69a0, 0xa184,
++	0x0200, 0x0040, 0x257f, 0x1078, 0x3369, 0x0078, 0x2583, 0xa184,
++	0x0400, 0x00c0, 0x255c, 0x69a0, 0xa184, 0x1000, 0x0040, 0x258e,
++	0x6914, 0xa18c, 0xff00, 0x810f, 0x1078, 0x21af, 0x007f, 0x7002,
++	0xa68c, 0x0060, 0xa684, 0x0060, 0x0040, 0x259c, 0xa086, 0x0060,
++	0x00c0, 0x259c, 0xa18d, 0x4000, 0x88ff, 0x0040, 0x25a1, 0xa18d,
++	0x0004, 0x795a, 0x69b6, 0x789b, 0x0060, 0x2800, 0x78aa, 0x789b,
++	0x0061, 0x6818, 0xa085, 0x8000, 0x681a, 0x78aa, 0x8008, 0x810c,
++	0x0040, 0x3230, 0xa18c, 0x00f8, 0x00c0, 0x3230, 0x157e, 0x137e,
++	0x147e, 0x20a1, 0x012c, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80,
++	0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6814, 0x8007,
++	0x789b, 0x0080, 0x78aa, 0x6d94, 0x7dd6, 0x7dde, 0x6e98, 0x7ed2,
++	0x7eda, 0x1078, 0x3705, 0x00c0, 0x25e6, 0x702c, 0x8003, 0x0048,
++	0x25df, 0x2019, 0x4955, 0x1078, 0x2137, 0x702f, 0x8000, 0x7830,
++	0xa084, 0x00c0, 0x00c0, 0x25e6, 0x0098, 0x25ee, 0x6008, 0xa084,
++	0xffef, 0x600a, 0x1078, 0x371d, 0x0078, 0x2343, 0x7200, 0xa284,
++	0x0007, 0xa086, 0x0001, 0x00c0, 0x25fb, 0x781b, 0x004f, 0x1078,
++	0x371d, 0x0078, 0x260c, 0x6ab4, 0xa295, 0x2000, 0x7a5a, 0x781b,
++	0x004f, 0x1078, 0x371d, 0x7200, 0x2500, 0xa605, 0x0040, 0x260c,
++	0xa284, 0x0007, 0x1079, 0x261a, 0xad80, 0x0009, 0x7036, 0xa284,
++	0x0007, 0xa086, 0x0001, 0x00c0, 0x231a, 0x6018, 0x8000, 0x601a,
++	0x0078, 0x231a, 0x2622, 0x45ed, 0x45ed, 0x45dc, 0x45ed, 0x2622,
++	0x45dc, 0x2622, 0x1078, 0x22ac, 0x1078, 0x3705, 0x0f7e, 0x2079,
++	0x4d00, 0x78cc, 0x0f7f, 0xa084, 0x0001, 0x0040, 0x2648, 0x706c,
++	0xa086, 0x0001, 0x00c0, 0x2637, 0x706e, 0x0078, 0x26d9, 0x706c,
++	0xa086, 0x0005, 0x00c0, 0x2646, 0x7088, 0x2068, 0x681b, 0x0004,
++	0x6817, 0x0000, 0x6820, 0xa085, 0x0008, 0x6822, 0x706f, 0x0000,
++	0x2011, 0x0004, 0x716c, 0xa186, 0x0001, 0x0040, 0x2669, 0xa186,
++	0x0007, 0x00c0, 0x2659, 0x2009, 0x4d38, 0x200b, 0x0005, 0x0078,
++	0x2669, 0x2009, 0x4d13, 0x2104, 0x2009, 0x4d12, 0x200a, 0x2009,
++	0x4d38, 0x200b, 0x0001, 0x706f, 0x0000, 0x7073, 0x0001, 0x0078,
++	0x266b, 0x706f, 0x0000, 0x1078, 0x431b, 0x157e, 0x20a9, 0x0010,
++	0x2039, 0x0000, 0x1078, 0x34f9, 0xa7b8, 0x0100, 0x0070, 0x267a,
++	0x0078, 0x2672, 0x157f, 0x7000, 0x0079, 0x267e, 0x26aa, 0x2693,
++	0x2693, 0x2686, 0x26aa, 0x26aa, 0x26aa, 0x26aa, 0x2021, 0x4d5a,
++	0x2404, 0xa005, 0x0040, 0x26aa, 0xad06, 0x00c0, 0x2693, 0x6800,
++	0x2022, 0x0078, 0x26a3, 0x6820, 0xa084, 0x0001, 0x00c0, 0x269f,
++	0x6f14, 0x1078, 0x35fc, 0x1078, 0x3201, 0x0078, 0x26a3, 0x7060,
++	0x2060, 0x6800, 0x6002, 0x6a1a, 0x6820, 0xa085, 0x0008, 0x6822,
++	0x1078, 0x1b8e, 0x2021, 0x7100, 0x1078, 0x26e6, 0x2021, 0x4d5a,
++	0x1078, 0x26e6, 0x157e, 0x20a9, 0x0000, 0x2021, 0x7000, 0x1078,
++	0x26e6, 0x8420, 0x0070, 0x26be, 0x0078, 0x26b7, 0x2061, 0x5000,
++	0x2021, 0x0002, 0x20a9, 0x0100, 0x6018, 0x6110, 0x81ff, 0x0040,
++	0x26cd, 0xa102, 0x0050, 0x26cd, 0x6012, 0x601b, 0x0000, 0xace0,
++	0x0010, 0x0070, 0x26d5, 0x0078, 0x26c4, 0x8421, 0x00c0, 0x26c2,
++	0x157f, 0x709c, 0xa084, 0x8000, 0x0040, 0x26e0, 0x1078, 0x3810,
++	0x7003, 0x0000, 0x704b, 0x0000, 0x0078, 0x231a, 0x047e, 0x2404,
++	0xa005, 0x0040, 0x26f8, 0x2068, 0x6800, 0x007e, 0x6a1a, 0x6820,
++	0xa085, 0x0008, 0x6822, 0x1078, 0x1b8e, 0x007f, 0x0078, 0x26e8,
++	0x047f, 0x2023, 0x0000, 0x007c, 0xa282, 0x0003, 0x0050, 0x2702,
++	0x1078, 0x22ac, 0x2300, 0x0079, 0x2705, 0x2708, 0x277b, 0x2798,
++	0xa282, 0x0002, 0x0040, 0x270e, 0x1078, 0x22ac, 0x706c, 0x706f,
++	0x0000, 0x7093, 0x0000, 0x0079, 0x2715, 0x271d, 0x271d, 0x271f,
++	0x2753, 0x3236, 0x271d, 0x2753, 0x271d, 0x1078, 0x22ac, 0x7780,
++	0x1078, 0x34f9, 0x7780, 0xa7bc, 0x0f00, 0x1078, 0x35fc, 0x6018,
++	0xa005, 0x0040, 0x274a, 0x2021, 0x7100, 0x2009, 0x0004, 0x2011,
++	0x0010, 0x1078, 0x27b3, 0x0040, 0x274a, 0x157e, 0x20a9, 0x0000,
++	0x2021, 0x7000, 0x047e, 0x2009, 0x0004, 0x2011, 0x0010, 0x1078,
++	0x27b3, 0x047f, 0x0040, 0x2749, 0x8420, 0x0070, 0x2749, 0x0078,
++	0x273a, 0x157f, 0x8738, 0xa784, 0x001f, 0x00c0, 0x2725, 0x0078,
++	0x2343, 0x0078, 0x2343, 0x7780, 0x1078, 0x35fc, 0x6018, 0xa005,
++	0x0040, 0x2779, 0x2021, 0x7100, 0x2009, 0x0005, 0x2011, 0x0020,
++	0x1078, 0x27b3, 0x0040, 0x2779, 0x157e, 0x20a9, 0x0000, 0x2021,
++	0x7000, 0x047e, 0x2009, 0x0005, 0x2011, 0x0020, 0x1078, 0x27b3,
++	0x047f, 0x0040, 0x2778, 0x8420, 0x0070, 0x2778, 0x0078, 0x2769,
++	0x157f, 0x0078, 0x2343, 0x2200, 0x0079, 0x277e, 0x2781, 0x2783,
++	0x2783, 0x1078, 0x22ac, 0x2009, 0x0012, 0x706c, 0xa086, 0x0002,
++	0x0040, 0x278c, 0x2009, 0x000e, 0x6818, 0xa084, 0x8000, 0x0040,
++	0x2792, 0x691a, 0x706f, 0x0000, 0x7073, 0x0001, 0x0078, 0x3693,
++	0x2200, 0x0079, 0x279b, 0x27a0, 0x2783, 0x279e, 0x1078, 0x22ac,
++	0x1078, 0x431b, 0x7000, 0xa086, 0x0001, 0x00c0, 0x31c6, 0x1078,
++	0x3217, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x31b9, 0x0040,
++	0x31c6, 0x0078, 0x245d, 0x2404, 0xa005, 0x0040, 0x27d4, 0x2068,
++	0x2d04, 0x007e, 0x6814, 0xa706, 0x0040, 0x27c2, 0x2d20, 0x007f,
++	0x0078, 0x27b4, 0x007f, 0x2022, 0x691a, 0x6820, 0xa205, 0x6822,
++	0x1078, 0x1b8e, 0x6010, 0x8001, 0x6012, 0x6008, 0xa084, 0xffef,
++	0x600a, 0x1078, 0x3217, 0x007c, 0xa085, 0x0001, 0x0078, 0x27d3,
++	0x2300, 0x0079, 0x27db, 0x27e0, 0x27de, 0x2879, 0x1078, 0x22ac,
++	0x78ec, 0xa084, 0x0001, 0x00c0, 0x27f4, 0x7000, 0xa086, 0x0004,
++	0x00c0, 0x27ec, 0x0078, 0x2817, 0x1078, 0x3217, 0x6008, 0xa084,
++	0xffef, 0x600a, 0x0078, 0x31c6, 0x78e4, 0xa005, 0x00d0, 0x2817,
++	0x0018, 0x2817, 0x2008, 0xa084, 0x0030, 0x00c0, 0x2803, 0x781b,
++	0x004f, 0x0078, 0x231a, 0x78ec, 0xa084, 0x0003, 0x0040, 0x27ff,
++	0x2100, 0xa084, 0x0007, 0x0079, 0x280d, 0x2850, 0x285b, 0x2841,
++	0x2815, 0x36f8, 0x36f8, 0x2815, 0x286a, 0x1078, 0x22ac, 0x7000,
++	0xa086, 0x0004, 0x00c0, 0x2831, 0x706c, 0xa086, 0x0002, 0x00c0,
++	0x2827, 0x2011, 0x0002, 0x2019, 0x0000, 0x0078, 0x26fc, 0x706c,
++	0xa086, 0x0006, 0x0040, 0x2821, 0x706c, 0xa086, 0x0004, 0x0040,
++	0x2821, 0x79e4, 0xa184, 0x0030, 0x0040, 0x283b, 0x78ec, 0xa084,
++	0x0003, 0x00c0, 0x283d, 0x0078, 0x2ded, 0x2001, 0x0003, 0x0078,
++	0x2b81, 0x6818, 0xa084, 0x8000, 0x0040, 0x2848, 0x681b, 0x001d,
++	0x1078, 0x34d8, 0x782b, 0x3008, 0x781b, 0x005b, 0x0078, 0x231a,
++	0x6818, 0xa084, 0x8000, 0x0040, 0x2857, 0x681b, 0x001d, 0x1078,
++	0x34d8, 0x0078, 0x36c3, 0x6818, 0xa084, 0x8000, 0x0040, 0x2862,
++	0x681b, 0x001d, 0x1078, 0x34d8, 0x782b, 0x3008, 0x781b, 0x00de,
++	0x0078, 0x231a, 0x6818, 0xa084, 0x8000, 0x0040, 0x2871, 0x681b,
++	0x001d, 0x1078, 0x34d8, 0x782b, 0x3008, 0x781b, 0x009c, 0x0078,
++	0x231a, 0xa584, 0x000f, 0x00c0, 0x2896, 0x7000, 0x0079, 0x2880,
++	0x2343, 0x288a, 0x2888, 0x31c6, 0x31c6, 0x31c6, 0x31c6, 0x2888,
++	0x1078, 0x22ac, 0x1078, 0x3217, 0x6008, 0xa084, 0xffef, 0x600a,
++	0x1078, 0x31b9, 0x0040, 0x31c6, 0x0078, 0x245d, 0x78e4, 0xa005,
++	0x00d0, 0x2817, 0x0018, 0x2817, 0x2008, 0xa084, 0x0030, 0x00c0,
++	0x28a5, 0x781b, 0x004f, 0x0078, 0x231a, 0x78ec, 0xa084, 0x0003,
++	0x0040, 0x28a1, 0x2100, 0xa184, 0x0007, 0x0079, 0x28af, 0x28c1,
++	0x28c5, 0x28b9, 0x28b7, 0x36f8, 0x36f8, 0x28b7, 0x36ee, 0x1078,
++	0x22ac, 0x1078, 0x34e0, 0x782b, 0x3008, 0x781b, 0x005b, 0x0078,
++	0x231a, 0x1078, 0x34e0, 0x0078, 0x36c3, 0x1078, 0x34e0, 0x782b,
++	0x3008, 0x781b, 0x00de, 0x0078, 0x231a, 0x1078, 0x34e0, 0x782b,
++	0x3008, 0x781b, 0x009c, 0x0078, 0x231a, 0x2300, 0x0079, 0x28d8,
++	0x28dd, 0x28db, 0x28df, 0x1078, 0x22ac, 0x0078, 0x2f2b, 0x681b,
++	0x0008, 0x78a3, 0x0000, 0x79e4, 0xa184, 0x0030, 0x0040, 0x2f2b,
++	0x78ec, 0xa084, 0x0003, 0x0040, 0x2f2b, 0xa184, 0x0007, 0x0079,
++	0x28f1, 0x28f9, 0x28c5, 0x2841, 0x3693, 0x36f8, 0x36f8, 0x28f9,
++	0x36ee, 0x1078, 0x36a7, 0x0078, 0x231a, 0xa282, 0x0005, 0x0050,
++	0x2903, 0x1078, 0x22ac, 0x2300, 0x0079, 0x2906, 0x2909, 0x2b2e,
++	0x2b3c, 0x2200, 0x0079, 0x290c, 0x2926, 0x2913, 0x2926, 0x2911,
++	0x2b13, 0x1078, 0x22ac, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff,
++	0xa082, 0x0020, 0x0048, 0x34be, 0xa08a, 0x0004, 0x00c8, 0x34be,
++	0x0079, 0x2922, 0x34be, 0x34be, 0x34be, 0x346c, 0x789b, 0x0018,
++	0x79a8, 0xa184, 0x0080, 0x0040, 0x2937, 0x0078, 0x34be, 0x7000,
++	0xa005, 0x00c0, 0x292d, 0x2011, 0x0004, 0x0078, 0x3069, 0xa184,
++	0x00ff, 0xa08a, 0x0010, 0x00c8, 0x34be, 0x0079, 0x293f, 0x2951,
++	0x294f, 0x2969, 0x296d, 0x29ff, 0x34be, 0x34be, 0x2a01, 0x34be,
++	0x34be, 0x2b0f, 0x2b0f, 0x34be, 0x34be, 0x34be, 0x2b11, 0x1078,
++	0x22ac, 0xa684, 0x1000, 0x0040, 0x295e, 0x2001, 0x0500, 0x8000,
++	0x8000, 0x783a, 0x781b, 0x009a, 0x0078, 0x231a, 0x6818, 0xa084,
++	0x8000, 0x0040, 0x2967, 0x681b, 0x001d, 0x0078, 0x2955, 0x0078,
++	0x3693, 0x681b, 0x001d, 0x0078, 0x34ce, 0x6920, 0x6922, 0xa684,
++	0x1800, 0x00c0, 0x2987, 0x6820, 0xa084, 0x0001, 0x00c0, 0x298d,
++	0x6818, 0xa086, 0x0008, 0x00c0, 0x297f, 0x681b, 0x0000, 0xa684,
++	0x0400, 0x0040, 0x29fb, 0x781b, 0x005d, 0x0078, 0x231a, 0xa684,
++	0x1000, 0x0040, 0x298d, 0x0078, 0x231a, 0xa684, 0x0060, 0x0040,
++	0x29f7, 0xa684, 0x0800, 0x0040, 0x29f7, 0xa684, 0x8000, 0x00c0,
++	0x299b, 0x0078, 0x29b5, 0xa6b4, 0x7fff, 0x7e5a, 0x6eb6, 0x789b,
++	0x0076, 0x7aac, 0x79ac, 0x78ac, 0x801b, 0x00c8, 0x29a8, 0x8000,
++	0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302,
++	0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0xa684, 0x4000, 0x0040,
++	0x29bd, 0xa6b4, 0xbfff, 0x7e5a, 0x6eb6, 0x7000, 0xa086, 0x0003,
++	0x00c0, 0x29ca, 0x1078, 0x43d1, 0x1078, 0x45dc, 0x781b, 0x006c,
++	0x0078, 0x231a, 0xa006, 0x1078, 0x46d8, 0x6ab0, 0x69ac, 0x6c98,
++	0x6b94, 0x2200, 0xa105, 0x0040, 0x29d9, 0x2200, 0xa422, 0x2100,
++	0xa31b, 0x6caa, 0x7cd2, 0x6ba6, 0x7bd6, 0x2300, 0xa405, 0x00c0,
++	0x29e9, 0xa6b5, 0x4000, 0x7e5a, 0x6eb6, 0x781b, 0x006c, 0x0078,
++	0x231a, 0x781b, 0x006c, 0x2200, 0xa115, 0x00c0, 0x29f3, 0x1078,
++	0x45ed, 0x0078, 0x231a, 0x1078, 0x4638, 0x0078, 0x231a, 0x781b,
++	0x006d, 0x0078, 0x231a, 0x781b, 0x005d, 0x0078, 0x231a, 0x1078,
++	0x22ac, 0x0078, 0x2a62, 0x6920, 0xa184, 0x0100, 0x0040, 0x2a19,
++	0xa18c, 0xfeff, 0x6922, 0x0c7e, 0x7054, 0x2060, 0x6000, 0xa084,
++	0xefff, 0x6002, 0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x0078,
++	0x2a51, 0xa184, 0x0200, 0x0040, 0x2a51, 0xa18c, 0xfdff, 0x6922,
++	0x0c7e, 0x7054, 0x2060, 0x6000, 0xa084, 0xdfff, 0x6002, 0x6004,
++	0xa084, 0xffef, 0x6006, 0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0008,
++	0x0040, 0x2a51, 0x1078, 0x35f8, 0x1078, 0x331a, 0x88ff, 0x0040,
++	0x2a51, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5, 0x0004,
++	0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2a4b, 0x782b, 0x3008, 0x781b,
++	0x005b, 0x0078, 0x231a, 0x782b, 0x3008, 0x781b, 0x006d, 0x0078,
++	0x231a, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2a5a, 0x781b, 0x005d,
++	0x0078, 0x231a, 0x781b, 0x006d, 0x0078, 0x231a, 0x0078, 0x34c6,
++	0x0078, 0x34c6, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007, 0x0040,
++	0x2a60, 0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001,
++	0x00c0, 0x2aa0, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040,
++	0x2a98, 0x0048, 0x2a7d, 0x0078, 0x2a9a, 0xa380, 0x0002, 0xa102,
++	0x00c8, 0x2a98, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0c7e, 0x7054,
++	0x2060, 0x6000, 0xa084, 0xefef, 0x6002, 0x6004, 0xa084, 0xffe5,
++	0x6006, 0x0c7f, 0x7e58, 0xa6b4, 0xfffb, 0x7e5a, 0x0078, 0x2a52,
++	0x0078, 0x2a03, 0x24a8, 0x7aa8, 0x00f0, 0x2a9a, 0x0078, 0x2a6b,
++	0xa284, 0x00f0, 0xa086, 0x0020, 0x00c0, 0x2b00, 0x8318, 0x8318,
++	0x2300, 0xa102, 0x0040, 0x2ab0, 0x0048, 0x2ab0, 0x0078, 0x2afd,
++	0xa286, 0x0023, 0x0040, 0x2a60, 0x681c, 0xa084, 0xfff1, 0x681e,
++	0x7e58, 0xa684, 0xfff1, 0xa085, 0x0010, 0x2030, 0x7e5a, 0x6008,
++	0xa085, 0x0010, 0x600a, 0x0c7e, 0x7054, 0x2060, 0x6004, 0x2008,
++	0x2c48, 0x0c7f, 0xa184, 0x0010, 0x0040, 0x2ad4, 0x1078, 0x35f8,
++	0x1078, 0x3429, 0x0078, 0x2ae3, 0x0c7e, 0x7054, 0x2060, 0x6004,
++	0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0008, 0x0040, 0x2a51, 0x1078,
++	0x35f8, 0x1078, 0x331a, 0x88ff, 0x0040, 0x2a51, 0x789b, 0x0060,
++	0x2800, 0x78aa, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0,
++	0x2af7, 0x782b, 0x3008, 0x781b, 0x005b, 0x0078, 0x231a, 0x782b,
++	0x3008, 0x781b, 0x006d, 0x0078, 0x231a, 0x7aa8, 0x0078, 0x2a6b,
++	0x8318, 0x2300, 0xa102, 0x0040, 0x2b09, 0x0048, 0x2b09, 0x0078,
++	0x2a6b, 0xa284, 0x0080, 0x00c0, 0x34ce, 0x0078, 0x34c6, 0x0078,
++	0x34ce, 0x0078, 0x34be, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff,
++	0xa08e, 0x0001, 0x0040, 0x2b1e, 0x1078, 0x22ac, 0x7aa8, 0xa294,
++	0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8, 0x34be,
++	0x0079, 0x2b2a, 0x34be, 0x3267, 0x34be, 0x33be, 0xa282, 0x0000,
++	0x00c0, 0x2b34, 0x1078, 0x22ac, 0x1078, 0x34d8, 0x782b, 0x3008,
++	0x781b, 0x006d, 0x0078, 0x231a, 0xa282, 0x0003, 0x00c0, 0x2b42,
++	0x1078, 0x22ac, 0xa484, 0x8000, 0x00c0, 0x2b65, 0x706c, 0xa005,
++	0x0040, 0x2b4c, 0x1078, 0x22ac, 0x6f14, 0x7782, 0xa7bc, 0x0f00,
++	0x1078, 0x35fc, 0x6008, 0xa085, 0x0021, 0x600a, 0x8738, 0xa784,
++	0x001f, 0x00c0, 0x2b50, 0x1078, 0x34dc, 0x706f, 0x0002, 0x2009,
++	0x4d38, 0x200b, 0x0009, 0x0078, 0x2b67, 0x1078, 0x34e8, 0x782b,
++	0x3008, 0x781b, 0x006d, 0x0078, 0x231a, 0xa282, 0x0004, 0x0050,
++	0x2b73, 0x1078, 0x22ac, 0x2300, 0x0079, 0x2b76, 0x2b79, 0x2c6c,
++	0x2c9f, 0xa286, 0x0003, 0x0040, 0x2b7f, 0x1078, 0x22ac, 0x2001,
++	0x0000, 0x007e, 0x68c0, 0xa005, 0x0040, 0x2b88, 0x7003, 0x0003,
++	0x68a0, 0xa084, 0x2000, 0x0040, 0x2b91, 0x6008, 0xa085, 0x0002,
++	0x600a, 0x007f, 0x703e, 0x7000, 0xa084, 0x0007, 0x0079, 0x2b98,
++	0x2343, 0x2ba2, 0x2ba2, 0x2d97, 0x2dd3, 0x2343, 0x2dd3, 0x2ba0,
++	0x1078, 0x22ac, 0xa684, 0x1000, 0x00c0, 0x2baa, 0x1078, 0x431b,
++	0x0040, 0x2c46, 0x7868, 0xa08c, 0x00ff, 0x0040, 0x2bf2, 0xa186,
++	0x0008, 0x00c0, 0x2bc1, 0x1078, 0x3217, 0x6008, 0xa084, 0xffef,
++	0x600a, 0x1078, 0x31b9, 0x0040, 0x2bf2, 0x1078, 0x431b, 0x0078,
++	0x2bd9, 0xa186, 0x0028, 0x00c0, 0x2bf2, 0x1078, 0x431b, 0x6008,
++	0xa084, 0xffef, 0x600a, 0x6018, 0xa005, 0x0040, 0x2bd9, 0x8001,
++	0x601a, 0xa005, 0x0040, 0x2bd9, 0x8001, 0xa005, 0x0040, 0x2bd9,
++	0x601e, 0x6820, 0xa084, 0x0001, 0x0040, 0x2343, 0x6820, 0xa084,
++	0xfffe, 0x6822, 0x7060, 0x0c7e, 0x2060, 0x6800, 0x6002, 0x0c7f,
++	0x6004, 0x6802, 0xa005, 0x2d00, 0x00c0, 0x2bef, 0x6002, 0x6006,
++	0x0078, 0x2343, 0x017e, 0x1078, 0x2cd0, 0x017f, 0xa684, 0xdf00,
++	0x681e, 0x682b, 0x0000, 0x6f14, 0x81ff, 0x0040, 0x2c46, 0xa186,
++	0x0002, 0x00c0, 0x2c3e, 0xa684, 0x0800, 0x00c0, 0x2c0f, 0xa684,
++	0x0060, 0x0040, 0x2c0f, 0x78d8, 0x7adc, 0x6832, 0x6a2e, 0x6820,
++	0xa084, 0x0800, 0x00c0, 0x2c46, 0x8717, 0xa294, 0x000f, 0x8213,
++	0x8213, 0x8213, 0xa290, 0x4f80, 0xa290, 0x0000, 0x221c, 0xa384,
++	0x0100, 0x00c0, 0x2c25, 0x0078, 0x2c2b, 0x8210, 0x2204, 0xa085,
++	0x0018, 0x2012, 0x8211, 0xa384, 0x0400, 0x0040, 0x2c38, 0x68a0,
++	0xa084, 0x0100, 0x00c0, 0x2c38, 0x1078, 0x2d4a, 0x0078, 0x2343,
++	0x6008, 0xa085, 0x0002, 0x600a, 0x0078, 0x2c46, 0xa186, 0x0018,
++	0x0040, 0x2c46, 0xa186, 0x0014, 0x0040, 0x2343, 0x6916, 0x6818,
++	0xa084, 0x8000, 0x0040, 0x2c4e, 0x703c, 0x681a, 0xa68c, 0xdf00,
++	0x691e, 0x1078, 0x3208, 0x1078, 0x3217, 0x00c0, 0x2c5b, 0x6008,
++	0xa084, 0xffef, 0x600a, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2c64,
++	0x1078, 0x3201, 0x0078, 0x2c68, 0x7060, 0x2060, 0x6800, 0x6002,
++	0x1078, 0x1b8e, 0x0078, 0x2343, 0xa282, 0x0004, 0x0048, 0x2c72,
++	0x1078, 0x22ac, 0x2200, 0x0079, 0x2c75, 0x2c70, 0x2c79, 0x2c86,
++	0x2c79, 0x7000, 0xa086, 0x0005, 0x0040, 0x2c82, 0x1078, 0x34d8,
++	0x782b, 0x3008, 0x781b, 0x006d, 0x0078, 0x231a, 0x7890, 0x8007,
++	0x8001, 0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c,
++	0x00ff, 0xa186, 0x0003, 0x0040, 0x2c9b, 0xa186, 0x0000, 0x0040,
++	0x2c9b, 0x0078, 0x34be, 0x781b, 0x006d, 0x0078, 0x231a, 0x6820,
++	0xa085, 0x0004, 0x6822, 0x82ff, 0x00c0, 0x2caa, 0x1078, 0x34d8,
++	0x0078, 0x2cb1, 0x8211, 0x0040, 0x2caf, 0x1078, 0x22ac, 0x1078,
++	0x34e8, 0x782b, 0x3008, 0x781b, 0x006d, 0x0078, 0x231a, 0x702c,
++	0x8003, 0x0048, 0x2cc1, 0x2019, 0x4955, 0x1078, 0x2137, 0x702f,
++	0x8000, 0x1078, 0x371d, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x2ccd,
++	0x0018, 0x2ccd, 0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c,
++	0xa684, 0x0060, 0x00c0, 0x2cda, 0x6833, 0x0000, 0x682f, 0x0000,
++	0x0078, 0x2d49, 0xa684, 0x0800, 0x00c0, 0x2cf2, 0x68b4, 0xa084,
++	0x4800, 0xa635, 0xa684, 0x0800, 0x00c0, 0x2cf2, 0x6998, 0x6a94,
++	0x6932, 0x6a2e, 0x7000, 0xa086, 0x0006, 0x0040, 0x2cf1, 0x1078,
++	0x431b, 0x007c, 0xa684, 0x0020, 0x0040, 0x2d14, 0xa684, 0x4000,
++	0x0040, 0x2d00, 0x6833, 0x0000, 0x682f, 0x0000, 0x0078, 0x2cea,
++	0x68b4, 0xa084, 0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, 0x2cfa,
++	0x703c, 0xa005, 0x00c0, 0x2d0e, 0x703f, 0x0015, 0x79d8, 0x7adc,
++	0x6932, 0x6a2e, 0x0078, 0x2cea, 0xa684, 0x4000, 0x0040, 0x2d1e,
++	0x6833, 0x0000, 0x682f, 0x0000, 0x0078, 0x2cea, 0x68b4, 0xa084,
++	0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, 0x2d18, 0x703c, 0xa005,
++	0x00c0, 0x2d2c, 0x703f, 0x0015, 0x79d8, 0x7adc, 0x78d0, 0x80fb,
++	0x00c8, 0x2d33, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
++	0x6932, 0x6a2e, 0x2100, 0xa205, 0x00c0, 0x2d40, 0x0078, 0x2cea,
++	0x7000, 0xa086, 0x0006, 0x0040, 0x2d49, 0x1078, 0x46d8, 0x0078,
++	0x2cea, 0x007c, 0x6008, 0xa085, 0x0200, 0x600a, 0xa384, 0x0200,
++	0x0040, 0x2d56, 0x6008, 0xa085, 0x0002, 0x600a, 0x681b, 0x0006,
++	0x688f, 0x0000, 0x6893, 0x0000, 0x6a2c, 0x6930, 0x6a3e, 0x6942,
++	0x682f, 0x0300, 0x6833, 0x0000, 0x6837, 0x2000, 0x6897, 0x0000,
++	0x689b, 0x0020, 0x68b3, 0x0000, 0x68af, 0x0000, 0x7000, 0x0079,
++	0x2d71, 0x2343, 0x2d7b, 0x2d84, 0x2d79, 0x2d79, 0x2d79, 0x2d79,
++	0x2d79, 0x1078, 0x22ac, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2d84,
++	0x1078, 0x3201, 0x0078, 0x2d8a, 0x7060, 0x2c50, 0x2060, 0x6800,
++	0x6002, 0x2a60, 0x2021, 0x4d5a, 0x2404, 0xa005, 0x0040, 0x2d93,
++	0x2020, 0x0078, 0x2d8c, 0x2d22, 0x206b, 0x0000, 0x007c, 0x1078,
++	0x3208, 0x1078, 0x3217, 0x6008, 0xa084, 0xfdff, 0x600a, 0x682b,
++	0x0000, 0x789b, 0x000e, 0x6f14, 0x6817, 0x0002, 0x1078, 0x472f,
++	0xa684, 0x0800, 0x0040, 0x2db0, 0x691c, 0xa18d, 0x2000, 0x691e,
++	0x6818, 0xa084, 0x8000, 0x0040, 0x2dc0, 0x7868, 0xa08c, 0x00ff,
++	0x0040, 0x2dbe, 0x681b, 0x001e, 0x0078, 0x2dc0, 0x681b, 0x0000,
++	0x2021, 0x4d5a, 0x2404, 0xad06, 0x0040, 0x2dc7, 0x7460, 0x6800,
++	0x2022, 0x68c3, 0x0000, 0x6a3c, 0x6940, 0x6a2e, 0x6932, 0x1078,
++	0x1b8e, 0x0078, 0x2343, 0x1078, 0x2cd0, 0x682b, 0x0000, 0x789b,
++	0x000e, 0x6f14, 0x1078, 0x3723, 0xa08c, 0x00ff, 0x6916, 0x6818,
++	0xa084, 0x8000, 0x0040, 0x2de6, 0x703c, 0x681a, 0xa68c, 0xdf00,
++	0x691e, 0x706f, 0x0000, 0x0078, 0x2343, 0x7000, 0xa005, 0x00c0,
++	0x2df3, 0x0078, 0x2343, 0xa006, 0x1078, 0x431b, 0x6817, 0x0000,
++	0x681b, 0x0014, 0xa68c, 0xdf00, 0x691e, 0x682b, 0x0000, 0x6820,
++	0xa085, 0x00ff, 0x6822, 0x7000, 0x0079, 0x2e06, 0x2343, 0x2e10,
++	0x2e10, 0x2e12, 0x2e12, 0x2e12, 0x2e12, 0x2e0e, 0x1078, 0x22ac,
++	0x1078, 0x3217, 0x6008, 0xa084, 0xffef, 0x600a, 0x0078, 0x31d1,
++	0x2300, 0x0079, 0x2e1b, 0x2e1e, 0x2e20, 0x2e59, 0x1078, 0x22ac,
++	0x7000, 0x0079, 0x2e23, 0x2343, 0x2e2d, 0x2e2d, 0x2e48, 0x2e2d,
++	0x2e55, 0x2e48, 0x2e2b, 0x1078, 0x22ac, 0xa684, 0x0060, 0xa086,
++	0x0060, 0x00c0, 0x2e44, 0xa6b4, 0xffdf, 0xa6b4, 0xbfff, 0xa6b5,
++	0x2000, 0x7e5a, 0x681c, 0xa084, 0xffdf, 0x681e, 0x1078, 0x431b,
++	0x1078, 0x45ed, 0x0078, 0x3693, 0xa684, 0x2000, 0x0040, 0x2e37,
++	0x6818, 0xa084, 0x8000, 0x0040, 0x2e55, 0x681b, 0x0015, 0xa684,
++	0x4000, 0x0040, 0x2e55, 0x681b, 0x0007, 0x1078, 0x36a7, 0x0078,
++	0x231a, 0x1078, 0x22ac, 0x2300, 0x0079, 0x2e5e, 0x2e61, 0x2e63,
++	0x2e96, 0x1078, 0x22ac, 0x7000, 0x0079, 0x2e66, 0x2343, 0x2e70,
++	0x2e70, 0x2e8b, 0x2e70, 0x2e92, 0x2e8b, 0x2e6e, 0x1078, 0x22ac,
++	0xa684, 0x0060, 0xa086, 0x0060, 0x00c0, 0x2e87, 0xa6b4, 0xffbf,
++	0xa6b4, 0xbfff, 0xa6b5, 0x2000, 0x7e5a, 0x681c, 0xa084, 0xffbf,
++	0x681e, 0x1078, 0x431b, 0x1078, 0x45ed, 0x0078, 0x3693, 0xa684,
++	0x2000, 0x0040, 0x2e7a, 0x6818, 0xa084, 0x8000, 0x0040, 0x2e92,
++	0x681b, 0x0007, 0x781b, 0x00de, 0x0078, 0x231a, 0x6820, 0xa085,
++	0x0004, 0x6822, 0x1078, 0x365e, 0xa6b5, 0x0800, 0x1078, 0x34d8,
++	0x782b, 0x3008, 0x781b, 0x006d, 0x0078, 0x231a, 0x2300, 0x0079,
++	0x2ea9, 0x2eac, 0x2eae, 0x2eb0, 0x1078, 0x22ac, 0x1078, 0x22ac,
++	0xa684, 0x0400, 0x00c0, 0x2ed9, 0x79e4, 0xa184, 0x0020, 0x0040,
++	0x2ec0, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2ec0, 0x782b, 0x3009,
++	0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x79e4,
++	0xa184, 0x0020, 0x0040, 0x2ed1, 0x78ec, 0xa084, 0x0003, 0x00c0,
++	0x2ed5, 0x2001, 0x0014, 0x0078, 0x2b81, 0xa184, 0x0007, 0x0079,
++	0x2f11, 0x7a90, 0xa294, 0x0007, 0x789b, 0x0060, 0x79a8, 0x81ff,
++	0x0040, 0x2f0f, 0x789b, 0x0010, 0x7ba8, 0xa384, 0x0001, 0x00c0,
++	0x2f00, 0x7ba8, 0x7ba8, 0xa386, 0x0001, 0x00c0, 0x2ef3, 0x2009,
++	0xfff7, 0x0078, 0x2ef9, 0xa386, 0x0003, 0x00c0, 0x2f00, 0x2009,
++	0xffef, 0x0c7e, 0x7054, 0x2060, 0x6004, 0xa104, 0x6006, 0x0c7f,
++	0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x782b,
++	0x3009, 0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff, 0x6922, 0x0078,
++	0x3693, 0x2850, 0x285b, 0x2f1b, 0x2f23, 0x2f19, 0x2f19, 0x2f19,
++	0x3693, 0x1078, 0x22ac, 0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff,
++	0x6922, 0x0078, 0x369d, 0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff,
++	0x6922, 0x0078, 0x3693, 0x79e4, 0xa184, 0x0030, 0x0040, 0x2f35,
++	0x78ec, 0xa084, 0x0003, 0x00c0, 0x2f57, 0x7000, 0xa086, 0x0004,
++	0x00c0, 0x2f4f, 0x706c, 0xa086, 0x0002, 0x00c0, 0x2f45, 0x2011,
++	0x0002, 0x2019, 0x0000, 0x0078, 0x26fc, 0x706c, 0xa086, 0x0006,
++	0x0040, 0x2f3f, 0x706c, 0xa086, 0x0004, 0x0040, 0x2f3f, 0x6818,
++	0xa085, 0x8000, 0x681a, 0x2001, 0x0014, 0x0078, 0x2b81, 0xa184,
++	0x0007, 0x0079, 0x2f5b, 0x3693, 0x3693, 0x2f63, 0x3693, 0x36f8,
++	0x36f8, 0x3693, 0x3693, 0xa684, 0x0400, 0x00c0, 0x2fa6, 0x6820,
++	0xa084, 0x0001, 0x0040, 0x369d, 0xa68c, 0x0060, 0xa684, 0x0060,
++	0x0040, 0x2f78, 0xa086, 0x0060, 0x00c0, 0x2f78, 0xa18d, 0x4000,
++	0xa18c, 0xfffb, 0x795a, 0x69b6, 0x789b, 0x0060, 0x78ab, 0x0000,
++	0x789b, 0x0061, 0x6818, 0xa085, 0x8000, 0x681a, 0x78aa, 0x8008,
++	0x810c, 0x0040, 0x3230, 0xa18c, 0x00f8, 0x00c0, 0x3230, 0x157e,
++	0x137e, 0x147e, 0x20a1, 0x012c, 0x789b, 0x0000, 0x8000, 0x80ac,
++	0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6814,
++	0x8007, 0x789b, 0x0080, 0x78aa, 0x0078, 0x369d, 0x6818, 0xa084,
++	0x8000, 0x0040, 0x2fad, 0x681b, 0x0008, 0x781b, 0x00d4, 0x0078,
++	0x231a, 0x2300, 0x0079, 0x2fb4, 0x2fb9, 0x3054, 0x2fb7, 0x1078,
++	0x22ac, 0x7000, 0xa084, 0x0007, 0x0079, 0x2fbe, 0x2343, 0x2fc8,
++	0x2ffd, 0x2fd3, 0x2fc6, 0x2343, 0x2fc6, 0x2fc6, 0x1078, 0x22ac,
++	0x681c, 0xa084, 0x2000, 0x0040, 0x2fe1, 0x6008, 0xa085, 0x0002,
++	0x600a, 0x0078, 0x2fe1, 0x68c0, 0xa005, 0x00c0, 0x2ffd, 0x6920,
++	0xa18d, 0x0001, 0x6922, 0x68c3, 0x0001, 0x6800, 0x706a, 0x0078,
++	0x2ff7, 0x6920, 0xa18d, 0x0001, 0x6922, 0x6800, 0x6006, 0xa005,
++	0x00c0, 0x2feb, 0x6002, 0x681c, 0xa084, 0x000e, 0x0040, 0x2ff7,
++	0x7014, 0x68ba, 0x7130, 0xa188, 0x7000, 0x0078, 0x2ff9, 0x2009,
++	0x7100, 0x2104, 0x6802, 0x2d0a, 0x7162, 0x6eb6, 0xa684, 0x0060,
++	0x0040, 0x3052, 0xa684, 0x0800, 0x00c0, 0x3011, 0xa684, 0x7fff,
++	0x68b6, 0x6894, 0x68a6, 0x6898, 0x68aa, 0x1078, 0x431b, 0x0078,
++	0x3052, 0xa684, 0x0020, 0x0040, 0x3026, 0x68c0, 0xa005, 0x0040,
++	0x301d, 0x1078, 0x472f, 0x0078, 0x3020, 0xa006, 0x1078, 0x46d8,
++	0x79d8, 0x7adc, 0x69aa, 0x6aa6, 0x0078, 0x302c, 0x1078, 0x3609,
++	0x69aa, 0x6aa6, 0x1078, 0x46d8, 0xa684, 0x8000, 0x0040, 0x3052,
++	0xa684, 0x7fff, 0x68b6, 0x789b, 0x0076, 0x1078, 0x3723, 0x2010,
++	0x1078, 0x3723, 0x2008, 0xa684, 0x0020, 0x00c0, 0x304a, 0x1078,
++	0x3723, 0x801b, 0x00c8, 0x3045, 0x8000, 0xa084, 0x003f, 0xa108,
++	0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200,
++	0xa303, 0x68ae, 0x0078, 0x2343, 0x0078, 0x34ce, 0x7037, 0x0000,
++	0xa282, 0x0006, 0x0050, 0x305e, 0x1078, 0x22ac, 0x7000, 0xa084,
++	0x0007, 0x10c0, 0x37c7, 0x2300, 0x0079, 0x3066, 0x3069, 0x308f,
++	0x30a1, 0x2200, 0x0079, 0x306c, 0x308d, 0x34ce, 0x3072, 0x308d,
++	0x30bb, 0x30fa, 0x7003, 0x0005, 0x2001, 0x7210, 0x2068, 0x704a,
++	0x157e, 0x20a9, 0x0031, 0x2003, 0x0000, 0x8000, 0x0070, 0x3082,
++	0x0078, 0x307b, 0x157f, 0x6817, 0x0000, 0x68b7, 0x0700, 0x6823,
++	0x0800, 0x6827, 0x0003, 0x0078, 0x34be, 0x1078, 0x22ac, 0x7003,
++	0x0005, 0x2001, 0x7210, 0x2068, 0x704a, 0x7036, 0x2200, 0x0079,
++	0x3099, 0x34ce, 0x309f, 0x309f, 0x30bb, 0x309f, 0x34ce, 0x1078,
++	0x22ac, 0x7003, 0x0005, 0x2001, 0x7210, 0x2068, 0x704a, 0x7036,
++	0x2200, 0x0079, 0x30ab, 0x30b3, 0x30b1, 0x30b1, 0x30b3, 0x30b1,
++	0x30b3, 0x1078, 0x22ac, 0x1078, 0x34e8, 0x782b, 0x3008, 0x781b,
++	0x006d, 0x0078, 0x231a, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00,
++	0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0x2069, 0x7100,
++	0x2d04, 0x2d08, 0x7162, 0x2068, 0xa005, 0x0040, 0x30d6, 0x6814,
++	0xa206, 0x0040, 0x30ef, 0x6800, 0x0078, 0x30c9, 0x7003, 0x0005,
++	0x2001, 0x7210, 0x2068, 0x704a, 0x7036, 0x157e, 0x20a9, 0x0031,
++	0x2003, 0x0000, 0x8000, 0x0070, 0x30e7, 0x0078, 0x30e0, 0x157f,
++	0x6a16, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4,
++	0x7e5a, 0x6820, 0xa084, 0x0c00, 0x0040, 0x3146, 0x1078, 0x34e0,
++	0x0078, 0x3146, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b,
++	0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0x79a8, 0x79a8, 0xa18c,
++	0x00ff, 0xa1e8, 0x7000, 0x2d04, 0x2d08, 0x7162, 0x2068, 0xa005,
++	0x0040, 0x3119, 0x6814, 0xa206, 0x0040, 0x3131, 0x6800, 0x0078,
++	0x310c, 0x7003, 0x0005, 0x2001, 0x7210, 0x2068, 0x704a, 0x157e,
++	0x20a9, 0x0031, 0x2003, 0x0000, 0x8000, 0x0070, 0x3129, 0x0078,
++	0x3122, 0x157f, 0x6a16, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827,
++	0x0003, 0x6eb4, 0x7e5a, 0x6820, 0xa084, 0x0c00, 0x0040, 0x3146,
++	0xa084, 0x0800, 0x0040, 0x3140, 0x1078, 0x34e4, 0x0078, 0x3146,
++	0x1078, 0x34e0, 0x708b, 0x0000, 0x0078, 0x3146, 0x027e, 0x8207,
++	0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x4f80, 0x2060,
++	0x7056, 0x6000, 0x705a, 0x6004, 0x705e, 0xa684, 0x0060, 0x0040,
++	0x319e, 0x6b98, 0x6c94, 0x69ac, 0x68b0, 0xa105, 0x00c0, 0x3180,
++	0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa6b4, 0xb7ff, 0x7e5a, 0xa684,
++	0x0060, 0xa086, 0x0060, 0x0040, 0x319e, 0x68c0, 0xa005, 0x0040,
++	0x3179, 0x7003, 0x0003, 0x682b, 0x0000, 0x1078, 0x45dc, 0x0078,
++	0x317b, 0x1078, 0x45ed, 0xa6b5, 0x2000, 0x7e5a, 0x0078, 0x319e,
++	0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400, 0xa305, 0x0040, 0x319e,
++	0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68b0, 0xa6b4, 0xbfff, 0x7e5a,
++	0x007e, 0x68c0, 0xa005, 0x007f, 0x0040, 0x319c, 0x7003, 0x0003,
++	0x1078, 0x45dc, 0x0078, 0x319e, 0x1078, 0x4638, 0x077f, 0x1078,
++	0x35fc, 0x2009, 0x006d, 0xa684, 0x0004, 0x0040, 0x31ab, 0x782b,
++	0x3008, 0x2009, 0x006d, 0x791a, 0x2d00, 0x704a, 0x8207, 0xa084,
++	0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x4f80, 0x2048, 0x0078,
++	0x231a, 0x6020, 0xa005, 0x0040, 0x31c5, 0x8001, 0x6022, 0x6008,
++	0xa085, 0x0008, 0x600a, 0x7010, 0x6026, 0x007c, 0xa006, 0x1078,
++	0x431b, 0x6817, 0x0000, 0x681b, 0x0001, 0x6823, 0x0040, 0x681f,
++	0x0100, 0x7000, 0xa084, 0x0007, 0x0079, 0x31d6, 0x2343, 0x31e0,
++	0x31e0, 0x31fd, 0x31e8, 0x31e6, 0x31e8, 0x31de, 0x1078, 0x22ac,
++	0x1078, 0x3208, 0x1078, 0x3201, 0x1078, 0x1b8e, 0x0078, 0x2343,
++	0x706c, 0x706f, 0x0000, 0x7093, 0x0000, 0x0079, 0x31ef, 0x31f9,
++	0x31f9, 0x31f7, 0x31f7, 0x31f7, 0x31f9, 0x31f7, 0x31f9, 0x0079,
++	0x2715, 0x706f, 0x0000, 0x0078, 0x2343, 0x681b, 0x0000, 0x0078,
++	0x2d97, 0x6800, 0xa005, 0x00c0, 0x3206, 0x6002, 0x6006, 0x007c,
++	0x6010, 0xa005, 0x0040, 0x3211, 0x8001, 0x00d0, 0x3211, 0x1078,
++	0x22ac, 0x6012, 0x6008, 0xa084, 0xffef, 0x600a, 0x007c, 0x6018,
++	0xa005, 0x0040, 0x321d, 0x8001, 0x601a, 0x007c, 0x1078, 0x371d,
++	0x681b, 0x0018, 0x0078, 0x3254, 0x1078, 0x371d, 0x681b, 0x0019,
++	0x0078, 0x3254, 0x1078, 0x371d, 0x681b, 0x001a, 0x0078, 0x3254,
++	0x1078, 0x371d, 0x681b, 0x0003, 0x0078, 0x3254, 0x7780, 0x1078,
++	0x35fc, 0x7184, 0xa18c, 0x00ff, 0xa1e8, 0x7000, 0x2d04, 0x2d08,
++	0x2068, 0xa005, 0x00c0, 0x3246, 0x0078, 0x2343, 0x6814, 0x7280,
++	0xa206, 0x0040, 0x324e, 0x6800, 0x0078, 0x323f, 0x6800, 0x200a,
++	0x681b, 0x0005, 0x708b, 0x0000, 0x1078, 0x3208, 0x6820, 0xa084,
++	0x0001, 0x00c0, 0x325d, 0x1078, 0x3201, 0x1078, 0x3217, 0x681f,
++	0x0000, 0x6823, 0x0020, 0x1078, 0x1b8e, 0x0078, 0x2343, 0xa282,
++	0x0003, 0x00c0, 0x34be, 0x7da8, 0xa5ac, 0x00ff, 0x7ca8, 0xa4a4,
++	0x00ff, 0x6920, 0xa18d, 0x0080, 0x6922, 0xa184, 0x0100, 0x0040,
++	0x32cb, 0xa18c, 0xfeff, 0x6922, 0xa4a4, 0x00ff, 0x0040, 0x32b5,
++	0xa482, 0x000c, 0x0048, 0x3288, 0x0040, 0x3288, 0x2021, 0x000c,
++	0x852b, 0x852b, 0x1078, 0x3577, 0x0040, 0x3292, 0x1078, 0x3384,
++	0x0078, 0x32be, 0x1078, 0x3532, 0x0c7e, 0x2960, 0x6004, 0xa084,
++	0xfff5, 0x6006, 0x1078, 0x33ab, 0x0c7f, 0x6920, 0xa18d, 0x0100,
++	0x6922, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0,
++	0x32af, 0x782b, 0x3008, 0x781b, 0x005b, 0x0078, 0x231a, 0x782b,
++	0x3008, 0x781b, 0x006d, 0x0078, 0x231a, 0x0c7e, 0x2960, 0x6004,
++	0xa084, 0xfff5, 0x6006, 0x1078, 0x33ab, 0x0c7f, 0x7e58, 0xa684,
++	0x0400, 0x00c0, 0x32c7, 0x781b, 0x005d, 0x0078, 0x231a, 0x781b,
++	0x006d, 0x0078, 0x231a, 0x0c7e, 0x7054, 0x2060, 0x6100, 0xa18c,
++	0x1000, 0x0040, 0x330b, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282,
++	0x000c, 0x0048, 0x32df, 0x0040, 0x32df, 0x2011, 0x000c, 0x2400,
++	0xa202, 0x00c8, 0x32e4, 0x2220, 0x6208, 0xa294, 0x00ff, 0x7018,
++	0xa086, 0x0028, 0x00c0, 0x32f4, 0xa282, 0x0019, 0x00c8, 0x32fa,
++	0x2011, 0x0019, 0x0078, 0x32fa, 0xa282, 0x000c, 0x00c8, 0x32fa,
++	0x2011, 0x000c, 0x2200, 0xa502, 0x00c8, 0x32ff, 0x2228, 0x1078,
++	0x3536, 0x852b, 0x852b, 0x1078, 0x3577, 0x0040, 0x330b, 0x1078,
++	0x3384, 0x0078, 0x330f, 0x1078, 0x3532, 0x1078, 0x33ab, 0x7858,
++	0xa085, 0x0004, 0x785a, 0x0c7f, 0x782b, 0x3008, 0x781b, 0x006d,
++	0x0078, 0x231a, 0x0c7e, 0x2960, 0x6000, 0xa084, 0x1000, 0x00c0,
++	0x3332, 0x6010, 0xa084, 0x000f, 0x00c0, 0x332c, 0x6104, 0xa18c,
++	0xfff5, 0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019, 0x0000,
++	0x0078, 0x3359, 0x68a0, 0xa084, 0x0200, 0x00c0, 0x332c, 0x6208,
++	0xa294, 0x00ff, 0x7018, 0xa086, 0x0028, 0x00c0, 0x3347, 0xa282,
++	0x0019, 0x00c8, 0x334d, 0x2011, 0x0019, 0x0078, 0x334d, 0xa282,
++	0x000c, 0x00c8, 0x334d, 0x2011, 0x000c, 0x6308, 0x831f, 0xa39c,
++	0x00ff, 0xa382, 0x000c, 0x0048, 0x3359, 0x0040, 0x3359, 0x2019,
++	0x000c, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa,
++	0x7baa, 0xa8c0, 0x0005, 0x6820, 0xa085, 0x0100, 0x6822, 0x0c7f,
++	0x007c, 0x0c7e, 0x2960, 0xa18c, 0xfff5, 0x6106, 0x2011, 0x0032,
++	0x2019, 0x0000, 0x0078, 0x3374, 0x78ab, 0x0001, 0x78ab, 0x0003,
++	0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xa085,
++	0x0100, 0x6822, 0x0c7f, 0x007c, 0x0c7e, 0x7154, 0x2160, 0x1078,
++	0x338b, 0x0c7f, 0x007c, 0x2008, 0xa084, 0xfff0, 0xa425, 0x7c86,
++	0x6018, 0x789a, 0x7cae, 0x6412, 0x78a4, 0xa084, 0xfff8, 0xa18c,
++	0x0007, 0xa105, 0x78a6, 0x6016, 0x788a, 0xa4a4, 0x000f, 0x8427,
++	0x8204, 0x8004, 0xa084, 0x00ff, 0xa405, 0x600e, 0x6004, 0xa084,
++	0xfff5, 0x6006, 0x007c, 0x0c7e, 0x7054, 0x2060, 0x1078, 0x33b2,
++	0x0c7f, 0x007c, 0x6018, 0x789a, 0x78a4, 0xa084, 0xfff0, 0x78a6,
++	0x6012, 0x7884, 0xa084, 0xfff0, 0x7886, 0x007c, 0xa282, 0x0002,
++	0x00c0, 0x34be, 0x7aa8, 0x6920, 0xa18d, 0x0080, 0x6922, 0xa184,
++	0x0200, 0x0040, 0x3407, 0xa18c, 0xfdff, 0x6922, 0xa294, 0x00ff,
++	0xa282, 0x0002, 0x00c8, 0x34be, 0x1078, 0x3450, 0x1078, 0x33ab,
++	0xa980, 0x0001, 0x200c, 0x1078, 0x35f8, 0x1078, 0x331a, 0x88ff,
++	0x0040, 0x33fa, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5,
++	0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x33f4, 0x782b, 0x3008,
++	0x781b, 0x005b, 0x0078, 0x231a, 0x782b, 0x3008, 0x781b, 0x006d,
++	0x0078, 0x231a, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x3403, 0x781b,
++	0x005d, 0x0078, 0x231a, 0x781b, 0x006d, 0x0078, 0x231a, 0xa282,
++	0x0002, 0x00c8, 0x340f, 0xa284, 0x0001, 0x0040, 0x3419, 0x7154,
++	0xa188, 0x0000, 0x210c, 0xa18c, 0x2000, 0x00c0, 0x3419, 0x2011,
++	0x0000, 0x1078, 0x3524, 0x1078, 0x3450, 0x1078, 0x33ab, 0x7858,
++	0xa085, 0x0004, 0x785a, 0x782b, 0x3008, 0x781b, 0x006d, 0x0078,
++	0x231a, 0x0c7e, 0x027e, 0x2960, 0x6000, 0x2011, 0x0001, 0xa084,
++	0x2000, 0x00c0, 0x3440, 0x6014, 0xa084, 0x0040, 0x00c0, 0x343e,
++	0xa18c, 0xffef, 0x6106, 0xa006, 0x0078, 0x344d, 0x2011, 0x0000,
++	0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0,
++	0x0004, 0x6820, 0xa085, 0x0200, 0x6822, 0x027f, 0x0c7f, 0x007c,
++	0x0c7e, 0x7054, 0x2060, 0x1078, 0x3457, 0x0c7f, 0x007c, 0x82ff,
++	0x0040, 0x345c, 0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a,
++	0x78a4, 0xa084, 0xffbf, 0xa205, 0x78a6, 0x788a, 0x6016, 0x6004,
++	0xa084, 0xffef, 0x6006, 0x007c, 0x007e, 0x7000, 0xa086, 0x0003,
++	0x0040, 0x3475, 0x007f, 0x0078, 0x3478, 0x007f, 0x0078, 0x34ba,
++	0xa684, 0x0020, 0x0040, 0x34ba, 0x7888, 0xa084, 0x0040, 0x0040,
++	0x34ba, 0x7bb8, 0xa384, 0x003f, 0x831b, 0x00c8, 0x3488, 0x8000,
++	0xa005, 0x0040, 0x349e, 0x831b, 0x00c8, 0x3491, 0x8001, 0x0040,
++	0x34b6, 0xa684, 0x4000, 0x0040, 0x349e, 0x78b8, 0x801b, 0x00c8,
++	0x349a, 0x8000, 0xa084, 0x003f, 0x00c0, 0x34b6, 0xa6b4, 0xbfff,
++	0x7e5a, 0x79d8, 0x7adc, 0x2001, 0x0001, 0xa108, 0x00c8, 0x34aa,
++	0xa291, 0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x1078, 0x46d8,
++	0x781b, 0x006c, 0x1078, 0x4568, 0x0078, 0x231a, 0x781b, 0x006c,
++	0x0078, 0x231a, 0x781b, 0x006d, 0x0078, 0x231a, 0x1078, 0x34ec,
++	0x782b, 0x3008, 0x781b, 0x006d, 0x0078, 0x231a, 0x1078, 0x34d8,
++	0x782b, 0x3008, 0x781b, 0x006d, 0x0078, 0x231a, 0x6827, 0x0002,
++	0x1078, 0x34e0, 0x782b, 0x3008, 0x781b, 0x006d, 0x0078, 0x231a,
++	0x2001, 0x0005, 0x0078, 0x34ee, 0x2001, 0x000c, 0x0078, 0x34ee,
++	0x2001, 0x0006, 0x0078, 0x34ee, 0x2001, 0x000d, 0x0078, 0x34ee,
++	0x2001, 0x0009, 0x0078, 0x34ee, 0x2001, 0x0007, 0x789b, 0x0010,
++	0x78aa, 0x789b, 0x0060, 0x78ab, 0x0001, 0xa6b5, 0x0004, 0x7e5a,
++	0x007c, 0x077e, 0x873f, 0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703,
++	0xa0e0, 0x4f80, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184, 0x000f,
++	0x0040, 0x3512, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004, 0xa085,
++	0x0008, 0x6006, 0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040,
++	0x0040, 0x3522, 0xa184, 0xffbf, 0x78a6, 0x6016, 0x6004, 0xa085,
++	0x0010, 0x6006, 0x077f, 0x007c, 0x789b, 0x0010, 0x78ab, 0x0001,
++	0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab,
++	0x0004, 0x007c, 0x2021, 0x0000, 0x2029, 0x0032, 0x789b, 0x0010,
++	0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7caa,
++	0x789b, 0x0060, 0x78ab, 0x0005, 0x007c, 0x157e, 0x8007, 0xa084,
++	0x00ff, 0x8003, 0x8003, 0xa080, 0x0020, 0x789a, 0x79a4, 0xa18c,
++	0xfff0, 0x2001, 0x4d46, 0x2004, 0xa082, 0x0028, 0x0040, 0x3560,
++	0x2021, 0x35df, 0x2019, 0x0014, 0x20a9, 0x000c, 0x0078, 0x3566,
++	0x2021, 0x35eb, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011, 0x0064,
++	0x2404, 0xa084, 0xfff0, 0xa106, 0x0040, 0x3575, 0x8420, 0x2300,
++	0xa210, 0x0070, 0x3575, 0x0078, 0x3568, 0x157f, 0x007c, 0x157e,
++	0x2009, 0x4d46, 0x210c, 0xa182, 0x0032, 0x0048, 0x358b, 0x0040,
++	0x358f, 0x2009, 0x35d1, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011,
++	0x0032, 0x0078, 0x35a1, 0xa182, 0x0028, 0x0040, 0x3599, 0x2009,
++	0x35df, 0x2019, 0x0014, 0x20a9, 0x000c, 0x2011, 0x0064, 0x0078,
++	0x35a1, 0x2009, 0x35eb, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011,
++	0x0064, 0x2200, 0xa502, 0x0040, 0x35b1, 0x0048, 0x35b1, 0x8108,
++	0x2300, 0xa210, 0x0070, 0x35ae, 0x0078, 0x35a1, 0x157f, 0xa006,
++	0x007c, 0x157f, 0xa582, 0x0064, 0x00c8, 0x35c0, 0x7808, 0xa085,
++	0x0070, 0x780a, 0x7044, 0xa085, 0x0070, 0x7046, 0x0078, 0x35c0,
++	0x78ec, 0xa084, 0x0300, 0x0040, 0x35ce, 0x2104, 0xa09e, 0x1201,
++	0x00c0, 0x35ce, 0x2001, 0x2101, 0x0078, 0x35cf, 0x2104, 0xa005,
++	0x007c, 0x1201, 0x3002, 0x3202, 0x4203, 0x4403, 0x5404, 0x5604,
++	0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07, 0x0c07, 0x0e07, 0x3202,
++	0x4202, 0x5202, 0x6202, 0x7202, 0x6605, 0x7605, 0x7805, 0x7a05,
++	0x7c05, 0x7e05, 0x7f05, 0x2202, 0x3202, 0x4202, 0x5202, 0x5404,
++	0x6404, 0x7404, 0x7604, 0x7804, 0x7a04, 0x7c04, 0x7e04, 0x7f04,
++	0x789b, 0x0010, 0xa046, 0x007c, 0xa784, 0x0f00, 0x800b, 0xa784,
++	0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa0e0, 0x5000,
++	0x007c, 0x79d8, 0x7adc, 0x78d0, 0x801b, 0x00c8, 0x3610, 0x8000,
++	0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x007c, 0x0f7e, 0x2079,
++	0x0100, 0x2009, 0x4d40, 0x2091, 0x8000, 0x2104, 0x0079, 0x3620,
++	0x3656, 0x362a, 0x362a, 0x362a, 0x362a, 0x362a, 0x362a, 0x365a,
++	0x1078, 0x22ac, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004, 0x00c0,
++	0x362c, 0x784b, 0x0008, 0x7848, 0xa084, 0x0008, 0x00c0, 0x3633,
++	0x68b4, 0xa085, 0x4000, 0x68b6, 0x7858, 0xa085, 0x4000, 0x785a,
++	0x7830, 0xa084, 0x0080, 0x00c0, 0x3656, 0x0018, 0x3656, 0x681c,
++	0xa084, 0x0020, 0x00c0, 0x3654, 0x0e7e, 0x2071, 0x4d40, 0x1078,
++	0x36a7, 0x0e7f, 0x0078, 0x3656, 0x781b, 0x00de, 0x2091, 0x8001,
++	0x0f7f, 0x007c, 0x1078, 0x3886, 0x0078, 0x3656, 0x0c7e, 0x6814,
++	0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e0, 0x4f80,
++	0x6004, 0xa084, 0x000a, 0x00c0, 0x3691, 0x6108, 0xa194, 0xff00,
++	0x0040, 0x3691, 0xa18c, 0x00ff, 0x2001, 0x0019, 0xa106, 0x0040,
++	0x3680, 0x2001, 0x0032, 0xa106, 0x0040, 0x3684, 0x0078, 0x3688,
++	0x2009, 0x0020, 0x0078, 0x368a, 0x2009, 0x003f, 0x0078, 0x368a,
++	0x2011, 0x0000, 0x2100, 0xa205, 0x600a, 0x6004, 0xa085, 0x0002,
++	0x6006, 0x0c7f, 0x007c, 0x781b, 0x006d, 0x0078, 0x231a, 0x782b,
++	0x3008, 0x781b, 0x006d, 0x0078, 0x231a, 0x781b, 0x005d, 0x0078,
++	0x231a, 0x782b, 0x3008, 0x781b, 0x005b, 0x0078, 0x231a, 0x2009,
++	0x4d20, 0x210c, 0xa186, 0x0000, 0x0040, 0x36bb, 0xa186, 0x0001,
++	0x0040, 0x36be, 0x2009, 0x4d38, 0x200b, 0x000b, 0x706f, 0x0001,
++	0x781b, 0x0048, 0x007c, 0x781b, 0x00d8, 0x007c, 0x2009, 0x4d38,
++	0x200b, 0x000a, 0x007c, 0x2009, 0x4d20, 0x210c, 0xa186, 0x0000,
++	0x0040, 0x36de, 0xa186, 0x0001, 0x0040, 0x36d8, 0x2009, 0x4d38,
++	0x200b, 0x000b, 0x706f, 0x0001, 0x781b, 0x0048, 0x0078, 0x231a,
++	0x2009, 0x4d38, 0x200b, 0x000a, 0x0078, 0x231a, 0x782b, 0x3008,
++	0x781b, 0x00d8, 0x0078, 0x231a, 0x781b, 0x00de, 0x0078, 0x231a,
++	0x782b, 0x3008, 0x781b, 0x00de, 0x0078, 0x231a, 0x781b, 0x009c,
++	0x0078, 0x231a, 0x782b, 0x3008, 0x781b, 0x009c, 0x0078, 0x231a,
++	0x6818, 0xa084, 0x8000, 0x0040, 0x36ff, 0x681b, 0x001d, 0x706f,
++	0x0001, 0x781b, 0x0048, 0x0078, 0x231a, 0x007e, 0x7830, 0xa084,
++	0x00c0, 0x00c0, 0x371b, 0x7808, 0xa084, 0xfffc, 0x780a, 0x0005,
++	0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, 0x371b,
++	0x7044, 0x780a, 0xa005, 0x007f, 0x007c, 0x7044, 0xa085, 0x0002,
++	0x7046, 0x780a, 0x007c, 0x7830, 0xa084, 0x0040, 0x00c0, 0x3723,
++	0x0098, 0x372c, 0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a,
++	0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040,
++	0x373b, 0x0098, 0x3739, 0x78ac, 0x007e, 0x7044, 0x780a, 0x007f,
++	0x007c, 0xa784, 0x007d, 0x00c0, 0x3748, 0x2700, 0x1078, 0x22ac,
++	0xa784, 0x0001, 0x00c0, 0x2ded, 0xa784, 0x0070, 0x0040, 0x3758,
++	0x0c7e, 0x2d60, 0x2f68, 0x1078, 0x2257, 0x2d78, 0x2c68, 0x0c7f,
++	0xa784, 0x0008, 0x0040, 0x3765, 0x784b, 0x0008, 0x78ec, 0xa084,
++	0x0003, 0x0040, 0x2343, 0x0078, 0x3693, 0xa784, 0x0004, 0x0040,
++	0x3798, 0x78b8, 0xa084, 0x4001, 0x0040, 0x3798, 0x784b, 0x0008,
++	0x78ec, 0xa084, 0x0003, 0x0040, 0x2343, 0x78e4, 0xa084, 0x0007,
++	0xa086, 0x0001, 0x00c0, 0x3798, 0x78c0, 0xa085, 0x4800, 0x2030,
++	0x7e5a, 0x781b, 0x00de, 0x0078, 0x231a, 0x784b, 0x0008, 0x6818,
++	0xa084, 0x8000, 0x0040, 0x3794, 0x681b, 0x0015, 0xa684, 0x4000,
++	0x0040, 0x3794, 0x681b, 0x0007, 0x1078, 0x36a7, 0x0078, 0x231a,
++	0x681b, 0x0003, 0x7858, 0xa084, 0x3f00, 0x681e, 0x6833, 0x0000,
++	0x682f, 0x0000, 0x784b, 0x0008, 0x78e4, 0xa005, 0x00d0, 0x2817,
++	0xa084, 0x0020, 0x0040, 0x2817, 0x78ec, 0xa084, 0x0003, 0x0040,
++	0x2817, 0x0018, 0x2817, 0x0078, 0x34c6, 0x6b14, 0x8307, 0xa084,
++	0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x4f80, 0x2060, 0x2048,
++	0x7056, 0x6000, 0x705a, 0x6004, 0x705e, 0x2a60, 0x007c, 0x0079,
++	0x37c9, 0x37d1, 0x37d2, 0x37d1, 0x37d4, 0x37d1, 0x37d1, 0x37d1,
++	0x37d9, 0x007c, 0x1078, 0x3217, 0x1078, 0x431b, 0x7038, 0x600a,
++	0x007c, 0x70a0, 0xa005, 0x0040, 0x37e6, 0x2068, 0x1078, 0x1a80,
++	0x1078, 0x42d4, 0x1078, 0x42db, 0x70a3, 0x0000, 0x007c, 0x0e7e,
++	0x2091, 0x8000, 0x2071, 0x4d40, 0x7000, 0xa086, 0x0007, 0x00c0,
++	0x3804, 0x6114, 0x70ac, 0xa106, 0x00c0, 0x3804, 0x6128, 0x70b0,
++	0xa106, 0x00c0, 0x3804, 0x2c00, 0x70a2, 0x0e7f, 0x1078, 0x1a8d,
++	0x1078, 0x380a, 0xa006, 0x007c, 0x2091, 0x8001, 0x0e7f, 0xa085,
++	0x0001, 0x007c, 0x0f7e, 0x0e7e, 0x2071, 0x4d40, 0x0078, 0x20c8,
++	0x785b, 0x0000, 0x70b7, 0x000e, 0x2009, 0x0100, 0x017e, 0x70a0,
++	0xa06d, 0x0040, 0x381f, 0x70a3, 0x0000, 0x0078, 0x3825, 0x70bb,
++	0x0000, 0x1078, 0x1aa9, 0x0040, 0x382b, 0x70b4, 0x6826, 0x1078,
++	0x3906, 0x0078, 0x381f, 0x017f, 0x157e, 0x0c7e, 0x0d7e, 0x20a9,
++	0x0008, 0x2061, 0x7110, 0x6000, 0xa105, 0x6002, 0x601c, 0xa06d,
++	0x0040, 0x3843, 0x6800, 0x601e, 0x1078, 0x18a0, 0x6008, 0x8000,
++	0x600a, 0x0078, 0x3836, 0x6018, 0xa06d, 0x0040, 0x384d, 0x6800,
++	0x601a, 0x1078, 0x18a0, 0x0078, 0x3843, 0xace0, 0x0008, 0x0070,
++	0x3853, 0x0078, 0x3833, 0x709c, 0xa084, 0x8000, 0x0040, 0x385a,
++	0x1078, 0x3980, 0x0d7f, 0x0c7f, 0x157f, 0x007c, 0x127e, 0x2091,
++	0x2300, 0x6804, 0xa084, 0x000f, 0x0079, 0x3866, 0x3876, 0x3876,
++	0x3876, 0x3876, 0x3876, 0x3876, 0x3878, 0x387e, 0x3876, 0x3876,
++	0x3876, 0x3876, 0x3876, 0x3880, 0x3876, 0x3878, 0x1078, 0x22ac,
++	0x1078, 0x4172, 0x1078, 0x18a0, 0x0078, 0x3884, 0x6827, 0x000b,
++	0x1078, 0x4172, 0x1078, 0x3906, 0x127f, 0x007c, 0x127e, 0x2091,
++	0x2300, 0x0098, 0x38a2, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x38a2,
++	0x0d7e, 0x1078, 0x42e4, 0x2d00, 0x682e, 0x2009, 0x0004, 0x2001,
++	0x0000, 0x6827, 0x0084, 0x1078, 0x429c, 0x1078, 0x3906, 0x0d7f,
++	0x0078, 0x38d4, 0x7948, 0xa185, 0x4000, 0x784a, 0x0098, 0x38ab,
++	0x794a, 0x0078, 0x3890, 0x7828, 0xa086, 0x1834, 0x00c0, 0x38b4,
++	0xa185, 0x0004, 0x0078, 0x38bb, 0x7828, 0xa186, 0x1814, 0x00c0,
++	0x38a8, 0xa185, 0x000c, 0x784a, 0x789b, 0x000e, 0x78ab, 0x0002,
++	0x7858, 0xa084, 0x00ff, 0xa085, 0x0400, 0x785a, 0x70bc, 0xa080,
++	0x008d, 0x781a, 0x6827, 0x0002, 0x6827, 0x0084, 0x2009, 0x0004,
++	0x2001, 0x0000, 0x1078, 0x429c, 0x127f, 0x007c, 0x0d7e, 0x6b14,
++	0x1078, 0x1b1b, 0x0040, 0x38e3, 0x2068, 0x6827, 0x0002, 0x1078,
++	0x3906, 0x0078, 0x38d8, 0x0d7f, 0x007c, 0x0d7e, 0x6b14, 0x6c28,
++	0xa4a4, 0x00ff, 0x1078, 0x1ab9, 0x0040, 0x38f3, 0x2068, 0x6827,
++	0x0002, 0x1078, 0x3906, 0x0d7f, 0x007c, 0x0d7e, 0x6b14, 0xa39c,
++	0x00ff, 0x1078, 0x1aec, 0x0040, 0x3904, 0x2068, 0x6827, 0x0002,
++	0x1078, 0x3906, 0x0078, 0x38f9, 0x0d7f, 0x007c, 0x0c7e, 0x6914,
++	0x1078, 0x3977, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0006, 0x0040,
++	0x3921, 0xa186, 0x000d, 0x0040, 0x3940, 0xa186, 0x0017, 0x00c0,
++	0x391d, 0x1078, 0x18a0, 0x0078, 0x391f, 0x1078, 0x1b90, 0x0c7f,
++	0x007c, 0x6004, 0x8001, 0x0048, 0x393e, 0x6006, 0x2009, 0x0000,
++	0xa684, 0x0001, 0x00c0, 0x392e, 0xa18d, 0x8000, 0xa684, 0x0004,
++	0x0040, 0x3934, 0xa18d, 0x0002, 0x6922, 0x681f, 0x0000, 0x7104,
++	0x810f, 0x6818, 0xa105, 0x681a, 0x0078, 0x391d, 0x1078, 0x22ac,
++	0x6018, 0xa005, 0x00c0, 0x394f, 0x6008, 0x8001, 0x0048, 0x394f,
++	0x600a, 0x601c, 0x6802, 0x2d00, 0x601e, 0x0078, 0x3965, 0xac88,
++	0x0006, 0x2104, 0xa005, 0x0040, 0x3958, 0x2008, 0x0078, 0x3951,
++	0x6802, 0x2d0a, 0x6008, 0x8001, 0x0048, 0x391f, 0x600a, 0x6018,
++	0x2068, 0x6800, 0x601a, 0x0078, 0x3949, 0x157e, 0x137e, 0x147e,
++	0x0c7e, 0x0d7e, 0x1078, 0x187d, 0x2da0, 0x137f, 0x20a9, 0x0031,
++	0x53a3, 0x0c7f, 0x147f, 0x137f, 0x157f, 0x0078, 0x391d, 0xa184,
++	0x001f, 0x8003, 0x8003, 0x8003, 0xa080, 0x7110, 0x2060, 0x007c,
++	0x2019, 0x4d51, 0x2304, 0xa085, 0x0001, 0x201a, 0x2019, 0x0102,
++	0x2304, 0xa085, 0x0001, 0x201a, 0x007c, 0x2019, 0x4d51, 0x2304,
++	0xa084, 0xfffe, 0x201a, 0x2019, 0x0102, 0x2304, 0xa084, 0xfffe,
++	0x201a, 0x007c, 0x0078, 0x231a, 0x70a3, 0x0000, 0x7003, 0x0000,
++	0x7043, 0x0001, 0x7037, 0x0000, 0x0018, 0x22d1, 0x1078, 0x1aa9,
++	0x0040, 0x39cf, 0x2009, 0x4d0f, 0x200b, 0x0000, 0x68bc, 0x2060,
++	0x6100, 0xa184, 0x0300, 0x0040, 0x39c1, 0x6827, 0x000e, 0xa084,
++	0x0200, 0x0040, 0x39bd, 0x6827, 0x0017, 0x1078, 0x3906, 0x0078,
++	0x399c, 0x6820, 0xa084, 0x8000, 0x0040, 0x3a11, 0x7000, 0xa086,
++	0x0007, 0x10c0, 0x22ac, 0x2d00, 0x70a2, 0x0078, 0x39d6, 0x7040,
++	0xa086, 0x0001, 0x0040, 0x2353, 0x0078, 0x231a, 0x2031, 0x0000,
++	0x6920, 0xa184, 0x0002, 0x0040, 0x39df, 0xa6b5, 0x0004, 0xa184,
++	0x00c0, 0x8003, 0x8003, 0x8007, 0xa080, 0x3a8c, 0x2004, 0xa635,
++	0x681c, 0xa084, 0x0400, 0x0040, 0x39f7, 0x789b, 0x0018, 0x78ab,
++	0x0003, 0x789b, 0x0081, 0x78ab, 0x0001, 0xa6b5, 0x1000, 0x681c,
++	0xa084, 0x8000, 0x0040, 0x3a03, 0xa6b5, 0x0400, 0x789b, 0x000e,
++	0x6824, 0x8007, 0x78aa, 0xa684, 0x0200, 0x0040, 0x3a0d, 0x6830,
++	0x78d2, 0x682c, 0x78d6, 0x1078, 0x42cc, 0x7e5a, 0x6eb6, 0x0078,
++	0x4303, 0x1078, 0x3705, 0x00c0, 0x3a86, 0x702c, 0x8004, 0x0048,
++	0x3a1f, 0x2019, 0x4a07, 0x1078, 0x2137, 0x702f, 0x0001, 0x2011,
++	0x0001, 0x2031, 0x1000, 0x789b, 0x0018, 0x6814, 0xa084, 0x001f,
++	0xa085, 0x0080, 0x78aa, 0x6920, 0xa184, 0x0002, 0x0040, 0x3a38,
++	0xa6b5, 0x0004, 0x78ab, 0x0020, 0x6828, 0x78aa, 0xa290, 0x0002,
++	0x681c, 0xa084, 0x8000, 0x0040, 0x3a46, 0xa6b5, 0x0400, 0x789b,
++	0x000e, 0x6824, 0x8007, 0x78aa, 0x0078, 0x3a54, 0x6820, 0xa084,
++	0x8000, 0x00c0, 0x3a54, 0xa6b5, 0x0800, 0x681c, 0xa084, 0x0100,
++	0x0040, 0x3a54, 0xa6b5, 0x4000, 0x6820, 0xa084, 0x00c0, 0x8003,
++	0x8003, 0x8007, 0xa080, 0x3a8c, 0x2004, 0xa635, 0x789b, 0x007e,
++	0x7eae, 0x6eb6, 0x6814, 0x8007, 0x78aa, 0x7aaa, 0x7830, 0xa084,
++	0x00c0, 0x00c0, 0x3a86, 0x0018, 0x3a86, 0x70bc, 0xa080, 0x00dd,
++	0x781a, 0x1078, 0x371d, 0xa684, 0x0200, 0x0040, 0x3a7d, 0x6830,
++	0x78d2, 0x682c, 0x78d6, 0x1078, 0x42cc, 0x2d00, 0x70a2, 0x7003,
++	0x0007, 0xad80, 0x000f, 0x7036, 0x0078, 0x231a, 0x1078, 0x1a80,
++	0x1078, 0x371d, 0x0078, 0x231a, 0x0000, 0x0300, 0x0200, 0x0000,
++	0x1078, 0x22ac, 0x2300, 0x0079, 0x3a95, 0x3a98, 0x3a98, 0x3a9a,
++	0x1078, 0x22ac, 0x1078, 0x42db, 0x6924, 0xa184, 0x00ff, 0xa086,
++	0x000a, 0x0040, 0x3aac, 0xa184, 0xff00, 0xa085, 0x000a, 0x6826,
++	0x1078, 0x1a80, 0x0078, 0x399c, 0x2001, 0x000a, 0x1078, 0x4254,
++	0x0078, 0x399c, 0xa282, 0x0005, 0x0050, 0x3ab8, 0x1078, 0x22ac,
++	0x7000, 0xa084, 0x0007, 0x10c0, 0x37c7, 0x1078, 0x187d, 0x6807,
++	0x0106, 0x680b, 0x0000, 0x689f, 0x0000, 0x6827, 0x0000, 0x1078,
++	0x3e02, 0x2d00, 0x70a2, 0x7003, 0x0007, 0x6014, 0x68ba, 0xad80,
++	0x002e, 0x7036, 0x6824, 0xa084, 0x0080, 0x0040, 0x3adb, 0x1078,
++	0x3ea9, 0x0078, 0x231a, 0x2300, 0x0079, 0x3ade, 0x3ae1, 0x3b59,
++	0x3b78, 0x2200, 0x0079, 0x3ae4, 0x3ae9, 0x3af9, 0x3b1f, 0x3b29,
++	0x3b4a, 0x2029, 0x0001, 0xa026, 0x2011, 0x0000, 0x1078, 0x3f97,
++	0x0079, 0x3af2, 0x3af7, 0x231a, 0x399c, 0x3af7, 0x3af7, 0x1078,
++	0x22ac, 0x7990, 0xa18c, 0x0007, 0x00c0, 0x3b00, 0x2009, 0x0008,
++	0x2011, 0x0001, 0xa684, 0x0004, 0x0040, 0x3b08, 0x2011, 0x0003,
++	0x2220, 0xa12a, 0x2011, 0x0001, 0x1078, 0x3f97, 0x0079, 0x3b10,
++	0x3b15, 0x231a, 0x399c, 0x3b1d, 0x3b17, 0x0078, 0x4309, 0x70ab,
++	0x3b1b, 0x0078, 0x231a, 0x0078, 0x3b15, 0x1078, 0x22ac, 0xa684,
++	0x0010, 0x0040, 0x3b27, 0x1078, 0x3e79, 0x0078, 0x231a, 0x0078,
++	0x3eda, 0x6000, 0xa084, 0x0002, 0x0040, 0x3b44, 0x70bc, 0xa080,
++	0x00c4, 0x781a, 0x0d7e, 0x1078, 0x42e4, 0x2d00, 0x682e, 0x6827,
++	0x0000, 0x1078, 0x3906, 0x0d7f, 0x1078, 0x18a0, 0x7003, 0x0000,
++	0x7037, 0x0000, 0x0078, 0x399c, 0xa684, 0x0004, 0x00c0, 0x3b4a,
++	0x0078, 0x4309, 0x6000, 0xa084, 0x0004, 0x00c0, 0x3b57, 0x70ab,
++	0x3b57, 0x2001, 0x0007, 0x1078, 0x424c, 0x0078, 0x430f, 0x0078,
++	0x4309, 0x2200, 0x0079, 0x3b5c, 0x3b61, 0x3b61, 0x3b61, 0x3b63,
++	0x3b61, 0x1078, 0x22ac, 0x70a7, 0x3b67, 0x0078, 0x4315, 0x2011,
++	0x0018, 0x1078, 0x3f91, 0x0079, 0x3b6d, 0x3b72, 0x231a, 0x399c,
++	0x3b74, 0x3b76, 0x1078, 0x22ac, 0x1078, 0x22ac, 0x1078, 0x22ac,
++	0x2200, 0x0079, 0x3b7b, 0x3b80, 0x3b80, 0x3b82, 0x3b80, 0x3b80,
++	0x1078, 0x22ac, 0x70ab, 0x3b8a, 0x2001, 0x0003, 0x1078, 0x424c,
++	0x0078, 0x430f, 0x0078, 0x4309, 0xa282, 0x0003, 0x0050, 0x3b92,
++	0x1078, 0x22ac, 0xa684, 0x0008, 0x0040, 0x3b98, 0x1078, 0x3e57,
++	0x7003, 0x0007, 0x2300, 0x0079, 0x3b9d, 0x3ba0, 0x3bcb, 0x3bd3,
++	0x2200, 0x0079, 0x3ba3, 0x3ba8, 0x3ba6, 0x3bc1, 0x1078, 0x22ac,
++	0x7990, 0xa1ac, 0x0007, 0xa026, 0x2011, 0x0001, 0x1078, 0x3f97,
++	0x0079, 0x3bb2, 0x3bb7, 0x231a, 0x399c, 0x3bbf, 0x3bb9, 0x0078,
++	0x4309, 0x70ab, 0x3bbd, 0x0078, 0x231a, 0x0078, 0x3bb7, 0x1078,
++	0x22ac, 0xa684, 0x0010, 0x0040, 0x3bc9, 0x1078, 0x3e79, 0x0078,
++	0x231a, 0x0078, 0x3eda, 0x2200, 0x0079, 0x3bce, 0x3bd1, 0x3bd1,
++	0x3bd1, 0x1078, 0x22ac, 0x2200, 0x0079, 0x3bd6, 0x3bd9, 0x3bd9,
++	0x3bdb, 0x1078, 0x22ac, 0x70ab, 0x3be3, 0x2001, 0x0003, 0x1078,
++	0x424c, 0x0078, 0x430f, 0x0078, 0x4309, 0x2300, 0x0079, 0x3be8,
++	0x3bed, 0x3bef, 0x3beb, 0x1078, 0x22ac, 0x70a4, 0x007a, 0x70a4,
++	0x007a, 0xa282, 0x0002, 0x0050, 0x3bf7, 0x1078, 0x22ac, 0xa684,
++	0x0200, 0x0040, 0x3c01, 0x1078, 0x42d4, 0x1078, 0x3f79, 0x1078,
++	0x42db, 0x2300, 0x0079, 0x3c04, 0x3c07, 0x3c1d, 0x3c77, 0xa286,
++	0x0001, 0x0040, 0x3c0d, 0x1078, 0x22ac, 0xa684, 0x0200, 0x0040,
++	0x3c15, 0x1078, 0x42d4, 0x1078, 0x42db, 0x2001, 0x0001, 0x1078,
++	0x4254, 0x7003, 0x0000, 0x0078, 0x399c, 0x2200, 0x0079, 0x3c20,
++	0x3c22, 0x3c47, 0x70a7, 0x3c26, 0x0078, 0x4315, 0x2011, 0x000d,
++	0x1078, 0x3f91, 0x0079, 0x3c2c, 0x3c31, 0x231a, 0x399c, 0x3c39,
++	0x3c41, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x0078,
++	0x4303, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x0078,
++	0x4303, 0x70ab, 0x3c45, 0x0078, 0x231a, 0x0078, 0x3c31, 0x70a7,
++	0x3c4b, 0x0078, 0x4315, 0x2011, 0x0012, 0x1078, 0x3f91, 0x0079,
++	0x3c51, 0x3c57, 0x231a, 0x399c, 0x3c63, 0x3c6b, 0x3c71, 0xa6b4,
++	0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x70bc, 0xa080, 0x00a1,
++	0x781a, 0x0078, 0x231a, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6,
++	0x7e5a, 0x0078, 0x4303, 0x70ab, 0x3c6f, 0x0078, 0x231a, 0x0078,
++	0x3c57, 0x70ab, 0x3c75, 0x0078, 0x231a, 0x0078, 0x3c63, 0xa286,
++	0x0001, 0x0040, 0x3c7d, 0x1078, 0x22ac, 0x70a7, 0x3c81, 0x0078,
++	0x4315, 0x2011, 0x0015, 0x1078, 0x3f91, 0x0079, 0x3c87, 0x3c8c,
++	0x231a, 0x399c, 0x3c94, 0x3c9c, 0xa6b4, 0x00ff, 0xa6b5, 0x0400,
++	0x6eb6, 0x7e5a, 0x0078, 0x4303, 0xa6b4, 0x00ff, 0xa6b5, 0x0400,
++	0x6eb6, 0x7e5a, 0x0078, 0x4303, 0x70ab, 0x3ca0, 0x0078, 0x231a,
++	0x0078, 0x3c8c, 0xa282, 0x0002, 0x0050, 0x3ca8, 0x1078, 0x22ac,
++	0x2300, 0x0079, 0x3cab, 0x3cae, 0x3cd7, 0x3d26, 0xa286, 0x0001,
++	0x0040, 0x3cb4, 0x1078, 0x22ac, 0x6804, 0xa084, 0x00ff, 0xa086,
++	0x0006, 0x00c0, 0x3cc1, 0x1078, 0x3906, 0x7003, 0x0000, 0x0078,
++	0x399c, 0x6837, 0x0000, 0x683b, 0x0000, 0xa684, 0x0200, 0x0040,
++	0x3ccf, 0x1078, 0x42d4, 0x1078, 0x3f79, 0x1078, 0x42db, 0x2001,
++	0x0001, 0x1078, 0x4254, 0x7003, 0x0000, 0x0078, 0x399c, 0x2200,
++	0x0079, 0x3cda, 0x3cdc, 0x3d01, 0x70a7, 0x3ce0, 0x0078, 0x4315,
++	0x2011, 0x000d, 0x1078, 0x3f91, 0x0079, 0x3ce6, 0x3ceb, 0x231a,
++	0x399c, 0x3cf3, 0x3cfb, 0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6,
++	0x7e5a, 0x0078, 0x4303, 0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6,
++	0x7e5a, 0x0078, 0x4303, 0x70ab, 0x3cff, 0x0078, 0x231a, 0x0078,
++	0x3ceb, 0x70a7, 0x3d05, 0x0078, 0x4315, 0x2011, 0x0005, 0x1078,
++	0x3f91, 0x0079, 0x3d0b, 0x3d10, 0x231a, 0x399c, 0x3d18, 0x3d20,
++	0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4303,
++	0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4303,
++	0x70ab, 0x3d24, 0x0078, 0x231a, 0x0078, 0x3d10, 0xa286, 0x0001,
++	0x0040, 0x3d2c, 0x1078, 0x22ac, 0x70a7, 0x3d30, 0x0078, 0x4315,
++	0x2011, 0x0006, 0x1078, 0x3f91, 0x0079, 0x3d36, 0x3d3b, 0x231a,
++	0x399c, 0x3d41, 0x3d43, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078,
++	0x4303, 0x1078, 0x22ac, 0x70ab, 0x3d47, 0x0078, 0x231a, 0x0078,
++	0x3d3b, 0x2300, 0x0079, 0x3d4c, 0x3d51, 0x3d4f, 0x3d4f, 0x1078,
++	0x22ac, 0x1078, 0x22ac, 0x2300, 0x71a8, 0xa005, 0x017a, 0xa282,
++	0x0002, 0x0050, 0x3d5d, 0x1078, 0x22ac, 0x2300, 0x0079, 0x3d60,
++	0x3d63, 0x3d76, 0x3d94, 0x82ff, 0x00c0, 0x3d68, 0x1078, 0x22ac,
++	0xa684, 0x0200, 0x0040, 0x3d70, 0x1078, 0x42d4, 0x1078, 0x42db,
++	0x2001, 0x0001, 0x1078, 0x4254, 0x0078, 0x231a, 0x82ff, 0x0040,
++	0x3d7b, 0x1078, 0x22ac, 0x70a7, 0x3d7f, 0x0078, 0x4315, 0x2011,
++	0x0018, 0x1078, 0x3f91, 0x0079, 0x3d85, 0x3d8a, 0x231a, 0x399c,
++	0x3d8c, 0x3d8e, 0x0078, 0x4303, 0x0078, 0x4303, 0x70ab, 0x3d92,
++	0x0078, 0x231a, 0x0078, 0x3d8a, 0x2200, 0x0079, 0x3d97, 0x3d99,
++	0x3db2, 0x70a7, 0x3d9d, 0x0078, 0x4315, 0x2011, 0x0018, 0x1078,
++	0x3f91, 0x0079, 0x3da3, 0x3da8, 0x231a, 0x399c, 0x3daa, 0x3dac,
++	0x0078, 0x4303, 0x0078, 0x4303, 0x70ab, 0x3db0, 0x0078, 0x231a,
++	0x0078, 0x3da8, 0xa484, 0x8000, 0x00c0, 0x3df0, 0xa684, 0x0100,
++	0x0040, 0x3dc6, 0x1078, 0x42d4, 0x1078, 0x3f79, 0x1078, 0x42db,
++	0x7848, 0xa085, 0x000c, 0x784a, 0x0078, 0x3dca, 0x78d8, 0x78d2,
++	0x78dc, 0x78d6, 0xa6b4, 0xefff, 0x7e5a, 0x70a7, 0x3dd1, 0x0078,
++	0x4315, 0x2011, 0x000d, 0x1078, 0x3f91, 0x0079, 0x3dd7, 0x3ddc,
++	0x231a, 0x399c, 0x3ddc, 0x3dea, 0xa684, 0x0100, 0x0040, 0x3de8,
++	0x1078, 0x4291, 0x6830, 0x78d2, 0x682c, 0x78d6, 0x1078, 0x42cc,
++	0x0078, 0x4303, 0x70ab, 0x3dee, 0x0078, 0x231a, 0x0078, 0x3ddc,
++	0x1078, 0x42db, 0x70ab, 0x3dfa, 0x2001, 0x0003, 0x1078, 0x424c,
++	0x0078, 0x430f, 0x1078, 0x42cc, 0x6830, 0x78d2, 0x682c, 0x78d6,
++	0x0078, 0x4303, 0x681b, 0x0000, 0xa684, 0x0008, 0x0040, 0x3e20,
++	0x157e, 0x137e, 0x147e, 0x7890, 0x8004, 0x8004, 0x8004, 0x8004,
++	0xa084, 0x000f, 0x681a, 0x80ac, 0x789b, 0x0000, 0xaf80, 0x002c,
++	0x2098, 0xad80, 0x000b, 0x20a0, 0x53a5, 0x147f, 0x137f, 0x157f,
++	0xa6c4, 0x0f00, 0xa684, 0x0002, 0x00c0, 0x3e2d, 0x692c, 0x810f,
++	0x810d, 0x810d, 0x810d, 0x0078, 0x3e3a, 0x789b, 0x0010, 0x79ac,
++	0x0078, 0x3e3a, 0x017e, 0x2009, 0x0005, 0x2001, 0x3d00, 0x1078,
++	0x429c, 0x017f, 0xa184, 0x001f, 0xa805, 0x6816, 0x1078, 0x3977,
++	0x68be, 0xa684, 0x0004, 0x0040, 0x3e4b, 0xa18c, 0xff00, 0x78a8,
++	0xa084, 0x00ff, 0xa105, 0x682a, 0xa6b4, 0x00ff, 0x6000, 0xa084,
++	0x0008, 0x0040, 0x3e55, 0xa6b5, 0x4000, 0x6eb6, 0x007c, 0x157e,
++	0x137e, 0x147e, 0x6918, 0x7890, 0x8004, 0x8004, 0x8004, 0x8004,
++	0xa084, 0x000f, 0x007e, 0xa100, 0x681a, 0x007f, 0x8004, 0x0040,
++	0x3e75, 0x20a8, 0x8104, 0xa080, 0x000b, 0xad00, 0x20a0, 0x789b,
++	0x0000, 0xaf80, 0x002c, 0x2098, 0x53a5, 0x147f, 0x137f, 0x157f,
++	0x007c, 0x682c, 0xa084, 0x2000, 0x00c0, 0x3e81, 0x620c, 0x0078,
++	0x3e82, 0x6210, 0x6b18, 0x2300, 0xa202, 0x0040, 0x3ea0, 0x2018,
++	0xa382, 0x000e, 0x0048, 0x3e92, 0x0040, 0x3e92, 0x2019, 0x000e,
++	0x0078, 0x3e96, 0x7858, 0xa084, 0xffef, 0x785a, 0x783b, 0x1b02,
++	0x7893, 0x0000, 0x7ba2, 0x70bc, 0xa080, 0x008a, 0x781a, 0x007c,
++	0x7858, 0xa084, 0xffef, 0x785a, 0x783b, 0x1b02, 0x7893, 0x0000,
++	0x007c, 0x6807, 0x0117, 0x6914, 0x1078, 0x3977, 0x6100, 0x8104,
++	0x00c8, 0x3ec6, 0x601c, 0xa005, 0x0040, 0x3eba, 0x2001, 0x0800,
++	0x0078, 0x3ec8, 0x0d7e, 0x6824, 0x007e, 0x1078, 0x42e4, 0x007f,
++	0x6826, 0x2d00, 0x682e, 0x1078, 0x3906, 0x0d7f, 0x2001, 0x0200,
++	0x6826, 0x8007, 0x789b, 0x000e, 0x78aa, 0x681c, 0xa085, 0x8000,
++	0x681e, 0x2031, 0x0400, 0x6eb6, 0x7e5a, 0x71bc, 0xa188, 0x008d,
++	0x791a, 0x007c, 0x6914, 0x1078, 0x3977, 0x6100, 0x8104, 0x00c8,
++	0x3f27, 0xa184, 0x0300, 0x0040, 0x3ee9, 0x6807, 0x0117, 0x0078,
++	0x3f07, 0x6004, 0xa005, 0x00c0, 0x3f10, 0x6807, 0x0117, 0x601c,
++	0xa005, 0x00c0, 0x3efd, 0x0d7e, 0x1078, 0x42e4, 0x6827, 0x0034,
++	0x2d00, 0x682e, 0x1078, 0x3906, 0x0d7f, 0xa684, 0x0004, 0x0040,
++	0x3f07, 0x2031, 0x0400, 0x2001, 0x2800, 0x0078, 0x3f0b, 0x2031,
++	0x0400, 0x2001, 0x0800, 0x71bc, 0xa188, 0x008d, 0x0078, 0x3f56,
++	0x6018, 0xa005, 0x00c0, 0x3efd, 0x601c, 0xa005, 0x00c0, 0x3efd,
++	0x689f, 0x0000, 0x6827, 0x003d, 0xa684, 0x0001, 0x0040, 0x3f64,
++	0xa6b5, 0x0800, 0x71bc, 0xa188, 0x00a5, 0x0078, 0x3f5f, 0x6807,
++	0x0117, 0x2031, 0x0400, 0x692c, 0x810f, 0xa18c, 0x00ff, 0xa186,
++	0x0012, 0x00c0, 0x3f39, 0x2001, 0x3f6f, 0x2009, 0x0001, 0x0078,
++	0x3f4a, 0xa186, 0x0003, 0x00c0, 0x3f43, 0x2001, 0x3f70, 0x2009,
++	0x0012, 0x0078, 0x3f4a, 0x2001, 0x0200, 0x71bc, 0xa188, 0x008d,
++	0x0078, 0x3f56, 0x1078, 0x42b7, 0x78a3, 0x0000, 0x6820, 0xa085,
++	0x0040, 0x6822, 0x71bc, 0xa188, 0x00da, 0xa006, 0x6826, 0x8007,
++	0x789b, 0x000e, 0x78aa, 0x681c, 0xa085, 0x8000, 0x681e, 0x6eb6,
++	0x7e5a, 0x791a, 0x0078, 0x231a, 0x6eb6, 0x1078, 0x3906, 0x6814,
++	0x70ae, 0x6828, 0x70b2, 0x7003, 0x0007, 0x0078, 0x231a, 0x0023,
++	0x0070, 0x0005, 0x0000, 0x0a00, 0x0000, 0x0000, 0x0025, 0x0000,
++	0x0000, 0x6837, 0x0000, 0x683b, 0x0000, 0xa684, 0x0200, 0x0040,
++	0x3f90, 0x78b8, 0xa08c, 0x001f, 0xa084, 0x8000, 0x0040, 0x3f89,
++	0x8108, 0x78d8, 0xa100, 0x683a, 0x78dc, 0xa081, 0x0000, 0x6836,
++	0x007c, 0x7990, 0x810f, 0xa5ac, 0x0007, 0x2021, 0x0000, 0xa480,
++	0x0010, 0x789a, 0x79a8, 0xa18c, 0x00ff, 0xa184, 0x0080, 0x00c0,
++	0x3fbf, 0xa182, 0x0020, 0x00c8, 0x3fd9, 0xa182, 0x0012, 0x00c8,
++	0x4241, 0x2100, 0x1079, 0x3fad, 0x007c, 0x4241, 0x418a, 0x4241,
++	0x4241, 0x3fe6, 0x3fe9, 0x4023, 0x4063, 0x4093, 0x4096, 0x4241,
++	0x4241, 0x4045, 0x40b8, 0x40f3, 0x4241, 0x4241, 0x411b, 0xa18c,
++	0x001f, 0x6814, 0xa084, 0x001f, 0xa106, 0x0040, 0x3fd6, 0x70bc,
++	0xa080, 0x00c4, 0x781a, 0x2001, 0x0014, 0x1078, 0x4254, 0x1078,
++	0x42db, 0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x2001, 0x0000,
++	0x007c, 0xa182, 0x0024, 0x00c8, 0x4241, 0xa184, 0x0003, 0x1079,
++	0x3fad, 0x007c, 0x4241, 0x4241, 0x4241, 0x4241, 0x1078, 0x4241,
++	0x007c, 0x2200, 0x0079, 0x3fec, 0x411e, 0x411e, 0x4010, 0x4010,
++	0x4010, 0x4010, 0x4010, 0x4010, 0x4010, 0x4010, 0x400e, 0x4010,
++	0x4005, 0x4010, 0x4010, 0x4010, 0x4010, 0x4010, 0x4018, 0x401b,
++	0x411e, 0x401b, 0x4010, 0x4010, 0x4010, 0x0c7e, 0x077e, 0x6f14,
++	0x1078, 0x34f9, 0x077f, 0x0c7f, 0x0078, 0x4010, 0x1078, 0x41df,
++	0x6827, 0x02b3, 0x2009, 0x000b, 0x2001, 0x4800, 0x0078, 0x414e,
++	0x1078, 0x4236, 0x007c, 0x6827, 0x0293, 0x2009, 0x000b, 0x2001,
++	0x4800, 0x0078, 0x413a, 0x2d58, 0x6804, 0xa084, 0x00ff, 0xa086,
++	0x0006, 0x00c0, 0x402d, 0x6807, 0x0117, 0x6827, 0x0002, 0x1078,
++	0x42e4, 0x6827, 0x0036, 0x810f, 0x6932, 0x2d00, 0x682e, 0x0d7e,
++	0x1078, 0x38d6, 0x1078, 0x4172, 0x2b68, 0x1078, 0x3906, 0x0d7f,
++	0x1078, 0x3906, 0x2001, 0x0002, 0x007c, 0x1078, 0x4172, 0x6904,
++	0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4056, 0xa186, 0x000f,
++	0x0040, 0x4056, 0x1078, 0x18a0, 0x70a3, 0x0000, 0x2009, 0x4d38,
++	0x200b, 0x0006, 0x70b7, 0x0017, 0x2009, 0x0200, 0x1078, 0x3816,
++	0x2001, 0x0001, 0x007c, 0x2200, 0x0079, 0x4066, 0x411e, 0x414b,
++	0x414b, 0x414b, 0x4085, 0x415b, 0x415b, 0x415b, 0x415b, 0x415e,
++	0x415e, 0x4163, 0x4163, 0x407f, 0x407f, 0x414b, 0x414b, 0x415b,
++	0x414b, 0x408b, 0x411e, 0x408b, 0x408b, 0x415b, 0x408b, 0x2009,
++	0x000b, 0x2001, 0x4300, 0x0078, 0x416d, 0x2009, 0x000b, 0x2001,
++	0x4300, 0x0078, 0x414e, 0x6827, 0x0293, 0x2009, 0x000b, 0x2001,
++	0x4300, 0x0078, 0x413a, 0x2001, 0x0000, 0x007c, 0x2200, 0x0079,
++	0x4099, 0x411e, 0x40b2, 0x40b2, 0x40b2, 0x40b2, 0x415b, 0x415b,
++	0x415b, 0x415b, 0x415b, 0x415b, 0x415b, 0x415b, 0x40b2, 0x40b2,
++	0x40b2, 0x40b2, 0x415b, 0x40b2, 0x40b2, 0x415b, 0x415b, 0x415b,
++	0x415b, 0x411e, 0x2009, 0x000b, 0x2001, 0x4300, 0x0078, 0x413a,
++	0xa684, 0x0004, 0x00c0, 0x40cc, 0x6804, 0xa084, 0x00ff, 0xa086,
++	0x0006, 0x00c0, 0x4241, 0x1078, 0x4172, 0x6807, 0x0117, 0x1078,
++	0x3906, 0x2001, 0x0002, 0x007c, 0x6000, 0xa084, 0x0004, 0x0040,
++	0x4241, 0x2d58, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0,
++	0x40db, 0x6807, 0x0117, 0x6827, 0x0002, 0x1078, 0x42e4, 0x6827,
++	0x0036, 0x810f, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078, 0x38e5,
++	0x1078, 0x4172, 0x2b68, 0x1078, 0x3906, 0x0d7f, 0x1078, 0x3906,
++	0x2001, 0x0002, 0x007c, 0x6000, 0xa084, 0x0004, 0x0040, 0x4241,
++	0x2d58, 0x6a04, 0xa294, 0x00ff, 0xa286, 0x0006, 0x00c0, 0x4102,
++	0x6807, 0x0117, 0x6827, 0x0002, 0x2d58, 0x1078, 0x42e4, 0x6827,
++	0x0036, 0x810f, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078, 0x38f5,
++	0x1078, 0x4172, 0x2b68, 0x1078, 0x3906, 0x0d7f, 0x1078, 0x3906,
++	0x2001, 0x0002, 0x007c, 0x1078, 0x4241, 0x007c, 0x70bc, 0xa080,
++	0x00c4, 0x781a, 0x2001, 0x0001, 0x1078, 0x4254, 0x1078, 0x42db,
++	0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x1078, 0x429c, 0x1078,
++	0x42d4, 0x1078, 0x3f79, 0x1078, 0x3ea9, 0x1078, 0x42db, 0x2001,
++	0x0001, 0x007c, 0x1078, 0x429c, 0x1078, 0x42d4, 0x1078, 0x3f79,
++	0x70bc, 0xa080, 0x00c4, 0x781a, 0x1078, 0x42db, 0x7003, 0x0000,
++	0x2001, 0x0002, 0x007c, 0x1078, 0x4241, 0x007c, 0x1078, 0x429c,
++	0x1078, 0x42d4, 0x1078, 0x3f79, 0x1078, 0x3ea9, 0x1078, 0x42db,
++	0x2001, 0x0001, 0x007c, 0x2001, 0x0003, 0x007c, 0x1078, 0x41df,
++	0x2001, 0x0000, 0x007c, 0x0c7e, 0x077e, 0x6f14, 0x1078, 0x34f9,
++	0x077f, 0x0c7f, 0x2001, 0x0000, 0x007c, 0x1078, 0x429c, 0x1078,
++	0x4241, 0x007c, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040,
++	0x417d, 0xa186, 0x000f, 0x00c0, 0x4181, 0x1078, 0x42d4, 0x1078,
++	0x3f79, 0x70bc, 0xa080, 0x00c4, 0x781a, 0x1078, 0x42db, 0x7003,
++	0x0000, 0x007c, 0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff,
++	0xa08a, 0x0004, 0x00c8, 0x4241, 0x1079, 0x4197, 0x007c, 0x4241,
++	0x419b, 0x4241, 0x41ed, 0xa282, 0x0003, 0x0040, 0x41a2, 0x1078,
++	0x4241, 0x007c, 0x7da8, 0xa5ac, 0x00ff, 0x7ca8, 0xa4a4, 0x00ff,
++	0xa482, 0x000c, 0x0048, 0x41b0, 0x0040, 0x41b0, 0x2021, 0x000c,
++	0x701c, 0xa502, 0x00c8, 0x41b5, 0x751c, 0x1078, 0x4227, 0x852b,
++	0x852b, 0x1078, 0x3577, 0x0040, 0x41c1, 0x1078, 0x41d1, 0x0078,
++	0x41c5, 0x1078, 0x4223, 0x1078, 0x41df, 0xa6b5, 0x1000, 0x789b,
++	0x007e, 0x7ea6, 0x70bc, 0xa080, 0x00b0, 0x781a, 0x2001, 0x0004,
++	0x007c, 0x0c7e, 0x6914, 0x810f, 0xa18c, 0x000f, 0x810b, 0x810b,
++	0x810b, 0xa1e0, 0x4f80, 0x1078, 0x338b, 0x0c7f, 0x007c, 0x0c7e,
++	0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e0,
++	0x4f80, 0x1078, 0x33b2, 0x0c7f, 0x007c, 0xa282, 0x0002, 0x00c0,
++	0x4241, 0x7aa8, 0xa294, 0x00ff, 0xa284, 0xfffe, 0x0040, 0x41fa,
++	0x2011, 0x0001, 0x1078, 0x4215, 0x1078, 0x4207, 0x1078, 0x41df,
++	0x70bc, 0xa080, 0x00b0, 0x781a, 0x2001, 0x0004, 0x007c, 0x0c7e,
++	0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e0,
++	0x4f80, 0x1078, 0x3457, 0x0c7f, 0x007c, 0x789b, 0x0018, 0x78ab,
++	0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0081,
++	0x78ab, 0x0004, 0x007c, 0x2021, 0x0000, 0x2029, 0x0032, 0x789b,
++	0x0018, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa,
++	0x7caa, 0x789b, 0x0081, 0x78ab, 0x0005, 0x007c, 0x2001, 0x0003,
++	0x1078, 0x424c, 0x70bc, 0xa080, 0x00b0, 0x781a, 0x2001, 0x0005,
++	0x007c, 0x2001, 0x0007, 0x1078, 0x424c, 0x70bc, 0xa080, 0x00b0,
++	0x781a, 0x2001, 0x0004, 0x007c, 0x789b, 0x0018, 0x78aa, 0x789b,
++	0x0081, 0x78ab, 0x0001, 0x007c, 0x6904, 0xa18c, 0x00ff, 0xa196,
++	0x0007, 0x0040, 0x4262, 0xa196, 0x000f, 0x0040, 0x4262, 0x1078,
++	0x18a0, 0x007c, 0x6924, 0xa194, 0x003f, 0x00c0, 0x426b, 0xa18c,
++	0xffc0, 0xa105, 0x6826, 0x1078, 0x3906, 0x6920, 0xa184, 0x0100,
++	0x0040, 0x4290, 0x6824, 0xa084, 0x0001, 0x0040, 0x4290, 0x6b14,
++	0xa184, 0x0002, 0x00c0, 0x4280, 0x1078, 0x1b1b, 0x0078, 0x4285,
++	0x6c28, 0xa4a4, 0x00ff, 0x1078, 0x1ab9, 0x0d7e, 0x2068, 0x1078,
++	0x18a0, 0x0d7f, 0x6914, 0x1078, 0x3977, 0x6204, 0x8210, 0x6206,
++	0x007c, 0x6930, 0x6838, 0x6832, 0xa112, 0x692c, 0x6834, 0x682e,
++	0xa11b, 0xa200, 0xa301, 0x007c, 0x0c7e, 0xade0, 0x0018, 0x6003,
++	0x7000, 0x810f, 0x6106, 0x600b, 0x0000, 0x600f, 0x000a, 0x6013,
++	0x0000, 0x6017, 0x0000, 0x8007, 0x601a, 0x601f, 0x0000, 0x6023,
++	0x0000, 0x0c7f, 0x6824, 0xa085, 0x0080, 0x6826, 0x007c, 0x157e,
++	0x137e, 0x147e, 0x2098, 0xaf80, 0x002d, 0x20a0, 0x81ac, 0x0040,
++	0x42c2, 0x53a6, 0xa184, 0x0001, 0x0040, 0x42c8, 0x3304, 0x78be,
++	0x147f, 0x137f, 0x157f, 0x007c, 0x70b8, 0xa005, 0x10c0, 0x22ac,
++	0x70bb, 0x8000, 0x0078, 0x45ed, 0x71b8, 0x81ff, 0x0040, 0x42da,
++	0x1078, 0x46d8, 0x007c, 0x71b8, 0x81ff, 0x0040, 0x42e3, 0x70bb,
++	0x0000, 0x1078, 0x431b, 0x007c, 0x0c7e, 0x0d7e, 0x1078, 0x187d,
++	0x0c7f, 0x157e, 0x137e, 0x147e, 0x2da0, 0x2c98, 0x20a9, 0x0031,
++	0x53a3, 0x147f, 0x137f, 0x157f, 0x6807, 0x010d, 0x680b, 0x0000,
++	0x7004, 0x8007, 0x681a, 0x681f, 0x0000, 0x6823, 0x0000, 0x689f,
++	0x0000, 0x0c7f, 0x007c, 0x70bc, 0xa080, 0x008d, 0x781a, 0x0078,
++	0x231a, 0x70bc, 0xa080, 0x007d, 0x781a, 0x0078, 0x231a, 0x70bc,
++	0xa080, 0x00b0, 0x781a, 0x0078, 0x231a, 0x70bc, 0xa080, 0x00ba,
++	0x781a, 0x0078, 0x231a, 0x127e, 0x2091, 0x2200, 0x2049, 0x431b,
++	0x7000, 0x7204, 0xa205, 0x720c, 0xa215, 0x7008, 0xa084, 0xfffd,
++	0xa205, 0x0040, 0x432d, 0x0078, 0x4332, 0x7003, 0x0000, 0x127f,
++	0x2000, 0x007c, 0x7000, 0xa084, 0x0001, 0x00c0, 0x4360, 0x7108,
++	0x8104, 0x00c8, 0x433f, 0x1078, 0x4462, 0x0078, 0x4337, 0x700c,
++	0xa08c, 0x00ff, 0x0040, 0x4360, 0x7004, 0x8004, 0x00c8, 0x4357,
++	0x7014, 0xa005, 0x00c0, 0x4353, 0x7010, 0xa005, 0x0040, 0x4357,
++	0xa102, 0x00c8, 0x4337, 0x7007, 0x0010, 0x0078, 0x4360, 0x8aff,
++	0x0040, 0x4360, 0x1078, 0x46ba, 0x00c0, 0x435a, 0x0040, 0x4337,
++	0x1078, 0x43eb, 0x7003, 0x0000, 0x127f, 0x2000, 0x007c, 0x017e,
++	0x6104, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4373, 0xa18e,
++	0x000f, 0x00c0, 0x4376, 0x6040, 0x0078, 0x4377, 0x6428, 0x017f,
++	0x84ff, 0x0040, 0x43a1, 0x2c70, 0x7004, 0xa0bc, 0x000f, 0xa7b8,
++	0x43b1, 0x273c, 0x87fb, 0x00c0, 0x438f, 0x0048, 0x4389, 0x1078,
++	0x22ac, 0x609c, 0xa075, 0x0040, 0x43a1, 0x0078, 0x437c, 0x2704,
++	0xae68, 0x680c, 0xa630, 0x6808, 0xa529, 0x8421, 0x0040, 0x43a1,
++	0x8738, 0x2704, 0xa005, 0x00c0, 0x4390, 0x709c, 0xa075, 0x00c0,
++	0x437c, 0x007c, 0x0000, 0x0005, 0x0009, 0x000d, 0x0011, 0x0015,
++	0x0019, 0x001d, 0x0000, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b,
++	0x0000, 0x0000, 0x43a6, 0x43a3, 0x0000, 0x0000, 0x8000, 0x0000,
++	0x43a6, 0x0000, 0x43ae, 0x43ab, 0x0000, 0x0000, 0x0000, 0x0000,
++	0x43ae, 0x0000, 0x43a9, 0x43a9, 0x0000, 0x0000, 0x8000, 0x0000,
++	0x43a9, 0x0000, 0x43af, 0x43af, 0x0000, 0x0000, 0x0000, 0x0000,
++	0x43af, 0x127e, 0x2091, 0x2200, 0x2079, 0x4d00, 0x2071, 0x0010,
++	0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2071, 0x0020,
++	0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2049, 0x0000,
++	0x127f, 0x2000, 0x007c, 0x2049, 0x43eb, 0x2019, 0x0000, 0x7004,
++	0x8004, 0x00c8, 0x443e, 0x7007, 0x0012, 0x7108, 0x7008, 0xa106,
++	0x00c0, 0x43f5, 0xa184, 0x000c, 0x0040, 0x4400, 0x1078, 0x22ac,
++	0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8, 0x440b, 0xa184,
++	0x0000, 0x00c0, 0x43f5, 0xa19c, 0x0032, 0xa386, 0x0030, 0x0040,
++	0x4419, 0xa386, 0x0002, 0x0040, 0x4424, 0xa386, 0x0032, 0x00c0,
++	0x43f5, 0x7200, 0x8204, 0x0048, 0x4424, 0x730c, 0xa384, 0x00ff,
++	0x0040, 0x4424, 0x1078, 0x22ac, 0x7007, 0x0012, 0x7000, 0xa084,
++	0x0001, 0x00c0, 0x443e, 0x7008, 0xa084, 0x000c, 0x00c0, 0x443e,
++	0x7310, 0x7014, 0xa305, 0x0040, 0x443e, 0x710c, 0xa184, 0x0300,
++	0x00c0, 0x443e, 0xa184, 0x00ff, 0x00c0, 0x43eb, 0x7007, 0x0012,
++	0x7007, 0x0008, 0x7004, 0xa084, 0x0008, 0x00c0, 0x4442, 0x7007,
++	0x0012, 0x7108, 0x8104, 0x0048, 0x4447, 0x7003, 0x0000, 0x2049,
++	0x0000, 0x007c, 0x107e, 0x007e, 0x127e, 0x157e, 0x2091, 0x2200,
++	0x7108, 0x1078, 0x4462, 0x157f, 0x127f, 0x2091, 0x8001, 0x007f,
++	0x107f, 0x007c, 0x7204, 0x7500, 0x730c, 0xa384, 0x0300, 0x00c0,
++	0x4497, 0xa184, 0x000c, 0x00c0, 0x44bb, 0x7108, 0xa184, 0x000c,
++	0x00c0, 0x44bb, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8,
++	0x447d, 0xa184, 0x0000, 0x00c0, 0x446d, 0xa184, 0x00c0, 0x8004,
++	0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0xa18c, 0x0030, 0xa18e,
++	0x0030, 0x00c0, 0x448d, 0xa085, 0x0004, 0x0079, 0x448f, 0x4499,
++	0x44ab, 0x4497, 0x44ab, 0x4497, 0x44f7, 0x4497, 0x44f5, 0x1078,
++	0x22ac, 0x7004, 0xa084, 0x0010, 0xa085, 0x0002, 0x7006, 0x8aff,
++	0x00c0, 0x44a6, 0x2049, 0x0000, 0x0078, 0x44aa, 0x1078, 0x46ba,
++	0x00c0, 0x44a6, 0x007c, 0x7004, 0xa084, 0x0010, 0xa085, 0x0002,
++	0x7006, 0x8aff, 0x00c0, 0x44b6, 0x0078, 0x44ba, 0x1078, 0x46ba,
++	0x00c0, 0x44b6, 0x007c, 0x7007, 0x0012, 0x7108, 0x00e0, 0x44be,
++	0x2091, 0x6000, 0x00e0, 0x44c2, 0x2091, 0x6000, 0x7007, 0x0012,
++	0x7007, 0x0008, 0x7004, 0xa084, 0x0008, 0x00c0, 0x44ca, 0x7007,
++	0x0012, 0x7108, 0x8104, 0x0048, 0x44cf, 0x7003, 0x0000, 0x7000,
++	0xa005, 0x00c0, 0x44e3, 0x7004, 0xa005, 0x00c0, 0x44e3, 0x700c,
++	0xa005, 0x0040, 0x44e5, 0x0078, 0x44c6, 0x2049, 0x0000, 0x1078,
++	0x3616, 0x6818, 0xa084, 0x8000, 0x0040, 0x44f0, 0x681b, 0x0002,
++	0x007c, 0x1078, 0x22ac, 0x1078, 0x22ac, 0x1078, 0x4553, 0x7210,
++	0x7114, 0x700c, 0xa09c, 0x00ff, 0x2800, 0xa300, 0xa211, 0xa189,
++	0x0000, 0x1078, 0x4553, 0x2704, 0x2c58, 0xac60, 0x630c, 0x2200,
++	0xa322, 0x6308, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0040, 0x451a,
++	0x00c8, 0x451a, 0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60,
++	0x0078, 0x4501, 0x2b60, 0x8a07, 0x007e, 0x6004, 0xa084, 0x0008,
++	0x0040, 0x4526, 0xa7ba, 0x43ab, 0x0078, 0x4528, 0xa7ba, 0x43a3,
++	0x007f, 0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92, 0x6b8e, 0x7007,
++	0x0012, 0x1078, 0x43eb, 0x007c, 0x8738, 0x2704, 0xa005, 0x00c0,
++	0x4547, 0x609c, 0xa005, 0x0040, 0x4550, 0x2060, 0x6004, 0xa084,
++	0x000f, 0xa080, 0x43b1, 0x203c, 0x87fb, 0x1040, 0x22ac, 0x8a51,
++	0x0040, 0x454f, 0x7008, 0xa084, 0x00c0, 0xa086, 0x00c0, 0x007c,
++	0x2051, 0x0000, 0x007c, 0x8a50, 0x8739, 0x2704, 0xa004, 0x00c0,
++	0x4567, 0x6000, 0xa064, 0x00c0, 0x455e, 0x2d60, 0x6004, 0xa084,
++	0x000f, 0xa080, 0x43c1, 0x203c, 0x87fb, 0x1040, 0x22ac, 0x007c,
++	0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x6884, 0x2060, 0x6888,
++	0x6b8c, 0x6c90, 0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0x007e,
++	0x6804, 0xa084, 0x0008, 0x007f, 0x0040, 0x4582, 0xa0b8, 0x43ab,
++	0x0078, 0x4584, 0xa0b8, 0x43a3, 0x7e08, 0xa6b5, 0x000c, 0x6904,
++	0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4592, 0xa18e, 0x000f,
++	0x00c0, 0x459b, 0x6820, 0xa084, 0x0040, 0x0040, 0x45a2, 0xa6b5,
++	0x0001, 0x0078, 0x45a2, 0x681c, 0xa084, 0x0040, 0x0040, 0x45a2,
++	0xa6b5, 0x0001, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
++	0x45a4, 0x2400, 0xa305, 0x00c0, 0x45af, 0x0078, 0x45d5, 0x2c58,
++	0x2704, 0x6104, 0xac60, 0x6004, 0xa400, 0x701a, 0x6000, 0xa301,
++	0x701e, 0xa184, 0x0008, 0x0040, 0x45c5, 0x6014, 0xa081, 0x0000,
++	0x7022, 0x6010, 0xa081, 0x0000, 0x7026, 0x620c, 0x2400, 0xa202,
++	0x7012, 0x6208, 0x2300, 0xa203, 0x7016, 0x7602, 0x7007, 0x0001,
++	0x2b60, 0x1078, 0x4534, 0x0078, 0x45d7, 0x1078, 0x46ba, 0x00c0,
++	0x45d5, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200,
++	0x0d7f, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x45e3,
++	0x7003, 0x0008, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091,
++	0x2200, 0x0d7f, 0x2049, 0x45ed, 0x7007, 0x0004, 0x7004, 0xa084,
++	0x0004, 0x00c0, 0x45f6, 0x7e08, 0xa6b5, 0x000c, 0x6904, 0xa18c,
++	0x00ff, 0xa186, 0x0007, 0x0040, 0x4609, 0xa18e, 0x000f, 0x00c0,
++	0x4614, 0x6820, 0xa084, 0x0040, 0x0040, 0x4610, 0xa6b5, 0x0001,
++	0x6840, 0x2050, 0x0078, 0x461d, 0x681c, 0xa084, 0x0020, 0x00c0,
++	0x461b, 0xa6b5, 0x0001, 0x6828, 0x2050, 0x2d60, 0x6004, 0xa0bc,
++	0x000f, 0xa7b8, 0x43b1, 0x273c, 0x87fb, 0x00c0, 0x4631, 0x0048,
++	0x462b, 0x1078, 0x22ac, 0x689c, 0xa065, 0x0040, 0x4635, 0x0078,
++	0x461e, 0x1078, 0x46ba, 0x00c0, 0x4631, 0x127f, 0x2000, 0x007c,
++	0x127e, 0x007e, 0x017e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x037f,
++	0x047f, 0x7e08, 0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff, 0xa186,
++	0x0007, 0x0040, 0x464f, 0xa18e, 0x000f, 0x00c0, 0x4658, 0x6820,
++	0xa084, 0x0040, 0x0040, 0x465f, 0xa6b5, 0x0001, 0x0078, 0x465f,
++	0x681c, 0xa084, 0x0040, 0x0040, 0x465f, 0xa6b5, 0x0001, 0x2049,
++	0x4638, 0x017e, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040,
++	0x466d, 0xa18e, 0x000f, 0x00c0, 0x4670, 0x6840, 0x0078, 0x4671,
++	0x6828, 0x017f, 0xa055, 0x0040, 0x46b7, 0x2d70, 0x2e60, 0x7004,
++	0xa0bc, 0x000f, 0xa7b8, 0x43b1, 0x273c, 0x87fb, 0x00c0, 0x468b,
++	0x0048, 0x4684, 0x1078, 0x22ac, 0x709c, 0xa075, 0x2060, 0x0040,
++	0x46b7, 0x0078, 0x4677, 0x2704, 0xae68, 0x680c, 0xa422, 0x6808,
++	0xa31b, 0x0048, 0x46a4, 0x8a51, 0x00c0, 0x4698, 0x1078, 0x22ac,
++	0x8738, 0x2704, 0xa005, 0x00c0, 0x468c, 0x709c, 0xa075, 0x2060,
++	0x0040, 0x46b7, 0x0078, 0x4677, 0x8422, 0x8420, 0x831a, 0xa399,
++	0x0000, 0x690c, 0x2400, 0xa122, 0x6908, 0x2300, 0xa11b, 0x00c8,
++	0x46b3, 0x1078, 0x22ac, 0x2071, 0x0020, 0x0078, 0x45a2, 0x127f,
++	0x2000, 0x007c, 0x7008, 0xa084, 0x00c0, 0xa086, 0x00c0, 0x0040,
++	0x46d7, 0x2704, 0xac08, 0x2104, 0x701e, 0x8108, 0x2104, 0x701a,
++	0x8108, 0x2104, 0x7016, 0x8108, 0x2104, 0x7012, 0x7602, 0x7004,
++	0xa084, 0x0010, 0xa085, 0x0001, 0x7006, 0x1078, 0x4534, 0x007c,
++	0x127e, 0x007e, 0x0d7e, 0x2091, 0x2200, 0x2049, 0x46d8, 0x0d7f,
++	0x087f, 0x7108, 0xa184, 0x00c0, 0x00c0, 0x4702, 0x017e, 0x6904,
++	0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x46f2, 0xa18e, 0x000f,
++	0x00c0, 0x46f5, 0x6840, 0x0078, 0x46f6, 0x6828, 0x017f, 0xa005,
++	0x0040, 0x471f, 0x0078, 0x4332, 0x0020, 0x4702, 0x1078, 0x44f7,
++	0x0078, 0x471f, 0x7108, 0x7008, 0xa106, 0x00c0, 0x4702, 0x017e,
++	0x017f, 0x810c, 0x00c8, 0x4711, 0x7108, 0x1078, 0x4462, 0x0078,
++	0x46e1, 0x7007, 0x0010, 0x7108, 0x7008, 0xa106, 0x00c0, 0x4713,
++	0x017e, 0x017f, 0x810c, 0x00c8, 0x4713, 0x1078, 0x4462, 0x7008,
++	0xa086, 0x0002, 0x00c0, 0x46e1, 0x7000, 0xa005, 0x00c0, 0x46e1,
++	0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000, 0x007c, 0x127e,
++	0x147e, 0x137e, 0x157e, 0x0c7e, 0x0d7e, 0x2091, 0x2200, 0x0d7f,
++	0x2049, 0x472f, 0xad80, 0x0011, 0x20a0, 0x2099, 0x0031, 0x700c,
++	0xa084, 0x00ff, 0x682a, 0x7007, 0x0008, 0x7007, 0x0002, 0x7003,
++	0x0001, 0x0040, 0x474e, 0x8000, 0x80ac, 0x53a5, 0x7007, 0x0004,
++	0x7004, 0xa084, 0x0004, 0x00c0, 0x4750, 0x0c7f, 0x2049, 0x0000,
++	0x7003, 0x0000, 0x157f, 0x137f, 0x147f, 0x127f, 0x2000, 0x007c,
++	0x2091, 0x6000, 0x2091, 0x8000, 0x78cc, 0xa005, 0x0040, 0x4777,
++	0x7994, 0x70d0, 0xa106, 0x00c0, 0x4777, 0x7804, 0xa005, 0x0040,
++	0x4777, 0x7807, 0x0000, 0x0068, 0x4777, 0x2091, 0x4080, 0x7820,
++	0x8001, 0x7822, 0x00c0, 0x47d2, 0x7824, 0x7822, 0x2069, 0x4d40,
++	0x6800, 0xa084, 0x0007, 0x0040, 0x4795, 0xa086, 0x0002, 0x0040,
++	0x4795, 0x6834, 0xa00d, 0x0040, 0x4795, 0x2104, 0xa005, 0x0040,
++	0x4795, 0x8001, 0x200a, 0x0040, 0x487a, 0x7848, 0xa005, 0x0040,
++	0x47a3, 0x8001, 0x784a, 0x00c0, 0x47a3, 0x2009, 0x0102, 0x6844,
++	0x200a, 0x1078, 0x20a0, 0x6890, 0xa005, 0x0040, 0x47af, 0x8001,
++	0x6892, 0x00c0, 0x47af, 0x686f, 0x0000, 0x6873, 0x0001, 0x2061,
++	0x5000, 0x20a9, 0x0100, 0x2009, 0x0002, 0x6034, 0xa005, 0x0040,
++	0x47c5, 0x8001, 0x6036, 0x00c0, 0x47c5, 0x6010, 0xa005, 0x0040,
++	0x47c5, 0x017e, 0x1078, 0x20a0, 0x017f, 0xace0, 0x0010, 0x0070,
++	0x47cb, 0x0078, 0x47b5, 0x8109, 0x0040, 0x47d2, 0x20a9, 0x0100,
++	0x0078, 0x47b5, 0x1078, 0x47df, 0x1078, 0x4804, 0x2009, 0x4d51,
++	0x2104, 0x2009, 0x0102, 0x200a, 0x2091, 0x8001, 0x007c, 0x7834,
++	0x8001, 0x7836, 0x00c0, 0x4803, 0x7838, 0x7836, 0x2091, 0x8000,
++	0x7844, 0xa005, 0x00c0, 0x47ee, 0x2001, 0x0101, 0x8001, 0x7846,
++	0xa080, 0x7000, 0x2040, 0x2004, 0xa065, 0x0040, 0x4803, 0x6024,
++	0xa005, 0x0040, 0x47ff, 0x8001, 0x6026, 0x0040, 0x4833, 0x6000,
++	0x2c40, 0x0078, 0x47f4, 0x007c, 0x7828, 0x8001, 0x782a, 0x00c0,
++	0x4832, 0x782c, 0x782a, 0x7830, 0xa005, 0x00c0, 0x4811, 0x2001,
++	0x0200, 0x8001, 0x7832, 0x8003, 0x8003, 0x8003, 0x8003, 0xa090,
++	0x5000, 0xa298, 0x0002, 0x2304, 0xa084, 0x0008, 0x0040, 0x4832,
++	0xa290, 0x0009, 0x2204, 0xa005, 0x0040, 0x482a, 0x8001, 0x2012,
++	0x00c0, 0x4832, 0x2304, 0xa084, 0xfff7, 0xa085, 0x0080, 0x201a,
++	0x1078, 0x20a0, 0x007c, 0x2069, 0x4d40, 0x6800, 0xa005, 0x0040,
++	0x483d, 0x6848, 0xac06, 0x0040, 0x487a, 0x601b, 0x0006, 0x60b4,
++	0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0060,
++	0x6022, 0x6000, 0x2042, 0x6714, 0x6f82, 0x1078, 0x18b9, 0x6818,
++	0xa005, 0x0040, 0x4855, 0x8001, 0x681a, 0x6808, 0xa084, 0xffef,
++	0x680a, 0x6810, 0x8001, 0x00d0, 0x485f, 0x1078, 0x22ac, 0x6812,
++	0x6033, 0x0000, 0x602f, 0x0000, 0x2c68, 0x1078, 0x1b8e, 0x2069,
++	0x4d40, 0x7944, 0xa184, 0x0100, 0x2001, 0x0006, 0x686e, 0x00c0,
++	0x4875, 0x6986, 0x2001, 0x0004, 0x686e, 0x1078, 0x209b, 0x2091,
++	0x8001, 0x007c, 0x2069, 0x0100, 0x2009, 0x4d40, 0x2104, 0xa084,
++	0x0007, 0x0040, 0x48d6, 0xa086, 0x0007, 0x00c0, 0x4890, 0x0d7e,
++	0x2009, 0x4d52, 0x216c, 0x1078, 0x385e, 0x0d7f, 0x0078, 0x48d6,
++	0x2009, 0x4d52, 0x2164, 0x1078, 0x2257, 0x601b, 0x0006, 0x6858,
++	0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0048,
++	0x6022, 0x6033, 0x0000, 0x602f, 0x0000, 0x6830, 0xa084, 0x0040,
++	0x0040, 0x48ca, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xa084,
++	0x0004, 0x0040, 0x48b7, 0x0070, 0x48b7, 0x0078, 0x48ae, 0x684b,
++	0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0040, 0x48c4,
++	0x0070, 0x48c4, 0x0078, 0x48bb, 0x20a9, 0x00fa, 0x0070, 0x48ca,
++	0x0078, 0x48c6, 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b, 0x0048,
++	0x2009, 0x4d5b, 0x200b, 0x0007, 0x784c, 0x784a, 0x2091, 0x8001,
++	0x007c, 0x2079, 0x4d00, 0x1078, 0x4904, 0x1078, 0x48e8, 0x1078,
++	0x48f6, 0x7833, 0x0000, 0x7847, 0x0000, 0x784b, 0x0000, 0x007c,
++	0x2019, 0x0003, 0x2011, 0x4d46, 0x2204, 0xa086, 0x003c, 0x0040,
++	0x48f3, 0x2019, 0x0002, 0x7b2a, 0x7b2e, 0x007c, 0x2019, 0x0039,
++	0x2011, 0x4d46, 0x2204, 0xa086, 0x003c, 0x0040, 0x4901, 0x2019,
++	0x0027, 0x7b36, 0x7b3a, 0x007c, 0x2019, 0x3971, 0x2011, 0x4d46,
++	0x2204, 0xa086, 0x003c, 0x0040, 0x490f, 0x2019, 0x2626, 0x7b22,
++	0x7b26, 0x783f, 0x0000, 0x7843, 0x000a, 0x007c, 0x0020, 0x002b,
++	0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++	0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++	0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++	0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++	0x0000, 0x0014, 0x0014, 0x9849, 0x0014, 0x0014, 0x0014, 0x0014,
++	0x0014, 0x0014, 0x0014, 0x0080, 0x000f, 0x0000, 0x0201, 0x0604,
++	0x0c08, 0x2120, 0x4022, 0xf880, 0x0018, 0x300b, 0xa201, 0x0014,
++	0xa200, 0x0014, 0xa200, 0x0214, 0x0000, 0x006c, 0x0002, 0x0014,
++	0x98e1, 0x009e, 0x00ab, 0xa202, 0x8838, 0x8180, 0x842a, 0x84a0,
++	0x3806, 0x8839, 0x28c2, 0x9cc1, 0x985d, 0x0864, 0x9891, 0x28c1,
++	0x9cc1, 0xa203, 0x300c, 0x2847, 0x8161, 0x846a, 0x8000, 0x84a4,
++	0x1856, 0x883a, 0x986d, 0x28e2, 0x9c9e, 0x985d, 0x0864, 0x9891,
++	0x300c, 0x28e1, 0x9c9e, 0x2809, 0xa206, 0x64c0, 0x67a0, 0x6fc0,
++	0x1814, 0x883b, 0x782c, 0x786d, 0x9881, 0x282b, 0xa207, 0x64a0,
++	0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7822, 0x883e, 0x9885, 0x8576,
++	0x8677, 0x206b, 0x28c1, 0x9cc1, 0x2044, 0x2103, 0x20a2, 0x2081,
++	0x986d, 0xa209, 0x2901, 0x989a, 0x0014, 0xa205, 0x8000, 0x85a4,
++	0x1872, 0x879a, 0x883c, 0x1fe2, 0xc601, 0xa20a, 0x856e, 0x0704,
++	0x9c9e, 0x0014, 0xa204, 0x8000, 0x85a4, 0x84a8, 0x3009, 0x19e2,
++	0xf868, 0x8176, 0x86eb, 0x85eb, 0x872e, 0x87a9, 0x883f, 0x08e6,
++	0x989e, 0xf881, 0x9899, 0xc801, 0x0014, 0xf8c1, 0x0016, 0x85b2,
++	0x80f0, 0x9532, 0xfb02, 0x1de2, 0x0014, 0x8532, 0xf241, 0x0014,
++	0x1de2, 0x84a8, 0xd7a0, 0x1fe6, 0x0014, 0xa208, 0x6043, 0x8008,
++	0x1dc1, 0x0016, 0x8000, 0x84a4, 0x8160, 0x842a, 0xf041, 0x3008,
++	0x84a8, 0x11d6, 0x7042, 0x20dd, 0x0011, 0x20d4, 0x8822, 0x0016,
++	0x8000, 0x2847, 0x1011, 0x98d4, 0x8000, 0xa000, 0x2802, 0x1011,
++	0x98da, 0x986d, 0x283e, 0x1011, 0x98de, 0xa20b, 0x0017, 0x300c,
++	0x8000, 0x85a4, 0x1de2, 0xdb81, 0x0014, 0x0210, 0x98ec, 0x0014,
++	0x26e0, 0x873a, 0xfb02, 0x19f2, 0x1fe2, 0x0014, 0xa20d, 0x8180,
++	0x842a, 0x84a0, 0x3806, 0x0210, 0x9cc6, 0x0704, 0x0000, 0x006c,
++	0x0002, 0x984f, 0x0014, 0x009e, 0x00a3, 0x0017, 0x60ff, 0x300c,
++	0x8720, 0xa211, 0x9cc7, 0x8772, 0x8837, 0x2007, 0x10d2, 0x78e2,
++	0x9ccb, 0x9858, 0xd984, 0xf0e2, 0xf0a1, 0x98c4, 0x0014, 0x8831,
++	0xd167, 0x8830, 0x8830, 0x800f, 0x9401, 0xb520, 0xc802, 0x8820,
++	0x9878, 0x2301, 0x9878, 0x10d2, 0x78e2, 0x9ccb, 0x986d, 0xf123,
++	0xf142, 0xf101, 0x98bd, 0x10d2, 0x70f8, 0x8832, 0x8203, 0x6001,
++	0x0014, 0x6845, 0x0214, 0xa21b, 0x9cc7, 0x2001, 0x98bc, 0x8202,
++	0x1852, 0xd184, 0xd163, 0x8834, 0x8001, 0x9889, 0x3027, 0x84a8,
++	0x1856, 0x8833, 0x0014, 0xa218, 0x6981, 0x9cb3, 0x6b2a, 0x6902,
++	0x1834, 0x9899, 0x1814, 0x8010, 0x8592, 0x8026, 0x84b9, 0x7021,
++	0x0014, 0x8000, 0x85a4, 0x84a8, 0x6946, 0xa213, 0x1462, 0xa213,
++	0x8000, 0x16e1, 0x98ac, 0x6969, 0xa214, 0x61c2, 0x8002, 0x14e1,
++	0x8004, 0x16e1, 0x0101, 0x300a, 0x8827, 0x0014, 0xa217, 0x9cb3,
++	0x0014, 0x8000, 0x85a4, 0x8181, 0x842a, 0x84a8, 0x1ce6, 0x0016,
++	0xa212, 0x9cc7, 0x10d2, 0x70e4, 0x0004, 0x8007, 0x9424, 0xcc1a,
++	0x9ccb, 0x98bc, 0x8827, 0x300a, 0x0013, 0x8000, 0x84a4, 0x84a8,
++	0x0016, 0x2002, 0x10d2, 0x98cb, 0x870e, 0xa21d, 0x0012, 0x878e,
++	0x85b2, 0x80f8, 0x9424, 0xa532, 0x84a4, 0x8000, 0x84a8, 0x0016,
++	0xa21c, 0x1035, 0x988d, 0xa210, 0x8180, 0x842a, 0x84a0, 0xa000,
++	0x8010, 0x8592, 0x853b, 0xd044, 0x8022, 0x3807, 0x84bb, 0x98ed,
++	0x8021, 0x3807, 0x84b9, 0x300c, 0x817e, 0x872b, 0x8772, 0x988d,
++	0x0000, 0x0020, 0x002b, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0014, 0x0014, 0x9849, 0x0014,
++	0x0014, 0x98ee, 0x98d9, 0x0014, 0x0014, 0x0014, 0x0080, 0x013d,
++	0x0000, 0x0201, 0x0604, 0x0c08, 0x2120, 0x4022, 0xf880, 0x0018,
++	0x300b, 0xa201, 0x0014, 0xa200, 0x0014, 0xa200, 0x0214, 0xa202,
++	0x8838, 0x3806, 0x8839, 0x28c2, 0x9cba, 0xa804, 0x0864, 0xa835,
++	0x28c1, 0x9cba, 0xa203, 0x300c, 0x2846, 0x8161, 0x846a, 0x8300,
++	0x1856, 0x883a, 0xa806, 0x28e2, 0x9c99, 0xa8f4, 0x0864, 0xa825,
++	0x300c, 0x28e1, 0x9c99, 0x2809, 0xa206, 0x64c0, 0x67a0, 0x6fc0,
++	0x1814, 0x883b, 0x782c, 0x786d, 0xa808, 0x282b, 0xa207, 0x64a0,
++	0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7822, 0x883e, 0xa802, 0x8576,
++	0x8677, 0x206b, 0x28c1, 0x9cba, 0x2044, 0x2103, 0x20a2, 0x2081,
++	0xa8e0, 0xa209, 0x2901, 0xa809, 0x0014, 0xa205, 0xa300, 0x1872,
++	0x879a, 0x883c, 0x1fe2, 0xc601, 0xa20a, 0x856e, 0x0704, 0x9c99,
++	0x0014, 0xa204, 0xa300, 0x3009, 0x19e2, 0xf868, 0x8176, 0x86eb,
++	0x85eb, 0x872e, 0x87a9, 0x883f, 0x08e6, 0xa8f3, 0xf881, 0xa8ec,
++	0xc801, 0x0014, 0xf8c1, 0x0016, 0x85b2, 0x80f0, 0x9532, 0xfb02,
++	0x1de2, 0x0014, 0x8532, 0xf241, 0x0014, 0x1de2, 0x84a8, 0xd7a0,
++	0x1fe6, 0x0014, 0xa208, 0x6043, 0x8008, 0x1dc1, 0x0016, 0x8300,
++	0x8160, 0x842a, 0xf041, 0x3008, 0x84a8, 0x11d6, 0x7042, 0x20dd,
++	0x0011, 0x20d5, 0x8822, 0x0016, 0x8000, 0x2847, 0x1011, 0xa8fc,
++	0x8000, 0xa000, 0x2802, 0x1011, 0xa8fd, 0xa893, 0x283e, 0x1011,
++	0xa8fd, 0xa20b, 0x0017, 0x300c, 0xa300, 0x1de2, 0xdb81, 0x0014,
++	0x0210, 0xa801, 0x0014, 0x26e0, 0x873a, 0xfb02, 0x19f2, 0x1fe2,
++	0x0014, 0xa20d, 0x3806, 0x0210, 0x9cbf, 0x0704, 0x0017, 0x60ff,
++	0x300c, 0x8720, 0xa211, 0x9d63, 0x8772, 0x8837, 0x2007, 0x10d2,
++	0x78e2, 0x9d66, 0xa8fc, 0xd984, 0xf0e2, 0xf0a1, 0xa861, 0x0014,
++	0x8831, 0xd167, 0x8830, 0x8830, 0x800f, 0x9401, 0xb520, 0xc802,
++	0x8820, 0xa80d, 0x2301, 0xa80b, 0x10d2, 0x78e2, 0x9d66, 0xa8fc,
++	0xf123, 0xf142, 0xf101, 0xa845, 0x10d2, 0x70f8, 0x8832, 0x8203,
++	0x6001, 0x0014, 0x6845, 0x0214, 0xa21b, 0x9d63, 0x2001, 0xa838,
++	0x8202, 0x1852, 0xd184, 0xd163, 0x8834, 0x8001, 0xa801, 0x3027,
++	0x84a8, 0x1856, 0x8833, 0x0014, 0xa218, 0x6981, 0x9d50, 0x6b2a,
++	0x6902, 0x1834, 0xa805, 0x1814, 0x8010, 0x8592, 0x8026, 0x84b9,
++	0x7021, 0x0014, 0xa300, 0x6946, 0xa213, 0x1462, 0xa213, 0x8000,
++	0x16e1, 0xa807, 0x6969, 0xa214, 0x61c2, 0x8002, 0x14e1, 0x8004,
++	0x16e1, 0x0101, 0x300a, 0x8827, 0x0014, 0xa217, 0x9d50, 0x0014,
++	0xa300, 0x8181, 0x842a, 0x84a8, 0x1ce6, 0x0016, 0xa212, 0x9d63,
++	0x10d2, 0x70e4, 0x0004, 0x8007, 0x9424, 0xcc1a, 0x9d66, 0xa8f8,
++	0x8827, 0x300a, 0x0013, 0x8000, 0x84a4, 0x0016, 0x2002, 0x10d2,
++	0xa8fd, 0x870e, 0xa21d, 0x0012, 0x878e, 0x85b2, 0x80f8, 0x9424,
++	0xa532, 0x84a4, 0x0016, 0xa21c, 0x1035, 0xa8b6, 0xa210, 0x3807,
++	0x300c, 0x817e, 0x872b, 0x8772, 0xa8af, 0x0000, 0xd66f
++};
++#endif
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/asm_1040.h	2003-07-19 17:06:32.000000000 -0700
+@@ -0,0 +1,3545 @@
++/* @(#)asm_1040.h 1.2 */
++/*
++ * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 Qlogic, Inc.
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms are permitted provided
++ * that the following conditions are met:
++ * 1. Redistribution of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistribution in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR 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.
++ */ 
++
++/************************************************************************
++ *									*
++ * 	            --- ISP1040 Initiator Firmware ---                  *
++ *			     32 LUN Support				*
++ *									*
++ ************************************************************************/
++#ifndef	ISP_TARGET_MODE
++/*
++ *	Firmware Version 4.66.00 (14:49 Sep 05, 2000)
++ */
++static const u_int16_t isp_1040_risc_code[] = {
++	0x0078, 0x1041, 0x0000, 0x2cd0, 0x0000, 0x2043, 0x4f50, 0x5952,
++	0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932, 0x2c31,
++	0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749, 0x4320,
++	0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049, 0x5350,
++	0x3130, 0x3230, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056,
++	0x6572, 0x7369, 0x6f6e, 0x2030, 0x342e, 0x3636, 0x2020, 0x2043,
++	0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20, 0x3030, 0x2050,
++	0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020, 0x3030, 0x2020,
++	0x2400, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x0048, 0x104c,
++	0x0038, 0x1052, 0x0078, 0x104e, 0x0028, 0x1052, 0x20b9, 0x1212,
++	0x0078, 0x1054, 0x20b9, 0x1313, 0x2071, 0x0010, 0x70c3, 0x0004,
++	0x20c9, 0x62ff, 0x2089, 0x1185, 0x70c7, 0x4953, 0x70cb, 0x5020,
++	0x70cf, 0x2020, 0x70d3, 0x0004, 0x3f00, 0x70d6, 0x20c1, 0x0008,
++	0x2019, 0x0000, 0x2009, 0xfeff, 0x2100, 0x200b, 0xa5a5, 0xa1ec,
++	0x7fff, 0x2d64, 0x206b, 0x0a0a, 0xaddc, 0x3fff, 0x2b54, 0x205b,
++	0x5050, 0x2114, 0xa286, 0xa5a5, 0x0040, 0x10c4, 0xa386, 0x000f,
++	0x0040, 0x108a, 0x2c6a, 0x2a5a, 0x20c1, 0x0000, 0x2019, 0x000f,
++	0x0078, 0x106a, 0x2c6a, 0x2a5a, 0x20c1, 0x0008, 0x2009, 0x7fff,
++	0x2148, 0x2944, 0x204b, 0x0a0a, 0xa9bc, 0x3fff, 0x2734, 0x203b,
++	0x5050, 0x2114, 0xa286, 0x0a0a, 0x0040, 0x10ae, 0x284a, 0x263a,
++	0x20c1, 0x0004, 0x2009, 0x3fff, 0x2134, 0x200b, 0x5050, 0x2114,
++	0xa286, 0x5050, 0x0040, 0x10af, 0x0078, 0x118d, 0x284a, 0x263a,
++	0x98c0, 0xa188, 0x1000, 0x212c, 0x200b, 0xa5a5, 0x2114, 0xa286,
++	0xa5a5, 0x0040, 0x10c1, 0x250a, 0xa18a, 0x1000, 0x98c1, 0x0078,
++	0x10c6, 0x250a, 0x0078, 0x10c6, 0x2c6a, 0x2a5a, 0x2130, 0xa18a,
++	0x0040, 0x2128, 0xa1a2, 0x3d00, 0x8424, 0x8424, 0x8424, 0x8424,
++	0x8424, 0x8424, 0xa192, 0x6300, 0x2009, 0x0000, 0x2001, 0x002f,
++	0x1078, 0x1bc9, 0x2218, 0x2079, 0x3d00, 0x2fa0, 0x2408, 0x2011,
++	0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109, 0x00c0, 0x10e1, 0x7ee6,
++	0x8528, 0x7dda, 0x7cde, 0x7be2, 0x787b, 0x0000, 0x2031, 0x0030,
++	0x78c3, 0x0101, 0x780b, 0x0002, 0x780f, 0x0002, 0x784f, 0x0003,
++	0x7803, 0x0002, 0x2069, 0x3d40, 0x2001, 0x04fd, 0x2004, 0xa082,
++	0x0005, 0x0048, 0x1107, 0x0038, 0x1109, 0x0078, 0x110d, 0x00a8,
++	0x110d, 0x681b, 0x003c, 0x0078, 0x110f, 0x681b, 0x0028, 0x6807,
++	0x0007, 0x680b, 0x00fa, 0x680f, 0x0008, 0x6813, 0x0005, 0x681f,
++	0x0000, 0x6823, 0x0006, 0x6817, 0x0008, 0x6827, 0x0000, 0x2069,
++	0x3f80, 0x2011, 0x0020, 0x2009, 0x0010, 0x680b, 0x0c19, 0x680f,
++	0x0019, 0x6803, 0xfd00, 0x6807, 0x0018, 0x6a1a, 0x2d00, 0xa0e8,
++	0x0008, 0xa290, 0x0004, 0x8109, 0x00c0, 0x1125, 0x2069, 0x4000,
++	0x2009, 0x0002, 0x20a9, 0x0100, 0x6837, 0x0000, 0x680b, 0x0040,
++	0x7be4, 0xa386, 0xfeff, 0x00c0, 0x114b, 0x6817, 0x0100, 0x681f,
++	0x0064, 0x0078, 0x114f, 0x6817, 0x0064, 0x681f, 0x0002, 0xade8,
++	0x0010, 0x0070, 0x1155, 0x0078, 0x113c, 0x8109, 0x00c0, 0x113a,
++	0x1078, 0x1f20, 0x1078, 0x3792, 0x1078, 0x19e0, 0x1078, 0x3c4a,
++	0x3200, 0xa085, 0x000d, 0x2090, 0x70c3, 0x0000, 0x0090, 0x116f,
++	0x70c0, 0xa086, 0x0002, 0x00c0, 0x116f, 0x1078, 0x12a4, 0x1078,
++	0x11b6, 0x78c0, 0xa005, 0x00c0, 0x117b, 0x1078, 0x1bf2, 0x0068,
++	0x117f, 0x1078, 0x1e44, 0x0068, 0x117f, 0x1078, 0x1adf, 0x00e0,
++	0x116f, 0x1078, 0x3ac1, 0x0078, 0x116f, 0x118d, 0x1192, 0x20e8,
++	0x20e8, 0x380c, 0x380c, 0x20e8, 0x20e8, 0x0088, 0x118d, 0x2091,
++	0x8001, 0x007c, 0x0088, 0x1192, 0x2091, 0x8001, 0x007c, 0x0078,
++	0x1197, 0x0078, 0x1199, 0x2009, 0x0022, 0x2104, 0xa086, 0x4000,
++	0x0040, 0x11b1, 0x7008, 0x800b, 0x00c8, 0x11b1, 0x7007, 0x0002,
++	0xa08c, 0x01e0, 0x00c0, 0x11b2, 0xa084, 0x0008, 0x0040, 0x11b1,
++	0x087a, 0x097a, 0x70c3, 0x4002, 0x0078, 0x12a7, 0x0068, 0x1221,
++	0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x1221, 0x7814,
++	0xa005, 0x00c0, 0x11c7, 0x0010, 0x1222, 0x0078, 0x1221, 0x2009,
++	0x3d68, 0x2104, 0xa005, 0x00c0, 0x1221, 0x2009, 0x3d71, 0x200b,
++	0x0000, 0x7914, 0xa186, 0x0042, 0x00c0, 0x11ec, 0x7816, 0x2009,
++	0x3d6f, 0x2164, 0x200b, 0x0000, 0x6018, 0x70c6, 0x6014, 0x70ca,
++	0x611c, 0xa18c, 0xff00, 0x6020, 0xa084, 0x00ff, 0xa105, 0x70ce,
++	0x1078, 0x19d2, 0x0078, 0x121f, 0x7814, 0xa086, 0x0018, 0x00c0,
++	0x11f3, 0x1078, 0x16cd, 0x7817, 0x0000, 0x2009, 0x3d6f, 0x2104,
++	0xa065, 0x0040, 0x120f, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x1a30,
++	0x0c7f, 0x609f, 0x0000, 0x1078, 0x17b3, 0x2009, 0x0018, 0x6087,
++	0x0103, 0x1078, 0x1959, 0x00c0, 0x121b, 0x1078, 0x19d2, 0x2009,
++	0x3d6f, 0x200b, 0x0000, 0x2009, 0x3d69, 0x2104, 0x200b, 0x0000,
++	0xa005, 0x0040, 0x121f, 0x2001, 0x4005, 0x0078, 0x12a6, 0x0078,
++	0x12a4, 0x007c, 0x70c3, 0x0000, 0x70c7, 0x0000, 0x70cb, 0x0000,
++	0x70cf, 0x0000, 0x70c0, 0xa0bc, 0xffc0, 0x00c0, 0x1272, 0x2038,
++	0x0079, 0x1232, 0x12a4, 0x12ff, 0x12c3, 0x12ff, 0x1368, 0x1368,
++	0x12ba, 0x17cb, 0x1373, 0x12b2, 0x12c7, 0x12c9, 0x12cb, 0x12cd,
++	0x17d0, 0x12b2, 0x1385, 0x13c1, 0x16e5, 0x17c5, 0x12cf, 0x15fa,
++	0x161c, 0x163a, 0x1667, 0x15b3, 0x15c1, 0x15d5, 0x15e9, 0x1445,
++	0x12b2, 0x13f3, 0x13f9, 0x13fe, 0x1403, 0x1409, 0x140e, 0x1413,
++	0x1418, 0x141d, 0x1421, 0x1436, 0x1442, 0x12b2, 0x12b2, 0x12b2,
++	0x12b2, 0x1451, 0x145a, 0x1469, 0x148f, 0x1499, 0x14a0, 0x14e0,
++	0x14ef, 0x14fe, 0x1510, 0x1593, 0x15a3, 0x12b2, 0x12b2, 0x12b2,
++	0x12b2, 0x15a8, 0xa0bc, 0xffa0, 0x00c0, 0x12b2, 0x2038, 0xa084,
++	0x001f, 0x0079, 0x127b, 0x17e7, 0x17ea, 0x17fa, 0x189f, 0x18d8,
++	0x1914, 0x1931, 0x1886, 0x12b2, 0x12b2, 0x1935, 0x193d, 0x12b2,
++	0x12b2, 0x12b2, 0x12b2, 0x12f5, 0x135e, 0x137b, 0x13b7, 0x16db,
++	0x12b2, 0x12b2, 0x12b2, 0x12b2, 0x1943, 0x18f0, 0x18fa, 0x18fe,
++	0x190c, 0x12b2, 0x12b2, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078,
++	0x12a6, 0x73ce, 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0068,
++	0x12a7, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x2091,
++	0x4080, 0x007c, 0x70c3, 0x4001, 0x0078, 0x12a7, 0x70c3, 0x4006,
++	0x0078, 0x12a7, 0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005,
++	0x53a3, 0x0078, 0x12a4, 0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078,
++	0x12a4, 0x0078, 0x12a4, 0x0078, 0x12a4, 0x0078, 0x12a4, 0x2091,
++	0x8000, 0x70c3, 0x0000, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf,
++	0x2020, 0x70d3, 0x0004, 0x3f00, 0x70d6, 0x2079, 0x0000, 0x781b,
++	0x0001, 0x2031, 0x0030, 0x2059, 0x1000, 0x2029, 0x0457, 0x2051,
++	0x0470, 0x2061, 0x0472, 0x20b9, 0xffff, 0x20c1, 0x0000, 0x2091,
++	0x5000, 0x2091, 0x4080, 0x0078, 0x0455, 0x1078, 0x1b4c, 0x00c0,
++	0x12b6, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1302, 0x2029,
++	0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x20a0, 0x2098,
++	0x2031, 0x0030, 0x81ff, 0x0040, 0x12a4, 0x7007, 0x0004, 0x731a,
++	0x721e, 0x7422, 0x7526, 0x2051, 0x0012, 0x2049, 0x133d, 0x2041,
++	0x12a4, 0x7003, 0x0002, 0xa786, 0x0001, 0x0040, 0x1325, 0xa786,
++	0x0050, 0x0040, 0x1325, 0x0078, 0x132b, 0x2049, 0x134a, 0x2041,
++	0x1356, 0x7003, 0x0003, 0x7017, 0x0000, 0x810b, 0x7112, 0x00c8,
++	0x1333, 0x7017, 0x0001, 0x7007, 0x0001, 0xa786, 0x0001, 0x0040,
++	0x134a, 0xa786, 0x0050, 0x0040, 0x134a, 0x700c, 0xa084, 0x007f,
++	0x2009, 0x0040, 0xa102, 0x8004, 0x094a, 0x20a8, 0x26a0, 0x53a6,
++	0x0078, 0x119b, 0x700c, 0xa084, 0x007f, 0x0040, 0x134a, 0x80ac,
++	0x0048, 0x134a, 0x2698, 0x53a5, 0x0078, 0x119b, 0x700c, 0xa084,
++	0x007f, 0x80ac, 0x2698, 0x53a5, 0x0078, 0x12a4, 0x1078, 0x1b4c,
++	0x00c0, 0x12b6, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1302,
++	0x71c4, 0x70c8, 0x2114, 0xa79e, 0x0004, 0x00c0, 0x1370, 0x200a,
++	0x72ca, 0x0078, 0x12a3, 0x70c7, 0x0004, 0x70cb, 0x0042, 0x70cf,
++	0x0000, 0x0078, 0x12a4, 0x1078, 0x1b4c, 0x00c0, 0x12b6, 0x75d8,
++	0x76dc, 0x75da, 0x76de, 0x0078, 0x1388, 0x2029, 0x0000, 0x2530,
++	0x70c4, 0x72c8, 0x73cc, 0x74d0, 0x70c6, 0x72ca, 0x73ce, 0x74d2,
++	0xa005, 0x0040, 0x13b1, 0xa40a, 0x0040, 0x1398, 0x00c8, 0x13a2,
++	0x8001, 0x788a, 0xa084, 0xfc00, 0x0040, 0x13a6, 0x78c0, 0xa085,
++	0x0001, 0x78c2, 0x2001, 0x4005, 0x0078, 0x12a6, 0x7a92, 0x7b96,
++	0x7d9a, 0x7e9e, 0x7c8e, 0x78c0, 0xa084, 0xfffc, 0x78c2, 0x0078,
++	0x13b5, 0x78c0, 0xa085, 0x0001, 0x78c2, 0x0078, 0x12a4, 0x1078,
++	0x1b4c, 0x00c0, 0x12b6, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078,
++	0x13c4, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d4,
++	0x70c6, 0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0040, 0x13ed, 0xa40a,
++	0x0040, 0x13d4, 0x00c8, 0x13de, 0x8001, 0x78a6, 0xa084, 0xfc00,
++	0x0040, 0x13e2, 0x78c0, 0xa085, 0x0100, 0x78c2, 0x2001, 0x4005,
++	0x0078, 0x12a6, 0x7aae, 0x7bb2, 0x7db6, 0x7eba, 0x7caa, 0x78c0,
++	0xa084, 0xfcff, 0x78c2, 0x0078, 0x13f1, 0x78c0, 0xa085, 0x0100,
++	0x78c2, 0x0078, 0x12a4, 0x2009, 0x3d5f, 0x210c, 0x7ae0, 0x0078,
++	0x12a2, 0x2009, 0x3d41, 0x210c, 0x0078, 0x12a3, 0x2009, 0x3d42,
++	0x210c, 0x0078, 0x12a3, 0x2061, 0x3d40, 0x610c, 0x6210, 0x0078,
++	0x12a2, 0x2009, 0x3d45, 0x210c, 0x0078, 0x12a3, 0x2009, 0x3d46,
++	0x210c, 0x0078, 0x12a3, 0x2009, 0x3d47, 0x210c, 0x0078, 0x12a3,
++	0x2009, 0x3d48, 0x210c, 0x0078, 0x12a3, 0x7908, 0x7a0c, 0x0078,
++	0x12a2, 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++	0xa0e8, 0x3f80, 0x6a00, 0x6804, 0xa084, 0x0008, 0x0040, 0x1433,
++	0x6b08, 0x0078, 0x1434, 0x6b0c, 0x0078, 0x12a1, 0x77c4, 0x1078,
++	0x19f0, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708,
++	0x0078, 0x12a1, 0x794c, 0x0078, 0x12a3, 0x77c4, 0x1078, 0x19f0,
++	0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, 0x2091, 0x8001, 0x0078,
++	0x12a1, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x129c, 0x1078, 0x1fb7,
++	0x0078, 0x12a1, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x129c, 0x2011,
++	0x3d41, 0x2204, 0x007e, 0x2112, 0x1078, 0x1f70, 0x017f, 0x0078,
++	0x12a3, 0x71c4, 0x2011, 0x1487, 0x20a9, 0x0008, 0x2204, 0xa106,
++	0x0040, 0x1479, 0x8210, 0x0070, 0x1477, 0x0078, 0x146e, 0x0078,
++	0x129c, 0xa292, 0x1487, 0x027e, 0x2011, 0x3d42, 0x2204, 0x2112,
++	0x017f, 0x007e, 0x1078, 0x1f7c, 0x017f, 0x0078, 0x12a3, 0x03e8,
++	0x00fa, 0x01f4, 0x02ee, 0x0064, 0x0019, 0x0032, 0x004b, 0x2061,
++	0x3d40, 0x610c, 0x6210, 0x70c4, 0x600e, 0x70c8, 0x6012, 0x0078,
++	0x12a2, 0x2061, 0x3d40, 0x6114, 0x70c4, 0x6016, 0x0078, 0x12a3,
++	0x71c4, 0x2011, 0x0004, 0x2019, 0x1212, 0xa186, 0x0028, 0x0040,
++	0x14b9, 0x2011, 0x0005, 0x2019, 0x1212, 0xa186, 0x0032, 0x0040,
++	0x14b9, 0x2011, 0x0006, 0x2019, 0x1313, 0xa186, 0x003c, 0x00c0,
++	0x129c, 0x2061, 0x3d40, 0x6018, 0x007e, 0x611a, 0x7800, 0xa084,
++	0x0001, 0x00c0, 0x14d6, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
++	0x0048, 0x14ce, 0x0038, 0x14d2, 0x0078, 0x14d6, 0x0028, 0x14d2,
++	0x0078, 0x14d6, 0x2019, 0x1313, 0x0078, 0x14d8, 0x2019, 0x1212,
++	0x23b8, 0x1078, 0x1f8d, 0x1078, 0x3c4a, 0x017f, 0x0078, 0x12a3,
++	0x71c4, 0xa184, 0xffcf, 0x00c0, 0x129c, 0x2011, 0x3d47, 0x2204,
++	0x2112, 0x007e, 0x1078, 0x1faf, 0x017f, 0x0078, 0x12a3, 0x71c4,
++	0xa182, 0x0010, 0x00c8, 0x129c, 0x2011, 0x3d48, 0x2204, 0x007e,
++	0x2112, 0x1078, 0x1f9e, 0x017f, 0x0078, 0x12a3, 0x71c4, 0x72c8,
++	0xa184, 0xfffd, 0x00c0, 0x129b, 0xa284, 0xfffd, 0x00c0, 0x129b,
++	0x2100, 0x7908, 0x780a, 0x2200, 0x7a0c, 0x780e, 0x0078, 0x12a2,
++	0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8,
++	0x3f80, 0x2019, 0x0000, 0x72c8, 0xa284, 0x0080, 0x0040, 0x1526,
++	0x6c14, 0x84ff, 0x00c0, 0x1526, 0x6817, 0x0040, 0xa284, 0x0040,
++	0x0040, 0x1530, 0x6c10, 0x84ff, 0x00c0, 0x1530, 0x6813, 0x0001,
++	0x6800, 0x007e, 0xa226, 0x0040, 0x155c, 0xa284, 0x0001, 0x0040,
++	0x153e, 0x2220, 0xa39d, 0x0002, 0xa294, 0xfffe, 0x6a02, 0xa484,
++	0x2000, 0x0040, 0x1545, 0xa39d, 0x0010, 0xa484, 0x1000, 0x0040,
++	0x154b, 0xa39d, 0x0008, 0xa484, 0x4000, 0x0040, 0x155c, 0x810f,
++	0xa284, 0x4000, 0x0040, 0x1558, 0x1078, 0x1fd1, 0x0078, 0x155c,
++	0x1078, 0x1fc3, 0x0078, 0x155c, 0x72cc, 0x6808, 0xa206, 0x0040,
++	0x158b, 0xa2a4, 0x00ff, 0x2061, 0x3d40, 0x6118, 0xa186, 0x0028,
++	0x0040, 0x1572, 0xa186, 0x0032, 0x0040, 0x1578, 0xa186, 0x003c,
++	0x0040, 0x157e, 0xa482, 0x0064, 0x0048, 0x1588, 0x0078, 0x1582,
++	0xa482, 0x0050, 0x0048, 0x1588, 0x0078, 0x1582, 0xa482, 0x0043,
++	0x0048, 0x1588, 0x71c4, 0x71c6, 0x027f, 0x72ca, 0x0078, 0x129d,
++	0x6a0a, 0xa39d, 0x000a, 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c,
++	0x71c4, 0x0078, 0x12a1, 0x77c4, 0x1078, 0x19f0, 0x2091, 0x8000,
++	0x6a14, 0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e,
++	0x2708, 0x0078, 0x12a1, 0x70c4, 0x794c, 0x784e, 0x0078, 0x12a3,
++	0x71c4, 0x72c8, 0x73cc, 0xa182, 0x0010, 0x00c8, 0x129c, 0x1078,
++	0x1fdf, 0x0078, 0x12a1, 0x77c4, 0x1078, 0x19f0, 0x2091, 0x8000,
++	0x6a08, 0xa295, 0x0002, 0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078,
++	0x12a2, 0x77c4, 0x1078, 0x19f0, 0x2091, 0x8000, 0x6a08, 0xa294,
++	0xfff9, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x15d0, 0x1078, 0x1f05,
++	0x2091, 0x8001, 0x2708, 0x0078, 0x12a2, 0x77c4, 0x1078, 0x19f0,
++	0x2091, 0x8000, 0x6a08, 0xa295, 0x0004, 0x6a0a, 0x6804, 0xa005,
++	0x0040, 0x15e4, 0x1078, 0x1f05, 0x2091, 0x8001, 0x2708, 0x0078,
++	0x12a2, 0x77c4, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020,
++	0x2091, 0x8000, 0x1078, 0x19fd, 0x2091, 0x8001, 0x2708, 0x6a08,
++	0x0078, 0x12a2, 0x77c4, 0x73c8, 0x72cc, 0x77c6, 0x73ca, 0x72ce,
++	0x1078, 0x1a78, 0x00c0, 0x1618, 0x6818, 0xa005, 0x0040, 0x1612,
++	0x2708, 0x1078, 0x1fef, 0x00c0, 0x1612, 0x7817, 0x0015, 0x2091,
++	0x8001, 0x007c, 0x2091, 0x8001, 0x2001, 0x4005, 0x0078, 0x12a6,
++	0x2091, 0x8001, 0x0078, 0x12a4, 0x77c4, 0x77c6, 0x2041, 0x0021,
++	0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078, 0x19fd,
++	0x2061, 0x3d40, 0x60a3, 0x0003, 0x67b6, 0x60c7, 0x000f, 0x60a7,
++	0x0000, 0x7817, 0x0016, 0x2091, 0x8000, 0x1078, 0x1f05, 0x2091,
++	0x8001, 0x007c, 0x77c8, 0x77ca, 0x77c4, 0x77c6, 0xa7bc, 0xff00,
++	0x2091, 0x8000, 0x2061, 0x3d40, 0x60a3, 0x0002, 0x60a7, 0x0000,
++	0x67b6, 0x60c7, 0x000f, 0x7817, 0x0017, 0x2091, 0x8000, 0x1078,
++	0x1f05, 0x2091, 0x8001, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051,
++	0x0010, 0x2091, 0x8000, 0x1078, 0x19fd, 0x70c8, 0x6836, 0x8738,
++	0xa784, 0x001f, 0x00c0, 0x165b, 0x2091, 0x8001, 0x007c, 0x78c0,
++	0xa084, 0x0003, 0x00c0, 0x168b, 0x2039, 0x0000, 0x2041, 0x0021,
++	0x2049, 0x0004, 0x2051, 0x0008, 0x1078, 0x19f0, 0x2091, 0x8000,
++	0x6808, 0xa80d, 0x690a, 0x2091, 0x8001, 0x8738, 0xa784, 0x001f,
++	0x00c0, 0x1674, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784,
++	0x0f00, 0x00c0, 0x1674, 0x2091, 0x8000, 0x2069, 0x0100, 0x6830,
++	0xa084, 0x0040, 0x0040, 0x16b4, 0x684b, 0x0004, 0x20a9, 0x0014,
++	0x6848, 0xa084, 0x0004, 0x0040, 0x16a1, 0x0070, 0x16a1, 0x0078,
++	0x1698, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001,
++	0x0040, 0x16ae, 0x0070, 0x16ae, 0x0078, 0x16a5, 0x20a9, 0x00fa,
++	0x0070, 0x16b4, 0x0078, 0x16b0, 0x2079, 0x3d00, 0x7817, 0x0018,
++	0x2061, 0x3d40, 0x60a3, 0x0001, 0x60a7, 0x0000, 0x60c7, 0x000f,
++	0x78c0, 0xa085, 0x0002, 0x78c2, 0x6808, 0xa084, 0xfffd, 0x680a,
++	0x681b, 0x0047, 0x2091, 0x8001, 0x007c, 0x78c0, 0xa084, 0xfffd,
++	0x78c2, 0xa084, 0x0001, 0x00c0, 0x16d7, 0x1078, 0x1ac2, 0x71c4,
++	0x71c6, 0x794a, 0x007c, 0x1078, 0x1b4c, 0x00c0, 0x12b6, 0x75d8,
++	0x74dc, 0x75da, 0x74de, 0x0078, 0x16e8, 0x2029, 0x0000, 0x2520,
++	0x71c4, 0x73c8, 0x72cc, 0x71c6, 0x73ca, 0x72ce, 0x2079, 0x3d00,
++	0x1078, 0x19c9, 0x0040, 0x17af, 0x20a9, 0x0005, 0x20a1, 0x3d16,
++	0x2091, 0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0040, 0x1078,
++	0x1993, 0x0040, 0x1707, 0x1078, 0x19d2, 0x0078, 0x17af, 0x6004,
++	0xa08c, 0x00ff, 0xa18e, 0x0009, 0x00c0, 0x1712, 0x007e, 0x1078,
++	0x1e27, 0x007f, 0xa084, 0xff00, 0x8007, 0x8009, 0x0040, 0x177d,
++	0x0c7e, 0x2c68, 0x1078, 0x19c9, 0x0040, 0x174c, 0x2c00, 0x689e,
++	0x8109, 0x00c0, 0x1719, 0x609f, 0x0000, 0x0c7f, 0x0c7e, 0x7218,
++	0x731c, 0x7420, 0x7524, 0x2c68, 0x689c, 0xa065, 0x0040, 0x177c,
++	0x2009, 0x0040, 0x1078, 0x1993, 0x00c0, 0x1765, 0x6004, 0xa084,
++	0x00ff, 0xa086, 0x0002, 0x00c0, 0x174c, 0x6004, 0xa084, 0x00ff,
++	0xa086, 0x000a, 0x00c0, 0x1748, 0x017e, 0x1078, 0x1e23, 0x017f,
++	0x2d00, 0x6002, 0x0078, 0x1727, 0x0c7f, 0x0c7e, 0x609c, 0x2060,
++	0x1078, 0x1a30, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x17b3, 0x2009,
++	0x0018, 0x6008, 0xa085, 0x0200, 0x600a, 0x6004, 0x6086, 0x1078,
++	0x1959, 0x1078, 0x19d2, 0x0078, 0x17af, 0x0c7f, 0x0c7e, 0x609c,
++	0x2060, 0x1078, 0x1a30, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x17b3,
++	0x2009, 0x0018, 0x6087, 0x0103, 0x601b, 0x0003, 0x1078, 0x1959,
++	0x1078, 0x19d2, 0x0078, 0x17af, 0x0c7f, 0x74c4, 0x73c8, 0x72cc,
++	0x6014, 0x2091, 0x8000, 0x7817, 0x0012, 0x0e7e, 0x2071, 0x3d40,
++	0x70a3, 0x0005, 0x70a7, 0x0000, 0x73aa, 0x72ae, 0x74b2, 0x70b6,
++	0x70bb, 0x0000, 0x2c00, 0x70be, 0x70c3, 0x0000, 0xa02e, 0x2530,
++	0x611c, 0xa184, 0x0060, 0x0040, 0x179f, 0x1078, 0x3736, 0x0e7f,
++	0x6596, 0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000,
++	0x2091, 0x8000, 0x1078, 0x1f05, 0x2091, 0x8001, 0x007c, 0x70c3,
++	0x4005, 0x0078, 0x12a7, 0x20a9, 0x0005, 0x2099, 0x3d16, 0x2091,
++	0x8000, 0x530a, 0x2091, 0x8001, 0x2100, 0xa210, 0xa399, 0x0000,
++	0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c, 0x71c4, 0x70c7, 0x0000,
++	0x7906, 0x0078, 0x12a4, 0x71c4, 0x71c6, 0x2168, 0x0078, 0x17d2,
++	0x2069, 0x1000, 0x690c, 0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109,
++	0x00c0, 0x17d4, 0xa285, 0x0000, 0x00c0, 0x17e2, 0x70c3, 0x4000,
++	0x0078, 0x17e4, 0x70c3, 0x4003, 0x70ca, 0x0078, 0x12a7, 0x79d8,
++	0x0078, 0x12a3, 0x71c4, 0x71c6, 0x2198, 0x20a1, 0x0042, 0x20a9,
++	0x0004, 0x53a3, 0x21a0, 0x2099, 0x0042, 0x20a9, 0x0004, 0x53a3,
++	0x0078, 0x12a4, 0x70c4, 0x2068, 0x2079, 0x3d00, 0x1078, 0x19c9,
++	0x00c0, 0x1806, 0x70c3, 0x4005, 0x0078, 0x12a7, 0x6007, 0x0001,
++	0x600b, 0x0000, 0x602b, 0x0000, 0x601b, 0x0006, 0x6a10, 0xa28c,
++	0x000f, 0xa284, 0x00f0, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105,
++	0x6016, 0xa284, 0x0800, 0x0040, 0x1821, 0x601b, 0x000a, 0x0078,
++	0x1827, 0xa284, 0x1000, 0x0040, 0x1827, 0x601b, 0x000c, 0xa284,
++	0x0300, 0x0040, 0x1830, 0x602b, 0x0001, 0x8004, 0x8004, 0x8004,
++	0xa085, 0x0001, 0x601e, 0x6023, 0x0000, 0x6027, 0x0000, 0xa284,
++	0x0400, 0x0040, 0x183d, 0x602b, 0x0000, 0x20a9, 0x0006, 0xac80,
++	0x000b, 0x20a0, 0xad80, 0x0005, 0x2098, 0x53a3, 0xa284, 0x0300,
++	0x00c0, 0x1852, 0x6046, 0x604a, 0x604e, 0x6052, 0x6096, 0x609a,
++	0x0078, 0x185c, 0x6800, 0x6046, 0x6804, 0x604a, 0x6e08, 0x664e,
++	0x6d0c, 0x6552, 0x6596, 0x669a, 0x6014, 0x2091, 0x8000, 0x7817,
++	0x0042, 0x2c08, 0x2061, 0x3d40, 0x60a3, 0x0005, 0x60a7, 0x0000,
++	0x60ab, 0x0000, 0x60af, 0x0000, 0x60b3, 0x0000, 0x60b6, 0x61be,
++	0xa284, 0x0400, 0x60c2, 0x2091, 0x8001, 0x0e7e, 0x2071, 0x0020,
++	0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x0e7f, 0x2091,
++	0x8000, 0x1078, 0x1f05, 0x2091, 0x8001, 0x007c, 0x70c4, 0x2068,
++	0x2079, 0x3d00, 0x1078, 0x19c9, 0x0040, 0x189b, 0x6007, 0x0001,
++	0x600b, 0x0000, 0x602b, 0x0000, 0x601b, 0x0006, 0x70c8, 0x6016,
++	0x6a10, 0x0078, 0x1819, 0x70c3, 0x4005, 0x0078, 0x12a7, 0x78ec,
++	0xa005, 0x0040, 0x12b2, 0x2091, 0x8000, 0x70c4, 0x800a, 0x2011,
++	0x0010, 0x810c, 0x0048, 0x18b1, 0x3a00, 0xa084, 0xfff7, 0x0078,
++	0x18b4, 0x3a00, 0xa085, 0x0008, 0x20d0, 0x0005, 0x0005, 0xa084,
++	0xfffb, 0x20d0, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
++	0x0005, 0x0005, 0xa085, 0x0004, 0x20d0, 0x0005, 0x0005, 0x0005,
++	0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x8211, 0x00c0, 0x18a9,
++	0x3a00, 0xa085, 0x0008, 0x20d0, 0x2091, 0x8001, 0x0078, 0x12a4,
++	0x2011, 0x04fd, 0x2204, 0xa082, 0x0004, 0x0048, 0x18ec, 0x78ef,
++	0x0001, 0x2009, 0xff01, 0x200a, 0x2001, 0x000c, 0x20d8, 0x2001,
++	0x000c, 0x20d0, 0x0078, 0x12a4, 0x2001, 0x4005, 0x0078, 0x12a6,
++	0x7978, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x00c8, 0x129c, 0x797a,
++	0x0078, 0x12a4, 0x7978, 0x71c6, 0x0078, 0x12a4, 0x796c, 0x71c6,
++	0x71c4, 0x796e, 0x7970, 0x71ca, 0x71c8, 0x7972, 0x7974, 0x71ce,
++	0x71cc, 0x7976, 0x0078, 0x12a4, 0x796c, 0x71c6, 0x7970, 0x71ca,
++	0x7974, 0x71ce, 0x0078, 0x12a4, 0x7900, 0x71c6, 0x71c4, 0x7902,
++	0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x0048, 0x1923, 0x0038,
++	0x1925, 0x0078, 0x192f, 0x00a8, 0x192f, 0xa18c, 0x0001, 0x00c0,
++	0x192d, 0x20b9, 0x1313, 0x0078, 0x192f, 0x20b9, 0x1212, 0x0078,
++	0x12a4, 0x7900, 0x71c6, 0x0078, 0x12a4, 0x2009, 0x3d79, 0x2104,
++	0x70c6, 0x70c4, 0x200a, 0x0078, 0x12a4, 0x2009, 0x3d79, 0x2104,
++	0x70c6, 0x0078, 0x12a4, 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003,
++	0x8003, 0x8003, 0xa0e8, 0x3f80, 0x6a14, 0xd2b4, 0x0040, 0x1954,
++	0x2011, 0x0001, 0x0078, 0x1956, 0x2011, 0x0000, 0x6b0c, 0x0078,
++	0x12a1, 0x700c, 0xa084, 0x00ff, 0x0040, 0x1965, 0x7007, 0x0004,
++	0x7004, 0xa084, 0x0004, 0x00c0, 0x1960, 0x7017, 0x0000, 0x7112,
++	0x721a, 0x731e, 0x7422, 0x7526, 0xac80, 0x0001, 0x8108, 0x810c,
++	0x81a9, 0x8098, 0x20a1, 0x0030, 0x6084, 0x20a2, 0x53a6, 0x780c,
++	0xa085, 0x0000, 0x7002, 0x7007, 0x0001, 0x2009, 0x0022, 0x2104,
++	0xa084, 0x4000, 0x00c0, 0x197d, 0x7108, 0x8103, 0x00c8, 0x197d,
++	0x7014, 0xa005, 0x0040, 0x197d, 0x7007, 0x0002, 0xa184, 0x01e0,
++	0x7003, 0x0000, 0x007c, 0x700c, 0xa084, 0x00ff, 0x0040, 0x199f,
++	0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x199a, 0x7017,
++	0x0000, 0x7112, 0x721a, 0x7422, 0x7526, 0x731e, 0x2099, 0x0030,
++	0x8108, 0x81ac, 0x780c, 0xa085, 0x0001, 0x7002, 0x7007, 0x0001,
++	0x2009, 0x0022, 0x2104, 0xa084, 0x4000, 0x00c0, 0x19b0, 0x7008,
++	0x800b, 0x00c8, 0x19b0, 0x7007, 0x0002, 0xa08c, 0x01e0, 0x00c0,
++	0x19c6, 0xac80, 0x0001, 0x20a0, 0x53a5, 0xa006, 0x7003, 0x0000,
++	0x007c, 0x7850, 0xa065, 0x0040, 0x19d1, 0x2c04, 0x7852, 0x2063,
++	0x0000, 0x007c, 0x0f7e, 0x2079, 0x3d00, 0x7850, 0x2062, 0x2c00,
++	0xa005, 0x00c0, 0x19dd, 0x1078, 0x20c8, 0x7852, 0x0f7f, 0x007c,
++	0x2011, 0x6300, 0x7a52, 0x7be0, 0x8319, 0x0040, 0x19ed, 0xa280,
++	0x002f, 0x2012, 0x2010, 0x0078, 0x19e4, 0x2013, 0x0000, 0x007c,
++	0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003,
++	0x8003, 0xa105, 0xa0e8, 0x4000, 0x007c, 0x1078, 0x19f0, 0x2900,
++	0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xffef, 0xa80d, 0x690a,
++	0x2009, 0x3d4f, 0x210c, 0x6804, 0xa005, 0x0040, 0x1a1a, 0xa116,
++	0x00c0, 0x1a1a, 0x2060, 0x6000, 0x6806, 0x017e, 0x200b, 0x0000,
++	0x0078, 0x1a1d, 0x2009, 0x0000, 0x017e, 0x6804, 0xa065, 0x0040,
++	0x1a2c, 0x6000, 0x6806, 0x1078, 0x1a3d, 0x1078, 0x1b6d, 0x6810,
++	0x8001, 0x6812, 0x00c0, 0x1a1d, 0x017f, 0x6902, 0x6906, 0x007c,
++	0xa065, 0x0040, 0x1a3c, 0x609c, 0x609f, 0x0000, 0x2008, 0x1078,
++	0x19d2, 0x2100, 0x0078, 0x1a30, 0x007c, 0x6007, 0x0103, 0x608f,
++	0x0000, 0x20a9, 0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000,
++	0x40a4, 0x6828, 0x601a, 0x682c, 0x6022, 0x007c, 0x0e7e, 0x2071,
++	0x3d40, 0x7040, 0xa08c, 0x0200, 0x00c0, 0x1a5c, 0xa088, 0x3d80,
++	0x2d0a, 0x8000, 0x7042, 0xa006, 0x0e7f, 0x007c, 0x0e7e, 0x2071,
++	0x3d40, 0x2009, 0x3d80, 0x7240, 0x8221, 0x8211, 0x0048, 0x1a76,
++	0x2104, 0x8108, 0xad06, 0x00c0, 0x1a65, 0x8119, 0x211e, 0x8108,
++	0x8318, 0x8211, 0x00c8, 0x1a6e, 0x7442, 0xa006, 0x0e7f, 0x007c,
++	0x1078, 0x19f0, 0x2091, 0x8000, 0x6804, 0x781e, 0xa065, 0x0040,
++	0x1ac1, 0x0078, 0x1a89, 0x2c00, 0x781e, 0x6000, 0xa065, 0x0040,
++	0x1ac1, 0x6010, 0xa306, 0x00c0, 0x1a83, 0x600c, 0xa206, 0x00c0,
++	0x1a83, 0x2c28, 0x2001, 0x3d4f, 0x2004, 0xac06, 0x00c0, 0x1a9a,
++	0x0078, 0x1abe, 0x6804, 0xac06, 0x00c0, 0x1aa8, 0x6000, 0x2060,
++	0x6806, 0xa005, 0x00c0, 0x1aa8, 0x6803, 0x0000, 0x0078, 0x1ab2,
++	0x6400, 0x781c, 0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x1ab2,
++	0x2c00, 0x6802, 0x2560, 0x1078, 0x1a3d, 0x601b, 0x0005, 0x6023,
++	0x0020, 0x1078, 0x1b6d, 0x6810, 0x8001, 0x6812, 0x2001, 0xffff,
++	0xa005, 0x007c, 0x2039, 0x0000, 0x2041, 0x0021, 0x2049, 0x0004,
++	0x2051, 0x0008, 0x2091, 0x8000, 0x1078, 0x19fd, 0x8738, 0xa784,
++	0x001f, 0x00c0, 0x1acc, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f,
++	0xa784, 0x0f00, 0x00c0, 0x1acc, 0x2091, 0x8001, 0x007c, 0x2061,
++	0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x1af0, 0x2091, 0x8000,
++	0x78d4, 0x78d7, 0x0000, 0x2091, 0x8001, 0xa005, 0x00c0, 0x1af1,
++	0x007c, 0xa08c, 0xfff0, 0x0040, 0x1af7, 0x1078, 0x20c8, 0x0079,
++	0x1af9, 0x1b09, 0x1b0c, 0x1b12, 0x1b16, 0x1b0a, 0x1b1a, 0x1b0a,
++	0x1b20, 0x1b24, 0x1b28, 0x1b5b, 0x1b5f, 0x1b0a, 0x1b0a, 0x1b0a,
++	0x1b0a, 0x007c, 0x1078, 0x20c8, 0x1078, 0x1ac2, 0x2001, 0x8001,
++	0x0078, 0x1b65, 0x2001, 0x8003, 0x0078, 0x1b65, 0x2001, 0x8004,
++	0x0078, 0x1b65, 0x1078, 0x1ac2, 0x2001, 0x8006, 0x0078, 0x1b65,
++	0x2001, 0x8008, 0x0078, 0x1b65, 0x2001, 0x8009, 0x0078, 0x1b65,
++	0x2091, 0x8000, 0x2069, 0x3d40, 0x6800, 0xa086, 0x0000, 0x0040,
++	0x1b36, 0x2091, 0x8001, 0x78d7, 0x0009, 0x007c, 0x68b4, 0xa0bc,
++	0xff00, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x1078,
++	0x19fd, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1b3f, 0x2091, 0x8001,
++	0x2001, 0x800a, 0x0078, 0x1b65, 0x2001, 0x04fd, 0x2004, 0xa082,
++	0x0004, 0x00c8, 0x1b55, 0x0078, 0x1b58, 0xa006, 0x0078, 0x1b5a,
++	0xa085, 0x0001, 0x007c, 0x2001, 0x800c, 0x0078, 0x1b65, 0x1078,
++	0x1ac2, 0x2001, 0x800d, 0x0078, 0x1b65, 0x70c2, 0x2061, 0x0000,
++	0x601b, 0x0001, 0x2091, 0x4080, 0x007c, 0x6004, 0x6086, 0x2c08,
++	0x2063, 0x0000, 0x787c, 0x8000, 0x787e, 0x7880, 0xa005, 0x7982,
++	0x0040, 0x1b7d, 0x2c02, 0x0078, 0x1b7e, 0x7986, 0x007c, 0x0c7e,
++	0x2061, 0x3d00, 0x6887, 0x0103, 0x2d08, 0x206b, 0x0000, 0x607c,
++	0x8000, 0x607e, 0x6080, 0xa005, 0x6182, 0x0040, 0x1b92, 0x2d02,
++	0x0078, 0x1b93, 0x6186, 0x0c7f, 0x007c, 0x1078, 0x1ba6, 0x0040,
++	0x1ba5, 0x0c7e, 0x609c, 0xa065, 0x0040, 0x1ba0, 0x1078, 0x1a30,
++	0x0c7f, 0x609f, 0x0000, 0x1078, 0x19d2, 0x007c, 0x7884, 0xa065,
++	0x0040, 0x1bb8, 0x2091, 0x8000, 0x787c, 0x8001, 0x787e, 0x2c04,
++	0x7886, 0xa005, 0x00c0, 0x1bb6, 0x7882, 0x8000, 0x2091, 0x8001,
++	0x007c, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, 0x00c8,
++	0x1bc2, 0xa200, 0x0070, 0x1bc6, 0x0078, 0x1bbd, 0x8086, 0x818e,
++	0x007c, 0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x1bec, 0xa11a,
++	0x00c8, 0x1bec, 0x8213, 0x818d, 0x0048, 0x1bdd, 0xa11a, 0x00c8,
++	0x1bde, 0x0070, 0x1be4, 0x0078, 0x1bd2, 0xa11a, 0x2308, 0x8210,
++	0x0070, 0x1be4, 0x0078, 0x1bd2, 0x007e, 0x3200, 0xa084, 0xf7ff,
++	0x2080, 0x007f, 0x157f, 0x007c, 0x007e, 0x3200, 0xa085, 0x0800,
++	0x0078, 0x1be8, 0x798c, 0x70d0, 0x007e, 0x007f, 0xa106, 0x0040,
++	0x1c6e, 0x7800, 0xa084, 0x0002, 0x0040, 0x1c05, 0x2011, 0x04fd,
++	0x2204, 0xa082, 0x0005, 0x00c8, 0x1c18, 0x2091, 0x8000, 0x2071,
++	0x0020, 0x7004, 0xa005, 0x00c0, 0x1c6e, 0x7008, 0x7208, 0xa206,
++	0x00c0, 0x1c6e, 0xa286, 0x0008, 0x00c0, 0x1c6e, 0x2071, 0x0010,
++	0x1078, 0x19c9, 0x0040, 0x1c6e, 0x7a94, 0x7b90, 0x7c9c, 0x7d98,
++	0xa184, 0xff00, 0x0040, 0x1c3c, 0x2031, 0x0000, 0x810b, 0x86b5,
++	0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5,
++	0x810b, 0x86b5, 0x2100, 0xa210, 0x2600, 0xa319, 0xa4a1, 0x0000,
++	0xa5a9, 0x0000, 0x0078, 0x1c46, 0x8107, 0x8004, 0x8004, 0xa210,
++	0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x2009, 0x0040,
++	0x1078, 0x1993, 0x2091, 0x8001, 0x0040, 0x1c65, 0x1078, 0x19d2,
++	0x78a0, 0x8000, 0x78a2, 0xa086, 0x0002, 0x00c0, 0x1c6e, 0x2091,
++	0x8000, 0x78d7, 0x0002, 0x78a3, 0x0000, 0x78c0, 0xa085, 0x0003,
++	0x78c2, 0x2091, 0x8001, 0x0078, 0x1c6e, 0x78a3, 0x0000, 0x1078,
++	0x1e0d, 0x6004, 0xa084, 0x000f, 0x0079, 0x1c73, 0x2071, 0x0010,
++	0x2091, 0x8001, 0x007c, 0x1c83, 0x1ca5, 0x1ccb, 0x1c83, 0x1cdd,
++	0x1c92, 0x1c83, 0x1c83, 0x1c83, 0x1c9f, 0x1cc5, 0x1c83, 0x1c83,
++	0x1c83, 0x1c83, 0x1c83, 0x2039, 0x0400, 0x78d0, 0xa705, 0x78d2,
++	0x6008, 0xa705, 0x600a, 0x1078, 0x1d28, 0x609c, 0x78ce, 0x1078,
++	0x1df5, 0x007c, 0x78d0, 0xa084, 0x0100, 0x0040, 0x1c99, 0x0078,
++	0x1c83, 0x601c, 0xa085, 0x0080, 0x601e, 0x0078, 0x1cac, 0x1078,
++	0x1b4c, 0x00c0, 0x1c83, 0x1078, 0x1e27, 0x78d0, 0xa084, 0x0100,
++	0x0040, 0x1cac, 0x0078, 0x1c83, 0x78d3, 0x0000, 0x6004, 0x8007,
++	0xa084, 0x00ff, 0x78c6, 0x8001, 0x609f, 0x0000, 0x0040, 0x1cc2,
++	0x1078, 0x1d28, 0x0040, 0x1cc2, 0x78d0, 0xa085, 0x0100, 0x78d2,
++	0x0078, 0x1cc4, 0x1078, 0x1d4c, 0x007c, 0x1078, 0x1b4c, 0x00c0,
++	0x1c83, 0x1078, 0x1e23, 0x78d0, 0xa08c, 0x0e00, 0x00c0, 0x1cd4,
++	0xa084, 0x0100, 0x00c0, 0x1cd6, 0x0078, 0x1c83, 0x1078, 0x1d28,
++	0x00c0, 0x1cdc, 0x1078, 0x1d4c, 0x007c, 0x78d0, 0xa084, 0x0100,
++	0x0040, 0x1ce4, 0x0078, 0x1c83, 0x78d3, 0x0000, 0x6714, 0x2011,
++	0x0001, 0x20a9, 0x0001, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0040,
++	0x1d07, 0x2011, 0x0001, 0xa7bc, 0xff00, 0x20a9, 0x0020, 0xa08e,
++	0x0001, 0x0040, 0x1d07, 0x2039, 0x0000, 0x2011, 0x0002, 0x20a9,
++	0x0100, 0xa08e, 0x0002, 0x0040, 0x1d07, 0x0078, 0x1d25, 0x1078,
++	0x19f0, 0x2d00, 0x2091, 0x8000, 0x682b, 0x0000, 0x682f, 0x0000,
++	0x6808, 0xa084, 0xffde, 0x680a, 0x2d00, 0xa080, 0x0010, 0x2068,
++	0x2091, 0x8001, 0x0070, 0x1d1e, 0x0078, 0x1d0a, 0x8211, 0x0040,
++	0x1d25, 0x20a9, 0x0100, 0x0078, 0x1d0a, 0x1078, 0x19d2, 0x007c,
++	0x78c8, 0xa06d, 0x00c0, 0x1d33, 0x2c00, 0x78ca, 0x78ce, 0x609f,
++	0x0000, 0x0078, 0x1d3f, 0x2c00, 0x689e, 0x609f, 0x0000, 0x78ca,
++	0x2d00, 0x6002, 0x78cc, 0xad06, 0x00c0, 0x1d3f, 0x6002, 0x78c4,
++	0x8001, 0x78c6, 0x00c0, 0x1d4b, 0x78d0, 0xa084, 0x0000, 0x78d2,
++	0x78cc, 0x2060, 0xa006, 0x007c, 0xa02e, 0x2530, 0x611c, 0x61a2,
++	0xa184, 0xe1ff, 0x601e, 0xa184, 0x0060, 0x0040, 0x1d5b, 0x0e7e,
++	0x1078, 0x3736, 0x0e7f, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x60af,
++	0x0000, 0x60b3, 0x0000, 0x6714, 0x1078, 0x19f0, 0x2091, 0x8000,
++	0x60a0, 0xa084, 0x8000, 0x00c0, 0x1d82, 0x6808, 0xa084, 0x0001,
++	0x0040, 0x1d82, 0x2091, 0x8001, 0x1078, 0x1a3d, 0x2091, 0x8000,
++	0x1078, 0x1b6d, 0x2091, 0x8001, 0x78cb, 0x0000, 0x78cf, 0x0000,
++	0x0078, 0x1df4, 0x6024, 0xa096, 0x0001, 0x00c0, 0x1d89, 0x8000,
++	0x6026, 0x6a10, 0x6814, 0x2091, 0x8001, 0xa202, 0x0048, 0x1d98,
++	0x0040, 0x1d98, 0x2039, 0x0200, 0x1078, 0x1df5, 0x0078, 0x1df4,
++	0x2c08, 0x2091, 0x8000, 0x60a0, 0xa084, 0x8000, 0x0040, 0x1dc5,
++	0x6800, 0xa065, 0x0040, 0x1dca, 0x6a04, 0x0e7e, 0x2071, 0x3d40,
++	0x7000, 0xa084, 0x0001, 0x0040, 0x1dbf, 0x703c, 0xa206, 0x00c0,
++	0x1dbf, 0x6b04, 0x231c, 0x2160, 0x6302, 0x2300, 0xa005, 0x00c0,
++	0x1dba, 0x6902, 0x2260, 0x6102, 0x0e7f, 0x0078, 0x1dd1, 0x2160,
++	0x6202, 0x6906, 0x0e7f, 0x0078, 0x1dd1, 0x6800, 0xa065, 0x0040,
++	0x1dca, 0x6102, 0x6902, 0x00c0, 0x1dce, 0x6906, 0x2160, 0x6003,
++	0x0000, 0x2160, 0x60a0, 0xa084, 0x8000, 0x0040, 0x1ddb, 0x6808,
++	0xa084, 0xfffc, 0x680a, 0x6810, 0x8000, 0x6812, 0x2091, 0x8001,
++	0x6808, 0xa08c, 0x0040, 0x0040, 0x1dea, 0xa086, 0x0040, 0x680a,
++	0x1078, 0x1a4e, 0x2091, 0x8000, 0x1078, 0x1f05, 0x2091, 0x8001,
++	0x78cf, 0x0000, 0x78cb, 0x0000, 0x007c, 0x6008, 0xa705, 0x600a,
++	0x2091, 0x8000, 0x1078, 0x1b6d, 0x2091, 0x8001, 0x78cc, 0xa065,
++	0x0040, 0x1e08, 0x609c, 0x78ce, 0x609f, 0x0000, 0x0078, 0x1df8,
++	0x78cb, 0x0000, 0x78cf, 0x0000, 0x007c, 0x7988, 0x788c, 0x8000,
++	0xa10a, 0x00c8, 0x1e14, 0xa006, 0x788e, 0x70d2, 0x7804, 0xa005,
++	0x0040, 0x1e22, 0x8001, 0x7806, 0x00c0, 0x1e22, 0x0068, 0x1e22,
++	0x2091, 0x4080, 0x007c, 0x2039, 0x1e3b, 0x0078, 0x1e29, 0x2039,
++	0x1e41, 0x2704, 0xa005, 0x0040, 0x1e3a, 0xac00, 0x2068, 0x6b08,
++	0x6c0c, 0x6910, 0x6a14, 0x690a, 0x6a0e, 0x6b12, 0x6c16, 0x8738,
++	0x0078, 0x1e29, 0x007c, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b,
++	0x0000, 0x0015, 0x001b, 0x0000, 0x0068, 0x1e8a, 0x2029, 0x0000,
++	0x7884, 0xa065, 0x0040, 0x1e85, 0x2009, 0x3d79, 0x2104, 0xa084,
++	0x0001, 0x0040, 0x1e78, 0x6084, 0xa086, 0x0103, 0x00c0, 0x1e78,
++	0x6018, 0xa005, 0x00c0, 0x1e78, 0x6014, 0xa005, 0x00c0, 0x1e78,
++	0x0d7e, 0x2069, 0x0000, 0x6818, 0xa084, 0x0001, 0x00c0, 0x1e77,
++	0x600c, 0x70c6, 0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b, 0x0001,
++	0x2091, 0x4080, 0x0d7f, 0x1078, 0x1b95, 0x0078, 0x1e85, 0x0d7f,
++	0x1078, 0x1e8b, 0x0040, 0x1e85, 0x057e, 0x1078, 0x1e9c, 0x057f,
++	0x00c0, 0x1e85, 0x8528, 0x0078, 0x1e48, 0x85ff, 0x0040, 0x1e8a,
++	0x2091, 0x4080, 0x007c, 0x7ba4, 0x79a8, 0x70d4, 0x007e, 0x007f,
++	0xa102, 0x00c0, 0x1e96, 0x2300, 0xa005, 0x007c, 0x0048, 0x1e9a,
++	0xa302, 0x007c, 0x8002, 0x007c, 0x7800, 0xa084, 0x0002, 0x0040,
++	0x1ea8, 0x2011, 0x04fd, 0x2204, 0xa082, 0x0005, 0x00c8, 0x1ebb,
++	0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x1eec,
++	0x7008, 0x7208, 0xa206, 0x00c0, 0x1eec, 0xa286, 0x0008, 0x00c0,
++	0x1eec, 0x2071, 0x0010, 0x1078, 0x1ef1, 0x2009, 0x0018, 0x6028,
++	0xa005, 0x0040, 0x1ec5, 0x2009, 0x0040, 0x1078, 0x1959, 0x0040,
++	0x1ede, 0x78bc, 0x8000, 0x78be, 0xa086, 0x0002, 0x00c0, 0x1eec,
++	0x2091, 0x8000, 0x78d7, 0x0003, 0x78bf, 0x0000, 0x78c0, 0xa085,
++	0x0300, 0x78c2, 0x2091, 0x8001, 0x0078, 0x1eec, 0x78bf, 0x0000,
++	0x1078, 0x1b95, 0x79a4, 0x78a8, 0x8000, 0xa10a, 0x00c8, 0x1ee9,
++	0xa006, 0x78aa, 0x70d6, 0xa006, 0x2071, 0x0010, 0x2091, 0x8001,
++	0x007c, 0x8107, 0x8004, 0x8004, 0x7ab0, 0x7bac, 0x7cb8, 0x7db4,
++	0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c,
++	0x2009, 0x3d68, 0x2091, 0x8000, 0x200a, 0x0f7e, 0x2079, 0x0100,
++	0x2009, 0x3d40, 0x2104, 0xa086, 0x0000, 0x00c0, 0x1f1e, 0x2009,
++	0x3d12, 0x2104, 0xa005, 0x00c0, 0x1f1e, 0x7830, 0xa084, 0x00c0,
++	0x00c0, 0x1f1e, 0x0018, 0x1f1e, 0x781b, 0x0045, 0x0f7f, 0x007c,
++	0x127e, 0x2091, 0x2300, 0x2071, 0x3d40, 0x2079, 0x0100, 0x784b,
++	0x000f, 0x2019, 0x35fc, 0x20a1, 0x012b, 0x2304, 0xa005, 0x0040,
++	0x1f3a, 0x789a, 0x8318, 0x23ac, 0x8318, 0x2398, 0x53a6, 0x3318,
++	0x0078, 0x1f2d, 0x789b, 0x0020, 0x20a9, 0x0010, 0x78af, 0x0000,
++	0x78af, 0x0020, 0x0070, 0x1f46, 0x0078, 0x1f3e, 0x7003, 0x0000,
++	0x1078, 0x205c, 0x7004, 0xa084, 0x000f, 0x017e, 0x2009, 0x04fd,
++	0x210c, 0xa18a, 0x0005, 0x0048, 0x1f5d, 0x0038, 0x1f59, 0x0078,
++	0x1f5d, 0xa085, 0x62c0, 0x0078, 0x1f5f, 0xa085, 0x6280, 0x017f,
++	0x7806, 0x780f, 0x9200, 0x7843, 0x00d8, 0x7853, 0x0080, 0x780b,
++	0x0008, 0x7047, 0x3d7f, 0x7043, 0x0000, 0x127f, 0x2000, 0x007c,
++	0xa18c, 0x000f, 0x2011, 0x0101, 0x2204, 0xa084, 0xfff0, 0xa105,
++	0x2012, 0x1078, 0x205c, 0x007c, 0x2011, 0x0101, 0x20a9, 0x0009,
++	0x810b, 0x0070, 0x1f85, 0x0078, 0x1f80, 0xa18c, 0x0e00, 0x2204,
++	0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c, 0x2009, 0x0101, 0x20a9,
++	0x0005, 0x8213, 0x0070, 0x1f96, 0x0078, 0x1f91, 0xa294, 0x00e0,
++	0x2104, 0xa084, 0xff1f, 0xa205, 0x200a, 0x007c, 0x2011, 0x0101,
++	0x20a9, 0x000c, 0x810b, 0x0070, 0x1fa7, 0x0078, 0x1fa2, 0xa18c,
++	0xf000, 0x2204, 0xa084, 0x0fff, 0xa105, 0x2012, 0x007c, 0x2011,
++	0x0102, 0x2204, 0xa084, 0xffcf, 0xa105, 0x2012, 0x007c, 0x8103,
++	0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x62ac,
++	0x63ac, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0022, 0x0c7e,
++	0x2061, 0x0100, 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, 0x0c7f,
++	0x007c, 0x8103, 0x8003, 0xa080, 0x0022, 0x0c7e, 0x2061, 0x0100,
++	0x609a, 0x60a4, 0xa085, 0x0020, 0x60ae, 0x0c7f, 0x007c, 0x8103,
++	0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4,
++	0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018, 0x0c7f, 0x007c, 0x2091,
++	0x8000, 0x0c7e, 0x0e7e, 0x6818, 0xa005, 0x0040, 0x203a, 0x2061,
++	0x6100, 0x1078, 0x2042, 0x0040, 0x2024, 0x20a9, 0x0000, 0x2061,
++	0x6000, 0x0c7e, 0x1078, 0x2042, 0x0040, 0x200e, 0x0c7f, 0x8c60,
++	0x0070, 0x200c, 0x0078, 0x2001, 0x0078, 0x203a, 0x007f, 0xa082,
++	0x6000, 0x2071, 0x3d40, 0x70ba, 0x6020, 0xa085, 0x0800, 0x6022,
++	0x71b6, 0x2001, 0x0004, 0x70a2, 0x70c7, 0x000f, 0x70a7, 0x0000,
++	0x1078, 0x1f00, 0x0078, 0x2036, 0x2071, 0x3d40, 0x6020, 0xa085,
++	0x0800, 0x6022, 0x71b6, 0x2c00, 0x70be, 0x2001, 0x0006, 0x70a2,
++	0x70c7, 0x000f, 0x70a7, 0x0000, 0x1078, 0x1f00, 0x2001, 0x0000,
++	0x0078, 0x203c, 0x2001, 0x0001, 0x2091, 0x8001, 0xa005, 0x0e7f,
++	0x0c7f, 0x007c, 0x2c04, 0xa005, 0x0040, 0x2059, 0x2060, 0x6010,
++	0xa306, 0x00c0, 0x2056, 0x600c, 0xa206, 0x00c0, 0x2056, 0x6014,
++	0xa106, 0x00c0, 0x2056, 0xa006, 0x0078, 0x205b, 0x6000, 0x0078,
++	0x2043, 0xa085, 0x0001, 0x007c, 0x2011, 0x3d41, 0x220c, 0xa18c,
++	0x000f, 0x2011, 0x013b, 0x2204, 0xa084, 0x0100, 0x0040, 0x2072,
++	0x2021, 0xff04, 0x2122, 0x810b, 0x810b, 0x810b, 0x810b, 0xa18d,
++	0x0f00, 0x2104, 0x007c, 0x0e7e, 0x68e4, 0xa08c, 0x0020, 0x0040,
++	0x20c6, 0xa084, 0x0006, 0x00c0, 0x20c6, 0x6014, 0x8007, 0xa084,
++	0x000f, 0x8003, 0x8003, 0x8003, 0xa0f0, 0x3f80, 0x7004, 0xa084,
++	0x000a, 0x00c0, 0x20c6, 0x7108, 0xa194, 0xff00, 0x0040, 0x20c6,
++	0xa18c, 0x00ff, 0x2001, 0x000c, 0xa106, 0x0040, 0x20ad, 0x2001,
++	0x0012, 0xa106, 0x0040, 0x20b1, 0x2001, 0x0014, 0xa106, 0x0040,
++	0x20b5, 0x2001, 0x0019, 0xa106, 0x0040, 0x20b9, 0x2001, 0x0032,
++	0xa106, 0x0040, 0x20bd, 0x0078, 0x20c1, 0x2009, 0x0012, 0x0078,
++	0x20c3, 0x2009, 0x0014, 0x0078, 0x20c3, 0x2009, 0x0019, 0x0078,
++	0x20c3, 0x2009, 0x0020, 0x0078, 0x20c3, 0x2009, 0x003f, 0x0078,
++	0x20c3, 0x2011, 0x0000, 0x2100, 0xa205, 0x700a, 0x0e7f, 0x007c,
++	0x0068, 0x20c8, 0x2091, 0x8000, 0x2071, 0x0000, 0x007e, 0x7018,
++	0xa084, 0x0001, 0x00c0, 0x20cf, 0x007f, 0x2071, 0x0010, 0x70ca,
++	0x007f, 0x70c6, 0x70c3, 0x8002, 0x70db, 0x0442, 0x70df, 0x0000,
++	0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x20e6,
++	0x107e, 0x007e, 0x127e, 0x2091, 0x2300, 0x7f3c, 0x7e58, 0x7c30,
++	0x7d38, 0x2009, 0x3d74, 0x78a0, 0x200a, 0x8108, 0x250a, 0x8108,
++	0x240a, 0x8108, 0x260a, 0x8108, 0x270a, 0xa594, 0x003f, 0xa484,
++	0x4000, 0x0040, 0x210c, 0xa784, 0x007d, 0x00c0, 0x3585, 0xd784,
++	0x00c0, 0x2d06, 0x1078, 0x20c8, 0xa49c, 0x000f, 0xa382, 0x0004,
++	0x0050, 0x2114, 0x1078, 0x20c8, 0x8507, 0xa084, 0x000f, 0x0079,
++	0x2119, 0x25cf, 0x268a, 0x26b2, 0x2946, 0x2bc0, 0x2c23, 0x2c81,
++	0x2d06, 0x2dad, 0x2e33, 0x2141, 0x2129, 0x2418, 0x24ef, 0x2b9b,
++	0x2129, 0x1078, 0x20c8, 0x0018, 0x20ed, 0x127f, 0x2091, 0x8001,
++	0x007f, 0x107f, 0x007c, 0x7003, 0x0000, 0x703f, 0x0000, 0x7030,
++	0xa005, 0x0040, 0x213d, 0x7033, 0x0000, 0x1078, 0x355b, 0x0018,
++	0x20ed, 0x2009, 0x3d0f, 0x200b, 0x0000, 0x705c, 0xa005, 0x00c0,
++	0x2216, 0x70a0, 0xa084, 0x0007, 0x0079, 0x214e, 0x2242, 0x2156,
++	0x2164, 0x2181, 0x21a3, 0x21f0, 0x21c9, 0x2156, 0x7808, 0xa084,
++	0xfffd, 0x780a, 0x2009, 0x0047, 0x1078, 0x2a7a, 0x00c0, 0x2162,
++	0x7003, 0x0004, 0x0078, 0x212b, 0x1078, 0x3542, 0x00c0, 0x217f,
++	0x70b4, 0x8007, 0x7882, 0x789b, 0x0010, 0x78ab, 0x000c, 0x789b,
++	0x0060, 0x78ab, 0x0001, 0x785b, 0x0004, 0x2009, 0x00fa, 0x1078,
++	0x2a78, 0x00c0, 0x217f, 0x7003, 0x0004, 0x70c7, 0x000f, 0x0078,
++	0x212b, 0x1078, 0x3542, 0x00c0, 0x21a1, 0x71b4, 0x8107, 0x7882,
++	0x789b, 0x0010, 0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0x78ab,
++	0x0006, 0x789b, 0x0060, 0x78ab, 0x0002, 0x785b, 0x0004, 0x2009,
++	0x00fa, 0x1078, 0x2a78, 0x00c0, 0x21a1, 0x7003, 0x0004, 0x70c7,
++	0x000f, 0x0078, 0x212b, 0x1078, 0x3542, 0x00c0, 0x21c7, 0x71b4,
++	0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x001f, 0xa18d, 0x00c0,
++	0x79aa, 0x78ab, 0x0020, 0x71b8, 0x79aa, 0x78ab, 0x000d, 0x789b,
++	0x0060, 0x78ab, 0x0004, 0x785b, 0x0004, 0x2009, 0x00fa, 0x1078,
++	0x2a78, 0x00c0, 0x21c7, 0x7003, 0x0004, 0x70c7, 0x000f, 0x0078,
++	0x212b, 0x1078, 0x3542, 0x00c0, 0x21ee, 0x71b4, 0x8107, 0x7882,
++	0x789b, 0x0010, 0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0x78ab,
++	0x0006, 0x789b, 0x0060, 0x78ab, 0x0002, 0x785b, 0x0004, 0x2009,
++	0x00fa, 0x1078, 0x2a78, 0x00c0, 0x21ee, 0x70bc, 0x70bf, 0x0000,
++	0x2068, 0x703e, 0x7003, 0x0002, 0x70c7, 0x000f, 0x0078, 0x212b,
++	0x1078, 0x3542, 0x00c0, 0x212b, 0x70bc, 0x2068, 0x6f14, 0x1078,
++	0x3449, 0x2c50, 0x1078, 0x35ea, 0x789b, 0x0010, 0x6814, 0xa084,
++	0x001f, 0xa085, 0x0080, 0x007e, 0x007f, 0x78aa, 0x6e1c, 0x067e,
++	0x067f, 0x2041, 0x0001, 0x70c0, 0xa084, 0x0400, 0x2001, 0x0004,
++	0x0040, 0x2214, 0x2001, 0x0006, 0x0078, 0x2334, 0x1078, 0x3542,
++	0x00c0, 0x212b, 0x789b, 0x0010, 0x705c, 0x2068, 0x6f14, 0x1078,
++	0x3449, 0x2c50, 0x1078, 0x35ea, 0x6008, 0xa085, 0x0010, 0x600a,
++	0x6824, 0xa005, 0x0040, 0x2234, 0xa082, 0x0006, 0x0048, 0x2232,
++	0x0078, 0x2234, 0x6827, 0x0005, 0x6814, 0xa084, 0x001f, 0xa085,
++	0x0080, 0x78aa, 0x2031, 0x0020, 0x2041, 0x0001, 0x2001, 0x0003,
++	0x0078, 0x2334, 0x0018, 0x20ed, 0x7440, 0xa485, 0x0000, 0x0040,
++	0x226c, 0xa080, 0x3d80, 0x2030, 0x7144, 0x0018, 0x20ed, 0x8108,
++	0xa12a, 0x0048, 0x2255, 0x2009, 0x3d80, 0x2164, 0x6504, 0x85ff,
++	0x00c0, 0x2279, 0x8421, 0x00c0, 0x224d, 0x017e, 0x2009, 0x3d0f,
++	0x2104, 0xa005, 0x00c0, 0x226a, 0x017e, 0x2009, 0x3d10, 0x2104,
++	0x017f, 0x200a, 0x017f, 0x7146, 0x7003, 0x0000, 0x703f, 0x0000,
++	0x0078, 0x212b, 0x7640, 0xa6b0, 0x3d80, 0x7144, 0x2600, 0x0078,
++	0x225a, 0x7146, 0x2568, 0x2558, 0x753e, 0x2c50, 0x6034, 0xa085,
++	0x0000, 0x00c0, 0x2276, 0x6708, 0x7736, 0xa784, 0x013f, 0x0040,
++	0x22a7, 0xa784, 0x0021, 0x00c0, 0x2276, 0xa784, 0x0002, 0x0040,
++	0x2298, 0xa784, 0x0004, 0x0040, 0x2276, 0xa7bc, 0xfffb, 0x670a,
++	0xa784, 0x0018, 0x00c0, 0x2276, 0xa784, 0x0100, 0x0040, 0x22a7,
++	0x6018, 0xa005, 0x00c0, 0x2276, 0xa7bc, 0xfeff, 0x670a, 0x6823,
++	0x0000, 0x6e1c, 0xa684, 0x000e, 0x6118, 0x0040, 0x22b7, 0x601c,
++	0xa102, 0x0048, 0x22ba, 0x0040, 0x22ba, 0x0078, 0x2272, 0x81ff,
++	0x00c0, 0x2272, 0xa784, 0x0080, 0x00c0, 0x22c0, 0x700c, 0x6022,
++	0xa7bc, 0xff7f, 0x670a, 0x1078, 0x35ea, 0x0018, 0x20ed, 0x789b,
++	0x0010, 0xa046, 0x1078, 0x3542, 0x00c0, 0x212b, 0x6b14, 0xa39c,
++	0x001f, 0xa39d, 0x00c0, 0x704c, 0xa084, 0x8000, 0x0040, 0x22dc,
++	0xa684, 0x0001, 0x0040, 0x22de, 0xa39c, 0xffbf, 0xa684, 0x0010,
++	0x0040, 0x22e4, 0xa39d, 0x0020, 0x7baa, 0x8840, 0xa684, 0x000e,
++	0x00c0, 0x22ef, 0xa7bd, 0x0010, 0x670a, 0x0078, 0x2330, 0x714c,
++	0xa18c, 0x0800, 0x0040, 0x304e, 0x2011, 0x0021, 0x8004, 0x8004,
++	0x0048, 0x2306, 0x2011, 0x0022, 0x8004, 0x0048, 0x2306, 0x2011,
++	0x0020, 0x8004, 0x0048, 0x2306, 0x0040, 0x2330, 0x7aaa, 0x8840,
++	0x1078, 0x355b, 0x6a14, 0x610c, 0x8108, 0xa18c, 0x00ff, 0xa1e0,
++	0x6000, 0x2c64, 0x8cff, 0x0040, 0x2327, 0x6014, 0xa206, 0x00c0,
++	0x2311, 0x60b8, 0x8001, 0x60ba, 0x00c0, 0x230c, 0x0c7e, 0x2a60,
++	0x6008, 0xa085, 0x0100, 0x600a, 0x0c7f, 0x0078, 0x2242, 0x1078,
++	0x3542, 0x00c0, 0x212b, 0x2a60, 0x610e, 0x79aa, 0x8840, 0x712e,
++	0x0018, 0x20ed, 0x2001, 0x0001, 0x007e, 0x7150, 0xa184, 0x0018,
++	0x0040, 0x234f, 0xa184, 0x0010, 0x0040, 0x2342, 0x1078, 0x3273,
++	0x00c0, 0x2372, 0xa184, 0x0008, 0x0040, 0x234f, 0x69a0, 0xa184,
++	0x0600, 0x00c0, 0x234f, 0x1078, 0x316f, 0x0078, 0x2372, 0x69a0,
++	0xa184, 0x0800, 0x0040, 0x2366, 0x0c7e, 0x027e, 0x2960, 0x6000,
++	0xa085, 0x2000, 0x6002, 0x6104, 0xa18d, 0x0010, 0x6106, 0x027f,
++	0x0c7f, 0x1078, 0x3273, 0x00c0, 0x2372, 0x69a0, 0xa184, 0x0200,
++	0x0040, 0x236e, 0x1078, 0x31be, 0x0078, 0x2372, 0xa184, 0x0400,
++	0x00c0, 0x234b, 0x69a0, 0xa184, 0x1000, 0x0040, 0x237d, 0x6914,
++	0xa18c, 0xff00, 0x810f, 0x1078, 0x1fc3, 0x007f, 0x0018, 0x20ed,
++	0x7002, 0xa68c, 0x00e0, 0xa684, 0x0060, 0x0040, 0x238d, 0xa086,
++	0x0060, 0x00c0, 0x238d, 0xa18d, 0x4000, 0x88ff, 0x0040, 0x2392,
++	0xa18d, 0x0004, 0x795a, 0x69b6, 0x789b, 0x0060, 0x2800, 0x78aa,
++	0x789b, 0x0061, 0x6818, 0xa08d, 0x8000, 0xa084, 0x7fff, 0x691a,
++	0xa68c, 0x0080, 0x0040, 0x23b1, 0x70cb, 0x0000, 0xa08a, 0x000d,
++	0x0050, 0x23af, 0xa08a, 0x000c, 0x71ca, 0x2001, 0x000c, 0x800c,
++	0x71ce, 0x78aa, 0x8008, 0x810c, 0x0040, 0x3054, 0xa18c, 0x00f8,
++	0x00c0, 0x3054, 0x157e, 0x137e, 0x147e, 0x20a1, 0x012b, 0x789b,
++	0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f,
++	0x137f, 0x157f, 0x6814, 0x8007, 0x7882, 0x6d94, 0x7dd6, 0x7dde,
++	0x6e98, 0x7ed2, 0x7eda, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x23da,
++	0x0098, 0x23e2, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x355b,
++	0x0078, 0x2133, 0x7200, 0xa284, 0x0007, 0xa086, 0x0001, 0x00c0,
++	0x23ef, 0x781b, 0x004a, 0x1078, 0x355b, 0x0078, 0x2400, 0x6ab4,
++	0xa295, 0x2000, 0x7a5a, 0x781b, 0x004a, 0x1078, 0x355b, 0x7200,
++	0x2500, 0xa605, 0x0040, 0x2400, 0xa284, 0x0007, 0x1079, 0x240e,
++	0xad80, 0x0009, 0x7032, 0xa284, 0x0007, 0xa086, 0x0001, 0x00c0,
++	0x212b, 0x6018, 0x8000, 0x601a, 0x0078, 0x212b, 0x2416, 0x39a0,
++	0x39a0, 0x398f, 0x39a0, 0x2416, 0x398f, 0x2416, 0x1078, 0x20c8,
++	0x7808, 0xa084, 0xfffd, 0x780a, 0x0f7e, 0x2079, 0x3d00, 0x78c0,
++	0x0f7f, 0xa084, 0x0001, 0x0040, 0x243e, 0x70a0, 0xa086, 0x0001,
++	0x00c0, 0x242d, 0x70a2, 0x0078, 0x24d1, 0x70a0, 0xa086, 0x0005,
++	0x00c0, 0x243c, 0x70bc, 0x2068, 0x681b, 0x0004, 0x6817, 0x0000,
++	0x6820, 0xa085, 0x0008, 0x6822, 0x70a3, 0x0000, 0x157e, 0x2011,
++	0x0004, 0x71a0, 0xa186, 0x0001, 0x0040, 0x2460, 0xa186, 0x0007,
++	0x00c0, 0x2450, 0x2009, 0x3d35, 0x200b, 0x0005, 0x0078, 0x2460,
++	0x2009, 0x3d13, 0x2104, 0x2009, 0x3d12, 0x200a, 0x2009, 0x3d35,
++	0x200b, 0x0001, 0x70a3, 0x0000, 0x70a7, 0x0001, 0x0078, 0x2462,
++	0x70a3, 0x0000, 0x1078, 0x36ec, 0x20a9, 0x0010, 0x2039, 0x0000,
++	0x1078, 0x3340, 0xa7b8, 0x0100, 0x0070, 0x2470, 0x0078, 0x2468,
++	0x7000, 0x0079, 0x2473, 0x24a3, 0x248a, 0x248a, 0x247d, 0x24a3,
++	0x24a3, 0x24a3, 0x247b, 0x1078, 0x20c8, 0x2021, 0x3d57, 0x2404,
++	0xa005, 0x0040, 0x24a3, 0xad06, 0x00c0, 0x248a, 0x6800, 0x2022,
++	0x0078, 0x249a, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2496, 0x6f14,
++	0x1078, 0x3449, 0x1078, 0x3025, 0x0078, 0x249a, 0x7054, 0x2060,
++	0x6800, 0x6002, 0x6a1a, 0x6817, 0x0000, 0x6820, 0xa085, 0x0008,
++	0x6822, 0x1078, 0x1b7f, 0x2021, 0x6100, 0x1078, 0x24d7, 0x2021,
++	0x3d57, 0x1078, 0x24d7, 0x20a9, 0x0000, 0x2021, 0x6000, 0x1078,
++	0x24d7, 0x8420, 0x0070, 0x24b6, 0x0078, 0x24af, 0x2061, 0x4000,
++	0x2021, 0x0002, 0x20a9, 0x0100, 0x6018, 0x6110, 0x81ff, 0x0040,
++	0x24c5, 0xa102, 0x0050, 0x24c5, 0x6012, 0x601b, 0x0000, 0xace0,
++	0x0010, 0x0070, 0x24cd, 0x0078, 0x24bc, 0x8421, 0x00c0, 0x24ba,
++	0x157f, 0x7003, 0x0000, 0x703f, 0x0000, 0x0078, 0x212b, 0x047e,
++	0x2404, 0xa005, 0x0040, 0x24eb, 0x2068, 0x6800, 0x007e, 0x6a1a,
++	0x6817, 0x0000, 0x6820, 0xa085, 0x0008, 0x6822, 0x1078, 0x1b7f,
++	0x007f, 0x0078, 0x24d9, 0x047f, 0x2023, 0x0000, 0x007c, 0xa282,
++	0x0003, 0x0050, 0x24f5, 0x1078, 0x20c8, 0x2300, 0x0079, 0x24f8,
++	0x24fb, 0x256e, 0x258b, 0xa282, 0x0002, 0x0040, 0x2501, 0x1078,
++	0x20c8, 0x70a0, 0x70a3, 0x0000, 0x70c7, 0x0000, 0x0079, 0x2508,
++	0x2510, 0x2510, 0x2512, 0x2546, 0x305a, 0x2510, 0x2546, 0x2510,
++	0x1078, 0x20c8, 0x77b4, 0x1078, 0x3340, 0x77b4, 0xa7bc, 0x0f00,
++	0x1078, 0x3449, 0x6018, 0xa005, 0x0040, 0x253d, 0x2021, 0x6100,
++	0x2009, 0x0004, 0x2011, 0x0010, 0x1078, 0x25a8, 0x0040, 0x253d,
++	0x157e, 0x20a9, 0x0000, 0x2021, 0x6000, 0x047e, 0x2009, 0x0004,
++	0x2011, 0x0010, 0x1078, 0x25a8, 0x047f, 0x0040, 0x253c, 0x8420,
++	0x0070, 0x253c, 0x0078, 0x252d, 0x157f, 0x8738, 0xa784, 0x001f,
++	0x00c0, 0x2518, 0x0078, 0x2133, 0x0078, 0x2133, 0x77b4, 0x1078,
++	0x3449, 0x6018, 0xa005, 0x0040, 0x256c, 0x2021, 0x6100, 0x2009,
++	0x0005, 0x2011, 0x0020, 0x1078, 0x25a8, 0x0040, 0x256c, 0x157e,
++	0x20a9, 0x0000, 0x2021, 0x6000, 0x047e, 0x2009, 0x0005, 0x2011,
++	0x0020, 0x1078, 0x25a8, 0x047f, 0x0040, 0x256b, 0x8420, 0x0070,
++	0x256b, 0x0078, 0x255c, 0x157f, 0x0078, 0x2133, 0x2200, 0x0079,
++	0x2571, 0x2574, 0x2576, 0x2576, 0x1078, 0x20c8, 0x2009, 0x0012,
++	0x70a0, 0xa086, 0x0002, 0x0040, 0x257f, 0x2009, 0x000e, 0x6818,
++	0xa084, 0x8000, 0x0040, 0x2585, 0x691a, 0x70a3, 0x0000, 0x70a7,
++	0x0001, 0x0078, 0x34da, 0x2200, 0x0079, 0x258e, 0x2593, 0x2576,
++	0x2591, 0x1078, 0x20c8, 0x7000, 0xa086, 0x0001, 0x00c0, 0x25a4,
++	0x1078, 0x303b, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x2fdd,
++	0x0040, 0x25a4, 0x0078, 0x2242, 0x1078, 0x2a87, 0x0078, 0x2fea,
++	0x2404, 0xa005, 0x0040, 0x25cb, 0x2068, 0x2d04, 0x007e, 0x6814,
++	0xa706, 0x0040, 0x25b7, 0x2d20, 0x007f, 0x0078, 0x25a9, 0x007f,
++	0x2022, 0x691a, 0x6817, 0x0000, 0x6820, 0xa205, 0x6822, 0x1078,
++	0x1b7f, 0x6010, 0x8001, 0x6012, 0x6008, 0xa084, 0xffef, 0x600a,
++	0x1078, 0x303b, 0x007c, 0xa085, 0x0001, 0x0078, 0x25ca, 0x2300,
++	0x0079, 0x25d2, 0x25d7, 0x25d5, 0x2630, 0x1078, 0x20c8, 0x78e4,
++	0xa005, 0x00d0, 0x25fa, 0x0018, 0x212b, 0x2008, 0xa084, 0x0030,
++	0x00c0, 0x25e6, 0x781b, 0x004a, 0x0078, 0x212b, 0x78ec, 0xa084,
++	0x0003, 0x0040, 0x25e2, 0x2100, 0xa084, 0x0007, 0x0079, 0x25f0,
++	0x260b, 0x2616, 0x25fe, 0x25f8, 0x3535, 0x3535, 0x25f8, 0x2623,
++	0x1078, 0x20c8, 0x2001, 0x0003, 0x0078, 0x295a, 0x6818, 0xa084,
++	0x8000, 0x0040, 0x2605, 0x681b, 0x001d, 0x1078, 0x3323, 0x781b,
++	0x0053, 0x0078, 0x212b, 0x6818, 0xa084, 0x8000, 0x0040, 0x2612,
++	0x681b, 0x001d, 0x1078, 0x3323, 0x0078, 0x3506, 0x6818, 0xa084,
++	0x8000, 0x0040, 0x261d, 0x681b, 0x001d, 0x1078, 0x3323, 0x781b,
++	0x00e3, 0x0078, 0x212b, 0x6818, 0xa084, 0x8000, 0x0040, 0x262a,
++	0x681b, 0x001d, 0x1078, 0x3323, 0x781b, 0x009e, 0x0078, 0x212b,
++	0xa584, 0x000f, 0x00c0, 0x2651, 0x7000, 0x0079, 0x2637, 0x263f,
++	0x2641, 0x263f, 0x264d, 0x264d, 0x264d, 0x264d, 0x263f, 0x1078,
++	0x20c8, 0x1078, 0x303b, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078,
++	0x2fdd, 0x0040, 0x264d, 0x0078, 0x2242, 0x1078, 0x2a87, 0x0078,
++	0x2fea, 0x78e4, 0xa005, 0x00d0, 0x25fa, 0x0018, 0x25fa, 0x2008,
++	0xa084, 0x0030, 0x00c0, 0x2660, 0x781b, 0x004a, 0x0078, 0x212b,
++	0x78ec, 0xa084, 0x0003, 0x0040, 0x265c, 0x2100, 0xa184, 0x0007,
++	0x0079, 0x266a, 0x267a, 0x267e, 0x2674, 0x2672, 0x3535, 0x3535,
++	0x2672, 0x352d, 0x1078, 0x20c8, 0x1078, 0x332b, 0x781b, 0x0053,
++	0x0078, 0x212b, 0x1078, 0x332b, 0x0078, 0x3506, 0x1078, 0x332b,
++	0x781b, 0x00e3, 0x0078, 0x212b, 0x1078, 0x332b, 0x781b, 0x009e,
++	0x0078, 0x212b, 0x2300, 0x0079, 0x268d, 0x2692, 0x2690, 0x2694,
++	0x1078, 0x20c8, 0x0078, 0x2d06, 0x681b, 0x0008, 0x78a3, 0x0000,
++	0x79e4, 0xa184, 0x0030, 0x0040, 0x2d06, 0x78ec, 0xa084, 0x0003,
++	0x0040, 0x2d06, 0xa184, 0x0007, 0x0079, 0x26a6, 0x26ae, 0x267e,
++	0x25fe, 0x34da, 0x3535, 0x3535, 0x26ae, 0x352d, 0x1078, 0x34ea,
++	0x0078, 0x212b, 0xa282, 0x0005, 0x0050, 0x26b8, 0x1078, 0x20c8,
++	0x2300, 0x0079, 0x26bb, 0x26be, 0x290b, 0x2917, 0x2200, 0x0079,
++	0x26c1, 0x26db, 0x26c8, 0x26db, 0x26c6, 0x28f0, 0x1078, 0x20c8,
++	0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa082, 0x0020, 0x0048,
++	0x3305, 0xa08a, 0x0004, 0x00c8, 0x3305, 0x0079, 0x26d7, 0x3305,
++	0x3305, 0x3305, 0x32b3, 0x789b, 0x0018, 0x79a8, 0xa184, 0x0080,
++	0x0040, 0x26ec, 0x0078, 0x3305, 0x7000, 0xa005, 0x00c0, 0x26e2,
++	0x2011, 0x0004, 0x0078, 0x2e41, 0xa184, 0x00ff, 0xa08a, 0x0010,
++	0x00c8, 0x3305, 0x0079, 0x26f4, 0x2706, 0x2704, 0x271e, 0x2722,
++	0x27dd, 0x3305, 0x3305, 0x27df, 0x3305, 0x3305, 0x28ec, 0x28ec,
++	0x3305, 0x3305, 0x3305, 0x28ee, 0x1078, 0x20c8, 0xa684, 0x1000,
++	0x0040, 0x2713, 0x2001, 0x0300, 0x8000, 0x8000, 0x783a, 0x781b,
++	0x009b, 0x0078, 0x212b, 0x6818, 0xa084, 0x8000, 0x0040, 0x271c,
++	0x681b, 0x001d, 0x0078, 0x270a, 0x0078, 0x34da, 0x681b, 0x001d,
++	0x0078, 0x3311, 0x6920, 0x6922, 0xa684, 0x1800, 0x00c0, 0x2763,
++	0x6820, 0xa084, 0x0001, 0x00c0, 0x276b, 0x6818, 0xa086, 0x0008,
++	0x00c0, 0x2734, 0x681b, 0x0000, 0xa684, 0x0400, 0x0040, 0x27d9,
++	0xa684, 0x0080, 0x0040, 0x275f, 0x70cb, 0x0000, 0x6818, 0xa084,
++	0x003f, 0xa08a, 0x000d, 0x0050, 0x275f, 0xa08a, 0x000c, 0x71ca,
++	0x2001, 0x000c, 0x800c, 0x71ce, 0x789b, 0x0061, 0x78aa, 0x157e,
++	0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8000, 0x80ac,
++	0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x781b,
++	0x0056, 0x0078, 0x212b, 0xa684, 0x1000, 0x0040, 0x276b, 0x781b,
++	0x0068, 0x0078, 0x212b, 0xa684, 0x0060, 0x0040, 0x27d5, 0xa684,
++	0x0800, 0x0040, 0x27d5, 0xa684, 0x8000, 0x00c0, 0x2779, 0x0078,
++	0x2791, 0xa6b4, 0x7fff, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8, 0x78d0,
++	0x801b, 0x00c8, 0x2784, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291,
++	0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303,
++	0x68ae, 0xa684, 0x4000, 0x0040, 0x2799, 0xa6b4, 0xbfff, 0x7e5a,
++	0x6eb6, 0x7000, 0xa086, 0x0003, 0x00c0, 0x27a6, 0x1078, 0x3792,
++	0x1078, 0x398f, 0x781b, 0x0065, 0x0078, 0x212b, 0xa006, 0x1078,
++	0x3a5e, 0x6ab0, 0x69ac, 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0040,
++	0x27b5, 0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda,
++	0x6ba6, 0x7bd6, 0x7bde, 0x2300, 0xa405, 0x00c0, 0x27c7, 0xa6b5,
++	0x4000, 0x7e5a, 0x6eb6, 0x781b, 0x0065, 0x0078, 0x212b, 0x781b,
++	0x0065, 0x2200, 0xa115, 0x00c0, 0x27d1, 0x1078, 0x39a0, 0x0078,
++	0x212b, 0x1078, 0x39d5, 0x0078, 0x212b, 0x781b, 0x0068, 0x0078,
++	0x212b, 0x781b, 0x0056, 0x0078, 0x212b, 0x1078, 0x20c8, 0x0078,
++	0x283c, 0x6920, 0xa184, 0x0100, 0x0040, 0x27f7, 0xa18c, 0xfeff,
++	0x6922, 0x0c7e, 0x7048, 0x2060, 0x6000, 0xa084, 0xefff, 0x6002,
++	0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x0078, 0x282b, 0xa184,
++	0x0200, 0x0040, 0x282b, 0xa18c, 0xfdff, 0x6922, 0x0c7e, 0x7048,
++	0x2060, 0x6000, 0xa084, 0xdfff, 0x6002, 0x6004, 0xa084, 0xffef,
++	0x6006, 0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0008, 0x0040, 0x282b,
++	0x1078, 0x3445, 0x1078, 0x316f, 0x88ff, 0x0040, 0x282b, 0x789b,
++	0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684,
++	0x0400, 0x00c0, 0x2827, 0x781b, 0x0053, 0x0078, 0x212b, 0x781b,
++	0x0067, 0x0078, 0x212b, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2834,
++	0x781b, 0x0056, 0x0078, 0x212b, 0x781b, 0x0068, 0x0078, 0x212b,
++	0x0078, 0x330b, 0x0078, 0x330b, 0x2019, 0x0000, 0x7990, 0xa18c,
++	0x0007, 0x00c0, 0x284a, 0x6820, 0xa084, 0x0100, 0x0040, 0x283a,
++	0x2009, 0x0008, 0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286,
++	0x0001, 0x00c0, 0x2881, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102,
++	0x0040, 0x2879, 0x0048, 0x285e, 0x0078, 0x287b, 0xa380, 0x0002,
++	0xa102, 0x00c8, 0x2879, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0c7e,
++	0x7048, 0x2060, 0x6000, 0xa084, 0xefef, 0x6002, 0x6004, 0xa084,
++	0xffe5, 0x6006, 0x0c7f, 0x7e58, 0xa6b4, 0xfffb, 0x7e5a, 0x0078,
++	0x282c, 0x0078, 0x27e1, 0x24a8, 0x7aa8, 0x00f0, 0x287b, 0x0078,
++	0x284c, 0xa284, 0x00f0, 0xa086, 0x0020, 0x00c0, 0x28dd, 0x8318,
++	0x8318, 0x2300, 0xa102, 0x0040, 0x2891, 0x0048, 0x2891, 0x0078,
++	0x28da, 0xa286, 0x0023, 0x0040, 0x283a, 0x681c, 0xa084, 0xfff1,
++	0x681e, 0x7e58, 0xa684, 0xfff1, 0xa085, 0x0010, 0x2030, 0x7e5a,
++	0x6008, 0xa085, 0x0010, 0x600a, 0x0c7e, 0x7048, 0x2060, 0x6004,
++	0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0010, 0x0040, 0x28b5, 0x1078,
++	0x3445, 0x1078, 0x3273, 0x0078, 0x28c4, 0x0c7e, 0x7048, 0x2060,
++	0x6004, 0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0008, 0x0040, 0x282b,
++	0x1078, 0x3445, 0x1078, 0x316f, 0x88ff, 0x0040, 0x282b, 0x789b,
++	0x0060, 0x2800, 0x78aa, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400,
++	0x00c0, 0x28d6, 0x781b, 0x0053, 0x0078, 0x212b, 0x781b, 0x0067,
++	0x0078, 0x212b, 0x7aa8, 0x0078, 0x284c, 0x8318, 0x2300, 0xa102,
++	0x0040, 0x28e6, 0x0048, 0x28e6, 0x0078, 0x284c, 0xa284, 0x0080,
++	0x00c0, 0x3311, 0x0078, 0x330b, 0x0078, 0x3311, 0x0078, 0x3305,
++	0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa08e, 0x0001, 0x0040,
++	0x28fb, 0x1078, 0x20c8, 0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084,
++	0x00ff, 0xa08a, 0x0004, 0x00c8, 0x3305, 0x0079, 0x2907, 0x308b,
++	0x30c2, 0x3305, 0x320e, 0xa282, 0x0000, 0x00c0, 0x2911, 0x1078,
++	0x20c8, 0x1078, 0x3323, 0x781b, 0x0067, 0x0078, 0x212b, 0xa282,
++	0x0003, 0x00c0, 0x291d, 0x1078, 0x20c8, 0xa484, 0x8000, 0x00c0,
++	0x2940, 0x70a0, 0xa005, 0x0040, 0x2927, 0x1078, 0x20c8, 0x6f14,
++	0x77b6, 0xa7bc, 0x0f00, 0x1078, 0x3449, 0x6008, 0xa085, 0x0021,
++	0x600a, 0x8738, 0xa784, 0x001f, 0x00c0, 0x292b, 0x1078, 0x3327,
++	0x70a3, 0x0002, 0x2009, 0x3d35, 0x200b, 0x0009, 0x0078, 0x2942,
++	0x1078, 0x3333, 0x781b, 0x0067, 0x0078, 0x212b, 0xa282, 0x0004,
++	0x0050, 0x294c, 0x1078, 0x20c8, 0x2300, 0x0079, 0x294f, 0x2952,
++	0x2a33, 0x2a62, 0xa286, 0x0003, 0x0040, 0x2958, 0x1078, 0x20c8,
++	0x2001, 0x0000, 0x007e, 0x68a0, 0xa084, 0x2000, 0x0040, 0x2964,
++	0x6008, 0xa085, 0x0002, 0x600a, 0x007f, 0x703a, 0x7000, 0xa084,
++	0x0007, 0x0079, 0x296b, 0x2133, 0x2975, 0x2975, 0x2b50, 0x2b81,
++	0x2133, 0x2b81, 0x2973, 0x1078, 0x20c8, 0xa684, 0x1000, 0x00c0,
++	0x297d, 0x1078, 0x36ec, 0x0040, 0x2a0d, 0x7868, 0xa08c, 0x00ff,
++	0x0040, 0x29c3, 0xa186, 0x0008, 0x00c0, 0x2994, 0x6008, 0xa084,
++	0xffef, 0x600a, 0x1078, 0x2fdd, 0x0040, 0x29c3, 0x1078, 0x303b,
++	0x1078, 0x36ec, 0x0078, 0x29aa, 0xa186, 0x0028, 0x00c0, 0x29c3,
++	0x1078, 0x36ec, 0x6008, 0xa084, 0xffef, 0x600a, 0x6018, 0xa005,
++	0x0040, 0x29aa, 0x8001, 0x601a, 0x6008, 0xa085, 0x0008, 0x600a,
++	0x7010, 0x6026, 0x6820, 0xa084, 0x0001, 0x0040, 0x2133, 0x6820,
++	0xa084, 0xfffe, 0x6822, 0x7054, 0x0c7e, 0x2060, 0x6800, 0x6002,
++	0x0c7f, 0x6004, 0x6802, 0xa005, 0x2d00, 0x00c0, 0x29c0, 0x6002,
++	0x6006, 0x0078, 0x2133, 0x017e, 0x1078, 0x2a87, 0x017f, 0xa684,
++	0xdf00, 0x681e, 0x682b, 0x0000, 0x6f14, 0x81ff, 0x0040, 0x2a0d,
++	0xa186, 0x0002, 0x00c0, 0x2a0d, 0xa684, 0x0800, 0x00c0, 0x29e0,
++	0xa684, 0x0060, 0x0040, 0x29e0, 0x78d8, 0x7adc, 0x682e, 0x6a32,
++	0x6820, 0xa084, 0x0800, 0x00c0, 0x2a0d, 0x8717, 0xa294, 0x000f,
++	0x8213, 0x8213, 0x8213, 0xa290, 0x3f80, 0xa290, 0x0000, 0x221c,
++	0xa384, 0x0100, 0x00c0, 0x29f6, 0x0078, 0x29fc, 0x8210, 0x2204,
++	0xa085, 0x0018, 0x2012, 0x8211, 0xa384, 0x0400, 0x0040, 0x2a09,
++	0x68a0, 0xa084, 0x0100, 0x00c0, 0x2a09, 0x1078, 0x2b0b, 0x0078,
++	0x2133, 0x6008, 0xa085, 0x0002, 0x600a, 0x6916, 0x6818, 0xa084,
++	0x8000, 0x0040, 0x2a15, 0x7038, 0x681a, 0xa68c, 0xdf00, 0x691e,
++	0x1078, 0x302c, 0x1078, 0x303b, 0x00c0, 0x2a22, 0x6008, 0xa084,
++	0xffef, 0x600a, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2a2b, 0x1078,
++	0x3025, 0x0078, 0x2a2f, 0x7054, 0x2060, 0x6800, 0x6002, 0x1078,
++	0x1b7f, 0x0078, 0x2133, 0xa282, 0x0004, 0x0048, 0x2a39, 0x1078,
++	0x20c8, 0x2200, 0x0079, 0x2a3c, 0x2a37, 0x2a40, 0x2a4d, 0x2a40,
++	0x7000, 0xa086, 0x0005, 0x0040, 0x2a49, 0x1078, 0x3323, 0x781b,
++	0x0067, 0x781b, 0x0068, 0x0078, 0x212b, 0x7890, 0x8007, 0x8001,
++	0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff,
++	0xa186, 0x0003, 0x0040, 0x2a5e, 0x0078, 0x3305, 0x781b, 0x0068,
++	0x0078, 0x212b, 0x6820, 0xa085, 0x0004, 0x6822, 0x82ff, 0x00c0,
++	0x2a6d, 0x1078, 0x3323, 0x0078, 0x2a74, 0x8211, 0x0040, 0x2a72,
++	0x1078, 0x20c8, 0x1078, 0x3333, 0x781b, 0x0067, 0x0078, 0x212b,
++	0x1078, 0x355b, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x2a84, 0x0018,
++	0x2a84, 0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0xa684,
++	0x0060, 0x00c0, 0x2a91, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078,
++	0x2b0a, 0xa684, 0x0800, 0x00c0, 0x2ab3, 0x68b4, 0xa084, 0x4800,
++	0xa635, 0xa684, 0x0800, 0x00c0, 0x2ab3, 0x6998, 0x6a94, 0x692e,
++	0x6a32, 0x7038, 0xa005, 0x00c0, 0x2aab, 0x2200, 0xa105, 0x0040,
++	0x2ab2, 0x703b, 0x0015, 0x7000, 0xa086, 0x0006, 0x0040, 0x2ab2,
++	0x1078, 0x36ec, 0x007c, 0xa684, 0x0020, 0x0040, 0x2ad5, 0xa684,
++	0x4000, 0x0040, 0x2ac1, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078,
++	0x2aab, 0x68b4, 0xa084, 0x4800, 0xa635, 0xa684, 0x4000, 0x00c0,
++	0x2abb, 0x7038, 0xa005, 0x00c0, 0x2acf, 0x703b, 0x0015, 0x79d8,
++	0x7adc, 0x692e, 0x6a32, 0x0078, 0x2aab, 0xa684, 0x4000, 0x0040,
++	0x2adf, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x2aab, 0x68b4,
++	0xa084, 0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, 0x2ad9, 0x7038,
++	0xa005, 0x00c0, 0x2aed, 0x703b, 0x0015, 0x79d8, 0x7adc, 0x78d0,
++	0x80fb, 0x00c8, 0x2af4, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291,
++	0x0000, 0x692e, 0x6a32, 0x2100, 0xa205, 0x00c0, 0x2b01, 0x0078,
++	0x2aab, 0x7000, 0xa086, 0x0006, 0x0040, 0x2b0a, 0x1078, 0x3a5e,
++	0x0078, 0x2aab, 0x007c, 0xa384, 0x0200, 0x0040, 0x2b13, 0x6008,
++	0xa085, 0x0002, 0x600a, 0x681b, 0x0006, 0x688f, 0x0000, 0x6893,
++	0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f, 0x0003, 0x6833,
++	0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b, 0x0020, 0x7000,
++	0x0079, 0x2b2a, 0x2b32, 0x2b34, 0x2b3d, 0x2b32, 0x2b32, 0x2b32,
++	0x2b32, 0x2b32, 0x1078, 0x20c8, 0x6820, 0xa084, 0x0001, 0x00c0,
++	0x2b3d, 0x1078, 0x3025, 0x0078, 0x2b43, 0x7054, 0x2c50, 0x2060,
++	0x6800, 0x6002, 0x2a60, 0x2021, 0x3d57, 0x2404, 0xa005, 0x0040,
++	0x2b4c, 0x2020, 0x0078, 0x2b45, 0x2d22, 0x206b, 0x0000, 0x007c,
++	0x1078, 0x302c, 0x1078, 0x303b, 0x682b, 0x0000, 0x789b, 0x000e,
++	0x6f14, 0x1078, 0x3a90, 0x6817, 0x0002, 0xa684, 0x0800, 0x0040,
++	0x2b65, 0x691c, 0xa18d, 0x2000, 0x691e, 0x6818, 0xa084, 0x8000,
++	0x0040, 0x2b75, 0x7868, 0xa08c, 0x00ff, 0x0040, 0x2b73, 0x681b,
++	0x001e, 0x0078, 0x2b75, 0x681b, 0x0000, 0x2021, 0x3d57, 0x6800,
++	0x2022, 0x6a3c, 0x6940, 0x6a32, 0x692e, 0x1078, 0x1b7f, 0x0078,
++	0x2133, 0x1078, 0x2a87, 0x682b, 0x0000, 0x2001, 0x000e, 0x6f14,
++	0x1078, 0x3560, 0xa08c, 0x00ff, 0x6916, 0x6818, 0xa084, 0x8000,
++	0x0040, 0x2b94, 0x7038, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x70a3,
++	0x0000, 0x0078, 0x2133, 0xa006, 0x1078, 0x36ec, 0x6817, 0x0000,
++	0x681b, 0x0014, 0xa68c, 0xdf00, 0x691e, 0x682b, 0x0000, 0x6820,
++	0xa085, 0x00ff, 0x6822, 0x7000, 0x0079, 0x2bae, 0x2bb6, 0x2bb8,
++	0x2bb8, 0x2bba, 0x2bba, 0x2bba, 0x2bba, 0x2bb6, 0x1078, 0x20c8,
++	0x1078, 0x303b, 0x6008, 0xa084, 0xffef, 0x600a, 0x0078, 0x2ff5,
++	0x2300, 0x0079, 0x2bc3, 0x2bc6, 0x2bc8, 0x2c21, 0x1078, 0x20c8,
++	0xa684, 0x8000, 0x00c0, 0x2c06, 0x7000, 0x0079, 0x2bcf, 0x2bd7,
++	0x2bd9, 0x2bd9, 0x2bf5, 0x2bd9, 0x2c02, 0x2bf5, 0x2bd7, 0x1078,
++	0x20c8, 0xa684, 0x0060, 0xa086, 0x0060, 0x00c0, 0x2bf1, 0xa6b4,
++	0xffdf, 0xa6b4, 0xbfff, 0xa6b5, 0x2000, 0x7e5a, 0x6eb6, 0x681c,
++	0xa084, 0xffdf, 0x681e, 0x1078, 0x36ec, 0x1078, 0x39a0, 0x0078,
++	0x34da, 0xa684, 0x2000, 0x0040, 0x2be3, 0x6818, 0xa084, 0x8000,
++	0x0040, 0x2c02, 0x681b, 0x0015, 0xa684, 0x4000, 0x0040, 0x2c02,
++	0x681b, 0x0007, 0x1078, 0x34ea, 0x0078, 0x212b, 0xa6b4, 0x7fff,
++	0x7e5a, 0x7adc, 0x79d8, 0x78d0, 0x79d2, 0x801b, 0x00c8, 0x2c11,
++	0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100,
++	0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x781b, 0x0068,
++	0x007c, 0x1078, 0x20c8, 0x2300, 0x0079, 0x2c26, 0x2c29, 0x2c2b,
++	0x2c73, 0x1078, 0x20c8, 0xa684, 0x8000, 0x00c0, 0x2c62, 0x7000,
++	0x0079, 0x2c32, 0x2c39, 0x2c3b, 0x2c3b, 0x2c57, 0x2c3b, 0x2c57,
++	0x2c39, 0x1078, 0x20c8, 0xa684, 0x0060, 0xa086, 0x0060, 0x00c0,
++	0x2c53, 0xa6b4, 0xffbf, 0xa6b4, 0xbfff, 0xa6b5, 0x2000, 0x7e5a,
++	0x6eb6, 0x681c, 0xa084, 0xffbf, 0x681e, 0x1078, 0x36ec, 0x1078,
++	0x39a0, 0x0078, 0x34da, 0xa684, 0x2000, 0x0040, 0x2c45, 0x6818,
++	0xa084, 0x8000, 0x0040, 0x2c5e, 0x681b, 0x0007, 0x781b, 0x00e4,
++	0x0078, 0x212b, 0xa6b4, 0x7fff, 0x7e5a, 0x7adc, 0x79d8, 0x6b98,
++	0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x79d2,
++	0x781b, 0x0068, 0x007c, 0x6820, 0xa085, 0x0004, 0x6822, 0x1078,
++	0x34a7, 0xa6b5, 0x0800, 0x1078, 0x3323, 0x781b, 0x0067, 0x0078,
++	0x212b, 0x2300, 0x0079, 0x2c84, 0x2c87, 0x2c89, 0x2c8b, 0x1078,
++	0x20c8, 0x0078, 0x3311, 0xa684, 0x0400, 0x00c0, 0x2cb4, 0x79e4,
++	0xa184, 0x0020, 0x0040, 0x2c9b, 0x78ec, 0xa084, 0x0003, 0x0040,
++	0x2c9b, 0x782b, 0x3009, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684,
++	0xfffb, 0x785a, 0x79e4, 0xa184, 0x0020, 0x0040, 0x2cac, 0x78ec,
++	0xa084, 0x0003, 0x00c0, 0x2cb0, 0x2001, 0x0014, 0x0078, 0x295a,
++	0xa184, 0x0007, 0x0079, 0x2cec, 0x7a90, 0xa294, 0x0007, 0x789b,
++	0x0060, 0x79a8, 0x81ff, 0x0040, 0x2cea, 0x789b, 0x0010, 0x7ba8,
++	0xa384, 0x0001, 0x00c0, 0x2cdb, 0x7ba8, 0x7ba8, 0xa386, 0x0001,
++	0x00c0, 0x2cce, 0x2009, 0xfff7, 0x0078, 0x2cd4, 0xa386, 0x0003,
++	0x00c0, 0x2cdb, 0x2009, 0xffef, 0x0c7e, 0x7048, 0x2060, 0x6004,
++	0xa104, 0x6006, 0x0c7f, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684,
++	0xfffb, 0x785a, 0x782b, 0x3009, 0x6920, 0xa18c, 0xfdff, 0xa18c,
++	0xfeff, 0x6922, 0x0078, 0x34da, 0x260b, 0x2616, 0x2cf6, 0x2cfe,
++	0x2cf4, 0x2cf4, 0x34da, 0x34da, 0x1078, 0x20c8, 0x6920, 0xa18c,
++	0xfdff, 0xa18c, 0xfeff, 0x6922, 0x0078, 0x34e2, 0x6920, 0xa18c,
++	0xfdff, 0xa18c, 0xfeff, 0x6922, 0x0078, 0x34da, 0x79e4, 0xa184,
++	0x0030, 0x0040, 0x2d10, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x2d26,
++	0x70a0, 0xa086, 0x0002, 0x00c0, 0x2d19, 0x2011, 0x0002, 0x0078,
++	0x24ef, 0x7000, 0xa086, 0x0000, 0x0040, 0x212b, 0x6818, 0xa085,
++	0x8000, 0x681a, 0x2001, 0x0014, 0x0078, 0x295a, 0xa184, 0x0007,
++	0x0079, 0x2d2a, 0x34da, 0x34da, 0x2d32, 0x34da, 0x3535, 0x3535,
++	0x34da, 0x34da, 0xa684, 0x0080, 0x0040, 0x2d61, 0x71c8, 0x81ff,
++	0x0040, 0x2d61, 0xa182, 0x000d, 0x00d0, 0x2d42, 0x70cb, 0x0000,
++	0x0078, 0x2d47, 0xa182, 0x000c, 0x70ca, 0x2009, 0x000c, 0x789b,
++	0x0061, 0x79aa, 0x157e, 0x137e, 0x147e, 0x70cc, 0x8114, 0xa210,
++	0x72ce, 0xa080, 0x000b, 0xad00, 0x2098, 0x20a1, 0x012b, 0x789b,
++	0x0000, 0x8108, 0x81ac, 0x53a6, 0x147f, 0x137f, 0x157f, 0x0078,
++	0x34e2, 0xa684, 0x0400, 0x00c0, 0x2da2, 0x6820, 0xa084, 0x0001,
++	0x0040, 0x34e2, 0xa68c, 0x0060, 0xa684, 0x0060, 0x0040, 0x2d76,
++	0xa086, 0x0060, 0x00c0, 0x2d76, 0xa18d, 0x4000, 0xa18c, 0xfffb,
++	0x795a, 0x69b6, 0x789b, 0x0060, 0x78ab, 0x0000, 0x789b, 0x0061,
++	0x6818, 0xa085, 0x8000, 0x681a, 0x78aa, 0x8008, 0x810c, 0x0040,
++	0x3054, 0xa18c, 0x00f8, 0x00c0, 0x3054, 0x157e, 0x137e, 0x147e,
++	0x20a1, 0x012b, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000b,
++	0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6814, 0x8007, 0x7882,
++	0x0078, 0x34e2, 0x6818, 0xa084, 0x8000, 0x0040, 0x2da9, 0x681b,
++	0x0008, 0x781b, 0x00d8, 0x0078, 0x212b, 0x2300, 0x0079, 0x2db0,
++	0x2db5, 0x2e31, 0x2db3, 0x1078, 0x20c8, 0x7000, 0xa084, 0x0007,
++	0x0079, 0x2dba, 0x2dc2, 0x2dc4, 0x2de9, 0x2958, 0x2dc2, 0x2133,
++	0x2dc2, 0x2dc2, 0x1078, 0x20c8, 0x681c, 0xa084, 0x2000, 0x0040,
++	0x2dcd, 0x6008, 0xa085, 0x0002, 0x600a, 0x6920, 0xa18d, 0x0001,
++	0x6922, 0x6800, 0x6006, 0xa005, 0x00c0, 0x2dd7, 0x6002, 0x681c,
++	0xa084, 0x000e, 0x0040, 0x2de3, 0x7014, 0x68ba, 0x712c, 0xa188,
++	0x6000, 0x0078, 0x2de5, 0x2009, 0x6100, 0x2104, 0x6802, 0x2d0a,
++	0x7156, 0x6eb6, 0xa684, 0x0060, 0x0040, 0x2e2f, 0xa684, 0x0800,
++	0x00c0, 0x2dfd, 0xa684, 0x7fff, 0x68b6, 0x6894, 0x68a6, 0x6898,
++	0x68aa, 0x1078, 0x36ec, 0x0078, 0x2e2f, 0xa684, 0x0020, 0x0040,
++	0x2e0a, 0xa006, 0x1078, 0x3a5e, 0x79d8, 0x7adc, 0x69aa, 0x6aa6,
++	0x0078, 0x2e10, 0x1078, 0x3456, 0x69aa, 0x6aa6, 0x1078, 0x3a5e,
++	0xa684, 0x8000, 0x0040, 0x2e2f, 0xa684, 0x7fff, 0x68b6, 0x7adc,
++	0x79d8, 0xa684, 0x0020, 0x00c0, 0x2e27, 0x78d0, 0x801b, 0x00c8,
++	0x2e22, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98,
++	0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x0078,
++	0x2133, 0x0078, 0x3311, 0x7033, 0x0000, 0xa282, 0x0006, 0x0050,
++	0x2e3b, 0x1078, 0x20c8, 0x2300, 0x0079, 0x2e3e, 0x2e41, 0x2e6a,
++	0x2e90, 0x2200, 0x0079, 0x2e44, 0x2e4a, 0x3311, 0x2e4c, 0x2e4a,
++	0x2ebc, 0x2f0f, 0x1078, 0x20c8, 0x7003, 0x0005, 0x2001, 0x6110,
++	0x2068, 0x703e, 0x157e, 0x20a9, 0x002f, 0x2003, 0x0000, 0x8000,
++	0x0070, 0x2e5c, 0x0078, 0x2e55, 0x157f, 0xad80, 0x0009, 0x7032,
++	0x6817, 0x0000, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003,
++	0x0078, 0x3305, 0x7000, 0xa086, 0x0001, 0x00c0, 0x2e77, 0x1078,
++	0x303b, 0x1078, 0x36ec, 0x7034, 0x600a, 0x0078, 0x2e7c, 0x7000,
++	0xa086, 0x0003, 0x0040, 0x2e71, 0x7003, 0x0005, 0x2001, 0x6110,
++	0x2068, 0x703e, 0xad80, 0x0009, 0x7032, 0x2200, 0x0079, 0x2e88,
++	0x3311, 0x2e8e, 0x2e8e, 0x2ebc, 0x2e8e, 0x3311, 0x1078, 0x20c8,
++	0x7000, 0xa086, 0x0001, 0x00c0, 0x2e9d, 0x1078, 0x303b, 0x1078,
++	0x36ec, 0x7034, 0x600a, 0x0078, 0x2ea2, 0x7000, 0xa086, 0x0003,
++	0x0040, 0x2e97, 0x7003, 0x0005, 0x2001, 0x6110, 0x2068, 0x703e,
++	0xad80, 0x0009, 0x7032, 0x2200, 0x0079, 0x2eae, 0x2eb6, 0x2eb4,
++	0x2eb4, 0x2eb6, 0x2eb4, 0x2eb6, 0x1078, 0x20c8, 0x1078, 0x3333,
++	0x781b, 0x0067, 0x0078, 0x212b, 0x7000, 0xa086, 0x0001, 0x00c0,
++	0x2ec9, 0x1078, 0x303b, 0x1078, 0x36ec, 0x7034, 0x600a, 0x0078,
++	0x2ece, 0x7000, 0xa086, 0x0003, 0x0040, 0x2ec3, 0x7003, 0x0002,
++	0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f,
++	0xa215, 0x2069, 0x6100, 0x2d04, 0x2d08, 0x7156, 0x2068, 0xa005,
++	0x0040, 0x2ee9, 0x6814, 0xa206, 0x0040, 0x2f04, 0x6800, 0x0078,
++	0x2edc, 0x7003, 0x0005, 0x2001, 0x6110, 0x2068, 0x703e, 0x157e,
++	0x20a9, 0x002f, 0x2003, 0x0000, 0x8000, 0x0070, 0x2ef9, 0x0078,
++	0x2ef2, 0x157f, 0xad80, 0x0009, 0x7032, 0x6a16, 0x68b7, 0x0700,
++	0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4, 0x7e5a, 0x6820, 0xa084,
++	0x0c00, 0x0040, 0x2f70, 0x1078, 0x332b, 0x0078, 0x2f70, 0x7000,
++	0xa086, 0x0001, 0x00c0, 0x2f1c, 0x1078, 0x303b, 0x1078, 0x36ec,
++	0x7034, 0x600a, 0x0078, 0x2f21, 0x7000, 0xa086, 0x0003, 0x0040,
++	0x2f16, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018,
++	0x7ca8, 0xa484, 0x001f, 0xa215, 0x79a8, 0x79a8, 0xa18c, 0x00ff,
++	0xa1e8, 0x6000, 0x2d04, 0x2d08, 0x7156, 0x2068, 0xa005, 0x0040,
++	0x2f40, 0x6814, 0xa206, 0x0040, 0x2f5b, 0x6800, 0x0078, 0x2f33,
++	0x7003, 0x0005, 0x2001, 0x6110, 0x2068, 0x703e, 0x157e, 0x20a9,
++	0x002f, 0x2003, 0x0000, 0x8000, 0x0070, 0x2f50, 0x0078, 0x2f49,
++	0x157f, 0xad80, 0x0009, 0x7032, 0x6a16, 0x68b7, 0x0700, 0x6823,
++	0x0800, 0x6827, 0x0003, 0x6eb4, 0x7e5a, 0x6820, 0xa084, 0x0c00,
++	0x0040, 0x2f70, 0xa084, 0x0800, 0x0040, 0x2f6a, 0x1078, 0x332f,
++	0x0078, 0x2f70, 0x1078, 0x332b, 0x70bf, 0x0000, 0x0078, 0x2f70,
++	0x027e, 0x8207, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080,
++	0x3f80, 0x2060, 0x704a, 0x6000, 0x704e, 0x6004, 0x7052, 0xa684,
++	0x0060, 0x0040, 0x2fb0, 0x6b98, 0x6c94, 0x69ac, 0x68b0, 0xa105,
++	0x00c0, 0x2f9e, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa6b4, 0xb7ff,
++	0x7e5a, 0xa684, 0x0060, 0xa086, 0x0060, 0x0040, 0x2fb0, 0x1078,
++	0x39a0, 0xa6b5, 0x2000, 0x7e5a, 0x0078, 0x2fb0, 0x68b0, 0xa31a,
++	0x2100, 0xa423, 0x2400, 0xa305, 0x0040, 0x2fb0, 0x7bd2, 0x7bda,
++	0x7cd6, 0x7cde, 0x68b0, 0xa6b4, 0xbfff, 0x7e5a, 0x1078, 0x39d5,
++	0x077f, 0x1078, 0x3449, 0x2009, 0x0068, 0xa684, 0x0008, 0x0040,
++	0x2fcf, 0x78e4, 0xa084, 0x0030, 0x0040, 0x2fc7, 0x78ec, 0xa084,
++	0x0003, 0x0040, 0x2fc7, 0x2009, 0x0067, 0x0078, 0x2fcf, 0x0f7e,
++	0x2079, 0x3d00, 0x1078, 0x36ec, 0x0f7f, 0x0078, 0x2133, 0x791a,
++	0x2d00, 0x703e, 0x8207, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++	0xa080, 0x3f80, 0x2048, 0x0078, 0x212b, 0x6020, 0xa005, 0x0040,
++	0x2fe9, 0x8001, 0x6022, 0x6008, 0xa085, 0x0008, 0x600a, 0x7010,
++	0x6026, 0x007c, 0xa006, 0x1078, 0x36ec, 0x6817, 0x0000, 0x681b,
++	0x0001, 0x6823, 0x0040, 0x681f, 0x0100, 0x7000, 0xa084, 0x0007,
++	0x0079, 0x2ffa, 0x3002, 0x3004, 0x3004, 0x3021, 0x300c, 0x3002,
++	0x300c, 0x3002, 0x1078, 0x20c8, 0x1078, 0x302c, 0x1078, 0x3025,
++	0x1078, 0x1b7f, 0x0078, 0x2133, 0x70a0, 0x70a3, 0x0000, 0x70c7,
++	0x0000, 0x0079, 0x3013, 0x301d, 0x301d, 0x301b, 0x301b, 0x301b,
++	0x301d, 0x301b, 0x301d, 0x0079, 0x2508, 0x70a3, 0x0000, 0x0078,
++	0x2133, 0x681b, 0x0000, 0x0078, 0x2b50, 0x6800, 0xa005, 0x00c0,
++	0x302a, 0x6002, 0x6006, 0x007c, 0x6010, 0xa005, 0x0040, 0x3035,
++	0x8001, 0x00d0, 0x3035, 0x1078, 0x20c8, 0x6012, 0x6008, 0xa084,
++	0xffef, 0x600a, 0x007c, 0x6018, 0xa005, 0x0040, 0x3041, 0x8001,
++	0x601a, 0x007c, 0x1078, 0x355b, 0x681b, 0x0018, 0x0078, 0x3078,
++	0x1078, 0x355b, 0x681b, 0x0019, 0x0078, 0x3078, 0x1078, 0x355b,
++	0x681b, 0x001a, 0x0078, 0x3078, 0x1078, 0x355b, 0x681b, 0x0003,
++	0x0078, 0x3078, 0x77b4, 0x1078, 0x3449, 0x71b8, 0xa18c, 0x00ff,
++	0xa1e8, 0x6000, 0x2d04, 0x2d08, 0x2068, 0xa005, 0x00c0, 0x306a,
++	0x0078, 0x2133, 0x6814, 0x72b4, 0xa206, 0x0040, 0x3072, 0x6800,
++	0x0078, 0x3063, 0x6800, 0x200a, 0x681b, 0x0005, 0x70bf, 0x0000,
++	0x1078, 0x302c, 0x6820, 0xa084, 0x0001, 0x00c0, 0x3081, 0x1078,
++	0x3025, 0x1078, 0x303b, 0x681f, 0x0000, 0x6823, 0x0020, 0x1078,
++	0x1b7f, 0x0078, 0x2133, 0xa282, 0x0005, 0x00c0, 0x3305, 0x78a8,
++	0xa084, 0x00ff, 0x802f, 0x78a8, 0xa084, 0x00ff, 0xa52d, 0x78a8,
++	0xa084, 0x00ff, 0x8037, 0x78a8, 0xa084, 0x00ff, 0xa635, 0x7cd8,
++	0x2600, 0xa420, 0x7bdc, 0x2500, 0xa319, 0x0048, 0x3305, 0x7cda,
++	0x7bde, 0x6caa, 0x7cd2, 0x6ba6, 0x7bd6, 0x1078, 0x3792, 0x1078,
++	0x398f, 0x781b, 0x0065, 0x0078, 0x212b, 0xa006, 0x1078, 0x3a5e,
++	0x781b, 0x0065, 0x0078, 0x212b, 0x78d0, 0x79d4, 0x1078, 0x39d5,
++	0x0078, 0x212b, 0xa282, 0x0003, 0x00c0, 0x3305, 0x7da8, 0xa5ac,
++	0x00ff, 0x7ea8, 0xa6b4, 0x00ff, 0x6920, 0xa18d, 0x0080, 0x6922,
++	0xa184, 0x0100, 0x0040, 0x3122, 0xa18c, 0xfeff, 0x6922, 0xa6b4,
++	0x00ff, 0x0040, 0x310c, 0xa682, 0x000c, 0x0048, 0x30e3, 0x0040,
++	0x30e3, 0x2031, 0x000c, 0x852b, 0x852b, 0x1078, 0x33be, 0x0040,
++	0x30ed, 0x1078, 0x31da, 0x0078, 0x3115, 0x1078, 0x3379, 0x0c7e,
++	0x2960, 0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x31fe, 0x0c7f,
++	0x6920, 0xa18d, 0x0100, 0x6922, 0x7e58, 0xa6b5, 0x0004, 0x7e5a,
++	0xa684, 0x0400, 0x00c0, 0x3108, 0x781b, 0x0053, 0x0078, 0x212b,
++	0x781b, 0x0067, 0x0078, 0x212b, 0x0c7e, 0x2960, 0x6004, 0xa084,
++	0xfff5, 0x6006, 0x1078, 0x31fe, 0x0c7f, 0x7e58, 0xa684, 0x0400,
++	0x00c0, 0x311e, 0x781b, 0x0056, 0x0078, 0x212b, 0x781b, 0x0068,
++	0x0078, 0x212b, 0x0c7e, 0x7048, 0x2060, 0x6100, 0xa18c, 0x1000,
++	0x0040, 0x3162, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000c,
++	0x0048, 0x3136, 0x0040, 0x3136, 0x2011, 0x000c, 0x2600, 0xa202,
++	0x00c8, 0x313b, 0x2230, 0x6208, 0xa294, 0x00ff, 0x7018, 0xa086,
++	0x0028, 0x00c0, 0x314b, 0xa282, 0x0019, 0x00c8, 0x3151, 0x2011,
++	0x0019, 0x0078, 0x3151, 0xa282, 0x000c, 0x00c8, 0x3151, 0x2011,
++	0x000c, 0x2200, 0xa502, 0x00c8, 0x3156, 0x2228, 0x1078, 0x337d,
++	0x852b, 0x852b, 0x1078, 0x33be, 0x0040, 0x3162, 0x1078, 0x31da,
++	0x0078, 0x3166, 0x1078, 0x3379, 0x1078, 0x31fe, 0x7858, 0xa085,
++	0x0004, 0x785a, 0x0c7f, 0x781b, 0x0067, 0x0078, 0x212b, 0x0c7e,
++	0x2960, 0x6000, 0xa084, 0x1000, 0x00c0, 0x3187, 0x6010, 0xa084,
++	0x000f, 0x00c0, 0x3181, 0x6104, 0xa18c, 0xfff5, 0x6106, 0x0c7f,
++	0x007c, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078, 0x31ae, 0x68a0,
++	0xa084, 0x0200, 0x00c0, 0x3181, 0x6208, 0xa294, 0x00ff, 0x7018,
++	0xa086, 0x0028, 0x00c0, 0x319c, 0xa282, 0x0019, 0x00c8, 0x31a2,
++	0x2011, 0x0019, 0x0078, 0x31a2, 0xa282, 0x000c, 0x00c8, 0x31a2,
++	0x2011, 0x000c, 0x6308, 0x831f, 0xa39c, 0x00ff, 0xa382, 0x000c,
++	0x0048, 0x31ae, 0x0040, 0x31ae, 0x2019, 0x000c, 0x78ab, 0x0001,
++	0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005,
++	0x6820, 0xa085, 0x0100, 0x6822, 0x0c7f, 0x007c, 0x0c7e, 0x2960,
++	0x6104, 0xa18c, 0xfff5, 0x6106, 0x2011, 0x0032, 0x2019, 0x0000,
++	0x0078, 0x31ca, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001,
++	0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xa085, 0x0100, 0x6822,
++	0x0c7f, 0x007c, 0x0c7e, 0x7148, 0x2160, 0x2008, 0xa084, 0xfff0,
++	0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae, 0x6612, 0x78a4, 0xa084,
++	0xfff8, 0xa18c, 0x0007, 0xa105, 0x78a6, 0x6016, 0x788a, 0xa6b4,
++	0x000f, 0x8637, 0x8204, 0x8004, 0xa084, 0x00ff, 0xa605, 0x600e,
++	0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x007c, 0x0c7e, 0x7048,
++	0x2060, 0x6018, 0x789a, 0x78a4, 0xa084, 0xfff0, 0x78a6, 0x6012,
++	0x7884, 0xa084, 0xfff0, 0x7886, 0x0c7f, 0x007c, 0xa282, 0x0002,
++	0x00c0, 0x3305, 0x7aa8, 0x6920, 0xa18d, 0x0080, 0x6922, 0xa184,
++	0x0200, 0x0040, 0x3253, 0xa18c, 0xfdff, 0x6922, 0xa294, 0x00ff,
++	0xa282, 0x0002, 0x00c8, 0x3305, 0x1078, 0x329a, 0x1078, 0x31fe,
++	0xa980, 0x0001, 0x200c, 0x1078, 0x3445, 0x1078, 0x316f, 0x88ff,
++	0x0040, 0x3246, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5,
++	0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x3242, 0x781b, 0x0053,
++	0x0078, 0x212b, 0x781b, 0x0067, 0x0078, 0x212b, 0x7e58, 0xa684,
++	0x0400, 0x00c0, 0x324f, 0x781b, 0x0056, 0x0078, 0x212b, 0x781b,
++	0x0068, 0x0078, 0x212b, 0xa282, 0x0002, 0x00c8, 0x325b, 0xa284,
++	0x0001, 0x0040, 0x3265, 0x7148, 0xa188, 0x0000, 0x210c, 0xa18c,
++	0x2000, 0x00c0, 0x3265, 0x2011, 0x0000, 0x1078, 0x336b, 0x1078,
++	0x329a, 0x1078, 0x31fe, 0x7858, 0xa085, 0x0004, 0x785a, 0x781b,
++	0x0067, 0x0078, 0x212b, 0x0c7e, 0x027e, 0x2960, 0x6000, 0x2011,
++	0x0001, 0xa084, 0x2000, 0x00c0, 0x328a, 0x6014, 0xa084, 0x0040,
++	0x00c0, 0x3288, 0xa18c, 0xffef, 0x6106, 0xa006, 0x0078, 0x3297,
++	0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003,
++	0x7aaa, 0xa8c0, 0x0004, 0x6820, 0xa085, 0x0200, 0x6822, 0x027f,
++	0x0c7f, 0x007c, 0x0c7e, 0x7048, 0x2060, 0x82ff, 0x0040, 0x32a2,
++	0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a, 0x78a4, 0xa084,
++	0xffbf, 0xa205, 0x78a6, 0x6016, 0x788a, 0x6004, 0xa084, 0xffef,
++	0x6006, 0x0c7f, 0x007c, 0x007e, 0x7000, 0xa086, 0x0003, 0x0040,
++	0x32bc, 0x007f, 0x0078, 0x32bf, 0x007f, 0x0078, 0x3301, 0xa684,
++	0x0020, 0x0040, 0x3301, 0x7888, 0xa084, 0x0040, 0x0040, 0x3301,
++	0x7bb8, 0xa384, 0x003f, 0x831b, 0x00c8, 0x32cf, 0x8000, 0xa005,
++	0x0040, 0x32e5, 0x831b, 0x00c8, 0x32d8, 0x8001, 0x0040, 0x32fd,
++	0xa684, 0x4000, 0x0040, 0x32e5, 0x78b8, 0x801b, 0x00c8, 0x32e1,
++	0x8000, 0xa084, 0x003f, 0x00c0, 0x32fd, 0xa6b4, 0xbfff, 0x7e5a,
++	0x79d8, 0x7adc, 0x2001, 0x0001, 0xa108, 0x00c8, 0x32f1, 0xa291,
++	0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x1078, 0x3a5e, 0x781b,
++	0x0065, 0x1078, 0x392f, 0x0078, 0x212b, 0x781b, 0x0065, 0x0078,
++	0x212b, 0x781b, 0x0068, 0x0078, 0x212b, 0x1078, 0x3337, 0x781b,
++	0x0067, 0x0078, 0x212b, 0x1078, 0x3323, 0x781b, 0x0067, 0x0078,
++	0x212b, 0x6827, 0x0002, 0x1078, 0x332b, 0x78e4, 0xa084, 0x0030,
++	0x0040, 0x2133, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2133, 0x781b,
++	0x0067, 0x0078, 0x212b, 0x2001, 0x0005, 0x0078, 0x3339, 0x2001,
++	0x000c, 0x0078, 0x3339, 0x2001, 0x0006, 0x0078, 0x3339, 0x2001,
++	0x000d, 0x0078, 0x3339, 0x2001, 0x0009, 0x0078, 0x3339, 0x2001,
++	0x0007, 0x789b, 0x007e, 0x78aa, 0xa6b5, 0x0008, 0x7e5a, 0x007c,
++	0x077e, 0x873f, 0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0xa0e0,
++	0x3f80, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184, 0x000f, 0x0040,
++	0x3359, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004, 0xa085, 0x0008,
++	0x6006, 0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040, 0x0040,
++	0x3369, 0xa184, 0xffbf, 0x78a6, 0x6016, 0x6004, 0xa085, 0x0010,
++	0x6006, 0x077f, 0x007c, 0x789b, 0x0010, 0x78ab, 0x0001, 0x78ab,
++	0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab, 0x0004,
++	0x007c, 0x2031, 0x0000, 0x2029, 0x0032, 0x789b, 0x0010, 0x78ab,
++	0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7eaa, 0x789b,
++	0x0060, 0x78ab, 0x0005, 0x007c, 0x157e, 0x8007, 0xa084, 0x00ff,
++	0x8003, 0x8003, 0xa080, 0x0020, 0x789a, 0x79a4, 0xa18c, 0xfff0,
++	0x2001, 0x3d46, 0x2004, 0xa082, 0x0028, 0x0040, 0x33a7, 0x2021,
++	0x342c, 0x2019, 0x0014, 0x20a9, 0x000c, 0x0078, 0x33ad, 0x2021,
++	0x3438, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011, 0x0064, 0x2404,
++	0xa084, 0xfff0, 0xa106, 0x0040, 0x33bc, 0x8420, 0x2300, 0xa210,
++	0x0070, 0x33bc, 0x0078, 0x33af, 0x157f, 0x007c, 0x157e, 0x2011,
++	0x3d46, 0x2214, 0xa282, 0x0032, 0x0048, 0x33d2, 0x0040, 0x33d6,
++	0x2021, 0x341e, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011, 0x0032,
++	0x0078, 0x33e8, 0xa282, 0x0028, 0x0040, 0x33e0, 0x2021, 0x342c,
++	0x2019, 0x0014, 0x20a9, 0x000c, 0x2011, 0x0064, 0x0078, 0x33e8,
++	0x2021, 0x3438, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011, 0x0064,
++	0x2200, 0xa502, 0x0040, 0x33f8, 0x0048, 0x33f8, 0x8420, 0x2300,
++	0xa210, 0x0070, 0x33f5, 0x0078, 0x33e8, 0x157f, 0xa006, 0x007c,
++	0x157f, 0xa582, 0x0064, 0x00c8, 0x3403, 0x7808, 0xa085, 0x0070,
++	0x780a, 0x0078, 0x3403, 0x78ec, 0xa084, 0x0300, 0x0040, 0x340b,
++	0x2404, 0x0078, 0x341c, 0x2404, 0xa09e, 0x1102, 0x00c0, 0x341c,
++	0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x0048, 0x341b, 0x2001,
++	0x1201, 0x0078, 0x341c, 0x2404, 0xa005, 0x007c, 0x1102, 0x3002,
++	0x3202, 0x4203, 0x4403, 0x5404, 0x5604, 0x6605, 0x6805, 0x7806,
++	0x7a06, 0x0c07, 0x0c07, 0x0e07, 0x3202, 0x4202, 0x5202, 0x6202,
++	0x7202, 0x6605, 0x7605, 0x7805, 0x7a05, 0x7c05, 0x7e05, 0x7f05,
++	0x2202, 0x3202, 0x4202, 0x5202, 0x5404, 0x6404, 0x7404, 0x7604,
++	0x7804, 0x7a04, 0x7c04, 0x7e04, 0x7f04, 0x789b, 0x0010, 0xa046,
++	0x007c, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003,
++	0x8003, 0x8003, 0xa105, 0xa0e0, 0x4000, 0x007c, 0x79d8, 0x7adc,
++	0x78d0, 0x801b, 0x00c8, 0x345d, 0x8000, 0xa084, 0x003f, 0xa108,
++	0xa291, 0x0000, 0x007c, 0x0f7e, 0x2079, 0x0100, 0x2009, 0x3d40,
++	0x2091, 0x8000, 0x2104, 0x0079, 0x346d, 0x34a3, 0x3477, 0x3477,
++	0x3477, 0x3477, 0x3477, 0x3477, 0x3475, 0x1078, 0x20c8, 0x784b,
++	0x0004, 0x7848, 0xa084, 0x0004, 0x00c0, 0x3479, 0x784b, 0x0008,
++	0x7848, 0xa084, 0x0008, 0x00c0, 0x3480, 0x68b4, 0xa085, 0x4000,
++	0x68b6, 0x7858, 0xa085, 0x4000, 0x785a, 0x7830, 0xa084, 0x0080,
++	0x00c0, 0x34a3, 0x0018, 0x34a3, 0x681c, 0xa084, 0x0020, 0x00c0,
++	0x34a1, 0x0e7e, 0x2071, 0x3d40, 0x1078, 0x34ea, 0x0e7f, 0x0078,
++	0x34a3, 0x781b, 0x00e4, 0x2091, 0x8001, 0x0f7f, 0x007c, 0x0c7e,
++	0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e0,
++	0x3f80, 0x6004, 0xa084, 0x000a, 0x00c0, 0x34d8, 0x6108, 0xa194,
++	0xff00, 0x0040, 0x34d8, 0xa18c, 0x00ff, 0x2001, 0x0019, 0xa106,
++	0x0040, 0x34c9, 0x2001, 0x0032, 0xa106, 0x0040, 0x34cd, 0x0078,
++	0x34d1, 0x2009, 0x0020, 0x0078, 0x34d3, 0x2009, 0x003f, 0x0078,
++	0x34d3, 0x2011, 0x0000, 0x2100, 0xa205, 0x600a, 0x6004, 0x6006,
++	0x0c7f, 0x007c, 0x781b, 0x0068, 0x0078, 0x212b, 0x781b, 0x0067,
++	0x0078, 0x212b, 0x781b, 0x0056, 0x0078, 0x212b, 0x781b, 0x0053,
++	0x0078, 0x212b, 0x2009, 0x3d1e, 0x210c, 0xa186, 0x0000, 0x0040,
++	0x34fe, 0xa186, 0x0001, 0x0040, 0x3501, 0x2009, 0x3d35, 0x200b,
++	0x000b, 0x70a3, 0x0001, 0x781b, 0x0047, 0x007c, 0x781b, 0x00dd,
++	0x007c, 0x2009, 0x3d35, 0x200b, 0x000a, 0x007c, 0x2009, 0x3d1e,
++	0x210c, 0xa186, 0x0000, 0x0040, 0x3521, 0xa186, 0x0001, 0x0040,
++	0x351b, 0x2009, 0x3d35, 0x200b, 0x000b, 0x70a3, 0x0001, 0x781b,
++	0x0047, 0x0078, 0x212b, 0x2009, 0x3d35, 0x200b, 0x000a, 0x0078,
++	0x212b, 0x781b, 0x00dc, 0x0078, 0x212b, 0x781b, 0x00e4, 0x0078,
++	0x212b, 0x781b, 0x00e3, 0x0078, 0x212b, 0x781b, 0x009f, 0x0078,
++	0x212b, 0x781b, 0x009e, 0x0078, 0x212b, 0x6818, 0xa084, 0x8000,
++	0x0040, 0x353c, 0x681b, 0x001d, 0x70a3, 0x0001, 0x781b, 0x0047,
++	0x0078, 0x212b, 0x007e, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x3559,
++	0x7808, 0xa084, 0xfffd, 0x780a, 0x0005, 0x0005, 0x0005, 0x0005,
++	0x78ec, 0xa084, 0x0021, 0x0040, 0x3559, 0x7808, 0xa085, 0x0002,
++	0x780a, 0x007f, 0x007c, 0x7808, 0xa085, 0x0002, 0x780a, 0x007c,
++	0x007e, 0x7830, 0xa084, 0x0040, 0x00c0, 0x3561, 0x0098, 0x356c,
++	0x007f, 0x789a, 0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a,
++	0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040,
++	0x357b, 0x0098, 0x3579, 0x007f, 0x789a, 0x78ac, 0x007e, 0x7808,
++	0xa085, 0x0002, 0x780a, 0x007f, 0x007c, 0xa784, 0x0001, 0x00c0,
++	0x2b9b, 0xa784, 0x0070, 0x0040, 0x3595, 0x0c7e, 0x2d60, 0x2f68,
++	0x1078, 0x2073, 0x2d78, 0x2c68, 0x0c7f, 0xa784, 0x0008, 0x0040,
++	0x35a2, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2133,
++	0x0078, 0x34da, 0xa784, 0x0004, 0x0040, 0x35d5, 0x78b8, 0xa084,
++	0x4001, 0x0040, 0x35d5, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003,
++	0x0040, 0x2133, 0x78e4, 0xa084, 0x0007, 0xa086, 0x0001, 0x00c0,
++	0x35d5, 0x78c0, 0xa685, 0x4800, 0x2030, 0x7e5a, 0x781b, 0x00e4,
++	0x0078, 0x212b, 0x784b, 0x0008, 0x6818, 0xa084, 0x8000, 0x0040,
++	0x35d1, 0x681b, 0x0015, 0xa684, 0x4000, 0x0040, 0x35d1, 0x681b,
++	0x0007, 0x1078, 0x34ea, 0x0078, 0x212b, 0x681b, 0x0003, 0x7858,
++	0xa084, 0x3f00, 0x681e, 0x682f, 0x0000, 0x6833, 0x0000, 0x784b,
++	0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x25fa, 0x0018, 0x212b,
++	0x0078, 0x330b, 0x6b14, 0x8307, 0xa084, 0x000f, 0x8003, 0x8003,
++	0x8003, 0xa080, 0x3f80, 0x2060, 0x2048, 0x704a, 0x6000, 0x704e,
++	0x6004, 0x7052, 0x2a60, 0x007c, 0x0020, 0x0020, 0x0000, 0x0020,
++	0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++	0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++	0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++	0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0062, 0x000a,
++	0x0014, 0x0014, 0x9848, 0x0014, 0x0014, 0x98f8, 0x98e7, 0x0014,
++	0x0014, 0x0014, 0x0080, 0x00bf, 0x0100, 0x0402, 0x2008, 0xf880,
++	0x0018, 0xa20a, 0x0014, 0x300b, 0xa20c, 0x0014, 0xa200, 0x8838,
++	0x3806, 0x8839, 0x28c2, 0x9cc0, 0xa805, 0x0864, 0xa83f, 0x3008,
++	0x28c1, 0x9cc0, 0xa201, 0x300c, 0x2847, 0x8161, 0x846a, 0x8000,
++	0x84a4, 0x1856, 0x883a, 0xa808, 0x28e2, 0x9ca1, 0xa8f3, 0x0864,
++	0xa82d, 0x300c, 0xa801, 0x3008, 0x28e1, 0x9ca1, 0x280e, 0xa204,
++	0x64c0, 0x6de0, 0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7023, 0x8576,
++	0x8677, 0xa810, 0x7861, 0x883e, 0xa80d, 0x282c, 0xa205, 0x64a0,
++	0x6de0, 0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7023, 0x8576, 0x8677,
++	0xa801, 0x883e, 0x206b, 0x28c1, 0x9cc0, 0x2044, 0x2103, 0x20a2,
++	0x2081, 0xa8da, 0xa207, 0x2901, 0xa80a, 0x0014, 0xa203, 0x8000,
++	0x85a4, 0x1872, 0x879a, 0x883c, 0x1fe2, 0xf601, 0xa208, 0x856e,
++	0x866f, 0x0704, 0x3008, 0x9ca1, 0x0014, 0xa202, 0x8000, 0x85a4,
++	0x3009, 0x84a8, 0x19e2, 0xf844, 0x856e, 0x883f, 0x08e6, 0xa8f5,
++	0xf861, 0xa8ec, 0xf801, 0x0014, 0xf881, 0x0016, 0x85b2, 0x80f0,
++	0x9532, 0xfaa2, 0x1de2, 0x0014, 0x8532, 0xf221, 0x0014, 0x1de2,
++	0x84a8, 0xd6e0, 0x1fe6, 0x0014, 0xa206, 0x6865, 0x817e, 0x842a,
++	0x1dc1, 0x8823, 0x0016, 0x6042, 0x8008, 0xa8fa, 0x8000, 0x84a4,
++	0x8160, 0x842a, 0xf021, 0x3008, 0x84a8, 0x11d6, 0x7042, 0x20dd,
++	0x0011, 0x20d4, 0x8822, 0x0016, 0x8000, 0x2848, 0x1011, 0xa8fc,
++	0x3008, 0x8000, 0xa000, 0x2802, 0x1011, 0xa8fd, 0xa885, 0x3008,
++	0x283d, 0x1011, 0xa8fd, 0xa209, 0x0017, 0x300c, 0x8000, 0x85a4,
++	0x1de2, 0xdac1, 0x0014, 0x0210, 0xa801, 0x0014, 0x26e0, 0x873a,
++	0xfaa2, 0x19f2, 0x1fe2, 0x0014, 0xa20b, 0x0014, 0xa20d, 0x3806,
++	0x0210, 0x9cca, 0x0704, 0x0000, 0x127e, 0x2091, 0x2200, 0x2049,
++	0x36ec, 0x7000, 0x7204, 0xa205, 0x720c, 0xa215, 0x7008, 0xa084,
++	0xfff7, 0xa205, 0x0040, 0x36fe, 0x0078, 0x3701, 0x127f, 0x2000,
++	0x007c, 0x7000, 0xa084, 0x0001, 0x00c0, 0x372f, 0x7108, 0x8103,
++	0x00c8, 0x370e, 0x1078, 0x381c, 0x0078, 0x3706, 0x700c, 0xa08c,
++	0x00ff, 0x0040, 0x372f, 0x7004, 0x8004, 0x00c8, 0x3726, 0x7014,
++	0xa005, 0x00c0, 0x3722, 0x7010, 0xa005, 0x0040, 0x3726, 0xa102,
++	0x00c8, 0x3706, 0x7007, 0x0010, 0x0078, 0x372f, 0x8aff, 0x0040,
++	0x372f, 0x1078, 0x3a35, 0x00c0, 0x3729, 0x0040, 0x3706, 0x1078,
++	0x37ac, 0x7003, 0x0000, 0x127f, 0x2000, 0x007c, 0x6428, 0x84ff,
++	0x0040, 0x3762, 0x2c70, 0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x3772,
++	0x273c, 0x87fb, 0x00c0, 0x3750, 0x0048, 0x3748, 0x1078, 0x20c8,
++	0x609c, 0xa075, 0x0040, 0x3762, 0x0078, 0x373b, 0x2039, 0x3767,
++	0x2704, 0xae68, 0x6808, 0xa630, 0x680c, 0xa529, 0x8421, 0x0040,
++	0x3762, 0x8738, 0x2704, 0xa005, 0x00c0, 0x3751, 0x709c, 0xa075,
++	0x00c0, 0x373b, 0x007c, 0x0000, 0x0005, 0x0009, 0x000d, 0x0011,
++	0x0015, 0x0019, 0x001d, 0x0000, 0x0003, 0x0009, 0x000f, 0x0015,
++	0x001b, 0x0000, 0x0000, 0x3767, 0x3764, 0x0000, 0x0000, 0x8000,
++	0x0000, 0x3767, 0x0000, 0x376f, 0x376c, 0x0000, 0x0000, 0x0000,
++	0x0000, 0x376f, 0x0000, 0x376a, 0x376a, 0x0000, 0x0000, 0x8000,
++	0x0000, 0x376a, 0x0000, 0x3770, 0x3770, 0x0000, 0x0000, 0x0000,
++	0x0000, 0x3770, 0x127e, 0x2091, 0x2200, 0x2079, 0x3d00, 0x2071,
++	0x0010, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2071,
++	0x0020, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2049,
++	0x0000, 0x127f, 0x2000, 0x007c, 0x2049, 0x37ac, 0x2019, 0x0000,
++	0x7004, 0x8004, 0x00c8, 0x37f8, 0x7007, 0x0012, 0x7108, 0x7008,
++	0xa106, 0x00c0, 0x37b6, 0xa184, 0x01e0, 0x0040, 0x37c1, 0x1078,
++	0x20c8, 0xa184, 0x4000, 0x00c0, 0x37b6, 0xa19c, 0x300c, 0xa386,
++	0x2004, 0x0040, 0x37d3, 0xa386, 0x0008, 0x0040, 0x37de, 0xa386,
++	0x200c, 0x00c0, 0x37b6, 0x7200, 0x8204, 0x0048, 0x37de, 0x730c,
++	0xa384, 0x00ff, 0x0040, 0x37de, 0x1078, 0x20c8, 0x7007, 0x0012,
++	0x7000, 0xa084, 0x0001, 0x00c0, 0x37f8, 0x7008, 0xa084, 0x01e0,
++	0x00c0, 0x37f8, 0x7310, 0x7014, 0xa305, 0x0040, 0x37f8, 0x710c,
++	0xa184, 0x0300, 0x00c0, 0x37f8, 0xa184, 0x00ff, 0x00c0, 0x37ac,
++	0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xa084, 0x0008, 0x00c0,
++	0x37fc, 0x7007, 0x0012, 0x7108, 0x8103, 0x0048, 0x3801, 0x7003,
++	0x0000, 0x2049, 0x0000, 0x007c, 0x107e, 0x007e, 0x127e, 0x157e,
++	0x2091, 0x2200, 0x7108, 0x1078, 0x381c, 0x157f, 0x127f, 0x2091,
++	0x8001, 0x007f, 0x107f, 0x007c, 0x7204, 0x7500, 0x730c, 0xa384,
++	0x0300, 0x00c0, 0x385e, 0xa184, 0x01e0, 0x00c0, 0x3882, 0x7108,
++	0xa184, 0x01e0, 0x00c0, 0x3882, 0x2001, 0x04fd, 0x2004, 0xa082,
++	0x0005, 0x00c8, 0x3852, 0xa184, 0x4000, 0x00c0, 0x3827, 0xa986,
++	0x3a5e, 0x00c0, 0x3852, 0xa19c, 0x300c, 0xa386, 0x2004, 0x0040,
++	0x3849, 0xa386, 0x0008, 0x0040, 0x3852, 0xa386, 0x200c, 0x00c0,
++	0x3827, 0x7200, 0x8204, 0x0048, 0x3852, 0x730c, 0xa384, 0x00ff,
++	0x00c0, 0x385e, 0xa184, 0x0007, 0x0079, 0x3856, 0x3860, 0x3872,
++	0x385e, 0x3872, 0x385e, 0x38be, 0x385e, 0x38bc, 0x1078, 0x20c8,
++	0x7004, 0xa084, 0x0010, 0xa085, 0x0002, 0x7006, 0x8aff, 0x00c0,
++	0x386d, 0x2049, 0x0000, 0x0078, 0x3871, 0x1078, 0x3a35, 0x00c0,
++	0x386d, 0x007c, 0x7004, 0xa084, 0x0010, 0xa085, 0x0002, 0x7006,
++	0x8aff, 0x00c0, 0x387d, 0x0078, 0x3881, 0x1078, 0x3a35, 0x00c0,
++	0x387d, 0x007c, 0x7007, 0x0012, 0x7108, 0x00e0, 0x3885, 0x2091,
++	0x6000, 0x00e0, 0x3889, 0x2091, 0x6000, 0x7007, 0x0012, 0x7007,
++	0x0008, 0x7004, 0xa084, 0x0008, 0x00c0, 0x3891, 0x7007, 0x0012,
++	0x7108, 0x8103, 0x0048, 0x3896, 0x7003, 0x0000, 0x7000, 0xa005,
++	0x00c0, 0x38aa, 0x7004, 0xa005, 0x00c0, 0x38aa, 0x700c, 0xa005,
++	0x0040, 0x38ac, 0x0078, 0x388d, 0x2049, 0x0000, 0x1078, 0x3463,
++	0x6818, 0xa084, 0x8000, 0x0040, 0x38b7, 0x681b, 0x0002, 0x007c,
++	0x1078, 0x20c8, 0x1078, 0x20c8, 0x1078, 0x391a, 0x7210, 0x7114,
++	0x700c, 0xa09c, 0x00ff, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000,
++	0x1078, 0x391a, 0x2704, 0x2c58, 0xac60, 0x6308, 0x2200, 0xa322,
++	0x630c, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0040, 0x38e1, 0x00c8,
++	0x38e1, 0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078,
++	0x38c8, 0x2b60, 0x8a07, 0x007e, 0x6004, 0xa084, 0x0008, 0x0040,
++	0x38ed, 0xa7ba, 0x376c, 0x0078, 0x38ef, 0xa7ba, 0x3764, 0x007f,
++	0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92, 0x6b8e, 0x7007, 0x0012,
++	0x1078, 0x37ac, 0x007c, 0x8738, 0x2704, 0xa005, 0x00c0, 0x390e,
++	0x609c, 0xa005, 0x0040, 0x3917, 0x2060, 0x6004, 0xa084, 0x000f,
++	0xa080, 0x3772, 0x203c, 0x87fb, 0x1040, 0x20c8, 0x8a51, 0x0040,
++	0x3916, 0x7008, 0xa084, 0x0003, 0xa086, 0x0003, 0x007c, 0x2051,
++	0x0000, 0x007c, 0x8a50, 0x8739, 0x2704, 0xa004, 0x00c0, 0x392e,
++	0x6000, 0xa064, 0x00c0, 0x3925, 0x2d60, 0x6004, 0xa084, 0x000f,
++	0xa080, 0x3782, 0x203c, 0x87fb, 0x1040, 0x20c8, 0x007c, 0x127e,
++	0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x6884, 0x2060, 0x6888, 0x6b8c,
++	0x6c90, 0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0x007e, 0x6804,
++	0xa084, 0x0008, 0x007f, 0x0040, 0x3949, 0xa0b8, 0x376c, 0x0078,
++	0x394b, 0xa0b8, 0x3764, 0x7e08, 0xa6b5, 0x000c, 0x681c, 0xa084,
++	0x0040, 0x0040, 0x3955, 0xa6b5, 0x0001, 0x7007, 0x0004, 0x7004,
++	0xa084, 0x0004, 0x00c0, 0x3957, 0x2400, 0xa305, 0x00c0, 0x3962,
++	0x0078, 0x3988, 0x2c58, 0x2704, 0x6104, 0xac60, 0x6000, 0xa400,
++	0x701a, 0x6004, 0xa301, 0x701e, 0xa184, 0x0008, 0x0040, 0x3978,
++	0x6010, 0xa081, 0x0000, 0x7022, 0x6014, 0xa081, 0x0000, 0x7026,
++	0x6208, 0x2400, 0xa202, 0x7012, 0x620c, 0x2300, 0xa203, 0x7016,
++	0x7602, 0x7007, 0x0001, 0x2b60, 0x1078, 0x38fb, 0x0078, 0x398a,
++	0x1078, 0x3a35, 0x00c0, 0x3988, 0x127f, 0x2000, 0x007c, 0x127e,
++	0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x7007, 0x0004, 0x7004, 0xa084,
++	0x0004, 0x00c0, 0x3996, 0x7003, 0x0008, 0x127f, 0x2000, 0x007c,
++	0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x2049, 0x39a0, 0x7007,
++	0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x39a9, 0x7e08, 0xa6b5,
++	0x000c, 0x681c, 0xa084, 0x0020, 0x00c0, 0x39b8, 0xa6b5, 0x0001,
++	0x6828, 0x2050, 0x2d60, 0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x3772,
++	0x273c, 0x87fb, 0x00c0, 0x39ce, 0x0048, 0x39c8, 0x1078, 0x20c8,
++	0x689c, 0xa065, 0x0040, 0x39d2, 0x0078, 0x39bb, 0x1078, 0x3a35,
++	0x00c0, 0x39ce, 0x127f, 0x2000, 0x007c, 0x127e, 0x007e, 0x017e,
++	0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x037f, 0x047f, 0x7e08, 0xa6b5,
++	0x000c, 0x681c, 0xa084, 0x0040, 0x0040, 0x39e8, 0xa6b5, 0x0001,
++	0x2049, 0x39d5, 0x6828, 0xa055, 0x0040, 0x3a32, 0x2d70, 0x2e60,
++	0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x3772, 0x273c, 0x87fb, 0x00c0,
++	0x3a04, 0x0048, 0x39fd, 0x1078, 0x20c8, 0x709c, 0xa075, 0x2060,
++	0x0040, 0x3a32, 0x0078, 0x39f0, 0x2704, 0xae68, 0x6808, 0xa422,
++	0x680c, 0xa31b, 0x0048, 0x3a1f, 0x8a51, 0x00c0, 0x3a11, 0x1078,
++	0x20c8, 0x8738, 0x2704, 0xa005, 0x00c0, 0x3a05, 0x709c, 0xa075,
++	0x2060, 0x0040, 0x3a32, 0x2039, 0x3764, 0x0078, 0x39f0, 0x8422,
++	0x8420, 0x831a, 0xa399, 0x0000, 0x6908, 0x2400, 0xa122, 0x690c,
++	0x2300, 0xa11b, 0x00c8, 0x3a2e, 0x1078, 0x20c8, 0x2071, 0x0020,
++	0x0078, 0x3955, 0x127f, 0x2000, 0x007c, 0x7008, 0xa084, 0x0003,
++	0xa086, 0x0003, 0x0040, 0x3a5d, 0x2704, 0xac08, 0x2104, 0x701a,
++	0x8108, 0x2104, 0x701e, 0x8108, 0x2104, 0x7012, 0x8108, 0x2104,
++	0x7016, 0x6004, 0xa084, 0x0008, 0x0040, 0x3a54, 0x8108, 0x2104,
++	0x7022, 0x8108, 0x2104, 0x7026, 0x7602, 0x7004, 0xa084, 0x0010,
++	0xa085, 0x0001, 0x7006, 0x1078, 0x38fb, 0x007c, 0x127e, 0x007e,
++	0x0d7e, 0x2091, 0x2200, 0x2049, 0x3a5e, 0x0d7f, 0x087f, 0x7108,
++	0xa184, 0x0003, 0x00c0, 0x3a72, 0x6828, 0xa005, 0x0040, 0x3a80,
++	0x0078, 0x3701, 0x00a0, 0x3a79, 0x7108, 0x1078, 0x381c, 0x0078,
++	0x3a67, 0x7007, 0x0010, 0x00a0, 0x3a7b, 0x7108, 0x1078, 0x381c,
++	0x7008, 0xa086, 0x0008, 0x00c0, 0x3a67, 0x7000, 0xa005, 0x00c0,
++	0x3a67, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000, 0x007c,
++	0x127e, 0x147e, 0x137e, 0x157e, 0x0c7e, 0x0d7e, 0x2091, 0x2200,
++	0x0d7f, 0x2049, 0x3a90, 0xad80, 0x0011, 0x20a0, 0x2099, 0x0031,
++	0x700c, 0xa084, 0x00ff, 0x682a, 0x7007, 0x0008, 0x7007, 0x0002,
++	0x7003, 0x0001, 0x0040, 0x3aaf, 0x8000, 0x80ac, 0x53a5, 0x7007,
++	0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x3ab1, 0x0c7f, 0x2049,
++	0x0000, 0x7003, 0x0000, 0x157f, 0x137f, 0x147f, 0x127f, 0x2000,
++	0x007c, 0x2091, 0x6000, 0x2091, 0x8000, 0x78c0, 0xa005, 0x00c0,
++	0x3ad8, 0x798c, 0x70d0, 0xa106, 0x00c0, 0x3ad8, 0x7804, 0xa005,
++	0x0040, 0x3ad8, 0x7807, 0x0000, 0x0068, 0x3ad8, 0x2091, 0x4080,
++	0x7820, 0x8001, 0x7822, 0x00c0, 0x3b5d, 0x7824, 0x7822, 0x783c,
++	0xa005, 0x0040, 0x3ae9, 0x8001, 0x783e, 0x00c0, 0x3ae9, 0x1078,
++	0x3c87, 0x78ec, 0xa005, 0x0040, 0x3b0d, 0x78d4, 0xa005, 0x00c0,
++	0x3b0d, 0x3a10, 0xa284, 0x0002, 0x00c0, 0x3afd, 0x78d7, 0x0007,
++	0x2009, 0xff01, 0x200a, 0x0078, 0x3b0d, 0xa284, 0x0001, 0x00c0,
++	0x3b05, 0x78eb, 0x0000, 0x0078, 0x3b0d, 0x78e8, 0xa005, 0x00c0,
++	0x3b0d, 0x78d7, 0x0008, 0x78eb, 0x0001, 0x2069, 0x3d40, 0x6800,
++	0xa084, 0x0007, 0x0040, 0x3b24, 0xa086, 0x0002, 0x0040, 0x3b24,
++	0x6830, 0xa00d, 0x0040, 0x3b24, 0x2104, 0xa005, 0x0040, 0x3b24,
++	0x8001, 0x200a, 0x0040, 0x3bff, 0x7848, 0xa005, 0x0040, 0x3b2e,
++	0x8001, 0x784a, 0x00c0, 0x3b2e, 0x1078, 0x1f05, 0x68c4, 0xa005,
++	0x0040, 0x3b3a, 0x8001, 0x68c6, 0x00c0, 0x3b3a, 0x68a3, 0x0000,
++	0x68a7, 0x0001, 0x2061, 0x4000, 0x2009, 0x0002, 0x20a9, 0x0100,
++	0x6034, 0xa005, 0x0040, 0x3b50, 0x8001, 0x6036, 0x00c0, 0x3b50,
++	0x6010, 0xa005, 0x0040, 0x3b50, 0x017e, 0x1078, 0x1f05, 0x017f,
++	0xace0, 0x0010, 0x0070, 0x3b56, 0x0078, 0x3b40, 0x8109, 0x0040,
++	0x3b5d, 0x20a9, 0x0100, 0x0078, 0x3b40, 0x1078, 0x3b64, 0x1078,
++	0x3b89, 0x2091, 0x8001, 0x007c, 0x7834, 0x8001, 0x7836, 0x00c0,
++	0x3b88, 0x7838, 0x7836, 0x2091, 0x8000, 0x7844, 0xa005, 0x00c0,
++	0x3b73, 0x2001, 0x0101, 0x8001, 0x7846, 0xa080, 0x6000, 0x2040,
++	0x2004, 0xa065, 0x0040, 0x3b88, 0x6024, 0xa005, 0x0040, 0x3b84,
++	0x8001, 0x6026, 0x0040, 0x3bb8, 0x6000, 0x2c40, 0x0078, 0x3b79,
++	0x007c, 0x7828, 0x8001, 0x782a, 0x00c0, 0x3bb7, 0x782c, 0x782a,
++	0x7830, 0xa005, 0x00c0, 0x3b96, 0x2001, 0x0200, 0x8001, 0x7832,
++	0x8003, 0x8003, 0x8003, 0x8003, 0xa090, 0x4000, 0xa298, 0x0002,
++	0x2304, 0xa084, 0x0008, 0x0040, 0x3bb7, 0xa290, 0x0009, 0x2204,
++	0xa005, 0x0040, 0x3baf, 0x8001, 0x2012, 0x00c0, 0x3bb7, 0x2304,
++	0xa084, 0xfff7, 0xa085, 0x0080, 0x201a, 0x1078, 0x1f05, 0x007c,
++	0x2069, 0x3d40, 0x6800, 0xa005, 0x0040, 0x3bc2, 0x683c, 0xac06,
++	0x0040, 0x3bff, 0x601b, 0x0006, 0x60b4, 0xa084, 0x3f00, 0x601e,
++	0x6020, 0xa084, 0x00ff, 0xa085, 0x0060, 0x6022, 0x6000, 0x2042,
++	0x6714, 0x6fb6, 0x1078, 0x19f0, 0x6818, 0xa005, 0x0040, 0x3bda,
++	0x8001, 0x681a, 0x6808, 0xa084, 0xffef, 0x680a, 0x6810, 0x8001,
++	0x00d0, 0x3be4, 0x1078, 0x20c8, 0x6812, 0x602f, 0x0000, 0x6033,
++	0x0000, 0x2c68, 0x1078, 0x1b7f, 0x2069, 0x3d40, 0x7944, 0xa184,
++	0x0100, 0x2001, 0x0006, 0x68a2, 0x00c0, 0x3bfa, 0x69ba, 0x2001,
++	0x0004, 0x68a2, 0x1078, 0x1f00, 0x2091, 0x8001, 0x007c, 0x2009,
++	0x3d4f, 0x2164, 0x2069, 0x0100, 0x1078, 0x2073, 0x601b, 0x0006,
++	0x6858, 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085,
++	0x0048, 0x6022, 0x602f, 0x0000, 0x6033, 0x0000, 0x6830, 0xa084,
++	0x0040, 0x0040, 0x3c3b, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848,
++	0xa084, 0x0004, 0x0040, 0x3c28, 0x0070, 0x3c28, 0x0078, 0x3c1f,
++	0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0040,
++	0x3c35, 0x0070, 0x3c35, 0x0078, 0x3c2c, 0x20a9, 0x00fa, 0x0070,
++	0x3c3b, 0x0078, 0x3c37, 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b,
++	0x0047, 0x2009, 0x3d68, 0x200b, 0x0007, 0x784c, 0x784a, 0x2091,
++	0x8001, 0x007c, 0x2079, 0x3d00, 0x1078, 0x3c75, 0x1078, 0x3c59,
++	0x1078, 0x3c67, 0x7833, 0x0000, 0x7847, 0x0000, 0x784b, 0x0000,
++	0x007c, 0x2019, 0x0003, 0x2011, 0x3d46, 0x2204, 0xa086, 0x003c,
++	0x0040, 0x3c64, 0x2019, 0x0002, 0x7b2a, 0x7b2e, 0x007c, 0x2019,
++	0x0039, 0x2011, 0x3d46, 0x2204, 0xa086, 0x003c, 0x0040, 0x3c72,
++	0x2019, 0x0027, 0x7b36, 0x7b3a, 0x007c, 0x2019, 0x3971, 0x2011,
++	0x3d46, 0x2204, 0xa086, 0x003c, 0x0040, 0x3c80, 0x2019, 0x2626,
++	0x7b22, 0x7b26, 0x783f, 0x0000, 0x7843, 0x000a, 0x007c, 0x2069,
++	0x3d40, 0x6a40, 0xa285, 0x0000, 0x0040, 0x3cce, 0x6944, 0xa080,
++	0x3d80, 0x2164, 0x6304, 0x83ff, 0x00c0, 0x3ca1, 0x8211, 0x0040,
++	0x3ca4, 0x8108, 0xa11a, 0x0048, 0x3c91, 0x2009, 0x3d80, 0x0078,
++	0x3c91, 0x7940, 0x793e, 0x007c, 0x2011, 0x0002, 0x2039, 0x0000,
++	0x20a9, 0x0100, 0x1078, 0x19f0, 0x2d00, 0xa088, 0x0002, 0x2168,
++	0x682b, 0x0000, 0x682f, 0x0000, 0x2104, 0xa085, 0x0040, 0x200a,
++	0x2100, 0xa088, 0x0010, 0x0070, 0x3cbf, 0x0078, 0x3caf, 0x8211,
++	0x0040, 0x3cc6, 0x20a9, 0x0100, 0x0078, 0x3caf, 0x2009, 0x3d51,
++	0x200b, 0x3d7f, 0x2009, 0x3d50, 0x200b, 0x0000, 0x007c, 0x4de2
++};
++#else
++/************************************************************************
++ *									*
++ * 	        --- ISP1040 Initiator/Target Firmware ---               *
++ *			    32 LUN Support				*
++ *									*
++ ************************************************************************/
++/*
++ *	Firmware Version 7.65.00 (14:17 Jul 20, 1999)
++ */
++static const u_int16_t isp_1040_risc_code[] = {
++	0x0078, 0x103a, 0x0000, 0x4057, 0x0000, 0x2043, 0x4f50, 0x5952,
++	0x4947, 0x4854, 0x2031, 0x3939, 0x3520, 0x514c, 0x4f47, 0x4943,
++	0x2043, 0x4f52, 0x504f, 0x5241, 0x5449, 0x4f4e, 0x2049, 0x5350,
++	0x3130, 0x3230, 0x2049, 0x2f54, 0x2046, 0x6972, 0x6d77, 0x6172,
++	0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, 0x372e, 0x3635,
++	0x2020, 0x2043, 0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20,
++	0x3030, 0x2050, 0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020,
++	0x3031, 0x2024, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x0048,
++	0x1045, 0x0038, 0x104b, 0x0078, 0x1047, 0x0028, 0x104b, 0x20b9,
++	0x1212, 0x0078, 0x104d, 0x20b9, 0x2222, 0x20c1, 0x0008, 0x2071,
++	0x0010, 0x70c3, 0x0004, 0x20c9, 0x77ff, 0x2089, 0x1186, 0x70c7,
++	0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x0007, 0x3f00,
++	0x70d6, 0x20c1, 0x0008, 0x2019, 0x0000, 0x2009, 0xfeff, 0x2100,
++	0x200b, 0xa5a5, 0xa1ec, 0x7fff, 0x2d64, 0x206b, 0x0a0a, 0xaddc,
++	0x3fff, 0x2b54, 0x205b, 0x5050, 0x2114, 0xa286, 0xa5a5, 0x0040,
++	0x10bf, 0xa386, 0x000f, 0x0040, 0x1085, 0x2c6a, 0x2a5a, 0x20c1,
++	0x0000, 0x2019, 0x000f, 0x0078, 0x1065, 0x2c6a, 0x2a5a, 0x20c1,
++	0x0008, 0x2009, 0x7fff, 0x2148, 0x2944, 0x204b, 0x0a0a, 0xa9bc,
++	0x3fff, 0x2734, 0x203b, 0x5050, 0x2114, 0xa286, 0x0a0a, 0x0040,
++	0x10a9, 0x284a, 0x263a, 0x20c1, 0x0004, 0x2009, 0x3fff, 0x2134,
++	0x200b, 0x5050, 0x2114, 0xa286, 0x5050, 0x0040, 0x10aa, 0x0078,
++	0x118e, 0x284a, 0x263a, 0x98c0, 0xa188, 0x1000, 0x212c, 0x200b,
++	0xa5a5, 0x2114, 0xa286, 0xa5a5, 0x0040, 0x10bc, 0x250a, 0xa18a,
++	0x1000, 0x98c1, 0x0078, 0x10c1, 0x250a, 0x0078, 0x10c1, 0x2c6a,
++	0x2a5a, 0x2130, 0xa18a, 0x0040, 0x2128, 0xa1a2, 0x5100, 0x8424,
++	0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0xa192, 0x7800, 0x2009,
++	0x0000, 0x2001, 0x0031, 0x1078, 0x1cba, 0x2218, 0x2079, 0x5100,
++	0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109,
++	0x00c0, 0x10dc, 0x7ef2, 0x8528, 0x7de6, 0x7cea, 0x7bee, 0x7883,
++	0x0000, 0x2031, 0x0030, 0x78cf, 0x0101, 0x780b, 0x0002, 0x780f,
++	0x0002, 0x784f, 0x0003, 0x2069, 0x5140, 0x2001, 0x04fd, 0x2004,
++	0xa082, 0x0005, 0x0048, 0x1104, 0x0038, 0x1100, 0x0078, 0x1108,
++	0x681b, 0x003c, 0x0078, 0x110a, 0x00a8, 0x1108, 0x681b, 0x003c,
++	0x681b, 0x0028, 0x6807, 0x0007, 0x680b, 0x00fa, 0x680f, 0x0008,
++	0x6813, 0x0005, 0x6823, 0x0000, 0x6827, 0x0006, 0x6817, 0x0008,
++	0x682b, 0x0000, 0x681f, 0x0019, 0x2069, 0x5380, 0x2011, 0x0020,
++	0x2009, 0x0010, 0x680b, 0x080c, 0x680f, 0x0019, 0x6803, 0xfd00,
++	0x6807, 0x0018, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290, 0x0004,
++	0x8109, 0x00c0, 0x1122, 0x2069, 0x5400, 0x2009, 0x0002, 0x20a9,
++	0x0100, 0x6837, 0x0000, 0x680b, 0x0040, 0x7bf0, 0xa386, 0xfeff,
++	0x00c0, 0x1148, 0x6817, 0x0100, 0x681f, 0x0064, 0x0078, 0x114c,
++	0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010, 0x0070, 0x1152,
++	0x0078, 0x1139, 0x8109, 0x00c0, 0x1137, 0x1078, 0x220a, 0x1078,
++	0x482c, 0x1078, 0x1963, 0x1078, 0x4d22, 0x3200, 0xa085, 0x000d,
++	0x2090, 0x70c3, 0x0000, 0x0090, 0x116c, 0x70c0, 0xa086, 0x0002,
++	0x00c0, 0x116c, 0x1078, 0x1284, 0x1078, 0x1196, 0x78cc, 0xa005,
++	0x00c0, 0x117a, 0x1078, 0x1ce3, 0x0010, 0x1180, 0x0068, 0x1180,
++	0x1078, 0x20e9, 0x0010, 0x1180, 0x0068, 0x1180, 0x1078, 0x1a48,
++	0x00e0, 0x116c, 0x1078, 0x4ba9, 0x0078, 0x116c, 0x118e, 0x1190,
++	0x240b, 0x240b, 0x48ad, 0x48ad, 0x240b, 0x240b, 0x0078, 0x118e,
++	0x0078, 0x1190, 0x0078, 0x1192, 0x0078, 0x1194, 0x0068, 0x1201,
++	0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x1201, 0x7814,
++	0xa005, 0x00c0, 0x11a7, 0x0010, 0x1202, 0x0078, 0x1201, 0x2009,
++	0x515b, 0x2104, 0xa005, 0x00c0, 0x1201, 0x2009, 0x5164, 0x200b,
++	0x0000, 0x7914, 0xa186, 0x0042, 0x00c0, 0x11cc, 0x7816, 0x2009,
++	0x5162, 0x2164, 0x200b, 0x0000, 0x6018, 0x70c6, 0x6014, 0x70ca,
++	0x611c, 0xa18c, 0xff00, 0x6020, 0xa084, 0x00ff, 0xa105, 0x70ce,
++	0x1078, 0x1948, 0x0078, 0x11ff, 0x7814, 0xa086, 0x0018, 0x00c0,
++	0x11d3, 0x1078, 0x165a, 0x7817, 0x0000, 0x2009, 0x5162, 0x2104,
++	0xa065, 0x0040, 0x11ef, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x19b3,
++	0x0c7f, 0x609f, 0x0000, 0x1078, 0x1730, 0x2009, 0x000c, 0x6007,
++	0x0103, 0x1078, 0x1924, 0x00c0, 0x11fb, 0x1078, 0x1948, 0x2009,
++	0x5162, 0x200b, 0x0000, 0x2009, 0x515c, 0x2104, 0x200b, 0x0000,
++	0xa005, 0x0040, 0x11ff, 0x2001, 0x4005, 0x0078, 0x1286, 0x0078,
++	0x1284, 0x007c, 0x70c3, 0x0000, 0x70c7, 0x0000, 0x70cb, 0x0000,
++	0x70cf, 0x0000, 0x70c0, 0xa0bc, 0xffc0, 0x00c0, 0x1252, 0x2038,
++	0x0079, 0x1212, 0x1284, 0x12e5, 0x12a9, 0x12fe, 0x130d, 0x1313,
++	0x12a0, 0x1748, 0x1317, 0x1298, 0x12ad, 0x12af, 0x12b1, 0x12b3,
++	0x174d, 0x1298, 0x1329, 0x1360, 0x1672, 0x1742, 0x12b5, 0x1591,
++	0x15ad, 0x15c9, 0x15f4, 0x154a, 0x1558, 0x156c, 0x1580, 0x13df,
++	0x1298, 0x138d, 0x1393, 0x1398, 0x139d, 0x13a3, 0x13a8, 0x13ad,
++	0x13b2, 0x13b7, 0x13bb, 0x13d0, 0x13dc, 0x1298, 0x1298, 0x1298,
++	0x1298, 0x13eb, 0x13f4, 0x1403, 0x1429, 0x1433, 0x143a, 0x1480,
++	0x148f, 0x149e, 0x14b0, 0x152a, 0x153a, 0x1298, 0x1298, 0x1298,
++	0x1298, 0x153f, 0xa0bc, 0xffa0, 0x00c0, 0x1298, 0x2038, 0xa084,
++	0x001f, 0x0079, 0x125b, 0x1786, 0x1789, 0x1799, 0x1298, 0x1298,
++	0x18df, 0x18fc, 0x1298, 0x1298, 0x1298, 0x1900, 0x1908, 0x1298,
++	0x1298, 0x1298, 0x1298, 0x12db, 0x12f4, 0x131f, 0x1356, 0x1668,
++	0x1764, 0x1778, 0x1298, 0x1829, 0x190e, 0x18bb, 0x18c5, 0x18c9,
++	0x18d7, 0x1298, 0x1298, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078,
++	0x1286, 0x73ce, 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0068,
++	0x1287, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x00e0,
++	0x128f, 0x00e0, 0x1291, 0x0068, 0x1291, 0x2091, 0x4080, 0x007c,
++	0x70c3, 0x4001, 0x0078, 0x1287, 0x70c3, 0x4006, 0x0078, 0x1287,
++	0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0078,
++	0x1284, 0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078, 0x1284, 0x0078,
++	0x1284, 0x0078, 0x1284, 0x0078, 0x1284, 0x2091, 0x8000, 0x70c3,
++	0x0000, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3,
++	0x0007, 0x3f00, 0x70d6, 0x2079, 0x0000, 0x781b, 0x0001, 0x2031,
++	0x0030, 0x2059, 0x1000, 0x2029, 0x0457, 0x2051, 0x0470, 0x2061,
++	0x0472, 0x20b9, 0xffff, 0x20c1, 0x0000, 0x2091, 0x5000, 0x2091,
++	0x4080, 0x0078, 0x0455, 0x1078, 0x1b53, 0x00c0, 0x129c, 0x75d8,
++	0x74dc, 0x75da, 0x74de, 0x0078, 0x12e8, 0x2029, 0x0000, 0x2520,
++	0x71d0, 0x73c8, 0x72cc, 0x70c4, 0x1078, 0x1a8d, 0x0040, 0x1284,
++	0x70c3, 0x4002, 0x0078, 0x1284, 0x1078, 0x1b53, 0x00c0, 0x129c,
++	0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1301, 0x2029, 0x0000,
++	0x2520, 0x71d0, 0x73c8, 0x72cc, 0x70c4, 0x1078, 0x1aed, 0x0040,
++	0x1284, 0x70c3, 0x4002, 0x0078, 0x1284, 0x71c4, 0x70c8, 0x2114,
++	0x200a, 0x0078, 0x1282, 0x71c4, 0x2114, 0x0078, 0x1282, 0x70c7,
++	0x0007, 0x70cb, 0x0041, 0x70cf, 0x0000, 0x0078, 0x1284, 0x1078,
++	0x1b53, 0x00c0, 0x129c, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078,
++	0x132c, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0,
++	0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005, 0x0040, 0x1350, 0x8001,
++	0x7892, 0xa084, 0xfc00, 0x0040, 0x1345, 0x78cc, 0xa085, 0x0001,
++	0x78ce, 0x2001, 0x4005, 0x0078, 0x1286, 0x7a9a, 0x7b9e, 0x7da2,
++	0x7ea6, 0x7c96, 0x78cc, 0xa084, 0xfffc, 0x78ce, 0x0078, 0x1354,
++	0x78cc, 0xa085, 0x0001, 0x78ce, 0x0078, 0x1284, 0x1078, 0x1b53,
++	0x00c0, 0x129c, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, 0x1363,
++	0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6,
++	0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0040, 0x1387, 0x8001, 0x78ae,
++	0xa084, 0xfc00, 0x0040, 0x137c, 0x78cc, 0xa085, 0x0100, 0x78ce,
++	0x2001, 0x4005, 0x0078, 0x1286, 0x7ab6, 0x7bba, 0x7dbe, 0x7ec2,
++	0x7cb2, 0x78cc, 0xa084, 0xfcff, 0x78ce, 0x0078, 0x138b, 0x78cc,
++	0xa085, 0x0100, 0x78ce, 0x0078, 0x1284, 0x2009, 0x5161, 0x210c,
++	0x7aec, 0x0078, 0x1282, 0x2009, 0x5141, 0x210c, 0x0078, 0x1283,
++	0x2009, 0x5142, 0x210c, 0x0078, 0x1283, 0x2061, 0x5140, 0x610c,
++	0x6210, 0x0078, 0x1282, 0x2009, 0x5145, 0x210c, 0x0078, 0x1283,
++	0x2009, 0x5146, 0x210c, 0x0078, 0x1283, 0x2009, 0x5148, 0x210c,
++	0x0078, 0x1283, 0x2009, 0x5149, 0x210c, 0x0078, 0x1283, 0x7908,
++	0x7a0c, 0x0078, 0x1282, 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003,
++	0x8003, 0x8003, 0xa0e8, 0x5380, 0x6a00, 0x6804, 0xa084, 0x0008,
++	0x0040, 0x13cd, 0x6b08, 0x0078, 0x13ce, 0x6b0c, 0x0078, 0x1281,
++	0x77c4, 0x1078, 0x1973, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091,
++	0x8001, 0x2708, 0x0078, 0x1281, 0x794c, 0x0078, 0x1283, 0x77c4,
++	0x1078, 0x1973, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, 0x2091,
++	0x8001, 0x0078, 0x1281, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x127c,
++	0x1078, 0x22e2, 0x0078, 0x1281, 0x71c4, 0xa182, 0x0010, 0x00c8,
++	0x127c, 0x2011, 0x5141, 0x2204, 0x007e, 0x2112, 0x1078, 0x229b,
++	0x017f, 0x0078, 0x1283, 0x71c4, 0x2011, 0x1421, 0x20a9, 0x0008,
++	0x2204, 0xa106, 0x0040, 0x1413, 0x8210, 0x0070, 0x1411, 0x0078,
++	0x1408, 0x0078, 0x127c, 0xa292, 0x1421, 0x027e, 0x2011, 0x5142,
++	0x2204, 0x2112, 0x017f, 0x007e, 0x1078, 0x22a7, 0x017f, 0x0078,
++	0x1283, 0x03e8, 0x00fa, 0x01f4, 0x02ee, 0x0064, 0x0019, 0x0032,
++	0x004b, 0x2061, 0x5140, 0x610c, 0x6210, 0x70c4, 0x600e, 0x70c8,
++	0x6012, 0x0078, 0x1282, 0x2061, 0x5140, 0x6114, 0x70c4, 0x6016,
++	0x0078, 0x1283, 0x2061, 0x5140, 0x71c4, 0x2011, 0x0004, 0x601f,
++	0x0019, 0x2019, 0x1212, 0xa186, 0x0028, 0x0040, 0x145b, 0x2011,
++	0x0005, 0x601f, 0x0019, 0x2019, 0x1212, 0xa186, 0x0032, 0x0040,
++	0x145b, 0x2011, 0x0006, 0x601f, 0x000c, 0x2019, 0x2222, 0xa186,
++	0x003c, 0x00c0, 0x127c, 0x6018, 0x007e, 0x611a, 0x7800, 0xa084,
++	0x0001, 0x00c0, 0x1476, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
++	0x0048, 0x146e, 0x0038, 0x1472, 0x0078, 0x1476, 0x0028, 0x1472,
++	0x0078, 0x1476, 0x2019, 0x2222, 0x0078, 0x1478, 0x2019, 0x1212,
++	0x23b8, 0x1078, 0x22b8, 0x1078, 0x4d22, 0x017f, 0x0078, 0x1283,
++	0x71c4, 0xa184, 0xffcf, 0x00c0, 0x127c, 0x2011, 0x5148, 0x2204,
++	0x2112, 0x007e, 0x1078, 0x22da, 0x017f, 0x0078, 0x1283, 0x71c4,
++	0xa182, 0x0010, 0x00c8, 0x127c, 0x2011, 0x5149, 0x2204, 0x007e,
++	0x2112, 0x1078, 0x22c9, 0x017f, 0x0078, 0x1283, 0x71c4, 0x72c8,
++	0xa184, 0xfffd, 0x00c0, 0x127b, 0xa284, 0xfffd, 0x00c0, 0x127b,
++	0x2100, 0x7908, 0x780a, 0x2200, 0x7a0c, 0x780e, 0x0078, 0x1282,
++	0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8,
++	0x5380, 0x2019, 0x0000, 0x72c8, 0xa284, 0x0080, 0x0040, 0x14c6,
++	0x6c14, 0x84ff, 0x00c0, 0x14c6, 0x6817, 0x0040, 0xa284, 0x0040,
++	0x0040, 0x14d0, 0x6c10, 0x84ff, 0x00c0, 0x14d0, 0x6813, 0x0001,
++	0x6800, 0x007e, 0xa226, 0x0040, 0x14f3, 0x6a02, 0xa484, 0x2000,
++	0x0040, 0x14dc, 0xa39d, 0x0010, 0xa484, 0x1000, 0x0040, 0x14e2,
++	0xa39d, 0x0008, 0xa484, 0x4000, 0x0040, 0x14f3, 0x810f, 0xa284,
++	0x4000, 0x0040, 0x14ef, 0x1078, 0x22fc, 0x0078, 0x14f3, 0x1078,
++	0x22ee, 0x0078, 0x14f3, 0x72cc, 0x6808, 0xa206, 0x0040, 0x1522,
++	0xa2a4, 0x00ff, 0x2061, 0x5140, 0x6118, 0xa186, 0x0028, 0x0040,
++	0x1509, 0xa186, 0x0032, 0x0040, 0x150f, 0xa186, 0x003c, 0x0040,
++	0x1515, 0xa482, 0x0064, 0x0048, 0x151f, 0x0078, 0x1519, 0xa482,
++	0x0050, 0x0048, 0x151f, 0x0078, 0x1519, 0xa482, 0x0043, 0x0048,
++	0x151f, 0x71c4, 0x71c6, 0x027f, 0x72ca, 0x0078, 0x127d, 0x6a0a,
++	0xa39d, 0x000a, 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4,
++	0x0078, 0x1281, 0x77c4, 0x1078, 0x1973, 0x2091, 0x8000, 0x6a14,
++	0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708,
++	0x0078, 0x1281, 0x70c4, 0x794c, 0x784e, 0x0078, 0x1283, 0x71c4,
++	0x72c8, 0x73cc, 0xa182, 0x0010, 0x00c8, 0x127c, 0x1078, 0x230a,
++	0x0078, 0x1281, 0x77c4, 0x1078, 0x1973, 0x2091, 0x8000, 0x6a08,
++	0xa295, 0x0002, 0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078, 0x1282,
++	0x77c4, 0x1078, 0x1973, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9,
++	0x6a0a, 0x6804, 0xa005, 0x0040, 0x1567, 0x1078, 0x21d2, 0x2091,
++	0x8001, 0x2708, 0x0078, 0x1282, 0x77c4, 0x1078, 0x1973, 0x2091,
++	0x8000, 0x6a08, 0xa295, 0x0004, 0x6a0a, 0x6804, 0xa005, 0x0040,
++	0x157b, 0x1078, 0x21d2, 0x2091, 0x8001, 0x2708, 0x0078, 0x1282,
++	0x77c4, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091,
++	0x8000, 0x1078, 0x1980, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0078,
++	0x1282, 0x77c4, 0x72c8, 0x73cc, 0x77c6, 0x72ca, 0x73ce, 0x1078,
++	0x19e1, 0x00c0, 0x15a9, 0x6818, 0xa005, 0x0040, 0x15a9, 0x2708,
++	0x1078, 0x231a, 0x00c0, 0x15a9, 0x7817, 0x0015, 0x2091, 0x8001,
++	0x007c, 0x2091, 0x8001, 0x0078, 0x1284, 0x77c4, 0x77c6, 0x2041,
++	0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078,
++	0x1980, 0x2061, 0x5140, 0x606f, 0x0003, 0x6782, 0x6093, 0x000f,
++	0x6073, 0x0000, 0x7817, 0x0016, 0x1078, 0x21d2, 0x2091, 0x8001,
++	0x007c, 0x77c8, 0x77ca, 0x77c4, 0x77c6, 0xa7bc, 0xff00, 0x2091,
++	0x8000, 0x2061, 0x5140, 0x606f, 0x0002, 0x6073, 0x0000, 0x6782,
++	0x6093, 0x000f, 0x7817, 0x0017, 0x1078, 0x21d2, 0x2091, 0x8001,
++	0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x2091, 0x8000,
++	0x1078, 0x1980, 0x70c8, 0x6836, 0x8738, 0xa784, 0x001f, 0x00c0,
++	0x15e8, 0x2091, 0x8001, 0x007c, 0x78cc, 0xa084, 0x0003, 0x00c0,
++	0x1618, 0x2039, 0x0000, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051,
++	0x0008, 0x1078, 0x1973, 0x2091, 0x8000, 0x6808, 0xa80d, 0x690a,
++	0x2091, 0x8001, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1601, 0xa7bc,
++	0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1601,
++	0x2091, 0x8000, 0x2069, 0x0100, 0x6830, 0xa084, 0x0040, 0x0040,
++	0x1641, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0004,
++	0x0040, 0x162e, 0x0070, 0x162e, 0x0078, 0x1625, 0x684b, 0x0009,
++	0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0040, 0x163b, 0x0070,
++	0x163b, 0x0078, 0x1632, 0x20a9, 0x00fa, 0x0070, 0x1641, 0x0078,
++	0x163d, 0x2079, 0x5100, 0x7817, 0x0018, 0x2061, 0x5140, 0x606f,
++	0x0001, 0x6073, 0x0000, 0x6093, 0x000f, 0x78cc, 0xa085, 0x0002,
++	0x78ce, 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b, 0x0048, 0x2091,
++	0x8001, 0x007c, 0x78cc, 0xa084, 0xfffd, 0x78ce, 0xa084, 0x0001,
++	0x00c0, 0x1664, 0x1078, 0x1a2b, 0x71c4, 0x71c6, 0x794a, 0x007c,
++	0x1078, 0x1b53, 0x00c0, 0x129c, 0x75d8, 0x74dc, 0x75da, 0x74de,
++	0x0078, 0x1675, 0x2029, 0x0000, 0x2520, 0x71c4, 0x73c8, 0x72cc,
++	0x71c6, 0x73ca, 0x72ce, 0x2079, 0x5100, 0x2091, 0x8000, 0x1078,
++	0x192e, 0x2091, 0x8001, 0x0040, 0x172c, 0x20a9, 0x0005, 0x20a1,
++	0x5118, 0x2091, 0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0020,
++	0x1078, 0x1929, 0x0040, 0x1698, 0x1078, 0x1948, 0x0078, 0x172c,
++	0x6004, 0xa084, 0xff00, 0x8007, 0x8009, 0x0040, 0x16fb, 0x0c7e,
++	0x2c68, 0x2091, 0x8000, 0x1078, 0x192e, 0x2091, 0x8001, 0x0040,
++	0x16cc, 0x2c00, 0x689e, 0x8109, 0x00c0, 0x16a0, 0x609f, 0x0000,
++	0x0c7f, 0x0c7e, 0x7218, 0x731c, 0x7420, 0x7524, 0x2c68, 0x689c,
++	0xa065, 0x0040, 0x16fa, 0x2009, 0x0020, 0x1078, 0x1929, 0x00c0,
++	0x16e3, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0002, 0x00c0, 0x16cc,
++	0x2d00, 0x6002, 0x0078, 0x16b2, 0x0c7f, 0x0c7e, 0x609c, 0x2060,
++	0x1078, 0x19b3, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1730, 0x2009,
++	0x000c, 0x6008, 0xa085, 0x0200, 0x600a, 0x1078, 0x1924, 0x1078,
++	0x1948, 0x0078, 0x172c, 0x0c7f, 0x0c7e, 0x609c, 0x2060, 0x1078,
++	0x19b3, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1730, 0x2009, 0x000c,
++	0x6007, 0x0103, 0x601b, 0x0003, 0x1078, 0x1924, 0x1078, 0x1948,
++	0x0078, 0x172c, 0x0c7f, 0x74c4, 0x73c8, 0x72cc, 0x6014, 0x2091,
++	0x8000, 0x7817, 0x0012, 0x0e7e, 0x2071, 0x5140, 0x706f, 0x0005,
++	0x7073, 0x0000, 0x7376, 0x727a, 0x747e, 0x7082, 0x7087, 0x0000,
++	0x2c00, 0x708a, 0x708f, 0x0000, 0xa02e, 0x2530, 0x611c, 0x61a2,
++	0xa184, 0x0060, 0x0040, 0x171e, 0x1078, 0x47c2, 0x0e7f, 0x6596,
++	0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x1078,
++	0x21d2, 0x2091, 0x8001, 0x007c, 0x70c3, 0x4005, 0x0078, 0x1287,
++	0x20a9, 0x0005, 0x2099, 0x5118, 0x2091, 0x8000, 0x530a, 0x2091,
++	0x8001, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9,
++	0x0000, 0x007c, 0x71c4, 0x70c7, 0x0000, 0x7906, 0x0078, 0x1284,
++	0x71c4, 0x71c6, 0x2168, 0x0078, 0x174f, 0x2069, 0x1000, 0x690c,
++	0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x00c0, 0x1751, 0xa285,
++	0x0000, 0x00c0, 0x175f, 0x70c3, 0x4000, 0x0078, 0x1761, 0x70c3,
++	0x4003, 0x70ca, 0x0078, 0x1287, 0x2011, 0x5167, 0x220c, 0x70c4,
++	0x8003, 0x0048, 0x1771, 0x1078, 0x3b7f, 0xa184, 0x7fff, 0x0078,
++	0x1775, 0x1078, 0x3b72, 0xa185, 0x8000, 0x2012, 0x0078, 0x1283,
++	0x71c4, 0x1078, 0x3b69, 0x6100, 0x2001, 0x5167, 0x2004, 0xa084,
++	0x8000, 0xa10d, 0x6204, 0x6308, 0x0078, 0x1281, 0x79e4, 0x0078,
++	0x1283, 0x71c4, 0x71c6, 0x2198, 0x20a1, 0x0042, 0x20a9, 0x0004,
++	0x53a3, 0x21a0, 0x2099, 0x0042, 0x20a9, 0x0004, 0x53a3, 0x0078,
++	0x1284, 0x70c4, 0x2068, 0x2079, 0x5100, 0x2091, 0x8000, 0x1078,
++	0x192e, 0x2091, 0x8001, 0x0040, 0x1825, 0x6007, 0x0001, 0x600b,
++	0x0000, 0x602b, 0x0000, 0x601b, 0x0006, 0x6a10, 0xa28c, 0x000f,
++	0xa284, 0x00f0, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x6016,
++	0xa284, 0x0800, 0x0040, 0x17c0, 0x601b, 0x000a, 0x0078, 0x17c6,
++	0xa284, 0x1000, 0x0040, 0x17c6, 0x601b, 0x000c, 0xa284, 0x0300,
++	0x0040, 0x17cf, 0x602b, 0x0001, 0x8004, 0x8004, 0x8004, 0xa085,
++	0x0001, 0x601e, 0x6023, 0x0000, 0x6027, 0x0000, 0xa284, 0x0400,
++	0x0040, 0x17dc, 0x602b, 0x0000, 0x20a9, 0x0006, 0xac80, 0x000b,
++	0x20a0, 0xad80, 0x0005, 0x2098, 0x53a3, 0xa284, 0x0300, 0x00c0,
++	0x17f1, 0x6046, 0x604a, 0x604e, 0x6052, 0x6096, 0x609a, 0x0078,
++	0x17fb, 0x6800, 0x6046, 0x6804, 0x604a, 0x6e08, 0x664e, 0x6d0c,
++	0x6552, 0x6596, 0x669a, 0x6014, 0x2091, 0x8000, 0x7817, 0x0042,
++	0x2c08, 0x2061, 0x5140, 0x606f, 0x0005, 0x6073, 0x0000, 0x6077,
++	0x0000, 0x607b, 0x0000, 0x607f, 0x0000, 0x6082, 0x618a, 0xa284,
++	0x0400, 0x608e, 0x2091, 0x8001, 0x0e7e, 0x2071, 0x0020, 0x7007,
++	0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x0e7f, 0x2091, 0x8000,
++	0x1078, 0x21d2, 0x2091, 0x8001, 0x007c, 0x70c3, 0x4005, 0x0078,
++	0x1287, 0x0c7e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2091, 0x8000, 0x2071,
++	0x5140, 0x2079, 0x0100, 0x2061, 0x0010, 0x70a0, 0xa06d, 0x0040,
++	0x18b1, 0x6a04, 0xa294, 0x00ff, 0xa286, 0x0007, 0x0040, 0x1844,
++	0xa286, 0x000f, 0x00c0, 0x18b1, 0x691c, 0xa184, 0x0080, 0x00c0,
++	0x18b1, 0x6824, 0xa18c, 0xff00, 0xa085, 0x0019, 0x6826, 0x71b0,
++	0x81ff, 0x0040, 0x1867, 0x0d7e, 0x2069, 0x0020, 0x6807, 0x0010,
++	0x6908, 0x6808, 0xa106, 0x00c0, 0x1858, 0x690c, 0x680c, 0xa106,
++	0x00c0, 0x185d, 0xa184, 0x00ff, 0x00c0, 0x185d, 0x0d7f, 0x78b8,
++	0xa084, 0x801f, 0x00c0, 0x1867, 0x7848, 0xa085, 0x000c, 0x784a,
++	0x71b0, 0x81ff, 0x0040, 0x188a, 0x70b3, 0x0000, 0x0d7e, 0x2069,
++	0x0020, 0x6807, 0x0018, 0x6804, 0xa084, 0x0008, 0x00c0, 0x187b,
++	0x6807, 0x0008, 0x6804, 0xa084, 0x0008, 0x00c0, 0x1882, 0x6807,
++	0x0002, 0x0d7f, 0x61c4, 0x62c8, 0x63cc, 0x61c6, 0x62ca, 0x63ce,
++	0x0e7e, 0x2071, 0x5100, 0x7266, 0x736a, 0xae80, 0x0019, 0x0e7f,
++	0x7848, 0xa084, 0x000c, 0x00c0, 0x1898, 0x1078, 0x46db, 0x78a3,
++	0x0000, 0x7858, 0xa084, 0xedff, 0x785a, 0x70b4, 0xa080, 0x00df,
++	0x781a, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x2091, 0x8001, 0x0078,
++	0x1284, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x2091, 0x8001, 0x2001,
++	0x4005, 0x0078, 0x1286, 0x7980, 0x71c6, 0x71c4, 0xa182, 0x0003,
++	0x00c8, 0x127c, 0x7982, 0x0078, 0x1284, 0x7980, 0x71c6, 0x0078,
++	0x1284, 0x7974, 0x71c6, 0x71c4, 0x7976, 0x7978, 0x71ca, 0x71c8,
++	0x797a, 0x797c, 0x71ce, 0x71cc, 0x797e, 0x0078, 0x1284, 0x7974,
++	0x71c6, 0x7978, 0x71ca, 0x797c, 0x71ce, 0x0078, 0x1284, 0x7900,
++	0x71c6, 0x71c4, 0x7902, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
++	0x0048, 0x18ee, 0x0038, 0x18f0, 0x0078, 0x18fa, 0x00a8, 0x18fa,
++	0xa18c, 0x0001, 0x00c0, 0x18f8, 0x20b9, 0x2222, 0x0078, 0x18fa,
++	0x20b9, 0x1212, 0x0078, 0x1284, 0x7900, 0x71c6, 0x0078, 0x1284,
++	0x2009, 0x5174, 0x2104, 0x70c6, 0x70c4, 0x200a, 0x0078, 0x1284,
++	0x2009, 0x5174, 0x2104, 0x70c6, 0x0078, 0x1284, 0x71c4, 0x8107,
++	0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8, 0x5380, 0x6a14,
++	0xd2b4, 0x0040, 0x191f, 0x2011, 0x0001, 0x0078, 0x1921, 0x2011,
++	0x0000, 0x6b0c, 0x0078, 0x1281, 0xac80, 0x0001, 0x1078, 0x1b0f,
++	0x007c, 0xac80, 0x0001, 0x1078, 0x1aaf, 0x007c, 0x7850, 0xa065,
++	0x0040, 0x1936, 0x2c04, 0x7852, 0x2063, 0x0000, 0x007c, 0x0f7e,
++	0x2079, 0x5100, 0x7850, 0xa06d, 0x0040, 0x1946, 0x2d04, 0x7852,
++	0x6803, 0x0000, 0x6807, 0x0000, 0x680b, 0x0000, 0x0f7f, 0x007c,
++	0x2091, 0x8000, 0x0f7e, 0x2079, 0x5100, 0x7850, 0x2062, 0x2c00,
++	0xa005, 0x00c0, 0x1955, 0x1078, 0x23eb, 0x7852, 0x0f7f, 0x2091,
++	0x8001, 0x007c, 0x0f7e, 0x2079, 0x5100, 0x7850, 0x206a, 0x2d00,
++	0x7852, 0x0f7f, 0x007c, 0x2011, 0x7800, 0x7a52, 0x7bec, 0x8319,
++	0x0040, 0x1970, 0xa280, 0x0031, 0x2012, 0x2010, 0x0078, 0x1967,
++	0x2013, 0x0000, 0x007c, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f,
++	0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa0e8, 0x5400, 0x007c,
++	0x1078, 0x1973, 0x2900, 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084,
++	0xffef, 0xa80d, 0x690a, 0x2009, 0x5152, 0x210c, 0x6804, 0xa005,
++	0x0040, 0x19b2, 0xa116, 0x00c0, 0x199d, 0x2060, 0x6000, 0x6806,
++	0x017e, 0x200b, 0x0000, 0x0078, 0x19a0, 0x2009, 0x0000, 0x017e,
++	0x6804, 0xa065, 0x0040, 0x19af, 0x6000, 0x6806, 0x1078, 0x19c0,
++	0x1078, 0x1c5f, 0x6810, 0x8001, 0x6812, 0x00c0, 0x19a0, 0x017f,
++	0x6902, 0x6906, 0x007c, 0xa065, 0x0040, 0x19bf, 0x609c, 0x609f,
++	0x0000, 0x2008, 0x1078, 0x1948, 0x2100, 0x0078, 0x19b3, 0x007c,
++	0x6007, 0x0103, 0x608f, 0x0000, 0x20a9, 0x001c, 0xac80, 0x0005,
++	0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828, 0x601a, 0x682c, 0x6022,
++	0x007c, 0x0e7e, 0x2071, 0x5140, 0x704c, 0xa08c, 0x0200, 0x00c0,
++	0x19df, 0xa088, 0x5180, 0x2d0a, 0x8000, 0x704e, 0xa006, 0x0e7f,
++	0x007c, 0x1078, 0x1973, 0x2091, 0x8000, 0x6804, 0x781e, 0xa065,
++	0x0040, 0x1a2a, 0x0078, 0x19f2, 0x2c00, 0x781e, 0x6000, 0xa065,
++	0x0040, 0x1a2a, 0x600c, 0xa306, 0x00c0, 0x19ec, 0x6010, 0xa206,
++	0x00c0, 0x19ec, 0x2c28, 0x2001, 0x5152, 0x2004, 0xac06, 0x00c0,
++	0x1a03, 0x0078, 0x1a28, 0x6804, 0xac06, 0x00c0, 0x1a10, 0x6000,
++	0xa065, 0x6806, 0x00c0, 0x1a1a, 0x6803, 0x0000, 0x0078, 0x1a1a,
++	0x6400, 0x781c, 0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x1a1a,
++	0x2c00, 0x6802, 0x2560, 0x1078, 0x19c0, 0x601b, 0x0005, 0x6023,
++	0x0020, 0x1078, 0x1c5f, 0x6810, 0x8001, 0x1050, 0x23eb, 0x6812,
++	0xa085, 0xffff, 0x007c, 0x2039, 0x0000, 0x2041, 0x0021, 0x2049,
++	0x0004, 0x2051, 0x0008, 0x2091, 0x8000, 0x1078, 0x1980, 0x8738,
++	0xa784, 0x001f, 0x00c0, 0x1a35, 0xa7bc, 0xff00, 0x873f, 0x8738,
++	0x873f, 0xa784, 0x0f00, 0x00c0, 0x1a35, 0x2091, 0x8001, 0x007c,
++	0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x1a59, 0x2091,
++	0x8000, 0x78e0, 0x78e3, 0x0000, 0x2091, 0x8001, 0xa005, 0x00c0,
++	0x1a5a, 0x007c, 0xa08c, 0xfff0, 0x0040, 0x1a60, 0x1078, 0x23eb,
++	0x0079, 0x1a62, 0x1a72, 0x1a75, 0x1a7b, 0x1a7f, 0x1a73, 0x1a83,
++	0x1a89, 0x1a73, 0x1a73, 0x1c29, 0x1c4d, 0x1c51, 0x1a73, 0x1a73,
++	0x1a73, 0x1a73, 0x007c, 0x1078, 0x23eb, 0x1078, 0x1a2b, 0x2001,
++	0x8001, 0x0078, 0x1c57, 0x2001, 0x8003, 0x0078, 0x1c57, 0x2001,
++	0x8004, 0x0078, 0x1c57, 0x1078, 0x1a2b, 0x2001, 0x8006, 0x0078,
++	0x1c57, 0x2001, 0x8007, 0x0078, 0x1c57, 0x2030, 0x2138, 0xa782,
++	0x0021, 0x0048, 0x1a95, 0x2009, 0x0020, 0x2600, 0x1078, 0x1aaf,
++	0x00c0, 0x1aae, 0xa7ba, 0x0020, 0x0048, 0x1aad, 0x0040, 0x1aad,
++	0x2708, 0xa6b0, 0x0020, 0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1,
++	0x0000, 0xa5a9, 0x0000, 0x0078, 0x1a8f, 0xa006, 0x007c, 0x81ff,
++	0x0040, 0x1aea, 0x2099, 0x0030, 0x20a0, 0x700c, 0xa084, 0x00ff,
++	0x0040, 0x1ac1, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
++	0x1abc, 0x21a8, 0x7017, 0x0000, 0x810b, 0x7112, 0x721a, 0x731e,
++	0x7422, 0x7526, 0x780c, 0xa085, 0x0001, 0x7002, 0x7007, 0x0001,
++	0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8, 0x1ade, 0x2009,
++	0x0022, 0x2104, 0xa084, 0x4000, 0x00c0, 0x1ad0, 0x7008, 0x800b,
++	0x00c8, 0x1ad0, 0x7007, 0x0002, 0xa08c, 0x01e0, 0x00c0, 0x1aea,
++	0x53a5, 0xa006, 0x7003, 0x0000, 0x007c, 0x2030, 0x2138, 0xa782,
++	0x0021, 0x0048, 0x1af5, 0x2009, 0x0020, 0x2600, 0x1078, 0x1b0f,
++	0x00c0, 0x1b0e, 0xa7ba, 0x0020, 0x0048, 0x1b0d, 0x0040, 0x1b0d,
++	0x2708, 0xa6b0, 0x0020, 0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1,
++	0x0000, 0xa5a9, 0x0000, 0x0078, 0x1aef, 0xa006, 0x007c, 0x81ff,
++	0x0040, 0x1b50, 0x2098, 0x20a1, 0x0030, 0x700c, 0xa084, 0x00ff,
++	0x0040, 0x1b21, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
++	0x1b1c, 0x21a8, 0x7017, 0x0000, 0x810b, 0x7112, 0x721a, 0x731e,
++	0x7422, 0x7526, 0x780c, 0xa085, 0x0000, 0x7002, 0x53a6, 0x7007,
++	0x0001, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8, 0x1b3f,
++	0x2009, 0x0022, 0x2104, 0xa084, 0x4000, 0x00c0, 0x1b31, 0x7010,
++	0xa084, 0xf000, 0x0040, 0x1b48, 0x7007, 0x0008, 0x0078, 0x1b4c,
++	0x7108, 0x8103, 0x00c8, 0x1b31, 0x7007, 0x0002, 0xa184, 0x01e0,
++	0x7003, 0x0000, 0x007c, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0004,
++	0x00c8, 0x1b5c, 0x0078, 0x1b5f, 0xa006, 0x0078, 0x1b61, 0xa085,
++	0x0001, 0x007c, 0x0e7e, 0x2071, 0x5100, 0x2d08, 0x7058, 0x6802,
++	0xa005, 0x00c0, 0x1b6c, 0x715e, 0x715a, 0x0e7f, 0x007c, 0x2c08,
++	0x7858, 0x6002, 0xa005, 0x00c0, 0x1b76, 0x795e, 0x795a, 0x007c,
++	0x2091, 0x8000, 0x6003, 0x0000, 0x2c08, 0x785c, 0xa065, 0x00c0,
++	0x1b84, 0x795a, 0x0078, 0x1b85, 0x6102, 0x795e, 0x2091, 0x8001,
++	0x1078, 0x21ef, 0x007c, 0x0e7e, 0x2071, 0x5100, 0x7058, 0xa06d,
++	0x0040, 0x1b99, 0x6800, 0x705a, 0xa005, 0x00c0, 0x1b98, 0x705e,
++	0x8dff, 0x0e7f, 0x007c, 0x0d7e, 0x0c7e, 0x0f7e, 0x2079, 0x5100,
++	0xaf80, 0x0016, 0x2060, 0x6000, 0xa005, 0x0040, 0x1bc9, 0x2068,
++	0x6814, 0xa306, 0x00c0, 0x1bb2, 0x6828, 0xa084, 0x00ff, 0xa406,
++	0x0040, 0x1bb5, 0x2d60, 0x0078, 0x1ba3, 0x6800, 0xa005, 0x6002,
++	0x00c0, 0x1bc1, 0xaf80, 0x0016, 0xac06, 0x0040, 0x1bc0, 0x2c00,
++	0x785e, 0x0d7e, 0x689c, 0xa005, 0x0040, 0x1bc8, 0x1078, 0x19b3,
++	0x007f, 0x0f7f, 0x0c7f, 0x0d7f, 0xa005, 0x007c, 0x0d7e, 0x0c7e,
++	0x0f7e, 0x2079, 0x5100, 0xaf80, 0x0016, 0x2060, 0x6000, 0xa005,
++	0x0040, 0x1bf8, 0x2068, 0x6814, 0xa084, 0x00ff, 0xa306, 0x0040,
++	0x1be4, 0x2d60, 0x0078, 0x1bd6, 0x6800, 0xa005, 0x6002, 0x00c0,
++	0x1bf0, 0xaf80, 0x0016, 0xac06, 0x0040, 0x1bef, 0x2c00, 0x785e,
++	0x0d7e, 0x689c, 0xa005, 0x0040, 0x1bf7, 0x1078, 0x19b3, 0x007f,
++	0x0f7f, 0x0c7f, 0x0d7f, 0xa005, 0x007c, 0x0d7e, 0x0c7e, 0x0f7e,
++	0x2079, 0x5100, 0xaf80, 0x0016, 0x2060, 0x6000, 0xa06d, 0x0040,
++	0x1c24, 0x6814, 0xa306, 0x0040, 0x1c10, 0x2d60, 0x0078, 0x1c05,
++	0x6800, 0xa005, 0x6002, 0x00c0, 0x1c1c, 0xaf80, 0x0016, 0xac06,
++	0x0040, 0x1c1b, 0x2c00, 0x785e, 0x0d7e, 0x689c, 0xa005, 0x0040,
++	0x1c23, 0x1078, 0x19b3, 0x007f, 0x0f7f, 0x0c7f, 0x0d7f, 0xa005,
++	0x007c, 0x2091, 0x8000, 0x2069, 0x5140, 0x6800, 0xa086, 0x0000,
++	0x0040, 0x1c37, 0x2091, 0x8001, 0x78e3, 0x0009, 0x007c, 0x6880,
++	0xa0bc, 0xff00, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010,
++	0x1078, 0x1980, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1c40, 0x2091,
++	0x8001, 0x2001, 0x800a, 0x0078, 0x1c57, 0x2001, 0x800c, 0x0078,
++	0x1c57, 0x1078, 0x1a2b, 0x2001, 0x800d, 0x0078, 0x1c57, 0x70c2,
++	0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x4080, 0x007c, 0x6004,
++	0x2c08, 0x2063, 0x0000, 0x7884, 0x8000, 0x7886, 0x7888, 0xa005,
++	0x798a, 0x0040, 0x1c6e, 0x2c02, 0x0078, 0x1c6f, 0x798e, 0x007c,
++	0x6807, 0x0103, 0x0c7e, 0x2061, 0x5100, 0x2d08, 0x206b, 0x0000,
++	0x6084, 0x8000, 0x6086, 0x6088, 0xa005, 0x618a, 0x0040, 0x1c83,
++	0x2d02, 0x0078, 0x1c84, 0x618e, 0x0c7f, 0x007c, 0x1078, 0x1c97,
++	0x0040, 0x1c96, 0x0c7e, 0x609c, 0xa065, 0x0040, 0x1c91, 0x1078,
++	0x19b3, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1948, 0x007c, 0x788c,
++	0xa065, 0x0040, 0x1ca9, 0x2091, 0x8000, 0x7884, 0x8001, 0x7886,
++	0x2c04, 0x788e, 0xa005, 0x00c0, 0x1ca7, 0x788a, 0x8000, 0x2091,
++	0x8001, 0x007c, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e,
++	0x00c8, 0x1cb3, 0xa200, 0x0070, 0x1cb7, 0x0078, 0x1cae, 0x8086,
++	0x818e, 0x007c, 0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x1cdd,
++	0xa11a, 0x00c8, 0x1cdd, 0x8213, 0x818d, 0x0048, 0x1cce, 0xa11a,
++	0x00c8, 0x1ccf, 0x0070, 0x1cd5, 0x0078, 0x1cc3, 0xa11a, 0x2308,
++	0x8210, 0x0070, 0x1cd5, 0x0078, 0x1cc3, 0x007e, 0x3200, 0xa084,
++	0xf7ff, 0x2080, 0x007f, 0x157f, 0x007c, 0x007e, 0x3200, 0xa085,
++	0x0800, 0x0078, 0x1cd9, 0x7994, 0x70d0, 0xa106, 0x0040, 0x1d51,
++	0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x1d51,
++	0x7008, 0x7208, 0xa206, 0x00c0, 0x1d51, 0xa286, 0x0008, 0x00c0,
++	0x1d51, 0x2071, 0x0010, 0x1078, 0x192e, 0x0040, 0x1d51, 0x7a9c,
++	0x7b98, 0x7ca4, 0x7da0, 0xa184, 0xff00, 0x0040, 0x1d1f, 0x2031,
++	0x0000, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b,
++	0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x2100, 0xa210, 0x2600,
++	0xa319, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x0078, 0x1d29, 0x8107,
++	0x8004, 0x8004, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9,
++	0x0000, 0x2009, 0x0020, 0x1078, 0x1929, 0x2091, 0x8001, 0x0040,
++	0x1d48, 0x1078, 0x1948, 0x78a8, 0x8000, 0x78aa, 0xa086, 0x0002,
++	0x00c0, 0x1d51, 0x2091, 0x8000, 0x78e3, 0x0002, 0x78ab, 0x0000,
++	0x78cc, 0xa085, 0x0003, 0x78ce, 0x2091, 0x8001, 0x0078, 0x1d51,
++	0x78ab, 0x0000, 0x1078, 0x20ac, 0x6004, 0xa084, 0x000f, 0x0079,
++	0x1d56, 0x2071, 0x0010, 0x2091, 0x8001, 0x007c, 0x1d66, 0x1d88,
++	0x1dae, 0x1d66, 0x1dcb, 0x1d75, 0x1f2c, 0x1f47, 0x1d66, 0x1d82,
++	0x1da8, 0x1e13, 0x1e82, 0x1ed2, 0x1ee4, 0x1f43, 0x2039, 0x0400,
++	0x78dc, 0xa705, 0x78de, 0x6008, 0xa705, 0x600a, 0x1078, 0x1fc7,
++	0x609c, 0x78da, 0x1078, 0x2094, 0x007c, 0x78dc, 0xa084, 0x0100,
++	0x0040, 0x1d7c, 0x0078, 0x1d66, 0x601c, 0xa085, 0x0080, 0x601e,
++	0x0078, 0x1d8f, 0x1078, 0x1b53, 0x00c0, 0x1d66, 0x1078, 0x20c6,
++	0x78dc, 0xa084, 0x0100, 0x0040, 0x1d8f, 0x0078, 0x1d66, 0x78df,
++	0x0000, 0x6004, 0x8007, 0xa084, 0x00ff, 0x78d2, 0x8001, 0x609f,
++	0x0000, 0x0040, 0x1da5, 0x1078, 0x1fc7, 0x0040, 0x1da5, 0x78dc,
++	0xa085, 0x0100, 0x78de, 0x0078, 0x1da7, 0x1078, 0x1feb, 0x007c,
++	0x1078, 0x1b53, 0x00c0, 0x1d66, 0x1078, 0x20c2, 0x78dc, 0xa08c,
++	0x0e00, 0x00c0, 0x1db7, 0xa084, 0x0100, 0x00c0, 0x1db9, 0x0078,
++	0x1d66, 0x1078, 0x1fc7, 0x00c0, 0x1dca, 0x6104, 0xa18c, 0x00ff,
++	0xa186, 0x0007, 0x0040, 0x1f84, 0xa186, 0x000f, 0x0040, 0x1f84,
++	0x1078, 0x1feb, 0x007c, 0x78dc, 0xa084, 0x0100, 0x0040, 0x1dd2,
++	0x0078, 0x1d66, 0x78df, 0x0000, 0x6714, 0x2011, 0x0001, 0x20a9,
++	0x0001, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0040, 0x1df5, 0x2011,
++	0x0001, 0xa7bc, 0xff00, 0x20a9, 0x0020, 0xa08e, 0x0001, 0x0040,
++	0x1df5, 0x2039, 0x0000, 0x2011, 0x0002, 0x20a9, 0x0100, 0xa08e,
++	0x0002, 0x0040, 0x1df5, 0x0078, 0x1e10, 0x1078, 0x1973, 0x2091,
++	0x8000, 0x682b, 0x0000, 0x682f, 0x0000, 0x6808, 0xa084, 0xffde,
++	0x680a, 0xade8, 0x0010, 0x2091, 0x8001, 0x0070, 0x1e09, 0x0078,
++	0x1df7, 0x8211, 0x0040, 0x1e10, 0x20a9, 0x0100, 0x0078, 0x1df7,
++	0x1078, 0x1948, 0x007c, 0x2001, 0x5167, 0x2004, 0xa084, 0x8000,
++	0x0040, 0x1fac, 0x6114, 0x1078, 0x20e3, 0x6900, 0xa184, 0x0001,
++	0x0040, 0x1e34, 0x6028, 0xa084, 0x00ff, 0x00c0, 0x1fa4, 0x6800,
++	0xa084, 0x0001, 0x0040, 0x1fac, 0x6803, 0x0000, 0x680b, 0x0000,
++	0x6807, 0x0000, 0x0078, 0x1fb4, 0x2011, 0x0001, 0x6020, 0xd0f4,
++	0x0040, 0x1e3c, 0xa295, 0x0002, 0xd0c4, 0x0040, 0x1e41, 0xa295,
++	0x0008, 0xd0cc, 0x0040, 0x1e46, 0xa295, 0x0400, 0x601c, 0xa084,
++	0x0002, 0x0040, 0x1e4d, 0xa295, 0x0004, 0x602c, 0xa08c, 0x00ff,
++	0xa182, 0x0002, 0x0048, 0x1fb0, 0xa182, 0x001b, 0x00c8, 0x1fb0,
++	0x0040, 0x1fb0, 0x690e, 0x602c, 0x8007, 0xa08c, 0x00ff, 0xa182,
++	0x0002, 0x0048, 0x1fb0, 0xa182, 0x001b, 0x00c8, 0x1fb0, 0x0040,
++	0x1fb0, 0x6912, 0x6030, 0xa005, 0x00c0, 0x1e70, 0x2001, 0x001e,
++	0x8000, 0x6816, 0x6028, 0xa084, 0x00ff, 0x0040, 0x1fac, 0x6806,
++	0x6028, 0x8007, 0xa084, 0x00ff, 0x0040, 0x1fac, 0x680a, 0x6a02,
++	0x0078, 0x1fb4, 0x2001, 0x5167, 0x2004, 0xa084, 0x8000, 0x0040,
++	0x1fac, 0x6114, 0x1078, 0x20e3, 0x2091, 0x8000, 0x6a04, 0x6b08,
++	0x6418, 0xa484, 0x0003, 0x0040, 0x1ea8, 0x6128, 0xa18c, 0x00ff,
++	0x8001, 0x00c0, 0x1ea1, 0x2100, 0xa210, 0x0048, 0x1ece, 0x0078,
++	0x1ea8, 0x8001, 0x00c0, 0x1ece, 0x2100, 0xa212, 0x0048, 0x1ece,
++	0xa484, 0x000c, 0x0040, 0x1ec2, 0x6128, 0x810f, 0xa18c, 0x00ff,
++	0xa082, 0x0004, 0x00c0, 0x1eba, 0x2100, 0xa318, 0x0048, 0x1ece,
++	0x0078, 0x1ec2, 0xa082, 0x0004, 0x00c0, 0x1ece, 0x2100, 0xa31a,
++	0x0048, 0x1ece, 0x6030, 0xa005, 0x0040, 0x1ec8, 0x8000, 0x6816,
++	0x6a06, 0x6b0a, 0x2091, 0x8001, 0x0078, 0x1fb4, 0x2091, 0x8001,
++	0x0078, 0x1fb0, 0x6114, 0x1078, 0x20e3, 0x2091, 0x8000, 0x6b08,
++	0x8318, 0x0048, 0x1ee0, 0x6b0a, 0x2091, 0x8001, 0x0078, 0x1fc3,
++	0x2091, 0x8001, 0x0078, 0x1fb0, 0x6024, 0x8007, 0xa084, 0x00ff,
++	0x0040, 0x1f02, 0xa086, 0x0080, 0x00c0, 0x1f2a, 0x20a9, 0x0008,
++	0x2069, 0x7510, 0x2091, 0x8000, 0x6800, 0xa084, 0xfcff, 0x6802,
++	0xade8, 0x0008, 0x0070, 0x1efe, 0x0078, 0x1ef4, 0x2091, 0x8001,
++	0x0078, 0x1fb4, 0x6028, 0xa015, 0x0040, 0x1f2a, 0x6114, 0x1078,
++	0x20e3, 0x0d7e, 0xade8, 0x0007, 0x2091, 0x8000, 0x6800, 0xa00d,
++	0x0040, 0x1f27, 0xa206, 0x0040, 0x1f18, 0x2168, 0x0078, 0x1f0e,
++	0x0c7e, 0x2160, 0x6000, 0x6802, 0x1078, 0x1948, 0x0c7f, 0x0d7f,
++	0x6808, 0x8000, 0x680a, 0x2091, 0x8001, 0x0078, 0x1fc3, 0x2091,
++	0x8001, 0x0d7f, 0x0078, 0x1fac, 0x6114, 0x1078, 0x20e3, 0x6800,
++	0xa084, 0x0001, 0x0040, 0x1f9c, 0x2091, 0x8000, 0x6a04, 0x8210,
++	0x0048, 0x1f3f, 0x6a06, 0x2091, 0x8001, 0x0078, 0x1fc3, 0x2091,
++	0x8001, 0x0078, 0x1fb0, 0x1078, 0x1b53, 0x00c0, 0x1d66, 0x6114,
++	0x1078, 0x20e3, 0x60be, 0x60bb, 0x0000, 0x6900, 0xa184, 0x0008,
++	0x0040, 0x1f56, 0x6020, 0xa085, 0x0100, 0x6022, 0xa184, 0x0001,
++	0x0040, 0x1fac, 0xa184, 0x0100, 0x00c0, 0x1f98, 0xa184, 0x0200,
++	0x00c0, 0x1f94, 0x681c, 0xa005, 0x00c0, 0x1fa0, 0x6004, 0xa084,
++	0x00ff, 0xa086, 0x000f, 0x00c0, 0x1f6f, 0x1078, 0x20c6, 0x78df,
++	0x0000, 0x6004, 0x8007, 0xa084, 0x00ff, 0x78d2, 0x8001, 0x609f,
++	0x0000, 0x0040, 0x1f84, 0x1078, 0x1fc7, 0x0040, 0x1f84, 0x78dc,
++	0xa085, 0x0100, 0x78de, 0x007c, 0x78d7, 0x0000, 0x78db, 0x0000,
++	0x6024, 0xa084, 0xff00, 0x6026, 0x1078, 0x39de, 0x0040, 0x1ce3,
++	0x1078, 0x1b78, 0x0078, 0x1ce3, 0x2009, 0x0017, 0x0078, 0x1fb6,
++	0x2009, 0x000e, 0x0078, 0x1fb6, 0x2009, 0x0007, 0x0078, 0x1fb6,
++	0x2009, 0x0035, 0x0078, 0x1fb6, 0x2009, 0x003e, 0x0078, 0x1fb6,
++	0x2009, 0x0004, 0x0078, 0x1fb6, 0x2009, 0x0006, 0x0078, 0x1fb6,
++	0x2009, 0x0016, 0x0078, 0x1fb6, 0x2009, 0x0001, 0x6024, 0xa084,
++	0xff00, 0xa105, 0x6026, 0x2091, 0x8000, 0x1078, 0x1c5f, 0x2091,
++	0x8001, 0x0078, 0x1ce3, 0x1078, 0x1948, 0x0078, 0x1ce3, 0x78d4,
++	0xa06d, 0x00c0, 0x1fd2, 0x2c00, 0x78d6, 0x78da, 0x609f, 0x0000,
++	0x0078, 0x1fde, 0x2c00, 0x689e, 0x609f, 0x0000, 0x78d6, 0x2d00,
++	0x6002, 0x78d8, 0xad06, 0x00c0, 0x1fde, 0x6002, 0x78d0, 0x8001,
++	0x78d2, 0x00c0, 0x1fea, 0x78dc, 0xa084, 0xfeff, 0x78de, 0x78d8,
++	0x2060, 0xa006, 0x007c, 0xa02e, 0x2530, 0x611c, 0x61a2, 0xa184,
++	0xe1ff, 0x601e, 0xa184, 0x0060, 0x0040, 0x1ffa, 0x0e7e, 0x1078,
++	0x47c2, 0x0e7f, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000,
++	0x60b3, 0x0000, 0x6714, 0x1078, 0x1973, 0x2091, 0x8000, 0x60a0,
++	0xa084, 0x8000, 0x00c0, 0x2021, 0x6808, 0xa084, 0x0001, 0x0040,
++	0x2021, 0x2091, 0x8001, 0x1078, 0x19c0, 0x2091, 0x8000, 0x1078,
++	0x1c5f, 0x2091, 0x8001, 0x78d7, 0x0000, 0x78db, 0x0000, 0x0078,
++	0x2093, 0x6024, 0xa096, 0x0001, 0x00c0, 0x2028, 0x8000, 0x6026,
++	0x6a10, 0x6814, 0x2091, 0x8001, 0xa202, 0x0048, 0x2037, 0x0040,
++	0x2037, 0x2039, 0x0200, 0x1078, 0x2094, 0x0078, 0x2093, 0x2c08,
++	0x2091, 0x8000, 0x60a0, 0xa084, 0x8000, 0x0040, 0x2064, 0x6800,
++	0xa065, 0x0040, 0x2069, 0x6a04, 0x0e7e, 0x2071, 0x5140, 0x7000,
++	0xa084, 0x0001, 0x0040, 0x205e, 0x7048, 0xa206, 0x00c0, 0x205e,
++	0x6b04, 0x231c, 0x2160, 0x6302, 0x2300, 0xa005, 0x00c0, 0x2059,
++	0x6902, 0x2260, 0x6102, 0x0e7f, 0x0078, 0x2070, 0x2160, 0x6202,
++	0x6906, 0x0e7f, 0x0078, 0x2070, 0x6800, 0xa065, 0x0040, 0x2069,
++	0x6102, 0x6902, 0x00c0, 0x206d, 0x6906, 0x2160, 0x6003, 0x0000,
++	0x2160, 0x60a0, 0xa084, 0x8000, 0x0040, 0x207a, 0x6808, 0xa084,
++	0xfffc, 0x680a, 0x6810, 0x8000, 0x6812, 0x2091, 0x8001, 0x6808,
++	0xa08c, 0x0040, 0x0040, 0x2089, 0xa086, 0x0040, 0x680a, 0x1078,
++	0x19d1, 0x2091, 0x8000, 0x1078, 0x21d2, 0x2091, 0x8001, 0x78db,
++	0x0000, 0x78d7, 0x0000, 0x007c, 0x6008, 0xa705, 0x600a, 0x2091,
++	0x8000, 0x1078, 0x1c5f, 0x2091, 0x8001, 0x78d8, 0xa065, 0x0040,
++	0x20a7, 0x609c, 0x78da, 0x609f, 0x0000, 0x0078, 0x2097, 0x78d7,
++	0x0000, 0x78db, 0x0000, 0x007c, 0x7990, 0x7894, 0x8000, 0xa10a,
++	0x00c8, 0x20b3, 0xa006, 0x7896, 0x70d2, 0x7804, 0xa005, 0x0040,
++	0x20c1, 0x8001, 0x7806, 0x00c0, 0x20c1, 0x0068, 0x20c1, 0x2091,
++	0x4080, 0x007c, 0x2039, 0x20da, 0x0078, 0x20c8, 0x2039, 0x20e0,
++	0x2704, 0xa005, 0x0040, 0x20d9, 0xac00, 0x2068, 0x6b08, 0x6c0c,
++	0x6910, 0x6a14, 0x690a, 0x6a0e, 0x6b12, 0x6c16, 0x8738, 0x0078,
++	0x20c8, 0x007c, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b, 0x0000,
++	0x0015, 0x001b, 0x0000, 0x0c7e, 0x1078, 0x3b69, 0x2c68, 0x0c7f,
++	0x007c, 0x0010, 0x215a, 0x0068, 0x215a, 0x2029, 0x0000, 0x78cb,
++	0x0000, 0x788c, 0xa065, 0x0040, 0x2153, 0x2009, 0x5174, 0x2104,
++	0xa084, 0x0001, 0x0040, 0x2121, 0x6004, 0xa086, 0x0103, 0x00c0,
++	0x2121, 0x6018, 0xa005, 0x00c0, 0x2121, 0x6014, 0xa005, 0x00c0,
++	0x2121, 0x0d7e, 0x2069, 0x0000, 0x6818, 0xa084, 0x0001, 0x00c0,
++	0x2120, 0x600c, 0x70c6, 0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b,
++	0x0001, 0x2091, 0x4080, 0x0d7f, 0x1078, 0x1c86, 0x0078, 0x2158,
++	0x0d7f, 0x1078, 0x215b, 0x0040, 0x2153, 0x6204, 0xa294, 0x00ff,
++	0xa296, 0x0003, 0x0040, 0x2133, 0x6204, 0xa296, 0x0110, 0x00c0,
++	0x2141, 0x78cb, 0x0001, 0x6204, 0xa294, 0xff00, 0x8217, 0x8211,
++	0x0040, 0x2141, 0x85ff, 0x00c0, 0x2153, 0x8210, 0xa202, 0x00c8,
++	0x2153, 0x057e, 0x1078, 0x216a, 0x057f, 0x0040, 0x214e, 0x78e0,
++	0xa086, 0x0003, 0x0040, 0x2153, 0x0078, 0x2141, 0x8528, 0x78c8,
++	0xa005, 0x0040, 0x20f1, 0x85ff, 0x0040, 0x215a, 0x2091, 0x4080,
++	0x78b0, 0x70d6, 0x007c, 0x7bac, 0x79b0, 0x70d4, 0xa102, 0x00c0,
++	0x2164, 0x2300, 0xa005, 0x007c, 0x0048, 0x2168, 0xa302, 0x007c,
++	0x8002, 0x007c, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8,
++	0x2184, 0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0,
++	0x21b9, 0x7008, 0x7208, 0xa206, 0x00c0, 0x21b9, 0xa286, 0x0008,
++	0x00c0, 0x21b9, 0x2071, 0x0010, 0x1078, 0x21be, 0x2009, 0x0020,
++	0x6004, 0xa086, 0x0103, 0x00c0, 0x2193, 0x6028, 0xa005, 0x00c0,
++	0x2193, 0x2009, 0x000c, 0x1078, 0x1924, 0x0040, 0x21ac, 0x78c4,
++	0x8000, 0x78c6, 0xa086, 0x0002, 0x00c0, 0x21b9, 0x2091, 0x8000,
++	0x78e3, 0x0003, 0x78c7, 0x0000, 0x78cc, 0xa085, 0x0300, 0x78ce,
++	0x2091, 0x8001, 0x0078, 0x21b9, 0x78c7, 0x0000, 0x1078, 0x1c86,
++	0x79ac, 0x78b0, 0x8000, 0xa10a, 0x00c8, 0x21b7, 0xa006, 0x78b2,
++	0xa006, 0x2071, 0x0010, 0x2091, 0x8001, 0x007c, 0x8107, 0x8004,
++	0x8004, 0x7ab8, 0x7bb4, 0x7cc0, 0x7dbc, 0xa210, 0xa399, 0x0000,
++	0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c, 0x2009, 0x515b, 0x2091,
++	0x8000, 0x200a, 0x0f7e, 0x0e7e, 0x2071, 0x5140, 0x7000, 0xa086,
++	0x0000, 0x00c0, 0x21ec, 0x2009, 0x5112, 0x2104, 0xa005, 0x00c0,
++	0x21ec, 0x2079, 0x0100, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x21ec,
++	0x0018, 0x21ec, 0x781b, 0x004b, 0x0e7f, 0x0f7f, 0x007c, 0x0f7e,
++	0x0e7e, 0x2071, 0x5140, 0x2091, 0x8000, 0x7000, 0xa086, 0x0000,
++	0x00c0, 0x2205, 0x2079, 0x0100, 0x7830, 0xa084, 0x00c0, 0x00c0,
++	0x2205, 0x0018, 0x2205, 0x781b, 0x004d, 0x2091, 0x8001, 0x0e7f,
++	0x0f7f, 0x007c, 0x127e, 0x2091, 0x2300, 0x2071, 0x5140, 0x2079,
++	0x0100, 0x784b, 0x000f, 0x0098, 0x2218, 0x7838, 0x0078, 0x2211,
++	0x20a9, 0x0040, 0x7800, 0xa082, 0x0004, 0x0048, 0x2221, 0x20a9,
++	0x0060, 0x789b, 0x0000, 0x78af, 0x0000, 0x78af, 0x0000, 0x0070,
++	0x222b, 0x0078, 0x2223, 0x7800, 0xa082, 0x0004, 0x0048, 0x223a,
++	0x70b7, 0x0096, 0x2019, 0x4ee7, 0x1078, 0x2276, 0x702f, 0x8001,
++	0x0078, 0x2246, 0x70b7, 0x0000, 0x2019, 0x4d5f, 0x1078, 0x2276,
++	0x2019, 0x4d9e, 0x1078, 0x2276, 0x702f, 0x8000, 0x7003, 0x0000,
++	0x1078, 0x237f, 0x7004, 0xa084, 0x000f, 0x017e, 0x2009, 0x04fd,
++	0x210c, 0xa18a, 0x0005, 0x0048, 0x225b, 0x0038, 0x2261, 0xa085,
++	0x6280, 0x0078, 0x2263, 0x0028, 0x2261, 0xa085, 0x6280, 0x0078,
++	0x2263, 0xa085, 0x62c0, 0x017f, 0x7806, 0x780f, 0xb204, 0x7843,
++	0x00d8, 0x7853, 0x0080, 0x780b, 0x0008, 0x7047, 0x0008, 0x7053,
++	0x517f, 0x704f, 0x0000, 0x127f, 0x2000, 0x007c, 0x137e, 0x147e,
++	0x157e, 0x047e, 0x20a1, 0x012b, 0x2304, 0xa005, 0x789a, 0x0040,
++	0x2296, 0x8318, 0x2324, 0x8318, 0x2398, 0x24a8, 0xa484, 0xff00,
++	0x0040, 0x228e, 0xa482, 0x0100, 0x20a9, 0x0100, 0x2020, 0x53a6,
++	0xa005, 0x00c0, 0x2285, 0x3318, 0x0078, 0x227c, 0x047f, 0x157f,
++	0x147f, 0x137f, 0x007c, 0xa18c, 0x000f, 0x2011, 0x0101, 0x2204,
++	0xa084, 0xfff0, 0xa105, 0x2012, 0x1078, 0x237f, 0x007c, 0x2011,
++	0x0101, 0x20a9, 0x0009, 0x810b, 0x0070, 0x22b0, 0x0078, 0x22ab,
++	0xa18c, 0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c,
++	0x2009, 0x0101, 0x20a9, 0x0005, 0x8213, 0x0070, 0x22c1, 0x0078,
++	0x22bc, 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205, 0x200a,
++	0x007c, 0x2011, 0x0101, 0x20a9, 0x000c, 0x810b, 0x0070, 0x22d2,
++	0x0078, 0x22cd, 0xa18c, 0xf000, 0x2204, 0xa084, 0x0fff, 0xa105,
++	0x2012, 0x007c, 0x2011, 0x0102, 0x2204, 0xa084, 0xffcf, 0xa105,
++	0x2012, 0x007c, 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061,
++	0x0100, 0x609a, 0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x8103, 0x8003,
++	0xa080, 0x0022, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0xa084,
++	0xffdf, 0x60ae, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0022,
++	0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0xa085, 0x0020, 0x60ae,
++	0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061,
++	0x0100, 0x609a, 0x60a4, 0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018,
++	0x0c7f, 0x007c, 0x2091, 0x8000, 0x0c7e, 0x0e7e, 0x6818, 0xa005,
++	0x0040, 0x235d, 0x2061, 0x7500, 0x1078, 0x2365, 0x0040, 0x2349,
++	0x20a9, 0x0000, 0x2061, 0x7400, 0x0c7e, 0x1078, 0x2365, 0x0040,
++	0x2339, 0x0c7f, 0x8c60, 0x0070, 0x2337, 0x0078, 0x232c, 0x0078,
++	0x235d, 0x007f, 0xa082, 0x7400, 0x2071, 0x5140, 0x7086, 0x7182,
++	0x2001, 0x0004, 0x706e, 0x7093, 0x000f, 0x1078, 0x21cd, 0x0078,
++	0x2359, 0x60c0, 0xa005, 0x00c0, 0x235d, 0x2071, 0x5140, 0x7182,
++	0x2c00, 0x708a, 0x2001, 0x0006, 0x706e, 0x7093, 0x000f, 0x1078,
++	0x21cd, 0x2001, 0x0000, 0x0078, 0x235f, 0x2001, 0x0001, 0x2091,
++	0x8001, 0xa005, 0x0e7f, 0x0c7f, 0x007c, 0x2c04, 0xa005, 0x0040,
++	0x237c, 0x2060, 0x600c, 0xa306, 0x00c0, 0x2379, 0x6010, 0xa206,
++	0x00c0, 0x2379, 0x6014, 0xa106, 0x00c0, 0x2379, 0xa006, 0x0078,
++	0x237e, 0x6000, 0x0078, 0x2366, 0xa085, 0x0001, 0x007c, 0x2011,
++	0x5141, 0x220c, 0xa18c, 0x000f, 0x2011, 0x013b, 0x2204, 0xa084,
++	0x0100, 0x0040, 0x2395, 0x2021, 0xff04, 0x2122, 0x810b, 0x810b,
++	0x810b, 0x810b, 0xa18d, 0x0f00, 0x2104, 0x007c, 0x0e7e, 0x68e4,
++	0xa08c, 0x0020, 0x0040, 0x23e9, 0xa084, 0x0006, 0x00c0, 0x23e9,
++	0x6014, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0f0,
++	0x5380, 0x7004, 0xa084, 0x000a, 0x00c0, 0x23e9, 0x7108, 0xa194,
++	0xff00, 0x0040, 0x23e9, 0xa18c, 0x00ff, 0x2001, 0x000c, 0xa106,
++	0x0040, 0x23d0, 0x2001, 0x0012, 0xa106, 0x0040, 0x23d4, 0x2001,
++	0x0014, 0xa106, 0x0040, 0x23d8, 0x2001, 0x0019, 0xa106, 0x0040,
++	0x23dc, 0x2001, 0x0032, 0xa106, 0x0040, 0x23e0, 0x0078, 0x23e4,
++	0x2009, 0x0012, 0x0078, 0x23e6, 0x2009, 0x0014, 0x0078, 0x23e6,
++	0x2009, 0x0019, 0x0078, 0x23e6, 0x2009, 0x0020, 0x0078, 0x23e6,
++	0x2009, 0x003f, 0x0078, 0x23e6, 0x2011, 0x0000, 0x2100, 0xa205,
++	0x700a, 0x0e7f, 0x007c, 0x0068, 0x23eb, 0x2091, 0x8000, 0x2071,
++	0x0000, 0x007e, 0x7018, 0xa084, 0x0001, 0x00c0, 0x23f2, 0x007f,
++	0x2071, 0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002, 0x70db,
++	0x0741, 0x70df, 0x0000, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091,
++	0x4080, 0x0078, 0x2409, 0x107e, 0x007e, 0x127e, 0x2091, 0x2300,
++	0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x77c2, 0x74c6, 0x76ca, 0x75ce,
++	0xa594, 0x003f, 0xa49c, 0x0003, 0xa484, 0x000f, 0x0079, 0x2420,
++	0x2432, 0x2432, 0x2432, 0x276c, 0x393b, 0x2430, 0x2461, 0x246b,
++	0x2430, 0x2430, 0x2430, 0x2430, 0x2430, 0x2430, 0x2430, 0x2430,
++	0x1078, 0x23eb, 0x8507, 0xa084, 0x001f, 0x0079, 0x2437, 0x2475,
++	0x276c, 0x2926, 0x2a23, 0x2a4b, 0x2ced, 0x2f98, 0x2fdb, 0x3026,
++	0x30ab, 0x3163, 0x320c, 0x2461, 0x2848, 0x2f6d, 0x2457, 0x3cc8,
++	0x3ce8, 0x3eae, 0x3eba, 0x3f8f, 0x2457, 0x2457, 0x4062, 0x4066,
++	0x3cc6, 0x2457, 0x3e19, 0x2457, 0x3b8c, 0x246b, 0x2457, 0x1078,
++	0x23eb, 0x0018, 0x2410, 0x127f, 0x2091, 0x8001, 0x007f, 0x107f,
++	0x007c, 0x2019, 0x4e3b, 0x1078, 0x2276, 0x702f, 0x0001, 0x781b,
++	0x004f, 0x0078, 0x2459, 0x2019, 0x4d9e, 0x1078, 0x2276, 0x702f,
++	0x8000, 0x781b, 0x00d0, 0x0078, 0x2459, 0x7242, 0x2009, 0x510f,
++	0x200b, 0x0000, 0xa584, 0x0001, 0x00c0, 0x3ba0, 0x0040, 0x2492,
++	0x1078, 0x23eb, 0x7003, 0x0000, 0x704b, 0x0000, 0x7043, 0x0000,
++	0x7037, 0x0000, 0x1078, 0x3912, 0x0018, 0x2410, 0x2009, 0x510f,
++	0x200b, 0x0000, 0x7068, 0xa005, 0x00c0, 0x255d, 0x706c, 0xa084,
++	0x0007, 0x0079, 0x249b, 0x2594, 0x24a3, 0x24af, 0x24cc, 0x24ee,
++	0x253b, 0x2514, 0x24a3, 0x1078, 0x38fa, 0x2009, 0x0048, 0x1078,
++	0x2e39, 0x00c0, 0x24ad, 0x7003, 0x0004, 0x0078, 0x2459, 0x1078,
++	0x38fa, 0x00c0, 0x24ca, 0x7080, 0x8007, 0x7882, 0x789b, 0x0010,
++	0x78ab, 0x000c, 0x789b, 0x0060, 0x78ab, 0x0001, 0x785b, 0x0004,
++	0x2009, 0x00e0, 0x1078, 0x2e2d, 0x00c0, 0x24ca, 0x7003, 0x0004,
++	0x7093, 0x000f, 0x0078, 0x2459, 0x1078, 0x38fa, 0x00c0, 0x24ec,
++	0x7180, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x001f, 0xa18d,
++	0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab, 0x0002,
++	0x785b, 0x0004, 0x2009, 0x00e0, 0x1078, 0x2e2d, 0x00c0, 0x24ec,
++	0x7003, 0x0004, 0x7093, 0x000f, 0x0078, 0x2459, 0x1078, 0x38fa,
++	0x00c0, 0x2512, 0x7180, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c,
++	0x001f, 0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0020, 0x7184, 0x79aa,
++	0x78ab, 0x000d, 0x789b, 0x0060, 0x78ab, 0x0004, 0x785b, 0x0004,
++	0x2009, 0x00e0, 0x1078, 0x2e2d, 0x00c0, 0x2512, 0x7003, 0x0004,
++	0x7093, 0x000f, 0x0078, 0x2459, 0x1078, 0x38fa, 0x00c0, 0x2539,
++	0x7180, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x001f, 0xa18d,
++	0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab, 0x0002,
++	0x785b, 0x0004, 0x2009, 0x00e0, 0x1078, 0x2e2d, 0x00c0, 0x2539,
++	0x7088, 0x708b, 0x0000, 0x2068, 0x704a, 0x7003, 0x0002, 0x7093,
++	0x000f, 0x0078, 0x2459, 0x1078, 0x38fa, 0x00c0, 0x2459, 0x7088,
++	0x2068, 0x6f14, 0x1078, 0x37ef, 0x2c50, 0x1078, 0x39ac, 0x789b,
++	0x0010, 0x6814, 0xa084, 0x001f, 0xa085, 0x0080, 0x78aa, 0x6e1c,
++	0x2041, 0x0001, 0x708c, 0xa084, 0x0400, 0x2001, 0x0004, 0x0040,
++	0x255b, 0x2001, 0x0006, 0x0078, 0x267c, 0x1078, 0x38fa, 0x00c0,
++	0x2459, 0x789b, 0x0010, 0x7068, 0x2068, 0x6f14, 0x1078, 0x37ef,
++	0x2c50, 0x1078, 0x39ac, 0x6008, 0xa085, 0x0010, 0x600a, 0x6824,
++	0xa005, 0x0040, 0x257b, 0xa082, 0x0006, 0x0048, 0x2579, 0x0078,
++	0x257b, 0x6827, 0x0005, 0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0,
++	0x7058, 0xa084, 0x8000, 0x0040, 0x2589, 0xa684, 0x0001, 0x0040,
++	0x258b, 0xa39c, 0xffbf, 0x7baa, 0x2031, 0x0020, 0x2041, 0x0001,
++	0x2001, 0x0003, 0x0078, 0x267c, 0x0018, 0x2410, 0x744c, 0xa485,
++	0x0000, 0x0040, 0x25ae, 0xa080, 0x5180, 0x2030, 0x7150, 0x8108,
++	0xa12a, 0x0048, 0x25a5, 0x2009, 0x5180, 0x2164, 0x6504, 0x85ff,
++	0x00c0, 0x25bf, 0x8421, 0x00c0, 0x259f, 0x7152, 0x7003, 0x0000,
++	0x704b, 0x0000, 0x7040, 0xa005, 0x0040, 0x3ba0, 0x0078, 0x2459,
++	0x764c, 0xa6b0, 0x5180, 0x7150, 0x2600, 0x0078, 0x25aa, 0x7152,
++	0x2568, 0x2558, 0x754a, 0x2c50, 0x6034, 0xa085, 0x0000, 0x00c0,
++	0x25bc, 0x6708, 0x773a, 0xa784, 0x033f, 0x0040, 0x25f5, 0xa784,
++	0x0021, 0x00c0, 0x25bc, 0xa784, 0x0002, 0x0040, 0x25de, 0xa784,
++	0x0004, 0x0040, 0x25bc, 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0008,
++	0x00c0, 0x25bc, 0xa784, 0x0010, 0x00c0, 0x25bc, 0xa784, 0x0200,
++	0x00c0, 0x25bc, 0xa784, 0x0100, 0x0040, 0x25f5, 0x6018, 0xa005,
++	0x00c0, 0x25bc, 0xa7bc, 0xfeff, 0x670a, 0x6823, 0x0000, 0x6e1c,
++	0xa684, 0x000e, 0x6118, 0x0040, 0x2605, 0x601c, 0xa102, 0x0048,
++	0x2608, 0x0040, 0x2608, 0x0078, 0x25b8, 0x81ff, 0x00c0, 0x25b8,
++	0x68c3, 0x0000, 0xa784, 0x0080, 0x00c0, 0x2610, 0x700c, 0x6022,
++	0xa7bc, 0xff7f, 0x670a, 0x1078, 0x39ac, 0x0018, 0x2410, 0x789b,
++	0x0010, 0xa046, 0x1078, 0x38fa, 0x00c0, 0x2459, 0x6b14, 0xa39c,
++	0x001f, 0xa39d, 0x00c0, 0x7058, 0xa084, 0x8000, 0x0040, 0x262c,
++	0xa684, 0x0001, 0x0040, 0x262e, 0xa39c, 0xffbf, 0xa684, 0x0010,
++	0x0040, 0x2634, 0xa39d, 0x0020, 0x7baa, 0x8840, 0xa684, 0x000e,
++	0x00c0, 0x263f, 0xa7bd, 0x0010, 0x670a, 0x0078, 0x267a, 0x7158,
++	0xa18c, 0x0800, 0x0040, 0x3401, 0x2011, 0x0020, 0xa684, 0x0008,
++	0x00c0, 0x2650, 0x8210, 0xa684, 0x0002, 0x00c0, 0x2650, 0x8210,
++	0x7aaa, 0x8840, 0x1078, 0x3912, 0x6a14, 0x610c, 0x8108, 0xa18c,
++	0x00ff, 0xa1e0, 0x7400, 0x2c64, 0x8cff, 0x0040, 0x2671, 0x6014,
++	0xa206, 0x00c0, 0x265b, 0x60b8, 0x8001, 0x60ba, 0x00c0, 0x2656,
++	0x0c7e, 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x0c7f, 0x0078,
++	0x2594, 0x1078, 0x38fa, 0x00c0, 0x2459, 0x2a60, 0x610e, 0x79aa,
++	0x8840, 0x7132, 0x2001, 0x0001, 0x007e, 0x715c, 0xa184, 0x0018,
++	0x0040, 0x2697, 0xa184, 0x0010, 0x0040, 0x268a, 0x1078, 0x3604,
++	0x00c0, 0x26ba, 0xa184, 0x0008, 0x0040, 0x2697, 0x69a0, 0xa184,
++	0x0600, 0x00c0, 0x2697, 0x1078, 0x34f1, 0x0078, 0x26ba, 0x69a0,
++	0xa184, 0x0800, 0x0040, 0x26ae, 0x0c7e, 0x027e, 0x2960, 0x6000,
++	0xa085, 0x2000, 0x6002, 0x6104, 0xa18d, 0x0010, 0x6106, 0x027f,
++	0x0c7f, 0x1078, 0x3604, 0x00c0, 0x26ba, 0x69a0, 0xa184, 0x0200,
++	0x0040, 0x26b6, 0x1078, 0x3540, 0x0078, 0x26ba, 0xa184, 0x0400,
++	0x00c0, 0x2693, 0x69a0, 0xa184, 0x1000, 0x0040, 0x26c5, 0x6914,
++	0xa18c, 0xff00, 0x810f, 0x1078, 0x22ee, 0x007f, 0x7002, 0xa68c,
++	0x00e0, 0xa684, 0x0060, 0x0040, 0x26d3, 0xa086, 0x0060, 0x00c0,
++	0x26d3, 0xa18d, 0x4000, 0x88ff, 0x0040, 0x26d8, 0xa18d, 0x0004,
++	0x795a, 0x69b6, 0x789b, 0x0060, 0x2800, 0x78aa, 0x789b, 0x0061,
++	0x6818, 0xa08d, 0x8000, 0xa084, 0x7fff, 0x691a, 0xa68c, 0x0080,
++	0x0040, 0x26f7, 0x7097, 0x0000, 0xa08a, 0x000d, 0x0050, 0x26f5,
++	0xa08a, 0x000c, 0x7196, 0x2001, 0x000c, 0x800c, 0x719a, 0x78aa,
++	0x8008, 0x810c, 0x0040, 0x3407, 0xa18c, 0x00f8, 0x00c0, 0x3407,
++	0x157e, 0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8000,
++	0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f,
++	0x6814, 0x8007, 0x7882, 0x6d94, 0x7dd6, 0x7dde, 0x6e98, 0x7ed2,
++	0x7eda, 0x1078, 0x38fa, 0x00c0, 0x272e, 0x702c, 0x8003, 0x0048,
++	0x2727, 0x2019, 0x4d9e, 0x1078, 0x2276, 0x702f, 0x8000, 0x7830,
++	0xa084, 0x00c0, 0x00c0, 0x272e, 0x0098, 0x2736, 0x6008, 0xa084,
++	0xffef, 0x600a, 0x1078, 0x3912, 0x0078, 0x2482, 0x7200, 0xa284,
++	0x0007, 0xa086, 0x0001, 0x00c0, 0x2743, 0x781b, 0x004f, 0x1078,
++	0x3912, 0x0078, 0x2754, 0x6ab4, 0xa295, 0x2000, 0x7a5a, 0x781b,
++	0x004f, 0x1078, 0x3912, 0x7200, 0x2500, 0xa605, 0x0040, 0x2754,
++	0xa284, 0x0007, 0x1079, 0x2762, 0xad80, 0x0009, 0x7036, 0xa284,
++	0x0007, 0xa086, 0x0001, 0x00c0, 0x2459, 0x6018, 0x8000, 0x601a,
++	0x0078, 0x2459, 0x276a, 0x4a3a, 0x4a3a, 0x4a29, 0x4a3a, 0x276a,
++	0x4a29, 0x276a, 0x1078, 0x23eb, 0x1078, 0x38fa, 0x0f7e, 0x2079,
++	0x5100, 0x78cc, 0x0f7f, 0xa084, 0x0001, 0x0040, 0x2790, 0x706c,
++	0xa086, 0x0001, 0x00c0, 0x277f, 0x706e, 0x0078, 0x2823, 0x706c,
++	0xa086, 0x0005, 0x00c0, 0x278e, 0x7088, 0x2068, 0x681b, 0x0004,
++	0x6817, 0x0000, 0x6820, 0xa085, 0x0008, 0x6822, 0x706f, 0x0000,
++	0x2011, 0x0004, 0x716c, 0xa186, 0x0001, 0x0040, 0x27b1, 0xa186,
++	0x0007, 0x00c0, 0x27a1, 0x2009, 0x5138, 0x200b, 0x0005, 0x0078,
++	0x27b1, 0x2009, 0x5113, 0x2104, 0x2009, 0x5112, 0x200a, 0x2009,
++	0x5138, 0x200b, 0x0001, 0x706f, 0x0000, 0x7073, 0x0001, 0x0078,
++	0x27b3, 0x706f, 0x0000, 0x1078, 0x4776, 0x157e, 0x20a9, 0x0010,
++	0x2039, 0x0000, 0x1078, 0x36e2, 0xa7b8, 0x0100, 0x0070, 0x27c2,
++	0x0078, 0x27ba, 0x157f, 0x7000, 0x0079, 0x27c6, 0x27f4, 0x27db,
++	0x27db, 0x27ce, 0x27f4, 0x27f4, 0x27f4, 0x27f4, 0x2021, 0x515a,
++	0x2404, 0xa005, 0x0040, 0x27f4, 0xad06, 0x00c0, 0x27db, 0x6800,
++	0x2022, 0x0078, 0x27eb, 0x6820, 0xa084, 0x0001, 0x00c0, 0x27e7,
++	0x6f14, 0x1078, 0x37ef, 0x1078, 0x33d8, 0x0078, 0x27eb, 0x7060,
++	0x2060, 0x6800, 0x6002, 0x6a1a, 0x6817, 0x0000, 0x6820, 0xa085,
++	0x0008, 0x6822, 0x1078, 0x1c70, 0x2021, 0x7500, 0x1078, 0x2830,
++	0x2021, 0x515a, 0x1078, 0x2830, 0x157e, 0x20a9, 0x0000, 0x2021,
++	0x7400, 0x1078, 0x2830, 0x8420, 0x0070, 0x2808, 0x0078, 0x2801,
++	0x2061, 0x5400, 0x2021, 0x0002, 0x20a9, 0x0100, 0x6018, 0x6110,
++	0x81ff, 0x0040, 0x2817, 0xa102, 0x0050, 0x2817, 0x6012, 0x601b,
++	0x0000, 0xace0, 0x0010, 0x0070, 0x281f, 0x0078, 0x280e, 0x8421,
++	0x00c0, 0x280c, 0x157f, 0x709c, 0xa084, 0x8000, 0x0040, 0x282a,
++	0x1078, 0x3a00, 0x7003, 0x0000, 0x704b, 0x0000, 0x0078, 0x2459,
++	0x047e, 0x2404, 0xa005, 0x0040, 0x2844, 0x2068, 0x6800, 0x007e,
++	0x6a1a, 0x6817, 0x0000, 0x6820, 0xa085, 0x0008, 0x6822, 0x1078,
++	0x1c70, 0x007f, 0x0078, 0x2832, 0x047f, 0x2023, 0x0000, 0x007c,
++	0xa282, 0x0003, 0x0050, 0x284e, 0x1078, 0x23eb, 0x2300, 0x0079,
++	0x2851, 0x2854, 0x28c7, 0x28e4, 0xa282, 0x0002, 0x0040, 0x285a,
++	0x1078, 0x23eb, 0x706c, 0x706f, 0x0000, 0x7093, 0x0000, 0x0079,
++	0x2861, 0x2869, 0x2869, 0x286b, 0x289f, 0x340d, 0x2869, 0x289f,
++	0x2869, 0x1078, 0x23eb, 0x7780, 0x1078, 0x36e2, 0x7780, 0xa7bc,
++	0x0f00, 0x1078, 0x37ef, 0x6018, 0xa005, 0x0040, 0x2896, 0x2021,
++	0x7500, 0x2009, 0x0004, 0x2011, 0x0010, 0x1078, 0x28ff, 0x0040,
++	0x2896, 0x157e, 0x20a9, 0x0000, 0x2021, 0x7400, 0x047e, 0x2009,
++	0x0004, 0x2011, 0x0010, 0x1078, 0x28ff, 0x047f, 0x0040, 0x2895,
++	0x8420, 0x0070, 0x2895, 0x0078, 0x2886, 0x157f, 0x8738, 0xa784,
++	0x001f, 0x00c0, 0x2871, 0x0078, 0x2482, 0x0078, 0x2482, 0x7780,
++	0x1078, 0x37ef, 0x6018, 0xa005, 0x0040, 0x28c5, 0x2021, 0x7500,
++	0x2009, 0x0005, 0x2011, 0x0020, 0x1078, 0x28ff, 0x0040, 0x28c5,
++	0x157e, 0x20a9, 0x0000, 0x2021, 0x7400, 0x047e, 0x2009, 0x0005,
++	0x2011, 0x0020, 0x1078, 0x28ff, 0x047f, 0x0040, 0x28c4, 0x8420,
++	0x0070, 0x28c4, 0x0078, 0x28b5, 0x157f, 0x0078, 0x2482, 0x2200,
++	0x0079, 0x28ca, 0x28cd, 0x28cf, 0x28cf, 0x1078, 0x23eb, 0x2009,
++	0x0012, 0x706c, 0xa086, 0x0002, 0x0040, 0x28d8, 0x2009, 0x000e,
++	0x6818, 0xa084, 0x8000, 0x0040, 0x28de, 0x691a, 0x706f, 0x0000,
++	0x7073, 0x0001, 0x0078, 0x3888, 0x2200, 0x0079, 0x28e7, 0x28ec,
++	0x28cf, 0x28ea, 0x1078, 0x23eb, 0x1078, 0x4776, 0x7000, 0xa086,
++	0x0001, 0x00c0, 0x339d, 0x1078, 0x33ee, 0x6008, 0xa084, 0xffef,
++	0x600a, 0x1078, 0x3390, 0x0040, 0x339d, 0x0078, 0x2594, 0x2404,
++	0xa005, 0x0040, 0x2922, 0x2068, 0x2d04, 0x007e, 0x6814, 0xa706,
++	0x0040, 0x290e, 0x2d20, 0x007f, 0x0078, 0x2900, 0x007f, 0x2022,
++	0x691a, 0x6817, 0x0000, 0x6820, 0xa205, 0x6822, 0x1078, 0x1c70,
++	0x6010, 0x8001, 0x6012, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078,
++	0x33ee, 0x007c, 0xa085, 0x0001, 0x0078, 0x2921, 0x2300, 0x0079,
++	0x2929, 0x292e, 0x292c, 0x29c7, 0x1078, 0x23eb, 0x78ec, 0xa084,
++	0x0001, 0x00c0, 0x2942, 0x7000, 0xa086, 0x0004, 0x00c0, 0x293a,
++	0x0078, 0x2965, 0x1078, 0x33ee, 0x6008, 0xa084, 0xffef, 0x600a,
++	0x0078, 0x339d, 0x78e4, 0xa005, 0x00d0, 0x2965, 0x0018, 0x2459,
++	0x2008, 0xa084, 0x0030, 0x00c0, 0x2951, 0x781b, 0x004f, 0x0078,
++	0x2459, 0x78ec, 0xa084, 0x0003, 0x0040, 0x294d, 0x2100, 0xa084,
++	0x0007, 0x0079, 0x295b, 0x299e, 0x29a9, 0x298f, 0x2963, 0x38ed,
++	0x38ed, 0x2963, 0x29b8, 0x1078, 0x23eb, 0x7000, 0xa086, 0x0004,
++	0x00c0, 0x297f, 0x706c, 0xa086, 0x0002, 0x00c0, 0x2975, 0x2011,
++	0x0002, 0x2019, 0x0000, 0x0078, 0x2848, 0x706c, 0xa086, 0x0006,
++	0x0040, 0x296f, 0x706c, 0xa086, 0x0004, 0x0040, 0x296f, 0x79e4,
++	0xa184, 0x0030, 0x0040, 0x2989, 0x78ec, 0xa084, 0x0003, 0x00c0,
++	0x298b, 0x0078, 0x2f6d, 0x2001, 0x0003, 0x0078, 0x2d01, 0x6818,
++	0xa084, 0x8000, 0x0040, 0x2996, 0x681b, 0x001d, 0x1078, 0x36c1,
++	0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x2459, 0x6818, 0xa084,
++	0x8000, 0x0040, 0x29a5, 0x681b, 0x001d, 0x1078, 0x36c1, 0x0078,
++	0x38b8, 0x6818, 0xa084, 0x8000, 0x0040, 0x29b0, 0x681b, 0x001d,
++	0x1078, 0x36c1, 0x782b, 0x3008, 0x781b, 0x00cd, 0x0078, 0x2459,
++	0x6818, 0xa084, 0x8000, 0x0040, 0x29bf, 0x681b, 0x001d, 0x1078,
++	0x36c1, 0x782b, 0x3008, 0x781b, 0x008e, 0x0078, 0x2459, 0xa584,
++	0x000f, 0x00c0, 0x29e4, 0x7000, 0x0079, 0x29ce, 0x2482, 0x29d8,
++	0x29d6, 0x339d, 0x339d, 0x339d, 0x339d, 0x29d6, 0x1078, 0x23eb,
++	0x1078, 0x33ee, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x3390,
++	0x0040, 0x339d, 0x0078, 0x2594, 0x78e4, 0xa005, 0x00d0, 0x2965,
++	0x0018, 0x2965, 0x2008, 0xa084, 0x0030, 0x00c0, 0x29f3, 0x781b,
++	0x004f, 0x0078, 0x2459, 0x78ec, 0xa084, 0x0003, 0x0040, 0x29ef,
++	0x2100, 0xa184, 0x0007, 0x0079, 0x29fd, 0x2a0f, 0x2a13, 0x2a07,
++	0x2a05, 0x38ed, 0x38ed, 0x2a05, 0x38e3, 0x1078, 0x23eb, 0x1078,
++	0x36c9, 0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x2459, 0x1078,
++	0x36c9, 0x0078, 0x38b8, 0x1078, 0x36c9, 0x782b, 0x3008, 0x781b,
++	0x00cd, 0x0078, 0x2459, 0x1078, 0x36c9, 0x782b, 0x3008, 0x781b,
++	0x008e, 0x0078, 0x2459, 0x2300, 0x0079, 0x2a26, 0x2a2b, 0x2a29,
++	0x2a2d, 0x1078, 0x23eb, 0x0078, 0x30ab, 0x681b, 0x0008, 0x78a3,
++	0x0000, 0x79e4, 0xa184, 0x0030, 0x0040, 0x30ab, 0x78ec, 0xa084,
++	0x0003, 0x0040, 0x30ab, 0xa184, 0x0007, 0x0079, 0x2a3f, 0x2a47,
++	0x2a13, 0x298f, 0x3888, 0x38ed, 0x38ed, 0x2a47, 0x38e3, 0x1078,
++	0x389c, 0x0078, 0x2459, 0xa282, 0x0005, 0x0050, 0x2a51, 0x1078,
++	0x23eb, 0x2300, 0x0079, 0x2a54, 0x2a57, 0x2cae, 0x2cbc, 0x2200,
++	0x0079, 0x2a5a, 0x2a74, 0x2a61, 0x2a74, 0x2a5f, 0x2c93, 0x1078,
++	0x23eb, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa082, 0x0020,
++	0x0048, 0x369d, 0xa08a, 0x0004, 0x00c8, 0x369d, 0x0079, 0x2a70,
++	0x369d, 0x369d, 0x369d, 0x364b, 0x789b, 0x0018, 0x79a8, 0xa184,
++	0x0080, 0x0040, 0x2a85, 0x0078, 0x369d, 0x7000, 0xa005, 0x00c0,
++	0x2a7b, 0x2011, 0x0004, 0x0078, 0x321f, 0xa184, 0x00ff, 0xa08a,
++	0x0010, 0x00c8, 0x369d, 0x0079, 0x2a8d, 0x2a9f, 0x2a9d, 0x2ab7,
++	0x2abb, 0x2b78, 0x369d, 0x369d, 0x2b7a, 0x369d, 0x369d, 0x2c8f,
++	0x2c8f, 0x369d, 0x369d, 0x369d, 0x2c91, 0x1078, 0x23eb, 0xa684,
++	0x1000, 0x0040, 0x2aac, 0x2001, 0x0500, 0x8000, 0x8000, 0x783a,
++	0x781b, 0x008c, 0x0078, 0x2459, 0x6818, 0xa084, 0x8000, 0x0040,
++	0x2ab5, 0x681b, 0x001d, 0x0078, 0x2aa3, 0x0078, 0x3888, 0x681b,
++	0x001d, 0x0078, 0x36ad, 0x6920, 0x6922, 0xa684, 0x1800, 0x00c0,
++	0x2afc, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2b04, 0x6818, 0xa086,
++	0x0008, 0x00c0, 0x2acd, 0x681b, 0x0000, 0xa684, 0x0400, 0x0040,
++	0x2b74, 0xa684, 0x0080, 0x0040, 0x2af8, 0x7097, 0x0000, 0x6818,
++	0xa084, 0x003f, 0xa08a, 0x000d, 0x0050, 0x2af8, 0xa08a, 0x000c,
++	0x7196, 0x2001, 0x000c, 0x800c, 0x719a, 0x789b, 0x0061, 0x78aa,
++	0x157e, 0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8000,
++	0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f,
++	0x781b, 0x0058, 0x0078, 0x2459, 0xa684, 0x1000, 0x0040, 0x2b04,
++	0x781b, 0x0065, 0x0078, 0x2459, 0xa684, 0x0060, 0x0040, 0x2b70,
++	0xa684, 0x0800, 0x0040, 0x2b70, 0xa684, 0x8000, 0x00c0, 0x2b12,
++	0x0078, 0x2b2c, 0xa6b4, 0x7fff, 0x7e5a, 0x6eb6, 0x789b, 0x0076,
++	0x7aac, 0x79ac, 0x78ac, 0x801b, 0x00c8, 0x2b1f, 0x8000, 0xa084,
++	0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2,
++	0x6b94, 0x2200, 0xa303, 0x68ae, 0xa684, 0x4000, 0x0040, 0x2b34,
++	0xa6b4, 0xbfff, 0x7e5a, 0x6eb6, 0x7000, 0xa086, 0x0003, 0x00c0,
++	0x2b41, 0x1078, 0x482c, 0x1078, 0x4a29, 0x781b, 0x0064, 0x0078,
++	0x2459, 0xa006, 0x1078, 0x4b30, 0x6ab0, 0x69ac, 0x6c98, 0x6b94,
++	0x2200, 0xa105, 0x0040, 0x2b50, 0x2200, 0xa422, 0x2100, 0xa31b,
++	0x6caa, 0x7cd2, 0x7cda, 0x6ba6, 0x7bd6, 0x7bde, 0x2300, 0xa405,
++	0x00c0, 0x2b62, 0xa6b5, 0x4000, 0x7e5a, 0x6eb6, 0x781b, 0x0064,
++	0x0078, 0x2459, 0x781b, 0x0064, 0x2200, 0xa115, 0x00c0, 0x2b6c,
++	0x1078, 0x4a3a, 0x0078, 0x2459, 0x1078, 0x4a85, 0x0078, 0x2459,
++	0x781b, 0x0065, 0x0078, 0x2459, 0x781b, 0x0058, 0x0078, 0x2459,
++	0x1078, 0x23eb, 0x0078, 0x2bdb, 0x6920, 0xa184, 0x0100, 0x0040,
++	0x2b92, 0xa18c, 0xfeff, 0x6922, 0x0c7e, 0x7054, 0x2060, 0x6000,
++	0xa084, 0xefff, 0x6002, 0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f,
++	0x0078, 0x2bca, 0xa184, 0x0200, 0x0040, 0x2bca, 0xa18c, 0xfdff,
++	0x6922, 0x0c7e, 0x7054, 0x2060, 0x6000, 0xa084, 0xdfff, 0x6002,
++	0x6004, 0xa084, 0xffef, 0x6006, 0x2008, 0x2c48, 0x0c7f, 0xa184,
++	0x0008, 0x0040, 0x2bca, 0x1078, 0x37eb, 0x1078, 0x34f1, 0x88ff,
++	0x0040, 0x2bca, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5,
++	0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2bc4, 0x782b, 0x3008,
++	0x781b, 0x0056, 0x0078, 0x2459, 0x782b, 0x3008, 0x781b, 0x0065,
++	0x0078, 0x2459, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2bd3, 0x781b,
++	0x0058, 0x0078, 0x2459, 0x781b, 0x0065, 0x0078, 0x2459, 0x0078,
++	0x36a5, 0x0078, 0x36a5, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007,
++	0x00c0, 0x2be9, 0x6820, 0xa084, 0x0100, 0x0040, 0x2bd9, 0x2009,
++	0x0008, 0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001,
++	0x00c0, 0x2c20, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040,
++	0x2c18, 0x0048, 0x2bfd, 0x0078, 0x2c1a, 0xa380, 0x0002, 0xa102,
++	0x00c8, 0x2c18, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0c7e, 0x7054,
++	0x2060, 0x6000, 0xa084, 0xefef, 0x6002, 0x6004, 0xa084, 0xffe5,
++	0x6006, 0x0c7f, 0x7e58, 0xa6b4, 0xfffb, 0x7e5a, 0x0078, 0x2bcb,
++	0x0078, 0x2b7c, 0x24a8, 0x7aa8, 0x00f0, 0x2c1a, 0x0078, 0x2beb,
++	0xa284, 0x00f0, 0xa086, 0x0020, 0x00c0, 0x2c80, 0x8318, 0x8318,
++	0x2300, 0xa102, 0x0040, 0x2c30, 0x0048, 0x2c30, 0x0078, 0x2c7d,
++	0xa286, 0x0023, 0x0040, 0x2bd9, 0x681c, 0xa084, 0xfff1, 0x681e,
++	0x7e58, 0xa684, 0xfff1, 0xa085, 0x0010, 0x2030, 0x7e5a, 0x6008,
++	0xa085, 0x0010, 0x600a, 0x0c7e, 0x7054, 0x2060, 0x6004, 0x2008,
++	0x2c48, 0x0c7f, 0xa184, 0x0010, 0x0040, 0x2c54, 0x1078, 0x37eb,
++	0x1078, 0x3604, 0x0078, 0x2c63, 0x0c7e, 0x7054, 0x2060, 0x6004,
++	0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0008, 0x0040, 0x2bca, 0x1078,
++	0x37eb, 0x1078, 0x34f1, 0x88ff, 0x0040, 0x2bca, 0x789b, 0x0060,
++	0x2800, 0x78aa, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0,
++	0x2c77, 0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x2459, 0x782b,
++	0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0x7aa8, 0x0078, 0x2beb,
++	0x8318, 0x2300, 0xa102, 0x0040, 0x2c89, 0x0048, 0x2c89, 0x0078,
++	0x2beb, 0xa284, 0x0080, 0x00c0, 0x36ad, 0x0078, 0x36a5, 0x0078,
++	0x36ad, 0x0078, 0x369d, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff,
++	0xa08e, 0x0001, 0x0040, 0x2c9e, 0x1078, 0x23eb, 0x7aa8, 0xa294,
++	0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8, 0x369d,
++	0x0079, 0x2caa, 0x369d, 0x343e, 0x369d, 0x3599, 0xa282, 0x0000,
++	0x00c0, 0x2cb4, 0x1078, 0x23eb, 0x1078, 0x36c1, 0x782b, 0x3008,
++	0x781b, 0x0065, 0x0078, 0x2459, 0xa282, 0x0003, 0x00c0, 0x2cc2,
++	0x1078, 0x23eb, 0xa484, 0x8000, 0x00c0, 0x2ce5, 0x706c, 0xa005,
++	0x0040, 0x2ccc, 0x1078, 0x23eb, 0x6f14, 0x7782, 0xa7bc, 0x0f00,
++	0x1078, 0x37ef, 0x6008, 0xa085, 0x0021, 0x600a, 0x8738, 0xa784,
++	0x001f, 0x00c0, 0x2cd0, 0x1078, 0x36c5, 0x706f, 0x0002, 0x2009,
++	0x5138, 0x200b, 0x0009, 0x0078, 0x2ce7, 0x1078, 0x36d1, 0x782b,
++	0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0xa282, 0x0004, 0x0050,
++	0x2cf3, 0x1078, 0x23eb, 0x2300, 0x0079, 0x2cf6, 0x2cf9, 0x2de2,
++	0x2e15, 0xa286, 0x0003, 0x0040, 0x2cff, 0x1078, 0x23eb, 0x2001,
++	0x0000, 0x007e, 0x68c0, 0xa005, 0x0040, 0x2d08, 0x7003, 0x0003,
++	0x68a0, 0xa084, 0x2000, 0x0040, 0x2d11, 0x6008, 0xa085, 0x0002,
++	0x600a, 0x007f, 0x703e, 0x7000, 0xa084, 0x0007, 0x0079, 0x2d18,
++	0x2482, 0x2d22, 0x2d22, 0x2f17, 0x2f53, 0x2482, 0x2f53, 0x2d20,
++	0x1078, 0x23eb, 0xa684, 0x1000, 0x00c0, 0x2d2a, 0x1078, 0x4776,
++	0x0040, 0x2dbc, 0x7868, 0xa08c, 0x00ff, 0x0040, 0x2d72, 0xa186,
++	0x0008, 0x00c0, 0x2d41, 0x1078, 0x33ee, 0x6008, 0xa084, 0xffef,
++	0x600a, 0x1078, 0x3390, 0x0040, 0x2d72, 0x1078, 0x4776, 0x0078,
++	0x2d59, 0xa186, 0x0028, 0x00c0, 0x2d72, 0x1078, 0x4776, 0x6008,
++	0xa084, 0xffef, 0x600a, 0x6018, 0xa005, 0x0040, 0x2d59, 0x8001,
++	0x601a, 0xa005, 0x0040, 0x2d59, 0x8001, 0xa005, 0x0040, 0x2d59,
++	0x601e, 0x6820, 0xa084, 0x0001, 0x0040, 0x2482, 0x6820, 0xa084,
++	0xfffe, 0x6822, 0x7060, 0x0c7e, 0x2060, 0x6800, 0x6002, 0x0c7f,
++	0x6004, 0x6802, 0xa005, 0x2d00, 0x00c0, 0x2d6f, 0x6002, 0x6006,
++	0x0078, 0x2482, 0x017e, 0x1078, 0x2e46, 0x017f, 0xa684, 0xdf00,
++	0x681e, 0x682b, 0x0000, 0x6f14, 0x81ff, 0x0040, 0x2dbc, 0xa186,
++	0x0002, 0x00c0, 0x2dbc, 0xa684, 0x0800, 0x00c0, 0x2d8f, 0xa684,
++	0x0060, 0x0040, 0x2d8f, 0x78d8, 0x7adc, 0x682e, 0x6a32, 0x6820,
++	0xa084, 0x0800, 0x00c0, 0x2dbc, 0x8717, 0xa294, 0x000f, 0x8213,
++	0x8213, 0x8213, 0xa290, 0x5380, 0xa290, 0x0000, 0x221c, 0xa384,
++	0x0100, 0x00c0, 0x2da5, 0x0078, 0x2dab, 0x8210, 0x2204, 0xa085,
++	0x0018, 0x2012, 0x8211, 0xa384, 0x0400, 0x0040, 0x2db8, 0x68a0,
++	0xa084, 0x0100, 0x00c0, 0x2db8, 0x1078, 0x2eca, 0x0078, 0x2482,
++	0x6008, 0xa085, 0x0002, 0x600a, 0x6916, 0x6818, 0xa084, 0x8000,
++	0x0040, 0x2dc4, 0x703c, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x1078,
++	0x33df, 0x1078, 0x33ee, 0x00c0, 0x2dd1, 0x6008, 0xa084, 0xffef,
++	0x600a, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2dda, 0x1078, 0x33d8,
++	0x0078, 0x2dde, 0x7060, 0x2060, 0x6800, 0x6002, 0x1078, 0x1c70,
++	0x0078, 0x2482, 0xa282, 0x0004, 0x0048, 0x2de8, 0x1078, 0x23eb,
++	0x2200, 0x0079, 0x2deb, 0x2de6, 0x2def, 0x2dfc, 0x2def, 0x7000,
++	0xa086, 0x0005, 0x0040, 0x2df8, 0x1078, 0x36c1, 0x782b, 0x3008,
++	0x781b, 0x0065, 0x0078, 0x2459, 0x7890, 0x8007, 0x8001, 0xa084,
++	0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff, 0xa186,
++	0x0003, 0x0040, 0x2e11, 0xa186, 0x0000, 0x0040, 0x2e11, 0x0078,
++	0x369d, 0x781b, 0x0065, 0x0078, 0x2459, 0x6820, 0xa085, 0x0004,
++	0x6822, 0x82ff, 0x00c0, 0x2e20, 0x1078, 0x36c1, 0x0078, 0x2e27,
++	0x8211, 0x0040, 0x2e25, 0x1078, 0x23eb, 0x1078, 0x36d1, 0x782b,
++	0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0x702c, 0x8003, 0x0048,
++	0x2e37, 0x2019, 0x4d9e, 0x1078, 0x2276, 0x702f, 0x8000, 0x1078,
++	0x3912, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x2e43, 0x0018, 0x2e43,
++	0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0xa684, 0x0060,
++	0x00c0, 0x2e50, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x2ec9,
++	0xa684, 0x0800, 0x00c0, 0x2e72, 0x68b4, 0xa084, 0x4800, 0xa635,
++	0xa684, 0x0800, 0x00c0, 0x2e72, 0x6998, 0x6a94, 0x692e, 0x6a32,
++	0x703c, 0xa005, 0x00c0, 0x2e6a, 0x2200, 0xa105, 0x0040, 0x2e71,
++	0x703f, 0x0015, 0x7000, 0xa086, 0x0006, 0x0040, 0x2e71, 0x1078,
++	0x4776, 0x007c, 0xa684, 0x0020, 0x0040, 0x2e94, 0xa684, 0x4000,
++	0x0040, 0x2e80, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x2e6a,
++	0x68b4, 0xa084, 0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, 0x2e7a,
++	0x703c, 0xa005, 0x00c0, 0x2e8e, 0x703f, 0x0015, 0x79d8, 0x7adc,
++	0x692e, 0x6a32, 0x0078, 0x2e6a, 0xa684, 0x4000, 0x0040, 0x2e9e,
++	0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x2e6a, 0x68b4, 0xa084,
++	0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, 0x2e98, 0x703c, 0xa005,
++	0x00c0, 0x2eac, 0x703f, 0x0015, 0x79d8, 0x7adc, 0x78d0, 0x80fb,
++	0x00c8, 0x2eb3, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
++	0x692e, 0x6a32, 0x2100, 0xa205, 0x00c0, 0x2ec0, 0x0078, 0x2e6a,
++	0x7000, 0xa086, 0x0006, 0x0040, 0x2ec9, 0x1078, 0x4b30, 0x0078,
++	0x2e6a, 0x007c, 0x6008, 0xa085, 0x0200, 0x600a, 0xa384, 0x0200,
++	0x0040, 0x2ed6, 0x6008, 0xa085, 0x0002, 0x600a, 0x681b, 0x0006,
++	0x688f, 0x0000, 0x6893, 0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942,
++	0x682f, 0x0003, 0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000,
++	0x689b, 0x0020, 0x68b3, 0x0000, 0x68af, 0x0000, 0x7000, 0x0079,
++	0x2ef1, 0x2482, 0x2efb, 0x2f04, 0x2ef9, 0x2ef9, 0x2ef9, 0x2ef9,
++	0x2ef9, 0x1078, 0x23eb, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2f04,
++	0x1078, 0x33d8, 0x0078, 0x2f0a, 0x7060, 0x2c50, 0x2060, 0x6800,
++	0x6002, 0x2a60, 0x2021, 0x515a, 0x2404, 0xa005, 0x0040, 0x2f13,
++	0x2020, 0x0078, 0x2f0c, 0x2d22, 0x206b, 0x0000, 0x007c, 0x1078,
++	0x33df, 0x1078, 0x33ee, 0x6008, 0xa084, 0xfdff, 0x600a, 0x682b,
++	0x0000, 0x789b, 0x000e, 0x6f14, 0x6817, 0x0002, 0x1078, 0x4b78,
++	0xa684, 0x0800, 0x0040, 0x2f30, 0x691c, 0xa18d, 0x2000, 0x691e,
++	0x6818, 0xa084, 0x8000, 0x0040, 0x2f40, 0x7868, 0xa08c, 0x00ff,
++	0x0040, 0x2f3e, 0x681b, 0x001e, 0x0078, 0x2f40, 0x681b, 0x0000,
++	0x2021, 0x515a, 0x2404, 0xad06, 0x0040, 0x2f47, 0x7460, 0x6800,
++	0x2022, 0x68c3, 0x0000, 0x6a3c, 0x6940, 0x6a32, 0x692e, 0x1078,
++	0x1c70, 0x0078, 0x2482, 0x1078, 0x2e46, 0x682b, 0x0000, 0x2001,
++	0x000e, 0x6f14, 0x1078, 0x3918, 0xa08c, 0x00ff, 0x6916, 0x6818,
++	0xa084, 0x8000, 0x0040, 0x2f66, 0x703c, 0x681a, 0xa68c, 0xdf00,
++	0x691e, 0x706f, 0x0000, 0x0078, 0x2482, 0x7000, 0xa005, 0x00c0,
++	0x2f73, 0x0078, 0x2482, 0xa006, 0x1078, 0x4776, 0x6817, 0x0000,
++	0x681b, 0x0014, 0xa68c, 0xdf00, 0x691e, 0x682b, 0x0000, 0x6820,
++	0xa085, 0x00ff, 0x6822, 0x7000, 0x0079, 0x2f86, 0x2482, 0x2f90,
++	0x2f90, 0x2f92, 0x2f92, 0x2f92, 0x2f92, 0x2f8e, 0x1078, 0x23eb,
++	0x1078, 0x33ee, 0x6008, 0xa084, 0xffef, 0x600a, 0x0078, 0x33a8,
++	0x2300, 0x0079, 0x2f9b, 0x2f9e, 0x2fa0, 0x2fd9, 0x1078, 0x23eb,
++	0x7000, 0x0079, 0x2fa3, 0x2482, 0x2fad, 0x2fad, 0x2fc8, 0x2fad,
++	0x2fd5, 0x2fc8, 0x2fab, 0x1078, 0x23eb, 0xa684, 0x0060, 0xa086,
++	0x0060, 0x00c0, 0x2fc4, 0xa6b4, 0xffdf, 0xa6b4, 0xbfff, 0xa6b5,
++	0x2000, 0x7e5a, 0x681c, 0xa084, 0xffdf, 0x681e, 0x1078, 0x4776,
++	0x1078, 0x4a3a, 0x0078, 0x3888, 0xa684, 0x2000, 0x0040, 0x2fb7,
++	0x6818, 0xa084, 0x8000, 0x0040, 0x2fd5, 0x681b, 0x0015, 0xa684,
++	0x4000, 0x0040, 0x2fd5, 0x681b, 0x0007, 0x1078, 0x389c, 0x0078,
++	0x2459, 0x1078, 0x23eb, 0x2300, 0x0079, 0x2fde, 0x2fe1, 0x2fe3,
++	0x3016, 0x1078, 0x23eb, 0x7000, 0x0079, 0x2fe6, 0x2482, 0x2ff0,
++	0x2ff0, 0x300b, 0x2ff0, 0x3012, 0x300b, 0x2fee, 0x1078, 0x23eb,
++	0xa684, 0x0060, 0xa086, 0x0060, 0x00c0, 0x3007, 0xa6b4, 0xffbf,
++	0xa6b4, 0xbfff, 0xa6b5, 0x2000, 0x7e5a, 0x681c, 0xa084, 0xffbf,
++	0x681e, 0x1078, 0x4776, 0x1078, 0x4a3a, 0x0078, 0x3888, 0xa684,
++	0x2000, 0x0040, 0x2ffa, 0x6818, 0xa084, 0x8000, 0x0040, 0x3012,
++	0x681b, 0x0007, 0x781b, 0x00cd, 0x0078, 0x2459, 0x6820, 0xa085,
++	0x0004, 0x6822, 0x1078, 0x3853, 0xa6b5, 0x0800, 0x1078, 0x36c1,
++	0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0x2300, 0x0079,
++	0x3029, 0x302c, 0x302e, 0x3030, 0x1078, 0x23eb, 0x0078, 0x36ad,
++	0xa684, 0x0400, 0x00c0, 0x3059, 0x79e4, 0xa184, 0x0020, 0x0040,
++	0x3040, 0x78ec, 0xa084, 0x0003, 0x0040, 0x3040, 0x782b, 0x3009,
++	0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x79e4,
++	0xa184, 0x0020, 0x0040, 0x3051, 0x78ec, 0xa084, 0x0003, 0x00c0,
++	0x3055, 0x2001, 0x0014, 0x0078, 0x2d01, 0xa184, 0x0007, 0x0079,
++	0x3091, 0x7a90, 0xa294, 0x0007, 0x789b, 0x0060, 0x79a8, 0x81ff,
++	0x0040, 0x308f, 0x789b, 0x0010, 0x7ba8, 0xa384, 0x0001, 0x00c0,
++	0x3080, 0x7ba8, 0x7ba8, 0xa386, 0x0001, 0x00c0, 0x3073, 0x2009,
++	0xfff7, 0x0078, 0x3079, 0xa386, 0x0003, 0x00c0, 0x3080, 0x2009,
++	0xffef, 0x0c7e, 0x7054, 0x2060, 0x6004, 0xa104, 0x6006, 0x0c7f,
++	0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x782b,
++	0x3009, 0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff, 0x6922, 0x0078,
++	0x3888, 0x299e, 0x29a9, 0x309b, 0x30a3, 0x3099, 0x3099, 0x3888,
++	0x3888, 0x1078, 0x23eb, 0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff,
++	0x6922, 0x0078, 0x3892, 0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff,
++	0x6922, 0x0078, 0x3888, 0x79e4, 0xa184, 0x0030, 0x0040, 0x30b5,
++	0x78ec, 0xa084, 0x0003, 0x00c0, 0x30dc, 0x7000, 0xa086, 0x0004,
++	0x00c0, 0x30cf, 0x706c, 0xa086, 0x0002, 0x00c0, 0x30c5, 0x2011,
++	0x0002, 0x2019, 0x0000, 0x0078, 0x2848, 0x706c, 0xa086, 0x0006,
++	0x0040, 0x30bf, 0x706c, 0xa086, 0x0004, 0x0040, 0x30bf, 0x7000,
++	0xa086, 0x0000, 0x0040, 0x2459, 0x6818, 0xa085, 0x8000, 0x681a,
++	0x2001, 0x0014, 0x0078, 0x2d01, 0xa184, 0x0007, 0x0079, 0x30e0,
++	0x3888, 0x3888, 0x30e8, 0x3888, 0x38ed, 0x38ed, 0x3888, 0x3888,
++	0xa684, 0x0080, 0x0040, 0x3117, 0x7194, 0x81ff, 0x0040, 0x3117,
++	0xa182, 0x000d, 0x00d0, 0x30f8, 0x7097, 0x0000, 0x0078, 0x30fd,
++	0xa182, 0x000c, 0x7096, 0x2009, 0x000c, 0x789b, 0x0061, 0x79aa,
++	0x157e, 0x137e, 0x147e, 0x7098, 0x8114, 0xa210, 0x729a, 0xa080,
++	0x000b, 0xad00, 0x2098, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8108,
++	0x81ac, 0x53a6, 0x147f, 0x137f, 0x157f, 0x0078, 0x3892, 0xa684,
++	0x0400, 0x00c0, 0x3158, 0x6820, 0xa084, 0x0001, 0x0040, 0x3892,
++	0xa68c, 0x0060, 0xa684, 0x0060, 0x0040, 0x312c, 0xa086, 0x0060,
++	0x00c0, 0x312c, 0xa18d, 0x4000, 0xa18c, 0xfffb, 0x795a, 0x69b6,
++	0x789b, 0x0060, 0x78ab, 0x0000, 0x789b, 0x0061, 0x6818, 0xa085,
++	0x8000, 0x681a, 0x78aa, 0x8008, 0x810c, 0x0040, 0x3407, 0xa18c,
++	0x00f8, 0x00c0, 0x3407, 0x157e, 0x137e, 0x147e, 0x20a1, 0x012b,
++	0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6,
++	0x147f, 0x137f, 0x157f, 0x6814, 0x8007, 0x7882, 0x0078, 0x3892,
++	0x6818, 0xa084, 0x8000, 0x0040, 0x315f, 0x681b, 0x0008, 0x781b,
++	0x00c3, 0x0078, 0x2459, 0x2300, 0x0079, 0x3166, 0x316b, 0x320a,
++	0x3169, 0x1078, 0x23eb, 0x7000, 0xa084, 0x0007, 0x0079, 0x3170,
++	0x2482, 0x317a, 0x31af, 0x3185, 0x3178, 0x2482, 0x3178, 0x3178,
++	0x1078, 0x23eb, 0x681c, 0xa084, 0x2000, 0x0040, 0x3193, 0x6008,
++	0xa085, 0x0002, 0x600a, 0x0078, 0x3193, 0x68c0, 0xa005, 0x00c0,
++	0x31af, 0x6920, 0xa18d, 0x0001, 0x6922, 0x68c3, 0x0001, 0x6800,
++	0x706a, 0x0078, 0x31a9, 0x6920, 0xa18d, 0x0001, 0x6922, 0x6800,
++	0x6006, 0xa005, 0x00c0, 0x319d, 0x6002, 0x681c, 0xa084, 0x000e,
++	0x0040, 0x31a9, 0x7014, 0x68ba, 0x7130, 0xa188, 0x7400, 0x0078,
++	0x31ab, 0x2009, 0x7500, 0x2104, 0x6802, 0x2d0a, 0x7162, 0x6eb6,
++	0xa684, 0x0060, 0x0040, 0x3208, 0xa684, 0x0800, 0x00c0, 0x31c3,
++	0xa684, 0x7fff, 0x68b6, 0x6894, 0x68a6, 0x6898, 0x68aa, 0x1078,
++	0x4776, 0x0078, 0x3208, 0xa684, 0x0020, 0x0040, 0x31d8, 0x68c0,
++	0xa005, 0x0040, 0x31cf, 0x1078, 0x4b78, 0x0078, 0x31d2, 0xa006,
++	0x1078, 0x4b30, 0x79d8, 0x7adc, 0x69aa, 0x6aa6, 0x0078, 0x31de,
++	0x1078, 0x37fc, 0x69aa, 0x6aa6, 0x1078, 0x4b30, 0xa684, 0x8000,
++	0x0040, 0x3208, 0xa684, 0x7fff, 0x68b6, 0x2001, 0x0076, 0x1078,
++	0x3918, 0x2010, 0x2001, 0x0078, 0x1078, 0x3918, 0x2008, 0xa684,
++	0x0020, 0x00c0, 0x3200, 0x2001, 0x007a, 0x1078, 0x3918, 0x801b,
++	0x00c8, 0x31fb, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
++	0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae,
++	0x0078, 0x2482, 0x0078, 0x36ad, 0x7037, 0x0000, 0xa282, 0x0006,
++	0x0050, 0x3214, 0x1078, 0x23eb, 0x7000, 0xa084, 0x0007, 0x10c0,
++	0x39be, 0x2300, 0x0079, 0x321c, 0x321f, 0x3248, 0x325c, 0x2200,
++	0x0079, 0x3222, 0x3246, 0x36ad, 0x3228, 0x3246, 0x3278, 0x32ba,
++	0x7003, 0x0005, 0x2001, 0x7610, 0x2068, 0x704a, 0x157e, 0x20a9,
++	0x0031, 0x2003, 0x0000, 0x8000, 0x0070, 0x3238, 0x0078, 0x3231,
++	0x157f, 0xad80, 0x0009, 0x7036, 0x6817, 0x0000, 0x68b7, 0x0700,
++	0x6823, 0x0800, 0x6827, 0x0003, 0x0078, 0x369d, 0x1078, 0x23eb,
++	0x7003, 0x0005, 0x2001, 0x7610, 0x2068, 0x704a, 0xad80, 0x0009,
++	0x7036, 0x2200, 0x0079, 0x3254, 0x36ad, 0x325a, 0x325a, 0x3278,
++	0x325a, 0x36ad, 0x1078, 0x23eb, 0x7003, 0x0005, 0x2001, 0x7610,
++	0x2068, 0x704a, 0xad80, 0x0009, 0x7036, 0x2200, 0x0079, 0x3268,
++	0x3270, 0x326e, 0x326e, 0x3270, 0x326e, 0x3270, 0x1078, 0x23eb,
++	0x1078, 0x36d1, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x2459,
++	0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8,
++	0xa484, 0x001f, 0xa215, 0x2069, 0x7500, 0x2d04, 0x2d08, 0x7162,
++	0x2068, 0xa005, 0x0040, 0x3293, 0x6814, 0xa206, 0x0040, 0x32af,
++	0x6800, 0x0078, 0x3286, 0x7003, 0x0005, 0x2001, 0x7610, 0x2068,
++	0x704a, 0x7036, 0x157e, 0x20a9, 0x0031, 0x2003, 0x0000, 0x8000,
++	0x0070, 0x32a4, 0x0078, 0x329d, 0x157f, 0xad80, 0x0009, 0x7036,
++	0x6a16, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4,
++	0x7e5a, 0x6820, 0xa084, 0x0c00, 0x0040, 0x3309, 0x1078, 0x36c9,
++	0x0078, 0x3309, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b,
++	0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0x79a8, 0x79a8, 0xa18c,
++	0x00ff, 0xa1e8, 0x7400, 0x2d04, 0x2d08, 0x7162, 0x2068, 0xa005,
++	0x0040, 0x32d9, 0x6814, 0xa206, 0x0040, 0x32f4, 0x6800, 0x0078,
++	0x32cc, 0x7003, 0x0005, 0x2001, 0x7610, 0x2068, 0x704a, 0x157e,
++	0x20a9, 0x0031, 0x2003, 0x0000, 0x8000, 0x0070, 0x32e9, 0x0078,
++	0x32e2, 0x157f, 0xad80, 0x0009, 0x7036, 0x6a16, 0x68b7, 0x0700,
++	0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4, 0x7e5a, 0x6820, 0xa084,
++	0x0c00, 0x0040, 0x3309, 0xa084, 0x0800, 0x0040, 0x3303, 0x1078,
++	0x36cd, 0x0078, 0x3309, 0x1078, 0x36c9, 0x708b, 0x0000, 0x0078,
++	0x3309, 0x027e, 0x8207, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++	0xa080, 0x5380, 0x2060, 0x7056, 0x6000, 0x705a, 0x6004, 0x705e,
++	0xa684, 0x0060, 0x0040, 0x3361, 0x6b98, 0x6c94, 0x69ac, 0x68b0,
++	0xa105, 0x00c0, 0x3343, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa6b4,
++	0xb7ff, 0x7e5a, 0xa684, 0x0060, 0xa086, 0x0060, 0x0040, 0x3361,
++	0x68c0, 0xa005, 0x0040, 0x333c, 0x7003, 0x0003, 0x682b, 0x0000,
++	0x1078, 0x4a29, 0x0078, 0x333e, 0x1078, 0x4a3a, 0xa6b5, 0x2000,
++	0x7e5a, 0x0078, 0x3361, 0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400,
++	0xa305, 0x0040, 0x3361, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68b0,
++	0xa6b4, 0xbfff, 0x7e5a, 0x007e, 0x68c0, 0xa005, 0x007f, 0x0040,
++	0x335f, 0x7003, 0x0003, 0x1078, 0x4a29, 0x0078, 0x3361, 0x1078,
++	0x4a85, 0x077f, 0x1078, 0x37ef, 0x2009, 0x0065, 0xa684, 0x0004,
++	0x0040, 0x3382, 0x78e4, 0xa084, 0x0030, 0x0040, 0x337a, 0x78ec,
++	0xa084, 0x0003, 0x0040, 0x337a, 0x782b, 0x3008, 0x2009, 0x0065,
++	0x0078, 0x3382, 0x0f7e, 0x2079, 0x5100, 0x1078, 0x4776, 0x0f7f,
++	0x0040, 0x2482, 0x791a, 0x2d00, 0x704a, 0x8207, 0xa084, 0x000f,
++	0x8003, 0x8003, 0x8003, 0xa080, 0x5380, 0x2048, 0x0078, 0x2459,
++	0x6020, 0xa005, 0x0040, 0x339c, 0x8001, 0x6022, 0x6008, 0xa085,
++	0x0008, 0x600a, 0x7010, 0x6026, 0x007c, 0xa006, 0x1078, 0x4776,
++	0x6817, 0x0000, 0x681b, 0x0001, 0x6823, 0x0040, 0x681f, 0x0100,
++	0x7000, 0xa084, 0x0007, 0x0079, 0x33ad, 0x2482, 0x33b7, 0x33b7,
++	0x33d4, 0x33bf, 0x33bd, 0x33bf, 0x33b5, 0x1078, 0x23eb, 0x1078,
++	0x33df, 0x1078, 0x33d8, 0x1078, 0x1c70, 0x0078, 0x2482, 0x706c,
++	0x706f, 0x0000, 0x7093, 0x0000, 0x0079, 0x33c6, 0x33d0, 0x33d0,
++	0x33ce, 0x33ce, 0x33ce, 0x33d0, 0x33ce, 0x33d0, 0x0079, 0x2861,
++	0x706f, 0x0000, 0x0078, 0x2482, 0x681b, 0x0000, 0x0078, 0x2f17,
++	0x6800, 0xa005, 0x00c0, 0x33dd, 0x6002, 0x6006, 0x007c, 0x6010,
++	0xa005, 0x0040, 0x33e8, 0x8001, 0x00d0, 0x33e8, 0x1078, 0x23eb,
++	0x6012, 0x6008, 0xa084, 0xffef, 0x600a, 0x007c, 0x6018, 0xa005,
++	0x0040, 0x33f4, 0x8001, 0x601a, 0x007c, 0x1078, 0x3912, 0x681b,
++	0x0018, 0x0078, 0x342b, 0x1078, 0x3912, 0x681b, 0x0019, 0x0078,
++	0x342b, 0x1078, 0x3912, 0x681b, 0x001a, 0x0078, 0x342b, 0x1078,
++	0x3912, 0x681b, 0x0003, 0x0078, 0x342b, 0x7780, 0x1078, 0x37ef,
++	0x7184, 0xa18c, 0x00ff, 0xa1e8, 0x7400, 0x2d04, 0x2d08, 0x2068,
++	0xa005, 0x00c0, 0x341d, 0x0078, 0x2482, 0x6814, 0x7280, 0xa206,
++	0x0040, 0x3425, 0x6800, 0x0078, 0x3416, 0x6800, 0x200a, 0x681b,
++	0x0005, 0x708b, 0x0000, 0x1078, 0x33df, 0x6820, 0xa084, 0x0001,
++	0x00c0, 0x3434, 0x1078, 0x33d8, 0x1078, 0x33ee, 0x681f, 0x0000,
++	0x6823, 0x0020, 0x1078, 0x1c70, 0x0078, 0x2482, 0xa282, 0x0003,
++	0x00c0, 0x369d, 0x7da8, 0xa5ac, 0x00ff, 0x7ca8, 0xa4a4, 0x00ff,
++	0x6920, 0xa18d, 0x0080, 0x6922, 0xa184, 0x0100, 0x0040, 0x34a2,
++	0xa18c, 0xfeff, 0x6922, 0xa4a4, 0x00ff, 0x0040, 0x348c, 0xa482,
++	0x000c, 0x0048, 0x345f, 0x0040, 0x345f, 0x2021, 0x000c, 0x852b,
++	0x852b, 0x1078, 0x3760, 0x0040, 0x3469, 0x1078, 0x355b, 0x0078,
++	0x3495, 0x1078, 0x371b, 0x0c7e, 0x2960, 0x6004, 0xa084, 0xfff5,
++	0x6006, 0x1078, 0x3586, 0x0c7f, 0x6920, 0xa18d, 0x0100, 0x6922,
++	0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x3486,
++	0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x2459, 0x782b, 0x3008,
++	0x781b, 0x0065, 0x0078, 0x2459, 0x0c7e, 0x2960, 0x6004, 0xa084,
++	0xfff5, 0x6006, 0x1078, 0x3586, 0x0c7f, 0x7e58, 0xa684, 0x0400,
++	0x00c0, 0x349e, 0x781b, 0x0058, 0x0078, 0x2459, 0x781b, 0x0065,
++	0x0078, 0x2459, 0x0c7e, 0x7054, 0x2060, 0x6100, 0xa18c, 0x1000,
++	0x0040, 0x34e2, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000c,
++	0x0048, 0x34b6, 0x0040, 0x34b6, 0x2011, 0x000c, 0x2400, 0xa202,
++	0x00c8, 0x34bb, 0x2220, 0x6208, 0xa294, 0x00ff, 0x7018, 0xa086,
++	0x0028, 0x00c0, 0x34cb, 0xa282, 0x0019, 0x00c8, 0x34d1, 0x2011,
++	0x0019, 0x0078, 0x34d1, 0xa282, 0x000c, 0x00c8, 0x34d1, 0x2011,
++	0x000c, 0x2200, 0xa502, 0x00c8, 0x34d6, 0x2228, 0x1078, 0x371f,
++	0x852b, 0x852b, 0x1078, 0x3760, 0x0040, 0x34e2, 0x1078, 0x355b,
++	0x0078, 0x34e6, 0x1078, 0x371b, 0x1078, 0x3586, 0x7858, 0xa085,
++	0x0004, 0x785a, 0x0c7f, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078,
++	0x2459, 0x0c7e, 0x2960, 0x6000, 0xa084, 0x1000, 0x00c0, 0x3509,
++	0x6010, 0xa084, 0x000f, 0x00c0, 0x3503, 0x6104, 0xa18c, 0xfff5,
++	0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078,
++	0x3530, 0x68a0, 0xa084, 0x0200, 0x00c0, 0x3503, 0x6208, 0xa294,
++	0x00ff, 0x7018, 0xa086, 0x0028, 0x00c0, 0x351e, 0xa282, 0x0019,
++	0x00c8, 0x3524, 0x2011, 0x0019, 0x0078, 0x3524, 0xa282, 0x000c,
++	0x00c8, 0x3524, 0x2011, 0x000c, 0x6308, 0x831f, 0xa39c, 0x00ff,
++	0xa382, 0x000c, 0x0048, 0x3530, 0x0040, 0x3530, 0x2019, 0x000c,
++	0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa,
++	0xa8c0, 0x0005, 0x6820, 0xa085, 0x0100, 0x6822, 0x0c7f, 0x007c,
++	0x0c7e, 0x2960, 0xa18c, 0xfff5, 0x6106, 0x2011, 0x0032, 0x2019,
++	0x0000, 0x0078, 0x354b, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
++	0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xa085, 0x0100,
++	0x6822, 0x0c7f, 0x007c, 0x0c7e, 0x7154, 0x2160, 0x1078, 0x3562,
++	0x0c7f, 0x007c, 0x2008, 0xa084, 0xfff0, 0xa425, 0x7c86, 0x6018,
++	0x789a, 0x7cae, 0x6412, 0x78a4, 0xa084, 0xfff8, 0xa18c, 0x0007,
++	0xa105, 0x78a6, 0x6016, 0x788a, 0xa4a4, 0x000f, 0x8427, 0x8204,
++	0x8004, 0xa084, 0x00ff, 0xa405, 0x600e, 0x78ec, 0xd08c, 0x00c0,
++	0x3585, 0x6004, 0xa084, 0xfff5, 0x6006, 0x007c, 0x0c7e, 0x7054,
++	0x2060, 0x1078, 0x358d, 0x0c7f, 0x007c, 0x6018, 0x789a, 0x78a4,
++	0xa084, 0xfff0, 0x78a6, 0x6012, 0x7884, 0xa084, 0xfff0, 0x7886,
++	0x007c, 0xa282, 0x0002, 0x00c0, 0x369d, 0x7aa8, 0x6920, 0xa18d,
++	0x0080, 0x6922, 0xa184, 0x0200, 0x0040, 0x35e2, 0xa18c, 0xfdff,
++	0x6922, 0xa294, 0x00ff, 0xa282, 0x0002, 0x00c8, 0x369d, 0x1078,
++	0x362b, 0x1078, 0x3586, 0xa980, 0x0001, 0x200c, 0x1078, 0x37eb,
++	0x1078, 0x34f1, 0x88ff, 0x0040, 0x35d5, 0x789b, 0x0060, 0x2800,
++	0x78aa, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0,
++	0x35cf, 0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x2459, 0x782b,
++	0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0x7e58, 0xa684, 0x0400,
++	0x00c0, 0x35de, 0x781b, 0x0058, 0x0078, 0x2459, 0x781b, 0x0065,
++	0x0078, 0x2459, 0xa282, 0x0002, 0x00c8, 0x35ea, 0xa284, 0x0001,
++	0x0040, 0x35f4, 0x7154, 0xa188, 0x0000, 0x210c, 0xa18c, 0x2000,
++	0x00c0, 0x35f4, 0x2011, 0x0000, 0x1078, 0x370d, 0x1078, 0x362b,
++	0x1078, 0x3586, 0x7858, 0xa085, 0x0004, 0x785a, 0x782b, 0x3008,
++	0x781b, 0x0065, 0x0078, 0x2459, 0x0c7e, 0x027e, 0x2960, 0x6000,
++	0x2011, 0x0001, 0xa084, 0x2000, 0x00c0, 0x361b, 0x6014, 0xa084,
++	0x0040, 0x00c0, 0x3619, 0xa18c, 0xffef, 0x6106, 0xa006, 0x0078,
++	0x3628, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab,
++	0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x6820, 0xa085, 0x0200, 0x6822,
++	0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x7054, 0x2060, 0x1078, 0x3632,
++	0x0c7f, 0x007c, 0x82ff, 0x0040, 0x3637, 0x2011, 0x0040, 0x6018,
++	0xa080, 0x0002, 0x789a, 0x78a4, 0xa084, 0xffbf, 0xa205, 0x78a6,
++	0x788a, 0x6016, 0x78ec, 0xd08c, 0x00c0, 0x364a, 0x6004, 0xa084,
++	0xffef, 0x6006, 0x007c, 0x007e, 0x7000, 0xa086, 0x0003, 0x0040,
++	0x3654, 0x007f, 0x0078, 0x3657, 0x007f, 0x0078, 0x3699, 0xa684,
++	0x0020, 0x0040, 0x3699, 0x7888, 0xa084, 0x0040, 0x0040, 0x3699,
++	0x7bb8, 0xa384, 0x003f, 0x831b, 0x00c8, 0x3667, 0x8000, 0xa005,
++	0x0040, 0x367d, 0x831b, 0x00c8, 0x3670, 0x8001, 0x0040, 0x3695,
++	0xa684, 0x4000, 0x0040, 0x367d, 0x78b8, 0x801b, 0x00c8, 0x3679,
++	0x8000, 0xa084, 0x003f, 0x00c0, 0x3695, 0xa6b4, 0xbfff, 0x7e5a,
++	0x79d8, 0x7adc, 0x2001, 0x0001, 0xa108, 0x00c8, 0x3689, 0xa291,
++	0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x1078, 0x4b30, 0x781b,
++	0x0064, 0x1078, 0x49b5, 0x0078, 0x2459, 0x781b, 0x0064, 0x0078,
++	0x2459, 0x781b, 0x0065, 0x0078, 0x2459, 0x1078, 0x36d5, 0x782b,
++	0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0x1078, 0x36c1, 0x782b,
++	0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0x6827, 0x0002, 0x1078,
++	0x36c9, 0x78e4, 0xa084, 0x0030, 0x0040, 0x2482, 0x78ec, 0xa084,
++	0x0003, 0x0040, 0x2482, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078,
++	0x2459, 0x2001, 0x0005, 0x0078, 0x36d7, 0x2001, 0x000c, 0x0078,
++	0x36d7, 0x2001, 0x0006, 0x0078, 0x36d7, 0x2001, 0x000d, 0x0078,
++	0x36d7, 0x2001, 0x0009, 0x0078, 0x36d7, 0x2001, 0x0007, 0x789b,
++	0x0010, 0x78aa, 0x789b, 0x0060, 0x78ab, 0x0001, 0xa6b5, 0x0004,
++	0x7e5a, 0x007c, 0x077e, 0x873f, 0xa7bc, 0x000f, 0x873b, 0x873b,
++	0x8703, 0xa0e0, 0x5380, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184,
++	0x000f, 0x0040, 0x36fb, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004,
++	0xa085, 0x0008, 0x6006, 0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184,
++	0x0040, 0x0040, 0x370b, 0xa184, 0xffbf, 0x78a6, 0x6016, 0x6004,
++	0xa085, 0x0010, 0x6006, 0x077f, 0x007c, 0x789b, 0x0010, 0x78ab,
++	0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060,
++	0x78ab, 0x0004, 0x007c, 0x2021, 0x0000, 0x2029, 0x0032, 0x789b,
++	0x0010, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa,
++	0x7caa, 0x789b, 0x0060, 0x78ab, 0x0005, 0x007c, 0x157e, 0x8007,
++	0xa084, 0x00ff, 0x8003, 0x8003, 0xa080, 0x0020, 0x789a, 0x79a4,
++	0xa18c, 0xfff0, 0x2001, 0x5146, 0x2004, 0xa082, 0x0028, 0x0040,
++	0x3749, 0x2021, 0x37d2, 0x2019, 0x0014, 0x20a9, 0x000c, 0x0078,
++	0x374f, 0x2021, 0x37de, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011,
++	0x0064, 0x2404, 0xa084, 0xfff0, 0xa106, 0x0040, 0x375e, 0x8420,
++	0x2300, 0xa210, 0x0070, 0x375e, 0x0078, 0x3751, 0x157f, 0x007c,
++	0x157e, 0x2009, 0x5146, 0x210c, 0xa182, 0x0032, 0x0048, 0x3774,
++	0x0040, 0x3778, 0x2009, 0x37c4, 0x2019, 0x0011, 0x20a9, 0x000e,
++	0x2011, 0x0032, 0x0078, 0x378a, 0xa182, 0x0028, 0x0040, 0x3782,
++	0x2009, 0x37d2, 0x2019, 0x0014, 0x20a9, 0x000c, 0x2011, 0x0064,
++	0x0078, 0x378a, 0x2009, 0x37de, 0x2019, 0x0019, 0x20a9, 0x000d,
++	0x2011, 0x0064, 0x2200, 0xa502, 0x0040, 0x379a, 0x0048, 0x379a,
++	0x8108, 0x2300, 0xa210, 0x0070, 0x3797, 0x0078, 0x378a, 0x157f,
++	0xa006, 0x007c, 0x157f, 0xa582, 0x0064, 0x00c8, 0x37a9, 0x7808,
++	0xa085, 0x0070, 0x780a, 0x7044, 0xa085, 0x0070, 0x7046, 0x0078,
++	0x37a9, 0x78ec, 0xa084, 0x0300, 0x0040, 0x37b1, 0x2104, 0x0078,
++	0x37c2, 0x2104, 0xa09e, 0x1102, 0x00c0, 0x37c2, 0x2001, 0x04fd,
++	0x2004, 0xa082, 0x0005, 0x0048, 0x37c1, 0x2001, 0x1201, 0x0078,
++	0x37c2, 0x2104, 0xa005, 0x007c, 0x1102, 0x3002, 0x3202, 0x4203,
++	0x4403, 0x5404, 0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07,
++	0x0c07, 0x0e07, 0x3202, 0x4202, 0x5202, 0x6202, 0x7202, 0x6605,
++	0x7605, 0x7805, 0x7a05, 0x7c05, 0x7e05, 0x7f05, 0x2202, 0x3202,
++	0x4202, 0x5202, 0x5404, 0x6404, 0x7404, 0x7604, 0x7804, 0x7a04,
++	0x7c04, 0x7e04, 0x7f04, 0x789b, 0x0010, 0xa046, 0x007c, 0xa784,
++	0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003,
++	0xa105, 0xa0e0, 0x5400, 0x007c, 0x79d8, 0x7adc, 0x78d0, 0x801b,
++	0x00c8, 0x3803, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
++	0x007c, 0x0f7e, 0x2079, 0x0100, 0x2009, 0x5140, 0x2091, 0x8000,
++	0x2104, 0x0079, 0x3813, 0x3849, 0x381d, 0x381d, 0x381d, 0x381d,
++	0x381d, 0x381d, 0x384d, 0x1078, 0x23eb, 0x784b, 0x0004, 0x7848,
++	0xa084, 0x0004, 0x00c0, 0x381f, 0x784b, 0x0008, 0x7848, 0xa084,
++	0x0008, 0x00c0, 0x3826, 0x68b4, 0xa085, 0x4000, 0x68b6, 0x7858,
++	0xa085, 0x4000, 0x785a, 0x7830, 0xa084, 0x0080, 0x00c0, 0x3849,
++	0x0018, 0x3849, 0x681c, 0xa084, 0x0020, 0x00c0, 0x3847, 0x0e7e,
++	0x2071, 0x5140, 0x1078, 0x389c, 0x0e7f, 0x0078, 0x3849, 0x781b,
++	0x00cd, 0x2091, 0x8001, 0x0f7f, 0x007c, 0x70b3, 0x0000, 0x1078,
++	0x3a76, 0x0078, 0x3849, 0x0c7e, 0x6814, 0x8007, 0xa084, 0x000f,
++	0x8003, 0x8003, 0x8003, 0xa0e0, 0x5380, 0x6004, 0xa084, 0x000a,
++	0x00c0, 0x3886, 0x6108, 0xa194, 0xff00, 0x0040, 0x3886, 0xa18c,
++	0x00ff, 0x2001, 0x0019, 0xa106, 0x0040, 0x3875, 0x2001, 0x0032,
++	0xa106, 0x0040, 0x3879, 0x0078, 0x387d, 0x2009, 0x0020, 0x0078,
++	0x387f, 0x2009, 0x003f, 0x0078, 0x387f, 0x2011, 0x0000, 0x2100,
++	0xa205, 0x600a, 0x6004, 0xa085, 0x0002, 0x6006, 0x0c7f, 0x007c,
++	0x781b, 0x0065, 0x0078, 0x2459, 0x782b, 0x3008, 0x781b, 0x0065,
++	0x0078, 0x2459, 0x781b, 0x0058, 0x0078, 0x2459, 0x782b, 0x3008,
++	0x781b, 0x0056, 0x0078, 0x2459, 0x2009, 0x5120, 0x210c, 0xa186,
++	0x0000, 0x0040, 0x38b0, 0xa186, 0x0001, 0x0040, 0x38b3, 0x2009,
++	0x5138, 0x200b, 0x000b, 0x706f, 0x0001, 0x781b, 0x0048, 0x007c,
++	0x781b, 0x00c7, 0x007c, 0x2009, 0x5138, 0x200b, 0x000a, 0x007c,
++	0x2009, 0x5120, 0x210c, 0xa186, 0x0000, 0x0040, 0x38d3, 0xa186,
++	0x0001, 0x0040, 0x38cd, 0x2009, 0x5138, 0x200b, 0x000b, 0x706f,
++	0x0001, 0x781b, 0x0048, 0x0078, 0x2459, 0x2009, 0x5138, 0x200b,
++	0x000a, 0x0078, 0x2459, 0x782b, 0x3008, 0x781b, 0x00c7, 0x0078,
++	0x2459, 0x781b, 0x00cd, 0x0078, 0x2459, 0x782b, 0x3008, 0x781b,
++	0x00cd, 0x0078, 0x2459, 0x781b, 0x008e, 0x0078, 0x2459, 0x782b,
++	0x3008, 0x781b, 0x008e, 0x0078, 0x2459, 0x6818, 0xa084, 0x8000,
++	0x0040, 0x38f4, 0x681b, 0x001d, 0x706f, 0x0001, 0x781b, 0x0048,
++	0x0078, 0x2459, 0x007e, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x3910,
++	0x7808, 0xa084, 0xfffc, 0x780a, 0x0005, 0x0005, 0x0005, 0x0005,
++	0x78ec, 0xa084, 0x0021, 0x0040, 0x3910, 0x7044, 0x780a, 0xa005,
++	0x007f, 0x007c, 0x7044, 0xa085, 0x0002, 0x7046, 0x780a, 0x007c,
++	0x007e, 0x7830, 0xa084, 0x0040, 0x00c0, 0x3919, 0x0098, 0x3924,
++	0x007f, 0x789a, 0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a,
++	0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040,
++	0x3933, 0x0098, 0x3931, 0x007f, 0x789a, 0x78ac, 0x007e, 0x7044,
++	0x780a, 0x007f, 0x007c, 0x78ec, 0xa084, 0x0002, 0x00c0, 0x4760,
++	0xa784, 0x007d, 0x00c0, 0x3947, 0x2700, 0x1078, 0x23eb, 0xa784,
++	0x0001, 0x00c0, 0x2f6d, 0xa784, 0x0070, 0x0040, 0x3957, 0x0c7e,
++	0x2d60, 0x2f68, 0x1078, 0x2396, 0x2d78, 0x2c68, 0x0c7f, 0xa784,
++	0x0008, 0x0040, 0x3964, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003,
++	0x0040, 0x2482, 0x0078, 0x3888, 0xa784, 0x0004, 0x0040, 0x3997,
++	0x78b8, 0xa084, 0x4001, 0x0040, 0x3997, 0x784b, 0x0008, 0x78ec,
++	0xa084, 0x0003, 0x0040, 0x2482, 0x78e4, 0xa084, 0x0007, 0xa086,
++	0x0001, 0x00c0, 0x3997, 0x78c0, 0xa085, 0x4800, 0x2030, 0x7e5a,
++	0x781b, 0x00cd, 0x0078, 0x2459, 0x784b, 0x0008, 0x6818, 0xa084,
++	0x8000, 0x0040, 0x3993, 0x681b, 0x0015, 0xa684, 0x4000, 0x0040,
++	0x3993, 0x681b, 0x0007, 0x1078, 0x389c, 0x0078, 0x2459, 0x681b,
++	0x0003, 0x7858, 0xa084, 0x3f00, 0x681e, 0x682f, 0x0000, 0x6833,
++	0x0000, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2965,
++	0x0018, 0x2459, 0x0078, 0x36a5, 0x6b14, 0x8307, 0xa084, 0x000f,
++	0x8003, 0x8003, 0x8003, 0xa080, 0x5380, 0x2060, 0x2048, 0x7056,
++	0x6000, 0x705a, 0x6004, 0x705e, 0x2a60, 0x007c, 0x0079, 0x39c0,
++	0x39c8, 0x39c9, 0x39c8, 0x39cb, 0x39c8, 0x39c8, 0x39c8, 0x39d0,
++	0x007c, 0x1078, 0x33ee, 0x1078, 0x4776, 0x7038, 0x600a, 0x007c,
++	0x70a0, 0xa005, 0x0040, 0x39dd, 0x2068, 0x1078, 0x1b62, 0x1078,
++	0x46f8, 0x1078, 0x46ff, 0x70a3, 0x0000, 0x007c, 0x0e7e, 0x2091,
++	0x8000, 0x2071, 0x5140, 0x7000, 0xa086, 0x0007, 0x00c0, 0x39f4,
++	0x6110, 0x70bc, 0xa106, 0x00c0, 0x39f4, 0x0e7f, 0x1078, 0x1b6f,
++	0x1078, 0x39fa, 0xa006, 0x007c, 0x2091, 0x8001, 0x0e7f, 0xa085,
++	0x0001, 0x007c, 0x0f7e, 0x0e7e, 0x2071, 0x5140, 0x0078, 0x21fa,
++	0x785b, 0x0000, 0x70af, 0x000e, 0x2009, 0x0100, 0x017e, 0x70a0,
++	0xa06d, 0x0040, 0x3a0f, 0x70a3, 0x0000, 0x0078, 0x3a15, 0x70b3,
++	0x0000, 0x1078, 0x1b8b, 0x0040, 0x3a1b, 0x70ac, 0x6826, 0x1078,
++	0x3af8, 0x0078, 0x3a0f, 0x017f, 0x157e, 0x0c7e, 0x0d7e, 0x20a9,
++	0x0008, 0x2061, 0x7510, 0x6000, 0xa105, 0x6002, 0x601c, 0xa06d,
++	0x0040, 0x3a33, 0x6800, 0x601e, 0x1078, 0x195a, 0x6008, 0x8000,
++	0x600a, 0x0078, 0x3a26, 0x6018, 0xa06d, 0x0040, 0x3a3d, 0x6800,
++	0x601a, 0x1078, 0x195a, 0x0078, 0x3a33, 0xace0, 0x0008, 0x0070,
++	0x3a43, 0x0078, 0x3a23, 0x709c, 0xa084, 0x8000, 0x0040, 0x3a4a,
++	0x1078, 0x3b72, 0x0d7f, 0x0c7f, 0x157f, 0x007c, 0x127e, 0x2091,
++	0x2300, 0x6804, 0xa084, 0x000f, 0x0079, 0x3a56, 0x3a66, 0x3a66,
++	0x3a66, 0x3a66, 0x3a66, 0x3a66, 0x3a68, 0x3a6e, 0x3a66, 0x3a66,
++	0x3a66, 0x3a66, 0x3a66, 0x3a70, 0x3a66, 0x3a68, 0x1078, 0x23eb,
++	0x1078, 0x44d0, 0x1078, 0x195a, 0x0078, 0x3a74, 0x6827, 0x000b,
++	0x1078, 0x44d0, 0x1078, 0x3af8, 0x127f, 0x007c, 0x127e, 0x2091,
++	0x2300, 0x0098, 0x3a92, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x3a92,
++	0x0d7e, 0x1078, 0x4708, 0x2d00, 0x682e, 0x2009, 0x0004, 0x2001,
++	0x0000, 0x6827, 0x0084, 0x1078, 0x46c1, 0x1078, 0x3af8, 0x0d7f,
++	0x0078, 0x3ac6, 0x7948, 0xa185, 0x4000, 0x784a, 0x0098, 0x3a9b,
++	0x794a, 0x0078, 0x3a80, 0x7828, 0xa086, 0x1834, 0x00c0, 0x3aa4,
++	0xa185, 0x0004, 0x0078, 0x3aab, 0x7828, 0xa086, 0x1814, 0x00c0,
++	0x3a98, 0xa185, 0x000c, 0x784a, 0x789b, 0x000e, 0x78ab, 0x0002,
++	0x7858, 0xa084, 0x00ff, 0xa085, 0x0400, 0x785a, 0x70b4, 0xa080,
++	0x0091, 0x781a, 0x6827, 0x0284, 0x682c, 0x6836, 0x6830, 0x683a,
++	0x2009, 0x0004, 0x2001, 0x0000, 0x1078, 0x46c1, 0x127f, 0x007c,
++	0x0d7e, 0x6b14, 0x1078, 0x1bfd, 0x0040, 0x3ad5, 0x2068, 0x6827,
++	0x0002, 0x1078, 0x3af8, 0x0078, 0x3aca, 0x0d7f, 0x007c, 0x0d7e,
++	0x6b14, 0x6c28, 0xa4a4, 0x00ff, 0x1078, 0x1b9b, 0x0040, 0x3ae5,
++	0x2068, 0x6827, 0x0002, 0x1078, 0x3af8, 0x0d7f, 0x007c, 0x0d7e,
++	0x6b14, 0xa39c, 0x00ff, 0x1078, 0x1bce, 0x0040, 0x3af6, 0x2068,
++	0x6827, 0x0002, 0x1078, 0x3af8, 0x0078, 0x3aeb, 0x0d7f, 0x007c,
++	0x0c7e, 0x6914, 0x1078, 0x3b69, 0x6904, 0xa18c, 0x00ff, 0xa186,
++	0x0006, 0x0040, 0x3b13, 0xa186, 0x000d, 0x0040, 0x3b32, 0xa186,
++	0x0017, 0x00c0, 0x3b0f, 0x1078, 0x195a, 0x0078, 0x3b11, 0x1078,
++	0x1c72, 0x0c7f, 0x007c, 0x6004, 0x8001, 0x0048, 0x3b30, 0x6006,
++	0x2009, 0x0000, 0xa684, 0x0001, 0x00c0, 0x3b20, 0xa18d, 0x8000,
++	0xa684, 0x0004, 0x0040, 0x3b26, 0xa18d, 0x0002, 0x691e, 0x6823,
++	0x0000, 0x7104, 0x810f, 0x6818, 0xa105, 0x681a, 0x0078, 0x3b0f,
++	0x1078, 0x23eb, 0x6018, 0xa005, 0x00c0, 0x3b41, 0x6008, 0x8001,
++	0x0048, 0x3b41, 0x600a, 0x601c, 0x6802, 0x2d00, 0x601e, 0x0078,
++	0x3b57, 0xac88, 0x0006, 0x2104, 0xa005, 0x0040, 0x3b4a, 0x2008,
++	0x0078, 0x3b43, 0x6802, 0x2d0a, 0x6008, 0x8001, 0x0048, 0x3b11,
++	0x600a, 0x6018, 0x2068, 0x6800, 0x601a, 0x0078, 0x3b3b, 0x157e,
++	0x137e, 0x147e, 0x0c7e, 0x0d7e, 0x1078, 0x1937, 0x2da0, 0x137f,
++	0x20a9, 0x0031, 0x53a3, 0x0c7f, 0x147f, 0x137f, 0x157f, 0x0078,
++	0x3b0f, 0xa184, 0x001f, 0x8003, 0x8003, 0x8003, 0xa080, 0x7510,
++	0x2060, 0x007c, 0x2019, 0x5151, 0x2304, 0xa085, 0x0001, 0x201a,
++	0x2019, 0x0102, 0x2304, 0xa085, 0x0001, 0x201a, 0x007c, 0x2019,
++	0x5151, 0x2304, 0xa084, 0xfffe, 0x201a, 0x2019, 0x0102, 0x2304,
++	0xa084, 0xfffe, 0x201a, 0x007c, 0x7990, 0xa18c, 0xfff8, 0x7992,
++	0x70b4, 0xa080, 0x00dd, 0x781a, 0x0078, 0x2459, 0x70a3, 0x0000,
++	0x7003, 0x0000, 0x7043, 0x0001, 0x7037, 0x0000, 0x0018, 0x2410,
++	0x1078, 0x1b8b, 0x0040, 0x3bc7, 0x2009, 0x510f, 0x200b, 0x0000,
++	0x68bc, 0x2060, 0x6100, 0xa184, 0x0300, 0x0040, 0x3bbb, 0x6827,
++	0x000e, 0xa084, 0x0200, 0x0040, 0x3bb7, 0x6827, 0x0017, 0x1078,
++	0x3af8, 0x0078, 0x3b96, 0x7000, 0xa086, 0x0007, 0x00c0, 0x3c29,
++	0x2d00, 0x70a2, 0xad80, 0x000f, 0x7036, 0x0078, 0x3bce, 0x7040,
++	0xa086, 0x0001, 0x0040, 0x2492, 0x0078, 0x2459, 0x2031, 0x0000,
++	0x691c, 0xa184, 0x0002, 0x0040, 0x3bd7, 0xa6b5, 0x0004, 0xa184,
++	0x00c0, 0x8003, 0x8003, 0x8007, 0xa080, 0x3cc2, 0x2004, 0xa635,
++	0x6820, 0xa084, 0x0400, 0x0040, 0x3bef, 0x789b, 0x0018, 0x78ab,
++	0x0003, 0x789b, 0x0081, 0x78ab, 0x0001, 0xa6b5, 0x1000, 0x6820,
++	0xa084, 0x8000, 0x00c0, 0x3bfd, 0x681c, 0xa084, 0x8000, 0x00c0,
++	0x3c04, 0xa6b5, 0x0800, 0x0078, 0x3c04, 0xa6b5, 0x0400, 0x789b,
++	0x000e, 0x6824, 0x8007, 0x78aa, 0x6820, 0xa084, 0x0100, 0x0040,
++	0x3c0b, 0xa6b5, 0x4000, 0xa684, 0x0200, 0x0040, 0x3c25, 0x682c,
++	0x78d2, 0x6830, 0x78d6, 0xa684, 0x0100, 0x0040, 0x3c23, 0x682c,
++	0xa084, 0x0001, 0x0040, 0x3c23, 0x7888, 0xa084, 0x0040, 0x0040,
++	0x3c23, 0xa6b5, 0x8000, 0x1078, 0x46f0, 0x7e5a, 0x6eb6, 0x0078,
++	0x4727, 0x1078, 0x38fa, 0x00c0, 0x3cbc, 0x702c, 0x8004, 0x0048,
++	0x3c37, 0x2019, 0x4e3b, 0x1078, 0x2276, 0x702f, 0x0001, 0x2041,
++	0x0001, 0x2031, 0x1000, 0x789b, 0x0018, 0x6814, 0xa084, 0x001f,
++	0xa085, 0x0080, 0x78aa, 0x691c, 0xa184, 0x0002, 0x0040, 0x3c50,
++	0xa6b5, 0x0004, 0x78ab, 0x0020, 0x6828, 0x78aa, 0xa8c0, 0x0002,
++	0x681c, 0xd0f4, 0x0040, 0x3c59, 0x2c50, 0x1078, 0x39ac, 0x1078,
++	0x45ff, 0x6820, 0xa084, 0x8000, 0x0040, 0x3c67, 0xa6b5, 0x0400,
++	0x789b, 0x000e, 0x6824, 0x8007, 0x78aa, 0x0078, 0x3c6e, 0x681c,
++	0xa084, 0x8000, 0x00c0, 0x3c6e, 0xa6b5, 0x0800, 0x6820, 0xa084,
++	0x0100, 0x0040, 0x3c75, 0xa6b5, 0x4000, 0x681c, 0xa084, 0x00c0,
++	0x8003, 0x8003, 0x8007, 0xa080, 0x3cc2, 0x2004, 0xa635, 0xa684,
++	0x0100, 0x0040, 0x3c8f, 0x682c, 0xa084, 0x0001, 0x0040, 0x3c8f,
++	0x7888, 0xa084, 0x0040, 0x0040, 0x3c8f, 0xa6b5, 0x8000, 0x789b,
++	0x007e, 0x7eae, 0x6eb6, 0x6814, 0x8007, 0x78aa, 0x7882, 0x2810,
++	0x7aaa, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x3cbc, 0x0018, 0x3cbc,
++	0x70b4, 0xa080, 0x00e2, 0x781a, 0x1078, 0x3912, 0xa684, 0x0200,
++	0x0040, 0x3cb0, 0x682c, 0x78d2, 0x6830, 0x78d6, 0x1078, 0x46f0,
++	0x2d00, 0x70a2, 0x704a, 0x6810, 0x70be, 0x7003, 0x0007, 0xad80,
++	0x000f, 0x7036, 0x0078, 0x2459, 0x1078, 0x1b62, 0x1078, 0x3912,
++	0x0078, 0x2459, 0x0000, 0x0300, 0x0200, 0x0000, 0x1078, 0x23eb,
++	0x2300, 0x0079, 0x3ccb, 0x3cce, 0x3cce, 0x3cd0, 0x1078, 0x23eb,
++	0x1078, 0x46ff, 0x6924, 0xa184, 0x00ff, 0xa086, 0x000a, 0x0040,
++	0x3ce2, 0xa184, 0xff00, 0xa085, 0x000a, 0x6826, 0x1078, 0x1b62,
++	0x0078, 0x3b96, 0x2001, 0x000a, 0x1078, 0x4691, 0x0078, 0x3b96,
++	0xa282, 0x0005, 0x0050, 0x3cee, 0x1078, 0x23eb, 0x7000, 0xa084,
++	0x0007, 0x10c0, 0x39be, 0x1078, 0x1937, 0x00c0, 0x3d0d, 0xa684,
++	0x0004, 0x0040, 0x3cff, 0x2001, 0x2800, 0x0078, 0x3d01, 0x2001,
++	0x0800, 0x71b4, 0xa188, 0x0091, 0x789b, 0x000e, 0x78aa, 0x2031,
++	0x0400, 0x7e5a, 0x791a, 0x0078, 0x2459, 0x6807, 0x0106, 0x680b,
++	0x0000, 0x689f, 0x0000, 0x6827, 0x0000, 0xa386, 0x0002, 0x00c0,
++	0x3d2e, 0xa286, 0x0002, 0x00c0, 0x3d2e, 0x78a0, 0xa005, 0x00c0,
++	0x3d2e, 0xa484, 0x8000, 0x00c0, 0x3d2e, 0x78e4, 0xa084, 0x0008,
++	0x0040, 0x3d2e, 0xa6b5, 0x0008, 0x2019, 0x0000, 0x1078, 0x411e,
++	0x2d00, 0x70a2, 0x704a, 0x7003, 0x0007, 0x7037, 0x0000, 0x6824,
++	0xa084, 0x0080, 0x0040, 0x3d40, 0x1078, 0x41d0, 0x0078, 0x2459,
++	0x2300, 0x0079, 0x3d43, 0x3d46, 0x3dc7, 0x3de6, 0x2200, 0x0079,
++	0x3d49, 0x3d4e, 0x3d5e, 0x3d84, 0x3d90, 0x3db3, 0x2029, 0x0001,
++	0xa026, 0x2011, 0x0000, 0x1078, 0x42f1, 0x0079, 0x3d57, 0x3d5c,
++	0x2459, 0x3b96, 0x3d5c, 0x3d5c, 0x1078, 0x23eb, 0x7990, 0xa18c,
++	0x0007, 0x00c0, 0x3d65, 0x2009, 0x0008, 0x2011, 0x0001, 0xa684,
++	0x0004, 0x0040, 0x3d6d, 0x2011, 0x0003, 0x2220, 0xa12a, 0x2011,
++	0x0001, 0x1078, 0x42f1, 0x0079, 0x3d75, 0x3d7a, 0x2459, 0x3b96,
++	0x3d82, 0x3d7c, 0x0078, 0x472d, 0x70ab, 0x3d80, 0x0078, 0x2459,
++	0x0078, 0x3d7a, 0x1078, 0x23eb, 0xa684, 0x0010, 0x0040, 0x3d8e,
++	0x1078, 0x419f, 0x0040, 0x3d8e, 0x0078, 0x2459, 0x0078, 0x420c,
++	0x6000, 0xa084, 0x0002, 0x0040, 0x3dad, 0x70b4, 0xa080, 0x00d2,
++	0x781a, 0x0d7e, 0x1078, 0x4708, 0x2d00, 0x682e, 0x6827, 0x0000,
++	0x1078, 0x3af8, 0x0d7f, 0x1078, 0x195a, 0x7003, 0x0000, 0x7037,
++	0x0000, 0x704b, 0x0000, 0x0078, 0x3b96, 0xa684, 0x0004, 0x00c0,
++	0x3db3, 0x0078, 0x472d, 0x6000, 0xa084, 0x0004, 0x00c0, 0x3dc5,
++	0x6000, 0xa084, 0x0001, 0x0040, 0x3dc5, 0x70ab, 0x3dc5, 0x2001,
++	0x0007, 0x1078, 0x4689, 0x0078, 0x4733, 0x0078, 0x472d, 0x2200,
++	0x0079, 0x3dca, 0x3dcf, 0x3dcf, 0x3dcf, 0x3dd1, 0x3dcf, 0x1078,
++	0x23eb, 0x70a7, 0x3dd5, 0x0078, 0x4739, 0x2011, 0x0018, 0x1078,
++	0x42eb, 0x0079, 0x3ddb, 0x3de0, 0x2459, 0x3b96, 0x3de2, 0x3de4,
++	0x1078, 0x23eb, 0x1078, 0x23eb, 0x1078, 0x23eb, 0x2200, 0x0079,
++	0x3de9, 0x3dee, 0x3df0, 0x3df0, 0x3dee, 0x3dee, 0x1078, 0x23eb,
++	0x78e4, 0xa084, 0x0008, 0x0040, 0x3e05, 0x70a7, 0x3df9, 0x0078,
++	0x4739, 0x2011, 0x0004, 0x1078, 0x42eb, 0x0079, 0x3dff, 0x3e05,
++	0x2459, 0x3b96, 0x3e05, 0x3e0f, 0x3e13, 0x70ab, 0x3e0d, 0x2001,
++	0x0003, 0x1078, 0x4689, 0x0078, 0x4733, 0x0078, 0x472d, 0x70ab,
++	0x3e05, 0x0078, 0x2459, 0x70ab, 0x3e17, 0x0078, 0x2459, 0x0078,
++	0x3e0d, 0xa282, 0x0003, 0x0050, 0x3e1f, 0x1078, 0x23eb, 0xa386,
++	0x0002, 0x00c0, 0x3e38, 0xa286, 0x0002, 0x00c0, 0x3e3e, 0x78a0,
++	0xa005, 0x00c0, 0x3e3e, 0xa484, 0x8000, 0x00c0, 0x3e3e, 0x78e4,
++	0xa084, 0x0008, 0x0040, 0x3e38, 0xa6b5, 0x0008, 0x2019, 0x0000,
++	0xa684, 0x0008, 0x0040, 0x3e3e, 0x1078, 0x417c, 0x6810, 0x70be,
++	0x7003, 0x0007, 0x2300, 0x0079, 0x3e45, 0x3e48, 0x3e75, 0x3e7d,
++	0x2200, 0x0079, 0x3e4b, 0x3e50, 0x3e4e, 0x3e69, 0x1078, 0x23eb,
++	0x7990, 0xa1ac, 0x0007, 0xa026, 0x2011, 0x0001, 0x1078, 0x42f1,
++	0x0079, 0x3e5a, 0x3e5f, 0x2459, 0x3b96, 0x3e67, 0x3e61, 0x0078,
++	0x472d, 0x70ab, 0x3e65, 0x0078, 0x2459, 0x0078, 0x3e5f, 0x1078,
++	0x23eb, 0xa684, 0x0010, 0x0040, 0x3e73, 0x1078, 0x419f, 0x0040,
++	0x3e73, 0x0078, 0x2459, 0x0078, 0x420c, 0x2200, 0x0079, 0x3e78,
++	0x3e7b, 0x3e7b, 0x3e7b, 0x1078, 0x23eb, 0x2200, 0x0079, 0x3e80,
++	0x3e83, 0x3e85, 0x3e85, 0x1078, 0x23eb, 0x78e4, 0xa084, 0x0008,
++	0x0040, 0x3e9a, 0x70a7, 0x3e8e, 0x0078, 0x4739, 0x2011, 0x0004,
++	0x1078, 0x42eb, 0x0079, 0x3e94, 0x3e9a, 0x2459, 0x3b96, 0x3e9a,
++	0x3ea4, 0x3ea8, 0x70ab, 0x3ea2, 0x2001, 0x0003, 0x1078, 0x4689,
++	0x0078, 0x4733, 0x0078, 0x472d, 0x70ab, 0x3e9a, 0x0078, 0x2459,
++	0x70ab, 0x3eac, 0x0078, 0x2459, 0x0078, 0x3ea2, 0x2300, 0x0079,
++	0x3eb1, 0x3eb6, 0x3eb8, 0x3eb4, 0x1078, 0x23eb, 0x70a4, 0x007a,
++	0x70a4, 0x007a, 0xa282, 0x0002, 0x0050, 0x3ec0, 0x1078, 0x23eb,
++	0xa684, 0x0200, 0x0040, 0x3eca, 0x1078, 0x46f8, 0x1078, 0x42d3,
++	0x1078, 0x46ff, 0x2300, 0x0079, 0x3ecd, 0x3ed0, 0x3ef4, 0x3f5a,
++	0xa286, 0x0001, 0x0040, 0x3ed6, 0x1078, 0x23eb, 0xa684, 0x0200,
++	0x0040, 0x3ede, 0x1078, 0x46f8, 0x1078, 0x46ff, 0x2001, 0x0001,
++	0x1078, 0x4691, 0x78b8, 0xa084, 0xc001, 0x0040, 0x3ef0, 0x7848,
++	0xa085, 0x0008, 0x784a, 0x7848, 0xa084, 0x0008, 0x00c0, 0x3eeb,
++	0x7003, 0x0000, 0x0078, 0x3b96, 0x2200, 0x0079, 0x3ef7, 0x3ef9,
++	0x3f2a, 0x70a7, 0x3efd, 0x0078, 0x4739, 0x2011, 0x000d, 0x1078,
++	0x42eb, 0x0079, 0x3f03, 0x3f0a, 0x2459, 0x3b96, 0x3f12, 0x3f1a,
++	0x3f20, 0x3f22, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
++	0x0078, 0x4727, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
++	0x0078, 0x4727, 0x70ab, 0x3f1e, 0x0078, 0x2459, 0x0078, 0x3f0a,
++	0x1078, 0x23eb, 0x70ab, 0x3f26, 0x0078, 0x2459, 0x1078, 0x473f,
++	0x0078, 0x2459, 0x70a7, 0x3f2e, 0x0078, 0x4739, 0x2011, 0x0012,
++	0x1078, 0x42eb, 0x0079, 0x3f34, 0x3f3a, 0x2459, 0x3b96, 0x3f46,
++	0x3f4e, 0x3f54, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
++	0x70b4, 0xa080, 0x00a6, 0x781a, 0x0078, 0x2459, 0xa6b4, 0x00ff,
++	0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x0078, 0x4727, 0x70ab, 0x3f52,
++	0x0078, 0x2459, 0x0078, 0x3f3a, 0x70ab, 0x3f58, 0x0078, 0x2459,
++	0x0078, 0x3f46, 0xa286, 0x0001, 0x0040, 0x3f60, 0x1078, 0x23eb,
++	0x70a7, 0x3f64, 0x0078, 0x4739, 0x2011, 0x0015, 0x1078, 0x42eb,
++	0x0079, 0x3f6a, 0x3f6f, 0x2459, 0x3b96, 0x3f7d, 0x3f89, 0xa6b4,
++	0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x783b, 0x1301, 0x70b4,
++	0xa080, 0x00b4, 0x781a, 0x0078, 0x2459, 0xa6b4, 0x00ff, 0xa6b5,
++	0x0400, 0x6eb6, 0x7e5a, 0x70b4, 0xa080, 0x00a6, 0x781a, 0x0078,
++	0x2459, 0x70ab, 0x3f8d, 0x0078, 0x2459, 0x0078, 0x3f6f, 0xa282,
++	0x0003, 0x0050, 0x3f95, 0x1078, 0x23eb, 0x2300, 0x0079, 0x3f98,
++	0x3f9b, 0x3fd2, 0x402d, 0xa286, 0x0001, 0x0040, 0x3fa1, 0x1078,
++	0x23eb, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x3fae,
++	0x1078, 0x3af8, 0x7003, 0x0000, 0x0078, 0x3b96, 0x683b, 0x0000,
++	0x6837, 0x0000, 0xa684, 0x0200, 0x0040, 0x3fbc, 0x1078, 0x46f8,
++	0x1078, 0x42d3, 0x1078, 0x46ff, 0x2001, 0x0001, 0x1078, 0x4691,
++	0x78b8, 0xa084, 0xc001, 0x0040, 0x3fce, 0x7848, 0xa085, 0x0008,
++	0x784a, 0x7848, 0xa084, 0x0008, 0x00c0, 0x3fc9, 0x7003, 0x0000,
++	0x0078, 0x3b96, 0x2200, 0x0079, 0x3fd5, 0x3fd7, 0x4008, 0x70a7,
++	0x3fdb, 0x0078, 0x4739, 0x2011, 0x000d, 0x1078, 0x42eb, 0x0079,
++	0x3fe1, 0x3fe8, 0x2459, 0x3b96, 0x3ff0, 0x3ff8, 0x3ffe, 0x4000,
++	0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4727,
++	0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4727,
++	0x70ab, 0x3ffc, 0x0078, 0x2459, 0x0078, 0x3fe8, 0x1078, 0x23eb,
++	0x70ab, 0x4004, 0x0078, 0x2459, 0x1078, 0x473f, 0x0078, 0x2459,
++	0x70a7, 0x400c, 0x0078, 0x4739, 0x2011, 0x0005, 0x1078, 0x42eb,
++	0x0079, 0x4012, 0x4017, 0x2459, 0x3b96, 0x401f, 0x4027, 0xa6b4,
++	0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4727, 0xa6b4,
++	0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4727, 0x70ab,
++	0x402b, 0x0078, 0x2459, 0x0078, 0x4017, 0xa286, 0x0001, 0x0040,
++	0x4033, 0x1078, 0x23eb, 0x70a7, 0x4037, 0x0078, 0x4739, 0x2011,
++	0x0006, 0x1078, 0x42eb, 0x0079, 0x403d, 0x4042, 0x2459, 0x3b96,
++	0x4048, 0x4052, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4727,
++	0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0xa6b5, 0x4000, 0x7e5a,
++	0x0078, 0x4727, 0x70ab, 0x4056, 0x0078, 0x2459, 0x0078, 0x4042,
++	0x2300, 0x0079, 0x405b, 0x4060, 0x405e, 0x405e, 0x1078, 0x23eb,
++	0x1078, 0x23eb, 0x2300, 0x71a8, 0xa005, 0x017a, 0x6810, 0x70be,
++	0xa282, 0x0003, 0x0050, 0x406e, 0x1078, 0x23eb, 0x2300, 0x0079,
++	0x4071, 0x4074, 0x4082, 0x40a4, 0xa684, 0x0200, 0x0040, 0x407c,
++	0x1078, 0x46f8, 0x1078, 0x46ff, 0x2001, 0x0001, 0x1078, 0x4691,
++	0x0078, 0x2459, 0xa296, 0x0002, 0x0040, 0x408b, 0x82ff, 0x0040,
++	0x408b, 0x1078, 0x23eb, 0x70a7, 0x408f, 0x0078, 0x4739, 0x2011,
++	0x0018, 0x1078, 0x42eb, 0x0079, 0x4095, 0x409a, 0x2459, 0x3b96,
++	0x409c, 0x409e, 0x0078, 0x4727, 0x0078, 0x4727, 0x70ab, 0x40a2,
++	0x0078, 0x2459, 0x0078, 0x409a, 0x2200, 0x0079, 0x40a7, 0x40a9,
++	0x40c2, 0x70a7, 0x40ad, 0x0078, 0x4739, 0x2011, 0x0017, 0x1078,
++	0x42eb, 0x0079, 0x40b3, 0x40b8, 0x2459, 0x3b96, 0x40ba, 0x40bc,
++	0x0078, 0x4727, 0x0078, 0x4727, 0x70ab, 0x40c0, 0x0078, 0x2459,
++	0x0078, 0x40b8, 0xa484, 0x8000, 0x00c0, 0x410c, 0xa684, 0x0100,
++	0x0040, 0x40d6, 0x1078, 0x46f8, 0x1078, 0x42d3, 0x1078, 0x46ff,
++	0x7848, 0xa085, 0x000c, 0x784a, 0x0078, 0x40da, 0x78d8, 0x78d2,
++	0x78dc, 0x78d6, 0xa6b4, 0xefff, 0x7e5a, 0x70a7, 0x40e1, 0x0078,
++	0x4739, 0x2011, 0x000d, 0x1078, 0x42eb, 0x0079, 0x40e7, 0x40ee,
++	0x2459, 0x3b96, 0x40ee, 0x40fc, 0x4102, 0x4104, 0xa684, 0x0100,
++	0x0040, 0x40fa, 0x1078, 0x46b6, 0x682c, 0x78d2, 0x6830, 0x78d6,
++	0x1078, 0x46f0, 0x0078, 0x4727, 0x70ab, 0x4100, 0x0078, 0x2459,
++	0x0078, 0x40ee, 0x1078, 0x23eb, 0x70ab, 0x4108, 0x0078, 0x2459,
++	0x1078, 0x473f, 0x0078, 0x2459, 0x1078, 0x46ff, 0x70ab, 0x4116,
++	0x2001, 0x0003, 0x1078, 0x4689, 0x0078, 0x4733, 0x1078, 0x46f0,
++	0x682c, 0x78d2, 0x6830, 0x78d6, 0x0078, 0x4727, 0x70b8, 0x6812,
++	0x70be, 0x8000, 0x70ba, 0x681b, 0x0000, 0xa684, 0x0008, 0x0040,
++	0x4141, 0x157e, 0x137e, 0x147e, 0x7890, 0x8004, 0x8004, 0x8004,
++	0x8004, 0xa084, 0x000f, 0x681a, 0x80ac, 0x789b, 0x0000, 0xaf80,
++	0x002b, 0x2098, 0xad80, 0x000b, 0x20a0, 0x53a5, 0x147f, 0x137f,
++	0x157f, 0xa6c4, 0x0f00, 0xa684, 0x0002, 0x00c0, 0x4150, 0x692c,
++	0x810d, 0x810d, 0x810d, 0xa184, 0x0007, 0x2008, 0x0078, 0x415f,
++	0x789b, 0x0010, 0x79ac, 0xa184, 0x0020, 0x0040, 0x415f, 0x017e,
++	0x2009, 0x0005, 0x2001, 0x3d00, 0x1078, 0x46c1, 0x017f, 0xa184,
++	0x001f, 0xa805, 0x6816, 0x1078, 0x3b69, 0x68be, 0xa684, 0x0004,
++	0x0040, 0x4170, 0xa18c, 0xff00, 0x78a8, 0xa084, 0x00ff, 0xa105,
++	0x682a, 0xa6b4, 0x00ff, 0x6000, 0xa084, 0x0008, 0x0040, 0x417a,
++	0xa6b5, 0x4000, 0x6eb6, 0x007c, 0x157e, 0x137e, 0x147e, 0x6918,
++	0x7890, 0x8004, 0x8004, 0x8004, 0x8004, 0xa084, 0x000f, 0x007e,
++	0xa100, 0x681a, 0x007f, 0x8000, 0x8004, 0x0040, 0x419b, 0x20a8,
++	0x8104, 0xa080, 0x000b, 0xad00, 0x20a0, 0x789b, 0x0000, 0xaf80,
++	0x002b, 0x2098, 0x53a5, 0x147f, 0x137f, 0x157f, 0x007c, 0x682c,
++	0xa084, 0x0020, 0x00c0, 0x41a7, 0x620c, 0x0078, 0x41a8, 0x6210,
++	0x6b18, 0x2300, 0xa202, 0x0040, 0x41c8, 0x2018, 0xa382, 0x000e,
++	0x0048, 0x41b8, 0x0040, 0x41b8, 0x2019, 0x000e, 0x0078, 0x41bc,
++	0x7858, 0xa084, 0xffef, 0x785a, 0x783b, 0x1b01, 0x7893, 0x0000,
++	0x7ba2, 0x70b4, 0xa080, 0x008e, 0x781a, 0xa085, 0x0001, 0x007c,
++	0x7858, 0xa084, 0xffef, 0x785a, 0x7893, 0x0000, 0xa006, 0x007c,
++	0x6904, 0xa18c, 0x00ff, 0xa196, 0x0007, 0x0040, 0x41dd, 0xa196,
++	0x000f, 0x0040, 0x41dd, 0x6807, 0x0117, 0x6914, 0x1078, 0x3b69,
++	0x6100, 0x8104, 0x00c8, 0x41f8, 0x601c, 0xa005, 0x0040, 0x41ec,
++	0x2001, 0x0800, 0x0078, 0x41fa, 0x0d7e, 0x6824, 0x007e, 0x1078,
++	0x4708, 0x007f, 0x6826, 0x2d00, 0x682e, 0x1078, 0x3af8, 0x0d7f,
++	0x2001, 0x0200, 0x6826, 0x8007, 0x789b, 0x000e, 0x78aa, 0x6820,
++	0xa085, 0x8000, 0x6822, 0x2031, 0x0400, 0x6eb6, 0x7e5a, 0x71b4,
++	0xa188, 0x0091, 0x791a, 0x007c, 0xa6c4, 0x0f00, 0xa684, 0x0002,
++	0x00c0, 0x4220, 0x692c, 0x810d, 0x810d, 0x810d, 0xa184, 0x0007,
++	0x2008, 0xa805, 0x6816, 0x1078, 0x3b69, 0x68be, 0x0078, 0x4223,
++	0x6914, 0x1078, 0x3b69, 0x6100, 0x8104, 0x00c8, 0x4280, 0xa184,
++	0x0300, 0x0040, 0x422f, 0x6807, 0x0117, 0x0078, 0x424d, 0x6004,
++	0xa005, 0x00c0, 0x4256, 0x6807, 0x0117, 0x601c, 0xa005, 0x00c0,
++	0x4243, 0x0d7e, 0x1078, 0x4708, 0x6827, 0x0034, 0x2d00, 0x682e,
++	0x1078, 0x3af8, 0x0d7f, 0xa684, 0x0004, 0x0040, 0x424d, 0x2031,
++	0x0400, 0x2001, 0x2800, 0x0078, 0x4251, 0x2031, 0x0400, 0x2001,
++	0x0800, 0x71b4, 0xa188, 0x0091, 0x0078, 0x42ae, 0x6018, 0xa005,
++	0x00c0, 0x4243, 0x601c, 0xa005, 0x00c0, 0x4243, 0x689f, 0x0000,
++	0x6827, 0x003d, 0xa684, 0x0001, 0x0040, 0x42bc, 0xd694, 0x00c0,
++	0x4279, 0x6100, 0xd1d4, 0x0040, 0x4279, 0x692c, 0x81ff, 0x0040,
++	0x42bc, 0xa186, 0x0003, 0x0040, 0x42bc, 0xa186, 0x0012, 0x0040,
++	0x42bc, 0xa6b5, 0x0800, 0x71b4, 0xa188, 0x00af, 0x0078, 0x42b7,
++	0x6807, 0x0117, 0x2031, 0x0400, 0x692c, 0xa18c, 0x00ff, 0xa186,
++	0x0012, 0x00c0, 0x4291, 0x2001, 0x42c9, 0x2009, 0x0001, 0x0078,
++	0x42a2, 0xa186, 0x0003, 0x00c0, 0x429b, 0x2001, 0x42ca, 0x2009,
++	0x0012, 0x0078, 0x42a2, 0x2001, 0x0200, 0x71b4, 0xa188, 0x0091,
++	0x0078, 0x42ae, 0x1078, 0x46db, 0x78a3, 0x0000, 0x681c, 0xa085,
++	0x0040, 0x681e, 0x71b4, 0xa188, 0x00df, 0xa006, 0x6826, 0x8007,
++	0x789b, 0x000e, 0x78aa, 0x6820, 0xa085, 0x8000, 0x6822, 0x6eb6,
++	0x7e5a, 0x791a, 0x0078, 0x2459, 0x6eb6, 0x1078, 0x3af8, 0x6810,
++	0x70be, 0x7003, 0x0007, 0x70a3, 0x0000, 0x704b, 0x0000, 0x0078,
++	0x2459, 0x0023, 0x0070, 0x0005, 0x0000, 0x0a00, 0x0000, 0x0000,
++	0x0025, 0x0000, 0x0000, 0x683b, 0x0000, 0x6837, 0x0000, 0xa684,
++	0x0200, 0x0040, 0x42ea, 0x78b8, 0xa08c, 0x001f, 0xa084, 0x8000,
++	0x0040, 0x42e3, 0x8108, 0x78d8, 0xa100, 0x6836, 0x78dc, 0xa081,
++	0x0000, 0x683a, 0x007c, 0x7990, 0x810f, 0xa5ac, 0x0007, 0x2021,
++	0x0000, 0xa480, 0x0010, 0x789a, 0x79a8, 0xa18c, 0x00ff, 0xa184,
++	0x0080, 0x00c0, 0x4319, 0xa182, 0x0020, 0x00c8, 0x4337, 0xa182,
++	0x0012, 0x00c8, 0x467b, 0x2100, 0x1079, 0x4307, 0x007c, 0x467b,
++	0x44e8, 0x467b, 0x467b, 0x4344, 0x4347, 0x4381, 0x43b7, 0x43eb,
++	0x43ee, 0x467b, 0x467b, 0x43a2, 0x4412, 0x444c, 0x467b, 0x467b,
++	0x4473, 0xa184, 0x0020, 0x00c0, 0x44a7, 0xa18c, 0x001f, 0x6814,
++	0xa084, 0x001f, 0xa106, 0x0040, 0x4334, 0x70b4, 0xa080, 0x00d2,
++	0x781a, 0x2001, 0x0014, 0x1078, 0x4691, 0x1078, 0x46ff, 0x7003,
++	0x0000, 0x2001, 0x0002, 0x007c, 0x2001, 0x0000, 0x007c, 0xa182,
++	0x0024, 0x00c8, 0x467b, 0xa184, 0x0003, 0x1079, 0x4307, 0x007c,
++	0x467b, 0x467b, 0x467b, 0x467b, 0x1078, 0x467b, 0x007c, 0x2200,
++	0x0079, 0x434a, 0x4476, 0x4476, 0x436e, 0x436e, 0x436e, 0x436e,
++	0x436e, 0x436e, 0x436e, 0x436e, 0x436c, 0x436e, 0x4363, 0x436e,
++	0x436e, 0x436e, 0x436e, 0x436e, 0x4376, 0x4379, 0x4476, 0x4379,
++	0x436e, 0x436e, 0x436e, 0x0c7e, 0x077e, 0x6f14, 0x1078, 0x36e2,
++	0x077f, 0x0c7f, 0x0078, 0x436e, 0x1078, 0x458b, 0x6827, 0x02b3,
++	0x2009, 0x000b, 0x2001, 0x4800, 0x0078, 0x44aa, 0x1078, 0x4670,
++	0x007c, 0x6827, 0x0093, 0x2009, 0x000b, 0x2001, 0x4800, 0x0078,
++	0x4492, 0x2d58, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0,
++	0x438b, 0x6807, 0x0117, 0x6827, 0x0002, 0x1078, 0x4708, 0x6827,
++	0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078, 0x3ac8, 0x1078,
++	0x44d0, 0x2b68, 0x1078, 0x3af8, 0x0d7f, 0x1078, 0x3af8, 0x2001,
++	0x0002, 0x007c, 0x1078, 0x44d0, 0x2001, 0x0017, 0x1078, 0x4691,
++	0x70a3, 0x0000, 0x2009, 0x5138, 0x200b, 0x0006, 0x70af, 0x0017,
++	0x2009, 0x0200, 0x1078, 0x3a06, 0x2001, 0x0001, 0x007c, 0x2200,
++	0x0079, 0x43ba, 0x4476, 0x44a7, 0x44a7, 0x44a7, 0x43db, 0x44b7,
++	0x43e3, 0x44b7, 0x44b7, 0x44ba, 0x44ba, 0x44bf, 0x44bf, 0x43d3,
++	0x43d3, 0x44a7, 0x44a7, 0x44b7, 0x44a7, 0x43e3, 0x4476, 0x43e3,
++	0x43e3, 0x43e3, 0x43e3, 0x6827, 0x0084, 0x2009, 0x000b, 0x2001,
++	0x4300, 0x0078, 0x44c9, 0x6827, 0x000d, 0x2009, 0x000b, 0x2001,
++	0x4300, 0x0078, 0x44aa, 0x6827, 0x0093, 0x2009, 0x000b, 0x2001,
++	0x4300, 0x0078, 0x4492, 0x2001, 0x0000, 0x007c, 0x2200, 0x0079,
++	0x43f1, 0x4476, 0x440a, 0x440a, 0x440a, 0x440a, 0x44b7, 0x44b7,
++	0x44b7, 0x44b7, 0x44b7, 0x44b7, 0x44b7, 0x44b7, 0x440a, 0x440a,
++	0x440a, 0x440a, 0x44b7, 0x440a, 0x440a, 0x44b7, 0x44b7, 0x44b7,
++	0x44b7, 0x4476, 0x6827, 0x0093, 0x2009, 0x000b, 0x2001, 0x4300,
++	0x0078, 0x4492, 0xa684, 0x0004, 0x00c0, 0x4426, 0x6804, 0xa084,
++	0x00ff, 0xa086, 0x0006, 0x00c0, 0x467b, 0x1078, 0x44d0, 0x6807,
++	0x0117, 0x1078, 0x3af8, 0x2001, 0x0002, 0x007c, 0x6000, 0xa084,
++	0x0004, 0x0040, 0x467b, 0x2d58, 0x6804, 0xa084, 0x00ff, 0xa086,
++	0x0006, 0x00c0, 0x4435, 0x6807, 0x0117, 0x6827, 0x0002, 0x1078,
++	0x4708, 0x6827, 0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078,
++	0x3ad7, 0x1078, 0x44d0, 0x2b68, 0x1078, 0x3af8, 0x0d7f, 0x1078,
++	0x3af8, 0x2001, 0x0002, 0x007c, 0x6000, 0xa084, 0x0004, 0x0040,
++	0x467b, 0x2d58, 0x6a04, 0xa294, 0x00ff, 0xa286, 0x0006, 0x00c0,
++	0x445b, 0x6807, 0x0117, 0x6827, 0x0002, 0x2d58, 0x1078, 0x4708,
++	0x6827, 0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078, 0x3ae7,
++	0x1078, 0x44d0, 0x2b68, 0x1078, 0x3af8, 0x0d7f, 0x1078, 0x3af8,
++	0x2001, 0x0002, 0x007c, 0x1078, 0x467b, 0x007c, 0x70b4, 0xa080,
++	0x00d2, 0x781a, 0x2001, 0x0001, 0x1078, 0x4691, 0x1078, 0x46ff,
++	0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x1078, 0x46c1, 0x1078,
++	0x46f8, 0x1078, 0x42d3, 0x1078, 0x41d0, 0x1078, 0x46ff, 0x2001,
++	0x0001, 0x007c, 0x1078, 0x46c1, 0x1078, 0x46f8, 0x1078, 0x42d3,
++	0x70b4, 0xa080, 0x00d2, 0x781a, 0x2001, 0x0013, 0x1078, 0x4691,
++	0x1078, 0x46ff, 0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x1078,
++	0x467b, 0x007c, 0x1078, 0x46c1, 0x1078, 0x46f8, 0x1078, 0x42d3,
++	0x1078, 0x41d0, 0x1078, 0x46ff, 0x2001, 0x0001, 0x007c, 0x2001,
++	0x0003, 0x007c, 0x1078, 0x458b, 0x2001, 0x0000, 0x007c, 0x0c7e,
++	0x077e, 0x6f14, 0x1078, 0x36e2, 0x077f, 0x0c7f, 0x2001, 0x0000,
++	0x007c, 0x1078, 0x46c1, 0x1078, 0x467b, 0x2001, 0x0006, 0x007c,
++	0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x44db, 0xa186,
++	0x000f, 0x00c0, 0x44df, 0x1078, 0x46f8, 0x1078, 0x42d3, 0x70b4,
++	0xa080, 0x00d2, 0x781a, 0x1078, 0x46ff, 0x7003, 0x0000, 0x007c,
++	0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004,
++	0x00c8, 0x467b, 0x1079, 0x44f5, 0x007c, 0x467b, 0x44f9, 0x467b,
++	0x4592, 0xa282, 0x0003, 0x0040, 0x4500, 0x1078, 0x467b, 0x007c,
++	0x7da8, 0xa5ac, 0x00ff, 0x7ca8, 0xa4a4, 0x00ff, 0x69b8, 0xa184,
++	0x0100, 0x0040, 0x453f, 0xa18c, 0xfeff, 0x69ba, 0x78a0, 0xa005,
++	0x00c0, 0x453f, 0xa4a4, 0x00ff, 0x0040, 0x4533, 0xa482, 0x000c,
++	0x0040, 0x451c, 0x00c8, 0x4526, 0x852b, 0x852b, 0x1078, 0x3760,
++	0x0040, 0x4526, 0x1078, 0x355b, 0x0078, 0x4535, 0x1078, 0x465d,
++	0x1078, 0x3586, 0x69b8, 0xa18d, 0x0100, 0x69ba, 0xa6b5, 0x1000,
++	0x7e5a, 0x0078, 0x4538, 0x1078, 0x3586, 0xa6b4, 0xefff, 0x7e5a,
++	0x70b4, 0xa080, 0x0091, 0x781a, 0x2001, 0x0001, 0x007c, 0x0c7e,
++	0x1078, 0x457f, 0x6200, 0xd2e4, 0x0040, 0x4570, 0x6208, 0x8217,
++	0xa294, 0x00ff, 0xa282, 0x000c, 0x0048, 0x4552, 0x0040, 0x4552,
++	0x2011, 0x000c, 0x2400, 0xa202, 0x00c8, 0x4557, 0x2220, 0x6208,
++	0xa294, 0x00ff, 0x701c, 0xa202, 0x00c8, 0x455f, 0x721c, 0x2200,
++	0xa502, 0x00c8, 0x4564, 0x2228, 0x1078, 0x4661, 0x852b, 0x852b,
++	0x1078, 0x3760, 0x0040, 0x4570, 0x1078, 0x3562, 0x0078, 0x4574,
++	0x1078, 0x465d, 0x1078, 0x358d, 0xa6b5, 0x1000, 0x7e5a, 0x70b4,
++	0xa080, 0x00be, 0x781a, 0x2001, 0x0004, 0x0c7f, 0x007c, 0x007e,
++	0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e0,
++	0x5380, 0x007f, 0x007c, 0x0c7e, 0x1078, 0x457f, 0x1078, 0x358d,
++	0x0c7f, 0x007c, 0xa282, 0x0002, 0x00c0, 0x467b, 0x7aa8, 0xa294,
++	0x00ff, 0x69b8, 0xa184, 0x0200, 0x0040, 0x45c9, 0xa18c, 0xfdff,
++	0x69ba, 0x78a0, 0xa005, 0x00c0, 0x45c9, 0xa282, 0x0002, 0x00c8,
++	0x369d, 0x1078, 0x4627, 0x1078, 0x362b, 0x1078, 0x3586, 0xa684,
++	0x0100, 0x0040, 0x45bf, 0x682c, 0xa084, 0x0001, 0x0040, 0x45bf,
++	0xc6fc, 0x7888, 0xa084, 0x0040, 0x0040, 0x45bf, 0xc6fd, 0xa6b5,
++	0x1000, 0x7e5a, 0x70b4, 0xa080, 0x0091, 0x781a, 0x2001, 0x0001,
++	0x007c, 0x0c7e, 0x1078, 0x457f, 0xa284, 0xfffe, 0x0040, 0x45d4,
++	0x2011, 0x0001, 0x0078, 0x45d8, 0xa284, 0x0001, 0x0040, 0x45de,
++	0x6100, 0xd1ec, 0x00c0, 0x45de, 0x2011, 0x0000, 0x1078, 0x4619,
++	0x1078, 0x3632, 0x1078, 0x358d, 0xa684, 0x0100, 0x0040, 0x45f4,
++	0x682c, 0xa084, 0x0001, 0x0040, 0x45f4, 0xc6fc, 0x7888, 0xa084,
++	0x0040, 0x0040, 0x45f4, 0xc6fd, 0xa6b5, 0x1000, 0x7e5a, 0x70b4,
++	0xa080, 0x00be, 0x781a, 0x2001, 0x0004, 0x0c7f, 0x007c, 0x0c7e,
++	0x2960, 0x6000, 0x2011, 0x0001, 0xa084, 0x2000, 0x00c0, 0x460a,
++	0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003,
++	0x7aaa, 0xa8c0, 0x0004, 0x68b8, 0xa085, 0x0200, 0x68ba, 0x0c7f,
++	0x007c, 0x789b, 0x0018, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab,
++	0x0003, 0x7aaa, 0x789b, 0x0081, 0x78ab, 0x0004, 0x007c, 0x0c7e,
++	0x7054, 0x2060, 0x6000, 0xa084, 0x1000, 0x00c0, 0x4635, 0x2029,
++	0x0032, 0x2021, 0x0000, 0x0078, 0x4655, 0x6508, 0xa5ac, 0x00ff,
++	0x7018, 0xa086, 0x0028, 0x00c0, 0x4645, 0xa582, 0x0019, 0x00c8,
++	0x464b, 0x2029, 0x0019, 0x0078, 0x464b, 0xa582, 0x000c, 0x00c8,
++	0x464b, 0x2029, 0x000c, 0x6408, 0x8427, 0xa4a4, 0x00ff, 0xa482,
++	0x000c, 0x0048, 0x4655, 0x2021, 0x000c, 0x1078, 0x4661, 0x68b8,
++	0xa085, 0x0100, 0x68ba, 0x0c7f, 0x007c, 0x2021, 0x0000, 0x2029,
++	0x0032, 0x789b, 0x0018, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
++	0x0001, 0x7daa, 0x7caa, 0x789b, 0x0081, 0x78ab, 0x0005, 0x007c,
++	0x2001, 0x0003, 0x1078, 0x4689, 0x70b4, 0xa080, 0x00be, 0x781a,
++	0x2001, 0x0005, 0x007c, 0x2001, 0x0007, 0x1078, 0x4689, 0xa6b5,
++	0x1000, 0x7e5a, 0x70b4, 0xa080, 0x00be, 0x781a, 0x2001, 0x0004,
++	0x007c, 0x789b, 0x0018, 0x78aa, 0x789b, 0x0081, 0x78ab, 0x0001,
++	0x007c, 0x6904, 0xa18c, 0x00ff, 0xa196, 0x0007, 0x0040, 0x469f,
++	0xa196, 0x000f, 0x0040, 0x469f, 0x1078, 0x195a, 0x007c, 0x6924,
++	0xa194, 0x003f, 0x00c0, 0x46a8, 0xa18c, 0xffc0, 0xa105, 0x6826,
++	0x1078, 0x3af8, 0x691c, 0xa184, 0x0100, 0x0040, 0x46b5, 0x6914,
++	0x1078, 0x3b69, 0x6204, 0x8210, 0x6206, 0x007c, 0x692c, 0x6834,
++	0x682e, 0xa112, 0x6930, 0x6838, 0x6832, 0xa11b, 0xa200, 0xa301,
++	0x007c, 0x0c7e, 0xade0, 0x0018, 0x6003, 0x0070, 0x6106, 0x600b,
++	0x0000, 0x600f, 0x0a00, 0x6013, 0x0000, 0x6017, 0x0000, 0x8007,
++	0x601a, 0x601f, 0x0000, 0x6023, 0x0000, 0x0c7f, 0x6824, 0xa085,
++	0x0080, 0x6826, 0x007c, 0x157e, 0x137e, 0x147e, 0x2098, 0xaf80,
++	0x002d, 0x20a0, 0x81ac, 0x0040, 0x46e6, 0x53a6, 0xa184, 0x0001,
++	0x0040, 0x46ec, 0x3304, 0x78be, 0x147f, 0x137f, 0x157f, 0x007c,
++	0x70b0, 0xa005, 0x10c0, 0x23eb, 0x70b3, 0x8000, 0x0078, 0x4a3a,
++	0x71b0, 0x81ff, 0x0040, 0x46fe, 0x1078, 0x4b30, 0x007c, 0x71b0,
++	0x81ff, 0x0040, 0x4707, 0x70b3, 0x0000, 0x1078, 0x4776, 0x007c,
++	0x0c7e, 0x0d7e, 0x1078, 0x1937, 0x0c7f, 0x157e, 0x137e, 0x147e,
++	0x2da0, 0x2c98, 0x20a9, 0x0031, 0x53a3, 0x147f, 0x137f, 0x157f,
++	0x6807, 0x010d, 0x680b, 0x0000, 0x7004, 0x8007, 0x681a, 0x6823,
++	0x0000, 0x681f, 0x0000, 0x689f, 0x0000, 0x0c7f, 0x007c, 0x70b4,
++	0xa080, 0x0091, 0x781a, 0x0078, 0x2459, 0x70b4, 0xa080, 0x0081,
++	0x781a, 0x0078, 0x2459, 0x70b4, 0xa080, 0x00be, 0x781a, 0x0078,
++	0x2459, 0x70b4, 0xa080, 0x00c8, 0x781a, 0x0078, 0x2459, 0x6904,
++	0xa18c, 0x00ff, 0xa196, 0x0007, 0x0040, 0x474c, 0xa196, 0x000f,
++	0x0040, 0x474c, 0x6807, 0x0117, 0x2001, 0x0200, 0x6826, 0x8007,
++	0x789b, 0x000e, 0x78aa, 0x6820, 0xa085, 0x8000, 0x6822, 0x2031,
++	0x0400, 0x6eb6, 0x7e5a, 0x71b4, 0xa188, 0x0091, 0x791a, 0x007c,
++	0x1078, 0x46ff, 0x7848, 0xa085, 0x000c, 0x784a, 0x70b4, 0xa080,
++	0x00d2, 0x781a, 0x2009, 0x000b, 0x2001, 0x4400, 0x1078, 0x46c1,
++	0x2001, 0x0013, 0x1078, 0x4691, 0x0078, 0x3b96, 0x127e, 0x2091,
++	0x2200, 0x2049, 0x4776, 0x7000, 0x7204, 0xa205, 0x720c, 0xa215,
++	0x7008, 0xa084, 0xfff7, 0xa205, 0x0040, 0x4788, 0x0078, 0x478d,
++	0x7003, 0x0000, 0x127f, 0x2000, 0x007c, 0x7000, 0xa084, 0x0001,
++	0x00c0, 0x47bb, 0x7108, 0x8103, 0x00c8, 0x479a, 0x1078, 0x48bd,
++	0x0078, 0x4792, 0x700c, 0xa08c, 0x00ff, 0x0040, 0x47bb, 0x7004,
++	0x8004, 0x00c8, 0x47b2, 0x7014, 0xa005, 0x00c0, 0x47ae, 0x7010,
++	0xa005, 0x0040, 0x47b2, 0xa102, 0x00c8, 0x4792, 0x7007, 0x0010,
++	0x0078, 0x47bb, 0x8aff, 0x0040, 0x47bb, 0x1078, 0x4b07, 0x00c0,
++	0x47b5, 0x0040, 0x4792, 0x1078, 0x4846, 0x7003, 0x0000, 0x127f,
++	0x2000, 0x007c, 0x017e, 0x6104, 0xa18c, 0x00ff, 0xa186, 0x0007,
++	0x0040, 0x47ce, 0xa18e, 0x000f, 0x00c0, 0x47d1, 0x6040, 0x0078,
++	0x47d2, 0x6428, 0x017f, 0x84ff, 0x0040, 0x47fc, 0x2c70, 0x7004,
++	0xa0bc, 0x000f, 0xa7b8, 0x480c, 0x273c, 0x87fb, 0x00c0, 0x47ea,
++	0x0048, 0x47e4, 0x1078, 0x23eb, 0x609c, 0xa075, 0x0040, 0x47fc,
++	0x0078, 0x47d7, 0x2704, 0xae68, 0x6808, 0xa630, 0x680c, 0xa529,
++	0x8421, 0x0040, 0x47fc, 0x8738, 0x2704, 0xa005, 0x00c0, 0x47eb,
++	0x709c, 0xa075, 0x00c0, 0x47d7, 0x007c, 0x0000, 0x0005, 0x0009,
++	0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000, 0x0003, 0x0009,
++	0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x4801, 0x47fe, 0x0000,
++	0x0000, 0x8000, 0x0000, 0x4801, 0x0000, 0x4809, 0x4806, 0x0000,
++	0x0000, 0x0000, 0x0000, 0x4809, 0x0000, 0x4804, 0x4804, 0x0000,
++	0x0000, 0x8000, 0x0000, 0x4804, 0x0000, 0x480a, 0x480a, 0x0000,
++	0x0000, 0x0000, 0x0000, 0x480a, 0x127e, 0x2091, 0x2200, 0x2079,
++	0x5100, 0x2071, 0x0010, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003,
++	0x0000, 0x2071, 0x0020, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003,
++	0x0000, 0x2049, 0x0000, 0x127f, 0x2000, 0x007c, 0x2049, 0x4846,
++	0x2019, 0x0000, 0x7004, 0x8004, 0x00c8, 0x4899, 0x7007, 0x0012,
++	0x7108, 0x7008, 0xa106, 0x00c0, 0x4850, 0xa184, 0x01e0, 0x0040,
++	0x485b, 0x1078, 0x23eb, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
++	0x00c8, 0x4866, 0xa184, 0x4000, 0x00c0, 0x4850, 0xa19c, 0x300c,
++	0xa386, 0x2004, 0x0040, 0x4874, 0xa386, 0x0008, 0x0040, 0x487f,
++	0xa386, 0x200c, 0x00c0, 0x4850, 0x7200, 0x8204, 0x0048, 0x487f,
++	0x730c, 0xa384, 0x00ff, 0x0040, 0x487f, 0x1078, 0x23eb, 0x7007,
++	0x0012, 0x7000, 0xa084, 0x0001, 0x00c0, 0x4899, 0x7008, 0xa084,
++	0x01e0, 0x00c0, 0x4899, 0x7310, 0x7014, 0xa305, 0x0040, 0x4899,
++	0x710c, 0xa184, 0x0300, 0x00c0, 0x4899, 0xa184, 0x00ff, 0x00c0,
++	0x4846, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xa084, 0x0008,
++	0x00c0, 0x489d, 0x7007, 0x0012, 0x7108, 0x8103, 0x0048, 0x48a2,
++	0x7003, 0x0000, 0x2049, 0x0000, 0x007c, 0x107e, 0x007e, 0x127e,
++	0x157e, 0x2091, 0x2200, 0x7108, 0x1078, 0x48bd, 0x157f, 0x127f,
++	0x2091, 0x8001, 0x007f, 0x107f, 0x007c, 0x7204, 0x7500, 0x730c,
++	0xa384, 0x0300, 0x00c0, 0x48e4, 0xa184, 0x01e0, 0x00c0, 0x4908,
++	0x7108, 0xa184, 0x01e0, 0x00c0, 0x4908, 0x2001, 0x04fd, 0x2004,
++	0xa082, 0x0005, 0x00c8, 0x48d8, 0xa184, 0x4000, 0x00c0, 0x48c8,
++	0xa184, 0x0007, 0x0079, 0x48dc, 0x48e6, 0x48f8, 0x48e4, 0x48f8,
++	0x48e4, 0x4944, 0x48e4, 0x4942, 0x1078, 0x23eb, 0x7004, 0xa084,
++	0x0010, 0xa085, 0x0002, 0x7006, 0x8aff, 0x00c0, 0x48f3, 0x2049,
++	0x0000, 0x0078, 0x48f7, 0x1078, 0x4b07, 0x00c0, 0x48f3, 0x007c,
++	0x7004, 0xa084, 0x0010, 0xa085, 0x0002, 0x7006, 0x8aff, 0x00c0,
++	0x4903, 0x0078, 0x4907, 0x1078, 0x4b07, 0x00c0, 0x4903, 0x007c,
++	0x7007, 0x0012, 0x7108, 0x00e0, 0x490b, 0x2091, 0x6000, 0x00e0,
++	0x490f, 0x2091, 0x6000, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004,
++	0xa084, 0x0008, 0x00c0, 0x4917, 0x7007, 0x0012, 0x7108, 0x8103,
++	0x0048, 0x491c, 0x7003, 0x0000, 0x7000, 0xa005, 0x00c0, 0x4930,
++	0x7004, 0xa005, 0x00c0, 0x4930, 0x700c, 0xa005, 0x0040, 0x4932,
++	0x0078, 0x4913, 0x2049, 0x0000, 0x1078, 0x3809, 0x6818, 0xa084,
++	0x8000, 0x0040, 0x493d, 0x681b, 0x0002, 0x007c, 0x1078, 0x23eb,
++	0x1078, 0x23eb, 0x1078, 0x49a0, 0x7210, 0x7114, 0x700c, 0xa09c,
++	0x00ff, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000, 0x1078, 0x49a0,
++	0x2704, 0x2c58, 0xac60, 0x6308, 0x2200, 0xa322, 0x630c, 0x2100,
++	0xa31b, 0x2400, 0xa305, 0x0040, 0x4967, 0x00c8, 0x4967, 0x8412,
++	0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078, 0x494e, 0x2b60,
++	0x8a07, 0x007e, 0x6004, 0xa084, 0x0008, 0x0040, 0x4973, 0xa7ba,
++	0x4806, 0x0078, 0x4975, 0xa7ba, 0x47fe, 0x007f, 0xa73d, 0x2c00,
++	0x6886, 0x6f8a, 0x6c92, 0x6b8e, 0x7007, 0x0012, 0x1078, 0x4846,
++	0x007c, 0x8738, 0x2704, 0xa005, 0x00c0, 0x4994, 0x609c, 0xa005,
++	0x0040, 0x499d, 0x2060, 0x6004, 0xa084, 0x000f, 0xa080, 0x480c,
++	0x203c, 0x87fb, 0x1040, 0x23eb, 0x8a51, 0x0040, 0x499c, 0x7008,
++	0xa084, 0x0003, 0xa086, 0x0003, 0x007c, 0x2051, 0x0000, 0x007c,
++	0x8a50, 0x8739, 0x2704, 0xa004, 0x00c0, 0x49b4, 0x6000, 0xa064,
++	0x00c0, 0x49ab, 0x2d60, 0x6004, 0xa084, 0x000f, 0xa080, 0x481c,
++	0x203c, 0x87fb, 0x1040, 0x23eb, 0x007c, 0x127e, 0x0d7e, 0x2091,
++	0x2200, 0x0d7f, 0x6884, 0x2060, 0x6888, 0x6b8c, 0x6c90, 0x8057,
++	0xaad4, 0x00ff, 0xa084, 0x00ff, 0x007e, 0x6804, 0xa084, 0x0008,
++	0x007f, 0x0040, 0x49cf, 0xa0b8, 0x4806, 0x0078, 0x49d1, 0xa0b8,
++	0x47fe, 0x7e08, 0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff, 0xa186,
++	0x0007, 0x0040, 0x49df, 0xa18e, 0x000f, 0x00c0, 0x49e8, 0x681c,
++	0xa084, 0x0040, 0x0040, 0x49ef, 0xa6b5, 0x0001, 0x0078, 0x49ef,
++	0x681c, 0xa084, 0x0040, 0x0040, 0x49ef, 0xa6b5, 0x0001, 0x7007,
++	0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x49f1, 0x2400, 0xa305,
++	0x00c0, 0x49fc, 0x0078, 0x4a22, 0x2c58, 0x2704, 0x6104, 0xac60,
++	0x6000, 0xa400, 0x701a, 0x6004, 0xa301, 0x701e, 0xa184, 0x0008,
++	0x0040, 0x4a12, 0x6010, 0xa081, 0x0000, 0x7022, 0x6014, 0xa081,
++	0x0000, 0x7026, 0x6208, 0x2400, 0xa202, 0x7012, 0x620c, 0x2300,
++	0xa203, 0x7016, 0x7602, 0x7007, 0x0001, 0x2b60, 0x1078, 0x4981,
++	0x0078, 0x4a24, 0x1078, 0x4b07, 0x00c0, 0x4a22, 0x127f, 0x2000,
++	0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x7007, 0x0004,
++	0x7004, 0xa084, 0x0004, 0x00c0, 0x4a30, 0x7003, 0x0008, 0x127f,
++	0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x2049,
++	0x4a3a, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x4a43,
++	0x7e08, 0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007,
++	0x0040, 0x4a56, 0xa18e, 0x000f, 0x00c0, 0x4a61, 0x681c, 0xa084,
++	0x0040, 0x0040, 0x4a5d, 0xa6b5, 0x0001, 0x6840, 0x2050, 0x0078,
++	0x4a6a, 0x681c, 0xa084, 0x0020, 0x00c0, 0x4a68, 0xa6b5, 0x0001,
++	0x6828, 0x2050, 0x2d60, 0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x480c,
++	0x273c, 0x87fb, 0x00c0, 0x4a7e, 0x0048, 0x4a78, 0x1078, 0x23eb,
++	0x689c, 0xa065, 0x0040, 0x4a82, 0x0078, 0x4a6b, 0x1078, 0x4b07,
++	0x00c0, 0x4a7e, 0x127f, 0x2000, 0x007c, 0x127e, 0x007e, 0x017e,
++	0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x037f, 0x047f, 0x7e08, 0xa6b5,
++	0x000c, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4a9c,
++	0xa18e, 0x000f, 0x00c0, 0x4aa5, 0x681c, 0xa084, 0x0040, 0x0040,
++	0x4aac, 0xa6b5, 0x0001, 0x0078, 0x4aac, 0x681c, 0xa084, 0x0040,
++	0x0040, 0x4aac, 0xa6b5, 0x0001, 0x2049, 0x4a85, 0x017e, 0x6904,
++	0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4aba, 0xa18e, 0x000f,
++	0x00c0, 0x4abd, 0x6840, 0x0078, 0x4abe, 0x6828, 0x017f, 0xa055,
++	0x0040, 0x4b04, 0x2d70, 0x2e60, 0x7004, 0xa0bc, 0x000f, 0xa7b8,
++	0x480c, 0x273c, 0x87fb, 0x00c0, 0x4ad8, 0x0048, 0x4ad1, 0x1078,
++	0x23eb, 0x709c, 0xa075, 0x2060, 0x0040, 0x4b04, 0x0078, 0x4ac4,
++	0x2704, 0xae68, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0048, 0x4af1,
++	0x8a51, 0x00c0, 0x4ae5, 0x1078, 0x23eb, 0x8738, 0x2704, 0xa005,
++	0x00c0, 0x4ad9, 0x709c, 0xa075, 0x2060, 0x0040, 0x4b04, 0x0078,
++	0x4ac4, 0x8422, 0x8420, 0x831a, 0xa399, 0x0000, 0x6908, 0x2400,
++	0xa122, 0x690c, 0x2300, 0xa11b, 0x00c8, 0x4b00, 0x1078, 0x23eb,
++	0x2071, 0x0020, 0x0078, 0x49ef, 0x127f, 0x2000, 0x007c, 0x7008,
++	0xa084, 0x0003, 0xa086, 0x0003, 0x0040, 0x4b2f, 0x2704, 0xac08,
++	0x2104, 0x701a, 0x8108, 0x2104, 0x701e, 0x8108, 0x2104, 0x7012,
++	0x8108, 0x2104, 0x7016, 0x6004, 0xa084, 0x0008, 0x0040, 0x4b26,
++	0x8108, 0x2104, 0x7022, 0x8108, 0x2104, 0x7026, 0x7602, 0x7004,
++	0xa084, 0x0010, 0xa085, 0x0001, 0x7006, 0x1078, 0x4981, 0x007c,
++	0x127e, 0x007e, 0x0d7e, 0x2091, 0x2200, 0x2049, 0x4b30, 0x0d7f,
++	0x087f, 0x7108, 0xa184, 0x0003, 0x00c0, 0x4b5a, 0x017e, 0x6904,
++	0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4b4a, 0xa18e, 0x000f,
++	0x00c0, 0x4b4d, 0x6840, 0x0078, 0x4b4e, 0x6828, 0x017f, 0xa005,
++	0x0040, 0x4b68, 0x0078, 0x478d, 0x0020, 0x4b5a, 0x1078, 0x4944,
++	0x0078, 0x4b68, 0x00a0, 0x4b61, 0x7108, 0x1078, 0x48bd, 0x0078,
++	0x4b39, 0x7007, 0x0010, 0x00a0, 0x4b63, 0x7108, 0x1078, 0x48bd,
++	0x7008, 0xa086, 0x0008, 0x00c0, 0x4b39, 0x7000, 0xa005, 0x00c0,
++	0x4b39, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000, 0x007c,
++	0x127e, 0x147e, 0x137e, 0x157e, 0x0c7e, 0x0d7e, 0x2091, 0x2200,
++	0x0d7f, 0x2049, 0x4b78, 0xad80, 0x0011, 0x20a0, 0x2099, 0x0031,
++	0x700c, 0xa084, 0x00ff, 0x682a, 0x7007, 0x0008, 0x7007, 0x0002,
++	0x7003, 0x0001, 0x0040, 0x4b97, 0x8000, 0x80ac, 0x53a5, 0x7007,
++	0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x4b99, 0x0c7f, 0x2049,
++	0x0000, 0x7003, 0x0000, 0x157f, 0x137f, 0x147f, 0x127f, 0x2000,
++	0x007c, 0x2091, 0x6000, 0x2091, 0x8000, 0x78cc, 0xa005, 0x0040,
++	0x4bc0, 0x7994, 0x70d0, 0xa106, 0x00c0, 0x4bc0, 0x7804, 0xa005,
++	0x0040, 0x4bc0, 0x7807, 0x0000, 0x0068, 0x4bc0, 0x2091, 0x4080,
++	0x7820, 0x8001, 0x7822, 0x00c0, 0x4c1b, 0x7824, 0x7822, 0x2069,
++	0x5140, 0x6800, 0xa084, 0x0007, 0x0040, 0x4bde, 0xa086, 0x0002,
++	0x0040, 0x4bde, 0x6834, 0xa00d, 0x0040, 0x4bde, 0x2104, 0xa005,
++	0x0040, 0x4bde, 0x8001, 0x200a, 0x0040, 0x4cc3, 0x7848, 0xa005,
++	0x0040, 0x4bec, 0x8001, 0x784a, 0x00c0, 0x4bec, 0x2009, 0x0102,
++	0x6844, 0x200a, 0x1078, 0x21d2, 0x6890, 0xa005, 0x0040, 0x4bf8,
++	0x8001, 0x6892, 0x00c0, 0x4bf8, 0x686f, 0x0000, 0x6873, 0x0001,
++	0x2061, 0x5400, 0x20a9, 0x0100, 0x2009, 0x0002, 0x6034, 0xa005,
++	0x0040, 0x4c0e, 0x8001, 0x6036, 0x00c0, 0x4c0e, 0x6010, 0xa005,
++	0x0040, 0x4c0e, 0x017e, 0x1078, 0x21d2, 0x017f, 0xace0, 0x0010,
++	0x0070, 0x4c14, 0x0078, 0x4bfe, 0x8109, 0x0040, 0x4c1b, 0x20a9,
++	0x0100, 0x0078, 0x4bfe, 0x1078, 0x4c28, 0x1078, 0x4c4d, 0x2009,
++	0x5151, 0x2104, 0x2009, 0x0102, 0x200a, 0x2091, 0x8001, 0x007c,
++	0x7834, 0x8001, 0x7836, 0x00c0, 0x4c4c, 0x7838, 0x7836, 0x2091,
++	0x8000, 0x7844, 0xa005, 0x00c0, 0x4c37, 0x2001, 0x0101, 0x8001,
++	0x7846, 0xa080, 0x7400, 0x2040, 0x2004, 0xa065, 0x0040, 0x4c4c,
++	0x6024, 0xa005, 0x0040, 0x4c48, 0x8001, 0x6026, 0x0040, 0x4c7c,
++	0x6000, 0x2c40, 0x0078, 0x4c3d, 0x007c, 0x7828, 0x8001, 0x782a,
++	0x00c0, 0x4c7b, 0x782c, 0x782a, 0x7830, 0xa005, 0x00c0, 0x4c5a,
++	0x2001, 0x0200, 0x8001, 0x7832, 0x8003, 0x8003, 0x8003, 0x8003,
++	0xa090, 0x5400, 0xa298, 0x0002, 0x2304, 0xa084, 0x0008, 0x0040,
++	0x4c7b, 0xa290, 0x0009, 0x2204, 0xa005, 0x0040, 0x4c73, 0x8001,
++	0x2012, 0x00c0, 0x4c7b, 0x2304, 0xa084, 0xfff7, 0xa085, 0x0080,
++	0x201a, 0x1078, 0x21d2, 0x007c, 0x2069, 0x5140, 0x6800, 0xa005,
++	0x0040, 0x4c86, 0x6848, 0xac06, 0x0040, 0x4cc3, 0x601b, 0x0006,
++	0x60b4, 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085,
++	0x0060, 0x6022, 0x6000, 0x2042, 0x6714, 0x6f82, 0x1078, 0x1973,
++	0x6818, 0xa005, 0x0040, 0x4c9e, 0x8001, 0x681a, 0x6808, 0xa084,
++	0xffef, 0x680a, 0x6810, 0x8001, 0x00d0, 0x4ca8, 0x1078, 0x23eb,
++	0x6812, 0x602f, 0x0000, 0x6033, 0x0000, 0x2c68, 0x1078, 0x1c70,
++	0x2069, 0x5140, 0x7944, 0xa184, 0x0100, 0x2001, 0x0006, 0x686e,
++	0x00c0, 0x4cbe, 0x6986, 0x2001, 0x0004, 0x686e, 0x1078, 0x21cd,
++	0x2091, 0x8001, 0x007c, 0x2069, 0x0100, 0x2009, 0x5140, 0x2104,
++	0xa084, 0x0007, 0x0040, 0x4d1f, 0xa086, 0x0007, 0x00c0, 0x4cd9,
++	0x0d7e, 0x2009, 0x5152, 0x216c, 0x1078, 0x3a4e, 0x0d7f, 0x0078,
++	0x4d1f, 0x2009, 0x5152, 0x2164, 0x1078, 0x2396, 0x601b, 0x0006,
++	0x6858, 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085,
++	0x0048, 0x6022, 0x602f, 0x0000, 0x6033, 0x0000, 0x6830, 0xa084,
++	0x0040, 0x0040, 0x4d13, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848,
++	0xa084, 0x0004, 0x0040, 0x4d00, 0x0070, 0x4d00, 0x0078, 0x4cf7,
++	0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0040,
++	0x4d0d, 0x0070, 0x4d0d, 0x0078, 0x4d04, 0x20a9, 0x00fa, 0x0070,
++	0x4d13, 0x0078, 0x4d0f, 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b,
++	0x0048, 0x2009, 0x515b, 0x200b, 0x0007, 0x784c, 0x784a, 0x2091,
++	0x8001, 0x007c, 0x2079, 0x5100, 0x1078, 0x4d4d, 0x1078, 0x4d31,
++	0x1078, 0x4d3f, 0x7833, 0x0000, 0x7847, 0x0000, 0x784b, 0x0000,
++	0x007c, 0x2019, 0x0003, 0x2011, 0x5146, 0x2204, 0xa086, 0x003c,
++	0x0040, 0x4d3c, 0x2019, 0x0002, 0x7b2a, 0x7b2e, 0x007c, 0x2019,
++	0x0039, 0x2011, 0x5146, 0x2204, 0xa086, 0x003c, 0x0040, 0x4d4a,
++	0x2019, 0x0027, 0x7b36, 0x7b3a, 0x007c, 0x2019, 0x3971, 0x2011,
++	0x5146, 0x2204, 0xa086, 0x003c, 0x0040, 0x4d58, 0x2019, 0x2626,
++	0x7b22, 0x7b26, 0x783f, 0x0000, 0x7843, 0x000a, 0x007c, 0x0020,
++	0x002b, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0014, 0x0014, 0x9849, 0x0014, 0x0014, 0x0014,
++	0x0014, 0x0014, 0x0014, 0x0014, 0x0080, 0x000f, 0x0000, 0x0201,
++	0x0604, 0x0c08, 0x2120, 0x4022, 0xf880, 0x0018, 0x300b, 0xa201,
++	0x0014, 0xa200, 0x0014, 0xa200, 0x0214, 0x0000, 0x006c, 0x0002,
++	0x0014, 0x98d0, 0x009e, 0x0096, 0xa202, 0x8838, 0x3806, 0x8839,
++	0x20c3, 0x0864, 0x9884, 0x28c1, 0x9cb1, 0xa203, 0x300c, 0x2846,
++	0x8161, 0x846a, 0x8300, 0x1856, 0x883a, 0x9865, 0x28f2, 0x9c90,
++	0x9858, 0x300c, 0x28e1, 0x9c90, 0x2802, 0xa206, 0x64c3, 0x282d,
++	0xa207, 0x64a0, 0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7824, 0x68c1,
++	0x7864, 0x883e, 0x9878, 0x8576, 0x8677, 0x206b, 0x28c1, 0x9cb1,
++	0x2044, 0x2103, 0x20a2, 0x2081, 0x9865, 0xa209, 0x2901, 0x988c,
++	0x0014, 0xa205, 0xa300, 0x1872, 0x879a, 0x883c, 0x1fe2, 0xc601,
++	0xa20a, 0x856e, 0x0704, 0x9c90, 0x0014, 0xa204, 0xa300, 0x3009,
++	0x19e2, 0xf868, 0x8176, 0x86eb, 0x85eb, 0x872e, 0x87a9, 0x883f,
++	0x08e6, 0x9890, 0xf881, 0x988b, 0xc801, 0x0014, 0xf8c1, 0x0016,
++	0x85b2, 0x80f0, 0x9532, 0xfb02, 0x1de2, 0x0014, 0x8532, 0xf241,
++	0x0014, 0x1de2, 0x84a8, 0xd7a0, 0x1fe6, 0x0014, 0xa208, 0x6043,
++	0x8008, 0x1dc1, 0x0016, 0x8300, 0x8160, 0x842a, 0xf041, 0x3008,
++	0x84a8, 0x11d6, 0x7042, 0x20dd, 0x0011, 0x20d5, 0x8822, 0x0016,
++	0x8000, 0x2847, 0x1011, 0x98c3, 0x8000, 0xa000, 0x2802, 0x1011,
++	0x98c9, 0x9865, 0x283e, 0x1011, 0x98cd, 0xa20b, 0x0017, 0x300c,
++	0xa300, 0x1de2, 0xdb81, 0x0014, 0x0210, 0x98da, 0x0014, 0x26e0,
++	0x873a, 0xfb02, 0x19f2, 0x1fe2, 0x0014, 0xa20d, 0x3806, 0x0210,
++	0x9cb6, 0x0704, 0x0000, 0x006c, 0x0002, 0x984f, 0x0014, 0x009e,
++	0x00a5, 0x0017, 0x60ff, 0x300c, 0x8720, 0xa211, 0x9cd5, 0x8772,
++	0x8837, 0x2101, 0x987a, 0x10d2, 0x78e2, 0x9cd8, 0x9859, 0xd984,
++	0xf0e2, 0xf0a1, 0x98d2, 0x0014, 0x8831, 0xd166, 0x8830, 0x800f,
++	0x9401, 0xb520, 0xc802, 0x8820, 0x987a, 0x2301, 0x987a, 0x10d2,
++	0x78e4, 0x9cd8, 0x8821, 0x8820, 0x9859, 0xf123, 0xf142, 0xf101,
++	0x98cb, 0x10d2, 0x70f6, 0x8832, 0x8203, 0x870c, 0xd99e, 0x6001,
++	0x0014, 0x6845, 0x0214, 0xa21b, 0x9cd5, 0x2001, 0x98ca, 0x8201,
++	0x1852, 0xd184, 0xd163, 0x8834, 0x8001, 0x988d, 0x3027, 0x84a8,
++	0x1a56, 0x8833, 0x0014, 0xa218, 0x6981, 0x9cc1, 0x692a, 0x6902,
++	0x1834, 0x989d, 0x1a14, 0x8010, 0x8592, 0x8026, 0x84b9, 0x7021,
++	0x0014, 0xa300, 0x69e1, 0x9caa, 0x694c, 0xa213, 0x9cba, 0x1462,
++	0xa213, 0x8000, 0x16e1, 0x98b4, 0x8023, 0x16e1, 0x8001, 0x10f1,
++	0x0016, 0x6968, 0xa214, 0x9cba, 0x8004, 0x16e1, 0x0101, 0x300a,
++	0x8827, 0x0014, 0x9cba, 0x0014, 0x61c2, 0x8002, 0x14e1, 0x0016,
++	0xa217, 0x9cc1, 0x0014, 0xa300, 0x8181, 0x842a, 0x84a8, 0x1ce6,
++	0x882c, 0x0016, 0xa212, 0x9cd5, 0x10d2, 0x70e4, 0x0004, 0x8007,
++	0x9424, 0xcc1a, 0x9cd8, 0x98ca, 0x8827, 0x300a, 0x0013, 0x8000,
++	0x84a4, 0x0016, 0x11c2, 0x211e, 0x870e, 0xa21d, 0x0014, 0x878e,
++	0x0016, 0xa21c, 0x1035, 0x9891, 0xa210, 0xa000, 0x8010, 0x8592,
++	0x853b, 0xd044, 0x8022, 0x3807, 0x84bb, 0x98ef, 0x8021, 0x3807,
++	0x84b9, 0x300c, 0x817e, 0x872b, 0x8772, 0x9891, 0x0000, 0x0020,
++	0x002b, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0014, 0x0014, 0x9849, 0x0014, 0x0014, 0x98e5,
++	0x98d0, 0x0014, 0x0014, 0x0014, 0x0080, 0x013f, 0x0000, 0x0201,
++	0x0604, 0x0c08, 0x2120, 0x4022, 0xf880, 0x0018, 0x300b, 0xa201,
++	0x0014, 0xa200, 0x0014, 0xa200, 0x0214, 0xa202, 0x8838, 0x3806,
++	0x8839, 0x20c3, 0x0864, 0xa82e, 0x28c1, 0x9cb1, 0xa203, 0x300c,
++	0x2846, 0x8161, 0x846a, 0x8300, 0x1856, 0x883a, 0xa804, 0x28f2,
++	0x9c90, 0xa8f4, 0x300c, 0x28e1, 0x9c90, 0x2802, 0xa206, 0x64c3,
++	0x282d, 0xa207, 0x64a0, 0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7824,
++	0x68c1, 0x7864, 0x883e, 0xa802, 0x8576, 0x8677, 0x206b, 0x28c1,
++	0x9cb1, 0x2044, 0x2103, 0x20a2, 0x2081, 0xa8e5, 0xa209, 0x2901,
++	0xa809, 0x0014, 0xa205, 0xa300, 0x1872, 0x879a, 0x883c, 0x1fe2,
++	0xc601, 0xa20a, 0x856e, 0x0704, 0x9c90, 0x0014, 0xa204, 0xa300,
++	0x3009, 0x19e2, 0xf868, 0x8176, 0x86eb, 0x85eb, 0x872e, 0x87a9,
++	0x883f, 0x08e6, 0xa8f3, 0xf881, 0xa8ec, 0xc801, 0x0014, 0xf8c1,
++	0x0016, 0x85b2, 0x80f0, 0x9532, 0xfb02, 0x1de2, 0x0014, 0x8532,
++	0xf241, 0x0014, 0x1de2, 0x84a8, 0xd7a0, 0x1fe6, 0x0014, 0xa208,
++	0x6043, 0x8008, 0x1dc1, 0x0016, 0x8300, 0x8160, 0x842a, 0xf041,
++	0x3008, 0x84a8, 0x11d6, 0x7042, 0x20dd, 0x0011, 0x20d5, 0x8822,
++	0x0016, 0x8000, 0x2847, 0x1011, 0xa8fc, 0x8000, 0xa000, 0x2802,
++	0x1011, 0xa8fd, 0xa898, 0x283e, 0x1011, 0xa8fd, 0xa20b, 0x0017,
++	0x300c, 0xa300, 0x1de2, 0xdb81, 0x0014, 0x0210, 0xa801, 0x0014,
++	0x26e0, 0x873a, 0xfb02, 0x19f2, 0x1fe2, 0x0014, 0xa20d, 0x3806,
++	0x0210, 0x9cb6, 0x0704, 0x0017, 0x60ff, 0x300c, 0x8720, 0xa211,
++	0x9d6b, 0x8772, 0x8837, 0x2101, 0xa821, 0x10d2, 0x78e2, 0x9d6e,
++	0xa8fc, 0xd984, 0xf0e2, 0xf0a1, 0xa871, 0x0014, 0x8831, 0xd166,
++	0x8830, 0x800f, 0x9401, 0xb520, 0xc802, 0x8820, 0xa80f, 0x2301,
++	0xa80d, 0x10d2, 0x78e4, 0x9d6e, 0x8821, 0x8820, 0xa8e6, 0xf123,
++	0xf142, 0xf101, 0xa854, 0x10d2, 0x70f6, 0x8832, 0x8203, 0x870c,
++	0xd99e, 0x6001, 0x0014, 0x6845, 0x0214, 0xa21b, 0x9d6b, 0x2001,
++	0xa845, 0x8201, 0x1852, 0xd184, 0xd163, 0x8834, 0x8001, 0xa801,
++	0x3027, 0x84a8, 0x1a56, 0x8833, 0x0014, 0xa218, 0x6981, 0x9d57,
++	0x692a, 0x6902, 0x1834, 0xa805, 0x1a14, 0x8010, 0x8592, 0x8026,
++	0x84b9, 0x7021, 0x0014, 0xa300, 0x69e1, 0x9d40, 0x694c, 0xa213,
++	0x9d50, 0x1462, 0xa213, 0x8000, 0x16e1, 0xa80a, 0x8023, 0x16e1,
++	0x8001, 0x10f1, 0x0016, 0x6968, 0xa214, 0x9d50, 0x8004, 0x16e1,
++	0x0101, 0x300a, 0x8827, 0x0014, 0x9d50, 0x0014, 0x61c2, 0x8002,
++	0x14e1, 0x0016, 0xa217, 0x9d57, 0x0014, 0xa300, 0x8181, 0x842a,
++	0x84a8, 0x1ce6, 0x882c, 0x0016, 0xa212, 0x9d6b, 0x10d2, 0x70e4,
++	0x0004, 0x8007, 0x9424, 0xcc1a, 0x9d6e, 0xa8f8, 0x8827, 0x300a,
++	0x0013, 0x8000, 0x84a4, 0x0016, 0x11c2, 0x211e, 0x870e, 0xa21d,
++	0x0014, 0x878e, 0x0016, 0xa21c, 0x1035, 0xa8af, 0xa210, 0x3807,
++	0x300c, 0x817e, 0x872b, 0x8772, 0xa8a8, 0x0000, 0xdf21
++};
++#endif
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/asm_1080.h	2003-07-19 17:06:32.000000000 -0700
+@@ -0,0 +1,4554 @@
++/* @(#)asm_1080.h 1.2 */
++/*
++ * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 Qlogic, Inc.
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms are permitted provided
++ * that the following conditions are met:
++ * 1. Redistribution of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistribution in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR 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	ISP_TARGET_MODE
++/************************************************************************
++ *									*
++ *	 --- ISP1240/ISP1080/ISP1280 Initiator Firmware ---		*
++ *			      32 LUN Support				*
++ *									*
++ ************************************************************************/
++/*
++ *	Firmware Version 8.15.00 (14:35 Aug 22, 2000)
++ */
++static const u_int16_t isp_1080_risc_code[] = {
++	0x0078, 0x1041, 0x0000, 0x3d3b, 0x0000, 0x2043, 0x4f50, 0x5952,
++	0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932, 0x2c31,
++	0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749, 0x4320,
++	0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049, 0x5350,
++	0x3132, 0x3430, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056,
++	0x6572, 0x7369, 0x6f6e, 0x2030, 0x382e, 0x3135, 0x2020, 0x2043,
++	0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20, 0x3030, 0x2050,
++	0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020, 0x3030, 0x2020,
++	0x2400, 0x20c9, 0x97ff, 0x2001, 0x04fc, 0x2004, 0xa086, 0x1080,
++	0x00c0, 0x1054, 0x2071, 0x0100, 0x70a0, 0x70a2, 0x20c1, 0x0010,
++	0x2089, 0x1374, 0x0078, 0x106d, 0x2001, 0x04fc, 0x2004, 0xa086,
++	0x1280, 0x00c0, 0x1069, 0x2071, 0x0200, 0x70a0, 0x70a2, 0x2071,
++	0x0100, 0x70a0, 0x70a2, 0x20c1, 0x0010, 0x2089, 0x13f8, 0x0078,
++	0x106d, 0x20c1, 0x0020, 0x2089, 0x131c, 0x2071, 0x0010, 0x70c3,
++	0x0004, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3,
++	0x0008, 0x2001, 0x04fe, 0x70d6, 0x20c1, 0x0021, 0x2019, 0x0000,
++	0x2009, 0xfeff, 0x2100, 0x200b, 0xa5a5, 0xa1ec, 0x7fff, 0x2d64,
++	0x206b, 0x0a0a, 0xaddc, 0x3fff, 0x2b54, 0x205b, 0x5050, 0x2114,
++	0xa286, 0xa5a5, 0x0040, 0x10a4, 0xa386, 0x000f, 0x0040, 0x10a0,
++	0x2c6a, 0x2a5a, 0x20c1, 0x0020, 0x2019, 0x000f, 0x0078, 0x1080,
++	0x2c6a, 0x2a5a, 0x0078, 0x10a2, 0x2c6a, 0x2a5a, 0x2130, 0x2128,
++	0xa1a2, 0x4e00, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424,
++	0xa192, 0x9800, 0x2009, 0x0000, 0x2001, 0x0032, 0x1078, 0x207a,
++	0x2218, 0x2079, 0x4e00, 0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9,
++	0x0040, 0x42a4, 0x8109, 0x00c0, 0x10bf, 0x2009, 0xff00, 0x3400,
++	0xa102, 0x0048, 0x10cf, 0x0040, 0x10cf, 0x20a8, 0x42a4, 0x2001,
++	0x04fc, 0x2004, 0xa086, 0x1080, 0x00c0, 0x10e5, 0x2071, 0x0100,
++	0x0d7e, 0x2069, 0x4e40, 0x1078, 0x4cdd, 0x0d7f, 0x7810, 0xc0ed,
++	0x7812, 0x781b, 0x0064, 0x0078, 0x110a, 0x2001, 0x04fc, 0x2004,
++	0xa086, 0x1280, 0x00c0, 0x1105, 0x7814, 0xc0ed, 0xc0d5, 0x7816,
++	0x781b, 0x0064, 0x2071, 0x0200, 0x0d7e, 0x2069, 0x4e40, 0x1078,
++	0x4cdd, 0x2069, 0x4e80, 0x2071, 0x0100, 0x1078, 0x4cdd, 0x7814,
++	0xc0d4, 0x7816, 0x0d7f, 0x0078, 0x110a, 0x7814, 0xc0e5, 0x7816,
++	0x781b, 0x003c, 0x7eca, 0x7cc2, 0x7bc6, 0x7867, 0x0000, 0x7800,
++	0xc08d, 0x7802, 0x2031, 0x0030, 0x78af, 0x0101, 0x7823, 0x0002,
++	0x7827, 0x0002, 0x2009, 0x0002, 0x2069, 0x4e40, 0x681b, 0x0003,
++	0x6823, 0x0007, 0x6827, 0x00fa, 0x682b, 0x0008, 0x682f, 0x0028,
++	0x6837, 0x0000, 0x683b, 0x0006, 0x6833, 0x0008, 0x683f, 0x0000,
++	0x8109, 0x0040, 0x115e, 0x68d3, 0x000a, 0x68c3, 0x4ec0, 0x2079,
++	0x4e00, 0x7814, 0xd0e4, 0x00c0, 0x1144, 0xd0ec, 0x00c0, 0x1148,
++	0x68d7, 0x7329, 0x0078, 0x114a, 0x68d7, 0x730d, 0x0078, 0x114a,
++	0x68d7, 0x732d, 0x68c7, 0x53c0, 0x68cb, 0x52c0, 0x68cf, 0x93c0,
++	0x68ab, 0x9644, 0x68af, 0x9649, 0x68b3, 0x9644, 0x68b7, 0x9644,
++	0x68a7, 0x0001, 0x2069, 0x4e80, 0x0078, 0x111e, 0x68d3, 0x000a,
++	0x68c3, 0x50c0, 0x7814, 0xd0e4, 0x00c0, 0x116a, 0x68d7, 0x7439,
++	0x0078, 0x116c, 0x68d7, 0x7419, 0x68c7, 0x73c0, 0x68cb, 0x5340,
++	0x68cf, 0x94d0, 0x68ab, 0x9649, 0x68af, 0x964e, 0x68b3, 0x9649,
++	0x68b7, 0x9649, 0x68a7, 0x0001, 0x7810, 0xd0ec, 0x00c0, 0x11c2,
++	0x7814, 0xd0e4, 0x00c0, 0x11b4, 0x0e7e, 0x2069, 0x52c0, 0x2071,
++	0x0200, 0x70ec, 0xd0e4, 0x00c0, 0x1195, 0x2019, 0x0c0c, 0x2021,
++	0x000c, 0x1078, 0x2009, 0x0078, 0x119b, 0x2019, 0x0c0a, 0x2021,
++	0x000a, 0x1078, 0x2009, 0x2069, 0x5340, 0x2071, 0x0100, 0x70ec,
++	0xd0e4, 0x00c0, 0x11ab, 0x2019, 0x0c0c, 0x2021, 0x000c, 0x1078,
++	0x2009, 0x0078, 0x11b1, 0x2019, 0x0c0a, 0x2021, 0x000a, 0x1078,
++	0x2009, 0x0e7f, 0x0078, 0x11db, 0x2019, 0x0c0c, 0x2021, 0x000c,
++	0x2069, 0x52c0, 0x1078, 0x2009, 0x2069, 0x5340, 0x1078, 0x2009,
++	0x0078, 0x11db, 0x2069, 0x52c0, 0x0e7e, 0x2071, 0x0100, 0x70ec,
++	0xd0e4, 0x00c0, 0x11d4, 0x2019, 0x0c0c, 0x2021, 0x000c, 0x1078,
++	0x2009, 0x0e7f, 0x0078, 0x11db, 0x2019, 0x0c0a, 0x2021, 0x000a,
++	0x1078, 0x2009, 0x0e7f, 0x2011, 0x0002, 0x2069, 0x53c0, 0x2009,
++	0x0002, 0x20a9, 0x0100, 0x6837, 0x0000, 0x680b, 0x0040, 0x7bc8,
++	0xa386, 0xfeff, 0x00c0, 0x11f2, 0x6817, 0x0100, 0x681f, 0x0064,
++	0x0078, 0x11f6, 0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010,
++	0x00f0, 0x11e3, 0x8109, 0x00c0, 0x11e1, 0x8211, 0x0040, 0x1204,
++	0x2069, 0x73c0, 0x0078, 0x11df, 0x1078, 0x265b, 0x1078, 0x468e,
++	0x1078, 0x1dd4, 0x1078, 0x4c6f, 0x2091, 0x2100, 0x2079, 0x4e00,
++	0x7810, 0xd0ec, 0x0040, 0x1218, 0x2071, 0x0020, 0x0078, 0x121a,
++	0x2071, 0x0050, 0x2091, 0x2200, 0x2079, 0x4e00, 0x2071, 0x0020,
++	0x2091, 0x2300, 0x2079, 0x4e00, 0x7810, 0xd0ec, 0x0040, 0x122c,
++	0x2079, 0x0100, 0x0078, 0x122e, 0x2079, 0x0200, 0x2071, 0x4e40,
++	0x2091, 0x2400, 0x2079, 0x0100, 0x2071, 0x4e80, 0x2091, 0x2000,
++	0x2079, 0x4e00, 0x2071, 0x0010, 0x3200, 0xa085, 0x303d, 0x2090,
++	0x2071, 0x0010, 0x70c3, 0x0000, 0x0090, 0x124d, 0x70c0, 0xa086,
++	0x0002, 0x00c0, 0x124d, 0x1078, 0x15ba, 0x2039, 0x0000, 0x7810,
++	0xd0ec, 0x00c0, 0x12cf, 0x1078, 0x148e, 0x78ac, 0xa005, 0x00c0,
++	0x126b, 0x0068, 0x1261, 0x786c, 0xa065, 0x0040, 0x1261, 0x1078,
++	0x2395, 0x1078, 0x20a1, 0x0068, 0x1278, 0x786c, 0xa065, 0x0040,
++	0x126b, 0x1078, 0x2395, 0x0068, 0x1278, 0x2009, 0x4e47, 0x2011,
++	0x4e87, 0x2104, 0x220c, 0xa105, 0x0040, 0x1278, 0x1078, 0x1f0a,
++	0x2071, 0x4e40, 0x70a4, 0xa005, 0x0040, 0x129d, 0x7450, 0xa485,
++	0x0000, 0x0040, 0x129d, 0x2079, 0x0200, 0x2091, 0x8000, 0x72d4,
++	0xa28c, 0x303d, 0x2190, 0x1078, 0x2b6a, 0x2091, 0x8000, 0x2091,
++	0x303d, 0x0068, 0x129d, 0x2079, 0x4e00, 0x786c, 0xa065, 0x0040,
++	0x129d, 0x2071, 0x0010, 0x1078, 0x2395, 0x00e0, 0x12a5, 0x2079,
++	0x4e00, 0x2071, 0x0010, 0x1078, 0x4a43, 0x2071, 0x4e80, 0x70a4,
++	0xa005, 0x0040, 0x12bd, 0x7050, 0xa025, 0x0040, 0x12bd, 0x2079,
++	0x0100, 0x2091, 0x8000, 0x72d4, 0xa28c, 0x303d, 0x2190, 0x1078,
++	0x2b6a, 0x2091, 0x8000, 0x2091, 0x303d, 0x2079, 0x4e00, 0x2071,
++	0x0010, 0x0068, 0x12c9, 0x786c, 0xa065, 0x0040, 0x12c9, 0x1078,
++	0x2395, 0x00e0, 0x1253, 0x1078, 0x4a43, 0x0078, 0x1253, 0x1078,
++	0x148e, 0x78ac, 0xa005, 0x00c0, 0x12e7, 0x0068, 0x12dd, 0x786c,
++	0xa065, 0x0040, 0x12dd, 0x1078, 0x2395, 0x1078, 0x20a1, 0x0068,
++	0x12f1, 0x786c, 0xa065, 0x0040, 0x12e7, 0x1078, 0x2395, 0x0068,
++	0x12f1, 0x2009, 0x4e47, 0x2104, 0xa005, 0x0040, 0x12f1, 0x1078,
++	0x1f0a, 0x2071, 0x4e40, 0x70a4, 0xa005, 0x0040, 0x130c, 0x7450,
++	0xa485, 0x0000, 0x0040, 0x130c, 0x2079, 0x0100, 0x2091, 0x8000,
++	0x72d4, 0xa28c, 0x303d, 0x2190, 0x1078, 0x2b6a, 0x2091, 0x8000,
++	0x2091, 0x303d, 0x2079, 0x4e00, 0x2071, 0x0010, 0x0068, 0x1316,
++	0x786c, 0xa065, 0x0040, 0x1316, 0x1078, 0x2395, 0x00e0, 0x12cf,
++	0x1078, 0x4a43, 0x0078, 0x12cf, 0x133c, 0x133c, 0x133e, 0x133e,
++	0x134b, 0x134b, 0x134b, 0x134b, 0x1356, 0x1356, 0x1363, 0x1363,
++	0x134b, 0x134b, 0x134b, 0x134b, 0x133c, 0x133c, 0x133e, 0x133e,
++	0x134b, 0x134b, 0x134b, 0x134b, 0x1356, 0x1356, 0x1363, 0x1363,
++	0x134b, 0x134b, 0x134b, 0x134b, 0x0078, 0x133c, 0x007e, 0x107e,
++	0x127e, 0x2091, 0x2400, 0x1078, 0x298a, 0x127f, 0x107f, 0x007f,
++	0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x1078, 0x13c8,
++	0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e, 0x107e,
++	0x127e, 0x2091, 0x2300, 0x1078, 0x298a, 0x127f, 0x107f, 0x007f,
++	0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x2091, 0x2300,
++	0x1078, 0x298a, 0x2091, 0x2400, 0x1078, 0x298a, 0x127f, 0x107f,
++	0x007f, 0x2091, 0x8001, 0x007c, 0x1394, 0x1394, 0x1396, 0x1396,
++	0x13a3, 0x13a3, 0x13a3, 0x13a3, 0x13ae, 0x13ae, 0x1396, 0x1396,
++	0x13a3, 0x13a3, 0x13a3, 0x13a3, 0x13af, 0x13af, 0x13af, 0x13af,
++	0x13af, 0x13af, 0x13af, 0x13af, 0x13af, 0x13af, 0x13af, 0x13af,
++	0x13af, 0x13af, 0x13af, 0x13af, 0x0078, 0x1394, 0x007e, 0x107e,
++	0x127e, 0x2091, 0x2300, 0x1078, 0x298a, 0x127f, 0x107f, 0x007f,
++	0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x1078, 0x13d5,
++	0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007c, 0x107e,
++	0x127e, 0x0d7e, 0x0e7e, 0x0f7e, 0x007e, 0x2071, 0x0100, 0x2069,
++	0x4e40, 0x2079, 0x4e00, 0x70ec, 0xa084, 0x1c00, 0x78e2, 0x1078,
++	0x4cdd, 0x007f, 0x0f7f, 0x0e7f, 0x0d7f, 0x127f, 0x107f, 0x007c,
++	0x3c00, 0xa084, 0x0007, 0x0079, 0x13cd, 0x13de, 0x13de, 0x13e0,
++	0x13e0, 0x13e5, 0x13e5, 0x13ea, 0x13ea, 0x3c00, 0xa084, 0x0003,
++	0x0079, 0x13da, 0x13de, 0x13de, 0x13f3, 0x13f3, 0x1078, 0x296b,
++	0x2091, 0x2200, 0x1078, 0x4768, 0x007c, 0x2091, 0x2100, 0x1078,
++	0x4768, 0x007c, 0x2091, 0x2100, 0x1078, 0x4768, 0x2091, 0x2200,
++	0x1078, 0x4768, 0x007c, 0x2091, 0x2100, 0x1078, 0x4768, 0x007c,
++	0x1418, 0x1418, 0x141a, 0x141a, 0x1427, 0x1427, 0x1427, 0x1427,
++	0x1432, 0x1432, 0x143f, 0x143f, 0x1427, 0x1427, 0x1427, 0x1427,
++	0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450,
++	0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450,
++	0x0078, 0x1418, 0x007e, 0x107e, 0x127e, 0x2091, 0x2400, 0x1078,
++	0x298a, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e,
++	0x107e, 0x127e, 0x1078, 0x13c8, 0x127f, 0x107f, 0x007f, 0x2091,
++	0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x2091, 0x2300, 0x1078,
++	0x298a, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e,
++	0x107e, 0x127e, 0x2091, 0x2300, 0x1078, 0x298a, 0x2091, 0x2400,
++	0x1078, 0x298a, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c,
++	0x007e, 0x107e, 0x127e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2079, 0x4e00,
++	0x2071, 0x0200, 0x2069, 0x4e40, 0x3d00, 0xd08c, 0x0040, 0x1466,
++	0x70ec, 0xa084, 0x1c00, 0x78e2, 0x1078, 0x4cdd, 0x3d00, 0xd084,
++	0x0040, 0x1474, 0x2069, 0x4e80, 0x2071, 0x0100, 0x70ec, 0xa084,
++	0x1c00, 0x78e6, 0x1078, 0x4cdd, 0x0f7f, 0x0e7f, 0x0d7f, 0x127f,
++	0x107f, 0x007f, 0x007c, 0x7008, 0x800b, 0x00c8, 0x1489, 0x7007,
++	0x0002, 0xa08c, 0x01e0, 0x00c0, 0x148a, 0xd09c, 0x0040, 0x1489,
++	0x087a, 0x097a, 0x70c3, 0x4002, 0x0078, 0x15bd, 0x0068, 0x1513,
++	0x2061, 0x0000, 0x6018, 0xd084, 0x00c0, 0x1513, 0x7828, 0xa005,
++	0x00c0, 0x149e, 0x0010, 0x1514, 0x0078, 0x1513, 0x7910, 0xd1f4,
++	0x0040, 0x14a6, 0x2001, 0x4007, 0x0078, 0x15bc, 0x7914, 0xd1ec,
++	0x0040, 0x14c1, 0xd0fc, 0x0040, 0x14b7, 0x007e, 0x1078, 0x1d64,
++	0x007f, 0x0040, 0x14c1, 0x2001, 0x4007, 0x0078, 0x15bc, 0x007e,
++	0x1078, 0x1d54, 0x007f, 0x0040, 0x14c1, 0x2001, 0x4007, 0x0078,
++	0x15bc, 0x7910, 0xd0fc, 0x00c0, 0x14cb, 0x2061, 0x4e40, 0xc19c,
++	0xc7fc, 0x0078, 0x14cf, 0x2061, 0x4e80, 0xc19d, 0xc7fd, 0x6064,
++	0xa005, 0x00c0, 0x1513, 0x7912, 0x6083, 0x0000, 0x7828, 0xc0fc,
++	0xa086, 0x0018, 0x00c0, 0x14e0, 0x0c7e, 0x1078, 0x1b5b, 0x0c7f,
++	0x782b, 0x0000, 0x607c, 0xa065, 0x0040, 0x14f9, 0x0c7e, 0x609c,
++	0x1078, 0x1e49, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1c84, 0x2009,
++	0x0018, 0x6087, 0x0103, 0x1078, 0x1d74, 0x00c0, 0x150d, 0x1078,
++	0x1dc6, 0x7810, 0xd09c, 0x00c0, 0x1501, 0x2061, 0x4e40, 0x0078,
++	0x1505, 0x2061, 0x4e80, 0xc09c, 0x7812, 0x607f, 0x0000, 0x60d4,
++	0xd0dc, 0x0040, 0x1511, 0xc0dc, 0x60d6, 0x2001, 0x4005, 0x0078,
++	0x15bc, 0x0078, 0x15ba, 0x007c, 0x7810, 0xd0f4, 0x0040, 0x151c,
++	0x2001, 0x4007, 0x0078, 0x15bc, 0xa006, 0x70c2, 0x70c6, 0x70ca,
++	0x70ce, 0x70da, 0x70c0, 0xa03d, 0xa08a, 0x0040, 0x00c8, 0x152a,
++	0x0079, 0x1531, 0x2100, 0xa08a, 0x0040, 0x00c8, 0x15c8, 0x0079,
++	0x1571, 0x15ba, 0x1610, 0x15d9, 0x1648, 0x1680, 0x1680, 0x15d0,
++	0x1c9c, 0x168b, 0x15c8, 0x15dd, 0x15df, 0x15e1, 0x15e3, 0x1ca1,
++	0x15c8, 0x1699, 0x16f6, 0x1b7b, 0x1c96, 0x15e5, 0x19c0, 0x1a02,
++	0x1a3d, 0x1a8e, 0x197b, 0x1988, 0x199c, 0x19af, 0x17cb, 0x15c8,
++	0x172d, 0x173a, 0x1746, 0x1752, 0x1768, 0x1774, 0x1777, 0x1783,
++	0x178f, 0x1797, 0x17b3, 0x17bf, 0x15c8, 0x15c8, 0x15c8, 0x15c8,
++	0x17d8, 0x17ea, 0x1806, 0x183c, 0x1864, 0x1874, 0x1877, 0x18a8,
++	0x18d9, 0x18eb, 0x194a, 0x195a, 0x15c8, 0x15c8, 0x15c8, 0x15c8,
++	0x196a, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x1cc6, 0x1ccc,
++	0x15c8, 0x15c8, 0x15c8, 0x1cd0, 0x1d15, 0x15c8, 0x15c8, 0x15c8,
++	0x15c8, 0x160a, 0x167a, 0x1693, 0x16f0, 0x1b75, 0x15c8, 0x15c8,
++	0x1b3e, 0x15c8, 0x1d19, 0x1cb8, 0x1cc2, 0x15c8, 0x15c8, 0x15c8,
++	0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8,
++	0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8,
++	0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8,
++	0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8,
++	0x15c8, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078, 0x15bc, 0x73ce,
++	0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0068, 0x15bd, 0x2061,
++	0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x007c,
++	0x70c3, 0x4001, 0x0078, 0x15bd, 0x70c3, 0x4006, 0x0078, 0x15bd,
++	0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0078,
++	0x15ba, 0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078, 0x15ba, 0x0078,
++	0x15ba, 0x0078, 0x15ba, 0x0078, 0x15ba, 0x2091, 0x8000, 0x70c3,
++	0x0004, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3,
++	0x0008, 0x2001, 0x000f, 0x70d6, 0x2079, 0x0000, 0x781b, 0x0001,
++	0x2031, 0x0030, 0x2059, 0x1000, 0x2029, 0x041a, 0x2051, 0x0445,
++	0x2061, 0x0447, 0x20c1, 0x0020, 0x2091, 0x5000, 0x2091, 0x4080,
++	0x0078, 0x0418, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1613,
++	0x2029, 0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x20a0,
++	0x2099, 0x0030, 0x7003, 0x0001, 0x7007, 0x0006, 0x731a, 0x721e,
++	0x7422, 0x7526, 0x2021, 0x0040, 0x81ff, 0x0040, 0x15ba, 0xa182,
++	0x0040, 0x00c8, 0x162d, 0x2120, 0xa006, 0x2008, 0x8403, 0x7012,
++	0x7007, 0x0004, 0x7007, 0x0001, 0x7008, 0xd0fc, 0x0040, 0x1634,
++	0x7007, 0x0002, 0xa084, 0x01e0, 0x0040, 0x1642, 0x70c3, 0x4002,
++	0x0078, 0x15bd, 0x24a8, 0x53a5, 0x0078, 0x1624, 0x0078, 0x15ba,
++	0x2029, 0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x2098,
++	0x20a1, 0x0030, 0x7003, 0x0000, 0x7007, 0x0006, 0x731a, 0x721e,
++	0x7422, 0x7526, 0x2021, 0x0040, 0x7007, 0x0006, 0x81ff, 0x0040,
++	0x15ba, 0xa182, 0x0040, 0x00c8, 0x1667, 0x2120, 0xa006, 0x2008,
++	0x8403, 0x7012, 0x24a8, 0x53a6, 0x7007, 0x0001, 0x7008, 0xd0fc,
++	0x0040, 0x166e, 0xa084, 0x01e0, 0x0040, 0x165c, 0x70c3, 0x4002,
++	0x0078, 0x15bd, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x164b,
++	0x71c4, 0x70c8, 0x2114, 0xa79e, 0x0004, 0x00c0, 0x1688, 0x200a,
++	0x72ca, 0x0078, 0x15b9, 0x70c7, 0x0008, 0x70cb, 0x000f, 0x70cf,
++	0x0000, 0x0078, 0x15ba, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078,
++	0x169c, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0,
++	0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005, 0x0040, 0x16eb, 0xa40a,
++	0x0040, 0x16ac, 0x00c8, 0x16b5, 0x8001, 0x7872, 0xa084, 0xfc00,
++	0x0040, 0x16b9, 0x78ac, 0xc085, 0x78ae, 0x2001, 0x4005, 0x0078,
++	0x15bc, 0x7b7e, 0x7a7a, 0x7e86, 0x7d82, 0x7c76, 0xa48c, 0xff00,
++	0x0040, 0x16d1, 0x8407, 0x8004, 0x8004, 0x810c, 0x810c, 0x810f,
++	0xa118, 0xa291, 0x0000, 0xa6b1, 0x0000, 0xa581, 0x0000, 0x0078,
++	0x16db, 0x8407, 0x8004, 0x8004, 0xa318, 0xa291, 0x0000, 0xa6b1,
++	0x0000, 0xa581, 0x0000, 0x731a, 0x721e, 0x7622, 0x7026, 0xa605,
++	0x0040, 0x16e5, 0x7a10, 0xc2c5, 0x7a12, 0x78ac, 0xa084, 0xfffc,
++	0x78ae, 0x0078, 0x16ee, 0x78ac, 0xc085, 0x78ae, 0x0078, 0x15ba,
++	0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, 0x16f9, 0x2029, 0x0000,
++	0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6, 0x72ca, 0x73ce,
++	0x74d6, 0xa005, 0x0040, 0x1728, 0xa40a, 0x0040, 0x1709, 0x00c8,
++	0x15bc, 0x8001, 0x7892, 0xa084, 0xfc00, 0x0040, 0x1716, 0x78ac,
++	0xc0c5, 0x78ae, 0x2001, 0x4005, 0x0078, 0x15bc, 0x7a9a, 0x7b9e,
++	0x7da2, 0x7ea6, 0x2600, 0xa505, 0x0040, 0x1721, 0x7a10, 0xc2c5,
++	0x7a12, 0x7c96, 0x78ac, 0xa084, 0xfcff, 0x78ae, 0x0078, 0x172b,
++	0x78ac, 0xc0c5, 0x78ae, 0x0078, 0x15ba, 0x2009, 0x0000, 0x786c,
++	0xa065, 0x0040, 0x1737, 0x8108, 0x6000, 0x0078, 0x1730, 0x7ac4,
++	0x0078, 0x15b8, 0x2009, 0x4e48, 0x210c, 0x7810, 0xd0ec, 0x00c0,
++	0x15b9, 0x2011, 0x4e88, 0x2214, 0x0078, 0x15b8, 0x2009, 0x4e49,
++	0x210c, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2011, 0x4e89, 0x2214,
++	0x0078, 0x15b8, 0x2061, 0x4e40, 0x6128, 0x622c, 0x8214, 0x8214,
++	0x8214, 0x7810, 0xd0ec, 0x00c0, 0x1766, 0x2061, 0x4e80, 0x6328,
++	0x73da, 0x632c, 0x831c, 0x831c, 0x831c, 0x73de, 0x0078, 0x15b8,
++	0x2009, 0x4e4c, 0x210c, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2011,
++	0x4e8c, 0x2214, 0x0078, 0x15b8, 0x7918, 0x0078, 0x15b9, 0x2009,
++	0x4e4d, 0x210c, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2011, 0x4e8d,
++	0x2214, 0x0078, 0x15b8, 0x2009, 0x4e4e, 0x210c, 0x7810, 0xd0ec,
++	0x00c0, 0x15b9, 0x2011, 0x4e8e, 0x2214, 0x0078, 0x15b8, 0x7920,
++	0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x7a24, 0x0078, 0x15b8, 0x71c4,
++	0xd1fc, 0x00c0, 0x179f, 0x2011, 0x52c0, 0x0078, 0x17a1, 0x2011,
++	0x5340, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa268,
++	0x6a00, 0x6804, 0xd09c, 0x0040, 0x17b0, 0x6b08, 0x0078, 0x17b1,
++	0x6b0c, 0x0078, 0x15b7, 0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000,
++	0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708, 0x0078, 0x15b7, 0x2061,
++	0x4e40, 0x6118, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2061, 0x4e80,
++	0x6218, 0x0078, 0x15b8, 0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000,
++	0x6908, 0x6a18, 0x6b10, 0x77da, 0x2091, 0x8001, 0x0078, 0x15b7,
++	0x71c4, 0x2110, 0xa294, 0x000f, 0xa282, 0x0010, 0x00c8, 0x15b2,
++	0x1078, 0x277f, 0xa384, 0x4000, 0x0040, 0x17e8, 0xa295, 0x0020,
++	0x0078, 0x15b7, 0x71c4, 0x2100, 0xc0bc, 0xa082, 0x0010, 0x00c8,
++	0x15b2, 0xd1bc, 0x00c0, 0x17f9, 0x2011, 0x4e48, 0x2204, 0x0078,
++	0x17fd, 0x2011, 0x4e88, 0x2204, 0xc0bd, 0x007e, 0x2100, 0xc0bc,
++	0x2012, 0x1078, 0x26dc, 0x017f, 0x0078, 0x15b9, 0x71c4, 0x2021,
++	0x4e49, 0x2404, 0x70c6, 0x2019, 0x0000, 0x0078, 0x1815, 0x71c8,
++	0x2021, 0x4e89, 0x2404, 0x70ca, 0xc3fd, 0x2011, 0x1834, 0x20a9,
++	0x0008, 0x2204, 0xa106, 0x0040, 0x1824, 0x8210, 0x00f0, 0x1819,
++	0x71c4, 0x72c8, 0x0078, 0x15b1, 0xa292, 0x1834, 0x027e, 0x2122,
++	0x017f, 0x1078, 0x26fd, 0x7810, 0xd0ec, 0x00c0, 0x1832, 0xd3fc,
++	0x0040, 0x180f, 0x0078, 0x15ba, 0x03e8, 0x00fa, 0x01f4, 0x02ee,
++	0x0004, 0x0001, 0x0002, 0x0003, 0x2061, 0x4e40, 0x6128, 0x622c,
++	0x8214, 0x8214, 0x8214, 0x70c4, 0x602a, 0x70c8, 0x8003, 0x8003,
++	0x8003, 0x602e, 0x7810, 0xd0ec, 0x00c0, 0x1862, 0x027e, 0x017e,
++	0x2061, 0x4e80, 0x6128, 0x622c, 0x8214, 0x8214, 0x8214, 0x70d8,
++	0x602a, 0x70dc, 0x8003, 0x8003, 0x8003, 0x602e, 0x71da, 0x72de,
++	0x017f, 0x027f, 0x0078, 0x15b8, 0x2061, 0x4e40, 0x6130, 0x70c4,
++	0x6032, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2061, 0x4e80, 0x6230,
++	0x70c8, 0x6032, 0x0078, 0x15b8, 0x7918, 0x0078, 0x15b9, 0x71c4,
++	0xa184, 0xffcf, 0x0040, 0x1883, 0x7810, 0xd0ec, 0x00c0, 0x15b2,
++	0x72c8, 0x0078, 0x15b1, 0x2011, 0x4e4d, 0x2204, 0x2112, 0x007e,
++	0x2019, 0x0000, 0x1078, 0x2764, 0x7810, 0xd0ec, 0x0040, 0x1893,
++	0x017f, 0x0078, 0x15b9, 0x71c8, 0xa184, 0xffcf, 0x0040, 0x189c,
++	0x2110, 0x71c4, 0x0078, 0x15b1, 0x2011, 0x4e8d, 0x2204, 0x2112,
++	0x007e, 0xc3fd, 0x1078, 0x2764, 0x027f, 0x017f, 0x0078, 0x15b8,
++	0x71c4, 0xa182, 0x0010, 0x0048, 0x18b4, 0x7810, 0xd0ec, 0x00c0,
++	0x15b2, 0x72c8, 0x0078, 0x15b1, 0x2011, 0x4e4e, 0x2204, 0x007e,
++	0x2112, 0x2019, 0x0000, 0x1078, 0x2742, 0x7810, 0xd0ec, 0x0040,
++	0x18c4, 0x017f, 0x0078, 0x15b9, 0x71c8, 0xa182, 0x0010, 0x0048,
++	0x18cd, 0x2110, 0x71c4, 0x0078, 0x15b1, 0x2011, 0x4e8e, 0x2204,
++	0x007e, 0x2112, 0xc3fd, 0x1078, 0x2742, 0x027f, 0x017f, 0x0078,
++	0x15b8, 0x71c4, 0x72c8, 0xa184, 0xfffd, 0x00c0, 0x15b1, 0xa284,
++	0xfffd, 0x00c0, 0x15b1, 0x2100, 0x7920, 0x7822, 0x2200, 0x7a24,
++	0x7826, 0x0078, 0x15b8, 0x71c4, 0xd1fc, 0x00c0, 0x18f3, 0x2011,
++	0x52c0, 0x0078, 0x18f5, 0x2011, 0x5340, 0x8107, 0xa084, 0x000f,
++	0x8003, 0x8003, 0x8003, 0xa268, 0x2019, 0x0000, 0x72c8, 0x2091,
++	0x8000, 0x6800, 0x007e, 0xa226, 0x0040, 0x191e, 0x6a02, 0xd4ec,
++	0x0040, 0x190b, 0xc3a5, 0xd4e4, 0x0040, 0x190f, 0xc39d, 0xd4f4,
++	0x0040, 0x191e, 0x810f, 0xd2f4, 0x0040, 0x191a, 0x1078, 0x27c1,
++	0x0078, 0x191e, 0x1078, 0x279f, 0x0078, 0x191e, 0x72cc, 0x6808,
++	0xa206, 0x0040, 0x1940, 0xa2a4, 0x00ff, 0x7814, 0xd0e4, 0x00c0,
++	0x1931, 0xa482, 0x0028, 0x0048, 0x193d, 0x0040, 0x193d, 0x0078,
++	0x1935, 0xa482, 0x0043, 0x0048, 0x193d, 0x71c4, 0x71c6, 0x027f,
++	0x72ca, 0x2091, 0x8001, 0x0078, 0x15b3, 0x6a0a, 0xa39d, 0x000a,
++	0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4, 0x2091, 0x8001,
++	0x0078, 0x15b7, 0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000, 0x6a14,
++	0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708,
++	0x0078, 0x15b7, 0x70c4, 0x2061, 0x4e40, 0x6118, 0x601a, 0x7810,
++	0xd0ec, 0x00c0, 0x15b9, 0x70c8, 0x2061, 0x4e80, 0x6218, 0x601a,
++	0x0078, 0x15b8, 0x71c4, 0x72c8, 0x73cc, 0xa182, 0x0010, 0x00c8,
++	0x15b2, 0x1078, 0x27e3, 0xa384, 0x4000, 0x0040, 0x1979, 0xa295,
++	0x0020, 0x0078, 0x15b7, 0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000,
++	0x6a08, 0xc28d, 0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078, 0x15b8,
++	0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9,
++	0x6a0a, 0x6804, 0xa005, 0x0040, 0x1997, 0x1078, 0x2628, 0x2091,
++	0x8001, 0x2708, 0x0078, 0x15b8, 0x77c4, 0x1078, 0x1de4, 0x2091,
++	0x8000, 0x6a08, 0xc295, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x19aa,
++	0x1078, 0x2628, 0x2091, 0x8001, 0x2708, 0x0078, 0x15b8, 0x77c4,
++	0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000,
++	0x1078, 0x1dff, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0078, 0x15b8,
++	0x77c4, 0x7814, 0xd0e4, 0x00c0, 0x19d4, 0xd7fc, 0x0040, 0x19ce,
++	0x1078, 0x1d64, 0x0040, 0x19d4, 0x0078, 0x15bc, 0x1078, 0x1d54,
++	0x0040, 0x19d4, 0x0078, 0x15bc, 0x73c8, 0x72cc, 0x77c6, 0x73ca,
++	0x72ce, 0x1078, 0x1e86, 0x00c0, 0x19fe, 0x6818, 0xa005, 0x0040,
++	0x19f8, 0x2708, 0x077e, 0x1078, 0x2813, 0x077f, 0x00c0, 0x19f8,
++	0x2001, 0x0015, 0xd7fc, 0x00c0, 0x19f1, 0x2061, 0x4e40, 0x0078,
++	0x19f4, 0xc0fd, 0x2061, 0x4e80, 0x782a, 0x2091, 0x8001, 0x007c,
++	0x2091, 0x8001, 0x2001, 0x4005, 0x0078, 0x15bc, 0x2091, 0x8001,
++	0x0078, 0x15ba, 0x77c4, 0x7814, 0xd0e4, 0x00c0, 0x1a16, 0xd7fc,
++	0x0040, 0x1a10, 0x1078, 0x1d64, 0x0040, 0x1a16, 0x0078, 0x15bc,
++	0x1078, 0x1d54, 0x0040, 0x1a16, 0x0078, 0x15bc, 0x77c6, 0x2041,
++	0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078,
++	0x1dff, 0x2009, 0x0016, 0xd7fc, 0x00c0, 0x1a2a, 0x2061, 0x4e40,
++	0x0078, 0x1a2d, 0x2061, 0x4e80, 0xc1fd, 0x6067, 0x0003, 0x607f,
++	0x0000, 0x6776, 0x6083, 0x000f, 0x792a, 0x61d4, 0xc1dc, 0x61d6,
++	0x1078, 0x2628, 0x2091, 0x8001, 0x007c, 0x77c8, 0x77ca, 0x77c4,
++	0x77c6, 0x7814, 0xd0e4, 0x00c0, 0x1a54, 0xd7fc, 0x0040, 0x1a4e,
++	0x1078, 0x1d64, 0x0040, 0x1a54, 0x0078, 0x15bc, 0x1078, 0x1d54,
++	0x0040, 0x1a54, 0x0078, 0x15bc, 0xa7bc, 0xff00, 0x2091, 0x8000,
++	0x2009, 0x0017, 0xd7fc, 0x00c0, 0x1a61, 0x2061, 0x4e40, 0x0078,
++	0x1a64, 0x2061, 0x4e80, 0xc1fd, 0x607f, 0x0000, 0x6067, 0x0002,
++	0x6776, 0x6083, 0x000f, 0x792a, 0x61d4, 0xc1dc, 0x61d6, 0x1078,
++	0x2628, 0x2091, 0x8001, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051,
++	0x0010, 0x2091, 0x8000, 0x70c8, 0xa005, 0x0040, 0x1a82, 0x60d4,
++	0xc0fd, 0x60d6, 0x1078, 0x1dff, 0x70c8, 0x6836, 0x8738, 0xa784,
++	0x001f, 0x00c0, 0x1a82, 0x2091, 0x8001, 0x007c, 0x2019, 0x0000,
++	0x7814, 0xd0e4, 0x00c0, 0x1aa4, 0x72c8, 0xd284, 0x0040, 0x1a9e,
++	0x1078, 0x1d64, 0x0040, 0x1aa4, 0x0078, 0x15bc, 0x1078, 0x1d54,
++	0x0040, 0x1aa4, 0x0078, 0x15bc, 0x72c8, 0x72ca, 0x78ac, 0xa084,
++	0x0003, 0x00c0, 0x1acf, 0x2039, 0x0000, 0xd284, 0x0040, 0x1ab1,
++	0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x1078,
++	0x1de4, 0x2091, 0x8000, 0x6808, 0xc0d4, 0xa80d, 0x690a, 0x2091,
++	0x8001, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1ab7, 0xa7bc, 0xff00,
++	0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1ab7, 0x2091,
++	0x8000, 0x72c8, 0xd284, 0x00c0, 0x1ae1, 0x7810, 0xd0ec, 0x0040,
++	0x1add, 0x2069, 0x0100, 0x0078, 0x1ae3, 0x2069, 0x0200, 0x0078,
++	0x1ae3, 0x2069, 0x0100, 0x6808, 0xa084, 0xfffd, 0x680a, 0x6830,
++	0xd0b4, 0x0040, 0x1b03, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848,
++	0xd094, 0x0040, 0x1af5, 0x00f0, 0x1aef, 0x684b, 0x0009, 0x20a9,
++	0x0014, 0x6848, 0xd084, 0x0040, 0x1aff, 0x00f0, 0x1af9, 0x20a9,
++	0x00fa, 0x00f0, 0x1b01, 0x2079, 0x4e00, 0x2009, 0x0018, 0x72c8,
++	0xd284, 0x00c0, 0x1b0f, 0x2061, 0x4e40, 0x0078, 0x1b12, 0x2061,
++	0x4e80, 0xc1fd, 0x607f, 0x0000, 0x792a, 0x6067, 0x0001, 0x6083,
++	0x000f, 0x60a7, 0x0000, 0x60a8, 0x60b2, 0x60b6, 0x60d4, 0xd0b4,
++	0x0040, 0x1b2e, 0xc0b4, 0x60d6, 0x0c7e, 0x60b8, 0xa065, 0x6008,
++	0xc0d4, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f, 0x60d4, 0xa084,
++	0x77ff, 0x60d6, 0x78ac, 0xc08d, 0x78ae, 0x83ff, 0x0040, 0x1b39,
++	0x007c, 0x681b, 0x0047, 0x2091, 0x8001, 0x007c, 0x73cc, 0x1078,
++	0x1a90, 0x69ec, 0x6a48, 0xa185, 0x1800, 0x684a, 0xa185, 0x0040,
++	0x68ee, 0x73cc, 0x2021, 0x0004, 0x20a9, 0x09ff, 0x00f0, 0x1b4e,
++	0x8421, 0x00c0, 0x1b4c, 0x8319, 0x00c0, 0x1b4a, 0x69ee, 0x6a4a,
++	0x2091, 0x8001, 0x007c, 0xd7fc, 0x00c0, 0x1b62, 0x2069, 0x4e40,
++	0x0078, 0x1b64, 0x2069, 0x4e80, 0x71c4, 0x71c6, 0x6916, 0x81ff,
++	0x00c0, 0x1b6c, 0x68a7, 0x0001, 0x78ac, 0xc08c, 0x78ae, 0xd084,
++	0x00c0, 0x1b74, 0x1078, 0x1ee6, 0x007c, 0x75d8, 0x74dc, 0x75da,
++	0x74de, 0x0078, 0x1b7e, 0x2029, 0x0000, 0x2520, 0x71c4, 0x73c8,
++	0x72cc, 0x71c6, 0x73ca, 0x72ce, 0x2079, 0x4e00, 0x7dde, 0x7cda,
++	0x7bd6, 0x7ad2, 0x1078, 0x1dbd, 0x0040, 0x1c80, 0x20a9, 0x0005,
++	0x20a1, 0x4e14, 0x2091, 0x8000, 0x41a1, 0x2091, 0x8001, 0x2009,
++	0x0040, 0x1078, 0x1fd1, 0x0040, 0x1ba1, 0x1078, 0x1dc6, 0x0078,
++	0x1c80, 0x6004, 0xa08c, 0x00ff, 0xa18e, 0x0009, 0x00c0, 0x1bac,
++	0x007e, 0x1078, 0x2378, 0x007f, 0xa084, 0xff00, 0x8007, 0x8009,
++	0x0040, 0x1c20, 0x0c7e, 0x2c68, 0x1078, 0x1dbd, 0x0040, 0x1bf2,
++	0x2c00, 0x689e, 0x8109, 0x00c0, 0x1bb3, 0x609f, 0x0000, 0x0c7f,
++	0x0c7e, 0x7ddc, 0x7cd8, 0x7bd4, 0x7ad0, 0xa290, 0x0040, 0xa399,
++	0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x7dde, 0x7cda, 0x7bd6,
++	0x7ad2, 0x2c68, 0x689c, 0xa065, 0x0040, 0x1c1f, 0x2009, 0x0040,
++	0x1078, 0x1fd1, 0x00c0, 0x1c09, 0x6004, 0xa084, 0x00ff, 0xa086,
++	0x0002, 0x00c0, 0x1bf2, 0x6004, 0xa084, 0x00ff, 0xa086, 0x000a,
++	0x00c0, 0x1bee, 0x017e, 0x1078, 0x2374, 0x017f, 0x2d00, 0x6002,
++	0x0078, 0x1bc1, 0x0c7f, 0x0c7e, 0x609c, 0x1078, 0x1e49, 0x0c7f,
++	0x609f, 0x0000, 0x1078, 0x1c84, 0x2009, 0x0018, 0x6008, 0xc0cd,
++	0x600a, 0x6004, 0x6086, 0x1078, 0x1d74, 0x1078, 0x1dc6, 0x0078,
++	0x1c80, 0x0c7f, 0x0c7e, 0x609c, 0x1078, 0x1e49, 0x0c7f, 0x609f,
++	0x0000, 0x1078, 0x1c84, 0x2009, 0x0018, 0x6087, 0x0103, 0x601b,
++	0x0003, 0x1078, 0x1d74, 0x1078, 0x1dc6, 0x0078, 0x1c80, 0x0c7f,
++	0x7814, 0xd0e4, 0x00c0, 0x1c45, 0x6114, 0xd1fc, 0x0040, 0x1c2e,
++	0x1078, 0x1d64, 0x0040, 0x1c45, 0x0078, 0x1c32, 0x1078, 0x1d54,
++	0x0040, 0x1c45, 0x2029, 0x0000, 0x2520, 0x2009, 0x0018, 0x73c8,
++	0x72cc, 0x6087, 0x0103, 0x601b, 0x0021, 0x1078, 0x1d74, 0x1078,
++	0x1dc6, 0x2001, 0x4007, 0x0078, 0x15bc, 0x74c4, 0x73c8, 0x72cc,
++	0x6014, 0x2091, 0x8000, 0x0e7e, 0x2009, 0x0012, 0xd0fc, 0x00c0,
++	0x1c55, 0x2071, 0x4e40, 0x0078, 0x1c58, 0x2071, 0x4e80, 0xc1fd,
++	0x792a, 0x7067, 0x0005, 0x71d4, 0xc1dc, 0x71d6, 0x736a, 0x726e,
++	0x7472, 0x7076, 0x707b, 0x0000, 0x2c00, 0x707e, 0xa02e, 0x2530,
++	0x611c, 0xa184, 0x0060, 0x0040, 0x1c6f, 0x1078, 0x4632, 0x0e7f,
++	0x6596, 0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000,
++	0x6714, 0x6023, 0x0000, 0x1078, 0x2628, 0x2091, 0x8001, 0x007c,
++	0x70c3, 0x4005, 0x0078, 0x15bd, 0x20a9, 0x0005, 0x2099, 0x4e14,
++	0x2091, 0x8000, 0x530a, 0x2091, 0x8001, 0x2100, 0xa210, 0xa399,
++	0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c, 0x71c4, 0x70c7,
++	0x0000, 0x791e, 0x0078, 0x15ba, 0x71c4, 0x71c6, 0x2168, 0x0078,
++	0x1ca3, 0x2069, 0x1000, 0x690c, 0xa016, 0x2d04, 0xa210, 0x8d68,
++	0x8109, 0x00c0, 0x1ca5, 0xa285, 0x0000, 0x00c0, 0x1cb3, 0x70c3,
++	0x4000, 0x0078, 0x1cb5, 0x70c3, 0x4003, 0x70ca, 0x0078, 0x15bd,
++	0x7964, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x00c8, 0x15b2, 0x7966,
++	0x0078, 0x15ba, 0x7964, 0x71c6, 0x0078, 0x15ba, 0x7900, 0x71c6,
++	0x71c4, 0x7902, 0x0078, 0x15ba, 0x7900, 0x71c6, 0x0078, 0x15ba,
++	0x70c4, 0x2011, 0x0000, 0xa08c, 0x000d, 0x0040, 0x1ce5, 0x810c,
++	0x0048, 0x1ce1, 0x8210, 0x810c, 0x810c, 0x0048, 0x1ce1, 0x8210,
++	0x810c, 0x81ff, 0x00c0, 0x15b3, 0x8210, 0x7a0e, 0xd28c, 0x0040,
++	0x1d11, 0x7910, 0xc1cd, 0x7912, 0x2009, 0x0021, 0x2019, 0x0003,
++	0xd284, 0x0040, 0x1d0b, 0x8108, 0x2019, 0x0041, 0x2011, 0x964e,
++	0x2312, 0x2019, 0x0042, 0x8210, 0x2312, 0x2019, 0x0043, 0x8210,
++	0x2312, 0x2019, 0x0046, 0x8210, 0x2312, 0x2019, 0x0047, 0x8210,
++	0x2312, 0x2019, 0x0006, 0x2011, 0x9653, 0x2112, 0x2011, 0x9673,
++	0x2312, 0x7904, 0x7806, 0x0078, 0x15b9, 0x7804, 0x70c6, 0x0078,
++	0x15ba, 0x71c4, 0xd1fc, 0x00c0, 0x1d21, 0x2011, 0x52c0, 0x0078,
++	0x1d23, 0x2011, 0x5340, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003,
++	0x8003, 0xa268, 0x6a14, 0xd2b4, 0x0040, 0x1d32, 0x2011, 0x0001,
++	0x0078, 0x1d34, 0x2011, 0x0000, 0x6b0c, 0x6800, 0x70da, 0x0078,
++	0x15b7, 0x017e, 0x7814, 0xd0f4, 0x0040, 0x1d46, 0x2001, 0x4007,
++	0x70db, 0x0000, 0xa18d, 0x0001, 0x0078, 0x1d52, 0xd0fc, 0x0040,
++	0x1d51, 0x2001, 0x4007, 0x70db, 0x0001, 0xa18d, 0x0001, 0x0078,
++	0x1d52, 0xa006, 0x017f, 0x007c, 0x017e, 0x7814, 0xd0f4, 0x0040,
++	0x1d61, 0x2001, 0x4007, 0x70db, 0x0000, 0xa18d, 0x0001, 0x0078,
++	0x1d62, 0xa006, 0x017f, 0x007c, 0x017e, 0x7814, 0xd0fc, 0x0040,
++	0x1d71, 0x2001, 0x4007, 0x70db, 0x0001, 0xa18d, 0x0001, 0x0078,
++	0x1d72, 0xa006, 0x017f, 0x007c, 0x7112, 0x721a, 0x731e, 0x7810,
++	0xd0c4, 0x0040, 0x1d7d, 0x7422, 0x7526, 0xac80, 0x0001, 0x8108,
++	0x810c, 0x81a9, 0x8098, 0x20a1, 0x0030, 0x7003, 0x0000, 0x6084,
++	0x20a2, 0x53a6, 0x7007, 0x0001, 0x7974, 0xa184, 0xff00, 0x0040,
++	0x1d9a, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100,
++	0x0078, 0x1d9d, 0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78,
++	0xa006, 0xa211, 0x7d10, 0xd5c4, 0x0040, 0x1daa, 0x7b84, 0xa319,
++	0x7c80, 0xa421, 0x7008, 0xd0fc, 0x0040, 0x1daa, 0x7003, 0x0001,
++	0x7007, 0x0006, 0x711a, 0x721e, 0x7d10, 0xd5c4, 0x0040, 0x1dba,
++	0x7322, 0x7426, 0xa084, 0x01e0, 0x007c, 0x7848, 0xa065, 0x0040,
++	0x1dc5, 0x2c04, 0x784a, 0x2063, 0x0000, 0x007c, 0x0f7e, 0x2079,
++	0x4e00, 0x7848, 0x2062, 0x2c00, 0xa005, 0x00c0, 0x1dd1, 0x1078,
++	0x296b, 0x784a, 0x0f7f, 0x007c, 0x2011, 0x9800, 0x7a4a, 0x7bc4,
++	0x8319, 0x0040, 0x1de1, 0xa280, 0x0032, 0x2012, 0x2010, 0x0078,
++	0x1dd8, 0x2013, 0x0000, 0x007c, 0x017e, 0x027e, 0xd7fc, 0x00c0,
++	0x1ded, 0x2011, 0x53c0, 0x0078, 0x1def, 0x2011, 0x73c0, 0xa784,
++	0x0f00, 0x800b, 0xa784, 0x001f, 0x0040, 0x1dfa, 0x8003, 0x8003,
++	0x8003, 0x8003, 0xa105, 0xa268, 0x027f, 0x017f, 0x007c, 0x1078,
++	0x1de4, 0x2900, 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xf9ef,
++	0xa80d, 0x690a, 0x0e7e, 0xd7fc, 0x00c0, 0x1e14, 0x2009, 0x4e53,
++	0x2071, 0x4e40, 0x0078, 0x1e18, 0x2009, 0x4e93, 0x2071, 0x4e80,
++	0x210c, 0x6804, 0xa005, 0x0040, 0x1e28, 0xa116, 0x00c0, 0x1e28,
++	0x2060, 0x6000, 0x6806, 0x017e, 0x200b, 0x0000, 0x0078, 0x1e2b,
++	0x2009, 0x0000, 0x017e, 0x6804, 0xa065, 0x0040, 0x1e40, 0x6000,
++	0x6806, 0x1078, 0x1e5b, 0x1078, 0x201d, 0x6810, 0x7908, 0x8109,
++	0x790a, 0x8001, 0x6812, 0x00c0, 0x1e2b, 0x7910, 0xc1a5, 0x7912,
++	0x017f, 0x6902, 0x6906, 0x2d00, 0x2060, 0x1078, 0x2acc, 0x0e7f,
++	0x007c, 0xa065, 0x0040, 0x1e5a, 0x2008, 0x609c, 0xa005, 0x0040,
++	0x1e57, 0x2062, 0x609f, 0x0000, 0xa065, 0x0078, 0x1e4d, 0x7848,
++	0x794a, 0x2062, 0x007c, 0x6007, 0x0103, 0x608f, 0x0000, 0x20a9,
++	0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828,
++	0x601a, 0x682c, 0x6022, 0x007c, 0x0e7e, 0xd7fc, 0x00c0, 0x1e76,
++	0x2071, 0x4e40, 0x2031, 0x4ec0, 0x0078, 0x1e7a, 0x2071, 0x4e80,
++	0x2031, 0x50c0, 0x7050, 0xa08c, 0x0200, 0x00c0, 0x1e84, 0xa608,
++	0x2d0a, 0x8000, 0x7052, 0xa006, 0x0e7f, 0x007c, 0x0f7e, 0xd7fc,
++	0x00c0, 0x1e8e, 0x2079, 0x4e40, 0x0078, 0x1e90, 0x2079, 0x4e80,
++	0x1078, 0x1de4, 0x2091, 0x8000, 0x6804, 0x780a, 0xa065, 0x0040,
++	0x1ee4, 0x0078, 0x1ea2, 0x2c00, 0x780a, 0x2060, 0x6000, 0xa065,
++	0x0040, 0x1ee4, 0x6010, 0xa306, 0x00c0, 0x1e9b, 0x600c, 0xa206,
++	0x00c0, 0x1e9b, 0x2c28, 0x784c, 0xac06, 0x00c0, 0x1eb1, 0x0078,
++	0x1ee1, 0x6804, 0xac06, 0x00c0, 0x1ebf, 0x6000, 0x2060, 0x6806,
++	0xa005, 0x00c0, 0x1ebf, 0x6803, 0x0000, 0x0078, 0x1ec9, 0x6400,
++	0x7808, 0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x1ec9, 0x2c00,
++	0x6802, 0x2560, 0x0f7f, 0x1078, 0x1e5b, 0x0f7e, 0x601b, 0x0005,
++	0x6023, 0x0020, 0x0f7f, 0x1078, 0x201d, 0x0f7e, 0x7908, 0x8109,
++	0x790a, 0x6810, 0x8001, 0x6812, 0x00c0, 0x1ee1, 0x7810, 0xc0a5,
++	0x7812, 0x2001, 0xffff, 0xa005, 0x0f7f, 0x007c, 0x077e, 0x2700,
++	0x2039, 0x0000, 0xd0fc, 0x0040, 0x1eee, 0xc7fd, 0x2041, 0x0021,
++	0x2049, 0x0004, 0x2051, 0x0008, 0x2091, 0x8000, 0x1078, 0x1dff,
++	0x8738, 0xa784, 0x001f, 0x00c0, 0x1ef6, 0xa7bc, 0xff00, 0x873f,
++	0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1ef6, 0x2091, 0x8001,
++	0x077f, 0x007c, 0x786c, 0x2009, 0x9674, 0x210c, 0xa10d, 0x0040,
++	0x1f14, 0xa065, 0x0078, 0x2395, 0x2061, 0x0000, 0x6018, 0xd084,
++	0x00c0, 0x1f34, 0x7810, 0xd08c, 0x0040, 0x1f25, 0xc08c, 0x7812,
++	0xc7fc, 0x2069, 0x4e40, 0x0078, 0x1f2a, 0xc08d, 0x7812, 0x2069,
++	0x4e80, 0xc7fd, 0x2091, 0x8000, 0x681c, 0x681f, 0x0000, 0x2091,
++	0x8001, 0xa005, 0x00c0, 0x1f35, 0x007c, 0xa08c, 0xfff0, 0x0040,
++	0x1f3b, 0x1078, 0x296b, 0x0079, 0x1f3d, 0x1f4d, 0x1f50, 0x1f56,
++	0x1f5a, 0x1f4e, 0x1f5e, 0x1f4e, 0x1f4e, 0x1f4e, 0x1f64, 0x1f95,
++	0x1f99, 0x1f9f, 0x1fb4, 0x1f4e, 0x1f4e, 0x007c, 0x1078, 0x296b,
++	0x1078, 0x1ee6, 0x2001, 0x8001, 0x0078, 0x1fc0, 0x2001, 0x8003,
++	0x0078, 0x1fc0, 0x2001, 0x8004, 0x0078, 0x1fc0, 0x1078, 0x1ee6,
++	0x2001, 0x8006, 0x0078, 0x1fc0, 0x2091, 0x8000, 0x077e, 0xd7fc,
++	0x00c0, 0x1f70, 0x2069, 0x4e40, 0x2039, 0x0009, 0x0078, 0x1f74,
++	0x2069, 0x4e80, 0x2039, 0x0009, 0x6800, 0xa086, 0x0000, 0x0040,
++	0x1f7e, 0x007f, 0x6f1e, 0x2091, 0x8001, 0x007c, 0x6874, 0x077f,
++	0xa0bc, 0xff00, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010,
++	0x1078, 0x1dff, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1f88, 0x2091,
++	0x8001, 0x2001, 0x800a, 0x0078, 0x1fc0, 0x2001, 0x800c, 0x0078,
++	0x1fc0, 0x1078, 0x1ee6, 0x2001, 0x800d, 0x0078, 0x1fc0, 0x7814,
++	0xd0e4, 0x00c0, 0x1fb2, 0xd0ec, 0x0040, 0x1fac, 0xd7fc, 0x0040,
++	0x1fac, 0x78e4, 0x0078, 0x1fad, 0x78e0, 0x70c6, 0x2001, 0x800e,
++	0x0078, 0x1fc0, 0x0078, 0x1f4e, 0xd7fc, 0x0040, 0x1fba, 0x78ec,
++	0x0078, 0x1fbb, 0x78e8, 0x70c6, 0x2001, 0x800f, 0x0078, 0x1fc0,
++	0x70c2, 0xd7fc, 0x00c0, 0x1fc8, 0x70db, 0x0000, 0x0078, 0x1fca,
++	0x70db, 0x0001, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x4080,
++	0x007c, 0xac80, 0x0001, 0x81ff, 0x0040, 0x1ffc, 0x2099, 0x0030,
++	0x20a0, 0x700c, 0xa084, 0x03ff, 0x0040, 0x1fde, 0x7018, 0x007e,
++	0x701c, 0x007e, 0x7020, 0x007e, 0x7024, 0x007e, 0x7112, 0x81ac,
++	0x721a, 0x731e, 0x7422, 0x7526, 0x7003, 0x0001, 0x7007, 0x0001,
++	0x7008, 0x800b, 0x00c8, 0x1ff0, 0x7007, 0x0002, 0xa08c, 0x01e0,
++	0x00c0, 0x1ffc, 0x53a5, 0xa006, 0x7003, 0x0000, 0x7007, 0x0004,
++	0x007f, 0x7026, 0x007f, 0x7022, 0x007f, 0x701e, 0x007f, 0x701a,
++	0x007c, 0x2011, 0x0020, 0x2009, 0x0010, 0x6b0a, 0x6c0e, 0x6803,
++	0xfd00, 0x6807, 0x0018, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290,
++	0x0004, 0x8109, 0x00c0, 0x200d, 0x007c, 0x6004, 0x6086, 0x2c08,
++	0x2063, 0x0000, 0x7868, 0xa005, 0x796a, 0x0040, 0x202a, 0x2c02,
++	0x0078, 0x202b, 0x796e, 0x007c, 0x0c7e, 0x2061, 0x4e00, 0x6887,
++	0x0103, 0x2d08, 0x206b, 0x0000, 0x6068, 0xa005, 0x616a, 0x0040,
++	0x203c, 0x2d02, 0x0078, 0x203d, 0x616e, 0x0c7f, 0x007c, 0x2091,
++	0x8000, 0x2c04, 0x786e, 0xa005, 0x00c0, 0x2047, 0x786a, 0x2091,
++	0x8001, 0x609c, 0xa005, 0x0040, 0x2060, 0x0c7e, 0x2060, 0x2008,
++	0x609c, 0xa005, 0x0040, 0x205c, 0x2062, 0x609f, 0x0000, 0xa065,
++	0x609c, 0xa005, 0x00c0, 0x2054, 0x7848, 0x794a, 0x2062, 0x0c7f,
++	0x7848, 0x2062, 0x609f, 0x0000, 0xac85, 0x0000, 0x00c0, 0x206a,
++	0x1078, 0x296b, 0x784a, 0x007c, 0x20a9, 0x0010, 0xa006, 0x8004,
++	0x8086, 0x818e, 0x00c8, 0x2075, 0xa200, 0x00f0, 0x2070, 0x8086,
++	0x818e, 0x007c, 0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x209b,
++	0xa11a, 0x00c8, 0x209b, 0x8213, 0x818d, 0x0048, 0x208e, 0xa11a,
++	0x00c8, 0x208f, 0x00f0, 0x2083, 0x0078, 0x2093, 0xa11a, 0x2308,
++	0x8210, 0x00f0, 0x2083, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080,
++	0x007f, 0x157f, 0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078,
++	0x2097, 0x7d74, 0x70d0, 0xa506, 0x0040, 0x2187, 0x7810, 0x2050,
++	0x7800, 0xd08c, 0x0040, 0x20c3, 0xdaec, 0x0040, 0x20c3, 0x0e7e,
++	0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x20c0,
++	0x7008, 0x0e7f, 0xa086, 0x0008, 0x0040, 0x20c3, 0x0078, 0x2187,
++	0x0e7f, 0x0078, 0x2187, 0x1078, 0x1dbd, 0x0040, 0x2187, 0xa046,
++	0x7970, 0x2500, 0x8000, 0xa112, 0x2009, 0x0040, 0x00c8, 0x20d2,
++	0x0078, 0x20d9, 0x72d0, 0xa206, 0x0040, 0x20d9, 0x8840, 0x2009,
++	0x0080, 0x0c7e, 0x7112, 0x7007, 0x0001, 0x2099, 0x0030, 0x20a9,
++	0x0020, 0xac80, 0x0001, 0x20a0, 0x2061, 0x0000, 0x88ff, 0x0040,
++	0x20eb, 0x1078, 0x1dbd, 0x7008, 0xd0fc, 0x0040, 0x20eb, 0x7007,
++	0x0002, 0x2091, 0x8001, 0xa08c, 0x01e0, 0x00c0, 0x2122, 0x53a5,
++	0x8cff, 0x00c0, 0x2100, 0x88ff, 0x0040, 0x2171, 0x0078, 0x210a,
++	0x2c00, 0x788e, 0x20a9, 0x0020, 0xac80, 0x0001, 0x20a0, 0x53a5,
++	0x0078, 0x2171, 0xa046, 0x7218, 0x731c, 0xdac4, 0x0040, 0x2112,
++	0x7420, 0x7524, 0xa292, 0x0040, 0xa39b, 0x0000, 0xa4a3, 0x0000,
++	0xa5ab, 0x0000, 0x721a, 0x731e, 0xdac4, 0x0040, 0x2122, 0x7422,
++	0x7526, 0xa006, 0x7007, 0x0004, 0x0040, 0x2171, 0x8cff, 0x0040,
++	0x212b, 0x1078, 0x1dc6, 0x0c7f, 0x1078, 0x1dc6, 0xa046, 0x7888,
++	0x8000, 0x788a, 0xa086, 0x0002, 0x0040, 0x2151, 0x7a7c, 0x7b78,
++	0xdac4, 0x0040, 0x213d, 0x7c84, 0x7d80, 0x7974, 0x8107, 0x8004,
++	0x8004, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000,
++	0x721a, 0x731e, 0xdac4, 0x0040, 0x2187, 0x7422, 0x7526, 0x0078,
++	0x2187, 0x6014, 0xd0fc, 0x00c0, 0x2159, 0x2069, 0x4e40, 0x0078,
++	0x215b, 0x2069, 0x4e80, 0x2091, 0x8000, 0x681f, 0x0002, 0x88ff,
++	0x0040, 0x2167, 0xa046, 0x788c, 0x2060, 0x0078, 0x2151, 0x788b,
++	0x0000, 0x78ac, 0xa085, 0x0003, 0x78ae, 0x2091, 0x8001, 0x0078,
++	0x2187, 0x0c7f, 0x788b, 0x0000, 0x1078, 0x2346, 0x6004, 0xa084,
++	0x000f, 0x1078, 0x2188, 0x88ff, 0x0040, 0x2185, 0x788c, 0x2060,
++	0x6004, 0xa084, 0x000f, 0x1078, 0x2188, 0x0078, 0x20a1, 0x007c,
++	0x0079, 0x218a, 0x219a, 0x21b8, 0x21d6, 0x219a, 0x21e7, 0x21ab,
++	0x219a, 0x219a, 0x219a, 0x21b6, 0x21d4, 0x219a, 0x219a, 0x219a,
++	0x219a, 0x219a, 0x2039, 0x0400, 0x78bc, 0xa705, 0x78be, 0x6008,
++	0xa705, 0x600a, 0x1078, 0x222a, 0x609c, 0x78ba, 0x609f, 0x0000,
++	0x1078, 0x2330, 0x007c, 0x78bc, 0xd0c4, 0x0040, 0x21b1, 0x0078,
++	0x219a, 0x601c, 0xc0bd, 0x601e, 0x0078, 0x21be, 0x1078, 0x2378,
++	0x78bc, 0xd0c4, 0x0040, 0x21be, 0x0078, 0x219a, 0x78bf, 0x0000,
++	0x6004, 0x8007, 0xa084, 0x00ff, 0x78b2, 0x8001, 0x0040, 0x21d1,
++	0x1078, 0x222a, 0x0040, 0x21d1, 0x78bc, 0xc0c5, 0x78be, 0x0078,
++	0x21d3, 0x0078, 0x2249, 0x007c, 0x1078, 0x2374, 0x78bc, 0xa08c,
++	0x0e00, 0x00c0, 0x21de, 0xd0c4, 0x00c0, 0x21e0, 0x0078, 0x219a,
++	0x1078, 0x222a, 0x00c0, 0x21e6, 0x0078, 0x2249, 0x007c, 0x78bc,
++	0xd0c4, 0x0040, 0x21ed, 0x0078, 0x219a, 0x78bf, 0x0000, 0x6714,
++	0x2011, 0x0001, 0x22a8, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0040,
++	0x220d, 0xa7bc, 0xff00, 0x20a9, 0x0020, 0xa08e, 0x0001, 0x0040,
++	0x220d, 0xa7bc, 0x8000, 0x2011, 0x0002, 0x20a9, 0x0100, 0xa08e,
++	0x0002, 0x0040, 0x220d, 0x0078, 0x2227, 0x1078, 0x1de4, 0x2d00,
++	0x2091, 0x8000, 0x682b, 0x0000, 0x682f, 0x0000, 0x6808, 0xa084,
++	0xffde, 0x680a, 0xade8, 0x0010, 0x2091, 0x8001, 0x00f0, 0x2210,
++	0x8211, 0x0040, 0x2227, 0x20a9, 0x0100, 0x0078, 0x2210, 0x1078,
++	0x1dc6, 0x007c, 0x609f, 0x0000, 0x78b4, 0xa06d, 0x2c00, 0x78b6,
++	0x00c0, 0x2235, 0x78ba, 0x0078, 0x223d, 0x689e, 0x2d00, 0x6002,
++	0x78b8, 0xad06, 0x00c0, 0x223d, 0x6002, 0x78b0, 0x8001, 0x78b2,
++	0x00c0, 0x2248, 0x78bc, 0xc0c4, 0x78be, 0x78b8, 0x2060, 0xa006,
++	0x007c, 0x0e7e, 0xa02e, 0x2530, 0x7dba, 0x7db6, 0x65ae, 0x65b2,
++	0x601c, 0x60a2, 0x2048, 0xa984, 0xe1ff, 0x601e, 0xa984, 0x0060,
++	0x0040, 0x225c, 0x1078, 0x4632, 0x6596, 0x65a6, 0x669a, 0x66aa,
++	0x6714, 0x2071, 0x4e80, 0xd7fc, 0x00c0, 0x2268, 0x2071, 0x4e40,
++	0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x0040, 0x2273, 0x8003,
++	0x8003, 0x8003, 0x8003, 0xa105, 0x71c4, 0xa168, 0x2700, 0x8007,
++	0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0x71c8, 0xa100, 0x60c2,
++	0x2091, 0x8000, 0x7814, 0xd0c4, 0x0040, 0x2298, 0xd0ec, 0x0040,
++	0x2294, 0xd7fc, 0x00c0, 0x2291, 0xd0f4, 0x00c0, 0x229f, 0x0078,
++	0x2298, 0xd0fc, 0x00c0, 0x229f, 0x7810, 0xd0f4, 0x00c0, 0x229f,
++	0x6e08, 0xd684, 0x0040, 0x22c9, 0xd9fc, 0x00c0, 0x22c9, 0x2091,
++	0x8001, 0x1078, 0x1e5b, 0x2091, 0x8000, 0x1078, 0x201d, 0x2091,
++	0x8001, 0x7814, 0xd0e4, 0x00c0, 0x232e, 0x7814, 0xd0c4, 0x0040,
++	0x232e, 0xd0ec, 0x0040, 0x22c1, 0xd7fc, 0x00c0, 0x22bc, 0xd0f4,
++	0x00c0, 0x22c5, 0x0078, 0x232e, 0xd0fc, 0x00c0, 0x22c5, 0x0078,
++	0x232e, 0x7810, 0xd0f4, 0x0040, 0x232e, 0x601b, 0x0021, 0x0078,
++	0x232e, 0x6024, 0xa096, 0x0001, 0x00c0, 0x22d0, 0x8000, 0x6026,
++	0x6a10, 0x6814, 0xa202, 0x0048, 0x22e3, 0x0040, 0x22e3, 0x2091,
++	0x8001, 0x2039, 0x0200, 0x609c, 0x78ba, 0x609f, 0x0000, 0x1078,
++	0x2330, 0x0078, 0x232e, 0x2c08, 0xd9fc, 0x0040, 0x230b, 0x6800,
++	0xa065, 0x0040, 0x230b, 0x6a04, 0x7000, 0xa084, 0x0002, 0x0040,
++	0x2301, 0x704c, 0xa206, 0x00c0, 0x2301, 0x6b04, 0x2160, 0x2304,
++	0x6002, 0xa005, 0x00c0, 0x22fd, 0x6902, 0x2260, 0x6102, 0x0078,
++	0x2317, 0x2d00, 0x2060, 0x1078, 0x2acc, 0x6e08, 0x2160, 0x6202,
++	0x6906, 0x0078, 0x2317, 0x6800, 0x6902, 0xa065, 0x0040, 0x2313,
++	0x6102, 0x0078, 0x2314, 0x6906, 0x2160, 0x6003, 0x0000, 0x2160,
++	0xd9fc, 0x0040, 0x231e, 0xa6b4, 0xfffc, 0x6e0a, 0x6810, 0x7d08,
++	0x8528, 0x7d0a, 0x8000, 0x6812, 0x2091, 0x8001, 0xd6b4, 0x0040,
++	0x232e, 0xa6b6, 0x0040, 0x6e0a, 0x1078, 0x1e6c, 0x0e7f, 0x007c,
++	0x6008, 0xa705, 0x600a, 0x2091, 0x8000, 0x1078, 0x201d, 0x2091,
++	0x8001, 0x78b8, 0xa065, 0x0040, 0x2343, 0x609c, 0x78ba, 0x609f,
++	0x0000, 0x0078, 0x2330, 0x78b6, 0x78ba, 0x007c, 0x7970, 0x7874,
++	0x2818, 0xd384, 0x0040, 0x2350, 0x8000, 0xa112, 0x0048, 0x2355,
++	0x8000, 0xa112, 0x00c8, 0x2365, 0xc384, 0x7a7c, 0x721a, 0x7a78,
++	0x721e, 0xdac4, 0x0040, 0x2360, 0x7a84, 0x7222, 0x7a80, 0x7226,
++	0xa006, 0xd384, 0x0040, 0x2365, 0x8000, 0x7876, 0x70d2, 0x781c,
++	0xa005, 0x0040, 0x2373, 0x8001, 0x781e, 0x00c0, 0x2373, 0x0068,
++	0x2373, 0x2091, 0x4080, 0x007c, 0x2039, 0x238c, 0x0078, 0x237a,
++	0x2039, 0x2392, 0x2704, 0xa005, 0x0040, 0x238b, 0xac00, 0x2068,
++	0x6908, 0x6810, 0x6912, 0x680a, 0x690c, 0x6814, 0x6916, 0x680e,
++	0x8738, 0x0078, 0x237a, 0x007c, 0x0003, 0x0009, 0x000f, 0x0015,
++	0x001b, 0x0000, 0x0015, 0x001b, 0x0000, 0x2041, 0x0000, 0x780c,
++	0x0079, 0x239a, 0x256c, 0x253f, 0x239e, 0x2417, 0x2039, 0x9674,
++	0x2734, 0x7d10, 0x0078, 0x23be, 0x6084, 0xa086, 0x0103, 0x00c0,
++	0x2400, 0x6114, 0x6018, 0xa105, 0x0040, 0x23b3, 0x86ff, 0x00c0,
++	0x23cf, 0x0078, 0x2400, 0x8603, 0xa080, 0x9655, 0x620c, 0x2202,
++	0x8000, 0x6210, 0x2202, 0x1078, 0x203f, 0x8630, 0xa68e, 0x000f,
++	0x0040, 0x248b, 0x786c, 0xa065, 0x00c0, 0x23a4, 0x7808, 0xa602,
++	0x00c8, 0x23cf, 0xd5ac, 0x00c0, 0x23cf, 0x263a, 0x007c, 0xa682,
++	0x0003, 0x00c8, 0x248b, 0x2091, 0x8000, 0x2069, 0x0000, 0x6818,
++	0xd084, 0x00c0, 0x23fb, 0x2011, 0x9655, 0x2204, 0x70c6, 0x8210,
++	0x2204, 0x70ca, 0xd684, 0x00c0, 0x23eb, 0x8210, 0x2204, 0x70da,
++	0x8210, 0x2204, 0x70de, 0xa685, 0x8020, 0x70c2, 0x681b, 0x0001,
++	0x2091, 0x4080, 0x7810, 0xa084, 0xffcf, 0x7812, 0x2091, 0x8001,
++	0x203b, 0x0000, 0x007c, 0x7810, 0xc0ad, 0x7812, 0x0078, 0x248b,
++	0x263a, 0x1078, 0x2576, 0x00c0, 0x2599, 0x786c, 0xa065, 0x00c0,
++	0x23a4, 0x2091, 0x8000, 0x7810, 0xa084, 0xffcf, 0x86ff, 0x0040,
++	0x2412, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x0078, 0x2599, 0x2039,
++	0x9674, 0x2734, 0x7d10, 0x0078, 0x2433, 0x6084, 0xa086, 0x0103,
++	0x00c0, 0x2474, 0x6114, 0x6018, 0xa105, 0x0040, 0x242c, 0x86ff,
++	0x00c0, 0x2444, 0x0078, 0x2474, 0xa680, 0x9655, 0x620c, 0x2202,
++	0x1078, 0x203f, 0x8630, 0xa68e, 0x001e, 0x0040, 0x248b, 0x786c,
++	0xa065, 0x00c0, 0x241d, 0x7808, 0xa602, 0x00c8, 0x2444, 0xd5ac,
++	0x00c0, 0x2444, 0x263a, 0x007c, 0xa682, 0x0006, 0x00c8, 0x248b,
++	0x2091, 0x8000, 0x2069, 0x0000, 0x6818, 0xd084, 0x00c0, 0x246f,
++	0x2011, 0x9655, 0x2009, 0x964e, 0x26a8, 0x211c, 0x2204, 0x201a,
++	0x8108, 0x8210, 0x00f0, 0x2455, 0xa685, 0x8030, 0x70c2, 0x681b,
++	0x0001, 0x2091, 0x4080, 0x7810, 0xa084, 0xffcf, 0x7812, 0x2091,
++	0x8001, 0xa006, 0x2009, 0x9675, 0x200a, 0x203a, 0x007c, 0x7810,
++	0xc0ad, 0x7812, 0x0078, 0x248b, 0x263a, 0x1078, 0x2576, 0x00c0,
++	0x2599, 0x786c, 0xa065, 0x00c0, 0x241d, 0x2091, 0x8000, 0x7810,
++	0xa084, 0xffcf, 0x86ff, 0x0040, 0x2486, 0xc0ad, 0x7812, 0x2091,
++	0x8001, 0x0078, 0x2599, 0x2091, 0x8000, 0x7007, 0x0004, 0x7994,
++	0x70d4, 0xa102, 0x0048, 0x249c, 0x0040, 0x24a6, 0x7b90, 0xa302,
++	0x00c0, 0x24a6, 0x0078, 0x249f, 0x8002, 0x00c0, 0x24a6, 0x263a,
++	0x7810, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x007c, 0xa184, 0xff00,
++	0x0040, 0x24b3, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007,
++	0xa100, 0x0078, 0x24b6, 0x8107, 0x8004, 0x8004, 0x7a9c, 0xa210,
++	0x721a, 0x7a98, 0xa006, 0xa211, 0x721e, 0xd4c4, 0x0040, 0x24c6,
++	0x7aa4, 0xa211, 0x7222, 0x7aa0, 0xa211, 0x7226, 0x20a1, 0x0030,
++	0x7003, 0x0000, 0x2009, 0x9654, 0x260a, 0x8109, 0x2198, 0x2104,
++	0xd084, 0x0040, 0x24d4, 0x8633, 0xa6b0, 0x0002, 0x26a8, 0x53a6,
++	0x8603, 0x7012, 0x7007, 0x0001, 0x7990, 0x7894, 0x8000, 0xa10a,
++	0x00c8, 0x24e3, 0xa006, 0x2028, 0x7974, 0xa184, 0xff00, 0x0040,
++	0x24f2, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100,
++	0x0078, 0x24f5, 0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78,
++	0xa006, 0xa211, 0xd4c4, 0x0040, 0x2501, 0x7b84, 0xa319, 0x7c80,
++	0xa421, 0x7008, 0xd0fc, 0x0040, 0x2501, 0xa084, 0x01e0, 0x0040,
++	0x2526, 0x7d10, 0x2031, 0x9654, 0x2634, 0x78a8, 0x8000, 0x78aa,
++	0xd08c, 0x00c0, 0x251b, 0x7007, 0x0006, 0x7004, 0xd094, 0x00c0,
++	0x2515, 0x0078, 0x248d, 0x2069, 0x4e47, 0x206b, 0x0003, 0x78ac,
++	0xa085, 0x0300, 0x78ae, 0xa006, 0x0078, 0x252f, 0x2030, 0x75d6,
++	0x2091, 0x4080, 0x7d96, 0x7d10, 0xa5ac, 0xffcf, 0x7d12, 0x2091,
++	0x8001, 0x78aa, 0x7007, 0x0006, 0x263a, 0x7003, 0x0001, 0x711a,
++	0x721e, 0xd5c4, 0x0040, 0x253e, 0x7322, 0x7426, 0x007c, 0x6084,
++	0xa086, 0x0103, 0x00c0, 0x2562, 0x6114, 0x6018, 0xa105, 0x00c0,
++	0x2562, 0x2069, 0x0000, 0x6818, 0xd084, 0x00c0, 0x2562, 0x600c,
++	0x70c6, 0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b, 0x0001, 0x2091,
++	0x4080, 0x1078, 0x203f, 0x0068, 0x2561, 0x786c, 0xa065, 0x00c0,
++	0x253f, 0x007c, 0x1078, 0x2576, 0x00c0, 0x2599, 0x786c, 0xa065,
++	0x00c0, 0x253f, 0x0078, 0x2599, 0x1078, 0x2576, 0x00c0, 0x2599,
++	0x786c, 0xa065, 0x00c0, 0x256c, 0x0078, 0x2599, 0x6084, 0xa086,
++	0x0103, 0x00c0, 0x258a, 0x6018, 0xc0fc, 0x601a, 0xa086, 0x0004,
++	0x00c0, 0x258a, 0x7804, 0xd0a4, 0x0040, 0x258a, 0x1078, 0x203f,
++	0xa006, 0x007c, 0x1078, 0x259f, 0x00c0, 0x2591, 0xa085, 0x0001,
++	0x007c, 0x1078, 0x25ae, 0x00c0, 0x2597, 0x2041, 0x0001, 0x7d10,
++	0x007c, 0x88ff, 0x0040, 0x259e, 0x2091, 0x4080, 0x007c, 0x7b90,
++	0x7994, 0x70d4, 0xa102, 0x00c0, 0x25a8, 0xa385, 0x0000, 0x007c,
++	0x0048, 0x25ac, 0xa302, 0x007c, 0x8002, 0x007c, 0x7810, 0xd0ec,
++	0x0040, 0x25c6, 0x0e7e, 0x2091, 0x8000, 0x2071, 0x0020, 0x7004,
++	0xa005, 0x00c0, 0x25c3, 0x7008, 0x0e7f, 0xa086, 0x0008, 0x0040,
++	0x25c6, 0x0078, 0x2617, 0x0e7f, 0x0078, 0x2617, 0xa184, 0xff00,
++	0x0040, 0x25d3, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007,
++	0xa100, 0x0078, 0x25d6, 0x8107, 0x8004, 0x8004, 0x7a9c, 0x7b98,
++	0x7ca4, 0x7da0, 0xa210, 0xa006, 0xa319, 0xa421, 0xa529, 0x2009,
++	0x0018, 0x6028, 0xa005, 0x0040, 0x25e7, 0x2009, 0x0040, 0x1078,
++	0x1d74, 0x0040, 0x2609, 0x78a8, 0x8000, 0x78aa, 0xd08c, 0x00c0,
++	0x2617, 0x6014, 0xd0fc, 0x00c0, 0x25f9, 0x2069, 0x4e40, 0x0078,
++	0x25fb, 0x2069, 0x4e80, 0x2091, 0x8000, 0x681f, 0x0003, 0x78ab,
++	0x0000, 0x78ac, 0xa085, 0x0300, 0x78ae, 0x2091, 0x8001, 0x0078,
++	0x2617, 0x78ab, 0x0000, 0x1078, 0x203f, 0x7990, 0x7894, 0x8000,
++	0xa10a, 0x00c8, 0x2614, 0xa006, 0x7896, 0x70d6, 0xa006, 0x2071,
++	0x0010, 0x2091, 0x8001, 0x007c, 0xd7fc, 0x00c0, 0x2623, 0x2009,
++	0x4e59, 0x0078, 0x2625, 0x2009, 0x4e99, 0x2091, 0x8000, 0x200a,
++	0x0f7e, 0xd7fc, 0x00c0, 0x263c, 0x2009, 0x4e40, 0x2001, 0x4e04,
++	0x2004, 0xd0ec, 0x0040, 0x2638, 0x2079, 0x0100, 0x0078, 0x2640,
++	0x2079, 0x0200, 0x0078, 0x2640, 0x2009, 0x4e80, 0x2079, 0x0100,
++	0x2104, 0xa086, 0x0000, 0x00c0, 0x2659, 0xd7fc, 0x00c0, 0x264c,
++	0x2009, 0x4e45, 0x0078, 0x264e, 0x2009, 0x4e85, 0x2104, 0xa005,
++	0x00c0, 0x2659, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x2659, 0x781b,
++	0x0045, 0x0f7f, 0x007c, 0x2009, 0x0002, 0x2069, 0x4e00, 0x6810,
++	0xd0ec, 0x00c0, 0x26c8, 0x2071, 0x4e80, 0x2079, 0x0100, 0x2021,
++	0x50bf, 0x784b, 0x000f, 0x2019, 0x4457, 0xd184, 0x0040, 0x267c,
++	0x6810, 0xd0ec, 0x0040, 0x2678, 0x20a1, 0x012b, 0x0078, 0x267e,
++	0x20a1, 0x022b, 0x0078, 0x267e, 0x20a1, 0x012b, 0x2304, 0xa005,
++	0x0040, 0x268b, 0x789a, 0x8318, 0x23ac, 0x8318, 0x2398, 0x53a6,
++	0x3318, 0x0078, 0x267e, 0x789b, 0x0020, 0x20a9, 0x0010, 0x6814,
++	0xd0e4, 0x0040, 0x269b, 0x78af, 0x0000, 0x78af, 0x9020, 0x00f0,
++	0x2693, 0x0078, 0x26a1, 0x78af, 0x0000, 0x78af, 0x8020, 0x00f0,
++	0x269b, 0x7003, 0x0000, 0x017e, 0xd18c, 0x2009, 0x0000, 0x0040,
++	0x26aa, 0xc1bd, 0x1078, 0x289b, 0x017f, 0x7020, 0xa084, 0x000f,
++	0x007e, 0x6814, 0xd0e4, 0x007f, 0x00c0, 0x26ba, 0xa085, 0x6340,
++	0x0078, 0x26bc, 0xa085, 0x62c0, 0x7806, 0x780f, 0x9200, 0x7843,
++	0x00d8, 0x7853, 0x0080, 0x780b, 0x0008, 0x7456, 0x7053, 0x0000,
++	0x8109, 0x0040, 0x26db, 0x2071, 0x4e40, 0x6810, 0xd0ec, 0x0040,
++	0x26d5, 0x2079, 0x0100, 0x0078, 0x26d7, 0x2079, 0x0200, 0x2021,
++	0x4ebf, 0x0078, 0x2669, 0x007c, 0x017e, 0xd1bc, 0x00c0, 0x26f0,
++	0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x26ec,
++	0x2011, 0x0101, 0x0078, 0x26f2, 0x2011, 0x0201, 0x0078, 0x26f2,
++	0x2011, 0x0101, 0xa18c, 0x000f, 0x2204, 0xa084, 0xfff0, 0xa105,
++	0x2012, 0x017f, 0x1078, 0x289b, 0x007c, 0xd3fc, 0x00c0, 0x2710,
++	0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x270c,
++	0x2011, 0x0101, 0x0078, 0x2712, 0x2011, 0x0201, 0x0078, 0x2712,
++	0x2011, 0x0101, 0x20a9, 0x0009, 0x810b, 0x00f0, 0x2714, 0xa18c,
++	0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c, 0x2019,
++	0x0002, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x0040, 0x272c, 0x8319,
++	0x2009, 0x0101, 0x0078, 0x272e, 0x2009, 0x0101, 0x20a9, 0x0005,
++	0x8213, 0x00f0, 0x2730, 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f,
++	0xa205, 0x200a, 0x8319, 0x0040, 0x2741, 0x2009, 0x0201, 0x0078,
++	0x272e, 0x007c, 0xd3fc, 0x00c0, 0x2755, 0x007e, 0x2001, 0x4e04,
++	0x2004, 0xd0ec, 0x007f, 0x0040, 0x2751, 0x2011, 0x0101, 0x0078,
++	0x2757, 0x2011, 0x0201, 0x0078, 0x2757, 0x2011, 0x0101, 0x20a9,
++	0x000c, 0x810b, 0x00f0, 0x2759, 0xa18c, 0xf000, 0x2204, 0xa084,
++	0x0fff, 0xa105, 0x2012, 0x007c, 0xd3fc, 0x00c0, 0x2777, 0x007e,
++	0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x2773, 0x2011,
++	0x0102, 0x0078, 0x2779, 0x2011, 0x0202, 0x0078, 0x2779, 0x2011,
++	0x0102, 0x2204, 0xa084, 0xffcf, 0xa105, 0x2012, 0x007c, 0x0c7e,
++	0xd1bc, 0x00c0, 0x2793, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec,
++	0x007f, 0x0040, 0x278f, 0x2061, 0x0100, 0x0078, 0x2795, 0x2061,
++	0x0200, 0x0078, 0x2795, 0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003,
++	0xa080, 0x0020, 0x609a, 0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x0c7e,
++	0xd1bc, 0x00c0, 0x27b3, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec,
++	0x007f, 0x0040, 0x27af, 0x2061, 0x0100, 0x0078, 0x27b5, 0x2061,
++	0x0200, 0x0078, 0x27b5, 0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003,
++	0xa080, 0x0022, 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, 0x0c7f,
++	0x007c, 0x0c7e, 0xd1bc, 0x00c0, 0x27d5, 0x007e, 0x2001, 0x4e04,
++	0x2004, 0xd0ec, 0x007f, 0x0040, 0x27d1, 0x2061, 0x0100, 0x0078,
++	0x27d7, 0x2061, 0x0200, 0x0078, 0x27d7, 0x2061, 0x0100, 0xc1bc,
++	0x8103, 0x8003, 0xa080, 0x0022, 0x609a, 0x60a4, 0xa085, 0x0020,
++	0x60ae, 0x0c7f, 0x007c, 0x0c7e, 0xd1bc, 0x00c0, 0x27f7, 0x007e,
++	0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x27f3, 0x2061,
++	0x0100, 0x0078, 0x27f9, 0x2061, 0x0200, 0x0078, 0x27f9, 0x2061,
++	0x0100, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0020, 0x609a, 0x60a4,
++	0xa28c, 0x0020, 0x0040, 0x2807, 0xc2ac, 0xa39d, 0x4000, 0xc3fc,
++	0xd3b4, 0x00c0, 0x280c, 0xc3fd, 0x62ae, 0x2010, 0x60a4, 0x63ae,
++	0x2018, 0x0c7f, 0x007c, 0x2091, 0x8000, 0x0c7e, 0x0e7e, 0x6818,
++	0xa005, 0x0040, 0x2879, 0xd1fc, 0x0040, 0x2822, 0x2061, 0x95d0,
++	0x0078, 0x2824, 0x2061, 0x94c0, 0x1078, 0x2881, 0x0040, 0x285b,
++	0x20a9, 0x0101, 0xd1fc, 0x0040, 0x2831, 0x2061, 0x94d0, 0x0078,
++	0x2833, 0x2061, 0x93c0, 0x0c7e, 0x1078, 0x2881, 0x0040, 0x283e,
++	0x0c7f, 0x8c60, 0x00f0, 0x2833, 0x0078, 0x2879, 0x007f, 0xd1fc,
++	0x0040, 0x2848, 0xa082, 0x94d0, 0x2071, 0x4e80, 0x0078, 0x284c,
++	0xa082, 0x93c0, 0x2071, 0x4e40, 0x707a, 0x7176, 0x2138, 0x2001,
++	0x0004, 0x7066, 0x7083, 0x000f, 0x71d4, 0xc1dc, 0x71d6, 0x1078,
++	0x261c, 0x0078, 0x2875, 0xd1fc, 0x00c0, 0x2862, 0x2071, 0x4e40,
++	0x0078, 0x2864, 0x2071, 0x4e80, 0x6020, 0xc0dd, 0x6022, 0x7176,
++	0x2138, 0x2c00, 0x707e, 0x2001, 0x0006, 0x7066, 0x7083, 0x000f,
++	0x71d4, 0xc1dc, 0x71d6, 0x1078, 0x261c, 0x2001, 0x0000, 0x0078,
++	0x287b, 0x2001, 0x0001, 0x2091, 0x8001, 0xa005, 0x0e7f, 0x0c7f,
++	0x007c, 0x2c04, 0xa005, 0x0040, 0x2898, 0x2060, 0x6010, 0xa306,
++	0x00c0, 0x2895, 0x600c, 0xa206, 0x00c0, 0x2895, 0x6014, 0xa106,
++	0x00c0, 0x2895, 0xa006, 0x0078, 0x289a, 0x6000, 0x0078, 0x2882,
++	0xa085, 0x0001, 0x007c, 0x0f7e, 0x0e7e, 0x017e, 0xd1bc, 0x00c0,
++	0x28b3, 0x2079, 0x4e40, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec,
++	0x007f, 0x0040, 0x28af, 0x2071, 0x0100, 0x0078, 0x28b7, 0x2071,
++	0x0200, 0x0078, 0x28b7, 0x2079, 0x4e80, 0x2071, 0x0100, 0x7920,
++	0xa18c, 0x000f, 0x70ec, 0xd0c4, 0x00c0, 0x28c1, 0x017f, 0x0078,
++	0x28dc, 0x810b, 0x810b, 0x810b, 0x810b, 0x007f, 0xd0bc, 0x00c0,
++	0x28d9, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040,
++	0x28d5, 0xa18d, 0x0f00, 0x0078, 0x28db, 0xa18d, 0x0f00, 0x0078,
++	0x28db, 0xa18d, 0x0800, 0x2104, 0x0e7f, 0x0f7f, 0x007c, 0x0e7e,
++	0x2001, 0x4e01, 0x2004, 0xd0ac, 0x00c0, 0x295c, 0x68e4, 0xd0ac,
++	0x0040, 0x295c, 0xa084, 0x0006, 0x00c0, 0x295c, 0x6014, 0xd0fc,
++	0x00c0, 0x28f6, 0x2071, 0x52c0, 0x0078, 0x28f8, 0x2071, 0x5340,
++	0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xae70, 0x7004,
++	0xa084, 0x000a, 0x00c0, 0x295c, 0x7108, 0xa194, 0xff00, 0x0040,
++	0x295c, 0xa18c, 0x00ff, 0x2001, 0x000a, 0xa106, 0x0040, 0x292b,
++	0x2001, 0x000c, 0xa106, 0x0040, 0x292f, 0x2001, 0x0012, 0xa106,
++	0x0040, 0x2933, 0x2001, 0x0014, 0xa106, 0x0040, 0x2937, 0x2001,
++	0x0019, 0xa106, 0x0040, 0x293b, 0x2001, 0x0032, 0xa106, 0x0040,
++	0x293f, 0x0078, 0x2943, 0x2009, 0x000c, 0x0078, 0x2945, 0x2009,
++	0x0012, 0x0078, 0x2945, 0x2009, 0x0014, 0x0078, 0x2945, 0x2009,
++	0x0019, 0x0078, 0x2945, 0x2009, 0x0020, 0x0078, 0x2945, 0x2009,
++	0x003f, 0x0078, 0x2945, 0x2011, 0x0000, 0x2100, 0xa205, 0x700a,
++	0x2071, 0x4e00, 0x7004, 0xd0bc, 0x0040, 0x295c, 0x6014, 0xd0fc,
++	0x00c0, 0x2957, 0x70ea, 0x2071, 0x4e40, 0x0078, 0x295a, 0x70ee,
++	0x2071, 0x4e80, 0x701f, 0x000d, 0x0e7f, 0x007c, 0x2001, 0x4e05,
++	0x2004, 0xd0e4, 0x00c0, 0x296a, 0x7804, 0xa084, 0xff1f, 0xa085,
++	0x6340, 0x7806, 0x007c, 0x0068, 0x296b, 0x2091, 0x8000, 0x2071,
++	0x0000, 0x007e, 0x7018, 0xd084, 0x00c0, 0x2972, 0x007f, 0x2071,
++	0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002, 0x70db, 0x080f,
++	0x70df, 0x0000, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080,
++	0x0078, 0x2988, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x78a0, 0x708e,
++	0x7592, 0x7496, 0x769a, 0x779e, 0xa594, 0x003f, 0xd4f4, 0x0040,
++	0x299f, 0xa784, 0x007d, 0x00c0, 0x43cd, 0x1078, 0x296b, 0xa49c,
++	0x000f, 0xa382, 0x0004, 0x0050, 0x29aa, 0xa3a6, 0x0007, 0x00c0,
++	0x296b, 0x2418, 0x8507, 0xa084, 0x000f, 0x0079, 0x29af, 0x3028,
++	0x3119, 0x3144, 0x33b6, 0x379f, 0x3819, 0x38ce, 0x395f, 0x3a4d,
++	0x3b3c, 0x29c2, 0x29bf, 0x2df9, 0x2f1c, 0x3770, 0x29bf, 0x1078,
++	0x296b, 0x007c, 0xa006, 0x0078, 0x29cc, 0x7808, 0xc08d, 0x780a,
++	0xa006, 0x7002, 0x704e, 0x7046, 0x70d2, 0x7060, 0xa005, 0x00c0,
++	0x2b32, 0x7064, 0xa084, 0x0007, 0x0079, 0x29d6, 0x29de, 0x2a51,
++	0x2a5a, 0x2a65, 0x2a70, 0x2b18, 0x2a7b, 0x2a51, 0x7830, 0xd0bc,
++	0x00c0, 0x29c1, 0x71d4, 0xd1bc, 0x00c0, 0x29c1, 0xd1b4, 0x00c0,
++	0x2a2e, 0x70a4, 0xa086, 0x0001, 0x0040, 0x29c1, 0x70b4, 0xa06d,
++	0x6800, 0xa065, 0xa055, 0x789b, 0x0010, 0x6b0c, 0x7baa, 0x6808,
++	0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001, 0x0040,
++	0x2a04, 0x69bc, 0x7daa, 0x79aa, 0x68c0, 0xa04d, 0x6e1c, 0x2001,
++	0x0010, 0x0078, 0x2c8c, 0x7060, 0xa005, 0x00c0, 0x29c1, 0x0c7e,
++	0x0d7e, 0x70b4, 0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0010,
++	0x6b0c, 0x7baa, 0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d,
++	0xa886, 0x0001, 0x0040, 0x2a27, 0x69bc, 0x7daa, 0x79aa, 0x68c0,
++	0xa04d, 0x6e1c, 0x2001, 0x0020, 0x0078, 0x2c8c, 0x1078, 0x4360,
++	0x00c0, 0x29c1, 0x781b, 0x005b, 0x70bc, 0xa06d, 0x68b4, 0x785a,
++	0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d,
++	0x780a, 0x68bc, 0x7042, 0xc1b4, 0x71d6, 0x70b8, 0xa065, 0x68c0,
++	0x705a, 0x7003, 0x0002, 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046,
++	0x007c, 0x1078, 0x4360, 0x00c0, 0x2a59, 0x781b, 0x0047, 0x7003,
++	0x0004, 0x007c, 0x1078, 0x4360, 0x00c0, 0x2a64, 0x2011, 0x000c,
++	0x1078, 0x2a8b, 0x7003, 0x0004, 0x007c, 0x1078, 0x4360, 0x00c0,
++	0x2a6f, 0x2011, 0x0006, 0x1078, 0x2a8b, 0x7003, 0x0004, 0x007c,
++	0x1078, 0x4360, 0x00c0, 0x2a7a, 0x2011, 0x000d, 0x1078, 0x2a8b,
++	0x7003, 0x0004, 0x007c, 0x1078, 0x4360, 0x00c0, 0x2a8a, 0x2011,
++	0x0006, 0x1078, 0x2a8b, 0x707c, 0x707f, 0x0000, 0x2068, 0x704e,
++	0x7003, 0x0001, 0x007c, 0x7174, 0xc1fc, 0x8107, 0x7882, 0x789b,
++	0x0010, 0xa286, 0x000c, 0x00c0, 0x2a9a, 0x7aaa, 0x2001, 0x0001,
++	0x0078, 0x2aaf, 0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0xa286,
++	0x000d, 0x0040, 0x2aa8, 0x7aaa, 0x2001, 0x0002, 0x0078, 0x2aaf,
++	0x78ab, 0x0020, 0x7178, 0x79aa, 0x7aaa, 0x2001, 0x0004, 0x789b,
++	0x0060, 0x78aa, 0x785b, 0x0004, 0x781b, 0x0116, 0x1078, 0x4383,
++	0x7083, 0x000f, 0x70d4, 0xd0b4, 0x0040, 0x2acb, 0xc0b4, 0x70d6,
++	0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018,
++	0x8001, 0x601a, 0x0c7f, 0x007c, 0x7014, 0xa005, 0x00c0, 0x2ada,
++	0x70d4, 0xd0b4, 0x0040, 0x2adb, 0x70b8, 0xac06, 0x00c0, 0x2adb,
++	0x1078, 0x2aba, 0x007c, 0x017e, 0x71a4, 0xa186, 0x0001, 0x0040,
++	0x2b0d, 0x0d7e, 0x027e, 0x2100, 0x2011, 0x0001, 0xa212, 0x70b4,
++	0x2068, 0x6800, 0xac06, 0x0040, 0x2af4, 0x8211, 0x0040, 0x2b0b,
++	0x1078, 0x2b0f, 0x0078, 0x2ae9, 0x0c7e, 0x2100, 0x2011, 0x0001,
++	0xa212, 0x70b4, 0x2068, 0x6800, 0x2060, 0x6008, 0xa084, 0xfbef,
++	0x600a, 0x8211, 0x0040, 0x2b08, 0x1078, 0x2b0f, 0x0078, 0x2afb,
++	0x70a7, 0x0001, 0x0c7f, 0x027f, 0x0d7f, 0x017f, 0x007c, 0xade8,
++	0x0005, 0x70ac, 0xad06, 0x00c0, 0x2b17, 0x70a8, 0x2068, 0x007c,
++	0x1078, 0x4360, 0x00c0, 0x29c1, 0x707c, 0x2068, 0x7774, 0x1078,
++	0x41fe, 0x2c50, 0x1078, 0x4442, 0x789b, 0x0010, 0x6814, 0xa084,
++	0x001f, 0xc0bd, 0x78aa, 0x6e1c, 0x2041, 0x0001, 0x2001, 0x0004,
++	0x0078, 0x2c92, 0x1078, 0x4360, 0x00c0, 0x29c1, 0x789b, 0x0010,
++	0x7060, 0x2068, 0x6f14, 0x70d4, 0xd0b4, 0x0040, 0x2b4c, 0xc0b4,
++	0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a,
++	0x6018, 0x8001, 0x601a, 0x0c7f, 0x1078, 0x41fe, 0x2c50, 0x1078,
++	0x4442, 0x6824, 0xa005, 0x0040, 0x2b5d, 0xa082, 0x0006, 0x0048,
++	0x2b5b, 0x0078, 0x2b5d, 0x6827, 0x0005, 0x6814, 0xa084, 0x001f,
++	0xc0bd, 0x78aa, 0x2031, 0x0020, 0x2041, 0x0001, 0x2001, 0x0003,
++	0x0078, 0x2c92, 0xc28d, 0x72d6, 0x72c0, 0xa200, 0xa015, 0x7154,
++	0x8108, 0xa12a, 0x0048, 0x2b75, 0x71c0, 0x2164, 0x6504, 0x85ff,
++	0x00c0, 0x2b8c, 0x7156, 0x8421, 0x00c0, 0x2b70, 0x70d4, 0xd08c,
++	0x0040, 0x2b88, 0x70d0, 0xa005, 0x00c0, 0x2b88, 0x70d3, 0x000a,
++	0x007c, 0x2200, 0x0078, 0x2b7a, 0x70d4, 0xc08c, 0x70d6, 0x70d3,
++	0x0000, 0x6034, 0xa005, 0x00c0, 0x2b89, 0x6708, 0xa784, 0x073f,
++	0x0040, 0x2bbb, 0xd7d4, 0x00c0, 0x2b89, 0xa784, 0x0021, 0x00c0,
++	0x2b89, 0xa784, 0x0002, 0x0040, 0x2bac, 0xa784, 0x0004, 0x0040,
++	0x2b89, 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0218, 0x00c0, 0x2b89,
++	0xa784, 0x0100, 0x0040, 0x2bbb, 0x6018, 0xa005, 0x00c0, 0x2b89,
++	0xa7bc, 0xfeff, 0x670a, 0x2568, 0x6823, 0x0000, 0x6e1c, 0xa684,
++	0x000e, 0x6318, 0x0040, 0x2bcc, 0x601c, 0xa302, 0x0048, 0x2bcf,
++	0x0040, 0x2bcf, 0x0078, 0x2b89, 0x83ff, 0x00c0, 0x2b89, 0x2d58,
++	0x2c50, 0x7156, 0xd7bc, 0x00c0, 0x2bd8, 0x7028, 0x6022, 0x603a,
++	0xc7bc, 0x670a, 0x68c0, 0xa065, 0xa04d, 0x6100, 0x2a60, 0x2041,
++	0x0001, 0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0, 0xd1fc, 0x0040,
++	0x2bec, 0xd684, 0x0040, 0x2bee, 0xa39c, 0xffbf, 0xd6a4, 0x0040,
++	0x2bf3, 0xa39d, 0x0020, 0xa684, 0x000e, 0x00c0, 0x2c3e, 0xc7a5,
++	0x670a, 0x2c00, 0x68c6, 0x77a4, 0xa786, 0x0001, 0x00c0, 0x2c12,
++	0x70d4, 0xd0b4, 0x00c0, 0x2c12, 0x7000, 0xa082, 0x0002, 0x00c8,
++	0x2c12, 0x7830, 0xd0bc, 0x00c0, 0x2c12, 0x789b, 0x0010, 0x7baa,
++	0x0078, 0x2c8a, 0x8739, 0x77a6, 0x2750, 0x77b0, 0xa7b0, 0x0005,
++	0x70ac, 0xa606, 0x00c0, 0x2c1d, 0x76a8, 0x76b2, 0x2c3a, 0x8738,
++	0x2d3a, 0x8738, 0x283a, 0x8738, 0x233a, 0x8738, 0x253a, 0x7830,
++	0xd0bc, 0x0040, 0x2c35, 0x2091, 0x8000, 0x2091, 0x303d, 0x70d4,
++	0xa084, 0x303d, 0x2091, 0x8000, 0x2090, 0xaad5, 0x0000, 0x0040,
++	0x2c3d, 0x8421, 0x2200, 0x00c0, 0x2b6f, 0x007c, 0xd1dc, 0x0040,
++	0x3e00, 0x2029, 0x0020, 0xd69c, 0x00c0, 0x2c4b, 0x8528, 0xd68c,
++	0x00c0, 0x2c4b, 0x8528, 0x8840, 0x6f14, 0x610c, 0x8108, 0xa18c,
++	0x00ff, 0x70cc, 0xa160, 0x2c64, 0x8cff, 0x0040, 0x2c6a, 0x6014,
++	0xa706, 0x00c0, 0x2c53, 0x60b8, 0x8001, 0x60ba, 0x00c0, 0x2c4e,
++	0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x2200, 0x8421, 0x00c0,
++	0x2b6f, 0x007c, 0x2a60, 0x610e, 0x69be, 0x2c00, 0x68c6, 0x8840,
++	0x6008, 0xc0d5, 0x600a, 0x77a4, 0xa786, 0x0001, 0x00c0, 0x2c12,
++	0x70d4, 0xd0b4, 0x00c0, 0x2c12, 0x7000, 0xa082, 0x0002, 0x00c8,
++	0x2c12, 0x7830, 0xd0bc, 0x00c0, 0x2c12, 0x789b, 0x0010, 0x7baa,
++	0x7daa, 0x79aa, 0x2001, 0x0002, 0x007e, 0x6018, 0x8000, 0x601a,
++	0x0078, 0x2c93, 0x007e, 0x2960, 0x6104, 0x2a60, 0xa184, 0x0018,
++	0x0040, 0x2caf, 0xa184, 0x0010, 0x0040, 0x2ca2, 0x1078, 0x4011,
++	0x00c0, 0x2cd4, 0xa184, 0x0008, 0x0040, 0x2caf, 0x69a0, 0xa184,
++	0x0600, 0x00c0, 0x2caf, 0x1078, 0x3ef5, 0x0078, 0x2cd4, 0x69a0,
++	0xa184, 0x1e00, 0x0040, 0x2cdf, 0xa184, 0x0800, 0x0040, 0x2cc8,
++	0x0c7e, 0x2960, 0x6000, 0xa085, 0x2000, 0x6002, 0x6104, 0xa18d,
++	0x0010, 0x6106, 0x0c7f, 0x1078, 0x4011, 0x00c0, 0x2cd4, 0x69a0,
++	0xa184, 0x0200, 0x0040, 0x2cd0, 0x1078, 0x3f54, 0x0078, 0x2cd4,
++	0xa184, 0x0400, 0x00c0, 0x2cab, 0x69a0, 0xa184, 0x1000, 0x0040,
++	0x2cdf, 0x6914, 0xa18c, 0xff00, 0x810f, 0x1078, 0x279f, 0x027f,
++	0xa68c, 0x00e0, 0xa684, 0x0060, 0x0040, 0x2cec, 0xa086, 0x0060,
++	0x00c0, 0x2cec, 0xa18d, 0x4000, 0xa18d, 0x0104, 0x69b6, 0x789b,
++	0x0060, 0x2800, 0x78aa, 0x6818, 0xc0fd, 0x681a, 0xd6bc, 0x0040,
++	0x2d07, 0xc0fc, 0x7087, 0x0000, 0xa08a, 0x000d, 0x0050, 0x2d05,
++	0xa08a, 0x000c, 0x7186, 0x2001, 0x000c, 0x800c, 0x718a, 0x78aa,
++	0x3518, 0x3340, 0x3428, 0x8000, 0x80ac, 0xaf80, 0x002b, 0x20a0,
++	0x789b, 0x0000, 0xad80, 0x000b, 0x2098, 0x53a6, 0x23a8, 0x2898,
++	0x25a0, 0xa286, 0x0020, 0x00c0, 0x2d3f, 0x70d4, 0xc0b5, 0x70d6,
++	0x2c00, 0x70ba, 0x2d00, 0x70be, 0x6814, 0xc0fc, 0x8007, 0x7882,
++	0xa286, 0x0002, 0x0040, 0x2d75, 0x70a4, 0x8000, 0x70a6, 0x74b4,
++	0xa498, 0x0005, 0x70ac, 0xa306, 0x00c0, 0x2d37, 0x73a8, 0x73b6,
++	0xa286, 0x0010, 0x0040, 0x29c1, 0x0d7f, 0x0c7f, 0x007c, 0x7000,
++	0xa005, 0x00c0, 0x2d1d, 0xa286, 0x0002, 0x00c0, 0x2d8f, 0x1078,
++	0x4360, 0x00c0, 0x2d1d, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x2091,
++	0x8000, 0x781b, 0x005b, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de,
++	0x6898, 0x78d2, 0x78da, 0x2091, 0x8001, 0x7808, 0xc08d, 0x780a,
++	0x127e, 0x0d7e, 0x0c7e, 0x70d4, 0xa084, 0x2700, 0x2090, 0x0c7f,
++	0x0d7f, 0x127f, 0x2900, 0x705a, 0x68bc, 0x7042, 0x7003, 0x0002,
++	0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, 0x7830, 0xd0bc, 0x0040,
++	0x2d81, 0x2091, 0x303d, 0x70d4, 0xa084, 0x303d, 0x2091, 0x8000,
++	0x2090, 0x70a4, 0xa005, 0x00c0, 0x2d86, 0x007c, 0x8421, 0x0040,
++	0x2d85, 0x7250, 0x70c0, 0xa200, 0xa015, 0x0078, 0x2b6f, 0xa286,
++	0x0010, 0x00c0, 0x2dc0, 0x1078, 0x4360, 0x00c0, 0x2d1d, 0x6814,
++	0xc0fc, 0x8007, 0x7882, 0x781b, 0x005b, 0x68b4, 0x785a, 0x6894,
++	0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d, 0x780a,
++	0x70a4, 0x8000, 0x70a6, 0x74b4, 0xa490, 0x0005, 0x70ac, 0xa206,
++	0x00c0, 0x2db3, 0x72a8, 0x72b6, 0x2900, 0x705a, 0x68bc, 0x7042,
++	0x7003, 0x0002, 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, 0x007c,
++	0x6bb4, 0xa39d, 0x2000, 0x7b5a, 0x6814, 0xc0fc, 0x8007, 0x7882,
++	0x6b94, 0x7bd6, 0x7bde, 0x6e98, 0x7ed2, 0x7eda, 0x781b, 0x005b,
++	0x2900, 0x705a, 0x7202, 0x7808, 0xc08d, 0x780a, 0x2300, 0xa605,
++	0x0040, 0x2deb, 0x70d4, 0xa084, 0x2700, 0xa086, 0x2300, 0x00c0,
++	0x2de5, 0x2009, 0x0000, 0x0078, 0x2de7, 0x2009, 0x0001, 0xa284,
++	0x000f, 0x1079, 0x2def, 0xad80, 0x0009, 0x7046, 0x007c, 0x2df7,
++	0x48bd, 0x48bd, 0x48aa, 0x48bd, 0x2df7, 0x2df7, 0x2df7, 0x1078,
++	0x296b, 0x7808, 0xa084, 0xfffd, 0x780a, 0x1078, 0x295e, 0x0f7e,
++	0x2079, 0x4e00, 0x78ac, 0x0f7f, 0xd084, 0x0040, 0x2e21, 0x7064,
++	0xa086, 0x0001, 0x00c0, 0x2e0f, 0x7066, 0x0078, 0x2ef8, 0x7064,
++	0xa086, 0x0005, 0x00c0, 0x2e1f, 0x707c, 0x2068, 0x681b, 0x0004,
++	0x6817, 0x0000, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x7067,
++	0x0000, 0x70a7, 0x0000, 0x70a8, 0x70b2, 0x70b6, 0x1078, 0x2aba,
++	0x157e, 0x2011, 0x0004, 0x7164, 0xa186, 0x0001, 0x0040, 0x2e41,
++	0xa186, 0x0007, 0x00c0, 0x2e38, 0x701f, 0x0005, 0x0078, 0x2e41,
++	0x701f, 0x0001, 0x7067, 0x0000, 0x70d4, 0xc0dd, 0x70d6, 0x0078,
++	0x2e43, 0x7067, 0x0000, 0x2001, 0x4e0a, 0x2004, 0xa084, 0x00ff,
++	0xa086, 0x0018, 0x0040, 0x2e53, 0x7018, 0x7016, 0xa005, 0x00c0,
++	0x2e53, 0x70a7, 0x0001, 0x067e, 0x1078, 0x4586, 0x20a9, 0x0010,
++	0x2039, 0x0000, 0x1078, 0x40f8, 0xa7b8, 0x0100, 0x00f0, 0x2e5a,
++	0x067f, 0x7000, 0x0079, 0x2e64, 0x2e9e, 0x2e79, 0x2e79, 0x2e6e,
++	0x2e9e, 0x2e9e, 0x2e9e, 0x2e6c, 0x1078, 0x296b, 0x7060, 0xa005,
++	0x0040, 0x2e9e, 0xad06, 0x00c0, 0x2e79, 0x6800, 0x7062, 0x0078,
++	0x2e8b, 0x6820, 0xd084, 0x00c0, 0x2e87, 0x6f14, 0x1078, 0x41fe,
++	0x6008, 0xc0d4, 0x600a, 0x1078, 0x3dd0, 0x0078, 0x2e8b, 0x705c,
++	0x2060, 0x6800, 0x6002, 0xa684, 0x5f00, 0x681e, 0x6818, 0xd0fc,
++	0x0040, 0x2e93, 0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000, 0x6820,
++	0xa084, 0x00ff, 0xc09d, 0x6822, 0x1078, 0x202c, 0xb284, 0x0400,
++	0x0040, 0x2ea6, 0x2021, 0x95d0, 0x0078, 0x2ea8, 0x2021, 0x94c0,
++	0x1078, 0x2efd, 0xb284, 0x0400, 0x0040, 0x2eb2, 0x2021, 0x4e98,
++	0x0078, 0x2eb4, 0x2021, 0x4e58, 0x1078, 0x2efd, 0x20a9, 0x0101,
++	0xb284, 0x0400, 0x0040, 0x2ec0, 0x2021, 0x94d0, 0x0078, 0x2ec2,
++	0x2021, 0x93c0, 0x1078, 0x2efd, 0x8420, 0x00f0, 0x2ec2, 0xb284,
++	0x0300, 0x0040, 0x2ecf, 0x2061, 0x53c0, 0x0078, 0x2ed1, 0x2061,
++	0x73c0, 0x2021, 0x0002, 0x20a9, 0x0100, 0x6110, 0x81ff, 0x0040,
++	0x2eee, 0x6018, 0x017e, 0x007e, 0x2011, 0x4e02, 0x220c, 0xa102,
++	0x2012, 0x007f, 0x017f, 0xa102, 0x0050, 0x2eee, 0x6012, 0x00c0,
++	0x2eee, 0x2011, 0x4e04, 0x2204, 0xc0a5, 0x2012, 0x601b, 0x0000,
++	0xace0, 0x0010, 0x00f0, 0x2ed5, 0x8421, 0x00c0, 0x2ed3, 0x157f,
++	0x7003, 0x0000, 0x704f, 0x0000, 0x007c, 0x047e, 0x2404, 0xa005,
++	0x0040, 0x2f18, 0x2068, 0x6800, 0x007e, 0x6a1a, 0x6817, 0x0000,
++	0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x6820, 0xa084,
++	0x00ff, 0xc09d, 0x6822, 0x1078, 0x202c, 0x007f, 0x0078, 0x2eff,
++	0x047f, 0x2023, 0x0000, 0x007c, 0xa282, 0x0003, 0x0050, 0x2f22,
++	0x1078, 0x296b, 0x2300, 0x0079, 0x2f25, 0x2f28, 0x2fb3, 0x2fd0,
++	0xa282, 0x0002, 0x0040, 0x2f2e, 0x1078, 0x296b, 0x7064, 0x7067,
++	0x0000, 0x7083, 0x0000, 0x0079, 0x2f35, 0x2f3d, 0x2f3d, 0x2f3f,
++	0x2f7f, 0x3e0c, 0x2f3d, 0x2f7f, 0x2f3d, 0x1078, 0x296b, 0x7774,
++	0x1078, 0x40f8, 0x7774, 0xa7bc, 0x8f00, 0x1078, 0x41fe, 0x6018,
++	0xa005, 0x0040, 0x2f76, 0xd7fc, 0x00c0, 0x2f52, 0x2021, 0x94c0,
++	0x0078, 0x2f54, 0x2021, 0x95d0, 0x2009, 0x0005, 0x2011, 0x0010,
++	0x1078, 0x2feb, 0x0040, 0x2f76, 0x157e, 0x20a9, 0x0101, 0xd7fc,
++	0x00c0, 0x2f66, 0x2021, 0x93c0, 0x0078, 0x2f68, 0x2021, 0x94d0,
++	0x047e, 0x2009, 0x0005, 0x2011, 0x0010, 0x1078, 0x2feb, 0x047f,
++	0x0040, 0x2f75, 0x8420, 0x00f0, 0x2f68, 0x157f, 0x8738, 0xa784,
++	0x001f, 0x00c0, 0x2f45, 0x0078, 0x29c5, 0x0078, 0x29c5, 0x7774,
++	0x1078, 0x41fe, 0x6018, 0xa005, 0x0040, 0x2fb1, 0xd7fc, 0x00c0,
++	0x2f8d, 0x2021, 0x94c0, 0x0078, 0x2f8f, 0x2021, 0x95d0, 0x2009,
++	0x0005, 0x2011, 0x0020, 0x1078, 0x2feb, 0x0040, 0x2fb1, 0x157e,
++	0x20a9, 0x0101, 0xd7fc, 0x00c0, 0x2fa1, 0x2021, 0x93c0, 0x0078,
++	0x2fa3, 0x2021, 0x94d0, 0x047e, 0x2009, 0x0005, 0x2011, 0x0020,
++	0x1078, 0x2feb, 0x047f, 0x0040, 0x2fb0, 0x8420, 0x00f0, 0x2fa3,
++	0x157f, 0x0078, 0x29c5, 0x2200, 0x0079, 0x2fb6, 0x2fb9, 0x2fbb,
++	0x2fbb, 0x1078, 0x296b, 0x2009, 0x0012, 0x7064, 0xa086, 0x0002,
++	0x0040, 0x2fc4, 0x2009, 0x000e, 0x6818, 0xd0fc, 0x0040, 0x2fc9,
++	0x691a, 0x7067, 0x0000, 0x70d4, 0xc0dd, 0x70d6, 0x0078, 0x430d,
++	0x2200, 0x0079, 0x2fd3, 0x2fd8, 0x2fbb, 0x2fd6, 0x1078, 0x296b,
++	0x1078, 0x4586, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3d7e, 0x1078,
++	0x3ded, 0x6008, 0xa084, 0xfbef, 0x600a, 0x1078, 0x3d6f, 0x0040,
++	0x3d7e, 0x0078, 0x29c5, 0x2404, 0xa005, 0x0040, 0x3024, 0x2068,
++	0x2d04, 0x007e, 0x6814, 0xa706, 0x0040, 0x2ffa, 0x2d20, 0x007f,
++	0x0078, 0x2fec, 0x007f, 0x2022, 0x691a, 0x6817, 0x0000, 0x682b,
++	0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x6820, 0xa084, 0x00ff,
++	0xa205, 0x6822, 0x1078, 0x202c, 0x2021, 0x4e02, 0x241c, 0x8319,
++	0x2322, 0x6010, 0x8001, 0x6012, 0x00c0, 0x301b, 0x2021, 0x4e04,
++	0x2404, 0xc0a5, 0x2022, 0x6008, 0xa084, 0xf9ef, 0x600a, 0x1078,
++	0x2adb, 0x1078, 0x3ded, 0x007c, 0xa085, 0x0001, 0x0078, 0x3023,
++	0x2300, 0x0079, 0x302b, 0x3030, 0x302e, 0x30b0, 0x1078, 0x296b,
++	0x78e4, 0xa005, 0x00d0, 0x3066, 0x3208, 0x007e, 0x2001, 0x4e04,
++	0x2004, 0xd0ec, 0x007f, 0x0040, 0x3041, 0xa18c, 0x0300, 0x0078,
++	0x3043, 0xa18c, 0x0400, 0x0040, 0x3049, 0x0018, 0x29c1, 0x0078,
++	0x304b, 0x0028, 0x29c1, 0x2008, 0xa084, 0x0030, 0x00c0, 0x3052,
++	0x0078, 0x3770, 0x78ec, 0xa084, 0x0003, 0x0040, 0x3050, 0x2100,
++	0xa084, 0x0007, 0x0079, 0x305c, 0x3090, 0x309a, 0x3085, 0x3064,
++	0x4355, 0x4355, 0x3064, 0x30a5, 0x1078, 0x296b, 0x7000, 0xa086,
++	0x0004, 0x00c0, 0x3080, 0x7064, 0xa086, 0x0002, 0x00c0, 0x3076,
++	0x2011, 0x0002, 0x2019, 0x0000, 0x0078, 0x2f1c, 0x7064, 0xa086,
++	0x0006, 0x0040, 0x3070, 0x7064, 0xa086, 0x0004, 0x0040, 0x3070,
++	0x79e4, 0x2001, 0x0003, 0x0078, 0x33fa, 0x6818, 0xd0fc, 0x0040,
++	0x308b, 0x681b, 0x001d, 0x1078, 0x40c8, 0x781b, 0x0064, 0x007c,
++	0x6818, 0xd0fc, 0x0040, 0x3096, 0x681b, 0x001d, 0x1078, 0x40c8,
++	0x0078, 0x4331, 0x6818, 0xd0fc, 0x0040, 0x30a0, 0x681b, 0x001d,
++	0x1078, 0x40c8, 0x781b, 0x00f8, 0x007c, 0x6818, 0xd0fc, 0x0040,
++	0x30ab, 0x681b, 0x001d, 0x1078, 0x40c8, 0x781b, 0x00c8, 0x007c,
++	0xa584, 0x000f, 0x00c0, 0x30cf, 0x1078, 0x295e, 0x7000, 0x0079,
++	0x30b9, 0x29c5, 0x30c1, 0x30c3, 0x3d7e, 0x3d7e, 0x3d7e, 0x30c1,
++	0x30c1, 0x1078, 0x296b, 0x1078, 0x3ded, 0x6008, 0xa084, 0xfbef,
++	0x600a, 0x1078, 0x3d6f, 0x0040, 0x3d7e, 0x0078, 0x29c5, 0x78e4,
++	0xa005, 0x00d0, 0x3066, 0x3208, 0x007e, 0x2001, 0x4e04, 0x2004,
++	0xd0ec, 0x007f, 0x0040, 0x30e0, 0xa18c, 0x0300, 0x0078, 0x30e2,
++	0xa18c, 0x0400, 0x0040, 0x30e8, 0x0018, 0x3066, 0x0078, 0x30ea,
++	0x0028, 0x3066, 0x2008, 0xa084, 0x0030, 0x00c0, 0x30f2, 0x781b,
++	0x005b, 0x007c, 0x78ec, 0xa084, 0x0003, 0x0040, 0x30ef, 0x2100,
++	0xa184, 0x0007, 0x0079, 0x30fc, 0x310b, 0x310f, 0x3106, 0x3104,
++	0x4355, 0x4355, 0x3104, 0x434f, 0x1078, 0x296b, 0x1078, 0x40d0,
++	0x781b, 0x0064, 0x007c, 0x1078, 0x40d0, 0x0078, 0x4331, 0x1078,
++	0x40d0, 0x781b, 0x00f8, 0x007c, 0x1078, 0x40d0, 0x781b, 0x00c8,
++	0x007c, 0x2300, 0x0079, 0x311c, 0x3121, 0x311f, 0x3123, 0x1078,
++	0x296b, 0x0078, 0x395f, 0x681b, 0x0016, 0x78a3, 0x0000, 0x79e4,
++	0xa184, 0x0030, 0x0040, 0x395f, 0x78ec, 0xa084, 0x0003, 0x0040,
++	0x395f, 0xa184, 0x0100, 0x0040, 0x3127, 0xa184, 0x0007, 0x0079,
++	0x3139, 0x3141, 0x310f, 0x3085, 0x430d, 0x4355, 0x4355, 0x430d,
++	0x434f, 0x1078, 0x4319, 0x007c, 0xa282, 0x0005, 0x0050, 0x314a,
++	0x1078, 0x296b, 0x2300, 0x0079, 0x314d, 0x3150, 0x3380, 0x338b,
++	0x2200, 0x0079, 0x3153, 0x316d, 0x315a, 0x316d, 0x3158, 0x3363,
++	0x1078, 0x296b, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa082,
++	0x0020, 0x0048, 0x40b7, 0xa08a, 0x0004, 0x00c8, 0x40b7, 0x0079,
++	0x3169, 0x40b7, 0x40b7, 0x40b7, 0x4061, 0x789b, 0x0018, 0x79a8,
++	0xa184, 0x0080, 0x0040, 0x317e, 0x0078, 0x40b7, 0x7000, 0xa005,
++	0x00c0, 0x3174, 0x2011, 0x0004, 0x0078, 0x3b4a, 0xa184, 0x00ff,
++	0xa08a, 0x0010, 0x00c8, 0x40b7, 0x0079, 0x3186, 0x3198, 0x3196,
++	0x31ad, 0x31b1, 0x3284, 0x40b7, 0x40b7, 0x3286, 0x40b7, 0x40b7,
++	0x335f, 0x335f, 0x40b7, 0x40b7, 0x40b7, 0x3361, 0x1078, 0x296b,
++	0xd6e4, 0x0040, 0x31a3, 0x2001, 0x0300, 0x8000, 0x8000, 0x783a,
++	0x781b, 0x00c3, 0x007c, 0x6818, 0xd0fc, 0x0040, 0x31ab, 0x681b,
++	0x001d, 0x0078, 0x319b, 0x0078, 0x430d, 0x681b, 0x001d, 0x0078,
++	0x40c1, 0x6920, 0x6922, 0xa684, 0x1800, 0x00c0, 0x3216, 0x6820,
++	0xd084, 0x00c0, 0x321c, 0x6818, 0xa086, 0x0008, 0x00c0, 0x31c2,
++	0x681b, 0x0000, 0xd6d4, 0x0040, 0x3281, 0xd6bc, 0x0040, 0x3202,
++	0x7087, 0x0000, 0x6818, 0xa084, 0x003f, 0xa08a, 0x000d, 0x0050,
++	0x3202, 0xa08a, 0x000c, 0x7186, 0x2001, 0x000c, 0x800c, 0x718a,
++	0x789b, 0x0061, 0x78aa, 0x157e, 0x137e, 0x147e, 0x017e, 0x3208,
++	0xa18c, 0x0300, 0x0040, 0x31f4, 0x007e, 0x2001, 0x4e04, 0x2004,
++	0xd0ec, 0x007f, 0x0040, 0x31f0, 0x20a1, 0x012b, 0x0078, 0x31f6,
++	0x20a1, 0x022b, 0x0078, 0x31f6, 0x20a1, 0x012b, 0x017f, 0x789b,
++	0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f,
++	0x137f, 0x157f, 0x6038, 0xa005, 0x00c0, 0x3211, 0x681c, 0xa084,
++	0x000e, 0x0040, 0x40c1, 0x1078, 0x40d7, 0x782b, 0x3008, 0x0078,
++	0x3213, 0x8001, 0x603a, 0x781b, 0x0067, 0x007c, 0xd6e4, 0x0040,
++	0x321c, 0x781b, 0x0079, 0x007c, 0xa684, 0x0060, 0x0040, 0x327e,
++	0xd6dc, 0x0040, 0x327e, 0xd6fc, 0x00c0, 0x3228, 0x0078, 0x323f,
++	0xc6fc, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8, 0x78d0, 0x801b, 0x00c8,
++	0x3232, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98,
++	0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0xd6f4,
++	0x0040, 0x3245, 0xc6f4, 0x7e5a, 0x6eb6, 0x7000, 0xa086, 0x0003,
++	0x00c0, 0x3253, 0x007e, 0x1078, 0x4586, 0x1078, 0x48bd, 0x007f,
++	0x781b, 0x0076, 0x007c, 0xa006, 0x1078, 0x49c3, 0x6ab0, 0x69ac,
++	0x6c98, 0x6b94, 0x2200, 0xa105, 0x0040, 0x3262, 0x2200, 0xa422,
++	0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda, 0x6ba6, 0x7bd6, 0x7bde,
++	0x2300, 0xa405, 0x00c0, 0x3272, 0xc6f5, 0x7e5a, 0x6eb6, 0x781b,
++	0x0076, 0x007c, 0x781b, 0x0076, 0x2200, 0xa115, 0x00c0, 0x327b,
++	0x1078, 0x48bd, 0x007c, 0x1078, 0x48f5, 0x007c, 0x781b, 0x0079,
++	0x007c, 0x781b, 0x0067, 0x007c, 0x1078, 0x296b, 0x0078, 0x32d2,
++	0x6920, 0xd1c4, 0x0040, 0x329b, 0xc1c4, 0x6922, 0x0c7e, 0x7058,
++	0x2060, 0x6000, 0xc0e4, 0x6002, 0x6004, 0xa084, 0xfff5, 0x6006,
++	0x0c7f, 0x0078, 0x32c6, 0xd1cc, 0x0040, 0x32c6, 0xc1cc, 0x6922,
++	0x0c7e, 0x7058, 0x2060, 0x6000, 0xc0ec, 0x6002, 0x6004, 0xc0a4,
++	0x6006, 0x2008, 0x2c48, 0x0c7f, 0xd19c, 0x0040, 0x32c6, 0x1078,
++	0x41fa, 0x1078, 0x3ef5, 0x88ff, 0x0040, 0x32c6, 0x789b, 0x0060,
++	0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x32c3,
++	0x781b, 0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x7e58, 0xd6d4,
++	0x00c0, 0x32cd, 0x781b, 0x0067, 0x007c, 0x781b, 0x0079, 0x007c,
++	0x0078, 0x40bc, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007, 0x00c0,
++	0x32e0, 0x6820, 0xa084, 0x0100, 0x0040, 0x32d0, 0x2009, 0x0008,
++	0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x00c0,
++	0x32fc, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040, 0x32f4,
++	0x0048, 0x32f4, 0x0078, 0x32f6, 0x0078, 0x3288, 0x24a8, 0x7aa8,
++	0x00f0, 0x32f6, 0x0078, 0x32e2, 0xa284, 0x00f0, 0xa086, 0x0020,
++	0x00c0, 0x3350, 0x8318, 0x8318, 0x2300, 0xa102, 0x0040, 0x330c,
++	0x0048, 0x330c, 0x0078, 0x334d, 0xa286, 0x0023, 0x0040, 0x32d0,
++	0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, 0xa684, 0xfff1, 0xc0a5,
++	0x2030, 0x7e5a, 0x6008, 0xc0a5, 0x600a, 0x0c7e, 0x7058, 0x2060,
++	0x6004, 0x2008, 0x2c48, 0x0c7f, 0xd1a4, 0x0040, 0x332d, 0x1078,
++	0x41fa, 0x1078, 0x4011, 0x0078, 0x333b, 0x0c7e, 0x7058, 0x2060,
++	0x6004, 0x2008, 0x2c48, 0x0c7f, 0xd19c, 0x0040, 0x32c6, 0x1078,
++	0x41fa, 0x1078, 0x3ef5, 0x88ff, 0x0040, 0x32c6, 0x789b, 0x0060,
++	0x2800, 0x78aa, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x334a, 0x781b,
++	0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x7aa8, 0x0078, 0x32e2,
++	0x8318, 0x2300, 0xa102, 0x0040, 0x3359, 0x0048, 0x3359, 0x0078,
++	0x32e2, 0xa284, 0x0080, 0x00c0, 0x40c1, 0x0078, 0x40bc, 0x0078,
++	0x40c1, 0x0078, 0x40b7, 0x7058, 0xa04d, 0x789b, 0x0018, 0x78a8,
++	0xa084, 0x00ff, 0xa08e, 0x0001, 0x0040, 0x3370, 0x1078, 0x296b,
++	0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004,
++	0x00c8, 0x40b7, 0x0079, 0x337c, 0x40b7, 0x3e46, 0x40b7, 0x3fb9,
++	0xa282, 0x0000, 0x00c0, 0x3386, 0x1078, 0x296b, 0x1078, 0x40c8,
++	0x781b, 0x0078, 0x007c, 0xa282, 0x0003, 0x00c0, 0x3391, 0x1078,
++	0x296b, 0xd4fc, 0x00c0, 0x33b1, 0x7064, 0xa005, 0x0040, 0x339a,
++	0x1078, 0x296b, 0x6f14, 0x7776, 0xa7bc, 0x8f00, 0x1078, 0x41fe,
++	0x6008, 0xa085, 0x0021, 0x600a, 0x8738, 0xa784, 0x001f, 0x00c0,
++	0x339e, 0x1078, 0x40cc, 0x7067, 0x0002, 0x701f, 0x0009, 0x0078,
++	0x33b3, 0x1078, 0x40db, 0x781b, 0x0078, 0x007c, 0xa282, 0x0004,
++	0x0050, 0x33bc, 0x1078, 0x296b, 0x2300, 0x0079, 0x33bf, 0x33c2,
++	0x3582, 0x35c5, 0xa286, 0x0003, 0x0040, 0x33fa, 0x7200, 0x7cd8,
++	0x7ddc, 0x7fd0, 0x71d4, 0xd1bc, 0x00c0, 0x33f2, 0xd1b4, 0x0040,
++	0x33f2, 0x7868, 0xa084, 0x00ff, 0x00c0, 0x33f2, 0xa282, 0x0002,
++	0x00c8, 0x33f2, 0x0d7e, 0x783b, 0x8300, 0x781b, 0x004c, 0x70bc,
++	0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2,
++	0x78da, 0xc1b4, 0x71d6, 0x7003, 0x0030, 0x0d7f, 0x2001, 0x0000,
++	0x0078, 0x33fe, 0x783b, 0x1300, 0x781b, 0x004a, 0x2001, 0x0000,
++	0x0078, 0x33fe, 0x7200, 0x7cd8, 0x7ddc, 0x7fd0, 0x704a, 0x68a0,
++	0xd0ec, 0x0040, 0x3406, 0x6008, 0xc08d, 0x600a, 0xa284, 0x000f,
++	0x0079, 0x340a, 0x3562, 0x3417, 0x3414, 0x36c8, 0x3754, 0x29c5,
++	0x3412, 0x3412, 0x1078, 0x296b, 0x6008, 0xc0d4, 0x600a, 0xd6e4,
++	0x0040, 0x341f, 0x7048, 0xa086, 0x0014, 0x00c0, 0x343f, 0x1078,
++	0x4586, 0x2009, 0x0000, 0x6818, 0xd0fc, 0x0040, 0x3428, 0x7048,
++	0xa086, 0x0014, 0x0040, 0x3439, 0x6818, 0xa086, 0x0008, 0x00c0,
++	0x351a, 0x7858, 0xd09c, 0x0040, 0x351a, 0x6820, 0xd0ac, 0x0040,
++	0x351a, 0x681b, 0x0014, 0x2009, 0x0002, 0x0078, 0x347e, 0x7868,
++	0xa08c, 0x00ff, 0x0040, 0x347e, 0xa186, 0x0008, 0x00c0, 0x3455,
++	0x6008, 0xc0a4, 0x600a, 0x1078, 0x3d6f, 0x0040, 0x347e, 0x1078,
++	0x3ded, 0x1078, 0x4586, 0x0078, 0x3466, 0xa186, 0x0028, 0x00c0,
++	0x347e, 0x6018, 0xa005, 0x0040, 0x3448, 0x8001, 0x0040, 0x3448,
++	0x8001, 0x0040, 0x3448, 0x601e, 0x0078, 0x3448, 0x6820, 0xd084,
++	0x0040, 0x29c5, 0xc084, 0x6822, 0x1078, 0x2acc, 0x705c, 0x0c7e,
++	0x2060, 0x6800, 0x6002, 0x0c7f, 0x6004, 0x6802, 0xa005, 0x2d00,
++	0x00c0, 0x347b, 0x6002, 0x6006, 0x0078, 0x29c5, 0x017e, 0x81ff,
++	0x00c0, 0x34c8, 0x7000, 0xa086, 0x0030, 0x0040, 0x34c8, 0x71d4,
++	0xd1bc, 0x00c0, 0x34c8, 0xd1b4, 0x00c0, 0x34af, 0x7060, 0xa005,
++	0x00c0, 0x34c8, 0x70a4, 0xa086, 0x0001, 0x0040, 0x34c8, 0x7003,
++	0x0000, 0x047e, 0x057e, 0x077e, 0x067e, 0x0c7e, 0x0d7e, 0x1078,
++	0x29ee, 0x0d7f, 0x0c7f, 0x067f, 0x077f, 0x057f, 0x047f, 0x71d4,
++	0xd1b4, 0x00c0, 0x34c8, 0x7003, 0x0040, 0x0078, 0x34c8, 0x1078,
++	0x4360, 0x00c0, 0x34c8, 0x781b, 0x005b, 0x0d7e, 0x70bc, 0xa06d,
++	0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da,
++	0xc1b4, 0x71d6, 0x7003, 0x0030, 0x7808, 0xc08d, 0x780a, 0x0d7f,
++	0x1078, 0x35ff, 0x017f, 0x81ff, 0x0040, 0x351a, 0xa684, 0xdf00,
++	0x681e, 0x682b, 0x0000, 0x6f14, 0xa186, 0x0002, 0x00c0, 0x351b,
++	0x6818, 0xa086, 0x0014, 0x00c0, 0x34e4, 0x2008, 0xd6e4, 0x0040,
++	0x34e4, 0x7868, 0xa08c, 0x00ff, 0x1078, 0x2aba, 0x1078, 0x2adb,
++	0x6820, 0xd0dc, 0x00c0, 0x351b, 0x8717, 0xa294, 0x000f, 0x8213,
++	0x8213, 0x8213, 0xb284, 0x0300, 0x0040, 0x34fa, 0xa290, 0x52c0,
++	0x0078, 0x34fc, 0xa290, 0x5340, 0xa290, 0x0000, 0x221c, 0xd3c4,
++	0x00c0, 0x3504, 0x0078, 0x350a, 0x8210, 0x2204, 0xa085, 0x0018,
++	0x2012, 0x8211, 0xd3d4, 0x0040, 0x3515, 0x68a0, 0xd0c4, 0x00c0,
++	0x3515, 0x1078, 0x3679, 0x0078, 0x29c5, 0x6008, 0xc08d, 0x600a,
++	0x0078, 0x351b, 0x692a, 0x6916, 0x6818, 0xd0fc, 0x0040, 0x3522,
++	0x7048, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x6410, 0x84ff, 0x0040,
++	0x3537, 0x2009, 0x4e02, 0x2104, 0x8001, 0x200a, 0x8421, 0x6412,
++	0x00c0, 0x3537, 0x2021, 0x4e04, 0x2404, 0xc0a5, 0x2022, 0x6018,
++	0xa005, 0x0040, 0x353f, 0x8001, 0x601a, 0x00c0, 0x3542, 0x6008,
++	0xc0a4, 0x600a, 0x6820, 0xd084, 0x00c0, 0x354e, 0x6800, 0xa005,
++	0x00c0, 0x354b, 0x6002, 0x6006, 0x0078, 0x3552, 0x705c, 0x2060,
++	0x6800, 0x6002, 0x2061, 0x4e00, 0x6887, 0x0103, 0x2d08, 0x206b,
++	0x0000, 0x6068, 0xa005, 0x616a, 0x0040, 0x3561, 0x2d02, 0x0078,
++	0x3562, 0x616e, 0x7200, 0xa286, 0x0030, 0x0040, 0x3572, 0xa286,
++	0x0040, 0x00c0, 0x29c5, 0x7003, 0x0002, 0x704c, 0x2068, 0x68c4,
++	0x2060, 0x007c, 0x7003, 0x0002, 0x70bc, 0xa06d, 0x68bc, 0x7042,
++	0x70b8, 0xa065, 0x68c0, 0x705a, 0x2d00, 0x704e, 0xad80, 0x0009,
++	0x7046, 0x007c, 0xa282, 0x0004, 0x0048, 0x3588, 0x1078, 0x296b,
++	0x2200, 0x0079, 0x358b, 0x358f, 0x35a0, 0x35ad, 0x35a0, 0xa586,
++	0x1300, 0x0040, 0x35a0, 0xa586, 0x8300, 0x00c0, 0x3586, 0x7003,
++	0x0000, 0x6018, 0x8001, 0x601a, 0x6008, 0xa084, 0xfbef, 0x600a,
++	0x7000, 0xa086, 0x0005, 0x0040, 0x35aa, 0x1078, 0x40c8, 0x781b,
++	0x0078, 0x007c, 0x781b, 0x0079, 0x007c, 0x7890, 0x8007, 0x8001,
++	0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff,
++	0xa186, 0x0003, 0x0040, 0x35c2, 0xa186, 0x0000, 0x0040, 0x35c2,
++	0x0078, 0x40b7, 0x781b, 0x0079, 0x007c, 0x6820, 0xc095, 0x6822,
++	0x82ff, 0x00c0, 0x35cf, 0x1078, 0x40c8, 0x0078, 0x35d6, 0x8211,
++	0x0040, 0x35d4, 0x1078, 0x296b, 0x1078, 0x40db, 0x781b, 0x0078,
++	0x007c, 0x1078, 0x4383, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x35fc,
++	0x017e, 0x3208, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f,
++	0x0040, 0x35ee, 0xa18c, 0x0300, 0x0078, 0x35f0, 0xa18c, 0x0400,
++	0x017f, 0x0040, 0x35f7, 0x0018, 0x35fc, 0x0078, 0x35f9, 0x0028,
++	0x35fc, 0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0xa684,
++	0x0060, 0x00c0, 0x3609, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078,
++	0x3678, 0xd6dc, 0x00c0, 0x3621, 0x68b4, 0xd0dc, 0x00c0, 0x3621,
++	0x6998, 0x6a94, 0x692e, 0x6a32, 0x7048, 0xa005, 0x00c0, 0x361e,
++	0x2200, 0xa105, 0x0040, 0x4586, 0x704b, 0x0015, 0x0078, 0x4586,
++	0x007c, 0xd6ac, 0x0040, 0x3647, 0xd6f4, 0x0040, 0x362d, 0x682f,
++	0x0000, 0x6833, 0x0000, 0x0078, 0x4586, 0x68b4, 0xa084, 0x4000,
++	0xa635, 0xd6f4, 0x00c0, 0x3627, 0x7048, 0xa005, 0x00c0, 0x363a,
++	0x704b, 0x0015, 0xd6dc, 0x00c0, 0x3643, 0x68b4, 0xd0dc, 0x0040,
++	0x3643, 0x6ca8, 0x6da4, 0x6c2e, 0x6d32, 0x0078, 0x4586, 0xd6f4,
++	0x0040, 0x3650, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x4586,
++	0x68b4, 0xa084, 0x4800, 0xa635, 0xd6f4, 0x00c0, 0x364a, 0x7048,
++	0xa005, 0x00c0, 0x365d, 0x704b, 0x0015, 0x2408, 0x2510, 0x2700,
++	0x80fb, 0x00c8, 0x3664, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291,
++	0x0000, 0x692e, 0x6a32, 0x2100, 0xa205, 0x00c0, 0x3671, 0x0078,
++	0x4586, 0x7000, 0xa086, 0x0006, 0x0040, 0x3678, 0x0078, 0x4586,
++	0x007c, 0x6946, 0x6008, 0xc0cd, 0xd3cc, 0x0040, 0x3680, 0xc08d,
++	0x600a, 0x6818, 0x683a, 0x681b, 0x0006, 0x688f, 0x0000, 0x6893,
++	0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f, 0x0003, 0x6833,
++	0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b, 0x0020, 0x7000,
++	0x0079, 0x369a, 0x29c5, 0x36ac, 0x36a4, 0x36a2, 0x36a2, 0x36a2,
++	0x36a2, 0x36a2, 0x1078, 0x296b, 0x6820, 0xd084, 0x00c0, 0x36ac,
++	0x1078, 0x3dd0, 0x0078, 0x36b2, 0x705c, 0x2c50, 0x2060, 0x6800,
++	0x6002, 0x2a60, 0x3208, 0xa18c, 0x0300, 0x0040, 0x36bb, 0x2021,
++	0x4e58, 0x0078, 0x36bd, 0x2021, 0x4e98, 0x2404, 0xa005, 0x0040,
++	0x36c4, 0x2020, 0x0078, 0x36bd, 0x2d22, 0x206b, 0x0000, 0x007c,
++	0x1078, 0x3dd7, 0x1078, 0x3ded, 0x6008, 0xc0cc, 0x600a, 0x682b,
++	0x0000, 0x789b, 0x000e, 0x6f14, 0x6938, 0x691a, 0x6944, 0x6916,
++	0x3208, 0xa18c, 0x0300, 0x0040, 0x36e1, 0x2009, 0x0000, 0x0078,
++	0x36e3, 0x2009, 0x0001, 0x1078, 0x49f8, 0xd6dc, 0x0040, 0x36eb,
++	0x691c, 0xc1ed, 0x691e, 0x6818, 0xd0fc, 0x0040, 0x36fa, 0x7868,
++	0xa08c, 0x00ff, 0x0040, 0x36f8, 0x681b, 0x001e, 0x0078, 0x36fa,
++	0x681b, 0x0000, 0xb284, 0x0300, 0x00c0, 0x3702, 0x2021, 0x4e98,
++	0x0078, 0x3704, 0x2021, 0x4e58, 0x6800, 0x2022, 0x6a3c, 0x6940,
++	0x6a32, 0x692e, 0x68c0, 0x2060, 0x6000, 0xd0a4, 0x0040, 0x3744,
++	0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x0d7e, 0x0f7e,
++	0x157e, 0x147e, 0x2079, 0x4e00, 0x1078, 0x1dff, 0x147f, 0x157f,
++	0x0f7f, 0x70cc, 0x2010, 0x2009, 0x0101, 0x027e, 0x2204, 0xa06d,
++	0x0040, 0x3734, 0x6814, 0xa706, 0x0040, 0x3731, 0x6800, 0x0078,
++	0x3727, 0x6820, 0xc0d5, 0x6822, 0x027f, 0x8210, 0x8109, 0x00c0,
++	0x3725, 0x0d7f, 0x7067, 0x0003, 0x707f, 0x0000, 0x7776, 0x7083,
++	0x000f, 0x71d4, 0xc1dc, 0x71d6, 0x6818, 0xa086, 0x0002, 0x00c0,
++	0x3750, 0x6817, 0x0000, 0x682b, 0x0000, 0x681c, 0xc0ec, 0x681e,
++	0x1078, 0x202c, 0x0078, 0x29c5, 0x7cd8, 0x7ddc, 0x7fd0, 0x1078,
++	0x35ff, 0x682b, 0x0000, 0x789b, 0x000e, 0x6f14, 0x1078, 0x4387,
++	0xa08c, 0x00ff, 0x6916, 0x6818, 0xd0fc, 0x0040, 0x3769, 0x7048,
++	0x681a, 0xa68c, 0xdf00, 0x691e, 0x7067, 0x0000, 0x0078, 0x29c5,
++	0x7000, 0xa005, 0x00c0, 0x3776, 0x0078, 0x29c5, 0xa006, 0x1078,
++	0x4586, 0x6920, 0xd1ac, 0x00c0, 0x377f, 0x681b, 0x0014, 0xa68c,
++	0xdf00, 0x691e, 0x682b, 0x0000, 0x6820, 0xa084, 0x00ff, 0x6822,
++	0x7000, 0x0079, 0x378b, 0x29c5, 0x3795, 0x3795, 0x3798, 0x3798,
++	0x3798, 0x3793, 0x3793, 0x1078, 0x296b, 0x6818, 0x0078, 0x33fa,
++	0x6008, 0xc0a4, 0x600a, 0x6817, 0x0000, 0x0078, 0x3d95, 0x2300,
++	0x0079, 0x37a2, 0x37a5, 0x37a7, 0x3817, 0x1078, 0x296b, 0xd6fc,
++	0x00c0, 0x37fe, 0x7000, 0xa00d, 0x0079, 0x37ae, 0x29c5, 0x37b8,
++	0x37b8, 0x37e8, 0x37b8, 0x37fb, 0x37b6, 0x37b6, 0x1078, 0x296b,
++	0xa684, 0x0060, 0x0040, 0x37e8, 0xa086, 0x0060, 0x00c0, 0x37e5,
++	0xc6ac, 0xc6f4, 0xc6ed, 0x7e5a, 0x6eb6, 0x681c, 0xc0ac, 0x681e,
++	0xa186, 0x0002, 0x0040, 0x37d7, 0x1078, 0x4586, 0x69ac, 0x68b0,
++	0xa115, 0x0040, 0x37d7, 0x1078, 0x48f5, 0x0078, 0x37d9, 0x1078,
++	0x48bd, 0x781b, 0x0079, 0x71d4, 0xd1b4, 0x00c0, 0x29c1, 0x70a4,
++	0xa086, 0x0001, 0x00c0, 0x2a0b, 0x007c, 0xd6ec, 0x0040, 0x37c2,
++	0x6818, 0xd0fc, 0x0040, 0x37fb, 0xd6f4, 0x00c0, 0x37f5, 0x681b,
++	0x0015, 0x781b, 0x0079, 0x0078, 0x29c1, 0x681b, 0x0007, 0x682f,
++	0x0000, 0x6833, 0x0000, 0x1078, 0x4319, 0x007c, 0xc6fc, 0x7e5a,
++	0x7adc, 0x79d8, 0x78d0, 0x801b, 0x00c8, 0x3807, 0x8000, 0xa084,
++	0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2,
++	0x6b94, 0x2200, 0xa303, 0x68ae, 0x781b, 0x0079, 0x007c, 0x1078,
++	0x296b, 0x2300, 0x0079, 0x381c, 0x3821, 0x3846, 0x38a6, 0x1078,
++	0x296b, 0x7000, 0x0079, 0x3824, 0x382c, 0x382e, 0x3837, 0x382c,
++	0x382c, 0x382c, 0x382c, 0x382c, 0x1078, 0x296b, 0x69ac, 0x68b0,
++	0xa115, 0x0040, 0x3837, 0x1078, 0x48f5, 0x0078, 0x3839, 0x1078,
++	0x48bd, 0x681c, 0xc0b4, 0x681e, 0x70d4, 0xd0b4, 0x00c0, 0x29c1,
++	0x70a4, 0xa086, 0x0001, 0x00c0, 0x2a0b, 0x007c, 0xd6fc, 0x00c0,
++	0x3896, 0x7000, 0xa00d, 0x0079, 0x384d, 0x29c5, 0x385d, 0x3857,
++	0x388d, 0x385d, 0x3893, 0x3855, 0x3855, 0x1078, 0x296b, 0x6894,
++	0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xa684, 0x0060, 0x0040,
++	0x388d, 0xa086, 0x0060, 0x00c0, 0x388a, 0xa6b4, 0xbfbf, 0xc6ed,
++	0x7e5a, 0x6eb6, 0xa186, 0x0002, 0x0040, 0x3879, 0x1078, 0x4586,
++	0x69ac, 0x68b0, 0xa115, 0x0040, 0x3879, 0x1078, 0x48f5, 0x0078,
++	0x387b, 0x1078, 0x48bd, 0x781b, 0x0079, 0x681c, 0xc0b4, 0x681e,
++	0x71d4, 0xd1b4, 0x00c0, 0x29c1, 0x70a4, 0xa086, 0x0001, 0x00c0,
++	0x2a0b, 0x007c, 0xd6ec, 0x0040, 0x3867, 0x6818, 0xd0fc, 0x0040,
++	0x3893, 0x681b, 0x0007, 0x781b, 0x00f9, 0x007c, 0xc6fc, 0x7e5a,
++	0x7adc, 0x79d8, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200,
++	0xa303, 0x68ae, 0x79d2, 0x781b, 0x0079, 0x007c, 0xd6dc, 0x0040,
++	0x38af, 0x782b, 0x3009, 0x781b, 0x0079, 0x0078, 0x29c1, 0x7884,
++	0xc0ac, 0x7886, 0x78e4, 0xa084, 0x0008, 0x00c0, 0x38c2, 0xa484,
++	0x0200, 0x0040, 0x38bc, 0xc6f5, 0xc6dd, 0x7e5a, 0x781b, 0x0079,
++	0x0078, 0x29c1, 0x6820, 0xc095, 0x6822, 0x1078, 0x4292, 0xc6dd,
++	0x1078, 0x40c8, 0x781b, 0x0078, 0x0078, 0x29c1, 0x2300, 0x0079,
++	0x38d1, 0x38d4, 0x38d6, 0x38d8, 0x1078, 0x296b, 0x0078, 0x40c1,
++	0xd6d4, 0x00c0, 0x3913, 0x79e4, 0xd1ac, 0x0040, 0x38e6, 0x78ec,
++	0xa084, 0x0003, 0x0040, 0x38e6, 0x782b, 0x3009, 0x789b, 0x0060,
++	0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x79e4, 0xd1ac, 0x0040,
++	0x38f6, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x390f, 0x2001, 0x4e04,
++	0x2004, 0xd0e4, 0x00c0, 0x390b, 0x6820, 0xd0c4, 0x0040, 0x390b,
++	0x0c7e, 0x7058, 0x2060, 0x6004, 0xc09d, 0x6006, 0x6008, 0xa084,
++	0x00ff, 0x600a, 0x0c7f, 0x2001, 0x0014, 0x0078, 0x33fa, 0xa184,
++	0x0007, 0x0079, 0x3949, 0x7a90, 0xa294, 0x0007, 0x789b, 0x0060,
++	0x79a8, 0x81ff, 0x0040, 0x3947, 0x789b, 0x0010, 0x7ba8, 0xa384,
++	0x0001, 0x00c0, 0x393a, 0x7ba8, 0x7ba8, 0xa386, 0x0001, 0x00c0,
++	0x392d, 0x2009, 0xfff7, 0x0078, 0x3933, 0xa386, 0x0003, 0x00c0,
++	0x393a, 0x2009, 0xffef, 0x0c7e, 0x7058, 0x2060, 0x6004, 0xa104,
++	0x6006, 0x0c7f, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb,
++	0x785a, 0x782b, 0x3009, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0078,
++	0x430d, 0x3090, 0x309a, 0x3953, 0x3959, 0x3951, 0x3951, 0x430d,
++	0x430d, 0x1078, 0x296b, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0078,
++	0x4313, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0078, 0x430d, 0x79e4,
++	0xa184, 0x0030, 0x0040, 0x3969, 0x78ec, 0xa084, 0x0003, 0x00c0,
++	0x399d, 0x7000, 0xa086, 0x0004, 0x00c0, 0x3983, 0x7064, 0xa086,
++	0x0002, 0x00c0, 0x3979, 0x2011, 0x0002, 0x2019, 0x0000, 0x0078,
++	0x2f1c, 0x7064, 0xa086, 0x0006, 0x0040, 0x3973, 0x7064, 0xa086,
++	0x0004, 0x0040, 0x3973, 0x7000, 0xa086, 0x0000, 0x0040, 0x29c1,
++	0x6920, 0xa184, 0x0420, 0x0040, 0x3992, 0xc1d4, 0x6922, 0x6818,
++	0x0078, 0x33fa, 0x6818, 0xa08e, 0x0002, 0x0040, 0x399b, 0xc0fd,
++	0x681a, 0x2001, 0x0014, 0x0078, 0x33fa, 0xa184, 0x0007, 0x0079,
++	0x39a1, 0x430d, 0x430d, 0x39a9, 0x430d, 0x4355, 0x4355, 0x430d,
++	0x430d, 0xd6bc, 0x0040, 0x39eb, 0x7184, 0x81ff, 0x0040, 0x39eb,
++	0xa182, 0x000d, 0x00d0, 0x39b8, 0x7087, 0x0000, 0x0078, 0x39bd,
++	0xa182, 0x000c, 0x7086, 0x2009, 0x000c, 0x789b, 0x0061, 0x79aa,
++	0x157e, 0x137e, 0x147e, 0x7088, 0x8114, 0xa210, 0x728a, 0xa080,
++	0x000b, 0xad00, 0x2098, 0xb284, 0x0300, 0x0040, 0x39df, 0x007e,
++	0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x39db, 0x20a1,
++	0x012b, 0x0078, 0x39e1, 0x20a1, 0x022b, 0x0078, 0x39e1, 0x20a1,
++	0x012b, 0x789b, 0x0000, 0x8108, 0x81ac, 0x53a6, 0x147f, 0x137f,
++	0x157f, 0x0078, 0x4313, 0xd6d4, 0x00c0, 0x3a3f, 0x6820, 0xd084,
++	0x0040, 0x4313, 0xa68c, 0x0060, 0xa684, 0x0060, 0x0040, 0x39fd,
++	0xa086, 0x0060, 0x00c0, 0x39fd, 0xc1f5, 0xc194, 0x795a, 0x69b6,
++	0x789b, 0x0060, 0x78ab, 0x0000, 0x789b, 0x0061, 0x6818, 0xc0fd,
++	0x681a, 0x78aa, 0x8008, 0x810c, 0x0040, 0x3e06, 0xa18c, 0x00f8,
++	0x00c0, 0x3e06, 0x157e, 0x137e, 0x147e, 0x017e, 0x3208, 0xa18c,
++	0x0300, 0x0040, 0x3a2b, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec,
++	0x007f, 0x0040, 0x3a27, 0x20a1, 0x012b, 0x0078, 0x3a2d, 0x20a1,
++	0x022b, 0x0078, 0x3a2d, 0x20a1, 0x012b, 0x017f, 0x789b, 0x0000,
++	0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f,
++	0x157f, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x0078, 0x4313, 0x6818,
++	0xd0fc, 0x0040, 0x3a45, 0x681b, 0x0008, 0x6820, 0xc0ad, 0x6822,
++	0x1078, 0x40d0, 0x781b, 0x00ea, 0x007c, 0x2300, 0x0079, 0x3a50,
++	0x3a55, 0x3b2d, 0x3a53, 0x1078, 0x296b, 0x7cd8, 0x7ddc, 0x7fd0,
++	0x82ff, 0x00c0, 0x3a7e, 0x7200, 0xa286, 0x0003, 0x0040, 0x33c7,
++	0x71d4, 0xd1bc, 0x00c0, 0x3a81, 0xd1b4, 0x0040, 0x3a81, 0x0d7e,
++	0x783b, 0x8800, 0x781b, 0x004c, 0x70bc, 0xa06d, 0x68b4, 0xc0a5,
++	0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xc1b4,
++	0x71d6, 0x7003, 0x0030, 0x0d7f, 0x0078, 0x3a85, 0x7200, 0x0078,
++	0x3a85, 0x783b, 0x1800, 0x781b, 0x004a, 0xa284, 0x000f, 0x0079,
++	0x3a89, 0x3b18, 0x3ac7, 0x3a93, 0x33f6, 0x3a91, 0x3b18, 0x3a91,
++	0x3a91, 0x1078, 0x296b, 0x681c, 0xd0ec, 0x0040, 0x3a9a, 0x6008,
++	0xc08d, 0x600a, 0x6920, 0xc185, 0x6922, 0x6800, 0x6006, 0xa005,
++	0x00c0, 0x3aa3, 0x6002, 0x6008, 0xc0d4, 0x600a, 0x681c, 0xa084,
++	0x000e, 0x00c0, 0x3ab7, 0xb284, 0x0300, 0x0040, 0x3ab3, 0x2009,
++	0x94c0, 0x0078, 0x3abc, 0x2009, 0x95d0, 0x0078, 0x3abc, 0x7030,
++	0x68ba, 0x7140, 0x70cc, 0xa108, 0x2104, 0x6802, 0x2d0a, 0x715e,
++	0xd6dc, 0x00c0, 0x3ac7, 0xc6fc, 0x6eb6, 0x0078, 0x3b18, 0x6eb6,
++	0xa684, 0x0060, 0x00c0, 0x3ad1, 0xa684, 0x7fff, 0x68b6, 0x0078,
++	0x3b18, 0xd6dc, 0x00c0, 0x3adf, 0xa684, 0x7fff, 0x68b6, 0x6894,
++	0x68a6, 0x6898, 0x68aa, 0x1078, 0x4586, 0x0078, 0x3b18, 0xd6ac,
++	0x0040, 0x3aeb, 0xa006, 0x1078, 0x4586, 0x2408, 0x2510, 0x69aa,
++	0x6aa6, 0x0078, 0x3afb, 0x2408, 0x2510, 0x2700, 0x801b, 0x00c8,
++	0x3af2, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x69aa,
++	0x6aa6, 0x1078, 0x4586, 0xd6fc, 0x0040, 0x3b18, 0xa684, 0x7fff,
++	0x68b6, 0x2510, 0x2408, 0xd6ac, 0x00c0, 0x3b10, 0x2700, 0x801b,
++	0x00c8, 0x3b0b, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
++	0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae,
++	0x7000, 0xa086, 0x0030, 0x00c0, 0x29c5, 0x7003, 0x0002, 0x70bc,
++	0xa06d, 0x68bc, 0x7042, 0x70b8, 0xa065, 0x68c0, 0x705a, 0x2d00,
++	0x704e, 0xad80, 0x0009, 0x7046, 0x007c, 0xa586, 0x8800, 0x00c0,
++	0x3b3a, 0x7003, 0x0000, 0x6018, 0x8001, 0x601a, 0x6008, 0xa084,
++	0xfbef, 0x600a, 0x0078, 0x40c1, 0x7047, 0x0000, 0xa282, 0x0006,
++	0x0050, 0x3b44, 0x1078, 0x296b, 0x2300, 0x0079, 0x3b47, 0x3b4a,
++	0x3b5c, 0x3b68, 0x2200, 0x0079, 0x3b4d, 0x3b53, 0x40c1, 0x3b55,
++	0x3b53, 0x3ba2, 0x3bf7, 0x1078, 0x296b, 0x7a80, 0xa294, 0x0f00,
++	0x1078, 0x3c81, 0x0078, 0x40b7, 0x1078, 0x3b79, 0x0079, 0x3b60,
++	0x40c1, 0x3b66, 0x3b66, 0x3ba2, 0x3b66, 0x40c1, 0x1078, 0x296b,
++	0x1078, 0x3b79, 0x0079, 0x3b6c, 0x3b74, 0x3b72, 0x3b72, 0x3b74,
++	0x3b72, 0x3b74, 0x1078, 0x296b, 0x1078, 0x40db, 0x781b, 0x0078,
++	0x007c, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3b8a, 0x1078, 0x3ded,
++	0x0078, 0x3b84, 0x1078, 0x4586, 0x6008, 0xa084, 0xfbef, 0x600a,
++	0x0078, 0x3b8f, 0x7000, 0xa086, 0x0003, 0x0040, 0x3b82, 0x7003,
++	0x0005, 0xb284, 0x0300, 0x0040, 0x3b99, 0x2001, 0x95e0, 0x0078,
++	0x3b9b, 0x2001, 0x9612, 0x2068, 0x704e, 0xad80, 0x0009, 0x7046,
++	0x2200, 0x007c, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3bb4, 0x70d4,
++	0xc0b5, 0x70d6, 0x2c00, 0x70ba, 0x2d00, 0x70be, 0x0078, 0x3bb9,
++	0x1078, 0x4586, 0x0078, 0x3bb9, 0x7000, 0xa086, 0x0003, 0x0040,
++	0x3bb0, 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018,
++	0x7ca8, 0xa484, 0x001f, 0xa215, 0x2069, 0x94c0, 0xb284, 0x0300,
++	0x00c0, 0x3bcd, 0xc2fd, 0x2069, 0x95d0, 0x2d04, 0x2d08, 0x715e,
++	0xa06d, 0x0040, 0x3bda, 0x6814, 0xa206, 0x0040, 0x3bdc, 0x6800,
++	0x0078, 0x3bce, 0x1078, 0x3c81, 0x6eb4, 0x7e5a, 0x6920, 0xa184,
++	0x0c00, 0x0040, 0x3cab, 0x7064, 0xa086, 0x0006, 0x00c0, 0x3bee,
++	0x7074, 0xa206, 0x00c0, 0x3bee, 0x7066, 0x707e, 0x681b, 0x0005,
++	0xc1ad, 0xc1d4, 0x6922, 0x1078, 0x40d0, 0x0078, 0x3cab, 0x7200,
++	0xa286, 0x0002, 0x00c0, 0x3c09, 0x70d4, 0xc0b5, 0x70d6, 0x2c00,
++	0x70ba, 0x2d00, 0x70be, 0x0078, 0x3c0d, 0x1078, 0x4586, 0x0078,
++	0x3c0d, 0xa286, 0x0003, 0x0040, 0x3c05, 0x7003, 0x0001, 0x7a80,
++	0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215,
++	0xb284, 0x0300, 0x00c0, 0x3c1d, 0xc2fd, 0x79a8, 0x79a8, 0xa18c,
++	0x00ff, 0x2118, 0x70cc, 0xa168, 0x2d04, 0x2d08, 0x715e, 0xa06d,
++	0x0040, 0x3c31, 0x6814, 0xa206, 0x0040, 0x3c5a, 0x6800, 0x0078,
++	0x3c25, 0x7003, 0x0005, 0xb284, 0x0300, 0x0040, 0x3c3b, 0x2001,
++	0x95e0, 0x0078, 0x3c3d, 0x2001, 0x9612, 0x2068, 0x704e, 0x157e,
++	0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, 0x00f0, 0x3c42, 0x157f,
++	0xb284, 0x0300, 0x0040, 0x3c4f, 0xc2fc, 0x0078, 0x3c50, 0xc2fd,
++	0x6a16, 0xad80, 0x0009, 0x7046, 0x68b7, 0x0700, 0x6823, 0x0800,
++	0x6827, 0x0003, 0x6eb4, 0x6920, 0xa184, 0x0c00, 0x0040, 0x3cab,
++	0xd0dc, 0x0040, 0x3c76, 0x7064, 0xa086, 0x0004, 0x00c0, 0x3c72,
++	0x7074, 0xa206, 0x00c0, 0x3c72, 0x7078, 0xa306, 0x00c0, 0x3c72,
++	0x7066, 0x707e, 0x1078, 0x40d7, 0x0078, 0x3cab, 0x681b, 0x0005,
++	0xc1ad, 0xc1d4, 0x6922, 0x1078, 0x40d0, 0x707f, 0x0000, 0x0078,
++	0x3cab, 0x7003, 0x0005, 0xb284, 0x0300, 0x0040, 0x3c8b, 0x2001,
++	0x95e0, 0x0078, 0x3c8d, 0x2001, 0x9612, 0x2068, 0x704e, 0x157e,
++	0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, 0x00f0, 0x3c92, 0x157f,
++	0xb284, 0x0300, 0x0040, 0x3c9f, 0xc2fc, 0x0078, 0x3ca0, 0xc2fd,
++	0x6a16, 0xad80, 0x0009, 0x7046, 0x68b7, 0x0700, 0x6823, 0x0800,
++	0x6827, 0x0003, 0x007c, 0xc6ec, 0xa6ac, 0x0060, 0x0040, 0x3cfd,
++	0x6b98, 0x6c94, 0x69ac, 0x68b0, 0xa105, 0x00c0, 0x3cd8, 0x7bd2,
++	0x7bda, 0x7cd6, 0x7cde, 0xa586, 0x0060, 0x0040, 0x3d02, 0xd6f4,
++	0x00c0, 0x3cc3, 0xc6ed, 0xa6b4, 0xb7ff, 0x7e5a, 0x2009, 0x0079,
++	0xd69c, 0x0040, 0x3cd0, 0x2009, 0x0078, 0x2019, 0x0000, 0x2320,
++	0x791a, 0xd6ec, 0x0040, 0x3d0d, 0x1078, 0x48bd, 0x0078, 0x3d0d,
++	0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400, 0xa305, 0x0040, 0x3d04,
++	0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68b0, 0xd6f4, 0x00c0, 0x3ce9,
++	0xc6ed, 0xc6f4, 0x7e5a, 0x2011, 0x0079, 0xd69c, 0x0040, 0x3cf5,
++	0x2011, 0x0078, 0x2019, 0x0000, 0x2320, 0x7a1a, 0xd6ec, 0x0040,
++	0x3d0d, 0x1078, 0x48f5, 0x0078, 0x3d0d, 0x2019, 0x0000, 0x2320,
++	0x0078, 0x3d04, 0xa6b4, 0xb7ff, 0x7e5a, 0x2009, 0x0079, 0xd69c,
++	0x0040, 0x3d0c, 0x2009, 0x0078, 0x791a, 0x68c0, 0x705a, 0x2d00,
++	0x704e, 0x68c4, 0x2060, 0x71d4, 0x2001, 0x4e01, 0x2004, 0xd0c4,
++	0x00c0, 0x3d62, 0x70d8, 0xa02d, 0x0040, 0x3d3b, 0xd1bc, 0x0040,
++	0x3d55, 0x7a80, 0xa294, 0x0f00, 0x70dc, 0xa206, 0x0040, 0x3d2c,
++	0x78e0, 0xa504, 0x00c0, 0x3d62, 0x70da, 0xc1bc, 0x71d6, 0x0078,
++	0x3d62, 0x2031, 0x0001, 0x852c, 0x0048, 0x3d3a, 0x8633, 0x8210,
++	0x0078, 0x3d33, 0x007c, 0x7de0, 0xa594, 0xff00, 0x0040, 0x3d48,
++	0x2011, 0x0008, 0x852f, 0x1078, 0x3d31, 0x8637, 0x0078, 0x3d4a,
++	0x1078, 0x3d31, 0x8217, 0x7880, 0xa084, 0x0f00, 0xa206, 0x0040,
++	0x3d62, 0x72de, 0x76da, 0x0078, 0x3d62, 0x7a80, 0xa294, 0x0f00,
++	0x70dc, 0xa236, 0x0040, 0x3d52, 0x78e0, 0xa534, 0x0040, 0x3d52,
++	0xc1bd, 0x71d6, 0xd1b4, 0x00c0, 0x29c1, 0x2300, 0xa405, 0x0040,
++	0x29c1, 0x70a4, 0xa086, 0x0001, 0x00c0, 0x2a0b, 0x007c, 0x6020,
++	0xa005, 0x0040, 0x3d7d, 0x8001, 0x6022, 0x6008, 0xa085, 0x0008,
++	0x600a, 0x700f, 0x0100, 0x702c, 0x6026, 0x007c, 0xa006, 0x1078,
++	0x4586, 0x7000, 0xa086, 0x0002, 0x0040, 0x3d8b, 0x7064, 0xa086,
++	0x0005, 0x00c0, 0x3d95, 0x682b, 0x0000, 0x6817, 0x0000, 0x681b,
++	0x0001, 0x6823, 0x0040, 0x681f, 0x0100, 0x7000, 0xa084, 0x000f,
++	0x0079, 0x3d9a, 0x29c5, 0x3daa, 0x3da4, 0x3dcc, 0x3db4, 0x29c5,
++	0x3da2, 0x3da2, 0x1078, 0x296b, 0x1078, 0x3dd7, 0x1078, 0x3dd0,
++	0x0078, 0x3db0, 0x1078, 0x3dd7, 0x705c, 0x2060, 0x6800, 0x6002,
++	0x1078, 0x202c, 0x0078, 0x29c5, 0x7064, 0x7067, 0x0000, 0x7083,
++	0x0000, 0x0079, 0x3dbb, 0x3dc8, 0x3dc8, 0x3dc3, 0x3dc3, 0x3dc3,
++	0x3dc8, 0x3dc3, 0x3dc8, 0x77d4, 0xc7dd, 0x77d6, 0x0079, 0x2f35,
++	0x7067, 0x0000, 0x0078, 0x29c5, 0x681b, 0x0000, 0x0078, 0x36c8,
++	0x6800, 0xa005, 0x00c0, 0x3dd5, 0x6002, 0x6006, 0x007c, 0x6410,
++	0x84ff, 0x0040, 0x3de9, 0x2009, 0x4e02, 0x2104, 0x8001, 0x200a,
++	0x8421, 0x6412, 0x00c0, 0x3de9, 0x2021, 0x4e04, 0x2404, 0xc0a5,
++	0x2022, 0x6008, 0xc0a4, 0x600a, 0x007c, 0x6018, 0xa005, 0x0040,
++	0x3df3, 0x8001, 0x601a, 0x007c, 0x1078, 0x4383, 0x681b, 0x0018,
++	0x0078, 0x3e34, 0x1078, 0x4383, 0x681b, 0x0019, 0x0078, 0x3e34,
++	0x1078, 0x4383, 0x681b, 0x001a, 0x0078, 0x3e34, 0x1078, 0x4383,
++	0x681b, 0x0003, 0x0078, 0x3e34, 0x7774, 0x1078, 0x41fe, 0x7178,
++	0xa18c, 0x00ff, 0x3210, 0xa294, 0x0300, 0x0040, 0x3e1b, 0xa1e8,
++	0x93c0, 0x0078, 0x3e1d, 0xa1e8, 0x94d0, 0x2d04, 0x2d08, 0x2068,
++	0xa005, 0x00c0, 0x3e26, 0x707e, 0x0078, 0x29c5, 0x6814, 0x7274,
++	0xa206, 0x0040, 0x3e2e, 0x6800, 0x0078, 0x3e1e, 0x6800, 0x200a,
++	0x681b, 0x0005, 0x707f, 0x0000, 0x1078, 0x3dd7, 0x6820, 0xd084,
++	0x00c0, 0x3e3c, 0x1078, 0x3dd0, 0x1078, 0x3ded, 0x681f, 0x0000,
++	0x6823, 0x0020, 0x1078, 0x202c, 0x0078, 0x29c5, 0xa282, 0x0003,
++	0x00c0, 0x40b7, 0x7da8, 0xa5ac, 0x00ff, 0x7e5a, 0x7ea8, 0xa6b4,
++	0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1c4, 0x0040, 0x3ea1, 0xc1c4,
++	0x6922, 0xa6b4, 0x00ff, 0x0040, 0x3e8e, 0xa682, 0x000c, 0x0048,
++	0x3e65, 0x0040, 0x3e65, 0x2031, 0x000c, 0x2500, 0xa086, 0x000a,
++	0x0040, 0x3e6c, 0x852b, 0x852b, 0x1078, 0x4190, 0x0040, 0x3e74,
++	0x1078, 0x3f6f, 0x0078, 0x3e97, 0x1078, 0x414b, 0x0c7e, 0x2960,
++	0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x3fa5, 0x0c7f, 0x6920,
++	0xc1c5, 0x6922, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x3e8b,
++	0x781b, 0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x0c7e, 0x2960,
++	0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x3fa5, 0x0c7f, 0x7e58,
++	0xd6d4, 0x00c0, 0x3e9e, 0x781b, 0x0067, 0x007c, 0x781b, 0x0079,
++	0x007c, 0x0c7e, 0x7058, 0x2060, 0x6100, 0xd1e4, 0x0040, 0x3eea,
++	0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000c, 0x0048, 0x3eb4,
++	0x0040, 0x3eb4, 0x2011, 0x000c, 0x2600, 0xa202, 0x00c8, 0x3eb9,
++	0x2230, 0x6208, 0xa294, 0x00ff, 0x2001, 0x4e05, 0x2004, 0xd0e4,
++	0x00c0, 0x3ece, 0x78ec, 0xd0e4, 0x0040, 0x3ece, 0xa282, 0x000a,
++	0x00c8, 0x3ed4, 0x2011, 0x000a, 0x0078, 0x3ed4, 0xa282, 0x000c,
++	0x00c8, 0x3ed4, 0x2011, 0x000c, 0x2200, 0xa502, 0x00c8, 0x3ed9,
++	0x2228, 0x1078, 0x414f, 0x2500, 0xa086, 0x000a, 0x0040, 0x3ee2,
++	0x852b, 0x852b, 0x1078, 0x4190, 0x0040, 0x3eea, 0x1078, 0x3f6f,
++	0x0078, 0x3eee, 0x1078, 0x414b, 0x1078, 0x3fa5, 0x7858, 0xc095,
++	0x785a, 0x0c7f, 0x781b, 0x0078, 0x007c, 0x0c7e, 0x2960, 0x6000,
++	0xd0e4, 0x00c0, 0x3f0b, 0xa084, 0x0040, 0x00c0, 0x3f05, 0x6104,
++	0xa18c, 0xfff5, 0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019,
++	0x0000, 0x0078, 0x3f36, 0x68a0, 0xd0cc, 0x00c0, 0x3f05, 0x6208,
++	0xa294, 0x00ff, 0x2001, 0x4e05, 0x2004, 0xd0e4, 0x00c0, 0x3f24,
++	0x78ec, 0xd0e4, 0x0040, 0x3f24, 0xa282, 0x000b, 0x00c8, 0x3f24,
++	0x2011, 0x000a, 0x0078, 0x3f2a, 0xa282, 0x000c, 0x00c8, 0x3f2a,
++	0x2011, 0x000c, 0x6308, 0x831f, 0xa39c, 0x00ff, 0xa382, 0x000c,
++	0x0048, 0x3f36, 0x0040, 0x3f36, 0x2019, 0x000c, 0x78ab, 0x0001,
++	0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005,
++	0x6820, 0xc0c5, 0x6822, 0x70d4, 0xd0b4, 0x0040, 0x3f52, 0xc0b4,
++	0x70d6, 0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018,
++	0x8001, 0x601a, 0x0c7f, 0x007c, 0x0c7e, 0x2960, 0x6104, 0xa18c,
++	0xfff5, 0x6106, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078, 0x3f60,
++	0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa,
++	0xa8c0, 0x0005, 0x6820, 0xc0c5, 0x6822, 0x0c7f, 0x007c, 0x0c7e,
++	0x7158, 0x2160, 0x2018, 0xa08c, 0x0020, 0x0040, 0x3f78, 0xc0ac,
++	0x2008, 0xa084, 0xfff0, 0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae,
++	0x6612, 0x78a4, 0xa084, 0xfff0, 0xa18c, 0x000f, 0xa105, 0xc0f4,
++	0xa39c, 0x0020, 0x0040, 0x3f8e, 0xa085, 0x4000, 0xc0fc, 0xd0b4,
++	0x00c0, 0x3f93, 0xc0fd, 0x78a6, 0x6016, 0x788a, 0xa6b4, 0x000f,
++	0x8637, 0x8204, 0x8004, 0xa084, 0x00ff, 0xa605, 0x600e, 0x6004,
++	0xa084, 0xfff5, 0x6006, 0x0c7f, 0x007c, 0x0c7e, 0x7058, 0x2060,
++	0x6018, 0x789a, 0x78a4, 0xa084, 0xfff0, 0x78a6, 0x6012, 0x7884,
++	0xa084, 0xfff0, 0x7886, 0x600c, 0xa084, 0x00ff, 0x600e, 0x0c7f,
++	0x007c, 0xa282, 0x0002, 0x00c0, 0x40b7, 0x7aa8, 0x6920, 0xc1bd,
++	0x6922, 0xd1cc, 0x0040, 0x3ff4, 0xc1cc, 0x6922, 0xa294, 0x00ff,
++	0xa282, 0x0002, 0x00c8, 0x40b7, 0x1078, 0x4044, 0x1078, 0x3fa5,
++	0xa980, 0x0001, 0x200c, 0x1078, 0x41fa, 0x1078, 0x3ef5, 0x88ff,
++	0x0040, 0x3fea, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695,
++	0x7e5a, 0xd6d4, 0x00c0, 0x3fe7, 0x781b, 0x0064, 0x007c, 0x781b,
++	0x0078, 0x007c, 0x7e58, 0xd6d4, 0x00c0, 0x3ff1, 0x781b, 0x0067,
++	0x007c, 0x781b, 0x0079, 0x007c, 0xa282, 0x0002, 0x00c8, 0x3ffc,
++	0xa284, 0x0001, 0x0040, 0x4005, 0x7158, 0xa188, 0x0000, 0x210c,
++	0xd1ec, 0x00c0, 0x4005, 0x2011, 0x0000, 0x1078, 0x412c, 0x1078,
++	0x4044, 0x1078, 0x3fa5, 0x7858, 0xc095, 0x785a, 0x781b, 0x0078,
++	0x007c, 0x0c7e, 0x027e, 0x2960, 0x6000, 0x2011, 0x0001, 0xd0ec,
++	0x00c0, 0x4025, 0xa084, 0x0080, 0x00c0, 0x4023, 0xc1a4, 0x6106,
++	0xa006, 0x0078, 0x4041, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab,
++	0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x70d4, 0xd0b4,
++	0x0040, 0x403d, 0xc0b4, 0x70d6, 0x70b8, 0xa065, 0x6008, 0xa084,
++	0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x6820, 0xa085, 0x0200,
++	0x6822, 0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x7058, 0x2060, 0x82ff,
++	0x0040, 0x404c, 0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a,
++	0x78a4, 0xa084, 0xffbf, 0xa205, 0xc0fc, 0xd0b4, 0x00c0, 0x4059,
++	0xc0fd, 0x78a6, 0x6016, 0x788a, 0x6004, 0xc0a4, 0x6006, 0x0c7f,
++	0x007c, 0x007e, 0x7000, 0xa086, 0x0003, 0x0040, 0x406a, 0x007f,
++	0x0078, 0x406d, 0x007f, 0x0078, 0x40b4, 0xd6ac, 0x0040, 0x40b4,
++	0x7888, 0xa084, 0x0040, 0x0040, 0x40b4, 0x7bb8, 0xa384, 0x003f,
++	0x831b, 0x00c8, 0x407c, 0x8000, 0xa005, 0x0040, 0x4091, 0x831b,
++	0x00c8, 0x4085, 0x8001, 0x0040, 0x40b1, 0xd6f4, 0x0040, 0x4091,
++	0x78b8, 0x801b, 0x00c8, 0x408d, 0x8000, 0xa084, 0x003f, 0x00c0,
++	0x40b1, 0xc6f4, 0x7e5a, 0x79d8, 0x7adc, 0x2001, 0x0001, 0xa108,
++	0x00c8, 0x409c, 0xa291, 0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade,
++	0x1078, 0x49c3, 0x781b, 0x0076, 0xb284, 0x0300, 0x0040, 0x40ac,
++	0x2001, 0x0000, 0x0078, 0x40ae, 0x2001, 0x0001, 0x1078, 0x484b,
++	0x007c, 0x781b, 0x0076, 0x007c, 0x781b, 0x0079, 0x007c, 0x1078,
++	0x40df, 0x781b, 0x0078, 0x007c, 0x1078, 0x40c8, 0x781b, 0x0078,
++	0x007c, 0x6827, 0x0002, 0x1078, 0x40d0, 0x781b, 0x0078, 0x007c,
++	0x2001, 0x0005, 0x0078, 0x40e1, 0x2001, 0x000c, 0x0078, 0x40e1,
++	0x6820, 0xc0d5, 0x6822, 0x2001, 0x0006, 0x0078, 0x40e1, 0x2001,
++	0x000d, 0x0078, 0x40e1, 0x2001, 0x0009, 0x0078, 0x40e1, 0x2001,
++	0x0007, 0x789b, 0x007e, 0x78aa, 0xc69d, 0x7e5a, 0x70d4, 0xd0b4,
++	0x0040, 0x40f7, 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008,
++	0xa084, 0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f, 0x007c,
++	0x077e, 0x873f, 0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0x017e,
++	0xb28c, 0x0300, 0x0040, 0x4108, 0xa0e0, 0x52c0, 0x0078, 0x410a,
++	0xa0e0, 0x5340, 0x017f, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184,
++	0x000f, 0x0040, 0x411a, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004,
++	0xc09d, 0x6006, 0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040,
++	0x0040, 0x412a, 0xa184, 0xffbf, 0xc0fd, 0x78a6, 0x6016, 0x6004,
++	0xc0a5, 0x6006, 0x077f, 0x007c, 0x789b, 0x0010, 0x78ab, 0x0001,
++	0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab,
++	0x0004, 0x70d4, 0xd0b4, 0x0040, 0x414a, 0xc0b4, 0x70d6, 0x0c7e,
++	0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001,
++	0x601a, 0x0c7f, 0x007c, 0x2031, 0x0000, 0x2029, 0x0032, 0x789b,
++	0x0010, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa,
++	0x7eaa, 0x789b, 0x0060, 0x78ab, 0x0005, 0x70d4, 0xd0b4, 0x0040,
++	0x416e, 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084,
++	0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f, 0x007c, 0x157e,
++	0x8007, 0xa084, 0x00ff, 0x8003, 0x8003, 0xa080, 0x0020, 0x789a,
++	0x79a4, 0xa18c, 0xfff0, 0x2021, 0x41e3, 0x2019, 0x0011, 0x20a9,
++	0x000e, 0x2011, 0x0032, 0x2404, 0xa084, 0xfff0, 0xa106, 0x0040,
++	0x418e, 0x8420, 0x2300, 0xa210, 0x00f0, 0x4183, 0x157f, 0x007c,
++	0x157e, 0x2001, 0x4e05, 0x2004, 0xd0e4, 0x00c0, 0x41c1, 0x2021,
++	0x41f1, 0x20a9, 0x0009, 0x2011, 0x0028, 0xa582, 0x0019, 0x0040,
++	0x41d7, 0x0048, 0x41d7, 0x8420, 0x95a9, 0x2011, 0x0032, 0xa582,
++	0x0032, 0x0040, 0x41d7, 0x0048, 0x41d7, 0x8420, 0x95a9, 0x2019,
++	0x000a, 0x2011, 0x0064, 0x2200, 0xa502, 0x0040, 0x41d7, 0x0048,
++	0x41d7, 0x8420, 0x2300, 0xa210, 0x00f0, 0x41b3, 0x157f, 0x0078,
++	0x41d5, 0x2021, 0x41e3, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011,
++	0x0032, 0x2200, 0xa502, 0x0040, 0x41d7, 0x0048, 0x41d7, 0x8420,
++	0x2300, 0xa210, 0x00f0, 0x41c9, 0x157f, 0xa006, 0x007c, 0x157f,
++	0xa582, 0x0064, 0x00c8, 0x41e0, 0x7808, 0xa085, 0x0070, 0x780a,
++	0x2404, 0xa005, 0x007c, 0x1209, 0x3002, 0x3202, 0x4203, 0x4403,
++	0x5404, 0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07, 0x0c07,
++	0x0e07, 0x10e1, 0x330a, 0x5805, 0x5a05, 0x6a06, 0x6c06, 0x7c07,
++	0x7e07, 0x0e00, 0x789b, 0x0010, 0xa046, 0x007c, 0xa784, 0x0f00,
++	0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105,
++	0xd7fc, 0x0040, 0x420f, 0xa0e0, 0x73c0, 0x0078, 0x4211, 0xa0e0,
++	0x53c0, 0x007c, 0x0e7e, 0x0f7e, 0xd084, 0x0040, 0x421f, 0x2079,
++	0x0100, 0x2009, 0x4e80, 0x2071, 0x4e80, 0x0078, 0x422f, 0x2009,
++	0x4e40, 0x2071, 0x4e40, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x0040,
++	0x422d, 0x2079, 0x0100, 0x0078, 0x422f, 0x2079, 0x0200, 0x2091,
++	0x8000, 0x2104, 0xa084, 0x000f, 0x0079, 0x4236, 0x4240, 0x4240,
++	0x4240, 0x4240, 0x4240, 0x4240, 0x423e, 0x423e, 0x1078, 0x296b,
++	0x69b4, 0xc1f5, 0xa18c, 0xff9f, 0x69b6, 0xa005, 0x0040, 0x428f,
++	0x7858, 0xa084, 0xff9f, 0xa085, 0x6000, 0x785a, 0x7828, 0xa086,
++	0x1814, 0x00c0, 0x428f, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004,
++	0x00c0, 0x4255, 0x784b, 0x0008, 0x7848, 0xa084, 0x0008, 0x00c0,
++	0x425c, 0x7830, 0xd0bc, 0x00c0, 0x428f, 0x007e, 0x2001, 0x4e04,
++	0x2004, 0xd0ec, 0x007f, 0x0040, 0x4271, 0xb284, 0x0300, 0x0078,
++	0x4273, 0xb284, 0x0400, 0x0040, 0x4279, 0x0018, 0x428f, 0x0078,
++	0x427b, 0x0028, 0x428f, 0x79e4, 0xa184, 0x0030, 0x0040, 0x428f,
++	0x78ec, 0xa084, 0x0003, 0x0040, 0x428f, 0x681c, 0xd0ac, 0x00c0,
++	0x428d, 0x1078, 0x4319, 0x0078, 0x428f, 0x781b, 0x00f9, 0x0f7f,
++	0x0e7f, 0x007c, 0x0c7e, 0x2001, 0x4e01, 0x2004, 0xd0ac, 0x00c0,
++	0x430b, 0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++	0xb28c, 0x0300, 0x0040, 0x42a8, 0xa0e0, 0x52c0, 0x0078, 0x42aa,
++	0xa0e0, 0x5340, 0x6004, 0xa084, 0x000a, 0x00c0, 0x430b, 0x6108,
++	0xa194, 0xff00, 0x0040, 0x430b, 0xa18c, 0x00ff, 0x2001, 0x000a,
++	0xa106, 0x0040, 0x42d6, 0x2001, 0x000c, 0xa106, 0x0040, 0x42da,
++	0x2001, 0x0012, 0xa106, 0x0040, 0x42de, 0x2001, 0x0014, 0xa106,
++	0x0040, 0x42e2, 0x2001, 0x0019, 0xa106, 0x0040, 0x42e6, 0x2001,
++	0x0032, 0xa106, 0x0040, 0x42ea, 0x0078, 0x42ee, 0x2009, 0x000c,
++	0x0078, 0x42f0, 0x2009, 0x0012, 0x0078, 0x42f0, 0x2009, 0x0014,
++	0x0078, 0x42f0, 0x2009, 0x0019, 0x0078, 0x42f0, 0x2009, 0x0020,
++	0x0078, 0x42f0, 0x2009, 0x003f, 0x0078, 0x42f0, 0x2011, 0x0000,
++	0x2100, 0xa205, 0x600a, 0x6004, 0xa085, 0x0002, 0x6006, 0x2061,
++	0x4e00, 0x6004, 0xd0bc, 0x0040, 0x430b, 0x6814, 0xd0fc, 0x00c0,
++	0x4306, 0x60ea, 0x2061, 0x4e40, 0x0078, 0x4309, 0x60ee, 0x2061,
++	0x4e80, 0x601f, 0x800f, 0x0c7f, 0x007c, 0x781b, 0x0079, 0x007c,
++	0x781b, 0x0078, 0x007c, 0x781b, 0x0067, 0x007c, 0x781b, 0x0064,
++	0x007c, 0x2009, 0x4e19, 0x210c, 0xa186, 0x0000, 0x0040, 0x432b,
++	0xa186, 0x0001, 0x0040, 0x432e, 0x701f, 0x000b, 0x7067, 0x0001,
++	0x781b, 0x0047, 0x007c, 0x781b, 0x00f0, 0x007c, 0x701f, 0x000a,
++	0x007c, 0x2009, 0x4e19, 0x210c, 0xa186, 0x0000, 0x0040, 0x4346,
++	0xa186, 0x0001, 0x0040, 0x4343, 0x701f, 0x000b, 0x7067, 0x0001,
++	0x781b, 0x0047, 0x007c, 0x701f, 0x000a, 0x007c, 0x781b, 0x00ef,
++	0x007c, 0x781b, 0x00f9, 0x007c, 0x781b, 0x00f8, 0x007c, 0x781b,
++	0x00c9, 0x007c, 0x781b, 0x00c8, 0x007c, 0x6818, 0xd0fc, 0x0040,
++	0x435b, 0x681b, 0x001d, 0x7067, 0x0001, 0x781b, 0x0047, 0x007c,
++	0x7830, 0xa084, 0x00c0, 0x00c0, 0x4382, 0x7808, 0xc08c, 0x780a,
++	0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x00c0,
++	0x437f, 0x2001, 0x4e05, 0x2004, 0xd0e4, 0x00c0, 0x437d, 0x7804,
++	0xa084, 0xff1f, 0xa085, 0x00e0, 0x7806, 0xa006, 0x007c, 0x7808,
++	0xc08d, 0x780a, 0x007c, 0x7808, 0xc08d, 0x780a, 0x007c, 0x7830,
++	0xa084, 0x0040, 0x00c0, 0x4387, 0x2001, 0x4e04, 0x2004, 0xd0ec,
++	0x0040, 0x4396, 0xb284, 0x0300, 0x0078, 0x4398, 0xb284, 0x0400,
++	0x0040, 0x439e, 0x0098, 0x43a2, 0x0078, 0x43a0, 0x00a8, 0x43a2,
++	0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0005, 0x0005,
++	0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, 0x43c5, 0x007e,
++	0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x43bb, 0xb284,
++	0x0300, 0x0078, 0x43bd, 0xb284, 0x0400, 0x0040, 0x43c3, 0x0098,
++	0x43bf, 0x0078, 0x43c5, 0x00a8, 0x43c3, 0x78ac, 0x007e, 0x7808,
++	0xa085, 0x0002, 0x780a, 0x007f, 0x007c, 0xa784, 0x0001, 0x00c0,
++	0x3770, 0xa784, 0x0070, 0x0040, 0x43dd, 0x0c7e, 0x2d60, 0x2f68,
++	0x1078, 0x28df, 0x2d78, 0x2c68, 0x0c7f, 0xa784, 0x0008, 0x0040,
++	0x43ea, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x3770,
++	0x0078, 0x430d, 0xa784, 0x0004, 0x0040, 0x4419, 0x78b8, 0xa084,
++	0x4001, 0x0040, 0x4419, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003,
++	0x0040, 0x3770, 0x78e4, 0xa084, 0x0007, 0xa086, 0x0001, 0x00c0,
++	0x4419, 0x78c0, 0xa685, 0x4800, 0x2030, 0x7e5a, 0x781b, 0x00f9,
++	0x007c, 0x784b, 0x0008, 0x6818, 0xd0fc, 0x0040, 0x4416, 0x681b,
++	0x0015, 0xd6f4, 0x0040, 0x4416, 0x681b, 0x0007, 0x1078, 0x4319,
++	0x007c, 0x681b, 0x0003, 0x7858, 0xa084, 0x3f00, 0x681e, 0x682f,
++	0x0000, 0x6833, 0x0000, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003,
++	0x0040, 0x3066, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f,
++	0x0040, 0x4436, 0xb284, 0x0300, 0x0078, 0x4438, 0xb284, 0x0400,
++	0x0040, 0x443e, 0x0018, 0x29c1, 0x0078, 0x4440, 0x0028, 0x29c1,
++	0x0078, 0x40bc, 0x6b14, 0x8307, 0xa084, 0x000f, 0x8003, 0x8003,
++	0x8003, 0xd3fc, 0x0040, 0x4450, 0xa080, 0x5340, 0x0078, 0x4452,
++	0xa080, 0x52c0, 0x2060, 0x2048, 0x705a, 0x2a60, 0x007c, 0x0020,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0062, 0x0009, 0x0014, 0x0014, 0x9848, 0x0014, 0x0014,
++	0x9914, 0x98fd, 0x0014, 0x0014, 0x0080, 0x00ff, 0x0100, 0x0402,
++	0x2008, 0xf880, 0x0018, 0xa20a, 0x0014, 0x300b, 0xa20c, 0x0014,
++	0x2500, 0x0013, 0x2500, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
++	0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
++	0x0010, 0xa200, 0x3806, 0x7102, 0x805f, 0x9481, 0x8839, 0x20c4,
++	0x0864, 0xa856, 0x3008, 0x28c1, 0x9d1b, 0xa201, 0x300c, 0x2847,
++	0x8161, 0x846a, 0x8000, 0x84a4, 0x1856, 0x883a, 0xa808, 0x28e2,
++	0x9ccb, 0xa8f3, 0x0864, 0xa844, 0x300c, 0xa801, 0x3008, 0x28e1,
++	0x9ccb, 0x2021, 0xa81d, 0xa205, 0x870c, 0xd8de, 0x64a0, 0x6de0,
++	0x6fc0, 0x63a4, 0x6c80, 0x0212, 0xa205, 0x883d, 0x7942, 0x8020,
++	0xa4a1, 0x882b, 0x1814, 0x883b, 0x80df, 0x94a1, 0x7027, 0x85f2,
++	0xa737, 0xa532, 0xf003, 0x8576, 0x8677, 0xa816, 0x883e, 0xa814,
++	0x2001, 0xa812, 0xa204, 0x64c0, 0x6de0, 0x67a0, 0x6fc0, 0x7942,
++	0x8020, 0xa4a1, 0x1814, 0x80df, 0x94a1, 0x883b, 0x7023, 0x8576,
++	0x8677, 0xa802, 0x7861, 0x883e, 0x206b, 0x28c1, 0x9d1b, 0x2044,
++	0x2103, 0x20a2, 0x2081, 0xa8c3, 0xa207, 0x0904, 0xa20e, 0xa809,
++	0xa203, 0x8000, 0x85a4, 0x1872, 0x879a, 0x883c, 0x1fe2, 0xf601,
++	0xa208, 0x856e, 0x866f, 0x7161, 0x0014, 0x0704, 0x3008, 0x9ccb,
++	0x0014, 0xa202, 0x8000, 0x85a4, 0x3009, 0x84a8, 0x19e2, 0xf844,
++	0x856e, 0x883f, 0x08e6, 0xa8f5, 0xf861, 0xa8ea, 0xf801, 0x0014,
++	0xf881, 0x0016, 0x85b2, 0x80f0, 0x9532, 0xfaa2, 0x1de2, 0x0014,
++	0x8532, 0xf221, 0x0014, 0x1de2, 0x84a8, 0xd6e0, 0x1fe6, 0x0014,
++	0x3008, 0x8000, 0x284a, 0x1011, 0xa8fc, 0x3008, 0x9d33, 0x8000,
++	0xa000, 0x2802, 0x1011, 0xa8fd, 0x9d39, 0xa8bd, 0x3008, 0x9d33,
++	0x283b, 0x1011, 0xa8fd, 0xa209, 0x7102, 0x805f, 0x9481, 0x0017,
++	0x300c, 0xa209, 0x8000, 0x85a4, 0x1de2, 0xa209, 0xdac1, 0x0014,
++	0x0210, 0xa801, 0x0014, 0x26e0, 0x873a, 0xfaa3, 0x19f2, 0x26e0,
++	0x18f2, 0x0014, 0xa20b, 0x0014, 0xa20d, 0x3806, 0x0210, 0x9d25,
++	0x0704, 0xa206, 0x6865, 0x817e, 0x842a, 0x1dc1, 0x8823, 0x0016,
++	0x6042, 0x8008, 0xa8fa, 0x8000, 0x84a4, 0x8160, 0x842a, 0xf021,
++	0x3008, 0x84a8, 0x11d6, 0x7042, 0x20dd, 0x0011, 0x20d4, 0x8822,
++	0x0016, 0x7944, 0x8421, 0xa020, 0xa532, 0x84a1, 0x0016, 0x7944,
++	0x8421, 0xa0df, 0x9532, 0x84a1, 0x0016, 0x0000, 0x127e, 0x70d4,
++	0xa084, 0x4600, 0x8004, 0x2090, 0x7204, 0x7008, 0xc09c, 0xa205,
++	0x00c0, 0x45a2, 0x720c, 0x82ff, 0x0040, 0x459d, 0x8aff, 0x00c0,
++	0x45a2, 0x7200, 0xd284, 0x00c0, 0x45a2, 0x7003, 0x0008, 0x127f,
++	0x2000, 0x007c, 0x7000, 0xa084, 0x0003, 0x7002, 0xc69c, 0xd084,
++	0x0040, 0x45e5, 0x7108, 0x0005, 0x7008, 0xa106, 0x00c0, 0x45aa,
++	0xa184, 0x0003, 0x0040, 0x4616, 0xa184, 0x01e0, 0x00c0, 0x4616,
++	0xd1f4, 0x00c0, 0x45aa, 0xa184, 0x3000, 0xa086, 0x1000, 0x0040,
++	0x45aa, 0x2011, 0x0180, 0x710c, 0x8211, 0x0040, 0x45cf, 0x7008,
++	0xd0f4, 0x00c0, 0x45aa, 0x700c, 0xa106, 0x0040, 0x45c4, 0x7007,
++	0x0012, 0x7108, 0x0005, 0x7008, 0xa106, 0x00c0, 0x45d1, 0xa184,
++	0x0003, 0x0040, 0x4616, 0xd194, 0x0040, 0x45d1, 0xd1f4, 0x0040,
++	0x4616, 0x7007, 0x0002, 0x0078, 0x45aa, 0x7108, 0xd1fc, 0x0040,
++	0x45f0, 0x1078, 0x4769, 0x8aff, 0x0040, 0x458c, 0x0078, 0x45e5,
++	0x700c, 0xa08c, 0x03ff, 0x0040, 0x461b, 0x7004, 0xd084, 0x0040,
++	0x460d, 0x7014, 0xa005, 0x00c0, 0x4609, 0x7010, 0x7310, 0xa306,
++	0x00c0, 0x45fd, 0x2300, 0xa005, 0x0040, 0x460d, 0xa102, 0x00c8,
++	0x45e5, 0x7007, 0x0010, 0x0078, 0x4616, 0x8aff, 0x0040, 0x461b,
++	0x1078, 0x4970, 0x00c0, 0x4610, 0x0040, 0x45e5, 0x1078, 0x46b4,
++	0x127f, 0x2000, 0x007c, 0x7204, 0x7108, 0xc19c, 0x8103, 0x00c8,
++	0x462a, 0x7007, 0x0002, 0x0078, 0x461b, 0x7003, 0x0008, 0x127f,
++	0x2000, 0x007c, 0xa205, 0x00c0, 0x4616, 0x7003, 0x0008, 0x127f,
++	0x2000, 0x007c, 0x6428, 0x84ff, 0x0040, 0x465e, 0x2c70, 0x7004,
++	0xa0bc, 0x000f, 0xa7b8, 0x466e, 0x273c, 0x87fb, 0x00c0, 0x464c,
++	0x0048, 0x4644, 0x1078, 0x296b, 0x609c, 0xa075, 0x0040, 0x465e,
++	0x0078, 0x4637, 0x2039, 0x4663, 0x2704, 0xae68, 0x6808, 0xa630,
++	0x680c, 0xa529, 0x8421, 0x0040, 0x465e, 0x8738, 0x2704, 0xa005,
++	0x00c0, 0x464d, 0x709c, 0xa075, 0x00c0, 0x4637, 0x007c, 0x0000,
++	0x0005, 0x0009, 0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000,
++	0x0003, 0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x4663,
++	0x4660, 0x0000, 0x0000, 0x8000, 0x0000, 0x4663, 0x0000, 0x466b,
++	0x4668, 0x0000, 0x0000, 0x0000, 0x0000, 0x466b, 0x0000, 0x4666,
++	0x4666, 0x0000, 0x0000, 0x8000, 0x0000, 0x4666, 0x0000, 0x466c,
++	0x466c, 0x0000, 0x0000, 0x0000, 0x0000, 0x466c, 0x2079, 0x4e00,
++	0x2071, 0x0010, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0001,
++	0x7810, 0xd0ec, 0x0040, 0x46a2, 0x2009, 0x0001, 0x2071, 0x0020,
++	0x0078, 0x46a6, 0x2009, 0x0002, 0x2071, 0x0050, 0x7007, 0x000a,
++	0x7007, 0x0002, 0x7003, 0x0000, 0x8109, 0x0040, 0x46b3, 0x2071,
++	0x0020, 0x0078, 0x46a6, 0x007c, 0x7004, 0x8004, 0x00c8, 0x473d,
++	0x7108, 0x7008, 0xa106, 0x00c0, 0x46b8, 0xa184, 0x01e0, 0x0040,
++	0x46c5, 0x1078, 0x47ac, 0x0078, 0x4765, 0x7007, 0x0012, 0x2019,
++	0x0000, 0x7108, 0x7008, 0xa106, 0x00c0, 0x46c9, 0xa184, 0x01e0,
++	0x0040, 0x46d6, 0x1078, 0x47ac, 0x0078, 0x4765, 0x7810, 0xd0ec,
++	0x0040, 0x46f0, 0x2001, 0x04fd, 0x2004, 0xa086, 0x0003, 0x00c0,
++	0x46f4, 0xa184, 0x4000, 0x0040, 0x46f8, 0xa382, 0x0003, 0x00c8,
++	0x46f8, 0xa184, 0x0004, 0x0040, 0x46c9, 0x8318, 0x0078, 0x46c9,
++	0x7814, 0xd0ec, 0x00c0, 0x46f8, 0xa184, 0x4000, 0x00c0, 0x46c9,
++	0xa19c, 0x300c, 0xa386, 0x2004, 0x0040, 0x4715, 0xa386, 0x0008,
++	0x0040, 0x4720, 0x7004, 0xd084, 0x00c0, 0x4711, 0x7108, 0x7008,
++	0xa106, 0x00c0, 0x4706, 0xa184, 0x0003, 0x0040, 0x4711, 0x0078,
++	0x47ac, 0xa386, 0x200c, 0x00c0, 0x46c9, 0x7200, 0x8204, 0x0048,
++	0x4720, 0x730c, 0xa384, 0x03ff, 0x0040, 0x4720, 0x1078, 0x296b,
++	0x7108, 0x7008, 0xa106, 0x00c0, 0x4720, 0xa184, 0x01e0, 0x0040,
++	0x472d, 0x1078, 0x47ac, 0x0078, 0x4765, 0x7007, 0x0012, 0x7000,
++	0xd084, 0x00c0, 0x473d, 0x7310, 0x7014, 0xa305, 0x0040, 0x473d,
++	0x710c, 0xa184, 0x03ff, 0x00c0, 0x46b4, 0x7108, 0x7008, 0xa106,
++	0x00c0, 0x473d, 0xa184, 0x01e0, 0x0040, 0x474a, 0x1078, 0x47ac,
++	0x0078, 0x4765, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xd09c,
++	0x00c0, 0x474e, 0x7108, 0x7008, 0xa106, 0x00c0, 0x4752, 0xa184,
++	0x01e0, 0x0040, 0x475f, 0x1078, 0x47ac, 0x0078, 0x4765, 0x7007,
++	0x0012, 0x7108, 0x8103, 0x0048, 0x4752, 0x7003, 0x0008, 0x007c,
++	0x7108, 0xa184, 0x01e0, 0x00c0, 0x47ac, 0x7108, 0xa184, 0x01e0,
++	0x00c0, 0x47ac, 0xa184, 0x0007, 0x0079, 0x4776, 0x4780, 0x4790,
++	0x477e, 0x4790, 0x477e, 0x47ee, 0x477e, 0x47ec, 0x1078, 0x296b,
++	0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x8aff, 0x00c0, 0x478b,
++	0x2049, 0x0000, 0x007c, 0x1078, 0x4970, 0x00c0, 0x478b, 0x007c,
++	0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x7004, 0xd084, 0x00c0,
++	0x47a4, 0x7108, 0x7008, 0xa106, 0x00c0, 0x4799, 0xa184, 0x0003,
++	0x0040, 0x47a4, 0x0078, 0x47ac, 0x8aff, 0x0040, 0x47ab, 0x1078,
++	0x4970, 0x00c0, 0x47a7, 0x007c, 0x7007, 0x0012, 0x7108, 0x00e0,
++	0x47af, 0x2091, 0x6000, 0x00e0, 0x47b3, 0x2091, 0x6000, 0x7007,
++	0x0012, 0x7007, 0x0008, 0x7004, 0xd09c, 0x00c0, 0x47bb, 0x7007,
++	0x0012, 0x7108, 0xd1fc, 0x00c0, 0x47bf, 0x7003, 0x0000, 0x7000,
++	0xa005, 0x00c0, 0x47d3, 0x7004, 0xa005, 0x00c0, 0x47d3, 0x700c,
++	0xa005, 0x0040, 0x47d5, 0x0078, 0x47b7, 0x2049, 0x0000, 0xb284,
++	0x0100, 0x0040, 0x47df, 0x2001, 0x0000, 0x0078, 0x47e1, 0x2001,
++	0x0001, 0x1078, 0x4212, 0x681b, 0x0002, 0x2051, 0x0000, 0x007c,
++	0x1078, 0x296b, 0x1078, 0x296b, 0x1078, 0x4836, 0x7210, 0x7114,
++	0x700c, 0xa09c, 0x03ff, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000,
++	0x1078, 0x4836, 0x2704, 0x2c58, 0xac60, 0x6308, 0x2200, 0xa322,
++	0x630c, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0040, 0x4811, 0x00c8,
++	0x4811, 0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078,
++	0x47f8, 0x2b60, 0x8a07, 0x007e, 0x6004, 0xa084, 0x0008, 0x0040,
++	0x481d, 0xa7ba, 0x4668, 0x0078, 0x481f, 0xa7ba, 0x4660, 0x007f,
++	0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92, 0x6b8e, 0x7108, 0x7008,
++	0xa106, 0x00c0, 0x4826, 0xa184, 0x01e0, 0x0040, 0x4831, 0x1078,
++	0x47ac, 0x7007, 0x0012, 0x1078, 0x46b4, 0x007c, 0x8a50, 0x8739,
++	0x2704, 0xa004, 0x00c0, 0x484a, 0x6000, 0xa064, 0x00c0, 0x4841,
++	0x2d60, 0x6004, 0xa084, 0x000f, 0xa080, 0x467e, 0x203c, 0x87fb,
++	0x1040, 0x296b, 0x007c, 0x127e, 0x0d7e, 0x70d4, 0xa084, 0x4600,
++	0x8004, 0x2090, 0x0d7f, 0x6884, 0x2060, 0x6888, 0x6b8c, 0x6c90,
++	0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0x007e, 0x6804, 0xa084,
++	0x0008, 0x007f, 0x0040, 0x4868, 0xa0b8, 0x4668, 0x0078, 0x486a,
++	0xa0b8, 0x4660, 0xb284, 0x0100, 0x0040, 0x4871, 0x7e20, 0x0078,
++	0x4872, 0x7e24, 0xa6b5, 0x000c, 0x681c, 0xd0b4, 0x0040, 0x4879,
++	0xc685, 0x2400, 0xa305, 0x0040, 0x48a3, 0x2c58, 0x2704, 0x6104,
++	0xac60, 0x6000, 0xa400, 0x701a, 0x6004, 0xa301, 0x701e, 0xa184,
++	0x0008, 0x0040, 0x4893, 0x6010, 0xa081, 0x0000, 0x7022, 0x6014,
++	0xa081, 0x0000, 0x7026, 0x6208, 0x2400, 0xa202, 0x7012, 0x620c,
++	0x2300, 0xa203, 0x7016, 0x7602, 0x7007, 0x0001, 0x2b60, 0x1078,
++	0x499b, 0x0078, 0x48a5, 0x1078, 0x4970, 0x00c0, 0x48a3, 0x127f,
++	0x2000, 0x007c, 0x127e, 0x0d7e, 0x70d4, 0xa084, 0x4600, 0x8004,
++	0x2090, 0x0d7f, 0x7007, 0x0004, 0x7004, 0xd094, 0x00c0, 0x48b4,
++	0x7003, 0x0008, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x70d4,
++	0xa084, 0x4600, 0x8004, 0x007e, 0x2090, 0x007f, 0x0d7f, 0x7e20,
++	0xb284, 0x0100, 0x00c0, 0x48cd, 0x7e24, 0xa6b5, 0x000c, 0x681c,
++	0xd0ac, 0x00c0, 0x48d8, 0xc685, 0x7003, 0x0000, 0x7007, 0x0004,
++	0x6828, 0x2050, 0x2d60, 0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x466e,
++	0x273c, 0x87fb, 0x00c0, 0x48ee, 0x0048, 0x48e8, 0x1078, 0x296b,
++	0x689c, 0xa065, 0x0040, 0x48f2, 0x0078, 0x48db, 0x1078, 0x4970,
++	0x00c0, 0x48ee, 0x127f, 0x2000, 0x007c, 0x127e, 0x007e, 0x017e,
++	0x0d7e, 0x70d4, 0xa084, 0x4600, 0x8004, 0x007e, 0x2090, 0x007f,
++	0x7e20, 0xb284, 0x0100, 0x00c0, 0x4906, 0x7e24, 0x0d7f, 0x037f,
++	0x047f, 0xa6b5, 0x000c, 0x681c, 0xd0b4, 0x0040, 0x4914, 0xc685,
++	0x7003, 0x0000, 0x7007, 0x0004, 0x2049, 0x48f5, 0x6828, 0xa055,
++	0x0d7e, 0x0040, 0x496c, 0x2d70, 0x2e60, 0x7004, 0xa0bc, 0x000f,
++	0xa7b8, 0x466e, 0x273c, 0x87fb, 0x00c0, 0x4931, 0x0048, 0x492a,
++	0x1078, 0x296b, 0x709c, 0xa075, 0x2060, 0x0040, 0x496c, 0x0078,
++	0x491d, 0x2704, 0xae68, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0048,
++	0x494a, 0x8a51, 0x00c0, 0x493e, 0x1078, 0x296b, 0x8738, 0x2704,
++	0xa005, 0x00c0, 0x4932, 0x709c, 0xa075, 0x2060, 0x0040, 0x496c,
++	0x0078, 0x491d, 0x8422, 0x8420, 0x831a, 0xa399, 0x0000, 0x6908,
++	0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x00c8, 0x4959, 0x1078,
++	0x296b, 0xb284, 0x0100, 0x0040, 0x4967, 0x2001, 0x4e04, 0x2004,
++	0xd0ec, 0x00c0, 0x4967, 0x2071, 0x0050, 0x0078, 0x4969, 0x2071,
++	0x0020, 0x0d7f, 0x0078, 0x4879, 0x0d7f, 0x127f, 0x2000, 0x007c,
++	0x7008, 0x007e, 0xa084, 0x01e0, 0x007f, 0x0040, 0x4979, 0xa006,
++	0x007c, 0xa084, 0x0003, 0xa086, 0x0003, 0x00c0, 0x4980, 0x007c,
++	0x2704, 0xac78, 0x7800, 0x701a, 0x7804, 0x701e, 0x7808, 0x7012,
++	0x780c, 0x7016, 0x6004, 0xa084, 0x0008, 0x0040, 0x4993, 0x7810,
++	0x7022, 0x7814, 0x7026, 0x7602, 0x7004, 0xa084, 0x0010, 0xc085,
++	0x7006, 0x2079, 0x4e00, 0x8a51, 0x0040, 0x49bf, 0x8738, 0x2704,
++	0xa005, 0x00c0, 0x49b1, 0x609c, 0xa005, 0x0040, 0x49c0, 0x2060,
++	0x6004, 0xa084, 0x000f, 0xa080, 0x466e, 0x203c, 0x87fb, 0x1040,
++	0x296b, 0x7008, 0x007e, 0xa084, 0x01e0, 0x007f, 0x0040, 0x49bb,
++	0xa006, 0x0078, 0x49c0, 0xa084, 0x0003, 0xa086, 0x0003, 0x007c,
++	0x2051, 0x0000, 0x007c, 0x127e, 0x007e, 0x0d7e, 0x70d4, 0xa084,
++	0x4600, 0x8004, 0x2090, 0x0d7f, 0x087f, 0x7108, 0xa184, 0x0003,
++	0x00c0, 0x49d8, 0x6828, 0xa005, 0x0040, 0x49e8, 0x0078, 0x45a2,
++	0x7108, 0xd1fc, 0x0040, 0x49e0, 0x1078, 0x4769, 0x0078, 0x49cd,
++	0x7007, 0x0010, 0x7108, 0xd1fc, 0x0040, 0x49e2, 0x1078, 0x4769,
++	0x7008, 0xa086, 0x0008, 0x00c0, 0x49cd, 0x7000, 0xa005, 0x00c0,
++	0x49cd, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000, 0x007c,
++	0x127e, 0x147e, 0x137e, 0x157e, 0x0c7e, 0x0d7e, 0x70d4, 0xa084,
++	0x4600, 0x8004, 0x2090, 0x0d7f, 0x2049, 0x49f8, 0xad80, 0x0011,
++	0x20a0, 0xb284, 0x0100, 0x0040, 0x4a1b, 0x2001, 0x4e04, 0x2004,
++	0xd0ec, 0x0040, 0x4a17, 0x2099, 0x0031, 0x0078, 0x4a1d, 0x2099,
++	0x0032, 0x0078, 0x4a1d, 0x2099, 0x0031, 0x700c, 0xa084, 0x03ff,
++	0x682a, 0x7007, 0x0008, 0x7007, 0x0002, 0x7003, 0x0001, 0x0040,
++	0x4a2c, 0x8000, 0x80ac, 0x53a5, 0x700c, 0xa084, 0x03ff, 0x0040,
++	0x4a38, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x4a33,
++	0x0c7f, 0x2049, 0x0000, 0x7003, 0x0000, 0x157f, 0x137f, 0x147f,
++	0x127f, 0x2000, 0x007c, 0x2091, 0x8000, 0x2091, 0x6000, 0x78ac,
++	0xa005, 0x00c0, 0x4a5a, 0x7974, 0x70d0, 0xa106, 0x00c0, 0x4a5a,
++	0x781c, 0xa005, 0x0040, 0x4a5a, 0x781f, 0x0000, 0x0068, 0x4a5a,
++	0x2091, 0x4080, 0x7830, 0x8001, 0x7832, 0x00c0, 0x4ae2, 0x7834,
++	0x7832, 0x7810, 0xd0ec, 0x00c0, 0x4adb, 0x2061, 0x73c0, 0x2069,
++	0x4e80, 0xc7fd, 0x68d0, 0xa005, 0x0040, 0x4a74, 0x8001, 0x68d2,
++	0x00c0, 0x4a74, 0x1078, 0x4cb0, 0x6800, 0xa084, 0x000f, 0x0040,
++	0x4a89, 0xa086, 0x0001, 0x0040, 0x4a89, 0x6844, 0xa00d, 0x0040,
++	0x4a89, 0x2104, 0xa005, 0x0040, 0x4a89, 0x8001, 0x200a, 0x0040,
++	0x4c23, 0x6814, 0xa005, 0x0040, 0x4aae, 0x8001, 0x6816, 0x00c0,
++	0x4aae, 0x68a7, 0x0001, 0x0f7e, 0xd7fc, 0x00c0, 0x4aa3, 0x7810,
++	0xd0ec, 0x0040, 0x4a9f, 0x2079, 0x0100, 0x0078, 0x4aa5, 0x2079,
++	0x0200, 0x0078, 0x4aa5, 0x2079, 0x0100, 0x1078, 0x4383, 0x0f7f,
++	0x6864, 0xa005, 0x0040, 0x4aae, 0x1078, 0x2628, 0x6880, 0xa005,
++	0x0040, 0x4abb, 0x8001, 0x6882, 0x00c0, 0x4abb, 0x6867, 0x0000,
++	0x68d4, 0xc0dd, 0x68d6, 0x68d4, 0xd0fc, 0x0040, 0x4ad8, 0xc0fc,
++	0x68d6, 0x20a9, 0x0200, 0x6034, 0xa005, 0x0040, 0x4ad4, 0x8001,
++	0x6036, 0x68d4, 0xc0fd, 0x68d6, 0x00c0, 0x4ad4, 0x6010, 0xa005,
++	0x0040, 0x4ad4, 0x1078, 0x2628, 0xace0, 0x0010, 0x00f0, 0x4ac3,
++	0xd7fc, 0x0040, 0x4ae2, 0x2061, 0x53c0, 0x2069, 0x4e40, 0xc7fc,
++	0x0078, 0x4a6a, 0x1078, 0x4b1e, 0x7838, 0x8001, 0x783a, 0x00c0,
++	0x4b04, 0x783c, 0x783a, 0x2061, 0x53c0, 0x2069, 0x4e40, 0xc7fc,
++	0x680c, 0xa005, 0x0040, 0x4af6, 0x1078, 0x4b88, 0xd7fc, 0x00c0,
++	0x4b04, 0x7810, 0xd0ec, 0x00c0, 0x4b04, 0x2061, 0x73c0, 0x2069,
++	0x4e80, 0xc7fd, 0x0078, 0x4af0, 0x7814, 0xd0e4, 0x00c0, 0x4b08,
++	0x7810, 0xd0cc, 0x0040, 0x4b1b, 0xd0ac, 0x00c0, 0x4b14, 0xd0a4,
++	0x0040, 0x4b1b, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x0068, 0x4b1a,
++	0x1078, 0x2395, 0x007c, 0x2091, 0x8001, 0x007c, 0x7840, 0x8001,
++	0x7842, 0x00c0, 0x4b87, 0x7844, 0x7842, 0x2069, 0x4e40, 0xc7fc,
++	0x7810, 0x2079, 0x0200, 0xd0ec, 0x0040, 0x4b30, 0x2079, 0x0100,
++	0x68d8, 0xa005, 0x0040, 0x4b3c, 0x7de0, 0xa504, 0x00c0, 0x4b3c,
++	0x68da, 0x68d4, 0xc0bc, 0x68d6, 0x2079, 0x4e00, 0x6810, 0xa005,
++	0x00c0, 0x4b44, 0x2001, 0x0101, 0x8001, 0x6812, 0xd7fc, 0x0040,
++	0x4b4d, 0xa080, 0x94d0, 0x0078, 0x4b4f, 0xa080, 0x93c0, 0x2040,
++	0x2004, 0xa065, 0x0040, 0x4b79, 0x6024, 0xa005, 0x0040, 0x4b75,
++	0x8001, 0x6026, 0x00c0, 0x4b75, 0x6800, 0xa005, 0x0040, 0x4b68,
++	0x684c, 0xac06, 0x00c0, 0x4b68, 0x1078, 0x4c23, 0x0078, 0x4b79,
++	0x6864, 0xa005, 0x0040, 0x4b70, 0x6027, 0x0001, 0x0078, 0x4b75,
++	0x1078, 0x4bd6, 0x2804, 0x0078, 0x4b51, 0x6000, 0x2c40, 0x0078,
++	0x4b51, 0xd7fc, 0x00c0, 0x4b87, 0x7810, 0xd0ec, 0x00c0, 0x4b87,
++	0x2069, 0x4e80, 0xc7fd, 0x2079, 0x0100, 0x0078, 0x4b30, 0x007c,
++	0x2009, 0x0000, 0x20a9, 0x0200, 0x6008, 0xd09c, 0x0040, 0x4bc2,
++	0x6024, 0xa005, 0x0040, 0x4b98, 0x8001, 0x6026, 0x0078, 0x4bc0,
++	0x6008, 0xc09c, 0xd084, 0x00c0, 0x4ba0, 0xd0ac, 0x0040, 0x4bba,
++	0x600a, 0x6004, 0xa005, 0x0040, 0x4bc2, 0x0d7e, 0x0c7e, 0x017e,
++	0x2068, 0x6010, 0x8001, 0x6012, 0x1078, 0x3dd0, 0x2d00, 0x2c68,
++	0x2060, 0x1078, 0x1e5b, 0x1078, 0x201d, 0x017f, 0x0c7f, 0x0d7f,
++	0x0078, 0x4bc2, 0xc0bd, 0x600a, 0xa18d, 0x0001, 0x0078, 0x4bc2,
++	0xa18d, 0x0100, 0xace0, 0x0010, 0x00f0, 0x4b8c, 0xa184, 0x0001,
++	0x0040, 0x4bd1, 0xa18c, 0xfffe, 0x690e, 0x1078, 0x2628, 0x0078,
++	0x4bd2, 0x690e, 0x007c, 0x00c0, 0x4bd2, 0x786c, 0x2c00, 0x687e,
++	0x6714, 0x6f76, 0x6017, 0x0000, 0x602b, 0x0000, 0x601b, 0x0006,
++	0x60b4, 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085,
++	0x0060, 0x6022, 0x6000, 0x2042, 0x1078, 0x1de4, 0x6818, 0xa005,
++	0x0040, 0x4bf4, 0x8001, 0x681a, 0x6808, 0xc0a4, 0x680a, 0x6810,
++	0x7908, 0x8109, 0x790a, 0x8001, 0x00d0, 0x4c00, 0x1078, 0x296b,
++	0x6812, 0x00c0, 0x4c06, 0x7910, 0xc1a5, 0x7912, 0x602f, 0x0000,
++	0x6033, 0x0000, 0x2c68, 0x1078, 0x202c, 0xd7fc, 0x00c0, 0x4c14,
++	0x2069, 0x4e40, 0x0078, 0x4c16, 0x2069, 0x4e80, 0x6910, 0xa184,
++	0x0100, 0x2001, 0x0006, 0x00c0, 0x4c20, 0x697a, 0x2001, 0x0004,
++	0x1078, 0x261c, 0x007c, 0x0d7e, 0x694c, 0x2160, 0xd7fc, 0x00c0,
++	0x4c35, 0x7810, 0xd0ec, 0x0040, 0x4c31, 0x2069, 0x0100, 0x0078,
++	0x4c37, 0x2069, 0x0200, 0x0078, 0x4c37, 0x2069, 0x0100, 0x1078,
++	0x28df, 0x601b, 0x0006, 0x6858, 0xa084, 0x3f00, 0x601e, 0x6020,
++	0xa084, 0x00ff, 0xa085, 0x0048, 0x6022, 0x602f, 0x0000, 0x6033,
++	0x0000, 0x6808, 0xa084, 0xfffd, 0x680a, 0x6830, 0xd0b4, 0x0040,
++	0x4c69, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xd094, 0x0040,
++	0x4c5b, 0x00f0, 0x4c55, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848,
++	0xd084, 0x0040, 0x4c65, 0x00f0, 0x4c5f, 0x20a9, 0x00fa, 0x00f0,
++	0x4c67, 0x681b, 0x0047, 0x0d7f, 0x6867, 0x0007, 0x007c, 0x2079,
++	0x4e00, 0x1078, 0x4ca3, 0x1078, 0x4c89, 0x1078, 0x4c96, 0x2009,
++	0x0002, 0x2069, 0x4e80, 0x680f, 0x0000, 0x6813, 0x0000, 0x6817,
++	0x0000, 0x8109, 0x0040, 0x4c88, 0x2069, 0x4e40, 0x0078, 0x4c7b,
++	0x007c, 0x7810, 0xd0ec, 0x0040, 0x4c91, 0x2019, 0x00cc, 0x0078,
++	0x4c93, 0x2019, 0x007b, 0x7b3a, 0x7b3e, 0x007c, 0x7814, 0xd0e4,
++	0x00c0, 0x4c9e, 0x2019, 0x0040, 0x0078, 0x4ca0, 0x2019, 0x0026,
++	0x7b42, 0x7b46, 0x007c, 0x7814, 0xd0e4, 0x00c0, 0x4cab, 0x2019,
++	0x3f94, 0x0078, 0x4cad, 0x2019, 0x2624, 0x7b32, 0x7b36, 0x007c,
++	0x6a50, 0xa285, 0x0000, 0x0040, 0x4cdc, 0x6954, 0x6bc0, 0xa300,
++	0x0c7e, 0x2164, 0x6304, 0x83ff, 0x00c0, 0x4cc8, 0x8211, 0x0040,
++	0x4ccc, 0x8108, 0xa11a, 0x0048, 0x4cb9, 0x69c0, 0x0078, 0x4cb9,
++	0x68d3, 0x000a, 0x0c7f, 0x007c, 0x6950, 0x6ac0, 0x2264, 0x602b,
++	0x0000, 0x602f, 0x0000, 0x6008, 0xc0b5, 0x600a, 0x8210, 0x8109,
++	0x00c0, 0x4cce, 0x6952, 0x0c7f, 0x007c, 0x00e0, 0x4cdd, 0x2091,
++	0x6000, 0x00e0, 0x4ce1, 0x2091, 0x6000, 0x70ec, 0xd0dc, 0x00c0,
++	0x4cee, 0xd0d4, 0x0040, 0x4d17, 0x0078, 0x4d1a, 0x2008, 0x7810,
++	0xd0ec, 0x0040, 0x4d01, 0xd1c4, 0x00c0, 0x4d39, 0x7814, 0xc0c5,
++	0x7816, 0x7810, 0xc0f5, 0x7812, 0xd0ec, 0x0040, 0x4d35, 0x0078,
++	0x4d31, 0xae8e, 0x0100, 0x0040, 0x4d0e, 0x7814, 0xc0f5, 0xc0c5,
++	0x7816, 0xd0d4, 0x00c0, 0x4d35, 0x0078, 0x4d31, 0x7814, 0xc0fd,
++	0xc0c5, 0x7816, 0xd0d4, 0x00c0, 0x4d35, 0x0078, 0x4d31, 0xd0e4,
++	0x0040, 0x4d37, 0x00e0, 0x4d1a, 0x2091, 0x6000, 0x2009, 0x000c,
++	0x00e0, 0x4d20, 0x2091, 0x6000, 0x8109, 0x00c0, 0x4d20, 0x70e4,
++	0xa084, 0x01ff, 0xa086, 0x01ff, 0x00c0, 0x4d31, 0x70ec, 0x0078,
++	0x4cee, 0x7804, 0xd08c, 0x0040, 0x4d37, 0x681f, 0x000c, 0x70a0,
++	0x70a2, 0x007c, 0x205b
++};
++#else
++/************************************************************************
++ *									*
++ *	 --- ISP1240/ISP1080/ISP1280 Initiator/Target Firmware ---      *
++ *			    32 LUN Support				*
++ *									*
++ ************************************************************************/
++/*
++ *	Firmware Version 9.11.01 (15:46 May 23, 2000)
++ */
++
++static const u_int16_t isp_1080_risc_code[] = {
++	0x0078, 0x103a, 0x0000, 0x4f62, 0x0000, 0x2043, 0x4f50, 0x5952,
++	0x4947, 0x4854, 0x2031, 0x3939, 0x3520, 0x514c, 0x4f47, 0x4943,
++	0x2043, 0x4f52, 0x504f, 0x5241, 0x5449, 0x4f4e, 0x2049, 0x5350,
++	0x3132, 0x3430, 0x2049, 0x2f54, 0x2046, 0x6972, 0x6d77, 0x6172,
++	0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, 0x392e, 0x3131,
++	0x2020, 0x2043, 0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20,
++	0x3030, 0x2050, 0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020,
++	0x3031, 0x2024, 0x20c9, 0xabff, 0x2001, 0x04fc, 0x2004, 0xa086,
++	0x1080, 0x00c0, 0x104d, 0x2071, 0x0100, 0x70a0, 0x70a2, 0x20c1,
++	0x0010, 0x2089, 0x136f, 0x0078, 0x1066, 0x2001, 0x04fc, 0x2004,
++	0xa086, 0x1280, 0x00c0, 0x1062, 0x2071, 0x0200, 0x70a0, 0x70a2,
++	0x2071, 0x0100, 0x70a0, 0x70a2, 0x20c1, 0x0010, 0x2089, 0x13f3,
++	0x0078, 0x1066, 0x20c1, 0x0020, 0x2089, 0x1317, 0x2071, 0x0010,
++	0x70c3, 0x0004, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020,
++	0x70d3, 0x0009, 0x2001, 0x04fd, 0x70d6, 0x20c1, 0x0021, 0x2019,
++	0x0000, 0x2009, 0xfeff, 0x2100, 0x200b, 0xa5a5, 0xa1ec, 0x7fff,
++	0x2d64, 0x206b, 0x0a0a, 0xaddc, 0x3fff, 0x2b54, 0x205b, 0x5050,
++	0x2114, 0xa286, 0xa5a5, 0x0040, 0x109d, 0xa386, 0x000f, 0x0040,
++	0x1099, 0x2c6a, 0x2a5a, 0x20c1, 0x0020, 0x2019, 0x000f, 0x0078,
++	0x1079, 0x2c6a, 0x2a5a, 0x0078, 0x109b, 0x2c6a, 0x2a5a, 0x2130,
++	0x2128, 0xa1a2, 0x6000, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424,
++	0x8424, 0xa192, 0xac00, 0x2009, 0x0000, 0x2001, 0x0037, 0x1078,
++	0x22c0, 0x2218, 0x2079, 0x6000, 0x2fa0, 0x2408, 0x2011, 0x0000,
++	0x20a9, 0x0040, 0x42a4, 0x8109, 0x00c0, 0x10b8, 0x2009, 0xff00,
++	0x3400, 0xa102, 0x0048, 0x10c8, 0x0040, 0x10c8, 0x20a8, 0x42a4,
++	0x2001, 0x04fc, 0x2004, 0xa086, 0x1080, 0x00c0, 0x10e0, 0x2071,
++	0x0100, 0x0d7e, 0x2069, 0x6040, 0x1078, 0x5d94, 0x0d7f, 0x7808,
++	0xc0ed, 0x780a, 0x7813, 0x0064, 0x2011, 0x000a, 0x0078, 0x1107,
++	0x2001, 0x04fc, 0x2004, 0xa086, 0x1280, 0x00c0, 0x1100, 0x780c,
++	0xc0ed, 0xc0d5, 0x780e, 0x7813, 0x0064, 0x2071, 0x0200, 0x0d7e,
++	0x2069, 0x6040, 0x1078, 0x5d94, 0x2069, 0x6080, 0x2071, 0x0100,
++	0x1078, 0x5d94, 0x780c, 0xc0d4, 0x780e, 0x0d7f, 0x0078, 0x1107,
++	0x780c, 0xc0e5, 0x780e, 0x7813, 0x003c, 0x2011, 0x000c, 0x2009,
++	0x604c, 0x220a, 0x2009, 0x608c, 0x220a, 0x7ece, 0x7cc6, 0x7bca,
++	0x785f, 0x0000, 0x7800, 0xc08d, 0x7802, 0x2031, 0x0030, 0x78b3,
++	0x0101, 0x781b, 0x0002, 0x781f, 0x0002, 0x2009, 0x0002, 0x2069,
++	0x6040, 0x6817, 0x0003, 0x681f, 0x0007, 0x6823, 0x00fa, 0x6827,
++	0x0008, 0x682b, 0x0028, 0x6837, 0x0006, 0x682f, 0x0008, 0x683b,
++	0x0000, 0x8109, 0x0040, 0x1158, 0x68ef, 0x000a, 0x68df, 0x60c0,
++	0x2079, 0x6000, 0x780c, 0xd0e4, 0x00c0, 0x1142, 0x68f3, 0x7329,
++	0x0078, 0x1144, 0x68f3, 0x730d, 0x68e3, 0x65c0, 0x68e7, 0x64c0,
++	0x68eb, 0xa5c0, 0x68c7, 0xaa8e, 0x68cb, 0xaa93, 0x68cf, 0xaa8e,
++	0x68d3, 0xaa8e, 0x68c3, 0x0001, 0x2069, 0x6080, 0x0078, 0x1121,
++	0x68ef, 0x000a, 0x68df, 0x62c0, 0x68f3, 0x7419, 0x68e3, 0x85c0,
++	0x68e7, 0x6540, 0x68eb, 0xa6d0, 0x68c7, 0xaa93, 0x68cb, 0xaa98,
++	0x68cf, 0xaa93, 0x68d3, 0xaa93, 0x68c3, 0x0001, 0x7808, 0xd0ec,
++	0x00c0, 0x11b4, 0x780c, 0xd0e4, 0x00c0, 0x11a6, 0x0e7e, 0x2069,
++	0x64c0, 0x2071, 0x0200, 0x70ec, 0xd0e4, 0x00c0, 0x1187, 0x2019,
++	0x0c0c, 0x2021, 0x000c, 0x1078, 0x222c, 0x0078, 0x118d, 0x2019,
++	0x0c0a, 0x2021, 0x000a, 0x1078, 0x222c, 0x2069, 0x6540, 0x2071,
++	0x0100, 0x70ec, 0xd0e4, 0x00c0, 0x119d, 0x2019, 0x0c0c, 0x2021,
++	0x000c, 0x1078, 0x222c, 0x0078, 0x11a3, 0x2019, 0x0c0a, 0x2021,
++	0x000a, 0x1078, 0x222c, 0x0e7f, 0x0078, 0x11cd, 0x2019, 0x0c0c,
++	0x2021, 0x000c, 0x2069, 0x64c0, 0x1078, 0x222c, 0x2069, 0x6540,
++	0x1078, 0x222c, 0x0078, 0x11cd, 0x2069, 0x64c0, 0x0e7e, 0x2071,
++	0x0100, 0x70ec, 0xd0e4, 0x00c0, 0x11c6, 0x2019, 0x0c0c, 0x2021,
++	0x000c, 0x1078, 0x222c, 0x0e7f, 0x0078, 0x11cd, 0x2019, 0x0c0a,
++	0x2021, 0x000a, 0x1078, 0x222c, 0x0e7f, 0x2011, 0x0002, 0x2069,
++	0x65c0, 0x2009, 0x0002, 0x20a9, 0x0100, 0x6837, 0x0000, 0x680b,
++	0x0040, 0x7bcc, 0xa386, 0xfeff, 0x00c0, 0x11e4, 0x6817, 0x0100,
++	0x681f, 0x0064, 0x0078, 0x11e8, 0x6817, 0x0064, 0x681f, 0x0002,
++	0xade8, 0x0010, 0x00f0, 0x11d5, 0x8109, 0x00c0, 0x11d3, 0x8211,
++	0x0040, 0x11f6, 0x2069, 0x85c0, 0x0078, 0x11d1, 0x1078, 0x28df,
++	0x1078, 0x56b4, 0x1078, 0x1e5e, 0x1078, 0x5d2a, 0x2091, 0x2100,
++	0x2079, 0x6000, 0x7808, 0xd0ec, 0x0040, 0x120a, 0x2071, 0x0020,
++	0x0078, 0x120c, 0x2071, 0x0050, 0x2091, 0x2200, 0x2079, 0x6000,
++	0x2071, 0x0020, 0x2091, 0x2300, 0x2079, 0x6000, 0x7808, 0xd0ec,
++	0x0040, 0x121e, 0x2079, 0x0100, 0x0078, 0x1220, 0x2079, 0x0200,
++	0x2071, 0x6040, 0x2091, 0x2400, 0x2079, 0x0100, 0x2071, 0x6080,
++	0x2091, 0x2000, 0x2079, 0x6000, 0x2071, 0x0010, 0x3200, 0xa085,
++	0x303d, 0x2090, 0x70c3, 0x0000, 0x0090, 0x123d, 0x70c0, 0xa086,
++	0x0002, 0x00c0, 0x123d, 0x1078, 0x15ae, 0x2039, 0x0000, 0x7808,
++	0xd0ec, 0x00c0, 0x12c7, 0x1078, 0x1477, 0x78b0, 0xa005, 0x00c0,
++	0x125f, 0x0068, 0x1253, 0x7868, 0xa065, 0x0040, 0x1253, 0x2029,
++	0x0000, 0x1078, 0x2774, 0x1078, 0x22e7, 0x0068, 0x126c, 0x7868,
++	0xa065, 0x0040, 0x125f, 0x2029, 0x0000, 0x1078, 0x2774, 0x0068,
++	0x126c, 0x2009, 0x6046, 0x2011, 0x6086, 0x2104, 0x220c, 0xa105,
++	0x0040, 0x126c, 0x1078, 0x1f9d, 0x0e7e, 0x0f7e, 0x2071, 0x6040,
++	0x70c0, 0xa005, 0x0040, 0x1295, 0x7454, 0xa485, 0x0000, 0x0040,
++	0x1295, 0x2079, 0x0200, 0x2091, 0x8000, 0x72f0, 0xa28c, 0x303d,
++	0x2190, 0x1078, 0x2e28, 0x2091, 0x8000, 0x2091, 0x303d, 0x0068,
++	0x1295, 0x0f7f, 0x7868, 0xa065, 0x0040, 0x1294, 0x0e7f, 0x2029,
++	0x0000, 0x1078, 0x2774, 0x0e7e, 0x0f7e, 0x00e0, 0x129d, 0x0f7f,
++	0x0e7f, 0x1078, 0x5b00, 0x0e7e, 0x0f7e, 0x2071, 0x6080, 0x70c0,
++	0xa005, 0x0040, 0x12b6, 0x7454, 0xa485, 0x0000, 0x0040, 0x12b6,
++	0x2079, 0x0100, 0x2091, 0x8000, 0x72f0, 0xa28c, 0x303d, 0x2190,
++	0x1078, 0x2e28, 0x2091, 0x8000, 0x2091, 0x303d, 0x0f7f, 0x0e7f,
++	0x0068, 0x12c1, 0x7868, 0xa065, 0x0040, 0x12c1, 0xa02e, 0x1078,
++	0x2774, 0x00e0, 0x1243, 0x1078, 0x5b00, 0x0078, 0x1243, 0x1078,
++	0x1477, 0x78b0, 0xa005, 0x00c0, 0x12e3, 0x0068, 0x12d7, 0x7868,
++	0xa065, 0x0040, 0x12d7, 0x2029, 0x0000, 0x1078, 0x2774, 0x1078,
++	0x22e7, 0x0068, 0x12ed, 0x7868, 0xa065, 0x0040, 0x12e3, 0x2029,
++	0x0000, 0x1078, 0x2774, 0x0068, 0x12ed, 0x2009, 0x6046, 0x2104,
++	0xa005, 0x0040, 0x12ed, 0x1078, 0x1f9d, 0x0e7e, 0x0f7e, 0x2071,
++	0x6040, 0x70c0, 0xa005, 0x0040, 0x1305, 0x7454, 0xa485, 0x0000,
++	0x0040, 0x1305, 0x2079, 0x0100, 0x2091, 0x8000, 0x72f0, 0x1078,
++	0x2e28, 0x2091, 0x8000, 0x2091, 0x303d, 0x0f7f, 0x0e7f, 0x0068,
++	0x1311, 0x7868, 0xa065, 0x0040, 0x1311, 0x2029, 0x0000, 0x1078,
++	0x2774, 0x00e0, 0x12c7, 0x1078, 0x5b00, 0x0078, 0x12c7, 0x1337,
++	0x1337, 0x1339, 0x1339, 0x1346, 0x1346, 0x1346, 0x1346, 0x1351,
++	0x1351, 0x135e, 0x135e, 0x1346, 0x1346, 0x1346, 0x1346, 0x1337,
++	0x1337, 0x1339, 0x1339, 0x1346, 0x1346, 0x1346, 0x1346, 0x1351,
++	0x1351, 0x135e, 0x135e, 0x1346, 0x1346, 0x1346, 0x1346, 0x0078,
++	0x1337, 0x007e, 0x107e, 0x127e, 0x2091, 0x2400, 0x1078, 0x2c19,
++	0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e, 0x107e,
++	0x127e, 0x1078, 0x13c3, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001,
++	0x007c, 0x007e, 0x107e, 0x127e, 0x2091, 0x2300, 0x1078, 0x2c19,
++	0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e, 0x107e,
++	0x127e, 0x2091, 0x2300, 0x1078, 0x2c19, 0x2091, 0x2400, 0x1078,
++	0x2c19, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x138f,
++	0x138f, 0x1391, 0x1391, 0x139e, 0x139e, 0x139e, 0x139e, 0x13a9,
++	0x13a9, 0x1391, 0x1391, 0x139e, 0x139e, 0x139e, 0x139e, 0x13aa,
++	0x13aa, 0x13aa, 0x13aa, 0x13aa, 0x13aa, 0x13aa, 0x13aa, 0x13aa,
++	0x13aa, 0x13aa, 0x13aa, 0x13aa, 0x13aa, 0x13aa, 0x13aa, 0x0078,
++	0x138f, 0x007e, 0x107e, 0x127e, 0x2091, 0x2300, 0x1078, 0x2c19,
++	0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e, 0x107e,
++	0x127e, 0x1078, 0x13d0, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001,
++	0x007c, 0x007c, 0x107e, 0x127e, 0x0d7e, 0x0e7e, 0x0f7e, 0x007e,
++	0x2071, 0x0100, 0x2069, 0x6040, 0x2079, 0x6000, 0x70ec, 0xa084,
++	0x1c00, 0x78e6, 0x1078, 0x5d94, 0x007f, 0x0f7f, 0x0e7f, 0x0d7f,
++	0x127f, 0x107f, 0x007c, 0x3c00, 0xa084, 0x0007, 0x0079, 0x13c8,
++	0x13d9, 0x13d9, 0x13db, 0x13db, 0x13e0, 0x13e0, 0x13e5, 0x13e5,
++	0x3c00, 0xa084, 0x0003, 0x0079, 0x13d5, 0x13d9, 0x13d9, 0x13ee,
++	0x13ee, 0x1078, 0x2bfa, 0x2091, 0x2200, 0x1078, 0x578c, 0x007c,
++	0x2091, 0x2100, 0x1078, 0x578c, 0x007c, 0x2091, 0x2100, 0x1078,
++	0x578c, 0x2091, 0x2200, 0x1078, 0x578c, 0x007c, 0x2091, 0x2100,
++	0x1078, 0x578c, 0x007c, 0x1413, 0x1413, 0x1415, 0x1415, 0x1422,
++	0x1422, 0x1422, 0x1422, 0x142d, 0x142d, 0x143a, 0x143a, 0x1422,
++	0x1422, 0x1422, 0x1422, 0x144b, 0x144b, 0x144b, 0x144b, 0x144b,
++	0x144b, 0x144b, 0x144b, 0x144b, 0x144b, 0x144b, 0x144b, 0x144b,
++	0x144b, 0x144b, 0x144b, 0x0078, 0x1413, 0x007e, 0x107e, 0x127e,
++	0x2091, 0x2400, 0x1078, 0x2c19, 0x127f, 0x107f, 0x007f, 0x2091,
++	0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x1078, 0x13c3, 0x127f,
++	0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e,
++	0x2091, 0x2300, 0x1078, 0x2c19, 0x127f, 0x107f, 0x007f, 0x2091,
++	0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x2091, 0x2300, 0x1078,
++	0x2c19, 0x2091, 0x2400, 0x1078, 0x2c19, 0x127f, 0x107f, 0x007f,
++	0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x0d7e, 0x0e7e,
++	0x0f7e, 0x2079, 0x6000, 0x2071, 0x0200, 0x2069, 0x6040, 0x3d00,
++	0xd08c, 0x0040, 0x1461, 0x70ec, 0xa084, 0x1c00, 0x78e6, 0x1078,
++	0x5d94, 0x3d00, 0xd084, 0x0040, 0x146f, 0x2069, 0x6080, 0x2071,
++	0x0100, 0x70ec, 0xa084, 0x1c00, 0x78ea, 0x1078, 0x5d94, 0x0f7f,
++	0x0e7f, 0x0d7f, 0x127f, 0x107f, 0x007f, 0x007c, 0x007c, 0x0068,
++	0x14fd, 0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x14fd,
++	0x7820, 0xa005, 0x00c0, 0x1488, 0x0010, 0x14fe, 0x0078, 0x14fd,
++	0x7908, 0xd1f4, 0x0040, 0x1490, 0x2001, 0x4007, 0x0078, 0x15b0,
++	0x790c, 0xd1ec, 0x0040, 0x14ab, 0xd0fc, 0x0040, 0x14a1, 0x007e,
++	0x1078, 0x1dd3, 0x007f, 0x0040, 0x14ab, 0x2001, 0x4007, 0x0078,
++	0x15b0, 0x007e, 0x1078, 0x1dc7, 0x007f, 0x0040, 0x14ab, 0x2001,
++	0x4007, 0x0078, 0x15b0, 0x7908, 0xd0fc, 0x00c0, 0x14b5, 0x2061,
++	0x6040, 0xc19c, 0xc7fc, 0x0078, 0x14b9, 0x2061, 0x6080, 0xc19d,
++	0xc7fd, 0x6068, 0xa005, 0x00c0, 0x14fd, 0x790a, 0x6087, 0x0000,
++	0x7820, 0xc0fc, 0xa086, 0x0018, 0x00c0, 0x14ca, 0x0c7e, 0x1078,
++	0x1aed, 0x0c7f, 0x7823, 0x0000, 0x6080, 0xa065, 0x0040, 0x14e3,
++	0x0c7e, 0x609c, 0x1078, 0x1edb, 0x0c7f, 0x609f, 0x0000, 0x1078,
++	0x1c18, 0x2009, 0x000c, 0x6007, 0x0103, 0x1078, 0x1ddf, 0x00c0,
++	0x14f7, 0x1078, 0x1e43, 0x7808, 0xd09c, 0x00c0, 0x14eb, 0x2061,
++	0x6040, 0x0078, 0x14ee, 0x2061, 0x6080, 0xc09c, 0x6083, 0x0000,
++	0x780a, 0x60f0, 0xd0dc, 0x0040, 0x14fb, 0xc0dc, 0x60f2, 0x2001,
++	0x4005, 0x0078, 0x15b0, 0x0078, 0x15ae, 0x007c, 0x7808, 0xd0f4,
++	0x0040, 0x1506, 0x2001, 0x4007, 0x0078, 0x15b0, 0x70c3, 0x0000,
++	0x70c7, 0x0000, 0x70cb, 0x0000, 0x70cf, 0x0000, 0x70db, 0x0000,
++	0x71c4, 0x7a08, 0xd2ec, 0x0040, 0x1516, 0xc1fc, 0x70c0, 0xa03d,
++	0xa092, 0x0030, 0x00c8, 0x151e, 0x0079, 0x1525, 0x2200, 0xa092,
++	0x0050, 0x00c8, 0x15bc, 0x0079, 0x1555, 0x15ae, 0x1604, 0x15cd,
++	0x1619, 0x1628, 0x162e, 0x15c4, 0x1c30, 0x1632, 0x15bc, 0x15d1,
++	0x15d3, 0x15d5, 0x15d7, 0x1c35, 0x15bc, 0x1640, 0x1698, 0x1b0f,
++	0x1c2a, 0x15d9, 0x1949, 0x198b, 0x19c6, 0x1a13, 0x1902, 0x1910,
++	0x1924, 0x1938, 0x175e, 0x15bc, 0x16c9, 0x16cd, 0x16d9, 0x16e5,
++	0x16fb, 0x1707, 0x170a, 0x1716, 0x1722, 0x172a, 0x1746, 0x1752,
++	0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x176b, 0x177a, 0x1795, 0x17cb,
++	0x17f3, 0x1803, 0x1806, 0x182f, 0x1860, 0x1872, 0x18d4, 0x18e4,
++	0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x18f4, 0x15bc, 0x15bc, 0x15bc,
++	0x15bc, 0x15bc, 0x1d7e, 0x1d84, 0x15bc, 0x15bc, 0x15bc, 0x1d88,
++	0x1d8d, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15fe, 0x1613, 0x163a,
++	0x1692, 0x1b09, 0x1c4c, 0x1c72, 0x1ad0, 0x1c8a, 0x1d91, 0x1d70,
++	0x1d7a, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc,
++	0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc,
++	0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc,
++	0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc,
++	0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x72ca, 0x71c6, 0x2001,
++	0x4006, 0x0078, 0x15b0, 0x73ce, 0x72ca, 0x71c6, 0x2001, 0x4000,
++	0x70c2, 0x0068, 0x15b1, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091,
++	0x5000, 0x2091, 0x4080, 0x007c, 0x70c3, 0x4001, 0x0078, 0x15b1,
++	0x70c3, 0x4006, 0x0078, 0x15b1, 0x2099, 0x0041, 0x20a1, 0x0041,
++	0x20a9, 0x0005, 0x53a3, 0x0078, 0x15ae, 0x70c4, 0x70c3, 0x0004,
++	0x007a, 0x0078, 0x15ae, 0x0078, 0x15ae, 0x0078, 0x15ae, 0x0078,
++	0x15ae, 0x2091, 0x8000, 0x70c3, 0x0000, 0x70c7, 0x4953, 0x70cb,
++	0x5020, 0x70cf, 0x2020, 0x70d3, 0x0009, 0x2001, 0x000b, 0x70d6,
++	0x2079, 0x0000, 0x781b, 0x0001, 0x2031, 0x0030, 0x2059, 0x1000,
++	0x2029, 0x041a, 0x2051, 0x0445, 0x2061, 0x0447, 0x20c1, 0x0020,
++	0x2091, 0x5000, 0x2091, 0x4080, 0x0078, 0x0418, 0x75d8, 0x74dc,
++	0x75da, 0x74de, 0x0078, 0x1607, 0x2029, 0x0000, 0x2520, 0x71d0,
++	0x73c8, 0x72cc, 0x70c4, 0x1078, 0x1ff2, 0x0040, 0x15ae, 0x70c3,
++	0x4002, 0x0078, 0x15ae, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078,
++	0x161c, 0x2029, 0x0000, 0x2520, 0x71d0, 0x73c8, 0x72cc, 0x70c4,
++	0x1078, 0x203c, 0x0040, 0x15ae, 0x70c3, 0x4002, 0x0078, 0x15ae,
++	0x71c4, 0x70c8, 0x2114, 0x200a, 0x0078, 0x15ac, 0x71c4, 0x2114,
++	0x0078, 0x15ac, 0x70c7, 0x0009, 0x70cb, 0x000b, 0x70cf, 0x0001,
++	0x0078, 0x15ae, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, 0x1643,
++	0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0, 0x70c6,
++	0x72ca, 0x73ce, 0x74d2, 0xa005, 0x0040, 0x168c, 0xa40a, 0x0040,
++	0x1653, 0x00c8, 0x15b0, 0x8001, 0x786e, 0xa084, 0xfc00, 0x0040,
++	0x1660, 0x78b0, 0xc085, 0x78b2, 0x2001, 0x4005, 0x0078, 0x15b0,
++	0x7a76, 0x7b7a, 0x7d7e, 0x7e82, 0x7c72, 0xa48c, 0xff00, 0x0040,
++	0x1678, 0x8407, 0x8004, 0x8004, 0x810c, 0x810c, 0x810f, 0xa118,
++	0xa291, 0x0000, 0xa6b1, 0x0000, 0xa5a9, 0x0000, 0x0078, 0x1682,
++	0x8407, 0x8004, 0x8004, 0xa318, 0xa291, 0x0000, 0xa6b1, 0x0000,
++	0xa5a9, 0x0000, 0x731a, 0x721e, 0x7622, 0x7526, 0x78b0, 0xa084,
++	0xfffc, 0x78b2, 0x0078, 0x1690, 0x78b0, 0xa085, 0x0001, 0x78b2,
++	0x0078, 0x15ae, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, 0x169b,
++	0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6,
++	0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0040, 0x16c3, 0xa40a, 0x0040,
++	0x16ab, 0x00c8, 0x15b0, 0x8001, 0x7892, 0xa084, 0xfc00, 0x0040,
++	0x16b8, 0x78b0, 0xc0c5, 0x78b2, 0x2001, 0x4005, 0x0078, 0x15b0,
++	0x7a9a, 0x7b9e, 0x7da2, 0x7ea6, 0x7c96, 0x78b0, 0xa084, 0xfcff,
++	0x78b2, 0x0078, 0x16c7, 0x78b0, 0xa085, 0x0100, 0x78b2, 0x0078,
++	0x15ae, 0x7960, 0x7ac8, 0x0078, 0x15ac, 0x2009, 0x6047, 0x210c,
++	0x7808, 0xd0ec, 0x00c0, 0x15ad, 0x2011, 0x6087, 0x2214, 0x0078,
++	0x15ac, 0x2009, 0x6048, 0x210c, 0x7808, 0xd0ec, 0x00c0, 0x15ad,
++	0x2011, 0x6088, 0x2214, 0x0078, 0x15ac, 0x2061, 0x6040, 0x6124,
++	0x6228, 0x8214, 0x8214, 0x8214, 0x7808, 0xd0ec, 0x00c0, 0x16f9,
++	0x2061, 0x6080, 0x6324, 0x73da, 0x6328, 0x831c, 0x831c, 0x831c,
++	0x73de, 0x0078, 0x15ac, 0x2009, 0x604b, 0x210c, 0x7808, 0xd0ec,
++	0x00c0, 0x15ad, 0x2011, 0x608b, 0x2214, 0x0078, 0x15ac, 0x7910,
++	0x0078, 0x15ad, 0x2009, 0x0202, 0x210c, 0x7808, 0xd0ec, 0x00c0,
++	0x15ad, 0x2011, 0x0102, 0x2214, 0x0078, 0x15ac, 0x2009, 0x604d,
++	0x210c, 0x7808, 0xd0ec, 0x00c0, 0x15ad, 0x2011, 0x608d, 0x2214,
++	0x0078, 0x15ac, 0x7918, 0x7808, 0xd0ec, 0x00c0, 0x15ad, 0x7a1c,
++	0x0078, 0x15ac, 0xd1fc, 0x00c0, 0x1731, 0x2011, 0x64c0, 0x0078,
++	0x1733, 0x2011, 0x6540, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003,
++	0x8003, 0xa268, 0x6a00, 0x6804, 0xa084, 0x0008, 0x0040, 0x1743,
++	0x6b08, 0x0078, 0x1744, 0x6b0c, 0x0078, 0x15ab, 0x2138, 0x1078,
++	0x1e6e, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708,
++	0x0078, 0x15ab, 0x2061, 0x6040, 0x6114, 0x7808, 0xd0ec, 0x00c0,
++	0x15ad, 0x2061, 0x6080, 0x6214, 0x0078, 0x15ac, 0x2138, 0x1078,
++	0x1e6e, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, 0x77da, 0x2091,
++	0x8001, 0x0078, 0x15ab, 0x2110, 0xa294, 0x000f, 0xa282, 0x0010,
++	0x00c8, 0x15a6, 0x1078, 0x2a23, 0xd3f4, 0x0040, 0x1778, 0xc2ad,
++	0x0078, 0x15ab, 0x2100, 0xc0bc, 0xa082, 0x0010, 0x00c8, 0x15a6,
++	0xd1bc, 0x00c0, 0x1788, 0x2011, 0x6047, 0x2204, 0x0078, 0x178c,
++	0x2011, 0x6087, 0x2204, 0xc0bd, 0x007e, 0x2100, 0xc0bc, 0x2012,
++	0x1078, 0x297e, 0x017f, 0x0078, 0x15ad, 0x71c4, 0x2021, 0x6048,
++	0x2404, 0x70c6, 0x2019, 0x0000, 0x0078, 0x17a4, 0x71c8, 0x2021,
++	0x6088, 0x2404, 0x70ca, 0xc3fd, 0x2011, 0x17c3, 0x20a9, 0x0008,
++	0x2204, 0xa106, 0x0040, 0x17b3, 0x8210, 0x00f0, 0x17a8, 0x71c4,
++	0x72c8, 0x0078, 0x15a5, 0xa292, 0x17c3, 0x027e, 0x2122, 0x017f,
++	0x1078, 0x29a1, 0x7808, 0xd0ec, 0x00c0, 0x17c1, 0xd3fc, 0x0040,
++	0x179e, 0x0078, 0x15ae, 0x03e8, 0x00fa, 0x01f4, 0x02ee, 0x0004,
++	0x0001, 0x0002, 0x0003, 0x2061, 0x6040, 0x6124, 0x6228, 0x8214,
++	0x8214, 0x8214, 0x70c4, 0x6026, 0x70c8, 0x8003, 0x8003, 0x8003,
++	0x602a, 0x7808, 0xd0ec, 0x00c0, 0x17f1, 0x027e, 0x017e, 0x2061,
++	0x6080, 0x6124, 0x6228, 0x8214, 0x8214, 0x8214, 0x70d8, 0x6026,
++	0x70dc, 0x8003, 0x8003, 0x8003, 0x602a, 0x71da, 0x72de, 0x017f,
++	0x027f, 0x0078, 0x15ac, 0x2061, 0x6040, 0x612c, 0x70c4, 0x602e,
++	0x7808, 0xd0ec, 0x00c0, 0x15ad, 0x2061, 0x6080, 0x622c, 0x70c8,
++	0x602e, 0x0078, 0x15ac, 0x7910, 0x0078, 0x15ad, 0x71c4, 0xa184,
++	0xffcf, 0x0040, 0x1812, 0x7808, 0xd0ec, 0x00c0, 0x15a6, 0x72c8,
++	0x0078, 0x15a5, 0x007e, 0x2019, 0x0000, 0x1078, 0x2a08, 0x7808,
++	0xd0ec, 0x0040, 0x181e, 0x017f, 0x0078, 0x15ad, 0x71c8, 0xa184,
++	0xffcf, 0x0040, 0x1827, 0x2110, 0x71c4, 0x0078, 0x15a5, 0x007e,
++	0xc3fd, 0x1078, 0x2a08, 0x027f, 0x017f, 0x0078, 0x15ac, 0x71c4,
++	0xa182, 0x0010, 0x0048, 0x183b, 0x7808, 0xd0ec, 0x00c0, 0x15a6,
++	0x72c8, 0x0078, 0x15a5, 0x2011, 0x604d, 0x2204, 0x007e, 0x2112,
++	0x2019, 0x0000, 0x1078, 0x29e6, 0x7808, 0xd0ec, 0x0040, 0x184b,
++	0x017f, 0x0078, 0x15ad, 0x71c8, 0xa182, 0x0010, 0x0048, 0x1854,
++	0x2110, 0x71c4, 0x0078, 0x15a5, 0x2011, 0x608d, 0x2204, 0x007e,
++	0x2112, 0xc3fd, 0x1078, 0x29e6, 0x027f, 0x017f, 0x0078, 0x15ac,
++	0x71c4, 0x72c8, 0xa184, 0xfffd, 0x00c0, 0x15a5, 0xa284, 0xfffd,
++	0x00c0, 0x15a5, 0x2100, 0x7918, 0x781a, 0x2200, 0x7a1c, 0x781e,
++	0x0078, 0x15ac, 0x017e, 0xd1fc, 0x00c0, 0x187a, 0x2011, 0x64c0,
++	0x0078, 0x187c, 0x2011, 0x6540, 0x8107, 0xa084, 0x000f, 0x8003,
++	0x8003, 0x8003, 0xa268, 0xa01e, 0x72c8, 0x2091, 0x8000, 0x6800,
++	0x007e, 0xa226, 0x0040, 0x18a8, 0x6a02, 0xa484, 0x2000, 0x0040,
++	0x1893, 0xa39d, 0x0010, 0xa484, 0x1000, 0x0040, 0x1899, 0xa39d,
++	0x0008, 0xa484, 0x4000, 0x0040, 0x18a8, 0x810f, 0xa284, 0x4000,
++	0x0040, 0x18a6, 0x1078, 0x2a65, 0x0078, 0x18a8, 0x1078, 0x2a43,
++	0x72cc, 0x6808, 0xa206, 0x0040, 0x18ca, 0xa2a4, 0x00ff, 0x780c,
++	0xd0e4, 0x00c0, 0x18bb, 0xa482, 0x0028, 0x0048, 0x18c7, 0x0040,
++	0x18c7, 0x0078, 0x18bf, 0xa482, 0x0043, 0x0048, 0x18c7, 0x027f,
++	0x72ca, 0x017f, 0x71c6, 0x2091, 0x8001, 0x0078, 0x15a7, 0x6a0a,
++	0xa39d, 0x000a, 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x017f,
++	0x2091, 0x8001, 0x0078, 0x15ab, 0x2138, 0x1078, 0x1e6e, 0x2091,
++	0x8000, 0x6a14, 0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc,
++	0x681e, 0x2708, 0x0078, 0x15ab, 0x70c4, 0x2061, 0x6040, 0x6114,
++	0x6016, 0x7808, 0xd0ec, 0x00c0, 0x15ad, 0x70c8, 0x2061, 0x6080,
++	0x6214, 0x6016, 0x0078, 0x15ac, 0x72c8, 0x73cc, 0xa182, 0x0010,
++	0x00c8, 0x15a6, 0x1078, 0x2a87, 0xd3f4, 0x0040, 0x1900, 0xc2ad,
++	0x0078, 0x15ab, 0x2138, 0x1078, 0x1e6e, 0x2091, 0x8000, 0x6a08,
++	0xa295, 0x0002, 0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078, 0x15ac,
++	0x2138, 0x1078, 0x1e6e, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9,
++	0x6a0a, 0x6804, 0xa005, 0x0040, 0x191f, 0x1078, 0x2852, 0x2091,
++	0x8001, 0x2708, 0x0078, 0x15ac, 0x2138, 0x1078, 0x1e6e, 0x2091,
++	0x8000, 0x6a08, 0xa295, 0x0004, 0x6a0a, 0x6804, 0xa005, 0x0040,
++	0x1933, 0x1078, 0x2852, 0x2091, 0x8001, 0x2708, 0x0078, 0x15ac,
++	0x2138, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091,
++	0x8000, 0x1078, 0x1e83, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0078,
++	0x15ac, 0x2138, 0x780c, 0xd0e4, 0x00c0, 0x195d, 0xd7fc, 0x0040,
++	0x1957, 0x1078, 0x1dd3, 0x0040, 0x195d, 0x0078, 0x15b0, 0x1078,
++	0x1dc7, 0x0040, 0x195d, 0x0078, 0x15b0, 0x73c8, 0x72cc, 0x77c6,
++	0x73ca, 0x72ce, 0x1078, 0x1f20, 0x00c0, 0x1987, 0x6818, 0xa005,
++	0x0040, 0x1981, 0x2708, 0x077e, 0x1078, 0x2ab0, 0x077f, 0x00c0,
++	0x1981, 0x2001, 0x0015, 0xd7fc, 0x00c0, 0x197a, 0x2061, 0x6040,
++	0x0078, 0x197d, 0xc0fd, 0x2061, 0x6080, 0x7822, 0x2091, 0x8001,
++	0x007c, 0x2091, 0x8001, 0x2001, 0x4005, 0x0078, 0x15b0, 0x2091,
++	0x8001, 0x0078, 0x15ae, 0x2138, 0x780c, 0xd0e4, 0x00c0, 0x199f,
++	0xd7fc, 0x0040, 0x1999, 0x1078, 0x1dd3, 0x0040, 0x199f, 0x0078,
++	0x15b0, 0x1078, 0x1dc7, 0x0040, 0x199f, 0x0078, 0x15b0, 0x77c6,
++	0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000,
++	0x1078, 0x1e83, 0x2009, 0x0016, 0xd7fc, 0x00c0, 0x19b3, 0x2061,
++	0x6040, 0x0078, 0x19b6, 0x2061, 0x6080, 0xc1fd, 0x606b, 0x0003,
++	0x6083, 0x0000, 0x677a, 0x6087, 0x000f, 0x7922, 0x61f0, 0xc1dc,
++	0x61f2, 0x1078, 0x2852, 0x2091, 0x8001, 0x007c, 0x77c8, 0x77ca,
++	0x2138, 0x77c6, 0x780c, 0xd0e4, 0x00c0, 0x19dd, 0xd7fc, 0x0040,
++	0x19d7, 0x1078, 0x1dd3, 0x0040, 0x19dd, 0x0078, 0x15b0, 0x1078,
++	0x1dc7, 0x0040, 0x19dd, 0x0078, 0x15b0, 0xa7bc, 0xff00, 0x2091,
++	0x8000, 0x2009, 0x0017, 0xd7fc, 0x00c0, 0x19ea, 0x2061, 0x6040,
++	0x0078, 0x19ed, 0x2061, 0x6080, 0xc1fd, 0x6083, 0x0000, 0x606b,
++	0x0002, 0x677a, 0x6087, 0x000f, 0x7922, 0x61f0, 0xc1dc, 0x61f2,
++	0x1078, 0x2852, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0010,
++	0x70c8, 0xa005, 0x0040, 0x1a07, 0x60f0, 0xc0fd, 0x60f2, 0x1078,
++	0x1e83, 0x70c8, 0x6836, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1a07,
++	0x2091, 0x8001, 0x007c, 0x2019, 0x0000, 0x2011, 0x0000, 0x7808,
++	0xd0ec, 0x00c0, 0x1a2f, 0x72c8, 0x780c, 0xd0e4, 0x00c0, 0x1a2f,
++	0xd284, 0x0040, 0x1a29, 0x1078, 0x1dd3, 0x0040, 0x1a2f, 0x0078,
++	0x15b0, 0x1078, 0x1dc7, 0x0040, 0x1a2f, 0x0078, 0x15b0, 0x72ca,
++	0x78b0, 0xa084, 0x0003, 0x00c0, 0x1a59, 0x2039, 0x0000, 0xd284,
++	0x0040, 0x1a3b, 0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051,
++	0x0008, 0x1078, 0x1e6e, 0x2091, 0x8000, 0x6808, 0xc0d4, 0xa80d,
++	0x690a, 0x2091, 0x8001, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1a41,
++	0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0,
++	0x1a41, 0x2091, 0x8000, 0x7808, 0xd0ec, 0x0040, 0x1a63, 0x2069,
++	0x0100, 0x0078, 0x1a6d, 0x72c8, 0xd284, 0x00c0, 0x1a6b, 0x2069,
++	0x0200, 0x0078, 0x1a6d, 0x2069, 0x0100, 0x6808, 0xa084, 0xfffd,
++	0x680a, 0x6830, 0xa084, 0x0040, 0x0040, 0x1a90, 0x684b, 0x0004,
++	0x20a9, 0x0014, 0x6848, 0xa084, 0x0004, 0x0040, 0x1a81, 0x00f0,
++	0x1a7a, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001,
++	0x0040, 0x1a8c, 0x00f0, 0x1a85, 0x20a9, 0x00fa, 0x00f0, 0x1a8e,
++	0x2079, 0x6000, 0x2009, 0x0018, 0x7808, 0xd0ec, 0x00c0, 0x1a9c,
++	0x72c8, 0xd284, 0x00c0, 0x1aa0, 0x2061, 0x6040, 0x0078, 0x1aa3,
++	0x2061, 0x6080, 0xc1fd, 0x6083, 0x0000, 0x7922, 0x606b, 0x0001,
++	0x6087, 0x000f, 0x60c3, 0x0000, 0x60c4, 0x60ce, 0x60d2, 0x60f0,
++	0xd0b4, 0x0040, 0x1abf, 0xc0b4, 0x60f2, 0x0c7e, 0x60d4, 0xa065,
++	0x6008, 0xc0d4, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f, 0x60f0,
++	0xa084, 0x77ff, 0x60f2, 0x78b0, 0xa085, 0x0002, 0x78b2, 0x83ff,
++	0x0040, 0x1acb, 0x007c, 0x681b, 0x0048, 0x2091, 0x8001, 0x007c,
++	0x73cc, 0x1078, 0x1a15, 0x69ec, 0x6a48, 0xa185, 0x1800, 0x684a,
++	0xa185, 0x0040, 0x68ee, 0x73cc, 0x2021, 0x0004, 0x20a9, 0x09ff,
++	0x00f0, 0x1ae0, 0x8421, 0x00c0, 0x1ade, 0x8319, 0x00c0, 0x1adc,
++	0x69ee, 0x6a4a, 0x2091, 0x8001, 0x007c, 0xd7fc, 0x00c0, 0x1af4,
++	0x2069, 0x6040, 0x0078, 0x1af6, 0x2069, 0x6080, 0x71c4, 0x71c6,
++	0x6912, 0x81ff, 0x00c0, 0x1afe, 0x68c3, 0x0001, 0x78b0, 0xa084,
++	0xfffd, 0x78b2, 0xa084, 0x0001, 0x00c0, 0x1b08, 0x1078, 0x1f79,
++	0x007c, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1b12, 0x2029,
++	0x0000, 0x2520, 0x71c4, 0x73c8, 0x72cc, 0x71c6, 0x73ca, 0x72ce,
++	0x2079, 0x6000, 0x7de2, 0x7cde, 0x7bda, 0x7ad6, 0x1078, 0x1e25,
++	0x0040, 0x1c14, 0x20a9, 0x0005, 0x20a1, 0x6012, 0x2091, 0x8000,
++	0x41a1, 0x2091, 0x8001, 0x2009, 0x0040, 0x1078, 0x21f4, 0x0040,
++	0x1b35, 0x1078, 0x1e43, 0x0078, 0x1c14, 0x6004, 0xa08c, 0x00ff,
++	0xa18e, 0x0009, 0x00c0, 0x1b40, 0x007e, 0x1078, 0x2750, 0x007f,
++	0xa084, 0xff00, 0x8007, 0x8009, 0x0040, 0x1bb3, 0x0c7e, 0x2c68,
++	0x1078, 0x1e25, 0x0040, 0x1b86, 0x2c00, 0x689e, 0x8109, 0x00c0,
++	0x1b47, 0x609f, 0x0000, 0x0c7f, 0x0c7e, 0x7de0, 0x7cdc, 0x7bd8,
++	0x7ad4, 0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9,
++	0x0000, 0x7de2, 0x7cde, 0x7bda, 0x7ad6, 0x2c68, 0x689c, 0xa065,
++	0x0040, 0x1bb2, 0x2009, 0x0040, 0x1078, 0x21f4, 0x00c0, 0x1b9c,
++	0x6004, 0xa084, 0x00ff, 0xa086, 0x0002, 0x00c0, 0x1b86, 0x6004,
++	0xa084, 0x00ff, 0xa086, 0x000a, 0x00c0, 0x1b82, 0x017e, 0x1078,
++	0x274c, 0x017f, 0x2d00, 0x6002, 0x0078, 0x1b55, 0x0c7f, 0x0c7e,
++	0x609c, 0x1078, 0x1edb, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1c18,
++	0x2009, 0x000c, 0x6008, 0xa085, 0x0200, 0x600a, 0x1078, 0x1ddf,
++	0x1078, 0x1e43, 0x0078, 0x1c14, 0x0c7f, 0x0c7e, 0x609c, 0x1078,
++	0x1edb, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1c18, 0x2009, 0x000c,
++	0x6007, 0x0103, 0x601b, 0x0003, 0x1078, 0x1ddf, 0x1078, 0x1e43,
++	0x0078, 0x1c14, 0x0c7f, 0x780c, 0xd0e4, 0x00c0, 0x1bd8, 0x6114,
++	0xd1fc, 0x0040, 0x1bc1, 0x1078, 0x1dd3, 0x0040, 0x1bd8, 0x0078,
++	0x1bc5, 0x1078, 0x1dc7, 0x0040, 0x1bd8, 0x2029, 0x0000, 0x2520,
++	0x2009, 0x0018, 0x73c8, 0x72cc, 0x6087, 0x0103, 0x601b, 0x0021,
++	0x1078, 0x1ddf, 0x1078, 0x1e43, 0x2001, 0x4007, 0x0078, 0x15b0,
++	0x74c4, 0x73c8, 0x72cc, 0x6014, 0x2091, 0x8000, 0x0e7e, 0x2009,
++	0x0012, 0xd0fc, 0x00c0, 0x1be8, 0x2071, 0x6040, 0x0078, 0x1beb,
++	0x2071, 0x6080, 0xc1fd, 0x7922, 0x706b, 0x0005, 0x71f0, 0xc1dc,
++	0x71f2, 0x736e, 0x7272, 0x7476, 0x707a, 0x707f, 0x0000, 0x2c00,
++	0x7082, 0xa02e, 0x2530, 0x611c, 0x61a2, 0xa184, 0x0060, 0x0040,
++	0x1c03, 0x1078, 0x564a, 0x0e7f, 0x6596, 0x65a6, 0x669a, 0x66aa,
++	0x60af, 0x0000, 0x60b3, 0x0000, 0x6714, 0x6023, 0x0000, 0x1078,
++	0x2852, 0x2091, 0x8001, 0x007c, 0x70c3, 0x4005, 0x0078, 0x15b1,
++	0x20a9, 0x0005, 0x2099, 0x6012, 0x2091, 0x8000, 0x530a, 0x2091,
++	0x8001, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9,
++	0x0000, 0x007c, 0x71c4, 0x70c7, 0x0000, 0x7916, 0x0078, 0x15ae,
++	0x71c4, 0x71c6, 0x2168, 0x0078, 0x1c37, 0x2069, 0x1000, 0x690c,
++	0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x00c0, 0x1c39, 0xa285,
++	0x0000, 0x00c0, 0x1c47, 0x70c3, 0x4000, 0x0078, 0x1c49, 0x70c3,
++	0x4003, 0x70ca, 0x0078, 0x15b1, 0x2011, 0x6064, 0xa03e, 0x7908,
++	0xd1ec, 0x00c0, 0x1c6a, 0x77c8, 0xd7fc, 0x0040, 0x1c59, 0x2011,
++	0x60a4, 0x220c, 0x007e, 0x037e, 0x047e, 0x1078, 0x482c, 0x70c4,
++	0xd0fc, 0x047f, 0x037f, 0x007f, 0x00c0, 0x1c6a, 0xa184, 0x7fff,
++	0x0078, 0x1c6e, 0x1078, 0x480c, 0xa185, 0x8000, 0x2012, 0x2710,
++	0x0078, 0x15ac, 0x017e, 0x2100, 0xc1fc, 0x1078, 0x47fa, 0x017f,
++	0xd1fc, 0x00c0, 0x1c7f, 0x2001, 0x6064, 0x0078, 0x1c81, 0x2001,
++	0x60a4, 0x2004, 0xa084, 0x8000, 0x6100, 0xa10d, 0x6204, 0x6308,
++	0x0078, 0x15ab, 0x0c7e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2091, 0x8000,
++	0x2061, 0x0010, 0x60c4, 0xd0fc, 0x00c0, 0x1ca8, 0x2071, 0x6040,
++	0x7808, 0xd0ec, 0x0040, 0x1ca2, 0x2079, 0x0100, 0x2019, 0x0020,
++	0x0078, 0x1cae, 0x2079, 0x0200, 0x2019, 0x0050, 0x0078, 0x1cae,
++	0x2071, 0x6080, 0x2079, 0x0100, 0x2019, 0x0020, 0x7094, 0xa06d,
++	0x0040, 0x1d66, 0x6a04, 0xa294, 0x00ff, 0xa286, 0x0007, 0x0040,
++	0x1cbd, 0xa286, 0x000f, 0x00c0, 0x1d66, 0x691c, 0xa184, 0x00c0,
++	0x0040, 0x1d66, 0xa186, 0x00c0, 0x0040, 0x1d66, 0x6824, 0xa084,
++	0xff00, 0xa085, 0x0019, 0x6826, 0x2368, 0x7830, 0xa084, 0x0040,
++	0x00c0, 0x1ccd, 0xa184, 0x0080, 0x00c0, 0x1d36, 0x78e4, 0xa084,
++	0x0007, 0x8001, 0x00c0, 0x1cd6, 0x71a4, 0x81ff, 0x0040, 0x1cec,
++	0x6807, 0x0010, 0x6908, 0x6808, 0xa106, 0x00c0, 0x1ce2, 0x6804,
++	0xa084, 0x0010, 0x00c0, 0x1ce7, 0x78b8, 0xa084, 0x801f, 0x00c0,
++	0x1cec, 0x7848, 0xa085, 0x000c, 0x784a, 0x71a4, 0x81ff, 0x0040,
++	0x1d0b, 0x70a7, 0x0000, 0x6807, 0x0018, 0x6804, 0xa084, 0x0008,
++	0x00c0, 0x1cfd, 0x6807, 0x0008, 0x6804, 0xa084, 0x0008, 0x00c0,
++	0x1d04, 0x6807, 0x0002, 0x61c4, 0xa18c, 0x0003, 0x0040, 0x1d61,
++	0x62c8, 0x63cc, 0x61c6, 0x62ca, 0x63ce, 0x7848, 0xa084, 0x000c,
++	0x00c0, 0x1d15, 0x0e7e, 0x2071, 0x6000, 0x724e, 0x7352, 0xae80,
++	0x0013, 0x0e7f, 0x1078, 0x54f9, 0x78a3, 0x0000, 0x7858, 0xa084,
++	0xedff, 0x785a, 0x70a8, 0xa080, 0x00d9, 0x781a, 0x0f7f, 0x0e7f,
++	0x0d7f, 0x0c7f, 0x2091, 0x8001, 0x0078, 0x15ae, 0x78e4, 0xa084,
++	0x0007, 0x00c0, 0x1d36, 0x78b8, 0xa084, 0x801f, 0x00c0, 0x1d3b,
++	0x7848, 0xa085, 0x000c, 0x784a, 0x7848, 0xa084, 0x000c, 0x00c0,
++	0x1d44, 0x71a4, 0x81ff, 0x0040, 0x1d61, 0x6807, 0x0010, 0x70a7,
++	0x0000, 0x6807, 0x0018, 0x6804, 0xa084, 0x0008, 0x00c0, 0x1d53,
++	0x6807, 0x0008, 0x6804, 0xa084, 0x0008, 0x00c0, 0x1d5a, 0x6807,
++	0x0002, 0x70a8, 0xa080, 0x00a7, 0x0078, 0x1d2d, 0x0f7f, 0x0e7f,
++	0x0d7f, 0x0c7f, 0x2091, 0x8001, 0x2001, 0x4005, 0x0078, 0x15b0,
++	0x795c, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x00c8, 0x15a6, 0x795e,
++	0x0078, 0x15ae, 0x795c, 0x71c6, 0x0078, 0x15ae, 0x7900, 0x71c6,
++	0x71c4, 0x7902, 0x0078, 0x15ae, 0x7900, 0x71c6, 0x0078, 0x15ae,
++	0x7904, 0x70c4, 0x7806, 0x0078, 0x15ad, 0x7804, 0x70c6, 0x0078,
++	0x15ae, 0xd1fc, 0x00c0, 0x1d98, 0x2011, 0x64c0, 0x0078, 0x1d9a,
++	0x2011, 0x6540, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++	0xa268, 0x6a14, 0xd2b4, 0x0040, 0x1da9, 0x2011, 0x0001, 0x0078,
++	0x1dab, 0x2011, 0x0000, 0x6b0c, 0x6800, 0x70da, 0x0078, 0x15ab,
++	0x780c, 0xd0f4, 0x0040, 0x1dbb, 0x2001, 0x4007, 0x70db, 0x0000,
++	0xa005, 0x0078, 0x1dc6, 0xd0fc, 0x0040, 0x1dc5, 0x2001, 0x4007,
++	0x70db, 0x0001, 0xa005, 0x0078, 0x1dc6, 0xa006, 0x007c, 0x780c,
++	0xd0f4, 0x0040, 0x1dd1, 0x2001, 0x4007, 0x70db, 0x0000, 0x0078,
++	0x1dd2, 0xa006, 0x007c, 0x780c, 0xd0fc, 0x0040, 0x1ddd, 0x2001,
++	0x4007, 0x70db, 0x0001, 0x0078, 0x1dde, 0xa006, 0x007c, 0xac80,
++	0x0001, 0x1078, 0x205e, 0x007c, 0x7112, 0x7003, 0x0001, 0x7007,
++	0x0001, 0x2099, 0x0030, 0x20a9, 0x0020, 0xac80, 0x0001, 0x20a0,
++	0x7008, 0xd0fc, 0x0040, 0x1df0, 0x7007, 0x0002, 0xa08c, 0x01e0,
++	0x00c0, 0x1e20, 0x53a5, 0x7888, 0xa005, 0x0040, 0x1e1f, 0x1078,
++	0x1e25, 0x0040, 0x1e0d, 0x2c00, 0x788e, 0x20a9, 0x0020, 0xac80,
++	0x0001, 0x20a0, 0x53a5, 0x0078, 0x1e1f, 0x788b, 0x0000, 0x7218,
++	0x731c, 0x7420, 0x7524, 0xa292, 0x0040, 0xa39b, 0x0000, 0xa4a3,
++	0x0000, 0xa5ab, 0x0000, 0x721a, 0x731e, 0x7422, 0x7526, 0xa006,
++	0x7003, 0x0000, 0x7007, 0x0004, 0x007c, 0x2091, 0x8000, 0x7840,
++	0xa065, 0x0040, 0x1e2f, 0x2c04, 0x7842, 0x2063, 0x0000, 0x2091,
++	0x8001, 0x007c, 0x0f7e, 0x2079, 0x6000, 0x7840, 0xa06d, 0x0040,
++	0x1e41, 0x2d04, 0x7842, 0x6803, 0x0000, 0x6807, 0x0000, 0x680b,
++	0x0000, 0x0f7f, 0x007c, 0x2091, 0x8000, 0x0f7e, 0x2079, 0x6000,
++	0x7840, 0x2062, 0x2c00, 0xa005, 0x00c0, 0x1e50, 0x1078, 0x2bfa,
++	0x7842, 0x0f7f, 0x2091, 0x8001, 0x007c, 0x0f7e, 0x2079, 0x6000,
++	0x7840, 0x206a, 0x2d00, 0x7842, 0x0f7f, 0x007c, 0x2011, 0xac00,
++	0x7a42, 0x7bc8, 0x8319, 0x0040, 0x1e6b, 0xa280, 0x0037, 0x2012,
++	0x2010, 0x0078, 0x1e62, 0x2013, 0x0000, 0x007c, 0x017e, 0x2069,
++	0x85c0, 0xd7fc, 0x00c0, 0x1e76, 0x2069, 0x65c0, 0xa784, 0x0f00,
++	0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105,
++	0xad68, 0x017f, 0x007c, 0x1078, 0x1e6e, 0x2900, 0x682a, 0x2a00,
++	0x682e, 0x6808, 0xa084, 0xf9ef, 0xa80d, 0x690a, 0x0e7e, 0xd7fc,
++	0x00c0, 0x1e98, 0x2009, 0x6054, 0x2071, 0x6040, 0x0078, 0x1e9c,
++	0x2009, 0x6094, 0x2071, 0x6080, 0x210c, 0x6804, 0xa005, 0x0040,
++	0x1eac, 0xa116, 0x00c0, 0x1eac, 0x2060, 0x6000, 0x6806, 0x017e,
++	0x200b, 0x0000, 0x0078, 0x1eaf, 0x2009, 0x0000, 0x017e, 0x6804,
++	0xa065, 0x0040, 0x1ebe, 0x6000, 0x6806, 0x1078, 0x1ef5, 0x1078,
++	0x2240, 0x6810, 0x8001, 0x6812, 0x00c0, 0x1eaf, 0x017f, 0x6902,
++	0x6906, 0x2d00, 0x2060, 0x1078, 0x2d8b, 0x0e7f, 0x007c, 0xa065,
++	0x0040, 0x1eda, 0x2008, 0x609c, 0xa005, 0x0040, 0x1ed5, 0x2062,
++	0x609f, 0x0000, 0xa065, 0x0078, 0x1ecb, 0x2079, 0x6000, 0x7840,
++	0x7942, 0x2062, 0x007c, 0xa065, 0x0040, 0x1ef4, 0x2008, 0x609c,
++	0xa005, 0x0040, 0x1ee9, 0x2062, 0x609f, 0x0000, 0xa065, 0x0078,
++	0x1edf, 0x0f7e, 0x2079, 0x6000, 0x2091, 0x8000, 0x7840, 0x7942,
++	0x0f7f, 0x2062, 0x2091, 0x8001, 0x007c, 0x6007, 0x0103, 0x608f,
++	0x0000, 0x20a9, 0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000,
++	0x40a4, 0x6828, 0x601a, 0x682c, 0x6022, 0x007c, 0x0e7e, 0xd7fc,
++	0x00c0, 0x1f10, 0x2071, 0x6040, 0x2031, 0x60c0, 0x0078, 0x1f14,
++	0x2071, 0x6080, 0x2031, 0x62c0, 0x7054, 0xa08c, 0x0200, 0x00c0,
++	0x1f1e, 0xa608, 0x2d0a, 0x8000, 0x7056, 0xa006, 0x0e7f, 0x007c,
++	0x0f7e, 0xd7fc, 0x00c0, 0x1f28, 0x2079, 0x6040, 0x0078, 0x1f2a,
++	0x2079, 0x6080, 0x1078, 0x1e6e, 0x2091, 0x8000, 0x6804, 0x7806,
++	0xa065, 0x0040, 0x1f77, 0x0078, 0x1f3b, 0x2c00, 0x7806, 0x6000,
++	0xa065, 0x0040, 0x1f77, 0x6010, 0xa306, 0x00c0, 0x1f35, 0x600c,
++	0xa206, 0x00c0, 0x1f35, 0x2c28, 0x7850, 0xac06, 0x00c0, 0x1f4a,
++	0x0078, 0x1f74, 0x6804, 0xac06, 0x00c0, 0x1f58, 0x6000, 0x2060,
++	0x6806, 0xa005, 0x00c0, 0x1f58, 0x6803, 0x0000, 0x0078, 0x1f62,
++	0x6400, 0x7804, 0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x1f62,
++	0x2c00, 0x6802, 0x2560, 0x0f7f, 0x1078, 0x1ef5, 0x0f7e, 0x601b,
++	0x0005, 0x6023, 0x0020, 0x0f7f, 0x1078, 0x2240, 0x0f7e, 0x6810,
++	0x8001, 0x1050, 0x2bfa, 0x6812, 0xa085, 0xffff, 0xa005, 0x0f7f,
++	0x007c, 0x077e, 0x2700, 0x2039, 0x0000, 0xd0fc, 0x0040, 0x1f81,
++	0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x2091,
++	0x8000, 0x1078, 0x1e83, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1f89,
++	0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0,
++	0x1f89, 0x2091, 0x8001, 0x077f, 0x007c, 0x2061, 0x0000, 0x6018,
++	0xa084, 0x0001, 0x00c0, 0x1fbe, 0x7808, 0xd08c, 0x0040, 0x1faf,
++	0xc08c, 0x780a, 0xc7fc, 0x2069, 0x6040, 0x0078, 0x1fb4, 0xc08d,
++	0x780a, 0x2069, 0x6080, 0xc7fd, 0x2091, 0x8000, 0x6818, 0x681b,
++	0x0000, 0x2091, 0x8001, 0xa005, 0x00c0, 0x1fbf, 0x007c, 0xa08c,
++	0xfff0, 0x0040, 0x1fc5, 0x1078, 0x2bfa, 0x0079, 0x1fc7, 0x1fd7,
++	0x1fda, 0x1fe0, 0x1fe4, 0x1fd8, 0x1fe8, 0x1fee, 0x1fd8, 0x1fd8,
++	0x2193, 0x21c4, 0x21c8, 0x21ce, 0x1fd8, 0x1fd8, 0x1fd8, 0x007c,
++	0x1078, 0x2bfa, 0x1078, 0x1f79, 0x2001, 0x8001, 0x0078, 0x21e3,
++	0x2001, 0x8003, 0x0078, 0x21e3, 0x2001, 0x8004, 0x0078, 0x21e3,
++	0x1078, 0x1f79, 0x2001, 0x8006, 0x0078, 0x21e3, 0x2001, 0x8007,
++	0x0078, 0x21e3, 0x2030, 0x2138, 0xa782, 0x0021, 0x0048, 0x1ffa,
++	0x2009, 0x0020, 0x2600, 0x1078, 0x2014, 0x00c0, 0x2013, 0xa7ba,
++	0x0020, 0x0048, 0x2012, 0x0040, 0x2012, 0x2708, 0xa6b0, 0x0020,
++	0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000,
++	0x0078, 0x1ff4, 0xa006, 0x007c, 0x81ff, 0x0040, 0x2039, 0x2099,
++	0x0030, 0x20a0, 0x700c, 0xa084, 0x03ff, 0x0040, 0x2026, 0x7007,
++	0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x2021, 0x21a8, 0x810b,
++	0x7112, 0x7003, 0x0001, 0x7007, 0x0001, 0x7008, 0x800b, 0x00c8,
++	0x202d, 0x7007, 0x0002, 0xa08c, 0x01e0, 0x00c0, 0x2039, 0x53a5,
++	0xa006, 0x7003, 0x0000, 0x007c, 0x2030, 0x2138, 0xa782, 0x0021,
++	0x0048, 0x2044, 0x2009, 0x0020, 0x2600, 0x1078, 0x205e, 0x00c0,
++	0x205d, 0xa7ba, 0x0020, 0x0048, 0x205c, 0x0040, 0x205c, 0x2708,
++	0xa6b0, 0x0020, 0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000,
++	0xa5a9, 0x0000, 0x0078, 0x203e, 0xa006, 0x007c, 0x81ff, 0x0040,
++	0x2096, 0x2098, 0x20a1, 0x0030, 0x700c, 0xa084, 0x03ff, 0x0040,
++	0x2069, 0x21a8, 0x810b, 0x7112, 0x7018, 0x007e, 0x701c, 0x007e,
++	0x7020, 0x007e, 0x7024, 0x007e, 0x721a, 0x731e, 0x7422, 0x7526,
++	0x7003, 0x0000, 0x53a6, 0x7007, 0x0001, 0x7010, 0xa084, 0xf000,
++	0x0040, 0x2086, 0x7007, 0x0008, 0x0078, 0x208a, 0x7108, 0x8103,
++	0x00c8, 0x207d, 0x007f, 0x7026, 0x007f, 0x7022, 0x007f, 0x701e,
++	0x007f, 0x701a, 0x7007, 0x0002, 0xa184, 0x01e0, 0x7003, 0x0000,
++	0x7007, 0x0004, 0x007c, 0x0e7e, 0x6914, 0xd1fc, 0x0040, 0x20a4,
++	0x2071, 0x6080, 0x0078, 0x20a6, 0x2071, 0x6040, 0x2d08, 0x70b4,
++	0x6802, 0xa005, 0x00c0, 0x20ad, 0x71ba, 0x71b6, 0x0e7f, 0x007c,
++	0x0f7e, 0x6114, 0xd1fc, 0x0040, 0x20b9, 0x2079, 0x6080, 0x0078,
++	0x20bb, 0x2079, 0x6040, 0x2c08, 0x78b4, 0x6002, 0xa005, 0x00c0,
++	0x20c2, 0x79ba, 0x79b6, 0x0f7f, 0x007c, 0x2091, 0x8000, 0x0f7e,
++	0x6114, 0xd1fc, 0x0040, 0x20d0, 0x2079, 0x6080, 0x0078, 0x20d2,
++	0x2079, 0x6040, 0x6003, 0x0000, 0x2c08, 0x78b8, 0xa065, 0x00c0,
++	0x20dc, 0x79b6, 0x0078, 0x20dd, 0x6102, 0x79ba, 0x0f7f, 0x2091,
++	0x8001, 0x1078, 0x2885, 0x007c, 0x70b4, 0xa06d, 0x0040, 0x20ef,
++	0x6800, 0x70b6, 0xa005, 0x00c0, 0x20ee, 0x70ba, 0x8dff, 0x007c,
++	0x0d7e, 0x0c7e, 0x0f7e, 0xd3fc, 0x0040, 0x20fa, 0x2079, 0x6080,
++	0x0078, 0x20fc, 0x2079, 0x6040, 0xaf80, 0x002d, 0x2060, 0x6000,
++	0xa005, 0x0040, 0x2125, 0x2068, 0x6814, 0xa306, 0x00c0, 0x210e,
++	0x6828, 0xa084, 0x00ff, 0xa406, 0x0040, 0x2111, 0x2d60, 0x0078,
++	0x20ff, 0x6800, 0xa005, 0x6002, 0x00c0, 0x211d, 0xaf80, 0x002d,
++	0xac06, 0x0040, 0x211c, 0x2c00, 0x78ba, 0x0d7e, 0x689c, 0xa005,
++	0x0040, 0x2124, 0x1078, 0x1ec7, 0x007f, 0x0f7f, 0x0c7f, 0x0d7f,
++	0xa005, 0x007c, 0x0d7e, 0x0c7e, 0x0f7e, 0xd0fc, 0x0040, 0x2134,
++	0x2079, 0x6080, 0x0078, 0x2136, 0x2079, 0x6040, 0xaf80, 0x002d,
++	0x2060, 0x6000, 0xa005, 0x0040, 0x215b, 0x2068, 0x6814, 0xa084,
++	0x00ff, 0xa306, 0x0040, 0x2147, 0x2d60, 0x0078, 0x2139, 0x6800,
++	0xa005, 0x6002, 0x00c0, 0x2153, 0xaf80, 0x002d, 0xac06, 0x0040,
++	0x2152, 0x2c00, 0x78ba, 0x0d7e, 0x689c, 0xa005, 0x0040, 0x215a,
++	0x1078, 0x1ec7, 0x007f, 0x0f7f, 0x0c7f, 0x0d7f, 0xa005, 0x007c,
++	0x0d7e, 0x0c7e, 0x0f7e, 0xd3fc, 0x0040, 0x216a, 0x2079, 0x6080,
++	0x0078, 0x216c, 0x2079, 0x6040, 0xaf80, 0x002d, 0x2060, 0x6000,
++	0xa06d, 0x0040, 0x218e, 0x6814, 0xa306, 0x0040, 0x217a, 0x2d60,
++	0x0078, 0x216f, 0x6800, 0xa005, 0x6002, 0x00c0, 0x2186, 0xaf80,
++	0x002d, 0xac06, 0x0040, 0x2185, 0x2c00, 0x78ba, 0x0d7e, 0x689c,
++	0xa005, 0x0040, 0x218d, 0x1078, 0x1ec7, 0x007f, 0x0f7f, 0x0c7f,
++	0x0d7f, 0xa005, 0x007c, 0x2091, 0x8000, 0xd7fc, 0x00c0, 0x219c,
++	0x2069, 0x6040, 0x0078, 0x219e, 0x2069, 0x6080, 0x6800, 0xa086,
++	0x0000, 0x0040, 0x21a8, 0x2091, 0x8001, 0x681b, 0x0009, 0x007c,
++	0x6878, 0xd7fc, 0x00c0, 0x21ae, 0x0078, 0x21af, 0xc0fd, 0xa0bc,
++	0xff00, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x1078,
++	0x1e83, 0x8738, 0xa784, 0x001f, 0x00c0, 0x21b7, 0x2091, 0x8001,
++	0x2001, 0x800a, 0x0078, 0x21e3, 0x2001, 0x800c, 0x0078, 0x21e3,
++	0x1078, 0x1f79, 0x2001, 0x800d, 0x0078, 0x21e3, 0x780c, 0xd0e4,
++	0x00c0, 0x21e1, 0xd0ec, 0x0040, 0x21db, 0xd7fc, 0x0040, 0x21db,
++	0x78e8, 0x0078, 0x21dc, 0x78e4, 0x70c6, 0x2001, 0x800e, 0x0078,
++	0x21e3, 0x0078, 0x1fd8, 0x70c2, 0xd7fc, 0x00c0, 0x21eb, 0x70db,
++	0x0000, 0x0078, 0x21ed, 0x70db, 0x0001, 0x2061, 0x0000, 0x601b,
++	0x0001, 0x2091, 0x4080, 0x007c, 0xac80, 0x0001, 0x81ff, 0x0040,
++	0x221f, 0x2099, 0x0030, 0x20a0, 0x700c, 0xa084, 0x03ff, 0x0040,
++	0x2201, 0x7018, 0x007e, 0x701c, 0x007e, 0x7020, 0x007e, 0x7024,
++	0x007e, 0x7112, 0x81ac, 0x721a, 0x731e, 0x7422, 0x7526, 0x7003,
++	0x0001, 0x7007, 0x0001, 0x7008, 0x800b, 0x00c8, 0x2213, 0x7007,
++	0x0002, 0xa08c, 0x01e0, 0x00c0, 0x221f, 0x53a5, 0xa006, 0x7003,
++	0x0000, 0x7007, 0x0004, 0x007f, 0x7026, 0x007f, 0x7022, 0x007f,
++	0x701e, 0x007f, 0x701a, 0x007c, 0x2011, 0x0020, 0x2009, 0x0010,
++	0x6b0a, 0x6c0e, 0x6803, 0xfd00, 0x6807, 0x0018, 0x6a1a, 0x2d00,
++	0xa0e8, 0x0008, 0xa290, 0x0004, 0x8109, 0x00c0, 0x2230, 0x007c,
++	0x6004, 0x2c08, 0x2063, 0x0000, 0x7860, 0x8000, 0x7862, 0x7864,
++	0xa005, 0x7966, 0x0040, 0x224f, 0x2c02, 0x0078, 0x2250, 0x796a,
++	0x007c, 0x6807, 0x0103, 0x0c7e, 0x2061, 0x6000, 0x2d08, 0x206b,
++	0x0000, 0x6060, 0x8000, 0x6062, 0x6064, 0xa005, 0x6166, 0x0040,
++	0x2264, 0x2d02, 0x0078, 0x2265, 0x616a, 0x0c7f, 0x007c, 0x2091,
++	0x8000, 0x7860, 0x8001, 0x7862, 0x2c04, 0x786a, 0xa005, 0x00c0,
++	0x2272, 0x7866, 0x2091, 0x8001, 0x609c, 0xa005, 0x0040, 0x228f,
++	0x0c7e, 0x2060, 0x2008, 0x609c, 0xa005, 0x0040, 0x2287, 0x2062,
++	0x609f, 0x0000, 0xa065, 0x609c, 0xa005, 0x00c0, 0x227f, 0x2091,
++	0x8000, 0x7840, 0x7942, 0x2062, 0x2091, 0x8001, 0x0c7f, 0x2091,
++	0x8000, 0x7840, 0x2062, 0x609f, 0x0000, 0x2c00, 0xa005, 0x00c0,
++	0x229b, 0x1078, 0x2bfa, 0x7842, 0x2091, 0x8001, 0x007c, 0x7868,
++	0xa065, 0x0040, 0x22b1, 0x2091, 0x8000, 0x7860, 0x8001, 0x7862,
++	0x2c04, 0x786a, 0xa005, 0x00c0, 0x22af, 0x7866, 0x8000, 0x2091,
++	0x8001, 0x007c, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e,
++	0x00c8, 0x22bb, 0xa200, 0x00f0, 0x22b6, 0x8086, 0x818e, 0x007c,
++	0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x22e1, 0xa11a, 0x00c8,
++	0x22e1, 0x8213, 0x818d, 0x0048, 0x22d4, 0xa11a, 0x00c8, 0x22d5,
++	0x00f0, 0x22c9, 0x0078, 0x22d9, 0xa11a, 0x2308, 0x8210, 0x00f0,
++	0x22c9, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080, 0x007f, 0x157f,
++	0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078, 0x22dd, 0x7d70,
++	0x70d0, 0xa506, 0x0040, 0x237c, 0x7808, 0xd0ec, 0x0040, 0x2304,
++	0x0e7e, 0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0,
++	0x2301, 0x7008, 0x0e7f, 0xa086, 0x0008, 0x0040, 0x2304, 0x0078,
++	0x237c, 0x0e7f, 0x0078, 0x237c, 0x1078, 0x1e25, 0x0040, 0x237c,
++	0x796c, 0x2500, 0x8000, 0xa112, 0x2009, 0x0040, 0x00c8, 0x2313,
++	0xa006, 0x0078, 0x231b, 0x72d0, 0xa206, 0x0040, 0x231b, 0x788b,
++	0x0001, 0x2009, 0x0080, 0x0c7e, 0x1078, 0x1de4, 0x0c7f, 0x0040,
++	0x2364, 0x1078, 0x1e43, 0x788b, 0x0000, 0x7884, 0x8000, 0x7886,
++	0xa086, 0x0002, 0x0040, 0x2342, 0x8507, 0x8004, 0x8004, 0x7978,
++	0xa108, 0x711a, 0x00c8, 0x2340, 0x7974, 0xa189, 0x0000, 0x711e,
++	0x7980, 0xa189, 0x0000, 0x7122, 0x797c, 0xa189, 0x0000, 0x7126,
++	0x0078, 0x237c, 0x6014, 0xd0fc, 0x00c0, 0x234a, 0x2069, 0x6040,
++	0x0078, 0x234c, 0x2069, 0x6080, 0x2091, 0x8000, 0x681b, 0x0002,
++	0x7888, 0xa005, 0x0040, 0x235a, 0x788b, 0x0000, 0x788c, 0x2060,
++	0x0078, 0x2342, 0x7887, 0x0000, 0x78b0, 0xa085, 0x0003, 0x78b2,
++	0x2091, 0x8001, 0x0078, 0x237c, 0x7887, 0x0000, 0x1078, 0x2721,
++	0x6004, 0xa084, 0x000f, 0x1078, 0x237d, 0x7888, 0xa005, 0x0040,
++	0x2378, 0x788c, 0x2060, 0x6004, 0xa084, 0x000f, 0x1078, 0x237d,
++	0x788b, 0x0000, 0x0078, 0x22e7, 0x007c, 0x0079, 0x237f, 0x238f,
++	0x23ad, 0x23cd, 0x238f, 0x23ea, 0x239e, 0x2564, 0x257b, 0x238f,
++	0x23ab, 0x23cb, 0x2434, 0x24aa, 0x2502, 0x2514, 0x257b, 0x2039,
++	0x0400, 0x78c0, 0xa705, 0x78c2, 0x6008, 0xa705, 0x600a, 0x1078,
++	0x25ff, 0x609c, 0x78be, 0x1078, 0x2709, 0x007c, 0x78c0, 0xa084,
++	0x0100, 0x0040, 0x23a5, 0x0078, 0x238f, 0x601c, 0xa085, 0x0080,
++	0x601e, 0x0078, 0x23b4, 0x1078, 0x2750, 0x78c0, 0xa084, 0x0100,
++	0x0040, 0x23b4, 0x0078, 0x238f, 0x78c3, 0x0000, 0x6004, 0x8007,
++	0xa084, 0x00ff, 0x78b6, 0x8001, 0x0040, 0x23c8, 0x1078, 0x25ff,
++	0x0040, 0x23c8, 0x78c0, 0xa085, 0x0100, 0x78c2, 0x0078, 0x23ca,
++	0x0078, 0x261f, 0x007c, 0x1078, 0x274c, 0x78c0, 0xa08c, 0x0e00,
++	0x00c0, 0x23d6, 0xa084, 0x0100, 0x00c0, 0x23d8, 0x0078, 0x238f,
++	0x1078, 0x25ff, 0x00c0, 0x23e9, 0x6104, 0xa18c, 0x00ff, 0xa186,
++	0x0007, 0x0040, 0x25c0, 0xa186, 0x000f, 0x0040, 0x25c0, 0x0078,
++	0x261f, 0x007c, 0x78c0, 0xa084, 0x0100, 0x0040, 0x23f1, 0x0078,
++	0x238f, 0x78c3, 0x0000, 0x6714, 0x1078, 0x1e6e, 0x2011, 0x0001,
++	0x20a9, 0x0001, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0040, 0x2416,
++	0x2011, 0x0001, 0xa7bc, 0xff00, 0x20a9, 0x0020, 0xa08e, 0x0001,
++	0x0040, 0x2416, 0xa7bc, 0x8000, 0x2011, 0x0002, 0x20a9, 0x0100,
++	0xa08e, 0x0002, 0x0040, 0x2416, 0x0078, 0x2431, 0x157e, 0x1078,
++	0x1e6e, 0x157f, 0x2091, 0x8000, 0x682b, 0x0000, 0x682f, 0x0000,
++	0x6808, 0xa084, 0xffde, 0x680a, 0xade8, 0x0010, 0x2091, 0x8001,
++	0x00f0, 0x241a, 0x8211, 0x0040, 0x2431, 0x20a9, 0x0100, 0x0078,
++	0x241a, 0x1078, 0x1e43, 0x007c, 0x6114, 0x1078, 0x276d, 0x6900,
++	0xa184, 0x0001, 0x0040, 0x244e, 0x6028, 0xa084, 0x00ff, 0x00c0,
++	0x25df, 0x6800, 0xa084, 0x0001, 0x0040, 0x25e7, 0x6803, 0x0000,
++	0x680b, 0x0000, 0x6807, 0x0000, 0x0078, 0x25ef, 0x2011, 0x0001,
++	0x6020, 0xd0f4, 0x0040, 0x2456, 0xa295, 0x0002, 0xd0c4, 0x0040,
++	0x245b, 0xa295, 0x0008, 0xd0cc, 0x0040, 0x2460, 0xa295, 0x0400,
++	0x601c, 0xa084, 0x0002, 0x0040, 0x2467, 0xa295, 0x0004, 0x602c,
++	0xa08c, 0x00ff, 0xa182, 0x0002, 0x0048, 0x25eb, 0xa182, 0x001b,
++	0x00c8, 0x25eb, 0x0040, 0x25eb, 0x690e, 0x602c, 0x8007, 0xa08c,
++	0x00ff, 0xa182, 0x0002, 0x0048, 0x25eb, 0xa182, 0x001b, 0x00c8,
++	0x25eb, 0x0040, 0x25eb, 0x6912, 0x6134, 0xa184, 0x000f, 0x0040,
++	0x2491, 0x8000, 0xd0a4, 0x0040, 0x248e, 0x8001, 0xa18c, 0xfff0,
++	0xa10d, 0x6922, 0x6030, 0xa005, 0x00c0, 0x2498, 0x2001, 0x001e,
++	0x8000, 0x6816, 0x6028, 0xa084, 0x00ff, 0x0040, 0x25e7, 0x6806,
++	0x6028, 0x8007, 0xa084, 0x00ff, 0x0040, 0x25e7, 0x680a, 0x6a02,
++	0x0078, 0x25ef, 0x6014, 0xd0fc, 0x00c0, 0x24b2, 0x2001, 0x6064,
++	0x0078, 0x24b4, 0x2001, 0x60a4, 0x2004, 0xa084, 0x8000, 0x0040,
++	0x25e7, 0x6114, 0x1078, 0x276d, 0x2091, 0x8000, 0x6a04, 0x6b08,
++	0x6418, 0xa484, 0x0003, 0x0040, 0x24d8, 0x6128, 0xa18c, 0x00ff,
++	0x8001, 0x00c0, 0x24d1, 0x2100, 0xa210, 0x0048, 0x24fe, 0x0078,
++	0x24d8, 0x8001, 0x00c0, 0x24fe, 0x2100, 0xa212, 0x0048, 0x24fe,
++	0xa484, 0x000c, 0x0040, 0x24f2, 0x6128, 0x810f, 0xa18c, 0x00ff,
++	0xa082, 0x0004, 0x00c0, 0x24ea, 0x2100, 0xa318, 0x0048, 0x24fe,
++	0x0078, 0x24f2, 0xa082, 0x0004, 0x00c0, 0x24fe, 0x2100, 0xa31a,
++	0x0048, 0x24fe, 0x6030, 0xa005, 0x0040, 0x24f8, 0x8000, 0x6816,
++	0x6a06, 0x6b0a, 0x2091, 0x8001, 0x0078, 0x25ef, 0x2091, 0x8001,
++	0x0078, 0x25eb, 0x6114, 0x1078, 0x276d, 0x2091, 0x8000, 0x6b08,
++	0x8318, 0x0048, 0x2510, 0x6b0a, 0x2091, 0x8001, 0x0078, 0x25fd,
++	0x2091, 0x8001, 0x0078, 0x25eb, 0x6024, 0x8007, 0xa084, 0x00ff,
++	0x0040, 0x253a, 0xa086, 0x0080, 0x00c0, 0x2562, 0x20a9, 0x0008,
++	0x6014, 0xd0fc, 0x00c0, 0x2528, 0x2069, 0xa7e0, 0x0078, 0x252a,
++	0x2069, 0xa900, 0x2091, 0x8000, 0x6800, 0xa084, 0xfcff, 0x6802,
++	0xade8, 0x0009, 0x0070, 0x2536, 0x0078, 0x252c, 0x2091, 0x8001,
++	0x0078, 0x25ef, 0x6028, 0xa015, 0x0040, 0x2562, 0x6114, 0x1078,
++	0x276d, 0x0d7e, 0xade8, 0x0007, 0x2091, 0x8000, 0x6800, 0xa00d,
++	0x0040, 0x255f, 0xa206, 0x0040, 0x2550, 0x2168, 0x0078, 0x2546,
++	0x0c7e, 0x2160, 0x6000, 0x6802, 0x1078, 0x1e43, 0x0c7f, 0x0d7f,
++	0x6808, 0x8000, 0x680a, 0x2091, 0x8001, 0x0078, 0x25fd, 0x2091,
++	0x8001, 0x0d7f, 0x0078, 0x25e7, 0x6114, 0x1078, 0x276d, 0x6800,
++	0xa084, 0x0001, 0x0040, 0x25d7, 0x2091, 0x8000, 0x6a04, 0x8210,
++	0x0048, 0x2577, 0x6a06, 0x2091, 0x8001, 0x0078, 0x25fd, 0x2091,
++	0x8001, 0x0078, 0x25eb, 0x6114, 0x1078, 0x276d, 0x60ce, 0x60bb,
++	0x0000, 0x6018, 0xa08c, 0xff00, 0x6820, 0xa084, 0x00ff, 0xa105,
++	0x601a, 0x6900, 0xa184, 0x0008, 0x0040, 0x2592, 0x6020, 0xa085,
++	0x0100, 0x6022, 0xa184, 0x0001, 0x0040, 0x25e7, 0xa184, 0x0100,
++	0x00c0, 0x25d3, 0xa184, 0x0200, 0x00c0, 0x25cf, 0x681c, 0xa005,
++	0x00c0, 0x25db, 0x6004, 0xa084, 0x00ff, 0xa086, 0x000f, 0x00c0,
++	0x25ab, 0x1078, 0x2750, 0x78c3, 0x0000, 0x6004, 0x8007, 0xa084,
++	0x00ff, 0x78b6, 0x8001, 0x609f, 0x0000, 0x0040, 0x25c0, 0x1078,
++	0x25ff, 0x0040, 0x25c0, 0x78c0, 0xa085, 0x0100, 0x78c2, 0x007c,
++	0x78bb, 0x0000, 0x78bf, 0x0000, 0x6024, 0xa084, 0xff00, 0x6026,
++	0x1078, 0x4611, 0x00c0, 0x25cd, 0x007c, 0x0078, 0x20c5, 0x2009,
++	0x0017, 0x0078, 0x25f1, 0x2009, 0x000e, 0x0078, 0x25f1, 0x2009,
++	0x0007, 0x0078, 0x25f1, 0x2009, 0x0035, 0x0078, 0x25f1, 0x2009,
++	0x003e, 0x0078, 0x25f1, 0x2009, 0x0004, 0x0078, 0x25f1, 0x2009,
++	0x0006, 0x0078, 0x25f1, 0x2009, 0x0016, 0x0078, 0x25f1, 0x2009,
++	0x0001, 0x6024, 0xa084, 0xff00, 0xa105, 0x6026, 0x2091, 0x8000,
++	0x1078, 0x2240, 0x2091, 0x8001, 0x007c, 0x0078, 0x1e43, 0x609f,
++	0x0000, 0x78b8, 0xa06d, 0x2c00, 0x78ba, 0x00c0, 0x260a, 0x78be,
++	0x0078, 0x2612, 0x689e, 0x2d00, 0x6002, 0x78bc, 0xad06, 0x00c0,
++	0x2612, 0x6002, 0x78b4, 0x8001, 0x78b6, 0x00c0, 0x261e, 0x78c0,
++	0xa084, 0xfeff, 0x78c2, 0x78bc, 0x2060, 0xa006, 0x007c, 0x0e7e,
++	0xa02e, 0x2530, 0x65ae, 0x65b2, 0x601c, 0x60a2, 0x2048, 0xa984,
++	0xe1ff, 0x601e, 0xa984, 0x0060, 0x0040, 0x2630, 0x1078, 0x564a,
++	0x6596, 0x65a6, 0x669a, 0x66aa, 0x6714, 0x2071, 0x6080, 0xd7fc,
++	0x00c0, 0x263c, 0x2071, 0x6040, 0xa784, 0x0f00, 0x800b, 0xa784,
++	0x001f, 0x0040, 0x2647, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105,
++	0x71e0, 0xa168, 0x2700, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003,
++	0x8003, 0x71e4, 0xa100, 0x60c6, 0x2091, 0x8000, 0x780c, 0xd0c4,
++	0x0040, 0x266c, 0xd0ec, 0x0040, 0x2668, 0xd7fc, 0x00c0, 0x2665,
++	0xd0f4, 0x00c0, 0x2673, 0x0078, 0x266c, 0xd0fc, 0x00c0, 0x2673,
++	0x7808, 0xd0f4, 0x00c0, 0x2673, 0x6e08, 0xd684, 0x0040, 0x26a1,
++	0xd9fc, 0x00c0, 0x26a1, 0x2091, 0x8001, 0x1078, 0x1ef5, 0x2091,
++	0x8000, 0x1078, 0x2240, 0x2091, 0x8001, 0x78bb, 0x0000, 0x78bf,
++	0x0000, 0x780c, 0xd0e4, 0x00c0, 0x2707, 0x780c, 0xd0c4, 0x0040,
++	0x2707, 0xd0ec, 0x0040, 0x2699, 0xd7fc, 0x00c0, 0x2694, 0xd0f4,
++	0x00c0, 0x269d, 0x0078, 0x2707, 0xd0fc, 0x00c0, 0x269d, 0x0078,
++	0x2707, 0x7808, 0xd0f4, 0x0040, 0x2707, 0x601b, 0x0021, 0x0078,
++	0x2707, 0x6024, 0xa096, 0x0001, 0x00c0, 0x26a8, 0x8000, 0x6026,
++	0x6a10, 0x6814, 0xa202, 0x0048, 0x26b7, 0x0040, 0x26b7, 0x2091,
++	0x8001, 0x2039, 0x0200, 0x1078, 0x2709, 0x0078, 0x2707, 0x2c08,
++	0xd9fc, 0x0040, 0x26df, 0x6800, 0xa065, 0x0040, 0x26df, 0x6a04,
++	0x7000, 0xa084, 0x0002, 0x0040, 0x26d5, 0x7050, 0xa206, 0x00c0,
++	0x26d5, 0x6b04, 0x2160, 0x2304, 0x6002, 0xa005, 0x00c0, 0x26d1,
++	0x6902, 0x2260, 0x6102, 0x0078, 0x26eb, 0x2d00, 0x2060, 0x1078,
++	0x2d8b, 0x6e08, 0x2160, 0x6202, 0x6906, 0x0078, 0x26eb, 0x6800,
++	0x6902, 0xa065, 0x0040, 0x26e7, 0x6102, 0x0078, 0x26e8, 0x6906,
++	0x2160, 0x6003, 0x0000, 0x2160, 0xd9fc, 0x0040, 0x26f6, 0xa6b4,
++	0xffdc, 0x6e0a, 0x682b, 0x0000, 0x682f, 0x0000, 0x6810, 0x8000,
++	0x6812, 0x2091, 0x8001, 0xd6b4, 0x0040, 0x2703, 0xa6b6, 0x0040,
++	0x6e0a, 0x1078, 0x1f06, 0x78bf, 0x0000, 0x78bb, 0x0000, 0x0e7f,
++	0x007c, 0x6008, 0xa705, 0x600a, 0x2091, 0x8000, 0x1078, 0x2240,
++	0x2091, 0x8001, 0x78bc, 0xa065, 0x0040, 0x271c, 0x609c, 0x78be,
++	0x609f, 0x0000, 0x0078, 0x270c, 0x78bb, 0x0000, 0x78bf, 0x0000,
++	0x007c, 0x796c, 0x7870, 0x7b88, 0xd384, 0x0040, 0x272b, 0x8000,
++	0xa112, 0x0048, 0x2730, 0xc384, 0x8000, 0xa112, 0x00c8, 0x273d,
++	0x7a78, 0x721a, 0x7a74, 0x721e, 0x7a80, 0x7222, 0x7a7c, 0x7226,
++	0xa006, 0xd384, 0x0040, 0x273d, 0x8000, 0x7872, 0x70d2, 0x7814,
++	0xa005, 0x0040, 0x274b, 0x8001, 0x7816, 0x00c0, 0x274b, 0x0068,
++	0x274b, 0x2091, 0x4080, 0x007c, 0x2039, 0x2764, 0x0078, 0x2752,
++	0x2039, 0x276a, 0x2704, 0xa005, 0x0040, 0x2763, 0xac00, 0x2068,
++	0x6908, 0x6810, 0x6912, 0x680a, 0x690c, 0x6814, 0x6916, 0x680e,
++	0x8738, 0x0078, 0x2752, 0x007c, 0x0003, 0x0009, 0x000f, 0x0015,
++	0x001b, 0x0000, 0x0015, 0x001b, 0x0000, 0x0c7e, 0x6014, 0x1078,
++	0x47fa, 0x2c68, 0x0c7f, 0x007c, 0x78af, 0x0000, 0x2009, 0x6001,
++	0x2104, 0xd084, 0x0040, 0x27a3, 0x6004, 0xa086, 0x0103, 0x00c0,
++	0x27a3, 0x6114, 0x6018, 0xa105, 0x00c0, 0x27a3, 0x0d7e, 0x2069,
++	0x0000, 0x6818, 0xd084, 0x00c0, 0x27a2, 0x600c, 0x70c6, 0x6010,
++	0x70ca, 0x70c3, 0x8020, 0x681b, 0x0001, 0x2091, 0x4080, 0x0d7f,
++	0x1078, 0x2267, 0x0068, 0x27d7, 0x7868, 0xa065, 0x00c0, 0x2776,
++	0x0078, 0x27d7, 0x0d7f, 0x1078, 0x27da, 0x0040, 0x27d2, 0x6204,
++	0xa294, 0x00ff, 0xa296, 0x0003, 0x0040, 0x27b5, 0x6204, 0xa296,
++	0x0110, 0x00c0, 0x27c3, 0x78af, 0x0001, 0x6204, 0xa294, 0xff00,
++	0x8217, 0x8211, 0x0040, 0x27c3, 0x85ff, 0x00c0, 0x27d2, 0x8210,
++	0xa202, 0x00c8, 0x27d2, 0x057e, 0x1078, 0x27e9, 0x057f, 0x00c0,
++	0x27d2, 0x8528, 0x78ac, 0xa005, 0x00c0, 0x27d2, 0x7868, 0xa065,
++	0x00c0, 0x2776, 0x85ff, 0x0040, 0x27d9, 0x2091, 0x4080, 0x7894,
++	0x70d6, 0x007c, 0x7b90, 0x7994, 0x70d4, 0xa102, 0x00c0, 0x27e3,
++	0x2300, 0xa005, 0x007c, 0x0048, 0x27e7, 0xa302, 0x007c, 0x8002,
++	0x007c, 0xa184, 0xff00, 0x0040, 0x27f6, 0x810f, 0x810c, 0x810c,
++	0x8004, 0x8004, 0x8007, 0xa100, 0x0078, 0x27f9, 0x8107, 0x8004,
++	0x8004, 0x7a9c, 0x7b98, 0x7ca4, 0x7da0, 0xa210, 0xa006, 0xa319,
++	0xa421, 0xa529, 0x2009, 0x0020, 0x6004, 0xa086, 0x0103, 0x00c0,
++	0x280f, 0x6028, 0xa005, 0x00c0, 0x280f, 0x2009, 0x000c, 0x1078,
++	0x1ddf, 0x0040, 0x2832, 0x78a8, 0x8000, 0x78aa, 0xa086, 0x0002,
++	0x00c0, 0x2840, 0x6014, 0xd0fc, 0x00c0, 0x2822, 0x2069, 0x6040,
++	0x0078, 0x2824, 0x2069, 0x6080, 0x2091, 0x8000, 0x681b, 0x0003,
++	0x78ab, 0x0000, 0x78b0, 0xa085, 0x0300, 0x78b2, 0x2091, 0x8001,
++	0x0078, 0x2840, 0x78ab, 0x0000, 0x1078, 0x2267, 0x7990, 0x7894,
++	0x8000, 0xa10a, 0x00c8, 0x283d, 0xa006, 0x7896, 0x70d6, 0xa006,
++	0x2071, 0x0010, 0x2091, 0x8001, 0x007c, 0x2138, 0xd7fc, 0x00c0,
++	0x284d, 0x2009, 0x605a, 0x0078, 0x284f, 0x2009, 0x609a, 0x2091,
++	0x8000, 0x200a, 0x0f7e, 0xd7fc, 0x00c0, 0x2866, 0x2009, 0x6040,
++	0x2001, 0x6002, 0x2004, 0xd0ec, 0x0040, 0x2862, 0x2079, 0x0100,
++	0x0078, 0x286a, 0x2079, 0x0200, 0x0078, 0x286a, 0x2009, 0x6080,
++	0x2079, 0x0100, 0x2104, 0xa086, 0x0000, 0x00c0, 0x2883, 0xd7fc,
++	0x00c0, 0x2876, 0x2009, 0x6044, 0x0078, 0x2878, 0x2009, 0x6084,
++	0x2104, 0xa005, 0x00c0, 0x2883, 0x7830, 0xa084, 0x00c0, 0x00c0,
++	0x2883, 0x781b, 0x004b, 0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x2c00,
++	0xa005, 0x00c0, 0x2890, 0xa188, 0x0005, 0x2104, 0x0078, 0x2891,
++	0x6014, 0xd0fc, 0x00c0, 0x28a4, 0x2071, 0x6040, 0x2001, 0x6002,
++	0x2004, 0xd0ec, 0x0040, 0x28a0, 0x2079, 0x0100, 0x0078, 0x28a8,
++	0x2079, 0x0200, 0x0078, 0x28a8, 0x2071, 0x6080, 0x2079, 0x0100,
++	0x2091, 0x8000, 0x7000, 0xa086, 0x0000, 0x00c0, 0x28da, 0x0078,
++	0x28ce, 0x2c00, 0xa005, 0x00c0, 0x28ba, 0xa188, 0x0005, 0x2104,
++	0x0078, 0x28bb, 0x6014, 0xd0fc, 0x00c0, 0x28cc, 0x2001, 0x6002,
++	0x2004, 0xd0ec, 0x0040, 0x28c8, 0x2079, 0x0100, 0x0078, 0x28ce,
++	0x2079, 0x0200, 0x0078, 0x28ce, 0x2079, 0x0100, 0x7830, 0xa084,
++	0x00c0, 0x00c0, 0x28da, 0x2c00, 0xa005, 0x00c0, 0x28d8, 0x2104,
++	0x781b, 0x004d, 0x2091, 0x8001, 0x0e7f, 0x0f7f, 0x007c, 0x2009,
++	0x0002, 0x2069, 0x6000, 0x6808, 0xd0ec, 0x00c0, 0x2942, 0x2071,
++	0x6080, 0x2079, 0x0100, 0x2021, 0x62bf, 0x784b, 0x000f, 0x0098,
++	0x28fb, 0x7838, 0x0078, 0x28ed, 0x784b, 0x000f, 0x00a8, 0x28fb,
++	0x7838, 0x0078, 0x28f4, 0x20a9, 0x0060, 0x789b, 0x0000, 0x78af,
++	0x0000, 0x78af, 0x0000, 0x00f0, 0x28ff, 0x70ab, 0x009d, 0x2019,
++	0x5df1, 0x1078, 0x2958, 0x680c, 0xd0e4, 0x0040, 0x2919, 0x789b,
++	0x0020, 0x20a9, 0x0010, 0x78af, 0x0000, 0x78af, 0x1020, 0x00f0,
++	0x2913, 0x7003, 0x0000, 0x017e, 0xd18c, 0x2009, 0x0000, 0x0040,
++	0x2922, 0xc1bd, 0x1078, 0x2b31, 0x017f, 0x701c, 0xa084, 0x000f,
++	0x007e, 0x680c, 0xd0e4, 0x007f, 0x00c0, 0x2932, 0xa085, 0x6340,
++	0x0078, 0x2934, 0xa085, 0x62c0, 0x7806, 0x780f, 0xb204, 0x7843,
++	0x00d8, 0x7853, 0x0080, 0x780b, 0x0008, 0x704f, 0x0008, 0x745a,
++	0x7057, 0x0000, 0x8109, 0x0040, 0x2957, 0x2071, 0x6040, 0x6808,
++	0xd0ec, 0x0040, 0x2951, 0x2079, 0x0100, 0x2021, 0x60bf, 0x0078,
++	0x28ed, 0x2079, 0x0200, 0x2021, 0x60bf, 0x0078, 0x28f4, 0x007c,
++	0x137e, 0x147e, 0x157e, 0x047e, 0xaf80, 0x002b, 0x20a0, 0x2304,
++	0xa005, 0x789a, 0x0040, 0x2979, 0x8318, 0x2324, 0x8318, 0x2398,
++	0x24a8, 0xa484, 0xff00, 0x0040, 0x2971, 0xa482, 0x0100, 0x20a9,
++	0x0100, 0x2020, 0x53a6, 0xa005, 0x00c0, 0x2968, 0x3318, 0x0078,
++	0x295f, 0x047f, 0x157f, 0x147f, 0x137f, 0x007c, 0x017e, 0x0f7e,
++	0xd1bc, 0x00c0, 0x2993, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec,
++	0x007f, 0x0040, 0x298f, 0x2079, 0x0100, 0x0078, 0x2995, 0x2079,
++	0x0200, 0x0078, 0x2995, 0x2079, 0x0100, 0xa18c, 0x000f, 0x7804,
++	0xa084, 0xfff0, 0xa105, 0x7806, 0x0f7f, 0x017f, 0x1078, 0x2b31,
++	0x007c, 0xd3fc, 0x00c0, 0x29b4, 0x007e, 0x2001, 0x6002, 0x2004,
++	0xd0ec, 0x007f, 0x0040, 0x29b0, 0x2011, 0x0101, 0x0078, 0x29b6,
++	0x2011, 0x0201, 0x0078, 0x29b6, 0x2011, 0x0101, 0x20a9, 0x0009,
++	0x810b, 0x00f0, 0x29b8, 0xa18c, 0x0e00, 0x2204, 0xa084, 0xf1ff,
++	0xa105, 0x2012, 0x007c, 0x2019, 0x0002, 0x2001, 0x6002, 0x2004,
++	0xd0ec, 0x0040, 0x29d0, 0x8319, 0x2009, 0x0101, 0x0078, 0x29d2,
++	0x2009, 0x0101, 0x20a9, 0x0005, 0x8213, 0x00f0, 0x29d4, 0xa294,
++	0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205, 0x200a, 0x8319, 0x0040,
++	0x29e5, 0x2009, 0x0201, 0x0078, 0x29d2, 0x007c, 0xd3fc, 0x00c0,
++	0x29f9, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040,
++	0x29f5, 0x2011, 0x0101, 0x0078, 0x29fb, 0x2011, 0x0201, 0x0078,
++	0x29fb, 0x2011, 0x0101, 0x20a9, 0x000c, 0x810b, 0x00f0, 0x29fd,
++	0xa18c, 0xf000, 0x2204, 0xa084, 0x0fff, 0xa105, 0x2012, 0x007c,
++	0xd3fc, 0x00c0, 0x2a1b, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec,
++	0x007f, 0x0040, 0x2a17, 0x2011, 0x0102, 0x0078, 0x2a1d, 0x2011,
++	0x0202, 0x0078, 0x2a1d, 0x2011, 0x0102, 0x2204, 0xa084, 0xffcf,
++	0xa105, 0x2012, 0x007c, 0x0c7e, 0xd1bc, 0x00c0, 0x2a37, 0x007e,
++	0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x2a33, 0x2061,
++	0x0100, 0x0078, 0x2a39, 0x2061, 0x0200, 0x0078, 0x2a39, 0x2061,
++	0x0100, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0020, 0x609a, 0x62ac,
++	0x63ac, 0x0c7f, 0x007c, 0x0c7e, 0xd1bc, 0x00c0, 0x2a57, 0x007e,
++	0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x2a53, 0x2061,
++	0x0100, 0x0078, 0x2a59, 0x2061, 0x0200, 0x0078, 0x2a59, 0x2061,
++	0x0100, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0022, 0x609a, 0x60a4,
++	0xa084, 0xffdf, 0x60ae, 0x0c7f, 0x007c, 0x0c7e, 0xd1bc, 0x00c0,
++	0x2a79, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040,
++	0x2a75, 0x2061, 0x0100, 0x0078, 0x2a7b, 0x2061, 0x0200, 0x0078,
++	0x2a7b, 0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0022,
++	0x609a, 0x60a4, 0xa085, 0x0020, 0x60ae, 0x0c7f, 0x007c, 0x0c7e,
++	0xd1bc, 0x00c0, 0x2a9b, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec,
++	0x007f, 0x0040, 0x2a97, 0x2061, 0x0100, 0x0078, 0x2a9d, 0x2061,
++	0x0200, 0x0078, 0x2a9d, 0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003,
++	0xa080, 0x0020, 0x609a, 0x60a4, 0xd2ac, 0x0040, 0x2aa9, 0xc2ac,
++	0xc3f5, 0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018, 0x0c7f, 0x007c,
++	0x2091, 0x8000, 0x0c7e, 0x0e7e, 0x6818, 0xa005, 0x0040, 0x2b0f,
++	0xd1fc, 0x00c0, 0x2abf, 0x2061, 0xa6c0, 0x0078, 0x2ac1, 0x2061,
++	0xa7d0, 0x1078, 0x2b17, 0x0040, 0x2af4, 0x20a9, 0x0101, 0xd1fc,
++	0x00c0, 0x2ace, 0x2061, 0xa5c0, 0x0078, 0x2ad0, 0x2061, 0xa6d0,
++	0x0c7e, 0x1078, 0x2b17, 0x0040, 0x2adb, 0x0c7f, 0x8c60, 0x00f0,
++	0x2ad0, 0x0078, 0x2b0f, 0x007f, 0xd1fc, 0x00c0, 0x2ae5, 0x2071,
++	0x6040, 0xa082, 0xa5c0, 0x0078, 0x2ae9, 0x2071, 0x6080, 0xa082,
++	0xa6d0, 0x707e, 0x717a, 0x2001, 0x0004, 0x706a, 0x7087, 0x000f,
++	0x1078, 0x2845, 0x0078, 0x2b0b, 0x60d0, 0xa005, 0x00c0, 0x2b0f,
++	0xd1fc, 0x00c0, 0x2aff, 0x2071, 0x6040, 0x0078, 0x2b01, 0x2071,
++	0x6080, 0x717a, 0x2c00, 0x7082, 0x2001, 0x0006, 0x706a, 0x7087,
++	0x000f, 0x1078, 0x2845, 0x2001, 0x0000, 0x0078, 0x2b11, 0x2001,
++	0x0001, 0x2091, 0x8001, 0xa005, 0x0e7f, 0x0c7f, 0x007c, 0x2c04,
++	0xa005, 0x0040, 0x2b2e, 0x2060, 0x6010, 0xa306, 0x00c0, 0x2b2b,
++	0x600c, 0xa206, 0x00c0, 0x2b2b, 0x6014, 0xa106, 0x00c0, 0x2b2b,
++	0xa006, 0x0078, 0x2b30, 0x6000, 0x0078, 0x2b18, 0xa085, 0x0001,
++	0x007c, 0x0f7e, 0x0e7e, 0x017e, 0xd1bc, 0x00c0, 0x2b49, 0x2079,
++	0x6040, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040,
++	0x2b45, 0x2071, 0x0100, 0x0078, 0x2b4d, 0x2071, 0x0200, 0x0078,
++	0x2b4d, 0x2079, 0x6080, 0x2071, 0x0100, 0x791c, 0xa18c, 0x000f,
++	0x70ec, 0xa084, 0x0100, 0x007f, 0x0040, 0x2b64, 0x810b, 0x810b,
++	0x810b, 0x810b, 0xd0bc, 0x00c0, 0x2b61, 0xa18d, 0x0f00, 0x0078,
++	0x2b63, 0xa18d, 0x0800, 0x2104, 0x0e7f, 0x0f7f, 0x007c, 0x2001,
++	0x6001, 0x2004, 0xd0ac, 0x00c0, 0x2b78, 0x68e4, 0xa08c, 0x0020,
++	0x0040, 0x2b78, 0xa084, 0x0006, 0x00c0, 0x2b78, 0x1078, 0x2b79,
++	0x007c, 0x6014, 0x0e7e, 0x037e, 0x2018, 0x2071, 0x6540, 0xd0fc,
++	0x00c0, 0x2b84, 0x2071, 0x64c0, 0x8007, 0xa084, 0x000f, 0x8003,
++	0x8003, 0x8003, 0xae70, 0x7004, 0xa084, 0x000a, 0x00c0, 0x2bea,
++	0x7108, 0xa194, 0xff00, 0x0040, 0x2bea, 0xa18c, 0x00ff, 0x2001,
++	0x000a, 0xa106, 0x0040, 0x2bb7, 0x2001, 0x000c, 0xa106, 0x0040,
++	0x2bbb, 0x2001, 0x0012, 0xa106, 0x0040, 0x2bbf, 0x2001, 0x0014,
++	0xa106, 0x0040, 0x2bc3, 0x2001, 0x0019, 0xa106, 0x0040, 0x2bc7,
++	0x2001, 0x0032, 0xa106, 0x0040, 0x2bcb, 0x0078, 0x2bcf, 0x2009,
++	0x000c, 0x0078, 0x2bd0, 0x2009, 0x0012, 0x0078, 0x2bd0, 0x2009,
++	0x0014, 0x0078, 0x2bd0, 0x2009, 0x0019, 0x0078, 0x2bd0, 0x2009,
++	0x0020, 0x0078, 0x2bd0, 0x2009, 0x003f, 0x0078, 0x2bd0, 0xa016,
++	0x2100, 0xa205, 0x700a, 0x7004, 0xa085, 0x000a, 0x7006, 0x2071,
++	0x6000, 0x7004, 0xd0bc, 0x0040, 0x2bea, 0xd3fc, 0x00c0, 0x2be5,
++	0x73ee, 0x2071, 0x6040, 0x0078, 0x2be8, 0x73f2, 0x2071, 0x6080,
++	0x701b, 0x800f, 0x037f, 0x0e7f, 0x007c, 0x2001, 0x6003, 0x2004,
++	0xd0e4, 0x00c0, 0x2bf9, 0x7804, 0xa084, 0xff1f, 0xa085, 0x6340,
++	0x7806, 0x007c, 0x0068, 0x2bfa, 0x2091, 0x8000, 0x2071, 0x0000,
++	0x007e, 0x7018, 0xd084, 0x00c0, 0x2c01, 0x007f, 0x2071, 0x0010,
++	0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002, 0x70db, 0x090b, 0x70df,
++	0x0001, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078,
++	0x2c17, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0xa594, 0x003f, 0xa49c,
++	0x0003, 0xa484, 0x000f, 0x0079, 0x2c25, 0x2c37, 0x2c37, 0x2c37,
++	0x30a9, 0x4547, 0x2c35, 0x2c5f, 0x2c62, 0x2c35, 0x2c35, 0x2c35,
++	0x2c35, 0x2c35, 0x2c35, 0x2c35, 0x2c35, 0x1078, 0x2bfa, 0x8507,
++	0xa084, 0x001f, 0x0079, 0x2c3c, 0x2c65, 0x30a9, 0x32d8, 0x33f3,
++	0x341e, 0x36b7, 0x39f0, 0x3a6f, 0x3aed, 0x3b81, 0x3c6c, 0x3d13,
++	0x2c5f, 0x31d4, 0x39bf, 0x2c5c, 0x49b9, 0x49e0, 0x4bd7, 0x4be3,
++	0x4cc7, 0x2c5c, 0x2c5c, 0x4dae, 0x4db2, 0x49b7, 0x2c5c, 0x4b1d,
++	0x2c5c, 0x484c, 0x2c62, 0x2c5c, 0x1078, 0x2bfa, 0x007c, 0x781b,
++	0x004f, 0x007c, 0x781b, 0x00d6, 0x007c, 0x724a, 0xa584, 0x0001,
++	0x00c0, 0x485e, 0x0040, 0x2c78, 0x1078, 0x2bfa, 0x7003, 0x0000,
++	0x7053, 0x0000, 0x704b, 0x0000, 0x7043, 0x0000, 0x1078, 0x44fa,
++	0x7064, 0xa06d, 0x0040, 0x2c85, 0x70f4, 0xa084, 0x0001, 0x7168,
++	0xa105, 0x00c0, 0x2c85, 0x0078, 0x2df1, 0x7068, 0xa084, 0x0007,
++	0x0079, 0x2c8a, 0x2c92, 0x2d10, 0x2d19, 0x2d24, 0x2d2f, 0x2dd7,
++	0x2d3a, 0x2d10, 0x7830, 0xd0bc, 0x00c0, 0x2c5e, 0x71f0, 0xd1bc,
++	0x00c0, 0x2c5e, 0xd1b4, 0x00c0, 0x2cee, 0x70c0, 0xa086, 0x0001,
++	0x0040, 0x2c5e, 0x1078, 0x44e0, 0x00c0, 0x2c5e, 0x70d0, 0xa06d,
++	0x6800, 0xa065, 0xa055, 0x789b, 0x0010, 0x6b0c, 0x7baa, 0x6808,
++	0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001, 0x0040,
++	0x2cbc, 0x69c0, 0x7daa, 0x79aa, 0x68c4, 0xa04d, 0x6e1c, 0x7830,
++	0xd0bc, 0x00c0, 0x2c5e, 0x2001, 0x0010, 0x0078, 0x2f58, 0x7064,
++	0xa005, 0x00c0, 0x2c5e, 0x1078, 0x44e0, 0x00c0, 0x2c5e, 0x0c7e,
++	0x0d7e, 0x70d0, 0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0010,
++	0x6b0c, 0x7baa, 0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d,
++	0xa886, 0x0001, 0x0040, 0x2ce7, 0x69c0, 0x7daa, 0x79aa, 0x68c4,
++	0xa04d, 0x6e1c, 0x2001, 0x0020, 0x0078, 0x2f58, 0x1078, 0x44bc,
++	0x00c0, 0x2c5e, 0x70d8, 0xa06d, 0x6814, 0xc0fc, 0x8007, 0x7882,
++	0x68b4, 0x785a, 0x781b, 0x004f, 0x704c, 0xc08d, 0x780a, 0x68c0,
++	0x703e, 0x70f0, 0xc0b4, 0x70f2, 0x70d4, 0xa065, 0x68c4, 0x705e,
++	0x7003, 0x0002, 0x2d00, 0x7052, 0xad80, 0x0009, 0x7042, 0x007c,
++	0x1078, 0x44bc, 0x00c0, 0x2d18, 0x781b, 0x0048, 0x7003, 0x0004,
++	0x007c, 0x1078, 0x44bc, 0x00c0, 0x2d23, 0x2011, 0x000c, 0x1078,
++	0x2d4a, 0x7003, 0x0004, 0x007c, 0x1078, 0x44bc, 0x00c0, 0x2d2e,
++	0x2011, 0x0006, 0x1078, 0x2d4a, 0x7003, 0x0004, 0x007c, 0x1078,
++	0x44bc, 0x00c0, 0x2d39, 0x2011, 0x000d, 0x1078, 0x2d4a, 0x7003,
++	0x0004, 0x007c, 0x1078, 0x44bc, 0x00c0, 0x2d49, 0x2011, 0x0006,
++	0x1078, 0x2d4a, 0x7080, 0x7083, 0x0000, 0x2068, 0x7052, 0x7003,
++	0x0001, 0x007c, 0x7178, 0xc1fc, 0x8107, 0x7882, 0x789b, 0x0010,
++	0xa286, 0x000c, 0x00c0, 0x2d59, 0x7aaa, 0x2001, 0x0001, 0x0078,
++	0x2d6e, 0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0xa286, 0x000d,
++	0x0040, 0x2d67, 0x7aaa, 0x2001, 0x0002, 0x0078, 0x2d6e, 0x78ab,
++	0x0020, 0x717c, 0x79aa, 0x7aaa, 0x2001, 0x0004, 0x789b, 0x0060,
++	0x78aa, 0x785b, 0x0004, 0x781b, 0x00e7, 0x1078, 0x44fa, 0x7087,
++	0x000f, 0x70f0, 0xd0b4, 0x0040, 0x2d8a, 0xc0b4, 0x70f2, 0x0c7e,
++	0x70d4, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001,
++	0x601a, 0x0c7f, 0x007c, 0x7010, 0xa005, 0x00c0, 0x2d99, 0x70f0,
++	0xd0b4, 0x0040, 0x2d9a, 0x70d4, 0xac06, 0x00c0, 0x2d9a, 0x1078,
++	0x2d79, 0x007c, 0x017e, 0x71c0, 0xa186, 0x0001, 0x0040, 0x2dcc,
++	0x0d7e, 0x027e, 0x2100, 0x2011, 0x0001, 0xa212, 0x70d0, 0x2068,
++	0x6800, 0xac06, 0x0040, 0x2db3, 0x8211, 0x0040, 0x2dca, 0x1078,
++	0x2dce, 0x0078, 0x2da8, 0x0c7e, 0x2100, 0x2011, 0x0001, 0xa212,
++	0x70d0, 0x2068, 0x6800, 0x2060, 0x6008, 0xa084, 0xfbef, 0x600a,
++	0x8211, 0x0040, 0x2dc7, 0x1078, 0x2dce, 0x0078, 0x2dba, 0x70c3,
++	0x0001, 0x0c7f, 0x027f, 0x0d7f, 0x017f, 0x007c, 0xade8, 0x0005,
++	0x70c8, 0xad06, 0x00c0, 0x2dd6, 0x70c4, 0x2068, 0x007c, 0x1078,
++	0x44bc, 0x00c0, 0x2c5e, 0x7080, 0x2068, 0x7778, 0x1078, 0x43a8,
++	0x2c50, 0x1078, 0x45c9, 0x789b, 0x0010, 0x6814, 0xa084, 0x001f,
++	0xc0bd, 0x78aa, 0x6e1c, 0x2041, 0x0001, 0x2001, 0x0004, 0x0078,
++	0x2f5e, 0x1078, 0x44bc, 0x00c0, 0x2c5e, 0x789b, 0x0010, 0x7064,
++	0x2068, 0x6f14, 0x1078, 0x2d79, 0x1078, 0x43a8, 0x2c50, 0x1078,
++	0x45c9, 0x6824, 0xa005, 0x0040, 0x2e0d, 0xa082, 0x0006, 0x0048,
++	0x2e0b, 0x0078, 0x2e0d, 0x6827, 0x0005, 0x6b14, 0xa39c, 0x001f,
++	0xa39d, 0x00c0, 0x2960, 0x6000, 0x2a60, 0xa084, 0x8000, 0x0040,
++	0x2e1d, 0xa684, 0x0001, 0x0040, 0x2e1f, 0xa39c, 0xffbf, 0x7baa,
++	0x2031, 0x0020, 0x2041, 0x0001, 0x2001, 0x0003, 0x0078, 0x2f5e,
++	0xc28d, 0x72f2, 0x72dc, 0xa200, 0xa015, 0x7158, 0x8108, 0xa12a,
++	0x0048, 0x2e33, 0x71dc, 0x2164, 0x6504, 0x85ff, 0x00c0, 0x2e4e,
++	0x715a, 0x8421, 0x00c0, 0x2e2e, 0x70f0, 0xd08c, 0x0040, 0x2e46,
++	0x70ec, 0xa005, 0x00c0, 0x2e46, 0x70ef, 0x000a, 0x7048, 0xa005,
++	0x0040, 0x485e, 0x007c, 0x2200, 0x0078, 0x2e38, 0x70f0, 0xc08c,
++	0x70f2, 0x70ef, 0x0000, 0x6034, 0xa005, 0x00c0, 0x2e4b, 0x6708,
++	0xa784, 0x073f, 0x0040, 0x2e78, 0xd7d4, 0x00c0, 0x2e4b, 0xa784,
++	0x0021, 0x00c0, 0x2e4b, 0xd78c, 0x0040, 0x2e6b, 0xd794, 0x0040,
++	0x2e4b, 0xc794, 0x670a, 0xa784, 0x0218, 0x00c0, 0x2e4b, 0xd7c4,
++	0x0040, 0x2e78, 0x6018, 0xa005, 0x00c0, 0x2e4b, 0xc7c4, 0x670a,
++	0x2568, 0x6823, 0x0000, 0x6e1c, 0xa684, 0x000e, 0x6318, 0x0040,
++	0x2e89, 0x601c, 0xa302, 0x0048, 0x2e8c, 0x0040, 0x2e8c, 0x0078,
++	0x2e4b, 0x83ff, 0x00c0, 0x2e4b, 0x2d58, 0x2c50, 0x715a, 0x68d3,
++	0x0000, 0xd7bc, 0x00c0, 0x2e97, 0x7024, 0x6022, 0x603a, 0xc7bc,
++	0x670a, 0x68c4, 0xa065, 0xa04d, 0x6100, 0x2a60, 0x2041, 0x0001,
++	0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0, 0xd1fc, 0x0040, 0x2eab,
++	0xd684, 0x0040, 0x2ead, 0xa39c, 0xffbf, 0xd6a4, 0x0040, 0x2eb2,
++	0xa39d, 0x0020, 0xa684, 0x000e, 0x00c0, 0x2f03, 0xc7a5, 0x670a,
++	0x2c00, 0x68ca, 0x77c0, 0xa786, 0x0001, 0x00c0, 0x2ed9, 0x70f0,
++	0xd0b4, 0x00c0, 0x2ed9, 0x7000, 0xa082, 0x0001, 0x00c8, 0x2ed9,
++	0x7010, 0xa005, 0x00c0, 0x2ed9, 0x1078, 0x44e0, 0x00c0, 0x2ed9,
++	0x7830, 0xd0bc, 0x00c0, 0x2ed9, 0x789b, 0x0010, 0x7baa, 0x0078,
++	0x2f56, 0x8739, 0x77c2, 0x2750, 0x77cc, 0xa7b0, 0x0005, 0x70c8,
++	0xa606, 0x00c0, 0x2ee4, 0x76c4, 0x76ce, 0x2c3a, 0x8738, 0x2d3a,
++	0x8738, 0x283a, 0x8738, 0x233a, 0x8738, 0x253a, 0x7830, 0xd0bc,
++	0x0040, 0x2efa, 0x2091, 0x303d, 0x70f0, 0xa084, 0x303d, 0x2091,
++	0x8000, 0x2090, 0xaad5, 0x0000, 0x0040, 0x2f02, 0x8421, 0x2200,
++	0x00c0, 0x2e2d, 0x007c, 0xd1dc, 0x0040, 0x3ffb, 0x2029, 0x0020,
++	0xd69c, 0x00c0, 0x2f10, 0x8528, 0xd68c, 0x00c0, 0x2f10, 0x8528,
++	0x8840, 0x6f14, 0x610c, 0x8108, 0xa18c, 0x00ff, 0x70e8, 0xa160,
++	0x2c64, 0x8cff, 0x0040, 0x2f2e, 0x6014, 0xa706, 0x00c0, 0x2f18,
++	0x60bc, 0x8001, 0x60be, 0x00c0, 0x2f13, 0x2a60, 0x6008, 0xc0c5,
++	0x600a, 0x2200, 0x8421, 0x00c0, 0x2e2d, 0x007c, 0x2a60, 0x610e,
++	0x69c2, 0x2c00, 0x68ca, 0x8840, 0x6008, 0xc0d5, 0x600a, 0x77c0,
++	0xa786, 0x0001, 0x00c0, 0x2ed9, 0x70f0, 0xd0b4, 0x00c0, 0x2ed9,
++	0x7000, 0xa082, 0x0001, 0x00c8, 0x2ed9, 0x7010, 0xa005, 0x00c0,
++	0x2ed9, 0x1078, 0x44e0, 0x00c0, 0x2ed9, 0x7830, 0xd0bc, 0x00c0,
++	0x2ed9, 0x789b, 0x0010, 0x7baa, 0x7daa, 0x79aa, 0x2001, 0x0002,
++	0x007e, 0x6018, 0x8000, 0x601a, 0x0078, 0x2f5f, 0x007e, 0x2960,
++	0x6104, 0x2a60, 0xa184, 0x0018, 0x0040, 0x2f7a, 0xa184, 0x0010,
++	0x0040, 0x2f6e, 0x1078, 0x4201, 0x00c0, 0x2f9a, 0xd19c, 0x0040,
++	0x2f7a, 0x69a0, 0xa184, 0x0600, 0x00c0, 0x2f7a, 0x1078, 0x40f5,
++	0x0078, 0x2f9a, 0x69a0, 0xa184, 0x1e00, 0x0040, 0x2fa4, 0xd1dc,
++	0x0040, 0x2f90, 0x0c7e, 0x2960, 0x6000, 0xc0ed, 0x6002, 0x6104,
++	0xc1a5, 0x6106, 0x0c7f, 0x1078, 0x4201, 0x00c0, 0x2f9a, 0x69a0,
++	0xd1cc, 0x0040, 0x2f97, 0x1078, 0x4147, 0x0078, 0x2f9a, 0xd1d4,
++	0x00c0, 0x2f76, 0x69a0, 0xd1e4, 0x0040, 0x2fa4, 0x6914, 0xa18c,
++	0xff00, 0x810f, 0x1078, 0x2a43, 0x027f, 0xa68c, 0x00e0, 0xa684,
++	0x0060, 0x0040, 0x2fb0, 0xa086, 0x0060, 0x00c0, 0x2fb0, 0xc1f5,
++	0xa18d, 0x0104, 0x69b6, 0x789b, 0x0060, 0x2800, 0x78aa, 0x6818,
++	0xc0fd, 0x681a, 0xd6bc, 0x0040, 0x2fcb, 0xc0fc, 0x708b, 0x0000,
++	0xa08a, 0x000d, 0x0050, 0x2fc9, 0xa08a, 0x000c, 0x718a, 0x2001,
++	0x000c, 0x800c, 0x718e, 0x78aa, 0x3518, 0x3340, 0x3428, 0x80ac,
++	0xaf80, 0x002b, 0x20a0, 0x789b, 0x0000, 0xad80, 0x000b, 0x2098,
++	0x53a6, 0x23a8, 0x2898, 0x25a0, 0xa286, 0x0020, 0x00c0, 0x2ffe,
++	0x70f0, 0xc0b5, 0x70f2, 0x2c00, 0x70d6, 0x2d00, 0x70da, 0xa286,
++	0x0002, 0x0040, 0x302a, 0x70c0, 0x8000, 0x70c2, 0x74d0, 0xa498,
++	0x0005, 0x70c8, 0xa306, 0x00c0, 0x2ff6, 0x73c4, 0x73d2, 0xa286,
++	0x0010, 0x0040, 0x2c5e, 0x0d7f, 0x0c7f, 0x007c, 0x7000, 0xa005,
++	0x00c0, 0x2fe0, 0xa286, 0x0002, 0x00c0, 0x3044, 0x1078, 0x44bc,
++	0x00c0, 0x2fe0, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x68b4, 0x785a,
++	0x781b, 0x004f, 0x704c, 0xc08d, 0x780a, 0x127e, 0x0d7e, 0x0c7e,
++	0x70f0, 0xa084, 0x2700, 0x2090, 0x0c7f, 0x0d7f, 0x127f, 0x2900,
++	0x705e, 0x68c0, 0x703e, 0x7003, 0x0002, 0x2d00, 0x7052, 0xad80,
++	0x0009, 0x7042, 0x7830, 0xd0bc, 0x0040, 0x3036, 0x2091, 0x303d,
++	0x70f0, 0xa084, 0x303d, 0x2091, 0x8000, 0x2090, 0x70c0, 0xa005,
++	0x00c0, 0x303b, 0x007c, 0x8421, 0x0040, 0x303a, 0x7254, 0x70dc,
++	0xa200, 0xa015, 0x0078, 0x2e2d, 0xa286, 0x0010, 0x00c0, 0x306f,
++	0x1078, 0x44bc, 0x00c0, 0x2fe0, 0x6814, 0xc0fc, 0x8007, 0x7882,
++	0x68b4, 0x785a, 0x781b, 0x004f, 0x704c, 0xc08d, 0x780a, 0x70c0,
++	0x8000, 0x70c2, 0x74d0, 0xa490, 0x0005, 0x70c8, 0xa206, 0x00c0,
++	0x3062, 0x72c4, 0x72d2, 0x2900, 0x705e, 0x68c0, 0x703e, 0x7003,
++	0x0002, 0x2d00, 0x7052, 0xad80, 0x0009, 0x7042, 0x007c, 0x6bb4,
++	0xa39d, 0x2000, 0x7b5a, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x6b94,
++	0x7bd6, 0x7bde, 0x6e98, 0x7ed2, 0x7eda, 0x781b, 0x004f, 0x2900,
++	0x705e, 0x7202, 0x704c, 0xc08d, 0x780a, 0x7200, 0x2300, 0xa605,
++	0x0040, 0x309b, 0x70f0, 0xa084, 0x2700, 0xa086, 0x2300, 0x00c0,
++	0x3095, 0x2009, 0x0000, 0x0078, 0x3097, 0x2009, 0x0001, 0xa284,
++	0x000f, 0x1079, 0x309f, 0xad80, 0x0009, 0x7042, 0x007c, 0x30a7,
++	0x591e, 0x591e, 0x590b, 0x591e, 0x30a7, 0x30a7, 0x30a7, 0x1078,
++	0x2bfa, 0x1078, 0x44bc, 0x1078, 0x2bed, 0x7808, 0xa084, 0xfffc,
++	0x780a, 0x0f7e, 0x2079, 0x6000, 0x78b0, 0x0f7f, 0xd084, 0x0040,
++	0x30d2, 0x7068, 0xa086, 0x0001, 0x00c0, 0x30c0, 0x0078, 0x31a7,
++	0x7068, 0xa086, 0x0005, 0x00c0, 0x30d0, 0x7080, 0x2068, 0x681b,
++	0x0004, 0x6817, 0x0000, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822,
++	0x706b, 0x0000, 0x70c3, 0x0000, 0x70c4, 0x70ce, 0x70d2, 0x70f4,
++	0xc084, 0x70f6, 0x1078, 0x2d79, 0x2011, 0x0004, 0x7168, 0xa186,
++	0x0001, 0x0040, 0x30f2, 0xa186, 0x0007, 0x00c0, 0x30eb, 0x701b,
++	0x0005, 0x0078, 0x30f2, 0x701b, 0x0001, 0x70f0, 0xc0dd, 0x70f2,
++	0x0078, 0x30f2, 0x2001, 0x6008, 0x203c, 0xd7fc, 0x00c0, 0x30fe,
++	0xae86, 0x6040, 0x0040, 0x3102, 0x0078, 0x3108, 0xae86, 0x6080,
++	0x00c0, 0x3108, 0xa784, 0x00ff, 0xa086, 0x0018, 0x0040, 0x310f,
++	0x7014, 0x7012, 0xa005, 0x00c0, 0x310f, 0x70c3, 0x0001, 0x067e,
++	0x1078, 0x55ac, 0x157e, 0x20a9, 0x0010, 0x2039, 0x0000, 0x1078,
++	0x42de, 0xa7b8, 0x0100, 0x00f0, 0x3117, 0x157f, 0x067f, 0x7000,
++	0x0079, 0x3122, 0x315a, 0x3135, 0x3135, 0x312a, 0x315a, 0x315a,
++	0x315a, 0x315a, 0x7064, 0xa005, 0x0040, 0x315a, 0xad06, 0x00c0,
++	0x3135, 0x6800, 0x7066, 0x0078, 0x3147, 0x6820, 0xd084, 0x00c0,
++	0x3143, 0x6f14, 0x1078, 0x43a8, 0x6008, 0xc0d4, 0x600a, 0x1078,
++	0x3fd3, 0x0078, 0x3147, 0x7060, 0x2060, 0x6800, 0x6002, 0xa684,
++	0x5f00, 0x681e, 0x6818, 0xd0fc, 0x0040, 0x314f, 0x6a1a, 0x6817,
++	0x0000, 0x682b, 0x0000, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822,
++	0x1078, 0x2251, 0x2011, 0x0004, 0xb284, 0x0400, 0x00c0, 0x3164,
++	0x2021, 0xa6c0, 0x0078, 0x3166, 0x2021, 0xa7d0, 0x1078, 0x31b5,
++	0xb284, 0x0400, 0x0040, 0x3170, 0x2021, 0x6099, 0x0078, 0x3172,
++	0x2021, 0x6059, 0x1078, 0x31b5, 0x157e, 0x20a9, 0x0101, 0xb284,
++	0x0400, 0x00c0, 0x317f, 0x2021, 0xa5c0, 0x0078, 0x3181, 0x2021,
++	0xa6d0, 0x1078, 0x31b5, 0x8420, 0x00f0, 0x3181, 0xb284, 0x0300,
++	0x0040, 0x318e, 0x2061, 0x65c0, 0x0078, 0x3190, 0x2061, 0x85c0,
++	0x2021, 0x0002, 0x20a9, 0x0100, 0x6018, 0x6110, 0x81ff, 0x0040,
++	0x319d, 0xa102, 0x0050, 0x319d, 0x6012, 0x601b, 0x0000, 0xace0,
++	0x0010, 0x00f0, 0x3194, 0x8421, 0x00c0, 0x3192, 0x157f, 0x7090,
++	0xa084, 0x8000, 0x0040, 0x31ae, 0x1078, 0x4639, 0x706b, 0x0000,
++	0x7003, 0x0000, 0x7053, 0x0000, 0x007c, 0x047e, 0x2404, 0xa005,
++	0x0040, 0x31d0, 0x2068, 0x6800, 0x007e, 0x6a1a, 0x6817, 0x0000,
++	0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x6820, 0xa084,
++	0x00ff, 0xc09d, 0x6822, 0x1078, 0x2251, 0x007f, 0x0078, 0x31b7,
++	0x047f, 0x2023, 0x0000, 0x007c, 0xa282, 0x0003, 0x0050, 0x31da,
++	0x1078, 0x2bfa, 0x1078, 0x2bed, 0x2300, 0x0079, 0x31df, 0x31e2,
++	0x326d, 0x328a, 0xa282, 0x0002, 0x0040, 0x31e8, 0x1078, 0x2bfa,
++	0x7068, 0x706b, 0x0000, 0x7087, 0x0000, 0x0079, 0x31ef, 0x31f7,
++	0x31f7, 0x31f9, 0x3239, 0x4007, 0x31f7, 0x3239, 0x31f7, 0x1078,
++	0x2bfa, 0x7778, 0x1078, 0x42de, 0x7778, 0xa7bc, 0x8f00, 0x1078,
++	0x43a8, 0x6018, 0xa005, 0x0040, 0x3230, 0xd7fc, 0x00c0, 0x320c,
++	0x2021, 0xa6c0, 0x0078, 0x320e, 0x2021, 0xa7d0, 0x2009, 0x0005,
++	0x2011, 0x0010, 0x1078, 0x32a5, 0x0040, 0x3230, 0x157e, 0x20a9,
++	0x0101, 0xd7fc, 0x00c0, 0x3220, 0x2021, 0xa5c0, 0x0078, 0x3222,
++	0x2021, 0xa6d0, 0x047e, 0x2009, 0x0005, 0x2011, 0x0010, 0x1078,
++	0x32a5, 0x047f, 0x0040, 0x322f, 0x8420, 0x00f0, 0x3222, 0x157f,
++	0x8738, 0xa784, 0x001f, 0x00c0, 0x31ff, 0x0078, 0x2c6e, 0x0078,
++	0x2c6e, 0x7778, 0x1078, 0x43a8, 0x6018, 0xa005, 0x0040, 0x326b,
++	0xd7fc, 0x00c0, 0x3247, 0x2021, 0xa6c0, 0x0078, 0x3249, 0x2021,
++	0xa7d0, 0x2009, 0x0005, 0x2011, 0x0020, 0x1078, 0x32a5, 0x0040,
++	0x326b, 0x157e, 0x20a9, 0x0101, 0xd7fc, 0x00c0, 0x325b, 0x2021,
++	0xa5c0, 0x0078, 0x325d, 0x2021, 0xa6d0, 0x047e, 0x2009, 0x0005,
++	0x2011, 0x0020, 0x1078, 0x32a5, 0x047f, 0x0040, 0x326a, 0x8420,
++	0x00f0, 0x325d, 0x157f, 0x0078, 0x2c6e, 0x2200, 0x0079, 0x3270,
++	0x3273, 0x3275, 0x3275, 0x1078, 0x2bfa, 0x2009, 0x0012, 0x7068,
++	0xa086, 0x0002, 0x0040, 0x327e, 0x2009, 0x000e, 0x6818, 0xd0fc,
++	0x0040, 0x3283, 0x691a, 0x706b, 0x0000, 0x70f0, 0xc0dd, 0x70f2,
++	0x0078, 0x445a, 0x2200, 0x0079, 0x328d, 0x3292, 0x3275, 0x3290,
++	0x1078, 0x2bfa, 0x1078, 0x55ac, 0x7000, 0xa086, 0x0002, 0x00c0,
++	0x3f81, 0x1078, 0x3fe8, 0x6008, 0xa084, 0xfbef, 0x600a, 0x1078,
++	0x3f72, 0x0040, 0x3f81, 0x0078, 0x2c6e, 0x2404, 0xa005, 0x0040,
++	0x32d4, 0x2068, 0x2d04, 0x007e, 0x6814, 0xa706, 0x0040, 0x32b4,
++	0x2d20, 0x007f, 0x0078, 0x32a6, 0x007f, 0x2022, 0x6817, 0x0000,
++	0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x691a, 0x6820,
++	0xa084, 0x00ff, 0xa205, 0x6822, 0x682b, 0x0000, 0x1078, 0x2251,
++	0x6010, 0x8001, 0x6012, 0x6008, 0xa084, 0xf9ef, 0x600a, 0x1078,
++	0x2d9a, 0x1078, 0x3fe8, 0x007c, 0xa085, 0x0001, 0x0078, 0x32d3,
++	0x2300, 0x0079, 0x32db, 0x32e0, 0x32de, 0x3385, 0x1078, 0x2bfa,
++	0x78ec, 0xa084, 0x0001, 0x00c0, 0x32f4, 0x7000, 0xa086, 0x0004,
++	0x00c0, 0x32ec, 0x0078, 0x332a, 0x1078, 0x3fe8, 0x6008, 0xa084,
++	0xf9ef, 0x600a, 0x0078, 0x3f81, 0x78e4, 0xa005, 0x00d0, 0x332a,
++	0x3208, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040,
++	0x3305, 0xa18c, 0x0300, 0x0078, 0x3307, 0xa18c, 0x0400, 0x0040,
++	0x330d, 0x0018, 0x2c5e, 0x0078, 0x330f, 0x0028, 0x2c5e, 0x2008,
++	0xa084, 0x0030, 0x00c0, 0x3317, 0x781b, 0x004f, 0x007c, 0x78ec,
++	0xa084, 0x0003, 0x0040, 0x3314, 0xa184, 0x0007, 0x0079, 0x3320,
++	0x3361, 0x336b, 0x3354, 0x3328, 0x44b1, 0x44b1, 0x3328, 0x3378,
++	0x1078, 0x2bfa, 0x7000, 0xa086, 0x0004, 0x00c0, 0x3344, 0x7068,
++	0xa086, 0x0002, 0x00c0, 0x333a, 0x2011, 0x0002, 0x2019, 0x0000,
++	0x0078, 0x31d4, 0x7068, 0xa086, 0x0006, 0x0040, 0x3334, 0x7068,
++	0xa086, 0x0004, 0x0040, 0x3334, 0x79e4, 0xa184, 0x0030, 0x0040,
++	0x334e, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x3350, 0x0078, 0x39bf,
++	0x2001, 0x0003, 0x0078, 0x36cb, 0x6818, 0xd0fc, 0x0040, 0x335a,
++	0x681b, 0x001d, 0x1078, 0x42bd, 0x782b, 0x3008, 0x781b, 0x0058,
++	0x007c, 0x6818, 0xd0fc, 0x0040, 0x3367, 0x681b, 0x001d, 0x1078,
++	0x42bd, 0x0078, 0x4484, 0x6818, 0xd0fc, 0x0040, 0x3371, 0x681b,
++	0x001d, 0x1078, 0x42bd, 0x782b, 0x3008, 0x781b, 0x00d3, 0x007c,
++	0x6818, 0xd0fc, 0x0040, 0x337e, 0x681b, 0x001d, 0x1078, 0x42bd,
++	0x782b, 0x3008, 0x781b, 0x009b, 0x007c, 0xa584, 0x000f, 0x00c0,
++	0x33a4, 0x1078, 0x2bed, 0x7000, 0x0079, 0x338e, 0x2c6e, 0x3396,
++	0x3398, 0x3f81, 0x3f81, 0x3f81, 0x3396, 0x3396, 0x1078, 0x2bfa,
++	0x1078, 0x3fe8, 0x6008, 0xa084, 0xfbef, 0x600a, 0x1078, 0x3f72,
++	0x0040, 0x3f81, 0x0078, 0x2c6e, 0x78e4, 0xa005, 0x00d0, 0x332a,
++	0x3208, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040,
++	0x33b5, 0xa18c, 0x0300, 0x0078, 0x33b7, 0xa18c, 0x0400, 0x0040,
++	0x33bd, 0x0018, 0x332a, 0x0078, 0x33bf, 0x0028, 0x332a, 0x2008,
++	0xa084, 0x0030, 0x00c0, 0x33c7, 0x781b, 0x004f, 0x007c, 0x78ec,
++	0xa084, 0x0003, 0x0040, 0x33c4, 0xa184, 0x0007, 0x0079, 0x33d0,
++	0x33e1, 0x33e5, 0x33da, 0x33d8, 0x44b1, 0x44b1, 0x33d8, 0x44a9,
++	0x1078, 0x2bfa, 0x1078, 0x42c5, 0x782b, 0x3008, 0x781b, 0x0058,
++	0x007c, 0x1078, 0x42c5, 0x0078, 0x4484, 0x1078, 0x42c5, 0x782b,
++	0x3008, 0x781b, 0x00d3, 0x007c, 0x1078, 0x42c5, 0x782b, 0x3008,
++	0x781b, 0x009b, 0x007c, 0x2300, 0x0079, 0x33f6, 0x33fb, 0x33f9,
++	0x33fd, 0x1078, 0x2bfa, 0x0078, 0x3b81, 0x681b, 0x0016, 0x78a3,
++	0x0000, 0x79e4, 0xa184, 0x0030, 0x0040, 0x3b81, 0x78ec, 0xa084,
++	0x0003, 0x0040, 0x3b81, 0xa184, 0x0100, 0x0040, 0x3401, 0xa184,
++	0x0007, 0x0079, 0x3413, 0x341b, 0x33e5, 0x3354, 0x445a, 0x44b1,
++	0x44b1, 0x445a, 0x44a9, 0x1078, 0x446a, 0x007c, 0xa282, 0x0005,
++	0x0050, 0x3424, 0x1078, 0x2bfa, 0x2300, 0x0079, 0x3427, 0x342a,
++	0x367d, 0x368a, 0x2200, 0x0079, 0x342d, 0x3447, 0x3434, 0x3447,
++	0x3432, 0x3660, 0x1078, 0x2bfa, 0x789b, 0x0018, 0x78a8, 0xa084,
++	0x00ff, 0xa082, 0x0020, 0x0048, 0x429c, 0xa08a, 0x0004, 0x00c8,
++	0x429c, 0x0079, 0x3443, 0x429c, 0x429c, 0x429c, 0x4246, 0x789b,
++	0x0018, 0x79a8, 0xa184, 0x0080, 0x0040, 0x3458, 0x0078, 0x429c,
++	0x7000, 0xa005, 0x00c0, 0x344e, 0x2011, 0x0004, 0x0078, 0x3d26,
++	0xa184, 0x00ff, 0xa08a, 0x0010, 0x00c8, 0x429c, 0x0079, 0x3460,
++	0x3472, 0x3470, 0x3488, 0x348c, 0x355f, 0x429c, 0x429c, 0x3561,
++	0x429c, 0x429c, 0x365c, 0x365c, 0x429c, 0x429c, 0x429c, 0x365e,
++	0x1078, 0x2bfa, 0xa684, 0x1000, 0x0040, 0x347e, 0x2001, 0x0500,
++	0x8000, 0x8000, 0x783a, 0x781b, 0x0094, 0x007c, 0x6818, 0xd0fc,
++	0x0040, 0x3486, 0x681b, 0x001d, 0x0078, 0x3476, 0x0078, 0x445a,
++	0x681b, 0x001d, 0x0078, 0x42aa, 0x6920, 0x6922, 0xa684, 0x1800,
++	0x00c0, 0x34f1, 0x6820, 0xa084, 0x0001, 0x00c0, 0x34f7, 0x6818,
++	0xa086, 0x0008, 0x00c0, 0x349e, 0x681b, 0x0000, 0xd6d4, 0x0040,
++	0x355c, 0xd6bc, 0x0040, 0x34dd, 0x708b, 0x0000, 0x6818, 0xa084,
++	0x003f, 0xa08a, 0x000d, 0x0050, 0x34dd, 0xa08a, 0x000c, 0x718a,
++	0x2001, 0x000c, 0x800c, 0x718e, 0x789b, 0x0061, 0x78aa, 0x157e,
++	0x137e, 0x147e, 0x017e, 0xb28c, 0x0300, 0x0040, 0x34cf, 0x007e,
++	0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x34cb, 0x20a1,
++	0x012b, 0x0078, 0x34d1, 0x20a1, 0x022b, 0x0078, 0x34d1, 0x20a1,
++	0x012b, 0x017f, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000b,
++	0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6038, 0xa005, 0x00c0,
++	0x34ec, 0x681c, 0xa084, 0x000e, 0x0040, 0x42aa, 0x1078, 0x42c9,
++	0x782b, 0x3008, 0x0078, 0x34ee, 0x8001, 0x603a, 0x781b, 0x005a,
++	0x007c, 0xd6e4, 0x0040, 0x34f7, 0x781b, 0x0067, 0x007c, 0xa684,
++	0x0060, 0x0040, 0x3559, 0xd6dc, 0x0040, 0x3559, 0xd6fc, 0x00c0,
++	0x3503, 0x0078, 0x351a, 0xc6fc, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8,
++	0x78d0, 0x801b, 0x00c8, 0x350d, 0x8000, 0xa084, 0x003f, 0xa108,
++	0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200,
++	0xa303, 0x68ae, 0xd6f4, 0x0040, 0x3520, 0xc6f4, 0x7e5a, 0x6eb6,
++	0x7000, 0xa086, 0x0003, 0x00c0, 0x352e, 0x007e, 0x1078, 0x55ac,
++	0x1078, 0x591e, 0x007f, 0x781b, 0x0066, 0x007c, 0xa006, 0x1078,
++	0x5a6b, 0x6ab0, 0x69ac, 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0040,
++	0x353d, 0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda,
++	0x6ba6, 0x7bd6, 0x7bde, 0x2300, 0xa405, 0x00c0, 0x354d, 0xc6f5,
++	0x7e5a, 0x6eb6, 0x781b, 0x0066, 0x007c, 0x781b, 0x0066, 0x2200,
++	0xa115, 0x00c0, 0x3556, 0x1078, 0x591e, 0x007c, 0x1078, 0x5972,
++	0x007c, 0x781b, 0x0067, 0x007c, 0x781b, 0x005a, 0x007c, 0x1078,
++	0x2bfa, 0x0078, 0x35b1, 0x6920, 0xd1c4, 0x0040, 0x3576, 0xc1c4,
++	0x6922, 0x0c7e, 0x705c, 0x2060, 0x6000, 0xc0e4, 0x6002, 0x6004,
++	0xa084, 0xfff5, 0x6006, 0x0c7f, 0x0078, 0x35a5, 0xd1cc, 0x0040,
++	0x35a5, 0xc1cc, 0x6922, 0x0c7e, 0x705c, 0x2060, 0x6000, 0xc0ec,
++	0x6002, 0x6004, 0xc0a4, 0x6006, 0x2008, 0x2c48, 0x0c7f, 0xd19c,
++	0x0040, 0x35a5, 0x1078, 0x43a4, 0x1078, 0x40f5, 0x88ff, 0x0040,
++	0x35a5, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a,
++	0xd6d4, 0x00c0, 0x35a0, 0x782b, 0x3008, 0x781b, 0x0058, 0x007c,
++	0x782b, 0x3008, 0x781b, 0x0067, 0x007c, 0x7e58, 0xd6d4, 0x00c0,
++	0x35ac, 0x781b, 0x005a, 0x007c, 0x781b, 0x0067, 0x007c, 0x0078,
++	0x42a3, 0xa01e, 0x7990, 0xa18c, 0x0007, 0x00c0, 0x35be, 0x6820,
++	0xa084, 0x0100, 0x0040, 0x35af, 0x2009, 0x0008, 0x789b, 0x0010,
++	0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x00c0, 0x35f5, 0x2300,
++	0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040, 0x35ed, 0x0048, 0x35d2,
++	0x0078, 0x35ef, 0xa380, 0x0002, 0xa102, 0x00c8, 0x35ed, 0x6920,
++	0xa18c, 0xfcff, 0x6922, 0x0c7e, 0x705c, 0x2060, 0x6000, 0xa084,
++	0xefef, 0x6002, 0x6004, 0xa084, 0xffe5, 0x6006, 0x0c7f, 0x7e58,
++	0xa6b4, 0xfffb, 0x7e5a, 0x0078, 0x35a6, 0x0078, 0x3563, 0x24a8,
++	0x7aa8, 0x00f0, 0x35ef, 0x0078, 0x35c0, 0xa284, 0x00f0, 0xa086,
++	0x0020, 0x00c0, 0x364d, 0x8318, 0x8318, 0x2300, 0xa102, 0x0040,
++	0x3605, 0x0048, 0x3605, 0x0078, 0x364a, 0xa286, 0x0023, 0x0040,
++	0x35af, 0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, 0xa684, 0xfff1,
++	0xc0a5, 0x2030, 0x7e5a, 0x6008, 0xc0a5, 0x600a, 0x0c7e, 0x705c,
++	0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xd1a4, 0x0040, 0x3626,
++	0x1078, 0x43a4, 0x1078, 0x4201, 0x0078, 0x3634, 0x0c7e, 0x705c,
++	0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xd19c, 0x0040, 0x35a5,
++	0x1078, 0x43a4, 0x1078, 0x40f5, 0x88ff, 0x0040, 0x35a5, 0x789b,
++	0x0060, 0x2800, 0x78aa, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x3645,
++	0x782b, 0x3008, 0x781b, 0x0058, 0x007c, 0x782b, 0x3008, 0x781b,
++	0x0067, 0x007c, 0x7aa8, 0x0078, 0x35c0, 0x8318, 0x2300, 0xa102,
++	0x0040, 0x3656, 0x0048, 0x3656, 0x0078, 0x35c0, 0xa284, 0x0080,
++	0x00c0, 0x42aa, 0x0078, 0x42a3, 0x0078, 0x42aa, 0x0078, 0x429c,
++	0x705c, 0xa04d, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa08e,
++	0x0001, 0x0040, 0x366d, 0x1078, 0x2bfa, 0x7aa8, 0xa294, 0x00ff,
++	0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8, 0x429c, 0x0079,
++	0x3679, 0x429c, 0x4041, 0x429c, 0x41a4, 0xa282, 0x0000, 0x00c0,
++	0x3683, 0x1078, 0x2bfa, 0x1078, 0x42bd, 0x782b, 0x3008, 0x781b,
++	0x0067, 0x007c, 0xa282, 0x0003, 0x00c0, 0x3690, 0x1078, 0x2bfa,
++	0xd4fc, 0x00c0, 0x36b0, 0x7068, 0xa005, 0x0040, 0x3699, 0x1078,
++	0x2bfa, 0x6f14, 0x777a, 0xa7bc, 0x8f00, 0x1078, 0x43a8, 0x6008,
++	0xa085, 0x0021, 0x600a, 0x8738, 0xa784, 0x001f, 0x00c0, 0x369d,
++	0x1078, 0x42c1, 0x706b, 0x0002, 0x701b, 0x0009, 0x0078, 0x36b2,
++	0x1078, 0x42cd, 0x782b, 0x3008, 0x781b, 0x0067, 0x007c, 0xa282,
++	0x0004, 0x0050, 0x36bd, 0x1078, 0x2bfa, 0x2300, 0x0079, 0x36c0,
++	0x36c3, 0x37f4, 0x3825, 0xa286, 0x0003, 0x0040, 0x36c9, 0x1078,
++	0x2bfa, 0x2001, 0x0000, 0x7046, 0x68d0, 0xa005, 0x0040, 0x36d2,
++	0x7003, 0x0003, 0x68a0, 0xd0ec, 0x0040, 0x36d9, 0x6008, 0xc08d,
++	0x600a, 0x7000, 0xa084, 0x000f, 0x0079, 0x36de, 0x2c6e, 0x36eb,
++	0x36e8, 0x390e, 0x39a6, 0x2c6e, 0x36e6, 0x36e6, 0x1078, 0x2bfa,
++	0x6008, 0xc0d4, 0x600a, 0xd6e4, 0x00c0, 0x36f4, 0x1078, 0x55ac,
++	0x2009, 0x0000, 0x0078, 0x379c, 0x7868, 0xa08c, 0x00ff, 0x0040,
++	0x3733, 0xa186, 0x0008, 0x00c0, 0x370a, 0x6008, 0xc0a4, 0x600a,
++	0x1078, 0x3f72, 0x0040, 0x3733, 0x1078, 0x3fe8, 0x1078, 0x55ac,
++	0x0078, 0x371b, 0xa186, 0x0028, 0x00c0, 0x3733, 0x6018, 0xa005,
++	0x0040, 0x36fd, 0x8001, 0x0040, 0x36fd, 0x8001, 0x0040, 0x36fd,
++	0x601e, 0x0078, 0x36fd, 0x6820, 0xd084, 0x0040, 0x2c6e, 0xc084,
++	0x6822, 0x1078, 0x2d8b, 0x7060, 0x0c7e, 0x2060, 0x6800, 0x6002,
++	0x0c7f, 0x6004, 0x6802, 0xa005, 0x2d00, 0x00c0, 0x3730, 0x6002,
++	0x6006, 0x0078, 0x2c6e, 0x017e, 0x81ff, 0x00c0, 0x3755, 0x71f0,
++	0xd1bc, 0x00c0, 0x3755, 0xd1b4, 0x0040, 0x3755, 0x1078, 0x44bc,
++	0x00c0, 0x3755, 0x0d7e, 0x70d8, 0xa06d, 0x6814, 0xc0fc, 0x8007,
++	0x7882, 0x68b4, 0x785a, 0x781b, 0x004f, 0x704c, 0xc08d, 0x780a,
++	0xc1b4, 0x71f2, 0x7003, 0x0030, 0x0d7f, 0x1078, 0x383b, 0x017f,
++	0x81ff, 0x0040, 0x379c, 0xa684, 0x5f00, 0x681e, 0x682b, 0x0000,
++	0x6f14, 0xa186, 0x0002, 0x00c0, 0x379d, 0x1078, 0x2d79, 0x1078,
++	0x2d9a, 0x6820, 0xa084, 0x0800, 0x00c0, 0x379d, 0x8717, 0xa294,
++	0x000f, 0x8213, 0x8213, 0x8213, 0xb284, 0x0300, 0x0040, 0x377c,
++	0xa290, 0x64c0, 0x0078, 0x377e, 0xa290, 0x6540, 0xa290, 0x0000,
++	0x221c, 0xd3c4, 0x00c0, 0x3786, 0x0078, 0x378c, 0x8210, 0x2204,
++	0xa085, 0x0018, 0x2012, 0x8211, 0xd3d4, 0x0040, 0x3797, 0x68a0,
++	0xd0c4, 0x00c0, 0x3797, 0x1078, 0x38bd, 0x0078, 0x2c6e, 0x6008,
++	0xc08d, 0x600a, 0x0078, 0x379d, 0x692a, 0x6916, 0x6818, 0xd0fc,
++	0x0040, 0x37a4, 0x7044, 0x681a, 0xa68c, 0x5f00, 0x691e, 0x6010,
++	0xa005, 0x0040, 0x37b0, 0x8001, 0x00d0, 0x37b0, 0x1078, 0x2bfa,
++	0x6012, 0x6018, 0xa005, 0x0040, 0x37b9, 0x8001, 0x601a, 0x00c0,
++	0x37bc, 0x6008, 0xc0a4, 0x600a, 0x6820, 0xd084, 0x00c0, 0x37c8,
++	0x6800, 0xa005, 0x00c0, 0x37c5, 0x6002, 0x6006, 0x0078, 0x37cc,
++	0x7060, 0x2060, 0x6800, 0x6002, 0x2061, 0x6000, 0x6807, 0x0103,
++	0x2d08, 0x206b, 0x0000, 0x6060, 0x8000, 0x6062, 0x6064, 0xa005,
++	0x6166, 0x0040, 0x37de, 0x2d02, 0x0078, 0x37df, 0x616a, 0x7000,
++	0xa086, 0x0030, 0x00c0, 0x2c6e, 0x7003, 0x0002, 0x70d8, 0xa06d,
++	0x68c0, 0x703e, 0x70d4, 0xa065, 0x68c4, 0x705e, 0x2d00, 0x7052,
++	0xad80, 0x0009, 0x7042, 0x007c, 0xa282, 0x0004, 0x0048, 0x37fa,
++	0x1078, 0x2bfa, 0x2200, 0x0079, 0x37fd, 0x37f8, 0x3801, 0x380d,
++	0x3801, 0x7000, 0xa086, 0x0005, 0x0040, 0x380a, 0x1078, 0x42bd,
++	0x782b, 0x3008, 0x781b, 0x0067, 0x007c, 0x7890, 0x8007, 0x8001,
++	0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff,
++	0xa186, 0x0003, 0x0040, 0x3822, 0xa186, 0x0000, 0x0040, 0x3822,
++	0x0078, 0x429c, 0x781b, 0x0067, 0x007c, 0x6820, 0xc095, 0x6822,
++	0x82ff, 0x00c0, 0x382f, 0x1078, 0x42bd, 0x0078, 0x3836, 0x8211,
++	0x0040, 0x3834, 0x1078, 0x2bfa, 0x1078, 0x42cd, 0x782b, 0x3008,
++	0x781b, 0x0067, 0x007c, 0xa684, 0x0060, 0x00c0, 0x3849, 0x2d00,
++	0xa005, 0x0040, 0x38bc, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078,
++	0x38bc, 0xd6dc, 0x00c0, 0x3861, 0x68b4, 0xd0dc, 0x00c0, 0x3861,
++	0x6998, 0x6a94, 0x692e, 0x6a32, 0x7044, 0xa005, 0x00c0, 0x385e,
++	0x2200, 0xa105, 0x0040, 0x3860, 0x7047, 0x0015, 0x0078, 0x55ac,
++	0x007c, 0xd6ac, 0x0040, 0x388b, 0xd6f4, 0x0040, 0x386d, 0x682f,
++	0x0000, 0x6833, 0x0000, 0x0078, 0x55ac, 0x68b4, 0xa084, 0x4000,
++	0xa635, 0xd6f4, 0x00c0, 0x3867, 0x7044, 0xa005, 0x00c0, 0x387a,
++	0x7047, 0x0015, 0xd6dc, 0x00c0, 0x3885, 0x68b4, 0xd0dc, 0x0040,
++	0x3885, 0x69a8, 0x6aa4, 0x0078, 0x3887, 0x79d8, 0x7adc, 0x692e,
++	0x6a32, 0x0078, 0x55ac, 0xd6f4, 0x0040, 0x3894, 0x682f, 0x0000,
++	0x6833, 0x0000, 0x0078, 0x55ac, 0x68b4, 0xa084, 0x4800, 0xa635,
++	0xd6f4, 0x00c0, 0x388e, 0x7044, 0xa005, 0x00c0, 0x38a1, 0x7047,
++	0x0015, 0x79d8, 0x7adc, 0x78d0, 0x80fb, 0x00c8, 0x38a8, 0x8000,
++	0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x692e, 0x6a32, 0x2100,
++	0xa205, 0x00c0, 0x38b5, 0x0078, 0x55ac, 0x7000, 0xa086, 0x0006,
++	0x0040, 0x38bc, 0x0078, 0x55ac, 0x007c, 0x6008, 0xc0cd, 0xd3cc,
++	0x0040, 0x38c3, 0xc08d, 0x600a, 0x6818, 0x68ba, 0x681b, 0x0006,
++	0x688f, 0x0000, 0x6893, 0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942,
++	0x682f, 0x0003, 0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000,
++	0x689b, 0x0020, 0x68b3, 0x0000, 0x68af, 0x0000, 0x7000, 0x0079,
++	0x38e1, 0x2c6e, 0x38f3, 0x38eb, 0x38e9, 0x38e9, 0x38e9, 0x38e9,
++	0x38e9, 0x1078, 0x2bfa, 0x6820, 0xd084, 0x00c0, 0x38f3, 0x1078,
++	0x3fd3, 0x0078, 0x38f9, 0x7060, 0x2c50, 0x2060, 0x6800, 0x6002,
++	0x2a60, 0xb28c, 0x0300, 0x0040, 0x3901, 0x2021, 0x6059, 0x0078,
++	0x3903, 0x2021, 0x6099, 0x2404, 0xa005, 0x0040, 0x390a, 0x2020,
++	0x0078, 0x3903, 0x2d22, 0x206b, 0x0000, 0x007c, 0x1078, 0x3fda,
++	0x1078, 0x3fe8, 0x6008, 0xc0cc, 0x600a, 0x789b, 0x000e, 0x6f14,
++	0x6817, 0x0002, 0xb28c, 0x0300, 0x0040, 0x3922, 0x2009, 0x0000,
++	0x0078, 0x3924, 0x2009, 0x0001, 0x1078, 0x5ab0, 0xd6dc, 0x0040,
++	0x392c, 0x691c, 0xc1ed, 0x691e, 0x68b8, 0xd0fc, 0x00c0, 0x3933,
++	0x681a, 0x0078, 0x3942, 0x6818, 0xd0fc, 0x0040, 0x3942, 0x7868,
++	0xa08c, 0x00ff, 0x0040, 0x3940, 0x681b, 0x001e, 0x0078, 0x3942,
++	0x681b, 0x0000, 0xb284, 0x0300, 0x00c0, 0x394a, 0x2021, 0x6099,
++	0x0078, 0x394c, 0x2021, 0x6059, 0x2404, 0xad06, 0x0040, 0x3951,
++	0x7460, 0x6800, 0x2022, 0x68d3, 0x0000, 0x70f4, 0xc084, 0x70f6,
++	0x6a3c, 0x6940, 0x6a32, 0x692e, 0x68c4, 0x2060, 0x6000, 0xd0a4,
++	0x0040, 0x3996, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020,
++	0x0d7e, 0x0f7e, 0x157e, 0x147e, 0x2079, 0x6000, 0x1078, 0x1e83,
++	0x147f, 0x157f, 0x0f7f, 0x70e8, 0x2010, 0x2009, 0x0101, 0x027e,
++	0x2204, 0xa06d, 0x0040, 0x3986, 0x6814, 0xa706, 0x0040, 0x3983,
++	0x6800, 0x0078, 0x3979, 0x6820, 0xc0d5, 0x6822, 0x027f, 0x8210,
++	0x8109, 0x00c0, 0x3977, 0x0d7f, 0x706b, 0x0003, 0x7083, 0x0000,
++	0x777a, 0x7087, 0x000f, 0x71f0, 0xc1dc, 0x71f2, 0x6818, 0xa086,
++	0x0002, 0x00c0, 0x39a2, 0x6817, 0x0000, 0x682b, 0x0000, 0x681c,
++	0xc0ec, 0x681e, 0x1078, 0x2251, 0x0078, 0x2c6e, 0x1078, 0x383b,
++	0x682b, 0x0000, 0x789b, 0x000e, 0x6f14, 0x1078, 0x44ff, 0xa08c,
++	0x00ff, 0x6916, 0x6818, 0xd0fc, 0x0040, 0x39b8, 0x7044, 0x681a,
++	0xa68c, 0x5f00, 0x691e, 0x706b, 0x0000, 0x0078, 0x2c6e, 0x7000,
++	0xa005, 0x00c0, 0x39c5, 0x0078, 0x2c6e, 0xa006, 0x1078, 0x55ac,
++	0x6817, 0x0000, 0x6920, 0xd1ac, 0x00c0, 0x39d0, 0x681b, 0x0014,
++	0xa68c, 0x5f00, 0x691e, 0x682b, 0x0000, 0x6820, 0xa084, 0x00ff,
++	0x6822, 0x7000, 0x0079, 0x39dc, 0x2c6e, 0x39e9, 0x39e6, 0x39eb,
++	0x39eb, 0x39eb, 0x39e4, 0x39e4, 0x1078, 0x2bfa, 0x6008, 0xc0d4,
++	0x600a, 0x1078, 0x3fe8, 0x6008, 0xc0a4, 0x600a, 0x0078, 0x3f98,
++	0x2300, 0x0079, 0x39f3, 0x39f6, 0x39f8, 0x3a6d, 0x1078, 0x2bfa,
++	0xd6fc, 0x00c0, 0x3a53, 0x7000, 0xa00d, 0x0079, 0x39ff, 0x2c6e,
++	0x3a0f, 0x3a09, 0x3a3f, 0x3a0f, 0x3a4a, 0x3a07, 0x3a07, 0x1078,
++	0x2bfa, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xa684,
++	0x0060, 0x0040, 0x3a3f, 0xa086, 0x0060, 0x00c0, 0x3a3c, 0xc6ac,
++	0xc6f4, 0xc6ed, 0x7e5a, 0x6eb6, 0x681c, 0xc0ac, 0x681e, 0xa186,
++	0x0002, 0x0040, 0x3a2e, 0x1078, 0x55ac, 0x69ac, 0x68b0, 0xa115,
++	0x0040, 0x3a2e, 0x1078, 0x5972, 0x0078, 0x3a30, 0x1078, 0x591e,
++	0x781b, 0x0067, 0x71f0, 0xd1b4, 0x00c0, 0x2c5e, 0x70c0, 0xa086,
++	0x0001, 0x00c0, 0x2cc7, 0x007c, 0xd6ec, 0x0040, 0x3a19, 0x6818,
++	0xd0fc, 0x0040, 0x3a4a, 0x681b, 0x0015, 0xd6f4, 0x0040, 0x3a4a,
++	0x681b, 0x0007, 0x1078, 0x446a, 0x007c, 0x78cb, 0x0000, 0x781b,
++	0x00cf, 0x0078, 0x2c5e, 0xc6fc, 0x7e5a, 0x7adc, 0x79d8, 0x78d0,
++	0x79d2, 0x801b, 0x00c8, 0x3a5d, 0x8000, 0xa084, 0x003f, 0xa108,
++	0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200,
++	0xa303, 0x68ae, 0x781b, 0x0067, 0x007c, 0x1078, 0x2bfa, 0x2300,
++	0x0079, 0x3a72, 0x3a75, 0x3a77, 0x3ad7, 0x1078, 0x2bfa, 0xd6fc,
++	0x00c0, 0x3ac7, 0x7000, 0xa00d, 0x0079, 0x3a7e, 0x2c6e, 0x3a8e,
++	0x3a88, 0x3abe, 0x3a8e, 0x3ac4, 0x3a86, 0x3a86, 0x1078, 0x2bfa,
++	0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xa684, 0x0060,
++	0x0040, 0x3abe, 0xa086, 0x0060, 0x00c0, 0x3abb, 0xa6b4, 0xbfbf,
++	0xc6ed, 0x7e5a, 0x6eb6, 0xa186, 0x0002, 0x0040, 0x3aaa, 0x1078,
++	0x55ac, 0x69ac, 0x68b0, 0xa115, 0x0040, 0x3aaa, 0x1078, 0x5972,
++	0x0078, 0x3aac, 0x1078, 0x591e, 0x781b, 0x0067, 0x681c, 0xc0b4,
++	0x681e, 0x71f0, 0xd1b4, 0x00c0, 0x2c5e, 0x70c0, 0xa086, 0x0001,
++	0x00c0, 0x2cc7, 0x007c, 0xd6ec, 0x0040, 0x3a98, 0x6818, 0xd0fc,
++	0x0040, 0x3ac4, 0x681b, 0x0007, 0x781b, 0x00d3, 0x007c, 0xc6fc,
++	0x7e5a, 0x7adc, 0x79d8, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94,
++	0x2200, 0xa303, 0x68ae, 0x79d2, 0x781b, 0x0067, 0x007c, 0xd6dc,
++	0x0040, 0x3ae0, 0x782b, 0x3009, 0x781b, 0x0067, 0x0078, 0x2c5e,
++	0x6820, 0xc095, 0x6822, 0x1078, 0x4450, 0xc6dd, 0x1078, 0x42bd,
++	0x782b, 0x3008, 0x781b, 0x0067, 0x007c, 0x2300, 0x0079, 0x3af0,
++	0x3af3, 0x3af5, 0x3af7, 0x1078, 0x2bfa, 0x0078, 0x42aa, 0x7d98,
++	0xd6d4, 0x00c0, 0x3b34, 0x79e4, 0xd1ac, 0x0040, 0x3b06, 0x78ec,
++	0xa084, 0x0003, 0x0040, 0x3b06, 0x782b, 0x3009, 0x789b, 0x0060,
++	0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x7d9a, 0x79e4, 0xd1ac,
++	0x0040, 0x3b17, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x3b30, 0x2001,
++	0x6002, 0x2004, 0xd0e4, 0x00c0, 0x3b2c, 0x6820, 0xd0c4, 0x0040,
++	0x3b2c, 0x0c7e, 0x705c, 0x2060, 0x6004, 0xc09d, 0x6006, 0x6008,
++	0xa084, 0x00ff, 0x600a, 0x0c7f, 0x2001, 0x0014, 0x0078, 0x36cb,
++	0xa184, 0x0007, 0x0079, 0x3b6b, 0x7a90, 0xa294, 0x0007, 0x789b,
++	0x0060, 0x79a8, 0x81ff, 0x0040, 0x3b68, 0x789b, 0x0010, 0x7ba8,
++	0xa384, 0x0001, 0x00c0, 0x3b5b, 0x7ba8, 0x7ba8, 0xa386, 0x0001,
++	0x00c0, 0x3b4e, 0x2009, 0xfff7, 0x0078, 0x3b54, 0xa386, 0x0003,
++	0x00c0, 0x3b5b, 0x2009, 0xffef, 0x0c7e, 0x705c, 0x2060, 0x6004,
++	0xa104, 0x6006, 0x0c7f, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684,
++	0xfffb, 0x785a, 0x782b, 0x3009, 0x6920, 0xa18c, 0xfcff, 0x6922,
++	0x7d9a, 0x0078, 0x445a, 0x3361, 0x336b, 0x3b75, 0x3b7b, 0x3b73,
++	0x3b73, 0x445a, 0x445a, 0x1078, 0x2bfa, 0x6920, 0xa18c, 0xfcff,
++	0x6922, 0x0078, 0x4462, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0078,
++	0x445a, 0x79e4, 0xa184, 0x0030, 0x0040, 0x3b8b, 0x78ec, 0xa084,
++	0x0003, 0x00c0, 0x3bb9, 0x7000, 0xa086, 0x0004, 0x00c0, 0x3ba5,
++	0x7068, 0xa086, 0x0002, 0x00c0, 0x3b9b, 0x2011, 0x0002, 0x2019,
++	0x0000, 0x0078, 0x31d4, 0x7068, 0xa086, 0x0006, 0x0040, 0x3b95,
++	0x7068, 0xa086, 0x0004, 0x0040, 0x3b95, 0x7000, 0xa086, 0x0000,
++	0x0040, 0x2c5e, 0x6820, 0xd0ac, 0x00c0, 0x36cb, 0x6818, 0xa08e,
++	0x0002, 0x0040, 0x3bb7, 0xc0fd, 0x681a, 0x2001, 0x0014, 0x0078,
++	0x36cb, 0xa184, 0x0007, 0x0079, 0x3bbd, 0x445a, 0x445a, 0x3bc5,
++	0x445a, 0x44b1, 0x44b1, 0x445a, 0x445a, 0xd6bc, 0x0040, 0x3c09,
++	0x7188, 0x81ff, 0x0040, 0x3c09, 0xa182, 0x000d, 0x00d0, 0x3bd4,
++	0x708b, 0x0000, 0x0078, 0x3bd9, 0xa182, 0x000c, 0x708a, 0x2009,
++	0x000c, 0x789b, 0x0061, 0x79aa, 0x157e, 0x137e, 0x147e, 0x708c,
++	0x8114, 0xa210, 0x728e, 0xa080, 0x000b, 0xad00, 0x2098, 0x017e,
++	0xb28c, 0x0300, 0x0040, 0x3bfc, 0x007e, 0x2001, 0x6002, 0x2004,
++	0xd0ec, 0x007f, 0x0040, 0x3bf8, 0x20a1, 0x012b, 0x0078, 0x3bfe,
++	0x20a1, 0x022b, 0x0078, 0x3bfe, 0x20a1, 0x012b, 0x017f, 0x789b,
++	0x0000, 0x8108, 0x81ac, 0x53a6, 0x147f, 0x137f, 0x157f, 0x0078,
++	0x4462, 0xd6d4, 0x00c0, 0x3c5c, 0x6820, 0xd084, 0x0040, 0x4462,
++	0xa68c, 0x0060, 0xa684, 0x0060, 0x0040, 0x3c1b, 0xa086, 0x0060,
++	0x00c0, 0x3c1b, 0xc1f5, 0xc194, 0x795a, 0x69b6, 0x789b, 0x0060,
++	0x78ab, 0x0000, 0x789b, 0x0061, 0x6818, 0xc0fd, 0x681a, 0x78aa,
++	0x8008, 0x810c, 0x0040, 0x4001, 0xa18c, 0x00f8, 0x00c0, 0x4001,
++	0x157e, 0x137e, 0x147e, 0x017e, 0xb28c, 0x0300, 0x0040, 0x3c48,
++	0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x3c44,
++	0x20a1, 0x012b, 0x0078, 0x3c4a, 0x20a1, 0x022b, 0x0078, 0x3c4a,
++	0x20a1, 0x012b, 0x017f, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80,
++	0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6814, 0xc0fc,
++	0x8007, 0x7882, 0x0078, 0x4462, 0x6818, 0xd0fc, 0x0040, 0x3c62,
++	0x681b, 0x0008, 0x6820, 0xc0ad, 0x6822, 0x1078, 0x42c5, 0x78cb,
++	0x0000, 0x781b, 0x00cb, 0x007c, 0x2300, 0x0079, 0x3c6f, 0x3c74,
++	0x3d11, 0x3c72, 0x1078, 0x2bfa, 0x7000, 0xa084, 0x000f, 0x0079,
++	0x3c79, 0x2c6e, 0x3cc1, 0x3c83, 0x3c8c, 0x3c81, 0x2c6e, 0x3c81,
++	0x3c81, 0x1078, 0x2bfa, 0x681c, 0xd0ec, 0x0040, 0x3c9d, 0x6008,
++	0xc08d, 0x600a, 0x0078, 0x3c9d, 0x68d0, 0xa005, 0x00c0, 0x3cc1,
++	0x6920, 0xa18d, 0x0001, 0x6922, 0x68d3, 0x0001, 0x70f4, 0xc085,
++	0x70f6, 0x6800, 0x7066, 0x0078, 0x3cae, 0x6920, 0xc185, 0x6922,
++	0x6800, 0x6006, 0xa005, 0x00c0, 0x3ca6, 0x6002, 0x6008, 0xc0d4,
++	0x600a, 0x681c, 0xa084, 0x000e, 0x00c0, 0x3cb8, 0x2009, 0xa7d0,
++	0xb284, 0x0300, 0x0040, 0x3cbd, 0x2009, 0xa6c0, 0x0078, 0x3cbd,
++	0x702c, 0x68be, 0x713c, 0x70e8, 0xa108, 0x2104, 0x6802, 0x2d0a,
++	0x7162, 0x6eb6, 0xa684, 0x0060, 0x00c0, 0x3ccb, 0xa684, 0x7fff,
++	0x68b6, 0x0078, 0x3d0f, 0xd6dc, 0x00c0, 0x3cd9, 0xa684, 0x7fff,
++	0x68b6, 0x6894, 0x68a6, 0x6898, 0x68aa, 0x1078, 0x55ac, 0x0078,
++	0x3d0f, 0xd6ac, 0x0040, 0x3cec, 0x68d0, 0xa005, 0x0040, 0x3ce4,
++	0x1078, 0x5ab0, 0x0078, 0x3ce6, 0x1078, 0x55ac, 0x79d8, 0x7adc,
++	0x69aa, 0x6aa6, 0x0078, 0x3cf2, 0x1078, 0x43bc, 0x69aa, 0x6aa6,
++	0x1078, 0x55ac, 0xd6fc, 0x0040, 0x3d0f, 0xa684, 0x7fff, 0x68b6,
++	0x7adc, 0x79d8, 0xd6ac, 0x00c0, 0x3d07, 0x78d0, 0x801b, 0x00c8,
++	0x3d02, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98,
++	0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x0078,
++	0x2c6e, 0x0078, 0x42aa, 0x7043, 0x0000, 0xa282, 0x0006, 0x0050,
++	0x3d1b, 0x1078, 0x2bfa, 0x7000, 0xa086, 0x0007, 0x1040, 0x45de,
++	0x2300, 0x0079, 0x3d23, 0x3d26, 0x3d5d, 0x3d7e, 0x2200, 0x0079,
++	0x3d29, 0x3d5b, 0x42aa, 0x3d2f, 0x3d5b, 0x3da1, 0x3e14, 0x7003,
++	0x0005, 0xb284, 0x0300, 0x0040, 0x3d39, 0x2001, 0xaa20, 0x0078,
++	0x3d3b, 0x2001, 0xaa57, 0x2068, 0x7052, 0x157e, 0x20a9, 0x0037,
++	0x2003, 0x0000, 0x8000, 0x00f0, 0x3d40, 0x157f, 0xad80, 0x0009,
++	0x7042, 0xb284, 0x0300, 0x0040, 0x3d51, 0x6817, 0x0000, 0x0078,
++	0x3d53, 0x6817, 0x8000, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827,
++	0x0003, 0x0078, 0x429c, 0x1078, 0x2bfa, 0x2200, 0xa086, 0x0003,
++	0x0040, 0x3da1, 0x7003, 0x0005, 0xb284, 0x0300, 0x0040, 0x3d6c,
++	0x2001, 0xaa20, 0x0078, 0x3d6e, 0x2001, 0xaa57, 0x2068, 0x7052,
++	0xad80, 0x0009, 0x7042, 0x2200, 0x0079, 0x3d76, 0x42aa, 0x3d7c,
++	0x3d7c, 0x3da1, 0x3d7c, 0x42aa, 0x1078, 0x2bfa, 0x7003, 0x0005,
++	0xb284, 0x0300, 0x0040, 0x3d88, 0x2001, 0xaa20, 0x0078, 0x3d8a,
++	0x2001, 0xaa57, 0x2068, 0x7052, 0xad80, 0x0009, 0x7042, 0x2200,
++	0x0079, 0x3d92, 0x3d9a, 0x3d98, 0x3d98, 0x3d9a, 0x3d98, 0x3d9a,
++	0x1078, 0x2bfa, 0x1078, 0x42cd, 0x782b, 0x3008, 0x781b, 0x0067,
++	0x007c, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3db3, 0x70f0, 0xc0b5,
++	0x70f2, 0x2c00, 0x70d6, 0x2d00, 0x70da, 0x0078, 0x3db8, 0x1078,
++	0x55ac, 0x0078, 0x3db8, 0x7000, 0xa086, 0x0003, 0x0040, 0x3daf,
++	0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8,
++	0xa484, 0x001f, 0xa215, 0x2069, 0xa6c0, 0xb284, 0x0300, 0x00c0,
++	0x3dcc, 0xc2fd, 0x2069, 0xa7d0, 0x2d04, 0x2d08, 0x7162, 0xa06d,
++	0x0040, 0x3dd9, 0x6814, 0xa206, 0x0040, 0x3df9, 0x6800, 0x0078,
++	0x3dcd, 0x7003, 0x0005, 0xd2fc, 0x00c0, 0x3de2, 0x2001, 0xaa20,
++	0x0078, 0x3de4, 0x2001, 0xaa57, 0x2068, 0x7052, 0x157e, 0x20a9,
++	0x0037, 0x2003, 0x0000, 0x8000, 0x00f0, 0x3de9, 0x157f, 0xad80,
++	0x0009, 0x7042, 0x6a16, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827,
++	0x0003, 0x6eb4, 0x7e5a, 0x6920, 0xa184, 0x0c00, 0x0040, 0x3e9e,
++	0x7068, 0xa086, 0x0006, 0x00c0, 0x3e0b, 0x7078, 0xa206, 0x00c0,
++	0x3e0b, 0x706a, 0x7082, 0x681b, 0x0005, 0xc1ad, 0xc1d4, 0x6922,
++	0x1078, 0x42c5, 0x0078, 0x3e9e, 0x7200, 0xa286, 0x0002, 0x00c0,
++	0x3e26, 0x70f0, 0xc0b5, 0x70f2, 0x2c00, 0x70d6, 0x2d00, 0x70da,
++	0x0078, 0x3e2a, 0x1078, 0x55ac, 0x0078, 0x3e2a, 0xa286, 0x0003,
++	0x0040, 0x3e22, 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b,
++	0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0xb284, 0x0300, 0x00c0,
++	0x3e3a, 0xc2fd, 0x79a8, 0x79a8, 0xa18c, 0x00ff, 0x2118, 0x70e8,
++	0xa168, 0x2d04, 0x2d08, 0x7162, 0xa06d, 0x0040, 0x3e4e, 0x6814,
++	0xa206, 0x0040, 0x3e77, 0x6800, 0x0078, 0x3e42, 0x7003, 0x0005,
++	0xb284, 0x0300, 0x0040, 0x3e58, 0x2001, 0xaa20, 0x0078, 0x3e5a,
++	0x2001, 0xaa57, 0x2068, 0x7052, 0x157e, 0x20a9, 0x0037, 0x2003,
++	0x0000, 0x8000, 0x00f0, 0x3e5f, 0x157f, 0xad80, 0x0009, 0x7042,
++	0xb284, 0x0300, 0x0040, 0x3e6f, 0xc2fc, 0x0078, 0x3e70, 0xc2fd,
++	0x6a16, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4,
++	0x6920, 0xa184, 0x0c00, 0x0040, 0x3e9e, 0xd0dc, 0x0040, 0x3e93,
++	0x7068, 0xa086, 0x0004, 0x00c0, 0x3e8f, 0x7078, 0xa206, 0x00c0,
++	0x3e8f, 0x707c, 0xa306, 0x00c0, 0x3e8f, 0x706a, 0x7082, 0x1078,
++	0x42c9, 0x0078, 0x3e9e, 0x681b, 0x0005, 0xc1ad, 0xc1d4, 0x6922,
++	0x1078, 0x42c5, 0x7083, 0x0000, 0x0078, 0x3e9e, 0x68c4, 0x705e,
++	0xc6ec, 0xa684, 0x0060, 0x0040, 0x3ee9, 0x6b98, 0x6c94, 0x69ac,
++	0x68b0, 0xa105, 0x00c0, 0x3ecb, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde,
++	0xa684, 0x0060, 0xa086, 0x0060, 0x0040, 0x3eef, 0x68d0, 0xa005,
++	0x0040, 0x3ec3, 0x7003, 0x0003, 0x682b, 0x0000, 0xc6ed, 0x1078,
++	0x590b, 0x0078, 0x3eef, 0xd6f4, 0x00c0, 0x3eef, 0xc6ed, 0x1078,
++	0x591e, 0x0078, 0x3eef, 0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400,
++	0xa305, 0x0040, 0x3ef1, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68d0,
++	0xa005, 0x0040, 0x3ee1, 0x7003, 0x0003, 0x1078, 0x590b, 0x0078,
++	0x3ef1, 0xd6f4, 0x00c0, 0x3ee8, 0xc6ed, 0x68b0, 0x1078, 0x5972,
++	0xc6f4, 0x2019, 0x0000, 0x2021, 0x0000, 0x0078, 0x3ef1, 0xa6b4,
++	0xb7ff, 0x7e5a, 0x2009, 0x0067, 0xa684, 0x0004, 0x0040, 0x3f11,
++	0x78e4, 0xa084, 0x0030, 0x0040, 0x3f09, 0x78ec, 0xa084, 0x0003,
++	0x0040, 0x3f09, 0x782b, 0x3008, 0x2019, 0x0000, 0x2320, 0x0078,
++	0x3f11, 0x0f7e, 0x2079, 0x6000, 0x1078, 0x55ac, 0x0f7f, 0x0040,
++	0x2c6e, 0x791a, 0x2d00, 0x7052, 0x68c8, 0x2060, 0x71f0, 0x2001,
++	0x6001, 0x2004, 0xd0c4, 0x00c0, 0x3f65, 0x70f8, 0xa02d, 0x0040,
++	0x3f3e, 0xd1bc, 0x0040, 0x3f58, 0x7a80, 0xa294, 0x0f00, 0x70fc,
++	0xa206, 0x0040, 0x3f2f, 0x78e0, 0xa504, 0x00c0, 0x3f65, 0x70fa,
++	0xc1bc, 0x71f2, 0x0078, 0x3f65, 0x2031, 0x0001, 0x852c, 0x0048,
++	0x3f3d, 0x8633, 0x8210, 0x0078, 0x3f36, 0x007c, 0x7de0, 0xa594,
++	0xff00, 0x0040, 0x3f4b, 0x2011, 0x0008, 0x852f, 0x1078, 0x3f34,
++	0x8637, 0x0078, 0x3f4d, 0x1078, 0x3f34, 0x8217, 0x7880, 0xa084,
++	0x0f00, 0xa206, 0x0040, 0x3f65, 0x72fe, 0x76fa, 0x0078, 0x3f65,
++	0x7a80, 0xa294, 0x0f00, 0x70fc, 0xa236, 0x0040, 0x3f55, 0x78e0,
++	0xa534, 0x0040, 0x3f55, 0xc1bd, 0x71f2, 0xd1b4, 0x00c0, 0x2c5e,
++	0x2300, 0xa405, 0x0040, 0x2c5e, 0x70c0, 0xa086, 0x0001, 0x00c0,
++	0x2cc7, 0x007c, 0x6020, 0xa005, 0x0040, 0x3f80, 0x8001, 0x6022,
++	0x6008, 0xa085, 0x0008, 0x600a, 0x700b, 0x0100, 0x7028, 0x6026,
++	0x007c, 0xa006, 0x1078, 0x55ac, 0x7000, 0xa086, 0x0002, 0x0040,
++	0x3f8e, 0x7068, 0xa086, 0x0005, 0x00c0, 0x3f98, 0x682b, 0x0000,
++	0x6817, 0x0000, 0x681b, 0x0001, 0x6823, 0x0040, 0x681f, 0x0100,
++	0x7000, 0xa084, 0x000f, 0x0079, 0x3f9d, 0x2c6e, 0x3fad, 0x3fa7,
++	0x3fcf, 0x3fb7, 0x3fb5, 0x3fa5, 0x3fa5, 0x1078, 0x2bfa, 0x1078,
++	0x3fda, 0x1078, 0x3fd3, 0x0078, 0x3fb3, 0x1078, 0x3fda, 0x7060,
++	0x2060, 0x6800, 0x6002, 0x1078, 0x2251, 0x0078, 0x2c6e, 0x7068,
++	0x706b, 0x0000, 0x7087, 0x0000, 0x0079, 0x3fbe, 0x3fcb, 0x3fcb,
++	0x3fc6, 0x3fc6, 0x3fc6, 0x3fcb, 0x3fc6, 0x3fcb, 0x77f0, 0xc7dd,
++	0x77f2, 0x0079, 0x31ef, 0x706b, 0x0000, 0x0078, 0x2c6e, 0x681b,
++	0x0000, 0x0078, 0x390e, 0x6800, 0xa005, 0x00c0, 0x3fd8, 0x6002,
++	0x6006, 0x007c, 0x6010, 0xa005, 0x0040, 0x3fe3, 0x8001, 0x00d0,
++	0x3fe3, 0x1078, 0x2bfa, 0x6012, 0x6008, 0xc0a4, 0x600a, 0x007c,
++	0x6018, 0xa005, 0x0040, 0x3fee, 0x8001, 0x601a, 0x007c, 0x1078,
++	0x44fa, 0x681b, 0x0018, 0x0078, 0x402d, 0x1078, 0x44fa, 0x681b,
++	0x0019, 0x0078, 0x402d, 0x1078, 0x44fa, 0x681b, 0x001a, 0x0078,
++	0x402d, 0x1078, 0x44fa, 0x681b, 0x0003, 0x0078, 0x402d, 0x7778,
++	0x1078, 0x43a8, 0x717c, 0xa18c, 0x00ff, 0xd7fc, 0x00c0, 0x4014,
++	0xa1e8, 0xa5c0, 0x0078, 0x4016, 0xa1e8, 0xa6d0, 0x2d04, 0x2d08,
++	0x2068, 0xa005, 0x00c0, 0x401f, 0x7082, 0x0078, 0x2c6e, 0x6814,
++	0x7278, 0xa206, 0x0040, 0x4027, 0x6800, 0x0078, 0x4017, 0x6800,
++	0x200a, 0x681b, 0x0005, 0x7083, 0x0000, 0x1078, 0x3fda, 0x6820,
++	0xd084, 0x00c0, 0x4035, 0x1078, 0x3fd3, 0x1078, 0x3fe8, 0x681f,
++	0x0000, 0x6823, 0x0020, 0x682b, 0x0000, 0x1078, 0x2251, 0x0078,
++	0x2c6e, 0xa282, 0x0003, 0x00c0, 0x429c, 0x7da8, 0xa5ac, 0x00ff,
++	0x7ca8, 0xa4a4, 0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1c4, 0x0040,
++	0x409f, 0xc1c4, 0x6922, 0xa4a4, 0x00ff, 0x0040, 0x408c, 0xa482,
++	0x000c, 0x0048, 0x405f, 0x0040, 0x405f, 0x2021, 0x000c, 0x2500,
++	0xa086, 0x000a, 0x0040, 0x4066, 0x852b, 0x852b, 0x1078, 0x4334,
++	0x0040, 0x406e, 0x1078, 0x4162, 0x0078, 0x4095, 0x1078, 0x4320,
++	0x0c7e, 0x2960, 0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x418d,
++	0x0c7f, 0x6920, 0xc1c5, 0x6922, 0x7e58, 0xc695, 0x7e5a, 0xd6d4,
++	0x00c0, 0x4087, 0x782b, 0x3008, 0x781b, 0x0058, 0x007c, 0x782b,
++	0x3008, 0x781b, 0x0067, 0x007c, 0x0c7e, 0x2960, 0x6004, 0xa084,
++	0xfff5, 0x6006, 0x1078, 0x418d, 0x0c7f, 0x7e58, 0xd6d4, 0x00c0,
++	0x409c, 0x781b, 0x005a, 0x007c, 0x781b, 0x0067, 0x007c, 0x0c7e,
++	0x705c, 0x2060, 0x6100, 0xd1e4, 0x0040, 0x40e8, 0x6208, 0x8217,
++	0xa294, 0x00ff, 0xa282, 0x000c, 0x0048, 0x40b2, 0x0040, 0x40b2,
++	0x2011, 0x000c, 0x2400, 0xa202, 0x00c8, 0x40b7, 0x2220, 0x6208,
++	0xa294, 0x00ff, 0x2001, 0x6003, 0x2004, 0xd0e4, 0x00c0, 0x40cc,
++	0x78ec, 0xd0e4, 0x0040, 0x40cc, 0xa282, 0x000a, 0x00c8, 0x40d2,
++	0x2011, 0x000a, 0x0078, 0x40d2, 0xa282, 0x000c, 0x00c8, 0x40d2,
++	0x2011, 0x000c, 0x2200, 0xa502, 0x00c8, 0x40d7, 0x2228, 0x1078,
++	0x4324, 0x2500, 0xa086, 0x000a, 0x0040, 0x40e0, 0x852b, 0x852b,
++	0x1078, 0x4334, 0x0040, 0x40e8, 0x1078, 0x4162, 0x0078, 0x40ec,
++	0x1078, 0x4320, 0x1078, 0x418d, 0x7858, 0xc095, 0x785a, 0x0c7f,
++	0x782b, 0x3008, 0x781b, 0x0067, 0x007c, 0x0c7e, 0x2960, 0x6000,
++	0xd0e4, 0x00c0, 0x410b, 0xa084, 0x0040, 0x00c0, 0x4105, 0x6104,
++	0xa18c, 0xfff5, 0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019,
++	0x0000, 0x0078, 0x4136, 0x68a0, 0xd0cc, 0x00c0, 0x4105, 0x6208,
++	0xa294, 0x00ff, 0x2001, 0x6003, 0x2004, 0xd0e4, 0x00c0, 0x4124,
++	0x78ec, 0xd0e4, 0x0040, 0x4124, 0xa282, 0x000b, 0x00c8, 0x4124,
++	0x2011, 0x000a, 0x0078, 0x412a, 0xa282, 0x000c, 0x00c8, 0x412a,
++	0x2011, 0x000c, 0x6308, 0x831f, 0xa39c, 0x00ff, 0xa382, 0x000c,
++	0x0048, 0x4136, 0x0040, 0x4136, 0x2019, 0x000c, 0x78ab, 0x0001,
++	0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005,
++	0x6820, 0xc0c5, 0x6822, 0x1078, 0x2d79, 0x0c7f, 0x007c, 0x0c7e,
++	0x2960, 0x6104, 0xa18c, 0xfff5, 0x6106, 0x2011, 0x0032, 0x2019,
++	0x0000, 0x0078, 0x4153, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
++	0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xc0c5, 0x6822,
++	0x0c7f, 0x007c, 0x0c7e, 0x715c, 0x2160, 0x1078, 0x4169, 0x0c7f,
++	0x007c, 0x2008, 0xa084, 0xfff0, 0xa425, 0x7c86, 0x6018, 0x789a,
++	0x7cae, 0x6412, 0x78a4, 0xa084, 0xfff0, 0xa18c, 0x000f, 0xa105,
++	0x78a6, 0x6016, 0x788a, 0xa4a4, 0x000f, 0x8427, 0x8204, 0x8004,
++	0xa084, 0x00ff, 0xa405, 0x600e, 0x78ec, 0xd08c, 0x00c0, 0x418c,
++	0x6004, 0xa084, 0xfff5, 0x6006, 0x007c, 0x0c7e, 0x705c, 0x2060,
++	0x1078, 0x4194, 0x0c7f, 0x007c, 0x6018, 0x789a, 0x78a4, 0xa084,
++	0xfff0, 0x78a6, 0x6012, 0x7884, 0xa084, 0xfff0, 0x7886, 0x600c,
++	0xa084, 0x00ff, 0x600e, 0x007c, 0xa282, 0x0002, 0x00c0, 0x429c,
++	0x7aa8, 0x6920, 0xc1bd, 0x6922, 0xd1cc, 0x0040, 0x41e3, 0xc1cc,
++	0x6922, 0xa294, 0x00ff, 0xa282, 0x0002, 0x00c8, 0x429c, 0x1078,
++	0x4227, 0x1078, 0x418d, 0xa980, 0x0001, 0x200c, 0x1078, 0x43a4,
++	0x1078, 0x40f5, 0x88ff, 0x0040, 0x41d9, 0x789b, 0x0060, 0x2800,
++	0x78aa, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x41d4, 0x782b,
++	0x3008, 0x781b, 0x0058, 0x007c, 0x782b, 0x3008, 0x781b, 0x0067,
++	0x007c, 0x7e58, 0xd6d4, 0x00c0, 0x41e0, 0x781b, 0x005a, 0x007c,
++	0x781b, 0x0067, 0x007c, 0xa282, 0x0002, 0x00c8, 0x41eb, 0xa284,
++	0x0001, 0x0040, 0x41f3, 0x715c, 0xa188, 0x0000, 0x210c, 0xd1ec,
++	0x00c0, 0x41f3, 0xa016, 0x1078, 0x4311, 0x1078, 0x4227, 0x1078,
++	0x418d, 0x7858, 0xc095, 0x785a, 0x782b, 0x3008, 0x781b, 0x0067,
++	0x007c, 0x0c7e, 0x027e, 0x2960, 0x6000, 0x2011, 0x0001, 0xd0ec,
++	0x00c0, 0x4215, 0xa084, 0x0080, 0x00c0, 0x4213, 0xc1a4, 0x6106,
++	0xa006, 0x0078, 0x4224, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab,
++	0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x1078, 0x2d79,
++	0x6820, 0xa085, 0x0200, 0x6822, 0x027f, 0x0c7f, 0x007c, 0x0c7e,
++	0x705c, 0x2060, 0x1078, 0x422e, 0x0c7f, 0x007c, 0x82ff, 0x0040,
++	0x4233, 0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a, 0x78a4,
++	0xa084, 0xffbf, 0xa205, 0x78a6, 0x788a, 0x6016, 0x6004, 0x78ec,
++	0xd08c, 0x00c0, 0x4245, 0xc0a4, 0x6006, 0x007c, 0x007e, 0x7000,
++	0xa086, 0x0003, 0x0040, 0x424f, 0x007f, 0x0078, 0x4252, 0x007f,
++	0x0078, 0x4299, 0xd6ac, 0x0040, 0x4299, 0x7888, 0xa084, 0x0040,
++	0x0040, 0x4299, 0x7bb8, 0xa384, 0x003f, 0x831b, 0x00c8, 0x4261,
++	0x8000, 0xa005, 0x0040, 0x4276, 0x831b, 0x00c8, 0x426a, 0x8001,
++	0x0040, 0x4296, 0xd6f4, 0x0040, 0x4276, 0x78b8, 0x801b, 0x00c8,
++	0x4272, 0x8000, 0xa084, 0x003f, 0x00c0, 0x4296, 0xc6f4, 0x7e5a,
++	0x79d8, 0x7adc, 0x2001, 0x0001, 0xa108, 0x00c8, 0x4281, 0xa291,
++	0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x1078, 0x5a6b, 0x781b,
++	0x0066, 0xb284, 0x0300, 0x0040, 0x4291, 0x2001, 0x0000, 0x0078,
++	0x4293, 0x2001, 0x0001, 0x1078, 0x588c, 0x007c, 0x781b, 0x0066,
++	0x007c, 0x781b, 0x0067, 0x007c, 0x1078, 0x42d1, 0x782b, 0x3008,
++	0x781b, 0x0067, 0x007c, 0x1078, 0x42bd, 0x782b, 0x3008, 0x781b,
++	0x0067, 0x007c, 0x6827, 0x0002, 0x1078, 0x42c5, 0x78e4, 0xa084,
++	0x0030, 0x0040, 0x2c6e, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2c6e,
++	0x782b, 0x3008, 0x781b, 0x0067, 0x007c, 0x2001, 0x0005, 0x0078,
++	0x42d3, 0x2001, 0x000c, 0x0078, 0x42d3, 0x2001, 0x0006, 0x0078,
++	0x42d3, 0x2001, 0x000d, 0x0078, 0x42d3, 0x2001, 0x0009, 0x0078,
++	0x42d3, 0x2001, 0x0007, 0x789b, 0x0010, 0x78aa, 0x789b, 0x0060,
++	0x78ab, 0x0001, 0xc695, 0x7e5a, 0x0078, 0x2d79, 0x077e, 0x873f,
++	0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0x017e, 0xb28c, 0x0300,
++	0x0040, 0x42ee, 0xa0e0, 0x64c0, 0x0078, 0x42f0, 0xa0e0, 0x6540,
++	0x017f, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184, 0x000f, 0x0040,
++	0x4300, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004, 0xc09d, 0x6006,
++	0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040, 0x0040, 0x430f,
++	0xa184, 0xffbf, 0x78a6, 0x6016, 0x6004, 0xc0a5, 0x6006, 0x077f,
++	0x007c, 0x789b, 0x0010, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab,
++	0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab, 0x0004, 0x0078, 0x2d79,
++	0x2021, 0x0000, 0x2029, 0x0032, 0x789b, 0x0010, 0x78ab, 0x0001,
++	0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7caa, 0x789b, 0x0060,
++	0x78ab, 0x0005, 0x0078, 0x2d79, 0x157e, 0x2001, 0x6003, 0x2004,
++	0xd0e4, 0x00c0, 0x4367, 0x2009, 0x439b, 0x20a9, 0x0009, 0x2510,
++	0xa582, 0x000a, 0x0040, 0x4362, 0x0048, 0x4362, 0x8108, 0x95a9,
++	0xa582, 0x0030, 0x0040, 0x437d, 0x0048, 0x437d, 0x8108, 0x95a9,
++	0x2019, 0x000a, 0x2011, 0x0064, 0x2200, 0xa502, 0x0040, 0x437d,
++	0x0048, 0x437d, 0x8108, 0x2300, 0xa210, 0x00f0, 0x4354, 0x157f,
++	0x0078, 0x437b, 0x2510, 0x8213, 0x8213, 0x0078, 0x437d, 0x2009,
++	0x438d, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011, 0x0032, 0x2200,
++	0xa502, 0x0040, 0x437d, 0x0048, 0x437d, 0x8108, 0x2300, 0xa210,
++	0x00f0, 0x436f, 0x157f, 0xa006, 0x007c, 0x157f, 0xa582, 0x0064,
++	0x00c8, 0x438a, 0x7808, 0xa085, 0x0070, 0x780a, 0x704c, 0xa085,
++	0x0070, 0x704e, 0x2104, 0xa005, 0x007c, 0x1209, 0x3002, 0x3202,
++	0x4203, 0x4403, 0x5404, 0x5604, 0x6605, 0x6805, 0x7806, 0x7a06,
++	0x0c07, 0x0c07, 0x0e07, 0x10e1, 0x330a, 0x5805, 0x5a05, 0x6a06,
++	0x6c06, 0x7c07, 0x7e07, 0x0e00, 0x789b, 0x0010, 0xa046, 0x007c,
++	0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003,
++	0x8003, 0xa105, 0xd7fc, 0x0040, 0x43b9, 0xa0e0, 0x85c0, 0x0078,
++	0x43bb, 0xa0e0, 0x65c0, 0x007c, 0x79d8, 0x7adc, 0x78d0, 0x801b,
++	0x00c8, 0x43c3, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
++	0x007c, 0x0e7e, 0x0f7e, 0xd084, 0x0040, 0x43d6, 0x2079, 0x0100,
++	0x2009, 0x6080, 0x2071, 0x6080, 0x0078, 0x43e6, 0x2001, 0x6002,
++	0x2004, 0xd0ec, 0x0040, 0x43e0, 0x2079, 0x0100, 0x0078, 0x43e2,
++	0x2079, 0x0200, 0x2009, 0x6040, 0x2071, 0x6040, 0x2091, 0x8000,
++	0x2104, 0xa084, 0x000f, 0x0079, 0x43ed, 0x43f7, 0x43f7, 0x43f7,
++	0x43f7, 0x43f7, 0x43f7, 0x43f5, 0x444a, 0x1078, 0x2bfa, 0x69b4,
++	0xc1f5, 0xa18c, 0xff9f, 0x69b6, 0xa005, 0x0040, 0x4447, 0x7858,
++	0xa084, 0xff9f, 0xa085, 0x6000, 0x785a, 0x7828, 0xa086, 0x1814,
++	0x00c0, 0x4447, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004, 0x00c0,
++	0x440c, 0x784b, 0x0008, 0x7848, 0xa084, 0x0008, 0x00c0, 0x4413,
++	0x7830, 0xd0bc, 0x00c0, 0x4447, 0x3200, 0x007e, 0x2001, 0x6002,
++	0x2004, 0xd0ec, 0x007f, 0x0040, 0x4429, 0xa084, 0x0300, 0x0078,
++	0x442b, 0xa084, 0x0400, 0x0040, 0x4431, 0x0018, 0x4447, 0x0078,
++	0x4433, 0x0028, 0x4447, 0x79e4, 0xa184, 0x0030, 0x0040, 0x4447,
++	0x78ec, 0xa084, 0x0003, 0x0040, 0x4447, 0x681c, 0xd0ac, 0x00c0,
++	0x4445, 0x1078, 0x446a, 0x0078, 0x4447, 0x781b, 0x00d3, 0x0f7f,
++	0x0e7f, 0x007c, 0x70a7, 0x0000, 0x1078, 0x46d0, 0x0078, 0x4447,
++	0x2001, 0x6001, 0x2004, 0xd0ac, 0x00c0, 0x4459, 0x6814, 0x1078,
++	0x2b7a, 0x007c, 0x781b, 0x0067, 0x007c, 0x782b, 0x3008, 0x781b,
++	0x0067, 0x007c, 0x781b, 0x005a, 0x007c, 0x782b, 0x3008, 0x781b,
++	0x0058, 0x007c, 0x2009, 0x6017, 0x210c, 0xa186, 0x0000, 0x0040,
++	0x447c, 0xa186, 0x0001, 0x0040, 0x4481, 0x701b, 0x000b, 0x706b,
++	0x0001, 0x781b, 0x0048, 0x007c, 0x78cb, 0x0000, 0x781b, 0x00cf,
++	0x007c, 0x701b, 0x000a, 0x007c, 0x2009, 0x6017, 0x210c, 0xa186,
++	0x0000, 0x0040, 0x449a, 0xa186, 0x0001, 0x0040, 0x4497, 0x701b,
++	0x000b, 0x706b, 0x0001, 0x781b, 0x0048, 0x0078, 0x2c5e, 0x701b,
++	0x000a, 0x007c, 0x782b, 0x3008, 0x78cb, 0x0000, 0x781b, 0x00cf,
++	0x007c, 0x781b, 0x00d3, 0x007c, 0x782b, 0x3008, 0x781b, 0x00d3,
++	0x007c, 0x781b, 0x009b, 0x007c, 0x782b, 0x3008, 0x781b, 0x009b,
++	0x007c, 0x6818, 0xd0fc, 0x0040, 0x44b7, 0x681b, 0x001d, 0x706b,
++	0x0001, 0x781b, 0x0048, 0x007c, 0x7830, 0xa084, 0x00c0, 0x00c0,
++	0x44df, 0x7808, 0xa084, 0xfffc, 0x780a, 0x0005, 0x0005, 0x0005,
++	0x0005, 0x78ec, 0xa084, 0x0021, 0x00c0, 0x44dc, 0x2001, 0x6003,
++	0x2004, 0xd0e4, 0x00c0, 0x44da, 0x7804, 0xa084, 0xff1f, 0xa085,
++	0x00e0, 0x7806, 0xa006, 0x007c, 0x704c, 0xc08d, 0x780a, 0x007c,
++	0x7830, 0xa084, 0x0080, 0x00c0, 0x44f9, 0x78ec, 0xa084, 0x0002,
++	0x00c0, 0x44f9, 0x7808, 0xc08c, 0x780a, 0x0005, 0x0005, 0x0005,
++	0x0005, 0x78ec, 0xa084, 0x0002, 0x0040, 0x44f9, 0x7808, 0xc08d,
++	0x780a, 0x007c, 0x704c, 0xc08d, 0x704e, 0x780a, 0x007c, 0x7830,
++	0xa084, 0x0040, 0x00c0, 0x44ff, 0x3200, 0x007e, 0x2001, 0x6002,
++	0x2004, 0xd0ec, 0x007f, 0x0040, 0x4511, 0xa084, 0x0300, 0x0078,
++	0x4513, 0xa084, 0x0400, 0x0040, 0x4519, 0x0098, 0x451d, 0x0078,
++	0x451b, 0x00a8, 0x451d, 0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd,
++	0x780a, 0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021,
++	0x0040, 0x4541, 0x3200, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec,
++	0x007f, 0x0040, 0x4537, 0xa084, 0x0300, 0x0078, 0x4539, 0xa084,
++	0x0400, 0x0040, 0x453f, 0x0098, 0x453b, 0x0078, 0x4541, 0x00a8,
++	0x453f, 0x78ac, 0x007e, 0x704c, 0x780a, 0x007f, 0x007c, 0x78ec,
++	0xa084, 0x0002, 0x00c0, 0x5596, 0xa784, 0x007d, 0x00c0, 0x4553,
++	0x2700, 0x1078, 0x2bfa, 0xa784, 0x0001, 0x00c0, 0x39bf, 0xa784,
++	0x0070, 0x0040, 0x4563, 0x0c7e, 0x2d60, 0x2f68, 0x1078, 0x2b67,
++	0x2d78, 0x2c68, 0x0c7f, 0xa784, 0x0008, 0x0040, 0x4570, 0x784b,
++	0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x39bf, 0x0078, 0x445a,
++	0xa784, 0x0004, 0x0040, 0x459f, 0x78b8, 0xa084, 0x4001, 0x0040,
++	0x459f, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x39bf,
++	0x78e4, 0xa084, 0x0007, 0xa086, 0x0001, 0x00c0, 0x459f, 0x78c0,
++	0xa085, 0x4800, 0x2030, 0x7e5a, 0x781b, 0x00d3, 0x007c, 0x784b,
++	0x0008, 0x6818, 0xd0fc, 0x0040, 0x459c, 0x681b, 0x0015, 0xd6f4,
++	0x0040, 0x459c, 0x681b, 0x0007, 0x1078, 0x446a, 0x007c, 0x681b,
++	0x0003, 0x7858, 0xa084, 0x5f00, 0x681e, 0x682f, 0x0000, 0x6833,
++	0x0000, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x332a,
++	0x3200, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040,
++	0x45bd, 0xa084, 0x0300, 0x0078, 0x45bf, 0xa084, 0x0400, 0x0040,
++	0x45c5, 0x0018, 0x2c5e, 0x0078, 0x45c7, 0x0028, 0x2c5e, 0x0078,
++	0x42a3, 0x6b14, 0x8307, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++	0xd3fc, 0x0040, 0x45d7, 0xa080, 0x6540, 0x0078, 0x45d9, 0xa080,
++	0x64c0, 0x2060, 0x2048, 0x705e, 0x2a60, 0x007c, 0x7000, 0x0079,
++	0x45e1, 0x45e9, 0x45e9, 0x45ea, 0x45f2, 0x45e9, 0x45e9, 0x45e9,
++	0x45f5, 0x007c, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001,
++	0x601a, 0x007c, 0x1078, 0x55ac, 0x007c, 0x7094, 0xa005, 0x0040,
++	0x4610, 0x2068, 0xb284, 0x0300, 0x0040, 0x4602, 0x2009, 0x0000,
++	0x0078, 0x4604, 0x2009, 0x0001, 0x017e, 0x1078, 0x209b, 0x017f,
++	0x017e, 0x1078, 0x552b, 0x017f, 0x1078, 0x552c, 0x7097, 0x0000,
++	0x007c, 0x0e7e, 0x2091, 0x8000, 0x6014, 0xd0fc, 0x00c0, 0x461c,
++	0x2071, 0x6040, 0x0078, 0x461e, 0x2071, 0x6080, 0x7000, 0xa086,
++	0x0007, 0x00c0, 0x462f, 0x6110, 0x70b0, 0xa106, 0x00c0, 0x462f,
++	0x0e7f, 0x1078, 0x20b0, 0x1078, 0x4635, 0xa006, 0x007c, 0x2091,
++	0x8001, 0x0e7f, 0xa085, 0x0001, 0x007c, 0x0f7e, 0x0e7e, 0x0078,
++	0x28b1, 0x785b, 0x0000, 0x70a3, 0x000e, 0x2009, 0x0100, 0x017e,
++	0x7094, 0xa06d, 0x0040, 0x4648, 0x7097, 0x0000, 0x0078, 0x464e,
++	0x70a7, 0x0000, 0x1078, 0x20e4, 0x0040, 0x4654, 0x70a0, 0x6826,
++	0x1078, 0x4781, 0x0078, 0x4648, 0x017f, 0x077e, 0x157e, 0x0c7e,
++	0x0d7e, 0x20a9, 0x0020, 0x3238, 0xa7bc, 0x0300, 0x0040, 0x4665,
++	0x2061, 0xa7e0, 0xc7fc, 0x0078, 0x4668, 0x2061, 0xa900, 0xc7fd,
++	0x6000, 0xa105, 0x6002, 0x601c, 0xa06d, 0x0040, 0x4678, 0x6800,
++	0x601e, 0x1078, 0x1e55, 0x6008, 0x8000, 0x600a, 0x0078, 0x466b,
++	0x6018, 0xa06d, 0x0040, 0x4682, 0x6800, 0x601a, 0x1078, 0x1e55,
++	0x0078, 0x4678, 0xace0, 0x0009, 0x0070, 0x4688, 0x0078, 0x4668,
++	0x7090, 0xa084, 0x8000, 0x0040, 0x468f, 0x1078, 0x480c, 0x0d7f,
++	0x0c7f, 0x157f, 0x077f, 0x007c, 0x6804, 0xa084, 0x000f, 0x0079,
++	0x4699, 0x46a9, 0x46a9, 0x46a9, 0x46a9, 0x46a9, 0x46a9, 0x46ab,
++	0x46bd, 0x46a9, 0x46a9, 0x46a9, 0x46a9, 0x46a9, 0x46cb, 0x46a9,
++	0x46ab, 0x1078, 0x2bfa, 0x007e, 0x7830, 0xd0b4, 0x0040, 0x46b6,
++	0x784b, 0x0004, 0x7848, 0xd094, 0x00c0, 0x46b2, 0x007f, 0x1078,
++	0x52d3, 0x1078, 0x1e55, 0x0078, 0x46cf, 0x6827, 0x000b, 0x007e,
++	0x7830, 0xd0b4, 0x0040, 0x46ca, 0x784b, 0x0004, 0x7848, 0xd094,
++	0x00c0, 0x46c6, 0x007f, 0x1078, 0x52d3, 0x1078, 0x4781, 0x007c,
++	0x0f7e, 0x6814, 0xd0fc, 0x00c0, 0x46e7, 0x2001, 0x6002, 0x2004,
++	0xd0ec, 0x0040, 0x46e1, 0x2079, 0x0100, 0x0098, 0x4706, 0x0078,
++	0x46eb, 0x2079, 0x0200, 0x00a8, 0x4706, 0x0078, 0x46eb, 0x2079,
++	0x0100, 0x0098, 0x4706, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x4706,
++	0x0d7e, 0x1078, 0x5539, 0x2d00, 0x682e, 0x2009, 0x0004, 0x2001,
++	0x0000, 0x6827, 0x0084, 0x1078, 0x54df, 0x1078, 0x4781, 0x0d7f,
++	0x70a8, 0xa080, 0x00af, 0x781a, 0x0078, 0x474f, 0x7948, 0x6814,
++	0xd0fc, 0x00c0, 0x4719, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x0040,
++	0x4715, 0x0098, 0x471e, 0x0078, 0x471b, 0x00a8, 0x471e, 0x0078,
++	0x471b, 0x0098, 0x471e, 0x794a, 0x0078, 0x46f0, 0x7948, 0x7828,
++	0x007e, 0xa084, 0xf000, 0xa086, 0x1000, 0x007f, 0x00c0, 0x471b,
++	0xd0b4, 0x00c0, 0x471b, 0xd0ac, 0x0040, 0x4732, 0xa185, 0x0004,
++	0x0078, 0x4734, 0xa185, 0x000c, 0x784a, 0x789b, 0x000e, 0x78ab,
++	0x0002, 0x7858, 0xa084, 0x00ff, 0xa085, 0x0400, 0x785a, 0x70a8,
++	0xa080, 0x0097, 0x781a, 0x6827, 0x0284, 0x682c, 0x6836, 0x6830,
++	0x683a, 0x2009, 0x0004, 0x2001, 0x0000, 0x1078, 0x54df, 0x0f7f,
++	0x007c, 0x0d7e, 0x6b14, 0x1078, 0x2160, 0x0040, 0x475e, 0x2068,
++	0x6827, 0x0002, 0x1078, 0x4781, 0x0078, 0x4753, 0x0d7f, 0x007c,
++	0x0d7e, 0x6b14, 0x6c28, 0xa4a4, 0x00ff, 0x1078, 0x20f0, 0x0040,
++	0x476e, 0x2068, 0x6827, 0x0002, 0x1078, 0x4781, 0x0d7f, 0x007c,
++	0x0d7e, 0x6814, 0xa09c, 0x00ff, 0x1078, 0x212a, 0x0040, 0x477f,
++	0x2068, 0x6827, 0x0002, 0x1078, 0x4781, 0x0078, 0x4774, 0x0d7f,
++	0x007c, 0x0c7e, 0x6914, 0x6814, 0x1078, 0x47fa, 0x6904, 0xa18c,
++	0x00ff, 0xa186, 0x0006, 0x0040, 0x479d, 0xa186, 0x000d, 0x0040,
++	0x47c1, 0xa186, 0x0017, 0x00c0, 0x4799, 0x1078, 0x1e55, 0x0c7f,
++	0x007c, 0x1078, 0x2253, 0x0c7f, 0x007c, 0x6004, 0x8001, 0x0048,
++	0x47ba, 0x6006, 0x2009, 0x0000, 0xa684, 0x0001, 0x00c0, 0x47aa,
++	0xa18d, 0x8000, 0xa684, 0x0004, 0x0040, 0x47b0, 0xa18d, 0x0002,
++	0x691e, 0x6823, 0x0000, 0x711c, 0x810f, 0x6818, 0xa105, 0x681a,
++	0x0078, 0x4799, 0x6100, 0xa184, 0x0001, 0x0040, 0x4795, 0x1078,
++	0x2bfa, 0x6018, 0xa005, 0x00c0, 0x47d0, 0x6008, 0x8001, 0x0048,
++	0x47d0, 0x600a, 0x601c, 0x6802, 0x2d00, 0x601e, 0x0078, 0x47e8,
++	0xac88, 0x0006, 0x2104, 0xa005, 0x0040, 0x47d9, 0x2008, 0x0078,
++	0x47d2, 0x6802, 0x2d0a, 0x6008, 0x8001, 0x0048, 0x47e6, 0x600a,
++	0x6018, 0x2068, 0x6800, 0x601a, 0x0078, 0x47ca, 0x0c7f, 0x007c,
++	0x157e, 0x137e, 0x147e, 0x0c7e, 0x0d7e, 0x1078, 0x1e32, 0x2da0,
++	0x137f, 0x20a9, 0x0037, 0x53a3, 0x0c7f, 0x147f, 0x137f, 0x157f,
++	0x0078, 0x4799, 0xd0fc, 0x00c0, 0x4801, 0x2061, 0xa7e0, 0x0078,
++	0x4803, 0x2061, 0xa900, 0xa184, 0x001f, 0xac60, 0x8003, 0x8003,
++	0x8003, 0xac00, 0x2060, 0x007c, 0xd7fc, 0x00c0, 0x481f, 0x2019,
++	0x6053, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x0040, 0x481b, 0x2021,
++	0x0102, 0x0078, 0x4823, 0x2021, 0x0202, 0x0078, 0x4823, 0x2019,
++	0x6093, 0x2021, 0x0102, 0x2304, 0xa085, 0x0001, 0x201a, 0x2404,
++	0xa085, 0x0001, 0x2022, 0x007c, 0xd7fc, 0x00c0, 0x483f, 0x2019,
++	0x6053, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x0040, 0x483b, 0x2021,
++	0x0102, 0x0078, 0x4843, 0x2021, 0x0202, 0x0078, 0x4843, 0x2019,
++	0x6093, 0x2021, 0x0102, 0x2304, 0xa084, 0xfffe, 0x201a, 0x2404,
++	0xa084, 0xfffe, 0x2022, 0x007c, 0x7990, 0xa18c, 0xfff8, 0x7992,
++	0x70a8, 0xa080, 0x00d7, 0x781a, 0x0078, 0x2c5e, 0x7097, 0x0000,
++	0x7003, 0x0000, 0x704b, 0x0001, 0x7043, 0x0000, 0x1078, 0x20e4,
++	0x0040, 0x488c, 0x70ef, 0x0000, 0x68cc, 0x2060, 0x6100, 0xa184,
++	0x0300, 0x0040, 0x4877, 0x6827, 0x000e, 0xa084, 0x0200, 0x0040,
++	0x4873, 0x6827, 0x0017, 0x1078, 0x4781, 0x0078, 0x4856, 0x7000,
++	0xa086, 0x0007, 0x00c0, 0x4905, 0x6910, 0x70b0, 0xa106, 0x0040,
++	0x4885, 0x2d60, 0x1078, 0x20b0, 0x007c, 0x2d00, 0x7096, 0xad80,
++	0x000f, 0x7042, 0x0078, 0x4897, 0x7010, 0xa005, 0x00c0, 0x4895,
++	0x7048, 0xa086, 0x0001, 0x0040, 0x2c78, 0x0078, 0x2c5e, 0xa036,
++	0x691c, 0xa184, 0x0002, 0x0040, 0x489f, 0xa6b5, 0x0004, 0xa184,
++	0x00c0, 0x8003, 0x8003, 0x8007, 0xa080, 0x49b3, 0x2004, 0xa635,
++	0x1078, 0x2d79, 0x6820, 0xa084, 0x0400, 0x0040, 0x48b9, 0x789b,
++	0x0018, 0x78ab, 0x0003, 0x789b, 0x0081, 0x78ab, 0x0001, 0xa6b5,
++	0x5000, 0x6820, 0xa084, 0x8000, 0x0040, 0x48c7, 0xa6b5, 0x0400,
++	0x789b, 0x000e, 0x6824, 0x8007, 0x78aa, 0x0078, 0x48e7, 0x681c,
++	0xd0fc, 0x00c0, 0x48d5, 0xa6b5, 0x0800, 0x6820, 0xd0c4, 0x0040,
++	0x48e7, 0xa6b5, 0x4000, 0x0078, 0x48e7, 0x6820, 0xd0c4, 0x0040,
++	0x48dd, 0xa6b5, 0x4000, 0x0078, 0x48e7, 0x789b, 0x0018, 0x78ab,
++	0x0002, 0x789b, 0x0081, 0x78ab, 0x0001, 0xa6b5, 0x1000, 0xa684,
++	0x0200, 0x0040, 0x4901, 0x682c, 0x78d2, 0x6830, 0x78d6, 0xa684,
++	0x0100, 0x0040, 0x48ff, 0x682c, 0xa084, 0x0001, 0x0040, 0x48ff,
++	0x7888, 0xa084, 0x0040, 0x0040, 0x48ff, 0xa6b5, 0x8000, 0x1078,
++	0x550e, 0x7e5a, 0x6eb6, 0x0078, 0x5558, 0x1078, 0x44bc, 0x00c0,
++	0x49ad, 0x2041, 0x0001, 0x2031, 0x1000, 0x1078, 0x2d79, 0x789b,
++	0x0018, 0x6814, 0xa084, 0x001f, 0xa085, 0x0080, 0x78aa, 0x691c,
++	0xa184, 0x0002, 0x0040, 0x4924, 0xa6b5, 0x0004, 0x78ab, 0x0020,
++	0x6828, 0x78aa, 0xa8c0, 0x0002, 0x681c, 0xd0f4, 0x0040, 0x492d,
++	0x2c50, 0x1078, 0x45c9, 0x1078, 0x5424, 0x6820, 0xa084, 0x8000,
++	0x0040, 0x493b, 0xa6b5, 0x0400, 0x789b, 0x000e, 0x6824, 0x8007,
++	0x78aa, 0x0078, 0x4949, 0x681c, 0xa084, 0x8000, 0x00c0, 0x4949,
++	0xa6b5, 0x0800, 0x6820, 0xa084, 0x0100, 0x0040, 0x4949, 0xa6b5,
++	0x4000, 0x681c, 0xa084, 0x00c0, 0x8003, 0x8003, 0x8007, 0xa080,
++	0x49b3, 0x2004, 0xa635, 0xa684, 0x0100, 0x0040, 0x4963, 0x682c,
++	0xa084, 0x0001, 0x0040, 0x4963, 0x7888, 0xa084, 0x0040, 0x0040,
++	0x4963, 0xa6b5, 0x8000, 0x789b, 0x007e, 0x7eae, 0x6eb6, 0x6814,
++	0xc0fc, 0x8007, 0x78aa, 0x7882, 0x2810, 0x7aaa, 0x7830, 0xa084,
++	0x00c0, 0x00c0, 0x49ad, 0x6914, 0xd1fc, 0x00c0, 0x4985, 0x2001,
++	0x6002, 0x2004, 0xd0ec, 0x0040, 0x4981, 0x0018, 0x49ad, 0x0078,
++	0x4987, 0x0028, 0x49ad, 0x0078, 0x4987, 0x0018, 0x49ad, 0x127e,
++	0x0d7e, 0x0c7e, 0x70f0, 0xa084, 0x2700, 0x2090, 0x0c7f, 0x0d7f,
++	0x127f, 0xa684, 0x0200, 0x0040, 0x499b, 0x682c, 0x78d2, 0x6830,
++	0x78d6, 0x1078, 0x550e, 0x70a8, 0xa080, 0x00dc, 0x781a, 0x1078,
++	0x44fa, 0x2d00, 0x7096, 0x7052, 0x6810, 0x70b2, 0x7003, 0x0007,
++	0xad80, 0x000f, 0x7042, 0x0078, 0x2c5e, 0x1078, 0x209b, 0x1078,
++	0x44fa, 0x0078, 0x2c5e, 0x0000, 0x0300, 0x0200, 0x0000, 0x1078,
++	0x2bfa, 0x1078, 0x2bed, 0x2300, 0x0079, 0x49be, 0x49c3, 0x49c1,
++	0x49c8, 0x1078, 0x2bfa, 0x71a8, 0xa188, 0x0097, 0x791a, 0x007c,
++	0x1078, 0x552c, 0x6924, 0xa184, 0x00ff, 0xa086, 0x000a, 0x0040,
++	0x49da, 0xa184, 0xff00, 0xa085, 0x000a, 0x6826, 0x1078, 0x209b,
++	0x0078, 0x4856, 0x2001, 0x000a, 0x1078, 0x54ae, 0x0078, 0x4856,
++	0xa282, 0x0005, 0x0050, 0x49e6, 0x1078, 0x2bfa, 0x7000, 0xa084,
++	0x000f, 0x10c0, 0x45de, 0x1078, 0x1e32, 0x00c0, 0x4a08, 0x2069,
++	0xffff, 0xa684, 0x0004, 0x0040, 0x49f9, 0x2001, 0x2800, 0x0078,
++	0x49fb, 0x2001, 0x0800, 0x71a8, 0xa188, 0x0097, 0x789b, 0x000e,
++	0x8007, 0x78aa, 0x2031, 0x0400, 0x7e5a, 0x791a, 0x0078, 0x2c5e,
++	0x6807, 0x0106, 0x680b, 0x0000, 0x689f, 0x0000, 0x6827, 0x0000,
++	0xa386, 0x0002, 0x00c0, 0x4a28, 0xa286, 0x0002, 0x00c0, 0x4a28,
++	0x78a0, 0xa005, 0x00c0, 0x4a28, 0xd4fc, 0x00c0, 0x4a28, 0x78e4,
++	0xa084, 0x0008, 0x0040, 0x4a28, 0xa6b5, 0x0008, 0x2019, 0x0000,
++	0x1078, 0x4e89, 0x2d00, 0x7096, 0x7052, 0x7003, 0x0007, 0x7043,
++	0x0000, 0x6020, 0xa084, 0x000f, 0x680e, 0x6824, 0xa084, 0x0080,
++	0x0040, 0x4a3e, 0x1078, 0x4f59, 0x0078, 0x2c5e, 0x2300, 0x0079,
++	0x4a41, 0x4a44, 0x4ac5, 0x4ade, 0x2200, 0x0079, 0x4a47, 0x4a4c,
++	0x4a5c, 0x4a82, 0x4a8e, 0x4ab1, 0x2029, 0x0001, 0xa026, 0x2011,
++	0x0000, 0x1078, 0x5092, 0x0079, 0x4a55, 0x4a5a, 0x2c5e, 0x4856,
++	0x4a5a, 0x4a5a, 0x1078, 0x2bfa, 0x7990, 0xa18c, 0x0007, 0x00c0,
++	0x4a63, 0x2009, 0x0008, 0x2011, 0x0001, 0xa684, 0x0004, 0x0040,
++	0x4a6b, 0x2011, 0x0003, 0x2220, 0xa12a, 0x2011, 0x0001, 0x1078,
++	0x5092, 0x0079, 0x4a73, 0x4a78, 0x2c5e, 0x4856, 0x4a80, 0x4a7a,
++	0x0078, 0x555e, 0x709f, 0x4a7e, 0x0078, 0x2c5e, 0x0078, 0x4a78,
++	0x1078, 0x2bfa, 0xa684, 0x0010, 0x0040, 0x4a8c, 0x1078, 0x4f1a,
++	0x0040, 0x4a8c, 0x0078, 0x2c5e, 0x0078, 0x4f9a, 0x6000, 0xa084,
++	0x0002, 0x0040, 0x4aab, 0x70a8, 0xa080, 0x0085, 0x781a, 0x0d7e,
++	0x1078, 0x5539, 0x2d00, 0x682e, 0x6827, 0x0000, 0x1078, 0x4781,
++	0x0d7f, 0x1078, 0x1e55, 0x7003, 0x0000, 0x7043, 0x0000, 0x7053,
++	0x0000, 0x0078, 0x4856, 0xa684, 0x0004, 0x00c0, 0x4ab1, 0x0078,
++	0x555e, 0x6000, 0xa084, 0x0004, 0x00c0, 0x4ac3, 0x6000, 0xa084,
++	0x0001, 0x0040, 0x4ac3, 0x709f, 0x4ac3, 0x2001, 0x0007, 0x1078,
++	0x54a6, 0x0078, 0x5564, 0x0078, 0x555e, 0x2200, 0x0079, 0x4ac8,
++	0x4acd, 0x4acf, 0x4acd, 0x4acd, 0x4acd, 0x1078, 0x2bfa, 0x709b,
++	0x4ad3, 0x0078, 0x556c, 0x78e4, 0xa084, 0x0008, 0x00c0, 0x4acf,
++	0x1078, 0x5496, 0x709f, 0x4adc, 0x0078, 0x555e, 0x2200, 0x0079,
++	0x4ae1, 0x4ae6, 0x4ae8, 0x4ae8, 0x4ae6, 0x4ae6, 0x1078, 0x2bfa,
++	0x78e4, 0xa084, 0x0008, 0x0040, 0x4afd, 0x709b, 0x4af1, 0x0078,
++	0x556c, 0x2011, 0x0004, 0x1078, 0x508c, 0x0079, 0x4af7, 0x4b09,
++	0x2c5e, 0x4856, 0x4b09, 0x4b13, 0x4b17, 0x690c, 0x81ff, 0x0040,
++	0x4b09, 0x8109, 0x00c0, 0x4b08, 0x6827, 0x000f, 0x0078, 0x4bbd,
++	0x690e, 0x709f, 0x4b11, 0x2001, 0x0003, 0x1078, 0x54a6, 0x0078,
++	0x5564, 0x0078, 0x555e, 0x709f, 0x4b09, 0x0078, 0x2c5e, 0x709f,
++	0x4b1b, 0x0078, 0x2c5e, 0x0078, 0x4b11, 0xa282, 0x0003, 0x0050,
++	0x4b23, 0x1078, 0x2bfa, 0xa386, 0x0002, 0x00c0, 0x4b3b, 0xa286,
++	0x0002, 0x00c0, 0x4b41, 0x78a0, 0xa005, 0x00c0, 0x4b41, 0xd4fc,
++	0x00c0, 0x4b41, 0x78e4, 0xa084, 0x0008, 0x0040, 0x4b3b, 0xa6b5,
++	0x0008, 0x2019, 0x0000, 0xa684, 0x0008, 0x0040, 0x4b41, 0x1078,
++	0x4ef7, 0x6810, 0x70b2, 0x7003, 0x0007, 0x2300, 0x0079, 0x4b48,
++	0x4b4b, 0x4b78, 0x4b80, 0x2200, 0x0079, 0x4b4e, 0x4b53, 0x4b51,
++	0x4b6c, 0x1078, 0x2bfa, 0x7990, 0xa1ac, 0x0007, 0xa026, 0x2011,
++	0x0001, 0x1078, 0x5092, 0x0079, 0x4b5d, 0x4b62, 0x2c5e, 0x4856,
++	0x4b6a, 0x4b64, 0x0078, 0x555e, 0x709f, 0x4b68, 0x0078, 0x2c5e,
++	0x0078, 0x4b62, 0x1078, 0x2bfa, 0xa684, 0x0010, 0x0040, 0x4b76,
++	0x1078, 0x4f1a, 0x0040, 0x4b76, 0x0078, 0x2c5e, 0x0078, 0x4f9a,
++	0x2200, 0x0079, 0x4b7b, 0x4b7e, 0x4b7e, 0x4b7e, 0x1078, 0x2bfa,
++	0x2200, 0x0079, 0x4b83, 0x4b86, 0x4b88, 0x4b88, 0x1078, 0x2bfa,
++	0x78e4, 0xa084, 0x0008, 0x0040, 0x4b9d, 0x709b, 0x4b91, 0x0078,
++	0x556c, 0x2011, 0x0004, 0x1078, 0x508c, 0x0079, 0x4b97, 0x4ba9,
++	0x2c5e, 0x4856, 0x4ba9, 0x4bb3, 0x4bb7, 0x690c, 0x81ff, 0x0040,
++	0x4ba9, 0x8109, 0x00c0, 0x4ba8, 0x6827, 0x000f, 0x0078, 0x4bbd,
++	0x690e, 0x709f, 0x4bb1, 0x2001, 0x0003, 0x1078, 0x54a6, 0x0078,
++	0x5564, 0x0078, 0x555e, 0x709f, 0x4ba9, 0x0078, 0x2c5e, 0x709f,
++	0x4bbb, 0x0078, 0x2c5e, 0x0078, 0x4bb1, 0x70a8, 0xa080, 0x0085,
++	0x781a, 0x0d7e, 0x6824, 0x007e, 0x1078, 0x5539, 0x007f, 0x6826,
++	0x2d00, 0x682e, 0x1078, 0x4781, 0x0d7f, 0x1078, 0x54ae, 0x7003,
++	0x0000, 0x7043, 0x0000, 0x7053, 0x0000, 0x0078, 0x4856, 0x2300,
++	0x0079, 0x4bda, 0x4bdf, 0x4be1, 0x4bdd, 0x1078, 0x2bfa, 0x7098,
++	0x007a, 0x7098, 0x007a, 0xa282, 0x0002, 0x0050, 0x4be9, 0x1078,
++	0x2bfa, 0xa684, 0x0200, 0x0040, 0x4bf3, 0x1078, 0x552b, 0x1078,
++	0x5074, 0x1078, 0x552c, 0x2300, 0x0079, 0x4bf6, 0x4bf9, 0x4c2c,
++	0x4c92, 0xad86, 0xffff, 0x00c0, 0x4bfe, 0x007c, 0xa286, 0x0001,
++	0x0040, 0x4c04, 0x1078, 0x2bfa, 0xa684, 0x0200, 0x0040, 0x4c0c,
++	0x1078, 0x552b, 0x1078, 0x552c, 0x6924, 0xa184, 0x00ff, 0xa086,
++	0x000a, 0x00c0, 0x4c16, 0xa184, 0xff00, 0x6826, 0x2001, 0x0001,
++	0x1078, 0x54ae, 0x78b8, 0xa084, 0xc001, 0x0040, 0x4c28, 0x7848,
++	0xa085, 0x0008, 0x784a, 0x7848, 0xa084, 0x0008, 0x00c0, 0x4c23,
++	0x7003, 0x0000, 0x0078, 0x4856, 0x2200, 0x0079, 0x4c2f, 0x4c31,
++	0x4c62, 0x709b, 0x4c35, 0x0078, 0x556c, 0x2011, 0x000d, 0x1078,
++	0x508c, 0x0079, 0x4c3b, 0x4c42, 0x2c5e, 0x4856, 0x4c4a, 0x4c52,
++	0x4c58, 0x4c5a, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
++	0x0078, 0x5558, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
++	0x0078, 0x5558, 0x709f, 0x4c56, 0x0078, 0x2c5e, 0x0078, 0x4c42,
++	0x1078, 0x2bfa, 0x709f, 0x4c5e, 0x0078, 0x2c5e, 0x1078, 0x5572,
++	0x0078, 0x2c5e, 0x709b, 0x4c66, 0x0078, 0x556c, 0x2011, 0x0012,
++	0x1078, 0x508c, 0x0079, 0x4c6c, 0x4c72, 0x2c5e, 0x4856, 0x4c7e,
++	0x4c86, 0x4c8c, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
++	0x70a8, 0xa080, 0x00af, 0x781a, 0x0078, 0x2c5e, 0xa6b4, 0x00ff,
++	0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x0078, 0x5558, 0x709f, 0x4c8a,
++	0x0078, 0x2c5e, 0x0078, 0x4c72, 0x709f, 0x4c90, 0x0078, 0x2c5e,
++	0x0078, 0x4c7e, 0xa286, 0x0001, 0x0040, 0x4c98, 0x1078, 0x2bfa,
++	0x709b, 0x4c9c, 0x0078, 0x556c, 0x2011, 0x0015, 0x1078, 0x508c,
++	0x0079, 0x4ca2, 0x4ca7, 0x2c5e, 0x4856, 0x4cb5, 0x4cc1, 0xa6b4,
++	0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x783b, 0x1301, 0x70a8,
++	0xa080, 0x00bb, 0x781a, 0x0078, 0x2c5e, 0xa6b4, 0x00ff, 0xa6b5,
++	0x0400, 0x6eb6, 0x7e5a, 0x70a8, 0xa080, 0x00af, 0x781a, 0x0078,
++	0x2c5e, 0x709f, 0x4cc5, 0x0078, 0x2c5e, 0x0078, 0x4ca7, 0xa282,
++	0x0003, 0x0050, 0x4ccd, 0x1078, 0x2bfa, 0x2300, 0x0079, 0x4cd0,
++	0x4cd3, 0x4d14, 0x4d79, 0xa286, 0x0001, 0x0040, 0x4cd9, 0x1078,
++	0x2bfa, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x4ce6,
++	0x1078, 0x4781, 0x7003, 0x0000, 0x0078, 0x4856, 0x683b, 0x0000,
++	0x6837, 0x0000, 0xa684, 0x0200, 0x0040, 0x4cf4, 0x1078, 0x552b,
++	0x1078, 0x5074, 0x1078, 0x552c, 0x6924, 0xa184, 0x00ff, 0xa086,
++	0x000a, 0x00c0, 0x4cfe, 0xa184, 0xff00, 0x6826, 0x2001, 0x0001,
++	0x1078, 0x54ae, 0x78b8, 0xa084, 0xc001, 0x0040, 0x4d10, 0x7848,
++	0xa085, 0x0008, 0x784a, 0x7848, 0xa084, 0x0008, 0x00c0, 0x4d0b,
++	0x7003, 0x0000, 0x0078, 0x4856, 0xa684, 0x0200, 0x0040, 0x4d1c,
++	0x1078, 0x5074, 0x1078, 0x552c, 0x2200, 0x0079, 0x4d1f, 0x4d21,
++	0x4d54, 0x709b, 0x4d25, 0x0078, 0x556c, 0x2011, 0x000d, 0x1078,
++	0x508c, 0x0079, 0x4d2b, 0x4d32, 0x2c5e, 0x4856, 0x4d3a, 0x4d42,
++	0x4d48, 0x4d4a, 0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a,
++	0x0078, 0x5558, 0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a,
++	0x0078, 0x5558, 0x709f, 0x4d46, 0x0078, 0x2c5e, 0x0078, 0x4d32,
++	0x1078, 0x2bfa, 0x709f, 0x4d50, 0x1078, 0x552c, 0x0078, 0x2c5e,
++	0x1078, 0x5572, 0x0078, 0x2c5e, 0x709b, 0x4d58, 0x0078, 0x556c,
++	0x2011, 0x0005, 0x1078, 0x508c, 0x0079, 0x4d5e, 0x4d63, 0x2c5e,
++	0x4856, 0x4d6b, 0x4d73, 0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6,
++	0x7e5a, 0x0078, 0x5558, 0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6,
++	0x7e5a, 0x0078, 0x5558, 0x709f, 0x4d77, 0x0078, 0x2c5e, 0x0078,
++	0x4d63, 0xa286, 0x0001, 0x0040, 0x4d7f, 0x1078, 0x2bfa, 0x709b,
++	0x4d83, 0x0078, 0x556c, 0x2011, 0x0006, 0x1078, 0x508c, 0x0079,
++	0x4d89, 0x4d8e, 0x2c5e, 0x4856, 0x4d94, 0x4d9e, 0xa6b5, 0x0800,
++	0x6eb6, 0x7e5a, 0x0078, 0x5558, 0xa6b4, 0x00ff, 0xa6b5, 0x0800,
++	0x6eb6, 0xa6b5, 0x4000, 0x7e5a, 0x0078, 0x5558, 0x709f, 0x4da2,
++	0x0078, 0x2c5e, 0x0078, 0x4d8e, 0x2300, 0x0079, 0x4da7, 0x4dac,
++	0x4daa, 0x4daa, 0x1078, 0x2bfa, 0x1078, 0x2bfa, 0x2300, 0x719c,
++	0xa005, 0x017a, 0x6810, 0x70b2, 0xa282, 0x0003, 0x0050, 0x4dba,
++	0x1078, 0x2bfa, 0x2300, 0x0079, 0x4dbd, 0x4dc0, 0x4dce, 0x4df0,
++	0xa684, 0x0200, 0x0040, 0x4dc8, 0x1078, 0x552b, 0x1078, 0x552c,
++	0x2001, 0x0001, 0x1078, 0x54ae, 0x0078, 0x2c5e, 0xa286, 0x0002,
++	0x0040, 0x4dd7, 0x82ff, 0x0040, 0x4dd7, 0x1078, 0x2bfa, 0x709b,
++	0x4ddb, 0x0078, 0x556c, 0x2011, 0x0018, 0x1078, 0x508c, 0x0079,
++	0x4de1, 0x4de6, 0x2c5e, 0x4856, 0x4de8, 0x4dea, 0x0078, 0x5558,
++	0x0078, 0x5558, 0x709f, 0x4dee, 0x0078, 0x2c5e, 0x0078, 0x4de6,
++	0x2200, 0x0079, 0x4df3, 0x4df5, 0x4e0e, 0x709b, 0x4df9, 0x0078,
++	0x556c, 0x2011, 0x0017, 0x1078, 0x508c, 0x0079, 0x4dff, 0x4e04,
++	0x2c5e, 0x4856, 0x4e06, 0x4e08, 0x0078, 0x5558, 0x0078, 0x5558,
++	0x709f, 0x4e0c, 0x0078, 0x2c5e, 0x0078, 0x4e04, 0xd4fc, 0x00c0,
++	0x4e6b, 0xa684, 0x0100, 0x0040, 0x4e19, 0x1078, 0x552b, 0x1078,
++	0x5074, 0x78d8, 0x78d2, 0x78dc, 0x78d6, 0xa6b4, 0xefff, 0x7e5a,
++	0x709b, 0x4e24, 0x0078, 0x556c, 0x2011, 0x000d, 0x1078, 0x508c,
++	0x0079, 0x4e2a, 0x4e31, 0x2c5e, 0x4856, 0x4e31, 0x4e59, 0x4e5f,
++	0x4e61, 0x78d8, 0x79dc, 0xa105, 0x00c0, 0x4e43, 0x78b8, 0xa084,
++	0x801f, 0x00c0, 0x4e43, 0x70a7, 0x0000, 0x7858, 0xa084, 0xfdff,
++	0x785a, 0x0078, 0x5558, 0xa684, 0x0100, 0x0040, 0x4e57, 0x1078,
++	0x552c, 0x1078, 0x54d4, 0x027e, 0x037e, 0x682c, 0x78d2, 0x6830,
++	0x78d6, 0x70a7, 0x0000, 0x017f, 0x007f, 0x1078, 0x5972, 0x0078,
++	0x5558, 0x709f, 0x4e5d, 0x0078, 0x2c5e, 0x0078, 0x4e31, 0x1078,
++	0x2bfa, 0x709f, 0x4e67, 0x1078, 0x552c, 0x0078, 0x2c5e, 0x1078,
++	0x5572, 0x0078, 0x2c5e, 0x1078, 0x552c, 0x6918, 0xd1a4, 0x0040,
++	0x4e79, 0x6827, 0x000f, 0x1078, 0x54ae, 0x1078, 0x552c, 0x0078,
++	0x2c5e, 0x709f, 0x4e81, 0x2001, 0x0003, 0x1078, 0x54a6, 0x0078,
++	0x5564, 0x1078, 0x550e, 0x682c, 0x78d2, 0x6830, 0x78d6, 0x0078,
++	0x5558, 0x70ac, 0x6812, 0x70b2, 0x8000, 0x70ae, 0x681b, 0x0000,
++	0xa684, 0x0008, 0x0040, 0x4eac, 0x157e, 0x137e, 0x147e, 0x7890,
++	0x8004, 0x8004, 0x8004, 0x8004, 0xa084, 0x000f, 0x681a, 0x80ac,
++	0x789b, 0x0000, 0xaf80, 0x002b, 0x2098, 0xad80, 0x000b, 0x20a0,
++	0x53a5, 0x147f, 0x137f, 0x157f, 0xa6c4, 0x0f00, 0xa684, 0x0002,
++	0x00c0, 0x4ebb, 0x692c, 0x810d, 0x810d, 0x810d, 0xa184, 0x0007,
++	0x2008, 0x0078, 0x4ece, 0x789b, 0x0010, 0x79ac, 0xa184, 0x0020,
++	0x0040, 0x4ece, 0x017e, 0x2009, 0x0005, 0x2001, 0x3d00, 0x1078,
++	0x54df, 0x6824, 0xa085, 0x003b, 0x6826, 0x017f, 0xa184, 0x001f,
++	0xa805, 0x017e, 0x3208, 0xa18c, 0x0300, 0x0040, 0x4eda, 0xc0fc,
++	0x0078, 0x4edb, 0xc0fd, 0x017f, 0x6816, 0x1078, 0x47fa, 0x68ce,
++	0xa684, 0x0004, 0x0040, 0x4eea, 0xa18c, 0xff00, 0x78a8, 0xa084,
++	0x00ff, 0xa105, 0x682a, 0xa6b4, 0x00ff, 0x6000, 0xa084, 0x0008,
++	0x0040, 0x4ef4, 0xa6b5, 0x4000, 0x6eb6, 0x7e5a, 0x007c, 0x157e,
++	0x137e, 0x147e, 0x6918, 0x7890, 0x8004, 0x8004, 0x8004, 0x8004,
++	0xa084, 0x000f, 0x007e, 0xa100, 0x681a, 0x007f, 0x8000, 0x8004,
++	0x0040, 0x4f16, 0x20a8, 0x8104, 0xa080, 0x000b, 0xad00, 0x20a0,
++	0x789b, 0x0000, 0xaf80, 0x002b, 0x2098, 0x53a5, 0x147f, 0x137f,
++	0x157f, 0x007c, 0x682c, 0xd0b4, 0x00c0, 0x4f29, 0xd0ac, 0x00c0,
++	0x4f25, 0x2011, 0x0010, 0x0078, 0x4f31, 0x2011, 0x000c, 0x0078,
++	0x4f31, 0xa084, 0x0020, 0x00c0, 0x4f30, 0x620c, 0x0078, 0x4f31,
++	0x6210, 0x6b18, 0x2300, 0xa202, 0x0040, 0x4f51, 0x2018, 0xa382,
++	0x000e, 0x0048, 0x4f41, 0x0040, 0x4f41, 0x2019, 0x000e, 0x0078,
++	0x4f45, 0x7858, 0xa084, 0xffef, 0x785a, 0x783b, 0x1b01, 0x7893,
++	0x0000, 0x7ba2, 0x70a8, 0xa080, 0x0094, 0x781a, 0xa085, 0x0001,
++	0x007c, 0x7858, 0xa084, 0xffef, 0x785a, 0x7893, 0x0000, 0xa006,
++	0x007c, 0x6904, 0xa18c, 0x00ff, 0xa196, 0x0007, 0x0040, 0x4f66,
++	0xa196, 0x000f, 0x0040, 0x4f66, 0x6807, 0x0117, 0x6914, 0x6814,
++	0x1078, 0x47fa, 0x6100, 0x8104, 0x00c8, 0x4f82, 0x601c, 0xa005,
++	0x0040, 0x4f76, 0x2001, 0x0800, 0x0078, 0x4f84, 0x0d7e, 0x6824,
++	0x007e, 0x1078, 0x5539, 0x007f, 0x6826, 0x2d00, 0x682e, 0x1078,
++	0x4781, 0x0d7f, 0x2001, 0x0200, 0x6924, 0xa18c, 0x00ff, 0xa10d,
++	0x6926, 0x8007, 0x789b, 0x000e, 0x78aa, 0x6820, 0xa085, 0x8000,
++	0x6822, 0x2031, 0x0400, 0x6eb6, 0x7e5a, 0x71a8, 0xa188, 0x0097,
++	0x791a, 0x007c, 0x1078, 0x2d79, 0x6814, 0x2040, 0xa684, 0x0002,
++	0x00c0, 0x4fb0, 0x692c, 0x810d, 0x810d, 0x810d, 0xa184, 0x0007,
++	0x2008, 0xa805, 0x6816, 0x1078, 0x47fa, 0x68ce, 0x0078, 0x4fb4,
++	0x6914, 0x6814, 0x1078, 0x47fa, 0x6100, 0x8104, 0x00c8, 0x5012,
++	0xa184, 0x0300, 0x0040, 0x4fc0, 0x6807, 0x0117, 0x0078, 0x4fde,
++	0x6004, 0xa005, 0x00c0, 0x4fe7, 0x6807, 0x0117, 0x601c, 0xa005,
++	0x00c0, 0x4fd4, 0x0d7e, 0x1078, 0x5539, 0x6827, 0x0034, 0x2d00,
++	0x682e, 0x1078, 0x4781, 0x0d7f, 0xa684, 0x0004, 0x0040, 0x4fde,
++	0x2031, 0x0400, 0x2001, 0x2800, 0x0078, 0x4fe2, 0x2031, 0x0400,
++	0x2001, 0x0800, 0x71a8, 0xa188, 0x0097, 0x0078, 0x504f, 0x6018,
++	0xa005, 0x00c0, 0x4fd4, 0x601c, 0xa005, 0x00c0, 0x4fd4, 0x689f,
++	0x0000, 0x6827, 0x003d, 0xa684, 0x0001, 0x0040, 0x505d, 0xd694,
++	0x00c0, 0x500b, 0x6100, 0xd1d4, 0x0040, 0x500b, 0x692c, 0xa18c,
++	0x00ff, 0x0040, 0x505d, 0xa186, 0x0003, 0x0040, 0x505d, 0xa186,
++	0x0012, 0x0040, 0x505d, 0xa6b5, 0x0800, 0x71a8, 0xa188, 0x00b3,
++	0x0078, 0x5058, 0x6807, 0x0117, 0x2031, 0x0400, 0x692c, 0xa18c,
++	0x00ff, 0xa186, 0x0012, 0x00c0, 0x5023, 0x2001, 0x506a, 0x2009,
++	0x0001, 0x0078, 0x5034, 0xa186, 0x0003, 0x00c0, 0x502d, 0x2001,
++	0x506b, 0x2009, 0x0012, 0x0078, 0x5034, 0x2001, 0x0200, 0x71a8,
++	0xa188, 0x0097, 0x0078, 0x504f, 0x6a34, 0xa29d, 0x0000, 0x00c0,
++	0x503c, 0xa006, 0x0078, 0x502f, 0x007e, 0x2100, 0xa21a, 0x007f,
++	0x00c8, 0x5043, 0x2208, 0x1078, 0x54f9, 0x78a3, 0x0000, 0x681c,
++	0xa085, 0x0040, 0x681e, 0x71a8, 0xa188, 0x00d9, 0xa006, 0x6826,
++	0x8007, 0x789b, 0x000e, 0x78aa, 0x6820, 0xa085, 0x8000, 0x6822,
++	0x6eb6, 0x7e5a, 0x791a, 0x0078, 0x2c5e, 0x6eb6, 0x1078, 0x4781,
++	0x6810, 0x70b2, 0x7003, 0x0007, 0x7097, 0x0000, 0x7053, 0x0000,
++	0x0078, 0x2c5e, 0x0023, 0x0070, 0x0005, 0x0000, 0x0a00, 0x0000,
++	0x0000, 0x0025, 0x0000, 0x0000, 0x683b, 0x0000, 0x6837, 0x0000,
++	0xa684, 0x0200, 0x0040, 0x508b, 0x78b8, 0xa08c, 0x001f, 0xa084,
++	0x8000, 0x0040, 0x5084, 0x8108, 0x78d8, 0xa100, 0x6836, 0x78dc,
++	0xa081, 0x0000, 0x683a, 0x007c, 0x7990, 0x810f, 0xa5ac, 0x0007,
++	0x2021, 0x0000, 0xa480, 0x0010, 0x789a, 0x79a8, 0xa18c, 0x00ff,
++	0xa184, 0x0080, 0x00c0, 0x50ba, 0xa182, 0x0020, 0x00c8, 0x50d8,
++	0xa182, 0x0012, 0x00c8, 0x5496, 0x2100, 0x1079, 0x50a8, 0x007c,
++	0x5496, 0x52eb, 0x5496, 0x5496, 0x50e5, 0x50e8, 0x512f, 0x516d,
++	0x51a1, 0x51a4, 0x5496, 0x5496, 0x5150, 0x5213, 0x524d, 0x5496,
++	0x5496, 0x5274, 0xa184, 0x0020, 0x00c0, 0x52a8, 0xa18c, 0x001f,
++	0x6814, 0xa084, 0x001f, 0xa106, 0x0040, 0x50d5, 0x70a8, 0xa080,
++	0x0085, 0x781a, 0x2001, 0x0014, 0x1078, 0x54ae, 0x1078, 0x552c,
++	0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x2001, 0x0000, 0x007c,
++	0xa182, 0x0024, 0x00c8, 0x5496, 0xa184, 0x0003, 0x1079, 0x50a8,
++	0x007c, 0x5496, 0x5496, 0x5496, 0x5496, 0x1078, 0x5496, 0x007c,
++	0x2200, 0x0079, 0x50eb, 0x5277, 0x5277, 0x511c, 0x511c, 0x511c,
++	0x511c, 0x511c, 0x511c, 0x511c, 0x511c, 0x511a, 0x511c, 0x5104,
++	0x510d, 0x510d, 0x510d, 0x511c, 0x511c, 0x5124, 0x5127, 0x5277,
++	0x5127, 0x511c, 0x511c, 0x511c, 0x0c7e, 0x077e, 0x6f14, 0x1078,
++	0x42de, 0x077f, 0x0c7f, 0x0078, 0x511c, 0x6818, 0xd0a4, 0x0040,
++	0x511c, 0x6827, 0x0033, 0x1078, 0x54ae, 0x1078, 0x552c, 0x2001,
++	0x0001, 0x007c, 0x1078, 0x53ae, 0x6827, 0x02b3, 0x2009, 0x000b,
++	0x2001, 0x4800, 0x0078, 0x52ab, 0x1078, 0x5486, 0x007c, 0x6827,
++	0x0093, 0x2009, 0x000b, 0x2001, 0x4800, 0x0078, 0x5293, 0x2d58,
++	0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x5139, 0x6807,
++	0x0117, 0x6827, 0x0002, 0x1078, 0x5539, 0x6827, 0x0036, 0x6932,
++	0x2d00, 0x682e, 0x0d7e, 0x1078, 0x4751, 0x1078, 0x52d3, 0x2b68,
++	0x1078, 0x4781, 0x0d7f, 0x1078, 0x4781, 0x2001, 0x0002, 0x007c,
++	0x1078, 0x52d3, 0x2001, 0x0017, 0x1078, 0x54ae, 0x7097, 0x0000,
++	0x6914, 0xd1fc, 0x0040, 0x5160, 0x2009, 0x6086, 0x0078, 0x5162,
++	0x2009, 0x6046, 0x200b, 0x0006, 0x70a3, 0x0017, 0x2009, 0x0200,
++	0x1078, 0x463f, 0x2001, 0x0001, 0x007c, 0x2200, 0x0079, 0x5170,
++	0x5277, 0x52a8, 0x52a8, 0x52a8, 0x5191, 0x52ba, 0x5199, 0x52ba,
++	0x52ba, 0x52bd, 0x52bd, 0x52c2, 0x52c2, 0x5189, 0x5189, 0x52a8,
++	0x52a8, 0x52ba, 0x52a8, 0x5199, 0x5277, 0x5199, 0x5199, 0x5199,
++	0x5199, 0x6827, 0x0084, 0x2009, 0x000b, 0x2001, 0x4300, 0x0078,
++	0x52cc, 0x6827, 0x000d, 0x2009, 0x000b, 0x2001, 0x4300, 0x0078,
++	0x52ab, 0x6827, 0x0093, 0x2009, 0x000b, 0x2001, 0x4300, 0x0078,
++	0x5293, 0x2001, 0x0000, 0x007c, 0x2200, 0x0079, 0x51a7, 0x5277,
++	0x520b, 0x520b, 0x520b, 0x520b, 0x51c0, 0x51c0, 0x51c0, 0x51c0,
++	0x51c0, 0x51c0, 0x51c0, 0x51c0, 0x520b, 0x520b, 0x520b, 0x520b,
++	0x51e8, 0x520b, 0x520b, 0x51e8, 0x51e8, 0x51e8, 0x51e8, 0x5277,
++	0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x51e8, 0x690c,
++	0xa184, 0x000f, 0x0040, 0x52ba, 0x8001, 0x0040, 0x51d5, 0xa18c,
++	0xfff0, 0xa105, 0x680e, 0x0078, 0x52ba, 0x70a8, 0xa080, 0x0085,
++	0x781a, 0x6827, 0x000f, 0x1078, 0x4f59, 0x1078, 0x54ae, 0x7003,
++	0x0000, 0x7043, 0x0000, 0x7053, 0x0000, 0x2001, 0x0002, 0x007c,
++	0x6918, 0xa184, 0x000f, 0x0040, 0x52ba, 0x8001, 0x0040, 0x51f6,
++	0xa18c, 0xfff0, 0xa105, 0x681a, 0x0078, 0x52ba, 0x70a8, 0xa080,
++	0x0085, 0x781a, 0x6827, 0x008f, 0x2009, 0x000b, 0x2001, 0x4300,
++	0x1078, 0x54df, 0x1078, 0x54ae, 0x1078, 0x552c, 0x7003, 0x0000,
++	0x2001, 0x0002, 0x007c, 0x6827, 0x0093, 0x2009, 0x000b, 0x2001,
++	0x4300, 0x0078, 0x5293, 0xa684, 0x0004, 0x00c0, 0x5227, 0x6804,
++	0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x5496, 0x1078, 0x52d3,
++	0x6807, 0x0117, 0x1078, 0x4781, 0x2001, 0x0002, 0x007c, 0x6000,
++	0xa084, 0x0004, 0x0040, 0x5496, 0x2d58, 0x6804, 0xa084, 0x00ff,
++	0xa086, 0x0006, 0x00c0, 0x5236, 0x6807, 0x0117, 0x6827, 0x0002,
++	0x1078, 0x5539, 0x6827, 0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e,
++	0x1078, 0x4760, 0x1078, 0x52d3, 0x2b68, 0x1078, 0x4781, 0x0d7f,
++	0x1078, 0x4781, 0x2001, 0x0002, 0x007c, 0x6000, 0xa084, 0x0004,
++	0x0040, 0x5496, 0x2d58, 0x6a04, 0xa294, 0x00ff, 0xa286, 0x0006,
++	0x00c0, 0x525c, 0x6807, 0x0117, 0x6827, 0x0002, 0x2d58, 0x1078,
++	0x5539, 0x6827, 0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078,
++	0x4770, 0x1078, 0x52d3, 0x2b68, 0x1078, 0x4781, 0x0d7f, 0x1078,
++	0x4781, 0x2001, 0x0002, 0x007c, 0x1078, 0x5496, 0x007c, 0x70a8,
++	0xa080, 0x0085, 0x781a, 0x2001, 0x0001, 0x1078, 0x54ae, 0x1078,
++	0x552c, 0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x1078, 0x54df,
++	0x1078, 0x552b, 0x1078, 0x5074, 0x1078, 0x4f59, 0x1078, 0x552c,
++	0x2001, 0x0001, 0x007c, 0x1078, 0x54df, 0x1078, 0x552b, 0x1078,
++	0x5074, 0x70a8, 0xa080, 0x0085, 0x781a, 0x2001, 0x0013, 0x1078,
++	0x54ae, 0x1078, 0x552c, 0x7003, 0x0000, 0x2001, 0x0002, 0x007c,
++	0x1078, 0x5496, 0x007c, 0x1078, 0x54df, 0x1078, 0x552b, 0x1078,
++	0x5074, 0x1078, 0x4f59, 0x1078, 0x552c, 0x1078, 0x5572, 0x2001,
++	0x0001, 0x007c, 0x2001, 0x0003, 0x007c, 0x1078, 0x53ae, 0x2001,
++	0x0000, 0x007c, 0x0c7e, 0x077e, 0x6f14, 0x1078, 0x42de, 0x077f,
++	0x0c7f, 0x2001, 0x0000, 0x007c, 0x1078, 0x54df, 0x1078, 0x5496,
++	0x2001, 0x0006, 0x007c, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007,
++	0x0040, 0x52de, 0xa186, 0x000f, 0x00c0, 0x52e2, 0x1078, 0x552b,
++	0x1078, 0x5074, 0x70a8, 0xa080, 0x0085, 0x781a, 0x1078, 0x552c,
++	0x7003, 0x0000, 0x007c, 0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084,
++	0x00ff, 0xa08a, 0x0004, 0x00c8, 0x5496, 0x1079, 0x52f8, 0x007c,
++	0x5496, 0x52fc, 0x5496, 0x53b5, 0xa282, 0x0003, 0x0040, 0x5303,
++	0x1078, 0x5496, 0x007c, 0x7da8, 0xa5ac, 0x00ff, 0x7ca8, 0xa4a4,
++	0x00ff, 0x69b8, 0xa184, 0x0100, 0x0040, 0x5342, 0xa18c, 0xfeff,
++	0x69ba, 0x78a0, 0xa005, 0x00c0, 0x5342, 0xa4a4, 0x00ff, 0x0040,
++	0x5336, 0xa482, 0x000c, 0x0040, 0x531f, 0x00c8, 0x5329, 0x852b,
++	0x852b, 0x1078, 0x4334, 0x0040, 0x5329, 0x1078, 0x4162, 0x0078,
++	0x5338, 0x1078, 0x5474, 0x1078, 0x418d, 0x69b8, 0xa18d, 0x0100,
++	0x69ba, 0xa6b5, 0x1000, 0x7e5a, 0x0078, 0x533b, 0x1078, 0x418d,
++	0xa6b4, 0xefff, 0x7e5a, 0x70a8, 0xa080, 0x0097, 0x781a, 0x2001,
++	0x0001, 0x007c, 0x0c7e, 0x1078, 0x539c, 0x6200, 0xd2e4, 0x0040,
++	0x538b, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000c, 0x0048,
++	0x5355, 0x0040, 0x5355, 0x2011, 0x000c, 0x2400, 0xa202, 0x00c8,
++	0x535a, 0x2220, 0x6208, 0xa294, 0x00ff, 0x2001, 0x6003, 0x2004,
++	0xd0e4, 0x00c0, 0x536f, 0x78ec, 0xd0e4, 0x0040, 0x536f, 0xa282,
++	0x000a, 0x00c8, 0x5375, 0x2011, 0x000a, 0x0078, 0x5375, 0xa282,
++	0x000c, 0x00c8, 0x5375, 0x2011, 0x000c, 0x2200, 0xa502, 0x00c8,
++	0x537a, 0x2228, 0x1078, 0x5477, 0x2500, 0xa086, 0x000a, 0x0040,
++	0x5383, 0x852b, 0x852b, 0x1078, 0x4334, 0x0040, 0x538b, 0x1078,
++	0x4169, 0x0078, 0x538f, 0x1078, 0x5474, 0x1078, 0x4194, 0xa6b5,
++	0x1000, 0x7e5a, 0x783b, 0x1700, 0x70a8, 0xa080, 0x00c4, 0x781a,
++	0x2001, 0x0004, 0x0c7f, 0x007c, 0x6814, 0x8007, 0xa084, 0x000f,
++	0x8003, 0x8003, 0x8003, 0x6914, 0xd1fc, 0x00c0, 0x53ab, 0xa0e0,
++	0x64c0, 0x0078, 0x53ad, 0xa0e0, 0x6540, 0x007c, 0x0c7e, 0x1078,
++	0x539c, 0x1078, 0x4194, 0x0c7f, 0x007c, 0xa282, 0x0002, 0x00c0,
++	0x5496, 0x7aa8, 0xa294, 0x00ff, 0x69b8, 0xa184, 0x0200, 0x0040,
++	0x53ec, 0xa18c, 0xfdff, 0x69ba, 0x78a0, 0xa005, 0x00c0, 0x53ec,
++	0xa282, 0x0002, 0x00c8, 0x429c, 0x1078, 0x544c, 0x1078, 0x4227,
++	0x1078, 0x418d, 0xa684, 0x0100, 0x0040, 0x53e2, 0x682c, 0xa084,
++	0x0001, 0x0040, 0x53e2, 0xc6fc, 0x7888, 0xa084, 0x0040, 0x0040,
++	0x53e2, 0xc6fd, 0xa6b5, 0x1000, 0x7e5a, 0x70a8, 0xa080, 0x0097,
++	0x781a, 0x2001, 0x0001, 0x007c, 0x0c7e, 0x1078, 0x539c, 0xa284,
++	0xfffe, 0x0040, 0x53f7, 0x2011, 0x0001, 0x0078, 0x53fb, 0xa284,
++	0x0001, 0x0040, 0x5401, 0x6100, 0xd1ec, 0x00c0, 0x5401, 0x2011,
++	0x0000, 0x1078, 0x543e, 0x1078, 0x422e, 0x1078, 0x4194, 0xa684,
++	0x0100, 0x0040, 0x5417, 0x682c, 0xa084, 0x0001, 0x0040, 0x5417,
++	0xc6fc, 0x7888, 0xa084, 0x0040, 0x0040, 0x5417, 0xc6fd, 0xa6b5,
++	0x1000, 0x7e5a, 0x783b, 0x1700, 0x70a8, 0xa080, 0x00c4, 0x781a,
++	0x2001, 0x0004, 0x0c7f, 0x007c, 0x0c7e, 0x2960, 0x6000, 0x2011,
++	0x0001, 0xa084, 0x2000, 0x00c0, 0x542f, 0x2011, 0x0000, 0x78ab,
++	0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004,
++	0x68b8, 0xa085, 0x0200, 0x68ba, 0x0c7f, 0x007c, 0x789b, 0x0018,
++	0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b,
++	0x0081, 0x78ab, 0x0004, 0x007c, 0x0c7e, 0x705c, 0x2060, 0x6000,
++	0xa084, 0x1000, 0x00c0, 0x545a, 0x2029, 0x0032, 0x2021, 0x0000,
++	0x0078, 0x546c, 0x6408, 0xa4ac, 0x00ff, 0xa582, 0x000c, 0x00c8,
++	0x5463, 0x2029, 0x000c, 0x8427, 0xa4a4, 0x00ff, 0xa482, 0x000c,
++	0x0048, 0x546c, 0x2021, 0x000c, 0x1078, 0x5477, 0x68b8, 0xa085,
++	0x0100, 0x68ba, 0x0c7f, 0x007c, 0xa026, 0x2029, 0x0032, 0x789b,
++	0x0018, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa,
++	0x7caa, 0x789b, 0x0081, 0x78ab, 0x0005, 0x007c, 0x2001, 0x0003,
++	0x1078, 0x54a6, 0xa6b5, 0x1000, 0x7e5a, 0x783b, 0x1700, 0x70a8,
++	0xa080, 0x00c4, 0x781a, 0x2001, 0x0005, 0x007c, 0x2001, 0x0007,
++	0x1078, 0x54a6, 0xa6b5, 0x1000, 0x7e5a, 0x783b, 0x1700, 0x70a8,
++	0xa080, 0x00c4, 0x781a, 0x2001, 0x0004, 0x007c, 0x789b, 0x0018,
++	0x78aa, 0x789b, 0x0081, 0x78ab, 0x0001, 0x007c, 0x6904, 0xa18c,
++	0x00ff, 0xa196, 0x0007, 0x0040, 0x54bc, 0xa196, 0x000f, 0x0040,
++	0x54bc, 0x1078, 0x1e55, 0x007c, 0x6924, 0xa194, 0x003f, 0x00c0,
++	0x54c5, 0xa18c, 0xffc0, 0xa105, 0x6826, 0x1078, 0x4781, 0x691c,
++	0xa184, 0x0100, 0x0040, 0x54d3, 0x6914, 0x2100, 0x1078, 0x47fa,
++	0x6204, 0x8210, 0x6206, 0x007c, 0x692c, 0x6834, 0x682e, 0xa112,
++	0x6930, 0x6838, 0x6832, 0xa11b, 0xa200, 0xa301, 0x007c, 0x0c7e,
++	0xade0, 0x0018, 0x6003, 0x0070, 0x6106, 0x600b, 0x0000, 0x600f,
++	0x0a00, 0x6013, 0x0000, 0x6017, 0x0000, 0x8007, 0x601a, 0x601f,
++	0x0000, 0x6023, 0x0000, 0x0c7f, 0x6824, 0xa085, 0x0080, 0x6826,
++	0x007c, 0x157e, 0x137e, 0x147e, 0x2098, 0xaf80, 0x002d, 0x20a0,
++	0x81ac, 0x0040, 0x5504, 0x53a6, 0xa184, 0x0001, 0x0040, 0x550a,
++	0x3304, 0x78be, 0x147f, 0x137f, 0x157f, 0x007c, 0x70a4, 0x0e7e,
++	0x007e, 0x007f, 0x0e7f, 0xa005, 0x6918, 0x017e, 0x6914, 0x017e,
++	0x6928, 0x017e, 0x017f, 0x017f, 0x017f, 0x10c0, 0x2bfa, 0x70a7,
++	0x8000, 0x6814, 0xd0fc, 0x0040, 0x5528, 0xc185, 0x0078, 0x5529,
++	0xc184, 0x0078, 0x591e, 0x007c, 0x71a4, 0x81ff, 0x0040, 0x5538,
++	0x7848, 0xa085, 0x0008, 0x784a, 0x70a7, 0x0000, 0x1078, 0x55ac,
++	0x007c, 0x0c7e, 0x0d7e, 0x1078, 0x1e32, 0x0c7f, 0x157e, 0x137e,
++	0x147e, 0x2da0, 0x2c98, 0x20a9, 0x0037, 0x53a3, 0x147f, 0x137f,
++	0x157f, 0x6807, 0x010d, 0x680b, 0x0000, 0x701c, 0x8007, 0x681a,
++	0x6823, 0x0000, 0x681f, 0x0000, 0x689f, 0x0000, 0x0c7f, 0x007c,
++	0x70a8, 0xa080, 0x0097, 0x781a, 0x0078, 0x2c5e, 0x70a8, 0xa080,
++	0x0088, 0x781a, 0x0078, 0x2c5e, 0x783b, 0x1700, 0x70a8, 0xa080,
++	0x00c4, 0x781a, 0x0078, 0x2c5e, 0x70a8, 0xa080, 0x00cd, 0x781a,
++	0x0078, 0x2c5e, 0x6904, 0xa18c, 0x00ff, 0xa196, 0x0007, 0x0040,
++	0x557f, 0xa196, 0x000f, 0x0040, 0x557f, 0x6807, 0x0117, 0x6824,
++	0xa084, 0x00ff, 0xa085, 0x0200, 0x6826, 0x8007, 0x789b, 0x000e,
++	0x78aa, 0x6820, 0xa085, 0x8000, 0x6822, 0x2031, 0x0400, 0x6eb6,
++	0x7e5a, 0x71a8, 0xa188, 0x0097, 0x791a, 0x007c, 0x1078, 0x552c,
++	0x7848, 0xa085, 0x000c, 0x784a, 0x70a8, 0xa080, 0x0085, 0x781a,
++	0x2009, 0x000b, 0x2001, 0x4400, 0x1078, 0x54df, 0x2001, 0x0013,
++	0x1078, 0x54ae, 0x0078, 0x4856, 0x127e, 0x70f0, 0xa084, 0x4600,
++	0x8004, 0x2090, 0x7204, 0x700c, 0xa215, 0x7008, 0xc09c, 0xa205,
++	0x00c0, 0x55c1, 0x7007, 0x0004, 0x7003, 0x0000, 0x127f, 0x2000,
++	0x007c, 0x7000, 0xd084, 0x0040, 0x5600, 0x7108, 0x0005, 0x7008,
++	0xa106, 0x00c0, 0x55c5, 0xa184, 0x0003, 0x0040, 0x562c, 0xa184,
++	0x01e0, 0x00c0, 0x562c, 0xd1f4, 0x00c0, 0x55c5, 0xa184, 0x3000,
++	0xa086, 0x1000, 0x0040, 0x55c5, 0x2011, 0x0180, 0x710c, 0x8211,
++	0x0040, 0x55ea, 0x7008, 0xd0f4, 0x00c0, 0x55c5, 0x700c, 0xa106,
++	0x0040, 0x55df, 0x7007, 0x0012, 0x7108, 0x0005, 0x7008, 0xa106,
++	0x00c0, 0x55ec, 0xa184, 0x0003, 0x0040, 0x562c, 0xd194, 0x0040,
++	0x55ec, 0xd1f4, 0x0040, 0x562c, 0x7007, 0x0002, 0x0078, 0x55c5,
++	0x7108, 0xd1fc, 0x0040, 0x560b, 0x1078, 0x5792, 0x8aff, 0x0040,
++	0x55b2, 0x0078, 0x5600, 0x700c, 0xa08c, 0x03ff, 0x0040, 0x5631,
++	0x7004, 0xd084, 0x0040, 0x5623, 0x7014, 0xa005, 0x00c0, 0x561f,
++	0x7010, 0xa005, 0x0040, 0x5623, 0xa102, 0x00c8, 0x5600, 0x7007,
++	0x0010, 0x0078, 0x562c, 0x8aff, 0x0040, 0x5631, 0x1078, 0x5a15,
++	0x00c0, 0x5626, 0x0040, 0x5600, 0x1078, 0x56da, 0x127f, 0x2000,
++	0x007c, 0x7204, 0x700c, 0xa215, 0x7108, 0xc19c, 0x8103, 0x00c8,
++	0x5640, 0xa205, 0x00c0, 0x562c, 0x7007, 0x0002, 0x0078, 0x5631,
++	0xa205, 0x00c0, 0x562c, 0x7003, 0x0000, 0x7007, 0x0004, 0x127f,
++	0x2000, 0x007c, 0x017e, 0x6104, 0xa18c, 0x00ff, 0xa186, 0x0007,
++	0x0040, 0x5656, 0xa18e, 0x000f, 0x00c0, 0x5659, 0x6040, 0x0078,
++	0x565a, 0x6428, 0x017f, 0x84ff, 0x0040, 0x5684, 0x2c70, 0x7004,
++	0xa0bc, 0x000f, 0xa7b8, 0x5694, 0x273c, 0x87fb, 0x00c0, 0x5672,
++	0x0048, 0x566c, 0x1078, 0x2bfa, 0x609c, 0xa075, 0x0040, 0x5684,
++	0x0078, 0x565f, 0x2704, 0xae68, 0x6808, 0xa630, 0x680c, 0xa529,
++	0x8421, 0x0040, 0x5684, 0x8738, 0x2704, 0xa005, 0x00c0, 0x5673,
++	0x709c, 0xa075, 0x00c0, 0x565f, 0x007c, 0x0000, 0x0005, 0x0009,
++	0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000, 0x0003, 0x0009,
++	0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x5689, 0x5686, 0x0000,
++	0x0000, 0x8000, 0x0000, 0x5689, 0x0000, 0x5691, 0x568e, 0x0000,
++	0x0000, 0x0000, 0x0000, 0x5691, 0x0000, 0x568c, 0x568c, 0x0000,
++	0x0000, 0x8000, 0x0000, 0x568c, 0x0000, 0x5692, 0x5692, 0x0000,
++	0x0000, 0x0000, 0x0000, 0x5692, 0x2079, 0x6000, 0x2071, 0x0010,
++	0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x7808, 0xd0ec,
++	0x0040, 0x56c8, 0x2009, 0x0001, 0x2071, 0x0020, 0x0078, 0x56cc,
++	0x2009, 0x0002, 0x2071, 0x0050, 0x7007, 0x000a, 0x7007, 0x0002,
++	0x7003, 0x0000, 0x8109, 0x0040, 0x56d9, 0x2071, 0x0020, 0x0078,
++	0x56cc, 0x007c, 0x2019, 0x0000, 0x7004, 0x8004, 0x00c8, 0x5761,
++	0x7108, 0x7008, 0xa106, 0x00c0, 0x56e0, 0xa184, 0x01e0, 0x0040,
++	0x56ed, 0x1078, 0x57d8, 0x0078, 0x5789, 0x7007, 0x0012, 0x7108,
++	0x7008, 0xa106, 0x00c0, 0x56ef, 0xa184, 0x01e0, 0x0040, 0x56fa,
++	0x1078, 0x57d8, 0x7808, 0xd0ec, 0x0040, 0x5714, 0x2001, 0x04fd,
++	0x2004, 0xa086, 0x0003, 0x00c0, 0x5718, 0xa184, 0x4000, 0x0040,
++	0x571c, 0xa382, 0x0003, 0x00c8, 0x571c, 0xa184, 0x0004, 0x0040,
++	0x56ef, 0x8318, 0x0078, 0x56ef, 0x780c, 0xd0ec, 0x00c0, 0x571c,
++	0xa184, 0x4000, 0x00c0, 0x56ef, 0xa19c, 0x300c, 0xa386, 0x2004,
++	0x0040, 0x5739, 0xa386, 0x0008, 0x0040, 0x5744, 0x7004, 0xd084,
++	0x00c0, 0x5735, 0x7108, 0x7008, 0xa106, 0x00c0, 0x572a, 0xa184,
++	0x0003, 0x0040, 0x5735, 0x0078, 0x57d8, 0xa386, 0x200c, 0x00c0,
++	0x56ef, 0x7200, 0x8204, 0x0048, 0x5744, 0x730c, 0xa384, 0x03ff,
++	0x0040, 0x5744, 0x1078, 0x2bfa, 0x7108, 0x7008, 0xa106, 0x00c0,
++	0x5744, 0xa184, 0x01e0, 0x0040, 0x5751, 0x1078, 0x57d8, 0x0078,
++	0x5789, 0x7007, 0x0012, 0x7000, 0xd084, 0x00c0, 0x5761, 0x7310,
++	0x7014, 0xa305, 0x0040, 0x5761, 0x710c, 0xa184, 0x03ff, 0x00c0,
++	0x56da, 0x7108, 0x7008, 0xa106, 0x00c0, 0x5761, 0xa184, 0x01e0,
++	0x0040, 0x576e, 0x1078, 0x57d8, 0x0078, 0x5789, 0x7007, 0x0012,
++	0x7007, 0x0008, 0x7004, 0xd09c, 0x00c0, 0x5772, 0x7108, 0x7008,
++	0xa106, 0x00c0, 0x5776, 0xa184, 0x01e0, 0x0040, 0x5783, 0x1078,
++	0x57d8, 0x0078, 0x5789, 0x7007, 0x0012, 0x7108, 0xd1fc, 0x00c0,
++	0x5776, 0x7003, 0x0000, 0x007c, 0x157e, 0x7108, 0x1078, 0x5792,
++	0x157f, 0x007c, 0x7204, 0x7500, 0xa184, 0x01e0, 0x00c0, 0x57d8,
++	0x7108, 0xa184, 0x01e0, 0x00c0, 0x57d8, 0xa184, 0x0007, 0x0079,
++	0x57a1, 0x57ab, 0x57bc, 0x57a9, 0x57bc, 0x57a9, 0x582f, 0x57a9,
++	0x582d, 0x1078, 0x2bfa, 0x7004, 0xa084, 0x0010, 0xc08d, 0x7006,
++	0x8aff, 0x00c0, 0x57b7, 0x2049, 0x0000, 0x0078, 0x57bb, 0x1078,
++	0x5a15, 0x00c0, 0x57b7, 0x007c, 0x7004, 0xa084, 0x0010, 0xc08d,
++	0x7006, 0x7004, 0xd084, 0x00c0, 0x57d0, 0x7108, 0x7008, 0xa106,
++	0x00c0, 0x57c5, 0xa184, 0x0003, 0x0040, 0x57d0, 0x0078, 0x57d8,
++	0x8aff, 0x0040, 0x57d7, 0x1078, 0x5a15, 0x00c0, 0x57d3, 0x007c,
++	0x7007, 0x0012, 0x7108, 0x00e0, 0x57db, 0x2091, 0x6000, 0x00e0,
++	0x57df, 0x2091, 0x6000, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004,
++	0xd09c, 0x00c0, 0x57e7, 0x7007, 0x0012, 0x7108, 0xd1fc, 0x00c0,
++	0x57eb, 0x7003, 0x0000, 0x7000, 0xa005, 0x00c0, 0x57ff, 0x7004,
++	0xa005, 0x00c0, 0x57ff, 0x700c, 0xa005, 0x0040, 0x5801, 0x0078,
++	0x57e3, 0x2049, 0x0000, 0xb284, 0x0100, 0x0040, 0x580b, 0x2001,
++	0x0000, 0x0078, 0x580d, 0x2001, 0x0001, 0x1078, 0x43c9, 0xb284,
++	0x0100, 0x0040, 0x5817, 0x2001, 0x6064, 0x0078, 0x5819, 0x2001,
++	0x60a4, 0x2004, 0xa084, 0x8000, 0x0040, 0x5826, 0x6824, 0xa005,
++	0x00c0, 0x5828, 0x6827, 0x0004, 0x0078, 0x5828, 0x681b, 0x0002,
++	0x007c, 0x1078, 0x2bfa, 0x1078, 0x2bfa, 0x1078, 0x5877, 0x7210,
++	0x7114, 0x700c, 0xa09c, 0x03ff, 0x2800, 0xa300, 0xa211, 0xa189,
++	0x0000, 0x1078, 0x5877, 0x2704, 0x2c58, 0xac60, 0x6308, 0x2200,
++	0xa322, 0x630c, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0040, 0x5852,
++	0x00c8, 0x5852, 0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60,
++	0x0078, 0x5839, 0x2b60, 0x8a07, 0x007e, 0x6004, 0xa084, 0x0008,
++	0x0040, 0x585e, 0xa7ba, 0x568e, 0x0078, 0x5860, 0xa7ba, 0x5686,
++	0x007f, 0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92, 0x6b8e, 0x7108,
++	0x7008, 0xa106, 0x00c0, 0x5867, 0xa184, 0x01e0, 0x0040, 0x5872,
++	0x1078, 0x57d8, 0x7007, 0x0012, 0x1078, 0x56da, 0x007c, 0x8a50,
++	0x8739, 0x2704, 0xa004, 0x00c0, 0x588b, 0x6000, 0xa064, 0x00c0,
++	0x5882, 0x2d60, 0x6004, 0xa084, 0x000f, 0xa080, 0x56a4, 0x203c,
++	0x87fb, 0x1040, 0x2bfa, 0x007c, 0x127e, 0x0d7e, 0x70f0, 0xa084,
++	0x4600, 0x8004, 0x2090, 0x0d7f, 0x6884, 0x2060, 0x6888, 0x6b8c,
++	0x6c90, 0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0x007e, 0x6804,
++	0xa084, 0x0008, 0x007f, 0x0040, 0x58a9, 0xa0b8, 0x568e, 0x0078,
++	0x58ab, 0xa0b8, 0x5686, 0xb284, 0x0100, 0x0040, 0x58b2, 0x7e18,
++	0x0078, 0x58b3, 0x7e1c, 0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff,
++	0xa186, 0x0007, 0x0040, 0x58c0, 0xa18e, 0x000f, 0x00c0, 0x58c8,
++	0x681c, 0xa084, 0x0040, 0x0040, 0x58cd, 0xc685, 0x0078, 0x58cd,
++	0x681c, 0xd0b4, 0x0040, 0x58cd, 0xc685, 0x700c, 0xa084, 0x03ff,
++	0x0040, 0x58d8, 0x7007, 0x0004, 0x7004, 0xd094, 0x00c0, 0x58d4,
++	0x2400, 0xa305, 0x00c0, 0x58de, 0x0078, 0x5904, 0x2c58, 0x2704,
++	0x6104, 0xac60, 0x6000, 0xa400, 0x701a, 0x6004, 0xa301, 0x701e,
++	0xa184, 0x0008, 0x0040, 0x58f4, 0x6010, 0xa081, 0x0000, 0x7022,
++	0x6014, 0xa081, 0x0000, 0x7026, 0x6208, 0x2400, 0xa202, 0x7012,
++	0x620c, 0x2300, 0xa203, 0x7016, 0x7602, 0x7007, 0x0001, 0x2b60,
++	0x1078, 0x5a43, 0x0078, 0x5906, 0x1078, 0x5a15, 0x00c0, 0x5904,
++	0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x70f0, 0xa084, 0x4600,
++	0x8004, 0x2090, 0x0d7f, 0x7007, 0x0004, 0x7004, 0xd094, 0x00c0,
++	0x5915, 0x7003, 0x0008, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e,
++	0x70f0, 0xa084, 0x4600, 0x8004, 0x2090, 0x0d7f, 0x700c, 0xa084,
++	0x03ff, 0x0040, 0x5931, 0x7007, 0x0004, 0x7004, 0xd094, 0x00c0,
++	0x592d, 0x6814, 0xd0fc, 0x0040, 0x5938, 0x7e1c, 0x0078, 0x5939,
++	0x7e18, 0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007,
++	0x0040, 0x5946, 0xa18e, 0x000f, 0x00c0, 0x5950, 0x681c, 0xa084,
++	0x0040, 0x0040, 0x594c, 0xc685, 0x6840, 0x2050, 0x0078, 0x5957,
++	0x681c, 0xd0ac, 0x00c0, 0x5955, 0xc685, 0x6828, 0x2050, 0x2d60,
++	0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x5694, 0x273c, 0x87fb, 0x00c0,
++	0x596b, 0x0048, 0x5965, 0x1078, 0x2bfa, 0x689c, 0xa065, 0x0040,
++	0x596f, 0x0078, 0x5958, 0x1078, 0x5a15, 0x00c0, 0x596b, 0x127f,
++	0x2000, 0x007c, 0x127e, 0x007e, 0x017e, 0x0d7e, 0x70f0, 0xa084,
++	0x4600, 0x8004, 0x2090, 0xb284, 0x0100, 0x0040, 0x5982, 0x7e18,
++	0x0078, 0x5983, 0x7e1c, 0x0d7f, 0x037f, 0x047f, 0xa6b5, 0x000c,
++	0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x5993, 0xa18e,
++	0x000f, 0x00c0, 0x599b, 0x681c, 0xa084, 0x0040, 0x0040, 0x59a0,
++	0xc685, 0x0078, 0x59a0, 0x681c, 0xd0b4, 0x0040, 0x59a0, 0xc685,
++	0x2049, 0x5972, 0x017e, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007,
++	0x0040, 0x59ae, 0xa18e, 0x000f, 0x00c0, 0x59b1, 0x6840, 0x0078,
++	0x59b2, 0x6828, 0x017f, 0xa055, 0x0d7e, 0x0040, 0x5a11, 0x2d70,
++	0x2e60, 0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x5694, 0x273c, 0x87fb,
++	0x00c0, 0x59cd, 0x0048, 0x59c6, 0x1078, 0x2bfa, 0x709c, 0xa075,
++	0x2060, 0x0040, 0x5a11, 0x0078, 0x59b9, 0x2704, 0xae68, 0x6808,
++	0xa422, 0x680c, 0xa31b, 0x0048, 0x59e6, 0x8a51, 0x00c0, 0x59da,
++	0x1078, 0x2bfa, 0x8738, 0x2704, 0xa005, 0x00c0, 0x59ce, 0x709c,
++	0xa075, 0x2060, 0x0040, 0x5a11, 0x0078, 0x59b9, 0x8422, 0x8420,
++	0x831a, 0xa399, 0x0000, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300,
++	0xa11b, 0x00c8, 0x59f5, 0x1078, 0x2bfa, 0x017e, 0x3208, 0xa18c,
++	0x0100, 0x0040, 0x5a0b, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec,
++	0x007f, 0x0040, 0x5a07, 0x2071, 0x0020, 0x0078, 0x5a0d, 0x2071,
++	0x0050, 0x0078, 0x5a0d, 0x2071, 0x0020, 0x017f, 0x0d7f, 0x0078,
++	0x58cd, 0x0d7f, 0x127f, 0x2000, 0x007c, 0x7008, 0x007e, 0xa084,
++	0x01e0, 0x007f, 0x0040, 0x5a1e, 0xa006, 0x007c, 0xa084, 0x0003,
++	0xa086, 0x0003, 0x00c0, 0x5a25, 0x007c, 0x2704, 0xac08, 0x2104,
++	0x701a, 0x8108, 0x2104, 0x701e, 0x8108, 0x2104, 0x7012, 0x8108,
++	0x2104, 0x7016, 0x6004, 0xa084, 0x0008, 0x0040, 0x5a3d, 0x8108,
++	0x2104, 0x7022, 0x8108, 0x2104, 0x7026, 0x7602, 0x7004, 0xa084,
++	0x0010, 0xc085, 0x7006, 0x8738, 0x2704, 0xa005, 0x00c0, 0x5a56,
++	0x609c, 0xa005, 0x0040, 0x5a68, 0x2060, 0x6004, 0xa084, 0x000f,
++	0xa080, 0x5694, 0x203c, 0x87fb, 0x1040, 0x2bfa, 0x8a51, 0x0040,
++	0x5a67, 0x7008, 0x007e, 0xa084, 0x01e0, 0x007f, 0x0040, 0x5a63,
++	0xa006, 0x0078, 0x5a68, 0xa084, 0x0003, 0xa086, 0x0003, 0x007c,
++	0x2051, 0x0000, 0x007c, 0x127e, 0x007e, 0x0d7e, 0x70f0, 0xa084,
++	0x4600, 0x8004, 0x2090, 0x0d7f, 0x087f, 0x7108, 0xa184, 0x0003,
++	0x00c0, 0x5a90, 0x017e, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007,
++	0x0040, 0x5a86, 0xa18e, 0x000f, 0x00c0, 0x5a89, 0x6840, 0x0078,
++	0x5a8a, 0x6828, 0x017f, 0xa005, 0x0040, 0x5aa0, 0x0078, 0x55c1,
++	0x7108, 0xd1fc, 0x0040, 0x5a98, 0x1078, 0x5792, 0x0078, 0x5a75,
++	0x7007, 0x0010, 0x7108, 0xd1fc, 0x0040, 0x5a9a, 0x1078, 0x5792,
++	0x7008, 0xa086, 0x0008, 0x00c0, 0x5a75, 0x7000, 0xa005, 0x00c0,
++	0x5a75, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000, 0x007c,
++	0x127e, 0x147e, 0x137e, 0x157e, 0x0c7e, 0x0d7e, 0x70f0, 0xa084,
++	0x4600, 0x8004, 0x2090, 0x0d7f, 0x2049, 0x5ab0, 0x69b0, 0xad80,
++	0x0011, 0xa100, 0x20a0, 0xb284, 0x0100, 0x0040, 0x5ad5, 0x2001,
++	0x6002, 0x2004, 0xd0ec, 0x0040, 0x5ad1, 0x2099, 0x0031, 0x0078,
++	0x5ad7, 0x2099, 0x0032, 0x0078, 0x5ad7, 0x2099, 0x0031, 0x700c,
++	0xa084, 0x03ff, 0x0040, 0x5af5, 0x6928, 0xa100, 0x682a, 0x7007,
++	0x0008, 0x7007, 0x0002, 0x7003, 0x0001, 0x0040, 0x5aea, 0x8000,
++	0x80ac, 0x53a5, 0x700c, 0xa084, 0x03ff, 0x0040, 0x5af5, 0x7007,
++	0x0004, 0x7004, 0xd094, 0x00c0, 0x5af1, 0x0c7f, 0x2049, 0x0000,
++	0x7003, 0x0000, 0x157f, 0x137f, 0x147f, 0x127f, 0x2000, 0x007c,
++	0x2091, 0x6000, 0x2091, 0x8000, 0x78b0, 0xa005, 0x00c0, 0x5b17,
++	0x7970, 0x70d0, 0xa106, 0x00c0, 0x5b17, 0x7814, 0xa005, 0x0040,
++	0x5b17, 0x7817, 0x0000, 0x0068, 0x5b17, 0x2091, 0x4080, 0x7828,
++	0x8001, 0x782a, 0x00c0, 0x5b9f, 0x782c, 0x782a, 0x7808, 0xd0ec,
++	0x00c0, 0x5b98, 0x2061, 0x85c0, 0x2069, 0x6080, 0xc7fd, 0x68ec,
++	0xa005, 0x0040, 0x5b32, 0x8001, 0x68ee, 0xa005, 0x00c0, 0x5b32,
++	0x1078, 0x5d6b, 0x6800, 0xa084, 0x000f, 0x0040, 0x5b47, 0xa086,
++	0x0001, 0x0040, 0x5b47, 0x6840, 0xa00d, 0x0040, 0x5b47, 0x2104,
++	0xa005, 0x0040, 0x5b47, 0x8001, 0x200a, 0x0040, 0x5cc9, 0x6810,
++	0xa005, 0x0040, 0x5b6b, 0x8001, 0x6812, 0x00c0, 0x5b6b, 0x68c3,
++	0x0001, 0xd7fc, 0x00c0, 0x5b60, 0x7808, 0xd0ec, 0x0040, 0x5b5c,
++	0x2009, 0x0102, 0x0078, 0x5b62, 0x2009, 0x0202, 0x0078, 0x5b62,
++	0x2009, 0x0102, 0x684c, 0xc08d, 0x200a, 0x6868, 0xa005, 0x0040,
++	0x5b6b, 0x1078, 0x2852, 0x6884, 0xa005, 0x0040, 0x5b78, 0x8001,
++	0x6886, 0x00c0, 0x5b78, 0x686b, 0x0000, 0x68f0, 0xc0dd, 0x68f2,
++	0x68f0, 0xd0fc, 0x0040, 0x5b95, 0xc0fc, 0x68f2, 0x20a9, 0x0200,
++	0x6034, 0xa005, 0x0040, 0x5b91, 0x8001, 0x6036, 0x68f0, 0xc0fd,
++	0x68f2, 0x00c0, 0x5b91, 0x6010, 0xa005, 0x0040, 0x5b91, 0x1078,
++	0x2852, 0xace0, 0x0010, 0x00f0, 0x5b80, 0xd7fc, 0x0040, 0x5b9f,
++	0x2061, 0x65c0, 0x2069, 0x6040, 0xc7fc, 0x0078, 0x5b27, 0x1078,
++	0x5bc8, 0x7830, 0x8001, 0x7832, 0x00c0, 0x5bc1, 0x7834, 0x7832,
++	0x2061, 0x65c0, 0x2069, 0x6040, 0xc7fc, 0x6808, 0xa005, 0x0040,
++	0x5bb3, 0x1078, 0x5c32, 0xd7fc, 0x00c0, 0x5bc1, 0x7808, 0xd0ec,
++	0x00c0, 0x5bc1, 0x2061, 0x85c0, 0x2069, 0x6080, 0xc7fd, 0x0078,
++	0x5bad, 0x780c, 0xd0e4, 0x00c0, 0x5bc5, 0x2091, 0x8001, 0x007c,
++	0x7838, 0x8001, 0x783a, 0x00c0, 0x5c31, 0x783c, 0x783a, 0x2069,
++	0x6040, 0xc7fc, 0x7808, 0x2079, 0x0200, 0xd0ec, 0x0040, 0x5bda,
++	0x2079, 0x0100, 0x68f8, 0xa005, 0x0040, 0x5be6, 0x7de0, 0xa504,
++	0x00c0, 0x5be6, 0x68fa, 0x68f0, 0xc0bc, 0x68f2, 0x2079, 0x6000,
++	0x680c, 0xa005, 0x00c0, 0x5bee, 0x2001, 0x0101, 0x8001, 0x680e,
++	0xd7fc, 0x00c0, 0x5bf7, 0xa080, 0xa5c0, 0x0078, 0x5bf9, 0xa080,
++	0xa6d0, 0x2040, 0x2004, 0xa065, 0x0040, 0x5c23, 0x6024, 0xa005,
++	0x0040, 0x5c1f, 0x8001, 0x6026, 0x00c0, 0x5c1f, 0x6800, 0xa005,
++	0x0040, 0x5c12, 0x6850, 0xac06, 0x00c0, 0x5c12, 0x1078, 0x5cc9,
++	0x0078, 0x5c23, 0x6868, 0xa005, 0x0040, 0x5c1a, 0x6027, 0x0001,
++	0x0078, 0x5c1f, 0x1078, 0x5c7c, 0x2804, 0x0078, 0x5bfb, 0x6000,
++	0x2c40, 0x0078, 0x5bfb, 0xd7fc, 0x00c0, 0x5c31, 0x7808, 0xd0ec,
++	0x00c0, 0x5c31, 0x2069, 0x6080, 0xc7fd, 0x2079, 0x0100, 0x0078,
++	0x5bda, 0x007c, 0xa00e, 0x20a9, 0x0200, 0x6008, 0xd09c, 0x0040,
++	0x5c6b, 0x6024, 0xa005, 0x0040, 0x5c41, 0x8001, 0x6026, 0x0078,
++	0x5c69, 0x6008, 0xc09c, 0xd084, 0x00c0, 0x5c49, 0xd0ac, 0x0040,
++	0x5c63, 0x600a, 0x6004, 0xa005, 0x0040, 0x5c6b, 0x0d7e, 0x0c7e,
++	0x017e, 0x2068, 0x6010, 0x8001, 0x6012, 0x1078, 0x3fd3, 0x2d00,
++	0x2c68, 0x2060, 0x1078, 0x1ef5, 0x1078, 0x2240, 0x017f, 0x0c7f,
++	0x0d7f, 0x0078, 0x5c6b, 0xc0bd, 0x600a, 0xa18d, 0x0001, 0x0078,
++	0x5c6b, 0xa18d, 0x0100, 0xace0, 0x0010, 0x00f0, 0x5c35, 0xa184,
++	0x0001, 0x0040, 0x5c7a, 0xa18c, 0xfffe, 0x690a, 0x1078, 0x2852,
++	0x0078, 0x5c7b, 0x690a, 0x007c, 0x2c00, 0x6882, 0x6714, 0x6f7a,
++	0x6017, 0x0000, 0x602b, 0x0000, 0x601b, 0x0006, 0x60b4, 0xa084,
++	0x5f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0060, 0x6022,
++	0x6000, 0x2042, 0x6860, 0xac06, 0x00c0, 0x5c98, 0x2800, 0x6862,
++	0x1078, 0x1e6e, 0x6818, 0xa005, 0x0040, 0x5cc8, 0x8001, 0x681a,
++	0x681a, 0x6808, 0xc0a4, 0x680a, 0x6810, 0x8001, 0x0050, 0x5cc8,
++	0x6812, 0x602f, 0x0000, 0x6033, 0x0000, 0x2c68, 0x1078, 0x2251,
++	0xd7fc, 0x00c0, 0x5cb7, 0x2069, 0x6040, 0x0078, 0x5cb9, 0x2069,
++	0x6080, 0x690c, 0xa184, 0x0100, 0x2001, 0x0006, 0x00c0, 0x5cc5,
++	0x6883, 0x0000, 0x697e, 0x2001, 0x0004, 0x2708, 0x1078, 0x2845,
++	0x007c, 0x0d7e, 0x0e7e, 0x2d70, 0xd7fc, 0x00c0, 0x5cdb, 0x7808,
++	0xd0ec, 0x0040, 0x5cd7, 0x2069, 0x0100, 0x0078, 0x5cdd, 0x2069,
++	0x0200, 0x0078, 0x5cdd, 0x2069, 0x0100, 0x7000, 0xa084, 0x000f,
++	0x0040, 0x5d27, 0xa086, 0x0007, 0x00c0, 0x5cef, 0x0f7e, 0x2d78,
++	0x7094, 0x2068, 0x1078, 0x4694, 0x0f7f, 0x0078, 0x5d27, 0x7050,
++	0x2060, 0x1078, 0x2b67, 0x601b, 0x0006, 0x6858, 0xa084, 0x5f00,
++	0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0048, 0x6022, 0x602f,
++	0x0000, 0x6033, 0x0000, 0x6808, 0xa084, 0xfffd, 0x680a, 0x6830,
++	0xd0b4, 0x0040, 0x5d23, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848,
++	0xd094, 0x0040, 0x5d15, 0x00f0, 0x5d0f, 0x684b, 0x0009, 0x20a9,
++	0x0014, 0x6848, 0xd084, 0x0040, 0x5d1f, 0x00f0, 0x5d19, 0x20a9,
++	0x00fa, 0x00f0, 0x5d21, 0x681b, 0x0048, 0x706b, 0x0007, 0x0e7f,
++	0x0d7f, 0x007c, 0x2079, 0x6000, 0x1078, 0x5d5e, 0x1078, 0x5d44,
++	0x1078, 0x5d51, 0x2009, 0x0002, 0x2069, 0x6080, 0x680b, 0x0000,
++	0x680f, 0x0000, 0x6813, 0x0000, 0x8109, 0x0040, 0x5d43, 0x2069,
++	0x6040, 0x0078, 0x5d36, 0x007c, 0x7808, 0xd0ec, 0x0040, 0x5d4c,
++	0x2019, 0x00cc, 0x0078, 0x5d4e, 0x2019, 0x007b, 0x7b32, 0x7b36,
++	0x007c, 0x780c, 0xd0e4, 0x00c0, 0x5d59, 0x2019, 0x0040, 0x0078,
++	0x5d5b, 0x2019, 0x0026, 0x7b3a, 0x7b3e, 0x007c, 0x780c, 0xd0e4,
++	0x00c0, 0x5d66, 0x2019, 0x3f94, 0x0078, 0x5d68, 0x2019, 0x2626,
++	0x7b2a, 0x7b2e, 0x007c, 0x6a54, 0xa285, 0x0000, 0x0040, 0x5d93,
++	0x6958, 0x6bdc, 0xa300, 0x0c7e, 0x2164, 0x6304, 0x83ff, 0x00c0,
++	0x5d83, 0x8211, 0x0040, 0x5d87, 0x8108, 0xa11a, 0x0048, 0x5d74,
++	0x69dc, 0x0078, 0x5d74, 0x68ef, 0x000a, 0x0c7f, 0x007c, 0x6954,
++	0x6adc, 0x2264, 0x6008, 0xc0b5, 0x600a, 0x8210, 0x8109, 0x00c0,
++	0x5d89, 0x6956, 0x0c7f, 0x007c, 0x00e0, 0x5d94, 0x2091, 0x6000,
++	0x00e0, 0x5d98, 0x2091, 0x6000, 0x70ec, 0xd0dc, 0x00c0, 0x5da5,
++	0xd0d4, 0x0040, 0x5dce, 0x0078, 0x5dd1, 0x2008, 0x7808, 0xd0ec,
++	0x0040, 0x5db8, 0xd1c4, 0x00c0, 0x5df0, 0x780c, 0xc0c5, 0x780e,
++	0x7808, 0xc0f5, 0x780a, 0xd0ec, 0x0040, 0x5dec, 0x0078, 0x5de8,
++	0xae8e, 0x0100, 0x0040, 0x5dc5, 0x780c, 0xc0f5, 0xc0c5, 0x780e,
++	0xd0d4, 0x00c0, 0x5dec, 0x0078, 0x5de8, 0x780c, 0xc0fd, 0xc0c5,
++	0x780e, 0xd0d4, 0x00c0, 0x5dec, 0x0078, 0x5de8, 0xd0e4, 0x0040,
++	0x5dee, 0x00e0, 0x5dd1, 0x2091, 0x6000, 0x2009, 0x000c, 0x00e0,
++	0x5dd7, 0x2091, 0x6000, 0x8109, 0x00c0, 0x5dd7, 0x70e4, 0xa084,
++	0x01ff, 0xa086, 0x01ff, 0x00c0, 0x5de8, 0x70ec, 0x0078, 0x5da5,
++	0x7804, 0xd08c, 0x0040, 0x5dee, 0x681b, 0x000c, 0x70a0, 0x70a2,
++	0x007c, 0x0020, 0x002b, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0014, 0x0014, 0x9849, 0x0014,
++	0x0014, 0x98ec, 0x98d6, 0x0014, 0x0014, 0x0014, 0x0080, 0x0140,
++	0x0000, 0x0201, 0x0604, 0x0c08, 0x2120, 0x4022, 0xf880, 0x0018,
++	0x300b, 0xa201, 0x0014, 0xa200, 0x0014, 0xa200, 0x0214, 0xa202,
++	0x3806, 0x7102, 0x805f, 0x9481, 0x8839, 0x20c3, 0x0864, 0xa834,
++	0x28c1, 0x9cb9, 0xa203, 0x300c, 0x2846, 0x8161, 0x846a, 0x8300,
++	0x1856, 0x883a, 0xa804, 0x28f2, 0x9c9d, 0xa8f4, 0x300c, 0x28e1,
++	0x9c9d, 0x2822, 0xa207, 0x64a4, 0x2001, 0xa811, 0xa206, 0x64c0,
++	0x6de0, 0x67a0, 0x6fc0, 0x882b, 0x1814, 0x883b, 0x7824, 0x68c1,
++	0x7864, 0x883e, 0xa802, 0x8576, 0x8677, 0x80df, 0x94a1, 0x206c,
++	0x28c1, 0x9cb9, 0x2045, 0x2104, 0x20a1, 0x2080, 0x7961, 0xa8df,
++	0xa209, 0x0904, 0xa20e, 0xa808, 0xa205, 0xa300, 0x1872, 0x879a,
++	0x883c, 0x1fe2, 0xc601, 0xa20a, 0x8000, 0x85a1, 0x806f, 0x9422,
++	0x84a2, 0x856e, 0x0704, 0x9c9d, 0x0014, 0xa204, 0xa300, 0x3009,
++	0x19e2, 0xf864, 0x856e, 0x883f, 0x08e6, 0xa8f7, 0xf881, 0xa8eb,
++	0xc007, 0xf8c1, 0x0016, 0x85b2, 0x80f0, 0x9532, 0xfb02, 0x1de2,
++	0x0014, 0x8532, 0xf241, 0x0014, 0x1de2, 0x84a8, 0xd7a0, 0x1fe6,
++	0x0014, 0xa208, 0x6043, 0x8008, 0x1dc1, 0x0016, 0x8300, 0x8160,
++	0x842a, 0xf041, 0x3008, 0x84a8, 0x11d6, 0x7042, 0x20dd, 0x0011,
++	0x20d5, 0x8822, 0x0016, 0x3008, 0x2845, 0x1011, 0xa8fd, 0x2802,
++	0x1011, 0xa8fd, 0xa894, 0x283e, 0x1011, 0xa8fd, 0xa20b, 0x7102,
++	0x805f, 0x9481, 0x0017, 0x300c, 0xa300, 0x1de2, 0xd387, 0x0210,
++	0xa800, 0x26e0, 0x873a, 0xfb02, 0x19f2, 0x1fe2, 0x0014, 0xa20d,
++	0x3806, 0x0210, 0x9cbe, 0x0704, 0x0017, 0x60ff, 0x300c, 0x8720,
++	0xa211, 0x7102, 0x805f, 0x9481, 0x8000, 0x8300, 0x8772, 0x8837,
++	0x2101, 0xa821, 0x10d2, 0x78e2, 0x9d5c, 0xa8fc, 0xd984, 0xf0e2,
++	0xf0a1, 0xa820, 0x0014, 0x8831, 0xd166, 0x8830, 0x800f, 0x9401,
++	0xb520, 0xc802, 0x8820, 0xa80f, 0x2301, 0xa80d, 0x10d2, 0x78e4,
++	0x9d5c, 0x8821, 0x8820, 0xa8e6, 0xf123, 0xf142, 0xf101, 0xa855,
++	0x10d2, 0x70f6, 0x8832, 0x8203, 0x870c, 0xd99e, 0x6001, 0x0014,
++	0x6848, 0x0214, 0x8827, 0x300a, 0x0013, 0xa21b, 0x8300, 0x2001,
++	0xa843, 0x8201, 0x1852, 0xd183, 0x8834, 0x8001, 0xa801, 0x3027,
++	0x84a8, 0x1a56, 0x8833, 0x0014, 0xa218, 0x6981, 0x9d63, 0x692b,
++	0x6902, 0x1a34, 0xa806, 0x8080, 0x9521, 0xc002, 0x1a94, 0xa801,
++	0x1a14, 0x7021, 0x0014, 0xa300, 0x69e4, 0x8023, 0x16e1, 0x8001,
++	0x10f1, 0x6946, 0xa213, 0x1462, 0xa213, 0x8000, 0x16e1, 0xa808,
++	0x6161, 0x0014, 0xa214, 0x61c2, 0x8002, 0x14e1, 0x8004, 0x16e1,
++	0x0101, 0x300a, 0x8827, 0x0014, 0x11c2, 0x211e, 0x870e, 0xa21d,
++	0x0014, 0x9d63, 0x0014, 0xa300, 0x8181, 0x842a, 0x84a8, 0x1ce6,
++	0x882c, 0x0016, 0xa212, 0x8300, 0x10d2, 0x70e4, 0x0004, 0x8007,
++	0x9424, 0xcc1a, 0x9d5c, 0xa8f8, 0x878e, 0x0016, 0xa21c, 0x1035,
++	0xa8bb, 0xa210, 0x3807, 0x300c, 0x817e, 0x872b, 0x8772, 0x0014,
++	0x0000, 0xd27a
++};
++#endif
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/asm_12160.h	2003-07-19 17:06:32.000000000 -0700
+@@ -0,0 +1,4198 @@
++/* @(#)asm_12160.h 1.3 */
++/*
++ * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 Qlogic, Inc.
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms are permitted provided
++ * that the following conditions are met:
++ * 1. Redistribution of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistribution in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR 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.
++ */ 
++
++/************************************************************************
++ *									*
++ *	      --- ISP12160A Initiator/Target RISC Firmware ---      	*
++ *			     32 LUN Support				*
++ *									*
++ ************************************************************************/
++#ifndef	ISP_TARGET_MODE
++/*
++ *	Firmware Version 10.04.32 (12:03 May 09, 2001)
++ */
++static const u_int16_t isp_12160_risc_code[] = {
++	0x0804, 0x1041, 0x0000, 0x35e6, 0x0000, 0x2043, 0x4f50, 0x5952,
++	0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932, 0x2c31,
++	0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749, 0x4320,
++	0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049, 0x5350,
++	0x3132, 0x3136, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056,
++	0x6572, 0x7369, 0x6f6e, 0x2031, 0x302e, 0x3034, 0x2020, 0x2043,
++	0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20, 0x3030, 0x2050,
++	0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020, 0x3030, 0x2020,
++	0x2400, 0x20c9, 0x8fff, 0x2071, 0x0200, 0x70a0, 0x70a2, 0x2001,
++	0x01ff, 0x2004, 0xd0fc, 0x1120, 0x2071, 0x0100, 0x70a0, 0x70a2,
++	0x20c1, 0x0020, 0x2089, 0x1221, 0x2071, 0x0010, 0x70c3, 0x0004,
++	0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x000a,
++	0x2001, 0x04fd, 0x2004, 0x70d6, 0x2009, 0xfeff, 0x2130, 0x2128,
++	0xa1a2, 0x4600, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424,
++	0xa192, 0x9000, 0x2009, 0x0000, 0x2001, 0x0032, 0x080c, 0x1de8,
++	0x2218, 0x2079, 0x4600, 0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9,
++	0x0040, 0x42a4, 0x8109, 0x1dd8, 0x2009, 0xff00, 0x3400, 0xa102,
++	0x0218, 0x0110, 0x20a8, 0x42a4, 0x781b, 0x0064, 0x7814, 0xc0cd,
++	0xc0d5, 0x7816, 0x2071, 0x0200, 0x00d6, 0x2069, 0x4640, 0x080c,
++	0x459a, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1130, 0x2069, 0x4680,
++	0x2071, 0x0100, 0x080c, 0x459a, 0x7814, 0xc0d4, 0x7816, 0x00de,
++	0x7eca, 0x7cc2, 0x7bc6, 0x7867, 0x0000, 0x7800, 0xc08d, 0x7802,
++	0x2031, 0x0030, 0x78af, 0x0101, 0x7823, 0x0002, 0x7827, 0x0002,
++	0x2009, 0x0002, 0x2069, 0x4640, 0x681b, 0x0003, 0x6823, 0x0007,
++	0x6827, 0x00fa, 0x682b, 0x0008, 0x682f, 0x0028, 0x6837, 0x0006,
++	0x6833, 0x0008, 0x683b, 0x0000, 0x8109, 0x0500, 0x68cf, 0x000a,
++	0x68bf, 0x46c0, 0x2079, 0x4600, 0x68d3, 0x762d, 0x68c3, 0x4bc0,
++	0x68c7, 0x4ac0, 0x68cb, 0x8bc0, 0x68a7, 0x8e44, 0x68ab, 0x8e49,
++	0x68af, 0x8e44, 0x68b3, 0x8e44, 0x68a3, 0x0001, 0x2001, 0x01ff,
++	0x2004, 0xd0fc, 0x11c8, 0x2069, 0x4680, 0x0870, 0x68cf, 0x000a,
++	0x68bf, 0x48c0, 0x68d3, 0x7839, 0x68c3, 0x6bc0, 0x68c7, 0x4b40,
++	0x68cb, 0x8cd0, 0x68a7, 0x8e49, 0x68ab, 0x8e4e, 0x68af, 0x8e49,
++	0x68b3, 0x8e49, 0x68a3, 0x0001, 0x00e6, 0x2069, 0x4ac0, 0x2071,
++	0x0200, 0x70ec, 0xd0e4, 0x2019, 0x1809, 0x2021, 0x0009, 0x1120,
++	0x2019, 0x180c, 0x2021, 0x000c, 0x080c, 0x1d58, 0x2001, 0x01ff,
++	0x2004, 0xd0fc, 0x1188, 0x2069, 0x4b40, 0x2071, 0x0100, 0x70ec,
++	0xd0e4, 0x2019, 0x1809, 0x2021, 0x0009, 0x1120, 0x2019, 0x180c,
++	0x2021, 0x000c, 0x080c, 0x1d58, 0x00ee, 0x2011, 0x0002, 0x2069,
++	0x4bc0, 0x2009, 0x0002, 0x20a9, 0x0100, 0x6837, 0x0000, 0x680b,
++	0x0040, 0x7bc8, 0xa386, 0xfeff, 0x1128, 0x6817, 0x0100, 0x681f,
++	0x0064, 0x0020, 0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010,
++	0x1f04, 0x1135, 0x8109, 0x1d38, 0x2001, 0x01ff, 0x2004, 0xd0fc,
++	0x1128, 0x8211, 0x0118, 0x2069, 0x6bc0, 0x08d8, 0x080c, 0x22cf,
++	0x080c, 0x4015, 0x080c, 0x1b6d, 0x080c, 0x4553, 0x2091, 0x2200,
++	0x2079, 0x4600, 0x2071, 0x0050, 0x2091, 0x2400, 0x2079, 0x4600,
++	0x2071, 0x0020, 0x2091, 0x2600, 0x2079, 0x0200, 0x2071, 0x4640,
++	0x2091, 0x2800, 0x2079, 0x0100, 0x2071, 0x4680, 0x2091, 0x2000,
++	0x2079, 0x4600, 0x2071, 0x0010, 0x3200, 0xa085, 0x303d, 0x2090,
++	0x2071, 0x0010, 0x70c3, 0x0000, 0x1004, 0x118c, 0x70c0, 0xa086,
++	0x0002, 0x1110, 0x080c, 0x13ba, 0x2039, 0x0000, 0x080c, 0x12ab,
++	0x78ac, 0xa005, 0x1180, 0x0e04, 0x119a, 0x786c, 0xa065, 0x0110,
++	0x080c, 0x207a, 0x080c, 0x1e09, 0x0e04, 0x11af, 0x786c, 0xa065,
++	0x0110, 0x080c, 0x207a, 0x0e04, 0x11af, 0x2009, 0x4647, 0x2011,
++	0x4687, 0x2104, 0x220c, 0xa105, 0x0110, 0x080c, 0x1c7c, 0x2071,
++	0x4640, 0x70a0, 0xa005, 0x01e8, 0x744c, 0xa485, 0x0000, 0x01c8,
++	0x2079, 0x0200, 0x2091, 0x8000, 0x72d0, 0xa28c, 0x303d, 0x2190,
++	0x080c, 0x2720, 0x2091, 0x8000, 0x2091, 0x303d, 0x0e04, 0x11d1,
++	0x2079, 0x4600, 0x786c, 0xa065, 0x0120, 0x2071, 0x0010, 0x080c,
++	0x207a, 0x1d04, 0x11d9, 0x2079, 0x4600, 0x2071, 0x0010, 0x080c,
++	0x4370, 0x2071, 0x4680, 0x70a0, 0xa005, 0x0188, 0x704c, 0xa025,
++	0x0170, 0x2079, 0x0100, 0x2091, 0x8000, 0x72d0, 0xa28c, 0x303d,
++	0x2190, 0x080c, 0x2720, 0x2091, 0x8000, 0x2091, 0x303d, 0x2079,
++	0x4600, 0x2071, 0x0010, 0x0e04, 0x11fa, 0x786c, 0xa065, 0x0110,
++	0x080c, 0x207a, 0x1d04, 0x118e, 0x080c, 0x4370, 0x0804, 0x118e,
++	0x3c00, 0xa084, 0x0007, 0x0002, 0x120c, 0x120c, 0x120e, 0x120e,
++	0x1213, 0x1213, 0x1218, 0x1218, 0x080c, 0x254c, 0x2091, 0x2400,
++	0x080c, 0x40ad, 0x0005, 0x2091, 0x2200, 0x080c, 0x40ad, 0x0005,
++	0x2091, 0x2200, 0x080c, 0x40ad, 0x2091, 0x2400, 0x080c, 0x40ad,
++	0x0005, 0x1241, 0x1241, 0x1242, 0x1242, 0x124d, 0x124d, 0x124d,
++	0x124d, 0x1256, 0x1256, 0x1261, 0x1261, 0x124d, 0x124d, 0x124d,
++	0x124d, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270,
++	0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270,
++	0x1270, 0x0cf8, 0x0006, 0x0106, 0x0126, 0x2091, 0x2800, 0x080c,
++	0x2569, 0x012e, 0x010e, 0x000e, 0x000d, 0x0006, 0x0106, 0x0126,
++	0x080c, 0x1200, 0x012e, 0x010e, 0x000e, 0x000d, 0x0006, 0x0106,
++	0x0126, 0x2091, 0x2600, 0x080c, 0x2569, 0x012e, 0x010e, 0x000e,
++	0x000d, 0x0006, 0x0106, 0x0126, 0x2091, 0x2600, 0x080c, 0x2569,
++	0x2091, 0x2800, 0x080c, 0x2569, 0x012e, 0x010e, 0x000e, 0x000d,
++	0x0006, 0x0106, 0x0126, 0x00d6, 0x00e6, 0x00f6, 0x2079, 0x4600,
++	0x2071, 0x0200, 0x2069, 0x4640, 0x3d00, 0xd08c, 0x0130, 0x70ec,
++	0xa084, 0x1c00, 0x78e2, 0x080c, 0x459a, 0x3d00, 0xd084, 0x0150,
++	0x2069, 0x4680, 0x2071, 0x0100, 0x70ec, 0xa084, 0x1c00, 0x78e6,
++	0x080c, 0x459a, 0x080c, 0x24fd, 0x00fe, 0x00ee, 0x00de, 0x012e,
++	0x010e, 0x000e, 0x000d, 0x7008, 0x800b, 0x1240, 0x7007, 0x0002,
++	0xa08c, 0x01e0, 0x1120, 0xd09c, 0x0108, 0x0887, 0x0897, 0x70c3,
++	0x4002, 0x0804, 0x13bd, 0x0e04, 0x131e, 0x2061, 0x0000, 0x6018,
++	0xd084, 0x1904, 0x131e, 0x7828, 0xa005, 0x1120, 0x0004, 0x131f,
++	0x0804, 0x131e, 0xd0fc, 0x0130, 0x0006, 0x080c, 0x1b0a, 0x000e,
++	0x0150, 0x0028, 0x0006, 0x080c, 0x1aff, 0x000e, 0x0120, 0x2001,
++	0x4007, 0x0804, 0x13bc, 0x7910, 0xd0fc, 0x1128, 0x2061, 0x4640,
++	0xc19c, 0xc7fc, 0x0020, 0x2061, 0x4680, 0xc19d, 0xc7fd, 0x6060,
++	0xa005, 0x1904, 0x131e, 0x7912, 0x607e, 0x7828, 0xc0fc, 0xa086,
++	0x0018, 0x1120, 0x00c6, 0x080c, 0x1916, 0x00ce, 0x782b, 0x0000,
++	0x6078, 0xa065, 0x01e0, 0x00c6, 0x609c, 0x080c, 0x1bd4, 0x00ce,
++	0x609f, 0x0000, 0x080c, 0x1a41, 0x2009, 0x0018, 0x6087, 0x0103,
++	0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff, 0x0110, 0xc0c5, 0x7812,
++	0x080c, 0x1b15, 0x000e, 0x7812, 0x1198, 0x080c, 0x1b60, 0x7810,
++	0xd09c, 0x1118, 0x2061, 0x4640, 0x0020, 0x2061, 0x4680, 0xc09c,
++	0x7812, 0x607b, 0x0000, 0x60d0, 0xd0c4, 0x0130, 0xc0c4, 0x60d2,
++	0x2001, 0x4005, 0x0804, 0x13bc, 0x0804, 0x13ba, 0x0005, 0xa006,
++	0x70c2, 0x70c6, 0x70ca, 0x70ce, 0x70da, 0x70c0, 0xa03d, 0xa08a,
++	0x0040, 0x1a04, 0x136c, 0x0002, 0x13ba, 0x1408, 0x13d6, 0x143c,
++	0x1470, 0x1470, 0x13ce, 0x1a59, 0x147a, 0x13c8, 0x13da, 0x13db,
++	0x13dc, 0x13dd, 0x1a5d, 0x13c8, 0x1487, 0x14db, 0x1931, 0x1a53,
++	0x13de, 0x17ba, 0x17f0, 0x1822, 0x1868, 0x1777, 0x1784, 0x1797,
++	0x17a9, 0x15b0, 0x13c8, 0x150d, 0x1518, 0x1526, 0x1534, 0x154b,
++	0x1559, 0x155c, 0x156a, 0x1578, 0x1582, 0x1596, 0x15a2, 0x13c8,
++	0x13c8, 0x13c8, 0x13c8, 0x15bd, 0x15ce, 0x15e8, 0x161c, 0x1645,
++	0x1657, 0x165a, 0x1685, 0x16be, 0x16d0, 0x1745, 0x1755, 0x13c8,
++	0x13c8, 0x13c8, 0x13c8, 0x1767, 0x2100, 0xa08a, 0x0040, 0x1a04,
++	0x13c8, 0x0002, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x1a7f,
++	0x1a85, 0x13c8, 0x13c8, 0x13c8, 0x1a89, 0x1ac9, 0x13c8, 0x13c8,
++	0x13c8, 0x13c8, 0x1403, 0x146b, 0x1482, 0x14d6, 0x192c, 0x13c8,
++	0x13c8, 0x18fb, 0x13c8, 0x1acd, 0x1a71, 0x1a7b, 0x13c8, 0x13c8,
++	0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8,
++	0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8,
++	0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8,
++	0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8,
++	0x13c8, 0x13c8, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0028, 0x73ce,
++	0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0e04, 0x13bd, 0x2061,
++	0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x0005,
++	0x70c3, 0x4001, 0x0c90, 0x70c3, 0x4006, 0x0c78, 0x2099, 0x0041,
++	0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0c20, 0x70c4, 0x70c3,
++	0x0004, 0x0807, 0x08f8, 0x08f0, 0x08e8, 0x08e0, 0x2091, 0x8000,
++	0x70c3, 0x0004, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020,
++	0x70d3, 0x000a, 0x2001, 0x0004, 0x70d6, 0x2079, 0x0000, 0x781b,
++	0x0001, 0x2031, 0x0030, 0x2059, 0x1000, 0x2029, 0x041a, 0x2051,
++	0x0445, 0x2061, 0x0447, 0x20c1, 0x0020, 0x2091, 0x5000, 0x2091,
++	0x4080, 0x0804, 0x0418, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0018,
++	0x2029, 0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x20a0,
++	0x2099, 0x0030, 0x7003, 0x0001, 0x7007, 0x0006, 0x731a, 0x721e,
++	0x7422, 0x7526, 0x2021, 0x0040, 0x81ff, 0x0904, 0x13ba, 0xa182,
++	0x0040, 0x1210, 0x2120, 0xa006, 0x2008, 0x8403, 0x7012, 0x7007,
++	0x0004, 0x7007, 0x0001, 0x7008, 0xd0fc, 0x0de8, 0x7007, 0x0002,
++	0xa084, 0x01e0, 0x0120, 0x70c3, 0x4002, 0x0804, 0x13bd, 0x24a8,
++	0x53a5, 0x0c10, 0x0804, 0x13ba, 0x2029, 0x0000, 0x2520, 0x71d0,
++	0x72c8, 0x73cc, 0x70c4, 0x2098, 0x20a1, 0x0030, 0x7003, 0x0000,
++	0x7007, 0x0006, 0x731a, 0x721e, 0x7422, 0x7526, 0x2021, 0x0040,
++	0x7007, 0x0006, 0x81ff, 0x0904, 0x13ba, 0xa182, 0x0040, 0x1210,
++	0x2120, 0xa006, 0x2008, 0x8403, 0x7012, 0x24a8, 0x53a6, 0x7007,
++	0x0001, 0x7008, 0xd0fc, 0x0de8, 0xa084, 0x01e0, 0x0d48, 0x70c3,
++	0x4002, 0x0804, 0x13bd, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0878,
++	0x71c4, 0x70c8, 0x2114, 0xa79e, 0x0004, 0x1108, 0x200a, 0x72ca,
++	0x0804, 0x13b9, 0x70c7, 0x000a, 0x70cb, 0x0004, 0x70cf, 0x0020,
++	0x0804, 0x13ba, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0018, 0x2029,
++	0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0, 0x70c6, 0x72ca,
++	0x73ce, 0x74d2, 0xa005, 0x05e8, 0xa40a, 0x0108, 0x1240, 0x8001,
++	0x7872, 0xa084, 0xfc00, 0x0138, 0x78ac, 0xc085, 0x78ae, 0x2001,
++	0x4005, 0x0804, 0x13bc, 0x7b7e, 0x7a7a, 0x7e86, 0x7d82, 0x7c76,
++	0xa48c, 0xff00, 0x0170, 0x8407, 0x8004, 0x8004, 0x810c, 0x810c,
++	0x810f, 0xa118, 0xa291, 0x0000, 0xa6b1, 0x0000, 0xa581, 0x0000,
++	0x0050, 0x8407, 0x8004, 0x8004, 0xa318, 0xa291, 0x0000, 0xa6b1,
++	0x0000, 0xa581, 0x0000, 0x731a, 0x721e, 0x7622, 0x7026, 0xa605,
++	0x0118, 0x7a10, 0xc2c5, 0x7a12, 0x78ac, 0xa084, 0xfffc, 0x78ae,
++	0x0018, 0x78ac, 0xc085, 0x78ae, 0x0804, 0x13ba, 0x75d8, 0x76dc,
++	0x75da, 0x76de, 0x0018, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8,
++	0x73cc, 0x74d4, 0x70c6, 0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0500,
++	0xa40a, 0x0110, 0x1a04, 0x13bc, 0x8001, 0x7892, 0xa084, 0xfc00,
++	0x0138, 0x78ac, 0xc0c5, 0x78ae, 0x2001, 0x4005, 0x0804, 0x13bc,
++	0x7a9a, 0x7b9e, 0x7da2, 0x7ea6, 0x2600, 0xa505, 0x0118, 0x7a10,
++	0xc2c5, 0x7a12, 0x7c96, 0x78ac, 0xa084, 0xfcff, 0x78ae, 0x0018,
++	0x78ac, 0xc0c5, 0x78ae, 0x0804, 0x13ba, 0x2009, 0x0000, 0x786c,
++	0xa065, 0x0118, 0x8108, 0x6000, 0x0cd8, 0x7ac4, 0x0804, 0x13b8,
++	0x2009, 0x4648, 0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904,
++	0x13b9, 0x2011, 0x4688, 0x2214, 0x0804, 0x13b8, 0x2009, 0x4649,
++	0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011,
++	0x4689, 0x2214, 0x0804, 0x13b8, 0x2061, 0x4640, 0x6128, 0x622c,
++	0x8214, 0x8214, 0x8214, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1148,
++	0x2061, 0x4680, 0x6328, 0x73da, 0x632c, 0x831c, 0x831c, 0x831c,
++	0x73de, 0x0804, 0x13b8, 0x2009, 0x464c, 0x210c, 0x2001, 0x01ff,
++	0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011, 0x468c, 0x2214, 0x0804,
++	0x13b8, 0x7918, 0x0804, 0x13b9, 0x2009, 0x0202, 0x210c, 0x2001,
++	0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011, 0x0102, 0x2214,
++	0x0804, 0x13b8, 0x2009, 0x464d, 0x210c, 0x2001, 0x01ff, 0x2004,
++	0xd0fc, 0x1904, 0x13b9, 0x2011, 0x468d, 0x2214, 0x0804, 0x13b8,
++	0x7920, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x7a24,
++	0x0804, 0x13b8, 0x2011, 0x4b40, 0x71c4, 0xd1fc, 0x1110, 0x2011,
++	0x4ac0, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa268,
++	0x6a00, 0x6b08, 0x6c1c, 0x74da, 0x0804, 0x13b7, 0x77c4, 0x080c,
++	0x1b7b, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708,
++	0x0804, 0x13b7, 0x2061, 0x4640, 0x6118, 0x2001, 0x01ff, 0x2004,
++	0xd0fc, 0x1904, 0x13b9, 0x2061, 0x4680, 0x6218, 0x0804, 0x13b8,
++	0x77c4, 0x080c, 0x1b7b, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10,
++	0x77da, 0x2091, 0x8001, 0x0804, 0x13b7, 0x71c4, 0x2110, 0xa294,
++	0x000f, 0xa282, 0x0010, 0x1a04, 0x13b3, 0x080c, 0x238b, 0xa384,
++	0x4000, 0x0110, 0xa295, 0x0020, 0x0804, 0x13b7, 0x71c4, 0x2100,
++	0xc0bc, 0xa082, 0x0010, 0x1a04, 0x13b3, 0xd1bc, 0x1120, 0x2011,
++	0x4648, 0x2204, 0x0020, 0x2011, 0x4688, 0x2204, 0xc0bd, 0x0006,
++	0x2100, 0xc0bc, 0x2012, 0x080c, 0x2331, 0x001e, 0x0804, 0x13b9,
++	0x71c4, 0x2021, 0x4649, 0x2404, 0x70c6, 0x2019, 0x0000, 0x0030,
++	0x71c8, 0x2021, 0x4689, 0x2404, 0x70ca, 0xc3fd, 0x2011, 0x1614,
++	0x20a9, 0x0008, 0x2204, 0xa106, 0x0138, 0x8210, 0x1f04, 0x15fa,
++	0x71c4, 0x72c8, 0x0804, 0x13b2, 0xa292, 0x1614, 0x0026, 0x2122,
++	0x001e, 0x080c, 0x2343, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1110,
++	0xd3fc, 0x09f0, 0x0804, 0x13ba, 0x03e8, 0x00fa, 0x01f4, 0x02ee,
++	0x0004, 0x0001, 0x0002, 0x0003, 0x2061, 0x4640, 0x6128, 0x622c,
++	0x8214, 0x8214, 0x8214, 0x70c4, 0x602a, 0x70c8, 0x8003, 0x8003,
++	0x8003, 0x602e, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x11a0, 0x0026,
++	0x0016, 0x2061, 0x4680, 0x6128, 0x622c, 0x8214, 0x8214, 0x8214,
++	0x70d8, 0x602a, 0x70dc, 0x8003, 0x8003, 0x8003, 0x602e, 0x71da,
++	0x72de, 0x001e, 0x002e, 0x0804, 0x13b8, 0x2061, 0x4640, 0x6130,
++	0x70c4, 0x6032, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9,
++	0x2061, 0x4680, 0x6230, 0x70c8, 0x6032, 0x0804, 0x13b8, 0x7918,
++	0x0804, 0x13b9, 0x71c4, 0xa184, 0xf0cf, 0x0148, 0x2001, 0x01ff,
++	0x2004, 0xd0fc, 0x1904, 0x13b3, 0x72c8, 0x0804, 0x13b2, 0x0006,
++	0x2019, 0x0000, 0x080c, 0x237f, 0x2001, 0x01ff, 0x2004, 0xd0fc,
++	0x0118, 0x001e, 0x0804, 0x13b9, 0x71c8, 0xa184, 0xf0cf, 0x0128,
++	0x0006, 0x2110, 0x71c4, 0x0804, 0x13b2, 0x0006, 0xc3fd, 0x080c,
++	0x237f, 0x002e, 0x001e, 0x0804, 0x13b8, 0x71c4, 0xa182, 0x0010,
++	0x0248, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b3, 0x72c8,
++	0x0804, 0x13b2, 0x2011, 0x464d, 0x2204, 0x0006, 0x8104, 0x1208,
++	0x8108, 0x2112, 0x2019, 0x0000, 0x080c, 0x236c, 0x2001, 0x01ff,
++	0x2004, 0xd0fc, 0x0118, 0x001e, 0x0804, 0x13b9, 0x71c8, 0xa182,
++	0x0010, 0x0228, 0x0006, 0x2110, 0x71c4, 0x0804, 0x13b2, 0x2011,
++	0x468d, 0x2204, 0x0006, 0x8104, 0x1208, 0x8108, 0x2112, 0xc3fd,
++	0x080c, 0x236c, 0x002e, 0x001e, 0x0804, 0x13b8, 0x71c4, 0x72c8,
++	0xa184, 0xfffd, 0x1904, 0x13b2, 0xa284, 0xfffd, 0x1904, 0x13b2,
++	0x2100, 0x7920, 0x7822, 0x2200, 0x7a24, 0x7826, 0x0804, 0x13b8,
++	0x2011, 0x4b40, 0x71c4, 0xd1fc, 0x1110, 0x2011, 0x4ac0, 0x8107,
++	0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa268, 0x72c8, 0x73cc,
++	0x74d8, 0x71c6, 0x6800, 0x70ca, 0x73ce, 0x74da, 0x2091, 0x8000,
++	0x6a02, 0xd2ac, 0x1118, 0x2021, 0x0000, 0x0090, 0xa484, 0x00ff,
++	0xa082, 0x0002, 0x1a04, 0x1741, 0x843f, 0xa7bc, 0x00ff, 0x0140,
++	0xa786, 0x0002, 0x1904, 0x1741, 0xa484, 0x00ff, 0x0904, 0x1741,
++	0x2061, 0x0200, 0xd1fc, 0x0110, 0x2061, 0x0100, 0x2029, 0x0009,
++	0x2031, 0x0062, 0x843f, 0xa7bc, 0x00ff, 0x0130, 0x8307, 0xa084,
++	0x00ff, 0x1110, 0xa73d, 0x1138, 0x2041, 0x0019, 0xa384, 0x00ff,
++	0xa082, 0x001a, 0x0210, 0xa4a4, 0x00ff, 0x8307, 0xa084, 0x00ff,
++	0x0188, 0xa842, 0x02f0, 0xa086, 0x0010, 0x1120, 0xa39c, 0x00ff,
++	0xa39d, 0x0f00, 0xa3bc, 0x00ff, 0x2500, 0xa702, 0x0290, 0x2600,
++	0xa702, 0x1278, 0x2039, 0x003a, 0x6804, 0xa705, 0x6806, 0x6b0a,
++	0x6b0c, 0x73ce, 0x681c, 0x70da, 0x6c1e, 0x2091, 0x8001, 0x0804,
++	0x13ba, 0x2091, 0x8001, 0x0804, 0x13b4, 0x77c4, 0x080c, 0x1b7b,
++	0x2091, 0x8000, 0x6a14, 0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816,
++	0x70cc, 0x681e, 0x2708, 0x0804, 0x13b7, 0x70c4, 0x2061, 0x4640,
++	0x6118, 0x601a, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9,
++	0x70c8, 0x2061, 0x4680, 0x6218, 0x601a, 0x0804, 0x13b8, 0x71c4,
++	0x72c8, 0x73cc, 0xa182, 0x0010, 0x1a04, 0x13b3, 0x080c, 0x23af,
++	0xa384, 0x4000, 0x0110, 0xa295, 0x0020, 0x0804, 0x13b7, 0x77c4,
++	0x080c, 0x1b7b, 0x2091, 0x8000, 0x6a08, 0xc28d, 0x6a0a, 0x2091,
++	0x8001, 0x2708, 0x0804, 0x13b8, 0x77c4, 0x080c, 0x1b7b, 0x2091,
++	0x8000, 0x6a08, 0xa294, 0xfff9, 0x6a0a, 0x6804, 0xa005, 0x0110,
++	0x080c, 0x22ae, 0x2091, 0x8001, 0x2708, 0x0804, 0x13b8, 0x77c4,
++	0x080c, 0x1b7b, 0x2091, 0x8000, 0x6a08, 0xc295, 0x6a0a, 0x6804,
++	0xa005, 0x0110, 0x080c, 0x22ae, 0x2091, 0x8001, 0x2708, 0x0804,
++	0x13b8, 0x77c4, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020,
++	0x2091, 0x8000, 0x080c, 0x1b93, 0x2091, 0x8001, 0x2708, 0x6a08,
++	0x0804, 0x13b8, 0x77c4, 0xd7fc, 0x0128, 0x080c, 0x1b0a, 0x0138,
++	0x0804, 0x13bc, 0x080c, 0x1aff, 0x0110, 0x0804, 0x13bc, 0x73c8,
++	0x72cc, 0x77c6, 0x73ca, 0x72ce, 0x080c, 0x1c0b, 0x11e8, 0x6818,
++	0xa005, 0x01a0, 0x2708, 0x0076, 0x080c, 0x23ce, 0x007e, 0x1170,
++	0x2001, 0x0015, 0xd7fc, 0x1118, 0x2061, 0x4640, 0x0018, 0xc0fd,
++	0x2061, 0x4680, 0x782a, 0x2091, 0x8001, 0x0005, 0x2091, 0x8001,
++	0x2001, 0x4005, 0x0804, 0x13bc, 0x2091, 0x8001, 0x0804, 0x13ba,
++	0x77c4, 0xd7fc, 0x0128, 0x080c, 0x1b0a, 0x0138, 0x0804, 0x13bc,
++	0x080c, 0x1aff, 0x0110, 0x0804, 0x13bc, 0x77c6, 0x2041, 0x0021,
++	0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x080c, 0x1b93,
++	0x2009, 0x0016, 0xd7fc, 0x1118, 0x2061, 0x4640, 0x0018, 0x2061,
++	0x4680, 0xc1fd, 0x6063, 0x0003, 0x607b, 0x0000, 0x6772, 0x607f,
++	0x000f, 0x792a, 0x61d0, 0xc1c4, 0x61d2, 0x080c, 0x22ae, 0x2091,
++	0x8001, 0x0005, 0x77c8, 0x77ca, 0x77c4, 0x77c6, 0xd7fc, 0x0128,
++	0x080c, 0x1b0a, 0x0138, 0x0804, 0x13bc, 0x080c, 0x1aff, 0x0110,
++	0x0804, 0x13bc, 0xa7bc, 0xff00, 0x2091, 0x8000, 0x2009, 0x0017,
++	0xd7fc, 0x1118, 0x2061, 0x4640, 0x0018, 0x2061, 0x4680, 0xc1fd,
++	0x607b, 0x0000, 0x6063, 0x0002, 0x6772, 0x607f, 0x000f, 0x792a,
++	0x61d0, 0xc1c4, 0x61d2, 0x080c, 0x22ae, 0x2091, 0x8001, 0x2041,
++	0x0021, 0x2049, 0x0005, 0x2051, 0x0030, 0x2091, 0x8000, 0x70c8,
++	0xa005, 0x0118, 0x60d0, 0xc0fd, 0x60d2, 0x080c, 0x1b93, 0x70c8,
++	0x6836, 0x8738, 0xa784, 0x001f, 0x1dc0, 0x2091, 0x8001, 0x0005,
++	0x2019, 0x0000, 0x72c8, 0xd284, 0x0128, 0x080c, 0x1b0a, 0x0138,
++	0x0804, 0x13bc, 0x080c, 0x1aff, 0x0110, 0x0804, 0x13bc, 0x72c8,
++	0x72ca, 0x78ac, 0xa084, 0x0003, 0x1508, 0x2039, 0x0000, 0xd284,
++	0x0108, 0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008,
++	0x080c, 0x1b7b, 0x2091, 0x8000, 0x6808, 0xc0d4, 0xa80d, 0x690a,
++	0x2091, 0x8001, 0x8738, 0xa784, 0x001f, 0x1d90, 0xa7bc, 0xff00,
++	0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x1d50, 0x2091, 0x8000,
++	0x72c8, 0x2069, 0x0100, 0xd284, 0x1110, 0x2069, 0x0200, 0x6808,
++	0xa084, 0xfffd, 0x680a, 0x6830, 0xd0b4, 0x01b0, 0x684b, 0x0004,
++	0x20a9, 0x0014, 0x6848, 0xd094, 0x0110, 0x1f04, 0x18b2, 0x684b,
++	0x0009, 0x20a9, 0x0014, 0x6848, 0xd084, 0x0110, 0x1f04, 0x18bb,
++	0x20a9, 0x00fa, 0x1f04, 0x18c2, 0x2079, 0x4600, 0x2009, 0x0018,
++	0x72c8, 0xd284, 0x1118, 0x2061, 0x4640, 0x0018, 0x2061, 0x4680,
++	0xc1fd, 0x607b, 0x0000, 0x792a, 0x6063, 0x0001, 0x607f, 0x000f,
++	0x60a3, 0x0000, 0x60a4, 0x60ae, 0x60b2, 0x60d0, 0xd0b4, 0x0160,
++	0xc0b4, 0x60d2, 0x00c6, 0x60b4, 0xa065, 0x6008, 0xc0d4, 0x600a,
++	0x6018, 0x8001, 0x601a, 0x00ce, 0x60d0, 0xa084, 0x7eff, 0x60d2,
++	0x78ac, 0xc08d, 0x78ae, 0x83ff, 0x0108, 0x0005, 0x681b, 0x0054,
++	0x2091, 0x8001, 0x0005, 0x73cc, 0x080c, 0x186a, 0x69ec, 0x6a48,
++	0xa185, 0x1800, 0x684a, 0xa185, 0x0040, 0x68ee, 0x73cc, 0x2021,
++	0x0004, 0x20a9, 0x09ff, 0x1f04, 0x190b, 0x8421, 0x1dd0, 0x8319,
++	0x1db0, 0x69ee, 0x6a4a, 0x2091, 0x8001, 0x0005, 0xd7fc, 0x1118,
++	0x2069, 0x4640, 0x0010, 0x2069, 0x4680, 0x71c4, 0x71c6, 0x6916,
++	0x81ff, 0x1110, 0x68a3, 0x0001, 0x78ac, 0xc08c, 0x78ae, 0xd084,
++	0x1110, 0x080c, 0x1c5b, 0x0005, 0x75d8, 0x74dc, 0x75da, 0x74de,
++	0x0010, 0xa02e, 0x2520, 0x71c4, 0x73c8, 0x72cc, 0x71c6, 0x73ca,
++	0x72ce, 0x2079, 0x4600, 0x7dde, 0x7cda, 0x7bd6, 0x7ad2, 0x080c,
++	0x1b58, 0x0904, 0x1a3d, 0x20a9, 0x0005, 0x20a1, 0x4614, 0x2091,
++	0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0040, 0x080c, 0x1d24,
++	0x0120, 0x080c, 0x1b60, 0x0804, 0x1a3d, 0x6004, 0xa08c, 0x00ff,
++	0xa18e, 0x0009, 0x1120, 0x0006, 0x080c, 0x205f, 0x000e, 0xa084,
++	0xff00, 0x8007, 0x8009, 0x0904, 0x19e1, 0x00c6, 0x2c68, 0x080c,
++	0x1b58, 0x05a8, 0x2c00, 0x689e, 0x8109, 0x1dc0, 0x609f, 0x0000,
++	0x00ce, 0x00c6, 0x7ddc, 0x7cd8, 0x7bd4, 0x7ad0, 0xa290, 0x0040,
++	0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x7dde, 0x7cda,
++	0x7bd6, 0x7ad2, 0x2c68, 0x689c, 0xa065, 0x0904, 0x19e0, 0x2009,
++	0x0040, 0x080c, 0x1d24, 0x15a0, 0x6004, 0xa084, 0x00ff, 0xa086,
++	0x0002, 0x1168, 0x6004, 0xa084, 0x00ff, 0xa086, 0x000a, 0x1120,
++	0x0016, 0x080c, 0x205c, 0x001e, 0x2d00, 0x6002, 0x0898, 0x00ce,
++	0x00c6, 0x609c, 0x080c, 0x1bd4, 0x00ce, 0x609f, 0x0000, 0x080c,
++	0x1a41, 0x2009, 0x0018, 0x6008, 0xc0cd, 0x600a, 0x6004, 0x6086,
++	0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff, 0x0110, 0xc0c5, 0x7812,
++	0x080c, 0x1b15, 0x000e, 0x7812, 0x080c, 0x1b60, 0x0804, 0x1a3d,
++	0x00ce, 0x00c6, 0x609c, 0x080c, 0x1bd4, 0x00ce, 0x609f, 0x0000,
++	0x080c, 0x1a41, 0x2009, 0x0018, 0x6087, 0x0103, 0x601b, 0x0003,
++	0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff, 0x0110, 0xc0c5, 0x7812,
++	0x080c, 0x1b15, 0x000e, 0x7812, 0x080c, 0x1b60, 0x0804, 0x1a3d,
++	0x00ce, 0x6114, 0xd1fc, 0x0120, 0x080c, 0x1b0a, 0x01f0, 0x0018,
++	0x080c, 0x1aff, 0x01d0, 0x080c, 0x1a41, 0x2009, 0x0018, 0x6087,
++	0x0103, 0x601b, 0x0021, 0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff,
++	0x0110, 0xc0c5, 0x7812, 0x080c, 0x1b15, 0x000e, 0x7812, 0x080c,
++	0x1b60, 0x2001, 0x4007, 0x0804, 0x13bc, 0x74c4, 0x73c8, 0x72cc,
++	0x6014, 0x2091, 0x8000, 0x00e6, 0x2009, 0x0012, 0xd0fc, 0x1118,
++	0x2071, 0x4640, 0x0018, 0x2071, 0x4680, 0xc1fd, 0x792a, 0x7063,
++	0x0005, 0x71d0, 0xc1c4, 0x71d2, 0x7366, 0x726a, 0x746e, 0x7072,
++	0x7077, 0x0000, 0x2c00, 0x707a, 0xa02e, 0x2530, 0x611c, 0xa184,
++	0x0060, 0x0110, 0x080c, 0x3fc1, 0x00ee, 0x6596, 0x65a6, 0x669a,
++	0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x6714, 0x6023, 0x0000,
++	0x080c, 0x22ae, 0x2091, 0x8001, 0x0005, 0x70c3, 0x4005, 0x0804,
++	0x13bd, 0x20a9, 0x0005, 0x2099, 0x4614, 0x2091, 0x8000, 0x530a,
++	0x2091, 0x8001, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000,
++	0xa5a9, 0x0000, 0x0005, 0x71c4, 0x70c7, 0x0000, 0x791e, 0x0804,
++	0x13ba, 0x71c4, 0x71c6, 0x2168, 0x0010, 0x2069, 0x1000, 0x690c,
++	0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x1dd8, 0xa285, 0x0000,
++	0x1118, 0x70c3, 0x4000, 0x0010, 0x70c3, 0x4003, 0x70ca, 0x0804,
++	0x13bd, 0x7964, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x1a04, 0x13b3,
++	0x7966, 0x0804, 0x13ba, 0x7964, 0x71c6, 0x0804, 0x13ba, 0x7900,
++	0x71c6, 0x71c4, 0x7902, 0x0804, 0x13ba, 0x7900, 0x71c6, 0x0804,
++	0x13ba, 0x70c4, 0x2011, 0x0000, 0xa08c, 0x000d, 0x0160, 0x810c,
++	0x0230, 0x8210, 0x810c, 0x810c, 0x0210, 0x8210, 0x810c, 0x81ff,
++	0x1904, 0x13b4, 0x8210, 0x7a0e, 0xd28c, 0x0538, 0x7910, 0xc1cd,
++	0x7912, 0x2009, 0x0021, 0x2019, 0x0003, 0xd284, 0x01c0, 0x8108,
++	0x2019, 0x0041, 0x2011, 0x8e4e, 0x2312, 0x2019, 0x0042, 0x8210,
++	0x2312, 0x2019, 0x0043, 0x8210, 0x2312, 0x2019, 0x0046, 0x8210,
++	0x2312, 0x2019, 0x0047, 0x8210, 0x2312, 0x2019, 0x0006, 0x2011,
++	0x8e53, 0x2112, 0x2011, 0x8e73, 0x2312, 0x7904, 0x7806, 0x0804,
++	0x13b9, 0x7804, 0x70c6, 0x0804, 0x13ba, 0x71c4, 0xd1fc, 0x1118,
++	0x2011, 0x4ac0, 0x0010, 0x2011, 0x4b40, 0x8107, 0xa084, 0x000f,
++	0x8003, 0x8003, 0x8003, 0xa268, 0x2011, 0x0000, 0x6814, 0xd0fc,
++	0x0110, 0xa295, 0x0200, 0xd0b4, 0x0110, 0xa295, 0x0001, 0x6b0c,
++	0x6800, 0x70da, 0x0804, 0x13b7, 0x7814, 0xd0f4, 0x0130, 0x2001,
++	0x4007, 0x70db, 0x0000, 0xa005, 0x0048, 0xd0fc, 0x0130, 0x2001,
++	0x4007, 0x70db, 0x0001, 0xa005, 0x0008, 0xa006, 0x0005, 0x7814,
++	0xd0f4, 0x0130, 0x2001, 0x4007, 0x70db, 0x0000, 0xa005, 0x0008,
++	0xa006, 0x0005, 0x7814, 0xd0fc, 0x0130, 0x2001, 0x4007, 0x70db,
++	0x0001, 0xa005, 0x0008, 0xa006, 0x0005, 0x7112, 0x721a, 0x731e,
++	0x7810, 0xd0c4, 0x0110, 0x7422, 0x7526, 0xac80, 0x0001, 0x8108,
++	0x810c, 0x81a9, 0x8098, 0x20a1, 0x0030, 0x7003, 0x0000, 0x6084,
++	0x20a2, 0x53a6, 0x7007, 0x0001, 0x7974, 0xa184, 0xff00, 0x0140,
++	0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0018,
++	0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, 0xa006, 0xa211,
++	0x7d10, 0xd5c4, 0x0120, 0x7b84, 0xa319, 0x7c80, 0xa421, 0x7008,
++	0xd0fc, 0x0de8, 0x7003, 0x0001, 0x7007, 0x0006, 0x711a, 0x721e,
++	0x7d10, 0xd5c4, 0x0110, 0x7322, 0x7426, 0xa084, 0x01e0, 0x0005,
++	0x7848, 0xa065, 0x0120, 0x2c04, 0x784a, 0x2063, 0x0000, 0x0005,
++	0x00f6, 0x2079, 0x4600, 0x7848, 0x2062, 0x2c00, 0xa005, 0x1110,
++	0x080c, 0x254c, 0x784a, 0x00fe, 0x0005, 0x2011, 0x9000, 0x7a4a,
++	0x7bc4, 0x8319, 0x0128, 0xa280, 0x0032, 0x2012, 0x2010, 0x0cc8,
++	0x2013, 0x0000, 0x0005, 0x0016, 0x0026, 0xd7fc, 0x1118, 0x2011,
++	0x4bc0, 0x0010, 0x2011, 0x6bc0, 0xa784, 0x0f00, 0x800b, 0xa784,
++	0x001f, 0x0120, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa268,
++	0x002e, 0x001e, 0x0005, 0x0c39, 0x2900, 0x682a, 0x2a00, 0x682e,
++	0x6808, 0xa084, 0xf9ef, 0xa80d, 0x690a, 0x00e6, 0xd7fc, 0x1128,
++	0x2009, 0x4652, 0x2071, 0x4640, 0x0020, 0x2009, 0x4692, 0x2071,
++	0x4680, 0x210c, 0x6804, 0xa005, 0x0148, 0xa116, 0x1138, 0x2060,
++	0x6000, 0x6806, 0x0016, 0x200b, 0x0000, 0x0018, 0x2009, 0x0000,
++	0x0016, 0x6804, 0xa065, 0x0178, 0x6000, 0x6806, 0x0421, 0x080c,
++	0x1d95, 0x6810, 0x7908, 0x8109, 0x790a, 0x8001, 0x6812, 0x1d88,
++	0x7910, 0xc1a5, 0x7912, 0x001e, 0x6902, 0x6906, 0x2d00, 0x2060,
++	0x080c, 0x2693, 0x00ee, 0x0005, 0xa065, 0x0160, 0x2008, 0x609c,
++	0xa005, 0x0128, 0x2062, 0x609f, 0x0000, 0xa065, 0x0cc0, 0x7848,
++	0x794a, 0x2062, 0x0005, 0x6007, 0x0103, 0x608f, 0x0000, 0x20a9,
++	0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828,
++	0x601a, 0x682c, 0x6022, 0x0005, 0x00e6, 0xd7fc, 0x1128, 0x2071,
++	0x4640, 0x2031, 0x46c0, 0x0020, 0x2071, 0x4680, 0x2031, 0x48c0,
++	0x704c, 0xa08c, 0x0200, 0x1128, 0xa608, 0x2d0a, 0x8000, 0x704e,
++	0xa006, 0x00ee, 0x0005, 0x00f6, 0xd7fc, 0x1118, 0x2079, 0x4640,
++	0x0010, 0x2079, 0x4680, 0x080c, 0x1b7b, 0x2091, 0x8000, 0x6804,
++	0x780a, 0xa065, 0x05f0, 0x0030, 0x2c00, 0x780a, 0x2060, 0x6000,
++	0xa065, 0x05b8, 0x6010, 0xa306, 0x1db8, 0x600c, 0xa206, 0x1da0,
++	0x2c28, 0x7848, 0xac06, 0x1108, 0x0448, 0x6804, 0xac06, 0x1140,
++	0x6000, 0x2060, 0x6806, 0xa005, 0x1118, 0x6803, 0x0000, 0x0048,
++	0x6400, 0x7808, 0x2060, 0x6402, 0xa486, 0x0000, 0x1110, 0x2c00,
++	0x6802, 0x2560, 0x080c, 0x1be3, 0x601b, 0x0005, 0x6023, 0x0020,
++	0x00fe, 0x080c, 0x1d95, 0x00f6, 0x7908, 0x8109, 0x790a, 0x6810,
++	0x8001, 0x6812, 0x1118, 0x7810, 0xc0a5, 0x7812, 0x2001, 0xffff,
++	0xa005, 0x00fe, 0x0005, 0x0076, 0x2700, 0x2039, 0x0000, 0xd0fc,
++	0x0108, 0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008,
++	0x2091, 0x8000, 0x080c, 0x1b93, 0x8738, 0xa784, 0x001f, 0x1dd0,
++	0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x1d90,
++	0x2091, 0x8001, 0x007e, 0x0005, 0x786c, 0x2009, 0x8e74, 0x210c,
++	0xa10d, 0x0118, 0xa065, 0x0804, 0x207a, 0x2061, 0x0000, 0x6018,
++	0xd084, 0x11b8, 0x7810, 0xd08c, 0x0130, 0xc08c, 0x7812, 0xc7fc,
++	0x2069, 0x4640, 0x0028, 0xc08d, 0x7812, 0x2069, 0x4680, 0xc7fd,
++	0x2091, 0x8000, 0x681c, 0x681f, 0x0000, 0x2091, 0x8001, 0xa005,
++	0x1108, 0x0005, 0xa08c, 0xfff0, 0x0110, 0x080c, 0x254c, 0x0002,
++	0x1cb8, 0x1cbb, 0x1cc1, 0x1cc5, 0x1cb9, 0x1cc9, 0x1cb9, 0x1cb9,
++	0x1cb9, 0x1ccf, 0x1cfb, 0x1cfe, 0x1d03, 0x1d0c, 0x1cb9, 0x1cb9,
++	0x0005, 0x080c, 0x254c, 0x080c, 0x1c5b, 0x2001, 0x8001, 0x0804,
++	0x1d15, 0x2001, 0x8003, 0x0804, 0x1d15, 0x2001, 0x8004, 0x0804,
++	0x1d15, 0x080c, 0x1c5b, 0x2001, 0x8006, 0x0804, 0x1d15, 0x2091,
++	0x8000, 0x0076, 0xd7fc, 0x1128, 0x2069, 0x4640, 0x2039, 0x0009,
++	0x0020, 0x2069, 0x4680, 0x2039, 0x0009, 0x6800, 0xa086, 0x0000,
++	0x0128, 0x000e, 0x6f1e, 0x2091, 0x8001, 0x0005, 0x6870, 0x007e,
++	0xa0bc, 0xff00, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010,
++	0x080c, 0x1b93, 0x8738, 0xa784, 0x001f, 0x1dd0, 0x2091, 0x8001,
++	0x2001, 0x800a, 0x00d0, 0x2001, 0x800c, 0x00b8, 0x080c, 0x1c5b,
++	0x2001, 0x800d, 0x0090, 0xd7fc, 0x0110, 0x78e4, 0x0008, 0x78e0,
++	0x70c6, 0x2001, 0x800e, 0x0048, 0xd7fc, 0x0110, 0x78ec, 0x0008,
++	0x78e8, 0x70c6, 0x2001, 0x800f, 0x0000, 0x70c2, 0xd7fc, 0x1118,
++	0x70db, 0x0000, 0x0010, 0x70db, 0x0001, 0x2061, 0x0000, 0x601b,
++	0x0001, 0x2091, 0x4080, 0x0005, 0xac80, 0x0001, 0x81ff, 0x0518,
++	0x2099, 0x0030, 0x20a0, 0x700c, 0xa084, 0x07ff, 0x0100, 0x7018,
++	0x0006, 0x701c, 0x0006, 0x7020, 0x0006, 0x7024, 0x0006, 0x7112,
++	0x81ac, 0x721a, 0x731e, 0x7422, 0x7526, 0x7003, 0x0001, 0x7007,
++	0x0001, 0x7008, 0x800b, 0x1ee8, 0x7007, 0x0002, 0xa08c, 0x01e0,
++	0x1110, 0x53a5, 0xa006, 0x7003, 0x0000, 0x7007, 0x0004, 0x000e,
++	0x7026, 0x000e, 0x7022, 0x000e, 0x701e, 0x000e, 0x701a, 0x0005,
++	0x2011, 0x0020, 0x2009, 0x0010, 0x6b0a, 0x6c0e, 0x681f, 0x0201,
++	0x6803, 0xfd20, 0x6807, 0x0038, 0x6a1a, 0x2d00, 0xa0e8, 0x0008,
++	0xa290, 0x0004, 0x8109, 0x1d80, 0x0005, 0x70ec, 0xd0dc, 0x1520,
++	0x2029, 0x0001, 0x7814, 0xd0cc, 0x1160, 0x70ec, 0xd0e4, 0x2019,
++	0x0c0a, 0x2021, 0x000a, 0x1120, 0x2019, 0x0c0c, 0x2021, 0x000c,
++	0x0070, 0x70ec, 0xd0e4, 0x1128, 0x2019, 0x180c, 0x2021, 0x000c,
++	0x0030, 0x2019, 0x1809, 0x2021, 0x0009, 0xa5ad, 0x0200, 0x6b0a,
++	0x6c0e, 0x6d1e, 0x6807, 0x0038, 0x0005, 0x6004, 0x6086, 0x2c08,
++	0x2063, 0x0000, 0x7868, 0xa005, 0x796a, 0x0110, 0x2c02, 0x0008,
++	0x796e, 0x0005, 0x00c6, 0x2061, 0x4600, 0x6887, 0x0103, 0x2d08,
++	0x206b, 0x0000, 0x6068, 0xa005, 0x616a, 0x0110, 0x2d02, 0x0008,
++	0x616e, 0x00ce, 0x0005, 0x2091, 0x8000, 0x2c04, 0x786e, 0xa005,
++	0x1108, 0x786a, 0x2091, 0x8001, 0x609c, 0xa005, 0x0188, 0x00c6,
++	0x2060, 0x2008, 0x609c, 0xa005, 0x0138, 0x2062, 0x609f, 0x0000,
++	0xa065, 0x609c, 0xa005, 0x1dc8, 0x7848, 0x794a, 0x2062, 0x00ce,
++	0x7848, 0x2062, 0x609f, 0x0000, 0xac85, 0x0000, 0x1110, 0x080c,
++	0x254c, 0x784a, 0x0005, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086,
++	0x818e, 0x1208, 0xa200, 0x1f04, 0x1ddf, 0x8086, 0x818e, 0x0005,
++	0x0156, 0x20a9, 0x0010, 0xa005, 0x01b8, 0xa11a, 0x12a8, 0x8213,
++	0x818d, 0x0228, 0xa11a, 0x1220, 0x1f04, 0x1def, 0x0028, 0xa11a,
++	0x2308, 0x8210, 0x1f04, 0x1def, 0x0006, 0x3200, 0xa084, 0xefff,
++	0x2080, 0x000e, 0x015e, 0x0005, 0x0006, 0x3200, 0xa085, 0x1000,
++	0x0cb8, 0x7d74, 0x70d0, 0xa506, 0x0904, 0x1ebd, 0x7810, 0x2050,
++	0x080c, 0x1b58, 0x0904, 0x1ebd, 0xa046, 0x7970, 0x2500, 0x8000,
++	0xa112, 0x2009, 0x0040, 0x1208, 0x0030, 0x72d0, 0xa206, 0x0118,
++	0x8840, 0x2009, 0x0080, 0x00c6, 0x7112, 0x7007, 0x0001, 0x2099,
++	0x0030, 0x20a9, 0x0020, 0xac80, 0x0001, 0x20a0, 0x2061, 0x0000,
++	0x88ff, 0x0110, 0x080c, 0x1b58, 0x7008, 0xd0fc, 0x0de8, 0x7007,
++	0x0002, 0x2091, 0x8001, 0xa08c, 0x01e0, 0x1538, 0x53a5, 0x8cff,
++	0x1120, 0x88ff, 0x0904, 0x1eaa, 0x0050, 0x2c00, 0x788e, 0x20a9,
++	0x0020, 0xac80, 0x0001, 0x20a0, 0x53a5, 0x0804, 0x1eaa, 0xa046,
++	0x7218, 0x731c, 0xdac4, 0x0110, 0x7420, 0x7524, 0xa292, 0x0040,
++	0xa39b, 0x0000, 0xa4a3, 0x0000, 0xa5ab, 0x0000, 0x721a, 0x731e,
++	0xdac4, 0x0118, 0x7422, 0x7526, 0xa006, 0x7007, 0x0004, 0x0904,
++	0x1eaa, 0x8cff, 0x0110, 0x080c, 0x1b60, 0x00ce, 0x080c, 0x1b60,
++	0xa046, 0x7888, 0x8000, 0x788a, 0xa086, 0x0002, 0x01c0, 0x7a7c,
++	0x7b78, 0xdac4, 0x0110, 0x7c84, 0x7d80, 0x7974, 0x8107, 0x8004,
++	0x8004, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000,
++	0x721a, 0x731e, 0xdac4, 0x0588, 0x7422, 0x7526, 0x0470, 0x6014,
++	0xd0fc, 0x1118, 0x2069, 0x4640, 0x0010, 0x2069, 0x4680, 0x2091,
++	0x8000, 0x681f, 0x0002, 0x88ff, 0x0120, 0xa046, 0x788c, 0x2060,
++	0x0c70, 0x788b, 0x0000, 0x78ac, 0xa085, 0x0003, 0x78ae, 0x2091,
++	0x8001, 0x0098, 0x00ce, 0x788b, 0x0000, 0x080c, 0x2035, 0x6004,
++	0xa084, 0x000f, 0x0059, 0x88ff, 0x0130, 0x788c, 0x2060, 0x6004,
++	0xa084, 0x000f, 0x0019, 0x0804, 0x1e09, 0x0005, 0x0002, 0x1ecf,
++	0x1eea, 0x1f03, 0x1ecf, 0x1f10, 0x1ee0, 0x1ecf, 0x1ecf, 0x1ecf,
++	0x1ee8, 0x1f01, 0x1ecf, 0x1ecf, 0x1ecf, 0x1ecf, 0x1ecf, 0x2039,
++	0x0400, 0x78bc, 0xa705, 0x78be, 0x6008, 0xa705, 0x600a, 0x080c,
++	0x1f4c, 0x609c, 0x78ba, 0x609f, 0x0000, 0x080c, 0x2021, 0x0005,
++	0x78bc, 0xd0c4, 0x0108, 0x0c58, 0x601c, 0xc0bd, 0x601e, 0x0030,
++	0x080c, 0x205f, 0x78bc, 0xd0c4, 0x0108, 0x0c08, 0x78bf, 0x0000,
++	0x6004, 0x8007, 0xa084, 0x00ff, 0x78b2, 0x8001, 0x0138, 0x080c,
++	0x1f4c, 0x0120, 0x78bc, 0xc0c5, 0x78be, 0x0010, 0x0804, 0x1f67,
++	0x0005, 0x080c, 0x205c, 0x78bc, 0xa08c, 0x0e00, 0x1110, 0xd0c4,
++	0x1108, 0x0828, 0x080c, 0x1f4c, 0x1110, 0x0804, 0x1f67, 0x0005,
++	0x78bc, 0xd0c4, 0x0110, 0x0804, 0x1ecf, 0x78bf, 0x0000, 0x6714,
++	0x2011, 0x0001, 0x22a8, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0188,
++	0xa7bc, 0xff00, 0x20a9, 0x0020, 0xa08e, 0x0001, 0x0150, 0xa7bc,
++	0x8000, 0x2011, 0x0002, 0x20a9, 0x0100, 0xa08e, 0x0002, 0x0108,
++	0x00c0, 0x080c, 0x1b7b, 0x2d00, 0x2091, 0x8000, 0x682b, 0x0000,
++	0x682f, 0x0000, 0x6808, 0xa084, 0xffde, 0x680a, 0xade8, 0x0010,
++	0x2091, 0x8001, 0x1f04, 0x1f34, 0x8211, 0x0118, 0x20a9, 0x0100,
++	0x0c58, 0x080c, 0x1b60, 0x0005, 0x609f, 0x0000, 0x78b4, 0xa06d,
++	0x2c00, 0x78b6, 0x1110, 0x78ba, 0x0038, 0x689e, 0x2d00, 0x6002,
++	0x78b8, 0xad06, 0x1108, 0x6002, 0x78b0, 0x8001, 0x78b2, 0x1130,
++	0x78bc, 0xc0c4, 0x78be, 0x78b8, 0x2060, 0xa006, 0x0005, 0x00e6,
++	0xa02e, 0x2530, 0x7dba, 0x7db6, 0x65ae, 0x65b2, 0x601c, 0x60a2,
++	0x2048, 0xa984, 0xe1ff, 0x601e, 0xa984, 0x0060, 0x0110, 0x080c,
++	0x3fc1, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x6714, 0x2071, 0x4680,
++	0xd7fc, 0x1110, 0x2071, 0x4640, 0xa784, 0x0f00, 0x800b, 0xa784,
++	0x001f, 0x0120, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x71c0,
++	0xa168, 0x2700, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++	0x71c4, 0xa100, 0x60c2, 0x2091, 0x8000, 0x7814, 0xd0c4, 0x0138,
++	0xd7fc, 0x1118, 0xd0f4, 0x1140, 0x0010, 0xd0fc, 0x1128, 0x6e08,
++	0xd684, 0x01f0, 0xd9fc, 0x11e0, 0x2091, 0x8001, 0x080c, 0x1be3,
++	0x2091, 0x8000, 0x080c, 0x1d95, 0x2091, 0x8001, 0x7814, 0xd0c4,
++	0x0904, 0x201f, 0xd7fc, 0x1120, 0xd0f4, 0x1130, 0x0804, 0x201f,
++	0xd0fc, 0x1110, 0x0804, 0x201f, 0x601b, 0x0021, 0x0804, 0x201f,
++	0x6024, 0xa096, 0x0001, 0x1110, 0x8000, 0x6026, 0x6a10, 0x6814,
++	0xa202, 0x0268, 0x0160, 0x2091, 0x8001, 0x2039, 0x0200, 0x609c,
++	0x78ba, 0x609f, 0x0000, 0x080c, 0x2021, 0x0804, 0x201f, 0x2c08,
++	0xd9fc, 0x01f0, 0x6800, 0xa065, 0x01d8, 0x6a04, 0x7000, 0xa084,
++	0x0002, 0x0168, 0x7048, 0xa206, 0x1150, 0x6b04, 0x2160, 0x2304,
++	0x6002, 0xa005, 0x1108, 0x6902, 0x2260, 0x6102, 0x0098, 0x2d00,
++	0x2060, 0x080c, 0x2693, 0x6e08, 0x2160, 0x6202, 0x6906, 0x0050,
++	0x6800, 0x6902, 0xa065, 0x0110, 0x6102, 0x0008, 0x6906, 0x2160,
++	0x6003, 0x0000, 0x2160, 0xd9fc, 0x0118, 0xa6b4, 0xfffc, 0x6e0a,
++	0x6810, 0x7d08, 0x8528, 0x7d0a, 0x8000, 0x6812, 0x2091, 0x8001,
++	0xd6b4, 0x0128, 0xa6b6, 0x0040, 0x6e0a, 0x080c, 0x1bf4, 0x00ee,
++	0x0005, 0x6008, 0xa705, 0x600a, 0x2091, 0x8000, 0x080c, 0x1d95,
++	0x2091, 0x8001, 0x78b8, 0xa065, 0x0128, 0x609c, 0x78ba, 0x609f,
++	0x0000, 0x0c78, 0x78b6, 0x78ba, 0x0005, 0x7970, 0x7874, 0x2818,
++	0xd384, 0x0118, 0x8000, 0xa112, 0x0220, 0x8000, 0xa112, 0x1278,
++	0xc384, 0x7a7c, 0x721a, 0x7a78, 0x721e, 0xdac4, 0x0120, 0x7a84,
++	0x7222, 0x7a80, 0x7226, 0xa006, 0xd384, 0x0108, 0x8000, 0x7876,
++	0x70d2, 0x781c, 0xa005, 0x0138, 0x8001, 0x781e, 0x1120, 0x0e04,
++	0x205b, 0x2091, 0x4080, 0x0005, 0x2039, 0x2071, 0x0010, 0x2039,
++	0x2077, 0x2704, 0xa005, 0x0160, 0xac00, 0x2068, 0x6908, 0x6810,
++	0x6912, 0x680a, 0x690c, 0x6814, 0x6916, 0x680e, 0x8738, 0x0c88,
++	0x0005, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0015,
++	0x001b, 0x0000, 0x2041, 0x0000, 0x780c, 0x0002, 0x2223, 0x21fe,
++	0x2082, 0x20f2, 0x2039, 0x8e74, 0x2734, 0x7d10, 0x00c0, 0x6084,
++	0xa086, 0x0103, 0x1904, 0x20dc, 0x6114, 0x6018, 0xa105, 0x0120,
++	0x86ff, 0x11d8, 0x0804, 0x20dc, 0x8603, 0xa080, 0x8e55, 0x620c,
++	0x2202, 0x8000, 0x6210, 0x2202, 0x080c, 0x1db3, 0x8630, 0xa68e,
++	0x000f, 0x0904, 0x215d, 0x786c, 0xa065, 0x1d08, 0x7808, 0xa602,
++	0x1220, 0xd5ac, 0x1110, 0x263a, 0x0005, 0xa682, 0x0003, 0x1a04,
++	0x215d, 0x2091, 0x8000, 0x2069, 0x0000, 0x6818, 0xd084, 0x11f8,
++	0x2011, 0x8e55, 0x2204, 0x70c6, 0x8210, 0x2204, 0x70ca, 0xd684,
++	0x1130, 0x8210, 0x2204, 0x70da, 0x8210, 0x2204, 0x70de, 0xa685,
++	0x8020, 0x70c2, 0x681b, 0x0001, 0x2091, 0x4080, 0x7810, 0xa084,
++	0xffcf, 0x7812, 0x2091, 0x8001, 0x203b, 0x0000, 0x0005, 0x7810,
++	0xc0ad, 0x7812, 0x0804, 0x215d, 0x263a, 0x080c, 0x2229, 0x1904,
++	0x2245, 0x786c, 0xa065, 0x1904, 0x2087, 0x2091, 0x8000, 0x7810,
++	0xa084, 0xffcf, 0x86ff, 0x0108, 0xc0ad, 0x7812, 0x2091, 0x8001,
++	0x0804, 0x2245, 0x2039, 0x8e74, 0x2734, 0x7d10, 0x00a0, 0x6084,
++	0xa086, 0x0103, 0x1904, 0x2147, 0x6114, 0x6018, 0xa105, 0x0120,
++	0x86ff, 0x11b8, 0x0804, 0x2147, 0xa680, 0x8e55, 0x620c, 0x2202,
++	0x080c, 0x1db3, 0x8630, 0xa68e, 0x001e, 0x0904, 0x215d, 0x786c,
++	0xa065, 0x1d28, 0x7808, 0xa602, 0x1220, 0xd5ac, 0x1110, 0x263a,
++	0x0005, 0xa682, 0x0006, 0x1a04, 0x215d, 0x2091, 0x8000, 0x2069,
++	0x0000, 0x6818, 0xd084, 0x11f8, 0x2011, 0x8e55, 0x2009, 0x8e4e,
++	0x26a8, 0x211c, 0x2204, 0x201a, 0x8108, 0x8210, 0x1f04, 0x2129,
++	0xa685, 0x8030, 0x70c2, 0x681b, 0x0001, 0x2091, 0x4080, 0x7810,
++	0xa084, 0xffcf, 0x7812, 0x2091, 0x8001, 0xa006, 0x2009, 0x8e75,
++	0x200a, 0x203a, 0x0005, 0x7810, 0xc0ad, 0x7812, 0x00b0, 0x263a,
++	0x080c, 0x2229, 0x1904, 0x2245, 0x786c, 0xa065, 0x1904, 0x20f7,
++	0x2091, 0x8000, 0x7810, 0xa084, 0xffcf, 0x86ff, 0x0108, 0xc0ad,
++	0x7812, 0x2091, 0x8001, 0x0804, 0x2245, 0x2091, 0x8000, 0x7007,
++	0x0004, 0x7994, 0x70d4, 0xa102, 0x0228, 0x0168, 0x7b90, 0xa302,
++	0x1150, 0x0010, 0x8002, 0x1138, 0x263a, 0x7810, 0xc0ad, 0x7812,
++	0x2091, 0x8001, 0x0005, 0xa184, 0xff00, 0x0140, 0x810f, 0x810c,
++	0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0018, 0x8107, 0x8004,
++	0x8004, 0x7a9c, 0xa210, 0x721a, 0x7a98, 0xa006, 0xa211, 0x721e,
++	0xd4c4, 0x0130, 0x7aa4, 0xa211, 0x7222, 0x7aa0, 0xa211, 0x7226,
++	0x20a1, 0x0030, 0x7003, 0x0000, 0x2009, 0x8e54, 0x260a, 0x8109,
++	0x2198, 0x2104, 0xd084, 0x0108, 0x8633, 0xa6b0, 0x0002, 0x26a8,
++	0x53a6, 0x8603, 0x7012, 0x7007, 0x0001, 0x7990, 0x7894, 0x8000,
++	0xa10a, 0x1208, 0xa006, 0x2028, 0x7974, 0xa184, 0xff00, 0x0140,
++	0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0018,
++	0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, 0xa006, 0xa211,
++	0xd4c4, 0x0120, 0x7b84, 0xa319, 0x7c80, 0xa421, 0x7008, 0xd0fc,
++	0x0de8, 0xa084, 0x01e0, 0x01d0, 0x7d10, 0x2031, 0x8e54, 0x2634,
++	0x78a8, 0x8000, 0x78aa, 0xd08c, 0x1138, 0x7007, 0x0006, 0x7004,
++	0xd094, 0x1de8, 0x0804, 0x215f, 0x2069, 0x4647, 0x206b, 0x0003,
++	0x78ac, 0xa085, 0x0300, 0x78ae, 0xa006, 0x0048, 0x2030, 0x75d6,
++	0x2091, 0x4080, 0x7d96, 0x7d10, 0xa5ac, 0xffcf, 0x7d12, 0x2091,
++	0x8001, 0x78aa, 0x7007, 0x0006, 0x263a, 0x7003, 0x0001, 0x711a,
++	0x721e, 0xd5c4, 0x0110, 0x7322, 0x7426, 0x0005, 0x6084, 0xa086,
++	0x0103, 0x11d8, 0x6114, 0x6018, 0xa105, 0x11b8, 0x2069, 0x0000,
++	0x6818, 0xd084, 0x1190, 0x600c, 0x70c6, 0x6010, 0x70ca, 0x70c3,
++	0x8020, 0x681b, 0x0001, 0x2091, 0x4080, 0x080c, 0x1db3, 0x0e04,
++	0x221c, 0x786c, 0xa065, 0x1d10, 0x0005, 0x0059, 0x1530, 0x786c,
++	0xa065, 0x19e0, 0x0410, 0x0029, 0x1500, 0x786c, 0xa065, 0x1dd8,
++	0x00e0, 0x6084, 0xa086, 0x0103, 0x1168, 0x6018, 0xc0fc, 0x601a,
++	0xa086, 0x0004, 0x1138, 0x7804, 0xd0a4, 0x0120, 0x080c, 0x1db3,
++	0xa006, 0x0005, 0x0079, 0x1118, 0xa085, 0x0001, 0x0005, 0x00b9,
++	0x1110, 0x2041, 0x0001, 0x7d10, 0x0005, 0x88ff, 0x0110, 0x2091,
++	0x4080, 0x0005, 0x7b90, 0x7994, 0x70d4, 0xa102, 0x1118, 0xa385,
++	0x0000, 0x0005, 0x0210, 0xa302, 0x0005, 0x8002, 0x0005, 0xa184,
++	0xff00, 0x0140, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007,
++	0xa100, 0x0018, 0x8107, 0x8004, 0x8004, 0x7a9c, 0x7b98, 0x7ca4,
++	0x7da0, 0xa210, 0xa006, 0xa319, 0xa421, 0xa529, 0x2009, 0x0018,
++	0x6028, 0xa005, 0x0110, 0x2009, 0x0040, 0x080c, 0x1b15, 0x01d0,
++	0x78a8, 0x8000, 0x78aa, 0xd08c, 0x1510, 0x6014, 0xd0fc, 0x1118,
++	0x2069, 0x4640, 0x0010, 0x2069, 0x4680, 0x2091, 0x8000, 0x681f,
++	0x0003, 0x78ab, 0x0000, 0x78ac, 0xa085, 0x0300, 0x78ae, 0x2091,
++	0x8001, 0x0068, 0x78ab, 0x0000, 0x080c, 0x1db3, 0x7990, 0x7894,
++	0x8000, 0xa10a, 0x1208, 0xa006, 0x7896, 0x70d6, 0xa006, 0x2071,
++	0x0010, 0x2091, 0x8001, 0x0005, 0xd7fc, 0x1118, 0x2009, 0x4658,
++	0x0010, 0x2009, 0x4698, 0x2091, 0x8000, 0x200a, 0x00f6, 0x2009,
++	0x4680, 0x2079, 0x0100, 0xd7fc, 0x1120, 0x2009, 0x4640, 0x2079,
++	0x0200, 0x2104, 0xa086, 0x0000, 0x1180, 0xd7fc, 0x1118, 0x2009,
++	0x4645, 0x0010, 0x2009, 0x4685, 0x2104, 0xa005, 0x1130, 0x7830,
++	0xa084, 0x00c0, 0x1110, 0x781b, 0x0052, 0x00fe, 0x0005, 0x2009,
++	0x0002, 0x2069, 0x4600, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904,
++	0x2324, 0x2071, 0x4680, 0x2079, 0x0100, 0x2021, 0x48bf, 0x784b,
++	0x000f, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x0118, 0x2019, 0x3e0f,
++	0x0030, 0x20a1, 0x012b, 0x2019, 0x3e0f, 0xd184, 0x0110, 0x20a1,
++	0x022b, 0x2304, 0xa005, 0x0140, 0x789a, 0x8318, 0x23ac, 0x8318,
++	0x2398, 0x53a6, 0x3318, 0x0ca8, 0x789b, 0x0000, 0x789b, 0x0020,
++	0x20a9, 0x0010, 0x78af, 0x0000, 0x78af, 0x2020, 0x1f04, 0x2302,
++	0x7003, 0x0000, 0x0016, 0xd18c, 0x2009, 0x0000, 0x0108, 0xc1bd,
++	0x080c, 0x2443, 0x001e, 0x7020, 0xa084, 0x000f, 0xa085, 0x6300,
++	0x7806, 0x780f, 0x9000, 0x7843, 0x00d8, 0x7853, 0x0090, 0x780b,
++	0x2f08, 0x7452, 0x704f, 0x0000, 0x8109, 0x0140, 0x2071, 0x4640,
++	0x2079, 0x0200, 0x2021, 0x46bf, 0x0804, 0x22df, 0x080c, 0x24fd,
++	0x0005, 0x0016, 0x2011, 0x0101, 0xd1bc, 0x1110, 0x2011, 0x0201,
++	0xa18c, 0x000f, 0x2204, 0xa084, 0xfff0, 0xa105, 0x2012, 0x001e,
++	0x080c, 0x2443, 0x0005, 0x2011, 0x0101, 0xd3fc, 0x1110, 0x2011,
++	0x0201, 0x20a9, 0x0009, 0x810b, 0x1f04, 0x234b, 0xa18c, 0x0e00,
++	0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x0005, 0x2019, 0x0002,
++	0x2009, 0x0101, 0x20a9, 0x0005, 0x8213, 0x1f04, 0x235c, 0xa294,
++	0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205, 0x200a, 0x8319, 0x0118,
++	0x2009, 0x0201, 0x0c78, 0x0005, 0x2011, 0x0101, 0xd3fc, 0x1110,
++	0x2011, 0x0201, 0x20a9, 0x000c, 0x810b, 0x1f04, 0x2374, 0xa18c,
++	0xf000, 0x2204, 0xa084, 0x0fff, 0xa105, 0x2012, 0x0005, 0x2011,
++	0x0102, 0xd3fc, 0x1110, 0x2011, 0x0202, 0x2204, 0xa084, 0xf0cf,
++	0xa105, 0x2012, 0x0005, 0x00c6, 0x2061, 0x0100, 0xd1bc, 0x1110,
++	0x2061, 0x0200, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0020, 0x609a,
++	0x62ac, 0x63ac, 0x00ce, 0x0005, 0x00c6, 0x2061, 0x0100, 0xd1bc,
++	0x1110, 0x2061, 0x0200, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0022,
++	0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, 0x00ce, 0x0005, 0x00c6,
++	0x2061, 0x0100, 0xd1bc, 0x1110, 0x2061, 0x0200, 0xc1bc, 0x8103,
++	0x8003, 0xa080, 0x0020, 0x609a, 0x60a4, 0xa28c, 0x0020, 0x0118,
++	0xc2ac, 0xa39d, 0x4000, 0xc3ec, 0xd3b4, 0x1108, 0xc3ed, 0x62ae,
++	0x2010, 0x60a4, 0x63ae, 0x2018, 0x00ce, 0x0005, 0x2091, 0x8000,
++	0x00c6, 0x00e6, 0x6818, 0xa005, 0x0904, 0x2427, 0xd1fc, 0x0118,
++	0x2061, 0x8dd0, 0x0010, 0x2061, 0x8cc0, 0x080c, 0x242f, 0x0560,
++	0x20a9, 0x0101, 0xd1fc, 0x0118, 0x2061, 0x8cd0, 0x0010, 0x2061,
++	0x8bc0, 0x00c6, 0x080c, 0x242f, 0x0128, 0x00ce, 0x8c60, 0x1f04,
++	0x23e9, 0x04a8, 0x000e, 0xd1fc, 0x0128, 0xa082, 0x8cd0, 0x2071,
++	0x4680, 0x0020, 0xa082, 0x8bc0, 0x2071, 0x4640, 0x7076, 0x7172,
++	0x2138, 0x2001, 0x0004, 0x7062, 0x707f, 0x000f, 0x71d0, 0xc1c4,
++	0x71d2, 0x080c, 0x22a4, 0x00c0, 0xd1fc, 0x1118, 0x2071, 0x4640,
++	0x0010, 0x2071, 0x4680, 0x6020, 0xc0dd, 0x6022, 0x7172, 0x2138,
++	0x2c00, 0x707a, 0x2001, 0x0006, 0x7062, 0x707f, 0x000f, 0x71d0,
++	0xc1c4, 0x71d2, 0x080c, 0x22a4, 0x2001, 0x0000, 0x0010, 0x2001,
++	0x0001, 0x2091, 0x8001, 0xa005, 0x00ee, 0x00ce, 0x0005, 0x2c04,
++	0xa005, 0x0170, 0x2060, 0x6010, 0xa306, 0x1140, 0x600c, 0xa206,
++	0x1128, 0x6014, 0xa106, 0x1110, 0xa006, 0x0020, 0x6000, 0x0c80,
++	0xa085, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x0016, 0x2079, 0x4680,
++	0x2071, 0x0100, 0xd1bc, 0x1120, 0x2079, 0x4640, 0x2071, 0x0200,
++	0x7920, 0xa18c, 0x000f, 0x70ec, 0xd0c4, 0x1110, 0x001e, 0x0060,
++	0x810b, 0x810b, 0x810b, 0x810b, 0x000e, 0xa18d, 0x0800, 0xd0bc,
++	0x1110, 0xa18d, 0x0f00, 0x2104, 0x00ee, 0x00fe, 0x0005, 0x2001,
++	0x4601, 0x2004, 0xd0ac, 0x1138, 0x68e4, 0xd0ac, 0x0120, 0xa084,
++	0x0006, 0x1108, 0x0009, 0x0005, 0x6014, 0x00e6, 0x0036, 0x2018,
++	0x2071, 0x4b40, 0xd0fc, 0x1110, 0x2071, 0x4ac0, 0x8007, 0xa084,
++	0x000f, 0x8003, 0x8003, 0x8003, 0xae70, 0x7004, 0xa084, 0x000a,
++	0x1904, 0x24fa, 0x7108, 0xa194, 0xff00, 0x0904, 0x24fa, 0xa18c,
++	0x00ff, 0x701c, 0xa084, 0xff00, 0x01c0, 0x7004, 0xa085, 0x003a,
++	0x7006, 0x2001, 0x0009, 0xa102, 0x16d8, 0x2001, 0x000a, 0xa102,
++	0x16d0, 0x2001, 0x000c, 0xa102, 0x16c8, 0x701c, 0xa084, 0x00ff,
++	0x701e, 0x7004, 0xa084, 0xffdf, 0x7006, 0x2001, 0x000a, 0xa106,
++	0x01a8, 0x2001, 0x000c, 0xa106, 0x01a0, 0x2001, 0x0012, 0xa106,
++	0x0198, 0x2001, 0x0014, 0xa106, 0x0190, 0x2001, 0x0019, 0xa106,
++	0x0188, 0x2001, 0x0032, 0xa106, 0x0180, 0x00d8, 0x2009, 0x000c,
++	0x00d0, 0x2009, 0x0012, 0x00b8, 0x2009, 0x0014, 0x00a0, 0x2009,
++	0x0019, 0x0088, 0x2009, 0x0020, 0x0070, 0x2009, 0x003f, 0x0058,
++	0x2009, 0x000a, 0x0040, 0x2009, 0x000c, 0x0028, 0x2009, 0x0019,
++	0x0010, 0x2011, 0x0000, 0x2100, 0xa205, 0x700a, 0x7004, 0xa085,
++	0x000a, 0x7006, 0x2071, 0x4600, 0x7004, 0xd0bc, 0x0158, 0xd3fc,
++	0x1120, 0x73ea, 0x2071, 0x4640, 0x0018, 0x73ee, 0x2071, 0x4680,
++	0x701f, 0x000d, 0x003e, 0x00ee, 0x0005, 0x2001, 0x01ff, 0x2004,
++	0xd0fc, 0x11d0, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x12a0,
++	0x2071, 0x0200, 0x71ec, 0xa18c, 0x1c00, 0x810f, 0x810c, 0x810c,
++	0x2079, 0x0100, 0x78ec, 0xa084, 0x1c00, 0x8007, 0x8004, 0x8004,
++	0xa105, 0xa08a, 0x0007, 0x0208, 0x0005, 0x0002, 0x254b, 0x2532,
++	0x254b, 0x2532, 0x2525, 0x253f, 0x2525, 0x7008, 0xa084, 0xc3ff,
++	0xa085, 0x3000, 0x700a, 0x7808, 0xa084, 0xc3ff, 0xa085, 0x3000,
++	0x780a, 0x0005, 0x7008, 0xa084, 0xc3ff, 0xa085, 0x2000, 0x700a,
++	0x7808, 0xa084, 0xc3ff, 0xa085, 0x2000, 0x780a, 0x0005, 0x7008,
++	0xa084, 0xc3ff, 0xa085, 0x0c00, 0x700a, 0x7808, 0xa084, 0xc3ff,
++	0xa085, 0x0c00, 0x780a, 0x0005, 0x0e04, 0x254c, 0x2091, 0x8000,
++	0x2071, 0x0000, 0x0006, 0x7018, 0xd084, 0x1de8, 0x000e, 0x2071,
++	0x0010, 0x70ca, 0x000e, 0x70c6, 0x70c3, 0x8002, 0x70db, 0x0a04,
++	0x70df, 0x0020, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080,
++	0x0cf8, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x78a0, 0x708a, 0x758e,
++	0x7492, 0x7696, 0x779a, 0xa594, 0x003f, 0xd4f4, 0x0138, 0xd7bc,
++	0x1128, 0xa784, 0x007d, 0x1904, 0x3c74, 0x0871, 0xa49c, 0x000f,
++	0xa382, 0x0004, 0x0320, 0xa3a6, 0x0007, 0x1930, 0x2418, 0x8507,
++	0xa084, 0x000f, 0x0002, 0x2b49, 0x2c34, 0x2c72, 0x2ed8, 0x3256,
++	0x32ad, 0x3353, 0x33e2, 0x34b6, 0x3588, 0x259e, 0x259b, 0x2970,
++	0x2a56, 0x322a, 0x259b, 0x080c, 0x254c, 0x0005, 0xa006, 0x0038,
++	0x7808, 0xc08d, 0x780a, 0xa006, 0x7002, 0x704a, 0x7042, 0x70ce,
++	0x705c, 0xa005, 0x1904, 0x26ec, 0x7060, 0xa084, 0x0007, 0x0002,
++	0x25b8, 0x2626, 0x262e, 0x2637, 0x2640, 0x26d2, 0x2649, 0x2626,
++	0x7830, 0xd0bc, 0x1d10, 0x71d0, 0xd1bc, 0x19f8, 0xd1b4, 0x1904,
++	0x2603, 0x70a0, 0xa086, 0x0001, 0x09c0, 0x70b0, 0xa06d, 0x6800,
++	0xa065, 0xa055, 0x789b, 0x0080, 0x6b0c, 0x7baa, 0x6808, 0xa045,
++	0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001, 0x0118, 0x69bc,
++	0x7daa, 0x79aa, 0x68c0, 0xa04d, 0x6e1c, 0x2001, 0x0010, 0x0804,
++	0x281f, 0x705c, 0xa005, 0x1904, 0x259d, 0x00c6, 0x00d6, 0x70b0,
++	0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0080, 0x6b0c, 0x7baa,
++	0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001,
++	0x0118, 0x69bc, 0x7daa, 0x79aa, 0x68c0, 0xa04d, 0x6e1c, 0x2001,
++	0x0020, 0x0804, 0x281f, 0x080c, 0x3c33, 0x1904, 0x259d, 0x781b,
++	0x0068, 0x70b8, 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de,
++	0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d, 0x780a, 0x68bc, 0x703e,
++	0xc1b4, 0x71d2, 0x70b4, 0xa065, 0x68c0, 0x7056, 0x7003, 0x0002,
++	0x2d00, 0x704a, 0xad80, 0x0009, 0x7042, 0x0005, 0x080c, 0x3c33,
++	0x1120, 0x781b, 0x0054, 0x7003, 0x0004, 0x0005, 0x080c, 0x3c33,
++	0x1128, 0x2011, 0x000c, 0x0419, 0x7003, 0x0004, 0x0005, 0x080c,
++	0x3c33, 0x1128, 0x2011, 0x0006, 0x00d1, 0x7003, 0x0004, 0x0005,
++	0x080c, 0x3c33, 0x1128, 0x2011, 0x000d, 0x0089, 0x7003, 0x0004,
++	0x0005, 0x080c, 0x3c33, 0x1150, 0x2011, 0x0006, 0x0041, 0x7078,
++	0x707b, 0x0000, 0x2068, 0x704a, 0x7003, 0x0004, 0x0005, 0x7170,
++	0xc1fc, 0x8107, 0x7882, 0x789b, 0x0080, 0xa286, 0x000c, 0x1120,
++	0x7aaa, 0x2001, 0x0001, 0x0098, 0xa18c, 0x001f, 0xa18d, 0x00c0,
++	0x79aa, 0xa286, 0x000d, 0x0120, 0x7aaa, 0x2001, 0x0002, 0x0038,
++	0x78ab, 0x0020, 0x7174, 0x79aa, 0x7aaa, 0x2001, 0x0004, 0x789b,
++	0x0060, 0x78aa, 0x785b, 0x0004, 0x781b, 0x0113, 0x080c, 0x3c46,
++	0x707f, 0x000f, 0x70d0, 0xd0b4, 0x0168, 0xc0b4, 0x70d2, 0x00c6,
++	0x70b4, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001,
++	0x601a, 0x00ce, 0x0005, 0x7014, 0xa005, 0x1138, 0x70d0, 0xd0b4,
++	0x0128, 0x70b4, 0xac06, 0x1110, 0x0c29, 0x0005, 0x0016, 0x71a0,
++	0xa186, 0x0001, 0x0528, 0x00d6, 0x0026, 0x2100, 0x2011, 0x0001,
++	0xa212, 0x70b0, 0x2068, 0x6800, 0xac06, 0x0120, 0x8211, 0x01b0,
++	0x00c9, 0x0cc8, 0x00c6, 0x2100, 0x2011, 0x0001, 0xa212, 0x70b0,
++	0x2068, 0x6800, 0x2060, 0x6008, 0xa084, 0xfbef, 0x600a, 0x8211,
++	0x0110, 0x0041, 0x0cb0, 0x70a3, 0x0001, 0x00ce, 0x002e, 0x00de,
++	0x001e, 0x0005, 0xade8, 0x0005, 0x70a8, 0xad06, 0x1110, 0x70a4,
++	0x2068, 0x0005, 0x080c, 0x3c33, 0x1904, 0x259d, 0x7078, 0x2068,
++	0x7770, 0x080c, 0x3b6f, 0x2c50, 0x080c, 0x3cce, 0x789b, 0x0080,
++	0x6814, 0xa084, 0x001f, 0xc0bd, 0x78aa, 0x6e1c, 0x2041, 0x0001,
++	0x2001, 0x0004, 0x0804, 0x2824, 0x080c, 0x3c33, 0x1904, 0x259d,
++	0x789b, 0x0080, 0x705c, 0x2068, 0x6f14, 0x70d0, 0xd0b4, 0x0168,
++	0xc0b4, 0x70d2, 0x00c6, 0x70b4, 0xa065, 0x6008, 0xa084, 0xfbef,
++	0x600a, 0x6018, 0x8001, 0x601a, 0x00ce, 0x080c, 0x3b6f, 0x2c50,
++	0x080c, 0x3cce, 0x6824, 0xa005, 0x0130, 0xa082, 0x0006, 0x0208,
++	0x0010, 0x6827, 0x0005, 0x6814, 0xa084, 0x001f, 0xc0bd, 0x78aa,
++	0x2031, 0x0020, 0x2041, 0x0001, 0x2001, 0x0003, 0x0804, 0x2824,
++	0xc28d, 0x72d2, 0x72bc, 0xa200, 0xa015, 0x7150, 0x8108, 0xa12a,
++	0x0208, 0x71bc, 0x2164, 0x6504, 0x85ff, 0x1170, 0x7152, 0x8421,
++	0x1da8, 0x70d0, 0xd08c, 0x0128, 0x70cc, 0xa005, 0x1110, 0x70cf,
++	0x000a, 0x0005, 0x2200, 0x0c90, 0x70d0, 0xc08c, 0x70d2, 0x70cf,
++	0x0000, 0x6034, 0xa005, 0x1db0, 0x6708, 0xa784, 0x073f, 0x01d0,
++	0xd7d4, 0x1d80, 0xa784, 0x0021, 0x1d68, 0xa784, 0x0002, 0x0130,
++	0xa784, 0x0004, 0x0d38, 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0218,
++	0x1d08, 0xa784, 0x0100, 0x0130, 0x6018, 0xa005, 0x19d8, 0xa7bc,
++	0xfeff, 0x670a, 0x2568, 0x6823, 0x0000, 0x6e1c, 0xa684, 0x000e,
++	0x6318, 0x0128, 0x601c, 0xa302, 0x0220, 0x0118, 0x0858, 0x83ff,
++	0x1948, 0x2d58, 0x2c50, 0x7152, 0xd7bc, 0x1120, 0x7028, 0x6022,
++	0x603a, 0x0010, 0xc7bc, 0x670a, 0x68c0, 0xa065, 0xa04d, 0x6100,
++	0x2a60, 0x2041, 0x0001, 0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0,
++	0xd1fc, 0x0110, 0xd684, 0x0110, 0xa39c, 0xffbf, 0xd6a4, 0x0110,
++	0xa39d, 0x0020, 0xa684, 0x000e, 0x1904, 0x27d6, 0xc7a5, 0x670a,
++	0x2c00, 0x68c6, 0x77a0, 0xa786, 0x0001, 0x1178, 0x70d0, 0xd0b4,
++	0x1160, 0x7000, 0xa082, 0x0002, 0x1240, 0x7830, 0xd0bc, 0x1128,
++	0x789b, 0x0080, 0x7baa, 0x0804, 0x281d, 0x8739, 0x77a2, 0x2750,
++	0x77ac, 0xa7b0, 0x0005, 0x70a8, 0xa606, 0x1108, 0x76a4, 0x76ae,
++	0x2c3a, 0x8738, 0x2d3a, 0x8738, 0x283a, 0x8738, 0x233a, 0x8738,
++	0x253a, 0x7830, 0xd0bc, 0x0150, 0x2091, 0x8000, 0x2091, 0x303d,
++	0x70d0, 0xa084, 0x303d, 0x2091, 0x8000, 0x2090, 0xaad5, 0x0000,
++	0x0120, 0x8421, 0x2200, 0x1904, 0x2725, 0x0005, 0xd1dc, 0x0904,
++	0x37ce, 0x2029, 0x0020, 0xd69c, 0x1120, 0x8528, 0xd68c, 0x1108,
++	0x8528, 0x8840, 0x6f14, 0x610c, 0x8108, 0xa18c, 0x00ff, 0x70c8,
++	0xa160, 0x2c64, 0x8cff, 0x0188, 0x6014, 0xa706, 0x1dd0, 0x60b8,
++	0x8001, 0x60ba, 0x1d88, 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a,
++	0x2200, 0x8421, 0x1904, 0x2725, 0x0005, 0x2a60, 0x610e, 0x69be,
++	0x2c00, 0x68c6, 0x8840, 0x6008, 0xc0d5, 0x600a, 0x77a0, 0xa786,
++	0x0001, 0x1904, 0x27ad, 0x70d0, 0xd0b4, 0x1904, 0x27ad, 0x7000,
++	0xa082, 0x0002, 0x1a04, 0x27ad, 0x7830, 0xd0bc, 0x1904, 0x27ad,
++	0x789b, 0x0080, 0x7baa, 0x7daa, 0x79aa, 0x2001, 0x0002, 0x0006,
++	0x6018, 0x8000, 0x601a, 0x0008, 0x0006, 0x2960, 0x6104, 0x2a60,
++	0x080c, 0x3ce1, 0x1590, 0xa184, 0x0018, 0x0180, 0xa184, 0x0010,
++	0x0118, 0x080c, 0x3977, 0x1548, 0xa184, 0x0008, 0x0138, 0x69a0,
++	0xa184, 0x0600, 0x1118, 0x080c, 0x3895, 0x00f8, 0x69a0, 0xa184,
++	0x1e00, 0x0528, 0xa184, 0x0800, 0x0178, 0x00c6, 0x2960, 0x6000,
++	0xa085, 0x2000, 0x6002, 0x6104, 0xa18d, 0x0010, 0x6106, 0x00ce,
++	0x080c, 0x3977, 0x1150, 0x69a0, 0xa184, 0x0200, 0x0118, 0x080c,
++	0x38da, 0x0018, 0xa184, 0x0400, 0x19f0, 0x69a0, 0xa184, 0x1000,
++	0x0130, 0x6914, 0xa18c, 0xff00, 0x810f, 0x080c, 0x239c, 0x002e,
++	0xa68c, 0x00e0, 0xa684, 0x0060, 0x0128, 0xa086, 0x0060, 0x1110,
++	0xa18d, 0x4000, 0xa18d, 0x0104, 0x69b6, 0x789b, 0x0060, 0x2800,
++	0x78aa, 0x6818, 0xc0fd, 0x681a, 0xd6bc, 0x0168, 0xc0fc, 0x7083,
++	0x0000, 0xa08a, 0x000d, 0x0328, 0xa08a, 0x000c, 0x7182, 0x2001,
++	0x000c, 0x800c, 0x7186, 0x78aa, 0x3518, 0x3340, 0x3428, 0x8000,
++	0x80ac, 0xaf80, 0x002b, 0x20a0, 0x789b, 0x0000, 0xad80, 0x000b,
++	0x2098, 0x53a6, 0x23a8, 0x2898, 0x25a0, 0xa286, 0x0020, 0x1508,
++	0x70d0, 0xc0b5, 0x70d2, 0x2c00, 0x70b6, 0x2d00, 0x70ba, 0x6814,
++	0xc0fc, 0x8007, 0x7882, 0xa286, 0x0002, 0x0904, 0x28f5, 0x70a0,
++	0x8000, 0x70a2, 0x74b0, 0xa498, 0x0005, 0x70a8, 0xa306, 0x1108,
++	0x73a4, 0x73b2, 0xa286, 0x0010, 0x0904, 0x259d, 0x00de, 0x00ce,
++	0x0005, 0x7000, 0xa005, 0x19e0, 0xa286, 0x0002, 0x1904, 0x290c,
++	0x080c, 0x3c33, 0x19a8, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x2091,
++	0x8000, 0x781b, 0x0068, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de,
++	0x6898, 0x78d2, 0x78da, 0x2091, 0x8001, 0x7808, 0xc08d, 0x780a,
++	0x0126, 0x00d6, 0x00c6, 0x70d0, 0xa084, 0x2e00, 0x2090, 0x00ce,
++	0x00de, 0x012e, 0x2900, 0x7056, 0x68bc, 0x703e, 0x7003, 0x0002,
++	0x2d00, 0x704a, 0xad80, 0x0009, 0x7042, 0x7830, 0xd0bc, 0x0140,
++	0x2091, 0x303d, 0x70d0, 0xa084, 0x303d, 0x2091, 0x8000, 0x2090,
++	0x70a0, 0xa005, 0x1108, 0x0005, 0x8421, 0x0de8, 0x724c, 0x70bc,
++	0xa200, 0xa015, 0x0804, 0x2725, 0xa286, 0x0010, 0x1560, 0x080c,
++	0x3c33, 0x1904, 0x28a0, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x781b,
++	0x0068, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2,
++	0x78da, 0x7808, 0xc08d, 0x780a, 0x70a0, 0x8000, 0x70a2, 0x74b0,
++	0xa490, 0x0005, 0x70a8, 0xa206, 0x1108, 0x72a4, 0x72b2, 0x2900,
++	0x7056, 0x68bc, 0x703e, 0x7003, 0x0002, 0x2d00, 0x704a, 0xad80,
++	0x0009, 0x7042, 0x0005, 0x6bb4, 0xa39d, 0x2000, 0x7b5a, 0x6814,
++	0xc0fc, 0x8007, 0x7882, 0x6b94, 0x7bd6, 0x7bde, 0x6e98, 0x7ed2,
++	0x7eda, 0x781b, 0x0068, 0x2900, 0x7056, 0x7202, 0x7808, 0xc08d,
++	0x780a, 0x2300, 0xa605, 0x0170, 0x70d0, 0xa084, 0x2e00, 0xa086,
++	0x2600, 0x1118, 0x2009, 0x0000, 0x0010, 0x2009, 0x0001, 0xa284,
++	0x000f, 0x0023, 0xad80, 0x0009, 0x7042, 0x0005, 0x296e, 0x41d9,
++	0x41d9, 0x41c7, 0x41d9, 0x296e, 0x296e, 0x296e, 0x080c, 0x254c,
++	0x7808, 0xa084, 0xfffd, 0x780a, 0x00f6, 0x2079, 0x4600, 0x78ac,
++	0x00fe, 0xd084, 0x01b0, 0x7060, 0xa086, 0x0001, 0x0904, 0x2a32,
++	0x7060, 0xa086, 0x0005, 0x1158, 0x7078, 0x2068, 0x681b, 0x0004,
++	0x6817, 0x0000, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x7063,
++	0x0000, 0x70a3, 0x0000, 0x70a4, 0x70ae, 0x70b2, 0x080c, 0x2682,
++	0x0156, 0x2011, 0x0004, 0x7160, 0xa186, 0x0001, 0x0160, 0xa186,
++	0x0007, 0x1118, 0x701f, 0x0005, 0x0030, 0x701f, 0x0001, 0x70d0,
++	0xc0c5, 0x70d2, 0x0000, 0x2001, 0x460a, 0x2004, 0xa084, 0x00ff,
++	0xa086, 0x0018, 0x0130, 0x7018, 0x7016, 0xa005, 0x1110, 0x70a3,
++	0x0001, 0x0066, 0x080c, 0x3f26, 0x20a9, 0x0010, 0x2039, 0x0000,
++	0x080c, 0x3a66, 0xa7b8, 0x0100, 0x1f04, 0x29c0, 0x006e, 0x7000,
++	0x0002, 0x29fd, 0x29db, 0x29db, 0x29d3, 0x29fd, 0x29fd, 0x29fd,
++	0x29d1, 0x080c, 0x254c, 0x705c, 0xa005, 0x0538, 0xad06, 0x1118,
++	0x6800, 0x705e, 0x0080, 0x6820, 0xd084, 0x1148, 0x6f14, 0x080c,
++	0x3b6f, 0x6008, 0xc0d4, 0x600a, 0x080c, 0x37a4, 0x0020, 0x7058,
++	0x2060, 0x6800, 0x6002, 0xa684, 0x5f00, 0x681e, 0x6818, 0xd0fc,
++	0x0108, 0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000, 0x6820, 0xa084,
++	0x00ff, 0xc09d, 0x6822, 0x080c, 0x1da2, 0x2011, 0x0004, 0x74c8,
++	0xa4a0, 0x0100, 0x04b1, 0xaea0, 0x0017, 0x0499, 0x20a9, 0x0101,
++	0x74c8, 0x0479, 0x8420, 0x1f04, 0x2a09, 0x70c0, 0x2060, 0x2021,
++	0x0002, 0x20a9, 0x0100, 0x6110, 0x81ff, 0x0198, 0x6018, 0x0016,
++	0x0006, 0x2011, 0x4602, 0x220c, 0xa102, 0x2012, 0x000e, 0x001e,
++	0xa102, 0x0338, 0x6012, 0x1128, 0x2011, 0x4604, 0x2204, 0xc0a5,
++	0x2012, 0x601b, 0x0000, 0xace0, 0x0010, 0x1f04, 0x2a13, 0x8421,
++	0x1d00, 0x015e, 0x7063, 0x0000, 0x7003, 0x0000, 0x704b, 0x0000,
++	0x0005, 0x0046, 0x2404, 0xa005, 0x01a8, 0x2068, 0x6800, 0x0006,
++	0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00,
++	0x681e, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x080c, 0x1da2,
++	0x000e, 0x0c48, 0x004e, 0x2023, 0x0000, 0x0005, 0xa282, 0x0003,
++	0x0310, 0x080c, 0x254c, 0x2300, 0x0002, 0x2a60, 0x2add, 0x2af7,
++	0xa282, 0x0002, 0x0110, 0x080c, 0x254c, 0x7060, 0x7063, 0x0000,
++	0x707f, 0x0000, 0x0022, 0x77d0, 0xc7c5, 0x77d2, 0x0002, 0x2a77,
++	0x2a77, 0x2a79, 0x2ab1, 0x37d8, 0x2a77, 0x2ab1, 0x2a77, 0x080c,
++	0x254c, 0x7770, 0x080c, 0x3a66, 0x7770, 0xa7bc, 0x8f00, 0x080c,
++	0x3b6f, 0x6018, 0xa005, 0x0528, 0xd7fc, 0x1118, 0x2021, 0x8cc0,
++	0x0010, 0x2021, 0x8dd0, 0x2009, 0x0005, 0x2011, 0x0010, 0x080c,
++	0x2b11, 0x01b8, 0x0156, 0x20a9, 0x0101, 0xd7fc, 0x1118, 0x2021,
++	0x8bc0, 0x0010, 0x2021, 0x8cd0, 0x0046, 0x2009, 0x0005, 0x2011,
++	0x0010, 0x080c, 0x2b11, 0x004e, 0x0118, 0x8420, 0x1f04, 0x2a9c,
++	0x015e, 0x8738, 0xa784, 0x001f, 0x1990, 0x0804, 0x25a0, 0x0804,
++	0x25a0, 0x7770, 0x080c, 0x3b6f, 0x6018, 0xa005, 0x0520, 0xd7fc,
++	0x1118, 0x2021, 0x8cc0, 0x0010, 0x2021, 0x8dd0, 0x2009, 0x0005,
++	0x2011, 0x0020, 0x080c, 0x2b11, 0x01b0, 0x0156, 0x20a9, 0x0101,
++	0xd7fc, 0x1118, 0x2021, 0x8bc0, 0x0010, 0x2021, 0x8cd0, 0x0046,
++	0x2009, 0x0005, 0x2011, 0x0020, 0x04e1, 0x004e, 0x0118, 0x8420,
++	0x1f04, 0x2acf, 0x015e, 0x0804, 0x25a0, 0x2200, 0x0002, 0x2ae2,
++	0x2ae4, 0x2ae4, 0x080c, 0x254c, 0x2009, 0x0012, 0x7060, 0xa086,
++	0x0002, 0x0110, 0x2009, 0x000e, 0x6818, 0xd0fc, 0x0108, 0x691a,
++	0x7063, 0x0000, 0x70d0, 0xc0c5, 0x70d2, 0x0804, 0x3be5, 0x2200,
++	0x0002, 0x2afe, 0x2ae4, 0x2afc, 0x080c, 0x254c, 0x080c, 0x3f26,
++	0x7000, 0xa086, 0x0002, 0x1904, 0x375d, 0x080c, 0x37be, 0x6008,
++	0xa084, 0xfbef, 0x600a, 0x080c, 0x374f, 0x0904, 0x375d, 0x0804,
++	0x25a0, 0x2404, 0xa005, 0x0590, 0x2068, 0x2d04, 0x0006, 0x6814,
++	0xa706, 0x0118, 0x2d20, 0x000e, 0x0ca8, 0x000e, 0x2022, 0x691a,
++	0x6817, 0x0000, 0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e,
++	0x6820, 0xa084, 0x00ff, 0xa205, 0x6822, 0x080c, 0x1da2, 0x2021,
++	0x4602, 0x241c, 0x8319, 0x2322, 0x6010, 0x8001, 0x6012, 0x1128,
++	0x2021, 0x4604, 0x2404, 0xc0a5, 0x2022, 0x6008, 0xa084, 0xf9ef,
++	0x600a, 0x080c, 0x269e, 0x080c, 0x37be, 0x0005, 0xa085, 0x0001,
++	0x0ce0, 0x2300, 0x0002, 0x2b50, 0x2b4e, 0x2bcb, 0x080c, 0x254c,
++	0x78e4, 0xa005, 0x17b0, 0x3208, 0xa18c, 0x0800, 0x0118, 0x0104,
++	0x259d, 0x0010, 0x0304, 0x259d, 0x2008, 0xa084, 0x0030, 0x1110,
++	0x0804, 0x322a, 0x78ec, 0xa084, 0x0003, 0x0dd0, 0x7884, 0xd0fc,
++	0x1118, 0xa184, 0x0007, 0x0090, 0xa184, 0x0007, 0xa086, 0x0004,
++	0x1118, 0x2001, 0x0000, 0x0050, 0xa184, 0x0007, 0xa086, 0x0005,
++	0x0118, 0xa184, 0x0007, 0x0010, 0x2001, 0x0001, 0x0002, 0x2bae,
++	0x2bb7, 0x2ba4, 0x2b87, 0x3c29, 0x3c29, 0x2b87, 0x2bc1, 0x080c,
++	0x254c, 0x7000, 0xa086, 0x0004, 0x1190, 0x7060, 0xa086, 0x0002,
++	0x1130, 0x2011, 0x0002, 0x2019, 0x0000, 0x0804, 0x2a56, 0x7060,
++	0xa086, 0x0006, 0x0db0, 0x7060, 0xa086, 0x0004, 0x0d90, 0x79e4,
++	0x2001, 0x0003, 0x0804, 0x2f18, 0x6818, 0xd0fc, 0x0110, 0x681b,
++	0x001d, 0x080c, 0x3a3c, 0x781b, 0x006e, 0x0005, 0x6818, 0xd0fc,
++	0x0110, 0x681b, 0x001d, 0x080c, 0x3a3c, 0x0804, 0x3c07, 0x6818,
++	0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c, 0x3a3c, 0x781b, 0x00fa,
++	0x0005, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c, 0x3a3c,
++	0x781b, 0x00cb, 0x0005, 0xa584, 0x000f, 0x11c0, 0x7000, 0x0002,
++	0x25a0, 0x2bd8, 0x2bda, 0x375d, 0x375d, 0x375d, 0x2bd8, 0x2bd8,
++	0x080c, 0x254c, 0x080c, 0x37be, 0x6008, 0xa084, 0xfbef, 0x600a,
++	0x080c, 0x374f, 0x0904, 0x375d, 0x0804, 0x25a0, 0x78e4, 0xa005,
++	0x1b04, 0x2b89, 0x3208, 0xa18c, 0x0800, 0x0118, 0x0104, 0x2b89,
++	0x0010, 0x0304, 0x2b89, 0x2008, 0xa084, 0x0030, 0x1118, 0x781b,
++	0x0068, 0x0005, 0x78ec, 0xa084, 0x0003, 0x0dc8, 0x7884, 0xd0fc,
++	0x1118, 0xa184, 0x0007, 0x0090, 0xa184, 0x0007, 0xa086, 0x0004,
++	0x1118, 0x2001, 0x0000, 0x0050, 0xa184, 0x0007, 0xa086, 0x0005,
++	0x0118, 0xa184, 0x0007, 0x0010, 0x2001, 0x0001, 0x0002, 0x2c26,
++	0x2c2a, 0x2c21, 0x2c1f, 0x3c29, 0x3c29, 0x2c1f, 0x3c23, 0x080c,
++	0x254c, 0x080c, 0x3a42, 0x781b, 0x006e, 0x0005, 0x080c, 0x3a42,
++	0x0804, 0x3c07, 0x080c, 0x3a42, 0x781b, 0x00fa, 0x0005, 0x080c,
++	0x3a42, 0x781b, 0x00cb, 0x0005, 0x2300, 0x0002, 0x2c3b, 0x2c39,
++	0x2c3d, 0x080c, 0x254c, 0x0804, 0x33e2, 0x681b, 0x0016, 0x78a3,
++	0x0000, 0x79e4, 0xa184, 0x0030, 0x0904, 0x33e2, 0x78ec, 0xa084,
++	0x0003, 0x0904, 0x33e2, 0xa184, 0x0100, 0x0d98, 0x7884, 0xd0fc,
++	0x1118, 0xa184, 0x0007, 0x0090, 0xa184, 0x0007, 0xa086, 0x0004,
++	0x1118, 0x2001, 0x0000, 0x0050, 0xa184, 0x0007, 0xa086, 0x0005,
++	0x0118, 0xa184, 0x0007, 0x0010, 0x2001, 0x0001, 0x0002, 0x2c6f,
++	0x2c2a, 0x2ba4, 0x3be5, 0x3c29, 0x3c29, 0x3be5, 0x3c23, 0x080c,
++	0x3bf1, 0x0005, 0xa282, 0x0005, 0x0310, 0x080c, 0x254c, 0x7898,
++	0x2040, 0x2300, 0x0002, 0x2c7e, 0x2ea8, 0x2eb2, 0x2200, 0x0002,
++	0x2c9a, 0x2c87, 0x2c9a, 0x2c85, 0x2e8a, 0x080c, 0x254c, 0x789b,
++	0x0018, 0x78a8, 0x2010, 0xa084, 0x00ff, 0xa082, 0x0020, 0x0a04,
++	0x3a0b, 0xa08a, 0x0004, 0x1a04, 0x3a0b, 0x0002, 0x3a0b, 0x3a0b,
++	0x3a0b, 0x39c1, 0x789b, 0x0018, 0x79a8, 0xa184, 0x0080, 0x0148,
++	0x0804, 0x3a0b, 0x7000, 0xa005, 0x1dd8, 0x2011, 0x0004, 0x0804,
++	0x3594, 0xa184, 0x00ff, 0xa08a, 0x0010, 0x1a04, 0x3a0b, 0x0002,
++	0x2cc2, 0x2cc0, 0x2cd4, 0x2cd8, 0x2d86, 0x3a0b, 0x3a0b, 0x2d88,
++	0x3a0b, 0x3a0b, 0x2e86, 0x2e86, 0x3a0b, 0x3a0b, 0x3a0b, 0x2e88,
++	0x080c, 0x254c, 0xd6e4, 0x0140, 0x2001, 0x0300, 0x8000, 0x8000,
++	0x783a, 0x781b, 0x00c7, 0x0005, 0x6818, 0xd0fc, 0x0118, 0x681b,
++	0x001d, 0x0c90, 0x0804, 0x3be5, 0x681b, 0x001d, 0x0804, 0x3a36,
++	0x6920, 0x6922, 0xa684, 0x1800, 0x1904, 0x2d29, 0x6820, 0xd084,
++	0x1904, 0x2d31, 0x6818, 0xa086, 0x0008, 0x1110, 0x681b, 0x0000,
++	0xd6d4, 0x0568, 0xd6bc, 0x0558, 0x7083, 0x0000, 0x6818, 0xa084,
++	0x003f, 0xa08a, 0x000d, 0x0718, 0xa08a, 0x000c, 0x7182, 0x2001,
++	0x000c, 0x800c, 0x7186, 0x789b, 0x0061, 0x78aa, 0x0156, 0x0136,
++	0x0146, 0x0016, 0x3208, 0xa18c, 0x0600, 0x0118, 0x20a1, 0x022b,
++	0x0010, 0x20a1, 0x012b, 0x001e, 0x789b, 0x0000, 0x8000, 0x80ac,
++	0xad80, 0x000b, 0x2098, 0x53a6, 0x014e, 0x013e, 0x015e, 0x6038,
++	0xa005, 0x1150, 0x681c, 0xa084, 0x000e, 0x0904, 0x3a36, 0x080c,
++	0x3a48, 0x782b, 0x3008, 0x0010, 0x8001, 0x603a, 0x781b, 0x0071,
++	0x0005, 0xd6e4, 0x0130, 0x781b, 0x0083, 0x0005, 0x781b, 0x0083,
++	0x0005, 0xa684, 0x0060, 0x0dd0, 0xd6dc, 0x0dc0, 0xd6fc, 0x01a0,
++	0xc6fc, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8, 0x78d0, 0x8007, 0xa084,
++	0x007f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2,
++	0x6b94, 0x2200, 0xa303, 0x68ae, 0xd6f4, 0x0118, 0xc6f4, 0x7e5a,
++	0x6eb6, 0x7000, 0xa086, 0x0003, 0x1148, 0x0006, 0x080c, 0x3f26,
++	0x080c, 0x41d9, 0x000e, 0x781b, 0x0080, 0x0005, 0xa006, 0x080c,
++	0x42b5, 0x6ab0, 0x69ac, 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0120,
++	0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda, 0x6ba6,
++	0x7bd6, 0x7bde, 0x2300, 0xa405, 0x1130, 0xc6f5, 0x7e5a, 0x6eb6,
++	0x781b, 0x0080, 0x0005, 0x781b, 0x0080, 0x2200, 0xa115, 0x1118,
++	0x080c, 0x41d9, 0x0005, 0x080c, 0x4206, 0x0005, 0x080c, 0x254c,
++	0x0804, 0x2e1c, 0x00c6, 0x7054, 0x2060, 0x6920, 0xa18c, 0xecff,
++	0x6922, 0x6000, 0xa084, 0xcfdf, 0x6002, 0x080c, 0x38f4, 0xa006,
++	0x2040, 0x2038, 0x080c, 0x399c, 0x0804, 0x2e10, 0x00c6, 0x7054,
++	0x2060, 0x2c48, 0x7aa8, 0xa294, 0x00ff, 0xa286, 0x0004, 0x11d8,
++	0x6920, 0xd1e4, 0x1170, 0x2039, 0x0000, 0x2041, 0x0000, 0x2031,
++	0x0000, 0xa006, 0x2010, 0x080c, 0x38f7, 0x080c, 0x399c, 0x0804,
++	0x2e10, 0xa18c, 0xecff, 0x6922, 0x6104, 0xa18c, 0xffdd, 0x6106,
++	0x6000, 0xc0ac, 0x6002, 0xa286, 0x0003, 0x01d0, 0x6104, 0xa184,
++	0x0010, 0x0548, 0x080c, 0x3b6b, 0x080c, 0x3977, 0x88ff, 0x0518,
++	0x00ce, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a,
++	0xd6d4, 0x1118, 0x781b, 0x006e, 0x0005, 0x781b, 0x0082, 0x0005,
++	0x6920, 0xd1cc, 0x0130, 0xa18c, 0xfdff, 0x6922, 0x6000, 0xc0ec,
++	0x6002, 0x2039, 0x0000, 0x2041, 0x0000, 0x2031, 0x0000, 0xa006,
++	0x2010, 0x080c, 0x399c, 0xa286, 0x0001, 0x0158, 0x6104, 0xa184,
++	0x0008, 0x01b0, 0x080c, 0x3b6b, 0x080c, 0x3895, 0x88ff, 0x1980,
++	0x0078, 0x6920, 0xd1c4, 0x0130, 0xa18c, 0xfeff, 0x6922, 0x6000,
++	0xc0e4, 0x6002, 0x2031, 0x0000, 0xa006, 0x2010, 0x080c, 0x38f7,
++	0x00ce, 0x7e58, 0xd6d4, 0x1118, 0x781b, 0x0071, 0x0005, 0x781b,
++	0x0083, 0x0005, 0x0804, 0x3a32, 0x2808, 0x789b, 0x0080, 0x2019,
++	0x0080, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x11b8, 0x2300,
++	0xa102, 0xa086, 0x0001, 0x0904, 0x2d8a, 0x7ca8, 0xa4a4, 0x00ff,
++	0xa480, 0x0002, 0xa300, 0x2018, 0xa102, 0x0a04, 0x2d9e, 0x0904,
++	0x2d9e, 0x24a8, 0x7aa8, 0x1f04, 0x2e3a, 0x0c18, 0xa284, 0x00f0,
++	0xa082, 0x0020, 0x06b8, 0x2200, 0xa082, 0x0021, 0x1698, 0x7aa8,
++	0x8318, 0x8318, 0x2100, 0xa302, 0x0aa0, 0xa286, 0x0023, 0x0950,
++	0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, 0xa684, 0xfff1, 0xc0a5,
++	0x2030, 0x7e5a, 0x6008, 0xc0a5, 0x600a, 0x78a0, 0x8001, 0x0904,
++	0x2e10, 0x20a8, 0x7998, 0x789b, 0x0060, 0x78aa, 0x2011, 0x0080,
++	0x799a, 0x78a8, 0x7998, 0x7a9a, 0x78aa, 0x7a98, 0x1f04, 0x2e68,
++	0xc695, 0x7e5a, 0xd6d4, 0x1118, 0x781b, 0x006e, 0x0005, 0x781b,
++	0x0082, 0x0005, 0x8318, 0x2100, 0xa302, 0x0a04, 0x2e21, 0xa284,
++	0x0080, 0x1904, 0x3a36, 0x78a0, 0xa005, 0x08c8, 0x0804, 0x3a36,
++	0x0804, 0x3a0b, 0x7054, 0xa04d, 0x789b, 0x0018, 0x78a8, 0xa084,
++	0x00ff, 0xa08e, 0x0001, 0x0110, 0x080c, 0x254c, 0x7aa8, 0xa294,
++	0x00ff, 0x784b, 0x0008, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0005,
++	0x1a04, 0x3a0b, 0x0002, 0x3a0b, 0x380c, 0x3a0b, 0x3927, 0x3d31,
++	0xa282, 0x0000, 0x1110, 0x080c, 0x254c, 0x080c, 0x3a3c, 0x781b,
++	0x0082, 0x0005, 0xa282, 0x0003, 0x1110, 0x080c, 0x254c, 0xd4fc,
++	0x11d0, 0x7060, 0xa005, 0x0110, 0x080c, 0x254c, 0x6f14, 0x7772,
++	0xa7bc, 0x8f00, 0x080c, 0x3b6f, 0x6008, 0xa085, 0x0021, 0x600a,
++	0x8738, 0xa784, 0x001f, 0x1db0, 0x080c, 0x3a3f, 0x7063, 0x0002,
++	0x701f, 0x0009, 0x0010, 0x080c, 0x3a4b, 0x781b, 0x0082, 0x0005,
++	0xa282, 0x0004, 0x0310, 0x080c, 0x254c, 0x2300, 0x0002, 0x2ee2,
++	0x3078, 0x30b4, 0xa286, 0x0003, 0x0598, 0x7200, 0x7cd8, 0x7ddc,
++	0x7fd0, 0x71d0, 0xd1b4, 0x0528, 0xd1bc, 0x1518, 0x2001, 0x4601,
++	0x2004, 0xd0c4, 0x11f0, 0x7868, 0xa084, 0x00ff, 0x11d0, 0xa282,
++	0x0002, 0x12b8, 0x00d6, 0x783b, 0x8300, 0x781b, 0x0059, 0x70b8,
++	0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2,
++	0x78da, 0xc1b4, 0x71d2, 0x7003, 0x0030, 0x00de, 0x2001, 0x0000,
++	0x0058, 0x783b, 0x1300, 0x781b, 0x0057, 0x2001, 0x0000, 0x0020,
++	0x7200, 0x7cd8, 0x7ddc, 0x7fd0, 0x7046, 0x68a0, 0xd0ec, 0x0118,
++	0x6008, 0xc08d, 0x600a, 0xa284, 0x000f, 0x0002, 0x3059, 0x2f33,
++	0x2f30, 0x3184, 0x320f, 0x25a0, 0x2f2e, 0x2f2e, 0x080c, 0x254c,
++	0x6008, 0xc0d4, 0x600a, 0xd6e4, 0x0120, 0x7044, 0xa086, 0x0014,
++	0x11e8, 0x080c, 0x3f26, 0x2009, 0x0000, 0x6818, 0xd0fc, 0x0108,
++	0x7044, 0xa086, 0x0014, 0x0168, 0x6818, 0xa086, 0x0008, 0x1904,
++	0x301b, 0x7858, 0xd09c, 0x0904, 0x301b, 0x6820, 0xd0ac, 0x0904,
++	0x301b, 0x681b, 0x0014, 0x2009, 0x0002, 0x04a8, 0x7868, 0xa08c,
++	0x00ff, 0x0588, 0xa186, 0x0008, 0x1158, 0x6008, 0xc0a4, 0x600a,
++	0x080c, 0x374f, 0x0540, 0x080c, 0x37be, 0x080c, 0x3f26, 0x0060,
++	0xa186, 0x0028, 0x1500, 0x6018, 0xa005, 0x0d78, 0x8001, 0x0d68,
++	0x8001, 0x0d58, 0x601e, 0x0c48, 0x6820, 0xd084, 0x0904, 0x25a0,
++	0xc084, 0x6822, 0x080c, 0x2693, 0x7058, 0x00c6, 0x2060, 0x6800,
++	0x6002, 0x00ce, 0x6004, 0x6802, 0xa005, 0x2d00, 0x1108, 0x6002,
++	0x6006, 0x0804, 0x25a0, 0x0016, 0x81ff, 0x15f0, 0x7000, 0xa086,
++	0x0030, 0x05d0, 0x71d0, 0xd1bc, 0x15b8, 0xd1b4, 0x11e8, 0x705c,
++	0xa005, 0x1590, 0x70a0, 0xa086, 0x0001, 0x0570, 0x7003, 0x0000,
++	0x0046, 0x0056, 0x0076, 0x0066, 0x00c6, 0x00d6, 0x080c, 0x25c5,
++	0x00de, 0x00ce, 0x006e, 0x007e, 0x005e, 0x004e, 0x71d0, 0xd1b4,
++	0x11d8, 0x7003, 0x0040, 0x00c0, 0x080c, 0x3c33, 0x11a8, 0x781b,
++	0x0068, 0x00d6, 0x70b8, 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6,
++	0x78de, 0x6898, 0x78d2, 0x78da, 0xc1b4, 0x71d2, 0x7003, 0x0030,
++	0x7808, 0xc08d, 0x780a, 0x00de, 0x080c, 0x30dc, 0x001e, 0x81ff,
++	0x0904, 0x301b, 0xa684, 0xdf00, 0x681e, 0x682b, 0x0000, 0x6f14,
++	0xa186, 0x0002, 0x1904, 0x301c, 0x6818, 0xa086, 0x0014, 0x1130,
++	0x2008, 0xd6e4, 0x0118, 0x7868, 0xa08c, 0x00ff, 0x080c, 0x3a55,
++	0x080c, 0x269e, 0x6820, 0xd0dc, 0x1578, 0x8717, 0xa294, 0x000f,
++	0x8213, 0x8213, 0x8213, 0xb284, 0x0600, 0x0118, 0xa290, 0x4ac0,
++	0x0010, 0xa290, 0x4b40, 0xa290, 0x0000, 0x221c, 0xd3c4, 0x0170,
++	0x6820, 0xd0e4, 0x0128, 0xa084, 0xefff, 0x6822, 0xc3ac, 0x2312,
++	0x8210, 0x2204, 0xa085, 0x0038, 0x2012, 0x8211, 0xd3d4, 0x0138,
++	0x68a0, 0xd0c4, 0x1120, 0x080c, 0x3144, 0x0804, 0x25a0, 0x6008,
++	0xc08d, 0x600a, 0x0008, 0x692a, 0x6916, 0x6818, 0xd0fc, 0x0110,
++	0x7044, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x6410, 0x84ff, 0x0168,
++	0x2009, 0x4602, 0x2104, 0x8001, 0x200a, 0x8421, 0x6412, 0x1128,
++	0x2021, 0x4604, 0x2404, 0xc0a5, 0x2022, 0x6018, 0xa005, 0x0118,
++	0x8001, 0x601a, 0x1118, 0x6008, 0xc0a4, 0x600a, 0x6820, 0xd084,
++	0x1130, 0x6800, 0xa005, 0x1108, 0x6002, 0x6006, 0x0020, 0x7058,
++	0x2060, 0x6800, 0x6002, 0x2061, 0x4600, 0x6887, 0x0103, 0x2d08,
++	0x206b, 0x0000, 0x6068, 0xa005, 0x616a, 0x0110, 0x2d02, 0x0008,
++	0x616e, 0x7200, 0xa286, 0x0030, 0x0158, 0xa286, 0x0040, 0x1904,
++	0x25a0, 0x7003, 0x0002, 0x7048, 0x2068, 0x68c4, 0x2060, 0x0005,
++	0x7003, 0x0002, 0x70b8, 0xa06d, 0x68bc, 0x703e, 0x70b4, 0xa065,
++	0x68c0, 0x7056, 0x2d00, 0x704a, 0xad80, 0x0009, 0x7042, 0x0005,
++	0xa282, 0x0004, 0x0210, 0x080c, 0x254c, 0x2200, 0x0002, 0x3083,
++	0x3092, 0x309e, 0x3092, 0xa586, 0x1300, 0x0160, 0xa586, 0x8300,
++	0x1d90, 0x7003, 0x0000, 0x6018, 0x8001, 0x601a, 0x6008, 0xa084,
++	0xfbef, 0x600a, 0x7000, 0xa086, 0x0005, 0x0128, 0x080c, 0x3a3c,
++	0x781b, 0x0082, 0x0005, 0x781b, 0x0083, 0x0005, 0x7890, 0x8007,
++	0x8001, 0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c,
++	0x00ff, 0xa186, 0x0003, 0x0128, 0xa186, 0x0000, 0x0110, 0x0804,
++	0x3a0b, 0x781b, 0x0083, 0x0005, 0x6820, 0xc095, 0x6822, 0x82ff,
++	0x1118, 0x080c, 0x3a3c, 0x0030, 0x8211, 0x0110, 0x080c, 0x254c,
++	0x080c, 0x3a4b, 0x781b, 0x0082, 0x0005, 0x080c, 0x3c46, 0x7830,
++	0xa084, 0x00c0, 0x1170, 0x0016, 0x3208, 0xa18c, 0x0800, 0x001e,
++	0x0118, 0x0104, 0x30d9, 0x0010, 0x0304, 0x30d9, 0x791a, 0xa006,
++	0x0005, 0xa085, 0x0001, 0x0005, 0xa684, 0x0060, 0x1130, 0x682f,
++	0x0000, 0x6833, 0x0000, 0x0804, 0x3143, 0xd6dc, 0x1198, 0x68b4,
++	0xd0dc, 0x1180, 0x6998, 0x6a94, 0x692e, 0x6a32, 0x7044, 0xa005,
++	0x1130, 0x2200, 0xa105, 0x0904, 0x3f26, 0x7047, 0x0015, 0x0804,
++	0x3f26, 0x0005, 0xd6ac, 0x01f0, 0xd6f4, 0x0130, 0x682f, 0x0000,
++	0x6833, 0x0000, 0x0804, 0x3f26, 0x68b4, 0xa084, 0x4000, 0xa635,
++	0xd6f4, 0x1da0, 0x7044, 0xa005, 0x1110, 0x7047, 0x0015, 0xd6dc,
++	0x1128, 0x68b4, 0xd0dc, 0x0110, 0x6ca8, 0x6da4, 0x6c2e, 0x6d32,
++	0x0804, 0x3f26, 0xd6f4, 0x0130, 0x682f, 0x0000, 0x6833, 0x0000,
++	0x0804, 0x3f26, 0x68b4, 0xa084, 0x4800, 0xa635, 0xd6f4, 0x1da0,
++	0x7044, 0xa005, 0x1110, 0x7047, 0x0015, 0x2408, 0x2510, 0x2700,
++	0x8007, 0xa084, 0x007f, 0xa108, 0xa291, 0x0000, 0x692e, 0x6a32,
++	0x2100, 0xa205, 0x1110, 0x0804, 0x3f26, 0x7000, 0xa086, 0x0006,
++	0x0110, 0x0804, 0x3f26, 0x0005, 0x6946, 0x6008, 0xc0cd, 0xd3cc,
++	0x0108, 0xc08d, 0x600a, 0x6818, 0x683a, 0x681b, 0x0006, 0x688f,
++	0x0000, 0x6893, 0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f,
++	0x0003, 0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b,
++	0x0020, 0x7000, 0x0002, 0x25a0, 0x3173, 0x316d, 0x316b, 0x316b,
++	0x316b, 0x316b, 0x316b, 0x080c, 0x254c, 0x6820, 0xd084, 0x1118,
++	0x080c, 0x37a4, 0x0030, 0x7058, 0x2c50, 0x2060, 0x6800, 0x6002,
++	0x2a60, 0xaea0, 0x0017, 0x2404, 0xa005, 0x0110, 0x2020, 0x0cd8,
++	0x2d22, 0x206b, 0x0000, 0x0005, 0x080c, 0x37aa, 0x080c, 0x37be,
++	0x6008, 0xc0cc, 0x600a, 0x682b, 0x0000, 0x789b, 0x000e, 0x6f14,
++	0x6938, 0x691a, 0x6944, 0x6916, 0x2009, 0x0000, 0xae86, 0x4640,
++	0x0110, 0x2009, 0x0001, 0x080c, 0x42ec, 0xd6dc, 0x01c8, 0x691c,
++	0xc1ed, 0x691e, 0x6828, 0xa082, 0x000e, 0x0290, 0x6848, 0xa084,
++	0x000f, 0xa086, 0x000b, 0x1160, 0x685c, 0xa086, 0x0047, 0x1140,
++	0x2001, 0x4601, 0x2004, 0xd0ac, 0x1118, 0x2700, 0x080c, 0x2475,
++	0x6818, 0xd0fc, 0x0140, 0x681b, 0x0000, 0x7868, 0xa08c, 0x00ff,
++	0x0110, 0x681b, 0x001e, 0xaea0, 0x0017, 0x6800, 0x2022, 0x6a3c,
++	0x6940, 0x6a32, 0x692e, 0x68c0, 0x2060, 0x6000, 0xd0a4, 0x0580,
++	0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x00d6, 0x00f6,
++	0x0156, 0x0146, 0x2079, 0x4600, 0x080c, 0x1b93, 0x014e, 0x015e,
++	0x00fe, 0x70c8, 0x2010, 0x2009, 0x0101, 0x0026, 0x2204, 0xa06d,
++	0x0140, 0x6814, 0xa706, 0x0110, 0x6800, 0x0cc8, 0x6820, 0xc0d5,
++	0x6822, 0x002e, 0x8210, 0x8109, 0x1d80, 0x00de, 0x7063, 0x0003,
++	0x707b, 0x0000, 0x7772, 0x707f, 0x000f, 0x71d0, 0xc1c4, 0x71d2,
++	0x6818, 0xa086, 0x0002, 0x1138, 0x6817, 0x0000, 0x682b, 0x0000,
++	0x681c, 0xc0ec, 0x681e, 0x080c, 0x1da2, 0x0804, 0x25a0, 0x7cd8,
++	0x7ddc, 0x7fd0, 0x080c, 0x30dc, 0x682b, 0x0000, 0x789b, 0x000e,
++	0x6f14, 0x080c, 0x3c4a, 0xa08c, 0x00ff, 0x6916, 0x6818, 0xd0fc,
++	0x0110, 0x7044, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x7063, 0x0000,
++	0x0804, 0x25a0, 0x7000, 0xa005, 0x1110, 0x0804, 0x25a0, 0xa006,
++	0x080c, 0x3f26, 0x6920, 0xd1ac, 0x1110, 0x681b, 0x0014, 0xa68c,
++	0xdf00, 0x691e, 0x682b, 0x0000, 0x6820, 0xa084, 0x00ff, 0x6822,
++	0x7000, 0x0002, 0x25a0, 0x324c, 0x324c, 0x324f, 0x324f, 0x324f,
++	0x324a, 0x324a, 0x080c, 0x254c, 0x6818, 0x0804, 0x2f18, 0x6008,
++	0xc0a4, 0x600a, 0x6817, 0x0000, 0x0804, 0x3772, 0x2300, 0x0002,
++	0x325b, 0x325d, 0x32ab, 0x080c, 0x254c, 0xd6fc, 0x1904, 0x2d38,
++	0x7000, 0xa00d, 0x0002, 0x25a0, 0x326d, 0x326d, 0x3297, 0x326d,
++	0x32a8, 0x326b, 0x326b, 0x080c, 0x254c, 0xa684, 0x0060, 0x0538,
++	0xa086, 0x0060, 0x1510, 0xc6ac, 0xc6f4, 0xc6ed, 0x7e5a, 0x6eb6,
++	0x681c, 0xc0ac, 0x681e, 0xa186, 0x0002, 0x0148, 0x080c, 0x3f26,
++	0x69ac, 0x68b0, 0xa115, 0x0118, 0x080c, 0x4206, 0x0010, 0x080c,
++	0x41d9, 0x781b, 0x0083, 0x71d0, 0xd1b4, 0x1904, 0x259d, 0x70a0,
++	0xa086, 0x0001, 0x1904, 0x25e1, 0x0005, 0xd6ec, 0x09f0, 0x6818,
++	0xd0fc, 0x0170, 0xd6f4, 0x1130, 0x681b, 0x0015, 0x781b, 0x0083,
++	0x0804, 0x259d, 0x681b, 0x0007, 0x682f, 0x0000, 0x6833, 0x0000,
++	0x080c, 0x3bf1, 0x0005, 0x080c, 0x254c, 0x2300, 0x0002, 0x32b4,
++	0x32d6, 0x332e, 0x080c, 0x254c, 0x7000, 0x0002, 0x32be, 0x32c0,
++	0x32c7, 0x32be, 0x32be, 0x32be, 0x32be, 0x32be, 0x080c, 0x254c,
++	0x69ac, 0x68b0, 0xa115, 0x0118, 0x080c, 0x4206, 0x0010, 0x080c,
++	0x41d9, 0x681c, 0xc0b4, 0x681e, 0x70d0, 0xd0b4, 0x1904, 0x259d,
++	0x70a0, 0xa086, 0x0001, 0x1904, 0x25e1, 0x0005, 0xd6fc, 0x1904,
++	0x331e, 0x7000, 0xa00d, 0x0002, 0x25a0, 0x32ec, 0x32e6, 0x3316,
++	0x32ec, 0x331b, 0x32e4, 0x32e4, 0x080c, 0x254c, 0x6894, 0x78d6,
++	0x78de, 0x6898, 0x78d2, 0x78da, 0xa684, 0x0060, 0x0538, 0xa086,
++	0x0060, 0x1510, 0xa6b4, 0xbfbf, 0xc6ed, 0x7e5a, 0x6eb6, 0xa186,
++	0x0002, 0x0148, 0x080c, 0x3f26, 0x69ac, 0x68b0, 0xa115, 0x0118,
++	0x080c, 0x4206, 0x0010, 0x080c, 0x41d9, 0x781b, 0x0083, 0x681c,
++	0xc0b4, 0x681e, 0x71d0, 0xd1b4, 0x1904, 0x259d, 0x70a0, 0xa086,
++	0x0001, 0x1904, 0x25e1, 0x0005, 0xd6ec, 0x09f0, 0x6818, 0xd0fc,
++	0x0110, 0x681b, 0x0007, 0x781b, 0x00fb, 0x0005, 0xc6fc, 0x7e5a,
++	0x7adc, 0x79d8, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200,
++	0xa303, 0x68ae, 0x79d2, 0x781b, 0x0083, 0x0005, 0xd6dc, 0x0130,
++	0x782b, 0x3009, 0x781b, 0x0083, 0x0804, 0x259d, 0x7884, 0xc0ac,
++	0x7886, 0x78e4, 0xa084, 0x0008, 0x1150, 0xa484, 0x0200, 0x0108,
++	0xc6f5, 0xc6dd, 0x7e5a, 0x781b, 0x0083, 0x0804, 0x259d, 0x6820,
++	0xc095, 0x6822, 0x080c, 0x3bdc, 0xc6dd, 0x080c, 0x3a3c, 0x781b,
++	0x0082, 0x0804, 0x259d, 0x2300, 0x0002, 0x3358, 0x335a, 0x335c,
++	0x080c, 0x254c, 0x0804, 0x3a36, 0x7d98, 0xd6d4, 0x15a8, 0x79e4,
++	0xd1ac, 0x0130, 0x78ec, 0xa084, 0x0003, 0x0110, 0x782b, 0x3009,
++	0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x7d9a,
++	0x79e4, 0xd1ac, 0x0120, 0x78ec, 0xa084, 0x0003, 0x1120, 0x2001,
++	0x0014, 0x0804, 0x2f18, 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007,
++	0x0090, 0xa184, 0x0007, 0xa086, 0x0004, 0x1118, 0x2001, 0x0000,
++	0x0050, 0xa184, 0x0007, 0xa086, 0x0005, 0x0118, 0xa184, 0x0007,
++	0x0010, 0x2001, 0x0001, 0x04c2, 0x7a90, 0xa294, 0x0007, 0x789b,
++	0x0060, 0x79a8, 0x81ff, 0x0568, 0x789b, 0x0080, 0x7ba8, 0xa384,
++	0x0001, 0x11d0, 0x7ba8, 0x7ba8, 0xa386, 0x0004, 0x1118, 0x2009,
++	0xffdf, 0x0058, 0xa386, 0x0001, 0x1118, 0x2009, 0xfff7, 0x0028,
++	0xa386, 0x0003, 0x1148, 0x2009, 0xffef, 0x00c6, 0x7054, 0x2060,
++	0x6004, 0xa104, 0x6006, 0x00ce, 0x789b, 0x0060, 0x78ab, 0x0000,
++	0xa684, 0xfffb, 0x785a, 0x782b, 0x3009, 0x6920, 0xa18c, 0xecff,
++	0x6922, 0x7d9a, 0x0804, 0x3be5, 0x2bae, 0x2bb7, 0x33d6, 0x33dc,
++	0x33d4, 0x33d4, 0x3be5, 0x3be5, 0x080c, 0x254c, 0x6920, 0xa18c,
++	0xfcff, 0x6922, 0x0804, 0x3beb, 0x6920, 0xa18c, 0xfcff, 0x6922,
++	0x0804, 0x3be5, 0x79e4, 0xa184, 0x0030, 0x0120, 0x78ec, 0xa084,
++	0x0003, 0x1570, 0x7000, 0xa086, 0x0004, 0x1190, 0x7060, 0xa086,
++	0x0002, 0x1130, 0x2011, 0x0002, 0x2019, 0x0000, 0x0804, 0x2a56,
++	0x7060, 0xa086, 0x0006, 0x0db0, 0x7060, 0xa086, 0x0004, 0x0d90,
++	0x7000, 0xa086, 0x0000, 0x0904, 0x259d, 0x6920, 0xa184, 0x0420,
++	0x0128, 0xc1d4, 0x6922, 0x6818, 0x0804, 0x2f18, 0x6818, 0xa08e,
++	0x0002, 0x0120, 0xc0fd, 0x681a, 0x2001, 0x0014, 0x0804, 0x2f18,
++	0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007, 0x0090, 0xa184, 0x0007,
++	0xa086, 0x0004, 0x1118, 0x2001, 0x0000, 0x0050, 0xa184, 0x0007,
++	0xa086, 0x0005, 0x0118, 0xa184, 0x0007, 0x0010, 0x2001, 0x0001,
++	0x0002, 0x3be5, 0x3be5, 0x3439, 0x3be5, 0x3c29, 0x3c29, 0x3be5,
++	0x3be5, 0xd6bc, 0x0570, 0x7180, 0x81ff, 0x0558, 0xa182, 0x000d,
++	0x1318, 0x7083, 0x0000, 0x0028, 0xa182, 0x000c, 0x7082, 0x2009,
++	0x000c, 0x789b, 0x0061, 0x79aa, 0x0156, 0x0136, 0x0146, 0x7084,
++	0x8114, 0xa210, 0x7286, 0xa080, 0x000b, 0xad00, 0x2098, 0xb284,
++	0x0600, 0x0118, 0x20a1, 0x022b, 0x0010, 0x20a1, 0x012b, 0x789b,
++	0x0000, 0x8108, 0x81ac, 0x53a6, 0x014e, 0x013e, 0x015e, 0x0804,
++	0x3beb, 0xd6d4, 0x1904, 0x34ac, 0x6820, 0xd084, 0x0904, 0x3beb,
++	0xa68c, 0x0060, 0xa684, 0x0060, 0x0120, 0xa086, 0x0060, 0x1108,
++	0xc1f5, 0xc194, 0x795a, 0x69b6, 0x789b, 0x0060, 0x78ab, 0x0000,
++	0x789b, 0x0061, 0x6818, 0xc0fd, 0x681a, 0x78aa, 0x8008, 0x810c,
++	0x0904, 0x37d3, 0xa18c, 0x00f8, 0x1904, 0x37d3, 0x0156, 0x0136,
++	0x0146, 0x0016, 0x20a1, 0x012b, 0x3208, 0xa18c, 0x0600, 0x0110,
++	0x20a1, 0x022b, 0x001e, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80,
++	0x000b, 0x2098, 0x53a6, 0x014e, 0x013e, 0x015e, 0x6814, 0xc0fc,
++	0x8007, 0x7882, 0x0804, 0x3beb, 0x6818, 0xd0fc, 0x0110, 0x681b,
++	0x0008, 0x080c, 0x3a3c, 0x781b, 0x00ed, 0x0005, 0x2300, 0x0002,
++	0x34bd, 0x357a, 0x34bb, 0x080c, 0x254c, 0x7cd8, 0x7ddc, 0x7fd0,
++	0x82ff, 0x1528, 0x7200, 0xa286, 0x0003, 0x0904, 0x2ee6, 0x71d0,
++	0xd1bc, 0x11f8, 0xd1b4, 0x01e8, 0x2001, 0x4601, 0x2004, 0xd0c4,
++	0x11c0, 0x00d6, 0x783b, 0x8800, 0x781b, 0x0059, 0x70b8, 0xa06d,
++	0x68b4, 0xc0a5, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2,
++	0x78da, 0xc1b4, 0x71d2, 0x7003, 0x0030, 0x00de, 0x0030, 0x7200,
++	0x0020, 0x783b, 0x1800, 0x781b, 0x0057, 0xa284, 0x000f, 0x0002,
++	0x3565, 0x3522, 0x34fa, 0x2f15, 0x34f8, 0x3565, 0x34f8, 0x34f8,
++	0x080c, 0x254c, 0x681c, 0xd0ec, 0x0118, 0x6008, 0xc08d, 0x600a,
++	0x6920, 0xc185, 0x6922, 0x6800, 0x6006, 0xa005, 0x1108, 0x6002,
++	0x6008, 0xc0d4, 0x600a, 0x681c, 0xa084, 0x000e, 0x1120, 0x71c8,
++	0xa188, 0x0100, 0x0028, 0x7030, 0x68ba, 0x713c, 0x70c8, 0xa108,
++	0x2104, 0x6802, 0x2d0a, 0x715a, 0xd6dc, 0x1120, 0xc6fc, 0x6eb6,
++	0x0804, 0x3565, 0x6eb6, 0xa684, 0x0060, 0x1120, 0xa684, 0x7fff,
++	0x68b6, 0x04d8, 0xd6dc, 0x1150, 0xa684, 0x7fff, 0x68b6, 0x6894,
++	0x68a6, 0x6898, 0x68aa, 0x080c, 0x3f26, 0x0478, 0xd6ac, 0x0140,
++	0xa006, 0x080c, 0x3f26, 0x2408, 0x2510, 0x69aa, 0x6aa6, 0x0068,
++	0x2408, 0x2510, 0x2700, 0x8007, 0xa084, 0x007f, 0xa108, 0xa291,
++	0x0000, 0x69aa, 0x6aa6, 0x080c, 0x3f26, 0xd6fc, 0x01b0, 0xa684,
++	0x7fff, 0x68b6, 0x2510, 0x2408, 0xd6ac, 0x1138, 0x2700, 0x8007,
++	0xa084, 0x007f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302,
++	0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x7000, 0xa086, 0x0030,
++	0x1904, 0x25a0, 0x7003, 0x0002, 0x70b8, 0xa06d, 0x68bc, 0x703e,
++	0x70b4, 0xa065, 0x68c0, 0x7056, 0x2d00, 0x704a, 0xad80, 0x0009,
++	0x7042, 0x0005, 0xa586, 0x8800, 0x1148, 0x7003, 0x0000, 0x6018,
++	0x8001, 0x601a, 0x6008, 0xa084, 0xfbef, 0x600a, 0x0804, 0x3a36,
++	0x7043, 0x0000, 0xa282, 0x0006, 0x0310, 0x080c, 0x254c, 0x2300,
++	0x0002, 0x3594, 0x35a5, 0x35af, 0x2200, 0x0002, 0x359c, 0x3a36,
++	0x359e, 0x359c, 0x35e0, 0x362e, 0x080c, 0x254c, 0x7a80, 0xa294,
++	0x0f00, 0x080c, 0x3682, 0x0804, 0x3a0b, 0x00c1, 0x0002, 0x3a36,
++	0x35ad, 0x35ad, 0x35e0, 0x35ad, 0x3a36, 0x080c, 0x254c, 0x0071,
++	0x0002, 0x35b9, 0x35b7, 0x35b7, 0x35b9, 0x35b7, 0x35b9, 0x080c,
++	0x254c, 0x080c, 0x3a4b, 0x781b, 0x0082, 0x0005, 0x7000, 0xa086,
++	0x0002, 0x1150, 0x080c, 0x37be, 0x0010, 0x080c, 0x3f26, 0x6008,
++	0xa084, 0xfbef, 0x600a, 0x0020, 0x7000, 0xa086, 0x0003, 0x0da8,
++	0x7003, 0x0005, 0x2001, 0x8de0, 0xae8e, 0x4640, 0x0110, 0x2001,
++	0x8e12, 0x2068, 0x704a, 0xad80, 0x0009, 0x7042, 0x2200, 0x0005,
++	0x7000, 0xa086, 0x0002, 0x1158, 0x70d0, 0xc0b5, 0x70d2, 0x2c00,
++	0x70b6, 0x2d00, 0x70ba, 0x0038, 0x080c, 0x3f26, 0x0020, 0x7000,
++	0xa086, 0x0003, 0x0dc8, 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00,
++	0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0x2069, 0x8cc0,
++	0xb284, 0x0600, 0x1118, 0xc2fd, 0x2069, 0x8dd0, 0x2d04, 0x2d08,
++	0x715a, 0xa06d, 0x0128, 0x6814, 0xa206, 0x0120, 0x6800, 0x0cb8,
++	0x080c, 0x3682, 0x6eb4, 0x7e5a, 0x6920, 0xa184, 0x0c00, 0x0904,
++	0x36a8, 0x7060, 0xa086, 0x0006, 0x1128, 0x7070, 0xa206, 0x1110,
++	0x7062, 0x707a, 0x681b, 0x0005, 0xc1ad, 0x681b, 0x0005, 0xc1ad,
++	0xc1d4, 0x6922, 0x080c, 0x3a42, 0x0804, 0x36a8, 0x7200, 0xa286,
++	0x0002, 0x1158, 0x70d0, 0xc0b5, 0x70d2, 0x2c00, 0x70b6, 0x2d00,
++	0x70ba, 0x0030, 0x080c, 0x3f26, 0x0018, 0xa286, 0x0003, 0x0dd0,
++	0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8,
++	0xa484, 0x001f, 0xa215, 0xae86, 0x4640, 0x0108, 0xc2fd, 0x79a8,
++	0x79a8, 0xa18c, 0x00ff, 0x2118, 0x70c8, 0xa168, 0x2d04, 0x2d08,
++	0x715a, 0xa06d, 0x0128, 0x6814, 0xa206, 0x0118, 0x6800, 0x0cb8,
++	0x0409, 0x6eb4, 0x6920, 0xa184, 0x0c00, 0x0904, 0x36a8, 0xd0dc,
++	0x0178, 0x7060, 0xa086, 0x0004, 0x1140, 0x7070, 0xa206, 0x1128,
++	0x7074, 0xa306, 0x1110, 0x7062, 0x707a, 0x080c, 0x3a48, 0x0480,
++	0x681b, 0x0005, 0xc1ad, 0xc1d4, 0x6922, 0x080c, 0x3a42, 0x707b,
++	0x0000, 0x0430, 0x7003, 0x0005, 0xb284, 0x0600, 0x0118, 0x2001,
++	0x8de0, 0x0010, 0x2001, 0x8e12, 0x2068, 0x704a, 0x0156, 0x20a9,
++	0x0032, 0x2003, 0x0000, 0x8000, 0x1f04, 0x3691, 0x015e, 0xb284,
++	0x0600, 0x0110, 0xc2fc, 0x0008, 0xc2fd, 0x6a16, 0xad80, 0x0009,
++	0x7042, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x0005,
++	0xc6ec, 0xa6ac, 0x0060, 0x0904, 0x36ef, 0x6b98, 0x6c94, 0x69ac,
++	0x68b0, 0xa105, 0x11e0, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa586,
++	0x0060, 0x05c8, 0xd6f4, 0x1108, 0xc6ed, 0xa6b4, 0xb7ff, 0x7e5a,
++	0x2009, 0x0083, 0xd69c, 0x0128, 0x2009, 0x0082, 0x2019, 0x0000,
++	0x2320, 0x791a, 0xd6ec, 0x0588, 0x080c, 0x41d9, 0x0470, 0x68b0,
++	0xa31a, 0x2100, 0xa423, 0x2400, 0xa305, 0x01f8, 0x7bd2, 0x7bda,
++	0x7cd6, 0x7cde, 0x68b0, 0xd6f4, 0x1108, 0xc6ed, 0xc6f4, 0x7e5a,
++	0x2011, 0x0083, 0xd69c, 0x0128, 0x2011, 0x0082, 0x2019, 0x0000,
++	0x2320, 0x7a1a, 0xd6ec, 0x0188, 0x080c, 0x4206, 0x0070, 0x2019,
++	0x0000, 0x2320, 0x0010, 0xa6b4, 0xb7ff, 0x7e5a, 0x2009, 0x0083,
++	0xd69c, 0x0110, 0x2009, 0x0082, 0x791a, 0x68c0, 0x7056, 0x2d00,
++	0x704a, 0x68c4, 0x2060, 0x71d0, 0x2001, 0x4601, 0x2004, 0xd0c4,
++	0x15c8, 0x70d4, 0xa02d, 0x01b8, 0xd1bc, 0x0548, 0x7a80, 0xa294,
++	0x0f00, 0x70d8, 0xa206, 0x0118, 0x78e0, 0xa504, 0x1558, 0x70d6,
++	0xc1bc, 0x71d2, 0x0438, 0x2031, 0x0001, 0x852c, 0x0218, 0x8633,
++	0x8210, 0x0cd8, 0x0005, 0x7de0, 0xa594, 0xff00, 0x0130, 0x2011,
++	0x0008, 0x852f, 0x0c81, 0x8637, 0x0008, 0x0c69, 0x8217, 0x7880,
++	0xa084, 0x0f00, 0xa206, 0x0170, 0x72da, 0x76d6, 0x0058, 0x7a80,
++	0xa294, 0x0f00, 0x70d8, 0xa236, 0x0dc0, 0x78e0, 0xa534, 0x0da8,
++	0xc1bd, 0x71d2, 0xd1b4, 0x1904, 0x259d, 0x2300, 0xa405, 0x0904,
++	0x259d, 0x70a0, 0xa086, 0x0001, 0x1904, 0x25e1, 0x0005, 0x6020,
++	0xa005, 0x0150, 0x8001, 0x6022, 0x6008, 0xa085, 0x0008, 0x600a,
++	0x700f, 0x0100, 0x702c, 0x6026, 0x0005, 0xa006, 0x080c, 0x3f26,
++	0x7000, 0xa086, 0x0002, 0x0120, 0x7060, 0xa086, 0x0005, 0x1150,
++	0x682b, 0x0000, 0x6817, 0x0000, 0x681b, 0x0001, 0x6823, 0x0040,
++	0x681f, 0x0100, 0x7000, 0xa084, 0x000f, 0x0002, 0x25a0, 0x3783,
++	0x3780, 0x37a0, 0x378c, 0x25a0, 0x377e, 0x377e, 0x080c, 0x254c,
++	0x0449, 0x0411, 0x0028, 0x0431, 0x7058, 0x2060, 0x6800, 0x6002,
++	0x080c, 0x1da2, 0x0804, 0x25a0, 0x7060, 0x7063, 0x0000, 0x707f,
++	0x0000, 0x0002, 0x379c, 0x379c, 0x379a, 0x379a, 0x379a, 0x379c,
++	0x379a, 0x379c, 0x0804, 0x2a6b, 0x7063, 0x0000, 0x0804, 0x25a0,
++	0x681b, 0x0000, 0x0804, 0x3184, 0x6800, 0xa005, 0x1108, 0x6002,
++	0x6006, 0x0005, 0x6410, 0x84ff, 0x0168, 0x2009, 0x4602, 0x2104,
++	0x8001, 0x200a, 0x8421, 0x6412, 0x1128, 0x2021, 0x4604, 0x2404,
++	0xc0a5, 0x2022, 0x6008, 0xc0a4, 0x600a, 0x0005, 0x6018, 0xa005,
++	0x0110, 0x8001, 0x601a, 0x0005, 0x080c, 0x3c46, 0x681b, 0x0018,
++	0x0490, 0x080c, 0x3c46, 0x681b, 0x0019, 0x0468, 0x080c, 0x3c46,
++	0x681b, 0x001a, 0x0440, 0x080c, 0x3c46, 0x681b, 0x0003, 0x0418,
++	0x7770, 0x080c, 0x3b6f, 0x7174, 0xa18c, 0x00ff, 0x3210, 0xa294,
++	0x0600, 0x0118, 0xa1e8, 0x8bc0, 0x0010, 0xa1e8, 0x8cd0, 0x2d04,
++	0x2d08, 0x2068, 0xa005, 0x1118, 0x707a, 0x0804, 0x25a0, 0x6814,
++	0x7270, 0xa206, 0x0110, 0x6800, 0x0c98, 0x6800, 0x200a, 0x681b,
++	0x0005, 0x707b, 0x0000, 0x080c, 0x37aa, 0x6820, 0xd084, 0x1110,
++	0x080c, 0x37a4, 0x080c, 0x37be, 0x681f, 0x0000, 0x6823, 0x0020,
++	0x080c, 0x1da2, 0x0804, 0x25a0, 0xa282, 0x0003, 0x1904, 0x3a10,
++	0x7da8, 0xa5ac, 0x00ff, 0x7ea8, 0xa6b4, 0x00ff, 0x6920, 0xc1bd,
++	0x6922, 0xd1c4, 0x05b0, 0xc1c4, 0x6922, 0xa6b4, 0x00ff, 0x0530,
++	0xa682, 0x0018, 0x0218, 0x0110, 0x2031, 0x0018, 0xa686, 0x0010,
++	0x1108, 0x8630, 0x852b, 0x852b, 0x2041, 0x0000, 0x080c, 0x3ac9,
++	0x0118, 0x080c, 0x38f7, 0x00a0, 0x080c, 0x3a95, 0x080c, 0x38f4,
++	0x6920, 0xc1c5, 0x6922, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x1118,
++	0x781b, 0x006e, 0x0005, 0x781b, 0x0082, 0x0005, 0x080c, 0x38f4,
++	0x7e58, 0xd6d4, 0x1118, 0x781b, 0x0071, 0x0005, 0x781b, 0x0083,
++	0x0005, 0x00c6, 0x7054, 0x2060, 0x6100, 0xd1e4, 0x0598, 0x6208,
++	0x8217, 0xa294, 0x00ff, 0xa282, 0x0018, 0x0218, 0x0110, 0x2011,
++	0x0018, 0x2600, 0xa202, 0x1208, 0x2230, 0xa686, 0x0010, 0x1108,
++	0x8630, 0x6208, 0xa294, 0x00ff, 0x78ec, 0xd0e4, 0x0130, 0xa282,
++	0x000a, 0x1240, 0x2011, 0x000a, 0x0028, 0xa282, 0x000c, 0x1210,
++	0x2011, 0x000c, 0x2200, 0xa502, 0x1208, 0x2228, 0x080c, 0x3a99,
++	0x852b, 0x852b, 0x2041, 0x0000, 0x080c, 0x3ac9, 0x0118, 0x080c,
++	0x38f7, 0x0020, 0x080c, 0x3a95, 0x080c, 0x38f4, 0x7858, 0xc095,
++	0x785a, 0x00ce, 0x781b, 0x0082, 0x0005, 0x00c6, 0x2960, 0x6000,
++	0xd0e4, 0x1188, 0xd0b4, 0x1150, 0x6010, 0xa084, 0x000f, 0x1130,
++	0x6104, 0xa18c, 0xfff5, 0x6106, 0x00ce, 0x0005, 0x2011, 0x0032,
++	0x2019, 0x0000, 0x00f0, 0x68a0, 0xd0cc, 0x1dc0, 0x6208, 0xa294,
++	0x00ff, 0x78ec, 0xd0e4, 0x0130, 0xa282, 0x000b, 0x1218, 0x2011,
++	0x000a, 0x0028, 0xa282, 0x000c, 0x1210, 0x2011, 0x000c, 0x6308,
++	0x831f, 0xa39c, 0x00ff, 0xa382, 0x0018, 0x0218, 0x0110, 0x2019,
++	0x0018, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa,
++	0x7baa, 0xa8c0, 0x0005, 0x6820, 0xc0c5, 0x6822, 0x080c, 0x3a55,
++	0x00ce, 0x0005, 0x00c6, 0x2960, 0x6104, 0xa18c, 0xfff5, 0x6106,
++	0x2011, 0x0032, 0x2019, 0x0000, 0x0000, 0x78ab, 0x0001, 0x78ab,
++	0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820,
++	0xc0c5, 0x6822, 0x00ce, 0x0005, 0xa006, 0x2030, 0x2010, 0x00c6,
++	0x7154, 0x2160, 0x2018, 0x2008, 0xa084, 0xffe0, 0xa635, 0x7e86,
++	0x6018, 0x789a, 0x7eae, 0x6612, 0x78a4, 0xa084, 0x7770, 0xa18c,
++	0x000f, 0xa105, 0x2029, 0x4605, 0x252c, 0xd5cc, 0x0140, 0xd3a4,
++	0x0110, 0xa085, 0x0800, 0xd3fc, 0x0110, 0xa085, 0x8080, 0x78a6,
++	0x6016, 0x788a, 0xa6b4, 0x001f, 0x8637, 0x8204, 0x8004, 0xa605,
++	0x600e, 0x6004, 0xa084, 0xffd5, 0x6006, 0x00ce, 0x0005, 0xa282,
++	0x0002, 0x1904, 0x3a1a, 0x7aa8, 0x6920, 0xc1bd, 0x6922, 0xd1cc,
++	0x0568, 0xc1cc, 0x6922, 0xa294, 0x00ff, 0xa282, 0x0002, 0x1a04,
++	0x3a0b, 0x080c, 0x399e, 0x080c, 0x38f4, 0xa980, 0x0001, 0x200c,
++	0x080c, 0x3b6b, 0x080c, 0x3895, 0x88ff, 0x0178, 0x789b, 0x0060,
++	0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x1118, 0x781b,
++	0x006e, 0x0005, 0x781b, 0x0082, 0x0005, 0x7e58, 0xd6d4, 0x1118,
++	0x781b, 0x0071, 0x0005, 0x781b, 0x0083, 0x0005, 0xa282, 0x0002,
++	0x1218, 0xa284, 0x0001, 0x0140, 0x7154, 0xa188, 0x0000, 0x210c,
++	0xd1ec, 0x1110, 0x2011, 0x0000, 0x080c, 0x3a87, 0x0479, 0x080c,
++	0x38f4, 0x7858, 0xc095, 0x785a, 0x781b, 0x0082, 0x0005, 0x00c6,
++	0x0026, 0x2960, 0x6000, 0x2011, 0x0001, 0xd0ec, 0x1158, 0xd0bc,
++	0x1138, 0x6014, 0xd0b4, 0x1120, 0xc1a4, 0x6106, 0xa006, 0x0088,
++	0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003,
++	0x7aaa, 0xa8c0, 0x0004, 0x080c, 0x3a55, 0x6820, 0xa085, 0x0200,
++	0x6822, 0x002e, 0x00ce, 0x0005, 0x8807, 0xa715, 0x00c6, 0x2009,
++	0x0000, 0x7054, 0x2060, 0x82ff, 0x0110, 0x2009, 0x0040, 0x6018,
++	0xa080, 0x0002, 0x789a, 0x78a4, 0xa084, 0xff9f, 0xa105, 0xc0ec,
++	0xd0b4, 0x1108, 0xc0ed, 0x6100, 0xd1f4, 0x0110, 0xa085, 0x0020,
++	0x78a6, 0x6016, 0x788a, 0x6004, 0xa084, 0xffef, 0x6006, 0x00ce,
++	0x0005, 0x0006, 0x7000, 0xa086, 0x0003, 0x0110, 0x000e, 0x0010,
++	0x000e, 0x0488, 0xd6ac, 0x0578, 0x7888, 0xa084, 0x0040, 0x0558,
++	0x7bb8, 0x8307, 0xa084, 0x007f, 0x1508, 0x8207, 0xa084, 0x00ff,
++	0xa09e, 0x0001, 0x1904, 0x3a32, 0xd6f4, 0x11d0, 0x79d8, 0x7adc,
++	0xa108, 0xa291, 0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x080c,
++	0x42b5, 0x781b, 0x0080, 0xb284, 0x0600, 0x0118, 0x2001, 0x0000,
++	0x0010, 0x2001, 0x0001, 0x080c, 0x4172, 0x0005, 0x080c, 0x254c,
++	0x781b, 0x0080, 0x0005, 0x781b, 0x0083, 0x0005, 0x2039, 0x0000,
++	0x2041, 0x0000, 0x2031, 0x0000, 0xa006, 0x2010, 0x080c, 0x38f7,
++	0x080c, 0x399c, 0x7e58, 0x080c, 0x3a4e, 0x781b, 0x0082, 0x0005,
++	0x0cd1, 0x6820, 0xc0c4, 0x6822, 0x00c6, 0x7054, 0x2060, 0x080c,
++	0x3921, 0x00b0, 0x0c81, 0x6820, 0xc0cc, 0x6822, 0x00c6, 0x7054,
++	0x2060, 0x080c, 0x39bb, 0x0060, 0x0c31, 0x6820, 0xa084, 0xecff,
++	0x6822, 0x00c6, 0x7054, 0x2060, 0x6004, 0xa084, 0xffc5, 0x6006,
++	0x00ce, 0x0005, 0x0049, 0x781b, 0x0082, 0x0005, 0x6827, 0x0002,
++	0x0049, 0x781b, 0x0082, 0x0005, 0x2001, 0x0005, 0x0088, 0x2001,
++	0x000c, 0x0070, 0x6820, 0xc0d5, 0x6822, 0x2001, 0x0006, 0x0040,
++	0x2001, 0x000d, 0x0028, 0x2001, 0x0009, 0x0010, 0x2001, 0x0007,
++	0x789b, 0x007e, 0x78aa, 0xc69d, 0x7e5a, 0x70d0, 0xd0b4, 0x0168,
++	0xc0b4, 0x70d2, 0x00c6, 0x70b4, 0xa065, 0x6008, 0xa084, 0xfbef,
++	0x600a, 0x6018, 0x8001, 0x601a, 0x00ce, 0x0005, 0x0076, 0x873f,
++	0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0xa0e0, 0x4ac0, 0xae8e,
++	0x4640, 0x0110, 0xa0e0, 0x4b40, 0xa7b8, 0x0020, 0x7f9a, 0x79a4,
++	0xa184, 0x7fe0, 0x78ae, 0x6012, 0x79a4, 0xa184, 0x773f, 0x78a6,
++	0x6016, 0x6004, 0xa085, 0x0038, 0x6006, 0x007e, 0x0005, 0x789b,
++	0x0080, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa,
++	0x789b, 0x0060, 0x78ab, 0x0004, 0x0800, 0x2031, 0x0000, 0x2029,
++	0x0032, 0x789b, 0x0080, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
++	0x0001, 0x7daa, 0x7eaa, 0x789b, 0x0060, 0x78ab, 0x0005, 0x0804,
++	0x3a55, 0x0156, 0x8007, 0xa084, 0x00ff, 0x8003, 0x8003, 0xa080,
++	0x0020, 0x789a, 0x79a4, 0xa18c, 0xffe0, 0x2021, 0x3b54, 0x2019,
++	0x0011, 0x20a9, 0x000e, 0x2011, 0x0032, 0x2404, 0xa084, 0xffe0,
++	0xa106, 0x0128, 0x8420, 0x2300, 0xa210, 0x1f04, 0x3abd, 0x015e,
++	0x0005, 0x0156, 0x04f8, 0x2021, 0x3b62, 0x20a9, 0x0009, 0x2011,
++	0x0029, 0xa582, 0x0028, 0x0550, 0x8420, 0x95a9, 0x2011, 0x0033,
++	0xa582, 0x0033, 0x0618, 0x8420, 0x95a9, 0x2019, 0x000a, 0x2011,
++	0x0065, 0x2200, 0xa502, 0x02d0, 0x8420, 0x2300, 0xa210, 0x1f04,
++	0x3ae1, 0x015e, 0x0088, 0x2021, 0x3b54, 0x2019, 0x0011, 0x20a9,
++	0x000e, 0x2011, 0x0033, 0x2200, 0xa502, 0x0240, 0x8420, 0x2300,
++	0xa210, 0x1f04, 0x3af3, 0x015e, 0xa006, 0x0005, 0x8211, 0x015e,
++	0xa582, 0x0064, 0x1220, 0x7808, 0xa085, 0x0070, 0x780a, 0x2404,
++	0xa005, 0x0005, 0xa886, 0x0002, 0x01e8, 0x2021, 0x3b40, 0x20a9,
++	0x000d, 0x2011, 0x0028, 0xa582, 0x0028, 0x0d48, 0x8420, 0x2019,
++	0x0019, 0x2011, 0x0033, 0x2200, 0xa502, 0x0e00, 0x8420, 0x2300,
++	0xa210, 0x1f04, 0x3b1b, 0x015e, 0x2011, 0x0184, 0xa582, 0x0185,
++	0x0ab0, 0x0890, 0x2021, 0x3b4f, 0x20a9, 0x0003, 0x2011, 0x0024,
++	0xa586, 0x0024, 0x0960, 0x8420, 0x2011, 0x0028, 0xa586, 0x0028,
++	0x0930, 0x8420, 0x2019, 0x0019, 0x2011, 0x0033, 0x0804, 0x3af3,
++	0x1021, 0x2202, 0x3403, 0x4604, 0x5805, 0x6a06, 0x7c07, 0x4610,
++	0x4612, 0x5812, 0x5a12, 0x6a14, 0x6c14, 0x6e14, 0x7e17, 0x9021,
++	0xb002, 0xe204, 0xe210, 0xe210, 0x1209, 0x3002, 0x3202, 0x4203,
++	0x4403, 0x5404, 0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07,
++	0x0c07, 0x0e07, 0x10e1, 0x330a, 0x5805, 0x5a05, 0x6a06, 0x6c06,
++	0x7c07, 0x7e07, 0x0e00, 0x789b, 0x0080, 0xa046, 0x0005, 0xa784,
++	0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003,
++	0xa105, 0xd7fc, 0x0118, 0xa0e0, 0x6bc0, 0x0010, 0xa0e0, 0x4bc0,
++	0x0005, 0x00e6, 0x00f6, 0xd084, 0x0138, 0x2079, 0x0100, 0x2009,
++	0x4680, 0x2071, 0x4680, 0x0030, 0x2009, 0x4640, 0x2079, 0x0200,
++	0x2071, 0x4640, 0x2091, 0x8000, 0x2104, 0xa084, 0x000f, 0x0002,
++	0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba0, 0x3ba0,
++	0x080c, 0x254c, 0x69b4, 0xc1f5, 0xa18c, 0xff9f, 0x69b6, 0xa005,
++	0x0580, 0x7858, 0xa084, 0xff9f, 0xa085, 0x6000, 0x785a, 0x7828,
++	0xa086, 0x1814, 0x1530, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004,
++	0x1de0, 0x784b, 0x0008, 0x7848, 0xa084, 0x0008, 0x1de0, 0x7830,
++	0xd0bc, 0x11b8, 0xb284, 0x0800, 0x0118, 0x0104, 0x3bd9, 0x0010,
++	0x0304, 0x3bd9, 0x79e4, 0xa184, 0x0030, 0x0158, 0x78ec, 0xa084,
++	0x0003, 0x0138, 0x681c, 0xd0ac, 0x1110, 0x00d9, 0x0010, 0x781b,
++	0x00fb, 0x00fe, 0x00ee, 0x0005, 0x2001, 0x4601, 0x2004, 0xd0ac,
++	0x1118, 0x6814, 0x080c, 0x2475, 0x0005, 0x781b, 0x0083, 0x0005,
++	0x781b, 0x0082, 0x0005, 0x781b, 0x0071, 0x0005, 0x781b, 0x006e,
++	0x0005, 0x2009, 0x4619, 0x210c, 0xa186, 0x0000, 0x0150, 0xa186,
++	0x0001, 0x0150, 0x701f, 0x000b, 0x7063, 0x0001, 0x781b, 0x0054,
++	0x0005, 0x781b, 0x00f3, 0x0005, 0x701f, 0x000a, 0x0005, 0x2009,
++	0x4619, 0x210c, 0xa186, 0x0000, 0x0168, 0xa186, 0x0001, 0x0138,
++	0x701f, 0x000b, 0x7063, 0x0001, 0x781b, 0x0054, 0x0005, 0x701f,
++	0x000a, 0x0005, 0x781b, 0x00f2, 0x0005, 0x781b, 0x00fb, 0x0005,
++	0x781b, 0x00fa, 0x0005, 0x781b, 0x00cc, 0x0005, 0x781b, 0x00cb,
++	0x0005, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d, 0x7063, 0x0001,
++	0x781b, 0x0054, 0x0005, 0x7830, 0xa084, 0x00c0, 0x1170, 0x7808,
++	0xc08c, 0x780a, 0xe000, 0xe000, 0xe000, 0xe000, 0x78ec, 0xa084,
++	0x0021, 0x0118, 0x7808, 0xc08d, 0x780a, 0x0005, 0x7808, 0xc08d,
++	0x780a, 0x0005, 0x7830, 0xa084, 0x0040, 0x1de0, 0xb284, 0x0800,
++	0x0118, 0x1104, 0x3c58, 0x0010, 0x1304, 0x3c58, 0x78ac, 0x0005,
++	0x7808, 0xa084, 0xfffd, 0x780a, 0xe000, 0xe000, 0xe000, 0xe000,
++	0x78ec, 0xa084, 0x0021, 0x0140, 0xb284, 0x0800, 0x0118, 0x1104,
++	0x3c67, 0x0010, 0x1304, 0x3c6a, 0x78ac, 0x0006, 0x7808, 0xa085,
++	0x0002, 0x780a, 0x000e, 0x0005, 0xa784, 0x0001, 0x1904, 0x322a,
++	0xa784, 0x0070, 0x0140, 0x00c6, 0x2d60, 0x2f68, 0x080c, 0x2467,
++	0x2d78, 0x2c68, 0x00ce, 0xa784, 0x0008, 0x0148, 0x784b, 0x0008,
++	0x78ec, 0xa084, 0x0003, 0x0904, 0x322a, 0x0804, 0x3be5, 0xa784,
++	0x0004, 0x01c8, 0x78b8, 0xa084, 0x8000, 0x01a8, 0x784b, 0x0008,
++	0x78ec, 0xa084, 0x0003, 0x0904, 0x322a, 0x78e4, 0xa084, 0x0007,
++	0xa086, 0x0001, 0x1140, 0x78c0, 0xa685, 0x4800, 0x2030, 0x7e5a,
++	0x781b, 0x00fb, 0x0005, 0xa784, 0x0080, 0x0140, 0x7884, 0xd0fc,
++	0x0128, 0x080c, 0x3a32, 0x681b, 0x0022, 0x0005, 0x681b, 0x0003,
++	0x7858, 0xa084, 0x5f00, 0x681e, 0x682f, 0x0000, 0x6833, 0x0000,
++	0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0904, 0x2b89, 0xb284,
++	0x0800, 0x0110, 0x0104, 0x259d, 0x0304, 0x259d, 0x6b14, 0x8307,
++	0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xd3fc, 0x0118, 0xa080,
++	0x4b40, 0x0010, 0xa080, 0x4ac0, 0x2060, 0x2048, 0x7056, 0x2a60,
++	0x0005, 0x00c6, 0x2960, 0x6000, 0xd0ac, 0x0904, 0x3d2f, 0x68a0,
++	0xd1ac, 0x1120, 0xa084, 0x0e00, 0x0904, 0x3d2d, 0x6108, 0x8117,
++	0xa18c, 0x00ff, 0x631c, 0x832f, 0xd0dc, 0x0110, 0xa39d, 0x0001,
++	0xd0cc, 0x11c8, 0xa584, 0x00ff, 0x0138, 0x78ec, 0xd0e4, 0x0110,
++	0x8213, 0x00b8, 0x2029, 0x0000, 0xa182, 0x000c, 0x1290, 0x78ec,
++	0xd0e4, 0x1118, 0x2009, 0x000c, 0x0060, 0xa182, 0x000b, 0x1248,
++	0x2009, 0x000a, 0x0030, 0x2009, 0x0032, 0x2011, 0x0000, 0x2029,
++	0x0000, 0x78ab, 0x0001, 0x78ab, 0x0006, 0x78ab, 0x0004, 0x79aa,
++	0x78ab, 0x0000, 0x7aaa, 0x7baa, 0x7daa, 0xa8c0, 0x0008, 0x6820,
++	0xa085, 0x1000, 0x6822, 0x080c, 0x3a55, 0xa085, 0x0001, 0x00ce,
++	0x0005, 0xa282, 0x0006, 0x1904, 0x3a24, 0x7da8, 0x7eac, 0x8637,
++	0xa5ac, 0x00ff, 0xa6b4, 0x00ff, 0x7fac, 0x8747, 0xa7bc, 0x00ff,
++	0xa8c4, 0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1e4, 0x0904, 0x3da3,
++	0xa18c, 0xecff, 0x6922, 0xa782, 0x0002, 0x1a04, 0x39fe, 0xa6b4,
++	0x00ff, 0x0904, 0x3da0, 0xa682, 0x0031, 0x1a04, 0x39fe, 0xa582,
++	0x0009, 0x0a04, 0x39fe, 0xa882, 0x0003, 0x1a04, 0x39fe, 0xa886,
++	0x0002, 0x01d0, 0xa886, 0x0000, 0x1904, 0x39fe, 0x2001, 0x000c,
++	0x79ec, 0xd1e4, 0x0110, 0x2001, 0x000a, 0xa502, 0x1290, 0x080c,
++	0x39fe, 0x00c6, 0x2960, 0x6004, 0xa085, 0x001a, 0x6006, 0x6000,
++	0xc0ac, 0x6002, 0x00ce, 0x0005, 0xa786, 0x0000, 0x0904, 0x39fe,
++	0x8634, 0xa682, 0x0018, 0x0228, 0x0120, 0x2031, 0x0018, 0x0804,
++	0x3df1, 0xa686, 0x0010, 0x1108, 0x8630, 0x852b, 0x852b, 0x080c,
++	0x3ac9, 0x0904, 0x39fe, 0x080c, 0x38f7, 0x080c, 0x399c, 0x7e58,
++	0xd6d4, 0x1118, 0x781b, 0x0071, 0x0005, 0x781b, 0x0083, 0x0005,
++	0x080c, 0x38f4, 0x0c90, 0xa886, 0x0002, 0x1108, 0x8634, 0x7154,
++	0xa188, 0x0000, 0x210c, 0xd1ac, 0x0904, 0x39fe, 0xd1ec, 0x1120,
++	0x2039, 0x0000, 0x2041, 0x0000, 0xd1e4, 0x1120, 0x2031, 0x0000,
++	0x2041, 0x0000, 0xa782, 0x0002, 0x12c8, 0x621c, 0xa284, 0x00ff,
++	0xa706, 0x0110, 0x2039, 0x0000, 0xa605, 0x0190, 0x6108, 0x811f,
++	0xa39c, 0x00ff, 0x0168, 0xa302, 0x1208, 0x2330, 0x8807, 0xa705,
++	0xa086, 0x0201, 0x0160, 0xa886, 0x0000, 0x0168, 0x2039, 0x0000,
++	0x2041, 0x0000, 0x2031, 0x0000, 0xa006, 0x2010, 0x0070, 0xa284,
++	0xff00, 0x1108, 0x2040, 0xa184, 0x00ff, 0xa502, 0x0108, 0x2128,
++	0x852b, 0x852b, 0x080c, 0x3ac9, 0x0d58, 0x080c, 0x38f7, 0x080c,
++	0x399c, 0x789b, 0x0080, 0x78ab, 0x0001, 0x78ab, 0x0006, 0x78ab,
++	0x0004, 0x7daa, 0x78ab, 0x0000, 0x7eaa, 0x7faa, 0x2800, 0x78aa,
++	0x789b, 0x0060, 0x78ab, 0x0008, 0x6820, 0xc0e5, 0x6822, 0x080c,
++	0x3a55, 0x7858, 0xc095, 0x785a, 0x781b, 0x0082, 0x0005, 0x0020,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++	0x0020, 0x0062, 0x0009, 0x0014, 0x0014, 0x9855, 0x984d, 0x0014,
++	0x9911, 0x98ff, 0x0014, 0x0014, 0x0090, 0x00e7, 0x0100, 0x0402,
++	0x2008, 0xf880, 0x0018, 0x0017, 0x840f, 0xd8c1, 0x0014, 0x0016,
++	0xa20a, 0x0014, 0x300b, 0xa20c, 0x0014, 0x2500, 0x0013, 0x2500,
++	0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
++	0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0xa200, 0x3806,
++	0x8839, 0x20c4, 0x0864, 0xa850, 0x3008, 0x28c1, 0x9d18, 0xa201,
++	0x300c, 0x2847, 0x8161, 0x846a, 0x8000, 0x84a4, 0x1856, 0x883a,
++	0xa808, 0x28e2, 0x9cce, 0xa8f3, 0x0864, 0xa83e, 0x300c, 0xa801,
++	0x3008, 0x28e1, 0x9cce, 0x28a2, 0x7163, 0xa831, 0x2021, 0xa818,
++	0xa205, 0x870c, 0xd8de, 0x64a0, 0x6de0, 0x6fc0, 0x67a4, 0x6c80,
++	0x0212, 0xa205, 0x883d, 0x882b, 0x1814, 0x883b, 0x7027, 0x85f2,
++	0xa737, 0xa532, 0xf003, 0x8576, 0x8677, 0xa813, 0x883e, 0xa811,
++	0x2882, 0x7162, 0xa814, 0x280a, 0xa204, 0x64c0, 0x6de0, 0x67a0,
++	0x6fc0, 0x1814, 0x883b, 0x7023, 0x8576, 0x8677, 0xa802, 0x7861,
++	0x883e, 0x206a, 0x28c1, 0x9d18, 0x2042, 0x2101, 0xa8ca, 0x2902,
++	0xa20e, 0xa80b, 0xa207, 0x0014, 0xa203, 0x8000, 0x85a4, 0x1872,
++	0x879a, 0x883c, 0x1fe2, 0xf601, 0xa208, 0x856e, 0x7121, 0x0014,
++	0x0704, 0x3008, 0x9cce, 0x0014, 0xa202, 0x8000, 0x85a4, 0x3009,
++	0x84a8, 0x19e2, 0xf844, 0x856e, 0x883f, 0x08e6, 0xa8f5, 0xf861,
++	0xa8eb, 0xf801, 0x0014, 0xf881, 0x0016, 0x85b2, 0x80f0, 0x9532,
++	0xfaa2, 0x1de2, 0x0014, 0x8532, 0xf221, 0x0014, 0x1de2, 0x84a8,
++	0xd6e0, 0x1fe6, 0x0014, 0x3008, 0x8000, 0x2849, 0x1011, 0xa8fc,
++	0x3008, 0x8000, 0xa000, 0x2081, 0x2802, 0x1011, 0xa8fc, 0xa889,
++	0x3008, 0x20a1, 0x283c, 0x1011, 0xa8fc, 0xa209, 0x0017, 0x300c,
++	0x8000, 0x85a4, 0x1de2, 0xdac1, 0x0014, 0x0210, 0xa801, 0x0014,
++	0x26e0, 0x873a, 0xfaa3, 0x19f2, 0x26e0, 0x18f2, 0x0014, 0xa20b,
++	0x0014, 0xa20d, 0x3806, 0x0210, 0x9d22, 0x0704, 0xa206, 0x6865,
++	0x817e, 0x842a, 0x1dc1, 0x8823, 0x0016, 0x6042, 0x8008, 0xa8fa,
++	0x8160, 0x842a, 0x8180, 0xf021, 0x3008, 0x84a8, 0x11d7, 0x7042,
++	0x20dd, 0x0011, 0x20d5, 0x8822, 0x0016, 0x0000, 0x0126, 0x70d0,
++	0xa084, 0x4c00, 0x8004, 0x2090, 0x7204, 0x7008, 0xc09c, 0xa205,
++	0x11a0, 0x720c, 0x82ff, 0x0128, 0x8aff, 0x1178, 0x7200, 0xd284,
++	0x1160, 0x7804, 0xd0cc, 0x0110, 0x080c, 0x4328, 0x7007, 0x0008,
++	0x7003, 0x0008, 0x012e, 0x2000, 0x0005, 0x7000, 0xa084, 0x0003,
++	0x7002, 0xc69c, 0xd084, 0x0588, 0x7108, 0xe000, 0x7008, 0xa106,
++	0x1dd8, 0xa184, 0x0003, 0x0904, 0x3fa2, 0xa184, 0x01e0, 0x1904,
++	0x3fa2, 0xd1f4, 0x1d88, 0xa184, 0x3000, 0xa086, 0x1000, 0x0d60,
++	0x2011, 0x0180, 0x710c, 0x8211, 0x0130, 0x7008, 0xd0f4, 0x1d20,
++	0x700c, 0xa106, 0x0dc0, 0x7007, 0x0012, 0x7108, 0xe000, 0x7008,
++	0xa106, 0x1dd8, 0xa184, 0x0003, 0x0568, 0xd194, 0x0db0, 0xd1f4,
++	0x0548, 0x7007, 0x0002, 0x0880, 0x0428, 0x7108, 0xd1fc, 0x0130,
++	0x080c, 0x40ae, 0x8aff, 0x0904, 0x3f2c, 0x0cb8, 0x700c, 0xa08c,
++	0x07ff, 0x01e8, 0x7004, 0xd084, 0x0178, 0x7014, 0xa005, 0x1148,
++	0x7010, 0x7310, 0xa306, 0x1de0, 0x2300, 0xa005, 0x0128, 0xa102,
++	0x1e20, 0x7007, 0x0010, 0x0030, 0x8aff, 0x0148, 0x080c, 0x426b,
++	0x1de8, 0x09d8, 0x080c, 0x4034, 0x012e, 0x2000, 0x0005, 0x7204,
++	0x7108, 0xc19c, 0x8103, 0x1218, 0x7007, 0x0002, 0x0cc0, 0xa205,
++	0x1d88, 0x7007, 0x0008, 0x7003, 0x0008, 0x0006, 0x2001, 0x4601,
++	0x2004, 0xd0cc, 0x0110, 0x080c, 0x4328, 0x000e, 0x012e, 0x2000,
++	0x0005, 0x6428, 0x84ff, 0x0508, 0x2c70, 0x7004, 0xa0bc, 0x000f,
++	0xa7b8, 0x3ff5, 0x273c, 0x87fb, 0x1148, 0x0210, 0x080c, 0x254c,
++	0x609c, 0xa075, 0x0190, 0x0c88, 0x2039, 0x3fea, 0x2704, 0xae68,
++	0x6808, 0xa630, 0x680c, 0xa529, 0x8421, 0x0138, 0x8738, 0x2704,
++	0xa005, 0x1da8, 0x709c, 0xa075, 0x1d00, 0x0005, 0x0000, 0x0005,
++	0x0009, 0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000, 0x0003,
++	0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x3fea, 0x3fe7,
++	0x0000, 0x0000, 0x8000, 0x0000, 0x3fea, 0x0000, 0x3ff2, 0x3fef,
++	0x0000, 0x0000, 0x0000, 0x0000, 0x3ff2, 0x0000, 0x3fed, 0x3fed,
++	0x0000, 0x0000, 0x8000, 0x0000, 0x3fed, 0x0000, 0x3ff3, 0x3ff3,
++	0x0000, 0x0000, 0x0000, 0x0000, 0x3ff3, 0x2079, 0x4600, 0x2071,
++	0x0010, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0001, 0x2009,
++	0x0002, 0x2071, 0x0050, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003,
++	0x0000, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1128, 0x8109, 0x0118,
++	0x2071, 0x0020, 0x0c80, 0x0005, 0x7004, 0x8004, 0x1a04, 0x408a,
++	0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0120, 0x080c,
++	0x40e6, 0x0804, 0x40aa, 0x7007, 0x0012, 0x2019, 0x0000, 0x7108,
++	0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0120, 0x080c, 0x40e6,
++	0x0804, 0x40aa, 0xa19c, 0x300c, 0xa386, 0x2004, 0x0190, 0xa386,
++	0x0008, 0x01c0, 0x7004, 0xd084, 0x1148, 0x7108, 0x7008, 0xa106,
++	0x1de0, 0xa184, 0x0003, 0x0110, 0x0804, 0x40e6, 0xa386, 0x200c,
++	0x19f0, 0x7200, 0x8204, 0x0230, 0x730c, 0xa384, 0x07ff, 0x0110,
++	0x080c, 0x254c, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0,
++	0x0118, 0x080c, 0x40e6, 0x0470, 0x7007, 0x0012, 0x7000, 0xd084,
++	0x1148, 0x7310, 0x7014, 0xa305, 0x0128, 0x710c, 0xa184, 0x07ff,
++	0x1904, 0x4034, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0,
++	0x0118, 0x080c, 0x40e6, 0x00b0, 0x7007, 0x0012, 0x7007, 0x0008,
++	0x7004, 0xd09c, 0x1de8, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184,
++	0x01e0, 0x0118, 0x080c, 0x40e6, 0x0028, 0x7007, 0x0012, 0x7108,
++	0x8103, 0x0e88, 0x7003, 0x0008, 0x0005, 0x7108, 0xa184, 0x01e0,
++	0x15a8, 0x7108, 0xa184, 0x01e0, 0x1588, 0xa184, 0x0007, 0x0002,
++	0x40c2, 0x40d0, 0x40c0, 0x40d0, 0x40c0, 0x4120, 0x40c0, 0x411e,
++	0x080c, 0x254c, 0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x8aff,
++	0x1118, 0x2049, 0x0000, 0x0005, 0x080c, 0x426b, 0x1de8, 0x0005,
++	0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x7004, 0xd084, 0x1140,
++	0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x0003, 0x0108, 0x0030,
++	0x8aff, 0x0118, 0x080c, 0x426b, 0x1de8, 0x0005, 0x7007, 0x0012,
++	0x7108, 0x1d04, 0x40e9, 0x2091, 0x6000, 0x1d04, 0x40ed, 0x2091,
++	0x6000, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xd09c, 0x1de8,
++	0x7007, 0x0012, 0x7108, 0xd1fc, 0x1dd8, 0x7003, 0x0000, 0x7000,
++	0xa005, 0x1130, 0x7004, 0xa005, 0x1118, 0x700c, 0xa005, 0x0108,
++	0x0c40, 0x2049, 0x0000, 0xb284, 0x0200, 0x0118, 0x2001, 0x0000,
++	0x0010, 0x2001, 0x0001, 0x080c, 0x3b81, 0x681b, 0x0002, 0x2051,
++	0x0000, 0x0005, 0x080c, 0x254c, 0x080c, 0x254c, 0x080c, 0x415f,
++	0x7210, 0x7114, 0x700c, 0xa09c, 0x07ff, 0x2800, 0xa300, 0xa211,
++	0xa189, 0x0000, 0x04a1, 0x2704, 0x2c58, 0xac60, 0x6308, 0x2200,
++	0xa322, 0x630c, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0140, 0x1238,
++	0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0c58, 0x2b60,
++	0x8a07, 0x0006, 0x6004, 0xd09c, 0x0118, 0xa7ba, 0x3fef, 0x0010,
++	0xa7ba, 0x3fe7, 0x000e, 0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92,
++	0x6b8e, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0110,
++	0x080c, 0x40e6, 0x7007, 0x0012, 0x080c, 0x4034, 0x0005, 0x8a50,
++	0x8739, 0x2704, 0xa004, 0x1168, 0x6000, 0xa064, 0x1108, 0x2d60,
++	0x6004, 0xa084, 0x000f, 0xa080, 0x4005, 0x203c, 0x87fb, 0x090c,
++	0x254c, 0x0005, 0x0126, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004,
++	0x2090, 0x00de, 0x6884, 0x2060, 0x6888, 0x6b8c, 0x6c90, 0x8057,
++	0xaad4, 0x00ff, 0xa084, 0x00ff, 0x0006, 0x6804, 0xa084, 0x0008,
++	0x000e, 0x0118, 0xa0b8, 0x3fef, 0x0010, 0xa0b8, 0x3fe7, 0xb284,
++	0x0200, 0x0110, 0x7e20, 0x0008, 0x7e24, 0xa6b5, 0x000c, 0x681c,
++	0xd0b4, 0x0108, 0xc685, 0x2400, 0xa305, 0x0518, 0x2c58, 0x2704,
++	0x6104, 0xac60, 0x6000, 0xa400, 0x701a, 0x6004, 0xa301, 0x701e,
++	0xd19c, 0x0140, 0x6010, 0xa081, 0x0000, 0x7022, 0x6014, 0xa081,
++	0x0000, 0x7026, 0x6208, 0x2400, 0xa202, 0x7012, 0x620c, 0x2300,
++	0xa203, 0x7016, 0x7602, 0x7007, 0x0001, 0x2b60, 0x080c, 0x4292,
++	0x0010, 0x080c, 0x426b, 0x1de8, 0x012e, 0x2000, 0x0005, 0x0126,
++	0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de, 0x7007,
++	0x0004, 0x7004, 0xd094, 0x1de8, 0x7003, 0x0008, 0x012e, 0x2000,
++	0x0005, 0x0126, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090,
++	0x00de, 0x7e20, 0xb284, 0x0200, 0x1108, 0x7e24, 0xa6b5, 0x000c,
++	0x681c, 0xd0ac, 0x1118, 0xc685, 0x7003, 0x0000, 0x6828, 0x2050,
++	0x2d60, 0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x3ff5, 0x273c, 0x87fb,
++	0x1138, 0x0210, 0x080c, 0x254c, 0x689c, 0xa065, 0x0120, 0x0c88,
++	0x080c, 0x426b, 0x1de8, 0x012e, 0x2000, 0x0005, 0x0126, 0x0006,
++	0x0016, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x7e20,
++	0xb284, 0x0200, 0x1108, 0x7e24, 0x00de, 0x003e, 0x004e, 0xa6b5,
++	0x000c, 0x681c, 0xd0b4, 0x0128, 0xc685, 0x7003, 0x0000, 0x7007,
++	0x0004, 0x2049, 0x4206, 0x6828, 0xa055, 0x00d6, 0x0904, 0x4267,
++	0x2d70, 0x2e60, 0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x3ff5, 0x273c,
++	0x87fb, 0x1140, 0x0210, 0x080c, 0x254c, 0x709c, 0xa075, 0x2060,
++	0x0570, 0x0c80, 0x2704, 0xae68, 0x6808, 0xa422, 0x680c, 0xa31b,
++	0x0268, 0x8a51, 0x1110, 0x080c, 0x254c, 0x8738, 0x2704, 0xa005,
++	0x1d90, 0x709c, 0xa075, 0x2060, 0x01d0, 0x08e0, 0x8422, 0x8420,
++	0x831a, 0xa399, 0x0000, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300,
++	0xa11b, 0x1210, 0x080c, 0x254c, 0xb284, 0x0200, 0x0118, 0x2071,
++	0x0050, 0x0010, 0x2071, 0x0020, 0x00de, 0x0804, 0x419b, 0x00de,
++	0x012e, 0x2000, 0x0005, 0x7008, 0x0006, 0xa084, 0x01e0, 0x000e,
++	0x0110, 0xa006, 0x0005, 0xa084, 0x0003, 0xa086, 0x0003, 0x1108,
++	0x0005, 0x2704, 0xac78, 0x7800, 0x701a, 0x7804, 0x701e, 0x7808,
++	0x7012, 0x780c, 0x7016, 0x6004, 0xd09c, 0x0120, 0x7810, 0x7022,
++	0x7814, 0x7026, 0x7602, 0x7004, 0xa084, 0x0010, 0xc085, 0x7006,
++	0x2079, 0x4600, 0x8a51, 0x01e8, 0x8738, 0x2704, 0xa005, 0x1168,
++	0x609c, 0xa005, 0x01b8, 0x2060, 0x6004, 0xa084, 0x000f, 0xa080,
++	0x3ff5, 0x203c, 0x87fb, 0x090c, 0x254c, 0x7008, 0x0006, 0xa084,
++	0x01e0, 0x000e, 0x0110, 0xa006, 0x0028, 0xa084, 0x0003, 0xa086,
++	0x0003, 0x0005, 0x2051, 0x0000, 0x0005, 0x0126, 0x0006, 0x00d6,
++	0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de, 0x008e, 0x7108,
++	0xa184, 0x0003, 0x1128, 0x6828, 0xa005, 0x0178, 0x0804, 0x3f45,
++	0x7108, 0xd1fc, 0x0118, 0x080c, 0x40ae, 0x0c88, 0x7007, 0x0010,
++	0x7108, 0xd1fc, 0x0de8, 0x080c, 0x40ae, 0x7008, 0xa086, 0x0008,
++	0x1d30, 0x7000, 0xa005, 0x1d18, 0x7003, 0x0000, 0x2049, 0x0000,
++	0x0006, 0x2001, 0x4601, 0x2004, 0xd0cc, 0x0110, 0x080c, 0x4328,
++	0x000e, 0x012e, 0x2000, 0x0005, 0x0126, 0x0146, 0x0136, 0x0156,
++	0x00c6, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de,
++	0x2049, 0x42ec, 0xad80, 0x0011, 0x20a0, 0xb284, 0x0200, 0x0118,
++	0x2099, 0x0032, 0x0010, 0x2099, 0x0031, 0x700c, 0xa084, 0x07ff,
++	0x682a, 0x7007, 0x0008, 0x7007, 0x0002, 0x7003, 0x0001, 0x0118,
++	0x8000, 0x80ac, 0x53a5, 0x700c, 0xa084, 0x07ff, 0x0130, 0x7007,
++	0x0004, 0x7004, 0xa084, 0x0004, 0x1de0, 0x00ce, 0x2049, 0x0000,
++	0x7003, 0x0000, 0x015e, 0x013e, 0x014e, 0x012e, 0x2000, 0x0005,
++	0x6814, 0xd0fc, 0x0904, 0x436b, 0x7000, 0xd084, 0x05e0, 0x7e24,
++	0xa6b5, 0x0004, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x1de0,
++	0x7118, 0x0016, 0x711c, 0x0016, 0x7120, 0x0016, 0x7124, 0x0016,
++	0x701b, 0x0000, 0x701f, 0x3fff, 0x7023, 0x0000, 0x7027, 0x0000,
++	0x7013, 0x0004, 0x7017, 0x0000, 0x7602, 0x7007, 0x0001, 0x2001,
++	0xffff, 0x2009, 0x0031, 0x200a, 0x200a, 0x7108, 0x7008, 0xa106,
++	0x1de0, 0xd1fc, 0x0dd0, 0x002e, 0x7226, 0x002e, 0x7222, 0x002e,
++	0x721e, 0x002e, 0x721a, 0x7007, 0x0002, 0x7008, 0xa086, 0x0008,
++	0x0110, 0x0804, 0x40e6, 0x7007, 0x0004, 0x7003, 0x0000, 0x0005,
++	0x2091, 0x8000, 0x2091, 0x6000, 0x78ac, 0xa005, 0x1168, 0x7974,
++	0x70d0, 0xa106, 0x1148, 0x781c, 0xa005, 0x0130, 0x781f, 0x0000,
++	0x0e04, 0x4384, 0x2091, 0x4080, 0x2069, 0x4680, 0xd7fc, 0x1110,
++	0x2069, 0x4640, 0x6800, 0xa084, 0x000f, 0x1198, 0x68d0, 0xd0b4,
++	0x0180, 0xd0bc, 0x1170, 0x00f6, 0x2079, 0x0100, 0xd7fc, 0x1110,
++	0x2079, 0x0200, 0x7830, 0xa084, 0x00c0, 0x1110, 0x080c, 0x22ae,
++	0x00fe, 0x7830, 0x8001, 0x7832, 0x1904, 0x440b, 0x7834, 0x7832,
++	0x2061, 0x6bc0, 0x2069, 0x4680, 0xc7fd, 0x68cc, 0xa005, 0x0128,
++	0x8001, 0x68ce, 0x1110, 0x080c, 0x4577, 0x6800, 0xa084, 0x000f,
++	0x0168, 0xa086, 0x0001, 0x0150, 0x6840, 0xa00d, 0x0138, 0x2104,
++	0xa005, 0x0120, 0x8001, 0x200a, 0x0904, 0x4514, 0x6814, 0xa005,
++	0x01a8, 0x8001, 0x6816, 0x1190, 0x68a3, 0x0001, 0x00f6, 0xd7fc,
++	0x1118, 0x2079, 0x0200, 0x0010, 0x2079, 0x0100, 0x080c, 0x3c46,
++	0x00fe, 0x6860, 0xa005, 0x0110, 0x080c, 0x22ae, 0x687c, 0xa005,
++	0x0140, 0x8001, 0x687e, 0x1128, 0x6863, 0x0000, 0x68d0, 0xc0c5,
++	0x68d2, 0x68d0, 0xd0fc, 0x01b0, 0xc0fc, 0x68d2, 0x20a9, 0x0200,
++	0x6034, 0xa005, 0x0158, 0x8001, 0x6036, 0x68d0, 0xc0fd, 0x68d2,
++	0x1128, 0x6010, 0xa005, 0x0110, 0x080c, 0x22ae, 0xace0, 0x0010,
++	0x1f04, 0x43f0, 0xd7fc, 0x0138, 0x2061, 0x4bc0, 0x2069, 0x4640,
++	0xc7fc, 0x0804, 0x43ad, 0x0459, 0x7838, 0x8001, 0x783a, 0x11a0,
++	0x783c, 0x783a, 0x2061, 0x4bc0, 0x2069, 0x4640, 0xc7fc, 0x680c,
++	0xa005, 0x0110, 0x080c, 0x4487, 0xd7fc, 0x1130, 0x2061, 0x6bc0,
++	0x2069, 0x4680, 0xc7fd, 0x0c98, 0x7810, 0xd0cc, 0x0168, 0xd0ac,
++	0x1120, 0xd0a4, 0x0148, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x0e04,
++	0x4433, 0x080c, 0x207a, 0x0005, 0x2091, 0x8001, 0x0005, 0x7840,
++	0x8001, 0x7842, 0x1904, 0x4486, 0x7844, 0x7842, 0x2069, 0x4640,
++	0xc7fc, 0x2079, 0x0200, 0x68d4, 0xa005, 0x0138, 0x7de0, 0xa504,
++	0x1120, 0x68d6, 0x68d0, 0xc0bc, 0x68d2, 0x2079, 0x4600, 0x6810,
++	0xa005, 0x1110, 0x2001, 0x0101, 0x8001, 0x6812, 0xd7fc, 0x0118,
++	0xa080, 0x8cd0, 0x0010, 0xa080, 0x8bc0, 0x2040, 0x2004, 0xa065,
++	0x01e0, 0x6024, 0xa005, 0x01b0, 0x8001, 0x6026, 0x1198, 0x6800,
++	0xa005, 0x0130, 0x6848, 0xac06, 0x1118, 0x080c, 0x4514, 0x0068,
++	0x6860, 0xa005, 0x0118, 0x6027, 0x0001, 0x0020, 0x080c, 0x44c8,
++	0x2804, 0x0c28, 0x6000, 0x2c40, 0x0c10, 0xd7fc, 0x1138, 0x2069,
++	0x4680, 0xc7fd, 0x2079, 0x0100, 0x0804, 0x4443, 0x0005, 0x2009,
++	0x0000, 0x20a9, 0x0200, 0x6008, 0xd09c, 0x0558, 0x6024, 0xa005,
++	0x0118, 0x8001, 0x6026, 0x0418, 0x6008, 0xc09c, 0xd084, 0x1110,
++	0xd0ac, 0x01c0, 0x600a, 0x6004, 0xa005, 0x01d8, 0x00d6, 0x00c6,
++	0x0016, 0x2068, 0x6010, 0x8001, 0x6012, 0x080c, 0x37a4, 0x2d00,
++	0x2c68, 0x2060, 0x080c, 0x1be3, 0x080c, 0x1d95, 0x001e, 0x00ce,
++	0x00de, 0x0038, 0xc0bd, 0x600a, 0xa18d, 0x0001, 0x0010, 0xa18d,
++	0x0100, 0xace0, 0x0010, 0x1f04, 0x448b, 0xa184, 0x0001, 0x0130,
++	0xa18c, 0xfffe, 0x690e, 0x080c, 0x22ae, 0x0008, 0x690e, 0x0005,
++	0x2c00, 0x687a, 0x6714, 0x6f72, 0x6017, 0x0000, 0x602b, 0x0000,
++	0x601b, 0x0006, 0x60b4, 0xa084, 0x5f00, 0x601e, 0x6020, 0xa084,
++	0x00ff, 0xa085, 0x0060, 0x6022, 0x6000, 0x2042, 0x6858, 0xac06,
++	0x1110, 0x2800, 0x685a, 0x080c, 0x1b7b, 0x6818, 0xa005, 0x0110,
++	0x8001, 0x681a, 0x6808, 0xc0a4, 0x680a, 0x6810, 0x7908, 0x8109,
++	0x790a, 0x8001, 0x1310, 0x080c, 0x254c, 0x6812, 0x1118, 0x7910,
++	0xc1a5, 0x7912, 0x602f, 0x0000, 0x6033, 0x0000, 0x2c68, 0x080c,
++	0x1da2, 0xd7fc, 0x1118, 0x2069, 0x4640, 0x0010, 0x2069, 0x4680,
++	0x6910, 0xa184, 0x0100, 0x2001, 0x0006, 0x1118, 0x6976, 0x2001,
++	0x0004, 0x080c, 0x22a4, 0x0005, 0x00d6, 0x6948, 0x2160, 0xd7fc,
++	0x1118, 0x2069, 0x0200, 0x0010, 0x2069, 0x0100, 0x080c, 0x2467,
++	0x601b, 0x0006, 0x6858, 0xa084, 0x5f00, 0x601e, 0x6020, 0xa084,
++	0x00ff, 0xa085, 0x0048, 0x6022, 0x602f, 0x0000, 0x6033, 0x0000,
++	0x6808, 0xa084, 0xfffd, 0x680a, 0x6830, 0xd0b4, 0x01b0, 0x684b,
++	0x0004, 0x20a9, 0x0014, 0x6848, 0xd094, 0x0110, 0x1f04, 0x453b,
++	0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xd084, 0x0110, 0x1f04,
++	0x4544, 0x20a9, 0x00fa, 0x1f04, 0x454b, 0x681b, 0x0054, 0x00de,
++	0x6863, 0x0007, 0x0005, 0x2079, 0x4600, 0x00e1, 0x0089, 0x00a9,
++	0x2009, 0x0002, 0x2069, 0x4680, 0x680f, 0x0000, 0x6813, 0x0000,
++	0x6817, 0x0000, 0x8109, 0x0118, 0x2069, 0x4640, 0x0ca8, 0x0005,
++	0x2019, 0x00a3, 0x7b3a, 0x7b3e, 0x0005, 0x2019, 0x0033, 0x7b42,
++	0x7b46, 0x0005, 0x2019, 0x32dd, 0x7b32, 0x7b36, 0x0005, 0x6a4c,
++	0xa285, 0x0000, 0x01f0, 0x6950, 0x6bbc, 0xa300, 0x00c6, 0x2164,
++	0x6304, 0x83ff, 0x1138, 0x8211, 0x0148, 0x8108, 0xa11a, 0x0eb8,
++	0x69bc, 0x0ca8, 0x68cf, 0x000a, 0x00ce, 0x0005, 0x694c, 0x6abc,
++	0x2264, 0x6008, 0xc0b5, 0x600a, 0x8210, 0x8109, 0x1dc8, 0x694e,
++	0x00ce, 0x0005, 0x1d04, 0x459a, 0x2091, 0x6000, 0x1d04, 0x459e,
++	0x2091, 0x6000, 0x70ec, 0xd0dc, 0x1118, 0xd0d4, 0x0190, 0x0098,
++	0xae8e, 0x0100, 0x0138, 0x7814, 0xc0f5, 0xc0c5, 0x7816, 0xd0d4,
++	0x1578, 0x0458, 0x7814, 0xc0fd, 0xc0c5, 0x7816, 0xd0d4, 0x1540,
++	0x0420, 0xd0e4, 0x0538, 0x1d04, 0x45bb, 0x2091, 0x6000, 0x2009,
++	0x000c, 0x1d04, 0x45c1, 0x2091, 0x6000, 0x8109, 0x1dd0, 0x70e4,
++	0xa084, 0x01ff, 0xa086, 0x01ff, 0x1110, 0x70ec, 0x08c8, 0xae8e,
++	0x0100, 0x0128, 0x7814, 0xc0f4, 0xd0fc, 0x1130, 0x0020, 0x7814,
++	0xc0fc, 0xd0f4, 0x1108, 0xc0c4, 0x7816, 0x7804, 0xd08c, 0x0110,
++	0x681f, 0x000c, 0x70a0, 0x70a2, 0x0005, 0x7c12
++};
++#else
++/*
++ *	Firmware Version 11.12.01 (12:37 May 24, 2000)
++ */
++static const u_int16_t isp_12160_risc_code[] = {
++	0x0804, 0x103a, 0x0000, 0x4bd8, 0x0000, 0x2043, 0x4f50, 0x5952,
++	0x4947, 0x4854, 0x2031, 0x3939, 0x3520, 0x514c, 0x4f47, 0x4943,
++	0x2043, 0x4f52, 0x504f, 0x5241, 0x5449, 0x4f4e, 0x2049, 0x5350,
++	0x3132, 0x3430, 0x2049, 0x2f54, 0x2046, 0x6972, 0x6d77, 0x6172,
++	0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2031, 0x312e, 0x3132,
++	0x2020, 0x2043, 0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20,
++	0x3030, 0x2050, 0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020,
++	0x3031, 0x2024, 0x2071, 0x0200, 0x70a0, 0x70a2, 0x2001, 0x01ff,
++	0x2004, 0xd0fc, 0x1120, 0x2071, 0x0100, 0x70a0, 0x70a2, 0x20c1,
++	0x0020, 0x2089, 0x128f, 0x0030, 0x2001, 0x04fc, 0x2004, 0xa086,
++	0x1216, 0x0d40, 0x2071, 0x0010, 0x70c3, 0x0004, 0x70c7, 0x4953,
++	0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x000b, 0x2001, 0x04fd,
++	0x70d6, 0x20c1, 0x0022, 0x20c9, 0x10ff, 0x2009, 0xfeff, 0x200b,
++	0xa5a5, 0xe000, 0xe000, 0x2114, 0xa286, 0xa5a5, 0x0120, 0x20c1,
++	0x0020, 0x20c9, 0x5cff, 0x2009, 0x0200, 0xa18e, 0x0400, 0x1168,
++	0x3808, 0xa18e, 0x0020, 0x1148, 0x70c3, 0x8010, 0x2061, 0x0000,
++	0x601b, 0x0001, 0x2091, 0x4080, 0x0cf8, 0x2009, 0xfeff, 0x2130,
++	0x2128, 0x3800, 0xa084, 0x0003, 0x0006, 0x0118, 0xa1a2, 0x1100,
++	0x0010, 0xa1a2, 0x5cff, 0x000e, 0x8424, 0x8424, 0x8424, 0x8424,
++	0x8424, 0x8424, 0x2009, 0xb33f, 0xa005, 0x0128, 0x2079, 0x1100,
++	0xa192, 0x1100, 0x0020, 0x2079, 0x5d00, 0xa192, 0x5d00, 0x2009,
++	0x0000, 0x2001, 0x0037, 0x080c, 0x20ea, 0x2218, 0x2fa0, 0x2408,
++	0x2011, 0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109, 0x1dd8, 0x2079,
++	0xb340, 0x2001, 0x04fc, 0x2004, 0xa086, 0x1280, 0x11e8, 0x780c,
++	0xc0ed, 0xc0d5, 0x780e, 0x7813, 0x0064, 0x2071, 0x0200, 0x00d6,
++	0x2069, 0xb380, 0x080c, 0x59b8, 0x2001, 0x01ff, 0x2004, 0xd0fc,
++	0x1130, 0x2069, 0xb3c0, 0x2071, 0x0100, 0x080c, 0x59b8, 0x780c,
++	0xc0d4, 0x780e, 0x00de, 0x0090, 0x2001, 0x04fc, 0x2004, 0xa086,
++	0x1216, 0x1128, 0x7813, 0x0064, 0x780c, 0xc0cd, 0x08c8, 0x780c,
++	0xc0e5, 0x780e, 0x7813, 0x003c, 0x2011, 0x000c, 0x2009, 0xb38c,
++	0x220a, 0x2009, 0xb3cc, 0x220a, 0x7eca, 0x7cc2, 0x7bc6, 0x785b,
++	0x0000, 0x7800, 0xc08d, 0x7802, 0x2031, 0x0030, 0x78af, 0x0101,
++	0x781b, 0x0002, 0x781f, 0x0002, 0x2009, 0x0002, 0x2069, 0xb380,
++	0x6817, 0x0003, 0x681f, 0x0007, 0x6823, 0x00fa, 0x6827, 0x0008,
++	0x682b, 0x0028, 0x6837, 0x0006, 0x682f, 0x0008, 0x683b, 0x0000,
++	0x8109, 0x0508, 0x68ef, 0x000a, 0x68df, 0xb400, 0x2079, 0xb340,
++	0x780c, 0xd0e4, 0x1118, 0x68f3, 0x7629, 0x0010, 0x68f3, 0x760d,
++	0x68e3, 0xba00, 0x68e7, 0xb800, 0x68eb, 0xfa00, 0x68c7, 0xfece,
++	0x68cb, 0xfed3, 0x68cf, 0xfece, 0x68d3, 0xfece, 0x68c3, 0x0001,
++	0x2069, 0xb3c0, 0x0868, 0x68ef, 0x000a, 0x68df, 0xb600, 0x68f3,
++	0x7819, 0x68e3, 0xda00, 0x68e7, 0xb900, 0x68eb, 0xfb10, 0x68c7,
++	0xfed3, 0x68cb, 0xfed8, 0x68cf, 0xfed3, 0x68d3, 0xfed3, 0x68c3,
++	0x0001, 0x00e6, 0x2069, 0xb800, 0x2071, 0x0200, 0x70ec, 0xd0e4,
++	0x2019, 0x1c09, 0x2021, 0x0009, 0x1120, 0x2019, 0x1c0c, 0x2021,
++	0x000c, 0x080c, 0x200a, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1188,
++	0x2069, 0xb900, 0x2071, 0x0100, 0x70ec, 0xd0e4, 0x2019, 0x1c09,
++	0x2021, 0x0009, 0x1120, 0x2019, 0x1c0c, 0x2021, 0x000c, 0x080c,
++	0x200a, 0x00ee, 0x2011, 0x0002, 0x2069, 0xba00, 0x2009, 0x0002,
++	0x20a9, 0x0100, 0x6837, 0x0000, 0x680b, 0x0040, 0x7bc8, 0xa386,
++	0xfeff, 0x1128, 0x6817, 0x0100, 0x681f, 0x0064, 0x0020, 0x6817,
++	0x0064, 0x681f, 0x0002, 0xade8, 0x0010, 0x1f04, 0x1182, 0x8109,
++	0x1d38, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1128, 0x8211, 0x0118,
++	0x2069, 0xda00, 0x08d8, 0x080c, 0x2680, 0x080c, 0x53c4, 0x080c,
++	0x1caf, 0x080c, 0x595f, 0x2091, 0x2200, 0x2079, 0xb340, 0x7808,
++	0xd0ec, 0x0118, 0x2071, 0x0020, 0x0010, 0x2071, 0x0050, 0x2091,
++	0x2400, 0x2079, 0xb340, 0x2071, 0x0020, 0x2091, 0x2600, 0x2079,
++	0xb340, 0x7808, 0xd0ec, 0x0118, 0x2079, 0x0100, 0x0010, 0x2079,
++	0x0200, 0x2071, 0xb380, 0x2091, 0x2800, 0x2079, 0x0100, 0x2071,
++	0xb3c0, 0x2091, 0x2000, 0x2079, 0xb340, 0x2071, 0x0010, 0x3200,
++	0xa085, 0x303d, 0x2090, 0x70c3, 0x0000, 0x1004, 0x11e5, 0x70c0,
++	0xa086, 0x0002, 0x1110, 0x080c, 0x142c, 0x2039, 0x0000, 0x080c,
++	0x130a, 0x78ac, 0xa005, 0x11a0, 0x0e04, 0x11f5, 0x7864, 0xa065,
++	0x0120, 0x2029, 0x0000, 0x080c, 0x252c, 0x080c, 0x210b, 0x0e04,
++	0x120c, 0x7864, 0xa065, 0x0120, 0x2029, 0x0000, 0x080c, 0x252c,
++	0x0e04, 0x120c, 0x2009, 0xb386, 0x2011, 0xb3c6, 0x2104, 0x220c,
++	0xa105, 0x0110, 0x080c, 0x1dd0, 0x00e6, 0x00f6, 0x2071, 0xb380,
++	0x70c0, 0xa005, 0x01f8, 0x7454, 0xa485, 0x0000, 0x01d8, 0x2079,
++	0x0200, 0x2091, 0x8000, 0x72f0, 0xa28c, 0x303d, 0x2190, 0x080c,
++	0x2b7f, 0x2091, 0x8000, 0x2091, 0x303d, 0x0e04, 0x1232, 0x00fe,
++	0x7864, 0xa065, 0x0130, 0x00ee, 0x2029, 0x0000, 0x080c, 0x252c,
++	0x00e6, 0x00f6, 0x1d04, 0x123a, 0x00fe, 0x00ee, 0x080c, 0x577e,
++	0x00e6, 0x00f6, 0x2071, 0xb3c0, 0x70c0, 0xa005, 0x0190, 0x7454,
++	0xa485, 0x0000, 0x0170, 0x2079, 0x0100, 0x2091, 0x8000, 0x72f0,
++	0xa28c, 0x303d, 0x2190, 0x080c, 0x2b7f, 0x2091, 0x8000, 0x2091,
++	0x303d, 0x00fe, 0x00ee, 0x0e04, 0x125b, 0x7864, 0xa065, 0x0118,
++	0xa02e, 0x080c, 0x252c, 0x1d04, 0x11e7, 0x080c, 0x577e, 0x0804,
++	0x11e7, 0x3c00, 0xa084, 0x0007, 0x0002, 0x1275, 0x1275, 0x1277,
++	0x1277, 0x127c, 0x127c, 0x1281, 0x1281, 0x3c00, 0xa084, 0x0003,
++	0x0002, 0x1275, 0x1275, 0x128a, 0x128a, 0x080c, 0x297f, 0x2091,
++	0x2400, 0x080c, 0x547f, 0x0005, 0x2091, 0x2200, 0x080c, 0x547f,
++	0x0005, 0x2091, 0x2200, 0x080c, 0x547f, 0x2091, 0x2400, 0x080c,
++	0x547f, 0x0005, 0x2091, 0x2200, 0x080c, 0x547f, 0x0005, 0x12af,
++	0x12af, 0x12b0, 0x12b0, 0x12bb, 0x12bb, 0x12bb, 0x12bb, 0x12c4,
++	0x12c4, 0x12cf, 0x12cf, 0x12bb, 0x12bb, 0x12bb, 0x12bb, 0x12de,
++	0x12de, 0x12de, 0x12de, 0x12de, 0x12de, 0x12de, 0x12de, 0x12de,
++	0x12de, 0x12de, 0x12de, 0x12de, 0x12de, 0x12de, 0x12de, 0x0cf8,
++	0x0006, 0x0106, 0x0126, 0x2091, 0x2800, 0x080c, 0x299c, 0x012e,
++	0x010e, 0x000e, 0x000d, 0x0006, 0x0106, 0x0126, 0x080c, 0x1261,
++	0x012e, 0x010e, 0x000e, 0x000d, 0x0006, 0x0106, 0x0126, 0x2091,
++	0x2600, 0x080c, 0x299c, 0x012e, 0x010e, 0x000e, 0x000d, 0x0006,
++	0x0106, 0x0126, 0x2091, 0x2600, 0x080c, 0x299c, 0x2091, 0x2800,
++	0x080c, 0x299c, 0x012e, 0x010e, 0x000e, 0x000d, 0x0006, 0x0106,
++	0x0126, 0x00d6, 0x00e6, 0x00f6, 0x2079, 0xb340, 0x2071, 0x0200,
++	0x2069, 0xb380, 0x3d00, 0xd08c, 0x0130, 0x70ec, 0xa084, 0x1c00,
++	0x78e2, 0x080c, 0x59b8, 0x3d00, 0xd084, 0x0150, 0x2069, 0xb3c0,
++	0x2071, 0x0100, 0x70ec, 0xa084, 0x1c00, 0x78e6, 0x080c, 0x59b8,
++	0x080c, 0x2930, 0x00fe, 0x00ee, 0x00de, 0x012e, 0x010e, 0x000e,
++	0x000d, 0x0005, 0x0e04, 0x1381, 0x2061, 0x0000, 0x6018, 0xa084,
++	0x0001, 0x1904, 0x1381, 0x7820, 0xa005, 0x1120, 0x0004, 0x1382,
++	0x0804, 0x1381, 0x7908, 0xd1f4, 0x0120, 0x2001, 0x4007, 0x0804,
++	0x142e, 0x790c, 0xd1ec, 0x01a0, 0xd0fc, 0x0148, 0x0006, 0x080c,
++	0x1c2f, 0x000e, 0x0168, 0x2001, 0x4007, 0x0804, 0x142e, 0x0006,
++	0x080c, 0x1c25, 0x000e, 0x0120, 0x2001, 0x4007, 0x0804, 0x142e,
++	0x7908, 0xd0fc, 0x1128, 0x2061, 0xb380, 0xc19c, 0xc7fc, 0x0020,
++	0x2061, 0xb3c0, 0xc19d, 0xc7fd, 0x6068, 0xa005, 0x15d0, 0x790a,
++	0x6087, 0x0000, 0x7820, 0xc0fc, 0xa086, 0x0018, 0x1120, 0x00c6,
++	0x080c, 0x196b, 0x00ce, 0x7823, 0x0000, 0x6080, 0xa065, 0x0190,
++	0x00c6, 0x609c, 0x080c, 0x1d24, 0x00ce, 0x609f, 0x0000, 0x080c,
++	0x1a81, 0x2009, 0x000c, 0x6007, 0x0103, 0x080c, 0x1c39, 0x1198,
++	0x080c, 0x1c95, 0x7808, 0xd09c, 0x1118, 0x2061, 0xb380, 0x0018,
++	0x2061, 0xb3c0, 0xc09c, 0x6083, 0x0000, 0x780a, 0x60f0, 0xd0c4,
++	0x0130, 0xc0c4, 0x60f2, 0x2001, 0x4005, 0x0804, 0x142e, 0x0804,
++	0x142c, 0x0005, 0x7808, 0xd0f4, 0x0120, 0x2001, 0x4007, 0x0804,
++	0x142e, 0x70c3, 0x0000, 0x70c7, 0x0000, 0x70cb, 0x0000, 0x70cf,
++	0x0000, 0x70db, 0x0000, 0x71c4, 0x7a08, 0xd2ec, 0x0108, 0xc1fc,
++	0x70c0, 0xa03d, 0xa092, 0x0030, 0x1208, 0x0032, 0x2200, 0xa092,
++	0x0050, 0x1a04, 0x143a, 0x0482, 0x142c, 0x14a7, 0x1448, 0x14bb,
++	0x14ca, 0x14d0, 0x1440, 0x1a99, 0x14d4, 0x143a, 0x144c, 0x144d,
++	0x144e, 0x144f, 0x1a9d, 0x143a, 0x14e1, 0x1532, 0x1988, 0x1a93,
++	0x1450, 0x17f5, 0x182e, 0x1863, 0x18a8, 0x17b0, 0x17be, 0x17d1,
++	0x17e4, 0x1600, 0x143a, 0x155f, 0x1563, 0x1571, 0x157f, 0x1596,
++	0x15a4, 0x15a7, 0x15b5, 0x15c3, 0x15cd, 0x15e6, 0x15f2, 0x143a,
++	0x143a, 0x143a, 0x143a, 0x160d, 0x1618, 0x1631, 0x1665, 0x168e,
++	0x16a0, 0x16a3, 0x16cd, 0x1705, 0x1717, 0x1784, 0x1794, 0x143a,
++	0x1475, 0x143a, 0x143a, 0x17a6, 0x143a, 0x143a, 0x143a, 0x143a,
++	0x143a, 0x1bc9, 0x1bcf, 0x143a, 0x143a, 0x143a, 0x1bd3, 0x1be2,
++	0x143a, 0x143a, 0x143a, 0x143a, 0x14a2, 0x14b6, 0x14dc, 0x152d,
++	0x1983, 0x1ab1, 0x1ad3, 0x1950, 0x1ae9, 0x1bf0, 0x1bbb, 0x1bc5,
++	0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a,
++	0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a,
++	0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a,
++	0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a,
++	0x143a, 0x143a, 0x143a, 0x143a, 0x72ca, 0x71c6, 0x2001, 0x4006,
++	0x0028, 0x73ce, 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0e04,
++	0x142f, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x2091,
++	0x4080, 0x0005, 0x70c3, 0x4001, 0x0c90, 0x70c3, 0x4006, 0x0c78,
++	0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0c20,
++	0x70c4, 0x70c3, 0x0004, 0x0807, 0x08f8, 0x08f0, 0x08e8, 0x08e0,
++	0x2091, 0x8000, 0x70c3, 0x0000, 0x70c7, 0x4953, 0x70cb, 0x5020,
++	0x70cf, 0x2020, 0x70d3, 0x000b, 0x2001, 0x000c, 0x70d6, 0x2079,
++	0x0000, 0x781b, 0x0001, 0x2031, 0x0030, 0x2059, 0x1000, 0x2029,
++	0x041a, 0x2051, 0x0445, 0x2061, 0x0447, 0x20c1, 0x0020, 0x2091,
++	0x5000, 0x2091, 0x4080, 0x0804, 0x0418, 0x00d6, 0x70c4, 0x7904,
++	0xd19c, 0x0180, 0x70c7, 0x0001, 0x2069, 0xfed8, 0x2d14, 0x72ca,
++	0x8d68, 0x2d14, 0x72ce, 0x8d68, 0x2d14, 0x72da, 0x8d68, 0x2d14,
++	0x72de, 0x0010, 0x70c7, 0x0000, 0xa005, 0x0178, 0xc19d, 0x72c8,
++	0x2069, 0xfed8, 0x226a, 0x72cc, 0x8d68, 0x226a, 0x72d8, 0x8d68,
++	0x226a, 0x72dc, 0x8d68, 0x226a, 0x0008, 0xc19c, 0x7906, 0x00de,
++	0x0804, 0x142c, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0018, 0x2029,
++	0x0000, 0x2520, 0x71d0, 0x73c8, 0x72cc, 0x70c4, 0x080c, 0x1e1f,
++	0x0904, 0x142c, 0x70c3, 0x4002, 0x0804, 0x142c, 0x75d8, 0x74dc,
++	0x75da, 0x74de, 0x0018, 0x2029, 0x0000, 0x2520, 0x71d0, 0x73c8,
++	0x72cc, 0x70c4, 0x080c, 0x1e5e, 0x0904, 0x142c, 0x70c3, 0x4002,
++	0x0804, 0x142c, 0x71c4, 0x70c8, 0x2114, 0x200a, 0x0804, 0x142a,
++	0x71c4, 0x2114, 0x0804, 0x142a, 0x70c7, 0x000b, 0x70cb, 0x000c,
++	0x70cf, 0x0001, 0x0804, 0x142c, 0x75d8, 0x76dc, 0x75da, 0x76de,
++	0x0018, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0,
++	0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005, 0x05c8, 0xa40a, 0x0110,
++	0x1a04, 0x142e, 0x8001, 0x786a, 0xa084, 0xfc00, 0x0138, 0x78ac,
++	0xc085, 0x78ae, 0x2001, 0x4005, 0x0804, 0x142e, 0x7a72, 0x7b76,
++	0x7d7a, 0x7e7e, 0x7c6e, 0xa48c, 0xff00, 0x0170, 0x8407, 0x8004,
++	0x8004, 0x810c, 0x810c, 0x810f, 0xa118, 0xa291, 0x0000, 0xa6b1,
++	0x0000, 0xa5a9, 0x0000, 0x0050, 0x8407, 0x8004, 0x8004, 0xa318,
++	0xa291, 0x0000, 0xa6b1, 0x0000, 0xa5a9, 0x0000, 0x731a, 0x721e,
++	0x7622, 0x7526, 0x78ac, 0xa084, 0xfffc, 0x78ae, 0x0020, 0x78ac,
++	0xa085, 0x0001, 0x78ae, 0x0804, 0x142c, 0x75d8, 0x76dc, 0x75da,
++	0x76de, 0x0018, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc,
++	0x74d4, 0x70c6, 0x72ca, 0x73ce, 0x74d6, 0xa005, 0x01d0, 0xa40a,
++	0x0110, 0x1a04, 0x142e, 0x8001, 0x788e, 0xa084, 0xfc00, 0x0138,
++	0x78ac, 0xc0c5, 0x78ae, 0x2001, 0x4005, 0x0804, 0x142e, 0x7a96,
++	0x7b9a, 0x7d9e, 0x7ea2, 0x7c92, 0x78ac, 0xa084, 0xfcff, 0x78ae,
++	0x0020, 0x78ac, 0xa085, 0x0100, 0x78ae, 0x0804, 0x142c, 0x795c,
++	0x7ac4, 0x0804, 0x142a, 0x2009, 0xb387, 0x210c, 0x2001, 0x01ff,
++	0x2004, 0xd0fc, 0x1904, 0x142b, 0x2011, 0xb3c7, 0x2214, 0x0804,
++	0x142a, 0x2009, 0xb388, 0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc,
++	0x1904, 0x142b, 0x2011, 0xb3c8, 0x2214, 0x0804, 0x142a, 0x2061,
++	0xb380, 0x6124, 0x6228, 0x8214, 0x8214, 0x8214, 0x2001, 0x01ff,
++	0x2004, 0xd0fc, 0x1148, 0x2061, 0xb3c0, 0x6324, 0x73da, 0x6328,
++	0x831c, 0x831c, 0x831c, 0x73de, 0x0804, 0x142a, 0x2009, 0xb38b,
++	0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x142b, 0x2011,
++	0xb3cb, 0x2214, 0x0804, 0x142a, 0x7910, 0x0804, 0x142b, 0x2009,
++	0x0202, 0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x142b,
++	0x2011, 0x0102, 0x2214, 0x0804, 0x142a, 0x2009, 0xb38d, 0x210c,
++	0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x142b, 0x2011, 0xb3cd,
++	0x2214, 0x0804, 0x142a, 0x7918, 0x2001, 0x01ff, 0x2004, 0xd0fc,
++	0x1904, 0x142b, 0x7a1c, 0x0804, 0x142a, 0x2011, 0xb900, 0x71c4,
++	0xd1fc, 0x1110, 0x2011, 0xb800, 0x8107, 0xa084, 0x000f, 0x8003,
++	0x8003, 0x8003, 0x8003, 0xa268, 0x6a00, 0x6b08, 0x6c1c, 0x74da,
++	0xd29c, 0x0110, 0x6820, 0x70de, 0x0804, 0x1429, 0x2138, 0x080c,
++	0x1cc4, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708,
++	0x0804, 0x1429, 0x2061, 0xb380, 0x6114, 0x2001, 0x01ff, 0x2004,
++	0xd0fc, 0x1904, 0x142b, 0x2061, 0xb3c0, 0x6214, 0x0804, 0x142a,
++	0x2138, 0x080c, 0x1cc4, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10,
++	0x77da, 0x2091, 0x8001, 0x0804, 0x1429, 0x2110, 0xa294, 0x000f,
++	0xa282, 0x0010, 0x1a04, 0x1425, 0x080c, 0x27a4, 0x0804, 0x1429,
++	0x2100, 0xc0bc, 0xa082, 0x0010, 0x1a04, 0x1425, 0xd1bc, 0x1120,
++	0x2011, 0xb387, 0x2204, 0x0020, 0x2011, 0xb3c7, 0x2204, 0xc0bd,
++	0x0006, 0x2100, 0xc0bc, 0x2012, 0x080c, 0x2713, 0x001e, 0x0804,
++	0x142b, 0x71c4, 0x2021, 0xb388, 0x2404, 0x70c6, 0x2019, 0x0000,
++	0x0030, 0x71c8, 0x2021, 0xb3c8, 0x2404, 0x70ca, 0xc3fd, 0x2011,
++	0x165d, 0x20a9, 0x0008, 0x2205, 0xa106, 0x0138, 0x8210, 0x1f04,
++	0x1643, 0x71c4, 0x72c8, 0x0804, 0x1424, 0xa292, 0x165d, 0x0026,
++	0x2122, 0x001e, 0x080c, 0x2732, 0x2001, 0x01ff, 0x2004, 0xd0fc,
++	0x1110, 0xd3fc, 0x09f0, 0x0804, 0x142c, 0x03e8, 0x00fa, 0x01f4,
++	0x02ee, 0x0004, 0x0001, 0x0002, 0x0003, 0x2061, 0xb380, 0x6124,
++	0x6228, 0x8214, 0x8214, 0x8214, 0x70c4, 0x6026, 0x70c8, 0x8003,
++	0x8003, 0x8003, 0x602a, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x11a0,
++	0x0026, 0x0016, 0x2061, 0xb3c0, 0x6124, 0x6228, 0x8214, 0x8214,
++	0x8214, 0x70d8, 0x6026, 0x70dc, 0x8003, 0x8003, 0x8003, 0x602a,
++	0x71da, 0x72de, 0x001e, 0x002e, 0x0804, 0x142a, 0x2061, 0xb380,
++	0x612c, 0x70c4, 0x602e, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904,
++	0x142b, 0x2061, 0xb3c0, 0x622c, 0x70c8, 0x602e, 0x0804, 0x142a,
++	0x7910, 0x0804, 0x142b, 0x71c4, 0xa184, 0xf0cf, 0x0148, 0x2001,
++	0x01ff, 0x2004, 0xd0fc, 0x1904, 0x1425, 0x72c8, 0x0804, 0x1424,
++	0x0006, 0x2019, 0x0000, 0x080c, 0x278d, 0x2001, 0x01ff, 0x2004,
++	0xd0fc, 0x0118, 0x001e, 0x0804, 0x142b, 0x71c8, 0xa184, 0xf0cf,
++	0x0120, 0x2110, 0x71c4, 0x0804, 0x1424, 0x0006, 0xc3fd, 0x080c,
++	0x278d, 0x002e, 0x001e, 0x0804, 0x142a, 0x71c4, 0xa182, 0x0010,
++	0x0248, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x1425, 0x72c8,
++	0x0804, 0x1424, 0x2011, 0xb38d, 0x2204, 0x0006, 0x8104, 0x1208,
++	0x8108, 0x2112, 0x2019, 0x0000, 0x080c, 0x276f, 0x2001, 0x01ff,
++	0x2004, 0xd0fc, 0x0118, 0x001e, 0x0804, 0x142b, 0x71c8, 0xa182,
++	0x0010, 0x0220, 0x2110, 0x71c4, 0x0804, 0x1424, 0x2011, 0xb3cd,
++	0x2204, 0x0006, 0x8104, 0x1208, 0x8108, 0x2112, 0xc3fd, 0x080c,
++	0x276f, 0x002e, 0x001e, 0x0804, 0x142a, 0x71c4, 0x72c8, 0xa184,
++	0xfffd, 0x1904, 0x1424, 0xa284, 0xfffd, 0x1904, 0x1424, 0x2100,
++	0x7918, 0x781a, 0x2200, 0x7a1c, 0x781e, 0x0804, 0x142a, 0x2011,
++	0xb900, 0x71c4, 0xd1fc, 0x1110, 0x2011, 0xb800, 0x8107, 0xa084,
++	0x000f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa268, 0x72c8, 0x73cc,
++	0x74d8, 0xd29c, 0x0130, 0x75dc, 0x75de, 0x6d22, 0x2001, 0x0002,
++	0x682a, 0x71c6, 0x6800, 0x70ca, 0x73ce, 0x74da, 0x2091, 0x8000,
++	0x6a02, 0xd2ac, 0x1110, 0xa026, 0x0078, 0xa484, 0x00ff, 0xa082,
++	0x0002, 0x16f0, 0x843f, 0xa7bc, 0x00ff, 0x0130, 0xa786, 0x0002,
++	0x15b8, 0xa484, 0x00ff, 0x05a0, 0x2029, 0x0009, 0x2031, 0x0062,
++	0x843f, 0xa7bc, 0x00ff, 0x0130, 0x8307, 0xa084, 0x00ff, 0x1110,
++	0xa73d, 0x1530, 0x2041, 0x001d, 0x8307, 0xa084, 0x00ff, 0x0188,
++	0xa842, 0x02f0, 0xa086, 0x0010, 0x1120, 0xa39c, 0x00ff, 0xa39d,
++	0x0f00, 0xa3bc, 0x00ff, 0x2500, 0xa702, 0x0290, 0x2600, 0xa702,
++	0x1278, 0x2039, 0x003a, 0x6804, 0xa705, 0x6806, 0x6b0a, 0x6b0c,
++	0x73ce, 0x681c, 0x70da, 0x6c1e, 0x2091, 0x8001, 0x0804, 0x142c,
++	0x2091, 0x8001, 0x0804, 0x1426, 0x2138, 0x080c, 0x1cc4, 0x2091,
++	0x8000, 0x6a14, 0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc,
++	0x681e, 0x2708, 0x0804, 0x1429, 0x70c4, 0x2061, 0xb380, 0x6114,
++	0x6016, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x142b, 0x70c8,
++	0x2061, 0xb3c0, 0x6214, 0x6016, 0x0804, 0x142a, 0x72c8, 0x73cc,
++	0xa182, 0x0010, 0x1a04, 0x1425, 0x080c, 0x27de, 0x0804, 0x1429,
++	0x2138, 0x080c, 0x1cc4, 0x2091, 0x8000, 0x6a08, 0xa295, 0x0002,
++	0x6a0a, 0x2091, 0x8001, 0x2708, 0x0804, 0x142a, 0x2138, 0x080c,
++	0x1cc4, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9, 0x6a0a, 0x6804,
++	0xa005, 0x0110, 0x080c, 0x260c, 0x2091, 0x8001, 0x2708, 0x0804,
++	0x142a, 0x2138, 0x080c, 0x1cc4, 0x2091, 0x8000, 0x6a08, 0xa295,
++	0x0004, 0x6a0a, 0x6804, 0xa005, 0x0110, 0x080c, 0x260c, 0x2091,
++	0x8001, 0x2708, 0x0804, 0x142a, 0x2138, 0x2041, 0x0001, 0x2049,
++	0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x080c, 0x1cd8, 0x2091,
++	0x8001, 0x2708, 0x6a08, 0x0804, 0x142a, 0x2138, 0x780c, 0xd0e4,
++	0x1160, 0xd7fc, 0x0128, 0x080c, 0x1c2f, 0x0138, 0x0804, 0x142e,
++	0x080c, 0x1c25, 0x0110, 0x0804, 0x142e, 0x73c8, 0x72cc, 0x77c6,
++	0x73ca, 0x72ce, 0x080c, 0x1d63, 0x11e8, 0x6818, 0xa005, 0x01a0,
++	0x2708, 0x0076, 0x080c, 0x27fe, 0x007e, 0x1170, 0x2001, 0x0015,
++	0xd7fc, 0x1118, 0x2061, 0xb380, 0x0018, 0xc0fd, 0x2061, 0xb3c0,
++	0x7822, 0x2091, 0x8001, 0x0005, 0x2091, 0x8001, 0x2001, 0x4005,
++	0x0804, 0x142e, 0x2091, 0x8001, 0x0804, 0x142c, 0x2138, 0x780c,
++	0xd0e4, 0x1160, 0xd7fc, 0x0128, 0x080c, 0x1c2f, 0x0138, 0x0804,
++	0x142e, 0x080c, 0x1c25, 0x0110, 0x0804, 0x142e, 0x77c6, 0x2041,
++	0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x080c,
++	0x1cd8, 0x2009, 0x0016, 0xd7fc, 0x1118, 0x2061, 0xb380, 0x0018,
++	0x2061, 0xb3c0, 0xc1fd, 0x606b, 0x0003, 0x6083, 0x0000, 0x677a,
++	0x6087, 0x000f, 0x7922, 0x61f0, 0xc1c4, 0x61f2, 0x080c, 0x260c,
++	0x2091, 0x8001, 0x0005, 0x77c8, 0x77ca, 0x2138, 0x77c6, 0x780c,
++	0xd0e4, 0x1160, 0xd7fc, 0x0128, 0x080c, 0x1c2f, 0x0138, 0x0804,
++	0x142e, 0x080c, 0x1c25, 0x0110, 0x0804, 0x142e, 0xa7bc, 0xff00,
++	0x2091, 0x8000, 0x2009, 0x0017, 0xd7fc, 0x1118, 0x2061, 0xb380,
++	0x0018, 0x2061, 0xb3c0, 0xc1fd, 0x6083, 0x0000, 0x606b, 0x0002,
++	0x677a, 0x6087, 0x000f, 0x7922, 0x61f0, 0xc1c4, 0x61f2, 0x080c,
++	0x260c, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0010, 0x70c8,
++	0xa005, 0x0118, 0x60f0, 0xc0fd, 0x60f2, 0x080c, 0x1cd8, 0x70c8,
++	0x6836, 0x8738, 0xa784, 0x001f, 0x1dc0, 0x2091, 0x8001, 0x0005,
++	0x2019, 0x0000, 0x2011, 0x0000, 0x7808, 0xd0ec, 0x1180, 0x72c8,
++	0x780c, 0xd0e4, 0x1160, 0xd284, 0x0128, 0x080c, 0x1c2f, 0x0138,
++	0x0804, 0x142e, 0x080c, 0x1c25, 0x0110, 0x0804, 0x142e, 0x72ca,
++	0x78ac, 0xa084, 0x0003, 0x1508, 0x2039, 0x0000, 0xd284, 0x0108,
++	0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x080c,
++	0x1cc4, 0x2091, 0x8000, 0x6808, 0xc0d4, 0xa80d, 0x690a, 0x2091,
++	0x8001, 0x8738, 0xa784, 0x001f, 0x1d90, 0xa7bc, 0xff00, 0x873f,
++	0x8738, 0x873f, 0xa784, 0x0f00, 0x1d50, 0x2091, 0x8000, 0x7808,
++	0xd0ec, 0x0118, 0x2069, 0x0100, 0x0040, 0x72c8, 0xd284, 0x1118,
++	0x2069, 0x0200, 0x0010, 0x2069, 0x0100, 0x6808, 0xa084, 0xfffd,
++	0x680a, 0x6830, 0xa084, 0x0040, 0x01c0, 0x684b, 0x0004, 0x20a9,
++	0x0014, 0x6848, 0xa084, 0x0004, 0x0110, 0x1f04, 0x1901, 0x684b,
++	0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0110, 0x1f04,
++	0x190b, 0x20a9, 0x00fa, 0x1f04, 0x1913, 0x2079, 0xb340, 0x2009,
++	0x0018, 0x7808, 0xd0ec, 0x1118, 0x72c8, 0xd284, 0x1118, 0x2061,
++	0xb380, 0x0018, 0x2061, 0xb3c0, 0xc1fd, 0x6083, 0x0000, 0x7922,
++	0x606b, 0x0001, 0x6087, 0x000f, 0x60c3, 0x0000, 0x60c4, 0x60ce,
++	0x60d2, 0x60f0, 0xd0b4, 0x0160, 0xc0b4, 0x60f2, 0x00c6, 0x60d4,
++	0xa065, 0x6008, 0xc0d4, 0x600a, 0x6018, 0x8001, 0x601a, 0x00ce,
++	0x60f0, 0xa084, 0x7eff, 0x60f2, 0x78ac, 0xa085, 0x0002, 0x78ae,
++	0x83ff, 0x0108, 0x0005, 0x681b, 0x0050, 0x2091, 0x8001, 0x0005,
++	0x73cc, 0x080c, 0x18aa, 0x69ec, 0x6a48, 0xa185, 0x1800, 0x684a,
++	0xa185, 0x0040, 0x68ee, 0x73cc, 0x2021, 0x0004, 0x20a9, 0x09ff,
++	0x1f04, 0x1960, 0x8421, 0x1dd0, 0x8319, 0x1db0, 0x69ee, 0x6a4a,
++	0x2091, 0x8001, 0x0005, 0xd7fc, 0x1118, 0x2069, 0xb380, 0x0010,
++	0x2069, 0xb3c0, 0x71c4, 0x71c6, 0x6912, 0x81ff, 0x1110, 0x68c3,
++	0x0001, 0x78ac, 0xa084, 0xfffd, 0x78ae, 0xa084, 0x0001, 0x1110,
++	0x080c, 0x1daf, 0x0005, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0018,
++	0x2029, 0x0000, 0x2520, 0x71c4, 0x73c8, 0x72cc, 0x71c6, 0x73ca,
++	0x72ce, 0x2079, 0xb340, 0x7dde, 0x7cda, 0x7bd6, 0x7ad2, 0x080c,
++	0x1c79, 0x0904, 0x1a7d, 0x20a9, 0x0005, 0x20a1, 0xb351, 0x2091,
++	0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0040, 0x080c, 0x1fd6,
++	0x0120, 0x080c, 0x1c95, 0x0804, 0x1a7d, 0x6004, 0xa08c, 0x00ff,
++	0xa18e, 0x0009, 0x1120, 0x0006, 0x080c, 0x250a, 0x000e, 0xa084,
++	0xff00, 0x8007, 0x8009, 0x0904, 0x1a24, 0x00c6, 0x2c68, 0x080c,
++	0x1c79, 0x05a8, 0x2c00, 0x689e, 0x8109, 0x1dc0, 0x609f, 0x0000,
++	0x00ce, 0x00c6, 0x7ddc, 0x7cd8, 0x7bd4, 0x7ad0, 0xa290, 0x0040,
++	0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x7dde, 0x7cda,
++	0x7bd6, 0x7ad2, 0x2c68, 0x689c, 0xa065, 0x0904, 0x1a23, 0x2009,
++	0x0040, 0x080c, 0x1fd6, 0x1548, 0x6004, 0xa084, 0x00ff, 0xa086,
++	0x0002, 0x1168, 0x6004, 0xa084, 0x00ff, 0xa086, 0x000a, 0x1120,
++	0x0016, 0x080c, 0x2507, 0x001e, 0x2d00, 0x6002, 0x0898, 0x00ce,
++	0x00c6, 0x609c, 0x080c, 0x1d24, 0x00ce, 0x609f, 0x0000, 0x080c,
++	0x1a81, 0x2009, 0x000c, 0x6008, 0xa085, 0x0200, 0x600a, 0x080c,
++	0x1c39, 0x080c, 0x1c95, 0x0804, 0x1a7d, 0x00ce, 0x00c6, 0x609c,
++	0x080c, 0x1d24, 0x00ce, 0x609f, 0x0000, 0x080c, 0x1a81, 0x2009,
++	0x000c, 0x6007, 0x0103, 0x601b, 0x0003, 0x080c, 0x1c39, 0x080c,
++	0x1c95, 0x0804, 0x1a7d, 0x00ce, 0x780c, 0xd0e4, 0x11e8, 0x6114,
++	0xd1fc, 0x0120, 0x080c, 0x1c2f, 0x01b8, 0x0018, 0x080c, 0x1c25,
++	0x0198, 0x2029, 0x0000, 0x2520, 0x2009, 0x0018, 0x73c8, 0x72cc,
++	0x6087, 0x0103, 0x601b, 0x0021, 0x080c, 0x1c39, 0x080c, 0x1c95,
++	0x2001, 0x4007, 0x0804, 0x142e, 0x74c4, 0x73c8, 0x72cc, 0x6014,
++	0x2091, 0x8000, 0x00e6, 0x2009, 0x0012, 0xd0fc, 0x1118, 0x2071,
++	0xb380, 0x0018, 0x2071, 0xb3c0, 0xc1fd, 0x7922, 0x706b, 0x0005,
++	0x71f0, 0xc1c4, 0x71f2, 0x736e, 0x7272, 0x7476, 0x707a, 0x707f,
++	0x0000, 0x2c00, 0x7082, 0xa02e, 0x2530, 0x611c, 0x61a2, 0xa184,
++	0x0060, 0x0110, 0x080c, 0x5365, 0x00ee, 0x6596, 0x65a6, 0x669a,
++	0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x6714, 0x6023, 0x0000,
++	0x080c, 0x260c, 0x2091, 0x8001, 0x0005, 0x70c3, 0x4005, 0x0804,
++	0x142f, 0x20a9, 0x0005, 0x2099, 0xb351, 0x2091, 0x8000, 0x530a,
++	0x2091, 0x8001, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000,
++	0xa5a9, 0x0000, 0x0005, 0x71c4, 0x70c7, 0x0000, 0x7916, 0x0804,
++	0x142c, 0x71c4, 0x71c6, 0x2168, 0x0010, 0x2069, 0x1000, 0x690c,
++	0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x1dd8, 0xa285, 0x0000,
++	0x1118, 0x70c3, 0x4000, 0x0010, 0x70c3, 0x4003, 0x70ca, 0x0804,
++	0x142f, 0x2011, 0xb3a4, 0xa03e, 0x7908, 0xd1ec, 0x11a0, 0x77c8,
++	0xd7fc, 0x0110, 0x2011, 0xb3e4, 0x220c, 0x0006, 0x0036, 0x0046,
++	0x080c, 0x44c8, 0x70c4, 0xd0fc, 0x004e, 0x003e, 0x000e, 0x1118,
++	0xa184, 0x7fff, 0x0020, 0x080c, 0x44ac, 0xa185, 0x8000, 0x2012,
++	0x2710, 0x0804, 0x142a, 0x0016, 0x2100, 0xc1fc, 0x080c, 0x449c,
++	0x001e, 0xd1fc, 0x1118, 0x2001, 0xb3a4, 0x0010, 0x2001, 0xb3e4,
++	0x2004, 0xa084, 0x8000, 0x6100, 0xa10d, 0x6204, 0x6308, 0x0804,
++	0x1429, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2091, 0x8000, 0x2061,
++	0x0010, 0x60c4, 0xd0fc, 0x1178, 0x2071, 0xb380, 0x7808, 0xd0ec,
++	0x0128, 0x2079, 0x0100, 0x2019, 0x0020, 0x0058, 0x2079, 0x0200,
++	0x2019, 0x0050, 0x0030, 0x2071, 0xb3c0, 0x2079, 0x0100, 0x2019,
++	0x0020, 0x7094, 0xa06d, 0x0904, 0x1bb1, 0x6a04, 0xa294, 0x00ff,
++	0xa286, 0x0007, 0x0120, 0xa286, 0x000f, 0x1904, 0x1bb1, 0x691c,
++	0xa184, 0x00c0, 0x0904, 0x1bb1, 0xa186, 0x00c0, 0x0904, 0x1bb1,
++	0x6824, 0xa084, 0xff00, 0xa085, 0x0019, 0x6826, 0x2368, 0x7830,
++	0xa084, 0x0040, 0x1de0, 0xa184, 0x0080, 0x1904, 0x1b87, 0x78e4,
++	0xa084, 0x0007, 0x8001, 0x1dd8, 0x71a4, 0x81ff, 0x0150, 0x6807,
++	0x0010, 0x6908, 0x6808, 0xa106, 0x1de0, 0x6804, 0xa084, 0x0010,
++	0x1de0, 0x78b8, 0x8007, 0xa084, 0x007f, 0x1dd8, 0x7848, 0xa085,
++	0x000c, 0x784a, 0x71a4, 0x81ff, 0x0180, 0x70a7, 0x0000, 0x6807,
++	0x0018, 0x6804, 0xa084, 0x0008, 0x1de0, 0x6807, 0x0008, 0x6804,
++	0xa084, 0x0008, 0x1de0, 0x6807, 0x0002, 0x61c4, 0xa18c, 0x0003,
++	0x0904, 0x1bad, 0x62c8, 0x63cc, 0x61c6, 0x62ca, 0x63ce, 0x7848,
++	0xa084, 0x000c, 0x1de0, 0x00e6, 0x2071, 0xb340, 0x724a, 0x734e,
++	0xae80, 0x0012, 0x00ee, 0x080c, 0x51f4, 0x78a3, 0x0000, 0x7858,
++	0xa084, 0xedff, 0x785a, 0x70a8, 0xa080, 0x00f3, 0x781a, 0x00fe,
++	0x00ee, 0x00de, 0x00ce, 0x2091, 0x8001, 0x0804, 0x142c, 0x78e4,
++	0xa084, 0x0007, 0x1de0, 0x78b8, 0x8007, 0xa084, 0x007f, 0x1dd8,
++	0x7848, 0xa085, 0x000c, 0x784a, 0x7848, 0xa084, 0x000c, 0x1de0,
++	0x71a4, 0x81ff, 0x0190, 0x6807, 0x0010, 0x70a7, 0x0000, 0x6807,
++	0x0018, 0x6804, 0xa084, 0x0008, 0x1de0, 0x6807, 0x0008, 0x6804,
++	0xa084, 0x0008, 0x1de0, 0x6807, 0x0002, 0x70a8, 0xa080, 0x00b7,
++	0x0868, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x2091, 0x8001, 0x2001,
++	0x4005, 0x0804, 0x142e, 0x7958, 0x71c6, 0x71c4, 0xa182, 0x0003,
++	0x1a04, 0x1425, 0x795a, 0x0804, 0x142c, 0x7958, 0x71c6, 0x0804,
++	0x142c, 0x7900, 0x71c6, 0x71c4, 0x7902, 0x0804, 0x142c, 0x7900,
++	0x71c6, 0x0804, 0x142c, 0x7904, 0x70c4, 0x7806, 0xd094, 0x0140,
++	0x70c8, 0x78f2, 0x70cc, 0x78f6, 0x70d8, 0x78fa, 0x70dc, 0x78fe,
++	0x0804, 0x142b, 0x7804, 0x70c6, 0xd094, 0x0140, 0x78f0, 0x70ca,
++	0x78f4, 0x70ce, 0x78f8, 0x70da, 0x78fc, 0x70de, 0x0804, 0x142c,
++	0x71c4, 0xd1fc, 0x1118, 0x2011, 0xb800, 0x0010, 0x2011, 0xb900,
++	0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa268,
++	0x2011, 0x0000, 0x6814, 0xd0fc, 0x0110, 0xa295, 0x0200, 0xd0b4,
++	0x0110, 0xa295, 0x0001, 0x6b0c, 0x6800, 0x70da, 0x6820, 0x70de,
++	0x0804, 0x1429, 0x780c, 0xd0f4, 0x0130, 0x2001, 0x4007, 0x70db,
++	0x0000, 0xa005, 0x0048, 0xd0fc, 0x0130, 0x2001, 0x4007, 0x70db,
++	0x0001, 0xa005, 0x0008, 0xa006, 0x0005, 0x780c, 0xd0f4, 0x0128,
++	0x2001, 0x4007, 0x70db, 0x0000, 0x0008, 0xa006, 0x0005, 0x780c,
++	0xd0fc, 0x0128, 0x2001, 0x4007, 0x70db, 0x0001, 0x0008, 0xa006,
++	0x0005, 0xac80, 0x0001, 0x080c, 0x1e7a, 0x0005, 0x7112, 0x7003,
++	0x0001, 0x7007, 0x0001, 0x2099, 0x0030, 0x20a9, 0x0020, 0xac80,
++	0x0001, 0x20a0, 0x7008, 0xd0fc, 0x0de8, 0x7007, 0x0002, 0xa08c,
++	0x01e0, 0x1510, 0x53a5, 0x7884, 0xa005, 0x01e8, 0x0411, 0x0148,
++	0x2c00, 0x788a, 0x20a9, 0x0020, 0xac80, 0x0001, 0x20a0, 0x53a5,
++	0x0090, 0x7887, 0x0000, 0x7218, 0x731c, 0x7420, 0x7524, 0xa292,
++	0x0040, 0xa39b, 0x0000, 0xa4a3, 0x0000, 0xa5ab, 0x0000, 0x721a,
++	0x731e, 0x7422, 0x7526, 0xa006, 0x7003, 0x0000, 0x7007, 0x0004,
++	0x0005, 0x2091, 0x8000, 0x783c, 0xa065, 0x0120, 0x2c04, 0x783e,
++	0x2063, 0x0000, 0x2091, 0x8001, 0x0005, 0x00f6, 0x2079, 0xb340,
++	0x783c, 0xa06d, 0x0140, 0x2d04, 0x783e, 0x6803, 0x0000, 0x6807,
++	0x0000, 0x680b, 0x0000, 0x00fe, 0x0005, 0x2091, 0x8000, 0x00f6,
++	0x2079, 0xb340, 0x783c, 0x2062, 0x2c00, 0xa005, 0x1110, 0x080c,
++	0x297f, 0x783e, 0x00fe, 0x2091, 0x8001, 0x0005, 0x00f6, 0x2079,
++	0xb340, 0x783c, 0x206a, 0x2d00, 0x783e, 0x00fe, 0x0005, 0x3800,
++	0xa084, 0x0003, 0x0118, 0x2011, 0x1100, 0x0010, 0x2011, 0x5d00,
++	0x7a3e, 0x7bc4, 0x8319, 0x0128, 0xa280, 0x0037, 0x2012, 0x2010,
++	0x0cc8, 0x2013, 0x0000, 0x0005, 0x0016, 0x2069, 0xda00, 0xd7fc,
++	0x1110, 0x2069, 0xba00, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f,
++	0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xad68, 0x001e, 0x0005,
++	0x0c59, 0x2900, 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xf9ef,
++	0xa80d, 0x690a, 0x00e6, 0xd7fc, 0x1128, 0x2009, 0xb394, 0x2071,
++	0xb380, 0x0020, 0x2009, 0xb3d4, 0x2071, 0xb3c0, 0x210c, 0x6804,
++	0xa005, 0x0148, 0xa116, 0x1138, 0x2060, 0x6000, 0x6806, 0x0016,
++	0x200b, 0x0000, 0x0018, 0x2009, 0x0000, 0x0016, 0x6804, 0xa065,
++	0x0148, 0x6000, 0x6806, 0x04b9, 0x080c, 0x2076, 0x6810, 0x8001,
++	0x6812, 0x1da0, 0x001e, 0x6902, 0x6906, 0x2d00, 0x2060, 0x080c,
++	0x2af4, 0x00ee, 0x0005, 0xa065, 0x0170, 0x2008, 0x609c, 0xa005,
++	0x0128, 0x2062, 0x609f, 0x0000, 0xa065, 0x0cc0, 0x2079, 0xb340,
++	0x783c, 0x793e, 0x2062, 0x0005, 0xa065, 0x01a0, 0x2008, 0x609c,
++	0xa005, 0x0128, 0x2062, 0x609f, 0x0000, 0xa065, 0x0cc0, 0x00f6,
++	0x2079, 0xb340, 0x2091, 0x8000, 0x783c, 0x793e, 0x00fe, 0x2062,
++	0x2091, 0x8001, 0x0005, 0x6007, 0x0103, 0x608f, 0x0000, 0x20a9,
++	0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828,
++	0x601a, 0x682c, 0x6022, 0x0005, 0x00e6, 0xd7fc, 0x1128, 0x2071,
++	0xb380, 0x2031, 0xb400, 0x0020, 0x2071, 0xb3c0, 0x2031, 0xb600,
++	0x7054, 0xa08c, 0x0200, 0x1128, 0xa608, 0x2d0a, 0x8000, 0x7056,
++	0xa006, 0x00ee, 0x0005, 0x00f6, 0xd7fc, 0x1118, 0x2079, 0xb380,
++	0x0010, 0x2079, 0xb3c0, 0x080c, 0x1cc4, 0x2091, 0x8000, 0x6804,
++	0x7806, 0xa065, 0x05d0, 0x0028, 0x2c00, 0x7806, 0x6000, 0xa065,
++	0x05a0, 0x6010, 0xa306, 0x1dc0, 0x600c, 0xa206, 0x1da8, 0x2c28,
++	0x7850, 0xac06, 0x1108, 0x0430, 0x6804, 0xac06, 0x1140, 0x6000,
++	0x2060, 0x6806, 0xa005, 0x1118, 0x6803, 0x0000, 0x0048, 0x6400,
++	0x7804, 0x2060, 0x6402, 0xa486, 0x0000, 0x1110, 0x2c00, 0x6802,
++	0x2560, 0x00fe, 0x080c, 0x1d3b, 0x00f6, 0x601b, 0x0005, 0x6023,
++	0x0020, 0x00fe, 0x080c, 0x2076, 0x00f6, 0x6810, 0x8001, 0x0b0c,
++	0x297f, 0x6812, 0xa085, 0xffff, 0xa005, 0x00fe, 0x0005, 0x0076,
++	0x2700, 0x2039, 0x0000, 0xd0fc, 0x0108, 0xc7fd, 0x2041, 0x0021,
++	0x2049, 0x0004, 0x2051, 0x0008, 0x2091, 0x8000, 0x080c, 0x1cd8,
++	0x8738, 0xa784, 0x001f, 0x1dd0, 0xa7bc, 0xff00, 0x873f, 0x8738,
++	0x873f, 0xa784, 0x0f00, 0x1d90, 0x2091, 0x8001, 0x007e, 0x0005,
++	0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x11b8, 0x7808, 0xd08c,
++	0x0130, 0xc08c, 0x780a, 0xc7fc, 0x2069, 0xb380, 0x0028, 0xc08d,
++	0x780a, 0x2069, 0xb3c0, 0xc7fd, 0x2091, 0x8000, 0x6818, 0x681b,
++	0x0000, 0x2091, 0x8001, 0xa005, 0x1108, 0x0005, 0xa08c, 0xfff0,
++	0x0110, 0x080c, 0x297f, 0x0002, 0x1e04, 0x1e07, 0x1e0d, 0x1e11,
++	0x1e05, 0x1e15, 0x1e1b, 0x1e05, 0x1e05, 0x1f85, 0x1faf, 0x1fb2,
++	0x1fb7, 0x1e05, 0x1e05, 0x1e05, 0x0005, 0x080c, 0x297f, 0x080c,
++	0x1daf, 0x2001, 0x8001, 0x0804, 0x1fc7, 0x2001, 0x8003, 0x0804,
++	0x1fc7, 0x2001, 0x8004, 0x0804, 0x1fc7, 0x080c, 0x1daf, 0x2001,
++	0x8006, 0x0804, 0x1fc7, 0x2001, 0x8007, 0x0804, 0x1fc7, 0x2030,
++	0x2138, 0xa782, 0x0021, 0x0210, 0x2009, 0x0020, 0x2600, 0x0099,
++	0x1188, 0xa7ba, 0x0020, 0x0268, 0x0160, 0x2708, 0xa6b0, 0x0020,
++	0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000,
++	0x0c40, 0xa006, 0x0005, 0x81ff, 0x01f0, 0x2099, 0x0030, 0x20a0,
++	0x700c, 0xa084, 0x07ff, 0x0130, 0x7007, 0x0004, 0x7004, 0xa084,
++	0x0004, 0x1de0, 0x21a8, 0x810b, 0x7112, 0x7003, 0x0001, 0x7007,
++	0x0001, 0x7008, 0x800b, 0x1ee8, 0x7007, 0x0002, 0xa08c, 0x01e0,
++	0x1110, 0x53a5, 0xa006, 0x7003, 0x0000, 0x0005, 0x2030, 0x2138,
++	0xa782, 0x0021, 0x0210, 0x2009, 0x0020, 0x2600, 0x0099, 0x1188,
++	0xa7ba, 0x0020, 0x0268, 0x0160, 0x2708, 0xa6b0, 0x0020, 0xa290,
++	0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x0c40,
++	0xa006, 0x0005, 0x81ff, 0x0588, 0x2098, 0x20a1, 0x0030, 0x700c,
++	0xa084, 0x07ff, 0x0100, 0x21a8, 0x810b, 0x7112, 0x7018, 0x0006,
++	0x701c, 0x0006, 0x7020, 0x0006, 0x7024, 0x0006, 0x721a, 0x731e,
++	0x7422, 0x7526, 0x7003, 0x0000, 0x53a6, 0x7007, 0x0001, 0x7010,
++	0xa084, 0xf000, 0x0118, 0x7007, 0x0008, 0x0018, 0x7108, 0x8103,
++	0x1eb0, 0x000e, 0x7026, 0x000e, 0x7022, 0x000e, 0x701e, 0x000e,
++	0x701a, 0x7007, 0x0002, 0xa184, 0x01e0, 0x7003, 0x0000, 0x7007,
++	0x0004, 0x0005, 0x00e6, 0x6914, 0xd1fc, 0x0118, 0x2071, 0xb3c0,
++	0x0010, 0x2071, 0xb380, 0x2d08, 0x70b4, 0x6802, 0xa005, 0x1108,
++	0x71ba, 0x71b6, 0x00ee, 0x0005, 0x00f6, 0x6114, 0xd1fc, 0x0118,
++	0x2079, 0xb3c0, 0x0010, 0x2079, 0xb380, 0x2c08, 0x78b4, 0x6002,
++	0xa005, 0x1108, 0x79ba, 0x79b6, 0x00fe, 0x0005, 0x2091, 0x8000,
++	0x00f6, 0x6114, 0xd1fc, 0x0118, 0x2079, 0xb3c0, 0x0010, 0x2079,
++	0xb380, 0x6003, 0x0000, 0x2c08, 0x78b8, 0xa065, 0x1110, 0x79b6,
++	0x0008, 0x6102, 0x79ba, 0x00fe, 0x2091, 0x8001, 0x080c, 0x2636,
++	0x0005, 0x70b4, 0xa06d, 0x0130, 0x6800, 0x70b6, 0xa005, 0x1108,
++	0x70ba, 0x8dff, 0x0005, 0x00d6, 0x00c6, 0x00f6, 0xd3fc, 0x0118,
++	0x2079, 0xb3c0, 0x0010, 0x2079, 0xb380, 0xaf80, 0x002d, 0x2060,
++	0x6000, 0xa005, 0x01e0, 0x2068, 0x6814, 0xa306, 0x1128, 0x6828,
++	0xa084, 0x00ff, 0xa406, 0x0110, 0x2d60, 0x0c90, 0x6800, 0xa005,
++	0x6002, 0x1130, 0xaf80, 0x002d, 0xac06, 0x0108, 0x2c00, 0x78ba,
++	0x00d6, 0x689c, 0xa005, 0x0110, 0x080c, 0x1d13, 0x000e, 0x00fe,
++	0x00ce, 0x00de, 0xa005, 0x0005, 0x00d6, 0x00c6, 0x00f6, 0xd0fc,
++	0x0118, 0x2079, 0xb3c0, 0x0010, 0x2079, 0xb380, 0xaf80, 0x002d,
++	0x2060, 0x6000, 0xa005, 0x01c8, 0x2068, 0x6814, 0xa084, 0x00ff,
++	0xa306, 0x0110, 0x2d60, 0x0ca8, 0x6800, 0xa005, 0x6002, 0x1130,
++	0xaf80, 0x002d, 0xac06, 0x0108, 0x2c00, 0x78ba, 0x00d6, 0x689c,
++	0xa005, 0x0110, 0x080c, 0x1d13, 0x000e, 0x00fe, 0x00ce, 0x00de,
++	0xa005, 0x0005, 0x00d6, 0x00c6, 0x00f6, 0xd3fc, 0x0118, 0x2079,
++	0xb3c0, 0x0010, 0x2079, 0xb380, 0xaf80, 0x002d, 0x2060, 0x6000,
++	0xa06d, 0x01b0, 0x6814, 0xa306, 0x0110, 0x2d60, 0x0cc0, 0x6800,
++	0xa005, 0x6002, 0x1130, 0xaf80, 0x002d, 0xac06, 0x0108, 0x2c00,
++	0x78ba, 0x00d6, 0x689c, 0xa005, 0x0110, 0x080c, 0x1d13, 0x000e,
++	0x00fe, 0x00ce, 0x00de, 0xa005, 0x0005, 0x2091, 0x8000, 0xd7fc,
++	0x1118, 0x2069, 0xb380, 0x0010, 0x2069, 0xb3c0, 0x6800, 0xa086,
++	0x0000, 0x0128, 0x2091, 0x8001, 0x681b, 0x0009, 0x0005, 0x6878,
++	0xd7fc, 0x1108, 0x0008, 0xc0fd, 0xa0bc, 0xff00, 0x2041, 0x0021,
++	0x2049, 0x0004, 0x2051, 0x0010, 0x080c, 0x1cd8, 0x8738, 0xa784,
++	0x001f, 0x1dd0, 0x2091, 0x8001, 0x2001, 0x800a, 0x00c0, 0x2001,
++	0x800c, 0x00a8, 0x080c, 0x1daf, 0x2001, 0x800d, 0x0080, 0x780c,
++	0xd0e4, 0x1158, 0xd0ec, 0x0120, 0xd7fc, 0x0110, 0x78e4, 0x0008,
++	0x78e0, 0x70c6, 0x2001, 0x800e, 0x0010, 0x0804, 0x1e05, 0x70c2,
++	0xd7fc, 0x1118, 0x70db, 0x0000, 0x0010, 0x70db, 0x0001, 0x2061,
++	0x0000, 0x601b, 0x0001, 0x2091, 0x4080, 0x0005, 0xac80, 0x0001,
++	0x81ff, 0x0518, 0x2099, 0x0030, 0x20a0, 0x700c, 0xa084, 0x07ff,
++	0x0100, 0x7018, 0x0006, 0x701c, 0x0006, 0x7020, 0x0006, 0x7024,
++	0x0006, 0x7112, 0x81ac, 0x721a, 0x731e, 0x7422, 0x7526, 0x7003,
++	0x0001, 0x7007, 0x0001, 0x7008, 0x800b, 0x1ee8, 0x7007, 0x0002,
++	0xa08c, 0x01e0, 0x1110, 0x53a5, 0xa006, 0x7003, 0x0000, 0x7007,
++	0x0004, 0x000e, 0x7026, 0x000e, 0x7022, 0x000e, 0x701e, 0x000e,
++	0x701a, 0x0005, 0x2011, 0x0020, 0x2009, 0x0010, 0x6b0a, 0x6c0e,
++	0x681f, 0x0201, 0x6803, 0xfd20, 0x6807, 0x0038, 0x6a1a, 0x6823,
++	0x0200, 0x6827, 0x0000, 0x2d00, 0xa0e8, 0x0010, 0xa290, 0x0004,
++	0x8109, 0x1d60, 0x0005, 0x70ec, 0xd0dc, 0x1520, 0x2029, 0x0001,
++	0x780c, 0xd0cc, 0x1160, 0x70ec, 0xd0e4, 0x2019, 0x0c0a, 0x2021,
++	0x000a, 0x1120, 0x2019, 0x0c0c, 0x2021, 0x000c, 0x0070, 0x70ec,
++	0xd0e4, 0x1128, 0x2019, 0x1c0c, 0x2021, 0x000c, 0x0030, 0x2019,
++	0x1c09, 0x2021, 0x0009, 0xa5ad, 0x0200, 0x6b0a, 0x6c0e, 0x6d1e,
++	0x6807, 0x0038, 0x0005, 0x7018, 0x0006, 0x701c, 0x0006, 0x7020,
++	0x0006, 0x7024, 0x0006, 0x721a, 0x731e, 0x7422, 0x7526, 0x7003,
++	0x0000, 0x7007, 0x0001, 0x7010, 0xa084, 0xf000, 0x0118, 0x7007,
++	0x0008, 0x0018, 0x7108, 0x8103, 0x1eb0, 0x000e, 0x7026, 0x000e,
++	0x7022, 0x000e, 0x701e, 0x000e, 0x701a, 0x7007, 0x0002, 0xa184,
++	0x01e0, 0x7003, 0x0000, 0x7007, 0x0004, 0x0005, 0x6004, 0x2c08,
++	0x2063, 0x0000, 0x785c, 0x8000, 0x785e, 0x7860, 0xa005, 0x7962,
++	0x0110, 0x2c02, 0x0008, 0x7966, 0x0005, 0x6807, 0x0103, 0x00c6,
++	0x2061, 0xb340, 0x2d08, 0x206b, 0x0000, 0x605c, 0x8000, 0x605e,
++	0x6060, 0xa005, 0x6162, 0x0110, 0x2d02, 0x0008, 0x6166, 0x00ce,
++	0x0005, 0x2091, 0x8000, 0x785c, 0x8001, 0x785e, 0x2c04, 0x7866,
++	0xa005, 0x1108, 0x7862, 0x2091, 0x8001, 0x609c, 0xa005, 0x01a8,
++	0x00c6, 0x2060, 0x2008, 0x609c, 0xa005, 0x0138, 0x2062, 0x609f,
++	0x0000, 0xa065, 0x609c, 0xa005, 0x1dc8, 0x2091, 0x8000, 0x783c,
++	0x793e, 0x2062, 0x2091, 0x8001, 0x00ce, 0x2091, 0x8000, 0x783c,
++	0x2062, 0x609f, 0x0000, 0x2c00, 0xa005, 0x1110, 0x080c, 0x297f,
++	0x783e, 0x2091, 0x8001, 0x0005, 0x7864, 0xa065, 0x0168, 0x2091,
++	0x8000, 0x785c, 0x8001, 0x785e, 0x2c04, 0x7866, 0xa005, 0x1110,
++	0x7862, 0x8000, 0x2091, 0x8001, 0x0005, 0x20a9, 0x0010, 0xa006,
++	0x8004, 0x8086, 0x818e, 0x1208, 0xa200, 0x1f04, 0x20e1, 0x8086,
++	0x818e, 0x0005, 0x0156, 0x20a9, 0x0010, 0xa005, 0x01b8, 0xa11a,
++	0x12a8, 0x8213, 0x818d, 0x0228, 0xa11a, 0x1220, 0x1f04, 0x20f1,
++	0x0028, 0xa11a, 0x2308, 0x8210, 0x1f04, 0x20f1, 0x0006, 0x3200,
++	0xa084, 0xefff, 0x2080, 0x000e, 0x015e, 0x0005, 0x0006, 0x3200,
++	0xa085, 0x1000, 0x0cb8, 0x7d6c, 0x70d0, 0xa506, 0x0904, 0x218e,
++	0x7808, 0xd0ec, 0x0190, 0x00e6, 0x2091, 0x8000, 0x2071, 0x0020,
++	0x7004, 0xa005, 0x1138, 0x7008, 0x00ee, 0xa086, 0x0008, 0x0128,
++	0x0804, 0x218e, 0x00ee, 0x0804, 0x218e, 0x080c, 0x1c79, 0x0904,
++	0x218e, 0x7968, 0x2500, 0x8000, 0xa112, 0x2009, 0x0040, 0x1210,
++	0xa006, 0x0038, 0x72d0, 0xa206, 0x0120, 0x7887, 0x0001, 0x2009,
++	0x0080, 0x00c6, 0x080c, 0x1c3e, 0x00ce, 0x05d8, 0x080c, 0x1c95,
++	0x7887, 0x0000, 0x7880, 0x8000, 0x7882, 0xa086, 0x0002, 0x01a0,
++	0x8507, 0x8004, 0x8004, 0x7974, 0xa108, 0x711a, 0x1260, 0x7970,
++	0xa189, 0x0000, 0x711e, 0x797c, 0xa189, 0x0000, 0x7122, 0x7978,
++	0xa189, 0x0000, 0x7126, 0x0490, 0x6014, 0xd0fc, 0x1118, 0x2069,
++	0xb380, 0x0010, 0x2069, 0xb3c0, 0x2091, 0x8000, 0x681b, 0x0002,
++	0x7884, 0xa005, 0x0128, 0x7887, 0x0000, 0x7888, 0x2060, 0x0c60,
++	0x7883, 0x0000, 0x78ac, 0xa085, 0x0003, 0x78ae, 0x2091, 0x8001,
++	0x00a8, 0x7883, 0x0000, 0x080c, 0x24c9, 0x6004, 0xa084, 0x000f,
++	0x0071, 0x7884, 0xa005, 0x0130, 0x7888, 0x2060, 0x6004, 0xa084,
++	0x000f, 0x0029, 0x7887, 0x0000, 0x0804, 0x210b, 0x0005, 0x0002,
++	0x21a0, 0x21bb, 0x21d6, 0x21a0, 0x21ef, 0x21af, 0x2341, 0x2357,
++	0x21a0, 0x21b9, 0x21d4, 0x2232, 0x22a0, 0x22e9, 0x22fa, 0x2357,
++	0x2039, 0x0400, 0x78bc, 0xa705, 0x78be, 0x6008, 0xa705, 0x600a,
++	0x080c, 0x23ca, 0x609c, 0x78ba, 0x080c, 0x24b3, 0x0005, 0x78bc,
++	0xa084, 0x0100, 0x0108, 0x0c60, 0x601c, 0xa085, 0x0080, 0x601e,
++	0x0038, 0x080c, 0x250a, 0x78bc, 0xa084, 0x0100, 0x0108, 0x0c00,
++	0x78bf, 0x0000, 0x6004, 0x8007, 0xa084, 0x00ff, 0x78b2, 0x8001,
++	0x0140, 0x080c, 0x23ca, 0x0128, 0x78bc, 0xa085, 0x0100, 0x78be,
++	0x0010, 0x0804, 0x23e6, 0x0005, 0x080c, 0x2507, 0x78bc, 0xa08c,
++	0x0e00, 0x1118, 0xa084, 0x0100, 0x1108, 0x0810, 0x080c, 0x23ca,
++	0x1168, 0x6104, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0904, 0x2394,
++	0xa186, 0x000f, 0x0904, 0x2394, 0x0804, 0x23e6, 0x0005, 0x78bc,
++	0xa084, 0x0100, 0x0110, 0x0804, 0x21a0, 0x78bf, 0x0000, 0x6714,
++	0x080c, 0x1cc4, 0x2011, 0x0001, 0x20a9, 0x0001, 0x6018, 0xa084,
++	0x00ff, 0xa005, 0x0198, 0x2011, 0x0001, 0xa7bc, 0xff00, 0x20a9,
++	0x0020, 0xa08e, 0x0001, 0x0150, 0xa7bc, 0x8000, 0x2011, 0x0002,
++	0x20a9, 0x0100, 0xa08e, 0x0002, 0x0108, 0x00c8, 0x0156, 0x080c,
++	0x1cc4, 0x015e, 0x2091, 0x8000, 0x682b, 0x0000, 0x682f, 0x0000,
++	0x6808, 0xa084, 0xffde, 0x680a, 0xade8, 0x0010, 0x2091, 0x8001,
++	0x1f04, 0x221a, 0x8211, 0x0118, 0x20a9, 0x0100, 0x0c58, 0x080c,
++	0x1c95, 0x0005, 0x6114, 0x080c, 0x2525, 0x6900, 0xa184, 0x0001,
++	0x0190, 0x6028, 0xa084, 0x00ff, 0x1904, 0x23ae, 0x6800, 0xa084,
++	0x0001, 0x0904, 0x23b4, 0x6803, 0x0000, 0x680b, 0x0000, 0x6807,
++	0x0000, 0x0804, 0x23ba, 0x2011, 0x0001, 0x6020, 0xd0f4, 0x0110,
++	0xa295, 0x0002, 0xd0c4, 0x0110, 0xa295, 0x0008, 0xd0cc, 0x0110,
++	0xa295, 0x0400, 0x601c, 0xa084, 0x0002, 0x0110, 0xa295, 0x0004,
++	0x602c, 0xa08c, 0x00ff, 0xa182, 0x0002, 0x0a04, 0x23b7, 0xa182,
++	0x001b, 0x1a04, 0x23b7, 0x0904, 0x23b7, 0x690e, 0x602c, 0x8007,
++	0xa08c, 0x00ff, 0xa182, 0x0002, 0x0a04, 0x23b7, 0xa182, 0x001b,
++	0x1a04, 0x23b7, 0x0904, 0x23b7, 0x6912, 0x6134, 0xa184, 0x000f,
++	0x0138, 0x8000, 0xd0a4, 0x0108, 0x8001, 0xa18c, 0xfff0, 0xa10d,
++	0x6922, 0x6030, 0xa005, 0x1110, 0x2001, 0x001e, 0x8000, 0x6816,
++	0x6028, 0xa084, 0x00ff, 0x0904, 0x23b4, 0x6806, 0x6028, 0x8007,
++	0xa084, 0x00ff, 0x0904, 0x23b4, 0x680a, 0x6a02, 0x0804, 0x23ba,
++	0x6014, 0xd0fc, 0x1118, 0x2001, 0xb3a4, 0x0010, 0x2001, 0xb3e4,
++	0x2004, 0xa084, 0x8000, 0x0904, 0x23b4, 0x6114, 0x080c, 0x2525,
++	0x2091, 0x8000, 0x6a04, 0x6b08, 0x6418, 0xa484, 0x0003, 0x0170,
++	0x6128, 0xa18c, 0x00ff, 0x8001, 0x1120, 0x2100, 0xa210, 0x0628,
++	0x0028, 0x8001, 0x1510, 0x2100, 0xa212, 0x02f8, 0xa484, 0x000c,
++	0x0188, 0x6128, 0x810f, 0xa18c, 0x00ff, 0xa082, 0x0004, 0x1120,
++	0x2100, 0xa318, 0x0290, 0x0030, 0xa082, 0x0004, 0x1170, 0x2100,
++	0xa31a, 0x0258, 0x6030, 0xa005, 0x0110, 0x8000, 0x6816, 0x6a06,
++	0x6b0a, 0x2091, 0x8001, 0x0804, 0x23ba, 0x2091, 0x8001, 0x0804,
++	0x23b7, 0x6114, 0x080c, 0x2525, 0x2091, 0x8000, 0x6b08, 0x8318,
++	0x0228, 0x6b0a, 0x2091, 0x8001, 0x0804, 0x23c8, 0x2091, 0x8001,
++	0x0804, 0x23b7, 0x6024, 0x8007, 0xa084, 0x00ff, 0x01e0, 0xa086,
++	0x0080, 0x15e8, 0x20a9, 0x0008, 0x6014, 0xd0fc, 0x1118, 0x2069,
++	0xfc20, 0x0010, 0x2069, 0xfd40, 0x2091, 0x8000, 0x6800, 0xa084,
++	0xfcff, 0x6802, 0xade8, 0x0009, 0x0f04, 0x2317, 0x0cb8, 0x2091,
++	0x8001, 0x0804, 0x23ba, 0x6028, 0xa015, 0x0508, 0x6114, 0x080c,
++	0x2525, 0x00d6, 0xade8, 0x0007, 0x2091, 0x8000, 0x6800, 0xa00d,
++	0x0198, 0xa206, 0x0110, 0x2168, 0x0cc8, 0x00c6, 0x2160, 0x6000,
++	0x6802, 0x080c, 0x1c95, 0x00ce, 0x00de, 0x6808, 0x8000, 0x680a,
++	0x2091, 0x8001, 0x0804, 0x23c8, 0x2091, 0x8001, 0x00de, 0x0804,
++	0x23b4, 0x6114, 0x080c, 0x2525, 0x6800, 0xa084, 0x0001, 0x0904,
++	0x23a8, 0x2091, 0x8000, 0x6a04, 0x8210, 0x0228, 0x6a06, 0x2091,
++	0x8001, 0x0804, 0x23c8, 0x2091, 0x8001, 0x0804, 0x23b7, 0x6114,
++	0x080c, 0x2525, 0x60ce, 0x60bb, 0x0000, 0x6018, 0xa08c, 0xff00,
++	0x6820, 0xa084, 0x00ff, 0xa105, 0x601a, 0x6900, 0xa184, 0x0008,
++	0x0120, 0x6020, 0xa085, 0x0100, 0x6022, 0xa184, 0x0001, 0x0904,
++	0x23b4, 0xa184, 0x0100, 0x1588, 0xa184, 0x0200, 0x1558, 0x681c,
++	0xa005, 0x1588, 0x6004, 0xa084, 0x00ff, 0xa086, 0x000f, 0x1110,
++	0x080c, 0x250a, 0x78bf, 0x0000, 0x6004, 0x8007, 0xa084, 0x00ff,
++	0x78b2, 0x8001, 0x609f, 0x0000, 0x0138, 0x04e1, 0x0128, 0x78bc,
++	0xa085, 0x0100, 0x78be, 0x0005, 0x78b7, 0x0000, 0x78bb, 0x0000,
++	0x6024, 0xa084, 0xff00, 0x6026, 0x080c, 0x42ef, 0x1108, 0x0005,
++	0x0804, 0x1ed6, 0x2009, 0x0017, 0x00b8, 0x2009, 0x000e, 0x00a0,
++	0x2009, 0x0007, 0x0088, 0x2009, 0x0035, 0x0070, 0x2009, 0x003e,
++	0x0058, 0x2009, 0x0004, 0x0040, 0x2009, 0x0006, 0x0028, 0x2009,
++	0x0016, 0x0010, 0x2009, 0x0001, 0x6024, 0xa084, 0xff00, 0xa105,
++	0x6026, 0x2091, 0x8000, 0x080c, 0x2076, 0x2091, 0x8001, 0x0005,
++	0x0804, 0x1c95, 0x609f, 0x0000, 0x78b4, 0xa06d, 0x2c00, 0x78b6,
++	0x1110, 0x78ba, 0x0038, 0x689e, 0x2d00, 0x6002, 0x78b8, 0xad06,
++	0x1108, 0x6002, 0x78b0, 0x8001, 0x78b2, 0x1138, 0x78bc, 0xa084,
++	0xfeff, 0x78be, 0x78b8, 0x2060, 0xa006, 0x0005, 0x00e6, 0xa02e,
++	0x2530, 0x65ae, 0x65b2, 0x601c, 0x60a2, 0x2048, 0xa984, 0xe1ff,
++	0x601e, 0xa984, 0x0060, 0x0110, 0x080c, 0x5365, 0x6596, 0x65a6,
++	0x669a, 0x66aa, 0x6714, 0x2071, 0xb3c0, 0xd7fc, 0x1110, 0x2071,
++	0xb380, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x0120, 0x8003,
++	0x8003, 0x8003, 0x8003, 0xa105, 0x71e0, 0xa168, 0x2700, 0x8007,
++	0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0x8003, 0x71e4, 0xa100,
++	0x60c6, 0x2091, 0x8000, 0x780c, 0xd0c4, 0x0160, 0xd0ec, 0x0138,
++	0xd7fc, 0x1118, 0xd0f4, 0x1158, 0x0028, 0xd0fc, 0x1140, 0x7808,
++	0xd0f4, 0x1128, 0x6e08, 0xd684, 0x0560, 0xd9fc, 0x1550, 0x2091,
++	0x8001, 0x080c, 0x1d3b, 0x2091, 0x8000, 0x080c, 0x2076, 0x2091,
++	0x8001, 0x78b7, 0x0000, 0x78bb, 0x0000, 0x780c, 0xd0e4, 0x1904,
++	0x24b1, 0x780c, 0xd0c4, 0x0904, 0x24b1, 0xd0ec, 0x0150, 0xd7fc,
++	0x1120, 0xd0f4, 0x1150, 0x0804, 0x24b1, 0xd0fc, 0x1130, 0x0804,
++	0x24b1, 0x7808, 0xd0f4, 0x0904, 0x24b1, 0x601b, 0x0021, 0x0804,
++	0x24b1, 0x6024, 0xa096, 0x0001, 0x1110, 0x8000, 0x6026, 0x6a10,
++	0x6814, 0xa202, 0x0248, 0x0140, 0x2091, 0x8001, 0x2039, 0x0200,
++	0x080c, 0x24b3, 0x0804, 0x24b1, 0x2c08, 0xd9fc, 0x01f0, 0x6800,
++	0xa065, 0x01d8, 0x6a04, 0x7000, 0xa084, 0x0002, 0x0168, 0x7050,
++	0xa206, 0x1150, 0x6b04, 0x2160, 0x2304, 0x6002, 0xa005, 0x1108,
++	0x6902, 0x2260, 0x6102, 0x0098, 0x2d00, 0x2060, 0x080c, 0x2af4,
++	0x6e08, 0x2160, 0x6202, 0x6906, 0x0050, 0x6800, 0x6902, 0xa065,
++	0x0110, 0x6102, 0x0008, 0x6906, 0x2160, 0x6003, 0x0000, 0x2160,
++	0xd9fc, 0x0138, 0xa6b4, 0xffdc, 0x6e0a, 0x682b, 0x0000, 0x682f,
++	0x0000, 0x6810, 0x8000, 0x6812, 0x2091, 0x8001, 0xd6b4, 0x0128,
++	0xa6b6, 0x0040, 0x6e0a, 0x080c, 0x1d4c, 0x78bb, 0x0000, 0x78b7,
++	0x0000, 0x00ee, 0x0005, 0x6008, 0xa705, 0x600a, 0x2091, 0x8000,
++	0x080c, 0x2076, 0x2091, 0x8001, 0x78b8, 0xa065, 0x0128, 0x609c,
++	0x78ba, 0x609f, 0x0000, 0x0c90, 0x78b7, 0x0000, 0x78bb, 0x0000,
++	0x0005, 0x7968, 0x786c, 0x7b84, 0xd384, 0x0118, 0x8000, 0xa112,
++	0x0220, 0xc384, 0x8000, 0xa112, 0x1260, 0x7a74, 0x721a, 0x7a70,
++	0x721e, 0x7a7c, 0x7222, 0x7a78, 0x7226, 0xa006, 0xd384, 0x0108,
++	0x8000, 0x786e, 0x70d2, 0x7904, 0xd19c, 0x01b0, 0x0146, 0x00c6,
++	0x20a1, 0x0030, 0x20a2, 0x20a3, 0x0000, 0x7013, 0x0004, 0x2061,
++	0xfed8, 0x2c14, 0x8c60, 0x2c1c, 0x8c60, 0x2c24, 0x8c60, 0x2c2c,
++	0x080c, 0x204b, 0x00ce, 0x014e, 0x7814, 0xa005, 0x0138, 0x8001,
++	0x7816, 0x1120, 0x0e04, 0x2506, 0x2091, 0x4080, 0x0005, 0x2039,
++	0x251c, 0x0010, 0x2039, 0x2522, 0x2704, 0xa005, 0x0160, 0xac00,
++	0x2068, 0x6908, 0x6810, 0x6912, 0x680a, 0x690c, 0x6814, 0x6916,
++	0x680e, 0x8738, 0x0c88, 0x0005, 0x0003, 0x0009, 0x000f, 0x0015,
++	0x001b, 0x0000, 0x0015, 0x001b, 0x0000, 0x00c6, 0x6014, 0x080c,
++	0x449c, 0x2c68, 0x00ce, 0x0005, 0x78ab, 0x0000, 0x2009, 0xb341,
++	0x2104, 0xd084, 0x0510, 0x6004, 0xa086, 0x0103, 0x11f0, 0x6114,
++	0x6018, 0xa105, 0x11d0, 0x00d6, 0x2069, 0x0000, 0x6818, 0xd084,
++	0x1198, 0x600c, 0x70c6, 0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b,
++	0x0001, 0x2091, 0x4080, 0x00de, 0x080c, 0x2099, 0x0e04, 0x257e,
++	0x7864, 0xa065, 0x19d8, 0x0450, 0x00de, 0x0459, 0x0518, 0x6204,
++	0xa294, 0x00ff, 0xa296, 0x0003, 0x0130, 0x6204, 0xa296, 0x0110,
++	0x1168, 0x78ab, 0x0001, 0x6204, 0xa294, 0xff00, 0x8217, 0x8211,
++	0x0128, 0x85ff, 0x1178, 0x8210, 0xa202, 0x1260, 0x0056, 0x00f1,
++	0x005e, 0x1140, 0x8528, 0x78a8, 0xa005, 0x1120, 0x7864, 0xa065,
++	0x1904, 0x252e, 0x85ff, 0x0120, 0x2091, 0x4080, 0x7890, 0x70d6,
++	0x0005, 0x7b8c, 0x7990, 0x70d4, 0xa102, 0x1118, 0x2300, 0xa005,
++	0x0005, 0x0210, 0xa302, 0x0005, 0x8002, 0x0005, 0xa184, 0xff00,
++	0x0140, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100,
++	0x0018, 0x8107, 0x8004, 0x8004, 0x7a98, 0x7b94, 0x7ca0, 0x7d9c,
++	0xa210, 0xa006, 0xa319, 0xa421, 0xa529, 0x2009, 0x0020, 0x6004,
++	0xa086, 0x0103, 0x1128, 0x6028, 0xa005, 0x1110, 0x2009, 0x000c,
++	0x080c, 0x1c39, 0x01e0, 0x78a4, 0x8000, 0x78a6, 0xa086, 0x0002,
++	0x1904, 0x25fc, 0x6014, 0xd0fc, 0x1118, 0x2069, 0xb380, 0x0010,
++	0x2069, 0xb3c0, 0x2091, 0x8000, 0x681b, 0x0003, 0x78a7, 0x0000,
++	0x78ac, 0xa085, 0x0300, 0x78ae, 0x2091, 0x8001, 0x0468, 0x78a7,
++	0x0000, 0x080c, 0x2099, 0x798c, 0x7890, 0x8000, 0xa10a, 0x1208,
++	0xa006, 0x7892, 0x70d6, 0x7904, 0xd19c, 0x01e8, 0x0006, 0x0146,
++	0x00c6, 0x20a1, 0x0030, 0x20a2, 0xa006, 0x20a2, 0x7013, 0x0004,
++	0x2061, 0xfed8, 0x2c14, 0xa290, 0x0004, 0x8c60, 0x2c1c, 0xa319,
++	0x8c60, 0x2c24, 0xa421, 0x8c60, 0x2c2c, 0xa529, 0x080c, 0x204b,
++	0x00ce, 0x014e, 0x000e, 0xa006, 0x2071, 0x0010, 0x2091, 0x8001,
++	0x0005, 0x2138, 0xd7fc, 0x1118, 0x2009, 0xb39a, 0x0010, 0x2009,
++	0xb3da, 0x2091, 0x8000, 0x200a, 0x00f6, 0xd7fc, 0x1168, 0x2009,
++	0xb380, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x0118, 0x2079, 0x0100,
++	0x0038, 0x2079, 0x0200, 0x0020, 0x2009, 0xb3c0, 0x2079, 0x0100,
++	0x2104, 0xa086, 0x0000, 0x1180, 0xd7fc, 0x1118, 0x2009, 0xb384,
++	0x0010, 0x2009, 0xb3c4, 0x2104, 0xa005, 0x1130, 0x7830, 0xa084,
++	0x00c0, 0x1110, 0x781b, 0x0053, 0x00fe, 0x0005, 0x00f6, 0x00e6,
++	0x2c00, 0xa005, 0x1120, 0xa188, 0x0005, 0x2104, 0x0008, 0x6014,
++	0xd0fc, 0x1168, 0x2071, 0xb380, 0x2001, 0xb342, 0x2004, 0xd0ec,
++	0x0118, 0x2079, 0x0100, 0x0038, 0x2079, 0x0200, 0x0020, 0x2071,
++	0xb3c0, 0x2079, 0x0100, 0x2091, 0x8000, 0x7000, 0xa086, 0x0000,
++	0x1510, 0x00b8, 0x2c00, 0xa005, 0x1120, 0xa188, 0x0005, 0x2104,
++	0x0008, 0x6014, 0xd0fc, 0x1158, 0x2001, 0xb342, 0x2004, 0xd0ec,
++	0x0118, 0x2079, 0x0100, 0x0028, 0x2079, 0x0200, 0x0010, 0x2079,
++	0x0100, 0x7830, 0xa084, 0x00c0, 0x1130, 0x2c00, 0xa005, 0x1108,
++	0x2104, 0x781b, 0x0055, 0x2091, 0x8001, 0x00ee, 0x00fe, 0x0005,
++	0x2009, 0x0002, 0x2069, 0xb340, 0x6808, 0xd0ec, 0x1904, 0x26d5,
++	0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x26d5, 0x2071, 0xb3c0,
++	0x2079, 0x0100, 0x2021, 0xb5ff, 0x784b, 0x000f, 0x1104, 0x26a0,
++	0x7838, 0x0cd0, 0x784b, 0x000f, 0x1304, 0x26a0, 0x7838, 0x0cd0,
++	0x20a9, 0x0060, 0x789b, 0x0000, 0x78af, 0x0000, 0x78af, 0x0000,
++	0x1f04, 0x26a4, 0x70ab, 0x009d, 0x2019, 0x5a04, 0x04e1, 0x7003,
++	0x0000, 0x0016, 0xd18c, 0x2009, 0x0000, 0x0108, 0xc1bd, 0x080c,
++	0x286a, 0x001e, 0x701c, 0xa084, 0x000f, 0x0006, 0x680c, 0xd0e4,
++	0x000e, 0x1118, 0xa085, 0x6300, 0x0010, 0xa085, 0x62c0, 0x7806,
++	0x780f, 0x9200, 0x7843, 0x00d8, 0x7853, 0x0080, 0x780b, 0x2f08,
++	0x704f, 0x2f08, 0x745a, 0x7057, 0x0000, 0x8109, 0x0188, 0x2071,
++	0xb380, 0x6808, 0xd0ec, 0x0130, 0x2079, 0x0100, 0x2021, 0xb3ff,
++	0x0804, 0x2694, 0x2079, 0x0200, 0x2021, 0xb3ff, 0x0804, 0x269a,
++	0x080c, 0x2930, 0x0005, 0x0136, 0x0146, 0x0156, 0x0046, 0x0016,
++	0x3808, 0x20c1, 0x0020, 0xaf80, 0x002b, 0x20a0, 0x2304, 0xa005,
++	0x789a, 0x0190, 0x8318, 0x2324, 0x8318, 0x2398, 0x24a8, 0xa484,
++	0xff00, 0x0120, 0xa482, 0x0100, 0x20a9, 0x0100, 0x2020, 0x53a6,
++	0xa005, 0x1da0, 0x3318, 0x0c50, 0x21c0, 0x001e, 0x004e, 0x015e,
++	0x014e, 0x013e, 0x0005, 0x0016, 0x00f6, 0xd1bc, 0x1168, 0x0006,
++	0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0x2079, 0x0100,
++	0x0028, 0x2079, 0x0200, 0x0010, 0x2079, 0x0100, 0xa18c, 0x000f,
++	0x7804, 0xa084, 0xfff0, 0xa105, 0x7806, 0x00fe, 0x001e, 0x080c,
++	0x286a, 0x0005, 0xd3fc, 0x1168, 0x0006, 0x2001, 0xb342, 0x2004,
++	0xd0ec, 0x000e, 0x0118, 0x2011, 0x0101, 0x0028, 0x2011, 0x0201,
++	0x0010, 0x2011, 0x0101, 0x20a9, 0x0009, 0x810b, 0x1f04, 0x2745,
++	0xa18c, 0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x0005,
++	0x2019, 0x0002, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x0120, 0x8319,
++	0x2009, 0x0101, 0x0010, 0x2009, 0x0101, 0x20a9, 0x0005, 0x8213,
++	0x1f04, 0x275f, 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205,
++	0x200a, 0x8319, 0x0118, 0x2009, 0x0201, 0x0c78, 0x0005, 0xd3fc,
++	0x1168, 0x0006, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118,
++	0x2011, 0x0101, 0x0028, 0x2011, 0x0201, 0x0010, 0x2011, 0x0101,
++	0x20a9, 0x000c, 0x810b, 0x1f04, 0x2782, 0xa18c, 0xf000, 0x2204,
++	0xa084, 0x0fff, 0xa105, 0x2012, 0x0005, 0xd3fc, 0x1168, 0x0006,
++	0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0x2011, 0x0102,
++	0x0028, 0x2011, 0x0202, 0x0010, 0x2011, 0x0102, 0x2204, 0xa084,
++	0xf0cf, 0xa105, 0x2012, 0x0005, 0x00c6, 0xd1bc, 0x1168, 0x0006,
++	0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0x2061, 0x0100,
++	0x0028, 0x2061, 0x0200, 0x0010, 0x2061, 0x0100, 0xc1bc, 0x8103,
++	0x8003, 0xa080, 0x0020, 0x609a, 0x62ac, 0x63ac, 0x00ce, 0x0005,
++	0x00c6, 0xd1bc, 0x1168, 0x0006, 0x2001, 0xb342, 0x2004, 0xd0ec,
++	0x000e, 0x0118, 0x2061, 0x0100, 0x0028, 0x2061, 0x0200, 0x0010,
++	0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0022, 0x609a,
++	0x60a4, 0xa084, 0xffdf, 0x60ae, 0x00ce, 0x0005, 0x00c6, 0xd1bc,
++	0x1168, 0x0006, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118,
++	0x2061, 0x0100, 0x0028, 0x2061, 0x0200, 0x0010, 0x2061, 0x0100,
++	0xc1bc, 0x8103, 0x8003, 0xa080, 0x0020, 0x609a, 0x60a4, 0x62ae,
++	0x2010, 0x60a4, 0x63ae, 0x2018, 0x00ce, 0x0005, 0x2091, 0x8000,
++	0x00c6, 0x00e6, 0x6818, 0xa005, 0x0904, 0x284e, 0xd1fc, 0x1118,
++	0x2061, 0xfb00, 0x0010, 0x2061, 0xfc10, 0x080c, 0x2856, 0x0538,
++	0x20a9, 0x0101, 0xd1fc, 0x1118, 0x2061, 0xfa00, 0x0010, 0x2061,
++	0xfb10, 0x00c6, 0x04d9, 0x0128, 0x00ce, 0x8c60, 0x1f04, 0x2819,
++	0x0468, 0x000e, 0xd1fc, 0x1128, 0x2071, 0xb380, 0xa082, 0xfa00,
++	0x0020, 0x2071, 0xb3c0, 0xa082, 0xfb10, 0x707e, 0x717a, 0x2001,
++	0x0004, 0x706a, 0x7087, 0x000f, 0x080c, 0x2601, 0x00a0, 0x60d0,
++	0xa005, 0x11a0, 0xd1fc, 0x1118, 0x2071, 0xb380, 0x0010, 0x2071,
++	0xb3c0, 0x717a, 0x2c00, 0x7082, 0x2001, 0x0006, 0x706a, 0x7087,
++	0x000f, 0x080c, 0x2601, 0x2001, 0x0000, 0x0010, 0x2001, 0x0001,
++	0x2091, 0x8001, 0xa005, 0x00ee, 0x00ce, 0x0005, 0x2c04, 0xa005,
++	0x0170, 0x2060, 0x6010, 0xa306, 0x1140, 0x600c, 0xa206, 0x1128,
++	0x6014, 0xa106, 0x1110, 0xa006, 0x0020, 0x6000, 0x0c80, 0xa085,
++	0x0001, 0x0005, 0x00f6, 0x00e6, 0x0016, 0xd1bc, 0x1178, 0x2079,
++	0xb380, 0x0006, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118,
++	0x2071, 0x0100, 0x0038, 0x2071, 0x0200, 0x0020, 0x2079, 0xb3c0,
++	0x2071, 0x0100, 0x791c, 0xa18c, 0x000f, 0x70ec, 0xa084, 0x0100,
++	0x000e, 0x0160, 0x810b, 0x810b, 0x810b, 0x810b, 0xd0bc, 0x1118,
++	0xa18d, 0x0f00, 0x0010, 0xa18d, 0x0800, 0x2104, 0x00ee, 0x00fe,
++	0x0005, 0x2001, 0xb341, 0x2004, 0xd0ac, 0x1140, 0x68e4, 0xa08c,
++	0x0020, 0x0120, 0xa084, 0x0006, 0x1108, 0x0009, 0x0005, 0x6014,
++	0x00e6, 0x0036, 0x2018, 0x2071, 0xb900, 0xd0fc, 0x1110, 0x2071,
++	0xb800, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0x8003,
++	0xae70, 0x7004, 0xa084, 0x000a, 0x1904, 0x292d, 0x7108, 0xa194,
++	0xff00, 0x0904, 0x292d, 0xa18c, 0x00ff, 0x701c, 0xa084, 0xff00,
++	0x01c0, 0x7004, 0xa085, 0x003a, 0x7006, 0x2001, 0x0009, 0xa102,
++	0x16d8, 0x2001, 0x000a, 0xa102, 0x16d0, 0x2001, 0x000c, 0xa102,
++	0x16c8, 0x701c, 0xa084, 0x00ff, 0x701e, 0x7004, 0xa084, 0xffdf,
++	0x7006, 0x2001, 0x000a, 0xa106, 0x01a8, 0x2001, 0x000c, 0xa106,
++	0x01a0, 0x2001, 0x0012, 0xa106, 0x0198, 0x2001, 0x0014, 0xa106,
++	0x0190, 0x2001, 0x0019, 0xa106, 0x0188, 0x2001, 0x0032, 0xa106,
++	0x0180, 0x00d8, 0x2009, 0x000c, 0x00c8, 0x2009, 0x0012, 0x00b0,
++	0x2009, 0x0014, 0x0098, 0x2009, 0x0019, 0x0080, 0x2009, 0x0020,
++	0x0068, 0x2009, 0x003f, 0x0050, 0x2009, 0x000a, 0x0038, 0x2009,
++	0x000c, 0x0020, 0x2009, 0x0019, 0x0008, 0xa016, 0x2100, 0xa205,
++	0x700a, 0x7004, 0xa085, 0x000a, 0x7006, 0x2071, 0xb340, 0x7004,
++	0xd0bc, 0x0158, 0xd3fc, 0x1120, 0x73ea, 0x2071, 0xb380, 0x0018,
++	0x73ee, 0x2071, 0xb3c0, 0x701b, 0x800f, 0x003e, 0x00ee, 0x0005,
++	0x2001, 0x01ff, 0x2004, 0xd0fc, 0x11d0, 0x2001, 0x04fd, 0x2004,
++	0xa082, 0x0005, 0x12a0, 0x2071, 0x0200, 0x71ec, 0xa18c, 0x1c00,
++	0x810f, 0x810c, 0x810c, 0x2079, 0x0100, 0x78ec, 0xa084, 0x1c00,
++	0x8007, 0x8004, 0x8004, 0xa105, 0xa08a, 0x0007, 0x0208, 0x0005,
++	0x0002, 0x297e, 0x2965, 0x297e, 0x2965, 0x2958, 0x2972, 0x2958,
++	0x7008, 0xa084, 0xc3ff, 0xa085, 0x3000, 0x700a, 0x7808, 0xa084,
++	0xc3ff, 0xa085, 0x3000, 0x780a, 0x0005, 0x7008, 0xa084, 0xc3ff,
++	0xa085, 0x2000, 0x700a, 0x7808, 0xa084, 0xc3ff, 0xa085, 0x2000,
++	0x780a, 0x0005, 0x7008, 0xa084, 0xc3ff, 0xa085, 0x0c00, 0x700a,
++	0x7808, 0xa084, 0xc3ff, 0xa085, 0x0c00, 0x780a, 0x0005, 0x0e04,
++	0x297f, 0x2091, 0x8000, 0x2071, 0x0000, 0x0006, 0x7018, 0xd084,
++	0x1de8, 0x000e, 0x2071, 0x0010, 0x70ca, 0x000e, 0x70c6, 0x70c3,
++	0x8002, 0x70db, 0x0b0c, 0x70df, 0x0001, 0x2071, 0x0000, 0x701b,
++	0x0001, 0x2091, 0x4080, 0x0cf8, 0x7f3c, 0x7e58, 0x7c30, 0x7d38,
++	0xa594, 0x003f, 0xa49c, 0x0003, 0xa484, 0x000f, 0x0002, 0x29b8,
++	0x29b8, 0x29b8, 0x2dbc, 0x4117, 0x29b7, 0x29e0, 0x29e3, 0x29b7,
++	0x29b7, 0x29b7, 0x29b7, 0x29b7, 0x29b7, 0x29b7, 0x29b7, 0x0839,
++	0x8507, 0xa084, 0x003f, 0x0002, 0x29e6, 0x2dbc, 0x2fa8, 0x30d0,
++	0x310e, 0x338a, 0x3681, 0x36f3, 0x3767, 0x3804, 0x38ee, 0x397e,
++	0x29e0, 0x2ec1, 0x3653, 0x29dd, 0x464c, 0x466f, 0x4832, 0x483d,
++	0x4910, 0x29dd, 0x29dd, 0x49e6, 0x49ea, 0x464a, 0x29dd, 0x478d,
++	0x29dd, 0x44e4, 0x29e3, 0x4ad8, 0x4af6, 0x080c, 0x297f, 0x0005,
++	0x781b, 0x0057, 0x0005, 0x781b, 0x00e1, 0x0005, 0x724a, 0xa584,
++	0x0001, 0x1904, 0x44f6, 0x0160, 0x080c, 0x297f, 0x7003, 0x0000,
++	0x7053, 0x0000, 0x704b, 0x0000, 0x7043, 0x0000, 0x080c, 0x40d4,
++	0x7064, 0xa06d, 0x0140, 0x70f4, 0xa084, 0x0001, 0x7168, 0xa105,
++	0x1110, 0x0804, 0x2b4d, 0x7068, 0xa084, 0x0007, 0x0002, 0x2a0f,
++	0x2a87, 0x2a8f, 0x2a98, 0x2aa1, 0x2b33, 0x2aaa, 0x2a87, 0x7830,
++	0xd0bc, 0x1968, 0x71f0, 0xd1bc, 0x1950, 0xd1b4, 0x1904, 0x2a65,
++	0x70c0, 0xa086, 0x0001, 0x0918, 0x080c, 0x40bd, 0x1900, 0x70d0,
++	0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0090, 0x6b0c, 0x7baa,
++	0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001,
++	0x0118, 0x69c0, 0x7daa, 0x79aa, 0x68c4, 0xa04d, 0x6e1c, 0x7830,
++	0xd0bc, 0x1904, 0x29df, 0x2001, 0x0010, 0x0804, 0x2c89, 0x7064,
++	0xa005, 0x1904, 0x29df, 0x080c, 0x40bd, 0x1904, 0x29df, 0x00c6,
++	0x00d6, 0x70d0, 0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0090,
++	0x6b0c, 0x7baa, 0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d,
++	0xa886, 0x0001, 0x0118, 0x69c0, 0x7daa, 0x79aa, 0x68c4, 0xa04d,
++	0x6e1c, 0x2001, 0x0020, 0x0804, 0x2c89, 0x080c, 0x40a8, 0x1904,
++	0x29df, 0x70d8, 0xa06d, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x68b4,
++	0x785a, 0x781b, 0x0057, 0x704c, 0xc08d, 0x780a, 0x68c0, 0x703e,
++	0x70f0, 0xc0b4, 0x70f2, 0x70d4, 0xa065, 0x68c4, 0x705e, 0x7003,
++	0x0002, 0x2d00, 0x7052, 0xad80, 0x0009, 0x7042, 0x0005, 0x080c,
++	0x40a8, 0x1120, 0x781b, 0x0050, 0x7003, 0x0004, 0x0005, 0x080c,
++	0x40a8, 0x1128, 0x2011, 0x000c, 0x0419, 0x7003, 0x0004, 0x0005,
++	0x080c, 0x40a8, 0x1128, 0x2011, 0x0006, 0x00d1, 0x7003, 0x0004,
++	0x0005, 0x080c, 0x40a8, 0x1128, 0x2011, 0x000d, 0x0089, 0x7003,
++	0x0004, 0x0005, 0x080c, 0x40a8, 0x1150, 0x2011, 0x0006, 0x0041,
++	0x7080, 0x7083, 0x0000, 0x2068, 0x7052, 0x7003, 0x0001, 0x0005,
++	0x7178, 0xc1fc, 0x8107, 0x7882, 0x789b, 0x0090, 0xa286, 0x000c,
++	0x1120, 0x7aaa, 0x2001, 0x0001, 0x0098, 0xa18c, 0x001f, 0xa18d,
++	0x00c0, 0x79aa, 0xa286, 0x000d, 0x0120, 0x7aaa, 0x2001, 0x0002,
++	0x0038, 0x78ab, 0x0020, 0x717c, 0x79aa, 0x7aaa, 0x2001, 0x0004,
++	0x789b, 0x0060, 0x78aa, 0x785b, 0x0004, 0x781b, 0x00ef, 0x080c,
++	0x40d4, 0x7087, 0x000f, 0x70f0, 0xd0b4, 0x0168, 0xc0b4, 0x70f2,
++	0x00c6, 0x70d4, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018,
++	0x8001, 0x601a, 0x00ce, 0x0005, 0x7010, 0xa005, 0x1138, 0x70f0,
++	0xd0b4, 0x0128, 0x70d4, 0xac06, 0x1110, 0x0c29, 0x0005, 0x0016,
++	0x71c0, 0xa186, 0x0001, 0x0528, 0x00d6, 0x0026, 0x2100, 0x2011,
++	0x0001, 0xa212, 0x70d0, 0x2068, 0x6800, 0xac06, 0x0120, 0x8211,
++	0x01b0, 0x00c9, 0x0cc8, 0x00c6, 0x2100, 0x2011, 0x0001, 0xa212,
++	0x70d0, 0x2068, 0x6800, 0x2060, 0x6008, 0xa084, 0xfbef, 0x600a,
++	0x8211, 0x0110, 0x0041, 0x0cb0, 0x70c3, 0x0001, 0x00ce, 0x002e,
++	0x00de, 0x001e, 0x0005, 0xade8, 0x0005, 0x70c8, 0xad06, 0x1110,
++	0x70c4, 0x2068, 0x0005, 0x080c, 0x40a8, 0x1904, 0x29df, 0x7080,
++	0x2068, 0x7778, 0x080c, 0x3fb3, 0x2c50, 0x080c, 0x418d, 0x789b,
++	0x0090, 0x6814, 0xa084, 0x001f, 0xc0bd, 0x78aa, 0x6e1c, 0x2041,
++	0x0001, 0x2001, 0x0004, 0x0804, 0x2c8e, 0x080c, 0x40a8, 0x1904,
++	0x29df, 0x789b, 0x0090, 0x7064, 0x2068, 0x6f14, 0x080c, 0x2ae3,
++	0x080c, 0x3fb3, 0x2c50, 0x080c, 0x418d, 0x6824, 0xa005, 0x0130,
++	0xa082, 0x0006, 0x0208, 0x0010, 0x6827, 0x0005, 0x6b14, 0xa39c,
++	0x001f, 0xa39d, 0x00c0, 0x2960, 0x6000, 0x2a60, 0xa084, 0x8000,
++	0x0118, 0xa684, 0x0001, 0x0110, 0xa39c, 0xffbf, 0x7baa, 0x2031,
++	0x0020, 0x2041, 0x0001, 0x2001, 0x0003, 0x0804, 0x2c8e, 0xc28d,
++	0x72f2, 0x72dc, 0xa200, 0xa015, 0x7158, 0x8108, 0xa12a, 0x0208,
++	0x71dc, 0x2164, 0x6504, 0x85ff, 0x1190, 0x715a, 0x8421, 0x1da8,
++	0x70f0, 0xd08c, 0x0128, 0x70ec, 0xa005, 0x1110, 0x70ef, 0x000a,
++	0x7048, 0xa005, 0x0904, 0x44f6, 0x0005, 0x2200, 0x0c70, 0x70f0,
++	0xc08c, 0x70f2, 0x70ef, 0x0000, 0x6034, 0xa005, 0x1db0, 0x6708,
++	0xa784, 0x073f, 0x01a8, 0xd7d4, 0x1d80, 0xa784, 0x0021, 0x1d68,
++	0xd78c, 0x0120, 0xd794, 0x0d48, 0xc794, 0x670a, 0xa784, 0x0218,
++	0x1d20, 0xd7c4, 0x0128, 0x6018, 0xa005, 0x19f8, 0xc7c4, 0x670a,
++	0x2568, 0x6823, 0x0000, 0x6e1c, 0xa684, 0x000e, 0x6318, 0x0128,
++	0x601c, 0xa302, 0x0220, 0x0118, 0x0880, 0x83ff, 0x1970, 0x2d58,
++	0x2c50, 0x715a, 0x68d3, 0x0000, 0xd7bc, 0x1118, 0x7024, 0x6022,
++	0x603a, 0xc7bc, 0x670a, 0x68c4, 0xa065, 0xa04d, 0x6100, 0x2a60,
++	0x2041, 0x0001, 0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0, 0xd1fc,
++	0x0110, 0xd684, 0x0110, 0xa39c, 0xffbf, 0xd6a4, 0x0110, 0xa39d,
++	0x0020, 0xa684, 0x000e, 0x1904, 0x2c39, 0xc7a5, 0x670a, 0x2c00,
++	0x68ca, 0x77c0, 0xa786, 0x0001, 0x11a8, 0x70f0, 0xd0b4, 0x1190,
++	0x7000, 0xa082, 0x0001, 0x1270, 0x7010, 0xa005, 0x1158, 0x080c,
++	0x40bd, 0x1140, 0x7830, 0xd0bc, 0x1128, 0x789b, 0x0090, 0x7baa,
++	0x0804, 0x2c87, 0x8739, 0x77c2, 0x2750, 0x77cc, 0xa7b0, 0x0005,
++	0x70c8, 0xa606, 0x1108, 0x76c4, 0x76ce, 0x2c3a, 0x8738, 0x2d3a,
++	0x8738, 0x283a, 0x8738, 0x233a, 0x8738, 0x253a, 0x7830, 0xd0bc,
++	0x0140, 0x2091, 0x303d, 0x70f0, 0xa084, 0x303d, 0x2091, 0x8000,
++	0x2090, 0xaad5, 0x0000, 0x0120, 0x8421, 0x2200, 0x1904, 0x2b84,
++	0x0005, 0xd1dc, 0x0904, 0x3c0a, 0x2029, 0x0020, 0xd69c, 0x1120,
++	0x8528, 0xd68c, 0x1108, 0x8528, 0x8840, 0x6f14, 0x610c, 0x8108,
++	0xa18c, 0x00ff, 0x70e8, 0xa160, 0x2c64, 0x8cff, 0x0180, 0x6014,
++	0xa706, 0x1dd0, 0x60bc, 0x8001, 0x60be, 0x1d88, 0x2a60, 0x6008,
++	0xc0c5, 0x600a, 0x2200, 0x8421, 0x1904, 0x2b84, 0x0005, 0x2a60,
++	0x610e, 0x69c2, 0x2c00, 0x68ca, 0x8840, 0x6008, 0xc0d5, 0x600a,
++	0x77c0, 0xa786, 0x0001, 0x1904, 0x2c12, 0x70f0, 0xd0b4, 0x1904,
++	0x2c12, 0x7000, 0xa082, 0x0001, 0x1a04, 0x2c12, 0x7010, 0xa005,
++	0x1904, 0x2c12, 0x080c, 0x40bd, 0x1904, 0x2c12, 0x7830, 0xd0bc,
++	0x1904, 0x2c12, 0x789b, 0x0090, 0x7baa, 0x7daa, 0x79aa, 0x2001,
++	0x0002, 0x0006, 0x6018, 0x8000, 0x601a, 0x0008, 0x0006, 0x2960,
++	0x6104, 0x2a60, 0x080c, 0x41d0, 0x1560, 0xa184, 0x0018, 0x0178,
++	0xa184, 0x0010, 0x0118, 0x080c, 0x3dc6, 0x1518, 0xd19c, 0x0138,
++	0x69a0, 0xa184, 0x0600, 0x1118, 0x080c, 0x3cd1, 0x00d0, 0x69a0,
++	0xa184, 0x1e00, 0x01f8, 0xd1dc, 0x0168, 0x00c6, 0x2960, 0x6000,
++	0xc0ed, 0x6002, 0x6104, 0xc1a5, 0x6106, 0x00ce, 0x080c, 0x3dc6,
++	0x1140, 0x69a0, 0xd1cc, 0x0118, 0x080c, 0x3d18, 0x0010, 0xd1d4,
++	0x1d18, 0x69a0, 0xd1e4, 0x0130, 0x6914, 0xa18c, 0xff00, 0x810f,
++	0x080c, 0x27c0, 0x002e, 0xa68c, 0x00e0, 0xa684, 0x0060, 0x0120,
++	0xa086, 0x0060, 0x1108, 0xc1f5, 0xa18d, 0x0104, 0x69b6, 0x789b,
++	0x0060, 0x2800, 0x78aa, 0x6818, 0xc0fd, 0x681a, 0xd6bc, 0x0168,
++	0xc0fc, 0x708b, 0x0000, 0xa08a, 0x000d, 0x0328, 0xa08a, 0x000c,
++	0x718a, 0x2001, 0x000c, 0x800c, 0x718e, 0x78aa, 0x3518, 0x3340,
++	0x3428, 0x80ac, 0xaf80, 0x002b, 0x20a0, 0x789b, 0x0000, 0xad80,
++	0x000b, 0x2098, 0x53a6, 0x23a8, 0x2898, 0x25a0, 0xa286, 0x0020,
++	0x11e0, 0x70f0, 0xc0b5, 0x70f2, 0x2c00, 0x70d6, 0x2d00, 0x70da,
++	0xa286, 0x0002, 0x05d8, 0x70c0, 0x8000, 0x70c2, 0x74d0, 0xa498,
++	0x0005, 0x70c8, 0xa306, 0x1108, 0x73c4, 0x73d2, 0xa286, 0x0010,
++	0x0904, 0x29df, 0x00de, 0x00ce, 0x0005, 0x7000, 0xa005, 0x1d08,
++	0xa286, 0x0002, 0x15d0, 0x080c, 0x40a8, 0x19d8, 0x6814, 0xc0fc,
++	0x8007, 0x7882, 0x68b4, 0x785a, 0x781b, 0x0057, 0x704c, 0xc08d,
++	0x780a, 0x0126, 0x00d6, 0x00c6, 0x70f0, 0xa084, 0x2e00, 0x2090,
++	0x00ce, 0x00de, 0x012e, 0x2900, 0x705e, 0x68c0, 0x703e, 0x7003,
++	0x0002, 0x2d00, 0x7052, 0xad80, 0x0009, 0x7042, 0x7830, 0xd0bc,
++	0x0140, 0x2091, 0x303d, 0x70f0, 0xa084, 0x303d, 0x2091, 0x8000,
++	0x2090, 0x70c0, 0xa005, 0x1108, 0x0005, 0x8421, 0x0de8, 0x7254,
++	0x70dc, 0xa200, 0xa015, 0x0804, 0x2b84, 0xa286, 0x0010, 0x1530,
++	0x080c, 0x40a8, 0x1904, 0x2d01, 0x6814, 0xc0fc, 0x8007, 0x7882,
++	0x68b4, 0x785a, 0x781b, 0x0057, 0x704c, 0xc08d, 0x780a, 0x70c0,
++	0x8000, 0x70c2, 0x74d0, 0xa490, 0x0005, 0x70c8, 0xa206, 0x1108,
++	0x72c4, 0x72d2, 0x2900, 0x705e, 0x68c0, 0x703e, 0x7003, 0x0002,
++	0x2d00, 0x7052, 0xad80, 0x0009, 0x7042, 0x0005, 0x6bb4, 0xa39d,
++	0x2000, 0x7b5a, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x6b94, 0x7bd6,
++	0x7bde, 0x6e98, 0x7ed2, 0x7eda, 0x781b, 0x0057, 0x2900, 0x705e,
++	0x7202, 0x704c, 0xc08d, 0x780a, 0x7200, 0x2300, 0xa605, 0x0170,
++	0x70f0, 0xa084, 0x2e00, 0xa086, 0x2600, 0x1118, 0x2009, 0x0000,
++	0x0010, 0x2009, 0x0001, 0xa284, 0x000f, 0x0023, 0xad80, 0x0009,
++	0x7042, 0x0005, 0x2dba, 0x55dc, 0x55dc, 0x55ca, 0x55dc, 0x2dba,
++	0x2dba, 0x2dba, 0x080c, 0x297f, 0x080c, 0x40a8, 0x7808, 0xa084,
++	0xfffc, 0x780a, 0x00f6, 0x2079, 0xb340, 0x78ac, 0x00fe, 0xd084,
++	0x01b8, 0x7068, 0xa086, 0x0001, 0x1110, 0x0804, 0x2e97, 0x7068,
++	0xa086, 0x0005, 0x1158, 0x7080, 0x2068, 0x681b, 0x0004, 0x6817,
++	0x0000, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x706b, 0x0000,
++	0x70c3, 0x0000, 0x70c4, 0x70ce, 0x70d2, 0x70f4, 0xc084, 0x70f6,
++	0x080c, 0x2ae3, 0x2011, 0x0004, 0x7168, 0xa186, 0x0001, 0x0160,
++	0xa186, 0x0007, 0x1118, 0x701b, 0x0005, 0x0030, 0x701b, 0x0001,
++	0x70f0, 0xc0c5, 0x70f2, 0x0000, 0x2001, 0xb348, 0x203c, 0xd7fc,
++	0x1120, 0xae86, 0xb380, 0x0120, 0x0040, 0xae86, 0xb3c0, 0x1128,
++	0xa784, 0x00ff, 0xa086, 0x0018, 0x0130, 0x7014, 0x7012, 0xa005,
++	0x1110, 0x70c3, 0x0001, 0x0066, 0x080c, 0x52e3, 0x0156, 0x20a9,
++	0x0010, 0x2039, 0x0000, 0x080c, 0x3ec6, 0xa7b8, 0x0100, 0x1f04,
++	0x2e1b, 0x015e, 0x006e, 0x7000, 0x0002, 0x2e57, 0x2e35, 0x2e35,
++	0x2e2d, 0x2e57, 0x2e57, 0x2e57, 0x2e57, 0x7064, 0xa005, 0x0538,
++	0xad06, 0x1118, 0x6800, 0x7066, 0x0080, 0x6820, 0xd084, 0x1148,
++	0x6f14, 0x080c, 0x3fb3, 0x6008, 0xc0d4, 0x600a, 0x080c, 0x3be8,
++	0x0020, 0x7060, 0x2060, 0x6800, 0x6002, 0xa684, 0x5f00, 0x681e,
++	0x6818, 0xd0fc, 0x0108, 0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000,
++	0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x080c, 0x2085, 0x2011,
++	0x0004, 0xb284, 0x0800, 0x1118, 0x2021, 0xfb00, 0x0010, 0x2021,
++	0xfc10, 0x080c, 0x2ea4, 0xb284, 0x0800, 0x0118, 0x2021, 0xb3d9,
++	0x0010, 0x2021, 0xb399, 0x04c1, 0x0156, 0x20a9, 0x0101, 0xb284,
++	0x0800, 0x1118, 0x2021, 0xfa00, 0x0010, 0x2021, 0xfb10, 0x0461,
++	0x8420, 0x1f04, 0x2e77, 0xb284, 0x0600, 0x0118, 0x2061, 0xba00,
++	0x0010, 0x2061, 0xda00, 0x2021, 0x0002, 0x20a9, 0x0100, 0x6018,
++	0x6110, 0x81ff, 0x0118, 0xa102, 0x0308, 0x6012, 0x601b, 0x0000,
++	0xace0, 0x0010, 0x1f04, 0x2e87, 0x8421, 0x1d78, 0x015e, 0x7090,
++	0xa084, 0x8000, 0x0110, 0x080c, 0x4312, 0x706b, 0x0000, 0x7003,
++	0x0000, 0x7053, 0x0000, 0x0005, 0x0046, 0x2404, 0xa005, 0x01a8,
++	0x2068, 0x6800, 0x0006, 0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000,
++	0x68b4, 0xa084, 0x5f00, 0x681e, 0x6820, 0xa084, 0x00ff, 0xc09d,
++	0x6822, 0x080c, 0x2085, 0x000e, 0x0c48, 0x004e, 0x2023, 0x0000,
++	0x0005, 0xa282, 0x0003, 0x0310, 0x080c, 0x297f, 0x2300, 0x0002,
++	0x2ecb, 0x2f45, 0x2f5f, 0xa282, 0x0002, 0x0110, 0x080c, 0x297f,
++	0x7068, 0x706b, 0x0000, 0x7087, 0x0000, 0x000a, 0x0002, 0x2edf,
++	0x2edf, 0x2ee1, 0x2f19, 0x3c14, 0x2edf, 0x2f19, 0x2edf, 0x080c,
++	0x297f, 0x7778, 0x080c, 0x3ec6, 0x7778, 0xa7bc, 0x8f00, 0x080c,
++	0x3fb3, 0x6018, 0xa005, 0x0528, 0xd7fc, 0x1118, 0x2021, 0xfb00,
++	0x0010, 0x2021, 0xfc10, 0x2009, 0x0005, 0x2011, 0x0010, 0x080c,
++	0x2f79, 0x01b8, 0x0156, 0x20a9, 0x0101, 0xd7fc, 0x1118, 0x2021,
++	0xfa00, 0x0010, 0x2021, 0xfb10, 0x0046, 0x2009, 0x0005, 0x2011,
++	0x0010, 0x080c, 0x2f79, 0x004e, 0x0118, 0x8420, 0x1f04, 0x2f04,
++	0x015e, 0x8738, 0xa784, 0x001f, 0x1990, 0x0804, 0x29ee, 0x0804,
++	0x29ee, 0x7778, 0x080c, 0x3fb3, 0x6018, 0xa005, 0x0520, 0xd7fc,
++	0x1118, 0x2021, 0xfb00, 0x0010, 0x2021, 0xfc10, 0x2009, 0x0005,
++	0x2011, 0x0020, 0x080c, 0x2f79, 0x01b0, 0x0156, 0x20a9, 0x0101,
++	0xd7fc, 0x1118, 0x2021, 0xfa00, 0x0010, 0x2021, 0xfb10, 0x0046,
++	0x2009, 0x0005, 0x2011, 0x0020, 0x04e1, 0x004e, 0x0118, 0x8420,
++	0x1f04, 0x2f37, 0x015e, 0x0804, 0x29ee, 0x2200, 0x0002, 0x2f4a,
++	0x2f4c, 0x2f4c, 0x080c, 0x297f, 0x2009, 0x0012, 0x7068, 0xa086,
++	0x0002, 0x0110, 0x2009, 0x000e, 0x6818, 0xd0fc, 0x0108, 0x691a,
++	0x706b, 0x0000, 0x70f0, 0xc0c5, 0x70f2, 0x0804, 0x404b, 0x2200,
++	0x0002, 0x2f66, 0x2f4c, 0x2f64, 0x080c, 0x297f, 0x080c, 0x52e3,
++	0x7000, 0xa086, 0x0002, 0x1904, 0x3b9e, 0x080c, 0x3bfa, 0x6008,
++	0xa084, 0xfbef, 0x600a, 0x080c, 0x3b90, 0x0904, 0x3b9e, 0x0804,
++	0x29ee, 0x2404, 0xa005, 0x0548, 0x2068, 0x2d04, 0x0006, 0x6814,
++	0xa706, 0x0118, 0x2d20, 0x000e, 0x0ca8, 0x000e, 0x2022, 0x6817,
++	0x0000, 0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x691a,
++	0x6820, 0xa084, 0x00ff, 0xa205, 0x6822, 0x682b, 0x0000, 0x080c,
++	0x2085, 0x6010, 0x8001, 0x6012, 0x6008, 0xa084, 0xf9ef, 0x600a,
++	0x080c, 0x2aff, 0x080c, 0x3bfa, 0x0005, 0xa085, 0x0001, 0x0ce0,
++	0x2300, 0x0002, 0x2faf, 0x2fad, 0x3057, 0x080c, 0x297f, 0x78ec,
++	0xa084, 0x0001, 0x1170, 0x7000, 0xa086, 0x0004, 0x1110, 0x0804,
++	0x3006, 0x080c, 0x3bfa, 0x6008, 0xa084, 0xf9ef, 0x600a, 0x0804,
++	0x3b9e, 0x78e4, 0xa005, 0x1b04, 0x3006, 0x3208, 0x0006, 0x2001,
++	0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0xa18c, 0x0600, 0x0010,
++	0xa18c, 0x0800, 0x0118, 0x0104, 0x29df, 0x0010, 0x0304, 0x29df,
++	0x2008, 0xa084, 0x0030, 0x1118, 0x781b, 0x0057, 0x0005, 0x78ec,
++	0xa084, 0x0003, 0x0dc8, 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007,
++	0x0090, 0xa184, 0x0007, 0xa086, 0x0004, 0x1118, 0x2001, 0x0000,
++	0x0050, 0xa184, 0x0007, 0xa086, 0x0005, 0x0118, 0xa184, 0x0007,
++	0x0010, 0x2001, 0x0001, 0x0002, 0x3036, 0x303f, 0x302a, 0x3004,
++	0x409e, 0x409e, 0x3004, 0x304b, 0x080c, 0x297f, 0x7000, 0xa086,
++	0x0004, 0x1190, 0x7068, 0xa086, 0x0002, 0x1130, 0x2011, 0x0002,
++	0x2019, 0x0000, 0x0804, 0x2ec1, 0x7068, 0xa086, 0x0006, 0x0db0,
++	0x7068, 0xa086, 0x0004, 0x0d90, 0x79e4, 0xa184, 0x0030, 0x0120,
++	0x78ec, 0xa084, 0x0003, 0x1110, 0x0804, 0x3653, 0x2001, 0x0003,
++	0x0804, 0x339b, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c,
++	0x3eaa, 0x782b, 0x3008, 0x781b, 0x005d, 0x0005, 0x6818, 0xd0fc,
++	0x0110, 0x681b, 0x001d, 0x080c, 0x3eaa, 0x0804, 0x4073, 0x6818,
++	0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c, 0x3eaa, 0x782b, 0x3008,
++	0x781b, 0x00dd, 0x0005, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d,
++	0x080c, 0x3eaa, 0x782b, 0x3008, 0x781b, 0x00a4, 0x0005, 0xa584,
++	0x000f, 0x11c0, 0x7000, 0x0002, 0x29ee, 0x3064, 0x3066, 0x3b9e,
++	0x3b9e, 0x3b9e, 0x3064, 0x3064, 0x080c, 0x297f, 0x080c, 0x3bfa,
++	0x6008, 0xa084, 0xfbef, 0x600a, 0x080c, 0x3b90, 0x0904, 0x3b9e,
++	0x0804, 0x29ee, 0x78e4, 0xa005, 0x1b04, 0x3006, 0x3208, 0x0006,
++	0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0xa18c, 0x0600,
++	0x0010, 0xa18c, 0x0800, 0x0118, 0x0104, 0x3006, 0x0010, 0x0304,
++	0x3006, 0x2008, 0xa084, 0x0030, 0x1118, 0x781b, 0x0057, 0x0005,
++	0x78ec, 0xa084, 0x0003, 0x0dc8, 0x7884, 0xd0fc, 0x1118, 0xa184,
++	0x0007, 0x0090, 0xa184, 0x0007, 0xa086, 0x0004, 0x1118, 0x2001,
++	0x0000, 0x0050, 0xa184, 0x0007, 0xa086, 0x0005, 0x0118, 0xa184,
++	0x0007, 0x0010, 0x2001, 0x0001, 0x0002, 0x30be, 0x30c2, 0x30b7,
++	0x30b5, 0x409e, 0x409e, 0x30b5, 0x4096, 0x080c, 0x297f, 0x080c,
++	0x3eb0, 0x782b, 0x3008, 0x781b, 0x005d, 0x0005, 0x080c, 0x3eb0,
++	0x0804, 0x4073, 0x080c, 0x3eb0, 0x782b, 0x3008, 0x781b, 0x00dd,
++	0x0005, 0x080c, 0x3eb0, 0x782b, 0x3008, 0x781b, 0x00a4, 0x0005,
++	0x2300, 0x0002, 0x30d7, 0x30d5, 0x30d9, 0x080c, 0x297f, 0x0804,
++	0x3804, 0x681b, 0x0016, 0x78a3, 0x0000, 0x79e4, 0xa184, 0x0030,
++	0x0904, 0x3804, 0x78ec, 0xa084, 0x0003, 0x0904, 0x3804, 0xa184,
++	0x0100, 0x0d98, 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007, 0x0090,
++	0xa184, 0x0007, 0xa086, 0x0004, 0x1118, 0x2001, 0x0000, 0x0050,
++	0xa184, 0x0007, 0xa086, 0x0005, 0x0118, 0xa184, 0x0007, 0x0010,
++	0x2001, 0x0001, 0x0002, 0x310b, 0x30c2, 0x302a, 0x404b, 0x409e,
++	0x409e, 0x404b, 0x4096, 0x080c, 0x405b, 0x0005, 0xa282, 0x0005,
++	0x0310, 0x080c, 0x297f, 0x7898, 0x2040, 0x2300, 0x0002, 0x311a,
++	0x3356, 0x3362, 0x2200, 0x0002, 0x3136, 0x3123, 0x3136, 0x3121,
++	0x3338, 0x080c, 0x297f, 0x789b, 0x0018, 0x78a8, 0x2010, 0xa084,
++	0x00ff, 0xa082, 0x0020, 0x0a04, 0x3e69, 0xa08a, 0x0004, 0x1a04,
++	0x3e69, 0x0002, 0x3e69, 0x3e69, 0x3e69, 0x3e1d, 0x789b, 0x0018,
++	0x79a8, 0xa184, 0x0080, 0x0148, 0x0804, 0x3e69, 0x7000, 0xa005,
++	0x1dd8, 0x2011, 0x0004, 0x0804, 0x398f, 0xa184, 0x00ff, 0xa08a,
++	0x0010, 0x1a04, 0x3e69, 0x0002, 0x315e, 0x315c, 0x3171, 0x3175,
++	0x3234, 0x3e69, 0x3e69, 0x3236, 0x3e69, 0x3e69, 0x3334, 0x3334,
++	0x3e69, 0x3e69, 0x3e69, 0x3336, 0x080c, 0x297f, 0xa684, 0x1000,
++	0x0140, 0x2001, 0x0500, 0x8000, 0x8000, 0x783a, 0x781b, 0x009d,
++	0x0005, 0x6818, 0xd0fc, 0x0118, 0x681b, 0x001d, 0x0c90, 0x0804,
++	0x404b, 0x681b, 0x001d, 0x0804, 0x3e98, 0x6920, 0x6922, 0xa684,
++	0x1800, 0x1904, 0x31d1, 0x6820, 0xa084, 0x0001, 0x1904, 0x31d6,
++	0x6818, 0xa086, 0x0008, 0x1110, 0x681b, 0x0000, 0xd6d4, 0x0904,
++	0x3231, 0xd6bc, 0x05a0, 0x708b, 0x0000, 0x6818, 0xa084, 0x003f,
++	0xa08a, 0x000d, 0x0760, 0xa08a, 0x000c, 0x718a, 0x2001, 0x000c,
++	0x800c, 0x718e, 0x789b, 0x0061, 0x78aa, 0x0156, 0x0136, 0x0146,
++	0x0016, 0xb28c, 0x0600, 0x0168, 0x0006, 0x2001, 0xb342, 0x2004,
++	0xd0ec, 0x000e, 0x0118, 0x20a1, 0x012b, 0x0028, 0x20a1, 0x022b,
++	0x0010, 0x20a1, 0x012b, 0x001e, 0x789b, 0x0000, 0x8000, 0x80ac,
++	0xad80, 0x000b, 0x2098, 0x53a6, 0x014e, 0x013e, 0x015e, 0x6038,
++	0xa005, 0x1150, 0x681c, 0xa084, 0x000e, 0x0904, 0x3e98, 0x080c,
++	0x3eb3, 0x782b, 0x3008, 0x0010, 0x8001, 0x603a, 0x781b, 0x005f,
++	0x0005, 0xd6e4, 0x0118, 0x781b, 0x006c, 0x0005, 0xa684, 0x0060,
++	0x0904, 0x322e, 0xd6dc, 0x0904, 0x322e, 0xd6fc, 0x1108, 0x00a0,
++	0xc6fc, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8, 0x78d0, 0x8007, 0xa084,
++	0x007f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2,
++	0x6b94, 0x2200, 0xa303, 0x68ae, 0xd6f4, 0x0118, 0xc6f4, 0x7e5a,
++	0x6eb6, 0x7000, 0xa086, 0x0003, 0x1148, 0x0006, 0x080c, 0x52e3,
++	0x080c, 0x55dc, 0x000e, 0x781b, 0x006b, 0x0005, 0xa006, 0x080c,
++	0x56fb, 0x6ab0, 0x69ac, 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0120,
++	0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda, 0x6ba6,
++	0x7bd6, 0x7bde, 0x2300, 0xa405, 0x1130, 0xc6f5, 0x7e5a, 0x6eb6,
++	0x781b, 0x006b, 0x0005, 0x781b, 0x006b, 0x2200, 0xa115, 0x1118,
++	0x080c, 0x55dc, 0x0005, 0x080c, 0x5622, 0x0005, 0x781b, 0x006c,
++	0x0005, 0x781b, 0x005f, 0x0005, 0x080c, 0x297f, 0x0804, 0x32cc,
++	0x00c6, 0x705c, 0x2060, 0x6920, 0xa18c, 0xecff, 0x6922, 0x6000,
++	0xa084, 0xcfdf, 0x6002, 0x080c, 0x3d32, 0xa006, 0x2040, 0x2038,
++	0x080c, 0x3de9, 0x0804, 0x32c0, 0x00c6, 0x705c, 0x2060, 0x2c48,
++	0x7aa8, 0xa294, 0x00ff, 0xa286, 0x0004, 0x11e8, 0x6920, 0xd1e4,
++	0x1180, 0x2039, 0x0000, 0x2041, 0x0000, 0x2031, 0x0000, 0xa006,
++	0x2010, 0x080c, 0x3d35, 0x2029, 0x0000, 0x080c, 0x3de9, 0x0804,
++	0x32c0, 0xa18c, 0xecff, 0x6922, 0x6104, 0xa18c, 0xffdd, 0x6106,
++	0x6000, 0xc0ac, 0x6002, 0xa286, 0x0003, 0x01c0, 0x6104, 0xa184,
++	0x0010, 0x0548, 0x080c, 0x3faf, 0x080c, 0x3dc6, 0x88ff, 0x0518,
++	0x00ce, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a,
++	0xd6d4, 0x1110, 0x0804, 0x4056, 0x0804, 0x3ccc, 0x6920, 0xd1cc,
++	0x0130, 0xa18c, 0xfdff, 0x6922, 0x6000, 0xc0ec, 0x6002, 0x2039,
++	0x0000, 0x2041, 0x0000, 0x2031, 0x0000, 0xa006, 0x2010, 0x2029,
++	0x0000, 0x080c, 0x3de9, 0xa286, 0x0001, 0x0158, 0x6104, 0xa184,
++	0x0008, 0x01b0, 0x080c, 0x3faf, 0x080c, 0x3cd1, 0x88ff, 0x1980,
++	0x0078, 0x6920, 0xd1c4, 0x0130, 0xa18c, 0xfeff, 0x6922, 0x6000,
++	0xc0e4, 0x6002, 0x2031, 0x0000, 0xa006, 0x2010, 0x080c, 0x3d35,
++	0x00ce, 0x7e58, 0xd6d4, 0x1118, 0x781b, 0x005f, 0x0005, 0x781b,
++	0x006c, 0x0005, 0x0804, 0x3e92, 0x2808, 0x789b, 0x0090, 0x2019,
++	0x0090, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x11b8, 0x2300,
++	0xa102, 0xa086, 0x0001, 0x0904, 0x3238, 0x7ca8, 0xa4a4, 0x00ff,
++	0xa480, 0x0002, 0xa300, 0x2018, 0xa102, 0x0a04, 0x324c, 0x0904,
++	0x324c, 0x24a8, 0x7aa8, 0x1f04, 0x32ea, 0x0c18, 0xa284, 0x00f0,
++	0xa082, 0x0020, 0x06a8, 0x2200, 0xa082, 0x0021, 0x1688, 0x7aa8,
++	0x8318, 0x8318, 0x2100, 0xa302, 0x0aa0, 0xa286, 0x0023, 0x0950,
++	0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, 0xa684, 0xfff1, 0xc0a5,
++	0x2030, 0x7e5a, 0x6008, 0xc0a5, 0x600a, 0x78a0, 0x8001, 0x0904,
++	0x32c0, 0x20a8, 0x7998, 0x789b, 0x0060, 0x78aa, 0x2011, 0x0090,
++	0x799a, 0x78a8, 0x7998, 0x7a9a, 0x78aa, 0x7a98, 0x1f04, 0x3318,
++	0xc695, 0x7e5a, 0xd6d4, 0x1110, 0x0804, 0x4056, 0x0804, 0x3ccc,
++	0x8318, 0x2100, 0xa302, 0x0a04, 0x32d1, 0xa284, 0x0080, 0x1904,
++	0x3e98, 0x78a0, 0xa005, 0x08d8, 0x0804, 0x3e98, 0x0804, 0x3e69,
++	0x705c, 0xa04d, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa08e,
++	0x0001, 0x0110, 0x080c, 0x297f, 0x7aa8, 0xa294, 0x00ff, 0x784b,
++	0x0008, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0005, 0x1a04, 0x3e69,
++	0x0002, 0x3e69, 0x3c48, 0x3e69, 0x3d77, 0x4218, 0xa282, 0x0000,
++	0x1110, 0x080c, 0x297f, 0x080c, 0x3eaa, 0x782b, 0x3008, 0x781b,
++	0x006c, 0x0005, 0xa282, 0x0003, 0x1110, 0x080c, 0x297f, 0xd4fc,
++	0x11d0, 0x7068, 0xa005, 0x0110, 0x080c, 0x297f, 0x6f14, 0x777a,
++	0xa7bc, 0x8f00, 0x080c, 0x3fb3, 0x6008, 0xa085, 0x0021, 0x600a,
++	0x8738, 0xa784, 0x001f, 0x1db0, 0x080c, 0x3ead, 0x706b, 0x0002,
++	0x701b, 0x0009, 0x0010, 0x080c, 0x3eb6, 0x782b, 0x3008, 0x781b,
++	0x006c, 0x0005, 0xa282, 0x0004, 0x0310, 0x080c, 0x297f, 0x2300,
++	0x0002, 0x3394, 0x34a8, 0x34d4, 0xa286, 0x0003, 0x0110, 0x080c,
++	0x297f, 0x2001, 0x0000, 0x7046, 0x68d0, 0xa005, 0x0110, 0x7003,
++	0x0003, 0x68a0, 0xd0ec, 0x0118, 0x6008, 0xc08d, 0x600a, 0x7000,
++	0xa084, 0x000f, 0x0002, 0x29ee, 0x33b8, 0x33b5, 0x359e, 0x363b,
++	0x29ee, 0x33b3, 0x33b3, 0x080c, 0x297f, 0x6008, 0xc0d4, 0x600a,
++	0xd6e4, 0x1130, 0x080c, 0x52e3, 0x2009, 0x0000, 0x0804, 0x345a,
++	0x7868, 0xa08c, 0x00ff, 0x0588, 0xa186, 0x0008, 0x1158, 0x6008,
++	0xc0a4, 0x600a, 0x080c, 0x3b90, 0x0540, 0x080c, 0x3bfa, 0x080c,
++	0x52e3, 0x0060, 0xa186, 0x0028, 0x1500, 0x6018, 0xa005, 0x0d78,
++	0x8001, 0x0d68, 0x8001, 0x0d58, 0x601e, 0x0c48, 0x6820, 0xd084,
++	0x0904, 0x29ee, 0xc084, 0x6822, 0x080c, 0x2af4, 0x7060, 0x00c6,
++	0x2060, 0x6800, 0x6002, 0x00ce, 0x6004, 0x6802, 0xa005, 0x2d00,
++	0x1108, 0x6002, 0x6006, 0x0804, 0x29ee, 0x0016, 0x81ff, 0x11d8,
++	0x71f0, 0xd1bc, 0x11c0, 0xd1b4, 0x01b0, 0x080c, 0x40a8, 0x1198,
++	0x00d6, 0x70d8, 0xa06d, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x68b4,
++	0x785a, 0x781b, 0x0057, 0x704c, 0xc08d, 0x780a, 0xc1b4, 0x71f2,
++	0x7003, 0x0030, 0x00de, 0x080c, 0x34e7, 0x001e, 0x81ff, 0x0904,
++	0x345a, 0xa684, 0x5f00, 0x681e, 0x682b, 0x0000, 0x6f14, 0xa186,
++	0x0002, 0x15c8, 0x080c, 0x2ae3, 0x080c, 0x2aff, 0x6820, 0xa084,
++	0x0800, 0x1588, 0x8717, 0xa294, 0x000f, 0x8213, 0x8213, 0x8213,
++	0x8213, 0xb284, 0x0600, 0x0118, 0xa290, 0xb800, 0x0010, 0xa290,
++	0xb900, 0xa290, 0x0000, 0x221c, 0xd3c4, 0x1108, 0x0070, 0x6820,
++	0xd0e4, 0x0128, 0xa084, 0xefff, 0x6822, 0xc3ac, 0x2312, 0x8210,
++	0x2204, 0xa085, 0x0038, 0x2012, 0x8211, 0xd3d4, 0x0138, 0x68a0,
++	0xd0c4, 0x1120, 0x080c, 0x3555, 0x0804, 0x29ee, 0x6008, 0xc08d,
++	0x600a, 0x0008, 0x692a, 0x6916, 0x6818, 0xd0fc, 0x0110, 0x7044,
++	0x681a, 0xa68c, 0x5f00, 0x691e, 0x6010, 0xa005, 0x0120, 0x8001,
++	0x1310, 0x080c, 0x297f, 0x6012, 0x6018, 0xa005, 0x0118, 0x8001,
++	0x601a, 0x1118, 0x6008, 0xc0a4, 0x600a, 0x6820, 0xd084, 0x1130,
++	0x6800, 0xa005, 0x1108, 0x6002, 0x6006, 0x0020, 0x7060, 0x2060,
++	0x6800, 0x6002, 0x2061, 0xb340, 0x6807, 0x0103, 0x2d08, 0x206b,
++	0x0000, 0x605c, 0x8000, 0x605e, 0x6060, 0xa005, 0x6162, 0x0110,
++	0x2d02, 0x0008, 0x6166, 0x7000, 0xa086, 0x0030, 0x1904, 0x29ee,
++	0x7003, 0x0002, 0x70d8, 0xa06d, 0x68c0, 0x703e, 0x70d4, 0xa065,
++	0x68c4, 0x705e, 0x2d00, 0x7052, 0xad80, 0x0009, 0x7042, 0x0005,
++	0xa282, 0x0004, 0x0210, 0x080c, 0x297f, 0x2200, 0x0002, 0x34ab,
++	0x34b3, 0x34be, 0x34b3, 0x7000, 0xa086, 0x0005, 0x0120, 0x080c,
++	0x3eaa, 0x782b, 0x3008, 0x781b, 0x006c, 0x0005, 0x7890, 0x8007,
++	0x8001, 0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c,
++	0x00ff, 0xa186, 0x0003, 0x0128, 0xa186, 0x0000, 0x0110, 0x0804,
++	0x3e69, 0x781b, 0x006c, 0x0005, 0x6820, 0xc095, 0x6822, 0x82ff,
++	0x1118, 0x080c, 0x3eaa, 0x0030, 0x8211, 0x0110, 0x080c, 0x297f,
++	0x080c, 0x3eb6, 0x782b, 0x3008, 0x781b, 0x006c, 0x0005, 0xa684,
++	0x0060, 0x1150, 0x2d00, 0xa005, 0x0904, 0x3554, 0x682f, 0x0000,
++	0x6833, 0x0000, 0x0804, 0x3554, 0xd6dc, 0x1190, 0x68b4, 0xd0dc,
++	0x1178, 0x6998, 0x6a94, 0x692e, 0x6a32, 0x7044, 0xa005, 0x1128,
++	0x2200, 0xa105, 0x0120, 0x7047, 0x0015, 0x0804, 0x52e3, 0x0005,
++	0xd6ac, 0x0508, 0xd6f4, 0x0130, 0x682f, 0x0000, 0x6833, 0x0000,
++	0x0804, 0x52e3, 0x68b4, 0xa084, 0x4000, 0xa635, 0xd6f4, 0x1da0,
++	0x7044, 0xa005, 0x1110, 0x7047, 0x0015, 0xd6dc, 0x1130, 0x68b4,
++	0xd0dc, 0x0118, 0x69a8, 0x6aa4, 0x0010, 0x79d8, 0x7adc, 0x692e,
++	0x6a32, 0x0804, 0x52e3, 0xd6f4, 0x0130, 0x682f, 0x0000, 0x6833,
++	0x0000, 0x0804, 0x52e3, 0x68b4, 0xa084, 0x4800, 0xa635, 0xd6f4,
++	0x1da0, 0x7044, 0xa005, 0x1110, 0x7047, 0x0015, 0x79d8, 0x7adc,
++	0x78d0, 0x8007, 0xa084, 0x007f, 0xa108, 0xa291, 0x0000, 0x692e,
++	0x6a32, 0x2100, 0xa205, 0x1110, 0x0804, 0x52e3, 0x7000, 0xa086,
++	0x0006, 0x0110, 0x0804, 0x52e3, 0x0005, 0x6008, 0xc0cd, 0xd3cc,
++	0x0108, 0xc08d, 0x600a, 0x6818, 0x68ba, 0x681b, 0x0006, 0x688f,
++	0x0000, 0x6893, 0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f,
++	0x0003, 0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b,
++	0x0020, 0x68b3, 0x0000, 0x68af, 0x0000, 0x7000, 0x0002, 0x29ee,
++	0x3587, 0x3581, 0x357f, 0x357f, 0x357f, 0x357f, 0x357f, 0x080c,
++	0x297f, 0x6820, 0xd084, 0x1118, 0x080c, 0x3be8, 0x0030, 0x7060,
++	0x2c50, 0x2060, 0x6800, 0x6002, 0x2a60, 0xb28c, 0x0600, 0x0118,
++	0x2021, 0xb399, 0x0010, 0x2021, 0xb3d9, 0x2404, 0xa005, 0x0110,
++	0x2020, 0x0cd8, 0x2d22, 0x206b, 0x0000, 0x0005, 0x080c, 0x3bee,
++	0x080c, 0x3bfa, 0x6008, 0xc0cc, 0x600a, 0x789b, 0x000e, 0x6f14,
++	0x6817, 0x0002, 0xb28c, 0x0600, 0x0118, 0x2009, 0x0000, 0x0010,
++	0x2009, 0x0001, 0x080c, 0x5736, 0xd6dc, 0x01c8, 0x691c, 0xc1ed,
++	0x691e, 0x6828, 0xa082, 0x000e, 0x0290, 0x6848, 0xa084, 0x000f,
++	0xa086, 0x000b, 0x1160, 0x685c, 0xa086, 0x0047, 0x1140, 0x2001,
++	0xb341, 0x2004, 0xd0ac, 0x1118, 0x2700, 0x080c, 0x28a8, 0x68b8,
++	0xd0fc, 0x1110, 0x681a, 0x0060, 0x6818, 0xd0fc, 0x0148, 0x7868,
++	0xa08c, 0x00ff, 0x0118, 0x681b, 0x001e, 0x0010, 0x681b, 0x0000,
++	0xb284, 0x0600, 0x1118, 0x2021, 0xb3d9, 0x0010, 0x2021, 0xb399,
++	0x2404, 0xad06, 0x0108, 0x7460, 0x6800, 0x2022, 0x68d3, 0x0000,
++	0x70f4, 0xc084, 0x70f6, 0x6a3c, 0x6940, 0x6a32, 0x692e, 0x68c4,
++	0x2060, 0x6000, 0xd0a4, 0x0580, 0x2041, 0x0021, 0x2049, 0x0005,
++	0x2051, 0x0020, 0x00d6, 0x00f6, 0x0156, 0x0146, 0x2079, 0xb340,
++	0x080c, 0x1cd8, 0x014e, 0x015e, 0x00fe, 0x70e8, 0x2010, 0x2009,
++	0x0101, 0x0026, 0x2204, 0xa06d, 0x0140, 0x6814, 0xa706, 0x0110,
++	0x6800, 0x0cc8, 0x6820, 0xc0d5, 0x6822, 0x002e, 0x8210, 0x8109,
++	0x1d80, 0x00de, 0x706b, 0x0003, 0x7083, 0x0000, 0x777a, 0x7087,
++	0x000f, 0x71f0, 0xc1c4, 0x71f2, 0x6818, 0xa086, 0x0002, 0x1138,
++	0x6817, 0x0000, 0x682b, 0x0000, 0x681c, 0xc0ec, 0x681e, 0x080c,
++	0x2085, 0x0804, 0x29ee, 0x080c, 0x34e7, 0x682b, 0x0000, 0x789b,
++	0x000e, 0x6f14, 0x080c, 0x40d9, 0xa08c, 0x00ff, 0x6916, 0x6818,
++	0xd0fc, 0x0110, 0x7044, 0x681a, 0xa68c, 0x5f00, 0x691e, 0x706b,
++	0x0000, 0x0804, 0x29ee, 0x7000, 0xa005, 0x1110, 0x0804, 0x29ee,
++	0xa006, 0x080c, 0x52e3, 0x6817, 0x0000, 0x6920, 0xd1ac, 0x1110,
++	0x681b, 0x0014, 0xa68c, 0x5f00, 0x691e, 0x682b, 0x0000, 0x6820,
++	0xa084, 0x00ff, 0x6822, 0x7000, 0x0002, 0x29ee, 0x367a, 0x3677,
++	0x367c, 0x367c, 0x367c, 0x3675, 0x3675, 0x080c, 0x297f, 0x6008,
++	0xc0d4, 0x600a, 0x080c, 0x3bfa, 0x6008, 0xc0a4, 0x600a, 0x0804,
++	0x3bb3, 0x2300, 0x0002, 0x3686, 0x3688, 0x36f1, 0x080c, 0x297f,
++	0xd6fc, 0x1904, 0x36da, 0x7000, 0xa00d, 0x0002, 0x29ee, 0x369e,
++	0x3698, 0x36c8, 0x369e, 0x36d1, 0x3696, 0x3696, 0x080c, 0x297f,
++	0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xa684, 0x0060,
++	0x0538, 0xa086, 0x0060, 0x1510, 0xc6ac, 0xc6f4, 0xc6ed, 0x7e5a,
++	0x6eb6, 0x681c, 0xc0ac, 0x681e, 0xa186, 0x0002, 0x0148, 0x080c,
++	0x52e3, 0x69ac, 0x68b0, 0xa115, 0x0118, 0x080c, 0x5622, 0x0010,
++	0x080c, 0x55dc, 0x781b, 0x006c, 0x71f0, 0xd1b4, 0x1904, 0x29df,
++	0x70c0, 0xa086, 0x0001, 0x1904, 0x2a3f, 0x0005, 0xd6ec, 0x09f0,
++	0x6818, 0xd0fc, 0x0130, 0x681b, 0x0015, 0xd6f4, 0x0110, 0x681b,
++	0x0007, 0x080c, 0x405b, 0x0005, 0x78cb, 0x0000, 0x781b, 0x00d8,
++	0x0804, 0x29df, 0xc6fc, 0x7e5a, 0x7adc, 0x79d8, 0x78d0, 0x79d2,
++	0x8007, 0xa084, 0x007f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100,
++	0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x781b, 0x006c,
++	0x0005, 0x080c, 0x297f, 0x2300, 0x0002, 0x36f8, 0x36fa, 0x3752,
++	0x080c, 0x297f, 0xd6fc, 0x1904, 0x3742, 0x7000, 0xa00d, 0x0002,
++	0x29ee, 0x3710, 0x370a, 0x373a, 0x3710, 0x373f, 0x3708, 0x3708,
++	0x080c, 0x297f, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da,
++	0xa684, 0x0060, 0x0538, 0xa086, 0x0060, 0x1510, 0xa6b4, 0xbfbf,
++	0xc6ed, 0x7e5a, 0x6eb6, 0xa186, 0x0002, 0x0148, 0x080c, 0x52e3,
++	0x69ac, 0x68b0, 0xa115, 0x0118, 0x080c, 0x5622, 0x0010, 0x080c,
++	0x55dc, 0x781b, 0x006c, 0x681c, 0xc0b4, 0x681e, 0x71f0, 0xd1b4,
++	0x1904, 0x29df, 0x70c0, 0xa086, 0x0001, 0x1904, 0x2a3f, 0x0005,
++	0xd6ec, 0x09f0, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x0007, 0x781b,
++	0x00dd, 0x0005, 0xc6fc, 0x7e5a, 0x7adc, 0x79d8, 0x6b98, 0x2100,
++	0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x79d2, 0x781b,
++	0x006c, 0x0005, 0xd6dc, 0x0130, 0x782b, 0x3009, 0x781b, 0x006c,
++	0x0804, 0x29df, 0x6820, 0xc095, 0x6822, 0x080c, 0x4042, 0xc6dd,
++	0x080c, 0x3eaa, 0x782b, 0x3008, 0x781b, 0x006c, 0x0005, 0x2300,
++	0x0002, 0x376c, 0x376e, 0x3770, 0x080c, 0x297f, 0x0804, 0x3e98,
++	0x7d98, 0xd6d4, 0x1904, 0x37bc, 0x79e4, 0xd1ac, 0x0130, 0x78ec,
++	0xa084, 0x0003, 0x0110, 0x782b, 0x3009, 0x789b, 0x0060, 0x78ab,
++	0x0000, 0xa684, 0xfffb, 0x785a, 0x7d9a, 0x79e4, 0xd1ac, 0x0120,
++	0x78ec, 0xa084, 0x0003, 0x11b8, 0x2001, 0xb342, 0x2004, 0xd0e4,
++	0x1170, 0x6820, 0xd0c4, 0x0158, 0x00c6, 0x705c, 0x2060, 0x6004,
++	0xc09d, 0x6006, 0x6008, 0xa084, 0x00ff, 0x600a, 0x00ce, 0x2001,
++	0x0014, 0x0804, 0x339b, 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007,
++	0x0090, 0xa184, 0x0007, 0xa086, 0x0004, 0x1118, 0x2001, 0x0000,
++	0x0050, 0xa184, 0x0007, 0xa086, 0x0005, 0x0118, 0xa184, 0x0007,
++	0x0010, 0x2001, 0x0001, 0x0492, 0x7a90, 0xa294, 0x0007, 0x789b,
++	0x0060, 0x79a8, 0x81ff, 0x0538, 0x789b, 0x0090, 0x7ba8, 0xa384,
++	0x0001, 0x11a0, 0x7ba8, 0x7ba8, 0xa386, 0x0001, 0x1118, 0x2009,
++	0xfff7, 0x0028, 0xa386, 0x0003, 0x1148, 0x2009, 0xffef, 0x00c6,
++	0x705c, 0x2060, 0x6004, 0xa104, 0x6006, 0x00ce, 0x789b, 0x0060,
++	0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x782b, 0x3009, 0x6920,
++	0xa18c, 0xfcff, 0x6922, 0x7d9a, 0x0804, 0x404b, 0x3036, 0x303f,
++	0x37f8, 0x37fe, 0x37f6, 0x37f6, 0x404b, 0x404b, 0x080c, 0x297f,
++	0x6920, 0xa18c, 0xfcff, 0x6922, 0x0804, 0x4053, 0x6920, 0xa18c,
++	0xfcff, 0x6922, 0x0804, 0x404b, 0x79e4, 0xa184, 0x0030, 0x0120,
++	0x78ec, 0xa084, 0x0003, 0x1548, 0x7000, 0xa086, 0x0004, 0x1190,
++	0x7068, 0xa086, 0x0002, 0x1130, 0x2011, 0x0002, 0x2019, 0x0000,
++	0x0804, 0x2ec1, 0x7068, 0xa086, 0x0006, 0x0db0, 0x7068, 0xa086,
++	0x0004, 0x0d90, 0x7000, 0xa086, 0x0000, 0x0904, 0x29df, 0x6820,
++	0xd0ac, 0x1904, 0x339b, 0x6818, 0xa08e, 0x0002, 0x0120, 0xc0fd,
++	0x681a, 0x2001, 0x0014, 0x0804, 0x339b, 0x7884, 0xd0fc, 0x1118,
++	0xa184, 0x0007, 0x0090, 0xa184, 0x0007, 0xa086, 0x0004, 0x1118,
++	0x2001, 0x0000, 0x0050, 0xa184, 0x0007, 0xa086, 0x0005, 0x0118,
++	0xa184, 0x0007, 0x0010, 0x2001, 0x0001, 0x0002, 0x404b, 0x404b,
++	0x3856, 0x404b, 0x409e, 0x409e, 0x404b, 0x404b, 0xd6bc, 0x05d0,
++	0x7188, 0x81ff, 0x05b8, 0xa182, 0x000d, 0x1318, 0x708b, 0x0000,
++	0x0028, 0xa182, 0x000c, 0x708a, 0x2009, 0x000c, 0x789b, 0x0061,
++	0x79aa, 0x0156, 0x0136, 0x0146, 0x708c, 0x8114, 0xa210, 0x728e,
++	0xa080, 0x000b, 0xad00, 0x2098, 0x0016, 0xb28c, 0x0600, 0x0168,
++	0x0006, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0x20a1,
++	0x012b, 0x0028, 0x20a1, 0x022b, 0x0010, 0x20a1, 0x012b, 0x001e,
++	0x789b, 0x0000, 0x8108, 0x81ac, 0x53a6, 0x014e, 0x013e, 0x015e,
++	0x0804, 0x4053, 0xd6d4, 0x1904, 0x38df, 0x6820, 0xd084, 0x0904,
++	0x4053, 0xa68c, 0x0060, 0xa684, 0x0060, 0x0120, 0xa086, 0x0060,
++	0x1108, 0xc1f5, 0xc194, 0x795a, 0x69b6, 0x789b, 0x0060, 0x78ab,
++	0x0000, 0x789b, 0x0061, 0x6818, 0xc0fd, 0x681a, 0x78aa, 0x8008,
++	0x810c, 0x0904, 0x3c0f, 0xa18c, 0x00f8, 0x1904, 0x3c0f, 0x0156,
++	0x0136, 0x0146, 0x0016, 0xb28c, 0x0600, 0x0168, 0x0006, 0x2001,
++	0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0x20a1, 0x012b, 0x0028,
++	0x20a1, 0x022b, 0x0010, 0x20a1, 0x012b, 0x001e, 0x789b, 0x0000,
++	0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x014e, 0x013e,
++	0x015e, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x0804, 0x4053, 0x6818,
++	0xd0fc, 0x0110, 0x681b, 0x0008, 0x6820, 0xc0ad, 0x6822, 0x080c,
++	0x3eb0, 0x78cb, 0x0000, 0x781b, 0x00d4, 0x0005, 0x2300, 0x0002,
++	0x38f5, 0x397c, 0x38f3, 0x080c, 0x297f, 0x7000, 0xa084, 0x000f,
++	0x0002, 0x29ee, 0x3939, 0x3903, 0x390a, 0x3901, 0x29ee, 0x3901,
++	0x3901, 0x080c, 0x297f, 0x681c, 0xd0ec, 0x0198, 0x6008, 0xc08d,
++	0x600a, 0x0078, 0x68d0, 0xa005, 0x1560, 0x6920, 0xa18d, 0x0001,
++	0x6922, 0x68d3, 0x0001, 0x70f4, 0xc085, 0x70f6, 0x6800, 0x7066,
++	0x0078, 0x6920, 0xc185, 0x6922, 0x6800, 0x6006, 0xa005, 0x1108,
++	0x6002, 0x6008, 0xc0d4, 0x600a, 0x681c, 0xa084, 0x000e, 0x1140,
++	0x2009, 0xfc10, 0xb284, 0x0600, 0x0140, 0x2009, 0xfb00, 0x0028,
++	0x702c, 0x68be, 0x713c, 0x70e8, 0xa108, 0x2104, 0x6802, 0x2d0a,
++	0x7162, 0x6eb6, 0xa684, 0x0060, 0x1120, 0xa684, 0x7fff, 0x68b6,
++	0x04c8, 0xd6dc, 0x1150, 0xa684, 0x7fff, 0x68b6, 0x6894, 0x68a6,
++	0x6898, 0x68aa, 0x080c, 0x52e3, 0x0468, 0xd6ac, 0x0168, 0x68d0,
++	0xa005, 0x0118, 0x080c, 0x5736, 0x0010, 0x080c, 0x52e3, 0x79d8,
++	0x7adc, 0x69aa, 0x6aa6, 0x0030, 0x080c, 0x3fc5, 0x69aa, 0x6aa6,
++	0x080c, 0x52e3, 0xd6fc, 0x01b0, 0xa684, 0x7fff, 0x68b6, 0x7adc,
++	0x79d8, 0xd6ac, 0x1138, 0x78d0, 0x8007, 0xa084, 0x007f, 0xa108,
++	0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200,
++	0xa303, 0x68ae, 0x0804, 0x29ee, 0x0804, 0x3e98, 0x7043, 0x0000,
++	0xa282, 0x0006, 0x0310, 0x080c, 0x297f, 0x7000, 0xa086, 0x0007,
++	0x090c, 0x41a1, 0x2300, 0x0002, 0x398f, 0x39c1, 0x39de, 0x2200,
++	0x0002, 0x39bf, 0x3e98, 0x3997, 0x39bf, 0x39fe, 0x3a65, 0x7003,
++	0x0005, 0xb284, 0x0600, 0x0118, 0x2001, 0xfe60, 0x0010, 0x2001,
++	0xfe97, 0x2068, 0x7052, 0x0156, 0x20a9, 0x0037, 0x2003, 0x0000,
++	0x8000, 0x1f04, 0x39a6, 0x015e, 0xad80, 0x0009, 0x7042, 0xb284,
++	0x0600, 0x0118, 0x6817, 0x0000, 0x0010, 0x6817, 0x8000, 0x68b7,
++	0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x0804, 0x3e69, 0x080c,
++	0x297f, 0x2200, 0xa086, 0x0003, 0x05c8, 0x7003, 0x0005, 0xb284,
++	0x0600, 0x0118, 0x2001, 0xfe60, 0x0010, 0x2001, 0xfe97, 0x2068,
++	0x7052, 0xad80, 0x0009, 0x7042, 0x2200, 0x0002, 0x3e98, 0x39dc,
++	0x39dc, 0x39fe, 0x39dc, 0x3e98, 0x080c, 0x297f, 0x7003, 0x0005,
++	0xb284, 0x0600, 0x0118, 0x2001, 0xfe60, 0x0010, 0x2001, 0xfe97,
++	0x2068, 0x7052, 0xad80, 0x0009, 0x7042, 0x2200, 0x0002, 0x39f7,
++	0x39f5, 0x39f5, 0x39f7, 0x39f5, 0x39f7, 0x080c, 0x297f, 0x080c,
++	0x3eb6, 0x782b, 0x3008, 0x781b, 0x006c, 0x0005, 0x7000, 0xa086,
++	0x0002, 0x1158, 0x70f0, 0xc0b5, 0x70f2, 0x2c00, 0x70d6, 0x2d00,
++	0x70da, 0x0038, 0x080c, 0x52e3, 0x0020, 0x7000, 0xa086, 0x0003,
++	0x0dc8, 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018,
++	0x7ca8, 0xa484, 0x001f, 0xa215, 0x2069, 0xfb00, 0xb284, 0x0600,
++	0x1118, 0xc2fd, 0x2069, 0xfc10, 0x2d04, 0x2d08, 0x7162, 0xa06d,
++	0x0128, 0x6814, 0xa206, 0x0500, 0x6800, 0x0cb8, 0x7003, 0x0005,
++	0xd2fc, 0x1118, 0x2001, 0xfe60, 0x0010, 0x2001, 0xfe97, 0x2068,
++	0x7052, 0x0156, 0x20a9, 0x0037, 0x2003, 0x0000, 0x8000, 0x1f04,
++	0x3a3c, 0x015e, 0xad80, 0x0009, 0x7042, 0x6a16, 0x68b7, 0x0700,
++	0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4, 0x7e5a, 0x6920, 0xa184,
++	0x0c00, 0x0904, 0x3adc, 0x7068, 0xa086, 0x0006, 0x1128, 0x7078,
++	0xa206, 0x1110, 0x706a, 0x7082, 0x681b, 0x0005, 0xc1ad, 0xc1d4,
++	0x6922, 0x080c, 0x3eb0, 0x0804, 0x3adc, 0x7200, 0xa286, 0x0002,
++	0x1158, 0x70f0, 0xc0b5, 0x70f2, 0x2c00, 0x70d6, 0x2d00, 0x70da,
++	0x0030, 0x080c, 0x52e3, 0x0018, 0xa286, 0x0003, 0x0dd0, 0x7003,
++	0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484,
++	0x001f, 0xa215, 0xb284, 0x0600, 0x1108, 0xc2fd, 0x79a8, 0x79a8,
++	0xa18c, 0x00ff, 0x2118, 0x70e8, 0xa168, 0x2d04, 0x2d08, 0x7162,
++	0xa06d, 0x0128, 0x6814, 0xa206, 0x0538, 0x6800, 0x0cb8, 0x7003,
++	0x0005, 0xb284, 0x0600, 0x0118, 0x2001, 0xfe60, 0x0010, 0x2001,
++	0xfe97, 0x2068, 0x7052, 0x0156, 0x20a9, 0x0037, 0x2003, 0x0000,
++	0x8000, 0x1f04, 0x3aa6, 0x015e, 0xad80, 0x0009, 0x7042, 0xb284,
++	0x0600, 0x0110, 0xc2fc, 0x0008, 0xc2fd, 0x6a16, 0x68b7, 0x0700,
++	0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4, 0x6920, 0xa184, 0x0c00,
++	0x01d8, 0xd0dc, 0x0178, 0x7068, 0xa086, 0x0004, 0x1140, 0x7078,
++	0xa206, 0x1128, 0x707c, 0xa306, 0x1110, 0x706a, 0x7082, 0x080c,
++	0x3eb3, 0x0050, 0x681b, 0x0005, 0xc1ad, 0xc1d4, 0x6922, 0x080c,
++	0x3eb0, 0x7083, 0x0000, 0x0000, 0x68c4, 0x705e, 0xc6ec, 0xa684,
++	0x0060, 0x05d0, 0x6b98, 0x6c94, 0x69ac, 0x68b0, 0xa105, 0x11d0,
++	0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa684, 0x0060, 0xa086, 0x0060,
++	0x0580, 0x68d0, 0xa005, 0x0140, 0x7003, 0x0003, 0x682b, 0x0000,
++	0xc6ed, 0x080c, 0x55ca, 0x0428, 0xd6f4, 0x1518, 0xc6ed, 0x080c,
++	0x55dc, 0x00f8, 0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400, 0xa305,
++	0x01d0, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68d0, 0xa005, 0x0128,
++	0x7003, 0x0003, 0x080c, 0x55ca, 0x0070, 0xd6f4, 0x1120, 0xc6ed,
++	0x68b0, 0x080c, 0x5622, 0xc6f4, 0x2019, 0x0000, 0x2021, 0x0000,
++	0x0010, 0xa6b4, 0xb7ff, 0x7e5a, 0x2009, 0x006c, 0xa684, 0x0004,
++	0x01b0, 0x78e4, 0xa084, 0x0030, 0x0150, 0x78ec, 0xa084, 0x0003,
++	0x0130, 0x782b, 0x3008, 0x2019, 0x0000, 0x2320, 0x0040, 0x00f6,
++	0x2079, 0xb340, 0x080c, 0x52e3, 0x00fe, 0x0904, 0x29ee, 0x791a,
++	0x2d00, 0x7052, 0x68c8, 0x2060, 0x71f0, 0x2001, 0xb341, 0x2004,
++	0xd0c4, 0x15c8, 0x70f8, 0xa02d, 0x01b8, 0xd1bc, 0x0548, 0x7a80,
++	0xa294, 0x0f00, 0x70fc, 0xa206, 0x0118, 0x78e0, 0xa504, 0x1558,
++	0x70fa, 0xc1bc, 0x71f2, 0x0438, 0x2031, 0x0001, 0x852c, 0x0218,
++	0x8633, 0x8210, 0x0cd8, 0x0005, 0x7de0, 0xa594, 0xff00, 0x0130,
++	0x2011, 0x0008, 0x852f, 0x0c81, 0x8637, 0x0008, 0x0c69, 0x8217,
++	0x7880, 0xa084, 0x0f00, 0xa206, 0x0170, 0x72fe, 0x76fa, 0x0058,
++	0x7a80, 0xa294, 0x0f00, 0x70fc, 0xa236, 0x0dc0, 0x78e0, 0xa534,
++	0x0da8, 0xc1bd, 0x71f2, 0xd1b4, 0x1904, 0x29df, 0x2300, 0xa405,
++	0x0904, 0x29df, 0x70c0, 0xa086, 0x0001, 0x1904, 0x2a3f, 0x0005,
++	0x6020, 0xa005, 0x0150, 0x8001, 0x6022, 0x6008, 0xa085, 0x0008,
++	0x600a, 0x700b, 0x0100, 0x7028, 0x6026, 0x0005, 0xa006, 0x080c,
++	0x52e3, 0x7000, 0xa086, 0x0002, 0x0120, 0x7068, 0xa086, 0x0005,
++	0x1150, 0x682b, 0x0000, 0x6817, 0x0000, 0x681b, 0x0001, 0x6823,
++	0x0040, 0x681f, 0x0100, 0x7000, 0xa084, 0x000f, 0x0002, 0x29ee,
++	0x3bc4, 0x3bc1, 0x3be4, 0x3bcd, 0x3bcb, 0x3bbf, 0x3bbf, 0x080c,
++	0x297f, 0x0461, 0x0429, 0x0028, 0x0449, 0x7060, 0x2060, 0x6800,
++	0x6002, 0x080c, 0x2085, 0x0804, 0x29ee, 0x7068, 0x706b, 0x0000,
++	0x7087, 0x0000, 0x0002, 0x3be0, 0x3be0, 0x3bdb, 0x3bdb, 0x3bdb,
++	0x3be0, 0x3bdb, 0x3be0, 0x77f0, 0xc7c5, 0x77f2, 0x0804, 0x2ed6,
++	0x706b, 0x0000, 0x0804, 0x29ee, 0x681b, 0x0000, 0x0804, 0x359e,
++	0x6800, 0xa005, 0x1108, 0x6002, 0x6006, 0x0005, 0x6010, 0xa005,
++	0x0120, 0x8001, 0x1310, 0x080c, 0x297f, 0x6012, 0x6008, 0xc0a4,
++	0x600a, 0x0005, 0x6018, 0xa005, 0x0110, 0x8001, 0x601a, 0x0005,
++	0x080c, 0x40d4, 0x681b, 0x0018, 0x0480, 0x080c, 0x40d4, 0x681b,
++	0x0019, 0x0458, 0x080c, 0x40d4, 0x681b, 0x001a, 0x0430, 0x080c,
++	0x40d4, 0x681b, 0x0003, 0x0408, 0x7778, 0x080c, 0x3fb3, 0x717c,
++	0xa18c, 0x00ff, 0xd7fc, 0x1118, 0xa1e8, 0xfa00, 0x0010, 0xa1e8,
++	0xfb10, 0x2d04, 0x2d08, 0x2068, 0xa005, 0x1118, 0x7082, 0x0804,
++	0x29ee, 0x6814, 0x7278, 0xa206, 0x0110, 0x6800, 0x0c98, 0x6800,
++	0x200a, 0x681b, 0x0005, 0x7083, 0x0000, 0x080c, 0x3bee, 0x6820,
++	0xd084, 0x1110, 0x080c, 0x3be8, 0x080c, 0x3bfa, 0x681f, 0x0000,
++	0x6823, 0x0020, 0x682b, 0x0000, 0x080c, 0x2085, 0x0804, 0x29ee,
++	0xa282, 0x0003, 0x1904, 0x3e70, 0x7da8, 0xa5ac, 0x00ff, 0x7ea8,
++	0xa6b4, 0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1c4, 0x05a0, 0xc1c4,
++	0x6922, 0xa6b4, 0x00ff, 0x0520, 0xa682, 0x001c, 0x0218, 0x0110,
++	0x2031, 0x001c, 0xa686, 0x0010, 0x1108, 0x8630, 0x852b, 0x852b,
++	0x2041, 0x0000, 0x080c, 0x3f0c, 0x0118, 0x080c, 0x3d35, 0x0090,
++	0x080c, 0x3ef8, 0x080c, 0x3d32, 0x6920, 0xc1c5, 0x6922, 0x7e58,
++	0xc695, 0x7e5a, 0xd6d4, 0x1110, 0x0804, 0x4056, 0x0804, 0x3ccc,
++	0x080c, 0x3d32, 0x7e58, 0xd6d4, 0x1118, 0x781b, 0x005f, 0x0005,
++	0x781b, 0x006c, 0x0005, 0x00c6, 0x705c, 0x2060, 0x6100, 0xd1e4,
++	0x0598, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x001c, 0x0218,
++	0x0110, 0x2011, 0x001c, 0x2600, 0xa202, 0x1208, 0x2230, 0xa686,
++	0x0010, 0x1108, 0x8630, 0x6208, 0xa294, 0x00ff, 0x78ec, 0xd0e4,
++	0x0130, 0xa282, 0x000a, 0x1240, 0x2011, 0x000a, 0x0028, 0xa282,
++	0x000c, 0x1210, 0x2011, 0x000c, 0x2200, 0xa502, 0x1208, 0x2228,
++	0x080c, 0x3efc, 0x852b, 0x852b, 0x2041, 0x0000, 0x080c, 0x3f0c,
++	0x0118, 0x080c, 0x3d35, 0x0020, 0x080c, 0x3ef8, 0x080c, 0x3d32,
++	0x7858, 0xc095, 0x785a, 0x00ce, 0x782b, 0x3008, 0x781b, 0x006c,
++	0x0005, 0x00c6, 0x2960, 0x6000, 0xd0e4, 0x1170, 0xa084, 0x0040,
++	0x1130, 0x6104, 0xa18c, 0xfff5, 0x6106, 0x00ce, 0x0005, 0x2011,
++	0x0032, 0x2019, 0x0000, 0x0418, 0x68a0, 0xd0cc, 0x1dc0, 0x6208,
++	0xa294, 0x00ff, 0x2001, 0xb343, 0x2004, 0xd0e4, 0x1148, 0x78ec,
++	0xd0e4, 0x0130, 0xa282, 0x000b, 0x1218, 0x2011, 0x000a, 0x0028,
++	0xa282, 0x000c, 0x1210, 0x2011, 0x000c, 0x6308, 0x831f, 0xa39c,
++	0x00ff, 0xa382, 0x001c, 0x0218, 0x0110, 0x2019, 0x001c, 0x78ab,
++	0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0,
++	0x0005, 0x6820, 0xc0c5, 0x6822, 0x080c, 0x2ae3, 0x00ce, 0x0005,
++	0x00c6, 0x2960, 0x6104, 0xa18c, 0xfff5, 0x6106, 0x2011, 0x0032,
++	0x2019, 0x0000, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
++	0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xc0c5, 0x6822,
++	0x00ce, 0x0005, 0xa006, 0x2030, 0x2010, 0x00c6, 0x715c, 0x2160,
++	0x0029, 0x00ce, 0x0005, 0xa006, 0x2030, 0x2010, 0x2018, 0x2008,
++	0xa084, 0xffe0, 0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae, 0x6612,
++	0x78a4, 0xa084, 0x7770, 0xa18c, 0x000f, 0xa105, 0x0056, 0x2029,
++	0xb343, 0x252c, 0xd5cc, 0x005e, 0x0140, 0xd3a4, 0x0110, 0xa085,
++	0x0800, 0xd3fc, 0x0110, 0xa085, 0x8080, 0x78a6, 0x0006, 0x78ec,
++	0xd08c, 0x0130, 0x6028, 0xd08c, 0x0118, 0x000e, 0xc0bc, 0x0008,
++	0x000e, 0x6016, 0x788a, 0xa6b4, 0x001f, 0x8637, 0x8204, 0x8004,
++	0xa605, 0x600e, 0x6004, 0xa084, 0xffd5, 0x6006, 0x0005, 0xa282,
++	0x0002, 0x1904, 0x3e7a, 0x7aa8, 0x6920, 0xc1bd, 0x6922, 0xd1cc,
++	0x0558, 0xc1cc, 0x6922, 0xa294, 0x00ff, 0xa282, 0x0002, 0x1a04,
++	0x3e69, 0x080c, 0x3deb, 0x080c, 0x3d32, 0xa980, 0x0001, 0x200c,
++	0x080c, 0x3faf, 0x080c, 0x3cd1, 0x88ff, 0x0168, 0x789b, 0x0060,
++	0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x1110, 0x0804,
++	0x4056, 0x0804, 0x3ccc, 0x7e58, 0xd6d4, 0x1118, 0x781b, 0x005f,
++	0x0005, 0x781b, 0x006c, 0x0005, 0xa282, 0x0002, 0x1218, 0xa284,
++	0x0001, 0x0138, 0x715c, 0xa188, 0x0000, 0x210c, 0xd1ec, 0x1108,
++	0xa016, 0x080c, 0x3ee9, 0x0479, 0x080c, 0x3d32, 0x7858, 0xc095,
++	0x785a, 0x782b, 0x3008, 0x781b, 0x006c, 0x0005, 0x00c6, 0x0026,
++	0x2960, 0x6000, 0x2011, 0x0001, 0xd0ec, 0x1148, 0xa084, 0x0080,
++	0x1120, 0xc1a4, 0x6106, 0xa006, 0x0088, 0x2011, 0x0000, 0x78ab,
++	0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004,
++	0x080c, 0x2ae3, 0x6820, 0xa085, 0x0200, 0x6822, 0x002e, 0x00ce,
++	0x0005, 0x8807, 0xa715, 0x00c6, 0x705c, 0x2060, 0x0011, 0x00ce,
++	0x0005, 0x2009, 0x0000, 0x82ff, 0x0110, 0x2009, 0x0040, 0x6018,
++	0xa080, 0x0002, 0x789a, 0x78a4, 0xa084, 0xff9f, 0xa105, 0xc0ec,
++	0xd0b4, 0x1108, 0xc0ed, 0x6100, 0xd1f4, 0x0110, 0xa085, 0x0020,
++	0x78a6, 0x0006, 0x6000, 0xd09c, 0x0140, 0x6028, 0xd08c, 0x0128,
++	0x000e, 0xd0bc, 0x0118, 0xc0bc, 0x0008, 0x000e, 0xe016, 0x788a,
++	0x6004, 0xa084, 0xffef, 0x6006, 0x0005, 0x0006, 0x7000, 0xa086,
++	0x0003, 0x0110, 0x000e, 0x0010, 0x000e, 0x0488, 0xd6ac, 0x0578,
++	0x7888, 0xa084, 0x0040, 0x0558, 0x7bb8, 0x8307, 0xa084, 0x007f,
++	0x1508, 0x8207, 0xa084, 0x00ff, 0xa09e, 0x0001, 0x1904, 0x3e92,
++	0xd6f4, 0x11d0, 0x79d8, 0x7adc, 0xa108, 0xa291, 0x0000, 0x79d2,
++	0x79da, 0x7ad6, 0x7ade, 0x080c, 0x56fb, 0x781b, 0x006b, 0xb284,
++	0x0600, 0x0118, 0x2001, 0x0000, 0x0010, 0x2001, 0x0001, 0x080c,
++	0x555b, 0x0005, 0x080c, 0x297f, 0x781b, 0x006b, 0x0005, 0x781b,
++	0x006c, 0x0005, 0x2039, 0x0000, 0x2041, 0x0000, 0x2031, 0x0000,
++	0xa006, 0x2010, 0x080c, 0x3d35, 0x2029, 0x0000, 0x080c, 0x3de9,
++	0x7e58, 0x080c, 0x3eb9, 0x782b, 0x3008, 0x781b, 0x006c, 0x0005,
++	0x0cc1, 0x6820, 0xc0c4, 0x6822, 0x00c6, 0x705c, 0x2060, 0x080c,
++	0x3d72, 0x00b0, 0x0c71, 0x6820, 0xc0cc, 0x6822, 0x00c6, 0x705c,
++	0x2060, 0x080c, 0x3e18, 0x0060, 0x0c21, 0x6820, 0xa084, 0xecff,
++	0x6822, 0x00c6, 0x705c, 0x2060, 0x6004, 0xa084, 0xffc5, 0x6006,
++	0x00ce, 0x0005, 0x00b9, 0x782b, 0x3008, 0x781b, 0x006c, 0x0005,
++	0x6827, 0x0002, 0x00a9, 0x78e4, 0xa084, 0x0030, 0x0904, 0x29ee,
++	0x78ec, 0xa084, 0x0003, 0x0904, 0x29ee, 0x782b, 0x3008, 0x781b,
++	0x006c, 0x0005, 0x2001, 0x0005, 0x0070, 0x2001, 0x000c, 0x0058,
++	0x2001, 0x0006, 0x0040, 0x2001, 0x000d, 0x0028, 0x2001, 0x0009,
++	0x0010, 0x2001, 0x0007, 0x789b, 0x0090, 0x78aa, 0x789b, 0x0060,
++	0x78ab, 0x0001, 0xc695, 0x7e5a, 0x0804, 0x2ae3, 0x0076, 0x873f,
++	0xa7bc, 0x000f, 0x873b, 0x873b, 0x873b, 0x8703, 0xb28c, 0x0600,
++	0x0118, 0xa0e0, 0xb800, 0x0010, 0xa0e0, 0xb900, 0xa7b8, 0x0020,
++	0x7f9a, 0x79a4, 0xa184, 0x7fe0, 0x78ae, 0x6012, 0x79a4, 0xa184,
++	0x773f, 0x78a6, 0x6016, 0x6004, 0xa085, 0x0038, 0x6006, 0x007e,
++	0x0005, 0x789b, 0x0090, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab,
++	0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab, 0x0004, 0x0804, 0x2ae3,
++	0x2021, 0x0000, 0x2029, 0x0032, 0x789b, 0x0090, 0x78ab, 0x0001,
++	0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7caa, 0x789b, 0x0060,
++	0x78ab, 0x0005, 0x0804, 0x2ae3, 0x0156, 0x0804, 0x3f4e, 0x2021,
++	0x3fa6, 0x20a9, 0x0009, 0x2011, 0x0029, 0xa582, 0x0028, 0x0550,
++	0x8420, 0x95a9, 0x2011, 0x0033, 0xa582, 0x0033, 0x0618, 0x8420,
++	0x95a9, 0x2019, 0x000a, 0x2011, 0x0065, 0x2200, 0xa502, 0x02d0,
++	0x8420, 0x2300, 0xa210, 0x1f04, 0x3f25, 0x015e, 0x0088, 0x2021,
++	0x3f98, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011, 0x0033, 0x2200,
++	0xa502, 0x0240, 0x8420, 0x2300, 0xa210, 0x1f04, 0x3f37, 0x015e,
++	0xa006, 0x0005, 0x8211, 0x015e, 0xa582, 0x0064, 0x1220, 0x7808,
++	0xa085, 0x0070, 0x780a, 0x2405, 0xa005, 0x0005, 0xa886, 0x0002,
++	0x01e8, 0x2021, 0x3f84, 0x20a9, 0x000d, 0x2011, 0x0028, 0xa582,
++	0x0028, 0x0d48, 0x8420, 0x2019, 0x0019, 0x2011, 0x0033, 0x2200,
++	0xa502, 0x0e00, 0x8420, 0x2300, 0xa210, 0x1f04, 0x3f5f, 0x015e,
++	0x2011, 0x0184, 0xa582, 0x0185, 0x0ab0, 0x0890, 0x2021, 0x3f93,
++	0x20a9, 0x0003, 0x2011, 0x0024, 0xa586, 0x0024, 0x0960, 0x8420,
++	0x2011, 0x0028, 0xa586, 0x0028, 0x0930, 0x8420, 0x2019, 0x0019,
++	0x2011, 0x0033, 0x0804, 0x3f37, 0x1021, 0x2202, 0x3403, 0x4604,
++	0x5805, 0x6a06, 0x7c07, 0x4610, 0x4612, 0x5812, 0x5a12, 0x6a14,
++	0x6c14, 0x6e14, 0x7e17, 0x9021, 0xb002, 0xe204, 0xe210, 0xe210,
++	0x1209, 0x3002, 0x3202, 0x4203, 0x4403, 0x5404, 0x5604, 0x6605,
++	0x6805, 0x7806, 0x7a06, 0x0c07, 0x0c07, 0x0e07, 0x10e1, 0x330a,
++	0x5805, 0x5a05, 0x6a06, 0x6c06, 0x7c07, 0x7e07, 0x0e00, 0x789b,
++	0x0090, 0xa046, 0x0005, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f,
++	0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xd7fc, 0x0118, 0xa0e0,
++	0xda00, 0x0010, 0xa0e0, 0xba00, 0x0005, 0x79d8, 0x7adc, 0x78d0,
++	0x8007, 0xa084, 0x007f, 0xa108, 0xa291, 0x0000, 0x0005, 0x00e6,
++	0x00f6, 0xd084, 0x0138, 0x2079, 0x0100, 0x2009, 0xb3c0, 0x2071,
++	0xb3c0, 0x0070, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x0118, 0x2079,
++	0x0100, 0x0010, 0x2079, 0x0200, 0x2009, 0xb380, 0x2071, 0xb380,
++	0x2091, 0x8000, 0x2104, 0xa084, 0x000f, 0x0002, 0x3ff8, 0x3ff8,
++	0x3ff8, 0x3ff8, 0x3ff8, 0x3ff8, 0x3ff6, 0x403d, 0x080c, 0x297f,
++	0x69b4, 0xc1f5, 0xa18c, 0xff9f, 0x69b6, 0xa005, 0x05d8, 0x7858,
++	0xa084, 0xff9f, 0xa085, 0x6000, 0x785a, 0x7828, 0xa086, 0x1814,
++	0x1588, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004, 0x1de0, 0x784b,
++	0x0008, 0x7848, 0xa084, 0x0008, 0x1de0, 0x7830, 0xd0bc, 0x1510,
++	0x3200, 0x0006, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118,
++	0xa084, 0x0600, 0x0010, 0xa084, 0x0800, 0x0118, 0x0104, 0x403a,
++	0x0010, 0x0304, 0x403a, 0x79e4, 0xa184, 0x0030, 0x0158, 0x78ec,
++	0xa084, 0x0003, 0x0138, 0x681c, 0xd0ac, 0x1110, 0x0421, 0x0010,
++	0x781b, 0x00dd, 0x00fe, 0x00ee, 0x0005, 0x70a7, 0x0000, 0x080c,
++	0x4397, 0x0cc0, 0x2001, 0xb341, 0x2004, 0xd0ac, 0x1118, 0x6814,
++	0x080c, 0x28a8, 0x0005, 0x781b, 0x006c, 0x0005, 0x782b, 0x3008,
++	0x781b, 0x006c, 0x0005, 0x781b, 0x005f, 0x0005, 0x782b, 0x3008,
++	0x781b, 0x005d, 0x0005, 0x2009, 0xb356, 0x210c, 0xa186, 0x0000,
++	0x0150, 0xa186, 0x0001, 0x0160, 0x701b, 0x000b, 0x706b, 0x0001,
++	0x781b, 0x0050, 0x0005, 0x78cb, 0x0000, 0x781b, 0x00d8, 0x0005,
++	0x701b, 0x000a, 0x0005, 0x2009, 0xb356, 0x210c, 0xa186, 0x0000,
++	0x0170, 0xa186, 0x0001, 0x0140, 0x701b, 0x000b, 0x706b, 0x0001,
++	0x781b, 0x0050, 0x0804, 0x29df, 0x701b, 0x000a, 0x0005, 0x782b,
++	0x3008, 0x78cb, 0x0000, 0x781b, 0x00d8, 0x0005, 0x781b, 0x00dd,
++	0x0005, 0x782b, 0x3008, 0x781b, 0x00dd, 0x0005, 0x781b, 0x00a4,
++	0x0005, 0x782b, 0x3008, 0x781b, 0x00a4, 0x0005, 0x6818, 0xd0fc,
++	0x0110, 0x681b, 0x001d, 0x706b, 0x0001, 0x781b, 0x0050, 0x0005,
++	0x7830, 0xa084, 0x00c0, 0x1180, 0x7808, 0xa084, 0xfffc, 0x780a,
++	0xe000, 0xe000, 0xe000, 0xe000, 0x78ec, 0xa084, 0x0021, 0x1108,
++	0x0005, 0x704c, 0xc08d, 0x780a, 0x0005, 0x7830, 0xa084, 0x0080,
++	0x1190, 0x78ec, 0xa084, 0x0002, 0x1170, 0x7808, 0xc08c, 0x780a,
++	0xe000, 0xe000, 0xe000, 0xe000, 0x78ec, 0xa084, 0x0002, 0x0118,
++	0x7808, 0xc08d, 0x780a, 0x0005, 0x704c, 0xc08d, 0x704e, 0x780a,
++	0x0005, 0x7830, 0xa084, 0x0040, 0x1de0, 0x3200, 0x0006, 0x2001,
++	0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0xa084, 0x0600, 0x0010,
++	0xa084, 0x0800, 0x0118, 0x1104, 0x40f2, 0x0010, 0x1304, 0x40f2,
++	0x78ac, 0x0005, 0x7808, 0xa084, 0xfffd, 0x780a, 0xe000, 0xe000,
++	0xe000, 0xe000, 0x78ec, 0xa084, 0x0021, 0x0198, 0x3200, 0x0006,
++	0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0xa084, 0x0600,
++	0x0010, 0xa084, 0x0800, 0x0118, 0x1104, 0x410c, 0x0010, 0x1304,
++	0x410f, 0x78ac, 0x0006, 0x704c, 0x780a, 0x000e, 0x0005, 0x78ec,
++	0xa084, 0x0002, 0x1904, 0x52a1, 0xa784, 0x007d, 0x1118, 0x2700,
++	0x080c, 0x297f, 0xa784, 0x0001, 0x1904, 0x3653, 0xa784, 0x0070,
++	0x0140, 0x00c6, 0x2d60, 0x2f68, 0x080c, 0x2899, 0x2d78, 0x2c68,
++	0x00ce, 0xa784, 0x0008, 0x0148, 0x784b, 0x0008, 0x78ec, 0xa084,
++	0x0003, 0x0904, 0x3653, 0x0804, 0x404b, 0xa784, 0x0004, 0x0538,
++	0x78b8, 0xa084, 0x8000, 0x0518, 0x784b, 0x0008, 0x78ec, 0xa084,
++	0x0003, 0x0904, 0x3653, 0x78e4, 0xa084, 0x0007, 0xa086, 0x0001,
++	0x11b0, 0x78c0, 0xa085, 0x4800, 0x2030, 0x7e5a, 0x781b, 0x00dd,
++	0x0005, 0x784b, 0x0008, 0x6818, 0xd0fc, 0x0130, 0x681b, 0x0015,
++	0xd6f4, 0x0110, 0x681b, 0x0007, 0x080c, 0x405b, 0x0005, 0x681b,
++	0x0003, 0x7858, 0xa084, 0x5f00, 0x681e, 0x682f, 0x0000, 0x6833,
++	0x0000, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0904, 0x3006,
++	0x3200, 0x0006, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118,
++	0xa084, 0x0600, 0x0010, 0xa084, 0x0800, 0x0118, 0x0104, 0x29df,
++	0x0010, 0x0304, 0x29df, 0x0804, 0x3e92, 0x6b14, 0x8307, 0xa084,
++	0x000f, 0x8003, 0x8003, 0x8003, 0x8003, 0xd3fc, 0x0118, 0xa080,
++	0xb900, 0x0010, 0xa080, 0xb800, 0x2060, 0x2048, 0x705e, 0x2a60,
++	0x0005, 0x7000, 0x0002, 0x41ab, 0x41ab, 0x41ac, 0x41b4, 0x41ab,
++	0x41ab, 0x41ab, 0x41b7, 0x0005, 0x6008, 0xa084, 0xfbef, 0x600a,
++	0x6018, 0x8001, 0x601a, 0x0005, 0x080c, 0x52e3, 0x0005, 0x7094,
++	0xa005, 0x01a8, 0x2068, 0xb284, 0x0600, 0x0118, 0x2009, 0x0000,
++	0x0010, 0x2009, 0x0001, 0x0016, 0x080c, 0x1eb2, 0x001e, 0x0016,
++	0x080c, 0x5222, 0x001e, 0x080c, 0x5223, 0x7097, 0x0000, 0x0005,
++	0x00c6, 0x2960, 0x6000, 0xd0ac, 0x0904, 0x4216, 0xd1ac, 0x05e0,
++	0x6108, 0x8117, 0xa18c, 0x00ff, 0x631c, 0x832f, 0x68a0, 0xd0cc,
++	0x11c8, 0xa584, 0x00ff, 0x0138, 0x78ec, 0xd0e4, 0x0110, 0x8213,
++	0x00b8, 0x2029, 0x0000, 0xa182, 0x000c, 0x1290, 0x78ec, 0xd0e4,
++	0x1118, 0x2009, 0x000c, 0x0060, 0xa182, 0x000b, 0x1248, 0x2009,
++	0x000a, 0x0030, 0x2009, 0x0032, 0x2011, 0x0000, 0x2029, 0x0000,
++	0x78ab, 0x0001, 0x78ab, 0x0006, 0x78ab, 0x0004, 0x79aa, 0x78ab,
++	0x0000, 0x7aaa, 0x7baa, 0x7daa, 0xa8c0, 0x0008, 0x6820, 0xa085,
++	0x1000, 0x6822, 0x080c, 0x2ae3, 0xa085, 0x0001, 0x00ce, 0x0005,
++	0xa282, 0x0006, 0x1904, 0x3e84, 0x7da8, 0x7eac, 0x8637, 0xa5ac,
++	0x00ff, 0xa6b4, 0x00ff, 0x7fac, 0x8747, 0xa7bc, 0x00ff, 0xa8c4,
++	0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1e4, 0x0904, 0x4286, 0xa18c,
++	0xecff, 0x6922, 0xa782, 0x0002, 0x1a04, 0x3e5a, 0xa6b4, 0x00ff,
++	0x0904, 0x4283, 0xa682, 0x0039, 0x1a04, 0x3e5a, 0xa582, 0x0009,
++	0x0a04, 0x3e5a, 0xa882, 0x0003, 0x1a04, 0x3e5a, 0xa886, 0x0002,
++	0x01d0, 0xa886, 0x0000, 0x1904, 0x3e5a, 0x2001, 0x000c, 0x79ec,
++	0xd1e4, 0x0110, 0x2001, 0x000a, 0xa502, 0x1290, 0x080c, 0x3e5a,
++	0x00c6, 0x2960, 0x6004, 0xa085, 0x001a, 0x6006, 0x6000, 0xc0ac,
++	0x6002, 0x00ce, 0x0005, 0xa786, 0x0000, 0x0904, 0x3e5a, 0x8634,
++	0xa686, 0x0010, 0x1108, 0x8630, 0x852b, 0x852b, 0x080c, 0x3f0c,
++	0x0904, 0x3e5a, 0x2029, 0x0000, 0x080c, 0x3d35, 0x2029, 0x0000,
++	0x080c, 0x3de9, 0x7e58, 0xd6d4, 0x1118, 0x781b, 0x005f, 0x0005,
++	0x781b, 0x006c, 0x0005, 0x080c, 0x3d32, 0x0c80, 0xa886, 0x0002,
++	0x1108, 0x8634, 0x715c, 0xa188, 0x0000, 0x210c, 0xd1ac, 0x0904,
++	0x3e5a, 0xd1ec, 0x1120, 0x2039, 0x0000, 0x2041, 0x0000, 0xd1e4,
++	0x1118, 0xa036, 0x2041, 0x0000, 0xa782, 0x0002, 0x12c8, 0x621c,
++	0xa284, 0x00ff, 0xa706, 0x0110, 0x2039, 0x0000, 0xa605, 0x0190,
++	0x6108, 0x811f, 0xa39c, 0x00ff, 0x0168, 0xa302, 0x1208, 0x2330,
++	0x8807, 0xa705, 0xa086, 0x0201, 0x0160, 0xa886, 0x0000, 0x0168,
++	0x2039, 0x0000, 0x2041, 0x0000, 0x2031, 0x0000, 0xa006, 0x2010,
++	0x0070, 0xa284, 0xff00, 0x1108, 0x2040, 0xa184, 0x00ff, 0xa502,
++	0x0108, 0x2128, 0x852b, 0x852b, 0x080c, 0x3f0c, 0x0d58, 0x080c,
++	0x3d35, 0x2029, 0x0000, 0x080c, 0x3de9, 0x789b, 0x0090, 0x78ab,
++	0x0001, 0x78ab, 0x0006, 0x78ab, 0x0004, 0x78ab, 0x0000, 0x7daa,
++	0x7eaa, 0x7faa, 0x2800, 0x78aa, 0x789b, 0x0060, 0x78ab, 0x0005,
++	0x080c, 0x2ae3, 0x7858, 0xc095, 0x785a, 0x0804, 0x1e66, 0x00e6,
++	0x2091, 0x8000, 0x6014, 0xd0fc, 0x1118, 0x2071, 0xb380, 0x0010,
++	0x2071, 0xb3c0, 0x7000, 0xa086, 0x0007, 0x1150, 0x6110, 0x70b0,
++	0xa106, 0x1130, 0x00ee, 0x080c, 0x1ec4, 0x0041, 0xa006, 0x0005,
++	0x2091, 0x8001, 0x00ee, 0xa085, 0x0001, 0x0005, 0x00f6, 0x00e6,
++	0x0804, 0x265a, 0x785b, 0x0000, 0x70a3, 0x000e, 0x2009, 0x0100,
++	0x0016, 0x7094, 0xa06d, 0x0118, 0x7097, 0x0000, 0x0028, 0x70a7,
++	0x0000, 0x080c, 0x1ef1, 0x0128, 0x70a0, 0x6826, 0x080c, 0x4432,
++	0x0cb0, 0x001e, 0x0076, 0x0156, 0x00c6, 0x00d6, 0x20a9, 0x0020,
++	0x3238, 0xa7bc, 0x0600, 0x0120, 0x2061, 0xfc20, 0xc7fc, 0x0018,
++	0x2061, 0xfd40, 0xc7fd, 0x6000, 0xa105, 0x6002, 0x601c, 0xa06d,
++	0x0140, 0x6800, 0x601e, 0x080c, 0x1ca6, 0x6008, 0x8000, 0x600a,
++	0x0ca8, 0x6018, 0xa06d, 0x0128, 0x6800, 0x601a, 0x080c, 0x1ca6,
++	0x0cc0, 0xace0, 0x0009, 0x0f04, 0x4356, 0x0c28, 0x7090, 0xa084,
++	0x8000, 0x0110, 0x080c, 0x44ac, 0x00de, 0x00ce, 0x015e, 0x007e,
++	0x0005, 0x6804, 0xa084, 0x000f, 0x0002, 0x4375, 0x4375, 0x4375,
++	0x4375, 0x4375, 0x4375, 0x4377, 0x4386, 0x4375, 0x4375, 0x4375,
++	0x4375, 0x4375, 0x4392, 0x4375, 0x4377, 0x080c, 0x297f, 0x0006,
++	0x7830, 0xd0b4, 0x0128, 0x784b, 0x0004, 0x7848, 0xd094, 0x1de8,
++	0x000e, 0x080c, 0x4f11, 0x080c, 0x1ca6, 0x0080, 0x6827, 0x000b,
++	0x0006, 0x7830, 0xd0b4, 0x0128, 0x784b, 0x0004, 0x7848, 0xd094,
++	0x1de8, 0x000e, 0x080c, 0x4f11, 0x080c, 0x4432, 0x0005, 0x00f6,
++	0x6814, 0xd0fc, 0x1178, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x0128,
++	0x2079, 0x0100, 0x1104, 0x43c8, 0x0048, 0x2079, 0x0200, 0x1304,
++	0x43c8, 0x0020, 0x2079, 0x0100, 0x1104, 0x43c8, 0x7830, 0xa084,
++	0x00c0, 0x11b0, 0x00d6, 0x080c, 0x522f, 0x2d00, 0x682e, 0x2009,
++	0x0004, 0x2001, 0x0000, 0x6827, 0x0084, 0x080c, 0x51da, 0x080c,
++	0x4432, 0x00de, 0x70a8, 0xa080, 0x00bf, 0x781a, 0x0804, 0x4408,
++	0x7948, 0x6814, 0xd0fc, 0x1158, 0x2001, 0xb342, 0x2004, 0xd0ec,
++	0x0118, 0x1104, 0x43db, 0x0028, 0x1304, 0x43db, 0x0010, 0x1104,
++	0x43db, 0x794a, 0x08b8, 0x7948, 0x7828, 0x0006, 0xa084, 0xf000,
++	0xa086, 0x1000, 0x000e, 0x1da8, 0xd0b4, 0x1d98, 0xd0ac, 0x0118,
++	0xa185, 0x0004, 0x0010, 0xa185, 0x000c, 0x784a, 0x789b, 0x000e,
++	0x78ab, 0x0002, 0x7858, 0xa084, 0x00ff, 0xa085, 0x0400, 0x785a,
++	0x70a8, 0xa080, 0x00a1, 0x781a, 0x6827, 0x0284, 0x682c, 0x6836,
++	0x6830, 0x683a, 0x2009, 0x0004, 0x2001, 0x0000, 0x080c, 0x51da,
++	0x00fe, 0x0005, 0x00d6, 0x6b14, 0x080c, 0x1f5a, 0x0128, 0x2068,
++	0x6827, 0x0002, 0x00f9, 0x0cc0, 0x00de, 0x0005, 0x00d6, 0x6b14,
++	0x6c28, 0xa4a4, 0x00ff, 0x080c, 0x1efb, 0x0120, 0x2068, 0x6827,
++	0x0002, 0x0081, 0x00de, 0x0005, 0x00d6, 0x6814, 0xa09c, 0x00ff,
++	0x080c, 0x1f2c, 0x0128, 0x2068, 0x6827, 0x0002, 0x0019, 0x0cc0,
++	0x00de, 0x0005, 0x00c6, 0x6914, 0x6814, 0x080c, 0x449c, 0x6904,
++	0xa18c, 0x00ff, 0xa186, 0x0006, 0x0170, 0xa186, 0x000d, 0x0550,
++	0xa186, 0x0017, 0x1120, 0x080c, 0x1ca6, 0x00ce, 0x0005, 0x080c,
++	0x2087, 0x00ce, 0x0005, 0x6004, 0x8001, 0x02b0, 0x6006, 0x2009,
++	0x0000, 0xa684, 0x0001, 0x1110, 0xa18d, 0x8000, 0xa684, 0x0004,
++	0x0110, 0xa18d, 0x0002, 0x691e, 0x6823, 0x0000, 0x711c, 0x810f,
++	0x6818, 0xa105, 0x681a, 0x0c18, 0x6100, 0xa184, 0x0001, 0x09d8,
++	0x080c, 0x297f, 0x6018, 0xa005, 0x1148, 0x6008, 0x8001, 0x0230,
++	0x600a, 0x601c, 0x6802, 0x2d00, 0x601e, 0x00a0, 0xac88, 0x0006,
++	0x2104, 0xa005, 0x0110, 0x2008, 0x0cd8, 0x6802, 0x2d0a, 0x6008,
++	0x8001, 0x0230, 0x600a, 0x6018, 0x2068, 0x6800, 0x601a, 0x0c48,
++	0x00ce, 0x0005, 0x0156, 0x0136, 0x0146, 0x00c6, 0x00d6, 0x080c,
++	0x1c85, 0x2da0, 0x013e, 0x20a9, 0x0037, 0x53a3, 0x00ce, 0x014e,
++	0x013e, 0x015e, 0x0804, 0x4447, 0xd0fc, 0x1118, 0x2061, 0xfc20,
++	0x0010, 0x2061, 0xfd40, 0xa184, 0x001f, 0xac60, 0x8003, 0x8003,
++	0x8003, 0xac00, 0x2060, 0x0005, 0xd7fc, 0x1168, 0x2019, 0xb393,
++	0x2001, 0xb342, 0x2004, 0xd0ec, 0x0118, 0x2021, 0x0102, 0x0038,
++	0x2021, 0x0202, 0x0020, 0x2019, 0xb3d3, 0x2021, 0x0102, 0x2304,
++	0xa085, 0x0001, 0x201a, 0x2404, 0xa085, 0x0001, 0x2022, 0x0005,
++	0xd7fc, 0x1168, 0x2019, 0xb393, 0x2001, 0xb342, 0x2004, 0xd0ec,
++	0x0118, 0x2021, 0x0102, 0x0038, 0x2021, 0x0202, 0x0020, 0x2019,
++	0xb3d3, 0x2021, 0x0102, 0x2304, 0xa084, 0xfffe, 0x201a, 0x2404,
++	0xa084, 0xfffe, 0x2022, 0x0005, 0x7990, 0xa18c, 0xfff8, 0x7992,
++	0x70a8, 0xa080, 0x00f1, 0x781a, 0x0804, 0x29df, 0x7097, 0x0000,
++	0x7003, 0x0000, 0x704b, 0x0001, 0x7043, 0x0000, 0x080c, 0x1ef1,
++	0x0528, 0x70ef, 0x0000, 0x68cc, 0x2060, 0x6100, 0xa184, 0x0300,
++	0x0150, 0x6827, 0x000e, 0xa084, 0x0200, 0x0110, 0x6827, 0x0017,
++	0x080c, 0x4432, 0x0c18, 0x7000, 0xa086, 0x0007, 0x1904, 0x4597,
++	0x6910, 0x70b0, 0xa106, 0x0120, 0x2d60, 0x080c, 0x1ec4, 0x0005,
++	0x2d00, 0x7096, 0xad80, 0x000f, 0x7042, 0x0050, 0x7010, 0xa005,
++	0x1128, 0x7048, 0xa086, 0x0001, 0x0904, 0x29f8, 0x0804, 0x29df,
++	0xa036, 0x691c, 0xa184, 0x0002, 0x0110, 0xa6b5, 0x0004, 0xa184,
++	0x00c0, 0x8003, 0x8003, 0x8007, 0xa080, 0x4646, 0x2005, 0xa635,
++	0x080c, 0x2ae3, 0x6820, 0xa084, 0x0400, 0x0150, 0x789b, 0x0018,
++	0x78ab, 0x0003, 0x789b, 0x0081, 0x78ab, 0x0001, 0xa6b5, 0x5000,
++	0x6820, 0xa084, 0x8000, 0x0140, 0xa6b5, 0x0400, 0x789b, 0x000e,
++	0x6824, 0x8007, 0x78aa, 0x00d8, 0x681c, 0xd0fc, 0x1140, 0xa6b5,
++	0x0800, 0x6820, 0xd0c4, 0x0198, 0xa6b5, 0x4000, 0x0080, 0x6820,
++	0xd0c4, 0x0118, 0xa6b5, 0x4000, 0x0050, 0x789b, 0x0018, 0x78ab,
++	0x0002, 0x789b, 0x0081, 0x78ab, 0x0001, 0xa6b5, 0x1000, 0xa684,
++	0x0200, 0x0508, 0x00c6, 0x080c, 0x4fc6, 0x6028, 0xd08c, 0x0138,
++	0x6020, 0x00ce, 0x6930, 0x6a2c, 0x080c, 0x52b7, 0x0028, 0x00ce,
++	0x682c, 0x78d2, 0x6830, 0x78d6, 0xa684, 0x0100, 0x0150, 0x682c,
++	0xa084, 0x0001, 0x0130, 0x7888, 0xa084, 0x0040, 0x0110, 0xa6b5,
++	0x8000, 0x080c, 0x5207, 0x7e5a, 0x6eb6, 0x0804, 0x524e, 0x080c,
++	0x40a8, 0x1904, 0x4640, 0x2041, 0x0001, 0x2031, 0x1000, 0x080c,
++	0x2ae3, 0x789b, 0x0018, 0x6814, 0xa084, 0x001f, 0xa085, 0x0080,
++	0x78aa, 0x691c, 0xa184, 0x0002, 0x0140, 0xa6b5, 0x0004, 0x78ab,
++	0x0020, 0x6828, 0x78aa, 0xa8c0, 0x0002, 0x681c, 0xd0f4, 0x0128,
++	0x2c50, 0x080c, 0x418d, 0x080c, 0x5044, 0x6820, 0xa084, 0x8000,
++	0x0140, 0xa6b5, 0x0400, 0x789b, 0x000e, 0x6824, 0x8007, 0x78aa,
++	0x0060, 0x681c, 0xa084, 0x8000, 0x1140, 0xa6b5, 0x0800, 0x6820,
++	0xa084, 0x0100, 0x0110, 0xa6b5, 0x4000, 0x681c, 0xa084, 0x00c0,
++	0x8003, 0x8003, 0x8007, 0xa080, 0x4646, 0x2005, 0xa635, 0xa684,
++	0x0100, 0x0150, 0x682c, 0xa084, 0x0001, 0x0130, 0x7888, 0xa084,
++	0x0040, 0x0110, 0xa6b5, 0x8000, 0x789b, 0x007e, 0x7eae, 0x6eb6,
++	0x6814, 0xc0fc, 0x8007, 0x78aa, 0x7882, 0x2810, 0x7aaa, 0x7830,
++	0xa084, 0x00c0, 0x1904, 0x4640, 0x6914, 0xd1fc, 0x1158, 0x2001,
++	0xb342, 0x2004, 0xd0ec, 0x0118, 0x0104, 0x4640, 0x0028, 0x0304,
++	0x4640, 0x0010, 0x0104, 0x4640, 0x0126, 0x00d6, 0x00c6, 0x70f0,
++	0xa084, 0x2e00, 0x2090, 0x00ce, 0x00de, 0x012e, 0xa684, 0x0200,
++	0x01a8, 0x00c6, 0x080c, 0x4fc6, 0x6028, 0xd08c, 0x0140, 0x6020,
++	0xa005, 0x0128, 0x6930, 0x6a2c, 0x080c, 0x52b7, 0x0020, 0x682c,
++	0x78d2, 0x6830, 0x78d6, 0x00ce, 0x080c, 0x5207, 0x70a8, 0xa080,
++	0x00fc, 0x781a, 0x080c, 0x40d4, 0x2d00, 0x7096, 0x7052, 0x6810,
++	0x70b2, 0x7003, 0x0007, 0xad80, 0x000f, 0x7042, 0x0804, 0x29df,
++	0x080c, 0x1eb2, 0x080c, 0x40d4, 0x0804, 0x29df, 0x0000, 0x0300,
++	0x0200, 0x0000, 0x080c, 0x297f, 0x2300, 0x0002, 0x4651, 0x4651,
++	0x4658, 0x080c, 0x297f, 0x71a8, 0xa188, 0x00a1, 0x791a, 0x0005,
++	0x080c, 0x5223, 0x6924, 0xa184, 0x00ff, 0xa086, 0x000a, 0x0148,
++	0xa184, 0xff00, 0xa085, 0x000a, 0x6826, 0x080c, 0x1eb2, 0x0804,
++	0x44ee, 0x2001, 0x000a, 0x080c, 0x5184, 0x0804, 0x44ee, 0xa282,
++	0x0005, 0x0310, 0x080c, 0x297f, 0x7000, 0xa084, 0x000f, 0x190c,
++	0x41a1, 0x080c, 0x1c85, 0x11b8, 0x2069, 0xffff, 0xa684, 0x0004,
++	0x0118, 0x2001, 0x2800, 0x0010, 0x2001, 0x0800, 0x71a8, 0xa188,
++	0x00a1, 0x789b, 0x000e, 0x8007, 0x78aa, 0x2031, 0x0400, 0x7e5a,
++	0x791a, 0x0804, 0x29df, 0x6807, 0x0106, 0x680b, 0x0000, 0x689f,
++	0x0000, 0x6827, 0x0000, 0xa386, 0x0002, 0x1180, 0xa286, 0x0002,
++	0x1168, 0x78a0, 0xa005, 0x1150, 0xd4fc, 0x1140, 0x78e4, 0xa084,
++	0x0008, 0x0120, 0xa6b5, 0x0008, 0x2019, 0x0000, 0x080c, 0x4b0c,
++	0x2d00, 0x7096, 0x7052, 0x7003, 0x0007, 0x7043, 0x0000, 0x6020,
++	0xa084, 0x000f, 0x680e, 0x6824, 0xa084, 0x0080, 0x0120, 0x080c,
++	0x4bc9, 0x0804, 0x29df, 0x2300, 0x0002, 0x46c8, 0x473d, 0x4754,
++	0x2200, 0x0002, 0x46cf, 0x46de, 0x4700, 0x470a, 0x472b, 0x2029,
++	0x0001, 0xa026, 0x2011, 0x0000, 0x080c, 0x4ce3, 0x0002, 0x46dc,
++	0x29df, 0x44ee, 0x46dc, 0x46dc, 0x080c, 0x297f, 0x7990, 0xa18c,
++	0x0007, 0x1110, 0x2009, 0x0008, 0x2011, 0x0001, 0xa684, 0x0004,
++	0x0110, 0x2011, 0x0003, 0x2220, 0xa12a, 0x2011, 0x0001, 0x080c,
++	0x4ce3, 0x0002, 0x46f7, 0x29df, 0x44ee, 0x46fe, 0x46f9, 0x0804,
++	0x526b, 0x709f, 0x46fd, 0x0804, 0x29df, 0x0cc8, 0x080c, 0x297f,
++	0xa684, 0x0010, 0x0128, 0x080c, 0x4b94, 0x0110, 0x0804, 0x29df,
++	0x0804, 0x4c05, 0x6000, 0xa084, 0x0002, 0x01c0, 0x70a8, 0xa080,
++	0x008f, 0x781a, 0x00d6, 0x080c, 0x522f, 0x2d00, 0x682e, 0x6827,
++	0x0000, 0x080c, 0x4432, 0x00de, 0x080c, 0x1ca6, 0x7003, 0x0000,
++	0x7043, 0x0000, 0x7053, 0x0000, 0x0804, 0x44ee, 0xa684, 0x0004,
++	0x1110, 0x0804, 0x526b, 0x6000, 0xa084, 0x0004, 0x1160, 0x6000,
++	0xa084, 0x0001, 0x0140, 0x709f, 0x473b, 0x2001, 0x0007, 0x080c,
++	0x517c, 0x0804, 0x5271, 0x0804, 0x526b, 0x2200, 0x0002, 0x4744,
++	0x4746, 0x4744, 0x4744, 0x4744, 0x080c, 0x297f, 0x709b, 0x474a,
++	0x0804, 0x5279, 0x78e4, 0xa084, 0x0008, 0x1dc0, 0x080c, 0x516d,
++	0x709f, 0x4752, 0x0804, 0x526b, 0x2200, 0x0002, 0x475b, 0x475d,
++	0x475d, 0x475b, 0x475b, 0x080c, 0x297f, 0x78e4, 0xa084, 0x0008,
++	0x0178, 0x709b, 0x4765, 0x0804, 0x5279, 0x2011, 0x0004, 0x080c,
++	0x4cdd, 0x0002, 0x477a, 0x29df, 0x44ee, 0x477a, 0x4784, 0x4788,
++	0x690c, 0x81ff, 0x0138, 0x8109, 0x1120, 0x6827, 0x000f, 0x0804,
++	0x4818, 0x690e, 0x709f, 0x4782, 0x2001, 0x0003, 0x080c, 0x517c,
++	0x0804, 0x5271, 0x0804, 0x526b, 0x709f, 0x477a, 0x0804, 0x29df,
++	0x709f, 0x478c, 0x0804, 0x29df, 0x0ca8, 0xa282, 0x0003, 0x0310,
++	0x080c, 0x297f, 0xa386, 0x0002, 0x1180, 0xa286, 0x0002, 0x1190,
++	0x78a0, 0xa005, 0x1178, 0xd4fc, 0x1168, 0x78e4, 0xa084, 0x0008,
++	0x0120, 0xa6b5, 0x0008, 0x2019, 0x0000, 0xa684, 0x0008, 0x0110,
++	0x080c, 0x4b72, 0x6810, 0x70b2, 0x7003, 0x0007, 0x2300, 0x0002,
++	0x47b3, 0x47db, 0x47e2, 0x2200, 0x0002, 0x47ba, 0x47b8, 0x47d1,
++	0x080c, 0x297f, 0x7990, 0xa1ac, 0x0007, 0xa026, 0x2011, 0x0001,
++	0x080c, 0x4ce3, 0x0002, 0x47c8, 0x29df, 0x44ee, 0x47cf, 0x47ca,
++	0x0804, 0x526b, 0x709f, 0x47ce, 0x0804, 0x29df, 0x0cc8, 0x080c,
++	0x297f, 0xa684, 0x0010, 0x0128, 0x080c, 0x4b94, 0x0110, 0x0804,
++	0x29df, 0x0804, 0x4c05, 0x2200, 0x0002, 0x47e0, 0x47e0, 0x47e0,
++	0x080c, 0x297f, 0x2200, 0x0002, 0x47e7, 0x47e9, 0x47e9, 0x080c,
++	0x297f, 0x78e4, 0xa084, 0x0008, 0x0178, 0x709b, 0x47f1, 0x0804,
++	0x5279, 0x2011, 0x0004, 0x080c, 0x4cdd, 0x0002, 0x4805, 0x29df,
++	0x44ee, 0x4805, 0x480f, 0x4813, 0x690c, 0x81ff, 0x0130, 0x8109,
++	0x1118, 0x6827, 0x000f, 0x00a0, 0x690e, 0x709f, 0x480d, 0x2001,
++	0x0003, 0x080c, 0x517c, 0x0804, 0x5271, 0x0804, 0x526b, 0x709f,
++	0x4805, 0x0804, 0x29df, 0x709f, 0x4817, 0x0804, 0x29df, 0x0ca8,
++	0x70a8, 0xa080, 0x008f, 0x781a, 0x00d6, 0x6824, 0x0006, 0x080c,
++	0x522f, 0x000e, 0x6826, 0x2d00, 0x682e, 0x080c, 0x4432, 0x00de,
++	0x080c, 0x5184, 0x7003, 0x0000, 0x7043, 0x0000, 0x7053, 0x0000,
++	0x0804, 0x44ee, 0x2300, 0x0002, 0x4839, 0x483b, 0x4837, 0x080c,
++	0x297f, 0x7098, 0x0807, 0x7098, 0x0807, 0xa282, 0x0002, 0x0310,
++	0x080c, 0x297f, 0xa684, 0x0200, 0x0130, 0x080c, 0x5222, 0x080c,
++	0x4cca, 0x080c, 0x5223, 0x2300, 0x0002, 0x4850, 0x487e, 0x48de,
++	0xad86, 0xffff, 0x1108, 0x0005, 0xa286, 0x0001, 0x0110, 0x080c,
++	0x297f, 0xa684, 0x0200, 0x0120, 0x080c, 0x5222, 0x080c, 0x5223,
++	0x6924, 0xa184, 0x00ff, 0xa086, 0x000a, 0x1118, 0xa184, 0xff00,
++	0x6826, 0x2001, 0x0001, 0x080c, 0x5184, 0x78b8, 0x8007, 0xa084,
++	0x007f, 0x0140, 0x7848, 0xa085, 0x0008, 0x784a, 0x7848, 0xa084,
++	0x0008, 0x1de0, 0x7003, 0x0000, 0x0804, 0x44ee, 0x2200, 0x0002,
++	0x4882, 0x48b1, 0x709b, 0x4886, 0x0804, 0x5279, 0x2011, 0x000d,
++	0x080c, 0x4cdd, 0x0002, 0x4892, 0x29df, 0x44ee, 0x489a, 0x48a2,
++	0x48a7, 0x48a9, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
++	0x0804, 0x524e, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
++	0x0804, 0x524e, 0x709f, 0x48a6, 0x0804, 0x29df, 0x0c58, 0x080c,
++	0x297f, 0x709f, 0x48ad, 0x0804, 0x29df, 0x080c, 0x527f, 0x0804,
++	0x29df, 0x709b, 0x48b5, 0x0804, 0x5279, 0x2011, 0x0012, 0x080c,
++	0x4cdd, 0x0002, 0x48c0, 0x29df, 0x44ee, 0x48cc, 0x48d4, 0x48d9,
++	0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x70a8, 0xa080,
++	0x00bf, 0x781a, 0x0804, 0x29df, 0xa6b4, 0x00ff, 0xa6b5, 0x0400,
++	0x6eb6, 0x7e5a, 0x0804, 0x524e, 0x709f, 0x48d8, 0x0804, 0x29df,
++	0x0c38, 0x709f, 0x48dd, 0x0804, 0x29df, 0x0c70, 0xa286, 0x0001,
++	0x0110, 0x080c, 0x297f, 0x709b, 0x48e7, 0x0804, 0x5279, 0x2011,
++	0x0015, 0x080c, 0x4cdd, 0x0002, 0x48f1, 0x29df, 0x44ee, 0x48ff,
++	0x490b, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x783b,
++	0x1301, 0x70a8, 0xa080, 0x00cb, 0x781a, 0x0804, 0x29df, 0xa6b4,
++	0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x70a8, 0xa080, 0x00bf,
++	0x781a, 0x0804, 0x29df, 0x709f, 0x490f, 0x0804, 0x29df, 0x0c08,
++	0xa282, 0x0003, 0x0310, 0x080c, 0x297f, 0x2300, 0x0002, 0x491a,
++	0x4956, 0x49b5, 0xa286, 0x0001, 0x0110, 0x080c, 0x297f, 0x6804,
++	0xa084, 0x00ff, 0xa086, 0x0006, 0x1130, 0x080c, 0x4432, 0x7003,
++	0x0000, 0x0804, 0x44ee, 0x683b, 0x0000, 0x6837, 0x0000, 0xa684,
++	0x0200, 0x0130, 0x080c, 0x5222, 0x080c, 0x4cca, 0x080c, 0x5223,
++	0x6924, 0xa184, 0x00ff, 0xa086, 0x000a, 0x1118, 0xa184, 0xff00,
++	0x6826, 0x2001, 0x0001, 0x080c, 0x5184, 0x78b8, 0x8007, 0xa084,
++	0x007f, 0x0140, 0x7848, 0xa085, 0x0008, 0x784a, 0x7848, 0xa084,
++	0x0008, 0x1de0, 0x7003, 0x0000, 0x0804, 0x44ee, 0xa684, 0x0200,
++	0x0120, 0x080c, 0x4cca, 0x080c, 0x5223, 0x2200, 0x0002, 0x4961,
++	0x4992, 0x709b, 0x4965, 0x0804, 0x5279, 0x2011, 0x000d, 0x080c,
++	0x4cdd, 0x0002, 0x4971, 0x29df, 0x44ee, 0x4979, 0x4981, 0x4986,
++	0x4988, 0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0804,
++	0x524e, 0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0804,
++	0x524e, 0x709f, 0x4985, 0x0804, 0x29df, 0x0c58, 0x080c, 0x297f,
++	0x709f, 0x498e, 0x080c, 0x5223, 0x0804, 0x29df, 0x080c, 0x527f,
++	0x0804, 0x29df, 0x709b, 0x4996, 0x0804, 0x5279, 0x2011, 0x0005,
++	0x080c, 0x4cdd, 0x0002, 0x49a0, 0x29df, 0x44ee, 0x49a8, 0x49b0,
++	0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0804, 0x524e,
++	0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0804, 0x524e,
++	0x709f, 0x49b4, 0x0804, 0x29df, 0x0c58, 0xa286, 0x0001, 0x0110,
++	0x080c, 0x297f, 0x709b, 0x49be, 0x0804, 0x5279, 0x2011, 0x0006,
++	0x080c, 0x4cdd, 0x0002, 0x49c8, 0x29df, 0x44ee, 0x49ce, 0x49d8,
++	0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0804, 0x524e, 0xa6b4, 0x00ff,
++	0xa6b5, 0x0800, 0x6eb6, 0xa6b5, 0x4000, 0x7e5a, 0x0804, 0x524e,
++	0x709f, 0x49dc, 0x0804, 0x29df, 0x0c58, 0x2300, 0x0002, 0x49e4,
++	0x49e2, 0x49e2, 0x080c, 0x297f, 0x080c, 0x297f, 0x2300, 0x719c,
++	0xa005, 0x0817, 0x6810, 0x70b2, 0xa282, 0x0003, 0x0310, 0x080c,
++	0x297f, 0x2300, 0x0002, 0x49f6, 0x4a03, 0x4a21, 0xa684, 0x0200,
++	0x0120, 0x080c, 0x5222, 0x080c, 0x5223, 0x2001, 0x0001, 0x080c,
++	0x5184, 0x0804, 0x29df, 0xa286, 0x0002, 0x0120, 0x82ff, 0x0110,
++	0x080c, 0x297f, 0x709b, 0x4a0e, 0x0804, 0x5279, 0x2011, 0x0018,
++	0x080c, 0x4cdd, 0x0002, 0x4a18, 0x29df, 0x44ee, 0x4a1a, 0x4a1c,
++	0x0804, 0x524e, 0x0804, 0x524e, 0x709f, 0x4a20, 0x0804, 0x29df,
++	0x0cb8, 0x2200, 0x0002, 0x4a25, 0x4a3c, 0x709b, 0x4a29, 0x0804,
++	0x5279, 0x2011, 0x0017, 0x080c, 0x4cdd, 0x0002, 0x4a33, 0x29df,
++	0x44ee, 0x4a35, 0x4a37, 0x0804, 0x524e, 0x0804, 0x524e, 0x709f,
++	0x4a3b, 0x0804, 0x29df, 0x0cb8, 0xd4fc, 0x1904, 0x4abb, 0xa684,
++	0x0100, 0x0120, 0x080c, 0x5222, 0x080c, 0x4cca, 0x00c6, 0x080c,
++	0x4fc6, 0x6028, 0xd08c, 0x0190, 0x612c, 0x7adc, 0x080c, 0x20dd,
++	0x2110, 0x2008, 0x6024, 0xa210, 0xa189, 0x0000, 0x78d8, 0xa210,
++	0xa189, 0x0000, 0x602c, 0x080c, 0x52b7, 0x0020, 0x78d8, 0x78d2,
++	0x78dc, 0x78d6, 0x00ce, 0xa6b4, 0xefff, 0x7e5a, 0x709b, 0x4a6a,
++	0x0804, 0x5279, 0x2011, 0x000d, 0x080c, 0x4cdd, 0x0002, 0x4a76,
++	0x29df, 0x44ee, 0x4a76, 0x4aaa, 0x4aaf, 0x4ab1, 0x78d8, 0x79dc,
++	0xa105, 0x1168, 0x78b8, 0x8007, 0xa084, 0x007f, 0x1140, 0x70a7,
++	0x0000, 0x7858, 0xa084, 0xfdff, 0x785a, 0x0804, 0x524e, 0xa684,
++	0x0100, 0x01f0, 0x080c, 0x5223, 0x080c, 0x51cf, 0x0026, 0x0036,
++	0x00c6, 0x080c, 0x4fc6, 0x6028, 0xd08c, 0x0138, 0x6020, 0x00ce,
++	0x6930, 0x6a2c, 0x080c, 0x52b7, 0x0028, 0x00ce, 0x682c, 0x78d2,
++	0x6830, 0x78d6, 0x70a7, 0x0000, 0x001e, 0x000e, 0x080c, 0x5622,
++	0x0804, 0x524e, 0x709f, 0x4aae, 0x0804, 0x29df, 0x0838, 0x080c,
++	0x297f, 0x709f, 0x4ab7, 0x080c, 0x5223, 0x0804, 0x29df, 0x080c,
++	0x527f, 0x0804, 0x29df, 0x080c, 0x5223, 0x6918, 0xd1a4, 0x0140,
++	0x6827, 0x000f, 0x080c, 0x5184, 0x080c, 0x5223, 0x0804, 0x29df,
++	0x709f, 0x4ad0, 0x2001, 0x0003, 0x080c, 0x517c, 0x0804, 0x5271,
++	0x080c, 0x5207, 0x682c, 0x78d2, 0x6830, 0x78d6, 0x0804, 0x524e,
++	0xa282, 0x0002, 0x0310, 0x080c, 0x297f, 0x2300, 0x0002, 0x4ae2,
++	0x4af2, 0x4af4, 0xa286, 0x0001, 0x0110, 0x080c, 0x297f, 0x00c6,
++	0x080c, 0x4fc6, 0x6224, 0x2009, 0x0000, 0x602c, 0x080c, 0x52b7,
++	0x0804, 0x524e, 0x080c, 0x297f, 0x080c, 0x297f, 0x0026, 0x002e,
++	0xa684, 0x0200, 0x0130, 0x080c, 0x5222, 0x080c, 0x4cca, 0x080c,
++	0x5223, 0x2300, 0x0002, 0x4b06, 0x4b08, 0x4b0a, 0x0804, 0x4850,
++	0x0804, 0x487e, 0x0804, 0x48de, 0x70ac, 0x6812, 0x70b2, 0x8000,
++	0x70ae, 0x681b, 0x0000, 0xa684, 0x0008, 0x01c0, 0x0156, 0x0136,
++	0x0146, 0x7890, 0x8004, 0x8004, 0x8004, 0x8004, 0xa084, 0x000f,
++	0x681a, 0x80ac, 0x789b, 0x0000, 0xaf80, 0x002b, 0x2098, 0xad80,
++	0x000b, 0x20a0, 0x53a5, 0x014e, 0x013e, 0x015e, 0xa6c4, 0x0f00,
++	0xa684, 0x0002, 0x1140, 0x692c, 0x810d, 0x810d, 0x810d, 0xa184,
++	0x0007, 0x2008, 0x0090, 0x789b, 0x0090, 0x79ac, 0xa184, 0x0020,
++	0x0160, 0x0016, 0x2009, 0x0005, 0x2001, 0x3d00, 0x080c, 0x51da,
++	0x6824, 0xa085, 0x003b, 0x6826, 0x001e, 0xa184, 0x001f, 0xa805,
++	0x0016, 0x3208, 0xa18c, 0x0600, 0x0110, 0xc0fc, 0x0008, 0xc0fd,
++	0x001e, 0x6816, 0x080c, 0x449c, 0x68ce, 0xa684, 0x0004, 0x0130,
++	0xa18c, 0xff00, 0x78a8, 0xa084, 0x00ff, 0xa105, 0x682a, 0xa6b4,
++	0x00ff, 0x6000, 0xa084, 0x0008, 0x0110, 0xa6b5, 0x4000, 0x6eb6,
++	0x7e5a, 0x0005, 0x0156, 0x0136, 0x0146, 0x6918, 0x7890, 0x8004,
++	0x8004, 0x8004, 0x8004, 0xa084, 0x000f, 0x0006, 0xa100, 0x681a,
++	0x000e, 0x8000, 0x8004, 0x0160, 0x20a8, 0x8104, 0xa080, 0x000b,
++	0xad00, 0x20a0, 0x789b, 0x0000, 0xaf80, 0x002b, 0x2098, 0x53a5,
++	0x014e, 0x013e, 0x015e, 0x0005, 0x682c, 0xd0b4, 0x1140, 0xd0ac,
++	0x1118, 0x2011, 0x0010, 0x0048, 0x2011, 0x000c, 0x0030, 0xa084,
++	0x0020, 0x1110, 0x620c, 0x0008, 0x6210, 0x6b18, 0x2300, 0xa202,
++	0x01c0, 0x2018, 0xa382, 0x000e, 0x0220, 0x0118, 0x2019, 0x000e,
++	0x0020, 0x7858, 0xa084, 0xffef, 0x785a, 0x783b, 0x1b01, 0x7893,
++	0x0000, 0x7ba2, 0x70a8, 0xa080, 0x009e, 0x781a, 0xa085, 0x0001,
++	0x0005, 0x7858, 0xa084, 0xffef, 0x785a, 0x7893, 0x0000, 0xa006,
++	0x0005, 0x6904, 0xa18c, 0x00ff, 0xa196, 0x0007, 0x0128, 0xa196,
++	0x000f, 0x0110, 0x6807, 0x0117, 0x6914, 0x6814, 0x080c, 0x449c,
++	0x6100, 0x8104, 0x1290, 0x601c, 0xa005, 0x0118, 0x2001, 0x0800,
++	0x0070, 0x00d6, 0x6824, 0x0006, 0x080c, 0x522f, 0x000e, 0x6826,
++	0x2d00, 0x682e, 0x080c, 0x4432, 0x00de, 0x2001, 0x0200, 0x6924,
++	0xa18c, 0x00ff, 0xa10d, 0x6926, 0x8007, 0x789b, 0x000e, 0x78aa,
++	0x6820, 0xa085, 0x8000, 0x6822, 0x2031, 0x0400, 0x6eb6, 0x7e5a,
++	0x71a8, 0xa188, 0x00a1, 0x791a, 0x0005, 0x080c, 0x2ae3, 0x6814,
++	0x2040, 0xa684, 0x0002, 0x1168, 0x692c, 0x810d, 0x810d, 0x810d,
++	0xa184, 0x0007, 0x2008, 0xa805, 0x6816, 0x080c, 0x449c, 0x68ce,
++	0x0020, 0x6914, 0x6814, 0x080c, 0x449c, 0x6100, 0x8104, 0x1a04,
++	0x4c70, 0xa184, 0x0300, 0x0118, 0x6807, 0x0117, 0x00d0, 0x6004,
++	0xa005, 0x1500, 0x6807, 0x0117, 0x601c, 0xa005, 0x1150, 0x00d6,
++	0x080c, 0x522f, 0x6827, 0x0034, 0x2d00, 0x682e, 0x080c, 0x4432,
++	0x00de, 0xa684, 0x0004, 0x0128, 0x2031, 0x0400, 0x2001, 0x2800,
++	0x0020, 0x2031, 0x0400, 0x2001, 0x0800, 0x71a8, 0xa188, 0x00a1,
++	0x0804, 0x4ca5, 0x6018, 0xa005, 0x1d60, 0x601c, 0xa005, 0x1d48,
++	0x689f, 0x0000, 0x6827, 0x003d, 0xa684, 0x0001, 0x0904, 0x4cb3,
++	0xd694, 0x1180, 0x6100, 0xd1d4, 0x0168, 0x692c, 0xa18c, 0x00ff,
++	0x0904, 0x4cb3, 0xa186, 0x0003, 0x0904, 0x4cb3, 0xa186, 0x0012,
++	0x0904, 0x4cb3, 0xa6b5, 0x0800, 0x71a8, 0xa188, 0x00c3, 0x04f0,
++	0x6807, 0x0117, 0x2031, 0x0400, 0x692c, 0xa18c, 0x00ff, 0xa186,
++	0x0012, 0x1128, 0x2001, 0x4cc0, 0x2009, 0x0001, 0x0070, 0xa186,
++	0x0003, 0x1128, 0x2001, 0x4cc1, 0x2009, 0x0012, 0x0030, 0x2001,
++	0x0200, 0x71a8, 0xa188, 0x00a1, 0x00c0, 0x6a34, 0xa29d, 0x0000,
++	0x1110, 0xa006, 0x0cb0, 0x0006, 0x2100, 0xa21a, 0x000e, 0x1208,
++	0x2208, 0x080c, 0x51f4, 0x78a3, 0x0000, 0x681c, 0xa085, 0x0040,
++	0x681e, 0x71a8, 0xa188, 0x00f3, 0xa006, 0x6826, 0x8007, 0x789b,
++	0x000e, 0x78aa, 0x6820, 0xa085, 0x8000, 0x6822, 0x6eb6, 0x7e5a,
++	0x791a, 0x0804, 0x29df, 0x6eb6, 0x080c, 0x4432, 0x6810, 0x70b2,
++	0x7003, 0x0007, 0x7097, 0x0000, 0x7053, 0x0000, 0x0804, 0x29df,
++	0x0023, 0x0070, 0x0005, 0x0000, 0x0a00, 0x0000, 0x0000, 0x0025,
++	0x0000, 0x0000, 0x683b, 0x0000, 0x6837, 0x0000, 0xa684, 0x0200,
++	0x0158, 0x78b8, 0x8007, 0xa08c, 0x007f, 0x78d8, 0xa100, 0x6836,
++	0x78dc, 0xa081, 0x0000, 0x683a, 0x0005, 0x7990, 0x810f, 0xa5ac,
++	0x0007, 0x2021, 0x0000, 0xa480, 0x0090, 0x789a, 0x79a8, 0xa18c,
++	0x00ff, 0xa184, 0x0080, 0x11e0, 0xa182, 0x0020, 0x16b0, 0xa182,
++	0x0012, 0x1a04, 0x516d, 0x2100, 0x000b, 0x0005, 0x516d, 0x4f27,
++	0x516d, 0x516d, 0x4d31, 0x4d34, 0x4d78, 0x4db3, 0x4de6, 0x4de9,
++	0x516d, 0x516d, 0x4d98, 0x4e54, 0x4e8c, 0x516d, 0x516d, 0x4eb2,
++	0xa184, 0x0020, 0x1904, 0x4ee6, 0xa18c, 0x001f, 0x6814, 0xa084,
++	0x001f, 0xa106, 0x0178, 0x70a8, 0xa080, 0x008f, 0x781a, 0x2001,
++	0x0014, 0x080c, 0x5184, 0x080c, 0x5223, 0x7003, 0x0000, 0x2001,
++	0x0002, 0x0005, 0x2001, 0x0000, 0x0005, 0xa182, 0x0024, 0x1a04,
++	0x516d, 0xa184, 0x0003, 0x0853, 0x0005, 0x516d, 0x516d, 0x516d,
++	0x516d, 0x080c, 0x516d, 0x0005, 0x2200, 0x0002, 0x4eb5, 0x4eb5,
++	0x4d65, 0x4d65, 0x4d65, 0x4d65, 0x4d65, 0x4d65, 0x4d65, 0x4d65,
++	0x4d63, 0x4d65, 0x4d4f, 0x4d57, 0x4d57, 0x4d57, 0x4d65, 0x4d65,
++	0x4d6d, 0x4d70, 0x4eb5, 0x4d70, 0x4d65, 0x4d65, 0x4d65, 0x00c6,
++	0x0076, 0x6f14, 0x080c, 0x3ec6, 0x007e, 0x00ce, 0x0070, 0x6818,
++	0xd0a4, 0x0158, 0x6827, 0x0033, 0x080c, 0x5184, 0x080c, 0x5223,
++	0x2001, 0x0001, 0x0005, 0x080c, 0x4fd7, 0x6827, 0x02b3, 0x2009,
++	0x000b, 0x2001, 0x4800, 0x0804, 0x4ee9, 0x080c, 0x515e, 0x0005,
++	0x6827, 0x0093, 0x2009, 0x000b, 0x2001, 0x4800, 0x0804, 0x4ed1,
++	0x2d58, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1110, 0x6807,
++	0x0117, 0x6827, 0x0002, 0x080c, 0x522f, 0x6827, 0x0036, 0x6932,
++	0x2d00, 0x682e, 0x00d6, 0x080c, 0x440a, 0x080c, 0x4f11, 0x2b68,
++	0x080c, 0x4432, 0x00de, 0x080c, 0x4432, 0x2001, 0x0002, 0x0005,
++	0x080c, 0x4f11, 0x2001, 0x0017, 0x080c, 0x5184, 0x7097, 0x0000,
++	0x6914, 0xd1fc, 0x0118, 0x2009, 0xb3c6, 0x0010, 0x2009, 0xb386,
++	0x200b, 0x0006, 0x70a3, 0x0017, 0x2009, 0x0200, 0x080c, 0x4318,
++	0x2001, 0x0001, 0x0005, 0x2200, 0x0002, 0x4eb5, 0x4ee6, 0x4ee6,
++	0x4ee6, 0x4dd6, 0x4ef8, 0x4dde, 0x4ef8, 0x4ef8, 0x4efb, 0x4efb,
++	0x4f00, 0x4f00, 0x4dce, 0x4dce, 0x4ee6, 0x4ee6, 0x4ef8, 0x4ee6,
++	0x4dde, 0x4eb5, 0x4dde, 0x4dde, 0x4dde, 0x4dde, 0x6827, 0x0084,
++	0x2009, 0x000b, 0x2001, 0x4300, 0x0804, 0x4f0a, 0x6827, 0x000d,
++	0x2009, 0x000b, 0x2001, 0x4300, 0x0804, 0x4ee9, 0x6827, 0x0093,
++	0x2009, 0x000b, 0x2001, 0x4300, 0x0804, 0x4ed1, 0x2001, 0x0000,
++	0x0005, 0x2200, 0x0002, 0x4eb5, 0x4e4c, 0x4e4c, 0x4e4c, 0x4e4c,
++	0x4e04, 0x4e04, 0x4e04, 0x4e04, 0x4e04, 0x4e04, 0x4e04, 0x4e04,
++	0x4e4c, 0x4e4c, 0x4e4c, 0x4e4c, 0x4e2a, 0x4e4c, 0x4e4c, 0x4e2a,
++	0x4e2a, 0x4e2a, 0x4e2a, 0x4eb5, 0x6804, 0xa084, 0x00ff, 0xa086,
++	0x0006, 0x1500, 0x690c, 0xa184, 0x000f, 0x0904, 0x4ef8, 0x8001,
++	0x0130, 0xa18c, 0xfff0, 0xa105, 0x680e, 0x0804, 0x4ef8, 0x70a8,
++	0xa080, 0x008f, 0x781a, 0x6827, 0x000f, 0x080c, 0x4bc9, 0x080c,
++	0x5184, 0x7003, 0x0000, 0x7043, 0x0000, 0x7053, 0x0000, 0x2001,
++	0x0002, 0x0005, 0x6918, 0xa184, 0x000f, 0x0904, 0x4ef8, 0x8001,
++	0x0130, 0xa18c, 0xfff0, 0xa105, 0x681a, 0x0804, 0x4ef8, 0x70a8,
++	0xa080, 0x008f, 0x781a, 0x6827, 0x008f, 0x2009, 0x000b, 0x2001,
++	0x4300, 0x080c, 0x51da, 0x080c, 0x5184, 0x080c, 0x5223, 0x7003,
++	0x0000, 0x2001, 0x0002, 0x0005, 0x6827, 0x0093, 0x2009, 0x000b,
++	0x2001, 0x4300, 0x0804, 0x4ed1, 0xa684, 0x0004, 0x1180, 0x6804,
++	0xa084, 0x00ff, 0xa086, 0x0006, 0x1904, 0x516d, 0x080c, 0x4f11,
++	0x6807, 0x0117, 0x080c, 0x4432, 0x2001, 0x0002, 0x0005, 0x6000,
++	0xa084, 0x0004, 0x0904, 0x516d, 0x2d58, 0x6804, 0xa084, 0x00ff,
++	0xa086, 0x0006, 0x1110, 0x6807, 0x0117, 0x6827, 0x0002, 0x080c,
++	0x522f, 0x6827, 0x0036, 0x6932, 0x2d00, 0x682e, 0x00d6, 0x080c,
++	0x4416, 0x080c, 0x4f11, 0x2b68, 0x080c, 0x4432, 0x00de, 0x080c,
++	0x4432, 0x2001, 0x0002, 0x0005, 0x6000, 0xa084, 0x0004, 0x0904,
++	0x516d, 0x2d58, 0x6a04, 0xa294, 0x00ff, 0xa286, 0x0006, 0x1110,
++	0x6807, 0x0117, 0x6827, 0x0002, 0x2d58, 0x080c, 0x522f, 0x6827,
++	0x0036, 0x6932, 0x2d00, 0x682e, 0x00d6, 0x080c, 0x4424, 0x080c,
++	0x4f11, 0x2b68, 0x080c, 0x4432, 0x00de, 0x080c, 0x4432, 0x2001,
++	0x0002, 0x0005, 0x080c, 0x516d, 0x0005, 0x70a8, 0xa080, 0x008f,
++	0x781a, 0x2001, 0x0001, 0x080c, 0x5184, 0x080c, 0x5223, 0x7003,
++	0x0000, 0x2001, 0x0002, 0x0005, 0x080c, 0x51da, 0x080c, 0x5222,
++	0x080c, 0x4cca, 0x080c, 0x4bc9, 0x080c, 0x5223, 0x2001, 0x0001,
++	0x0005, 0x080c, 0x51da, 0x080c, 0x5222, 0x080c, 0x4cca, 0x70a8,
++	0xa080, 0x008f, 0x781a, 0x2001, 0x0013, 0x080c, 0x5184, 0x080c,
++	0x5223, 0x7003, 0x0000, 0x2001, 0x0002, 0x0005, 0x080c, 0x516d,
++	0x0005, 0x080c, 0x51da, 0x080c, 0x5222, 0x080c, 0x4cca, 0x080c,
++	0x4bc9, 0x080c, 0x5223, 0x080c, 0x527f, 0x2001, 0x0001, 0x0005,
++	0x2001, 0x0003, 0x0005, 0x080c, 0x4fd7, 0x2001, 0x0000, 0x0005,
++	0x00c6, 0x0076, 0x6f14, 0x080c, 0x3ec6, 0x007e, 0x00ce, 0x2001,
++	0x0000, 0x0005, 0x080c, 0x51da, 0x080c, 0x516d, 0x2001, 0x0006,
++	0x0005, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0118, 0xa186,
++	0x000f, 0x1120, 0x080c, 0x5222, 0x080c, 0x4cca, 0x70a8, 0xa080,
++	0x008f, 0x781a, 0x080c, 0x5223, 0x7003, 0x0000, 0x0005, 0x7aa8,
++	0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0005, 0x1a04,
++	0x516d, 0x000b, 0x0005, 0x516d, 0x4f38, 0x516d, 0x4fdd, 0x50a0,
++	0xa282, 0x0003, 0x1904, 0x516d, 0x7da8, 0xa5ac, 0x00ff, 0x7ea8,
++	0xa6b4, 0x00ff, 0x69b8, 0xa184, 0x0100, 0x05a0, 0xa18c, 0xfeff,
++	0x69ba, 0x78a0, 0xa005, 0x1570, 0xa6b4, 0x00ff, 0x01f0, 0xa682,
++	0x001d, 0x1270, 0xa686, 0x0010, 0x1108, 0x8631, 0x852b, 0x852b,
++	0x2041, 0x0000, 0x080c, 0x3f0c, 0x0118, 0x080c, 0x3d35, 0x0078,
++	0x080c, 0x508e, 0x080c, 0x3d32, 0x69b8, 0xa18d, 0x0100, 0x69ba,
++	0x7e58, 0xa6b5, 0x1000, 0x7e5a, 0x0030, 0x080c, 0x3d32, 0x7e58,
++	0xa6b4, 0xefff, 0x7e5a, 0x70a8, 0xa080, 0x00a1, 0x781a, 0x2001,
++	0x0001, 0x0005, 0x00c6, 0x080c, 0x4fc6, 0x6200, 0xd2e4, 0x05a0,
++	0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x001c, 0x0218, 0x0110,
++	0x2011, 0x001c, 0x2600, 0xa202, 0x1208, 0x2230, 0xa686, 0x0010,
++	0x1108, 0x8631, 0x6208, 0xa294, 0x00ff, 0x78ec, 0xd0e4, 0x0130,
++	0xa282, 0x000a, 0x1240, 0x2011, 0x000a, 0x0028, 0xa282, 0x000c,
++	0x1210, 0x2011, 0x000c, 0x2200, 0xa502, 0x1208, 0x2228, 0x2620,
++	0x080c, 0x5091, 0x852b, 0x852b, 0x2041, 0x0000, 0x080c, 0x3f0c,
++	0x0118, 0x080c, 0x3d3e, 0x0020, 0x080c, 0x508e, 0x080c, 0x3d3b,
++	0x7e58, 0xa6b5, 0x1000, 0x7e5a, 0x783b, 0x1700, 0x70a8, 0xa080,
++	0x00de, 0x781a, 0x2001, 0x0004, 0x00ce, 0x0005, 0x6814, 0x8007,
++	0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0x8003, 0x6914, 0xd1fc,
++	0x1118, 0xa0e0, 0xb800, 0x0010, 0xa0e0, 0xb900, 0x0005, 0x00c6,
++	0x0c69, 0x080c, 0x3d3b, 0x00ce, 0x0005, 0xa282, 0x0002, 0x1904,
++	0x516d, 0x7aa8, 0xa294, 0x00ff, 0x69b8, 0xa184, 0x0200, 0x0540,
++	0xa18c, 0xfdff, 0x69ba, 0x78a0, 0xa005, 0x1510, 0xa282, 0x0002,
++	0x1a04, 0x3e69, 0x080c, 0x506b, 0x080c, 0x3deb, 0x080c, 0x3d32,
++	0x7e58, 0xa684, 0x0100, 0x0150, 0x682c, 0xa084, 0x0001, 0x0130,
++	0xc6fc, 0x7888, 0xa084, 0x0040, 0x0108, 0xc6fd, 0xa6b5, 0x1000,
++	0x7e5a, 0x70a8, 0xa080, 0x00a1, 0x781a, 0x2001, 0x0001, 0x0005,
++	0x00c6, 0x080c, 0x4fc6, 0x6028, 0xc08c, 0x602a, 0xa284, 0xfffe,
++	0x0118, 0x2011, 0x0001, 0x0018, 0xa284, 0x0001, 0x0128, 0x6100,
++	0xd1ec, 0x1110, 0x2011, 0x0000, 0x04c1, 0x080c, 0x3df1, 0x080c,
++	0x3d3b, 0x7e58, 0xa684, 0x0100, 0x0150, 0x682c, 0xa084, 0x0001,
++	0x0130, 0xc6fc, 0x7888, 0xa084, 0x0040, 0x0108, 0xc6fd, 0xa6b5,
++	0x1000, 0x7e5a, 0x783b, 0x1700, 0x70a8, 0xa080, 0x00de, 0x781a,
++	0x2001, 0x0004, 0x00ce, 0x0005, 0x00c6, 0x2960, 0x6000, 0x2011,
++	0x0001, 0xa084, 0x2000, 0x1110, 0x2011, 0x0000, 0x78ab, 0x0001,
++	0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x68b8,
++	0xa085, 0x0200, 0x68ba, 0x00ce, 0x0005, 0x789b, 0x0018, 0x78ab,
++	0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0081,
++	0x78ab, 0x0004, 0x0005, 0x00c6, 0x705c, 0x2060, 0x6000, 0xa084,
++	0x1000, 0x1128, 0x2029, 0x0032, 0x2021, 0x0000, 0x0080, 0x6408,
++	0xa4ac, 0x00ff, 0xa582, 0x000c, 0x1210, 0x2029, 0x000c, 0x8427,
++	0xa4a4, 0x00ff, 0xa482, 0x001c, 0x0210, 0x2021, 0x001c, 0x0049,
++	0x68b8, 0xa085, 0x0100, 0x68ba, 0x00ce, 0x0005, 0xa026, 0x2029,
++	0x0032, 0x789b, 0x0018, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
++	0x0001, 0x7daa, 0x7caa, 0x789b, 0x0081, 0x78ab, 0x0005, 0x0005,
++	0x080c, 0x4fc6, 0x6000, 0xd09c, 0x1118, 0x080c, 0x516d, 0x0005,
++	0xa282, 0x0006, 0x0118, 0x080c, 0x516d, 0x0005, 0x7aa8, 0xa294,
++	0x00ff, 0x7e5a, 0x7ea8, 0x7ea8, 0xa6b4, 0x00ff, 0x7fa8, 0xa7bc,
++	0x00ff, 0xa782, 0x0002, 0x0218, 0x080c, 0x516d, 0x0005, 0x78a8,
++	0x2040, 0xa8c4, 0x00ff, 0xa882, 0x0003, 0x0218, 0x080c, 0x516d,
++	0x0005, 0xa886, 0x0001, 0x1118, 0x080c, 0x516d, 0x0005, 0x2600,
++	0xa005, 0x1120, 0x080c, 0x4fd7, 0x0804, 0x513e, 0xa682, 0x001c,
++	0x0218, 0x0110, 0x2031, 0x001c, 0x88ff, 0x0168, 0x87ff, 0x1118,
++	0x080c, 0x516d, 0x0005, 0x6000, 0xd0ec, 0x0118, 0x78ec, 0xd0e4,
++	0x1110, 0x2041, 0x0000, 0x87ff, 0x1178, 0xa282, 0x000a, 0x0230,
++	0x0128, 0xa282, 0x0061, 0x1128, 0x0120, 0x00b8, 0x2011, 0x000a,
++	0x00a0, 0x2011, 0x0061, 0x0088, 0x78ec, 0xd0e4, 0x1108, 0x0c68,
++	0xa282, 0x0009, 0x0228, 0x0120, 0xa282, 0x0019, 0x0230, 0x0018,
++	0x2011, 0x0009, 0x0010, 0x2011, 0x0019, 0x0086, 0x0076, 0x0066,
++	0x8213, 0x8213, 0x2228, 0x080c, 0x3f0c, 0x006e, 0x007e, 0x008e,
++	0x1128, 0x080c, 0x4fd7, 0xa016, 0xa036, 0x0400, 0x87ff, 0x0150,
++	0xa8ac, 0x0002, 0x0138, 0x6520, 0x85ff, 0x0120, 0x6528, 0xc58d,
++	0x652a, 0x0018, 0x6528, 0xc58c, 0x652a, 0x2620, 0x88ff, 0x0108,
++	0x8634, 0xa69e, 0x0010, 0x1108, 0x8631, 0x0026, 0x080c, 0x3d3e,
++	0x080c, 0x3df1, 0x2430, 0x002e, 0x8214, 0x8214, 0x789b, 0x0018,
++	0x78ab, 0x0001, 0x78ab, 0x0006, 0x78ab, 0x0004, 0x7aaa, 0x78ab,
++	0x0000, 0x7eaa, 0x7faa, 0x2800, 0x78aa, 0x789b, 0x0081, 0x78ab,
++	0x0008, 0x7e58, 0xa6b5, 0x1000, 0x7e5a, 0x783b, 0x1700, 0x70a8,
++	0xa080, 0x00de, 0x781a, 0x2001, 0x0004, 0x0005, 0x2001, 0x0003,
++	0x00d9, 0xa6b5, 0x1000, 0x7e5a, 0x783b, 0x1700, 0x70a8, 0xa080,
++	0x00de, 0x781a, 0x2001, 0x0005, 0x0005, 0x2001, 0x0007, 0x0061,
++	0xa6b5, 0x1000, 0x7e5a, 0x783b, 0x1700, 0x70a8, 0xa080, 0x00de,
++	0x781a, 0x2001, 0x0004, 0x0005, 0x789b, 0x0018, 0x78aa, 0x789b,
++	0x0081, 0x78ab, 0x0001, 0x0005, 0x6904, 0xa18c, 0x00ff, 0xa196,
++	0x0007, 0x0130, 0xa196, 0x000f, 0x0118, 0x080c, 0x1ca6, 0x0005,
++	0x6924, 0xa194, 0x003f, 0x1120, 0xa18c, 0xffc0, 0xa105, 0x6826,
++	0x6a1c, 0xd29c, 0x1530, 0xa086, 0x0001, 0x1518, 0x2001, 0xb341,
++	0x2004, 0xd094, 0x01f0, 0x0e04, 0x51c1, 0x0156, 0x00e6, 0x0036,
++	0x0046, 0x0056, 0x2071, 0x0010, 0x7bf0, 0x7af4, 0x7cf8, 0x7dfc,
++	0x2009, 0x0002, 0xad80, 0x0003, 0x080c, 0x1e7a, 0x005e, 0x004e,
++	0x003e, 0x00ee, 0x015e, 0x1128, 0x2091, 0x4080, 0x080c, 0x1ca6,
++	0x0010, 0x080c, 0x4432, 0x691c, 0xa184, 0x0100, 0x0138, 0x6914,
++	0x2100, 0x080c, 0x449c, 0x6204, 0x8210, 0x6206, 0x0005, 0x692c,
++	0x6834, 0x682e, 0xa112, 0x6930, 0x6838, 0x6832, 0xa11b, 0xa200,
++	0xa301, 0x0005, 0x00c6, 0xade0, 0x0018, 0x6003, 0x0070, 0x6106,
++	0x600b, 0x0000, 0x600f, 0x0a00, 0x6013, 0x0000, 0x6017, 0x0000,
++	0x8007, 0x601a, 0x601f, 0x0000, 0x6023, 0x0000, 0x00ce, 0x6824,
++	0xa085, 0x0080, 0x6826, 0x0005, 0x0156, 0x0136, 0x0146, 0x2098,
++	0xaf80, 0x002d, 0x20a0, 0x81ac, 0x0108, 0x53a6, 0xa184, 0x0001,
++	0x0110, 0x3304, 0x78be, 0x014e, 0x013e, 0x015e, 0x0005, 0x70a4,
++	0x00e6, 0x0006, 0x000e, 0x00ee, 0xa005, 0x6918, 0x0016, 0x6914,
++	0x0016, 0x6928, 0x0016, 0x001e, 0x001e, 0x001e, 0x190c, 0x297f,
++	0x70a7, 0x8000, 0x6814, 0xd0fc, 0x0110, 0xc185, 0x0008, 0xc184,
++	0x0804, 0x55dc, 0x0005, 0x71a4, 0x81ff, 0x0140, 0x7848, 0xa085,
++	0x0008, 0x784a, 0x70a7, 0x0000, 0x080c, 0x52e3, 0x0005, 0x00c6,
++	0x00d6, 0x080c, 0x1c85, 0x00ce, 0x0156, 0x0136, 0x0146, 0x2da0,
++	0x2c98, 0x20a9, 0x0037, 0x53a3, 0x014e, 0x013e, 0x015e, 0x6807,
++	0x010d, 0x680b, 0x0000, 0x701c, 0x8007, 0x681a, 0x6823, 0x0000,
++	0x681f, 0x0000, 0x689f, 0x0000, 0x00ce, 0x0005, 0x00c6, 0x080c,
++	0x4fc6, 0x6028, 0xd08c, 0x00ce, 0x0180, 0x7814, 0xa084, 0x0001,
++	0x0130, 0x70a8, 0xa080, 0x011c, 0x781a, 0x0804, 0x29df, 0x70a8,
++	0xa080, 0x0135, 0x781a, 0x0804, 0x29df, 0x70a8, 0xa080, 0x00a1,
++	0x781a, 0x0804, 0x29df, 0x70a8, 0xa080, 0x0092, 0x781a, 0x0804,
++	0x29df, 0x783b, 0x1700, 0x70a8, 0xa080, 0x00de, 0x781a, 0x0804,
++	0x29df, 0x70a8, 0xa080, 0x00e7, 0x781a, 0x0804, 0x29df, 0x6904,
++	0xa18c, 0x00ff, 0xa196, 0x0007, 0x0128, 0xa196, 0x000f, 0x0110,
++	0x6807, 0x0117, 0x6824, 0xa084, 0x00ff, 0xa085, 0x0200, 0x6826,
++	0x8007, 0x789b, 0x000e, 0x78aa, 0x6820, 0xa085, 0x8000, 0x6822,
++	0x2031, 0x0400, 0x6eb6, 0x7e5a, 0x71a8, 0xa188, 0x00a1, 0x791a,
++	0x0005, 0x080c, 0x5223, 0x7848, 0xa085, 0x000c, 0x784a, 0x70a8,
++	0xa080, 0x008f, 0x781a, 0x2009, 0x000b, 0x2001, 0x4400, 0x080c,
++	0x51da, 0x2001, 0x0013, 0x080c, 0x5184, 0x0804, 0x44ee, 0x81ff,
++	0x1110, 0xa21a, 0x0218, 0x080c, 0x20ea, 0x0070, 0x7ad2, 0x7ada,
++	0x2200, 0x2011, 0x0001, 0x6027, 0x0000, 0x7ad6, 0x78df, 0x0000,
++	0x7b14, 0xc384, 0x7b16, 0x0088, 0x81ff, 0x1130, 0x6027, 0x0000,
++	0x7b14, 0xc384, 0x7b16, 0x0020, 0x6126, 0x7b14, 0xc385, 0x7b16,
++	0x78d2, 0x78da, 0x7ad6, 0x8211, 0x7ade, 0x6232, 0x602e, 0x6028,
++	0xc085, 0x602a, 0x0005, 0x0126, 0x70f0, 0xa084, 0x4c00, 0x8004,
++	0x2090, 0x7204, 0x700c, 0xa215, 0x7008, 0xc09c, 0xa205, 0x1138,
++	0x7007, 0x0004, 0x7003, 0x0000, 0x012e, 0x2000, 0x0005, 0x7000,
++	0xd084, 0x0580, 0x7108, 0xe000, 0x7008, 0xa106, 0x1dd8, 0xa184,
++	0x0003, 0x0904, 0x534b, 0xa184, 0x01e0, 0x1904, 0x534b, 0xd1f4,
++	0x1d88, 0xa184, 0x3000, 0xa086, 0x1000, 0x0d60, 0x2011, 0x0180,
++	0x710c, 0x8211, 0x0130, 0x7008, 0xd0f4, 0x1d20, 0x700c, 0xa106,
++	0x0dc0, 0x7007, 0x0012, 0x7108, 0xe000, 0x7008, 0xa106, 0x1dd8,
++	0xa184, 0x0003, 0x0540, 0xd194, 0x0db0, 0xd1f4, 0x0520, 0x7007,
++	0x0002, 0x0880, 0x7108, 0xd1fc, 0x0130, 0x080c, 0x5484, 0x8aff,
++	0x0904, 0x52e9, 0x0cb8, 0x700c, 0xa08c, 0x07ff, 0x01c8, 0x7004,
++	0xd084, 0x0158, 0x7014, 0xa005, 0x1128, 0x7010, 0xa005, 0x0128,
++	0xa102, 0x1e40, 0x7007, 0x0010, 0x0030, 0x8aff, 0x0148, 0x080c,
++	0x56ad, 0x1de8, 0x09f8, 0x080c, 0x53ee, 0x012e, 0x2000, 0x0005,
++	0x7204, 0x700c, 0xa215, 0x7108, 0xc19c, 0x8103, 0x1228, 0xa205,
++	0x1d90, 0x7007, 0x0002, 0x0ca0, 0xa205, 0x1d68, 0x7003, 0x0000,
++	0x7007, 0x0004, 0x012e, 0x2000, 0x0005, 0x0016, 0x6104, 0xa18c,
++	0x00ff, 0xa186, 0x0007, 0x0118, 0xa18e, 0x000f, 0x1110, 0x6040,
++	0x0008, 0x6428, 0x001e, 0x84ff, 0x01f8, 0x2c70, 0x7004, 0xa0bc,
++	0x000f, 0xa7b8, 0x53a4, 0x273d, 0x87fb, 0x1138, 0x0210, 0x080c,
++	0x297f, 0x609c, 0xa075, 0x0180, 0x0c88, 0x2705, 0xae68, 0x6808,
++	0xa630, 0x680c, 0xa529, 0x8421, 0x0138, 0x8738, 0x2705, 0xa005,
++	0x1da8, 0x709c, 0xa075, 0x1d10, 0x0005, 0x0000, 0x0005, 0x0009,
++	0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000, 0x0003, 0x0009,
++	0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x5399, 0x5396, 0x0000,
++	0x0000, 0x8000, 0x0000, 0x5399, 0x0000, 0x53a1, 0x539e, 0x0000,
++	0x0000, 0x0000, 0x0000, 0x53a1, 0x0000, 0x539c, 0x539c, 0x0000,
++	0x0000, 0x8000, 0x0000, 0x539c, 0x0000, 0x53a2, 0x53a2, 0x0000,
++	0x0000, 0x0000, 0x0000, 0x53a2, 0x2079, 0xb340, 0x2071, 0x0010,
++	0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x7808, 0xd0ec,
++	0x0128, 0x2009, 0x0001, 0x2071, 0x0020, 0x0060, 0x2001, 0x01ff,
++	0x2004, 0xd0fc, 0x0118, 0x2009, 0x0001, 0x0010, 0x2009, 0x0002,
++	0x2071, 0x0050, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000,
++	0x8109, 0x0118, 0x2071, 0x0020, 0x0ca8, 0x0005, 0x2019, 0x0000,
++	0x7004, 0x8004, 0x1a04, 0x545c, 0x7108, 0x7008, 0xa106, 0x1de0,
++	0xa184, 0x01e0, 0x0120, 0x080c, 0x54be, 0x0804, 0x547c, 0x7007,
++	0x0012, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0110,
++	0x080c, 0x54be, 0x7808, 0xd0ec, 0x0188, 0x2001, 0x04fd, 0x2004,
++	0xa086, 0x0003, 0x1170, 0xa184, 0x4000, 0x0170, 0xa382, 0x0003,
++	0x1258, 0xa184, 0x0004, 0x0d28, 0x8318, 0x0c18, 0x780c, 0xd0ec,
++	0x1118, 0xa184, 0x4000, 0x19e8, 0xa19c, 0x300c, 0xa386, 0x2004,
++	0x0190, 0xa386, 0x0008, 0x01c0, 0x7004, 0xd084, 0x1148, 0x7108,
++	0x7008, 0xa106, 0x1de0, 0xa184, 0x0003, 0x0110, 0x0804, 0x54be,
++	0xa386, 0x200c, 0x1930, 0x7200, 0x8204, 0x0230, 0x730c, 0xa384,
++	0x07ff, 0x0110, 0x080c, 0x297f, 0x7108, 0x7008, 0xa106, 0x1de0,
++	0xa184, 0x01e0, 0x0118, 0x080c, 0x54be, 0x0470, 0x7007, 0x0012,
++	0x7000, 0xd084, 0x1148, 0x7310, 0x7014, 0xa305, 0x0128, 0x710c,
++	0xa184, 0x07ff, 0x1904, 0x53ee, 0x7108, 0x7008, 0xa106, 0x1de0,
++	0xa184, 0x01e0, 0x0118, 0x080c, 0x54be, 0x00b0, 0x7007, 0x0012,
++	0x7007, 0x0008, 0x7004, 0xd09c, 0x1de8, 0x7108, 0x7008, 0xa106,
++	0x1de0, 0xa184, 0x01e0, 0x0118, 0x080c, 0x54be, 0x0028, 0x7007,
++	0x0012, 0x7108, 0xd1fc, 0x1d88, 0x7003, 0x0000, 0x0005, 0x0156,
++	0x7108, 0x0011, 0x015e, 0x0005, 0x7204, 0x7500, 0xa184, 0x01e0,
++	0x15a8, 0x7108, 0xa184, 0x01e0, 0x1588, 0xa184, 0x0007, 0x0002,
++	0x549a, 0x54a8, 0x5498, 0x54a8, 0x5498, 0x5508, 0x5498, 0x5506,
++	0x080c, 0x297f, 0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x8aff,
++	0x1118, 0x2049, 0x0000, 0x0018, 0x080c, 0x56ad, 0x1de8, 0x0005,
++	0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x7004, 0xd084, 0x1140,
++	0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x0003, 0x0108, 0x0030,
++	0x8aff, 0x0118, 0x080c, 0x56ad, 0x1de8, 0x0005, 0x7007, 0x0012,
++	0x7108, 0x1d04, 0x54c1, 0x2091, 0x6000, 0x1d04, 0x54c5, 0x2091,
++	0x6000, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xd09c, 0x1de8,
++	0x7007, 0x0012, 0x7108, 0xd1fc, 0x1dd8, 0x7003, 0x0000, 0x7000,
++	0xa005, 0x1130, 0x7004, 0xa005, 0x1118, 0x700c, 0xa005, 0x0108,
++	0x0c40, 0x2049, 0x0000, 0xb284, 0x0200, 0x0118, 0x2001, 0x0000,
++	0x0010, 0x2001, 0x0001, 0x080c, 0x3fcf, 0xb284, 0x0200, 0x0118,
++	0x2001, 0xb3a4, 0x0010, 0x2001, 0xb3e4, 0x2004, 0xa084, 0x8000,
++	0x0130, 0x6824, 0xa005, 0x1128, 0x6827, 0x0004, 0x0010, 0x681b,
++	0x0002, 0x0005, 0x080c, 0x297f, 0x080c, 0x297f, 0x080c, 0x5548,
++	0x7210, 0x7114, 0x700c, 0xa09c, 0x07ff, 0x2800, 0xa300, 0xa211,
++	0xa189, 0x0000, 0x04a9, 0x2705, 0x2c58, 0xac60, 0x6308, 0x2200,
++	0xa322, 0x630c, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0140, 0x1238,
++	0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0c58, 0x2b60,
++	0x8a07, 0x0006, 0x6004, 0xa084, 0x0008, 0x0118, 0xa7ba, 0x539e,
++	0x0010, 0xa7ba, 0x5396, 0x000e, 0xa73d, 0x2c00, 0x6886, 0x6f8a,
++	0x6c92, 0x6b8e, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0,
++	0x0110, 0x080c, 0x54be, 0x7007, 0x0012, 0x080c, 0x53ee, 0x0005,
++	0x8a50, 0x8739, 0x2705, 0xa004, 0x1168, 0x6000, 0xa064, 0x1108,
++	0x2d60, 0x6004, 0xa084, 0x000f, 0xa080, 0x53b4, 0x203d, 0x87fb,
++	0x090c, 0x297f, 0x0005, 0x0126, 0x00d6, 0x70f0, 0xa084, 0x4c00,
++	0x8004, 0x2090, 0x00de, 0x6884, 0x2060, 0x6888, 0x6b8c, 0x6c90,
++	0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0x0006, 0x6804, 0xa084,
++	0x0008, 0x000e, 0x0118, 0xa0b8, 0x539e, 0x0010, 0xa0b8, 0x5396,
++	0xb284, 0x0200, 0x0110, 0x7e18, 0x0008, 0x7e1c, 0xa6b5, 0x000c,
++	0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0118, 0xa18e, 0x000f,
++	0x1130, 0x681c, 0xa084, 0x0040, 0x0130, 0xc685, 0x0020, 0x681c,
++	0xd0b4, 0x0108, 0xc685, 0x700c, 0xa084, 0x07ff, 0x0128, 0x7007,
++	0x0004, 0x7004, 0xd094, 0x1de8, 0x2400, 0xa305, 0x1108, 0x0420,
++	0x2c58, 0x2705, 0x6104, 0xac60, 0x6000, 0xa400, 0x701a, 0x6004,
++	0xa301, 0x701e, 0xa184, 0x0008, 0x0140, 0x6010, 0xa081, 0x0000,
++	0x7022, 0x6014, 0xa081, 0x0000, 0x7026, 0x6208, 0x2400, 0xa202,
++	0x7012, 0x620c, 0x2300, 0xa203, 0x7016, 0x7602, 0x7007, 0x0001,
++	0x2b60, 0x080c, 0x56d8, 0x0010, 0x080c, 0x56ad, 0x1de8, 0x012e,
++	0x2000, 0x0005, 0x0126, 0x00d6, 0x70f0, 0xa084, 0x4c00, 0x8004,
++	0x2090, 0x00de, 0x7007, 0x0004, 0x7004, 0xd094, 0x1de8, 0x7003,
++	0x0008, 0x012e, 0x2000, 0x0005, 0x0126, 0x00d6, 0x70f0, 0xa084,
++	0x4c00, 0x8004, 0x2090, 0x00de, 0x700c, 0xa084, 0x07ff, 0x0128,
++	0x7007, 0x0004, 0x7004, 0xd094, 0x1de8, 0x6814, 0xd0fc, 0x0110,
++	0x7e1c, 0x0008, 0x7e18, 0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff,
++	0xa186, 0x0007, 0x0118, 0xa18e, 0x000f, 0x1140, 0x681c, 0xa084,
++	0x0040, 0x0108, 0xc685, 0x6840, 0x2050, 0x0030, 0x681c, 0xd0ac,
++	0x1108, 0xc685, 0x6828, 0x2050, 0x2d60, 0x6004, 0xa0bc, 0x000f,
++	0xa7b8, 0x53a4, 0x273d, 0x87fb, 0x1138, 0x0210, 0x080c, 0x297f,
++	0x689c, 0xa065, 0x0120, 0x0c88, 0x080c, 0x56ad, 0x1de8, 0x012e,
++	0x2000, 0x0005, 0x0126, 0x0006, 0x0016, 0x00d6, 0x70f0, 0xa084,
++	0x4c00, 0x8004, 0x2090, 0xb284, 0x0200, 0x0110, 0x7e18, 0x0008,
++	0x7e1c, 0x00de, 0x003e, 0x004e, 0xa6b5, 0x000c, 0x6904, 0xa18c,
++	0x00ff, 0xa186, 0x0007, 0x0118, 0xa18e, 0x000f, 0x1130, 0x681c,
++	0xa084, 0x0040, 0x0130, 0xc685, 0x0020, 0x681c, 0xd0b4, 0x0108,
++	0xc685, 0x2049, 0x5622, 0x0016, 0x6904, 0xa18c, 0x00ff, 0xa186,
++	0x0007, 0x0118, 0xa18e, 0x000f, 0x1110, 0x6840, 0x0008, 0x6828,
++	0x001e, 0xa055, 0x00d6, 0x0904, 0x56a9, 0x2d70, 0x2e60, 0x7004,
++	0xa0bc, 0x000f, 0xa7b8, 0x53a4, 0x273d, 0x87fb, 0x1140, 0x0210,
++	0x080c, 0x297f, 0x709c, 0xa075, 0x2060, 0x05d8, 0x0c80, 0x2705,
++	0xae68, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0268, 0x8a51, 0x1110,
++	0x080c, 0x297f, 0x8738, 0x2705, 0xa005, 0x1d90, 0x709c, 0xa075,
++	0x2060, 0x0538, 0x08e0, 0x8422, 0x8420, 0x831a, 0xa399, 0x0000,
++	0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x1210, 0x080c,
++	0x297f, 0x0016, 0x3208, 0xa18c, 0x0200, 0x0168, 0x0006, 0x2001,
++	0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0x2071, 0x0020, 0x0028,
++	0x2071, 0x0050, 0x0010, 0x2071, 0x0020, 0x001e, 0x00de, 0x0804,
++	0x5593, 0x00de, 0x012e, 0x2000, 0x0005, 0x7008, 0x0006, 0xa084,
++	0x01e0, 0x000e, 0x0110, 0xa006, 0x0005, 0xa084, 0x0003, 0xa086,
++	0x0003, 0x1108, 0x0005, 0x2705, 0xac08, 0x2104, 0x701a, 0x8108,
++	0x2104, 0x701e, 0x8108, 0x2104, 0x7012, 0x8108, 0x2104, 0x7016,
++	0x6004, 0xa084, 0x0008, 0x0130, 0x8108, 0x2104, 0x7022, 0x8108,
++	0x2104, 0x7026, 0x7602, 0x7004, 0xa084, 0x0010, 0xc085, 0x7006,
++	0x8738, 0x2705, 0xa005, 0x1168, 0x609c, 0xa005, 0x01c8, 0x2060,
++	0x6004, 0xa084, 0x000f, 0xa080, 0x53a4, 0x203d, 0x87fb, 0x090c,
++	0x297f, 0x8a51, 0x0160, 0x7008, 0x0006, 0xa084, 0x01e0, 0x000e,
++	0x0110, 0xa006, 0x0028, 0xa084, 0x0003, 0xa086, 0x0003, 0x0005,
++	0x2051, 0x0000, 0x0005, 0x0126, 0x0006, 0x00d6, 0x70f0, 0xa084,
++	0x4c00, 0x8004, 0x2090, 0x00de, 0x008e, 0x7108, 0xa184, 0x0003,
++	0x1190, 0x0016, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0118,
++	0xa18e, 0x000f, 0x1110, 0x6840, 0x0008, 0x6828, 0x001e, 0xa005,
++	0x0178, 0x0804, 0x52f7, 0x7108, 0xd1fc, 0x0118, 0x080c, 0x5484,
++	0x0c20, 0x7007, 0x0010, 0x7108, 0xd1fc, 0x0de8, 0x080c, 0x5484,
++	0x7008, 0xa086, 0x0008, 0x19c8, 0x7000, 0xa005, 0x19b0, 0x7003,
++	0x0000, 0x2049, 0x0000, 0x012e, 0x2000, 0x0005, 0x0126, 0x0146,
++	0x0136, 0x0156, 0x00c6, 0x00d6, 0x70f0, 0xa084, 0x4c00, 0x8004,
++	0x2090, 0x00de, 0x2049, 0x5736, 0x69b0, 0xad80, 0x0011, 0xa100,
++	0x20a0, 0xb284, 0x0200, 0x0158, 0x2001, 0xb342, 0x2004, 0xd0ec,
++	0x0118, 0x2099, 0x0031, 0x0028, 0x2099, 0x0032, 0x0010, 0x2099,
++	0x0031, 0x700c, 0xa084, 0x07ff, 0x01b0, 0x6928, 0xa100, 0x682a,
++	0x7007, 0x0008, 0x7007, 0x0002, 0x7003, 0x0001, 0x0118, 0x8000,
++	0x80ac, 0x53a5, 0x700c, 0xa084, 0x07ff, 0x0128, 0x7007, 0x0004,
++	0x7004, 0xd094, 0x1de8, 0x00ce, 0x2049, 0x0000, 0x7003, 0x0000,
++	0x015e, 0x013e, 0x014e, 0x012e, 0x2000, 0x0005, 0x2091, 0x6000,
++	0x2091, 0x8000, 0x78ac, 0xa005, 0x1168, 0x796c, 0x70d0, 0xa106,
++	0x1148, 0x7814, 0xa005, 0x0130, 0x7817, 0x0000, 0x0e04, 0x5792,
++	0x2091, 0x4080, 0x7824, 0x8001, 0x7826, 0x1904, 0x5806, 0x7828,
++	0x7826, 0x7808, 0xd0ec, 0x1904, 0x57ff, 0x2061, 0xda00, 0x2069,
++	0xb3c0, 0xc7fd, 0x68ec, 0xa005, 0x0130, 0x8001, 0x68ee, 0xa005,
++	0x1110, 0x080c, 0x5995, 0x6800, 0xa084, 0x000f, 0x0168, 0xa086,
++	0x0001, 0x0150, 0x6840, 0xa00d, 0x0138, 0x2104, 0xa005, 0x0120,
++	0x8001, 0x200a, 0x0904, 0x5907, 0x6810, 0xa005, 0x01d0, 0x8001,
++	0x6812, 0x11b8, 0x68c3, 0x0001, 0xd7fc, 0x1148, 0x7808, 0xd0ec,
++	0x0118, 0x2009, 0x0102, 0x0028, 0x2009, 0x0202, 0x0010, 0x2009,
++	0x0102, 0x684c, 0xc08d, 0x200a, 0x6868, 0xa005, 0x0110, 0x080c,
++	0x260c, 0x6884, 0xa005, 0x0140, 0x8001, 0x6886, 0x1128, 0x686b,
++	0x0000, 0x68f0, 0xc0c5, 0x68f2, 0x68f0, 0xd0fc, 0x01b0, 0xc0fc,
++	0x68f2, 0x20a9, 0x0200, 0x6034, 0xa005, 0x0158, 0x8001, 0x6036,
++	0x68f0, 0xc0fd, 0x68f2, 0x1128, 0x6010, 0xa005, 0x0110, 0x080c,
++	0x260c, 0xace0, 0x0010, 0x1f04, 0x57eb, 0xd7fc, 0x0138, 0x2061,
++	0xba00, 0x2069, 0xb380, 0xc7fc, 0x0804, 0x57a2, 0x0409, 0x782c,
++	0x8001, 0x782e, 0x11b8, 0x7830, 0x782e, 0x2061, 0xba00, 0x2069,
++	0xb380, 0xc7fc, 0x6808, 0xa005, 0x0110, 0x080c, 0x5880, 0xd7fc,
++	0x1148, 0x7808, 0xd0ec, 0x1130, 0x2061, 0xda00, 0x2069, 0xb3c0,
++	0xc7fd, 0x0c80, 0x780c, 0xd0e4, 0x1100, 0x2091, 0x8001, 0x0005,
++	0x7834, 0x8001, 0x7836, 0x1904, 0x587f, 0x7838, 0x7836, 0x2069,
++	0xb380, 0xc7fc, 0x7808, 0x2079, 0x0200, 0xd0ec, 0x0110, 0x2079,
++	0x0100, 0x68f8, 0xa005, 0x0138, 0x7de0, 0xa504, 0x1120, 0x68fa,
++	0x68f0, 0xc0bc, 0x68f2, 0x2079, 0xb340, 0x680c, 0xa005, 0x1110,
++	0x2001, 0x0101, 0x8001, 0x680e, 0xd7fc, 0x1118, 0xa080, 0xfa00,
++	0x0010, 0xa080, 0xfb10, 0x2040, 0x2004, 0xa065, 0x01e0, 0x6024,
++	0xa005, 0x01b0, 0x8001, 0x6026, 0x1198, 0x6800, 0xa005, 0x0130,
++	0x6850, 0xac06, 0x1118, 0x080c, 0x5907, 0x0068, 0x6868, 0xa005,
++	0x0118, 0x6027, 0x0001, 0x0020, 0x080c, 0x58c0, 0x2804, 0x0c28,
++	0x6000, 0x2c40, 0x0c10, 0xd7fc, 0x1150, 0x7808, 0xd0ec, 0x1138,
++	0x2069, 0xb3c0, 0xc7fd, 0x2079, 0x0100, 0x0804, 0x5839, 0x0005,
++	0xa00e, 0x20a9, 0x0200, 0x6008, 0xd09c, 0x0558, 0x6024, 0xa005,
++	0x0118, 0x8001, 0x6026, 0x0418, 0x6008, 0xc09c, 0xd084, 0x1110,
++	0xd0ac, 0x01c0, 0x600a, 0x6004, 0xa005, 0x01d8, 0x00d6, 0x00c6,
++	0x0016, 0x2068, 0x6010, 0x8001, 0x6012, 0x080c, 0x3be8, 0x2d00,
++	0x2c68, 0x2060, 0x080c, 0x1d3b, 0x080c, 0x2076, 0x001e, 0x00ce,
++	0x00de, 0x0038, 0xc0bd, 0x600a, 0xa18d, 0x0001, 0x0010, 0xa18d,
++	0x0100, 0xace0, 0x0010, 0x1f04, 0x5883, 0xa184, 0x0001, 0x0130,
++	0xa18c, 0xfffe, 0x690a, 0x080c, 0x260c, 0x0008, 0x690a, 0x0005,
++	0x2c00, 0x6882, 0x6714, 0x6f7a, 0x6017, 0x0000, 0x602b, 0x0000,
++	0x601b, 0x0006, 0x60b4, 0xa084, 0x5f00, 0x601e, 0x6020, 0xa084,
++	0x00ff, 0xa085, 0x0060, 0x6022, 0x6000, 0x2042, 0x6860, 0xac06,
++	0x1110, 0x2800, 0x6862, 0x080c, 0x1cc4, 0x6818, 0xa005, 0x0530,
++	0x8001, 0x681a, 0x681a, 0x6808, 0xc0a4, 0x680a, 0x6810, 0x8001,
++	0x03e8, 0x6812, 0x602f, 0x0000, 0x6033, 0x0000, 0x2c68, 0x080c,
++	0x2085, 0xd7fc, 0x1118, 0x2069, 0xb380, 0x0010, 0x2069, 0xb3c0,
++	0x690c, 0xa184, 0x0100, 0x2001, 0x0006, 0x1128, 0x6883, 0x0000,
++	0x697e, 0x2001, 0x0004, 0x2708, 0x080c, 0x2601, 0x0005, 0x00d6,
++	0x00e6, 0x2d70, 0xd7fc, 0x1148, 0x7808, 0xd0ec, 0x0118, 0x2069,
++	0x0100, 0x0028, 0x2069, 0x0200, 0x0010, 0x2069, 0x0100, 0x7000,
++	0xa084, 0x000f, 0x0904, 0x595c, 0xa086, 0x0007, 0x1140, 0x00f6,
++	0x2d78, 0x7094, 0x2068, 0x080c, 0x4361, 0x00fe, 0x04a8, 0x7050,
++	0x2060, 0x080c, 0x2899, 0x601b, 0x0006, 0x6858, 0xa084, 0x5f00,
++	0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0048, 0x6022, 0x602f,
++	0x0000, 0x6033, 0x0000, 0x6808, 0xa084, 0xfffd, 0x680a, 0x6830,
++	0xd0b4, 0x01b0, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xd094,
++	0x0110, 0x1f04, 0x5946, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848,
++	0xd084, 0x0110, 0x1f04, 0x594f, 0x20a9, 0x00fa, 0x1f04, 0x5956,
++	0x681b, 0x0050, 0x706b, 0x0007, 0x00ee, 0x00de, 0x0005, 0x2079,
++	0xb340, 0x0441, 0x0089, 0x00d9, 0x2009, 0x0002, 0x2069, 0xb3c0,
++	0x680b, 0x0000, 0x680f, 0x0000, 0x6813, 0x0000, 0x8109, 0x0118,
++	0x2069, 0xb380, 0x0ca8, 0x0005, 0x7808, 0xd0ec, 0x0118, 0x2019,
++	0x00cc, 0x0010, 0x2019, 0x007b, 0x7b2e, 0x7b32, 0x0005, 0x780c,
++	0xd0e4, 0x1118, 0x2019, 0x0040, 0x0010, 0x2019, 0x0026, 0x7b36,
++	0x7b3a, 0x0005, 0x780c, 0xd0e4, 0x1118, 0x2019, 0x3f94, 0x0010,
++	0x2019, 0x2624, 0x7b26, 0x7b2a, 0x0005, 0x6a54, 0xa285, 0x0000,
++	0x01f0, 0x6958, 0x6bdc, 0xa300, 0x00c6, 0x2164, 0x6304, 0x83ff,
++	0x1138, 0x8211, 0x0148, 0x8108, 0xa11a, 0x0eb8, 0x69dc, 0x0ca8,
++	0x68ef, 0x000a, 0x00ce, 0x0005, 0x6954, 0x6adc, 0x2264, 0x6008,
++	0xc0b5, 0x600a, 0x8210, 0x8109, 0x1dc8, 0x6956, 0x00ce, 0x0005,
++	0x1d04, 0x59b8, 0x2091, 0x6000, 0x1d04, 0x59bc, 0x2091, 0x6000,
++	0x70ec, 0xd0dc, 0x1118, 0xd0d4, 0x0508, 0x0410, 0x2008, 0x7808,
++	0xd0ec, 0x0158, 0xd1c4, 0x15b8, 0x780c, 0xc0c5, 0x780e, 0x7808,
++	0xc0f5, 0x780a, 0xd0ec, 0x0558, 0x0438, 0xae8e, 0x0100, 0x0138,
++	0x780c, 0xc0f5, 0xc0c5, 0x780e, 0xd0d4, 0x1508, 0x00e8, 0x780c,
++	0xc0fd, 0xc0c5, 0x780e, 0xd0d4, 0x11d0, 0x00b0, 0xd0e4, 0x01c8,
++	0x1d04, 0x59e8, 0x2091, 0x6000, 0x2009, 0x000c, 0x1d04, 0x59ee,
++	0x2091, 0x6000, 0x8109, 0x1dd0, 0x70e4, 0xa084, 0x01ff, 0xa086,
++	0x01ff, 0x1110, 0x70ec, 0x0850, 0x7804, 0xd08c, 0x0110, 0x681b,
++	0x000c, 0x70a0, 0x70a2, 0x0005, 0x0020, 0x002b, 0x0000, 0x0020,
++	0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++	0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++	0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++	0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0014,
++	0x0014, 0x9851, 0x0014, 0x0014, 0x98f4, 0x98e1, 0x0014, 0x0014,
++	0x0014, 0x0080, 0x01a3, 0x0000, 0x0201, 0x0604, 0x0c08, 0x2120,
++	0x4022, 0xf880, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
++	0x0000, 0x0000, 0x0000, 0x300b, 0xa201, 0x0014, 0xa200, 0x0014,
++	0xa200, 0x0214, 0xa202, 0x3806, 0x8839, 0x20c3, 0x0864, 0xa838,
++	0x28c1, 0x9cc2, 0xa203, 0x300c, 0x2846, 0x8161, 0x846a, 0x8300,
++	0x1856, 0x883a, 0xa804, 0x28f2, 0x9ca6, 0xa8f4, 0x300c, 0x28e1,
++	0x9ca6, 0x28a2, 0x7162, 0xa820, 0x2822, 0xa207, 0x64a7, 0x2882,
++	0x7163, 0xa81a, 0x2001, 0xa80f, 0xa206, 0x64c0, 0x6de0, 0x67a0,
++	0x6fc0, 0x882b, 0x1814, 0x883b, 0x7824, 0x68c1, 0x7864, 0x883e,
++	0xa802, 0x8576, 0x8677, 0x206c, 0x28c1, 0x9cc2, 0x2045, 0x2104,
++	0x20a1, 0x2080, 0x7961, 0xa8db, 0xa209, 0x0904, 0xa20e, 0xa808,
++	0xa205, 0xa300, 0x1872, 0x879a, 0x883c, 0x1fe2, 0xc601, 0xa20a,
++	0x8000, 0x85a1, 0x806f, 0x9422, 0x84a2, 0x856e, 0x0704, 0x9ca6,
++	0x0014, 0xa204, 0xa300, 0x3009, 0x19e2, 0xf864, 0x856e, 0x883f,
++	0x08e6, 0xa8f7, 0xf881, 0xa8eb, 0xc007, 0xf8c1, 0x0016, 0x85b2,
++	0x80f0, 0x9532, 0xfb02, 0x1de2, 0x0014, 0x8532, 0xf241, 0x0014,
++	0x1de2, 0x84a8, 0xd7a0, 0x1fe6, 0x0014, 0xa208, 0x6043, 0x8008,
++	0x1dc1, 0x0016, 0x8160, 0x842a, 0x8190, 0xf041, 0x3008, 0x84a8,
++	0x11d7, 0x7042, 0x20dd, 0x0011, 0x20d5, 0x8822, 0x0016, 0x3008,
++	0x2846, 0x1011, 0xa8fd, 0x2081, 0x2802, 0x1011, 0xa8fc, 0xa88f,
++	0x20a1, 0x283d, 0x1011, 0xa8fc, 0xa20b, 0x0017, 0x300c, 0xa300,
++	0x1de2, 0xd387, 0x0210, 0xa800, 0x26e0, 0x873a, 0xfb02, 0x19f2,
++	0x1fe2, 0x0014, 0xa20d, 0x3806, 0x0210, 0x9cc7, 0x0704, 0x0017,
++	0x60ff, 0x300c, 0x807f, 0x9521, 0x85a1, 0x806f, 0x9422, 0x84a2,
++	0x8720, 0xa211, 0x9d72, 0x8772, 0x8837, 0x2101, 0xa821, 0x10d3,
++	0x78e2, 0x9d76, 0xa8fc, 0xd984, 0xf0e2, 0xf0a1, 0xa820, 0x0014,
++	0x8831, 0xd166, 0x8830, 0x800f, 0x9401, 0xb520, 0xc802, 0x8820,
++	0xa80f, 0x2301, 0xa80d, 0x10d3, 0x78e4, 0x9d76, 0x8821, 0x8820,
++	0xa8e6, 0xf123, 0xf142, 0xf101, 0xa865, 0x10d3, 0x70f6, 0x8832,
++	0x8203, 0x870c, 0xd99e, 0x6001, 0x0014, 0x6848, 0x0214, 0x8827,
++	0x300a, 0x0013, 0xa21b, 0x9d72, 0x2001, 0xa853, 0x8201, 0x1852,
++	0xd183, 0x8834, 0x8001, 0xa801, 0x3027, 0x84a8, 0x1a56, 0x8833,
++	0x0014, 0xa218, 0x6981, 0x9d7d, 0x6926, 0x6908, 0x8080, 0x9521,
++	0xc003, 0x1ab4, 0xa809, 0xa80a, 0x1a34, 0xa806, 0x8080, 0x9521,
++	0xc002, 0x1a94, 0xa801, 0x1a14, 0x7021, 0x0014, 0xa300, 0x69e4,
++	0x8023, 0x16e1, 0x8001, 0x10f1, 0x6946, 0xa213, 0x1462, 0xa213,
++	0x8000, 0x16e1, 0xa808, 0x6161, 0x0014, 0xa214, 0x61c2, 0x8002,
++	0x14e1, 0x8004, 0x16e1, 0x0101, 0x300a, 0x8827, 0x0012, 0x8080,
++	0x940c, 0xc81d, 0x8001, 0x8492, 0x0013, 0x8000, 0x84a4, 0x8190,
++	0x0016, 0x11c3, 0x211e, 0x870e, 0xa21d, 0x0014, 0x9d7d, 0x0014,
++	0xa300, 0x8181, 0x842a, 0x84a8, 0x1ce6, 0x882c, 0x0016, 0xa212,
++	0x9d72, 0x10d3, 0x70e4, 0x0004, 0x800f, 0x9426, 0xcc1a, 0x9d76,
++	0xa8f8, 0x878e, 0x0016, 0xa21c, 0x1035, 0x7965, 0x8001, 0x9405,
++	0xc001, 0xa817, 0xa82f, 0xa8a5, 0xa210, 0x3807, 0x300c, 0x807f,
++	0x9521, 0x85a1, 0x806f, 0x9422, 0x84a2, 0x817e, 0x872b, 0x8772,
++	0x7965, 0x8001, 0x9405, 0xc001, 0xa804, 0xa81c, 0xa892, 0x0014,
++	0xa8a6, 0xa21f, 0x8080, 0xa521, 0x85a1, 0x8090, 0xa422, 0x84a2,
++	0x6981, 0x9d7d, 0x6923, 0x6903, 0x18b4, 0xa802, 0xa809, 0x1894,
++	0x807f, 0x9521, 0x85a1, 0x806f, 0x9422, 0x84a2, 0x7021, 0x0014,
++	0xa300, 0x0014, 0xa220, 0x8080, 0xa521, 0x85a1, 0x8090, 0xa422,
++	0x84a2, 0x6981, 0x9d7d, 0x6923, 0x6903, 0x18b4, 0xa802, 0xa80c,
++	0x1894, 0x807f, 0x9521, 0x85a1, 0x806f, 0x9422, 0x84a2, 0x80fd,
++	0x9405, 0x8485, 0x7021, 0x0014, 0xa300, 0xa8ca, 0x0000, 0x0710
++};
++#endif
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/asm_2100.h	2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,8147 @@
++/* @(#)asm_2100.h 1.5 */
++/*
++ * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 Qlogic, Inc.
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms are permitted provided
++ * that the following conditions are met:
++ * 1. Redistribution of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistribution in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR 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.
++ */ 
++
++/*
++ * Some very early boards have problems loading firmware that is larger than
++ * 0x8000 words. In order to be able to provide at least *some* support
++ * for such ancient cards, an alternate firmware set is provided. This firmware
++ * isn't all that great, but, hey, it's better than nothing.
++ *
++ * Define USE_SMALLER_2100_FIRMWARE to select this.
++ */
++#ifndef	USE_SMALLER_2100_FIRMWARE
++/************************************************************************
++ *									*
++ * 	 --- ISP2100 Fabric Initiator/Target Firmware ---               *
++ *                   with expanded LUN addressing                       *
++ *                   and FcTape (FCP-2) support                         *
++ *									*
++ ************************************************************************/
++/*
++ *	Firmware Version 1.19.24 (14:02 Jul 16, 2002)
++ */
++static const u_int16_t isp_2100_risc_code[] = {
++	0x0078, 0x102d, 0x0000, 0x95f1, 0x0000, 0x0001, 0x0013, 0x0018,
++	0x0017, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030,
++	0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241,
++	0x5449, 0x4f4e, 0x2049, 0x5350, 0x3231, 0x3030, 0x2046, 0x6972,
++	0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030,
++	0x312e, 0x3139, 0x2020, 0x2020, 0x2400, 0x2091, 0x2000, 0x20c1,
++	0x0021, 0x2039, 0xffff, 0x2019, 0xaaaa, 0x2760, 0x2069, 0x7fff,
++	0x20c1, 0x0020, 0x2c2c, 0x2d34, 0x2762, 0x236a, 0x2c24, 0x2d04,
++	0x266a, 0x2562, 0xa406, 0x00c0, 0x1052, 0x20c1, 0x0021, 0x2c2c,
++	0x2362, 0x2c04, 0x2562, 0xa306, 0x0040, 0x1052, 0x20c1, 0x0020,
++	0x2039, 0x8fff, 0x20a1, 0xad00, 0x2708, 0x810d, 0x810d, 0x810d,
++	0x810d, 0xa18c, 0x000f, 0x2001, 0x000a, 0xa112, 0xa00e, 0x21a8,
++	0x41a4, 0x3400, 0x8211, 0x00c0, 0x105f, 0x2708, 0x3400, 0xa102,
++	0x0040, 0x106f, 0x0048, 0x106f, 0x20a8, 0xa00e, 0x41a4, 0x20a1,
++	0xa5f1, 0x2009, 0x0000, 0x20a9, 0x070f, 0x41a4, 0x3400, 0x20c9,
++	0xaaff, 0x2059, 0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x25c7,
++	0x2051, 0xa600, 0x2a70, 0x7762, 0xa786, 0x8fff, 0x0040, 0x1092,
++	0x705f, 0xcd00, 0x705b, 0xccf1, 0x7067, 0x0200, 0x706b, 0x0200,
++	0x0078, 0x109a, 0x705b, 0xbd01, 0x7067, 0x0100, 0x706b, 0x0100,
++	0x705f, 0xbd00, 0x1078, 0x12df, 0x1078, 0x13ca, 0x1078, 0x1577,
++	0x1078, 0x1ce9, 0x1078, 0x42ec, 0x1078, 0x76bf, 0x1078, 0x1355,
++	0x1078, 0x2ac0, 0x1078, 0x4e93, 0x1078, 0x49a3, 0x1078, 0x594a,
++	0x1078, 0x2263, 0x1078, 0x5c43, 0x1078, 0x5485, 0x1078, 0x2162,
++	0x1078, 0x2240, 0x2091, 0x3009, 0x7823, 0x0000, 0x0090, 0x10cf,
++	0x7820, 0xa086, 0x0002, 0x00c0, 0x10cf, 0x7823, 0x4000, 0x0068,
++	0x10c7, 0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2a70,
++	0x7003, 0x0000, 0x2001, 0x017f, 0x2003, 0x0000, 0x2a70, 0x7000,
++	0xa08e, 0x0003, 0x00c0, 0x10ef, 0x1078, 0x365e, 0x1078, 0x2ae8,
++	0x1078, 0x4ee3, 0x1078, 0x4b66, 0x2009, 0x0100, 0x2104, 0xa082,
++	0x0002, 0x0048, 0x10f3, 0x1078, 0x5966, 0x0078, 0x10d6, 0x1079,
++	0x10f7, 0x0078, 0x10dc, 0x1078, 0x7197, 0x0078, 0x10eb, 0x1101,
++	0x1102, 0x11be, 0x10ff, 0x1246, 0x12dc, 0x12dd, 0x12de, 0x1078,
++	0x1332, 0x007c, 0x127e, 0x0f7e, 0x2091, 0x8000, 0x7000, 0xa086,
++	0x0001, 0x00c0, 0x1198, 0x1078, 0x3aec, 0x2079, 0x0100, 0x7844,
++	0xa005, 0x00c0, 0x1198, 0x2011, 0x41dc, 0x1078, 0x5a45, 0x1078,
++	0x1adf, 0x780f, 0x00ff, 0x7840, 0xa084, 0xfffb, 0x7842, 0x2011,
++	0x8010, 0x73c4, 0x1078, 0x361b, 0x2001, 0xffff, 0x1078, 0x5ae6,
++	0x723c, 0xc284, 0x723e, 0x2001, 0xa60c, 0x2014, 0xc2ac, 0x2202,
++	0x1078, 0x6f9f, 0x2011, 0x0004, 0x1078, 0x8d1b, 0x1078, 0x489e,
++	0x1078, 0x42d4, 0x0040, 0x1144, 0x7087, 0x0001, 0x70bf, 0x0000,
++	0x1078, 0x3c9e, 0x0078, 0x1198, 0x1078, 0x4967, 0x0040, 0x114d,
++	0x7a0c, 0xc2b4, 0x7a0e, 0x0078, 0x1159, 0x1078, 0x90a6, 0x70cc,
++	0xd09c, 0x00c0, 0x1159, 0x7098, 0xa005, 0x0040, 0x1159, 0x1078,
++	0x42b8, 0x70d7, 0x0000, 0x70d3, 0x0000, 0x72cc, 0x2079, 0xa652,
++	0x7804, 0xd0ac, 0x0040, 0x1165, 0xc295, 0x72ce, 0xa296, 0x0004,
++	0x0040, 0x1186, 0x2011, 0x0001, 0x1078, 0x8d1b, 0x7093, 0x0000,
++	0x7097, 0xffff, 0x7003, 0x0002, 0x0f7f, 0x1078, 0x2677, 0x2011,
++	0x0005, 0x1078, 0x70e0, 0x1078, 0x62d1, 0x0c7e, 0x2061, 0x0100,
++	0x60e3, 0x0008, 0x0c7f, 0x127f, 0x0078, 0x119a, 0x7093, 0x0000,
++	0x7097, 0xffff, 0x7003, 0x0002, 0x2011, 0x0005, 0x1078, 0x70e0,
++	0x1078, 0x62d1, 0x0c7e, 0x2061, 0x0100, 0x60e3, 0x0008, 0x0c7f,
++	0x0f7f, 0x127f, 0x007c, 0x0c7e, 0x20a9, 0x0082, 0x2009, 0x007e,
++	0x017e, 0x027e, 0x037e, 0x2110, 0x027e, 0x2019, 0x0029, 0x1078,
++	0x73d0, 0x027f, 0x1078, 0xa4f1, 0x037f, 0x027f, 0x017f, 0x1078,
++	0x298e, 0x8108, 0x00f0, 0x11a0, 0x0c7f, 0x706f, 0x0000, 0x7070,
++	0xa084, 0x00ff, 0x7072, 0x709b, 0x0000, 0x007c, 0x127e, 0x2091,
++	0x8000, 0x7000, 0xa086, 0x0002, 0x00c0, 0x1244, 0x7094, 0xa086,
++	0xffff, 0x0040, 0x11d1, 0x1078, 0x2677, 0x1078, 0x62d1, 0x0078,
++	0x1244, 0x70cc, 0xd09c, 0x0040, 0x11fd, 0xd084, 0x0040, 0x11fd,
++	0x0f7e, 0x2079, 0x0100, 0x790c, 0xc1b5, 0x790e, 0x0f7f, 0xd08c,
++	0x0040, 0x11fd, 0x70d0, 0xa086, 0xffff, 0x0040, 0x11f9, 0x1078,
++	0x27f7, 0x1078, 0x62d1, 0x70cc, 0xd094, 0x00c0, 0x1244, 0x2011,
++	0x0001, 0x2019, 0x0000, 0x1078, 0x282f, 0x1078, 0x62d1, 0x0078,
++	0x1244, 0x70d4, 0xa005, 0x00c0, 0x1244, 0x7090, 0xa005, 0x00c0,
++	0x1244, 0x1078, 0x4967, 0x00c0, 0x1244, 0x2001, 0xa653, 0x2004,
++	0xd0ac, 0x0040, 0x1227, 0x157e, 0x0c7e, 0x20a9, 0x007f, 0x2009,
++	0x0000, 0x017e, 0x1078, 0x45c4, 0x00c0, 0x121a, 0x6000, 0xd0ec,
++	0x00c0, 0x1222, 0x017f, 0x8108, 0x00f0, 0x1211, 0x0c7f, 0x157f,
++	0x0078, 0x1227, 0x017f, 0x0c7f, 0x157f, 0x0078, 0x1244, 0x7003,
++	0x0003, 0x7097, 0xffff, 0x2001, 0x0000, 0x1078, 0x24e8, 0x1078,
++	0x3699, 0x2001, 0xa8b2, 0x2004, 0xa086, 0x0005, 0x00c0, 0x123c,
++	0x2011, 0x0000, 0x1078, 0x70e0, 0x2011, 0x0000, 0x1078, 0x70ea,
++	0x1078, 0x62d1, 0x1078, 0x639b, 0x127f, 0x007c, 0x017e, 0x0f7e,
++	0x127e, 0x2091, 0x8000, 0x2079, 0x0100, 0x2009, 0x00f7, 0x1078,
++	0x42a1, 0x7940, 0xa18c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0040,
++	0x125b, 0x7827, 0x0040, 0xd19c, 0x0040, 0x1260, 0x7827, 0x0008,
++	0x007e, 0x037e, 0x157e, 0xa006, 0x1078, 0x5ae6, 0x7900, 0xa18a,
++	0x0003, 0x0050, 0x1289, 0x7954, 0xd1ac, 0x00c0, 0x1289, 0x2009,
++	0x00f8, 0x1078, 0x42a1, 0x7843, 0x0090, 0x7843, 0x0010, 0x20a9,
++	0x09c4, 0x7820, 0xd09c, 0x00c0, 0x1281, 0x7824, 0xd0ac, 0x00c0,
++	0x12ca, 0x00f0, 0x1279, 0x2001, 0x0001, 0x1078, 0x24e8, 0x0078,
++	0x12d5, 0x7853, 0x0000, 0x782f, 0x0020, 0x20a9, 0x0050, 0x00e0,
++	0x128f, 0x2091, 0x6000, 0x00f0, 0x128f, 0x7853, 0x0400, 0x782f,
++	0x0000, 0x2009, 0x00f8, 0x1078, 0x42a1, 0x20a9, 0x000e, 0x0005,
++	0x00f0, 0x129f, 0x7853, 0x1400, 0x7843, 0x0090, 0x7843, 0x0010,
++	0x2019, 0x61a8, 0x7854, 0x0005, 0x0005, 0xd08c, 0x0040, 0x12b4,
++	0x7824, 0xd0ac, 0x00c0, 0x12ca, 0x8319, 0x00c0, 0x12aa, 0x2009,
++	0xa632, 0x2104, 0x8000, 0x200a, 0xa084, 0xfff0, 0x0040, 0x12c4,
++	0x200b, 0x0000, 0x1078, 0x2588, 0x2001, 0x0001, 0x1078, 0x24e8,
++	0x0078, 0x12d3, 0x2001, 0xa632, 0x2003, 0x0000, 0x7828, 0xc09d,
++	0x782a, 0x7827, 0x0048, 0x7853, 0x0400, 0x157f, 0x037f, 0x007f,
++	0x127f, 0x0f7f, 0x017f, 0x007c, 0x007c, 0x007c, 0x007c, 0x2a70,
++	0x2061, 0xa8ad, 0x2063, 0x0001, 0x6007, 0x0013, 0x600b, 0x0018,
++	0x600f, 0x0017, 0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0048,
++	0x12f5, 0x7053, 0xffff, 0x0078, 0x12f7, 0x7053, 0x0000, 0x7057,
++	0xffff, 0x706f, 0x0000, 0x7073, 0x0000, 0x1078, 0x90a6, 0x2061,
++	0xa88d, 0x6003, 0x0909, 0x6007, 0x0000, 0x600b, 0x8800, 0x600f,
++	0x0200, 0x6013, 0x00ff, 0x6017, 0x0003, 0x601b, 0x0000, 0x601f,
++	0x07d0, 0x2061, 0xa895, 0x6003, 0x8000, 0x6007, 0x0000, 0x600b,
++	0x0000, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x0000, 0x601b,
++	0x0001, 0x601f, 0x0000, 0x2061, 0xa8a5, 0x6003, 0x514c, 0x6007,
++	0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, 0x2001, 0xa626, 0x2003,
++	0x0000, 0x007c, 0x2091, 0x8000, 0x0068, 0x1334, 0x007e, 0x017e,
++	0x2079, 0x0000, 0x7818, 0xd084, 0x00c0, 0x133a, 0x017f, 0x792e,
++	0x007f, 0x782a, 0x007f, 0x7826, 0x3900, 0x783a, 0x7823, 0x8002,
++	0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2079, 0xa600,
++	0x7803, 0x0005, 0x0078, 0x1352, 0x007c, 0x2071, 0xa600, 0x715c,
++	0x712e, 0x2021, 0x0001, 0xa190, 0x002d, 0xa298, 0x002d, 0x0048,
++	0x136b, 0x7060, 0xa302, 0x00c8, 0x136b, 0x220a, 0x2208, 0x2310,
++	0x8420, 0x0078, 0x135d, 0x200b, 0x0000, 0x74aa, 0x74ae, 0x007c,
++	0x0e7e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa600, 0x70ac, 0xa0ea,
++	0x0010, 0x00c8, 0x137e, 0xa06e, 0x0078, 0x1388, 0x8001, 0x70ae,
++	0x702c, 0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807, 0x0000,
++	0x127f, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa600, 0x127e, 0x2091,
++	0x8000, 0x70ac, 0x8001, 0x00c8, 0x1398, 0xa06e, 0x0078, 0x13a1,
++	0x70ae, 0x702c, 0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807,
++	0x0000, 0x127f, 0x0e7f, 0x007c, 0x0e7e, 0x127e, 0x2091, 0x8000,
++	0x2071, 0xa600, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70ac, 0x8000,
++	0x70ae, 0x127f, 0x0e7f, 0x007c, 0x8dff, 0x0040, 0x13c0, 0x6804,
++	0x6807, 0x0000, 0x007e, 0x1078, 0x13a4, 0x0d7f, 0x0078, 0x13b4,
++	0x007c, 0x0e7e, 0x2071, 0xa600, 0x70ac, 0xa08a, 0x0010, 0xa00d,
++	0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa8d6, 0x7007, 0x0000, 0x701b,
++	0x0000, 0x701f, 0x0000, 0x2071, 0x0000, 0x7010, 0xa085, 0x8004,
++	0x7012, 0x0e7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x0e7e, 0x2270,
++	0x700b, 0x0000, 0x2071, 0xa8d6, 0x7018, 0xa088, 0xa8df, 0x220a,
++	0x8000, 0xa084, 0x0007, 0x701a, 0x7004, 0xa005, 0x00c0, 0x13f6,
++	0x0f7e, 0x2079, 0x0010, 0x1078, 0x1408, 0x0f7f, 0x0e7f, 0x127f,
++	0x007c, 0x0e7e, 0x2071, 0xa8d6, 0x7004, 0xa005, 0x00c0, 0x1406,
++	0x0f7e, 0x2079, 0x0010, 0x1078, 0x1408, 0x0f7f, 0x0e7f, 0x007c,
++	0x7000, 0x0079, 0x140b, 0x140f, 0x1479, 0x1496, 0x1496, 0x7018,
++	0x711c, 0xa106, 0x00c0, 0x1417, 0x7007, 0x0000, 0x007c, 0x0d7e,
++	0xa180, 0xa8df, 0x2004, 0x700a, 0x2068, 0x8108, 0xa18c, 0x0007,
++	0x711e, 0x7803, 0x0026, 0x6824, 0x7832, 0x6828, 0x7836, 0x682c,
++	0x783a, 0x6830, 0x783e, 0x6810, 0x700e, 0x680c, 0x7016, 0x6804,
++	0x0d7f, 0xd084, 0x0040, 0x1439, 0x7007, 0x0001, 0x1078, 0x143e,
++	0x007c, 0x7007, 0x0002, 0x1078, 0x1454, 0x007c, 0x017e, 0x027e,
++	0x710c, 0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x1449, 0x2110,
++	0xa006, 0x700e, 0x7212, 0x8203, 0x7822, 0x7803, 0x0020, 0x7803,
++	0x0041, 0x027f, 0x017f, 0x007c, 0x017e, 0x027e, 0x137e, 0x147e,
++	0x157e, 0x7014, 0x2098, 0x20a1, 0x0014, 0x7803, 0x0026, 0x710c,
++	0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x1468, 0x2110, 0xa006,
++	0x700e, 0x22a8, 0x53a6, 0x8203, 0x7822, 0x7803, 0x0020, 0x3300,
++	0x7016, 0x7803, 0x0001, 0x157f, 0x147f, 0x137f, 0x027f, 0x017f,
++	0x007c, 0x137e, 0x147e, 0x157e, 0x2099, 0xa6fa, 0x20a1, 0x0018,
++	0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, 0x2091, 0x8000,
++	0x7803, 0x0041, 0x7007, 0x0003, 0x7000, 0xc084, 0x7002, 0x700b,
++	0xa6f5, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x137e, 0x147e,
++	0x157e, 0x2001, 0xa729, 0x209c, 0x20a1, 0x0014, 0x7803, 0x0026,
++	0x2001, 0xa72a, 0x20ac, 0x53a6, 0x2099, 0xa72b, 0x20a1, 0x0018,
++	0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, 0x2091, 0x8000,
++	0x7803, 0x0001, 0x7007, 0x0004, 0x7000, 0xc08c, 0x7002, 0x700b,
++	0xa726, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x017e, 0x0e7e,
++	0x2071, 0xa8d6, 0x0f7e, 0x2079, 0x0010, 0x7904, 0x7803, 0x0002,
++	0xd1fc, 0x0040, 0x14d0, 0xa18c, 0x0700, 0x7004, 0x1079, 0x14d4,
++	0x0f7f, 0x0e7f, 0x017f, 0x007c, 0x1408, 0x14dc, 0x1509, 0x1531,
++	0x1564, 0x14da, 0x0078, 0x14da, 0xa18c, 0x0700, 0x00c0, 0x1502,
++	0x137e, 0x147e, 0x157e, 0x7014, 0x20a0, 0x2099, 0x0014, 0x7803,
++	0x0040, 0x7010, 0x20a8, 0x53a5, 0x3400, 0x7016, 0x157f, 0x147f,
++	0x137f, 0x700c, 0xa005, 0x0040, 0x151e, 0x1078, 0x143e, 0x007c,
++	0x7008, 0xa080, 0x0002, 0x2003, 0x0100, 0x7007, 0x0000, 0x1078,
++	0x1408, 0x007c, 0x7008, 0xa080, 0x0002, 0x2003, 0x0200, 0x0078,
++	0x14fd, 0xa18c, 0x0700, 0x00c0, 0x1514, 0x700c, 0xa005, 0x0040,
++	0x151e, 0x1078, 0x1454, 0x007c, 0x7008, 0xa080, 0x0002, 0x2003,
++	0x0200, 0x7007, 0x0000, 0x1078, 0x1408, 0x007c, 0x0d7e, 0x7008,
++	0x2068, 0x7830, 0x6826, 0x7834, 0x682a, 0x7838, 0x682e, 0x783c,
++	0x6832, 0x680b, 0x0100, 0x0d7f, 0x7007, 0x0000, 0x1078, 0x1408,
++	0x007c, 0xa18c, 0x0700, 0x00c0, 0x155e, 0x137e, 0x147e, 0x157e,
++	0x2001, 0xa6f8, 0x2004, 0xa080, 0x000d, 0x20a0, 0x2099, 0x0014,
++	0x7803, 0x0040, 0x20a9, 0x0020, 0x53a5, 0x2001, 0xa6fa, 0x2004,
++	0xd0bc, 0x0040, 0x1554, 0x2001, 0xa703, 0x2004, 0xa080, 0x000d,
++	0x20a0, 0x20a9, 0x0020, 0x53a5, 0x157f, 0x147f, 0x137f, 0x7007,
++	0x0000, 0x1078, 0x4f8c, 0x1078, 0x1408, 0x007c, 0x2011, 0x8003,
++	0x1078, 0x361b, 0x0078, 0x1562, 0xa18c, 0x0700, 0x00c0, 0x1571,
++	0x2001, 0xa728, 0x2003, 0x0100, 0x7007, 0x0000, 0x1078, 0x1408,
++	0x007c, 0x2011, 0x8004, 0x1078, 0x361b, 0x0078, 0x1575, 0x127e,
++	0x2091, 0x2100, 0x2079, 0x0030, 0x2071, 0xa8e7, 0x7803, 0x0004,
++	0x7003, 0x0000, 0x700f, 0xa8ed, 0x7013, 0xa8ed, 0x780f, 0x0076,
++	0x7803, 0x0004, 0x127f, 0x007c, 0x6934, 0xa184, 0x0007, 0x0079,
++	0x1591, 0x1599, 0x15df, 0x1599, 0x1599, 0x1599, 0x15c4, 0x15a8,
++	0x159d, 0xa085, 0x0001, 0x0078, 0x15f9, 0x684c, 0xd0bc, 0x0040,
++	0x1599, 0x6860, 0x682e, 0x685c, 0x682a, 0x6858, 0x0078, 0x15e7,
++	0xa18c, 0x00ff, 0xa186, 0x001e, 0x00c0, 0x1599, 0x684c, 0xd0bc,
++	0x0040, 0x1599, 0x6860, 0x682e, 0x685c, 0x682a, 0x6804, 0x681a,
++	0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004,
++	0x6832, 0x6858, 0x0078, 0x15ef, 0xa18c, 0x00ff, 0xa186, 0x0015,
++	0x00c0, 0x1599, 0x684c, 0xd0ac, 0x0040, 0x1599, 0x6804, 0x681a,
++	0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004,
++	0x6832, 0xa006, 0x682e, 0x682a, 0x6858, 0x0078, 0x15ef, 0x684c,
++	0xd0ac, 0x0040, 0x1599, 0xa006, 0x682e, 0x682a, 0x6858, 0xa18c,
++	0x000f, 0xa188, 0x206a, 0x210c, 0x6932, 0x2d08, 0x691a, 0x6826,
++	0x684c, 0xc0dd, 0x684e, 0xa006, 0x680a, 0x697c, 0x6912, 0x6980,
++	0x6916, 0x007c, 0x20e1, 0x0007, 0x20e1, 0x2000, 0x2001, 0x020a,
++	0x2004, 0x82ff, 0x0040, 0x161c, 0xa280, 0x0004, 0x0d7e, 0x206c,
++	0x684c, 0xd0dc, 0x00c0, 0x1618, 0x1078, 0x158c, 0x0040, 0x1618,
++	0x0d7f, 0xa280, 0x0000, 0x2003, 0x0002, 0xa016, 0x0078, 0x161c,
++	0x6808, 0x8000, 0x680a, 0x0d7f, 0x127e, 0x047e, 0x037e, 0x027e,
++	0x2091, 0x2100, 0x027f, 0x037f, 0x047f, 0x7000, 0xa005, 0x00c0,
++	0x1630, 0x7206, 0x2001, 0x1651, 0x007e, 0x2260, 0x0078, 0x17e0,
++	0x710c, 0x220a, 0x8108, 0x230a, 0x8108, 0x240a, 0x8108, 0xa182,
++	0xa908, 0x0048, 0x163d, 0x2009, 0xa8ed, 0x710e, 0x7010, 0xa102,
++	0xa082, 0x0009, 0x0040, 0x1648, 0xa080, 0x001b, 0x00c0, 0x164b,
++	0x2009, 0x0138, 0x200a, 0x7000, 0xa005, 0x00c0, 0x1651, 0x1078,
++	0x17c1, 0x127f, 0x007c, 0x127e, 0x027e, 0x037e, 0x0c7e, 0x007e,
++	0x2091, 0x2100, 0x007f, 0x047f, 0x037f, 0x027f, 0x0d7e, 0x0c7e,
++	0x2460, 0x6110, 0x2168, 0x6a62, 0x6b5e, 0xa005, 0x0040, 0x16dd,
++	0x6808, 0xa005, 0x0040, 0x174a, 0x7000, 0xa005, 0x00c0, 0x1672,
++	0x0078, 0x16d2, 0x700c, 0x7110, 0xa106, 0x00c0, 0x1753, 0x7004,
++	0xa406, 0x00c0, 0x16d2, 0x2001, 0x0005, 0x2004, 0xd08c, 0x0040,
++	0x168f, 0x047e, 0x1078, 0x1913, 0x047f, 0x2460, 0x6010, 0xa080,
++	0x0002, 0x2004, 0xa005, 0x0040, 0x174a, 0x0078, 0x166c, 0x2001,
++	0x0207, 0x2004, 0xd09c, 0x00c0, 0x167b, 0x7804, 0xa084, 0x6000,
++	0x0040, 0x16a0, 0xa086, 0x6000, 0x0040, 0x16a0, 0x0078, 0x167b,
++	0x7100, 0xa186, 0x0002, 0x00c0, 0x16c0, 0x0e7e, 0x2b68, 0x6818,
++	0x2060, 0x1078, 0x203f, 0x2804, 0xac70, 0x6034, 0xd09c, 0x00c0,
++	0x16b5, 0x7108, 0x720c, 0x0078, 0x16b7, 0x7110, 0x7214, 0x6810,
++	0xa100, 0x6812, 0x6814, 0xa201, 0x6816, 0x0e7f, 0x0078, 0x16c4,
++	0xa186, 0x0001, 0x00c0, 0x16cc, 0x7820, 0x6910, 0xa100, 0x6812,
++	0x7824, 0x6914, 0xa101, 0x6816, 0x7803, 0x0004, 0x7003, 0x0000,
++	0x7004, 0x2060, 0x6100, 0xa18e, 0x0004, 0x00c0, 0x1753, 0x2009,
++	0x0048, 0x1078, 0x775c, 0x0078, 0x1753, 0x6808, 0xa005, 0x0040,
++	0x174a, 0x7000, 0xa005, 0x00c0, 0x16e7, 0x0078, 0x174a, 0x700c,
++	0x7110, 0xa106, 0x00c0, 0x16f0, 0x7004, 0xa406, 0x00c0, 0x174a,
++	0x2001, 0x0005, 0x2004, 0xd08c, 0x0040, 0x1704, 0x047e, 0x1078,
++	0x1913, 0x047f, 0x2460, 0x6010, 0xa080, 0x0002, 0x2004, 0xa005,
++	0x0040, 0x174a, 0x0078, 0x16e1, 0x2001, 0x0207, 0x2004, 0xd09c,
++	0x00c0, 0x16f0, 0x2001, 0x0005, 0x2004, 0xd08c, 0x00c0, 0x16f6,
++	0x7804, 0xa084, 0x6000, 0x0040, 0x171b, 0xa086, 0x6000, 0x0040,
++	0x171b, 0x0078, 0x16f0, 0x7007, 0x0000, 0xa016, 0x2218, 0x7000,
++	0xa08e, 0x0001, 0x0040, 0x173c, 0xa08e, 0x0002, 0x00c0, 0x174a,
++	0x0c7e, 0x0e7e, 0x6818, 0x2060, 0x1078, 0x203f, 0x2804, 0xac70,
++	0x6034, 0xd09c, 0x00c0, 0x1738, 0x7308, 0x720c, 0x0078, 0x173a,
++	0x7310, 0x7214, 0x0e7f, 0x0c7f, 0x7820, 0xa318, 0x7824, 0xa211,
++	0x6810, 0xa300, 0x6812, 0x6814, 0xa201, 0x6816, 0x7803, 0x0004,
++	0x7003, 0x0000, 0x6100, 0xa18e, 0x0004, 0x00c0, 0x1753, 0x2009,
++	0x0048, 0x1078, 0x775c, 0x0c7f, 0x0d7f, 0x127f, 0x007c, 0x0f7e,
++	0x0e7e, 0x027e, 0x037e, 0x047e, 0x057e, 0x2071, 0xa8e7, 0x7000,
++	0xa086, 0x0000, 0x0040, 0x17ba, 0x7004, 0xac06, 0x00c0, 0x17ab,
++	0x2079, 0x0030, 0x7000, 0xa086, 0x0003, 0x0040, 0x17ab, 0x7804,
++	0xd0fc, 0x00c0, 0x17a7, 0x20e1, 0x6000, 0x2011, 0x0032, 0x2001,
++	0x0208, 0x200c, 0x2001, 0x0209, 0x2004, 0xa106, 0x00c0, 0x176f,
++	0x8211, 0x00c0, 0x1777, 0x7804, 0xd0fc, 0x00c0, 0x17a7, 0x1078,
++	0x1b22, 0x027e, 0x057e, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0,
++	0x178d, 0x7803, 0x0002, 0x7803, 0x0009, 0x7003, 0x0003, 0x7007,
++	0x0000, 0x057f, 0x027f, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001,
++	0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0078, 0x17ab, 0x1078,
++	0x1913, 0x0078, 0x175f, 0x157e, 0x20a9, 0x0009, 0x2009, 0xa8ed,
++	0x2104, 0xac06, 0x00c0, 0x17b5, 0x200a, 0xa188, 0x0003, 0x00f0,
++	0x17b0, 0x157f, 0x057f, 0x047f, 0x037f, 0x027f, 0x0e7f, 0x0f7f,
++	0x007c, 0x700c, 0x7110, 0xa106, 0x00c0, 0x17c9, 0x7003, 0x0000,
++	0x007c, 0x2104, 0x7006, 0x2060, 0x8108, 0x211c, 0x8108, 0x2124,
++	0x8108, 0xa182, 0xa908, 0x0048, 0x17d7, 0x2009, 0xa8ed, 0x7112,
++	0x700c, 0xa106, 0x00c0, 0x17e0, 0x2001, 0x0138, 0x2003, 0x0008,
++	0x8cff, 0x00c0, 0x17e7, 0x1078, 0x1b4d, 0x0078, 0x1854, 0x6010,
++	0x2068, 0x2d58, 0x6828, 0xa406, 0x00c0, 0x17f2, 0x682c, 0xa306,
++	0x0040, 0x182f, 0x601c, 0xa086, 0x0008, 0x0040, 0x182f, 0x6024,
++	0xd0f4, 0x00c0, 0x181c, 0xd0d4, 0x0040, 0x1818, 0x6038, 0xa402,
++	0x6034, 0xa303, 0x0040, 0x1806, 0x00c8, 0x1818, 0x643a, 0x6336,
++	0x6c2a, 0x6b2e, 0x047e, 0x037e, 0x2400, 0x6c7c, 0xa402, 0x6812,
++	0x2300, 0x6b80, 0xa303, 0x6816, 0x037f, 0x047f, 0x0078, 0x181c,
++	0x1078, 0x9053, 0x0040, 0x17e3, 0x2001, 0xa674, 0x2004, 0xd0b4,
++	0x00c0, 0x182b, 0x6018, 0x2004, 0xd0bc, 0x00c0, 0x182b, 0x6817,
++	0x7fff, 0x6813, 0xffff, 0x1078, 0x208a, 0x00c0, 0x17e3, 0x0c7e,
++	0x7004, 0x2060, 0x6024, 0xc0d4, 0x6026, 0x0c7f, 0x684c, 0xd0f4,
++	0x0040, 0x1840, 0x6817, 0xffff, 0x6813, 0xffff, 0x0078, 0x17e3,
++	0x6824, 0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc,
++	0x000f, 0x2009, 0x0011, 0x1078, 0x1855, 0x0040, 0x1853, 0x2009,
++	0x0001, 0x1078, 0x1855, 0x2d58, 0x007c, 0x8aff, 0x0040, 0x18ec,
++	0xa03e, 0x2730, 0x6850, 0xd0fc, 0x00c0, 0x1877, 0xd0f4, 0x00c0,
++	0x1887, 0x0d7e, 0x2804, 0xac68, 0x2900, 0x0079, 0x1867, 0x18ce,
++	0x188e, 0x188e, 0x18ce, 0x18ce, 0x18c6, 0x18ce, 0x188e, 0x18ce,
++	0x1894, 0x1894, 0x18ce, 0x18ce, 0x18ce, 0x18bd, 0x1894, 0xc0fc,
++	0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0x0d7e, 0xd99c, 0x0040,
++	0x18d1, 0x2804, 0xac68, 0x6f08, 0x6e0c, 0x0078, 0x18d1, 0xc0f4,
++	0x6852, 0x6b6c, 0x6a70, 0x0d7e, 0x0078, 0x18d8, 0x6b08, 0x6a0c,
++	0x6d00, 0x6c04, 0x0078, 0x18d1, 0x7b0c, 0xd3bc, 0x0040, 0x18b5,
++	0x7004, 0x0e7e, 0x2070, 0x701c, 0x0e7f, 0xa086, 0x0008, 0x00c0,
++	0x18b5, 0x7b08, 0xa39c, 0x0fff, 0x2d20, 0x0d7f, 0x0d7e, 0x6a14,
++	0x82ff, 0x00c0, 0x18b0, 0x6810, 0xa302, 0x0048, 0x18b0, 0x6b10,
++	0x2011, 0x0000, 0x2468, 0x0078, 0x18b7, 0x6b10, 0x6a14, 0x6d00,
++	0x6c04, 0x6f08, 0x6e0c, 0x0078, 0x18d1, 0x0d7f, 0x0d7e, 0x6834,
++	0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x18ce, 0x0d7f, 0x1078,
++	0x2026, 0x00c0, 0x1855, 0xa00e, 0x0078, 0x18ec, 0x0d7f, 0x1078,
++	0x1332, 0x7b22, 0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902,
++	0x7000, 0x8000, 0x7002, 0x0d7f, 0x6828, 0xa300, 0x682a, 0x682c,
++	0xa201, 0x682e, 0x2300, 0x6b10, 0xa302, 0x6812, 0x2200, 0x6a14,
++	0xa203, 0x6816, 0x1078, 0x2026, 0x007c, 0x1078, 0x1332, 0x1078,
++	0x1c97, 0x7004, 0x2060, 0x0d7e, 0x6010, 0x2068, 0x7003, 0x0000,
++	0x1078, 0x1af4, 0x1078, 0x8d06, 0x0040, 0x190c, 0x6808, 0x8001,
++	0x680a, 0x697c, 0x6912, 0x6980, 0x6916, 0x682b, 0xffff, 0x682f,
++	0xffff, 0x6850, 0xc0bd, 0x6852, 0x0d7f, 0x1078, 0x8a01, 0x0078,
++	0x1adb, 0x1078, 0x1332, 0x127e, 0x2091, 0x2100, 0x007e, 0x017e,
++	0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700,
++	0x00c0, 0x18ef, 0xa184, 0x0003, 0xa086, 0x0003, 0x0040, 0x1911,
++	0x7000, 0x0079, 0x192b, 0x1933, 0x1935, 0x1a34, 0x1ab2, 0x1ac9,
++	0x1933, 0x1933, 0x1933, 0x1078, 0x1332, 0x8001, 0x7002, 0xa184,
++	0x0880, 0x00c0, 0x194a, 0x8aff, 0x0040, 0x19d4, 0x2009, 0x0001,
++	0x1078, 0x1855, 0x0040, 0x1adb, 0x2009, 0x0001, 0x1078, 0x1855,
++	0x0078, 0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc, 0x00c0,
++	0x19b2, 0x027e, 0x037e, 0x017e, 0x7808, 0xd0ec, 0x00c0, 0x1962,
++	0x7c20, 0x7d24, 0x7e30, 0x7f34, 0x7803, 0x0009, 0x7003, 0x0004,
++	0x0078, 0x1964, 0x1078, 0x1bd7, 0x017f, 0xd194, 0x0040, 0x196b,
++	0x8aff, 0x0040, 0x19a1, 0x6b28, 0x6a2c, 0x2400, 0x686e, 0xa31a,
++	0x2500, 0x6872, 0xa213, 0x6b2a, 0x6a2e, 0x0c7e, 0x7004, 0x2060,
++	0x6024, 0xd0f4, 0x00c0, 0x197e, 0x633a, 0x6236, 0x0c7f, 0x2400,
++	0x6910, 0xa100, 0x6812, 0x2500, 0x6914, 0xa101, 0x6816, 0x037f,
++	0x027f, 0x2600, 0x681e, 0x2700, 0x6822, 0x1078, 0x203f, 0x2a00,
++	0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x6850, 0xc0fd, 0x6852,
++	0x6808, 0x8001, 0x680a, 0x00c0, 0x19a7, 0x684c, 0xd0e4, 0x0040,
++	0x19a7, 0x7004, 0x2060, 0x2009, 0x0048, 0x1078, 0x775c, 0x7000,
++	0xa086, 0x0004, 0x0040, 0x1adb, 0x7003, 0x0000, 0x1078, 0x17c1,
++	0x0078, 0x1adb, 0x057e, 0x7d0c, 0xd5bc, 0x00c0, 0x19b9, 0x1078,
++	0xa57e, 0x057f, 0x1078, 0x1af4, 0x0f7e, 0x7004, 0x2078, 0x1078,
++	0x4963, 0x0040, 0x19c6, 0x7824, 0xc0f5, 0x7826, 0x0f7f, 0x682b,
++	0xffff, 0x682f, 0xffff, 0x6808, 0x8001, 0x680a, 0x697c, 0x6912,
++	0x6980, 0x6916, 0x0078, 0x1adb, 0x7004, 0x0c7e, 0x2060, 0x6024,
++	0x0c7f, 0xd0f4, 0x0040, 0x19e1, 0x6808, 0x8001, 0x680a, 0x0078,
++	0x19f5, 0x684c, 0xc0f5, 0x684e, 0x7814, 0xa005, 0x00c0, 0x19f9,
++	0x7003, 0x0000, 0x6808, 0x8001, 0x680a, 0x00c0, 0x19f5, 0x7004,
++	0x2060, 0x2009, 0x0048, 0x1078, 0x775c, 0x1078, 0x17c1, 0x0078,
++	0x1adb, 0x7814, 0x6910, 0xa102, 0x6812, 0x6914, 0xa183, 0x0000,
++	0x6816, 0x7814, 0x7908, 0xa18c, 0x0fff, 0xa192, 0x0841, 0x00c8,
++	0x18ef, 0xa188, 0x0007, 0x8114, 0x8214, 0x8214, 0xa10a, 0x8104,
++	0x8004, 0x8004, 0xa20a, 0x810b, 0x810b, 0x810b, 0x1078, 0x1b5e,
++	0x7803, 0x0004, 0x780f, 0xffff, 0x7803, 0x0001, 0x7804, 0xd0fc,
++	0x0040, 0x1a1e, 0x7803, 0x0002, 0x7803, 0x0004, 0x780f, 0x0076,
++	0x7004, 0x7007, 0x0000, 0x2060, 0x2009, 0x0048, 0x1078, 0x775c,
++	0x1078, 0x1b92, 0x0040, 0x19f5, 0x8001, 0x7002, 0xd194, 0x0040,
++	0x1a46, 0x7804, 0xd0fc, 0x00c0, 0x191b, 0x8aff, 0x0040, 0x1adb,
++	0x2009, 0x0001, 0x1078, 0x1855, 0x0078, 0x1adb, 0xa184, 0x0880,
++	0x00c0, 0x1a53, 0x8aff, 0x0040, 0x1adb, 0x2009, 0x0001, 0x1078,
++	0x1855, 0x0078, 0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc,
++	0x00c0, 0x1a93, 0x027e, 0x037e, 0x7808, 0xd0ec, 0x00c0, 0x1a66,
++	0x7803, 0x0009, 0x7003, 0x0004, 0x0078, 0x1a68, 0x1078, 0x1bd7,
++	0x6b28, 0x6a2c, 0x1078, 0x203f, 0x0d7e, 0x0f7e, 0x2d78, 0x2804,
++	0xac68, 0x6034, 0xd09c, 0x00c0, 0x1a83, 0x6808, 0x2008, 0xa31a,
++	0x680c, 0xa213, 0x7810, 0xa100, 0x7812, 0x690c, 0x7814, 0xa101,
++	0x7816, 0x0078, 0x1a8f, 0x6810, 0x2008, 0xa31a, 0x6814, 0xa213,
++	0x7810, 0xa100, 0x7812, 0x6914, 0x7814, 0xa101, 0x7816, 0x0f7f,
++	0x0d7f, 0x0078, 0x196d, 0x057e, 0x7d0c, 0x1078, 0xa57e, 0x057f,
++	0x1078, 0x1af4, 0x0f7e, 0x7004, 0x2078, 0x1078, 0x4963, 0x0040,
++	0x1aa4, 0x7824, 0xc0f5, 0x7826, 0x0f7f, 0x682b, 0xffff, 0x682f,
++	0xffff, 0x6808, 0x8001, 0x680a, 0x697c, 0x6912, 0x6980, 0x6916,
++	0x0078, 0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0xa00d,
++	0x0040, 0x1ac5, 0x6808, 0x8001, 0x680a, 0x00c0, 0x1ac5, 0x7004,
++	0x2060, 0x2009, 0x0048, 0x1078, 0x775c, 0x1078, 0x17c1, 0x0078,
++	0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x6010,
++	0xa005, 0x0040, 0x1ac5, 0x2068, 0x6808, 0x8000, 0x680a, 0x6c28,
++	0x6b2c, 0x1078, 0x17e0, 0x017f, 0x007f, 0x127f, 0x007c, 0x127e,
++	0x2091, 0x2100, 0x7000, 0xa086, 0x0003, 0x00c0, 0x1af2, 0x700c,
++	0x7110, 0xa106, 0x0040, 0x1af2, 0x20e1, 0x9028, 0x700f, 0xa8ed,
++	0x7013, 0xa8ed, 0x127f, 0x007c, 0x0c7e, 0x1078, 0x1b22, 0x20e1,
++	0x9028, 0x700c, 0x7110, 0xa106, 0x0040, 0x1b19, 0x2104, 0xa005,
++	0x0040, 0x1b08, 0x2060, 0x6010, 0x2060, 0x6008, 0x8001, 0x600a,
++	0xa188, 0x0003, 0xa182, 0xa908, 0x0048, 0x1b10, 0x2009, 0xa8ed,
++	0x7112, 0x700c, 0xa106, 0x00c0, 0x1af9, 0x2011, 0x0008, 0x0078,
++	0x1af9, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0138, 0x2202,
++	0x0c7f, 0x007c, 0x2001, 0x0138, 0x2014, 0x2003, 0x0000, 0x2021,
++	0xb015, 0x2001, 0x0141, 0x201c, 0xd3dc, 0x00c0, 0x1b3f, 0x2001,
++	0x0109, 0x201c, 0xa39c, 0x0048, 0x00c0, 0x1b3f, 0x2001, 0x0111,
++	0x201c, 0x83ff, 0x00c0, 0x1b3f, 0x8421, 0x00c0, 0x1b29, 0x007c,
++	0x2011, 0x0201, 0x2009, 0x003c, 0x2204, 0xa005, 0x00c0, 0x1b4c,
++	0x8109, 0x00c0, 0x1b44, 0x007c, 0x007c, 0x1078, 0x1b40, 0x0040,
++	0x1b55, 0x780c, 0xd0a4, 0x0040, 0x1b5b, 0x1078, 0x1af4, 0xa085,
++	0x0001, 0x0078, 0x1b5d, 0x1078, 0x1b92, 0x007c, 0x0e7e, 0x2071,
++	0x0200, 0x7808, 0xa084, 0xf000, 0xa10d, 0x1078, 0x1b22, 0x2019,
++	0x5000, 0x8319, 0x0040, 0x1b7c, 0x2001, 0xa908, 0x2004, 0xa086,
++	0x0000, 0x0040, 0x1b7c, 0x2001, 0x0021, 0xd0fc, 0x0040, 0x1b69,
++	0x1078, 0x1eaa, 0x0078, 0x1b67, 0x20e1, 0x7000, 0x7324, 0x7420,
++	0x7028, 0x7028, 0x7426, 0x7037, 0x0001, 0x810f, 0x712e, 0x702f,
++	0x0100, 0x7037, 0x0008, 0x7326, 0x7422, 0x2001, 0x0138, 0x2202,
++	0x0e7f, 0x007c, 0x027e, 0x2001, 0x015d, 0x2001, 0x0000, 0x7908,
++	0xa18c, 0x0fff, 0xa182, 0x0ffd, 0x0048, 0x1ba0, 0x2009, 0x0000,
++	0xa190, 0x0007, 0xa294, 0x1ff8, 0x8214, 0x8214, 0x8214, 0x2001,
++	0x020a, 0x82ff, 0x0040, 0x1bb5, 0x20e1, 0x6000, 0x200c, 0x200c,
++	0x200c, 0x200c, 0x8211, 0x00c0, 0x1bae, 0x20e1, 0x7000, 0x200c,
++	0x200c, 0x7003, 0x0000, 0x20e1, 0x6000, 0x2001, 0x0208, 0x200c,
++	0x2001, 0x0209, 0x2004, 0xa106, 0x0040, 0x1bd4, 0x1078, 0x1b40,
++	0x0040, 0x1bd2, 0x7908, 0xd1ec, 0x00c0, 0x1bd4, 0x790c, 0xd1a4,
++	0x0040, 0x1b97, 0x1078, 0x1af4, 0xa006, 0x027f, 0x007c, 0x7c20,
++	0x7d24, 0x7e30, 0x7f34, 0x700c, 0x7110, 0xa106, 0x0040, 0x1c69,
++	0x7004, 0x017e, 0x210c, 0xa106, 0x017f, 0x0040, 0x1c69, 0x0d7e,
++	0x0c7e, 0x216c, 0x2d00, 0xa005, 0x0040, 0x1c67, 0x681c, 0xa086,
++	0x0008, 0x0040, 0x1c67, 0x6824, 0xd0d4, 0x00c0, 0x1c67, 0x6810,
++	0x2068, 0x6850, 0xd0fc, 0x0040, 0x1c29, 0x8108, 0x2104, 0x6b2c,
++	0xa306, 0x00c0, 0x1c67, 0x8108, 0x2104, 0x6a28, 0xa206, 0x00c0,
++	0x1c67, 0x6850, 0xc0fc, 0xc0f5, 0x6852, 0x686c, 0x7822, 0x6870,
++	0x7826, 0x681c, 0x7832, 0x6820, 0x7836, 0x6818, 0x2060, 0x6034,
++	0xd09c, 0x0040, 0x1c24, 0x6830, 0x2004, 0xac68, 0x6808, 0x783a,
++	0x680c, 0x783e, 0x0078, 0x1c65, 0xa006, 0x783a, 0x783e, 0x0078,
++	0x1c65, 0x8108, 0x2104, 0xa005, 0x00c0, 0x1c67, 0x6b2c, 0xa306,
++	0x00c0, 0x1c67, 0x8108, 0x2104, 0xa005, 0x00c0, 0x1c67, 0x6a28,
++	0xa206, 0x00c0, 0x1c67, 0x6850, 0xc0f5, 0x6852, 0x6830, 0x2004,
++	0x6918, 0xa160, 0xa180, 0x000d, 0x2004, 0xd09c, 0x00c0, 0x1c57,
++	0x6008, 0x7822, 0x686e, 0x600c, 0x7826, 0x6872, 0x6000, 0x7832,
++	0x6004, 0x7836, 0xa006, 0x783a, 0x783e, 0x0078, 0x1c65, 0x6010,
++	0x7822, 0x686e, 0x6014, 0x7826, 0x6872, 0x6000, 0x7832, 0x6004,
++	0x7836, 0x6008, 0x783a, 0x600c, 0x783e, 0x7803, 0x0011, 0x0c7f,
++	0x0d7f, 0x007c, 0x0f7e, 0x0e7e, 0x017e, 0x027e, 0x2071, 0xa8e7,
++	0x2079, 0x0030, 0x2011, 0x0050, 0x7000, 0xa086, 0x0000, 0x0040,
++	0x1c92, 0x8211, 0x0040, 0x1c90, 0x2001, 0x0005, 0x2004, 0xd08c,
++	0x0040, 0x1c79, 0x7904, 0xa18c, 0x0780, 0x017e, 0x1078, 0x1913,
++	0x017f, 0x81ff, 0x00c0, 0x1c90, 0x2011, 0x0050, 0x0078, 0x1c74,
++	0xa085, 0x0001, 0x027f, 0x017f, 0x0e7f, 0x0f7f, 0x007c, 0x7803,
++	0x0004, 0x2009, 0x0064, 0x7804, 0xd0ac, 0x0040, 0x1ce8, 0x8109,
++	0x00c0, 0x1c9b, 0x2009, 0x0100, 0x210c, 0xa18a, 0x0003, 0x1048,
++	0x1332, 0x1078, 0x1fca, 0x0e7e, 0x0f7e, 0x2071, 0xa8d6, 0x2079,
++	0x0010, 0x7004, 0xa086, 0x0000, 0x0040, 0x1ce0, 0x7800, 0x007e,
++	0x7820, 0x007e, 0x7830, 0x007e, 0x7834, 0x007e, 0x7838, 0x007e,
++	0x783c, 0x007e, 0x7803, 0x0004, 0x7823, 0x0000, 0x0005, 0x0005,
++	0x2079, 0x0030, 0x7804, 0xd0ac, 0x10c0, 0x1332, 0x2079, 0x0010,
++	0x007f, 0x783e, 0x007f, 0x783a, 0x007f, 0x7836, 0x007f, 0x7832,
++	0x007f, 0x7822, 0x007f, 0x7802, 0x0f7f, 0x0e7f, 0x0078, 0x1ce6,
++	0x0f7f, 0x0e7f, 0x7804, 0xd0ac, 0x10c0, 0x1332, 0x1078, 0x639b,
++	0x007c, 0x0e7e, 0x2071, 0xa908, 0x7003, 0x0000, 0x0e7f, 0x007c,
++	0x0d7e, 0xa280, 0x0004, 0x206c, 0x694c, 0xd1dc, 0x00c0, 0x1d6b,
++	0x6934, 0xa184, 0x0007, 0x0079, 0x1cfd, 0x1d05, 0x1d56, 0x1d05,
++	0x1d05, 0x1d05, 0x1d3b, 0x1d18, 0x1d07, 0x1078, 0x1332, 0x684c,
++	0xd0b4, 0x0040, 0x1e79, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a,
++	0x6812, 0x687c, 0x680a, 0x6880, 0x680e, 0x6958, 0x0078, 0x1d5e,
++	0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x1d05, 0x684c,
++	0xd0b4, 0x0040, 0x1e79, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a,
++	0x6812, 0x687c, 0x680a, 0x6880, 0x680e, 0x6804, 0x681a, 0xa080,
++	0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, 0x6832,
++	0x6958, 0x0078, 0x1d67, 0xa18c, 0x00ff, 0xa186, 0x0015, 0x00c0,
++	0x1d6b, 0x684c, 0xd0b4, 0x0040, 0x1e79, 0x6804, 0x681a, 0xa080,
++	0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, 0x6832,
++	0x6958, 0xa006, 0x682e, 0x682a, 0x0078, 0x1d67, 0x684c, 0xd0b4,
++	0x0040, 0x18ed, 0x6958, 0xa006, 0x682e, 0x682a, 0x2d00, 0x681a,
++	0x6834, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, 0x6832, 0x6926,
++	0x684c, 0xc0dd, 0x684e, 0x0d7f, 0x007c, 0x0f7e, 0x2079, 0x0020,
++	0x7804, 0xd0fc, 0x10c0, 0x1eaa, 0x0e7e, 0x0d7e, 0x2071, 0xa908,
++	0x7000, 0xa005, 0x00c0, 0x1df0, 0x0c7e, 0x7206, 0xa280, 0x0004,
++	0x205c, 0x7004, 0x2068, 0x7803, 0x0004, 0x6818, 0x0d7e, 0x2068,
++	0x686c, 0x7812, 0x6890, 0x0f7e, 0x20e1, 0x9040, 0x2079, 0x0200,
++	0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x0f7f, 0x0d7f, 0x2b68,
++	0x6824, 0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc,
++	0x000f, 0x6908, 0x2001, 0x04fd, 0x2004, 0xa086, 0x0007, 0x0040,
++	0x1db2, 0xa184, 0x0007, 0x0040, 0x1db2, 0x017e, 0x2009, 0x0008,
++	0xa102, 0x017f, 0xa108, 0x791a, 0x7116, 0x701e, 0x680c, 0xa081,
++	0x0000, 0x781e, 0x701a, 0xa006, 0x700e, 0x7012, 0x7004, 0x692c,
++	0x6814, 0xa106, 0x00c0, 0x1dc9, 0x6928, 0x6810, 0xa106, 0x0040,
++	0x1dd6, 0x037e, 0x047e, 0x6b14, 0x6c10, 0x1078, 0x208a, 0x047f,
++	0x037f, 0x0040, 0x1dd6, 0x0c7f, 0x0078, 0x1df0, 0x8aff, 0x00c0,
++	0x1dde, 0x0c7f, 0xa085, 0x0001, 0x0078, 0x1df0, 0x127e, 0x2091,
++	0x8000, 0x2079, 0x0020, 0x2009, 0x0001, 0x1078, 0x1df4, 0x0040,
++	0x1ded, 0x2009, 0x0001, 0x1078, 0x1df4, 0x127f, 0x0c7f, 0xa006,
++	0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x077e, 0x067e, 0x057e, 0x047e,
++	0x037e, 0x027e, 0x8aff, 0x0040, 0x1e72, 0x700c, 0x7214, 0xa23a,
++	0x7010, 0x7218, 0xa203, 0x0048, 0x1e71, 0xa705, 0x0040, 0x1e71,
++	0xa03e, 0x2730, 0x6850, 0xd0fc, 0x00c0, 0x1e24, 0x0d7e, 0x2804,
++	0xac68, 0x2900, 0x0079, 0x1e14, 0x1e53, 0x1e34, 0x1e34, 0x1e53,
++	0x1e53, 0x1e4b, 0x1e53, 0x1e34, 0x1e53, 0x1e3a, 0x1e3a, 0x1e53,
++	0x1e53, 0x1e53, 0x1e42, 0x1e3a, 0xc0fc, 0x6852, 0x6b6c, 0x6a70,
++	0x6d1c, 0x6c20, 0xd99c, 0x0040, 0x1e57, 0x0d7e, 0x2804, 0xac68,
++	0x6f08, 0x6e0c, 0x0078, 0x1e56, 0x6b08, 0x6a0c, 0x6d00, 0x6c04,
++	0x0078, 0x1e56, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c,
++	0x0078, 0x1e56, 0x0d7f, 0x0d7e, 0x6834, 0xa084, 0x00ff, 0xa086,
++	0x001e, 0x00c0, 0x1e53, 0x0d7f, 0x1078, 0x2026, 0x00c0, 0x1dfa,
++	0xa00e, 0x0078, 0x1e72, 0x0d7f, 0x1078, 0x1332, 0x0d7f, 0x7b22,
++	0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000, 0x8000,
++	0x7002, 0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x700c,
++	0xa300, 0x700e, 0x7010, 0xa201, 0x7012, 0x1078, 0x2026, 0x0078,
++	0x1e72, 0xa006, 0x027f, 0x037f, 0x047f, 0x057f, 0x067f, 0x077f,
++	0x007c, 0x1078, 0x1332, 0x027e, 0x2001, 0x0105, 0x2003, 0x0010,
++	0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060,
++	0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x1e92, 0x6850,
++	0xc0bd, 0x6852, 0x0d7f, 0x0c7e, 0x1078, 0x8a01, 0x0c7f, 0x2001,
++	0xa8c0, 0x2004, 0xac06, 0x00c0, 0x1ea7, 0x20e1, 0x9040, 0x1078,
++	0x738a, 0x2011, 0x0000, 0x1078, 0x70ea, 0x1078, 0x639b, 0x027f,
++	0x0078, 0x1f76, 0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x0f7e,
++	0x0e7e, 0x0d7e, 0x0c7e, 0x2079, 0x0020, 0x2071, 0xa908, 0x2b68,
++	0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700, 0x00c0,
++	0x1e7b, 0x7000, 0x0079, 0x1ec4, 0x1f76, 0x1ec8, 0x1f43, 0x1f74,
++	0x8001, 0x7002, 0xd19c, 0x00c0, 0x1edc, 0x8aff, 0x0040, 0x1efb,
++	0x2009, 0x0001, 0x1078, 0x1df4, 0x0040, 0x1f76, 0x2009, 0x0001,
++	0x1078, 0x1df4, 0x0078, 0x1f76, 0x7803, 0x0004, 0xd194, 0x0040,
++	0x1eec, 0x6850, 0xc0fc, 0x6852, 0x8aff, 0x00c0, 0x1ef1, 0x684c,
++	0xc0f5, 0x684e, 0x0078, 0x1ef1, 0x1078, 0x203f, 0x6850, 0xc0fd,
++	0x6852, 0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003,
++	0x0000, 0x0078, 0x1f76, 0x711c, 0x81ff, 0x0040, 0x1f11, 0x7918,
++	0x7922, 0x7827, 0x0000, 0x7803, 0x0001, 0x7000, 0x8000, 0x7002,
++	0x700c, 0xa100, 0x700e, 0x7010, 0xa081, 0x0000, 0x7012, 0x0078,
++	0x1f76, 0x0f7e, 0x027e, 0x781c, 0x007e, 0x7818, 0x007e, 0x2079,
++	0x0100, 0x7a14, 0xa284, 0x0004, 0xa085, 0x0012, 0x7816, 0x037e,
++	0x2019, 0x1000, 0x8319, 0x1040, 0x1332, 0x7820, 0xd0bc, 0x00c0,
++	0x1f22, 0x037f, 0x79c8, 0x007f, 0xa102, 0x017f, 0x007e, 0x017e,
++	0x79c4, 0x007f, 0xa103, 0x78c6, 0x007f, 0x78ca, 0xa284, 0x0004,
++	0xa085, 0x0012, 0x7816, 0x027f, 0x0f7f, 0x7803, 0x0008, 0x7003,
++	0x0000, 0x0078, 0x1f76, 0x8001, 0x7002, 0xd194, 0x0040, 0x1f58,
++	0x7804, 0xd0fc, 0x00c0, 0x1eba, 0xd19c, 0x00c0, 0x1f72, 0x8aff,
++	0x0040, 0x1f76, 0x2009, 0x0001, 0x1078, 0x1df4, 0x0078, 0x1f76,
++	0x027e, 0x037e, 0x6b28, 0x6a2c, 0x1078, 0x203f, 0x0d7e, 0x2804,
++	0xac68, 0x6034, 0xd09c, 0x00c0, 0x1f6b, 0x6808, 0xa31a, 0x680c,
++	0xa213, 0x0078, 0x1f6f, 0x6810, 0xa31a, 0x6814, 0xa213, 0x0d7f,
++	0x0078, 0x1eec, 0x0078, 0x1eec, 0x1078, 0x1332, 0x0c7f, 0x0d7f,
++	0x0e7f, 0x0f7f, 0x017f, 0x007f, 0x127f, 0x007c, 0x0f7e, 0x0e7e,
++	0x2071, 0xa908, 0x7000, 0xa086, 0x0000, 0x0040, 0x1fc7, 0x2079,
++	0x0020, 0x017e, 0x2009, 0x0207, 0x210c, 0xd194, 0x0040, 0x1fa4,
++	0x2009, 0x020c, 0x210c, 0xa184, 0x0003, 0x0040, 0x1fa4, 0x1078,
++	0xa5d2, 0x2001, 0x0133, 0x2004, 0xa005, 0x1040, 0x1332, 0x20e1,
++	0x9040, 0x2001, 0x020c, 0x2102, 0x2009, 0x0206, 0x2104, 0x2009,
++	0x0203, 0x210c, 0xa106, 0x00c0, 0x1faf, 0x20e1, 0x9040, 0x7804,
++	0xd0fc, 0x0040, 0x1f8a, 0x1078, 0x1eaa, 0x7000, 0xa086, 0x0000,
++	0x00c0, 0x1f8a, 0x017f, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0,
++	0x1fbd, 0x20e1, 0x9040, 0x7803, 0x0002, 0x7003, 0x0000, 0x0e7f,
++	0x0f7f, 0x007c, 0x027e, 0x0c7e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2071,
++	0xa908, 0x2079, 0x0020, 0x7000, 0xa086, 0x0000, 0x0040, 0x2003,
++	0x7004, 0x2060, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x1fed,
++	0x6850, 0xc0b5, 0x6852, 0x680c, 0x7a1c, 0xa206, 0x00c0, 0x1fed,
++	0x6808, 0x7a18, 0xa206, 0x0040, 0x2009, 0x2001, 0x0105, 0x2003,
++	0x0010, 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004,
++	0x2060, 0x1078, 0x8a01, 0x20e1, 0x9040, 0x1078, 0x738a, 0x2011,
++	0x0000, 0x1078, 0x70ea, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x027f,
++	0x007c, 0x6810, 0x6a14, 0xa205, 0x00c0, 0x1fed, 0x684c, 0xc0dc,
++	0x684e, 0x2c10, 0x1078, 0x1cf0, 0x2001, 0x0105, 0x2003, 0x0010,
++	0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x2069, 0xa8b1,
++	0x6833, 0x0000, 0x683f, 0x0000, 0x0078, 0x2003, 0x8840, 0x2804,
++	0xa005, 0x00c0, 0x203a, 0x6004, 0xa005, 0x0040, 0x203c, 0x681a,
++	0x2060, 0x6034, 0xa084, 0x000f, 0xa080, 0x206a, 0x2044, 0x88ff,
++	0x1040, 0x1332, 0x8a51, 0x007c, 0x2051, 0x0000, 0x007c, 0x8a50,
++	0x8841, 0x2804, 0xa005, 0x00c0, 0x2059, 0x2c00, 0xad06, 0x0040,
++	0x204e, 0x6000, 0xa005, 0x00c0, 0x204e, 0x2d00, 0x2060, 0x681a,
++	0x6034, 0xa084, 0x000f, 0xa080, 0x207a, 0x2044, 0x88ff, 0x1040,
++	0x1332, 0x007c, 0x0000, 0x0011, 0x0015, 0x0019, 0x001d, 0x0021,
++	0x0025, 0x0029, 0x0000, 0x000f, 0x0015, 0x001b, 0x0021, 0x0027,
++	0x0000, 0x0000, 0x0000, 0x205f, 0x205b, 0x0000, 0x0000, 0x2069,
++	0x0000, 0x205f, 0x0000, 0x2066, 0x2063, 0x0000, 0x0000, 0x0000,
++	0x2069, 0x2066, 0x0000, 0x2061, 0x2061, 0x0000, 0x0000, 0x2069,
++	0x0000, 0x2061, 0x0000, 0x2067, 0x2067, 0x0000, 0x0000, 0x0000,
++	0x2069, 0x2067, 0x0a7e, 0x097e, 0x087e, 0x6b2e, 0x6c2a, 0x6858,
++	0xa055, 0x0040, 0x212d, 0x2d60, 0x6034, 0xa0cc, 0x000f, 0xa9c0,
++	0x206a, 0xa986, 0x0007, 0x0040, 0x20a5, 0xa986, 0x000e, 0x0040,
++	0x20a5, 0xa986, 0x000f, 0x00c0, 0x20a9, 0x605c, 0xa422, 0x6060,
++	0xa31a, 0x2804, 0xa045, 0x00c0, 0x20b7, 0x0050, 0x20b1, 0x0078,
++	0x212d, 0x6004, 0xa065, 0x0040, 0x212d, 0x0078, 0x2094, 0x2804,
++	0xa005, 0x0040, 0x20d5, 0xac68, 0xd99c, 0x00c0, 0x20c5, 0x6808,
++	0xa422, 0x680c, 0xa31b, 0x0078, 0x20c9, 0x6810, 0xa422, 0x6814,
++	0xa31b, 0x0048, 0x20f4, 0x2300, 0xa405, 0x0040, 0x20db, 0x8a51,
++	0x0040, 0x212d, 0x8840, 0x0078, 0x20b7, 0x6004, 0xa065, 0x0040,
++	0x212d, 0x0078, 0x2094, 0x8a51, 0x0040, 0x212d, 0x8840, 0x2804,
++	0xa005, 0x00c0, 0x20ee, 0x6004, 0xa065, 0x0040, 0x212d, 0x6034,
++	0xa0cc, 0x000f, 0xa9c0, 0x206a, 0x2804, 0x2040, 0x2b68, 0x6850,
++	0xc0fc, 0x6852, 0x0078, 0x2121, 0x8422, 0x8420, 0x831a, 0xa399,
++	0x0000, 0x0d7e, 0x2b68, 0x6c6e, 0x6b72, 0x0d7f, 0xd99c, 0x00c0,
++	0x210f, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x1048,
++	0x1332, 0x6800, 0xa420, 0x6804, 0xa319, 0x0078, 0x211b, 0x6910,
++	0x2400, 0xa122, 0x6914, 0x2300, 0xa11b, 0x1048, 0x1332, 0x6800,
++	0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e, 0x6b22, 0x6850, 0xc0fd,
++	0x6852, 0x2c00, 0x681a, 0x2800, 0x6832, 0x2a00, 0x6826, 0x007f,
++	0x007f, 0x007f, 0xa006, 0x0078, 0x2132, 0x087f, 0x097f, 0x0a7f,
++	0xa085, 0x0001, 0x007c, 0x2001, 0x0005, 0x2004, 0xa084, 0x0007,
++	0x0079, 0x213a, 0x2142, 0x2143, 0x2146, 0x2149, 0x214e, 0x2151,
++	0x2156, 0x215b, 0x007c, 0x1078, 0x1eaa, 0x007c, 0x1078, 0x1913,
++	0x007c, 0x1078, 0x1913, 0x1078, 0x1eaa, 0x007c, 0x1078, 0x14be,
++	0x007c, 0x1078, 0x1eaa, 0x1078, 0x14be, 0x007c, 0x1078, 0x1913,
++	0x1078, 0x14be, 0x007c, 0x1078, 0x1913, 0x1078, 0x1eaa, 0x1078,
++	0x14be, 0x007c, 0x127e, 0x2091, 0x2300, 0x2079, 0x0200, 0x2071,
++	0xab80, 0x2069, 0xa600, 0x2009, 0x0004, 0x7912, 0x7817, 0x0004,
++	0x1078, 0x251f, 0x781b, 0x0002, 0x20e1, 0x8700, 0x127f, 0x007c,
++	0x127e, 0x2091, 0x2300, 0x781c, 0xa084, 0x0007, 0x0079, 0x2180,
++	0x21a4, 0x2188, 0x218c, 0x2190, 0x2196, 0x219a, 0x219e, 0x21a2,
++	0x1078, 0x548e, 0x0078, 0x21a4, 0x1078, 0x54da, 0x0078, 0x21a4,
++	0x1078, 0x548e, 0x1078, 0x54da, 0x0078, 0x21a4, 0x1078, 0x21a6,
++	0x0078, 0x21a4, 0x1078, 0x21a6, 0x0078, 0x21a4, 0x1078, 0x21a6,
++	0x0078, 0x21a4, 0x1078, 0x21a6, 0x127f, 0x007c, 0x007e, 0x017e,
++	0x027e, 0x1078, 0xa5d2, 0x7930, 0xa184, 0x0003, 0x0040, 0x21c9,
++	0x2001, 0xa8c0, 0x2004, 0xa005, 0x0040, 0x21c5, 0x2001, 0x0133,
++	0x2004, 0xa005, 0x1040, 0x1332, 0x0c7e, 0x2001, 0xa8c0, 0x2064,
++	0x1078, 0x8a01, 0x0c7f, 0x0078, 0x21f2, 0x20e1, 0x9040, 0x0078,
++	0x21f2, 0xa184, 0x0030, 0x0040, 0x21da, 0x6a00, 0xa286, 0x0003,
++	0x00c0, 0x21d4, 0x0078, 0x21d6, 0x1078, 0x4224, 0x20e1, 0x9010,
++	0x0078, 0x21f2, 0xa184, 0x00c0, 0x0040, 0x21ec, 0x0e7e, 0x037e,
++	0x047e, 0x057e, 0x2071, 0xa8e7, 0x1078, 0x1af4, 0x057f, 0x047f,
++	0x037f, 0x0e7f, 0x0078, 0x21f2, 0xa184, 0x0300, 0x0040, 0x21f2,
++	0x20e1, 0x9020, 0x7932, 0x027f, 0x017f, 0x007f, 0x007c, 0x017e,
++	0x0e7e, 0x0f7e, 0x2071, 0xa600, 0x7128, 0x2001, 0xa890, 0x2102,
++	0x2001, 0xa898, 0x2102, 0xa182, 0x0211, 0x00c8, 0x220b, 0x2009,
++	0x0008, 0x0078, 0x2235, 0xa182, 0x0259, 0x00c8, 0x2213, 0x2009,
++	0x0007, 0x0078, 0x2235, 0xa182, 0x02c1, 0x00c8, 0x221b, 0x2009,
++	0x0006, 0x0078, 0x2235, 0xa182, 0x0349, 0x00c8, 0x2223, 0x2009,
++	0x0005, 0x0078, 0x2235, 0xa182, 0x0421, 0x00c8, 0x222b, 0x2009,
++	0x0004, 0x0078, 0x2235, 0xa182, 0x0581, 0x00c8, 0x2233, 0x2009,
++	0x0003, 0x0078, 0x2235, 0x2009, 0x0002, 0x2079, 0x0200, 0x7912,
++	0x7817, 0x0004, 0x1078, 0x251f, 0x0f7f, 0x0e7f, 0x017f, 0x007c,
++	0x127e, 0x2091, 0x2200, 0x2061, 0x0100, 0x2071, 0xa600, 0x6024,
++	0x6026, 0x6053, 0x0030, 0x6033, 0x00ef, 0x60e7, 0x0000, 0x60eb,
++	0x00ef, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f,
++	0x0080, 0x602f, 0x0000, 0x6007, 0x0eaf, 0x600f, 0x00ff, 0x602b,
++	0x002f, 0x127f, 0x007c, 0x2001, 0xa630, 0x2003, 0x0000, 0x2001,
++	0xa62f, 0x2003, 0x0001, 0x007c, 0x127e, 0x2091, 0x2200, 0x007e,
++	0x017e, 0x027e, 0x6124, 0xa184, 0x002c, 0x00c0, 0x227b, 0xa184,
++	0x0007, 0x0079, 0x2281, 0xa195, 0x0004, 0xa284, 0x0007, 0x0079,
++	0x2281, 0x22ad, 0x2289, 0x228d, 0x2291, 0x2297, 0x229b, 0x22a1,
++	0x22a7, 0x1078, 0x5c56, 0x0078, 0x22ad, 0x1078, 0x5d45, 0x0078,
++	0x22ad, 0x1078, 0x5d45, 0x1078, 0x5c56, 0x0078, 0x22ad, 0x1078,
++	0x22b2, 0x0078, 0x22ad, 0x1078, 0x5c56, 0x1078, 0x22b2, 0x0078,
++	0x22ad, 0x1078, 0x5d45, 0x1078, 0x22b2, 0x0078, 0x22ad, 0x1078,
++	0x5d45, 0x1078, 0x5c56, 0x1078, 0x22b2, 0x027f, 0x017f, 0x007f,
++	0x127f, 0x007c, 0x6124, 0xd1ac, 0x0040, 0x23ac, 0x017e, 0x047e,
++	0x0c7e, 0x644c, 0xa486, 0xf0f0, 0x00c0, 0x22c5, 0x2061, 0x0100,
++	0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74c6, 0xa48c, 0xff00,
++	0x7034, 0xd084, 0x0040, 0x22dd, 0xa186, 0xf800, 0x00c0, 0x22dd,
++	0x703c, 0xd084, 0x00c0, 0x22dd, 0xc085, 0x703e, 0x037e, 0x2418,
++	0x2011, 0x8016, 0x1078, 0x361b, 0x037f, 0xa196, 0xff00, 0x0040,
++	0x231f, 0x6030, 0xa084, 0x00ff, 0x810f, 0xa116, 0x0040, 0x231f,
++	0x7130, 0xd184, 0x00c0, 0x231f, 0x2011, 0xa653, 0x2214, 0xd2ec,
++	0x0040, 0x22fa, 0xc18d, 0x7132, 0x2011, 0xa653, 0x2214, 0xd2ac,
++	0x00c0, 0x231f, 0x6240, 0xa294, 0x0010, 0x0040, 0x2306, 0x6248,
++	0xa294, 0xff00, 0xa296, 0xff00, 0x0040, 0x231f, 0x7030, 0xd08c,
++	0x0040, 0x2371, 0x7034, 0xd08c, 0x00c0, 0x2316, 0x2001, 0xa60c,
++	0x200c, 0xd1ac, 0x00c0, 0x2371, 0xc1ad, 0x2102, 0x037e, 0x73c4,
++	0x2011, 0x8013, 0x1078, 0x361b, 0x037f, 0x0078, 0x2371, 0x7034,
++	0xd08c, 0x00c0, 0x232b, 0x2001, 0xa60c, 0x200c, 0xd1ac, 0x00c0,
++	0x2371, 0xc1ad, 0x2102, 0x037e, 0x73c4, 0x2011, 0x8013, 0x1078,
++	0x361b, 0x037f, 0x7130, 0xc185, 0x7132, 0x2011, 0xa653, 0x220c,
++	0xd1a4, 0x0040, 0x2355, 0x017e, 0x2009, 0x0001, 0x2011, 0x0100,
++	0x1078, 0x5bf1, 0x2019, 0x000e, 0x1078, 0xa195, 0xa484, 0x00ff,
++	0xa080, 0x29c0, 0x200c, 0xa18c, 0xff00, 0x810f, 0x8127, 0xa006,
++	0x2009, 0x000e, 0x1078, 0xa21d, 0x017f, 0xd1ac, 0x00c0, 0x2362,
++	0x017e, 0x2009, 0x0000, 0x2019, 0x0004, 0x1078, 0x284f, 0x017f,
++	0x0078, 0x2371, 0x157e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x1078,
++	0x45c4, 0x00c0, 0x236d, 0x1078, 0x42f8, 0x8108, 0x00f0, 0x2367,
++	0x157f, 0x0c7f, 0x047f, 0x0f7e, 0x2079, 0xa8c4, 0x783c, 0xa086,
++	0x0000, 0x0040, 0x2383, 0x6027, 0x0004, 0x783f, 0x0000, 0x2079,
++	0x0140, 0x7803, 0x0000, 0x0f7f, 0x2011, 0x0003, 0x1078, 0x70e0,
++	0x2011, 0x0002, 0x1078, 0x70ea, 0x1078, 0x6fc4, 0x037e, 0x2019,
++	0x0000, 0x1078, 0x7058, 0x037f, 0x60e3, 0x0000, 0x017f, 0x2001,
++	0xa600, 0x2014, 0xa296, 0x0004, 0x00c0, 0x23a4, 0xd19c, 0x00c0,
++	0x23ac, 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0xa622,
++	0x2003, 0x0000, 0x6027, 0x0020, 0xd194, 0x0040, 0x2490, 0x0f7e,
++	0x2079, 0xa8c4, 0x783c, 0xa086, 0x0001, 0x00c0, 0x23d0, 0x017e,
++	0x6027, 0x0004, 0x783f, 0x0000, 0x2079, 0x0140, 0x7803, 0x1000,
++	0x7803, 0x0000, 0x2079, 0xa8b1, 0x7807, 0x0000, 0x7833, 0x0000,
++	0x1078, 0x62d1, 0x1078, 0x639b, 0x017f, 0x0f7f, 0x0078, 0x2490,
++	0x0f7f, 0x017e, 0x3900, 0xa082, 0xa9e3, 0x00c8, 0x23db, 0x017e,
++	0x1078, 0x747a, 0x017f, 0x6220, 0xd2b4, 0x0040, 0x2446, 0x1078,
++	0x5acb, 0x1078, 0x6e0f, 0x6027, 0x0004, 0x0f7e, 0x2019, 0xa8ba,
++	0x2304, 0xa07d, 0x0040, 0x241c, 0x7804, 0xa086, 0x0032, 0x00c0,
++	0x241c, 0x0d7e, 0x0c7e, 0x0e7e, 0x2069, 0x0140, 0x618c, 0x6288,
++	0x7818, 0x608e, 0x7808, 0x608a, 0x6043, 0x0002, 0x2001, 0x0003,
++	0x8001, 0x00c0, 0x2400, 0x6043, 0x0000, 0x6803, 0x1000, 0x6803,
++	0x0000, 0x618e, 0x628a, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x7810,
++	0x2070, 0x7037, 0x0103, 0x2f60, 0x1078, 0x772d, 0x0e7f, 0x0c7f,
++	0x0d7f, 0x0f7f, 0x017f, 0x007c, 0x0f7f, 0x0d7e, 0x2069, 0x0140,
++	0x6804, 0xa084, 0x4000, 0x0040, 0x2429, 0x6803, 0x1000, 0x6803,
++	0x0000, 0x0d7f, 0x0c7e, 0x2061, 0xa8b1, 0x6028, 0xa09a, 0x00c8,
++	0x00c8, 0x2439, 0x8000, 0x602a, 0x0c7f, 0x1078, 0x6e01, 0x0078,
++	0x248f, 0x2019, 0xa8ba, 0x2304, 0xa065, 0x0040, 0x2443, 0x2009,
++	0x0027, 0x1078, 0x775c, 0x0c7f, 0x0078, 0x248f, 0xd2bc, 0x0040,
++	0x248f, 0x1078, 0x5ad8, 0x6017, 0x0010, 0x6027, 0x0004, 0x0d7e,
++	0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0040, 0x245b, 0x6803,
++	0x1000, 0x6803, 0x0000, 0x0d7f, 0x0c7e, 0x2061, 0xa8b1, 0x6044,
++	0xa09a, 0x00c8, 0x00c8, 0x247e, 0x8000, 0x6046, 0x603c, 0x0c7f,
++	0xa005, 0x0040, 0x248f, 0x2009, 0x07d0, 0x1078, 0x5ad0, 0xa080,
++	0x0007, 0x2004, 0xa086, 0x0006, 0x00c0, 0x247a, 0x6017, 0x0012,
++	0x0078, 0x248f, 0x6017, 0x0016, 0x0078, 0x248f, 0x037e, 0x2019,
++	0x0001, 0x1078, 0x7058, 0x037f, 0x2019, 0xa8c0, 0x2304, 0xa065,
++	0x0040, 0x248e, 0x2009, 0x004f, 0x1078, 0x775c, 0x0c7f, 0x017f,
++	0xd19c, 0x0040, 0x24e4, 0x7034, 0xd0ac, 0x00c0, 0x24c1, 0x017e,
++	0x157e, 0x6027, 0x0008, 0x602f, 0x0020, 0x20a9, 0x000a, 0x00f0,
++	0x249f, 0x602f, 0x0000, 0x6150, 0xa185, 0x1400, 0x6052, 0x20a9,
++	0x0320, 0x00e0, 0x24a9, 0x2091, 0x6000, 0x6020, 0xd09c, 0x00c0,
++	0x24b8, 0x157f, 0x6152, 0x017f, 0x6027, 0x0008, 0x0078, 0x24e4,
++	0x1078, 0x2577, 0x00f0, 0x24a9, 0x157f, 0x6152, 0x017f, 0x6027,
++	0x0008, 0x017e, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, 0x1078,
++	0x70e0, 0x2011, 0x0002, 0x1078, 0x70ea, 0x1078, 0x6fc4, 0x037e,
++	0x2019, 0x0000, 0x1078, 0x7058, 0x037f, 0x60e3, 0x0000, 0x1078,
++	0xa5ad, 0x1078, 0xa5cb, 0x2001, 0xa600, 0x2003, 0x0004, 0x6027,
++	0x0008, 0x1078, 0x1246, 0x017f, 0xa18c, 0xffd0, 0x6126, 0x007c,
++	0x007e, 0x017e, 0x027e, 0x0e7e, 0x0f7e, 0x127e, 0x2091, 0x8000,
++	0x2071, 0xa600, 0x71bc, 0x70be, 0xa116, 0x0040, 0x2518, 0x81ff,
++	0x0040, 0x2500, 0x2011, 0x8011, 0x1078, 0x361b, 0x0078, 0x2518,
++	0x2011, 0x8012, 0x1078, 0x361b, 0x2001, 0xa672, 0x2004, 0xd0fc,
++	0x00c0, 0x2518, 0x037e, 0x0c7e, 0x1078, 0x6f9f, 0x2061, 0x0100,
++	0x2019, 0x0028, 0x2009, 0x0000, 0x1078, 0x284f, 0x0c7f, 0x037f,
++	0x127f, 0x0f7f, 0x0e7f, 0x027f, 0x017f, 0x007f, 0x007c, 0x0c7e,
++	0x0f7e, 0x007e, 0x027e, 0x2061, 0x0100, 0xa190, 0x253b, 0x2204,
++	0x60f2, 0x2011, 0x2548, 0x6000, 0xa082, 0x0003, 0x00c8, 0x2534,
++	0x2001, 0x00ff, 0x0078, 0x2535, 0x2204, 0x60ee, 0x027f, 0x007f,
++	0x0f7f, 0x0c7f, 0x007c, 0x0840, 0x0840, 0x0840, 0x0580, 0x0420,
++	0x0348, 0x02c0, 0x0258, 0x0210, 0x01a8, 0x01a8, 0x01a8, 0x01a8,
++	0x0140, 0x00f8, 0x00d0, 0x00b0, 0x00a0, 0x2028, 0xa18c, 0x00ff,
++	0x2130, 0xa094, 0xff00, 0x00c0, 0x2558, 0x81ff, 0x0040, 0x255c,
++	0x1078, 0x5761, 0x0078, 0x2563, 0xa080, 0x29c0, 0x200c, 0xa18c,
++	0xff00, 0x810f, 0xa006, 0x007c, 0xa080, 0x29c0, 0x200c, 0xa18c,
++	0x00ff, 0x007c, 0x0c7e, 0x2061, 0xa600, 0x6030, 0x0040, 0x2573,
++	0xc09d, 0x0078, 0x2574, 0xc09c, 0x6032, 0x0c7f, 0x007c, 0x007e,
++	0x157e, 0x0f7e, 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd08c,
++	0x00c0, 0x2584, 0x00f0, 0x257e, 0x0f7f, 0x157f, 0x007f, 0x007c,
++	0x0c7e, 0x007e, 0x2061, 0x0100, 0x6030, 0x007e, 0x6048, 0x007e,
++	0x60e4, 0x007e, 0x60e8, 0x007e, 0x6050, 0x007e, 0x60f0, 0x007e,
++	0x60ec, 0x007e, 0x600c, 0x007e, 0x6004, 0x007e, 0x6028, 0x007e,
++	0x60e0, 0x007e, 0x602f, 0x0100, 0x602f, 0x0000, 0x0005, 0x0005,
++	0x0005, 0x0005, 0x602f, 0x0040, 0x602f, 0x0000, 0x007f, 0x60e2,
++	0x007f, 0x602a, 0x007f, 0x6006, 0x007f, 0x600e, 0x007f, 0x60ee,
++	0x007f, 0x60f2, 0x007f, 0x6052, 0x007f, 0x60ea, 0x007f, 0x60e6,
++	0x007f, 0x604a, 0x007f, 0x6032, 0x007f, 0x0c7f, 0x007c, 0x25e7,
++	0x25eb, 0x25ef, 0x25f5, 0x25fb, 0x2601, 0x2607, 0x260f, 0x2617,
++	0x261d, 0x2623, 0x262b, 0x2633, 0x263b, 0x2643, 0x264d, 0x2657,
++	0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657,
++	0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x107e,
++	0x007e, 0x0078, 0x2670, 0x107e, 0x007e, 0x0078, 0x2670, 0x107e,
++	0x007e, 0x1078, 0x226c, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078,
++	0x226c, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x0078,
++	0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x0078, 0x2670, 0x107e,
++	0x007e, 0x1078, 0x226c, 0x1078, 0x2133, 0x0078, 0x2670, 0x107e,
++	0x007e, 0x1078, 0x226c, 0x1078, 0x2133, 0x0078, 0x2670, 0x107e,
++	0x007e, 0x1078, 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078,
++	0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x226c, 0x1078,
++	0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x226c, 0x1078,
++	0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x1078,
++	0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x1078,
++	0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x226c, 0x1078,
++	0x2133, 0x1078, 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078,
++	0x226c, 0x1078, 0x2133, 0x1078, 0x2178, 0x0078, 0x2670, 0x0005,
++	0x0078, 0x2657, 0xb084, 0x003c, 0x8004, 0x8004, 0x0079, 0x2660,
++	0x2670, 0x25ed, 0x25f1, 0x25f7, 0x25fd, 0x2603, 0x2609, 0x2611,
++	0x2619, 0x261f, 0x2625, 0x262d, 0x2635, 0x263d, 0x2645, 0x264f,
++	0x0008, 0x265a, 0x007f, 0x107f, 0x2091, 0x8001, 0x007c, 0x0c7e,
++	0x027e, 0x047e, 0x2021, 0x0000, 0x1078, 0x4967, 0x00c0, 0x2772,
++	0x70cc, 0xd09c, 0x0040, 0x268e, 0xd084, 0x00c0, 0x268e, 0xd0bc,
++	0x00c0, 0x2772, 0x1078, 0x2776, 0x0078, 0x2772, 0xd0cc, 0x00c0,
++	0x2772, 0xd094, 0x0040, 0x2698, 0x7097, 0xffff, 0x0078, 0x2772,
++	0x2001, 0x010c, 0x203c, 0x7284, 0xd284, 0x0040, 0x2701, 0xd28c,
++	0x00c0, 0x2701, 0x037e, 0x7394, 0xa38e, 0xffff, 0x0040, 0x26ab,
++	0x83ff, 0x00c0, 0x26ad, 0x2019, 0x0001, 0x8314, 0xa2e0, 0xacc0,
++	0x2c04, 0xa38c, 0x0001, 0x0040, 0x26ba, 0xa084, 0xff00, 0x8007,
++	0x0078, 0x26bc, 0xa084, 0x00ff, 0xa70e, 0x0040, 0x26f6, 0xa08e,
++	0x0000, 0x0040, 0x26f6, 0xa08e, 0x00ff, 0x00c0, 0x26d3, 0x7230,
++	0xd284, 0x00c0, 0x26fc, 0x7284, 0xc28d, 0x7286, 0x7097, 0xffff,
++	0x037f, 0x0078, 0x2701, 0x2009, 0x0000, 0x1078, 0x254d, 0x1078,
++	0x455c, 0x00c0, 0x26f9, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006,
++	0x00c0, 0x26f0, 0x7030, 0xd08c, 0x0040, 0x26ea, 0x6000, 0xd0bc,
++	0x0040, 0x26f0, 0x1078, 0x278c, 0x0040, 0x26f9, 0x0078, 0x26f6,
++	0x1078, 0x28c4, 0x1078, 0x27b9, 0x0040, 0x26f9, 0x8318, 0x0078,
++	0x26ad, 0x7396, 0x0078, 0x26fe, 0x7097, 0xffff, 0x037f, 0x0078,
++	0x2772, 0xa780, 0x29c0, 0x203c, 0xa7bc, 0xff00, 0x873f, 0x2041,
++	0x007e, 0x7094, 0xa096, 0xffff, 0x00c0, 0x2713, 0x2009, 0x0000,
++	0x28a8, 0x0078, 0x271f, 0xa812, 0x0048, 0x271b, 0x2008, 0xa802,
++	0x20a8, 0x0078, 0x271f, 0x7097, 0xffff, 0x0078, 0x2772, 0x2700,
++	0x157e, 0x017e, 0xa106, 0x0040, 0x2766, 0xc484, 0x1078, 0x45c4,
++	0x0040, 0x2730, 0x1078, 0x455c, 0x00c0, 0x276f, 0x0078, 0x2731,
++	0xc485, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2740,
++	0x7030, 0xd08c, 0x0040, 0x275e, 0x6000, 0xd0bc, 0x00c0, 0x275e,
++	0x7284, 0xd28c, 0x0040, 0x2756, 0x6004, 0xa084, 0x00ff, 0xa082,
++	0x0006, 0x0048, 0x2766, 0xd484, 0x00c0, 0x2752, 0x1078, 0x457f,
++	0x0078, 0x2754, 0x1078, 0x298e, 0x0078, 0x2766, 0x1078, 0x28c4,
++	0x1078, 0x27b9, 0x0040, 0x276f, 0x0078, 0x2766, 0x1078, 0x2959,
++	0x0040, 0x2766, 0x1078, 0x278c, 0x0040, 0x276f, 0x017f, 0x8108,
++	0x157f, 0x00f0, 0x271f, 0x7097, 0xffff, 0x0078, 0x2772, 0x017f,
++	0x157f, 0x7196, 0x047f, 0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x017e,
++	0x7097, 0x0001, 0x2009, 0x007e, 0x1078, 0x455c, 0x00c0, 0x2789,
++	0x1078, 0x28c4, 0x1078, 0x27b9, 0x0040, 0x2789, 0x70cc, 0xc0bd,
++	0x70ce, 0x017f, 0x0c7f, 0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e,
++	0x2c68, 0x2001, 0xa657, 0x2004, 0xa084, 0x00ff, 0x6842, 0x1078,
++	0x76c7, 0x0040, 0x27b4, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001,
++	0x0000, 0x1078, 0x44ee, 0x2001, 0x0000, 0x1078, 0x4502, 0x127e,
++	0x2091, 0x8000, 0x7090, 0x8000, 0x7092, 0x127f, 0x2009, 0x0004,
++	0x1078, 0x775c, 0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f,
++	0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x2001, 0xa657,
++	0x2004, 0xa084, 0x00ff, 0x6842, 0x1078, 0x9187, 0x0040, 0x27f2,
++	0x2d00, 0x601a, 0x6800, 0xc0c4, 0x6802, 0x68a0, 0xa086, 0x007e,
++	0x0040, 0x27db, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0,
++	0x27db, 0x1078, 0x2880, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078,
++	0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x127e, 0x2091, 0x8000,
++	0x7090, 0x8000, 0x7092, 0x127f, 0x2009, 0x0002, 0x1078, 0x775c,
++	0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x0c7e,
++	0x027e, 0x2009, 0x0080, 0x1078, 0x455c, 0x00c0, 0x2805, 0x1078,
++	0x2808, 0x0040, 0x2805, 0x70d3, 0xffff, 0x027f, 0x0c7f, 0x007c,
++	0x017e, 0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x1078, 0x76c7, 0x0040,
++	0x282a, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078,
++	0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x127e, 0x2091, 0x8000,
++	0x70d4, 0x8000, 0x70d6, 0x127f, 0x2009, 0x0002, 0x1078, 0x775c,
++	0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x0c7e,
++	0x0d7e, 0x127e, 0x2091, 0x8000, 0x2009, 0x007f, 0x1078, 0x455c,
++	0x00c0, 0x284b, 0x2c68, 0x1078, 0x76c7, 0x0040, 0x284b, 0x2d00,
++	0x601a, 0x6312, 0x601f, 0x0001, 0x620a, 0x2009, 0x0022, 0x1078,
++	0x775c, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x0c7f, 0x007c, 0x0e7e,
++	0x0c7e, 0x067e, 0x037e, 0x027e, 0x1078, 0x5f0e, 0x1078, 0x5eae,
++	0x1078, 0x8068, 0x2130, 0x81ff, 0x0040, 0x2864, 0x20a9, 0x007e,
++	0x2009, 0x0000, 0x0078, 0x2868, 0x20a9, 0x007f, 0x2009, 0x0000,
++	0x017e, 0x1078, 0x45c4, 0x00c0, 0x2871, 0x1078, 0x47e9, 0x1078,
++	0x42f8, 0x017f, 0x8108, 0x00f0, 0x2868, 0x86ff, 0x00c0, 0x287a,
++	0x1078, 0x119b, 0x027f, 0x037f, 0x067f, 0x0c7f, 0x0e7f, 0x007c,
++	0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e, 0x6218, 0x2270, 0x72a0,
++	0x027e, 0x2019, 0x0029, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000,
++	0x1078, 0x5e0a, 0x2c08, 0x1078, 0x9f8b, 0x077f, 0x017f, 0x2e60,
++	0x1078, 0x47e9, 0x6210, 0x6314, 0x1078, 0x42f8, 0x6212, 0x6316,
++	0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x007e,
++	0x6018, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x00c0, 0x28ba, 0x2071,
++	0xa600, 0x7090, 0xa005, 0x0040, 0x28b7, 0x8001, 0x7092, 0x007f,
++	0x0e7f, 0x007c, 0x2071, 0xa600, 0x70d4, 0xa005, 0x0040, 0x28b7,
++	0x8001, 0x70d6, 0x0078, 0x28b7, 0x6000, 0xc08c, 0x6002, 0x007c,
++	0x0f7e, 0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e, 0x157e, 0x2178,
++	0x81ff, 0x00c0, 0x28d7, 0x20a9, 0x0001, 0x0078, 0x28f2, 0x2001,
++	0xa653, 0x2004, 0xd0c4, 0x0040, 0x28ee, 0xd0a4, 0x0040, 0x28ee,
++	0x047e, 0x6018, 0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427,
++	0xa006, 0x2009, 0x002d, 0x1078, 0xa21d, 0x047f, 0x20a9, 0x00ff,
++	0x2011, 0x0000, 0x027e, 0xa28e, 0x007e, 0x0040, 0x2936, 0xa28e,
++	0x007f, 0x0040, 0x2936, 0xa28e, 0x0080, 0x0040, 0x2936, 0xa288,
++	0xa735, 0x210c, 0x81ff, 0x0040, 0x2936, 0x8fff, 0x1040, 0x2942,
++	0x0c7e, 0x2160, 0x2001, 0x0001, 0x1078, 0x4972, 0x0c7f, 0x2019,
++	0x0029, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a,
++	0x0c7e, 0x027e, 0x2160, 0x6204, 0xa294, 0x00ff, 0xa286, 0x0006,
++	0x00c0, 0x2926, 0x6007, 0x0404, 0x0078, 0x292b, 0x2001, 0x0004,
++	0x8007, 0xa215, 0x6206, 0x027f, 0x0c7f, 0x017e, 0x2c08, 0x1078,
++	0x9f8b, 0x017f, 0x077f, 0x2160, 0x1078, 0x47e9, 0x027f, 0x8210,
++	0x00f0, 0x28f2, 0x157f, 0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f,
++	0x0f7f, 0x007c, 0x047e, 0x027e, 0x017e, 0x2001, 0xa653, 0x2004,
++	0xd0c4, 0x0040, 0x2955, 0xd0a4, 0x0040, 0x2955, 0xa006, 0x2220,
++	0x8427, 0x2009, 0x0029, 0x1078, 0xa21d, 0x017f, 0x027f, 0x047f,
++	0x007c, 0x017e, 0x027e, 0x037e, 0x0c7e, 0x7284, 0x82ff, 0x0040,
++	0x2987, 0xa290, 0xa653, 0x2214, 0xd2ac, 0x00c0, 0x2987, 0x2100,
++	0x1078, 0x2564, 0x81ff, 0x0040, 0x2989, 0x2019, 0x0001, 0x8314,
++	0xa2e0, 0xacc0, 0x2c04, 0xd384, 0x0040, 0x297b, 0xa084, 0xff00,
++	0x8007, 0x0078, 0x297d, 0xa084, 0x00ff, 0xa116, 0x0040, 0x2989,
++	0xa096, 0x00ff, 0x0040, 0x2987, 0x8318, 0x0078, 0x296f, 0xa085,
++	0x0001, 0x0c7f, 0x037f, 0x027f, 0x017f, 0x007c, 0x017e, 0x0c7e,
++	0x127e, 0x2091, 0x8000, 0x017e, 0x027e, 0x037e, 0x2110, 0x027e,
++	0x2019, 0x0029, 0x1078, 0x73d0, 0x027f, 0x1078, 0xa4f1, 0x037f,
++	0x027f, 0x017f, 0xa180, 0xa735, 0x2004, 0xa065, 0x0040, 0x29b7,
++	0x017e, 0x0c7e, 0x1078, 0x9187, 0x017f, 0x1040, 0x1332, 0x611a,
++	0x1078, 0x2880, 0x1078, 0x772d, 0x017f, 0x1078, 0x457f, 0x127f,
++	0x0c7f, 0x017f, 0x007c, 0x2001, 0xa633, 0x2004, 0xd0cc, 0x007c,
++	0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da,
++	0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce,
++	0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5,
++	0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3,
++	0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9,
++	0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b,
++	0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081,
++	0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073,
++	0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69,
++	0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056,
++	0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c,
++	0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c,
++	0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831,
++	0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026,
++	0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017,
++	0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000,
++	0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000,
++	0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300,
++	0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100,
++	0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00,
++	0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800,
++	0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000,
++	0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000,
++	0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500,
++	0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000,
++	0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000,
++	0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000,
++	0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000,
++	0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++	0x2071, 0xa682, 0x7003, 0x0002, 0xa006, 0x7012, 0x7016, 0x703a,
++	0x703e, 0x7033, 0xa692, 0x7037, 0xa692, 0x7007, 0x0001, 0x2061,
++	0xa6d2, 0x6003, 0x0002, 0x007c, 0x0090, 0x2ae7, 0x0068, 0x2ae7,
++	0x2071, 0xa682, 0x2b78, 0x7818, 0xd084, 0x00c0, 0x2ae7, 0x2a60,
++	0x7820, 0xa08e, 0x0069, 0x00c0, 0x2bd7, 0x0079, 0x2b6b, 0x007c,
++	0x2071, 0xa682, 0x7004, 0x0079, 0x2aed, 0x2af1, 0x2af2, 0x2afc,
++	0x2b0e, 0x007c, 0x0090, 0x2afb, 0x0068, 0x2afb, 0x2b78, 0x7818,
++	0xd084, 0x0040, 0x2b1a, 0x007c, 0x2b78, 0x2061, 0xa6d2, 0x6008,
++	0xa08e, 0x0100, 0x0040, 0x2b09, 0xa086, 0x0200, 0x0040, 0x2bcf,
++	0x007c, 0x7014, 0x2068, 0x2a60, 0x7018, 0x007a, 0x7010, 0x2068,
++	0x6834, 0xa086, 0x0103, 0x0040, 0x2b16, 0x007c, 0x2a60, 0x2b78,
++	0x7018, 0x007a, 0x2a60, 0x7820, 0xa08a, 0x0040, 0x00c8, 0x2b23,
++	0x61bc, 0x0079, 0x2b2b, 0x2100, 0xa08a, 0x003f, 0x00c8, 0x2bcb,
++	0x61bc, 0x0079, 0x2b6b, 0x2bad, 0x2bdf, 0x2be7, 0x2beb, 0x2bf3,
++	0x2bf9, 0x2bfd, 0x2c09, 0x2c0d, 0x2c17, 0x2c1b, 0x2bcb, 0x2bcb,
++	0x2bcb, 0x2c1f, 0x2bcb, 0x2c2f, 0x2c46, 0x2c5d, 0x2cdd, 0x2ce2,
++	0x2d0f, 0x2d69, 0x2d7a, 0x2d98, 0x2dd9, 0x2de3, 0x2df0, 0x2e03,
++	0x2e22, 0x2e2b, 0x2e68, 0x2e6e, 0x2bcb, 0x2e8a, 0x2bcb, 0x2bcb,
++	0x2bcb, 0x2bcb, 0x2bcb, 0x2e91, 0x2e9b, 0x2bcb, 0x2bcb, 0x2bcb,
++	0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2ea3, 0x2bcb, 0x2bcb,
++	0x2bcb, 0x2bcb, 0x2bcb, 0x2eb5, 0x2ece, 0x2bcb, 0x2bcb, 0x2bcb,
++	0x2bcb, 0x2bcb, 0x2bcb, 0x2ee0, 0x2f37, 0x2f95, 0x2fa9, 0x2bcb,
++	0x2bcb, 0x2bcb, 0x398e, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb,
++	0x2bcb, 0x2bcb, 0x2bcb, 0x2c17, 0x2c1b, 0x2fc0, 0x2bcb, 0x2fcd,
++	0x3a26, 0x3a83, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb,
++	0x2bcb, 0x2bcb, 0x2bcb, 0x301a, 0x314f, 0x316b, 0x3177, 0x31da,
++	0x3233, 0x323e, 0x327d, 0x328c, 0x329b, 0x329e, 0x2fd1, 0x32c2,
++	0x331e, 0x332b, 0x343c, 0x356f, 0x3599, 0x36a6, 0x2bcb, 0x36b6,
++	0x36f0, 0x37bf, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x3827, 0x3843,
++	0x38bd, 0x3977, 0x713c, 0x0078, 0x2bad, 0x2021, 0x4000, 0x1078,
++	0x35f5, 0x127e, 0x2091, 0x8000, 0x0068, 0x2bba, 0x7818, 0xd084,
++	0x0040, 0x2bbd, 0x127f, 0x0078, 0x2bb1, 0x7c22, 0x7926, 0x7a2a,
++	0x7b2e, 0x781b, 0x0001, 0x2091, 0x4080, 0x7007, 0x0001, 0x2091,
++	0x5000, 0x127f, 0x007c, 0x2021, 0x4001, 0x0078, 0x2baf, 0x2021,
++	0x4002, 0x0078, 0x2baf, 0x2021, 0x4003, 0x0078, 0x2baf, 0x2021,
++	0x4005, 0x0078, 0x2baf, 0x2021, 0x4006, 0x0078, 0x2baf, 0xa02e,
++	0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0078, 0x3604, 0x7823,
++	0x0004, 0x7824, 0x007a, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824,
++	0x7930, 0x0078, 0x3608, 0x7924, 0x7828, 0x2114, 0x200a, 0x0078,
++	0x2bad, 0x7924, 0x2114, 0x0078, 0x2bad, 0x2099, 0x0009, 0x20a1,
++	0x0009, 0x20a9, 0x0007, 0x53a3, 0x7924, 0x7a28, 0x7b2c, 0x0078,
++	0x2bad, 0x7824, 0x2060, 0x0078, 0x2c21, 0x2009, 0x0001, 0x2011,
++	0x0013, 0x2019, 0x0018, 0x783b, 0x0017, 0x0078, 0x2bad, 0x7d38,
++	0x7c3c, 0x0078, 0x2be1, 0x7d38, 0x7c3c, 0x0078, 0x2bed, 0x2061,
++	0x1000, 0x610c, 0xa006, 0x2c14, 0xa200, 0x8c60, 0x8109, 0x00c0,
++	0x2c23, 0x2010, 0xa005, 0x0040, 0x2bad, 0x0078, 0x2bd3, 0x2069,
++	0xa652, 0x7824, 0x7930, 0xa11a, 0x00c8, 0x2bdb, 0x8019, 0x0040,
++	0x2bdb, 0x684a, 0x6942, 0x782c, 0x6852, 0x7828, 0x6856, 0xa006,
++	0x685a, 0x685e, 0x1078, 0x4eae, 0x0078, 0x2bad, 0x2069, 0xa652,
++	0x7824, 0x7934, 0xa11a, 0x00c8, 0x2bdb, 0x8019, 0x0040, 0x2bdb,
++	0x684e, 0x6946, 0x782c, 0x6862, 0x7828, 0x6866, 0xa006, 0x686a,
++	0x686e, 0x1078, 0x4a3e, 0x0078, 0x2bad, 0xa02e, 0x2520, 0x81ff,
++	0x00c0, 0x2bd7, 0x7924, 0x7b28, 0x7a2c, 0x20a9, 0x0005, 0x20a1,
++	0xa689, 0x41a1, 0x1078, 0x35ba, 0x0040, 0x2bd7, 0x2009, 0x0020,
++	0x1078, 0x3604, 0x701b, 0x2c75, 0x007c, 0x6834, 0x2008, 0xa084,
++	0x00ff, 0xa096, 0x0011, 0x0040, 0x2c85, 0xa096, 0x0019, 0x0040,
++	0x2c85, 0xa096, 0x0015, 0x00c0, 0x2bd7, 0x810f, 0xa18c, 0x00ff,
++	0x0040, 0x2bd7, 0x710e, 0x700c, 0x8001, 0x0040, 0x2cb6, 0x700e,
++	0x1078, 0x35ba, 0x0040, 0x2bd7, 0x2009, 0x0020, 0x2061, 0xa6d2,
++	0x6224, 0x6328, 0x642c, 0x6530, 0xa290, 0x0040, 0xa399, 0x0000,
++	0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x1078, 0x3604, 0x701b, 0x2ca9,
++	0x007c, 0x6834, 0xa084, 0x00ff, 0xa096, 0x0002, 0x0040, 0x2cb4,
++	0xa096, 0x000a, 0x00c0, 0x2bd7, 0x0078, 0x2c8b, 0x7010, 0x2068,
++	0x6838, 0xc0fd, 0x683a, 0x1078, 0x4431, 0x00c0, 0x2cc4, 0x7007,
++	0x0003, 0x701b, 0x2cc6, 0x007c, 0x1078, 0x4b51, 0x127e, 0x2091,
++	0x8000, 0x20a9, 0x0005, 0x2099, 0xa689, 0x530a, 0x2100, 0xa210,
++	0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0xad80, 0x000d,
++	0x2009, 0x0020, 0x127f, 0x0078, 0x3608, 0x61a4, 0x7824, 0x60a6,
++	0x0078, 0x2bad, 0x2091, 0x8000, 0x7823, 0x4000, 0x7827, 0x4953,
++	0x782b, 0x5020, 0x782f, 0x2020, 0x2009, 0x017f, 0x2104, 0x7832,
++	0x3f00, 0x7836, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, 0x603c,
++	0x8007, 0xa205, 0x783a, 0x2009, 0x04fd, 0x2104, 0x783e, 0x781b,
++	0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2071, 0x0010, 0x20c1,
++	0x00f0, 0xa08a, 0x0003, 0x00c8, 0x0427, 0x0078, 0x0423, 0x81ff,
++	0x00c0, 0x2bd7, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x45c4,
++	0x00c0, 0x2bdb, 0x7e38, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0048,
++	0x2d23, 0x0078, 0x2bdb, 0x7c28, 0x7d2c, 0x1078, 0x47a4, 0xd28c,
++	0x00c0, 0x2d2e, 0x1078, 0x4736, 0x0078, 0x2d30, 0x1078, 0x4772,
++	0x00c0, 0x2d5a, 0x2061, 0xad00, 0x127e, 0x2091, 0x8000, 0x6000,
++	0xa086, 0x0000, 0x0040, 0x2d48, 0x6010, 0xa06d, 0x0040, 0x2d48,
++	0x683c, 0xa406, 0x00c0, 0x2d48, 0x6840, 0xa506, 0x0040, 0x2d53,
++	0x127f, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004, 0xac02, 0x00c8,
++	0x2bd7, 0x0078, 0x2d34, 0x1078, 0x8a01, 0x127f, 0x0040, 0x2bd7,
++	0x0078, 0x2bad, 0xa00e, 0x2001, 0x0005, 0x1078, 0x4b51, 0x127e,
++	0x2091, 0x8000, 0x1078, 0x8f85, 0x1078, 0x4a73, 0x127f, 0x0078,
++	0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2, 0x0040, 0x2bdb,
++	0x1078, 0x4673, 0x0040, 0x2bd7, 0x1078, 0x47b2, 0x0040, 0x2bd7,
++	0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040,
++	0x2bdb, 0x1078, 0x482f, 0x0040, 0x2bd7, 0x2019, 0x0005, 0x1078,
++	0x47d3, 0x0040, 0x2bd7, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x2bdb,
++	0x8003, 0x800b, 0x810b, 0xa108, 0x1078, 0x5a52, 0x0078, 0x2bad,
++	0x127e, 0x2091, 0x8000, 0x81ff, 0x0040, 0x2da2, 0x2009, 0x0001,
++	0x0078, 0x2dd3, 0x2029, 0x00ff, 0x6450, 0x2400, 0xa506, 0x0040,
++	0x2dcd, 0x2508, 0x1078, 0x45c4, 0x00c0, 0x2dcd, 0x1078, 0x482f,
++	0x00c0, 0x2db8, 0x2009, 0x0002, 0x62ac, 0x2518, 0x0078, 0x2dd3,
++	0x2019, 0x0004, 0x1078, 0x47d3, 0x00c0, 0x2dc2, 0x2009, 0x0006,
++	0x0078, 0x2dd3, 0x7824, 0xa08a, 0x1000, 0x00c8, 0x2dd6, 0x8003,
++	0x800b, 0x810b, 0xa108, 0x1078, 0x5a52, 0x8529, 0x00c8, 0x2da5,
++	0x127f, 0x0078, 0x2bad, 0x127f, 0x0078, 0x2bd7, 0x127f, 0x0078,
++	0x2bdb, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, 0x46e7, 0x1078,
++	0x47a4, 0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2,
++	0x0040, 0x2bdb, 0x1078, 0x46d6, 0x1078, 0x47a4, 0x0078, 0x2bad,
++	0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078,
++	0x4775, 0x0040, 0x2bd7, 0x1078, 0x4484, 0x1078, 0x472f, 0x1078,
++	0x47a4, 0x0078, 0x2bad, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078,
++	0x4673, 0x0040, 0x2bd7, 0x62a0, 0x2019, 0x0005, 0x0c7e, 0x1078,
++	0x47e9, 0x0c7f, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078,
++	0x5e0a, 0x2009, 0x0000, 0x1078, 0x9f8b, 0x077f, 0x1078, 0x47a4,
++	0x0078, 0x2bad, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, 0x47a4,
++	0x2208, 0x0078, 0x2bad, 0x157e, 0x0d7e, 0x0e7e, 0x2069, 0xa714,
++	0x6810, 0x6914, 0xa10a, 0x00c8, 0x2e37, 0x2009, 0x0000, 0x6816,
++	0x2011, 0x0000, 0x2019, 0x0000, 0x20a9, 0x00ff, 0x2069, 0xa735,
++	0x2d04, 0xa075, 0x0040, 0x2e4c, 0x704c, 0x1078, 0x2e56, 0xa210,
++	0x7080, 0x1078, 0x2e56, 0xa318, 0x8d68, 0x00f0, 0x2e40, 0x2300,
++	0xa218, 0x0e7f, 0x0d7f, 0x157f, 0x0078, 0x2bad, 0x0f7e, 0x017e,
++	0xa07d, 0x0040, 0x2e65, 0x2001, 0x0000, 0x8000, 0x2f0c, 0x81ff,
++	0x0040, 0x2e65, 0x2178, 0x0078, 0x2e5d, 0x017f, 0x0f7f, 0x007c,
++	0x2069, 0xa714, 0x6910, 0x62a8, 0x0078, 0x2bad, 0x81ff, 0x00c0,
++	0x2bd7, 0x6150, 0xa190, 0x29c0, 0x2214, 0xa294, 0x00ff, 0x6070,
++	0xa084, 0xff00, 0xa215, 0x636c, 0x67cc, 0xd79c, 0x0040, 0x2e84,
++	0x2031, 0x0001, 0x0078, 0x2e86, 0x2031, 0x0000, 0x7e3a, 0x7f3e,
++	0x0078, 0x2bad, 0x6140, 0x6244, 0x2019, 0xa8a2, 0x231c, 0x0078,
++	0x2bad, 0x127e, 0x2091, 0x8000, 0x6134, 0x6338, 0xa006, 0x2010,
++	0x127f, 0x0078, 0x2bad, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x6244,
++	0x6338, 0x0078, 0x2bad, 0x6140, 0x6244, 0x7824, 0x6042, 0x7b28,
++	0x6346, 0x2069, 0xa652, 0x831f, 0xa305, 0x6816, 0x782c, 0x2069,
++	0xa8a2, 0x2d1c, 0x206a, 0x0078, 0x2bad, 0x017e, 0x127e, 0x2091,
++	0x8000, 0x7824, 0x6036, 0xd094, 0x0040, 0x2ec8, 0x7828, 0xa085,
++	0x0001, 0x2009, 0xa8ab, 0x200a, 0x2001, 0xffff, 0x1078, 0x5ae6,
++	0x782c, 0x603a, 0x127f, 0x017f, 0x0078, 0x2bad, 0x1078, 0x35e4,
++	0x0040, 0x2bdb, 0x7828, 0xa00d, 0x0040, 0x2bdb, 0x782c, 0xa005,
++	0x0040, 0x2bdb, 0x6244, 0x6146, 0x6338, 0x603a, 0x0078, 0x2bad,
++	0x2001, 0xa600, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x0c7e,
++	0x2061, 0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff,
++	0x00c0, 0x2ef7, 0x6030, 0xa085, 0xff00, 0x0078, 0x2f06, 0xa182,
++	0x007f, 0x00c8, 0x2f30, 0xa188, 0x29c0, 0x210c, 0xa18c, 0x00ff,
++	0x6030, 0xa116, 0x0040, 0x2f30, 0x810f, 0xa105, 0x127e, 0x2091,
++	0x8000, 0x007e, 0x1078, 0x76c7, 0x007f, 0x0040, 0x2f2c, 0x601a,
++	0x600b, 0xbc09, 0x601f, 0x0001, 0x1078, 0x35ba, 0x0040, 0x2f33,
++	0x6837, 0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd,
++	0x683a, 0x701b, 0x2f8e, 0x2d00, 0x6012, 0x2009, 0x0032, 0x1078,
++	0x775c, 0x127f, 0x0c7f, 0x007c, 0x127f, 0x0c7f, 0x0078, 0x2bd7,
++	0x0c7f, 0x0078, 0x2bdb, 0x1078, 0x772d, 0x0078, 0x2f2c, 0x2001,
++	0xa600, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x0c7e, 0x2061,
++	0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff, 0x00c0,
++	0x2f4e, 0x6030, 0xa085, 0xff00, 0x0078, 0x2f5d, 0xa182, 0x007f,
++	0x00c8, 0x2f87, 0xa188, 0x29c0, 0x210c, 0xa18c, 0x00ff, 0x6030,
++	0xa116, 0x0040, 0x2f87, 0x810f, 0xa105, 0x127e, 0x2091, 0x8000,
++	0x007e, 0x1078, 0x76c7, 0x007f, 0x0040, 0x2f83, 0x601a, 0x600b,
++	0xbc05, 0x601f, 0x0001, 0x1078, 0x35ba, 0x0040, 0x2f8a, 0x6837,
++	0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a,
++	0x701b, 0x2f8e, 0x2d00, 0x6012, 0x2009, 0x0032, 0x1078, 0x775c,
++	0x127f, 0x0c7f, 0x007c, 0x127f, 0x0c7f, 0x0078, 0x2bd7, 0x0c7f,
++	0x0078, 0x2bdb, 0x1078, 0x772d, 0x0078, 0x2f83, 0x6830, 0xa086,
++	0x0100, 0x0040, 0x2bd7, 0x0078, 0x2bad, 0x2061, 0xa933, 0x127e,
++	0x2091, 0x8000, 0x6000, 0xd084, 0x0040, 0x2fa6, 0x6104, 0x6208,
++	0x2019, 0xa612, 0x231c, 0x127f, 0x0078, 0x2bad, 0x127f, 0x0078,
++	0x2bdb, 0x81ff, 0x00c0, 0x2bd7, 0x127e, 0x2091, 0x8000, 0x6248,
++	0x6064, 0xa202, 0x0048, 0x2fbd, 0xa085, 0x0001, 0x1078, 0x256a,
++	0x1078, 0x3c9e, 0x127f, 0x0078, 0x2bad, 0x127f, 0x0078, 0x2bdb,
++	0x127e, 0x2091, 0x8000, 0x20a9, 0x0012, 0x2001, 0xa640, 0x20a0,
++	0xa006, 0x40a4, 0x127f, 0x0078, 0x2bad, 0x7d38, 0x7c3c, 0x0078,
++	0x2c5f, 0x7824, 0xa09c, 0x00ff, 0xa39a, 0x0003, 0x00c8, 0x2bd7,
++	0x6250, 0xa084, 0xff00, 0x8007, 0xa206, 0x00c0, 0x2fe9, 0x2001,
++	0xa640, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078,
++	0x3608, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040, 0x2bdb,
++	0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2bd7, 0x0c7e,
++	0x1078, 0x35ba, 0x0c7f, 0x0040, 0x2bd7, 0x6837, 0x0000, 0x6838,
++	0xc0fd, 0x683a, 0x1078, 0x8e4a, 0x0040, 0x2bd7, 0x7007, 0x0003,
++	0x701b, 0x300b, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2bd7,
++	0xad80, 0x000e, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
++	0x0078, 0x3608, 0x1078, 0x35ba, 0x0040, 0x2bd7, 0x1078, 0x42dd,
++	0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3604,
++	0x701b, 0x302b, 0x007c, 0xade8, 0x000d, 0x6800, 0xa005, 0x0040,
++	0x2bdb, 0x6804, 0xd0ac, 0x0040, 0x3038, 0xd0a4, 0x0040, 0x2bdb,
++	0xd094, 0x0040, 0x3043, 0x0c7e, 0x2061, 0x0100, 0x6104, 0xa18c,
++	0xffdf, 0x6106, 0x0c7f, 0xd08c, 0x0040, 0x304e, 0x0c7e, 0x2061,
++	0x0100, 0x6104, 0xa18d, 0x0010, 0x6106, 0x0c7f, 0x2009, 0x0100,
++	0x210c, 0xa18a, 0x0002, 0x0048, 0x3063, 0xd084, 0x0040, 0x3063,
++	0x6a28, 0xa28a, 0x007f, 0x00c8, 0x2bdb, 0xa288, 0x29c0, 0x210c,
++	0xa18c, 0x00ff, 0x6156, 0xd0dc, 0x0040, 0x306c, 0x6828, 0xa08a,
++	0x007f, 0x00c8, 0x2bdb, 0x6052, 0x6808, 0xa08a, 0x0100, 0x0048,
++	0x2bdb, 0xa08a, 0x0841, 0x00c8, 0x2bdb, 0xa084, 0x0007, 0x00c0,
++	0x2bdb, 0x680c, 0xa005, 0x0040, 0x2bdb, 0x6810, 0xa005, 0x0040,
++	0x2bdb, 0x6848, 0x6940, 0xa10a, 0x00c8, 0x2bdb, 0x8001, 0x0040,
++	0x2bdb, 0x684c, 0x6944, 0xa10a, 0x00c8, 0x2bdb, 0x8001, 0x0040,
++	0x2bdb, 0x6804, 0xd0fc, 0x0040, 0x30c2, 0x1078, 0x35ba, 0x0040,
++	0x2bd7, 0x2009, 0x0014, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0xa290,
++	0x0038, 0xa399, 0x0000, 0x1078, 0x3604, 0x701b, 0x30a8, 0x007c,
++	0xade8, 0x000d, 0x20a9, 0x0014, 0x2d98, 0x2069, 0xa66e, 0x2da0,
++	0x53a3, 0x7010, 0xa0e8, 0x000d, 0x2001, 0xa672, 0x200c, 0xd1e4,
++	0x0040, 0x30c2, 0x0c7e, 0x2061, 0x0100, 0x6004, 0xa085, 0x0b00,
++	0x6006, 0x0c7f, 0x20a9, 0x001c, 0x2d98, 0x2069, 0xa652, 0x2da0,
++	0x53a3, 0x6814, 0xa08c, 0x00ff, 0x6142, 0x8007, 0xa084, 0x00ff,
++	0x6046, 0x1078, 0x4eae, 0x1078, 0x49ce, 0x1078, 0x4a3e, 0x6000,
++	0xa086, 0x0000, 0x00c0, 0x314d, 0x6808, 0x602a, 0x1078, 0x21f7,
++	0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f,
++	0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0040, 0x30fa,
++	0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f,
++	0x0078, 0x30fc, 0xa084, 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312,
++	0x1078, 0x5b19, 0x6904, 0xd1fc, 0x0040, 0x312f, 0x0c7e, 0x2009,
++	0x0000, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x0040, 0x312c, 0x0078,
++	0x3116, 0x839d, 0x00c8, 0x312c, 0x3508, 0x8109, 0x1078, 0x5480,
++	0x6878, 0x6016, 0x6874, 0x2008, 0xa084, 0xff00, 0x8007, 0x600a,
++	0xa184, 0x00ff, 0x6006, 0x8108, 0x00c0, 0x312a, 0x6003, 0x0003,
++	0x0078, 0x312c, 0x6003, 0x0001, 0x00f0, 0x3111, 0x0c7f, 0x0c7e,
++	0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x0c7f, 0x1078,
++	0x3819, 0x0040, 0x313d, 0x1078, 0x256a, 0x60c0, 0xa005, 0x0040,
++	0x3149, 0x6003, 0x0001, 0x2091, 0x301d, 0x1078, 0x4224, 0x0078,
++	0x314d, 0x6003, 0x0004, 0x2091, 0x301d, 0x0078, 0x2bad, 0x6000,
++	0xa086, 0x0000, 0x0040, 0x2bd7, 0x2069, 0xa652, 0x7830, 0x6842,
++	0x7834, 0x6846, 0x6804, 0xd0fc, 0x0040, 0x3162, 0x2009, 0x0030,
++	0x0078, 0x3164, 0x2009, 0x001c, 0x2d00, 0x7a2c, 0x7b28, 0x7c3c,
++	0x7d38, 0x0078, 0x3608, 0xa006, 0x1078, 0x256a, 0x81ff, 0x00c0,
++	0x2bd7, 0x1078, 0x42dd, 0x1078, 0x4224, 0x0078, 0x2bad, 0x81ff,
++	0x00c0, 0x2bd7, 0x6184, 0x81ff, 0x0040, 0x3191, 0x703f, 0x0000,
++	0x2001, 0xacc0, 0x2009, 0x0040, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
++	0x127e, 0x2091, 0x8000, 0x1078, 0x3608, 0x701b, 0x2baa, 0x127f,
++	0x007c, 0x703f, 0x0001, 0x0d7e, 0x2069, 0xacc0, 0x20a9, 0x0040,
++	0x20a1, 0xacc0, 0x2019, 0xffff, 0x43a4, 0x6550, 0xa588, 0x29c0,
++	0x210c, 0xa18c, 0x00ff, 0x216a, 0xa00e, 0x2011, 0x0002, 0x2100,
++	0xa506, 0x0040, 0x31c3, 0x1078, 0x45c4, 0x00c0, 0x31c3, 0x6014,
++	0x821c, 0x0048, 0x31bb, 0xa398, 0xacc0, 0xa085, 0xff00, 0x8007,
++	0x201a, 0x0078, 0x31c2, 0xa398, 0xacc0, 0x2324, 0xa4a4, 0xff00,
++	0xa405, 0x201a, 0x8210, 0x8108, 0xa182, 0x0080, 0x00c8, 0x31ca,
++	0x0078, 0x31a7, 0x8201, 0x8007, 0x2d0c, 0xa105, 0x206a, 0x0d7f,
++	0x20a9, 0x0040, 0x20a1, 0xacc0, 0x2099, 0xacc0, 0x1078, 0x4281,
++	0x0078, 0x3180, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x0c7e, 0x1078,
++	0x35ba, 0x0c7f, 0x00c0, 0x31e8, 0x2009, 0x0002, 0x0078, 0x2bd7,
++	0x2001, 0xa653, 0x2004, 0xd0b4, 0x0040, 0x320f, 0x6000, 0xd08c,
++	0x00c0, 0x320f, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0,
++	0x320f, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x1078, 0x8e9e,
++	0x00c0, 0x3206, 0x2009, 0x0003, 0x0078, 0x2bd7, 0x7007, 0x0003,
++	0x701b, 0x320b, 0x007c, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x20a9,
++	0x002b, 0x2c98, 0xade8, 0x0002, 0x2da0, 0x53a3, 0x20a9, 0x0004,
++	0xac80, 0x0006, 0x2098, 0xad80, 0x0006, 0x20a0, 0x1078, 0x4281,
++	0x20a9, 0x0004, 0xac80, 0x000a, 0x2098, 0xad80, 0x000a, 0x20a0,
++	0x1078, 0x4281, 0x2d00, 0x2009, 0x002b, 0x7a2c, 0x7b28, 0x7c3c,
++	0x7d38, 0x0078, 0x3608, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2,
++	0x0040, 0x2bdb, 0x1078, 0x47bd, 0x0078, 0x2bad, 0x81ff, 0x00c0,
++	0x2bd7, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x2bdb, 0x1078, 0x35e4,
++	0x0040, 0x2bdb, 0x1078, 0x482f, 0x0040, 0x2bd7, 0x2019, 0x0004,
++	0x1078, 0x47d3, 0x7924, 0x810f, 0x7a28, 0x1078, 0x3259, 0x0078,
++	0x2bad, 0xa186, 0x00ff, 0x0040, 0x3261, 0x1078, 0x3271, 0x0078,
++	0x3270, 0x2029, 0x007e, 0x2061, 0xa600, 0x6450, 0x2400, 0xa506,
++	0x0040, 0x326d, 0x2508, 0x1078, 0x3271, 0x8529, 0x00c8, 0x3266,
++	0x007c, 0x1078, 0x45c4, 0x00c0, 0x327c, 0x2200, 0x8003, 0x800b,
++	0x810b, 0xa108, 0x1078, 0x5a52, 0x007c, 0x81ff, 0x00c0, 0x2bd7,
++	0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, 0x4673, 0x0040, 0x2bd7,
++	0x1078, 0x47c8, 0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078,
++	0x35d2, 0x0040, 0x2bdb, 0x1078, 0x4673, 0x0040, 0x2bd7, 0x1078,
++	0x47b2, 0x0078, 0x2bad, 0x6100, 0x0078, 0x2bad, 0x1078, 0x35e4,
++	0x0040, 0x2bdb, 0x2001, 0xa600, 0x2004, 0xa086, 0x0003, 0x00c0,
++	0x2bd7, 0x0d7e, 0xace8, 0x000a, 0x7924, 0xd184, 0x0040, 0x32b2,
++	0xace8, 0x0006, 0x680c, 0x8007, 0x783e, 0x6808, 0x8007, 0x783a,
++	0x6b04, 0x831f, 0x6a00, 0x8217, 0x0d7f, 0x6100, 0xa18c, 0x0200,
++	0x0078, 0x2bad, 0xa006, 0x1078, 0x256a, 0x7824, 0xa084, 0x00ff,
++	0xa086, 0x00ff, 0x0040, 0x32cf, 0x81ff, 0x00c0, 0x2bd7, 0x1078,
++	0x42dd, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x2bdb, 0x7924, 0xa18c,
++	0xff00, 0x810f, 0xa186, 0x00ff, 0x0040, 0x32e5, 0xa182, 0x007f,
++	0x00c8, 0x2bdb, 0x2100, 0x1078, 0x2564, 0x027e, 0x0c7e, 0x127e,
++	0x2091, 0x8000, 0x2061, 0xa8c4, 0x601b, 0x0000, 0x601f, 0x0000,
++	0x2011, 0x0003, 0x1078, 0x70e0, 0x2011, 0x0002, 0x1078, 0x70ea,
++	0x1078, 0x6fc4, 0x037e, 0x2019, 0x0000, 0x1078, 0x7058, 0x037f,
++	0x2061, 0x0100, 0x6030, 0xa084, 0x00ff, 0x810f, 0xa105, 0x604a,
++	0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x002d, 0x2011, 0x4259,
++	0x1078, 0x5add, 0x7924, 0xa18c, 0xff00, 0x810f, 0x7a28, 0x1078,
++	0x3259, 0x127f, 0x0c7f, 0x027f, 0x0078, 0x2bad, 0x7924, 0xa18c,
++	0xff00, 0x810f, 0x0c7e, 0x1078, 0x455c, 0x2c08, 0x0c7f, 0x00c0,
++	0x2bdb, 0x0078, 0x2bad, 0x81ff, 0x0040, 0x3332, 0x2009, 0x0001,
++	0x0078, 0x2bd7, 0x60cc, 0xd09c, 0x00c0, 0x333a, 0x2009, 0x0005,
++	0x0078, 0x2bd7, 0x1078, 0x35ba, 0x00c0, 0x3342, 0x2009, 0x0002,
++	0x0078, 0x2bd7, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078,
++	0x3604, 0x701b, 0x334c, 0x007c, 0x2009, 0x0080, 0x1078, 0x45c4,
++	0x00c0, 0x3359, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0040,
++	0x335d, 0x2021, 0x400a, 0x0078, 0x2baf, 0x0d7e, 0xade8, 0x000d,
++	0x6900, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x6e18, 0x6820, 0xa0be,
++	0x0100, 0x0040, 0x33d0, 0xa0be, 0x0112, 0x0040, 0x33d0, 0xa0be,
++	0x0113, 0x0040, 0x33d0, 0xa0be, 0x0114, 0x0040, 0x33d0, 0xa0be,
++	0x0117, 0x0040, 0x33d0, 0xa0be, 0x011a, 0x0040, 0x33d0, 0xa0be,
++	0x0121, 0x0040, 0x33c6, 0xa0be, 0x0131, 0x0040, 0x33c6, 0xa0be,
++	0x0171, 0x0040, 0x33d0, 0xa0be, 0x0173, 0x0040, 0x33d0, 0xa0be,
++	0x01a1, 0x00c0, 0x3398, 0x6830, 0x8007, 0x6832, 0x0078, 0x33d6,
++	0xa0be, 0x0212, 0x0040, 0x33cc, 0xa0be, 0x0213, 0x0040, 0x33cc,
++	0xa0be, 0x0214, 0x0040, 0x33be, 0xa0be, 0x0217, 0x0040, 0x33b8,
++	0xa0be, 0x021a, 0x00c0, 0x33b1, 0x6838, 0x8007, 0x683a, 0x0078,
++	0x33d0, 0xa0be, 0x0300, 0x0040, 0x33d0, 0x0d7f, 0x0078, 0x2bdb,
++	0xad80, 0x0010, 0x20a9, 0x0007, 0x1078, 0x3418, 0xad80, 0x000e,
++	0x20a9, 0x0001, 0x1078, 0x3418, 0x0078, 0x33d0, 0xad80, 0x000c,
++	0x1078, 0x3426, 0x0078, 0x33d6, 0xad80, 0x000e, 0x1078, 0x3426,
++	0xad80, 0x000c, 0x20a9, 0x0001, 0x1078, 0x3418, 0x0c7e, 0x1078,
++	0x35ba, 0x0040, 0x3409, 0x6838, 0xc0fd, 0x683a, 0x6837, 0x0119,
++	0x6853, 0x0000, 0x684f, 0x0020, 0x685b, 0x0001, 0x810b, 0x697e,
++	0x6883, 0x0000, 0x6a86, 0x6b8a, 0x6c8e, 0x6d92, 0x6996, 0x689b,
++	0x0000, 0x0c7f, 0x0d7f, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a,
++	0x6823, 0x0000, 0x6804, 0x2068, 0x1078, 0x8e66, 0x00c0, 0x3404,
++	0x2009, 0x0003, 0x0078, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x340f,
++	0x007c, 0x0c7f, 0x0d7f, 0x2009, 0x0002, 0x0078, 0x2bd7, 0x6820,
++	0xa086, 0x8001, 0x00c0, 0x2bad, 0x2009, 0x0004, 0x0078, 0x2bd7,
++	0x017e, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x290a, 0x8108,
++	0x280a, 0x8108, 0x00f0, 0x341a, 0x017f, 0x007c, 0x017e, 0x0a7e,
++	0x0b7e, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x2054, 0x8000,
++	0x205c, 0x2b0a, 0x8108, 0x2a0a, 0x8108, 0x290a, 0x8108, 0x280a,
++	0x0b7f, 0x0a7f, 0x017f, 0x007c, 0x81ff, 0x0040, 0x3443, 0x2009,
++	0x0001, 0x0078, 0x2bd7, 0x60cc, 0xd09c, 0x00c0, 0x344b, 0x2009,
++	0x0005, 0x0078, 0x2bd7, 0x7924, 0x2140, 0xa18c, 0xff00, 0x810f,
++	0xa182, 0x0080, 0x0048, 0x2bdb, 0xa182, 0x00ff, 0x00c8, 0x2bdb,
++	0x7a2c, 0x7b28, 0x606c, 0xa306, 0x00c0, 0x3466, 0x6070, 0xa24e,
++	0x0040, 0x2bdb, 0xa9cc, 0xff00, 0x0040, 0x2bdb, 0x0c7e, 0x1078,
++	0x350f, 0x2c68, 0x0c7f, 0x0040, 0x349e, 0xa0c6, 0x4000, 0x00c0,
++	0x3484, 0x0c7e, 0x007e, 0x2d60, 0x2009, 0x0000, 0x1078, 0x489b,
++	0x00c0, 0x347b, 0xc185, 0x6000, 0xd0bc, 0x0040, 0x3480, 0xc18d,
++	0x007f, 0x0c7f, 0x0078, 0x349b, 0xa0c6, 0x4007, 0x00c0, 0x348b,
++	0x2408, 0x0078, 0x349b, 0xa0c6, 0x4008, 0x00c0, 0x3493, 0x2708,
++	0x2610, 0x0078, 0x349b, 0xa0c6, 0x4009, 0x00c0, 0x3499, 0x0078,
++	0x349b, 0x2001, 0x4006, 0x2020, 0x0078, 0x2baf, 0x2d00, 0x7022,
++	0x017e, 0x0b7e, 0x0c7e, 0x0e7e, 0x2c70, 0x1078, 0x76c7, 0x0040,
++	0x34e4, 0x2d00, 0x601a, 0x2001, 0xa657, 0x2004, 0xa084, 0x00ff,
++	0x6842, 0x2e58, 0x0e7f, 0x0e7e, 0x0c7e, 0x1078, 0x35ba, 0x0c7f,
++	0x2b70, 0x00c0, 0x34c5, 0x1078, 0x772d, 0x0e7f, 0x0c7f, 0x0b7f,
++	0x017f, 0x2009, 0x0002, 0x0078, 0x2bd7, 0x6837, 0x0000, 0x2d00,
++	0x6012, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x127e, 0x2091,
++	0x8000, 0x1078, 0x2880, 0x127f, 0x601f, 0x0001, 0x2001, 0x0000,
++	0x1078, 0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x2009, 0x0002,
++	0x1078, 0x775c, 0xa085, 0x0001, 0x0e7f, 0x0c7f, 0x0b7f, 0x017f,
++	0x00c0, 0x34ee, 0x2009, 0x0003, 0x0078, 0x2bd7, 0x7007, 0x0003,
++	0x701b, 0x34f3, 0x007c, 0x6830, 0xa086, 0x0100, 0x7020, 0x2060,
++	0x00c0, 0x3501, 0x2009, 0x0004, 0x6204, 0xa294, 0x00ff, 0x0078,
++	0x2bd7, 0x2009, 0x0000, 0x1078, 0x489b, 0x00c0, 0x3508, 0xc185,
++	0x6000, 0xd0bc, 0x0040, 0x350d, 0xc18d, 0x0078, 0x2bad, 0x0e7e,
++	0x0d7e, 0x2029, 0x0000, 0x2021, 0x0080, 0x20a9, 0x007f, 0x2071,
++	0xa7b5, 0x2e04, 0xa005, 0x00c0, 0x3524, 0x2100, 0xa406, 0x00c0,
++	0x3555, 0x2428, 0x0078, 0x3555, 0x2068, 0x6f10, 0x2700, 0xa306,
++	0x00c0, 0x3546, 0x6e14, 0x2600, 0xa206, 0x00c0, 0x3546, 0x2400,
++	0xa106, 0x00c0, 0x3542, 0x2d60, 0xd884, 0x0040, 0x356a, 0x6004,
++	0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x356a, 0x2001, 0x4000,
++	0x0078, 0x356b, 0x2001, 0x4007, 0x0078, 0x356b, 0x2400, 0xa106,
++	0x00c0, 0x3555, 0x6e14, 0x87ff, 0x00c0, 0x3551, 0x86ff, 0x0040,
++	0x3521, 0x2001, 0x4008, 0x0078, 0x356b, 0x8420, 0x8e70, 0x00f0,
++	0x3519, 0x85ff, 0x00c0, 0x3564, 0x2001, 0x4009, 0x0078, 0x356b,
++	0x2001, 0x0001, 0x0078, 0x356b, 0x1078, 0x455c, 0x00c0, 0x3560,
++	0x6312, 0x6216, 0xa006, 0xa005, 0x0d7f, 0x0e7f, 0x007c, 0x81ff,
++	0x00c0, 0x2bd7, 0x1078, 0x35ba, 0x0040, 0x2bd7, 0x6837, 0x0000,
++	0x6838, 0xc0fd, 0x683a, 0x7824, 0xa005, 0x0040, 0x2bdb, 0xa096,
++	0x00ff, 0x0040, 0x3587, 0xa092, 0x0004, 0x00c8, 0x2bdb, 0x2010,
++	0x2d18, 0x1078, 0x282f, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b,
++	0x3592, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2bd7, 0x0078,
++	0x2bad, 0x7924, 0xa18c, 0xff00, 0x810f, 0xa182, 0x0080, 0x0048,
++	0x2bdb, 0xa182, 0x00ff, 0x00c8, 0x2bdb, 0x127e, 0x2091, 0x8000,
++	0x1078, 0x8d4b, 0x00c0, 0x35b7, 0xa190, 0xa735, 0x2204, 0xa065,
++	0x0040, 0x35b7, 0x1078, 0x42f8, 0x127f, 0x0078, 0x2bad, 0x127f,
++	0x0078, 0x2bd7, 0x1078, 0x138b, 0x0040, 0x35d1, 0xa006, 0x6802,
++	0x7010, 0xa005, 0x00c0, 0x35c9, 0x2d00, 0x7012, 0x7016, 0x0078,
++	0x35cf, 0x7014, 0x6802, 0x2060, 0x2d00, 0x6006, 0x7016, 0xad80,
++	0x000d, 0x007c, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x45c4,
++	0x00c0, 0x35e1, 0x7e28, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0048,
++	0x35e2, 0xa066, 0x8cff, 0x007c, 0x7e24, 0x860f, 0xa18c, 0x00ff,
++	0x1078, 0x45c4, 0x00c0, 0x35f2, 0xa6b4, 0x00ff, 0xa682, 0x4000,
++	0x0048, 0x35f3, 0xa066, 0x8cff, 0x007c, 0x017e, 0x7110, 0x81ff,
++	0x0040, 0x3600, 0x2168, 0x6904, 0x1078, 0x13a4, 0x0078, 0x35f7,
++	0x7112, 0x7116, 0x017f, 0x007c, 0x2031, 0x0001, 0x0078, 0x360a,
++	0x2031, 0x0000, 0x2061, 0xa6d2, 0x6606, 0x6112, 0x600e, 0x6226,
++	0x632a, 0x642e, 0x6532, 0x2c10, 0x1078, 0x13db, 0x7007, 0x0002,
++	0x701b, 0x2bad, 0x007c, 0x0f7e, 0x127e, 0x2091, 0x8000, 0x2079,
++	0x0000, 0x2001, 0xa690, 0x2004, 0xa005, 0x00c0, 0x3636, 0x0068,
++	0x3636, 0x7818, 0xd084, 0x00c0, 0x3636, 0x7a22, 0x7b26, 0x7c2a,
++	0x781b, 0x0001, 0x2091, 0x4080, 0x0078, 0x365b, 0x017e, 0x0c7e,
++	0x0e7e, 0x2071, 0xa682, 0x7138, 0xa182, 0x0008, 0x0048, 0x3644,
++	0x7030, 0x2060, 0x0078, 0x3655, 0x7030, 0xa0e0, 0x0008, 0xac82,
++	0xa6d2, 0x0048, 0x364d, 0x2061, 0xa692, 0x2c00, 0x7032, 0x81ff,
++	0x00c0, 0x3653, 0x7036, 0x8108, 0x713a, 0x2262, 0x6306, 0x640a,
++	0x0e7f, 0x0c7f, 0x017f, 0x127f, 0x0f7f, 0x007c, 0x0e7e, 0x2071,
++	0xa682, 0x7038, 0xa005, 0x0040, 0x3697, 0x127e, 0x2091, 0x8000,
++	0x0068, 0x3696, 0x0f7e, 0x2079, 0x0000, 0x7818, 0xd084, 0x00c0,
++	0x3695, 0x0c7e, 0x7034, 0x2060, 0x2c04, 0x7822, 0x6004, 0x7826,
++	0x6008, 0x782a, 0x781b, 0x0001, 0x2091, 0x4080, 0x7038, 0x8001,
++	0x703a, 0xa005, 0x00c0, 0x368b, 0x7033, 0xa692, 0x7037, 0xa692,
++	0x0c7f, 0x0078, 0x3695, 0xac80, 0x0008, 0xa0fa, 0xa6d2, 0x0048,
++	0x3693, 0x2001, 0xa692, 0x7036, 0x0c7f, 0x0f7f, 0x127f, 0x0e7f,
++	0x007c, 0x027e, 0x2001, 0xa653, 0x2004, 0xd0c4, 0x0040, 0x36a4,
++	0x2011, 0x8014, 0x1078, 0x361b, 0x027f, 0x007c, 0x81ff, 0x00c0,
++	0x2bd7, 0x127e, 0x2091, 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac,
++	0x6032, 0x1078, 0x4224, 0x127f, 0x0078, 0x2bad, 0x81ff, 0x00c0,
++	0x2bd7, 0x6000, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x2001, 0xa653,
++	0x2004, 0xd0ac, 0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040, 0x2bdb,
++	0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x36d3, 0x7828,
++	0xa005, 0x0040, 0x2bad, 0x0c7e, 0x1078, 0x35ba, 0x0c7f, 0x0040,
++	0x2bd7, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a,
++	0x1078, 0x8f12, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x36e9,
++	0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2bd7, 0x0078, 0x2bad,
++	0x2001, 0xa600, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x7f24,
++	0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x35ba, 0x0040, 0x2bd7,
++	0x2009, 0x0000, 0x2031, 0x0000, 0x7023, 0x0000, 0x702f, 0x0000,
++	0xad80, 0x0005, 0x7026, 0x20a0, 0x1078, 0x45c4, 0x00c0, 0x376d,
++	0x6004, 0xa0c4, 0x00ff, 0xa8c6, 0x0006, 0x0040, 0x371d, 0xa0c4,
++	0xff00, 0xa8c6, 0x0600, 0x00c0, 0x376d, 0x2001, 0xa653, 0x2004,
++	0xd0ac, 0x00c0, 0x372a, 0x1078, 0x489b, 0x00c0, 0x372a, 0xd79c,
++	0x0040, 0x376d, 0xd794, 0x00c0, 0x3730, 0xd784, 0x0040, 0x373c,
++	0xac80, 0x0006, 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, 0x1078,
++	0x3426, 0xd794, 0x0040, 0x3745, 0xac80, 0x000a, 0x2098, 0x3400,
++	0x20a9, 0x0004, 0x53a3, 0x1078, 0x3426, 0x21a2, 0xd794, 0x0040,
++	0x3765, 0xac80, 0x0000, 0x2098, 0x94a0, 0x20a9, 0x0002, 0x53a3,
++	0xac80, 0x0003, 0x20a6, 0x94a0, 0xac80, 0x0004, 0x2098, 0x3400,
++	0x20a9, 0x0002, 0x53a3, 0x1078, 0x3418, 0xac80, 0x0026, 0x2098,
++	0x20a9, 0x0002, 0x53a3, 0x0078, 0x3766, 0x94a0, 0xd794, 0x0040,
++	0x376b, 0xa6b0, 0x000b, 0xa6b0, 0x0005, 0x8108, 0xd78c, 0x0040,
++	0x3777, 0xa186, 0x0100, 0x0040, 0x3788, 0x0078, 0x377b, 0xa186,
++	0x007e, 0x0040, 0x3788, 0xd794, 0x0040, 0x3782, 0xa686, 0x0020,
++	0x0078, 0x3784, 0xa686, 0x0028, 0x0040, 0x3791, 0x0078, 0x370c,
++	0x86ff, 0x00c0, 0x378f, 0x7120, 0x810b, 0x0078, 0x2bad, 0x702f,
++	0x0001, 0x711e, 0x7020, 0xa600, 0x7022, 0x772a, 0x2061, 0xa6d2,
++	0x6007, 0x0000, 0x6612, 0x7024, 0x600e, 0x6226, 0x632a, 0x642e,
++	0x6532, 0x2c10, 0x1078, 0x13db, 0x7007, 0x0002, 0x701b, 0x37a9,
++	0x007c, 0x702c, 0xa005, 0x00c0, 0x37bb, 0x711c, 0x7024, 0x20a0,
++	0x7728, 0x2031, 0x0000, 0x2061, 0xa6d2, 0x6224, 0x6328, 0x642c,
++	0x6530, 0x0078, 0x370c, 0x7120, 0x810b, 0x0078, 0x2bad, 0x2029,
++	0x007e, 0x7924, 0x7a28, 0x7b2c, 0x7c38, 0xa184, 0xff00, 0x8007,
++	0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, 0xa184,
++	0x00ff, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb,
++	0xa284, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502,
++	0x0048, 0x2bdb, 0xa284, 0x00ff, 0xa0e2, 0x0020, 0x0048, 0x2bdb,
++	0xa502, 0x0048, 0x2bdb, 0xa384, 0xff00, 0x8007, 0xa0e2, 0x0020,
++	0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, 0xa384, 0x00ff, 0xa0e2,
++	0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, 0xa484, 0xff00,
++	0x8007, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb,
++	0xa484, 0x00ff, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048,
++	0x2bdb, 0x2061, 0xa8a5, 0x6102, 0x6206, 0x630a, 0x640e, 0x0078,
++	0x2bad, 0x007e, 0x2001, 0xa653, 0x2004, 0xd0cc, 0x007f, 0x007c,
++	0x007e, 0x2001, 0xa672, 0x2004, 0xd0bc, 0x007f, 0x007c, 0x6164,
++	0x7a24, 0x6300, 0x82ff, 0x00c0, 0x3830, 0x7926, 0x0078, 0x2bad,
++	0x83ff, 0x00c0, 0x2bdb, 0x2001, 0xfff0, 0xa200, 0x00c8, 0x2bdb,
++	0x2019, 0xffff, 0x6068, 0xa302, 0xa200, 0x0048, 0x2bdb, 0x7926,
++	0x6266, 0x0078, 0x2bad, 0x2001, 0xa600, 0x2004, 0xa086, 0x0003,
++	0x00c0, 0x2bd7, 0x7c28, 0x7d24, 0x7e38, 0x7f2c, 0x1078, 0x35ba,
++	0x0040, 0x2bd7, 0x2009, 0x0000, 0x2019, 0x0000, 0x7023, 0x0000,
++	0x702f, 0x0000, 0xad80, 0x0003, 0x7026, 0x20a0, 0xa1e0, 0xa735,
++	0x2c64, 0x8cff, 0x0040, 0x387d, 0x6004, 0xa084, 0x00ff, 0xa086,
++	0x0006, 0x0040, 0x3872, 0x6004, 0xa084, 0xff00, 0xa086, 0x0600,
++	0x00c0, 0x387d, 0x6014, 0x20a2, 0x94a0, 0x6010, 0x8007, 0xa105,
++	0x8007, 0x20a2, 0x94a0, 0xa398, 0x0002, 0x8108, 0xa182, 0x00ff,
++	0x0040, 0x3888, 0xa386, 0x002a, 0x0040, 0x3891, 0x0078, 0x385e,
++	0x83ff, 0x00c0, 0x388f, 0x7120, 0x810c, 0x0078, 0x2bad, 0x702f,
++	0x0001, 0x711e, 0x7020, 0xa300, 0x7022, 0x2061, 0xa6d2, 0x6007,
++	0x0000, 0x6312, 0x7024, 0x600e, 0x6426, 0x652a, 0x662e, 0x6732,
++	0x2c10, 0x1078, 0x13db, 0x7007, 0x0002, 0x701b, 0x38a8, 0x007c,
++	0x702c, 0xa005, 0x00c0, 0x38b9, 0x711c, 0x7024, 0x20a0, 0x2019,
++	0x0000, 0x2061, 0xa6d2, 0x6424, 0x6528, 0x662c, 0x6730, 0x0078,
++	0x385e, 0x7120, 0x810c, 0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7,
++	0x60cc, 0xd09c, 0x0040, 0x2bd7, 0x1078, 0x35ba, 0x0040, 0x2bd7,
++	0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3604, 0x701b,
++	0x38d2, 0x007c, 0x0d7e, 0xade8, 0x000d, 0x6828, 0xa0be, 0x7000,
++	0x0040, 0x38e5, 0xa0be, 0x7100, 0x0040, 0x38e5, 0xa0be, 0x7200,
++	0x0040, 0x38e5, 0x0d7f, 0x0078, 0x2bdb, 0x6820, 0x6924, 0x1078,
++	0x254d, 0x00c0, 0x3910, 0x1078, 0x455c, 0x00c0, 0x3910, 0x7122,
++	0x6612, 0x6516, 0x6e18, 0x0c7e, 0x1078, 0x35ba, 0x0040, 0x3910,
++	0x1078, 0x35ba, 0x0040, 0x3910, 0x0c7f, 0x0d7f, 0x6837, 0x0000,
++	0x6838, 0xc0fd, 0x683a, 0x6823, 0x0000, 0x6804, 0x2068, 0x1078,
++	0x8e82, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x3913, 0x007c,
++	0x0d7f, 0x0078, 0x2bd7, 0x7120, 0x1078, 0x298e, 0x6820, 0xa086,
++	0x8001, 0x0040, 0x2bd7, 0x2d00, 0x701e, 0x6804, 0xa080, 0x0002,
++	0x007e, 0x20a9, 0x002a, 0x2098, 0x20a0, 0x1078, 0x4281, 0x007f,
++	0xade8, 0x000d, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x2061, 0xa6d2,
++	0x6007, 0x0000, 0x6e00, 0x6f28, 0xa7c6, 0x7000, 0x00c0, 0x393a,
++	0x0078, 0x393e, 0xa7c6, 0x7100, 0x00c0, 0x3946, 0xa6c2, 0x0004,
++	0x0048, 0x2bdb, 0x2009, 0x0004, 0x0078, 0x3608, 0xa7c6, 0x7200,
++	0x00c0, 0x2bdb, 0xa6c2, 0x0054, 0x0048, 0x2bdb, 0x600e, 0x6013,
++	0x002a, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x1078, 0x13db,
++	0x7007, 0x0002, 0x701b, 0x395d, 0x007c, 0x701c, 0x2068, 0x6804,
++	0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x007e, 0x20a9, 0x002a,
++	0x2098, 0x20a0, 0x1078, 0x4281, 0x007f, 0x2009, 0x002a, 0x2061,
++	0xa6d2, 0x6224, 0x6328, 0x642c, 0x6530, 0x0078, 0x3608, 0x81ff,
++	0x00c0, 0x2bd7, 0x792c, 0x2001, 0xa89d, 0x2102, 0x1078, 0x35d2,
++	0x0040, 0x2bdb, 0x1078, 0x4673, 0x0040, 0x2bd7, 0x127e, 0x2091,
++	0x8000, 0x1078, 0x47de, 0x127f, 0x0078, 0x2bad, 0x7824, 0xd08c,
++	0x00c0, 0x3995, 0xd084, 0x0040, 0x31da, 0x1078, 0x35e4, 0x0040,
++	0x2bdb, 0x0c7e, 0x1078, 0x35ba, 0x0c7f, 0x00c0, 0x39a3, 0x2009,
++	0x0002, 0x0078, 0x2bd7, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006,
++	0x0040, 0x39b0, 0xa08e, 0x0004, 0x0040, 0x39b0, 0xa08e, 0x0005,
++	0x00c0, 0x39dd, 0x7824, 0xd08c, 0x0040, 0x39bb, 0x6000, 0xc08c,
++	0x6002, 0x0078, 0x39c5, 0x2001, 0xa653, 0x2004, 0xd0b4, 0x0040,
++	0x320f, 0x6000, 0xd08c, 0x00c0, 0x320f, 0x6837, 0x0000, 0x6838,
++	0xc0fd, 0x683a, 0x1078, 0x8e9e, 0x00c0, 0x39d2, 0x2009, 0x0003,
++	0x0078, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x39d7, 0x007c, 0x1078,
++	0x35e4, 0x0040, 0x2bdb, 0x0078, 0x320f, 0x2009, 0xa62f, 0x210c,
++	0x81ff, 0x0040, 0x39e7, 0x2009, 0x0001, 0x0078, 0x2bd7, 0x2001,
++	0xa600, 0x2004, 0xa086, 0x0003, 0x0040, 0x39f2, 0x2009, 0x0007,
++	0x0078, 0x2bd7, 0x2001, 0xa653, 0x2004, 0xd0ac, 0x0040, 0x39fc,
++	0x2009, 0x0008, 0x0078, 0x2bd7, 0x609c, 0xd0a4, 0x00c0, 0x3a03,
++	0xd0ac, 0x00c0, 0x320f, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838,
++	0xc0fd, 0x683a, 0x1078, 0x8f12, 0x00c0, 0x3a12, 0x2009, 0x0003,
++	0x0078, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x3a17, 0x007c, 0x6830,
++	0xa086, 0x0100, 0x00c0, 0x3a20, 0x2009, 0x0004, 0x0078, 0x2bd7,
++	0x1078, 0x35e4, 0x0040, 0x2bdb, 0x0078, 0x39b2, 0x81ff, 0x2009,
++	0x0001, 0x00c0, 0x2bd7, 0x6000, 0xa086, 0x0003, 0x2009, 0x0007,
++	0x00c0, 0x2bd7, 0x2001, 0xa653, 0x2004, 0xd0ac, 0x2009, 0x0008,
++	0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x6004, 0xa084,
++	0x00ff, 0xa086, 0x0006, 0x2009, 0x0009, 0x00c0, 0x2bd7, 0x0c7e,
++	0x1078, 0x35ba, 0x0c7f, 0x2009, 0x0002, 0x0040, 0x2bd7, 0x6837,
++	0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x7928, 0xa194,
++	0xff00, 0xa18c, 0x00ff, 0xa006, 0x82ff, 0x00c0, 0x3a65, 0xc0ed,
++	0x6952, 0x792c, 0x6956, 0x0078, 0x3a6e, 0xa28e, 0x0100, 0x00c0,
++	0x2bdb, 0xc0e5, 0x6853, 0x0000, 0x6857, 0x0000, 0x683e, 0x1078,
++	0x90bd, 0x2009, 0x0003, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b,
++	0x3a7a, 0x007c, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004, 0x0040,
++	0x2bd7, 0x0078, 0x2bad, 0x81ff, 0x2009, 0x0001, 0x00c0, 0x2bd7,
++	0x6000, 0xa086, 0x0003, 0x2009, 0x0007, 0x00c0, 0x2bd7, 0x1078,
++	0x35e4, 0x0040, 0x2bdb, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006,
++	0x2009, 0x0009, 0x00c0, 0x2bd7, 0x0c7e, 0x1078, 0x35ba, 0x0c7f,
++	0x2009, 0x0002, 0x0040, 0x2bd7, 0xad80, 0x000f, 0x2009, 0x0008,
++	0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3604, 0x701b, 0x3ab1,
++	0x007c, 0x0d7e, 0xade8, 0x000f, 0x6800, 0xa086, 0x0500, 0x00c0,
++	0x3ac4, 0x6804, 0xa005, 0x00c0, 0x3ac4, 0x6808, 0xa084, 0xff00,
++	0x00c0, 0x3ac4, 0x0078, 0x3ac7, 0x0d7f, 0x00c0, 0x2bdb, 0x0d7f,
++	0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x0c7e,
++	0x1078, 0x35e4, 0x00c0, 0x3ad7, 0x0c7f, 0x0078, 0x2bdb, 0x1078,
++	0x9119, 0x2009, 0x0003, 0x0c7f, 0x0040, 0x2bd7, 0x7007, 0x0003,
++	0x701b, 0x3ae3, 0x007c, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004,
++	0x0040, 0x2bd7, 0x0078, 0x2bad, 0x127e, 0x0c7e, 0x0e7e, 0x2061,
++	0x0100, 0x2071, 0xa600, 0x6044, 0xd0a4, 0x00c0, 0x3b15, 0xd084,
++	0x0040, 0x3afe, 0x1078, 0x3c75, 0x0078, 0x3b11, 0xd08c, 0x0040,
++	0x3b05, 0x1078, 0x3b8c, 0x0078, 0x3b11, 0xd094, 0x0040, 0x3b0c,
++	0x1078, 0x3b60, 0x0078, 0x3b11, 0xd09c, 0x0040, 0x3b11, 0x1078,
++	0x3b1f, 0x0e7f, 0x0c7f, 0x127f, 0x007c, 0x017e, 0x6128, 0xd19c,
++	0x00c0, 0x3b1c, 0xc19d, 0x612a, 0x017f, 0x0078, 0x3b11, 0x624c,
++	0xa286, 0xf0f0, 0x00c0, 0x3b30, 0x6048, 0xa086, 0xf0f0, 0x0040,
++	0x3b30, 0x624a, 0x6043, 0x0090, 0x6043, 0x0010, 0x0078, 0x3b5f,
++	0xa294, 0xff00, 0xa296, 0xf700, 0x0040, 0x3b45, 0x7134, 0xd1a4,
++	0x00c0, 0x3b45, 0x6240, 0xa294, 0x0010, 0x0040, 0x3b45, 0x2009,
++	0x00f7, 0x1078, 0x42a1, 0x0078, 0x3b5f, 0x6043, 0x0040, 0x6043,
++	0x0000, 0x7077, 0x0000, 0x708f, 0x0001, 0x70b3, 0x0000, 0x70cf,
++	0x0000, 0x2009, 0xacc0, 0x200b, 0x0000, 0x7087, 0x0000, 0x707b,
++	0x000f, 0x2009, 0x000f, 0x2011, 0x41d5, 0x1078, 0x5add, 0x007c,
++	0x157e, 0x7078, 0xa005, 0x00c0, 0x3b8a, 0x2011, 0x41d5, 0x1078,
++	0x5a45, 0x6040, 0xa094, 0x0010, 0xa285, 0x0020, 0x6042, 0x20a9,
++	0x00c8, 0x6044, 0xd08c, 0x00c0, 0x3b83, 0x00f0, 0x3b71, 0x6242,
++	0x708b, 0x0000, 0x6040, 0xa094, 0x0010, 0xa285, 0x0080, 0x6042,
++	0x6242, 0x0078, 0x3b8a, 0x6242, 0x708b, 0x0000, 0x707f, 0x0000,
++	0x0078, 0x3b8a, 0x157f, 0x007c, 0x707c, 0xa08a, 0x0003, 0x00c8,
++	0x3b95, 0x1079, 0x3b98, 0x0078, 0x3b97, 0x1078, 0x1332, 0x007c,
++	0x3b9b, 0x3bea, 0x3c74, 0x0f7e, 0x707f, 0x0001, 0x20e1, 0xa000,
++	0x20e1, 0x8700, 0x1078, 0x21f7, 0x20e1, 0x9080, 0x20e1, 0x4000,
++	0x2079, 0xab00, 0x207b, 0x2200, 0x7807, 0x00ef, 0x780b, 0x0000,
++	0x780f, 0x00ef, 0x7813, 0x0138, 0x7817, 0x0000, 0x781b, 0x0000,
++	0x781f, 0x0000, 0x7823, 0xffff, 0x7827, 0xffff, 0x782b, 0x0000,
++	0x782f, 0x0000, 0x2079, 0xab0c, 0x207b, 0x1101, 0x7807, 0x0000,
++	0x2099, 0xa605, 0x20a1, 0xab0e, 0x20a9, 0x0004, 0x53a3, 0x2079,
++	0xab12, 0x207b, 0x0000, 0x7807, 0x0000, 0x2099, 0xab00, 0x20a1,
++	0x020b, 0x20a9, 0x0014, 0x53a6, 0x60c3, 0x000c, 0x600f, 0x0000,
++	0x1078, 0x420b, 0x0f7f, 0x7083, 0x0000, 0x6043, 0x0008, 0x6043,
++	0x0000, 0x007c, 0x0d7e, 0x7080, 0x7083, 0x0000, 0xa025, 0x0040,
++	0x3c5e, 0x6020, 0xd0b4, 0x00c0, 0x3c5c, 0x718c, 0x81ff, 0x0040,
++	0x3c4b, 0xa486, 0x000c, 0x00c0, 0x3c56, 0xa480, 0x0018, 0x8004,
++	0x20a8, 0x2011, 0xab80, 0x2019, 0xab00, 0x220c, 0x2304, 0xa106,
++	0x00c0, 0x3c22, 0x8210, 0x8318, 0x00f0, 0x3c05, 0x6043, 0x0004,
++	0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0006, 0x707f, 0x0002,
++	0x708b, 0x0002, 0x2009, 0x07d0, 0x2011, 0x41dc, 0x1078, 0x5add,
++	0x0078, 0x3c5c, 0x2069, 0xab80, 0x6930, 0xa18e, 0x1101, 0x00c0,
++	0x3c56, 0x6834, 0xa005, 0x00c0, 0x3c56, 0x6900, 0xa18c, 0x00ff,
++	0x00c0, 0x3c36, 0x6804, 0xa005, 0x0040, 0x3c4b, 0x2011, 0xab8e,
++	0x2019, 0xa605, 0x20a9, 0x0004, 0x220c, 0x2304, 0xa102, 0x0048,
++	0x3c49, 0x00c0, 0x3c56, 0x8210, 0x8318, 0x00f0, 0x3c3c, 0x0078,
++	0x3c56, 0x708f, 0x0000, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099,
++	0xab80, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x6043, 0x0008,
++	0x6043, 0x0000, 0x0078, 0x3c5e, 0x0d7f, 0x007c, 0x6020, 0xd0b4,
++	0x00c0, 0x3c5c, 0x60c3, 0x000c, 0x2011, 0xa8bb, 0x2013, 0x0000,
++	0x7083, 0x0000, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575,
++	0x1078, 0x6e06, 0x0078, 0x3c5c, 0x007c, 0x7088, 0xa08a, 0x001d,
++	0x00c8, 0x3c7e, 0x1079, 0x3c81, 0x0078, 0x3c80, 0x1078, 0x1332,
++	0x007c, 0x3cab, 0x3cba, 0x3ce9, 0x3d02, 0x3d2e, 0x3d5a, 0x3d86,
++	0x3dbc, 0x3de8, 0x3e10, 0x3e53, 0x3e7d, 0x3e9f, 0x3eb5, 0x3edb,
++	0x3eee, 0x3ef7, 0x3f2b, 0x3f57, 0x3f83, 0x3faf, 0x3fe5, 0x4030,
++	0x405f, 0x4081, 0x40c3, 0x40e9, 0x4102, 0x4103, 0x0c7e, 0x2061,
++	0xa600, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0xa084, 0xfff9,
++	0x6006, 0x0c7f, 0x007c, 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043,
++	0x0002, 0x708b, 0x0001, 0x2009, 0x07d0, 0x2011, 0x41dc, 0x1078,
++	0x5add, 0x007c, 0x0f7e, 0x7080, 0xa086, 0x0014, 0x00c0, 0x3ce7,
++	0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x3ce7, 0x2079, 0xab80,
++	0x7a30, 0xa296, 0x1102, 0x00c0, 0x3ce5, 0x7834, 0xa005, 0x00c0,
++	0x3ce5, 0x7a38, 0xd2fc, 0x0040, 0x3cdb, 0x70b0, 0xa005, 0x00c0,
++	0x3cdb, 0x70b3, 0x0001, 0x2011, 0x41dc, 0x1078, 0x5a45, 0x708b,
++	0x0010, 0x1078, 0x3ef7, 0x0078, 0x3ce7, 0x1078, 0x4224, 0x0f7f,
++	0x007c, 0x708b, 0x0003, 0x6043, 0x0004, 0x2011, 0x41dc, 0x1078,
++	0x5a45, 0x1078, 0x4289, 0x20a3, 0x1102, 0x20a3, 0x0000, 0x20a9,
++	0x000a, 0x20a3, 0x0000, 0x00f0, 0x3cf9, 0x60c3, 0x0014, 0x1078,
++	0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3d2c, 0x2011,
++	0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3d2a, 0x2079,
++	0xab80, 0x7a30, 0xa296, 0x1102, 0x00c0, 0x3d2a, 0x7834, 0xa005,
++	0x00c0, 0x3d2a, 0x7a38, 0xd2fc, 0x0040, 0x3d24, 0x70b0, 0xa005,
++	0x00c0, 0x3d24, 0x70b3, 0x0001, 0x708b, 0x0004, 0x1078, 0x3d2e,
++	0x0078, 0x3d2c, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b, 0x0005,
++	0x1078, 0x4289, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, 0x2011,
++	0xab8e, 0x1078, 0x42d4, 0x00c0, 0x3d4c, 0x7074, 0xa005, 0x00c0,
++	0x3d4c, 0x7150, 0xa186, 0xffff, 0x0040, 0x3d4c, 0x1078, 0x419d,
++	0x0040, 0x3d4c, 0x1078, 0x42b8, 0x20a9, 0x0008, 0x2298, 0x26a0,
++	0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
++	0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3d84, 0x2011,
++	0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3d82, 0x2079,
++	0xab80, 0x7a30, 0xa296, 0x1103, 0x00c0, 0x3d82, 0x7834, 0xa005,
++	0x00c0, 0x3d82, 0x7a38, 0xd2fc, 0x0040, 0x3d7c, 0x70b0, 0xa005,
++	0x00c0, 0x3d7c, 0x70b3, 0x0001, 0x708b, 0x0006, 0x1078, 0x3d86,
++	0x0078, 0x3d84, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b, 0x0007,
++	0x1078, 0x4289, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011,
++	0xab8e, 0x1078, 0x42d4, 0x00c0, 0x3dae, 0x7074, 0xa005, 0x00c0,
++	0x3dae, 0x7154, 0xa186, 0xffff, 0x0040, 0x3dae, 0xa180, 0x29c0,
++	0x200c, 0xa18c, 0xff00, 0x810f, 0x1078, 0x419d, 0x0040, 0x3dae,
++	0x1078, 0x3820, 0x0040, 0x3dae, 0x1078, 0x256a, 0x20a9, 0x0008,
++	0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
++	0x0014, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040,
++	0x3de6, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0,
++	0x3de4, 0x2079, 0xab80, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x3de4,
++	0x7834, 0xa005, 0x00c0, 0x3de4, 0x7a38, 0xd2fc, 0x0040, 0x3dde,
++	0x70b0, 0xa005, 0x00c0, 0x3dde, 0x70b3, 0x0001, 0x708b, 0x0008,
++	0x1078, 0x3de8, 0x0078, 0x3de6, 0x1078, 0x4224, 0x0f7f, 0x007c,
++	0x708b, 0x0009, 0x1078, 0x4289, 0x20a3, 0x1105, 0x20a3, 0x0100,
++	0x3430, 0x1078, 0x42d4, 0x00c0, 0x3e01, 0x7074, 0xa005, 0x00c0,
++	0x3e01, 0x1078, 0x4104, 0x00c0, 0x3e0b, 0xa085, 0x0001, 0x1078,
++	0x256a, 0x20a9, 0x0008, 0x2099, 0xab8e, 0x26a0, 0x53a6, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x420b, 0x007c,
++	0x0f7e, 0x7080, 0xa005, 0x0040, 0x3e51, 0x2011, 0x41dc, 0x1078,
++	0x5a45, 0xa086, 0x0014, 0x00c0, 0x3e4f, 0x2079, 0xab80, 0x7a30,
++	0xa296, 0x1105, 0x00c0, 0x3e4f, 0x7834, 0x2011, 0x0100, 0xa21e,
++	0x00c0, 0x3e3a, 0x7a38, 0xd2fc, 0x0040, 0x3e34, 0x70b0, 0xa005,
++	0x00c0, 0x3e34, 0x70b3, 0x0001, 0x708b, 0x000a, 0x1078, 0x3e53,
++	0x0078, 0x3e51, 0xa005, 0x00c0, 0x3e4f, 0x7a38, 0xd2fc, 0x0040,
++	0x3e47, 0x70b0, 0xa005, 0x00c0, 0x3e47, 0x70b3, 0x0001, 0x7087,
++	0x0000, 0x708b, 0x000e, 0x1078, 0x3edb, 0x0078, 0x3e51, 0x1078,
++	0x4224, 0x0f7f, 0x007c, 0x708b, 0x000b, 0x2011, 0xab0e, 0x22a0,
++	0x20a9, 0x0040, 0x2019, 0xffff, 0x43a4, 0x20a9, 0x0002, 0x2009,
++	0x0000, 0x41a4, 0x1078, 0x4289, 0x20a3, 0x1106, 0x20a3, 0x0000,
++	0x1078, 0x42d4, 0x0040, 0x3e70, 0x2013, 0x0000, 0x0078, 0x3e74,
++	0x6030, 0xa085, 0x0100, 0x2012, 0x2298, 0x20a9, 0x0042, 0x53a6,
++	0x60c3, 0x0084, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005,
++	0x0040, 0x3e9d, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0084,
++	0x00c0, 0x3e9b, 0x2079, 0xab80, 0x7a30, 0xa296, 0x1106, 0x00c0,
++	0x3e9b, 0x7834, 0xa005, 0x00c0, 0x3e9b, 0x708b, 0x000c, 0x1078,
++	0x3e9f, 0x0078, 0x3e9d, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b,
++	0x000d, 0x1078, 0x4289, 0x20a3, 0x1107, 0x20a3, 0x0000, 0x2099,
++	0xab8e, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x0084, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005,
++	0x0040, 0x3ed9, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0084,
++	0x00c0, 0x3ed7, 0x2079, 0xab80, 0x7a30, 0xa296, 0x1107, 0x00c0,
++	0x3ed7, 0x7834, 0xa005, 0x00c0, 0x3ed7, 0x7087, 0x0001, 0x1078,
++	0x427b, 0x708b, 0x000e, 0x1078, 0x3edb, 0x0078, 0x3ed9, 0x1078,
++	0x4224, 0x0f7f, 0x007c, 0x708b, 0x000f, 0x7083, 0x0000, 0x608b,
++	0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009,
++	0x07d0, 0x2011, 0x41dc, 0x1078, 0x5a38, 0x007c, 0x7080, 0xa005,
++	0x0040, 0x3ef6, 0x2011, 0x41dc, 0x1078, 0x5a45, 0x007c, 0x708b,
++	0x0011, 0x1078, 0x42d4, 0x00c0, 0x3f14, 0x716c, 0x81ff, 0x0040,
++	0x3f14, 0x2009, 0x0000, 0x7070, 0xa084, 0x00ff, 0x1078, 0x254d,
++	0xa186, 0x007e, 0x0040, 0x3f14, 0xa186, 0x0080, 0x0040, 0x3f14,
++	0x2011, 0xab8e, 0x1078, 0x419d, 0x20e1, 0x9080, 0x20e1, 0x4000,
++	0x2099, 0xab80, 0x20a1, 0x020b, 0x7480, 0xa480, 0x0018, 0xa080,
++	0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0014,
++	0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3f55,
++	0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3f53,
++	0x2079, 0xab80, 0x7a30, 0xa296, 0x1103, 0x00c0, 0x3f53, 0x7834,
++	0xa005, 0x00c0, 0x3f53, 0x7a38, 0xd2fc, 0x0040, 0x3f4d, 0x70b0,
++	0xa005, 0x00c0, 0x3f4d, 0x70b3, 0x0001, 0x708b, 0x0012, 0x1078,
++	0x3f57, 0x0078, 0x3f55, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b,
++	0x0013, 0x1078, 0x4295, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430,
++	0x2011, 0xab8e, 0x1078, 0x42d4, 0x00c0, 0x3f75, 0x7074, 0xa005,
++	0x00c0, 0x3f75, 0x7150, 0xa186, 0xffff, 0x0040, 0x3f75, 0x1078,
++	0x419d, 0x0040, 0x3f75, 0x1078, 0x42b8, 0x20a9, 0x0008, 0x2298,
++	0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014,
++	0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3fad,
++	0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3fab,
++	0x2079, 0xab80, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x3fab, 0x7834,
++	0xa005, 0x00c0, 0x3fab, 0x7a38, 0xd2fc, 0x0040, 0x3fa5, 0x70b0,
++	0xa005, 0x00c0, 0x3fa5, 0x70b3, 0x0001, 0x708b, 0x0014, 0x1078,
++	0x3faf, 0x0078, 0x3fad, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b,
++	0x0015, 0x1078, 0x4295, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430,
++	0x2011, 0xab8e, 0x1078, 0x42d4, 0x00c0, 0x3fd7, 0x7074, 0xa005,
++	0x00c0, 0x3fd7, 0x7154, 0xa186, 0xffff, 0x0040, 0x3fd7, 0xa180,
++	0x29c0, 0x200c, 0xa18c, 0xff00, 0x810f, 0x1078, 0x419d, 0x0040,
++	0x3fd7, 0x1078, 0x3820, 0x0040, 0x3fd7, 0x1078, 0x256a, 0x20a9,
++	0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x0014, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005,
++	0x0040, 0x402e, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014,
++	0x00c0, 0x402c, 0x2079, 0xab80, 0x7a30, 0xa296, 0x1105, 0x00c0,
++	0x402c, 0x7834, 0x2011, 0x0100, 0xa21e, 0x00c0, 0x400b, 0x7a38,
++	0xd2fc, 0x0040, 0x4009, 0x70b0, 0xa005, 0x00c0, 0x4009, 0x70b3,
++	0x0001, 0x0078, 0x401a, 0xa005, 0x00c0, 0x402c, 0x7a38, 0xd2fc,
++	0x0040, 0x4018, 0x70b0, 0xa005, 0x00c0, 0x4018, 0x70b3, 0x0001,
++	0x7087, 0x0000, 0x7a38, 0xd2f4, 0x0040, 0x4026, 0x2001, 0xa674,
++	0x2004, 0xd0a4, 0x00c0, 0x4026, 0x70cf, 0x0008, 0x708b, 0x0016,
++	0x1078, 0x4030, 0x0078, 0x402e, 0x1078, 0x4224, 0x0f7f, 0x007c,
++	0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xab80, 0x20a1, 0x020b,
++	0x20a9, 0x000e, 0x53a6, 0x3430, 0x2011, 0xab8e, 0x708b, 0x0017,
++	0x1078, 0x42d4, 0x00c0, 0x4050, 0x7074, 0xa005, 0x00c0, 0x4050,
++	0x1078, 0x4104, 0x00c0, 0x405a, 0xa085, 0x0001, 0x1078, 0x256a,
++	0x20a9, 0x0008, 0x2099, 0xab8e, 0x26a0, 0x53a6, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x420b, 0x007c, 0x0f7e,
++	0x7080, 0xa005, 0x0040, 0x407f, 0x2011, 0x41dc, 0x1078, 0x5a45,
++	0xa086, 0x0084, 0x00c0, 0x407d, 0x2079, 0xab80, 0x7a30, 0xa296,
++	0x1106, 0x00c0, 0x407d, 0x7834, 0xa005, 0x00c0, 0x407d, 0x708b,
++	0x0018, 0x1078, 0x4081, 0x0078, 0x407f, 0x1078, 0x4224, 0x0f7f,
++	0x007c, 0x708b, 0x0019, 0x1078, 0x4295, 0x20a3, 0x1106, 0x20a3,
++	0x0000, 0x3430, 0x2099, 0xab8e, 0x2039, 0xab0e, 0x27a0, 0x20a9,
++	0x0040, 0x53a3, 0x1078, 0x42d4, 0x00c0, 0x40b5, 0x2728, 0x2514,
++	0x8207, 0xa084, 0x00ff, 0x8000, 0x2018, 0xa294, 0x00ff, 0x8007,
++	0xa205, 0x202a, 0x6030, 0x2310, 0x8214, 0xa2a0, 0xab0e, 0x2414,
++	0xa38c, 0x0001, 0x0040, 0x40b0, 0xa294, 0xff00, 0x0078, 0x40b3,
++	0xa294, 0x00ff, 0x8007, 0xa215, 0x2222, 0x2798, 0x26a0, 0x20a9,
++	0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084,
++	0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x40e7,
++	0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0084, 0x00c0, 0x40e5,
++	0x2079, 0xab80, 0x7a30, 0xa296, 0x1107, 0x00c0, 0x40e5, 0x7834,
++	0xa005, 0x00c0, 0x40e5, 0x7087, 0x0001, 0x1078, 0x427b, 0x708b,
++	0x001a, 0x1078, 0x40e9, 0x0078, 0x40e7, 0x1078, 0x4224, 0x0f7f,
++	0x007c, 0x708b, 0x001b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099,
++	0xab80, 0x20a1, 0x020b, 0x7480, 0xa480, 0x0018, 0xa080, 0x0007,
++	0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0084, 0x1078,
++	0x420b, 0x007c, 0x007c, 0x007c, 0x087e, 0x097e, 0x2029, 0xa653,
++	0x252c, 0x20a9, 0x0008, 0x2041, 0xab0e, 0x28a0, 0x2099, 0xab8e,
++	0x53a3, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0040, 0x411a,
++	0x2011, 0x0000, 0x2800, 0xa200, 0x200c, 0xa1a6, 0xffff, 0x00c0,
++	0x412c, 0xd5d4, 0x0040, 0x4127, 0x8210, 0x0078, 0x4128, 0x8211,
++	0x00f0, 0x411a, 0x0078, 0x4194, 0x82ff, 0x00c0, 0x413e, 0xd5d4,
++	0x0040, 0x4138, 0xa1a6, 0x3fff, 0x0040, 0x4124, 0x0078, 0x413c,
++	0xa1a6, 0x3fff, 0x0040, 0x4194, 0xa18d, 0xc000, 0x20a9, 0x0010,
++	0x2019, 0x0001, 0xd5d4, 0x0040, 0x4147, 0x2019, 0x0010, 0x2120,
++	0xd5d4, 0x0040, 0x414e, 0x8423, 0x0078, 0x414f, 0x8424, 0x00c8,
++	0x415c, 0xd5d4, 0x0040, 0x4157, 0x8319, 0x0078, 0x4158, 0x8318,
++	0x00f0, 0x4148, 0x0078, 0x4194, 0x23a8, 0x2021, 0x0001, 0x8426,
++	0x8425, 0x00f0, 0x4160, 0x2328, 0x8529, 0xa2be, 0x0007, 0x0040,
++	0x4174, 0x007e, 0x2039, 0x0007, 0x2200, 0xa73a, 0x007f, 0x27a8,
++	0xa5a8, 0x0010, 0x00f0, 0x4170, 0x7552, 0xa5c8, 0x29c0, 0x292c,
++	0xa5ac, 0x00ff, 0x6532, 0x60e7, 0x0000, 0x65ea, 0x706f, 0x0000,
++	0x7572, 0x2018, 0x2304, 0xa405, 0x201a, 0x7077, 0x0001, 0x26a0,
++	0x2898, 0x20a9, 0x0008, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0xa085, 0x0001, 0x0078, 0x419a, 0xa006, 0x0078, 0x419a, 0xa006,
++	0x1078, 0x1332, 0x097f, 0x087f, 0x007c, 0x2118, 0x2021, 0x0000,
++	0x2001, 0x0007, 0xa39a, 0x0010, 0x0048, 0x41aa, 0x8420, 0x8001,
++	0x0078, 0x41a2, 0x2118, 0x84ff, 0x0040, 0x41b3, 0xa39a, 0x0010,
++	0x8421, 0x00c0, 0x41ae, 0x2021, 0x0001, 0x83ff, 0x0040, 0x41bc,
++	0x8423, 0x8319, 0x00c0, 0x41b8, 0xa238, 0x2704, 0xa42c, 0x00c0,
++	0x41d4, 0xa405, 0x203a, 0x7152, 0xa1a0, 0x29c0, 0x242c, 0xa5ac,
++	0x00ff, 0x6532, 0x60e7, 0x0000, 0x65ea, 0x706f, 0x0000, 0x7572,
++	0x7077, 0x0001, 0xa084, 0x0000, 0x007c, 0x0e7e, 0x2071, 0xa600,
++	0x707b, 0x0000, 0x0e7f, 0x007c, 0x0e7e, 0x0f7e, 0x2001, 0x0002,
++	0x1078, 0x5ae6, 0x2079, 0x0100, 0x2071, 0x0140, 0x1078, 0x6e0f,
++	0x7004, 0xa084, 0x4000, 0x0040, 0x41f1, 0x7003, 0x1000, 0x7003,
++	0x0000, 0x127e, 0x2091, 0x8000, 0x2071, 0xa622, 0x2073, 0x0000,
++	0x7840, 0x027e, 0x017e, 0x2009, 0x00f7, 0x1078, 0x42a1, 0x017f,
++	0xa094, 0x0010, 0xa285, 0x0080, 0x7842, 0x7a42, 0x027f, 0x127f,
++	0x0f7f, 0x0e7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x2011, 0xa8bb,
++	0x2013, 0x0000, 0x7083, 0x0000, 0x127f, 0x20e1, 0x9080, 0x60a3,
++	0x0056, 0x60a7, 0x9575, 0x1078, 0x6e06, 0x2009, 0x07d0, 0x2011,
++	0x41dc, 0x1078, 0x5add, 0x007c, 0x017e, 0x027e, 0x0c7e, 0x127e,
++	0x2091, 0x8000, 0x2011, 0x0003, 0x1078, 0x70e0, 0x2011, 0x0002,
++	0x1078, 0x70ea, 0x1078, 0x6fc4, 0x037e, 0x2019, 0x0000, 0x1078,
++	0x7058, 0x037f, 0x2009, 0x00f7, 0x1078, 0x42a1, 0x2061, 0xa8c4,
++	0x601b, 0x0000, 0x601f, 0x0000, 0x2061, 0xa600, 0x6003, 0x0001,
++	0x2061, 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x002d,
++	0x2011, 0x4259, 0x1078, 0x5a38, 0x127f, 0x0c7f, 0x027f, 0x017f,
++	0x007c, 0x0e7e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2001, 0x0001,
++	0x1078, 0x5ae6, 0x2071, 0x0100, 0x1078, 0x6e0f, 0x2071, 0x0140,
++	0x7004, 0xa084, 0x4000, 0x0040, 0x4271, 0x7003, 0x1000, 0x7003,
++	0x0000, 0x2001, 0x0001, 0x1078, 0x24e8, 0x1078, 0x4224, 0x127f,
++	0x007f, 0x0e7f, 0x007c, 0x20a9, 0x0040, 0x20a1, 0xacc0, 0x2099,
++	0xab8e, 0x3304, 0x8007, 0x20a2, 0x9398, 0x94a0, 0x00f0, 0x4281,
++	0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xab00, 0x20a1,
++	0x020b, 0x20a9, 0x000c, 0x53a6, 0x007c, 0x20e1, 0x9080, 0x20e1,
++	0x4000, 0x2099, 0xab80, 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6,
++	0x007c, 0x0c7e, 0x007e, 0x2061, 0x0100, 0x810f, 0x2001, 0xa62f,
++	0x2004, 0xa005, 0x00c0, 0x42b2, 0x6030, 0xa084, 0x00ff, 0xa105,
++	0x0078, 0x42b4, 0xa185, 0x00f7, 0x604a, 0x007f, 0x0c7f, 0x007c,
++	0x017e, 0x047e, 0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040, 0x42cb,
++	0xa006, 0x2020, 0x2009, 0x002a, 0x1078, 0xa21d, 0x2001, 0xa60c,
++	0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0000, 0x1078,
++	0x284f, 0x047f, 0x017f, 0x007c, 0x007e, 0x2001, 0xa60c, 0x2004,
++	0xd09c, 0x0040, 0x42db, 0x007f, 0x007c, 0x007e, 0x017e, 0x127e,
++	0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0xa18d, 0x0006, 0x2102,
++	0x127f, 0x017f, 0x007f, 0x007c, 0x157e, 0x20a9, 0x00ff, 0x2009,
++	0xa735, 0xa006, 0x200a, 0x8108, 0x00f0, 0x42f2, 0x157f, 0x007c,
++	0x0d7e, 0x037e, 0x157e, 0x137e, 0x147e, 0x2069, 0xa652, 0xa006,
++	0x6002, 0x6007, 0x0707, 0x600a, 0x600e, 0x6012, 0xa198, 0x29c0,
++	0x231c, 0xa39c, 0x00ff, 0x6316, 0x20a9, 0x0004, 0xac98, 0x0006,
++	0x23a0, 0x40a4, 0x20a9, 0x0004, 0xac98, 0x000a, 0x23a0, 0x40a4,
++	0x603e, 0x6042, 0x604e, 0x6052, 0x6056, 0x605a, 0x605e, 0x6062,
++	0x6066, 0x606a, 0x606e, 0x6072, 0x6076, 0x607a, 0x607e, 0x6082,
++	0x6086, 0x608a, 0x608e, 0x6092, 0x6096, 0x609a, 0x609e, 0x60ae,
++	0x61a2, 0x0d7e, 0x60a4, 0xa06d, 0x0040, 0x4338, 0x1078, 0x13a4,
++	0x60a7, 0x0000, 0x60a8, 0xa06d, 0x0040, 0x4340, 0x1078, 0x13a4,
++	0x60ab, 0x0000, 0x0d7f, 0xa006, 0x604a, 0x6810, 0x603a, 0x680c,
++	0x6046, 0x6814, 0xa084, 0x00ff, 0x6042, 0x147f, 0x137f, 0x157f,
++	0x037f, 0x0d7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x6944, 0x6e48,
++	0xa684, 0x3fff, 0xa082, 0x4000, 0x00c8, 0x4424, 0xa18c, 0xff00,
++	0x810f, 0xa182, 0x00ff, 0x00c8, 0x442a, 0x2001, 0xa60c, 0x2004,
++	0xa084, 0x0003, 0x0040, 0x4385, 0x2001, 0xa60c, 0x2004, 0xd084,
++	0x00c0, 0x4405, 0xa188, 0xa735, 0x2104, 0xa065, 0x0040, 0x4405,
++	0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x00c0, 0x4405, 0x6000,
++	0xd0c4, 0x0040, 0x4405, 0x0078, 0x4392, 0xa188, 0xa735, 0x2104,
++	0xa065, 0x0040, 0x43e9, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006,
++	0x00c0, 0x43ef, 0x60a4, 0xa00d, 0x0040, 0x439a, 0x1078, 0x4817,
++	0x0040, 0x43e3, 0x60a8, 0xa00d, 0x0040, 0x43b4, 0x1078, 0x486a,
++	0x00c0, 0x43b4, 0x694c, 0xd1fc, 0x00c0, 0x43aa, 0x1078, 0x44df,
++	0x0078, 0x43de, 0x1078, 0x4484, 0x694c, 0xd1ec, 0x00c0, 0x43de,
++	0x1078, 0x46d6, 0x0078, 0x43de, 0x694c, 0xa184, 0xa000, 0x0040,
++	0x43ce, 0xd1ec, 0x0040, 0x43c7, 0xd1fc, 0x0040, 0x43c3, 0x1078,
++	0x46e7, 0x0078, 0x43ca, 0x1078, 0x46e7, 0x0078, 0x43ce, 0xd1fc,
++	0x0040, 0x43ce, 0x1078, 0x4484, 0x0078, 0x43de, 0x6050, 0xa00d,
++	0x0040, 0x43d9, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052, 0x0078,
++	0x43de, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x1078, 0x5da9,
++	0xa006, 0x127f, 0x007c, 0x2001, 0x0005, 0x2009, 0x0000, 0x0078,
++	0x442e, 0x2001, 0x0028, 0x2009, 0x0000, 0x0078, 0x442e, 0xa082,
++	0x0006, 0x00c8, 0x4405, 0x60a0, 0xd0bc, 0x00c0, 0x4401, 0x6100,
++	0xd1fc, 0x0040, 0x4392, 0x2001, 0x0029, 0x2009, 0x1000, 0x0078,
++	0x442e, 0x2001, 0x0028, 0x0078, 0x4420, 0x2009, 0xa60c, 0x210c,
++	0xd18c, 0x0040, 0x440f, 0x2001, 0x0004, 0x0078, 0x4420, 0xd184,
++	0x0040, 0x4416, 0x2001, 0x0004, 0x0078, 0x4420, 0x2001, 0x0029,
++	0x6100, 0xd1fc, 0x0040, 0x4420, 0x2009, 0x1000, 0x0078, 0x442e,
++	0x2009, 0x0000, 0x0078, 0x442e, 0x2001, 0x0029, 0x2009, 0x0000,
++	0x0078, 0x442e, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005, 0x127f,
++	0x007c, 0x6944, 0x6e48, 0xa684, 0x3fff, 0xa082, 0x4000, 0x00c8,
++	0x447e, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x00c8, 0x4464,
++	0xa188, 0xa735, 0x2104, 0xa065, 0x0040, 0x4464, 0x6004, 0xa084,
++	0x00ff, 0xa08e, 0x0006, 0x00c0, 0x446a, 0x684c, 0xd0ec, 0x0040,
++	0x4457, 0x1078, 0x46e7, 0x1078, 0x4484, 0x0078, 0x445f, 0x1078,
++	0x4484, 0x684c, 0xd0fc, 0x0040, 0x445f, 0x1078, 0x46d6, 0x1078,
++	0x472f, 0xa006, 0x0078, 0x4482, 0x2001, 0x0028, 0x2009, 0x0000,
++	0x0078, 0x4482, 0xa082, 0x0006, 0x00c8, 0x4478, 0x6100, 0xd1fc,
++	0x0040, 0x444d, 0x2001, 0x0029, 0x2009, 0x1000, 0x0078, 0x4482,
++	0x2001, 0x0029, 0x2009, 0x0000, 0x0078, 0x4482, 0x2001, 0x0029,
++	0x2009, 0x0000, 0xa005, 0x007c, 0x127e, 0x2091, 0x8000, 0x6050,
++	0xa00d, 0x0040, 0x4492, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052,
++	0x127f, 0x007c, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x0078,
++	0x4490, 0x127e, 0x2091, 0x8000, 0x604c, 0xa005, 0x0040, 0x44af,
++	0x0e7e, 0x2071, 0xa8b1, 0x7004, 0xa086, 0x0002, 0x0040, 0x44b6,
++	0x0e7f, 0x604c, 0x6802, 0x2d00, 0x604e, 0x127f, 0x007c, 0x2d00,
++	0x6052, 0x604e, 0x6803, 0x0000, 0x0078, 0x44ad, 0x701c, 0xac06,
++	0x00c0, 0x44a8, 0x604c, 0x2070, 0x7000, 0x6802, 0x2d00, 0x7002,
++	0x0e7f, 0x127f, 0x007c, 0x127e, 0x2091, 0x8000, 0x604c, 0xa06d,
++	0x0040, 0x44d1, 0x6800, 0xa005, 0x00c0, 0x44cf, 0x6052, 0x604e,
++	0xad05, 0x127f, 0x007c, 0x604c, 0xa06d, 0x0040, 0x44de, 0x6800,
++	0xa005, 0x00c0, 0x44dc, 0x6052, 0x604e, 0xad05, 0x007c, 0x6803,
++	0x0000, 0x6084, 0xa00d, 0x0040, 0x44e9, 0x2d00, 0x200a, 0x6086,
++	0x007c, 0x2d00, 0x6086, 0x6082, 0x0078, 0x44e8, 0x127e, 0x0c7e,
++	0x027e, 0x2091, 0x8000, 0x6218, 0x2260, 0x6200, 0xa005, 0x0040,
++	0x44fc, 0xc285, 0x0078, 0x44fd, 0xc284, 0x6202, 0x027f, 0x0c7f,
++	0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091, 0x8000, 0x6218, 0x2260,
++	0x6204, 0x007e, 0xa086, 0x0006, 0x00c0, 0x4521, 0x609c, 0xd0ac,
++	0x0040, 0x4521, 0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040, 0x4521,
++	0xa284, 0xff00, 0x8007, 0xa086, 0x0007, 0x00c0, 0x4521, 0x2011,
++	0x0600, 0x007f, 0xa294, 0xff00, 0xa215, 0x6206, 0x007e, 0xa086,
++	0x0006, 0x00c0, 0x4531, 0x6290, 0x82ff, 0x00c0, 0x4531, 0x1078,
++	0x1332, 0x007f, 0x0c7f, 0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091,
++	0x8000, 0x6218, 0x2260, 0x6204, 0x007e, 0xa086, 0x0006, 0x00c0,
++	0x4553, 0x609c, 0xd0a4, 0x0040, 0x4553, 0x2001, 0xa653, 0x2004,
++	0xd0ac, 0x00c0, 0x4553, 0xa284, 0x00ff, 0xa086, 0x0007, 0x00c0,
++	0x4553, 0x2011, 0x0006, 0x007f, 0xa294, 0x00ff, 0x8007, 0xa215,
++	0x6206, 0x0c7f, 0x127f, 0x007c, 0x027e, 0xa182, 0x00ff, 0x0048,
++	0x4565, 0xa085, 0x0001, 0x0078, 0x457d, 0xa190, 0xa735, 0x2204,
++	0xa065, 0x00c0, 0x457c, 0x017e, 0x0d7e, 0x1078, 0x1370, 0x2d60,
++	0x0d7f, 0x017f, 0x0040, 0x4561, 0x2c00, 0x2012, 0x60a7, 0x0000,
++	0x60ab, 0x0000, 0x1078, 0x42f8, 0xa006, 0x027f, 0x007c, 0x127e,
++	0x2091, 0x8000, 0x027e, 0xa182, 0x00ff, 0x0048, 0x458b, 0xa085,
++	0x0001, 0x0078, 0x45c1, 0x0d7e, 0xa190, 0xa735, 0x2204, 0xa06d,
++	0x0040, 0x45bf, 0x2013, 0x0000, 0x0d7e, 0x0c7e, 0x2d60, 0x60a4,
++	0xa06d, 0x0040, 0x459d, 0x1078, 0x13a4, 0x60a8, 0xa06d, 0x0040,
++	0x45a3, 0x1078, 0x13a4, 0x0c7f, 0x0d7f, 0x0d7e, 0x0c7e, 0x68ac,
++	0x2060, 0x8cff, 0x0040, 0x45bb, 0x600c, 0x007e, 0x6010, 0x2068,
++	0x1078, 0x8d06, 0x0040, 0x45b6, 0x1078, 0x13b4, 0x1078, 0x772d,
++	0x0c7f, 0x0078, 0x45a9, 0x0c7f, 0x0d7f, 0x1078, 0x13a4, 0x0d7f,
++	0xa006, 0x027f, 0x127f, 0x007c, 0x017e, 0xa182, 0x00ff, 0x0048,
++	0x45cd, 0xa085, 0x0001, 0x0078, 0x45d4, 0xa188, 0xa735, 0x2104,
++	0xa065, 0x0040, 0x45c9, 0xa006, 0x017f, 0x007c, 0x0d7e, 0x157e,
++	0x137e, 0x147e, 0x600b, 0x0000, 0x600f, 0x0000, 0x6000, 0xc08c,
++	0x6002, 0x2069, 0xab8e, 0x6808, 0x605e, 0x6810, 0x6062, 0x6138,
++	0xa10a, 0x0048, 0x45ec, 0x603a, 0x6814, 0x6066, 0x2099, 0xab96,
++	0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2099, 0xab9a,
++	0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2069, 0xabae,
++	0x6808, 0x606a, 0x690c, 0x616e, 0x6810, 0x6072, 0x6818, 0x6076,
++	0x60a0, 0xa086, 0x007e, 0x00c0, 0x4611, 0x2069, 0xab8e, 0x690c,
++	0x616e, 0xa182, 0x0211, 0x00c8, 0x4619, 0x2009, 0x0008, 0x0078,
++	0x4643, 0xa182, 0x0259, 0x00c8, 0x4621, 0x2009, 0x0007, 0x0078,
++	0x4643, 0xa182, 0x02c1, 0x00c8, 0x4629, 0x2009, 0x0006, 0x0078,
++	0x4643, 0xa182, 0x0349, 0x00c8, 0x4631, 0x2009, 0x0005, 0x0078,
++	0x4643, 0xa182, 0x0421, 0x00c8, 0x4639, 0x2009, 0x0004, 0x0078,
++	0x4643, 0xa182, 0x0581, 0x00c8, 0x4641, 0x2009, 0x0003, 0x0078,
++	0x4643, 0x2009, 0x0002, 0x6192, 0x147f, 0x137f, 0x157f, 0x0d7f,
++	0x007c, 0x017e, 0x027e, 0x0e7e, 0x2071, 0xab8d, 0x2e04, 0x6896,
++	0x2071, 0xab8e, 0x7004, 0x689a, 0x701c, 0x689e, 0x6a00, 0x2009,
++	0xa672, 0x210c, 0xd0bc, 0x0040, 0x4663, 0xd1ec, 0x0040, 0x4663,
++	0xc2ad, 0x0078, 0x4664, 0xc2ac, 0xd0c4, 0x0040, 0x466d, 0xd1e4,
++	0x0040, 0x466d, 0xc2bd, 0x0078, 0x466e, 0xc2bc, 0x6a02, 0x0e7f,
++	0x027f, 0x017f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x60a4,
++	0xa06d, 0x0040, 0x4697, 0x6900, 0x81ff, 0x00c0, 0x46ab, 0x6a04,
++	0xa282, 0x0010, 0x00c8, 0x46b0, 0xad88, 0x0004, 0x20a9, 0x0010,
++	0x2104, 0xa086, 0xffff, 0x0040, 0x4692, 0x8108, 0x00f0, 0x4688,
++	0x1078, 0x1332, 0x260a, 0x8210, 0x6a06, 0x0078, 0x46ab, 0x1078,
++	0x138b, 0x0040, 0x46b0, 0x2d00, 0x60a6, 0x6803, 0x0000, 0xad88,
++	0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x00f0, 0x46a3,
++	0x6807, 0x0001, 0x6e12, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x007c,
++	0xa006, 0x0078, 0x46ad, 0x127e, 0x2091, 0x8000, 0x0d7e, 0x60a4,
++	0xa00d, 0x0040, 0x46d3, 0x2168, 0x6800, 0xa005, 0x00c0, 0x46cf,
++	0x1078, 0x4817, 0x00c0, 0x46d3, 0x200b, 0xffff, 0x6804, 0xa08a,
++	0x0002, 0x0048, 0x46cf, 0x8001, 0x6806, 0x0078, 0x46d3, 0x1078,
++	0x13a4, 0x60a7, 0x0000, 0x0d7f, 0x127f, 0x007c, 0x127e, 0x2091,
++	0x8000, 0x1078, 0x487f, 0x0078, 0x46df, 0x1078, 0x4484, 0x1078,
++	0x4775, 0x00c0, 0x46dd, 0x1078, 0x472f, 0x127f, 0x007c, 0x0d7e,
++	0x127e, 0x2091, 0x8000, 0x60a8, 0xa06d, 0x0040, 0x470b, 0x6950,
++	0x81ff, 0x00c0, 0x471f, 0x6a54, 0xa282, 0x0010, 0x00c8, 0x472c,
++	0xad88, 0x0018, 0x20a9, 0x0010, 0x2104, 0xa086, 0xffff, 0x0040,
++	0x4706, 0x8108, 0x00f0, 0x46fc, 0x1078, 0x1332, 0x260a, 0x8210,
++	0x6a56, 0x0078, 0x471f, 0x1078, 0x138b, 0x0040, 0x472c, 0x2d00,
++	0x60aa, 0x6853, 0x0000, 0xad88, 0x0018, 0x20a9, 0x0010, 0x200b,
++	0xffff, 0x8108, 0x00f0, 0x4717, 0x6857, 0x0001, 0x6e62, 0x0078,
++	0x4723, 0x1078, 0x44df, 0x1078, 0x4739, 0x00c0, 0x4721, 0xa085,
++	0x0001, 0x127f, 0x0d7f, 0x007c, 0xa006, 0x0078, 0x4729, 0x127e,
++	0x2091, 0x8000, 0x1078, 0x5da9, 0x127f, 0x007c, 0xa01e, 0x0078,
++	0x473b, 0x2019, 0x0001, 0xa00e, 0x127e, 0x2091, 0x8000, 0x604c,
++	0x2068, 0x6000, 0xd0dc, 0x00c0, 0x4759, 0x8dff, 0x0040, 0x4770,
++	0x83ff, 0x0040, 0x4751, 0x6848, 0xa606, 0x0040, 0x475e, 0x0078,
++	0x4759, 0x683c, 0xa406, 0x00c0, 0x4759, 0x6840, 0xa506, 0x0040,
++	0x475e, 0x2d08, 0x6800, 0x2068, 0x0078, 0x4745, 0x1078, 0x7233,
++	0x6a00, 0x604c, 0xad06, 0x00c0, 0x4768, 0x624e, 0x0078, 0x476b,
++	0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0, 0x4770, 0x6152, 0x8dff,
++	0x127f, 0x007c, 0xa01e, 0x0078, 0x4777, 0x2019, 0x0001, 0xa00e,
++	0x6080, 0x2068, 0x8dff, 0x0040, 0x47a3, 0x83ff, 0x0040, 0x4786,
++	0x6848, 0xa606, 0x0040, 0x4793, 0x0078, 0x478e, 0x683c, 0xa406,
++	0x00c0, 0x478e, 0x6840, 0xa506, 0x0040, 0x4793, 0x2d08, 0x6800,
++	0x2068, 0x0078, 0x477a, 0x6a00, 0x6080, 0xad06, 0x00c0, 0x479b,
++	0x6282, 0x0078, 0x479e, 0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0,
++	0x47a3, 0x6186, 0x8dff, 0x007c, 0xa016, 0x1078, 0x4810, 0x00c0,
++	0x47ab, 0x2011, 0x0001, 0x1078, 0x4863, 0x00c0, 0x47b1, 0xa295,
++	0x0002, 0x007c, 0x1078, 0x489b, 0x0040, 0x47ba, 0x1078, 0x8dca,
++	0x0078, 0x47bc, 0xa085, 0x0001, 0x007c, 0x1078, 0x489b, 0x0040,
++	0x47c5, 0x1078, 0x8d62, 0x0078, 0x47c7, 0xa085, 0x0001, 0x007c,
++	0x1078, 0x489b, 0x0040, 0x47d0, 0x1078, 0x8dac, 0x0078, 0x47d2,
++	0xa085, 0x0001, 0x007c, 0x1078, 0x489b, 0x0040, 0x47db, 0x1078,
++	0x8d7e, 0x0078, 0x47dd, 0xa085, 0x0001, 0x007c, 0x1078, 0x489b,
++	0x0040, 0x47e6, 0x1078, 0x8de8, 0x0078, 0x47e8, 0xa085, 0x0001,
++	0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091, 0x8000, 0x6080, 0xa06d,
++	0x0040, 0x4808, 0x6800, 0x007e, 0x6837, 0x0103, 0x6b4a, 0x6847,
++	0x0000, 0x1078, 0x8f7d, 0x007e, 0x6000, 0xd0fc, 0x0040, 0x4802,
++	0x1078, 0xa4ed, 0x007f, 0x1078, 0x4a73, 0x007f, 0x0078, 0x47ef,
++	0x6083, 0x0000, 0x6087, 0x0000, 0x0d7f, 0x007f, 0x127f, 0x007c,
++	0x60a4, 0xa00d, 0x00c0, 0x4817, 0xa085, 0x0001, 0x007c, 0x0e7e,
++	0x2170, 0x7000, 0xa005, 0x00c0, 0x482c, 0x20a9, 0x0010, 0xae88,
++	0x0004, 0x2104, 0xa606, 0x0040, 0x482c, 0x8108, 0x00f0, 0x4821,
++	0xa085, 0x0001, 0x0078, 0x482d, 0xa006, 0x0e7f, 0x007c, 0x0d7e,
++	0x127e, 0x2091, 0x8000, 0x60a4, 0xa06d, 0x00c0, 0x483d, 0x1078,
++	0x138b, 0x0040, 0x484f, 0x2d00, 0x60a6, 0x6803, 0x0001, 0x6807,
++	0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108,
++	0x00f0, 0x4845, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x007c, 0xa006,
++	0x0078, 0x484c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x60a4, 0xa06d,
++	0x0040, 0x4860, 0x60a7, 0x0000, 0x1078, 0x13a4, 0xa085, 0x0001,
++	0x127f, 0x0d7f, 0x007c, 0x60a8, 0xa00d, 0x00c0, 0x486a, 0xa085,
++	0x0001, 0x007c, 0x0e7e, 0x2170, 0x7050, 0xa005, 0x00c0, 0x487d,
++	0x20a9, 0x0010, 0xae88, 0x0018, 0x2104, 0xa606, 0x0040, 0x487d,
++	0x8108, 0x00f0, 0x4874, 0xa085, 0x0001, 0x0e7f, 0x007c, 0x127e,
++	0x2091, 0x8000, 0x1078, 0x4863, 0x00c0, 0x4899, 0x200b, 0xffff,
++	0x0d7e, 0x60a8, 0x2068, 0x6854, 0xa08a, 0x0002, 0x0048, 0x4894,
++	0x8001, 0x6856, 0x0078, 0x4898, 0x1078, 0x13a4, 0x60ab, 0x0000,
++	0x0d7f, 0x127f, 0x007c, 0x609c, 0xd0a4, 0x007c, 0x0f7e, 0x71b0,
++	0x81ff, 0x00c0, 0x48b9, 0x71cc, 0xd19c, 0x0040, 0x48b9, 0x2001,
++	0x007e, 0xa080, 0xa735, 0x2004, 0xa07d, 0x0040, 0x48b9, 0x7804,
++	0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x48b9, 0x7800, 0xc0ed,
++	0x7802, 0x2079, 0xa652, 0x7804, 0xd0a4, 0x0040, 0x48df, 0x157e,
++	0x0c7e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x45c4,
++	0x00c0, 0x48d9, 0x6004, 0xa084, 0xff00, 0x8007, 0xa096, 0x0004,
++	0x0040, 0x48d6, 0xa086, 0x0006, 0x00c0, 0x48d9, 0x6000, 0xc0ed,
++	0x6002, 0x017f, 0x8108, 0x00f0, 0x48c5, 0x0c7f, 0x157f, 0x1078,
++	0x4967, 0x0040, 0x48e8, 0x2001, 0xa8a1, 0x200c, 0x0078, 0x48f0,
++	0x2079, 0xa652, 0x7804, 0xd0a4, 0x0040, 0x48f4, 0x2009, 0x07d0,
++	0x2011, 0x48f6, 0x1078, 0x5add, 0x0f7f, 0x007c, 0x2011, 0x48f6,
++	0x1078, 0x5a45, 0x1078, 0x4967, 0x0040, 0x491e, 0x2001, 0xa7b3,
++	0x2004, 0xa080, 0x0000, 0x200c, 0xc1ec, 0x2102, 0x2001, 0xa653,
++	0x2004, 0xd0a4, 0x0040, 0x4912, 0x2009, 0x07d0, 0x2011, 0x48f6,
++	0x1078, 0x5add, 0x0e7e, 0x2071, 0xa600, 0x706f, 0x0000, 0x7073,
++	0x0000, 0x1078, 0x2677, 0x0e7f, 0x0078, 0x4956, 0x157e, 0x0c7e,
++	0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x45c4, 0x00c0,
++	0x4950, 0x6000, 0xd0ec, 0x0040, 0x4950, 0x047e, 0x62a0, 0xa294,
++	0x00ff, 0x8227, 0xa006, 0x2009, 0x0029, 0x1078, 0xa21d, 0x6000,
++	0xc0e5, 0xc0ec, 0x6002, 0x6004, 0xa084, 0x00ff, 0xa085, 0x0700,
++	0x6006, 0x2019, 0x0029, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000,
++	0x1078, 0x5e0a, 0x2009, 0x0000, 0x1078, 0x9f8b, 0x077f, 0x047f,
++	0x017f, 0x8108, 0x00f0, 0x4924, 0x0c7f, 0x157f, 0x007c, 0x0c7e,
++	0x6018, 0x2060, 0x6000, 0xc0ec, 0x6002, 0x0c7f, 0x007c, 0x7818,
++	0x2004, 0xd0ac, 0x007c, 0x7818, 0x2004, 0xd0bc, 0x007c, 0x0f7e,
++	0x2001, 0xa7b3, 0x2004, 0xa07d, 0x0040, 0x4970, 0x7800, 0xd0ec,
++	0x0f7f, 0x007c, 0x127e, 0x027e, 0x2091, 0x8000, 0x007e, 0x62a0,
++	0xa290, 0xa735, 0x2204, 0xac06, 0x10c0, 0x1332, 0x007f, 0x6200,
++	0xa005, 0x0040, 0x4986, 0xc2fd, 0x0078, 0x4987, 0xc2fc, 0x6202,
++	0x027f, 0x127f, 0x007c, 0x2011, 0xa633, 0x2204, 0xd0cc, 0x0040,
++	0x4998, 0x2001, 0xa89f, 0x200c, 0x2011, 0x4999, 0x1078, 0x5add,
++	0x007c, 0x2011, 0x4999, 0x1078, 0x5a45, 0x2011, 0xa633, 0x2204,
++	0xc0cc, 0x2012, 0x007c, 0x2071, 0xa714, 0x7003, 0x0001, 0x7007,
++	0x0000, 0x7013, 0x0000, 0x7017, 0x0000, 0x701b, 0x0000, 0x701f,
++	0x0000, 0x700b, 0x0000, 0x704b, 0x0001, 0x704f, 0x0000, 0x705b,
++	0x0020, 0x705f, 0x0040, 0x707f, 0x0000, 0x2071, 0xa87d, 0x7003,
++	0xa714, 0x7007, 0x0000, 0x700b, 0x0000, 0x700f, 0xa85d, 0x7013,
++	0x0020, 0x7017, 0x0040, 0x7037, 0x0000, 0x007c, 0x017e, 0x0e7e,
++	0x2071, 0xa835, 0xa00e, 0x7186, 0x718a, 0x7097, 0x0001, 0x2001,
++	0xa653, 0x2004, 0xd0fc, 0x00c0, 0x49e8, 0x2001, 0xa653, 0x2004,
++	0xa00e, 0xd09c, 0x0040, 0x49e5, 0x8108, 0x7102, 0x0078, 0x4a3b,
++	0x2001, 0xa672, 0x200c, 0xa184, 0x000f, 0x2009, 0xa673, 0x210c,
++	0x0079, 0x49f2, 0x49dd, 0x4a13, 0x4a1b, 0x4a26, 0x4a2c, 0x49dd,
++	0x49dd, 0x49dd, 0x4a02, 0x49dd, 0x49dd, 0x49dd, 0x49dd, 0x49dd,
++	0x49dd, 0x49dd, 0x7003, 0x0004, 0x137e, 0x147e, 0x157e, 0x2099,
++	0xa676, 0x20a1, 0xa886, 0x20a9, 0x0004, 0x53a3, 0x157f, 0x147f,
++	0x137f, 0x0078, 0x4a3b, 0x708f, 0x0005, 0x7007, 0x0122, 0x2001,
++	0x0002, 0x0078, 0x4a21, 0x708f, 0x0002, 0x7007, 0x0121, 0x2001,
++	0x0003, 0x7002, 0x7097, 0x0001, 0x0078, 0x4a38, 0x7007, 0x0122,
++	0x2001, 0x0002, 0x0078, 0x4a30, 0x7007, 0x0121, 0x2001, 0x0003,
++	0x7002, 0xa006, 0x7096, 0x708e, 0xa184, 0xff00, 0x8007, 0x709a,
++	0xa184, 0x00ff, 0x7092, 0x0e7f, 0x017f, 0x007c, 0x0e7e, 0x2071,
++	0xa714, 0x684c, 0xa005, 0x00c0, 0x4a4c, 0x7028, 0xc085, 0x702a,
++	0xa085, 0x0001, 0x0078, 0x4a71, 0x6a60, 0x7236, 0x6b64, 0x733a,
++	0x6868, 0x703e, 0x7076, 0x686c, 0x7042, 0x707a, 0x684c, 0x702e,
++	0x6844, 0x7032, 0x2009, 0x000d, 0x200a, 0x700b, 0x0000, 0x8007,
++	0x8006, 0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100,
++	0xa319, 0x726e, 0x7372, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001,
++	0xa006, 0x0e7f, 0x007c, 0x0e7e, 0x027e, 0x6838, 0xd0fc, 0x00c0,
++	0x4ac9, 0x6804, 0xa00d, 0x0040, 0x4a8f, 0x0d7e, 0x2071, 0xa600,
++	0xa016, 0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff,
++	0x00c0, 0x4a82, 0x702e, 0x70ac, 0xa200, 0x70ae, 0x0d7f, 0x2071,
++	0xa714, 0x701c, 0xa005, 0x00c0, 0x4adb, 0x0068, 0x4ad9, 0x2071,
++	0xa835, 0x7200, 0x82ff, 0x0040, 0x4ad9, 0x6934, 0xa186, 0x0103,
++	0x00c0, 0x4aec, 0x6948, 0x6844, 0xa105, 0x00c0, 0x4acc, 0x2009,
++	0x8020, 0x2200, 0x0079, 0x4aac, 0x4ad9, 0x4ab1, 0x4b09, 0x4b17,
++	0x4ad9, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x4ad9, 0x7122,
++	0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091, 0x4080,
++	0x2071, 0xa600, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70ac, 0x8000,
++	0x70ae, 0x027f, 0x0e7f, 0x007c, 0x6844, 0xa086, 0x0100, 0x00c0,
++	0x4ad9, 0x6868, 0xa005, 0x00c0, 0x4ad9, 0x2009, 0x8020, 0x0078,
++	0x4aa9, 0x2071, 0xa714, 0x2d08, 0x206b, 0x0000, 0x7010, 0x8000,
++	0x7012, 0x7018, 0xa06d, 0x711a, 0x0040, 0x4ae9, 0x6902, 0x0078,
++	0x4aea, 0x711e, 0x0078, 0x4ac9, 0xa18c, 0x00ff, 0xa186, 0x0017,
++	0x0040, 0x4afa, 0xa186, 0x001e, 0x0040, 0x4afa, 0xa18e, 0x001f,
++	0x00c0, 0x4ad9, 0x684c, 0xd0cc, 0x0040, 0x4ad9, 0x6850, 0xa084,
++	0x00ff, 0xa086, 0x0001, 0x00c0, 0x4ad9, 0x2009, 0x8021, 0x0078,
++	0x4aa9, 0x7084, 0x8008, 0xa092, 0x001e, 0x00c8, 0x4ad9, 0x7186,
++	0xae90, 0x0003, 0xa210, 0x683c, 0x2012, 0x0078, 0x4b27, 0x7084,
++	0x8008, 0xa092, 0x000f, 0x00c8, 0x4ad9, 0x7186, 0xae90, 0x0003,
++	0x8003, 0xa210, 0x683c, 0x2012, 0x8210, 0x6840, 0x2012, 0x7088,
++	0xa10a, 0x0048, 0x4ac0, 0x718c, 0x7084, 0xa10a, 0x0048, 0x4ac0,
++	0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x4ac0, 0x2071, 0xa835,
++	0x7000, 0xa086, 0x0002, 0x00c0, 0x4b47, 0x1078, 0x4dc3, 0x2071,
++	0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x4ac0, 0x1078,
++	0x4dee, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078,
++	0x4ac0, 0x007e, 0x684c, 0x007e, 0x6837, 0x0103, 0x20a9, 0x001c,
++	0xad80, 0x0011, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x007f, 0xa084,
++	0x00ff, 0x684e, 0x007f, 0x684a, 0x6952, 0x007c, 0x2071, 0xa714,
++	0x7004, 0x0079, 0x4b6b, 0x4b75, 0x4b86, 0x4d94, 0x4d95, 0x4dbc,
++	0x4dc2, 0x4b76, 0x4d82, 0x4d23, 0x4da5, 0x007c, 0x127e, 0x2091,
++	0x8000, 0x0068, 0x4b85, 0x2009, 0x000d, 0x7030, 0x200a, 0x2091,
++	0x4080, 0x7007, 0x0001, 0x700b, 0x0000, 0x127f, 0x2069, 0xa8c4,
++	0x6844, 0xa005, 0x0050, 0x4bae, 0x00c0, 0x4bae, 0x127e, 0x2091,
++	0x8000, 0x2069, 0x0000, 0x6934, 0x2001, 0xa720, 0x2004, 0xa10a,
++	0x0040, 0x4ba9, 0x0068, 0x4bad, 0x2069, 0x0000, 0x6818, 0xd084,
++	0x00c0, 0x4bad, 0x2009, 0x8040, 0x6922, 0x681b, 0x0001, 0x2091,
++	0x4080, 0x2069, 0xa8c4, 0x6847, 0xffff, 0x127f, 0x2069, 0xa600,
++	0x6848, 0x6964, 0xa102, 0x2069, 0xa835, 0x688a, 0x6984, 0x701c,
++	0xa06d, 0x0040, 0x4bc0, 0x81ff, 0x0040, 0x4c08, 0x0078, 0x4bd6,
++	0x81ff, 0x0040, 0x4cda, 0x2071, 0xa835, 0x7184, 0x7088, 0xa10a,
++	0x00c8, 0x4bd6, 0x7190, 0x2071, 0xa8c4, 0x7040, 0xa005, 0x0040,
++	0x4bd6, 0x00d0, 0x4cda, 0x7142, 0x0078, 0x4cda, 0x2071, 0xa835,
++	0x718c, 0x127e, 0x2091, 0x8000, 0x7084, 0xa10a, 0x0048, 0x4cf7,
++	0x0068, 0x4c8c, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x4c8c,
++	0x2001, 0xffff, 0x2071, 0xa8c4, 0x7042, 0x2071, 0xa835, 0x7000,
++	0xa086, 0x0002, 0x00c0, 0x4bfe, 0x1078, 0x4dc3, 0x2071, 0x0000,
++	0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x4c8c, 0x1078, 0x4dee,
++	0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x4c8c,
++	0x2071, 0xa835, 0x7000, 0xa005, 0x0040, 0x4cb9, 0x6934, 0xa186,
++	0x0103, 0x00c0, 0x4c8f, 0x684c, 0xd0bc, 0x00c0, 0x4cb9, 0x6948,
++	0x6844, 0xa105, 0x00c0, 0x4cac, 0x2009, 0x8020, 0x2071, 0xa835,
++	0x7000, 0x0079, 0x4c23, 0x4cb9, 0x4c71, 0x4c49, 0x4c5b, 0x4c28,
++	0x137e, 0x147e, 0x157e, 0x2099, 0xa676, 0x20a1, 0xa886, 0x20a9,
++	0x0004, 0x53a3, 0x157f, 0x147f, 0x137f, 0x2071, 0xa87d, 0xad80,
++	0x000f, 0x700e, 0x7013, 0x0002, 0x7007, 0x0002, 0x700b, 0x0000,
++	0x2e10, 0x1078, 0x13db, 0x2071, 0xa714, 0x7007, 0x0009, 0x0078,
++	0x4cda, 0x7084, 0x8008, 0xa092, 0x001e, 0x00c8, 0x4cda, 0xae90,
++	0x0003, 0xa210, 0x683c, 0x2012, 0x7186, 0x2071, 0xa714, 0x1078,
++	0x4e4c, 0x0078, 0x4cda, 0x7084, 0x8008, 0xa092, 0x000f, 0x00c8,
++	0x4cda, 0xae90, 0x0003, 0x8003, 0xa210, 0x683c, 0x2012, 0x8210,
++	0x6840, 0x2012, 0x7186, 0x2071, 0xa714, 0x1078, 0x4e4c, 0x0078,
++	0x4cda, 0x127e, 0x2091, 0x8000, 0x0068, 0x4c8c, 0x2071, 0x0000,
++	0x7018, 0xd084, 0x00c0, 0x4c8c, 0x7122, 0x683c, 0x7026, 0x6840,
++	0x702a, 0x701b, 0x0001, 0x2091, 0x4080, 0x127f, 0x2071, 0xa714,
++	0x1078, 0x4e4c, 0x0078, 0x4cda, 0x127f, 0x0078, 0x4cda, 0xa18c,
++	0x00ff, 0xa186, 0x0017, 0x0040, 0x4c9d, 0xa186, 0x001e, 0x0040,
++	0x4c9d, 0xa18e, 0x001f, 0x00c0, 0x4cb9, 0x684c, 0xd0cc, 0x0040,
++	0x4cb9, 0x6850, 0xa084, 0x00ff, 0xa086, 0x0001, 0x00c0, 0x4cb9,
++	0x2009, 0x8021, 0x0078, 0x4c1e, 0x6844, 0xa086, 0x0100, 0x00c0,
++	0x4cb9, 0x6868, 0xa005, 0x00c0, 0x4cb9, 0x2009, 0x8020, 0x0078,
++	0x4c1e, 0x2071, 0xa714, 0x1078, 0x4e60, 0x0040, 0x4cda, 0x2071,
++	0xa714, 0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, 0x0003,
++	0x00c0, 0x4cd1, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0040, 0x4cd1,
++	0x710e, 0x7007, 0x0003, 0x1078, 0x4e80, 0x7050, 0xa086, 0x0100,
++	0x0040, 0x4d95, 0x127e, 0x2091, 0x8000, 0x2071, 0xa714, 0x7008,
++	0xa086, 0x0001, 0x00c0, 0x4cf5, 0x0068, 0x4cf5, 0x2009, 0x000d,
++	0x7030, 0x200a, 0x2091, 0x4080, 0x700b, 0x0000, 0x7004, 0xa086,
++	0x0006, 0x00c0, 0x4cf5, 0x7007, 0x0001, 0x127f, 0x007c, 0x2071,
++	0xa714, 0x1078, 0x4e60, 0x0040, 0x4d20, 0x2071, 0xa835, 0x7084,
++	0x700a, 0x20a9, 0x0020, 0x2099, 0xa836, 0x20a1, 0xa85d, 0x53a3,
++	0x7087, 0x0000, 0x2071, 0xa714, 0x2069, 0xa87d, 0x706c, 0x6826,
++	0x7070, 0x682a, 0x7074, 0x682e, 0x7078, 0x6832, 0x2d10, 0x1078,
++	0x13db, 0x7007, 0x0008, 0x2001, 0xffff, 0x2071, 0xa8c4, 0x7042,
++	0x127f, 0x0078, 0x4cda, 0x2069, 0xa87d, 0x6808, 0xa08e, 0x0000,
++	0x0040, 0x4d81, 0xa08e, 0x0200, 0x0040, 0x4d7f, 0xa08e, 0x0100,
++	0x00c0, 0x4d81, 0x127e, 0x2091, 0x8000, 0x0068, 0x4d7c, 0x2069,
++	0x0000, 0x6818, 0xd084, 0x00c0, 0x4d7c, 0x702c, 0x7130, 0x8108,
++	0xa102, 0x0048, 0x4d4a, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072,
++	0x0078, 0x4d54, 0x706c, 0xa080, 0x0040, 0x706e, 0x00c8, 0x4d54,
++	0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x6936, 0x700b, 0x0000,
++	0x2001, 0xa85a, 0x2004, 0xa005, 0x00c0, 0x4d73, 0x6934, 0x2069,
++	0xa835, 0x689c, 0x699e, 0x2069, 0xa8c4, 0xa102, 0x00c0, 0x4d6c,
++	0x6844, 0xa005, 0x00d0, 0x4d7a, 0x2001, 0xa85b, 0x200c, 0x810d,
++	0x6946, 0x0078, 0x4d7a, 0x2009, 0x8040, 0x6922, 0x681b, 0x0001,
++	0x2091, 0x4080, 0x7007, 0x0001, 0x127f, 0x0078, 0x4d81, 0x7007,
++	0x0005, 0x007c, 0x701c, 0xa06d, 0x0040, 0x4d93, 0x1078, 0x4e60,
++	0x0040, 0x4d93, 0x7007, 0x0003, 0x1078, 0x4e80, 0x7050, 0xa086,
++	0x0100, 0x0040, 0x4d95, 0x007c, 0x007c, 0x7050, 0xa09e, 0x0100,
++	0x00c0, 0x4d9e, 0x7007, 0x0004, 0x0078, 0x4dbc, 0xa086, 0x0200,
++	0x00c0, 0x4da4, 0x7007, 0x0005, 0x007c, 0x2001, 0xa87f, 0x2004,
++	0xa08e, 0x0100, 0x00c0, 0x4db1, 0x7007, 0x0001, 0x1078, 0x4e4c,
++	0x007c, 0xa08e, 0x0000, 0x0040, 0x4db0, 0xa08e, 0x0200, 0x00c0,
++	0x4db0, 0x7007, 0x0005, 0x007c, 0x1078, 0x4e16, 0x7006, 0x1078,
++	0x4e4c, 0x007c, 0x007c, 0x0e7e, 0x157e, 0x2071, 0xa835, 0x7184,
++	0x81ff, 0x0040, 0x4deb, 0xa006, 0x7086, 0xae80, 0x0003, 0x2071,
++	0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, 0x0070, 0x4de8, 0x2014,
++	0x722a, 0x8000, 0x0070, 0x4de8, 0x2014, 0x722e, 0x8000, 0x0070,
++	0x4de8, 0x2014, 0x723a, 0x8000, 0x0070, 0x4de8, 0x2014, 0x723e,
++	0xa180, 0x8030, 0x7022, 0x157f, 0x0e7f, 0x007c, 0x0e7e, 0x157e,
++	0x2071, 0xa835, 0x7184, 0x81ff, 0x0040, 0x4e13, 0xa006, 0x7086,
++	0xae80, 0x0003, 0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000,
++	0x2014, 0x722a, 0x8000, 0x0070, 0x4e0c, 0x2014, 0x723a, 0x8000,
++	0x2014, 0x723e, 0x0078, 0x4e10, 0x2001, 0x8020, 0x0078, 0x4e12,
++	0x2001, 0x8042, 0x7022, 0x157f, 0x0e7f, 0x007c, 0x702c, 0x7130,
++	0x8108, 0xa102, 0x0048, 0x4e23, 0xa00e, 0x7034, 0x706e, 0x7038,
++	0x7072, 0x0078, 0x4e2d, 0x706c, 0xa080, 0x0040, 0x706e, 0x00c8,
++	0x4e2d, 0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x700c, 0x8001,
++	0x700e, 0x00c0, 0x4e43, 0x127e, 0x2091, 0x8000, 0x0068, 0x4e46,
++	0x2001, 0x000d, 0x2102, 0x2091, 0x4080, 0x2001, 0x0001, 0x700b,
++	0x0000, 0x127f, 0x007c, 0x2001, 0x0007, 0x007c, 0x2001, 0x0006,
++	0x700b, 0x0001, 0x127f, 0x007c, 0x701c, 0xa06d, 0x0040, 0x4e5f,
++	0x127e, 0x2091, 0x8000, 0x7010, 0x8001, 0x7012, 0x2d04, 0x701e,
++	0xa005, 0x00c0, 0x4e5c, 0x701a, 0x127f, 0x1078, 0x13a4, 0x007c,
++	0x2019, 0x000d, 0x2304, 0x230c, 0xa10e, 0x0040, 0x4e6f, 0x2304,
++	0x230c, 0xa10e, 0x0040, 0x4e6f, 0xa006, 0x0078, 0x4e7f, 0x732c,
++	0x8319, 0x7130, 0xa102, 0x00c0, 0x4e79, 0x2300, 0xa005, 0x0078,
++	0x4e7f, 0x0048, 0x4e7e, 0xa302, 0x0078, 0x4e7f, 0x8002, 0x007c,
++	0x2d00, 0x7026, 0xa080, 0x000d, 0x7056, 0x7053, 0x0000, 0x127e,
++	0x2091, 0x8000, 0x2009, 0xa8d6, 0x2104, 0xc08d, 0x200a, 0x127f,
++	0x1078, 0x13f9, 0x007c, 0x2071, 0xa6e2, 0x7003, 0x0000, 0x7007,
++	0x0000, 0x700f, 0x0000, 0x702b, 0x0001, 0x704f, 0x0000, 0x7053,
++	0x0001, 0x705f, 0x0020, 0x7063, 0x0040, 0x7083, 0x0000, 0x708b,
++	0x0000, 0x708f, 0x0001, 0x70bf, 0x0000, 0x007c, 0x0e7e, 0x2071,
++	0xa6e2, 0x6848, 0xa005, 0x00c0, 0x4ebc, 0x7028, 0xc085, 0x702a,
++	0xa085, 0x0001, 0x0078, 0x4ee1, 0x6a50, 0x7236, 0x6b54, 0x733a,
++	0x6858, 0x703e, 0x707a, 0x685c, 0x7042, 0x707e, 0x6848, 0x702e,
++	0x6840, 0x7032, 0x2009, 0x000c, 0x200a, 0x8007, 0x8006, 0x8006,
++	0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, 0x7272,
++	0x7376, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700f, 0x0000,
++	0xa006, 0x0e7f, 0x007c, 0x2b78, 0x2071, 0xa6e2, 0x7004, 0x1079,
++	0x4f41, 0x700c, 0x0079, 0x4eec, 0x4ef1, 0x4ee6, 0x4ee6, 0x4ee6,
++	0x4ee6, 0x007c, 0x700c, 0x0079, 0x4ef5, 0x4efa, 0x4f3f, 0x4f3f,
++	0x4f40, 0x4f40, 0x7830, 0x7930, 0xa106, 0x0040, 0x4f04, 0x7830,
++	0x7930, 0xa106, 0x00c0, 0x4f2a, 0x7030, 0xa10a, 0x0040, 0x4f2a,
++	0x00c8, 0x4f0c, 0x712c, 0xa10a, 0xa18a, 0x0002, 0x00c8, 0x4f2b,
++	0x1078, 0x1370, 0x0040, 0x4f2a, 0x2d00, 0x705a, 0x7063, 0x0040,
++	0x2001, 0x0003, 0x7057, 0x0000, 0x127e, 0x007e, 0x2091, 0x8000,
++	0x2009, 0xa8d6, 0x2104, 0xc085, 0x200a, 0x007f, 0x700e, 0x127f,
++	0x1078, 0x13f9, 0x007c, 0x1078, 0x1370, 0x0040, 0x4f2a, 0x2d00,
++	0x705a, 0x1078, 0x1370, 0x00c0, 0x4f37, 0x0078, 0x4f16, 0x2d00,
++	0x7086, 0x7063, 0x0080, 0x2001, 0x0004, 0x0078, 0x4f1a, 0x007c,
++	0x007c, 0x4f52, 0x4f53, 0x4f8a, 0x4f8b, 0x4f3f, 0x4fc1, 0x4fc6,
++	0x4ffd, 0x4ffe, 0x5019, 0x501a, 0x501b, 0x501c, 0x501d, 0x501e,
++	0x509e, 0x50c8, 0x007c, 0x700c, 0x0079, 0x4f56, 0x4f5b, 0x4f5e,
++	0x4f6e, 0x4f89, 0x4f89, 0x1078, 0x4ef2, 0x007c, 0x127e, 0x8001,
++	0x700e, 0x7058, 0x007e, 0x1078, 0x5464, 0x0040, 0x4f6b, 0x2091,
++	0x8000, 0x1078, 0x4ef2, 0x0d7f, 0x0078, 0x4f77, 0x127e, 0x8001,
++	0x700e, 0x1078, 0x5464, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803,
++	0x0000, 0x6807, 0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x0020,
++	0x00c8, 0x4f86, 0x1079, 0x4fa1, 0x127f, 0x007c, 0x127f, 0x1078,
++	0x501f, 0x007c, 0x007c, 0x007c, 0x0e7e, 0x2071, 0xa6e2, 0x700c,
++	0x0079, 0x4f92, 0x4f97, 0x4f97, 0x4f97, 0x4f99, 0x4f9d, 0x0e7f,
++	0x007c, 0x700f, 0x0001, 0x0078, 0x4f9f, 0x700f, 0x0002, 0x0e7f,
++	0x007c, 0x501f, 0x501f, 0x503b, 0x501f, 0x5171, 0x501f, 0x501f,
++	0x501f, 0x501f, 0x501f, 0x503b, 0x51bb, 0x5208, 0x5261, 0x5277,
++	0x501f, 0x501f, 0x5057, 0x503b, 0x501f, 0x501f, 0x5078, 0x5338,
++	0x5356, 0x501f, 0x5057, 0x501f, 0x501f, 0x501f, 0x501f, 0x506d,
++	0x5356, 0x7020, 0x2068, 0x1078, 0x13a4, 0x007c, 0x700c, 0x0079,
++	0x4fc9, 0x4fce, 0x4fd1, 0x4fe1, 0x4ffc, 0x4ffc, 0x1078, 0x4ef2,
++	0x007c, 0x127e, 0x8001, 0x700e, 0x7058, 0x007e, 0x1078, 0x5464,
++	0x0040, 0x4fde, 0x2091, 0x8000, 0x1078, 0x4ef2, 0x0d7f, 0x0078,
++	0x4fea, 0x127e, 0x8001, 0x700e, 0x1078, 0x5464, 0x7058, 0x2068,
++	0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000, 0x6834, 0xa084,
++	0x00ff, 0xa08a, 0x001a, 0x00c8, 0x4ff9, 0x1079, 0x4fff, 0x127f,
++	0x007c, 0x127f, 0x1078, 0x501f, 0x007c, 0x007c, 0x007c, 0x501f,
++	0x503b, 0x515b, 0x501f, 0x503b, 0x501f, 0x503b, 0x503b, 0x501f,
++	0x503b, 0x515b, 0x503b, 0x503b, 0x503b, 0x503b, 0x503b, 0x501f,
++	0x503b, 0x515b, 0x501f, 0x501f, 0x503b, 0x501f, 0x501f, 0x501f,
++	0x503b, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x7007,
++	0x0001, 0x6838, 0xa084, 0x00ff, 0xc0d5, 0x683a, 0x127e, 0x2091,
++	0x8000, 0x1078, 0x4a73, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838,
++	0xa084, 0x00ff, 0xc0e5, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078,
++	0x4a73, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff,
++	0xc0ed, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x4a73, 0x127f,
++	0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0dd, 0x683a,
++	0x127e, 0x2091, 0x8000, 0x1078, 0x4a73, 0x127f, 0x007c, 0x6834,
++	0x8007, 0xa084, 0x00ff, 0x0040, 0x502d, 0x8001, 0x00c0, 0x5064,
++	0x7007, 0x0001, 0x0078, 0x513a, 0x7007, 0x0006, 0x7012, 0x2d00,
++	0x7016, 0x701a, 0x704b, 0x513a, 0x007c, 0x684c, 0xa084, 0x00c0,
++	0xa086, 0x00c0, 0x00c0, 0x5078, 0x7007, 0x0001, 0x0078, 0x5373,
++	0x2d00, 0x7016, 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098,
++	0x20a1, 0xa70d, 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x00c8,
++	0x5049, 0x6884, 0xa08a, 0x0002, 0x00c8, 0x5049, 0x82ff, 0x00c0,
++	0x509a, 0x6888, 0x698c, 0xa105, 0x0040, 0x509a, 0x2001, 0x510a,
++	0x0078, 0x509d, 0xa280, 0x5100, 0x2004, 0x70c6, 0x7010, 0xa015,
++	0x0040, 0x50e8, 0x1078, 0x1370, 0x00c0, 0x50a9, 0x7007, 0x000f,
++	0x007c, 0x2d00, 0x7022, 0x70c4, 0x2060, 0x6000, 0x6836, 0x6004,
++	0xad00, 0x7096, 0x6008, 0xa20a, 0x00c8, 0x50b8, 0xa00e, 0x2200,
++	0x7112, 0x620c, 0x8003, 0x800b, 0xa296, 0x0004, 0x0040, 0x50c1,
++	0xa108, 0x719a, 0x810b, 0x719e, 0xae90, 0x0022, 0x1078, 0x13db,
++	0x7090, 0xa08e, 0x0100, 0x0040, 0x50dc, 0xa086, 0x0200, 0x0040,
++	0x50d4, 0x7007, 0x0010, 0x007c, 0x7020, 0x2068, 0x1078, 0x13a4,
++	0x7014, 0x2068, 0x0078, 0x5049, 0x7020, 0x2068, 0x7018, 0x6802,
++	0x6807, 0x0000, 0x2d08, 0x2068, 0x6906, 0x711a, 0x0078, 0x509e,
++	0x7014, 0x2068, 0x7007, 0x0001, 0x6884, 0xa005, 0x00c0, 0x50f7,
++	0x6888, 0x698c, 0xa105, 0x0040, 0x50f7, 0x1078, 0x510e, 0x6834,
++	0xa084, 0x00ff, 0xa086, 0x001e, 0x0040, 0x5373, 0x0078, 0x513a,
++	0x5102, 0x5106, 0x0002, 0x0011, 0x0007, 0x0004, 0x000a, 0x000f,
++	0x0005, 0x0006, 0x000a, 0x0011, 0x0005, 0x0004, 0x0f7e, 0x0e7e,
++	0x0c7e, 0x077e, 0x067e, 0x6f88, 0x6e8c, 0x6804, 0x2060, 0xacf0,
++	0x0021, 0xacf8, 0x0027, 0x2009, 0x0005, 0x700c, 0x7816, 0x7008,
++	0x7812, 0x7004, 0x7806, 0x7000, 0x7802, 0x7e0e, 0x7f0a, 0x8109,
++	0x0040, 0x5130, 0xaef2, 0x0004, 0xaffa, 0x0006, 0x0078, 0x511d,
++	0x6004, 0xa065, 0x00c0, 0x5117, 0x067f, 0x077f, 0x0c7f, 0x0e7f,
++	0x0f7f, 0x007c, 0x2009, 0xa62f, 0x210c, 0x81ff, 0x00c0, 0x5155,
++	0x6838, 0xa084, 0x00ff, 0x683a, 0x1078, 0x4353, 0x00c0, 0x5149,
++	0x007c, 0x1078, 0x4b51, 0x127e, 0x2091, 0x8000, 0x1078, 0x8f7d,
++	0x1078, 0x4a73, 0x127f, 0x0078, 0x5148, 0x2001, 0x0028, 0x2009,
++	0x0000, 0x0078, 0x5149, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906,
++	0x711a, 0x7010, 0x8001, 0x7012, 0x0040, 0x516a, 0x7007, 0x0006,
++	0x0078, 0x5170, 0x7014, 0x2068, 0x7007, 0x0001, 0x7048, 0x107a,
++	0x007c, 0x7007, 0x0001, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x6848,
++	0xa084, 0x00ff, 0x20a9, 0x0001, 0xa096, 0x0001, 0x0040, 0x519a,
++	0x2009, 0x0000, 0x20a9, 0x00ff, 0xa096, 0x0002, 0x0040, 0x519a,
++	0xa005, 0x00c0, 0x51ad, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x1078,
++	0x45c4, 0x00c0, 0x51ad, 0x067e, 0x6e50, 0x1078, 0x46b3, 0x067f,
++	0x0078, 0x51ad, 0x047e, 0x2011, 0xa60c, 0x2224, 0xc484, 0xc48c,
++	0x2412, 0x047f, 0x0c7e, 0x1078, 0x45c4, 0x00c0, 0x51a9, 0x1078,
++	0x4852, 0x8108, 0x00f0, 0x51a3, 0x0c7f, 0x684c, 0xd084, 0x00c0,
++	0x51b4, 0x1078, 0x13a4, 0x007c, 0x127e, 0x2091, 0x8000, 0x1078,
++	0x4a73, 0x127f, 0x007c, 0x127e, 0x2091, 0x8000, 0x7007, 0x0001,
++	0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040, 0x51ff, 0x2061, 0xa933,
++	0x6100, 0xd184, 0x0040, 0x51df, 0x6858, 0xa084, 0x00ff, 0x00c0,
++	0x5202, 0x6000, 0xd084, 0x0040, 0x51ff, 0x6004, 0xa005, 0x00c0,
++	0x5205, 0x6003, 0x0000, 0x600b, 0x0000, 0x0078, 0x51fc, 0x2011,
++	0x0001, 0x6860, 0xa005, 0x00c0, 0x51e7, 0x2001, 0x001e, 0x8000,
++	0x6016, 0x6858, 0xa084, 0x00ff, 0x0040, 0x51ff, 0x6006, 0x6858,
++	0x8007, 0xa084, 0x00ff, 0x0040, 0x51ff, 0x600a, 0x6858, 0x8000,
++	0x00c0, 0x51fb, 0xc28d, 0x6202, 0x127f, 0x0078, 0x5453, 0x127f,
++	0x0078, 0x544b, 0x127f, 0x0078, 0x5443, 0x127f, 0x0078, 0x5447,
++	0x127e, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0xa653, 0x2004,
++	0xd0a4, 0x0040, 0x525e, 0x2061, 0xa933, 0x6000, 0xd084, 0x0040,
++	0x525e, 0x6204, 0x6308, 0xd08c, 0x00c0, 0x5250, 0x6c48, 0xa484,
++	0x0003, 0x0040, 0x5236, 0x6958, 0xa18c, 0x00ff, 0x8001, 0x00c0,
++	0x522f, 0x2100, 0xa210, 0x0048, 0x525b, 0x0078, 0x5236, 0x8001,
++	0x00c0, 0x525b, 0x2100, 0xa212, 0x0048, 0x525b, 0xa484, 0x000c,
++	0x0040, 0x5250, 0x6958, 0x810f, 0xa18c, 0x00ff, 0xa082, 0x0004,
++	0x00c0, 0x5248, 0x2100, 0xa318, 0x0048, 0x525b, 0x0078, 0x5250,
++	0xa082, 0x0004, 0x00c0, 0x525b, 0x2100, 0xa31a, 0x0048, 0x525b,
++	0x6860, 0xa005, 0x0040, 0x5256, 0x8000, 0x6016, 0x6206, 0x630a,
++	0x127f, 0x0078, 0x5453, 0x127f, 0x0078, 0x544f, 0x127f, 0x0078,
++	0x544b, 0x127e, 0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0xa933,
++	0x6300, 0xd38c, 0x00c0, 0x5271, 0x6308, 0x8318, 0x0048, 0x5274,
++	0x630a, 0x127f, 0x0078, 0x5461, 0x127f, 0x0078, 0x544f, 0x127e,
++	0x0c7e, 0x2091, 0x8000, 0x7007, 0x0001, 0x684c, 0xd0ac, 0x0040,
++	0x528b, 0x0c7e, 0x2061, 0xa933, 0x6000, 0xa084, 0xfcff, 0x6002,
++	0x0c7f, 0x0078, 0x52ba, 0x6858, 0xa005, 0x0040, 0x52d1, 0x685c,
++	0xa065, 0x0040, 0x52cd, 0x2001, 0xa62f, 0x2004, 0xa005, 0x0040,
++	0x529d, 0x1078, 0x8ec6, 0x0078, 0x52ab, 0x6013, 0x0400, 0x6037,
++	0x0000, 0x694c, 0xd1a4, 0x0040, 0x52a7, 0x6950, 0x6136, 0x2009,
++	0x0041, 0x1078, 0x775c, 0x6958, 0xa18c, 0xff00, 0xa186, 0x2000,
++	0x00c0, 0x52ba, 0x027e, 0x2009, 0x0000, 0x2011, 0xfdff, 0x1078,
++	0x5bf1, 0x027f, 0x684c, 0xd0c4, 0x0040, 0x52c9, 0x2061, 0xa933,
++	0x6000, 0xd08c, 0x00c0, 0x52c9, 0x6008, 0x8000, 0x0048, 0x52cd,
++	0x600a, 0x0c7f, 0x127f, 0x0078, 0x5453, 0x0c7f, 0x127f, 0x0078,
++	0x544b, 0x6954, 0xa186, 0x0045, 0x0040, 0x5306, 0xa186, 0x002a,
++	0x00c0, 0x52e1, 0x2001, 0xa60c, 0x200c, 0xc194, 0x2102, 0x0078,
++	0x52ba, 0xa186, 0x0020, 0x0040, 0x52fa, 0xa186, 0x0029, 0x0040,
++	0x52ed, 0xa186, 0x002d, 0x00c0, 0x52cd, 0x6944, 0xa18c, 0xff00,
++	0x810f, 0x1078, 0x45c4, 0x00c0, 0x52ba, 0x6000, 0xc0e4, 0x6002,
++	0x0078, 0x52ba, 0x685c, 0xa065, 0x0040, 0x52cd, 0x6007, 0x0024,
++	0x2001, 0xa8a3, 0x2004, 0x6016, 0x0078, 0x52ba, 0x685c, 0xa065,
++	0x0040, 0x52cd, 0x0e7e, 0x6860, 0xa075, 0x2001, 0xa62f, 0x2004,
++	0xa005, 0x0040, 0x531e, 0x1078, 0x8ec6, 0x8eff, 0x0040, 0x531b,
++	0x2e60, 0x1078, 0x8ec6, 0x0e7f, 0x0078, 0x52ba, 0x6024, 0xc0dc,
++	0xc0d5, 0x6026, 0x2e60, 0x6007, 0x003a, 0x6870, 0xa005, 0x0040,
++	0x532f, 0x6007, 0x003b, 0x6874, 0x602a, 0x6878, 0x6012, 0x6003,
++	0x0001, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0e7f, 0x0078, 0x52ba,
++	0x2061, 0xa933, 0x6000, 0xd084, 0x0040, 0x5352, 0xd08c, 0x00c0,
++	0x5461, 0x2091, 0x8000, 0x6204, 0x8210, 0x0048, 0x534c, 0x6206,
++	0x2091, 0x8001, 0x0078, 0x5461, 0x2091, 0x8001, 0x6853, 0x0016,
++	0x0078, 0x545a, 0x6853, 0x0007, 0x0078, 0x545a, 0x6834, 0x8007,
++	0xa084, 0x00ff, 0x00c0, 0x5360, 0x1078, 0x502d, 0x0078, 0x5372,
++	0x2030, 0x8001, 0x00c0, 0x536a, 0x7007, 0x0001, 0x1078, 0x5373,
++	0x0078, 0x5372, 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a,
++	0x704b, 0x5373, 0x007c, 0x0e7e, 0x127e, 0x2091, 0x8000, 0xa03e,
++	0x2009, 0xa62f, 0x210c, 0x81ff, 0x00c0, 0x53ff, 0x2009, 0xa60c,
++	0x210c, 0xd194, 0x00c0, 0x5431, 0x6848, 0x2070, 0xae82, 0xad00,
++	0x0048, 0x53ef, 0x2001, 0xa616, 0x2004, 0xae02, 0x00c8, 0x53ef,
++	0x2061, 0xa933, 0x6100, 0xa184, 0x0301, 0xa086, 0x0001, 0x00c0,
++	0x53d2, 0x711c, 0xa186, 0x0006, 0x00c0, 0x53da, 0x7018, 0xa005,
++	0x0040, 0x53ff, 0x2004, 0xd0e4, 0x00c0, 0x542b, 0x7024, 0xd0dc,
++	0x00c0, 0x5435, 0x6853, 0x0000, 0x6803, 0x0000, 0x2d08, 0x7010,
++	0xa005, 0x00c0, 0x53be, 0x7112, 0x684c, 0xd0f4, 0x00c0, 0x5439,
++	0x2e60, 0x1078, 0x5b27, 0x127f, 0x0e7f, 0x007c, 0x2068, 0x6800,
++	0xa005, 0x00c0, 0x53be, 0x6902, 0x2168, 0x684c, 0xd0f4, 0x00c0,
++	0x5439, 0x127f, 0x0e7f, 0x007c, 0x127f, 0x0e7f, 0x6853, 0x0006,
++	0x0078, 0x545a, 0xd184, 0x0040, 0x53cc, 0xd1c4, 0x00c0, 0x53f3,
++	0x0078, 0x53f7, 0x6944, 0xa18c, 0xff00, 0x810f, 0x1078, 0x45c4,
++	0x00c0, 0x542b, 0x6000, 0xd0e4, 0x00c0, 0x542b, 0x711c, 0xa186,
++	0x0007, 0x00c0, 0x53ef, 0x6853, 0x0002, 0x0078, 0x542d, 0x6853,
++	0x0008, 0x0078, 0x542d, 0x6853, 0x000e, 0x0078, 0x542d, 0x6853,
++	0x0017, 0x0078, 0x542d, 0x6853, 0x0035, 0x0078, 0x542d, 0x2001,
++	0xa672, 0x2004, 0xd0fc, 0x0040, 0x5427, 0x6848, 0x2070, 0xae82,
++	0xad00, 0x0048, 0x5427, 0x6058, 0xae02, 0x00c8, 0x5427, 0x711c,
++	0xa186, 0x0006, 0x00c0, 0x5427, 0x7018, 0xa005, 0x0040, 0x5427,
++	0x2004, 0xd0bc, 0x0040, 0x5427, 0x2039, 0x0001, 0x7000, 0xa086,
++	0x0007, 0x00c0, 0x537e, 0x7003, 0x0002, 0x0078, 0x537e, 0x6853,
++	0x0028, 0x0078, 0x542d, 0x6853, 0x0029, 0x127f, 0x0e7f, 0x0078,
++	0x545a, 0x6853, 0x002a, 0x0078, 0x542d, 0x6853, 0x0045, 0x0078,
++	0x542d, 0x2e60, 0x2019, 0x0002, 0x6017, 0x0014, 0x1078, 0x9dc7,
++	0x127f, 0x0e7f, 0x007c, 0x2009, 0x003e, 0x0078, 0x5455, 0x2009,
++	0x0004, 0x0078, 0x5455, 0x2009, 0x0006, 0x0078, 0x5455, 0x2009,
++	0x0016, 0x0078, 0x5455, 0x2009, 0x0001, 0x6854, 0xa084, 0xff00,
++	0xa105, 0x6856, 0x2091, 0x8000, 0x1078, 0x4a73, 0x2091, 0x8001,
++	0x007c, 0x1078, 0x13a4, 0x007c, 0x702c, 0x7130, 0x8108, 0xa102,
++	0x0048, 0x5471, 0xa00e, 0x7034, 0x7072, 0x7038, 0x7076, 0x0078,
++	0x547d, 0x7070, 0xa080, 0x0040, 0x7072, 0x00c8, 0x547d, 0x7074,
++	0xa081, 0x0000, 0x7076, 0xa085, 0x0001, 0x7932, 0x7132, 0x007c,
++	0x0d7e, 0x1078, 0x5b1e, 0x0d7f, 0x007c, 0x0d7e, 0x2011, 0x0004,
++	0x2204, 0xa085, 0x8002, 0x2012, 0x0d7f, 0x007c, 0x20e1, 0x0002,
++	0x3d08, 0x20e1, 0x2000, 0x3d00, 0xa084, 0x7000, 0x0040, 0x549c,
++	0xa086, 0x1000, 0x00c0, 0x54d3, 0x20e1, 0x0000, 0x3d00, 0xa094,
++	0xff00, 0x8217, 0xa084, 0xf000, 0xa086, 0x3000, 0x00c0, 0x54b7,
++	0xa184, 0xff00, 0x8007, 0xa086, 0x0008, 0x00c0, 0x54d3, 0x1078,
++	0x29bb, 0x00c0, 0x54d3, 0x1078, 0x56b2, 0x0078, 0x54ce, 0x20e1,
++	0x0004, 0x3d60, 0xd1bc, 0x00c0, 0x54be, 0x3e60, 0xac84, 0x000f,
++	0x00c0, 0x54d3, 0xac82, 0xad00, 0x0048, 0x54d3, 0x6858, 0xac02,
++	0x00c8, 0x54d3, 0x2009, 0x0047, 0x1078, 0x775c, 0x7a1c, 0xd284,
++	0x00c0, 0x548e, 0x007c, 0xa016, 0x1078, 0x15fa, 0x0078, 0x54ce,
++	0x0078, 0x54d3, 0x781c, 0xd08c, 0x0040, 0x5502, 0x157e, 0x137e,
++	0x147e, 0x20e1, 0x3000, 0x3d20, 0x3e28, 0xa584, 0x0076, 0x00c0,
++	0x5518, 0xa484, 0x7000, 0xa086, 0x1000, 0x00c0, 0x5507, 0x1078,
++	0x554e, 0x0040, 0x5518, 0x20e1, 0x3000, 0x7828, 0x7828, 0x1078,
++	0x556c, 0x147f, 0x137f, 0x157f, 0x2009, 0xa8b9, 0x2104, 0xa005,
++	0x00c0, 0x5503, 0x007c, 0x1078, 0x62d1, 0x0078, 0x5502, 0xa484,
++	0x7000, 0x00c0, 0x5518, 0x1078, 0x554e, 0x0040, 0x552c, 0x7000,
++	0xa084, 0xff00, 0xa086, 0x8100, 0x0040, 0x54f3, 0x0078, 0x552c,
++	0x1078, 0xa54f, 0xd5a4, 0x0040, 0x5528, 0x047e, 0x1078, 0x1b22,
++	0x047f, 0x20e1, 0x9010, 0x2001, 0x0138, 0x2202, 0x0078, 0x5530,
++	0x1078, 0x554e, 0x6883, 0x0000, 0x20e1, 0x3000, 0x7828, 0x7828,
++	0x1078, 0x5537, 0x147f, 0x137f, 0x157f, 0x0078, 0x5502, 0x2001,
++	0xa60e, 0x2004, 0xd08c, 0x0040, 0x554d, 0x2001, 0xa600, 0x2004,
++	0xa086, 0x0003, 0x00c0, 0x554d, 0x027e, 0x037e, 0x2011, 0x8048,
++	0x2518, 0x1078, 0x361b, 0x037f, 0x027f, 0x007c, 0xa484, 0x01ff,
++	0x6882, 0xa005, 0x0040, 0x5560, 0xa080, 0x001f, 0xa084, 0x03f8,
++	0x80ac, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0x007c,
++	0x20a9, 0x000c, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5,
++	0xa085, 0x0001, 0x0078, 0x555f, 0x7000, 0xa084, 0xff00, 0xa08c,
++	0xf000, 0x8007, 0xa196, 0x0000, 0x00c0, 0x5579, 0x0078, 0x57ba,
++	0x007c, 0xa196, 0x2000, 0x00c0, 0x558a, 0x6900, 0xa18e, 0x0001,
++	0x00c0, 0x5586, 0x1078, 0x3aec, 0x0078, 0x5578, 0x1078, 0x5592,
++	0x0078, 0x5578, 0xa196, 0x8000, 0x00c0, 0x5578, 0x1078, 0x5871,
++	0x0078, 0x5578, 0x0c7e, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa196,
++	0x0001, 0x0040, 0x559f, 0xa196, 0x0023, 0x00c0, 0x56aa, 0xa08e,
++	0x0023, 0x00c0, 0x55d4, 0x1078, 0x591d, 0x0040, 0x56aa, 0x7124,
++	0x610a, 0x7030, 0xa08e, 0x0200, 0x00c0, 0x55b8, 0x7034, 0xa005,
++	0x00c0, 0x56aa, 0x2009, 0x0015, 0x1078, 0x775c, 0x0078, 0x56aa,
++	0xa08e, 0x0214, 0x0040, 0x55c0, 0xa08e, 0x0210, 0x00c0, 0x55c6,
++	0x2009, 0x0015, 0x1078, 0x775c, 0x0078, 0x56aa, 0xa08e, 0x0100,
++	0x00c0, 0x56aa, 0x7034, 0xa005, 0x00c0, 0x56aa, 0x2009, 0x0016,
++	0x1078, 0x775c, 0x0078, 0x56aa, 0xa08e, 0x0022, 0x00c0, 0x56aa,
++	0x7030, 0xa08e, 0x0300, 0x00c0, 0x55e5, 0x7034, 0xa005, 0x00c0,
++	0x56aa, 0x2009, 0x0017, 0x0078, 0x5676, 0xa08e, 0x0500, 0x00c0,
++	0x55f1, 0x7034, 0xa005, 0x00c0, 0x56aa, 0x2009, 0x0018, 0x0078,
++	0x5676, 0xa08e, 0x2010, 0x00c0, 0x55f9, 0x2009, 0x0019, 0x0078,
++	0x5676, 0xa08e, 0x2110, 0x00c0, 0x5601, 0x2009, 0x001a, 0x0078,
++	0x5676, 0xa08e, 0x5200, 0x00c0, 0x560d, 0x7034, 0xa005, 0x00c0,
++	0x56aa, 0x2009, 0x001b, 0x0078, 0x5676, 0xa08e, 0x5000, 0x00c0,
++	0x5619, 0x7034, 0xa005, 0x00c0, 0x56aa, 0x2009, 0x001c, 0x0078,
++	0x5676, 0xa08e, 0x1300, 0x00c0, 0x5621, 0x2009, 0x0034, 0x0078,
++	0x5676, 0xa08e, 0x1200, 0x00c0, 0x562d, 0x7034, 0xa005, 0x00c0,
++	0x56aa, 0x2009, 0x0024, 0x0078, 0x5676, 0xa08c, 0xff00, 0xa18e,
++	0x2400, 0x00c0, 0x5637, 0x2009, 0x002d, 0x0078, 0x5676, 0xa08c,
++	0xff00, 0xa18e, 0x5300, 0x00c0, 0x5641, 0x2009, 0x002a, 0x0078,
++	0x5676, 0xa08e, 0x0f00, 0x00c0, 0x5649, 0x2009, 0x0020, 0x0078,
++	0x5676, 0xa08e, 0x5300, 0x00c0, 0x564f, 0x0078, 0x566c, 0xa08e,
++	0x6104, 0x00c0, 0x566c, 0x2011, 0xab8d, 0x8208, 0x2204, 0xa082,
++	0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011, 0x8015, 0x211c, 0x8108,
++	0x047e, 0x2124, 0x1078, 0x361b, 0x047f, 0x8108, 0x00f0, 0x565c,
++	0x2009, 0x0023, 0x0078, 0x5676, 0xa08e, 0x6000, 0x00c0, 0x5674,
++	0x2009, 0x003f, 0x0078, 0x5676, 0x2009, 0x001d, 0x017e, 0x2011,
++	0xab83, 0x2204, 0x8211, 0x220c, 0x1078, 0x254d, 0x00c0, 0x56ac,
++	0x1078, 0x455c, 0x00c0, 0x56ac, 0x6612, 0x6516, 0x86ff, 0x0040,
++	0x569c, 0x017f, 0x017e, 0xa186, 0x0017, 0x00c0, 0x569c, 0x686c,
++	0xa606, 0x00c0, 0x569c, 0x6870, 0xa506, 0xa084, 0xff00, 0x00c0,
++	0x569c, 0x6000, 0xc0f5, 0x6002, 0x0c7e, 0x1078, 0x76c7, 0x0040,
++	0x56af, 0x017f, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0x017f,
++	0x1078, 0x775c, 0x0c7f, 0x007c, 0x017f, 0x0078, 0x56aa, 0x0c7f,
++	0x0078, 0x56ac, 0x0c7e, 0x1078, 0x570f, 0x00c0, 0x570d, 0xa28e,
++	0x0033, 0x00c0, 0x56de, 0x1078, 0x591d, 0x0040, 0x570d, 0x7124,
++	0x610a, 0x7030, 0xa08e, 0x0200, 0x00c0, 0x56d0, 0x7034, 0xa005,
++	0x00c0, 0x570d, 0x2009, 0x0015, 0x1078, 0x775c, 0x0078, 0x570d,
++	0xa08e, 0x0100, 0x00c0, 0x570d, 0x7034, 0xa005, 0x00c0, 0x570d,
++	0x2009, 0x0016, 0x1078, 0x775c, 0x0078, 0x570d, 0xa28e, 0x0032,
++	0x00c0, 0x570d, 0x7030, 0xa08e, 0x1400, 0x00c0, 0x570d, 0x2009,
++	0x0038, 0x017e, 0x2011, 0xab83, 0x2204, 0x8211, 0x220c, 0x1078,
++	0x254d, 0x00c0, 0x570c, 0x1078, 0x455c, 0x00c0, 0x570c, 0x6612,
++	0x6516, 0x0c7e, 0x1078, 0x76c7, 0x0040, 0x570b, 0x017f, 0x611a,
++	0x601f, 0x0004, 0x7120, 0x610a, 0x017f, 0x1078, 0x775c, 0x1078,
++	0x62d1, 0x0078, 0x570d, 0x0c7f, 0x017f, 0x0c7f, 0x007c, 0x0f7e,
++	0x0d7e, 0x027e, 0x017e, 0x137e, 0x147e, 0x157e, 0x3c00, 0x007e,
++	0x2079, 0x0030, 0x2069, 0x0200, 0x1078, 0x1c6a, 0x00c0, 0x5750,
++	0x1078, 0x1b40, 0x0040, 0x575d, 0x7908, 0xa18c, 0x1fff, 0xa182,
++	0x0011, 0x00c8, 0x575a, 0x20a9, 0x000c, 0x20e1, 0x0000, 0x2ea0,
++	0x2099, 0x020a, 0x53a5, 0x20e1, 0x2000, 0x2001, 0x020a, 0x2004,
++	0x7a0c, 0x7808, 0xa080, 0x0007, 0xa084, 0x1ff8, 0xa08a, 0x0140,
++	0x10c8, 0x1332, 0x80ac, 0x20e1, 0x6000, 0x2099, 0x020a, 0x53a5,
++	0x20e1, 0x7000, 0x6828, 0x6828, 0x7803, 0x0004, 0xa294, 0x0070,
++	0x007f, 0x20e0, 0x157f, 0x147f, 0x137f, 0x017f, 0x027f, 0x0d7f,
++	0x0f7f, 0x007c, 0xa016, 0x1078, 0x15fa, 0xa085, 0x0001, 0x0078,
++	0x5750, 0x047e, 0x0e7e, 0x0d7e, 0x2028, 0x2130, 0xa696, 0x00ff,
++	0x00c0, 0x5782, 0xa596, 0xfffd, 0x00c0, 0x5772, 0x2009, 0x007f,
++	0x0078, 0x57b5, 0xa596, 0xfffe, 0x00c0, 0x577a, 0x2009, 0x007e,
++	0x0078, 0x57b5, 0xa596, 0xfffc, 0x00c0, 0x5782, 0x2009, 0x0080,
++	0x0078, 0x57b5, 0x2011, 0x0000, 0x2021, 0x0081, 0x20a9, 0x007e,
++	0x2071, 0xa7b6, 0x2e1c, 0x83ff, 0x00c0, 0x5794, 0x82ff, 0x00c0,
++	0x57a9, 0x2410, 0x0078, 0x57a9, 0x2368, 0x6f10, 0x007e, 0x2100,
++	0xa706, 0x007f, 0x6b14, 0x00c0, 0x57a3, 0xa346, 0x00c0, 0x57a3,
++	0x2408, 0x0078, 0x57b5, 0x87ff, 0x00c0, 0x57a9, 0x83ff, 0x0040,
++	0x578e, 0x8420, 0x8e70, 0x00f0, 0x578a, 0x82ff, 0x00c0, 0x57b4,
++	0xa085, 0x0001, 0x0078, 0x57b6, 0x2208, 0xa006, 0x0d7f, 0x0e7f,
++	0x047f, 0x007c, 0xa084, 0x0007, 0x0079, 0x57bf, 0x007c, 0x57c7,
++	0x57c7, 0x57c7, 0x5933, 0x57c7, 0x57c8, 0x57e1, 0x5858, 0x007c,
++	0x7110, 0xd1bc, 0x0040, 0x57e0, 0x7120, 0x2160, 0xac8c, 0x000f,
++	0x00c0, 0x57e0, 0xac8a, 0xad00, 0x0048, 0x57e0, 0x6858, 0xac02,
++	0x00c8, 0x57e0, 0x7124, 0x610a, 0x2009, 0x0046, 0x1078, 0x775c,
++	0x007c, 0x0c7e, 0xa484, 0x01ff, 0x0040, 0x5833, 0x7110, 0xd1bc,
++	0x00c0, 0x5833, 0x2011, 0xab83, 0x2204, 0x8211, 0x220c, 0x1078,
++	0x254d, 0x00c0, 0x5833, 0x1078, 0x455c, 0x00c0, 0x5833, 0x6612,
++	0x6516, 0x6000, 0xd0ec, 0x00c0, 0x5833, 0x6204, 0xa294, 0xff00,
++	0x8217, 0xa286, 0x0006, 0x00c0, 0x5818, 0x0c7e, 0x1078, 0x76c7,
++	0x017f, 0x0040, 0x5835, 0x611a, 0x601f, 0x0006, 0x7120, 0x610a,
++	0x7130, 0x6122, 0x2009, 0x0044, 0x1078, 0x775c, 0x0078, 0x5833,
++	0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x5833, 0x611a, 0x601f,
++	0x0004, 0x7120, 0x610a, 0xa286, 0x0004, 0x00c0, 0x582b, 0x6007,
++	0x0005, 0x0078, 0x582d, 0x6007, 0x0001, 0x6003, 0x0001, 0x1078,
++	0x5dd7, 0x1078, 0x62d1, 0x0c7f, 0x007c, 0x2001, 0xa60d, 0x2004,
++	0xd0ec, 0x0040, 0x583f, 0x2011, 0x8049, 0x1078, 0x361b, 0x0c7e,
++	0x1078, 0x9187, 0x017f, 0x0040, 0x5833, 0x611a, 0x601f, 0x0006,
++	0x7120, 0x610a, 0x7130, 0x6122, 0x6013, 0x0300, 0x6003, 0x0001,
++	0x6007, 0x0041, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078, 0x5833,
++	0x7110, 0xd1bc, 0x0040, 0x5870, 0x7020, 0x2060, 0xac84, 0x000f,
++	0x00c0, 0x5870, 0xac82, 0xad00, 0x0048, 0x5870, 0x6858, 0xac02,
++	0x00c8, 0x5870, 0x7124, 0x610a, 0x2009, 0x0045, 0x1078, 0x775c,
++	0x007c, 0x007e, 0x1078, 0x29bb, 0x007f, 0x00c0, 0x5887, 0x7110,
++	0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000, 0x00c0, 0x5887, 0xa084,
++	0x000f, 0xa08a, 0x0006, 0x00c8, 0x5887, 0x1079, 0x5888, 0x007c,
++	0x588e, 0x588f, 0x588e, 0x588e, 0x58ff, 0x590e, 0x007c, 0x7110,
++	0xd1bc, 0x0040, 0x5897, 0x702c, 0xd084, 0x0040, 0x58fe, 0x700c,
++	0x7108, 0x1078, 0x254d, 0x00c0, 0x58fe, 0x1078, 0x455c, 0x00c0,
++	0x58fe, 0x6612, 0x6516, 0x6204, 0x7110, 0xd1bc, 0x0040, 0x58c9,
++	0xa28c, 0x00ff, 0xa186, 0x0004, 0x0040, 0x58b2, 0xa186, 0x0006,
++	0x00c0, 0x58ef, 0x0c7e, 0x1078, 0x591d, 0x0c7f, 0x0040, 0x58fe,
++	0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x58fe, 0x611a, 0x601f,
++	0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x1078, 0x775c, 0x0078,
++	0x58fe, 0xa28c, 0x00ff, 0xa186, 0x0006, 0x0040, 0x58de, 0xa186,
++	0x0004, 0x0040, 0x58de, 0xa294, 0xff00, 0x8217, 0xa286, 0x0004,
++	0x0040, 0x58de, 0xa286, 0x0006, 0x00c0, 0x58ef, 0x0c7e, 0x1078,
++	0x76c7, 0x017f, 0x0040, 0x58fe, 0x611a, 0x601f, 0x0005, 0x7120,
++	0x610a, 0x2009, 0x0088, 0x1078, 0x775c, 0x0078, 0x58fe, 0x0c7e,
++	0x1078, 0x76c7, 0x017f, 0x0040, 0x58fe, 0x611a, 0x601f, 0x0004,
++	0x7120, 0x610a, 0x2009, 0x0001, 0x1078, 0x775c, 0x007c, 0x7110,
++	0xd1bc, 0x0040, 0x590d, 0x1078, 0x591d, 0x0040, 0x590d, 0x7124,
++	0x610a, 0x2009, 0x0089, 0x1078, 0x775c, 0x007c, 0x7110, 0xd1bc,
++	0x0040, 0x591c, 0x1078, 0x591d, 0x0040, 0x591c, 0x7124, 0x610a,
++	0x2009, 0x008a, 0x1078, 0x775c, 0x007c, 0x7020, 0x2060, 0xac84,
++	0x000f, 0x00c0, 0x5930, 0xac82, 0xad00, 0x0048, 0x5930, 0x2001,
++	0xa616, 0x2004, 0xac02, 0x00c8, 0x5930, 0xa085, 0x0001, 0x007c,
++	0xa006, 0x0078, 0x592f, 0x7110, 0xd1bc, 0x00c0, 0x5949, 0x7024,
++	0x2060, 0xac84, 0x000f, 0x00c0, 0x5949, 0xac82, 0xad00, 0x0048,
++	0x5949, 0x6858, 0xac02, 0x00c8, 0x5949, 0x2009, 0x0051, 0x1078,
++	0x775c, 0x007c, 0x2071, 0xa8c4, 0x7003, 0x0003, 0x700f, 0x0361,
++	0xa006, 0x701a, 0x7012, 0x7017, 0xad00, 0x7007, 0x0000, 0x7026,
++	0x702b, 0x6e1c, 0x7032, 0x7037, 0x6e70, 0x703b, 0x0002, 0x703f,
++	0x0000, 0x7043, 0xffff, 0x7047, 0xffff, 0x007c, 0x2071, 0xa8c4,
++	0x00e0, 0x5a32, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x00c0,
++	0x59de, 0x700f, 0x0361, 0x7007, 0x0001, 0x127e, 0x2091, 0x8000,
++	0x7138, 0x8109, 0x713a, 0x00c0, 0x59dc, 0x703b, 0x0002, 0x2009,
++	0x0100, 0x2104, 0xa082, 0x0003, 0x00c8, 0x59dc, 0x703c, 0xa086,
++	0x0001, 0x00c0, 0x59b9, 0x0d7e, 0x2069, 0x0140, 0x6804, 0xa084,
++	0x4000, 0x0040, 0x5997, 0x6803, 0x1000, 0x0078, 0x599e, 0x6804,
++	0xa084, 0x1000, 0x0040, 0x599e, 0x6803, 0x0100, 0x6803, 0x0000,
++	0x703f, 0x0000, 0x2069, 0xa8b1, 0x6804, 0xa082, 0x0006, 0x00c0,
++	0x59ab, 0x6807, 0x0000, 0x6830, 0xa082, 0x0003, 0x00c0, 0x59b2,
++	0x6833, 0x0000, 0x1078, 0x62d1, 0x1078, 0x639b, 0x0d7f, 0x0078,
++	0x59dc, 0x0d7e, 0x2069, 0xa600, 0x6948, 0x6864, 0xa102, 0x00c8,
++	0x59db, 0x2069, 0xa8b1, 0x6804, 0xa086, 0x0000, 0x00c0, 0x59db,
++	0x6830, 0xa086, 0x0000, 0x00c0, 0x59db, 0x703f, 0x0001, 0x6807,
++	0x0006, 0x6833, 0x0003, 0x2069, 0x0100, 0x6830, 0x689e, 0x2069,
++	0x0140, 0x6803, 0x0600, 0x0d7f, 0x0078, 0x59e1, 0x127e, 0x2091,
++	0x8000, 0x7024, 0xa00d, 0x0040, 0x59f9, 0x7020, 0x8001, 0x7022,
++	0x00c0, 0x59f9, 0x7023, 0x0009, 0x8109, 0x7126, 0xa186, 0x03e8,
++	0x00c0, 0x59f4, 0x7028, 0x107a, 0x81ff, 0x00c0, 0x59f9, 0x7028,
++	0x107a, 0x7030, 0xa00d, 0x0040, 0x5a10, 0x702c, 0x8001, 0x702e,
++	0x00c0, 0x5a10, 0x702f, 0x0009, 0x8109, 0x7132, 0x0040, 0x5a0e,
++	0xa184, 0x007f, 0x1040, 0x6ea2, 0x0078, 0x5a10, 0x7034, 0x107a,
++	0x7040, 0xa005, 0x0040, 0x5a18, 0x0050, 0x5a18, 0x8001, 0x7042,
++	0x7044, 0xa005, 0x0040, 0x5a20, 0x0050, 0x5a20, 0x8001, 0x7046,
++	0x7018, 0xa00d, 0x0040, 0x5a31, 0x7008, 0x8001, 0x700a, 0x00c0,
++	0x5a31, 0x700b, 0x0009, 0x8109, 0x711a, 0x00c0, 0x5a31, 0x701c,
++	0x107a, 0x127f, 0x7004, 0x0079, 0x5a35, 0x5a5c, 0x5a5d, 0x5a79,
++	0x0e7e, 0x2071, 0xa8c4, 0x7018, 0xa005, 0x00c0, 0x5a43, 0x711a,
++	0x721e, 0x700b, 0x0009, 0x0e7f, 0x007c, 0x0e7e, 0x007e, 0x2071,
++	0xa8c4, 0x701c, 0xa206, 0x00c0, 0x5a4f, 0x701a, 0x701e, 0x007f,
++	0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa8c4, 0x6088, 0xa102, 0x0048,
++	0x5a5a, 0x618a, 0x0e7f, 0x007c, 0x007c, 0x7110, 0x1078, 0x45c4,
++	0x00c0, 0x5a6f, 0x6088, 0x8001, 0x0048, 0x5a6f, 0x608a, 0x00c0,
++	0x5a6f, 0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x8108,
++	0xa182, 0x00ff, 0x0048, 0x5a77, 0xa00e, 0x7007, 0x0002, 0x7112,
++	0x007c, 0x7014, 0x2060, 0x127e, 0x2091, 0x8000, 0x603c, 0xa005,
++	0x0040, 0x5a88, 0x8001, 0x603e, 0x00c0, 0x5a88, 0x1078, 0x8f9c,
++	0x6014, 0xa005, 0x0040, 0x5ab2, 0x8001, 0x6016, 0x00c0, 0x5ab2,
++	0x611c, 0xa186, 0x0003, 0x0040, 0x5a99, 0xa186, 0x0006, 0x00c0,
++	0x5ab0, 0x6010, 0x2068, 0x6854, 0xa08a, 0x199a, 0x0048, 0x5ab0,
++	0xa082, 0x1999, 0x6856, 0xa08a, 0x199a, 0x0048, 0x5aa9, 0x2001,
++	0x1999, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x0078, 0x5ab2,
++	0x1078, 0x8abe, 0x127f, 0xac88, 0x0010, 0x7116, 0x2001, 0xcd00,
++	0xa102, 0x0048, 0x5abf, 0x7017, 0xad00, 0x7007, 0x0000, 0x007c,
++	0x0e7e, 0x2071, 0xa8c4, 0x7027, 0x07d0, 0x7023, 0x0009, 0x703b,
++	0x0002, 0x0e7f, 0x007c, 0x2001, 0xa8cd, 0x2003, 0x0000, 0x007c,
++	0x0e7e, 0x2071, 0xa8c4, 0x7132, 0x702f, 0x0009, 0x0e7f, 0x007c,
++	0x2011, 0xa8d0, 0x2013, 0x0000, 0x007c, 0x0e7e, 0x2071, 0xa8c4,
++	0x711a, 0x721e, 0x700b, 0x0009, 0x0e7f, 0x007c, 0x027e, 0x0e7e,
++	0x0f7e, 0x2079, 0xa600, 0x7a34, 0xd294, 0x0040, 0x5b15, 0x2071,
++	0xa8ac, 0x2e14, 0xa0fe, 0x0000, 0x0040, 0x5b02, 0xa0fe, 0x0001,
++	0x0040, 0x5b06, 0xa0fe, 0x0002, 0x00c0, 0x5b11, 0xa292, 0x0085,
++	0x0078, 0x5b08, 0xa292, 0x0005, 0x0078, 0x5b08, 0xa292, 0x0002,
++	0x2272, 0x0040, 0x5b0d, 0x00c8, 0x5b15, 0x2011, 0x8037, 0x1078,
++	0x361b, 0x2011, 0xa8ab, 0x2204, 0x2072, 0x0f7f, 0x0e7f, 0x027f,
++	0x007c, 0x0c7e, 0x2061, 0xa933, 0x0c7f, 0x007c, 0xa184, 0x000f,
++	0x8003, 0x8003, 0x8003, 0xa080, 0xa933, 0x2060, 0x007c, 0x6854,
++	0xa08a, 0x199a, 0x0048, 0x5b2e, 0x2001, 0x1999, 0xa005, 0x00c0,
++	0x5b3d, 0x0c7e, 0x2061, 0xa933, 0x6014, 0x0c7f, 0xa005, 0x00c0,
++	0x5b42, 0x2001, 0x001e, 0x0078, 0x5b42, 0xa08e, 0xffff, 0x00c0,
++	0x5b42, 0xa006, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x684c,
++	0xa08c, 0x00c0, 0xa18e, 0x00c0, 0x0040, 0x5b9e, 0xd0b4, 0x00c0,
++	0x5b59, 0xd0bc, 0x00c0, 0x5b8b, 0x2009, 0x0006, 0x1078, 0x5bc3,
++	0x007c, 0xd0fc, 0x0040, 0x5b64, 0xa084, 0x0003, 0x0040, 0x5b64,
++	0xa086, 0x0003, 0x00c0, 0x5bbc, 0x6024, 0xd0d4, 0x0040, 0x5b6e,
++	0xc0d4, 0x6026, 0x6860, 0x602a, 0x685c, 0x602e, 0x2009, 0xa674,
++	0x2104, 0xd084, 0x0040, 0x5b83, 0x6118, 0xa188, 0x0027, 0x2104,
++	0xd08c, 0x00c0, 0x5b83, 0x87ff, 0x00c0, 0x5b82, 0x2009, 0x0042,
++	0x1078, 0x775c, 0x007c, 0x87ff, 0x00c0, 0x5b8a, 0x2009, 0x0043,
++	0x1078, 0x775c, 0x007c, 0xd0fc, 0x0040, 0x5b96, 0xa084, 0x0003,
++	0x0040, 0x5b96, 0xa086, 0x0003, 0x00c0, 0x5bbc, 0x87ff, 0x00c0,
++	0x5b9d, 0x2009, 0x0042, 0x1078, 0x775c, 0x007c, 0xd0fc, 0x0040,
++	0x5baf, 0xa084, 0x0003, 0xa08e, 0x0002, 0x0040, 0x5bb3, 0x87ff,
++	0x00c0, 0x5bae, 0x2009, 0x0041, 0x1078, 0x775c, 0x007c, 0x1078,
++	0x5bc1, 0x0078, 0x5bae, 0x87ff, 0x00c0, 0x5bae, 0x2009, 0x0043,
++	0x1078, 0x775c, 0x0078, 0x5bae, 0x2009, 0x0004, 0x1078, 0x5bc3,
++	0x007c, 0x2009, 0x0001, 0x0d7e, 0x6010, 0xa0ec, 0xf000, 0x0040,
++	0x5bef, 0x2068, 0x6952, 0x6800, 0x6012, 0xa186, 0x0001, 0x00c0,
++	0x5be5, 0x694c, 0xa18c, 0x8100, 0xa18e, 0x8100, 0x00c0, 0x5be5,
++	0x0c7e, 0x2061, 0xa933, 0x6200, 0xd28c, 0x00c0, 0x5be4, 0x6204,
++	0x8210, 0x0048, 0x5be4, 0x6206, 0x0c7f, 0x1078, 0x4a73, 0x6010,
++	0xa06d, 0x077e, 0x2039, 0x0000, 0x10c0, 0x5b27, 0x077f, 0x0d7f,
++	0x007c, 0x157e, 0x0c7e, 0x2061, 0xa933, 0x6000, 0x81ff, 0x0040,
++	0x5bfc, 0xa205, 0x0078, 0x5bfd, 0xa204, 0x6002, 0x0c7f, 0x157f,
++	0x007c, 0x6800, 0xd08c, 0x00c0, 0x5c0d, 0x6808, 0xa005, 0x0040,
++	0x5c0d, 0x8001, 0x680a, 0xa085, 0x0001, 0x007c, 0x20a9, 0x0010,
++	0xa006, 0x8004, 0x8086, 0x818e, 0x00c8, 0x5c17, 0xa200, 0x00f0,
++	0x5c12, 0x8086, 0x818e, 0x007c, 0x157e, 0x20a9, 0x0010, 0xa005,
++	0x0040, 0x5c3d, 0xa11a, 0x00c8, 0x5c3d, 0x8213, 0x818d, 0x0048,
++	0x5c30, 0xa11a, 0x00c8, 0x5c31, 0x00f0, 0x5c25, 0x0078, 0x5c35,
++	0xa11a, 0x2308, 0x8210, 0x00f0, 0x5c25, 0x007e, 0x3200, 0xa084,
++	0xf7ff, 0x2080, 0x007f, 0x157f, 0x007c, 0x007e, 0x3200, 0xa085,
++	0x0800, 0x0078, 0x5c39, 0x127e, 0x2091, 0x2200, 0x2079, 0xa8b1,
++	0x127f, 0x0d7e, 0x2069, 0xa8b1, 0x6803, 0x0005, 0x2069, 0x0004,
++	0x2d04, 0xa085, 0x8001, 0x206a, 0x0d7f, 0x007c, 0x0c7e, 0x6027,
++	0x0001, 0x7804, 0xa084, 0x0007, 0x0079, 0x5c5e, 0x5c68, 0x5c8d,
++	0x5ce8, 0x5c6e, 0x5c8d, 0x5c68, 0x5c66, 0x5c66, 0x1078, 0x1332,
++	0x1078, 0x5acb, 0x1078, 0x62d1, 0x0c7f, 0x007c, 0x62c0, 0x82ff,
++	0x00c0, 0x5c74, 0x0c7f, 0x007c, 0x2011, 0x41dc, 0x1078, 0x5a45,
++	0x7828, 0xa092, 0x00c8, 0x00c8, 0x5c83, 0x8000, 0x782a, 0x1078,
++	0x421b, 0x0078, 0x5c72, 0x1078, 0x41dc, 0x7807, 0x0003, 0x7827,
++	0x0000, 0x782b, 0x0000, 0x0078, 0x5c72, 0x1078, 0x5acb, 0x3c00,
++	0x007e, 0x2011, 0x0209, 0x20e1, 0x4000, 0x2214, 0x007f, 0x20e0,
++	0x82ff, 0x0040, 0x5cab, 0x62c0, 0x82ff, 0x00c0, 0x5cab, 0x782b,
++	0x0000, 0x7824, 0xa065, 0x1040, 0x1332, 0x2009, 0x0013, 0x1078,
++	0x775c, 0x0c7f, 0x007c, 0x3900, 0xa082, 0xa9e3, 0x00c8, 0x5cb2,
++	0x1078, 0x747a, 0x0c7e, 0x7824, 0xa065, 0x1040, 0x1332, 0x7804,
++	0xa086, 0x0004, 0x0040, 0x5d2d, 0x7828, 0xa092, 0x2710, 0x00c8,
++	0x5cc8, 0x8000, 0x782a, 0x0c7f, 0x1078, 0x6e01, 0x0078, 0x5ca9,
++	0x6104, 0xa186, 0x0003, 0x00c0, 0x5cdf, 0x0e7e, 0x2071, 0xa600,
++	0x70d8, 0x0e7f, 0xd08c, 0x0040, 0x5cdf, 0x0c7e, 0x0e7e, 0x2061,
++	0x0100, 0x2071, 0xa600, 0x1078, 0x4224, 0x0e7f, 0x0c7f, 0x1078,
++	0xa5c4, 0x2009, 0x0014, 0x1078, 0x775c, 0x0c7f, 0x0078, 0x5ca9,
++	0x2001, 0xa8cd, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x00c0, 0x5cfc,
++	0x782b, 0x0000, 0x7824, 0xa065, 0x1040, 0x1332, 0x2009, 0x0013,
++	0x1078, 0x77b3, 0x0c7f, 0x007c, 0x0c7e, 0x0d7e, 0x3900, 0xa082,
++	0xa9e3, 0x00c8, 0x5d05, 0x1078, 0x747a, 0x7824, 0xa005, 0x1040,
++	0x1332, 0x781c, 0xa06d, 0x1040, 0x1332, 0x6800, 0xc0dc, 0x6802,
++	0x7924, 0x2160, 0x1078, 0x772d, 0x693c, 0x81ff, 0x1040, 0x1332,
++	0x8109, 0x693e, 0x6854, 0xa015, 0x0040, 0x5d21, 0x7a1e, 0x0078,
++	0x5d23, 0x7918, 0x791e, 0x7807, 0x0000, 0x7827, 0x0000, 0x0d7f,
++	0x0c7f, 0x1078, 0x62d1, 0x0078, 0x5cfa, 0x6104, 0xa186, 0x0002,
++	0x0040, 0x5d38, 0xa186, 0x0004, 0x0040, 0x5d38, 0x0078, 0x5cbc,
++	0x7808, 0xac06, 0x0040, 0x5cbc, 0x1078, 0x61cd, 0x1078, 0x5dd7,
++	0x0c7f, 0x1078, 0x62d1, 0x0078, 0x5ca9, 0x0c7e, 0x6027, 0x0002,
++	0x62c8, 0x82ff, 0x00c0, 0x5d61, 0x62c4, 0x82ff, 0x00c0, 0x5d61,
++	0x793c, 0xa1e5, 0x0000, 0x0040, 0x5d5b, 0x2009, 0x0049, 0x1078,
++	0x775c, 0x0c7f, 0x007c, 0x2011, 0xa8d0, 0x2013, 0x0000, 0x0078,
++	0x5d59, 0x3908, 0xa192, 0xa9e3, 0x00c8, 0x5d68, 0x1078, 0x747a,
++	0x6017, 0x0010, 0x793c, 0x81ff, 0x0040, 0x5d5b, 0x7944, 0xa192,
++	0x7530, 0x00c8, 0x5d85, 0x8108, 0x7946, 0x793c, 0xa188, 0x0007,
++	0x210c, 0xa18e, 0x0006, 0x00c0, 0x5d81, 0x6017, 0x0012, 0x0078,
++	0x5d59, 0x6017, 0x0016, 0x0078, 0x5d59, 0x7848, 0xc085, 0x784a,
++	0x0078, 0x5d59, 0x007e, 0x017e, 0x0c7e, 0x127e, 0x2091, 0x8000,
++	0x600f, 0x0000, 0x2c08, 0x2061, 0xa8b1, 0x6020, 0x8000, 0x6022,
++	0x6010, 0xa005, 0x0040, 0x5da5, 0xa080, 0x0003, 0x2102, 0x6112,
++	0x127f, 0x0c7f, 0x017f, 0x007f, 0x007c, 0x6116, 0x6112, 0x0078,
++	0x5da0, 0x0d7e, 0x2069, 0xa8b1, 0x6000, 0xd0d4, 0x0040, 0x5dbe,
++	0x6820, 0x8000, 0x6822, 0xa086, 0x0001, 0x00c0, 0x5db9, 0x2c00,
++	0x681e, 0x6804, 0xa084, 0x0007, 0x0079, 0x62d9, 0xc0d5, 0x6002,
++	0x6818, 0xa005, 0x0040, 0x5dd0, 0x6056, 0x605b, 0x0000, 0x007e,
++	0x2c00, 0x681a, 0x0d7f, 0x685a, 0x2069, 0xa8b1, 0x0078, 0x5db0,
++	0x6056, 0x605a, 0x2c00, 0x681a, 0x681e, 0x0078, 0x5db0, 0x007e,
++	0x017e, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08,
++	0x2061, 0xa8b1, 0x6020, 0x8000, 0x6022, 0x6008, 0xa005, 0x0040,
++	0x5df2, 0xa080, 0x0003, 0x2102, 0x610a, 0x127f, 0x0c7f, 0x017f,
++	0x007f, 0x007c, 0x610e, 0x610a, 0x0078, 0x5ded, 0x0c7e, 0x600f,
++	0x0000, 0x2c08, 0x2061, 0xa8b1, 0x6034, 0xa005, 0x0040, 0x5e06,
++	0xa080, 0x0003, 0x2102, 0x6136, 0x0c7f, 0x007c, 0x613a, 0x6136,
++	0x0078, 0x5e04, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x057e,
++	0x037e, 0x027e, 0x017e, 0x007e, 0x127e, 0xa02e, 0x2071, 0xa8b1,
++	0x7638, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0040, 0x5e8c,
++	0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x00c0, 0x5e87, 0x87ff,
++	0x0040, 0x5e2e, 0x6020, 0xa106, 0x00c0, 0x5e87, 0x703c, 0xac06,
++	0x00c0, 0x5e44, 0x037e, 0x2019, 0x0001, 0x1078, 0x7058, 0x7033,
++	0x0000, 0x703f, 0x0000, 0x7043, 0x0000, 0x7047, 0x0000, 0x704b,
++	0x0000, 0x037f, 0x2029, 0x0001, 0x7038, 0xac36, 0x00c0, 0x5e4a,
++	0x660c, 0x763a, 0x7034, 0xac36, 0x00c0, 0x5e58, 0x2c00, 0xaf36,
++	0x0040, 0x5e56, 0x2f00, 0x7036, 0x0078, 0x5e58, 0x7037, 0x0000,
++	0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x5e61, 0x7e0e, 0x0078,
++	0x5e62, 0x2678, 0x600f, 0x0000, 0x1078, 0x8d06, 0x0040, 0x5e82,
++	0x6010, 0x2068, 0x601c, 0xa086, 0x0003, 0x00c0, 0x5e9d, 0x6837,
++	0x0103, 0x6b4a, 0x6847, 0x0000, 0x017e, 0x037e, 0x077e, 0x1078,
++	0x8f7d, 0x1078, 0xa4e2, 0x1078, 0x4a73, 0x077f, 0x037f, 0x017f,
++	0x1078, 0x8eb9, 0x1078, 0x8ec6, 0x0c7f, 0x0078, 0x5e1d, 0x2c78,
++	0x600c, 0x2060, 0x0078, 0x5e1d, 0x85ff, 0x0040, 0x5e91, 0x1078,
++	0x639b, 0x127f, 0x007f, 0x017f, 0x027f, 0x037f, 0x057f, 0x067f,
++	0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086, 0x0006,
++	0x00c0, 0x5e6f, 0x017e, 0x037e, 0x077e, 0x1078, 0xa4e2, 0x1078,
++	0xa1ca, 0x077f, 0x037f, 0x017f, 0x0078, 0x5e82, 0x007e, 0x067e,
++	0x0c7e, 0x0d7e, 0x0f7e, 0x2031, 0x0000, 0x127e, 0x2091, 0x8000,
++	0x2079, 0xa8b1, 0x7838, 0xa065, 0x0040, 0x5eef, 0x600c, 0x007e,
++	0x600f, 0x0000, 0x783c, 0xac06, 0x00c0, 0x5ed6, 0x037e, 0x2019,
++	0x0001, 0x1078, 0x7058, 0x7833, 0x0000, 0x783f, 0x0000, 0x7843,
++	0x0000, 0x7847, 0x0000, 0x784b, 0x0000, 0x037f, 0x1078, 0x8d06,
++	0x0040, 0x5eea, 0x6010, 0x2068, 0x601c, 0xa086, 0x0003, 0x00c0,
++	0x5ef8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4a73,
++	0x1078, 0x8eb9, 0x1078, 0x8ec6, 0x007f, 0x0078, 0x5ebb, 0x7e3a,
++	0x7e36, 0x127f, 0x0f7f, 0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c,
++	0x601c, 0xa086, 0x0006, 0x00c0, 0x5ee1, 0x1078, 0xa1ca, 0x0078,
++	0x5eea, 0x017e, 0x027e, 0x087e, 0x2041, 0x0000, 0x1078, 0x5f1b,
++	0x1078, 0x5fdb, 0x087f, 0x027f, 0x017f, 0x007c, 0x0f7e, 0x127e,
++	0x2079, 0xa8b1, 0x2091, 0x8000, 0x1078, 0x6076, 0x1078, 0x60ec,
++	0x127f, 0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e,
++	0x017e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa8b1, 0x7614,
++	0x2660, 0x2678, 0x8cff, 0x0040, 0x5fb5, 0x6018, 0xa080, 0x0028,
++	0x2004, 0xa206, 0x00c0, 0x5fb0, 0x88ff, 0x0040, 0x5f3b, 0x6020,
++	0xa106, 0x00c0, 0x5fb0, 0x7024, 0xac06, 0x00c0, 0x5f6b, 0x2069,
++	0x0100, 0x68c0, 0xa005, 0x0040, 0x5f66, 0x1078, 0x5acb, 0x1078,
++	0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378, 0x7027, 0x0000, 0x037e,
++	0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x5f5b, 0x6803,
++	0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040,
++	0x5f63, 0x6827, 0x0001, 0x037f, 0x0078, 0x5f6b, 0x6003, 0x0009,
++	0x630a, 0x0078, 0x5fb0, 0x7014, 0xac36, 0x00c0, 0x5f71, 0x660c,
++	0x7616, 0x7010, 0xac36, 0x00c0, 0x5f7f, 0x2c00, 0xaf36, 0x0040,
++	0x5f7d, 0x2f00, 0x7012, 0x0078, 0x5f7f, 0x7013, 0x0000, 0x660c,
++	0x067e, 0x2c00, 0xaf06, 0x0040, 0x5f88, 0x7e0e, 0x0078, 0x5f89,
++	0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040,
++	0x5fa9, 0x601c, 0xa086, 0x0003, 0x00c0, 0x5fbe, 0x6837, 0x0103,
++	0x6b4a, 0x6847, 0x0000, 0x017e, 0x037e, 0x087e, 0x1078, 0x8f7d,
++	0x1078, 0xa4e2, 0x1078, 0x4a73, 0x087f, 0x037f, 0x017f, 0x1078,
++	0x8eb9, 0x1078, 0x8ec6, 0x1078, 0x7233, 0x0c7f, 0x0078, 0x5f2a,
++	0x2c78, 0x600c, 0x2060, 0x0078, 0x5f2a, 0x127f, 0x007f, 0x017f,
++	0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086,
++	0x0006, 0x00c0, 0x5fcf, 0x017e, 0x037e, 0x087e, 0x1078, 0xa4e2,
++	0x1078, 0xa1ca, 0x087f, 0x037f, 0x017f, 0x0078, 0x5fa9, 0x601c,
++	0xa086, 0x0002, 0x00c0, 0x5fa9, 0x6004, 0xa086, 0x0085, 0x0040,
++	0x5f96, 0x0078, 0x5fa9, 0x0c7e, 0x007e, 0x127e, 0x2091, 0x8000,
++	0xa280, 0xa735, 0x2004, 0xa065, 0x0040, 0x6072, 0x0f7e, 0x0e7e,
++	0x0d7e, 0x067e, 0x2071, 0xa8b1, 0x6654, 0x7018, 0xac06, 0x00c0,
++	0x5ff2, 0x761a, 0x701c, 0xac06, 0x00c0, 0x5ffe, 0x86ff, 0x00c0,
++	0x5ffd, 0x7018, 0x701e, 0x0078, 0x5ffe, 0x761e, 0x6058, 0xa07d,
++	0x0040, 0x6003, 0x7e56, 0xa6ed, 0x0000, 0x0040, 0x6009, 0x2f00,
++	0x685a, 0x6057, 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc,
++	0x6002, 0x1078, 0x44d3, 0x0040, 0x606e, 0x7624, 0x86ff, 0x0040,
++	0x605c, 0xa680, 0x0004, 0x2004, 0xad06, 0x00c0, 0x605c, 0x0d7e,
++	0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x6053, 0x1078, 0x5acb,
++	0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378, 0x7027, 0x0000,
++	0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x603c,
++	0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084,
++	0x0040, 0x6044, 0x6827, 0x0001, 0x037f, 0x0d7f, 0x0c7e, 0x603c,
++	0xa005, 0x0040, 0x604d, 0x8001, 0x603e, 0x2660, 0x1078, 0x8ec6,
++	0x0c7f, 0x0078, 0x605c, 0x0d7f, 0x0c7e, 0x2660, 0x6003, 0x0009,
++	0x630a, 0x0c7f, 0x0078, 0x6011, 0x8dff, 0x0040, 0x606a, 0x6837,
++	0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x8f7d, 0x1078, 0xa4e2,
++	0x1078, 0x4a73, 0x1078, 0x7233, 0x0078, 0x6011, 0x067f, 0x0d7f,
++	0x0e7f, 0x0f7f, 0x127f, 0x007f, 0x0c7f, 0x007c, 0x007e, 0x067e,
++	0x0c7e, 0x0d7e, 0x2031, 0x0000, 0x7814, 0xa065, 0x0040, 0x60d0,
++	0x600c, 0x007e, 0x600f, 0x0000, 0x7824, 0xac06, 0x00c0, 0x60b5,
++	0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x60af, 0x1078, 0x5acb,
++	0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378, 0x7827, 0x0000,
++	0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x60a4,
++	0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084,
++	0x0040, 0x60ac, 0x6827, 0x0001, 0x037f, 0x0078, 0x60b5, 0x6003,
++	0x0009, 0x630a, 0x2c30, 0x0078, 0x60cd, 0x6010, 0x2068, 0x1078,
++	0x8d06, 0x0040, 0x60c9, 0x601c, 0xa086, 0x0003, 0x00c0, 0x60d7,
++	0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4a73, 0x1078,
++	0x8eb9, 0x1078, 0x8ec6, 0x1078, 0x7233, 0x007f, 0x0078, 0x607d,
++	0x7e16, 0x7e12, 0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c, 0x601c,
++	0xa086, 0x0006, 0x00c0, 0x60e0, 0x1078, 0xa1ca, 0x0078, 0x60c9,
++	0x601c, 0xa086, 0x0002, 0x00c0, 0x60c9, 0x6004, 0xa086, 0x0085,
++	0x0040, 0x60c0, 0x0078, 0x60c9, 0x007e, 0x067e, 0x0c7e, 0x0d7e,
++	0x7818, 0xa065, 0x0040, 0x615a, 0x6054, 0x007e, 0x6057, 0x0000,
++	0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x1078, 0x44d3,
++	0x0040, 0x6157, 0x7e24, 0x86ff, 0x0040, 0x6149, 0xa680, 0x0004,
++	0x2004, 0xad06, 0x00c0, 0x6149, 0x0d7e, 0x2069, 0x0100, 0x68c0,
++	0xa005, 0x0040, 0x6140, 0x1078, 0x5acb, 0x1078, 0x6e0f, 0x68c3,
++	0x0000, 0x1078, 0x7378, 0x7827, 0x0000, 0x037e, 0x2069, 0x0140,
++	0x6b04, 0xa384, 0x1000, 0x0040, 0x6129, 0x6803, 0x0100, 0x6803,
++	0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x6131, 0x6827,
++	0x0001, 0x037f, 0x0d7f, 0x0c7e, 0x603c, 0xa005, 0x0040, 0x613a,
++	0x8001, 0x603e, 0x2660, 0x1078, 0x8ec6, 0x0c7f, 0x0078, 0x6149,
++	0x0d7f, 0x0c7e, 0x2660, 0x6003, 0x0009, 0x630a, 0x0c7f, 0x0078,
++	0x60fe, 0x8dff, 0x0040, 0x6153, 0x6837, 0x0103, 0x6b4a, 0x6847,
++	0x0000, 0x1078, 0x4a73, 0x1078, 0x7233, 0x0078, 0x60fe, 0x007f,
++	0x0078, 0x60f1, 0x781e, 0x781a, 0x0d7f, 0x0c7f, 0x067f, 0x007f,
++	0x007c, 0x0e7e, 0x0d7e, 0x067e, 0x6000, 0xd0dc, 0x0040, 0x6181,
++	0x604c, 0xa06d, 0x0040, 0x6181, 0x6848, 0xa606, 0x00c0, 0x6181,
++	0x2071, 0xa8b1, 0x7024, 0xa035, 0x0040, 0x6181, 0xa080, 0x0004,
++	0x2004, 0xad06, 0x00c0, 0x6181, 0x6000, 0xc0dc, 0x6002, 0x1078,
++	0x6185, 0x067f, 0x0d7f, 0x0e7f, 0x007c, 0x0f7e, 0x2079, 0x0100,
++	0x78c0, 0xa005, 0x00c0, 0x6194, 0x0c7e, 0x2660, 0x6003, 0x0009,
++	0x630a, 0x0c7f, 0x0078, 0x61cb, 0x1078, 0x6e0f, 0x78c3, 0x0000,
++	0x1078, 0x7378, 0x7027, 0x0000, 0x037e, 0x2079, 0x0140, 0x7b04,
++	0xa384, 0x1000, 0x0040, 0x61a8, 0x7803, 0x0100, 0x7803, 0x0000,
++	0x2079, 0x0100, 0x7824, 0xd084, 0x0040, 0x61b0, 0x7827, 0x0001,
++	0x1078, 0x7378, 0x037f, 0x1078, 0x44d3, 0x0c7e, 0x603c, 0xa005,
++	0x0040, 0x61bc, 0x8001, 0x603e, 0x2660, 0x1078, 0x772d, 0x0c7f,
++	0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x8f7d, 0x1078,
++	0x4a73, 0x1078, 0x7233, 0x0f7f, 0x007c, 0x0e7e, 0x0c7e, 0x2071,
++	0xa8b1, 0x7004, 0xa084, 0x0007, 0x0079, 0x61d6, 0x61e0, 0x61e3,
++	0x61fc, 0x6218, 0x6262, 0x61e0, 0x61e0, 0x61de, 0x1078, 0x1332,
++	0x0c7f, 0x0e7f, 0x007c, 0x7024, 0xa065, 0x0040, 0x61f1, 0x7020,
++	0x8001, 0x7022, 0x600c, 0xa015, 0x0040, 0x61f8, 0x7216, 0x600f,
++	0x0000, 0x7007, 0x0000, 0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c,
++	0x7216, 0x7212, 0x0078, 0x61f1, 0x6018, 0x2060, 0x1078, 0x44d3,
++	0x6000, 0xc0dc, 0x6002, 0x7020, 0x8001, 0x7022, 0x0040, 0x620d,
++	0x6054, 0xa015, 0x0040, 0x6214, 0x721e, 0x7007, 0x0000, 0x7027,
++	0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x7218, 0x721e, 0x0078, 0x620d,
++	0x7024, 0xa065, 0x0040, 0x625f, 0x700c, 0xac06, 0x00c0, 0x622f,
++	0x1078, 0x7233, 0x600c, 0xa015, 0x0040, 0x622b, 0x720e, 0x600f,
++	0x0000, 0x0078, 0x625d, 0x720e, 0x720a, 0x0078, 0x625d, 0x7014,
++	0xac06, 0x00c0, 0x6242, 0x1078, 0x7233, 0x600c, 0xa015, 0x0040,
++	0x623e, 0x7216, 0x600f, 0x0000, 0x0078, 0x625d, 0x7216, 0x7212,
++	0x0078, 0x625d, 0x601c, 0xa086, 0x0003, 0x00c0, 0x625d, 0x6018,
++	0x2060, 0x1078, 0x44d3, 0x6000, 0xc0dc, 0x6002, 0x1078, 0x7233,
++	0x701c, 0xa065, 0x0040, 0x625d, 0x6054, 0xa015, 0x0040, 0x625b,
++	0x721e, 0x0078, 0x625d, 0x7218, 0x721e, 0x7027, 0x0000, 0x0c7f,
++	0x0e7f, 0x007c, 0x7024, 0xa065, 0x0040, 0x626f, 0x1078, 0x7233,
++	0x600c, 0xa015, 0x0040, 0x6276, 0x720e, 0x600f, 0x0000, 0x1078,
++	0x7378, 0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x720e, 0x720a,
++	0x0078, 0x626f, 0x0d7e, 0x2069, 0xa8b1, 0x6830, 0xa084, 0x0003,
++	0x0079, 0x6282, 0x6288, 0x628a, 0x62b4, 0x6288, 0x1078, 0x1332,
++	0x0d7f, 0x007c, 0x0c7e, 0x6840, 0xa086, 0x0001, 0x0040, 0x62aa,
++	0x683c, 0xa065, 0x0040, 0x629b, 0x600c, 0xa015, 0x0040, 0x62a6,
++	0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011,
++	0xa8d0, 0x2013, 0x0000, 0x0c7f, 0x0d7f, 0x007c, 0x683a, 0x6836,
++	0x0078, 0x629b, 0x6843, 0x0000, 0x6838, 0xa065, 0x0040, 0x629b,
++	0x6003, 0x0003, 0x0078, 0x629b, 0x0c7e, 0x6843, 0x0000, 0x6847,
++	0x0000, 0x684b, 0x0000, 0x683c, 0xa065, 0x0040, 0x62ce, 0x600c,
++	0xa015, 0x0040, 0x62ca, 0x6a3a, 0x600f, 0x0000, 0x683f, 0x0000,
++	0x0078, 0x62ce, 0x683f, 0x0000, 0x683a, 0x6836, 0x0c7f, 0x0d7f,
++	0x007c, 0x0d7e, 0x2069, 0xa8b1, 0x6804, 0xa084, 0x0007, 0x0079,
++	0x62d9, 0x62e3, 0x638a, 0x638a, 0x638a, 0x638a, 0x638c, 0x638a,
++	0x62e1, 0x1078, 0x1332, 0x6820, 0xa005, 0x00c0, 0x62e9, 0x0d7f,
++	0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040, 0x62f8, 0x6807, 0x0004,
++	0x6826, 0x682b, 0x0000, 0x1078, 0x63d4, 0x0c7f, 0x0d7f, 0x007c,
++	0x6814, 0xa065, 0x0040, 0x6306, 0x6807, 0x0001, 0x6826, 0x682b,
++	0x0000, 0x1078, 0x63d4, 0x0c7f, 0x0d7f, 0x007c, 0x0e7e, 0x037e,
++	0x6a1c, 0xa2f5, 0x0000, 0x0040, 0x6385, 0x704c, 0xa00d, 0x0040,
++	0x6315, 0x7088, 0xa005, 0x0040, 0x632d, 0x7054, 0xa075, 0x0040,
++	0x631e, 0xa20e, 0x0040, 0x6385, 0x0078, 0x6323, 0x6818, 0xa20e,
++	0x0040, 0x6385, 0x2070, 0x704c, 0xa00d, 0x0040, 0x6315, 0x7088,
++	0xa005, 0x00c0, 0x6315, 0x2e00, 0x681e, 0x733c, 0x7038, 0xa302,
++	0x00c8, 0x6315, 0x1078, 0x76fc, 0x0040, 0x6385, 0x8318, 0x733e,
++	0x6112, 0x2e10, 0x621a, 0xa180, 0x0014, 0x2004, 0xa084, 0x00ff,
++	0x6032, 0xa180, 0x0014, 0x2003, 0x0000, 0xa180, 0x0015, 0x2004,
++	0xa08a, 0x199a, 0x0048, 0x634e, 0x2001, 0x1999, 0x8003, 0x801b,
++	0x831b, 0xa318, 0x6316, 0x037f, 0x0f7e, 0x2c78, 0x71a0, 0xd1bc,
++	0x0040, 0x6367, 0x7100, 0xd1f4, 0x0040, 0x6363, 0x7114, 0xa18c,
++	0x00ff, 0x0078, 0x636c, 0x2009, 0x0000, 0x0078, 0x636c, 0xa1e0,
++	0x29c0, 0x2c0c, 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0x1078,
++	0x6965, 0x7300, 0xc3dd, 0x7302, 0x6807, 0x0002, 0x2f18, 0x6b26,
++	0x682b, 0x0000, 0x781f, 0x0003, 0x7803, 0x0001, 0x7807, 0x0040,
++	0x0f7f, 0x0e7f, 0x0c7f, 0x0d7f, 0x007c, 0x037f, 0x0e7f, 0x0c7f,
++	0x0078, 0x6383, 0x0d7f, 0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040,
++	0x6398, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x1078, 0x63d4,
++	0x0c7f, 0x0d7f, 0x007c, 0x0f7e, 0x0d7e, 0x2069, 0xa8b1, 0x6830,
++	0xa086, 0x0000, 0x00c0, 0x63bb, 0x6838, 0xa07d, 0x0040, 0x63bb,
++	0x6833, 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x127e,
++	0x0f7e, 0x2091, 0x2200, 0x027f, 0x1078, 0x1d6d, 0x00c0, 0x63be,
++	0x127f, 0x1078, 0x6cb3, 0x0d7f, 0x0f7f, 0x007c, 0x127f, 0x6843,
++	0x0000, 0x7803, 0x0002, 0x780c, 0xa015, 0x0040, 0x63d0, 0x6a3a,
++	0x780f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x0078, 0x63bb,
++	0x683a, 0x6836, 0x0078, 0x63ca, 0x601c, 0xa084, 0x000f, 0x1079,
++	0x63da, 0x007c, 0x63e3, 0x63e8, 0x6809, 0x6922, 0x63e8, 0x6809,
++	0x6922, 0x63e3, 0x63e8, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x007c,
++	0x157e, 0x137e, 0x147e, 0x0c7e, 0x0f7e, 0x6004, 0xa08a, 0x0044,
++	0x10c8, 0x1332, 0x6118, 0x2178, 0x79a0, 0xd1bc, 0x0040, 0x6405,
++	0x7900, 0xd1f4, 0x0040, 0x6401, 0x7914, 0xa18c, 0x00ff, 0x0078,
++	0x640a, 0x2009, 0x0000, 0x0078, 0x640a, 0xa1f8, 0x29c0, 0x2f0c,
++	0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0xa08a, 0x0040,
++	0x00c8, 0x645c, 0x1079, 0x641a, 0x0f7f, 0x0c7f, 0x147f, 0x137f,
++	0x157f, 0x007c, 0x64c2, 0x650a, 0x6532, 0x65cd, 0x65fd, 0x6605,
++	0x662c, 0x663d, 0x664e, 0x6656, 0x666e, 0x6656, 0x66d9, 0x663d,
++	0x66fa, 0x6702, 0x664e, 0x6702, 0x6713, 0x645a, 0x645a, 0x645a,
++	0x645a, 0x645a, 0x645a, 0x645a, 0x645a, 0x645a, 0x645a, 0x645a,
++	0x6eef, 0x6f14, 0x6f29, 0x6f4c, 0x6f6d, 0x662c, 0x645a, 0x662c,
++	0x6656, 0x645a, 0x6532, 0x65cd, 0x645a, 0x749c, 0x6656, 0x645a,
++	0x74bc, 0x6656, 0x645a, 0x645a, 0x64bd, 0x646b, 0x645a, 0x74e1,
++	0x7558, 0x7640, 0x645a, 0x7651, 0x6626, 0x766d, 0x645a, 0x6f82,
++	0x645a, 0x645a, 0x1078, 0x1332, 0x2100, 0x1079, 0x6465, 0x0f7f,
++	0x0c7f, 0x147f, 0x137f, 0x157f, 0x007c, 0x6469, 0x6469, 0x6469,
++	0x649f, 0x1078, 0x1332, 0x0d7e, 0x20a1, 0x020b, 0x1078, 0x6731,
++	0x7810, 0x2068, 0x20a3, 0x2414, 0x20a3, 0x0018, 0x20a3, 0x0800,
++	0x683c, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x6850, 0x20a2, 0x6854, 0x20a2, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x60c3, 0x0018, 0x1078, 0x6dfb, 0x0d7f, 0x007c,
++	0x0d7e, 0x7818, 0x2068, 0x68a0, 0xa082, 0x007e, 0x0048, 0x649c,
++	0xa085, 0x0001, 0x0d7f, 0x007c, 0xa006, 0x0078, 0x649a, 0x0d7e,
++	0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x0500, 0x20a3, 0x0000,
++	0x7810, 0xa0e8, 0x000f, 0x6808, 0x20a2, 0x680c, 0x20a2, 0x6810,
++	0x20a2, 0x6814, 0x20a2, 0x6818, 0x20a2, 0x681c, 0x20a2, 0x60c3,
++	0x0010, 0x1078, 0x6dfb, 0x0d7f, 0x007c, 0x6030, 0x609a, 0x1078,
++	0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x5200,
++	0x20a3, 0x0000, 0x0d7e, 0x2069, 0xa652, 0x6804, 0xd084, 0x0040,
++	0x64dc, 0x6828, 0x20a3, 0x0000, 0x017e, 0x1078, 0x2564, 0x21a2,
++	0x017f, 0x0d7f, 0x0078, 0x64e1, 0x0d7f, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a9, 0x0004, 0x2099, 0xa605, 0x53a6, 0x20a9, 0x0004,
++	0x2099, 0xa601, 0x53a6, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082,
++	0x007f, 0x0048, 0x64fb, 0x2001, 0xa61b, 0x20a6, 0x2001, 0xa61c,
++	0x20a6, 0x0078, 0x6501, 0x20a3, 0x0000, 0x6030, 0xa084, 0x00ff,
++	0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x1078,
++	0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x0500,
++	0x20a3, 0x0000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007f,
++	0x0048, 0x6522, 0x2001, 0xa61b, 0x20a6, 0x2001, 0xa61c, 0x20a6,
++	0x0078, 0x6528, 0x20a3, 0x0000, 0x6030, 0xa084, 0x00ff, 0x20a2,
++	0x20a9, 0x0004, 0x2099, 0xa605, 0x53a6, 0x60c3, 0x0010, 0x1078,
++	0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x6731, 0x0c7e, 0x7818,
++	0x2060, 0x2001, 0x0000, 0x1078, 0x4972, 0x0c7f, 0x7818, 0xa080,
++	0x0028, 0x2004, 0xa086, 0x007e, 0x00c0, 0x654d, 0x20a3, 0x0400,
++	0x620c, 0xc2b4, 0x620e, 0x0078, 0x654f, 0x20a3, 0x0300, 0x20a3,
++	0x0000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x00c0,
++	0x659c, 0x2099, 0xa88d, 0x33a6, 0x9398, 0x33a6, 0x9398, 0x3304,
++	0xa084, 0x3fff, 0x20a2, 0x9398, 0x33a6, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099,
++	0xa605, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xa601, 0x53a6, 0x20a9,
++	0x0010, 0x20a3, 0x0000, 0x00f0, 0x6579, 0x2099, 0xa895, 0x3304,
++	0xc0dd, 0x20a2, 0x2001, 0xa672, 0x2004, 0xd0e4, 0x0040, 0x6594,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x9398, 0x9398, 0x9398, 0x33a6,
++	0x20a9, 0x0004, 0x0078, 0x6596, 0x20a9, 0x0007, 0x20a3, 0x0000,
++	0x00f0, 0x6596, 0x0078, 0x65bc, 0x2099, 0xa88d, 0x20a9, 0x0008,
++	0x53a6, 0x20a9, 0x0004, 0x2099, 0xa605, 0x53a6, 0x20a9, 0x0004,
++	0x2099, 0xa601, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0,
++	0x65ad, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0, 0x65b3, 0x2099,
++	0xa895, 0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000,
++	0x00f0, 0x65be, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x00f0, 0x65c4,
++	0x60c3, 0x0074, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078,
++	0x6731, 0x20a3, 0x2010, 0x20a3, 0x0014, 0x20a3, 0x0800, 0x20a3,
++	0x2000, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x0f7e,
++	0x2079, 0xa652, 0x7904, 0x0f7f, 0xd1ac, 0x00c0, 0x65e9, 0xa085,
++	0x0020, 0xd1a4, 0x0040, 0x65ee, 0xa085, 0x0010, 0xa085, 0x0002,
++	0x0d7e, 0x0078, 0x66b7, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x0014, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078,
++	0x6731, 0x20a3, 0x5000, 0x0078, 0x654f, 0x20a1, 0x020b, 0x1078,
++	0x6731, 0x20a3, 0x2110, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x60c3, 0x0014, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b,
++	0x1078, 0x67b9, 0x0078, 0x6630, 0x20a1, 0x020b, 0x1078, 0x67c2,
++	0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x0004, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078,
++	0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3,
++	0x2a00, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b,
++	0x1078, 0x67c2, 0x20a3, 0x0200, 0x0078, 0x654f, 0x20a1, 0x020b,
++	0x1078, 0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0xa005,
++	0x0040, 0x6665, 0x20a2, 0x0078, 0x6667, 0x20a3, 0x0003, 0x7810,
++	0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c, 0x0d7e, 0x20a1,
++	0x020b, 0x1078, 0x67c2, 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3,
++	0x0800, 0x7818, 0x2068, 0x6894, 0xa086, 0x0014, 0x00c0, 0x6694,
++	0x6998, 0xa184, 0xc000, 0x00c0, 0x6690, 0xd1ec, 0x0040, 0x668c,
++	0x20a3, 0x2100, 0x0078, 0x6696, 0x20a3, 0x0100, 0x0078, 0x6696,
++	0x20a3, 0x0400, 0x0078, 0x6696, 0x20a3, 0x0700, 0xa006, 0x20a2,
++	0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x0f7e, 0x2079, 0xa652, 0x7904,
++	0x0f7f, 0xd1ac, 0x00c0, 0x66a6, 0xa085, 0x0020, 0xd1a4, 0x0040,
++	0x66ab, 0xa085, 0x0010, 0x2009, 0xa674, 0x210c, 0xd184, 0x0040,
++	0x66b5, 0x699c, 0xd18c, 0x0040, 0x66b7, 0xa085, 0x0002, 0x027e,
++	0x2009, 0xa672, 0x210c, 0xd1e4, 0x0040, 0x66c5, 0xc0c5, 0xa094,
++	0x0030, 0xa296, 0x0010, 0x0040, 0x66cf, 0xd1ec, 0x0040, 0x66cf,
++	0xa094, 0x0030, 0xa296, 0x0010, 0x0040, 0x66cf, 0xc0bd, 0x027f,
++	0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x0014, 0x1078, 0x6dfb, 0x0d7f,
++	0x007c, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0210, 0x20a3,
++	0x0014, 0x20a3, 0x0000, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
++	0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0200,
++	0x0078, 0x64c8, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0100,
++	0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008,
++	0x1078, 0x6dfb, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a1,
++	0x020b, 0x1078, 0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3,
++	0x000b, 0x20a3, 0x0000, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c,
++	0x027e, 0x037e, 0x047e, 0x2019, 0x3200, 0x2021, 0x0800, 0x0078,
++	0x6738, 0x027e, 0x037e, 0x047e, 0x2019, 0x2200, 0x2021, 0x0100,
++	0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2014,
++	0xa286, 0x007e, 0x00c0, 0x674b, 0xa385, 0x00ff, 0x20a2, 0x20a3,
++	0xfffe, 0x0078, 0x6780, 0xa286, 0x007f, 0x00c0, 0x6757, 0x0d7e,
++	0xa385, 0x00ff, 0x20a2, 0x20a3, 0xfffd, 0x0078, 0x676e, 0xd2bc,
++	0x0040, 0x6776, 0xa286, 0x0080, 0x0d7e, 0x00c0, 0x6766, 0xa385,
++	0x00ff, 0x20a2, 0x20a3, 0xfffc, 0x0078, 0x676e, 0xa2e8, 0xa735,
++	0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b,
++	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6784, 0x0d7e, 0xa2e8,
++	0xa735, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x0d7f,
++	0x20a3, 0x0000, 0x6230, 0x22a2, 0xa485, 0x0029, 0x20a2, 0x047f,
++	0x037f, 0x20a3, 0x0000, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000,
++	0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f,
++	0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3, 0x02ff,
++	0x2011, 0xfffc, 0x22a2, 0x0d7e, 0x2069, 0xa61b, 0x2da6, 0x8d68,
++	0x2da6, 0x0d7f, 0x20a3, 0x2029, 0x20a3, 0x0000, 0x0078, 0x678b,
++	0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0xfc02, 0x20a3, 0x0000,
++	0x007c, 0x027e, 0x037e, 0x047e, 0x2019, 0x3300, 0x2021, 0x0800,
++	0x0078, 0x67c9, 0x027e, 0x037e, 0x047e, 0x2019, 0x2300, 0x2021,
++	0x0100, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++	0x2004, 0xa092, 0x007e, 0x0048, 0x67e6, 0x0d7e, 0xa0e8, 0xa735,
++	0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b,
++	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x67f4, 0x0d7e, 0xa0e8,
++	0xa735, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x0d7f,
++	0x20a3, 0x0000, 0x6230, 0x22a2, 0xa485, 0x0098, 0x20a2, 0x20a3,
++	0x0000, 0x047f, 0x037f, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000,
++	0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f,
++	0x007c, 0x0c7e, 0x0f7e, 0x6004, 0xa08a, 0x0085, 0x1048, 0x1332,
++	0xa08a, 0x008c, 0x10c8, 0x1332, 0x6118, 0x2178, 0x79a0, 0xd1bc,
++	0x0040, 0x6827, 0x7900, 0xd1f4, 0x0040, 0x6823, 0x7914, 0xa18c,
++	0x00ff, 0x0078, 0x682c, 0x2009, 0x0000, 0x0078, 0x682c, 0xa1f8,
++	0x29c0, 0x2f0c, 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a,
++	0xa082, 0x0085, 0x1079, 0x6837, 0x0f7f, 0x0c7f, 0x007c, 0x6840,
++	0x684b, 0x6866, 0x683e, 0x683e, 0x683e, 0x6840, 0x1078, 0x1332,
++	0x147e, 0x20a1, 0x020b, 0x1078, 0x6879, 0x60c3, 0x0000, 0x1078,
++	0x6dfb, 0x147f, 0x007c, 0x147e, 0x20a1, 0x020b, 0x1078, 0x68ad,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x7810, 0x20a2,
++	0x20a3, 0x0000, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x000c, 0x1078, 0x6dfb, 0x147f, 0x007c, 0x147e, 0x20a1,
++	0x020b, 0x1078, 0x68ee, 0x20a3, 0x0003, 0x20a3, 0x0300, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004, 0x1078, 0x6dfb, 0x147f,
++	0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080,
++	0x0028, 0x2004, 0xa092, 0x007e, 0x0048, 0x6898, 0x0d7e, 0xa0e8,
++	0xa735, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2,
++	0x2069, 0xa61b, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x68a7,
++	0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2,
++	0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3,
++	0x0009, 0x20a3, 0x0000, 0x0078, 0x678b, 0x027e, 0x20e1, 0x9080,
++	0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa092, 0x007e,
++	0x0048, 0x68cc, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085,
++	0x8400, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b, 0x2da6, 0x8d68,
++	0x2da6, 0x0d7f, 0x0078, 0x68db, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c,
++	0x6810, 0xa085, 0x8400, 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3,
++	0x0000, 0x6230, 0x22a2, 0x20a3, 0x0099, 0x20a3, 0x0000, 0x1078,
++	0x6dea, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x7a10, 0x22a2,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x027e, 0x20e1,
++	0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa092,
++	0x007e, 0x0048, 0x690d, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810,
++	0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b, 0x2da6,
++	0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x691c, 0x0d7e, 0xa0e8, 0xa735,
++	0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x0d7f,
++	0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0099, 0x20a3, 0x0000,
++	0x0078, 0x68df, 0x0c7e, 0x0f7e, 0x2c78, 0x7804, 0xa08a, 0x0040,
++	0x1048, 0x1332, 0xa08a, 0x0053, 0x10c8, 0x1332, 0x7918, 0x2160,
++	0x61a0, 0xd1bc, 0x0040, 0x6941, 0x6100, 0xd1f4, 0x0040, 0x693d,
++	0x6114, 0xa18c, 0x00ff, 0x0078, 0x6946, 0x2009, 0x0000, 0x0078,
++	0x6946, 0xa1e0, 0x29c0, 0x2c0c, 0xa18c, 0x00ff, 0x2061, 0x0100,
++	0x619a, 0xa082, 0x0040, 0x1079, 0x6950, 0x0f7f, 0x0c7f, 0x007c,
++	0x6965, 0x6a73, 0x6a14, 0x6c27, 0x6963, 0x6963, 0x6963, 0x6963,
++	0x6963, 0x6963, 0x6963, 0x714c, 0x715d, 0x716e, 0x717f, 0x6963,
++	0x767e, 0x6963, 0x713b, 0x1078, 0x1332, 0x0d7e, 0x157e, 0x147e,
++	0x780b, 0xffff, 0x20a1, 0x020b, 0x1078, 0x69d0, 0x7910, 0x2168,
++	0x6948, 0x7922, 0x21a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x694c,
++	0xa184, 0x000f, 0x00c0, 0x6980, 0x2001, 0x0005, 0x0078, 0x698a,
++	0xd184, 0x0040, 0x6987, 0x2001, 0x0004, 0x0078, 0x698a, 0xa084,
++	0x0006, 0x8004, 0x017e, 0x2008, 0x7830, 0xa084, 0x00ff, 0x8007,
++	0xa105, 0x017f, 0x20a2, 0xd1ac, 0x0040, 0x699a, 0x20a3, 0x0002,
++	0x0078, 0x69a6, 0xd1b4, 0x0040, 0x69a1, 0x20a3, 0x0001, 0x0078,
++	0x69a6, 0x20a3, 0x0000, 0x2230, 0x0078, 0x69a8, 0x6a80, 0x6e7c,
++	0x20a9, 0x0008, 0xad80, 0x0017, 0x200c, 0x810f, 0x21a2, 0x8000,
++	0x00f0, 0x69ac, 0x22a2, 0x26a2, 0x60c3, 0x0020, 0x20e1, 0x9080,
++	0x6014, 0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x2001, 0xa8cd,
++	0x2003, 0x07d0, 0x2001, 0xa8cc, 0x2003, 0x0009, 0x2001, 0xa8d2,
++	0x2003, 0x0002, 0x1078, 0x158c, 0x147f, 0x157f, 0x0d7f, 0x007c,
++	0x20e1, 0x9080, 0x20e1, 0x4000, 0x7a18, 0xa280, 0x0023, 0x2014,
++	0x8210, 0xa294, 0x00ff, 0x2202, 0x8217, 0x7818, 0xa080, 0x0028,
++	0x2004, 0xd0bc, 0x0040, 0x69f6, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c,
++	0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b,
++	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6a05, 0x0d7e, 0xa0e8,
++	0xa735, 0x2d6c, 0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2,
++	0x0d7f, 0x20a3, 0x0000, 0x6130, 0x21a2, 0x20a3, 0x0829, 0x20a3,
++	0x0000, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e,
++	0x20a1, 0x020b, 0x1078, 0x6a34, 0x7810, 0x2068, 0x6860, 0x20a2,
++	0x685c, 0x20a2, 0x6880, 0x20a2, 0x687c, 0x20a2, 0xa006, 0x20a2,
++	0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x000c, 0x1078, 0x6dfb, 0x147f,
++	0x137f, 0x157f, 0x0d7f, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1,
++	0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x6a52,
++	0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2,
++	0x6814, 0x20a2, 0x2069, 0xa61b, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
++	0x0078, 0x6a61, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085,
++	0x0500, 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230,
++	0x22a2, 0x20a3, 0x0889, 0x20a3, 0x0000, 0x1078, 0x6dea, 0x22a2,
++	0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x027f, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x7810,
++	0xa0ec, 0xf000, 0x0040, 0x6a8b, 0xa06d, 0x1078, 0x495f, 0x0040,
++	0x6a8b, 0x684c, 0xa084, 0x2020, 0xa086, 0x2020, 0x00c0, 0x6a8b,
++	0x7824, 0xc0cd, 0x7826, 0x20a1, 0x020b, 0x1078, 0x6be0, 0xa016,
++	0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x7810, 0xa084, 0xf000,
++	0x00c0, 0x6aa2, 0x7810, 0xa084, 0x0700, 0x8007, 0x1079, 0x6aaa,
++	0x0078, 0x6aa5, 0xa006, 0x1079, 0x6aaa, 0x147f, 0x137f, 0x157f,
++	0x0d7f, 0x007c, 0x6ab4, 0x6b4c, 0x6b57, 0x6b81, 0x6b95, 0x6bb1,
++	0x6bbc, 0x6ab2, 0x1078, 0x1332, 0x017e, 0x037e, 0x694c, 0xa18c,
++	0x0003, 0x0040, 0x6abf, 0xa186, 0x0003, 0x00c0, 0x6ace, 0x6b78,
++	0x7824, 0xd0cc, 0x0040, 0x6ac5, 0xc3e5, 0x23a2, 0x6868, 0x20a2,
++	0x6864, 0x20a2, 0x037f, 0x017f, 0x0078, 0x6b8c, 0xa186, 0x0001,
++	0x10c0, 0x1332, 0x6b78, 0x7824, 0xd0cc, 0x0040, 0x6ad8, 0xc3e5,
++	0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x22a2, 0x6874, 0x20a2,
++	0x22a2, 0x687c, 0x20a2, 0x2009, 0x0018, 0xa384, 0x0300, 0x0040,
++	0x6b46, 0xd3c4, 0x0040, 0x6aee, 0x687c, 0xa108, 0xd3cc, 0x0040,
++	0x6af3, 0x6874, 0xa108, 0x157e, 0x20a9, 0x000d, 0xad80, 0x0020,
++	0x201c, 0x831f, 0x23a2, 0x8000, 0x00f0, 0x6af8, 0x157f, 0x22a2,
++	0x22a2, 0x22a2, 0xa184, 0x0003, 0x0040, 0x6b46, 0x20a1, 0x020b,
++	0x20e1, 0x9080, 0x20e1, 0x4000, 0x007e, 0x7818, 0xa080, 0x0028,
++	0x2004, 0xd0bc, 0x0040, 0x6b26, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c,
++	0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b,
++	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6b35, 0x0d7e, 0xa0e8,
++	0xa735, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2,
++	0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x007f, 0x7b24, 0xd3cc,
++	0x0040, 0x6b3e, 0x20a3, 0x0889, 0x0078, 0x6b40, 0x20a3, 0x0898,
++	0x20a2, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, 0x61c2, 0x037f,
++	0x017f, 0x1078, 0x6dfb, 0x007c, 0x2011, 0x0008, 0x7824, 0xd0cc,
++	0x0040, 0x6b53, 0xc2e5, 0x22a2, 0xa016, 0x0078, 0x6b8a, 0x2011,
++	0x0302, 0x7824, 0xd0cc, 0x0040, 0x6b5e, 0xc2e5, 0x22a2, 0xa016,
++	0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0012, 0x22a2, 0x20a3, 0x0008,
++	0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x7000, 0x20a3, 0x0500,
++	0x22a2, 0x20a3, 0x000a, 0x22a2, 0x22a2, 0x20a3, 0x2500, 0x22a2,
++	0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0032, 0x1078, 0x6dfb,
++	0x007c, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x0040, 0x6b88, 0xc2e5,
++	0x22a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2,
++	0x60c3, 0x0018, 0x1078, 0x6dfb, 0x007c, 0x2011, 0x0100, 0x7824,
++	0xd0cc, 0x0040, 0x6b9c, 0xc2e5, 0x22a2, 0xa016, 0x22a2, 0x22a2,
++	0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0008, 0x22a2, 0x7834, 0xa084,
++	0x00ff, 0x20a2, 0x22a2, 0x22a2, 0x60c3, 0x0020, 0x1078, 0x6dfb,
++	0x007c, 0x2011, 0x0008, 0x7824, 0xd0cc, 0x0040, 0x6bb8, 0xc2e5,
++	0x22a2, 0xa016, 0x0078, 0x6b8a, 0x037e, 0x7b10, 0xa384, 0xff00,
++	0x7812, 0xa384, 0x00ff, 0x8001, 0x00c0, 0x6bcf, 0x7824, 0xd0cc,
++	0x0040, 0x6bcb, 0xc2e5, 0x22a2, 0x037f, 0x0078, 0x6b8a, 0x047e,
++	0x2021, 0x0800, 0x007e, 0x7824, 0xd0cc, 0x007f, 0x0040, 0x6bd9,
++	0xc4e5, 0x24a2, 0x047f, 0x22a2, 0x20a2, 0x037f, 0x0078, 0x6b8c,
++	0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++	0x2004, 0xd0bc, 0x0040, 0x6bfe, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c,
++	0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b,
++	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6c0d, 0x0d7e, 0xa0e8,
++	0xa735, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2,
++	0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x7824, 0xd0cc, 0x0040,
++	0x6c15, 0x20a3, 0x0889, 0x0078, 0x6c17, 0x20a3, 0x0898, 0x20a3,
++	0x0000, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2,
++	0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x0d7e,
++	0x157e, 0x137e, 0x147e, 0x017e, 0x037e, 0x7810, 0xa084, 0x0700,
++	0x8007, 0x1079, 0x6c3a, 0x037f, 0x017f, 0x147f, 0x137f, 0x157f,
++	0x0d7f, 0x007c, 0x6c42, 0x6c42, 0x6c44, 0x6c42, 0x6c42, 0x6c42,
++	0x6c69, 0x6c42, 0x1078, 0x1332, 0x7910, 0xa18c, 0xf8ff, 0xa18d,
++	0x0600, 0x7912, 0x20a1, 0x020b, 0x2009, 0x0003, 0x1078, 0x6c73,
++	0x0d7e, 0x2069, 0xa652, 0x6804, 0xd0bc, 0x0040, 0x6c5e, 0x682c,
++	0xa084, 0x00ff, 0x8007, 0x20a2, 0x0078, 0x6c60, 0x20a3, 0x3f00,
++	0x0d7f, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0001, 0x1078, 0x6dfb,
++	0x007c, 0x20a1, 0x020b, 0x2009, 0x0003, 0x1078, 0x6c73, 0x20a3,
++	0x7f00, 0x0078, 0x6c61, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000,
++	0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x6c91, 0x0d7e,
++	0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2, 0x6814,
++	0x20a2, 0x2069, 0xa61b, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078,
++	0x6ca0, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085, 0x0100,
++	0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2,
++	0x20a3, 0x0888, 0xa18d, 0x0008, 0x21a2, 0x1078, 0x6dea, 0x22a2,
++	0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x027f, 0x007c, 0x0e7e, 0x0d7e, 0x0c7e, 0x057e, 0x047e,
++	0x037e, 0x2061, 0x0100, 0x2071, 0xa600, 0x6130, 0x7818, 0x2068,
++	0x68a0, 0x2028, 0xd0bc, 0x00c0, 0x6cca, 0x6910, 0x6a14, 0x6430,
++	0x0078, 0x6cce, 0x6910, 0x6a14, 0x736c, 0x7470, 0x781c, 0xa086,
++	0x0006, 0x0040, 0x6d2d, 0xd5bc, 0x0040, 0x6cde, 0xa185, 0x0100,
++	0x6062, 0x6266, 0x636a, 0x646e, 0x0078, 0x6ce5, 0xa185, 0x0100,
++	0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x6073, 0x0809, 0x6077,
++	0x0008, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a,
++	0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, 0x7810, 0x2070,
++	0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008, 0x60ca,
++	0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000,
++	0xa582, 0x0080, 0x0048, 0x6d17, 0x6a00, 0xd2f4, 0x0040, 0x6d15,
++	0x6a14, 0xa294, 0x00ff, 0x0078, 0x6d17, 0x2011, 0x0000, 0x629e,
++	0x6017, 0x0016, 0x2009, 0x07d0, 0x60c4, 0xa084, 0xfff0, 0xa005,
++	0x0040, 0x6d24, 0x2009, 0x1b58, 0x1078, 0x5ad0, 0x037f, 0x047f,
++	0x057f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0x7810, 0x2070, 0x704c,
++	0xa084, 0x0003, 0xa086, 0x0002, 0x0040, 0x6d85, 0xd5bc, 0x0040,
++	0x6d41, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e, 0x0078,
++	0x6d48, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e,
++	0x6073, 0x0880, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084, 0x00ff,
++	0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808,
++	0x6082, 0x7060, 0x608a, 0x705c, 0x608e, 0x7080, 0x60c6, 0x707c,
++	0x60ca, 0x707c, 0x792c, 0xa108, 0x792e, 0x7080, 0x7928, 0xa109,
++	0x792a, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7,
++	0x0000, 0xa582, 0x0080, 0x0048, 0x6d80, 0x6a00, 0xd2f4, 0x0040,
++	0x6d7e, 0x6a14, 0xa294, 0x00ff, 0x0078, 0x6d80, 0x2011, 0x0000,
++	0x629e, 0x6017, 0x0012, 0x0078, 0x6d1a, 0xd5bc, 0x0040, 0x6d90,
++	0xa185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, 0x0078, 0x6d97,
++	0xa185, 0x0700, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x1078,
++	0x495f, 0x0040, 0x6dad, 0x0d7e, 0x7810, 0xa06d, 0x684c, 0x0d7f,
++	0xa084, 0x2020, 0xa086, 0x2020, 0x00c0, 0x6dad, 0x7824, 0xc0cd,
++	0x7826, 0x6073, 0x0889, 0x0078, 0x6daf, 0x6073, 0x0898, 0x6077,
++	0x0000, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a,
++	0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, 0x6082, 0x7014, 0x608a,
++	0x7010, 0x608e, 0x700c, 0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce,
++	0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080,
++	0x0048, 0x6ddd, 0x6a00, 0xd2f4, 0x0040, 0x6ddb, 0x6a14, 0xa294,
++	0x00ff, 0x0078, 0x6ddd, 0x2011, 0x0000, 0x629e, 0x7824, 0xd0cc,
++	0x0040, 0x6de6, 0x6017, 0x0016, 0x0078, 0x6d1a, 0x6017, 0x0012,
++	0x0078, 0x6d1a, 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294,
++	0x00ff, 0x2202, 0x8217, 0x007c, 0x0d7e, 0x2069, 0xa8b1, 0x6843,
++	0x0001, 0x0d7f, 0x007c, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7,
++	0x9575, 0x1078, 0x6e06, 0x1078, 0x5ac0, 0x007c, 0x007e, 0x6014,
++	0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x007f, 0x007c, 0x007e,
++	0x0c7e, 0x2061, 0x0100, 0x6014, 0xa084, 0x0004, 0xa085, 0x0008,
++	0x6016, 0x0c7f, 0x007f, 0x007c, 0x0c7e, 0x0d7e, 0x017e, 0x027e,
++	0x2061, 0x0100, 0x2069, 0x0140, 0x6904, 0xa194, 0x4000, 0x0040,
++	0x6e59, 0x1078, 0x6e0f, 0x6803, 0x1000, 0x6803, 0x0000, 0x0c7e,
++	0x2061, 0xa8b1, 0x6128, 0xa192, 0x00c8, 0x00c8, 0x6e44, 0x8108,
++	0x612a, 0x6124, 0x0c7f, 0x81ff, 0x0040, 0x6e54, 0x1078, 0x5ac0,
++	0x1078, 0x6e06, 0x0078, 0x6e54, 0x6124, 0xa1e5, 0x0000, 0x0040,
++	0x6e51, 0x1078, 0xa5c4, 0x1078, 0x5acb, 0x2009, 0x0014, 0x1078,
++	0x775c, 0x0c7f, 0x0078, 0x6e54, 0x027f, 0x017f, 0x0d7f, 0x0c7f,
++	0x007c, 0x2001, 0xa8cd, 0x2004, 0xa005, 0x00c0, 0x6e54, 0x0c7e,
++	0x2061, 0xa8b1, 0x6128, 0xa192, 0x0003, 0x00c8, 0x6e44, 0x8108,
++	0x612a, 0x0c7f, 0x1078, 0x5ac0, 0x1078, 0x4224, 0x0078, 0x6e54,
++	0x0c7e, 0x0d7e, 0x0e7e, 0x017e, 0x027e, 0x1078, 0x5ad8, 0x2071,
++	0xa8b1, 0x713c, 0x81ff, 0x0040, 0x6e9a, 0x2061, 0x0100, 0x2069,
++	0x0140, 0x6904, 0xa194, 0x4000, 0x0040, 0x6ea0, 0x6803, 0x1000,
++	0x6803, 0x0000, 0x037e, 0x2019, 0x0001, 0x1078, 0x7058, 0x037f,
++	0x713c, 0x2160, 0x1078, 0xa5c4, 0x2009, 0x004a, 0x1078, 0x775c,
++	0x0078, 0x6e9a, 0x027f, 0x017f, 0x0e7f, 0x0d7f, 0x0c7f, 0x007c,
++	0x0078, 0x6e8a, 0x0e7e, 0x2071, 0xa8b1, 0x7048, 0xd084, 0x0040,
++	0x6ebc, 0x713c, 0x81ff, 0x0040, 0x6ebc, 0x2071, 0x0100, 0xa188,
++	0x0007, 0x210c, 0xa18e, 0x0006, 0x00c0, 0x6eba, 0x7017, 0x0012,
++	0x0078, 0x6ebc, 0x7017, 0x0016, 0x0e7f, 0x007c, 0x0e7e, 0x0d7e,
++	0x0c7e, 0x067e, 0x057e, 0x047e, 0x007e, 0x127e, 0x2091, 0x8000,
++	0x6018, 0x2068, 0x6ca0, 0x2071, 0xa8b1, 0x7018, 0x2068, 0x8dff,
++	0x0040, 0x6ee6, 0x68a0, 0xa406, 0x0040, 0x6eda, 0x6854, 0x2068,
++	0x0078, 0x6ecf, 0x6010, 0x2060, 0x643c, 0x6540, 0x6648, 0x2d60,
++	0x1078, 0x4736, 0x0040, 0x6ee6, 0xa085, 0x0001, 0x127f, 0x007f,
++	0x047f, 0x057f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0x20a1,
++	0x020b, 0x1078, 0x6731, 0x20a3, 0x1200, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x781c, 0xa086, 0x0004, 0x00c0, 0x6f01, 0x6098, 0x0078,
++	0x6f02, 0x6030, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a9,
++	0x0010, 0xa006, 0x20a2, 0x00f0, 0x6f0a, 0x20a2, 0x20a2, 0x60c3,
++	0x002c, 0x1078, 0x6dfb, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b,
++	0x1078, 0x6731, 0x20a3, 0x0f00, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x7808, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x147f, 0x157f,
++	0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3,
++	0x0200, 0x20a3, 0x0000, 0x20a9, 0x0006, 0x2011, 0xa640, 0x2019,
++	0xa641, 0x23a6, 0x22a6, 0xa398, 0x0002, 0xa290, 0x0002, 0x00f0,
++	0x6f39, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x1078,
++	0x6dfb, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x017e, 0x027e,
++	0x20a1, 0x020b, 0x1078, 0x6799, 0x1078, 0x67b0, 0x7810, 0xa080,
++	0x0000, 0x2004, 0xa080, 0x0015, 0x2098, 0x7808, 0xa088, 0x0002,
++	0x21a8, 0x53a6, 0xa080, 0x0004, 0x8003, 0x60c2, 0x1078, 0x6dfb,
++	0x027f, 0x017f, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x20a1,
++	0x020b, 0x1078, 0x6731, 0x20a3, 0x6200, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x147f,
++	0x157f, 0x007c, 0x157e, 0x147e, 0x017e, 0x027e, 0x20a1, 0x020b,
++	0x1078, 0x6731, 0x7810, 0xa080, 0x0000, 0x2004, 0xa080, 0x0017,
++	0x2098, 0x7808, 0xa088, 0x0002, 0x21a8, 0x53a6, 0x8003, 0x60c2,
++	0x1078, 0x6dfb, 0x027f, 0x017f, 0x147f, 0x157f, 0x007c, 0x0e7e,
++	0x0c7e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa8b1, 0x700c,
++	0x2060, 0x8cff, 0x0040, 0x6fbb, 0x1078, 0x8f00, 0x00c0, 0x6fb2,
++	0x1078, 0x7c83, 0x600c, 0x007e, 0x1078, 0x772d, 0x1078, 0x7233,
++	0x0c7f, 0x0078, 0x6fa9, 0x700f, 0x0000, 0x700b, 0x0000, 0x127f,
++	0x007f, 0x0c7f, 0x0e7f, 0x007c, 0x127e, 0x157e, 0x0f7e, 0x0e7e,
++	0x0d7e, 0x0c7e, 0x027e, 0x017e, 0x007e, 0x2091, 0x8000, 0x2069,
++	0x0100, 0x2079, 0x0140, 0x2071, 0xa8b1, 0x7024, 0x2060, 0x8cff,
++	0x0040, 0x7014, 0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x5acb,
++	0x2009, 0x0013, 0x1078, 0x775c, 0x20a9, 0x01f4, 0x6824, 0xd094,
++	0x0040, 0x6ff7, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x0040,
++	0x7009, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0x7009, 0xd084,
++	0x0040, 0x6ffe, 0x6827, 0x0001, 0x0078, 0x7000, 0x00f0, 0x6fe6,
++	0x7804, 0xa084, 0x1000, 0x0040, 0x7009, 0x7803, 0x0100, 0x7803,
++	0x0000, 0x6824, 0x007f, 0x017f, 0x027f, 0x0c7f, 0x0d7f, 0x0e7f,
++	0x0f7f, 0x157f, 0x127f, 0x007c, 0x2001, 0xa600, 0x2004, 0xa096,
++	0x0001, 0x0040, 0x704e, 0xa096, 0x0004, 0x0040, 0x704e, 0x1078,
++	0x5acb, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x41dc, 0x1078,
++	0x5a45, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0040, 0x703c, 0x6827,
++	0x0004, 0x7804, 0xa084, 0x4000, 0x0040, 0x704e, 0x7803, 0x1000,
++	0x7803, 0x0000, 0x0078, 0x704e, 0xd084, 0x0040, 0x7043, 0x6827,
++	0x0001, 0x0078, 0x7045, 0x00f0, 0x702b, 0x7804, 0xa084, 0x1000,
++	0x0040, 0x704e, 0x7803, 0x0100, 0x7803, 0x0000, 0x007f, 0x017f,
++	0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c,
++	0x127e, 0x157e, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x027e, 0x017e,
++	0x007e, 0x2091, 0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071,
++	0xa8b1, 0x703c, 0x2060, 0x8cff, 0x0040, 0x70d6, 0x68af, 0x95f5,
++	0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, 0x00c0, 0x7074, 0x68c7,
++	0x0000, 0x68cb, 0x0008, 0x1078, 0x5ad8, 0x1078, 0x1f7e, 0x047e,
++	0x057e, 0x2009, 0x017f, 0x212c, 0x200b, 0x00a5, 0x2021, 0x0169,
++	0x2404, 0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x70a5, 0x68c7,
++	0x0000, 0x68cb, 0x0008, 0x0e7e, 0x0f7e, 0x2079, 0x0020, 0x2071,
++	0xa908, 0x6814, 0xa084, 0x0004, 0xa085, 0x0012, 0x6816, 0x7803,
++	0x0008, 0x7003, 0x0000, 0x0f7f, 0x0e7f, 0x250a, 0x057f, 0x047f,
++	0xa39d, 0x0000, 0x00c0, 0x70b0, 0x2009, 0x0049, 0x1078, 0x775c,
++	0x20a9, 0x03e8, 0x6824, 0xd094, 0x0040, 0x70c3, 0x6827, 0x0004,
++	0x7804, 0xa084, 0x4000, 0x0040, 0x70d5, 0x7803, 0x1000, 0x7803,
++	0x0000, 0x0078, 0x70d5, 0xd08c, 0x0040, 0x70ca, 0x6827, 0x0002,
++	0x0078, 0x70cc, 0x00f0, 0x70b2, 0x7804, 0xa084, 0x1000, 0x0040,
++	0x70d5, 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, 0x007f, 0x017f,
++	0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c,
++	0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0xa8b1, 0x6a06, 0x127f,
++	0x0d7f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0xa8b1,
++	0x6a32, 0x127f, 0x0d7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e,
++	0x007e, 0x127e, 0x2071, 0xa8b1, 0x7614, 0x2660, 0x2678, 0x2091,
++	0x8000, 0x8cff, 0x0040, 0x7134, 0x601c, 0xa206, 0x00c0, 0x712f,
++	0x7014, 0xac36, 0x00c0, 0x710e, 0x660c, 0x7616, 0x7010, 0xac36,
++	0x00c0, 0x711c, 0x2c00, 0xaf36, 0x0040, 0x711a, 0x2f00, 0x7012,
++	0x0078, 0x711c, 0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06,
++	0x0040, 0x7125, 0x7e0e, 0x0078, 0x7126, 0x2678, 0x600f, 0x0000,
++	0x1078, 0x8ec6, 0x1078, 0x7233, 0x0c7f, 0x0078, 0x7101, 0x2c78,
++	0x600c, 0x2060, 0x0078, 0x7101, 0x127f, 0x007f, 0x067f, 0x0c7f,
++	0x0e7f, 0x0f7f, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078,
++	0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2,
++	0x20a3, 0x1000, 0x0078, 0x718e, 0x157e, 0x147e, 0x20a1, 0x020b,
++	0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2,
++	0x20a2, 0x20a3, 0x4000, 0x0078, 0x718e, 0x157e, 0x147e, 0x20a1,
++	0x020b, 0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2,
++	0x20a2, 0x20a2, 0x20a3, 0x2000, 0x0078, 0x718e, 0x157e, 0x147e,
++	0x20a1, 0x020b, 0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2,
++	0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078, 0x718e, 0x157e,
++	0x147e, 0x20a1, 0x020b, 0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006,
++	0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, 0x1078, 0x723e,
++	0x60c3, 0x0020, 0x1078, 0x6dfb, 0x147f, 0x157f, 0x007c, 0x127e,
++	0x0c7e, 0x2091, 0x8000, 0x2061, 0x0100, 0x6120, 0xd1b4, 0x00c0,
++	0x71a6, 0xd1bc, 0x00c0, 0x71f0, 0x0078, 0x7230, 0x2009, 0x017f,
++	0x200b, 0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069, 0x0140, 0x20a9,
++	0x001e, 0x2009, 0x0169, 0x6804, 0xa084, 0x4000, 0x0040, 0x71e7,
++	0x6020, 0xd0b4, 0x0040, 0x71e7, 0x6024, 0xd094, 0x00c0, 0x71e7,
++	0x2104, 0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x71e7, 0x00f0,
++	0x71b3, 0x027e, 0x6198, 0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c,
++	0x00ff, 0xa10d, 0x6088, 0x628c, 0x618e, 0x608b, 0xbc91, 0x6043,
++	0x0001, 0x6043, 0x0000, 0x608a, 0x628e, 0x6024, 0xd094, 0x00c0,
++	0x71e6, 0x6a04, 0xa294, 0x4000, 0x00c0, 0x71dd, 0x027f, 0x0d7f,
++	0x007f, 0x157f, 0x2009, 0x017f, 0x200b, 0x0000, 0x0078, 0x7230,
++	0x2009, 0x017f, 0x200b, 0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069,
++	0x0140, 0x20a9, 0x001e, 0x2009, 0x0169, 0x6804, 0xa084, 0x4000,
++	0x0040, 0x7229, 0x6020, 0xd0bc, 0x0040, 0x7229, 0x2104, 0xa084,
++	0x000f, 0xa086, 0x0004, 0x00c0, 0x7229, 0x00f0, 0x71fd, 0x027e,
++	0x6164, 0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, 0x00ff, 0xa10d,
++	0x6088, 0x628c, 0x608b, 0xbc91, 0x618e, 0x6043, 0x0001, 0x6043,
++	0x0000, 0x608a, 0x628e, 0x6a04, 0xa294, 0x4000, 0x00c0, 0x7223,
++	0x027f, 0x0d7f, 0x007f, 0x157f, 0x2009, 0x017f, 0x200b, 0x0000,
++	0x0c7f, 0x127f, 0x007c, 0x0e7e, 0x2071, 0xa8b1, 0x7020, 0xa005,
++	0x0040, 0x723c, 0x8001, 0x7022, 0x0e7f, 0x007c, 0x20a9, 0x0008,
++	0x20a2, 0x00f0, 0x7240, 0x20a2, 0x20a2, 0x007c, 0x0f7e, 0x0e7e,
++	0x0d7e, 0x0c7e, 0x077e, 0x067e, 0x007e, 0x127e, 0x2091, 0x8000,
++	0x2071, 0xa8b1, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff,
++	0x0040, 0x72e2, 0x8cff, 0x0040, 0x72e2, 0x601c, 0xa086, 0x0006,
++	0x00c0, 0x72dd, 0x88ff, 0x0040, 0x726d, 0x2800, 0xac06, 0x00c0,
++	0x72dd, 0x2039, 0x0000, 0x0078, 0x7278, 0x6018, 0xa206, 0x00c0,
++	0x72dd, 0x85ff, 0x0040, 0x7278, 0x6020, 0xa106, 0x00c0, 0x72dd,
++	0x7024, 0xac06, 0x00c0, 0x72a8, 0x2069, 0x0100, 0x68c0, 0xa005,
++	0x0040, 0x72a3, 0x1078, 0x5acb, 0x6817, 0x0008, 0x68c3, 0x0000,
++	0x1078, 0x7378, 0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04,
++	0xa384, 0x1000, 0x0040, 0x7298, 0x6803, 0x0100, 0x6803, 0x0000,
++	0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x72a0, 0x6827, 0x0001,
++	0x037f, 0x0078, 0x72a8, 0x6003, 0x0009, 0x630a, 0x0078, 0x72dd,
++	0x7014, 0xac36, 0x00c0, 0x72ae, 0x660c, 0x7616, 0x7010, 0xac36,
++	0x00c0, 0x72bc, 0x2c00, 0xaf36, 0x0040, 0x72ba, 0x2f00, 0x7012,
++	0x0078, 0x72bc, 0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06,
++	0x0040, 0x72c5, 0x7e0e, 0x0078, 0x72c6, 0x2678, 0x89ff, 0x00c0,
++	0x72d5, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040,
++	0x72d3, 0x1078, 0xa1ca, 0x1078, 0x8ec6, 0x1078, 0x7233, 0x88ff,
++	0x00c0, 0x72ec, 0x0c7f, 0x0078, 0x7257, 0x2c78, 0x600c, 0x2060,
++	0x0078, 0x7257, 0xa006, 0x127f, 0x007f, 0x067f, 0x077f, 0x0c7f,
++	0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x6017, 0x0000, 0x0c7f, 0xa8c5,
++	0x0001, 0x0078, 0x72e3, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e,
++	0x027e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa8b1, 0x7638,
++	0x2660, 0x2678, 0x8cff, 0x0040, 0x7367, 0x601c, 0xa086, 0x0006,
++	0x00c0, 0x7362, 0x87ff, 0x0040, 0x7313, 0x2700, 0xac06, 0x00c0,
++	0x7362, 0x0078, 0x731e, 0x6018, 0xa206, 0x00c0, 0x7362, 0x85ff,
++	0x0040, 0x731e, 0x6020, 0xa106, 0x00c0, 0x7362, 0x703c, 0xac06,
++	0x00c0, 0x7332, 0x037e, 0x2019, 0x0001, 0x1078, 0x7058, 0x7033,
++	0x0000, 0x703f, 0x0000, 0x7043, 0x0000, 0x7047, 0x0000, 0x704b,
++	0x0000, 0x037f, 0x7038, 0xac36, 0x00c0, 0x7338, 0x660c, 0x763a,
++	0x7034, 0xac36, 0x00c0, 0x7346, 0x2c00, 0xaf36, 0x0040, 0x7344,
++	0x2f00, 0x7036, 0x0078, 0x7346, 0x7037, 0x0000, 0x660c, 0x067e,
++	0x2c00, 0xaf06, 0x0040, 0x734f, 0x7e0e, 0x0078, 0x7350, 0x2678,
++	0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x735a,
++	0x1078, 0xa1ca, 0x1078, 0x8ec6, 0x87ff, 0x00c0, 0x7371, 0x0c7f,
++	0x0078, 0x7302, 0x2c78, 0x600c, 0x2060, 0x0078, 0x7302, 0xa006,
++	0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f,
++	0x007c, 0x6017, 0x0000, 0x0c7f, 0xa7bd, 0x0001, 0x0078, 0x7368,
++	0x0e7e, 0x2071, 0xa8b1, 0x2001, 0xa600, 0x2004, 0xa086, 0x0002,
++	0x00c0, 0x7386, 0x7007, 0x0005, 0x0078, 0x7388, 0x7007, 0x0000,
++	0x0e7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e, 0x027e, 0x007e,
++	0x127e, 0x2091, 0x8000, 0x2071, 0xa8b1, 0x2c10, 0x7638, 0x2660,
++	0x2678, 0x8cff, 0x0040, 0x73c8, 0x2200, 0xac06, 0x00c0, 0x73c3,
++	0x7038, 0xac36, 0x00c0, 0x73a6, 0x660c, 0x763a, 0x7034, 0xac36,
++	0x00c0, 0x73b4, 0x2c00, 0xaf36, 0x0040, 0x73b2, 0x2f00, 0x7036,
++	0x0078, 0x73b4, 0x7037, 0x0000, 0x660c, 0x2c00, 0xaf06, 0x0040,
++	0x73bc, 0x7e0e, 0x0078, 0x73bd, 0x2678, 0x600f, 0x0000, 0xa085,
++	0x0001, 0x0078, 0x73c8, 0x2c78, 0x600c, 0x2060, 0x0078, 0x7399,
++	0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c,
++	0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x007e, 0x127e, 0x2091,
++	0x8000, 0x2071, 0xa8b1, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0040,
++	0x7469, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x00c0, 0x7464,
++	0x7024, 0xac06, 0x00c0, 0x740f, 0x2069, 0x0100, 0x68c0, 0xa005,
++	0x0040, 0x743d, 0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378,
++	0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000,
++	0x0040, 0x7406, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
++	0x6824, 0xd084, 0x0040, 0x740e, 0x6827, 0x0001, 0x037f, 0x700c,
++	0xac36, 0x00c0, 0x7415, 0x660c, 0x760e, 0x7008, 0xac36, 0x00c0,
++	0x7423, 0x2c00, 0xaf36, 0x0040, 0x7421, 0x2f00, 0x700a, 0x0078,
++	0x7423, 0x700b, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040,
++	0x742c, 0x7e0e, 0x0078, 0x742d, 0x2678, 0x600f, 0x0000, 0x1078,
++	0x8eec, 0x00c0, 0x7441, 0x1078, 0x28a6, 0x1078, 0x8f00, 0x00c0,
++	0x745d, 0x1078, 0x7c83, 0x0078, 0x745d, 0x1078, 0x7378, 0x0078,
++	0x740f, 0x1078, 0x8f00, 0x00c0, 0x7449, 0x1078, 0x7c83, 0x0078,
++	0x745d, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x745d, 0x601c,
++	0xa086, 0x0003, 0x00c0, 0x7471, 0x6837, 0x0103, 0x6b4a, 0x6847,
++	0x0000, 0x1078, 0x4a73, 0x1078, 0x8eb9, 0x1078, 0x8ec6, 0x1078,
++	0x7233, 0x0c7f, 0x0078, 0x73de, 0x2c78, 0x600c, 0x2060, 0x0078,
++	0x73de, 0x127f, 0x007f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f,
++	0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x745d, 0x1078, 0xa1ca,
++	0x0078, 0x745d, 0x037e, 0x157e, 0x137e, 0x147e, 0x3908, 0xa006,
++	0xa190, 0x0020, 0x221c, 0xa39e, 0x2676, 0x00c0, 0x748b, 0x8210,
++	0x8000, 0x0078, 0x7482, 0xa005, 0x0040, 0x7497, 0x20a9, 0x0020,
++	0x2198, 0x8211, 0xa282, 0x0020, 0x20c8, 0x20a0, 0x53a3, 0x147f,
++	0x137f, 0x157f, 0x037f, 0x007c, 0x0d7e, 0x20a1, 0x020b, 0x1078,
++	0x67c2, 0x20a3, 0x0200, 0x20a3, 0x0014, 0x60c3, 0x0014, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x2099, 0xa8a5, 0x20a9, 0x0004, 0x53a6,
++	0x20a3, 0x0004, 0x20a3, 0x7878, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x1078, 0x6dfb, 0x0d7f, 0x007c, 0x20a1, 0x020b, 0x1078, 0x67c2,
++	0x20a3, 0x0214, 0x20a3, 0x0018, 0x20a3, 0x0800, 0x7810, 0xa084,
++	0xff00, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x7810, 0xa084, 0x00ff, 0x20a2, 0x7828, 0x20a2,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0018, 0x1078, 0x6dfb,
++	0x007c, 0x0d7e, 0x017e, 0x2f68, 0x2009, 0x0035, 0x1078, 0x91bc,
++	0x00c0, 0x7551, 0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x1300,
++	0x20a3, 0x0000, 0x7828, 0x2068, 0x681c, 0xa086, 0x0003, 0x0040,
++	0x752d, 0x7818, 0xa080, 0x0028, 0x2014, 0xa286, 0x007e, 0x00c0,
++	0x7507, 0x20a3, 0x00ff, 0x20a3, 0xfffe, 0x0078, 0x7542, 0xa286,
++	0x007f, 0x00c0, 0x7511, 0x20a3, 0x00ff, 0x20a3, 0xfffd, 0x0078,
++	0x7542, 0xd2bc, 0x0040, 0x7527, 0xa286, 0x0080, 0x00c0, 0x751e,
++	0x20a3, 0x00ff, 0x20a3, 0xfffc, 0x0078, 0x7542, 0xa2e8, 0xa735,
++	0x2d6c, 0x6810, 0x20a2, 0x6814, 0x20a2, 0x0078, 0x7542, 0x20a3,
++	0x0000, 0x6098, 0x20a2, 0x0078, 0x7542, 0x7818, 0xa080, 0x0028,
++	0x2004, 0xa082, 0x007e, 0x0048, 0x753e, 0x0d7e, 0x2069, 0xa61b,
++	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x7542, 0x20a3, 0x0000,
++	0x6030, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x60c3, 0x000c, 0x1078, 0x6dfb, 0x017f, 0x0d7f,
++	0x007c, 0x7817, 0x0001, 0x7803, 0x0006, 0x017f, 0x0d7f, 0x007c,
++	0x0d7e, 0x027e, 0x7928, 0x2168, 0x691c, 0xa186, 0x0006, 0x0040,
++	0x757a, 0xa186, 0x0003, 0x0040, 0x75d5, 0xa186, 0x0005, 0x0040,
++	0x75b8, 0xa186, 0x0004, 0x0040, 0x75a8, 0xa186, 0x0008, 0x0040,
++	0x75c2, 0x7807, 0x0037, 0x7813, 0x1700, 0x1078, 0x7640, 0x027f,
++	0x0d7f, 0x007c, 0x1078, 0x75fd, 0x2009, 0x4000, 0x6800, 0x0079,
++	0x7581, 0x7594, 0x75a2, 0x7596, 0x75a2, 0x759d, 0x7594, 0x7594,
++	0x75a2, 0x75a2, 0x75a2, 0x75a2, 0x7594, 0x7594, 0x7594, 0x7594,
++	0x7594, 0x75a2, 0x7594, 0x75a2, 0x1078, 0x1332, 0x6824, 0xd0e4,
++	0x0040, 0x759d, 0xd0cc, 0x0040, 0x75a0, 0xa00e, 0x0078, 0x75a2,
++	0x2009, 0x2000, 0x6828, 0x20a2, 0x682c, 0x20a2, 0x0078, 0x75f3,
++	0x1078, 0x75fd, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, 0x4000,
++	0x6a00, 0xa286, 0x0002, 0x00c0, 0x75b6, 0xa00e, 0x0078, 0x75f3,
++	0x1078, 0x75fd, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, 0x4000,
++	0x0078, 0x75f3, 0x1078, 0x75fd, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x2009, 0x4000, 0xa286, 0x0005, 0x0040, 0x75d2, 0xa286, 0x0002,
++	0x00c0, 0x75d3, 0xa00e, 0x0078, 0x75f3, 0x1078, 0x75fd, 0x6810,
++	0x2068, 0x697c, 0x6810, 0xa112, 0x6980, 0x6814, 0xa103, 0x20a2,
++	0x22a2, 0x7928, 0xa180, 0x0000, 0x2004, 0xa08e, 0x0002, 0x0040,
++	0x75f1, 0xa08e, 0x0004, 0x0040, 0x75f1, 0x2009, 0x4000, 0x0078,
++	0x75f3, 0x2009, 0x0000, 0x21a2, 0x20a3, 0x0000, 0x60c3, 0x0018,
++	0x1078, 0x6dfb, 0x027f, 0x0d7f, 0x007c, 0x037e, 0x047e, 0x057e,
++	0x067e, 0x20a1, 0x020b, 0x1078, 0x67c2, 0xa006, 0x20a3, 0x0200,
++	0x20a2, 0x7934, 0x21a2, 0x7938, 0x21a2, 0x7818, 0xa080, 0x0028,
++	0x2004, 0xa092, 0x007e, 0x0048, 0x7623, 0x0d7e, 0x2069, 0xa61b,
++	0x2d2c, 0x8d68, 0x2d34, 0xa0e8, 0xa735, 0x2d6c, 0x6b10, 0x6c14,
++	0x0d7f, 0x0078, 0x7629, 0x2019, 0x0000, 0x6498, 0x2029, 0x0000,
++	0x6630, 0x7828, 0xa080, 0x0007, 0x2004, 0xa086, 0x0003, 0x00c0,
++	0x7637, 0x25a2, 0x26a2, 0x23a2, 0x24a2, 0x0078, 0x763b, 0x23a2,
++	0x24a2, 0x25a2, 0x26a2, 0x067f, 0x057f, 0x047f, 0x037f, 0x007c,
++	0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000,
++	0x20a3, 0x0009, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb,
++	0x007c, 0x20a1, 0x020b, 0x1078, 0x6728, 0x20a3, 0x1400, 0x20a3,
++	0x0000, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x7828, 0x20a2, 0x782c,
++	0x20a2, 0x7830, 0xa084, 0x00ff, 0x8007, 0x20a2, 0x20a3, 0x0000,
++	0x60c3, 0x0010, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078,
++	0x67b9, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0x20a2, 0x7810,
++	0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c, 0x147e, 0x20a1,
++	0x020b, 0x1078, 0x7689, 0x60c3, 0x0000, 0x1078, 0x6dfb, 0x147f,
++	0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++	0x2004, 0xd0bc, 0x0040, 0x76a6, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c,
++	0x6810, 0xa085, 0x0300, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b,
++	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x76ae, 0x20a3, 0x0300,
++	0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0819,
++	0x20a3, 0x0000, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, 0x2fa2,
++	0x7a08, 0x22a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x007c, 0x2061,
++	0xad00, 0x2a70, 0x7064, 0x704a, 0x704f, 0xad00, 0x007c, 0x0e7e,
++	0x127e, 0x2071, 0xa600, 0x2091, 0x8000, 0x7548, 0xa582, 0x0010,
++	0x0048, 0x76f9, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0040,
++	0x76e5, 0xace0, 0x0010, 0x7058, 0xac02, 0x00c8, 0x76e1, 0x0078,
++	0x76d4, 0x2061, 0xad00, 0x0078, 0x76d4, 0x6003, 0x0008, 0x8529,
++	0x754a, 0xaca8, 0x0010, 0x7058, 0xa502, 0x00c8, 0x76f5, 0x754e,
++	0xa085, 0x0001, 0x127f, 0x0e7f, 0x007c, 0x704f, 0xad00, 0x0078,
++	0x76f0, 0xa006, 0x0078, 0x76f2, 0x0e7e, 0x2071, 0xa600, 0x7548,
++	0xa582, 0x0010, 0x0048, 0x772a, 0x704c, 0x2060, 0x6000, 0xa086,
++	0x0000, 0x0040, 0x7717, 0xace0, 0x0010, 0x7058, 0xac02, 0x00c8,
++	0x7713, 0x0078, 0x7706, 0x2061, 0xad00, 0x0078, 0x7706, 0x6003,
++	0x0008, 0x8529, 0x754a, 0xaca8, 0x0010, 0x7058, 0xa502, 0x00c8,
++	0x7726, 0x754e, 0xa085, 0x0001, 0x0e7f, 0x007c, 0x704f, 0xad00,
++	0x0078, 0x7722, 0xa006, 0x0078, 0x7724, 0xac82, 0xad00, 0x1048,
++	0x1332, 0x2001, 0xa616, 0x2004, 0xac02, 0x10c8, 0x1332, 0xa006,
++	0x6006, 0x600a, 0x600e, 0x6012, 0x6016, 0x601a, 0x601f, 0x0000,
++	0x6003, 0x0000, 0x6022, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036,
++	0x603a, 0x603e, 0x2061, 0xa600, 0x6048, 0x8000, 0x604a, 0xa086,
++	0x0001, 0x0040, 0x7754, 0x007c, 0x127e, 0x2091, 0x8000, 0x1078,
++	0x62d1, 0x127f, 0x0078, 0x7753, 0x601c, 0xa084, 0x000f, 0x0079,
++	0x7761, 0x776a, 0x777b, 0x7797, 0x77b3, 0x920e, 0x922a, 0x9246,
++	0x776a, 0x777b, 0xa186, 0x0013, 0x00c0, 0x7773, 0x1078, 0x61cd,
++	0x1078, 0x62d1, 0x007c, 0xa18e, 0x0047, 0x00c0, 0x777a, 0xa016,
++	0x1078, 0x15fa, 0x007c, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8,
++	0x1332, 0x1079, 0x7785, 0x067f, 0x007c, 0x7795, 0x7b00, 0x7cb2,
++	0x7795, 0x7d36, 0x77cf, 0x7795, 0x7795, 0x7a92, 0x80f6, 0x7795,
++	0x7795, 0x7795, 0x7795, 0x7795, 0x7795, 0x1078, 0x1332, 0x067e,
++	0x6000, 0xa0b2, 0x0010, 0x10c8, 0x1332, 0x1079, 0x77a1, 0x067f,
++	0x007c, 0x77b1, 0x87c3, 0x77b1, 0x77b1, 0x77b1, 0x77b1, 0x77b1,
++	0x77b1, 0x8766, 0x8951, 0x77b1, 0x87f3, 0x8879, 0x87f3, 0x8879,
++	0x77b1, 0x1078, 0x1332, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8,
++	0x1332, 0x1079, 0x77bd, 0x067f, 0x007c, 0x77cd, 0x813d, 0x820e,
++	0x8368, 0x84e4, 0x77cd, 0x77cd, 0x77cd, 0x8116, 0x870e, 0x8712,
++	0x77cd, 0x77cd, 0x77cd, 0x77cd, 0x8742, 0x1078, 0x1332, 0xa1b6,
++	0x0015, 0x00c0, 0x77d7, 0x1078, 0x772d, 0x0078, 0x77dd, 0xa1b6,
++	0x0016, 0x10c0, 0x1332, 0x1078, 0x772d, 0x007c, 0x20a9, 0x000e,
++	0x2e98, 0x6010, 0x20a0, 0x53a3, 0x20a9, 0x0006, 0x3310, 0x3420,
++	0x9398, 0x94a0, 0x3318, 0x3428, 0x222e, 0x2326, 0xa290, 0x0002,
++	0xa5a8, 0x0002, 0xa398, 0x0002, 0xa4a0, 0x0002, 0x00f0, 0x77ec,
++	0x0e7e, 0x1078, 0x8d06, 0x0040, 0x7803, 0x6010, 0x2070, 0x7007,
++	0x0000, 0x7037, 0x0103, 0x0e7f, 0x1078, 0x772d, 0x007c, 0x0d7e,
++	0x037e, 0x7330, 0xa386, 0x0200, 0x00c0, 0x7814, 0x6018, 0x2068,
++	0x6813, 0x00ff, 0x6817, 0xfffd, 0x6010, 0xa005, 0x0040, 0x781e,
++	0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6b32, 0x1078, 0x772d,
++	0x037f, 0x0d7f, 0x007c, 0x017e, 0x20a9, 0x002a, 0xae80, 0x000c,
++	0x2098, 0x6010, 0xa080, 0x0002, 0x20a0, 0x53a3, 0x20a9, 0x002a,
++	0x6010, 0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x20a0, 0x53a3,
++	0x0e7e, 0x6010, 0x2004, 0x2070, 0x7037, 0x0103, 0x0e7f, 0x1078,
++	0x772d, 0x017f, 0x007c, 0x0e7e, 0x0d7e, 0x603f, 0x0000, 0x2c68,
++	0x017e, 0x2009, 0x0035, 0x1078, 0x91bc, 0x017f, 0x00c0, 0x785f,
++	0x027e, 0x6228, 0x2268, 0x027f, 0x2071, 0xab8c, 0x6b1c, 0xa386,
++	0x0003, 0x0040, 0x7863, 0xa386, 0x0006, 0x0040, 0x7867, 0x1078,
++	0x772d, 0x0078, 0x7869, 0x1078, 0x786c, 0x0078, 0x7869, 0x1078,
++	0x7938, 0x0d7f, 0x0e7f, 0x007c, 0x0f7e, 0x6810, 0x2078, 0xa186,
++	0x0015, 0x0040, 0x791d, 0xa18e, 0x0016, 0x00c0, 0x7936, 0x700c,
++	0xa08c, 0xff00, 0xa186, 0x1700, 0x0040, 0x7882, 0xa186, 0x0300,
++	0x00c0, 0x78f8, 0x8fff, 0x00c0, 0x788c, 0x6800, 0xa086, 0x000f,
++	0x0040, 0x78db, 0x0078, 0x7934, 0x6808, 0xa086, 0xffff, 0x00c0,
++	0x7921, 0x784c, 0xa084, 0x0060, 0xa086, 0x0020, 0x00c0, 0x78a2,
++	0x797c, 0x7810, 0xa106, 0x00c0, 0x7921, 0x7980, 0x7814, 0xa106,
++	0x00c0, 0x7921, 0x1078, 0x8eb9, 0x6830, 0x7852, 0x784c, 0xc0dc,
++	0xc0f4, 0xc0d4, 0x784e, 0x027e, 0xa00e, 0x6a14, 0x2001, 0x000a,
++	0x1078, 0x5c1c, 0x7854, 0xa20a, 0x0048, 0x78b7, 0x8011, 0x7a56,
++	0x82ff, 0x027f, 0x00c0, 0x78c3, 0x0c7e, 0x2d60, 0x1078, 0x8ae0,
++	0x0c7f, 0x0078, 0x7934, 0x0c7e, 0x0d7e, 0x2f68, 0x6838, 0xd0fc,
++	0x00c0, 0x78ce, 0x1078, 0x4353, 0x0078, 0x78d0, 0x1078, 0x4431,
++	0x0d7f, 0x0c7f, 0x00c0, 0x7921, 0x0c7e, 0x2d60, 0x1078, 0x772d,
++	0x0c7f, 0x0078, 0x7934, 0x0c7e, 0x1078, 0x9187, 0x0040, 0x78f1,
++	0x6013, 0x0000, 0x6818, 0x601a, 0x601f, 0x0003, 0x6904, 0x0c7e,
++	0x2d60, 0x1078, 0x772d, 0x0c7f, 0x1078, 0x775c, 0x0c7f, 0x0078,
++	0x7934, 0x2001, 0xa8a4, 0x2004, 0x683e, 0x0c7f, 0x0078, 0x7934,
++	0x7008, 0xa086, 0x000b, 0x00c0, 0x7912, 0x6018, 0x200c, 0xc1bc,
++	0x2102, 0x0c7e, 0x2d60, 0x7853, 0x0003, 0x6007, 0x0085, 0x6003,
++	0x000b, 0x601f, 0x0002, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7f,
++	0x0078, 0x7934, 0x700c, 0xa086, 0x2a00, 0x00c0, 0x7921, 0x2001,
++	0xa8a4, 0x2004, 0x683e, 0x0078, 0x7934, 0x1078, 0x7953, 0x0078,
++	0x7936, 0x8fff, 0x1040, 0x1332, 0x0c7e, 0x0d7e, 0x2d60, 0x2f68,
++	0x6837, 0x0103, 0x684b, 0x0003, 0x1078, 0x89cf, 0x1078, 0x8eb9,
++	0x1078, 0x8ec6, 0x0d7f, 0x0c7f, 0x1078, 0x772d, 0x0f7f, 0x007c,
++	0xa186, 0x0015, 0x00c0, 0x7942, 0x2001, 0xa8a4, 0x2004, 0x683e,
++	0x0078, 0x7950, 0xa18e, 0x0016, 0x00c0, 0x7952, 0x0c7e, 0x2d00,
++	0x2060, 0x1078, 0xa495, 0x1078, 0x5bc1, 0x1078, 0x772d, 0x0c7f,
++	0x1078, 0x772d, 0x007c, 0x027e, 0x037e, 0x047e, 0x7228, 0x7c80,
++	0x7b7c, 0xd2f4, 0x0040, 0x7962, 0x2001, 0xa8a4, 0x2004, 0x683e,
++	0x0078, 0x79c6, 0x0c7e, 0x2d60, 0x1078, 0x89f3, 0x0c7f, 0x6804,
++	0xa086, 0x0050, 0x00c0, 0x797a, 0x0c7e, 0x2d00, 0x2060, 0x6003,
++	0x0001, 0x6007, 0x0050, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7f,
++	0x0078, 0x79c6, 0x6800, 0xa086, 0x000f, 0x0040, 0x799c, 0x8fff,
++	0x1040, 0x1332, 0x6824, 0xd0dc, 0x00c0, 0x799c, 0x6800, 0xa086,
++	0x0004, 0x00c0, 0x79a1, 0x784c, 0xd0ac, 0x0040, 0x79a1, 0x784c,
++	0xc0dc, 0xc0f4, 0x784e, 0x7850, 0xc0f4, 0xc0fc, 0x7852, 0x2001,
++	0x0001, 0x682e, 0x0078, 0x79c0, 0x2001, 0x0007, 0x682e, 0x0078,
++	0x79c0, 0x784c, 0xd0b4, 0x00c0, 0x79ae, 0xd0ac, 0x0040, 0x799c,
++	0x784c, 0xd0f4, 0x00c0, 0x799c, 0x0078, 0x798f, 0xd2ec, 0x00c0,
++	0x799c, 0x7024, 0xa306, 0x00c0, 0x79b9, 0x7020, 0xa406, 0x0040,
++	0x799c, 0x7020, 0x6836, 0x7024, 0x683a, 0x2001, 0x0005, 0x682e,
++	0x1078, 0x8ff0, 0x1078, 0x62d1, 0x0078, 0x79c8, 0x1078, 0x772d,
++	0x047f, 0x037f, 0x027f, 0x007c, 0x0e7e, 0x0d7e, 0x027e, 0x6034,
++	0x2068, 0x6a1c, 0xa286, 0x0007, 0x0040, 0x7a35, 0xa286, 0x0002,
++	0x0040, 0x7a35, 0xa286, 0x0000, 0x0040, 0x7a35, 0x6808, 0x6338,
++	0xa306, 0x00c0, 0x7a35, 0x2071, 0xab8c, 0xa186, 0x0015, 0x0040,
++	0x7a2f, 0xa18e, 0x0016, 0x00c0, 0x7a02, 0x6030, 0xa084, 0x00ff,
++	0xa086, 0x0001, 0x00c0, 0x7a02, 0x700c, 0xa086, 0x2a00, 0x00c0,
++	0x7a02, 0x6034, 0xa080, 0x0009, 0x200c, 0xc1dd, 0xc1f5, 0x2102,
++	0x0078, 0x7a2f, 0x0c7e, 0x6034, 0x2060, 0x6104, 0xa186, 0x004b,
++	0x0040, 0x7a22, 0xa186, 0x004c, 0x0040, 0x7a22, 0xa186, 0x004d,
++	0x0040, 0x7a22, 0xa186, 0x004e, 0x0040, 0x7a22, 0xa186, 0x0052,
++	0x0040, 0x7a22, 0x6010, 0x2068, 0x1078, 0x8d06, 0x1040, 0x1332,
++	0x6853, 0x0003, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002,
++	0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7f, 0x0078, 0x7a35, 0x6034,
++	0x2068, 0x2001, 0xa8a4, 0x2004, 0x683e, 0x1078, 0x772d, 0x027f,
++	0x0d7f, 0x0e7f, 0x007c, 0x0d7e, 0x20a9, 0x000e, 0x2e98, 0x6010,
++	0x20a0, 0x53a3, 0xa1b6, 0x0015, 0x00c0, 0x7a73, 0x6018, 0x2068,
++	0x157e, 0x037e, 0x027e, 0xae90, 0x000c, 0xa290, 0x0004, 0x20a9,
++	0x0004, 0xad98, 0x000a, 0x1078, 0x80de, 0x027f, 0x037f, 0x157f,
++	0x00c0, 0x7a76, 0x157e, 0x037e, 0x027e, 0xae90, 0x000c, 0xa290,
++	0x0008, 0x20a9, 0x0004, 0xad98, 0x0006, 0x1078, 0x80de, 0x027f,
++	0x037f, 0x157f, 0x00c0, 0x7a76, 0x7038, 0x680a, 0x703c, 0x680e,
++	0x6800, 0xc08d, 0x6802, 0x0d7f, 0x0078, 0x77f8, 0x1078, 0x2880,
++	0x0c7e, 0x1078, 0x76c7, 0x2f00, 0x601a, 0x6013, 0x0000, 0x601f,
++	0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x1078,
++	0x4502, 0x1078, 0x4535, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0c7f,
++	0x0078, 0x7a73, 0x2100, 0xa1b2, 0x0044, 0x10c8, 0x1332, 0xa1b2,
++	0x0040, 0x00c8, 0x7af7, 0x0079, 0x7a9d, 0x7aeb, 0x7adf, 0x7aeb,
++	0x7aeb, 0x7aeb, 0x7aeb, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add,
++	0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add,
++	0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add,
++	0x7add, 0x7add, 0x7add, 0x7add, 0x7aeb, 0x7add, 0x7aeb, 0x7aeb,
++	0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7aeb, 0x7add, 0x7add,
++	0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7aeb,
++	0x7aeb, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add,
++	0x7add, 0x7add, 0x7aeb, 0x7add, 0x7add, 0x1078, 0x1332, 0x6003,
++	0x0001, 0x6106, 0x1078, 0x5dd7, 0x127e, 0x2091, 0x8000, 0x1078,
++	0x62d1, 0x127f, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078, 0x5dd7,
++	0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0x2600,
++	0x0079, 0x7afa, 0x7afe, 0x7afe, 0x7afe, 0x7aeb, 0x1078, 0x1332,
++	0x6004, 0xa0b2, 0x0044, 0x10c8, 0x1332, 0xa1b6, 0x0013, 0x00c0,
++	0x7b10, 0xa0b2, 0x0040, 0x00c8, 0x7c79, 0x2008, 0x0079, 0x7bbf,
++	0xa1b6, 0x0027, 0x00c0, 0x7b7c, 0x1078, 0x61cd, 0x6004, 0x1078,
++	0x8eec, 0x0040, 0x7b2d, 0x1078, 0x8f00, 0x0040, 0x7b74, 0xa08e,
++	0x0021, 0x0040, 0x7b78, 0xa08e, 0x0022, 0x0040, 0x7b74, 0xa08e,
++	0x003d, 0x0040, 0x7b78, 0x0078, 0x7b6f, 0x1078, 0x28a6, 0x2001,
++	0x0007, 0x1078, 0x4502, 0x6018, 0xa080, 0x0028, 0x200c, 0x1078,
++	0x7c83, 0xa186, 0x007e, 0x00c0, 0x7b42, 0x2001, 0xa633, 0x2014,
++	0xc285, 0x2202, 0x017e, 0x027e, 0x037e, 0x2110, 0x027e, 0x2019,
++	0x0028, 0x1078, 0x73d0, 0x027f, 0x1078, 0xa4f1, 0x037f, 0x027f,
++	0x017f, 0x017e, 0x027e, 0x037e, 0x2110, 0x2019, 0x0028, 0x1078,
++	0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a, 0x0c7e, 0x6018,
++	0xa065, 0x0040, 0x7b65, 0x1078, 0x47e9, 0x0c7f, 0x2c08, 0x1078,
++	0x9f8b, 0x077f, 0x037f, 0x027f, 0x017f, 0x1078, 0x457f, 0x1078,
++	0x772d, 0x1078, 0x62d1, 0x007c, 0x1078, 0x7c83, 0x0078, 0x7b6f,
++	0x1078, 0x7ca6, 0x0078, 0x7b6f, 0xa186, 0x0014, 0x00c0, 0x7b73,
++	0x1078, 0x61cd, 0x1078, 0x2880, 0x1078, 0x8eec, 0x00c0, 0x7b9b,
++	0x1078, 0x28a6, 0x6018, 0xa080, 0x0028, 0x200c, 0x1078, 0x7c83,
++	0xa186, 0x007e, 0x00c0, 0x7b99, 0x2001, 0xa633, 0x200c, 0xc185,
++	0x2102, 0x0078, 0x7b6f, 0x1078, 0x8f00, 0x00c0, 0x7ba3, 0x1078,
++	0x7c83, 0x0078, 0x7b6f, 0x6004, 0xa08e, 0x0032, 0x00c0, 0x7bb4,
++	0x0e7e, 0x0f7e, 0x2071, 0xa682, 0x2079, 0x0000, 0x1078, 0x2bd7,
++	0x0f7f, 0x0e7f, 0x0078, 0x7b6f, 0x6004, 0xa08e, 0x0021, 0x0040,
++	0x7b9f, 0xa08e, 0x0022, 0x1040, 0x7c83, 0x0078, 0x7b6f, 0x7c01,
++	0x7c03, 0x7c07, 0x7c0b, 0x7c0f, 0x7c13, 0x7bff, 0x7bff, 0x7bff,
++	0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff,
++	0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff,
++	0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7c17, 0x7c29, 0x7bff,
++	0x7c2b, 0x7c29, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7c29,
++	0x7c29, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff,
++	0x7bff, 0x7c5c, 0x7c29, 0x7bff, 0x7c23, 0x7bff, 0x7bff, 0x7bff,
++	0x7c25, 0x7bff, 0x7bff, 0x7bff, 0x7c29, 0x7bff, 0x7bff, 0x1078,
++	0x1332, 0x0078, 0x7c29, 0x2001, 0x000b, 0x0078, 0x7c36, 0x2001,
++	0x0003, 0x0078, 0x7c36, 0x2001, 0x0005, 0x0078, 0x7c36, 0x2001,
++	0x0001, 0x0078, 0x7c36, 0x2001, 0x0009, 0x0078, 0x7c36, 0x1078,
++	0x61cd, 0x6003, 0x0005, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x1078,
++	0x62d1, 0x0078, 0x7c35, 0x0078, 0x7c29, 0x0078, 0x7c29, 0x1078,
++	0x4502, 0x0078, 0x7c6e, 0x1078, 0x61cd, 0x6003, 0x0004, 0x2001,
++	0xa8a2, 0x2004, 0x6016, 0x1078, 0x62d1, 0x007c, 0x1078, 0x4502,
++	0x1078, 0x61cd, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x6003, 0x0002,
++	0x037e, 0x2019, 0xa65d, 0x2304, 0xa084, 0xff00, 0x00c0, 0x7c4d,
++	0x2019, 0xa8a2, 0x231c, 0x0078, 0x7c56, 0x8007, 0xa09a, 0x0004,
++	0x0048, 0x7c48, 0x8003, 0x801b, 0x831b, 0xa318, 0x6316, 0x037f,
++	0x1078, 0x62d1, 0x0078, 0x7c35, 0x0e7e, 0x0f7e, 0x2071, 0xa682,
++	0x2079, 0x0000, 0x1078, 0x2bd7, 0x0f7f, 0x0e7f, 0x1078, 0x61cd,
++	0x1078, 0x772d, 0x1078, 0x62d1, 0x0078, 0x7c35, 0x1078, 0x61cd,
++	0x6003, 0x0002, 0x2001, 0xa8a2, 0x2004, 0x6016, 0x1078, 0x62d1,
++	0x007c, 0x2600, 0x2008, 0x0079, 0x7c7d, 0x7c81, 0x7c81, 0x7c81,
++	0x7c6e, 0x1078, 0x1332, 0x0e7e, 0x1078, 0x8d06, 0x0040, 0x7c9f,
++	0x6010, 0x2070, 0x7038, 0xd0fc, 0x0040, 0x7c9f, 0x7007, 0x0000,
++	0x017e, 0x6004, 0xa08e, 0x0021, 0x0040, 0x7ca1, 0xa08e, 0x003d,
++	0x0040, 0x7ca1, 0x017f, 0x7037, 0x0103, 0x7033, 0x0100, 0x0e7f,
++	0x007c, 0x017f, 0x1078, 0x7ca6, 0x0078, 0x7c9f, 0x0e7e, 0xacf0,
++	0x0004, 0x2e74, 0x7000, 0x2070, 0x7037, 0x0103, 0x7023, 0x8001,
++	0x0e7f, 0x007c, 0x0d7e, 0x6618, 0x2668, 0x6804, 0xa084, 0x00ff,
++	0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x1332, 0x6604, 0xa6b6, 0x0043,
++	0x00c0, 0x7cc6, 0x1078, 0x9134, 0x0078, 0x7d25, 0x6604, 0xa6b6,
++	0x0033, 0x00c0, 0x7ccf, 0x1078, 0x90d8, 0x0078, 0x7d25, 0x6604,
++	0xa6b6, 0x0028, 0x00c0, 0x7cd8, 0x1078, 0x8f2f, 0x0078, 0x7d25,
++	0x6604, 0xa6b6, 0x0029, 0x00c0, 0x7ce1, 0x1078, 0x8f49, 0x0078,
++	0x7d25, 0x6604, 0xa6b6, 0x001f, 0x00c0, 0x7cea, 0x1078, 0x77de,
++	0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0000, 0x00c0, 0x7cf3, 0x1078,
++	0x7a3b, 0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0022, 0x00c0, 0x7cfc,
++	0x1078, 0x7807, 0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0035, 0x00c0,
++	0x7d05, 0x1078, 0x7843, 0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0039,
++	0x00c0, 0x7d0e, 0x1078, 0x79cc, 0x0078, 0x7d25, 0x6604, 0xa6b6,
++	0x003d, 0x00c0, 0x7d17, 0x1078, 0x7823, 0x0078, 0x7d25, 0xa1b6,
++	0x0015, 0x00c0, 0x7d1f, 0x1079, 0x7d2a, 0x0078, 0x7d25, 0xa1b6,
++	0x0016, 0x00c0, 0x7d26, 0x1079, 0x7e7f, 0x007c, 0x1078, 0x7773,
++	0x0078, 0x7d25, 0x7d4e, 0x7d51, 0x7d4e, 0x7d9c, 0x7d4e, 0x7e13,
++	0x7e8b, 0x7d4e, 0x7d4e, 0x7e57, 0x7d4e, 0x7e6d, 0xa1b6, 0x0048,
++	0x0040, 0x7d42, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078,
++	0x15fa, 0x007c, 0x0e7e, 0xacf0, 0x0004, 0x2e74, 0x7000, 0x2070,
++	0x7037, 0x0103, 0x0e7f, 0x1078, 0x772d, 0x007c, 0x0005, 0x0005,
++	0x007c, 0x0e7e, 0x2071, 0xa600, 0x7080, 0xa086, 0x0074, 0x00c0,
++	0x7d85, 0x1078, 0x9f5f, 0x00c0, 0x7d77, 0x0d7e, 0x6018, 0x2068,
++	0x7030, 0xd08c, 0x0040, 0x7d6a, 0x6800, 0xd0bc, 0x0040, 0x7d6a,
++	0xc0c5, 0x6802, 0x1078, 0x7d89, 0x0d7f, 0x2001, 0x0006, 0x1078,
++	0x4502, 0x1078, 0x28a6, 0x1078, 0x772d, 0x0078, 0x7d87, 0x2001,
++	0x000a, 0x1078, 0x4502, 0x1078, 0x28a6, 0x6003, 0x0001, 0x6007,
++	0x0001, 0x1078, 0x5dd7, 0x0078, 0x7d87, 0x1078, 0x7dff, 0x0e7f,
++	0x007c, 0x6800, 0xd084, 0x0040, 0x7d9b, 0x2001, 0x0000, 0x1078,
++	0x44ee, 0x2069, 0xa652, 0x6804, 0xd0a4, 0x0040, 0x7d9b, 0x2001,
++	0x0006, 0x1078, 0x4535, 0x007c, 0x0d7e, 0x2011, 0xa620, 0x2204,
++	0xa086, 0x0074, 0x00c0, 0x7dfb, 0x6018, 0x2068, 0x6aa0, 0xa286,
++	0x007e, 0x00c0, 0x7daf, 0x1078, 0x7f9b, 0x0078, 0x7dfd, 0x1078,
++	0x7f91, 0x6018, 0x2068, 0xa080, 0x0028, 0x2014, 0xa286, 0x0080,
++	0x00c0, 0x7dd3, 0x6813, 0x00ff, 0x6817, 0xfffc, 0x6010, 0xa005,
++	0x0040, 0x7dc9, 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6833,
++	0x0200, 0x2001, 0x0006, 0x1078, 0x4502, 0x1078, 0x28a6, 0x1078,
++	0x772d, 0x0078, 0x7dfd, 0x0e7e, 0x2071, 0xa633, 0x2e04, 0xd09c,
++	0x0040, 0x7dee, 0x2071, 0xab80, 0x7108, 0x720c, 0xa18c, 0x00ff,
++	0x00c0, 0x7de6, 0xa284, 0xff00, 0x0040, 0x7dee, 0x6018, 0x2070,
++	0x70a0, 0xd0bc, 0x00c0, 0x7dee, 0x7112, 0x7216, 0x0e7f, 0x2001,
++	0x0004, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0003, 0x1078,
++	0x5dd7, 0x0078, 0x7dfd, 0x1078, 0x7dff, 0x0d7f, 0x007c, 0x2001,
++	0x0007, 0x1078, 0x4502, 0x2001, 0xa600, 0x2004, 0xa086, 0x0003,
++	0x00c0, 0x7e0e, 0x2001, 0x0007, 0x1078, 0x4535, 0x1078, 0x28a6,
++	0x1078, 0x772d, 0x007c, 0x0e7e, 0x2071, 0xa600, 0x7080, 0xa086,
++	0x0014, 0x00c0, 0x7e51, 0x7000, 0xa086, 0x0003, 0x00c0, 0x7e26,
++	0x6010, 0xa005, 0x00c0, 0x7e26, 0x1078, 0x3699, 0x0d7e, 0x6018,
++	0x2068, 0x1078, 0x4649, 0x1078, 0x7d89, 0x0d7f, 0x1078, 0x8043,
++	0x00c0, 0x7e51, 0x0d7e, 0x6018, 0x2068, 0x6890, 0x0d7f, 0xa005,
++	0x0040, 0x7e51, 0x2001, 0x0006, 0x1078, 0x4502, 0x0e7e, 0x6010,
++	0xa005, 0x0040, 0x7e4a, 0x2070, 0x7007, 0x0000, 0x7037, 0x0103,
++	0x7033, 0x0200, 0x0e7f, 0x1078, 0x28a6, 0x1078, 0x772d, 0x0078,
++	0x7e55, 0x1078, 0x7c83, 0x1078, 0x7dff, 0x0e7f, 0x007c, 0x2011,
++	0xa620, 0x2204, 0xa086, 0x0014, 0x00c0, 0x7e6a, 0x2001, 0x0002,
++	0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078, 0x5dd7,
++	0x0078, 0x7e6c, 0x1078, 0x7dff, 0x007c, 0x2011, 0xa620, 0x2204,
++	0xa086, 0x0004, 0x00c0, 0x7e7c, 0x2001, 0x0007, 0x1078, 0x4502,
++	0x1078, 0x772d, 0x0078, 0x7e7e, 0x1078, 0x7dff, 0x007c, 0x7d4e,
++	0x7e97, 0x7d4e, 0x7ed2, 0x7d4e, 0x7f44, 0x7e8b, 0x7d4e, 0x7d4e,
++	0x7f59, 0x7d4e, 0x7f6c, 0x6604, 0xa686, 0x0003, 0x0040, 0x7e13,
++	0xa6b6, 0x001e, 0x00c0, 0x7e96, 0x1078, 0x772d, 0x007c, 0x0d7e,
++	0x0c7e, 0x1078, 0x7f7f, 0x00c0, 0x7ead, 0x2001, 0x0000, 0x1078,
++	0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007,
++	0x0002, 0x1078, 0x5dd7, 0x0078, 0x7ecf, 0x2009, 0xab8e, 0x2104,
++	0xa086, 0x0009, 0x00c0, 0x7ec2, 0x6018, 0x2068, 0x6840, 0xa084,
++	0x00ff, 0xa005, 0x0040, 0x7ecd, 0x8001, 0x6842, 0x6017, 0x000a,
++	0x0078, 0x7ecf, 0x2009, 0xab8f, 0x2104, 0xa084, 0xff00, 0xa086,
++	0x1900, 0x00c0, 0x7ecd, 0x0078, 0x7ea1, 0x1078, 0x7dff, 0x0c7f,
++	0x0d7f, 0x007c, 0x1078, 0x7f8e, 0x00c0, 0x7ee6, 0x2001, 0x0000,
++	0x1078, 0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x6003, 0x0001,
++	0x6007, 0x0002, 0x1078, 0x5dd7, 0x0078, 0x7f12, 0x1078, 0x7c83,
++	0x2009, 0xab8e, 0x2134, 0xa6b4, 0x00ff, 0xa686, 0x0005, 0x0040,
++	0x7f13, 0xa686, 0x000b, 0x0040, 0x7f10, 0x2009, 0xab8f, 0x2104,
++	0xa084, 0xff00, 0x00c0, 0x7f00, 0xa686, 0x0009, 0x0040, 0x7f13,
++	0xa086, 0x1900, 0x00c0, 0x7f10, 0xa686, 0x0009, 0x0040, 0x7f13,
++	0x2001, 0x0004, 0x1078, 0x4502, 0x1078, 0x772d, 0x0078, 0x7f12,
++	0x1078, 0x7dff, 0x007c, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d06,
++	0x0040, 0x7f21, 0x6838, 0xd0fc, 0x0040, 0x7f21, 0x0d7f, 0x0078,
++	0x7f10, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0040,
++	0x7f32, 0x8001, 0x6842, 0x6017, 0x000a, 0x6007, 0x0016, 0x0d7f,
++	0x0078, 0x7f12, 0x68a0, 0xa086, 0x007e, 0x00c0, 0x7f3f, 0x0e7e,
++	0x2071, 0xa600, 0x1078, 0x42b8, 0x0e7f, 0x0078, 0x7f41, 0x1078,
++	0x2880, 0x0d7f, 0x0078, 0x7f10, 0x1078, 0x7f8e, 0x00c0, 0x7f54,
++	0x2001, 0x0004, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0003,
++	0x1078, 0x5dd7, 0x0078, 0x7f58, 0x1078, 0x7c83, 0x1078, 0x7dff,
++	0x007c, 0x1078, 0x7f8e, 0x00c0, 0x7f69, 0x2001, 0x0008, 0x1078,
++	0x4502, 0x6003, 0x0001, 0x6007, 0x0005, 0x1078, 0x5dd7, 0x0078,
++	0x7f6b, 0x1078, 0x7dff, 0x007c, 0x1078, 0x7f8e, 0x00c0, 0x7f7c,
++	0x2001, 0x000a, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0001,
++	0x1078, 0x5dd7, 0x0078, 0x7f7e, 0x1078, 0x7dff, 0x007c, 0x2009,
++	0xab8e, 0x2104, 0xa086, 0x0003, 0x00c0, 0x7f8d, 0x2009, 0xab8f,
++	0x2104, 0xa084, 0xff00, 0xa086, 0x2a00, 0x007c, 0xa085, 0x0001,
++	0x007c, 0x0c7e, 0x017e, 0xac88, 0x0006, 0x2164, 0x1078, 0x45d6,
++	0x017f, 0x0c7f, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x037e, 0x017e,
++	0x6018, 0x2068, 0x2071, 0xa633, 0x2e04, 0xa085, 0x0003, 0x2072,
++	0x1078, 0x8014, 0x0040, 0x7fd9, 0x2009, 0xa633, 0x2104, 0xc0cd,
++	0x200a, 0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040, 0x7fc2, 0xa006,
++	0x2020, 0x2009, 0x002a, 0x1078, 0xa21d, 0x2001, 0xa60c, 0x200c,
++	0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, 0x1078, 0x284f,
++	0x2071, 0xa600, 0x1078, 0x2677, 0x0c7e, 0x157e, 0x20a9, 0x0081,
++	0x2009, 0x007f, 0x1078, 0x298e, 0x8108, 0x00f0, 0x7fd2, 0x157f,
++	0x0c7f, 0x1078, 0x7f91, 0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071,
++	0xab80, 0x2079, 0x0100, 0x2e04, 0xa084, 0x00ff, 0x2069, 0xa61b,
++	0x206a, 0x78e6, 0x007e, 0x8e70, 0x2e04, 0x2069, 0xa61c, 0x206a,
++	0x78ea, 0xa084, 0xff00, 0x017f, 0xa105, 0x2009, 0xa626, 0x200a,
++	0x2069, 0xab8e, 0x2071, 0xa89e, 0x6810, 0x2072, 0x6814, 0x7006,
++	0x6818, 0x700a, 0x681c, 0x700e, 0x1078, 0x906e, 0x2001, 0x0006,
++	0x1078, 0x4502, 0x1078, 0x28a6, 0x1078, 0x772d, 0x017f, 0x037f,
++	0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x027e, 0x037e, 0x0e7e, 0x157e,
++	0x2019, 0xa626, 0x231c, 0x83ff, 0x0040, 0x803e, 0x2071, 0xab80,
++	0x2e14, 0xa294, 0x00ff, 0x7004, 0xa084, 0xff00, 0xa205, 0xa306,
++	0x00c0, 0x803e, 0x2011, 0xab96, 0xad98, 0x000a, 0x20a9, 0x0004,
++	0x1078, 0x80de, 0x00c0, 0x803e, 0x2011, 0xab9a, 0xad98, 0x0006,
++	0x20a9, 0x0004, 0x1078, 0x80de, 0x00c0, 0x803e, 0x157f, 0x0e7f,
++	0x037f, 0x027f, 0x007c, 0x0e7e, 0x2071, 0xab8c, 0x7004, 0xa086,
++	0x0014, 0x00c0, 0x8066, 0x7008, 0xa086, 0x0800, 0x00c0, 0x8066,
++	0x700c, 0xd0ec, 0x0040, 0x8064, 0xa084, 0x0f00, 0xa086, 0x0100,
++	0x00c0, 0x8064, 0x7024, 0xd0a4, 0x00c0, 0x8061, 0xd0ac, 0x0040,
++	0x8064, 0xa006, 0x0078, 0x8066, 0xa085, 0x0001, 0x0e7f, 0x007c,
++	0x0e7e, 0x0d7e, 0x0c7e, 0x077e, 0x057e, 0x047e, 0x027e, 0x007e,
++	0x127e, 0x2091, 0x8000, 0x2029, 0xa8ba, 0x252c, 0x2021, 0xa8c0,
++	0x2424, 0x2061, 0xad00, 0x2071, 0xa600, 0x7248, 0x7064, 0xa202,
++	0x00c8, 0x80cc, 0x1078, 0xa242, 0x0040, 0x80c4, 0x671c, 0xa786,
++	0x0001, 0x0040, 0x80c4, 0xa786, 0x0007, 0x0040, 0x80c4, 0x2500,
++	0xac06, 0x0040, 0x80c4, 0x2400, 0xac06, 0x0040, 0x80c4, 0x0c7e,
++	0x6000, 0xa086, 0x0004, 0x00c0, 0x809f, 0x1078, 0x1757, 0xa786,
++	0x0008, 0x00c0, 0x80ae, 0x1078, 0x8f00, 0x00c0, 0x80ae, 0x0c7f,
++	0x1078, 0x7c83, 0x1078, 0x8ec6, 0x0078, 0x80c4, 0x6010, 0x2068,
++	0x1078, 0x8d06, 0x0040, 0x80c1, 0xa786, 0x0003, 0x00c0, 0x80d6,
++	0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4a73, 0x1078,
++	0x8eb9, 0x1078, 0x8ec6, 0x0c7f, 0xace0, 0x0010, 0x7058, 0xac02,
++	0x00c8, 0x80cc, 0x0078, 0x807d, 0x127f, 0x007f, 0x027f, 0x047f,
++	0x057f, 0x077f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0xa786, 0x0006,
++	0x00c0, 0x80b8, 0x1078, 0xa1ca, 0x0078, 0x80c1, 0x220c, 0x2304,
++	0xa106, 0x00c0, 0x80e9, 0x8210, 0x8318, 0x00f0, 0x80de, 0xa006,
++	0x007c, 0x2304, 0xa102, 0x0048, 0x80f1, 0x2001, 0x0001, 0x0078,
++	0x80f3, 0x2001, 0x0000, 0xa18d, 0x0001, 0x007c, 0x6004, 0xa08a,
++	0x0044, 0x10c8, 0x1332, 0x1078, 0x8eec, 0x0040, 0x8105, 0x1078,
++	0x8f00, 0x0040, 0x8112, 0x0078, 0x810b, 0x1078, 0x28a6, 0x1078,
++	0x8f00, 0x0040, 0x8112, 0x1078, 0x61cd, 0x1078, 0x772d, 0x1078,
++	0x62d1, 0x007c, 0x1078, 0x7c83, 0x0078, 0x810b, 0xa182, 0x0040,
++	0x0079, 0x811a, 0x812d, 0x812d, 0x812d, 0x812d, 0x812d, 0x812d,
++	0x812d, 0x812d, 0x812d, 0x812d, 0x812d, 0x812f, 0x812f, 0x812f,
++	0x812f, 0x812d, 0x812d, 0x812d, 0x812f, 0x1078, 0x1332, 0x600b,
++	0xffff, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a, 0x127e, 0x2091,
++	0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0xa186, 0x0013, 0x00c0,
++	0x8146, 0x6004, 0xa082, 0x0040, 0x0079, 0x81d1, 0xa186, 0x0027,
++	0x00c0, 0x8168, 0x1078, 0x61cd, 0x1078, 0x2880, 0x0d7e, 0x6110,
++	0x2168, 0x1078, 0x8d06, 0x0040, 0x8162, 0x6837, 0x0103, 0x684b,
++	0x0029, 0x6847, 0x0000, 0x694c, 0xc1c5, 0x694e, 0x1078, 0x4a73,
++	0x1078, 0x8eb9, 0x0d7f, 0x1078, 0x772d, 0x1078, 0x62d1, 0x007c,
++	0xa186, 0x0014, 0x00c0, 0x8171, 0x6004, 0xa082, 0x0040, 0x0079,
++	0x8199, 0xa186, 0x0046, 0x0040, 0x817d, 0xa186, 0x0045, 0x0040,
++	0x817d, 0xa186, 0x0047, 0x10c0, 0x1332, 0x2001, 0x0109, 0x2004,
++	0xd084, 0x0040, 0x8196, 0x127e, 0x2091, 0x2200, 0x007e, 0x017e,
++	0x027e, 0x1078, 0x5c56, 0x027f, 0x017f, 0x007f, 0x127f, 0x6000,
++	0xa086, 0x0002, 0x00c0, 0x8196, 0x0078, 0x820e, 0x1078, 0x7773,
++	0x007c, 0x81ae, 0x81ac, 0x81ac, 0x81ac, 0x81ac, 0x81ac, 0x81ac,
++	0x81ac, 0x81ac, 0x81ac, 0x81ac, 0x81ca, 0x81ca, 0x81ca, 0x81ca,
++	0x81ac, 0x81ca, 0x81ac, 0x81ca, 0x1078, 0x1332, 0x1078, 0x61cd,
++	0x0d7e, 0x6110, 0x2168, 0x1078, 0x8d06, 0x0040, 0x81c4, 0x6837,
++	0x0103, 0x684b, 0x0006, 0x6847, 0x0000, 0x6850, 0xc0ec, 0x6852,
++	0x1078, 0x4a73, 0x1078, 0x8eb9, 0x0d7f, 0x1078, 0x772d, 0x1078,
++	0x62d1, 0x007c, 0x1078, 0x61cd, 0x1078, 0x772d, 0x1078, 0x62d1,
++	0x007c, 0x81e6, 0x81e4, 0x81e4, 0x81e4, 0x81e4, 0x81e4, 0x81e4,
++	0x81e4, 0x81e4, 0x81e4, 0x81e4, 0x81f8, 0x81f8, 0x81f8, 0x81f8,
++	0x81e4, 0x8207, 0x81e4, 0x81f8, 0x1078, 0x1332, 0x1078, 0x61cd,
++	0x2001, 0xa8a4, 0x2004, 0x603e, 0x6003, 0x0002, 0x1078, 0x62d1,
++	0x6010, 0xa088, 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x007c,
++	0x1078, 0x61cd, 0x2001, 0xa8a2, 0x2004, 0x6016, 0x2001, 0xa8a4,
++	0x2004, 0x603e, 0x6003, 0x000f, 0x1078, 0x62d1, 0x007c, 0x1078,
++	0x61cd, 0x1078, 0x772d, 0x1078, 0x62d1, 0x007c, 0xa182, 0x0040,
++	0x0079, 0x8212, 0x8225, 0x8225, 0x8225, 0x8225, 0x8225, 0x8227,
++	0x8327, 0x8359, 0x8225, 0x8225, 0x8225, 0x8225, 0x8225, 0x8225,
++	0x8225, 0x8225, 0x8225, 0x8225, 0x8225, 0x1078, 0x1332, 0x0e7e,
++	0x0d7e, 0x603f, 0x0000, 0x2071, 0xab80, 0x7124, 0x610a, 0x2071,
++	0xab8c, 0x6110, 0x2168, 0x7614, 0xa6b4, 0x0fff, 0x86ff, 0x0040,
++	0x82e9, 0xa68c, 0x0c00, 0x0040, 0x825e, 0x0f7e, 0x2c78, 0x1078,
++	0x4963, 0x0f7f, 0x0040, 0x825a, 0x684c, 0xd0ac, 0x0040, 0x825a,
++	0x6024, 0xd0dc, 0x00c0, 0x825a, 0x6850, 0xd0bc, 0x00c0, 0x825a,
++	0x7318, 0x6814, 0xa306, 0x00c0, 0x8301, 0x731c, 0x6810, 0xa306,
++	0x00c0, 0x8301, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff,
++	0xa186, 0x0002, 0x0040, 0x8291, 0xa186, 0x0028, 0x00c0, 0x826e,
++	0x1078, 0x8eda, 0x684b, 0x001c, 0x0078, 0x8293, 0xd6dc, 0x0040,
++	0x828a, 0x684b, 0x0015, 0x684c, 0xd0ac, 0x0040, 0x8288, 0x6914,
++	0x6a10, 0x2100, 0xa205, 0x0040, 0x8288, 0x7018, 0xa106, 0x00c0,
++	0x8285, 0x701c, 0xa206, 0x0040, 0x8288, 0x6962, 0x6a5e, 0xc6dc,
++	0x0078, 0x8293, 0xd6d4, 0x0040, 0x8291, 0x684b, 0x0007, 0x0078,
++	0x8293, 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46, 0xa01e, 0xd6c4,
++	0x0040, 0x82bc, 0xa686, 0x0100, 0x00c0, 0x82a7, 0x2001, 0xab99,
++	0x2004, 0xa005, 0x00c0, 0x82a7, 0xc6c4, 0x0078, 0x8236, 0x7328,
++	0x732c, 0x6b56, 0x83ff, 0x0040, 0x82bc, 0xa38a, 0x0009, 0x0048,
++	0x82b3, 0x2019, 0x0008, 0x037e, 0x2308, 0x2019, 0xab98, 0xad90,
++	0x0019, 0x1078, 0x89e2, 0x037f, 0xd6cc, 0x0040, 0x8317, 0x7124,
++	0x695a, 0x81ff, 0x0040, 0x8317, 0xa192, 0x0021, 0x00c8, 0x82d5,
++	0x2071, 0xab98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078,
++	0x89e2, 0x1078, 0x91f4, 0x0078, 0x8317, 0x6838, 0xd0fc, 0x0040,
++	0x82de, 0x2009, 0x0020, 0x695a, 0x0078, 0x82c8, 0x0f7e, 0x2d78,
++	0x1078, 0x897a, 0x0f7f, 0x1078, 0x91f4, 0x1078, 0x89cf, 0x0078,
++	0x8319, 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f, 0x0040, 0x8307,
++	0x684c, 0xd0ac, 0x0040, 0x8307, 0x6024, 0xd0dc, 0x00c0, 0x8307,
++	0x6850, 0xd0bc, 0x00c0, 0x8307, 0x6810, 0x6914, 0xa105, 0x0040,
++	0x8307, 0x1078, 0x8fbf, 0x0d7f, 0x0e7f, 0x0078, 0x8326, 0x684b,
++	0x0000, 0x6837, 0x0103, 0x6e46, 0x684c, 0xd0ac, 0x0040, 0x8317,
++	0x6810, 0x6914, 0xa115, 0x0040, 0x8317, 0x1078, 0x84d5, 0x1078,
++	0x4a73, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x1078, 0x8f89,
++	0x0d7f, 0x0e7f, 0x00c0, 0x8326, 0x1078, 0x772d, 0x007c, 0x0f7e,
++	0x6003, 0x0003, 0x2079, 0xab8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08,
++	0x6010, 0x2078, 0x784c, 0xd0ac, 0x0040, 0x833e, 0x6003, 0x0002,
++	0x0f7f, 0x007c, 0x2130, 0x2228, 0x0078, 0x834a, 0x2400, 0x797c,
++	0xa10a, 0x2300, 0x7a80, 0xa213, 0x2600, 0xa102, 0x2500, 0xa203,
++	0x0048, 0x833a, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x0f7f, 0x603f,
++	0x0000, 0x2c10, 0x1078, 0x1cf0, 0x1078, 0x5df6, 0x1078, 0x639b,
++	0x007c, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x6003, 0x0004, 0x6110,
++	0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, 0x15fa, 0x007c,
++	0xa182, 0x0040, 0x0079, 0x836c, 0x837f, 0x837f, 0x837f, 0x837f,
++	0x837f, 0x8381, 0x8424, 0x837f, 0x837f, 0x843a, 0x84ab, 0x837f,
++	0x837f, 0x837f, 0x837f, 0x84ba, 0x837f, 0x837f, 0x837f, 0x1078,
++	0x1332, 0x077e, 0x0f7e, 0x0e7e, 0x0d7e, 0x2071, 0xab8c, 0x6110,
++	0x2178, 0x7614, 0xa6b4, 0x0fff, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e,
++	0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0040, 0x841f,
++	0xa694, 0xff00, 0xa284, 0x0c00, 0x0040, 0x83a2, 0x7018, 0x7862,
++	0x701c, 0x785e, 0xa284, 0x0300, 0x0040, 0x841f, 0x1078, 0x138b,
++	0x1040, 0x1332, 0x2d00, 0x784a, 0x7f4c, 0xc7cd, 0x7f4e, 0x6837,
++	0x0103, 0x7838, 0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46,
++	0xa68c, 0x0c00, 0x0040, 0x83c0, 0x7318, 0x6b62, 0x731c, 0x6b5e,
++	0xa68c, 0x00ff, 0xa186, 0x0002, 0x0040, 0x83dc, 0xa186, 0x0028,
++	0x00c0, 0x83ce, 0x684b, 0x001c, 0x0078, 0x83de, 0xd6dc, 0x0040,
++	0x83d5, 0x684b, 0x0015, 0x0078, 0x83de, 0xd6d4, 0x0040, 0x83dc,
++	0x684b, 0x0007, 0x0078, 0x83de, 0x684b, 0x0000, 0x6f4e, 0x7850,
++	0x6852, 0x7854, 0x6856, 0xa01e, 0xd6c4, 0x0040, 0x83fc, 0x7328,
++	0x732c, 0x6b56, 0x83ff, 0x0040, 0x83fc, 0xa38a, 0x0009, 0x0048,
++	0x83f3, 0x2019, 0x0008, 0x037e, 0x2308, 0x2019, 0xab98, 0xad90,
++	0x0019, 0x1078, 0x89e2, 0x037f, 0xd6cc, 0x0040, 0x841f, 0x7124,
++	0x695a, 0x81ff, 0x0040, 0x841f, 0xa192, 0x0021, 0x00c8, 0x8413,
++	0x2071, 0xab98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078,
++	0x89e2, 0x0078, 0x841f, 0x7838, 0xd0fc, 0x0040, 0x841c, 0x2009,
++	0x0020, 0x695a, 0x0078, 0x8408, 0x2d78, 0x1078, 0x897a, 0x0d7f,
++	0x0e7f, 0x0f7f, 0x077f, 0x007c, 0x0f7e, 0x6003, 0x0003, 0x2079,
++	0xab8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010, 0x2078, 0x7c12,
++	0x7b16, 0x7e0a, 0x7d0e, 0x0f7f, 0x2c10, 0x1078, 0x1cf0, 0x1078,
++	0x6df4, 0x007c, 0x0d7e, 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f,
++	0x0040, 0x8446, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x6003, 0x0002,
++	0x1078, 0x627a, 0x1078, 0x639b, 0x6110, 0x2168, 0x694c, 0xd1e4,
++	0x0040, 0x84a9, 0xd1cc, 0x0040, 0x8480, 0x6948, 0x6838, 0xd0fc,
++	0x0040, 0x8478, 0x017e, 0x684c, 0x007e, 0x6850, 0x007e, 0xad90,
++	0x000d, 0xa198, 0x000d, 0x2009, 0x0020, 0x157e, 0x21a8, 0x2304,
++	0x2012, 0x8318, 0x8210, 0x00f0, 0x8467, 0x157f, 0x007f, 0x6852,
++	0x007f, 0x684e, 0x017f, 0x2168, 0x1078, 0x13b4, 0x0078, 0x84a3,
++	0x017e, 0x1078, 0x13b4, 0x0d7f, 0x1078, 0x89cf, 0x0078, 0x84a3,
++	0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0040,
++	0x849f, 0xa086, 0x0028, 0x00c0, 0x8491, 0x684b, 0x001c, 0x0078,
++	0x84a1, 0xd1dc, 0x0040, 0x8498, 0x684b, 0x0015, 0x0078, 0x84a1,
++	0xd1d4, 0x0040, 0x849f, 0x684b, 0x0007, 0x0078, 0x84a1, 0x684b,
++	0x0000, 0x1078, 0x4a73, 0x1078, 0x8f89, 0x00c0, 0x84a9, 0x1078,
++	0x772d, 0x0d7f, 0x007c, 0x2019, 0x0001, 0x1078, 0x7058, 0x6003,
++	0x0002, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x1078, 0x627a, 0x1078,
++	0x639b, 0x007c, 0x1078, 0x627a, 0x1078, 0x2880, 0x0d7e, 0x6110,
++	0x2168, 0x1078, 0x8d06, 0x0040, 0x84cf, 0x6837, 0x0103, 0x684b,
++	0x0029, 0x6847, 0x0000, 0x1078, 0x4a73, 0x1078, 0x8eb9, 0x0d7f,
++	0x1078, 0x772d, 0x1078, 0x639b, 0x007c, 0x684b, 0x0015, 0xd1fc,
++	0x0040, 0x84e1, 0x684b, 0x0007, 0x8002, 0x8000, 0x810a, 0xa189,
++	0x0000, 0x6962, 0x685e, 0x007c, 0xa182, 0x0040, 0x0079, 0x84e8,
++	0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fd, 0x84fb, 0x85d0,
++	0x85dc, 0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fb,
++	0x84fb, 0x84fb, 0x84fb, 0x1078, 0x1332, 0x077e, 0x0f7e, 0x0e7e,
++	0x0d7e, 0x2071, 0xab8c, 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff,
++	0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f, 0x0040, 0x851b, 0xa684,
++	0x00ff, 0x00c0, 0x851b, 0x6024, 0xd0f4, 0x0040, 0x851b, 0x1078,
++	0x8fbf, 0x0078, 0x85cb, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218,
++	0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0040, 0x85c0, 0xa694,
++	0xff00, 0xa284, 0x0c00, 0x0040, 0x8531, 0x7018, 0x7862, 0x701c,
++	0x785e, 0xa284, 0x0300, 0x0040, 0x85bd, 0xa686, 0x0100, 0x00c0,
++	0x8543, 0x2001, 0xab99, 0x2004, 0xa005, 0x00c0, 0x8543, 0xc6c4,
++	0x7e46, 0x0078, 0x8524, 0x1078, 0x138b, 0x1040, 0x1332, 0x2d00,
++	0x784a, 0x7f4c, 0xa7bd, 0x0200, 0x7f4e, 0x6837, 0x0103, 0x7838,
++	0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00,
++	0x0040, 0x855e, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff,
++	0xa186, 0x0002, 0x0040, 0x857a, 0xa186, 0x0028, 0x00c0, 0x856c,
++	0x684b, 0x001c, 0x0078, 0x857c, 0xd6dc, 0x0040, 0x8573, 0x684b,
++	0x0015, 0x0078, 0x857c, 0xd6d4, 0x0040, 0x857a, 0x684b, 0x0007,
++	0x0078, 0x857c, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854,
++	0x6856, 0xa01e, 0xd6c4, 0x0040, 0x859a, 0x7328, 0x732c, 0x6b56,
++	0x83ff, 0x0040, 0x859a, 0xa38a, 0x0009, 0x0048, 0x8591, 0x2019,
++	0x0008, 0x037e, 0x2308, 0x2019, 0xab98, 0xad90, 0x0019, 0x1078,
++	0x89e2, 0x037f, 0xd6cc, 0x0040, 0x85bd, 0x7124, 0x695a, 0x81ff,
++	0x0040, 0x85bd, 0xa192, 0x0021, 0x00c8, 0x85b1, 0x2071, 0xab98,
++	0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078, 0x89e2, 0x0078,
++	0x85bd, 0x7838, 0xd0fc, 0x0040, 0x85ba, 0x2009, 0x0020, 0x695a,
++	0x0078, 0x85a6, 0x2d78, 0x1078, 0x897a, 0xd6dc, 0x00c0, 0x85c3,
++	0xa006, 0x0078, 0x85c9, 0x2001, 0x0001, 0x2071, 0xab8c, 0x7218,
++	0x731c, 0x1078, 0x1653, 0x0d7f, 0x0e7f, 0x0f7f, 0x077f, 0x007c,
++	0x2001, 0xa8a4, 0x2004, 0x603e, 0x20e1, 0x0005, 0x3d18, 0x3e20,
++	0x2c10, 0x1078, 0x15fa, 0x007c, 0x2001, 0xa8a4, 0x2004, 0x603e,
++	0x0d7e, 0x6003, 0x0002, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0040,
++	0x870c, 0x603f, 0x0000, 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f,
++	0x0040, 0x8622, 0x6814, 0x6910, 0xa115, 0x0040, 0x8622, 0x6a60,
++	0xa206, 0x00c0, 0x85ff, 0x685c, 0xa106, 0x0040, 0x8622, 0x684c,
++	0xc0e4, 0x684e, 0x6847, 0x0000, 0x6863, 0x0000, 0x685f, 0x0000,
++	0x6024, 0xd0f4, 0x00c0, 0x8617, 0x697c, 0x6810, 0xa102, 0x603a,
++	0x6980, 0x6814, 0xa103, 0x6036, 0x6024, 0xc0f5, 0x6026, 0x0d7e,
++	0x6018, 0x2068, 0x683c, 0x8000, 0x683e, 0x0d7f, 0x1078, 0x8fbf,
++	0x0078, 0x870c, 0x694c, 0xd1cc, 0x0040, 0x86d1, 0x6948, 0x6838,
++	0xd0fc, 0x0040, 0x8689, 0x017e, 0x684c, 0x007e, 0x6850, 0x007e,
++	0x0f7e, 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0040,
++	0x865c, 0xa086, 0x0028, 0x00c0, 0x8643, 0x684b, 0x001c, 0x784b,
++	0x001c, 0x0078, 0x8667, 0xd1dc, 0x0040, 0x8653, 0x684b, 0x0015,
++	0x784b, 0x0015, 0x1078, 0x916c, 0x0040, 0x8651, 0x7944, 0xc1dc,
++	0x7946, 0x0078, 0x8667, 0xd1d4, 0x0040, 0x865c, 0x684b, 0x0007,
++	0x784b, 0x0007, 0x0078, 0x8667, 0x684c, 0xd0ac, 0x0040, 0x8667,
++	0x6810, 0x6914, 0xa115, 0x0040, 0x8667, 0x1078, 0x84d5, 0x6848,
++	0x784a, 0x6860, 0x7862, 0x685c, 0x785e, 0xad90, 0x000d, 0xaf98,
++	0x000d, 0x2009, 0x0020, 0x157e, 0x21a8, 0x2304, 0x2012, 0x8318,
++	0x8210, 0x00f0, 0x8675, 0x157f, 0x0f7f, 0x007f, 0x6852, 0x007f,
++	0x684e, 0x1078, 0x91f4, 0x017f, 0x2168, 0x1078, 0x13b4, 0x0078,
++	0x8706, 0x017e, 0x0f7e, 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6,
++	0x0002, 0x0040, 0x86b6, 0xa086, 0x0028, 0x00c0, 0x869d, 0x684b,
++	0x001c, 0x784b, 0x001c, 0x0078, 0x86c1, 0xd1dc, 0x0040, 0x86ad,
++	0x684b, 0x0015, 0x784b, 0x0015, 0x1078, 0x916c, 0x0040, 0x86ab,
++	0x7944, 0xc1dc, 0x7946, 0x0078, 0x86c1, 0xd1d4, 0x0040, 0x86b6,
++	0x684b, 0x0007, 0x784b, 0x0007, 0x0078, 0x86c1, 0x684c, 0xd0ac,
++	0x0040, 0x86c1, 0x6810, 0x6914, 0xa115, 0x0040, 0x86c1, 0x1078,
++	0x84d5, 0x6860, 0x7862, 0x685c, 0x785e, 0x684c, 0x784e, 0x0f7f,
++	0x1078, 0x13b4, 0x0d7f, 0x1078, 0x91f4, 0x1078, 0x89cf, 0x0078,
++	0x8706, 0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002,
++	0x0040, 0x86f7, 0xa086, 0x0028, 0x00c0, 0x86e2, 0x684b, 0x001c,
++	0x0078, 0x8704, 0xd1dc, 0x0040, 0x86f0, 0x684b, 0x0015, 0x1078,
++	0x916c, 0x0040, 0x86ee, 0x6944, 0xc1dc, 0x6946, 0x0078, 0x8704,
++	0xd1d4, 0x0040, 0x86f7, 0x684b, 0x0007, 0x0078, 0x8704, 0x684b,
++	0x0000, 0x684c, 0xd0ac, 0x0040, 0x8704, 0x6810, 0x6914, 0xa115,
++	0x0040, 0x8704, 0x1078, 0x84d5, 0x1078, 0x4a73, 0x1078, 0x8f89,
++	0x00c0, 0x870c, 0x1078, 0x772d, 0x0d7f, 0x007c, 0x1078, 0x61cd,
++	0x0078, 0x8714, 0x1078, 0x627a, 0x1078, 0x8d06, 0x0040, 0x8733,
++	0x0d7e, 0x6110, 0x2168, 0x6837, 0x0103, 0x2009, 0xa60c, 0x210c,
++	0xd18c, 0x00c0, 0x873e, 0xd184, 0x00c0, 0x873a, 0x6108, 0x694a,
++	0xa18e, 0x0029, 0x00c0, 0x872e, 0x1078, 0xa4e2, 0x6847, 0x0000,
++	0x1078, 0x4a73, 0x0d7f, 0x1078, 0x772d, 0x1078, 0x62d1, 0x1078,
++	0x639b, 0x007c, 0x684b, 0x0004, 0x0078, 0x872e, 0x684b, 0x0004,
++	0x0078, 0x872e, 0xa182, 0x0040, 0x0079, 0x8746, 0x8759, 0x8759,
++	0x8759, 0x8759, 0x8759, 0x875b, 0x8759, 0x875e, 0x8759, 0x8759,
++	0x8759, 0x8759, 0x8759, 0x8759, 0x8759, 0x8759, 0x8759, 0x8759,
++	0x8759, 0x1078, 0x1332, 0x1078, 0x772d, 0x007c, 0x007e, 0x027e,
++	0xa016, 0x1078, 0x15fa, 0x027f, 0x007f, 0x007c, 0xa182, 0x0085,
++	0x0079, 0x876a, 0x8773, 0x8771, 0x8771, 0x877f, 0x8771, 0x8771,
++	0x8771, 0x1078, 0x1332, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a,
++	0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0x027e,
++	0x057e, 0x0d7e, 0x0e7e, 0x2071, 0xab80, 0x7224, 0x6212, 0x7220,
++	0x1078, 0x8cf2, 0x0040, 0x87a4, 0x2268, 0x6800, 0xa086, 0x0000,
++	0x0040, 0x87a4, 0x6018, 0x6d18, 0xa52e, 0x00c0, 0x87a4, 0x0c7e,
++	0x2d60, 0x1078, 0x89f3, 0x0c7f, 0x0040, 0x87a4, 0x6803, 0x0002,
++	0x6007, 0x0086, 0x0078, 0x87a6, 0x6007, 0x0087, 0x6003, 0x0001,
++	0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0f7e, 0x2278, 0x1078, 0x4963,
++	0x0f7f, 0x0040, 0x87be, 0x6824, 0xd0ec, 0x0040, 0x87be, 0x0c7e,
++	0x2260, 0x603f, 0x0000, 0x1078, 0x8fbf, 0x0c7f, 0x0e7f, 0x0d7f,
++	0x057f, 0x027f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x87d4, 0x6004,
++	0xa08a, 0x0085, 0x1048, 0x1332, 0xa08a, 0x008c, 0x10c8, 0x1332,
++	0xa082, 0x0085, 0x0079, 0x87e3, 0xa186, 0x0027, 0x0040, 0x87dc,
++	0xa186, 0x0014, 0x10c0, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ec6,
++	0x1078, 0x62d1, 0x007c, 0x87ea, 0x87ec, 0x87ec, 0x87ea, 0x87ea,
++	0x87ea, 0x87ea, 0x1078, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ec6,
++	0x1078, 0x62d1, 0x007c, 0xa186, 0x0013, 0x00c0, 0x87fd, 0x6004,
++	0xa082, 0x0085, 0x2008, 0x0078, 0x8838, 0xa186, 0x0027, 0x00c0,
++	0x8820, 0x1078, 0x61cd, 0x1078, 0x2880, 0x0d7e, 0x6010, 0x2068,
++	0x1078, 0x8d06, 0x0040, 0x8816, 0x6837, 0x0103, 0x6847, 0x0000,
++	0x684b, 0x0029, 0x1078, 0x4a73, 0x1078, 0x8eb9, 0x0d7f, 0x1078,
++	0x772d, 0x1078, 0x62d1, 0x007c, 0x1078, 0x7773, 0x0078, 0x881b,
++	0xa186, 0x0014, 0x00c0, 0x881c, 0x1078, 0x61cd, 0x0d7e, 0x6010,
++	0x2068, 0x1078, 0x8d06, 0x0040, 0x8816, 0x6837, 0x0103, 0x6847,
++	0x0000, 0x684b, 0x0006, 0x6850, 0xc0ec, 0x6852, 0x0078, 0x8812,
++	0x0079, 0x883a, 0x8843, 0x8841, 0x8841, 0x8841, 0x8841, 0x8841,
++	0x885e, 0x1078, 0x1332, 0x1078, 0x61cd, 0x6030, 0xa08c, 0xff00,
++	0x810f, 0xa186, 0x0039, 0x0040, 0x8851, 0xa186, 0x0035, 0x00c0,
++	0x8855, 0x2001, 0xa8a2, 0x0078, 0x8857, 0x2001, 0xa8a3, 0x2004,
++	0x6016, 0x6003, 0x000c, 0x1078, 0x62d1, 0x007c, 0x1078, 0x61cd,
++	0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0040, 0x886c,
++	0xa186, 0x0035, 0x00c0, 0x8870, 0x2001, 0xa8a2, 0x0078, 0x8872,
++	0x2001, 0xa8a3, 0x2004, 0x6016, 0x6003, 0x000e, 0x1078, 0x62d1,
++	0x007c, 0xa182, 0x008c, 0x00c8, 0x8883, 0xa182, 0x0085, 0x0048,
++	0x8883, 0x0079, 0x8886, 0x1078, 0x7773, 0x007c, 0x888d, 0x888d,
++	0x888d, 0x888d, 0x888f, 0x88ec, 0x888d, 0x1078, 0x1332, 0x0f7e,
++	0x2c78, 0x1078, 0x4963, 0x0f7f, 0x0040, 0x88a2, 0x6030, 0xa08c,
++	0xff00, 0x810f, 0xa186, 0x0039, 0x0040, 0x8903, 0xa186, 0x0035,
++	0x0040, 0x8903, 0x0d7e, 0x1078, 0x8d06, 0x00c0, 0x88ab, 0x1078,
++	0x8eb9, 0x0078, 0x88ce, 0x6010, 0x2068, 0x684c, 0xd0e4, 0x00c0,
++	0x88b3, 0x1078, 0x8eb9, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0040,
++	0x88bf, 0x684b, 0x0006, 0xc0ec, 0x6852, 0x0078, 0x88ca, 0xd0bc,
++	0x0040, 0x88c6, 0x684b, 0x0002, 0x0078, 0x88ca, 0x684b, 0x0005,
++	0x1078, 0x8f85, 0x6847, 0x0000, 0x1078, 0x4a73, 0x2c68, 0x1078,
++	0x76c7, 0x0040, 0x88e7, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009,
++	0xab8e, 0x210c, 0x6136, 0x2009, 0xab8f, 0x210c, 0x613a, 0x6918,
++	0x611a, 0x6920, 0x6122, 0x601f, 0x0001, 0x1078, 0x5d8a, 0x2d60,
++	0x1078, 0x772d, 0x0d7f, 0x007c, 0x0f7e, 0x2c78, 0x1078, 0x4963,
++	0x0f7f, 0x0040, 0x8929, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186,
++	0x0035, 0x0040, 0x8903, 0xa186, 0x001e, 0x0040, 0x8903, 0xa186,
++	0x0039, 0x00c0, 0x8929, 0x0d7e, 0x2c68, 0x1078, 0x91bc, 0x00c0,
++	0x894d, 0x1078, 0x76c7, 0x0040, 0x8926, 0x6106, 0x6003, 0x0001,
++	0x601f, 0x0001, 0x6918, 0x611a, 0x6928, 0x612a, 0x692c, 0x612e,
++	0x6930, 0xa18c, 0x00ff, 0x6132, 0x6934, 0x6136, 0x6938, 0x613a,
++	0x6920, 0x6122, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x2d60, 0x0078,
++	0x894d, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x894d,
++	0x6837, 0x0103, 0x6850, 0xd0b4, 0x0040, 0x893c, 0xc0ec, 0x6852,
++	0x684b, 0x0006, 0x0078, 0x8947, 0xd0bc, 0x0040, 0x8943, 0x684b,
++	0x0002, 0x0078, 0x8947, 0x684b, 0x0005, 0x1078, 0x8f85, 0x6847,
++	0x0000, 0x1078, 0x4a73, 0x1078, 0x8eb9, 0x0d7f, 0x1078, 0x772d,
++	0x007c, 0x017e, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040,
++	0x8961, 0x6837, 0x0103, 0x684b, 0x0028, 0x6847, 0x0000, 0x1078,
++	0x4a73, 0x0d7f, 0x017f, 0xa186, 0x0013, 0x0040, 0x8973, 0xa186,
++	0x0014, 0x0040, 0x8973, 0xa186, 0x0027, 0x0040, 0x8973, 0x1078,
++	0x7773, 0x0078, 0x8979, 0x1078, 0x61cd, 0x1078, 0x8ec6, 0x1078,
++	0x62d1, 0x007c, 0x057e, 0x067e, 0x0d7e, 0x0f7e, 0x2029, 0x0001,
++	0xa182, 0x0101, 0x00c8, 0x8986, 0x0078, 0x8988, 0x2009, 0x0100,
++	0x2130, 0x2069, 0xab98, 0x831c, 0x2300, 0xad18, 0x2009, 0x0020,
++	0xaf90, 0x001d, 0x1078, 0x89e2, 0xa6b2, 0x0020, 0x7804, 0xa06d,
++	0x0040, 0x899c, 0x1078, 0x13b4, 0x1078, 0x138b, 0x0040, 0x89c6,
++	0x8528, 0x6837, 0x0110, 0x683b, 0x0000, 0x2d20, 0x7c06, 0xa68a,
++	0x003d, 0x00c8, 0x89b2, 0x2608, 0xad90, 0x000f, 0x1078, 0x89e2,
++	0x0078, 0x89c6, 0xa6b2, 0x003c, 0x2009, 0x003c, 0x2d78, 0xad90,
++	0x000f, 0x1078, 0x89e2, 0x0078, 0x899c, 0x0f7f, 0x852f, 0xa5ad,
++	0x0003, 0x7d36, 0xa5ac, 0x0000, 0x0078, 0x89cb, 0x0f7f, 0x852f,
++	0xa5ad, 0x0003, 0x7d36, 0x0d7f, 0x067f, 0x057f, 0x007c, 0x0f7e,
++	0x8dff, 0x0040, 0x89e0, 0x6804, 0xa07d, 0x0040, 0x89de, 0x6807,
++	0x0000, 0x1078, 0x4a73, 0x2f68, 0x0078, 0x89d3, 0x1078, 0x4a73,
++	0x0f7f, 0x007c, 0x157e, 0xa184, 0x0001, 0x0040, 0x89e8, 0x8108,
++	0x810c, 0x21a8, 0x2304, 0x8007, 0x2012, 0x8318, 0x8210, 0x00f0,
++	0x89ea, 0x157f, 0x007c, 0x067e, 0x127e, 0x2091, 0x8000, 0x2031,
++	0x0001, 0x601c, 0xa084, 0x000f, 0x1079, 0x8a0f, 0x127f, 0x067f,
++	0x007c, 0x127e, 0x2091, 0x8000, 0x067e, 0x2031, 0x0000, 0x601c,
++	0xa084, 0x000f, 0x1079, 0x8a0f, 0x067f, 0x127f, 0x007c, 0x8a29,
++	0x8a17, 0x8a24, 0x8a45, 0x8a17, 0x8a24, 0x8a45, 0x8a24, 0x1078,
++	0x1332, 0x037e, 0x2019, 0x0010, 0x1078, 0x9dc7, 0x601f, 0x0006,
++	0x6003, 0x0007, 0x037f, 0x007c, 0xa006, 0x007c, 0xa085, 0x0001,
++	0x007c, 0x0d7e, 0x86ff, 0x00c0, 0x8a40, 0x6010, 0x2068, 0x1078,
++	0x8d06, 0x0040, 0x8a42, 0xa00e, 0x2001, 0x0005, 0x1078, 0x4b51,
++	0x1078, 0x8f85, 0x1078, 0x4a73, 0x1078, 0x772d, 0xa085, 0x0001,
++	0x0d7f, 0x007c, 0xa006, 0x0078, 0x8a40, 0x6000, 0xa08a, 0x0010,
++	0x10c8, 0x1332, 0x1079, 0x8a4d, 0x007c, 0x8a5d, 0x8a82, 0x8a5f,
++	0x8aa5, 0x8a7e, 0x8a5d, 0x8a24, 0x8a29, 0x8a29, 0x8a24, 0x8a24,
++	0x8a24, 0x8a24, 0x8a24, 0x8a24, 0x8a24, 0x1078, 0x1332, 0x86ff,
++	0x00c0, 0x8a7b, 0x601c, 0xa086, 0x0006, 0x0040, 0x8a7b, 0x0d7e,
++	0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x8a70, 0x1078, 0x8f85,
++	0x0d7f, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x1078,
++	0x5d8a, 0x1078, 0x62d1, 0xa085, 0x0001, 0x007c, 0x1078, 0x1757,
++	0x0078, 0x8a5f, 0x0e7e, 0x2071, 0xa8b1, 0x7024, 0xac06, 0x00c0,
++	0x8a8b, 0x1078, 0x6fc4, 0x601c, 0xa084, 0x000f, 0xa086, 0x0006,
++	0x00c0, 0x8a9d, 0x087e, 0x097e, 0x2049, 0x0001, 0x2c40, 0x1078,
++	0x7246, 0x097f, 0x087f, 0x0078, 0x8a9f, 0x1078, 0x6ebe, 0x0e7f,
++	0x00c0, 0x8a5f, 0x1078, 0x8a24, 0x007c, 0x037e, 0x0e7e, 0x2071,
++	0xa8b1, 0x703c, 0xac06, 0x00c0, 0x8ab5, 0x2019, 0x0000, 0x1078,
++	0x7058, 0x0e7f, 0x037f, 0x0078, 0x8a5f, 0x1078, 0x738a, 0x0e7f,
++	0x037f, 0x00c0, 0x8a5f, 0x1078, 0x8a24, 0x007c, 0x0c7e, 0x601c,
++	0xa084, 0x000f, 0x1079, 0x8ac6, 0x0c7f, 0x007c, 0x8ad5, 0x8b47,
++	0x8c7f, 0x8ae0, 0x8ec6, 0x8ad5, 0x9db8, 0x772d, 0x8b47, 0x1078,
++	0x8f00, 0x00c0, 0x8ad5, 0x1078, 0x7c83, 0x007c, 0x1078, 0x61cd,
++	0x1078, 0x62d1, 0x1078, 0x772d, 0x007c, 0x6017, 0x0001, 0x007c,
++	0x1078, 0x8d06, 0x0040, 0x8ae8, 0x6010, 0xa080, 0x0019, 0x2c02,
++	0x6000, 0xa08a, 0x0010, 0x10c8, 0x1332, 0x1079, 0x8af0, 0x007c,
++	0x8b00, 0x8b02, 0x8b24, 0x8b36, 0x8b43, 0x8b00, 0x8ad5, 0x8ad5,
++	0x8ad5, 0x8b36, 0x8b36, 0x8b00, 0x8b00, 0x8b00, 0x8b00, 0x8b40,
++	0x1078, 0x1332, 0x0e7e, 0x6010, 0x2070, 0x7050, 0xc0b5, 0x7052,
++	0x2071, 0xa8b1, 0x7024, 0xac06, 0x0040, 0x8b20, 0x1078, 0x6ebe,
++	0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x2001, 0xa8a3,
++	0x2004, 0x6016, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0e7f, 0x007c,
++	0x6017, 0x0001, 0x0078, 0x8b1e, 0x0d7e, 0x6010, 0x2068, 0x6850,
++	0xc0b5, 0x6852, 0x0d7f, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f,
++	0x0002, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x007c, 0x0d7e, 0x6017,
++	0x0001, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852, 0x0d7f, 0x007c,
++	0x1078, 0x772d, 0x007c, 0x1078, 0x1757, 0x0078, 0x8b24, 0x6000,
++	0xa08a, 0x0010, 0x10c8, 0x1332, 0x1079, 0x8b4f, 0x007c, 0x8b5f,
++	0x8add, 0x8b61, 0x8b5f, 0x8b61, 0x8b61, 0x8ad6, 0x8b5f, 0x8acf,
++	0x8acf, 0x8b5f, 0x8b5f, 0x8b5f, 0x8b5f, 0x8b5f, 0x8b5f, 0x1078,
++	0x1332, 0x0d7e, 0x6018, 0x2068, 0x6804, 0xa084, 0x00ff, 0x0d7f,
++	0xa08a, 0x000c, 0x10c8, 0x1332, 0x1079, 0x8b6f, 0x007c, 0x8b7b,
++	0x8c23, 0x8b7d, 0x8bbd, 0x8b7d, 0x8bbd, 0x8b7d, 0x8b8a, 0x8b7b,
++	0x8bbd, 0x8b7b, 0x8ba7, 0x1078, 0x1332, 0x6004, 0xa08e, 0x0016,
++	0x0040, 0x8bb8, 0xa08e, 0x0004, 0x0040, 0x8bb8, 0xa08e, 0x0002,
++	0x0040, 0x8bb8, 0x6004, 0x1078, 0x8f00, 0x0040, 0x8c3e, 0xa08e,
++	0x0021, 0x0040, 0x8c42, 0xa08e, 0x0022, 0x0040, 0x8c3e, 0xa08e,
++	0x003d, 0x0040, 0x8c42, 0xa08e, 0x0039, 0x0040, 0x8c46, 0xa08e,
++	0x0035, 0x0040, 0x8c46, 0xa08e, 0x001e, 0x0040, 0x8bba, 0xa08e,
++	0x0001, 0x00c0, 0x8bb6, 0x0d7e, 0x6018, 0x2068, 0x6804, 0xa084,
++	0x00ff, 0x0d7f, 0xa086, 0x0006, 0x0040, 0x8bb8, 0x1078, 0x2880,
++	0x1078, 0x7c83, 0x1078, 0x8ec6, 0x007c, 0x0c7e, 0x0d7e, 0x6104,
++	0xa186, 0x0016, 0x0040, 0x8c13, 0xa186, 0x0002, 0x00c0, 0x8be6,
++	0x6018, 0x2068, 0x68a0, 0xd0bc, 0x00c0, 0x8c6a, 0x6840, 0xa084,
++	0x00ff, 0xa005, 0x0040, 0x8be6, 0x8001, 0x6842, 0x6013, 0x0000,
++	0x601f, 0x0007, 0x6017, 0x0398, 0x1078, 0x76c7, 0x0040, 0x8be6,
++	0x2d00, 0x601a, 0x601f, 0x0001, 0x0078, 0x8c13, 0x0d7f, 0x0c7f,
++	0x6004, 0xa08e, 0x0002, 0x00c0, 0x8c04, 0x6018, 0xa080, 0x0028,
++	0x2004, 0xa086, 0x007e, 0x00c0, 0x8c04, 0x2009, 0xa633, 0x2104,
++	0xc085, 0x200a, 0x0e7e, 0x2071, 0xa600, 0x1078, 0x42b8, 0x0e7f,
++	0x1078, 0x7c83, 0x0078, 0x8c08, 0x1078, 0x7c83, 0x1078, 0x2880,
++	0x0e7e, 0x127e, 0x2091, 0x8000, 0x1078, 0x28a6, 0x127f, 0x0e7f,
++	0x1078, 0x8ec6, 0x007c, 0x2001, 0x0002, 0x1078, 0x4502, 0x6003,
++	0x0001, 0x6007, 0x0002, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0d7f,
++	0x0c7f, 0x0078, 0x8c12, 0x0c7e, 0x0d7e, 0x6104, 0xa186, 0x0016,
++	0x0040, 0x8c13, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005,
++	0x0040, 0x8be6, 0x8001, 0x6842, 0x6003, 0x0001, 0x1078, 0x5dd7,
++	0x1078, 0x62d1, 0x0d7f, 0x0c7f, 0x0078, 0x8c12, 0x1078, 0x7c83,
++	0x0078, 0x8bba, 0x1078, 0x7ca6, 0x0078, 0x8bba, 0x0d7e, 0x2c68,
++	0x6104, 0x1078, 0x91bc, 0x0d7f, 0x0040, 0x8c52, 0x1078, 0x772d,
++	0x0078, 0x8c69, 0x6004, 0x8007, 0x6130, 0xa18c, 0x00ff, 0xa105,
++	0x6032, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x6038,
++	0x600a, 0x2001, 0xa8a3, 0x2004, 0x6016, 0x1078, 0x5d8a, 0x1078,
++	0x62d1, 0x007c, 0x0d7f, 0x0c7f, 0x1078, 0x7c83, 0x1078, 0x2880,
++	0x0e7e, 0x127e, 0x2091, 0x8000, 0x1078, 0x28a6, 0x6013, 0x0000,
++	0x601f, 0x0007, 0x6017, 0x0398, 0x127f, 0x0e7f, 0x007c, 0x6000,
++	0xa08a, 0x0010, 0x10c8, 0x1332, 0x1079, 0x8c87, 0x007c, 0x8c97,
++	0x8c97, 0x8c97, 0x8c97, 0x8c97, 0x8c97, 0x8c97, 0x8c97, 0x8c97,
++	0x8ad5, 0x8c97, 0x8add, 0x8c99, 0x8add, 0x8ca7, 0x8c97, 0x1078,
++	0x1332, 0x6004, 0xa086, 0x008b, 0x0040, 0x8ca7, 0x6007, 0x008b,
++	0x6003, 0x000d, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x007c, 0x1078,
++	0x8eb9, 0x1078, 0x8d06, 0x0040, 0x8cdf, 0x1078, 0x2880, 0x0d7e,
++	0x1078, 0x8d06, 0x0040, 0x8cc1, 0x6010, 0x2068, 0x6837, 0x0103,
++	0x684b, 0x0006, 0x6847, 0x0000, 0x6850, 0xc0ed, 0x6852, 0x1078,
++	0x4a73, 0x2c68, 0x1078, 0x76c7, 0x0040, 0x8ccf, 0x6818, 0x601a,
++	0x0c7e, 0x2d60, 0x1078, 0x8ec6, 0x0c7f, 0x0078, 0x8cd0, 0x2d60,
++	0x0d7f, 0x6013, 0x0000, 0x601f, 0x0001, 0x6007, 0x0001, 0x6003,
++	0x0001, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0078, 0x8cf1, 0x6030,
++	0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0040, 0x8ceb, 0xa186,
++	0x0035, 0x00c0, 0x8cef, 0x1078, 0x2880, 0x0078, 0x8cc1, 0x1078,
++	0x8ec6, 0x007c, 0xa284, 0x000f, 0x00c0, 0x8d03, 0xa282, 0xad00,
++	0x0048, 0x8d03, 0x2001, 0xa616, 0x2004, 0xa202, 0x00c8, 0x8d03,
++	0xa085, 0x0001, 0x007c, 0xa006, 0x0078, 0x8d02, 0x027e, 0x0e7e,
++	0x2071, 0xa600, 0x6210, 0x705c, 0xa202, 0x0048, 0x8d18, 0x7060,
++	0xa202, 0x00c8, 0x8d18, 0xa085, 0x0001, 0x0e7f, 0x027f, 0x007c,
++	0xa006, 0x0078, 0x8d15, 0x0e7e, 0x0c7e, 0x037e, 0x007e, 0x127e,
++	0x2091, 0x8000, 0x2061, 0xad00, 0x2071, 0xa600, 0x7348, 0x7064,
++	0xa302, 0x00c8, 0x8d45, 0x601c, 0xa206, 0x00c0, 0x8d3d, 0x1078,
++	0x902b, 0x0040, 0x8d3d, 0x1078, 0x8f00, 0x00c0, 0x8d39, 0x1078,
++	0x7c83, 0x0c7e, 0x1078, 0x772d, 0x0c7f, 0xace0, 0x0010, 0x7058,
++	0xac02, 0x00c8, 0x8d45, 0x0078, 0x8d26, 0x127f, 0x007f, 0x037f,
++	0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x0c7e, 0x017e, 0xa188, 0xa735,
++	0x210c, 0x81ff, 0x0040, 0x8d59, 0x2061, 0xa9b3, 0x611a, 0x1078,
++	0x2880, 0xa006, 0x0078, 0x8d5e, 0xa085, 0x0001, 0x017f, 0x0c7f,
++	0x0e7f, 0x007c, 0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000, 0x0c7e,
++	0x1078, 0x76c7, 0x057f, 0x0040, 0x8d7b, 0x6612, 0x651a, 0x601f,
++	0x0003, 0x2009, 0x004b, 0x1078, 0x775c, 0xa085, 0x0001, 0x127f,
++	0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8d77, 0x0c7e, 0x057e,
++	0x127e, 0x2091, 0x8000, 0x62a0, 0x0c7e, 0x1078, 0x76c7, 0x057f,
++	0x0040, 0x8da9, 0x6013, 0x0000, 0x651a, 0x601f, 0x0003, 0x0c7e,
++	0x2560, 0x1078, 0x47e9, 0x0c7f, 0x1078, 0x5f01, 0x077e, 0x2039,
++	0x0000, 0x1078, 0x5e0a, 0x2c08, 0x1078, 0x9f8b, 0x077f, 0x2009,
++	0x004c, 0x1078, 0x775c, 0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f,
++	0x007c, 0xa006, 0x0078, 0x8da5, 0x0f7e, 0x0c7e, 0x047e, 0x0c7e,
++	0x1078, 0x76c7, 0x2c78, 0x0c7f, 0x0040, 0x8dc6, 0x7e12, 0x2c00,
++	0x781a, 0x781f, 0x0003, 0x2021, 0x0005, 0x1078, 0x8e11, 0x2f60,
++	0x2009, 0x004d, 0x1078, 0x775c, 0xa085, 0x0001, 0x047f, 0x0c7f,
++	0x0f7f, 0x007c, 0x0f7e, 0x0c7e, 0x047e, 0x0c7e, 0x1078, 0x76c7,
++	0x2c78, 0x0c7f, 0x0040, 0x8de4, 0x7e12, 0x2c00, 0x781a, 0x781f,
++	0x0003, 0x2021, 0x0005, 0x1078, 0x8e11, 0x2f60, 0x2009, 0x004e,
++	0x1078, 0x775c, 0xa085, 0x0001, 0x047f, 0x0c7f, 0x0f7f, 0x007c,
++	0x0f7e, 0x0c7e, 0x047e, 0x0c7e, 0x1078, 0x76c7, 0x2c78, 0x0c7f,
++	0x0040, 0x8e0d, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021,
++	0x0004, 0x1078, 0x8e11, 0x2001, 0xa89d, 0x2004, 0xd0fc, 0x0040,
++	0x8e06, 0x2f60, 0x1078, 0x772d, 0x0078, 0x8e0b, 0x2f60, 0x2009,
++	0x0052, 0x1078, 0x775c, 0xa085, 0x0001, 0x047f, 0x0c7f, 0x0f7f,
++	0x007c, 0x097e, 0x077e, 0x127e, 0x2091, 0x8000, 0x1078, 0x4775,
++	0x0040, 0x8e1e, 0x2001, 0x8e16, 0x0078, 0x8e24, 0x1078, 0x4739,
++	0x0040, 0x8e2d, 0x2001, 0x8e1e, 0x007e, 0xa00e, 0x2400, 0x1078,
++	0x4b51, 0x1078, 0x4a73, 0x007f, 0x007a, 0x2418, 0x1078, 0x6161,
++	0x62a0, 0x087e, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, 0x1078,
++	0x5f1b, 0x087f, 0x1078, 0x5e0a, 0x2f08, 0x2648, 0x1078, 0x9f8b,
++	0x613c, 0x81ff, 0x1040, 0x5fdb, 0x1078, 0x62d1, 0x127f, 0x077f,
++	0x097f, 0x007c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078,
++	0x76c7, 0x017f, 0x0040, 0x8e63, 0x660a, 0x611a, 0x601f, 0x0001,
++	0x2d00, 0x6012, 0x2009, 0x001f, 0x1078, 0x775c, 0xa085, 0x0001,
++	0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8e60, 0x0c7e, 0x127e,
++	0x2091, 0x8000, 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x8e7f,
++	0x660a, 0x611a, 0x601f, 0x0008, 0x2d00, 0x6012, 0x2009, 0x0021,
++	0x1078, 0x775c, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006,
++	0x0078, 0x8e7c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078,
++	0x76c7, 0x017f, 0x0040, 0x8e9b, 0x660a, 0x611a, 0x601f, 0x0001,
++	0x2d00, 0x6012, 0x2009, 0x003d, 0x1078, 0x775c, 0xa085, 0x0001,
++	0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8e98, 0x0c7e, 0x127e,
++	0x2091, 0x8000, 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x8eb6,
++	0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0000, 0x1078,
++	0x775c, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078,
++	0x8eb3, 0x027e, 0x0d7e, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0040,
++	0x8ec3, 0x8211, 0x6a3e, 0x0d7f, 0x027f, 0x007c, 0x007e, 0x6000,
++	0xa086, 0x0000, 0x0040, 0x8ed8, 0x6013, 0x0000, 0x601f, 0x0007,
++	0x2001, 0xa8a3, 0x2004, 0x6016, 0x1078, 0xa495, 0x603f, 0x0000,
++	0x007f, 0x007c, 0x067e, 0x0c7e, 0x0d7e, 0x2031, 0xa653, 0x2634,
++	0xd6e4, 0x0040, 0x8ee8, 0x6618, 0x2660, 0x6e48, 0x1078, 0x46e7,
++	0x0d7f, 0x0c7f, 0x067f, 0x007c, 0x007e, 0x017e, 0x6004, 0xa08e,
++	0x0002, 0x0040, 0x8efd, 0xa08e, 0x0003, 0x0040, 0x8efd, 0xa08e,
++	0x0004, 0x0040, 0x8efd, 0xa085, 0x0001, 0x017f, 0x007f, 0x007c,
++	0x007e, 0x0d7e, 0x6010, 0xa06d, 0x0040, 0x8f0d, 0x6838, 0xd0fc,
++	0x0040, 0x8f0d, 0xa006, 0x0078, 0x8f0f, 0xa085, 0x0001, 0x0d7f,
++	0x007f, 0x007c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078,
++	0x76c7, 0x017f, 0x0040, 0x8f2c, 0x611a, 0x601f, 0x0001, 0x2d00,
++	0x6012, 0x1078, 0x2880, 0x2009, 0x0028, 0x1078, 0x775c, 0xa085,
++	0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8f29, 0xa186,
++	0x0015, 0x00c0, 0x8f44, 0x2011, 0xa620, 0x2204, 0xa086, 0x0074,
++	0x00c0, 0x8f44, 0x1078, 0x7f91, 0x6003, 0x0001, 0x6007, 0x0029,
++	0x1078, 0x5dd7, 0x0078, 0x8f48, 0x1078, 0x7c83, 0x1078, 0x772d,
++	0x007c, 0xa186, 0x0016, 0x00c0, 0x8f53, 0x2001, 0x0004, 0x1078,
++	0x4502, 0x0078, 0x8f74, 0xa186, 0x0015, 0x00c0, 0x8f78, 0x2011,
++	0xa620, 0x2204, 0xa086, 0x0014, 0x00c0, 0x8f78, 0x0d7e, 0x6018,
++	0x2068, 0x1078, 0x4649, 0x0d7f, 0x1078, 0x8043, 0x00c0, 0x8f78,
++	0x0d7e, 0x6018, 0x2068, 0x6890, 0x0d7f, 0xa005, 0x0040, 0x8f78,
++	0x2001, 0x0006, 0x1078, 0x4502, 0x1078, 0x77f8, 0x0078, 0x8f7c,
++	0x1078, 0x7c83, 0x1078, 0x772d, 0x007c, 0x6848, 0xa086, 0x0005,
++	0x00c0, 0x8f84, 0x1078, 0x8f85, 0x007c, 0x6850, 0xc0ad, 0x6852,
++	0x007c, 0x0e7e, 0x2071, 0xab8c, 0x7014, 0xd0e4, 0x0040, 0x8f9a,
++	0x6013, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x1078, 0x5d8a,
++	0x1078, 0x62d1, 0x0e7f, 0x007c, 0x0c7e, 0x0f7e, 0x2c78, 0x1078,
++	0x4963, 0x0f7f, 0x0040, 0x8fa9, 0x601c, 0xa084, 0x000f, 0x1079,
++	0x8fab, 0x0c7f, 0x007c, 0x8ad5, 0x8fb6, 0x8fb9, 0x8fbc, 0xa25d,
++	0xa279, 0xa27c, 0x8ad5, 0x8ad5, 0x1078, 0x1332, 0x0005, 0x0005,
++	0x007c, 0x0005, 0x0005, 0x007c, 0x1078, 0x8fbf, 0x007c, 0x0f7e,
++	0x2c78, 0x1078, 0x4963, 0x0040, 0x8fee, 0x1078, 0x76c7, 0x00c0,
++	0x8fcf, 0x2001, 0xa8a4, 0x2004, 0x783e, 0x0078, 0x8fee, 0x7818,
++	0x601a, 0x781c, 0xa086, 0x0003, 0x0040, 0x8fdc, 0x7808, 0x6036,
++	0x2f00, 0x603a, 0x0078, 0x8fe0, 0x7808, 0x603a, 0x2f00, 0x6036,
++	0x602a, 0x601f, 0x0001, 0x6007, 0x0035, 0x6003, 0x0001, 0x7920,
++	0x6122, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x2f60, 0x0f7f, 0x007c,
++	0x017e, 0x0f7e, 0x682c, 0x6032, 0xa08e, 0x0001, 0x0040, 0x9001,
++	0xa086, 0x0005, 0x0040, 0x9005, 0xa006, 0x602a, 0x602e, 0x0078,
++	0x9016, 0x6824, 0xc0f4, 0xc0d5, 0x6826, 0x6810, 0x2078, 0x787c,
++	0x6938, 0xa102, 0x7880, 0x6934, 0xa103, 0x00c8, 0x8ffc, 0x6834,
++	0x602a, 0x6838, 0xa084, 0xfffc, 0x683a, 0x602e, 0x2d00, 0x6036,
++	0x6808, 0x603a, 0x6918, 0x611a, 0x6920, 0x6122, 0x601f, 0x0001,
++	0x6007, 0x0039, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x6803, 0x0002,
++	0x0f7f, 0x017f, 0x007c, 0x007e, 0x017e, 0x6004, 0xa08e, 0x0034,
++	0x0040, 0x9050, 0xa08e, 0x0035, 0x0040, 0x9050, 0xa08e, 0x0036,
++	0x0040, 0x9050, 0xa08e, 0x0037, 0x0040, 0x9050, 0xa08e, 0x0038,
++	0x0040, 0x9050, 0xa08e, 0x0039, 0x0040, 0x9050, 0xa08e, 0x003a,
++	0x0040, 0x9050, 0xa08e, 0x003b, 0x0040, 0x9050, 0xa085, 0x0001,
++	0x017f, 0x007f, 0x007c, 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x00c0,
++	0x905d, 0xa085, 0x0001, 0x0078, 0x906c, 0x6024, 0xd0f4, 0x00c0,
++	0x906b, 0xc0f5, 0x6026, 0x6010, 0x2078, 0x7828, 0x603a, 0x782c,
++	0x6036, 0x1078, 0x1757, 0xa006, 0x0f7f, 0x007c, 0x007e, 0x017e,
++	0x027e, 0x037e, 0x0e7e, 0x2001, 0xa89e, 0x200c, 0x8000, 0x2014,
++	0x2001, 0x0032, 0x1078, 0x5c1c, 0x2001, 0xa8a2, 0x82ff, 0x00c0,
++	0x9083, 0x2011, 0x0014, 0x2202, 0x2001, 0xa8a0, 0x200c, 0x8000,
++	0x2014, 0x2071, 0xa88d, 0x711a, 0x721e, 0x2001, 0x0064, 0x1078,
++	0x5c1c, 0x2001, 0xa8a3, 0x82ff, 0x00c0, 0x9098, 0x2011, 0x0014,
++	0x2202, 0x2009, 0xa8a4, 0xa280, 0x000a, 0x200a, 0x1078, 0x498b,
++	0x0e7f, 0x037f, 0x027f, 0x017f, 0x007f, 0x007c, 0x007e, 0x0e7e,
++	0x2001, 0xa8a2, 0x2003, 0x0028, 0x2001, 0xa8a3, 0x2003, 0x0014,
++	0x2071, 0xa88d, 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, 0xa8a4,
++	0x2003, 0x001e, 0x0e7f, 0x007f, 0x007c, 0x0c7e, 0x127e, 0x2091,
++	0x8000, 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x90d5, 0x611a,
++	0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0033, 0x1078, 0x775c,
++	0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x90d2,
++	0x0d7e, 0x0e7e, 0x0f7e, 0x2071, 0xa600, 0xa186, 0x0015, 0x00c0,
++	0x9107, 0x7080, 0xa086, 0x0018, 0x00c0, 0x9107, 0x6010, 0x2068,
++	0x6a3c, 0xd2e4, 0x00c0, 0x90fb, 0x2c78, 0x1078, 0x6490, 0x0040,
++	0x910f, 0x706c, 0x6a50, 0xa206, 0x00c0, 0x9103, 0x7070, 0x6a54,
++	0xa206, 0x00c0, 0x9103, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009,
++	0x0000, 0x1078, 0x28c8, 0x1078, 0x77f8, 0x0078, 0x910b, 0x1078,
++	0x7c83, 0x1078, 0x772d, 0x0f7f, 0x0e7f, 0x0d7f, 0x007c, 0x7050,
++	0xa080, 0x29c0, 0x2004, 0x6a54, 0xa206, 0x0040, 0x90fb, 0x0078,
++	0x9103, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, 0x76c7,
++	0x017f, 0x0040, 0x9131, 0x611a, 0x601f, 0x0001, 0x2d00, 0x6012,
++	0x2009, 0x0043, 0x1078, 0x775c, 0xa085, 0x0001, 0x127f, 0x0c7f,
++	0x007c, 0xa006, 0x0078, 0x912e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2071,
++	0xa600, 0xa186, 0x0015, 0x00c0, 0x915a, 0x7080, 0xa086, 0x0004,
++	0x00c0, 0x915a, 0x6010, 0xa0e8, 0x000f, 0x2c78, 0x1078, 0x6490,
++	0x0040, 0x9162, 0x706c, 0x6a08, 0xa206, 0x00c0, 0x9156, 0x7070,
++	0x6a0c, 0xa206, 0x00c0, 0x9156, 0x1078, 0x2880, 0x1078, 0x77f8,
++	0x0078, 0x915e, 0x1078, 0x7c83, 0x1078, 0x772d, 0x0f7f, 0x0e7f,
++	0x0d7f, 0x007c, 0x7050, 0xa080, 0x29c0, 0x2004, 0x6a0c, 0xa206,
++	0x0040, 0x9154, 0x0078, 0x9156, 0x017e, 0x027e, 0x684c, 0xd0ac,
++	0x0040, 0x9184, 0x6914, 0x6a10, 0x2100, 0xa205, 0x0040, 0x9184,
++	0x6860, 0xa106, 0x00c0, 0x9180, 0x685c, 0xa206, 0x0040, 0x9184,
++	0x6962, 0x6a5e, 0xa085, 0x0001, 0x027f, 0x017f, 0x007c, 0x0e7e,
++	0x127e, 0x2071, 0xa600, 0x2091, 0x8000, 0x7548, 0xa582, 0x0001,
++	0x0048, 0x91b9, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0040,
++	0x91a5, 0xace0, 0x0010, 0x7058, 0xac02, 0x00c8, 0x91a1, 0x0078,
++	0x9194, 0x2061, 0xad00, 0x0078, 0x9194, 0x6003, 0x0008, 0x8529,
++	0x754a, 0xaca8, 0x0010, 0x7058, 0xa502, 0x00c8, 0x91b5, 0x754e,
++	0xa085, 0x0001, 0x127f, 0x0e7f, 0x007c, 0x704f, 0xad00, 0x0078,
++	0x91b0, 0xa006, 0x0078, 0x91b2, 0x0c7e, 0x027e, 0x017e, 0xa186,
++	0x0035, 0x0040, 0x91c6, 0x6a34, 0x0078, 0x91c7, 0x6a28, 0x1078,
++	0x8cf2, 0x0040, 0x91f0, 0x2260, 0x611c, 0xa186, 0x0003, 0x0040,
++	0x91d5, 0xa186, 0x0006, 0x00c0, 0x91ec, 0x6834, 0xa206, 0x0040,
++	0x91e4, 0x6838, 0xa206, 0x00c0, 0x91ec, 0x6108, 0x6834, 0xa106,
++	0x00c0, 0x91ec, 0x0078, 0x91e9, 0x6008, 0x6938, 0xa106, 0x00c0,
++	0x91ec, 0x6018, 0x6918, 0xa106, 0x017f, 0x027f, 0x0c7f, 0x007c,
++	0xa085, 0x0001, 0x0078, 0x91ec, 0x6944, 0xd1cc, 0x0040, 0x920d,
++	0xa18c, 0x00ff, 0xa18e, 0x0002, 0x00c0, 0x920d, 0xad88, 0x001e,
++	0x210c, 0xa18c, 0x0f00, 0x810f, 0xa18e, 0x0001, 0x00c0, 0x920d,
++	0x6810, 0x6914, 0xa115, 0x10c0, 0x84d5, 0x007c, 0x067e, 0x6000,
++	0xa0b2, 0x0010, 0x10c8, 0x1332, 0x1079, 0x9218, 0x067f, 0x007c,
++	0x9228, 0x96df, 0x97fb, 0x9228, 0x9228, 0x9228, 0x9228, 0x9228,
++	0x9262, 0x988e, 0x9228, 0x9228, 0x9228, 0x9228, 0x9228, 0x9228,
++	0x1078, 0x1332, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x1332,
++	0x1079, 0x9234, 0x067f, 0x007c, 0x9244, 0x9d53, 0x9244, 0x9244,
++	0x9244, 0x9244, 0x9244, 0x9244, 0x9d11, 0x9da1, 0x9244, 0xa3b0,
++	0xa3e4, 0xa3b0, 0xa3e4, 0x9244, 0x1078, 0x1332, 0x067e, 0x6000,
++	0xa0b2, 0x0010, 0x10c8, 0x1332, 0x1079, 0x9250, 0x067f, 0x007c,
++	0x9260, 0x99eb, 0x9ac7, 0x9af5, 0x9b70, 0x9260, 0x9c76, 0x9c1e,
++	0x989a, 0x9ce5, 0x9cfb, 0x9260, 0x9260, 0x9260, 0x9260, 0x9260,
++	0x1078, 0x1332, 0xa1b2, 0x0044, 0x10c8, 0x1332, 0x2100, 0x0079,
++	0x9269, 0x92a9, 0x9498, 0x92a9, 0x92a9, 0x92a9, 0x94a0, 0x92a9,
++	0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9,
++	0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9,
++	0x92ab, 0x9311, 0x9320, 0x9377, 0x9396, 0x9415, 0x9485, 0x92a9,
++	0x92a9, 0x94a4, 0x92a9, 0x92a9, 0x94b7, 0x94c2, 0x92a9, 0x92a9,
++	0x92a9, 0x92a9, 0x92a9, 0x94fa, 0x92a9, 0x92a9, 0x9509, 0x92a9,
++	0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x9522, 0x92a9, 0x92a9,
++	0x92a9, 0x95af, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9,
++	0x9629, 0x1078, 0x1332, 0x1078, 0x4967, 0x00c0, 0x92bb, 0x2001,
++	0xa633, 0x2004, 0xd0cc, 0x00c0, 0x92bb, 0xa084, 0x0009, 0xa086,
++	0x0008, 0x00c0, 0x92c3, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013,
++	0x0000, 0x0078, 0x9493, 0x1078, 0x4957, 0x0e7e, 0x0c7e, 0x037e,
++	0x027e, 0x017e, 0x6218, 0x2270, 0x72a0, 0x027e, 0x2019, 0x0029,
++	0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a, 0x2c08,
++	0x1078, 0x9f8b, 0x077f, 0x017f, 0x2e60, 0x1078, 0x47e9, 0x017f,
++	0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x6618, 0x0c7e, 0x2660, 0x1078,
++	0x45d6, 0x0c7f, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082,
++	0x0006, 0x0048, 0x9303, 0x1078, 0x9ebf, 0x00c0, 0x9371, 0x1078,
++	0x9e50, 0x00c0, 0x92ff, 0x6007, 0x0008, 0x0078, 0x9493, 0x6007,
++	0x0009, 0x0078, 0x9493, 0x1078, 0xa09f, 0x0040, 0x930d, 0x1078,
++	0x9ebf, 0x0040, 0x92f7, 0x0078, 0x9371, 0x6013, 0x1900, 0x0078,
++	0x92ff, 0x1078, 0x29bb, 0x00c0, 0x9664, 0x6106, 0x1078, 0x9e05,
++	0x6007, 0x0006, 0x0078, 0x9493, 0x6007, 0x0007, 0x0078, 0x9493,
++	0x1078, 0xa41c, 0x00c0, 0x9664, 0x1078, 0x29bb, 0x00c0, 0x9664,
++	0x0d7e, 0x6618, 0x2668, 0x6e04, 0xa684, 0x00ff, 0xa082, 0x0006,
++	0x00c8, 0x9336, 0x2001, 0x0001, 0x1078, 0x44ee, 0xa6b4, 0xff00,
++	0x8637, 0xa686, 0x0006, 0x0040, 0x9353, 0xa686, 0x0004, 0x0040,
++	0x9353, 0x6e04, 0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0040, 0x9353,
++	0xa686, 0x0004, 0x0040, 0x9353, 0xa686, 0x0005, 0x0040, 0x9353,
++	0x0d7f, 0x0078, 0x9371, 0x1078, 0x9f25, 0x00c0, 0x936c, 0xa686,
++	0x0006, 0x00c0, 0x9365, 0x027e, 0x6218, 0xa290, 0x0028, 0x2214,
++	0x2009, 0x0000, 0x1078, 0x28c8, 0x027f, 0x1078, 0x4649, 0x6007,
++	0x000a, 0x0d7f, 0x0078, 0x9493, 0x6007, 0x000b, 0x0d7f, 0x0078,
++	0x9493, 0x1078, 0x2880, 0x6007, 0x0001, 0x0078, 0x9493, 0x1078,
++	0xa41c, 0x00c0, 0x9664, 0x1078, 0x29bb, 0x00c0, 0x9664, 0x6618,
++	0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa686, 0x0707, 0x0040, 0x9371,
++	0x027e, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x1078,
++	0x28c8, 0x027f, 0x6007, 0x000c, 0x0078, 0x9493, 0x1078, 0x4967,
++	0x00c0, 0x93a3, 0x2001, 0xa633, 0x2004, 0xa084, 0x0009, 0xa086,
++	0x0008, 0x00c0, 0x93ab, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013,
++	0x0000, 0x0078, 0x9493, 0x1078, 0x4957, 0x6618, 0xa6b0, 0x0001,
++	0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x93ef, 0xa6b4,
++	0xff00, 0x8637, 0xa686, 0x0004, 0x0040, 0x93c2, 0xa686, 0x0006,
++	0x00c0, 0x9371, 0x1078, 0x9f34, 0x00c0, 0x93ca, 0x6007, 0x000e,
++	0x0078, 0x9493, 0x047e, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4,
++	0x00ff, 0x8427, 0x047e, 0x1078, 0x2880, 0x047f, 0x017e, 0xa006,
++	0x2009, 0xa653, 0x210c, 0xd1a4, 0x0040, 0x93e9, 0x2009, 0x0029,
++	0x1078, 0xa21d, 0x6018, 0x0d7e, 0x2068, 0x6800, 0xc0e5, 0x6802,
++	0x0d7f, 0x017f, 0x047f, 0x6007, 0x0001, 0x0078, 0x9493, 0x2001,
++	0x0001, 0x1078, 0x44ee, 0x157e, 0x017e, 0x027e, 0x037e, 0x20a9,
++	0x0004, 0x2019, 0xa605, 0x2011, 0xab90, 0x1078, 0x80de, 0x037f,
++	0x027f, 0x017f, 0x157f, 0xa005, 0x0040, 0x940f, 0xa6b4, 0xff00,
++	0x8637, 0xa686, 0x0006, 0x0040, 0x93c2, 0x0078, 0x9371, 0x6013,
++	0x1900, 0x6007, 0x0009, 0x0078, 0x9493, 0x1078, 0x4967, 0x00c0,
++	0x9422, 0x2001, 0xa633, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008,
++	0x00c0, 0x942a, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, 0x0000,
++	0x0078, 0x9493, 0x1078, 0x4957, 0x6618, 0xa6b0, 0x0001, 0x2634,
++	0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x9472, 0xa6b4, 0xff00,
++	0x8637, 0xa686, 0x0004, 0x0040, 0x9441, 0xa686, 0x0006, 0x00c0,
++	0x9371, 0x1078, 0x9f5f, 0x00c0, 0x944d, 0x1078, 0x9e50, 0x00c0,
++	0x944d, 0x6007, 0x0010, 0x0078, 0x9493, 0x047e, 0x6418, 0xa4a0,
++	0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, 0x047e, 0x1078, 0x2880,
++	0x047f, 0x017e, 0xa006, 0x2009, 0xa653, 0x210c, 0xd1a4, 0x0040,
++	0x946c, 0x2009, 0x0029, 0x1078, 0xa21d, 0x6018, 0x0d7e, 0x2068,
++	0x6800, 0xc0e5, 0x6802, 0x0d7f, 0x017f, 0x047f, 0x6007, 0x0001,
++	0x0078, 0x9493, 0x1078, 0xa09f, 0x0040, 0x947f, 0xa6b4, 0xff00,
++	0x8637, 0xa686, 0x0006, 0x0040, 0x9441, 0x0078, 0x9371, 0x6013,
++	0x1900, 0x6007, 0x0009, 0x0078, 0x9493, 0x1078, 0x29bb, 0x00c0,
++	0x9664, 0x1078, 0xa41c, 0x00c0, 0x9664, 0x1078, 0x9667, 0x00c0,
++	0x9371, 0x6007, 0x0012, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x007c,
++	0x6007, 0x0001, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x0078, 0x9497,
++	0x6007, 0x0005, 0x0078, 0x949a, 0x1078, 0xa41c, 0x00c0, 0x9664,
++	0x1078, 0x29bb, 0x00c0, 0x9664, 0x1078, 0x9667, 0x00c0, 0x9371,
++	0x6007, 0x0020, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x007c, 0x1078,
++	0x29bb, 0x00c0, 0x9664, 0x6007, 0x0023, 0x6003, 0x0001, 0x1078,
++	0x5dd7, 0x007c, 0x1078, 0xa41c, 0x00c0, 0x9664, 0x1078, 0x29bb,
++	0x00c0, 0x9664, 0x1078, 0x9667, 0x00c0, 0x9371, 0x017e, 0x027e,
++	0x2011, 0xab90, 0x2214, 0x2c08, 0xa006, 0x1078, 0xa1e6, 0x00c0,
++	0x94e9, 0x2160, 0x6007, 0x0026, 0x6013, 0x1700, 0x2011, 0xab89,
++	0x2214, 0xa296, 0xffff, 0x00c0, 0x94f3, 0x6007, 0x0025, 0x0078,
++	0x94f3, 0x6004, 0xa086, 0x0024, 0x00c0, 0x94f0, 0x1078, 0x772d,
++	0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x027f,
++	0x017f, 0x007c, 0x1078, 0x29bb, 0x00c0, 0x9664, 0x6106, 0x1078,
++	0x9687, 0x6007, 0x002b, 0x0078, 0x9493, 0x6007, 0x002c, 0x0078,
++	0x9493, 0x1078, 0xa41c, 0x00c0, 0x9664, 0x1078, 0x29bb, 0x00c0,
++	0x9664, 0x1078, 0x9667, 0x00c0, 0x9371, 0x6106, 0x1078, 0x968c,
++	0x00c0, 0x951e, 0x6007, 0x002e, 0x0078, 0x9493, 0x6007, 0x002f,
++	0x0078, 0x9493, 0x1078, 0x29bb, 0x00c0, 0x9664, 0x0e7e, 0x0d7e,
++	0x0c7e, 0x6018, 0xa080, 0x0001, 0x200c, 0xa184, 0x00ff, 0xa086,
++	0x0006, 0x0040, 0x953f, 0xa184, 0xff00, 0x8007, 0xa086, 0x0006,
++	0x0040, 0x953f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0078, 0x9498, 0x2001,
++	0xa672, 0x2004, 0xd0e4, 0x0040, 0x95ab, 0x2071, 0xab8c, 0x7010,
++	0x6036, 0x7014, 0x603a, 0x7108, 0x720c, 0x2001, 0xa653, 0x2004,
++	0xd0a4, 0x0040, 0x955d, 0x6018, 0x2068, 0x6810, 0xa106, 0x00c0,
++	0x955d, 0x6814, 0xa206, 0x0040, 0x9581, 0x2001, 0xa653, 0x2004,
++	0xd0ac, 0x00c0, 0x959f, 0x2069, 0xa600, 0x6870, 0xa206, 0x00c0,
++	0x959f, 0x686c, 0xa106, 0x00c0, 0x959f, 0x7210, 0x1078, 0x8cf2,
++	0x0040, 0x95a5, 0x1078, 0xa28e, 0x0040, 0x95a5, 0x622a, 0x6007,
++	0x0036, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x0c7f, 0x0d7f, 0x0e7f,
++	0x007c, 0x7214, 0xa286, 0xffff, 0x0040, 0x9593, 0x1078, 0x8cf2,
++	0x0040, 0x95a5, 0xa280, 0x0002, 0x2004, 0x7110, 0xa106, 0x00c0,
++	0x95a5, 0x0078, 0x956e, 0x7210, 0x2c08, 0xa085, 0x0001, 0x1078,
++	0xa1e6, 0x2c10, 0x2160, 0x0040, 0x95a5, 0x0078, 0x956e, 0x6007,
++	0x0037, 0x6013, 0x1500, 0x0078, 0x9579, 0x6007, 0x0037, 0x6013,
++	0x1700, 0x0078, 0x9579, 0x6007, 0x0012, 0x0078, 0x9579, 0x1078,
++	0x29bb, 0x00c0, 0x9664, 0x6018, 0xa080, 0x0001, 0x2004, 0xa084,
++	0xff00, 0x8007, 0xa086, 0x0006, 0x00c0, 0x9498, 0x0e7e, 0x0d7e,
++	0x0c7e, 0x2001, 0xa672, 0x2004, 0xd0e4, 0x0040, 0x9621, 0x2069,
++	0xa600, 0x2071, 0xab8c, 0x7008, 0x6036, 0x720c, 0x623a, 0xa286,
++	0xffff, 0x00c0, 0x95de, 0x7208, 0x0c7e, 0x2c08, 0xa085, 0x0001,
++	0x1078, 0xa1e6, 0x2c10, 0x0c7f, 0x0040, 0x9615, 0x1078, 0x8cf2,
++	0x0040, 0x9615, 0x0c7e, 0x027e, 0x2260, 0x1078, 0x89f3, 0x027f,
++	0x0c7f, 0x7118, 0xa18c, 0xff00, 0x810f, 0xa186, 0x0001, 0x0040,
++	0x95ff, 0xa186, 0x0005, 0x0040, 0x95f9, 0xa186, 0x0007, 0x00c0,
++	0x9609, 0xa280, 0x0004, 0x2004, 0xa005, 0x0040, 0x9609, 0x057e,
++	0x7510, 0x7614, 0x1078, 0xa2a3, 0x057f, 0x0c7f, 0x0d7f, 0x0e7f,
++	0x007c, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, 0x2a00, 0x6003,
++	0x0001, 0x1078, 0x5d8a, 0x0078, 0x9605, 0x6007, 0x003b, 0x602b,
++	0x0009, 0x6013, 0x1700, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x0078,
++	0x9605, 0x6007, 0x003b, 0x602b, 0x000b, 0x6013, 0x0000, 0x0078,
++	0x9579, 0x0e7e, 0x027e, 0x1078, 0x4967, 0x0040, 0x965e, 0x1078,
++	0x4957, 0x1078, 0xa4a9, 0x00c0, 0x965c, 0x2071, 0xa600, 0x70cc,
++	0xc085, 0x70ce, 0x0f7e, 0x2079, 0x0100, 0x7298, 0xa284, 0x00ff,
++	0x706e, 0x78e6, 0xa284, 0xff00, 0x7270, 0xa205, 0x7072, 0x78ea,
++	0x0f7f, 0x70d7, 0x0000, 0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040,
++	0x9655, 0x2011, 0xa8ca, 0x2013, 0x07d0, 0xd0ac, 0x00c0, 0x965e,
++	0x1078, 0x2677, 0x0078, 0x965e, 0x1078, 0xa4d9, 0x027f, 0x0e7f,
++	0x1078, 0x772d, 0x0078, 0x9497, 0x1078, 0x772d, 0x007c, 0x0d7e,
++	0x067e, 0x6618, 0x2668, 0x6e04, 0xa6b4, 0xff00, 0x8637, 0xa686,
++	0x0006, 0x0040, 0x9684, 0xa686, 0x0004, 0x0040, 0x9684, 0x6e04,
++	0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0040, 0x9684, 0xa686, 0x0004,
++	0x0040, 0x9684, 0xa085, 0x0001, 0x067f, 0x0d7f, 0x007c, 0x0d7e,
++	0x1078, 0x96bb, 0x0d7f, 0x007c, 0x0d7e, 0x1078, 0x96ca, 0x00c0,
++	0x96b4, 0x680c, 0xa08c, 0xff00, 0x6820, 0xa084, 0x00ff, 0xa115,
++	0x6212, 0x6824, 0x602a, 0xd1e4, 0x0040, 0x96a2, 0x2009, 0x0001,
++	0x0078, 0x96b0, 0xd1ec, 0x0040, 0x96b4, 0x6920, 0xa18c, 0x00ff,
++	0x6824, 0x1078, 0x254d, 0x00c0, 0x96b4, 0x2110, 0x2009, 0x0000,
++	0x1078, 0x28c8, 0x0078, 0x96b8, 0xa085, 0x0001, 0x0078, 0x96b9,
++	0xa006, 0x0d7f, 0x007c, 0x2069, 0xab8d, 0x6800, 0xa082, 0x0010,
++	0x00c8, 0x96c8, 0x6013, 0x0000, 0xa085, 0x0001, 0x0078, 0x96c9,
++	0xa006, 0x007c, 0x6013, 0x0000, 0x2069, 0xab8c, 0x6808, 0xa084,
++	0xff00, 0xa086, 0x0800, 0x00c0, 0x96de, 0x6800, 0xa084, 0x00ff,
++	0xa08e, 0x0014, 0x0040, 0x96de, 0xa08e, 0x0010, 0x007c, 0x6004,
++	0xa0b2, 0x0044, 0x10c8, 0x1332, 0xa1b6, 0x0013, 0x00c0, 0x96eb,
++	0x2008, 0x0079, 0x96fe, 0xa1b6, 0x0027, 0x0040, 0x96f3, 0xa1b6,
++	0x0014, 0x10c0, 0x1332, 0x2001, 0x0007, 0x1078, 0x4535, 0x1078,
++	0x61cd, 0x1078, 0x8ec6, 0x1078, 0x62d1, 0x007c, 0x973e, 0x9740,
++	0x973e, 0x973e, 0x973e, 0x9740, 0x974c, 0x97d6, 0x9799, 0x97d6,
++	0x97ad, 0x97d6, 0x974c, 0x97d6, 0x97ce, 0x97d6, 0x97ce, 0x97d6,
++	0x97d6, 0x973e, 0x973e, 0x973e, 0x973e, 0x973e, 0x973e, 0x973e,
++	0x973e, 0x973e, 0x973e, 0x973e, 0x9740, 0x973e, 0x97d6, 0x973e,
++	0x973e, 0x97d6, 0x973e, 0x97d6, 0x97d6, 0x973e, 0x973e, 0x973e,
++	0x973e, 0x97d6, 0x97d6, 0x973e, 0x97d6, 0x97d6, 0x973e, 0x973e,
++	0x973e, 0x973e, 0x973e, 0x9740, 0x97d6, 0x97d6, 0x973e, 0x973e,
++	0x97d6, 0x97d6, 0x973e, 0x973e, 0x973e, 0x973e, 0x1078, 0x1332,
++	0x1078, 0x61cd, 0x2001, 0xa8a2, 0x2004, 0x6016, 0x6003, 0x0002,
++	0x1078, 0x62d1, 0x0078, 0x97dc, 0x0f7e, 0x2079, 0xa652, 0x7804,
++	0x0f7f, 0xd0ac, 0x00c0, 0x97d6, 0x2001, 0x0000, 0x1078, 0x44ee,
++	0x6018, 0xa080, 0x0004, 0x2004, 0xa086, 0x00ff, 0x0040, 0x97d6,
++	0x0c7e, 0x6018, 0x2060, 0x6000, 0xd0f4, 0x00c0, 0x9770, 0x6010,
++	0xa005, 0x0040, 0x9770, 0x0c7f, 0x1078, 0x3699, 0x0078, 0x97d6,
++	0x0c7f, 0x2001, 0xa600, 0x2004, 0xa086, 0x0002, 0x00c0, 0x977f,
++	0x0f7e, 0x2079, 0xa600, 0x7890, 0x8000, 0x7892, 0x0f7f, 0x2001,
++	0x0002, 0x1078, 0x4502, 0x1078, 0x61cd, 0x601f, 0x0001, 0x6003,
++	0x0001, 0x6007, 0x0002, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0c7e,
++	0x6118, 0x2160, 0x2009, 0x0001, 0x1078, 0x5a52, 0x0c7f, 0x0078,
++	0x97dc, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa6b4, 0xff00,
++	0x8637, 0xa686, 0x0006, 0x0040, 0x97d6, 0xa686, 0x0004, 0x0040,
++	0x97d6, 0x2001, 0x0004, 0x0078, 0x97d4, 0x2001, 0xa600, 0x2004,
++	0xa086, 0x0003, 0x00c0, 0x97b6, 0x1078, 0x3699, 0x2001, 0x0006,
++	0x1078, 0x97dd, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa6b4,
++	0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x97d6, 0x2001, 0x0006,
++	0x0078, 0x97d4, 0x2001, 0x0004, 0x0078, 0x97d4, 0x2001, 0x0006,
++	0x1078, 0x97dd, 0x0078, 0x97d6, 0x1078, 0x4535, 0x1078, 0x61cd,
++	0x1078, 0x772d, 0x1078, 0x62d1, 0x007c, 0x017e, 0x0d7e, 0x6118,
++	0x2168, 0x6900, 0xd184, 0x0040, 0x97f8, 0x6104, 0xa18e, 0x000a,
++	0x00c0, 0x97f0, 0x699c, 0xd1a4, 0x00c0, 0x97f0, 0x2001, 0x0007,
++	0x1078, 0x4502, 0x2001, 0x0000, 0x1078, 0x44ee, 0x1078, 0x28a6,
++	0x0d7f, 0x017f, 0x007c, 0x0d7e, 0x6618, 0x2668, 0x6804, 0xa084,
++	0xff00, 0x8007, 0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x1332, 0xa1b6,
++	0x0015, 0x00c0, 0x980f, 0x1079, 0x9816, 0x0078, 0x9815, 0xa1b6,
++	0x0016, 0x10c0, 0x1332, 0x1079, 0x9822, 0x007c, 0x7d4e, 0x7d4e,
++	0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x9877, 0x982e, 0x7d4e, 0x7d4e,
++	0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e,
++	0x9877, 0x987f, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x0f7e, 0x2079,
++	0xa652, 0x7804, 0xd0ac, 0x00c0, 0x9855, 0x6018, 0xa07d, 0x0040,
++	0x9855, 0x7800, 0xd0f4, 0x00c0, 0x9841, 0x7810, 0xa005, 0x00c0,
++	0x9855, 0x2001, 0x0000, 0x1078, 0x44ee, 0x2001, 0x0002, 0x1078,
++	0x4502, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x1078,
++	0x5dd7, 0x1078, 0x62d1, 0x0078, 0x9875, 0x2011, 0xab83, 0x2204,
++	0x8211, 0x220c, 0x1078, 0x254d, 0x00c0, 0x9875, 0x0c7e, 0x1078,
++	0x45c4, 0x0040, 0x9868, 0x0c7f, 0x1078, 0x772d, 0x0078, 0x9875,
++	0x6010, 0x007e, 0x6014, 0x007e, 0x1078, 0x42f8, 0x007f, 0x6016,
++	0x007f, 0x6012, 0x0c7f, 0x1078, 0x772d, 0x0f7f, 0x007c, 0x6604,
++	0xa6b6, 0x001e, 0x00c0, 0x987e, 0x1078, 0x772d, 0x007c, 0x1078,
++	0x7f8e, 0x00c0, 0x988b, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078,
++	0x5dd7, 0x0078, 0x988d, 0x1078, 0x772d, 0x007c, 0x6004, 0xa08a,
++	0x0044, 0x10c8, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ec6, 0x1078,
++	0x62d1, 0x007c, 0xa182, 0x0040, 0x0079, 0x989e, 0x98b1, 0x98b1,
++	0x98b1, 0x98b1, 0x98b3, 0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1,
++	0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1,
++	0x98b1, 0x1078, 0x1332, 0x0d7e, 0x0e7e, 0x0f7e, 0x157e, 0x047e,
++	0x027e, 0x6218, 0xa280, 0x002b, 0x2004, 0xa005, 0x0040, 0x98c4,
++	0x2021, 0x0000, 0x1078, 0xa472, 0x6106, 0x2071, 0xab80, 0x7444,
++	0xa4a4, 0xff00, 0x0040, 0x991b, 0xa486, 0x2000, 0x00c0, 0x98d6,
++	0x2009, 0x0001, 0x2011, 0x0200, 0x1078, 0x5bf1, 0x1078, 0x138b,
++	0x1040, 0x1332, 0x6003, 0x0007, 0x2d00, 0x6837, 0x010d, 0x6803,
++	0x0000, 0x683b, 0x0000, 0x6c5a, 0x2c00, 0x685e, 0x6008, 0x68b2,
++	0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, 0x694a, 0x017e, 0xa084,
++	0xff00, 0x6846, 0x684f, 0x0000, 0x6857, 0x0036, 0x1078, 0x4a73,
++	0x017f, 0xa486, 0x2000, 0x00c0, 0x9903, 0x2019, 0x0017, 0x1078,
++	0xa195, 0x0078, 0x997d, 0xa486, 0x0400, 0x00c0, 0x990d, 0x2019,
++	0x0002, 0x1078, 0xa146, 0x0078, 0x997d, 0xa486, 0x0200, 0x00c0,
++	0x9913, 0x1078, 0xa12b, 0xa486, 0x1000, 0x00c0, 0x9919, 0x1078,
++	0xa17a, 0x0078, 0x997d, 0x2069, 0xa933, 0x6a00, 0xd284, 0x0040,
++	0x99e7, 0xa284, 0x0300, 0x00c0, 0x99df, 0x6804, 0xa005, 0x0040,
++	0x99c5, 0x2d78, 0x6003, 0x0007, 0x1078, 0x1370, 0x0040, 0x9984,
++	0x7800, 0xd08c, 0x00c0, 0x9937, 0x7804, 0x8001, 0x7806, 0x6013,
++	0x0000, 0x6803, 0x0000, 0x6837, 0x0116, 0x683b, 0x0000, 0x6008,
++	0x68b2, 0x2c00, 0x684a, 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130,
++	0x6986, 0x6846, 0x7928, 0x698a, 0x792c, 0x698e, 0x7930, 0x6992,
++	0x7934, 0x6996, 0x6853, 0x003d, 0x7244, 0xa294, 0x0003, 0xa286,
++	0x0002, 0x00c0, 0x995f, 0x684f, 0x0040, 0x0078, 0x9969, 0xa286,
++	0x0001, 0x00c0, 0x9967, 0x684f, 0x0080, 0x0078, 0x9969, 0x684f,
++	0x0000, 0x20a9, 0x000a, 0x2001, 0xab90, 0xad90, 0x0015, 0x200c,
++	0x810f, 0x2112, 0x8000, 0x8210, 0x00f0, 0x996f, 0x200c, 0x6982,
++	0x8000, 0x200c, 0x697e, 0x1078, 0x4a73, 0x027f, 0x047f, 0x157f,
++	0x0f7f, 0x0e7f, 0x0d7f, 0x007c, 0x2001, 0xa60e, 0x2004, 0xd084,
++	0x0040, 0x998e, 0x1078, 0x138b, 0x00c0, 0x9930, 0x6013, 0x0100,
++	0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x5d8a, 0x1078, 0x62d1,
++	0x0078, 0x997d, 0x2069, 0xab92, 0x2d04, 0xa084, 0xff00, 0xa086,
++	0x1200, 0x00c0, 0x99b9, 0x2069, 0xab80, 0x686c, 0xa084, 0x00ff,
++	0x017e, 0x6110, 0xa18c, 0x0700, 0xa10d, 0x6112, 0x017f, 0x6003,
++	0x0001, 0x6007, 0x0043, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078,
++	0x997d, 0x6013, 0x0200, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078,
++	0x5d8a, 0x1078, 0x62d1, 0x0078, 0x997d, 0x2001, 0xa60d, 0x2004,
++	0xd0ec, 0x0040, 0x99cf, 0x2011, 0x8049, 0x1078, 0x361b, 0x6013,
++	0x0300, 0x0078, 0x99d5, 0x6013, 0x0100, 0x6003, 0x0001, 0x6007,
++	0x0041, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078, 0x997d, 0x6013,
++	0x0500, 0x0078, 0x99d5, 0x6013, 0x0600, 0x0078, 0x999a, 0x6013,
++	0x0200, 0x0078, 0x999a, 0xa186, 0x0013, 0x00c0, 0x99fd, 0x6004,
++	0xa08a, 0x0040, 0x1048, 0x1332, 0xa08a, 0x0053, 0x10c8, 0x1332,
++	0xa082, 0x0040, 0x2008, 0x0079, 0x9a82, 0xa186, 0x0051, 0x0040,
++	0x9a0a, 0xa186, 0x0047, 0x00c0, 0x9a23, 0x6004, 0xa086, 0x0041,
++	0x0040, 0x9a31, 0x2001, 0x0109, 0x2004, 0xd084, 0x0040, 0x9a31,
++	0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x027e, 0x1078, 0x5c56,
++	0x027f, 0x017f, 0x007f, 0x127f, 0x6000, 0xa086, 0x0002, 0x00c0,
++	0x9a31, 0x0078, 0x9ac7, 0xa186, 0x0027, 0x0040, 0x9a2b, 0xa186,
++	0x0014, 0x10c0, 0x1332, 0x6004, 0xa082, 0x0040, 0x2008, 0x0079,
++	0x9a34, 0x1078, 0x7773, 0x007c, 0x9a47, 0x9a49, 0x9a49, 0x9a71,
++	0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47,
++	0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x1078,
++	0x1332, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x037e, 0x0d7e, 0x6010,
++	0xa06d, 0x0040, 0x9a6e, 0xad84, 0xf000, 0x0040, 0x9a6e, 0x6003,
++	0x0002, 0x6018, 0x2004, 0xd0bc, 0x00c0, 0x9a6e, 0x2019, 0x0004,
++	0x1078, 0xa1ca, 0x6013, 0x0000, 0x6014, 0xa005, 0x00c0, 0x9a6c,
++	0x2001, 0xa8a3, 0x2004, 0x6016, 0x6003, 0x0007, 0x0d7f, 0x037f,
++	0x007c, 0x0d7e, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x1078, 0x8d06,
++	0x0040, 0x9a7e, 0x6010, 0x2068, 0x1078, 0x13a4, 0x1078, 0x8ec6,
++	0x0d7f, 0x007c, 0x9a95, 0x9ab4, 0x9a9e, 0x9ac1, 0x9a95, 0x9a95,
++	0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95,
++	0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x1078, 0x1332, 0x6010,
++	0xa088, 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x1078, 0x61cd,
++	0x6010, 0xa080, 0x0013, 0x2004, 0xd0b4, 0x0040, 0x9aaf, 0x6003,
++	0x0007, 0x2009, 0x0043, 0x1078, 0x775c, 0x0078, 0x9ab1, 0x6003,
++	0x0002, 0x1078, 0x62d1, 0x007c, 0x1078, 0x61cd, 0x1078, 0xa423,
++	0x00c0, 0x9abe, 0x1078, 0x5bc1, 0x1078, 0x772d, 0x1078, 0x62d1,
++	0x007c, 0x1078, 0x61cd, 0x2009, 0x0041, 0x0078, 0x9c1e, 0xa182,
++	0x0040, 0x0079, 0x9acb, 0x9ade, 0x9ae0, 0x9ade, 0x9ade, 0x9ade,
++	0x9ade, 0x9ade, 0x9ae1, 0x9ade, 0x9ade, 0x9ade, 0x9ade, 0x9ade,
++	0x9ade, 0x9ade, 0x9ade, 0x9ade, 0x9aec, 0x9ade, 0x1078, 0x1332,
++	0x007c, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20,
++	0x2c10, 0x1078, 0x15fa, 0x007c, 0x0d7e, 0x1078, 0x5bc1, 0x0d7f,
++	0x1078, 0xa495, 0x1078, 0x772d, 0x007c, 0xa182, 0x0040, 0x0079,
++	0x9af9, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c,
++	0x9b0e, 0x9b0c, 0x9b11, 0x9b3c, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c,
++	0x9b3c, 0x9b0c, 0x9b0c, 0x9b0c, 0x1078, 0x1332, 0x1078, 0x7773,
++	0x007c, 0x1078, 0x627a, 0x1078, 0x639b, 0x6010, 0x0d7e, 0x2068,
++	0x684c, 0xd0fc, 0x0040, 0x9b27, 0xa08c, 0x0003, 0xa18e, 0x0002,
++	0x0040, 0x9b2f, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x9c1e, 0x6003,
++	0x0007, 0x6017, 0x0000, 0x1078, 0x5bc1, 0x0d7f, 0x007c, 0x1078,
++	0xa423, 0x0040, 0x9b35, 0x0d7f, 0x007c, 0x1078, 0x5bc1, 0x1078,
++	0x772d, 0x0d7f, 0x0078, 0x9b2e, 0x037e, 0x1078, 0x627a, 0x1078,
++	0x639b, 0x6010, 0x0d7e, 0x2068, 0x6018, 0x2004, 0xd0bc, 0x0040,
++	0x9b5c, 0x684c, 0xa084, 0x0003, 0xa086, 0x0002, 0x0040, 0x9b58,
++	0x687c, 0x632c, 0xa31a, 0x632e, 0x6880, 0x6328, 0xa31b, 0x632a,
++	0x6003, 0x0002, 0x0078, 0x9b6d, 0x2019, 0x0004, 0x1078, 0xa1ca,
++	0x6014, 0xa005, 0x00c0, 0x9b69, 0x2001, 0xa8a3, 0x2004, 0x8003,
++	0x6016, 0x6013, 0x0000, 0x6003, 0x0007, 0x0d7f, 0x037f, 0x007c,
++	0xa186, 0x0013, 0x00c0, 0x9b7e, 0x6004, 0xa086, 0x0042, 0x10c0,
++	0x1332, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x007c, 0xa186, 0x0027,
++	0x0040, 0x9b86, 0xa186, 0x0014, 0x00c0, 0x9b96, 0x6004, 0xa086,
++	0x0042, 0x10c0, 0x1332, 0x2001, 0x0007, 0x1078, 0x4535, 0x1078,
++	0x61cd, 0x1078, 0x8ec6, 0x1078, 0x62d1, 0x007c, 0xa182, 0x0040,
++	0x0079, 0x9b9a, 0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x9bad,
++	0x9bad, 0x9baf, 0x9bbb, 0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x9bad,
++	0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x1078, 0x1332, 0x037e,
++	0x047e, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, 0x15fa,
++	0x047f, 0x037f, 0x007c, 0x6010, 0x0d7e, 0x2068, 0x6810, 0x6a14,
++	0x6118, 0x210c, 0xd1bc, 0x0040, 0x9bda, 0x6124, 0xd1f4, 0x00c0,
++	0x9bda, 0x007e, 0x047e, 0x057e, 0x6c7c, 0xa422, 0x6d80, 0x2200,
++	0xa52b, 0x602c, 0xa420, 0x642e, 0x6028, 0xa529, 0x652a, 0x057f,
++	0x047f, 0x007f, 0xa20d, 0x00c0, 0x9bee, 0x684c, 0xd0fc, 0x0040,
++	0x9be6, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x9c1e, 0x6003, 0x0007,
++	0x6017, 0x0000, 0x1078, 0x5bc1, 0x0d7f, 0x007c, 0x007e, 0x0f7e,
++	0x2c78, 0x1078, 0x4963, 0x0f7f, 0x007f, 0x0040, 0x9bfb, 0x6003,
++	0x0002, 0x0d7f, 0x007c, 0x2009, 0xa60d, 0x210c, 0xd19c, 0x0040,
++	0x9c05, 0x6003, 0x0007, 0x0078, 0x9c07, 0x6003, 0x0006, 0x1078,
++	0x9c0d, 0x1078, 0x5bc3, 0x0d7f, 0x007c, 0xd2fc, 0x0040, 0x9c19,
++	0x8002, 0x8000, 0x8212, 0xa291, 0x0000, 0x2009, 0x0009, 0x0078,
++	0x9c1b, 0x2009, 0x0015, 0x6a6a, 0x6866, 0x007c, 0xa182, 0x0040,
++	0x0048, 0x9c24, 0x0079, 0x9c31, 0xa186, 0x0013, 0x0040, 0x9c2c,
++	0xa186, 0x0014, 0x10c0, 0x1332, 0x6024, 0xd0dc, 0x1040, 0x1332,
++	0x007c, 0x9c44, 0x9c4b, 0x9c57, 0x9c63, 0x9c44, 0x9c44, 0x9c44,
++	0x9c72, 0x9c44, 0x9c46, 0x9c46, 0x9c44, 0x9c44, 0x9c44, 0x9c44,
++	0x9c44, 0x9c44, 0x9c44, 0x9c44, 0x1078, 0x1332, 0x6024, 0xd0dc,
++	0x1040, 0x1332, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a,
++	0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0x6003,
++	0x0001, 0x6106, 0x1078, 0x5d8a, 0x127e, 0x2091, 0x8000, 0x1078,
++	0x62d1, 0x127f, 0x007c, 0x6003, 0x0003, 0x6106, 0x2c10, 0x1078,
++	0x1cf0, 0x127e, 0x2091, 0x8000, 0x1078, 0x5df6, 0x1078, 0x639b,
++	0x127f, 0x007c, 0xa016, 0x1078, 0x15fa, 0x007c, 0x127e, 0x2091,
++	0x8000, 0x037e, 0x0d7e, 0xa182, 0x0040, 0x1079, 0x9c83, 0x0d7f,
++	0x037f, 0x127f, 0x007c, 0x9c93, 0x9c95, 0x9caa, 0x9cc9, 0x9c93,
++	0x9c93, 0x9c93, 0x9ce1, 0x9c93, 0x9c93, 0x9c93, 0x9c93, 0x9c93,
++	0x9c93, 0x9c93, 0x9c93, 0x1078, 0x1332, 0x6010, 0x2068, 0x684c,
++	0xd0fc, 0x0040, 0x9cbf, 0xa09c, 0x0003, 0xa39e, 0x0003, 0x0040,
++	0x9cbf, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a, 0x1078, 0x62d1,
++	0x0078, 0x9ce4, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0040, 0x9cbf,
++	0xa09c, 0x0003, 0xa39e, 0x0003, 0x0040, 0x9cbf, 0x6003, 0x0001,
++	0x6106, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078, 0x9ce4, 0x6013,
++	0x0000, 0x6017, 0x0000, 0x2019, 0x0004, 0x1078, 0xa1ca, 0x0078,
++	0x9ce4, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0040, 0x9cbf, 0xa09c,
++	0x0003, 0xa39e, 0x0003, 0x0040, 0x9cbf, 0x6003, 0x0003, 0x6106,
++	0x2c10, 0x1078, 0x1cf0, 0x1078, 0x5df6, 0x1078, 0x639b, 0x0078,
++	0x9ce4, 0xa016, 0x1078, 0x15fa, 0x007c, 0x1078, 0x61cd, 0x6110,
++	0x81ff, 0x0040, 0x9cf6, 0x0d7e, 0x2168, 0x1078, 0xa4e2, 0x037e,
++	0x2019, 0x0029, 0x1078, 0xa1ca, 0x037f, 0x0d7f, 0x1078, 0x8ec6,
++	0x1078, 0x62d1, 0x007c, 0x1078, 0x627a, 0x6110, 0x81ff, 0x0040,
++	0x9d0c, 0x0d7e, 0x2168, 0x1078, 0xa4e2, 0x037e, 0x2019, 0x0029,
++	0x1078, 0xa1ca, 0x037f, 0x0d7f, 0x1078, 0x8ec6, 0x1078, 0x639b,
++	0x007c, 0xa182, 0x0085, 0x0079, 0x9d15, 0x9d1e, 0x9d1c, 0x9d1c,
++	0x9d2a, 0x9d1c, 0x9d1c, 0x9d1c, 0x1078, 0x1332, 0x6003, 0x000b,
++	0x6106, 0x1078, 0x5d8a, 0x127e, 0x2091, 0x8000, 0x1078, 0x62d1,
++	0x127f, 0x007c, 0x027e, 0x0e7e, 0x1078, 0xa41c, 0x0040, 0x9d34,
++	0x1078, 0x772d, 0x0078, 0x9d50, 0x2071, 0xab80, 0x7224, 0x6212,
++	0x7220, 0x1078, 0xa069, 0x0040, 0x9d41, 0x6007, 0x0086, 0x0078,
++	0x9d4a, 0x6007, 0x0087, 0x7224, 0xa296, 0xffff, 0x00c0, 0x9d4a,
++	0x6007, 0x0086, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x1078, 0x62d1,
++	0x0e7f, 0x027f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x9d64, 0x6004,
++	0xa08a, 0x0085, 0x1048, 0x1332, 0xa08a, 0x008c, 0x10c8, 0x1332,
++	0xa082, 0x0085, 0x0079, 0x9d7b, 0xa186, 0x0027, 0x0040, 0x9d70,
++	0xa186, 0x0014, 0x0040, 0x9d70, 0x1078, 0x7773, 0x0078, 0x9d7a,
++	0x2001, 0x0007, 0x1078, 0x4535, 0x1078, 0x61cd, 0x1078, 0x8ec6,
++	0x1078, 0x62d1, 0x007c, 0x9d82, 0x9d84, 0x9d84, 0x9d82, 0x9d82,
++	0x9d82, 0x9d82, 0x1078, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ec6,
++	0x1078, 0x62d1, 0x007c, 0xa182, 0x0085, 0x1048, 0x1332, 0xa182,
++	0x008c, 0x10c8, 0x1332, 0xa182, 0x0085, 0x0079, 0x9d97, 0x9d9e,
++	0x9d9e, 0x9d9e, 0x9da0, 0x9d9e, 0x9d9e, 0x9d9e, 0x1078, 0x1332,
++	0x007c, 0xa186, 0x0013, 0x0040, 0x9db1, 0xa186, 0x0014, 0x0040,
++	0x9db1, 0xa186, 0x0027, 0x0040, 0x9db1, 0x1078, 0x7773, 0x0078,
++	0x9db7, 0x1078, 0x61cd, 0x1078, 0x8ec6, 0x1078, 0x62d1, 0x007c,
++	0x037e, 0x1078, 0xa495, 0x603f, 0x0000, 0x2019, 0x000b, 0x1078,
++	0x9dc7, 0x601f, 0x0006, 0x6003, 0x0007, 0x037f, 0x007c, 0x127e,
++	0x037e, 0x2091, 0x8000, 0x087e, 0x2c40, 0x097e, 0x2049, 0x0000,
++	0x1078, 0x7246, 0x097f, 0x087f, 0x00c0, 0x9e02, 0x077e, 0x2c38,
++	0x1078, 0x72f3, 0x077f, 0x00c0, 0x9e02, 0x6000, 0xa086, 0x0000,
++	0x0040, 0x9e02, 0x601c, 0xa086, 0x0007, 0x0040, 0x9e02, 0x0d7e,
++	0x6000, 0xa086, 0x0004, 0x00c0, 0x9df3, 0x1078, 0xa495, 0x601f,
++	0x0007, 0x1078, 0x1757, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040,
++	0x9dfb, 0x1078, 0xa1ca, 0x0d7f, 0x6013, 0x0000, 0x1078, 0xa495,
++	0x601f, 0x0007, 0x037f, 0x127f, 0x007c, 0x0f7e, 0x0c7e, 0x037e,
++	0x157e, 0x2079, 0xab80, 0x7938, 0x783c, 0x1078, 0x254d, 0x00c0,
++	0x9e49, 0x017e, 0x0c7e, 0x1078, 0x45c4, 0x00c0, 0x9e49, 0x017f,
++	0x027f, 0x027e, 0x017e, 0x2019, 0x0029, 0x1078, 0x73d0, 0x1078,
++	0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a, 0x077f, 0x017f,
++	0x077e, 0x2039, 0x0000, 0x1078, 0x9f8b, 0x077f, 0x1078, 0x47e9,
++	0x027e, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, 0x0006, 0x0040,
++	0x9e3d, 0xa286, 0x0004, 0x00c0, 0x9e40, 0x62a0, 0x1078, 0x2942,
++	0x027f, 0x017f, 0x1078, 0x42f8, 0x6612, 0x6516, 0xa006, 0x0078,
++	0x9e4b, 0x0c7f, 0x017f, 0x157f, 0x037f, 0x0c7f, 0x0f7f, 0x007c,
++	0x0c7e, 0x0d7e, 0x0e7e, 0x017e, 0x2009, 0xa620, 0x2104, 0xa086,
++	0x0074, 0x00c0, 0x9eb3, 0x2069, 0xab8e, 0x690c, 0xa182, 0x0100,
++	0x0048, 0x9ea3, 0x6908, 0xa184, 0x8000, 0x0040, 0x9eaf, 0x6018,
++	0x2070, 0x7010, 0xa084, 0x00ff, 0x0040, 0x9e72, 0x7000, 0xd0f4,
++	0x0040, 0x9e76, 0xa184, 0x0800, 0x0040, 0x9eaf, 0x6910, 0xa18a,
++	0x0001, 0x0048, 0x9ea7, 0x6914, 0x2069, 0xabae, 0x6904, 0x81ff,
++	0x00c0, 0x9e9b, 0x690c, 0xa182, 0x0100, 0x0048, 0x9ea3, 0x6908,
++	0x81ff, 0x00c0, 0x9e9f, 0x6910, 0xa18a, 0x0001, 0x0048, 0x9ea7,
++	0x6918, 0xa18a, 0x0001, 0x0048, 0x9eaf, 0x0078, 0x9eb9, 0x6013,
++	0x0100, 0x0078, 0x9eb5, 0x6013, 0x0300, 0x0078, 0x9eb5, 0x6013,
++	0x0500, 0x0078, 0x9eb5, 0x6013, 0x0700, 0x0078, 0x9eb5, 0x6013,
++	0x0900, 0x0078, 0x9eb5, 0x6013, 0x0b00, 0x0078, 0x9eb5, 0x6013,
++	0x0f00, 0x0078, 0x9eb5, 0x6013, 0x2d00, 0xa085, 0x0001, 0x0078,
++	0x9eba, 0xa006, 0x017f, 0x0e7f, 0x0d7f, 0x0c7f, 0x007c, 0x0c7e,
++	0x0d7e, 0x027e, 0x037e, 0x157e, 0x6218, 0x2268, 0x6b04, 0xa394,
++	0x00ff, 0xa286, 0x0006, 0x0040, 0x9ee3, 0xa286, 0x0004, 0x0040,
++	0x9ee3, 0xa394, 0xff00, 0x8217, 0xa286, 0x0006, 0x0040, 0x9ee3,
++	0xa286, 0x0004, 0x0040, 0x9ee3, 0x0c7e, 0x2d60, 0x1078, 0x45d6,
++	0x0c7f, 0x0078, 0x9f1e, 0x2011, 0xab96, 0xad98, 0x000a, 0x20a9,
++	0x0004, 0x1078, 0x80de, 0x00c0, 0x9f1f, 0x2011, 0xab9a, 0xad98,
++	0x0006, 0x20a9, 0x0004, 0x1078, 0x80de, 0x00c0, 0x9f1f, 0x047e,
++	0x017e, 0x6aa0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0xa653,
++	0x210c, 0xd1a4, 0x0040, 0x9f0b, 0x2009, 0x0029, 0x1078, 0xa21d,
++	0x6800, 0xc0e5, 0x6802, 0x2019, 0x0029, 0x1078, 0x5f01, 0x077e,
++	0x2039, 0x0000, 0x1078, 0x5e0a, 0x2c08, 0x1078, 0x9f8b, 0x077f,
++	0x2001, 0x0007, 0x1078, 0x4535, 0x017f, 0x047f, 0xa006, 0x157f,
++	0x037f, 0x027f, 0x0d7f, 0x0c7f, 0x007c, 0x0d7e, 0x2069, 0xab8e,
++	0x6800, 0xa086, 0x0800, 0x0040, 0x9f31, 0x6013, 0x0000, 0x0078,
++	0x9f32, 0xa006, 0x0d7f, 0x007c, 0x0c7e, 0x0f7e, 0x017e, 0x027e,
++	0x037e, 0x157e, 0x2079, 0xab8c, 0x7930, 0x7834, 0x1078, 0x254d,
++	0x00c0, 0x9f58, 0x1078, 0x45c4, 0x00c0, 0x9f58, 0x2011, 0xab90,
++	0xac98, 0x000a, 0x20a9, 0x0004, 0x1078, 0x80de, 0x00c0, 0x9f58,
++	0x2011, 0xab94, 0xac98, 0x0006, 0x20a9, 0x0004, 0x1078, 0x80de,
++	0x157f, 0x037f, 0x027f, 0x017f, 0x0f7f, 0x0c7f, 0x007c, 0x0c7e,
++	0x007e, 0x017e, 0x027e, 0x037e, 0x157e, 0x2011, 0xab83, 0x2204,
++	0x8211, 0x220c, 0x1078, 0x254d, 0x00c0, 0x9f84, 0x1078, 0x45c4,
++	0x00c0, 0x9f84, 0x2011, 0xab96, 0xac98, 0x000a, 0x20a9, 0x0004,
++	0x1078, 0x80de, 0x00c0, 0x9f84, 0x2011, 0xab9a, 0xac98, 0x0006,
++	0x20a9, 0x0004, 0x1078, 0x80de, 0x157f, 0x037f, 0x027f, 0x017f,
++	0x007f, 0x0c7f, 0x007c, 0x0e7e, 0x0c7e, 0x087e, 0x077e, 0x067e,
++	0x057e, 0x047e, 0x027e, 0x127e, 0x2091, 0x8000, 0x2740, 0x2029,
++	0xa8ba, 0x252c, 0x2021, 0xa8c0, 0x2424, 0x2061, 0xad00, 0x2071,
++	0xa600, 0x7648, 0x7064, 0x81ff, 0x0040, 0x9fb2, 0x007e, 0xa186,
++	0xa9b3, 0x007f, 0x0040, 0x9fb2, 0x8001, 0xa602, 0x00c8, 0xa01c,
++	0x0078, 0x9fb5, 0xa606, 0x0040, 0xa01c, 0x2100, 0xac06, 0x0040,
++	0xa012, 0x1078, 0xa242, 0x0040, 0xa012, 0x671c, 0xa786, 0x0001,
++	0x0040, 0xa037, 0xa786, 0x0004, 0x0040, 0xa037, 0xa786, 0x0007,
++	0x0040, 0xa012, 0x2500, 0xac06, 0x0040, 0xa012, 0x2400, 0xac06,
++	0x0040, 0xa012, 0x1078, 0xa256, 0x00c0, 0xa012, 0x88ff, 0x0040,
++	0x9fdd, 0x6020, 0xa906, 0x00c0, 0xa012, 0x0d7e, 0x6000, 0xa086,
++	0x0004, 0x00c0, 0x9fe7, 0x017e, 0x1078, 0x1757, 0x017f, 0xa786,
++	0x0008, 0x00c0, 0x9ff6, 0x1078, 0x8f00, 0x00c0, 0x9ff6, 0x1078,
++	0x7c83, 0x0d7f, 0x1078, 0x8ec6, 0x0078, 0xa012, 0x6010, 0x2068,
++	0x1078, 0x8d06, 0x0040, 0xa00f, 0xa786, 0x0003, 0x00c0, 0xa026,
++	0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0xa4e2, 0x017e,
++	0x1078, 0x8f7d, 0x1078, 0x4a73, 0x017f, 0x1078, 0x8eb9, 0x0d7f,
++	0x1078, 0x8ec6, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004, 0xac02,
++	0x00c8, 0xa01c, 0x0078, 0x9f9f, 0x127f, 0x027f, 0x047f, 0x057f,
++	0x067f, 0x077f, 0x087f, 0x0c7f, 0x0e7f, 0x007c, 0xa786, 0x0006,
++	0x00c0, 0xa000, 0xa386, 0x0005, 0x0040, 0xa034, 0x1078, 0xa4e2,
++	0x1078, 0xa1ca, 0x0078, 0xa00f, 0x0d7f, 0x0078, 0xa012, 0x1078,
++	0xa256, 0x00c0, 0xa012, 0x81ff, 0x0040, 0xa012, 0xa180, 0x0001,
++	0x2004, 0xa086, 0x0018, 0x0040, 0xa04c, 0xa180, 0x0001, 0x2004,
++	0xa086, 0x002d, 0x00c0, 0xa012, 0x6000, 0xa086, 0x0002, 0x00c0,
++	0xa012, 0x1078, 0x8eec, 0x0040, 0xa05d, 0x1078, 0x8f00, 0x00c0,
++	0xa012, 0x1078, 0x7c83, 0x0078, 0xa065, 0x1078, 0x28a6, 0x1078,
++	0x8f00, 0x00c0, 0xa065, 0x1078, 0x7c83, 0x1078, 0x8ec6, 0x0078,
++	0xa012, 0x0c7e, 0x0e7e, 0x017e, 0x2c08, 0x2170, 0xa006, 0x1078,
++	0xa1e6, 0x017f, 0x0040, 0xa079, 0x601c, 0xa084, 0x000f, 0x1079,
++	0xa07c, 0x0e7f, 0x0c7f, 0x007c, 0xa084, 0xa084, 0xa084, 0xa084,
++	0xa084, 0xa084, 0xa086, 0xa084, 0xa006, 0x007c, 0x047e, 0x017e,
++	0x7018, 0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00,
++	0x2009, 0x0020, 0x1078, 0xa21d, 0x017f, 0x047f, 0x037e, 0x2019,
++	0x0002, 0x1078, 0x9dc7, 0x037f, 0xa085, 0x0001, 0x007c, 0x2001,
++	0x0001, 0x1078, 0x44ee, 0x157e, 0x017e, 0x027e, 0x037e, 0x20a9,
++	0x0004, 0x2019, 0xa605, 0x2011, 0xab96, 0x1078, 0x80de, 0x037f,
++	0x027f, 0x017f, 0x157f, 0xa005, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e,
++	0x087e, 0x077e, 0x067e, 0x027e, 0x127e, 0x2091, 0x8000, 0x2740,
++	0x2061, 0xad00, 0x2079, 0x0001, 0x8fff, 0x0040, 0xa11d, 0x2071,
++	0xa600, 0x7648, 0x7064, 0x8001, 0xa602, 0x00c8, 0xa11d, 0x88ff,
++	0x0040, 0xa0d8, 0x2800, 0xac06, 0x00c0, 0xa113, 0x2079, 0x0000,
++	0x1078, 0xa242, 0x0040, 0xa113, 0x2400, 0xac06, 0x0040, 0xa113,
++	0x671c, 0xa786, 0x0006, 0x00c0, 0xa113, 0xa786, 0x0007, 0x0040,
++	0xa113, 0x88ff, 0x00c0, 0xa0f7, 0x6018, 0xa206, 0x00c0, 0xa113,
++	0x85ff, 0x0040, 0xa0f7, 0x6020, 0xa106, 0x00c0, 0xa113, 0x0d7e,
++	0x6000, 0xa086, 0x0004, 0x00c0, 0xa103, 0x1078, 0xa495, 0x601f,
++	0x0007, 0x1078, 0x1757, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040,
++	0xa10d, 0x047e, 0x1078, 0xa1ca, 0x047f, 0x0d7f, 0x1078, 0x8ec6,
++	0x88ff, 0x00c0, 0xa127, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004,
++	0xac02, 0x00c8, 0xa11d, 0x0078, 0xa0c4, 0xa006, 0x127f, 0x027f,
++	0x067f, 0x077f, 0x087f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0xa8c5,
++	0x0001, 0x0078, 0xa11e, 0x077e, 0x057e, 0x087e, 0x2041, 0x0000,
++	0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, 0x6218, 0x097e, 0x2049,
++	0x0000, 0x1078, 0x7246, 0x097f, 0x087f, 0x2039, 0x0000, 0x1078,
++	0x72f3, 0x1078, 0xa0b5, 0x057f, 0x077f, 0x007c, 0x027e, 0x047e,
++	0x057e, 0x077e, 0x0c7e, 0x157e, 0x2c20, 0x2128, 0x20a9, 0x007f,
++	0x2009, 0x0000, 0x017e, 0x037e, 0x1078, 0x45c4, 0x00c0, 0xa16e,
++	0x2c10, 0x057e, 0x087e, 0x2041, 0x0000, 0x2508, 0x2029, 0x0001,
++	0x097e, 0x2049, 0x0000, 0x1078, 0x7246, 0x097f, 0x087f, 0x2039,
++	0x0000, 0x1078, 0x72f3, 0x1078, 0xa0b5, 0x057f, 0x037f, 0x017f,
++	0x8108, 0x00f0, 0xa152, 0x157f, 0x0c7f, 0x077f, 0x057f, 0x047f,
++	0x027f, 0x007c, 0x077e, 0x057e, 0x6218, 0x087e, 0x2041, 0x0000,
++	0x2029, 0x0001, 0x2019, 0x0048, 0x097e, 0x2049, 0x0000, 0x1078,
++	0x7246, 0x097f, 0x087f, 0x2039, 0x0000, 0x1078, 0x72f3, 0x2c20,
++	0x1078, 0xa0b5, 0x057f, 0x077f, 0x007c, 0x027e, 0x047e, 0x057e,
++	0x077e, 0x0c7e, 0x157e, 0x2c20, 0x20a9, 0x007f, 0x2009, 0x0000,
++	0x017e, 0x037e, 0x1078, 0x45c4, 0x00c0, 0xa1be, 0x2c10, 0x087e,
++	0x2041, 0x0000, 0x2828, 0x047e, 0x2021, 0x0001, 0x1078, 0xa472,
++	0x047f, 0x097e, 0x2049, 0x0000, 0x1078, 0x7246, 0x097f, 0x087f,
++	0x2039, 0x0000, 0x1078, 0x72f3, 0x1078, 0xa0b5, 0x037f, 0x017f,
++	0x8108, 0x00f0, 0xa1a0, 0x157f, 0x0c7f, 0x077f, 0x057f, 0x047f,
++	0x027f, 0x007c, 0x017e, 0x0f7e, 0xad82, 0xcd00, 0x0048, 0xa1e3,
++	0xad82, 0xffff, 0x00c8, 0xa1e3, 0x6800, 0xa07d, 0x0040, 0xa1e0,
++	0x6803, 0x0000, 0x6b52, 0x1078, 0x4a73, 0x2f68, 0x0078, 0xa1d4,
++	0x6b52, 0x1078, 0x4a73, 0x0f7f, 0x017f, 0x007c, 0x0e7e, 0x047e,
++	0x037e, 0x2061, 0xad00, 0xa005, 0x00c0, 0xa1f6, 0x2071, 0xa600,
++	0x7448, 0x7064, 0x8001, 0xa402, 0x00c8, 0xa218, 0x2100, 0xac06,
++	0x0040, 0xa20a, 0x6000, 0xa086, 0x0000, 0x0040, 0xa20a, 0x6008,
++	0xa206, 0x00c0, 0xa20a, 0x6018, 0xa1a0, 0x0006, 0x2424, 0xa406,
++	0x0040, 0xa214, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004, 0xac02,
++	0x00c8, 0xa218, 0x0078, 0xa1f6, 0xa085, 0x0001, 0x0078, 0xa219,
++	0xa006, 0x037f, 0x047f, 0x0e7f, 0x007c, 0x0d7e, 0x007e, 0x1078,
++	0x138b, 0x007f, 0x1040, 0x1332, 0x6837, 0x010d, 0x685e, 0x027e,
++	0x2010, 0x1078, 0x8cf2, 0x2001, 0x0000, 0x0040, 0xa233, 0x2200,
++	0xa080, 0x0008, 0x2004, 0x027f, 0x684a, 0x6956, 0x6c46, 0x684f,
++	0x0000, 0xa006, 0x68b2, 0x6802, 0x683a, 0x685a, 0x1078, 0x4a73,
++	0x0d7f, 0x007c, 0x6700, 0xa786, 0x0000, 0x0040, 0xa255, 0xa786,
++	0x0001, 0x0040, 0xa255, 0xa786, 0x000a, 0x0040, 0xa255, 0xa786,
++	0x0009, 0x0040, 0xa255, 0xa085, 0x0001, 0x007c, 0x0e7e, 0x6018,
++	0x2070, 0x70a0, 0xa206, 0x0e7f, 0x007c, 0x017e, 0x6004, 0xa08e,
++	0x001e, 0x00c0, 0xa277, 0x8007, 0x6130, 0xa18c, 0x00ff, 0xa105,
++	0x6032, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0005, 0x2001,
++	0xa8a3, 0x2004, 0x6016, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x017f,
++	0x007c, 0x0005, 0x0005, 0x007c, 0x6024, 0xd0e4, 0x0040, 0xa28d,
++	0xd0cc, 0x0040, 0xa287, 0x1078, 0x8fbf, 0x0078, 0xa28d, 0x1078,
++	0xa495, 0x1078, 0x5bc1, 0x1078, 0x772d, 0x007c, 0xa280, 0x0007,
++	0x2004, 0xa084, 0x000f, 0x0079, 0xa295, 0xa29e, 0xa29e, 0xa29e,
++	0xa2a0, 0xa29e, 0xa2a0, 0xa2a0, 0xa29e, 0xa2a0, 0xa006, 0x007c,
++	0xa085, 0x0001, 0x007c, 0xa280, 0x0007, 0x2004, 0xa084, 0x000f,
++	0x0079, 0xa2aa, 0xa2b3, 0xa2b3, 0xa2b3, 0xa2b3, 0xa2b3, 0xa2b3,
++	0xa2be, 0xa2b3, 0xa2b3, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013,
++	0x2a00, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x007c, 0x0c7e, 0x2260,
++	0x1078, 0xa495, 0x603f, 0x0000, 0x6024, 0xc0f4, 0xc0cc, 0x6026,
++	0x0c7f, 0x0d7e, 0x2268, 0xa186, 0x0007, 0x00c0, 0xa31f, 0x6810,
++	0xa005, 0x0040, 0xa2dc, 0xa080, 0x0013, 0x2004, 0xd0fc, 0x00c0,
++	0xa2dc, 0x0d7f, 0x0078, 0xa2b3, 0x6007, 0x003a, 0x6003, 0x0001,
++	0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7e, 0x2d60, 0x6100, 0xa186,
++	0x0002, 0x00c0, 0xa3ad, 0x6010, 0xa005, 0x00c0, 0xa2f6, 0x6000,
++	0xa086, 0x0007, 0x10c0, 0x1332, 0x0078, 0xa3ad, 0xa08c, 0xf000,
++	0x00c0, 0xa302, 0x0078, 0xa302, 0x2068, 0x6800, 0xa005, 0x00c0,
++	0xa2fc, 0x2d00, 0xa080, 0x0013, 0x2004, 0xa084, 0x0003, 0xa086,
++	0x0002, 0x00c0, 0xa31b, 0x6010, 0x2068, 0x684c, 0xc0dc, 0xc0f4,
++	0x684e, 0x6850, 0xc0f4, 0xc0fc, 0x6852, 0x2009, 0x0043, 0x1078,
++	0x9c1e, 0x0078, 0xa3ad, 0x2009, 0x0041, 0x0078, 0xa3a7, 0xa186,
++	0x0005, 0x00c0, 0xa366, 0x6810, 0xa080, 0x0013, 0x2004, 0xd0bc,
++	0x00c0, 0xa32d, 0x0d7f, 0x0078, 0xa2b3, 0xd0b4, 0x0040, 0xa335,
++	0xd0fc, 0x1040, 0x1332, 0x0078, 0xa2cf, 0x6007, 0x003a, 0x6003,
++	0x0001, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7e, 0x2d60, 0x6100,
++	0xa186, 0x0002, 0x0040, 0xa348, 0xa186, 0x0004, 0x00c0, 0xa3ad,
++	0x2071, 0xa8e7, 0x7000, 0xa086, 0x0003, 0x00c0, 0xa355, 0x7004,
++	0xac06, 0x00c0, 0xa355, 0x7003, 0x0000, 0x6810, 0xa080, 0x0013,
++	0x200c, 0xc1f4, 0xc1dc, 0x2102, 0x8000, 0x200c, 0xc1f4, 0xc1fc,
++	0xc1bc, 0x2102, 0x2009, 0x0042, 0x0078, 0xa3a7, 0x037e, 0x0d7e,
++	0x0d7e, 0x1078, 0x138b, 0x037f, 0x1040, 0x1332, 0x6837, 0x010d,
++	0x6803, 0x0000, 0x683b, 0x0000, 0x685b, 0x0000, 0x6b5e, 0x6857,
++	0x0045, 0x2c00, 0x6862, 0x6034, 0x6872, 0x2360, 0x6024, 0xc0dd,
++	0x6026, 0x6018, 0xa080, 0x0028, 0x2004, 0xa084, 0x00ff, 0x8007,
++	0x6320, 0x6b4a, 0x6846, 0x684f, 0x0000, 0x6d6a, 0x6e66, 0x686f,
++	0x0001, 0x1078, 0x4a73, 0x2019, 0x0045, 0x6008, 0x2068, 0x1078,
++	0x9dc7, 0x2d00, 0x600a, 0x601f, 0x0006, 0x6003, 0x0007, 0x6017,
++	0x0000, 0x603f, 0x0000, 0x0d7f, 0x037f, 0x0078, 0xa3ae, 0x603f,
++	0x0000, 0x6003, 0x0007, 0x1078, 0x9c1e, 0x0c7f, 0x0d7f, 0x007c,
++	0xa186, 0x0013, 0x00c0, 0xa3ba, 0x6004, 0xa082, 0x0085, 0x2008,
++	0x0079, 0xa3d4, 0xa186, 0x0027, 0x00c0, 0xa3cd, 0x1078, 0x61cd,
++	0x037e, 0x0d7e, 0x6010, 0x2068, 0x2019, 0x0004, 0x1078, 0xa1ca,
++	0x0d7f, 0x037f, 0x1078, 0x62d1, 0x007c, 0xa186, 0x0014, 0x0040,
++	0xa3be, 0x1078, 0x7773, 0x007c, 0xa3dd, 0xa3db, 0xa3db, 0xa3db,
++	0xa3db, 0xa3db, 0xa3dd, 0x1078, 0x1332, 0x1078, 0x61cd, 0x6003,
++	0x000c, 0x1078, 0x62d1, 0x007c, 0xa182, 0x008c, 0x00c8, 0xa3ee,
++	0xa182, 0x0085, 0x0048, 0xa3ee, 0x0079, 0xa3f1, 0x1078, 0x7773,
++	0x007c, 0xa3f8, 0xa3f8, 0xa3f8, 0xa3f8, 0xa3fa, 0xa419, 0xa3f8,
++	0x1078, 0x1332, 0x0d7e, 0x2c68, 0x1078, 0x76c7, 0x0040, 0xa414,
++	0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0xab8e, 0x210c, 0x6136,
++	0x2009, 0xab8f, 0x210c, 0x613a, 0x600b, 0xffff, 0x6918, 0x611a,
++	0x601f, 0x0004, 0x1078, 0x5d8a, 0x2d60, 0x1078, 0x772d, 0x0d7f,
++	0x007c, 0x1078, 0x772d, 0x007c, 0x0e7e, 0x6018, 0x2070, 0x7000,
++	0xd0ec, 0x0e7f, 0x007c, 0x6010, 0xa08c, 0xf000, 0x0040, 0xa471,
++	0xa080, 0x0013, 0x200c, 0xd1ec, 0x0040, 0xa471, 0x2001, 0xa672,
++	0x2004, 0xd0ec, 0x0040, 0xa471, 0x6003, 0x0002, 0x6024, 0xc0e5,
++	0x6026, 0xd1ac, 0x0040, 0xa44f, 0x0f7e, 0x2c78, 0x1078, 0x495f,
++	0x0f7f, 0x0040, 0xa44f, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x2009,
++	0xa672, 0x210c, 0xd1f4, 0x00c0, 0xa46f, 0x0078, 0xa461, 0x2009,
++	0xa672, 0x210c, 0xd1f4, 0x0040, 0xa45b, 0x6024, 0xc0e4, 0x6026,
++	0xa006, 0x0078, 0xa471, 0x2001, 0xa8a4, 0x200c, 0x8103, 0xa100,
++	0x603e, 0x6018, 0xa088, 0x002b, 0x2104, 0xa005, 0x0040, 0xa46c,
++	0xa088, 0x0003, 0x0078, 0xa464, 0x2c0a, 0x600f, 0x0000, 0xa085,
++	0x0001, 0x007c, 0x017e, 0x0c7e, 0x0e7e, 0x6120, 0xa2f0, 0x002b,
++	0x2e04, 0x2060, 0x8cff, 0x0040, 0xa491, 0x84ff, 0x00c0, 0xa484,
++	0x6020, 0xa106, 0x00c0, 0xa48c, 0x600c, 0x2072, 0x1078, 0x5bc1,
++	0x1078, 0x772d, 0x0078, 0xa48e, 0xacf0, 0x0003, 0x2e64, 0x0078,
++	0xa47a, 0x0e7f, 0x0c7f, 0x017f, 0x007c, 0x0d7e, 0x6018, 0xa0e8,
++	0x002b, 0x2d04, 0xa005, 0x0040, 0xa4a7, 0xac06, 0x0040, 0xa4a5,
++	0x2d04, 0xa0e8, 0x0003, 0x0078, 0xa499, 0x600c, 0x206a, 0x0d7f,
++	0x007c, 0x027e, 0x037e, 0x157e, 0x2011, 0xa626, 0x2204, 0xa084,
++	0x00ff, 0x2019, 0xab8e, 0x2334, 0xa636, 0x00c0, 0xa4d5, 0x8318,
++	0x2334, 0x2204, 0xa084, 0xff00, 0xa636, 0x00c0, 0xa4d5, 0x2011,
++	0xab90, 0x6018, 0xa098, 0x000a, 0x20a9, 0x0004, 0x1078, 0x80de,
++	0x00c0, 0xa4d5, 0x2011, 0xab94, 0x6018, 0xa098, 0x0006, 0x20a9,
++	0x0004, 0x1078, 0x80de, 0x00c0, 0xa4d5, 0x157f, 0x037f, 0x027f,
++	0x007c, 0x0e7e, 0x2071, 0xa600, 0x1078, 0x42b8, 0x1078, 0x2677,
++	0x0e7f, 0x007c, 0x0e7e, 0x6018, 0x2070, 0x7000, 0xd0fc, 0x0040,
++	0xa4eb, 0x1078, 0xa4ed, 0x0e7f, 0x007c, 0x6850, 0xc0e5, 0x6852,
++	0x007c, 0x0e7e, 0x0c7e, 0x077e, 0x067e, 0x057e, 0x047e, 0x027e,
++	0x017e, 0x127e, 0x2091, 0x8000, 0x2029, 0xa8ba, 0x252c, 0x2021,
++	0xa8c0, 0x2424, 0x2061, 0xad00, 0x2071, 0xa600, 0x7648, 0x7064,
++	0xa606, 0x0040, 0xa545, 0x671c, 0xa786, 0x0001, 0x0040, 0xa514,
++	0xa786, 0x0008, 0x00c0, 0xa53b, 0x2500, 0xac06, 0x0040, 0xa53b,
++	0x2400, 0xac06, 0x0040, 0xa53b, 0x1078, 0xa242, 0x0040, 0xa53b,
++	0x1078, 0xa256, 0x00c0, 0xa53b, 0x6000, 0xa086, 0x0004, 0x00c0,
++	0xa52d, 0x017e, 0x1078, 0x1757, 0x017f, 0x1078, 0x8eec, 0x00c0,
++	0xa533, 0x1078, 0x28a6, 0x1078, 0x8f00, 0x00c0, 0xa539, 0x1078,
++	0x7c83, 0x1078, 0x8ec6, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004,
++	0xac02, 0x00c8, 0xa545, 0x0078, 0xa504, 0x127f, 0x017f, 0x027f,
++	0x047f, 0x057f, 0x067f, 0x077f, 0x0c7f, 0x0e7f, 0x007c, 0x127e,
++	0x007e, 0x0e7e, 0x017e, 0x2091, 0x8000, 0x2071, 0xa640, 0xd5a4,
++	0x0040, 0xa55d, 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0040, 0xa563,
++	0x7030, 0x8000, 0x7032, 0xd5ac, 0x0040, 0xa579, 0x2500, 0xa084,
++	0x0007, 0xa08e, 0x0003, 0x0040, 0xa579, 0xa08e, 0x0004, 0x0040,
++	0xa579, 0xa08e, 0x0005, 0x0040, 0xa579, 0x2071, 0xa64a, 0x1078,
++	0xa5ba, 0x017f, 0x0e7f, 0x007f, 0x127f, 0x007c, 0x127e, 0x007e,
++	0x0e7e, 0x017e, 0x2091, 0x8000, 0x2071, 0xa640, 0xd5a4, 0x0040,
++	0xa58c, 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0040, 0xa592, 0x7030,
++	0x8000, 0x7032, 0xd5ac, 0x0040, 0xa5a8, 0x2500, 0xa084, 0x0007,
++	0xa08e, 0x0003, 0x0040, 0xa5a8, 0xa08e, 0x0004, 0x0040, 0xa5a8,
++	0xa08e, 0x0005, 0x0040, 0xa5a8, 0x2071, 0xa64a, 0x1078, 0xa5ba,
++	0x017f, 0x0e7f, 0x007f, 0x127f, 0x007c, 0x127e, 0x007e, 0x0e7e,
++	0x2091, 0x8000, 0x2071, 0xa642, 0x1078, 0xa5ba, 0x0e7f, 0x007f,
++	0x127f, 0x007c, 0x2e04, 0x8000, 0x2072, 0x00c8, 0xa5c3, 0x8e70,
++	0x2e04, 0x8000, 0x2072, 0x007c, 0x0e7e, 0x2071, 0xa640, 0x1078,
++	0xa5ba, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa644, 0x1078, 0xa5ba,
++	0x0e7f, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071,
++	0xa640, 0x7044, 0x8000, 0x7046, 0x0e7f, 0x007f, 0x127f, 0x007c,
++	0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
++	0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000,
++	0xa50c
++};
++#else
++/*
++ *	Firmware Version 1.15.37 (15:36 May 03, 1999)
++ */
++static const u_int16_t isp_2100_risc_code[] = {
++	0x0078, 0x1029, 0x0000, 0x66e6, 0x0000, 0x2043, 0x4f50, 0x5952,
++	0x4947, 0x4854, 0x2031, 0x3939, 0x3620, 0x514c, 0x4f47, 0x4943,
++	0x2043, 0x4f52, 0x504f, 0x5241, 0x5449, 0x4f4e, 0x2049, 0x5350,
++	0x3231, 0x3030, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056,
++	0x6572, 0x7369, 0x6f6e, 0x2030, 0x312e, 0x3135, 0x2020, 0x2020,
++	0x2400, 0x20c1, 0x0021, 0x20a1, 0x76e6, 0x2009, 0x0000, 0x20a9,
++	0x071a, 0x41a4, 0x3400, 0x20c9, 0x7bff, 0x2091, 0x2000, 0x2059,
++	0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x209a, 0x2051, 0x7700,
++	0x2a70, 0x705b, 0x9600, 0x705f, 0xffff, 0x7057, 0x95f9, 0x7063,
++	0x0300, 0x1078, 0x127a, 0x20a1, 0x7e00, 0x715c, 0x810d, 0x810d,
++	0x810d, 0x810d, 0xa18c, 0x000f, 0x2001, 0x0007, 0xa112, 0xa00e,
++	0x21a8, 0x41a4, 0x3400, 0x8211, 0x00c0, 0x1058, 0x715c, 0x3400,
++	0xa102, 0x0040, 0x1068, 0x0048, 0x1068, 0x20a8, 0xa00e, 0x41a4,
++	0x1078, 0x1241, 0x1078, 0x1366, 0x1078, 0x14eb, 0x1078, 0x19c0,
++	0x1078, 0x362b, 0x1078, 0x5cac, 0x1078, 0x12f1, 0x1078, 0x2429,
++	0x1078, 0x3d6e, 0x1078, 0x3b46, 0x1078, 0x45af, 0x1078, 0x1e55,
++	0x1078, 0x47ef, 0x1078, 0x428f, 0x1078, 0x1d74, 0x1078, 0x1e34,
++	0x2091, 0x3009, 0x7823, 0x0000, 0x0090, 0x109d, 0x7820, 0xa086,
++	0x0002, 0x00c0, 0x109d, 0x7823, 0x4000, 0x0068, 0x1095, 0x781b,
++	0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2a70, 0x7003, 0x0000,
++	0x2001, 0x017f, 0x2003, 0x0000, 0x2a70, 0x7000, 0xa08e, 0x0003,
++	0x00c0, 0x10bd, 0x1078, 0x2d9c, 0x1078, 0x2451, 0x1078, 0x3dbe,
++	0x1078, 0x3c31, 0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0048,
++	0x10c1, 0x1078, 0x45c7, 0x0078, 0x10a4, 0x1079, 0x10c5, 0x0078,
++	0x10aa, 0x1078, 0x597e, 0x0078, 0x10b9, 0x10cf, 0x10d0, 0x1143,
++	0x10cd, 0x11be, 0x123e, 0x123f, 0x1240, 0x1078, 0x12cd, 0x007c,
++	0x127e, 0x0f7e, 0x2091, 0x8000, 0x1078, 0x2ec1, 0x2079, 0x0100,
++	0x7844, 0xa005, 0x00c0, 0x1134, 0x2011, 0x3558, 0x1078, 0x4689,
++	0x780f, 0x00ff, 0x7840, 0xa084, 0xfffb, 0x7842, 0x2011, 0x8010,
++	0x73b8, 0x1078, 0x2d59, 0x1078, 0x57c9, 0x2011, 0x0004, 0x1078,
++	0x6a6d, 0x1078, 0x3ae0, 0x70c7, 0x0000, 0x70c3, 0x0000, 0x1078,
++	0x1137, 0x72bc, 0x2079, 0x7751, 0x7804, 0xd0ac, 0x0040, 0x1101,
++	0xc295, 0x72be, 0xa296, 0x0004, 0x0040, 0x1122, 0x2011, 0x0001,
++	0x1078, 0x6a6d, 0x708b, 0x0000, 0x708f, 0xffff, 0x7003, 0x0002,
++	0x0f7f, 0x1078, 0x214a, 0x2011, 0x0005, 0x1078, 0x58d8, 0x1078,
++	0x4d96, 0x0c7e, 0x2061, 0x0100, 0x60e3, 0x0008, 0x0c7f, 0x127f,
++	0x0078, 0x1136, 0x708b, 0x0000, 0x708f, 0xffff, 0x7003, 0x0002,
++	0x2011, 0x0005, 0x1078, 0x58d8, 0x1078, 0x4d96, 0x0c7e, 0x2061,
++	0x0100, 0x60e3, 0x0008, 0x0c7f, 0x0f7f, 0x127f, 0x007c, 0x0c7e,
++	0x20a9, 0x0082, 0x2009, 0x007e, 0x1078, 0x3834, 0x8108, 0x00f0,
++	0x113c, 0x0c7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x708c, 0xa086,
++	0xffff, 0x0040, 0x1151, 0x1078, 0x214a, 0x1078, 0x4d96, 0x0078,
++	0x11bc, 0x70bc, 0xd09c, 0x0040, 0x1179, 0xd084, 0x0040, 0x1179,
++	0x0f7e, 0x2079, 0x0100, 0x790c, 0xc1b5, 0x790e, 0x0f7f, 0xd08c,
++	0x0040, 0x1179, 0x70c0, 0xa086, 0xffff, 0x0040, 0x1175, 0x1078,
++	0x223f, 0x1078, 0x4d96, 0x2011, 0x0001, 0x2019, 0x0000, 0x1078,
++	0x2277, 0x1078, 0x4d96, 0x0078, 0x11bc, 0x70c4, 0xa005, 0x00c0,
++	0x11bc, 0x7088, 0xa005, 0x00c0, 0x11bc, 0x2001, 0x7752, 0x2004,
++	0xd0ac, 0x0040, 0x119f, 0x157e, 0x0c7e, 0x20a9, 0x007f, 0x2009,
++	0x0000, 0x017e, 0x1078, 0x384c, 0x00c0, 0x1192, 0x6000, 0xd0ec,
++	0x00c0, 0x119a, 0x017f, 0x8108, 0x00f0, 0x1189, 0x0c7f, 0x157f,
++	0x0078, 0x119f, 0x017f, 0x0c7f, 0x157f, 0x0078, 0x11bc, 0x7003,
++	0x0003, 0x708f, 0xffff, 0x2001, 0x0000, 0x1078, 0x2025, 0x1078,
++	0x2dd7, 0x2001, 0x7937, 0x2004, 0xa086, 0x0005, 0x00c0, 0x11b4,
++	0x2011, 0x0000, 0x1078, 0x58d8, 0x2011, 0x0000, 0x1078, 0x58e2,
++	0x1078, 0x4d96, 0x1078, 0x4e56, 0x127f, 0x007c, 0x017e, 0x0f7e,
++	0x127e, 0x2091, 0x8000, 0x2079, 0x0100, 0x7940, 0xa18c, 0x0010,
++	0x7942, 0x7924, 0xd1b4, 0x0040, 0x11cf, 0x7827, 0x0040, 0xd19c,
++	0x0040, 0x11d4, 0x7827, 0x0008, 0x007e, 0x037e, 0x157e, 0x7900,
++	0xa18a, 0x0003, 0x0050, 0x11fa, 0x7954, 0xd1ac, 0x00c0, 0x11fa,
++	0x2009, 0x00f8, 0x1078, 0x35fa, 0x7843, 0x0090, 0x7843, 0x0010,
++	0x20a9, 0x09c4, 0x7820, 0xd09c, 0x00c0, 0x11f2, 0x7824, 0xd0ac,
++	0x00c0, 0x122e, 0x00f0, 0x11ea, 0x2001, 0x0001, 0x1078, 0x2025,
++	0x0078, 0x1237, 0x7853, 0x0000, 0x782f, 0x0020, 0x20a9, 0x0008,
++	0x00e0, 0x1200, 0x2091, 0x6000, 0x00f0, 0x1200, 0x7853, 0x0400,
++	0x782f, 0x0000, 0x2009, 0x00f8, 0x1078, 0x35fa, 0x20a9, 0x000e,
++	0x0005, 0x00f0, 0x1210, 0x7853, 0x1400, 0x7843, 0x0090, 0x7843,
++	0x0010, 0x2019, 0x61a8, 0x7854, 0x0005, 0x0005, 0xd08c, 0x0040,
++	0x1225, 0x7824, 0xd0ac, 0x00c0, 0x122e, 0x8319, 0x00c0, 0x121b,
++	0x2001, 0x0001, 0x1078, 0x2025, 0x0078, 0x1235, 0x7828, 0xc09d,
++	0x782a, 0x7827, 0x0008, 0x7827, 0x0040, 0x7853, 0x0400, 0x157f,
++	0x037f, 0x007f, 0x127f, 0x0f7f, 0x017f, 0x007c, 0x007c, 0x007c,
++	0x007c, 0x2a70, 0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0048,
++	0x124d, 0x704f, 0xffff, 0x0078, 0x124f, 0x704f, 0x0000, 0x7053,
++	0xffff, 0x7067, 0x0000, 0x706b, 0x0000, 0x2061, 0x7920, 0x6003,
++	0x0909, 0x6007, 0x0000, 0x600b, 0x8800, 0x600f, 0x0200, 0x6013,
++	0x00ff, 0x6017, 0x0003, 0x601b, 0x0000, 0x601f, 0x07d0, 0x2061,
++	0x7928, 0x6003, 0x8000, 0x6007, 0x0000, 0x600b, 0x0000, 0x600f,
++	0x0200, 0x6013, 0x00ff, 0x6017, 0x0000, 0x601b, 0x0001, 0x601f,
++	0x0000, 0x007c, 0x1078, 0x12a0, 0x2011, 0x0000, 0x81ff, 0x0040,
++	0x129f, 0xa186, 0x0001, 0x00c0, 0x128f, 0x705f, 0x8fff, 0x7057,
++	0x8601, 0x7063, 0x0100, 0x705b, 0x8600, 0x0078, 0x129d, 0xa186,
++	0x0002, 0x00c0, 0x1297, 0x2011, 0x0000, 0x0078, 0x129d, 0xa186,
++	0x0005, 0x00c0, 0x129d, 0x2011, 0x0001, 0x1078, 0x12c7, 0x007c,
++	0x2009, 0x0000, 0x2011, 0x0000, 0x1078, 0x12c7, 0x2019, 0xaaaa,
++	0x2061, 0xffff, 0x2362, 0x2c24, 0x2061, 0x7fff, 0x2c04, 0xa406,
++	0x0040, 0x12b5, 0xc18d, 0x0078, 0x12c2, 0xc185, 0x2011, 0x0001,
++	0x1078, 0x12c7, 0x2061, 0xffff, 0x2362, 0x2c04, 0xa306, 0x00c0,
++	0x12c2, 0xc195, 0x2011, 0x0001, 0x1078, 0x12c7, 0x007c, 0x3800,
++	0xa084, 0xfffc, 0xa205, 0x20c0, 0x007c, 0x2091, 0x8000, 0x0068,
++	0x12cf, 0x007e, 0x017e, 0x2079, 0x0000, 0x7818, 0xa084, 0x0000,
++	0x00c0, 0x12d5, 0x017f, 0x792e, 0x007f, 0x782a, 0x007f, 0x7826,
++	0x3900, 0x783a, 0x7823, 0x8002, 0x781b, 0x0001, 0x2091, 0x5000,
++	0x2091, 0x4080, 0x2079, 0x7700, 0x7803, 0x0005, 0x0078, 0x12ee,
++	0x007c, 0x2071, 0x7700, 0x7158, 0x712e, 0x2021, 0x0001, 0xa190,
++	0x002d, 0xa298, 0x002d, 0x0048, 0x1307, 0x705c, 0xa302, 0x00c8,
++	0x1307, 0x220a, 0x2208, 0x2310, 0x8420, 0x0078, 0x12f9, 0x200b,
++	0x0000, 0x749e, 0x74a2, 0x007c, 0x0e7e, 0x127e, 0x2091, 0x8000,
++	0x2071, 0x7700, 0x70a0, 0xa0ea, 0x0010, 0x00c8, 0x131a, 0xa06e,
++	0x0078, 0x1324, 0x8001, 0x70a2, 0x702c, 0x2068, 0x2d04, 0x702e,
++	0x206b, 0x0000, 0x6807, 0x0000, 0x127f, 0x0e7f, 0x007c, 0x0e7e,
++	0x2071, 0x7700, 0x127e, 0x2091, 0x8000, 0x70a0, 0x8001, 0x00c8,
++	0x1334, 0xa06e, 0x0078, 0x133d, 0x70a2, 0x702c, 0x2068, 0x2d04,
++	0x702e, 0x206b, 0x0000, 0x6807, 0x0000, 0x127f, 0x0e7f, 0x007c,
++	0x0e7e, 0x127e, 0x2091, 0x8000, 0x2071, 0x7700, 0x702c, 0x206a,
++	0x2d00, 0x702e, 0x70a0, 0x8000, 0x70a2, 0x127f, 0x0e7f, 0x007c,
++	0x8dff, 0x0040, 0x135c, 0x6804, 0x6807, 0x0000, 0x007e, 0x1078,
++	0x1340, 0x0d7f, 0x0078, 0x1350, 0x007c, 0x0e7e, 0x2071, 0x7700,
++	0x70a0, 0xa08a, 0x0010, 0xa00d, 0x0e7f, 0x007c, 0x0e7e, 0x2071,
++	0x7959, 0x7007, 0x0000, 0x701b, 0x0000, 0x701f, 0x0000, 0x2071,
++	0x0000, 0x7010, 0xa085, 0x8004, 0x7012, 0x0e7f, 0x007c, 0x0e7e,
++	0x2270, 0x700b, 0x0000, 0x2071, 0x7959, 0x7018, 0xa088, 0x7962,
++	0x220a, 0x8000, 0xa084, 0x0007, 0x701a, 0x7004, 0xa005, 0x00c0,
++	0x138f, 0x0f7e, 0x2079, 0x0010, 0x1078, 0x13a0, 0x0f7f, 0x0e7f,
++	0x007c, 0x0e7e, 0x2071, 0x7959, 0x7004, 0xa005, 0x00c0, 0x139e,
++	0x0f7e, 0x2079, 0x0010, 0x1078, 0x13a0, 0x0f7f, 0x0e7f, 0x007c,
++	0x7000, 0x0079, 0x13a3, 0x13a7, 0x1411, 0x142e, 0x142e, 0x7018,
++	0x711c, 0xa106, 0x00c0, 0x13af, 0x7007, 0x0000, 0x007c, 0x0d7e,
++	0xa180, 0x7962, 0x2004, 0x700a, 0x2068, 0x8108, 0xa18c, 0x0007,
++	0x711e, 0x7803, 0x0026, 0x6824, 0x7832, 0x6828, 0x7836, 0x682c,
++	0x783a, 0x6830, 0x783e, 0x6810, 0x700e, 0x680c, 0x7016, 0x6804,
++	0x0d7f, 0xd084, 0x0040, 0x13d1, 0x7007, 0x0001, 0x1078, 0x13d6,
++	0x007c, 0x7007, 0x0002, 0x1078, 0x13ec, 0x007c, 0x017e, 0x027e,
++	0x710c, 0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x13e1, 0x2110,
++	0xa006, 0x700e, 0x7212, 0x8203, 0x7822, 0x7803, 0x0020, 0x7803,
++	0x0041, 0x027f, 0x017f, 0x007c, 0x017e, 0x027e, 0x137e, 0x147e,
++	0x157e, 0x7014, 0x2098, 0x20a1, 0x0014, 0x7803, 0x0026, 0x710c,
++	0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x1400, 0x2110, 0xa006,
++	0x700e, 0x22a8, 0x53a6, 0x8203, 0x7822, 0x7803, 0x0020, 0x7803,
++	0x0001, 0x3300, 0x7016, 0x157f, 0x147f, 0x137f, 0x027f, 0x017f,
++	0x007c, 0x137e, 0x147e, 0x157e, 0x2099, 0x77e5, 0x20a1, 0x0018,
++	0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, 0x2091, 0x8000,
++	0x7803, 0x0041, 0x7007, 0x0003, 0x7000, 0xc084, 0x7002, 0x700b,
++	0x77e0, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x137e, 0x147e,
++	0x157e, 0x2001, 0x7814, 0x209c, 0x20a1, 0x0014, 0x7803, 0x0026,
++	0x2001, 0x7815, 0x20ac, 0x53a6, 0x2099, 0x7816, 0x20a1, 0x0018,
++	0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, 0x2091, 0x8000,
++	0x7803, 0x0001, 0x7007, 0x0004, 0x7000, 0xc08c, 0x7002, 0x700b,
++	0x7811, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x017e, 0x0e7e,
++	0x2071, 0x7959, 0x0f7e, 0x2079, 0x0010, 0x7904, 0x7803, 0x0002,
++	0xd1fc, 0x0040, 0x1471, 0xa18c, 0x0700, 0x0040, 0x146e, 0x7008,
++	0xa080, 0x0002, 0x2003, 0x0200, 0x0078, 0x1471, 0x7004, 0x1079,
++	0x1475, 0x0f7f, 0x0e7f, 0x017f, 0x007c, 0x13a0, 0x147d, 0x149f,
++	0x14b9, 0x14e2, 0x147b, 0x0078, 0x147b, 0x137e, 0x147e, 0x157e,
++	0x7014, 0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x7010, 0x20a8,
++	0x53a5, 0x3400, 0x7016, 0x157f, 0x147f, 0x137f, 0x700c, 0xa005,
++	0x0040, 0x14a6, 0x1078, 0x13d6, 0x007c, 0x7008, 0xa080, 0x0002,
++	0x2003, 0x0100, 0x7007, 0x0000, 0x1078, 0x13a0, 0x007c, 0x700c,
++	0xa005, 0x0040, 0x14a6, 0x1078, 0x13ec, 0x007c, 0x0d7e, 0x7008,
++	0x2068, 0x7830, 0x6826, 0x7834, 0x682a, 0x7838, 0x682e, 0x783c,
++	0x6832, 0x680b, 0x0100, 0x0d7f, 0x7007, 0x0000, 0x1078, 0x13a0,
++	0x007c, 0x137e, 0x147e, 0x157e, 0x2001, 0x77e3, 0x2004, 0xa080,
++	0x000d, 0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x20a9, 0x0020,
++	0x53a5, 0x2001, 0x77e5, 0x2004, 0xd0bc, 0x0040, 0x14d8, 0x2001,
++	0x77ee, 0x2004, 0xa080, 0x000d, 0x20a0, 0x20a9, 0x0020, 0x53a5,
++	0x157f, 0x147f, 0x137f, 0x7007, 0x0000, 0x1078, 0x3e67, 0x1078,
++	0x13a0, 0x007c, 0x2001, 0x7813, 0x2003, 0x0100, 0x7007, 0x0000,
++	0x1078, 0x13a0, 0x007c, 0x127e, 0x2091, 0x2100, 0x2079, 0x0030,
++	0x2071, 0x796a, 0x7003, 0x0000, 0x700f, 0x7970, 0x7013, 0x7970,
++	0x780f, 0x0070, 0x127f, 0x007c, 0x6934, 0xa184, 0x0007, 0x0079,
++	0x1501, 0x1509, 0x154f, 0x1509, 0x1509, 0x1509, 0x1534, 0x1518,
++	0x150d, 0xa085, 0x0001, 0x0078, 0x1569, 0x684c, 0xd0bc, 0x0040,
++	0x1509, 0x6860, 0x682e, 0x685c, 0x682a, 0x6858, 0x0078, 0x1557,
++	0xa18c, 0x00ff, 0xa186, 0x001e, 0x00c0, 0x1509, 0x684c, 0xd0bc,
++	0x0040, 0x1509, 0x6860, 0x682e, 0x685c, 0x682a, 0x6804, 0x681a,
++	0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x1c7e, 0x2004,
++	0x6832, 0x6858, 0x0078, 0x155f, 0xa18c, 0x00ff, 0xa186, 0x0015,
++	0x00c0, 0x1509, 0x684c, 0xd0ac, 0x0040, 0x1509, 0x6804, 0x681a,
++	0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x1c7e, 0x2004,
++	0x6832, 0xa006, 0x682e, 0x682a, 0x6858, 0x0078, 0x155f, 0x684c,
++	0xd0ac, 0x0040, 0x1509, 0xa006, 0x682e, 0x682a, 0x6858, 0xa18c,
++	0x000f, 0xa188, 0x1c7e, 0x210c, 0x6932, 0x2d08, 0x691a, 0x6826,
++	0x684c, 0xc0dd, 0x684e, 0xa006, 0x680a, 0x697c, 0x6912, 0x6980,
++	0x6916, 0x007c, 0x20e1, 0x0007, 0x20e1, 0x2000, 0x2001, 0x020a,
++	0x2004, 0x82ff, 0x0040, 0x1584, 0xa280, 0x0004, 0x0d7e, 0x206c,
++	0x684c, 0xd0dc, 0x00c0, 0x1580, 0x1078, 0x14fc, 0x10c0, 0x12cd,
++	0x6808, 0x8000, 0x680a, 0x0d7f, 0x127e, 0x047e, 0x037e, 0x027e,
++	0x2091, 0x2100, 0x027f, 0x037f, 0x047f, 0x7000, 0xa005, 0x00c0,
++	0x1598, 0x7206, 0x2001, 0x15ac, 0x007e, 0x2260, 0x0078, 0x16c4,
++	0x710c, 0x220a, 0x8108, 0x230a, 0x8108, 0x240a, 0x8108, 0xa182,
++	0x798b, 0x0048, 0x15a5, 0x2009, 0x7970, 0x710e, 0x7000, 0xa005,
++	0x00c0, 0x15ac, 0x1078, 0x16ad, 0x127f, 0x007c, 0x127e, 0x027e,
++	0x037e, 0x0c7e, 0x007e, 0x2091, 0x2100, 0x007f, 0x047f, 0x037f,
++	0x027f, 0x0d7e, 0x0c7e, 0x2460, 0x6110, 0x2168, 0x6a62, 0x6b5e,
++	0xa005, 0x0040, 0x1600, 0x6808, 0xa005, 0x0040, 0x1666, 0x7000,
++	0xa005, 0x00c0, 0x15cd, 0x0078, 0x15fa, 0x700c, 0x7110, 0xa106,
++	0x00c0, 0x166a, 0x7004, 0xa406, 0x00c0, 0x15fa, 0x2001, 0x0005,
++	0x2004, 0xd08c, 0x0040, 0x15e3, 0x047e, 0x1078, 0x1785, 0x047f,
++	0x2460, 0x0078, 0x15c3, 0x2001, 0x0207, 0x2004, 0xd09c, 0x00c0,
++	0x15d6, 0x7804, 0xa084, 0x6000, 0x0040, 0x15f4, 0xa086, 0x6000,
++	0x0040, 0x15f4, 0x0078, 0x15d6, 0x7803, 0x0004, 0x7003, 0x0000,
++	0x7004, 0x2060, 0x2009, 0x0048, 0x1078, 0x5d41, 0x0078, 0x166a,
++	0x6808, 0xa005, 0x0040, 0x1666, 0x7000, 0xa005, 0x00c0, 0x160a,
++	0x0078, 0x1666, 0x700c, 0x7110, 0xa106, 0x00c0, 0x1613, 0x7004,
++	0xa406, 0x00c0, 0x1666, 0x2001, 0x0005, 0x2004, 0xd08c, 0x0040,
++	0x1620, 0x047e, 0x1078, 0x1785, 0x047f, 0x2460, 0x0078, 0x1600,
++	0x2001, 0x0207, 0x2004, 0xd09c, 0x00c0, 0x1613, 0x2001, 0x0005,
++	0x2004, 0xd08c, 0x00c0, 0x1619, 0x7804, 0xa084, 0x6000, 0x0040,
++	0x1637, 0xa086, 0x6000, 0x0040, 0x1637, 0x0078, 0x1613, 0x7007,
++	0x0000, 0xa016, 0x2218, 0x7000, 0xa08e, 0x0001, 0x0040, 0x1658,
++	0xa08e, 0x0002, 0x00c0, 0x1666, 0x0c7e, 0x0e7e, 0x6818, 0x2060,
++	0x1078, 0x1c53, 0x2804, 0xac70, 0x6034, 0xd09c, 0x00c0, 0x1654,
++	0x7308, 0x720c, 0x0078, 0x1656, 0x7310, 0x7214, 0x0e7f, 0x0c7f,
++	0x7820, 0xa318, 0x7824, 0xa211, 0x6810, 0xa300, 0x6812, 0x6814,
++	0xa201, 0x6816, 0x7803, 0x0004, 0x7003, 0x0000, 0x2009, 0x0048,
++	0x1078, 0x5d41, 0x0c7f, 0x0d7f, 0x127f, 0x007c, 0x0f7e, 0x0e7e,
++	0x2071, 0x796a, 0x7000, 0xa086, 0x0000, 0x0040, 0x16aa, 0x7004,
++	0xac06, 0x00c0, 0x169b, 0x2079, 0x0030, 0x7804, 0xd0fc, 0x00c0,
++	0x1697, 0x2001, 0x0207, 0x2004, 0xd09c, 0x00c0, 0x167d, 0x7803,
++	0x0004, 0x7804, 0xd0ac, 0x00c0, 0x1689, 0x7803, 0x0002, 0x7803,
++	0x0009, 0x7003, 0x0003, 0x7007, 0x0000, 0x0078, 0x169b, 0x1078,
++	0x1785, 0x0078, 0x1672, 0x157e, 0x20a9, 0x0009, 0x2009, 0x7970,
++	0x2104, 0xac06, 0x00c0, 0x16a5, 0x200a, 0xa188, 0x0003, 0x00f0,
++	0x16a0, 0x157f, 0x0e7f, 0x0f7f, 0x007c, 0x700c, 0x7110, 0xa106,
++	0x00c0, 0x16b5, 0x7003, 0x0000, 0x007c, 0x2104, 0x7006, 0x2060,
++	0x8108, 0x211c, 0x8108, 0x2124, 0x8108, 0xa182, 0x798b, 0x0048,
++	0x16c3, 0x2009, 0x7970, 0x7112, 0x8cff, 0x00c0, 0x16cb, 0x1078,
++	0x1950, 0x0078, 0x16f2, 0x6010, 0x2068, 0x2d58, 0x6828, 0xa406,
++	0x00c0, 0x16d6, 0x682c, 0xa306, 0x0040, 0x16da, 0x1078, 0x1c9e,
++	0x00c0, 0x16c7, 0x684c, 0xd0f4, 0x00c0, 0x16c7, 0x6824, 0x2050,
++	0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f, 0x2009,
++	0x0011, 0x1078, 0x16f3, 0x0040, 0x16f1, 0x2009, 0x0001, 0x1078,
++	0x16f3, 0x2d58, 0x007c, 0x8aff, 0x0040, 0x1780, 0xa03e, 0x2730,
++	0x6850, 0xd0fc, 0x00c0, 0x1712, 0x0d7e, 0x2804, 0xac68, 0x2900,
++	0x0079, 0x1702, 0x1762, 0x1722, 0x1722, 0x1762, 0x1762, 0x175a,
++	0x1762, 0x1722, 0x1762, 0x1728, 0x1728, 0x1762, 0x1762, 0x1762,
++	0x1751, 0x1728, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20,
++	0x0d7e, 0xd99c, 0x0040, 0x1765, 0x2804, 0xac68, 0x6f08, 0x6e0c,
++	0x0078, 0x1765, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x0078, 0x1765,
++	0x7b0c, 0xd3bc, 0x0040, 0x1749, 0x7004, 0x0e7e, 0x2070, 0x701c,
++	0x0e7f, 0xa086, 0x0008, 0x00c0, 0x1749, 0x7b08, 0xa39c, 0x0fff,
++	0x2d20, 0x0d7f, 0x0d7e, 0x6a14, 0x82ff, 0x00c0, 0x1744, 0x6810,
++	0xa302, 0x0048, 0x1744, 0x6b10, 0x2011, 0x0000, 0x2468, 0x0078,
++	0x174b, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x0078,
++	0x1765, 0x0d7f, 0x0d7e, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e,
++	0x00c0, 0x1762, 0x0d7f, 0x1078, 0x1c3a, 0x00c0, 0x16f3, 0xa00e,
++	0x0078, 0x1780, 0x0d7f, 0x1078, 0x12cd, 0x7b22, 0x7a26, 0x7d32,
++	0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000, 0x8000, 0x7002, 0x0d7f,
++	0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x2300, 0x6b10,
++	0xa302, 0x6812, 0x2200, 0x6a14, 0xa203, 0x6816, 0x1078, 0x1c3a,
++	0x007c, 0x1078, 0x12cd, 0x1078, 0x12cd, 0x127e, 0x2091, 0x2100,
++	0x007e, 0x017e, 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002,
++	0xa184, 0x0700, 0x00c0, 0x1783, 0xa184, 0x0003, 0xa086, 0x0003,
++	0x0040, 0x1783, 0x7000, 0x0079, 0x179d, 0x17a5, 0x17a7, 0x187f,
++	0x18e7, 0x18fe, 0x17a5, 0x17a5, 0x17a5, 0x1078, 0x12cd, 0x8001,
++	0x7002, 0xa184, 0x0880, 0x00c0, 0x17bc, 0x8aff, 0x0040, 0x181f,
++	0x2009, 0x0001, 0x1078, 0x16f3, 0x0040, 0x1910, 0x2009, 0x0001,
++	0x1078, 0x16f3, 0x0078, 0x1910, 0x7803, 0x0004, 0x7003, 0x0000,
++	0xd1bc, 0x00c0, 0x1807, 0x027e, 0x037e, 0x6b28, 0x6a2c, 0x7820,
++	0x686e, 0xa31a, 0x7824, 0x6872, 0xa213, 0x6b2a, 0x6a2e, 0x7820,
++	0x6910, 0xa100, 0x6812, 0x7824, 0x6914, 0xa101, 0x6816, 0x037f,
++	0x027f, 0x7830, 0x681e, 0x7834, 0x6822, 0x1078, 0x1c53, 0x2a00,
++	0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, 0x0000, 0x6850,
++	0xc0fd, 0x6852, 0x6808, 0x8001, 0x680a, 0x00c0, 0x17f9, 0x684c,
++	0xd0e4, 0x0040, 0x17f9, 0x7004, 0x2060, 0x2009, 0x0048, 0x1078,
++	0x5d41, 0x7808, 0xd0ec, 0x00c0, 0x1803, 0x7803, 0x0009, 0x7003,
++	0x0004, 0x0078, 0x1910, 0x1078, 0x16ad, 0x0078, 0x1910, 0x057e,
++	0x7d0c, 0xd5bc, 0x00c0, 0x180e, 0x1078, 0x7692, 0x057f, 0x1078,
++	0x1914, 0x682b, 0xffff, 0x682f, 0xffff, 0x697c, 0x6912, 0x6980,
++	0x6916, 0x7803, 0x0009, 0x7003, 0x0003, 0x0078, 0x1910, 0x684c,
++	0xc0f5, 0x684e, 0x7814, 0xa005, 0x00c0, 0x1837, 0x7003, 0x0000,
++	0x6808, 0x8001, 0x680a, 0x00c0, 0x1833, 0x7004, 0x2060, 0x2009,
++	0x0048, 0x1078, 0x5d41, 0x1078, 0x16ad, 0x0078, 0x1910, 0x7814,
++	0x6910, 0xa102, 0x6812, 0x6914, 0xa183, 0x0000, 0x6816, 0x7814,
++	0x7908, 0xa18c, 0x0fff, 0xa188, 0x0007, 0x8114, 0x8214, 0x8214,
++	0xa10a, 0x8104, 0x8004, 0x8004, 0xa20a, 0x810b, 0x810b, 0x810b,
++	0x1078, 0x197b, 0x7803, 0x0004, 0x780f, 0xffff, 0x7803, 0x0001,
++	0x7804, 0xd0fc, 0x0040, 0x1858, 0x7803, 0x0002, 0x7803, 0x0004,
++	0x780f, 0x0070, 0x7004, 0x7007, 0x0000, 0x2060, 0x2009, 0x0048,
++	0x1078, 0x5d41, 0x1078, 0x199e, 0x0040, 0x1833, 0x7908, 0xd1ec,
++	0x00c0, 0x1876, 0x2009, 0x0009, 0x0078, 0x1878, 0x2009, 0x0019,
++	0x7902, 0x7803, 0x0009, 0x7003, 0x0003, 0x0078, 0x1910, 0x8001,
++	0x7002, 0xd194, 0x0040, 0x1891, 0x7804, 0xd0fc, 0x00c0, 0x178d,
++	0x8aff, 0x0040, 0x1910, 0x2009, 0x0001, 0x1078, 0x16f3, 0x0078,
++	0x1910, 0xa184, 0x0880, 0x00c0, 0x189e, 0x8aff, 0x0040, 0x1910,
++	0x2009, 0x0001, 0x1078, 0x16f3, 0x0078, 0x1910, 0x7803, 0x0004,
++	0x7003, 0x0000, 0xd1bc, 0x00c0, 0x18d2, 0x027e, 0x037e, 0x6b28,
++	0x6a2c, 0x1078, 0x1c53, 0x0d7e, 0x0f7e, 0x2d78, 0x2804, 0xac68,
++	0x6034, 0xd09c, 0x00c0, 0x18c2, 0x6808, 0x2008, 0xa31a, 0x680c,
++	0xa213, 0x7810, 0xa100, 0x7812, 0x690c, 0x7814, 0xa101, 0x7816,
++	0x0078, 0x18ce, 0x6810, 0x2008, 0xa31a, 0x6814, 0xa213, 0x7810,
++	0xa100, 0x7812, 0x6914, 0x7814, 0xa101, 0x7816, 0x0f7f, 0x0d7f,
++	0x0078, 0x17c7, 0x057e, 0x7d0c, 0x1078, 0x7692, 0x057f, 0x1078,
++	0x1914, 0x682b, 0xffff, 0x682f, 0xffff, 0x697c, 0x6912, 0x6980,
++	0x6916, 0x7803, 0x0009, 0x7003, 0x0003, 0x0078, 0x1910, 0x7803,
++	0x0004, 0x7003, 0x0000, 0x7004, 0xa00d, 0x0040, 0x18fa, 0x6808,
++	0x8001, 0x680a, 0x00c0, 0x18fa, 0x7004, 0x2060, 0x2009, 0x0048,
++	0x1078, 0x5d41, 0x1078, 0x16ad, 0x0078, 0x1910, 0x7803, 0x0004,
++	0x7003, 0x0000, 0x7004, 0x2060, 0x6010, 0xa005, 0x0040, 0x18fa,
++	0x2068, 0x6808, 0x8000, 0x680a, 0x6c28, 0x6b2c, 0x1078, 0x16c4,
++	0x017f, 0x007f, 0x127f, 0x007c, 0x1078, 0x1925, 0x20e1, 0x9028,
++	0x700f, 0x7970, 0x7013, 0x7970, 0x2001, 0x015d, 0x200c, 0x810a,
++	0x2102, 0x2001, 0x0138, 0x2202, 0x007c, 0x2001, 0x0138, 0x2014,
++	0x2003, 0x0000, 0x2021, 0xb015, 0x2001, 0x0141, 0x201c, 0xd3dc,
++	0x00c0, 0x1942, 0x2001, 0x0109, 0x201c, 0xa39c, 0x0048, 0x00c0,
++	0x1942, 0x2001, 0x0111, 0x201c, 0x83ff, 0x00c0, 0x1942, 0x8421,
++	0x00c0, 0x192c, 0x007c, 0x2011, 0x0201, 0x2009, 0x003c, 0x2204,
++	0xa005, 0x00c0, 0x194f, 0x8109, 0x00c0, 0x1947, 0x007c, 0x007c,
++	0x1078, 0x1943, 0x0040, 0x1978, 0x7908, 0xd1ec, 0x00c0, 0x1968,
++	0x1078, 0x199e, 0x0040, 0x1968, 0x7803, 0x0009, 0x7904, 0xd1fc,
++	0x0040, 0x195e, 0x7803, 0x0006, 0x1078, 0x1943, 0x0040, 0x1978,
++	0x780c, 0xd0a4, 0x00c0, 0x1978, 0x7007, 0x0000, 0x1078, 0x199e,
++	0x0040, 0x197a, 0x7803, 0x0019, 0x7003, 0x0003, 0x0078, 0x197a,
++	0x1078, 0x1914, 0x007c, 0x3c00, 0x007e, 0x0e7e, 0x2071, 0x0200,
++	0x7808, 0xa084, 0xf000, 0xa10d, 0x1078, 0x1925, 0x20e1, 0x7000,
++	0x7324, 0x7420, 0x7028, 0x7028, 0x7426, 0x7037, 0x0001, 0x810f,
++	0x712e, 0x702f, 0x0100, 0x7037, 0x0008, 0x7326, 0x7422, 0x2001,
++	0x0138, 0x2202, 0x0e7f, 0x007f, 0x20e0, 0x007c, 0x3c00, 0x007e,
++	0x7908, 0xa18c, 0x0fff, 0xa182, 0x0009, 0x0048, 0x19ab, 0xa085,
++	0x0001, 0x0078, 0x19bd, 0x2001, 0x020a, 0x81ff, 0x0040, 0x19b6,
++	0x20e1, 0x6000, 0x200c, 0x200c, 0x200c, 0x200c, 0x20e1, 0x7000,
++	0x200c, 0x200c, 0x7003, 0x0000, 0xa006, 0x007f, 0x20e0, 0x007c,
++	0x0e7e, 0x2071, 0x798b, 0x7003, 0x0000, 0x0e7f, 0x007c, 0x0d7e,
++	0xa280, 0x0004, 0x206c, 0x694c, 0xd1dc, 0x00c0, 0x1a42, 0x6934,
++	0xa184, 0x0007, 0x0079, 0x19d4, 0x19dc, 0x1a2d, 0x19dc, 0x19dc,
++	0x19dc, 0x1a12, 0x19ef, 0x19de, 0x1078, 0x12cd, 0x684c, 0xd0b4,
++	0x0040, 0x1b46, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812,
++	0x687c, 0x680a, 0x6880, 0x680e, 0x6958, 0x0078, 0x1a35, 0x6834,
++	0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x19dc, 0x684c, 0xd0b4,
++	0x0040, 0x1b46, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812,
++	0x687c, 0x680a, 0x6880, 0x680e, 0x6804, 0x681a, 0xa080, 0x000d,
++	0x2004, 0xa084, 0x000f, 0xa080, 0x1c7e, 0x2004, 0x6832, 0x6958,
++	0x0078, 0x1a3e, 0xa18c, 0x00ff, 0xa186, 0x0015, 0x00c0, 0x1a42,
++	0x684c, 0xd0b4, 0x0040, 0x1b46, 0x6804, 0x681a, 0xa080, 0x000d,
++	0x2004, 0xa084, 0x000f, 0xa080, 0x1c7e, 0x2004, 0x6832, 0x6958,
++	0xa006, 0x682e, 0x682a, 0x0078, 0x1a3e, 0x684c, 0xd0b4, 0x0040,
++	0x1781, 0x6958, 0xa006, 0x682e, 0x682a, 0x2d00, 0x681a, 0x6834,
++	0xa084, 0x000f, 0xa080, 0x1c7e, 0x2004, 0x6832, 0x6926, 0x684c,
++	0xc0dd, 0x684e, 0x0d7f, 0x007c, 0x0f7e, 0x2079, 0x0020, 0x7804,
++	0xd0fc, 0x10c0, 0x1b4a, 0x0e7e, 0x0d7e, 0x2071, 0x798b, 0x7000,
++	0xa005, 0x00c0, 0x1ac0, 0x0c7e, 0x7206, 0xa280, 0x0004, 0x205c,
++	0x7004, 0x2068, 0x7803, 0x0004, 0x6818, 0x0d7e, 0x2068, 0x686c,
++	0x7812, 0x6890, 0x0f7e, 0x20e1, 0x9040, 0x2079, 0x0200, 0x781a,
++	0x2079, 0x0100, 0x8004, 0x78d6, 0x0f7f, 0x0d7f, 0x2b68, 0x6824,
++	0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f,
++	0x6908, 0xa184, 0x0007, 0x0040, 0x1a82, 0x017e, 0x2009, 0x0008,
++	0xa102, 0x017f, 0xa108, 0x791a, 0x7116, 0x701e, 0x680c, 0xa081,
++	0x0000, 0x781e, 0x701a, 0xa006, 0x700e, 0x7012, 0x7004, 0x692c,
++	0x6814, 0xa106, 0x00c0, 0x1a99, 0x6928, 0x6810, 0xa106, 0x0040,
++	0x1aa6, 0x037e, 0x047e, 0x6b14, 0x6c10, 0x1078, 0x1c9e, 0x047f,
++	0x037f, 0x0040, 0x1aa6, 0x0c7f, 0x0078, 0x1ac0, 0x8aff, 0x00c0,
++	0x1aae, 0x0c7f, 0xa085, 0x0001, 0x0078, 0x1ac0, 0x127e, 0x2091,
++	0x8000, 0x2079, 0x0020, 0x2009, 0x0001, 0x1078, 0x1ac4, 0x0040,
++	0x1abd, 0x2009, 0x0001, 0x1078, 0x1ac4, 0x127f, 0x0c7f, 0xa006,
++	0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x077e, 0x067e, 0x057e, 0x047e,
++	0x037e, 0x027e, 0x8aff, 0x0040, 0x1b3f, 0x700c, 0x7214, 0xa202,
++	0x7010, 0x7218, 0xa203, 0x0048, 0x1b3e, 0xa03e, 0x2730, 0x6850,
++	0xd0fc, 0x00c0, 0x1af1, 0x0d7e, 0x2804, 0xac68, 0x2900, 0x0079,
++	0x1ae1, 0x1b20, 0x1b01, 0x1b01, 0x1b20, 0x1b20, 0x1b18, 0x1b20,
++	0x1b01, 0x1b20, 0x1b07, 0x1b07, 0x1b20, 0x1b20, 0x1b20, 0x1b0f,
++	0x1b07, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0xd99c,
++	0x0040, 0x1b24, 0x0d7e, 0x2804, 0xac68, 0x6f08, 0x6e0c, 0x0078,
++	0x1b23, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x0078, 0x1b23, 0x6b10,
++	0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x0078, 0x1b23, 0x0d7f,
++	0x0d7e, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x1b20,
++	0x0d7f, 0x1078, 0x1c3a, 0x00c0, 0x1aca, 0xa00e, 0x0078, 0x1b3f,
++	0x0d7f, 0x1078, 0x12cd, 0x0d7f, 0x7b22, 0x7a26, 0x7d32, 0x7c36,
++	0x7f3a, 0x7e3e, 0x7902, 0x7000, 0x8000, 0x7002, 0x6828, 0xa300,
++	0x682a, 0x682c, 0xa201, 0x682e, 0x700c, 0xa300, 0x700e, 0x7010,
++	0xa201, 0x7012, 0x1078, 0x1c3a, 0x0078, 0x1b3f, 0xa006, 0x027f,
++	0x037f, 0x047f, 0x057f, 0x067f, 0x077f, 0x007c, 0x1078, 0x12cd,
++	0x1078, 0x12cd, 0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x0f7e,
++	0x0e7e, 0x0d7e, 0x0c7e, 0x2079, 0x0020, 0x2071, 0x798b, 0x2b68,
++	0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700, 0x00c0,
++	0x1b48, 0x7000, 0x0079, 0x1b64, 0x1c0b, 0x1b68, 0x1bd8, 0x1c09,
++	0x8001, 0x7002, 0xd19c, 0x00c0, 0x1b7c, 0x8aff, 0x0040, 0x1b9b,
++	0x2009, 0x0001, 0x1078, 0x1ac4, 0x0040, 0x1c0b, 0x2009, 0x0001,
++	0x1078, 0x1ac4, 0x0078, 0x1c0b, 0x7803, 0x0004, 0xd194, 0x0040,
++	0x1b8c, 0x6850, 0xc0fc, 0x6852, 0x8aff, 0x00c0, 0x1b91, 0x684c,
++	0xc0f5, 0x684e, 0x0078, 0x1b91, 0x1078, 0x1c53, 0x6850, 0xc0fd,
++	0x6852, 0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003,
++	0x0000, 0x0078, 0x1c0b, 0x711c, 0x81ff, 0x0040, 0x1bb1, 0x7918,
++	0x7922, 0x7827, 0x0000, 0x7803, 0x0001, 0x7000, 0x8000, 0x7002,
++	0x700c, 0xa100, 0x700e, 0x7010, 0xa081, 0x0000, 0x7012, 0x0078,
++	0x1c0b, 0x0f7e, 0x027e, 0x781c, 0x007e, 0x7818, 0x007e, 0x2079,
++	0x0100, 0x7a14, 0xa284, 0x0004, 0xa085, 0x0012, 0x7816, 0x7820,
++	0xd0bc, 0x00c0, 0x1bbf, 0x79c8, 0x007f, 0xa102, 0x78ca, 0x79c4,
++	0x007f, 0xa102, 0x78c6, 0xa284, 0x0004, 0xa085, 0x0012, 0x7816,
++	0x027f, 0x0f7f, 0x7803, 0x0008, 0x7003, 0x0000, 0x0078, 0x1c0b,
++	0x8001, 0x7002, 0xd194, 0x0040, 0x1bed, 0x7804, 0xd0fc, 0x00c0,
++	0x1b5a, 0xd19c, 0x00c0, 0x1c07, 0x8aff, 0x0040, 0x1c0b, 0x2009,
++	0x0001, 0x1078, 0x1ac4, 0x0078, 0x1c0b, 0x027e, 0x037e, 0x6b28,
++	0x6a2c, 0x1078, 0x1c53, 0x0d7e, 0x2804, 0xac68, 0x6034, 0xd09c,
++	0x00c0, 0x1c00, 0x6808, 0xa31a, 0x680c, 0xa213, 0x0078, 0x1c04,
++	0x6810, 0xa31a, 0x6814, 0xa213, 0x0d7f, 0x0078, 0x1b8c, 0x0078,
++	0x1b8c, 0x1078, 0x12cd, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x017f,
++	0x007f, 0x127f, 0x007c, 0x0f7e, 0x0e7e, 0x2071, 0x798b, 0x7000,
++	0xa086, 0x0000, 0x0040, 0x1c37, 0x2079, 0x0020, 0x20e1, 0x9040,
++	0x7804, 0xd0fc, 0x0040, 0x1c1e, 0x1078, 0x1b4a, 0x7000, 0xa086,
++	0x0000, 0x00c0, 0x1c1e, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0,
++	0x1c2d, 0x20e1, 0x9040, 0x7803, 0x0002, 0x7003, 0x0000, 0x0e7f,
++	0x0f7f, 0x007c, 0x8840, 0x2804, 0xa005, 0x00c0, 0x1c4e, 0x6004,
++	0xa005, 0x0040, 0x1c50, 0x681a, 0x2060, 0x6034, 0xa084, 0x000f,
++	0xa080, 0x1c7e, 0x2044, 0x88ff, 0x1040, 0x12cd, 0x8a51, 0x007c,
++	0x2051, 0x0000, 0x007c, 0x8a50, 0x8841, 0x2804, 0xa005, 0x00c0,
++	0x1c6d, 0x2c00, 0xad06, 0x0040, 0x1c62, 0x6000, 0xa005, 0x00c0,
++	0x1c62, 0x2d00, 0x2060, 0x681a, 0x6034, 0xa084, 0x000f, 0xa080,
++	0x1c8e, 0x2044, 0x88ff, 0x1040, 0x12cd, 0x007c, 0x0000, 0x0011,
++	0x0015, 0x0019, 0x001d, 0x0021, 0x0025, 0x0029, 0x0000, 0x000f,
++	0x0015, 0x001b, 0x0021, 0x0027, 0x0000, 0x0000, 0x0000, 0x1c73,
++	0x1c6f, 0x0000, 0x0000, 0x1c7d, 0x0000, 0x1c73, 0x0000, 0x1c7a,
++	0x1c77, 0x0000, 0x0000, 0x0000, 0x1c7d, 0x1c7a, 0x0000, 0x1c75,
++	0x1c75, 0x0000, 0x0000, 0x1c7d, 0x0000, 0x1c75, 0x0000, 0x1c7b,
++	0x1c7b, 0x0000, 0x0000, 0x0000, 0x1c7d, 0x1c7b, 0x0a7e, 0x097e,
++	0x087e, 0x6858, 0xa055, 0x0040, 0x1d3f, 0x2d60, 0x6034, 0xa0cc,
++	0x000f, 0xa9c0, 0x1c7e, 0xa986, 0x0007, 0x0040, 0x1cb7, 0xa986,
++	0x000e, 0x0040, 0x1cb7, 0xa986, 0x000f, 0x00c0, 0x1cbb, 0x605c,
++	0xa422, 0x6060, 0xa31a, 0x2804, 0xa045, 0x00c0, 0x1cc9, 0x0050,
++	0x1cc3, 0x0078, 0x1d3f, 0x6004, 0xa065, 0x0040, 0x1d3f, 0x0078,
++	0x1ca6, 0x2804, 0xa005, 0x0040, 0x1ce7, 0xac68, 0xd99c, 0x00c0,
++	0x1cd7, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0078, 0x1cdb, 0x6810,
++	0xa422, 0x6814, 0xa31b, 0x0048, 0x1d06, 0x2300, 0xa405, 0x0040,
++	0x1ced, 0x8a51, 0x0040, 0x1d3f, 0x8840, 0x0078, 0x1cc9, 0x6004,
++	0xa065, 0x0040, 0x1d3f, 0x0078, 0x1ca6, 0x8a51, 0x0040, 0x1d3f,
++	0x8840, 0x2804, 0xa005, 0x00c0, 0x1d00, 0x6004, 0xa065, 0x0040,
++	0x1d3f, 0x6034, 0xa0cc, 0x000f, 0xa9c0, 0x1c7e, 0x2804, 0x2040,
++	0x2b68, 0x6850, 0xc0fc, 0x6852, 0x0078, 0x1d33, 0x8422, 0x8420,
++	0x831a, 0xa399, 0x0000, 0x0d7e, 0x2b68, 0x6c6e, 0x6b72, 0x0d7f,
++	0xd99c, 0x00c0, 0x1d21, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300,
++	0xa11b, 0x1048, 0x12cd, 0x6800, 0xa420, 0x6804, 0xa319, 0x0078,
++	0x1d2d, 0x6910, 0x2400, 0xa122, 0x6914, 0x2300, 0xa11b, 0x1048,
++	0x12cd, 0x6800, 0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e, 0x6b22,
++	0x6850, 0xc0fd, 0x6852, 0x2c00, 0x681a, 0x2800, 0x6832, 0x2a00,
++	0x6826, 0x007f, 0x007f, 0x007f, 0xa006, 0x0078, 0x1d44, 0x087f,
++	0x097f, 0x0a7f, 0xa085, 0x0001, 0x007c, 0x2001, 0x0005, 0x2004,
++	0xa084, 0x0007, 0x0079, 0x1d4c, 0x1d54, 0x1d55, 0x1d58, 0x1d5b,
++	0x1d60, 0x1d63, 0x1d68, 0x1d6d, 0x007c, 0x1078, 0x1b4a, 0x007c,
++	0x1078, 0x1785, 0x007c, 0x1078, 0x1785, 0x1078, 0x1b4a, 0x007c,
++	0x1078, 0x1456, 0x007c, 0x1078, 0x1b4a, 0x1078, 0x1456, 0x007c,
++	0x1078, 0x1785, 0x1078, 0x1456, 0x007c, 0x1078, 0x1785, 0x1078,
++	0x1b4a, 0x1078, 0x1456, 0x007c, 0x127e, 0x2091, 0x2300, 0x2079,
++	0x0200, 0x2071, 0x7c80, 0x2069, 0x7700, 0x2009, 0x0004, 0x7912,
++	0x7817, 0x0004, 0x1078, 0x2052, 0x781b, 0x0002, 0x20e1, 0x8700,
++	0x127f, 0x007c, 0x127e, 0x2091, 0x2300, 0x781c, 0xa084, 0x0007,
++	0x0079, 0x1d92, 0x1db6, 0x1d9a, 0x1d9e, 0x1da2, 0x1da8, 0x1dac,
++	0x1db0, 0x1db4, 0x1078, 0x4298, 0x0078, 0x1db6, 0x1078, 0x42c7,
++	0x0078, 0x1db6, 0x1078, 0x4298, 0x1078, 0x42c7, 0x0078, 0x1db6,
++	0x1078, 0x1db8, 0x0078, 0x1db6, 0x1078, 0x1db8, 0x0078, 0x1db6,
++	0x1078, 0x1db8, 0x0078, 0x1db6, 0x1078, 0x1db8, 0x127f, 0x007c,
++	0x007e, 0x017e, 0x027e, 0x7930, 0xa184, 0x0003, 0x0040, 0x1dc2,
++	0x1078, 0x12cd, 0xa184, 0x0030, 0x0040, 0x1dd3, 0x6a00, 0xa286,
++	0x0003, 0x00c0, 0x1dcd, 0x1078, 0x12cd, 0x1078, 0x3591, 0x20e1,
++	0x9010, 0x0078, 0x1ddf, 0xa184, 0x00c0, 0x0040, 0x1dd9, 0x1078,
++	0x12cd, 0xa184, 0x0300, 0x0040, 0x1ddf, 0x20e1, 0x9020, 0x7932,
++	0x027f, 0x017f, 0x007f, 0x007c, 0x017e, 0x0e7e, 0x0f7e, 0x2071,
++	0x7700, 0x7128, 0x2001, 0x7923, 0x2102, 0x2001, 0x792b, 0x2102,
++	0xa182, 0x0211, 0x00c8, 0x1df8, 0x2009, 0x0008, 0x0078, 0x1e22,
++	0xa182, 0x0259, 0x00c8, 0x1e00, 0x2009, 0x0007, 0x0078, 0x1e22,
++	0xa182, 0x02c1, 0x00c8, 0x1e08, 0x2009, 0x0006, 0x0078, 0x1e22,
++	0xa182, 0x0349, 0x00c8, 0x1e10, 0x2009, 0x0005, 0x0078, 0x1e22,
++	0xa182, 0x0421, 0x00c8, 0x1e18, 0x2009, 0x0004, 0x0078, 0x1e22,
++	0xa182, 0x0581, 0x00c8, 0x1e20, 0x2009, 0x0003, 0x0078, 0x1e22,
++	0x2009, 0x0002, 0x2079, 0x0200, 0x7912, 0xa182, 0x0005, 0x00c8,
++	0x1e2c, 0x7916, 0x0078, 0x1e2e, 0x7817, 0x0004, 0x1078, 0x2052,
++	0x0f7f, 0x0e7f, 0x017f, 0x007c, 0x127e, 0x2091, 0x2200, 0x2061,
++	0x0100, 0x2071, 0x7700, 0x6024, 0x6026, 0x6033, 0x00ef, 0x60e7,
++	0x0000, 0x60eb, 0x00ef, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043,
++	0x0000, 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, 0x0caf, 0x600f,
++	0x00ff, 0x602b, 0x002f, 0x127f, 0x007c, 0x2001, 0x772d, 0x2003,
++	0x0000, 0x2001, 0x772c, 0x2003, 0x0001, 0x007c, 0x127e, 0x2091,
++	0x2200, 0x007e, 0x017e, 0x027e, 0x6124, 0xa184, 0x002c, 0x00c0,
++	0x1e6d, 0xa184, 0x0007, 0x0079, 0x1e73, 0xa195, 0x0004, 0xa284,
++	0x0007, 0x0079, 0x1e73, 0x1e9f, 0x1e7b, 0x1e7f, 0x1e83, 0x1e89,
++	0x1e8d, 0x1e93, 0x1e99, 0x1078, 0x4802, 0x0078, 0x1e9f, 0x1078,
++	0x48f1, 0x0078, 0x1e9f, 0x1078, 0x48f1, 0x1078, 0x4802, 0x0078,
++	0x1e9f, 0x1078, 0x1ea4, 0x0078, 0x1e9f, 0x1078, 0x4802, 0x1078,
++	0x1ea4, 0x0078, 0x1e9f, 0x1078, 0x48f1, 0x1078, 0x1ea4, 0x0078,
++	0x1e9f, 0x1078, 0x48f1, 0x1078, 0x4802, 0x1078, 0x1ea4, 0x027f,
++	0x017f, 0x007f, 0x127f, 0x007c, 0xd1ac, 0x0040, 0x1f58, 0x017e,
++	0x047e, 0x0c7e, 0x644c, 0x74ba, 0xa48c, 0xff00, 0xa196, 0xff00,
++	0x0040, 0x1ed3, 0x6030, 0xa084, 0x00ff, 0x810f, 0xa116, 0x0040,
++	0x1ed3, 0x7130, 0xd18c, 0x00c0, 0x1ed3, 0x2011, 0x7752, 0x2214,
++	0xd2ec, 0x0040, 0x1ec7, 0xc18d, 0x7132, 0x0078, 0x1ed3, 0x6240,
++	0xa294, 0x0010, 0x0040, 0x1f15, 0x6248, 0xa294, 0xff00, 0xa296,
++	0xff00, 0x00c0, 0x1f15, 0x037e, 0x73b8, 0x2011, 0x8013, 0x1078,
++	0x2d59, 0x037f, 0x7130, 0xc185, 0x7132, 0x2011, 0x7752, 0x220c,
++	0xd1a4, 0x0040, 0x1efd, 0x017e, 0x2009, 0x0001, 0x2011, 0x0100,
++	0x1078, 0x47d0, 0x2019, 0x000e, 0x1078, 0x75d9, 0xa484, 0x00ff,
++	0xa080, 0x2329, 0x200c, 0xa18c, 0xff00, 0x810f, 0x8127, 0xa006,
++	0x2009, 0x000e, 0x1078, 0x7641, 0x017f, 0xd1ac, 0x00c0, 0x1f06,
++	0x2019, 0x0004, 0x1078, 0x2293, 0x0078, 0x1f15, 0x157e, 0x20a9,
++	0x007f, 0x2009, 0x0000, 0x1078, 0x384c, 0x00c0, 0x1f11, 0x1078,
++	0x3637, 0x8108, 0x00f0, 0x1f0b, 0x157f, 0x0c7f, 0x047f, 0x6043,
++	0x0000, 0x2009, 0x00f7, 0x1078, 0x35fa, 0x0f7e, 0x2079, 0x7949,
++	0x783c, 0xa086, 0x0000, 0x0040, 0x1f2d, 0x6027, 0x0004, 0x783f,
++	0x0000, 0x2079, 0x0140, 0x7803, 0x0000, 0x0f7f, 0x2011, 0x0003,
++	0x1078, 0x58d8, 0x2011, 0x0002, 0x1078, 0x58e2, 0x1078, 0x57ee,
++	0x1078, 0x4706, 0x037e, 0x2019, 0x0000, 0x1078, 0x5880, 0x037f,
++	0x60e3, 0x0000, 0x017f, 0x2001, 0x7700, 0x2014, 0xa296, 0x0004,
++	0x00c0, 0x1f50, 0xd19c, 0x00c0, 0x1f50, 0x6228, 0xc29d, 0x622a,
++	0x2003, 0x0001, 0x2001, 0x7720, 0x2003, 0x0000, 0x6027, 0x0020,
++	0xd194, 0x0040, 0x1ff9, 0x0f7e, 0x2079, 0x7949, 0x783c, 0xa086,
++	0x0001, 0x00c0, 0x1f7c, 0x017e, 0x6027, 0x0004, 0x783f, 0x0000,
++	0x2079, 0x0140, 0x7803, 0x1000, 0x7803, 0x0000, 0x2079, 0x7936,
++	0x7807, 0x0000, 0x7833, 0x0000, 0x1078, 0x4d96, 0x1078, 0x4e56,
++	0x017f, 0x0f7f, 0x0078, 0x1ff9, 0x0f7f, 0x017e, 0x6220, 0xd2b4,
++	0x0040, 0x1fb1, 0x1078, 0x4706, 0x1078, 0x569c, 0x6027, 0x0004,
++	0x0d7e, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0040, 0x1f94,
++	0x6803, 0x1000, 0x6803, 0x0000, 0x0d7f, 0x0c7e, 0x2061, 0x7936,
++	0x6028, 0xa09a, 0x0002, 0x00c8, 0x1fa4, 0x8000, 0x602a, 0x0c7f,
++	0x1078, 0x568e, 0x0078, 0x1ff8, 0x2019, 0x793f, 0x2304, 0xa065,
++	0x0040, 0x1fae, 0x2009, 0x0027, 0x1078, 0x5d41, 0x0c7f, 0x0078,
++	0x1ff8, 0xd2bc, 0x0040, 0x1ff8, 0x1078, 0x4714, 0x6017, 0x0010,
++	0x6027, 0x0004, 0x0d7e, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000,
++	0x0040, 0x1fc6, 0x6803, 0x1000, 0x6803, 0x0000, 0x0d7f, 0x0c7e,
++	0x2061, 0x7936, 0x6044, 0xa09a, 0x0002, 0x00c8, 0x1fe7, 0x8000,
++	0x6046, 0x603c, 0x0c7f, 0xa005, 0x0040, 0x1ff8, 0x1078, 0x470b,
++	0xa080, 0x0007, 0x2004, 0xa086, 0x0006, 0x00c0, 0x1fe3, 0x6017,
++	0x0012, 0x0078, 0x1ff8, 0x6017, 0x0016, 0x0078, 0x1ff8, 0x037e,
++	0x2019, 0x0001, 0x1078, 0x5880, 0x037f, 0x2019, 0x7945, 0x2304,
++	0xa065, 0x0040, 0x1ff7, 0x2009, 0x004f, 0x1078, 0x5d41, 0x0c7f,
++	0x017f, 0xd19c, 0x0040, 0x2021, 0x017e, 0x6028, 0xc09c, 0x602a,
++	0x2011, 0x0003, 0x1078, 0x58d8, 0x2011, 0x0002, 0x1078, 0x58e2,
++	0x1078, 0x57ee, 0x1078, 0x4706, 0x037e, 0x2019, 0x0000, 0x1078,
++	0x5880, 0x037f, 0x60e3, 0x0000, 0x1078, 0x76b0, 0x1078, 0x76ce,
++	0x2001, 0x7700, 0x2003, 0x0004, 0x6027, 0x0008, 0x1078, 0x11be,
++	0x017f, 0xa18c, 0xffd0, 0x6126, 0x007c, 0x007e, 0x017e, 0x027e,
++	0x0e7e, 0x0f7e, 0x127e, 0x2091, 0x8000, 0x2071, 0x7700, 0x71b0,
++	0x70b2, 0xa116, 0x0040, 0x204b, 0x81ff, 0x0040, 0x203d, 0x2011,
++	0x8011, 0x1078, 0x2d59, 0x0078, 0x204b, 0x2011, 0x8012, 0x1078,
++	0x2d59, 0x037e, 0x0c7e, 0x2061, 0x0100, 0x2019, 0x0028, 0x1078,
++	0x2293, 0x0c7f, 0x037f, 0x127f, 0x0f7f, 0x0e7f, 0x027f, 0x017f,
++	0x007f, 0x007c, 0x0c7e, 0x0f7e, 0x007e, 0x027e, 0x2061, 0x0100,
++	0xa190, 0x206d, 0x2204, 0x60f2, 0xa192, 0x0005, 0x00c8, 0x2064,
++	0xa190, 0x2076, 0x0078, 0x2066, 0x2011, 0x207a, 0x2204, 0x60ee,
++	0x027f, 0x007f, 0x0f7f, 0x0c7f, 0x007c, 0x0840, 0x0840, 0x0840,
++	0x0580, 0x0420, 0x0348, 0x02c0, 0x0258, 0x0210, 0x01a8, 0x01a8,
++	0x01a8, 0x01a8, 0x0140, 0x00f8, 0x00d0, 0x00b0, 0x00a0, 0x2028,
++	0x2130, 0xa094, 0xff00, 0x00c0, 0x2088, 0x81ff, 0x0040, 0x208c,
++	0x1078, 0x444b, 0x0078, 0x2093, 0xa080, 0x2329, 0x200c, 0xa18c,
++	0xff00, 0x810f, 0xa006, 0x007c, 0xa080, 0x2329, 0x200c, 0xa18c,
++	0x00ff, 0x007c, 0x20ba, 0x20be, 0x20c2, 0x20c8, 0x20ce, 0x20d4,
++	0x20da, 0x20e2, 0x20ea, 0x20f0, 0x20f6, 0x20fe, 0x2106, 0x210e,
++	0x2116, 0x2120, 0x212a, 0x212a, 0x212a, 0x212a, 0x212a, 0x212a,
++	0x212a, 0x212a, 0x212a, 0x212a, 0x212a, 0x212a, 0x212a, 0x212a,
++	0x212a, 0x212a, 0x107e, 0x007e, 0x0078, 0x2143, 0x107e, 0x007e,
++	0x0078, 0x2143, 0x107e, 0x007e, 0x1078, 0x1e5e, 0x0078, 0x2143,
++	0x107e, 0x007e, 0x1078, 0x1e5e, 0x0078, 0x2143, 0x107e, 0x007e,
++	0x1078, 0x1d45, 0x0078, 0x2143, 0x107e, 0x007e, 0x1078, 0x1d45,
++	0x0078, 0x2143, 0x107e, 0x007e, 0x1078, 0x1e5e, 0x1078, 0x1d45,
++	0x0078, 0x2143, 0x107e, 0x007e, 0x1078, 0x1e5e, 0x1078, 0x1d45,
++	0x0078, 0x2143, 0x107e, 0x007e, 0x1078, 0x1d8a, 0x0078, 0x2143,
++	0x107e, 0x007e, 0x1078, 0x1d8a, 0x0078, 0x2143, 0x107e, 0x007e,
++	0x1078, 0x1e5e, 0x1078, 0x1d8a, 0x0078, 0x2143, 0x107e, 0x007e,
++	0x1078, 0x1e5e, 0x1078, 0x1d8a, 0x0078, 0x2143, 0x107e, 0x007e,
++	0x1078, 0x1d45, 0x1078, 0x1d8a, 0x0078, 0x2143, 0x107e, 0x007e,
++	0x1078, 0x1d45, 0x1078, 0x1d8a, 0x0078, 0x2143, 0x107e, 0x007e,
++	0x1078, 0x1e5e, 0x1078, 0x1d45, 0x1078, 0x1d8a, 0x0078, 0x2143,
++	0x107e, 0x007e, 0x1078, 0x1e5e, 0x1078, 0x1d45, 0x1078, 0x1d8a,
++	0x0078, 0x2143, 0x0005, 0x0078, 0x212a, 0xb084, 0x003c, 0x8004,
++	0x8004, 0x0079, 0x2133, 0x2143, 0x20c0, 0x20c4, 0x20ca, 0x20d0,
++	0x20d6, 0x20dc, 0x20e4, 0x20ec, 0x20f2, 0x20f8, 0x2100, 0x2108,
++	0x2110, 0x2118, 0x2122, 0x0008, 0x212d, 0x007f, 0x107f, 0x2091,
++	0x8001, 0x007c, 0x0c7e, 0x027e, 0x2041, 0x007e, 0x70bc, 0xd09c,
++	0x0040, 0x2154, 0x2041, 0x007f, 0x2001, 0x010c, 0x203c, 0x727c,
++	0x82ff, 0x0040, 0x219f, 0x037e, 0x738c, 0xa38e, 0xffff, 0x00c0,
++	0x2163, 0x2019, 0x0001, 0x8314, 0xa2e0, 0x7dc0, 0x2c04, 0xa38c,
++	0x0001, 0x0040, 0x2170, 0xa084, 0xff00, 0x8007, 0x0078, 0x2172,
++	0xa084, 0x00ff, 0xa70e, 0x0040, 0x2194, 0xa08e, 0x00ff, 0x0040,
++	0x219a, 0x2009, 0x0000, 0x1078, 0x207f, 0x1078, 0x3811, 0x00c0,
++	0x2197, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x218e,
++	0x1078, 0x21f1, 0x0040, 0x2197, 0x0078, 0x2194, 0x1078, 0x22f5,
++	0x1078, 0x2218, 0x0040, 0x2197, 0x8318, 0x0078, 0x2163, 0x738e,
++	0x0078, 0x219c, 0x708f, 0xffff, 0x037f, 0x0078, 0x21ee, 0xa780,
++	0x2329, 0x203c, 0xa7bc, 0xff00, 0x873f, 0x708c, 0xa096, 0xffff,
++	0x0040, 0x21b1, 0xa812, 0x00c8, 0x21c1, 0x708f, 0xffff, 0x0078,
++	0x21eb, 0x2009, 0x0000, 0x70bc, 0xd09c, 0x0040, 0x21bc, 0xd094,
++	0x0040, 0x21bc, 0x2009, 0x007e, 0x2100, 0xa802, 0x20a8, 0x0078,
++	0x21c5, 0x2008, 0x2810, 0xa202, 0x20a8, 0x2700, 0x157e, 0x017e,
++	0xa106, 0x0040, 0x21e2, 0x1078, 0x3811, 0x00c0, 0x21eb, 0x6004,
++	0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x21dc, 0x1078, 0x21f1,
++	0x0040, 0x21eb, 0x0078, 0x21e2, 0x1078, 0x22f5, 0x1078, 0x2218,
++	0x0040, 0x21eb, 0x017f, 0x8108, 0x157f, 0x00f0, 0x21c5, 0x708f,
++	0xffff, 0x0078, 0x21ee, 0x017f, 0x157f, 0x718e, 0x027f, 0x0c7f,
++	0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x1078, 0x5cb4,
++	0x0040, 0x2213, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001, 0x0000,
++	0x1078, 0x37e0, 0x2001, 0x0000, 0x1078, 0x37f4, 0x127e, 0x2091,
++	0x8000, 0x7088, 0x8000, 0x708a, 0x127f, 0x2009, 0x0004, 0x1078,
++	0x5d41, 0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c,
++	0x017e, 0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x1078, 0x5cb4, 0x0040,
++	0x223a, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078,
++	0x37e0, 0x2001, 0x0002, 0x1078, 0x37f4, 0x127e, 0x2091, 0x8000,
++	0x7088, 0x8000, 0x708a, 0x127f, 0x2009, 0x0002, 0x1078, 0x5d41,
++	0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x0c7e,
++	0x027e, 0x2009, 0x0080, 0x1078, 0x3811, 0x00c0, 0x224d, 0x1078,
++	0x2250, 0x0040, 0x224d, 0x70c3, 0xffff, 0x027f, 0x0c7f, 0x007c,
++	0x017e, 0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x1078, 0x5cb4, 0x0040,
++	0x2272, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078,
++	0x37e0, 0x2001, 0x0002, 0x1078, 0x37f4, 0x127e, 0x2091, 0x8000,
++	0x70c4, 0x8000, 0x70c6, 0x127f, 0x2009, 0x0002, 0x1078, 0x5d41,
++	0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x0c7e,
++	0x0d7e, 0x2009, 0x007f, 0x1078, 0x3811, 0x00c0, 0x2290, 0x2c68,
++	0x1078, 0x5cb4, 0x0040, 0x2290, 0x2d00, 0x601a, 0x6312, 0x601f,
++	0x0001, 0x620a, 0x2009, 0x0022, 0x1078, 0x5d41, 0xa085, 0x0001,
++	0x0d7f, 0x0c7f, 0x007c, 0x0e7e, 0x0c7e, 0x067e, 0x037e, 0x027e,
++	0x1078, 0x4a85, 0x1078, 0x4a35, 0x1078, 0x6219, 0x20a9, 0x007f,
++	0x2009, 0x0000, 0x017e, 0x1078, 0x384c, 0x00c0, 0x22ab, 0x1078,
++	0x3a36, 0x1078, 0x3637, 0x017f, 0x8108, 0x00f0, 0x22a2, 0x027f,
++	0x037f, 0x067f, 0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x0c7e, 0x037e,
++	0x027e, 0x017e, 0x6218, 0x2270, 0x72a0, 0x027e, 0x2019, 0x0029,
++	0x1078, 0x4a7e, 0x1078, 0x49c1, 0x2c08, 0x1078, 0x747b, 0x017f,
++	0x2e60, 0x1078, 0x3a36, 0x6210, 0x6314, 0x1078, 0x3637, 0x6212,
++	0x6316, 0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x007c, 0x0e7e,
++	0x007e, 0x6018, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x00c0, 0x22eb,
++	0x2071, 0x7700, 0x7088, 0xa005, 0x0040, 0x22e8, 0x8001, 0x708a,
++	0x007f, 0x0e7f, 0x007c, 0x2071, 0x7700, 0x70c4, 0xa005, 0x0040,
++	0x22e8, 0x8001, 0x70c6, 0x0078, 0x22e8, 0x6000, 0xc08c, 0x6002,
++	0x007c, 0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e, 0x157e, 0x81ff,
++	0x00c0, 0x2306, 0x20a9, 0x0001, 0x0078, 0x230a, 0x20a9, 0x007f,
++	0x2011, 0x0000, 0x027e, 0xa2e0, 0x7820, 0x2c64, 0x8cff, 0x0040,
++	0x231c, 0x2019, 0x0029, 0x1078, 0x4a7e, 0x1078, 0x49c1, 0x2c08,
++	0x1078, 0x747b, 0x1078, 0x3a36, 0x027f, 0x8210, 0x00f0, 0x230a,
++	0x027e, 0x027f, 0x157f, 0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f,
++	0x007c, 0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc,
++	0x80da, 0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1,
++	0x79ce, 0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6,
++	0x77c5, 0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4,
++	0x72b3, 0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa,
++	0x6ea9, 0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d,
++	0x809b, 0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384, 0x6282,
++	0x8081, 0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074,
++	0x8073, 0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a,
++	0x5b69, 0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, 0x5559,
++	0x8056, 0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d,
++	0x804c, 0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043,
++	0x803c, 0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932,
++	0x4831, 0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329, 0x4227,
++	0x8026, 0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18,
++	0x8017, 0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000,
++	0x8000, 0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000, 0x8000,
++	0x8000, 0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++	0x3300, 0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++	0x3100, 0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00,
++	0x2c00, 0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900,
++	0x2800, 0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300, 0x2200,
++	0x8000, 0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00,
++	0x8000, 0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700, 0x1600,
++	0x1500, 0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00,
++	0x8000, 0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900,
++	0x8000, 0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000, 0x8000,
++	0x8000, 0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000, 0x8000,
++	0x8000, 0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++	0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++	0x8000, 0x2071, 0x776d, 0x7003, 0x0002, 0xa006, 0x7012, 0x7016,
++	0x703a, 0x703e, 0x7033, 0x777d, 0x7037, 0x777d, 0x7007, 0x0001,
++	0x2061, 0x77bd, 0x6003, 0x0002, 0x007c, 0x0090, 0x2450, 0x0068,
++	0x2450, 0x2071, 0x776d, 0x2b78, 0x7818, 0xd084, 0x00c0, 0x2450,
++	0x2a60, 0x7820, 0xa08e, 0x0069, 0x00c0, 0x2537, 0x0079, 0x24d4,
++	0x007c, 0x2071, 0x776d, 0x7004, 0x0079, 0x2456, 0x245a, 0x245b,
++	0x2465, 0x2477, 0x007c, 0x0090, 0x2464, 0x0068, 0x2464, 0x2b78,
++	0x7818, 0xd084, 0x0040, 0x2483, 0x007c, 0x2b78, 0x2061, 0x77bd,
++	0x6008, 0xa08e, 0x0100, 0x0040, 0x2472, 0xa086, 0x0200, 0x0040,
++	0x252f, 0x007c, 0x7014, 0x2068, 0x2a60, 0x7018, 0x007a, 0x7010,
++	0x2068, 0x6834, 0xa086, 0x0103, 0x0040, 0x247f, 0x007c, 0x2a60,
++	0x2b78, 0x7018, 0x007a, 0x2a60, 0x7820, 0xa08a, 0x0040, 0x00c8,
++	0x248c, 0x61b0, 0x0079, 0x2494, 0x2100, 0xa08a, 0x0036, 0x00c8,
++	0x252b, 0x61b0, 0x0079, 0x24d4, 0x250d, 0x253f, 0x2547, 0x254b,
++	0x2553, 0x2559, 0x255d, 0x2566, 0x256a, 0x2572, 0x2576, 0x252b,
++	0x252b, 0x252b, 0x257a, 0x252b, 0x258a, 0x25a1, 0x25b8, 0x2634,
++	0x2639, 0x2666, 0x26c0, 0x26d1, 0x26ef, 0x2722, 0x272c, 0x2739,
++	0x274c, 0x2766, 0x276f, 0x27ac, 0x27b2, 0x252b, 0x27c2, 0x252b,
++	0x252b, 0x252b, 0x252b, 0x252b, 0x27c6, 0x27cc, 0x252b, 0x252b,
++	0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x27d4, 0x252b,
++	0x252b, 0x252b, 0x252b, 0x252b, 0x27e1, 0x27e7, 0x252b, 0x252b,
++	0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b,
++	0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b,
++	0x252b, 0x252b, 0x252b, 0x252b, 0x2572, 0x2576, 0x252b, 0x252b,
++	0x27f9, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b,
++	0x252b, 0x252b, 0x252b, 0x252b, 0x2846, 0x2913, 0x2927, 0x292e,
++	0x2991, 0x29e2, 0x29ed, 0x2a2c, 0x2a3b, 0x2a4a, 0x2a4d, 0x27fd,
++	0x2a76, 0x2abd, 0x2aca, 0x2bc5, 0x2cb3, 0x2cda, 0x2de4, 0x2df2,
++	0x2dff, 0x2e39, 0x713c, 0x0078, 0x250d, 0x2021, 0x4000, 0x1078,
++	0x2d33, 0x127e, 0x2091, 0x8000, 0x0068, 0x251a, 0x7818, 0xd084,
++	0x0040, 0x251d, 0x127f, 0x0078, 0x2511, 0x781b, 0x0001, 0x7c22,
++	0x7926, 0x7a2a, 0x7b2e, 0x2091, 0x4080, 0x7007, 0x0001, 0x2091,
++	0x5000, 0x127f, 0x007c, 0x2021, 0x4001, 0x0078, 0x250f, 0x2021,
++	0x4002, 0x0078, 0x250f, 0x2021, 0x4003, 0x0078, 0x250f, 0x2021,
++	0x4005, 0x0078, 0x250f, 0x2021, 0x4006, 0x0078, 0x250f, 0xa02e,
++	0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0078, 0x2d42, 0x7823,
++	0x0004, 0x7824, 0x007a, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824,
++	0x7930, 0x0078, 0x2d46, 0x7924, 0x7828, 0x2114, 0x200a, 0x0078,
++	0x250d, 0x7924, 0x2114, 0x0078, 0x250d, 0x2099, 0x0009, 0x20a1,
++	0x0009, 0x20a9, 0x0007, 0x53a3, 0x0078, 0x250d, 0x7824, 0x2060,
++	0x0078, 0x257c, 0x2009, 0x0001, 0x2011, 0x000f, 0x2019, 0x0025,
++	0x0078, 0x250d, 0x7d38, 0x7c3c, 0x0078, 0x2541, 0x7d38, 0x7c3c,
++	0x0078, 0x254d, 0x2061, 0x1000, 0x610c, 0xa006, 0x2c14, 0xa200,
++	0x8c60, 0x8109, 0x00c0, 0x257e, 0x2010, 0xa005, 0x0040, 0x250d,
++	0x0078, 0x2533, 0x2061, 0x7751, 0x7824, 0x7930, 0xa11a, 0x00c8,
++	0x253b, 0x8019, 0x0040, 0x253b, 0x604a, 0x6142, 0x782c, 0x6052,
++	0x7828, 0x6056, 0xa006, 0x605a, 0x605e, 0x1078, 0x3d89, 0x0078,
++	0x250d, 0x2061, 0x7751, 0x7824, 0x7930, 0xa11a, 0x00c8, 0x253b,
++	0x8019, 0x0040, 0x253b, 0x604e, 0x6146, 0x782c, 0x6062, 0x7828,
++	0x6066, 0xa006, 0x606a, 0x606e, 0x1078, 0x3b5f, 0x0078, 0x250d,
++	0xa02e, 0x2520, 0x81ff, 0x00c0, 0x2537, 0x7924, 0x7b28, 0x7a2c,
++	0x20a9, 0x0005, 0x20a1, 0x7774, 0x41a1, 0x1078, 0x2cf8, 0x0040,
++	0x2537, 0x2009, 0x0020, 0x1078, 0x2d42, 0x701b, 0x25d0, 0x007c,
++	0x6834, 0x2008, 0xa084, 0x00ff, 0xa096, 0x0011, 0x0040, 0x25dc,
++	0xa096, 0x0019, 0x00c0, 0x2537, 0x810f, 0xa18c, 0x00ff, 0x0040,
++	0x2537, 0x710e, 0x700c, 0x8001, 0x0040, 0x260d, 0x700e, 0x1078,
++	0x2cf8, 0x0040, 0x2537, 0x2009, 0x0020, 0x2061, 0x77bd, 0x6224,
++	0x6328, 0x642c, 0x6530, 0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1,
++	0x0000, 0xa5a9, 0x0000, 0x1078, 0x2d42, 0x701b, 0x2600, 0x007c,
++	0x6834, 0xa084, 0x00ff, 0xa096, 0x0002, 0x0040, 0x260b, 0xa096,
++	0x000a, 0x00c0, 0x2537, 0x0078, 0x25e2, 0x7010, 0x2068, 0x6838,
++	0xc0fd, 0x683a, 0x1078, 0x3744, 0x00c0, 0x261b, 0x7007, 0x0003,
++	0x701b, 0x261d, 0x007c, 0x1078, 0x3c22, 0x127e, 0x2091, 0x8000,
++	0x20a9, 0x0005, 0x2099, 0x7774, 0x530a, 0x2100, 0xa210, 0xa399,
++	0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0xad80, 0x000d, 0x2009,
++	0x0020, 0x127f, 0x0078, 0x2d46, 0x6198, 0x7824, 0x609a, 0x0078,
++	0x250d, 0x2091, 0x8000, 0x7823, 0x4000, 0x7827, 0x4953, 0x782b,
++	0x5020, 0x782f, 0x2020, 0x2009, 0x017f, 0x2104, 0x7832, 0x3f00,
++	0x7836, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, 0x603c, 0x8007,
++	0xa205, 0x783a, 0x2009, 0x04fd, 0x2104, 0x783e, 0x781b, 0x0001,
++	0x2091, 0x5000, 0x2091, 0x4080, 0x2071, 0x0010, 0x20c1, 0x00f0,
++	0xa08a, 0x0003, 0x00c8, 0x0427, 0x0078, 0x0423, 0x81ff, 0x00c0,
++	0x2537, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x384c, 0x00c0,
++	0x253b, 0x7e38, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0048, 0x267a,
++	0x0078, 0x253b, 0x7c28, 0x7d2c, 0x1078, 0x39fd, 0xd28c, 0x00c0,
++	0x2685, 0x1078, 0x3991, 0x0078, 0x2687, 0x1078, 0x39cb, 0x00c0,
++	0x26b1, 0x2061, 0x7e00, 0x127e, 0x2091, 0x8000, 0x6000, 0xa086,
++	0x0000, 0x0040, 0x269f, 0x6010, 0xa06d, 0x0040, 0x269f, 0x683c,
++	0xa406, 0x00c0, 0x269f, 0x6840, 0xa506, 0x0040, 0x26aa, 0x127f,
++	0xace0, 0x0008, 0x2001, 0x7715, 0x2004, 0xac02, 0x00c8, 0x2537,
++	0x0078, 0x268b, 0x1078, 0x6852, 0x127f, 0x0040, 0x2537, 0x0078,
++	0x250d, 0xa00e, 0x2001, 0x0005, 0x1078, 0x3c22, 0x127e, 0x2091,
++	0x8000, 0x1078, 0x6c5c, 0x1078, 0x3b92, 0x127f, 0x0078, 0x250d,
++	0x81ff, 0x00c0, 0x2537, 0x1078, 0x2d10, 0x0040, 0x253b, 0x1078,
++	0x38d5, 0x0040, 0x2537, 0x1078, 0x3a0a, 0x0040, 0x2537, 0x0078,
++	0x250d, 0x81ff, 0x00c0, 0x2537, 0x1078, 0x2d22, 0x0040, 0x253b,
++	0x1078, 0x3a71, 0x0040, 0x2537, 0x2019, 0x0005, 0x1078, 0x3a2b,
++	0x0040, 0x2537, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x253b, 0x8003,
++	0x800b, 0x810b, 0xa108, 0x1078, 0x4696, 0x0078, 0x250d, 0x127e,
++	0x2091, 0x8000, 0x81ff, 0x00c0, 0x271c, 0x2029, 0x00ff, 0x644c,
++	0x2400, 0xa506, 0x0040, 0x2716, 0x2508, 0x1078, 0x384c, 0x00c0,
++	0x2716, 0x1078, 0x3a71, 0x0040, 0x271c, 0x2019, 0x0004, 0x1078,
++	0x3a2b, 0x0040, 0x271c, 0x7824, 0xa08a, 0x1000, 0x00c8, 0x271f,
++	0x8003, 0x800b, 0x810b, 0xa108, 0x1078, 0x4696, 0x8529, 0x00c8,
++	0x26f8, 0x127f, 0x0078, 0x250d, 0x127f, 0x0078, 0x2537, 0x127f,
++	0x0078, 0x253b, 0x1078, 0x2d10, 0x0040, 0x253b, 0x1078, 0x3942,
++	0x1078, 0x39fd, 0x0078, 0x250d, 0x81ff, 0x00c0, 0x2537, 0x1078,
++	0x2d10, 0x0040, 0x253b, 0x1078, 0x3931, 0x1078, 0x39fd, 0x0078,
++	0x250d, 0x81ff, 0x00c0, 0x2537, 0x1078, 0x2d10, 0x0040, 0x253b,
++	0x1078, 0x39ce, 0x0040, 0x2537, 0x1078, 0x378d, 0x1078, 0x398a,
++	0x1078, 0x39fd, 0x0078, 0x250d, 0x1078, 0x2d10, 0x0040, 0x253b,
++	0x1078, 0x38d5, 0x0040, 0x2537, 0x62a0, 0x2019, 0x0005, 0x0c7e,
++	0x1078, 0x3a36, 0x0c7f, 0x1078, 0x4a7e, 0x1078, 0x49c1, 0x2c08,
++	0x1078, 0x747b, 0x1078, 0x39fd, 0x0078, 0x250d, 0x1078, 0x2d10,
++	0x0040, 0x253b, 0x1078, 0x39fd, 0x2208, 0x0078, 0x250d, 0x157e,
++	0x0d7e, 0x0e7e, 0x2069, 0x77ff, 0x6810, 0x6914, 0xa10a, 0x00c8,
++	0x277b, 0x2009, 0x0000, 0x6816, 0x2011, 0x0000, 0x2019, 0x0000,
++	0x20a9, 0x007e, 0x2069, 0x7820, 0x2d04, 0xa075, 0x0040, 0x2790,
++	0x704c, 0x1078, 0x279a, 0xa210, 0x7080, 0x1078, 0x279a, 0xa318,
++	0x8d68, 0x00f0, 0x2784, 0x2300, 0xa218, 0x0e7f, 0x0d7f, 0x157f,
++	0x0078, 0x250d, 0x0f7e, 0x017e, 0xa07d, 0x0040, 0x27a9, 0x2001,
++	0x0000, 0x8000, 0x2f0c, 0x81ff, 0x0040, 0x27a9, 0x2178, 0x0078,
++	0x27a1, 0x017f, 0x0f7f, 0x007c, 0x2069, 0x77ff, 0x6910, 0x629c,
++	0x0078, 0x250d, 0x81ff, 0x00c0, 0x2537, 0x614c, 0xa190, 0x2329,
++	0x2214, 0xa294, 0x00ff, 0x6068, 0xa084, 0xff00, 0xa215, 0x6364,
++	0x0078, 0x250d, 0x613c, 0x6240, 0x0078, 0x250d, 0x1078, 0x2d22,
++	0x0040, 0x253b, 0x0078, 0x250d, 0x1078, 0x2d22, 0x0040, 0x253b,
++	0x6244, 0x6338, 0x0078, 0x250d, 0x613c, 0x6240, 0x7824, 0x603e,
++	0x7b28, 0x6342, 0x2069, 0x7751, 0x831f, 0xa305, 0x6816, 0x0078,
++	0x250d, 0x1078, 0x2d22, 0x0040, 0x253b, 0x0078, 0x250d, 0x1078,
++	0x2d22, 0x0040, 0x253b, 0x7828, 0xa00d, 0x0040, 0x253b, 0x782c,
++	0xa005, 0x0040, 0x253b, 0x6244, 0x6146, 0x6338, 0x603a, 0x0078,
++	0x250d, 0x7d38, 0x7c3c, 0x0078, 0x25ba, 0x7824, 0xa09c, 0x00ff,
++	0xa39a, 0x0003, 0x00c8, 0x2537, 0x624c, 0xa084, 0xff00, 0x8007,
++	0xa206, 0x00c0, 0x2815, 0x2001, 0x7740, 0x2009, 0x000c, 0x7a2c,
++	0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x2d46, 0x81ff, 0x00c0, 0x2537,
++	0x1078, 0x2d22, 0x0040, 0x253b, 0x6004, 0xa084, 0x00ff, 0xa086,
++	0x0006, 0x00c0, 0x2537, 0x0c7e, 0x1078, 0x2cf8, 0x0c7f, 0x0040,
++	0x2537, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x1078, 0x6b56,
++	0x0040, 0x2537, 0x7007, 0x0003, 0x701b, 0x2837, 0x007c, 0x6830,
++	0xa086, 0x0100, 0x0040, 0x2537, 0xad80, 0x000e, 0x2009, 0x000c,
++	0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x2d46, 0x1078, 0x2cf8,
++	0x0040, 0x2537, 0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
++	0x1078, 0x2d42, 0x701b, 0x2855, 0x007c, 0xade8, 0x000d, 0x6800,
++	0xa005, 0x0040, 0x253b, 0x6804, 0xd0ac, 0x0040, 0x2862, 0xd0a4,
++	0x0040, 0x253b, 0xd094, 0x0040, 0x286d, 0x0c7e, 0x2061, 0x0100,
++	0x6104, 0xa18c, 0xffdf, 0x6106, 0x0c7f, 0xd08c, 0x0040, 0x2878,
++	0x0c7e, 0x2061, 0x0100, 0x6104, 0xa18d, 0x0010, 0x6106, 0x0c7f,
++	0x2009, 0x0100, 0x210c, 0xa18a, 0x0002, 0x0048, 0x288d, 0xd084,
++	0x0040, 0x288d, 0x6a28, 0xa28a, 0x007f, 0x00c8, 0x253b, 0xa288,
++	0x2329, 0x210c, 0xa18c, 0x00ff, 0x6152, 0xd0dc, 0x0040, 0x2896,
++	0x6828, 0xa08a, 0x007f, 0x00c8, 0x253b, 0x604e, 0x6808, 0xa08a,
++	0x0100, 0x0048, 0x253b, 0xa08a, 0x0841, 0x00c8, 0x253b, 0xa084,
++	0x0007, 0x00c0, 0x253b, 0x680c, 0xa005, 0x0040, 0x253b, 0x6810,
++	0xa005, 0x0040, 0x253b, 0x6848, 0x6940, 0xa10a, 0x00c8, 0x253b,
++	0x8001, 0x0040, 0x253b, 0x684c, 0x6944, 0xa10a, 0x00c8, 0x253b,
++	0x8001, 0x0040, 0x253b, 0x20a9, 0x001c, 0x2d98, 0x2069, 0x7751,
++	0x2da0, 0x53a3, 0x6814, 0xa08c, 0x00ff, 0x613e, 0x8007, 0xa084,
++	0x00ff, 0x6042, 0x1078, 0x3d89, 0x1078, 0x3b5f, 0x6000, 0xa086,
++	0x0000, 0x00c0, 0x2911, 0x6808, 0x602a, 0x1078, 0x1de4, 0x6818,
++	0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f, 0x6016,
++	0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0040, 0x28f1, 0x6830,
++	0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f, 0x0078,
++	0x28f3, 0xa084, 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312, 0x1078,
++	0x4722, 0x0c7e, 0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000,
++	0x0c7f, 0x60b4, 0xa005, 0x0040, 0x290d, 0x6003, 0x0001, 0x2091,
++	0x301d, 0x1078, 0x3591, 0x0078, 0x2911, 0x6003, 0x0004, 0x2091,
++	0x301d, 0x0078, 0x250d, 0x6000, 0xa086, 0x0000, 0x0040, 0x2537,
++	0x2069, 0x7751, 0x7830, 0x6842, 0x7834, 0x6846, 0x2d00, 0x2009,
++	0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x2d46, 0x81ff,
++	0x00c0, 0x2537, 0x1078, 0x3591, 0x0078, 0x250d, 0x81ff, 0x00c0,
++	0x2537, 0x617c, 0x81ff, 0x0040, 0x2948, 0x703f, 0x0000, 0x2001,
++	0x7dc0, 0x2009, 0x0040, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x127e,
++	0x2091, 0x8000, 0x1078, 0x2d46, 0x701b, 0x250a, 0x127f, 0x007c,
++	0x703f, 0x0001, 0x0d7e, 0x2069, 0x7dc0, 0x20a9, 0x0040, 0x20a1,
++	0x7dc0, 0x2019, 0xffff, 0x43a4, 0x654c, 0xa588, 0x2329, 0x210c,
++	0xa18c, 0x00ff, 0x216a, 0xa00e, 0x2011, 0x0002, 0x2100, 0xa506,
++	0x0040, 0x297a, 0x1078, 0x384c, 0x00c0, 0x297a, 0x6014, 0x821c,
++	0x0048, 0x2972, 0xa398, 0x7dc0, 0xa085, 0xff00, 0x8007, 0x201a,
++	0x0078, 0x2979, 0xa398, 0x7dc0, 0x2324, 0xa4a4, 0xff00, 0xa405,
++	0x201a, 0x8210, 0x8108, 0xa182, 0x0080, 0x00c8, 0x2981, 0x0078,
++	0x295e, 0x8201, 0x8007, 0x2d0c, 0xa105, 0x206a, 0x0d7f, 0x20a9,
++	0x0040, 0x20a1, 0x7dc0, 0x2099, 0x7dc0, 0x1078, 0x35da, 0x0078,
++	0x2937, 0x1078, 0x2d22, 0x0040, 0x253b, 0x0c7e, 0x1078, 0x2cf8,
++	0x0c7f, 0x0040, 0x2537, 0x2001, 0x7752, 0x2004, 0xd0b4, 0x0040,
++	0x29be, 0x6000, 0xd08c, 0x00c0, 0x29be, 0x6004, 0xa084, 0x00ff,
++	0xa086, 0x0006, 0x00c0, 0x29be, 0x6837, 0x0000, 0x6838, 0xc0fd,
++	0x683a, 0x1078, 0x6b8e, 0x0040, 0x2537, 0x7007, 0x0003, 0x701b,
++	0x29ba, 0x007c, 0x1078, 0x2d22, 0x0040, 0x253b, 0x20a9, 0x002b,
++	0x2c98, 0xade8, 0x0002, 0x2da0, 0x53a3, 0x20a9, 0x0004, 0xac80,
++	0x0006, 0x2098, 0xad80, 0x0006, 0x20a0, 0x1078, 0x35da, 0x20a9,
++	0x0004, 0xac80, 0x000a, 0x2098, 0xad80, 0x000a, 0x20a0, 0x1078,
++	0x35da, 0x2d00, 0x2009, 0x002b, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
++	0x0078, 0x2d46, 0x81ff, 0x00c0, 0x2537, 0x1078, 0x2d10, 0x0040,
++	0x253b, 0x1078, 0x3a15, 0x0078, 0x250d, 0x81ff, 0x00c0, 0x2537,
++	0x7828, 0xa08a, 0x1000, 0x00c8, 0x253b, 0x1078, 0x2d22, 0x0040,
++	0x253b, 0x1078, 0x3a71, 0x0040, 0x2537, 0x2019, 0x0004, 0x1078,
++	0x3a2b, 0x7924, 0x810f, 0x7a28, 0x1078, 0x2a08, 0x0078, 0x250d,
++	0xa186, 0x00ff, 0x0040, 0x2a10, 0x1078, 0x2a20, 0x0078, 0x2a1f,
++	0x2029, 0x007e, 0x2061, 0x7700, 0x644c, 0x2400, 0xa506, 0x0040,
++	0x2a1c, 0x2508, 0x1078, 0x2a20, 0x8529, 0x00c8, 0x2a15, 0x007c,
++	0x1078, 0x384c, 0x00c0, 0x2a2b, 0x2200, 0x8003, 0x800b, 0x810b,
++	0xa108, 0x1078, 0x4696, 0x007c, 0x81ff, 0x00c0, 0x2537, 0x1078,
++	0x2d10, 0x0040, 0x253b, 0x1078, 0x38d5, 0x0040, 0x2537, 0x1078,
++	0x3a20, 0x0078, 0x250d, 0x81ff, 0x00c0, 0x2537, 0x1078, 0x2d10,
++	0x0040, 0x253b, 0x1078, 0x38d5, 0x0040, 0x2537, 0x1078, 0x3a0a,
++	0x0078, 0x250d, 0x6100, 0x0078, 0x250d, 0x1078, 0x2d22, 0x0040,
++	0x253b, 0x6004, 0xa086, 0x0707, 0x0040, 0x253b, 0x2001, 0x7700,
++	0x2004, 0xa086, 0x0003, 0x00c0, 0x2537, 0x0d7e, 0xace8, 0x000a,
++	0x7924, 0xd184, 0x0040, 0x2a66, 0xace8, 0x0006, 0x680c, 0x8007,
++	0x783e, 0x6808, 0x8007, 0x783a, 0x6b04, 0x831f, 0x6a00, 0x8217,
++	0x0d7f, 0x6100, 0xa18c, 0x0200, 0x0078, 0x250d, 0x7824, 0xa084,
++	0x00ff, 0xa086, 0x00ff, 0x0040, 0x2a80, 0x81ff, 0x00c0, 0x2537,
++	0x7828, 0xa08a, 0x1000, 0x00c8, 0x253b, 0x7924, 0xa18c, 0xff00,
++	0x810f, 0xa186, 0x00ff, 0x0040, 0x2a94, 0xa182, 0x007f, 0x00c8,
++	0x253b, 0x2100, 0x1078, 0x2094, 0x027e, 0x0c7e, 0x127e, 0x2091,
++	0x8000, 0x2061, 0x7949, 0x601b, 0x0000, 0x601f, 0x0000, 0x2061,
++	0x0100, 0x6030, 0xa084, 0x00ff, 0x810f, 0xa105, 0x604a, 0x6043,
++	0x0090, 0x6043, 0x0010, 0x2009, 0x001e, 0x2011, 0x35b6, 0x1078,
++	0x4719, 0x7924, 0xa18c, 0xff00, 0x810f, 0x7a28, 0x1078, 0x2a08,
++	0x127f, 0x0c7f, 0x027f, 0x0078, 0x250d, 0x7924, 0xa18c, 0xff00,
++	0x810f, 0x0c7e, 0x1078, 0x3811, 0x2c08, 0x0c7f, 0x00c0, 0x253b,
++	0x0078, 0x250d, 0x81ff, 0x00c0, 0x2537, 0x60bc, 0xd09c, 0x0040,
++	0x2537, 0x1078, 0x2cf8, 0x0040, 0x2537, 0x6823, 0x0000, 0x7924,
++	0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x2d42, 0x701b, 0x2ae1,
++	0x007c, 0x2009, 0x0080, 0x1078, 0x384c, 0x00c0, 0x2aee, 0x6004,
++	0xa084, 0x00ff, 0xa086, 0x0006, 0x0040, 0x2af2, 0x2021, 0x400a,
++	0x0078, 0x250f, 0x0d7e, 0xade8, 0x000d, 0x6900, 0x6a08, 0x6b0c,
++	0x6c10, 0x6d14, 0x6e18, 0x6820, 0xa0be, 0x0100, 0x0040, 0x2b65,
++	0xa0be, 0x0112, 0x0040, 0x2b65, 0xa0be, 0x0113, 0x0040, 0x2b65,
++	0xa0be, 0x0114, 0x0040, 0x2b65, 0xa0be, 0x0117, 0x0040, 0x2b65,
++	0xa0be, 0x011a, 0x0040, 0x2b65, 0xa0be, 0x0121, 0x0040, 0x2b5b,
++	0xa0be, 0x0131, 0x0040, 0x2b5b, 0xa0be, 0x0171, 0x0040, 0x2b65,
++	0xa0be, 0x0173, 0x0040, 0x2b65, 0xa0be, 0x01a1, 0x00c0, 0x2b2d,
++	0x6830, 0x8007, 0x6832, 0x0078, 0x2b6b, 0xa0be, 0x0212, 0x0040,
++	0x2b61, 0xa0be, 0x0213, 0x0040, 0x2b61, 0xa0be, 0x0214, 0x0040,
++	0x2b53, 0xa0be, 0x0217, 0x0040, 0x2b4d, 0xa0be, 0x021a, 0x00c0,
++	0x2b46, 0x6838, 0x8007, 0x683a, 0x0078, 0x2b65, 0xa0be, 0x0300,
++	0x0040, 0x2b65, 0x0d7f, 0x0078, 0x253b, 0xad80, 0x0010, 0x20a9,
++	0x0007, 0x1078, 0x2ba1, 0xad80, 0x000e, 0x20a9, 0x0001, 0x1078,
++	0x2ba1, 0x0078, 0x2b65, 0xad80, 0x000c, 0x1078, 0x2baf, 0x0078,
++	0x2b6b, 0xad80, 0x000e, 0x1078, 0x2baf, 0xad80, 0x000c, 0x20a9,
++	0x0001, 0x1078, 0x2ba1, 0x0c7e, 0x1078, 0x2cf8, 0x0040, 0x2b96,
++	0x6838, 0xc0fd, 0x683a, 0x6837, 0x0119, 0x684f, 0x0020, 0x685b,
++	0x0001, 0x810b, 0x697e, 0x6883, 0x0000, 0x6a86, 0x6b8a, 0x6c8e,
++	0x6d92, 0x6996, 0x689b, 0x0000, 0x0c7f, 0x0d7f, 0x6837, 0x0000,
++	0x6838, 0xc0fd, 0x683a, 0x6823, 0x0000, 0x1078, 0x6b72, 0x0040,
++	0x2537, 0x7007, 0x0003, 0x701b, 0x2b9a, 0x007c, 0x0c7f, 0x0d7f,
++	0x0078, 0x2537, 0x6820, 0xa086, 0x8001, 0x0040, 0x2537, 0x0078,
++	0x250d, 0x017e, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x290a,
++	0x8108, 0x280a, 0x8108, 0x00f0, 0x2ba3, 0x017f, 0x007c, 0x017e,
++	0x0a7e, 0x0b7e, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x2054,
++	0x8000, 0x205c, 0x2b0a, 0x8108, 0x2a0a, 0x8108, 0x290a, 0x8108,
++	0x280a, 0x0b7f, 0x0a7f, 0x017f, 0x007c, 0x81ff, 0x00c0, 0x2537,
++	0x7924, 0x2140, 0xa18c, 0xff00, 0x810f, 0xa182, 0x0080, 0x0048,
++	0x253b, 0xa182, 0x00ff, 0x00c8, 0x253b, 0x7a2c, 0x7b28, 0x6064,
++	0xa306, 0x00c0, 0x2be3, 0x6068, 0xa24e, 0x0040, 0x253b, 0xa9cc,
++	0xff00, 0x0040, 0x253b, 0x0c7e, 0x1078, 0x2c57, 0x2c68, 0x0c7f,
++	0x0040, 0x2c0a, 0xa0c6, 0x4000, 0x00c0, 0x2bf0, 0x0078, 0x2c07,
++	0xa0c6, 0x4007, 0x00c0, 0x2bf7, 0x2408, 0x0078, 0x2c07, 0xa0c6,
++	0x4008, 0x00c0, 0x2bff, 0x2708, 0x2610, 0x0078, 0x2c07, 0xa0c6,
++	0x4009, 0x00c0, 0x2c05, 0x0078, 0x2c07, 0x2001, 0x4006, 0x2020,
++	0x0078, 0x250f, 0x017e, 0x0b7e, 0x0c7e, 0x0e7e, 0x2c70, 0x1078,
++	0x5cb4, 0x0040, 0x2c45, 0x2d00, 0x601a, 0x2e58, 0x0e7f, 0x0e7e,
++	0x0c7e, 0x1078, 0x2cf8, 0x0c7f, 0x2b70, 0x0040, 0x2537, 0x6837,
++	0x0000, 0x2d00, 0x6012, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a,
++	0x127e, 0x2091, 0x8000, 0x1078, 0x22b5, 0x127f, 0x601f, 0x0001,
++	0x2001, 0x0000, 0x1078, 0x37e0, 0x2001, 0x0002, 0x1078, 0x37f4,
++	0x127e, 0x2091, 0x8000, 0x7088, 0x8000, 0x708a, 0x127f, 0x2009,
++	0x0002, 0x1078, 0x5d41, 0xa085, 0x0001, 0x0e7f, 0x0c7f, 0x0b7f,
++	0x017f, 0x0040, 0x2537, 0x7007, 0x0003, 0x701b, 0x2c50, 0x007c,
++	0x6830, 0xa086, 0x0100, 0x00c0, 0x250d, 0x0078, 0x2537, 0x0e7e,
++	0x0d7e, 0x2029, 0x0000, 0x2021, 0x0080, 0x20a9, 0x007f, 0x2071,
++	0x78a0, 0x2e04, 0xa005, 0x00c0, 0x2c6b, 0x2100, 0xa406, 0x0040,
++	0x2ca8, 0x0078, 0x2c9c, 0x2068, 0x6f10, 0x2700, 0xa306, 0x00c0,
++	0x2c8d, 0x6e14, 0x2600, 0xa206, 0x00c0, 0x2c8d, 0x2400, 0xa106,
++	0x00c0, 0x2c89, 0x2d60, 0xd884, 0x0040, 0x2cae, 0x6004, 0xa084,
++	0x00ff, 0xa086, 0x0006, 0x00c0, 0x2cae, 0x2001, 0x4000, 0x0078,
++	0x2caf, 0x2001, 0x4007, 0x0078, 0x2caf, 0x2400, 0xa106, 0x00c0,
++	0x2c9c, 0x6e14, 0x87ff, 0x00c0, 0x2c98, 0x86ff, 0x0040, 0x2ca8,
++	0x2001, 0x4008, 0x0078, 0x2caf, 0x8420, 0x8e70, 0x00f0, 0x2c61,
++	0x2001, 0x4009, 0x0078, 0x2caf, 0x2001, 0x0001, 0x0078, 0x2caf,
++	0x1078, 0x3811, 0x00c0, 0x2ca4, 0x6312, 0x6216, 0xa006, 0xa005,
++	0x0d7f, 0x0e7f, 0x007c, 0x81ff, 0x00c0, 0x2537, 0x1078, 0x2cf8,
++	0x0040, 0x2537, 0x6837, 0x0000, 0x7824, 0xa005, 0x0040, 0x253b,
++	0xa096, 0x00ff, 0x0040, 0x2cc8, 0xa092, 0x0004, 0x00c8, 0x253b,
++	0x2010, 0x2d18, 0x1078, 0x2277, 0x0040, 0x2537, 0x7007, 0x0003,
++	0x701b, 0x2cd3, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2537,
++	0x0078, 0x250d, 0x81ff, 0x00c0, 0x2537, 0x7924, 0xa18c, 0xff00,
++	0x810f, 0xa182, 0x0080, 0x0048, 0x253b, 0xa182, 0x00ff, 0x00c8,
++	0x253b, 0x127e, 0x2091, 0x8000, 0x1078, 0x6a99, 0x00c0, 0x2cf5,
++	0x1078, 0x3834, 0x127f, 0x0078, 0x250d, 0x127f, 0x0078, 0x2537,
++	0x1078, 0x1327, 0x0040, 0x2d0f, 0xa006, 0x6802, 0x7010, 0xa005,
++	0x00c0, 0x2d07, 0x2d00, 0x7012, 0x7016, 0x0078, 0x2d0d, 0x7014,
++	0x6802, 0x2060, 0x2d00, 0x6006, 0x7016, 0xad80, 0x000d, 0x007c,
++	0x7924, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x384c, 0x00c0, 0x2d1f,
++	0x7e28, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0048, 0x2d20, 0xa066,
++	0x8cff, 0x007c, 0x7e24, 0x860f, 0xa18c, 0x00ff, 0x1078, 0x384c,
++	0x00c0, 0x2d30, 0xa6b4, 0x00ff, 0xa682, 0x4000, 0x0048, 0x2d31,
++	0xa066, 0x8cff, 0x007c, 0x017e, 0x7110, 0x81ff, 0x0040, 0x2d3e,
++	0x2168, 0x6904, 0x1078, 0x1340, 0x0078, 0x2d35, 0x7112, 0x7116,
++	0x017f, 0x007c, 0x2031, 0x0001, 0x0078, 0x2d48, 0x2031, 0x0000,
++	0x2061, 0x77bd, 0x6606, 0x6112, 0x600e, 0x6226, 0x632a, 0x642e,
++	0x6532, 0x2c10, 0x1078, 0x1377, 0x7007, 0x0002, 0x701b, 0x250d,
++	0x007c, 0x0f7e, 0x127e, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001,
++	0x777b, 0x2004, 0xa005, 0x00c0, 0x2d74, 0x0068, 0x2d74, 0x7818,
++	0xd084, 0x00c0, 0x2d74, 0x781b, 0x0001, 0x7a22, 0x7b26, 0x7c2a,
++	0x2091, 0x4080, 0x0078, 0x2d99, 0x017e, 0x0c7e, 0x0e7e, 0x2071,
++	0x776d, 0x7138, 0xa182, 0x0008, 0x0048, 0x2d82, 0x7030, 0x2060,
++	0x0078, 0x2d93, 0x7030, 0xa0e0, 0x0008, 0xac82, 0x77bd, 0x0048,
++	0x2d8b, 0x2061, 0x777d, 0x2c00, 0x7032, 0x81ff, 0x00c0, 0x2d91,
++	0x7036, 0x8108, 0x713a, 0x2262, 0x6306, 0x640a, 0x0e7f, 0x0c7f,
++	0x017f, 0x127f, 0x0f7f, 0x007c, 0x0e7e, 0x2071, 0x776d, 0x7038,
++	0xa005, 0x0040, 0x2dd5, 0x127e, 0x2091, 0x8000, 0x0068, 0x2dd4,
++	0x0f7e, 0x2079, 0x0000, 0x7818, 0xd084, 0x00c0, 0x2dd3, 0x0c7e,
++	0x781b, 0x0001, 0x7034, 0x2060, 0x2c04, 0x7822, 0x6004, 0x7826,
++	0x6008, 0x782a, 0x2091, 0x4080, 0x7038, 0x8001, 0x703a, 0xa005,
++	0x00c0, 0x2dc9, 0x7033, 0x777d, 0x7037, 0x777d, 0x0c7f, 0x0078,
++	0x2dd3, 0xac80, 0x0008, 0xa0fa, 0x77bd, 0x0048, 0x2dd1, 0x2001,
++	0x777d, 0x7036, 0x0c7f, 0x0f7f, 0x127f, 0x0e7f, 0x007c, 0x027e,
++	0x2001, 0x7752, 0x2004, 0xd0c4, 0x0040, 0x2de2, 0x2011, 0x8014,
++	0x1078, 0x2d59, 0x027f, 0x007c, 0x81ff, 0x00c0, 0x2537, 0x127e,
++	0x2091, 0x8000, 0x6030, 0xc08d, 0x6032, 0x1078, 0x3591, 0x127f,
++	0x0078, 0x250d, 0x7824, 0x2008, 0xa18c, 0xfffd, 0x00c0, 0x2dfd,
++	0x61c8, 0xa10d, 0x61ca, 0x0078, 0x250d, 0x0078, 0x253b, 0x81ff,
++	0x00c0, 0x2537, 0x6000, 0xa086, 0x0003, 0x00c0, 0x2537, 0x2001,
++	0x7752, 0x2004, 0xd0a4, 0x00c0, 0x2537, 0x1078, 0x2d22, 0x0040,
++	0x253b, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2e1c,
++	0x7828, 0xa005, 0x0040, 0x250d, 0x0c7e, 0x1078, 0x2cf8, 0x0c7f,
++	0x0040, 0x2537, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd,
++	0x683a, 0x1078, 0x6bfb, 0x0040, 0x2537, 0x7007, 0x0003, 0x701b,
++	0x2e32, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2537, 0x0078,
++	0x250d, 0x2001, 0x7700, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2537,
++	0x7f24, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x2cf8, 0x0040,
++	0x2537, 0x2009, 0x0000, 0x2031, 0x0000, 0x7023, 0x0000, 0x702f,
++	0x0000, 0xad80, 0x0005, 0x7026, 0x20a0, 0x1078, 0x384c, 0x00c0,
++	0x2e7f, 0x6004, 0xa0c6, 0x0707, 0x0040, 0x2e7f, 0xa084, 0x00ff,
++	0xa0c6, 0x0006, 0x00c0, 0x2e7f, 0x87ff, 0x0040, 0x2e72, 0xac80,
++	0x0006, 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, 0x1078, 0x2baf,
++	0x0078, 0x2e7b, 0xac80, 0x000a, 0x2098, 0x3400, 0x20a9, 0x0004,
++	0x53a3, 0x1078, 0x2baf, 0x21a2, 0x94a0, 0xa6b0, 0x0005, 0x8108,
++	0xa186, 0x007e, 0x0040, 0x2e8a, 0xa686, 0x0028, 0x0040, 0x2e93,
++	0x0078, 0x2e55, 0x86ff, 0x00c0, 0x2e91, 0x7120, 0x810b, 0x0078,
++	0x250d, 0x702f, 0x0001, 0x711e, 0x7020, 0xa600, 0x7022, 0x772a,
++	0x2061, 0x77bd, 0x6007, 0x0000, 0x6612, 0x7024, 0x600e, 0x6226,
++	0x632a, 0x642e, 0x6532, 0x2c10, 0x1078, 0x1377, 0x7007, 0x0002,
++	0x701b, 0x2eab, 0x007c, 0x702c, 0xa005, 0x00c0, 0x2ebd, 0x711c,
++	0x7024, 0x20a0, 0x7728, 0x2031, 0x0000, 0x2061, 0x77bd, 0x6224,
++	0x6328, 0x642c, 0x6530, 0x0078, 0x2e55, 0x7120, 0x810b, 0x0078,
++	0x250d, 0x127e, 0x0c7e, 0x0e7e, 0x2061, 0x0100, 0x2071, 0x7700,
++	0x6044, 0xd0a4, 0x00c0, 0x2eea, 0xd084, 0x0040, 0x2ed3, 0x1078,
++	0x3015, 0x0078, 0x2ee6, 0xd08c, 0x0040, 0x2eda, 0x1078, 0x2f2c,
++	0x0078, 0x2ee6, 0xd094, 0x0040, 0x2ee1, 0x1078, 0x2f0f, 0x0078,
++	0x2ee6, 0xd09c, 0x0040, 0x2ee6, 0x1078, 0x2ef4, 0x0e7f, 0x0c7f,
++	0x127f, 0x007c, 0x017e, 0x6128, 0xd19c, 0x00c0, 0x2ef1, 0xc19d,
++	0x612a, 0x017f, 0x0078, 0x2ee6, 0x6043, 0x0040, 0x6043, 0x0000,
++	0x706f, 0x0000, 0x7087, 0x0001, 0x70a7, 0x0000, 0x70bf, 0x0000,
++	0x2009, 0x7dc0, 0x200b, 0x0000, 0x707f, 0x0000, 0x7073, 0x000f,
++	0x2009, 0x000f, 0x2011, 0x3551, 0x1078, 0x4719, 0x007c, 0x7070,
++	0xa005, 0x00c0, 0x2f2b, 0x2011, 0x3551, 0x1078, 0x4689, 0x6043,
++	0x0020, 0x6043, 0x0000, 0x6044, 0xd08c, 0x00c0, 0x2f27, 0x7083,
++	0x0000, 0x6043, 0x0090, 0x6043, 0x0010, 0x0078, 0x2f2b, 0x7077,
++	0x0000, 0x0078, 0x2f2b, 0x007c, 0x7074, 0xa08a, 0x0003, 0x00c8,
++	0x2f35, 0x1079, 0x2f38, 0x0078, 0x2f37, 0x1078, 0x12cd, 0x007c,
++	0x2f3b, 0x2f8a, 0x3014, 0x0f7e, 0x7077, 0x0001, 0x20e1, 0xa000,
++	0x20e1, 0x8700, 0x1078, 0x1de4, 0x20e1, 0x9080, 0x20e1, 0x4000,
++	0x2079, 0x7c00, 0x207b, 0x2200, 0x7807, 0x00ef, 0x780b, 0x0000,
++	0x780f, 0x00ef, 0x7813, 0x0138, 0x7817, 0x0000, 0x781b, 0x0000,
++	0x781f, 0x0000, 0x7823, 0xffff, 0x7827, 0xffff, 0x782b, 0x0000,
++	0x782f, 0x0000, 0x2079, 0x7c0c, 0x207b, 0x1101, 0x7807, 0x0000,
++	0x2099, 0x7705, 0x20a1, 0x7c0e, 0x20a9, 0x0004, 0x53a3, 0x2079,
++	0x7c12, 0x207b, 0x0000, 0x7807, 0x0000, 0x2099, 0x7c00, 0x20a1,
++	0x020b, 0x20a9, 0x0014, 0x53a6, 0x60c3, 0x000c, 0x600f, 0x0000,
++	0x1078, 0x3578, 0x0f7f, 0x707b, 0x0000, 0x6043, 0x0008, 0x6043,
++	0x0000, 0x007c, 0x0d7e, 0x7078, 0x707b, 0x0000, 0xa025, 0x0040,
++	0x2ffe, 0x6020, 0xd0b4, 0x00c0, 0x2ffc, 0x7184, 0x81ff, 0x0040,
++	0x2fe5, 0xa486, 0x000c, 0x00c0, 0x2ff0, 0xa480, 0x0018, 0x8004,
++	0x20a8, 0x2011, 0x7c80, 0x2019, 0x7c00, 0x220c, 0x2304, 0xa106,
++	0x00c0, 0x2fbc, 0x8210, 0x8318, 0x00f0, 0x2fa5, 0x6043, 0x0004,
++	0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0006, 0x7077, 0x0002,
++	0x7083, 0x0002, 0x0078, 0x2ffc, 0x2069, 0x7c80, 0x6930, 0xa18e,
++	0x1101, 0x00c0, 0x2ff0, 0x6834, 0xa005, 0x00c0, 0x2ff0, 0x6900,
++	0xa18c, 0x00ff, 0x00c0, 0x2fd0, 0x6804, 0xa005, 0x0040, 0x2fe5,
++	0x2011, 0x7c8e, 0x2019, 0x7705, 0x20a9, 0x0004, 0x220c, 0x2304,
++	0xa102, 0x0048, 0x2fe3, 0x00c0, 0x2ff0, 0x8210, 0x8318, 0x00f0,
++	0x2fd6, 0x0078, 0x2ff0, 0x7087, 0x0000, 0x20e1, 0x9080, 0x20e1,
++	0x4000, 0x2099, 0x7c80, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6,
++	0x6043, 0x0008, 0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x2ffc,
++	0x60c3, 0x000c, 0x1078, 0x3578, 0x0d7f, 0x007c, 0x6020, 0xd0b4,
++	0x00c0, 0x2ffc, 0x60c3, 0x000c, 0x2011, 0x7940, 0x2013, 0x0000,
++	0x707b, 0x0000, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575,
++	0x1078, 0x5693, 0x0078, 0x2ffc, 0x007c, 0x7080, 0xa08a, 0x001d,
++	0x00c8, 0x301e, 0x1079, 0x3021, 0x0078, 0x3020, 0x1078, 0x12cd,
++	0x007c, 0x3045, 0x3054, 0x3085, 0x309a, 0x30ca, 0x30f2, 0x3122,
++	0x314c, 0x317c, 0x31a2, 0x31eb, 0x320d, 0x3231, 0x3247, 0x326f,
++	0x3282, 0x328b, 0x32a4, 0x32d2, 0x32fa, 0x3328, 0x3352, 0x339a,
++	0x33cb, 0x33ed, 0x342b, 0x3451, 0x346a, 0x3477, 0x7003, 0x0007,
++	0x6004, 0xa084, 0xfff9, 0x6006, 0x007c, 0x608b, 0xbc94, 0x608f,
++	0xf0f0, 0x6043, 0x0002, 0x7083, 0x0001, 0x2009, 0x07d0, 0x2011,
++	0x3558, 0x1078, 0x467c, 0x007c, 0x0f7e, 0x7078, 0xa086, 0x0014,
++	0x00c0, 0x3083, 0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x3083,
++	0x2079, 0x7c80, 0x7a30, 0xa296, 0x1102, 0x00c0, 0x3081, 0x7834,
++	0xa005, 0x00c0, 0x3081, 0x7a38, 0xd2fc, 0x0040, 0x3077, 0x70a4,
++	0xa005, 0x00c0, 0x3077, 0x1078, 0x3611, 0x70a7, 0x0001, 0x2011,
++	0x3558, 0x1078, 0x4689, 0x7083, 0x0010, 0x1078, 0x328b, 0x0078,
++	0x3083, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x0003, 0x6043,
++	0x0004, 0x1078, 0x35e2, 0x20a3, 0x1102, 0x20a3, 0x0000, 0x20a9,
++	0x000a, 0x20a3, 0x0000, 0x00f0, 0x3091, 0x60c3, 0x0014, 0x1078,
++	0x3578, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x30c8, 0x2011,
++	0x3558, 0x1078, 0x4689, 0xa086, 0x0014, 0x00c0, 0x30c4, 0x2079,
++	0x7c80, 0x7a30, 0xa296, 0x1102, 0x00c0, 0x30c4, 0x7834, 0xa005,
++	0x00c0, 0x30c4, 0x7a38, 0xd2fc, 0x0040, 0x30be, 0x70a4, 0xa005,
++	0x00c0, 0x30be, 0x1078, 0x3611, 0x70a7, 0x0001, 0x7083, 0x0004,
++	0x1078, 0x30ca, 0x0078, 0x30c8, 0x7083, 0x0002, 0x707b, 0x0000,
++	0x0f7f, 0x007c, 0x7083, 0x0005, 0x1078, 0x35e2, 0x20a3, 0x1103,
++	0x20a3, 0x0000, 0x3430, 0x2011, 0x7c8e, 0x706c, 0xa005, 0x00c0,
++	0x30e4, 0x714c, 0xa186, 0xffff, 0x0040, 0x30e4, 0x1078, 0x351c,
++	0x0040, 0x30e4, 0x1078, 0x3611, 0x20a9, 0x0008, 0x2298, 0x26a0,
++	0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
++	0x3578, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x3120, 0x2011,
++	0x3558, 0x1078, 0x4689, 0xa086, 0x0014, 0x00c0, 0x311c, 0x2079,
++	0x7c80, 0x7a30, 0xa296, 0x1103, 0x00c0, 0x311c, 0x7834, 0xa005,
++	0x00c0, 0x311c, 0x7a38, 0xd2fc, 0x0040, 0x3116, 0x70a4, 0xa005,
++	0x00c0, 0x3116, 0x1078, 0x3611, 0x70a7, 0x0001, 0x7083, 0x0006,
++	0x1078, 0x3122, 0x0078, 0x3120, 0x7083, 0x0002, 0x707b, 0x0000,
++	0x0f7f, 0x007c, 0x7083, 0x0007, 0x1078, 0x35e2, 0x20a3, 0x1104,
++	0x20a3, 0x0000, 0x3430, 0x2011, 0x7c8e, 0x706c, 0xa005, 0x00c0,
++	0x313e, 0x7150, 0xa186, 0xffff, 0x0040, 0x313e, 0xa180, 0x2329,
++	0x200c, 0xa18c, 0xff00, 0x810f, 0x1078, 0x351c, 0x20a9, 0x0008,
++	0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
++	0x0014, 0x1078, 0x3578, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040,
++	0x317a, 0x2011, 0x3558, 0x1078, 0x4689, 0xa086, 0x0014, 0x00c0,
++	0x3176, 0x2079, 0x7c80, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x3176,
++	0x7834, 0xa005, 0x00c0, 0x3176, 0x7a38, 0xd2fc, 0x0040, 0x3170,
++	0x70a4, 0xa005, 0x00c0, 0x3170, 0x1078, 0x3611, 0x70a7, 0x0001,
++	0x7083, 0x0008, 0x1078, 0x317c, 0x0078, 0x317a, 0x7083, 0x0002,
++	0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x0009, 0x1078, 0x35e2,
++	0x20a3, 0x1105, 0x20a3, 0x0100, 0x3430, 0x706c, 0xa005, 0x00c0,
++	0x318f, 0x1078, 0x3486, 0x0040, 0x319f, 0x0078, 0x3199, 0x20a9,
++	0x0008, 0x2099, 0x7c8e, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x60c3, 0x0014, 0x1078, 0x3578, 0x0078, 0x31a1, 0x1078,
++	0x303e, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x31e9, 0x2011,
++	0x3558, 0x1078, 0x4689, 0xa086, 0x0014, 0x00c0, 0x31e5, 0x2079,
++	0x7c80, 0x7a30, 0xa296, 0x1105, 0x00c0, 0x31e5, 0x7834, 0x2011,
++	0x0100, 0xa21e, 0x00c0, 0x31ce, 0x7a38, 0xd2fc, 0x0040, 0x31c8,
++	0x70a4, 0xa005, 0x00c0, 0x31c8, 0x1078, 0x3611, 0x70a7, 0x0001,
++	0x7083, 0x000a, 0x1078, 0x31eb, 0x0078, 0x31e9, 0xa005, 0x00c0,
++	0x31e5, 0x7a38, 0xd2fc, 0x0040, 0x31dd, 0x70a4, 0xa005, 0x00c0,
++	0x31dd, 0x1078, 0x3611, 0x70a7, 0x0001, 0x707f, 0x0000, 0x7083,
++	0x000e, 0x1078, 0x326f, 0x0078, 0x31e9, 0x7083, 0x0002, 0x707b,
++	0x0000, 0x0f7f, 0x007c, 0x7083, 0x000b, 0x2011, 0x7c0e, 0x22a0,
++	0x20a9, 0x0040, 0x2019, 0xffff, 0x43a4, 0x20a9, 0x0002, 0x2009,
++	0x0000, 0x41a4, 0x1078, 0x35e2, 0x20a3, 0x1106, 0x20a3, 0x0000,
++	0x6030, 0xa085, 0x0100, 0x2012, 0x2298, 0x20a9, 0x0042, 0x53a6,
++	0x60c3, 0x0084, 0x1078, 0x3578, 0x007c, 0x0f7e, 0x7078, 0xa005,
++	0x0040, 0x322f, 0x2011, 0x3558, 0x1078, 0x4689, 0xa086, 0x0084,
++	0x00c0, 0x322b, 0x2079, 0x7c80, 0x7a30, 0xa296, 0x1106, 0x00c0,
++	0x322b, 0x7834, 0xa005, 0x00c0, 0x322b, 0x7083, 0x000c, 0x1078,
++	0x3231, 0x0078, 0x322f, 0x7083, 0x0002, 0x707b, 0x0000, 0x0f7f,
++	0x007c, 0x7083, 0x000d, 0x1078, 0x35e2, 0x20a3, 0x1107, 0x20a3,
++	0x0000, 0x2099, 0x7c8e, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x60c3, 0x0084, 0x1078, 0x3578, 0x007c, 0x0f7e,
++	0x7078, 0xa005, 0x0040, 0x326d, 0x2011, 0x3558, 0x1078, 0x4689,
++	0xa086, 0x0084, 0x00c0, 0x3269, 0x2079, 0x7c80, 0x7a30, 0xa296,
++	0x1107, 0x00c0, 0x3269, 0x7834, 0xa005, 0x00c0, 0x3269, 0x707f,
++	0x0001, 0x1078, 0x35d4, 0x7083, 0x000e, 0x1078, 0x326f, 0x0078,
++	0x326d, 0x7083, 0x0002, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083,
++	0x000f, 0x707b, 0x0000, 0x608b, 0xbc85, 0x608f, 0xb5b5, 0x6043,
++	0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, 0x3558, 0x1078,
++	0x467c, 0x007c, 0x7078, 0xa005, 0x0040, 0x328a, 0x2011, 0x3558,
++	0x1078, 0x4689, 0x007c, 0x7083, 0x0011, 0x20e1, 0x9080, 0x20e1,
++	0x4000, 0x2099, 0x7c80, 0x20a1, 0x020b, 0x7478, 0xa480, 0x0018,
++	0xa080, 0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3,
++	0x0014, 0x1078, 0x3578, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040,
++	0x32d0, 0x2011, 0x3558, 0x1078, 0x4689, 0xa086, 0x0014, 0x00c0,
++	0x32ce, 0x2079, 0x7c80, 0x7a30, 0xa296, 0x1103, 0x00c0, 0x32ce,
++	0x7834, 0xa005, 0x00c0, 0x32ce, 0x7a38, 0xd2fc, 0x0040, 0x32c8,
++	0x70a4, 0xa005, 0x00c0, 0x32c8, 0x1078, 0x3611, 0x70a7, 0x0001,
++	0x7083, 0x0012, 0x1078, 0x32d2, 0x0078, 0x32d0, 0x707b, 0x0000,
++	0x0f7f, 0x007c, 0x7083, 0x0013, 0x1078, 0x35ee, 0x20a3, 0x1103,
++	0x20a3, 0x0000, 0x3430, 0x2011, 0x7c8e, 0x706c, 0xa005, 0x00c0,
++	0x32ec, 0x714c, 0xa186, 0xffff, 0x0040, 0x32ec, 0x1078, 0x351c,
++	0x0040, 0x32ec, 0x1078, 0x3611, 0x20a9, 0x0008, 0x2298, 0x26a0,
++	0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
++	0x3578, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x3326, 0x2011,
++	0x3558, 0x1078, 0x4689, 0xa086, 0x0014, 0x00c0, 0x3324, 0x2079,
++	0x7c80, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x3324, 0x7834, 0xa005,
++	0x00c0, 0x3324, 0x7a38, 0xd2fc, 0x0040, 0x331e, 0x70a4, 0xa005,
++	0x00c0, 0x331e, 0x1078, 0x3611, 0x70a7, 0x0001, 0x7083, 0x0014,
++	0x1078, 0x3328, 0x0078, 0x3326, 0x707b, 0x0000, 0x0f7f, 0x007c,
++	0x7083, 0x0015, 0x1078, 0x35ee, 0x20a3, 0x1104, 0x20a3, 0x0000,
++	0x3430, 0x2011, 0x7c8e, 0x706c, 0xa006, 0x00c0, 0x3344, 0x7150,
++	0xa186, 0xffff, 0x0040, 0x3344, 0xa180, 0x2329, 0x200c, 0xa18c,
++	0xff00, 0x810f, 0x1078, 0x351c, 0x20a9, 0x0008, 0x2298, 0x26a0,
++	0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
++	0x3578, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x3398, 0x2011,
++	0x3558, 0x1078, 0x4689, 0xa086, 0x0014, 0x00c0, 0x3396, 0x2079,
++	0x7c80, 0x7a30, 0xa296, 0x1105, 0x00c0, 0x3396, 0x7834, 0x2011,
++	0x0100, 0xa21e, 0x00c0, 0x337f, 0x7a38, 0xd2f4, 0x0040, 0x3372,
++	0x70bf, 0x0008, 0xd2fc, 0x0040, 0x337d, 0x70a4, 0xa005, 0x00c0,
++	0x337d, 0x1078, 0x3611, 0x70a7, 0x0001, 0x0078, 0x3390, 0xa005,
++	0x00c0, 0x3396, 0x7a38, 0xd2fc, 0x0040, 0x338e, 0x70a4, 0xa005,
++	0x00c0, 0x338e, 0x1078, 0x3611, 0x70a7, 0x0001, 0x707f, 0x0000,
++	0x7083, 0x0016, 0x1078, 0x339a, 0x0078, 0x3398, 0x707b, 0x0000,
++	0x0f7f, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0x7c80,
++	0x20a1, 0x020b, 0x20a9, 0x000e, 0x53a6, 0x3430, 0x2011, 0x7c8e,
++	0x7083, 0x0017, 0x0078, 0x33ae, 0x7083, 0x001b, 0x706c, 0xa005,
++	0x00c0, 0x33b8, 0x1078, 0x3486, 0x0040, 0x33c8, 0x0078, 0x33c2,
++	0x20a9, 0x0008, 0x2099, 0x7c8e, 0x26a0, 0x53a6, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x3578, 0x0078, 0x33ca,
++	0x1078, 0x303e, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x33eb,
++	0x2011, 0x3558, 0x1078, 0x4689, 0xa086, 0x0084, 0x00c0, 0x33e9,
++	0x2079, 0x7c80, 0x7a30, 0xa296, 0x1106, 0x00c0, 0x33e9, 0x7834,
++	0xa005, 0x00c0, 0x33e9, 0x7083, 0x0018, 0x1078, 0x33ed, 0x0078,
++	0x33eb, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x0019, 0x1078,
++	0x35ee, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x3430, 0x2099, 0x7c8e,
++	0x2039, 0x7c0e, 0x27a0, 0x20a9, 0x0040, 0x53a3, 0x2728, 0x2514,
++	0x8207, 0xa084, 0x00ff, 0x8000, 0x2018, 0xa294, 0x00ff, 0x8007,
++	0xa205, 0x202a, 0x6030, 0x2310, 0x8214, 0xa2a0, 0x7c0e, 0x2414,
++	0xa38c, 0x0001, 0x0040, 0x3418, 0xa294, 0xff00, 0x0078, 0x341b,
++	0xa294, 0x00ff, 0x8007, 0xa215, 0x2222, 0x2798, 0x26a0, 0x20a9,
++	0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084,
++	0x1078, 0x3578, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x344f,
++	0x2011, 0x3558, 0x1078, 0x4689, 0xa086, 0x0084, 0x00c0, 0x344d,
++	0x2079, 0x7c80, 0x7a30, 0xa296, 0x1107, 0x00c0, 0x344d, 0x7834,
++	0xa005, 0x00c0, 0x344d, 0x707f, 0x0001, 0x1078, 0x35d4, 0x7083,
++	0x001a, 0x1078, 0x3451, 0x0078, 0x344f, 0x707b, 0x0000, 0x0f7f,
++	0x007c, 0x7083, 0x001b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099,
++	0x7c80, 0x20a1, 0x020b, 0x7478, 0xa480, 0x0018, 0xa080, 0x0007,
++	0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0084, 0x1078,
++	0x3578, 0x007c, 0x7078, 0xa005, 0x0040, 0x3476, 0x2011, 0x3558,
++	0x1078, 0x4689, 0x7083, 0x001c, 0x1078, 0x3477, 0x007c, 0x707b,
++	0x0000, 0x608b, 0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0001, 0x2009,
++	0x07d0, 0x2011, 0x3558, 0x1078, 0x467c, 0x007c, 0x087e, 0x097e,
++	0x2029, 0x7752, 0x252c, 0x20a9, 0x0008, 0x2041, 0x7c0e, 0x28a0,
++	0x2099, 0x7c8e, 0x53a3, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4,
++	0x0040, 0x349c, 0x2011, 0x0000, 0x2800, 0xa200, 0x200c, 0xa1a6,
++	0xffff, 0x00c0, 0x34ae, 0xd5d4, 0x0040, 0x34a9, 0x8210, 0x0078,
++	0x34aa, 0x8211, 0x00f0, 0x349c, 0x0078, 0x3513, 0x82ff, 0x00c0,
++	0x34c0, 0xd5d4, 0x0040, 0x34ba, 0xa1a6, 0x3fff, 0x0040, 0x34a6,
++	0x0078, 0x34be, 0xa1a6, 0x3fff, 0x0040, 0x3513, 0xa18d, 0xc000,
++	0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0040, 0x34c9, 0x2019,
++	0x0010, 0x2120, 0xd5d4, 0x0040, 0x34d0, 0x8423, 0x0078, 0x34d1,
++	0x8424, 0x00c8, 0x34de, 0xd5d4, 0x0040, 0x34d9, 0x8319, 0x0078,
++	0x34da, 0x8318, 0x00f0, 0x34ca, 0x0078, 0x3513, 0x23a8, 0x2021,
++	0x0001, 0x8426, 0x8425, 0x00f0, 0x34e2, 0x2328, 0x8529, 0xa2be,
++	0x0007, 0x0040, 0x34f6, 0x007e, 0x2039, 0x0007, 0x2200, 0xa73a,
++	0x007f, 0x27a8, 0xa5a8, 0x0010, 0x00f0, 0x34f2, 0x754e, 0xa5c8,
++	0x2329, 0x292c, 0xa5ac, 0x00ff, 0x6532, 0x60e7, 0x0000, 0x65ea,
++	0x2018, 0x2304, 0xa405, 0x201a, 0x706f, 0x0001, 0x26a0, 0x2898,
++	0x20a9, 0x0008, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0xa085,
++	0x0001, 0x0078, 0x3519, 0xa006, 0x0078, 0x3519, 0xa006, 0x1078,
++	0x12cd, 0x097f, 0x087f, 0x007c, 0x2118, 0x2021, 0x0000, 0x2001,
++	0x0007, 0xa39a, 0x0010, 0x0048, 0x3529, 0x8420, 0x8001, 0x0078,
++	0x3521, 0x2118, 0x84ff, 0x0040, 0x3532, 0xa39a, 0x0010, 0x8421,
++	0x00c0, 0x352d, 0x2021, 0x0001, 0x83ff, 0x0040, 0x353b, 0x8423,
++	0x8319, 0x00c0, 0x3537, 0xa238, 0x2704, 0xa42c, 0x00c0, 0x3550,
++	0xa405, 0x203a, 0x714e, 0xa1a0, 0x2329, 0x242c, 0xa5ac, 0x00ff,
++	0x6532, 0x60e7, 0x0000, 0x65ea, 0x706f, 0x0001, 0xa084, 0x0000,
++	0x007c, 0x0e7e, 0x2071, 0x7700, 0x7073, 0x0000, 0x0e7f, 0x007c,
++	0x0e7e, 0x0f7e, 0x2079, 0x0100, 0x2071, 0x0140, 0x1078, 0x569c,
++	0x7004, 0xa084, 0x4000, 0x0040, 0x3569, 0x7003, 0x1000, 0x7003,
++	0x0000, 0x127e, 0x2091, 0x8000, 0x2071, 0x7720, 0x2073, 0x0000,
++	0x7843, 0x0090, 0x7843, 0x0010, 0x127f, 0x0f7f, 0x0e7f, 0x007c,
++	0x127e, 0x2091, 0x8000, 0x2011, 0x7940, 0x2013, 0x0000, 0x707b,
++	0x0000, 0x127f, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575,
++	0x1078, 0x5693, 0x2009, 0x07d0, 0x2011, 0x3558, 0x1078, 0x4719,
++	0x007c, 0x017e, 0x027e, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x2009,
++	0x00f7, 0x1078, 0x35fa, 0x2061, 0x7949, 0x601b, 0x0000, 0x601f,
++	0x0000, 0x2061, 0x7700, 0x6003, 0x0001, 0x2061, 0x0100, 0x6043,
++	0x0090, 0x6043, 0x0010, 0x2009, 0x001e, 0x2011, 0x35b6, 0x1078,
++	0x467c, 0x127f, 0x0c7f, 0x027f, 0x017f, 0x007c, 0x0e7e, 0x007e,
++	0x127e, 0x2091, 0x8000, 0x2071, 0x0100, 0x1078, 0x569c, 0x2071,
++	0x0140, 0x7004, 0xa084, 0x4000, 0x0040, 0x35ca, 0x7003, 0x1000,
++	0x7003, 0x0000, 0x2001, 0x0001, 0x1078, 0x2025, 0x1078, 0x3591,
++	0x127f, 0x007f, 0x0e7f, 0x007c, 0x20a9, 0x0040, 0x20a1, 0x7dc0,
++	0x2099, 0x7c8e, 0x3304, 0x8007, 0x20a2, 0x9398, 0x94a0, 0x00f0,
++	0x35da, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0x7c00,
++	0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6, 0x007c, 0x20e1, 0x9080,
++	0x20e1, 0x4000, 0x2099, 0x7c80, 0x20a1, 0x020b, 0x20a9, 0x000c,
++	0x53a6, 0x007c, 0x0c7e, 0x007e, 0x2061, 0x0100, 0x810f, 0x2001,
++	0x772c, 0x2004, 0xa005, 0x00c0, 0x360b, 0x6030, 0xa084, 0x00ff,
++	0xa105, 0x0078, 0x360d, 0xa185, 0x00f7, 0x604a, 0x007f, 0x0c7f,
++	0x007c, 0x017e, 0x047e, 0x2001, 0x7752, 0x2004, 0xd0a4, 0x0040,
++	0x3624, 0xa006, 0x2020, 0x2009, 0x002a, 0x1078, 0x7641, 0x2001,
++	0x770c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x1078, 0x2293,
++	0x047f, 0x017f, 0x007c, 0x157e, 0x20a9, 0x00ff, 0x2009, 0x7820,
++	0xa006, 0x200a, 0x8108, 0x00f0, 0x3631, 0x157f, 0x007c, 0x0d7e,
++	0x037e, 0x157e, 0x137e, 0x147e, 0x2069, 0x7751, 0xa006, 0x6002,
++	0x6007, 0x0707, 0x600a, 0x600e, 0x6012, 0xa198, 0x2329, 0x231c,
++	0xa39c, 0x00ff, 0x6316, 0x20a9, 0x0004, 0xac98, 0x0006, 0x23a0,
++	0x40a4, 0x20a9, 0x0004, 0xac98, 0x000a, 0x23a0, 0x40a4, 0x603e,
++	0x6042, 0x604e, 0x6052, 0x6056, 0x605a, 0x605e, 0x6062, 0x6066,
++	0x606a, 0x606e, 0x6072, 0x6076, 0x607a, 0x607e, 0x6082, 0x6086,
++	0x608a, 0x608e, 0x6092, 0x6096, 0x609a, 0x609e, 0x61a2, 0x0d7e,
++	0x60a4, 0xa06d, 0x0040, 0x3676, 0x1078, 0x1340, 0x60a7, 0x0000,
++	0x60a8, 0xa06d, 0x0040, 0x367e, 0x1078, 0x1340, 0x60ab, 0x0000,
++	0x0d7f, 0xa006, 0x604a, 0x6810, 0x603a, 0x680c, 0x6046, 0x6814,
++	0xa084, 0x00ff, 0x6042, 0x147f, 0x137f, 0x157f, 0x037f, 0x0d7f,
++	0x007c, 0x127e, 0x2091, 0x8000, 0x6944, 0x6e48, 0xa684, 0x3fff,
++	0xa082, 0x4000, 0x00c8, 0x3737, 0xa18c, 0xff00, 0x810f, 0xa182,
++	0x00ff, 0x00c8, 0x373d, 0x2001, 0x770c, 0x2004, 0xa084, 0x0003,
++	0x00c0, 0x3720, 0xa188, 0x7820, 0x2104, 0xa065, 0x0040, 0x370e,
++	0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x00c0, 0x3714, 0x60a4,
++	0xa00d, 0x0040, 0x36bf, 0x1078, 0x3a5c, 0x0040, 0x3708, 0x60a8,
++	0xa00d, 0x0040, 0x36d9, 0x1078, 0x3aac, 0x00c0, 0x36d9, 0x694c,
++	0xd1fc, 0x00c0, 0x36cf, 0x1078, 0x37d1, 0x0078, 0x3703, 0x1078,
++	0x37a2, 0x694c, 0xd1ec, 0x00c0, 0x3703, 0x1078, 0x3931, 0x0078,
++	0x3703, 0x694c, 0xa184, 0xa000, 0x0040, 0x36f3, 0xd1ec, 0x0040,
++	0x36ec, 0xd1fc, 0x0040, 0x36e8, 0x1078, 0x3942, 0x0078, 0x36ef,
++	0x1078, 0x3942, 0x0078, 0x36f3, 0xd1fc, 0x0040, 0x36f3, 0x1078,
++	0x37a2, 0x0078, 0x3703, 0x6050, 0xa00d, 0x0040, 0x36fe, 0x2d00,
++	0x200a, 0x6803, 0x0000, 0x6052, 0x0078, 0x3703, 0x2d00, 0x6052,
++	0x604e, 0x6803, 0x0000, 0x1078, 0x4960, 0xa006, 0x127f, 0x007c,
++	0x2001, 0x0005, 0x2009, 0x0000, 0x0078, 0x3741, 0x2001, 0x0028,
++	0x2009, 0x0000, 0x0078, 0x3741, 0xa082, 0x0006, 0x00c8, 0x3720,
++	0x60a0, 0xd0bc, 0x0040, 0x36b7, 0x2001, 0x0028, 0x0078, 0x3733,
++	0x2009, 0x770c, 0x210c, 0xd18c, 0x0040, 0x372a, 0x2001, 0x0004,
++	0x0078, 0x3733, 0xd184, 0x0040, 0x3731, 0x2001, 0x0004, 0x0078,
++	0x3733, 0x2001, 0x0029, 0x2009, 0x0000, 0x0078, 0x3741, 0x2001,
++	0x0029, 0x2009, 0x0000, 0x0078, 0x3741, 0x2001, 0x0029, 0x2009,
++	0x0000, 0xa005, 0x127f, 0x007c, 0x6944, 0x6e48, 0xa684, 0x3fff,
++	0xa082, 0x4000, 0x00c8, 0x3787, 0xa18c, 0xff00, 0x810f, 0xa182,
++	0x00ff, 0x00c8, 0x3777, 0xa188, 0x7820, 0x2104, 0xa065, 0x0040,
++	0x3777, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x00c0, 0x377d,
++	0x684c, 0xd0ec, 0x0040, 0x376a, 0x1078, 0x3942, 0x1078, 0x37a2,
++	0x0078, 0x3772, 0x1078, 0x37a2, 0x684c, 0xd0fc, 0x0040, 0x3772,
++	0x1078, 0x3931, 0x1078, 0x398a, 0xa006, 0x0078, 0x378b, 0x2001,
++	0x0028, 0x2009, 0x0000, 0x0078, 0x378b, 0xa082, 0x0006, 0x0048,
++	0x3760, 0x2001, 0x0029, 0x2009, 0x0000, 0x0078, 0x378b, 0x2001,
++	0x0029, 0x2009, 0x0000, 0xa005, 0x007c, 0x127e, 0x2091, 0x8000,
++	0x6050, 0xa00d, 0x0040, 0x379b, 0x2d00, 0x200a, 0x6803, 0x0000,
++	0x6052, 0x127f, 0x007c, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000,
++	0x0078, 0x3799, 0x127e, 0x2091, 0x8000, 0x604c, 0xa005, 0x0040,
++	0x37ae, 0x6802, 0x2d00, 0x604e, 0x127f, 0x007c, 0x2d00, 0x6052,
++	0x604e, 0x6803, 0x0000, 0x0078, 0x37ac, 0x127e, 0x2091, 0x8000,
++	0x604c, 0xa06d, 0x0040, 0x37c3, 0x6800, 0xa005, 0x00c0, 0x37c1,
++	0x6052, 0x604e, 0xad05, 0x127f, 0x007c, 0x604c, 0xa06d, 0x0040,
++	0x37d0, 0x6800, 0xa005, 0x00c0, 0x37ce, 0x6052, 0x604e, 0xad05,
++	0x007c, 0x6803, 0x0000, 0x6084, 0xa00d, 0x0040, 0x37db, 0x2d00,
++	0x200a, 0x6086, 0x007c, 0x2d00, 0x6086, 0x6082, 0x0078, 0x37da,
++	0x127e, 0x0c7e, 0x027e, 0x2091, 0x8000, 0x6218, 0x2260, 0x6200,
++	0xa005, 0x0040, 0x37ee, 0xc285, 0x0078, 0x37ef, 0xc284, 0x6202,
++	0x027f, 0x0c7f, 0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091, 0x8000,
++	0x6218, 0x2260, 0x6204, 0xa294, 0xff00, 0xa215, 0x6206, 0x0c7f,
++	0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091, 0x8000, 0x6218, 0x2260,
++	0x6204, 0xa294, 0x00ff, 0x8007, 0xa215, 0x6206, 0x0c7f, 0x127f,
++	0x007c, 0x027e, 0xa182, 0x00ff, 0x0048, 0x381a, 0xa085, 0x0001,
++	0x0078, 0x3832, 0xa190, 0x7820, 0x2204, 0xa065, 0x00c0, 0x3831,
++	0x017e, 0x0d7e, 0x1078, 0x130c, 0x2d60, 0x0d7f, 0x017f, 0x0040,
++	0x3816, 0x2c00, 0x2012, 0x60a7, 0x0000, 0x60ab, 0x0000, 0x1078,
++	0x3637, 0xa006, 0x027f, 0x007c, 0x027e, 0xa182, 0x00ff, 0x0048,
++	0x383d, 0xa085, 0x0001, 0x0078, 0x384a, 0x0d7e, 0xa190, 0x7820,
++	0x2204, 0xa06d, 0x0040, 0x3848, 0x2013, 0x0000, 0x1078, 0x1340,
++	0x0d7f, 0xa006, 0x027f, 0x007c, 0x017e, 0xa182, 0x00ff, 0x0048,
++	0x3855, 0xa085, 0x0001, 0x0078, 0x385c, 0xa188, 0x7820, 0x2104,
++	0xa065, 0x0040, 0x3851, 0xa006, 0x017f, 0x007c, 0x0d7e, 0x157e,
++	0x137e, 0x147e, 0x600b, 0x0000, 0x600f, 0x0000, 0x6000, 0xc08c,
++	0x6002, 0x2069, 0x7c8e, 0x6808, 0x605e, 0x6810, 0x6062, 0x6138,
++	0xa10a, 0x0048, 0x3874, 0x603a, 0x6814, 0x6066, 0x2099, 0x7c96,
++	0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2099, 0x7c9a,
++	0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2069, 0x7cae,
++	0x6808, 0x606a, 0x690c, 0x616e, 0x6810, 0x6072, 0x6818, 0x6076,
++	0xa182, 0x0211, 0x00c8, 0x3898, 0x2009, 0x0008, 0x0078, 0x38c2,
++	0xa182, 0x0259, 0x00c8, 0x38a0, 0x2009, 0x0007, 0x0078, 0x38c2,
++	0xa182, 0x02c1, 0x00c8, 0x38a8, 0x2009, 0x0006, 0x0078, 0x38c2,
++	0xa182, 0x0349, 0x00c8, 0x38b0, 0x2009, 0x0005, 0x0078, 0x38c2,
++	0xa182, 0x0421, 0x00c8, 0x38b8, 0x2009, 0x0004, 0x0078, 0x38c2,
++	0xa182, 0x0581, 0x00c8, 0x38c0, 0x2009, 0x0003, 0x0078, 0x38c2,
++	0x2009, 0x0002, 0x6192, 0x147f, 0x137f, 0x157f, 0x0d7f, 0x007c,
++	0x0e7e, 0x2071, 0x7c8d, 0x2e04, 0x6896, 0x2071, 0x7c8e, 0x7004,
++	0x689a, 0x701c, 0x689e, 0x0e7f, 0x007c, 0x0d7e, 0x127e, 0x2091,
++	0x8000, 0x60a4, 0xa06d, 0x0040, 0x38f9, 0x6900, 0x81ff, 0x00c0,
++	0x390d, 0x6a04, 0xa282, 0x0010, 0x00c8, 0x3912, 0xad88, 0x0004,
++	0x20a9, 0x0010, 0x2104, 0xa086, 0xffff, 0x0040, 0x38f4, 0x8108,
++	0x00f0, 0x38ea, 0x1078, 0x12cd, 0x260a, 0x8210, 0x6a06, 0x0078,
++	0x390d, 0x1078, 0x130c, 0x0040, 0x3912, 0x2d00, 0x60a6, 0x6803,
++	0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108,
++	0x00f0, 0x3905, 0x6807, 0x0001, 0x6e12, 0xa085, 0x0001, 0x127f,
++	0x0d7f, 0x007c, 0xa006, 0x0078, 0x390f, 0x127e, 0x2091, 0x8000,
++	0x1078, 0x3a55, 0x00c0, 0x392f, 0x200b, 0xffff, 0x0d7e, 0x60a4,
++	0x2068, 0x6804, 0xa08a, 0x0002, 0x0048, 0x392a, 0x8001, 0x6806,
++	0x0078, 0x392e, 0x1078, 0x1340, 0x60a7, 0x0000, 0x0d7f, 0x127f,
++	0x007c, 0x127e, 0x2091, 0x8000, 0x1078, 0x3ac1, 0x0078, 0x393a,
++	0x1078, 0x378d, 0x1078, 0x39ce, 0x00c0, 0x3938, 0x1078, 0x398a,
++	0x127f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x60a8, 0xa06d,
++	0x0040, 0x3966, 0x6950, 0x81ff, 0x00c0, 0x397a, 0x6a54, 0xa282,
++	0x0010, 0x00c8, 0x3987, 0xad88, 0x0018, 0x20a9, 0x0010, 0x2104,
++	0xa086, 0xffff, 0x0040, 0x3961, 0x8108, 0x00f0, 0x3957, 0x1078,
++	0x12cd, 0x260a, 0x8210, 0x6a56, 0x0078, 0x397a, 0x1078, 0x130c,
++	0x0040, 0x3987, 0x2d00, 0x60aa, 0x6853, 0x0000, 0xad88, 0x0018,
++	0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x00f0, 0x3972, 0x6857,
++	0x0001, 0x6e62, 0x0078, 0x397e, 0x1078, 0x37d1, 0x1078, 0x3994,
++	0x00c0, 0x397c, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x007c, 0xa006,
++	0x0078, 0x3984, 0x127e, 0x2091, 0x8000, 0x1078, 0x4960, 0x127f,
++	0x007c, 0xa01e, 0x0078, 0x3996, 0x2019, 0x0001, 0xa00e, 0x127e,
++	0x2091, 0x8000, 0x604c, 0x2068, 0x6000, 0xd0dc, 0x00c0, 0x39b4,
++	0x8dff, 0x0040, 0x39c9, 0x83ff, 0x0040, 0x39ac, 0x6848, 0xa606,
++	0x0040, 0x39b9, 0x0078, 0x39b4, 0x683c, 0xa406, 0x00c0, 0x39b4,
++	0x6840, 0xa506, 0x0040, 0x39b9, 0x2d08, 0x6800, 0x2068, 0x0078,
++	0x39a0, 0x6a00, 0x604c, 0xad06, 0x00c0, 0x39c1, 0x624e, 0x0078,
++	0x39c4, 0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0, 0x39c9, 0x6152,
++	0x8dff, 0x127f, 0x007c, 0xa01e, 0x0078, 0x39d0, 0x2019, 0x0001,
++	0xa00e, 0x6080, 0x2068, 0x8dff, 0x0040, 0x39fc, 0x83ff, 0x0040,
++	0x39df, 0x6848, 0xa606, 0x0040, 0x39ec, 0x0078, 0x39e7, 0x683c,
++	0xa406, 0x00c0, 0x39e7, 0x6840, 0xa506, 0x0040, 0x39ec, 0x2d08,
++	0x6800, 0x2068, 0x0078, 0x39d3, 0x6a00, 0x6080, 0xad06, 0x00c0,
++	0x39f4, 0x6282, 0x0078, 0x39f7, 0xa180, 0x0000, 0x2202, 0x82ff,
++	0x00c0, 0x39fc, 0x6186, 0x8dff, 0x007c, 0x1078, 0x3a55, 0x00c0,
++	0x3a03, 0x2011, 0x0001, 0x1078, 0x3aa5, 0x00c0, 0x3a09, 0xa295,
++	0x0002, 0x007c, 0x1078, 0x3add, 0x0040, 0x3a12, 0x1078, 0x6b2b,
++	0x0078, 0x3a14, 0xa085, 0x0001, 0x007c, 0x1078, 0x3add, 0x0040,
++	0x3a1d, 0x1078, 0x6aba, 0x0078, 0x3a1f, 0xa085, 0x0001, 0x007c,
++	0x1078, 0x3add, 0x0040, 0x3a28, 0x1078, 0x6b00, 0x0078, 0x3a2a,
++	0xa085, 0x0001, 0x007c, 0x1078, 0x3add, 0x0040, 0x3a33, 0x1078,
++	0x6ad6, 0x0078, 0x3a35, 0xa085, 0x0001, 0x007c, 0x127e, 0x007e,
++	0x0d7e, 0x2091, 0x8000, 0x6080, 0xa06d, 0x0040, 0x3a4d, 0x6800,
++	0x007e, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x6c54,
++	0x1078, 0x3b92, 0x007f, 0x0078, 0x3a3c, 0x6083, 0x0000, 0x6087,
++	0x0000, 0x0d7f, 0x007f, 0x127f, 0x007c, 0x60a4, 0xa00d, 0x00c0,
++	0x3a5c, 0xa085, 0x0001, 0x007c, 0x0e7e, 0x2170, 0x7000, 0xa005,
++	0x00c0, 0x3a6f, 0x20a9, 0x0010, 0xae88, 0x0004, 0x2104, 0xa606,
++	0x0040, 0x3a6f, 0x8108, 0x00f0, 0x3a66, 0xa085, 0x0001, 0x0e7f,
++	0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x60a4, 0xa06d, 0x00c0,
++	0x3a7f, 0x1078, 0x130c, 0x0040, 0x3a91, 0x2d00, 0x60a6, 0x6803,
++	0x0001, 0x6807, 0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b,
++	0xffff, 0x8108, 0x00f0, 0x3a87, 0xa085, 0x0001, 0x127f, 0x0d7f,
++	0x007c, 0xa006, 0x0078, 0x3a8e, 0x0d7e, 0x127e, 0x2091, 0x8000,
++	0x60a4, 0xa06d, 0x0040, 0x3aa2, 0x60a7, 0x0000, 0x1078, 0x1340,
++	0xa085, 0x0001, 0x127f, 0x0d7f, 0x007c, 0x60a8, 0xa00d, 0x00c0,
++	0x3aac, 0xa085, 0x0001, 0x007c, 0x0e7e, 0x2170, 0x7050, 0xa005,
++	0x00c0, 0x3abf, 0x20a9, 0x0010, 0xae88, 0x0018, 0x2104, 0xa606,
++	0x0040, 0x3abf, 0x8108, 0x00f0, 0x3ab6, 0xa085, 0x0001, 0x0e7f,
++	0x007c, 0x127e, 0x2091, 0x8000, 0x1078, 0x3aa5, 0x00c0, 0x3adb,
++	0x200b, 0xffff, 0x0d7e, 0x60a8, 0x2068, 0x6854, 0xa08a, 0x0002,
++	0x0048, 0x3ad6, 0x8001, 0x6856, 0x0078, 0x3ada, 0x1078, 0x1340,
++	0x60ab, 0x0000, 0x0d7f, 0x127f, 0x007c, 0x609c, 0xd0a4, 0x007c,
++	0x0f7e, 0x2079, 0x7751, 0x7804, 0xd0a4, 0x0040, 0x3b09, 0x157e,
++	0x0c7e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x384c,
++	0x00c0, 0x3afd, 0x6004, 0xa084, 0xff00, 0x8007, 0xa086, 0x0006,
++	0x00c0, 0x3afd, 0x6000, 0xc0ed, 0x6002, 0x017f, 0x8108, 0x00f0,
++	0x3aed, 0x0c7f, 0x157f, 0x2009, 0x07d0, 0x2011, 0x3b0b, 0x1078,
++	0x4719, 0x0f7f, 0x007c, 0x2011, 0x3b0b, 0x1078, 0x4689, 0x157e,
++	0x0c7e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x384c,
++	0x00c0, 0x3b37, 0x6000, 0xd0ec, 0x0040, 0x3b37, 0x047e, 0x62a0,
++	0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0x0029, 0x1078, 0x7641,
++	0x6000, 0xc0e5, 0xc0ec, 0x6002, 0x2019, 0x0029, 0x1078, 0x4a7e,
++	0x1078, 0x49c1, 0x2009, 0x0000, 0x1078, 0x747b, 0x047f, 0x017f,
++	0x8108, 0x00f0, 0x3b15, 0x0c7f, 0x157f, 0x007c, 0x0c7e, 0x6018,
++	0x2060, 0x6000, 0xc0ec, 0x6002, 0x0c7f, 0x007c, 0x2071, 0x77ff,
++	0x7003, 0x0001, 0x7007, 0x0000, 0x7013, 0x0000, 0x7017, 0x0000,
++	0x701b, 0x0000, 0x701f, 0x0000, 0x704b, 0x0001, 0x704f, 0x0000,
++	0x705b, 0x0020, 0x705f, 0x0040, 0x707f, 0x0000, 0x007c, 0x0e7e,
++	0x2071, 0x77ff, 0x684c, 0xa005, 0x00c0, 0x3b6d, 0x7028, 0xc085,
++	0x702a, 0xa085, 0x0001, 0x0078, 0x3b90, 0x6a60, 0x7236, 0x6b64,
++	0x733a, 0x6868, 0x703e, 0x7076, 0x686c, 0x7042, 0x707a, 0x684c,
++	0x702e, 0x6844, 0x7032, 0x2009, 0x000d, 0x200a, 0x8007, 0x8006,
++	0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319,
++	0x726e, 0x7372, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0xa006,
++	0x0e7f, 0x007c, 0x0e7e, 0x6838, 0xd0fc, 0x00c0, 0x3be3, 0x6804,
++	0xa00d, 0x0040, 0x3bb1, 0x0d7e, 0x0e7e, 0x2071, 0x7700, 0x027e,
++	0xa016, 0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff,
++	0x00c0, 0x3ba2, 0x702e, 0x70a0, 0xa200, 0x70a2, 0x027f, 0x0e7f,
++	0x0d7f, 0x2071, 0x77ff, 0x701c, 0xa005, 0x00c0, 0x3bf4, 0x0068,
++	0x3bf2, 0x2071, 0x7751, 0x7004, 0xd09c, 0x0040, 0x3bf2, 0x6934,
++	0xa186, 0x0103, 0x00c0, 0x3c05, 0x6948, 0x6844, 0xa105, 0x00c0,
++	0x3be5, 0x2009, 0x8020, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0,
++	0x3bf2, 0x7122, 0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001,
++	0x2091, 0x4080, 0x2071, 0x7700, 0x702c, 0x206a, 0x2d00, 0x702e,
++	0x70a0, 0x8000, 0x70a2, 0x0e7f, 0x007c, 0x6844, 0xa086, 0x0100,
++	0x00c0, 0x3bf2, 0x6868, 0xa005, 0x00c0, 0x3bf2, 0x2009, 0x8020,
++	0x0078, 0x3bcb, 0x2071, 0x77ff, 0x2d08, 0x206b, 0x0000, 0x7010,
++	0x8000, 0x7012, 0x7018, 0xa06d, 0x711a, 0x0040, 0x3c02, 0x6902,
++	0x0078, 0x3c03, 0x711e, 0x0078, 0x3be3, 0xa18c, 0x00ff, 0xa186,
++	0x0017, 0x0040, 0x3c13, 0xa186, 0x001e, 0x0040, 0x3c13, 0xa18e,
++	0x001f, 0x00c0, 0x3bf2, 0x684c, 0xd0cc, 0x0040, 0x3bf2, 0x6850,
++	0xa084, 0x00ff, 0xa086, 0x0001, 0x00c0, 0x3bf2, 0x2009, 0x8021,
++	0x0078, 0x3bcb, 0x007e, 0x6837, 0x0103, 0x20a9, 0x001c, 0xad80,
++	0x0011, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x007f, 0x684a, 0x6952,
++	0x007c, 0x2071, 0x77ff, 0x7004, 0x0079, 0x3c36, 0x3c3e, 0x3c4d,
++	0x3cdd, 0x3cde, 0x3cee, 0x3cf4, 0x3c3f, 0x3ccb, 0x007c, 0x127e,
++	0x2091, 0x8000, 0x0068, 0x3c4c, 0x2009, 0x000d, 0x7030, 0x200a,
++	0x2091, 0x4080, 0x7007, 0x0001, 0x127f, 0x701c, 0xa06d, 0x0040,
++	0x3cca, 0x0e7e, 0x2071, 0x7751, 0x7004, 0xd09c, 0x0040, 0x3cac,
++	0x6934, 0xa186, 0x0103, 0x00c0, 0x3c82, 0x6948, 0x6844, 0xa105,
++	0x00c0, 0x3c9f, 0x2009, 0x8020, 0x127e, 0x2091, 0x8000, 0x0068,
++	0x3c7e, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x3c7e, 0x7122,
++	0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091, 0x4080,
++	0x127f, 0x0e7f, 0x1078, 0x3d27, 0x0078, 0x3cca, 0x127f, 0x0e7f,
++	0x0078, 0x3cca, 0xa18c, 0x00ff, 0xa186, 0x0017, 0x0040, 0x3c90,
++	0xa186, 0x001e, 0x0040, 0x3c90, 0xa18e, 0x001f, 0x00c0, 0x3cac,
++	0x684c, 0xd0cc, 0x0040, 0x3cac, 0x6850, 0xa084, 0x00ff, 0xa086,
++	0x0001, 0x00c0, 0x3cac, 0x2009, 0x8021, 0x0078, 0x3c64, 0x6844,
++	0xa086, 0x0100, 0x00c0, 0x3cac, 0x6868, 0xa005, 0x00c0, 0x3cac,
++	0x2009, 0x8020, 0x0078, 0x3c64, 0x0e7f, 0x1078, 0x3d3b, 0x0040,
++	0x3cca, 0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, 0x0003,
++	0x00c0, 0x3cc1, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0040, 0x3cc1,
++	0x710e, 0x7007, 0x0003, 0x1078, 0x3d5b, 0x7050, 0xa086, 0x0100,
++	0x0040, 0x3cde, 0x007c, 0x701c, 0xa06d, 0x0040, 0x3cdc, 0x1078,
++	0x3d3b, 0x0040, 0x3cdc, 0x7007, 0x0003, 0x1078, 0x3d5b, 0x7050,
++	0xa086, 0x0100, 0x0040, 0x3cde, 0x007c, 0x007c, 0x7050, 0xa09e,
++	0x0100, 0x00c0, 0x3ce7, 0x7007, 0x0004, 0x0078, 0x3cee, 0xa086,
++	0x0200, 0x00c0, 0x3ced, 0x7007, 0x0005, 0x007c, 0x1078, 0x3cf5,
++	0x7006, 0x1078, 0x3d27, 0x007c, 0x007c, 0x702c, 0x7130, 0x8108,
++	0xa102, 0x0048, 0x3d02, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072,
++	0x0078, 0x3d0c, 0x706c, 0xa080, 0x0040, 0x706e, 0x00c8, 0x3d0c,
++	0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x700c, 0x8001, 0x700e,
++	0x00c0, 0x3d20, 0x127e, 0x2091, 0x8000, 0x0068, 0x3d23, 0x2001,
++	0x000d, 0x2102, 0x2091, 0x4080, 0x2001, 0x0001, 0x127f, 0x007c,
++	0x2001, 0x0007, 0x007c, 0x2001, 0x0006, 0x127f, 0x007c, 0x701c,
++	0xa06d, 0x0040, 0x3d3a, 0x127e, 0x2091, 0x8000, 0x7010, 0x8001,
++	0x7012, 0x2d04, 0x701e, 0xa005, 0x00c0, 0x3d37, 0x701a, 0x127f,
++	0x1078, 0x1340, 0x007c, 0x2019, 0x000d, 0x2304, 0x230c, 0xa10e,
++	0x0040, 0x3d4a, 0x2304, 0x230c, 0xa10e, 0x0040, 0x3d4a, 0xa006,
++	0x0078, 0x3d5a, 0x732c, 0x8319, 0x7130, 0xa102, 0x00c0, 0x3d54,
++	0x2300, 0xa005, 0x0078, 0x3d5a, 0x0048, 0x3d59, 0xa302, 0x0078,
++	0x3d5a, 0x8002, 0x007c, 0x2d00, 0x7026, 0xa080, 0x000d, 0x7056,
++	0x7053, 0x0000, 0x127e, 0x2091, 0x8000, 0x2009, 0x7959, 0x2104,
++	0xc08d, 0x200a, 0x127f, 0x1078, 0x1391, 0x007c, 0x2071, 0x77cd,
++	0x7003, 0x0000, 0x7007, 0x0000, 0x700f, 0x0000, 0x702b, 0x0001,
++	0x704f, 0x0000, 0x7053, 0x0001, 0x705f, 0x0020, 0x7063, 0x0040,
++	0x7083, 0x0000, 0x708b, 0x0000, 0x708f, 0x0001, 0x70bf, 0x0000,
++	0x007c, 0x0e7e, 0x2071, 0x77cd, 0x6848, 0xa005, 0x00c0, 0x3d97,
++	0x7028, 0xc085, 0x702a, 0xa085, 0x0001, 0x0078, 0x3dbc, 0x6a50,
++	0x7236, 0x6b54, 0x733a, 0x6858, 0x703e, 0x707a, 0x685c, 0x7042,
++	0x707e, 0x6848, 0x702e, 0x6840, 0x7032, 0x2009, 0x000c, 0x200a,
++	0x8007, 0x8006, 0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210,
++	0x2100, 0xa319, 0x7272, 0x7376, 0x7028, 0xc084, 0x702a, 0x7007,
++	0x0001, 0x700f, 0x0000, 0xa006, 0x0e7f, 0x007c, 0x2b78, 0x2071,
++	0x77cd, 0x7004, 0x1079, 0x3e1c, 0x700c, 0x0079, 0x3dc7, 0x3dcc,
++	0x3dc1, 0x3dc1, 0x3dc1, 0x3dc1, 0x007c, 0x700c, 0x0079, 0x3dd0,
++	0x3dd5, 0x3e1a, 0x3e1a, 0x3e1b, 0x3e1b, 0x7830, 0x7930, 0xa106,
++	0x0040, 0x3ddf, 0x7830, 0x7930, 0xa106, 0x00c0, 0x3e05, 0x7030,
++	0xa10a, 0x0040, 0x3e05, 0x00c8, 0x3de7, 0x712c, 0xa10a, 0xa18a,
++	0x0002, 0x00c8, 0x3e06, 0x1078, 0x130c, 0x0040, 0x3e05, 0x2d00,
++	0x705a, 0x7063, 0x0040, 0x2001, 0x0003, 0x7057, 0x0000, 0x127e,
++	0x007e, 0x2091, 0x8000, 0x2009, 0x7959, 0x2104, 0xc085, 0x200a,
++	0x007f, 0x700e, 0x127f, 0x1078, 0x1391, 0x007c, 0x1078, 0x130c,
++	0x0040, 0x3e05, 0x2d00, 0x705a, 0x1078, 0x130c, 0x00c0, 0x3e12,
++	0x0078, 0x3df1, 0x2d00, 0x7086, 0x7063, 0x0080, 0x2001, 0x0004,
++	0x0078, 0x3df5, 0x007c, 0x007c, 0x3e2d, 0x3e2e, 0x3e65, 0x3e66,
++	0x3e1a, 0x3e9c, 0x3ea1, 0x3ed8, 0x3ed9, 0x3ef4, 0x3ef5, 0x3ef6,
++	0x3ef7, 0x3ef8, 0x3ef9, 0x3f62, 0x3f8c, 0x007c, 0x700c, 0x0079,
++	0x3e31, 0x3e36, 0x3e39, 0x3e49, 0x3e64, 0x3e64, 0x1078, 0x3dcd,
++	0x007c, 0x127e, 0x8001, 0x700e, 0x7058, 0x007e, 0x1078, 0x426e,
++	0x0040, 0x3e46, 0x2091, 0x8000, 0x1078, 0x3dcd, 0x0d7f, 0x0078,
++	0x3e52, 0x127e, 0x8001, 0x700e, 0x1078, 0x426e, 0x7058, 0x2068,
++	0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000, 0x6834, 0xa084,
++	0x00ff, 0xa08a, 0x0020, 0x00c8, 0x3e61, 0x1079, 0x3e7c, 0x127f,
++	0x007c, 0x127f, 0x1078, 0x3efa, 0x007c, 0x007c, 0x007c, 0x0e7e,
++	0x2071, 0x77cd, 0x700c, 0x0079, 0x3e6d, 0x3e72, 0x3e72, 0x3e72,
++	0x3e74, 0x3e78, 0x0e7f, 0x007c, 0x700f, 0x0001, 0x0078, 0x3e7a,
++	0x700f, 0x0002, 0x0e7f, 0x007c, 0x3efa, 0x3efa, 0x3f16, 0x3efa,
++	0x4001, 0x3efa, 0x3efa, 0x3efa, 0x3efa, 0x3efa, 0x3f16, 0x4040,
++	0x408a, 0x40e3, 0x40f7, 0x3efa, 0x3efa, 0x3f32, 0x3f16, 0x3efa,
++	0x3efa, 0x3f48, 0x4182, 0x41a0, 0x3efa, 0x3f32, 0x3efa, 0x3efa,
++	0x3efa, 0x3efa, 0x3f48, 0x41a0, 0x7020, 0x2068, 0x1078, 0x1340,
++	0x007c, 0x700c, 0x0079, 0x3ea4, 0x3ea9, 0x3eac, 0x3ebc, 0x3ed7,
++	0x3ed7, 0x1078, 0x3dcd, 0x007c, 0x127e, 0x8001, 0x700e, 0x7058,
++	0x007e, 0x1078, 0x426e, 0x0040, 0x3eb9, 0x2091, 0x8000, 0x1078,
++	0x3dcd, 0x0d7f, 0x0078, 0x3ec5, 0x127e, 0x8001, 0x700e, 0x1078,
++	0x426e, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807,
++	0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x001a, 0x00c8, 0x3ed4,
++	0x1079, 0x3eda, 0x127f, 0x007c, 0x127f, 0x1078, 0x3efa, 0x007c,
++	0x007c, 0x007c, 0x3efa, 0x3f16, 0x3feb, 0x3efa, 0x3f16, 0x3efa,
++	0x3f16, 0x3f16, 0x3efa, 0x3f16, 0x3feb, 0x3f16, 0x3f16, 0x3f16,
++	0x3f16, 0x3f16, 0x3efa, 0x3f16, 0x3feb, 0x3efa, 0x3efa, 0x3f16,
++	0x3efa, 0x3efa, 0x3efa, 0x3f16, 0x007c, 0x007c, 0x007c, 0x007c,
++	0x007c, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0d5,
++	0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x3b92, 0x127f, 0x007c,
++	0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0e5, 0x683a, 0x127e,
++	0x2091, 0x8000, 0x1078, 0x3b92, 0x127f, 0x007c, 0x7007, 0x0001,
++	0x6838, 0xa084, 0x00ff, 0xc0ed, 0x683a, 0x127e, 0x2091, 0x8000,
++	0x1078, 0x3b92, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084,
++	0x00ff, 0xc0dd, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x3b92,
++	0x127f, 0x007c, 0x6834, 0x8007, 0xa084, 0x00ff, 0x0040, 0x3f08,
++	0x8001, 0x00c0, 0x3f3f, 0x7007, 0x0001, 0x0078, 0x3fc8, 0x7007,
++	0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x3fc8, 0x007c,
++	0x2d00, 0x7016, 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098,
++	0x20a1, 0x77f8, 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x00c8,
++	0x3f24, 0x6884, 0xa08a, 0x0003, 0x00c8, 0x3f24, 0xa080, 0x3fb9,
++	0x2004, 0x70c6, 0x7010, 0xa015, 0x0040, 0x3fac, 0x1078, 0x130c,
++	0x00c0, 0x3f6d, 0x7007, 0x000f, 0x007c, 0x2d00, 0x7022, 0x70c4,
++	0x2060, 0x6000, 0x6836, 0x6004, 0xad00, 0x7096, 0x6008, 0xa20a,
++	0x00c8, 0x3f7c, 0xa00e, 0x2200, 0x7112, 0x620c, 0x8003, 0x800b,
++	0xa296, 0x0004, 0x0040, 0x3f85, 0xa108, 0x719a, 0x810b, 0x719e,
++	0xae90, 0x0022, 0x1078, 0x1377, 0x7090, 0xa08e, 0x0100, 0x0040,
++	0x3fa0, 0xa086, 0x0200, 0x0040, 0x3f98, 0x7007, 0x0010, 0x007c,
++	0x7020, 0x2068, 0x1078, 0x1340, 0x7014, 0x2068, 0x0078, 0x3f24,
++	0x7020, 0x2068, 0x7018, 0x6802, 0x6807, 0x0000, 0x2d08, 0x2068,
++	0x6906, 0x711a, 0x0078, 0x3f62, 0x7014, 0x2068, 0x7007, 0x0001,
++	0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x0040, 0x41bd, 0x0078,
++	0x3fc8, 0x3fbc, 0x3fc0, 0x3fc4, 0x0002, 0x0011, 0x0007, 0x0004,
++	0x000a, 0x000f, 0x0005, 0x0006, 0x0012, 0x000f, 0x0005, 0x0006,
++	0x2009, 0x772c, 0x210c, 0x81ff, 0x00c0, 0x3fe5, 0x6838, 0xa084,
++	0x00ff, 0x683a, 0x6853, 0x0000, 0x1078, 0x3691, 0x00c0, 0x3fd9,
++	0x007c, 0x1078, 0x3c22, 0x127e, 0x2091, 0x8000, 0x1078, 0x6c54,
++	0x1078, 0x3b92, 0x127f, 0x0078, 0x3fd8, 0x2001, 0x0028, 0x2009,
++	0x0000, 0x0078, 0x3fd9, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906,
++	0x711a, 0x7010, 0x8001, 0x7012, 0x0040, 0x3ffa, 0x7007, 0x0006,
++	0x0078, 0x4000, 0x7014, 0x2068, 0x7007, 0x0001, 0x7048, 0x107a,
++	0x007c, 0x7007, 0x0001, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x6848,
++	0xa084, 0x00ff, 0x20a9, 0x0001, 0xa096, 0x0001, 0x0040, 0x402a,
++	0x2009, 0x0000, 0x20a9, 0x007e, 0xa096, 0x0002, 0x0040, 0x402a,
++	0xa005, 0x00c0, 0x403d, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x1078,
++	0x384c, 0x00c0, 0x403d, 0x067e, 0x6e50, 0x1078, 0x3915, 0x067f,
++	0x0078, 0x403d, 0x047e, 0x2011, 0x770c, 0x2224, 0xc484, 0xc48c,
++	0x2412, 0x047f, 0x0c7e, 0x1078, 0x384c, 0x00c0, 0x4039, 0x1078,
++	0x3a94, 0x8108, 0x00f0, 0x4033, 0x0c7f, 0x1078, 0x1340, 0x007c,
++	0x127e, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0x7752, 0x2004,
++	0xd0a4, 0x0040, 0x4081, 0x2009, 0x0000, 0x1078, 0x428a, 0x6100,
++	0xd184, 0x0040, 0x4066, 0x6858, 0xa084, 0x00ff, 0x00c0, 0x4084,
++	0x6000, 0xd084, 0x0040, 0x4081, 0x6004, 0xa005, 0x00c0, 0x4087,
++	0x6003, 0x0000, 0x600b, 0x0000, 0x0078, 0x407e, 0x2011, 0x0001,
++	0x6860, 0xa005, 0x00c0, 0x406e, 0x2001, 0x001e, 0x8000, 0x6016,
++	0x6858, 0xa084, 0x00ff, 0x0040, 0x4081, 0x6006, 0x6858, 0x8007,
++	0xa084, 0x00ff, 0x0040, 0x4081, 0x600a, 0x6202, 0x127f, 0x0078,
++	0x425d, 0x127f, 0x0078, 0x4255, 0x127f, 0x0078, 0x424d, 0x127f,
++	0x0078, 0x4251, 0x127e, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001,
++	0x7752, 0x2004, 0xd0a4, 0x0040, 0x40e0, 0x2009, 0x0000, 0x1078,
++	0x428a, 0x6000, 0xa084, 0x0001, 0x0040, 0x40e0, 0x6204, 0x6308,
++	0x6c48, 0xa484, 0x0003, 0x0040, 0x40b8, 0x6958, 0xa18c, 0x00ff,
++	0x8001, 0x00c0, 0x40b1, 0x2100, 0xa210, 0x0048, 0x40dd, 0x0078,
++	0x40b8, 0x8001, 0x00c0, 0x40dd, 0x2100, 0xa212, 0x0048, 0x40dd,
++	0xa484, 0x000c, 0x0040, 0x40d2, 0x6958, 0x810f, 0xa18c, 0x00ff,
++	0xa082, 0x0004, 0x00c0, 0x40ca, 0x2100, 0xa318, 0x0048, 0x40dd,
++	0x0078, 0x40d2, 0xa082, 0x0004, 0x00c0, 0x40dd, 0x2100, 0xa31a,
++	0x0048, 0x40dd, 0x6860, 0xa005, 0x0040, 0x40d8, 0x8000, 0x6016,
++	0x6206, 0x630a, 0x127f, 0x0078, 0x425d, 0x127f, 0x0078, 0x4259,
++	0x127f, 0x0078, 0x4255, 0x127e, 0x2091, 0x8000, 0x7007, 0x0001,
++	0x2009, 0x0000, 0x1078, 0x428a, 0x6308, 0x8318, 0x0048, 0x40f4,
++	0x630a, 0x127f, 0x0078, 0x426b, 0x127f, 0x0078, 0x4259, 0x127e,
++	0x0c7e, 0x2091, 0x8000, 0x7007, 0x0001, 0x684c, 0xd0ac, 0x0040,
++	0x410d, 0x2009, 0x0000, 0x0c7e, 0x1078, 0x4727, 0x6000, 0x2001,
++	0xfcff, 0x6002, 0x0c7f, 0x0078, 0x4144, 0x6858, 0xa005, 0x0040,
++	0x4159, 0x685c, 0xa065, 0x0040, 0x4155, 0x2001, 0x772c, 0x2004,
++	0xa005, 0x0040, 0x411f, 0x1078, 0x6bb6, 0x0078, 0x4125, 0x6013,
++	0x0400, 0x2009, 0x0041, 0x1078, 0x5d41, 0x6958, 0xa18c, 0xe600,
++	0xa186, 0x2000, 0x0040, 0x413c, 0xa186, 0x0400, 0x0040, 0x413c,
++	0x2009, 0x0000, 0x0c7e, 0x1078, 0x4727, 0x6000, 0xa084, 0xfdff,
++	0x6002, 0x0c7f, 0x0078, 0x4144, 0x027e, 0x2009, 0x0000, 0x2011,
++	0xfdff, 0x1078, 0x47d0, 0x027f, 0x684c, 0xd0c4, 0x0040, 0x4151,
++	0x2009, 0x0000, 0x1078, 0x4727, 0x6008, 0x8000, 0x0048, 0x4151,
++	0x600a, 0x0c7f, 0x127f, 0x0078, 0x425d, 0x0c7f, 0x127f, 0x0078,
++	0x4255, 0x6954, 0xa186, 0x002a, 0x00c0, 0x4165, 0x2001, 0x770c,
++	0x200c, 0xc194, 0x2102, 0x0078, 0x4144, 0xa186, 0x0020, 0x0040,
++	0x417a, 0xa186, 0x0029, 0x00c0, 0x4155, 0x6944, 0xa18c, 0xff00,
++	0x810f, 0x1078, 0x384c, 0x00c0, 0x4144, 0x6000, 0xc0e4, 0x6002,
++	0x0078, 0x4144, 0x685c, 0xa065, 0x0040, 0x4155, 0x6017, 0x0014,
++	0x0078, 0x4144, 0x2009, 0x0000, 0x1078, 0x428a, 0x6000, 0xa084,
++	0x0001, 0x0040, 0x419c, 0x2091, 0x8000, 0x6204, 0x8210, 0x0048,
++	0x4196, 0x6206, 0x2091, 0x8001, 0x0078, 0x426b, 0x2091, 0x8001,
++	0x6853, 0x0016, 0x0078, 0x4264, 0x6853, 0x0007, 0x0078, 0x4264,
++	0x6834, 0x8007, 0xa084, 0x00ff, 0x00c0, 0x41aa, 0x1078, 0x3f08,
++	0x0078, 0x41bc, 0x2030, 0x8001, 0x00c0, 0x41b4, 0x7007, 0x0001,
++	0x1078, 0x41bd, 0x0078, 0x41bc, 0x7007, 0x0006, 0x7012, 0x2d00,
++	0x7016, 0x701a, 0x704b, 0x41bd, 0x007c, 0x0e7e, 0x2009, 0x772c,
++	0x210c, 0x81ff, 0x00c0, 0x423f, 0x2009, 0x770c, 0x210c, 0xd194,
++	0x00c0, 0x4249, 0x6848, 0x2070, 0xae82, 0x7e00, 0x0048, 0x422e,
++	0x2001, 0x7715, 0x2004, 0xae02, 0x00c8, 0x422e, 0x2009, 0x0000,
++	0x1078, 0x428a, 0x6100, 0xa184, 0x0001, 0x0040, 0x4214, 0xa184,
++	0x0100, 0x00c0, 0x4232, 0xa184, 0x0200, 0x00c0, 0x4236, 0x601c,
++	0xa005, 0x00c0, 0x423a, 0x711c, 0xa186, 0x0006, 0x00c0, 0x4219,
++	0x6853, 0x0000, 0x6803, 0x0000, 0x2d08, 0x127e, 0x2091, 0x8000,
++	0x7010, 0xa005, 0x00c0, 0x420b, 0x7112, 0x7018, 0xa065, 0x0040,
++	0x423e, 0x6000, 0xd0e4, 0x00c0, 0x4243, 0x2e60, 0x1078, 0x4730,
++	0x127f, 0x0e7f, 0x007c, 0x2068, 0x6800, 0xa005, 0x00c0, 0x420b,
++	0x6902, 0x127f, 0x0e7f, 0x007c, 0x0e7f, 0x6853, 0x0006, 0x0078,
++	0x4264, 0x6944, 0xa18c, 0xff00, 0x810f, 0x1078, 0x384c, 0x00c0,
++	0x4244, 0x6000, 0xd0e4, 0x00c0, 0x4244, 0x711c, 0xa186, 0x0007,
++	0x00c0, 0x422e, 0x6853, 0x0002, 0x0078, 0x4246, 0x6853, 0x0008,
++	0x0078, 0x4246, 0x6853, 0x000e, 0x0078, 0x4246, 0x6853, 0x0017,
++	0x0078, 0x4246, 0x6853, 0x0035, 0x0078, 0x4246, 0x127f, 0x6853,
++	0x0028, 0x0078, 0x4246, 0x127f, 0x6853, 0x0029, 0x0e7f, 0x0078,
++	0x4264, 0x6853, 0x002a, 0x0078, 0x4246, 0x2009, 0x003e, 0x0078,
++	0x425f, 0x2009, 0x0004, 0x0078, 0x425f, 0x2009, 0x0006, 0x0078,
++	0x425f, 0x2009, 0x0016, 0x0078, 0x425f, 0x2009, 0x0001, 0x6854,
++	0xa084, 0xff00, 0xa105, 0x6856, 0x2091, 0x8000, 0x1078, 0x3b92,
++	0x2091, 0x8001, 0x007c, 0x1078, 0x1340, 0x007c, 0x702c, 0x7130,
++	0x8108, 0xa102, 0x0048, 0x427b, 0xa00e, 0x7034, 0x7072, 0x7038,
++	0x7076, 0x0078, 0x4287, 0x7070, 0xa080, 0x0040, 0x7072, 0x00c8,
++	0x4287, 0x7074, 0xa081, 0x0000, 0x7076, 0xa085, 0x0001, 0x7932,
++	0x7132, 0x007c, 0x0d7e, 0x1078, 0x4727, 0x0d7f, 0x007c, 0x0d7e,
++	0x2011, 0x0004, 0x2204, 0xa085, 0x8002, 0x2012, 0x0d7f, 0x007c,
++	0x20e1, 0x0002, 0x3d08, 0x20e1, 0x2000, 0x3d00, 0xa084, 0x7000,
++	0x0040, 0x42a6, 0xa086, 0x1000, 0x00c0, 0x42c2, 0x20e1, 0x0004,
++	0x3d60, 0xd1bc, 0x00c0, 0x42ad, 0x3e60, 0xac84, 0x0007, 0x00c0,
++	0x42c2, 0xac82, 0x7e00, 0x0048, 0x42c2, 0x6854, 0xac02, 0x00c8,
++	0x42c2, 0x2009, 0x0047, 0x1078, 0x5d41, 0x7a1c, 0xd284, 0x00c0,
++	0x4298, 0x007c, 0xa016, 0x1078, 0x156a, 0x0078, 0x42bd, 0x157e,
++	0x137e, 0x147e, 0x20e1, 0x3000, 0x3d20, 0x3e28, 0xa584, 0x0070,
++	0x00c0, 0x42f0, 0xa484, 0x7000, 0xa086, 0x1000, 0x00c0, 0x42f0,
++	0x1078, 0x42fd, 0x0040, 0x42f0, 0x20e1, 0x3000, 0x7828, 0x7828,
++	0x1078, 0x431b, 0x147f, 0x137f, 0x157f, 0x2009, 0x793e, 0x2104,
++	0xa005, 0x00c0, 0x42ec, 0x007c, 0x1078, 0x4d96, 0x0078, 0x42eb,
++	0x1078, 0x7674, 0x1078, 0x42fd, 0x20e1, 0x3000, 0x7828, 0x7828,
++	0x147f, 0x137f, 0x157f, 0x0078, 0x42eb, 0xa484, 0x01ff, 0x687a,
++	0xa005, 0x0040, 0x430f, 0xa080, 0x001f, 0xa084, 0x03f8, 0x80ac,
++	0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0x007c, 0x20a9,
++	0x000c, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0xa085,
++	0x0001, 0x0078, 0x430e, 0x7000, 0xa084, 0xff00, 0xa08c, 0xf000,
++	0x8007, 0xa196, 0x0000, 0x00c0, 0x4328, 0x0078, 0x449c, 0x007c,
++	0xa196, 0x2000, 0x00c0, 0x4339, 0x6900, 0xa18e, 0x0001, 0x00c0,
++	0x4335, 0x1078, 0x2ec1, 0x0078, 0x4327, 0x1078, 0x4341, 0x0078,
++	0x4327, 0xa196, 0x8000, 0x00c0, 0x4327, 0x1078, 0x4522, 0x0078,
++	0x4327, 0x0c7e, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa196, 0x0001,
++	0x0040, 0x434e, 0xa196, 0x0023, 0x00c0, 0x4443, 0xa08e, 0x0023,
++	0x00c0, 0x437f, 0x1078, 0x4599, 0x0040, 0x4443, 0x7124, 0x610a,
++	0x7030, 0xa08e, 0x0200, 0x00c0, 0x4367, 0x7034, 0xa005, 0x00c0,
++	0x4443, 0x2009, 0x0015, 0x1078, 0x5d41, 0x0078, 0x4443, 0xa08e,
++	0x0210, 0x00c0, 0x4371, 0x2009, 0x0015, 0x1078, 0x5d41, 0x0078,
++	0x4443, 0xa08e, 0x0100, 0x00c0, 0x4443, 0x7034, 0xa005, 0x00c0,
++	0x4443, 0x2009, 0x0016, 0x1078, 0x5d41, 0x0078, 0x4443, 0xa08e,
++	0x0022, 0x00c0, 0x4443, 0x7030, 0xa08e, 0x0300, 0x00c0, 0x4390,
++	0x7034, 0xa005, 0x00c0, 0x4443, 0x2009, 0x0017, 0x0078, 0x440f,
++	0xa08e, 0x0500, 0x00c0, 0x439c, 0x7034, 0xa005, 0x00c0, 0x4443,
++	0x2009, 0x0018, 0x0078, 0x440f, 0xa08e, 0x2010, 0x00c0, 0x43a4,
++	0x2009, 0x0019, 0x0078, 0x440f, 0xa08e, 0x2110, 0x00c0, 0x43ac,
++	0x2009, 0x001a, 0x0078, 0x440f, 0xa08e, 0x5200, 0x00c0, 0x43b8,
++	0x7034, 0xa005, 0x00c0, 0x4443, 0x2009, 0x001b, 0x0078, 0x440f,
++	0xa08e, 0x5000, 0x00c0, 0x43c4, 0x7034, 0xa005, 0x00c0, 0x4443,
++	0x2009, 0x001c, 0x0078, 0x440f, 0xa08e, 0x1200, 0x00c0, 0x43d0,
++	0x7034, 0xa005, 0x00c0, 0x4443, 0x2009, 0x0024, 0x0078, 0x440f,
++	0xa08c, 0xff00, 0xa18e, 0x2400, 0x00c0, 0x43da, 0x2009, 0x002d,
++	0x0078, 0x440f, 0xa08c, 0xff00, 0xa18e, 0x5300, 0x00c0, 0x43e4,
++	0x2009, 0x002a, 0x0078, 0x440f, 0xa08e, 0x0f00, 0x00c0, 0x43ec,
++	0x2009, 0x0020, 0x0078, 0x440f, 0xa08e, 0x5300, 0x00c0, 0x43f2,
++	0x0078, 0x440d, 0xa08e, 0x6104, 0x00c0, 0x440d, 0x2011, 0x7c8d,
++	0x8208, 0x2204, 0xa082, 0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011,
++	0x8015, 0x211c, 0x8108, 0x2124, 0x1078, 0x2d59, 0x8108, 0x00f0,
++	0x43ff, 0x2009, 0x0023, 0x0078, 0x440f, 0x2009, 0x001d, 0x017e,
++	0x2011, 0x7c83, 0x2204, 0x8211, 0x220c, 0x1078, 0x207f, 0x00c0,
++	0x4445, 0x1078, 0x3811, 0x00c0, 0x4445, 0x6612, 0x6516, 0x86ff,
++	0x0040, 0x4435, 0x017f, 0x017e, 0xa186, 0x0017, 0x00c0, 0x4435,
++	0x6864, 0xa606, 0x00c0, 0x4435, 0x6868, 0xa506, 0xa084, 0xff00,
++	0x00c0, 0x4435, 0x6000, 0xc0f5, 0x6002, 0x0c7e, 0x1078, 0x5cb4,
++	0x0040, 0x4448, 0x017f, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a,
++	0x017f, 0x1078, 0x5d41, 0x0c7f, 0x007c, 0x017f, 0x0078, 0x4443,
++	0x0c7f, 0x0078, 0x4445, 0x0e7e, 0x0d7e, 0x2028, 0x2130, 0xa696,
++	0x00ff, 0x00c0, 0x446b, 0xa596, 0xfffd, 0x00c0, 0x445b, 0x2009,
++	0x007f, 0x0078, 0x4498, 0xa596, 0xfffe, 0x00c0, 0x4463, 0x2009,
++	0x007e, 0x0078, 0x4498, 0xa596, 0xfffc, 0x00c0, 0x446b, 0x2009,
++	0x0080, 0x0078, 0x4498, 0x2011, 0x0000, 0x2021, 0x007e, 0x20a9,
++	0x0082, 0x2071, 0x789e, 0x2e1c, 0x83ff, 0x00c0, 0x447d, 0x82ff,
++	0x00c0, 0x448c, 0x2410, 0x0078, 0x448c, 0x2368, 0x6b10, 0x007e,
++	0x2100, 0xa31e, 0x007f, 0x00c0, 0x448c, 0x6b14, 0xa31e, 0x00c0,
++	0x448c, 0x2408, 0x0078, 0x4498, 0x8420, 0x8e70, 0x00f0, 0x4473,
++	0x82ff, 0x00c0, 0x4497, 0xa085, 0x0001, 0x0078, 0x4499, 0x2208,
++	0xa006, 0x0d7f, 0x0e7f, 0x007c, 0xa084, 0x0007, 0x0079, 0x44a1,
++	0x007c, 0x44a9, 0x44a9, 0x44a9, 0x44a9, 0x44a9, 0x44aa, 0x44c3,
++	0x450b, 0x007c, 0x7110, 0xd1bc, 0x0040, 0x44c2, 0x7120, 0x2160,
++	0xac8c, 0x0007, 0x00c0, 0x44c2, 0xac8a, 0x7e00, 0x0048, 0x44c2,
++	0x6854, 0xac02, 0x00c8, 0x44c2, 0x7124, 0x610a, 0x2009, 0x0046,
++	0x1078, 0x5d41, 0x007c, 0x0c7e, 0x7110, 0xd1bc, 0x00c0, 0x4509,
++	0x2011, 0x7c83, 0x2204, 0x8211, 0x220c, 0x1078, 0x207f, 0x00c0,
++	0x4509, 0x1078, 0x384c, 0x00c0, 0x4509, 0x6204, 0xa294, 0xff00,
++	0x8217, 0xa286, 0x0006, 0x00c0, 0x44ee, 0x0c7e, 0x1078, 0x5cb4,
++	0x017f, 0x0040, 0x4509, 0x611a, 0x601f, 0x0006, 0x7120, 0x610a,
++	0x2009, 0x0044, 0x1078, 0x5d41, 0x0078, 0x4509, 0x0c7e, 0x1078,
++	0x5cb4, 0x017f, 0x0040, 0x4509, 0x611a, 0x601f, 0x0004, 0x7120,
++	0x610a, 0xa286, 0x0004, 0x00c0, 0x4501, 0x6007, 0x0005, 0x0078,
++	0x4503, 0x6007, 0x0001, 0x6003, 0x0001, 0x1078, 0x498e, 0x1078,
++	0x4d96, 0x0c7f, 0x007c, 0x7110, 0xd1bc, 0x0040, 0x4521, 0x7020,
++	0x2060, 0xac84, 0x0007, 0x00c0, 0x4521, 0xac82, 0x7e00, 0x0048,
++	0x4521, 0x6854, 0xac02, 0x00c8, 0x4521, 0x2009, 0x0045, 0x1078,
++	0x5d41, 0x007c, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000,
++	0x00c0, 0x4532, 0xa084, 0x000f, 0xa08a, 0x0006, 0x10c8, 0x12cd,
++	0x1079, 0x4533, 0x007c, 0x4539, 0x453a, 0x4539, 0x4539, 0x457b,
++	0x458a, 0x007c, 0x7110, 0xd1bc, 0x00c0, 0x457a, 0x700c, 0x7108,
++	0x1078, 0x207f, 0x00c0, 0x457a, 0x1078, 0x3811, 0x00c0, 0x457a,
++	0x6612, 0x6516, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, 0x0006,
++	0x00c0, 0x4563, 0x0c7e, 0x1078, 0x5cb4, 0x017f, 0x0040, 0x457a,
++	0x611a, 0x601f, 0x0005, 0x7120, 0x610a, 0x2009, 0x0088, 0x1078,
++	0x5d41, 0x0078, 0x457a, 0x0c7e, 0x1078, 0x5cb4, 0x017f, 0x0040,
++	0x457a, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0xa286, 0x0004,
++	0x00c0, 0x4576, 0x2009, 0x0005, 0x0078, 0x4578, 0x2009, 0x0001,
++	0x1078, 0x5d41, 0x007c, 0x7110, 0xd1bc, 0x0040, 0x4589, 0x1078,
++	0x4599, 0x0040, 0x4589, 0x7124, 0x610a, 0x2009, 0x0089, 0x1078,
++	0x5d41, 0x007c, 0x7110, 0xd1bc, 0x0040, 0x4598, 0x1078, 0x4599,
++	0x0040, 0x4598, 0x7124, 0x610a, 0x2009, 0x008a, 0x1078, 0x5d41,
++	0x007c, 0x7020, 0x2060, 0xac84, 0x0007, 0x00c0, 0x45ac, 0xac82,
++	0x7e00, 0x0048, 0x45ac, 0x2001, 0x7715, 0x2004, 0xac02, 0x00c8,
++	0x45ac, 0xa085, 0x0001, 0x007c, 0xa006, 0x0078, 0x45ab, 0x2071,
++	0x7949, 0x7003, 0x0003, 0x700f, 0x0361, 0xa006, 0x701a, 0x7012,
++	0x7017, 0x7e00, 0x7007, 0x0000, 0x7026, 0x702b, 0x56a9, 0x7032,
++	0x7037, 0x56ea, 0x703b, 0x0002, 0x703f, 0x0000, 0x007c, 0x2071,
++	0x7949, 0x00e0, 0x4676, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e,
++	0x00c0, 0x463f, 0x700f, 0x0361, 0x7007, 0x0001, 0x127e, 0x2091,
++	0x8000, 0x7138, 0x8109, 0x713a, 0x00c0, 0x463d, 0x703b, 0x0002,
++	0x2009, 0x0100, 0x2104, 0xa082, 0x0003, 0x00c8, 0x463d, 0x703c,
++	0xa086, 0x0001, 0x00c0, 0x461a, 0x0d7e, 0x2069, 0x0140, 0x6804,
++	0xa084, 0x4000, 0x0040, 0x45f8, 0x6803, 0x1000, 0x0078, 0x45ff,
++	0x6804, 0xa084, 0x1000, 0x0040, 0x45ff, 0x6803, 0x0100, 0x6803,
++	0x0000, 0x703f, 0x0000, 0x2069, 0x7936, 0x6804, 0xa082, 0x0006,
++	0x00c0, 0x460c, 0x6807, 0x0000, 0x6830, 0xa082, 0x0003, 0x00c0,
++	0x4613, 0x6833, 0x0000, 0x1078, 0x4d96, 0x1078, 0x4e56, 0x0d7f,
++	0x0078, 0x463d, 0x0d7e, 0x2069, 0x7700, 0x6944, 0x6860, 0xa102,
++	0x00c8, 0x463c, 0x2069, 0x7936, 0x6804, 0xa086, 0x0000, 0x00c0,
++	0x463c, 0x6830, 0xa086, 0x0000, 0x00c0, 0x463c, 0x703f, 0x0001,
++	0x6807, 0x0006, 0x6833, 0x0003, 0x2069, 0x0100, 0x6830, 0x689e,
++	0x2069, 0x0140, 0x6803, 0x0600, 0x0d7f, 0x0078, 0x4642, 0x127e,
++	0x2091, 0x8000, 0x7024, 0xa00d, 0x0040, 0x4653, 0x7020, 0x8001,
++	0x7022, 0x00c0, 0x4653, 0x7023, 0x0009, 0x8109, 0x7126, 0x00c0,
++	0x4653, 0x7028, 0x107a, 0x7030, 0xa00d, 0x0040, 0x4664, 0x702c,
++	0x8001, 0x702e, 0x00c0, 0x4664, 0x702f, 0x0009, 0x8109, 0x7132,
++	0x00c0, 0x4664, 0x7034, 0x107a, 0x7018, 0xa00d, 0x0040, 0x4675,
++	0x7008, 0x8001, 0x700a, 0x00c0, 0x4675, 0x700b, 0x0009, 0x8109,
++	0x711a, 0x00c0, 0x4675, 0x701c, 0x107a, 0x127f, 0x7004, 0x0079,
++	0x4679, 0x46a0, 0x46a1, 0x46bd, 0x0e7e, 0x2071, 0x7949, 0x7018,
++	0xa005, 0x00c0, 0x4687, 0x711a, 0x721e, 0x700b, 0x0009, 0x0e7f,
++	0x007c, 0x0e7e, 0x007e, 0x2071, 0x7949, 0x701c, 0xa206, 0x00c0,
++	0x4693, 0x701a, 0x701e, 0x007f, 0x0e7f, 0x007c, 0x0e7e, 0x2071,
++	0x7949, 0x6088, 0xa102, 0x0048, 0x469e, 0x618a, 0x0e7f, 0x007c,
++	0x007c, 0x7110, 0x1078, 0x384c, 0x00c0, 0x46b3, 0x6088, 0x8001,
++	0x0048, 0x46b3, 0x608a, 0x00c0, 0x46b3, 0x127e, 0x2091, 0x8000,
++	0x1078, 0x4d96, 0x127f, 0x8108, 0xa182, 0x00ff, 0x0048, 0x46bb,
++	0xa00e, 0x7007, 0x0002, 0x7112, 0x007c, 0x7014, 0x2060, 0x127e,
++	0x2091, 0x8000, 0x6014, 0xa005, 0x0040, 0x46ec, 0x8001, 0x6016,
++	0x00c0, 0x46ec, 0x611c, 0xa186, 0x0003, 0x0040, 0x46d3, 0xa186,
++	0x0006, 0x00c0, 0x46ea, 0x6010, 0x2068, 0x6854, 0xa08a, 0x199a,
++	0x0048, 0x46ea, 0xa082, 0x1999, 0x6856, 0xa08a, 0x199a, 0x0048,
++	0x46e3, 0x2001, 0x1999, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116,
++	0x0078, 0x46ec, 0x1078, 0x68e3, 0x127f, 0xac88, 0x0008, 0x7116,
++	0x2001, 0x7716, 0x2004, 0xa102, 0x0048, 0x46fa, 0x7017, 0x7e00,
++	0x7007, 0x0000, 0x007c, 0x0e7e, 0x2071, 0x7949, 0x7027, 0x07d0,
++	0x7023, 0x0009, 0x703b, 0x0002, 0x0e7f, 0x007c, 0x2001, 0x7952,
++	0x2003, 0x0000, 0x007c, 0x0e7e, 0x2071, 0x7949, 0x7033, 0x07d0,
++	0x702f, 0x0009, 0x0e7f, 0x007c, 0x2011, 0x7955, 0x2013, 0x0000,
++	0x007c, 0x0e7e, 0x2071, 0x7949, 0x711a, 0x721e, 0x700b, 0x0009,
++	0x0e7f, 0x007c, 0x0c7e, 0x2061, 0x79da, 0x0c7f, 0x007c, 0xa184,
++	0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x79da, 0x2060, 0x007c,
++	0x6854, 0xa08a, 0x199a, 0x0048, 0x4737, 0x2001, 0x1999, 0xa005,
++	0x00c0, 0x4747, 0x6944, 0x0c7e, 0x1078, 0x4727, 0x6014, 0x0c7f,
++	0xa005, 0x00c0, 0x474c, 0x2001, 0x001e, 0x0078, 0x474c, 0xa08e,
++	0xffff, 0x00c0, 0x474c, 0xa006, 0x8003, 0x800b, 0x810b, 0xa108,
++	0x6116, 0x684c, 0xa08c, 0x00c0, 0xa18e, 0x00c0, 0x0040, 0x4787,
++	0xd0b4, 0x00c0, 0x4763, 0xd0bc, 0x00c0, 0x4775, 0x2009, 0x0006,
++	0x1078, 0x47aa, 0x007c, 0xd0fc, 0x0040, 0x4770, 0xa084, 0x0003,
++	0xa08e, 0x0003, 0x0040, 0x47a3, 0xa08e, 0x0000, 0x00c0, 0x47a3,
++	0x2009, 0x0043, 0x1078, 0x5d41, 0x007c, 0xd0fc, 0x0040, 0x4782,
++	0xa084, 0x0003, 0xa08e, 0x0003, 0x0040, 0x47a3, 0xa08e, 0x0000,
++	0x00c0, 0x47a3, 0x2009, 0x0042, 0x1078, 0x5d41, 0x007c, 0xd0fc,
++	0x0040, 0x4799, 0xa084, 0x0003, 0xa08e, 0x0003, 0x0040, 0x47a3,
++	0xa08e, 0x0002, 0x0040, 0x479d, 0x2009, 0x0041, 0x1078, 0x5d41,
++	0x007c, 0x1078, 0x47a8, 0x0078, 0x4798, 0x2009, 0x0043, 0x1078,
++	0x5d41, 0x0078, 0x4798, 0x2009, 0x0004, 0x1078, 0x47aa, 0x007c,
++	0x2009, 0x0001, 0x6010, 0xa0ec, 0xf000, 0x0040, 0x47cf, 0x2068,
++	0x6952, 0x6800, 0x6012, 0xa186, 0x0001, 0x00c0, 0x47c9, 0x694c,
++	0xa18c, 0x8100, 0xa18e, 0x8100, 0x00c0, 0x47c9, 0x0c7e, 0x2009,
++	0x0000, 0x1078, 0x4727, 0x6204, 0x8210, 0x0048, 0x47c8, 0x6206,
++	0x0c7f, 0x1078, 0x3b92, 0x6010, 0xa06d, 0x10c0, 0x4730, 0x007c,
++	0x157e, 0x0c7e, 0x20a9, 0x0010, 0x2061, 0x79da, 0x6000, 0x81ff,
++	0x0040, 0x47dd, 0xa205, 0x0078, 0x47de, 0xa204, 0x6002, 0xace0,
++	0x0008, 0x00f0, 0x47d6, 0x0c7f, 0x157f, 0x007c, 0x6808, 0xa005,
++	0x0040, 0x47ee, 0x8001, 0x680a, 0xa085, 0x0001, 0x007c, 0x127e,
++	0x2091, 0x2200, 0x2079, 0x7936, 0x127f, 0x0d7e, 0x2069, 0x7936,
++	0x6803, 0x0005, 0x2069, 0x0004, 0x2d04, 0xa085, 0x8001, 0x206a,
++	0x0d7f, 0x007c, 0x0c7e, 0x6027, 0x0001, 0x7804, 0xa084, 0x0007,
++	0x0079, 0x480a, 0x4814, 0x4839, 0x4894, 0x481a, 0x4839, 0x4812,
++	0x4812, 0x4812, 0x1078, 0x12cd, 0x1078, 0x4706, 0x1078, 0x4d96,
++	0x0c7f, 0x007c, 0x62c0, 0x82ff, 0x00c0, 0x4820, 0x0c7f, 0x007c,
++	0x2011, 0x3558, 0x1078, 0x4689, 0x7828, 0xa092, 0x0002, 0x00c8,
++	0x482f, 0x8000, 0x782a, 0x1078, 0x3588, 0x0078, 0x481e, 0x1078,
++	0x3558, 0x7807, 0x0003, 0x7827, 0x0000, 0x782b, 0x0000, 0x0078,
++	0x481e, 0x1078, 0x4706, 0x3c00, 0x007e, 0x2011, 0x0209, 0x20e1,
++	0x4000, 0x2214, 0x007f, 0x20e0, 0x82ff, 0x0040, 0x4857, 0x62c0,
++	0x82ff, 0x00c0, 0x4857, 0x782b, 0x0000, 0x7824, 0xa065, 0x1040,
++	0x12cd, 0x2009, 0x0013, 0x1078, 0x5d41, 0x0c7f, 0x007c, 0x3900,
++	0xa082, 0x7a7a, 0x00c8, 0x485e, 0x1078, 0x5c44, 0x0c7e, 0x7824,
++	0xa065, 0x1040, 0x12cd, 0x7804, 0xa086, 0x0004, 0x0040, 0x48d9,
++	0x7828, 0xa092, 0x2710, 0x00c8, 0x4874, 0x8000, 0x782a, 0x0c7f,
++	0x1078, 0x568e, 0x0078, 0x4855, 0x6104, 0xa186, 0x0003, 0x00c0,
++	0x488b, 0x0e7e, 0x2071, 0x7700, 0x70c8, 0x0e7f, 0xd08c, 0x0040,
++	0x488b, 0x0c7e, 0x0e7e, 0x2061, 0x0100, 0x2071, 0x7700, 0x1078,
++	0x3591, 0x0e7f, 0x0c7f, 0x1078, 0x76c7, 0x2009, 0x0014, 0x1078,
++	0x5d41, 0x0c7f, 0x0078, 0x4855, 0x2001, 0x7952, 0x2003, 0x0000,
++	0x62c0, 0x82ff, 0x00c0, 0x48a8, 0x782b, 0x0000, 0x7824, 0xa065,
++	0x1040, 0x12cd, 0x2009, 0x0013, 0x1078, 0x5d8f, 0x0c7f, 0x007c,
++	0x0c7e, 0x0d7e, 0x3900, 0xa082, 0x7a7a, 0x00c8, 0x48b1, 0x1078,
++	0x5c44, 0x7824, 0xa005, 0x1040, 0x12cd, 0x781c, 0xa06d, 0x1040,
++	0x12cd, 0x6800, 0xc0dc, 0x6802, 0x7924, 0x2160, 0x1078, 0x5d1a,
++	0x693c, 0x81ff, 0x1040, 0x12cd, 0x8109, 0x693e, 0x6854, 0xa015,
++	0x0040, 0x48cd, 0x7a1e, 0x0078, 0x48cf, 0x7918, 0x791e, 0x7807,
++	0x0000, 0x7827, 0x0000, 0x0d7f, 0x0c7f, 0x1078, 0x4d96, 0x0078,
++	0x48a6, 0x6104, 0xa186, 0x0002, 0x0040, 0x48e4, 0xa186, 0x0004,
++	0x0040, 0x48e4, 0x0078, 0x4868, 0x7808, 0xac06, 0x0040, 0x4868,
++	0x1078, 0x4c9d, 0x1078, 0x498e, 0x0c7f, 0x1078, 0x4d96, 0x0078,
++	0x4855, 0x0c7e, 0x6027, 0x0002, 0x2011, 0x7955, 0x2013, 0x0000,
++	0x62c8, 0x82ff, 0x00c0, 0x490b, 0x62c4, 0x82ff, 0x00c0, 0x490b,
++	0x793c, 0xa1e5, 0x0000, 0x0040, 0x4909, 0x2009, 0x0049, 0x1078,
++	0x5d41, 0x0c7f, 0x007c, 0x3908, 0xa192, 0x7a7a, 0x00c8, 0x4912,
++	0x1078, 0x5c44, 0x6017, 0x0010, 0x793c, 0x81ff, 0x0040, 0x4909,
++	0x7944, 0xa192, 0x7530, 0x00c8, 0x4931, 0x8108, 0x7946, 0x1078,
++	0x470b, 0x793c, 0xa188, 0x0007, 0x210c, 0xa18e, 0x0006, 0x00c0,
++	0x492d, 0x6017, 0x0012, 0x0078, 0x4909, 0x6017, 0x0016, 0x0078,
++	0x4909, 0x037e, 0x2019, 0x0001, 0x1078, 0x5880, 0x037f, 0x1078,
++	0x76c7, 0x793c, 0x2160, 0x2009, 0x004a, 0x1078, 0x5d41, 0x0078,
++	0x4909, 0x007e, 0x017e, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x600f,
++	0x0000, 0x2c08, 0x2061, 0x7936, 0x6020, 0x8000, 0x6022, 0x6010,
++	0xa005, 0x0040, 0x495c, 0xa080, 0x0003, 0x2102, 0x6112, 0x127f,
++	0x0c7f, 0x017f, 0x007f, 0x007c, 0x6116, 0x6112, 0x0078, 0x4957,
++	0x0d7e, 0x2069, 0x7936, 0x6000, 0xd0d4, 0x0040, 0x4975, 0x6820,
++	0x8000, 0x6822, 0xa086, 0x0001, 0x00c0, 0x4970, 0x2c00, 0x681e,
++	0x6804, 0xa084, 0x0007, 0x0079, 0x4d9e, 0xc0d5, 0x6002, 0x6818,
++	0xa005, 0x0040, 0x4987, 0x6056, 0x605b, 0x0000, 0x007e, 0x2c00,
++	0x681a, 0x0d7f, 0x685a, 0x2069, 0x7936, 0x0078, 0x4967, 0x6056,
++	0x605a, 0x2c00, 0x681a, 0x681e, 0x0078, 0x4967, 0x007e, 0x017e,
++	0x0c7e, 0x127e, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061,
++	0x7936, 0x6020, 0x8000, 0x6022, 0x6008, 0xa005, 0x0040, 0x49a9,
++	0xa080, 0x0003, 0x2102, 0x610a, 0x127f, 0x0c7f, 0x017f, 0x007f,
++	0x007c, 0x610e, 0x610a, 0x0078, 0x49a4, 0x0c7e, 0x600f, 0x0000,
++	0x2c08, 0x2061, 0x7936, 0x6034, 0xa005, 0x0040, 0x49bd, 0xa080,
++	0x0003, 0x2102, 0x6136, 0x0c7f, 0x007c, 0x613a, 0x6136, 0x0078,
++	0x49bb, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x027e, 0x007e,
++	0x127e, 0x2071, 0x7936, 0x7638, 0x2660, 0x2678, 0x2091, 0x8000,
++	0x8cff, 0x0040, 0x4a23, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206,
++	0x00c0, 0x4a1e, 0x703c, 0xac06, 0x00c0, 0x49e3, 0x6003, 0x000a,
++	0x630a, 0x0078, 0x4a1e, 0x7038, 0xac36, 0x00c0, 0x49e9, 0x660c,
++	0x763a, 0x7034, 0xac36, 0x00c0, 0x49f7, 0x2c00, 0xaf36, 0x0040,
++	0x49f5, 0x2f00, 0x7036, 0x0078, 0x49f7, 0x7037, 0x0000, 0x660c,
++	0x067e, 0x2c00, 0xaf06, 0x0040, 0x4a00, 0x7e0e, 0x0078, 0x4a01,
++	0x2678, 0x600f, 0x0000, 0x1078, 0x6a58, 0x0040, 0x4a19, 0x6010,
++	0x2068, 0x601c, 0xa086, 0x0003, 0x00c0, 0x4a2c, 0x6837, 0x0103,
++	0x6b4a, 0x6847, 0x0000, 0x1078, 0x6c54, 0x1078, 0x3b92, 0x1078,
++	0x6ba9, 0x1078, 0x6bb6, 0x0c7f, 0x0078, 0x49d0, 0x2c78, 0x600c,
++	0x2060, 0x0078, 0x49d0, 0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f,
++	0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086, 0x0006, 0x00c0,
++	0x4a0e, 0x1078, 0x75fd, 0x0078, 0x4a19, 0x007e, 0x067e, 0x0c7e,
++	0x0d7e, 0x0f7e, 0x2031, 0x0000, 0x127e, 0x2091, 0x8000, 0x2079,
++	0x7936, 0x7838, 0xa065, 0x0040, 0x4a6c, 0x600c, 0x007e, 0x600f,
++	0x0000, 0x783c, 0xac06, 0x00c0, 0x4a53, 0x6003, 0x000a, 0x630a,
++	0x2c30, 0x0078, 0x4a69, 0x1078, 0x6a58, 0x0040, 0x4a67, 0x6010,
++	0x2068, 0x601c, 0xa086, 0x0003, 0x00c0, 0x4a75, 0x6837, 0x0103,
++	0x6b4a, 0x6847, 0x0000, 0x1078, 0x3b92, 0x1078, 0x6ba9, 0x1078,
++	0x6bb6, 0x007f, 0x0078, 0x4a42, 0x7e3a, 0x7e36, 0x127f, 0x0f7f,
++	0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c, 0x601c, 0xa086, 0x0006,
++	0x00c0, 0x4a5e, 0x1078, 0x75fd, 0x0078, 0x4a67, 0x027e, 0x1078,
++	0x4a92, 0x1078, 0x4b2b, 0x027f, 0x007c, 0x0f7e, 0x127e, 0x2079,
++	0x7936, 0x2091, 0x8000, 0x1078, 0x4bc2, 0x1078, 0x4c2a, 0x127f,
++	0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x007e,
++	0x127e, 0x2091, 0x8000, 0x2071, 0x7936, 0x7614, 0x2660, 0x2678,
++	0x8cff, 0x0040, 0x4b1a, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206,
++	0x00c0, 0x4b15, 0x7024, 0xac06, 0x00c0, 0x4ad8, 0x2069, 0x0100,
++	0x68c0, 0xa005, 0x0040, 0x4ad3, 0x1078, 0x569c, 0x68c3, 0x0000,
++	0x1078, 0x5b4a, 0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04,
++	0xa384, 0x1000, 0x0040, 0x4ac8, 0x6803, 0x0100, 0x6803, 0x0000,
++	0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x4ad0, 0x6827, 0x0001,
++	0x037f, 0x0078, 0x4ad8, 0x6003, 0x0009, 0x630a, 0x0078, 0x4b15,
++	0x7014, 0xac36, 0x00c0, 0x4ade, 0x660c, 0x7616, 0x7010, 0xac36,
++	0x00c0, 0x4aec, 0x2c00, 0xaf36, 0x0040, 0x4aea, 0x2f00, 0x7012,
++	0x0078, 0x4aec, 0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06,
++	0x0040, 0x4af5, 0x7e0e, 0x0078, 0x4af6, 0x2678, 0x600f, 0x0000,
++	0x6010, 0x2068, 0x1078, 0x6a58, 0x0040, 0x4b0e, 0x601c, 0xa086,
++	0x0003, 0x00c0, 0x4b22, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000,
++	0x1078, 0x6c54, 0x1078, 0x3b92, 0x1078, 0x6ba9, 0x1078, 0x6bb6,
++	0x1078, 0x5a1a, 0x0c7f, 0x0078, 0x4aa0, 0x2c78, 0x600c, 0x2060,
++	0x0078, 0x4aa0, 0x127f, 0x007f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f,
++	0x0f7f, 0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x4b03, 0x1078,
++	0x75fd, 0x0078, 0x4b0e, 0x0c7e, 0x007e, 0x127e, 0x2091, 0x8000,
++	0xa280, 0x7820, 0x2004, 0xa065, 0x0040, 0x4bbe, 0x0f7e, 0x0e7e,
++	0x0d7e, 0x067e, 0x2071, 0x7936, 0x6654, 0x7018, 0xac06, 0x00c0,
++	0x4b42, 0x761a, 0x701c, 0xac06, 0x00c0, 0x4b4e, 0x86ff, 0x00c0,
++	0x4b4d, 0x7018, 0x701e, 0x0078, 0x4b4e, 0x761e, 0x6058, 0xa07d,
++	0x0040, 0x4b53, 0x7e56, 0xa6ed, 0x0000, 0x0040, 0x4b59, 0x2f00,
++	0x685a, 0x6057, 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc,
++	0x6002, 0x1078, 0x37c5, 0x0040, 0x4bba, 0x7624, 0x86ff, 0x0040,
++	0x4baa, 0xa680, 0x0004, 0x2004, 0xad06, 0x00c0, 0x4baa, 0x0d7e,
++	0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x4ba1, 0x1078, 0x569c,
++	0x68c3, 0x0000, 0x1078, 0x5b4a, 0x7027, 0x0000, 0x037e, 0x2069,
++	0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x4b8a, 0x6803, 0x0100,
++	0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x4b92,
++	0x6827, 0x0001, 0x037f, 0x0d7f, 0x0c7e, 0x603c, 0xa005, 0x0040,
++	0x4b9b, 0x8001, 0x603e, 0x2660, 0x1078, 0x6bb6, 0x0c7f, 0x0078,
++	0x4baa, 0x0d7f, 0x0c7e, 0x2660, 0x6003, 0x0009, 0x630a, 0x0c7f,
++	0x0078, 0x4b61, 0x8dff, 0x0040, 0x4bb6, 0x6837, 0x0103, 0x6b4a,
++	0x6847, 0x0000, 0x1078, 0x6c54, 0x1078, 0x3b92, 0x1078, 0x5a1a,
++	0x0078, 0x4b61, 0x067f, 0x0d7f, 0x0e7f, 0x0f7f, 0x127f, 0x007f,
++	0x0c7f, 0x007c, 0x007e, 0x067e, 0x0c7e, 0x0d7e, 0x2031, 0x0000,
++	0x7814, 0xa065, 0x0040, 0x4c1a, 0x600c, 0x007e, 0x600f, 0x0000,
++	0x7824, 0xac06, 0x00c0, 0x4bff, 0x2069, 0x0100, 0x68c0, 0xa005,
++	0x0040, 0x4bf9, 0x1078, 0x569c, 0x68c3, 0x0000, 0x1078, 0x5b4a,
++	0x7827, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000,
++	0x0040, 0x4bee, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
++	0x6824, 0xd084, 0x0040, 0x4bf6, 0x6827, 0x0001, 0x037f, 0x0078,
++	0x4bff, 0x6003, 0x0009, 0x630a, 0x2c30, 0x0078, 0x4c17, 0x6010,
++	0x2068, 0x1078, 0x6a58, 0x0040, 0x4c13, 0x601c, 0xa086, 0x0003,
++	0x00c0, 0x4c21, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078,
++	0x3b92, 0x1078, 0x6ba9, 0x1078, 0x6bb6, 0x1078, 0x5a1a, 0x007f,
++	0x0078, 0x4bc9, 0x7e16, 0x7e12, 0x0d7f, 0x0c7f, 0x067f, 0x007f,
++	0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x4c0a, 0x1078, 0x75fd,
++	0x0078, 0x4c13, 0x007e, 0x067e, 0x0c7e, 0x0d7e, 0x7818, 0xa065,
++	0x0040, 0x4c96, 0x6054, 0x007e, 0x6057, 0x0000, 0x605b, 0x0000,
++	0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x1078, 0x37c5, 0x0040, 0x4c93,
++	0x7e24, 0x86ff, 0x0040, 0x4c85, 0xa680, 0x0004, 0x2004, 0xad06,
++	0x00c0, 0x4c85, 0x0d7e, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0040,
++	0x4c7c, 0x1078, 0x569c, 0x68c3, 0x0000, 0x1078, 0x5b4a, 0x7827,
++	0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040,
++	0x4c65, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824,
++	0xd084, 0x0040, 0x4c6d, 0x6827, 0x0001, 0x037f, 0x0d7f, 0x0c7e,
++	0x603c, 0xa005, 0x0040, 0x4c76, 0x8001, 0x603e, 0x2660, 0x1078,
++	0x6bb6, 0x0c7f, 0x0078, 0x4c85, 0x0d7f, 0x0c7e, 0x2660, 0x6003,
++	0x0009, 0x630a, 0x0c7f, 0x0078, 0x4c3c, 0x8dff, 0x0040, 0x4c8f,
++	0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x3b92, 0x1078,
++	0x5a1a, 0x0078, 0x4c3c, 0x007f, 0x0078, 0x4c2f, 0x781e, 0x781a,
++	0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c, 0x0e7e, 0x0c7e, 0x2071,
++	0x7936, 0x7004, 0xa084, 0x0007, 0x0079, 0x4ca6, 0x4cb0, 0x4cb3,
++	0x4ccc, 0x4ce8, 0x4d2d, 0x4cb0, 0x4cb0, 0x4cae, 0x1078, 0x12cd,
++	0x0c7f, 0x0e7f, 0x007c, 0x7024, 0xa065, 0x0040, 0x4cc1, 0x7020,
++	0x8001, 0x7022, 0x600c, 0xa015, 0x0040, 0x4cc8, 0x7216, 0x600f,
++	0x0000, 0x7007, 0x0000, 0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c,
++	0x7216, 0x7212, 0x0078, 0x4cc1, 0x6018, 0x2060, 0x1078, 0x37c5,
++	0x6000, 0xc0dc, 0x6002, 0x7020, 0x8001, 0x7022, 0x0040, 0x4cdd,
++	0x6054, 0xa015, 0x0040, 0x4ce4, 0x721e, 0x7007, 0x0000, 0x7027,
++	0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x7218, 0x721e, 0x0078, 0x4cdd,
++	0x7024, 0xa065, 0x0040, 0x4d2a, 0x700c, 0xac06, 0x00c0, 0x4cff,
++	0x1078, 0x5a1a, 0x600c, 0xa015, 0x0040, 0x4cfb, 0x720e, 0x600f,
++	0x0000, 0x0078, 0x4d28, 0x720e, 0x720a, 0x0078, 0x4d28, 0x7014,
++	0xac06, 0x00c0, 0x4d12, 0x1078, 0x5a1a, 0x600c, 0xa015, 0x0040,
++	0x4d0e, 0x7216, 0x600f, 0x0000, 0x0078, 0x4d28, 0x7216, 0x7212,
++	0x0078, 0x4d28, 0x6018, 0x2060, 0x1078, 0x37c5, 0x6000, 0xc0dc,
++	0x6002, 0x1078, 0x5a1a, 0x701c, 0xa065, 0x0040, 0x4d28, 0x6054,
++	0xa015, 0x0040, 0x4d26, 0x721e, 0x0078, 0x4d28, 0x7218, 0x721e,
++	0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x7024, 0xa065, 0x0040,
++	0x4d3a, 0x1078, 0x5a1a, 0x600c, 0xa015, 0x0040, 0x4d41, 0x720e,
++	0x600f, 0x0000, 0x1078, 0x5b4a, 0x7027, 0x0000, 0x0c7f, 0x0e7f,
++	0x007c, 0x720e, 0x720a, 0x0078, 0x4d3a, 0x0d7e, 0x2069, 0x7936,
++	0x6830, 0xa084, 0x0003, 0x0079, 0x4d4d, 0x4d53, 0x4d55, 0x4d7b,
++	0x4d53, 0x1078, 0x12cd, 0x0d7f, 0x007c, 0x0c7e, 0x6840, 0xa086,
++	0x0001, 0x0040, 0x4d71, 0x683c, 0xa065, 0x0040, 0x4d66, 0x600c,
++	0xa015, 0x0040, 0x4d6d, 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000,
++	0x683f, 0x0000, 0x0c7f, 0x0d7f, 0x007c, 0x683a, 0x6836, 0x0078,
++	0x4d66, 0x6843, 0x0000, 0x6838, 0xa065, 0x0040, 0x4d66, 0x6003,
++	0x0003, 0x0078, 0x4d66, 0x0c7e, 0x6843, 0x0000, 0x6847, 0x0000,
++	0x683c, 0xa065, 0x0040, 0x4d93, 0x600c, 0xa015, 0x0040, 0x4d8f,
++	0x6a3a, 0x600f, 0x0000, 0x683f, 0x0000, 0x0078, 0x4d93, 0x683f,
++	0x0000, 0x683a, 0x6836, 0x0c7f, 0x0d7f, 0x007c, 0x0d7e, 0x2069,
++	0x7936, 0x6804, 0xa084, 0x0007, 0x0079, 0x4d9e, 0x4da8, 0x4e45,
++	0x4e45, 0x4e45, 0x4e45, 0x4e47, 0x4e45, 0x4da6, 0x1078, 0x12cd,
++	0x6820, 0xa005, 0x00c0, 0x4dae, 0x0d7f, 0x007c, 0x0c7e, 0x680c,
++	0xa065, 0x0040, 0x4dbd, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000,
++	0x1078, 0x4e8d, 0x0c7f, 0x0d7f, 0x007c, 0x6814, 0xa065, 0x0040,
++	0x4dcb, 0x6807, 0x0001, 0x6826, 0x682b, 0x0000, 0x1078, 0x4e8d,
++	0x0c7f, 0x0d7f, 0x007c, 0x0e7e, 0x037e, 0x6a1c, 0xa2f5, 0x0000,
++	0x0040, 0x4e40, 0x704c, 0xa00d, 0x0040, 0x4dda, 0x7088, 0xa005,
++	0x0040, 0x4df2, 0x7054, 0xa075, 0x0040, 0x4de3, 0xa20e, 0x0040,
++	0x4e40, 0x0078, 0x4de8, 0x6818, 0xa20e, 0x0040, 0x4e40, 0x2070,
++	0x704c, 0xa00d, 0x0040, 0x4dda, 0x7088, 0xa005, 0x00c0, 0x4dda,
++	0x2e00, 0x681e, 0x733c, 0x7038, 0xa302, 0x00c8, 0x4dda, 0x1078,
++	0x5ce9, 0x0040, 0x4e40, 0x8318, 0x733e, 0x6112, 0x2e10, 0x621a,
++	0xa180, 0x0015, 0x2004, 0xa08a, 0x199a, 0x0048, 0x4e09, 0x2001,
++	0x1999, 0x8003, 0x801b, 0x831b, 0xa318, 0x6316, 0x037f, 0x0f7e,
++	0x2c78, 0x71a0, 0xd1bc, 0x0040, 0x4e22, 0x7100, 0xd1f4, 0x0040,
++	0x4e1e, 0x7114, 0xa18c, 0x00ff, 0x0078, 0x4e27, 0x2009, 0x0000,
++	0x0078, 0x4e27, 0xa1e0, 0x2329, 0x2c0c, 0xa18c, 0x00ff, 0x2061,
++	0x0100, 0x619a, 0x1078, 0x52de, 0x7300, 0xc3dd, 0x7302, 0x6807,
++	0x0002, 0x2f18, 0x6b26, 0x682b, 0x0000, 0x781f, 0x0003, 0x7803,
++	0x0001, 0x7807, 0x0040, 0x0f7f, 0x0e7f, 0x0c7f, 0x0d7f, 0x007c,
++	0x037f, 0x0e7f, 0x0c7f, 0x0078, 0x4e3e, 0x0d7f, 0x007c, 0x0c7e,
++	0x680c, 0xa065, 0x0040, 0x4e53, 0x6807, 0x0004, 0x6826, 0x682b,
++	0x0000, 0x1078, 0x4e8d, 0x0c7f, 0x0d7f, 0x007c, 0x0f7e, 0x0d7e,
++	0x2069, 0x7936, 0x6830, 0xa086, 0x0000, 0x00c0, 0x4e74, 0x6838,
++	0xa07d, 0x0040, 0x4e74, 0x6833, 0x0001, 0x683e, 0x6847, 0x0000,
++	0x127e, 0x0f7e, 0x2091, 0x2200, 0x027f, 0x1078, 0x1a44, 0x00c0,
++	0x4e77, 0x127f, 0x1078, 0x5571, 0x0d7f, 0x0f7f, 0x007c, 0x127f,
++	0x6843, 0x0000, 0x7803, 0x0002, 0x780c, 0xa015, 0x0040, 0x4e89,
++	0x6a3a, 0x780f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x0078,
++	0x4e74, 0x683a, 0x6836, 0x0078, 0x4e83, 0x601c, 0xa084, 0x000f,
++	0x1079, 0x4e93, 0x007c, 0x4e9c, 0x4ea1, 0x51a8, 0x529e, 0x4ea1,
++	0x51a8, 0x529e, 0x4e9c, 0x4ea1, 0x1078, 0x4c9d, 0x1078, 0x4d96,
++	0x007c, 0x157e, 0x137e, 0x147e, 0x0c7e, 0x0f7e, 0x6004, 0xa08a,
++	0x0030, 0x10c8, 0x12cd, 0x6118, 0x2178, 0x79a0, 0xd1bc, 0x0040,
++	0x4ebe, 0x7900, 0xd1f4, 0x0040, 0x4eba, 0x7914, 0xa18c, 0x00ff,
++	0x0078, 0x4ec3, 0x2009, 0x0000, 0x0078, 0x4ec3, 0xa1f8, 0x2329,
++	0x2f0c, 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0x1079,
++	0x4ecf, 0x0f7f, 0x0c7f, 0x147f, 0x137f, 0x157f, 0x007c, 0x4f01,
++	0x4f39, 0x4f51, 0x4fd0, 0x4ffd, 0x5005, 0x5026, 0x5037, 0x5048,
++	0x5050, 0x5061, 0x5050, 0x50a9, 0x5037, 0x50ca, 0x50d2, 0x5048,
++	0x50d2, 0x50e3, 0x4eff, 0x4eff, 0x4eff, 0x4eff, 0x4eff, 0x4eff,
++	0x4eff, 0x4eff, 0x4eff, 0x4eff, 0x4eff, 0x4eff, 0x5758, 0x576d,
++	0x5790, 0x57b4, 0x5026, 0x4eff, 0x5026, 0x5050, 0x4eff, 0x4f51,
++	0x4fd0, 0x4eff, 0x5c64, 0x5050, 0x4eff, 0x5c87, 0x5050, 0x1078,
++	0x12cd, 0x20a1, 0x020b, 0x1078, 0x50f8, 0x20a3, 0x5200, 0x20a3,
++	0x0000, 0x0d7e, 0x2069, 0x7751, 0x6804, 0xd084, 0x0040, 0x4f1b,
++	0x6828, 0x20a3, 0x0000, 0x017e, 0x1078, 0x2094, 0x21a2, 0x017f,
++	0x0d7f, 0x0078, 0x4f20, 0x0d7f, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x20a9, 0x0004, 0x2099, 0x7705, 0x53a6, 0x20a9, 0x0004, 0x2099,
++	0x7701, 0x53a6, 0x20a3, 0x0000, 0x6030, 0xa084, 0x00ff, 0x20a2,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x1078, 0x5688,
++	0x007c, 0x20a1, 0x020b, 0x1078, 0x50f8, 0x20a3, 0x0500, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x6030, 0xa084, 0x00ff, 0x20a2, 0x20a9,
++	0x0004, 0x2099, 0x7705, 0x53a6, 0x60c3, 0x0010, 0x1078, 0x5688,
++	0x007c, 0x20a1, 0x020b, 0x1078, 0x50f8, 0x7818, 0xa080, 0x0028,
++	0x2004, 0xa086, 0x007e, 0x00c0, 0x4f64, 0x20a3, 0x0400, 0x620c,
++	0xc2b4, 0x620e, 0x0078, 0x4f66, 0x20a3, 0x0300, 0x20a3, 0x0000,
++	0x7818, 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x00c0, 0x4f9f,
++	0x2099, 0x7920, 0x33a6, 0x9398, 0x33a6, 0x9398, 0x3304, 0xa084,
++	0x3fff, 0x20a2, 0x9398, 0x33a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, 0x7705,
++	0x53a6, 0x20a9, 0x0004, 0x2099, 0x7701, 0x53a6, 0x20a9, 0x0010,
++	0x20a3, 0x0000, 0x00f0, 0x4f90, 0x2099, 0x7928, 0x33a6, 0x20a9,
++	0x0007, 0x20a3, 0x0000, 0x00f0, 0x4f99, 0x0078, 0x4fbf, 0x2099,
++	0x7920, 0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0004, 0x2099, 0x7705,
++	0x53a6, 0x20a9, 0x0004, 0x2099, 0x7701, 0x53a6, 0x20a9, 0x0008,
++	0x20a3, 0x0000, 0x00f0, 0x4fb0, 0x20a9, 0x0008, 0x20a3, 0x0000,
++	0x00f0, 0x4fb6, 0x2099, 0x7928, 0x20a9, 0x0008, 0x53a6, 0x20a9,
++	0x0008, 0x20a3, 0x0000, 0x00f0, 0x4fc1, 0x20a9, 0x000a, 0x20a3,
++	0x0000, 0x00f0, 0x4fc7, 0x60c3, 0x0074, 0x1078, 0x5688, 0x007c,
++	0x20a1, 0x020b, 0x1078, 0x50f8, 0x20a3, 0x2010, 0x20a3, 0x0014,
++	0x20a3, 0x0800, 0x20a3, 0x2000, 0xa006, 0x20a2, 0x20a2, 0x20a2,
++	0x20a2, 0x20a2, 0x0f7e, 0x2079, 0x7751, 0x7904, 0x0f7f, 0xd1ac,
++	0x00c0, 0x4fec, 0xa085, 0x0020, 0xd1a4, 0x0040, 0x4ff1, 0xa085,
++	0x0010, 0xa085, 0x0002, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x0014, 0x1078, 0x5688, 0x007c, 0x20a1, 0x020b, 0x1078,
++	0x50f8, 0x20a3, 0x5000, 0x0078, 0x4f66, 0x20a1, 0x020b, 0x1078,
++	0x50f8, 0x20a3, 0x2110, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x60c3, 0x0014, 0x1078, 0x5688, 0x007c, 0x20a1, 0x020b,
++	0x1078, 0x516f, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x60c3, 0x0004, 0x1078, 0x5688, 0x007c, 0x20a1,
++	0x020b, 0x1078, 0x516f, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3,
++	0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008, 0x1078, 0x5688, 0x007c,
++	0x20a1, 0x020b, 0x1078, 0x516f, 0x20a3, 0x0200, 0x0078, 0x4f66,
++	0x20a1, 0x020b, 0x1078, 0x516f, 0x20a3, 0x0100, 0x20a3, 0x0000,
++	0x20a3, 0x0003, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x5688,
++	0x007c, 0x0d7e, 0x20a1, 0x020b, 0x1078, 0x516f, 0x20a3, 0x0210,
++	0x20a3, 0x0014, 0x20a3, 0x0800, 0x7818, 0x2068, 0x6894, 0xa086,
++	0x0014, 0x00c0, 0x5087, 0x6998, 0xa184, 0xc000, 0x00c0, 0x5083,
++	0xd1ec, 0x0040, 0x507f, 0x20a3, 0x2100, 0x0078, 0x5089, 0x20a3,
++	0x0100, 0x0078, 0x5089, 0x20a3, 0x0400, 0x0078, 0x5089, 0x20a3,
++	0x0700, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x0f7e,
++	0x2079, 0x7751, 0x7904, 0x0f7f, 0xd1ac, 0x00c0, 0x5099, 0xa085,
++	0x0020, 0xd1a4, 0x0040, 0x509e, 0xa085, 0x0010, 0xa085, 0x0002,
++	0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x0014, 0x1078, 0x5688, 0x0d7f,
++	0x007c, 0x20a1, 0x020b, 0x1078, 0x516f, 0x20a3, 0x0210, 0x20a3,
++	0x0014, 0x20a3, 0x0000, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
++	0x5688, 0x007c, 0x20a1, 0x020b, 0x1078, 0x516f, 0x20a3, 0x0200,
++	0x0078, 0x4f07, 0x20a1, 0x020b, 0x1078, 0x516f, 0x20a3, 0x0100,
++	0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008,
++	0x1078, 0x5688, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a1,
++	0x020b, 0x1078, 0x516f, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3,
++	0x000b, 0x20a3, 0x0000, 0x60c3, 0x0008, 0x1078, 0x5688, 0x007c,
++	0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++	0x2014, 0xa286, 0x007e, 0x00c0, 0x510b, 0x20a3, 0x22ff, 0x20a3,
++	0xfffe, 0x0078, 0x5139, 0xa286, 0x007f, 0x00c0, 0x5116, 0x0d7e,
++	0x20a3, 0x22ff, 0x20a3, 0xfffd, 0x0078, 0x512d, 0xd2bc, 0x0040,
++	0x5135, 0xa286, 0x0080, 0x0d7e, 0x00c0, 0x5124, 0x20a3, 0x22ff,
++	0x20a3, 0xfffc, 0x0078, 0x512d, 0xa2e8, 0x7820, 0x2d6c, 0x6810,
++	0xa085, 0x2200, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x7719, 0x2da6,
++	0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x513d, 0x20a3, 0x2200, 0x6298,
++	0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0129, 0x20a3,
++	0x0000, 0x1078, 0x5677, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3,
++	0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x027e,
++	0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3, 0x02ff, 0x2011, 0xfffc,
++	0x22a2, 0x0d7e, 0x2069, 0x7719, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
++	0x20a3, 0x2029, 0x20a3, 0x0000, 0x0078, 0x5141, 0x20a3, 0x0100,
++	0x20a3, 0x0000, 0x20a3, 0xfc02, 0x20a3, 0x0000, 0x007c, 0x027e,
++	0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004,
++	0xa092, 0x007e, 0x0048, 0x518e, 0x0d7e, 0xa0e8, 0x7820, 0x2d6c,
++	0x6810, 0xa085, 0x2300, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x7719,
++	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x5196, 0x20a3, 0x2300,
++	0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0198,
++	0x20a3, 0x0000, 0x1078, 0x5677, 0x22a2, 0x20a3, 0x0000, 0x7a08,
++	0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c,
++	0x0c7e, 0x0f7e, 0x6004, 0xa08a, 0x0085, 0x1048, 0x12cd, 0xa08a,
++	0x008c, 0x10c8, 0x12cd, 0x6118, 0x2178, 0x79a0, 0xd1bc, 0x0040,
++	0x51c6, 0x7900, 0xd1f4, 0x0040, 0x51c2, 0x7914, 0xa18c, 0x00ff,
++	0x0078, 0x51cb, 0x2009, 0x0000, 0x0078, 0x51cb, 0xa1f8, 0x2329,
++	0x2f0c, 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0xa082,
++	0x0085, 0x1079, 0x51d6, 0x0f7f, 0x0c7f, 0x007c, 0x51df, 0x51ea,
++	0x5204, 0x51dd, 0x51dd, 0x51dd, 0x51df, 0x1078, 0x12cd, 0x147e,
++	0x20a1, 0x020b, 0x1078, 0x5217, 0x60c3, 0x0000, 0x1078, 0x5688,
++	0x147f, 0x007c, 0x147e, 0x20a1, 0x020b, 0x1078, 0x5244, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x2fa2, 0x20a3, 0x0000,
++	0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x000c,
++	0x1078, 0x5688, 0x147f, 0x007c, 0x147e, 0x20a1, 0x020b, 0x1078,
++	0x5271, 0x20a3, 0x0003, 0x20a3, 0x0300, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x60c3, 0x0004, 0x1078, 0x5688, 0x147f, 0x007c, 0x027e,
++	0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004,
++	0xa092, 0x007e, 0x0048, 0x5236, 0x0d7e, 0xa0e8, 0x7820, 0x2d6c,
++	0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x7719,
++	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x523e, 0x20a3, 0x8100,
++	0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0009,
++	0x20a3, 0x0000, 0x0078, 0x5141, 0x027e, 0x20e1, 0x9080, 0x20e1,
++	0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa092, 0x007e, 0x0048,
++	0x5263, 0x0d7e, 0xa0e8, 0x7820, 0x2d6c, 0x6810, 0xa085, 0x8400,
++	0x20a2, 0x6814, 0x20a2, 0x2069, 0x7719, 0x2da6, 0x8d68, 0x2da6,
++	0x0d7f, 0x0078, 0x526b, 0x20a3, 0x8400, 0x6298, 0x22a2, 0x20a3,
++	0x0000, 0x6230, 0x22a2, 0x20a3, 0x00d1, 0x20a3, 0x0000, 0x0078,
++	0x519a, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080,
++	0x0028, 0x2004, 0xa092, 0x007e, 0x0048, 0x5290, 0x0d7e, 0xa0e8,
++	0x7820, 0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2,
++	0x2069, 0x7719, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x5298,
++	0x20a3, 0x8500, 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2,
++	0x20a3, 0x00d1, 0x20a3, 0x0000, 0x0078, 0x519a, 0x0c7e, 0x0f7e,
++	0x2c78, 0x7804, 0xa08a, 0x0040, 0x1048, 0x12cd, 0xa08a, 0x0050,
++	0x10c8, 0x12cd, 0x7918, 0x2160, 0x61a0, 0xd1bc, 0x0040, 0x52bd,
++	0x6100, 0xd1f4, 0x0040, 0x52b9, 0x6114, 0xa18c, 0x00ff, 0x0078,
++	0x52c2, 0x2009, 0x0000, 0x0078, 0x52c2, 0xa1e0, 0x2329, 0x2c0c,
++	0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0xa082, 0x0040, 0x1079,
++	0x52cc, 0x0f7f, 0x0c7f, 0x007c, 0x52de, 0x53c4, 0x536c, 0x54ec,
++	0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x5933,
++	0x5944, 0x5955, 0x5966, 0x52dc, 0x1078, 0x12cd, 0x0d7e, 0x157e,
++	0x147e, 0x20a1, 0x020b, 0x1078, 0x532f, 0x7910, 0x2168, 0x6948,
++	0x21a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x694c, 0xa184, 0x0006,
++	0x8004, 0x20a2, 0xd1ac, 0x0040, 0x52f9, 0x20a3, 0x0002, 0x0078,
++	0x5305, 0xd1b4, 0x0040, 0x5300, 0x20a3, 0x0001, 0x0078, 0x5305,
++	0x20a3, 0x0000, 0x2230, 0x0078, 0x5307, 0x6a80, 0x6e7c, 0x20a9,
++	0x0008, 0xad80, 0x0017, 0x200c, 0x810f, 0x21a2, 0x8000, 0x00f0,
++	0x530b, 0x22a2, 0x26a2, 0x60c3, 0x0020, 0x20e1, 0x9080, 0x6014,
++	0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x2001, 0x7952, 0x2003,
++	0x07d0, 0x2001, 0x7951, 0x2003, 0x0009, 0x2001, 0x7957, 0x2003,
++	0x0002, 0x1078, 0x14fc, 0x147f, 0x157f, 0x0d7f, 0x007c, 0x20e1,
++	0x9080, 0x20e1, 0x4000, 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210,
++	0xa294, 0x00ff, 0x2202, 0x8217, 0x7818, 0xa080, 0x0028, 0x2004,
++	0xd0bc, 0x0040, 0x5355, 0x0d7e, 0xa0e8, 0x7820, 0x2d6c, 0x6810,
++	0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x7719, 0x2da6,
++	0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x535d, 0x20a3, 0x0600, 0x6198,
++	0x21a2, 0x20a3, 0x0000, 0x6130, 0x21a2, 0x20a3, 0x0829, 0x20a3,
++	0x0000, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e,
++	0x20a1, 0x020b, 0x1078, 0x538c, 0x7810, 0x2068, 0x6860, 0x20a2,
++	0x685c, 0x20a2, 0x6880, 0x20a2, 0x687c, 0x20a2, 0xa006, 0x20a2,
++	0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x000c, 0x1078, 0x5688, 0x147f,
++	0x137f, 0x157f, 0x0d7f, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1,
++	0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x53aa,
++	0x0d7e, 0xa0e8, 0x7820, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2,
++	0x6814, 0x20a2, 0x2069, 0x7719, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
++	0x0078, 0x53b2, 0x20a3, 0x0500, 0x6298, 0x22a2, 0x20a3, 0x0000,
++	0x6230, 0x22a2, 0x20a3, 0x0889, 0x20a3, 0x0000, 0x1078, 0x5677,
++	0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x027f, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e,
++	0x20a1, 0x020b, 0x1078, 0x54b4, 0x7810, 0x2068, 0xa016, 0x22a2,
++	0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x7810, 0xa084, 0xf000, 0x00c0,
++	0x53e1, 0x7810, 0xa084, 0x0700, 0x8007, 0x1079, 0x53e9, 0x0078,
++	0x53e4, 0xa006, 0x1079, 0x53e9, 0x147f, 0x137f, 0x157f, 0x0d7f,
++	0x007c, 0x53f3, 0x5455, 0x5459, 0x547c, 0x5489, 0x549b, 0x549f,
++	0x53f1, 0x1078, 0x12cd, 0x017e, 0x037e, 0x694c, 0xa18c, 0x0003,
++	0xa186, 0x0000, 0x00c0, 0x5406, 0x6b78, 0x23a2, 0x6868, 0x20a2,
++	0x6864, 0x20a2, 0x037f, 0x017f, 0x0078, 0x5480, 0xa186, 0x0001,
++	0x00c0, 0x5450, 0x6b78, 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2,
++	0x22a2, 0x6874, 0x20a2, 0x22a2, 0x687c, 0x20a2, 0x2009, 0x0018,
++	0xa384, 0x0300, 0x0040, 0x544f, 0xd3c4, 0x0040, 0x5421, 0x687c,
++	0xa108, 0xd3cc, 0x0040, 0x5426, 0x6874, 0xa108, 0x157e, 0x20a9,
++	0x000d, 0xad80, 0x0020, 0x201c, 0x831f, 0x23a2, 0x8000, 0x00f0,
++	0x542b, 0x157f, 0x22a2, 0x22a2, 0x22a2, 0xa184, 0x0003, 0x0040,
++	0x544f, 0x20a1, 0x020b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3,
++	0x0700, 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3,
++	0x0898, 0x20a2, 0x1078, 0x5677, 0x22a2, 0x20a3, 0x0000, 0x61c2,
++	0x037f, 0x017f, 0x1078, 0x5688, 0x007c, 0x20a3, 0x0008, 0x0078,
++	0x547e, 0x20a3, 0x0302, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0012,
++	0x22a2, 0x20a3, 0x0008, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3,
++	0x7000, 0x20a3, 0x0500, 0x22a2, 0x20a3, 0x000a, 0x22a2, 0x22a2,
++	0x20a3, 0x2500, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3,
++	0x0032, 0x1078, 0x5688, 0x007c, 0x20a3, 0x0028, 0x22a2, 0x22a2,
++	0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0018, 0x1078, 0x5688,
++	0x007c, 0x20a3, 0x0100, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2,
++	0x20a3, 0x0008, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0020,
++	0x1078, 0x5688, 0x007c, 0x20a3, 0x0008, 0x0078, 0x547e, 0x037e,
++	0x7b10, 0xa384, 0xff00, 0x7812, 0xa384, 0x00ff, 0x8001, 0x00c0,
++	0x54ad, 0x22a2, 0x037f, 0x0078, 0x547e, 0x20a3, 0x0800, 0x22a2,
++	0x20a2, 0x037f, 0x0078, 0x5480, 0x027e, 0x20e1, 0x9080, 0x20e1,
++	0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x54d2,
++	0x0d7e, 0xa0e8, 0x7820, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2,
++	0x6814, 0x20a2, 0x2069, 0x7719, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
++	0x0078, 0x54da, 0x20a3, 0x0700, 0x6298, 0x22a2, 0x20a3, 0x0000,
++	0x6230, 0x22a2, 0x20a3, 0x0898, 0x20a3, 0x0000, 0x1078, 0x5677,
++	0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x027f, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e,
++	0x017e, 0x037e, 0x7810, 0xa084, 0x0700, 0x8007, 0x1079, 0x54ff,
++	0x037f, 0x017f, 0x147f, 0x137f, 0x157f, 0x0d7f, 0x007c, 0x5507,
++	0x5507, 0x5509, 0x5507, 0x5507, 0x5507, 0x552e, 0x5507, 0x1078,
++	0x12cd, 0x7910, 0xa18c, 0xf8ff, 0xa18d, 0x0600, 0x7912, 0x20a1,
++	0x020b, 0x2009, 0x0003, 0x1078, 0x5538, 0x0d7e, 0x2069, 0x7751,
++	0x6804, 0xd0bc, 0x0040, 0x5523, 0x682c, 0xa084, 0x00ff, 0x8007,
++	0x20a2, 0x0078, 0x5525, 0x20a3, 0x3f00, 0x0d7f, 0x22a2, 0x22a2,
++	0x22a2, 0x60c3, 0x0001, 0x1078, 0x5688, 0x007c, 0x20a1, 0x020b,
++	0x2009, 0x0003, 0x1078, 0x5538, 0x20a3, 0x7f00, 0x0078, 0x5526,
++	0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++	0x2004, 0xd0bc, 0x0040, 0x5556, 0x0d7e, 0xa0e8, 0x7820, 0x2d6c,
++	0x6810, 0xa085, 0x0100, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x7719,
++	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x555e, 0x20a3, 0x0100,
++	0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0888,
++	0xa18d, 0x0008, 0x21a2, 0x1078, 0x5677, 0x22a2, 0x20a3, 0x0000,
++	0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f,
++	0x007c, 0x0e7e, 0x0d7e, 0x0c7e, 0x057e, 0x047e, 0x037e, 0x2061,
++	0x0100, 0x2071, 0x7700, 0x6130, 0x7818, 0x2068, 0x68a0, 0x2028,
++	0xd0bc, 0x00c0, 0x558a, 0xa080, 0x2329, 0x2014, 0xa294, 0x00ff,
++	0x0078, 0x558e, 0x6910, 0x6a14, 0x7364, 0x7468, 0x781c, 0xa086,
++	0x0006, 0x0040, 0x55e2, 0xd5bc, 0x0040, 0x559e, 0xa185, 0x0100,
++	0x6062, 0x6266, 0x636a, 0x646e, 0x0078, 0x55a4, 0x6063, 0x0100,
++	0x6266, 0x606b, 0x0000, 0x616e, 0x6073, 0x0809, 0x6077, 0x0008,
++	0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f,
++	0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, 0x7810, 0x2070, 0x7014,
++	0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008, 0x60ca, 0x686c,
++	0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xa582,
++	0x0080, 0x0048, 0x55d6, 0x6a00, 0xd2f4, 0x0040, 0x55d4, 0x6a14,
++	0xa294, 0x00ff, 0x0078, 0x55d6, 0x2011, 0x0000, 0x629e, 0x6017,
++	0x0016, 0x1078, 0x470b, 0x037f, 0x047f, 0x057f, 0x0c7f, 0x0d7f,
++	0x0e7f, 0x007c, 0x7810, 0x2070, 0x704c, 0xa084, 0x0003, 0xa086,
++	0x0002, 0x0040, 0x5631, 0xd5bc, 0x0040, 0x55f6, 0xa185, 0x0100,
++	0x6062, 0x6266, 0x636a, 0x646e, 0x0078, 0x55fc, 0x6063, 0x0100,
++	0x6266, 0x606b, 0x0000, 0x616e, 0x6073, 0x0880, 0x6077, 0x0008,
++	0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f,
++	0x0000, 0x2f00, 0x6086, 0x7808, 0x6082, 0x7060, 0x608a, 0x705c,
++	0x608e, 0x7080, 0x60c6, 0x707c, 0x60ca, 0x686c, 0x60ce, 0x60ab,
++	0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080, 0x0048,
++	0x562c, 0x6a00, 0xd2f4, 0x0040, 0x562a, 0x6a14, 0xa294, 0x00ff,
++	0x0078, 0x562c, 0x2011, 0x0000, 0x629e, 0x6017, 0x0012, 0x0078,
++	0x55d9, 0xd5bc, 0x0040, 0x563c, 0xa185, 0x0700, 0x6062, 0x6266,
++	0x636a, 0x646e, 0x0078, 0x5642, 0x6063, 0x0700, 0x6266, 0x606b,
++	0x0000, 0x616e, 0x6073, 0x0898, 0x6077, 0x0000, 0x688c, 0x8000,
++	0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00,
++	0x6086, 0x7808, 0x6082, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c,
++	0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af,
++	0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080, 0x0048, 0x5672, 0x6a00,
++	0xd2f4, 0x0040, 0x5670, 0x6a14, 0xa294, 0x00ff, 0x0078, 0x5672,
++	0x2011, 0x0000, 0x629e, 0x6017, 0x0016, 0x0078, 0x55d9, 0x7a18,
++	0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, 0x2202, 0x8217,
++	0x007c, 0x0d7e, 0x2069, 0x7936, 0x6843, 0x0001, 0x0d7f, 0x007c,
++	0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x1078, 0x5693,
++	0x1078, 0x46fb, 0x007c, 0x007e, 0x6014, 0xa084, 0x0004, 0xa085,
++	0x0009, 0x6016, 0x007f, 0x007c, 0x007e, 0x0c7e, 0x2061, 0x0100,
++	0x6014, 0xa084, 0x0004, 0xa085, 0x0008, 0x6016, 0x0c7f, 0x007f,
++	0x007c, 0x0c7e, 0x0d7e, 0x017e, 0x027e, 0x1078, 0x4706, 0x2061,
++	0x0100, 0x2069, 0x0140, 0x6904, 0xa194, 0x4000, 0x0040, 0x56e6,
++	0x1078, 0x569c, 0x6803, 0x1000, 0x6803, 0x0000, 0x0c7e, 0x2061,
++	0x7936, 0x6128, 0xa192, 0x0002, 0x00c8, 0x56d3, 0x8108, 0x612a,
++	0x6124, 0x0c7f, 0x81ff, 0x0040, 0x56e1, 0x1078, 0x46fb, 0x1078,
++	0x5693, 0x0078, 0x56e1, 0x6124, 0xa1e5, 0x0000, 0x0040, 0x56de,
++	0x1078, 0x76c7, 0x2009, 0x0014, 0x1078, 0x5d41, 0x0c7f, 0x0078,
++	0x56e1, 0x027f, 0x017f, 0x0d7f, 0x0c7f, 0x007c, 0x1078, 0x3591,
++	0x0078, 0x56e1, 0x0c7e, 0x0d7e, 0x0e7e, 0x017e, 0x027e, 0x1078,
++	0x4714, 0x2071, 0x7936, 0x713c, 0x81ff, 0x0040, 0x5714, 0x2061,
++	0x0100, 0x2069, 0x0140, 0x6904, 0xa194, 0x4000, 0x0040, 0x571a,
++	0x6803, 0x1000, 0x6803, 0x0000, 0x037e, 0x2019, 0x0001, 0x1078,
++	0x5880, 0x037f, 0x713c, 0x2160, 0x1078, 0x76c7, 0x2009, 0x004a,
++	0x1078, 0x5d41, 0x0078, 0x5714, 0x027f, 0x017f, 0x0e7f, 0x0d7f,
++	0x0c7f, 0x007c, 0x7144, 0xa192, 0x0002, 0x00c8, 0x5704, 0x8108,
++	0x7146, 0x1078, 0x470b, 0x0078, 0x5714, 0x0e7e, 0x0d7e, 0x0c7e,
++	0x067e, 0x057e, 0x047e, 0x007e, 0x127e, 0x2091, 0x8000, 0x6018,
++	0x2068, 0x6ca0, 0x2071, 0x7936, 0x7018, 0x2068, 0x8dff, 0x0040,
++	0x574f, 0x68a0, 0xa406, 0x0040, 0x5741, 0x6854, 0x2068, 0x0078,
++	0x5736, 0x6010, 0x2060, 0x643c, 0x6540, 0x6e48, 0x2d60, 0x1078,
++	0x3991, 0x0040, 0x574f, 0x1078, 0x5a1a, 0xa085, 0x0001, 0x127f,
++	0x007f, 0x047f, 0x057f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c,
++	0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x50f8, 0x20a3, 0x0f00,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008,
++	0x1078, 0x5688, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x20a1,
++	0x020b, 0x1078, 0x516f, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a9,
++	0x0006, 0x2011, 0x7740, 0x2019, 0x7741, 0x23a6, 0x22a6, 0xa398,
++	0x0002, 0xa290, 0x0002, 0x00f0, 0x577d, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x60c3, 0x001c, 0x1078, 0x5688, 0x147f, 0x157f, 0x007c,
++	0x157e, 0x147e, 0x017e, 0x027e, 0x20a1, 0x020b, 0x1078, 0x514f,
++	0x1078, 0x5166, 0x7810, 0x007e, 0xa080, 0x0015, 0x2098, 0x7808,
++	0xa088, 0x0002, 0x21a8, 0x53a6, 0xa080, 0x0004, 0x8003, 0x60c2,
++	0x007f, 0xa080, 0x0001, 0x2004, 0x7812, 0x1078, 0x5688, 0x027f,
++	0x017f, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b,
++	0x1078, 0x50f8, 0x20a3, 0x6200, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x7808, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x5688, 0x147f, 0x157f,
++	0x007c, 0x0e7e, 0x0c7e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071,
++	0x7936, 0x700c, 0x2060, 0x8cff, 0x0040, 0x57e5, 0x1078, 0x6be3,
++	0x00c0, 0x57dc, 0x1078, 0x5f6d, 0x600c, 0x007e, 0x1078, 0x5d1a,
++	0x1078, 0x5a1a, 0x0c7f, 0x0078, 0x57d3, 0x700f, 0x0000, 0x700b,
++	0x0000, 0x127f, 0x007f, 0x0c7f, 0x0e7f, 0x007c, 0x127e, 0x157e,
++	0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x027e, 0x017e, 0x007e, 0x2091,
++	0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x7936, 0x7024,
++	0x2060, 0x8cff, 0x0040, 0x583e, 0x1078, 0x569c, 0x68c3, 0x0000,
++	0x1078, 0x4706, 0x2009, 0x0013, 0x1078, 0x5d41, 0x20a9, 0x01f4,
++	0x6824, 0xd094, 0x0040, 0x5821, 0x6827, 0x0004, 0x7804, 0xa084,
++	0x4000, 0x0040, 0x5833, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078,
++	0x5833, 0xd084, 0x0040, 0x5828, 0x6827, 0x0001, 0x0078, 0x582a,
++	0x00f0, 0x5810, 0x7804, 0xa084, 0x1000, 0x0040, 0x5833, 0x7803,
++	0x0100, 0x7803, 0x0000, 0x6824, 0x007f, 0x017f, 0x027f, 0x0c7f,
++	0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c, 0x2001, 0x7700,
++	0x2004, 0xa096, 0x0001, 0x0040, 0x5876, 0xa096, 0x0004, 0x0040,
++	0x5876, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x3558, 0x1078,
++	0x4689, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0040, 0x5864, 0x6827,
++	0x0004, 0x7804, 0xa084, 0x4000, 0x0040, 0x5876, 0x7803, 0x1000,
++	0x7803, 0x0000, 0x0078, 0x5876, 0xd084, 0x0040, 0x586b, 0x6827,
++	0x0001, 0x0078, 0x586d, 0x00f0, 0x5853, 0x7804, 0xa084, 0x1000,
++	0x0040, 0x5876, 0x7803, 0x0100, 0x7803, 0x0000, 0x007f, 0x017f,
++	0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c,
++	0x127e, 0x157e, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x027e, 0x017e,
++	0x007e, 0x2091, 0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071,
++	0x7936, 0x703c, 0x2060, 0x8cff, 0x0040, 0x58ce, 0x6817, 0x0010,
++	0x68cb, 0x0000, 0x68c7, 0x0000, 0x1078, 0x4714, 0x1078, 0x1c13,
++	0xa39d, 0x0000, 0x00c0, 0x58a8, 0x2009, 0x0049, 0x1078, 0x5d41,
++	0x20a9, 0x03e8, 0x6824, 0xd094, 0x0040, 0x58bb, 0x6827, 0x0004,
++	0x7804, 0xa084, 0x4000, 0x0040, 0x58cd, 0x7803, 0x1000, 0x7803,
++	0x0000, 0x0078, 0x58cd, 0xd094, 0x0040, 0x58c2, 0x6827, 0x0002,
++	0x0078, 0x58c4, 0x00f0, 0x58aa, 0x7804, 0xa084, 0x1000, 0x0040,
++	0x58cd, 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, 0x007f, 0x017f,
++	0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c,
++	0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0x7936, 0x6a06, 0x127f,
++	0x0d7f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0x7936,
++	0x6a32, 0x127f, 0x0d7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e,
++	0x007e, 0x127e, 0x2071, 0x7936, 0x7614, 0x2660, 0x2678, 0x2091,
++	0x8000, 0x8cff, 0x0040, 0x592c, 0x601c, 0xa206, 0x00c0, 0x5927,
++	0x7014, 0xac36, 0x00c0, 0x5906, 0x660c, 0x7616, 0x7010, 0xac36,
++	0x00c0, 0x5914, 0x2c00, 0xaf36, 0x0040, 0x5912, 0x2f00, 0x7012,
++	0x0078, 0x5914, 0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06,
++	0x0040, 0x591d, 0x7e0e, 0x0078, 0x591e, 0x2678, 0x600f, 0x0000,
++	0x1078, 0x6bb6, 0x1078, 0x5a1a, 0x0c7f, 0x0078, 0x58f9, 0x2c78,
++	0x600c, 0x2060, 0x0078, 0x58f9, 0x127f, 0x007f, 0x067f, 0x0c7f,
++	0x0e7f, 0x0f7f, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078,
++	0x532f, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2,
++	0x20a3, 0x4000, 0x0078, 0x5975, 0x157e, 0x147e, 0x20a1, 0x020b,
++	0x1078, 0x532f, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2,
++	0x20a2, 0x20a3, 0x2000, 0x0078, 0x5975, 0x157e, 0x147e, 0x20a1,
++	0x020b, 0x1078, 0x532f, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2,
++	0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078, 0x5975, 0x157e, 0x147e,
++	0x20a1, 0x020b, 0x1078, 0x532f, 0x7810, 0x20a2, 0xa006, 0x20a2,
++	0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, 0x1078, 0x5a25, 0x60c3,
++	0x0020, 0x1078, 0x5688, 0x147f, 0x157f, 0x007c, 0x127e, 0x0c7e,
++	0x2091, 0x8000, 0x2061, 0x0100, 0x6120, 0xd1b4, 0x00c0, 0x598d,
++	0xd1bc, 0x00c0, 0x59d7, 0x0078, 0x5a17, 0x2009, 0x017f, 0x200b,
++	0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069, 0x0140, 0x20a9, 0x001e,
++	0x2009, 0x0169, 0x6804, 0xa084, 0x4000, 0x0040, 0x59ce, 0x6020,
++	0xd0b4, 0x0040, 0x59ce, 0x6024, 0xd094, 0x00c0, 0x59ce, 0x2104,
++	0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x59ce, 0x00f0, 0x599a,
++	0x027e, 0x6198, 0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, 0x00ff,
++	0xa10d, 0x6088, 0x628c, 0x618e, 0x608b, 0xbc91, 0x6043, 0x0001,
++	0x6043, 0x0000, 0x608a, 0x628e, 0x6024, 0xd094, 0x00c0, 0x59cd,
++	0x6a04, 0xa294, 0x4000, 0x00c0, 0x59c4, 0x027f, 0x0d7f, 0x007f,
++	0x157f, 0x2009, 0x017f, 0x200b, 0x0000, 0x0078, 0x5a17, 0x2009,
++	0x017f, 0x200b, 0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069, 0x0140,
++	0x20a9, 0x001e, 0x2009, 0x0169, 0x6804, 0xa084, 0x4000, 0x0040,
++	0x5a10, 0x6020, 0xd0bc, 0x0040, 0x5a10, 0x2104, 0xa084, 0x000f,
++	0xa086, 0x0004, 0x00c0, 0x5a10, 0x00f0, 0x59e4, 0x027e, 0x6164,
++	0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, 0x00ff, 0xa10d, 0x6088,
++	0x628c, 0x608b, 0xbc91, 0x618e, 0x6043, 0x0001, 0x6043, 0x0000,
++	0x608a, 0x628e, 0x6a04, 0xa294, 0x4000, 0x00c0, 0x5a0a, 0x027f,
++	0x0d7f, 0x007f, 0x157f, 0x2009, 0x017f, 0x200b, 0x0000, 0x0c7f,
++	0x127f, 0x007c, 0x0e7e, 0x2071, 0x7936, 0x7020, 0xa005, 0x0040,
++	0x5a23, 0x8001, 0x7022, 0x0e7f, 0x007c, 0x20a9, 0x0008, 0x20a2,
++	0x00f0, 0x5a27, 0x20a2, 0x20a2, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e,
++	0x0c7e, 0x077e, 0x067e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071,
++	0x7936, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff, 0x0040,
++	0x5abd, 0x8cff, 0x0040, 0x5abd, 0x601c, 0xa086, 0x0006, 0x00c0,
++	0x5ab8, 0x88ff, 0x0040, 0x5a54, 0x2800, 0xac06, 0x00c0, 0x5ab8,
++	0x2039, 0x0000, 0x0078, 0x5a58, 0x6018, 0xa206, 0x00c0, 0x5ab8,
++	0x7024, 0xac06, 0x00c0, 0x5a86, 0x2069, 0x0100, 0x68c0, 0xa005,
++	0x0040, 0x5a81, 0x6817, 0x0008, 0x68c3, 0x0000, 0x1078, 0x5b4a,
++	0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000,
++	0x0040, 0x5a76, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
++	0x6824, 0xd084, 0x0040, 0x5a7e, 0x6827, 0x0001, 0x037f, 0x0078,
++	0x5a86, 0x6003, 0x0009, 0x630a, 0x0078, 0x5ab8, 0x7014, 0xac36,
++	0x00c0, 0x5a8c, 0x660c, 0x7616, 0x7010, 0xac36, 0x00c0, 0x5a9a,
++	0x2c00, 0xaf36, 0x0040, 0x5a98, 0x2f00, 0x7012, 0x0078, 0x5a9a,
++	0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x5aa3,
++	0x7e0e, 0x0078, 0x5aa4, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068,
++	0x1078, 0x6a58, 0x0040, 0x5aae, 0x1078, 0x75fd, 0x1078, 0x6bb6,
++	0x1078, 0x5a1a, 0x88ff, 0x00c0, 0x5ac7, 0x0c7f, 0x0078, 0x5a3e,
++	0x2c78, 0x600c, 0x2060, 0x0078, 0x5a3e, 0xa006, 0x127f, 0x007f,
++	0x067f, 0x077f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x6017,
++	0x0000, 0x0c7f, 0xa8c5, 0x0001, 0x0078, 0x5abe, 0x0f7e, 0x0e7e,
++	0x0d7e, 0x0c7e, 0x067e, 0x027e, 0x007e, 0x127e, 0x2091, 0x8000,
++	0x2071, 0x7936, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0040, 0x5b39,
++	0x601c, 0xa086, 0x0006, 0x00c0, 0x5b34, 0x88ff, 0x0040, 0x5aee,
++	0x2800, 0xac06, 0x00c0, 0x5b34, 0x0078, 0x5af2, 0x6018, 0xa206,
++	0x00c0, 0x5b34, 0x703c, 0xac06, 0x00c0, 0x5b04, 0x037e, 0x2019,
++	0x0001, 0x1078, 0x5880, 0x7033, 0x0000, 0x703f, 0x0000, 0x7043,
++	0x0000, 0x7047, 0x0000, 0x037f, 0x7038, 0xac36, 0x00c0, 0x5b0a,
++	0x660c, 0x763a, 0x7034, 0xac36, 0x00c0, 0x5b18, 0x2c00, 0xaf36,
++	0x0040, 0x5b16, 0x2f00, 0x7036, 0x0078, 0x5b18, 0x7037, 0x0000,
++	0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x5b21, 0x7e0e, 0x0078,
++	0x5b22, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x6a58,
++	0x0040, 0x5b2c, 0x1078, 0x75fd, 0x1078, 0x6bb6, 0x88ff, 0x00c0,
++	0x5b43, 0x0c7f, 0x0078, 0x5add, 0x2c78, 0x600c, 0x2060, 0x0078,
++	0x5add, 0xa006, 0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0d7f,
++	0x0e7f, 0x0f7f, 0x007c, 0x6017, 0x0000, 0x0c7f, 0xa8c5, 0x0001,
++	0x0078, 0x5b3a, 0x0e7e, 0x2071, 0x7936, 0x2001, 0x7700, 0x2004,
++	0xa086, 0x0002, 0x00c0, 0x5b58, 0x7007, 0x0005, 0x0078, 0x5b5a,
++	0x7007, 0x0000, 0x0e7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e,
++	0x027e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0x7936, 0x2c10,
++	0x7638, 0x2660, 0x2678, 0x8cff, 0x0040, 0x5b9a, 0x2200, 0xac06,
++	0x00c0, 0x5b95, 0x7038, 0xac36, 0x00c0, 0x5b78, 0x660c, 0x763a,
++	0x7034, 0xac36, 0x00c0, 0x5b86, 0x2c00, 0xaf36, 0x0040, 0x5b84,
++	0x2f00, 0x7036, 0x0078, 0x5b86, 0x7037, 0x0000, 0x660c, 0x2c00,
++	0xaf06, 0x0040, 0x5b8e, 0x7e0e, 0x0078, 0x5b8f, 0x2678, 0x600f,
++	0x0000, 0xa085, 0x0001, 0x0078, 0x5b9a, 0x2c78, 0x600c, 0x2060,
++	0x0078, 0x5b6b, 0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0e7f,
++	0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x007e,
++	0x127e, 0x2091, 0x8000, 0x2071, 0x7936, 0x760c, 0x2660, 0x2678,
++	0x8cff, 0x0040, 0x5c33, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206,
++	0x00c0, 0x5c2e, 0x7024, 0xac06, 0x00c0, 0x5be1, 0x2069, 0x0100,
++	0x68c0, 0xa005, 0x0040, 0x5be1, 0x1078, 0x569c, 0x68c3, 0x0000,
++	0x1078, 0x5b4a, 0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04,
++	0xa384, 0x1000, 0x0040, 0x5bd8, 0x6803, 0x0100, 0x6803, 0x0000,
++	0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x5be0, 0x6827, 0x0001,
++	0x037f, 0x700c, 0xac36, 0x00c0, 0x5be7, 0x660c, 0x760e, 0x7008,
++	0xac36, 0x00c0, 0x5bf5, 0x2c00, 0xaf36, 0x0040, 0x5bf3, 0x2f00,
++	0x700a, 0x0078, 0x5bf5, 0x700b, 0x0000, 0x660c, 0x067e, 0x2c00,
++	0xaf06, 0x0040, 0x5bfe, 0x7e0e, 0x0078, 0x5bff, 0x2678, 0x600f,
++	0x0000, 0x1078, 0x6bcf, 0x00c0, 0x5c09, 0x1078, 0x22d7, 0x0078,
++	0x5c25, 0x1078, 0x6be3, 0x00c0, 0x5c11, 0x1078, 0x5f6d, 0x0078,
++	0x5c25, 0x6010, 0x2068, 0x1078, 0x6a58, 0x0040, 0x5c25, 0x601c,
++	0xa086, 0x0003, 0x00c0, 0x5c3b, 0x6837, 0x0103, 0x6b4a, 0x6847,
++	0x0000, 0x1078, 0x3b92, 0x1078, 0x6ba9, 0x6003, 0x0000, 0x1078,
++	0x6bb6, 0x1078, 0x5a1a, 0x0c7f, 0x0078, 0x5bb0, 0x2c78, 0x600c,
++	0x2060, 0x0078, 0x5bb0, 0x127f, 0x007f, 0x067f, 0x0c7f, 0x0d7f,
++	0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x5c1c,
++	0x1078, 0x75fd, 0x0078, 0x5c25, 0x037e, 0x157e, 0x137e, 0x147e,
++	0x3908, 0xa006, 0xa190, 0x0020, 0x221c, 0xa39e, 0x2149, 0x00c0,
++	0x5c55, 0x8210, 0x8000, 0x0078, 0x5c4c, 0xa005, 0x0040, 0x5c5f,
++	0x20a9, 0x0020, 0x2198, 0xa110, 0x22a0, 0x22c8, 0x53a3, 0x147f,
++	0x137f, 0x157f, 0x037f, 0x007c, 0x0d7e, 0x20a1, 0x020b, 0x1078,
++	0x516f, 0x20a3, 0x0200, 0x20a3, 0x0014, 0x60c3, 0x0014, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a3, 0x514c, 0x20a3, 0x4f47, 0x20a3,
++	0x4943, 0x20a3, 0x2020, 0x20a3, 0x0004, 0x20a3, 0x7878, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x1078, 0x5688, 0x0d7f, 0x007c, 0x20a1,
++	0x020b, 0x1078, 0x516f, 0x20a3, 0x0210, 0x20a3, 0x0018, 0x20a3,
++	0x0800, 0x7810, 0xa084, 0xff00, 0x20a2, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7810,
++	0xa084, 0x00ff, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
++	0x0018, 0x1078, 0x5688, 0x007c, 0x2061, 0x7e00, 0x2a70, 0x7060,
++	0x7046, 0x704b, 0x7e00, 0x007c, 0x0e7e, 0x127e, 0x2071, 0x7700,
++	0x2091, 0x8000, 0x7544, 0xa582, 0x0001, 0x0048, 0x5ce6, 0x7048,
++	0x2060, 0x6000, 0xa086, 0x0000, 0x0040, 0x5cd2, 0xace0, 0x0008,
++	0x7054, 0xac02, 0x00c8, 0x5cce, 0x0078, 0x5cc1, 0x2061, 0x7e00,
++	0x0078, 0x5cc1, 0x6003, 0x0008, 0x8529, 0x7546, 0xaca8, 0x0008,
++	0x7054, 0xa502, 0x00c8, 0x5ce2, 0x754a, 0xa085, 0x0001, 0x127f,
++	0x0e7f, 0x007c, 0x704b, 0x7e00, 0x0078, 0x5cdd, 0xa006, 0x0078,
++	0x5cdf, 0x0e7e, 0x2071, 0x7700, 0x7544, 0xa582, 0x0001, 0x0048,
++	0x5d17, 0x7048, 0x2060, 0x6000, 0xa086, 0x0000, 0x0040, 0x5d04,
++	0xace0, 0x0008, 0x7054, 0xac02, 0x00c8, 0x5d00, 0x0078, 0x5cf3,
++	0x2061, 0x7e00, 0x0078, 0x5cf3, 0x6003, 0x0008, 0x8529, 0x7546,
++	0xaca8, 0x0008, 0x7054, 0xa502, 0x00c8, 0x5d13, 0x754a, 0xa085,
++	0x0001, 0x0e7f, 0x007c, 0x704b, 0x7e00, 0x0078, 0x5d0f, 0xa006,
++	0x0078, 0x5d11, 0xac82, 0x7e00, 0x1048, 0x12cd, 0x2001, 0x7715,
++	0x2004, 0xac02, 0x10c8, 0x12cd, 0xa006, 0x6006, 0x600a, 0x600e,
++	0x6012, 0x6016, 0x601a, 0x601f, 0x0000, 0x6003, 0x0000, 0x2061,
++	0x7700, 0x6044, 0x8000, 0x6046, 0xa086, 0x0001, 0x0040, 0x5d39,
++	0x007c, 0x127e, 0x2091, 0x8000, 0x1078, 0x4d96, 0x127f, 0x0078,
++	0x5d38, 0x601c, 0xa084, 0x000f, 0x0079, 0x5d46, 0x5d4f, 0x5d57,
++	0x5d73, 0x5d8f, 0x6c60, 0x6c7c, 0x6c98, 0x5d4f, 0x5d57, 0xa18e,
++	0x0047, 0x00c0, 0x5d56, 0xa016, 0x1078, 0x156a, 0x007c, 0x067e,
++	0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12cd, 0x1079, 0x5d61, 0x067f,
++	0x007c, 0x5d71, 0x5e58, 0x5f88, 0x5d71, 0x5fdf, 0x5d71, 0x5d71,
++	0x5d71, 0x5e07, 0x6298, 0x5d71, 0x5d71, 0x5d71, 0x5d71, 0x5d71,
++	0x5d71, 0x1078, 0x12cd, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8,
++	0x12cd, 0x1079, 0x5d7d, 0x067f, 0x007c, 0x5d8d, 0x5d8d, 0x5d8d,
++	0x5d8d, 0x5d8d, 0x5d8d, 0x5d8d, 0x5d8d, 0x670c, 0x67d2, 0x5d8d,
++	0x6725, 0x677e, 0x6725, 0x677e, 0x5d8d, 0x1078, 0x12cd, 0x067e,
++	0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12cd, 0x1079, 0x5d99, 0x067f,
++	0x007c, 0x5da9, 0x62d6, 0x637c, 0x643e, 0x6596, 0x5da9, 0x5da9,
++	0x5da9, 0x62b4, 0x66c1, 0x66c5, 0x5da9, 0x5da9, 0x5da9, 0x5da9,
++	0x66eb, 0x1078, 0x12cd, 0x20a9, 0x000e, 0x2e98, 0x6010, 0x20a0,
++	0x53a3, 0x20a9, 0x0006, 0x3310, 0x3420, 0x9398, 0x94a0, 0x3318,
++	0x3428, 0x222e, 0x2326, 0xa290, 0x0002, 0xa5a8, 0x0002, 0xa398,
++	0x0002, 0xa4a0, 0x0002, 0x00f0, 0x5db9, 0x0e7e, 0x1078, 0x6a58,
++	0x0040, 0x5dd0, 0x6010, 0x2070, 0x7007, 0x0000, 0x7037, 0x0103,
++	0x0e7f, 0x1078, 0x5d1a, 0x007c, 0x0d7e, 0x037e, 0x7330, 0xa386,
++	0x0200, 0x00c0, 0x5de1, 0x6018, 0x2068, 0x6813, 0x00ff, 0x6817,
++	0xfffd, 0x6010, 0xa005, 0x0040, 0x5deb, 0x2068, 0x6807, 0x0000,
++	0x6837, 0x0103, 0x6b32, 0x1078, 0x5d1a, 0x037f, 0x0d7f, 0x007c,
++	0x0d7e, 0x20a9, 0x000e, 0x2e98, 0x6010, 0x20a0, 0x53a3, 0xa1b6,
++	0x0015, 0x00c0, 0x5e04, 0x6018, 0x2068, 0x7038, 0x680a, 0x703c,
++	0x680e, 0x6800, 0xc08d, 0x6802, 0x0d7f, 0x0078, 0x5dc5, 0x2100,
++	0xa1b2, 0x0030, 0x10c8, 0x12cd, 0x0079, 0x5e0e, 0x5e40, 0x5e4c,
++	0x5e40, 0x5e40, 0x5e40, 0x5e40, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e,
++	0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e,
++	0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e,
++	0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e40, 0x5e3e, 0x5e40,
++	0x5e40, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e40, 0x5e3e,
++	0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x1078, 0x12cd,
++	0x6003, 0x0001, 0x6106, 0x1078, 0x498e, 0x127e, 0x2091, 0x8000,
++	0x1078, 0x4d96, 0x127f, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078,
++	0x498e, 0x127e, 0x2091, 0x8000, 0x1078, 0x4d96, 0x127f, 0x007c,
++	0x6004, 0xa0b2, 0x0030, 0x10c8, 0x12cd, 0xa1b6, 0x0013, 0x00c0,
++	0x5e64, 0x2008, 0x0079, 0x5eeb, 0xa1b6, 0x0027, 0x00c0, 0x5eb9,
++	0x1078, 0x4c9d, 0x6004, 0x1078, 0x6bcf, 0x0040, 0x5e7d, 0x1078,
++	0x6be3, 0x0040, 0x5eb1, 0xa08e, 0x0021, 0x0040, 0x5eb5, 0xa08e,
++	0x0022, 0x0040, 0x5eb1, 0x0078, 0x5eac, 0x1078, 0x22d7, 0x2001,
++	0x0007, 0x1078, 0x37f4, 0x6018, 0xa080, 0x0028, 0x200c, 0x1078,
++	0x5f6d, 0xa186, 0x007e, 0x00c0, 0x5e92, 0x2001, 0x772f, 0x2014,
++	0xc285, 0x2202, 0x017e, 0x027e, 0x037e, 0x2110, 0x2019, 0x0028,
++	0x1078, 0x4a7e, 0x1078, 0x49c1, 0x0c7e, 0x6018, 0xa065, 0x0040,
++	0x5ea3, 0x1078, 0x3a36, 0x0c7f, 0x2c08, 0x1078, 0x747b, 0x037f,
++	0x027f, 0x017f, 0x1078, 0x3834, 0x1078, 0x5d1a, 0x1078, 0x4d96,
++	0x007c, 0x1078, 0x5f6d, 0x0078, 0x5eac, 0x1078, 0x5f7c, 0x0078,
++	0x5eac, 0xa186, 0x0014, 0x00c0, 0x5eb0, 0x1078, 0x4c9d, 0x1078,
++	0x22b5, 0x1078, 0x6bcf, 0x00c0, 0x5ed8, 0x1078, 0x22d7, 0x6018,
++	0xa080, 0x0028, 0x200c, 0x1078, 0x5f6d, 0xa186, 0x007e, 0x00c0,
++	0x5ed6, 0x2001, 0x772f, 0x200c, 0xc185, 0x2102, 0x0078, 0x5eac,
++	0x1078, 0x6be3, 0x00c0, 0x5ee0, 0x1078, 0x5f6d, 0x0078, 0x5eac,
++	0x6004, 0xa08e, 0x0021, 0x0040, 0x5edc, 0xa08e, 0x0022, 0x1040,
++	0x5f7c, 0x0078, 0x5eac, 0x5f1d, 0x5f1f, 0x5f23, 0x5f27, 0x5f2b,
++	0x5f2f, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b,
++	0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b,
++	0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b,
++	0x5f1b, 0x5f33, 0x5f39, 0x5f1b, 0x5f43, 0x5f39, 0x5f1b, 0x5f1b,
++	0x5f1b, 0x5f1b, 0x5f1b, 0x5f39, 0x5f39, 0x5f1b, 0x5f1b, 0x5f1b,
++	0x5f1b, 0x5f1b, 0x5f1b, 0x1078, 0x12cd, 0x0078, 0x5f39, 0x2001,
++	0x000b, 0x0078, 0x5f4c, 0x2001, 0x0003, 0x0078, 0x5f4c, 0x2001,
++	0x0005, 0x0078, 0x5f4c, 0x2001, 0x0001, 0x0078, 0x5f4c, 0x2001,
++	0x0009, 0x0078, 0x5f4c, 0x1078, 0x12cd, 0x0078, 0x5f4b, 0x1078,
++	0x37f4, 0x1078, 0x4c9d, 0x6003, 0x0002, 0x6017, 0x0028, 0x1078,
++	0x4d96, 0x0078, 0x5f4b, 0x1078, 0x4c9d, 0x6003, 0x0004, 0x6017,
++	0x0028, 0x1078, 0x4d96, 0x007c, 0x1078, 0x37f4, 0x1078, 0x4c9d,
++	0x6003, 0x0002, 0x037e, 0x2019, 0x775c, 0x2304, 0xa084, 0xff00,
++	0x00c0, 0x5f5e, 0x2019, 0x0028, 0x0078, 0x5f67, 0x8007, 0xa09a,
++	0x0004, 0x0048, 0x5f5a, 0x8003, 0x801b, 0x831b, 0xa318, 0x6316,
++	0x037f, 0x1078, 0x4d96, 0x0078, 0x5f4b, 0x0e7e, 0x1078, 0x6a58,
++	0x0040, 0x5f7a, 0x6010, 0x2070, 0x7007, 0x0000, 0x7037, 0x0103,
++	0x7033, 0x0100, 0x0e7f, 0x007c, 0x0e7e, 0xacf0, 0x0004, 0x2e74,
++	0x7000, 0x2070, 0x7037, 0x0103, 0x7023, 0x8001, 0x0e7f, 0x007c,
++	0x0d7e, 0x6618, 0x2668, 0x6804, 0xa084, 0x00ff, 0x0d7f, 0xa0b2,
++	0x000c, 0x10c8, 0x12cd, 0x6604, 0xa6b6, 0x0028, 0x00c0, 0x5f9c,
++	0x1078, 0x6c18, 0x0078, 0x5fce, 0x6604, 0xa6b6, 0x0029, 0x00c0,
++	0x5fa5, 0x1078, 0x6c32, 0x0078, 0x5fce, 0x6604, 0xa6b6, 0x001f,
++	0x00c0, 0x5fae, 0x1078, 0x5dab, 0x0078, 0x5fce, 0x6604, 0xa6b6,
++	0x0000, 0x00c0, 0x5fb7, 0x1078, 0x5df0, 0x0078, 0x5fce, 0x6604,
++	0xa6b6, 0x0022, 0x00c0, 0x5fc0, 0x1078, 0x5dd4, 0x0078, 0x5fce,
++	0xa1b6, 0x0015, 0x00c0, 0x5fc8, 0x1079, 0x5fd3, 0x0078, 0x5fce,
++	0xa1b6, 0x0016, 0x00c0, 0x5fcf, 0x1079, 0x6110, 0x007c, 0x1078,
++	0x5d4f, 0x0078, 0x5fce, 0x5ff7, 0x5ffa, 0x5ff7, 0x603b, 0x5ff7,
++	0x60ac, 0x5ff7, 0x5ff7, 0x5ff7, 0x60e8, 0x5ff7, 0x60fe, 0xa1b6,
++	0x0048, 0x0040, 0x5feb, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10,
++	0x1078, 0x156a, 0x007c, 0x0e7e, 0xacf0, 0x0004, 0x2e74, 0x7000,
++	0x2070, 0x7037, 0x0103, 0x0e7f, 0x1078, 0x5d1a, 0x007c, 0x0005,
++	0x0005, 0x007c, 0x0e7e, 0x2071, 0x7700, 0x7078, 0xa086, 0x0074,
++	0x00c0, 0x6024, 0x1078, 0x744f, 0x00c0, 0x6016, 0x0d7e, 0x6018,
++	0x2068, 0x1078, 0x6028, 0x0d7f, 0x2001, 0x0006, 0x1078, 0x37f4,
++	0x1078, 0x22d7, 0x1078, 0x5d1a, 0x0078, 0x6026, 0x2001, 0x000a,
++	0x1078, 0x37f4, 0x1078, 0x22d7, 0x6003, 0x0001, 0x6007, 0x0001,
++	0x1078, 0x498e, 0x0078, 0x6026, 0x1078, 0x609c, 0x0e7f, 0x007c,
++	0x6800, 0xd084, 0x0040, 0x603a, 0x2001, 0x0000, 0x1078, 0x37e0,
++	0x2069, 0x7751, 0x6804, 0xd0a4, 0x0040, 0x603a, 0x2001, 0x0006,
++	0x1078, 0x3802, 0x007c, 0x0d7e, 0x2011, 0x771e, 0x2204, 0xa086,
++	0x0074, 0x00c0, 0x6098, 0x1078, 0x61ea, 0x6018, 0x2068, 0xa080,
++	0x0028, 0x2014, 0xa286, 0x007e, 0x0040, 0x6063, 0xa286, 0x0080,
++	0x00c0, 0x608c, 0x6813, 0x00ff, 0x6817, 0xfffc, 0x6010, 0xa005,
++	0x0040, 0x6082, 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6833,
++	0x0200, 0x0078, 0x6082, 0x0e7e, 0x0f7e, 0x6813, 0x00ff, 0x6817,
++	0xfffe, 0x2071, 0x772f, 0x2e04, 0xa085, 0x0003, 0x2072, 0x2071,
++	0x7c80, 0x2079, 0x0100, 0x2e04, 0xa084, 0x00ff, 0x2069, 0x7719,
++	0x206a, 0x78e6, 0x8e70, 0x2e04, 0x2069, 0x771a, 0x206a, 0x78ea,
++	0x0f7f, 0x0e7f, 0x2001, 0x0006, 0x1078, 0x37f4, 0x1078, 0x22d7,
++	0x1078, 0x5d1a, 0x0078, 0x609a, 0x2001, 0x0004, 0x1078, 0x37f4,
++	0x6003, 0x0001, 0x6007, 0x0003, 0x1078, 0x498e, 0x0078, 0x609a,
++	0x1078, 0x609c, 0x0d7f, 0x007c, 0x2001, 0x7700, 0x2004, 0xa086,
++	0x0003, 0x0040, 0x60a7, 0x2001, 0x0007, 0x1078, 0x37f4, 0x1078,
++	0x22d7, 0x1078, 0x5d1a, 0x007c, 0x0e7e, 0x2071, 0x7700, 0x7078,
++	0xa086, 0x0014, 0x00c0, 0x60e2, 0x7000, 0xa086, 0x0003, 0x00c0,
++	0x60bf, 0x6010, 0xa005, 0x00c0, 0x60bf, 0x1078, 0x2dd7, 0x0d7e,
++	0x6018, 0x2068, 0x1078, 0x38c8, 0x1078, 0x6028, 0x0d7f, 0x1078,
++	0x61f4, 0x00c0, 0x60e2, 0x2001, 0x0006, 0x1078, 0x37f4, 0x0e7e,
++	0x6010, 0xa005, 0x0040, 0x60db, 0x2070, 0x7007, 0x0000, 0x7037,
++	0x0103, 0x7033, 0x0200, 0x0e7f, 0x1078, 0x22d7, 0x1078, 0x5d1a,
++	0x0078, 0x60e6, 0x1078, 0x5f6d, 0x1078, 0x609c, 0x0e7f, 0x007c,
++	0x2011, 0x771e, 0x2204, 0xa086, 0x0014, 0x00c0, 0x60fb, 0x2001,
++	0x0002, 0x1078, 0x37f4, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078,
++	0x498e, 0x0078, 0x60fd, 0x1078, 0x609c, 0x007c, 0x2011, 0x771e,
++	0x2204, 0xa086, 0x0004, 0x00c0, 0x610d, 0x2001, 0x0007, 0x1078,
++	0x37f4, 0x1078, 0x5d1a, 0x0078, 0x610f, 0x1078, 0x609c, 0x007c,
++	0x5ff7, 0x611c, 0x5ff7, 0x6142, 0x5ff7, 0x619d, 0x5ff7, 0x5ff7,
++	0x5ff7, 0x61b2, 0x5ff7, 0x61c5, 0x0c7e, 0x1078, 0x61d8, 0x00c0,
++	0x6131, 0x2001, 0x0000, 0x1078, 0x37e0, 0x2001, 0x0002, 0x1078,
++	0x37f4, 0x6003, 0x0001, 0x6007, 0x0002, 0x1078, 0x498e, 0x0078,
++	0x6140, 0x2009, 0x7c8f, 0x2104, 0xa084, 0xff00, 0xa086, 0x1900,
++	0x00c0, 0x613e, 0x1078, 0x5d1a, 0x0078, 0x6140, 0x1078, 0x609c,
++	0x0c7f, 0x007c, 0x1078, 0x61e7, 0x00c0, 0x6156, 0x2001, 0x0000,
++	0x1078, 0x37e0, 0x2001, 0x0002, 0x1078, 0x37f4, 0x6003, 0x0001,
++	0x6007, 0x0002, 0x1078, 0x498e, 0x0078, 0x6178, 0x1078, 0x5f6d,
++	0x2009, 0x7c8e, 0x2134, 0xa6b4, 0x00ff, 0xa686, 0x0005, 0x0040,
++	0x6179, 0x2009, 0x7c8f, 0x2104, 0xa084, 0xff00, 0xa086, 0x1900,
++	0x00c0, 0x6176, 0xa686, 0x0009, 0x0040, 0x6179, 0x2001, 0x0004,
++	0x1078, 0x37f4, 0x1078, 0x5d1a, 0x0078, 0x6178, 0x1078, 0x609c,
++	0x007c, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x6a58, 0x0040, 0x6187,
++	0x6838, 0xd0fc, 0x0040, 0x6187, 0x0d7f, 0x0078, 0x6176, 0x6018,
++	0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0040, 0x6198, 0x8001,
++	0x6842, 0x6017, 0x000a, 0x6007, 0x0016, 0x0d7f, 0x0078, 0x6178,
++	0x1078, 0x22b5, 0x0d7f, 0x0078, 0x6176, 0x1078, 0x61e7, 0x00c0,
++	0x61ad, 0x2001, 0x0004, 0x1078, 0x37f4, 0x6003, 0x0001, 0x6007,
++	0x0003, 0x1078, 0x498e, 0x0078, 0x61b1, 0x1078, 0x5f6d, 0x1078,
++	0x609c, 0x007c, 0x1078, 0x61e7, 0x00c0, 0x61c2, 0x2001, 0x0008,
++	0x1078, 0x37f4, 0x6003, 0x0001, 0x6007, 0x0005, 0x1078, 0x498e,
++	0x0078, 0x61c4, 0x1078, 0x609c, 0x007c, 0x1078, 0x61e7, 0x00c0,
++	0x61d5, 0x2001, 0x000a, 0x1078, 0x37f4, 0x6003, 0x0001, 0x6007,
++	0x0001, 0x1078, 0x498e, 0x0078, 0x61d7, 0x1078, 0x609c, 0x007c,
++	0x2009, 0x7c8e, 0x2104, 0xa086, 0x0003, 0x00c0, 0x61e6, 0x2009,
++	0x7c8f, 0x2104, 0xa084, 0xff00, 0xa086, 0x2a00, 0x007c, 0xa085,
++	0x0001, 0x007c, 0x0c7e, 0x017e, 0xac88, 0x0006, 0x2164, 0x1078,
++	0x385e, 0x017f, 0x0c7f, 0x007c, 0x0e7e, 0x2071, 0x7c8c, 0x7004,
++	0xa086, 0x0014, 0x00c0, 0x6217, 0x7008, 0xa086, 0x0800, 0x00c0,
++	0x6217, 0x700c, 0xd0ec, 0x0040, 0x6215, 0xa084, 0x0f00, 0xa086,
++	0x0100, 0x00c0, 0x6215, 0x7024, 0xd0a4, 0x0040, 0x6215, 0xd08c,
++	0x0040, 0x6215, 0xa006, 0x0078, 0x6217, 0xa085, 0x0001, 0x0e7f,
++	0x007c, 0x0e7e, 0x0d7e, 0x0c7e, 0x077e, 0x057e, 0x047e, 0x027e,
++	0x007e, 0x127e, 0x2091, 0x8000, 0x2029, 0x793f, 0x252c, 0x2021,
++	0x7945, 0x2424, 0x2061, 0x7e00, 0x2071, 0x7700, 0x7244, 0x7060,
++	0xa202, 0x00c8, 0x626e, 0x1078, 0x7659, 0x0040, 0x6266, 0x671c,
++	0xa786, 0x0001, 0x0040, 0x6266, 0xa786, 0x0007, 0x0040, 0x6266,
++	0x2500, 0xac06, 0x0040, 0x6266, 0x2400, 0xac06, 0x0040, 0x6266,
++	0x0c7e, 0x6000, 0xa086, 0x0004, 0x00c0, 0x6250, 0x1078, 0x166e,
++	0x6010, 0x2068, 0x1078, 0x6a58, 0x0040, 0x6263, 0xa786, 0x0003,
++	0x00c0, 0x6278, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078,
++	0x3b92, 0x1078, 0x6ba9, 0x1078, 0x6bb6, 0x0c7f, 0xace0, 0x0008,
++	0x7054, 0xac02, 0x00c8, 0x626e, 0x0078, 0x622e, 0x127f, 0x007f,
++	0x027f, 0x047f, 0x057f, 0x077f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c,
++	0xa786, 0x0006, 0x00c0, 0x625a, 0x1078, 0x75fd, 0x0078, 0x6263,
++	0x220c, 0x2304, 0xa106, 0x00c0, 0x628b, 0x8210, 0x8318, 0x00f0,
++	0x6280, 0xa006, 0x007c, 0x2304, 0xa102, 0x0048, 0x6293, 0x2001,
++	0x0001, 0x0078, 0x6295, 0x2001, 0x0000, 0xa18d, 0x0001, 0x007c,
++	0x6004, 0xa08a, 0x0030, 0x10c8, 0x12cd, 0x1078, 0x6bcf, 0x0040,
++	0x62a7, 0x1078, 0x6be3, 0x0040, 0x62b0, 0x0078, 0x62a9, 0x1078,
++	0x22d7, 0x1078, 0x4c9d, 0x1078, 0x5d1a, 0x1078, 0x4d96, 0x007c,
++	0x1078, 0x5f6d, 0x0078, 0x62a9, 0xa182, 0x0040, 0x0079, 0x62b8,
++	0x62c8, 0x62c8, 0x62c8, 0x62c8, 0x62c8, 0x62c8, 0x62c8, 0x62c8,
++	0x62c8, 0x62c8, 0x62c8, 0x62ca, 0x62ca, 0x62ca, 0x62ca, 0x62c8,
++	0x1078, 0x12cd, 0x6003, 0x0001, 0x6106, 0x1078, 0x4941, 0x127e,
++	0x2091, 0x8000, 0x1078, 0x4d96, 0x127f, 0x007c, 0xa186, 0x0013,
++	0x00c0, 0x62df, 0x6004, 0xa082, 0x0040, 0x0079, 0x6355, 0xa186,
++	0x0027, 0x00c0, 0x62fc, 0x1078, 0x4c9d, 0x1078, 0x22b5, 0x0d7e,
++	0x6110, 0x2168, 0x1078, 0x6a58, 0x0040, 0x62f6, 0x6837, 0x0103,
++	0x684b, 0x0029, 0x1078, 0x3b92, 0x1078, 0x6ba9, 0x0d7f, 0x1078,
++	0x5d1a, 0x1078, 0x4d96, 0x007c, 0xa186, 0x0014, 0x00c0, 0x6305,
++	0x6004, 0xa082, 0x0040, 0x0079, 0x6325, 0xa186, 0x0047, 0x10c0,
++	0x12cd, 0x2001, 0x0109, 0x2004, 0xd084, 0x0040, 0x6322, 0x127e,
++	0x2091, 0x2200, 0x007e, 0x017e, 0x027e, 0x1078, 0x4802, 0x027f,
++	0x017f, 0x007f, 0x127f, 0x6000, 0xa086, 0x0002, 0x00c0, 0x6322,
++	0x0078, 0x637c, 0x1078, 0x5d4f, 0x007c, 0x6337, 0x6335, 0x6335,
++	0x6335, 0x6335, 0x6335, 0x6335, 0x6335, 0x6335, 0x6335, 0x6335,
++	0x634e, 0x634e, 0x634e, 0x634e, 0x6335, 0x1078, 0x12cd, 0x1078,
++	0x4c9d, 0x0d7e, 0x6110, 0x2168, 0x1078, 0x6a58, 0x0040, 0x6348,
++	0x6837, 0x0103, 0x684b, 0x0006, 0x1078, 0x3b92, 0x1078, 0x6ba9,
++	0x0d7f, 0x1078, 0x5d1a, 0x1078, 0x4d96, 0x007c, 0x1078, 0x4c9d,
++	0x1078, 0x5d1a, 0x1078, 0x4d96, 0x007c, 0x6367, 0x6365, 0x6365,
++	0x6365, 0x6365, 0x6365, 0x6365, 0x6365, 0x6365, 0x6365, 0x6365,
++	0x6375, 0x6375, 0x6375, 0x6375, 0x6365, 0x1078, 0x12cd, 0x1078,
++	0x4c9d, 0x6003, 0x0002, 0x1078, 0x4d96, 0x6010, 0xa088, 0x0013,
++	0x2104, 0xa085, 0x0400, 0x200a, 0x007c, 0x1078, 0x4c9d, 0x6003,
++	0x000f, 0x1078, 0x4d96, 0x007c, 0xa182, 0x0040, 0x0079, 0x6380,
++	0x6390, 0x6390, 0x6390, 0x6390, 0x6390, 0x6392, 0x641b, 0x6433,
++	0x6390, 0x6390, 0x6390, 0x6390, 0x6390, 0x6390, 0x6390, 0x6390,
++	0x1078, 0x12cd, 0x0e7e, 0x0d7e, 0x2071, 0x7c8c, 0x6110, 0x2168,
++	0x7614, 0xa6b4, 0x0fff, 0x86ff, 0x0040, 0x63ff, 0xa68c, 0x00ff,
++	0xa186, 0x0002, 0x0040, 0x63c4, 0xa186, 0x0028, 0x00c0, 0x63ae,
++	0x1078, 0x6bbd, 0x684b, 0x001c, 0x0078, 0x63c6, 0xd6dc, 0x0040,
++	0x63b9, 0x684b, 0x0015, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078,
++	0x63c6, 0xd6d4, 0x0040, 0x63c4, 0x684b, 0x0007, 0x7318, 0x6b62,
++	0x731c, 0x6b5e, 0x0078, 0x63c6, 0x684b, 0x0000, 0x6837, 0x0103,
++	0x6e46, 0xa01e, 0xd6c4, 0x0040, 0x63d9, 0x7328, 0x732c, 0x6b56,
++	0x037e, 0x2308, 0x2019, 0x7c98, 0xad90, 0x0019, 0x1078, 0x6841,
++	0x037f, 0xd6cc, 0x0040, 0x640f, 0x7124, 0x695a, 0xa192, 0x0021,
++	0x00c8, 0x63ed, 0x2071, 0x7c98, 0x831c, 0x2300, 0xae18, 0xad90,
++	0x001d, 0x1078, 0x6841, 0x0078, 0x640f, 0x6838, 0xd0fc, 0x0040,
++	0x63f6, 0x2009, 0x0020, 0x695a, 0x0078, 0x63e2, 0x0f7e, 0x2d78,
++	0x1078, 0x67d9, 0x0f7f, 0x1078, 0x682e, 0x0078, 0x6411, 0x684b,
++	0x0000, 0x6837, 0x0103, 0x6e46, 0x684c, 0xd0ac, 0x0040, 0x640f,
++	0x6810, 0x6914, 0xa115, 0x0040, 0x640f, 0x1078, 0x6587, 0x1078,
++	0x3b92, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x0d7f, 0x0e7f,
++	0x1078, 0x5d1a, 0x007c, 0x0f7e, 0x6003, 0x0003, 0x2079, 0x7c8c,
++	0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010, 0x2078, 0x7c12, 0x7b16,
++	0x7e0a, 0x7d0e, 0x0f7f, 0x2c10, 0x1078, 0x19c7, 0x1078, 0x49ad,
++	0x1078, 0x4e56, 0x007c, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005,
++	0x3d18, 0x3e20, 0x2c10, 0x1078, 0x156a, 0x007c, 0xa182, 0x0040,
++	0x0079, 0x6442, 0x6452, 0x6452, 0x6452, 0x6452, 0x6452, 0x6454,
++	0x64eb, 0x6452, 0x6452, 0x6501, 0x6563, 0x6452, 0x6452, 0x6452,
++	0x6452, 0x656e, 0x1078, 0x12cd, 0x077e, 0x0f7e, 0x0e7e, 0x0d7e,
++	0x2071, 0x7c8c, 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x7e46,
++	0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e,
++	0x86ff, 0x0040, 0x64e6, 0xa694, 0xff00, 0xa284, 0x0c00, 0x0040,
++	0x6475, 0x7018, 0x7862, 0x701c, 0x785e, 0xa284, 0x0300, 0x0040,
++	0x64e6, 0x1078, 0x1327, 0x1040, 0x12cd, 0x2d00, 0x784a, 0x7f4c,
++	0xc7cd, 0x7f4e, 0x6837, 0x0103, 0x7838, 0x683a, 0x783c, 0x683e,
++	0x7840, 0x6842, 0x6e46, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0040,
++	0x64af, 0xa186, 0x0028, 0x00c0, 0x6499, 0x684b, 0x001c, 0x0078,
++	0x64b1, 0xd6dc, 0x0040, 0x64a4, 0x684b, 0x0015, 0x7318, 0x6b62,
++	0x731c, 0x6b5e, 0x0078, 0x64b1, 0xd6d4, 0x0040, 0x64af, 0x684b,
++	0x0007, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078, 0x64b1, 0x684b,
++	0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854, 0x6856, 0xa01e, 0xd6c4,
++	0x0040, 0x64c6, 0x7328, 0x732c, 0x6b56, 0x037e, 0x2308, 0x2019,
++	0x7c98, 0xad90, 0x0019, 0x1078, 0x6841, 0x037f, 0xd6cc, 0x0040,
++	0x64e6, 0x7124, 0x695a, 0xa192, 0x0021, 0x00c8, 0x64da, 0x2071,
++	0x7c98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078, 0x6841,
++	0x0078, 0x64e6, 0x7838, 0xd0fc, 0x0040, 0x64e3, 0x2009, 0x0020,
++	0x695a, 0x0078, 0x64cf, 0x2d78, 0x1078, 0x67d9, 0x0d7f, 0x0e7f,
++	0x0f7f, 0x077f, 0x007c, 0x0f7e, 0x6003, 0x0003, 0x2079, 0x7c8c,
++	0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010, 0x2078, 0x7c12, 0x7b16,
++	0x7e0a, 0x7d0e, 0x0f7f, 0x2c10, 0x1078, 0x19c7, 0x1078, 0x5681,
++	0x007c, 0x0d7e, 0x6003, 0x0002, 0x1078, 0x4d45, 0x1078, 0x4e56,
++	0x6110, 0x2168, 0x694c, 0xd1e4, 0x0040, 0x6561, 0xd1cc, 0x0040,
++	0x653c, 0x6948, 0x6838, 0xd0fc, 0x0040, 0x6534, 0x017e, 0x684c,
++	0x007e, 0x6850, 0x007e, 0xad90, 0x000d, 0xa198, 0x000d, 0x2009,
++	0x0020, 0x157e, 0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, 0x00f0,
++	0x6523, 0x157f, 0x007f, 0x6852, 0x007f, 0x684e, 0x017f, 0x2168,
++	0x1078, 0x1350, 0x0078, 0x655f, 0x017e, 0x1078, 0x1350, 0x0d7f,
++	0x1078, 0x682e, 0x0078, 0x655f, 0x6837, 0x0103, 0x6944, 0xa184,
++	0x00ff, 0xa186, 0x0002, 0x0040, 0x655b, 0xa086, 0x0028, 0x00c0,
++	0x654d, 0x684b, 0x001c, 0x0078, 0x655d, 0xd1dc, 0x0040, 0x6554,
++	0x684b, 0x0015, 0x0078, 0x655d, 0xd1d4, 0x0040, 0x655b, 0x684b,
++	0x0007, 0x0078, 0x655d, 0x684b, 0x0000, 0x1078, 0x3b92, 0x1078,
++	0x5d1a, 0x0d7f, 0x007c, 0x2019, 0x0001, 0x1078, 0x5880, 0x6003,
++	0x0002, 0x1078, 0x4d45, 0x1078, 0x4e56, 0x007c, 0x1078, 0x4d45,
++	0x1078, 0x22b5, 0x0d7e, 0x6110, 0x2168, 0x1078, 0x6a58, 0x0040,
++	0x6581, 0x6837, 0x0103, 0x684b, 0x0029, 0x1078, 0x3b92, 0x1078,
++	0x6ba9, 0x0d7f, 0x1078, 0x5d1a, 0x1078, 0x4e56, 0x007c, 0x684b,
++	0x0015, 0xd1fc, 0x0040, 0x6593, 0x684b, 0x0007, 0x8002, 0x8000,
++	0x810a, 0xa189, 0x0000, 0x6962, 0x685e, 0x007c, 0xa182, 0x0040,
++	0x0079, 0x659a, 0x65aa, 0x65aa, 0x65aa, 0x65aa, 0x65aa, 0x65ac,
++	0x65aa, 0x6650, 0x6658, 0x65aa, 0x65aa, 0x65aa, 0x65aa, 0x65aa,
++	0x65aa, 0x65aa, 0x1078, 0x12cd, 0x077e, 0x0f7e, 0x0e7e, 0x0d7e,
++	0x2071, 0x7c8c, 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x7e46,
++	0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e,
++	0x86ff, 0x0040, 0x6642, 0xa694, 0xff00, 0xa284, 0x0c00, 0x0040,
++	0x65cd, 0x7018, 0x7862, 0x701c, 0x785e, 0xa284, 0x0300, 0x0040,
++	0x663f, 0x1078, 0x1327, 0x1040, 0x12cd, 0x2d00, 0x784a, 0x7f4c,
++	0xa7bd, 0x0200, 0x7f4e, 0x6837, 0x0103, 0x7838, 0x683a, 0x783c,
++	0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x00ff, 0xa186, 0x0002,
++	0x0040, 0x6608, 0xa186, 0x0028, 0x00c0, 0x65f2, 0x684b, 0x001c,
++	0x0078, 0x660a, 0xd6dc, 0x0040, 0x65fd, 0x684b, 0x0015, 0x7318,
++	0x6b62, 0x731c, 0x6b5e, 0x0078, 0x660a, 0xd6d4, 0x0040, 0x6608,
++	0x684b, 0x0007, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078, 0x660a,
++	0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854, 0x6856, 0xa01e,
++	0xd6c4, 0x0040, 0x661f, 0x7328, 0x732c, 0x6b56, 0x037e, 0x2308,
++	0x2019, 0x7c98, 0xad90, 0x0019, 0x1078, 0x6841, 0x037f, 0xd6cc,
++	0x0040, 0x663f, 0x7124, 0x695a, 0xa192, 0x0021, 0x00c8, 0x6633,
++	0x2071, 0x7c98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078,
++	0x6841, 0x0078, 0x663f, 0x7838, 0xd0fc, 0x0040, 0x663c, 0x2009,
++	0x0020, 0x695a, 0x0078, 0x6628, 0x2d78, 0x1078, 0x67d9, 0xd6dc,
++	0x00c0, 0x6645, 0xa006, 0x0078, 0x6649, 0x2001, 0x0001, 0x7218,
++	0x731c, 0x1078, 0x15ae, 0x0d7f, 0x0e7f, 0x0f7f, 0x077f, 0x007c,
++	0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, 0x156a, 0x007c,
++	0x0d7e, 0x6003, 0x0002, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0040,
++	0x66bf, 0xd1cc, 0x0040, 0x668f, 0x6948, 0x6838, 0xd0fc, 0x0040,
++	0x6687, 0x017e, 0x684c, 0x007e, 0x6850, 0x007e, 0xad90, 0x000d,
++	0xa198, 0x000d, 0x2009, 0x0020, 0x157e, 0x21a8, 0x2304, 0x2012,
++	0x8318, 0x8210, 0x00f0, 0x6676, 0x157f, 0x007f, 0x6852, 0x007f,
++	0x684e, 0x017f, 0x2168, 0x1078, 0x1350, 0x0078, 0x66bd, 0x017e,
++	0x1078, 0x1350, 0x0d7f, 0x1078, 0x682e, 0x0078, 0x66bd, 0x6837,
++	0x0103, 0x6944, 0xa184, 0x00ff, 0xa186, 0x0002, 0x0040, 0x66ae,
++	0xa086, 0x0028, 0x00c0, 0x66a0, 0x684b, 0x001c, 0x0078, 0x66bb,
++	0xd1dc, 0x0040, 0x66a7, 0x684b, 0x0015, 0x0078, 0x66bb, 0xd1d4,
++	0x0040, 0x66ae, 0x684b, 0x0007, 0x0078, 0x66bb, 0x684b, 0x0000,
++	0x684c, 0xd0ac, 0x0040, 0x66bb, 0x6810, 0x6914, 0xa115, 0x0040,
++	0x66bb, 0x1078, 0x6587, 0x1078, 0x3b92, 0x1078, 0x5d1a, 0x0d7f,
++	0x007c, 0x1078, 0x4c9d, 0x0078, 0x66c7, 0x1078, 0x4d45, 0x1078,
++	0x6a58, 0x0040, 0x66de, 0x0d7e, 0x6110, 0x2168, 0x6837, 0x0103,
++	0x2009, 0x770c, 0x210c, 0xd18c, 0x00c0, 0x66e7, 0xd184, 0x00c0,
++	0x66e3, 0x6108, 0x694a, 0x1078, 0x3b92, 0x0d7f, 0x1078, 0x5d1a,
++	0x1078, 0x4d96, 0x007c, 0x684b, 0x0004, 0x0078, 0x66db, 0x684b,
++	0x0004, 0x0078, 0x66db, 0xa182, 0x0040, 0x0079, 0x66ef, 0x66ff,
++	0x66ff, 0x66ff, 0x66ff, 0x66ff, 0x6701, 0x66ff, 0x6704, 0x66ff,
++	0x66ff, 0x66ff, 0x66ff, 0x66ff, 0x66ff, 0x66ff, 0x66ff, 0x1078,
++	0x12cd, 0x1078, 0x5d1a, 0x007c, 0x007e, 0x027e, 0xa016, 0x1078,
++	0x156a, 0x027f, 0x007f, 0x007c, 0xa182, 0x0085, 0x0079, 0x6710,
++	0x6719, 0x6717, 0x6717, 0x6717, 0x6717, 0x6717, 0x6717, 0x1078,
++	0x12cd, 0x6003, 0x0001, 0x6106, 0x1078, 0x4941, 0x127e, 0x2091,
++	0x8000, 0x1078, 0x4d96, 0x127f, 0x007c, 0xa186, 0x0013, 0x00c0,
++	0x672f, 0x6004, 0xa082, 0x0085, 0x2008, 0x0079, 0x6763, 0xa186,
++	0x0027, 0x00c0, 0x6750, 0x1078, 0x4c9d, 0x1078, 0x22b5, 0x0d7e,
++	0x6010, 0x2068, 0x1078, 0x6a58, 0x0040, 0x6746, 0x6837, 0x0103,
++	0x684b, 0x0029, 0x1078, 0x3b92, 0x1078, 0x6ba9, 0x0d7f, 0x1078,
++	0x5d1a, 0x1078, 0x4d96, 0x007c, 0x1078, 0x5d4f, 0x0078, 0x674b,
++	0xa186, 0x0014, 0x00c0, 0x674c, 0x1078, 0x4c9d, 0x0d7e, 0x6010,
++	0x2068, 0x1078, 0x6a58, 0x0040, 0x6746, 0x6837, 0x0103, 0x684b,
++	0x0006, 0x0078, 0x6742, 0x676c, 0x676a, 0x676a, 0x676a, 0x676a,
++	0x676a, 0x6775, 0x1078, 0x12cd, 0x1078, 0x4c9d, 0x6017, 0x0014,
++	0x6003, 0x000c, 0x1078, 0x4d96, 0x007c, 0x1078, 0x4c9d, 0x6017,
++	0x0014, 0x6003, 0x000e, 0x1078, 0x4d96, 0x007c, 0xa182, 0x008c,
++	0x00c8, 0x6788, 0xa182, 0x0085, 0x0048, 0x6788, 0x0079, 0x678b,
++	0x1078, 0x5d4f, 0x007c, 0x6792, 0x6792, 0x6792, 0x6792, 0x6794,
++	0x67b3, 0x6792, 0x1078, 0x12cd, 0x0d7e, 0x1078, 0x6ba9, 0x1078,
++	0x6a58, 0x0040, 0x67af, 0x6010, 0x2068, 0x6837, 0x0103, 0x6850,
++	0xd0b4, 0x0040, 0x67a7, 0x684b, 0x0006, 0x0078, 0x67ab, 0x684b,
++	0x0005, 0x1078, 0x6c5c, 0x6847, 0x0000, 0x1078, 0x3b92, 0x1078,
++	0x5d1a, 0x0d7f, 0x007c, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x6a58,
++	0x0040, 0x67ce, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0040, 0x67c4,
++	0x684b, 0x0006, 0x0078, 0x67c8, 0x684b, 0x0005, 0x1078, 0x6c5c,
++	0x6847, 0x0000, 0x1078, 0x3b92, 0x1078, 0x6ba9, 0x0d7f, 0x1078,
++	0x5d1a, 0x007c, 0x1078, 0x4c9d, 0x1078, 0x5d1a, 0x1078, 0x4d96,
++	0x007c, 0x057e, 0x067e, 0x0d7e, 0x0f7e, 0x2029, 0x0001, 0xa182,
++	0x0101, 0x00c8, 0x67e5, 0x0078, 0x67e7, 0x2009, 0x0100, 0x2130,
++	0x2069, 0x7c98, 0x831c, 0x2300, 0xad18, 0x2009, 0x0020, 0xaf90,
++	0x001d, 0x1078, 0x6841, 0xa6b2, 0x0020, 0x7804, 0xa06d, 0x0040,
++	0x67fb, 0x1078, 0x1350, 0x1078, 0x1327, 0x0040, 0x6825, 0x8528,
++	0x6837, 0x0110, 0x683b, 0x0000, 0x2d20, 0x7c06, 0xa68a, 0x003d,
++	0x00c8, 0x6811, 0x2608, 0xad90, 0x000f, 0x1078, 0x6841, 0x0078,
++	0x6825, 0xa6b2, 0x003c, 0x2009, 0x003c, 0x2d78, 0xad90, 0x000f,
++	0x1078, 0x6841, 0x0078, 0x67fb, 0x0f7f, 0x852f, 0xa5ad, 0x0003,
++	0x7d36, 0xa5ac, 0x0000, 0x0078, 0x682a, 0x0f7f, 0x852f, 0xa5ad,
++	0x0003, 0x7d36, 0x0d7f, 0x067f, 0x057f, 0x007c, 0x0f7e, 0x8dff,
++	0x0040, 0x683f, 0x6804, 0xa07d, 0x0040, 0x683d, 0x6807, 0x0000,
++	0x1078, 0x3b92, 0x2f68, 0x0078, 0x6832, 0x1078, 0x3b92, 0x0f7f,
++	0x007c, 0x157e, 0xa184, 0x0001, 0x0040, 0x6847, 0x8108, 0x810c,
++	0x21a8, 0x2304, 0x8007, 0x2012, 0x8318, 0x8210, 0x00f0, 0x6849,
++	0x157f, 0x007c, 0x127e, 0x2091, 0x8000, 0x601c, 0xa084, 0x000f,
++	0x1079, 0x685c, 0x127f, 0x007c, 0x686b, 0x6864, 0x6866, 0x6884,
++	0x6864, 0x6866, 0x6866, 0x6866, 0x1078, 0x12cd, 0xa006, 0x007c,
++	0xa085, 0x0001, 0x007c, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x6a58,
++	0x0040, 0x6881, 0xa00e, 0x2001, 0x0005, 0x1078, 0x3c22, 0x1078,
++	0x6c5c, 0x1078, 0x3b92, 0x1078, 0x5d1a, 0xa085, 0x0001, 0x0d7f,
++	0x007c, 0xa006, 0x0078, 0x687f, 0x6000, 0xa08a, 0x0010, 0x10c8,
++	0x12cd, 0x1079, 0x688c, 0x007c, 0x689c, 0x68b9, 0x689e, 0x68ca,
++	0x68b5, 0x689c, 0x6866, 0x686b, 0x686b, 0x6866, 0x6866, 0x6866,
++	0x6866, 0x6866, 0x6866, 0x6866, 0x1078, 0x12cd, 0x0d7e, 0x6010,
++	0x2068, 0x1078, 0x6a58, 0x0040, 0x68a7, 0x1078, 0x6c5c, 0x0d7f,
++	0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x1078, 0x4941,
++	0x1078, 0x4d96, 0xa085, 0x0001, 0x007c, 0x1078, 0x166e, 0x0078,
++	0x689e, 0x0e7e, 0x2071, 0x7936, 0x7024, 0xac06, 0x00c0, 0x68c2,
++	0x1078, 0x57ee, 0x1078, 0x5725, 0x0e7f, 0x00c0, 0x689e, 0x1078,
++	0x6866, 0x007c, 0x037e, 0x0e7e, 0x2071, 0x7936, 0x703c, 0xac06,
++	0x00c0, 0x68da, 0x2019, 0x0000, 0x1078, 0x5880, 0x0e7f, 0x037f,
++	0x0078, 0x689e, 0x1078, 0x5b5c, 0x0e7f, 0x037f, 0x00c0, 0x689e,
++	0x1078, 0x6866, 0x007c, 0x0c7e, 0x601c, 0xa084, 0x000f, 0x1079,
++	0x68eb, 0x0c7f, 0x007c, 0x68fa, 0x6957, 0x69fc, 0x68fe, 0x68fa,
++	0x68fa, 0x72dd, 0x5d1a, 0x6957, 0x1078, 0x6be3, 0x00c0, 0x68fa,
++	0x1078, 0x5f6d, 0x007c, 0x6017, 0x0001, 0x007c, 0x6000, 0xa08a,
++	0x0010, 0x10c8, 0x12cd, 0x1079, 0x6906, 0x007c, 0x6916, 0x6918,
++	0x6938, 0x694a, 0x694a, 0x6916, 0x68fa, 0x68fa, 0x68fa, 0x694a,
++	0x694a, 0x6916, 0x6916, 0x6916, 0x6916, 0x6954, 0x1078, 0x12cd,
++	0x0e7e, 0x6010, 0x2070, 0x7050, 0xc0b5, 0x7052, 0x2071, 0x7936,
++	0x7024, 0xac06, 0x0040, 0x6934, 0x1078, 0x5725, 0x6007, 0x0085,
++	0x6003, 0x000b, 0x601f, 0x0002, 0x6017, 0x0014, 0x1078, 0x4941,
++	0x1078, 0x4d96, 0x0e7f, 0x007c, 0x6017, 0x0001, 0x0078, 0x6932,
++	0x0d7e, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852, 0x0d7f, 0x6007,
++	0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x1078, 0x4941, 0x1078,
++	0x4d96, 0x007c, 0x0d7e, 0x6017, 0x0001, 0x6010, 0x2068, 0x6850,
++	0xc0b5, 0x6852, 0x0d7f, 0x007c, 0x1078, 0x5d1a, 0x007c, 0x6000,
++	0xa08a, 0x0010, 0x10c8, 0x12cd, 0x1079, 0x695f, 0x007c, 0x696f,
++	0x68fb, 0x6971, 0x696f, 0x6971, 0x696f, 0x696f, 0x696f, 0x68f4,
++	0x68f4, 0x696f, 0x696f, 0x696f, 0x696f, 0x696f, 0x696f, 0x1078,
++	0x12cd, 0x0d7e, 0x6018, 0x2068, 0x6804, 0xa084, 0x00ff, 0x0d7f,
++	0xa08a, 0x000c, 0x10c8, 0x12cd, 0x1079, 0x697f, 0x007c, 0x698b,
++	0x69aa, 0x698b, 0x69aa, 0x698b, 0x69aa, 0x698d, 0x6996, 0x698b,
++	0x69aa, 0x698b, 0x69a3, 0x1078, 0x12cd, 0x6004, 0xa08e, 0x0004,
++	0x0040, 0x69a5, 0xa08e, 0x0002, 0x0040, 0x69a5, 0x6004, 0x1078,
++	0x6be3, 0x0040, 0x69f4, 0xa08e, 0x0021, 0x0040, 0x69f8, 0xa08e,
++	0x0022, 0x0040, 0x69f4, 0x1078, 0x22b5, 0x1078, 0x5f6d, 0x1078,
++	0x5d1a, 0x007c, 0x0c7e, 0x0d7e, 0x6104, 0xa186, 0x0016, 0x0040,
++	0x69e4, 0xa186, 0x0002, 0x00c0, 0x69d3, 0x6018, 0x2068, 0x68a0,
++	0xd0bc, 0x00c0, 0x69d3, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0040,
++	0x69d3, 0x8001, 0x6842, 0x6013, 0x0000, 0x601f, 0x0007, 0x6017,
++	0x0398, 0x1078, 0x5cb4, 0x0040, 0x69d3, 0x2d00, 0x601a, 0x601f,
++	0x0001, 0x0078, 0x69e4, 0x0d7f, 0x0c7f, 0x1078, 0x5f6d, 0x1078,
++	0x22b5, 0x0e7e, 0x127e, 0x2091, 0x8000, 0x1078, 0x22d7, 0x127f,
++	0x0e7f, 0x1078, 0x5d1a, 0x007c, 0x2001, 0x0002, 0x1078, 0x37f4,
++	0x6003, 0x0001, 0x6007, 0x0002, 0x1078, 0x498e, 0x1078, 0x4d96,
++	0x0d7f, 0x0c7f, 0x0078, 0x69e3, 0x1078, 0x5f6d, 0x0078, 0x69a7,
++	0x1078, 0x5f7c, 0x0078, 0x69a7, 0x6000, 0xa08a, 0x0010, 0x10c8,
++	0x12cd, 0x1079, 0x6a04, 0x007c, 0x6a14, 0x6a14, 0x6a14, 0x6a14,
++	0x6a14, 0x6a14, 0x6a14, 0x6a14, 0x6a14, 0x68fa, 0x6a14, 0x68fb,
++	0x6a16, 0x68fb, 0x6a1f, 0x6a14, 0x1078, 0x12cd, 0x6007, 0x008b,
++	0x6003, 0x000d, 0x1078, 0x4941, 0x1078, 0x4d96, 0x007c, 0x1078,
++	0x6ba9, 0x1078, 0x6a58, 0x0040, 0x6a41, 0x1078, 0x22b5, 0x0d7e,
++	0x1078, 0x6a58, 0x0040, 0x6a34, 0x6010, 0x2068, 0x6837, 0x0103,
++	0x684b, 0x0006, 0x1078, 0x3b92, 0x0d7f, 0x601f, 0x0001, 0x6007,
++	0x0001, 0x6003, 0x0001, 0x1078, 0x498e, 0x1078, 0x4d96, 0x0078,
++	0x6a43, 0x1078, 0x5d1a, 0x007c, 0xa284, 0x0007, 0x00c0, 0x6a55,
++	0xa282, 0x7e00, 0x0048, 0x6a55, 0x2001, 0x7715, 0x2004, 0xa202,
++	0x00c8, 0x6a55, 0xa085, 0x0001, 0x007c, 0xa006, 0x0078, 0x6a54,
++	0x027e, 0x0e7e, 0x2071, 0x7700, 0x6210, 0x7058, 0xa202, 0x0048,
++	0x6a6a, 0x705c, 0xa202, 0x00c8, 0x6a6a, 0xa085, 0x0001, 0x0e7f,
++	0x027f, 0x007c, 0xa006, 0x0078, 0x6a67, 0x0e7e, 0x0c7e, 0x037e,
++	0x007e, 0x127e, 0x2091, 0x8000, 0x2061, 0x7e00, 0x2071, 0x7700,
++	0x7344, 0x7060, 0xa302, 0x00c8, 0x6a93, 0x601c, 0xa206, 0x00c0,
++	0x6a8b, 0x1078, 0x6be3, 0x00c0, 0x6a87, 0x1078, 0x5f6d, 0x0c7e,
++	0x1078, 0x5d1a, 0x0c7f, 0xace0, 0x0008, 0x7054, 0xac02, 0x00c8,
++	0x6a93, 0x0078, 0x6a78, 0x127f, 0x007f, 0x037f, 0x0c7f, 0x0e7f,
++	0x007c, 0x0e7e, 0x0c7e, 0x017e, 0xa188, 0x7820, 0x210c, 0x81ff,
++	0x0040, 0x6ab1, 0x2061, 0x7e00, 0x2071, 0x7700, 0x017e, 0x1078,
++	0x5cb4, 0x017f, 0x0040, 0x6ab4, 0x611a, 0x1078, 0x22b5, 0x1078,
++	0x5d1a, 0xa006, 0x0078, 0x6ab6, 0xa085, 0x0001, 0x017f, 0x0c7f,
++	0x0e7f, 0x007c, 0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000, 0x0c7e,
++	0x1078, 0x5cb4, 0x057f, 0x0040, 0x6ad3, 0x6612, 0x651a, 0x601f,
++	0x0003, 0x2009, 0x004b, 0x1078, 0x5d41, 0xa085, 0x0001, 0x127f,
++	0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x6acf, 0x0c7e, 0x057e,
++	0x127e, 0x2091, 0x8000, 0x62a0, 0x0c7e, 0x1078, 0x5cb4, 0x057f,
++	0x0040, 0x6afd, 0x6013, 0x0000, 0x651a, 0x601f, 0x0003, 0x0c7e,
++	0x2560, 0x1078, 0x3a36, 0x0c7f, 0x1078, 0x4a7e, 0x1078, 0x49c1,
++	0x2c08, 0x1078, 0x747b, 0x2009, 0x004c, 0x1078, 0x5d41, 0xa085,
++	0x0001, 0x127f, 0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x6af9,
++	0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000, 0x62a0, 0x0c7e, 0x1078,
++	0x5cb4, 0x057f, 0x0040, 0x6b28, 0x6612, 0x651a, 0x601f, 0x0003,
++	0x2019, 0x0005, 0x0c7e, 0x2560, 0x1078, 0x3a36, 0x0c7f, 0x1078,
++	0x4a7e, 0x1078, 0x49c1, 0x2c08, 0x1078, 0x747b, 0x2009, 0x004d,
++	0x1078, 0x5d41, 0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f, 0x007c,
++	0xa006, 0x0078, 0x6b24, 0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000,
++	0x62a0, 0x0c7e, 0x1078, 0x5cb4, 0x057f, 0x0040, 0x6b53, 0x6612,
++	0x651a, 0x601f, 0x0003, 0x2019, 0x0005, 0x0c7e, 0x2560, 0x1078,
++	0x3a36, 0x0c7f, 0x1078, 0x4a7e, 0x1078, 0x49c1, 0x2c08, 0x1078,
++	0x747b, 0x2009, 0x004e, 0x1078, 0x5d41, 0xa085, 0x0001, 0x127f,
++	0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x6b4f, 0x0c7e, 0x127e,
++	0x2091, 0x8000, 0x0c7e, 0x1078, 0x5cb4, 0x017f, 0x0040, 0x6b6f,
++	0x660a, 0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x001f,
++	0x1078, 0x5d41, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006,
++	0x0078, 0x6b6c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078,
++	0x5cb4, 0x017f, 0x0040, 0x6b8b, 0x660a, 0x611a, 0x601f, 0x0008,
++	0x2d00, 0x6012, 0x2009, 0x0021, 0x1078, 0x5d41, 0xa085, 0x0001,
++	0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x6b88, 0x0c7e, 0x127e,
++	0x2091, 0x8000, 0x0c7e, 0x1078, 0x5cb4, 0x017f, 0x0040, 0x6ba6,
++	0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0000, 0x1078,
++	0x5d41, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078,
++	0x6ba3, 0x027e, 0x0d7e, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0040,
++	0x6bb3, 0x8211, 0x6a3e, 0x0d7f, 0x027f, 0x007c, 0x6013, 0x0000,
++	0x601f, 0x0007, 0x6017, 0x0014, 0x007c, 0x067e, 0x0c7e, 0x0d7e,
++	0x2031, 0x7752, 0x2634, 0xd6e4, 0x0040, 0x6bcb, 0x6618, 0x2660,
++	0x6e48, 0x1078, 0x3942, 0x0d7f, 0x0c7f, 0x067f, 0x007c, 0x007e,
++	0x017e, 0x6004, 0xa08e, 0x0002, 0x0040, 0x6be0, 0xa08e, 0x0003,
++	0x0040, 0x6be0, 0xa08e, 0x0004, 0x0040, 0x6be0, 0xa085, 0x0001,
++	0x017f, 0x007f, 0x007c, 0x007e, 0x017e, 0x6004, 0xa08e, 0x0000,
++	0x0040, 0x6bf8, 0xa08e, 0x001f, 0x0040, 0x6bf8, 0xa08e, 0x0028,
++	0x0040, 0x6bf8, 0xa08e, 0x0029, 0x0040, 0x6bf8, 0xa085, 0x0001,
++	0x017f, 0x007f, 0x007c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e,
++	0x1078, 0x5cb4, 0x017f, 0x0040, 0x6c15, 0x611a, 0x601f, 0x0001,
++	0x2d00, 0x6012, 0x1078, 0x22b5, 0x2009, 0x0028, 0x1078, 0x5d41,
++	0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x6c12,
++	0xa186, 0x0015, 0x00c0, 0x6c2d, 0x2011, 0x771e, 0x2204, 0xa086,
++	0x0074, 0x00c0, 0x6c2d, 0x1078, 0x61ea, 0x6003, 0x0001, 0x6007,
++	0x0029, 0x1078, 0x498e, 0x0078, 0x6c31, 0x1078, 0x5f6d, 0x1078,
++	0x5d1a, 0x007c, 0xa186, 0x0015, 0x00c0, 0x6c4f, 0x2011, 0x771e,
++	0x2204, 0xa086, 0x0014, 0x00c0, 0x6c4f, 0x0d7e, 0x6018, 0x2068,
++	0x1078, 0x38c8, 0x0d7f, 0x1078, 0x61f4, 0x00c0, 0x6c4f, 0x2001,
++	0x0006, 0x1078, 0x37f4, 0x1078, 0x5dc5, 0x0078, 0x6c53, 0x1078,
++	0x5f6d, 0x1078, 0x5d1a, 0x007c, 0x6848, 0xa086, 0x0005, 0x00c0,
++	0x6c5b, 0x1078, 0x6c5c, 0x007c, 0x6850, 0xc0ad, 0x6852, 0x007c,
++	0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12cd, 0x1079, 0x6c6a,
++	0x067f, 0x007c, 0x6c7a, 0x6e51, 0x6f32, 0x6c7a, 0x6c7a, 0x6c7a,
++	0x6c7a, 0x6c7a, 0x6cb4, 0x6fa0, 0x6c7a, 0x6c7a, 0x6c7a, 0x6c7a,
++	0x6c7a, 0x6c7a, 0x1078, 0x12cd, 0x067e, 0x6000, 0xa0b2, 0x0010,
++	0x10c8, 0x12cd, 0x1079, 0x6c86, 0x067f, 0x007c, 0x6c96, 0x728c,
++	0x6c96, 0x6c96, 0x6c96, 0x6c96, 0x6c96, 0x6c96, 0x7267, 0x72d6,
++	0x6c96, 0x6c96, 0x6c96, 0x6c96, 0x6c96, 0x6c96, 0x1078, 0x12cd,
++	0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12cd, 0x1079, 0x6ca2,
++	0x067f, 0x007c, 0x6cb2, 0x70d8, 0x714a, 0x716c, 0x71b8, 0x6cb2,
++	0x6cb2, 0x7212, 0x6fac, 0x724f, 0x7253, 0x6cb2, 0x6cb2, 0x6cb2,
++	0x6cb2, 0x6cb2, 0x1078, 0x12cd, 0xa1b2, 0x0030, 0x10c8, 0x12cd,
++	0x2100, 0x0079, 0x6cbb, 0x6ceb, 0x6dc8, 0x6ceb, 0x6ceb, 0x6ceb,
++	0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb,
++	0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb,
++	0x6ceb, 0x6ceb, 0x6ced, 0x6d1c, 0x6d27, 0x6d4f, 0x6d55, 0x6d89,
++	0x6dc1, 0x6ceb, 0x6ceb, 0x6dd0, 0x6ceb, 0x6ceb, 0x6dd7, 0x6dde,
++	0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6dfb, 0x6ceb, 0x6ceb,
++	0x6e06, 0x6ceb, 0x6ceb, 0x1078, 0x12cd, 0x1078, 0x3b3e, 0x6618,
++	0x0c7e, 0x2660, 0x1078, 0x385e, 0x0c7f, 0xa6b0, 0x0001, 0x2634,
++	0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x6d0e, 0x1078, 0x73b7,
++	0x00c0, 0x6d49, 0x1078, 0x7355, 0x00c0, 0x6d0a, 0x6007, 0x0008,
++	0x0078, 0x6dc3, 0x6007, 0x0009, 0x0078, 0x6dc3, 0x1078, 0x754c,
++	0x0040, 0x6d18, 0x1078, 0x73b7, 0x0040, 0x6d02, 0x0078, 0x6d49,
++	0x6013, 0x1900, 0x0078, 0x6d0a, 0x6106, 0x1078, 0x7317, 0x6007,
++	0x0006, 0x0078, 0x6dc3, 0x6007, 0x0007, 0x0078, 0x6dc3, 0x0d7e,
++	0x6618, 0x2668, 0x6e04, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006,
++	0x0040, 0x6d39, 0xa686, 0x0004, 0x0040, 0x6d39, 0x0d7f, 0x0078,
++	0x6d49, 0x1078, 0x7415, 0x00c0, 0x6d44, 0x1078, 0x38c8, 0x6007,
++	0x000a, 0x0d7f, 0x0078, 0x6dc3, 0x6007, 0x000b, 0x0d7f, 0x0078,
++	0x6dc3, 0x1078, 0x22b5, 0x6007, 0x0001, 0x0078, 0x6dc3, 0x1078,
++	0x22b5, 0x6007, 0x000c, 0x0078, 0x6dc3, 0x1078, 0x3b3e, 0x6618,
++	0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0048,
++	0x6d76, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x00c0, 0x6d49,
++	0x1078, 0x7424, 0x00c0, 0x6d70, 0x6007, 0x000e, 0x0078, 0x6dc3,
++	0x1078, 0x22b5, 0x6007, 0x000f, 0x0078, 0x6dc3, 0x1078, 0x754c,
++	0x0040, 0x6d83, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040,
++	0x6d68, 0x0078, 0x6d49, 0x6013, 0x1900, 0x6007, 0x0009, 0x0078,
++	0x6dc3, 0x1078, 0x3b3e, 0x6618, 0xa6b0, 0x0001, 0x2634, 0xa684,
++	0x00ff, 0xa082, 0x0006, 0x0048, 0x6dae, 0xa6b4, 0xff00, 0x8637,
++	0xa686, 0x0006, 0x00c0, 0x6d49, 0x1078, 0x744f, 0x00c0, 0x6da8,
++	0x1078, 0x7355, 0x00c0, 0x6da8, 0x6007, 0x0010, 0x0078, 0x6dc3,
++	0x1078, 0x22b5, 0x6007, 0x0011, 0x0078, 0x6dc3, 0x1078, 0x754c,
++	0x0040, 0x6dbb, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040,
++	0x6d9c, 0x0078, 0x6d49, 0x6013, 0x1900, 0x6007, 0x0009, 0x0078,
++	0x6dc3, 0x6007, 0x0012, 0x6003, 0x0001, 0x1078, 0x498e, 0x007c,
++	0x6007, 0x0001, 0x6003, 0x0001, 0x1078, 0x498e, 0x0078, 0x6dc7,
++	0x6007, 0x0020, 0x6003, 0x0001, 0x1078, 0x498e, 0x007c, 0x6007,
++	0x0023, 0x6003, 0x0001, 0x1078, 0x498e, 0x007c, 0x017e, 0x027e,
++	0x2011, 0x7c88, 0x2214, 0x2c08, 0x1078, 0x7614, 0x00c0, 0x6def,
++	0x2160, 0x6007, 0x0026, 0x6013, 0x1700, 0x0078, 0x6df4, 0x1078,
++	0x5d1a, 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x1078, 0x498e,
++	0x027f, 0x017f, 0x007c, 0x6106, 0x1078, 0x6e0d, 0x6007, 0x002b,
++	0x0078, 0x6dc3, 0x6007, 0x002c, 0x0078, 0x6dc3, 0x6106, 0x1078,
++	0x6e12, 0x6007, 0x002e, 0x0078, 0x6dc3, 0x0d7e, 0x1078, 0x6e38,
++	0x0d7f, 0x007c, 0x0d7e, 0x1078, 0x6e47, 0x00c0, 0x6e31, 0x680c,
++	0xa08c, 0xff00, 0x6824, 0xa084, 0x00ff, 0xa115, 0x6212, 0xd1e4,
++	0x0040, 0x6e26, 0x2009, 0x0001, 0x0078, 0x6e2d, 0xd1ec, 0x0040,
++	0x6e31, 0x2009, 0x0000, 0xa294, 0x00ff, 0x1078, 0x22f9, 0x0078,
++	0x6e35, 0xa085, 0x0001, 0x0078, 0x6e36, 0xa006, 0x0d7f, 0x007c,
++	0x2069, 0x7c8d, 0x6800, 0xa082, 0x0010, 0x00c8, 0x6e45, 0x6013,
++	0x0000, 0xa085, 0x0001, 0x0078, 0x6e46, 0xa006, 0x007c, 0x6013,
++	0x0000, 0x2069, 0x7c8c, 0x6808, 0xa084, 0xff00, 0xa086, 0x0800,
++	0x007c, 0x6004, 0xa0b2, 0x0030, 0x10c8, 0x12cd, 0xa1b6, 0x0013,
++	0x00c0, 0x6e5d, 0x2008, 0x0079, 0x6e70, 0xa1b6, 0x0027, 0x0040,
++	0x6e65, 0xa1b6, 0x0014, 0x10c0, 0x12cd, 0x2001, 0x0007, 0x1078,
++	0x3802, 0x1078, 0x4c9d, 0x1078, 0x6bb6, 0x1078, 0x4d96, 0x007c,
++	0x6ea0, 0x6ea2, 0x6ea0, 0x6ea0, 0x6ea0, 0x6ea2, 0x6eaa, 0x6f0d,
++	0x6ed0, 0x6f0d, 0x6ee4, 0x6f0d, 0x6eaa, 0x6f0d, 0x6f05, 0x6f0d,
++	0x6f05, 0x6f0d, 0x6f0d, 0x6ea0, 0x6ea0, 0x6ea0, 0x6ea0, 0x6ea0,
++	0x6ea0, 0x6ea0, 0x6ea0, 0x6ea0, 0x6ea0, 0x6ea0, 0x6ea0, 0x6ea0,
++	0x6f0d, 0x6ea0, 0x6ea0, 0x6f0d, 0x6ea0, 0x6f0d, 0x6f0d, 0x6ea0,
++	0x6ea0, 0x6ea0, 0x6ea0, 0x6f0d, 0x6f0d, 0x6ea0, 0x6f0d, 0x6f0d,
++	0x1078, 0x12cd, 0x1078, 0x4c9d, 0x6003, 0x0002, 0x1078, 0x4d96,
++	0x0078, 0x6f13, 0x0f7e, 0x2079, 0x7751, 0x7804, 0x0f7f, 0xd0ac,
++	0x00c0, 0x6f0d, 0x2001, 0x0000, 0x1078, 0x37e0, 0x2001, 0x0002,
++	0x1078, 0x37f4, 0x1078, 0x4c9d, 0x601f, 0x0001, 0x6003, 0x0001,
++	0x6007, 0x0002, 0x1078, 0x498e, 0x1078, 0x4d96, 0x0c7e, 0x6118,
++	0x2160, 0x2009, 0x0001, 0x1078, 0x4696, 0x0c7f, 0x0078, 0x6f13,
++	0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa6b4, 0xff00, 0x8637,
++	0xa686, 0x0006, 0x0040, 0x6f0d, 0xa686, 0x0004, 0x0040, 0x6f0d,
++	0x2001, 0x0004, 0x0078, 0x6f0b, 0x2001, 0x7700, 0x2004, 0xa086,
++	0x0003, 0x00c0, 0x6eed, 0x1078, 0x2dd7, 0x2001, 0x0006, 0x1078,
++	0x6f14, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa6b4, 0xff00,
++	0x8637, 0xa686, 0x0006, 0x0040, 0x6f0d, 0x2001, 0x0006, 0x0078,
++	0x6f0b, 0x2001, 0x0004, 0x0078, 0x6f0b, 0x2001, 0x0006, 0x1078,
++	0x6f14, 0x0078, 0x6f0d, 0x1078, 0x3802, 0x1078, 0x4c9d, 0x1078,
++	0x5d1a, 0x1078, 0x4d96, 0x007c, 0x017e, 0x0d7e, 0x6118, 0x2168,
++	0x6900, 0xd184, 0x0040, 0x6f2f, 0x6104, 0xa18e, 0x000a, 0x00c0,
++	0x6f27, 0x699c, 0xd1a4, 0x00c0, 0x6f27, 0x2001, 0x0007, 0x1078,
++	0x37f4, 0x2001, 0x0000, 0x1078, 0x37e0, 0x1078, 0x22d7, 0x0d7f,
++	0x017f, 0x007c, 0x0d7e, 0x6618, 0x2668, 0x6804, 0xa084, 0xff00,
++	0x8007, 0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x12cd, 0xa1b6, 0x0015,
++	0x00c0, 0x6f46, 0x1079, 0x6f4d, 0x0078, 0x6f4c, 0xa1b6, 0x0016,
++	0x10c0, 0x12cd, 0x1079, 0x6f85, 0x007c, 0x5ff7, 0x5ff7, 0x5ff7,
++	0x5ff7, 0x5ff7, 0x5ff7, 0x5ff7, 0x6f59, 0x5ff7, 0x5ff7, 0x5ff7,
++	0x5ff7, 0x0f7e, 0x2079, 0x7751, 0x7804, 0x0f7f, 0xd0ac, 0x00c0,
++	0x6f75, 0x2001, 0x0000, 0x1078, 0x37e0, 0x2001, 0x0002, 0x1078,
++	0x37f4, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x1078,
++	0x498e, 0x1078, 0x4d96, 0x0078, 0x6f84, 0x2011, 0x7c83, 0x220c,
++	0x017e, 0x0c7e, 0x1078, 0x384c, 0x00c0, 0x6f84, 0x1078, 0x3637,
++	0x0c7f, 0x017f, 0x1078, 0x5d1a, 0x007c, 0x5ff7, 0x5ff7, 0x5ff7,
++	0x5ff7, 0x5ff7, 0x5ff7, 0x5ff7, 0x6f91, 0x5ff7, 0x5ff7, 0x5ff7,
++	0x5ff7, 0x1078, 0x61e7, 0x00c0, 0x6f9d, 0x6003, 0x0001, 0x6007,
++	0x0001, 0x1078, 0x498e, 0x0078, 0x6f9f, 0x1078, 0x5d1a, 0x007c,
++	0x6004, 0xa08a, 0x0030, 0x10c8, 0x12cd, 0x1078, 0x4c9d, 0x1078,
++	0x6bb6, 0x1078, 0x4d96, 0x007c, 0xa182, 0x0040, 0x0079, 0x6fb0,
++	0x6fc0, 0x6fc0, 0x6fc0, 0x6fc0, 0x6fc2, 0x6fc0, 0x6fc0, 0x6fc0,
++	0x6fc0, 0x6fc0, 0x6fc0, 0x6fc0, 0x6fc0, 0x6fc0, 0x6fc0, 0x6fc0,
++	0x1078, 0x12cd, 0x0d7e, 0x0e7e, 0x0f7e, 0x157e, 0x047e, 0x027e,
++	0x6106, 0x2071, 0x7c80, 0x7444, 0xa4a4, 0xe600, 0x0040, 0x7026,
++	0x2009, 0x0000, 0x0c7e, 0x1078, 0x4727, 0x2c68, 0x0c7f, 0x6a00,
++	0xa284, 0x0001, 0x0040, 0x7091, 0x1078, 0x47e6, 0x0040, 0x70bc,
++	0xa295, 0x0200, 0x6a02, 0x0078, 0x6feb, 0x2009, 0x0001, 0x2011,
++	0x0200, 0x1078, 0x47d0, 0x1078, 0x1327, 0x1040, 0x12cd, 0x6003,
++	0x0007, 0x2d00, 0x6837, 0x010d, 0x6803, 0x0000, 0x683b, 0x0000,
++	0x6c5a, 0x2c00, 0x685e, 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130,
++	0x694a, 0xa084, 0xff00, 0x6846, 0x684f, 0x0000, 0x6857, 0x0036,
++	0x1078, 0x3b92, 0xa486, 0x2000, 0x00c0, 0x7014, 0x2019, 0x0017,
++	0x1078, 0x75d9, 0x0078, 0x707e, 0xa486, 0x0400, 0x00c0, 0x701e,
++	0x2019, 0x0002, 0x1078, 0x75d9, 0x0078, 0x707e, 0xa486, 0x0200,
++	0x00c0, 0x7024, 0x1078, 0x75ca, 0x0078, 0x707e, 0x2009, 0x0000,
++	0x0c7e, 0x1078, 0x4727, 0x2c68, 0x0c7f, 0x6a00, 0xa284, 0x0001,
++	0x0040, 0x70d4, 0xa284, 0x0300, 0x00c0, 0x70cc, 0x6804, 0xa005,
++	0x0040, 0x70bc, 0x8001, 0x6806, 0x6003, 0x0007, 0x1078, 0x130c,
++	0x0040, 0x7085, 0x6013, 0x0000, 0x6803, 0x0000, 0x6837, 0x0116,
++	0x683b, 0x0000, 0x2c00, 0x684a, 0x6018, 0x2078, 0x78a0, 0x8007,
++	0x7130, 0x6986, 0x6846, 0x6853, 0x003d, 0x7044, 0xa084, 0x0003,
++	0xa086, 0x0002, 0x00c0, 0x7060, 0x684f, 0x0040, 0x0078, 0x706a,
++	0xa086, 0x0001, 0x00c0, 0x7068, 0x684f, 0x0080, 0x0078, 0x706a,
++	0x684f, 0x0000, 0x20a9, 0x000a, 0x2001, 0x7c90, 0xad90, 0x0015,
++	0x200c, 0x810f, 0x2112, 0x8000, 0x8210, 0x00f0, 0x7070, 0x200c,
++	0x6982, 0x8000, 0x200c, 0x697e, 0x1078, 0x3b92, 0x027f, 0x047f,
++	0x157f, 0x0f7f, 0x0e7f, 0x0d7f, 0x007c, 0x6013, 0x0100, 0x6003,
++	0x0001, 0x6007, 0x0041, 0x1078, 0x4941, 0x1078, 0x4d96, 0x0078,
++	0x707e, 0x2069, 0x7c92, 0x2d04, 0xa084, 0xff00, 0xa086, 0x1200,
++	0x00c0, 0x70b0, 0x2069, 0x7c80, 0x686c, 0xa084, 0x00ff, 0x017e,
++	0x6110, 0xa18c, 0x0700, 0xa10d, 0x6112, 0x017f, 0x6003, 0x0001,
++	0x6007, 0x0043, 0x1078, 0x4941, 0x1078, 0x4d96, 0x0078, 0x707e,
++	0x6013, 0x0200, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x4941,
++	0x1078, 0x4d96, 0x0078, 0x707e, 0x6013, 0x0300, 0x0078, 0x70c2,
++	0x6013, 0x0100, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x4941,
++	0x1078, 0x4d96, 0x0078, 0x707e, 0x6013, 0x0500, 0x0078, 0x70c2,
++	0x6013, 0x0600, 0x0078, 0x7091, 0x6013, 0x0200, 0x0078, 0x7091,
++	0xa186, 0x0013, 0x00c0, 0x70ea, 0x6004, 0xa08a, 0x0040, 0x1048,
++	0x12cd, 0xa08a, 0x0050, 0x10c8, 0x12cd, 0xa082, 0x0040, 0x2008,
++	0x0079, 0x711b, 0xa186, 0x0047, 0x00c0, 0x70f0, 0x0078, 0x714a,
++	0xa186, 0x0027, 0x0040, 0x70f8, 0xa186, 0x0014, 0x10c0, 0x12cd,
++	0x6004, 0xa082, 0x0040, 0x2008, 0x0079, 0x70fe, 0x710e, 0x7110,
++	0x7110, 0x710e, 0x710e, 0x710e, 0x710e, 0x710e, 0x710e, 0x710e,
++	0x710e, 0x710e, 0x710e, 0x710e, 0x710e, 0x710e, 0x1078, 0x12cd,
++	0x2001, 0x0007, 0x1078, 0x3802, 0x1078, 0x4c9d, 0x1078, 0x6bb6,
++	0x1078, 0x4d96, 0x007c, 0x712b, 0x713b, 0x7134, 0x7144, 0x712b,
++	0x712b, 0x712b, 0x712b, 0x712b, 0x712b, 0x712b, 0x712b, 0x712b,
++	0x712b, 0x712b, 0x712b, 0x1078, 0x12cd, 0x6010, 0xa088, 0x0013,
++	0x2104, 0xa085, 0x0400, 0x200a, 0x1078, 0x4c9d, 0x6003, 0x0002,
++	0x1078, 0x4d96, 0x007c, 0x1078, 0x4c9d, 0x1078, 0x47a8, 0x1078,
++	0x5d1a, 0x1078, 0x4d96, 0x007c, 0x1078, 0x4c9d, 0x2009, 0x0041,
++	0x0078, 0x7212, 0xa182, 0x0040, 0x0079, 0x714e, 0x715e, 0x7160,
++	0x715e, 0x715e, 0x715e, 0x715e, 0x715e, 0x7161, 0x715e, 0x715e,
++	0x715e, 0x715e, 0x715e, 0x715e, 0x715e, 0x715e, 0x1078, 0x12cd,
++	0x007c, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20,
++	0x2c10, 0x1078, 0x156a, 0x007c, 0xa182, 0x0040, 0x0079, 0x7170,
++	0x7180, 0x7180, 0x7180, 0x7180, 0x7180, 0x7180, 0x7180, 0x7180,
++	0x7180, 0x7182, 0x71a5, 0x7180, 0x7180, 0x7180, 0x7180, 0x71a5,
++	0x1078, 0x12cd, 0x1078, 0x4d45, 0x1078, 0x4e56, 0x6010, 0x0d7e,
++	0x2068, 0x684c, 0xd0fc, 0x0040, 0x7198, 0xa08c, 0x0003, 0xa18e,
++	0x0002, 0x0040, 0x719e, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x7212,
++	0x6003, 0x0007, 0x1078, 0x47a8, 0x0d7f, 0x007c, 0x1078, 0x47a8,
++	0x1078, 0x5d1a, 0x0d7f, 0x0078, 0x719d, 0x037e, 0x1078, 0x4d45,
++	0x1078, 0x4e56, 0x6010, 0x0d7e, 0x2068, 0x2019, 0x0004, 0x1078,
++	0x75fd, 0x1078, 0x6bb6, 0x6017, 0x0028, 0x0d7f, 0x037f, 0x007c,
++	0xa186, 0x0013, 0x00c0, 0x71c6, 0x6004, 0xa086, 0x0042, 0x10c0,
++	0x12cd, 0x1078, 0x4c9d, 0x1078, 0x4d96, 0x007c, 0xa186, 0x0027,
++	0x0040, 0x71ce, 0xa186, 0x0014, 0x00c0, 0x71de, 0x6004, 0xa086,
++	0x0042, 0x10c0, 0x12cd, 0x2001, 0x0007, 0x1078, 0x3802, 0x1078,
++	0x4c9d, 0x1078, 0x6bb6, 0x1078, 0x4d96, 0x007c, 0xa182, 0x0040,
++	0x0079, 0x71e2, 0x71f2, 0x71f2, 0x71f2, 0x71f2, 0x71f2, 0x71f2,
++	0x71f2, 0x71f4, 0x7200, 0x71f2, 0x71f2, 0x71f2, 0x71f2, 0x71f2,
++	0x71f2, 0x71f2, 0x1078, 0x12cd, 0x037e, 0x047e, 0x20e1, 0x0005,
++	0x3d18, 0x3e20, 0x2c10, 0x1078, 0x156a, 0x047f, 0x037f, 0x007c,
++	0x6010, 0x0d7e, 0x2068, 0x684c, 0xd0fc, 0x0040, 0x720c, 0x2009,
++	0x0041, 0x0d7f, 0x0078, 0x7212, 0x6003, 0x0007, 0x1078, 0x47a8,
++	0x0d7f, 0x007c, 0xa182, 0x0040, 0x0079, 0x7216, 0x7226, 0x7228,
++	0x7234, 0x7240, 0x7226, 0x7226, 0x7226, 0x7226, 0x7226, 0x7226,
++	0x7226, 0x7226, 0x7226, 0x7226, 0x7226, 0x7226, 0x1078, 0x12cd,
++	0x6003, 0x0001, 0x6106, 0x1078, 0x4941, 0x127e, 0x2091, 0x8000,
++	0x1078, 0x4d96, 0x127f, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078,
++	0x4941, 0x127e, 0x2091, 0x8000, 0x1078, 0x4d96, 0x127f, 0x007c,
++	0x6003, 0x0003, 0x6106, 0x2c10, 0x1078, 0x19c7, 0x127e, 0x2091,
++	0x8000, 0x1078, 0x49ad, 0x1078, 0x4e56, 0x127f, 0x007c, 0x1078,
++	0x4c9d, 0x0078, 0x7255, 0x1078, 0x4d45, 0x6110, 0x81ff, 0x0040,
++	0x7262, 0x0d7e, 0x2168, 0x037e, 0x2019, 0x0029, 0x1078, 0x75fd,
++	0x037f, 0x0d7f, 0x1078, 0x6bb6, 0x1078, 0x4d96, 0x007c, 0xa182,
++	0x0085, 0x0079, 0x726b, 0x7272, 0x7272, 0x7272, 0x7274, 0x7272,
++	0x7272, 0x7272, 0x1078, 0x12cd, 0x027e, 0x0e7e, 0x2071, 0x7c80,
++	0x7220, 0x1078, 0x7517, 0x0040, 0x7281, 0x6007, 0x0086, 0x0078,
++	0x7283, 0x6007, 0x0087, 0x6003, 0x0001, 0x1078, 0x4941, 0x1078,
++	0x4d96, 0x0e7f, 0x027f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x729d,
++	0x6004, 0xa08a, 0x0085, 0x1048, 0x12cd, 0xa08a, 0x008c, 0x10c8,
++	0x12cd, 0xa082, 0x0085, 0x0079, 0x72b0, 0xa186, 0x0027, 0x0040,
++	0x72a5, 0xa186, 0x0014, 0x10c0, 0x12cd, 0x2001, 0x0007, 0x1078,
++	0x3802, 0x1078, 0x4c9d, 0x1078, 0x6bb6, 0x1078, 0x4d96, 0x007c,
++	0x72b7, 0x72b9, 0x72b9, 0x72b7, 0x72b7, 0x72b7, 0x72b7, 0x1078,
++	0x12cd, 0x1078, 0x4c9d, 0x1078, 0x5d1a, 0x1078, 0x4d96, 0x007c,
++	0xa182, 0x0085, 0x1048, 0x12cd, 0xa182, 0x008c, 0x10c8, 0x12cd,
++	0xa182, 0x0085, 0x0079, 0x72cc, 0x72d3, 0x72d3, 0x72d3, 0x72d5,
++	0x72d3, 0x72d3, 0x72d3, 0x1078, 0x12cd, 0x007c, 0x1078, 0x4c9d,
++	0x1078, 0x6bb6, 0x1078, 0x4d96, 0x007c, 0x037e, 0x2019, 0x000b,
++	0x1078, 0x72e6, 0x601f, 0x0006, 0x037f, 0x007c, 0x127e, 0x037e,
++	0x087e, 0x2091, 0x8000, 0x2c40, 0x1078, 0x5a2d, 0x00c0, 0x7313,
++	0x1078, 0x5ace, 0x00c0, 0x7313, 0x6000, 0xa086, 0x0000, 0x0040,
++	0x7313, 0x601c, 0xa086, 0x0007, 0x0040, 0x7313, 0x0d7e, 0x6000,
++	0xa086, 0x0004, 0x00c0, 0x7306, 0x1078, 0x166e, 0x6010, 0x2068,
++	0x1078, 0x6a58, 0x0040, 0x730e, 0x1078, 0x75fd, 0x0d7f, 0x6013,
++	0x0000, 0x601f, 0x0007, 0x087f, 0x037f, 0x127f, 0x007c, 0x0f7e,
++	0x0c7e, 0x037e, 0x157e, 0x2079, 0x7c80, 0x7838, 0xa08c, 0x00ff,
++	0x783c, 0x1078, 0x207f, 0x00c0, 0x734e, 0x017e, 0x0c7e, 0x1078,
++	0x384c, 0x00c0, 0x734e, 0x2011, 0x7c90, 0xac98, 0x000a, 0x20a9,
++	0x0004, 0x1078, 0x6280, 0x00c0, 0x734e, 0x017f, 0x027f, 0x027e,
++	0x017e, 0x2019, 0x0029, 0x1078, 0x5ba2, 0x1078, 0x4a7e, 0x1078,
++	0x49c1, 0x017f, 0x1078, 0x747b, 0x1078, 0x3a36, 0x017f, 0x1078,
++	0x3637, 0x6612, 0x6516, 0xa006, 0x0078, 0x7350, 0x0c7f, 0x017f,
++	0x157f, 0x037f, 0x0c7f, 0x0f7f, 0x007c, 0x0c7e, 0x0d7e, 0x017e,
++	0x2009, 0x771e, 0x2104, 0xa086, 0x0074, 0x00c0, 0x73ac, 0x2069,
++	0x7c8e, 0x690c, 0xa182, 0x0100, 0x0048, 0x739c, 0x6908, 0xa184,
++	0x8000, 0x0040, 0x73a8, 0xa184, 0x0800, 0x0040, 0x73a8, 0x6910,
++	0xa18a, 0x0001, 0x0048, 0x73a0, 0x6914, 0x2069, 0x7cae, 0x6904,
++	0x81ff, 0x00c0, 0x7394, 0x690c, 0xa182, 0x0100, 0x0048, 0x739c,
++	0x6908, 0x81ff, 0x00c0, 0x7398, 0x6910, 0xa18a, 0x0001, 0x0048,
++	0x73a0, 0x6918, 0xa18a, 0x0001, 0x0048, 0x73a8, 0x0078, 0x73b2,
++	0x6013, 0x0100, 0x0078, 0x73ae, 0x6013, 0x0300, 0x0078, 0x73ae,
++	0x6013, 0x0500, 0x0078, 0x73ae, 0x6013, 0x0700, 0x0078, 0x73ae,
++	0x6013, 0x0900, 0x0078, 0x73ae, 0x6013, 0x0b00, 0x0078, 0x73ae,
++	0x6013, 0x0f00, 0x0078, 0x73ae, 0x6013, 0x2d00, 0xa085, 0x0001,
++	0x0078, 0x73b3, 0xa006, 0x017f, 0x0d7f, 0x0c7f, 0x007c, 0x0c7e,
++	0x0d7e, 0x027e, 0x037e, 0x157e, 0x6218, 0x2268, 0x6b04, 0xa394,
++	0x00ff, 0xa286, 0x0006, 0x0040, 0x73db, 0xa286, 0x0004, 0x0040,
++	0x73db, 0xa394, 0xff00, 0x8217, 0xa286, 0x0006, 0x0040, 0x73db,
++	0xa286, 0x0004, 0x0040, 0x73db, 0x0c7e, 0x2d60, 0x1078, 0x385e,
++	0x0c7f, 0x0078, 0x740e, 0x2011, 0x7c96, 0xad98, 0x000a, 0x20a9,
++	0x0004, 0x1078, 0x6280, 0x00c0, 0x740f, 0x2011, 0x7c9a, 0xad98,
++	0x0006, 0x20a9, 0x0004, 0x1078, 0x6280, 0x00c0, 0x740f, 0x047e,
++	0x017e, 0x6aa0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0x7752,
++	0x210c, 0xd1a4, 0x0040, 0x7403, 0x2009, 0x0029, 0x1078, 0x7641,
++	0x6800, 0xc0e5, 0x6802, 0x2019, 0x0029, 0x1078, 0x4a7e, 0x1078,
++	0x49c1, 0x2c08, 0x1078, 0x747b, 0x017f, 0x047f, 0xa006, 0x157f,
++	0x037f, 0x027f, 0x0d7f, 0x0c7f, 0x007c, 0x0d7e, 0x2069, 0x7c8e,
++	0x6800, 0xa086, 0x0800, 0x0040, 0x7421, 0x6013, 0x0000, 0x0078,
++	0x7422, 0xa006, 0x0d7f, 0x007c, 0x0c7e, 0x0f7e, 0x017e, 0x027e,
++	0x037e, 0x157e, 0x2079, 0x7c8c, 0x7930, 0x7834, 0x1078, 0x207f,
++	0x00c0, 0x7448, 0x1078, 0x384c, 0x00c0, 0x7448, 0x2011, 0x7c90,
++	0xac98, 0x000a, 0x20a9, 0x0004, 0x1078, 0x6280, 0x00c0, 0x7448,
++	0x2011, 0x7c94, 0xac98, 0x0006, 0x20a9, 0x0004, 0x1078, 0x6280,
++	0x157f, 0x037f, 0x027f, 0x017f, 0x0f7f, 0x0c7f, 0x007c, 0x0c7e,
++	0x007e, 0x017e, 0x027e, 0x037e, 0x157e, 0x2011, 0x7c83, 0x2204,
++	0x8211, 0x220c, 0x1078, 0x207f, 0x00c0, 0x7474, 0x1078, 0x384c,
++	0x00c0, 0x7474, 0x2011, 0x7c96, 0xac98, 0x000a, 0x20a9, 0x0004,
++	0x1078, 0x6280, 0x00c0, 0x7474, 0x2011, 0x7c9a, 0xac98, 0x0006,
++	0x20a9, 0x0004, 0x1078, 0x6280, 0x157f, 0x037f, 0x027f, 0x017f,
++	0x007f, 0x0c7f, 0x007c, 0x0e7e, 0x0c7e, 0x077e, 0x067e, 0x057e,
++	0x047e, 0x027e, 0x127e, 0x2091, 0x8000, 0x2029, 0x793f, 0x252c,
++	0x2021, 0x7945, 0x2424, 0x2061, 0x7e00, 0x2071, 0x7700, 0x7644,
++	0x7060, 0x8001, 0xa602, 0x00c8, 0x74e0, 0x2100, 0xac06, 0x0040,
++	0x74d6, 0x1078, 0x7659, 0x0040, 0x74d6, 0x671c, 0xa786, 0x0001,
++	0x0040, 0x74f5, 0xa786, 0x0007, 0x0040, 0x74d6, 0x2500, 0xac06,
++	0x0040, 0x74d6, 0x2400, 0xac06, 0x0040, 0x74d6, 0x1078, 0x766d,
++	0x00c0, 0x74d6, 0x0d7e, 0x6000, 0xa086, 0x0004, 0x00c0, 0x74bc,
++	0x017e, 0x1078, 0x166e, 0x017f, 0x6010, 0x2068, 0x1078, 0x6a58,
++	0x0040, 0x74d3, 0xa786, 0x0003, 0x00c0, 0x74e9, 0x6837, 0x0103,
++	0x6b4a, 0x6847, 0x0000, 0x017e, 0x1078, 0x6c54, 0x1078, 0x3b92,
++	0x017f, 0x1078, 0x6ba9, 0x0d7f, 0x1078, 0x6bb6, 0xace0, 0x0008,
++	0x2001, 0x7715, 0x2004, 0xac02, 0x00c8, 0x74e0, 0x0078, 0x748d,
++	0x127f, 0x027f, 0x047f, 0x057f, 0x067f, 0x077f, 0x0c7f, 0x0e7f,
++	0x007c, 0xa786, 0x0006, 0x00c0, 0x74c6, 0xa386, 0x0005, 0x0040,
++	0x74d6, 0x1078, 0x75fd, 0x0078, 0x74d3, 0x1078, 0x766d, 0x00c0,
++	0x74d6, 0xa180, 0x0001, 0x2004, 0xa086, 0x0018, 0x00c0, 0x74d6,
++	0x6000, 0xa086, 0x0002, 0x00c0, 0x74d6, 0x1078, 0x6bcf, 0x0040,
++	0x7511, 0x1078, 0x6be3, 0x00c0, 0x74d6, 0x1078, 0x5f6d, 0x0078,
++	0x7513, 0x1078, 0x22d7, 0x1078, 0x6bb6, 0x0078, 0x74d6, 0x0c7e,
++	0x0e7e, 0x017e, 0x2c08, 0x2170, 0x1078, 0x7614, 0x017f, 0x0040,
++	0x7526, 0x601c, 0xa084, 0x000f, 0x1079, 0x7529, 0x0e7f, 0x0c7f,
++	0x007c, 0x7531, 0x7531, 0x7531, 0x7531, 0x7531, 0x7531, 0x7533,
++	0x7531, 0xa006, 0x007c, 0x047e, 0x017e, 0x7018, 0xa080, 0x0028,
++	0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00, 0x2009, 0x0020, 0x1078,
++	0x7641, 0x017f, 0x047f, 0x037e, 0x2019, 0x0002, 0x1078, 0x72e6,
++	0x037f, 0xa085, 0x0001, 0x007c, 0x2001, 0x0001, 0x1078, 0x37e0,
++	0x157e, 0x017e, 0x027e, 0x037e, 0x20a9, 0x0004, 0x2019, 0x7705,
++	0x2011, 0x7c96, 0x1078, 0x6280, 0x037f, 0x027f, 0x017f, 0x157f,
++	0xa005, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x077e, 0x067e, 0x027e,
++	0x127e, 0x2091, 0x8000, 0x2061, 0x7e00, 0x2079, 0x0001, 0x8fff,
++	0x0040, 0x75bd, 0x2071, 0x7700, 0x7644, 0x7060, 0x8001, 0xa602,
++	0x00c8, 0x75bd, 0x88ff, 0x0040, 0x7583, 0x2800, 0xac06, 0x00c0,
++	0x75b3, 0x2079, 0x0000, 0x1078, 0x7659, 0x0040, 0x75b3, 0x2400,
++	0xac06, 0x0040, 0x75b3, 0x671c, 0xa786, 0x0006, 0x00c0, 0x75b3,
++	0xa786, 0x0007, 0x0040, 0x75b3, 0x88ff, 0x00c0, 0x759b, 0x6018,
++	0xa206, 0x00c0, 0x75b3, 0x0d7e, 0x6000, 0xa086, 0x0004, 0x00c0,
++	0x75a3, 0x1078, 0x166e, 0x6010, 0x2068, 0x1078, 0x6a58, 0x0040,
++	0x75ad, 0x047e, 0x1078, 0x75fd, 0x047f, 0x0d7f, 0x1078, 0x6bb6,
++	0x88ff, 0x00c0, 0x75c6, 0xace0, 0x0008, 0x2001, 0x7715, 0x2004,
++	0xac02, 0x00c8, 0x75bd, 0x0078, 0x756f, 0xa006, 0x127f, 0x027f,
++	0x067f, 0x077f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0xa8c5, 0x0001,
++	0x0078, 0x75be, 0x087e, 0x2041, 0x0000, 0x2c20, 0x2019, 0x0002,
++	0x6218, 0x1078, 0x5a2d, 0x1078, 0x5ace, 0x1078, 0x7562, 0x087f,
++	0x007c, 0x027e, 0x047e, 0x087e, 0x0c7e, 0x157e, 0x2c20, 0x20a9,
++	0x007f, 0x2009, 0x0000, 0x017e, 0x037e, 0x1078, 0x384c, 0x00c0,
++	0x75f2, 0x2c10, 0x2041, 0x0000, 0x1078, 0x5a2d, 0x1078, 0x5ace,
++	0x1078, 0x7562, 0x037f, 0x017f, 0x8108, 0x00f0, 0x75e3, 0x157f,
++	0x0c7f, 0x087f, 0x047f, 0x027f, 0x007c, 0x017e, 0x0f7e, 0x8dff,
++	0x0040, 0x7611, 0x6800, 0xa07d, 0x0040, 0x760e, 0x6803, 0x0000,
++	0x6b52, 0x1078, 0x3b92, 0x2f68, 0x0078, 0x7602, 0x6b52, 0x1078,
++	0x3b92, 0x0f7f, 0x017f, 0x007c, 0x0e7e, 0x047e, 0x037e, 0x2061,
++	0x7e00, 0x2071, 0x7700, 0x7444, 0x7060, 0x8001, 0xa402, 0x00c8,
++	0x763c, 0x2100, 0xac06, 0x0040, 0x762e, 0x6000, 0xa086, 0x0000,
++	0x0040, 0x762e, 0x6008, 0xa206, 0x0040, 0x7638, 0xace0, 0x0008,
++	0x2001, 0x7715, 0x2004, 0xac02, 0x00c8, 0x763c, 0x0078, 0x7619,
++	0xa085, 0x0001, 0x0078, 0x763d, 0xa006, 0x037f, 0x047f, 0x0e7f,
++	0x007c, 0x0d7e, 0x007e, 0x1078, 0x1327, 0x007f, 0x1040, 0x12cd,
++	0x6837, 0x010d, 0x6803, 0x0000, 0x683b, 0x0000, 0x685b, 0x0000,
++	0x685e, 0x6956, 0x6c46, 0x684f, 0x0000, 0x1078, 0x3b92, 0x0d7f,
++	0x007c, 0x6700, 0xa786, 0x0000, 0x0040, 0x766c, 0xa786, 0x0001,
++	0x0040, 0x766c, 0xa786, 0x000a, 0x0040, 0x766c, 0xa786, 0x0009,
++	0x0040, 0x766c, 0xa085, 0x0001, 0x007c, 0x0e7e, 0x6018, 0x2070,
++	0x70a0, 0xa206, 0x0e7f, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091,
++	0x8000, 0x2071, 0x7740, 0xd5a4, 0x0040, 0x7681, 0x7034, 0x8000,
++	0x7036, 0xd5b4, 0x0040, 0x7687, 0x7030, 0x8000, 0x7032, 0xd5ac,
++	0x0040, 0x768e, 0x2071, 0x774a, 0x1078, 0x76bd, 0x0e7f, 0x007f,
++	0x127f, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071,
++	0x7740, 0xd5a4, 0x0040, 0x769f, 0x7034, 0x8000, 0x7036, 0xd5b4,
++	0x0040, 0x76a5, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0040, 0x76ac,
++	0x2071, 0x774a, 0x1078, 0x76bd, 0x0e7f, 0x007f, 0x127f, 0x007c,
++	0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071, 0x7742, 0x1078,
++	0x76bd, 0x0e7f, 0x007f, 0x127f, 0x007c, 0x2e04, 0x8000, 0x2072,
++	0x00c8, 0x76c6, 0x8e70, 0x2e04, 0x8000, 0x2072, 0x007c, 0x0e7e,
++	0x2071, 0x7740, 0x1078, 0x76bd, 0x0e7f, 0x007c, 0x0e7e, 0x2071,
++	0x7744, 0x1078, 0x76bd, 0x0e7f, 0x007c, 0x0001, 0x0002, 0x0004,
++	0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400,
++	0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0x687d
++};
++#endif
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/asm_2200.h	2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,5286 @@
++/* @(#)asm_2200.h 1.5 */
++/*
++ * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 by Qlogic, Inc.
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms are permitted provided
++ * that the following conditions are met:
++ * 1. Redistribution of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistribution in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR 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.
++ */ 
++
++/************************************************************************
++ *									*
++ *               --- ISP2200 Initiator/Target Firmware ---              *
++ *             with Fabric (Public Loop), Point-point, and              *
++ *             expanded LUN addressing for FCTAPE                       *
++ *									*
++ ************************************************************************/
++/*
++ *	Firmware Version 2.02.03 (08:58 May 02, 2002)
++ */
++static const u_int16_t isp_2200_risc_code[] = {
++	0x0470, 0x0000, 0x0000, 0xa3f2, 0x0000, 0x0002, 0x0002, 0x0003,
++	0x0017, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030,
++	0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241,
++	0x5449, 0x4f4e, 0x2049, 0x5350, 0x3232, 0x3030, 0x2046, 0x6972,
++	0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030,
++	0x322e, 0x3032, 0x2e30, 0x3320, 0x2020, 0x2020, 0x2400, 0x20c1,
++	0x0005, 0x2001, 0x017f, 0x2003, 0x0000, 0x20c9, 0xb9ff, 0x2091,
++	0x2000, 0x2059, 0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x2930,
++	0x2051, 0xb400, 0x2a70, 0x2029, 0xec00, 0x2031, 0xffff, 0x2039,
++	0xebe9, 0x2021, 0x0200, 0x0804, 0x1464, 0x20a1, 0xb3f2, 0xa00e,
++	0x20a9, 0x080e, 0x41a4, 0x3400, 0x7562, 0x7666, 0x775e, 0x746a,
++	0x746e, 0x20a1, 0xbc00, 0x7164, 0x810d, 0x810d, 0x810d, 0x810d,
++	0xa18c, 0x000f, 0x2001, 0x000b, 0xa112, 0xa00e, 0x21a8, 0x41a4,
++	0x3400, 0x8211, 0x1dd8, 0x7164, 0x3400, 0xa102, 0x0120, 0x0218,
++	0x20a8, 0xa00e, 0x41a4, 0x3800, 0xd08c, 0x01d8, 0x2009, 0xb400,
++	0x810d, 0x810d, 0x810d, 0x810d, 0xa18c, 0x000f, 0x2001, 0x0001,
++	0xa112, 0x20a1, 0x1000, 0xa00e, 0x21a8, 0x41a4, 0x8211, 0x1de0,
++	0x2009, 0xb400, 0x3400, 0xa102, 0x0120, 0x0218, 0x20a8, 0xa00e,
++	0x41a4, 0x080c, 0x140d, 0x080c, 0x162e, 0x080c, 0x17c7, 0x080c,
++	0x1f73, 0x080c, 0x4bb9, 0x080c, 0x8562, 0x080c, 0x15b7, 0x080c,
++	0x2e88, 0x080c, 0x5d4b, 0x080c, 0x5302, 0x080c, 0x6893, 0x080c,
++	0x24d9, 0x080c, 0x6b26, 0x080c, 0x637c, 0x080c, 0x239b, 0x080c,
++	0x24a7, 0x2091, 0x3009, 0x7823, 0x0000, 0x1004, 0x10c5, 0x7820,
++	0xa086, 0x0002, 0x1150, 0x7823, 0x4000, 0x0e04, 0x10bd, 0x781b,
++	0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2a70, 0x7003, 0x0000,
++	0x2a70, 0x7000, 0xa08e, 0x0003, 0x1158, 0x080c, 0x3ec6, 0x080c,
++	0x2eaf, 0x080c, 0x5d99, 0x080c, 0x54b1, 0x080c, 0x68be, 0x0c80,
++	0x000b, 0x0c98, 0x10e4, 0x10e5, 0x1210, 0x10e2, 0x12d9, 0x140a,
++	0x140b, 0x140c, 0x080c, 0x1511, 0x0005, 0x0126, 0x00f6, 0x2091,
++	0x8000, 0x7000, 0xa086, 0x0001, 0x1904, 0x11ed, 0x080c, 0x1584,
++	0x080c, 0x5a90, 0x0150, 0x080c, 0x5ab6, 0x15c0, 0x2079, 0x0100,
++	0x7828, 0xa085, 0x1800, 0x782a, 0x0488, 0x080c, 0x59c8, 0x7000,
++	0xa086, 0x0001, 0x1904, 0x11ed, 0x708c, 0xa086, 0x0028, 0x1904,
++	0x11ed, 0x2001, 0x0161, 0x2003, 0x0001, 0x2079, 0x0100, 0x7827,
++	0xffff, 0x7a28, 0xa295, 0x1e2f, 0x7a2a, 0x2011, 0x5963, 0x080c,
++	0x6961, 0x2011, 0x5956, 0x080c, 0x6a21, 0x2011, 0x59a5, 0x080c,
++	0x6961, 0x2011, 0x4a96, 0x080c, 0x6961, 0x2011, 0x8030, 0x2019,
++	0x0000, 0x708b, 0x0000, 0x080c, 0x1db8, 0x00e8, 0x080c, 0x4449,
++	0x2079, 0x0100, 0x7844, 0xa005, 0x1904, 0x11ed, 0x2011, 0x4a96,
++	0x080c, 0x6961, 0x2011, 0x59a5, 0x080c, 0x6961, 0x080c, 0x1db8,
++	0x2001, 0xb68d, 0x2004, 0x780e, 0x7840, 0xa084, 0xfffb, 0x7842,
++	0x2011, 0x8010, 0x73cc, 0x080c, 0x3e8a, 0x723c, 0xc284, 0x723e,
++	0x2001, 0xb40c, 0x200c, 0xc1ac, 0x2102, 0x080c, 0x7edf, 0x2011,
++	0x0004, 0x080c, 0x9bf1, 0x080c, 0x520e, 0x080c, 0x5a90, 0x0158,
++	0x080c, 0x4ba2, 0x0140, 0x708b, 0x0001, 0x70c7, 0x0000, 0x080c,
++	0x45e6, 0x0804, 0x11ed, 0x080c, 0x52ca, 0x0120, 0x7a0c, 0xc2b4,
++	0x7a0e, 0x0060, 0x7073, 0x0000, 0x080c, 0x9f99, 0x70d4, 0xd09c,
++	0x1128, 0x70a0, 0xa005, 0x0110, 0x080c, 0x4b80, 0x70df, 0x0000,
++	0x70db, 0x0000, 0x72d4, 0x080c, 0x5a90, 0x1178, 0x2011, 0x0000,
++	0x0016, 0x080c, 0x28b1, 0x2019, 0xb68f, 0x211a, 0x001e, 0x7053,
++	0xffff, 0x7057, 0x00ef, 0x7077, 0x0000, 0x2079, 0xb452, 0x7804,
++	0xd0ac, 0x0108, 0xc295, 0x72d6, 0x080c, 0x5a90, 0x0118, 0xa296,
++	0x0004, 0x0548, 0x2011, 0x0001, 0x080c, 0x9bf1, 0x709b, 0x0000,
++	0x709f, 0xffff, 0x7003, 0x0002, 0x2079, 0x0100, 0x7827, 0x0003,
++	0x7828, 0xa085, 0x0003, 0x782a, 0x00fe, 0x080c, 0x2a7e, 0x2011,
++	0x0005, 0x080c, 0x801f, 0x080c, 0x7134, 0x080c, 0x5a90, 0x0148,
++	0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, 0x28b1, 0x61e2, 0x001e,
++	0x00ce, 0x012e, 0x0420, 0x709b, 0x0000, 0x709f, 0xffff, 0x7003,
++	0x0002, 0x00f6, 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0xa085,
++	0x0003, 0x782a, 0x00fe, 0x2011, 0x0005, 0x080c, 0x801f, 0x080c,
++	0x7134, 0x080c, 0x5a90, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016,
++	0x080c, 0x28b1, 0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005,
++	0x00c6, 0x080c, 0x5a90, 0x1118, 0x20a9, 0x0100, 0x0010, 0x20a9,
++	0x0082, 0x080c, 0x5a90, 0x1118, 0x2009, 0x0000, 0x0010, 0x2009,
++	0x007e, 0x080c, 0x2d5b, 0x8108, 0x1f04, 0x1201, 0x00ce, 0x7073,
++	0x0000, 0x7074, 0xa084, 0x00ff, 0x7076, 0x70a3, 0x0000, 0x0005,
++	0x0126, 0x2091, 0x8000, 0x7000, 0xa086, 0x0002, 0x1904, 0x12d7,
++	0x709c, 0xa086, 0xffff, 0x0130, 0x080c, 0x2a7e, 0x080c, 0x7134,
++	0x0804, 0x12d7, 0x70d4, 0xd0ac, 0x1110, 0xd09c, 0x0540, 0xd084,
++	0x0530, 0x0006, 0x0016, 0x2001, 0x0103, 0x2009, 0xb68d, 0x210c,
++	0x2102, 0x001e, 0x000e, 0xd08c, 0x01d0, 0x70d8, 0xa086, 0xffff,
++	0x0190, 0x080c, 0x2bdd, 0x080c, 0x7134, 0x70d4, 0xd094, 0x1904,
++	0x12d7, 0x2011, 0x0001, 0x2019, 0x0000, 0x080c, 0x2c13, 0x080c,
++	0x7134, 0x0804, 0x12d7, 0x70dc, 0xa005, 0x1904, 0x12d7, 0x7098,
++	0xa005, 0x1904, 0x12d7, 0x70d4, 0xd0a4, 0x0118, 0xd0b4, 0x0904,
++	0x12d7, 0x080c, 0x52ca, 0x1904, 0x12d7, 0x2001, 0xb453, 0x2004,
++	0xd0ac, 0x01c8, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x2009, 0x0000,
++	0x0016, 0x080c, 0x4f6a, 0x1118, 0x6000, 0xd0ec, 0x1138, 0x001e,
++	0x8108, 0x1f04, 0x1268, 0x00ce, 0x015e, 0x0028, 0x001e, 0x00ce,
++	0x015e, 0x0804, 0x12d7, 0x0006, 0x0016, 0x2001, 0x0103, 0x2009,
++	0xb68d, 0x210c, 0x2102, 0x001e, 0x000e, 0xa006, 0x2009, 0x0700,
++	0x20a9, 0x0002, 0x20a1, 0xb6ce, 0x40a1, 0x7070, 0x8007, 0x7174,
++	0x810f, 0x20a9, 0x0002, 0x40a1, 0x2009, 0x0000, 0x080c, 0x14f7,
++	0x2001, 0x0000, 0x810f, 0x20a9, 0x0002, 0x40a1, 0xa006, 0x2009,
++	0x0200, 0x20a9, 0x0002, 0x20a1, 0xb6de, 0x40a1, 0x7030, 0xc08c,
++	0x7032, 0x7003, 0x0003, 0x709f, 0xffff, 0x080c, 0x157d, 0xa006,
++	0x080c, 0x2789, 0x080c, 0x3efc, 0x00f6, 0x2079, 0x0100, 0x080c,
++	0x5ab6, 0x0150, 0x080c, 0x5a90, 0x7828, 0x0118, 0xa084, 0xe1ff,
++	0x0010, 0xa084, 0xffdf, 0x782a, 0x00fe, 0x2001, 0xb6e1, 0x2004,
++	0xa086, 0x0005, 0x1120, 0x2011, 0x0000, 0x080c, 0x801f, 0x2011,
++	0x0000, 0x080c, 0x8029, 0x080c, 0x7134, 0x080c, 0x71f1, 0x012e,
++	0x0005, 0x0016, 0x0046, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079,
++	0x0100, 0x2009, 0xb434, 0x2104, 0xa005, 0x1110, 0x080c, 0x28dd,
++	0x2009, 0x00f7, 0x080c, 0x4b69, 0x7940, 0xa18c, 0x0010, 0x7942,
++	0x7924, 0xd1b4, 0x0110, 0x7827, 0x0040, 0xd19c, 0x0110, 0x7827,
++	0x0008, 0x0006, 0x0036, 0x0156, 0x7954, 0xd1ac, 0x1904, 0x1347,
++	0x080c, 0x5aa2, 0x0158, 0x080c, 0x5ab6, 0x1128, 0x2001, 0xb69e,
++	0x2003, 0x0000, 0x0070, 0x080c, 0x5a98, 0x0dc0, 0x2001, 0xb69e,
++	0x2003, 0xaaaa, 0x2001, 0xb69f, 0x2003, 0x0001, 0x080c, 0x59c8,
++	0x0058, 0x080c, 0x5a90, 0x0140, 0x2009, 0x00f8, 0x080c, 0x4b69,
++	0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c,
++	0x1138, 0x080c, 0x5a90, 0x0138, 0x7824, 0xd0ac, 0x1904, 0x13f1,
++	0x1f04, 0x1326, 0x0070, 0x7824, 0x080c, 0x5aac, 0x0118, 0xd0ac,
++	0x1904, 0x13f1, 0xa084, 0x1800, 0x0d98, 0x7003, 0x0001, 0x0804,
++	0x13f1, 0x2001, 0x0001, 0x080c, 0x2789, 0x0804, 0x1400, 0x7850,
++	0xa084, 0x0180, 0x7852, 0x782f, 0x0020, 0x20a9, 0x0046, 0x1d04,
++	0x134f, 0x080c, 0x6a09, 0x1f04, 0x134f, 0x7850, 0xa084, 0x0180,
++	0xa085, 0x0400, 0x7852, 0x782f, 0x0000, 0x080c, 0x5aa2, 0x0158,
++	0x080c, 0x5ab6, 0x1128, 0x2001, 0xb69e, 0x2003, 0x0000, 0x0070,
++	0x080c, 0x5a98, 0x0dc0, 0x2001, 0xb69e, 0x2003, 0xaaaa, 0x2001,
++	0xb69f, 0x2003, 0x0001, 0x080c, 0x59c8, 0x0020, 0x2009, 0x00f8,
++	0x080c, 0x4b69, 0x20a9, 0x000e, 0xe000, 0x1f04, 0x137c, 0x7850,
++	0xa084, 0x0180, 0xa085, 0x1400, 0x7852, 0x080c, 0x5a90, 0x0120,
++	0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678, 0x2019, 0xea60,
++	0x7820, 0xd09c, 0x1558, 0x080c, 0x5a90, 0x05d8, 0x7824, 0xd0ac,
++	0x1904, 0x13f1, 0x080c, 0x5ab6, 0x1508, 0x0046, 0x2021, 0x0190,
++	0x8421, 0x1df0, 0x004e, 0x8421, 0x11c8, 0x7827, 0x0048, 0x20a9,
++	0x01f4, 0x1d04, 0x13a9, 0x080c, 0x6a09, 0x1f04, 0x13a9, 0x7824,
++	0xa084, 0x0068, 0x15c8, 0x2001, 0xb69e, 0x2003, 0xaaaa, 0x2001,
++	0xb69f, 0x2003, 0x0001, 0x7003, 0x0001, 0x0498, 0x1d04, 0x13c2,
++	0x080c, 0x6a09, 0x8319, 0x1960, 0x2009, 0xb434, 0x2104, 0x8000,
++	0x200a, 0xa084, 0xfff0, 0x0120, 0x200b, 0x0000, 0x080c, 0x28dd,
++	0x00d8, 0x080c, 0x5aa2, 0x1140, 0xa4a2, 0x0064, 0x1128, 0x080c,
++	0x5a67, 0x7003, 0x0001, 0x00a8, 0x7827, 0x1800, 0xe000, 0xe000,
++	0x7824, 0x080c, 0x5aac, 0x0110, 0xd0ac, 0x1158, 0xa084, 0x1800,
++	0x09a8, 0x7003, 0x0001, 0x0028, 0x2001, 0x0001, 0x080c, 0x2789,
++	0x0048, 0x2001, 0xb434, 0x2003, 0x0000, 0x7827, 0x0048, 0x7828,
++	0xc09d, 0x782a, 0x7850, 0xa084, 0x0180, 0xa085, 0x0400, 0x7852,
++	0x015e, 0x003e, 0x000e, 0x080c, 0x1554, 0x012e, 0x00fe, 0x004e,
++	0x001e, 0x0005, 0x0005, 0x0005, 0x0005, 0x2a70, 0x2061, 0xb6c1,
++	0x2063, 0x0002, 0x6007, 0x0002, 0x600b, 0x0003, 0x600f, 0x0017,
++	0x2001, 0xb69e, 0x2003, 0x0000, 0x708b, 0x0000, 0x2009, 0x0100,
++	0x2104, 0xa082, 0x0002, 0x0218, 0x7053, 0xffff, 0x0010, 0x7053,
++	0x0000, 0x705b, 0xffff, 0x7073, 0x0000, 0x7077, 0x0000, 0x080c,
++	0x9f99, 0x2061, 0xb68e, 0x6003, 0x0909, 0x6007, 0x0000, 0x600b,
++	0x8800, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x000f, 0x601b,
++	0x0000, 0x601f, 0x07d0, 0x2061, 0xb696, 0x6003, 0x8000, 0x6007,
++	0x0000, 0x600b, 0x0000, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017,
++	0x0000, 0x601b, 0x0001, 0x601f, 0x0000, 0x2061, 0xb6b9, 0x6003,
++	0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, 0x2001,
++	0xb428, 0x2003, 0x0000, 0x0005, 0x04a0, 0x2011, 0x0000, 0x81ff,
++	0x0570, 0xa186, 0x0001, 0x1148, 0x2031, 0x8fff, 0x2039, 0xd401,
++	0x2021, 0x0100, 0x2029, 0xd400, 0x00e8, 0xa186, 0x0002, 0x1118,
++	0x2011, 0x0000, 0x00b8, 0xa186, 0x0005, 0x1118, 0x2011, 0x0001,
++	0x0088, 0xa186, 0x0009, 0x1118, 0x2011, 0x0002, 0x0058, 0xa186,
++	0x000a, 0x1118, 0x2011, 0x0002, 0x0028, 0xa186, 0x0055, 0x1110,
++	0x2011, 0x0003, 0x3800, 0xa084, 0xfffc, 0xa205, 0x20c0, 0x0804,
++	0x104d, 0xa00e, 0x2011, 0x0003, 0x2019, 0x14a0, 0x0804, 0x14f1,
++	0x2019, 0xaaaa, 0x2061, 0xffff, 0x2c14, 0x2362, 0xe000, 0xe000,
++	0x2c04, 0xa306, 0x2262, 0x1110, 0xc1b5, 0xc1a5, 0x2011, 0x0000,
++	0x2019, 0x14b3, 0x04f0, 0x2019, 0xaaaa, 0x2061, 0xffff, 0x2c14,
++	0x2362, 0xe000, 0xe000, 0x2c1c, 0x2061, 0x7fff, 0xe000, 0xe000,
++	0x2c04, 0x2061, 0xffff, 0x2262, 0xa306, 0x0110, 0xc18d, 0x0008,
++	0xc185, 0x2011, 0x0002, 0x2019, 0x14ce, 0x0418, 0x2061, 0xffff,
++	0x2019, 0xaaaa, 0x2c14, 0x2362, 0xe000, 0xe000, 0x2c04, 0x2262,
++	0xa306, 0x1180, 0x2c14, 0x2362, 0xe000, 0xe000, 0x2c1c, 0x2061,
++	0x7fff, 0x2c04, 0x2061, 0xffff, 0x2262, 0xa306, 0x1110, 0xc195,
++	0x0008, 0xc19d, 0x2011, 0x0001, 0x2019, 0x14ef, 0x0010, 0x0804,
++	0x1465, 0x3800, 0xa084, 0xfffc, 0xa205, 0x20c0, 0x0837, 0x2011,
++	0x0000, 0x080c, 0x4f6a, 0x1178, 0x6004, 0xa0c4, 0x00ff, 0xa8c6,
++	0x0006, 0x0128, 0xa0c4, 0xff00, 0xa8c6, 0x0600, 0x1120, 0xa186,
++	0x0080, 0x0108, 0x8210, 0x8108, 0xa186, 0x0100, 0x1d50, 0x2208,
++	0x0005, 0x2091, 0x8000, 0x0e04, 0x1513, 0x0006, 0x0016, 0x2079,
++	0x0000, 0x7818, 0xd084, 0x1de8, 0x001e, 0x792e, 0x000e, 0x782a,
++	0x000e, 0x7826, 0x3900, 0x783a, 0x7823, 0x8002, 0x781b, 0x0001,
++	0x2091, 0x5000, 0x0126, 0x0156, 0x0146, 0x20a9, 0x0010, 0x20a1,
++	0xb80c, 0x2091, 0x2000, 0x40a1, 0x20a9, 0x0010, 0x2091, 0x2200,
++	0x40a1, 0x20a9, 0x0010, 0x2091, 0x2400, 0x40a1, 0x20a9, 0x0010,
++	0x2091, 0x2600, 0x40a1, 0x20a9, 0x0010, 0x2091, 0x2800, 0x40a1,
++	0x014e, 0x015e, 0x012e, 0x2079, 0xb400, 0x7803, 0x0005, 0x2091,
++	0x4080, 0x04c9, 0x0cf8, 0x0005, 0x0006, 0x080c, 0x159f, 0x1518,
++	0x00f6, 0x2079, 0xb424, 0x2f04, 0x8000, 0x207a, 0xa082, 0x000f,
++	0x0258, 0xa006, 0x207a, 0x2079, 0xb426, 0x2f04, 0xa084, 0x0001,
++	0xa086, 0x0001, 0x207a, 0x0070, 0x2079, 0xb426, 0x2f7c, 0x8fff,
++	0x1128, 0x2001, 0x0c03, 0x2003, 0x0040, 0x0020, 0x2001, 0x0c03,
++	0x2003, 0x00c0, 0x00fe, 0x000e, 0x0005, 0x0409, 0x1120, 0x2001,
++	0x0c03, 0x2003, 0x0080, 0x0005, 0x00d1, 0x1120, 0x2001, 0x0c03,
++	0x2003, 0x0040, 0x0005, 0x0006, 0x0091, 0x1178, 0x2001, 0x0c03,
++	0x2003, 0x0040, 0x2009, 0x0fff, 0x00a1, 0x2001, 0x0c03, 0x2003,
++	0x0080, 0x2009, 0x0fff, 0x0069, 0x0c88, 0x000e, 0x0005, 0x00c6,
++	0x2061, 0x0c00, 0x2c04, 0xa084, 0x00ff, 0xa086, 0x00aa, 0x00ce,
++	0x0005, 0x0156, 0x0126, 0xa18c, 0x0fff, 0x21a8, 0x1d04, 0x15ae,
++	0x2091, 0x6000, 0x1f04, 0x15ae, 0x012e, 0x015e, 0x0005, 0x2071,
++	0xb400, 0x7160, 0x712e, 0x2021, 0x0001, 0xa190, 0x0030, 0xa298,
++	0x0030, 0x0240, 0x7064, 0xa302, 0x1228, 0x220a, 0x2208, 0x2310,
++	0x8420, 0x0ca8, 0x3800, 0xd08c, 0x0148, 0x7064, 0xa086, 0xb400,
++	0x0128, 0x7067, 0xb400, 0x2011, 0x1000, 0x0c48, 0x200b, 0x0000,
++	0x74b2, 0x74b6, 0x0005, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071,
++	0xb400, 0x70b4, 0xa0ea, 0x0010, 0x0268, 0x8001, 0x70b6, 0x702c,
++	0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807, 0x0000, 0x012e,
++	0x00ee, 0x0005, 0xa06e, 0x0cd8, 0x00e6, 0x2071, 0xb400, 0x0126,
++	0x2091, 0x8000, 0x70b4, 0x8001, 0x0260, 0x70b6, 0x702c, 0x2068,
++	0x2d04, 0x702e, 0x206b, 0x0000, 0x6807, 0x0000, 0x012e, 0x00ee,
++	0x0005, 0xa06e, 0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071,
++	0xb400, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70b4, 0x8000, 0x70b6,
++	0x012e, 0x00ee, 0x0005, 0x8dff, 0x0138, 0x6804, 0x6807, 0x0000,
++	0x0006, 0x0c49, 0x00de, 0x0cb8, 0x0005, 0x00e6, 0x2071, 0xb400,
++	0x70b4, 0xa08a, 0x0010, 0xa00d, 0x00ee, 0x0005, 0x00e6, 0x2071,
++	0xb712, 0x7007, 0x0000, 0x701b, 0x0000, 0x701f, 0x0000, 0x2071,
++	0x0000, 0x7010, 0xa085, 0x8004, 0x7012, 0x00ee, 0x0005, 0x00e6,
++	0x2270, 0x700b, 0x0000, 0x2071, 0xb712, 0x7018, 0xa088, 0xb71b,
++	0x220a, 0x8000, 0xa084, 0x0007, 0x701a, 0x7004, 0xa005, 0x1128,
++	0x00f6, 0x2079, 0x0010, 0x0081, 0x00fe, 0x00ee, 0x0005, 0x00e6,
++	0x2071, 0xb712, 0x7004, 0xa005, 0x1128, 0x00f6, 0x2079, 0x0010,
++	0x0019, 0x00fe, 0x00ee, 0x0005, 0x7000, 0x0002, 0x166a, 0x16ce,
++	0x16eb, 0x16eb, 0x7018, 0x711c, 0xa106, 0x1118, 0x7007, 0x0000,
++	0x0005, 0x00d6, 0xa180, 0xb71b, 0x2004, 0x700a, 0x2068, 0x8108,
++	0xa18c, 0x0007, 0x711e, 0x7803, 0x0026, 0x6824, 0x7832, 0x6828,
++	0x7836, 0x682c, 0x783a, 0x6830, 0x783e, 0x6810, 0x700e, 0x680c,
++	0x7016, 0x6804, 0x00de, 0xd084, 0x0120, 0x7007, 0x0001, 0x0029,
++	0x0005, 0x7007, 0x0002, 0x00b1, 0x0005, 0x0016, 0x0026, 0x710c,
++	0x2011, 0x0040, 0xa182, 0x0040, 0x1210, 0x2110, 0xa006, 0x700e,
++	0x7212, 0x8203, 0x7822, 0x7803, 0x0020, 0x7803, 0x0041, 0x002e,
++	0x001e, 0x0005, 0x0016, 0x0026, 0x0136, 0x0146, 0x0156, 0x7014,
++	0x2098, 0x20a1, 0x0014, 0x7803, 0x0026, 0x710c, 0x2011, 0x0040,
++	0xa182, 0x0040, 0x1210, 0x2110, 0xa006, 0x700e, 0x22a8, 0x53a6,
++	0x8203, 0x7822, 0x7803, 0x0020, 0x3300, 0x7016, 0x7803, 0x0001,
++	0x015e, 0x014e, 0x013e, 0x002e, 0x001e, 0x0005, 0x0136, 0x0146,
++	0x0156, 0x2099, 0xb4fa, 0x20a1, 0x0018, 0x20a9, 0x0008, 0x53a3,
++	0x7803, 0x0020, 0x0126, 0x2091, 0x8000, 0x7803, 0x0041, 0x7007,
++	0x0003, 0x7000, 0xc084, 0x7002, 0x700b, 0xb4f5, 0x012e, 0x015e,
++	0x014e, 0x013e, 0x0005, 0x0136, 0x0146, 0x0156, 0x2001, 0xb529,
++	0x209c, 0x20a1, 0x0014, 0x7803, 0x0026, 0x2001, 0xb52a, 0x20ac,
++	0x53a6, 0x2099, 0xb52b, 0x20a1, 0x0018, 0x20a9, 0x0008, 0x53a3,
++	0x7803, 0x0020, 0x0126, 0x2091, 0x8000, 0x7803, 0x0001, 0x7007,
++	0x0004, 0x7000, 0xc08c, 0x7002, 0x700b, 0xb526, 0x012e, 0x015e,
++	0x014e, 0x013e, 0x0005, 0x0016, 0x00e6, 0x2071, 0xb712, 0x00f6,
++	0x2079, 0x0010, 0x7904, 0x7803, 0x0002, 0xd1fc, 0x0120, 0xa18c,
++	0x0700, 0x7004, 0x0023, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x1664,
++	0x172e, 0x175c, 0x1786, 0x17b6, 0x172d, 0x0cf8, 0xa18c, 0x0700,
++	0x1528, 0x0136, 0x0146, 0x0156, 0x7014, 0x20a0, 0x2099, 0x0014,
++	0x7803, 0x0040, 0x7010, 0x20a8, 0x53a5, 0x3400, 0x7016, 0x015e,
++	0x014e, 0x013e, 0x700c, 0xa005, 0x0570, 0x7830, 0x7832, 0x7834,
++	0x7836, 0x080c, 0x1695, 0x0005, 0x7008, 0xa080, 0x0002, 0x2003,
++	0x0100, 0x7007, 0x0000, 0x080c, 0x1664, 0x0005, 0x7008, 0xa080,
++	0x0002, 0x2003, 0x0200, 0x0ca8, 0xa18c, 0x0700, 0x1150, 0x700c,
++	0xa005, 0x0188, 0x7830, 0x7832, 0x7834, 0x7836, 0x080c, 0x16aa,
++	0x0005, 0x7008, 0xa080, 0x0002, 0x2003, 0x0200, 0x7007, 0x0000,
++	0x080c, 0x1664, 0x0005, 0x00d6, 0x7008, 0x2068, 0x7830, 0x6826,
++	0x7834, 0x682a, 0x7838, 0x682e, 0x783c, 0x6832, 0x680b, 0x0100,
++	0x00de, 0x7007, 0x0000, 0x080c, 0x1664, 0x0005, 0xa18c, 0x0700,
++	0x1540, 0x0136, 0x0146, 0x0156, 0x2001, 0xb4f8, 0x2004, 0xa080,
++	0x000d, 0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x20a9, 0x0020,
++	0x53a5, 0x2001, 0xb4fa, 0x2004, 0xd0bc, 0x0148, 0x2001, 0xb503,
++	0x2004, 0xa080, 0x000d, 0x20a0, 0x20a9, 0x0020, 0x53a5, 0x015e,
++	0x014e, 0x013e, 0x7007, 0x0000, 0x080c, 0x5e30, 0x080c, 0x1664,
++	0x0005, 0x2011, 0x8003, 0x080c, 0x3e8a, 0x0cf8, 0xa18c, 0x0700,
++	0x1148, 0x2001, 0xb528, 0x2003, 0x0100, 0x7007, 0x0000, 0x080c,
++	0x1664, 0x0005, 0x2011, 0x8004, 0x080c, 0x3e8a, 0x0cf8, 0x0126,
++	0x2091, 0x2200, 0x2079, 0x0030, 0x2071, 0xb723, 0x7003, 0x0000,
++	0x700f, 0xb72f, 0x7013, 0xb72f, 0x780f, 0x00f6, 0x7803, 0x0004,
++	0x012e, 0x0005, 0x6934, 0xa184, 0x0007, 0x0002, 0x17e6, 0x1824,
++	0x17e6, 0x17e6, 0x17e6, 0x180c, 0x17f3, 0x17ea, 0xa085, 0x0001,
++	0x0804, 0x183e, 0x684c, 0xd0bc, 0x0dc8, 0x6860, 0x682e, 0x685c,
++	0x682a, 0x6858, 0x04c8, 0xa18c, 0x00ff, 0xa186, 0x001e, 0x1d70,
++	0x684c, 0xd0bc, 0x0d58, 0x6860, 0x682e, 0x685c, 0x682a, 0x6804,
++	0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x22b6,
++	0x2005, 0x6832, 0x6858, 0x0440, 0xa18c, 0x00ff, 0xa186, 0x0015,
++	0x19a8, 0x684c, 0xd0ac, 0x0990, 0x6804, 0x681a, 0xa080, 0x000d,
++	0x2004, 0xa084, 0x000f, 0xa080, 0x22b6, 0x2005, 0x6832, 0xa006,
++	0x682e, 0x682a, 0x6858, 0x0080, 0x684c, 0xd0ac, 0x0904, 0x17e6,
++	0xa006, 0x682e, 0x682a, 0x6858, 0xa18c, 0x000f, 0xa188, 0x22b6,
++	0x210d, 0x6932, 0x2d08, 0x691a, 0x6826, 0x684c, 0xc0dd, 0x684e,
++	0xa006, 0x680a, 0x697c, 0x6912, 0x6980, 0x6916, 0x0005, 0x684c,
++	0xd0ac, 0x090c, 0x1511, 0x6833, 0x22b3, 0x2d08, 0x691a, 0x6858,
++	0x8001, 0x6826, 0x684c, 0xc0dd, 0x684e, 0xa006, 0x680a, 0x682e,
++	0x682a, 0x697c, 0x6912, 0x6980, 0x6916, 0x0005, 0x20e1, 0x0007,
++	0x20e1, 0x2000, 0x2001, 0x020a, 0x2004, 0x82ff, 0x01e8, 0xa280,
++	0x0004, 0x00d6, 0x206c, 0x684c, 0xd0dc, 0x1190, 0xa280, 0x0007,
++	0x2004, 0xa086, 0x000a, 0x1110, 0x0891, 0x0010, 0x080c, 0x17da,
++	0x0138, 0x00de, 0xa280, 0x0000, 0x2003, 0x0002, 0xa016, 0x0020,
++	0x6808, 0x8000, 0x680a, 0x00de, 0x0126, 0x0046, 0x0036, 0x0026,
++	0x2091, 0x2200, 0x002e, 0x003e, 0x004e, 0x7000, 0xa005, 0x01d0,
++	0x710c, 0x220a, 0x8108, 0x230a, 0x8108, 0x240a, 0x8108, 0xa182,
++	0xb74a, 0x0210, 0x2009, 0xb72f, 0x710e, 0x7010, 0xa102, 0xa082,
++	0x0009, 0x0118, 0xa080, 0x001b, 0x1118, 0x2009, 0x0138, 0x200a,
++	0x012e, 0x0005, 0x7206, 0x2001, 0x18a0, 0x0006, 0x2260, 0x0804,
++	0x19cc, 0x0126, 0x0026, 0x0036, 0x00c6, 0x0006, 0x2091, 0x2200,
++	0x000e, 0x004e, 0x003e, 0x002e, 0x00d6, 0x00c6, 0x2460, 0x6110,
++	0x2168, 0x6a62, 0x6b5e, 0xa005, 0x0904, 0x1901, 0x6808, 0xa005,
++	0x0904, 0x1938, 0x7000, 0xa005, 0x1108, 0x0488, 0x700c, 0x7110,
++	0xa106, 0x1904, 0x1940, 0x7004, 0xa406, 0x1548, 0x2001, 0x0005,
++	0x2004, 0xd08c, 0x0168, 0x0046, 0x080c, 0x1ad5, 0x004e, 0x2460,
++	0x6010, 0xa080, 0x0002, 0x2004, 0xa005, 0x0904, 0x1938, 0x0c10,
++	0x2001, 0x0207, 0x2004, 0xd09c, 0x1d48, 0x7804, 0xa084, 0x6000,
++	0x0120, 0xa086, 0x6000, 0x0108, 0x0c08, 0x7818, 0x6812, 0x781c,
++	0x6816, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x6100,
++	0xa18e, 0x0004, 0x1904, 0x1940, 0x2009, 0x0048, 0x080c, 0x85ef,
++	0x04f8, 0x6808, 0xa005, 0x05a0, 0x7000, 0xa005, 0x0588, 0x700c,
++	0x7110, 0xa106, 0x1118, 0x7004, 0xa406, 0x1550, 0x2001, 0x0005,
++	0x2004, 0xd08c, 0x0160, 0x0046, 0x080c, 0x1ad5, 0x004e, 0x2460,
++	0x6010, 0xa080, 0x0002, 0x2004, 0xa005, 0x01d0, 0x0c28, 0x2001,
++	0x0207, 0x2004, 0xd09c, 0x1d50, 0x2001, 0x0005, 0x2004, 0xd08c,
++	0x1d50, 0x7804, 0xa084, 0x6000, 0x0118, 0xa086, 0x6000, 0x19f0,
++	0x7818, 0x6812, 0x781c, 0x6816, 0x7803, 0x0004, 0x7003, 0x0000,
++	0x6100, 0xa18e, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, 0x85ef,
++	0x00ce, 0x00de, 0x012e, 0x0005, 0x00f6, 0x00e6, 0x0026, 0x0036,
++	0x0046, 0x0056, 0x2071, 0xb723, 0x7000, 0xa086, 0x0000, 0x0904,
++	0x19aa, 0x7004, 0xac06, 0x1904, 0x199c, 0x2079, 0x0030, 0x7000,
++	0xa086, 0x0003, 0x0904, 0x199c, 0x7804, 0xd0fc, 0x15c8, 0x20e1,
++	0x6000, 0x2011, 0x0032, 0x2001, 0x0208, 0x200c, 0x2001, 0x0209,
++	0x2004, 0xa106, 0x1d88, 0x8211, 0x1db0, 0x7804, 0xd0fc, 0x1540,
++	0x080c, 0x1e3f, 0x0026, 0x0056, 0x7803, 0x0004, 0x7804, 0xd0ac,
++	0x1de8, 0x7803, 0x0002, 0x7803, 0x0009, 0x7003, 0x0003, 0x7007,
++	0x0000, 0x005e, 0x002e, 0x2001, 0x015d, 0x2003, 0x0000, 0x080c,
++	0x5a90, 0x1138, 0x0066, 0x2031, 0x0001, 0x080c, 0x5b12, 0x006e,
++	0x0058, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0020,
++	0x080c, 0x1ad5, 0x0804, 0x194c, 0x0156, 0x20a9, 0x0009, 0x2009,
++	0xb72f, 0x2104, 0xac06, 0x1108, 0x200a, 0xa188, 0x0003, 0x1f04,
++	0x19a1, 0x015e, 0x005e, 0x004e, 0x003e, 0x002e, 0x00ee, 0x00fe,
++	0x0005, 0x700c, 0x7110, 0xa106, 0x0904, 0x1a40, 0x2104, 0x7006,
++	0x2060, 0x8108, 0x211c, 0x8108, 0x2124, 0x8108, 0xa182, 0xb74a,
++	0x0210, 0x2009, 0xb72f, 0x7112, 0x700c, 0xa106, 0x1128, 0x080c,
++	0x28b1, 0x2001, 0x0138, 0x2102, 0x8cff, 0x0598, 0x6010, 0x2068,
++	0x2d58, 0x6828, 0xa406, 0x1590, 0x682c, 0xa306, 0x1578, 0x7004,
++	0x2060, 0x6020, 0xc0d4, 0x6022, 0x684c, 0xd0f4, 0x0128, 0x6817,
++	0xffff, 0x6813, 0xffff, 0x00e8, 0x6850, 0xd0f4, 0x1130, 0x7803,
++	0x0004, 0x6810, 0x781a, 0x6814, 0x781e, 0x6824, 0x2050, 0x6818,
++	0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f, 0x2009, 0x0011,
++	0x080c, 0x1a43, 0x0120, 0x2009, 0x0001, 0x080c, 0x1a43, 0x2d58,
++	0x0005, 0x080c, 0x1dac, 0x0904, 0x19b1, 0x0cd0, 0x6020, 0xd0f4,
++	0x11e0, 0xd0d4, 0x01b8, 0x6038, 0xa402, 0x6034, 0xa303, 0x0108,
++	0x1288, 0x643a, 0x6336, 0x6c2a, 0x6b2e, 0x0046, 0x0036, 0x2400,
++	0x6c7c, 0xa402, 0x6812, 0x2300, 0x6b80, 0xa303, 0x6816, 0x003e,
++	0x004e, 0x0018, 0x080c, 0x9f2b, 0x09e0, 0x601c, 0xa08e, 0x0008,
++	0x0904, 0x19d7, 0xa08e, 0x000a, 0x0904, 0x19d7, 0x2001, 0xb474,
++	0x2004, 0xd0b4, 0x1140, 0x6018, 0x2004, 0xd0bc, 0x1120, 0x6817,
++	0x7fff, 0x6813, 0xffff, 0x080c, 0x22d6, 0x1918, 0x0804, 0x19d7,
++	0x7003, 0x0000, 0x0005, 0x8aff, 0x0904, 0x1aaf, 0xa03e, 0x2730,
++	0x6850, 0xd0fc, 0x11b8, 0xd0f4, 0x1528, 0x00d6, 0x2805, 0xac68,
++	0x2900, 0x0002, 0x1a93, 0x1a78, 0x1a78, 0x1a93, 0x1a93, 0x1a8c,
++	0x1a93, 0x1a78, 0x1a93, 0x1a7d, 0x1a7d, 0x1a93, 0x1a93, 0x1a93,
++	0x1a84, 0x1a7d, 0x7803, 0x0004, 0xc0fc, 0x6852, 0x6b6c, 0x6a70,
++	0x6d1c, 0x6c20, 0x00d6, 0xd99c, 0x0548, 0x2805, 0xac68, 0x6f08,
++	0x6e0c, 0x0420, 0xc0f4, 0x6852, 0x6b6c, 0x6a70, 0x00d6, 0x0458,
++	0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x00c8, 0x6b10, 0x6a14, 0x6d00,
++	0x6c04, 0x6f08, 0x6e0c, 0x0090, 0x00de, 0x00d6, 0x6834, 0xa084,
++	0x00ff, 0xa086, 0x001e, 0x1138, 0x00de, 0x080c, 0x2278, 0x1904,
++	0x1a43, 0xa00e, 0x00e0, 0x00de, 0x080c, 0x1511, 0x7b22, 0x7a26,
++	0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7316, 0x721a, 0x751e, 0x7422,
++	0x7726, 0x762a, 0x7902, 0x7000, 0x8000, 0x7002, 0x00de, 0x6828,
++	0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x080c, 0x2278, 0x0005,
++	0x080c, 0x1511, 0x080c, 0x1f26, 0x7004, 0x2060, 0x00d6, 0x6010,
++	0x2068, 0x7003, 0x0000, 0x080c, 0x1dcd, 0x080c, 0x9beb, 0x0170,
++	0x6808, 0x8001, 0x680a, 0x697c, 0x6912, 0x6980, 0x6916, 0x682b,
++	0xffff, 0x682f, 0xffff, 0x6850, 0xc0bd, 0x6852, 0x00de, 0x080c,
++	0x98c3, 0x0804, 0x1cfa, 0x080c, 0x1511, 0x0126, 0x2091, 0x2200,
++	0x0006, 0x0016, 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002,
++	0xa184, 0x0700, 0x1978, 0xa184, 0x0003, 0xa086, 0x0003, 0x0d58,
++	0x7000, 0x0002, 0x1af2, 0x1af8, 0x1c09, 0x1cd5, 0x1ce9, 0x1af2,
++	0x1af2, 0x1af2, 0x7804, 0xd09c, 0x1904, 0x1cfa, 0x080c, 0x1511,
++	0x8001, 0x7002, 0xd1bc, 0x11a0, 0xd19c, 0x1904, 0x1b8d, 0xd1dc,
++	0x1178, 0x8aff, 0x0904, 0x1b8d, 0x2009, 0x0001, 0x080c, 0x1a43,
++	0x0904, 0x1cfa, 0x2009, 0x0001, 0x080c, 0x1a43, 0x0804, 0x1cfa,
++	0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc, 0x1904, 0x1b6d, 0x0026,
++	0x0036, 0x7c20, 0x7d24, 0x7e30, 0x7f34, 0x7818, 0x6812, 0x781c,
++	0x6816, 0x2001, 0x0201, 0x2004, 0xa005, 0x0140, 0x7808, 0xd0ec,
++	0x1128, 0x7803, 0x0009, 0x7003, 0x0004, 0x0010, 0x080c, 0x1cfe,
++	0x6b28, 0x6a2c, 0x2400, 0x686e, 0xa31a, 0x2500, 0x6872, 0xa213,
++	0x6b2a, 0x6a2e, 0x00c6, 0x7004, 0x2060, 0x6020, 0xd0f4, 0x1110,
++	0x633a, 0x6236, 0x00ce, 0x003e, 0x002e, 0x6e1e, 0x6f22, 0x2500,
++	0xa405, 0x0128, 0x080c, 0x228e, 0x6850, 0xc0fd, 0x6852, 0x2a00,
++	0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x6808, 0x8001, 0x680a,
++	0x1148, 0x684c, 0xd0e4, 0x0130, 0x7004, 0x2060, 0x2009, 0x0048,
++	0x080c, 0x85ef, 0x7000, 0xa086, 0x0004, 0x0904, 0x1cfa, 0x7003,
++	0x0000, 0x080c, 0x19b1, 0x0804, 0x1cfa, 0x0056, 0x7d0c, 0xd5bc,
++	0x1110, 0x080c, 0xb38a, 0x005e, 0x080c, 0x1dcd, 0x00f6, 0x7004,
++	0x2078, 0x080c, 0x52c6, 0x0118, 0x7820, 0xc0f5, 0x7822, 0x00fe,
++	0x682b, 0xffff, 0x682f, 0xffff, 0x6808, 0x8001, 0x680a, 0x697c,
++	0x791a, 0x6980, 0x791e, 0x0804, 0x1cfa, 0x7004, 0x00c6, 0x2060,
++	0x6020, 0x00ce, 0xd0f4, 0x0120, 0x6808, 0x8001, 0x680a, 0x04c0,
++	0x7818, 0x6812, 0x7a1c, 0x6a16, 0xd19c, 0x0160, 0xa205, 0x0150,
++	0x7004, 0xa080, 0x0007, 0x2004, 0xa084, 0xfffd, 0xa086, 0x0008,
++	0x1904, 0x1b10, 0x684c, 0xc0f5, 0x684e, 0x7814, 0xa005, 0x1520,
++	0x7003, 0x0000, 0x6808, 0x8001, 0x680a, 0x01a0, 0x7004, 0x2060,
++	0x601c, 0xa086, 0x000a, 0x11a0, 0x0156, 0x20a9, 0x0009, 0x2009,
++	0xb72f, 0x2104, 0xac06, 0x1108, 0x200a, 0xa188, 0x0003, 0x1f04,
++	0x1bc1, 0x015e, 0x7004, 0x2060, 0x2009, 0x0048, 0x080c, 0x85ef,
++	0x080c, 0x19b1, 0x0804, 0x1cfa, 0x7818, 0x6812, 0x781c, 0x6816,
++	0x7814, 0x7908, 0xa18c, 0x0fff, 0xa192, 0x0841, 0x1a04, 0x1ab2,
++	0xa188, 0x0007, 0x8114, 0x8214, 0x8214, 0xa10a, 0x8104, 0x8004,
++	0x8004, 0xa20a, 0x810b, 0x810b, 0x810b, 0x080c, 0x1e6a, 0x7803,
++	0x0004, 0x780f, 0xffff, 0x7803, 0x0001, 0x7804, 0xd0fc, 0x0de8,
++	0x7803, 0x0002, 0x7803, 0x0004, 0x780f, 0x00f6, 0x7004, 0x7007,
++	0x0000, 0x2060, 0x2009, 0x0048, 0x080c, 0x85ef, 0x080c, 0x1ec0,
++	0x0838, 0x8001, 0x7002, 0xd194, 0x01b0, 0x7804, 0xd0fc, 0x1904,
++	0x1ca5, 0xd09c, 0x0138, 0x7804, 0xd0fc, 0x1904, 0x1ca5, 0xd09c,
++	0x1904, 0x1ca9, 0x8aff, 0x0904, 0x1cfa, 0x2009, 0x0001, 0x080c,
++	0x1a43, 0x0804, 0x1cfa, 0xa184, 0x0888, 0x1148, 0x8aff, 0x0904,
++	0x1cfa, 0x2009, 0x0001, 0x080c, 0x1a43, 0x0804, 0x1cfa, 0x7818,
++	0x6812, 0x7a1c, 0x6a16, 0xa205, 0x0904, 0x1baa, 0x7803, 0x0004,
++	0x7003, 0x0000, 0xd1bc, 0x1904, 0x1c87, 0x6834, 0xa084, 0x00ff,
++	0xa086, 0x0029, 0x1118, 0xd19c, 0x1904, 0x1baa, 0x0026, 0x0036,
++	0x7c20, 0x7d24, 0x7e30, 0x7f34, 0x7818, 0x6812, 0x781c, 0x6816,
++	0x2001, 0x0201, 0x2004, 0xa005, 0x0140, 0x7808, 0xd0ec, 0x1128,
++	0x7803, 0x0009, 0x7003, 0x0004, 0x0020, 0x0016, 0x080c, 0x1cfe,
++	0x001e, 0x6b28, 0x6a2c, 0x080c, 0x228e, 0x00d6, 0x2805, 0xac68,
++	0x6034, 0xd09c, 0x1128, 0x6808, 0xa31a, 0x680c, 0xa213, 0x0020,
++	0x6810, 0xa31a, 0x6814, 0xa213, 0x00de, 0xd194, 0x0904, 0x1b32,
++	0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x6808, 0x8001,
++	0x680a, 0x6b2a, 0x6a2e, 0x003e, 0x002e, 0x0804, 0x1bd0, 0x0056,
++	0x7d0c, 0x080c, 0xb38a, 0x005e, 0x080c, 0x1dcd, 0x00f6, 0x7004,
++	0x2078, 0x080c, 0x52c6, 0x0118, 0x7820, 0xc0f5, 0x7822, 0x00fe,
++	0x682b, 0xffff, 0x682f, 0xffff, 0x6808, 0x8001, 0x680a, 0x697c,
++	0x791a, 0x6980, 0x791e, 0x0804, 0x1cfa, 0x7804, 0xd09c, 0x0904,
++	0x1add, 0x7c20, 0x7824, 0xa405, 0x1904, 0x1add, 0x7818, 0x6812,
++	0x7c1c, 0x6c16, 0xa405, 0x1120, 0x7803, 0x0002, 0x0804, 0x1baa,
++	0x751c, 0x7420, 0x7724, 0x7628, 0x7014, 0xa528, 0x7018, 0xa421,
++	0xa7b9, 0x0000, 0xa6b1, 0x0000, 0x7830, 0xa506, 0x1150, 0x7834,
++	0xa406, 0x1138, 0x7838, 0xa706, 0x1120, 0x783c, 0xa606, 0x0904,
++	0x1add, 0x7803, 0x0002, 0x0804, 0x1c36, 0x7803, 0x0004, 0x7003,
++	0x0000, 0x7004, 0xa00d, 0x0150, 0x6808, 0x8001, 0x680a, 0x1130,
++	0x7004, 0x2060, 0x2009, 0x0048, 0x080c, 0x85ef, 0x080c, 0x19b1,
++	0x0088, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x6010,
++	0xa005, 0x0da0, 0x2068, 0x6808, 0x8000, 0x680a, 0x6c28, 0x6b2c,
++	0x080c, 0x19cc, 0x001e, 0x000e, 0x012e, 0x0005, 0x700c, 0x7110,
++	0xa106, 0x0904, 0x1da0, 0x7004, 0x0016, 0x210c, 0xa106, 0x001e,
++	0x0904, 0x1da0, 0x00d6, 0x00c6, 0x216c, 0x2d00, 0xa005, 0x0904,
++	0x1d9e, 0x681c, 0xa086, 0x0008, 0x0904, 0x1d9e, 0x6820, 0xd0d4,
++	0x1904, 0x1d9e, 0x6810, 0x2068, 0x6850, 0xd0fc, 0x05a8, 0x8108,
++	0x2104, 0x6b2c, 0xa306, 0x1904, 0x1d9e, 0x8108, 0x2104, 0x6a28,
++	0xa206, 0x1904, 0x1d9e, 0x6850, 0xc0fc, 0xc0f5, 0x6852, 0x686c,
++	0x7822, 0x7016, 0x6870, 0x7826, 0x701a, 0x681c, 0x7832, 0x701e,
++	0x6820, 0x7836, 0x7022, 0x6818, 0x2060, 0x6034, 0xd09c, 0x0168,
++	0x6830, 0x2005, 0x00d6, 0xac68, 0x6808, 0x783a, 0x7026, 0x680c,
++	0x783e, 0x702a, 0x00de, 0x0804, 0x1d98, 0xa006, 0x783a, 0x783e,
++	0x7026, 0x702a, 0x0804, 0x1d98, 0x8108, 0x2104, 0xa005, 0x1904,
++	0x1d9e, 0x6b2c, 0xa306, 0x1904, 0x1d9e, 0x8108, 0x2104, 0xa005,
++	0x15e8, 0x6a28, 0xa206, 0x15d0, 0x6850, 0xc0f5, 0x6852, 0x6830,
++	0x2005, 0x6918, 0xa160, 0xa180, 0x000d, 0x2004, 0xd09c, 0x11a0,
++	0x6008, 0x7822, 0x7016, 0x686e, 0x600c, 0x7826, 0x701a, 0x6872,
++	0x6000, 0x7832, 0x701e, 0x6004, 0x7836, 0x7022, 0xa006, 0x783a,
++	0x783e, 0x7026, 0x702a, 0x00a0, 0x6010, 0x7822, 0x7016, 0x686e,
++	0x6014, 0x7826, 0x701a, 0x6872, 0x6000, 0x7832, 0x701e, 0x6004,
++	0x7836, 0x7022, 0x6008, 0x783a, 0x7026, 0x600c, 0x783e, 0x702a,
++	0x6810, 0x781a, 0x6814, 0x781e, 0x7803, 0x0011, 0x00ce, 0x00de,
++	0x0005, 0x2011, 0x0201, 0x2009, 0x003c, 0x2204, 0xa005, 0x1118,
++	0x8109, 0x1dd8, 0x0005, 0x0005, 0x0ca1, 0x0118, 0x780c, 0xd0a4,
++	0x0120, 0x00d9, 0xa085, 0x0001, 0x0010, 0x080c, 0x1ec0, 0x0005,
++	0x0126, 0x2091, 0x2200, 0x7000, 0xa086, 0x0003, 0x1160, 0x700c,
++	0x7110, 0xa106, 0x0140, 0x080c, 0x2922, 0x20e1, 0x9028, 0x700f,
++	0xb72f, 0x7013, 0xb72f, 0x012e, 0x0005, 0x00c6, 0x080c, 0x5a90,
++	0x11b8, 0x2001, 0x0160, 0x2003, 0x0000, 0x2001, 0x0138, 0x2003,
++	0x0000, 0x2011, 0x00c8, 0xe000, 0xe000, 0x8211, 0x1de0, 0x04c1,
++	0x0066, 0x2031, 0x0000, 0x080c, 0x5b12, 0x006e, 0x00ce, 0x0005,
++	0x080c, 0x1e3f, 0x080c, 0x2922, 0x20e1, 0x9028, 0x700c, 0x7110,
++	0xa106, 0x01d0, 0x2104, 0xa005, 0x0130, 0x2060, 0x6010, 0x2060,
++	0x6008, 0x8001, 0x600a, 0xa188, 0x0003, 0xa182, 0xb74a, 0x0210,
++	0x2009, 0xb72f, 0x7112, 0x700c, 0xa106, 0x1d40, 0x080c, 0x28b1,
++	0x2001, 0x0138, 0x2102, 0x0c10, 0x2001, 0x015d, 0x2003, 0x0000,
++	0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x00ce, 0x0005,
++	0x080c, 0x2922, 0x20e1, 0x9028, 0x2001, 0x015d, 0x2003, 0x0000,
++	0x00e6, 0x00c6, 0x0016, 0x2071, 0xb723, 0x700c, 0x7110, 0xa106,
++	0x0190, 0x2104, 0xa005, 0x0130, 0x2060, 0x6010, 0x2060, 0x6008,
++	0x8001, 0x600a, 0xa188, 0x0003, 0xa182, 0xb74a, 0x0210, 0x2009,
++	0xb72f, 0x7112, 0x0c50, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x2001,
++	0x0138, 0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003,
++	0x0000, 0x080c, 0x5a90, 0x1148, 0x2021, 0x0002, 0x1d04, 0x1e4e,
++	0x2091, 0x6000, 0x8421, 0x1dd0, 0x0005, 0x2021, 0xb015, 0x2001,
++	0x0141, 0x201c, 0xd3dc, 0x1168, 0x2001, 0x0109, 0x201c, 0xa39c,
++	0x0048, 0x1138, 0x2001, 0x0111, 0x201c, 0x83ff, 0x1110, 0x8421,
++	0x1d70, 0x0005, 0x00e6, 0x2071, 0x0200, 0x7808, 0xa084, 0xf000,
++	0xa10d, 0x0869, 0x2001, 0x0105, 0x2004, 0xa084, 0x0003, 0x1130,
++	0x2001, 0xb74a, 0x2004, 0xa086, 0x0000, 0x0548, 0xa026, 0x2019,
++	0xf000, 0x8319, 0x1148, 0x2001, 0x012b, 0x2003, 0x95f5, 0x2001,
++	0x0129, 0x2003, 0x95f5, 0x00d8, 0x2001, 0x0105, 0x2004, 0xa084,
++	0x0003, 0x1130, 0x2001, 0xb74a, 0x2004, 0xa086, 0x0000, 0x0178,
++	0x2001, 0x0132, 0x2004, 0xa436, 0x0110, 0x2020, 0x0c00, 0x2001,
++	0x0021, 0x2004, 0xd0fc, 0x09e8, 0x080c, 0x211b, 0x08c0, 0x20e1,
++	0x7000, 0x7324, 0x7420, 0x7028, 0x7028, 0x7426, 0x7037, 0x0001,
++	0x810f, 0x712e, 0x702f, 0x0100, 0x7037, 0x0008, 0x7326, 0x7422,
++	0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x00ee, 0x0005,
++	0x0026, 0x2001, 0x015d, 0x2003, 0x0000, 0x7908, 0xa18c, 0x0fff,
++	0xa182, 0x0ffd, 0x0210, 0x2009, 0x0000, 0xa190, 0x0007, 0xa294,
++	0x1ff8, 0x8214, 0x8214, 0x8214, 0x2001, 0x020a, 0x82ff, 0x0140,
++	0x20e1, 0x6000, 0x200c, 0x200c, 0x200c, 0x200c, 0x8211, 0x1dd0,
++	0x20e1, 0x7000, 0x200c, 0x200c, 0x7003, 0x0000, 0x20e1, 0x6000,
++	0x2001, 0x0208, 0x200c, 0x2001, 0x0209, 0x2004, 0xa106, 0x0158,
++	0x080c, 0x1da1, 0x0130, 0x7908, 0xd1ec, 0x1128, 0x790c, 0xd1a4,
++	0x0960, 0x080c, 0x1dcd, 0xa006, 0x002e, 0x0005, 0x00f6, 0x00e6,
++	0x0016, 0x0026, 0x2071, 0xb723, 0x2079, 0x0030, 0x2011, 0x0050,
++	0x7000, 0xa086, 0x0000, 0x01a8, 0x8211, 0x0188, 0x2001, 0x0005,
++	0x2004, 0xd08c, 0x0dc8, 0x7904, 0xa18c, 0x0780, 0x0016, 0x080c,
++	0x1ad5, 0x001e, 0x81ff, 0x1118, 0x2011, 0x0050, 0x0c48, 0xa085,
++	0x0001, 0x002e, 0x001e, 0x00ee, 0x00fe, 0x0005, 0x7803, 0x0004,
++	0x2009, 0x0064, 0x7804, 0xd0ac, 0x0904, 0x1f72, 0x8109, 0x1dd0,
++	0x2009, 0x0100, 0x210c, 0xa18a, 0x0003, 0x0a0c, 0x1511, 0x080c,
++	0x2222, 0x00e6, 0x00f6, 0x2071, 0xb712, 0x2079, 0x0010, 0x7004,
++	0xa086, 0x0000, 0x0538, 0x7800, 0x0006, 0x7820, 0x0006, 0x7830,
++	0x0006, 0x7834, 0x0006, 0x7838, 0x0006, 0x783c, 0x0006, 0x7803,
++	0x0004, 0xe000, 0xe000, 0x2079, 0x0030, 0x7804, 0xd0ac, 0x190c,
++	0x1511, 0x2079, 0x0010, 0x000e, 0x783e, 0x000e, 0x783a, 0x000e,
++	0x7836, 0x000e, 0x7832, 0x000e, 0x7822, 0x000e, 0x7802, 0x00fe,
++	0x00ee, 0x0030, 0x00fe, 0x00ee, 0x7804, 0xd0ac, 0x190c, 0x1511,
++	0x080c, 0x71f1, 0x0005, 0x00e6, 0x2071, 0xb74a, 0x7003, 0x0000,
++	0x00ee, 0x0005, 0x00d6, 0xa280, 0x0004, 0x206c, 0x694c, 0xd1dc,
++	0x1904, 0x1ff0, 0x6934, 0xa184, 0x0007, 0x0002, 0x1f8e, 0x1fdb,
++	0x1f8e, 0x1f8e, 0x1f8e, 0x1fc2, 0x1fa1, 0x1f90, 0x080c, 0x1511,
++	0x684c, 0xd0b4, 0x0904, 0x20d8, 0x6860, 0x682e, 0x6816, 0x685c,
++	0x682a, 0x6812, 0x687c, 0x680a, 0x6880, 0x680e, 0x6958, 0x0804,
++	0x1fe3, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x1d38, 0x684c,
++	0xd0b4, 0x0904, 0x20d8, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a,
++	0x6812, 0x687c, 0x680a, 0x6880, 0x680e, 0x6804, 0x681a, 0xa080,
++	0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x22b6, 0x2005, 0x6832,
++	0x6958, 0x0450, 0xa18c, 0x00ff, 0xa186, 0x0015, 0x1548, 0x684c,
++	0xd0b4, 0x0904, 0x20d8, 0x6804, 0x681a, 0xa080, 0x000d, 0x2004,
++	0xa084, 0x000f, 0xa080, 0x22b6, 0x2005, 0x6832, 0x6958, 0xa006,
++	0x682e, 0x682a, 0x0088, 0x684c, 0xd0b4, 0x0904, 0x1ab0, 0x6958,
++	0xa006, 0x682e, 0x682a, 0x2d00, 0x681a, 0x6834, 0xa084, 0x000f,
++	0xa080, 0x22b6, 0x2005, 0x6832, 0x6926, 0x684c, 0xc0dd, 0x684e,
++	0x00de, 0x0005, 0x00f6, 0x2079, 0x0020, 0x7804, 0xd0fc, 0x190c,
++	0x211b, 0x00e6, 0x00d6, 0x2071, 0xb74a, 0x7000, 0xa005, 0x1904,
++	0x2058, 0x00c6, 0x7206, 0xa280, 0x0004, 0x205c, 0x7004, 0x2068,
++	0x7803, 0x0004, 0x6818, 0x00d6, 0x2068, 0x686c, 0x7812, 0x6890,
++	0x00f6, 0x20e1, 0x9040, 0x2079, 0x0200, 0x781a, 0x2079, 0x0100,
++	0x8004, 0x78d6, 0x00fe, 0x00de, 0x2b68, 0x6824, 0x2050, 0x6818,
++	0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f, 0x6908, 0x791a,
++	0x7116, 0x680c, 0x781e, 0x701a, 0xa006, 0x700e, 0x7012, 0x7004,
++	0x692c, 0x6814, 0xa106, 0x1120, 0x6928, 0x6810, 0xa106, 0x0158,
++	0x0036, 0x0046, 0x6b14, 0x6c10, 0x080c, 0x22d6, 0x004e, 0x003e,
++	0x0110, 0x00ce, 0x00a8, 0x8aff, 0x1120, 0x00ce, 0xa085, 0x0001,
++	0x0078, 0x0126, 0x2091, 0x8000, 0x2079, 0x0020, 0x2009, 0x0001,
++	0x0059, 0x0118, 0x2009, 0x0001, 0x0039, 0x012e, 0x00ce, 0xa006,
++	0x00de, 0x00ee, 0x00fe, 0x0005, 0x0076, 0x0066, 0x0056, 0x0046,
++	0x0036, 0x0026, 0x8aff, 0x0904, 0x20d1, 0x700c, 0x7214, 0xa23a,
++	0x7010, 0x7218, 0xa203, 0x0a04, 0x20d0, 0xa705, 0x0904, 0x20d0,
++	0xa03e, 0x2730, 0x6850, 0xd0fc, 0x11a8, 0x00d6, 0x2805, 0xac68,
++	0x2900, 0x0002, 0x20b3, 0x2098, 0x2098, 0x20b3, 0x20b3, 0x20ac,
++	0x20b3, 0x2098, 0x20b3, 0x209d, 0x209d, 0x20b3, 0x20b3, 0x20b3,
++	0x20a4, 0x209d, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20,
++	0xd99c, 0x0528, 0x00d6, 0x2805, 0xac68, 0x6f08, 0x6e0c, 0x00f0,
++	0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x00c8, 0x6b10, 0x6a14, 0x6d00,
++	0x6c04, 0x6f08, 0x6e0c, 0x0090, 0x00de, 0x00d6, 0x6834, 0xa084,
++	0x00ff, 0xa086, 0x001e, 0x1138, 0x00de, 0x080c, 0x2278, 0x1904,
++	0x2062, 0xa00e, 0x00f0, 0x00de, 0x080c, 0x1511, 0x00de, 0x7b22,
++	0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000, 0x8000,
++	0x7002, 0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x700c,
++	0xa300, 0x700e, 0x7010, 0xa201, 0x7012, 0x080c, 0x2278, 0x0008,
++	0xa006, 0x002e, 0x003e, 0x004e, 0x005e, 0x006e, 0x007e, 0x0005,
++	0x080c, 0x1511, 0x0026, 0x2001, 0x0105, 0x2003, 0x0010, 0x20e1,
++	0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x00d6,
++	0x6010, 0x2068, 0x080c, 0x9beb, 0x0118, 0x6850, 0xc0bd, 0x6852,
++	0x601c, 0xa086, 0x0006, 0x1180, 0x2061, 0x0100, 0x62c8, 0x2001,
++	0x00fa, 0x8001, 0x1df0, 0x60c8, 0xa206, 0x1dc0, 0x60c4, 0x686a,
++	0x60c8, 0x6866, 0x7004, 0x2060, 0x00de, 0x00c6, 0x080c, 0x98c3,
++	0x00ce, 0x2001, 0xb6ef, 0x2004, 0xac06, 0x1150, 0x20e1, 0x9040,
++	0x080c, 0x8200, 0x2011, 0x0000, 0x080c, 0x8029, 0x080c, 0x71f1,
++	0x002e, 0x0804, 0x21d5, 0x0126, 0x2091, 0x2400, 0x0006, 0x0016,
++	0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x2079, 0x0020, 0x2071, 0xb74a,
++	0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700,
++	0x1904, 0x20da, 0x7000, 0x0002, 0x21d5, 0x2138, 0x21a8, 0x21d3,
++	0x8001, 0x7002, 0xd19c, 0x1170, 0x8aff, 0x05d0, 0x2009, 0x0001,
++	0x080c, 0x205c, 0x0904, 0x21d5, 0x2009, 0x0001, 0x080c, 0x205c,
++	0x0804, 0x21d5, 0x7803, 0x0004, 0xd194, 0x0148, 0x6850, 0xc0fc,
++	0x6852, 0x8aff, 0x11d8, 0x684c, 0xc0f5, 0x684e, 0x00b8, 0x0026,
++	0x0036, 0x6b28, 0x6a2c, 0x7820, 0x686e, 0xa31a, 0x7824, 0x6872,
++	0xa213, 0x7830, 0x681e, 0x7834, 0x6822, 0x6b2a, 0x6a2e, 0x003e,
++	0x002e, 0x080c, 0x228e, 0x6850, 0xc0fd, 0x6852, 0x2a00, 0x6826,
++	0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, 0x0000, 0x0804, 0x21d5,
++	0x00f6, 0x0026, 0x781c, 0x0006, 0x7818, 0x0006, 0x2079, 0x0100,
++	0x7a14, 0xa284, 0x0184, 0xa085, 0x0012, 0x7816, 0x0036, 0x2019,
++	0x1000, 0x8319, 0x090c, 0x1511, 0x7820, 0xd0bc, 0x1dd0, 0x003e,
++	0x79c8, 0x000e, 0xa102, 0x001e, 0x0006, 0x0016, 0x79c4, 0x000e,
++	0xa103, 0x78c6, 0x000e, 0x78ca, 0xa284, 0x0184, 0xa085, 0x0012,
++	0x7816, 0x002e, 0x00fe, 0x7803, 0x0008, 0x7003, 0x0000, 0x0468,
++	0x8001, 0x7002, 0xd194, 0x0168, 0x7804, 0xd0fc, 0x1904, 0x212b,
++	0xd19c, 0x11f8, 0x8aff, 0x0508, 0x2009, 0x0001, 0x080c, 0x205c,
++	0x00e0, 0x0026, 0x0036, 0x6b28, 0x6a2c, 0x080c, 0x228e, 0x00d6,
++	0x2805, 0xac68, 0x6034, 0xd09c, 0x1128, 0x6808, 0xa31a, 0x680c,
++	0xa213, 0x0020, 0x6810, 0xa31a, 0x6814, 0xa213, 0x00de, 0x0804,
++	0x215b, 0x0804, 0x2157, 0x080c, 0x1511, 0x00ce, 0x00de, 0x00ee,
++	0x00fe, 0x001e, 0x000e, 0x012e, 0x0005, 0x00f6, 0x00e6, 0x2071,
++	0xb74a, 0x7000, 0xa086, 0x0000, 0x05d0, 0x2079, 0x0020, 0x0016,
++	0x2009, 0x0207, 0x210c, 0xd194, 0x0198, 0x2009, 0x020c, 0x210c,
++	0xa184, 0x0003, 0x0168, 0x080c, 0xb3d3, 0x2001, 0x0133, 0x2004,
++	0xa005, 0x090c, 0x1511, 0x20e1, 0x9040, 0x2001, 0x020c, 0x2102,
++	0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0xa106, 0x1110,
++	0x20e1, 0x9040, 0x7804, 0xd0fc, 0x09d8, 0x080c, 0x211b, 0x7000,
++	0xa086, 0x0000, 0x19a8, 0x001e, 0x7803, 0x0004, 0x7804, 0xd0ac,
++	0x1de8, 0x20e1, 0x9040, 0x7803, 0x0002, 0x7003, 0x0000, 0x00ee,
++	0x00fe, 0x0005, 0x0026, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2071,
++	0xb74a, 0x2079, 0x0020, 0x7000, 0xa086, 0x0000, 0x0540, 0x7004,
++	0x2060, 0x6010, 0x2068, 0x080c, 0x9beb, 0x0158, 0x6850, 0xc0b5,
++	0x6852, 0x680c, 0x7a1c, 0xa206, 0x1120, 0x6808, 0x7a18, 0xa206,
++	0x01e0, 0x2001, 0x0105, 0x2003, 0x0010, 0x20e1, 0x9040, 0x7803,
++	0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x080c, 0x98c3, 0x20e1,
++	0x9040, 0x080c, 0x8200, 0x2011, 0x0000, 0x080c, 0x8029, 0x00fe,
++	0x00ee, 0x00de, 0x00ce, 0x002e, 0x0005, 0x6810, 0x6a14, 0xa205,
++	0x1d00, 0x684c, 0xc0dc, 0x684e, 0x2c10, 0x080c, 0x1f7a, 0x2001,
++	0x0105, 0x2003, 0x0010, 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003,
++	0x0000, 0x2069, 0xb6e0, 0x6833, 0x0000, 0x683f, 0x0000, 0x08f8,
++	0x8840, 0x2805, 0xa005, 0x1170, 0x6004, 0xa005, 0x0168, 0x681a,
++	0x2060, 0x6034, 0xa084, 0x000f, 0xa080, 0x22b6, 0x2045, 0x88ff,
++	0x090c, 0x1511, 0x8a51, 0x0005, 0x2050, 0x0005, 0x8a50, 0x8841,
++	0x2805, 0xa005, 0x1190, 0x2c00, 0xad06, 0x0120, 0x6000, 0xa005,
++	0x1108, 0x2d00, 0x2060, 0x681a, 0x6034, 0xa084, 0x000f, 0xa080,
++	0x22c6, 0x2045, 0x88ff, 0x090c, 0x1511, 0x0005, 0x0000, 0x0011,
++	0x0015, 0x0019, 0x001d, 0x0021, 0x0025, 0x0029, 0x0000, 0x000f,
++	0x0015, 0x001b, 0x0021, 0x0027, 0x0000, 0x0000, 0x0000, 0x22ab,
++	0x22a7, 0x0000, 0x0000, 0x22b5, 0x0000, 0x22ab, 0x0000, 0x22b2,
++	0x22af, 0x0000, 0x0000, 0x0000, 0x22b5, 0x22b2, 0x0000, 0x22ad,
++	0x22ad, 0x0000, 0x0000, 0x22b5, 0x0000, 0x22ad, 0x0000, 0x22b3,
++	0x22b3, 0x0000, 0x0000, 0x0000, 0x22b5, 0x22b3, 0x00a6, 0x0096,
++	0x0086, 0x6b2e, 0x6c2a, 0x6858, 0xa055, 0x0904, 0x2367, 0x2d60,
++	0x6034, 0xa0cc, 0x000f, 0xa9c0, 0x22b6, 0xa986, 0x0007, 0x0130,
++	0xa986, 0x000e, 0x0118, 0xa986, 0x000f, 0x1120, 0x605c, 0xa422,
++	0x6060, 0xa31a, 0x2805, 0xa045, 0x1140, 0x0310, 0x0804, 0x2367,
++	0x6004, 0xa065, 0x0904, 0x2367, 0x0c18, 0x2805, 0xa005, 0x01a8,
++	0xac68, 0xd99c, 0x1128, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0020,
++	0x6810, 0xa422, 0x6814, 0xa31b, 0x0620, 0x2300, 0xa405, 0x0150,
++	0x8a51, 0x0904, 0x2367, 0x8840, 0x0c40, 0x6004, 0xa065, 0x0904,
++	0x2367, 0x0830, 0x8a51, 0x0904, 0x2367, 0x8840, 0x2805, 0xa005,
++	0x1158, 0x6004, 0xa065, 0x0904, 0x2367, 0x6034, 0xa0cc, 0x000f,
++	0xa9c0, 0x22b6, 0x2805, 0x2040, 0x2b68, 0x6850, 0xc0fc, 0x6852,
++	0x0458, 0x8422, 0x8420, 0x831a, 0xa399, 0x0000, 0x00d6, 0x2b68,
++	0x6c6e, 0x6b72, 0x00de, 0xd99c, 0x1168, 0x6908, 0x2400, 0xa122,
++	0x690c, 0x2300, 0xa11b, 0x0a0c, 0x1511, 0x6800, 0xa420, 0x6804,
++	0xa319, 0x0060, 0x6910, 0x2400, 0xa122, 0x6914, 0x2300, 0xa11b,
++	0x0a0c, 0x1511, 0x6800, 0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e,
++	0x6b22, 0x6850, 0xc0fd, 0x6852, 0x2c00, 0x681a, 0x2800, 0x6832,
++	0x2a00, 0x6826, 0x000e, 0x000e, 0x000e, 0xa006, 0x0028, 0x008e,
++	0x009e, 0x00ae, 0xa085, 0x0001, 0x0005, 0x2001, 0x0005, 0x2004,
++	0xa084, 0x0007, 0x0002, 0x237b, 0x237c, 0x237f, 0x2382, 0x2387,
++	0x238a, 0x238f, 0x2394, 0x0005, 0x080c, 0x211b, 0x0005, 0x080c,
++	0x1ad5, 0x0005, 0x080c, 0x1ad5, 0x080c, 0x211b, 0x0005, 0x080c,
++	0x1713, 0x0005, 0x080c, 0x211b, 0x080c, 0x1713, 0x0005, 0x080c,
++	0x1ad5, 0x080c, 0x1713, 0x0005, 0x080c, 0x1ad5, 0x080c, 0x211b,
++	0x080c, 0x1713, 0x0005, 0x0126, 0x2091, 0x2600, 0x2079, 0x0200,
++	0x2071, 0xba80, 0x2069, 0xb400, 0x080c, 0x2489, 0x080c, 0x2479,
++	0x2009, 0x0004, 0x7912, 0x7817, 0x0004, 0x080c, 0x27be, 0x781b,
++	0x0002, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a9, 0x0080, 0x782f,
++	0x0000, 0x1f04, 0x23b7, 0x20e1, 0x9080, 0x783b, 0x001f, 0x20e1,
++	0x8700, 0x012e, 0x0005, 0x0126, 0x2091, 0x2600, 0x781c, 0xd0a4,
++	0x190c, 0x2476, 0xa084, 0x0007, 0x0002, 0x23e7, 0x23d5, 0x23d8,
++	0x23db, 0x23e0, 0x23e2, 0x23e4, 0x23e6, 0x080c, 0x6385, 0x0078,
++	0x080c, 0x63c4, 0x0060, 0x080c, 0x6385, 0x080c, 0x63c4, 0x0038,
++	0x0041, 0x0028, 0x0031, 0x0018, 0x0021, 0x0008, 0x0011, 0x012e,
++	0x0005, 0x0006, 0x0016, 0x0026, 0x080c, 0xb3d3, 0x7930, 0xa184,
++	0x0003, 0x0170, 0x2001, 0xb6ef, 0x2004, 0xa005, 0x0130, 0x2001,
++	0x0133, 0x2004, 0xa005, 0x090c, 0x1511, 0x20e1, 0x9040, 0x04a0,
++	0xa184, 0x0030, 0x01e0, 0x6a00, 0xa286, 0x0003, 0x1108, 0x00a0,
++	0x080c, 0x5a90, 0x1178, 0x2001, 0xb69f, 0x2003, 0x0001, 0x2001,
++	0xb400, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5ad4, 0x080c,
++	0x59c8, 0x0010, 0x080c, 0x4ad9, 0x080c, 0x2479, 0x00a8, 0xa184,
++	0x00c0, 0x0168, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0xb723,
++	0x080c, 0x1dcd, 0x005e, 0x004e, 0x003e, 0x00ee, 0x0028, 0xa184,
++	0x0300, 0x0110, 0x20e1, 0x9020, 0x7932, 0x002e, 0x001e, 0x000e,
++	0x0005, 0x0016, 0x00e6, 0x00f6, 0x2071, 0xb400, 0x7128, 0x2001,
++	0xb691, 0x2102, 0x2001, 0xb699, 0x2102, 0xa182, 0x0211, 0x1218,
++	0x2009, 0x0008, 0x0400, 0xa182, 0x0259, 0x1218, 0x2009, 0x0007,
++	0x00d0, 0xa182, 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0xa182,
++	0x0349, 0x1218, 0x2009, 0x0005, 0x0070, 0xa182, 0x0421, 0x1218,
++	0x2009, 0x0004, 0x0040, 0xa182, 0x0581, 0x1218, 0x2009, 0x0003,
++	0x0010, 0x2009, 0x0002, 0x2079, 0x0200, 0x7912, 0x7817, 0x0004,
++	0x080c, 0x27be, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x7938, 0x080c,
++	0x1511, 0x00e6, 0x0026, 0x2071, 0x0200, 0x20e1, 0x1000, 0x7220,
++	0x7028, 0x7020, 0xa206, 0x0de0, 0x20e1, 0x9010, 0x002e, 0x00ee,
++	0x0005, 0x20e1, 0xa000, 0x7837, 0x0001, 0x782f, 0x0000, 0x782f,
++	0x0000, 0x782f, 0x0000, 0x782f, 0x0000, 0x7837, 0x0005, 0x20a9,
++	0x0210, 0x7830, 0xd0bc, 0x1110, 0x1f04, 0x2499, 0x7837, 0x0001,
++	0x7837, 0x0000, 0xe000, 0xe000, 0x20e1, 0xa000, 0x0005, 0x0126,
++	0x2091, 0x2800, 0x2061, 0x0100, 0x2071, 0xb400, 0x6024, 0x6026,
++	0x6053, 0x0030, 0x080c, 0x27fd, 0x6050, 0xa084, 0xfe7f, 0x6052,
++	0x2009, 0x00ef, 0x6132, 0x6136, 0x080c, 0x280d, 0x60e7, 0x0000,
++	0x61ea, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f,
++	0x0080, 0x602f, 0x0000, 0x6007, 0x0e9f, 0x601b, 0x001e, 0x600f,
++	0x00ff, 0x2001, 0xb68d, 0x2003, 0x00ff, 0x602b, 0x002f, 0x012e,
++	0x0005, 0x2001, 0xb432, 0x2003, 0x0000, 0x2001, 0xb431, 0x2003,
++	0x0001, 0x0005, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026,
++	0x6124, 0xa184, 0x1e2c, 0x1118, 0xa184, 0x0007, 0x002a, 0xa195,
++	0x0004, 0xa284, 0x0007, 0x0002, 0x2516, 0x24fc, 0x24ff, 0x2502,
++	0x2507, 0x2509, 0x250d, 0x2511, 0x080c, 0x6b39, 0x00b8, 0x080c,
++	0x6c14, 0x00a0, 0x080c, 0x6c14, 0x080c, 0x6b39, 0x0078, 0x0099,
++	0x0068, 0x080c, 0x6b39, 0x0079, 0x0048, 0x080c, 0x6c14, 0x0059,
++	0x0028, 0x080c, 0x6c14, 0x080c, 0x6b39, 0x0029, 0x002e, 0x001e,
++	0x000e, 0x012e, 0x0005, 0x6124, 0xd19c, 0x1904, 0x272c, 0x080c,
++	0x5a90, 0x0578, 0x7000, 0xa086, 0x0003, 0x0198, 0x6024, 0xa084,
++	0x1800, 0x0178, 0x080c, 0x5ab6, 0x0118, 0x080c, 0x5aa2, 0x1148,
++	0x6027, 0x0020, 0x6043, 0x0000, 0x2001, 0xb69e, 0x2003, 0xaaaa,
++	0x0458, 0x080c, 0x5ab6, 0x15d0, 0x6024, 0xa084, 0x1800, 0x1108,
++	0x04a8, 0x2001, 0xb69e, 0x2003, 0xaaaa, 0x2001, 0xb69f, 0x2003,
++	0x0001, 0x2001, 0xb400, 0x2003, 0x0001, 0x080c, 0x59c8, 0x0804,
++	0x272c, 0xd1ac, 0x1518, 0x6024, 0xd0dc, 0x1170, 0xd0e4, 0x1188,
++	0xd0d4, 0x11a0, 0xd0cc, 0x0130, 0x708c, 0xa086, 0x0028, 0x1110,
++	0x080c, 0x5c1f, 0x0804, 0x272c, 0x2001, 0xb69f, 0x2003, 0x0000,
++	0x0048, 0x2001, 0xb69f, 0x2003, 0x0002, 0x0020, 0x080c, 0x5b92,
++	0x0804, 0x272c, 0x080c, 0x5cc4, 0x0804, 0x272c, 0xd1ac, 0x0904,
++	0x2674, 0x080c, 0x5a90, 0x11d8, 0x6027, 0x0020, 0x0006, 0x0026,
++	0x0036, 0x080c, 0x5aac, 0x1170, 0x2001, 0xb69f, 0x2003, 0x0001,
++	0x2001, 0xb400, 0x2003, 0x0001, 0x080c, 0x59c8, 0x003e, 0x002e,
++	0x000e, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c, 0x5a67, 0x0016,
++	0x0046, 0x00c6, 0x644c, 0xa486, 0xf0f0, 0x1138, 0x2061, 0x0100,
++	0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74ce, 0xa48c, 0xff00,
++	0x7034, 0xd084, 0x0178, 0xa186, 0xf800, 0x1160, 0x703c, 0xd084,
++	0x1148, 0xc085, 0x703e, 0x0036, 0x2418, 0x2011, 0x8016, 0x080c,
++	0x3e8a, 0x003e, 0xa196, 0xff00, 0x05b8, 0x7054, 0xa084, 0x00ff,
++	0x810f, 0xa116, 0x0588, 0x7130, 0xd184, 0x1570, 0x2011, 0xb453,
++	0x2214, 0xd2ec, 0x0138, 0xc18d, 0x7132, 0x2011, 0xb453, 0x2214,
++	0xd2ac, 0x1510, 0x6240, 0xa294, 0x0010, 0x0130, 0x6248, 0xa294,
++	0xff00, 0xa296, 0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, 0x2641,
++	0x7034, 0xd08c, 0x1140, 0x2001, 0xb40c, 0x200c, 0xd1ac, 0x1904,
++	0x2641, 0xc1ad, 0x2102, 0x0036, 0x73cc, 0x2011, 0x8013, 0x080c,
++	0x3e8a, 0x003e, 0x0804, 0x2641, 0x7034, 0xd08c, 0x1140, 0x2001,
++	0xb40c, 0x200c, 0xd1ac, 0x1904, 0x2641, 0xc1ad, 0x2102, 0x0036,
++	0x73cc, 0x2011, 0x8013, 0x080c, 0x3e8a, 0x003e, 0x7130, 0xc185,
++	0x7132, 0x2011, 0xb453, 0x220c, 0xd1a4, 0x01d0, 0x0016, 0x2009,
++	0x0001, 0x2011, 0x0100, 0x080c, 0x6adf, 0x2019, 0x000e, 0x080c,
++	0xafe8, 0xa484, 0x00ff, 0xa080, 0x2d88, 0x200d, 0xa18c, 0xff00,
++	0x810f, 0x8127, 0xa006, 0x2009, 0x000e, 0x080c, 0xb06b, 0x001e,
++	0xd1ac, 0x1148, 0x0016, 0x2009, 0x0000, 0x2019, 0x0004, 0x080c,
++	0x2c33, 0x001e, 0x0070, 0x0156, 0x20a9, 0x007f, 0x2009, 0x0000,
++	0x080c, 0x4f6a, 0x1110, 0x080c, 0x4bc5, 0x8108, 0x1f04, 0x2638,
++	0x015e, 0x00ce, 0x004e, 0x2011, 0x0003, 0x080c, 0x801f, 0x2011,
++	0x0002, 0x080c, 0x8029, 0x080c, 0x7f03, 0x0036, 0x2019, 0x0000,
++	0x080c, 0x7f8e, 0x003e, 0x60e3, 0x0000, 0x001e, 0x2001, 0xb400,
++	0x2014, 0xa296, 0x0004, 0x1128, 0xd19c, 0x11b0, 0x6228, 0xc29d,
++	0x622a, 0x2003, 0x0001, 0x2001, 0xb423, 0x2003, 0x0000, 0x6027,
++	0x0020, 0x080c, 0x5ab6, 0x1140, 0x0016, 0x2009, 0x07d0, 0x2011,
++	0x59a5, 0x080c, 0x69e7, 0x001e, 0xd194, 0x0904, 0x272c, 0x0016,
++	0x6220, 0xd2b4, 0x0904, 0x26dd, 0x080c, 0x69d5, 0x080c, 0x7d24,
++	0x6027, 0x0004, 0x00f6, 0x2019, 0xb6e9, 0x2304, 0xa07d, 0x0570,
++	0x7804, 0xa086, 0x0032, 0x1550, 0x00d6, 0x00c6, 0x00e6, 0x2069,
++	0x0140, 0x618c, 0x6288, 0x7818, 0x608e, 0x7808, 0x608a, 0x6043,
++	0x0002, 0x2001, 0x0003, 0x8001, 0x1df0, 0x6043, 0x0000, 0x6803,
++	0x1000, 0x6803, 0x0000, 0x618e, 0x628a, 0x080c, 0x7055, 0x080c,
++	0x7134, 0x7810, 0x2070, 0x7037, 0x0103, 0x2f60, 0x080c, 0x85c0,
++	0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x0005, 0x00fe, 0x00d6,
++	0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0120, 0x6803, 0x1000,
++	0x6803, 0x0000, 0x00de, 0x00c6, 0x2061, 0xb6e0, 0x6028, 0xa09a,
++	0x00c8, 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0x7d17, 0x0804,
++	0x272b, 0x2019, 0xb6e9, 0x2304, 0xa065, 0x0120, 0x2009, 0x0027,
++	0x080c, 0x85ef, 0x00ce, 0x0804, 0x272b, 0xd2bc, 0x0904, 0x272b,
++	0x080c, 0x69e2, 0x6014, 0xa084, 0x0184, 0xa085, 0x0010, 0x6016,
++	0x6027, 0x0004, 0x00d6, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000,
++	0x0120, 0x6803, 0x1000, 0x6803, 0x0000, 0x00de, 0x00c6, 0x2061,
++	0xb6e0, 0x6044, 0xa09a, 0x00c8, 0x12f0, 0x8000, 0x6046, 0x603c,
++	0x00ce, 0xa005, 0x0540, 0x2009, 0x07d0, 0x080c, 0x69da, 0xa080,
++	0x0007, 0x2004, 0xa086, 0x0006, 0x1138, 0x6114, 0xa18c, 0x0184,
++	0xa18d, 0x0012, 0x6116, 0x00b8, 0x6114, 0xa18c, 0x0184, 0xa18d,
++	0x0016, 0x6116, 0x0080, 0x0036, 0x2019, 0x0001, 0x080c, 0x7f8e,
++	0x003e, 0x2019, 0xb6ef, 0x2304, 0xa065, 0x0120, 0x2009, 0x004f,
++	0x080c, 0x85ef, 0x00ce, 0x001e, 0xd19c, 0x0904, 0x2785, 0x7034,
++	0xd0ac, 0x1560, 0x0016, 0x0156, 0x6027, 0x0008, 0x602f, 0x0020,
++	0x20a9, 0x0006, 0x1d04, 0x273a, 0x2091, 0x6000, 0x1f04, 0x273a,
++	0x602f, 0x0000, 0x6150, 0xa185, 0x1400, 0x6052, 0x20a9, 0x0366,
++	0x1d04, 0x2748, 0x2091, 0x6000, 0x6020, 0xd09c, 0x1130, 0x015e,
++	0x6152, 0x001e, 0x6027, 0x0008, 0x0480, 0x080c, 0x28cd, 0x1f04,
++	0x2748, 0x015e, 0x6152, 0x001e, 0x6027, 0x0008, 0x0016, 0x6028,
++	0xc09c, 0x602a, 0x2011, 0x0003, 0x080c, 0x801f, 0x2011, 0x0002,
++	0x080c, 0x8029, 0x080c, 0x7f03, 0x0036, 0x2019, 0x0000, 0x080c,
++	0x7f8e, 0x003e, 0x60e3, 0x0000, 0x080c, 0xb3b2, 0x080c, 0xb3cd,
++	0xa085, 0x0001, 0x080c, 0x5ad4, 0x2001, 0xb400, 0x2003, 0x0004,
++	0x6027, 0x0008, 0x080c, 0x12d9, 0x001e, 0xa18c, 0xffd0, 0x6126,
++	0x0005, 0x0006, 0x0016, 0x0026, 0x00e6, 0x00f6, 0x0126, 0x2091,
++	0x8000, 0x2071, 0xb400, 0x71c4, 0x70c6, 0xa116, 0x0500, 0x81ff,
++	0x0128, 0x2011, 0x8011, 0x080c, 0x3e8a, 0x00c8, 0x2011, 0x8012,
++	0x080c, 0x3e8a, 0x2001, 0xb472, 0x2004, 0xd0fc, 0x1180, 0x0036,
++	0x00c6, 0x080c, 0x2858, 0x080c, 0x7edf, 0x2061, 0x0100, 0x2019,
++	0x0028, 0x2009, 0x0000, 0x080c, 0x2c33, 0x00ce, 0x003e, 0x012e,
++	0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005, 0x00c6, 0x00f6,
++	0x0006, 0x0026, 0x2061, 0x0100, 0xa190, 0x27d1, 0x2205, 0x60f2,
++	0x2011, 0x27de, 0x2205, 0x60ee, 0x002e, 0x000e, 0x00fe, 0x00ce,
++	0x0005, 0x0840, 0x0840, 0x0840, 0x0580, 0x0420, 0x0348, 0x02c0,
++	0x0258, 0x0210, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x0140, 0x00f8,
++	0x00d0, 0x00b0, 0x00a0, 0x2028, 0xa18c, 0x00ff, 0x2130, 0xa094,
++	0xff00, 0x1110, 0x81ff, 0x0118, 0x080c, 0x6672, 0x0038, 0xa080,
++	0x2d88, 0x200d, 0xa18c, 0xff00, 0x810f, 0xa006, 0x0005, 0xa080,
++	0x2d88, 0x200d, 0xa18c, 0x00ff, 0x0005, 0x00d6, 0x2069, 0x0140,
++	0x2001, 0xb415, 0x2003, 0x00ef, 0x20a9, 0x0010, 0xa006, 0x6852,
++	0x6856, 0x1f04, 0x2808, 0x00de, 0x0005, 0x0006, 0x00d6, 0x0026,
++	0x2069, 0x0140, 0x2001, 0xb415, 0x2102, 0x8114, 0x8214, 0x8214,
++	0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, 0xa006, 0x82ff, 0x1128,
++	0xa184, 0x000f, 0xa080, 0xb3e1, 0x2005, 0x6856, 0x8211, 0x1f04,
++	0x281d, 0x002e, 0x00de, 0x000e, 0x0005, 0x00c6, 0x2061, 0xb400,
++	0x6030, 0x0110, 0xc09d, 0x0008, 0xc09c, 0x6032, 0x00ce, 0x0005,
++	0x0156, 0x00d6, 0x0026, 0x0016, 0x0006, 0x2069, 0x0140, 0x6980,
++	0xa116, 0x0180, 0xa112, 0x1230, 0x8212, 0x8210, 0x22a8, 0x2001,
++	0x0402, 0x0018, 0x22a8, 0x2001, 0x0404, 0x680e, 0x1f04, 0x284d,
++	0x680f, 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e, 0x0005,
++	0x2001, 0xb453, 0x2004, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0xa006,
++	0x0046, 0x2020, 0x2009, 0x002e, 0x080c, 0xb06b, 0x004e, 0x0005,
++	0x00f6, 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0548,
++	0xa084, 0x0700, 0xa08e, 0x0300, 0x1520, 0x2011, 0x0000, 0x2009,
++	0x0002, 0x2300, 0xa080, 0x0020, 0x2018, 0x2300, 0x080c, 0x6b05,
++	0x2011, 0x0030, 0x2200, 0x8007, 0xa085, 0x004c, 0x78c2, 0x2009,
++	0x0204, 0x210c, 0x2200, 0xa100, 0x2009, 0x0138, 0x200a, 0x080c,
++	0x5a90, 0x1118, 0x2009, 0xb68f, 0x200a, 0x002e, 0x001e, 0x00fe,
++	0x0005, 0x78c3, 0x0000, 0x0cc8, 0x0126, 0x2091, 0x2800, 0x0006,
++	0x0016, 0x0026, 0x2001, 0x0170, 0x200c, 0x8000, 0x2014, 0xa184,
++	0x0003, 0x0110, 0x0804, 0x1ad3, 0x002e, 0x001e, 0x000e, 0x012e,
++	0x0005, 0x0006, 0x2001, 0x0100, 0x2004, 0xa082, 0x0005, 0x000e,
++	0x0268, 0x2001, 0x0170, 0x200c, 0xa18c, 0x00ff, 0xa18e, 0x004c,
++	0x1128, 0x200c, 0xa18c, 0xff00, 0x810f, 0x0010, 0x2009, 0x0000,
++	0x2001, 0x0204, 0x2004, 0xa108, 0x0005, 0x0006, 0x0156, 0x00f6,
++	0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd08c, 0x1110, 0x1f04,
++	0x28d4, 0x00fe, 0x015e, 0x000e, 0x0005, 0x0016, 0x00c6, 0x0006,
++	0x2061, 0x0100, 0x6030, 0x0006, 0x6048, 0x0006, 0x60e4, 0x0006,
++	0x60e8, 0x0006, 0x6050, 0x0006, 0x60f0, 0x0006, 0x60ec, 0x0006,
++	0x600c, 0x0006, 0x6004, 0x0006, 0x6028, 0x0006, 0x60e0, 0x0006,
++	0x602f, 0x0100, 0x602f, 0x0000, 0xe000, 0xe000, 0xe000, 0xe000,
++	0x602f, 0x0040, 0x602f, 0x0000, 0x000e, 0x60e2, 0x000e, 0x602a,
++	0x000e, 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x000e, 0x60f2,
++	0x000e, 0x6052, 0x000e, 0x60ea, 0x000e, 0x60e6, 0x000e, 0x604a,
++	0x000e, 0x6032, 0x6036, 0x2008, 0x080c, 0x280d, 0x000e, 0x00ce,
++	0x001e, 0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc, 0x0140, 0x2009,
++	0x0170, 0x2104, 0x200b, 0x0080, 0xe000, 0xe000, 0x200a, 0x0005,
++	0x29c0, 0x29c4, 0x29c8, 0x29ce, 0x29d4, 0x29da, 0x29e0, 0x29e8,
++	0x29f0, 0x29f6, 0x29fc, 0x2a04, 0x2a0c, 0x2a14, 0x2a1c, 0x2a26,
++	0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73,
++	0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73,
++	0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30,
++	0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30,
++	0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73,
++	0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73,
++	0x2a32, 0x2a32, 0x2a38, 0x2a38, 0x2a3f, 0x2a3f, 0x2a46, 0x2a46,
++	0x2a4f, 0x2a4f, 0x2a56, 0x2a56, 0x2a5f, 0x2a5f, 0x2a68, 0x2a68,
++	0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73,
++	0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73,
++	0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30,
++	0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30,
++	0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73,
++	0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73,
++	0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30,
++	0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30,
++	0x0106, 0x0006, 0x0804, 0x2a7b, 0x0106, 0x0006, 0x0804, 0x2a7b,
++	0x0106, 0x0006, 0x080c, 0x24e2, 0x0804, 0x2a7b, 0x0106, 0x0006,
++	0x080c, 0x24e2, 0x0804, 0x2a7b, 0x0106, 0x0006, 0x080c, 0x236d,
++	0x0804, 0x2a7b, 0x0106, 0x0006, 0x080c, 0x236d, 0x0804, 0x2a7b,
++	0x0106, 0x0006, 0x080c, 0x24e2, 0x080c, 0x236d, 0x0804, 0x2a7b,
++	0x0106, 0x0006, 0x080c, 0x24e2, 0x080c, 0x236d, 0x0804, 0x2a7b,
++	0x0106, 0x0006, 0x080c, 0x23c3, 0x0804, 0x2a7b, 0x0106, 0x0006,
++	0x080c, 0x23c3, 0x0804, 0x2a7b, 0x0106, 0x0006, 0x080c, 0x24e2,
++	0x080c, 0x23c3, 0x0804, 0x2a7b, 0x0106, 0x0006, 0x080c, 0x24e2,
++	0x080c, 0x23c3, 0x0804, 0x2a7b, 0x0106, 0x0006, 0x080c, 0x236d,
++	0x080c, 0x23c3, 0x0804, 0x2a7b, 0x0106, 0x0006, 0x080c, 0x236d,
++	0x080c, 0x23c3, 0x0804, 0x2a7b, 0x0106, 0x0006, 0x080c, 0x24e2,
++	0x080c, 0x236d, 0x080c, 0x23c3, 0x0804, 0x2a7b, 0x0106, 0x0006,
++	0x080c, 0x24e2, 0x080c, 0x236d, 0x080c, 0x23c3, 0x0804, 0x2a7b,
++	0xe000, 0x0cf0, 0x0106, 0x0006, 0x080c, 0x289c, 0x0804, 0x2a7b,
++	0x0106, 0x0006, 0x080c, 0x289c, 0x080c, 0x24e2, 0x04e0, 0x0106,
++	0x0006, 0x080c, 0x289c, 0x080c, 0x236d, 0x04a8, 0x0106, 0x0006,
++	0x080c, 0x289c, 0x080c, 0x24e2, 0x080c, 0x236d, 0x0460, 0x0106,
++	0x0006, 0x080c, 0x289c, 0x080c, 0x23c3, 0x0428, 0x0106, 0x0006,
++	0x080c, 0x289c, 0x080c, 0x24e2, 0x080c, 0x23c3, 0x00e0, 0x0106,
++	0x0006, 0x080c, 0x289c, 0x080c, 0x236d, 0x080c, 0x23c3, 0x0098,
++	0x0106, 0x0006, 0x080c, 0x289c, 0x080c, 0x24e2, 0x080c, 0x236d,
++	0x080c, 0x23c3, 0x0040, 0x20d1, 0x0000, 0x20d1, 0x0001, 0x20d1,
++	0x0000, 0x080c, 0x1511, 0x000e, 0x010e, 0x000d, 0x00c6, 0x0026,
++	0x0046, 0x2021, 0x0000, 0x080c, 0x52ca, 0x1904, 0x2b5b, 0x72d4,
++	0x2001, 0xb69e, 0x2004, 0xa005, 0x1110, 0xd29c, 0x0148, 0xd284,
++	0x1138, 0xd2bc, 0x1904, 0x2b5b, 0x080c, 0x2b5f, 0x0804, 0x2b5b,
++	0xd2cc, 0x1904, 0x2b5b, 0x080c, 0x5a90, 0x1120, 0x709f, 0xffff,
++	0x0804, 0x2b5b, 0xd294, 0x0120, 0x709f, 0xffff, 0x0804, 0x2b5b,
++	0x2001, 0xb415, 0x203c, 0x7288, 0xd284, 0x0904, 0x2afd, 0xd28c,
++	0x1904, 0x2afd, 0x0036, 0x739c, 0xa38e, 0xffff, 0x1110, 0x2019,
++	0x0001, 0x8314, 0xa2e0, 0xbbc0, 0x2c04, 0xa38c, 0x0001, 0x0120,
++	0xa084, 0xff00, 0x8007, 0x0010, 0xa084, 0x00ff, 0xa70e, 0x0560,
++	0xa08e, 0x0000, 0x0548, 0xa08e, 0x00ff, 0x1150, 0x7230, 0xd284,
++	0x1538, 0x7288, 0xc28d, 0x728a, 0x709f, 0xffff, 0x003e, 0x0428,
++	0x2009, 0x0000, 0x080c, 0x27e3, 0x080c, 0x4f0e, 0x11b8, 0x6004,
++	0xa084, 0x00ff, 0xa086, 0x0006, 0x1150, 0x7030, 0xd08c, 0x0118,
++	0x6000, 0xd0bc, 0x0120, 0x080c, 0x2b72, 0x0140, 0x0028, 0x080c,
++	0x2ca1, 0x080c, 0x2ba0, 0x0110, 0x8318, 0x0818, 0x739e, 0x0010,
++	0x709f, 0xffff, 0x003e, 0x0804, 0x2b5b, 0xa780, 0x2d88, 0x203d,
++	0xa7bc, 0xff00, 0x873f, 0x2041, 0x007e, 0x709c, 0xa096, 0xffff,
++	0x1120, 0x2009, 0x0000, 0x28a8, 0x0050, 0xa812, 0x0220, 0x2008,
++	0xa802, 0x20a8, 0x0020, 0x709f, 0xffff, 0x0804, 0x2b5b, 0x2700,
++	0x0156, 0x0016, 0xa106, 0x05a0, 0xc484, 0x080c, 0x4f6a, 0x0120,
++	0x080c, 0x4f0e, 0x15a8, 0x0008, 0xc485, 0x6004, 0xa084, 0x00ff,
++	0xa086, 0x0006, 0x1130, 0x7030, 0xd08c, 0x01e8, 0x6000, 0xd0bc,
++	0x11d0, 0x7288, 0xd28c, 0x0188, 0x6004, 0xa084, 0x00ff, 0xa082,
++	0x0006, 0x02b0, 0xd484, 0x1118, 0x080c, 0x4f2d, 0x0028, 0x080c,
++	0x2d2e, 0x0170, 0x080c, 0x2d5b, 0x0058, 0x080c, 0x2ca1, 0x080c,
++	0x2ba0, 0x0170, 0x0028, 0x080c, 0x2d2e, 0x0110, 0x0419, 0x0140,
++	0x001e, 0x8108, 0x015e, 0x1f04, 0x2b17, 0x709f, 0xffff, 0x0018,
++	0x001e, 0x015e, 0x719e, 0x004e, 0x002e, 0x00ce, 0x0005, 0x00c6,
++	0x0016, 0x709f, 0x0001, 0x2009, 0x007e, 0x080c, 0x4f0e, 0x1138,
++	0x080c, 0x2ca1, 0x04a9, 0x0118, 0x70d4, 0xc0bd, 0x70d6, 0x001e,
++	0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x2001,
++	0xb457, 0x2004, 0xa084, 0x00ff, 0x6842, 0x080c, 0x9e67, 0x01d8,
++	0x2d00, 0x601a, 0x080c, 0x9fb8, 0x601f, 0x0001, 0x2001, 0x0000,
++	0x080c, 0x4eac, 0x2001, 0x0000, 0x080c, 0x4ebe, 0x0126, 0x2091,
++	0x8000, 0x7098, 0x8000, 0x709a, 0x012e, 0x2009, 0x0004, 0x080c,
++	0x85ef, 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005,
++	0x0016, 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x2001, 0xb457, 0x2004,
++	0xa084, 0x00ff, 0x6842, 0x080c, 0x9e67, 0x0550, 0x2d00, 0x601a,
++	0x6800, 0xc0c4, 0x6802, 0x68a0, 0xa086, 0x007e, 0x0140, 0x6804,
++	0xa084, 0x00ff, 0xa086, 0x0006, 0x1110, 0x080c, 0x2c60, 0x080c,
++	0x9fb8, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, 0x4eac, 0x2001,
++	0x0002, 0x080c, 0x4ebe, 0x0126, 0x2091, 0x8000, 0x7098, 0x8000,
++	0x709a, 0x012e, 0x2009, 0x0002, 0x080c, 0x85ef, 0xa085, 0x0001,
++	0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x0026, 0x2009,
++	0x0080, 0x080c, 0x4f0e, 0x1120, 0x0031, 0x0110, 0x70db, 0xffff,
++	0x002e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2c68,
++	0x080c, 0x856a, 0x01d8, 0x2d00, 0x601a, 0x080c, 0x9fb8, 0x601f,
++	0x0001, 0x2001, 0x0000, 0x080c, 0x4eac, 0x2001, 0x0002, 0x080c,
++	0x4ebe, 0x0126, 0x2091, 0x8000, 0x70dc, 0x8000, 0x70de, 0x012e,
++	0x2009, 0x0002, 0x080c, 0x85ef, 0xa085, 0x0001, 0x00ce, 0x00de,
++	0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000,
++	0x2009, 0x007f, 0x080c, 0x4f0e, 0x1190, 0x2c68, 0x080c, 0x856a,
++	0x0170, 0x2d00, 0x601a, 0x6312, 0x601f, 0x0001, 0x620a, 0x080c,
++	0x9fb8, 0x2009, 0x0022, 0x080c, 0x85ef, 0xa085, 0x0001, 0x012e,
++	0x00de, 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026,
++	0x080c, 0x6dc6, 0x080c, 0x6d69, 0x080c, 0x900f, 0x2130, 0x81ff,
++	0x0128, 0x20a9, 0x007e, 0x2009, 0x0000, 0x0020, 0x20a9, 0x007f,
++	0x2009, 0x0000, 0x0016, 0x080c, 0x4f6a, 0x1120, 0x080c, 0x516b,
++	0x080c, 0x4bc5, 0x001e, 0x8108, 0x1f04, 0x2c4a, 0x86ff, 0x1110,
++	0x080c, 0x11f0, 0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee, 0x0005,
++	0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x6218, 0x2270, 0x72a0,
++	0x0026, 0x2019, 0x0029, 0x080c, 0x6dba, 0x0076, 0x2039, 0x0000,
++	0x080c, 0x6cc7, 0x2c08, 0x080c, 0xae05, 0x007e, 0x001e, 0x2e60,
++	0x080c, 0x516b, 0x6210, 0x6314, 0x080c, 0x4bc5, 0x6212, 0x6316,
++	0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006,
++	0x6018, 0xa080, 0x0028, 0x2004, 0xa086, 0x0080, 0x0150, 0x2071,
++	0xb400, 0x7098, 0xa005, 0x0110, 0x8001, 0x709a, 0x000e, 0x00ee,
++	0x0005, 0x2071, 0xb400, 0x70dc, 0xa005, 0x0dc0, 0x8001, 0x70de,
++	0x0ca8, 0x6000, 0xc08c, 0x6002, 0x0005, 0x00f6, 0x00e6, 0x00c6,
++	0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x81ff, 0x1118, 0x20a9,
++	0x0001, 0x0098, 0x2001, 0xb453, 0x2004, 0xd0c4, 0x0150, 0xd0a4,
++	0x0140, 0xa006, 0x0046, 0x2020, 0x2009, 0x002d, 0x080c, 0xb06b,
++	0x004e, 0x20a9, 0x00ff, 0x2011, 0x0000, 0x0026, 0xa28e, 0x007e,
++	0x0904, 0x2d0d, 0xa28e, 0x007f, 0x0904, 0x2d0d, 0xa28e, 0x0080,
++	0x05e0, 0xa288, 0xb535, 0x210c, 0x81ff, 0x05b8, 0x8fff, 0x1148,
++	0x2001, 0xb6be, 0x0006, 0x2003, 0x0001, 0x04d9, 0x000e, 0x2003,
++	0x0000, 0x00c6, 0x2160, 0x2001, 0x0001, 0x080c, 0x52d4, 0x00ce,
++	0x2019, 0x0029, 0x080c, 0x6dba, 0x0076, 0x2039, 0x0000, 0x080c,
++	0x6cc7, 0x00c6, 0x0026, 0x2160, 0x6204, 0xa294, 0x00ff, 0xa286,
++	0x0006, 0x1118, 0x6007, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007,
++	0xa215, 0x6206, 0x002e, 0x00ce, 0x0016, 0x2c08, 0x080c, 0xae05,
++	0x001e, 0x007e, 0x2160, 0x080c, 0x516b, 0x002e, 0x8210, 0x1f04,
++	0x2cc5, 0x015e, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x00fe,
++	0x0005, 0x0046, 0x0026, 0x0016, 0x2001, 0xb453, 0x2004, 0xd0c4,
++	0x0148, 0xd0a4, 0x0138, 0xa006, 0x2220, 0x8427, 0x2009, 0x0029,
++	0x080c, 0xb06b, 0x001e, 0x002e, 0x004e, 0x0005, 0x0016, 0x0026,
++	0x0036, 0x00c6, 0x7288, 0x82ff, 0x01f8, 0x2011, 0xb453, 0x2214,
++	0xd2ac, 0x11d0, 0x2100, 0x080c, 0x27f7, 0x81ff, 0x01b8, 0x2019,
++	0x0001, 0x8314, 0xa2e0, 0xbbc0, 0x2c04, 0xd384, 0x0120, 0xa084,
++	0xff00, 0x8007, 0x0010, 0xa084, 0x00ff, 0xa116, 0x0138, 0xa096,
++	0x00ff, 0x0110, 0x8318, 0x0c68, 0xa085, 0x0001, 0x00ce, 0x003e,
++	0x002e, 0x001e, 0x0005, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000,
++	0x0016, 0x0026, 0x0036, 0x2110, 0x0026, 0x2019, 0x0029, 0x080c,
++	0x823c, 0x002e, 0x080c, 0xb310, 0x003e, 0x002e, 0x001e, 0xa180,
++	0xb535, 0x2004, 0xa065, 0x0158, 0x0016, 0x00c6, 0x2061, 0xb7f4,
++	0x001e, 0x611a, 0x080c, 0x2c60, 0x001e, 0x080c, 0x4f2d, 0x012e,
++	0x00ce, 0x001e, 0x0005, 0x2001, 0xb435, 0x2004, 0xd0cc, 0x0005,
++	0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da,
++	0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce,
++	0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5,
++	0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3,
++	0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9,
++	0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b,
++	0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081,
++	0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073,
++	0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69,
++	0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056,
++	0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c,
++	0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c,
++	0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831,
++	0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026,
++	0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017,
++	0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000,
++	0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000,
++	0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300,
++	0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100,
++	0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00,
++	0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800,
++	0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000,
++	0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000,
++	0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500,
++	0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000,
++	0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000,
++	0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000,
++	0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000,
++	0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++	0x2071, 0xb482, 0x7003, 0x0002, 0xa006, 0x7012, 0x7016, 0x703a,
++	0x703e, 0x7033, 0xb492, 0x7037, 0xb492, 0x7007, 0x0001, 0x2061,
++	0xb4d2, 0x6003, 0x0002, 0x0005, 0x1004, 0x2eae, 0x0e04, 0x2eae,
++	0x2071, 0xb482, 0x2b78, 0x7818, 0xd084, 0x1140, 0x2a60, 0x7820,
++	0xa08e, 0x0069, 0x1904, 0x2f93, 0x0804, 0x2f2c, 0x0005, 0x2071,
++	0xb482, 0x7004, 0x0002, 0x2eb7, 0x2eb8, 0x2ec1, 0x2ed2, 0x0005,
++	0x1004, 0x2ec0, 0x0e04, 0x2ec0, 0x2b78, 0x7818, 0xd084, 0x01e8,
++	0x0005, 0x2b78, 0x2061, 0xb4d2, 0x6008, 0xa08e, 0x0100, 0x0128,
++	0xa086, 0x0200, 0x0904, 0x2f8d, 0x0005, 0x7014, 0x2068, 0x2a60,
++	0x7018, 0x0807, 0x7010, 0x2068, 0x6834, 0xa086, 0x0103, 0x0108,
++	0x0005, 0x2a60, 0x2b78, 0x7018, 0x0807, 0x2a60, 0x7820, 0xa08a,
++	0x0040, 0x1210, 0x61c4, 0x0042, 0x2100, 0xa08a, 0x003f, 0x1a04,
++	0x2f8a, 0x61c4, 0x0804, 0x2f2c, 0x2f6e, 0x2f99, 0x2fa1, 0x2fa5,
++	0x2fad, 0x2fb3, 0x2fb7, 0x2fc3, 0x2fc6, 0x2fd0, 0x2fd3, 0x2f8a,
++	0x2f8a, 0x2f8a, 0x2fd6, 0x2f8a, 0x2fe5, 0x2ffc, 0x3013, 0x308d,
++	0x3092, 0x30bb, 0x310c, 0x311d, 0x313c, 0x3174, 0x317e, 0x318b,
++	0x319e, 0x31bf, 0x31c8, 0x31fe, 0x3204, 0x2f8a, 0x322d, 0x2f8a,
++	0x2f8a, 0x2f8a, 0x2f8a, 0x2f8a, 0x3234, 0x323e, 0x2f8a, 0x2f8a,
++	0x2f8a, 0x2f8a, 0x2f8a, 0x2f8a, 0x2f8a, 0x2f8a, 0x3246, 0x2f8a,
++	0x2f8a, 0x2f8a, 0x2f8a, 0x2f8a, 0x3258, 0x3262, 0x2f8a, 0x2f8a,
++	0x2f8a, 0x2f8a, 0x2f8a, 0x2f8a, 0x0002, 0x328c, 0x32e0, 0x333b,
++	0x334e, 0x2f8a, 0x337f, 0x37b2, 0x41f1, 0x2f8a, 0x2f8a, 0x2f8a,
++	0x2f8a, 0x2f8a, 0x2f8a, 0x2f8a, 0x2f8a, 0x2fd0, 0x2fd3, 0x37b4,
++	0x2f8a, 0x37c1, 0x428a, 0x42e5, 0x4349, 0x2f8a, 0x43ac, 0x43d2,
++	0x43f1, 0x4423, 0x2f8a, 0x2f8a, 0x2f8a, 0x37c5, 0x396a, 0x3984,
++	0x39a2, 0x3a03, 0x3a63, 0x3a6e, 0x3aa6, 0x3ab5, 0x3ac4, 0x3ac7,
++	0x3aea, 0x3b34, 0x3baa, 0x3bb7, 0x3cb8, 0x3de1, 0x3e0a, 0x3f08,
++	0x3f2a, 0x3f36, 0x3f6f, 0x4033, 0x2f8a, 0x2f8a, 0x2f8a, 0x2f8a,
++	0x409b, 0x40b6, 0x4128, 0x41da, 0x713c, 0x0000, 0x2021, 0x4000,
++	0x080c, 0x3e67, 0x0126, 0x2091, 0x8000, 0x0e04, 0x2f7a, 0x7818,
++	0xd084, 0x0110, 0x012e, 0x0cb0, 0x7c22, 0x7926, 0x7a2a, 0x7b2e,
++	0x781b, 0x0001, 0x2091, 0x4080, 0x7007, 0x0001, 0x2091, 0x5000,
++	0x012e, 0x0005, 0x2021, 0x4001, 0x0c18, 0x2021, 0x4002, 0x0c00,
++	0x2021, 0x4003, 0x08e8, 0x2021, 0x4005, 0x08d0, 0x2021, 0x4006,
++	0x08b8, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0804,
++	0x3e74, 0x7823, 0x0004, 0x7824, 0x0807, 0xa02e, 0x2520, 0x7b28,
++	0x7a2c, 0x7824, 0x7930, 0x0804, 0x3e77, 0x7924, 0x7828, 0x2114,
++	0x200a, 0x0804, 0x2f6e, 0x7924, 0x2114, 0x0804, 0x2f6e, 0x2099,
++	0x0009, 0x20a1, 0x0009, 0x20a9, 0x0007, 0x53a3, 0x7924, 0x7a28,
++	0x7b2c, 0x0804, 0x2f6e, 0x7824, 0x2060, 0x0090, 0x2009, 0x0002,
++	0x2011, 0x0002, 0x2019, 0x0003, 0x783b, 0x0017, 0x0804, 0x2f6e,
++	0x7d38, 0x7c3c, 0x0840, 0x7d38, 0x7c3c, 0x0888, 0x2061, 0x1000,
++	0xe10c, 0xa006, 0x2c15, 0xa200, 0x8c60, 0x8109, 0x1dd8, 0x2010,
++	0xa005, 0x0904, 0x2f6e, 0x0804, 0x2f90, 0x2069, 0xb452, 0x7824,
++	0x7930, 0xa11a, 0x1a04, 0x2f96, 0x8019, 0x0904, 0x2f96, 0x684a,
++	0x6942, 0x782c, 0x6852, 0x7828, 0x6856, 0xa006, 0x685a, 0x685e,
++	0x080c, 0x5d66, 0x0804, 0x2f6e, 0x2069, 0xb452, 0x7824, 0x7934,
++	0xa11a, 0x1a04, 0x2f96, 0x8019, 0x0904, 0x2f96, 0x684e, 0x6946,
++	0x782c, 0x6862, 0x7828, 0x6866, 0xa006, 0x686a, 0x686e, 0x080c,
++	0x5396, 0x0804, 0x2f6e, 0xa02e, 0x2520, 0x81ff, 0x1904, 0x2f93,
++	0x7924, 0x7b28, 0x7a2c, 0x20a9, 0x0005, 0x20a1, 0xb489, 0x41a1,
++	0x080c, 0x3e33, 0x0904, 0x2f93, 0x2009, 0x0020, 0x080c, 0x3e74,
++	0x701b, 0x302b, 0x0005, 0x6834, 0x2008, 0xa084, 0x00ff, 0xa096,
++	0x0011, 0x0138, 0xa096, 0x0019, 0x0120, 0xa096, 0x0015, 0x1904,
++	0x2f93, 0x810f, 0xa18c, 0x00ff, 0x0904, 0x2f93, 0x710e, 0x700c,
++	0x8001, 0x0528, 0x700e, 0x080c, 0x3e33, 0x0904, 0x2f93, 0x2009,
++	0x0020, 0x2061, 0xb4d2, 0x6224, 0x6328, 0x642c, 0x6530, 0xa290,
++	0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x080c,
++	0x3e74, 0x701b, 0x305c, 0x0005, 0x6834, 0xa084, 0x00ff, 0xa096,
++	0x0002, 0x0120, 0xa096, 0x000a, 0x1904, 0x2f93, 0x08c0, 0x7010,
++	0x2068, 0x6838, 0xc0fd, 0x683a, 0x080c, 0x4e0a, 0x1128, 0x7007,
++	0x0003, 0x701b, 0x3076, 0x0005, 0x080c, 0x549c, 0x0126, 0x2091,
++	0x8000, 0x20a9, 0x0005, 0x2099, 0xb489, 0x530a, 0x2100, 0xa210,
++	0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0xad80, 0x000d,
++	0x2009, 0x0020, 0x012e, 0x0804, 0x3e77, 0x61ac, 0x7824, 0x60ae,
++	0x0804, 0x2f6e, 0x2091, 0x8000, 0x7823, 0x4000, 0x7827, 0x4953,
++	0x782b, 0x5020, 0x782f, 0x2020, 0x2009, 0x017f, 0x2104, 0x7832,
++	0x3f00, 0x7836, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, 0x603c,
++	0x8007, 0xa205, 0x783a, 0x2009, 0x04fd, 0x2104, 0x783e, 0x781b,
++	0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2071, 0x0010, 0x20c1,
++	0x00f0, 0x0804, 0x0427, 0x81ff, 0x1904, 0x2f93, 0x7924, 0x810f,
++	0xa18c, 0x00ff, 0x080c, 0x4f6a, 0x1904, 0x2f96, 0x7e38, 0xa684,
++	0x3fff, 0xa082, 0x4000, 0x0210, 0x0804, 0x2f96, 0x7c28, 0x7d2c,
++	0x080c, 0x5132, 0xd28c, 0x1118, 0x080c, 0x50db, 0x0010, 0x080c,
++	0x510b, 0x1518, 0x2061, 0xbc00, 0x0126, 0x2091, 0x8000, 0x6000,
++	0xa086, 0x0000, 0x0148, 0x6010, 0xa06d, 0x0130, 0x683c, 0xa406,
++	0x1118, 0x6840, 0xa506, 0x0150, 0x012e, 0xace0, 0x0018, 0x2001,
++	0xb417, 0x2004, 0xac02, 0x1a04, 0x2f93, 0x0c30, 0x080c, 0x98c3,
++	0x012e, 0x0904, 0x2f93, 0x0804, 0x2f6e, 0xa00e, 0x2001, 0x0005,
++	0x080c, 0x549c, 0x0126, 0x2091, 0x8000, 0x080c, 0x9e63, 0x080c,
++	0x53c9, 0x012e, 0x0804, 0x2f6e, 0x81ff, 0x1904, 0x2f93, 0x080c,
++	0x3e48, 0x0904, 0x2f96, 0x080c, 0x5030, 0x0904, 0x2f93, 0x080c,
++	0x513e, 0x0904, 0x2f93, 0x0804, 0x2f6e, 0x81ff, 0x1904, 0x2f93,
++	0x080c, 0x3e58, 0x0904, 0x2f96, 0x080c, 0x51aa, 0x0904, 0x2f93,
++	0x2019, 0x0005, 0x7924, 0x080c, 0x5159, 0x0904, 0x2f93, 0x7828,
++	0xa08a, 0x1000, 0x1a04, 0x2f96, 0x8003, 0x800b, 0x810b, 0xa108,
++	0x080c, 0x696d, 0x0804, 0x2f6e, 0x0126, 0x2091, 0x8000, 0x81ff,
++	0x0118, 0x2009, 0x0001, 0x0450, 0x2029, 0x00ff, 0x6450, 0x2400,
++	0xa506, 0x01f8, 0x2508, 0x080c, 0x4f6a, 0x11d8, 0x080c, 0x51aa,
++	0x1128, 0x2009, 0x0002, 0x62b4, 0x2518, 0x00c0, 0x2019, 0x0004,
++	0xa00e, 0x080c, 0x5159, 0x1118, 0x2009, 0x0006, 0x0078, 0x7824,
++	0xa08a, 0x1000, 0x1270, 0x8003, 0x800b, 0x810b, 0xa108, 0x080c,
++	0x696d, 0x8529, 0x1ae0, 0x012e, 0x0804, 0x2f6e, 0x012e, 0x0804,
++	0x2f93, 0x012e, 0x0804, 0x2f96, 0x080c, 0x3e48, 0x0904, 0x2f96,
++	0x080c, 0x5096, 0x080c, 0x5132, 0x0804, 0x2f6e, 0x81ff, 0x1904,
++	0x2f93, 0x080c, 0x3e48, 0x0904, 0x2f96, 0x080c, 0x5087, 0x080c,
++	0x5132, 0x0804, 0x2f6e, 0x81ff, 0x1904, 0x2f93, 0x080c, 0x3e48,
++	0x0904, 0x2f96, 0x080c, 0x510d, 0x0904, 0x2f93, 0x080c, 0x4e4e,
++	0x080c, 0x50d4, 0x080c, 0x5132, 0x0804, 0x2f6e, 0x080c, 0x3e48,
++	0x0904, 0x2f96, 0x080c, 0x5030, 0x0904, 0x2f93, 0x62a0, 0x2019,
++	0x0005, 0x00c6, 0x080c, 0x516b, 0x2061, 0x0000, 0x080c, 0x6dba,
++	0x0076, 0x2039, 0x0000, 0x080c, 0x6cc7, 0x2009, 0x0000, 0x080c,
++	0xae05, 0x007e, 0x00ce, 0x080c, 0x5132, 0x0804, 0x2f6e, 0x080c,
++	0x3e48, 0x0904, 0x2f96, 0x080c, 0x5132, 0x2208, 0x0804, 0x2f6e,
++	0x0156, 0x00d6, 0x00e6, 0x2069, 0xb514, 0x6810, 0x6914, 0xa10a,
++	0x1210, 0x2009, 0x0000, 0x6816, 0x2011, 0x0000, 0x2019, 0x0000,
++	0x20a9, 0x007e, 0x2069, 0xb535, 0x2d04, 0xa075, 0x0130, 0x704c,
++	0x0071, 0xa210, 0x7080, 0x0059, 0xa318, 0x8d68, 0x1f04, 0x31dc,
++	0x2300, 0xa218, 0x00ee, 0x00de, 0x015e, 0x0804, 0x2f6e, 0x00f6,
++	0x0016, 0xa07d, 0x0140, 0x2001, 0x0000, 0x8000, 0x2f0c, 0x81ff,
++	0x0110, 0x2178, 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, 0xb514,
++	0x6910, 0x62b0, 0x0804, 0x2f6e, 0x81ff, 0x1904, 0x2f93, 0x6150,
++	0xa190, 0x2d88, 0x2215, 0xa294, 0x00ff, 0x6370, 0x83ff, 0x0108,
++	0x6274, 0x67d4, 0xd79c, 0x0118, 0x2031, 0x0001, 0x0090, 0xd7ac,
++	0x0118, 0x2031, 0x0003, 0x0068, 0xd7a4, 0x0118, 0x2031, 0x0002,
++	0x0040, 0x080c, 0x5a90, 0x1118, 0x2031, 0x0004, 0x0010, 0x2031,
++	0x0000, 0x7e3a, 0x7f3e, 0x0804, 0x2f6e, 0x6140, 0x6244, 0x2019,
++	0xb6b6, 0x231c, 0x0804, 0x2f6e, 0x0126, 0x2091, 0x8000, 0x6134,
++	0xa006, 0x2010, 0x6338, 0x012e, 0x0804, 0x2f6e, 0x080c, 0x3e58,
++	0x0904, 0x2f96, 0x6244, 0x6338, 0x0804, 0x2f6e, 0x6140, 0x6244,
++	0x7824, 0x6042, 0x7b28, 0x6346, 0x2069, 0xb452, 0x831f, 0xa305,
++	0x6816, 0x782c, 0x2069, 0xb6b6, 0x2d1c, 0x206a, 0x0804, 0x2f6e,
++	0x0126, 0x2091, 0x8000, 0x7824, 0x6036, 0x782c, 0x603a, 0x012e,
++	0x0804, 0x2f6e, 0x7838, 0xa005, 0x01a8, 0x7828, 0xa025, 0x0904,
++	0x2f96, 0x782c, 0xa02d, 0x0904, 0x2f96, 0xa00e, 0x080c, 0x4f6a,
++	0x1120, 0x6244, 0x6338, 0x6446, 0x653a, 0xa186, 0x00ff, 0x0190,
++	0x8108, 0x0ca0, 0x080c, 0x3e58, 0x0904, 0x2f96, 0x7828, 0xa00d,
++	0x0904, 0x2f96, 0x782c, 0xa005, 0x0904, 0x2f96, 0x6244, 0x6146,
++	0x6338, 0x603a, 0x0804, 0x2f6e, 0x2001, 0xb400, 0x2004, 0xa086,
++	0x0003, 0x1904, 0x2f93, 0x00c6, 0x2061, 0x0100, 0x7924, 0x810f,
++	0xa18c, 0x00ff, 0xa196, 0x00ff, 0x1130, 0x2001, 0xb415, 0x2004,
++	0xa085, 0xff00, 0x0078, 0xa182, 0x007f, 0x16a0, 0xa188, 0x2d88,
++	0x210d, 0xa18c, 0x00ff, 0x2001, 0xb415, 0x2004, 0xa116, 0x0550,
++	0x810f, 0xa105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0x856a,
++	0x000e, 0x01e0, 0x601a, 0x600b, 0xbc09, 0x601f, 0x0001, 0x080c,
++	0x3e33, 0x01d8, 0x6837, 0x0000, 0x7007, 0x0003, 0x6833, 0x0000,
++	0x6838, 0xc0fd, 0x683a, 0x701b, 0x3334, 0x2d00, 0x6012, 0x2009,
++	0x0032, 0x080c, 0x85ef, 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce,
++	0x0804, 0x2f93, 0x00ce, 0x0804, 0x2f96, 0x080c, 0x85c0, 0x0cb0,
++	0x2001, 0xb400, 0x2004, 0xa086, 0x0003, 0x1904, 0x2f93, 0x00c6,
++	0x2061, 0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff,
++	0x1130, 0x2001, 0xb415, 0x2004, 0xa085, 0xff00, 0x0078, 0xa182,
++	0x007f, 0x16a0, 0xa188, 0x2d88, 0x210d, 0xa18c, 0x00ff, 0x2001,
++	0xb415, 0x2004, 0xa116, 0x0550, 0x810f, 0xa105, 0x0126, 0x2091,
++	0x8000, 0x0006, 0x080c, 0x856a, 0x000e, 0x01e0, 0x601a, 0x600b,
++	0xbc05, 0x601f, 0x0001, 0x080c, 0x3e33, 0x01d8, 0x6837, 0x0000,
++	0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x701b,
++	0x3334, 0x2d00, 0x6012, 0x2009, 0x0032, 0x080c, 0x85ef, 0x012e,
++	0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x2f93, 0x00ce, 0x0804,
++	0x2f96, 0x080c, 0x85c0, 0x0cb0, 0x6830, 0xa086, 0x0100, 0x0904,
++	0x2f93, 0x0804, 0x2f6e, 0x2061, 0xb774, 0x0126, 0x2091, 0x8000,
++	0x6000, 0xd084, 0x0140, 0x6104, 0x6208, 0x2019, 0xb412, 0x231c,
++	0x012e, 0x0804, 0x2f6e, 0x012e, 0x0804, 0x2f96, 0x81ff, 0x1904,
++	0x2f93, 0x080c, 0x5a90, 0x0904, 0x2f93, 0x0126, 0x2091, 0x8000,
++	0x6248, 0x6068, 0xa202, 0x0248, 0xa085, 0x0001, 0x080c, 0x282d,
++	0x080c, 0x45e6, 0x012e, 0x0804, 0x2f6e, 0x012e, 0x0804, 0x2f96,
++	0x0006, 0x0016, 0x00c6, 0x00e6, 0x2001, 0xb6bf, 0x2070, 0x2061,
++	0xb452, 0x6008, 0x2072, 0x2009, 0x0000, 0x2011, 0x1000, 0x080c,
++	0x6b05, 0x7206, 0x00ee, 0x00ce, 0x001e, 0x000e, 0x0005, 0x0126,
++	0x2091, 0x8000, 0x7824, 0xa084, 0x0007, 0x0002, 0x3391, 0x339a,
++	0x33a1, 0x338e, 0x338e, 0x338e, 0x338e, 0x338e, 0x012e, 0x0804,
++	0x2f96, 0x2009, 0x0114, 0x2104, 0xa085, 0x0800, 0x200a, 0x080c,
++	0x350c, 0x0070, 0x2009, 0x010b, 0x200b, 0x0010, 0x080c, 0x350c,
++	0x0038, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x2f70,
++	0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6,
++	0x080c, 0x3368, 0x2009, 0x0101, 0x210c, 0x0016, 0x2001, 0x0138,
++	0x200c, 0x2003, 0x0001, 0x0016, 0x2001, 0x007a, 0x2034, 0x2001,
++	0x007b, 0x202c, 0xa006, 0x2048, 0x2050, 0x2058, 0x080c, 0x3757,
++	0x080c, 0x36bb, 0xa03e, 0x2720, 0x00f6, 0x00e6, 0x00c6, 0x2d60,
++	0x2071, 0xb74a, 0x2079, 0x0020, 0x00d6, 0x2069, 0x0000, 0x6824,
++	0xd0b4, 0x0140, 0x2001, 0x007d, 0x2004, 0x783e, 0x2001, 0x007c,
++	0x2004, 0x783a, 0x00de, 0x2011, 0x0001, 0x080c, 0x3667, 0x080c,
++	0x3667, 0x00ce, 0x00ee, 0x00fe, 0x080c, 0x35b2, 0x080c, 0x368f,
++	0x080c, 0x360c, 0x080c, 0x3571, 0x080c, 0x35a2, 0x00f6, 0x2079,
++	0x0100, 0x7824, 0xd094, 0x0530, 0x7814, 0xa084, 0x0184, 0xa085,
++	0x0010, 0x7816, 0x2079, 0x0140, 0x080c, 0x34ea, 0x1110, 0x00fe,
++	0x0430, 0x7804, 0xd0dc, 0x0dc0, 0x2079, 0x0100, 0x7827, 0x0086,
++	0x7814, 0xa084, 0x0184, 0xa085, 0x0032, 0x7816, 0x080c, 0x34ea,
++	0x1110, 0x00fe, 0x00a0, 0x7824, 0xd0bc, 0x0dc0, 0x7827, 0x0080,
++	0xa026, 0x7c16, 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x34f4,
++	0x00fe, 0x0804, 0x34b4, 0x00fe, 0x080c, 0x34ea, 0x1150, 0x8948,
++	0x2001, 0x007a, 0x2602, 0x2001, 0x007b, 0x2502, 0x080c, 0x34f4,
++	0x0088, 0x87ff, 0x0140, 0x2001, 0x0201, 0x2004, 0xa005, 0x1904,
++	0x33ee, 0x8739, 0x0038, 0x2001, 0xb723, 0x2004, 0xa086, 0x0000,
++	0x1904, 0x33ee, 0x2001, 0x0033, 0x2003, 0x00f6, 0x8631, 0x1208,
++	0x8529, 0x2500, 0xa605, 0x0904, 0x34b4, 0x7824, 0xd0bc, 0x0128,
++	0x2900, 0xaa05, 0xab05, 0x1904, 0x34b4, 0x6033, 0x000d, 0x2001,
++	0x0030, 0x2003, 0x0004, 0x7824, 0xd0ac, 0x1148, 0x2001, 0xb723,
++	0x2003, 0x0003, 0x2001, 0x0030, 0x2003, 0x0009, 0x0040, 0x6027,
++	0x0001, 0x2001, 0x0075, 0x2004, 0xa005, 0x0108, 0x6026, 0x2c00,
++	0x601a, 0x20e1, 0x9040, 0x2d00, 0x681a, 0x6833, 0x000d, 0x7824,
++	0xd0a4, 0x1180, 0x6827, 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061,
++	0x0020, 0x6003, 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x3489,
++	0x00ce, 0x0040, 0x6827, 0x0001, 0x2001, 0x0074, 0x2004, 0xa005,
++	0x0108, 0x6826, 0x00f6, 0x00c6, 0x2079, 0x0100, 0x2061, 0x0020,
++	0x7827, 0x0002, 0x2001, 0x0072, 0x2004, 0xa084, 0xfff8, 0x601a,
++	0x0006, 0x2001, 0x0073, 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca,
++	0x00ce, 0x00fe, 0x0804, 0x33cc, 0x2061, 0x0100, 0x6027, 0x0002,
++	0x001e, 0x61e2, 0x001e, 0x6106, 0x7824, 0xa084, 0x0003, 0xa086,
++	0x0002, 0x0188, 0x20e1, 0x9028, 0x6050, 0xa084, 0xf7ef, 0x6052,
++	0x602f, 0x0000, 0x602c, 0xc0ac, 0x602e, 0x604b, 0xf7f7, 0x6043,
++	0x0090, 0x6043, 0x0010, 0x2908, 0x2a10, 0x2b18, 0x2b00, 0xaa05,
++	0xa905, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e,
++	0x008e, 0x1118, 0x012e, 0x0804, 0x2f6e, 0x012e, 0x2021, 0x400c,
++	0x0804, 0x2f70, 0xa085, 0x0001, 0x1d04, 0x34f3, 0x2091, 0x6000,
++	0x8420, 0xa486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, 0x0010,
++	0x2001, 0x0030, 0x2003, 0x0004, 0x2001, 0x0020, 0x2003, 0x0004,
++	0x2001, 0xb723, 0x2003, 0x0000, 0x2001, 0xb74a, 0x2003, 0x0000,
++	0x20e1, 0xf000, 0xa026, 0x0005, 0x00f6, 0x2079, 0x0100, 0x2001,
++	0xb415, 0x200c, 0x7932, 0x7936, 0x080c, 0x280d, 0x7850, 0xa084,
++	0x0980, 0xa085, 0x0030, 0x7852, 0x2019, 0x01f4, 0x8319, 0x1df0,
++	0xa084, 0x0980, 0x7852, 0x782c, 0xc0ad, 0x782e, 0x20a9, 0x0046,
++	0x1d04, 0x3528, 0x2091, 0x6000, 0x1f04, 0x3528, 0x7850, 0xa085,
++	0x0400, 0x7852, 0x2001, 0x0009, 0x2004, 0xa084, 0x0003, 0xa086,
++	0x0001, 0x1118, 0x782c, 0xc0ac, 0x782e, 0x784b, 0xf7f7, 0x7843,
++	0x0090, 0x7843, 0x0010, 0x20a9, 0x000e, 0xe000, 0x1f04, 0x3545,
++	0x7850, 0xa085, 0x1400, 0x7852, 0x2019, 0x61a8, 0x7854, 0xe000,
++	0xe000, 0xd08c, 0x1110, 0x8319, 0x1dc8, 0x7827, 0x0048, 0x7850,
++	0xa085, 0x0400, 0x7852, 0x7843, 0x0040, 0x2019, 0x01f4, 0xe000,
++	0xe000, 0x8319, 0x1de0, 0x2001, 0x0140, 0x2003, 0x0100, 0x7827,
++	0x0020, 0x7843, 0x0000, 0x2003, 0x0000, 0x7827, 0x0048, 0x00fe,
++	0x0005, 0x7824, 0xd0ac, 0x11c8, 0x00f6, 0x00e6, 0x2071, 0xb723,
++	0x2079, 0x0030, 0x2001, 0x0201, 0x2004, 0xa005, 0x0160, 0x7000,
++	0xa086, 0x0000, 0x1140, 0x0051, 0xd0bc, 0x0108, 0x8738, 0x7003,
++	0x0003, 0x7803, 0x0019, 0x00ee, 0x00fe, 0x0005, 0x780c, 0xa08c,
++	0x0070, 0x0178, 0x2009, 0x007a, 0x260a, 0x2009, 0x007b, 0x250a,
++	0xd0b4, 0x0108, 0x8a50, 0xd0ac, 0x0108, 0x8948, 0xd0a4, 0x0108,
++	0x8b58, 0x0005, 0x00f6, 0x2079, 0x0200, 0x781c, 0xd084, 0x0140,
++	0x20e1, 0x0007, 0x20e1, 0x2000, 0x2001, 0x020a, 0x2004, 0x0ca8,
++	0x00fe, 0x0005, 0x00e6, 0x2071, 0x0100, 0x2001, 0xb6c0, 0x2004,
++	0x70e2, 0x2009, 0xb415, 0x210c, 0x716e, 0x7063, 0x0100, 0x7166,
++	0x719e, 0x706b, 0x0000, 0x7073, 0x0809, 0x7077, 0x0008, 0x7078,
++	0xa080, 0x0100, 0x707a, 0x7080, 0x8000, 0x7082, 0x7087, 0xaaaa,
++	0xa006, 0x708a, 0x708e, 0x707e, 0x70d6, 0x70ab, 0x0036, 0x70af,
++	0x95d5, 0x7027, 0x0080, 0x7014, 0xa084, 0x0184, 0xa085, 0x0032,
++	0x7016, 0x080c, 0x368f, 0x080c, 0x34ea, 0x1110, 0x8421, 0x0028,
++	0x7024, 0xd0bc, 0x0db0, 0x7027, 0x0080, 0x00f6, 0x00e6, 0x2071,
++	0xb723, 0x2079, 0x0030, 0x00d6, 0x2069, 0x0000, 0x6824, 0xd0b4,
++	0x0120, 0x683c, 0x783e, 0x6838, 0x783a, 0x00de, 0x2011, 0x0011,
++	0x080c, 0x3667, 0x2011, 0x0001, 0x080c, 0x3667, 0x00ee, 0x00fe,
++	0x7017, 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, 0xb723,
++	0x2079, 0x0030, 0x7904, 0xd1fc, 0x0904, 0x3664, 0x7803, 0x0002,
++	0xa026, 0xd19c, 0x1904, 0x3660, 0x7000, 0x0002, 0x3664, 0x3622,
++	0x3646, 0x3660, 0xd1bc, 0x1150, 0xd1dc, 0x1150, 0x8001, 0x7002,
++	0x2011, 0x0001, 0x04e1, 0x05c0, 0x04d1, 0x04b0, 0x780f, 0x0000,
++	0x7820, 0x7924, 0x7803, 0x0004, 0x7822, 0x7926, 0x2001, 0x0201,
++	0x200c, 0x81ff, 0x0de8, 0x080c, 0x358e, 0x2009, 0x0001, 0x7808,
++	0xd0ec, 0x0110, 0x2009, 0x0011, 0x7902, 0x00f0, 0x8001, 0x7002,
++	0xa184, 0x0880, 0x1138, 0x7804, 0xd0fc, 0x1940, 0x2011, 0x0001,
++	0x00b1, 0x0090, 0x6030, 0xa092, 0x0004, 0xa086, 0x0009, 0x1120,
++	0x6000, 0x601a, 0x2011, 0x0025, 0x6232, 0xd1dc, 0x1988, 0x0870,
++	0x7803, 0x0004, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x6024,
++	0xa005, 0x0520, 0x8001, 0x6026, 0x6018, 0x6130, 0xa140, 0x2804,
++	0x7832, 0x8840, 0x2804, 0x7836, 0x8840, 0x2804, 0x7822, 0x8840,
++	0x2804, 0x7826, 0x8840, 0x7a02, 0x7000, 0x8000, 0x7002, 0x6018,
++	0xa802, 0xa08a, 0x0029, 0x1138, 0x6018, 0xa080, 0x0001, 0x2004,
++	0x601a, 0x2001, 0x000d, 0x6032, 0xa085, 0x0001, 0x0005, 0x00f6,
++	0x00e6, 0x00c6, 0x2071, 0xb74a, 0x2079, 0x0020, 0x7904, 0xd1fc,
++	0x01f0, 0x7803, 0x0002, 0x2d60, 0xa026, 0x7000, 0x0002, 0x36b7,
++	0x36a2, 0x36ae, 0x8001, 0x7002, 0xd19c, 0x1188, 0x2011, 0x0001,
++	0x080c, 0x3667, 0x0160, 0x080c, 0x3667, 0x0048, 0x8001, 0x7002,
++	0x7804, 0xd0fc, 0x1d30, 0x2011, 0x0001, 0x080c, 0x3667, 0x00ce,
++	0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200,
++	0x2001, 0xb6c0, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0xb6bf,
++	0x2004, 0x60ce, 0x6004, 0xc0ac, 0xa085, 0x0200, 0x6006, 0x2001,
++	0x0074, 0x2004, 0xa005, 0x01f8, 0x2038, 0x2001, 0x0076, 0x2024,
++	0x2001, 0x0077, 0x201c, 0x080c, 0x3e33, 0x6833, 0x000d, 0x6f26,
++	0x2d00, 0x681a, 0xa78a, 0x0007, 0x0220, 0x2138, 0x2009, 0x0007,
++	0x0010, 0x2708, 0xa03e, 0x6818, 0xa080, 0x000d, 0x04b1, 0x1d90,
++	0x2d00, 0x681a, 0x0088, 0x080c, 0x3e33, 0x6833, 0x000d, 0x2070,
++	0x6827, 0x0001, 0x2d00, 0x681a, 0x2001, 0x0076, 0x2004, 0x2072,
++	0x2001, 0x0077, 0x2004, 0x7006, 0x2061, 0x0020, 0x2079, 0x0100,
++	0x2001, 0xb6bf, 0x2004, 0x6012, 0x20e1, 0x9040, 0x2001, 0x0072,
++	0x2004, 0xa084, 0xfff8, 0x700a, 0x601a, 0x0006, 0x2001, 0x0073,
++	0x2004, 0x700e, 0x601e, 0x78c6, 0x000e, 0x78ca, 0xa006, 0x603a,
++	0x603e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x0010,
++	0x20a0, 0x2099, 0x0014, 0x7003, 0x0026, 0x7432, 0x7336, 0xa006,
++	0x703a, 0x703e, 0x810b, 0x810b, 0x21a8, 0x810b, 0x7122, 0x7003,
++	0x0041, 0x7004, 0xd0fc, 0x0de8, 0x7003, 0x0002, 0x7003, 0x0040,
++	0x53a5, 0x7430, 0x7334, 0x87ff, 0x0180, 0x00c6, 0x00d6, 0x2d60,
++	0x00c6, 0x080c, 0x3e33, 0x00ce, 0x6018, 0x2070, 0x2d00, 0x7006,
++	0x601a, 0x00de, 0x00ce, 0xa085, 0x0001, 0x00ee, 0x0005, 0x00e6,
++	0x2001, 0x0075, 0x2004, 0xa005, 0x0508, 0x2038, 0x2001, 0x0078,
++	0x2024, 0x2001, 0x0079, 0x201c, 0x080c, 0x3e33, 0x2d60, 0x6833,
++	0x000d, 0x6f26, 0x2d00, 0x681a, 0xa78a, 0x0007, 0x0220, 0x2138,
++	0x2009, 0x0007, 0x0010, 0x2708, 0xa03e, 0x6818, 0xa080, 0x000d,
++	0x080c, 0x3725, 0x1d88, 0x2d00, 0x681a, 0x00e0, 0x080c, 0x3e33,
++	0x2d60, 0x6033, 0x000d, 0x2070, 0x6027, 0x0001, 0x2c00, 0x601a,
++	0x2001, 0x0078, 0x2004, 0x2072, 0x2001, 0x0079, 0x2004, 0x7006,
++	0x2001, 0x0072, 0x2004, 0xa084, 0xfff8, 0x700a, 0x2001, 0x0073,
++	0x2004, 0x700e, 0x2001, 0x0030, 0x2003, 0x0004, 0x7824, 0xd0ac,
++	0x1178, 0x2001, 0x0101, 0x200c, 0xc1ed, 0x2102, 0x6027, 0x0000,
++	0x2001, 0xb723, 0x2003, 0x0003, 0x2001, 0x0030, 0x2003, 0x0009,
++	0x00ee, 0x0005, 0x0804, 0x2f6e, 0x0126, 0x2091, 0x8000, 0x20a9,
++	0x0012, 0x2001, 0xb440, 0x20a0, 0xa006, 0x40a4, 0x012e, 0x0804,
++	0x2f6e, 0x7d38, 0x7c3c, 0x0804, 0x3015, 0x080c, 0x3e33, 0x0904,
++	0x2f93, 0x080c, 0x5a90, 0x0110, 0x080c, 0x4baa, 0x2009, 0x001c,
++	0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3e74, 0x701b, 0x37d9,
++	0x0005, 0xade8, 0x000d, 0x6800, 0xa005, 0x0904, 0x2f96, 0x6804,
++	0xd0ac, 0x0118, 0xd0a4, 0x0904, 0x2f96, 0xd094, 0x00c6, 0x2061,
++	0x0100, 0x6104, 0x0138, 0x6200, 0xa292, 0x0005, 0x0218, 0xa18c,
++	0xffdf, 0x0010, 0xa18d, 0x0020, 0x6106, 0x00ce, 0xd08c, 0x00c6,
++	0x2061, 0x0100, 0x6104, 0x0118, 0xa18d, 0x0010, 0x0010, 0xa18c,
++	0xffef, 0x6106, 0x00ce, 0x2009, 0x0100, 0x210c, 0xa18a, 0x0002,
++	0x0268, 0xd084, 0x0158, 0x6a28, 0xa28a, 0x007f, 0x1a04, 0x2f96,
++	0xa288, 0x2d88, 0x210d, 0xa18c, 0x00ff, 0x615a, 0xd0dc, 0x0130,
++	0x6828, 0xa08a, 0x007f, 0x1a04, 0x2f96, 0x6052, 0x6808, 0xa08a,
++	0x0100, 0x0a04, 0x2f96, 0xa08a, 0x0841, 0x1a04, 0x2f96, 0xa084,
++	0x0007, 0x1904, 0x2f96, 0x680c, 0xa005, 0x0904, 0x2f96, 0x6810,
++	0xa005, 0x0904, 0x2f96, 0x6848, 0x6940, 0xa10a, 0x1a04, 0x2f96,
++	0x8001, 0x0904, 0x2f96, 0x684c, 0x6944, 0xa10a, 0x1a04, 0x2f96,
++	0x8001, 0x0904, 0x2f96, 0x6804, 0xd0fc, 0x0560, 0x080c, 0x3e33,
++	0x0904, 0x2f93, 0x2009, 0x0014, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
++	0xa290, 0x0038, 0xa399, 0x0000, 0x080c, 0x3e74, 0x701b, 0x3859,
++	0x0005, 0xade8, 0x000d, 0x20a9, 0x0014, 0x2d98, 0x2069, 0xb46e,
++	0x2da0, 0x53a3, 0x7010, 0xa0e8, 0x000d, 0x2001, 0xb472, 0x200c,
++	0xd1e4, 0x0140, 0x00c6, 0x2061, 0x0100, 0x6004, 0xa085, 0x0b00,
++	0x6006, 0x00ce, 0x2009, 0xb6b1, 0x200b, 0x0000, 0x2001, 0xb474,
++	0x2004, 0xd0ac, 0x0158, 0x7824, 0x200a, 0x2009, 0x017f, 0x200a,
++	0x3200, 0xa084, 0x003f, 0xa085, 0x3020, 0x2090, 0x20a9, 0x001c,
++	0x2d98, 0x2069, 0xb452, 0x2da0, 0x53a3, 0x6814, 0xa08c, 0x00ff,
++	0x6142, 0x8007, 0xa084, 0x00ff, 0x6046, 0x080c, 0x5d66, 0x080c,
++	0x532d, 0x080c, 0x5396, 0x6000, 0xa086, 0x0000, 0x1904, 0x3954,
++	0x6808, 0x602a, 0x080c, 0x2439, 0x0006, 0x2001, 0x0100, 0x2004,
++	0xa082, 0x0005, 0x000e, 0x0268, 0x2009, 0x0170, 0x200b, 0x0080,
++	0xe000, 0xe000, 0x200b, 0x0000, 0x0036, 0x6b08, 0x080c, 0x2868,
++	0x003e, 0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217,
++	0x831f, 0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0148,
++	0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f,
++	0x0010, 0xa084, 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312, 0x8007,
++	0x810f, 0x8217, 0x831f, 0x20a9, 0x0004, 0x20a1, 0xb6c6, 0x40a1,
++	0x080c, 0x6a2d, 0x6904, 0xd1fc, 0x0520, 0x00c6, 0x2009, 0x0000,
++	0x20a9, 0x0001, 0x6b70, 0xd384, 0x01c8, 0x0020, 0x839d, 0x12b0,
++	0x3508, 0x8109, 0x080c, 0x631d, 0x6878, 0x6016, 0x6874, 0x2008,
++	0xa084, 0xff00, 0x8007, 0x600a, 0xa184, 0x00ff, 0x6006, 0x8108,
++	0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x1f04, 0x38ee,
++	0x00ce, 0x2069, 0xb452, 0x2001, 0xb69e, 0x6a80, 0xa294, 0x0030,
++	0xa28e, 0x0000, 0x0170, 0xa28e, 0x0010, 0x0118, 0xa28e, 0x0020,
++	0x0140, 0x2003, 0xaaaa, 0x080c, 0x28b1, 0x2001, 0xb68f, 0x2102,
++	0x0008, 0x2102, 0x00c6, 0x2061, 0x0100, 0x602f, 0x0040, 0x602f,
++	0x0000, 0x00ce, 0x080c, 0x5a90, 0x0128, 0x080c, 0x408d, 0x0110,
++	0x080c, 0x282d, 0x60c8, 0xa005, 0x01d0, 0x6003, 0x0001, 0x2009,
++	0x393a, 0x00e0, 0x080c, 0x5a90, 0x1178, 0x2011, 0x5963, 0x080c,
++	0x6961, 0x2011, 0x5956, 0x080c, 0x6a21, 0x2001, 0xb69f, 0x2003,
++	0x0000, 0x080c, 0x59c8, 0x0040, 0x080c, 0x4ad9, 0x0028, 0x6003,
++	0x0004, 0x2009, 0x3954, 0x0010, 0x0804, 0x2f6e, 0x2001, 0x0100,
++	0x2004, 0xa082, 0x0005, 0x0258, 0x2001, 0x0170, 0x2004, 0xa084,
++	0x00ff, 0xa086, 0x004c, 0x1118, 0x2091, 0x309d, 0x0817, 0x2091,
++	0x301d, 0x0817, 0x6000, 0xa086, 0x0000, 0x0904, 0x2f93, 0x2069,
++	0xb452, 0x7830, 0x6842, 0x7834, 0x6846, 0x6804, 0xd0fc, 0x0118,
++	0x2009, 0x0030, 0x0010, 0x2009, 0x001c, 0x2d00, 0x7a2c, 0x7b28,
++	0x7c3c, 0x7d38, 0x0804, 0x3e77, 0xa006, 0x080c, 0x282d, 0x81ff,
++	0x1904, 0x2f93, 0x080c, 0x5a90, 0x1178, 0x2001, 0xb69f, 0x2003,
++	0x0001, 0x2001, 0xb400, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c,
++	0x5ad4, 0x080c, 0x59c8, 0x0020, 0x080c, 0x4baa, 0x080c, 0x4ad9,
++	0x0804, 0x2f6e, 0x81ff, 0x1904, 0x2f93, 0x080c, 0x5a90, 0x1110,
++	0x0804, 0x2f93, 0x6188, 0x81ff, 0x0198, 0x703f, 0x0000, 0x2001,
++	0xbbc0, 0x2009, 0x0040, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x3e77, 0x701b, 0x2f6c, 0x012e, 0x0005,
++	0x703f, 0x0001, 0x00d6, 0x2069, 0xbbc0, 0x20a9, 0x0040, 0x20a1,
++	0xbbc0, 0x2019, 0xffff, 0x43a4, 0x6550, 0xa588, 0x2d88, 0x210d,
++	0xa18c, 0x00ff, 0x216a, 0xa00e, 0x2011, 0x0002, 0x2100, 0xa506,
++	0x01a8, 0x080c, 0x4f6a, 0x1190, 0x6014, 0x821c, 0x0238, 0xa398,
++	0xbbc0, 0xa085, 0xff00, 0x8007, 0x201a, 0x0038, 0xa398, 0xbbc0,
++	0x2324, 0xa4a4, 0xff00, 0xa405, 0x201a, 0x8210, 0x8108, 0xa182,
++	0x0080, 0x1208, 0x0c18, 0x8201, 0x8007, 0x2d0c, 0xa105, 0x206a,
++	0x00de, 0x20a9, 0x0040, 0x20a1, 0xbbc0, 0x2099, 0xbbc0, 0x080c,
++	0x4b49, 0x0804, 0x39af, 0x080c, 0x3e58, 0x0904, 0x2f96, 0x00c6,
++	0x080c, 0x3e33, 0x00ce, 0x1120, 0x2009, 0x0002, 0x0804, 0x2f93,
++	0x2001, 0xb453, 0x2004, 0xd0b4, 0x0550, 0x7824, 0xa084, 0xff00,
++	0xa08e, 0x7e00, 0x0520, 0xa08e, 0x7f00, 0x0508, 0xa08e, 0x8000,
++	0x01f0, 0x6000, 0xd08c, 0x11d8, 0x6004, 0xa084, 0x00ff, 0xa086,
++	0x0006, 0x11a8, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c,
++	0x9d6b, 0x1120, 0x2009, 0x0003, 0x0804, 0x2f93, 0x7007, 0x0003,
++	0x701b, 0x3a3b, 0x0005, 0x080c, 0x3e58, 0x0904, 0x2f96, 0x20a9,
++	0x002b, 0x2c98, 0xade8, 0x0002, 0x2da0, 0x53a3, 0x20a9, 0x0004,
++	0xac80, 0x0006, 0x2098, 0xad80, 0x0006, 0x20a0, 0x080c, 0x4b49,
++	0x20a9, 0x0004, 0xac80, 0x000a, 0x2098, 0xad80, 0x000a, 0x20a0,
++	0x080c, 0x4b49, 0x2d00, 0x2009, 0x002b, 0x7a2c, 0x7b28, 0x7c3c,
++	0x7d38, 0x0804, 0x3e77, 0x81ff, 0x1904, 0x2f93, 0x080c, 0x3e48,
++	0x0904, 0x2f96, 0x080c, 0x5147, 0x0804, 0x2f6e, 0x81ff, 0x1904,
++	0x2f93, 0x7828, 0xa08a, 0x1000, 0x1a04, 0x2f96, 0x080c, 0x3e58,
++	0x0904, 0x2f96, 0x080c, 0x51aa, 0x0904, 0x2f93, 0x2019, 0x0004,
++	0xa00e, 0x080c, 0x5159, 0x7924, 0x810f, 0x7a28, 0x0011, 0x0804,
++	0x2f6e, 0xa186, 0x00ff, 0x0110, 0x0071, 0x0060, 0x2029, 0x007e,
++	0x2061, 0xb400, 0x6450, 0x2400, 0xa506, 0x0110, 0x2508, 0x0019,
++	0x8529, 0x1ec8, 0x0005, 0x080c, 0x4f6a, 0x1138, 0x2200, 0x8003,
++	0x800b, 0x810b, 0xa108, 0x080c, 0x696d, 0x0005, 0x81ff, 0x1904,
++	0x2f93, 0x080c, 0x3e48, 0x0904, 0x2f96, 0x080c, 0x5030, 0x0904,
++	0x2f93, 0x080c, 0x5150, 0x0804, 0x2f6e, 0x81ff, 0x1904, 0x2f93,
++	0x080c, 0x3e48, 0x0904, 0x2f96, 0x080c, 0x5030, 0x0904, 0x2f93,
++	0x080c, 0x513e, 0x0804, 0x2f6e, 0x6100, 0x0804, 0x2f6e, 0x080c,
++	0x3e58, 0x0904, 0x2f96, 0x2001, 0xb400, 0x2004, 0xa086, 0x0003,
++	0x1904, 0x2f93, 0x00d6, 0xace8, 0x000a, 0x7924, 0xd184, 0x0110,
++	0xace8, 0x0006, 0x680c, 0x8007, 0x783e, 0x6808, 0x8007, 0x783a,
++	0x6b04, 0x831f, 0x6a00, 0x8217, 0x00de, 0x6100, 0xa18c, 0x0200,
++	0x0804, 0x2f6e, 0x7824, 0xa09c, 0x00ff, 0xa39a, 0x0003, 0x1a04,
++	0x2f93, 0x6250, 0xa294, 0x00ff, 0xa084, 0xff00, 0x8007, 0xa206,
++	0x1150, 0x2001, 0xb440, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c,
++	0x7d38, 0x0804, 0x3e77, 0x81ff, 0x1904, 0x2f93, 0x080c, 0x3e58,
++	0x0904, 0x2f96, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1904,
++	0x2f93, 0x00c6, 0x080c, 0x3e33, 0x00ce, 0x0904, 0x2f93, 0x6837,
++	0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c, 0x9d17, 0x0904, 0x2f93,
++	0x7007, 0x0003, 0x701b, 0x3b25, 0x0005, 0x6830, 0xa086, 0x0100,
++	0x0904, 0x2f93, 0xad80, 0x000e, 0x2009, 0x000c, 0x7a2c, 0x7b28,
++	0x7c3c, 0x7d38, 0x0804, 0x3e77, 0xa006, 0x080c, 0x282d, 0x7824,
++	0xa084, 0x00ff, 0xa086, 0x00ff, 0x0118, 0x81ff, 0x1904, 0x2f93,
++	0x080c, 0x5a90, 0x0110, 0x080c, 0x4baa, 0x7828, 0xa08a, 0x1000,
++	0x1a04, 0x2f96, 0x7924, 0xa18c, 0xff00, 0x810f, 0xa186, 0x00ff,
++	0x0138, 0xa182, 0x007f, 0x1a04, 0x2f96, 0x2100, 0x080c, 0x27f7,
++	0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2061, 0xb6f3, 0x601b,
++	0x0000, 0x601f, 0x0000, 0x080c, 0x5a90, 0x1178, 0x2001, 0xb69f,
++	0x2003, 0x0001, 0x2001, 0xb400, 0x2003, 0x0001, 0xa085, 0x0001,
++	0x080c, 0x5ad4, 0x080c, 0x59c8, 0x0420, 0x2011, 0x0003, 0x080c,
++	0x801f, 0x2011, 0x0002, 0x080c, 0x8029, 0x080c, 0x7f03, 0x0036,
++	0x2019, 0x0000, 0x080c, 0x7f8e, 0x003e, 0x2061, 0x0100, 0x2001,
++	0xb415, 0x2004, 0xa084, 0x00ff, 0x810f, 0xa105, 0x604a, 0x6043,
++	0x0090, 0x6043, 0x0010, 0x2009, 0x002d, 0x2011, 0x4b0e, 0x080c,
++	0x69e7, 0x7924, 0xa18c, 0xff00, 0x810f, 0x080c, 0x5a90, 0x1110,
++	0x2009, 0x00ff, 0x7a28, 0x080c, 0x3a89, 0x012e, 0x00ce, 0x002e,
++	0x0804, 0x2f6e, 0x7924, 0xa18c, 0xff00, 0x810f, 0x00c6, 0x080c,
++	0x4f0e, 0x2c08, 0x00ce, 0x1904, 0x2f96, 0x0804, 0x2f6e, 0x81ff,
++	0x0120, 0x2009, 0x0001, 0x0804, 0x2f93, 0x60d4, 0xd0ac, 0x1130,
++	0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x2f93, 0x080c, 0x3e33,
++	0x1120, 0x2009, 0x0002, 0x0804, 0x2f93, 0x7924, 0x7a2c, 0x7b28,
++	0x7c3c, 0x7d38, 0x080c, 0x3e74, 0x701b, 0x3bd7, 0x0005, 0x2009,
++	0x0080, 0x080c, 0x4f6a, 0x1130, 0x6004, 0xa084, 0x00ff, 0xa086,
++	0x0006, 0x0120, 0x2021, 0x400a, 0x0804, 0x2f70, 0x00d6, 0xade8,
++	0x000d, 0x6900, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x6e18, 0x6820,
++	0xa0be, 0x0100, 0x0904, 0x3c4e, 0xa0be, 0x0112, 0x0904, 0x3c4e,
++	0xa0be, 0x0113, 0x0904, 0x3c4e, 0xa0be, 0x0114, 0x0904, 0x3c4e,
++	0xa0be, 0x0117, 0x0904, 0x3c4e, 0xa0be, 0x011a, 0x0904, 0x3c4e,
++	0xa0be, 0x011c, 0x0904, 0x3c4e, 0xa0be, 0x0121, 0x05b0, 0xa0be,
++	0x0131, 0x0598, 0xa0be, 0x0171, 0x05c8, 0xa0be, 0x0173, 0x05b0,
++	0xa0be, 0x01a1, 0x1120, 0x6830, 0x8007, 0x6832, 0x04a8, 0xa0be,
++	0x0212, 0x0540, 0xa0be, 0x0213, 0x0528, 0xa0be, 0x0214, 0x01b0,
++	0xa0be, 0x0217, 0x0168, 0xa0be, 0x021a, 0x1120, 0x6838, 0x8007,
++	0x683a, 0x00e0, 0xa0be, 0x0300, 0x01c8, 0x00de, 0x0804, 0x2f96,
++	0xad80, 0x0010, 0x20a9, 0x0007, 0x080c, 0x3c94, 0xad80, 0x000e,
++	0x20a9, 0x0001, 0x080c, 0x3c94, 0x0048, 0xad80, 0x000c, 0x080c,
++	0x3ca2, 0x0050, 0xad80, 0x000e, 0x080c, 0x3ca2, 0xad80, 0x000c,
++	0x20a9, 0x0001, 0x080c, 0x3c94, 0x00c6, 0x080c, 0x3e33, 0x0568,
++	0x6838, 0xc0fd, 0x683a, 0x6837, 0x0119, 0x6853, 0x0000, 0x684f,
++	0x0020, 0x685b, 0x0001, 0x810b, 0x697e, 0x6883, 0x0000, 0x6a86,
++	0x6b8a, 0x6c8e, 0x6d92, 0x6996, 0x689b, 0x0000, 0x00ce, 0x00de,
++	0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x6823, 0x0000, 0x6804,
++	0x2068, 0x080c, 0x9d33, 0x1120, 0x2009, 0x0003, 0x0804, 0x2f93,
++	0x7007, 0x0003, 0x701b, 0x3c8b, 0x0005, 0x00ce, 0x00de, 0x2009,
++	0x0002, 0x0804, 0x2f93, 0x6820, 0xa086, 0x8001, 0x1904, 0x2f6e,
++	0x2009, 0x0004, 0x0804, 0x2f93, 0x0016, 0x2008, 0x2044, 0x8000,
++	0x204c, 0x8000, 0x290a, 0x8108, 0x280a, 0x8108, 0x1f04, 0x3c96,
++	0x001e, 0x0005, 0x0016, 0x00a6, 0x00b6, 0x2008, 0x2044, 0x8000,
++	0x204c, 0x8000, 0x2054, 0x8000, 0x205c, 0x2b0a, 0x8108, 0x2a0a,
++	0x8108, 0x290a, 0x8108, 0x280a, 0x00be, 0x00ae, 0x001e, 0x0005,
++	0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x2f93, 0x60d4, 0xd0ac,
++	0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x2f93, 0x7924,
++	0x2140, 0xa18c, 0xff00, 0x810f, 0x60d4, 0xd0ac, 0x1120, 0xa182,
++	0x0080, 0x0a04, 0x2f96, 0xa182, 0x00ff, 0x1a04, 0x2f96, 0x7a2c,
++	0x7b28, 0x6070, 0xa306, 0x1140, 0x6074, 0xa24e, 0x0904, 0x2f96,
++	0xa9cc, 0xff00, 0x0904, 0x2f96, 0x00c6, 0x080c, 0x3d81, 0x2c68,
++	0x00ce, 0x0538, 0xa0c6, 0x4000, 0x1180, 0x00c6, 0x0006, 0x2d60,
++	0x2009, 0x0000, 0x080c, 0x520b, 0x1108, 0xc185, 0x6000, 0xd0bc,
++	0x0108, 0xc18d, 0x000e, 0x00ce, 0x0088, 0xa0c6, 0x4007, 0x1110,
++	0x2408, 0x0060, 0xa0c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0030,
++	0xa0c6, 0x4009, 0x1108, 0x0010, 0x2001, 0x4006, 0x2020, 0x0804,
++	0x2f70, 0x2d00, 0x7022, 0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70,
++	0x080c, 0x856a, 0x05d8, 0x2d00, 0x601a, 0x080c, 0x9fb8, 0x2e58,
++	0x00ee, 0x00e6, 0x00c6, 0x080c, 0x3e33, 0x00ce, 0x2b70, 0x1150,
++	0x080c, 0x85c0, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x2009, 0x0002,
++	0x0804, 0x2f93, 0x6837, 0x0000, 0x683b, 0x0000, 0x2d00, 0x6012,
++	0x6833, 0x0000, 0x6838, 0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0x683a,
++	0x0126, 0x2091, 0x8000, 0x080c, 0x2c60, 0x012e, 0x601f, 0x0001,
++	0x2001, 0x0000, 0x080c, 0x4eac, 0x2001, 0x0002, 0x080c, 0x4ebe,
++	0x2009, 0x0002, 0x080c, 0x85ef, 0xa085, 0x0001, 0x00ee, 0x00ce,
++	0x00be, 0x001e, 0x1120, 0x2009, 0x0003, 0x0804, 0x2f93, 0x7007,
++	0x0003, 0x701b, 0x3d64, 0x0005, 0x6830, 0xa086, 0x0100, 0x7020,
++	0x2060, 0x1138, 0x2009, 0x0004, 0x6204, 0xa294, 0x00ff, 0x0804,
++	0x2f93, 0x2009, 0x0000, 0x6838, 0xd0f4, 0x1904, 0x2f6e, 0x080c,
++	0x520b, 0x1108, 0xc185, 0x6000, 0xd0bc, 0x0108, 0xc18d, 0x0804,
++	0x2f6e, 0x00e6, 0x00d6, 0x2029, 0x0000, 0x2001, 0xb435, 0x2004,
++	0xd0ac, 0x0138, 0x2021, 0x0000, 0x20a9, 0x00ff, 0x2071, 0xb535,
++	0x0030, 0x2021, 0x0080, 0x20a9, 0x007f, 0x2071, 0xb5b5, 0x2e04,
++	0xa005, 0x1130, 0x2100, 0xa406, 0x1570, 0x2428, 0xc5fd, 0x0458,
++	0x2068, 0x6f10, 0x2700, 0xa306, 0x11b0, 0x6e14, 0x2600, 0xa206,
++	0x1190, 0x2400, 0xa106, 0x1160, 0x2d60, 0xd884, 0x0568, 0x6004,
++	0xa084, 0x00ff, 0xa086, 0x0006, 0x1538, 0x2001, 0x4000, 0x0428,
++	0x2001, 0x4007, 0x0410, 0x2400, 0xa106, 0x1168, 0x6e14, 0x87ff,
++	0x1138, 0x86ff, 0x09d0, 0x2001, 0xb435, 0x2004, 0xd0ac, 0x19a8,
++	0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x3d97, 0x85ff,
++	0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, 0x0030, 0x080c,
++	0x4f0e, 0x1dd0, 0x6312, 0x6216, 0xa006, 0xa005, 0x00de, 0x00ee,
++	0x0005, 0x81ff, 0x1904, 0x2f93, 0x080c, 0x3e33, 0x0904, 0x2f93,
++	0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x7824, 0xa005, 0x0904,
++	0x2f96, 0xa096, 0x00ff, 0x0120, 0xa092, 0x0004, 0x1a04, 0x2f96,
++	0x2010, 0x2d18, 0x080c, 0x2c13, 0x0904, 0x2f93, 0x7007, 0x0003,
++	0x701b, 0x3e03, 0x0005, 0x6830, 0xa086, 0x0100, 0x0904, 0x2f93,
++	0x0804, 0x2f6e, 0x7924, 0xa18c, 0xff00, 0x810f, 0x60d4, 0xd0ac,
++	0x1120, 0xa182, 0x0080, 0x0a04, 0x2f96, 0xa182, 0x00ff, 0x1a04,
++	0x2f96, 0x0126, 0x2091, 0x8000, 0x080c, 0x9c1b, 0x1188, 0xa190,
++	0xb535, 0x2204, 0xa065, 0x0160, 0x080c, 0x4bc5, 0x2001, 0xb435,
++	0x2004, 0xd0ac, 0x0110, 0x6017, 0x0000, 0x012e, 0x0804, 0x2f6e,
++	0x012e, 0x0804, 0x2f93, 0x080c, 0x15f4, 0x0188, 0xa006, 0x6802,
++	0x7010, 0xa005, 0x1120, 0x2d00, 0x7012, 0x7016, 0x0030, 0x7014,
++	0x6802, 0x2060, 0x2d00, 0x6006, 0x7016, 0xad80, 0x000d, 0x0005,
++	0x7924, 0x810f, 0xa18c, 0x00ff, 0x080c, 0x4f6a, 0x1130, 0x7e28,
++	0xa684, 0x3fff, 0xa082, 0x4000, 0x0208, 0xa066, 0x8cff, 0x0005,
++	0x7e24, 0x860f, 0xa18c, 0x00ff, 0x080c, 0x4f6a, 0x1128, 0xa6b4,
++	0x00ff, 0xa682, 0x4000, 0x0208, 0xa066, 0x8cff, 0x0005, 0x0016,
++	0x7110, 0x81ff, 0x0128, 0x2168, 0x6904, 0x080c, 0x160b, 0x0cc8,
++	0x7112, 0x7116, 0x001e, 0x0005, 0x2031, 0x0001, 0x0010, 0x2031,
++	0x0000, 0x2061, 0xb4d2, 0x6606, 0x6112, 0x600e, 0x6226, 0x632a,
++	0x642e, 0x6532, 0x2c10, 0x080c, 0x163f, 0x7007, 0x0002, 0x701b,
++	0x2f6e, 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0000,
++	0x2001, 0xb490, 0x2004, 0xa005, 0x1168, 0x0e04, 0x3ea2, 0x7818,
++	0xd084, 0x1140, 0x7a22, 0x7b26, 0x7c2a, 0x781b, 0x0001, 0x2091,
++	0x4080, 0x0408, 0x0016, 0x00c6, 0x00e6, 0x2071, 0xb482, 0x7138,
++	0xa182, 0x0010, 0x0218, 0x7030, 0x2060, 0x0078, 0x7030, 0xa0e0,
++	0x0004, 0xac82, 0xb4d2, 0x0210, 0x2061, 0xb492, 0x2c00, 0x7032,
++	0x81ff, 0x1108, 0x7036, 0x8108, 0x713a, 0x2262, 0x6306, 0x640a,
++	0x00ee, 0x00ce, 0x001e, 0x012e, 0x00fe, 0x0005, 0x00e6, 0x2071,
++	0xb482, 0x7038, 0xa005, 0x0570, 0x0126, 0x2091, 0x8000, 0x0e04,
++	0x3ef9, 0x00f6, 0x2079, 0x0000, 0x7818, 0xd084, 0x1508, 0x00c6,
++	0x7034, 0x2060, 0x2c04, 0x7822, 0x6004, 0x7826, 0x6008, 0x782a,
++	0x781b, 0x0001, 0x2091, 0x4080, 0x7038, 0x8001, 0x703a, 0xa005,
++	0x1130, 0x7033, 0xb492, 0x7037, 0xb492, 0x00ce, 0x0048, 0xac80,
++	0x0004, 0xa0fa, 0xb4d2, 0x0210, 0x2001, 0xb492, 0x7036, 0x00ce,
++	0x00fe, 0x012e, 0x00ee, 0x0005, 0x0026, 0x2001, 0xb453, 0x2004,
++	0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, 0x3e8a, 0x002e, 0x0005,
++	0x81ff, 0x1904, 0x2f93, 0x0126, 0x2091, 0x8000, 0x6030, 0xc08d,
++	0xc085, 0xc0ac, 0x6032, 0x080c, 0x5a90, 0x1178, 0x2001, 0xb69f,
++	0x2003, 0x0001, 0x2001, 0xb400, 0x2003, 0x0001, 0xa085, 0x0001,
++	0x080c, 0x5ad4, 0x080c, 0x59c8, 0x0010, 0x080c, 0x4ad9, 0x012e,
++	0x0804, 0x2f6e, 0x7824, 0x2008, 0xa18c, 0xfffd, 0x1128, 0x61e0,
++	0xa10d, 0x61e2, 0x0804, 0x2f6e, 0x0804, 0x2f96, 0x81ff, 0x1904,
++	0x2f93, 0x6000, 0xa086, 0x0003, 0x1904, 0x2f93, 0x2001, 0xb453,
++	0x2004, 0xd0ac, 0x1904, 0x2f93, 0x080c, 0x3e58, 0x0904, 0x2f96,
++	0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1120, 0x7828, 0xa005,
++	0x0904, 0x2f6e, 0x00c6, 0x080c, 0x3e33, 0x00ce, 0x0904, 0x2f93,
++	0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c,
++	0x9dfc, 0x0904, 0x2f93, 0x7007, 0x0003, 0x701b, 0x3f68, 0x0005,
++	0x6830, 0xa086, 0x0100, 0x0904, 0x2f93, 0x0804, 0x2f6e, 0x2001,
++	0xb400, 0x2004, 0xa086, 0x0003, 0x1904, 0x2f93, 0x7f24, 0x7a2c,
++	0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3e33, 0x0904, 0x2f93, 0x2009,
++	0x0000, 0x2031, 0x0000, 0x7023, 0x0000, 0x702f, 0x0000, 0xad80,
++	0x0005, 0x7026, 0x20a0, 0x080c, 0x4f6a, 0x1904, 0x3fe2, 0x6004,
++	0xa0c4, 0x00ff, 0xa8c6, 0x0006, 0x0130, 0xa0c4, 0xff00, 0xa8c6,
++	0x0600, 0x1904, 0x3fe2, 0x2001, 0xb453, 0x2004, 0xd0ac, 0x1128,
++	0x080c, 0x520b, 0x1110, 0xd79c, 0x05e8, 0xd794, 0x1110, 0xd784,
++	0x0158, 0xac80, 0x0006, 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3,
++	0x080c, 0x3ca2, 0xd794, 0x0148, 0xac80, 0x000a, 0x2098, 0x3400,
++	0x20a9, 0x0004, 0x53a3, 0x080c, 0x3ca2, 0x21a2, 0xd794, 0x01d8,
++	0xac80, 0x0000, 0x2098, 0x94a0, 0x20a9, 0x0002, 0x53a3, 0xac80,
++	0x0003, 0x20a6, 0x94a0, 0xac80, 0x0004, 0x2098, 0x3400, 0x20a9,
++	0x0002, 0x53a3, 0x080c, 0x3c94, 0xac80, 0x0026, 0x2098, 0x20a9,
++	0x0002, 0x53a3, 0x0008, 0x94a0, 0xd794, 0x0110, 0xa6b0, 0x000b,
++	0xa6b0, 0x0005, 0x8108, 0x2001, 0xb435, 0x2004, 0xd0ac, 0x0118,
++	0xa186, 0x0100, 0x0040, 0xd78c, 0x0120, 0xa186, 0x0100, 0x0170,
++	0x0018, 0xa186, 0x007e, 0x0150, 0xd794, 0x0118, 0xa686, 0x0020,
++	0x0010, 0xa686, 0x0028, 0x0150, 0x0804, 0x3f8b, 0x86ff, 0x1120,
++	0x7120, 0x810b, 0x0804, 0x2f6e, 0x702f, 0x0001, 0x711e, 0x7020,
++	0xa600, 0x7022, 0x772a, 0x2061, 0xb4d2, 0x6007, 0x0000, 0x6612,
++	0x7024, 0x600e, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x080c,
++	0x163f, 0x7007, 0x0002, 0x701b, 0x401e, 0x0005, 0x702c, 0xa005,
++	0x1170, 0x711c, 0x7024, 0x20a0, 0x7728, 0x2031, 0x0000, 0x2061,
++	0xb4d2, 0x6224, 0x6328, 0x642c, 0x6530, 0x0804, 0x3f8b, 0x7120,
++	0x810b, 0x0804, 0x2f6e, 0x2029, 0x007e, 0x7924, 0x7a28, 0x7b2c,
++	0x7c38, 0xa184, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x2f96,
++	0xa502, 0x0a04, 0x2f96, 0xa184, 0x00ff, 0xa0e2, 0x0020, 0x0a04,
++	0x2f96, 0xa502, 0x0a04, 0x2f96, 0xa284, 0xff00, 0x8007, 0xa0e2,
++	0x0020, 0x0a04, 0x2f96, 0xa502, 0x0a04, 0x2f96, 0xa284, 0x00ff,
++	0xa0e2, 0x0020, 0x0a04, 0x2f96, 0xa502, 0x0a04, 0x2f96, 0xa384,
++	0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x2f96, 0xa502, 0x0a04,
++	0x2f96, 0xa384, 0x00ff, 0xa0e2, 0x0020, 0x0a04, 0x2f96, 0xa502,
++	0x0a04, 0x2f96, 0xa484, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04,
++	0x2f96, 0xa502, 0x0a04, 0x2f96, 0xa484, 0x00ff, 0xa0e2, 0x0020,
++	0x0a04, 0x2f96, 0xa502, 0x0a04, 0x2f96, 0x2061, 0xb6b9, 0x6102,
++	0x6206, 0x630a, 0x640e, 0x0804, 0x2f6e, 0x0006, 0x2001, 0xb453,
++	0x2004, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x2001, 0xb472, 0x2004,
++	0xd0bc, 0x000e, 0x0005, 0x6168, 0x7a24, 0x6300, 0x82ff, 0x1118,
++	0x7926, 0x0804, 0x2f6e, 0x83ff, 0x1904, 0x2f96, 0x2001, 0xfff0,
++	0xa200, 0x1a04, 0x2f96, 0x2019, 0xffff, 0x606c, 0xa302, 0xa200,
++	0x0a04, 0x2f96, 0x7926, 0x626a, 0x0804, 0x2f6e, 0x2001, 0xb400,
++	0x2004, 0xa086, 0x0003, 0x1904, 0x2f93, 0x7c28, 0x7d24, 0x7e38,
++	0x7f2c, 0x080c, 0x3e33, 0x0904, 0x2f93, 0x2009, 0x0000, 0x2019,
++	0x0000, 0x7023, 0x0000, 0x702f, 0x0000, 0xad80, 0x0003, 0x7026,
++	0x20a0, 0xa1e0, 0xb535, 0x2c64, 0x8cff, 0x01b8, 0x6004, 0xa084,
++	0x00ff, 0xa086, 0x0006, 0x0130, 0x6004, 0xa084, 0xff00, 0xa086,
++	0x0600, 0x1158, 0x6014, 0x20a2, 0x94a0, 0x6010, 0x8007, 0xa105,
++	0x8007, 0x20a2, 0x94a0, 0xa398, 0x0002, 0x8108, 0xa182, 0x00ff,
++	0x0120, 0xa386, 0x002a, 0x0148, 0x08e0, 0x83ff, 0x1120, 0x7120,
++	0x810c, 0x0804, 0x2f6e, 0x702f, 0x0001, 0x711e, 0x7020, 0xa300,
++	0x7022, 0x2061, 0xb4d2, 0x6007, 0x0000, 0x6312, 0x7024, 0x600e,
++	0x6426, 0x652a, 0x662e, 0x6732, 0x2c10, 0x080c, 0x163f, 0x7007,
++	0x0002, 0x701b, 0x4114, 0x0005, 0x702c, 0xa005, 0x1168, 0x711c,
++	0x7024, 0x20a0, 0x2019, 0x0000, 0x2061, 0xb4d2, 0x6424, 0x6528,
++	0x662c, 0x6730, 0x0804, 0x40d1, 0x7120, 0x810c, 0x0804, 0x2f6e,
++	0x81ff, 0x1904, 0x2f93, 0x60d4, 0xd0ac, 0x1118, 0xd09c, 0x0904,
++	0x2f93, 0x080c, 0x3e33, 0x0904, 0x2f93, 0x7924, 0x7a2c, 0x7b28,
++	0x7c3c, 0x7d38, 0x080c, 0x3e74, 0x701b, 0x413f, 0x0005, 0x00d6,
++	0xade8, 0x000d, 0x6828, 0xa0be, 0x7000, 0x0148, 0xa0be, 0x7100,
++	0x0130, 0xa0be, 0x7200, 0x0118, 0x00de, 0x0804, 0x2f96, 0x6820,
++	0x6924, 0x080c, 0x27e3, 0x1510, 0x080c, 0x4f0e, 0x11f8, 0x7122,
++	0x6612, 0x6516, 0x6e18, 0x00c6, 0x080c, 0x3e33, 0x01b8, 0x080c,
++	0x3e33, 0x01a0, 0x00ce, 0x00de, 0x6837, 0x0000, 0x6838, 0xc0fd,
++	0x683a, 0x6823, 0x0000, 0x6804, 0x2068, 0x080c, 0x9d4f, 0x0904,
++	0x2f93, 0x7007, 0x0003, 0x701b, 0x4179, 0x0005, 0x00de, 0x0804,
++	0x2f93, 0x7120, 0x080c, 0x2d5b, 0x6820, 0xa086, 0x8001, 0x0904,
++	0x2f93, 0x2d00, 0x701e, 0x6804, 0xa080, 0x0002, 0x0006, 0x20a9,
++	0x002a, 0x2098, 0x20a0, 0x080c, 0x4b49, 0x000e, 0xade8, 0x000d,
++	0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x2061, 0xb4d2, 0x6007, 0x0000,
++	0x6e00, 0x6f28, 0xa7c6, 0x7000, 0x1108, 0x0018, 0xa7c6, 0x7100,
++	0x1140, 0xa6c2, 0x0004, 0x0a04, 0x2f96, 0x2009, 0x0004, 0x0804,
++	0x3e77, 0xa7c6, 0x7200, 0x1904, 0x2f96, 0xa6c2, 0x0054, 0x0a04,
++	0x2f96, 0x600e, 0x6013, 0x002a, 0x6226, 0x632a, 0x642e, 0x6532,
++	0x2c10, 0x080c, 0x163f, 0x7007, 0x0002, 0x701b, 0x41c0, 0x0005,
++	0x701c, 0x2068, 0x6804, 0xa080, 0x0001, 0x2004, 0xa080, 0x0002,
++	0x0006, 0x20a9, 0x002a, 0x2098, 0x20a0, 0x080c, 0x4b49, 0x000e,
++	0x2009, 0x002a, 0x2061, 0xb4d2, 0x6224, 0x6328, 0x642c, 0x6530,
++	0x0804, 0x3e77, 0x81ff, 0x1904, 0x2f93, 0x792c, 0x2001, 0xb6a0,
++	0x2102, 0x080c, 0x3e48, 0x0904, 0x2f96, 0x080c, 0x5030, 0x0904,
++	0x2f93, 0x0126, 0x2091, 0x8000, 0x080c, 0x5162, 0x012e, 0x0804,
++	0x2f6e, 0x7824, 0xd08c, 0x1118, 0xd084, 0x0904, 0x3a03, 0x080c,
++	0x3e58, 0x0904, 0x2f96, 0x00c6, 0x080c, 0x3e33, 0x00ce, 0x1120,
++	0x2009, 0x0002, 0x0804, 0x2f93, 0x6004, 0xa084, 0x00ff, 0xa086,
++	0x0006, 0x0128, 0xa08e, 0x0004, 0x0110, 0xa08e, 0x0005, 0x15b8,
++	0x7824, 0xd08c, 0x0120, 0x6000, 0xc08c, 0x6002, 0x0030, 0x2001,
++	0xb453, 0x2004, 0xd0b4, 0x0904, 0x3a3f, 0x7824, 0xa084, 0xff00,
++	0xa08e, 0x7e00, 0x0904, 0x3a3f, 0xa08e, 0x7f00, 0x0904, 0x3a3f,
++	0xa08e, 0x8000, 0x0904, 0x3a3f, 0x6000, 0xd08c, 0x1904, 0x3a3f,
++	0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c, 0x9d6b, 0x1120,
++	0x2009, 0x0003, 0x0804, 0x2f93, 0x7007, 0x0003, 0x701b, 0x4241,
++	0x0005, 0x080c, 0x3e58, 0x0904, 0x2f96, 0x0804, 0x3a3f, 0x2009,
++	0xb431, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x2f93,
++	0x2001, 0xb400, 0x2004, 0xa086, 0x0003, 0x0120, 0x2009, 0x0007,
++	0x0804, 0x2f93, 0x2001, 0xb453, 0x2004, 0xd0ac, 0x0120, 0x2009,
++	0x0008, 0x0804, 0x2f93, 0x609c, 0xd0a4, 0x1118, 0xd0ac, 0x1904,
++	0x3a3f, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a,
++	0x080c, 0x9dfc, 0x1120, 0x2009, 0x0003, 0x0804, 0x2f93, 0x7007,
++	0x0003, 0x701b, 0x427c, 0x0005, 0x6830, 0xa086, 0x0100, 0x1120,
++	0x2009, 0x0004, 0x0804, 0x2f93, 0x080c, 0x3e58, 0x0904, 0x2f96,
++	0x0804, 0x4210, 0x81ff, 0x2009, 0x0001, 0x1904, 0x2f93, 0x6000,
++	0xa086, 0x0003, 0x2009, 0x0007, 0x1904, 0x2f93, 0x2001, 0xb453,
++	0x2004, 0xd0ac, 0x2009, 0x0008, 0x1904, 0x2f93, 0x080c, 0x3e58,
++	0x0904, 0x2f96, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x2009,
++	0x0009, 0x1904, 0x2f93, 0x00c6, 0x080c, 0x3e33, 0x00ce, 0x2009,
++	0x0002, 0x0904, 0x2f93, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838,
++	0xc0fd, 0x683a, 0x7928, 0xa194, 0xff00, 0xa18c, 0x00ff, 0xa006,
++	0x82ff, 0x1128, 0xc0ed, 0x6952, 0x792c, 0x6956, 0x0048, 0xa28e,
++	0x0100, 0x1904, 0x2f96, 0xc0e5, 0x6853, 0x0000, 0x6857, 0x0000,
++	0x683e, 0x080c, 0x9fb9, 0x2009, 0x0003, 0x0904, 0x2f93, 0x7007,
++	0x0003, 0x701b, 0x42dc, 0x0005, 0x6830, 0xa086, 0x0100, 0x2009,
++	0x0004, 0x0904, 0x2f93, 0x0804, 0x2f6e, 0x81ff, 0x2009, 0x0001,
++	0x1904, 0x2f93, 0x6000, 0xa086, 0x0003, 0x2009, 0x0007, 0x1904,
++	0x2f93, 0x080c, 0x3e58, 0x0904, 0x2f96, 0x6004, 0xa084, 0x00ff,
++	0xa086, 0x0006, 0x2009, 0x0009, 0x1904, 0x2f93, 0x00c6, 0x080c,
++	0x3e33, 0x00ce, 0x2009, 0x0002, 0x0904, 0x2f93, 0xad80, 0x000f,
++	0x2009, 0x0008, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3e74,
++	0x701b, 0x4313, 0x0005, 0x00d6, 0xade8, 0x000f, 0x6800, 0xa086,
++	0x0500, 0x1140, 0x6804, 0xa005, 0x1128, 0x6808, 0xa084, 0xff00,
++	0x1108, 0x0018, 0x00de, 0x1904, 0x2f96, 0x00de, 0x6837, 0x0000,
++	0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x00c6, 0x080c, 0x3e58,
++	0x1118, 0x00ce, 0x0804, 0x2f96, 0x080c, 0xa008, 0x2009, 0x0003,
++	0x00ce, 0x0904, 0x2f93, 0x7007, 0x0003, 0x701b, 0x4340, 0x0005,
++	0x6830, 0xa086, 0x0100, 0x2009, 0x0004, 0x0904, 0x2f93, 0x0804,
++	0x2f6e, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x2f93, 0x6000,
++	0xa086, 0x0003, 0x0120, 0x2009, 0x0007, 0x0804, 0x2f93, 0x7e24,
++	0x860f, 0xa18c, 0x00ff, 0xa6b4, 0x00ff, 0x080c, 0x4f6a, 0x1904,
++	0x2f96, 0xa186, 0x007f, 0x0150, 0x6004, 0xa084, 0x00ff, 0xa086,
++	0x0006, 0x0120, 0x2009, 0x0009, 0x0804, 0x2f93, 0x00c6, 0x080c,
++	0x3e33, 0x00ce, 0x1120, 0x2009, 0x0002, 0x0804, 0x2f93, 0x6837,
++	0x0000, 0x6838, 0xc0fd, 0x683a, 0x2001, 0x0100, 0x8007, 0x680a,
++	0x080c, 0x9d86, 0x1120, 0x2009, 0x0003, 0x0804, 0x2f93, 0x7007,
++	0x0003, 0x701b, 0x438c, 0x0005, 0x6808, 0x8007, 0xa086, 0x0100,
++	0x1120, 0x2009, 0x0004, 0x0804, 0x2f93, 0x68b0, 0x6836, 0x6810,
++	0x8007, 0xa084, 0x00ff, 0x800c, 0x6814, 0x8007, 0xa084, 0x00ff,
++	0x8004, 0xa080, 0x0002, 0xa108, 0xad80, 0x0004, 0x7a2c, 0x7b28,
++	0x7c3c, 0x7d38, 0x0804, 0x3e77, 0x080c, 0x3e33, 0x1120, 0x2009,
++	0x0002, 0x0804, 0x2f93, 0x7924, 0xa194, 0xff00, 0xa18c, 0x00ff,
++	0x8217, 0x82ff, 0x0110, 0x0804, 0x2f96, 0x2009, 0x001a, 0x7a2c,
++	0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3e74, 0x701b, 0x43c8, 0x0005,
++	0xad80, 0x000d, 0x2098, 0x20a9, 0x001a, 0x20a1, 0xb6c6, 0x53a3,
++	0x0804, 0x2f6e, 0x080c, 0x3e33, 0x1120, 0x2009, 0x0002, 0x0804,
++	0x2f93, 0x7924, 0xa194, 0xff00, 0xa18c, 0x00ff, 0x8217, 0x82ff,
++	0x0110, 0x0804, 0x2f96, 0x2099, 0xb6c6, 0x20a0, 0x20a9, 0x001a,
++	0x53a3, 0x2009, 0x001a, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804,
++	0x3e77, 0x7824, 0xa08a, 0x1000, 0x1a04, 0x2f96, 0x0126, 0x2091,
++	0x8000, 0x8003, 0x800b, 0x810b, 0xa108, 0x00c6, 0x2061, 0xb6f3,
++	0x6142, 0x00ce, 0x012e, 0x0804, 0x2f6e, 0x00c6, 0x080c, 0x5a90,
++	0x1188, 0x2001, 0xb69f, 0x2003, 0x0001, 0x2001, 0xb400, 0x2003,
++	0x0001, 0xa085, 0x0001, 0x080c, 0x5ad4, 0x080c, 0x59c8, 0x080c,
++	0x1511, 0x0038, 0x2061, 0xb400, 0x6030, 0xc09d, 0x6032, 0x080c,
++	0x4ad9, 0x00ce, 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061,
++	0xb6f3, 0x7924, 0x6152, 0x614e, 0x6057, 0x0000, 0x604b, 0x0009,
++	0x7838, 0x606a, 0x783c, 0x6066, 0x7828, 0x6062, 0x782c, 0x605e,
++	0x2061, 0xb6a1, 0x2001, 0xb708, 0x600e, 0x6013, 0x0001, 0x6017,
++	0x0002, 0x6007, 0x0000, 0x6037, 0x0000, 0x00ce, 0x012e, 0x0804,
++	0x2f6e, 0x0126, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0xb400,
++	0x6044, 0xd0a4, 0x11b0, 0xd084, 0x0118, 0x080c, 0x45c0, 0x0068,
++	0xd08c, 0x0118, 0x080c, 0x44e1, 0x0040, 0xd094, 0x0118, 0x080c,
++	0x44b2, 0x0018, 0xd09c, 0x0108, 0x0061, 0x00ee, 0x00ce, 0x012e,
++	0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, 0xc19d, 0x612a, 0x001e,
++	0x0ca0, 0x624c, 0xa286, 0xf0f0, 0x1150, 0x6048, 0xa086, 0xf0f0,
++	0x0130, 0x624a, 0x6043, 0x0090, 0x6043, 0x0010, 0x0490, 0xa294,
++	0xff00, 0xa296, 0xf700, 0x0178, 0x7134, 0xd1a4, 0x1160, 0x6240,
++	0xa295, 0x0100, 0x6242, 0xa294, 0x0010, 0x0128, 0x2009, 0x00f7,
++	0x080c, 0x4b69, 0x00f0, 0x6040, 0xa084, 0x0010, 0xa085, 0x0140,
++	0x6042, 0x6043, 0x0000, 0x707b, 0x0000, 0x7097, 0x0001, 0x70bb,
++	0x0000, 0x70d7, 0x0000, 0x2009, 0xbbc0, 0x200b, 0x0000, 0x708b,
++	0x0000, 0x707f, 0x000a, 0x2009, 0x000a, 0x2011, 0x4a8f, 0x080c,
++	0x69e7, 0x0005, 0x0156, 0x2001, 0xb474, 0x2004, 0xd08c, 0x0110,
++	0x7053, 0xffff, 0x707c, 0xa005, 0x1510, 0x2011, 0x4a8f, 0x080c,
++	0x6961, 0x6040, 0xa094, 0x0010, 0xa285, 0x0020, 0x6042, 0x20a9,
++	0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, 0x44c9, 0x6242, 0x708f,
++	0x0000, 0x6040, 0xa094, 0x0010, 0xa285, 0x0080, 0x6042, 0x6242,
++	0x0030, 0x6242, 0x708f, 0x0000, 0x7083, 0x0000, 0x0000, 0x015e,
++	0x0005, 0x7080, 0xa08a, 0x0003, 0x1210, 0x0023, 0x0010, 0x080c,
++	0x1511, 0x0005, 0x44ed, 0x453d, 0x45bf, 0x00f6, 0x7083, 0x0001,
++	0x20e1, 0xa000, 0xe000, 0x20e1, 0x8700, 0x080c, 0x2439, 0x20e1,
++	0x9080, 0x20e1, 0x4000, 0x2079, 0xba00, 0x207b, 0x2200, 0x7807,
++	0x00ef, 0x780b, 0x0000, 0x780f, 0x00ef, 0x7813, 0x0138, 0x7817,
++	0x0000, 0x781b, 0x0000, 0x781f, 0x0000, 0x7823, 0xffff, 0x7827,
++	0xffff, 0x782b, 0x0000, 0x782f, 0x0000, 0x2079, 0xba0c, 0x207b,
++	0x1101, 0x7807, 0x0000, 0x2099, 0xb405, 0x20a1, 0xba0e, 0x20a9,
++	0x0004, 0x53a3, 0x2079, 0xba12, 0x207b, 0x0000, 0x7807, 0x0000,
++	0x2099, 0xba00, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x60c3,
++	0x000c, 0x600f, 0x0000, 0x080c, 0x4ac0, 0x00fe, 0x7087, 0x0000,
++	0x6043, 0x0008, 0x6043, 0x0000, 0x0005, 0x00d6, 0x7084, 0x7087,
++	0x0000, 0xa025, 0x0904, 0x45a7, 0x6020, 0xd0b4, 0x1904, 0x45a5,
++	0x7194, 0x81ff, 0x0904, 0x4595, 0xa486, 0x000c, 0x1904, 0x45a0,
++	0xa480, 0x0018, 0x8004, 0x20a8, 0x2011, 0xba80, 0x2019, 0xba00,
++	0x220c, 0x2304, 0xa106, 0x11b8, 0x8210, 0x8318, 0x1f04, 0x4558,
++	0x6043, 0x0004, 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0006,
++	0x7083, 0x0002, 0x708f, 0x0002, 0x2009, 0x07d0, 0x2011, 0x4a96,
++	0x080c, 0x69e7, 0x0490, 0x2069, 0xba80, 0x6930, 0xa18e, 0x1101,
++	0x1538, 0x6834, 0xa005, 0x1520, 0x6900, 0xa18c, 0x00ff, 0x1118,
++	0x6804, 0xa005, 0x0190, 0x2011, 0xba8e, 0x2019, 0xb405, 0x20a9,
++	0x0004, 0x220c, 0x2304, 0xa102, 0x0230, 0x1190, 0x8210, 0x8318,
++	0x1f04, 0x4589, 0x0068, 0x7097, 0x0000, 0x20e1, 0x9080, 0x20e1,
++	0x4000, 0x2099, 0xba80, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6,
++	0x6043, 0x0008, 0x6043, 0x0000, 0x0010, 0x00de, 0x0005, 0x6040,
++	0xa085, 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8, 0x60c3, 0x000c,
++	0x2011, 0xb6ea, 0x2013, 0x0000, 0x7087, 0x0000, 0x20e1, 0x9080,
++	0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x7d1b, 0x0c30, 0x0005,
++	0x708c, 0xa08a, 0x001d, 0x1210, 0x0023, 0x0010, 0x080c, 0x1511,
++	0x0005, 0x45f3, 0x4602, 0x462a, 0x4643, 0x4667, 0x468f, 0x46b3,
++	0x46e4, 0x4708, 0x4730, 0x4767, 0x478f, 0x47ab, 0x47c1, 0x47e1,
++	0x47f4, 0x47fc, 0x482c, 0x4850, 0x4878, 0x489c, 0x48cd, 0x490a,
++	0x4939, 0x4955, 0x4994, 0x49b4, 0x49cd, 0x49ce, 0x00c6, 0x2061,
++	0xb400, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0xa084, 0xfff9,
++	0x6006, 0x00ce, 0x0005, 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043,
++	0x0002, 0x708f, 0x0001, 0x2009, 0x07d0, 0x2011, 0x4a96, 0x080c,
++	0x69e7, 0x0005, 0x00f6, 0x7084, 0xa086, 0x0014, 0x1508, 0x6043,
++	0x0000, 0x6020, 0xd0b4, 0x11e0, 0x2079, 0xba80, 0x7a30, 0xa296,
++	0x1102, 0x11a0, 0x7834, 0xa005, 0x1188, 0x7a38, 0xd2fc, 0x0128,
++	0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x2011, 0x4a96, 0x080c,
++	0x6961, 0x708f, 0x0010, 0x080c, 0x47fc, 0x0010, 0x080c, 0x4ad9,
++	0x00fe, 0x0005, 0x708f, 0x0003, 0x6043, 0x0004, 0x2011, 0x4a96,
++	0x080c, 0x6961, 0x080c, 0x4b51, 0x20a3, 0x1102, 0x20a3, 0x0000,
++	0x20a9, 0x000a, 0x20a3, 0x0000, 0x1f04, 0x463a, 0x60c3, 0x0014,
++	0x080c, 0x4ac0, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011,
++	0x4a96, 0x080c, 0x6961, 0xa086, 0x0014, 0x11a8, 0x2079, 0xba80,
++	0x7a30, 0xa296, 0x1102, 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38,
++	0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f,
++	0x0004, 0x0029, 0x0010, 0x080c, 0x4ad9, 0x00fe, 0x0005, 0x708f,
++	0x0005, 0x080c, 0x4b51, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430,
++	0x2011, 0xba8e, 0x080c, 0x4ba2, 0x1160, 0x7078, 0xa005, 0x1148,
++	0x7150, 0xa186, 0xffff, 0x0128, 0x080c, 0x4a5a, 0x0110, 0x080c,
++	0x4b80, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4ac0, 0x0005, 0x00f6,
++	0x7084, 0xa005, 0x01f0, 0x2011, 0x4a96, 0x080c, 0x6961, 0xa086,
++	0x0014, 0x11a8, 0x2079, 0xba80, 0x7a30, 0xa296, 0x1103, 0x1178,
++	0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005,
++	0x1110, 0x70bb, 0x0001, 0x708f, 0x0006, 0x0029, 0x0010, 0x080c,
++	0x4ad9, 0x00fe, 0x0005, 0x708f, 0x0007, 0x080c, 0x4b51, 0x20a3,
++	0x1104, 0x20a3, 0x0000, 0x3430, 0x2011, 0xba8e, 0x080c, 0x4ba2,
++	0x11a8, 0x7078, 0xa005, 0x1190, 0x7158, 0xa186, 0xffff, 0x0170,
++	0xa180, 0x2d88, 0x200d, 0xa18c, 0xff00, 0x810f, 0x080c, 0x4a5a,
++	0x0128, 0x080c, 0x4094, 0x0110, 0x080c, 0x282d, 0x20a9, 0x0008,
++	0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
++	0x0014, 0x080c, 0x4ac0, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0,
++	0x2011, 0x4a96, 0x080c, 0x6961, 0xa086, 0x0014, 0x11a8, 0x2079,
++	0xba80, 0x7a30, 0xa296, 0x1104, 0x1178, 0x7834, 0xa005, 0x1160,
++	0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001,
++	0x708f, 0x0008, 0x0029, 0x0010, 0x080c, 0x4ad9, 0x00fe, 0x0005,
++	0x708f, 0x0009, 0x080c, 0x4b51, 0x20a3, 0x1105, 0x20a3, 0x0100,
++	0x3430, 0x080c, 0x4ba2, 0x1150, 0x7078, 0xa005, 0x1138, 0x080c,
++	0x49cf, 0x1170, 0xa085, 0x0001, 0x080c, 0x282d, 0x20a9, 0x0008,
++	0x2099, 0xba8e, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x0014, 0x080c, 0x4ac0, 0x0010, 0x080c, 0x45e6, 0x0005,
++	0x00f6, 0x7084, 0xa005, 0x0588, 0x2011, 0x4a96, 0x080c, 0x6961,
++	0xa086, 0x0014, 0x1540, 0x2079, 0xba80, 0x7a30, 0xa296, 0x1105,
++	0x1510, 0x7834, 0x2011, 0x0100, 0xa21e, 0x1160, 0x7a38, 0xd2fc,
++	0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, 0x000a,
++	0x00b1, 0x0098, 0xa005, 0x1178, 0x7a38, 0xd2fc, 0x0128, 0x70b8,
++	0xa005, 0x1110, 0x70bb, 0x0001, 0x708b, 0x0000, 0x708f, 0x000e,
++	0x080c, 0x47e1, 0x0010, 0x080c, 0x4ad9, 0x00fe, 0x0005, 0x708f,
++	0x000b, 0x2011, 0xba0e, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff,
++	0x43a4, 0x20a9, 0x0002, 0x2009, 0x0000, 0x41a4, 0x080c, 0x4b51,
++	0x20a3, 0x1106, 0x20a3, 0x0000, 0x080c, 0x4ba2, 0x0118, 0x2013,
++	0x0000, 0x0020, 0x7054, 0xa085, 0x0100, 0x2012, 0x2298, 0x20a9,
++	0x0042, 0x53a6, 0x60c3, 0x0084, 0x080c, 0x4ac0, 0x0005, 0x00f6,
++	0x7084, 0xa005, 0x01b0, 0x2011, 0x4a96, 0x080c, 0x6961, 0xa086,
++	0x0084, 0x1168, 0x2079, 0xba80, 0x7a30, 0xa296, 0x1106, 0x1138,
++	0x7834, 0xa005, 0x1120, 0x708f, 0x000c, 0x0029, 0x0010, 0x080c,
++	0x4ad9, 0x00fe, 0x0005, 0x708f, 0x000d, 0x080c, 0x4b51, 0x20a3,
++	0x1107, 0x20a3, 0x0000, 0x2099, 0xba8e, 0x20a9, 0x0040, 0x53a6,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084, 0x080c, 0x4ac0,
++	0x0005, 0x00f6, 0x7084, 0xa005, 0x01d0, 0x2011, 0x4a96, 0x080c,
++	0x6961, 0xa086, 0x0084, 0x1188, 0x2079, 0xba80, 0x7a30, 0xa296,
++	0x1107, 0x1158, 0x7834, 0xa005, 0x1140, 0x708b, 0x0001, 0x080c,
++	0x4b43, 0x708f, 0x000e, 0x0029, 0x0010, 0x080c, 0x4ad9, 0x00fe,
++	0x0005, 0x708f, 0x000f, 0x7087, 0x0000, 0x608b, 0xbc85, 0x608f,
++	0xb5b5, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011,
++	0x4a96, 0x080c, 0x6955, 0x0005, 0x7084, 0xa005, 0x0120, 0x2011,
++	0x4a96, 0x080c, 0x6961, 0x0005, 0x708f, 0x0011, 0x080c, 0x4ba2,
++	0x11a0, 0x7170, 0x81ff, 0x0188, 0x2009, 0x0000, 0x7074, 0xa084,
++	0x00ff, 0x080c, 0x27e3, 0xa186, 0x007e, 0x0138, 0xa186, 0x0080,
++	0x0120, 0x2011, 0xba8e, 0x080c, 0x4a5a, 0x20e1, 0x9080, 0x20e1,
++	0x4000, 0x2099, 0xba80, 0x20a1, 0x020b, 0x7484, 0xa480, 0x0018,
++	0xa080, 0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3,
++	0x0014, 0x080c, 0x4ac0, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0,
++	0x2011, 0x4a96, 0x080c, 0x6961, 0xa086, 0x0014, 0x11a8, 0x2079,
++	0xba80, 0x7a30, 0xa296, 0x1103, 0x1178, 0x7834, 0xa005, 0x1160,
++	0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001,
++	0x708f, 0x0012, 0x0029, 0x0010, 0x080c, 0x4ad9, 0x00fe, 0x0005,
++	0x708f, 0x0013, 0x080c, 0x4b5d, 0x20a3, 0x1103, 0x20a3, 0x0000,
++	0x3430, 0x2011, 0xba8e, 0x080c, 0x4ba2, 0x1160, 0x7078, 0xa005,
++	0x1148, 0x7150, 0xa186, 0xffff, 0x0128, 0x080c, 0x4a5a, 0x0110,
++	0x080c, 0x4b80, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4ac0, 0x0005,
++	0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, 0x4a96, 0x080c, 0x6961,
++	0xa086, 0x0014, 0x11a8, 0x2079, 0xba80, 0x7a30, 0xa296, 0x1104,
++	0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8,
++	0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, 0x0014, 0x0029, 0x0010,
++	0x080c, 0x4ad9, 0x00fe, 0x0005, 0x708f, 0x0015, 0x080c, 0x4b5d,
++	0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011, 0xba8e, 0x080c,
++	0x4ba2, 0x11a8, 0x7078, 0xa005, 0x1190, 0x7158, 0xa186, 0xffff,
++	0x0170, 0xa180, 0x2d88, 0x200d, 0xa18c, 0xff00, 0x810f, 0x080c,
++	0x4a5a, 0x0128, 0x080c, 0x4094, 0x0110, 0x080c, 0x282d, 0x20a9,
++	0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x0014, 0x080c, 0x4ac0, 0x0005, 0x00f6, 0x7084, 0xa005,
++	0x05b8, 0x2011, 0x4a96, 0x080c, 0x6961, 0xa086, 0x0014, 0x1570,
++	0x2079, 0xba80, 0x7a30, 0xa296, 0x1105, 0x1540, 0x7834, 0x2011,
++	0x0100, 0xa21e, 0x1148, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005,
++	0x1110, 0x70bb, 0x0001, 0x0060, 0xa005, 0x11c0, 0x7a38, 0xd2fc,
++	0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708b, 0x0000,
++	0x7a38, 0xd2f4, 0x0138, 0x2001, 0xb474, 0x2004, 0xd0a4, 0x1110,
++	0x70d7, 0x0008, 0x708f, 0x0016, 0x0029, 0x0010, 0x080c, 0x4ad9,
++	0x00fe, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xba80,
++	0x20a1, 0x020b, 0x20a9, 0x000e, 0x53a6, 0x3430, 0x2011, 0xba8e,
++	0x708f, 0x0017, 0x080c, 0x4ba2, 0x1150, 0x7078, 0xa005, 0x1138,
++	0x080c, 0x49cf, 0x1170, 0xa085, 0x0001, 0x080c, 0x282d, 0x20a9,
++	0x0008, 0x2099, 0xba8e, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x60c3, 0x0014, 0x080c, 0x4ac0, 0x0010, 0x080c, 0x45e6,
++	0x0005, 0x00f6, 0x7084, 0xa005, 0x01b0, 0x2011, 0x4a96, 0x080c,
++	0x6961, 0xa086, 0x0084, 0x1168, 0x2079, 0xba80, 0x7a30, 0xa296,
++	0x1106, 0x1138, 0x7834, 0xa005, 0x1120, 0x708f, 0x0018, 0x0029,
++	0x0010, 0x080c, 0x4ad9, 0x00fe, 0x0005, 0x708f, 0x0019, 0x080c,
++	0x4b5d, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x3430, 0x2099, 0xba8e,
++	0x2039, 0xba0e, 0x27a0, 0x20a9, 0x0040, 0x53a3, 0x080c, 0x4ba2,
++	0x11e8, 0x2728, 0x2514, 0x8207, 0xa084, 0x00ff, 0x8000, 0x2018,
++	0xa294, 0x00ff, 0x8007, 0xa205, 0x202a, 0x7054, 0x2310, 0x8214,
++	0xa2a0, 0xba0e, 0x2414, 0xa38c, 0x0001, 0x0118, 0xa294, 0xff00,
++	0x0018, 0xa294, 0x00ff, 0x8007, 0xa215, 0x2222, 0x2798, 0x26a0,
++	0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
++	0x0084, 0x080c, 0x4ac0, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01d0,
++	0x2011, 0x4a96, 0x080c, 0x6961, 0xa086, 0x0084, 0x1188, 0x2079,
++	0xba80, 0x7a30, 0xa296, 0x1107, 0x1158, 0x7834, 0xa005, 0x1140,
++	0x708b, 0x0001, 0x080c, 0x4b43, 0x708f, 0x001a, 0x0029, 0x0010,
++	0x080c, 0x4ad9, 0x00fe, 0x0005, 0x708f, 0x001b, 0x20e1, 0x9080,
++	0x20e1, 0x4000, 0x2099, 0xba80, 0x20a1, 0x020b, 0x7484, 0xa480,
++	0x0018, 0xa080, 0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6,
++	0x60c3, 0x0084, 0x080c, 0x4ac0, 0x0005, 0x0005, 0x0005, 0x0086,
++	0x0096, 0x2029, 0xb453, 0x252c, 0x20a9, 0x0008, 0x2041, 0xba0e,
++	0x28a0, 0x2099, 0xba8e, 0x53a3, 0x20a9, 0x0008, 0x2011, 0x0007,
++	0xd5d4, 0x0110, 0x2011, 0x0000, 0x2800, 0xa200, 0x200c, 0xa1a6,
++	0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210, 0x0008, 0x8211, 0x1f04,
++	0x49e4, 0x0804, 0x4a52, 0x82ff, 0x1160, 0xd5d4, 0x0120, 0xa1a6,
++	0x3fff, 0x0d90, 0x0020, 0xa1a6, 0x3fff, 0x0904, 0x4a52, 0xa18d,
++	0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019,
++	0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, 0x0008, 0x8424, 0x1240,
++	0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, 0x1f04, 0x4a0a, 0x04d0,
++	0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, 0x1f04, 0x4a1c, 0x2328,
++	0x8529, 0xa2be, 0x0007, 0x0158, 0x0006, 0x2039, 0x0007, 0x2200,
++	0xa73a, 0x000e, 0x27a8, 0xa5a8, 0x0010, 0x1f04, 0x4a2b, 0x7552,
++	0xa5c8, 0x2d88, 0x292d, 0xa5ac, 0x00ff, 0x7576, 0x6532, 0x6536,
++	0x0016, 0x2508, 0x080c, 0x280d, 0x001e, 0x60e7, 0x0000, 0x65ea,
++	0x2018, 0x2304, 0xa405, 0x201a, 0x707b, 0x0001, 0x26a0, 0x2898,
++	0x20a9, 0x0008, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0xa085,
++	0x0001, 0x0028, 0xa006, 0x0018, 0xa006, 0x080c, 0x1511, 0x009e,
++	0x008e, 0x0005, 0x2118, 0x2021, 0x0000, 0x2001, 0x0007, 0xa39a,
++	0x0010, 0x0218, 0x8420, 0x8001, 0x0cd0, 0x2118, 0x84ff, 0x0120,
++	0xa39a, 0x0010, 0x8421, 0x1de0, 0x2021, 0x0001, 0x83ff, 0x0118,
++	0x8423, 0x8319, 0x1de8, 0xa238, 0x2704, 0xa42c, 0x11b8, 0xa405,
++	0x203a, 0x7152, 0xa1a0, 0x2d88, 0x242d, 0xa5ac, 0x00ff, 0x7576,
++	0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x280d, 0x001e, 0x60e7,
++	0x0000, 0x65ea, 0x707b, 0x0001, 0xa084, 0x0000, 0x0005, 0x00e6,
++	0x2071, 0xb400, 0x707f, 0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6,
++	0x2079, 0x0100, 0x2071, 0x0140, 0x080c, 0x7d24, 0x7004, 0xa084,
++	0x4000, 0x0120, 0x7003, 0x1000, 0x7003, 0x0000, 0x0126, 0x2091,
++	0x8000, 0x2071, 0xb423, 0x2073, 0x0000, 0x7840, 0x0026, 0x0016,
++	0x2009, 0x00f7, 0x080c, 0x4b69, 0x001e, 0xa094, 0x0010, 0xa285,
++	0x0080, 0x7842, 0x7a42, 0x002e, 0x012e, 0x00fe, 0x00ee, 0x0005,
++	0x0126, 0x2091, 0x8000, 0x2011, 0xb6ea, 0x2013, 0x0000, 0x7087,
++	0x0000, 0x012e, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575,
++	0x080c, 0x7d1b, 0x2009, 0x07d0, 0x2011, 0x4a96, 0x080c, 0x69e7,
++	0x0005, 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2011,
++	0x0003, 0x080c, 0x801f, 0x2011, 0x0002, 0x080c, 0x8029, 0x080c,
++	0x7f03, 0x0036, 0x2019, 0x0000, 0x080c, 0x7f8e, 0x003e, 0x2009,
++	0x00f7, 0x080c, 0x4b69, 0x2061, 0xb6f3, 0x601b, 0x0000, 0x601f,
++	0x0000, 0x2061, 0xb400, 0x6003, 0x0001, 0x2061, 0x0100, 0x6043,
++	0x0090, 0x6043, 0x0010, 0x2009, 0x002d, 0x2011, 0x4b0e, 0x080c,
++	0x6955, 0x012e, 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006,
++	0x0126, 0x2091, 0x8000, 0x2071, 0x0100, 0x080c, 0x7d24, 0x2071,
++	0x0140, 0x7004, 0xa084, 0x4000, 0x0120, 0x7003, 0x1000, 0x7003,
++	0x0000, 0x080c, 0x5a98, 0x01a8, 0x080c, 0x5ab6, 0x1190, 0x2001,
++	0xb69e, 0x2003, 0xaaaa, 0x0016, 0x080c, 0x28b1, 0x2001, 0xb68f,
++	0x2102, 0x001e, 0x2001, 0xb69f, 0x2003, 0x0000, 0x080c, 0x59c8,
++	0x0030, 0x2001, 0x0001, 0x080c, 0x2789, 0x080c, 0x4ad9, 0x012e,
++	0x000e, 0x00ee, 0x0005, 0x20a9, 0x0040, 0x20a1, 0xbbc0, 0x2099,
++	0xba8e, 0x3304, 0x8007, 0x20a2, 0x9398, 0x94a0, 0x1f04, 0x4b49,
++	0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xba00, 0x20a1,
++	0x020b, 0x20a9, 0x000c, 0x53a6, 0x0005, 0x20e1, 0x9080, 0x20e1,
++	0x4000, 0x2099, 0xba80, 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6,
++	0x0005, 0x00c6, 0x0006, 0x2061, 0x0100, 0x810f, 0x2001, 0xb431,
++	0x2004, 0xa005, 0x1138, 0x2001, 0xb415, 0x2004, 0xa084, 0x00ff,
++	0xa105, 0x0010, 0xa185, 0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005,
++	0x0016, 0x0046, 0x2001, 0xb453, 0x2004, 0xd0a4, 0x0158, 0xa006,
++	0x2020, 0x2009, 0x002a, 0x080c, 0xb06b, 0x2001, 0xb40c, 0x200c,
++	0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0000, 0x080c, 0x2c33,
++	0x004e, 0x001e, 0x0005, 0x080c, 0x4ad9, 0x708f, 0x0000, 0x7087,
++	0x0000, 0x0005, 0x0006, 0x2001, 0xb40c, 0x2004, 0xd09c, 0x0100,
++	0x000e, 0x0005, 0x0006, 0x0016, 0x0126, 0x2091, 0x8000, 0x2001,
++	0x0101, 0x200c, 0xa18d, 0x0006, 0x2102, 0x012e, 0x001e, 0x000e,
++	0x0005, 0x0156, 0x20a9, 0x00ff, 0x2009, 0xb535, 0xa006, 0x200a,
++	0x8108, 0x1f04, 0x4bbf, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156,
++	0x0136, 0x0146, 0x2069, 0xb452, 0xa006, 0x6002, 0x6007, 0x0707,
++	0x600a, 0x600e, 0x6012, 0xa198, 0x2d88, 0x231d, 0xa39c, 0x00ff,
++	0x6316, 0x20a9, 0x0004, 0xac98, 0x0006, 0x23a0, 0x40a4, 0x20a9,
++	0x0004, 0xac98, 0x000a, 0x23a0, 0x40a4, 0x603e, 0x6042, 0x604e,
++	0x6052, 0x6056, 0x605a, 0x605e, 0x6062, 0x6066, 0x606a, 0x606e,
++	0x6072, 0x6076, 0x607a, 0x607e, 0x6082, 0x6086, 0x608a, 0x608e,
++	0x6092, 0x6096, 0x609a, 0x609e, 0x60ae, 0x61a2, 0x00d6, 0x60a4,
++	0xa06d, 0x0110, 0x080c, 0x160b, 0x60a7, 0x0000, 0x60a8, 0xa06d,
++	0x0110, 0x080c, 0x160b, 0x60ab, 0x0000, 0x00de, 0xa006, 0x604a,
++	0x6810, 0x603a, 0x680c, 0x6046, 0x6814, 0xa084, 0x00ff, 0x6042,
++	0x014e, 0x013e, 0x015e, 0x003e, 0x00de, 0x0005, 0x0126, 0x2091,
++	0x8000, 0x6944, 0x6e48, 0xa684, 0x3fff, 0xa082, 0x4000, 0x1a04,
++	0x4cd4, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x1a04, 0x4cd9,
++	0x2001, 0xb40c, 0x2004, 0xa084, 0x0003, 0x01c0, 0x2001, 0xb40c,
++	0x2004, 0xd084, 0x1904, 0x4cbc, 0xa188, 0xb535, 0x2104, 0xa065,
++	0x0904, 0x4cbc, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x1904,
++	0x4cbc, 0x6000, 0xd0c4, 0x0904, 0x4cbc, 0x0068, 0xa188, 0xb535,
++	0x2104, 0xa065, 0x0904, 0x4ca0, 0x6004, 0xa084, 0x00ff, 0xa08e,
++	0x0006, 0x1904, 0x4ca5, 0x60a4, 0xa00d, 0x0118, 0x080c, 0x5195,
++	0x05d0, 0x60a8, 0xa00d, 0x0188, 0x080c, 0x51e0, 0x1170, 0x694c,
++	0xd1fc, 0x1118, 0x080c, 0x4e9f, 0x0448, 0x080c, 0x4e4e, 0x694c,
++	0xd1ec, 0x1520, 0x080c, 0x5087, 0x0408, 0x694c, 0xa184, 0xa000,
++	0x0178, 0xd1ec, 0x0140, 0xd1fc, 0x0118, 0x080c, 0x5096, 0x0028,
++	0x080c, 0x5096, 0x0028, 0xd1fc, 0x0118, 0x080c, 0x4e4e, 0x0070,
++	0x6050, 0xa00d, 0x0130, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052,
++	0x0028, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x080c, 0x6c6f,
++	0xa006, 0x012e, 0x0005, 0x2001, 0x0005, 0x2009, 0x0000, 0x04e8,
++	0x2001, 0x0028, 0x2009, 0x0000, 0x04c0, 0xa082, 0x0006, 0x12a0,
++	0x2001, 0xb435, 0x2004, 0xd0ac, 0x1160, 0x60a0, 0xd0bc, 0x1148,
++	0x6100, 0xd1fc, 0x0904, 0x4c5b, 0x2001, 0x0029, 0x2009, 0x1000,
++	0x0420, 0x2001, 0x0028, 0x00a8, 0x2009, 0xb40c, 0x210c, 0xd18c,
++	0x0118, 0x2001, 0x0004, 0x0068, 0xd184, 0x0118, 0x2001, 0x0004,
++	0x0040, 0x2001, 0x0029, 0x6100, 0xd1fc, 0x0118, 0x2009, 0x1000,
++	0x0060, 0x2009, 0x0000, 0x0048, 0x2001, 0x0029, 0x2009, 0x0000,
++	0x0020, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005, 0x012e, 0x0005,
++	0x00e6, 0x0126, 0x2091, 0x8000, 0x6844, 0x8007, 0xa084, 0x00ff,
++	0x2008, 0xa182, 0x00ff, 0x1a04, 0x4d33, 0xa188, 0xb535, 0x2104,
++	0xa065, 0x01c0, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x11a8,
++	0x2c70, 0x080c, 0x856a, 0x05e8, 0x2e00, 0x601a, 0x2d00, 0x6012,
++	0x600b, 0xffff, 0x601f, 0x000a, 0x2009, 0x0003, 0x080c, 0x85ef,
++	0xa006, 0x0460, 0x2001, 0x0028, 0x0440, 0xa082, 0x0006, 0x1298,
++	0x2001, 0xb435, 0x2004, 0xd0ac, 0x1158, 0x60a0, 0xd0bc, 0x1140,
++	0x6100, 0xd1fc, 0x09e8, 0x2001, 0x0029, 0x2009, 0x1000, 0x00a8,
++	0x2001, 0x0028, 0x0090, 0x2009, 0xb40c, 0x210c, 0xd18c, 0x0118,
++	0x2001, 0x0004, 0x0050, 0xd184, 0x0118, 0x2001, 0x0004, 0x0028,
++	0x2001, 0x0029, 0x0010, 0x2001, 0x0029, 0xa005, 0x012e, 0x00ee,
++	0x0005, 0x2001, 0x002c, 0x0cc8, 0x00f6, 0x00e6, 0x0126, 0x2091,
++	0x8000, 0x2011, 0x0000, 0x2079, 0xb400, 0x6944, 0xa18c, 0xff00,
++	0x810f, 0xa182, 0x00ff, 0x1a04, 0x4e05, 0x2001, 0xb40c, 0x2004,
++	0xa084, 0x0003, 0x1904, 0x4df3, 0x080c, 0x4f6a, 0x11a0, 0x6004,
++	0xa084, 0x00ff, 0xa082, 0x0006, 0x1270, 0x6864, 0xa0c6, 0x006f,
++	0x0150, 0x2001, 0xb435, 0x2004, 0xd0ac, 0x1904, 0x4dee, 0x60a0,
++	0xd0bc, 0x1904, 0x4dee, 0x6864, 0xa0c6, 0x006f, 0x0118, 0x2008,
++	0x0804, 0x4db7, 0x6968, 0x2140, 0xa18c, 0xff00, 0x810f, 0x78d4,
++	0xd0ac, 0x1118, 0xa182, 0x0080, 0x06d0, 0xa182, 0x00ff, 0x16b8,
++	0x6a70, 0x6b6c, 0x7870, 0xa306, 0x1160, 0x7874, 0xa24e, 0x1118,
++	0x2208, 0x2310, 0x0460, 0xa9cc, 0xff00, 0x1118, 0x2208, 0x2310,
++	0x0430, 0x080c, 0x3d81, 0x2c70, 0x0550, 0x2009, 0x0000, 0x2011,
++	0x0000, 0xa0c6, 0x4000, 0x1160, 0x0006, 0x2e60, 0x080c, 0x520b,
++	0x1108, 0xc185, 0x7000, 0xd0bc, 0x0108, 0xc18d, 0x000e, 0x0088,
++	0xa0c6, 0x4007, 0x1110, 0x2408, 0x0060, 0xa0c6, 0x4008, 0x1118,
++	0x2708, 0x2610, 0x0030, 0xa0c6, 0x4009, 0x1108, 0x0010, 0x2001,
++	0x4006, 0x6866, 0x696a, 0x6a6e, 0x2001, 0x0030, 0x0450, 0x080c,
++	0x856a, 0x1138, 0x2001, 0x4005, 0x2009, 0x0003, 0x2011, 0x0000,
++	0x0c80, 0x2e00, 0x601a, 0x080c, 0x9fb8, 0x2d00, 0x6012, 0x601f,
++	0x0001, 0x6838, 0xd88c, 0x0108, 0xc0f5, 0x683a, 0x0126, 0x2091,
++	0x8000, 0x080c, 0x2c60, 0x012e, 0x2001, 0x0000, 0x080c, 0x4eac,
++	0x2001, 0x0002, 0x080c, 0x4ebe, 0x2009, 0x0002, 0x080c, 0x85ef,
++	0xa006, 0xa005, 0x012e, 0x00ee, 0x00fe, 0x0005, 0x2001, 0x0028,
++	0x2009, 0x0000, 0x0cb0, 0x2009, 0xb40c, 0x210c, 0xd18c, 0x0118,
++	0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010,
++	0x2001, 0x0029, 0x2009, 0x0000, 0x0c20, 0x2001, 0x0029, 0x2009,
++	0x0000, 0x08f8, 0x6944, 0x6e48, 0xa684, 0x3fff, 0xa082, 0x4000,
++	0x16b8, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x12e0, 0xa188,
++	0xb535, 0x2104, 0xa065, 0x01b8, 0x6004, 0xa084, 0x00ff, 0xa08e,
++	0x0006, 0x11b0, 0x684c, 0xd0ec, 0x0120, 0x080c, 0x5096, 0x0431,
++	0x0030, 0x0421, 0x684c, 0xd0fc, 0x0110, 0x080c, 0x5087, 0x080c,
++	0x50d4, 0xa006, 0x00c8, 0x2001, 0x0028, 0x2009, 0x0000, 0x00a0,
++	0xa082, 0x0006, 0x1240, 0x6100, 0xd1fc, 0x0d20, 0x2001, 0x0029,
++	0x2009, 0x1000, 0x0048, 0x2001, 0x0029, 0x2009, 0x0000, 0x0020,
++	0x2001, 0x0029, 0x2009, 0x0000, 0xa005, 0x0005, 0x0126, 0x2091,
++	0x8000, 0x6050, 0xa00d, 0x0138, 0x2d00, 0x200a, 0x6803, 0x0000,
++	0x6052, 0x012e, 0x0005, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000,
++	0x0cc0, 0x0126, 0x2091, 0x8000, 0x604c, 0xa005, 0x0170, 0x00e6,
++	0x2071, 0xb6e0, 0x7004, 0xa086, 0x0002, 0x0168, 0x00ee, 0x604c,
++	0x6802, 0x2d00, 0x604e, 0x012e, 0x0005, 0x2d00, 0x6052, 0x604e,
++	0x6803, 0x0000, 0x0cc0, 0x701c, 0xac06, 0x1d80, 0x604c, 0x2070,
++	0x7000, 0x6802, 0x2d00, 0x7002, 0x00ee, 0x012e, 0x0005, 0x0126,
++	0x2091, 0x8000, 0x604c, 0xa06d, 0x0130, 0x6800, 0xa005, 0x1108,
++	0x6052, 0x604e, 0xad05, 0x012e, 0x0005, 0x604c, 0xa06d, 0x0130,
++	0x6800, 0xa005, 0x1108, 0x6052, 0x604e, 0xad05, 0x0005, 0x6803,
++	0x0000, 0x6084, 0xa00d, 0x0120, 0x2d00, 0x200a, 0x6086, 0x0005,
++	0x2d00, 0x6086, 0x6082, 0x0cd8, 0x0126, 0x00c6, 0x0026, 0x2091,
++	0x8000, 0x6218, 0x2260, 0x6200, 0xa005, 0x0110, 0xc285, 0x0008,
++	0xc284, 0x6202, 0x002e, 0x00ce, 0x012e, 0x0005, 0x0126, 0x00c6,
++	0x2091, 0x8000, 0x6218, 0x2260, 0x6204, 0x0006, 0xa086, 0x0006,
++	0x1180, 0x609c, 0xd0ac, 0x0168, 0x2001, 0xb453, 0x2004, 0xd0a4,
++	0x0140, 0xa284, 0xff00, 0x8007, 0xa086, 0x0007, 0x1110, 0x2011,
++	0x0600, 0x000e, 0xa294, 0xff00, 0xa215, 0x6206, 0x0006, 0xa086,
++	0x0006, 0x1128, 0x6290, 0x82ff, 0x1110, 0x080c, 0x1511, 0x000e,
++	0x00ce, 0x012e, 0x0005, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6218,
++	0x2260, 0x6204, 0x0006, 0xa086, 0x0006, 0x1178, 0x609c, 0xd0a4,
++	0x0160, 0x2001, 0xb453, 0x2004, 0xd0ac, 0x1138, 0xa284, 0x00ff,
++	0xa086, 0x0007, 0x1110, 0x2011, 0x0006, 0x000e, 0xa294, 0x00ff,
++	0x8007, 0xa215, 0x6206, 0x00ce, 0x012e, 0x0005, 0x0026, 0xa182,
++	0x00ff, 0x0218, 0xa085, 0x0001, 0x00b0, 0xa190, 0xb535, 0x2204,
++	0xa065, 0x1180, 0x0016, 0x00d6, 0x080c, 0x15db, 0x2d60, 0x00de,
++	0x001e, 0x0d80, 0x2c00, 0x2012, 0x60a7, 0x0000, 0x60ab, 0x0000,
++	0x080c, 0x4bc5, 0xa006, 0x002e, 0x0005, 0x0126, 0x2091, 0x8000,
++	0x0026, 0xa182, 0x00ff, 0x0218, 0xa085, 0x0001, 0x0480, 0x00d6,
++	0xa190, 0xb535, 0x2204, 0xa06d, 0x0540, 0x2013, 0x0000, 0x00d6,
++	0x00c6, 0x2d60, 0x60a4, 0xa06d, 0x0110, 0x080c, 0x160b, 0x60a8,
++	0xa06d, 0x0110, 0x080c, 0x160b, 0x00ce, 0x00de, 0x00d6, 0x00c6,
++	0x68ac, 0x2060, 0x8cff, 0x0168, 0x600c, 0x0006, 0x6010, 0x2068,
++	0x080c, 0x9beb, 0x0110, 0x080c, 0x161b, 0x080c, 0x85c0, 0x00ce,
++	0x0c88, 0x00ce, 0x00de, 0x080c, 0x160b, 0x00de, 0xa006, 0x002e,
++	0x012e, 0x0005, 0x0016, 0xa182, 0x00ff, 0x0218, 0xa085, 0x0001,
++	0x0030, 0xa188, 0xb535, 0x2104, 0xa065, 0x0dc0, 0xa006, 0x001e,
++	0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, 0x600b, 0x0000, 0x600f,
++	0x0000, 0x6000, 0xc08c, 0x6002, 0x080c, 0x5a90, 0x1558, 0x60a0,
++	0xa086, 0x007e, 0x2069, 0xba90, 0x0130, 0x2001, 0xb435, 0x2004,
++	0xd0ac, 0x1500, 0x0098, 0x2d04, 0xd0e4, 0x01e0, 0x00d6, 0x2069,
++	0xba8e, 0x00c6, 0x2061, 0xb6b2, 0x6810, 0x2062, 0x6814, 0x6006,
++	0x6818, 0x600a, 0x681c, 0x600e, 0x00ce, 0x00de, 0x8d69, 0x2d04,
++	0x2069, 0x0140, 0xa005, 0x1110, 0x2001, 0x0001, 0x6886, 0x2069,
++	0xb400, 0x68a6, 0x2069, 0xba8e, 0x6808, 0x605e, 0x6810, 0x6062,
++	0x6138, 0xa10a, 0x0208, 0x603a, 0x6814, 0x6066, 0x2099, 0xba96,
++	0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2099, 0xba9a,
++	0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2069, 0xbaae,
++	0x6808, 0x606a, 0x690c, 0x616e, 0x6810, 0x6072, 0x6818, 0x6076,
++	0x60a0, 0xa086, 0x007e, 0x1120, 0x2069, 0xba8e, 0x690c, 0x616e,
++	0xa182, 0x0211, 0x1218, 0x2009, 0x0008, 0x0400, 0xa182, 0x0259,
++	0x1218, 0x2009, 0x0007, 0x00d0, 0xa182, 0x02c1, 0x1218, 0x2009,
++	0x0006, 0x00a0, 0xa182, 0x0349, 0x1218, 0x2009, 0x0005, 0x0070,
++	0xa182, 0x0421, 0x1218, 0x2009, 0x0004, 0x0040, 0xa182, 0x0581,
++	0x1218, 0x2009, 0x0003, 0x0010, 0x2009, 0x0002, 0x6192, 0x014e,
++	0x013e, 0x015e, 0x00de, 0x0005, 0x0016, 0x0026, 0x00e6, 0x2071,
++	0xba8d, 0x2e04, 0x6896, 0x2071, 0xba8e, 0x7004, 0x689a, 0x701c,
++	0x689e, 0x6a00, 0x2009, 0xb472, 0x210c, 0xd0bc, 0x0120, 0xd1ec,
++	0x0110, 0xc2ad, 0x0008, 0xc2ac, 0xd0c4, 0x0120, 0xd1e4, 0x0110,
++	0xc2bd, 0x0008, 0xc2bc, 0x6a02, 0x00ee, 0x002e, 0x001e, 0x0005,
++	0x00d6, 0x0126, 0x2091, 0x8000, 0x60a4, 0xa06d, 0x01c0, 0x6900,
++	0x81ff, 0x1540, 0x6a04, 0xa282, 0x0010, 0x1648, 0xad88, 0x0004,
++	0x20a9, 0x0010, 0x2104, 0xa086, 0xffff, 0x0128, 0x8108, 0x1f04,
++	0x5042, 0x080c, 0x1511, 0x260a, 0x8210, 0x6a06, 0x0098, 0x080c,
++	0x15f4, 0x01a8, 0x2d00, 0x60a6, 0x6803, 0x0000, 0xad88, 0x0004,
++	0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x1f04, 0x505a, 0x6807,
++	0x0001, 0x6e12, 0xa085, 0x0001, 0x012e, 0x00de, 0x0005, 0xa006,
++	0x0cd8, 0x0126, 0x2091, 0x8000, 0x00d6, 0x60a4, 0xa00d, 0x01a0,
++	0x2168, 0x6800, 0xa005, 0x1160, 0x080c, 0x5195, 0x1168, 0x200b,
++	0xffff, 0x6804, 0xa08a, 0x0002, 0x0218, 0x8001, 0x6806, 0x0020,
++	0x080c, 0x160b, 0x60a7, 0x0000, 0x00de, 0x012e, 0x0005, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x51f3, 0x0010, 0x080c, 0x4e4e, 0x080c,
++	0x510d, 0x1dd8, 0x080c, 0x50d4, 0x012e, 0x0005, 0x00d6, 0x0126,
++	0x2091, 0x8000, 0x60a8, 0xa06d, 0x01c0, 0x6950, 0x81ff, 0x1540,
++	0x6a54, 0xa282, 0x0010, 0x1670, 0xad88, 0x0018, 0x20a9, 0x0010,
++	0x2104, 0xa086, 0xffff, 0x0128, 0x8108, 0x1f04, 0x50a8, 0x080c,
++	0x1511, 0x260a, 0x8210, 0x6a56, 0x0098, 0x080c, 0x15f4, 0x01d0,
++	0x2d00, 0x60aa, 0x6853, 0x0000, 0xad88, 0x0018, 0x20a9, 0x0010,
++	0x200b, 0xffff, 0x8108, 0x1f04, 0x50c0, 0x6857, 0x0001, 0x6e62,
++	0x0010, 0x080c, 0x4e9f, 0x0089, 0x1de0, 0xa085, 0x0001, 0x012e,
++	0x00de, 0x0005, 0xa006, 0x0cd8, 0x0126, 0x2091, 0x8000, 0x080c,
++	0x6c6f, 0x012e, 0x0005, 0xa01e, 0x0010, 0x2019, 0x0001, 0xa00e,
++	0x0126, 0x2091, 0x8000, 0x604c, 0x2068, 0x6000, 0xd0dc, 0x1170,
++	0x8dff, 0x01f8, 0x83ff, 0x0120, 0x6848, 0xa606, 0x0158, 0x0030,
++	0x683c, 0xa406, 0x1118, 0x6840, 0xa506, 0x0120, 0x2d08, 0x6800,
++	0x2068, 0x0c70, 0x080c, 0x80c8, 0x6a00, 0x604c, 0xad06, 0x1110,
++	0x624e, 0x0018, 0xa180, 0x0000, 0x2202, 0x82ff, 0x1110, 0x6152,
++	0x8dff, 0x012e, 0x0005, 0xa01e, 0x0010, 0x2019, 0x0001, 0xa00e,
++	0x6080, 0x2068, 0x8dff, 0x01e8, 0x83ff, 0x0120, 0x6848, 0xa606,
++	0x0158, 0x0030, 0x683c, 0xa406, 0x1118, 0x6840, 0xa506, 0x0120,
++	0x2d08, 0x6800, 0x2068, 0x0c70, 0x6a00, 0x6080, 0xad06, 0x1110,
++	0x6282, 0x0018, 0xa180, 0x0000, 0x2202, 0x82ff, 0x1110, 0x6186,
++	0x8dff, 0x0005, 0xa016, 0x080c, 0x518f, 0x1110, 0x2011, 0x0001,
++	0x080c, 0x51da, 0x1110, 0xa295, 0x0002, 0x0005, 0x080c, 0x520b,
++	0x0118, 0x080c, 0x9ca0, 0x0010, 0xa085, 0x0001, 0x0005, 0x080c,
++	0x520b, 0x0118, 0x080c, 0x9c30, 0x0010, 0xa085, 0x0001, 0x0005,
++	0x080c, 0x520b, 0x0118, 0x080c, 0x9c83, 0x0010, 0xa085, 0x0001,
++	0x0005, 0x080c, 0x520b, 0x0118, 0x080c, 0x9c4c, 0x0010, 0xa085,
++	0x0001, 0x0005, 0x080c, 0x520b, 0x0118, 0x080c, 0x9cbc, 0x0010,
++	0xa085, 0x0001, 0x0005, 0x0126, 0x0006, 0x00d6, 0x2091, 0x8000,
++	0x6080, 0xa06d, 0x01a0, 0x6800, 0x0006, 0x6837, 0x0103, 0x6b4a,
++	0x6847, 0x0000, 0x080c, 0x9e5d, 0x0006, 0x6000, 0xd0fc, 0x0110,
++	0x080c, 0xb30c, 0x000e, 0x080c, 0x53c9, 0x000e, 0x0c50, 0x6083,
++	0x0000, 0x6087, 0x0000, 0x00de, 0x000e, 0x012e, 0x0005, 0x60a4,
++	0xa00d, 0x1118, 0xa085, 0x0001, 0x0005, 0x00e6, 0x2170, 0x7000,
++	0xa005, 0x1168, 0x20a9, 0x0010, 0xae88, 0x0004, 0x2104, 0xa606,
++	0x0130, 0x8108, 0x1f04, 0x519e, 0xa085, 0x0001, 0x0008, 0xa006,
++	0x00ee, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x60a4, 0xa06d,
++	0x1128, 0x080c, 0x15f4, 0x01a0, 0x2d00, 0x60a6, 0x6803, 0x0001,
++	0x6807, 0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff,
++	0x8108, 0x1f04, 0x51be, 0xa085, 0x0001, 0x012e, 0x00de, 0x0005,
++	0xa006, 0x0cd8, 0x00d6, 0x0126, 0x2091, 0x8000, 0x60a4, 0xa06d,
++	0x0130, 0x60a7, 0x0000, 0x080c, 0x160b, 0xa085, 0x0001, 0x012e,
++	0x00de, 0x0005, 0x60a8, 0xa00d, 0x1118, 0xa085, 0x0001, 0x0005,
++	0x00e6, 0x2170, 0x7050, 0xa005, 0x1160, 0x20a9, 0x0010, 0xae88,
++	0x0018, 0x2104, 0xa606, 0x0128, 0x8108, 0x1f04, 0x51e9, 0xa085,
++	0x0001, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x0c19, 0x1188,
++	0x200b, 0xffff, 0x00d6, 0x60a8, 0x2068, 0x6854, 0xa08a, 0x0002,
++	0x0218, 0x8001, 0x6856, 0x0020, 0x080c, 0x160b, 0x60ab, 0x0000,
++	0x00de, 0x012e, 0x0005, 0x609c, 0xd0a4, 0x0005, 0x00f6, 0x080c,
++	0x5a90, 0x01b0, 0x71b8, 0x81ff, 0x1198, 0x71d4, 0xd19c, 0x0180,
++	0x2001, 0x007e, 0xa080, 0xb535, 0x2004, 0xa07d, 0x0148, 0x7804,
++	0xa084, 0x00ff, 0xa086, 0x0006, 0x1118, 0x7800, 0xc0ed, 0x7802,
++	0x2079, 0xb452, 0x7804, 0xd0a4, 0x01e8, 0x0156, 0x00c6, 0x20a9,
++	0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x4f6a, 0x1168, 0x6004,
++	0xa084, 0xff00, 0x8007, 0xa096, 0x0004, 0x0118, 0xa086, 0x0006,
++	0x1118, 0x6000, 0xc0ed, 0x6002, 0x001e, 0x8108, 0x1f04, 0x5233,
++	0x00ce, 0x015e, 0x080c, 0x52ca, 0x0120, 0x2001, 0xb6b5, 0x200c,
++	0x0038, 0x2079, 0xb452, 0x7804, 0xd0a4, 0x0130, 0x2009, 0x07d0,
++	0x2011, 0x525e, 0x080c, 0x69e7, 0x00fe, 0x0005, 0x2011, 0x525e,
++	0x080c, 0x6961, 0x080c, 0x52ca, 0x01f0, 0x2001, 0xb5b3, 0x2004,
++	0xa080, 0x0000, 0x200c, 0xc1ec, 0x2102, 0x2001, 0xb453, 0x2004,
++	0xd0a4, 0x0130, 0x2009, 0x07d0, 0x2011, 0x525e, 0x080c, 0x69e7,
++	0x00e6, 0x2071, 0xb400, 0x7073, 0x0000, 0x7077, 0x0000, 0x080c,
++	0x2a7e, 0x00ee, 0x04b0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x2009,
++	0x0000, 0x0016, 0x080c, 0x4f6a, 0x1530, 0x6000, 0xd0ec, 0x0518,
++	0x0046, 0x62a0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0x0029,
++	0x080c, 0xb06b, 0x6000, 0xc0e5, 0xc0ec, 0x6002, 0x6004, 0xa084,
++	0x00ff, 0xa085, 0x0700, 0x6006, 0x2019, 0x0029, 0x080c, 0x6dba,
++	0x0076, 0x2039, 0x0000, 0x080c, 0x6cc7, 0x2009, 0x0000, 0x080c,
++	0xae05, 0x007e, 0x004e, 0x001e, 0x8108, 0x1f04, 0x5289, 0x00ce,
++	0x015e, 0x0005, 0x00c6, 0x6018, 0x2060, 0x6000, 0xc0ec, 0x6002,
++	0x00ce, 0x0005, 0x7818, 0x2004, 0xd0ac, 0x0005, 0x7818, 0x2004,
++	0xd0bc, 0x0005, 0x00f6, 0x2001, 0xb5b3, 0x2004, 0xa07d, 0x0110,
++	0x7800, 0xd0ec, 0x00fe, 0x0005, 0x0126, 0x0026, 0x2091, 0x8000,
++	0x0006, 0x62a0, 0xa290, 0xb535, 0x2204, 0xac06, 0x190c, 0x1511,
++	0x000e, 0x6200, 0xa005, 0x0110, 0xc2fd, 0x0008, 0xc2fc, 0x6202,
++	0x002e, 0x012e, 0x0005, 0x2011, 0xb435, 0x2204, 0xd0cc, 0x0138,
++	0x2001, 0xb6b3, 0x200c, 0x2011, 0x52f8, 0x080c, 0x69e7, 0x0005,
++	0x2011, 0x52f8, 0x080c, 0x6961, 0x2011, 0xb435, 0x2204, 0xc0cc,
++	0x2012, 0x0005, 0x2071, 0xb514, 0x7003, 0x0001, 0x7007, 0x0000,
++	0x7013, 0x0000, 0x7017, 0x0000, 0x701b, 0x0000, 0x701f, 0x0000,
++	0x700b, 0x0000, 0x704b, 0x0001, 0x704f, 0x0000, 0x705b, 0x0020,
++	0x705f, 0x0040, 0x707f, 0x0000, 0x2071, 0xb67d, 0x7003, 0xb514,
++	0x7007, 0x0000, 0x700b, 0x0000, 0x700f, 0xb65d, 0x7013, 0x0020,
++	0x7017, 0x0040, 0x7037, 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071,
++	0xb635, 0xa00e, 0x7186, 0x718a, 0x7097, 0x0001, 0x2001, 0xb453,
++	0x2004, 0xd0fc, 0x1150, 0x2001, 0xb453, 0x2004, 0xa00e, 0xd09c,
++	0x0108, 0x8108, 0x7102, 0x0804, 0x5393, 0x2001, 0xb472, 0x200c,
++	0xa184, 0x000f, 0x2009, 0xb473, 0x210c, 0x0002, 0x533b, 0x536e,
++	0x5375, 0x537f, 0x5384, 0x533b, 0x533b, 0x533b, 0x535e, 0x533b,
++	0x533b, 0x533b, 0x533b, 0x533b, 0x533b, 0x533b, 0x7003, 0x0004,
++	0x0136, 0x0146, 0x0156, 0x2099, 0xb476, 0x20a1, 0xb686, 0x20a9,
++	0x0004, 0x53a3, 0x015e, 0x014e, 0x013e, 0x0428, 0x708f, 0x0005,
++	0x7007, 0x0122, 0x2001, 0x0002, 0x0030, 0x708f, 0x0002, 0x7007,
++	0x0121, 0x2001, 0x0003, 0x7002, 0x7097, 0x0001, 0x0088, 0x7007,
++	0x0122, 0x2001, 0x0002, 0x0020, 0x7007, 0x0121, 0x2001, 0x0003,
++	0x7002, 0xa006, 0x7096, 0x708e, 0xa184, 0xff00, 0x8007, 0x709a,
++	0xa184, 0x00ff, 0x7092, 0x00ee, 0x001e, 0x0005, 0x00e6, 0x2071,
++	0xb514, 0x684c, 0xa005, 0x1130, 0x7028, 0xc085, 0x702a, 0xa085,
++	0x0001, 0x0428, 0x6a60, 0x7236, 0x6b64, 0x733a, 0x6868, 0x703e,
++	0x7076, 0x686c, 0x7042, 0x707a, 0x684c, 0x702e, 0x6844, 0x7032,
++	0x2009, 0x000d, 0x200a, 0x700b, 0x0000, 0x8007, 0x8006, 0x8006,
++	0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, 0x726e,
++	0x7372, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0xa006, 0x00ee,
++	0x0005, 0x0156, 0x00e6, 0x0026, 0x6838, 0xd0fc, 0x1904, 0x5422,
++	0x6804, 0xa00d, 0x0188, 0x00d6, 0x2071, 0xb400, 0xa016, 0x702c,
++	0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e,
++	0x70b4, 0xa200, 0x70b6, 0x00de, 0x2071, 0xb514, 0x701c, 0xa005,
++	0x1904, 0x5432, 0x20a9, 0x0032, 0x0f04, 0x5430, 0x0e04, 0x53ec,
++	0x2071, 0xb635, 0x7200, 0x82ff, 0x05d8, 0x6934, 0xa186, 0x0103,
++	0x1904, 0x5440, 0x6948, 0x6844, 0xa105, 0x1540, 0x2009, 0x8020,
++	0x2200, 0x0002, 0x5430, 0x5407, 0x5458, 0x5464, 0x5430, 0x2071,
++	0x0000, 0x20a9, 0x0032, 0x0f04, 0x5430, 0x7018, 0xd084, 0x1dd8,
++	0x7122, 0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091,
++	0x4080, 0x2071, 0xb400, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70b4,
++	0x8000, 0x70b6, 0x002e, 0x00ee, 0x015e, 0x0005, 0x6844, 0xa086,
++	0x0100, 0x1130, 0x6868, 0xa005, 0x1118, 0x2009, 0x8020, 0x0880,
++	0x2071, 0xb514, 0x2d08, 0x206b, 0x0000, 0x7010, 0x8000, 0x7012,
++	0x7018, 0xa06d, 0x711a, 0x0110, 0x6902, 0x0008, 0x711e, 0x0c10,
++	0xa18c, 0x00ff, 0xa186, 0x0017, 0x0130, 0xa186, 0x001e, 0x0118,
++	0xa18e, 0x001f, 0x1d28, 0x684c, 0xd0cc, 0x0d10, 0x6850, 0xa084,
++	0x00ff, 0xa086, 0x0001, 0x19e0, 0x2009, 0x8021, 0x0804, 0x5400,
++	0x7084, 0x8008, 0xa092, 0x001e, 0x1a98, 0x7186, 0xae90, 0x0003,
++	0xa210, 0x683c, 0x2012, 0x0078, 0x7084, 0x8008, 0xa092, 0x000f,
++	0x1a38, 0x7186, 0xae90, 0x0003, 0x8003, 0xa210, 0x683c, 0x2012,
++	0x8210, 0x6840, 0x2012, 0x7088, 0xa10a, 0x0a04, 0x5419, 0x718c,
++	0x7084, 0xa10a, 0x0a04, 0x5419, 0x2071, 0x0000, 0x7018, 0xd084,
++	0x1904, 0x5419, 0x2071, 0xb635, 0x7000, 0xa086, 0x0002, 0x1150,
++	0x080c, 0x56e3, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080,
++	0x0804, 0x5419, 0x080c, 0x570d, 0x2071, 0x0000, 0x701b, 0x0001,
++	0x2091, 0x4080, 0x0804, 0x5419, 0x0006, 0x684c, 0x0006, 0x6837,
++	0x0103, 0x20a9, 0x001c, 0xad80, 0x0011, 0x20a0, 0x2001, 0x0000,
++	0x40a4, 0x000e, 0xa084, 0x00ff, 0x684e, 0x000e, 0x684a, 0x6952,
++	0x0005, 0x2071, 0xb514, 0x7004, 0x0002, 0x54bf, 0x54d0, 0x56ce,
++	0x56cf, 0x56dc, 0x56e2, 0x54c0, 0x56bf, 0x5655, 0x56ab, 0x0005,
++	0x0126, 0x2091, 0x8000, 0x0e04, 0x54cf, 0x2009, 0x000d, 0x7030,
++	0x200a, 0x2091, 0x4080, 0x7007, 0x0001, 0x700b, 0x0000, 0x012e,
++	0x2069, 0xb6f3, 0x683c, 0xa005, 0x03f8, 0x11f0, 0x0126, 0x2091,
++	0x8000, 0x2069, 0x0000, 0x6934, 0x2001, 0xb520, 0x2004, 0xa10a,
++	0x0170, 0x0e04, 0x54f3, 0x2069, 0x0000, 0x6818, 0xd084, 0x1158,
++	0x2009, 0x8040, 0x6922, 0x681b, 0x0001, 0x2091, 0x4080, 0x2069,
++	0xb6f3, 0x683f, 0xffff, 0x012e, 0x2069, 0xb400, 0x6848, 0x6968,
++	0xa102, 0x2069, 0xb635, 0x688a, 0x6984, 0x701c, 0xa06d, 0x0120,
++	0x81ff, 0x0904, 0x5549, 0x00a0, 0x81ff, 0x0904, 0x560f, 0x2071,
++	0xb635, 0x7184, 0x7088, 0xa10a, 0x1258, 0x7190, 0x2071, 0xb6f3,
++	0x7038, 0xa005, 0x0128, 0x1b04, 0x560f, 0x713a, 0x0804, 0x560f,
++	0x2071, 0xb635, 0x718c, 0x0126, 0x2091, 0x8000, 0x7084, 0xa10a,
++	0x0a04, 0x562a, 0x0e04, 0x55cb, 0x2071, 0x0000, 0x7018, 0xd084,
++	0x1904, 0x55cb, 0x2001, 0xffff, 0x2071, 0xb6f3, 0x703a, 0x2071,
++	0xb635, 0x7000, 0xa086, 0x0002, 0x1150, 0x080c, 0x56e3, 0x2071,
++	0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0804, 0x55cb, 0x080c,
++	0x570d, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0804,
++	0x55cb, 0x2071, 0xb635, 0x7000, 0xa005, 0x0904, 0x55f1, 0x6934,
++	0xa186, 0x0103, 0x1904, 0x55ce, 0x684c, 0xd0bc, 0x1904, 0x55f1,
++	0x6948, 0x6844, 0xa105, 0x1904, 0x55e6, 0x2009, 0x8020, 0x2071,
++	0xb635, 0x7000, 0x0002, 0x55f1, 0x55b1, 0x5589, 0x559b, 0x5568,
++	0x0136, 0x0146, 0x0156, 0x2099, 0xb476, 0x20a1, 0xb686, 0x20a9,
++	0x0004, 0x53a3, 0x015e, 0x014e, 0x013e, 0x2071, 0xb67d, 0xad80,
++	0x000f, 0x700e, 0x7013, 0x0002, 0x7007, 0x0002, 0x700b, 0x0000,
++	0x2e10, 0x080c, 0x163f, 0x2071, 0xb514, 0x7007, 0x0009, 0x0804,
++	0x560f, 0x7084, 0x8008, 0xa092, 0x001e, 0x1a04, 0x560f, 0xae90,
++	0x0003, 0xa210, 0x683c, 0x2012, 0x7186, 0x2071, 0xb514, 0x080c,
++	0x5764, 0x0804, 0x560f, 0x7084, 0x8008, 0xa092, 0x000f, 0x1a04,
++	0x560f, 0xae90, 0x0003, 0x8003, 0xa210, 0x683c, 0x2012, 0x8210,
++	0x6840, 0x2012, 0x7186, 0x2071, 0xb514, 0x080c, 0x5764, 0x0804,
++	0x560f, 0x0126, 0x2091, 0x8000, 0x0e04, 0x55cb, 0x2071, 0x0000,
++	0x7018, 0xd084, 0x1180, 0x7122, 0x683c, 0x7026, 0x6840, 0x702a,
++	0x701b, 0x0001, 0x2091, 0x4080, 0x012e, 0x2071, 0xb514, 0x080c,
++	0x5764, 0x0804, 0x560f, 0x012e, 0x0804, 0x560f, 0xa18c, 0x00ff,
++	0xa186, 0x0017, 0x0130, 0xa186, 0x001e, 0x0118, 0xa18e, 0x001f,
++	0x11c0, 0x684c, 0xd0cc, 0x01a8, 0x6850, 0xa084, 0x00ff, 0xa086,
++	0x0001, 0x1178, 0x2009, 0x8021, 0x0804, 0x555f, 0x6844, 0xa086,
++	0x0100, 0x1138, 0x6868, 0xa005, 0x1120, 0x2009, 0x8020, 0x0804,
++	0x555f, 0x2071, 0xb514, 0x080c, 0x5776, 0x01c8, 0x2071, 0xb514,
++	0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, 0x0003, 0x1130,
++	0x810f, 0xa18c, 0x00ff, 0x8101, 0x0108, 0x710e, 0x7007, 0x0003,
++	0x080c, 0x578f, 0x7050, 0xa086, 0x0100, 0x0904, 0x56cf, 0x0126,
++	0x2091, 0x8000, 0x2071, 0xb514, 0x7008, 0xa086, 0x0001, 0x1180,
++	0x0e04, 0x5628, 0x2009, 0x000d, 0x7030, 0x200a, 0x2091, 0x4080,
++	0x700b, 0x0000, 0x7004, 0xa086, 0x0006, 0x1110, 0x7007, 0x0001,
++	0x012e, 0x0005, 0x2071, 0xb514, 0x080c, 0x5776, 0x0518, 0x2071,
++	0xb635, 0x7084, 0x700a, 0x20a9, 0x0020, 0x2099, 0xb636, 0x20a1,
++	0xb65d, 0x53a3, 0x7087, 0x0000, 0x2071, 0xb514, 0x2069, 0xb67d,
++	0x706c, 0x6826, 0x7070, 0x682a, 0x7074, 0x682e, 0x7078, 0x6832,
++	0x2d10, 0x080c, 0x163f, 0x7007, 0x0008, 0x2001, 0xffff, 0x2071,
++	0xb6f3, 0x703a, 0x012e, 0x0804, 0x560f, 0x2069, 0xb67d, 0x6808,
++	0xa08e, 0x0000, 0x0904, 0x56aa, 0xa08e, 0x0200, 0x0904, 0x56a8,
++	0xa08e, 0x0100, 0x1904, 0x56aa, 0x0126, 0x2091, 0x8000, 0x0e04,
++	0x56a6, 0x2069, 0x0000, 0x6818, 0xd084, 0x15c0, 0x702c, 0x7130,
++	0x8108, 0xa102, 0x0230, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072,
++	0x0048, 0x706c, 0xa080, 0x0040, 0x706e, 0x1220, 0x7070, 0xa081,
++	0x0000, 0x7072, 0x7132, 0x6936, 0x700b, 0x0000, 0x2001, 0xb65a,
++	0x2004, 0xa005, 0x1190, 0x6934, 0x2069, 0xb635, 0x689c, 0x699e,
++	0x2069, 0xb6f3, 0xa102, 0x1118, 0x683c, 0xa005, 0x1368, 0x2001,
++	0xb65b, 0x200c, 0x810d, 0x693e, 0x0038, 0x2009, 0x8040, 0x6922,
++	0x681b, 0x0001, 0x2091, 0x4080, 0x7007, 0x0001, 0x012e, 0x0010,
++	0x7007, 0x0005, 0x0005, 0x2001, 0xb67f, 0x2004, 0xa08e, 0x0100,
++	0x1128, 0x7007, 0x0001, 0x080c, 0x5764, 0x0005, 0xa08e, 0x0000,
++	0x0de0, 0xa08e, 0x0200, 0x1dc8, 0x7007, 0x0005, 0x0005, 0x701c,
++	0xa06d, 0x0158, 0x080c, 0x5776, 0x0140, 0x7007, 0x0003, 0x080c,
++	0x578f, 0x7050, 0xa086, 0x0100, 0x0110, 0x0005, 0x0005, 0x7050,
++	0xa09e, 0x0100, 0x1118, 0x7007, 0x0004, 0x0030, 0xa086, 0x0200,
++	0x1110, 0x7007, 0x0005, 0x0005, 0x080c, 0x5732, 0x7006, 0x080c,
++	0x5764, 0x0005, 0x0005, 0x00e6, 0x0156, 0x2071, 0xb635, 0x7184,
++	0x81ff, 0x0500, 0xa006, 0x7086, 0xae80, 0x0003, 0x2071, 0x0000,
++	0x21a8, 0x2014, 0x7226, 0x8000, 0x0f04, 0x5707, 0x2014, 0x722a,
++	0x8000, 0x0f04, 0x5707, 0x2014, 0x722e, 0x8000, 0x0f04, 0x5707,
++	0x2014, 0x723a, 0x8000, 0x0f04, 0x5707, 0x2014, 0x723e, 0xa180,
++	0x8030, 0x7022, 0x015e, 0x00ee, 0x0005, 0x00e6, 0x0156, 0x2071,
++	0xb635, 0x7184, 0x81ff, 0x01d8, 0xa006, 0x7086, 0xae80, 0x0003,
++	0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, 0x2014, 0x722a,
++	0x8000, 0x0f04, 0x5729, 0x2014, 0x723a, 0x8000, 0x2014, 0x723e,
++	0x0018, 0x2001, 0x8020, 0x0010, 0x2001, 0x8042, 0x7022, 0x015e,
++	0x00ee, 0x0005, 0x702c, 0x7130, 0x8108, 0xa102, 0x0230, 0xa00e,
++	0x7034, 0x706e, 0x7038, 0x7072, 0x0048, 0x706c, 0xa080, 0x0040,
++	0x706e, 0x1220, 0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x700c,
++	0x8001, 0x700e, 0x1180, 0x0126, 0x2091, 0x8000, 0x0e04, 0x575e,
++	0x2001, 0x000d, 0x2102, 0x2091, 0x4080, 0x2001, 0x0001, 0x700b,
++	0x0000, 0x012e, 0x0005, 0x2001, 0x0007, 0x0005, 0x2001, 0x0006,
++	0x700b, 0x0001, 0x012e, 0x0005, 0x701c, 0xa06d, 0x0170, 0x0126,
++	0x2091, 0x8000, 0x7010, 0x8001, 0x7012, 0x2d04, 0x701e, 0xa005,
++	0x1108, 0x701a, 0x012e, 0x080c, 0x160b, 0x0005, 0x2019, 0x000d,
++	0x2304, 0x230c, 0xa10e, 0x0130, 0x2304, 0x230c, 0xa10e, 0x0110,
++	0xa006, 0x0060, 0x732c, 0x8319, 0x7130, 0xa102, 0x1118, 0x2300,
++	0xa005, 0x0020, 0x0210, 0xa302, 0x0008, 0x8002, 0x0005, 0x2d00,
++	0x7026, 0xa080, 0x000d, 0x7056, 0x7053, 0x0000, 0x0126, 0x2091,
++	0x8000, 0x2009, 0xb712, 0x2104, 0xc08d, 0x200a, 0x012e, 0x080c,
++	0x1657, 0x0005, 0x708c, 0xa08a, 0x0029, 0x1220, 0xa082, 0x001d,
++	0x0033, 0x0010, 0x080c, 0x1511, 0x6027, 0x1e00, 0x0005, 0x589d,
++	0x5818, 0x5830, 0x586d, 0x588e, 0x58c8, 0x58da, 0x5830, 0x58b4,
++	0x57bc, 0x57ea, 0x57bb, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804,
++	0xa005, 0x1180, 0x6808, 0xa005, 0x1518, 0x708f, 0x0028, 0x2069,
++	0xb6c5, 0x2d04, 0x7002, 0x080c, 0x5b92, 0x6028, 0xa085, 0x0600,
++	0x602a, 0x00b0, 0x708f, 0x0028, 0x2069, 0xb6c5, 0x2d04, 0x7002,
++	0x6028, 0xa085, 0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056,
++	0x2071, 0xb723, 0x080c, 0x1dcd, 0x005e, 0x004e, 0x003e, 0x00ee,
++	0x00de, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, 0xa005, 0x1180,
++	0x6808, 0xa005, 0x1518, 0x708f, 0x0028, 0x2069, 0xb6c5, 0x2d04,
++	0x7002, 0x080c, 0x5c1f, 0x6028, 0xa085, 0x0600, 0x602a, 0x00b0,
++	0x708f, 0x0028, 0x2069, 0xb6c5, 0x2d04, 0x7002, 0x6028, 0xa085,
++	0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0xb723,
++	0x080c, 0x1dcd, 0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005,
++	0x6803, 0x0090, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x5945, 0xd1d4,
++	0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x708f, 0x0020, 0x080c,
++	0x5945, 0x0028, 0x708f, 0x001d, 0x0010, 0x708f, 0x001f, 0x0005,
++	0x6803, 0x0088, 0x6124, 0xd1cc, 0x1590, 0xd1dc, 0x1568, 0xd1e4,
++	0x1540, 0xa184, 0x1e00, 0x1580, 0x60e3, 0x0001, 0x600c, 0xc0b4,
++	0x600e, 0x080c, 0x5ac0, 0x080c, 0x2479, 0x0156, 0x6803, 0x0100,
++	0x20a9, 0x0014, 0x6804, 0xd0dc, 0x1118, 0x1f04, 0x584a, 0x0048,
++	0x20a9, 0x0014, 0x6803, 0x0080, 0x6804, 0xd0d4, 0x1130, 0x1f04,
++	0x5854, 0x080c, 0x5ae1, 0x015e, 0x0078, 0x015e, 0x708f, 0x0028,
++	0x0058, 0x708f, 0x001e, 0x0040, 0x708f, 0x001d, 0x0028, 0x708f,
++	0x0020, 0x0010, 0x708f, 0x001f, 0x0005, 0x60e3, 0x0001, 0x600c,
++	0xc0b4, 0x600e, 0x080c, 0x5ac0, 0x080c, 0x2479, 0x6803, 0x0080,
++	0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158, 0xd1e4, 0x1130, 0xa184,
++	0x1e00, 0x1158, 0x708f, 0x0028, 0x0040, 0x708f, 0x001e, 0x0028,
++	0x708f, 0x001d, 0x0010, 0x708f, 0x001f, 0x0005, 0x6803, 0x00a0,
++	0x6124, 0xd1dc, 0x1138, 0xd1e4, 0x0138, 0x080c, 0x1e18, 0x708f,
++	0x001e, 0x0010, 0x708f, 0x001d, 0x0005, 0x080c, 0x59b7, 0x6124,
++	0xd1dc, 0x1188, 0x080c, 0x5945, 0x0016, 0x080c, 0x1e18, 0x001e,
++	0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x708f, 0x001e, 0x0020, 0x708f,
++	0x001f, 0x080c, 0x5945, 0x0005, 0x6803, 0x00a0, 0x6124, 0xd1d4,
++	0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x708f,
++	0x001e, 0x0028, 0x708f, 0x001d, 0x0010, 0x708f, 0x0021, 0x0005,
++	0x080c, 0x59b7, 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128, 0xd1e4,
++	0x0140, 0x708f, 0x001e, 0x0028, 0x708f, 0x001d, 0x0010, 0x708f,
++	0x001f, 0x0005, 0x6803, 0x0090, 0x6124, 0xd1d4, 0x1178, 0xd1cc,
++	0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0158, 0x708f, 0x001e, 0x0040,
++	0x708f, 0x001d, 0x0028, 0x708f, 0x0020, 0x0010, 0x708f, 0x001f,
++	0x0005, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x0126, 0x2061, 0x0100,
++	0x2069, 0x0140, 0x2071, 0xb400, 0x2091, 0x8000, 0x080c, 0x5a90,
++	0x11e8, 0x2001, 0xb40c, 0x200c, 0xd1b4, 0x01c0, 0xc1b4, 0x2102,
++	0x6027, 0x0200, 0xe000, 0xe000, 0x6024, 0xd0cc, 0x0158, 0x6803,
++	0x00a0, 0x2001, 0xb69f, 0x2003, 0x0001, 0x2001, 0xb400, 0x2003,
++	0x0001, 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x5aac,
++	0x0150, 0x080c, 0x5aa2, 0x1138, 0x2001, 0x0001, 0x080c, 0x2789,
++	0x080c, 0x5a67, 0x00a0, 0x080c, 0x59b4, 0x0178, 0x2001, 0x0001,
++	0x080c, 0x2789, 0x708c, 0xa086, 0x001e, 0x0120, 0x708c, 0xa086,
++	0x0022, 0x1118, 0x708f, 0x0025, 0x0010, 0x708f, 0x0021, 0x012e,
++	0x00ee, 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x5956,
++	0x080c, 0x6a21, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011,
++	0x5956, 0x080c, 0x6a18, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6,
++	0x0016, 0x080c, 0x7d24, 0x2071, 0xb400, 0x080c, 0x58f1, 0x001e,
++	0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6,
++	0x00e6, 0x00f6, 0x0126, 0x080c, 0x7d24, 0x2061, 0x0100, 0x2069,
++	0x0140, 0x2071, 0xb400, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a,
++	0x2011, 0x0003, 0x080c, 0x801f, 0x2011, 0x0002, 0x080c, 0x8029,
++	0x080c, 0x7f03, 0x080c, 0x69d5, 0x0036, 0x2019, 0x0000, 0x080c,
++	0x7f8e, 0x003e, 0x60e3, 0x0000, 0x080c, 0xb3b2, 0x080c, 0xb3cd,
++	0x2001, 0xb400, 0x2003, 0x0004, 0x6027, 0x0008, 0x080c, 0x12d9,
++	0x2001, 0x0001, 0x080c, 0x2789, 0x012e, 0x00fe, 0x00ee, 0x00de,
++	0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x2001, 0xb400, 0x2004,
++	0xa086, 0x0004, 0x0140, 0x2001, 0xb69e, 0x2003, 0xaaaa, 0x2001,
++	0xb69f, 0x2003, 0x0000, 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800,
++	0xa086, 0x00c0, 0x0160, 0x6803, 0x00c0, 0x0156, 0x20a9, 0x002d,
++	0x1d04, 0x59c0, 0x2091, 0x6000, 0x1f04, 0x59c0, 0x015e, 0x0005,
++	0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071,
++	0xb400, 0x2001, 0xb69f, 0x200c, 0xa186, 0x0000, 0x0158, 0xa186,
++	0x0001, 0x0158, 0xa186, 0x0002, 0x0158, 0xa186, 0x0003, 0x0158,
++	0x0804, 0x5a55, 0x708f, 0x0022, 0x0040, 0x708f, 0x0021, 0x0028,
++	0x708f, 0x0023, 0x0020, 0x708f, 0x0024, 0x6043, 0x0000, 0x60e3,
++	0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x2838, 0x0026,
++	0x2011, 0x0003, 0x080c, 0x801f, 0x2011, 0x0002, 0x080c, 0x8029,
++	0x080c, 0x7f03, 0x0036, 0x2019, 0x0000, 0x080c, 0x7f8e, 0x003e,
++	0x002e, 0x7000, 0xa08e, 0x0004, 0x0118, 0x602b, 0x0028, 0x0010,
++	0x602b, 0x0020, 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005,
++	0x6024, 0xd0ac, 0x0120, 0x012e, 0x015e, 0x0804, 0x5a63, 0x6800,
++	0xa084, 0x00a0, 0xc0bd, 0x6802, 0x6904, 0xd1d4, 0x1130, 0x6803,
++	0x0100, 0x1f04, 0x5a18, 0x080c, 0x5ae1, 0x012e, 0x015e, 0x080c,
++	0x5aa2, 0x01a8, 0x6044, 0xa005, 0x0168, 0x6050, 0x0006, 0xa085,
++	0x0020, 0x6052, 0x080c, 0x5ae1, 0xa006, 0x8001, 0x1df0, 0x000e,
++	0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, 0x5ae1, 0x0016,
++	0x0026, 0x2009, 0x00c8, 0x2011, 0x5963, 0x080c, 0x69e7, 0x002e,
++	0x001e, 0x2001, 0xb69f, 0x2003, 0x0004, 0x080c, 0x57a2, 0x080c,
++	0x5aa2, 0x0148, 0x6804, 0xd0d4, 0x1130, 0xd0dc, 0x1100, 0x2001,
++	0xb69f, 0x2003, 0x0000, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6,
++	0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0xb400,
++	0x2001, 0xb69e, 0x2003, 0x0000, 0x2001, 0xb68f, 0x2003, 0x0000,
++	0x708f, 0x0000, 0x60e3, 0x0000, 0x6887, 0x0000, 0x2001, 0x0000,
++	0x080c, 0x2838, 0x6803, 0x0000, 0x6043, 0x0090, 0x6043, 0x0010,
++	0x6027, 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005,
++	0x0006, 0x2001, 0xb69e, 0x2004, 0xa086, 0xaaaa, 0x000e, 0x0005,
++	0x0006, 0x2001, 0xb472, 0x2004, 0xa084, 0x0030, 0xa086, 0x0000,
++	0x000e, 0x0005, 0x0006, 0x2001, 0xb472, 0x2004, 0xa084, 0x0030,
++	0xa086, 0x0030, 0x000e, 0x0005, 0x0006, 0x2001, 0xb472, 0x2004,
++	0xa084, 0x0030, 0xa086, 0x0010, 0x000e, 0x0005, 0x0006, 0x2001,
++	0xb472, 0x2004, 0xa084, 0x0030, 0xa086, 0x0020, 0x000e, 0x0005,
++	0x2001, 0xb40c, 0x2004, 0xd0a4, 0x0170, 0x080c, 0x2858, 0x0036,
++	0x0016, 0x2009, 0x0000, 0x2019, 0x0028, 0x080c, 0x2c33, 0x001e,
++	0x003e, 0xa006, 0x0009, 0x0005, 0x00e6, 0x2071, 0xb40c, 0x2e04,
++	0x0118, 0xa085, 0x0010, 0x0010, 0xa084, 0xffef, 0x2072, 0x00ee,
++	0x0005, 0x6050, 0x0006, 0x60f0, 0x0006, 0x60ec, 0x0006, 0x600c,
++	0x0006, 0x6004, 0x0006, 0x6028, 0x0006, 0x602f, 0x0100, 0x602f,
++	0x0000, 0x602f, 0x0040, 0x602f, 0x0000, 0x000e, 0x602a, 0x000e,
++	0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x000e, 0x60f2, 0x60e3,
++	0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x2838, 0x6800,
++	0xa084, 0x00a0, 0xc0bd, 0x6802, 0x6803, 0x00a0, 0x000e, 0x6052,
++	0x6050, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6,
++	0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0xb400, 0x6020,
++	0xa084, 0x0080, 0x0138, 0x2001, 0xb40c, 0x200c, 0xc1bd, 0x2102,
++	0x0804, 0x5b8a, 0x2001, 0xb40c, 0x200c, 0xc1bc, 0x2102, 0x6028,
++	0xa084, 0xe1ff, 0x602a, 0x6027, 0x0200, 0x6803, 0x0090, 0x20a9,
++	0x0384, 0x6024, 0xd0cc, 0x1508, 0x1d04, 0x5b39, 0x2091, 0x6000,
++	0x1f04, 0x5b39, 0x2011, 0x0003, 0x080c, 0x801f, 0x2011, 0x0002,
++	0x080c, 0x8029, 0x080c, 0x7f03, 0x2019, 0x0000, 0x080c, 0x7f8e,
++	0x6803, 0x00a0, 0x2001, 0xb69f, 0x2003, 0x0001, 0x2001, 0xb400,
++	0x2003, 0x0001, 0xa085, 0x0001, 0x0468, 0x86ff, 0x1110, 0x080c,
++	0x1e18, 0x60e3, 0x0000, 0x2001, 0xb68f, 0x2004, 0x080c, 0x2838,
++	0x60e2, 0x080c, 0x2479, 0x6803, 0x0080, 0x20a9, 0x0384, 0x6027,
++	0x1e00, 0x2009, 0x1e00, 0xe000, 0x6024, 0xa10c, 0x0138, 0x1d04,
++	0x5b6f, 0x2091, 0x6000, 0x1f04, 0x5b6f, 0x0820, 0x6028, 0xa085,
++	0x1e00, 0x602a, 0x70a4, 0xa005, 0x1118, 0x6887, 0x0001, 0x0008,
++	0x6886, 0xa006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e,
++	0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6,
++	0x00e6, 0x2061, 0x0100, 0x2071, 0xb400, 0x2069, 0x0140, 0x6020,
++	0xa084, 0x00c0, 0x0120, 0x6884, 0xa005, 0x1904, 0x5be6, 0x6803,
++	0x0088, 0x60e3, 0x0000, 0x6887, 0x0000, 0x2001, 0x0000, 0x080c,
++	0x2838, 0x2069, 0x0200, 0x6804, 0xa005, 0x1118, 0x6808, 0xa005,
++	0x01c0, 0x6028, 0xa084, 0xfbff, 0x602a, 0x6027, 0x0400, 0x2069,
++	0xb6c5, 0x7000, 0x206a, 0x708f, 0x0026, 0x7003, 0x0001, 0x20a9,
++	0x0002, 0x1d04, 0x5bc9, 0x2091, 0x6000, 0x1f04, 0x5bc9, 0x0804,
++	0x5c17, 0x2069, 0x0140, 0x20a9, 0x0384, 0x6027, 0x1e00, 0x2009,
++	0x1e00, 0xe000, 0x6024, 0xa10c, 0x0520, 0xa084, 0x1a00, 0x1508,
++	0x1d04, 0x5bd5, 0x2091, 0x6000, 0x1f04, 0x5bd5, 0x2011, 0x0003,
++	0x080c, 0x801f, 0x2011, 0x0002, 0x080c, 0x8029, 0x080c, 0x7f03,
++	0x2019, 0x0000, 0x080c, 0x7f8e, 0x6803, 0x00a0, 0x2001, 0xb69f,
++	0x2003, 0x0001, 0x2001, 0xb400, 0x2003, 0x0001, 0xa085, 0x0001,
++	0x00b0, 0x080c, 0x2479, 0x6803, 0x0080, 0x2069, 0x0140, 0x60e3,
++	0x0000, 0x70a4, 0xa005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886,
++	0x2001, 0xb68f, 0x2004, 0x080c, 0x2838, 0x60e2, 0xa006, 0x00ee,
++	0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156,
++	0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100,
++	0x2071, 0xb400, 0x6020, 0xa084, 0x00c0, 0x01e0, 0x2011, 0x0003,
++	0x080c, 0x801f, 0x2011, 0x0002, 0x080c, 0x8029, 0x080c, 0x7f03,
++	0x2019, 0x0000, 0x080c, 0x7f8e, 0x2069, 0x0140, 0x6803, 0x00a0,
++	0x2001, 0xb69f, 0x2003, 0x0001, 0x2001, 0xb400, 0x2003, 0x0001,
++	0x0804, 0x5cbc, 0x2001, 0xb40c, 0x200c, 0xd1b4, 0x1160, 0xc1b5,
++	0x2102, 0x080c, 0x594b, 0x2069, 0x0140, 0x080c, 0x2479, 0x6803,
++	0x0080, 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, 0xa005, 0x1118,
++	0x6808, 0xa005, 0x01c0, 0x6028, 0xa084, 0xfdff, 0x602a, 0x6027,
++	0x0200, 0x2069, 0xb6c5, 0x7000, 0x206a, 0x708f, 0x0027, 0x7003,
++	0x0001, 0x20a9, 0x0002, 0x1d04, 0x5c73, 0x2091, 0x6000, 0x1f04,
++	0x5c73, 0x0804, 0x5cbc, 0x6027, 0x1e00, 0x2009, 0x1e00, 0xe000,
++	0x6024, 0xa10c, 0x01c8, 0xa084, 0x1c00, 0x11b0, 0x1d04, 0x5c7b,
++	0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x68be, 0x00ee,
++	0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, 0xb6f3, 0x7018,
++	0x00ee, 0xa005, 0x1d00, 0x0500, 0x0026, 0x2011, 0x5963, 0x080c,
++	0x6961, 0x2011, 0x5956, 0x080c, 0x6a21, 0x002e, 0x2069, 0x0140,
++	0x60e3, 0x0000, 0x70a4, 0xa005, 0x1118, 0x6887, 0x0001, 0x0008,
++	0x6886, 0x2001, 0xb68f, 0x2004, 0x080c, 0x2838, 0x60e2, 0x2001,
++	0xb40c, 0x200c, 0xc1b4, 0x2102, 0x00ee, 0x00de, 0x00ce, 0x003e,
++	0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036,
++	0x0046, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0xb400, 0x7130,
++	0xd184, 0x1180, 0x2011, 0xb453, 0x2214, 0xd2ec, 0x0138, 0xc18d,
++	0x7132, 0x2011, 0xb453, 0x2214, 0xd2ac, 0x1120, 0x7030, 0xd08c,
++	0x0904, 0x5d29, 0x7130, 0xc185, 0x7132, 0x2011, 0xb453, 0x220c,
++	0xd1a4, 0x0530, 0x0016, 0x2019, 0x000e, 0x080c, 0xafe8, 0x0156,
++	0x20a9, 0x007f, 0x2009, 0x0000, 0xa186, 0x007e, 0x01a0, 0xa186,
++	0x0080, 0x0188, 0x080c, 0x4f6a, 0x1170, 0x8127, 0xa006, 0x0016,
++	0x2009, 0x000e, 0x080c, 0xb06b, 0x2009, 0x0001, 0x2011, 0x0100,
++	0x080c, 0x6adf, 0x001e, 0x8108, 0x1f04, 0x5cf4, 0x015e, 0x001e,
++	0xd1ac, 0x1148, 0x0016, 0x2009, 0x0000, 0x2019, 0x0004, 0x080c,
++	0x2c33, 0x001e, 0x0070, 0x0156, 0x20a9, 0x007f, 0x2009, 0x0000,
++	0x080c, 0x4f6a, 0x1110, 0x080c, 0x4bc5, 0x8108, 0x1f04, 0x5d20,
++	0x015e, 0x080c, 0x1e18, 0x2011, 0x0003, 0x080c, 0x801f, 0x2011,
++	0x0002, 0x080c, 0x8029, 0x080c, 0x7f03, 0x0036, 0x2019, 0x0000,
++	0x080c, 0x7f8e, 0x003e, 0x60e3, 0x0000, 0x2001, 0xb400, 0x2003,
++	0x0001, 0x080c, 0x59c8, 0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e,
++	0x001e, 0x015e, 0x0005, 0x2071, 0xb4e2, 0x7003, 0x0000, 0x7007,
++	0x0000, 0x700f, 0x0000, 0x702b, 0x0001, 0x704f, 0x0000, 0x7053,
++	0x0001, 0x705f, 0x0020, 0x7063, 0x0040, 0x7083, 0x0000, 0x708b,
++	0x0000, 0x708f, 0x0001, 0x70bf, 0x0000, 0x0005, 0x00e6, 0x2071,
++	0xb4e2, 0x6848, 0xa005, 0x1130, 0x7028, 0xc085, 0x702a, 0xa085,
++	0x0001, 0x0428, 0x6a50, 0x7236, 0x6b54, 0x733a, 0x6858, 0x703e,
++	0x707a, 0x685c, 0x7042, 0x707e, 0x6848, 0x702e, 0x6840, 0x7032,
++	0x2009, 0x000c, 0x200a, 0x8007, 0x8006, 0x8006, 0xa08c, 0x003f,
++	0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, 0x7272, 0x7376, 0x7028,
++	0xc084, 0x702a, 0x7007, 0x0001, 0x700f, 0x0000, 0xa006, 0x00ee,
++	0x0005, 0x2b78, 0x2071, 0xb4e2, 0x7004, 0x0043, 0x700c, 0x0002,
++	0x5da5, 0x5d9c, 0x5d9c, 0x5d9c, 0x5d9c, 0x0005, 0x5dfb, 0x5dfc,
++	0x5e2e, 0x5e2f, 0x5df9, 0x5e7d, 0x5e82, 0x5eb3, 0x5eb4, 0x5ecf,
++	0x5ed0, 0x5ed1, 0x5ed2, 0x5ed3, 0x5ed4, 0x5f8a, 0x5fb1, 0x700c,
++	0x0002, 0x5dbe, 0x5df9, 0x5df9, 0x5dfa, 0x5dfa, 0x7830, 0x7930,
++	0xa106, 0x0120, 0x7830, 0x7930, 0xa106, 0x1510, 0x7030, 0xa10a,
++	0x01f8, 0x1210, 0x712c, 0xa10a, 0xa18a, 0x0002, 0x12d0, 0x080c,
++	0x15db, 0x01b0, 0x2d00, 0x705a, 0x7063, 0x0040, 0x2001, 0x0003,
++	0x7057, 0x0000, 0x0126, 0x0006, 0x2091, 0x8000, 0x2009, 0xb712,
++	0x2104, 0xc085, 0x200a, 0x000e, 0x700e, 0x012e, 0x080c, 0x1657,
++	0x0005, 0x080c, 0x15db, 0x0de0, 0x2d00, 0x705a, 0x080c, 0x15db,
++	0x1108, 0x0c10, 0x2d00, 0x7086, 0x7063, 0x0080, 0x2001, 0x0004,
++	0x08f8, 0x0005, 0x0005, 0x0005, 0x700c, 0x0002, 0x5e03, 0x5e06,
++	0x5e14, 0x5e2d, 0x5e2d, 0x080c, 0x5db7, 0x0005, 0x0126, 0x8001,
++	0x700e, 0x7058, 0x0006, 0x080c, 0x6304, 0x0120, 0x2091, 0x8000,
++	0x080c, 0x5db7, 0x00de, 0x0048, 0x0126, 0x8001, 0x700e, 0x080c,
++	0x6304, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807,
++	0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x003a, 0x1218, 0x00db,
++	0x012e, 0x0005, 0x012e, 0x080c, 0x5ed5, 0x0005, 0x0005, 0x0005,
++	0x00e6, 0x2071, 0xb4e2, 0x700c, 0x0002, 0x5e3a, 0x5e3a, 0x5e3a,
++	0x5e3c, 0x5e3f, 0x00ee, 0x0005, 0x700f, 0x0001, 0x0010, 0x700f,
++	0x0002, 0x00ee, 0x0005, 0x5ed5, 0x5ed5, 0x5ef1, 0x5ed5, 0x606e,
++	0x5ed5, 0x5ed5, 0x5ed5, 0x5ed5, 0x5ed5, 0x5ef1, 0x60b0, 0x60f3,
++	0x613c, 0x6150, 0x5ed5, 0x5ed5, 0x5f0d, 0x5ef1, 0x5ed5, 0x5ed5,
++	0x5f67, 0x61fc, 0x6217, 0x5ed5, 0x5f0d, 0x5ed5, 0x5ed5, 0x5ed5,
++	0x5ed5, 0x5f5d, 0x6217, 0x5ed5, 0x5ed5, 0x5ed5, 0x5ed5, 0x5ed5,
++	0x5ed5, 0x5ed5, 0x5ed5, 0x5ed5, 0x5f21, 0x5ed5, 0x5ed5, 0x5ed5,
++	0x5ed5, 0x5ed5, 0x5ed5, 0x5ed5, 0x5ed5, 0x5ed5, 0x6322, 0x5ed5,
++	0x5ed5, 0x5ed5, 0x5ed5, 0x5ed5, 0x5f36, 0x7020, 0x2068, 0x080c,
++	0x160b, 0x0005, 0x700c, 0x0002, 0x5e89, 0x5e8c, 0x5e9a, 0x5eb2,
++	0x5eb2, 0x080c, 0x5db7, 0x0005, 0x0126, 0x8001, 0x700e, 0x7058,
++	0x0006, 0x080c, 0x6304, 0x0120, 0x2091, 0x8000, 0x080c, 0x5db7,
++	0x00de, 0x0048, 0x0126, 0x8001, 0x700e, 0x080c, 0x6304, 0x7058,
++	0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000, 0x6834,
++	0xa084, 0x00ff, 0xa08a, 0x001a, 0x1218, 0x003b, 0x012e, 0x0005,
++	0x012e, 0x0419, 0x0005, 0x0005, 0x0005, 0x5ed5, 0x5ef1, 0x605a,
++	0x5ed5, 0x5ef1, 0x5ed5, 0x5ef1, 0x5ef1, 0x5ed5, 0x5ef1, 0x605a,
++	0x5ef1, 0x5ef1, 0x5ef1, 0x5ef1, 0x5ef1, 0x5ed5, 0x5ef1, 0x605a,
++	0x5ed5, 0x5ed5, 0x5ef1, 0x5ed5, 0x5ed5, 0x5ed5, 0x5ef1, 0x0005,
++	0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x7007, 0x0001, 0x6838,
++	0xa084, 0x00ff, 0xc0d5, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c,
++	0x53c9, 0x012e, 0x0005, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff,
++	0xc0e5, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x53c9, 0x012e,
++	0x0005, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0ed, 0x683a,
++	0x0126, 0x2091, 0x8000, 0x080c, 0x53c9, 0x012e, 0x0005, 0x7007,
++	0x0001, 0x6838, 0xa084, 0x00ff, 0xc0dd, 0x683a, 0x0126, 0x2091,
++	0x8000, 0x080c, 0x53c9, 0x012e, 0x0005, 0x6834, 0x8007, 0xa084,
++	0x00ff, 0x0988, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x601a,
++	0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x601a,
++	0x0005, 0x6834, 0x8007, 0xa084, 0x00ff, 0x0904, 0x5ee3, 0x8001,
++	0x1120, 0x7007, 0x0001, 0x0804, 0x6037, 0x7007, 0x0006, 0x7012,
++	0x2d00, 0x7016, 0x701a, 0x704b, 0x6037, 0x0005, 0x6834, 0x8007,
++	0xa084, 0x00ff, 0xa086, 0x0001, 0x1904, 0x5ee3, 0x7007, 0x0001,
++	0x2009, 0xb431, 0x210c, 0x81ff, 0x11a8, 0x6838, 0xa084, 0x00ff,
++	0x683a, 0x6853, 0x0000, 0x080c, 0x4d3c, 0x1108, 0x0005, 0x0126,
++	0x2091, 0x8000, 0x6837, 0x0139, 0x684a, 0x6952, 0x080c, 0x53c9,
++	0x012e, 0x0ca0, 0x2001, 0x0028, 0x0c90, 0x684c, 0xa084, 0x00c0,
++	0xa086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x622f, 0x2d00,
++	0x7016, 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098, 0x20a1,
++	0xb50d, 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x1a04, 0x5eff,
++	0x6a84, 0xa28a, 0x0002, 0x1a04, 0x5eff, 0x82ff, 0x1138, 0x6888,
++	0x698c, 0xa105, 0x0118, 0x2001, 0x5fed, 0x0018, 0xa280, 0x5fe3,
++	0x2005, 0x70c6, 0x7010, 0xa015, 0x0904, 0x5fcf, 0x080c, 0x15db,
++	0x1118, 0x7007, 0x000f, 0x0005, 0x2d00, 0x7022, 0x70c4, 0x2060,
++	0x2c05, 0x6836, 0xe004, 0xad00, 0x7096, 0xe008, 0xa20a, 0x1210,
++	0xa00e, 0x2200, 0x7112, 0xe20c, 0x8003, 0x800b, 0xa296, 0x0004,
++	0x0108, 0xa108, 0x719a, 0x810b, 0x719e, 0xae90, 0x0022, 0x080c,
++	0x163f, 0x7090, 0xa08e, 0x0100, 0x0170, 0xa086, 0x0200, 0x0118,
++	0x7007, 0x0010, 0x0005, 0x7020, 0x2068, 0x080c, 0x160b, 0x7014,
++	0x2068, 0x0804, 0x5eff, 0x7020, 0x2068, 0x7018, 0x6802, 0x6807,
++	0x0000, 0x2d08, 0x2068, 0x6906, 0x711a, 0x0804, 0x5f8a, 0x7014,
++	0x2068, 0x7007, 0x0001, 0x6884, 0xa005, 0x1128, 0x6888, 0x698c,
++	0xa105, 0x0108, 0x00b1, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e,
++	0x0904, 0x622f, 0x04b8, 0x5fe5, 0x5fe9, 0x0002, 0x0011, 0x0007,
++	0x0004, 0x000a, 0x000f, 0x0005, 0x0006, 0x000a, 0x0011, 0x0005,
++	0x0004, 0x00f6, 0x00e6, 0x00c6, 0x0076, 0x0066, 0x6f88, 0x6e8c,
++	0x6804, 0x2060, 0xacf0, 0x0021, 0xacf8, 0x0027, 0x2009, 0x0005,
++	0x700c, 0x7816, 0x7008, 0x7812, 0x7004, 0x7806, 0x7000, 0x7802,
++	0x7e0e, 0x7f0a, 0x8109, 0x0128, 0xaef2, 0x0004, 0xaffa, 0x0006,
++	0x0c78, 0x6004, 0xa065, 0x1d30, 0x006e, 0x007e, 0x00ce, 0x00ee,
++	0x00fe, 0x0005, 0x2009, 0xb431, 0x210c, 0x81ff, 0x1198, 0x6838,
++	0xa084, 0x00ff, 0x683a, 0x080c, 0x4c1e, 0x1108, 0x0005, 0x080c,
++	0x549c, 0x0126, 0x2091, 0x8000, 0x080c, 0x9e5d, 0x080c, 0x53c9,
++	0x012e, 0x0ca0, 0x2001, 0x0028, 0x2009, 0x0000, 0x0c80, 0x2009,
++	0xb431, 0x210c, 0x81ff, 0x11b0, 0x6858, 0xa005, 0x01c0, 0x6838,
++	0xa084, 0x00ff, 0x683a, 0x6853, 0x0000, 0x080c, 0x4ce0, 0x1108,
++	0x0005, 0x0126, 0x2091, 0x8000, 0x684a, 0x6952, 0x080c, 0x53c9,
++	0x012e, 0x0cb0, 0x2001, 0x0028, 0x2009, 0x0000, 0x0c90, 0x2001,
++	0x0000, 0x0c78, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906, 0x711a,
++	0x7010, 0x8001, 0x7012, 0x0118, 0x7007, 0x0006, 0x0030, 0x7014,
++	0x2068, 0x7007, 0x0001, 0x7048, 0x080f, 0x0005, 0x7007, 0x0001,
++	0x6944, 0x810f, 0xa18c, 0x00ff, 0x6848, 0xa084, 0x00ff, 0x20a9,
++	0x0001, 0xa096, 0x0001, 0x01b0, 0x2009, 0x0000, 0x20a9, 0x00ff,
++	0xa096, 0x0002, 0x0178, 0xa005, 0x11f0, 0x6944, 0x810f, 0xa18c,
++	0x00ff, 0x080c, 0x4f6a, 0x11b8, 0x0066, 0x6e50, 0x080c, 0x5069,
++	0x006e, 0x0088, 0x0046, 0x2011, 0xb40c, 0x2224, 0xc484, 0x2412,
++	0x004e, 0x00c6, 0x080c, 0x4f6a, 0x1110, 0x080c, 0x51ca, 0x8108,
++	0x1f04, 0x609a, 0x00ce, 0x684c, 0xd084, 0x1118, 0x080c, 0x160b,
++	0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x53c9, 0x012e, 0x0005,
++	0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0xb453, 0x2004,
++	0xd0a4, 0x0580, 0x2061, 0xb774, 0x6100, 0xd184, 0x0178, 0x6858,
++	0xa084, 0x00ff, 0x1550, 0x6000, 0xd084, 0x0520, 0x6004, 0xa005,
++	0x1538, 0x6003, 0x0000, 0x600b, 0x0000, 0x00c8, 0x2011, 0x0001,
++	0x6860, 0xa005, 0x1110, 0x2001, 0x001e, 0x8000, 0x6016, 0x6858,
++	0xa084, 0x00ff, 0x0178, 0x6006, 0x6858, 0x8007, 0xa084, 0x00ff,
++	0x0148, 0x600a, 0x6858, 0x8000, 0x1108, 0xc28d, 0x6202, 0x012e,
++	0x0804, 0x62f3, 0x012e, 0x0804, 0x62ed, 0x012e, 0x0804, 0x62e7,
++	0x012e, 0x0804, 0x62ea, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001,
++	0x2001, 0xb453, 0x2004, 0xd0a4, 0x05e0, 0x2061, 0xb774, 0x6000,
++	0xd084, 0x05b8, 0x6204, 0x6308, 0xd08c, 0x1530, 0x6c48, 0xa484,
++	0x0003, 0x0170, 0x6958, 0xa18c, 0x00ff, 0x8001, 0x1120, 0x2100,
++	0xa210, 0x0620, 0x0028, 0x8001, 0x1508, 0x2100, 0xa212, 0x02f0,
++	0xa484, 0x000c, 0x0188, 0x6958, 0x810f, 0xa18c, 0x00ff, 0xa082,
++	0x0004, 0x1120, 0x2100, 0xa318, 0x0288, 0x0030, 0xa082, 0x0004,
++	0x1168, 0x2100, 0xa31a, 0x0250, 0x6860, 0xa005, 0x0110, 0x8000,
++	0x6016, 0x6206, 0x630a, 0x012e, 0x0804, 0x62f3, 0x012e, 0x0804,
++	0x62f0, 0x012e, 0x0804, 0x62ed, 0x0126, 0x2091, 0x8000, 0x7007,
++	0x0001, 0x2061, 0xb774, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318,
++	0x0220, 0x630a, 0x012e, 0x0804, 0x6301, 0x012e, 0x0804, 0x62f0,
++	0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, 0x684c, 0xd0ac,
++	0x0148, 0x00c6, 0x2061, 0xb774, 0x6000, 0xa084, 0xfcff, 0x6002,
++	0x00ce, 0x0448, 0x6858, 0xa005, 0x05d0, 0x685c, 0xa065, 0x0598,
++	0x2001, 0xb431, 0x2004, 0xa005, 0x0118, 0x080c, 0x9dae, 0x0068,
++	0x6013, 0x0400, 0x6057, 0x0000, 0x694c, 0xd1a4, 0x0110, 0x6950,
++	0x6156, 0x2009, 0x0041, 0x080c, 0x85ef, 0x6958, 0xa18c, 0xff00,
++	0xa186, 0x2000, 0x1140, 0x0026, 0x2009, 0x0000, 0x2011, 0xfdff,
++	0x080c, 0x6adf, 0x002e, 0x684c, 0xd0c4, 0x0148, 0x2061, 0xb774,
++	0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce,
++	0x012e, 0x0804, 0x62f3, 0x00ce, 0x012e, 0x0804, 0x62ed, 0x6954,
++	0xa186, 0x002e, 0x0d40, 0xa186, 0x002d, 0x0d28, 0xa186, 0x0045,
++	0x0528, 0xa186, 0x002a, 0x1130, 0x2001, 0xb40c, 0x200c, 0xc194,
++	0x2102, 0x08c8, 0xa186, 0x0020, 0x0170, 0xa186, 0x0029, 0x1d18,
++	0x6944, 0xa18c, 0xff00, 0x810f, 0x080c, 0x4f6a, 0x1960, 0x6000,
++	0xc0e4, 0x6002, 0x0840, 0x685c, 0xa065, 0x09a8, 0x6007, 0x0024,
++	0x2001, 0xb6b6, 0x2004, 0x6016, 0x0804, 0x618b, 0x685c, 0xa065,
++	0x0950, 0x00e6, 0x6860, 0xa075, 0x2001, 0xb431, 0x2004, 0xa005,
++	0x0150, 0x080c, 0x9dae, 0x8eff, 0x0118, 0x2e60, 0x080c, 0x9dae,
++	0x00ee, 0x0804, 0x618b, 0x6020, 0xc0dc, 0xc0d5, 0x6022, 0x2e60,
++	0x6007, 0x003a, 0x6870, 0xa005, 0x0130, 0x6007, 0x003b, 0x6874,
++	0x602a, 0x6878, 0x6012, 0x6003, 0x0001, 0x080c, 0x6c52, 0x080c,
++	0x7134, 0x00ee, 0x0804, 0x618b, 0x2061, 0xb774, 0x6000, 0xd084,
++	0x0190, 0xd08c, 0x1904, 0x6301, 0x0126, 0x2091, 0x8000, 0x6204,
++	0x8210, 0x0220, 0x6206, 0x012e, 0x0804, 0x6301, 0x012e, 0x6853,
++	0x0016, 0x0804, 0x62fa, 0x6853, 0x0007, 0x0804, 0x62fa, 0x6834,
++	0x8007, 0xa084, 0x00ff, 0x1118, 0x080c, 0x5ee3, 0x0078, 0x2030,
++	0x8001, 0x1120, 0x7007, 0x0001, 0x0051, 0x0040, 0x7007, 0x0006,
++	0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x622f, 0x0005, 0x00e6,
++	0x0126, 0x2091, 0x8000, 0xa03e, 0x2009, 0xb431, 0x210c, 0x81ff,
++	0x1904, 0x62ad, 0x2009, 0xb40c, 0x210c, 0xd194, 0x1904, 0x62d7,
++	0x6848, 0x2070, 0xae82, 0xbc00, 0x0a04, 0x62a1, 0x2001, 0xb417,
++	0x2004, 0xae02, 0x1a04, 0x62a1, 0x711c, 0xa186, 0x0006, 0x1904,
++	0x6290, 0x7018, 0xa005, 0x0904, 0x62ad, 0x2004, 0xd0e4, 0x1904,
++	0x62d2, 0x2061, 0xb774, 0x6100, 0xa184, 0x0301, 0xa086, 0x0001,
++	0x1550, 0x7020, 0xd0dc, 0x1904, 0x62da, 0x6853, 0x0000, 0x6803,
++	0x0000, 0x2d08, 0x7010, 0xa005, 0x1158, 0x7112, 0x684c, 0xd0f4,
++	0x1904, 0x62dd, 0x2e60, 0x080c, 0x6a3b, 0x012e, 0x00ee, 0x0005,
++	0x2068, 0x6800, 0xa005, 0x1de0, 0x6902, 0x2168, 0x684c, 0xd0f4,
++	0x1904, 0x62dd, 0x012e, 0x00ee, 0x0005, 0x012e, 0x00ee, 0x6853,
++	0x0006, 0x0804, 0x62fa, 0xd184, 0x0dc0, 0xd1c4, 0x11a8, 0x00b8,
++	0x6944, 0xa18c, 0xff00, 0x810f, 0x080c, 0x4f6a, 0x15d8, 0x6000,
++	0xd0e4, 0x15c0, 0x711c, 0xa186, 0x0007, 0x1118, 0x6853, 0x0002,
++	0x0498, 0x6853, 0x0008, 0x0480, 0x6853, 0x000e, 0x0468, 0x6853,
++	0x0017, 0x0450, 0x6853, 0x0035, 0x0438, 0x2001, 0xb472, 0x2004,
++	0xd0fc, 0x01e8, 0x6848, 0x2070, 0xae82, 0xbc00, 0x02c0, 0x605c,
++	0xae02, 0x12a8, 0x711c, 0xa186, 0x0006, 0x1188, 0x7018, 0xa005,
++	0x0170, 0x2004, 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, 0xa086,
++	0x0007, 0x1904, 0x623a, 0x7003, 0x0002, 0x0804, 0x623a, 0x6853,
++	0x0028, 0x0010, 0x6853, 0x0029, 0x012e, 0x00ee, 0x0418, 0x6853,
++	0x002a, 0x0cd0, 0x6853, 0x0045, 0x0cb8, 0x2e60, 0x2019, 0x0002,
++	0x6017, 0x0014, 0x080c, 0xac63, 0x012e, 0x00ee, 0x0005, 0x2009,
++	0x003e, 0x0058, 0x2009, 0x0004, 0x0040, 0x2009, 0x0006, 0x0028,
++	0x2009, 0x0016, 0x0010, 0x2009, 0x0001, 0x6854, 0xa084, 0xff00,
++	0xa105, 0x6856, 0x0126, 0x2091, 0x8000, 0x080c, 0x53c9, 0x012e,
++	0x0005, 0x080c, 0x160b, 0x0005, 0x702c, 0x7130, 0x8108, 0xa102,
++	0x0230, 0xa00e, 0x7034, 0x7072, 0x7038, 0x7076, 0x0058, 0x7070,
++	0xa080, 0x0040, 0x7072, 0x1230, 0x7074, 0xa081, 0x0000, 0x7076,
++	0xa085, 0x0001, 0x7932, 0x7132, 0x0005, 0x00d6, 0x080c, 0x6a32,
++	0x00de, 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x7007,
++	0x0001, 0x6a44, 0xa282, 0x0004, 0x1a04, 0x636d, 0xd284, 0x0170,
++	0x6a4c, 0xa290, 0xb535, 0x2204, 0xa065, 0x6004, 0x05e0, 0x8007,
++	0xa084, 0x00ff, 0xa084, 0x0006, 0x1108, 0x04a8, 0x2c10, 0x080c,
++	0x856a, 0x1118, 0x080c, 0x9e67, 0x05a0, 0x621a, 0x6844, 0x0002,
++	0x634c, 0x6351, 0x6354, 0x635a, 0x2019, 0x0002, 0x080c, 0xafe8,
++	0x0060, 0x080c, 0xaf7f, 0x0048, 0x2019, 0x0002, 0x6950, 0x080c,
++	0xaf9a, 0x0018, 0x6950, 0x080c, 0xaf7f, 0x080c, 0x85c0, 0x6857,
++	0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x53c9, 0x012e, 0x001e,
++	0x002e, 0x003e, 0x00ce, 0x00de, 0x0005, 0x6857, 0x0006, 0x0c88,
++	0x6857, 0x0002, 0x0c70, 0x6857, 0x0005, 0x0c58, 0x6857, 0x0004,
++	0x0c40, 0x6857, 0x0007, 0x0c28, 0x00d6, 0x2011, 0x0004, 0x2204,
++	0xa085, 0x8002, 0x2012, 0x00de, 0x0005, 0x20e1, 0x0002, 0x3d08,
++	0x20e1, 0x2000, 0x3d00, 0xa084, 0x7000, 0x0118, 0xa086, 0x1000,
++	0x1570, 0x20e1, 0x0000, 0x3d00, 0xa094, 0xff00, 0x8217, 0xa084,
++	0xf000, 0xa086, 0x3000, 0x1160, 0xa184, 0xff00, 0x8007, 0xa086,
++	0x0008, 0x11e8, 0x080c, 0x2d83, 0x11d0, 0x080c, 0x65c4, 0x0098,
++	0x20e1, 0x0004, 0x3d60, 0xd1bc, 0x1108, 0x3e60, 0xac84, 0x0007,
++	0x1170, 0xac82, 0xbc00, 0x0258, 0x685c, 0xac02, 0x1240, 0x2009,
++	0x0047, 0x080c, 0x85ef, 0x7a1c, 0xd284, 0x1938, 0x0005, 0xa016,
++	0x080c, 0x1856, 0x0cc0, 0x0cd8, 0x781c, 0xd08c, 0x0500, 0x0156,
++	0x0136, 0x0146, 0x20e1, 0x3000, 0x3d20, 0x3e28, 0xa584, 0x0076,
++	0x1538, 0xa484, 0x7000, 0xa086, 0x1000, 0x11a8, 0x080c, 0x643f,
++	0x01f8, 0x20e1, 0x3000, 0x7828, 0x7828, 0x080c, 0x645b, 0x014e,
++	0x013e, 0x015e, 0x2009, 0xb6e8, 0x2104, 0xa005, 0x1108, 0x0005,
++	0x080c, 0x7134, 0x0ce0, 0xa484, 0x7000, 0x1548, 0x080c, 0x643f,
++	0x01d8, 0x7000, 0xa084, 0xff00, 0xa086, 0x8100, 0x0d10, 0x00a0,
++	0xd5a4, 0x0178, 0x0056, 0x0046, 0x080c, 0x1e3f, 0x080c, 0x2479,
++	0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x004e, 0x005e,
++	0x0048, 0x04a9, 0x6887, 0x0000, 0x080c, 0xb362, 0x20e1, 0x3000,
++	0x7828, 0x7828, 0x00b9, 0x014e, 0x013e, 0x015e, 0x0880, 0x0439,
++	0x1130, 0x7000, 0xa084, 0xff00, 0xa086, 0x8100, 0x1d68, 0x080c,
++	0xb362, 0x20e1, 0x3000, 0x7828, 0x7828, 0x0056, 0x080c, 0x6839,
++	0x005e, 0x0c40, 0x2001, 0xb40e, 0x2004, 0xd08c, 0x0178, 0x2001,
++	0xb400, 0x2004, 0xa086, 0x0003, 0x1148, 0x0026, 0x0036, 0x2011,
++	0x8048, 0x2518, 0x080c, 0x3e8a, 0x003e, 0x002e, 0x0005, 0xa484,
++	0x01ff, 0x6886, 0xa005, 0x0160, 0xa080, 0x001f, 0xa084, 0x03f8,
++	0x80ac, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0x0005,
++	0x20a9, 0x000c, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5,
++	0xa085, 0x0001, 0x0ca0, 0x7000, 0xa084, 0xff00, 0xa08c, 0xf000,
++	0x8007, 0xa196, 0x0000, 0x1118, 0x0804, 0x66c9, 0x0005, 0xa196,
++	0x2000, 0x1148, 0x6900, 0xa18e, 0x0001, 0x1118, 0x080c, 0x4449,
++	0x0ca8, 0x0039, 0x0c98, 0xa196, 0x8000, 0x1d80, 0x080c, 0x6779,
++	0x0c68, 0x00c6, 0x6a84, 0x82ff, 0x0904, 0x65be, 0x7110, 0xa18c,
++	0xff00, 0x810f, 0xa196, 0x0001, 0x0120, 0xa196, 0x0023, 0x1904,
++	0x65be, 0xa08e, 0x0023, 0x1570, 0x080c, 0x6814, 0x0904, 0x65be,
++	0x7124, 0x610a, 0x7030, 0xa08e, 0x0200, 0x1150, 0x7034, 0xa005,
++	0x1904, 0x65be, 0x2009, 0x0015, 0x080c, 0x85ef, 0x0804, 0x65be,
++	0xa08e, 0x0214, 0x0118, 0xa08e, 0x0210, 0x1130, 0x2009, 0x0015,
++	0x080c, 0x85ef, 0x0804, 0x65be, 0xa08e, 0x0100, 0x1904, 0x65be,
++	0x7034, 0xa005, 0x1904, 0x65be, 0x2009, 0x0016, 0x080c, 0x85ef,
++	0x0804, 0x65be, 0xa08e, 0x0022, 0x1904, 0x65be, 0x7030, 0xa08e,
++	0x0300, 0x1580, 0x68d4, 0xd0a4, 0x0528, 0xc0b5, 0x68d6, 0x7100,
++	0xa18c, 0x00ff, 0x6972, 0x7004, 0x6876, 0x00f6, 0x2079, 0x0100,
++	0x79e6, 0x78ea, 0x0006, 0xa084, 0x00ff, 0x0016, 0x2008, 0x080c,
++	0x280d, 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe, 0x080c, 0x27e3,
++	0x6952, 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086, 0x2071, 0xb400,
++	0x70a6, 0x00ee, 0x7034, 0xa005, 0x1904, 0x65be, 0x2009, 0x0017,
++	0x0804, 0x6584, 0xa08e, 0x0400, 0x1158, 0x7034, 0xa005, 0x1904,
++	0x65be, 0x68d4, 0xc0a5, 0x68d6, 0x2009, 0x0030, 0x0804, 0x6584,
++	0xa08e, 0x0500, 0x1140, 0x7034, 0xa005, 0x1904, 0x65be, 0x2009,
++	0x0018, 0x0804, 0x6584, 0xa08e, 0x2010, 0x1120, 0x2009, 0x0019,
++	0x0804, 0x6584, 0xa08e, 0x2110, 0x1120, 0x2009, 0x001a, 0x0804,
++	0x6584, 0xa08e, 0x5200, 0x1140, 0x7034, 0xa005, 0x1904, 0x65be,
++	0x2009, 0x001b, 0x0804, 0x6584, 0xa08e, 0x5000, 0x1140, 0x7034,
++	0xa005, 0x1904, 0x65be, 0x2009, 0x001c, 0x0804, 0x6584, 0xa08e,
++	0x1300, 0x1120, 0x2009, 0x0034, 0x0804, 0x6584, 0xa08e, 0x1200,
++	0x1140, 0x7034, 0xa005, 0x1904, 0x65be, 0x2009, 0x0024, 0x0804,
++	0x6584, 0xa08c, 0xff00, 0xa18e, 0x2400, 0x1118, 0x2009, 0x002d,
++	0x04d8, 0xa08c, 0xff00, 0xa18e, 0x5300, 0x1118, 0x2009, 0x002a,
++	0x0498, 0xa08e, 0x0f00, 0x1118, 0x2009, 0x0020, 0x0468, 0xa08e,
++	0x5300, 0x1108, 0x00d8, 0xa08e, 0x6104, 0x11c0, 0x2011, 0xba8d,
++	0x8208, 0x2204, 0xa082, 0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011,
++	0x8015, 0x211c, 0x8108, 0x0046, 0x2124, 0x080c, 0x3e8a, 0x004e,
++	0x8108, 0x1f04, 0x6567, 0x2009, 0x0023, 0x0070, 0xa08e, 0x6000,
++	0x1118, 0x2009, 0x003f, 0x0040, 0xa08e, 0x7800, 0x1118, 0x2009,
++	0x0045, 0x0010, 0x2009, 0x001d, 0x0016, 0x2011, 0xba83, 0x2204,
++	0x8211, 0x220c, 0x080c, 0x27e3, 0x1598, 0x080c, 0x4f0e, 0x1580,
++	0x6612, 0x6516, 0x86ff, 0x01e8, 0x001e, 0x0016, 0xa186, 0x0017,
++	0x1158, 0x6870, 0xa606, 0x11a8, 0x6874, 0xa506, 0xa084, 0xff00,
++	0x1180, 0x6000, 0xc0f5, 0x6002, 0xa186, 0x0046, 0x1150, 0x6870,
++	0xa606, 0x1138, 0x6874, 0xa506, 0xa084, 0xff00, 0x1110, 0x001e,
++	0x0068, 0x00c6, 0x080c, 0x856a, 0x0168, 0x001e, 0x611a, 0x601f,
++	0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x85ef, 0x00ce, 0x0005,
++	0x001e, 0x0ce0, 0x00ce, 0x0ce0, 0x00c6, 0x0046, 0x080c, 0x6618,
++	0x1904, 0x6615, 0xa28e, 0x0033, 0x11e8, 0x080c, 0x6814, 0x0904,
++	0x6615, 0x7124, 0x610a, 0x7030, 0xa08e, 0x0200, 0x1140, 0x7034,
++	0xa005, 0x15d8, 0x2009, 0x0015, 0x080c, 0x85ef, 0x04b0, 0xa08e,
++	0x0100, 0x1598, 0x7034, 0xa005, 0x1580, 0x2009, 0x0016, 0x080c,
++	0x85ef, 0x0458, 0xa28e, 0x0032, 0x1540, 0x7030, 0xa08e, 0x1400,
++	0x1520, 0x2009, 0x0038, 0x0016, 0x2011, 0xba83, 0x2204, 0x8211,
++	0x220c, 0x080c, 0x27e3, 0x11c0, 0x080c, 0x4f0e, 0x11a8, 0x6612,
++	0x6516, 0x00c6, 0x080c, 0x856a, 0x0170, 0x001e, 0x611a, 0x080c,
++	0x9fb8, 0x601f, 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x85ef,
++	0x080c, 0x7134, 0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce, 0x0005,
++	0x00f6, 0x00d6, 0x0026, 0x0016, 0x0136, 0x0146, 0x0156, 0x3c00,
++	0x0006, 0x2079, 0x0030, 0x2069, 0x0200, 0x080c, 0x1efe, 0x1590,
++	0x080c, 0x1da1, 0x05e0, 0x04f1, 0x1130, 0x7908, 0xa18c, 0x1fff,
++	0xa182, 0x0011, 0x1688, 0x20a9, 0x000c, 0x20e1, 0x0000, 0x2ea0,
++	0x2099, 0x020a, 0x53a5, 0x20e1, 0x2000, 0x2001, 0x020a, 0x2004,
++	0x7a0c, 0x7808, 0xa080, 0x0007, 0xa084, 0x1ff8, 0x0419, 0x1120,
++	0xa08a, 0x0140, 0x1a0c, 0x1511, 0x80ac, 0x20e1, 0x6000, 0x2099,
++	0x020a, 0x53a5, 0x20e1, 0x7000, 0x6828, 0x6828, 0x7803, 0x0004,
++	0xa294, 0x0070, 0x000e, 0x20e0, 0x015e, 0x014e, 0x013e, 0x001e,
++	0x002e, 0x00de, 0x00fe, 0x0005, 0xa016, 0x080c, 0x1856, 0xa085,
++	0x0001, 0x0c80, 0x0006, 0x2001, 0x0111, 0x2004, 0xa084, 0x0003,
++	0x000e, 0x0005, 0x0046, 0x00e6, 0x00d6, 0x2028, 0x2130, 0xa696,
++	0x00ff, 0x1198, 0xa596, 0xfffd, 0x1120, 0x2009, 0x007f, 0x0804,
++	0x66c4, 0xa596, 0xfffe, 0x1118, 0x2009, 0x007e, 0x04e8, 0xa596,
++	0xfffc, 0x1118, 0x2009, 0x0080, 0x04b8, 0x2011, 0x0000, 0x2019,
++	0xb435, 0x231c, 0xd3ac, 0x0138, 0x2021, 0x0000, 0x20a9, 0x00ff,
++	0x2071, 0xb535, 0x0030, 0x2021, 0x0081, 0x20a9, 0x007e, 0x2071,
++	0xb5b6, 0x2e1c, 0x83ff, 0x1128, 0x82ff, 0x1198, 0x2410, 0xc2fd,
++	0x0080, 0x2368, 0x6f10, 0x0006, 0x2100, 0xa706, 0x000e, 0x6b14,
++	0x1120, 0xa346, 0x1110, 0x2408, 0x0078, 0x87ff, 0x1110, 0x83ff,
++	0x0d58, 0x8420, 0x8e70, 0x1f04, 0x66a1, 0x82ff, 0x1118, 0xa085,
++	0x0001, 0x0018, 0xc2fc, 0x2208, 0xa006, 0x00de, 0x00ee, 0x004e,
++	0x0005, 0xa084, 0x0007, 0x000a, 0x0005, 0x66d5, 0x66d5, 0x66d5,
++	0x6826, 0x66d5, 0x66d6, 0x66eb, 0x6764, 0x0005, 0x7110, 0xd1bc,
++	0x0188, 0x7120, 0x2160, 0xac8c, 0x0007, 0x1160, 0xac8a, 0xbc00,
++	0x0248, 0x685c, 0xac02, 0x1230, 0x7124, 0x610a, 0x2009, 0x0046,
++	0x080c, 0x85ef, 0x0005, 0x00c6, 0xa484, 0x01ff, 0x0904, 0x6742,
++	0x7110, 0xd1bc, 0x1904, 0x6742, 0x2011, 0xba83, 0x2204, 0x8211,
++	0x220c, 0x080c, 0x27e3, 0x1904, 0x6742, 0x080c, 0x4f0e, 0x1904,
++	0x6742, 0x6612, 0x6516, 0x6000, 0xd0ec, 0x15e0, 0x6204, 0xa294,
++	0xff00, 0x8217, 0xa286, 0x0006, 0x0160, 0x080c, 0x5a90, 0x11d0,
++	0x6204, 0xa294, 0x00ff, 0xa286, 0x0006, 0x11a0, 0xa295, 0x0600,
++	0x6206, 0x00c6, 0x080c, 0x856a, 0x001e, 0x0530, 0x611a, 0x601f,
++	0x0006, 0x7120, 0x610a, 0x7130, 0x6152, 0x2009, 0x0044, 0x080c,
++	0x85ef, 0x00c0, 0x00c6, 0x080c, 0x856a, 0x001e, 0x0198, 0x611a,
++	0x601f, 0x0004, 0x7120, 0x610a, 0xa286, 0x0004, 0x1118, 0x6007,
++	0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x6c98,
++	0x080c, 0x7134, 0x00ce, 0x0005, 0x2001, 0xb40d, 0x2004, 0xd0ec,
++	0x0120, 0x2011, 0x8049, 0x080c, 0x3e8a, 0x00c6, 0x080c, 0x9e67,
++	0x001e, 0x0d80, 0x611a, 0x601f, 0x0006, 0x7120, 0x610a, 0x7130,
++	0x6152, 0x6013, 0x0300, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c,
++	0x6c52, 0x080c, 0x7134, 0x08f0, 0x7110, 0xd1bc, 0x0188, 0x7020,
++	0x2060, 0xac84, 0x0007, 0x1160, 0xac82, 0xbc00, 0x0248, 0x685c,
++	0xac02, 0x1230, 0x7124, 0x610a, 0x2009, 0x0045, 0x080c, 0x85ef,
++	0x0005, 0x0006, 0x080c, 0x2d83, 0x000e, 0x1168, 0x7110, 0xa18c,
++	0xff00, 0x810f, 0xa18e, 0x0000, 0x1130, 0xa084, 0x000f, 0xa08a,
++	0x0006, 0x1208, 0x000b, 0x0005, 0x6792, 0x6793, 0x6792, 0x6792,
++	0x67fc, 0x6808, 0x0005, 0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084,
++	0x0904, 0x67fb, 0x700c, 0x7108, 0x080c, 0x27e3, 0x1904, 0x67fb,
++	0x080c, 0x4f0e, 0x1904, 0x67fb, 0x6612, 0x6516, 0x6204, 0x7110,
++	0xd1bc, 0x01f8, 0xa28c, 0x00ff, 0xa186, 0x0004, 0x0118, 0xa186,
++	0x0006, 0x15c8, 0x00c6, 0x080c, 0x6814, 0x00ce, 0x0904, 0x67fb,
++	0x00c6, 0x080c, 0x856a, 0x001e, 0x05f0, 0x611a, 0x080c, 0x9fb8,
++	0x601f, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0x85ef,
++	0x0490, 0xa28c, 0x00ff, 0xa186, 0x0006, 0x0160, 0xa186, 0x0004,
++	0x0148, 0xa294, 0xff00, 0x8217, 0xa286, 0x0004, 0x0118, 0xa286,
++	0x0006, 0x1188, 0x00c6, 0x080c, 0x856a, 0x001e, 0x01e0, 0x611a,
++	0x080c, 0x9fb8, 0x601f, 0x0005, 0x7120, 0x610a, 0x2009, 0x0088,
++	0x080c, 0x85ef, 0x0080, 0x00c6, 0x080c, 0x856a, 0x001e, 0x0158,
++	0x611a, 0x080c, 0x9fb8, 0x601f, 0x0004, 0x7120, 0x610a, 0x2009,
++	0x0001, 0x080c, 0x85ef, 0x0005, 0x7110, 0xd1bc, 0x0140, 0x00a1,
++	0x0130, 0x7124, 0x610a, 0x2009, 0x0089, 0x080c, 0x85ef, 0x0005,
++	0x7110, 0xd1bc, 0x0140, 0x0041, 0x0130, 0x7124, 0x610a, 0x2009,
++	0x008a, 0x080c, 0x85ef, 0x0005, 0x7020, 0x2060, 0xac84, 0x0007,
++	0x1158, 0xac82, 0xbc00, 0x0240, 0x2001, 0xb417, 0x2004, 0xac02,
++	0x1218, 0xa085, 0x0001, 0x0005, 0xa006, 0x0ce8, 0x7110, 0xd1bc,
++	0x1178, 0x7024, 0x2060, 0xac84, 0x0007, 0x1150, 0xac82, 0xbc00,
++	0x0238, 0x685c, 0xac02, 0x1220, 0x2009, 0x0051, 0x080c, 0x85ef,
++	0x0005, 0x2031, 0x0105, 0x0069, 0x0005, 0x2031, 0x0206, 0x0049,
++	0x0005, 0x2031, 0x0207, 0x0029, 0x0005, 0x2031, 0x0213, 0x0009,
++	0x0005, 0x00c6, 0x00d6, 0x00f6, 0x7000, 0xa084, 0xf000, 0xa086,
++	0xc000, 0x05b0, 0x080c, 0x856a, 0x0598, 0x0066, 0x00c6, 0x0046,
++	0x2011, 0xba83, 0x2204, 0x8211, 0x220c, 0x080c, 0x27e3, 0x1580,
++	0x080c, 0x4f0e, 0x1568, 0x6612, 0x6516, 0x2c00, 0x004e, 0x00ce,
++	0x601a, 0x080c, 0x9fb8, 0x080c, 0x15f4, 0x01f0, 0x2d00, 0x6056,
++	0x6803, 0x0000, 0x6837, 0x0000, 0x6c3a, 0xadf8, 0x000f, 0x20a9,
++	0x000e, 0x2fa0, 0x2e98, 0x53a3, 0x006e, 0x6612, 0x6007, 0x003e,
++	0x601f, 0x0001, 0x6003, 0x0001, 0x080c, 0x6c98, 0x080c, 0x7134,
++	0x00fe, 0x00de, 0x00ce, 0x0005, 0x080c, 0x85c0, 0x006e, 0x0cc0,
++	0x004e, 0x00ce, 0x0cc8, 0x2071, 0xb6f3, 0x7003, 0x0003, 0x700f,
++	0x0361, 0xa006, 0x701a, 0x7076, 0x7012, 0x7017, 0xbc00, 0x7007,
++	0x0000, 0x7026, 0x702b, 0x7d3b, 0x7032, 0x7037, 0x7d9b, 0x703b,
++	0xffff, 0x703f, 0xffff, 0x7042, 0x7047, 0x4405, 0x704a, 0x705b,
++	0x69f0, 0x2001, 0xb6a1, 0x2003, 0x0003, 0x2001, 0xb6a3, 0x2003,
++	0x0100, 0x3a00, 0xa084, 0x0005, 0x706e, 0x0005, 0x2071, 0xb6f3,
++	0x1d04, 0x6950, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x1518,
++	0x700f, 0x0361, 0x7007, 0x0001, 0x0126, 0x2091, 0x8000, 0x7040,
++	0xa00d, 0x0128, 0x8109, 0x7142, 0x1110, 0x7044, 0x080f, 0x00c6,
++	0x2061, 0xb400, 0x6034, 0x00ce, 0xd0cc, 0x0180, 0x3a00, 0xa084,
++	0x0005, 0x726c, 0xa216, 0x0150, 0x706e, 0x2011, 0x8043, 0x2018,
++	0x080c, 0x3e8a, 0x0018, 0x0126, 0x2091, 0x8000, 0x7024, 0xa00d,
++	0x0188, 0x7020, 0x8001, 0x7022, 0x1168, 0x7023, 0x0009, 0x8109,
++	0x7126, 0xa186, 0x03e8, 0x1110, 0x7028, 0x080f, 0x81ff, 0x1110,
++	0x7028, 0x080f, 0x7030, 0xa00d, 0x0180, 0x702c, 0x8001, 0x702e,
++	0x1160, 0x702f, 0x0009, 0x8109, 0x7132, 0x0128, 0xa184, 0x007f,
++	0x090c, 0x7de0, 0x0010, 0x7034, 0x080f, 0x7038, 0xa005, 0x0118,
++	0x0310, 0x8001, 0x703a, 0x703c, 0xa005, 0x0118, 0x0310, 0x8001,
++	0x703e, 0x704c, 0xa00d, 0x0168, 0x7048, 0x8001, 0x704a, 0x1148,
++	0x704b, 0x0009, 0x8109, 0x714e, 0x1120, 0x7150, 0x714e, 0x7058,
++	0x080f, 0x7018, 0xa00d, 0x01d8, 0x0016, 0x7074, 0xa00d, 0x0158,
++	0x7070, 0x8001, 0x7072, 0x1138, 0x7073, 0x0009, 0x8109, 0x7176,
++	0x1110, 0x7078, 0x080f, 0x001e, 0x7008, 0x8001, 0x700a, 0x1138,
++	0x700b, 0x0009, 0x8109, 0x711a, 0x1110, 0x701c, 0x080f, 0x012e,
++	0x7004, 0x0002, 0x6976, 0x6977, 0x698f, 0x00e6, 0x2071, 0xb6f3,
++	0x7018, 0xa005, 0x1120, 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee,
++	0x0005, 0x00e6, 0x0006, 0x2071, 0xb6f3, 0x701c, 0xa206, 0x1110,
++	0x701a, 0x701e, 0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0xb6f3,
++	0x6088, 0xa102, 0x0208, 0x618a, 0x00ee, 0x0005, 0x0005, 0x7110,
++	0x080c, 0x4f6a, 0x1158, 0x6088, 0x8001, 0x0240, 0x608a, 0x1130,
++	0x0126, 0x2091, 0x8000, 0x080c, 0x7134, 0x012e, 0x8108, 0xa182,
++	0x00ff, 0x0218, 0xa00e, 0x7007, 0x0002, 0x7112, 0x0005, 0x7014,
++	0x2060, 0x0126, 0x2091, 0x8000, 0x603c, 0xa005, 0x0128, 0x8001,
++	0x603e, 0x1110, 0x080c, 0x9ea6, 0x6014, 0xa005, 0x0500, 0x8001,
++	0x6016, 0x11e8, 0x611c, 0xa186, 0x0003, 0x0118, 0xa186, 0x0006,
++	0x11a0, 0x6010, 0x2068, 0x6854, 0xa08a, 0x199a, 0x0270, 0xa082,
++	0x1999, 0x6856, 0xa08a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003,
++	0x800b, 0x810b, 0xa108, 0x6116, 0x0010, 0x080c, 0x997e, 0x012e,
++	0xac88, 0x0018, 0x7116, 0x2001, 0xec00, 0xa102, 0x0220, 0x7017,
++	0xbc00, 0x7007, 0x0000, 0x0005, 0x00e6, 0x2071, 0xb6f3, 0x7027,
++	0x07d0, 0x7023, 0x0009, 0x00ee, 0x0005, 0x2001, 0xb6fc, 0x2003,
++	0x0000, 0x0005, 0x00e6, 0x2071, 0xb6f3, 0x7132, 0x702f, 0x0009,
++	0x00ee, 0x0005, 0x2011, 0xb6ff, 0x2013, 0x0000, 0x0005, 0x00e6,
++	0x2071, 0xb6f3, 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005,
++	0x00c6, 0x0026, 0x7054, 0x8000, 0x7056, 0x2061, 0xb6a1, 0x6008,
++	0xa086, 0x0000, 0x0158, 0x7068, 0x6032, 0x7064, 0x602e, 0x7060,
++	0x602a, 0x705c, 0x6026, 0x2c10, 0x080c, 0x163f, 0x002e, 0x00ce,
++	0x0005, 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c,
++	0x68be, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x0005,
++	0x00e6, 0x2071, 0xb6f3, 0x7176, 0x727a, 0x7073, 0x0009, 0x00ee,
++	0x0005, 0x00e6, 0x0006, 0x2071, 0xb6f3, 0x7078, 0xa206, 0x1110,
++	0x7076, 0x707a, 0x000e, 0x00ee, 0x0005, 0x00c6, 0x2061, 0xb774,
++	0x00ce, 0x0005, 0xa184, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080,
++	0xb774, 0x2060, 0x0005, 0x6854, 0xa08a, 0x199a, 0x0210, 0x2001,
++	0x1999, 0xa005, 0x1150, 0x00c6, 0x2061, 0xb774, 0x6014, 0x00ce,
++	0xa005, 0x1138, 0x2001, 0x001e, 0x0020, 0xa08e, 0xffff, 0x1108,
++	0xa006, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x684c, 0xa08c,
++	0x00c0, 0xa18e, 0x00c0, 0x05e8, 0xd0b4, 0x1138, 0xd0bc, 0x1550,
++	0x2009, 0x0006, 0x080c, 0x6ab6, 0x0005, 0xd0fc, 0x0138, 0xa084,
++	0x0003, 0x0120, 0xa086, 0x0003, 0x1904, 0x6ab0, 0x6020, 0xd0d4,
++	0x0130, 0xc0d4, 0x6022, 0x6860, 0x602a, 0x685c, 0x602e, 0x2009,
++	0xb474, 0x2104, 0xd084, 0x0138, 0x87ff, 0x1120, 0x2009, 0x0042,
++	0x080c, 0x85ef, 0x0005, 0x87ff, 0x1120, 0x2009, 0x0043, 0x080c,
++	0x85ef, 0x0005, 0xd0fc, 0x0130, 0xa084, 0x0003, 0x0118, 0xa086,
++	0x0003, 0x11f0, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0x85ef,
++	0x0005, 0xd0fc, 0x0160, 0xa084, 0x0003, 0xa08e, 0x0002, 0x0148,
++	0x87ff, 0x1120, 0x2009, 0x0041, 0x080c, 0x85ef, 0x0005, 0x0061,
++	0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, 0x85ef, 0x0cb0,
++	0x2009, 0x0004, 0x0019, 0x0005, 0x2009, 0x0001, 0x00d6, 0x6010,
++	0xa0ec, 0xf000, 0x0510, 0x2068, 0x6952, 0x6800, 0x6012, 0xa186,
++	0x0001, 0x1188, 0x694c, 0xa18c, 0x8100, 0xa18e, 0x8100, 0x1158,
++	0x00c6, 0x2061, 0xb774, 0x6200, 0xd28c, 0x1120, 0x6204, 0x8210,
++	0x0208, 0x6206, 0x00ce, 0x080c, 0x53c9, 0x6010, 0xa06d, 0x0076,
++	0x2039, 0x0000, 0x190c, 0x6a3b, 0x007e, 0x00de, 0x0005, 0x0156,
++	0x00c6, 0x2061, 0xb774, 0x6000, 0x81ff, 0x0110, 0xa205, 0x0008,
++	0xa204, 0x6002, 0x00ce, 0x015e, 0x0005, 0x6800, 0xd08c, 0x1138,
++	0x6808, 0xa005, 0x0120, 0x8001, 0x680a, 0xa085, 0x0001, 0x0005,
++	0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, 0x1208, 0xa200,
++	0x1f04, 0x6afc, 0x8086, 0x818e, 0x0005, 0x0156, 0x20a9, 0x0010,
++	0xa005, 0x01b8, 0xa11a, 0x12a8, 0x8213, 0x818d, 0x0228, 0xa11a,
++	0x1220, 0x1f04, 0x6b0c, 0x0028, 0xa11a, 0x2308, 0x8210, 0x1f04,
++	0x6b0c, 0x0006, 0x3200, 0xa084, 0xefff, 0x2080, 0x000e, 0x015e,
++	0x0005, 0x0006, 0x3200, 0xa085, 0x1000, 0x0cb8, 0x0126, 0x2091,
++	0x2800, 0x2079, 0xb6e0, 0x012e, 0x00d6, 0x2069, 0xb6e0, 0x6803,
++	0x0005, 0x2069, 0x0004, 0x2d04, 0xa085, 0x8001, 0x206a, 0x00de,
++	0x0005, 0x00c6, 0x6027, 0x0001, 0x7804, 0xa084, 0x0007, 0x0002,
++	0x6b4a, 0x6b6b, 0x6bbe, 0x6b50, 0x6b6b, 0x6b4a, 0x6b48, 0x6b48,
++	0x080c, 0x1511, 0x080c, 0x69d5, 0x080c, 0x7134, 0x00ce, 0x0005,
++	0x62c0, 0x82ff, 0x1110, 0x00ce, 0x0005, 0x2011, 0x4a96, 0x080c,
++	0x6961, 0x7828, 0xa092, 0x00c8, 0x1228, 0x8000, 0x782a, 0x080c,
++	0x4ad0, 0x0c88, 0x080c, 0x4a96, 0x7807, 0x0003, 0x7827, 0x0000,
++	0x782b, 0x0000, 0x0c40, 0x080c, 0x69d5, 0x3c00, 0x0006, 0x2011,
++	0x0209, 0x20e1, 0x4000, 0x2214, 0x000e, 0x20e0, 0x82ff, 0x0178,
++	0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824, 0xa065, 0x090c,
++	0x1511, 0x2009, 0x0013, 0x080c, 0x85ef, 0x00ce, 0x0005, 0x3900,
++	0xa082, 0xb82c, 0x1210, 0x080c, 0x82d5, 0x00c6, 0x7824, 0xa065,
++	0x090c, 0x1511, 0x7804, 0xa086, 0x0004, 0x0904, 0x6bfe, 0x7828,
++	0xa092, 0x2710, 0x1230, 0x8000, 0x782a, 0x00ce, 0x080c, 0x7d17,
++	0x0c20, 0x6104, 0xa186, 0x0003, 0x1188, 0x00e6, 0x2071, 0xb400,
++	0x70e0, 0x00ee, 0xd08c, 0x0150, 0x00c6, 0x00e6, 0x2061, 0x0100,
++	0x2071, 0xb400, 0x080c, 0x4ad9, 0x00ee, 0x00ce, 0x080c, 0xb3c7,
++	0x2009, 0x0014, 0x080c, 0x85ef, 0x00ce, 0x0838, 0x2001, 0xb6fc,
++	0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824,
++	0xa065, 0x090c, 0x1511, 0x2009, 0x0013, 0x080c, 0x8643, 0x00ce,
++	0x0005, 0x00c6, 0x00d6, 0x3900, 0xa082, 0xb82c, 0x1210, 0x080c,
++	0x82d5, 0x7824, 0xa005, 0x090c, 0x1511, 0x781c, 0xa06d, 0x090c,
++	0x1511, 0x6800, 0xc0dc, 0x6802, 0x7924, 0x2160, 0x080c, 0x85c0,
++	0x693c, 0x81ff, 0x090c, 0x1511, 0x8109, 0x693e, 0x6854, 0xa015,
++	0x0110, 0x7a1e, 0x0010, 0x7918, 0x791e, 0x7807, 0x0000, 0x7827,
++	0x0000, 0x00de, 0x00ce, 0x080c, 0x7134, 0x0888, 0x6104, 0xa186,
++	0x0002, 0x0128, 0xa186, 0x0004, 0x0110, 0x0804, 0x6b97, 0x7808,
++	0xac06, 0x0904, 0x6b97, 0x080c, 0x7055, 0x080c, 0x6c98, 0x00ce,
++	0x080c, 0x7134, 0x0804, 0x6b85, 0x00c6, 0x6027, 0x0002, 0x62c8,
++	0x60c4, 0xa205, 0x1178, 0x793c, 0xa1e5, 0x0000, 0x0130, 0x2009,
++	0x0049, 0x080c, 0x85ef, 0x00ce, 0x0005, 0x2011, 0xb6ff, 0x2013,
++	0x0000, 0x0cc8, 0x3908, 0xa192, 0xb82c, 0x1210, 0x080c, 0x82d5,
++	0x793c, 0x81ff, 0x0d90, 0x7944, 0xa192, 0x7530, 0x12b8, 0x8108,
++	0x7946, 0x793c, 0xa188, 0x0007, 0x210c, 0xa18e, 0x0006, 0x1138,
++	0x6014, 0xa084, 0x0184, 0xa085, 0x0012, 0x6016, 0x08e0, 0x6014,
++	0xa084, 0x0184, 0xa085, 0x0016, 0x6016, 0x08a8, 0x7848, 0xc085,
++	0x784a, 0x0888, 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000,
++	0x600f, 0x0000, 0x2c08, 0x2061, 0xb6e0, 0x6020, 0x8000, 0x6022,
++	0x6010, 0xa005, 0x0148, 0xa080, 0x0003, 0x2102, 0x6112, 0x012e,
++	0x00ce, 0x001e, 0x000e, 0x0005, 0x6116, 0x6112, 0x0cc0, 0x00d6,
++	0x2069, 0xb6e0, 0x6000, 0xd0d4, 0x0168, 0x6820, 0x8000, 0x6822,
++	0xa086, 0x0001, 0x1110, 0x2c00, 0x681e, 0x6804, 0xa084, 0x0007,
++	0x0804, 0x713a, 0xc0d5, 0x6002, 0x6818, 0xa005, 0x0158, 0x6056,
++	0x605b, 0x0000, 0x0006, 0x2c00, 0x681a, 0x00de, 0x685a, 0x2069,
++	0xb6e0, 0x0c18, 0x6056, 0x605a, 0x2c00, 0x681a, 0x681e, 0x08e8,
++	0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000,
++	0x2c08, 0x2061, 0xb6e0, 0x6020, 0x8000, 0x6022, 0x6008, 0xa005,
++	0x0148, 0xa080, 0x0003, 0x2102, 0x610a, 0x012e, 0x00ce, 0x001e,
++	0x000e, 0x0005, 0x610e, 0x610a, 0x0cc0, 0x00c6, 0x600f, 0x0000,
++	0x2c08, 0x2061, 0xb6e0, 0x6034, 0xa005, 0x0130, 0xa080, 0x0003,
++	0x2102, 0x6136, 0x00ce, 0x0005, 0x613a, 0x6136, 0x0cd8, 0x00f6,
++	0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0056, 0x0036, 0x0026,
++	0x0016, 0x0006, 0x0126, 0xa02e, 0x2071, 0xb6e0, 0x7638, 0x2660,
++	0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, 0x6d40, 0x6018, 0xa080,
++	0x0028, 0x2004, 0xa206, 0x1904, 0x6d3b, 0x87ff, 0x0120, 0x6050,
++	0xa106, 0x1904, 0x6d3b, 0x703c, 0xac06, 0x1190, 0x0036, 0x2019,
++	0x0001, 0x080c, 0x7f8e, 0x7033, 0x0000, 0x703f, 0x0000, 0x7043,
++	0x0000, 0x7047, 0x0000, 0x704b, 0x0000, 0x003e, 0x2029, 0x0001,
++	0x7038, 0xac36, 0x1110, 0x660c, 0x763a, 0x7034, 0xac36, 0x1140,
++	0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000,
++	0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678,
++	0x600f, 0x0000, 0x080c, 0x9beb, 0x01c8, 0x6010, 0x2068, 0x601c,
++	0xa086, 0x0003, 0x1580, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000,
++	0x0016, 0x0036, 0x0076, 0x080c, 0x9e5d, 0x080c, 0xb303, 0x080c,
++	0x53c9, 0x007e, 0x003e, 0x001e, 0x080c, 0x9da2, 0x080c, 0x9dae,
++	0x00ce, 0x0804, 0x6cdb, 0x2c78, 0x600c, 0x2060, 0x0804, 0x6cdb,
++	0x85ff, 0x0120, 0x0036, 0x080c, 0x71f1, 0x003e, 0x012e, 0x000e,
++	0x001e, 0x002e, 0x003e, 0x005e, 0x006e, 0x007e, 0x00ce, 0x00de,
++	0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x1158, 0x0016,
++	0x0036, 0x0076, 0x080c, 0xb303, 0x080c, 0xb01c, 0x007e, 0x003e,
++	0x001e, 0x08a0, 0x601c, 0xa086, 0x000a, 0x0904, 0x6d25, 0x0804,
++	0x6d23, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x00f6, 0x2031, 0x0000,
++	0x0126, 0x2091, 0x8000, 0x2079, 0xb6e0, 0x7838, 0xa065, 0x0568,
++	0x600c, 0x0006, 0x600f, 0x0000, 0x783c, 0xac06, 0x1180, 0x0036,
++	0x2019, 0x0001, 0x080c, 0x7f8e, 0x7833, 0x0000, 0x783f, 0x0000,
++	0x7843, 0x0000, 0x7847, 0x0000, 0x784b, 0x0000, 0x003e, 0x080c,
++	0x9beb, 0x0178, 0x6010, 0x2068, 0x601c, 0xa086, 0x0003, 0x11b0,
++	0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x53c9, 0x080c,
++	0x9da2, 0x080c, 0x9dae, 0x000e, 0x0888, 0x7e3a, 0x7e36, 0x012e,
++	0x00fe, 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005, 0x601c, 0xa086,
++	0x0006, 0x1118, 0x080c, 0xb01c, 0x0c60, 0x601c, 0xa086, 0x000a,
++	0x0d08, 0x08f0, 0x0016, 0x0026, 0x0086, 0x2041, 0x0000, 0x0099,
++	0x080c, 0x6e88, 0x008e, 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126,
++	0x2079, 0xb6e0, 0x2091, 0x8000, 0x080c, 0x6f15, 0x080c, 0x6f87,
++	0x012e, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066,
++	0x0016, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0xb6e0, 0x7614,
++	0x2660, 0x2678, 0x8cff, 0x0904, 0x6e5e, 0x6018, 0xa080, 0x0028,
++	0x2004, 0xa206, 0x1904, 0x6e59, 0x88ff, 0x0120, 0x6050, 0xa106,
++	0x1904, 0x6e59, 0x7024, 0xac06, 0x1538, 0x2069, 0x0100, 0x68c0,
++	0xa005, 0x01f0, 0x080c, 0x69d5, 0x080c, 0x7d24, 0x68c3, 0x0000,
++	0x080c, 0x81f0, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04,
++	0xa384, 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069,
++	0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0020,
++	0x6003, 0x0009, 0x630a, 0x04e8, 0x7014, 0xac36, 0x1110, 0x660c,
++	0x7616, 0x7010, 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00,
++	0x7012, 0x0010, 0x7013, 0x0000, 0x660c, 0x0066, 0x2c00, 0xaf06,
++	0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068,
++	0x080c, 0x9beb, 0x01b8, 0x601c, 0xa086, 0x0003, 0x1540, 0x6837,
++	0x0103, 0x6b4a, 0x6847, 0x0000, 0x0016, 0x0036, 0x0086, 0x080c,
++	0x9e5d, 0x080c, 0xb303, 0x080c, 0x53c9, 0x008e, 0x003e, 0x001e,
++	0x080c, 0x9da2, 0x080c, 0x9dae, 0x080c, 0x80c8, 0x00ce, 0x0804,
++	0x6de2, 0x2c78, 0x600c, 0x2060, 0x0804, 0x6de2, 0x012e, 0x000e,
++	0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601c,
++	0xa086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0086, 0x080c, 0xb303,
++	0x080c, 0xb01c, 0x008e, 0x003e, 0x001e, 0x08e0, 0x601c, 0xa086,
++	0x0002, 0x1128, 0x6004, 0xa086, 0x0085, 0x0908, 0x0898, 0x601c,
++	0xa086, 0x0005, 0x1978, 0x6004, 0xa086, 0x0085, 0x0d20, 0x0850,
++	0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0xa280, 0xb535, 0x2004,
++	0xa065, 0x0904, 0x6f11, 0x00f6, 0x00e6, 0x00d6, 0x0066, 0x2071,
++	0xb6e0, 0x6654, 0x7018, 0xac06, 0x1108, 0x761a, 0x701c, 0xac06,
++	0x1130, 0x86ff, 0x1118, 0x7018, 0x701e, 0x0008, 0x761e, 0x6058,
++	0xa07d, 0x0108, 0x7e56, 0xa6ed, 0x0000, 0x0110, 0x2f00, 0x685a,
++	0x6057, 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002,
++	0x080c, 0x4e95, 0x0904, 0x6f0d, 0x7624, 0x86ff, 0x05e8, 0xa680,
++	0x0004, 0x2004, 0xad06, 0x15c0, 0x00d6, 0x2069, 0x0100, 0x68c0,
++	0xa005, 0x0548, 0x080c, 0x69d5, 0x080c, 0x7d24, 0x68c3, 0x0000,
++	0x080c, 0x81f0, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04,
++	0xa384, 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069,
++	0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x00de,
++	0x00c6, 0x603c, 0xa005, 0x0110, 0x8001, 0x603e, 0x2660, 0x080c,
++	0x9dae, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660, 0x6003, 0x0009,
++	0x630a, 0x00ce, 0x0804, 0x6eb8, 0x8dff, 0x0158, 0x6837, 0x0103,
++	0x6b4a, 0x6847, 0x0000, 0x080c, 0x9e5d, 0x080c, 0xb303, 0x080c,
++	0x53c9, 0x080c, 0x80c8, 0x0804, 0x6eb8, 0x006e, 0x00de, 0x00ee,
++	0x00fe, 0x012e, 0x000e, 0x00ce, 0x0005, 0x0006, 0x0066, 0x00c6,
++	0x00d6, 0x2031, 0x0000, 0x7814, 0xa065, 0x0904, 0x6f67, 0x600c,
++	0x0006, 0x600f, 0x0000, 0x7824, 0xac06, 0x1540, 0x2069, 0x0100,
++	0x68c0, 0xa005, 0x01f0, 0x080c, 0x69d5, 0x080c, 0x7d24, 0x68c3,
++	0x0000, 0x080c, 0x81f0, 0x7827, 0x0000, 0x0036, 0x2069, 0x0140,
++	0x6b04, 0xa384, 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000,
++	0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e,
++	0x0028, 0x6003, 0x0009, 0x630a, 0x2c30, 0x00b0, 0x6010, 0x2068,
++	0x080c, 0x9beb, 0x0168, 0x601c, 0xa086, 0x0003, 0x11b8, 0x6837,
++	0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x53c9, 0x080c, 0x9da2,
++	0x080c, 0x9dae, 0x080c, 0x80c8, 0x000e, 0x0804, 0x6f1c, 0x7e16,
++	0x7e12, 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005, 0x601c, 0xa086,
++	0x0006, 0x1118, 0x080c, 0xb01c, 0x0c58, 0x601c, 0xa086, 0x0002,
++	0x1128, 0x6004, 0xa086, 0x0085, 0x09d0, 0x0c10, 0x601c, 0xa086,
++	0x0005, 0x19f0, 0x6004, 0xa086, 0x0085, 0x0d60, 0x08c8, 0x0006,
++	0x0066, 0x00c6, 0x00d6, 0x7818, 0xa065, 0x0904, 0x6fed, 0x6054,
++	0x0006, 0x6057, 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc,
++	0x6002, 0x080c, 0x4e95, 0x0904, 0x6fea, 0x7e24, 0x86ff, 0x05e8,
++	0xa680, 0x0004, 0x2004, 0xad06, 0x15c0, 0x00d6, 0x2069, 0x0100,
++	0x68c0, 0xa005, 0x0548, 0x080c, 0x69d5, 0x080c, 0x7d24, 0x68c3,
++	0x0000, 0x080c, 0x81f0, 0x7827, 0x0000, 0x0036, 0x2069, 0x0140,
++	0x6b04, 0xa384, 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000,
++	0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e,
++	0x00de, 0x00c6, 0x603c, 0xa005, 0x0110, 0x8001, 0x603e, 0x2660,
++	0x080c, 0x9dae, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660, 0x6003,
++	0x0009, 0x630a, 0x00ce, 0x0804, 0x6f99, 0x8dff, 0x0138, 0x6837,
++	0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x53c9, 0x080c, 0x80c8,
++	0x0804, 0x6f99, 0x000e, 0x0804, 0x6f8c, 0x781e, 0x781a, 0x00de,
++	0x00ce, 0x006e, 0x000e, 0x0005, 0x00e6, 0x00d6, 0x0066, 0x6000,
++	0xd0dc, 0x01a0, 0x604c, 0xa06d, 0x0188, 0x6848, 0xa606, 0x1170,
++	0x2071, 0xb6e0, 0x7024, 0xa035, 0x0148, 0xa080, 0x0004, 0x2004,
++	0xad06, 0x1120, 0x6000, 0xc0dc, 0x6002, 0x0021, 0x006e, 0x00de,
++	0x00ee, 0x0005, 0x00f6, 0x2079, 0x0100, 0x78c0, 0xa005, 0x1138,
++	0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x04a0, 0x080c,
++	0x7d24, 0x78c3, 0x0000, 0x080c, 0x81f0, 0x7027, 0x0000, 0x0036,
++	0x2079, 0x0140, 0x7b04, 0xa384, 0x1000, 0x0120, 0x7803, 0x0100,
++	0x7803, 0x0000, 0x2079, 0x0100, 0x7824, 0xd084, 0x0110, 0x7827,
++	0x0001, 0x080c, 0x81f0, 0x003e, 0x080c, 0x4e95, 0x00c6, 0x603c,
++	0xa005, 0x0110, 0x8001, 0x603e, 0x2660, 0x080c, 0x85c0, 0x00ce,
++	0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x9e5d, 0x080c,
++	0x53c9, 0x080c, 0x80c8, 0x00fe, 0x0005, 0x00e6, 0x00c6, 0x2071,
++	0xb6e0, 0x7004, 0xa084, 0x0007, 0x0002, 0x7067, 0x706a, 0x7080,
++	0x7099, 0x70d2, 0x7067, 0x7065, 0x7065, 0x080c, 0x1511, 0x00ce,
++	0x00ee, 0x0005, 0x7024, 0xa065, 0x0148, 0x7020, 0x8001, 0x7022,
++	0x600c, 0xa015, 0x0150, 0x7216, 0x600f, 0x0000, 0x7007, 0x0000,
++	0x7027, 0x0000, 0x00ce, 0x00ee, 0x0005, 0x7216, 0x7212, 0x0cb0,
++	0x6018, 0x2060, 0x080c, 0x4e95, 0x6000, 0xc0dc, 0x6002, 0x7020,
++	0x8001, 0x7022, 0x0120, 0x6054, 0xa015, 0x0140, 0x721e, 0x7007,
++	0x0000, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x0005, 0x7218, 0x721e,
++	0x0cb0, 0x7024, 0xa065, 0x0598, 0x700c, 0xac06, 0x1160, 0x080c,
++	0x80c8, 0x600c, 0xa015, 0x0120, 0x720e, 0x600f, 0x0000, 0x0428,
++	0x720e, 0x720a, 0x0410, 0x7014, 0xac06, 0x1160, 0x080c, 0x80c8,
++	0x600c, 0xa015, 0x0120, 0x7216, 0x600f, 0x0000, 0x00b0, 0x7216,
++	0x7212, 0x0098, 0x6018, 0x2060, 0x080c, 0x4e95, 0x6000, 0xc0dc,
++	0x6002, 0x080c, 0x80c8, 0x701c, 0xa065, 0x0138, 0x6054, 0xa015,
++	0x0110, 0x721e, 0x0010, 0x7218, 0x721e, 0x7027, 0x0000, 0x00ce,
++	0x00ee, 0x0005, 0x7024, 0xa065, 0x0140, 0x080c, 0x80c8, 0x600c,
++	0xa015, 0x0150, 0x720e, 0x600f, 0x0000, 0x080c, 0x81f0, 0x7027,
++	0x0000, 0x00ce, 0x00ee, 0x0005, 0x720e, 0x720a, 0x0cb0, 0x00d6,
++	0x2069, 0xb6e0, 0x6830, 0xa084, 0x0003, 0x0002, 0x70f4, 0x70f6,
++	0x711a, 0x70f2, 0x080c, 0x1511, 0x00de, 0x0005, 0x00c6, 0x6840,
++	0xa086, 0x0001, 0x01b8, 0x683c, 0xa065, 0x0130, 0x600c, 0xa015,
++	0x0170, 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000,
++	0x2011, 0xb6ff, 0x2013, 0x0000, 0x00ce, 0x00de, 0x0005, 0x683a,
++	0x6836, 0x0c90, 0x6843, 0x0000, 0x6838, 0xa065, 0x0d68, 0x6003,
++	0x0003, 0x0c50, 0x00c6, 0x6843, 0x0000, 0x6847, 0x0000, 0x684b,
++	0x0000, 0x683c, 0xa065, 0x0168, 0x600c, 0xa015, 0x0130, 0x6a3a,
++	0x600f, 0x0000, 0x683f, 0x0000, 0x0020, 0x683f, 0x0000, 0x683a,
++	0x6836, 0x00ce, 0x00de, 0x0005, 0x00d6, 0x2069, 0xb6e0, 0x6804,
++	0xa084, 0x0007, 0x0002, 0x7145, 0x71e1, 0x71e1, 0x71e1, 0x71e1,
++	0x71e3, 0x7143, 0x7143, 0x080c, 0x1511, 0x6820, 0xa005, 0x1110,
++	0x00de, 0x0005, 0x00c6, 0x680c, 0xa065, 0x0150, 0x6807, 0x0004,
++	0x6826, 0x682b, 0x0000, 0x080c, 0x7233, 0x00ce, 0x00de, 0x0005,
++	0x6814, 0xa065, 0x0150, 0x6807, 0x0001, 0x6826, 0x682b, 0x0000,
++	0x080c, 0x7233, 0x00ce, 0x00de, 0x0005, 0x00e6, 0x0036, 0x6a1c,
++	0xa2f5, 0x0000, 0x0904, 0x71dd, 0x704c, 0xa00d, 0x0118, 0x7088,
++	0xa005, 0x01a0, 0x7054, 0xa075, 0x0120, 0xa20e, 0x0904, 0x71dd,
++	0x0028, 0x6818, 0xa20e, 0x0904, 0x71dd, 0x2070, 0x704c, 0xa00d,
++	0x0d88, 0x7088, 0xa005, 0x1d70, 0x2e00, 0x681e, 0x733c, 0x7038,
++	0xa302, 0x1e40, 0x080c, 0x8597, 0x0904, 0x71dd, 0x8318, 0x733e,
++	0x6112, 0x2e10, 0x621a, 0xa180, 0x0014, 0x2004, 0xa084, 0x00ff,
++	0x605a, 0xa180, 0x0014, 0x2003, 0x0000, 0xa180, 0x0015, 0x2004,
++	0xa08a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x801b, 0x831b,
++	0xa318, 0x6316, 0x003e, 0x00f6, 0x2c78, 0x71a0, 0x2001, 0xb435,
++	0x2004, 0xd0ac, 0x1110, 0xd1bc, 0x0150, 0x7100, 0xd1f4, 0x0120,
++	0x7114, 0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000, 0x0028, 0xa1e0,
++	0x2d88, 0x2c0d, 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0x080c,
++	0x785c, 0x7300, 0xc3dd, 0x7302, 0x6807, 0x0002, 0x2f18, 0x6b26,
++	0x682b, 0x0000, 0x781f, 0x0003, 0x7803, 0x0001, 0x7807, 0x0040,
++	0x00fe, 0x00ee, 0x00ce, 0x00de, 0x0005, 0x003e, 0x00ee, 0x00ce,
++	0x0cd0, 0x00de, 0x0005, 0x00c6, 0x680c, 0xa065, 0x0138, 0x6807,
++	0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x7233, 0x00ce, 0x00de,
++	0x0005, 0x00f6, 0x00d6, 0x2069, 0xb6e0, 0x6830, 0xa086, 0x0000,
++	0x11d0, 0x2001, 0xb40c, 0x200c, 0xd1bc, 0x1560, 0x6838, 0xa07d,
++	0x0190, 0x6833, 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000,
++	0x0126, 0x00f6, 0x2091, 0x2400, 0x002e, 0x080c, 0x1ff2, 0x1130,
++	0x012e, 0x080c, 0x7b95, 0x00de, 0x00fe, 0x0005, 0x012e, 0xe000,
++	0x6843, 0x0000, 0x7803, 0x0002, 0x780c, 0xa015, 0x0140, 0x6a3a,
++	0x780f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x0c60, 0x683a,
++	0x6836, 0x0cc0, 0xc1bc, 0x2102, 0x0066, 0x2031, 0x0001, 0x080c,
++	0x5b12, 0x006e, 0x0858, 0x601c, 0xa084, 0x000f, 0x000b, 0x0005,
++	0x7241, 0x7246, 0x76fd, 0x7819, 0x7246, 0x76fd, 0x7819, 0x7241,
++	0x7246, 0x080c, 0x7055, 0x080c, 0x7134, 0x0005, 0x0156, 0x0136,
++	0x0146, 0x00c6, 0x00f6, 0x6004, 0xa08a, 0x0080, 0x1a0c, 0x1511,
++	0x6118, 0x2178, 0x79a0, 0x2011, 0xb435, 0x2214, 0xd2ac, 0x1110,
++	0xd1bc, 0x0150, 0x7900, 0xd1f4, 0x0120, 0x7914, 0xa18c, 0x00ff,
++	0x0040, 0x2009, 0x0000, 0x0028, 0xa1f8, 0x2d88, 0x2f0d, 0xa18c,
++	0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0xa08a, 0x0040, 0x1a04,
++	0x72ba, 0x0033, 0x00fe, 0x00ce, 0x014e, 0x013e, 0x015e, 0x0005,
++	0x7369, 0x73b4, 0x73e1, 0x74ae, 0x74dc, 0x74e4, 0x750a, 0x751b,
++	0x752c, 0x7534, 0x754a, 0x7534, 0x75a4, 0x751b, 0x75c5, 0x75cd,
++	0x752c, 0x75cd, 0x75de, 0x72b8, 0x72b8, 0x72b8, 0x72b8, 0x72b8,
++	0x72b8, 0x72b8, 0x72b8, 0x72b8, 0x72b8, 0x72b8, 0x7e2f, 0x7e54,
++	0x7e69, 0x7e8c, 0x7ead, 0x750a, 0x72b8, 0x750a, 0x7534, 0x72b8,
++	0x73e1, 0x74ae, 0x72b8, 0x82f2, 0x7534, 0x72b8, 0x8312, 0x7534,
++	0x72b8, 0x752c, 0x7362, 0x72cd, 0x72b8, 0x8337, 0x83ac, 0x8483,
++	0x72b8, 0x8494, 0x7505, 0x84b0, 0x72b8, 0x7ec2, 0x850b, 0x72b8,
++	0x080c, 0x1511, 0x2100, 0x0033, 0x00fe, 0x00ce, 0x014e, 0x013e,
++	0x015e, 0x0005, 0x72cb, 0x72cb, 0x72cb, 0x7301, 0x731f, 0x7335,
++	0x72cb, 0x72cb, 0x72cb, 0x080c, 0x1511, 0x00d6, 0x20a1, 0x020b,
++	0x080c, 0x75fb, 0x7810, 0x2068, 0x20a3, 0x2414, 0x20a3, 0x0018,
++	0x20a3, 0x0800, 0x683c, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x6850, 0x20a2, 0x6854, 0x20a2,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0018, 0x080c, 0x7d11,
++	0x00de, 0x0005, 0x00d6, 0x7818, 0x2068, 0x68a0, 0x2069, 0xb400,
++	0x6ad4, 0xd2ac, 0x1110, 0xd0bc, 0x0110, 0xa085, 0x0001, 0x00de,
++	0x0005, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x75fb, 0x20a3, 0x0500,
++	0x20a3, 0x0000, 0x7810, 0xa0e8, 0x000f, 0x6808, 0x20a2, 0x680c,
++	0x20a2, 0x6810, 0x20a2, 0x6814, 0x20a2, 0x6818, 0x20a2, 0x681c,
++	0x20a2, 0x60c3, 0x0010, 0x080c, 0x7d11, 0x00de, 0x0005, 0x0156,
++	0x0146, 0x20a1, 0x020b, 0x080c, 0x75fb, 0x20a3, 0x7800, 0x20a3,
++	0x0000, 0x7808, 0x8007, 0x20a2, 0x20a3, 0x0000, 0x60c3, 0x0008,
++	0x080c, 0x7d11, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x20a1,
++	0x020b, 0x080c, 0x7697, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3,
++	0xdf10, 0x20a3, 0x0034, 0x2099, 0xb405, 0x20a9, 0x0004, 0x53a6,
++	0x2099, 0xb401, 0x20a9, 0x0004, 0x53a6, 0x2099, 0xb6c6, 0x20a9,
++	0x001a, 0x3304, 0x8007, 0x20a2, 0x9398, 0x1f04, 0x7351, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x60c3, 0x004c, 0x080c, 0x7d11, 0x014e,
++	0x015e, 0x0005, 0x2001, 0xb415, 0x2004, 0x609a, 0x080c, 0x7d11,
++	0x0005, 0x20a1, 0x020b, 0x080c, 0x75fb, 0x20a3, 0x5200, 0x20a3,
++	0x0000, 0x00d6, 0x2069, 0xb452, 0x6804, 0xd084, 0x0150, 0x6828,
++	0x20a3, 0x0000, 0x0016, 0x080c, 0x27f7, 0x21a2, 0x001e, 0x00de,
++	0x0028, 0x00de, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004,
++	0x2099, 0xb405, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xb401, 0x53a6,
++	0x2001, 0xb435, 0x2004, 0xd0ac, 0x1138, 0x7818, 0xa080, 0x0028,
++	0x2004, 0xa082, 0x007f, 0x0238, 0x2001, 0xb41c, 0x20a6, 0x2001,
++	0xb41d, 0x20a6, 0x0040, 0x20a3, 0x0000, 0x2001, 0xb415, 0x2004,
++	0xa084, 0x00ff, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
++	0x001c, 0x080c, 0x7d11, 0x0005, 0x20a1, 0x020b, 0x080c, 0x75fb,
++	0x20a3, 0x0500, 0x20a3, 0x0000, 0x2001, 0xb435, 0x2004, 0xd0ac,
++	0x1138, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007f, 0x0238,
++	0x2001, 0xb41c, 0x20a6, 0x2001, 0xb41d, 0x20a6, 0x0040, 0x20a3,
++	0x0000, 0x2001, 0xb415, 0x2004, 0xa084, 0x00ff, 0x20a2, 0x20a9,
++	0x0004, 0x2099, 0xb405, 0x53a6, 0x60c3, 0x0010, 0x080c, 0x7d11,
++	0x0005, 0x20a1, 0x020b, 0x080c, 0x75fb, 0x00c6, 0x7818, 0x2060,
++	0x2001, 0x0000, 0x080c, 0x52d4, 0x00ce, 0x7818, 0xa080, 0x0028,
++	0x2004, 0xa086, 0x007e, 0x1130, 0x20a3, 0x0400, 0x620c, 0xc2b4,
++	0x620e, 0x0010, 0x20a3, 0x0300, 0x20a3, 0x0000, 0x7818, 0xa080,
++	0x0028, 0x2004, 0xa086, 0x007e, 0x1904, 0x7470, 0x2001, 0xb435,
++	0x2004, 0xd0a4, 0x01c8, 0x2099, 0xb68e, 0x33a6, 0x9398, 0x20a3,
++	0x0000, 0x9398, 0x3304, 0xa084, 0x2000, 0x20a2, 0x9398, 0x33a6,
++	0x9398, 0x20a3, 0x0000, 0x9398, 0x2001, 0x2710, 0x20a2, 0x9398,
++	0x33a6, 0x9398, 0x33a6, 0x00d0, 0x2099, 0xb68e, 0x33a6, 0x9398,
++	0x33a6, 0x9398, 0x3304, 0x080c, 0x5a90, 0x1118, 0xa084, 0x37ff,
++	0x0010, 0xa084, 0x3fff, 0x20a2, 0x9398, 0x33a6, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004,
++	0x2099, 0xb405, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xb401, 0x53a6,
++	0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x744a, 0x20a9, 0x0008,
++	0x20a3, 0x0000, 0x1f04, 0x7450, 0x2099, 0xb696, 0x3304, 0xc0dd,
++	0x20a2, 0x2001, 0xb472, 0x2004, 0xd0e4, 0x0158, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x9398, 0x9398, 0x9398, 0x33a6, 0x20a9, 0x0004,
++	0x0010, 0x20a9, 0x0007, 0x20a3, 0x0000, 0x1f04, 0x746b, 0x0468,
++	0x2001, 0xb435, 0x2004, 0xd0a4, 0x0140, 0x2001, 0xb68f, 0x2004,
++	0x60e3, 0x0000, 0x080c, 0x2838, 0x60e2, 0x2099, 0xb68e, 0x20a9,
++	0x0008, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xb405, 0x53a6, 0x20a9,
++	0x0004, 0x2099, 0xb401, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000,
++	0x1f04, 0x748e, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x7494,
++	0x2099, 0xb696, 0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0008, 0x20a3,
++	0x0000, 0x1f04, 0x749f, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x1f04,
++	0x74a5, 0x60c3, 0x0074, 0x080c, 0x7d11, 0x0005, 0x20a1, 0x020b,
++	0x080c, 0x75fb, 0x20a3, 0x2010, 0x20a3, 0x0014, 0x20a3, 0x0800,
++	0x20a3, 0x2000, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2,
++	0x00f6, 0x2079, 0xb452, 0x7904, 0x00fe, 0xd1ac, 0x1110, 0xa085,
++	0x0020, 0xd1a4, 0x0110, 0xa085, 0x0010, 0xa085, 0x0002, 0x00d6,
++	0x0804, 0x7586, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
++	0x0014, 0x080c, 0x7d11, 0x0005, 0x20a1, 0x020b, 0x080c, 0x75fb,
++	0x20a3, 0x5000, 0x0804, 0x73fc, 0x20a1, 0x020b, 0x080c, 0x75fb,
++	0x20a3, 0x2110, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x0014, 0x080c, 0x7d11, 0x0005, 0x20a1, 0x020b, 0x080c,
++	0x768f, 0x0020, 0x20a1, 0x020b, 0x080c, 0x7697, 0x20a3, 0x0200,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004,
++	0x080c, 0x7d11, 0x0005, 0x20a1, 0x020b, 0x080c, 0x7697, 0x20a3,
++	0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3,
++	0x0008, 0x080c, 0x7d11, 0x0005, 0x20a1, 0x020b, 0x080c, 0x7697,
++	0x20a3, 0x0200, 0x0804, 0x73fc, 0x20a1, 0x020b, 0x080c, 0x7697,
++	0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0xa005, 0x0110, 0x20a2,
++	0x0010, 0x20a3, 0x0003, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c,
++	0x7d11, 0x0005, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x7697, 0x20a3,
++	0x0210, 0x20a3, 0x0014, 0x20a3, 0x0800, 0x7818, 0x2068, 0x6894,
++	0xa086, 0x0014, 0x1178, 0x6998, 0xa184, 0xc000, 0x1140, 0xd1ec,
++	0x0118, 0x20a3, 0x2100, 0x0040, 0x20a3, 0x0100, 0x0028, 0x20a3,
++	0x0400, 0x0010, 0x20a3, 0x0700, 0xa006, 0x20a2, 0x20a2, 0x20a2,
++	0x20a2, 0x20a2, 0x00f6, 0x2079, 0xb452, 0x7904, 0x00fe, 0xd1ac,
++	0x1110, 0xa085, 0x0020, 0xd1a4, 0x0110, 0xa085, 0x0010, 0x2009,
++	0xb474, 0x210c, 0xd184, 0x1110, 0xa085, 0x0002, 0x0026, 0x2009,
++	0xb472, 0x210c, 0xd1e4, 0x0130, 0xc0c5, 0xa094, 0x0030, 0xa296,
++	0x0010, 0x0140, 0xd1ec, 0x0130, 0xa094, 0x0030, 0xa296, 0x0010,
++	0x0108, 0xc0bd, 0x002e, 0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x0014,
++	0x080c, 0x7d11, 0x00de, 0x0005, 0x20a1, 0x020b, 0x080c, 0x7697,
++	0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3, 0x0100,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x0014, 0x080c, 0x7d11, 0x0005, 0x20a1, 0x020b, 0x080c,
++	0x7697, 0x20a3, 0x0200, 0x0804, 0x736f, 0x20a1, 0x020b, 0x080c,
++	0x7697, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3,
++	0x2a00, 0x60c3, 0x0008, 0x080c, 0x7d11, 0x0005, 0x20e1, 0x9080,
++	0x20e1, 0x4000, 0x20a1, 0x020b, 0x080c, 0x7697, 0x20a3, 0x0100,
++	0x20a3, 0x0000, 0x20a3, 0x000b, 0x20a3, 0x0000, 0x60c3, 0x0008,
++	0x080c, 0x7d11, 0x0005, 0x0026, 0x0036, 0x0046, 0x2019, 0x3200,
++	0x2021, 0x0800, 0x0038, 0x0026, 0x0036, 0x0046, 0x2019, 0x2200,
++	0x2021, 0x0100, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080,
++	0x0028, 0x2014, 0xa286, 0x007e, 0x11a0, 0xa385, 0x00ff, 0x20a2,
++	0x20a3, 0xfffe, 0x20a3, 0x0000, 0x2011, 0xb415, 0x2214, 0x2001,
++	0xb69e, 0x2004, 0xa005, 0x0118, 0x2011, 0xb41d, 0x2214, 0x22a2,
++	0x04d0, 0xa286, 0x007f, 0x1138, 0x00d6, 0xa385, 0x00ff, 0x20a2,
++	0x20a3, 0xfffd, 0x00c8, 0x2001, 0xb435, 0x2004, 0xd0ac, 0x1110,
++	0xd2bc, 0x01c8, 0xa286, 0x0080, 0x00d6, 0x1130, 0xa385, 0x00ff,
++	0x20a2, 0x20a3, 0xfffc, 0x0040, 0xa2e8, 0xb535, 0x2d6c, 0x6810,
++	0xa305, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb41c, 0x2da6, 0x8d68,
++	0x2da6, 0x00de, 0x0080, 0x00d6, 0xa2e8, 0xb535, 0x2d6c, 0x6810,
++	0xa305, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011,
++	0xb415, 0x2214, 0x22a2, 0xa485, 0x0029, 0x20a2, 0x004e, 0x003e,
++	0x20a3, 0x0000, 0x080c, 0x7d00, 0x22a2, 0x20a3, 0x0000, 0x2fa2,
++	0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005,
++	0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3, 0x02ff, 0x2011,
++	0xfffc, 0x22a2, 0x00d6, 0x2069, 0xb41c, 0x2da6, 0x8d68, 0x2da6,
++	0x00de, 0x20a3, 0x2029, 0x20a3, 0x0000, 0x08e0, 0x20a3, 0x0100,
++	0x20a3, 0x0000, 0x20a3, 0xfc02, 0x20a3, 0x0000, 0x0005, 0x0026,
++	0x0036, 0x0046, 0x2019, 0x3300, 0x2021, 0x0800, 0x0038, 0x0026,
++	0x0036, 0x0046, 0x2019, 0x2300, 0x2021, 0x0100, 0x20e1, 0x9080,
++	0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xb435,
++	0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, 0x02d8, 0x00d6, 0xa0e8,
++	0xb535, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x6810,
++	0xa005, 0x1140, 0x6814, 0xa005, 0x1128, 0x20a3, 0x00ff, 0x20a3,
++	0xfffe, 0x0028, 0x2069, 0xb41c, 0x2da6, 0x8d68, 0x2da6, 0x00de,
++	0x0080, 0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa305, 0x20a2,
++	0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb415, 0x2214,
++	0x22a2, 0xa485, 0x0098, 0x20a2, 0x20a3, 0x0000, 0x004e, 0x003e,
++	0x080c, 0x7d00, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x080c, 0x7d00,
++	0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x7810, 0x20a2, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x00c6, 0x00f6, 0x6004,
++	0xa08a, 0x0085, 0x0a0c, 0x1511, 0xa08a, 0x008c, 0x1a0c, 0x1511,
++	0x6118, 0x2178, 0x79a0, 0x2011, 0xb435, 0x2214, 0xd2ac, 0x1110,
++	0xd1bc, 0x0150, 0x7900, 0xd1f4, 0x0120, 0x7914, 0xa18c, 0x00ff,
++	0x0040, 0x2009, 0x0000, 0x0028, 0xa1f8, 0x2d88, 0x2f0d, 0xa18c,
++	0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0xa082, 0x0085, 0x001b,
++	0x00fe, 0x00ce, 0x0005, 0x7734, 0x773e, 0x7759, 0x7732, 0x7732,
++	0x7732, 0x7734, 0x080c, 0x1511, 0x0146, 0x20a1, 0x020b, 0x04a1,
++	0x60c3, 0x0000, 0x080c, 0x7d11, 0x014e, 0x0005, 0x0146, 0x20a1,
++	0x020b, 0x080c, 0x77a5, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808,
++	0x20a2, 0x7810, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0xffff, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x60c3, 0x000c, 0x080c, 0x7d11, 0x014e,
++	0x0005, 0x0146, 0x20a1, 0x020b, 0x080c, 0x77df, 0x20a3, 0x0003,
++	0x20a3, 0x0300, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004,
++	0x080c, 0x7d11, 0x014e, 0x0005, 0x0026, 0x20e1, 0x9080, 0x20e1,
++	0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xb435, 0x2214,
++	0xd2ac, 0x1118, 0xa092, 0x007e, 0x0288, 0x00d6, 0xa0e8, 0xb535,
++	0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2, 0x2069,
++	0xb41c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8,
++	0xb535, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2,
++	0x00de, 0x20a3, 0x0000, 0x2011, 0xb415, 0x2214, 0x22a2, 0x20a3,
++	0x0009, 0x20a3, 0x0000, 0x0804, 0x7662, 0x0026, 0x20e1, 0x9080,
++	0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xb435,
++	0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, 0x0288, 0x00d6, 0xa0e8,
++	0xb535, 0x2d6c, 0x6810, 0xa085, 0x8400, 0x20a2, 0x6814, 0x20a2,
++	0x2069, 0xb41c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6,
++	0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085, 0x8400, 0x20a2, 0x6814,
++	0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb415, 0x2214, 0x22a2,
++	0x2001, 0x0099, 0x20a2, 0x20a3, 0x0000, 0x0804, 0x76ee, 0x0026,
++	0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004,
++	0x2011, 0xb435, 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, 0x0288,
++	0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2,
++	0x6814, 0x20a2, 0x2069, 0xb41c, 0x2da6, 0x8d68, 0x2da6, 0x00de,
++	0x0088, 0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085, 0x8500,
++	0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb415,
++	0x2214, 0x22a2, 0x2001, 0x0099, 0x20a2, 0x20a3, 0x0000, 0x0804,
++	0x76ee, 0x00c6, 0x00f6, 0x2c78, 0x7804, 0xa08a, 0x0040, 0x0a0c,
++	0x1511, 0xa08a, 0x0053, 0x1a0c, 0x1511, 0x7918, 0x2160, 0x61a0,
++	0x2011, 0xb435, 0x2214, 0xd2ac, 0x1110, 0xd1bc, 0x0150, 0x6100,
++	0xd1f4, 0x0120, 0x6114, 0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000,
++	0x0028, 0xa1e0, 0x2d88, 0x2c0d, 0xa18c, 0x00ff, 0x2061, 0x0100,
++	0x619a, 0xa082, 0x0040, 0x001b, 0x00fe, 0x00ce, 0x0005, 0x785c,
++	0x7968, 0x7905, 0x7b0a, 0x785a, 0x785a, 0x785a, 0x785a, 0x785a,
++	0x785a, 0x785a, 0x8081, 0x8091, 0x80a1, 0x80b1, 0x785a, 0x84c1,
++	0x785a, 0x8070, 0x080c, 0x1511, 0x00d6, 0x0156, 0x0146, 0x780b,
++	0xffff, 0x20a1, 0x020b, 0x080c, 0x78bc, 0x7910, 0x2168, 0x6948,
++	0x7952, 0x21a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x694c, 0xa184,
++	0x000f, 0x1118, 0x2001, 0x0005, 0x0040, 0xd184, 0x0118, 0x2001,
++	0x0004, 0x0018, 0xa084, 0x0006, 0x8004, 0x0016, 0x2008, 0x7858,
++	0xa084, 0x00ff, 0x8007, 0xa105, 0x001e, 0x20a2, 0xd1ac, 0x0118,
++	0x20a3, 0x0002, 0x0048, 0xd1b4, 0x0118, 0x20a3, 0x0001, 0x0020,
++	0x20a3, 0x0000, 0x2230, 0x0010, 0x6a80, 0x6e7c, 0x20a9, 0x0008,
++	0x0136, 0xad88, 0x0017, 0x2198, 0x20a1, 0x021b, 0x53a6, 0x013e,
++	0x20a1, 0x020b, 0x22a2, 0x26a2, 0x60c3, 0x0020, 0x20e1, 0x9080,
++	0x6014, 0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x2001, 0xb6fc,
++	0x2003, 0x07d0, 0x2001, 0xb6fb, 0x2003, 0x0009, 0x080c, 0x17da,
++	0x014e, 0x015e, 0x00de, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000,
++	0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, 0x2202,
++	0x8217, 0x7818, 0xa080, 0x0028, 0x2004, 0x2019, 0xb435, 0x231c,
++	0xd3ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xb535, 0x2d6c,
++	0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb41c,
++	0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xb535,
++	0x2d6c, 0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x00de,
++	0x20a3, 0x0000, 0x2009, 0xb415, 0x210c, 0x21a2, 0x20a3, 0x0829,
++	0x20a3, 0x0000, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x0005, 0x00d6, 0x0156, 0x0136,
++	0x0146, 0x20a1, 0x020b, 0x00c1, 0x7810, 0x2068, 0x6860, 0x20a2,
++	0x685c, 0x20a2, 0x6880, 0x20a2, 0x687c, 0x20a2, 0xa006, 0x20a2,
++	0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x000c, 0x080c, 0x7d11, 0x014e,
++	0x013e, 0x015e, 0x00de, 0x0005, 0x0026, 0x20e1, 0x9080, 0x20e1,
++	0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xb435, 0x2214,
++	0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xb535, 0x2d6c,
++	0x6810, 0xa085, 0x0500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb41c,
++	0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xb535,
++	0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2, 0x6814, 0x20a2, 0x00de,
++	0x20a3, 0x0000, 0x2011, 0xb415, 0x2214, 0x22a2, 0x20a3, 0x0889,
++	0x20a3, 0x0000, 0x080c, 0x7d00, 0x22a2, 0x20a3, 0x0000, 0x7a08,
++	0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005,
++	0x00d6, 0x0156, 0x0136, 0x0146, 0x7810, 0xa0ec, 0xf000, 0x0168,
++	0xa06d, 0x080c, 0x52c2, 0x0148, 0x684c, 0xa084, 0x2020, 0xa086,
++	0x2020, 0x1118, 0x7820, 0xc0cd, 0x7822, 0x20a1, 0x020b, 0x080c,
++	0x7ac0, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x7810,
++	0xa084, 0xf000, 0x1130, 0x7810, 0xa084, 0x0700, 0x8007, 0x0043,
++	0x0010, 0xa006, 0x002b, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005,
++	0x79a2, 0x7a37, 0x7a40, 0x7a69, 0x7a7c, 0x7a97, 0x7aa0, 0x79a0,
++	0x080c, 0x1511, 0x0016, 0x0036, 0x694c, 0xa18c, 0x0003, 0x0118,
++	0xa186, 0x0003, 0x1170, 0x6b78, 0x7820, 0xd0cc, 0x0108, 0xc3e5,
++	0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x003e, 0x001e, 0x0804,
++	0x7a73, 0xa186, 0x0001, 0x190c, 0x1511, 0x6b78, 0x7820, 0xd0cc,
++	0x0108, 0xc3e5, 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x22a2,
++	0x6874, 0x20a2, 0x22a2, 0x687c, 0x20a2, 0x2009, 0x0018, 0xa384,
++	0x0300, 0x0904, 0x7a31, 0xd3c4, 0x0110, 0x687c, 0xa108, 0xd3cc,
++	0x0110, 0x6874, 0xa108, 0x0156, 0x20a9, 0x000d, 0xad80, 0x0020,
++	0x201c, 0x831f, 0x23a2, 0x8000, 0x1f04, 0x79e0, 0x015e, 0x22a2,
++	0x22a2, 0x22a2, 0xa184, 0x0003, 0x0904, 0x7a31, 0x20a1, 0x020b,
++	0x20e1, 0x9080, 0x20e1, 0x4000, 0x0006, 0x7818, 0xa080, 0x0028,
++	0x2004, 0x2011, 0xb435, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188,
++	0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2,
++	0x6814, 0x20a2, 0x2069, 0xb41c, 0x2da6, 0x8d68, 0x2da6, 0x00de,
++	0x0088, 0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085, 0x0700,
++	0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb415,
++	0x2214, 0x22a2, 0x000e, 0x7b20, 0xd3cc, 0x0118, 0x20a3, 0x0889,
++	0x0010, 0x20a3, 0x0898, 0x20a2, 0x080c, 0x7d00, 0x22a2, 0x20a3,
++	0x0000, 0x61c2, 0x003e, 0x001e, 0x080c, 0x7d11, 0x0005, 0x2011,
++	0x0008, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016, 0x0488,
++	0x2011, 0x0302, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016,
++	0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0012, 0x22a2, 0x20a3, 0x0008,
++	0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x7000, 0x20a3, 0x0500,
++	0x22a2, 0x20a3, 0x000a, 0x22a2, 0x22a2, 0x20a3, 0x2500, 0x22a2,
++	0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0032, 0x080c, 0x7d11,
++	0x0005, 0x2011, 0x0028, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2,
++	0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3,
++	0x0018, 0x080c, 0x7d11, 0x0005, 0x2011, 0x0100, 0x7820, 0xd0cc,
++	0x0108, 0xc2e5, 0x22a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2,
++	0x22a2, 0x20a3, 0x0008, 0x22a2, 0x7854, 0xa084, 0x00ff, 0x20a2,
++	0x22a2, 0x22a2, 0x60c3, 0x0020, 0x080c, 0x7d11, 0x0005, 0x2011,
++	0x0008, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016, 0x0888,
++	0x0036, 0x7b10, 0xa384, 0xff00, 0x7812, 0xa384, 0x00ff, 0x8001,
++	0x1138, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0x003e, 0x0808,
++	0x0046, 0x2021, 0x0800, 0x0006, 0x7820, 0xd0cc, 0x000e, 0x0108,
++	0xc4e5, 0x24a2, 0x004e, 0x22a2, 0x20a2, 0x003e, 0x0804, 0x7a73,
++	0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++	0x2004, 0x2011, 0xb435, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188,
++	0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2,
++	0x6814, 0x20a2, 0x2069, 0xb41c, 0x2da6, 0x8d68, 0x2da6, 0x00de,
++	0x0088, 0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085, 0x0700,
++	0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb415,
++	0x2214, 0x22a2, 0x7820, 0xd0cc, 0x0118, 0x20a3, 0x0889, 0x0010,
++	0x20a3, 0x0898, 0x20a3, 0x0000, 0x080c, 0x7d00, 0x22a2, 0x20a3,
++	0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x002e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, 0x0016, 0x0036,
++	0x7810, 0xa084, 0x0700, 0x8007, 0x003b, 0x003e, 0x001e, 0x014e,
++	0x013e, 0x015e, 0x00de, 0x0005, 0x7b24, 0x7b24, 0x7b26, 0x7b24,
++	0x7b24, 0x7b24, 0x7b48, 0x7b24, 0x080c, 0x1511, 0x7910, 0xa18c,
++	0xf8ff, 0xa18d, 0x0600, 0x7912, 0x20a1, 0x020b, 0x2009, 0x0003,
++	0x00f9, 0x00d6, 0x2069, 0xb452, 0x6804, 0xd0bc, 0x0130, 0x682c,
++	0xa084, 0x00ff, 0x8007, 0x20a2, 0x0010, 0x20a3, 0x3f00, 0x00de,
++	0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0001, 0x080c, 0x7d11, 0x0005,
++	0x20a1, 0x020b, 0x2009, 0x0003, 0x0019, 0x20a3, 0x7f00, 0x0c80,
++	0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++	0x2004, 0x2011, 0xb435, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188,
++	0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2,
++	0x6814, 0x20a2, 0x2069, 0xb41c, 0x2da6, 0x8d68, 0x2da6, 0x00de,
++	0x0088, 0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085, 0x0100,
++	0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb415,
++	0x2214, 0x22a2, 0x20a3, 0x0888, 0xa18d, 0x0008, 0x21a2, 0x080c,
++	0x7d00, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x00c6,
++	0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0xb400, 0x7154,
++	0x7818, 0x2068, 0x68a0, 0x2028, 0x76d4, 0xd6ac, 0x1130, 0xd0bc,
++	0x1120, 0x6910, 0x6a14, 0x7454, 0x0020, 0x6910, 0x6a14, 0x7370,
++	0x7474, 0x781c, 0xa0be, 0x0006, 0x0904, 0x7c4b, 0xa0be, 0x000a,
++	0x15e8, 0xa185, 0x0200, 0x6062, 0x6266, 0x636a, 0x646e, 0x6073,
++	0x2029, 0x6077, 0x0000, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e,
++	0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086,
++	0x7810, 0x2070, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6,
++	0x7008, 0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000,
++	0x609f, 0x0000, 0x080c, 0x855c, 0x2009, 0x07d0, 0x60c4, 0xa084,
++	0xfff0, 0xa005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x69da, 0x003e,
++	0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x70d4, 0xd0ac,
++	0x1110, 0xd5bc, 0x0138, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a,
++	0x646e, 0x0038, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b, 0x0000,
++	0x646e, 0x6073, 0x0809, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084,
++	0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082,
++	0x7808, 0x6086, 0x7810, 0x2070, 0x7014, 0x608a, 0x7010, 0x608e,
++	0x700c, 0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5,
++	0x60d7, 0x0000, 0xa582, 0x0080, 0x0248, 0x6a00, 0xd2f4, 0x0120,
++	0x6a14, 0xa294, 0x00ff, 0x0010, 0x2011, 0x0000, 0x629e, 0x080c,
++	0x855c, 0x2009, 0x07d0, 0x60c4, 0xa084, 0xfff0, 0xa005, 0x0110,
++	0x2009, 0x1b58, 0x080c, 0x69da, 0x003e, 0x004e, 0x005e, 0x00ce,
++	0x00de, 0x00ee, 0x0005, 0x7810, 0x2070, 0x704c, 0xa084, 0x0003,
++	0xa086, 0x0002, 0x0904, 0x7ca1, 0x2001, 0xb435, 0x2004, 0xd0ac,
++	0x1110, 0xd5bc, 0x0138, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a,
++	0x646e, 0x0038, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b, 0x0000,
++	0x646e, 0x6073, 0x0880, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084,
++	0x00ff, 0x688e, 0x8007, 0x607a, 0x7834, 0x607e, 0x2f00, 0x6086,
++	0x7808, 0x6082, 0x7060, 0x608a, 0x705c, 0x608e, 0x7080, 0x60c6,
++	0x707c, 0x60ca, 0x707c, 0x792c, 0xa108, 0x792e, 0x7080, 0x7928,
++	0xa109, 0x792a, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000,
++	0xa582, 0x0080, 0x0248, 0x6a00, 0xd2f4, 0x0120, 0x6a14, 0xa294,
++	0x00ff, 0x0010, 0x2011, 0x0000, 0x629e, 0x080c, 0x8559, 0x0804,
++	0x7c39, 0x2001, 0xb435, 0x2004, 0xd0ac, 0x1110, 0xd5bc, 0x0138,
++	0xa185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, 0x0038, 0xa185,
++	0x0700, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x080c, 0x52c2,
++	0x0180, 0x00d6, 0x7810, 0xa06d, 0x684c, 0x00de, 0xa084, 0x2020,
++	0xa086, 0x2020, 0x1130, 0x7820, 0xc0cd, 0x7822, 0x6073, 0x0889,
++	0x0010, 0x6073, 0x0898, 0x6077, 0x0000, 0x688c, 0x8000, 0xa084,
++	0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086,
++	0x7808, 0x6082, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6,
++	0x7008, 0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000,
++	0xa582, 0x0080, 0x0248, 0x6a00, 0xd2f4, 0x0120, 0x6a14, 0xa294,
++	0x00ff, 0x0010, 0x2011, 0x0000, 0x629e, 0x7820, 0xd0cc, 0x0120,
++	0x080c, 0x855c, 0x0804, 0x7c39, 0x080c, 0x8559, 0x0804, 0x7c39,
++	0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, 0x2202,
++	0x8217, 0x0005, 0x00d6, 0x2069, 0xb6e0, 0x6843, 0x0001, 0x00de,
++	0x0005, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x0019,
++	0x080c, 0x69cc, 0x0005, 0x0006, 0x6014, 0xa084, 0x0004, 0xa085,
++	0x0009, 0x6016, 0x000e, 0x0005, 0x0016, 0x00c6, 0x0006, 0x2061,
++	0x0100, 0x61a4, 0x60a7, 0x95f5, 0x6014, 0xa084, 0x0004, 0xa085,
++	0x0008, 0x6016, 0x000e, 0xe000, 0xe000, 0xe000, 0xe000, 0x61a6,
++	0x00ce, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0016, 0x0026, 0x2061,
++	0x0100, 0x2069, 0x0140, 0x080c, 0x5a90, 0x1198, 0x2001, 0xb6fc,
++	0x2004, 0xa005, 0x15b8, 0x0066, 0x2031, 0x0001, 0x080c, 0x5b12,
++	0x006e, 0x1118, 0x080c, 0x69cc, 0x0468, 0x00c6, 0x2061, 0xb6e0,
++	0x00d8, 0x6904, 0xa194, 0x4000, 0x0550, 0x0831, 0x6803, 0x1000,
++	0x6803, 0x0000, 0x00c6, 0x2061, 0xb6e0, 0x6128, 0xa192, 0x00c8,
++	0x1258, 0x8108, 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c,
++	0x69cc, 0x080c, 0x7d1b, 0x0070, 0x6124, 0xa1e5, 0x0000, 0x0140,
++	0x080c, 0xb3c7, 0x080c, 0x69d5, 0x2009, 0x0014, 0x080c, 0x85ef,
++	0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001,
++	0xb6fc, 0x2004, 0xa005, 0x1db0, 0x00c6, 0x2061, 0xb6e0, 0x6128,
++	0xa192, 0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, 0x69cc,
++	0x080c, 0x4ad9, 0x0c38, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026,
++	0x080c, 0x69e2, 0x2071, 0xb6e0, 0x713c, 0x81ff, 0x0590, 0x2061,
++	0x0100, 0x2069, 0x0140, 0x080c, 0x5a90, 0x11a8, 0x0036, 0x2019,
++	0x0002, 0x080c, 0x7f8e, 0x003e, 0x713c, 0x2160, 0x080c, 0xb3c7,
++	0x2009, 0x004a, 0x080c, 0x85ef, 0x0066, 0x2031, 0x0001, 0x080c,
++	0x5b12, 0x006e, 0x00b0, 0x6904, 0xa194, 0x4000, 0x01c0, 0x6803,
++	0x1000, 0x6803, 0x0000, 0x0036, 0x2019, 0x0001, 0x080c, 0x7f8e,
++	0x003e, 0x713c, 0x2160, 0x080c, 0xb3c7, 0x2009, 0x004a, 0x080c,
++	0x85ef, 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0c58,
++	0x0026, 0x00e6, 0x2071, 0xb6e0, 0x7048, 0xd084, 0x01c0, 0x713c,
++	0x81ff, 0x01a8, 0x2071, 0x0100, 0xa188, 0x0007, 0x2114, 0xa28e,
++	0x0006, 0x1138, 0x7014, 0xa084, 0x0184, 0xa085, 0x0012, 0x7016,
++	0x0030, 0x7014, 0xa084, 0x0184, 0xa085, 0x0016, 0x7016, 0x00ee,
++	0x002e, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046,
++	0x0006, 0x0126, 0x2091, 0x8000, 0x6018, 0x2068, 0x6ca0, 0x2071,
++	0xb6e0, 0x7018, 0x2068, 0x8dff, 0x0188, 0x68a0, 0xa406, 0x0118,
++	0x6854, 0x2068, 0x0cc0, 0x6010, 0x2060, 0x643c, 0x6540, 0x6648,
++	0x2d60, 0x080c, 0x50db, 0x0110, 0xa085, 0x0001, 0x012e, 0x000e,
++	0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x20a1,
++	0x020b, 0x080c, 0x75fb, 0x20a3, 0x1200, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x781c, 0xa086, 0x0004, 0x1110, 0x6098, 0x0018, 0x2001,
++	0xb415, 0x2004, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a9,
++	0x0010, 0xa006, 0x20a2, 0x1f04, 0x7e4a, 0x20a2, 0x20a2, 0x60c3,
++	0x002c, 0x080c, 0x7d11, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b,
++	0x080c, 0x75fb, 0x20a3, 0x0f00, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x7808, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x7d11, 0x014e, 0x015e,
++	0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x7697, 0x20a3,
++	0x0200, 0x20a3, 0x0000, 0x20a9, 0x0006, 0x2011, 0xb440, 0x2019,
++	0xb441, 0x23a6, 0x22a6, 0xa398, 0x0002, 0xa290, 0x0002, 0x1f04,
++	0x7e79, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x080c,
++	0x7d11, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x0016, 0x0026,
++	0x20a1, 0x020b, 0x080c, 0x7670, 0x080c, 0x7686, 0x7810, 0xa080,
++	0x0000, 0x2004, 0xa080, 0x0015, 0x2098, 0x7808, 0xa088, 0x0002,
++	0x21a8, 0x53a6, 0xa080, 0x0004, 0x8003, 0x60c2, 0x080c, 0x7d11,
++	0x002e, 0x001e, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x20a1,
++	0x020b, 0x080c, 0x75fb, 0x20a3, 0x6200, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x7d11, 0x014e,
++	0x015e, 0x0005, 0x0156, 0x0146, 0x0016, 0x0026, 0x20a1, 0x020b,
++	0x080c, 0x75fb, 0x7810, 0xa080, 0x0000, 0x2004, 0xa080, 0x0017,
++	0x2098, 0x7808, 0xa088, 0x0002, 0x21a8, 0x53a6, 0x8003, 0x60c2,
++	0x080c, 0x7d11, 0x002e, 0x001e, 0x014e, 0x015e, 0x0005, 0x00e6,
++	0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0xb6e0, 0x700c,
++	0x2060, 0x8cff, 0x0178, 0x080c, 0x9de9, 0x1110, 0x080c, 0x8bbc,
++	0x600c, 0x0006, 0x080c, 0x9fb0, 0x080c, 0x85c0, 0x080c, 0x80c8,
++	0x00ce, 0x0c78, 0x700f, 0x0000, 0x700b, 0x0000, 0x012e, 0x000e,
++	0x00ce, 0x00ee, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6,
++	0x00c6, 0x0026, 0x0016, 0x0006, 0x2091, 0x8000, 0x2069, 0x0100,
++	0x2079, 0x0140, 0x2071, 0xb6e0, 0x7024, 0x2060, 0x8cff, 0x05a0,
++	0x080c, 0x7d24, 0x68c3, 0x0000, 0x080c, 0x69d5, 0x2009, 0x0013,
++	0x080c, 0x85ef, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0158, 0x6827,
++	0x0004, 0x7804, 0xa084, 0x4000, 0x01a0, 0x7803, 0x1000, 0x7803,
++	0x0000, 0x0078, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04,
++	0x7f24, 0x7804, 0xa084, 0x1000, 0x0120, 0x7803, 0x0100, 0x7803,
++	0x0000, 0x6824, 0x000e, 0x001e, 0x002e, 0x00ce, 0x00de, 0x00ee,
++	0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, 0xb400, 0x2004, 0xa096,
++	0x0001, 0x0590, 0xa096, 0x0004, 0x0578, 0x080c, 0x69d5, 0x6814,
++	0xa084, 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3,
++	0x0000, 0x2011, 0x4a96, 0x080c, 0x6961, 0x20a9, 0x01f4, 0x6824,
++	0xd094, 0x0158, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0,
++	0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0xd084, 0x0118, 0x6827,
++	0x0001, 0x0010, 0x1f04, 0x7f67, 0x7804, 0xa084, 0x1000, 0x0120,
++	0x7803, 0x0100, 0x7803, 0x0000, 0x000e, 0x001e, 0x002e, 0x00ce,
++	0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x0126, 0x0156,
++	0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0026, 0x0016, 0x0006, 0x2091,
++	0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0xb6e0, 0x703c,
++	0x2060, 0x8cff, 0x0904, 0x8015, 0xa386, 0x0002, 0x1128, 0x6814,
++	0xa084, 0x0002, 0x0904, 0x8015, 0x68af, 0x95f5, 0x6817, 0x0010,
++	0x2009, 0x00fa, 0x8109, 0x1df0, 0x68c7, 0x0000, 0x68cb, 0x0008,
++	0x080c, 0x69e2, 0x080c, 0x21dd, 0x0046, 0x2009, 0x017f, 0x200b,
++	0x00a5, 0x2021, 0x0169, 0x2404, 0xa084, 0x000f, 0xa086, 0x0004,
++	0x1500, 0x68af, 0x95f5, 0x68c7, 0x0000, 0x68cb, 0x0008, 0x00e6,
++	0x00f6, 0x2079, 0x0020, 0x2071, 0xb74a, 0x6814, 0xa084, 0x0184,
++	0xa085, 0x0012, 0x6816, 0x7803, 0x0008, 0x7003, 0x0000, 0x00fe,
++	0x00ee, 0xa386, 0x0002, 0x1128, 0x7884, 0xa005, 0x1110, 0x7887,
++	0x0001, 0x2001, 0xb6b1, 0x2004, 0x200a, 0x004e, 0xa39d, 0x0000,
++	0x1120, 0x2009, 0x0049, 0x080c, 0x85ef, 0x20a9, 0x03e8, 0x6824,
++	0xd094, 0x0158, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0,
++	0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0xd08c, 0x0118, 0x6827,
++	0x0002, 0x0010, 0x1f04, 0x7ff7, 0x7804, 0xa084, 0x1000, 0x0120,
++	0x7803, 0x0100, 0x7803, 0x0000, 0x6824, 0x000e, 0x001e, 0x002e,
++	0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6,
++	0x0126, 0x2091, 0x8000, 0x2069, 0xb6e0, 0x6a06, 0x012e, 0x00de,
++	0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0xb6e0, 0x6a32,
++	0x012e, 0x00de, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0006,
++	0x0126, 0x2071, 0xb6e0, 0x7614, 0x2660, 0x2678, 0x2091, 0x8000,
++	0x8cff, 0x0538, 0x601c, 0xa206, 0x1500, 0x7014, 0xac36, 0x1110,
++	0x660c, 0x7616, 0x7010, 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118,
++	0x2f00, 0x7012, 0x0010, 0x7013, 0x0000, 0x660c, 0x0066, 0x2c00,
++	0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c,
++	0x9dae, 0x080c, 0x80c8, 0x00ce, 0x08d8, 0x2c78, 0x600c, 0x2060,
++	0x08b8, 0x012e, 0x000e, 0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005,
++	0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x78bc, 0x7810, 0x20a2,
++	0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x1000, 0x0804,
++	0x80c0, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x78bc, 0x7810,
++	0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x4000,
++	0x0478, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x78bc, 0x7810,
++	0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x2000,
++	0x00f8, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x78bc, 0x7810,
++	0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400,
++	0x0078, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x78bc, 0x7810,
++	0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200,
++	0x0089, 0x60c3, 0x0020, 0x080c, 0x7d11, 0x014e, 0x015e, 0x0005,
++	0x00e6, 0x2071, 0xb6e0, 0x7020, 0xa005, 0x0110, 0x8001, 0x7022,
++	0x00ee, 0x0005, 0x20a9, 0x0008, 0x20a2, 0x1f04, 0x80d4, 0x20a2,
++	0x20a2, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066,
++	0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0xb6e0, 0x7614, 0x2660,
++	0x2678, 0x2039, 0x0001, 0x87ff, 0x0904, 0x8169, 0x8cff, 0x0904,
++	0x8169, 0x601c, 0xa086, 0x0006, 0x1904, 0x8164, 0x88ff, 0x0138,
++	0x2800, 0xac06, 0x1904, 0x8164, 0x2039, 0x0000, 0x0050, 0x6018,
++	0xa206, 0x1904, 0x8164, 0x85ff, 0x0120, 0x6050, 0xa106, 0x1904,
++	0x8164, 0x7024, 0xac06, 0x1560, 0x2069, 0x0100, 0x68c0, 0xa005,
++	0x0518, 0x080c, 0x69d5, 0x6820, 0xd0b4, 0x0110, 0x68a7, 0x95f5,
++	0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, 0x81f0, 0x7027, 0x0000,
++	0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120, 0x6803,
++	0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110,
++	0x6827, 0x0001, 0x003e, 0x0020, 0x6003, 0x0009, 0x630a, 0x0460,
++	0x7014, 0xac36, 0x1110, 0x660c, 0x7616, 0x7010, 0xac36, 0x1140,
++	0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000,
++	0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678,
++	0x89ff, 0x1158, 0x600f, 0x0000, 0x6010, 0x2068, 0x080c, 0x9beb,
++	0x0110, 0x080c, 0xb01c, 0x080c, 0x9dae, 0x080c, 0x80c8, 0x88ff,
++	0x1190, 0x00ce, 0x0804, 0x80eb, 0x2c78, 0x600c, 0x2060, 0x0804,
++	0x80eb, 0xa006, 0x012e, 0x000e, 0x006e, 0x007e, 0x00ce, 0x00de,
++	0x00ee, 0x00fe, 0x0005, 0x6017, 0x0000, 0x00ce, 0xa8c5, 0x0001,
++	0x0c88, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0006,
++	0x0126, 0x2091, 0x8000, 0x2071, 0xb6e0, 0x7638, 0x2660, 0x2678,
++	0x8cff, 0x0904, 0x81e0, 0x601c, 0xa086, 0x0006, 0x1904, 0x81db,
++	0x87ff, 0x0128, 0x2700, 0xac06, 0x1904, 0x81db, 0x0048, 0x6018,
++	0xa206, 0x1904, 0x81db, 0x85ff, 0x0118, 0x6050, 0xa106, 0x15d8,
++	0x703c, 0xac06, 0x1180, 0x0036, 0x2019, 0x0001, 0x080c, 0x7f8e,
++	0x7033, 0x0000, 0x703f, 0x0000, 0x7043, 0x0000, 0x7047, 0x0000,
++	0x704b, 0x0000, 0x003e, 0x7038, 0xac36, 0x1110, 0x660c, 0x763a,
++	0x7034, 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7036,
++	0x0010, 0x7037, 0x0000, 0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110,
++	0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x080c,
++	0x9beb, 0x0110, 0x080c, 0xb01c, 0x080c, 0x9dae, 0x87ff, 0x1190,
++	0x00ce, 0x0804, 0x8188, 0x2c78, 0x600c, 0x2060, 0x0804, 0x8188,
++	0xa006, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee,
++	0x00fe, 0x0005, 0x6017, 0x0000, 0x00ce, 0xa7bd, 0x0001, 0x0c88,
++	0x00e6, 0x2071, 0xb6e0, 0x2001, 0xb400, 0x2004, 0xa086, 0x0002,
++	0x1118, 0x7007, 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005,
++	0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091,
++	0x8000, 0x2071, 0xb6e0, 0x2c10, 0x7638, 0x2660, 0x2678, 0x8cff,
++	0x0518, 0x2200, 0xac06, 0x11e0, 0x7038, 0xac36, 0x1110, 0x660c,
++	0x763a, 0x7034, 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00,
++	0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x2c00, 0xaf06, 0x0110,
++	0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0xa085, 0x0001, 0x0020,
++	0x2c78, 0x600c, 0x2060, 0x08d8, 0x012e, 0x000e, 0x002e, 0x006e,
++	0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6,
++	0x0066, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0xb6e0, 0x760c,
++	0x2660, 0x2678, 0x8cff, 0x0904, 0x82c6, 0x6018, 0xa080, 0x0028,
++	0x2004, 0xa206, 0x1904, 0x82c1, 0x7024, 0xac06, 0x1508, 0x2069,
++	0x0100, 0x68c0, 0xa005, 0x0904, 0x829d, 0x080c, 0x7d24, 0x68c3,
++	0x0000, 0x080c, 0x81f0, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140,
++	0x6b04, 0xa384, 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000,
++	0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e,
++	0x700c, 0xac36, 0x1110, 0x660c, 0x760e, 0x7008, 0xac36, 0x1140,
++	0x2c00, 0xaf36, 0x0118, 0x2f00, 0x700a, 0x0010, 0x700b, 0x0000,
++	0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678,
++	0x600f, 0x0000, 0x080c, 0x9dd8, 0x1158, 0x080c, 0x2c86, 0x080c,
++	0x9de9, 0x11f0, 0x080c, 0x8bbc, 0x00d8, 0x080c, 0x81f0, 0x08c0,
++	0x080c, 0x9de9, 0x1118, 0x080c, 0x8bbc, 0x0090, 0x6010, 0x2068,
++	0x080c, 0x9beb, 0x0168, 0x601c, 0xa086, 0x0003, 0x11f8, 0x6837,
++	0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x53c9, 0x080c, 0x9da2,
++	0x080c, 0x9fb0, 0x080c, 0x9dae, 0x080c, 0x80c8, 0x00ce, 0x0804,
++	0x824a, 0x2c78, 0x600c, 0x2060, 0x0804, 0x824a, 0x012e, 0x000e,
++	0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086,
++	0x0006, 0x1d30, 0x080c, 0xb01c, 0x0c18, 0x0036, 0x0156, 0x0136,
++	0x0146, 0x3908, 0xa006, 0xa190, 0x0020, 0x221c, 0xa39e, 0x2a7d,
++	0x1118, 0x8210, 0x8000, 0x0cc8, 0xa005, 0x0138, 0x20a9, 0x0020,
++	0x2198, 0xa110, 0x22a0, 0x22c8, 0x53a3, 0x014e, 0x013e, 0x015e,
++	0x003e, 0x0005, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x7697, 0x20a3,
++	0x0200, 0x20a3, 0x0014, 0x60c3, 0x0014, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x2099, 0xb6b9, 0x20a9, 0x0004, 0x53a6, 0x20a3, 0x0004,
++	0x20a3, 0x7878, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x080c, 0x7d11,
++	0x00de, 0x0005, 0x20a1, 0x020b, 0x080c, 0x7697, 0x20a3, 0x0214,
++	0x20a3, 0x0018, 0x20a3, 0x0800, 0x7810, 0xa084, 0xff00, 0x20a2,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x7810, 0xa084, 0x00ff, 0x20a2, 0x7828, 0x20a2, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x60c3, 0x0018, 0x080c, 0x7d11, 0x0005, 0x00d6,
++	0x0016, 0x2f68, 0x2009, 0x0035, 0x080c, 0xa09b, 0x1904, 0x83a5,
++	0x20a1, 0x020b, 0x080c, 0x75fb, 0x20a3, 0x1300, 0x20a3, 0x0000,
++	0x7828, 0x2068, 0x681c, 0xa086, 0x0003, 0x0580, 0x7818, 0xa080,
++	0x0028, 0x2014, 0x2001, 0xb435, 0x2004, 0xd0ac, 0x11d0, 0xa286,
++	0x007e, 0x1128, 0x20a3, 0x00ff, 0x20a3, 0xfffe, 0x04b8, 0xa286,
++	0x007f, 0x1128, 0x20a3, 0x00ff, 0x20a3, 0xfffd, 0x0478, 0xd2bc,
++	0x0180, 0xa286, 0x0080, 0x1128, 0x20a3, 0x00ff, 0x20a3, 0xfffc,
++	0x0428, 0xa2e8, 0xb535, 0x2d6c, 0x6810, 0x20a2, 0x6814, 0x20a2,
++	0x00e8, 0x20a3, 0x0000, 0x6098, 0x20a2, 0x00c0, 0x2001, 0xb435,
++	0x2004, 0xd0ac, 0x1138, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082,
++	0x007e, 0x0240, 0x00d6, 0x2069, 0xb41c, 0x2da6, 0x8d68, 0x2da6,
++	0x00de, 0x0020, 0x20a3, 0x0000, 0x6034, 0x20a2, 0x7834, 0x20a2,
++	0x7838, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x000c,
++	0x080c, 0x7d11, 0x001e, 0x00de, 0x0005, 0x7817, 0x0001, 0x7803,
++	0x0006, 0x001e, 0x00de, 0x0005, 0x00d6, 0x0026, 0x7928, 0x2168,
++	0x691c, 0xa186, 0x0006, 0x01c0, 0xa186, 0x0003, 0x0904, 0x841b,
++	0xa186, 0x0005, 0x0904, 0x8404, 0xa186, 0x0004, 0x05b8, 0xa186,
++	0x0008, 0x0904, 0x840c, 0x7807, 0x0037, 0x7813, 0x1700, 0x080c,
++	0x8483, 0x002e, 0x00de, 0x0005, 0x080c, 0x843f, 0x2009, 0x4000,
++	0x6800, 0x0002, 0x83e5, 0x83f0, 0x83e7, 0x83f0, 0x83ec, 0x83e5,
++	0x83e5, 0x83f0, 0x83f0, 0x83f0, 0x83f0, 0x83e5, 0x83e5, 0x83e5,
++	0x83e5, 0x83e5, 0x83f0, 0x83e5, 0x83f0, 0x080c, 0x1511, 0x6820,
++	0xd0e4, 0x0110, 0xd0cc, 0x0110, 0xa00e, 0x0010, 0x2009, 0x2000,
++	0x6828, 0x20a2, 0x682c, 0x20a2, 0x0804, 0x8435, 0x080c, 0x843f,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, 0x4000, 0x6a00, 0xa286,
++	0x0002, 0x1108, 0xa00e, 0x0488, 0x04d1, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x2009, 0x4000, 0x0448, 0x0491, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x2009, 0x4000, 0xa286, 0x0005, 0x0118, 0xa286, 0x0002,
++	0x1108, 0xa00e, 0x00d0, 0x0419, 0x6810, 0x2068, 0x697c, 0x6810,
++	0xa112, 0x6980, 0x6814, 0xa103, 0x20a2, 0x22a2, 0x7928, 0xa180,
++	0x0000, 0x2004, 0xa08e, 0x0002, 0x0130, 0xa08e, 0x0004, 0x0118,
++	0x2009, 0x4000, 0x0010, 0x2009, 0x0000, 0x21a2, 0x20a3, 0x0000,
++	0x60c3, 0x0018, 0x080c, 0x7d11, 0x002e, 0x00de, 0x0005, 0x0036,
++	0x0046, 0x0056, 0x0066, 0x20a1, 0x020b, 0x080c, 0x7697, 0xa006,
++	0x20a3, 0x0200, 0x20a2, 0x7934, 0x21a2, 0x7938, 0x21a2, 0x7818,
++	0xa080, 0x0028, 0x2004, 0x2011, 0xb435, 0x2214, 0xd2ac, 0x1118,
++	0xa092, 0x007e, 0x0268, 0x00d6, 0x2069, 0xb41c, 0x2d2c, 0x8d68,
++	0x2d34, 0xa0e8, 0xb535, 0x2d6c, 0x6b10, 0x6c14, 0x00de, 0x0030,
++	0x2019, 0x0000, 0x6498, 0x2029, 0x0000, 0x6634, 0x7828, 0xa080,
++	0x0007, 0x2004, 0xa086, 0x0003, 0x1128, 0x25a2, 0x26a2, 0x23a2,
++	0x24a2, 0x0020, 0x23a2, 0x24a2, 0x25a2, 0x26a2, 0x006e, 0x005e,
++	0x004e, 0x003e, 0x0005, 0x20a1, 0x020b, 0x080c, 0x7697, 0x20a3,
++	0x0100, 0x20a3, 0x0000, 0x20a3, 0x0009, 0x7810, 0x20a2, 0x60c3,
++	0x0008, 0x080c, 0x7d11, 0x0005, 0x20a1, 0x020b, 0x080c, 0x75f3,
++	0x20a3, 0x1400, 0x20a3, 0x0000, 0x7834, 0x20a2, 0x7838, 0x20a2,
++	0x7828, 0x20a2, 0x782c, 0x20a2, 0x7830, 0xa084, 0x00ff, 0x8007,
++	0x20a2, 0x20a3, 0x0000, 0x60c3, 0x0010, 0x080c, 0x7d11, 0x0005,
++	0x20a1, 0x020b, 0x080c, 0x768f, 0x20a3, 0x0100, 0x20a3, 0x0000,
++	0x7828, 0x20a2, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x7d11,
++	0x0005, 0x0146, 0x20a1, 0x020b, 0x0031, 0x60c3, 0x0000, 0x080c,
++	0x7d11, 0x014e, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818,
++	0xa080, 0x0028, 0x2004, 0x2011, 0xb435, 0x2214, 0xd2ac, 0x1110,
++	0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085,
++	0x0300, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb41c, 0x2da6, 0x8d68,
++	0x2da6, 0x00de, 0x0078, 0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810,
++	0xa085, 0x0300, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000,
++	0x6234, 0x22a2, 0x20a3, 0x0819, 0x20a3, 0x0000, 0x080c, 0x7d00,
++	0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x7a08, 0x22a2, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x0005, 0x20a1, 0x020b, 0x0079, 0x7910, 0x21a2,
++	0x20a3, 0x0000, 0x60c3, 0x0000, 0x20e1, 0x9080, 0x60a7, 0x9575,
++	0x080c, 0x7d1b, 0x080c, 0x69cc, 0x0005, 0x0156, 0x0136, 0x0036,
++	0x00d6, 0x00e6, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7854, 0x2068,
++	0xadf0, 0x000f, 0x7210, 0xa296, 0x00c0, 0xa294, 0xfffd, 0x7212,
++	0x7214, 0xa294, 0x0300, 0x7216, 0x7100, 0xa194, 0x00ff, 0x7308,
++	0xa384, 0x00ff, 0xa08d, 0xc200, 0x7102, 0xa384, 0xff00, 0xa215,
++	0x720a, 0x7004, 0x720c, 0x700e, 0x7206, 0x20a9, 0x000a, 0x2e98,
++	0x53a6, 0x60a3, 0x0035, 0x6a38, 0xa294, 0x7000, 0xa286, 0x3000,
++	0x0110, 0x60a3, 0x0037, 0x00ee, 0x00de, 0x003e, 0x013e, 0x015e,
++	0x0005, 0x2009, 0x0092, 0x0010, 0x2009, 0x0096, 0x60ab, 0x0036,
++	0x6116, 0x0005, 0x2061, 0xbc00, 0x2a70, 0x7068, 0x704a, 0x704f,
++	0xbc00, 0x0005, 0x00e6, 0x0126, 0x2071, 0xb400, 0x2091, 0x8000,
++	0x7548, 0xa582, 0x0010, 0x0608, 0x704c, 0x2060, 0x6000, 0xa086,
++	0x0000, 0x0148, 0xace0, 0x0018, 0x705c, 0xac02, 0x1208, 0x0cb0,
++	0x2061, 0xbc00, 0x0c98, 0x6003, 0x0008, 0x8529, 0x754a, 0xaca8,
++	0x0018, 0x705c, 0xa502, 0x1230, 0x754e, 0xa085, 0x0001, 0x012e,
++	0x00ee, 0x0005, 0x704f, 0xbc00, 0x0cc0, 0xa006, 0x0cc0, 0x00e6,
++	0x2071, 0xb400, 0x7548, 0xa582, 0x0010, 0x0600, 0x704c, 0x2060,
++	0x6000, 0xa086, 0x0000, 0x0148, 0xace0, 0x0018, 0x705c, 0xac02,
++	0x1208, 0x0cb0, 0x2061, 0xbc00, 0x0c98, 0x6003, 0x0008, 0x8529,
++	0x754a, 0xaca8, 0x0018, 0x705c, 0xa502, 0x1228, 0x754e, 0xa085,
++	0x0001, 0x00ee, 0x0005, 0x704f, 0xbc00, 0x0cc8, 0xa006, 0x0cc8,
++	0xac82, 0xbc00, 0x0a0c, 0x1511, 0x2001, 0xb417, 0x2004, 0xac02,
++	0x1a0c, 0x1511, 0xa006, 0x6006, 0x600a, 0x600e, 0x6012, 0x6016,
++	0x601a, 0x601f, 0x0000, 0x6003, 0x0000, 0x6052, 0x6056, 0x6022,
++	0x6026, 0x602a, 0x602e, 0x6032, 0x6036, 0x603a, 0x603e, 0x2061,
++	0xb400, 0x6048, 0x8000, 0x604a, 0xa086, 0x0001, 0x0108, 0x0005,
++	0x0126, 0x2091, 0x8000, 0x080c, 0x7134, 0x012e, 0x0cc0, 0x601c,
++	0xa084, 0x000f, 0x0002, 0x85fe, 0x860d, 0x8628, 0x8643, 0xa0df,
++	0xa0fa, 0xa115, 0x85fe, 0x860d, 0x85fe, 0x865e, 0xa186, 0x0013,
++	0x1128, 0x080c, 0x7055, 0x080c, 0x7134, 0x0005, 0xa18e, 0x0047,
++	0x1118, 0xa016, 0x080c, 0x1856, 0x0005, 0x0066, 0x6000, 0xa0b2,
++	0x0010, 0x1a0c, 0x1511, 0x0013, 0x006e, 0x0005, 0x8626, 0x8a3e,
++	0x8bf6, 0x8626, 0x8c6b, 0x871c, 0x8626, 0x8626, 0x89d0, 0x908f,
++	0x8626, 0x8626, 0x8626, 0x8626, 0x8626, 0x8626, 0x080c, 0x1511,
++	0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1511, 0x0013, 0x006e,
++	0x0005, 0x8641, 0x96bb, 0x8641, 0x8641, 0x8641, 0x8641, 0x8641,
++	0x8641, 0x9666, 0x9827, 0x8641, 0x96e8, 0x975f, 0x96e8, 0x975f,
++	0x8641, 0x080c, 0x1511, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c,
++	0x1511, 0x0013, 0x006e, 0x0005, 0x865c, 0x90d0, 0x919a, 0x92ce,
++	0x942a, 0x865c, 0x865c, 0x865c, 0x90aa, 0x9616, 0x9619, 0x865c,
++	0x865c, 0x865c, 0x865c, 0x9643, 0x080c, 0x1511, 0x0066, 0x6000,
++	0xa0b2, 0x0010, 0x1a0c, 0x1511, 0x0013, 0x006e, 0x0005, 0x8677,
++	0x8677, 0x8677, 0x86a5, 0x86f2, 0x8677, 0x8677, 0x8677, 0x8679,
++	0x8677, 0x8677, 0x8677, 0x8677, 0x8677, 0x8677, 0x8677, 0x080c,
++	0x1511, 0xa186, 0x0003, 0x190c, 0x1511, 0x00d6, 0x6003, 0x0003,
++	0x6106, 0x6010, 0x2068, 0x684f, 0x0040, 0x687c, 0x680a, 0x6880,
++	0x680e, 0x6813, 0x0000, 0x6817, 0x0000, 0x6854, 0xa092, 0x199a,
++	0x0210, 0x2001, 0x1999, 0x8003, 0x8013, 0x8213, 0xa210, 0x6216,
++	0x00de, 0x2c10, 0x080c, 0x1f7a, 0x080c, 0x6cb5, 0x0126, 0x2091,
++	0x8000, 0x080c, 0x71f1, 0x012e, 0x0005, 0xa182, 0x0047, 0x0002,
++	0x86b1, 0x86b1, 0x86b3, 0x86cc, 0x86b1, 0x86b1, 0x86b1, 0x86b1,
++	0x86de, 0x080c, 0x1511, 0x00d6, 0x0016, 0x080c, 0x70e7, 0x080c,
++	0x71f1, 0x6003, 0x0004, 0x6110, 0x2168, 0x684f, 0x0020, 0x685c,
++	0x685a, 0x6874, 0x687e, 0x6878, 0x6882, 0x6897, 0x0000, 0x689b,
++	0x0000, 0x001e, 0x00de, 0x0005, 0x080c, 0x70e7, 0x00d6, 0x6110,
++	0x2168, 0x080c, 0x9beb, 0x0120, 0x684b, 0x0006, 0x080c, 0x53c9,
++	0x00de, 0x080c, 0x85c0, 0x080c, 0x71f1, 0x0005, 0x080c, 0x70e7,
++	0x080c, 0x2c60, 0x00d6, 0x6110, 0x2168, 0x080c, 0x9beb, 0x0120,
++	0x684b, 0x0029, 0x080c, 0x53c9, 0x00de, 0x080c, 0x85c0, 0x080c,
++	0x71f1, 0x0005, 0xa182, 0x0047, 0x0002, 0x8700, 0x870f, 0x86fe,
++	0x86fe, 0x86fe, 0x86fe, 0x86fe, 0x86fe, 0x86fe, 0x080c, 0x1511,
++	0x00d6, 0x6010, 0x2068, 0x684c, 0xc0f4, 0x684e, 0x00de, 0x20e1,
++	0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1856, 0x0005, 0x00d6,
++	0x6110, 0x2168, 0x684b, 0x0000, 0x6853, 0x0000, 0x080c, 0x53c9,
++	0x00de, 0x080c, 0x85c0, 0x0005, 0xa1b6, 0x0015, 0x1118, 0x080c,
++	0x85c0, 0x0030, 0xa1b6, 0x0016, 0x190c, 0x1511, 0x080c, 0x85c0,
++	0x0005, 0x20a9, 0x000e, 0x2e98, 0x6010, 0x20a0, 0x53a3, 0x20a9,
++	0x0006, 0x3310, 0x3420, 0x9398, 0x94a0, 0x3318, 0x3428, 0x222e,
++	0x2326, 0xa290, 0x0002, 0xa5a8, 0x0002, 0xa398, 0x0002, 0xa4a0,
++	0x0002, 0x1f04, 0x8737, 0x00e6, 0x080c, 0x9beb, 0x0130, 0x6010,
++	0x2070, 0x7007, 0x0000, 0x7037, 0x0103, 0x00ee, 0x080c, 0x85c0,
++	0x0005, 0x00d6, 0x0036, 0x7330, 0xa386, 0x0200, 0x1130, 0x6018,
++	0x2068, 0x6813, 0x00ff, 0x6817, 0xfffd, 0x6010, 0xa005, 0x0130,
++	0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6b32, 0x080c, 0x85c0,
++	0x003e, 0x00de, 0x0005, 0x0016, 0x20a9, 0x002a, 0xae80, 0x000c,
++	0x2098, 0x6010, 0xa080, 0x0002, 0x20a0, 0x53a3, 0x20a9, 0x002a,
++	0x6010, 0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x20a0, 0x53a3,
++	0x00e6, 0x6010, 0x2004, 0x2070, 0x7037, 0x0103, 0x00ee, 0x080c,
++	0x85c0, 0x001e, 0x0005, 0x0016, 0x2009, 0x0000, 0x7030, 0xa086,
++	0x0100, 0x0140, 0x7038, 0xa084, 0x00ff, 0x800c, 0x703c, 0xa084,
++	0x00ff, 0x8004, 0xa080, 0x0004, 0xa108, 0x21a8, 0xae80, 0x000c,
++	0x2098, 0x6010, 0xa080, 0x0002, 0x20a0, 0x080c, 0x4b49, 0x00e6,
++	0x080c, 0x9beb, 0x0140, 0x6010, 0x2070, 0x7007, 0x0000, 0x7034,
++	0x70b2, 0x7037, 0x0103, 0x00ee, 0x080c, 0x85c0, 0x001e, 0x0005,
++	0x00e6, 0x00d6, 0x603f, 0x0000, 0x2c68, 0x0016, 0x2009, 0x0035,
++	0x080c, 0xa09b, 0x001e, 0x1168, 0x0026, 0x6228, 0x2268, 0x002e,
++	0x2071, 0xba8c, 0x6b1c, 0xa386, 0x0003, 0x0130, 0xa386, 0x0006,
++	0x0128, 0x080c, 0x85c0, 0x0020, 0x0031, 0x0010, 0x080c, 0x8899,
++	0x00de, 0x00ee, 0x0005, 0x00f6, 0x6810, 0x2078, 0xa186, 0x0015,
++	0x0904, 0x8880, 0xa18e, 0x0016, 0x1904, 0x8897, 0x700c, 0xa08c,
++	0xff00, 0xa186, 0x1700, 0x0120, 0xa186, 0x0300, 0x1904, 0x885f,
++	0x8fff, 0x1138, 0x6800, 0xa086, 0x000f, 0x0904, 0x8843, 0x0804,
++	0x8895, 0x6808, 0xa086, 0xffff, 0x1904, 0x8882, 0x784c, 0xa084,
++	0x0060, 0xa086, 0x0020, 0x1150, 0x797c, 0x7810, 0xa106, 0x1904,
++	0x8882, 0x7980, 0x7814, 0xa106, 0x1904, 0x8882, 0x080c, 0x9da2,
++	0x6858, 0x7852, 0x784c, 0xc0dc, 0xc0f4, 0xc0d4, 0x784e, 0x0026,
++	0xa00e, 0x6a14, 0x2001, 0x000a, 0x080c, 0x6b05, 0x7854, 0xa20a,
++	0x0208, 0x8011, 0x7a56, 0x82ff, 0x002e, 0x1138, 0x00c6, 0x2d60,
++	0x080c, 0x99a2, 0x00ce, 0x0804, 0x8895, 0x00c6, 0x00d6, 0x2f68,
++	0x6838, 0xd0fc, 0x1118, 0x080c, 0x4c1e, 0x0010, 0x080c, 0x4e0a,
++	0x00de, 0x00ce, 0x1904, 0x8882, 0x00c6, 0x2d60, 0x080c, 0x85c0,
++	0x00ce, 0x0804, 0x8895, 0x00c6, 0x080c, 0x9e67, 0x0190, 0x6013,
++	0x0000, 0x6818, 0x601a, 0x080c, 0x9fb8, 0x601f, 0x0003, 0x6904,
++	0x00c6, 0x2d60, 0x080c, 0x85c0, 0x00ce, 0x080c, 0x85ef, 0x00ce,
++	0x04e0, 0x2001, 0xb6b8, 0x2004, 0x683e, 0x00ce, 0x04b0, 0x7008,
++	0xa086, 0x000b, 0x11a0, 0x6018, 0x200c, 0xc1bc, 0x2102, 0x00c6,
++	0x2d60, 0x7853, 0x0003, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f,
++	0x0002, 0x080c, 0x6c52, 0x080c, 0x7134, 0x00ce, 0x00f0, 0x700c,
++	0xa086, 0x2a00, 0x1138, 0x2001, 0xb6b8, 0x2004, 0x683e, 0x00a8,
++	0x0481, 0x00a8, 0x8fff, 0x090c, 0x1511, 0x00c6, 0x00d6, 0x2d60,
++	0x2f68, 0x6837, 0x0103, 0x684b, 0x0003, 0x080c, 0x9896, 0x080c,
++	0x9da2, 0x080c, 0x9dae, 0x00de, 0x00ce, 0x080c, 0x85c0, 0x00fe,
++	0x0005, 0xa186, 0x0015, 0x1128, 0x2001, 0xb6b8, 0x2004, 0x683e,
++	0x0068, 0xa18e, 0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c,
++	0xb2bd, 0x080c, 0x6ab4, 0x080c, 0x85c0, 0x00ce, 0x080c, 0x85c0,
++	0x0005, 0x0026, 0x0036, 0x0046, 0x7228, 0x7c80, 0x7b7c, 0xd2f4,
++	0x0130, 0x2001, 0xb6b8, 0x2004, 0x683e, 0x0804, 0x8913, 0x00c6,
++	0x2d60, 0x080c, 0x98b6, 0x00ce, 0x6804, 0xa086, 0x0050, 0x1168,
++	0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c,
++	0x6c52, 0x080c, 0x7134, 0x00ce, 0x04f0, 0x6800, 0xa086, 0x000f,
++	0x01c8, 0x8fff, 0x090c, 0x1511, 0x6820, 0xd0dc, 0x1198, 0x6800,
++	0xa086, 0x0004, 0x1198, 0x784c, 0xd0ac, 0x0180, 0x784c, 0xc0dc,
++	0xc0f4, 0x784e, 0x7850, 0xc0f4, 0xc0fc, 0x7852, 0x2001, 0x0001,
++	0x682e, 0x00e0, 0x2001, 0x0007, 0x682e, 0x00c0, 0x784c, 0xd0b4,
++	0x1130, 0xd0ac, 0x0db8, 0x784c, 0xd0f4, 0x1da0, 0x0c38, 0xd2ec,
++	0x1d88, 0x7024, 0xa306, 0x1118, 0x7020, 0xa406, 0x0d58, 0x7020,
++	0x6836, 0x7024, 0x683a, 0x2001, 0x0005, 0x682e, 0x080c, 0x9ef4,
++	0x080c, 0x7134, 0x0010, 0x080c, 0x85c0, 0x004e, 0x003e, 0x002e,
++	0x0005, 0x00e6, 0x00d6, 0x0026, 0x6034, 0x2068, 0x6a1c, 0xa286,
++	0x0007, 0x0904, 0x8977, 0xa286, 0x0002, 0x0904, 0x8977, 0xa286,
++	0x0000, 0x0904, 0x8977, 0x6808, 0x6338, 0xa306, 0x1904, 0x8977,
++	0x2071, 0xba8c, 0xa186, 0x0015, 0x05e0, 0xa18e, 0x0016, 0x1190,
++	0x6030, 0xa084, 0x00ff, 0xa086, 0x0001, 0x1160, 0x700c, 0xa086,
++	0x2a00, 0x1140, 0x6034, 0xa080, 0x0008, 0x200c, 0xc1dd, 0xc1f5,
++	0x2102, 0x0438, 0x00c6, 0x6034, 0x2060, 0x6104, 0xa186, 0x004b,
++	0x01a0, 0xa186, 0x004c, 0x0188, 0xa186, 0x004d, 0x0170, 0xa186,
++	0x004e, 0x0158, 0xa186, 0x0052, 0x0140, 0x6010, 0x2068, 0x080c,
++	0x9beb, 0x090c, 0x1511, 0x6853, 0x0003, 0x6007, 0x0085, 0x6003,
++	0x000b, 0x601f, 0x0002, 0x080c, 0x6c52, 0x080c, 0x7134, 0x00ce,
++	0x0030, 0x6034, 0x2070, 0x2001, 0xb6b8, 0x2004, 0x703e, 0x080c,
++	0x85c0, 0x002e, 0x00de, 0x00ee, 0x0005, 0x00d6, 0x20a9, 0x000e,
++	0x2e98, 0x6010, 0x20a0, 0x53a3, 0xa1b6, 0x0015, 0x1558, 0x6018,
++	0x2068, 0x0156, 0x0036, 0x0026, 0xae90, 0x000c, 0xa290, 0x0004,
++	0x20a9, 0x0004, 0xad98, 0x000a, 0x080c, 0x907a, 0x002e, 0x003e,
++	0x015e, 0x11d8, 0x0156, 0x0036, 0x0026, 0xae90, 0x000c, 0xa290,
++	0x0008, 0x20a9, 0x0004, 0xad98, 0x0006, 0x080c, 0x907a, 0x002e,
++	0x003e, 0x015e, 0x1150, 0x7038, 0x680a, 0x703c, 0x680e, 0x6800,
++	0xc08d, 0x6802, 0x00de, 0x0804, 0x8743, 0x080c, 0x2c60, 0x00c6,
++	0x080c, 0x856a, 0x2f00, 0x601a, 0x6013, 0x0000, 0x601f, 0x0001,
++	0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x080c, 0x4ebe,
++	0x080c, 0x4eeb, 0x080c, 0x6c98, 0x080c, 0x7134, 0x00ce, 0x0c10,
++	0x2100, 0xa1b2, 0x0080, 0x1a0c, 0x1511, 0xa1b2, 0x0040, 0x1a04,
++	0x8a34, 0x0002, 0x8a28, 0x8a1c, 0x8a28, 0x8a28, 0x8a28, 0x8a28,
++	0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a,
++	0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a,
++	0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a,
++	0x8a1a, 0x8a28, 0x8a1a, 0x8a28, 0x8a28, 0x8a1a, 0x8a1a, 0x8a1a,
++	0x8a1a, 0x8a1a, 0x8a28, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a,
++	0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a28, 0x8a28, 0x8a1a, 0x8a1a,
++	0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a28,
++	0x8a1a, 0x8a1a, 0x080c, 0x1511, 0x6003, 0x0001, 0x6106, 0x080c,
++	0x6c98, 0x0126, 0x2091, 0x8000, 0x080c, 0x7134, 0x012e, 0x0005,
++	0x6003, 0x0001, 0x6106, 0x080c, 0x6c98, 0x0126, 0x2091, 0x8000,
++	0x080c, 0x7134, 0x012e, 0x0005, 0x2600, 0x0002, 0x8a28, 0x8a28,
++	0x8a3c, 0x8a28, 0x8a28, 0x8a3c, 0x080c, 0x1511, 0x6004, 0xa0b2,
++	0x0080, 0x1a0c, 0x1511, 0xa1b6, 0x0013, 0x0904, 0x8aee, 0xa1b6,
++	0x0027, 0x1904, 0x8ab4, 0x080c, 0x7055, 0x6004, 0x080c, 0x9dd8,
++	0x0190, 0x080c, 0x9de9, 0x0904, 0x8aae, 0xa08e, 0x0021, 0x0904,
++	0x8ab1, 0xa08e, 0x0022, 0x0904, 0x8aae, 0xa08e, 0x003d, 0x0904,
++	0x8ab1, 0x0804, 0x8aa7, 0x080c, 0x2c86, 0x2001, 0x0007, 0x080c,
++	0x4ebe, 0x6018, 0xa080, 0x0028, 0x200c, 0x080c, 0x8bbc, 0xa186,
++	0x007e, 0x1148, 0x2001, 0xb435, 0x2014, 0xc285, 0x080c, 0x5a90,
++	0x1108, 0xc2ad, 0x2202, 0x0016, 0x0026, 0x0036, 0x2110, 0x0026,
++	0x2019, 0x0028, 0x080c, 0x823c, 0x002e, 0x080c, 0xb310, 0x003e,
++	0x002e, 0x001e, 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, 0x0028,
++	0x080c, 0x6dba, 0x0076, 0x2039, 0x0000, 0x080c, 0x6cc7, 0x00c6,
++	0x6018, 0xa065, 0x0110, 0x080c, 0x516b, 0x00ce, 0x2c08, 0x080c,
++	0xae05, 0x007e, 0x003e, 0x002e, 0x001e, 0x080c, 0x4f2d, 0x080c,
++	0x9fb0, 0x080c, 0x85c0, 0x080c, 0x7134, 0x0005, 0x080c, 0x8bbc,
++	0x0cb0, 0x080c, 0x8bea, 0x0c98, 0xa186, 0x0014, 0x1db0, 0x080c,
++	0x7055, 0x080c, 0x2c60, 0x080c, 0x9dd8, 0x1188, 0x080c, 0x2c86,
++	0x6018, 0xa080, 0x0028, 0x200c, 0x080c, 0x8bbc, 0xa186, 0x007e,
++	0x1128, 0x2001, 0xb435, 0x200c, 0xc185, 0x2102, 0x08c0, 0x080c,
++	0x9de9, 0x1118, 0x080c, 0x8bbc, 0x0890, 0x6004, 0xa08e, 0x0032,
++	0x1158, 0x00e6, 0x00f6, 0x2071, 0xb482, 0x2079, 0x0000, 0x080c,
++	0x2f93, 0x00fe, 0x00ee, 0x0818, 0x6004, 0xa08e, 0x0021, 0x0d50,
++	0xa08e, 0x0022, 0x090c, 0x8bbc, 0x0804, 0x8aa7, 0xa0b2, 0x0040,
++	0x1a04, 0x8bb1, 0x2008, 0x0002, 0x8b36, 0x8b37, 0x8b3a, 0x8b3d,
++	0x8b40, 0x8b43, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34,
++	0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34,
++	0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34,
++	0x8b34, 0x8b34, 0x8b46, 0x8b55, 0x8b34, 0x8b57, 0x8b55, 0x8b34,
++	0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b55, 0x8b55, 0x8b34, 0x8b34,
++	0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b91, 0x8b55,
++	0x8b34, 0x8b51, 0x8b34, 0x8b34, 0x8b34, 0x8b52, 0x8b34, 0x8b34,
++	0x8b34, 0x8b55, 0x8b88, 0x8b34, 0x080c, 0x1511, 0x00f0, 0x2001,
++	0x000b, 0x0460, 0x2001, 0x0003, 0x0448, 0x2001, 0x0005, 0x0430,
++	0x2001, 0x0001, 0x0418, 0x2001, 0x0009, 0x0400, 0x080c, 0x7055,
++	0x6003, 0x0005, 0x2001, 0xb6b8, 0x2004, 0x603e, 0x080c, 0x7134,
++	0x00a0, 0x0018, 0x0010, 0x080c, 0x4ebe, 0x0804, 0x8ba2, 0x080c,
++	0x7055, 0x2001, 0xb6b6, 0x2004, 0x6016, 0x2001, 0xb6b8, 0x2004,
++	0x603e, 0x6003, 0x0004, 0x080c, 0x7134, 0x0005, 0x080c, 0x4ebe,
++	0x080c, 0x7055, 0x6003, 0x0002, 0x2001, 0xb6b8, 0x2004, 0x603e,
++	0x0036, 0x2019, 0xb45d, 0x2304, 0xa084, 0xff00, 0x1120, 0x2001,
++	0xb6b6, 0x201c, 0x0040, 0x8007, 0xa09a, 0x0004, 0x0ec0, 0x8003,
++	0x801b, 0x831b, 0xa318, 0x6316, 0x003e, 0x080c, 0x7134, 0x08e8,
++	0x080c, 0x7055, 0x080c, 0x9fb0, 0x080c, 0x85c0, 0x080c, 0x7134,
++	0x08a0, 0x00e6, 0x00f6, 0x2071, 0xb482, 0x2079, 0x0000, 0x080c,
++	0x2f93, 0x00fe, 0x00ee, 0x080c, 0x7055, 0x080c, 0x85c0, 0x080c,
++	0x7134, 0x0818, 0x080c, 0x7055, 0x2001, 0xb6b8, 0x2004, 0x603e,
++	0x6003, 0x0002, 0x2001, 0xb6b6, 0x2004, 0x6016, 0x080c, 0x7134,
++	0x0005, 0x2600, 0x2008, 0x0002, 0x8bba, 0x8bba, 0x8bba, 0x8ba2,
++	0x8ba2, 0x8bba, 0x080c, 0x1511, 0x00e6, 0x0026, 0x0016, 0x080c,
++	0x9beb, 0x0508, 0x6010, 0x2070, 0x7034, 0xa086, 0x0139, 0x1148,
++	0x2001, 0x0030, 0x2009, 0x0000, 0x2011, 0x4005, 0x080c, 0xa067,
++	0x0090, 0x7038, 0xd0fc, 0x0178, 0x7007, 0x0000, 0x0016, 0x6004,
++	0xa08e, 0x0021, 0x0160, 0xa08e, 0x003d, 0x0148, 0x001e, 0x7037,
++	0x0103, 0x7033, 0x0100, 0x001e, 0x002e, 0x00ee, 0x0005, 0x001e,
++	0x0009, 0x0cc8, 0x00e6, 0xacf0, 0x0004, 0x2e74, 0x7000, 0x2070,
++	0x7037, 0x0103, 0x7023, 0x8001, 0x00ee, 0x0005, 0x00d6, 0x6618,
++	0x2668, 0x6804, 0xa084, 0x00ff, 0x00de, 0xa0b2, 0x000c, 0x1a0c,
++	0x1511, 0x6604, 0xa6b6, 0x0043, 0x1120, 0x080c, 0xa023, 0x0804,
++	0x8c5b, 0x6604, 0xa6b6, 0x0033, 0x1120, 0x080c, 0x9fd3, 0x0804,
++	0x8c5b, 0x6604, 0xa6b6, 0x0028, 0x1120, 0x080c, 0x9e19, 0x0804,
++	0x8c5b, 0x6604, 0xa6b6, 0x0029, 0x1118, 0x080c, 0x9e30, 0x04d8,
++	0x6604, 0xa6b6, 0x001f, 0x1118, 0x080c, 0x8729, 0x04a0, 0x6604,
++	0xa6b6, 0x0000, 0x1118, 0x080c, 0x897d, 0x0468, 0x6604, 0xa6b6,
++	0x0022, 0x1118, 0x080c, 0x8751, 0x0430, 0x6604, 0xa6b6, 0x0035,
++	0x1118, 0x080c, 0x87b8, 0x00f8, 0x6604, 0xa6b6, 0x0039, 0x1118,
++	0x080c, 0x8919, 0x00c0, 0x6604, 0xa6b6, 0x003d, 0x1118, 0x080c,
++	0x876b, 0x0088, 0x6604, 0xa6b6, 0x0044, 0x1118, 0x080c, 0x878b,
++	0x0050, 0xa1b6, 0x0015, 0x1110, 0x0053, 0x0028, 0xa1b6, 0x0016,
++	0x1118, 0x0804, 0x8e1f, 0x0005, 0x080c, 0x8606, 0x0ce0, 0x8c82,
++	0x8c85, 0x8c82, 0x8cc7, 0x8c82, 0x8dac, 0x8e2d, 0x8c82, 0x8c82,
++	0x8dfb, 0x8c82, 0x8e0f, 0xa1b6, 0x0048, 0x0140, 0x20e1, 0x0005,
++	0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1856, 0x0005, 0x00e6, 0xacf0,
++	0x0004, 0x2e74, 0x7000, 0x2070, 0x7037, 0x0103, 0x00ee, 0x080c,
++	0x85c0, 0x0005, 0xe000, 0xe000, 0x0005, 0x00e6, 0x2071, 0xb400,
++	0x7084, 0xa086, 0x0074, 0x1530, 0x080c, 0xaddc, 0x11b0, 0x00d6,
++	0x6018, 0x2068, 0x7030, 0xd08c, 0x0128, 0x6800, 0xd0bc, 0x0110,
++	0xc0c5, 0x6802, 0x00d9, 0x00de, 0x2001, 0x0006, 0x080c, 0x4ebe,
++	0x080c, 0x2c86, 0x080c, 0x85c0, 0x0078, 0x2001, 0x000a, 0x080c,
++	0x4ebe, 0x080c, 0x2c86, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c,
++	0x6c98, 0x0010, 0x080c, 0x8d99, 0x00ee, 0x0005, 0x6800, 0xd084,
++	0x0168, 0x2001, 0x0000, 0x080c, 0x4eac, 0x2069, 0xb452, 0x6804,
++	0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c, 0x4eeb, 0x0005, 0x00d6,
++	0x2011, 0xb421, 0x2204, 0xa086, 0x0074, 0x1904, 0x8d96, 0x6018,
++	0x2068, 0x6aa0, 0xa286, 0x007e, 0x1120, 0x080c, 0x8f42, 0x0804,
++	0x8d35, 0x080c, 0x8f38, 0x6018, 0x2068, 0xa080, 0x0028, 0x2014,
++	0xa286, 0x0080, 0x11c0, 0x6813, 0x00ff, 0x6817, 0xfffc, 0x6010,
++	0xa005, 0x0138, 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6833,
++	0x0200, 0x2001, 0x0006, 0x080c, 0x4ebe, 0x080c, 0x2c86, 0x080c,
++	0x85c0, 0x0804, 0x8d97, 0x00e6, 0x2071, 0xb435, 0x2e04, 0xd09c,
++	0x0188, 0x2071, 0xba80, 0x7108, 0x720c, 0xa18c, 0x00ff, 0x1118,
++	0xa284, 0xff00, 0x0138, 0x6018, 0x2070, 0x70a0, 0xd0bc, 0x1110,
++	0x7112, 0x7216, 0x00ee, 0x6010, 0xa005, 0x0198, 0x2068, 0x6838,
++	0xd0f4, 0x0178, 0x6834, 0xa084, 0x00ff, 0xa086, 0x0039, 0x1958,
++	0x2001, 0x0000, 0x2009, 0x0000, 0x2011, 0x4000, 0x080c, 0xa067,
++	0x0840, 0x2001, 0x0004, 0x080c, 0x4ebe, 0x6003, 0x0001, 0x6007,
++	0x0003, 0x080c, 0x6c98, 0x0804, 0x8d97, 0x685c, 0xd0e4, 0x01d8,
++	0x080c, 0x9f63, 0x080c, 0x5a90, 0x0118, 0xd0dc, 0x1904, 0x8cf1,
++	0x2011, 0xb435, 0x2204, 0xc0ad, 0x2012, 0x2001, 0xb68f, 0x2004,
++	0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, 0x2838, 0x78e2,
++	0x00fe, 0x0804, 0x8cf1, 0x080c, 0x9f99, 0x2011, 0xb435, 0x2204,
++	0xc0a5, 0x2012, 0x0006, 0x080c, 0xaefe, 0x000e, 0x1904, 0x8cf1,
++	0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, 0x4ebe, 0x2001, 0x0000,
++	0x080c, 0x4eac, 0x00c6, 0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100,
++	0x79ea, 0x7932, 0x7936, 0x00fe, 0x080c, 0x280d, 0x00f6, 0x2079,
++	0xb400, 0x7976, 0x2100, 0x2009, 0x0000, 0x080c, 0x27e3, 0x7952,
++	0x00fe, 0x8108, 0x080c, 0x4f0e, 0x2c00, 0x00ce, 0x1904, 0x8cf1,
++	0x601a, 0x2001, 0x0002, 0x080c, 0x4ebe, 0x601f, 0x0001, 0x6003,
++	0x0001, 0x6007, 0x0002, 0x080c, 0x6c98, 0x0008, 0x0011, 0x00de,
++	0x0005, 0x2001, 0x0007, 0x080c, 0x4ebe, 0x2001, 0xb400, 0x2004,
++	0xa086, 0x0003, 0x1120, 0x2001, 0x0007, 0x080c, 0x4eeb, 0x080c,
++	0x2c86, 0x080c, 0x85c0, 0x0005, 0x00e6, 0x0026, 0x0016, 0x2071,
++	0xb400, 0x7084, 0xa086, 0x0014, 0x15f0, 0x7000, 0xa086, 0x0003,
++	0x1128, 0x6010, 0xa005, 0x1110, 0x080c, 0x3efc, 0x00d6, 0x6018,
++	0x2068, 0x080c, 0x500c, 0x080c, 0x8cb6, 0x00de, 0x080c, 0x8ff1,
++	0x1550, 0x00d6, 0x6018, 0x2068, 0x6890, 0x00de, 0xa005, 0x0518,
++	0x2001, 0x0006, 0x080c, 0x4ebe, 0x00e6, 0x6010, 0xa075, 0x01a8,
++	0x7034, 0xa084, 0x00ff, 0xa086, 0x0039, 0x1148, 0x2001, 0x0000,
++	0x2009, 0x0000, 0x2011, 0x4000, 0x080c, 0xa067, 0x0030, 0x7007,
++	0x0000, 0x7037, 0x0103, 0x7033, 0x0200, 0x00ee, 0x080c, 0x2c86,
++	0x080c, 0x85c0, 0x0020, 0x080c, 0x8bbc, 0x080c, 0x8d99, 0x001e,
++	0x002e, 0x00ee, 0x0005, 0x2011, 0xb421, 0x2204, 0xa086, 0x0014,
++	0x1158, 0x2001, 0x0002, 0x080c, 0x4ebe, 0x6003, 0x0001, 0x6007,
++	0x0001, 0x080c, 0x6c98, 0x0010, 0x080c, 0x8d99, 0x0005, 0x2011,
++	0xb421, 0x2204, 0xa086, 0x0004, 0x1138, 0x2001, 0x0007, 0x080c,
++	0x4ebe, 0x080c, 0x85c0, 0x0010, 0x080c, 0x8d99, 0x0005, 0x000b,
++	0x0005, 0x8c82, 0x8e38, 0x8c82, 0x8e6c, 0x8c82, 0x8ef4, 0x8e2d,
++	0x8c82, 0x8c82, 0x8f07, 0x8c82, 0x8f17, 0x6604, 0xa686, 0x0003,
++	0x0904, 0x8dac, 0xa6b6, 0x001e, 0x1110, 0x080c, 0x85c0, 0x0005,
++	0x00d6, 0x00c6, 0x080c, 0x8f27, 0x1178, 0x2001, 0x0000, 0x080c,
++	0x4eac, 0x2001, 0x0002, 0x080c, 0x4ebe, 0x6003, 0x0001, 0x6007,
++	0x0002, 0x080c, 0x6c98, 0x00e8, 0x2009, 0xba8e, 0x2104, 0xa086,
++	0x0009, 0x1160, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005,
++	0x0170, 0x8001, 0x6842, 0x6017, 0x000a, 0x0058, 0x2009, 0xba8f,
++	0x2104, 0xa084, 0xff00, 0xa086, 0x1900, 0x1108, 0x08d0, 0x080c,
++	0x8d99, 0x00ce, 0x00de, 0x0005, 0x0026, 0x2011, 0x0000, 0x080c,
++	0x8f35, 0x00d6, 0x2069, 0xb69e, 0x2d04, 0xa005, 0x0168, 0x6018,
++	0x2068, 0x68a0, 0xa086, 0x007e, 0x1138, 0x2069, 0xb41d, 0x2d04,
++	0x8000, 0x206a, 0x00de, 0x0010, 0x00de, 0x0078, 0x2001, 0x0000,
++	0x080c, 0x4eac, 0x2001, 0x0002, 0x080c, 0x4ebe, 0x6003, 0x0001,
++	0x6007, 0x0002, 0x080c, 0x6c98, 0x0468, 0x00d6, 0x6010, 0x2068,
++	0x080c, 0x9beb, 0x00de, 0x0108, 0x6a34, 0x080c, 0x8bbc, 0x2009,
++	0xba8e, 0x2134, 0xa6b4, 0x00ff, 0xa686, 0x0005, 0x01e8, 0xa686,
++	0x000b, 0x01b0, 0x2009, 0xba8f, 0x2104, 0xa084, 0xff00, 0x1118,
++	0xa686, 0x0009, 0x0188, 0xa086, 0x1900, 0x1150, 0xa686, 0x0009,
++	0x0158, 0x2001, 0x0004, 0x080c, 0x4ebe, 0x080c, 0x85c0, 0x0010,
++	0x080c, 0x8d99, 0x002e, 0x0005, 0x00d6, 0xa286, 0x0139, 0x0160,
++	0x6010, 0x2068, 0x080c, 0x9beb, 0x0148, 0x6834, 0xa086, 0x0139,
++	0x0118, 0x6838, 0xd0fc, 0x0110, 0x00de, 0x0c50, 0x6018, 0x2068,
++	0x6840, 0xa084, 0x00ff, 0xa005, 0x0140, 0x8001, 0x6842, 0x6017,
++	0x000a, 0x6007, 0x0016, 0x00de, 0x08e8, 0x68a0, 0xa086, 0x007e,
++	0x1138, 0x00e6, 0x2071, 0xb400, 0x080c, 0x4b80, 0x00ee, 0x0010,
++	0x080c, 0x2c60, 0x00de, 0x0860, 0x080c, 0x8f35, 0x1158, 0x2001,
++	0x0004, 0x080c, 0x4ebe, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c,
++	0x6c98, 0x0020, 0x080c, 0x8bbc, 0x080c, 0x8d99, 0x0005, 0x0469,
++	0x1158, 0x2001, 0x0008, 0x080c, 0x4ebe, 0x6003, 0x0001, 0x6007,
++	0x0005, 0x080c, 0x6c98, 0x0010, 0x080c, 0x8d99, 0x0005, 0x00e9,
++	0x1158, 0x2001, 0x000a, 0x080c, 0x4ebe, 0x6003, 0x0001, 0x6007,
++	0x0001, 0x080c, 0x6c98, 0x0010, 0x080c, 0x8d99, 0x0005, 0x2009,
++	0xba8e, 0x2104, 0xa086, 0x0003, 0x1138, 0x2009, 0xba8f, 0x2104,
++	0xa084, 0xff00, 0xa086, 0x2a00, 0x0005, 0xa085, 0x0001, 0x0005,
++	0x00c6, 0x0016, 0xac88, 0x0006, 0x2164, 0x080c, 0x4f79, 0x001e,
++	0x00ce, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6018,
++	0x2068, 0x2071, 0xb435, 0x2e04, 0xa085, 0x0003, 0x2072, 0x080c,
++	0x8fc6, 0x0560, 0x2009, 0xb435, 0x2104, 0xc0cd, 0x200a, 0x2001,
++	0xb453, 0x2004, 0xd0a4, 0x0158, 0xa006, 0x2020, 0x2009, 0x002a,
++	0x080c, 0xb06b, 0x2001, 0xb40c, 0x200c, 0xc195, 0x2102, 0x2019,
++	0x002a, 0x2009, 0x0001, 0x080c, 0x2c33, 0x2071, 0xb400, 0x080c,
++	0x2a7e, 0x00c6, 0x0156, 0x20a9, 0x0081, 0x2009, 0x007f, 0x080c,
++	0x2d5b, 0x8108, 0x1f04, 0x8f77, 0x015e, 0x00ce, 0x080c, 0x8f38,
++	0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071, 0xba80, 0x2079, 0x0100,
++	0x2e04, 0xa084, 0x00ff, 0x2069, 0xb41c, 0x206a, 0x78e6, 0x0006,
++	0x8e70, 0x2e04, 0x2069, 0xb41d, 0x206a, 0x78ea, 0x7832, 0x7836,
++	0x2010, 0xa084, 0xff00, 0x001e, 0xa105, 0x2009, 0xb428, 0x200a,
++	0x2200, 0xa084, 0x00ff, 0x2008, 0x080c, 0x280d, 0x080c, 0x5a90,
++	0x0170, 0x2069, 0xba8e, 0x2071, 0xb6b2, 0x6810, 0x2072, 0x6814,
++	0x7006, 0x6818, 0x700a, 0x681c, 0x700e, 0x080c, 0x9f63, 0x0040,
++	0x2001, 0x0006, 0x080c, 0x4ebe, 0x080c, 0x2c86, 0x080c, 0x85c0,
++	0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x0026, 0x0036,
++	0x00e6, 0x0156, 0x2019, 0xb428, 0x231c, 0x83ff, 0x01e8, 0x2071,
++	0xba80, 0x2e14, 0xa294, 0x00ff, 0x7004, 0xa084, 0xff00, 0xa205,
++	0xa306, 0x1190, 0x2011, 0xba96, 0xad98, 0x000a, 0x20a9, 0x0004,
++	0x080c, 0x907a, 0x1148, 0x2011, 0xba9a, 0xad98, 0x0006, 0x20a9,
++	0x0004, 0x080c, 0x907a, 0x1100, 0x015e, 0x00ee, 0x003e, 0x002e,
++	0x0005, 0x00e6, 0x2071, 0xba8c, 0x7004, 0xa086, 0x0014, 0x11a8,
++	0x7008, 0xa086, 0x0800, 0x1188, 0x700c, 0xd0ec, 0x0160, 0xa084,
++	0x0f00, 0xa086, 0x0100, 0x1138, 0x7024, 0xd0a4, 0x1110, 0xd0ac,
++	0x0110, 0xa006, 0x0010, 0xa085, 0x0001, 0x00ee, 0x0005, 0x00e6,
++	0x00d6, 0x00c6, 0x0076, 0x0056, 0x0046, 0x0026, 0x0006, 0x0126,
++	0x2091, 0x8000, 0x2029, 0xb6e9, 0x252c, 0x2021, 0xb6ef, 0x2424,
++	0x2061, 0xbc00, 0x2071, 0xb400, 0x7248, 0x7068, 0xa202, 0x16f0,
++	0x080c, 0xb093, 0x05a0, 0x671c, 0xa786, 0x0001, 0x0580, 0xa786,
++	0x0007, 0x0568, 0x2500, 0xac06, 0x0550, 0x2400, 0xac06, 0x0538,
++	0x00c6, 0x6000, 0xa086, 0x0004, 0x1110, 0x080c, 0x1944, 0xa786,
++	0x0008, 0x1148, 0x080c, 0x9de9, 0x1130, 0x00ce, 0x080c, 0x8bbc,
++	0x080c, 0x9dae, 0x00a0, 0x6010, 0x2068, 0x080c, 0x9beb, 0x0160,
++	0xa786, 0x0003, 0x11e8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000,
++	0x080c, 0x53c9, 0x080c, 0x9da2, 0x080c, 0x9dae, 0x00ce, 0xace0,
++	0x0018, 0x705c, 0xac02, 0x1210, 0x0804, 0x9024, 0x012e, 0x000e,
++	0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x0005,
++	0xa786, 0x0006, 0x1118, 0x080c, 0xb01c, 0x0c30, 0xa786, 0x000a,
++	0x09e0, 0x08c8, 0x220c, 0x2304, 0xa106, 0x1130, 0x8210, 0x8318,
++	0x1f04, 0x907a, 0xa006, 0x0005, 0x2304, 0xa102, 0x0218, 0x2001,
++	0x0001, 0x0010, 0x2001, 0x0000, 0xa18d, 0x0001, 0x0005, 0x6004,
++	0xa08a, 0x0080, 0x1a0c, 0x1511, 0x080c, 0x9dd8, 0x0120, 0x080c,
++	0x9de9, 0x0168, 0x0028, 0x080c, 0x2c86, 0x080c, 0x9de9, 0x0138,
++	0x080c, 0x7055, 0x080c, 0x85c0, 0x080c, 0x7134, 0x0005, 0x080c,
++	0x8bbc, 0x0cb0, 0xa182, 0x0040, 0x0002, 0x90c0, 0x90c0, 0x90c0,
++	0x90c0, 0x90c0, 0x90c0, 0x90c0, 0x90c0, 0x90c0, 0x90c0, 0x90c0,
++	0x90c2, 0x90c2, 0x90c2, 0x90c2, 0x90c0, 0x90c0, 0x90c0, 0x90c2,
++	0x080c, 0x1511, 0x600b, 0xffff, 0x6003, 0x0001, 0x6106, 0x080c,
++	0x6c52, 0x0126, 0x2091, 0x8000, 0x080c, 0x7134, 0x012e, 0x0005,
++	0xa186, 0x0013, 0x1128, 0x6004, 0xa082, 0x0040, 0x0804, 0x915c,
++	0xa186, 0x0027, 0x11e8, 0x080c, 0x7055, 0x080c, 0x2c60, 0x00d6,
++	0x6110, 0x2168, 0x080c, 0x9beb, 0x0168, 0x6837, 0x0103, 0x684b,
++	0x0029, 0x6847, 0x0000, 0x694c, 0xc1c5, 0x694e, 0x080c, 0x53c9,
++	0x080c, 0x9da2, 0x00de, 0x080c, 0x85c0, 0x080c, 0x7134, 0x0005,
++	0xa186, 0x0014, 0x1120, 0x6004, 0xa082, 0x0040, 0x0428, 0xa186,
++	0x0046, 0x0138, 0xa186, 0x0045, 0x0120, 0xa186, 0x0047, 0x190c,
++	0x1511, 0x2001, 0x0109, 0x2004, 0xd084, 0x0198, 0x0126, 0x2091,
++	0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x6b39, 0x002e, 0x001e,
++	0x000e, 0x012e, 0xe000, 0x6000, 0xa086, 0x0002, 0x1110, 0x0804,
++	0x919a, 0x080c, 0x8606, 0x0005, 0x0002, 0x913a, 0x9138, 0x9138,
++	0x9138, 0x9138, 0x9138, 0x9138, 0x9138, 0x9138, 0x9138, 0x9138,
++	0x9155, 0x9155, 0x9155, 0x9155, 0x9138, 0x9155, 0x9138, 0x9155,
++	0x080c, 0x1511, 0x080c, 0x7055, 0x00d6, 0x6110, 0x2168, 0x080c,
++	0x9beb, 0x0168, 0x6837, 0x0103, 0x684b, 0x0006, 0x6847, 0x0000,
++	0x6850, 0xc0ec, 0x6852, 0x080c, 0x53c9, 0x080c, 0x9da2, 0x00de,
++	0x080c, 0x85c0, 0x080c, 0x7134, 0x0005, 0x080c, 0x7055, 0x080c,
++	0x85c0, 0x080c, 0x7134, 0x0005, 0x0002, 0x9172, 0x9170, 0x9170,
++	0x9170, 0x9170, 0x9170, 0x9170, 0x9170, 0x9170, 0x9170, 0x9170,
++	0x9184, 0x9184, 0x9184, 0x9184, 0x9170, 0x9193, 0x9170, 0x9184,
++	0x080c, 0x1511, 0x080c, 0x7055, 0x2001, 0xb6b8, 0x2004, 0x603e,
++	0x6003, 0x0002, 0x080c, 0x7134, 0x6010, 0xa088, 0x0013, 0x2104,
++	0xa085, 0x0400, 0x200a, 0x0005, 0x080c, 0x7055, 0x2001, 0xb6b6,
++	0x2004, 0x6016, 0x2001, 0xb6b8, 0x2004, 0x603e, 0x6003, 0x000f,
++	0x080c, 0x7134, 0x0005, 0x080c, 0x7055, 0x080c, 0x85c0, 0x080c,
++	0x7134, 0x0005, 0xa182, 0x0040, 0x0002, 0x91b0, 0x91b0, 0x91b0,
++	0x91b0, 0x91b0, 0x91b2, 0x9290, 0x92bf, 0x91b0, 0x91b0, 0x91b0,
++	0x91b0, 0x91b0, 0x91b0, 0x91b0, 0x91b0, 0x91b0, 0x91b0, 0x91b0,
++	0x080c, 0x1511, 0x00e6, 0x00d6, 0x603f, 0x0000, 0x2071, 0xba80,
++	0x7124, 0x610a, 0x2071, 0xba8c, 0x6110, 0x2168, 0x7614, 0xa6b4,
++	0x0fff, 0x86ff, 0x0904, 0x925a, 0xa68c, 0x0c00, 0x01e8, 0x00f6,
++	0x2c78, 0x080c, 0x52c6, 0x00fe, 0x0198, 0x684c, 0xd0ac, 0x0180,
++	0x6020, 0xd0dc, 0x1168, 0x6850, 0xd0bc, 0x1150, 0x7318, 0x6814,
++	0xa306, 0x1904, 0x926c, 0x731c, 0x6810, 0xa306, 0x1904, 0x926c,
++	0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002,
++	0x0518, 0xa186, 0x0028, 0x1128, 0x080c, 0x9dc7, 0x684b, 0x001c,
++	0x00e8, 0xd6dc, 0x01a0, 0x684b, 0x0015, 0x684c, 0xd0ac, 0x0170,
++	0x6914, 0x6a10, 0x2100, 0xa205, 0x0148, 0x7018, 0xa106, 0x1118,
++	0x701c, 0xa206, 0x0118, 0x6962, 0x6a5e, 0xc6dc, 0x0038, 0xd6d4,
++	0x0118, 0x684b, 0x0007, 0x0010, 0x684b, 0x0000, 0x6837, 0x0103,
++	0x6e46, 0xa01e, 0xd6c4, 0x01f0, 0xa686, 0x0100, 0x1140, 0x2001,
++	0xba99, 0x2004, 0xa005, 0x1118, 0xc6c4, 0x0804, 0x91c1, 0x7328,
++	0x732c, 0x6b56, 0x83ff, 0x0170, 0xa38a, 0x0009, 0x0210, 0x2019,
++	0x0008, 0x0036, 0x2308, 0x2019, 0xba98, 0xad90, 0x0019, 0x080c,
++	0x98a6, 0x003e, 0xd6cc, 0x0904, 0x927f, 0x7124, 0x695a, 0x81ff,
++	0x0904, 0x927f, 0xa192, 0x0021, 0x1260, 0x2071, 0xba98, 0x831c,
++	0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0x98a6, 0x080c, 0xa0c8,
++	0x04b0, 0x6838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, 0x0c68,
++	0x00f6, 0x2d78, 0x080c, 0x984b, 0x00fe, 0x080c, 0xa0c8, 0x080c,
++	0x9896, 0x0438, 0x00f6, 0x2c78, 0x080c, 0x52c6, 0x00fe, 0x0188,
++	0x684c, 0xd0ac, 0x0170, 0x6020, 0xd0dc, 0x1158, 0x6850, 0xd0bc,
++	0x1140, 0x684c, 0xd0f4, 0x1128, 0x080c, 0x9ec6, 0x00de, 0x00ee,
++	0x00f0, 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46, 0x684c, 0xd0ac,
++	0x0130, 0x6810, 0x6914, 0xa115, 0x0110, 0x080c, 0x941c, 0x080c,
++	0x53c9, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e,
++	0x080c, 0x9e94, 0x00de, 0x00ee, 0x1110, 0x080c, 0x85c0, 0x0005,
++	0x00f6, 0x6003, 0x0003, 0x2079, 0xba8c, 0x7c04, 0x7b00, 0x7e0c,
++	0x7d08, 0x6010, 0x2078, 0x784c, 0xd0ac, 0x0138, 0x6003, 0x0002,
++	0x00fe, 0x0005, 0x2130, 0x2228, 0x0058, 0x2400, 0x797c, 0xa10a,
++	0x2300, 0x7a80, 0xa213, 0x2600, 0xa102, 0x2500, 0xa203, 0x0e90,
++	0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x00fe, 0x603f, 0x0000, 0x2c10,
++	0x080c, 0x1f7a, 0x080c, 0x6cb5, 0x080c, 0x71f1, 0x0005, 0x2001,
++	0xb6b8, 0x2004, 0x603e, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005,
++	0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1856, 0x0005, 0xa182, 0x0040,
++	0x0002, 0x92e4, 0x92e4, 0x92e4, 0x92e4, 0x92e4, 0x92e6, 0x9379,
++	0x92e4, 0x92e4, 0x938f, 0x93f3, 0x92e4, 0x92e4, 0x92e4, 0x92e4,
++	0x9402, 0x92e4, 0x92e4, 0x92e4, 0x080c, 0x1511, 0x0076, 0x00f6,
++	0x00e6, 0x00d6, 0x2071, 0xba8c, 0x6110, 0x2178, 0x7614, 0xa6b4,
++	0x0fff, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c,
++	0x82ff, 0x0110, 0x8211, 0x6a3e, 0x86ff, 0x0904, 0x9374, 0xa694,
++	0xff00, 0xa284, 0x0c00, 0x0120, 0x7018, 0x7862, 0x701c, 0x785e,
++	0xa284, 0x0300, 0x0904, 0x9374, 0x080c, 0x15f4, 0x090c, 0x1511,
++	0x2d00, 0x784a, 0x7f4c, 0xc7cd, 0x7f4e, 0x6837, 0x0103, 0x7838,
++	0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00,
++	0x0120, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186,
++	0x0002, 0x0180, 0xa186, 0x0028, 0x1118, 0x684b, 0x001c, 0x0060,
++	0xd6dc, 0x0118, 0x684b, 0x0015, 0x0038, 0xd6d4, 0x0118, 0x684b,
++	0x0007, 0x0010, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854,
++	0x6856, 0xa01e, 0xd6c4, 0x0198, 0x7328, 0x732c, 0x6b56, 0x83ff,
++	0x0170, 0xa38a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308,
++	0x2019, 0xba98, 0xad90, 0x0019, 0x080c, 0x98a6, 0x003e, 0xd6cc,
++	0x01d8, 0x7124, 0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, 0x1250,
++	0x2071, 0xba98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c,
++	0x98a6, 0x0050, 0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a,
++	0x0c78, 0x2d78, 0x080c, 0x984b, 0x00de, 0x00ee, 0x00fe, 0x007e,
++	0x0005, 0x00f6, 0x6003, 0x0003, 0x2079, 0xba8c, 0x7c04, 0x7b00,
++	0x7e0c, 0x7d08, 0x6010, 0x2078, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e,
++	0x00fe, 0x2c10, 0x080c, 0x1f7a, 0x080c, 0x7d0a, 0x0005, 0x00d6,
++	0x00f6, 0x2c78, 0x080c, 0x52c6, 0x00fe, 0x0120, 0x2001, 0xb6b8,
++	0x2004, 0x603e, 0x6003, 0x0002, 0x080c, 0x70e7, 0x080c, 0x71f1,
++	0x6110, 0x2168, 0x694c, 0xd1e4, 0x0904, 0x93f1, 0xd1cc, 0x0540,
++	0x6948, 0x6838, 0xd0fc, 0x01e8, 0x0016, 0x684c, 0x0006, 0x6850,
++	0x0006, 0xad90, 0x000d, 0xa198, 0x000d, 0x2009, 0x0020, 0x0156,
++	0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, 0x1f04, 0x93b9, 0x015e,
++	0x000e, 0x6852, 0x000e, 0x684e, 0x001e, 0x2168, 0x080c, 0x161b,
++	0x0418, 0x0016, 0x080c, 0x161b, 0x00de, 0x080c, 0x9896, 0x00e0,
++	0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0180,
++	0xa086, 0x0028, 0x1118, 0x684b, 0x001c, 0x0060, 0xd1dc, 0x0118,
++	0x684b, 0x0015, 0x0038, 0xd1d4, 0x0118, 0x684b, 0x0007, 0x0010,
++	0x684b, 0x0000, 0x080c, 0x53c9, 0x080c, 0x9e94, 0x1110, 0x080c,
++	0x85c0, 0x00de, 0x0005, 0x2019, 0x0001, 0x080c, 0x7f8e, 0x6003,
++	0x0002, 0x2001, 0xb6b8, 0x2004, 0x603e, 0x080c, 0x70e7, 0x080c,
++	0x71f1, 0x0005, 0x080c, 0x70e7, 0x080c, 0x2c60, 0x00d6, 0x6110,
++	0x2168, 0x080c, 0x9beb, 0x0150, 0x6837, 0x0103, 0x684b, 0x0029,
++	0x6847, 0x0000, 0x080c, 0x53c9, 0x080c, 0x9da2, 0x00de, 0x080c,
++	0x85c0, 0x080c, 0x71f1, 0x0005, 0x684b, 0x0015, 0xd1fc, 0x0138,
++	0x684b, 0x0007, 0x8002, 0x8000, 0x810a, 0xa189, 0x0000, 0x6962,
++	0x685e, 0x0005, 0xa182, 0x0040, 0x0002, 0x9440, 0x9440, 0x9440,
++	0x9440, 0x9440, 0x9442, 0x9440, 0x94fd, 0x9509, 0x9440, 0x9440,
++	0x9440, 0x9440, 0x9440, 0x9440, 0x9440, 0x9440, 0x9440, 0x9440,
++	0x080c, 0x1511, 0x0076, 0x00f6, 0x00e6, 0x00d6, 0x2071, 0xba8c,
++	0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x00f6, 0x2c78, 0x080c,
++	0x52c6, 0x00fe, 0x0150, 0xa684, 0x00ff, 0x1138, 0x6020, 0xd0f4,
++	0x0120, 0x080c, 0x9ec6, 0x0804, 0x94f8, 0x7e46, 0x7f4c, 0xc7e5,
++	0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e,
++	0x86ff, 0x0904, 0x94ee, 0xa694, 0xff00, 0xa284, 0x0c00, 0x0120,
++	0x7018, 0x7862, 0x701c, 0x785e, 0xa284, 0x0300, 0x0904, 0x94ec,
++	0xa686, 0x0100, 0x1140, 0x2001, 0xba99, 0x2004, 0xa005, 0x1118,
++	0xc6c4, 0x7e46, 0x0c28, 0x080c, 0x15f4, 0x090c, 0x1511, 0x2d00,
++	0x784a, 0x7f4c, 0xa7bd, 0x0200, 0x7f4e, 0x6837, 0x0103, 0x7838,
++	0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00,
++	0x0120, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186,
++	0x0002, 0x0180, 0xa186, 0x0028, 0x1118, 0x684b, 0x001c, 0x0060,
++	0xd6dc, 0x0118, 0x684b, 0x0015, 0x0038, 0xd6d4, 0x0118, 0x684b,
++	0x0007, 0x0010, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854,
++	0x6856, 0xa01e, 0xd6c4, 0x0198, 0x7328, 0x732c, 0x6b56, 0x83ff,
++	0x0170, 0xa38a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308,
++	0x2019, 0xba98, 0xad90, 0x0019, 0x080c, 0x98a6, 0x003e, 0xd6cc,
++	0x01d8, 0x7124, 0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, 0x1250,
++	0x2071, 0xba98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c,
++	0x98a6, 0x0050, 0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a,
++	0x0c78, 0x2d78, 0x080c, 0x984b, 0xd6dc, 0x1110, 0xa006, 0x0030,
++	0x2001, 0x0001, 0x2071, 0xba8c, 0x7218, 0x731c, 0x080c, 0x18a9,
++	0x00de, 0x00ee, 0x00fe, 0x007e, 0x0005, 0x2001, 0xb6b8, 0x2004,
++	0x603e, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1856,
++	0x0005, 0x2001, 0xb6b8, 0x2004, 0x603e, 0x00d6, 0x6003, 0x0002,
++	0x6110, 0x2168, 0x694c, 0xd1e4, 0x0904, 0x9614, 0x603f, 0x0000,
++	0x00f6, 0x2c78, 0x080c, 0x52c6, 0x00fe, 0x0560, 0x6814, 0x6910,
++	0xa115, 0x0540, 0x6a60, 0xa206, 0x1118, 0x685c, 0xa106, 0x0510,
++	0x684c, 0xc0e4, 0x684e, 0x6847, 0x0000, 0x6863, 0x0000, 0x685f,
++	0x0000, 0x6020, 0xd0f4, 0x1158, 0x697c, 0x6810, 0xa102, 0x603a,
++	0x6980, 0x6814, 0xa103, 0x6036, 0x6020, 0xc0f5, 0x6022, 0x00d6,
++	0x6018, 0x2068, 0x683c, 0x8000, 0x683e, 0x00de, 0x080c, 0x9ec6,
++	0x0804, 0x9614, 0x694c, 0xd1cc, 0x0904, 0x95e4, 0x6948, 0x6838,
++	0xd0fc, 0x0904, 0x95a7, 0x0016, 0x684c, 0x0006, 0x6850, 0x0006,
++	0x00f6, 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x01e0,
++	0xa086, 0x0028, 0x1128, 0x684b, 0x001c, 0x784b, 0x001c, 0x00e8,
++	0xd1dc, 0x0158, 0x684b, 0x0015, 0x784b, 0x0015, 0x080c, 0xa050,
++	0x0118, 0x7944, 0xc1dc, 0x7946, 0x0080, 0xd1d4, 0x0128, 0x684b,
++	0x0007, 0x784b, 0x0007, 0x0048, 0x684c, 0xd0ac, 0x0130, 0x6810,
++	0x6914, 0xa115, 0x0110, 0x080c, 0x941c, 0x6848, 0x784a, 0x6860,
++	0x7862, 0x685c, 0x785e, 0xad90, 0x000d, 0xaf98, 0x000d, 0x2009,
++	0x0020, 0x0156, 0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, 0x1f04,
++	0x9593, 0x015e, 0x00fe, 0x000e, 0x6852, 0x000e, 0x684e, 0x080c,
++	0xa0c8, 0x001e, 0x2168, 0x080c, 0x161b, 0x0804, 0x960f, 0x0016,
++	0x00f6, 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x01e0,
++	0xa086, 0x0028, 0x1128, 0x684b, 0x001c, 0x784b, 0x001c, 0x00e8,
++	0xd1dc, 0x0158, 0x684b, 0x0015, 0x784b, 0x0015, 0x080c, 0xa050,
++	0x0118, 0x7944, 0xc1dc, 0x7946, 0x0080, 0xd1d4, 0x0128, 0x684b,
++	0x0007, 0x784b, 0x0007, 0x0048, 0x684c, 0xd0ac, 0x0130, 0x6810,
++	0x6914, 0xa115, 0x0110, 0x080c, 0x941c, 0x6860, 0x7862, 0x685c,
++	0x785e, 0x684c, 0x784e, 0x00fe, 0x080c, 0x161b, 0x00de, 0x080c,
++	0xa0c8, 0x080c, 0x9896, 0x0458, 0x6837, 0x0103, 0x6944, 0xa184,
++	0x00ff, 0xa0b6, 0x0002, 0x01b0, 0xa086, 0x0028, 0x1118, 0x684b,
++	0x001c, 0x00d8, 0xd1dc, 0x0148, 0x684b, 0x0015, 0x080c, 0xa050,
++	0x0118, 0x6944, 0xc1dc, 0x6946, 0x0080, 0xd1d4, 0x0118, 0x684b,
++	0x0007, 0x0058, 0x684b, 0x0000, 0x684c, 0xd0ac, 0x0130, 0x6810,
++	0x6914, 0xa115, 0x0110, 0x080c, 0x941c, 0x080c, 0x53c9, 0x080c,
++	0x9e94, 0x1110, 0x080c, 0x85c0, 0x00de, 0x0005, 0x080c, 0x7055,
++	0x0010, 0x080c, 0x70e7, 0x080c, 0x9beb, 0x01c0, 0x00d6, 0x6110,
++	0x2168, 0x6837, 0x0103, 0x2009, 0xb40c, 0x210c, 0xd18c, 0x11c0,
++	0xd184, 0x1198, 0x6108, 0x694a, 0xa18e, 0x0029, 0x1110, 0x080c,
++	0xb303, 0x6847, 0x0000, 0x080c, 0x53c9, 0x00de, 0x080c, 0x85c0,
++	0x080c, 0x7134, 0x080c, 0x71f1, 0x0005, 0x684b, 0x0004, 0x0c88,
++	0x684b, 0x0004, 0x0c70, 0xa182, 0x0040, 0x0002, 0x9659, 0x9659,
++	0x9659, 0x9659, 0x9659, 0x965b, 0x9659, 0x965e, 0x9659, 0x9659,
++	0x9659, 0x9659, 0x9659, 0x9659, 0x9659, 0x9659, 0x9659, 0x9659,
++	0x9659, 0x080c, 0x1511, 0x080c, 0x85c0, 0x0005, 0x0006, 0x0026,
++	0xa016, 0x080c, 0x1856, 0x002e, 0x000e, 0x0005, 0xa182, 0x0085,
++	0x0002, 0x9672, 0x9670, 0x9670, 0x967e, 0x9670, 0x9670, 0x9670,
++	0x080c, 0x1511, 0x6003, 0x0001, 0x6106, 0x080c, 0x6c52, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x7134, 0x012e, 0x0005, 0x0026, 0x0056,
++	0x00d6, 0x00e6, 0x2071, 0xba80, 0x7224, 0x6212, 0x7220, 0x080c,
++	0x9bdb, 0x01a0, 0x2268, 0x6800, 0xa086, 0x0000, 0x0178, 0x6018,
++	0x6d18, 0xa52e, 0x1158, 0x00c6, 0x2d60, 0x080c, 0x98b6, 0x00ce,
++	0x0128, 0x6803, 0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087,
++	0x6003, 0x0001, 0x080c, 0x6c52, 0x080c, 0x7134, 0x00f6, 0x2278,
++	0x080c, 0x52c6, 0x00fe, 0x0150, 0x6820, 0xd0ec, 0x0138, 0x00c6,
++	0x2260, 0x603f, 0x0000, 0x080c, 0x9ec6, 0x00ce, 0x00ee, 0x00de,
++	0x005e, 0x002e, 0x0005, 0xa186, 0x0013, 0x1160, 0x6004, 0xa08a,
++	0x0085, 0x0a0c, 0x1511, 0xa08a, 0x008c, 0x1a0c, 0x1511, 0xa082,
++	0x0085, 0x0072, 0xa186, 0x0027, 0x0120, 0xa186, 0x0014, 0x190c,
++	0x1511, 0x080c, 0x7055, 0x080c, 0x9dae, 0x080c, 0x7134, 0x0005,
++	0x96df, 0x96e1, 0x96e1, 0x96df, 0x96df, 0x96df, 0x96df, 0x080c,
++	0x1511, 0x080c, 0x7055, 0x080c, 0x9dae, 0x080c, 0x7134, 0x0005,
++	0xa186, 0x0013, 0x1128, 0x6004, 0xa082, 0x0085, 0x2008, 0x04a8,
++	0xa186, 0x0027, 0x11e8, 0x080c, 0x7055, 0x080c, 0x2c60, 0x00d6,
++	0x6010, 0x2068, 0x080c, 0x9beb, 0x0150, 0x6837, 0x0103, 0x6847,
++	0x0000, 0x684b, 0x0029, 0x080c, 0x53c9, 0x080c, 0x9da2, 0x00de,
++	0x080c, 0x85c0, 0x080c, 0x7134, 0x0005, 0x080c, 0x8606, 0x0ce0,
++	0xa186, 0x0014, 0x1dd0, 0x080c, 0x7055, 0x00d6, 0x6010, 0x2068,
++	0x080c, 0x9beb, 0x0d60, 0x6837, 0x0103, 0x6847, 0x0000, 0x684b,
++	0x0006, 0x6850, 0xc0ec, 0x6852, 0x08f0, 0x0002, 0x972f, 0x972d,
++	0x972d, 0x972d, 0x972d, 0x972d, 0x9747, 0x080c, 0x1511, 0x080c,
++	0x7055, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118,
++	0xa186, 0x0035, 0x1118, 0x2001, 0xb6b6, 0x0010, 0x2001, 0xb6b7,
++	0x2004, 0x6016, 0x6003, 0x000c, 0x080c, 0x7134, 0x0005, 0x080c,
++	0x7055, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118,
++	0xa186, 0x0035, 0x1118, 0x2001, 0xb6b6, 0x0010, 0x2001, 0xb6b7,
++	0x2004, 0x6016, 0x6003, 0x000e, 0x080c, 0x7134, 0x0005, 0xa182,
++	0x008c, 0x1220, 0xa182, 0x0085, 0x0208, 0x001a, 0x080c, 0x8606,
++	0x0005, 0x9770, 0x9770, 0x9770, 0x9770, 0x9772, 0x97cb, 0x9770,
++	0x080c, 0x1511, 0x00d6, 0x00f6, 0x2c78, 0x080c, 0x52c6, 0x00fe,
++	0x0168, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118,
++	0xa186, 0x0035, 0x1118, 0x00de, 0x0804, 0x97de, 0x080c, 0x9beb,
++	0x1118, 0x080c, 0x9da2, 0x00f0, 0x6010, 0x2068, 0x684c, 0xd0e4,
++	0x1110, 0x080c, 0x9da2, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128,
++	0x684b, 0x0006, 0xc0ec, 0x6852, 0x0048, 0xd0bc, 0x0118, 0x684b,
++	0x0002, 0x0020, 0x684b, 0x0005, 0x080c, 0x9e63, 0x6847, 0x0000,
++	0x080c, 0x53c9, 0x2c68, 0x080c, 0x856a, 0x01c0, 0x6003, 0x0001,
++	0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0xba8e, 0x210c, 0x6136,
++	0x2009, 0xba8f, 0x210c, 0x613a, 0x6918, 0x611a, 0x080c, 0x9fb8,
++	0x6950, 0x6152, 0x601f, 0x0001, 0x080c, 0x6c52, 0x2d60, 0x080c,
++	0x85c0, 0x00de, 0x0005, 0x00f6, 0x2c78, 0x080c, 0x52c6, 0x00fe,
++	0x0598, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0035, 0x0130,
++	0xa186, 0x001e, 0x0118, 0xa186, 0x0039, 0x1530, 0x00d6, 0x2c68,
++	0x080c, 0xa09b, 0x1904, 0x9823, 0x080c, 0x856a, 0x01d8, 0x6106,
++	0x6003, 0x0001, 0x601f, 0x0001, 0x6918, 0x611a, 0x6928, 0x612a,
++	0x692c, 0x612e, 0x6930, 0xa18c, 0x00ff, 0x6132, 0x6934, 0x6136,
++	0x6938, 0x613a, 0x6950, 0x6152, 0x080c, 0x9fb8, 0x080c, 0x6c52,
++	0x080c, 0x7134, 0x2d60, 0x00f8, 0x00d6, 0x6010, 0x2068, 0x080c,
++	0x9beb, 0x01c8, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128, 0xc0ec,
++	0x6852, 0x684b, 0x0006, 0x0048, 0xd0bc, 0x0118, 0x684b, 0x0002,
++	0x0020, 0x684b, 0x0005, 0x080c, 0x9e63, 0x6847, 0x0000, 0x080c,
++	0x53c9, 0x080c, 0x9da2, 0x00de, 0x080c, 0x85c0, 0x0005, 0x0016,
++	0x00d6, 0x6010, 0x2068, 0x080c, 0x9beb, 0x0140, 0x6837, 0x0103,
++	0x684b, 0x0028, 0x6847, 0x0000, 0x080c, 0x53c9, 0x00de, 0x001e,
++	0xa186, 0x0013, 0x0148, 0xa186, 0x0014, 0x0130, 0xa186, 0x0027,
++	0x0118, 0x080c, 0x8606, 0x0030, 0x080c, 0x7055, 0x080c, 0x9dae,
++	0x080c, 0x7134, 0x0005, 0x0056, 0x0066, 0x00d6, 0x00f6, 0x2029,
++	0x0001, 0xa182, 0x0101, 0x1208, 0x0010, 0x2009, 0x0100, 0x2130,
++	0x2069, 0xba98, 0x831c, 0x2300, 0xad18, 0x2009, 0x0020, 0xaf90,
++	0x001d, 0x080c, 0x98a6, 0xa6b2, 0x0020, 0x7804, 0xa06d, 0x0110,
++	0x080c, 0x161b, 0x080c, 0x15f4, 0x0500, 0x8528, 0x6837, 0x0110,
++	0x683b, 0x0000, 0x2d20, 0x7c06, 0xa68a, 0x003d, 0x1228, 0x2608,
++	0xad90, 0x000f, 0x0459, 0x0088, 0xa6b2, 0x003c, 0x2009, 0x003c,
++	0x2d78, 0xad90, 0x000f, 0x0411, 0x0c28, 0x00fe, 0x852f, 0xa5ad,
++	0x0003, 0x7d36, 0xa5ac, 0x0000, 0x0028, 0x00fe, 0x852f, 0xa5ad,
++	0x0003, 0x7d36, 0x00de, 0x006e, 0x005e, 0x0005, 0x00f6, 0x8dff,
++	0x0158, 0x6804, 0xa07d, 0x0130, 0x6807, 0x0000, 0x080c, 0x53c9,
++	0x2f68, 0x0cb8, 0x080c, 0x53c9, 0x00fe, 0x0005, 0x0156, 0xa184,
++	0x0001, 0x0108, 0x8108, 0x810c, 0x21a8, 0x2304, 0x8007, 0x2012,
++	0x8318, 0x8210, 0x1f04, 0x98ad, 0x015e, 0x0005, 0x0066, 0x0126,
++	0x2091, 0x8000, 0x2031, 0x0001, 0x601c, 0xa084, 0x000f, 0x0083,
++	0x012e, 0x006e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0066, 0x2031,
++	0x0000, 0x601c, 0xa084, 0x000f, 0x001b, 0x006e, 0x012e, 0x0005,
++	0x98ed, 0x98ed, 0x98e8, 0x990f, 0x98db, 0x98e8, 0x990f, 0x98e8,
++	0x98e8, 0x98db, 0x98e8, 0x080c, 0x1511, 0x0036, 0x2019, 0x0010,
++	0x080c, 0xac63, 0x601f, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005,
++	0xa006, 0x0005, 0xa085, 0x0001, 0x0005, 0x00d6, 0x86ff, 0x11d8,
++	0x6010, 0x2068, 0x080c, 0x9beb, 0x01c0, 0x6834, 0xa086, 0x0139,
++	0x1128, 0x684b, 0x0005, 0x6853, 0x0000, 0x0028, 0xa00e, 0x2001,
++	0x0005, 0x080c, 0x549c, 0x080c, 0x9e63, 0x080c, 0x53c9, 0x080c,
++	0x85c0, 0xa085, 0x0001, 0x00de, 0x0005, 0xa006, 0x0ce0, 0x6000,
++	0xa08a, 0x0010, 0x1a0c, 0x1511, 0x000b, 0x0005, 0x9926, 0x9947,
++	0x9928, 0x9966, 0x9944, 0x9926, 0x98e8, 0x98ed, 0x98ed, 0x98e8,
++	0x98e8, 0x98e8, 0x98e8, 0x98e8, 0x98e8, 0x98e8, 0x080c, 0x1511,
++	0x86ff, 0x11b8, 0x601c, 0xa086, 0x0006, 0x0198, 0x00d6, 0x6010,
++	0x2068, 0x080c, 0x9beb, 0x0110, 0x080c, 0x9e63, 0x00de, 0x6007,
++	0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x6c52, 0x080c,
++	0x7134, 0xa085, 0x0001, 0x0005, 0x080c, 0x1944, 0x0c08, 0x00e6,
++	0x2071, 0xb6e0, 0x7024, 0xac06, 0x1110, 0x080c, 0x7f03, 0x601c,
++	0xa084, 0x000f, 0xa086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049,
++	0x0001, 0x2c40, 0x080c, 0x80da, 0x009e, 0x008e, 0x0010, 0x080c,
++	0x7e02, 0x00ee, 0x1928, 0x080c, 0x98e8, 0x0005, 0x0036, 0x00e6,
++	0x2071, 0xb6e0, 0x703c, 0xac06, 0x1140, 0x2019, 0x0000, 0x080c,
++	0x7f8e, 0x00ee, 0x003e, 0x0804, 0x9928, 0x080c, 0x8200, 0x00ee,
++	0x003e, 0x1904, 0x9928, 0x080c, 0x98e8, 0x0005, 0x00c6, 0x601c,
++	0xa084, 0x000f, 0x0013, 0x00ce, 0x0005, 0x9997, 0x9a04, 0x9b4a,
++	0x99a2, 0x9dae, 0x9997, 0xac55, 0x85c0, 0x9a04, 0x9990, 0x9bb5,
++	0x080c, 0x1511, 0x080c, 0x9de9, 0x1110, 0x080c, 0x8bbc, 0x0005,
++	0x080c, 0x7055, 0x080c, 0x7134, 0x080c, 0x85c0, 0x0005, 0x6017,
++	0x0001, 0x0005, 0x080c, 0x9beb, 0x0120, 0x6010, 0xa080, 0x0019,
++	0x2c02, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1511, 0x000b, 0x0005,
++	0x99c0, 0x99c2, 0x99e2, 0x99f4, 0x9a01, 0x99c0, 0x9997, 0x9997,
++	0x9997, 0x99f4, 0x99f4, 0x99c0, 0x99c0, 0x99c0, 0x99c0, 0x99fe,
++	0x080c, 0x1511, 0x00e6, 0x6010, 0x2070, 0x7050, 0xc0b5, 0x7052,
++	0x2071, 0xb6e0, 0x7024, 0xac06, 0x0190, 0x080c, 0x7e02, 0x6007,
++	0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x2001, 0xb6b7, 0x2004,
++	0x6016, 0x080c, 0x6c52, 0x080c, 0x7134, 0x00ee, 0x0005, 0x6017,
++	0x0001, 0x0cd8, 0x00d6, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852,
++	0x00de, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c,
++	0x6c52, 0x080c, 0x7134, 0x0005, 0x00d6, 0x6017, 0x0001, 0x6010,
++	0x2068, 0x6850, 0xc0b5, 0x6852, 0x00de, 0x0005, 0x080c, 0x85c0,
++	0x0005, 0x080c, 0x1944, 0x08f0, 0x6000, 0xa08a, 0x0010, 0x1a0c,
++	0x1511, 0x000b, 0x0005, 0x9a1b, 0x999f, 0x9a1d, 0x9a1b, 0x9a1d,
++	0x9a1d, 0x9998, 0x9a1b, 0x9992, 0x9992, 0x9a1b, 0x9a1b, 0x9a1b,
++	0x9a1b, 0x9a1b, 0x9a1b, 0x080c, 0x1511, 0x00d6, 0x6018, 0x2068,
++	0x6804, 0xa084, 0x00ff, 0x00de, 0xa08a, 0x000c, 0x1a0c, 0x1511,
++	0x000b, 0x0005, 0x9a36, 0x9af0, 0x9a38, 0x9a72, 0x9a38, 0x9a72,
++	0x9a38, 0x9a42, 0x9a36, 0x9a72, 0x9a36, 0x9a5e, 0x080c, 0x1511,
++	0x6004, 0xa08e, 0x0016, 0x0588, 0xa08e, 0x0004, 0x0570, 0xa08e,
++	0x0002, 0x0558, 0x6004, 0x080c, 0x9de9, 0x0904, 0x9b09, 0xa08e,
++	0x0021, 0x0904, 0x9b0d, 0xa08e, 0x0022, 0x0904, 0x9b09, 0xa08e,
++	0x003d, 0x0904, 0x9b0d, 0xa08e, 0x0039, 0x0904, 0x9b11, 0xa08e,
++	0x0035, 0x0904, 0x9b11, 0xa08e, 0x001e, 0x0188, 0xa08e, 0x0001,
++	0x1150, 0x00d6, 0x6018, 0x2068, 0x6804, 0xa084, 0x00ff, 0x00de,
++	0xa086, 0x0006, 0x0110, 0x080c, 0x2c60, 0x080c, 0x8bbc, 0x080c,
++	0x9dae, 0x0005, 0x00c6, 0x00d6, 0x6104, 0xa186, 0x0016, 0x0904,
++	0x9ae1, 0xa186, 0x0002, 0x15d8, 0x2001, 0xb435, 0x2004, 0xd08c,
++	0x1198, 0x080c, 0x5a90, 0x1180, 0x2001, 0xb69f, 0x2003, 0x0001,
++	0x2001, 0xb400, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5ad4,
++	0x080c, 0x59c8, 0x0804, 0x9b33, 0x6018, 0x2068, 0x2001, 0xb435,
++	0x2004, 0xd0ac, 0x1904, 0x9b33, 0x68a0, 0xd0bc, 0x1904, 0x9b33,
++	0x6840, 0xa084, 0x00ff, 0xa005, 0x0190, 0x8001, 0x6842, 0x6013,
++	0x0000, 0x601f, 0x0007, 0x6017, 0x0398, 0x603f, 0x0000, 0x080c,
++	0x856a, 0x0128, 0x2d00, 0x601a, 0x601f, 0x0001, 0x0450, 0x00de,
++	0x00ce, 0x6004, 0xa08e, 0x0002, 0x11a8, 0x6018, 0xa080, 0x0028,
++	0x2004, 0xa086, 0x007e, 0x1170, 0x2009, 0xb435, 0x2104, 0xc085,
++	0x200a, 0x00e6, 0x2071, 0xb400, 0x080c, 0x4b80, 0x00ee, 0x080c,
++	0x8bbc, 0x0020, 0x080c, 0x8bbc, 0x080c, 0x2c60, 0x00e6, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x2c86, 0x012e, 0x00ee, 0x080c, 0x9dae,
++	0x0005, 0x2001, 0x0002, 0x080c, 0x4ebe, 0x6003, 0x0001, 0x6007,
++	0x0002, 0x080c, 0x6c98, 0x080c, 0x7134, 0x00de, 0x00ce, 0x0c80,
++	0x00c6, 0x00d6, 0x6104, 0xa186, 0x0016, 0x0d58, 0x6018, 0x2068,
++	0x6840, 0xa084, 0x00ff, 0xa005, 0x0904, 0x9ab7, 0x8001, 0x6842,
++	0x6003, 0x0001, 0x080c, 0x6c98, 0x080c, 0x7134, 0x00de, 0x00ce,
++	0x08b8, 0x080c, 0x8bbc, 0x0804, 0x9a6f, 0x080c, 0x8bea, 0x0804,
++	0x9a6f, 0x00d6, 0x2c68, 0x6104, 0x080c, 0xa09b, 0x00de, 0x0118,
++	0x080c, 0x85c0, 0x00b8, 0x6004, 0x8007, 0x6130, 0xa18c, 0x00ff,
++	0xa105, 0x6032, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002,
++	0x6038, 0x600a, 0x2001, 0xb6b7, 0x2004, 0x6016, 0x080c, 0x6c52,
++	0x080c, 0x7134, 0x0005, 0x00de, 0x00ce, 0x080c, 0x8bbc, 0x080c,
++	0x2c60, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2c86, 0x6013,
++	0x0000, 0x601f, 0x0007, 0x6017, 0x0398, 0x603f, 0x0000, 0x012e,
++	0x00ee, 0x0005, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1511, 0x000b,
++	0x0005, 0x9b61, 0x9b61, 0x9b61, 0x9b61, 0x9b61, 0x9b61, 0x9b61,
++	0x9b61, 0x9b61, 0x9997, 0x9b61, 0x999f, 0x9b63, 0x999f, 0x9b70,
++	0x9b61, 0x080c, 0x1511, 0x6004, 0xa086, 0x008b, 0x0148, 0x6007,
++	0x008b, 0x6003, 0x000d, 0x080c, 0x6c52, 0x080c, 0x7134, 0x0005,
++	0x080c, 0x9da2, 0x080c, 0x9beb, 0x0580, 0x080c, 0x2c60, 0x00d6,
++	0x080c, 0x9beb, 0x0168, 0x6010, 0x2068, 0x6837, 0x0103, 0x684b,
++	0x0006, 0x6847, 0x0000, 0x6850, 0xc0ed, 0x6852, 0x080c, 0x53c9,
++	0x2c68, 0x080c, 0x856a, 0x0150, 0x6818, 0x601a, 0x080c, 0x9fb8,
++	0x00c6, 0x2d60, 0x080c, 0x9dae, 0x00ce, 0x0008, 0x2d60, 0x00de,
++	0x6013, 0x0000, 0x601f, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001,
++	0x080c, 0x6c98, 0x080c, 0x7134, 0x0078, 0x6030, 0xa08c, 0xff00,
++	0x810f, 0xa186, 0x0039, 0x0118, 0xa186, 0x0035, 0x1118, 0x080c,
++	0x2c60, 0x08b0, 0x080c, 0x9dae, 0x0005, 0x6000, 0xa08a, 0x0010,
++	0x1a0c, 0x1511, 0x000b, 0x0005, 0x9bcc, 0x9bcc, 0x9bcc, 0x9bce,
++	0x9bce, 0x9bcc, 0x9bcc, 0x9bcc, 0x9bcc, 0x9bcc, 0x9bcc, 0x9bcc,
++	0x9bcc, 0x9bcc, 0x9bcc, 0x9bcc, 0x080c, 0x1511, 0x080c, 0x8200,
++	0x190c, 0x1511, 0x6110, 0x2168, 0x684b, 0x0006, 0x080c, 0x53c9,
++	0x080c, 0x85c0, 0x0005, 0xa284, 0x0007, 0x1158, 0xa282, 0xbc00,
++	0x0240, 0x2001, 0xb417, 0x2004, 0xa202, 0x1218, 0xa085, 0x0001,
++	0x0005, 0xa006, 0x0ce8, 0x0026, 0x6210, 0xa294, 0xf000, 0x002e,
++	0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126, 0x2091, 0x8000,
++	0x2061, 0xbc00, 0x2071, 0xb400, 0x7348, 0x7068, 0xa302, 0x12a8,
++	0x601c, 0xa206, 0x1160, 0x080c, 0x9f43, 0x0148, 0x080c, 0x9de9,
++	0x1110, 0x080c, 0x8bbc, 0x00c6, 0x080c, 0x85c0, 0x00ce, 0xace0,
++	0x0018, 0x705c, 0xac02, 0x1208, 0x0c38, 0x012e, 0x000e, 0x003e,
++	0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0xa188, 0xb535,
++	0x210c, 0x81ff, 0x0128, 0x2061, 0xb7f4, 0x611a, 0x080c, 0x2c60,
++	0xa006, 0x0010, 0xa085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005,
++	0x00c6, 0x0056, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x856a,
++	0x005e, 0x0180, 0x6612, 0x651a, 0x080c, 0x9fb8, 0x601f, 0x0003,
++	0x2009, 0x004b, 0x080c, 0x85ef, 0xa085, 0x0001, 0x012e, 0x005e,
++	0x00ce, 0x0005, 0xa006, 0x0cd0, 0x00c6, 0x0056, 0x0126, 0x2091,
++	0x8000, 0x62a0, 0x00c6, 0x080c, 0x9e67, 0x005e, 0x0550, 0x6013,
++	0x0000, 0x651a, 0x080c, 0x9fb8, 0x601f, 0x0003, 0x0016, 0x00c6,
++	0x2560, 0x080c, 0x516b, 0x00ce, 0x080c, 0x6dba, 0x0076, 0x2039,
++	0x0000, 0x080c, 0x6cc7, 0x2c08, 0x080c, 0xae05, 0x007e, 0x001e,
++	0xd184, 0x0128, 0x080c, 0x85c0, 0xa085, 0x0001, 0x0030, 0x2009,
++	0x004c, 0x080c, 0x85ef, 0xa085, 0x0001, 0x012e, 0x005e, 0x00ce,
++	0x0005, 0xa006, 0x0cd0, 0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c,
++	0x856a, 0x2c78, 0x00ce, 0x0180, 0x7e12, 0x2c00, 0x781a, 0x781f,
++	0x0003, 0x2021, 0x0005, 0x080c, 0x9ce1, 0x2f60, 0x2009, 0x004d,
++	0x080c, 0x85ef, 0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005,
++	0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c, 0x856a, 0x2c78, 0x00ce,
++	0x0178, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021, 0x0005,
++	0x0481, 0x2f60, 0x2009, 0x004e, 0x080c, 0x85ef, 0xa085, 0x0001,
++	0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, 0x00c6,
++	0x080c, 0x856a, 0x2c78, 0x00ce, 0x01c0, 0x7e12, 0x2c00, 0x781a,
++	0x781f, 0x0003, 0x2021, 0x0004, 0x00a1, 0x2001, 0xb6a0, 0x2004,
++	0xd0fc, 0x0120, 0x2f60, 0x080c, 0x85c0, 0x0028, 0x2f60, 0x2009,
++	0x0052, 0x080c, 0x85ef, 0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe,
++	0x0005, 0x0096, 0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0x510d,
++	0x0118, 0x2001, 0x9ce6, 0x0028, 0x080c, 0x50dd, 0x0158, 0x2001,
++	0x9cec, 0x0006, 0xa00e, 0x2400, 0x080c, 0x549c, 0x080c, 0x53c9,
++	0x000e, 0x0807, 0x2418, 0x080c, 0x6ff4, 0x62a0, 0x0086, 0x2041,
++	0x0001, 0x2039, 0x0001, 0x2608, 0x080c, 0x6dd3, 0x008e, 0x080c,
++	0x6cc7, 0x2f08, 0x2648, 0x080c, 0xae05, 0x613c, 0x81ff, 0x090c,
++	0x6e88, 0x080c, 0x7134, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6,
++	0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x856a, 0x001e, 0x0188,
++	0x660a, 0x611a, 0x080c, 0x9fb8, 0x601f, 0x0001, 0x2d00, 0x6012,
++	0x2009, 0x001f, 0x080c, 0x85ef, 0xa085, 0x0001, 0x012e, 0x00ce,
++	0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6,
++	0x080c, 0x856a, 0x001e, 0x0188, 0x660a, 0x611a, 0x080c, 0x9fb8,
++	0x601f, 0x0008, 0x2d00, 0x6012, 0x2009, 0x0021, 0x080c, 0x85ef,
++	0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6,
++	0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x856a, 0x001e, 0x0188,
++	0x660a, 0x611a, 0x080c, 0x9fb8, 0x601f, 0x0001, 0x2d00, 0x6012,
++	0x2009, 0x003d, 0x080c, 0x85ef, 0xa085, 0x0001, 0x012e, 0x00ce,
++	0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6,
++	0x080c, 0x9e67, 0x001e, 0x0180, 0x611a, 0x080c, 0x9fb8, 0x601f,
++	0x0001, 0x2d00, 0x6012, 0x2009, 0x0000, 0x080c, 0x85ef, 0xa085,
++	0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126,
++	0x2091, 0x8000, 0x00c6, 0x080c, 0x856a, 0x001e, 0x0188, 0x660a,
++	0x611a, 0x080c, 0x9fb8, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009,
++	0x0044, 0x080c, 0x85ef, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005,
++	0xa006, 0x0cd8, 0x0026, 0x00d6, 0x6218, 0x2268, 0x6a3c, 0x82ff,
++	0x0110, 0x8211, 0x6a3e, 0x00de, 0x002e, 0x0005, 0x0006, 0x6000,
++	0xa086, 0x0000, 0x0190, 0x6013, 0x0000, 0x601f, 0x0007, 0x2001,
++	0xb6b6, 0x2004, 0x0006, 0xa082, 0x0051, 0x000e, 0x0208, 0x8004,
++	0x6016, 0x080c, 0xb2bd, 0x603f, 0x0000, 0x000e, 0x0005, 0x0066,
++	0x00c6, 0x00d6, 0x2031, 0xb453, 0x2634, 0xd6e4, 0x0128, 0x6618,
++	0x2660, 0x6e48, 0x080c, 0x5096, 0x00de, 0x00ce, 0x006e, 0x0005,
++	0x0006, 0x0016, 0x6004, 0xa08e, 0x0002, 0x0140, 0xa08e, 0x0003,
++	0x0128, 0xa08e, 0x0004, 0x0110, 0xa085, 0x0001, 0x001e, 0x000e,
++	0x0005, 0x0006, 0x00d6, 0x6010, 0xa06d, 0x0148, 0x6834, 0xa086,
++	0x0139, 0x0138, 0x6838, 0xd0fc, 0x0110, 0xa006, 0x0010, 0xa085,
++	0x0001, 0x00de, 0x000e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000,
++	0x00c6, 0x080c, 0x856a, 0x001e, 0x0190, 0x611a, 0x080c, 0x9fb8,
++	0x601f, 0x0001, 0x2d00, 0x6012, 0x080c, 0x2c60, 0x2009, 0x0028,
++	0x080c, 0x85ef, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006,
++	0x0cd8, 0xa186, 0x0015, 0x1178, 0x2011, 0xb421, 0x2204, 0xa086,
++	0x0074, 0x1148, 0x080c, 0x8f38, 0x6003, 0x0001, 0x6007, 0x0029,
++	0x080c, 0x6c98, 0x0020, 0x080c, 0x8bbc, 0x080c, 0x85c0, 0x0005,
++	0xa186, 0x0016, 0x1128, 0x2001, 0x0004, 0x080c, 0x4ebe, 0x00e8,
++	0xa186, 0x0015, 0x11e8, 0x2011, 0xb421, 0x2204, 0xa086, 0x0014,
++	0x11b8, 0x00d6, 0x6018, 0x2068, 0x080c, 0x500c, 0x00de, 0x080c,
++	0x8ff1, 0x1170, 0x00d6, 0x6018, 0x2068, 0x6890, 0x00de, 0xa005,
++	0x0138, 0x2001, 0x0006, 0x080c, 0x4ebe, 0x080c, 0x8743, 0x0020,
++	0x080c, 0x8bbc, 0x080c, 0x85c0, 0x0005, 0x6848, 0xa086, 0x0005,
++	0x1108, 0x0009, 0x0005, 0x6850, 0xc0ad, 0x6852, 0x0005, 0x00e6,
++	0x0126, 0x2071, 0xb400, 0x2091, 0x8000, 0x7548, 0xa582, 0x0001,
++	0x0608, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0148, 0xace0,
++	0x0018, 0x705c, 0xac02, 0x1208, 0x0cb0, 0x2061, 0xbc00, 0x0c98,
++	0x6003, 0x0008, 0x8529, 0x754a, 0xaca8, 0x0018, 0x705c, 0xa502,
++	0x1230, 0x754e, 0xa085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x704f,
++	0xbc00, 0x0cc0, 0xa006, 0x0cc0, 0x00e6, 0x2071, 0xba8c, 0x7014,
++	0xd0e4, 0x0150, 0x6013, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050,
++	0x080c, 0x6c52, 0x080c, 0x7134, 0x00ee, 0x0005, 0x00c6, 0x00f6,
++	0x2c78, 0x080c, 0x52c6, 0x00fe, 0x0120, 0x601c, 0xa084, 0x000f,
++	0x0013, 0x00ce, 0x0005, 0x9997, 0x9ebe, 0x9ec1, 0x9ec4, 0xb0aa,
++	0xb0c5, 0xb0c8, 0x9997, 0x9997, 0x080c, 0x1511, 0xe000, 0xe000,
++	0x0005, 0xe000, 0xe000, 0x0005, 0x0009, 0x0005, 0x00f6, 0x2c78,
++	0x080c, 0x52c6, 0x0538, 0x080c, 0x856a, 0x1128, 0x2001, 0xb6b8,
++	0x2004, 0x783e, 0x00f8, 0x7818, 0x601a, 0x080c, 0x9fb8, 0x781c,
++	0xa086, 0x0003, 0x0128, 0x7808, 0x6036, 0x2f00, 0x603a, 0x0020,
++	0x7808, 0x603a, 0x2f00, 0x6036, 0x602a, 0x601f, 0x0001, 0x6007,
++	0x0035, 0x6003, 0x0001, 0x7950, 0x6152, 0x080c, 0x6c52, 0x080c,
++	0x7134, 0x2f60, 0x00fe, 0x0005, 0x0016, 0x00f6, 0x682c, 0x6032,
++	0xa08e, 0x0001, 0x0138, 0xa086, 0x0005, 0x0140, 0xa006, 0x602a,
++	0x602e, 0x00a0, 0x6820, 0xc0f4, 0xc0d5, 0x6822, 0x6810, 0x2078,
++	0x787c, 0x6938, 0xa102, 0x7880, 0x6934, 0xa103, 0x1e78, 0x6834,
++	0x602a, 0x6838, 0xa084, 0xfffc, 0x683a, 0x602e, 0x2d00, 0x6036,
++	0x6808, 0x603a, 0x6918, 0x611a, 0x6950, 0x6152, 0x601f, 0x0001,
++	0x6007, 0x0039, 0x6003, 0x0001, 0x080c, 0x6c52, 0x6803, 0x0002,
++	0x00fe, 0x001e, 0x0005, 0x00f6, 0x2c78, 0x080c, 0x52c6, 0x1118,
++	0xa085, 0x0001, 0x0070, 0x6020, 0xd0f4, 0x1150, 0xc0f5, 0x6022,
++	0x6010, 0x2078, 0x7828, 0x603a, 0x782c, 0x6036, 0x080c, 0x1944,
++	0xa006, 0x00fe, 0x0005, 0x0006, 0x0016, 0x6004, 0xa08e, 0x0034,
++	0x01b8, 0xa08e, 0x0035, 0x01a0, 0xa08e, 0x0036, 0x0188, 0xa08e,
++	0x0037, 0x0170, 0xa08e, 0x0038, 0x0158, 0xa08e, 0x0039, 0x0140,
++	0xa08e, 0x003a, 0x0128, 0xa08e, 0x003b, 0x0110, 0xa085, 0x0001,
++	0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6,
++	0x2001, 0xb6b2, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x080c,
++	0x6b05, 0x2001, 0xb6b6, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202,
++	0x2001, 0xb6b4, 0x200c, 0x8000, 0x2014, 0x2071, 0xb68e, 0x711a,
++	0x721e, 0x2001, 0x0064, 0x080c, 0x6b05, 0x2001, 0xb6b7, 0x82ff,
++	0x1110, 0x2011, 0x0014, 0x2202, 0x2009, 0xb6b8, 0xa280, 0x000a,
++	0x200a, 0x080c, 0x52eb, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e,
++	0x0005, 0x0006, 0x00e6, 0x2001, 0xb6b6, 0x2003, 0x0028, 0x2001,
++	0xb6b7, 0x2003, 0x0014, 0x2071, 0xb68e, 0x701b, 0x0000, 0x701f,
++	0x07d0, 0x2001, 0xb6b8, 0x2003, 0x001e, 0x00ee, 0x000e, 0x0005,
++	0x00d6, 0x6054, 0xa06d, 0x0110, 0x080c, 0x160b, 0x00de, 0x0005,
++	0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x856a,
++	0x001e, 0x0178, 0x611a, 0x0ca1, 0x601f, 0x0001, 0x2d00, 0x6012,
++	0x2009, 0x0033, 0x080c, 0x85ef, 0xa085, 0x0001, 0x012e, 0x00ce,
++	0x0005, 0xa006, 0x0cd8, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0xb400,
++	0xa186, 0x0015, 0x1500, 0x7084, 0xa086, 0x0018, 0x11e0, 0x6010,
++	0x2068, 0x6a3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x72f2, 0x01d8,
++	0x7070, 0x6a50, 0xa206, 0x1160, 0x7074, 0x6a54, 0xa206, 0x1140,
++	0x6218, 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x080c, 0x2ca5,
++	0x080c, 0x8743, 0x0020, 0x080c, 0x8bbc, 0x080c, 0x85c0, 0x00fe,
++	0x00ee, 0x00de, 0x0005, 0x7054, 0x6a54, 0xa206, 0x0d48, 0x0c80,
++	0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x856a, 0x001e,
++	0x0180, 0x611a, 0x080c, 0x9fb8, 0x601f, 0x0001, 0x2d00, 0x6012,
++	0x2009, 0x0043, 0x080c, 0x85ef, 0xa085, 0x0001, 0x012e, 0x00ce,
++	0x0005, 0xa006, 0x0cd8, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0xb400,
++	0xa186, 0x0015, 0x11c0, 0x7084, 0xa086, 0x0004, 0x11a0, 0x6010,
++	0xa0e8, 0x000f, 0x2c78, 0x080c, 0x72f2, 0x01a8, 0x7070, 0x6a08,
++	0xa206, 0x1130, 0x7074, 0x6a0c, 0xa206, 0x1110, 0x080c, 0x2c60,
++	0x080c, 0x8743, 0x0020, 0x080c, 0x8bbc, 0x080c, 0x85c0, 0x00fe,
++	0x00ee, 0x00de, 0x0005, 0x7054, 0x6a0c, 0xa206, 0x0d78, 0x0c80,
++	0x0016, 0x0026, 0x684c, 0xd0ac, 0x0178, 0x6914, 0x6a10, 0x2100,
++	0xa205, 0x0150, 0x6860, 0xa106, 0x1118, 0x685c, 0xa206, 0x0120,
++	0x6962, 0x6a5e, 0xa085, 0x0001, 0x002e, 0x001e, 0x0005, 0x00d6,
++	0x0036, 0x6310, 0x2368, 0x684a, 0x6952, 0xa29e, 0x4000, 0x11a0,
++	0x00c6, 0x6318, 0x2360, 0x2009, 0x0000, 0x6838, 0xd0f4, 0x1140,
++	0x080c, 0x520b, 0x1108, 0xc185, 0x6000, 0xd0bc, 0x0108, 0xc18d,
++	0x6a66, 0x696a, 0x00ce, 0x0080, 0x6a66, 0x3918, 0xa398, 0x0006,
++	0x231c, 0x686b, 0x0004, 0x6b72, 0x00c6, 0x6318, 0x2360, 0x6004,
++	0xa084, 0x00ff, 0x686e, 0x00ce, 0x080c, 0x53c9, 0x6013, 0x0000,
++	0x003e, 0x00de, 0x0005, 0x00c6, 0x0026, 0x0016, 0xa186, 0x0035,
++	0x0110, 0x6a34, 0x0008, 0x6a28, 0x080c, 0x9bdb, 0x01f0, 0x2260,
++	0x611c, 0xa186, 0x0003, 0x0118, 0xa186, 0x0006, 0x1190, 0x6834,
++	0xa206, 0x0140, 0x6838, 0xa206, 0x1160, 0x6108, 0x6834, 0xa106,
++	0x1140, 0x0020, 0x6008, 0x6938, 0xa106, 0x1118, 0x6018, 0x6918,
++	0xa106, 0x001e, 0x002e, 0x00ce, 0x0005, 0xa085, 0x0001, 0x0cc8,
++	0x6944, 0xd1cc, 0x0198, 0xa18c, 0x00ff, 0xa18e, 0x0002, 0x1170,
++	0xad88, 0x001e, 0x210c, 0xa18c, 0x0f00, 0x810f, 0xa18e, 0x0001,
++	0x1128, 0x6810, 0x6914, 0xa115, 0x190c, 0x941c, 0x0005, 0x0066,
++	0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1511, 0x0013, 0x006e, 0x0005,
++	0xa0f8, 0xa5cf, 0xa6f5, 0xa0f8, 0xa0f8, 0xa0f8, 0xa0f8, 0xa0f8,
++	0xa130, 0xa779, 0xa0f8, 0xa0f8, 0xa0f8, 0xa0f8, 0xa0f8, 0xa0f8,
++	0x080c, 0x1511, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1511,
++	0x0013, 0x006e, 0x0005, 0xa113, 0xabfa, 0xa113, 0xa113, 0xa113,
++	0xa113, 0xa113, 0xa113, 0xabbe, 0xac42, 0xa113, 0xb1ef, 0xb21f,
++	0xb1ef, 0xb21f, 0xa113, 0x080c, 0x1511, 0x0066, 0x6000, 0xa0b2,
++	0x0010, 0x1a0c, 0x1511, 0x0013, 0x006e, 0x0005, 0xa12e, 0xa8c5,
++	0xa992, 0xa9bf, 0xaa43, 0xa12e, 0xab30, 0xaadb, 0xa785, 0xab94,
++	0xaba9, 0xa12e, 0xa12e, 0xa12e, 0xa12e, 0xa12e, 0x080c, 0x1511,
++	0xa1b2, 0x0080, 0x1a0c, 0x1511, 0x2100, 0xa1b2, 0x0040, 0x1a04,
++	0xa543, 0x0002, 0xa17a, 0xa345, 0xa17a, 0xa17a, 0xa17a, 0xa34c,
++	0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa17a,
++	0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa17a,
++	0xa17a, 0xa17c, 0xa1da, 0xa1e9, 0xa237, 0xa255, 0xa2d3, 0xa332,
++	0xa17a, 0xa17a, 0xa34f, 0xa17a, 0xa17a, 0xa362, 0xa36d, 0xa17a,
++	0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa3f8, 0xa17a, 0xa17a, 0xa407,
++	0xa17a, 0xa17a, 0xa3c3, 0xa17a, 0xa17a, 0xa17a, 0xa41f, 0xa17a,
++	0xa17a, 0xa17a, 0xa499, 0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa17a,
++	0xa17a, 0xa50a, 0x080c, 0x1511, 0x080c, 0x52ca, 0x1150, 0x2001,
++	0xb435, 0x2004, 0xd0cc, 0x1128, 0xa084, 0x0009, 0xa086, 0x0008,
++	0x1140, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, 0x0000, 0x0804,
++	0xa340, 0x080c, 0x52ba, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016,
++	0x6218, 0x2270, 0x72a0, 0x0026, 0x2019, 0x0029, 0x080c, 0x6dba,
++	0x0076, 0x2039, 0x0000, 0x080c, 0x6cc7, 0x2c08, 0x080c, 0xae05,
++	0x007e, 0x001e, 0x2e60, 0x080c, 0x516b, 0x001e, 0x002e, 0x003e,
++	0x00ce, 0x00ee, 0x6618, 0x00c6, 0x2660, 0x080c, 0x4f79, 0x00ce,
++	0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0278,
++	0x080c, 0xad49, 0x1904, 0xa231, 0x080c, 0xace9, 0x1120, 0x6007,
++	0x0008, 0x0804, 0xa340, 0x6007, 0x0009, 0x0804, 0xa340, 0x080c,
++	0xaefe, 0x0128, 0x080c, 0xad49, 0x0d78, 0x0804, 0xa231, 0x6013,
++	0x1900, 0x0c88, 0x080c, 0x2d83, 0x1904, 0xa540, 0x6106, 0x080c,
++	0xaca3, 0x6007, 0x0006, 0x0804, 0xa340, 0x6007, 0x0007, 0x0804,
++	0xa340, 0x080c, 0xb253, 0x1904, 0xa540, 0x080c, 0x2d83, 0x1904,
++	0xa540, 0x00d6, 0x6618, 0x2668, 0x6e04, 0xa684, 0x00ff, 0xa082,
++	0x0006, 0x1220, 0x2001, 0x0001, 0x080c, 0x4eac, 0xa6b4, 0xff00,
++	0x8637, 0xa686, 0x0006, 0x0188, 0xa686, 0x0004, 0x0170, 0x6e04,
++	0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0140, 0xa686, 0x0004, 0x0128,
++	0xa686, 0x0005, 0x0110, 0x00de, 0x00e0, 0x080c, 0xada7, 0x11a0,
++	0xa686, 0x0006, 0x1150, 0x0026, 0x6218, 0xa290, 0x0028, 0x2214,
++	0x2009, 0x0000, 0x080c, 0x2ca5, 0x002e, 0x080c, 0x500c, 0x6007,
++	0x000a, 0x00de, 0x0804, 0xa340, 0x6007, 0x000b, 0x00de, 0x0804,
++	0xa340, 0x080c, 0x2c60, 0x6007, 0x0001, 0x0804, 0xa340, 0x080c,
++	0xb253, 0x1904, 0xa540, 0x080c, 0x2d83, 0x1904, 0xa540, 0x6618,
++	0x00d6, 0x2668, 0x6e04, 0x00de, 0xa686, 0x0707, 0x0d50, 0x0026,
++	0x6218, 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x080c, 0x2ca5,
++	0x002e, 0x6007, 0x000c, 0x0804, 0xa340, 0x080c, 0x52ca, 0x1140,
++	0x2001, 0xb435, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008, 0x1110,
++	0x0804, 0xa189, 0x080c, 0x52ba, 0x6618, 0xa6b0, 0x0001, 0x2634,
++	0xa684, 0x00ff, 0xa082, 0x0006, 0x06e8, 0x1138, 0x0026, 0x2001,
++	0x0006, 0x080c, 0x4eeb, 0x002e, 0x0050, 0xa6b4, 0xff00, 0x8637,
++	0xa686, 0x0004, 0x0120, 0xa686, 0x0006, 0x1904, 0xa231, 0x080c,
++	0xadb4, 0x1120, 0x6007, 0x000e, 0x0804, 0xa340, 0x0046, 0x6418,
++	0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, 0x0046, 0x080c,
++	0x2c60, 0x004e, 0x0016, 0xa006, 0x2009, 0xb453, 0x210c, 0xd1a4,
++	0x0158, 0x2009, 0x0029, 0x080c, 0xb06b, 0x6018, 0x00d6, 0x2068,
++	0x6800, 0xc0e5, 0x6802, 0x00de, 0x001e, 0x004e, 0x6007, 0x0001,
++	0x0804, 0xa340, 0x2001, 0x0001, 0x080c, 0x4eac, 0x0156, 0x0016,
++	0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0xb405, 0x2011, 0xba90,
++	0x080c, 0x907a, 0x003e, 0x002e, 0x001e, 0x015e, 0xa005, 0x0168,
++	0xa6b4, 0xff00, 0x8637, 0xa682, 0x0004, 0x0a04, 0xa231, 0xa682,
++	0x0007, 0x0a04, 0xa27f, 0x0804, 0xa231, 0x6013, 0x1900, 0x6007,
++	0x0009, 0x0804, 0xa340, 0x080c, 0x52ca, 0x1140, 0x2001, 0xb435,
++	0x2004, 0xa084, 0x0009, 0xa086, 0x0008, 0x1110, 0x0804, 0xa189,
++	0x080c, 0x52ba, 0x6618, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff,
++	0xa082, 0x0006, 0x06b8, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0004,
++	0x0120, 0xa686, 0x0006, 0x1904, 0xa231, 0x080c, 0xaddc, 0x1138,
++	0x080c, 0xace9, 0x1120, 0x6007, 0x0010, 0x0804, 0xa340, 0x0046,
++	0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, 0x0046,
++	0x080c, 0x2c60, 0x004e, 0x0016, 0xa006, 0x2009, 0xb453, 0x210c,
++	0xd1a4, 0x0158, 0x2009, 0x0029, 0x080c, 0xb06b, 0x6018, 0x00d6,
++	0x2068, 0x6800, 0xc0e5, 0x6802, 0x00de, 0x001e, 0x004e, 0x6007,
++	0x0001, 0x00f0, 0x080c, 0xaefe, 0x0140, 0xa6b4, 0xff00, 0x8637,
++	0xa686, 0x0006, 0x0950, 0x0804, 0xa231, 0x6013, 0x1900, 0x6007,
++	0x0009, 0x0070, 0x080c, 0x2d83, 0x1904, 0xa540, 0x080c, 0xb253,
++	0x1904, 0xa540, 0x080c, 0xa568, 0x1904, 0xa231, 0x6007, 0x0012,
++	0x6003, 0x0001, 0x080c, 0x6c98, 0x0005, 0x6007, 0x0001, 0x6003,
++	0x0001, 0x080c, 0x6c98, 0x0cc0, 0x6007, 0x0005, 0x0cc0, 0x080c,
++	0xb253, 0x1904, 0xa540, 0x080c, 0x2d83, 0x1904, 0xa540, 0x080c,
++	0xa568, 0x1904, 0xa231, 0x6007, 0x0020, 0x6003, 0x0001, 0x080c,
++	0x6c98, 0x0005, 0x080c, 0x2d83, 0x1904, 0xa540, 0x6007, 0x0023,
++	0x6003, 0x0001, 0x080c, 0x6c98, 0x0005, 0x080c, 0xb253, 0x1904,
++	0xa540, 0x080c, 0x2d83, 0x1904, 0xa540, 0x080c, 0xa568, 0x1904,
++	0xa231, 0x0016, 0x0026, 0x2011, 0xba91, 0x2214, 0xa286, 0xffff,
++	0x0190, 0x2c08, 0x080c, 0x9bdb, 0x01e0, 0x2260, 0x2011, 0xba90,
++	0x2214, 0x6008, 0xa206, 0x11a8, 0x6018, 0xa190, 0x0006, 0x2214,
++	0xa206, 0x01e8, 0x0070, 0x2011, 0xba90, 0x2214, 0x2c08, 0xa006,
++	0x080c, 0xb03d, 0x11a0, 0x2011, 0xba91, 0x2214, 0xa286, 0xffff,
++	0x01c0, 0x2160, 0x6007, 0x0026, 0x6013, 0x1700, 0x2011, 0xba89,
++	0x2214, 0xa296, 0xffff, 0x1180, 0x6007, 0x0025, 0x0068, 0x601c,
++	0xa086, 0x0007, 0x1d70, 0x6004, 0xa086, 0x0024, 0x1110, 0x080c,
++	0x85c0, 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x080c, 0x6c98,
++	0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x4eac, 0x0156,
++	0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0xb405, 0x2011,
++	0xba96, 0x080c, 0x907a, 0x003e, 0x002e, 0x001e, 0x015e, 0x0120,
++	0x6007, 0x0031, 0x0804, 0xa340, 0x080c, 0x8d99, 0x080c, 0x5a90,
++	0x11b0, 0x0006, 0x0026, 0x0036, 0x080c, 0x5aac, 0x1158, 0x2001,
++	0xb69f, 0x2003, 0x0001, 0x2001, 0xb400, 0x2003, 0x0001, 0x080c,
++	0x59c8, 0x0010, 0x080c, 0x5a67, 0x003e, 0x002e, 0x000e, 0x0005,
++	0x080c, 0x2d83, 0x1904, 0xa540, 0x6106, 0x080c, 0xa584, 0x6007,
++	0x002b, 0x0804, 0xa340, 0x6007, 0x002c, 0x0804, 0xa340, 0x080c,
++	0xb253, 0x1904, 0xa540, 0x080c, 0x2d83, 0x1904, 0xa540, 0x080c,
++	0xa568, 0x1904, 0xa231, 0x6106, 0x080c, 0xa588, 0x1120, 0x6007,
++	0x002e, 0x0804, 0xa340, 0x6007, 0x002f, 0x0804, 0xa340, 0x080c,
++	0x2d83, 0x1904, 0xa540, 0x00e6, 0x00d6, 0x00c6, 0x6018, 0xa080,
++	0x0001, 0x200c, 0xa184, 0x00ff, 0xa086, 0x0006, 0x0158, 0xa184,
++	0xff00, 0x8007, 0xa086, 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee,
++	0x0804, 0xa345, 0x2001, 0xb472, 0x2004, 0xd0e4, 0x0904, 0xa496,
++	0x2071, 0xba8c, 0x7010, 0x6036, 0x7014, 0x603a, 0x7108, 0x720c,
++	0x2001, 0xb453, 0x2004, 0xd0a4, 0x0140, 0x6018, 0x2068, 0x6810,
++	0xa106, 0x1118, 0x6814, 0xa206, 0x01f8, 0x2001, 0xb453, 0x2004,
++	0xd0ac, 0x1590, 0x2069, 0xb400, 0x6874, 0xa206, 0x1568, 0x6870,
++	0xa106, 0x1550, 0x7210, 0x080c, 0x9bdb, 0x0558, 0x080c, 0xb0d7,
++	0x0540, 0x622a, 0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x6c52,
++	0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, 0xa286, 0xffff, 0x0150,
++	0x080c, 0x9bdb, 0x01b0, 0xa280, 0x0002, 0x2004, 0x7110, 0xa106,
++	0x1180, 0x0c08, 0x7210, 0x2c08, 0xa085, 0x0001, 0x080c, 0xb03d,
++	0x2c10, 0x2160, 0x0130, 0x08b8, 0x6007, 0x0037, 0x6013, 0x1500,
++	0x08d8, 0x6007, 0x0037, 0x6013, 0x1700, 0x08b0, 0x6007, 0x0012,
++	0x0898, 0x080c, 0x2d83, 0x1904, 0xa540, 0x6018, 0xa080, 0x0001,
++	0x2004, 0xa084, 0xff00, 0x8007, 0xa086, 0x0006, 0x1904, 0xa345,
++	0x00e6, 0x00d6, 0x00c6, 0x2001, 0xb472, 0x2004, 0xd0e4, 0x0904,
++	0xa502, 0x2069, 0xb400, 0x2071, 0xba8c, 0x7008, 0x6036, 0x720c,
++	0x623a, 0xa286, 0xffff, 0x1150, 0x7208, 0x00c6, 0x2c08, 0xa085,
++	0x0001, 0x080c, 0xb03d, 0x2c10, 0x00ce, 0x0588, 0x080c, 0x9bdb,
++	0x0570, 0x00c6, 0x0026, 0x2260, 0x080c, 0x98b6, 0x002e, 0x00ce,
++	0x7118, 0xa18c, 0xff00, 0x810f, 0xa186, 0x0001, 0x0158, 0xa186,
++	0x0005, 0x0118, 0xa186, 0x0007, 0x1178, 0xa280, 0x0004, 0x2004,
++	0xa005, 0x0150, 0x0056, 0x7510, 0x7614, 0x080c, 0xb0ee, 0x005e,
++	0x00ce, 0x00de, 0x00ee, 0x0005, 0x6007, 0x003b, 0x602b, 0x0009,
++	0x6013, 0x2a00, 0x6003, 0x0001, 0x080c, 0x6c52, 0x0c88, 0x6007,
++	0x003b, 0x602b, 0x0009, 0x6013, 0x1700, 0x6003, 0x0001, 0x080c,
++	0x6c52, 0x0c30, 0x6007, 0x003b, 0x602b, 0x000b, 0x6013, 0x0000,
++	0x0804, 0xa46c, 0x00e6, 0x0026, 0x080c, 0x52ca, 0x0558, 0x080c,
++	0x52ba, 0x080c, 0xb2ce, 0x1520, 0x2071, 0xb400, 0x70d4, 0xc085,
++	0x70d6, 0x00f6, 0x2079, 0x0100, 0x72a0, 0xa284, 0x00ff, 0x7072,
++	0x78e6, 0xa284, 0xff00, 0x7274, 0xa205, 0x7076, 0x78ea, 0x00fe,
++	0x70df, 0x0000, 0x2001, 0xb453, 0x2004, 0xd0a4, 0x0120, 0x2011,
++	0xb6f9, 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2a7e, 0x0010,
++	0x080c, 0xb2fa, 0x002e, 0x00ee, 0x080c, 0x85c0, 0x0804, 0xa344,
++	0x080c, 0x85c0, 0x0005, 0x2600, 0x0002, 0xa54e, 0xa54e, 0xa54e,
++	0xa54e, 0xa54e, 0xa550, 0xa54e, 0xa54e, 0xa54e, 0x080c, 0x1511,
++	0x080c, 0xb253, 0x1d68, 0x080c, 0x2d83, 0x1d50, 0x0089, 0x1138,
++	0x6007, 0x0045, 0x6003, 0x0001, 0x080c, 0x6c98, 0x0005, 0x080c,
++	0x2c60, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x6c98, 0x0005,
++	0x00d6, 0x0066, 0x6618, 0x2668, 0x6e04, 0xa6b4, 0xff00, 0x8637,
++	0xa686, 0x0006, 0x0170, 0xa686, 0x0004, 0x0158, 0x6e04, 0xa6b4,
++	0x00ff, 0xa686, 0x0006, 0x0128, 0xa686, 0x0004, 0x0110, 0xa085,
++	0x0001, 0x006e, 0x00de, 0x0005, 0x00d6, 0x0449, 0x00de, 0x0005,
++	0x00d6, 0x0491, 0x11f0, 0x680c, 0xa08c, 0xff00, 0x6820, 0xa084,
++	0x00ff, 0xa115, 0x6212, 0x6824, 0x602a, 0xd1e4, 0x0118, 0x2009,
++	0x0001, 0x0060, 0xd1ec, 0x0168, 0x6920, 0xa18c, 0x00ff, 0x6824,
++	0x080c, 0x27e3, 0x1130, 0x2110, 0x2009, 0x0000, 0x080c, 0x2ca5,
++	0x0018, 0xa085, 0x0001, 0x0008, 0xa006, 0x00de, 0x0005, 0x2069,
++	0xba8d, 0x6800, 0xa082, 0x0010, 0x1228, 0x6013, 0x0000, 0xa085,
++	0x0001, 0x0008, 0xa006, 0x0005, 0x6013, 0x0000, 0x2069, 0xba8c,
++	0x6808, 0xa084, 0xff00, 0xa086, 0x0800, 0x1140, 0x6800, 0xa084,
++	0x00ff, 0xa08e, 0x0014, 0x0110, 0xa08e, 0x0010, 0x0005, 0x6004,
++	0xa0b2, 0x0080, 0x1a0c, 0x1511, 0xa1b6, 0x0013, 0x1130, 0x2008,
++	0xa1b2, 0x0040, 0x1a04, 0xa6cf, 0x0092, 0xa1b6, 0x0027, 0x0120,
++	0xa1b6, 0x0014, 0x190c, 0x1511, 0x2001, 0x0007, 0x080c, 0x4eeb,
++	0x080c, 0x7055, 0x080c, 0x9dae, 0x080c, 0x7134, 0x0005, 0xa62f,
++	0xa631, 0xa62f, 0xa62f, 0xa62f, 0xa631, 0xa643, 0xa6c8, 0xa693,
++	0xa6c8, 0xa6a4, 0xa6c8, 0xa643, 0xa6c8, 0xa6c0, 0xa6c8, 0xa6c0,
++	0xa6c8, 0xa6c8, 0xa62f, 0xa62f, 0xa62f, 0xa62f, 0xa62f, 0xa62f,
++	0xa62f, 0xa62f, 0xa62f, 0xa62f, 0xa62f, 0xa631, 0xa62f, 0xa6c8,
++	0xa62f, 0xa62f, 0xa6c8, 0xa62f, 0xa6c5, 0xa6c8, 0xa62f, 0xa62f,
++	0xa62f, 0xa62f, 0xa6c8, 0xa6c8, 0xa62f, 0xa6c8, 0xa6c8, 0xa62f,
++	0xa63d, 0xa62f, 0xa62f, 0xa62f, 0xa62f, 0xa6c4, 0xa6c8, 0xa62f,
++	0xa62f, 0xa6c8, 0xa6c8, 0xa62f, 0xa62f, 0xa62f, 0xa62f, 0x080c,
++	0x1511, 0x080c, 0x7055, 0x2001, 0xb6b6, 0x2004, 0x6016, 0x6003,
++	0x0002, 0x080c, 0x7134, 0x0804, 0xa6ce, 0x2001, 0x0000, 0x080c,
++	0x4eac, 0x0804, 0xa6c8, 0x00f6, 0x2079, 0xb452, 0x7804, 0x00fe,
++	0xd0ac, 0x1904, 0xa6c8, 0x2001, 0x0000, 0x080c, 0x4eac, 0x6018,
++	0xa080, 0x0004, 0x2004, 0xa086, 0x00ff, 0x1140, 0x00f6, 0x2079,
++	0xb400, 0x7898, 0x8000, 0x789a, 0x00fe, 0x00e0, 0x00c6, 0x6018,
++	0x2060, 0x6000, 0xd0f4, 0x1140, 0x6010, 0xa005, 0x0128, 0x00ce,
++	0x080c, 0x3efc, 0x0804, 0xa6c8, 0x00ce, 0x2001, 0xb400, 0x2004,
++	0xa086, 0x0002, 0x1138, 0x00f6, 0x2079, 0xb400, 0x7898, 0x8000,
++	0x789a, 0x00fe, 0x2001, 0x0002, 0x080c, 0x4ebe, 0x080c, 0x7055,
++	0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x6c98,
++	0x080c, 0x7134, 0x00c6, 0x6118, 0x2160, 0x2009, 0x0001, 0x080c,
++	0x696d, 0x00ce, 0x04d8, 0x6618, 0x00d6, 0x2668, 0x6e04, 0x00de,
++	0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0550, 0xa686, 0x0004,
++	0x0538, 0x2001, 0x0004, 0x0410, 0x2001, 0xb400, 0x2004, 0xa086,
++	0x0003, 0x1110, 0x080c, 0x3efc, 0x2001, 0x0006, 0x04a1, 0x6618,
++	0x00d6, 0x2668, 0x6e04, 0x00de, 0xa6b4, 0xff00, 0x8637, 0xa686,
++	0x0006, 0x0170, 0x2001, 0x0006, 0x0048, 0x2001, 0x0004, 0x0030,
++	0x2001, 0x0006, 0x0401, 0x0020, 0x0018, 0x0010, 0x080c, 0x4eeb,
++	0x080c, 0x7055, 0x080c, 0x85c0, 0x080c, 0x7134, 0x0005, 0x2600,
++	0x0002, 0xa6da, 0xa6da, 0xa6da, 0xa6da, 0xa6da, 0xa6dc, 0xa6da,
++	0xa6da, 0xa6da, 0x080c, 0x1511, 0x080c, 0x7055, 0x080c, 0x85c0,
++	0x080c, 0x7134, 0x0005, 0x0016, 0x00d6, 0x6118, 0x2168, 0x6900,
++	0xd184, 0x0140, 0x080c, 0x4ebe, 0x2001, 0x0000, 0x080c, 0x4eac,
++	0x080c, 0x2c86, 0x00de, 0x001e, 0x0005, 0x00d6, 0x6618, 0x2668,
++	0x6804, 0xa084, 0xff00, 0x8007, 0x00de, 0xa0b2, 0x000c, 0x1a0c,
++	0x1511, 0xa1b6, 0x0015, 0x1110, 0x003b, 0x0028, 0xa1b6, 0x0016,
++	0x190c, 0x1511, 0x006b, 0x0005, 0x8c82, 0x8c82, 0x8c82, 0x8c82,
++	0x8c82, 0x8c82, 0xa765, 0xa724, 0x8c82, 0x8c82, 0x8c82, 0x8c82,
++	0x8c82, 0x8c82, 0x8c82, 0x8c82, 0x8c82, 0x8c82, 0xa765, 0xa76c,
++	0x8c82, 0x8c82, 0x8c82, 0x8c82, 0x00f6, 0x2079, 0xb452, 0x7804,
++	0xd0ac, 0x11e0, 0x6018, 0xa07d, 0x01c8, 0x7800, 0xd0f4, 0x1118,
++	0x7810, 0xa005, 0x1198, 0x2001, 0x0000, 0x080c, 0x4eac, 0x2001,
++	0x0002, 0x080c, 0x4ebe, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007,
++	0x0002, 0x080c, 0x6c98, 0x080c, 0x7134, 0x00e8, 0x2011, 0xba83,
++	0x2204, 0x8211, 0x220c, 0x080c, 0x27e3, 0x11a8, 0x00c6, 0x080c,
++	0x4f6a, 0x0120, 0x00ce, 0x080c, 0x85c0, 0x0068, 0x6010, 0x0006,
++	0x6014, 0x0006, 0x080c, 0x4bc5, 0x000e, 0x6016, 0x000e, 0x6012,
++	0x00ce, 0x080c, 0x85c0, 0x00fe, 0x0005, 0x6604, 0xa6b6, 0x001e,
++	0x1110, 0x080c, 0x85c0, 0x0005, 0x080c, 0x8f35, 0x1138, 0x6003,
++	0x0001, 0x6007, 0x0001, 0x080c, 0x6c98, 0x0010, 0x080c, 0x85c0,
++	0x0005, 0x6004, 0xa08a, 0x0080, 0x1a0c, 0x1511, 0x080c, 0x7055,
++	0x080c, 0x9dae, 0x080c, 0x7134, 0x0005, 0xa182, 0x0040, 0x0002,
++	0xa79b, 0xa79b, 0xa79b, 0xa79b, 0xa79d, 0xa79b, 0xa79b, 0xa79b,
++	0xa79b, 0xa79b, 0xa79b, 0xa79b, 0xa79b, 0xa79b, 0xa79b, 0xa79b,
++	0xa79b, 0xa79b, 0xa79b, 0x080c, 0x1511, 0x00d6, 0x00e6, 0x00f6,
++	0x0156, 0x0046, 0x0026, 0x6218, 0xa280, 0x002b, 0x2004, 0xa005,
++	0x0120, 0x2021, 0x0000, 0x080c, 0xb29f, 0x6106, 0x2071, 0xba80,
++	0x7444, 0xa4a4, 0xff00, 0x0904, 0xa801, 0xa486, 0x2000, 0x1130,
++	0x2009, 0x0001, 0x2011, 0x0200, 0x080c, 0x6adf, 0x080c, 0x15f4,
++	0x090c, 0x1511, 0x6003, 0x0007, 0x2d00, 0x6837, 0x010d, 0x6803,
++	0x0000, 0x683b, 0x0000, 0x6c5a, 0x2c00, 0x685e, 0x6008, 0x68b2,
++	0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, 0x694a, 0x0016, 0xa084,
++	0xff00, 0x6846, 0x684f, 0x0000, 0x6853, 0x0000, 0x6857, 0x0036,
++	0x080c, 0x53c9, 0x001e, 0xa486, 0x2000, 0x1130, 0x2019, 0x0017,
++	0x080c, 0xafe8, 0x0804, 0xa85e, 0xa486, 0x0400, 0x1130, 0x2019,
++	0x0002, 0x080c, 0xaf9a, 0x0804, 0xa85e, 0xa486, 0x0200, 0x1110,
++	0x080c, 0xaf7f, 0xa486, 0x1000, 0x1110, 0x080c, 0xafcd, 0x0804,
++	0xa85e, 0x2069, 0xb774, 0x6a00, 0xd284, 0x0904, 0xa8c1, 0xa284,
++	0x0300, 0x1904, 0xa8ba, 0x6804, 0xa005, 0x0904, 0xa8a2, 0x2d78,
++	0x6003, 0x0007, 0x080c, 0x15db, 0x0904, 0xa865, 0x7800, 0xd08c,
++	0x1118, 0x7804, 0x8001, 0x7806, 0x6013, 0x0000, 0x6803, 0x0000,
++	0x6837, 0x0116, 0x683b, 0x0000, 0x6008, 0x68b2, 0x2c00, 0x684a,
++	0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, 0x6986, 0x6846, 0x7928,
++	0x698a, 0x792c, 0x698e, 0x7930, 0x6992, 0x7934, 0x6996, 0x6853,
++	0x003d, 0x7244, 0xa294, 0x0003, 0xa286, 0x0002, 0x1118, 0x684f,
++	0x0040, 0x0040, 0xa286, 0x0001, 0x1118, 0x684f, 0x0080, 0x0010,
++	0x684f, 0x0000, 0x20a9, 0x000a, 0x2001, 0xba90, 0xad90, 0x0015,
++	0x200c, 0x810f, 0x2112, 0x8000, 0x8210, 0x1f04, 0xa850, 0x200c,
++	0x6982, 0x8000, 0x200c, 0x697e, 0x080c, 0x53c9, 0x002e, 0x004e,
++	0x015e, 0x00fe, 0x00ee, 0x00de, 0x0005, 0x2001, 0xb40e, 0x2004,
++	0xd084, 0x0120, 0x080c, 0x15f4, 0x1904, 0xa816, 0x6013, 0x0100,
++	0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x6c52, 0x080c, 0x7134,
++	0x0c28, 0x2069, 0xba92, 0x2d04, 0xa084, 0xff00, 0xa086, 0x1200,
++	0x11a8, 0x2069, 0xba80, 0x686c, 0xa084, 0x00ff, 0x0016, 0x6110,
++	0xa18c, 0x0700, 0xa10d, 0x6112, 0x001e, 0x6003, 0x0001, 0x6007,
++	0x0043, 0x080c, 0x6c52, 0x080c, 0x7134, 0x0840, 0x6013, 0x0200,
++	0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x6c52, 0x080c, 0x7134,
++	0x0804, 0xa85e, 0x2001, 0xb40d, 0x2004, 0xd0ec, 0x0120, 0x2011,
++	0x8049, 0x080c, 0x3e8a, 0x6013, 0x0300, 0x0010, 0x6013, 0x0100,
++	0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x6c52, 0x080c, 0x7134,
++	0x0804, 0xa85e, 0x6013, 0x0500, 0x0c98, 0x6013, 0x0600, 0x0804,
++	0xa879, 0x6013, 0x0200, 0x0804, 0xa879, 0xa186, 0x0013, 0x1170,
++	0x6004, 0xa08a, 0x0040, 0x0a0c, 0x1511, 0xa08a, 0x0053, 0x1a0c,
++	0x1511, 0xa082, 0x0040, 0x2008, 0x0804, 0xa94f, 0xa186, 0x0051,
++	0x0138, 0xa186, 0x0047, 0x11d8, 0x6004, 0xa086, 0x0041, 0x0518,
++	0x2001, 0x0109, 0x2004, 0xd084, 0x01f0, 0x0126, 0x2091, 0x2800,
++	0x0006, 0x0016, 0x0026, 0x080c, 0x6b39, 0x002e, 0x001e, 0x000e,
++	0x012e, 0x6000, 0xa086, 0x0002, 0x1170, 0x0804, 0xa992, 0xa186,
++	0x0027, 0x0120, 0xa186, 0x0014, 0x190c, 0x1511, 0x6004, 0xa082,
++	0x0040, 0x2008, 0x001a, 0x080c, 0x8606, 0x0005, 0xa919, 0xa91b,
++	0xa91b, 0xa93f, 0xa919, 0xa919, 0xa919, 0xa919, 0xa919, 0xa919,
++	0xa919, 0xa919, 0xa919, 0xa919, 0xa919, 0xa919, 0xa919, 0xa919,
++	0xa919, 0x080c, 0x1511, 0x080c, 0x7055, 0x080c, 0x7134, 0x0036,
++	0x00d6, 0x6010, 0xa06d, 0x01c0, 0xad84, 0xf000, 0x01a8, 0x6003,
++	0x0002, 0x6018, 0x2004, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c,
++	0xb01c, 0x6013, 0x0000, 0x6014, 0xa005, 0x1120, 0x2001, 0xb6b7,
++	0x2004, 0x6016, 0x6003, 0x0007, 0x00de, 0x003e, 0x0005, 0x00d6,
++	0x080c, 0x7055, 0x080c, 0x7134, 0x080c, 0x9beb, 0x0120, 0x6010,
++	0x2068, 0x080c, 0x160b, 0x080c, 0x9dae, 0x00de, 0x0005, 0x0002,
++	0xa963, 0xa980, 0xa96c, 0xa98c, 0xa963, 0xa963, 0xa963, 0xa963,
++	0xa963, 0xa963, 0xa963, 0xa963, 0xa963, 0xa963, 0xa963, 0xa963,
++	0xa963, 0xa963, 0xa963, 0x080c, 0x1511, 0x6010, 0xa088, 0x0013,
++	0x2104, 0xa085, 0x0400, 0x200a, 0x080c, 0x7055, 0x6010, 0xa080,
++	0x0013, 0x2004, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043,
++	0x080c, 0x85ef, 0x0010, 0x6003, 0x0002, 0x080c, 0x7134, 0x0005,
++	0x080c, 0x7055, 0x080c, 0xb25a, 0x1120, 0x080c, 0x6ab4, 0x080c,
++	0x85c0, 0x080c, 0x7134, 0x0005, 0x080c, 0x7055, 0x2009, 0x0041,
++	0x0804, 0xaadb, 0xa182, 0x0040, 0x0002, 0xa9a8, 0xa9aa, 0xa9a8,
++	0xa9a8, 0xa9a8, 0xa9a8, 0xa9a8, 0xa9ab, 0xa9a8, 0xa9a8, 0xa9a8,
++	0xa9a8, 0xa9a8, 0xa9a8, 0xa9a8, 0xa9a8, 0xa9a8, 0xa9b6, 0xa9a8,
++	0x080c, 0x1511, 0x0005, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005,
++	0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1856, 0x0005, 0x00d6, 0x080c,
++	0x6ab4, 0x00de, 0x080c, 0xb2bd, 0x080c, 0x85c0, 0x0005, 0xa182,
++	0x0040, 0x0002, 0xa9d5, 0xa9d5, 0xa9d5, 0xa9d5, 0xa9d5, 0xa9d5,
++	0xa9d5, 0xa9d7, 0xa9d5, 0xa9da, 0xaa13, 0xa9d5, 0xa9d5, 0xa9d5,
++	0xa9d5, 0xaa13, 0xa9d5, 0xa9d5, 0xa9d5, 0x080c, 0x1511, 0x080c,
++	0x8606, 0x0005, 0x2001, 0xb472, 0x2004, 0xd0e4, 0x0158, 0x2001,
++	0x0100, 0x2004, 0xa082, 0x0005, 0x0228, 0x2001, 0x011f, 0x2004,
++	0x6036, 0x0010, 0x6037, 0x0000, 0x080c, 0x70e7, 0x080c, 0x71f1,
++	0x6010, 0x00d6, 0x2068, 0x684c, 0xd0fc, 0x0150, 0xa08c, 0x0003,
++	0xa18e, 0x0002, 0x0168, 0x2009, 0x0041, 0x00de, 0x0804, 0xaadb,
++	0x6003, 0x0007, 0x6017, 0x0000, 0x080c, 0x6ab4, 0x00de, 0x0005,
++	0x080c, 0xb25a, 0x0110, 0x00de, 0x0005, 0x080c, 0x6ab4, 0x080c,
++	0x85c0, 0x00de, 0x0ca0, 0x0036, 0x080c, 0x70e7, 0x080c, 0x71f1,
++	0x6010, 0x00d6, 0x2068, 0x6018, 0x2004, 0xd0bc, 0x0188, 0x684c,
++	0xa084, 0x0003, 0xa086, 0x0002, 0x0140, 0x687c, 0x632c, 0xa31a,
++	0x632e, 0x6880, 0x6328, 0xa31b, 0x632a, 0x6003, 0x0002, 0x0080,
++	0x2019, 0x0004, 0x080c, 0xb01c, 0x6014, 0xa005, 0x1128, 0x2001,
++	0xb6b7, 0x2004, 0x8003, 0x6016, 0x6013, 0x0000, 0x6003, 0x0007,
++	0x00de, 0x003e, 0x0005, 0xa186, 0x0013, 0x1150, 0x6004, 0xa086,
++	0x0042, 0x190c, 0x1511, 0x080c, 0x7055, 0x080c, 0x7134, 0x0005,
++	0xa186, 0x0027, 0x0118, 0xa186, 0x0014, 0x1180, 0x6004, 0xa086,
++	0x0042, 0x190c, 0x1511, 0x2001, 0x0007, 0x080c, 0x4eeb, 0x080c,
++	0x7055, 0x080c, 0x9dae, 0x080c, 0x7134, 0x0005, 0xa182, 0x0040,
++	0x0002, 0xaa7c, 0xaa7c, 0xaa7c, 0xaa7c, 0xaa7c, 0xaa7c, 0xaa7c,
++	0xaa7e, 0xaa8a, 0xaa7c, 0xaa7c, 0xaa7c, 0xaa7c, 0xaa7c, 0xaa7c,
++	0xaa7c, 0xaa7c, 0xaa7c, 0xaa7c, 0x080c, 0x1511, 0x0036, 0x0046,
++	0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1856, 0x004e,
++	0x003e, 0x0005, 0x6010, 0x00d6, 0x2068, 0x6810, 0x6a14, 0x0006,
++	0x0046, 0x0056, 0x6c7c, 0xa422, 0x6d80, 0x2200, 0xa52b, 0x602c,
++	0xa420, 0x642e, 0x6028, 0xa529, 0x652a, 0x005e, 0x004e, 0x000e,
++	0xa20d, 0x1178, 0x684c, 0xd0fc, 0x0120, 0x2009, 0x0041, 0x00de,
++	0x0490, 0x6003, 0x0007, 0x6017, 0x0000, 0x080c, 0x6ab4, 0x00de,
++	0x0005, 0x0006, 0x00f6, 0x2c78, 0x080c, 0x52c6, 0x00fe, 0x000e,
++	0x0120, 0x6003, 0x0002, 0x00de, 0x0005, 0x2009, 0xb40d, 0x210c,
++	0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006, 0x0021,
++	0x080c, 0x6ab6, 0x00de, 0x0005, 0xd2fc, 0x0140, 0x8002, 0x8000,
++	0x8212, 0xa291, 0x0000, 0x2009, 0x0009, 0x0010, 0x2009, 0x0015,
++	0x6a6a, 0x6866, 0x0005, 0xa182, 0x0040, 0x0208, 0x0062, 0xa186,
++	0x0013, 0x0120, 0xa186, 0x0014, 0x190c, 0x1511, 0x6020, 0xd0dc,
++	0x090c, 0x1511, 0x0005, 0xaafe, 0xab05, 0xab11, 0xab1d, 0xaafe,
++	0xaafe, 0xaafe, 0xab2c, 0xaafe, 0xab00, 0xab00, 0xaafe, 0xaafe,
++	0xaafe, 0xaafe, 0xab00, 0xaafe, 0xab00, 0xaafe, 0x080c, 0x1511,
++	0x6020, 0xd0dc, 0x090c, 0x1511, 0x0005, 0x6003, 0x0001, 0x6106,
++	0x080c, 0x6c52, 0x0126, 0x2091, 0x8000, 0x080c, 0x7134, 0x012e,
++	0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x6c52, 0x0126, 0x2091,
++	0x8000, 0x080c, 0x7134, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106,
++	0x2c10, 0x080c, 0x1f7a, 0x0126, 0x2091, 0x8000, 0x080c, 0x6cb5,
++	0x080c, 0x71f1, 0x012e, 0x0005, 0xa016, 0x080c, 0x1856, 0x0005,
++	0x0126, 0x2091, 0x8000, 0x0036, 0x00d6, 0xa182, 0x0040, 0x0023,
++	0x00de, 0x003e, 0x012e, 0x0005, 0xab4c, 0xab4e, 0xab60, 0xab7b,
++	0xab4c, 0xab4c, 0xab4c, 0xab90, 0xab4c, 0xab4c, 0xab4c, 0xab4c,
++	0xab4c, 0xab4c, 0xab4c, 0xab4c, 0x080c, 0x1511, 0x6010, 0x2068,
++	0x684c, 0xd0fc, 0x01f8, 0xa09c, 0x0003, 0xa39e, 0x0003, 0x01d0,
++	0x6003, 0x0001, 0x6106, 0x080c, 0x6c52, 0x080c, 0x7134, 0x0498,
++	0x6010, 0x2068, 0x684c, 0xd0fc, 0x0168, 0xa09c, 0x0003, 0xa39e,
++	0x0003, 0x0140, 0x6003, 0x0001, 0x6106, 0x080c, 0x6c52, 0x080c,
++	0x7134, 0x0408, 0x6013, 0x0000, 0x6017, 0x0000, 0x2019, 0x0004,
++	0x080c, 0xb01c, 0x00c0, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0d90,
++	0xa09c, 0x0003, 0xa39e, 0x0003, 0x0d68, 0x6003, 0x0003, 0x6106,
++	0x2c10, 0x080c, 0x1f7a, 0x080c, 0x6cb5, 0x080c, 0x71f1, 0x0018,
++	0xa016, 0x080c, 0x1856, 0x0005, 0x080c, 0x7055, 0x6110, 0x81ff,
++	0x0158, 0x00d6, 0x2168, 0x080c, 0xb303, 0x0036, 0x2019, 0x0029,
++	0x080c, 0xb01c, 0x003e, 0x00de, 0x080c, 0x9dae, 0x080c, 0x7134,
++	0x0005, 0x080c, 0x70e7, 0x6110, 0x81ff, 0x0158, 0x00d6, 0x2168,
++	0x080c, 0xb303, 0x0036, 0x2019, 0x0029, 0x080c, 0xb01c, 0x003e,
++	0x00de, 0x080c, 0x9dae, 0x080c, 0x71f1, 0x0005, 0xa182, 0x0085,
++	0x0002, 0xabca, 0xabc8, 0xabc8, 0xabd6, 0xabc8, 0xabc8, 0xabc8,
++	0x080c, 0x1511, 0x6003, 0x000b, 0x6106, 0x080c, 0x6c52, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x7134, 0x012e, 0x0005, 0x0026, 0x00e6,
++	0x080c, 0xb253, 0x0118, 0x080c, 0x85c0, 0x00c8, 0x2071, 0xba80,
++	0x7224, 0x6212, 0x7220, 0x080c, 0xaeca, 0x0118, 0x6007, 0x0086,
++	0x0040, 0x6007, 0x0087, 0x7224, 0xa296, 0xffff, 0x1110, 0x6007,
++	0x0086, 0x6003, 0x0001, 0x080c, 0x6c52, 0x080c, 0x7134, 0x00ee,
++	0x002e, 0x0005, 0xa186, 0x0013, 0x1160, 0x6004, 0xa08a, 0x0085,
++	0x0a0c, 0x1511, 0xa08a, 0x008c, 0x1a0c, 0x1511, 0xa082, 0x0085,
++	0x00a2, 0xa186, 0x0027, 0x0130, 0xa186, 0x0014, 0x0118, 0x080c,
++	0x8606, 0x0050, 0x2001, 0x0007, 0x080c, 0x4eeb, 0x080c, 0x7055,
++	0x080c, 0x9dae, 0x080c, 0x7134, 0x0005, 0xac24, 0xac26, 0xac26,
++	0xac24, 0xac24, 0xac24, 0xac24, 0x080c, 0x1511, 0x080c, 0x7055,
++	0x080c, 0x9dae, 0x080c, 0x7134, 0x0005, 0xa182, 0x0085, 0x0a0c,
++	0x1511, 0xa182, 0x008c, 0x1a0c, 0x1511, 0xa182, 0x0085, 0x0002,
++	0xac3f, 0xac3f, 0xac3f, 0xac41, 0xac3f, 0xac3f, 0xac3f, 0x080c,
++	0x1511, 0x0005, 0xa186, 0x0013, 0x0148, 0xa186, 0x0014, 0x0130,
++	0xa186, 0x0027, 0x0118, 0x080c, 0x8606, 0x0030, 0x080c, 0x7055,
++	0x080c, 0x9dae, 0x080c, 0x7134, 0x0005, 0x0036, 0x080c, 0xb2bd,
++	0x603f, 0x0000, 0x2019, 0x000b, 0x0031, 0x601f, 0x0006, 0x6003,
++	0x0007, 0x003e, 0x0005, 0x0126, 0x0036, 0x2091, 0x8000, 0x0086,
++	0x2c40, 0x0096, 0x2049, 0x0000, 0x080c, 0x80da, 0x009e, 0x008e,
++	0x1578, 0x0076, 0x2c38, 0x080c, 0x8179, 0x007e, 0x1548, 0x6000,
++	0xa086, 0x0000, 0x0528, 0x601c, 0xa086, 0x0007, 0x0508, 0x00d6,
++	0x6000, 0xa086, 0x0004, 0x1150, 0x080c, 0xb2bd, 0x601f, 0x0007,
++	0x2001, 0xb6b6, 0x2004, 0x6016, 0x080c, 0x1944, 0x6010, 0x2068,
++	0x080c, 0x9beb, 0x0110, 0x080c, 0xb01c, 0x00de, 0x6013, 0x0000,
++	0x080c, 0xb2bd, 0x601f, 0x0007, 0x2001, 0xb6b6, 0x2004, 0x6016,
++	0x003e, 0x012e, 0x0005, 0x00f6, 0x00c6, 0x0036, 0x0156, 0x2079,
++	0xba80, 0x7938, 0x783c, 0x080c, 0x27e3, 0x15b0, 0x0016, 0x00c6,
++	0x080c, 0x4f6a, 0x1578, 0x001e, 0x002e, 0x0026, 0x0016, 0x2019,
++	0x0029, 0x080c, 0x823c, 0x080c, 0x6dba, 0x0076, 0x2039, 0x0000,
++	0x080c, 0x6cc7, 0x007e, 0x001e, 0x0076, 0x2039, 0x0000, 0x080c,
++	0xae05, 0x007e, 0x080c, 0x516b, 0x0026, 0x6204, 0xa294, 0xff00,
++	0x8217, 0xa286, 0x0006, 0x0118, 0xa286, 0x0004, 0x1118, 0x62a0,
++	0x080c, 0x2d19, 0x002e, 0x001e, 0x080c, 0x4bc5, 0x6612, 0x6516,
++	0xa006, 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, 0x00ce, 0x00fe,
++	0x0005, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x2009, 0xb421, 0x2104,
++	0xa086, 0x0074, 0x1904, 0xad3e, 0x2069, 0xba8e, 0x690c, 0xa182,
++	0x0100, 0x06c0, 0x6908, 0xa184, 0x8000, 0x05e8, 0x2001, 0xb69e,
++	0x2004, 0xa005, 0x1160, 0x6018, 0x2070, 0x7010, 0xa084, 0x00ff,
++	0x0118, 0x7000, 0xd0f4, 0x0118, 0xa184, 0x0800, 0x0560, 0x6910,
++	0xa18a, 0x0001, 0x0610, 0x6914, 0x2069, 0xbaae, 0x6904, 0x81ff,
++	0x1198, 0x690c, 0xa182, 0x0100, 0x02a8, 0x6908, 0x81ff, 0x1178,
++	0x6910, 0xa18a, 0x0001, 0x0288, 0x6918, 0xa18a, 0x0001, 0x0298,
++	0x00d0, 0x6013, 0x0100, 0x00a0, 0x6013, 0x0300, 0x0088, 0x6013,
++	0x0500, 0x0070, 0x6013, 0x0700, 0x0058, 0x6013, 0x0900, 0x0040,
++	0x6013, 0x0b00, 0x0028, 0x6013, 0x0f00, 0x0010, 0x6013, 0x2d00,
++	0xa085, 0x0001, 0x0008, 0xa006, 0x001e, 0x00ee, 0x00de, 0x00ce,
++	0x0005, 0x00c6, 0x00d6, 0x0026, 0x0036, 0x0156, 0x6218, 0x2268,
++	0x6b04, 0xa394, 0x00ff, 0xa286, 0x0006, 0x0190, 0xa286, 0x0004,
++	0x0178, 0xa394, 0xff00, 0x8217, 0xa286, 0x0006, 0x0148, 0xa286,
++	0x0004, 0x0130, 0x00c6, 0x2d60, 0x080c, 0x4f79, 0x00ce, 0x04c0,
++	0x2011, 0xba96, 0xad98, 0x000a, 0x20a9, 0x0004, 0x080c, 0x907a,
++	0x1580, 0x2011, 0xba9a, 0xad98, 0x0006, 0x20a9, 0x0004, 0x080c,
++	0x907a, 0x1538, 0x0046, 0x0016, 0x6aa0, 0xa294, 0x00ff, 0x8227,
++	0xa006, 0x2009, 0xb453, 0x210c, 0xd1a4, 0x0138, 0x2009, 0x0029,
++	0x080c, 0xb06b, 0x6800, 0xc0e5, 0x6802, 0x2019, 0x0029, 0x080c,
++	0x6dba, 0x0076, 0x2039, 0x0000, 0x080c, 0x6cc7, 0x2c08, 0x080c,
++	0xae05, 0x007e, 0x2001, 0x0007, 0x080c, 0x4eeb, 0x001e, 0x004e,
++	0xa006, 0x015e, 0x003e, 0x002e, 0x00de, 0x00ce, 0x0005, 0x00d6,
++	0x2069, 0xba8e, 0x6800, 0xa086, 0x0800, 0x0118, 0x6013, 0x0000,
++	0x0008, 0xa006, 0x00de, 0x0005, 0x00c6, 0x00f6, 0x0016, 0x0026,
++	0x0036, 0x0156, 0x2079, 0xba8c, 0x7930, 0x7834, 0x080c, 0x27e3,
++	0x11a0, 0x080c, 0x4f6a, 0x1188, 0x2011, 0xba90, 0xac98, 0x000a,
++	0x20a9, 0x0004, 0x080c, 0x907a, 0x1140, 0x2011, 0xba94, 0xac98,
++	0x0006, 0x20a9, 0x0004, 0x080c, 0x907a, 0x015e, 0x003e, 0x002e,
++	0x001e, 0x00fe, 0x00ce, 0x0005, 0x00c6, 0x0006, 0x0016, 0x0026,
++	0x0036, 0x0156, 0x2011, 0xba83, 0x2204, 0x8211, 0x220c, 0x080c,
++	0x27e3, 0x11a0, 0x080c, 0x4f6a, 0x1188, 0x2011, 0xba96, 0xac98,
++	0x000a, 0x20a9, 0x0004, 0x080c, 0x907a, 0x1140, 0x2011, 0xba9a,
++	0xac98, 0x0006, 0x20a9, 0x0004, 0x080c, 0x907a, 0x015e, 0x003e,
++	0x002e, 0x001e, 0x000e, 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0086,
++	0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0126, 0x2091, 0x8000,
++	0x2740, 0x2029, 0xb6e9, 0x252c, 0x2021, 0xb6ef, 0x2424, 0x2061,
++	0xbc00, 0x2071, 0xb400, 0x7648, 0x7068, 0x81ff, 0x0150, 0x0006,
++	0xa186, 0xb7f4, 0x000e, 0x0128, 0x8001, 0xa602, 0x1a04, 0xae86,
++	0x0018, 0xa606, 0x0904, 0xae86, 0x2100, 0xac06, 0x0904, 0xae7d,
++	0x080c, 0xb093, 0x0904, 0xae7d, 0x671c, 0xa786, 0x0001, 0x0904,
++	0xaea1, 0xa786, 0x0004, 0x0904, 0xaea1, 0xa786, 0x0007, 0x05e8,
++	0x2500, 0xac06, 0x05d0, 0x2400, 0xac06, 0x05b8, 0x080c, 0xb0a3,
++	0x15a0, 0x88ff, 0x0118, 0x6050, 0xa906, 0x1578, 0x00d6, 0x6000,
++	0xa086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1944, 0x001e, 0xa786,
++	0x0008, 0x1148, 0x080c, 0x9de9, 0x1130, 0x080c, 0x8bbc, 0x00de,
++	0x080c, 0x9dae, 0x00d0, 0x6010, 0x2068, 0x080c, 0x9beb, 0x0190,
++	0xa786, 0x0003, 0x1528, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000,
++	0x080c, 0xb303, 0x0016, 0x080c, 0x9e5d, 0x080c, 0x53c9, 0x001e,
++	0x080c, 0x9da2, 0x00de, 0x080c, 0x9dae, 0xace0, 0x0018, 0x2001,
++	0xb417, 0x2004, 0xac02, 0x1210, 0x0804, 0xae19, 0x012e, 0x002e,
++	0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, 0x0005,
++	0xa786, 0x0006, 0x1150, 0xa386, 0x0005, 0x0128, 0x080c, 0xb303,
++	0x080c, 0xb01c, 0x08f8, 0x00de, 0x0c00, 0xa786, 0x000a, 0x0968,
++	0x0850, 0x080c, 0xb0a3, 0x19c8, 0x81ff, 0x09b8, 0xa180, 0x0001,
++	0x2004, 0xa086, 0x0018, 0x0130, 0xa180, 0x0001, 0x2004, 0xa086,
++	0x002d, 0x1958, 0x6000, 0xa086, 0x0002, 0x1938, 0x080c, 0x9dd8,
++	0x0130, 0x080c, 0x9de9, 0x1908, 0x080c, 0x8bbc, 0x0038, 0x080c,
++	0x2c86, 0x080c, 0x9de9, 0x1110, 0x080c, 0x8bbc, 0x080c, 0x9dae,
++	0x0804, 0xae7d, 0x00c6, 0x00e6, 0x0016, 0x2c08, 0x2170, 0xa006,
++	0x080c, 0xb03d, 0x001e, 0x0120, 0x601c, 0xa084, 0x000f, 0x001b,
++	0x00ee, 0x00ce, 0x0005, 0xaee3, 0xaee3, 0xaee3, 0xaee3, 0xaee3,
++	0xaee3, 0xaee5, 0xaee3, 0xa006, 0x0005, 0x0046, 0x0016, 0x7018,
++	0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00, 0x2009,
++	0x0020, 0x080c, 0xb06b, 0x001e, 0x004e, 0x0036, 0x2019, 0x0002,
++	0x080c, 0xac63, 0x003e, 0xa085, 0x0001, 0x0005, 0x2001, 0x0001,
++	0x080c, 0x4eac, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004,
++	0x2019, 0xb405, 0x2011, 0xba96, 0x080c, 0x907a, 0x003e, 0x002e,
++	0x001e, 0x015e, 0xa005, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086,
++	0x0076, 0x0066, 0x0026, 0x0126, 0x2091, 0x8000, 0x2740, 0x2061,
++	0xbc00, 0x2079, 0x0001, 0x8fff, 0x0904, 0xaf72, 0x2071, 0xb400,
++	0x7648, 0x7068, 0x8001, 0xa602, 0x1a04, 0xaf72, 0x88ff, 0x0128,
++	0x2800, 0xac06, 0x15b0, 0x2079, 0x0000, 0x080c, 0xb093, 0x0588,
++	0x2400, 0xac06, 0x0570, 0x671c, 0xa786, 0x0006, 0x1550, 0xa786,
++	0x0007, 0x0538, 0x88ff, 0x1140, 0x6018, 0xa206, 0x1510, 0x85ff,
++	0x0118, 0x6050, 0xa106, 0x11e8, 0x00d6, 0x6000, 0xa086, 0x0004,
++	0x1150, 0x080c, 0xb2bd, 0x601f, 0x0007, 0x2001, 0xb6b6, 0x2004,
++	0x6016, 0x080c, 0x1944, 0x6010, 0x2068, 0x080c, 0x9beb, 0x0120,
++	0x0046, 0x080c, 0xb01c, 0x004e, 0x00de, 0x080c, 0x9dae, 0x88ff,
++	0x1198, 0xace0, 0x0018, 0x2001, 0xb417, 0x2004, 0xac02, 0x1210,
++	0x0804, 0xaf23, 0xa006, 0x012e, 0x002e, 0x006e, 0x007e, 0x008e,
++	0x00ce, 0x00ee, 0x00fe, 0x0005, 0xa8c5, 0x0001, 0x0ca0, 0x0076,
++	0x0056, 0x0086, 0x2041, 0x0000, 0x2029, 0x0001, 0x2c20, 0x2019,
++	0x0002, 0x6218, 0x0096, 0x2049, 0x0000, 0x080c, 0x80da, 0x009e,
++	0x008e, 0x2039, 0x0000, 0x080c, 0x8179, 0x080c, 0xaf14, 0x005e,
++	0x007e, 0x0005, 0x0026, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156,
++	0x2c20, 0x2128, 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x0036,
++	0x080c, 0x4f6a, 0x11b0, 0x2c10, 0x0056, 0x0086, 0x2041, 0x0000,
++	0x2508, 0x2029, 0x0001, 0x0096, 0x2049, 0x0000, 0x080c, 0x80da,
++	0x009e, 0x008e, 0x2039, 0x0000, 0x080c, 0x8179, 0x080c, 0xaf14,
++	0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, 0xafa6, 0x015e, 0x00ce,
++	0x007e, 0x005e, 0x004e, 0x002e, 0x0005, 0x0076, 0x0056, 0x6218,
++	0x0086, 0x2041, 0x0000, 0x2029, 0x0001, 0x2019, 0x0048, 0x0096,
++	0x2049, 0x0000, 0x080c, 0x80da, 0x009e, 0x008e, 0x2039, 0x0000,
++	0x080c, 0x8179, 0x2c20, 0x080c, 0xaf14, 0x005e, 0x007e, 0x0005,
++	0x0026, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x20a9,
++	0x007f, 0x2009, 0x0000, 0x0016, 0x0036, 0x080c, 0x4f6a, 0x11c0,
++	0x2c10, 0x0086, 0x2041, 0x0000, 0x2828, 0x0046, 0x2021, 0x0001,
++	0x080c, 0xb29f, 0x004e, 0x0096, 0x2049, 0x0000, 0x080c, 0x80da,
++	0x009e, 0x008e, 0x2039, 0x0000, 0x080c, 0x8179, 0x080c, 0xaf14,
++	0x003e, 0x001e, 0x8108, 0x1f04, 0xaff3, 0x015e, 0x00ce, 0x007e,
++	0x005e, 0x004e, 0x002e, 0x0005, 0x0016, 0x00f6, 0x3800, 0xd08c,
++	0x0130, 0xad82, 0x1000, 0x02b0, 0xad82, 0xb400, 0x0230, 0xad82,
++	0xec00, 0x0280, 0xad82, 0xffff, 0x1268, 0x6800, 0xa07d, 0x0138,
++	0x6803, 0x0000, 0x6b52, 0x080c, 0x53c9, 0x2f68, 0x0cb0, 0x6b52,
++	0x080c, 0x53c9, 0x00fe, 0x001e, 0x0005, 0x00e6, 0x0046, 0x0036,
++	0x2061, 0xbc00, 0xa005, 0x1138, 0x2071, 0xb400, 0x7448, 0x7068,
++	0x8001, 0xa402, 0x12d8, 0x2100, 0xac06, 0x0168, 0x6000, 0xa086,
++	0x0000, 0x0148, 0x6008, 0xa206, 0x1130, 0x6018, 0xa1a0, 0x0006,
++	0x2424, 0xa406, 0x0140, 0xace0, 0x0018, 0x2001, 0xb417, 0x2004,
++	0xac02, 0x1220, 0x0c40, 0xa085, 0x0001, 0x0008, 0xa006, 0x003e,
++	0x004e, 0x00ee, 0x0005, 0x00d6, 0x0006, 0x080c, 0x15f4, 0x000e,
++	0x090c, 0x1511, 0x6837, 0x010d, 0x685e, 0x0026, 0x2010, 0x080c,
++	0x9bdb, 0x2001, 0x0000, 0x0120, 0x2200, 0xa080, 0x0014, 0x2004,
++	0x002e, 0x684a, 0x6956, 0x6c46, 0x684f, 0x0000, 0x2001, 0xb6be,
++	0x2004, 0x6852, 0xa006, 0x68b2, 0x6802, 0x683a, 0x685a, 0x080c,
++	0x53c9, 0x00de, 0x0005, 0x6700, 0xa786, 0x0000, 0x0158, 0xa786,
++	0x0001, 0x0140, 0xa786, 0x000a, 0x0128, 0xa786, 0x0009, 0x0110,
++	0xa085, 0x0001, 0x0005, 0x00e6, 0x6018, 0x2070, 0x70a0, 0xa206,
++	0x00ee, 0x0005, 0x0016, 0x6004, 0xa08e, 0x001e, 0x11a0, 0x8007,
++	0x6130, 0xa18c, 0x00ff, 0xa105, 0x6032, 0x6007, 0x0085, 0x6003,
++	0x000b, 0x601f, 0x0005, 0x2001, 0xb6b7, 0x2004, 0x6016, 0x080c,
++	0x6c52, 0x080c, 0x7134, 0x001e, 0x0005, 0xe000, 0xe000, 0x0005,
++	0x6020, 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, 0x9ec6, 0x0030,
++	0x080c, 0xb2bd, 0x080c, 0x6ab4, 0x080c, 0x85c0, 0x0005, 0xa280,
++	0x0007, 0x2004, 0xa084, 0x000f, 0x0002, 0xb0e6, 0xb0e6, 0xb0e6,
++	0xb0eb, 0xb0e6, 0xb0e8, 0xb0e8, 0xb0e6, 0xb0e8, 0xa006, 0x0005,
++	0x00c6, 0x2260, 0x00ce, 0xa085, 0x0001, 0x0005, 0xa280, 0x0007,
++	0x2004, 0xa084, 0x000f, 0x0002, 0xb0fd, 0xb0fd, 0xb0fd, 0xb0fd,
++	0xb0fd, 0xb0fd, 0xb108, 0xb0fd, 0xb0fd, 0x6007, 0x003b, 0x602b,
++	0x0009, 0x6013, 0x2a00, 0x6003, 0x0001, 0x080c, 0x6c52, 0x0005,
++	0x00c6, 0x2260, 0x080c, 0xb2bd, 0x603f, 0x0000, 0x6020, 0xc0f4,
++	0xc0cc, 0x6022, 0x6037, 0x0000, 0x00ce, 0x00d6, 0x2268, 0xa186,
++	0x0007, 0x1904, 0xb163, 0x6810, 0xa005, 0x0138, 0xa080, 0x0013,
++	0x2004, 0xd0fc, 0x1110, 0x00de, 0x08c0, 0x6007, 0x003a, 0x6003,
++	0x0001, 0x080c, 0x6c52, 0x080c, 0x7134, 0x00c6, 0x2d60, 0x6100,
++	0xa186, 0x0002, 0x1904, 0xb1ec, 0x6010, 0xa005, 0x1138, 0x6000,
++	0xa086, 0x0007, 0x190c, 0x1511, 0x0804, 0xb1ec, 0xa08c, 0xf000,
++	0x1130, 0x0028, 0x2068, 0x6800, 0xa005, 0x1de0, 0x2d00, 0xa080,
++	0x0013, 0x2004, 0xa084, 0x0003, 0xa086, 0x0002, 0x1180, 0x6010,
++	0x2068, 0x684c, 0xc0dc, 0xc0f4, 0x684e, 0x6850, 0xc0f4, 0xc0fc,
++	0x6852, 0x2009, 0x0043, 0x080c, 0xaadb, 0x0804, 0xb1ec, 0x2009,
++	0x0041, 0x0804, 0xb1e6, 0xa186, 0x0005, 0x15f0, 0x6810, 0xa080,
++	0x0013, 0x2004, 0xd0bc, 0x1118, 0x00de, 0x0804, 0xb0fd, 0xd0b4,
++	0x0128, 0xd0fc, 0x090c, 0x1511, 0x0804, 0xb11b, 0x6007, 0x003a,
++	0x6003, 0x0001, 0x080c, 0x6c52, 0x080c, 0x7134, 0x00c6, 0x2d60,
++	0x6100, 0xa186, 0x0002, 0x0120, 0xa186, 0x0004, 0x1904, 0xb1ec,
++	0x2071, 0xb723, 0x7000, 0xa086, 0x0003, 0x1128, 0x7004, 0xac06,
++	0x1110, 0x7003, 0x0000, 0x6810, 0xa080, 0x0013, 0x200c, 0xc1f4,
++	0xc1dc, 0x2102, 0x8000, 0x200c, 0xc1f4, 0xc1fc, 0xc1bc, 0x2102,
++	0x2009, 0x0042, 0x0804, 0xb1e6, 0x0036, 0x00d6, 0x00d6, 0x080c,
++	0x15f4, 0x003e, 0x090c, 0x1511, 0x6837, 0x010d, 0x6803, 0x0000,
++	0x683b, 0x0000, 0x685b, 0x0000, 0x6b5e, 0x6857, 0x0045, 0x2c00,
++	0x6862, 0x6034, 0x6872, 0x2360, 0x6020, 0xc0dd, 0x6022, 0x6018,
++	0xa080, 0x0028, 0x2004, 0xa084, 0x00ff, 0x8007, 0x6350, 0x6b4a,
++	0x6846, 0x684f, 0x0000, 0x6853, 0x0000, 0x6d6a, 0x6e66, 0x686f,
++	0x0001, 0x080c, 0x53c9, 0x2019, 0x0045, 0x6008, 0x2068, 0x080c,
++	0xac63, 0x2d00, 0x600a, 0x601f, 0x0006, 0x6003, 0x0007, 0x6017,
++	0x0000, 0x603f, 0x0000, 0x00de, 0x003e, 0x0038, 0x603f, 0x0000,
++	0x6003, 0x0007, 0x080c, 0xaadb, 0x00ce, 0x00de, 0x0005, 0xa186,
++	0x0013, 0x1128, 0x6004, 0xa082, 0x0085, 0x2008, 0x00c2, 0xa186,
++	0x0027, 0x1178, 0x080c, 0x7055, 0x0036, 0x00d6, 0x6010, 0x2068,
++	0x2019, 0x0004, 0x080c, 0xb01c, 0x00de, 0x003e, 0x080c, 0x7134,
++	0x0005, 0xa186, 0x0014, 0x0d70, 0x080c, 0x8606, 0x0005, 0xb218,
++	0xb216, 0xb216, 0xb216, 0xb216, 0xb216, 0xb218, 0x080c, 0x1511,
++	0x080c, 0x7055, 0x6003, 0x000c, 0x080c, 0x7134, 0x0005, 0xa182,
++	0x008c, 0x1220, 0xa182, 0x0085, 0x0208, 0x001a, 0x080c, 0x8606,
++	0x0005, 0xb230, 0xb230, 0xb230, 0xb230, 0xb232, 0xb250, 0xb230,
++	0x080c, 0x1511, 0x00d6, 0x2c68, 0x080c, 0x856a, 0x01a0, 0x6003,
++	0x0001, 0x6007, 0x001e, 0x2009, 0xba8e, 0x210c, 0x6136, 0x2009,
++	0xba8f, 0x210c, 0x613a, 0x600b, 0xffff, 0x6918, 0x611a, 0x601f,
++	0x0004, 0x080c, 0x6c52, 0x2d60, 0x080c, 0x85c0, 0x00de, 0x0005,
++	0x080c, 0x85c0, 0x0005, 0x00e6, 0x6018, 0x2070, 0x7000, 0xd0ec,
++	0x00ee, 0x0005, 0x6010, 0xa08c, 0xf000, 0x0904, 0xb29e, 0xa080,
++	0x0013, 0x200c, 0xd1ec, 0x05d0, 0x2001, 0xb472, 0x2004, 0xd0ec,
++	0x05a8, 0x6003, 0x0002, 0x6020, 0xc0e5, 0x6022, 0xd1ac, 0x0180,
++	0x00f6, 0x2c78, 0x080c, 0x52c2, 0x00fe, 0x0150, 0x2001, 0xb6b8,
++	0x2004, 0x603e, 0x2009, 0xb472, 0x210c, 0xd1f4, 0x11e8, 0x0080,
++	0x2009, 0xb472, 0x210c, 0xd1f4, 0x0128, 0x6020, 0xc0e4, 0x6022,
++	0xa006, 0x00a0, 0x2001, 0xb6b8, 0x200c, 0x8103, 0xa100, 0x603e,
++	0x6018, 0xa088, 0x002b, 0x2104, 0xa005, 0x0118, 0xa088, 0x0003,
++	0x0cd0, 0x2c0a, 0x600f, 0x0000, 0xa085, 0x0001, 0x0005, 0x0016,
++	0x00c6, 0x00e6, 0x6150, 0xa2f0, 0x002b, 0x2e04, 0x2060, 0x8cff,
++	0x0180, 0x84ff, 0x1118, 0x6050, 0xa106, 0x1138, 0x600c, 0x2072,
++	0x080c, 0x6ab4, 0x080c, 0x85c0, 0x0010, 0xacf0, 0x0003, 0x2e64,
++	0x0c70, 0x00ee, 0x00ce, 0x001e, 0x0005, 0x00d6, 0x6018, 0xa0e8,
++	0x002b, 0x2d04, 0xa005, 0x0140, 0xac06, 0x0120, 0x2d04, 0xa0e8,
++	0x0003, 0x0cb8, 0x600c, 0x206a, 0x00de, 0x0005, 0x0026, 0x0036,
++	0x0156, 0x2011, 0xb428, 0x2204, 0xa084, 0x00ff, 0x2019, 0xba8e,
++	0x2334, 0xa636, 0x11d8, 0x8318, 0x2334, 0x2204, 0xa084, 0xff00,
++	0xa636, 0x11a0, 0x2011, 0xba90, 0x6018, 0xa098, 0x000a, 0x20a9,
++	0x0004, 0x080c, 0x907a, 0x1150, 0x2011, 0xba94, 0x6018, 0xa098,
++	0x0006, 0x20a9, 0x0004, 0x080c, 0x907a, 0x1100, 0x015e, 0x003e,
++	0x002e, 0x0005, 0x00e6, 0x2071, 0xb400, 0x080c, 0x4b80, 0x080c,
++	0x2a7e, 0x00ee, 0x0005, 0x00e6, 0x6018, 0x2070, 0x7000, 0xd0fc,
++	0x0108, 0x0011, 0x00ee, 0x0005, 0x6850, 0xc0e5, 0x6852, 0x0005,
++	0x00e6, 0x00c6, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0016,
++	0x0126, 0x2091, 0x8000, 0x2029, 0xb6e9, 0x252c, 0x2021, 0xb6ef,
++	0x2424, 0x2061, 0xbc00, 0x2071, 0xb400, 0x7648, 0x7068, 0xa606,
++	0x0578, 0x671c, 0xa786, 0x0001, 0x0118, 0xa786, 0x0008, 0x1500,
++	0x2500, 0xac06, 0x01e8, 0x2400, 0xac06, 0x01d0, 0x080c, 0xb093,
++	0x01b8, 0x080c, 0xb0a3, 0x11a0, 0x6000, 0xa086, 0x0004, 0x1120,
++	0x0016, 0x080c, 0x1944, 0x001e, 0x080c, 0x9dd8, 0x1110, 0x080c,
++	0x2c86, 0x080c, 0x9de9, 0x1110, 0x080c, 0x8bbc, 0x080c, 0x9dae,
++	0xace0, 0x0018, 0x2001, 0xb417, 0x2004, 0xac02, 0x1208, 0x0858,
++	0x012e, 0x001e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x00ce,
++	0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, 0x8000,
++	0x2071, 0xb440, 0xd5a4, 0x0118, 0x7034, 0x8000, 0x7036, 0xd5b4,
++	0x0118, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0178, 0x2500, 0xa084,
++	0x0007, 0xa08e, 0x0003, 0x0148, 0xa08e, 0x0004, 0x0130, 0xa08e,
++	0x0005, 0x0118, 0x2071, 0xb44a, 0x04c9, 0x001e, 0x00ee, 0x000e,
++	0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, 0x8000,
++	0x2071, 0xb440, 0xd5a4, 0x0118, 0x7034, 0x8000, 0x7036, 0xd5b4,
++	0x0118, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0178, 0x2500, 0xa084,
++	0x0007, 0xa08e, 0x0003, 0x0148, 0xa08e, 0x0004, 0x0130, 0xa08e,
++	0x0005, 0x0118, 0x2071, 0xb44a, 0x0089, 0x001e, 0x00ee, 0x000e,
++	0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071,
++	0xb442, 0x0021, 0x00ee, 0x000e, 0x012e, 0x0005, 0x2e04, 0x8000,
++	0x2072, 0x1220, 0x8e70, 0x2e04, 0x8000, 0x2072, 0x0005, 0x00e6,
++	0x2071, 0xb440, 0x0c99, 0x00ee, 0x0005, 0x00e6, 0x2071, 0xb444,
++	0x0c69, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000,
++	0x2071, 0xb440, 0x7044, 0x8000, 0x7046, 0x00ee, 0x000e, 0x012e,
++	0x0005, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040,
++	0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000,
++	0x8000, 0x622c
++};
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/asm_2300.h	2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,6195 @@
++/* @(#)asm_2300.h 1.6 */
++/*
++ * Copyright (C) 2001 Qlogic, Inc.
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms are permitted provided
++ * that the following conditions are met:
++ * 1. Redistribution of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistribution in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR 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.
++ */ 
++
++/************************************************************************
++ *									*
++ *               --- ISP2300 Initiator/Target Firmware ---              *
++ *             with Fabric (Public Loop), Point-point, and              *
++ *             expanded LUN addressing for FCTAPE                       *
++ *									*
++ ************************************************************************/
++/*
++ *	Firmware Version 3.01.20 (15:30 Dec 19, 2002)
++ */
++static const u_int16_t isp_2300_risc_code[] = {
++	0x0470, 0x0000, 0x0000, 0xc060, 0x0000, 0x0003, 0x0001, 0x0014,
++	0x0017, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030,
++	0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241,
++	0x5449, 0x4f4e, 0x2049, 0x5350, 0x3233, 0x3030, 0x2046, 0x6972,
++	0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030,
++	0x332e, 0x3031, 0x2e32, 0x3020, 0x2020, 0x2020, 0x2400, 0x20a9,
++	0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2200, 0x20a9, 0x000f,
++	0x2001, 0x0000, 0x400f, 0x2091, 0x2400, 0x20a9, 0x000f, 0x2001,
++	0x0000, 0x400f, 0x2091, 0x2600, 0x20a9, 0x000f, 0x2001, 0x0000,
++	0x400f, 0x2091, 0x2800, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f,
++	0x2091, 0x2a00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091,
++	0x2c00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2e00,
++	0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2000, 0x2001,
++	0x0000, 0x20c1, 0x0004, 0x2001, 0x017f, 0x2003, 0x0000, 0x20c9,
++	0x14ff, 0x2059, 0x0000, 0x2b78, 0x7883, 0x0004, 0x2089, 0x240d,
++	0x2051, 0x1100, 0x2a70, 0x20e1, 0x0001, 0x20e9, 0x0001, 0x2029,
++	0x45c0, 0x2031, 0xffff, 0x2039, 0x45a9, 0x2021, 0x0200, 0x20e9,
++	0x0001, 0x20a1, 0x1000, 0x900e, 0x20a9, 0x05c0, 0x4104, 0x7566,
++	0x766a, 0x7762, 0x746e, 0x7472, 0x00e6, 0x2071, 0x13a1, 0x2472,
++	0x00ee, 0x20a1, 0x15c0, 0x7168, 0x810d, 0x810d, 0x810d, 0x810d,
++	0x918c, 0x000f, 0x2001, 0x0001, 0x9112, 0x900e, 0x21a8, 0x4104,
++	0x8211, 0x1de0, 0x7168, 0x3400, 0x8001, 0x9102, 0x0120, 0x0218,
++	0x20a8, 0x900e, 0x4104, 0x2009, 0x1100, 0x810d, 0x810d, 0x810d,
++	0x810d, 0x810d, 0x918c, 0x001f, 0x2001, 0x0001, 0x9112, 0x20e9,
++	0x0001, 0x20a1, 0x0800, 0x900e, 0x20a9, 0x0800, 0x4104, 0x8211,
++	0x1dd8, 0x2009, 0x1100, 0x3400, 0x9102, 0x0120, 0x0218, 0x20a8,
++	0x900e, 0x4104, 0x080c, 0x0f11, 0x080c, 0x10cf, 0x080c, 0x15fe,
++	0x080c, 0x0d19, 0x080c, 0x50f4, 0x080c, 0x8e7a, 0x080c, 0x0e85,
++	0x080c, 0x2a8c, 0x080c, 0x65b0, 0x080c, 0x58d0, 0x080c, 0x7133,
++	0x080c, 0x1c09, 0x080c, 0x7420, 0x080c, 0x6bb9, 0x080c, 0x19df,
++	0x080c, 0x1b7a, 0x080c, 0x1bfe, 0x2091, 0x3009, 0x7883, 0x0000,
++	0x1004, 0x0910, 0x7880, 0x9086, 0x0002, 0x1190, 0x7883, 0x4000,
++	0x7837, 0x4000, 0x7833, 0x0010, 0x0e04, 0x0904, 0x2091, 0x5000,
++	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x0fcd,
++	0x2a70, 0x7003, 0x0000, 0x2a70, 0x7000, 0x908e, 0x0003, 0x1168,
++	0x080c, 0x3fa0, 0x080c, 0x2aa2, 0x080c, 0x6610, 0x080c, 0x5dab,
++	0x080c, 0x715a, 0x080c, 0x23a5, 0x0c70, 0x000b, 0x0c88, 0x0931,
++	0x0932, 0x0a98, 0x092f, 0x0b68, 0x0d18, 0x0d18, 0x0d18, 0x080c,
++	0x0d7e, 0x0005, 0x0126, 0x00f6, 0x2091, 0x8000, 0x7000, 0x9086,
++	0x0001, 0x1904, 0x0a76, 0x7034, 0xd0b4, 0x1130, 0x0026, 0x2011,
++	0x0080, 0x080c, 0x0e3a, 0x002e, 0x080c, 0x62e4, 0x0150, 0x080c,
++	0x630a, 0x1580, 0x2079, 0x0100, 0x7828, 0x9085, 0x1800, 0x782a,
++	0x0448, 0x080c, 0x621a, 0x7000, 0x9086, 0x0001, 0x1904, 0x0a76,
++	0x7090, 0x9086, 0x0028, 0x1904, 0x0a76, 0x2001, 0x0161, 0x2003,
++	0x0001, 0x2079, 0x0100, 0x7827, 0xffff, 0x7a28, 0x9295, 0x1e2f,
++	0x7a2a, 0x2011, 0x61aa, 0x080c, 0x71fa, 0x2011, 0x619d, 0x080c,
++	0x72bf, 0x2011, 0x4f57, 0x080c, 0x71fa, 0x2011, 0x8030, 0x901e,
++	0x738e, 0x00d8, 0x080c, 0x483b, 0x2079, 0x0100, 0x7844, 0x9005,
++	0x1904, 0x0a76, 0x2011, 0x4f57, 0x080c, 0x71fa, 0x2001, 0x0265,
++	0x2001, 0x0205, 0x2003, 0x0000, 0x780f, 0x006b, 0x7840, 0x9084,
++	0xfffb, 0x7842, 0x2011, 0x8010, 0x73d4, 0x080c, 0x2261, 0x080c,
++	0x3f23, 0x7240, 0xc284, 0x7242, 0x2001, 0x110c, 0x200c, 0xc1ac,
++	0xc1cc, 0x2102, 0x080c, 0x877f, 0x2011, 0x0004, 0x080c, 0xa948,
++	0x080c, 0x57d9, 0x080c, 0x62e4, 0x1120, 0x080c, 0x22a5, 0x02f0,
++	0x0410, 0x080c, 0x50b1, 0x0140, 0x708f, 0x0001, 0x70cf, 0x0000,
++	0x080c, 0x49f2, 0x0804, 0x0a76, 0x2001, 0x1153, 0x2004, 0xd094,
++	0x0190, 0x2011, 0x110c, 0x2204, 0xc0cd, 0x2012, 0x2001, 0x1172,
++	0x2004, 0xd0d4, 0x1118, 0x080c, 0x22a5, 0x1278, 0x2011, 0x110c,
++	0x2204, 0xc0bc, 0x00b0, 0x2001, 0x1172, 0x2004, 0xd0d4, 0x1db0,
++	0x2011, 0x110c, 0x2204, 0xc0bd, 0x0060, 0x2011, 0x110c, 0x2204,
++	0xc0bd, 0x2012, 0x080c, 0x58c6, 0x1128, 0xd0a4, 0x0118, 0x2204,
++	0xc0fd, 0x2012, 0x080c, 0x588e, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e,
++	0x00a8, 0x7077, 0x0000, 0x080c, 0x62e4, 0x1130, 0x70a8, 0x9005,
++	0x1168, 0x080c, 0xad47, 0x0050, 0x080c, 0xad47, 0x70d8, 0xd09c,
++	0x1128, 0x70a8, 0x9005, 0x0110, 0x080c, 0x5092, 0x70e3, 0x0000,
++	0x70df, 0x0000, 0x709f, 0x0000, 0x72d8, 0x080c, 0x62e4, 0x1170,
++	0x9016, 0x0016, 0x080c, 0x205d, 0x2019, 0x1298, 0x211a, 0x001e,
++	0x7057, 0xffff, 0x705b, 0x00ef, 0x707b, 0x0000, 0x2079, 0x1152,
++	0x7804, 0xd0ac, 0x0108, 0xc295, 0x72da, 0x080c, 0x62e4, 0x0118,
++	0x9296, 0x0004, 0x0548, 0x2011, 0x0001, 0x080c, 0xa948, 0x70a3,
++	0x0000, 0x70a7, 0xffff, 0x7003, 0x0002, 0x2079, 0x0100, 0x7827,
++	0x0003, 0x7828, 0x9085, 0x0003, 0x782a, 0x00fe, 0x080c, 0x2679,
++	0x2011, 0x0005, 0x080c, 0x88e2, 0x080c, 0x7aa4, 0x080c, 0x62e4,
++	0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, 0x205d, 0x61e2,
++	0x001e, 0x00ce, 0x012e, 0x0420, 0x70a3, 0x0000, 0x70a7, 0xffff,
++	0x7003, 0x0002, 0x00f6, 0x2079, 0x0100, 0x7827, 0x0003, 0x7828,
++	0x9085, 0x0003, 0x782a, 0x00fe, 0x2011, 0x0005, 0x080c, 0x88e2,
++	0x080c, 0x7aa4, 0x080c, 0x62e4, 0x0148, 0x00c6, 0x2061, 0x0100,
++	0x0016, 0x080c, 0x205d, 0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e,
++	0x0005, 0x00c6, 0x080c, 0x62e4, 0x1118, 0x20a9, 0x0100, 0x0010,
++	0x20a9, 0x0082, 0x080c, 0x62e4, 0x1110, 0x900e, 0x0010, 0x2009,
++	0x007e, 0x080c, 0x2955, 0x8108, 0x1f04, 0x0a89, 0x00ce, 0x7077,
++	0x0000, 0x7078, 0x9084, 0x00ff, 0x707a, 0x70ab, 0x0000, 0x0005,
++	0x0126, 0x2091, 0x8000, 0x7000, 0x9086, 0x0002, 0x1904, 0x0b66,
++	0x70a4, 0x9086, 0xffff, 0x0130, 0x080c, 0x2679, 0x080c, 0x7aa4,
++	0x0804, 0x0b66, 0x70d8, 0xd0ac, 0x1110, 0xd09c, 0x0518, 0xd084,
++	0x0508, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, 0xd08c,
++	0x01c8, 0x70dc, 0x9086, 0xffff, 0x0188, 0x080c, 0x27da, 0x080c,
++	0x7aa4, 0x70d8, 0xd094, 0x1904, 0x0b66, 0x2011, 0x0001, 0x901e,
++	0x080c, 0x2811, 0x080c, 0x7aa4, 0x0804, 0x0b66, 0x70e0, 0x9005,
++	0x1904, 0x0b66, 0x70a0, 0x9005, 0x1904, 0x0b66, 0x70d8, 0xd0a4,
++	0x0118, 0xd0b4, 0x0904, 0x0b66, 0x080c, 0x588e, 0x1904, 0x0b66,
++	0x080c, 0x58c6, 0x01c0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e,
++	0x0016, 0x080c, 0x5608, 0x1118, 0x6000, 0xd0ec, 0x1138, 0x001e,
++	0x8108, 0x1f04, 0x0ae8, 0x00ce, 0x015e, 0x0028, 0x001e, 0x00ce,
++	0x015e, 0x0804, 0x0b66, 0x0006, 0x2001, 0x0103, 0x2003, 0x006b,
++	0x000e, 0x20e9, 0x0001, 0x71b0, 0x81ff, 0x11b0, 0x9006, 0x2009,
++	0x0200, 0x20a9, 0x0002, 0x20a1, 0x1302, 0x4001, 0x2009, 0x0700,
++	0x20a9, 0x0002, 0x20a1, 0x12f2, 0x4001, 0x7074, 0x8007, 0x7178,
++	0x810f, 0x20a9, 0x0002, 0x4001, 0x20a1, 0x12f6, 0x900e, 0x080c,
++	0x0d65, 0x9006, 0x810f, 0x20a9, 0x0002, 0x4001, 0x7030, 0xc08c,
++	0x7032, 0x7003, 0x0003, 0x70a7, 0xffff, 0x7034, 0xd0b4, 0x1130,
++	0x0026, 0x2011, 0x0040, 0x080c, 0x0e3a, 0x002e, 0x9006, 0x080c,
++	0x1f11, 0x0036, 0x0046, 0x2019, 0xffff, 0x2021, 0x0006, 0x080c,
++	0x4026, 0x004e, 0x003e, 0x00f6, 0x2079, 0x0100, 0x080c, 0x630a,
++	0x0150, 0x080c, 0x62e4, 0x7828, 0x0118, 0x9084, 0xe1ff, 0x0010,
++	0x9084, 0xffdf, 0x782a, 0x00fe, 0x2001, 0x1305, 0x2004, 0x9086,
++	0x0005, 0x1120, 0x2011, 0x0000, 0x080c, 0x88e2, 0x2011, 0x0000,
++	0x080c, 0x88ec, 0x080c, 0x7aa4, 0x080c, 0x7b72, 0x012e, 0x0005,
++	0x0016, 0x0046, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100,
++	0x7904, 0x918c, 0xfffd, 0x7906, 0x2009, 0x00f7, 0x080c, 0x507b,
++	0x7940, 0x918c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0110, 0x7827,
++	0x0040, 0xd19c, 0x0110, 0x7827, 0x0008, 0x0006, 0x0036, 0x0156,
++	0x7954, 0xd1ac, 0x1904, 0x0bf6, 0x080c, 0x2328, 0x1148, 0x2001,
++	0x0001, 0x080c, 0x2290, 0x2001, 0x0001, 0x080c, 0x2273, 0x00b8,
++	0x080c, 0x2330, 0x1138, 0x9006, 0x080c, 0x2290, 0x9006, 0x080c,
++	0x2273, 0x0068, 0x080c, 0x2338, 0x1d50, 0x2001, 0x12d2, 0x2004,
++	0xd0fc, 0x0108, 0x0020, 0x080c, 0x2089, 0x0804, 0x0cda, 0x080c,
++	0x62f6, 0x0158, 0x080c, 0x630a, 0x1128, 0x2001, 0x12a7, 0x2003,
++	0x0000, 0x0070, 0x080c, 0x62ec, 0x0dc0, 0x2001, 0x12a7, 0x2003,
++	0xaaaa, 0x2001, 0x12a8, 0x2003, 0x0001, 0x080c, 0x621a, 0x0058,
++	0x080c, 0x62e4, 0x0140, 0x2009, 0x00f8, 0x080c, 0x507b, 0x7843,
++	0x0090, 0x7843, 0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138,
++	0x080c, 0x62e4, 0x0138, 0x7824, 0xd0ac, 0x1904, 0x0cdf, 0x1f04,
++	0x0bd5, 0x0070, 0x7824, 0x080c, 0x6300, 0x0118, 0xd0ac, 0x1904,
++	0x0cdf, 0x9084, 0x1800, 0x0d98, 0x7003, 0x0001, 0x0804, 0x0cdf,
++	0x2001, 0x0001, 0x080c, 0x1f11, 0x0804, 0x0cf2, 0x080c, 0x2328,
++	0x1148, 0x2001, 0x0001, 0x080c, 0x2290, 0x2001, 0x0001, 0x080c,
++	0x2273, 0x00b8, 0x080c, 0x2330, 0x1138, 0x9006, 0x080c, 0x2290,
++	0x9006, 0x080c, 0x2273, 0x0068, 0x080c, 0x2338, 0x1d50, 0x2001,
++	0x12d2, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x2089, 0x0804,
++	0x0cda, 0x080c, 0x2346, 0x7850, 0x9085, 0x0040, 0x7852, 0x7938,
++	0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x2340, 0x9085, 0x2000,
++	0x7852, 0x793a, 0x20a9, 0x0046, 0x1d04, 0x0c2c, 0x080c, 0x72a5,
++	0x1f04, 0x0c2c, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf, 0x7852,
++	0x793a, 0x080c, 0x62f6, 0x0158, 0x080c, 0x630a, 0x1128, 0x2001,
++	0x12a7, 0x2003, 0x0000, 0x0070, 0x080c, 0x62ec, 0x0dc0, 0x2001,
++	0x12a7, 0x2003, 0xaaaa, 0x2001, 0x12a8, 0x2003, 0x0001, 0x080c,
++	0x621a, 0x0020, 0x2009, 0x00f8, 0x080c, 0x507b, 0x20a9, 0x0028,
++	0xa001, 0x1f04, 0x0c58, 0x7850, 0x9085, 0x1400, 0x7852, 0x080c,
++	0x62e4, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678,
++	0x2019, 0xea60, 0x7820, 0xd09c, 0x15a0, 0x080c, 0x62e4, 0x0904,
++	0x0cbf, 0x7824, 0xd0ac, 0x1904, 0x0cdf, 0x080c, 0x630a, 0x1548,
++	0x0046, 0x2021, 0x0320, 0x8421, 0x1df0, 0x004e, 0x7827, 0x1800,
++	0x080c, 0x2340, 0x7824, 0x9084, 0x1800, 0x1160, 0x9484, 0x0fff,
++	0x1138, 0x2001, 0x110f, 0x2004, 0xd0fc, 0x0110, 0x080c, 0x0d01,
++	0x8421, 0x1178, 0x1d04, 0x0c96, 0x080c, 0x72a5, 0x2001, 0x12a7,
++	0x2003, 0xaaaa, 0x2001, 0x12a8, 0x2003, 0x0001, 0x7003, 0x0001,
++	0x04f0, 0x8319, 0x1938, 0x1d04, 0x0ca7, 0x080c, 0x72a5, 0x2009,
++	0x12d5, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a, 0x1178, 0x200b,
++	0x000a, 0x7827, 0x0048, 0x20a9, 0x0002, 0x080c, 0x2321, 0x7924,
++	0x080c, 0x2340, 0xd19c, 0x0110, 0x080c, 0x2261, 0x00d8, 0x080c,
++	0x62f6, 0x1140, 0x94a2, 0x03e8, 0x1128, 0x080c, 0x62be, 0x7003,
++	0x0001, 0x00a8, 0x7827, 0x1800, 0x080c, 0x2340, 0x7824, 0x080c,
++	0x6300, 0x0110, 0xd0ac, 0x1158, 0x9084, 0x1800, 0x0950, 0x7003,
++	0x0001, 0x0028, 0x2001, 0x0001, 0x080c, 0x1f11, 0x0078, 0x2009,
++	0x110c, 0x210c, 0xd19c, 0x1120, 0x7904, 0x918d, 0x0002, 0x7906,
++	0x7827, 0x0048, 0x7828, 0x9085, 0x0028, 0x782a, 0x7850, 0x9085,
++	0x0400, 0x7852, 0x9006, 0x78f2, 0x015e, 0x003e, 0x000e, 0x7034,
++	0xd0b4, 0x1110, 0x080c, 0x0df3, 0x012e, 0x00fe, 0x004e, 0x001e,
++	0x0005, 0x0006, 0x0016, 0x0036, 0x0046, 0x00b6, 0x00c6, 0x00d6,
++	0x00e6, 0x00f6, 0x0156, 0x080c, 0x2aa2, 0x015e, 0x00fe, 0x00ee,
++	0x00de, 0x00ce, 0x00be, 0x004e, 0x003e, 0x001e, 0x000e, 0x0005,
++	0x0005, 0x2a70, 0x2061, 0x12e3, 0x2063, 0x0003, 0x6007, 0x0001,
++	0x600b, 0x0014, 0x600f, 0x0017, 0x2001, 0x12a7, 0x900e, 0x2102,
++	0x718e, 0x2001, 0x0100, 0x2004, 0x9082, 0x0002, 0x0218, 0x7057,
++	0xffff, 0x0008, 0x7156, 0x705f, 0xffff, 0x7176, 0x717a, 0x080c,
++	0xad47, 0x2061, 0x1297, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800,
++	0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x000f, 0x611a, 0x601f,
++	0x07d0, 0x2061, 0x129f, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f,
++	0x0200, 0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061,
++	0x12c3, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f,
++	0x2020, 0x2001, 0x112a, 0x2102, 0x0005, 0x9016, 0x080c, 0x5608,
++	0x1178, 0x6004, 0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4,
++	0xff00, 0x98c6, 0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210,
++	0x8108, 0x9186, 0x0100, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000,
++	0x0e04, 0x0d80, 0x0006, 0x0016, 0x2079, 0x0000, 0x001e, 0x798e,
++	0x000e, 0x788a, 0x000e, 0x7886, 0x3900, 0x789a, 0x7883, 0x8002,
++	0x7837, 0x8002, 0x7833, 0x0012, 0x2091, 0x5000, 0x0156, 0x00d6,
++	0x0036, 0x0026, 0x2079, 0x0300, 0x2069, 0x137c, 0x7a18, 0x226a,
++	0x8d68, 0x7a1c, 0x226a, 0x782c, 0x2019, 0x1389, 0x201a, 0x2019,
++	0x138c, 0x9016, 0x7808, 0xd09c, 0x0168, 0x7820, 0x201a, 0x8210,
++	0x8318, 0x9386, 0x13a1, 0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110,
++	0x2011, 0xdead, 0x2019, 0x138a, 0x782c, 0x201a, 0x8318, 0x221a,
++	0x7803, 0x0000, 0x2069, 0x135c, 0x901e, 0x20a9, 0x0020, 0x7b26,
++	0x7a28, 0x226a, 0x8d68, 0x8318, 0x1f04, 0x0dc7, 0x002e, 0x003e,
++	0x00de, 0x015e, 0x2079, 0x1100, 0x7803, 0x0005, 0x2091, 0x4080,
++	0x2001, 0x0089, 0x2004, 0xd084, 0x0180, 0x2001, 0x1336, 0x2004,
++	0x9005, 0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001,
++	0x008a, 0x2003, 0x0002, 0x2003, 0x1001, 0x7834, 0xd0b4, 0x1108,
++	0x04b9, 0x0cd8, 0x0005, 0x00f6, 0x0006, 0x2079, 0x1125, 0x2f04,
++	0x8000, 0x207a, 0x080c, 0x2338, 0x1150, 0x0006, 0x2001, 0x12d2,
++	0x2004, 0xd0fc, 0x000e, 0x1118, 0x9082, 0x7530, 0x0010, 0x9082,
++	0x000f, 0x0258, 0x9006, 0x207a, 0x2079, 0x1128, 0x2f04, 0x9084,
++	0x0001, 0x9086, 0x0001, 0x207a, 0x0080, 0x2079, 0x1128, 0x2f7c,
++	0x8fff, 0x1130, 0x0026, 0x2011, 0x0080, 0x00e1, 0x002e, 0x0028,
++	0x0026, 0x2011, 0x0000, 0x00b1, 0x002e, 0x000e, 0x00fe, 0x0005,
++	0x0026, 0x2011, 0x0080, 0x0071, 0x002e, 0x2009, 0x0fff, 0x00b9,
++	0x0026, 0x2011, 0x0040, 0x0031, 0x002e, 0x2009, 0x0fff, 0x0079,
++	0x0c78, 0x0005, 0x0016, 0x3b08, 0x3a00, 0x9104, 0x918d, 0x00c0,
++	0x21d8, 0x9084, 0xff3f, 0x9205, 0x20d0, 0x001e, 0x0005, 0x0156,
++	0x0126, 0x918c, 0x0fff, 0x21a8, 0x1d04, 0x0e4c, 0x2091, 0x6000,
++	0x1f04, 0x0e4c, 0x012e, 0x015e, 0x0005, 0x890b, 0x810b, 0x810b,
++	0x810b, 0x810b, 0x810b, 0x9994, 0xfc00, 0x8217, 0x8214, 0x8214,
++	0x0005, 0x0006, 0x814c, 0x894c, 0x894c, 0x894c, 0x894c, 0x894c,
++	0x9284, 0x003f, 0x8007, 0x8003, 0x8003, 0x994d, 0x000e, 0x0005,
++	0x0016, 0x0026, 0x0096, 0x3348, 0x0c01, 0x2100, 0x9300, 0x2098,
++	0x22e0, 0x009e, 0x002e, 0x001e, 0x3518, 0x20a9, 0x0001, 0x4002,
++	0x8007, 0x4004, 0x8319, 0x1dd8, 0x0005, 0x2071, 0x1100, 0x7164,
++	0x712e, 0x2021, 0x0001, 0x9190, 0x0040, 0x9298, 0x0040, 0x0240,
++	0x7068, 0x9302, 0x1228, 0x220a, 0x2208, 0x2310, 0x8420, 0x0ca8,
++	0x200b, 0x0000, 0x74ba, 0x74be, 0x0005, 0x00e6, 0x0126, 0x2091,
++	0x8000, 0x2071, 0x1100, 0x70bc, 0x90ea, 0x0010, 0x0268, 0x8001,
++	0x70be, 0x702c, 0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807,
++	0x0000, 0x012e, 0x00ee, 0x0005, 0x906e, 0x0cd8, 0x00e6, 0x2071,
++	0x1100, 0x0126, 0x2091, 0x8000, 0x70bc, 0x8001, 0x0270, 0x70be,
++	0x702c, 0x2068, 0x9085, 0x0001, 0x2d04, 0x702e, 0x206b, 0x0000,
++	0x6807, 0x0000, 0x012e, 0x00ee, 0x0005, 0x906e, 0x0cd8, 0x00e6,
++	0x0126, 0x2091, 0x8000, 0x2071, 0x1100, 0x702c, 0x206a, 0x2d00,
++	0x702e, 0x70bc, 0x8000, 0x70be, 0x012e, 0x00ee, 0x0005, 0x8dff,
++	0x0138, 0x6804, 0x6807, 0x0000, 0x0006, 0x0c49, 0x00de, 0x0cb8,
++	0x0005, 0x00d6, 0x0859, 0x0148, 0x0016, 0x0026, 0x2d08, 0x2011,
++	0x0001, 0x080c, 0x0e61, 0x002e, 0x001e, 0x00de, 0x0005, 0x00d6,
++	0x080c, 0x0e9d, 0x0148, 0x0016, 0x0026, 0x2d08, 0x2011, 0x0001,
++	0x080c, 0x0e61, 0x002e, 0x001e, 0x00de, 0x0005, 0x00d6, 0x0016,
++	0x0026, 0x080c, 0x0e55, 0x2168, 0x002e, 0x001e, 0x0801, 0x00de,
++	0x0005, 0x00e6, 0x2071, 0x1335, 0x7007, 0x0000, 0x9006, 0x701e,
++	0x7022, 0x7002, 0x2071, 0x0000, 0x7010, 0x9085, 0x8004, 0x7012,
++	0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0x2270, 0x700b,
++	0x0000, 0x2071, 0x1335, 0x701c, 0x9088, 0x133f, 0x220a, 0x8000,
++	0x9084, 0x0007, 0x701e, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079,
++	0x0080, 0x0089, 0x00fe, 0x00ee, 0x012e, 0x0005, 0x00e6, 0x2071,
++	0x1335, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x0019,
++	0x00fe, 0x00ee, 0x0005, 0x7004, 0x9086, 0x0000, 0x1110, 0x7007,
++	0x0006, 0x7000, 0x0002, 0x0f5d, 0x0f5b, 0x0f5b, 0x0f5b, 0x10be,
++	0x10be, 0x10be, 0x10be, 0x080c, 0x0d7e, 0x701c, 0x7120, 0x9106,
++	0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110, 0x7007,
++	0x0000, 0x0005, 0x00d6, 0x9180, 0x133f, 0x2004, 0x700a, 0x2068,
++	0x8108, 0x918c, 0x0007, 0x7122, 0x782b, 0x0026, 0x6828, 0x7802,
++	0x682c, 0x7806, 0x6830, 0x780a, 0x6834, 0x780e, 0x6814, 0x700e,
++	0x680c, 0x7016, 0x6810, 0x701a, 0x6804, 0x00de, 0xd084, 0x0120,
++	0x7007, 0x0001, 0x0029, 0x0005, 0x7007, 0x0002, 0x00b1, 0x0005,
++	0x0016, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182, 0x0040, 0x1210,
++	0x2110, 0x9006, 0x700e, 0x7212, 0x8203, 0x7812, 0x782b, 0x0020,
++	0x782b, 0x0041, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x0136,
++	0x0146, 0x0156, 0x7014, 0x20e0, 0x7018, 0x2098, 0x20e9, 0x0000,
++	0x20a1, 0x0088, 0x782b, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182,
++	0x0040, 0x1210, 0x2110, 0x9006, 0x700e, 0x22a8, 0x4006, 0x8203,
++	0x7812, 0x782b, 0x0020, 0x3300, 0x701a, 0x782b, 0x0001, 0x015e,
++	0x014e, 0x013e, 0x002e, 0x001e, 0x0005, 0x2009, 0x1335, 0x2104,
++	0xc095, 0x200a, 0x080c, 0x0f3e, 0x0005, 0x0016, 0x00e6, 0x2071,
++	0x1335, 0x00f6, 0x2079, 0x0080, 0x792c, 0x782b, 0x0002, 0xd1fc,
++	0x0120, 0x918c, 0x0700, 0x7004, 0x0023, 0x00fe, 0x00ee, 0x001e,
++	0x0005, 0x0f4b, 0x0ff2, 0x1024, 0x0ff0, 0x0ff0, 0x10ca, 0x0ff0,
++	0x080c, 0x0d7e, 0x918c, 0x0700, 0x1548, 0x0136, 0x0146, 0x0156,
++	0x7014, 0x20e8, 0x7018, 0x20a0, 0x20e1, 0x0000, 0x2099, 0x0088,
++	0x782b, 0x0040, 0x7010, 0x20a8, 0x4005, 0x3400, 0x701a, 0x015e,
++	0x014e, 0x013e, 0x700c, 0x9005, 0x0560, 0x7800, 0x7802, 0x7804,
++	0x7806, 0x080c, 0x0f90, 0x0005, 0x7008, 0x9080, 0x0002, 0x2003,
++	0x0100, 0x7007, 0x0000, 0x080c, 0x0f4b, 0x0005, 0x7008, 0x9080,
++	0x0002, 0x2003, 0x0200, 0x0ca8, 0x918c, 0x0700, 0x1150, 0x700c,
++	0x9005, 0x0178, 0x7800, 0x7802, 0x7804, 0x7806, 0x080c, 0x0fa5,
++	0x0005, 0x7008, 0x9080, 0x0002, 0x2003, 0x0200, 0x7007, 0x0000,
++	0x0080, 0x00d6, 0x7008, 0x2068, 0x7800, 0x682a, 0x7804, 0x682e,
++	0x7808, 0x6832, 0x780c, 0x6836, 0x680b, 0x0100, 0x00de, 0x7007,
++	0x0000, 0x00c6, 0x00d6, 0x7008, 0x2060, 0x9086, 0x11fb, 0x1128,
++	0x6038, 0x080f, 0x00de, 0x00ce, 0x0078, 0x00de, 0x00ce, 0x00c6,
++	0x00d6, 0x7008, 0x2060, 0x0059, 0x0128, 0x6038, 0x080f, 0x00de,
++	0x00ce, 0x0005, 0x00de, 0x00ce, 0x080c, 0x0f4b, 0x0005, 0x00e6,
++	0x2071, 0x1100, 0x8cff, 0x0140, 0x7064, 0x9c02, 0x0238, 0x9c82,
++	0xffff, 0x1220, 0x9085, 0x0001, 0x00ee, 0x0005, 0x9006, 0x0ce0,
++	0x603c, 0x906d, 0x090c, 0x0d7e, 0x6008, 0x908e, 0x0100, 0x0130,
++	0x687b, 0x0030, 0x6883, 0x0000, 0x6897, 0x4002, 0x080c, 0x5b76,
++	0x603b, 0x0000, 0x603f, 0x0000, 0x2c00, 0x2068, 0x080c, 0x0ecf,
++	0x0005, 0x00f6, 0x603c, 0x906d, 0x090c, 0x0d7e, 0x6008, 0x908e,
++	0x0100, 0x0128, 0x687b, 0x0001, 0x6883, 0x0000, 0x0080, 0x680c,
++	0x2078, 0x7804, 0x9005, 0x0158, 0x680e, 0x2078, 0x9080, 0x0002,
++	0x6012, 0x7800, 0x6016, 0x2c10, 0x080c, 0x0f22, 0x0068, 0x00d6,
++	0x080c, 0x5b76, 0x00de, 0x687c, 0xd0f4, 0x0130, 0x6894, 0x00c6,
++	0x2060, 0x080c, 0x8ed9, 0x00ce, 0x00fe, 0x0005, 0x0126, 0x2091,
++	0x8000, 0x782b, 0x1001, 0x7007, 0x0005, 0x7000, 0xc094, 0x7002,
++	0x012e, 0x0005, 0x7007, 0x0000, 0x080c, 0x0f4b, 0x0005, 0x0126,
++	0x2091, 0x2200, 0x2079, 0x0300, 0x2071, 0x1347, 0x7003, 0x0000,
++	0x78bf, 0x00f6, 0x00c1, 0x7803, 0x0003, 0x780f, 0x0000, 0x20a9,
++	0x01ea, 0x2061, 0xc47d, 0x2c0d, 0x7912, 0xe104, 0x9ce0, 0x0002,
++	0x7916, 0x1f04, 0x10e3, 0x7807, 0x0001, 0x7803, 0x0000, 0x7803,
++	0x0001, 0x012e, 0x0005, 0x00c6, 0x7803, 0x0000, 0x7808, 0xd09c,
++	0x0110, 0x7820, 0x0cd8, 0x2001, 0x1348, 0x2003, 0x0000, 0x78ab,
++	0x0004, 0x78ac, 0xd0ac, 0x1de8, 0x78ab, 0x0002, 0x7807, 0x0001,
++	0x7827, 0x0030, 0x782b, 0x0400, 0x7827, 0x0031, 0x782b, 0x135c,
++	0x781f, 0xff00, 0x781b, 0xff00, 0x2001, 0x0200, 0x2004, 0xd0dc,
++	0x0110, 0x781f, 0x0303, 0x2061, 0x135c, 0x602f, 0x15c0, 0x6033,
++	0x3000, 0x603b, 0x18fe, 0x00ce, 0x0005, 0x0126, 0x2091, 0x2200,
++	0x7808, 0xd09c, 0x0158, 0x7820, 0x908c, 0xf000, 0x1578, 0x908c,
++	0x0fe0, 0x190c, 0x0d7e, 0x0043, 0x012e, 0x0005, 0x9084, 0x0070,
++	0x190c, 0x0d7e, 0x012e, 0x0005, 0x115c, 0x115c, 0x1165, 0x116a,
++	0x116e, 0x1173, 0x119a, 0x119e, 0x11ab, 0x11af, 0x115c, 0x1233,
++	0x1237, 0x1296, 0x115c, 0x115c, 0x115c, 0x115c, 0x115c, 0x115c,
++	0x115c, 0x115c, 0x115c, 0x115c, 0x115c, 0x115c, 0x115c, 0x1175,
++	0x115c, 0x115c, 0x115c, 0x115c, 0x080c, 0x0d7e, 0x2009, 0x0048,
++	0x2060, 0x080c, 0x8f53, 0x012e, 0x0005, 0x7004, 0xc085, 0xc0b5,
++	0x7006, 0x0005, 0x7004, 0xc085, 0x7006, 0x0005, 0x080c, 0x129d,
++	0x080c, 0x133c, 0x0005, 0x080c, 0x0d7e, 0x080c, 0x129d, 0x2060,
++	0x6014, 0x9080, 0x000e, 0x2003, 0xffff, 0x2009, 0x0048, 0x080c,
++	0x8f53, 0x2001, 0x015d, 0x2003, 0x0000, 0x2009, 0x03e8, 0x8109,
++	0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218,
++	0x2004, 0xd0ec, 0x1110, 0x080c, 0x12a2, 0x2001, 0x0307, 0x2003,
++	0x8000, 0x0005, 0x7004, 0xc095, 0x7006, 0x0005, 0x080c, 0x129d,
++	0x2060, 0x6014, 0x9080, 0x000e, 0x2003, 0xffff, 0x2009, 0x0048,
++	0x080c, 0x8f53, 0x0005, 0x080c, 0x129d, 0x080c, 0x0d7e, 0x080c,
++	0x129d, 0x080c, 0x121e, 0x7827, 0x0018, 0x79ac, 0xd1dc, 0x0540,
++	0x7827, 0x0015, 0x7828, 0x782b, 0x0000, 0x9065, 0x0138, 0x2001,
++	0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0400, 0x7004, 0x9005,
++	0x1180, 0x78ab, 0x0004, 0x7827, 0x0018, 0x782b, 0x0000, 0xd1bc,
++	0x090c, 0x0d7e, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020,
++	0x0460, 0x78ab, 0x0004, 0x7803, 0x0001, 0x080c, 0x1237, 0x0005,
++	0x7828, 0x782b, 0x0000, 0x9065, 0x090c, 0x0d7e, 0x6014, 0x2068,
++	0x78ab, 0x0004, 0x918c, 0x0700, 0x0198, 0x080c, 0x1577, 0x080c,
++	0xa942, 0x0158, 0x69ac, 0x6936, 0x69b0, 0x693a, 0x683f, 0xffff,
++	0x6843, 0xffff, 0x6880, 0xc0bd, 0x6882, 0x080c, 0xa5f3, 0x0005,
++	0x6010, 0x2004, 0xd0bc, 0x190c, 0xace0, 0x2029, 0x00c8, 0x8529,
++	0x0128, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x7dbc, 0x080c,
++	0xc426, 0xd5a4, 0x1118, 0x080c, 0x12a2, 0x0005, 0x080c, 0x1577,
++	0x0005, 0x781f, 0x0300, 0x7803, 0x0001, 0x0005, 0x0016, 0x0066,
++	0x0076, 0x00f6, 0x2079, 0x0300, 0x7908, 0x918c, 0x0007, 0x9186,
++	0x0003, 0x0120, 0x2001, 0x0016, 0x080c, 0x130c, 0x00fe, 0x007e,
++	0x006e, 0x001e, 0x0005, 0x7004, 0xc09d, 0x7006, 0x0005, 0x7104,
++	0x9184, 0x0004, 0x190c, 0x0d7e, 0xd184, 0x1189, 0xd19c, 0x0158,
++	0xc19c, 0x7106, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020,
++	0x080c, 0x12a2, 0x0005, 0x81ff, 0x190c, 0x0d7e, 0x0005, 0xc184,
++	0xd1b4, 0xc1b4, 0x7106, 0x0016, 0x00e6, 0x15c0, 0x2071, 0x0200,
++	0x080c, 0x1330, 0x6014, 0x9005, 0x0588, 0x9080, 0x0019, 0x2004,
++	0x9084, 0x00ff, 0x908e, 0x0029, 0x0148, 0x908e, 0x0048, 0x1530,
++	0x00f6, 0x2c78, 0x080c, 0x137e, 0x00fe, 0x00a8, 0x00f6, 0x2c78,
++	0x080c, 0x1436, 0x00fe, 0x2009, 0x01f4, 0x8109, 0x0160, 0x2001,
++	0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec,
++	0x1110, 0x0401, 0x0040, 0x2001, 0x020d, 0x2003, 0x0020, 0x080c,
++	0x10f3, 0x7803, 0x0001, 0x00ee, 0x001e, 0x0005, 0x2001, 0x020d,
++	0x2003, 0x0050, 0x2003, 0x0020, 0x0069, 0x0ca8, 0x0031, 0x2060,
++	0x2009, 0x0053, 0x080c, 0x8f53, 0x0005, 0x7808, 0xd09c, 0x0de8,
++	0x7820, 0x0005, 0x080c, 0x121e, 0x00d6, 0x2069, 0x0200, 0x2009,
++	0x01f4, 0x8109, 0x0508, 0x6804, 0x9005, 0x0dd8, 0x2001, 0x015d,
++	0x2003, 0x0000, 0x79bc, 0xd1a4, 0x1520, 0x79b8, 0x918c, 0x0fff,
++	0x0178, 0x9182, 0x0841, 0x1260, 0x9188, 0x0007, 0x918c, 0x0ff8,
++	0x810c, 0x810c, 0x810c, 0x04d1, 0x6827, 0x0001, 0x8109, 0x1dd8,
++	0x04a9, 0x6827, 0x0002, 0x0491, 0x6804, 0x9005, 0x1130, 0x682c,
++	0xd0e4, 0x11d0, 0x6804, 0x9005, 0x0de8, 0x79b8, 0xd1ec, 0x1120,
++	0x08c8, 0x080c, 0x1577, 0x0070, 0x7827, 0x0015, 0x782b, 0x0000,
++	0x2001, 0x020d, 0x2003, 0x0020, 0x2001, 0x0307, 0x2003, 0x0300,
++	0x7803, 0x0001, 0x00de, 0x0005, 0x682c, 0x9084, 0x5400, 0x9086,
++	0x5400, 0x0d50, 0x7827, 0x0015, 0x782b, 0x0000, 0x7803, 0x0001,
++	0x6800, 0x9085, 0x1800, 0x6802, 0x00de, 0x0005, 0x6824, 0x9084,
++	0x0003, 0x1de0, 0x0005, 0x2001, 0x0030, 0x2c08, 0x621c, 0x0021,
++	0x7830, 0x9086, 0x0041, 0x0005, 0x00f6, 0x2079, 0x0300, 0x0006,
++	0x7808, 0xd09c, 0x0140, 0x0016, 0x0026, 0x00c6, 0x080c, 0x1125,
++	0x00ce, 0x002e, 0x001e, 0x000e, 0x7832, 0x7936, 0x7a3a, 0x781b,
++	0x8080, 0x2009, 0xff00, 0x8109, 0x0128, 0x7818, 0xd0bc, 0x1dd8,
++	0x00fe, 0x0005, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, 0x0d7e,
++	0x7037, 0x0001, 0x7150, 0x7037, 0x0002, 0x7050, 0x2060, 0xd1bc,
++	0x1110, 0x7054, 0x2060, 0x0005, 0x00e6, 0x0016, 0x2071, 0x0200,
++	0x0c79, 0x7358, 0x745c, 0x6014, 0x905d, 0x0568, 0x2b68, 0x6010,
++	0x2004, 0xd0bc, 0x190c, 0xacbb, 0x6b42, 0x6c3e, 0x2001, 0x1174,
++	0x2004, 0xd0b4, 0x1158, 0x601c, 0xd0e4, 0x1140, 0x6010, 0x2004,
++	0xd0bc, 0x1120, 0x683b, 0x7fff, 0x6837, 0xffff, 0x080c, 0x191e,
++	0x1190, 0x080c, 0x1484, 0x2a00, 0x6816, 0x0130, 0x2c00, 0x680e,
++	0x2805, 0x680a, 0x2800, 0x6812, 0x7037, 0x0020, 0x781f, 0x0300,
++	0x001e, 0x00ee, 0x0005, 0x7037, 0x0050, 0x7037, 0x0020, 0x001e,
++	0x00ee, 0x080c, 0x12a2, 0x0005, 0x080c, 0x0d7e, 0x2ff0, 0x0126,
++	0x2091, 0x2200, 0x3e60, 0x6014, 0x2068, 0x2d60, 0x903e, 0x2730,
++	0x6964, 0x691a, 0x9184, 0x000f, 0x9088, 0x18fe, 0x2145, 0x0002,
++	0x13a0, 0x1407, 0x13a0, 0x13a0, 0x13a0, 0x13e0, 0x13a0, 0x13a4,
++	0x13a0, 0x13f5, 0x13a0, 0x13a0, 0x13a0, 0x13a0, 0x13ca, 0x13b6,
++	0x9085, 0x0001, 0x0804, 0x142e, 0x687c, 0xd0bc, 0x0dc8, 0x6890,
++	0x6842, 0x688c, 0x683e, 0x6888, 0x00d6, 0x2805, 0x9c68, 0x6b08,
++	0x6a0c, 0x6d00, 0x6c04, 0x00de, 0x0804, 0x1416, 0x687c, 0xd0bc,
++	0x0d38, 0x6890, 0x6842, 0x688c, 0x683e, 0x6888, 0x00d6, 0x2805,
++	0x9c68, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x00de,
++	0x0804, 0x1416, 0x687c, 0xd0bc, 0x0998, 0x6890, 0x6842, 0x688c,
++	0x683e, 0x6804, 0x2060, 0x9080, 0x0019, 0x200c, 0x691a, 0x91cc,
++	0x000f, 0x9980, 0x18fe, 0x2045, 0x6888, 0xd19c, 0x11e8, 0x0470,
++	0x687c, 0xd0ac, 0x0904, 0x13a0, 0x6804, 0x2060, 0x9080, 0x0019,
++	0x200c, 0x691a, 0x91cc, 0x000f, 0x9980, 0x18fe, 0x2045, 0x9006,
++	0x6842, 0x683e, 0xd19c, 0x1140, 0x00c8, 0x687c, 0xd0ac, 0x0904,
++	0x13a0, 0x9006, 0x6842, 0x683e, 0x00d6, 0x2805, 0x9c68, 0x6b10,
++	0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x00de, 0x0078, 0x687c,
++	0xd0ac, 0x0904, 0x13a0, 0x9006, 0x6842, 0x683e, 0x00d6, 0x2805,
++	0x9c68, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x00de, 0x6b2e, 0x6a32,
++	0x6d1e, 0x6c22, 0x6f26, 0x6e2a, 0x6988, 0x8840, 0x281d, 0x68ac,
++	0x6ab0, 0x6836, 0x6a3a, 0x8109, 0x6916, 0x1150, 0x3e60, 0x601c,
++	0xc085, 0x601e, 0x687c, 0xc0dd, 0x687e, 0x9006, 0x012e, 0x0005,
++	0x2c00, 0x680e, 0x6b0a, 0x2800, 0x6812, 0x0c80, 0x2ff0, 0x0126,
++	0x2091, 0x2200, 0x3e60, 0x6014, 0x2068, 0x2d60, 0x680e, 0x2041,
++	0x18fb, 0x680b, 0x18fb, 0x2805, 0x6812, 0x6964, 0x691a, 0x687c,
++	0xd0ac, 0x090c, 0x0d7e, 0x9006, 0x6842, 0x683e, 0x00d6, 0x2805,
++	0x9c68, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x00de,
++	0x6b2e, 0x6a32, 0x6d1e, 0x6c22, 0x6f26, 0x6e2a, 0x68ac, 0x6ab0,
++	0x6836, 0x6a3a, 0x6988, 0x918a, 0x0002, 0x6916, 0x1150, 0x3e60,
++	0x601c, 0xc085, 0x601e, 0x687c, 0xc0dd, 0x687e, 0x9006, 0x012e,
++	0x0005, 0x6804, 0x9065, 0x090c, 0x0d7e, 0x680e, 0x6064, 0x681a,
++	0x9084, 0x000f, 0x9080, 0x18fe, 0x2015, 0x82ff, 0x090c, 0x0d7e,
++	0x6a0a, 0x2205, 0x6812, 0x0c18, 0x903e, 0x2730, 0x6880, 0xd0fc,
++	0x11a8, 0x00d6, 0x2805, 0x9c68, 0x2900, 0x0002, 0x14c6, 0x14ac,
++	0x14ac, 0x14c6, 0x14c6, 0x14c0, 0x14c6, 0x14ac, 0x14c6, 0x14b1,
++	0x14b1, 0x14c6, 0x14c6, 0x14c6, 0x14b8, 0x14b1, 0xc0fc, 0x6882,
++	0x6b2c, 0x6a30, 0x6d1c, 0x6c20, 0x00d6, 0xd99c, 0x0510, 0x2805,
++	0x9c68, 0x6f08, 0x6e0c, 0x00e8, 0x6b08, 0x6a0c, 0x6d00, 0x6c04,
++	0x00c0, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x0088,
++	0x00de, 0x00d6, 0x6864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x1130,
++	0x00de, 0x080c, 0x18be, 0x1900, 0x900e, 0x0060, 0x00de, 0x080c,
++	0x0d7e, 0x00de, 0x6b2e, 0x6a32, 0x6d1e, 0x6c22, 0x6f26, 0x6e2a,
++	0x080c, 0x18be, 0x0005, 0x2001, 0x020b, 0x2004, 0xd0e4, 0x0110,
++	0xd0d4, 0x1180, 0x6014, 0x9080, 0x0021, 0x6118, 0x810c, 0x810c,
++	0x810c, 0x81ff, 0x1118, 0x2003, 0x0001, 0x0008, 0x2102, 0x601b,
++	0x0002, 0x0005, 0x0126, 0x00c6, 0x2091, 0x2200, 0x00ce, 0x2001,
++	0x0037, 0x2c08, 0x080c, 0x130c, 0x7808, 0xd09c, 0x0140, 0x0016,
++	0x0026, 0x00c6, 0x080c, 0x1125, 0x00ce, 0x002e, 0x001e, 0x6000,
++	0x9086, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, 0x8f53, 0x012e,
++	0x0005, 0x0126, 0x00c6, 0x2091, 0x2200, 0x00ce, 0x7908, 0x918c,
++	0x0007, 0x9186, 0x0000, 0x0904, 0x156c, 0x9186, 0x0003, 0x0904,
++	0x156c, 0x6020, 0x6023, 0x0000, 0x0006, 0x2031, 0x0190, 0x00c6,
++	0x7808, 0xd09c, 0x190c, 0x1125, 0x00ce, 0x2001, 0x0038, 0x2c08,
++	0x621c, 0x080c, 0x130c, 0x7930, 0x9186, 0x0040, 0x05c8, 0x9186,
++	0x0042, 0x190c, 0x0d7e, 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631,
++	0x1d30, 0x080c, 0x15c6, 0x0026, 0x0056, 0x2001, 0x00d2, 0x8001,
++	0x1df0, 0x2031, 0x2000, 0x8631, 0x1138, 0x0489, 0x601c, 0xc084,
++	0x601e, 0x005e, 0x002e, 0x00e0, 0x2001, 0x020b, 0x2004, 0xd0e4,
++	0x0d90, 0x2001, 0x015d, 0x2003, 0x0000, 0x78ab, 0x0004, 0x080c,
++	0x10f3, 0x601c, 0xc084, 0x601e, 0x7803, 0x0000, 0x7803, 0x0001,
++	0x005e, 0x002e, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202,
++	0x000e, 0x6022, 0x012e, 0x0005, 0x601c, 0xc084, 0x601e, 0x7827,
++	0x0015, 0x7828, 0x9c06, 0x1db0, 0x782b, 0x0000, 0x0c98, 0x00f6,
++	0x2079, 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, 0x00fe, 0x080c,
++	0x62e4, 0x11b0, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160,
++	0x2003, 0x0000, 0x2011, 0x012c, 0xa001, 0xa001, 0x8211, 0x1de0,
++	0x0081, 0x0066, 0x2031, 0x0000, 0x080c, 0x6380, 0x006e, 0x0005,
++	0x0469, 0x0039, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202,
++	0x0005, 0x00e6, 0x2071, 0x0200, 0x080c, 0x235b, 0x2009, 0x003c,
++	0x080c, 0x1b67, 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084,
++	0x003c, 0x1de0, 0x70a0, 0x70a2, 0x7098, 0x709a, 0x709c, 0x709e,
++	0x2001, 0x020d, 0x2003, 0x0020, 0x00f6, 0x2079, 0x0300, 0x080c,
++	0x10f3, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005, 0x2001, 0x0138,
++	0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003, 0x0000,
++	0x080c, 0x62e4, 0x1108, 0x0005, 0x2021, 0x0260, 0x2001, 0x0141,
++	0x201c, 0xd3dc, 0x1168, 0x2001, 0x0109, 0x201c, 0x939c, 0x0048,
++	0x1160, 0x2001, 0x0111, 0x201c, 0x83ff, 0x1110, 0x8421, 0x1d70,
++	0x2001, 0x015d, 0x2003, 0x0000, 0x0005, 0x0046, 0x2021, 0x0019,
++	0x2003, 0x0048, 0xa001, 0xa001, 0x201c, 0x939c, 0x0048, 0x0120,
++	0x8421, 0x1db0, 0x004e, 0x0c60, 0x004e, 0x0c40, 0x00e6, 0x2071,
++	0x134a, 0x7003, 0x0000, 0x00ee, 0x0005, 0x00d6, 0x9280, 0x0005,
++	0x206c, 0x697c, 0xd1dc, 0x1904, 0x167b, 0x6964, 0x9184, 0x0007,
++	0x0002, 0x1619, 0x1666, 0x1619, 0x1619, 0x1619, 0x164d, 0x162c,
++	0x161b, 0x080c, 0x0d7e, 0x687c, 0xd0b4, 0x0904, 0x176d, 0x6890,
++	0x6842, 0x683a, 0x688c, 0x683e, 0x6836, 0x68ac, 0x6846, 0x68b0,
++	0x684a, 0x6988, 0x0804, 0x166e, 0x6864, 0x9084, 0x00ff, 0x9086,
++	0x001e, 0x1d38, 0x687c, 0xd0b4, 0x0904, 0x176d, 0x6890, 0x6842,
++	0x683a, 0x688c, 0x683e, 0x6836, 0x68ac, 0x6846, 0x68b0, 0x684a,
++	0x6804, 0x685a, 0x9080, 0x0019, 0x2004, 0x9084, 0x000f, 0x9080,
++	0x18fe, 0x2005, 0x6812, 0x6988, 0x0450, 0x918c, 0x00ff, 0x9186,
++	0x0015, 0x1548, 0x687c, 0xd0b4, 0x0904, 0x176d, 0x6804, 0x685a,
++	0x9080, 0x0019, 0x2004, 0x9084, 0x000f, 0x9080, 0x18fe, 0x2005,
++	0x6812, 0x6988, 0x9006, 0x6842, 0x683e, 0x0088, 0x687c, 0xd0b4,
++	0x0904, 0x176d, 0x6988, 0x9006, 0x6842, 0x683e, 0x2d00, 0x685a,
++	0x6864, 0x9084, 0x000f, 0x9080, 0x18fe, 0x2005, 0x6812, 0x6916,
++	0x687c, 0xc0dd, 0x687e, 0x00de, 0x0005, 0x00f6, 0x2079, 0x0090,
++	0x782c, 0xd0fc, 0x190c, 0x17b0, 0x00e6, 0x00d6, 0x2071, 0x134a,
++	0x7000, 0x9005, 0x1904, 0x16de, 0x00c6, 0x7206, 0x9280, 0x0005,
++	0x205c, 0x7004, 0x2068, 0x782b, 0x0004, 0x2001, 0x0200, 0x2003,
++	0x0040, 0x6810, 0x00d6, 0x2068, 0x686c, 0x7836, 0x6890, 0x00f6,
++	0x2079, 0x0200, 0x7803, 0x0040, 0xa001, 0xa001, 0xa001, 0xa001,
++	0xa001, 0xa001, 0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x00fe,
++	0x00de, 0x2b68, 0x6814, 0x2050, 0x6858, 0x2060, 0x6810, 0x2040,
++	0x6064, 0x90cc, 0x000f, 0x6944, 0x791a, 0x7116, 0x6848, 0x781e,
++	0x701a, 0x9006, 0x700e, 0x7012, 0x7004, 0x6940, 0x6838, 0x9106,
++	0x11c8, 0x693c, 0x6834, 0x9106, 0x11a8, 0x8aff, 0x01f0, 0x0126,
++	0x2091, 0x8000, 0x2079, 0x0090, 0x2009, 0x0001, 0x00d1, 0x0118,
++	0x2009, 0x0001, 0x00b1, 0x012e, 0x00ce, 0x9006, 0x00de, 0x00ee,
++	0x00fe, 0x0005, 0x0036, 0x0046, 0x6b38, 0x6c34, 0x080c, 0x191e,
++	0x004e, 0x003e, 0x0d10, 0x00ce, 0x0c88, 0x00ce, 0x9085, 0x0001,
++	0x0c68, 0x0076, 0x0066, 0x0056, 0x0046, 0x0036, 0x0026, 0x8aff,
++	0x0904, 0x1766, 0x700c, 0x7214, 0x923a, 0x7010, 0x7218, 0x9203,
++	0x0a04, 0x1765, 0x9705, 0x0904, 0x1765, 0x903e, 0x2730, 0x6880,
++	0xd0fc, 0x11a8, 0x00d6, 0x2805, 0x9c68, 0x2900, 0x0002, 0x1748,
++	0x172d, 0x172d, 0x1748, 0x1748, 0x1741, 0x1748, 0x172d, 0x1748,
++	0x1732, 0x1732, 0x1748, 0x1748, 0x1748, 0x1739, 0x1732, 0xc0fc,
++	0x6882, 0x6b2c, 0x6a30, 0x6d1c, 0x6c20, 0xd99c, 0x0528, 0x00d6,
++	0x2805, 0x9c68, 0x6f08, 0x6e0c, 0x00f0, 0x6b08, 0x6a0c, 0x6d00,
++	0x6c04, 0x00c8, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c,
++	0x0090, 0x00de, 0x00d6, 0x6864, 0x9084, 0x00ff, 0x9086, 0x001e,
++	0x1138, 0x00de, 0x080c, 0x18be, 0x1904, 0x16f7, 0x900e, 0x00f0,
++	0x00de, 0x080c, 0x0d7e, 0x00de, 0x7b12, 0x7a16, 0x7d02, 0x7c06,
++	0x7f0a, 0x7e0e, 0x792a, 0x7000, 0x8000, 0x7002, 0x683c, 0x9300,
++	0x683e, 0x6840, 0x9201, 0x6842, 0x700c, 0x9300, 0x700e, 0x7010,
++	0x9201, 0x7012, 0x080c, 0x18be, 0x0008, 0x9006, 0x002e, 0x003e,
++	0x004e, 0x005e, 0x006e, 0x007e, 0x0005, 0x080c, 0x0d7e, 0x0026,
++	0x2001, 0x0105, 0x2003, 0x0010, 0x782b, 0x0004, 0x7003, 0x0000,
++	0x7004, 0x2060, 0x00d6, 0x6014, 0x2068, 0x080c, 0xa942, 0x0118,
++	0x6880, 0xc0bd, 0x6882, 0x6020, 0x9086, 0x0006, 0x1180, 0x2061,
++	0x0100, 0x62c8, 0x2001, 0x00fa, 0x8001, 0x1df0, 0x60c8, 0x9206,
++	0x1dc0, 0x60c4, 0x689a, 0x60c8, 0x6896, 0x7004, 0x2060, 0x00de,
++	0x00c6, 0x080c, 0xa5f3, 0x00ce, 0x2001, 0x1313, 0x2004, 0x9c06,
++	0x1160, 0x2009, 0x0040, 0x080c, 0x1b67, 0x080c, 0x8a8d, 0x2011,
++	0x0000, 0x080c, 0x88ec, 0x080c, 0x7b72, 0x002e, 0x0804, 0x186a,
++	0x0126, 0x2091, 0x2400, 0x0006, 0x0016, 0x00f6, 0x00e6, 0x00d6,
++	0x00c6, 0x2079, 0x0090, 0x2071, 0x134a, 0x2b68, 0x6858, 0x2060,
++	0x792c, 0x782b, 0x0002, 0x9184, 0x0700, 0x1904, 0x176f, 0x7000,
++	0x0002, 0x186a, 0x17cd, 0x183d, 0x1868, 0x8001, 0x7002, 0xd19c,
++	0x1170, 0x8aff, 0x05d0, 0x2009, 0x0001, 0x080c, 0x16f1, 0x0904,
++	0x186a, 0x2009, 0x0001, 0x080c, 0x16f1, 0x0804, 0x186a, 0x782b,
++	0x0004, 0xd194, 0x0148, 0x6880, 0xc0fc, 0x6882, 0x8aff, 0x11d8,
++	0x687c, 0xc0f5, 0x687e, 0x00b8, 0x0026, 0x0036, 0x6b3c, 0x6a40,
++	0x7810, 0x682e, 0x931a, 0x7814, 0x6832, 0x9213, 0x7800, 0x681e,
++	0x7804, 0x6822, 0x6b3e, 0x6a42, 0x003e, 0x002e, 0x080c, 0x18d6,
++	0x6880, 0xc0fd, 0x6882, 0x2a00, 0x6816, 0x2c00, 0x685a, 0x2800,
++	0x6812, 0x7003, 0x0000, 0x0804, 0x186a, 0x00f6, 0x0026, 0x781c,
++	0x0006, 0x7818, 0x0006, 0x2079, 0x0100, 0x7a14, 0x9284, 0x1984,
++	0x9085, 0x0012, 0x7816, 0x0036, 0x2019, 0x1000, 0x8319, 0x090c,
++	0x0d7e, 0x7820, 0xd0bc, 0x1dd0, 0x003e, 0x79c8, 0x000e, 0x9102,
++	0x001e, 0x0006, 0x0016, 0x79c4, 0x000e, 0x9103, 0x78c6, 0x000e,
++	0x78ca, 0x9284, 0x1984, 0x9085, 0x0012, 0x7816, 0x002e, 0x00fe,
++	0x782b, 0x0008, 0x7003, 0x0000, 0x0468, 0x8001, 0x7002, 0xd194,
++	0x0168, 0x782c, 0xd0fc, 0x1904, 0x17c0, 0xd19c, 0x11f8, 0x8aff,
++	0x0508, 0x2009, 0x0001, 0x080c, 0x16f1, 0x00e0, 0x0026, 0x0036,
++	0x6b3c, 0x6a40, 0x080c, 0x18d6, 0x00d6, 0x2805, 0x9c68, 0x6064,
++	0xd09c, 0x1128, 0x6808, 0x931a, 0x680c, 0x9213, 0x0020, 0x6810,
++	0x931a, 0x6814, 0x9213, 0x00de, 0x0804, 0x17f0, 0x0804, 0x17ec,
++	0x080c, 0x0d7e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x001e, 0x000e,
++	0x012e, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x134a, 0x7000, 0x9086,
++	0x0000, 0x0904, 0x18bb, 0x2079, 0x0090, 0x2009, 0x0207, 0x210c,
++	0xd194, 0x01b8, 0x2009, 0x020c, 0x210c, 0x9184, 0x0003, 0x0188,
++	0x080c, 0xc46f, 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0d7e,
++	0x0016, 0x2009, 0x0040, 0x080c, 0x1b67, 0x001e, 0x2001, 0x020c,
++	0x2102, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106,
++	0x1120, 0x2009, 0x0040, 0x080c, 0x1b67, 0x782c, 0xd0fc, 0x09a8,
++	0x080c, 0x17b0, 0x7000, 0x9086, 0x0000, 0x1978, 0x782b, 0x0004,
++	0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x1b67, 0x782b,
++	0x0002, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x8840, 0x2805,
++	0x9005, 0x0110, 0x8a51, 0x0005, 0x6004, 0x9005, 0x0168, 0x685a,
++	0x2060, 0x6064, 0x9084, 0x000f, 0x9080, 0x18fe, 0x2045, 0x88ff,
++	0x090c, 0x0d7e, 0x8a51, 0x0005, 0x2050, 0x0005, 0x8a50, 0x8841,
++	0x2805, 0x9005, 0x1190, 0x2c00, 0x9d06, 0x0120, 0x6000, 0x9005,
++	0x1108, 0x2d00, 0x2060, 0x685a, 0x6064, 0x9084, 0x000f, 0x9080,
++	0x190e, 0x2045, 0x88ff, 0x090c, 0x0d7e, 0x0005, 0x0000, 0x001d,
++	0x0021, 0x0025, 0x0029, 0x002d, 0x0031, 0x0035, 0x0000, 0x001b,
++	0x0021, 0x0027, 0x002d, 0x0033, 0x0000, 0x0000, 0x0000, 0x18f3,
++	0x18ef, 0x0000, 0x0000, 0x18fd, 0x0000, 0x18f3, 0x0000, 0x18fa,
++	0x18f7, 0x0000, 0x0000, 0x0000, 0x18fd, 0x18fa, 0x0000, 0x18f5,
++	0x18f5, 0x0000, 0x0000, 0x18fd, 0x0000, 0x18f5, 0x0000, 0x18fb,
++	0x18fb, 0x0000, 0x0000, 0x0000, 0x18fd, 0x18fb, 0x00a6, 0x0096,
++	0x0086, 0x6b42, 0x6c3e, 0x6888, 0x9055, 0x0904, 0x19af, 0x2d60,
++	0x6064, 0x90cc, 0x000f, 0x99c0, 0x18fe, 0x9986, 0x0007, 0x0130,
++	0x9986, 0x000e, 0x0118, 0x9986, 0x000f, 0x1120, 0x608c, 0x9422,
++	0x6090, 0x931b, 0x2805, 0x9045, 0x1140, 0x0310, 0x0804, 0x19af,
++	0x6004, 0x9065, 0x0904, 0x19af, 0x0c18, 0x2805, 0x9005, 0x01a8,
++	0x9c68, 0xd99c, 0x1128, 0x6808, 0x9422, 0x680c, 0x931b, 0x0020,
++	0x6810, 0x9422, 0x6814, 0x931b, 0x0620, 0x2300, 0x9405, 0x0150,
++	0x8a51, 0x0904, 0x19af, 0x8840, 0x0c40, 0x6004, 0x9065, 0x0904,
++	0x19af, 0x0830, 0x8a51, 0x0904, 0x19af, 0x8840, 0x2805, 0x9005,
++	0x1158, 0x6004, 0x9065, 0x0904, 0x19af, 0x6064, 0x90cc, 0x000f,
++	0x99c0, 0x18fe, 0x2805, 0x2040, 0x2b68, 0x6880, 0xc0fc, 0x6882,
++	0x0458, 0x8422, 0x8420, 0x831a, 0x9399, 0x0000, 0x00d6, 0x2b68,
++	0x6c2e, 0x6b32, 0x00de, 0xd99c, 0x1168, 0x6908, 0x2400, 0x9122,
++	0x690c, 0x2300, 0x911b, 0x0a0c, 0x0d7e, 0x6800, 0x9420, 0x6804,
++	0x9319, 0x0060, 0x6910, 0x2400, 0x9122, 0x6914, 0x2300, 0x911b,
++	0x0a0c, 0x0d7e, 0x6800, 0x9420, 0x6804, 0x9319, 0x2b68, 0x6c1e,
++	0x6b22, 0x6880, 0xc0fd, 0x6882, 0x2c00, 0x685a, 0x2800, 0x6812,
++	0x2a00, 0x6816, 0x000e, 0x000e, 0x000e, 0x9006, 0x0028, 0x008e,
++	0x009e, 0x00ae, 0x9085, 0x0001, 0x0005, 0x2008, 0x9026, 0x2410,
++	0x780f, 0x0000, 0x7810, 0x9420, 0x9291, 0x0000, 0x7814, 0x9210,
++	0x8109, 0x1dc0, 0x9284, 0x000f, 0x9405, 0x0005, 0x2001, 0x0005,
++	0x2004, 0x9084, 0x0007, 0x0002, 0x19de, 0x17b0, 0x19de, 0x19d4,
++	0x19d7, 0x19da, 0x19d7, 0x19da, 0x080c, 0x17b0, 0x0005, 0x080c,
++	0x0fd5, 0x0005, 0x080c, 0x17b0, 0x080c, 0x0fd5, 0x0005, 0x0126,
++	0x2091, 0x2600, 0x2079, 0x0200, 0x2071, 0x0260, 0x2069, 0x1100,
++	0x7817, 0x0000, 0x789b, 0x0814, 0x78a3, 0x0406, 0x789f, 0x0410,
++	0x2009, 0x013b, 0x200b, 0x0400, 0x781b, 0x0002, 0x783b, 0x001f,
++	0x7837, 0x0020, 0x7803, 0x1600, 0x012e, 0x0005, 0x2091, 0x2600,
++	0x781c, 0xd0a4, 0x190c, 0x1b64, 0x7900, 0xd1dc, 0x1118, 0x9084,
++	0x0006, 0x001a, 0x9084, 0x000e, 0x0002, 0x1a27, 0x1a1d, 0x6bd6,
++	0x1a1f, 0x1a21, 0x1a21, 0x1a21, 0x1a21, 0x6bba, 0x1a1d, 0x1a23,
++	0x1a1d, 0x1a21, 0x1a1d, 0x1a21, 0x1a1d, 0x080c, 0x0d7e, 0x080c,
++	0x0d7e, 0x0031, 0x0020, 0x080c, 0x6bba, 0x080c, 0x6bd6, 0x0005,
++	0x0006, 0x0016, 0x0026, 0x080c, 0xc46f, 0x7930, 0x9184, 0x0003,
++	0x01c0, 0x2001, 0x1313, 0x2004, 0x9005, 0x0170, 0x2001, 0x0133,
++	0x2004, 0x9005, 0x090c, 0x0d7e, 0x00c6, 0x2001, 0x1313, 0x2064,
++	0x080c, 0xa5f3, 0x00ce, 0x0460, 0x2009, 0x0040, 0x080c, 0x1b67,
++	0x0438, 0x9184, 0x0014, 0x01b0, 0x6a00, 0x9286, 0x0003, 0x0180,
++	0x080c, 0x62e4, 0x1158, 0x2001, 0x12a8, 0x2003, 0x0001, 0x2001,
++	0x1100, 0x2003, 0x0001, 0x080c, 0x621a, 0x0010, 0x080c, 0x4faa,
++	0x0099, 0x0070, 0x9184, 0x1400, 0x0110, 0x0071, 0x0048, 0x9184,
++	0x0140, 0x0110, 0x0049, 0x0020, 0x9184, 0x8000, 0x0108, 0x0021,
++	0x002e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x0036, 0x0046, 0x0056,
++	0x2071, 0x1347, 0x080c, 0x1577, 0x005e, 0x004e, 0x003e, 0x00ee,
++	0x0005, 0x0126, 0x2091, 0x2e00, 0x2071, 0x1100, 0x7128, 0x2001,
++	0x129a, 0x2102, 0x2001, 0x12a2, 0x2102, 0x2001, 0x013b, 0x2102,
++	0x2079, 0x0200, 0x9198, 0x0007, 0x831c, 0x831c, 0x831c, 0x2320,
++	0x9182, 0x0224, 0x1228, 0x2011, 0x0004, 0x8423, 0x8423, 0x0088,
++	0x9182, 0x02d4, 0x1228, 0x2011, 0x0003, 0x8403, 0x9420, 0x0048,
++	0x9182, 0x0444, 0x1220, 0x2011, 0x0002, 0x8423, 0x0010, 0x2011,
++	0x0001, 0x9482, 0x0110, 0x8002, 0x8020, 0x8301, 0x9402, 0x0110,
++	0x0208, 0x8321, 0x8217, 0x8203, 0x9405, 0x2001, 0x0201, 0x789e,
++	0x9198, 0x0007, 0x831c, 0x831c, 0x831c, 0x9398, 0x0003, 0x2320,
++	0x9182, 0x0204, 0x1228, 0x2011, 0x0004, 0x8423, 0x8423, 0x0088,
++	0x9182, 0x02b4, 0x1228, 0x2011, 0x0003, 0x8403, 0x9420, 0x0048,
++	0x9182, 0x041c, 0x1220, 0x2011, 0x0002, 0x8423, 0x0010, 0x2011,
++	0x0001, 0x9482, 0x010c, 0x8002, 0x8020, 0x8301, 0x9402, 0x0110,
++	0x0208, 0x8321, 0x8217, 0x8203, 0x9405, 0x78a3, 0x0200, 0x9198,
++	0x0007, 0x831c, 0x831c, 0x831c, 0x9398, 0x0005, 0x2320, 0x9182,
++	0x0204, 0x1230, 0x2011, 0x0008, 0x8423, 0x8423, 0x8423, 0x0488,
++	0x9182, 0x024c, 0x1240, 0x2011, 0x0007, 0x8403, 0x8003, 0x9400,
++	0x9400, 0x9420, 0x0430, 0x9182, 0x02bc, 0x1238, 0x2011, 0x0006,
++	0x8403, 0x8003, 0x9400, 0x9420, 0x00e0, 0x9182, 0x034c, 0x1230,
++	0x2011, 0x0005, 0x8403, 0x8003, 0x9420, 0x0098, 0x9182, 0x042c,
++	0x1228, 0x2011, 0x0004, 0x8423, 0x8423, 0x0058, 0x9182, 0x059c,
++	0x1228, 0x2011, 0x0003, 0x8403, 0x9420, 0x0018, 0x2011, 0x0002,
++	0x8423, 0x9482, 0x0228, 0x8002, 0x8020, 0x8301, 0x9402, 0x0110,
++	0x0208, 0x8321, 0x8217, 0x8203, 0x9405, 0x789a, 0x012e, 0x0005,
++	0x0006, 0x00d6, 0x2069, 0x0200, 0x6814, 0x9084, 0xffc0, 0x910d,
++	0x6916, 0x00de, 0x000e, 0x0005, 0x00d6, 0x2069, 0x0200, 0x9005,
++	0x6810, 0x0110, 0xc0a5, 0x0008, 0xc0a4, 0x6812, 0x00de, 0x0005,
++	0x0006, 0x00d6, 0x2069, 0x0200, 0x6810, 0x9084, 0xfff8, 0x910d,
++	0x6912, 0x00de, 0x000e, 0x0005, 0x7938, 0x080c, 0x0d7e, 0x00f6,
++	0x2079, 0x0200, 0x7902, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001,
++	0xa001, 0x7902, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001,
++	0x00fe, 0x0005, 0x0126, 0x2091, 0x2800, 0x2061, 0x0100, 0x2071,
++	0x1100, 0x2009, 0x0000, 0x080c, 0x2355, 0x080c, 0x2261, 0x6054,
++	0x8004, 0x8004, 0x8004, 0x8004, 0x9084, 0x000c, 0x6150, 0x918c,
++	0xfff3, 0x9105, 0x6052, 0x6050, 0x9084, 0xfbff, 0x9085, 0x2000,
++	0x6052, 0x2009, 0x12d7, 0x2011, 0x12d8, 0x6358, 0x939c, 0x38f0,
++	0x2320, 0x080c, 0x22a5, 0x1238, 0x939d, 0x4003, 0x94a5, 0x8603,
++	0x230a, 0x2412, 0x0030, 0x939d, 0x0203, 0x94a5, 0x8603, 0x230a,
++	0x2412, 0x9006, 0x080c, 0x2290, 0x9006, 0x080c, 0x2273, 0x20a9,
++	0x0012, 0x1d04, 0x1bb9, 0x2091, 0x6000, 0x1f04, 0x1bb9, 0x602f,
++	0x0100, 0x602f, 0x0000, 0x6050, 0x9085, 0x0400, 0x9084, 0xdfff,
++	0x6052, 0x6024, 0x6026, 0x080c, 0x1f7d, 0x2009, 0x00ef, 0x6132,
++	0x6136, 0x080c, 0x1f8d, 0x60e7, 0x0000, 0x61ea, 0x60e3, 0x0008,
++	0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f, 0x0080, 0x602f, 0x0000,
++	0x6007, 0x049f, 0x60bb, 0x0000, 0x20a9, 0x0018, 0x60bf, 0x0000,
++	0x1f04, 0x1be6, 0x60bb, 0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012,
++	0x60bf, 0x0320, 0x60bf, 0x0018, 0x601b, 0x00f0, 0x601f, 0x001e,
++	0x600f, 0x006b, 0x602b, 0x402f, 0x012e, 0x0005, 0x00f6, 0x2079,
++	0x0140, 0x78c3, 0x0080, 0x78c3, 0x0083, 0x78c3, 0x0000, 0x00fe,
++	0x0005, 0x2001, 0x1134, 0x2003, 0x0000, 0x2001, 0x1133, 0x2003,
++	0x0001, 0x0005, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026,
++	0x6124, 0x9184, 0x5e2c, 0x1118, 0x9184, 0x0007, 0x002a, 0x9195,
++	0x0004, 0x9284, 0x0007, 0x0002, 0x1c46, 0x1c2c, 0x1c2f, 0x1c32,
++	0x1c37, 0x1c39, 0x1c3d, 0x1c41, 0x080c, 0x745c, 0x00b8, 0x080c,
++	0x752d, 0x00a0, 0x080c, 0x752d, 0x080c, 0x745c, 0x0078, 0x0099,
++	0x0068, 0x080c, 0x745c, 0x0079, 0x0048, 0x080c, 0x752d, 0x0059,
++	0x0028, 0x080c, 0x752d, 0x080c, 0x745c, 0x0029, 0x002e, 0x001e,
++	0x000e, 0x012e, 0x0005, 0x6124, 0x6028, 0xd09c, 0x0118, 0xd19c,
++	0x1904, 0x1e92, 0xd1f4, 0x0110, 0x080c, 0x0d7e, 0x080c, 0x62e4,
++	0x05d0, 0x7000, 0x9086, 0x0003, 0x01f0, 0x6024, 0x9084, 0x1800,
++	0x01d0, 0x080c, 0x630a, 0x0118, 0x080c, 0x62f6, 0x11a0, 0x6027,
++	0x0020, 0x6043, 0x0000, 0x709c, 0x9005, 0x1140, 0x709f, 0x0001,
++	0x00d6, 0x2069, 0x0140, 0x080c, 0x633e, 0x00de, 0x2001, 0x12a7,
++	0x2003, 0xaaaa, 0x0458, 0x080c, 0x630a, 0x15d0, 0x6024, 0x9084,
++	0x1800, 0x1108, 0x04a8, 0x2001, 0x12a7, 0x2003, 0xaaaa, 0x2001,
++	0x12a8, 0x2003, 0x0001, 0x2001, 0x1100, 0x2003, 0x0001, 0x080c,
++	0x621a, 0x0804, 0x1e92, 0xd1ac, 0x1518, 0x6024, 0xd0dc, 0x1170,
++	0xd0e4, 0x1188, 0xd0d4, 0x11a0, 0xd0cc, 0x0130, 0x7090, 0x9086,
++	0x0028, 0x1110, 0x080c, 0x6492, 0x0804, 0x1e92, 0x2001, 0x12a8,
++	0x2003, 0x0000, 0x0048, 0x2001, 0x12a8, 0x2003, 0x0002, 0x0020,
++	0x080c, 0x6404, 0x0804, 0x1e92, 0x080c, 0x6531, 0x0804, 0x1e92,
++	0xd1ac, 0x0904, 0x1db5, 0x080c, 0x62e4, 0x11d8, 0x6027, 0x0020,
++	0x0006, 0x0026, 0x0036, 0x080c, 0x6300, 0x1170, 0x2001, 0x12a8,
++	0x2003, 0x0001, 0x2001, 0x1100, 0x2003, 0x0001, 0x080c, 0x621a,
++	0x003e, 0x002e, 0x000e, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c,
++	0x62be, 0x0016, 0x0046, 0x00c6, 0x644c, 0x9486, 0xf0f0, 0x1138,
++	0x2061, 0x0100, 0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74d6,
++	0x948c, 0xff00, 0x7034, 0xd084, 0x0178, 0x9186, 0xf800, 0x1160,
++	0x7040, 0xd084, 0x1148, 0xc085, 0x7042, 0x0036, 0x2418, 0x2011,
++	0x8016, 0x080c, 0x3f23, 0x003e, 0x9196, 0xff00, 0x05a8, 0x7058,
++	0x9084, 0x00ff, 0x810f, 0x81ff, 0x0110, 0x9116, 0x0568, 0x7130,
++	0xd184, 0x1550, 0x080c, 0x2987, 0x0128, 0xc18d, 0x7132, 0x080c,
++	0x58c6, 0x1510, 0x6240, 0x9294, 0x0010, 0x0130, 0x6248, 0x9294,
++	0xff00, 0x9296, 0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, 0x1d83,
++	0x7034, 0xd08c, 0x1140, 0x2001, 0x110c, 0x200c, 0xd1ac, 0x1904,
++	0x1d83, 0xc1ad, 0x2102, 0x0036, 0x73d4, 0x2011, 0x8013, 0x080c,
++	0x3f23, 0x003e, 0x0804, 0x1d83, 0x7034, 0xd08c, 0x1140, 0x2001,
++	0x110c, 0x200c, 0xd1ac, 0x1904, 0x1d83, 0xc1ad, 0x2102, 0x0036,
++	0x73d4, 0x2011, 0x8013, 0x080c, 0x3f23, 0x003e, 0x7130, 0xc185,
++	0x7132, 0x2011, 0x1153, 0x220c, 0xd1a4, 0x01f0, 0x0016, 0x2009,
++	0x0001, 0x2011, 0x0100, 0x080c, 0x73af, 0x2019, 0x000e, 0x00c6,
++	0x2061, 0x0000, 0x080c, 0xc0b9, 0x00ce, 0x9484, 0x00ff, 0x9080,
++	0x298c, 0x200d, 0x918c, 0xff00, 0x810f, 0x8127, 0x9006, 0x2009,
++	0x000e, 0x080c, 0xc12f, 0x001e, 0xd1ac, 0x1140, 0x0016, 0x900e,
++	0x2019, 0x0004, 0x080c, 0x2831, 0x001e, 0x0068, 0x0156, 0x20a9,
++	0x007f, 0x900e, 0x080c, 0x5608, 0x1110, 0x080c, 0x5100, 0x8108,
++	0x1f04, 0x1d7a, 0x015e, 0x00ce, 0x004e, 0x2011, 0x0003, 0x080c,
++	0x88e2, 0x2011, 0x0002, 0x080c, 0x88ec, 0x080c, 0x87a2, 0x0036,
++	0x901e, 0x080c, 0x8847, 0x003e, 0x60e3, 0x0000, 0x001e, 0x2001,
++	0x1100, 0x2014, 0x9296, 0x0004, 0x1170, 0xd19c, 0x11b0, 0x2011,
++	0x110c, 0x2214, 0xd29c, 0x1120, 0x6204, 0x9295, 0x0002, 0x6206,
++	0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0x1124, 0x2003,
++	0x0000, 0x080c, 0x483b, 0x6027, 0x0020, 0xd194, 0x0904, 0x1e92,
++	0x0016, 0x6220, 0xd2b4, 0x0904, 0x1e3e, 0x080c, 0x7271, 0x080c,
++	0x85a2, 0x6027, 0x0004, 0x00f6, 0x2019, 0x130d, 0x2304, 0x907d,
++	0x0904, 0x1e0f, 0x7804, 0x9086, 0x0032, 0x1904, 0x1e0f, 0x00d6,
++	0x00c6, 0x00e6, 0x2069, 0x0140, 0x7810, 0x685e, 0x7808, 0x685a,
++	0x6043, 0x0002, 0x2001, 0x0003, 0x8001, 0x1df0, 0x6043, 0x0000,
++	0x2001, 0x003c, 0x8001, 0x1df0, 0x2001, 0x1000, 0x080c, 0x2401,
++	0x9006, 0x080c, 0x2401, 0x2001, 0x001e, 0x8001, 0x0240, 0x20a9,
++	0x0009, 0x080c, 0x2321, 0x6904, 0xd1dc, 0x1140, 0x0cb0, 0x2001,
++	0x0100, 0x080c, 0x2401, 0x9006, 0x080c, 0x2401, 0x080c, 0x79ab,
++	0x080c, 0x7aa4, 0x7814, 0x2070, 0x7067, 0x0103, 0x2f60, 0x080c,
++	0x8ed9, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x0005, 0x00fe,
++	0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0138, 0x2001,
++	0x1000, 0x080c, 0x2401, 0x9006, 0x080c, 0x2401, 0x00de, 0x00c6,
++	0x2061, 0x1304, 0x6028, 0x909a, 0x00c8, 0x1238, 0x8000, 0x602a,
++	0x00ce, 0x080c, 0x857e, 0x0804, 0x1e91, 0x2061, 0x0100, 0x62c0,
++	0x080c, 0x8dc7, 0x2019, 0x130d, 0x2304, 0x9065, 0x0120, 0x2009,
++	0x0027, 0x080c, 0x8f53, 0x00ce, 0x0804, 0x1e91, 0xd2bc, 0x05f0,
++	0x080c, 0x727e, 0x6014, 0x9084, 0x1984, 0x9085, 0x0010, 0x6016,
++	0x6027, 0x0004, 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000,
++	0x0138, 0x2001, 0x1000, 0x080c, 0x2401, 0x9006, 0x080c, 0x2401,
++	0x00de, 0x00c6, 0x2061, 0x1304, 0x6044, 0x909a, 0x00c8, 0x1608,
++	0x8000, 0x6046, 0x603c, 0x00ce, 0x9005, 0x0558, 0x2009, 0x07d0,
++	0x080c, 0x7276, 0x9080, 0x0008, 0x2004, 0x9086, 0x0006, 0x1138,
++	0x6114, 0x918c, 0x1984, 0x918d, 0x0012, 0x6116, 0x00d0, 0x6114,
++	0x918c, 0x1984, 0x918d, 0x0016, 0x6116, 0x0098, 0x6027, 0x0004,
++	0x0080, 0x0036, 0x2019, 0x0001, 0x080c, 0x8847, 0x003e, 0x2019,
++	0x1313, 0x2304, 0x9065, 0x0120, 0x2009, 0x004f, 0x080c, 0x8f53,
++	0x00ce, 0x001e, 0xd19c, 0x0904, 0x1f0d, 0x7034, 0xd0ac, 0x1904,
++	0x1edb, 0x0016, 0x0156, 0x6027, 0x0008, 0x080c, 0x2346, 0x6050,
++	0x9085, 0x0040, 0x6052, 0x6050, 0x9084, 0xfbcf, 0x6052, 0x080c,
++	0x2340, 0x9085, 0x2000, 0x6052, 0x20a9, 0x0012, 0x1d04, 0x1eae,
++	0x2091, 0x6000, 0x1f04, 0x1eae, 0x6050, 0x9085, 0x0400, 0x9084,
++	0xdfbf, 0x6052, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x1ebc, 0x6150,
++	0x9185, 0x1400, 0x6052, 0x20a9, 0x0366, 0x1d04, 0x1ec5, 0x2091,
++	0x6000, 0x6020, 0xd09c, 0x1130, 0x015e, 0x6152, 0x001e, 0x6027,
++	0x0008, 0x04d8, 0x080c, 0x2304, 0x1f04, 0x1ec5, 0x015e, 0x6152,
++	0x001e, 0x6027, 0x0008, 0x0016, 0x6028, 0xc09c, 0x602a, 0x2011,
++	0x0003, 0x080c, 0x88e2, 0x2011, 0x0002, 0x080c, 0x88ec, 0x080c,
++	0x87a2, 0x0036, 0x901e, 0x080c, 0x8847, 0x003e, 0x60e3, 0x0000,
++	0x080c, 0xc44e, 0x080c, 0xc469, 0x2001, 0x1172, 0x2004, 0xd0fc,
++	0x1120, 0x9085, 0x0001, 0x080c, 0x6331, 0x9006, 0x080c, 0x2401,
++	0x2009, 0x0002, 0x080c, 0x2355, 0x2001, 0x1100, 0x2003, 0x0004,
++	0x6027, 0x0008, 0x080c, 0x0b68, 0x001e, 0x918c, 0xffd0, 0x6126,
++	0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x00f6, 0x0126,
++	0x2091, 0x8000, 0x2071, 0x1100, 0x71cc, 0x70ce, 0x9116, 0x05d8,
++	0x81ff, 0x01a0, 0x2009, 0x0000, 0x080c, 0x2355, 0x2011, 0x8011,
++	0x2019, 0x010e, 0x231c, 0x939e, 0x0007, 0x1118, 0x2019, 0x0001,
++	0x0010, 0x2019, 0x0000, 0x080c, 0x3f23, 0x0428, 0x2001, 0x12e0,
++	0x200c, 0x81ff, 0x1140, 0x2001, 0x0109, 0x2004, 0xd0b4, 0x0118,
++	0x2019, 0x0003, 0x0008, 0x2118, 0x2011, 0x8012, 0x080c, 0x3f23,
++	0x2001, 0x1172, 0x2004, 0xd0fc, 0x1170, 0x00c6, 0x080c, 0x1fd8,
++	0x080c, 0x877f, 0x2061, 0x0100, 0x2019, 0x0028, 0x2009, 0x0002,
++	0x080c, 0x2831, 0x00ce, 0x012e, 0x00fe, 0x00ee, 0x003e, 0x002e,
++	0x001e, 0x000e, 0x0005, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094,
++	0xff00, 0x1110, 0x81ff, 0x0118, 0x080c, 0x6e62, 0x0038, 0x9080,
++	0x298c, 0x200d, 0x918c, 0xff00, 0x810f, 0x9006, 0x0005, 0x9080,
++	0x298c, 0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, 0x2069, 0x0140,
++	0x2001, 0x1116, 0x2003, 0x00ef, 0x20a9, 0x0010, 0x9006, 0x6852,
++	0x6856, 0x1f04, 0x1f88, 0x00de, 0x0005, 0x0006, 0x00d6, 0x0026,
++	0x2069, 0x0140, 0x2001, 0x1116, 0x2102, 0x8114, 0x8214, 0x8214,
++	0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, 0x82ff, 0x1128,
++	0x9184, 0x000f, 0x9080, 0xc84f, 0x2005, 0x6856, 0x8211, 0x1f04,
++	0x1f9d, 0x002e, 0x00de, 0x000e, 0x0005, 0x00c6, 0x2061, 0x1100,
++	0x6030, 0x0110, 0xc09d, 0x0008, 0xc09c, 0x6032, 0x00ce, 0x0005,
++	0x0156, 0x00d6, 0x0026, 0x0016, 0x0006, 0x2069, 0x0140, 0x6980,
++	0x9116, 0x0180, 0x9112, 0x1230, 0x8212, 0x8210, 0x22a8, 0x2001,
++	0x0402, 0x0018, 0x22a8, 0x2001, 0x0404, 0x680e, 0x1f04, 0x1fcd,
++	0x680f, 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e, 0x0005,
++	0x2001, 0x1153, 0x2004, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006,
++	0x0046, 0x2020, 0x2009, 0x002e, 0x080c, 0xc12f, 0x004e, 0x0005,
++	0x00f6, 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0904,
++	0x2045, 0x080c, 0x22a5, 0x0660, 0x9084, 0x0700, 0x908e, 0x0600,
++	0x1120, 0x2011, 0x4000, 0x900e, 0x0458, 0x908e, 0x0500, 0x1120,
++	0x2011, 0x8000, 0x900e, 0x0420, 0x908e, 0x0400, 0x1120, 0x9016,
++	0x2009, 0x0001, 0x00e8, 0x908e, 0x0300, 0x1120, 0x9016, 0x2009,
++	0x0002, 0x00b0, 0x908e, 0x0200, 0x1120, 0x9016, 0x2009, 0x0004,
++	0x0078, 0x908e, 0x0100, 0x1548, 0x9016, 0x2009, 0x0008, 0x0040,
++	0x9084, 0x0700, 0x908e, 0x0300, 0x1500, 0x2011, 0x0030, 0x0058,
++	0x2300, 0x9080, 0x0020, 0x2018, 0x080c, 0x73f0, 0x928c, 0xff00,
++	0x0110, 0x2011, 0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, 0x78c2,
++	0x2009, 0x0138, 0x220a, 0x080c, 0x62e4, 0x1118, 0x2009, 0x1298,
++	0x220a, 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8,
++	0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170,
++	0x200c, 0x8000, 0x2014, 0x9184, 0x0003, 0x0110, 0x080c, 0x0d7e,
++	0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x2001, 0x0171, 0x2004,
++	0xd0dc, 0x0168, 0x2001, 0x0170, 0x200c, 0x918c, 0x00ff, 0x918e,
++	0x004c, 0x1128, 0x200c, 0x918c, 0xff00, 0x810f, 0x0005, 0x900e,
++	0x2001, 0x0227, 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108,
++	0x2001, 0x0226, 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108,
++	0x0005, 0x0018, 0x000c, 0x0018, 0x0020, 0x1000, 0x0800, 0x1000,
++	0x1800, 0x0156, 0x0006, 0x0016, 0x0026, 0x00e6, 0x2001, 0x12ca,
++	0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d7e, 0x0033, 0x00ee, 0x002e,
++	0x001e, 0x000e, 0x015e, 0x0005, 0x20a3, 0x20c1, 0x20e5, 0x20e7,
++	0x2110, 0x2112, 0x2114, 0x2001, 0x0001, 0x080c, 0x1f11, 0x080c,
++	0x22fd, 0x2001, 0x12cc, 0x2003, 0x0000, 0x7828, 0x9084, 0xe1d7,
++	0x782a, 0x9006, 0x20a9, 0x0009, 0x080c, 0x22b9, 0x2001, 0x12ca,
++	0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x2115, 0x080c, 0x7283,
++	0x0005, 0x2009, 0x12cf, 0x200b, 0x0000, 0x2001, 0x12d4, 0x2003,
++	0x0036, 0x2001, 0x12d3, 0x2003, 0x002a, 0x2001, 0x12cc, 0x2003,
++	0x0001, 0x9006, 0x080c, 0x2273, 0x2001, 0xffff, 0x20a9, 0x0009,
++	0x080c, 0x22b9, 0x2001, 0x12ca, 0x2003, 0x0006, 0x2009, 0x001e,
++	0x2011, 0x2115, 0x080c, 0x7283, 0x0005, 0x080c, 0x0d7e, 0x2001,
++	0x12d4, 0x2003, 0x0036, 0x2001, 0x12cc, 0x2003, 0x0003, 0x7a38,
++	0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001,
++	0x0001, 0x080c, 0x2273, 0x2001, 0x12d0, 0x2003, 0x0000, 0x2001,
++	0xffff, 0x20a9, 0x0009, 0x080c, 0x22b9, 0x2001, 0x12ca, 0x2003,
++	0x0006, 0x2009, 0x001e, 0x2011, 0x2115, 0x080c, 0x7283, 0x0005,
++	0x080c, 0x0d7e, 0x080c, 0x0d7e, 0x0005, 0x0006, 0x0016, 0x0026,
++	0x00e6, 0x00f6, 0x0156, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100,
++	0x2001, 0x12cc, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d7e, 0x0043,
++	0x012e, 0x015e, 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005,
++	0x2137, 0x2157, 0x2197, 0x21c7, 0x21eb, 0x21fb, 0x21fd, 0x080c,
++	0x22ad, 0x11b0, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x12d2,
++	0x2104, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0xc08d,
++	0x0008, 0xc085, 0x200a, 0x2001, 0x12ca, 0x2003, 0x0001, 0x0030,
++	0x080c, 0x2221, 0x2001, 0xffff, 0x080c, 0x20b2, 0x0005, 0x080c,
++	0x21ff, 0x05e0, 0x2009, 0x12d3, 0x2104, 0x8001, 0x200a, 0x080c,
++	0x22ad, 0x1178, 0x7850, 0x9084, 0xefff, 0x7852, 0x7a38, 0x9294,
++	0x0005, 0x9296, 0x0005, 0x0518, 0x2009, 0x12d2, 0x2104, 0xc085,
++	0x200a, 0x2009, 0x12cf, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005,
++	0x0118, 0x080c, 0x2207, 0x00c0, 0x200b, 0x0000, 0x7a38, 0x9294,
++	0x0006, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001,
++	0x080c, 0x2290, 0x2001, 0x12cc, 0x2003, 0x0002, 0x0028, 0x2001,
++	0x12ca, 0x2003, 0x0003, 0x0010, 0x080c, 0x20d4, 0x0005, 0x080c,
++	0x21ff, 0x0560, 0x2009, 0x12d3, 0x2104, 0x8001, 0x200a, 0x080c,
++	0x22ad, 0x1168, 0x7850, 0x9084, 0xefff, 0x7852, 0x2001, 0x12ca,
++	0x2003, 0x0003, 0x2001, 0x12cb, 0x2003, 0x0000, 0x00b8, 0x2009,
++	0x12d3, 0x2104, 0x9005, 0x1118, 0x080c, 0x2245, 0x0010, 0x080c,
++	0x2214, 0x080c, 0x2207, 0x2009, 0x12cf, 0x200b, 0x0000, 0x2001,
++	0x12cc, 0x2003, 0x0001, 0x080c, 0x20d4, 0x0000, 0x0005, 0x04b9,
++	0x0508, 0x080c, 0x22ad, 0x11b8, 0x7850, 0x9084, 0xefff, 0x7852,
++	0x2009, 0x12d0, 0x2104, 0x8000, 0x200a, 0x9086, 0x0007, 0x0108,
++	0x0078, 0x2001, 0x12d5, 0x2003, 0x000a, 0x2009, 0x12d2, 0x2104,
++	0xc0fd, 0x200a, 0x0038, 0x0419, 0x2001, 0x12cc, 0x2003, 0x0004,
++	0x080c, 0x20ff, 0x0005, 0x0099, 0x0168, 0x080c, 0x22ad, 0x1138,
++	0x7850, 0x9084, 0xefff, 0x7852, 0x080c, 0x20eb, 0x0018, 0x0079,
++	0x080c, 0x20ff, 0x0005, 0x080c, 0x0d7e, 0x080c, 0x0d7e, 0x2009,
++	0x12d4, 0x2104, 0x8001, 0x200a, 0x090c, 0x2261, 0x0005, 0x7a38,
++	0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001,
++	0x0001, 0x080c, 0x2290, 0x0005, 0x7a38, 0x9294, 0x0006, 0x9296,
++	0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2273,
++	0x0005, 0x2009, 0x12cf, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005,
++	0x0108, 0x0070, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, 0x9296,
++	0x0006, 0x0118, 0x2001, 0x0000, 0x0010, 0x2001, 0x0001, 0x04d9,
++	0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010,
++	0x2001, 0x0001, 0x080c, 0x2290, 0x0005, 0x0086, 0x2001, 0x12d2,
++	0x2004, 0x9084, 0x7fff, 0x090c, 0x0d7e, 0x2009, 0x12d1, 0x2144,
++	0x8846, 0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120, 0xd084, 0x1120,
++	0x080c, 0x0d7e, 0x9006, 0x0010, 0x2001, 0x0001, 0x00a1, 0x008e,
++	0x0005, 0x0006, 0x0156, 0x2001, 0x12ca, 0x20a9, 0x0009, 0x2003,
++	0x0000, 0x8000, 0x1f04, 0x2267, 0x2001, 0x12d1, 0x2003, 0x8000,
++	0x015e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000,
++	0x0158, 0x7838, 0x9084, 0xfff9, 0x9085, 0x0004, 0x783a, 0x2009,
++	0x12d7, 0x210c, 0x795a, 0x0050, 0x7838, 0x9084, 0xfffb, 0x9085,
++	0x0006, 0x783a, 0x2009, 0x12d8, 0x210c, 0x795a, 0x00fe, 0x0005,
++	0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0138, 0x7838, 0x9084,
++	0xfffa, 0x9085, 0x0004, 0x783a, 0x0030, 0x7838, 0x9084, 0xfffb,
++	0x9085, 0x0005, 0x783a, 0x00fe, 0x0005, 0x0006, 0x2001, 0x0100,
++	0x2004, 0x9082, 0x0007, 0x000e, 0x0005, 0x0156, 0x20a9, 0x0064,
++	0x7820, 0x080c, 0x2340, 0xd09c, 0x1110, 0x1f04, 0x22b0, 0x015e,
++	0x0005, 0x0126, 0x0016, 0x0006, 0x2091, 0x8000, 0x080c, 0x2346,
++	0x7850, 0x9085, 0x0040, 0x7852, 0x7850, 0x9084, 0xfbcf, 0x7852,
++	0x080c, 0x2340, 0x9085, 0x2000, 0x7852, 0x000e, 0x2008, 0x9186,
++	0x0000, 0x1118, 0x783b, 0x0007, 0x0090, 0x9186, 0x0001, 0x1118,
++	0x783b, 0x0006, 0x0060, 0x9186, 0x0002, 0x1118, 0x783b, 0x0005,
++	0x0030, 0x9186, 0x0003, 0x1118, 0x783b, 0x0004, 0x0000, 0x0006,
++	0x1d04, 0x22e8, 0x080c, 0x72a5, 0x1f04, 0x22e8, 0x7850, 0x9085,
++	0x0400, 0x9084, 0xdfbf, 0x7852, 0x080c, 0x2340, 0x9085, 0x1000,
++	0x7852, 0x000e, 0x001e, 0x012e, 0x0005, 0x080c, 0x2346, 0x7850,
++	0x9084, 0xffcf, 0x7852, 0x0005, 0x0006, 0x0156, 0x00f6, 0x2079,
++	0x0100, 0x20a9, 0x000a, 0x7854, 0xd0ac, 0x1130, 0x7820, 0xd0e4,
++	0x1140, 0x1f04, 0x230e, 0x0028, 0x7854, 0xd08c, 0x1110, 0x1f04,
++	0x2314, 0x00fe, 0x015e, 0x000e, 0x0005, 0x7820, 0x0409, 0xd09c,
++	0x0005, 0x1d04, 0x2321, 0x080c, 0x72a5, 0x1f04, 0x2321, 0x0005,
++	0x0006, 0x2001, 0x12d6, 0x2004, 0x9086, 0x0000, 0x000e, 0x0005,
++	0x0006, 0x2001, 0x12d6, 0x2004, 0x9086, 0x0001, 0x000e, 0x0005,
++	0x0006, 0x2001, 0x12d6, 0x2004, 0x9086, 0x0002, 0x000e, 0x0005,
++	0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, 0x0016,
++	0x2009, 0x0140, 0x2104, 0x080c, 0x6300, 0x1110, 0xc0bd, 0x0008,
++	0xc0bc, 0x200a, 0x001e, 0x000e, 0x0005, 0x0006, 0x2001, 0x12e0,
++	0x2102, 0x000e, 0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc, 0x0140,
++	0x2009, 0x0170, 0x2104, 0x200b, 0x0080, 0xa001, 0xa001, 0x200a,
++	0x0005, 0x0036, 0x0046, 0x2001, 0x0141, 0x200c, 0x918c, 0xff00,
++	0x9186, 0x2000, 0x0118, 0x9186, 0x0100, 0x1560, 0x2009, 0x017f,
++	0x200b, 0x00a2, 0x2009, 0x0169, 0x2019, 0x0160, 0x2324, 0x2011,
++	0x0003, 0x2104, 0x9084, 0x0007, 0x9086, 0x0003, 0x11b8, 0x2304,
++	0x9402, 0x02a0, 0x1d98, 0x8211, 0x1da0, 0x84ff, 0x0170, 0x2001,
++	0x0141, 0x200c, 0x918c, 0xff00, 0x9186, 0x0100, 0x0130, 0x2009,
++	0x110c, 0x2104, 0xc0dd, 0x200a, 0x0008, 0x0419, 0x2001, 0x017f,
++	0x2003, 0x0000, 0x004e, 0x003e, 0x0005, 0x2001, 0x110c, 0x2004,
++	0xd0dc, 0x01b0, 0x2001, 0x0160, 0x2004, 0x9005, 0x0140, 0x2001,
++	0x0141, 0x2004, 0x9084, 0xff00, 0x9086, 0x0100, 0x1148, 0x0126,
++	0x2091, 0x8000, 0x0016, 0x0026, 0x0021, 0x002e, 0x001e, 0x012e,
++	0x0005, 0x00c6, 0x2061, 0x0100, 0x6014, 0x0006, 0x2001, 0x0161,
++	0x2003, 0x0000, 0x6017, 0x0018, 0xa001, 0xa001, 0x602f, 0x0008,
++	0x6104, 0x918e, 0x0010, 0x6106, 0x918e, 0x0010, 0x6106, 0x6017,
++	0x0040, 0x2001, 0x1000, 0x0429, 0x9006, 0x0419, 0x001e, 0x9184,
++	0x0003, 0x01c0, 0x0036, 0x2019, 0x0141, 0x2304, 0x9084, 0xff00,
++	0x9086, 0x0800, 0x1dd0, 0x919c, 0xffe4, 0x9184, 0x0001, 0x0118,
++	0x9385, 0x0009, 0x6016, 0x9184, 0x0002, 0x0118, 0x9385, 0x0012,
++	0x6016, 0x003e, 0x2001, 0x110c, 0x200c, 0xc1dc, 0x2102, 0x00ce,
++	0x0005, 0x0016, 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001,
++	0x9215, 0x220a, 0x002e, 0x001e, 0x0005, 0x2678, 0x2678, 0x249d,
++	0x249d, 0x24a9, 0x24a9, 0x24b5, 0x24b5, 0x24c3, 0x24c3, 0x24cf,
++	0x24cf, 0x24dd, 0x24dd, 0x24eb, 0x24eb, 0x24fd, 0x24fd, 0x2509,
++	0x2509, 0x2517, 0x2517, 0x2535, 0x2535, 0x2555, 0x2555, 0x2525,
++	0x2525, 0x2545, 0x2545, 0x2563, 0x2563, 0x24fb, 0x24fb, 0x24fb,
++	0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb,
++	0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb,
++	0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb,
++	0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x2575, 0x2575, 0x2581,
++	0x2581, 0x258f, 0x258f, 0x259d, 0x259d, 0x25ad, 0x25ad, 0x25bb,
++	0x25bb, 0x25cb, 0x25cb, 0x25db, 0x25db, 0x25ed, 0x25ed, 0x25fb,
++	0x25fb, 0x260b, 0x260b, 0x262d, 0x262d, 0x264f, 0x264f, 0x261b,
++	0x261b, 0x263e, 0x263e, 0x265e, 0x265e, 0x24fb, 0x24fb, 0x24fb,
++	0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb,
++	0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb,
++	0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb,
++	0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb,
++	0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb,
++	0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x0106, 0x0006, 0x0126,
++	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1c12, 0x0804,
++	0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++	0x0156, 0x080c, 0x19c6, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x19c6, 0x080c,
++	0x1c12, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++	0x0136, 0x0146, 0x0156, 0x080c, 0x19fe, 0x0804, 0x2670, 0x0106,
++	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
++	0x1c12, 0x080c, 0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x19c6, 0x080c,
++	0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++	0x0136, 0x0146, 0x0156, 0x080c, 0x19c6, 0x080c, 0x1c12, 0x080c,
++	0x19fe, 0x0804, 0x2670, 0xa001, 0x0cf0, 0x0106, 0x0006, 0x0126,
++	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1125, 0x0804,
++	0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++	0x0156, 0x080c, 0x1c12, 0x080c, 0x1125, 0x0804, 0x2670, 0x0106,
++	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
++	0x19c6, 0x080c, 0x1125, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1c12, 0x080c,
++	0x1125, 0x080c, 0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x19c6, 0x080c,
++	0x1c12, 0x080c, 0x1125, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x19c6, 0x080c,
++	0x1125, 0x080c, 0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1125, 0x080c,
++	0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++	0x0136, 0x0146, 0x0156, 0x080c, 0x19c6, 0x080c, 0x1c12, 0x080c,
++	0x1125, 0x080c, 0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x0804,
++	0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++	0x0156, 0x080c, 0x2048, 0x080c, 0x1c12, 0x0804, 0x2670, 0x0106,
++	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
++	0x2048, 0x080c, 0x19c6, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c,
++	0x19c6, 0x080c, 0x1c12, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c,
++	0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++	0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c, 0x1c12, 0x080c,
++	0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++	0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c, 0x19c6, 0x080c,
++	0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++	0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c, 0x19c6, 0x080c,
++	0x1c12, 0x080c, 0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c,
++	0x1125, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++	0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c, 0x1c12, 0x080c,
++	0x1125, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++	0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c, 0x19c6, 0x080c,
++	0x1125, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++	0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c, 0x1c12, 0x080c,
++	0x1125, 0x080c, 0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c,
++	0x19c6, 0x080c, 0x1c12, 0x080c, 0x1125, 0x0490, 0x0106, 0x0006,
++	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2048,
++	0x080c, 0x19c6, 0x080c, 0x1125, 0x080c, 0x19fe, 0x0408, 0x0106,
++	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
++	0x2048, 0x080c, 0x1125, 0x080c, 0x19fe, 0x0090, 0x0106, 0x0006,
++	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2048,
++	0x080c, 0x19c6, 0x080c, 0x1c12, 0x080c, 0x1125, 0x080c, 0x19fe,
++	0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, 0x000e, 0x010e,
++	0x000d, 0x00c6, 0x0026, 0x0046, 0x9026, 0x080c, 0x588e, 0x1904,
++	0x275a, 0x72d8, 0x2001, 0x12a7, 0x2004, 0x9005, 0x1110, 0xd29c,
++	0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, 0x275a, 0x080c, 0x275e,
++	0x0804, 0x275a, 0xd2cc, 0x1904, 0x275a, 0x080c, 0x62e4, 0x1120,
++	0x70a7, 0xffff, 0x0804, 0x275a, 0xd294, 0x0120, 0x70a7, 0xffff,
++	0x0804, 0x275a, 0x080c, 0x2982, 0x0120, 0x70a7, 0xffff, 0x0804,
++	0x275a, 0x2001, 0x1116, 0x203c, 0x728c, 0xd284, 0x0904, 0x26fd,
++	0xd28c, 0x1904, 0x26fd, 0x0036, 0x73a4, 0x938e, 0xffff, 0x1110,
++	0x2019, 0x0001, 0x8314, 0x92e0, 0x1580, 0x2c04, 0x938c, 0x0001,
++	0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, 0x970e,
++	0x0558, 0x908e, 0x0000, 0x0540, 0x908e, 0x00ff, 0x1150, 0x7230,
++	0xd284, 0x1530, 0x728c, 0xc28d, 0x728e, 0x70a7, 0xffff, 0x003e,
++	0x0420, 0x900e, 0x080c, 0x1f63, 0x080c, 0x55b3, 0x11b8, 0x6004,
++	0x9084, 0x00ff, 0x9086, 0x0006, 0x1150, 0x7030, 0xd08c, 0x0118,
++	0x6000, 0xd0bc, 0x0120, 0x080c, 0x2771, 0x0140, 0x0028, 0x080c,
++	0x28a1, 0x080c, 0x279e, 0x0110, 0x8318, 0x0820, 0x73a6, 0x0010,
++	0x70a7, 0xffff, 0x003e, 0x0804, 0x275a, 0x9780, 0x298c, 0x203d,
++	0x97bc, 0xff00, 0x873f, 0x2041, 0x007e, 0x70a4, 0x9096, 0xffff,
++	0x1118, 0x900e, 0x28a8, 0x0050, 0x9812, 0x0220, 0x2008, 0x9802,
++	0x20a8, 0x0020, 0x70a7, 0xffff, 0x0804, 0x275a, 0x2700, 0x0156,
++	0x0016, 0x9106, 0x05a0, 0xc484, 0x080c, 0x5608, 0x0120, 0x080c,
++	0x55b3, 0x15a8, 0x0008, 0xc485, 0x6004, 0x9084, 0x00ff, 0x9086,
++	0x0006, 0x1130, 0x7030, 0xd08c, 0x01e8, 0x6000, 0xd0bc, 0x11d0,
++	0x728c, 0xd28c, 0x0188, 0x6004, 0x9084, 0x00ff, 0x9082, 0x0006,
++	0x02b0, 0xd484, 0x1118, 0x080c, 0x55d0, 0x0028, 0x080c, 0x292a,
++	0x0170, 0x080c, 0x2955, 0x0058, 0x080c, 0x28a1, 0x080c, 0x279e,
++	0x0170, 0x0028, 0x080c, 0x292a, 0x0110, 0x0419, 0x0140, 0x001e,
++	0x8108, 0x015e, 0x1f04, 0x2716, 0x70a7, 0xffff, 0x0018, 0x001e,
++	0x015e, 0x71a6, 0x004e, 0x002e, 0x00ce, 0x0005, 0x00c6, 0x0016,
++	0x70a7, 0x0001, 0x2009, 0x007e, 0x080c, 0x55b3, 0x1138, 0x080c,
++	0x28a1, 0x04a1, 0x0118, 0x70d8, 0xc0bd, 0x70da, 0x001e, 0x00ce,
++	0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x2001, 0x1157,
++	0x2004, 0x9084, 0x00ff, 0x6842, 0x080c, 0x8f26, 0x01d0, 0x2d00,
++	0x6012, 0x080c, 0xad70, 0x6023, 0x0001, 0x9006, 0x080c, 0x5556,
++	0x2001, 0x0000, 0x080c, 0x5568, 0x0126, 0x2091, 0x8000, 0x70a0,
++	0x8000, 0x70a2, 0x012e, 0x2009, 0x0004, 0x080c, 0x8f53, 0x9085,
++	0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x0016, 0x0076,
++	0x00d6, 0x00c6, 0x2c68, 0x2001, 0x1157, 0x2004, 0x9084, 0x00ff,
++	0x6842, 0x080c, 0x8f26, 0x0548, 0x2d00, 0x6012, 0x6800, 0xc0c4,
++	0x6802, 0x68a0, 0x9086, 0x007e, 0x0140, 0x6804, 0x9084, 0x00ff,
++	0x9086, 0x0006, 0x1110, 0x080c, 0x2862, 0x080c, 0xad70, 0x6023,
++	0x0001, 0x9006, 0x080c, 0x5556, 0x2001, 0x0002, 0x080c, 0x5568,
++	0x0126, 0x2091, 0x8000, 0x70a0, 0x8000, 0x70a2, 0x012e, 0x2009,
++	0x0002, 0x080c, 0x8f53, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e,
++	0x001e, 0x0005, 0x00c6, 0x0026, 0x2009, 0x0080, 0x080c, 0x55b3,
++	0x1120, 0x0031, 0x0110, 0x70df, 0xffff, 0x002e, 0x00ce, 0x0005,
++	0x0016, 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x080c, 0x8e83, 0x01e0,
++	0x2d00, 0x6012, 0x080c, 0xad70, 0x6023, 0x0001, 0x9006, 0x080c,
++	0x5556, 0x2001, 0x0002, 0x080c, 0x5568, 0x0126, 0x2091, 0x8000,
++	0x080c, 0x2862, 0x70e0, 0x8000, 0x70e2, 0x012e, 0x2009, 0x0002,
++	0x080c, 0x8f53, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e,
++	0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2009, 0x007f,
++	0x080c, 0x55b3, 0x1190, 0x2c68, 0x080c, 0x8e83, 0x0170, 0x2d00,
++	0x6012, 0x6316, 0x6023, 0x0001, 0x620a, 0x080c, 0xad70, 0x2009,
++	0x0022, 0x080c, 0x8f53, 0x9085, 0x0001, 0x012e, 0x00de, 0x00ce,
++	0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x21f0, 0x080c,
++	0x76fb, 0x080c, 0x768d, 0x080c, 0x9ce7, 0x3e08, 0x2130, 0x81ff,
++	0x0120, 0x20a9, 0x007e, 0x900e, 0x0018, 0x20a9, 0x007f, 0x900e,
++	0x0016, 0x080c, 0x5608, 0x1140, 0x9686, 0x0002, 0x1118, 0x6000,
++	0xd0bc, 0x1110, 0x080c, 0x5100, 0x001e, 0x8108, 0x1f04, 0x2848,
++	0x86ff, 0x1110, 0x080c, 0x0a79, 0x002e, 0x003e, 0x006e, 0x00ce,
++	0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x6210,
++	0x2270, 0x72a0, 0x0026, 0x2019, 0x0029, 0x080c, 0x76f0, 0x0076,
++	0x2039, 0x0000, 0x080c, 0x75ee, 0x2c08, 0x080c, 0xbec2, 0x007e,
++	0x001e, 0x2e60, 0x6210, 0x6314, 0x080c, 0x5100, 0x6212, 0x6316,
++	0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006,
++	0x6010, 0x9080, 0x0028, 0x2004, 0x9086, 0x0080, 0x0150, 0x2071,
++	0x1100, 0x70a0, 0x9005, 0x0110, 0x8001, 0x70a2, 0x000e, 0x00ee,
++	0x0005, 0x2071, 0x1100, 0x70e0, 0x9005, 0x0dc0, 0x8001, 0x70e2,
++	0x0ca8, 0x6000, 0xc08c, 0x6002, 0x0005, 0x00f6, 0x00e6, 0x00c6,
++	0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x81ff, 0x1118, 0x20a9,
++	0x0001, 0x0090, 0x2001, 0x1153, 0x2004, 0xd0c4, 0x0150, 0xd0a4,
++	0x0140, 0x9006, 0x0046, 0x2020, 0x2009, 0x002d, 0x080c, 0xc12f,
++	0x004e, 0x20a9, 0x00ff, 0x9016, 0x0026, 0x928e, 0x007e, 0x0904,
++	0x2909, 0x928e, 0x007f, 0x05e8, 0x928e, 0x0080, 0x05d0, 0x9288,
++	0x1000, 0x210c, 0x81ff, 0x05a8, 0x8fff, 0x1148, 0x2001, 0x12c8,
++	0x0006, 0x2003, 0x0001, 0x04c9, 0x000e, 0x2003, 0x0000, 0x00c6,
++	0x2160, 0x2001, 0x0001, 0x080c, 0x5898, 0x00ce, 0x2019, 0x0029,
++	0x080c, 0x76f0, 0x0076, 0x2039, 0x0000, 0x080c, 0x75ee, 0x00c6,
++	0x0026, 0x2160, 0x6204, 0x9294, 0x00ff, 0x9286, 0x0006, 0x1118,
++	0x6007, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007, 0x9215, 0x6206,
++	0x002e, 0x00ce, 0x0016, 0x2c08, 0x080c, 0xbec2, 0x001e, 0x007e,
++	0x2160, 0x002e, 0x8210, 0x1f04, 0x28c4, 0x015e, 0x001e, 0x002e,
++	0x003e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026, 0x0016,
++	0x2001, 0x1153, 0x2004, 0xd0c4, 0x0148, 0xd0a4, 0x0138, 0x9006,
++	0x2220, 0x8427, 0x2009, 0x0029, 0x080c, 0xc12f, 0x001e, 0x002e,
++	0x004e, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x728c, 0x82ff,
++	0x01e8, 0x080c, 0x58c6, 0x11d0, 0x2100, 0x080c, 0x1f77, 0x81ff,
++	0x01b8, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1580, 0x2c04, 0xd384,
++	0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, 0x9116,
++	0x0138, 0x9096, 0x00ff, 0x0110, 0x8318, 0x0c68, 0x9085, 0x0001,
++	0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x0016, 0x00c6, 0x0126,
++	0x2091, 0x8000, 0x0016, 0x0026, 0x0036, 0x2110, 0x0026, 0x2019,
++	0x0029, 0x080c, 0x8ac9, 0x002e, 0x080c, 0xc3d4, 0x003e, 0x002e,
++	0x001e, 0x9180, 0x1000, 0x2004, 0x9065, 0x0158, 0x0016, 0x00c6,
++	0x2061, 0x1389, 0x001e, 0x6112, 0x080c, 0x2862, 0x001e, 0x080c,
++	0x55d0, 0x012e, 0x00ce, 0x001e, 0x0005, 0x2001, 0x1136, 0x2004,
++	0xd0cc, 0x0005, 0x2001, 0x1174, 0x2004, 0xd0bc, 0x0005, 0x2011,
++	0x1153, 0x2214, 0xd2ec, 0x0005, 0x7eef, 0x7de8, 0x7ce4, 0x80e2,
++	0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9, 0x80d6, 0x80d5, 0x80d4,
++	0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd, 0x80cc, 0x80cb, 0x80ca,
++	0x80c9, 0x80c7, 0x80c6, 0x77c5, 0x76c3, 0x80bc, 0x80ba, 0x75b9,
++	0x80b6, 0x74b5, 0x73b4, 0x72b3, 0x80b2, 0x80b1, 0x80ae, 0x71ad,
++	0x80ac, 0x70ab, 0x6faa, 0x6ea9, 0x80a7, 0x6da6, 0x6ca5, 0x6ba3,
++	0x6a9f, 0x699e, 0x689d, 0x809b, 0x8098, 0x6797, 0x6690, 0x658f,
++	0x6488, 0x6384, 0x6282, 0x8081, 0x8080, 0x617c, 0x607a, 0x8079,
++	0x5f76, 0x8075, 0x8074, 0x8073, 0x8072, 0x8071, 0x806e, 0x5e6d,
++	0x806c, 0x5d6b, 0x5c6a, 0x5b69, 0x8067, 0x5a66, 0x5965, 0x5863,
++	0x575c, 0x565a, 0x5559, 0x8056, 0x8055, 0x5454, 0x5353, 0x5252,
++	0x5151, 0x504e, 0x4f4d, 0x804c, 0x804b, 0x4e4a, 0x4d49, 0x8047,
++	0x4c46, 0x8045, 0x8043, 0x803c, 0x803a, 0x8039, 0x8036, 0x4b35,
++	0x8034, 0x4a33, 0x4932, 0x4831, 0x802e, 0x472d, 0x462c, 0x452b,
++	0x442a, 0x4329, 0x4227, 0x8026, 0x8025, 0x4123, 0x401f, 0x3f1e,
++	0x3e1d, 0x3d1b, 0x3c18, 0x8017, 0x8010, 0x3b0f, 0x3a08, 0x8004,
++	0x3902, 0x8001, 0x8000, 0x8000, 0x3800, 0x3700, 0x3600, 0x8000,
++	0x3500, 0x8000, 0x8000, 0x8000, 0x3400, 0x8000, 0x8000, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x3300, 0x3200, 0x8000, 0x8000, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x3100, 0x3000, 0x8000, 0x8000, 0x2f00,
++	0x8000, 0x2e00, 0x2d00, 0x2c00, 0x8000, 0x8000, 0x8000, 0x2b00,
++	0x8000, 0x2a00, 0x2900, 0x2800, 0x8000, 0x2700, 0x2600, 0x2500,
++	0x2400, 0x2300, 0x2200, 0x8000, 0x8000, 0x2100, 0x2000, 0x1f00,
++	0x1e00, 0x1d00, 0x1c00, 0x8000, 0x8000, 0x1b00, 0x1a00, 0x8000,
++	0x1900, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x1800,
++	0x8000, 0x1700, 0x1600, 0x1500, 0x8000, 0x1400, 0x1300, 0x1200,
++	0x1100, 0x1000, 0x0f00, 0x8000, 0x8000, 0x0e00, 0x0d00, 0x0c00,
++	0x0b00, 0x0a00, 0x0900, 0x8000, 0x8000, 0x0800, 0x0700, 0x8000,
++	0x0600, 0x8000, 0x8000, 0x8000, 0x0500, 0x0400, 0x0300, 0x8000,
++	0x0200, 0x8000, 0x8000, 0x8000, 0x0100, 0x8000, 0x8000, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x2071, 0x1193, 0x7003, 0x0002,
++	0x9006, 0x7012, 0x7016, 0x7042, 0x7046, 0x703a, 0x703e, 0x7033,
++	0x11aa, 0x7037, 0x11aa, 0x7007, 0x0001, 0x2061, 0x11ea, 0x6003,
++	0x0002, 0x0005, 0x2071, 0x1193, 0x7004, 0x0002, 0x2aaa, 0x2aab,
++	0x2ab2, 0x2ac3, 0x0005, 0x1004, 0x2ab1, 0x0e04, 0x2ab1, 0x2b78,
++	0x0430, 0x0005, 0x2b78, 0x2061, 0x11ea, 0x6008, 0x908e, 0x0100,
++	0x0128, 0x9086, 0x0200, 0x0904, 0x2b92, 0x0005, 0x7014, 0x2068,
++	0x2a60, 0x7018, 0x0807, 0x7010, 0x2068, 0x6864, 0x9094, 0x00ff,
++	0x9296, 0x0029, 0x1120, 0x6a78, 0xd2fc, 0x0128, 0x0005, 0x9086,
++	0x0103, 0x0108, 0x0005, 0x2a60, 0x2b78, 0x7018, 0x0807, 0x2a60,
++	0x7880, 0x908a, 0x0040, 0x1210, 0x61cc, 0x0042, 0x2100, 0x908a,
++	0x003f, 0x1a04, 0x2b8f, 0x61cc, 0x0804, 0x2b26, 0x2b68, 0x2b9e,
++	0x2ba8, 0x2bac, 0x2bb6, 0x2bbc, 0x2bc0, 0x2bd0, 0x2bd3, 0x2bdd,
++	0x2be2, 0x2be7, 0x2bf2, 0x2bfd, 0x2c0c, 0x2c1b, 0x2c29, 0x2c40,
++	0x2c5b, 0x2cf4, 0x2cf9, 0x2d37, 0x2de5, 0x2df6, 0x2e15, 0x2b8f,
++	0x2b8f, 0x2b8f, 0x2e4d, 0x2e6b, 0x2e74, 0x2ea3, 0x2ea9, 0x2b8f,
++	0x2ed2, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2edd, 0x2ee6,
++	0x2eee, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f,
++	0x2ef0, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2f0d, 0x2f64,
++	0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x0002, 0x2f8e,
++	0x2fe1, 0x303b, 0x3053, 0x3083, 0x3301, 0x2b8f, 0x44b5, 0x2b8f,
++	0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2bdd,
++	0x2be2, 0x376a, 0x2b8f, 0x3781, 0x454f, 0x45a5, 0x464b, 0x2b8f,
++	0x46b0, 0x46e0, 0x4705, 0x4813, 0x4736, 0x478d, 0x2b8f, 0x3785,
++	0x394a, 0x3960, 0x3980, 0x39e5, 0x3a4e, 0x3a59, 0x3ac1, 0x3ad0,
++	0x3adf, 0x3ae2, 0x3b05, 0x3b77, 0x3bf0, 0x3bfd, 0x3cfe, 0x3e22,
++	0x3e4b, 0x4032, 0x4054, 0x4060, 0x40d5, 0x419b, 0x2b8f, 0x2b8f,
++	0x2b8f, 0x2b8f, 0x4203, 0x421e, 0x43b9, 0x4473, 0x7144, 0x0000,
++	0x2021, 0x4000, 0x080c, 0x3eff, 0x0126, 0x2091, 0x8000, 0x0e04,
++	0x2b72, 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118,
++	0x7833, 0x0011, 0x0010, 0x7833, 0x0010, 0x7c82, 0x7986, 0x7a8a,
++	0x7b8e, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
++	0x0fcd, 0x7007, 0x0001, 0x2091, 0x5000, 0x012e, 0x0005, 0x2021,
++	0x4001, 0x08c0, 0x2021, 0x4002, 0x08a8, 0x2021, 0x4003, 0x0890,
++	0x2021, 0x4005, 0x0878, 0x2021, 0x4006, 0x0860, 0x2039, 0x0001,
++	0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, 0x3f0c,
++	0x7883, 0x0004, 0x7884, 0x0807, 0x2039, 0x0001, 0x902e, 0x2520,
++	0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, 0x3f0f, 0x7984, 0x7888,
++	0x2114, 0x200a, 0x0804, 0x2b68, 0x7984, 0x2114, 0x0804, 0x2b68,
++	0x20e1, 0x0000, 0x2099, 0x0021, 0x20e9, 0x0000, 0x20a1, 0x0021,
++	0x20a9, 0x001f, 0x4003, 0x7984, 0x7a88, 0x7b8c, 0x0804, 0x2b68,
++	0x7884, 0x2060, 0x04d8, 0x2009, 0x0003, 0x2011, 0x0001, 0x2019,
++	0x0014, 0x789b, 0x0017, 0x0804, 0x2b68, 0x2039, 0x0001, 0x7d98,
++	0x7c9c, 0x0800, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0848, 0x79a0,
++	0x9182, 0x0040, 0x0210, 0x0804, 0x2b9b, 0x2138, 0x7d98, 0x7c9c,
++	0x0804, 0x2ba2, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x2b9b,
++	0x2138, 0x7d98, 0x7c9c, 0x0804, 0x2bb0, 0x79a0, 0x9182, 0x0040,
++	0x0210, 0x0804, 0x2b9b, 0x21e8, 0x7984, 0x7888, 0x20a9, 0x0001,
++	0x21a0, 0x4004, 0x0804, 0x2b68, 0x2061, 0x0800, 0xe10c, 0x9006,
++	0x2c15, 0x9200, 0x8c60, 0x8109, 0x1dd8, 0x2010, 0x9005, 0x0904,
++	0x2b68, 0x0804, 0x2b95, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804,
++	0x2b9b, 0x21e0, 0x20a9, 0x0001, 0x7984, 0x2198, 0x4012, 0x0804,
++	0x2b68, 0x2069, 0x1152, 0x7884, 0x7990, 0x911a, 0x1a04, 0x2b9b,
++	0x8019, 0x0904, 0x2b9b, 0x684a, 0x6942, 0x788c, 0x6852, 0x7888,
++	0x6856, 0x9006, 0x685a, 0x685e, 0x080c, 0x65bd, 0x0804, 0x2b68,
++	0x2069, 0x1152, 0x7884, 0x7994, 0x911a, 0x1a04, 0x2b9b, 0x8019,
++	0x0904, 0x2b9b, 0x684e, 0x6946, 0x788c, 0x6862, 0x7888, 0x6866,
++	0x9006, 0x686a, 0x686e, 0x0126, 0x2091, 0x8000, 0x080c, 0x5946,
++	0x012e, 0x0804, 0x2b68, 0x902e, 0x2520, 0x81ff, 0x1904, 0x2b98,
++	0x7984, 0x7b88, 0x7a8c, 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1,
++	0x119a, 0x4101, 0x080c, 0x3eb9, 0x0904, 0x2b98, 0x2009, 0x0020,
++	0x2039, 0x0001, 0x080c, 0x3f0c, 0x701b, 0x2c77, 0x0005, 0x6864,
++	0x2008, 0x9084, 0x00ff, 0x9096, 0x0011, 0x0150, 0x9096, 0x0019,
++	0x0138, 0x9096, 0x0015, 0x0120, 0x9096, 0x0029, 0x1904, 0x2b98,
++	0x810f, 0x918c, 0x00ff, 0x0904, 0x2b98, 0x710e, 0x700c, 0x8001,
++	0x0538, 0x700e, 0x080c, 0x3eb9, 0x0904, 0x2b98, 0x2009, 0x0020,
++	0x2061, 0x11ea, 0x6228, 0x632c, 0x6430, 0x6534, 0x9290, 0x0040,
++	0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0x2039, 0x0001,
++	0x080c, 0x3f0c, 0x701b, 0x2cad, 0x0005, 0x6864, 0x9084, 0x00ff,
++	0x9096, 0x0002, 0x0120, 0x9096, 0x000a, 0x1904, 0x2b98, 0x08b0,
++	0x7010, 0x2068, 0x6868, 0xc0fd, 0x686a, 0x6864, 0x9084, 0x00ff,
++	0x9096, 0x0029, 0x1160, 0xc2fd, 0x6a7a, 0x080c, 0x51e5, 0x0150,
++	0x0126, 0x2091, 0x8000, 0x687a, 0x6982, 0x012e, 0x0050, 0x080c,
++	0x54d0, 0x1128, 0x7007, 0x0003, 0x701b, 0x2cd9, 0x0005, 0x080c,
++	0x5d95, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x20e1, 0x0001,
++	0x2099, 0x119a, 0x400a, 0x2100, 0x9210, 0x9399, 0x0000, 0x94a1,
++	0x0000, 0x95a9, 0x0000, 0x9d80, 0x0019, 0x2009, 0x0020, 0x012e,
++	0x2039, 0x0001, 0x0804, 0x3f0f, 0x61b4, 0x7884, 0x60b6, 0x0804,
++	0x2b68, 0x2091, 0x8000, 0x7837, 0x4000, 0x7833, 0x0010, 0x7883,
++	0x4000, 0x7887, 0x4953, 0x788b, 0x5020, 0x788f, 0x2020, 0x2009,
++	0x017f, 0x2104, 0x7892, 0x3f00, 0x7896, 0x2061, 0x0100, 0x6200,
++	0x2061, 0x0200, 0x603c, 0x8007, 0x9205, 0x789a, 0x2009, 0x04fd,
++	0x2104, 0x789e, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, 0x0089,
++	0x2004, 0xd084, 0x0180, 0x2001, 0x1336, 0x2004, 0x9005, 0x0128,
++	0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003,
++	0x0002, 0x2003, 0x1001, 0x2071, 0x0080, 0x0804, 0x0427, 0x81ff,
++	0x1904, 0x2b98, 0x7984, 0x810f, 0x918c, 0x00ff, 0x080c, 0x5608,
++	0x1904, 0x2b9b, 0x7e98, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0210,
++	0x0804, 0x2b9b, 0x7c88, 0x7d8c, 0x080c, 0x5758, 0x080c, 0x5728,
++	0x0000, 0x1518, 0x2061, 0x15c0, 0x0126, 0x2091, 0x8000, 0x6000,
++	0x9086, 0x0000, 0x0148, 0x6014, 0x906d, 0x0130, 0x686c, 0x9406,
++	0x1118, 0x6870, 0x9506, 0x0150, 0x012e, 0x9ce0, 0x0018, 0x2001,
++	0x1118, 0x2004, 0x9c02, 0x1a04, 0x2b98, 0x0c30, 0x080c, 0xa5f3,
++	0x012e, 0x0904, 0x2b98, 0x0804, 0x2b68, 0x900e, 0x2001, 0x0005,
++	0x080c, 0x5d95, 0x0126, 0x2091, 0x8000, 0x080c, 0xac07, 0x080c,
++	0x5b76, 0x012e, 0x0804, 0x2b68, 0x00f6, 0x2d78, 0x7998, 0x810f,
++	0x918c, 0x00ff, 0x080c, 0x5608, 0x1904, 0x2dd2, 0x7ea4, 0x9684,
++	0x3fff, 0x9082, 0x4000, 0x0208, 0x04e8, 0x7c9c, 0x7da0, 0x080c,
++	0x5758, 0x080c, 0x5728, 0x1520, 0x2061, 0x15c0, 0x0126, 0x2091,
++	0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x906d, 0x0130,
++	0x686c, 0x9406, 0x1118, 0x6870, 0x9506, 0x0158, 0x012e, 0x9ce0,
++	0x0018, 0x2001, 0x1118, 0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0,
++	0x0c28, 0x080c, 0xa5f3, 0x012e, 0x2009, 0x0003, 0x0178, 0x00e0,
++	0x900e, 0x2001, 0x0005, 0x080c, 0x5d95, 0x0126, 0x2091, 0x8000,
++	0x080c, 0xac07, 0x080c, 0x5b76, 0x012e, 0x0070, 0x7897, 0x4005,
++	0x799a, 0x0010, 0x7897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001,
++	0x0030, 0x2f68, 0x00fe, 0x0005, 0x7897, 0x4000, 0x9006, 0x918d,
++	0x0001, 0x2008, 0x2f68, 0x00fe, 0x0005, 0x81ff, 0x1904, 0x2b98,
++	0x080c, 0x3ece, 0x0904, 0x2b9b, 0x080c, 0x56ca, 0x0904, 0x2b98,
++	0x080c, 0x575e, 0x0904, 0x2b98, 0x0804, 0x2b68, 0x81ff, 0x1904,
++	0x2b98, 0x080c, 0x3ef0, 0x0904, 0x2b9b, 0x080c, 0x57a6, 0x0904,
++	0x2b98, 0x2019, 0x0005, 0x7984, 0x080c, 0x5779, 0x0904, 0x2b98,
++	0x7888, 0x908a, 0x1000, 0x1a04, 0x2b9b, 0x8003, 0x800b, 0x810b,
++	0x9108, 0x080c, 0x7206, 0x0804, 0x2b68, 0x0126, 0x2091, 0x8000,
++	0x81ff, 0x0118, 0x2009, 0x0001, 0x0450, 0x2029, 0x00ff, 0x6454,
++	0x2400, 0x9506, 0x01f8, 0x2508, 0x080c, 0x5608, 0x11d8, 0x080c,
++	0x57a6, 0x1128, 0x2009, 0x0002, 0x62bc, 0x2518, 0x00c0, 0x2019,
++	0x0004, 0x900e, 0x080c, 0x5779, 0x1118, 0x2009, 0x0006, 0x0078,
++	0x7884, 0x908a, 0x1000, 0x1270, 0x8003, 0x800b, 0x810b, 0x9108,
++	0x080c, 0x7206, 0x8529, 0x1ae0, 0x012e, 0x0804, 0x2b68, 0x012e,
++	0x0804, 0x2b98, 0x012e, 0x0804, 0x2b9b, 0x080c, 0x3ece, 0x0904,
++	0x2b9b, 0x080c, 0x56ca, 0x0904, 0x2b98, 0x62a0, 0x2019, 0x0005,
++	0x00c6, 0x2061, 0x0000, 0x080c, 0x76f0, 0x0076, 0x2039, 0x0000,
++	0x080c, 0x75ee, 0x900e, 0x080c, 0xbec2, 0x007e, 0x00ce, 0x080c,
++	0x5758, 0x0804, 0x2b68, 0x080c, 0x3ece, 0x0904, 0x2b9b, 0x080c,
++	0x5758, 0x2208, 0x0804, 0x2b68, 0x0156, 0x00d6, 0x00e6, 0x2069,
++	0x1240, 0x6810, 0x6914, 0x910a, 0x1208, 0x900e, 0x6816, 0x9016,
++	0x901e, 0x20a9, 0x007e, 0x2069, 0x1000, 0x2d04, 0x9075, 0x0118,
++	0x704c, 0x0059, 0x9210, 0x8d68, 0x1f04, 0x2e85, 0x2300, 0x9218,
++	0x00ee, 0x00de, 0x015e, 0x0804, 0x2b68, 0x00f6, 0x0016, 0x907d,
++	0x0138, 0x9006, 0x8000, 0x2f0c, 0x81ff, 0x0110, 0x2178, 0x0cd0,
++	0x001e, 0x00fe, 0x0005, 0x2069, 0x1240, 0x6910, 0x62b8, 0x0804,
++	0x2b68, 0x81ff, 0x1904, 0x2b98, 0x6154, 0x9190, 0x298c, 0x2215,
++	0x9294, 0x00ff, 0x6374, 0x83ff, 0x0108, 0x6278, 0x67d8, 0xd79c,
++	0x0118, 0x2031, 0x0001, 0x0090, 0xd7ac, 0x0118, 0x2031, 0x0003,
++	0x0068, 0xd7a4, 0x0118, 0x2031, 0x0002, 0x0040, 0x080c, 0x62e4,
++	0x1118, 0x2031, 0x0004, 0x0010, 0x2031, 0x0000, 0x7e9a, 0x7f9e,
++	0x0804, 0x2b68, 0x6144, 0x6248, 0x2019, 0x12c0, 0x231c, 0x2001,
++	0x12c1, 0x2004, 0x789a, 0x0804, 0x2b68, 0x0126, 0x2091, 0x8000,
++	0x6134, 0x6238, 0x633c, 0x012e, 0x0804, 0x2b68, 0x080c, 0x3ef0,
++	0x0904, 0x2b9b, 0x6244, 0x6338, 0x0804, 0x2b68, 0x080c, 0x0d7e,
++	0x6144, 0x6248, 0x7884, 0x6046, 0x7b88, 0x634a, 0x2069, 0x1152,
++	0x831f, 0x9305, 0x6816, 0x788c, 0x2069, 0x12c0, 0x2d1c, 0x206a,
++	0x7e98, 0x9682, 0x0014, 0x1210, 0x2031, 0x07d0, 0x2069, 0x12c1,
++	0x2d04, 0x266a, 0x789a, 0x0804, 0x2b68, 0x0126, 0x2091, 0x8000,
++	0x7884, 0x6036, 0xd0c4, 0x01a8, 0x00d6, 0x78a8, 0x2009, 0x12d7,
++	0x200a, 0x78ac, 0x2011, 0x12d8, 0x2012, 0x2069, 0x0100, 0x6838,
++	0x9086, 0x0007, 0x1118, 0x2214, 0x6a5a, 0x0010, 0x210c, 0x695a,
++	0x00de, 0x7884, 0xd0b4, 0x0120, 0x3b00, 0x9084, 0xff3f, 0x20d8,
++	0x7888, 0x603a, 0x2011, 0x0114, 0x220c, 0x7888, 0xd08c, 0x0118,
++	0x918d, 0x0080, 0x0010, 0x918c, 0xff7f, 0x2112, 0x788c, 0x603e,
++	0x012e, 0x0804, 0x2b68, 0x00f6, 0x2079, 0x1100, 0x7a34, 0x6898,
++	0x9084, 0xfeff, 0x9215, 0x689c, 0x9084, 0xfeff, 0x8002, 0x9214,
++	0xd2b4, 0x0120, 0x3b00, 0x9084, 0xff3f, 0x20d8, 0x7834, 0xd0c4,
++	0x0108, 0xc2c5, 0x7a36, 0x6897, 0x4000, 0x900e, 0x9085, 0x0001,
++	0x2001, 0x0000, 0x00fe, 0x0005, 0x7898, 0x9005, 0x01a8, 0x7888,
++	0x9025, 0x0904, 0x2b9b, 0x788c, 0x902d, 0x0904, 0x2b9b, 0x900e,
++	0x080c, 0x5608, 0x1120, 0x6244, 0x6338, 0x6446, 0x653a, 0x9186,
++	0x00ff, 0x0190, 0x8108, 0x0ca0, 0x080c, 0x3ef0, 0x0904, 0x2b9b,
++	0x7888, 0x900d, 0x0904, 0x2b9b, 0x788c, 0x9005, 0x0904, 0x2b9b,
++	0x6244, 0x6146, 0x6338, 0x603a, 0x0804, 0x2b68, 0x2001, 0x1100,
++	0x2004, 0x9086, 0x0003, 0x1904, 0x2b98, 0x00c6, 0x2061, 0x0100,
++	0x7984, 0x810f, 0x918c, 0x00ff, 0x9196, 0x00ff, 0x1130, 0x2001,
++	0x1116, 0x2004, 0x9085, 0xff00, 0x0078, 0x9182, 0x007f, 0x1698,
++	0x9188, 0x298c, 0x210d, 0x918c, 0x00ff, 0x2001, 0x1116, 0x2004,
++	0x9116, 0x0548, 0x810f, 0x9105, 0x0126, 0x2091, 0x8000, 0x0006,
++	0x080c, 0x8e83, 0x000e, 0x01d8, 0x6012, 0x600b, 0xbc09, 0x6023,
++	0x0001, 0x080c, 0x3eb9, 0x01d0, 0x9006, 0x6866, 0x7007, 0x0003,
++	0x6832, 0x6868, 0xc0fd, 0x686a, 0x701b, 0x3034, 0x2d00, 0x6016,
++	0x2009, 0x0032, 0x080c, 0x8f53, 0x012e, 0x00ce, 0x0005, 0x012e,
++	0x00ce, 0x0804, 0x2b98, 0x00ce, 0x0804, 0x2b9b, 0x080c, 0x8ed9,
++	0x0cb0, 0x2001, 0x1100, 0x2004, 0x9086, 0x0003, 0x1904, 0x2b98,
++	0x00c6, 0x2061, 0x0100, 0x7984, 0x810f, 0x918c, 0x00ff, 0x9196,
++	0x00ff, 0x1130, 0x2001, 0x1116, 0x2004, 0x9085, 0xff00, 0x0078,
++	0x9182, 0x007f, 0x1698, 0x9188, 0x298c, 0x210d, 0x918c, 0x00ff,
++	0x2001, 0x1116, 0x2004, 0x9116, 0x0548, 0x810f, 0x9105, 0x0126,
++	0x2091, 0x8000, 0x0006, 0x080c, 0x8e83, 0x000e, 0x01d8, 0x6012,
++	0x600b, 0xbc05, 0x6023, 0x0001, 0x080c, 0x3eb9, 0x01d0, 0x9006,
++	0x6866, 0x7007, 0x0003, 0x6832, 0x6868, 0xc0fd, 0x686a, 0x701b,
++	0x3034, 0x2d00, 0x6016, 0x2009, 0x0032, 0x080c, 0x8f53, 0x012e,
++	0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x2b98, 0x00ce, 0x0804,
++	0x2b9b, 0x080c, 0x8ed9, 0x0cb0, 0x6830, 0x9086, 0x0100, 0x0904,
++	0x2b98, 0x0804, 0x2b68, 0x2061, 0x1354, 0x0126, 0x2091, 0x8000,
++	0x6000, 0xd084, 0x0168, 0x6104, 0x6208, 0x2a60, 0x634c, 0x606c,
++	0x789a, 0x60bc, 0x789e, 0x60b8, 0x78aa, 0x012e, 0x0804, 0x2b68,
++	0x900e, 0x2110, 0x0c90, 0x81ff, 0x1904, 0x2b98, 0x080c, 0x62e4,
++	0x0904, 0x2b98, 0x0126, 0x2091, 0x8000, 0x624c, 0x606c, 0x9202,
++	0x0248, 0x9085, 0x0001, 0x080c, 0x1fad, 0x080c, 0x49f2, 0x012e,
++	0x0804, 0x2b68, 0x012e, 0x0804, 0x2b9b, 0x0006, 0x0016, 0x00c6,
++	0x00e6, 0x2001, 0x12e1, 0x2070, 0x2061, 0x1152, 0x6008, 0x2072,
++	0x900e, 0x2011, 0x1400, 0x080c, 0x73f0, 0x7206, 0x00ee, 0x00ce,
++	0x001e, 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0128,
++	0x012e, 0x2021, 0x400b, 0x0804, 0x2b6a, 0x7884, 0xd0fc, 0x0148,
++	0x2001, 0x002a, 0x2004, 0x9082, 0x00e1, 0x02a8, 0x012e, 0x0804,
++	0x2b9b, 0x2001, 0x002a, 0x2004, 0x2069, 0x1152, 0x6908, 0x9102,
++	0x1218, 0x012e, 0x0804, 0x2b9b, 0x614c, 0x606c, 0x9106, 0x0118,
++	0x012e, 0x0804, 0x2b98, 0x60d8, 0xd0ac, 0x0dd0, 0x7884, 0xd0fc,
++	0x0904, 0x30fd, 0x00c6, 0x080c, 0x3eb9, 0x00ce, 0x0d88, 0x6867,
++	0x0000, 0x7884, 0x680a, 0x7898, 0x680e, 0x789c, 0x6812, 0x2001,
++	0x002e, 0x2004, 0x681a, 0x2001, 0x002f, 0x2004, 0x681e, 0x2001,
++	0x0030, 0x2004, 0x6822, 0x2001, 0x0031, 0x2004, 0x6826, 0x2001,
++	0x0034, 0x2004, 0x682a, 0x2001, 0x0035, 0x2004, 0x682e, 0x2001,
++	0x002a, 0x2004, 0x9080, 0x0003, 0x9084, 0x00fc, 0x8004, 0x6816,
++	0x080c, 0x3262, 0x0928, 0x7010, 0x2068, 0x6d2c, 0x6c28, 0x6b1c,
++	0x6a18, 0x6930, 0x6808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021,
++	0x0000, 0x9d80, 0x001b, 0x2039, 0x0001, 0x080c, 0x3f0c, 0x701b,
++	0x31c0, 0x701f, 0x0001, 0x012e, 0x0005, 0x0046, 0x0086, 0x0096,
++	0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x306d,
++	0x2001, 0x12d9, 0x2003, 0x0000, 0x2021, 0x000a, 0x2061, 0x0100,
++	0x6104, 0x0016, 0x60bb, 0x0000, 0x60bf, 0x32e1, 0x60bf, 0x0012,
++	0x080c, 0x32d2, 0x080c, 0x3290, 0x00f6, 0x00e6, 0x00c6, 0x2d60,
++	0x2071, 0x134a, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884,
++	0xd0b4, 0x0140, 0x2001, 0x0035, 0x2004, 0x780e, 0x2001, 0x0034,
++	0x2004, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x360c, 0x00ce,
++	0x00ee, 0x00fe, 0x080c, 0x3542, 0x080c, 0x3472, 0x05b8, 0x2001,
++	0x020b, 0x2004, 0x9084, 0x0140, 0x1db8, 0x080c, 0x3634, 0x00f6,
++	0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c, 0x0070, 0x1560, 0x2071,
++	0x0200, 0x7037, 0x0000, 0x7050, 0x9084, 0xff00, 0x9086, 0x3200,
++	0x1510, 0x7037, 0x0001, 0x7050, 0x9084, 0xff00, 0x9086, 0xe100,
++	0x11d0, 0x7037, 0x0000, 0x7054, 0x7037, 0x0000, 0x715c, 0x9106,
++	0x1190, 0x2001, 0x111e, 0x2004, 0x9106, 0x1168, 0x00c6, 0x2061,
++	0x0100, 0x6024, 0x9084, 0x1e00, 0x00ce, 0x0138, 0x080c, 0x347c,
++	0x080c, 0x328b, 0x0058, 0x080c, 0x328b, 0x080c, 0x35a4, 0x080c,
++	0x3538, 0x2001, 0x020b, 0x2004, 0xd0e4, 0x0dd8, 0x2001, 0x032a,
++	0x2003, 0x0004, 0x2061, 0x0100, 0x6027, 0x0002, 0x001e, 0x6106,
++	0x2011, 0x020d, 0x2013, 0x0020, 0x60bb, 0x0000, 0x60bf, 0x0108,
++	0x60bf, 0x0012, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102,
++	0x080c, 0x10cf, 0x2009, 0x0028, 0x080c, 0x1b67, 0x2001, 0x0227,
++	0x200c, 0x2102, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae,
++	0x009e, 0x008e, 0x004e, 0x2001, 0x12d9, 0x2004, 0x9005, 0x1118,
++	0x012e, 0x0804, 0x2b68, 0x012e, 0x2021, 0x400c, 0x0804, 0x2b6a,
++	0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x00d6, 0x0156,
++	0x7010, 0x2068, 0x701c, 0x20a8, 0x8000, 0x701e, 0x6804, 0x9005,
++	0x05d0, 0x2068, 0x1f04, 0x31ce, 0x2061, 0x11ea, 0x6228, 0x632c,
++	0x6430, 0x6534, 0x6930, 0x6808, 0xd0b4, 0x1120, 0x2029, 0x0000,
++	0x2021, 0x0000, 0x00d6, 0x7010, 0x2068, 0x6864, 0x00de, 0x9086,
++	0x0103, 0x0148, 0x9d80, 0x001b, 0x2039, 0x0001, 0x080c, 0x3f0c,
++	0x701b, 0x31c0, 0x0078, 0x9d80, 0x001b, 0x21a8, 0x20a0, 0x2098,
++	0x0006, 0x080c, 0x504f, 0x000e, 0x2039, 0x0001, 0x080c, 0x3f0f,
++	0x701b, 0x31c0, 0x015e, 0x00de, 0x007e, 0x005e, 0x004e, 0x003e,
++	0x002e, 0x001e, 0x0005, 0x7010, 0x2068, 0x6864, 0x9086, 0x0103,
++	0x1118, 0x701b, 0x3260, 0x0410, 0x7010, 0x2068, 0x6868, 0xc0fd,
++	0x686a, 0x2009, 0x007f, 0x080c, 0x55b3, 0x0110, 0x9006, 0x0010,
++	0x080c, 0xadbf, 0x015e, 0x00de, 0x007e, 0x005e, 0x004e, 0x003e,
++	0x002e, 0x001e, 0x0904, 0x2b98, 0x0016, 0x0026, 0x0036, 0x0046,
++	0x0056, 0x0076, 0x00d6, 0x0156, 0x701b, 0x3239, 0x7007, 0x0003,
++	0x0848, 0x0076, 0x6830, 0x9086, 0x0100, 0x2021, 0x400c, 0x0904,
++	0x2b6a, 0x6d10, 0x6c0c, 0x6b24, 0x6a20, 0x6930, 0x6808, 0xd0b4,
++	0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x9d80, 0x001b, 0x21a8,
++	0x20a0, 0x2098, 0x0006, 0x080c, 0x504f, 0x000e, 0x2039, 0x0001,
++	0x080c, 0x3f0f, 0x007e, 0x701b, 0x31c0, 0x701f, 0x0001, 0x0005,
++	0x0804, 0x2b68, 0x0156, 0x00c6, 0x6814, 0x908a, 0x001e, 0x0218,
++	0x6833, 0x001e, 0x0010, 0x6832, 0x0078, 0x81ff, 0x0168, 0x0016,
++	0x080c, 0x3eb9, 0x001e, 0x0130, 0x6800, 0x2060, 0x6008, 0x680a,
++	0x2100, 0x0c58, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, 0x015e,
++	0x0005, 0x0006, 0x00f6, 0x2079, 0x0000, 0x7880, 0x9086, 0x0044,
++	0x00fe, 0x000e, 0x0005, 0x2001, 0x12d9, 0x2003, 0x0001, 0x0005,
++	0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0x12e2, 0x2004,
++	0x601a, 0x2061, 0x0100, 0x2001, 0x12e1, 0x2004, 0x60ce, 0x6104,
++	0xc1ac, 0x6106, 0x080c, 0x3eb9, 0x6813, 0x0019, 0x2070, 0x6817,
++	0x0001, 0x2d00, 0x685a, 0x2001, 0x002e, 0x2004, 0x2072, 0x2001,
++	0x002f, 0x2004, 0x7006, 0x2061, 0x0090, 0x2079, 0x0100, 0x2001,
++	0x12e1, 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x1b67, 0x2001,
++	0x002a, 0x2004, 0x9084, 0xfff8, 0x700a, 0x601a, 0x700f, 0x0000,
++	0x601f, 0x0000, 0x78ca, 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee,
++	0x00fe, 0x0005, 0x00e6, 0x080c, 0x3eb9, 0x2d60, 0x6013, 0x0019,
++	0x2070, 0x6017, 0x0001, 0x2c00, 0x605a, 0x2001, 0x0030, 0x2004,
++	0x2072, 0x2001, 0x0031, 0x2004, 0x7006, 0x2001, 0x002a, 0x2004,
++	0x9084, 0xfff8, 0x700a, 0x700f, 0x0000, 0x2001, 0x032a, 0x2003,
++	0x0004, 0x2001, 0x0300, 0x2003, 0x0000, 0x2001, 0x020d, 0x2003,
++	0x0000, 0x2001, 0x0004, 0x200c, 0x918d, 0x0002, 0x2102, 0x00ee,
++	0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0148, 0x080c, 0x2338,
++	0x1130, 0x9006, 0x080c, 0x2290, 0x9006, 0x080c, 0x2273, 0x7884,
++	0x9084, 0x0007, 0x0002, 0x331e, 0x3327, 0x3330, 0x331b, 0x331b,
++	0x331b, 0x331b, 0x331b, 0x012e, 0x0804, 0x2b9b, 0x2009, 0x0114,
++	0x2104, 0x9085, 0x0800, 0x200a, 0x080c, 0x349a, 0x0080, 0x2009,
++	0x0114, 0x2104, 0x9085, 0x4000, 0x200a, 0x080c, 0x349a, 0x0038,
++	0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x2b6a, 0x0086,
++	0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c,
++	0x306d, 0x2009, 0x0101, 0x210c, 0x0016, 0x2001, 0x0032, 0x2034,
++	0x2001, 0x0033, 0x202c, 0x9006, 0x2048, 0x2050, 0x2058, 0x080c,
++	0x3700, 0x080c, 0x3660, 0x903e, 0x2720, 0x00f6, 0x00e6, 0x00c6,
++	0x2d60, 0x2071, 0x134a, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000,
++	0x6884, 0xd0b4, 0x0140, 0x2001, 0x0035, 0x2004, 0x780e, 0x2001,
++	0x0034, 0x2004, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x360c,
++	0x080c, 0x360c, 0x00ce, 0x00ee, 0x00fe, 0x080c, 0x3542, 0x00f6,
++	0x2079, 0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178, 0x2001, 0x0201,
++	0x200c, 0x81ff, 0x0150, 0x080c, 0x3520, 0x2900, 0x9a05, 0x9b05,
++	0x0120, 0x080c, 0x347c, 0x0804, 0x342b, 0x080c, 0x3634, 0x080c,
++	0x35a4, 0x080c, 0x3503, 0x080c, 0x3538, 0x00f6, 0x2079, 0x0100,
++	0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x347c, 0x00fe, 0x0804,
++	0x342b, 0x00fe, 0x080c, 0x3472, 0x1150, 0x8948, 0x2001, 0x0032,
++	0x2602, 0x2001, 0x0033, 0x2502, 0x080c, 0x347c, 0x0080, 0x87ff,
++	0x0138, 0x2001, 0x0201, 0x2004, 0x9005, 0x1908, 0x8739, 0x0038,
++	0x2001, 0x1347, 0x2004, 0x9086, 0x0000, 0x1904, 0x3377, 0x2001,
++	0x032f, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, 0x2500, 0x9605,
++	0x0904, 0x342b, 0x7884, 0xd0bc, 0x0128, 0x2900, 0x9a05, 0x9b05,
++	0x1904, 0x342b, 0x6013, 0x0019, 0x2001, 0x032a, 0x2003, 0x0004,
++	0x7884, 0xd0ac, 0x1148, 0x2001, 0x1347, 0x2003, 0x0003, 0x2001,
++	0x032a, 0x2003, 0x0009, 0x0040, 0x6017, 0x0001, 0x2001, 0x002d,
++	0x2004, 0x9005, 0x0108, 0x6016, 0x2c00, 0x605a, 0x2009, 0x0040,
++	0x080c, 0x1b67, 0x2d00, 0x685a, 0x6813, 0x0019, 0x7884, 0xd0a4,
++	0x1180, 0x6817, 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090,
++	0x602b, 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x3400, 0x00ce,
++	0x0040, 0x6817, 0x0001, 0x2001, 0x002c, 0x2004, 0x9005, 0x0108,
++	0x6816, 0x00f6, 0x00c6, 0x2079, 0x0100, 0x2061, 0x0090, 0x7827,
++	0x0002, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0x601a, 0x0006,
++	0x2001, 0x002b, 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca, 0x00ce,
++	0x00fe, 0x0804, 0x3355, 0x001e, 0x2001, 0x032a, 0x2003, 0x0004,
++	0x2061, 0x0100, 0x6027, 0x0002, 0x6106, 0x2011, 0x020d, 0x2013,
++	0x0020, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c,
++	0x10cf, 0x7884, 0x9084, 0x0003, 0x9086, 0x0002, 0x01a0, 0x2009,
++	0x0028, 0x080c, 0x1b67, 0x2001, 0x0227, 0x200c, 0x2102, 0x6050,
++	0x9084, 0xb7ef, 0x6052, 0x602f, 0x0000, 0x604b, 0xf7f7, 0x6043,
++	0x0090, 0x6043, 0x0010, 0x2908, 0x2a10, 0x2b18, 0x2b00, 0x9a05,
++	0x9905, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e,
++	0x008e, 0x1118, 0x012e, 0x0804, 0x2b68, 0x012e, 0x2021, 0x400c,
++	0x0804, 0x2b6a, 0x9085, 0x0001, 0x1d04, 0x347b, 0x2091, 0x6000,
++	0x8420, 0x9486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, 0x0010,
++	0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x009a, 0x2003, 0x0004,
++	0x2001, 0x1347, 0x2003, 0x0000, 0x2001, 0x134a, 0x2003, 0x0000,
++	0x2009, 0x0048, 0x080c, 0x1b67, 0x2001, 0x0227, 0x2024, 0x2402,
++	0x9026, 0x0005, 0x00f6, 0x2079, 0x0100, 0x2001, 0x1116, 0x200c,
++	0x7932, 0x7936, 0x080c, 0x1f8d, 0x7850, 0x9084, 0xfbff, 0x9085,
++	0x0030, 0x7852, 0x2019, 0x01f4, 0x8319, 0x1df0, 0x9084, 0xffcf,
++	0x9085, 0x2000, 0x7852, 0x20a9, 0x0046, 0x1d04, 0x34b5, 0x2091,
++	0x6000, 0x1f04, 0x34b5, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfff,
++	0x7852, 0x2001, 0x0021, 0x2004, 0x9084, 0x0003, 0x9086, 0x0001,
++	0x1120, 0x7850, 0x9084, 0xdfff, 0x7852, 0x784b, 0xf7f7, 0x7843,
++	0x0090, 0x7843, 0x0010, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x34d5,
++	0x7850, 0x9085, 0x1400, 0x7852, 0x2019, 0x61a8, 0x7854, 0xa001,
++	0xa001, 0xd08c, 0x1110, 0x8319, 0x1dc8, 0x7827, 0x0048, 0x7850,
++	0x9085, 0x0400, 0x7852, 0x7843, 0x0040, 0x2019, 0x01f4, 0xa001,
++	0xa001, 0x8319, 0x1de0, 0x2001, 0x0100, 0x080c, 0x2401, 0x7827,
++	0x0020, 0x7843, 0x0000, 0x2001, 0x0000, 0x080c, 0x2401, 0x7827,
++	0x0048, 0x00fe, 0x0005, 0x7884, 0xd0ac, 0x11c8, 0x00f6, 0x00e6,
++	0x2071, 0x1347, 0x2079, 0x0320, 0x2001, 0x0201, 0x2004, 0x9005,
++	0x0160, 0x7000, 0x9086, 0x0000, 0x1140, 0x0051, 0xd0bc, 0x0108,
++	0x8738, 0x7003, 0x0003, 0x782b, 0x0019, 0x00ee, 0x00fe, 0x0005,
++	0x00f6, 0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c, 0x0070, 0x0178,
++	0x2009, 0x0032, 0x260a, 0x2009, 0x0033, 0x250a, 0xd0b4, 0x0108,
++	0x8a50, 0xd0ac, 0x0108, 0x8948, 0xd0a4, 0x0108, 0x8b58, 0x0005,
++	0x00f6, 0x2079, 0x0200, 0x781c, 0xd084, 0x0110, 0x7837, 0x0050,
++	0x00fe, 0x0005, 0x00e6, 0x2071, 0x0100, 0x2001, 0x12e2, 0x2004,
++	0x70e2, 0x080c, 0x3281, 0x1188, 0x2001, 0x111e, 0x2004, 0x2009,
++	0x111d, 0x210c, 0x918c, 0x00ff, 0x706e, 0x716a, 0x7066, 0x918d,
++	0x3200, 0x7162, 0x7073, 0xe109, 0x0080, 0x702c, 0x9085, 0x0002,
++	0x702e, 0x2009, 0x1116, 0x210c, 0x716e, 0x7063, 0x0100, 0x7166,
++	0x719e, 0x706b, 0x0000, 0x7073, 0x0809, 0x7077, 0x0008, 0x7078,
++	0x9080, 0x0100, 0x707a, 0x7080, 0x8000, 0x7082, 0x7087, 0xaaaa,
++	0x9006, 0x708a, 0x708e, 0x707e, 0x70d6, 0x70ab, 0x0036, 0x70af,
++	0x95d5, 0x7014, 0x9084, 0x1984, 0x9085, 0x0012, 0x7016, 0x080c,
++	0x3634, 0x00f6, 0x2071, 0x1347, 0x2079, 0x0320, 0x00d6, 0x2069,
++	0x0000, 0x6884, 0xd0b4, 0x0120, 0x689c, 0x780e, 0x6898, 0x780a,
++	0x00de, 0x2011, 0x0011, 0x080c, 0x360c, 0x2011, 0x0001, 0x080c,
++	0x360c, 0x00fe, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1347,
++	0x2079, 0x0320, 0x792c, 0xd1fc, 0x0904, 0x3609, 0x782b, 0x0002,
++	0x9026, 0xd19c, 0x1904, 0x3605, 0x7000, 0x0002, 0x3609, 0x35ba,
++	0x35ea, 0x3605, 0xd1bc, 0x1170, 0xd1dc, 0x1190, 0x8001, 0x7002,
++	0x2011, 0x0001, 0x080c, 0x360c, 0x0904, 0x3609, 0x080c, 0x360c,
++	0x0804, 0x3609, 0x00f6, 0x2079, 0x0300, 0x78bf, 0x0000, 0x00fe,
++	0x7810, 0x7914, 0x782b, 0x0004, 0x7812, 0x7916, 0x2001, 0x0201,
++	0x200c, 0x81ff, 0x0de8, 0x080c, 0x3520, 0x2009, 0x0001, 0x00f6,
++	0x2079, 0x0300, 0x78b8, 0x00fe, 0xd0ec, 0x0110, 0x2009, 0x0011,
++	0x792a, 0x00f8, 0x8001, 0x7002, 0x9184, 0x0880, 0x1140, 0x782c,
++	0xd0fc, 0x1904, 0x35ae, 0x2011, 0x0001, 0x00b1, 0x0090, 0x6010,
++	0x9092, 0x0004, 0x9086, 0x0015, 0x1120, 0x6000, 0x605a, 0x2011,
++	0x0031, 0x6212, 0xd1dc, 0x1960, 0x0828, 0x782b, 0x0004, 0x7003,
++	0x0000, 0x00ee, 0x00fe, 0x0005, 0x6014, 0x9005, 0x0520, 0x8001,
++	0x6016, 0x6058, 0x6110, 0x9140, 0x2804, 0x7802, 0x8840, 0x2804,
++	0x7806, 0x8840, 0x2804, 0x7812, 0x8840, 0x2804, 0x7816, 0x8840,
++	0x7a2a, 0x7000, 0x8000, 0x7002, 0x6058, 0x9802, 0x908a, 0x0029,
++	0x1138, 0x6058, 0x9080, 0x0001, 0x2004, 0x605a, 0x2001, 0x0019,
++	0x6012, 0x9085, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x2071,
++	0x134a, 0x2079, 0x0090, 0x792c, 0xd1fc, 0x01f0, 0x782b, 0x0002,
++	0x2d60, 0x9026, 0x7000, 0x0002, 0x365c, 0x3647, 0x3653, 0x8001,
++	0x7002, 0xd19c, 0x1188, 0x2011, 0x0001, 0x080c, 0x360c, 0x0160,
++	0x080c, 0x360c, 0x0048, 0x8001, 0x7002, 0x782c, 0xd0fc, 0x1d30,
++	0x2011, 0x0001, 0x080c, 0x360c, 0x00ce, 0x00ee, 0x00fe, 0x0005,
++	0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0x12e2, 0x2004,
++	0x601a, 0x2061, 0x0100, 0x2001, 0x12e1, 0x2004, 0x60ce, 0x6104,
++	0xc1ac, 0x6106, 0x2001, 0x002c, 0x2004, 0x9005, 0x01f8, 0x2038,
++	0x2001, 0x002e, 0x2024, 0x2001, 0x002f, 0x201c, 0x080c, 0x3eb9,
++	0x6813, 0x0019, 0x6f16, 0x2d00, 0x685a, 0x978a, 0x0007, 0x0220,
++	0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x6858, 0x9080,
++	0x0019, 0x04c1, 0x1d90, 0x2d00, 0x685a, 0x0088, 0x080c, 0x3eb9,
++	0x6813, 0x0019, 0x2070, 0x6817, 0x0001, 0x2d00, 0x685a, 0x2001,
++	0x002e, 0x2004, 0x2072, 0x2001, 0x002f, 0x2004, 0x7006, 0x2061,
++	0x0090, 0x2079, 0x0100, 0x2001, 0x12e1, 0x2004, 0x6036, 0x2009,
++	0x0040, 0x080c, 0x1b67, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8,
++	0x700a, 0x601a, 0x0006, 0x2001, 0x002b, 0x2004, 0x700e, 0x601e,
++	0x78c6, 0x000e, 0x78ca, 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee,
++	0x00fe, 0x0005, 0x00e6, 0x2071, 0x0080, 0x20e9, 0x0001, 0x20a0,
++	0x20e1, 0x0000, 0x2099, 0x0088, 0x702b, 0x0026, 0x7402, 0x7306,
++	0x9006, 0x700a, 0x700e, 0x810b, 0x810b, 0x21a8, 0x810b, 0x7112,
++	0x702b, 0x0041, 0x702c, 0xd0fc, 0x0de8, 0x702b, 0x0002, 0x702b,
++	0x0040, 0x4005, 0x7400, 0x7304, 0x87ff, 0x0180, 0x00c6, 0x00d6,
++	0x2d60, 0x00c6, 0x080c, 0x3eb9, 0x00ce, 0x6058, 0x2070, 0x2d00,
++	0x7006, 0x605a, 0x00de, 0x00ce, 0x9085, 0x0001, 0x00ee, 0x0005,
++	0x00e6, 0x2001, 0x002d, 0x2004, 0x9005, 0x0508, 0x2038, 0x2001,
++	0x0030, 0x2024, 0x2001, 0x0031, 0x201c, 0x080c, 0x3eb9, 0x2d60,
++	0x6813, 0x0019, 0x6f16, 0x2d00, 0x685a, 0x978a, 0x0007, 0x0220,
++	0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x6858, 0x9080,
++	0x0019, 0x080c, 0x36ca, 0x1d88, 0x2d00, 0x685a, 0x00e0, 0x080c,
++	0x3eb9, 0x2d60, 0x6013, 0x0019, 0x2070, 0x6017, 0x0001, 0x2c00,
++	0x605a, 0x2001, 0x0030, 0x2004, 0x2072, 0x2001, 0x0031, 0x2004,
++	0x7006, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0x700a, 0x2001,
++	0x002b, 0x2004, 0x700e, 0x2001, 0x032a, 0x2003, 0x0004, 0x7884,
++	0xd0ac, 0x1180, 0x2001, 0x0101, 0x200c, 0x918d, 0x0200, 0x2102,
++	0x6017, 0x0000, 0x2001, 0x1347, 0x2003, 0x0003, 0x2001, 0x032a,
++	0x2003, 0x0009, 0x2001, 0x0300, 0x2003, 0x0000, 0x2001, 0x020d,
++	0x2003, 0x0000, 0x2001, 0x0004, 0x200c, 0x918d, 0x0002, 0x2102,
++	0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0012, 0x2001,
++	0x1140, 0x20e9, 0x0001, 0x20a0, 0x9006, 0x4004, 0x2009, 0x013c,
++	0x200a, 0x012e, 0x7880, 0x9086, 0x0052, 0x0108, 0x0005, 0x0804,
++	0x2b68, 0x7d98, 0x7c9c, 0x0804, 0x2c5d, 0x080c, 0x62e4, 0x0110,
++	0x080c, 0x50b9, 0x2069, 0x1152, 0x2d00, 0x2009, 0x0030, 0x7a8c,
++	0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x3f0c, 0x701b,
++	0x379a, 0x0005, 0x2001, 0x110d, 0x2004, 0xd0b4, 0x1130, 0x3b00,
++	0x3a08, 0xc194, 0xc095, 0x20d8, 0x21d0, 0x2069, 0x1152, 0x6800,
++	0x9005, 0x0904, 0x2b9b, 0x6804, 0xd0ac, 0x0118, 0xd0a4, 0x0904,
++	0x2b9b, 0xd094, 0x00c6, 0x2061, 0x0100, 0x6104, 0x0138, 0x6200,
++	0x9292, 0x0005, 0x0218, 0x918c, 0xffdf, 0x0010, 0x918d, 0x0020,
++	0x6106, 0x00ce, 0xd08c, 0x00c6, 0x2061, 0x0100, 0x6104, 0x0118,
++	0x918d, 0x0010, 0x0010, 0x918c, 0xffef, 0x6106, 0x00ce, 0xd084,
++	0x0158, 0x6a28, 0x928a, 0x007f, 0x1a04, 0x2b9b, 0x9288, 0x298c,
++	0x210d, 0x918c, 0x00ff, 0x615e, 0xd0dc, 0x0130, 0x6828, 0x908a,
++	0x007f, 0x1a04, 0x2b9b, 0x6056, 0x6888, 0x9084, 0x0030, 0x8004,
++	0x8004, 0x8004, 0x8004, 0x0006, 0x2009, 0x12e8, 0x9080, 0x2081,
++	0x2005, 0x200a, 0x000e, 0x2009, 0x12e9, 0x9080, 0x2085, 0x2005,
++	0x200a, 0x6808, 0x908a, 0x0100, 0x0a04, 0x2b9b, 0x908a, 0x0841,
++	0x1a04, 0x2b9b, 0x9084, 0x0007, 0x1904, 0x2b9b, 0x680c, 0x9005,
++	0x0904, 0x2b9b, 0x6810, 0x9005, 0x0904, 0x2b9b, 0x6848, 0x6940,
++	0x910a, 0x1a04, 0x2b9b, 0x8001, 0x0904, 0x2b9b, 0x684c, 0x6944,
++	0x910a, 0x1a04, 0x2b9b, 0x8001, 0x0904, 0x2b9b, 0x6980, 0xd1e4,
++	0x0140, 0x00c6, 0x2061, 0x0100, 0x6004, 0x9085, 0x0100, 0x6006,
++	0x00ce, 0x2009, 0x12bb, 0x200b, 0x0000, 0x2001, 0x1174, 0x2004,
++	0xd0c4, 0x0140, 0x7884, 0x200a, 0x2009, 0x017f, 0x200a, 0x3b00,
++	0xc085, 0x20d8, 0x6814, 0x908c, 0x00ff, 0x6146, 0x8007, 0x9084,
++	0x00ff, 0x604a, 0x080c, 0x65bd, 0x080c, 0x58f4, 0x080c, 0x5946,
++	0x6808, 0x602a, 0x080c, 0x1a81, 0x2009, 0x0170, 0x200b, 0x0080,
++	0xa001, 0xa001, 0x200b, 0x0000, 0x0036, 0x6b08, 0x080c, 0x1fe8,
++	0x003e, 0x6000, 0x9086, 0x0000, 0x1904, 0x393a, 0x6818, 0x691c,
++	0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f, 0x6016, 0x611a,
++	0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0148, 0x6830, 0x6934, 0x6a38,
++	0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f, 0x0010, 0x9084, 0xf0ff,
++	0x6006, 0x610a, 0x620e, 0x6312, 0x8007, 0x810f, 0x8217, 0x831f,
++	0x20a9, 0x0004, 0x20a1, 0x12ea, 0x20e9, 0x0001, 0x4001, 0x080c,
++	0x72cb, 0x00c6, 0x900e, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x0510,
++	0x0068, 0x2009, 0x0100, 0x210c, 0x918e, 0x0008, 0x1110, 0x839d,
++	0x0010, 0x83f5, 0x3e18, 0x12b0, 0x3508, 0x8109, 0x080c, 0x6b21,
++	0x6878, 0x6016, 0x6874, 0x2008, 0x9084, 0xff00, 0x8007, 0x600a,
++	0x9184, 0x00ff, 0x6006, 0x8108, 0x1118, 0x6003, 0x0003, 0x0010,
++	0x6003, 0x0001, 0x1f04, 0x3891, 0x00ce, 0x00c6, 0x2061, 0x12d6,
++	0x6a88, 0x9284, 0xc000, 0x2010, 0x9286, 0x0000, 0x1158, 0x2063,
++	0x0000, 0x2001, 0x0001, 0x080c, 0x2290, 0x2001, 0x0001, 0x080c,
++	0x2273, 0x0090, 0x9286, 0x4000, 0x1148, 0x2063, 0x0001, 0x9006,
++	0x080c, 0x2290, 0x9006, 0x080c, 0x2273, 0x0030, 0x9286, 0x8000,
++	0x1d30, 0x2063, 0x0002, 0x0c98, 0x00ce, 0x6888, 0xd0ec, 0x0130,
++	0x2011, 0x0114, 0x2204, 0x9085, 0x0100, 0x2012, 0x6a80, 0x9284,
++	0x0030, 0x9086, 0x0030, 0x1128, 0x9294, 0xffcf, 0x9295, 0x0020,
++	0x6a82, 0x2001, 0x12a7, 0x6a80, 0x9294, 0x0030, 0x928e, 0x0000,
++	0x0170, 0x928e, 0x0010, 0x0118, 0x928e, 0x0020, 0x0140, 0x2003,
++	0xaaaa, 0x080c, 0x205d, 0x2001, 0x1298, 0x2102, 0x0008, 0x2102,
++	0x00c6, 0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce,
++	0x080c, 0x62e4, 0x0128, 0x080c, 0x41f5, 0x0110, 0x080c, 0x1fad,
++	0x60d0, 0x9005, 0x01d0, 0x6003, 0x0001, 0x2009, 0x3920, 0x00e0,
++	0x080c, 0x62e4, 0x1178, 0x2011, 0x61aa, 0x080c, 0x71fa, 0x2011,
++	0x619d, 0x080c, 0x72bf, 0x2001, 0x12a8, 0x2003, 0x0000, 0x080c,
++	0x621a, 0x0040, 0x080c, 0x4faa, 0x0028, 0x6003, 0x0004, 0x2009,
++	0x393a, 0x0010, 0x0804, 0x2b68, 0x2001, 0x0170, 0x2004, 0x9084,
++	0x00ff, 0x9086, 0x004c, 0x1118, 0x2091, 0x30bd, 0x0817, 0x2091,
++	0x303d, 0x0817, 0x6000, 0x9086, 0x0000, 0x0904, 0x2b98, 0x2069,
++	0x1152, 0x7890, 0x6842, 0x7894, 0x6846, 0x2d00, 0x2009, 0x0030,
++	0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x0804, 0x3f0f,
++	0x9006, 0x080c, 0x1fad, 0x81ff, 0x1904, 0x2b98, 0x080c, 0x62e4,
++	0x1188, 0x2001, 0x12a8, 0x2003, 0x0001, 0x2001, 0x1100, 0x2003,
++	0x0001, 0x080c, 0x2987, 0x0118, 0x6130, 0xc18d, 0x6132, 0x080c,
++	0x621a, 0x0020, 0x080c, 0x50b9, 0x080c, 0x4faa, 0x0804, 0x2b68,
++	0x81ff, 0x1904, 0x2b98, 0x080c, 0x62e4, 0x1110, 0x0804, 0x2b98,
++	0x618c, 0x81ff, 0x01a8, 0x7047, 0x0000, 0x2001, 0x1580, 0x2009,
++	0x0040, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126, 0x2091, 0x8000,
++	0x2039, 0x0001, 0x080c, 0x3f0f, 0x701b, 0x2b66, 0x012e, 0x0005,
++	0x7047, 0x0001, 0x00d6, 0x2069, 0x1580, 0x20a9, 0x0040, 0x20e9,
++	0x0001, 0x20a1, 0x1580, 0x2019, 0xffff, 0x4304, 0x6554, 0x9588,
++	0x298c, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, 0x2011, 0x0002,
++	0x2100, 0x9506, 0x01a8, 0x080c, 0x5608, 0x1190, 0x6014, 0x821c,
++	0x0238, 0x9398, 0x1580, 0x9085, 0xff00, 0x8007, 0x201a, 0x0038,
++	0x9398, 0x1580, 0x2324, 0x94a4, 0xff00, 0x9405, 0x201a, 0x8210,
++	0x8108, 0x9182, 0x0080, 0x1208, 0x0c18, 0x8201, 0x8007, 0x2d0c,
++	0x9105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, 0x1580, 0x2099,
++	0x1580, 0x080c, 0x504f, 0x0804, 0x398d, 0x080c, 0x3ef0, 0x0904,
++	0x2b9b, 0x00c6, 0x080c, 0x3eb9, 0x00ce, 0x1120, 0x2009, 0x0002,
++	0x0804, 0x2b98, 0x2001, 0x1153, 0x2004, 0xd0b4, 0x0568, 0x7884,
++	0x9084, 0xff00, 0x908e, 0x7e00, 0x0538, 0x908e, 0x7f00, 0x0520,
++	0x908e, 0x8000, 0x0508, 0x080c, 0x2982, 0x1148, 0x6000, 0xd08c,
++	0x11d8, 0x6004, 0x9084, 0x00ff, 0x9086, 0x0006, 0x11a8, 0x6867,
++	0x0000, 0x6868, 0xc0fd, 0x686a, 0x080c, 0xaabe, 0x1120, 0x2009,
++	0x0003, 0x0804, 0x2b98, 0x7007, 0x0003, 0x701b, 0x3a20, 0x0005,
++	0x080c, 0x3ef0, 0x0904, 0x2b9b, 0x20a9, 0x002b, 0x20e1, 0x0001,
++	0x2c98, 0x9de8, 0x0002, 0x20e9, 0x0001, 0x2da0, 0x4003, 0x20a9,
++	0x0004, 0x9d80, 0x0006, 0x20a0, 0x9c80, 0x0006, 0x2098, 0x080c,
++	0x504f, 0x20a9, 0x0004, 0x9d80, 0x000a, 0x20a0, 0x9c80, 0x000a,
++	0x2098, 0x080c, 0x504f, 0x2d00, 0x2039, 0x0001, 0x2009, 0x002b,
++	0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x3f0f, 0x81ff, 0x1904,
++	0x2b98, 0x080c, 0x3ece, 0x0904, 0x2b9b, 0x080c, 0x5767, 0x0804,
++	0x2b68, 0x81ff, 0x1904, 0x2b98, 0x7888, 0x908a, 0x1000, 0x1a04,
++	0x2b9b, 0x080c, 0x3ef0, 0x0904, 0x2b9b, 0x080c, 0x57a6, 0x0904,
++	0x2b98, 0x2019, 0x0004, 0x900e, 0x080c, 0x5779, 0x7984, 0x810f,
++	0x7a88, 0x0491, 0x0804, 0x2b68, 0x00f6, 0x2d78, 0x789c, 0x908a,
++	0x1000, 0x12c0, 0x080c, 0x3eee, 0x01a8, 0x080c, 0x57a6, 0x2009,
++	0x0002, 0x0160, 0x2019, 0x0004, 0x080c, 0x5779, 0x2009, 0x0003,
++	0x0128, 0x7998, 0x7a9c, 0x810f, 0x00b9, 0x0070, 0x7897, 0x4005,
++	0x799a, 0x0010, 0x7897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001,
++	0x0030, 0x2f68, 0x00fe, 0x0005, 0x7897, 0x4000, 0x900e, 0x9085,
++	0x0001, 0x2f68, 0x00fe, 0x0005, 0x9186, 0x00ff, 0x0110, 0x0071,
++	0x0060, 0x2029, 0x007e, 0x2061, 0x1100, 0x6454, 0x2400, 0x9506,
++	0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, 0x5608,
++	0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x7206,
++	0x0005, 0x81ff, 0x1904, 0x2b98, 0x080c, 0x3ece, 0x0904, 0x2b9b,
++	0x080c, 0x56ca, 0x0904, 0x2b98, 0x080c, 0x5770, 0x0804, 0x2b68,
++	0x81ff, 0x1904, 0x2b98, 0x080c, 0x3ece, 0x0904, 0x2b9b, 0x080c,
++	0x56ca, 0x0904, 0x2b98, 0x080c, 0x575e, 0x0804, 0x2b68, 0x6100,
++	0x0804, 0x2b68, 0x080c, 0x3ef0, 0x0904, 0x2b9b, 0x2001, 0x1100,
++	0x2004, 0x9086, 0x0003, 0x1904, 0x2b98, 0x00d6, 0x9ce8, 0x000a,
++	0x7984, 0xd184, 0x0110, 0x9ce8, 0x0006, 0x680c, 0x8007, 0x789e,
++	0x6808, 0x8007, 0x789a, 0x6b04, 0x831f, 0x6a00, 0x8217, 0x00de,
++	0x6100, 0x918c, 0x0200, 0x0804, 0x2b68, 0x7884, 0x909c, 0x007f,
++	0x939a, 0x0003, 0x1a04, 0x2b98, 0x6254, 0x9294, 0x00ff, 0x9084,
++	0xff00, 0x8007, 0x9206, 0x1560, 0x2031, 0x1148, 0x2009, 0x013c,
++	0x2136, 0x2001, 0x1140, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c,
++	0x7d98, 0x2039, 0x0001, 0x0006, 0x7884, 0x9084, 0x0080, 0x1118,
++	0x000e, 0x0804, 0x3f0f, 0x000e, 0x2031, 0x0000, 0x2061, 0x11ea,
++	0x6606, 0x6116, 0x670e, 0x6012, 0x622a, 0x632e, 0x6432, 0x6536,
++	0x2c10, 0x080c, 0x0f22, 0x7007, 0x0002, 0x701b, 0x3b62, 0x0005,
++	0x81ff, 0x1904, 0x2b98, 0x080c, 0x3ef0, 0x0904, 0x2b9b, 0x6004,
++	0x9084, 0x00ff, 0x9086, 0x0006, 0x1904, 0x2b98, 0x00c6, 0x080c,
++	0x3eb9, 0x00ce, 0x0904, 0x2b98, 0x6867, 0x0000, 0x6868, 0xc0fd,
++	0x686a, 0x080c, 0xaa65, 0x0904, 0x2b98, 0x7007, 0x0003, 0x701b,
++	0x3b66, 0x0005, 0x080c, 0x376a, 0x0804, 0x2b68, 0x6830, 0x9086,
++	0x0100, 0x0904, 0x2b98, 0x9d80, 0x001b, 0x2009, 0x000c, 0x7a8c,
++	0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x0804, 0x3f0f, 0x9006,
++	0x080c, 0x1fad, 0x7884, 0x9084, 0x00ff, 0x9086, 0x00ff, 0x0118,
++	0x81ff, 0x1904, 0x2b98, 0x080c, 0x62e4, 0x0110, 0x080c, 0x50b9,
++	0x7888, 0x908a, 0x1000, 0x1a04, 0x2b9b, 0x7984, 0x918c, 0xff00,
++	0x810f, 0x9186, 0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, 0x2b9b,
++	0x2100, 0x080c, 0x1f77, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000,
++	0x2061, 0x1317, 0x601b, 0x0000, 0x601f, 0x0000, 0x080c, 0x62e4,
++	0x1178, 0x2001, 0x12a8, 0x2003, 0x0001, 0x2001, 0x1100, 0x2003,
++	0x0001, 0x9085, 0x0001, 0x080c, 0x6331, 0x080c, 0x621a, 0x0438,
++	0x2011, 0x0003, 0x080c, 0x88e2, 0x2011, 0x0002, 0x080c, 0x88ec,
++	0x080c, 0x87a2, 0x0036, 0x901e, 0x080c, 0x8847, 0x003e, 0x2061,
++	0x0100, 0x2001, 0x1116, 0x2004, 0x9084, 0x00ff, 0x810f, 0x9105,
++	0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x12d3, 0x200b,
++	0x0000, 0x2009, 0x002d, 0x2011, 0x4fe1, 0x080c, 0x7283, 0x7984,
++	0x918c, 0xff00, 0x810f, 0x080c, 0x62e4, 0x1110, 0x2009, 0x00ff,
++	0x7a88, 0x080c, 0x3aa4, 0x012e, 0x00ce, 0x002e, 0x0804, 0x2b68,
++	0x7984, 0x918c, 0xff00, 0x810f, 0x00c6, 0x080c, 0x55b3, 0x2c08,
++	0x00ce, 0x1904, 0x2b9b, 0x0804, 0x2b68, 0x81ff, 0x0120, 0x2009,
++	0x0001, 0x0804, 0x2b98, 0x60d8, 0xd0ac, 0x1130, 0xd09c, 0x1120,
++	0x2009, 0x0005, 0x0804, 0x2b98, 0x080c, 0x3eb9, 0x1120, 0x2009,
++	0x0002, 0x0804, 0x2b98, 0x7984, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
++	0x2039, 0x0001, 0x080c, 0x3f0c, 0x701b, 0x3c1f, 0x0005, 0x2009,
++	0x0080, 0x080c, 0x5608, 0x1130, 0x6004, 0x9084, 0x00ff, 0x9086,
++	0x0006, 0x0120, 0x2021, 0x400a, 0x0804, 0x2b6a, 0x00d6, 0x9de8,
++	0x0019, 0x6900, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x6e18, 0x6820,
++	0x90be, 0x0100, 0x0904, 0x3c99, 0x90be, 0x0112, 0x0904, 0x3c99,
++	0x90be, 0x0113, 0x0904, 0x3c99, 0x90be, 0x0114, 0x0904, 0x3c99,
++	0x90be, 0x0117, 0x0904, 0x3c99, 0x90be, 0x011a, 0x0904, 0x3c99,
++	0x90be, 0x011c, 0x0904, 0x3c99, 0x90be, 0x0121, 0x05c8, 0x90be,
++	0x0131, 0x05b0, 0x90be, 0x0171, 0x05e0, 0x90be, 0x0173, 0x05c8,
++	0x90be, 0x01a1, 0x1120, 0x6830, 0x8007, 0x6832, 0x04b8, 0x90be,
++	0x0212, 0x0558, 0x90be, 0x0213, 0x0540, 0x90be, 0x0214, 0x01c8,
++	0x90be, 0x0217, 0x0180, 0x90be, 0x021a, 0x1120, 0x6838, 0x8007,
++	0x683a, 0x00f8, 0x90be, 0x021f, 0x01e0, 0x90be, 0x0300, 0x01c8,
++	0x00de, 0x0804, 0x2b9b, 0x9d80, 0x0010, 0x20a9, 0x0007, 0x080c,
++	0x3cda, 0x9d80, 0x000e, 0x20a9, 0x0001, 0x080c, 0x3cda, 0x0048,
++	0x9d80, 0x000c, 0x080c, 0x3ce8, 0x0048, 0x9d80, 0x000e, 0x080c,
++	0x3ce8, 0x9d80, 0x000c, 0x20a9, 0x0001, 0x04e1, 0x00c6, 0x080c,
++	0x3eb9, 0x0548, 0x6868, 0xc0fd, 0x686a, 0x6867, 0x0119, 0x9006,
++	0x6882, 0x687f, 0x0020, 0x688b, 0x0001, 0x810b, 0x69ae, 0x68b2,
++	0x6ab6, 0x6bba, 0x6cbe, 0x6dc2, 0x69c6, 0x68ca, 0x00ce, 0x00de,
++	0x6866, 0x6822, 0x6868, 0xc0fd, 0x686a, 0x6804, 0x2068, 0x080c,
++	0xaa81, 0x1120, 0x2009, 0x0003, 0x0804, 0x2b98, 0x7007, 0x0003,
++	0x701b, 0x3cd1, 0x0005, 0x00ce, 0x00de, 0x2009, 0x0002, 0x0804,
++	0x2b98, 0x6820, 0x9086, 0x8001, 0x1904, 0x2b68, 0x2009, 0x0004,
++	0x0804, 0x2b98, 0x0016, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000,
++	0x290a, 0x8108, 0x280a, 0x8108, 0x1f04, 0x3cdc, 0x001e, 0x0005,
++	0x0016, 0x00a6, 0x00b6, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000,
++	0x2054, 0x8000, 0x205c, 0x2b0a, 0x8108, 0x2a0a, 0x8108, 0x290a,
++	0x8108, 0x280a, 0x00be, 0x00ae, 0x001e, 0x0005, 0x81ff, 0x0120,
++	0x2009, 0x0001, 0x0804, 0x2b98, 0x60d8, 0xd0ac, 0x1130, 0xd09c,
++	0x1120, 0x2009, 0x0005, 0x0804, 0x2b98, 0x7984, 0x2140, 0x918c,
++	0xff00, 0x810f, 0x60d8, 0xd0ac, 0x1120, 0x9182, 0x0080, 0x0a04,
++	0x2b9b, 0x9182, 0x00ff, 0x1a04, 0x2b9b, 0x7a8c, 0x7b88, 0x6074,
++	0x9306, 0x1140, 0x6078, 0x924e, 0x0904, 0x2b9b, 0x99cc, 0xff00,
++	0x0904, 0x2b9b, 0x00c6, 0x080c, 0x3dc2, 0x2c68, 0x00ce, 0x0530,
++	0x90c6, 0x4000, 0x1178, 0x00c6, 0x0006, 0x2d60, 0x900e, 0x080c,
++	0x57d6, 0x1108, 0xc185, 0x6000, 0xd0bc, 0x0108, 0xc18d, 0x000e,
++	0x00ce, 0x0088, 0x90c6, 0x4007, 0x1110, 0x2408, 0x0060, 0x90c6,
++	0x4008, 0x1118, 0x2708, 0x2610, 0x0030, 0x90c6, 0x4009, 0x1108,
++	0x0010, 0x2001, 0x4006, 0x2020, 0x0804, 0x2b6a, 0x2d00, 0x7022,
++	0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0x8f26, 0x05c0,
++	0x2d00, 0x6012, 0x080c, 0xad70, 0x2e58, 0x00ee, 0x00e6, 0x00c6,
++	0x080c, 0x3eb9, 0x00ce, 0x2b70, 0x1150, 0x080c, 0x8ed9, 0x00ee,
++	0x00ce, 0x00be, 0x001e, 0x2009, 0x0002, 0x0804, 0x2b98, 0x900e,
++	0x6966, 0x696a, 0x2d00, 0x6016, 0x6932, 0x6868, 0xc0fd, 0xd88c,
++	0x0108, 0xc0f5, 0x686a, 0x0126, 0x2091, 0x8000, 0x080c, 0x2862,
++	0x012e, 0x6023, 0x0001, 0x9006, 0x080c, 0x5556, 0x2001, 0x0002,
++	0x080c, 0x5568, 0x2009, 0x0002, 0x080c, 0x8f53, 0x9085, 0x0001,
++	0x00ee, 0x00ce, 0x00be, 0x001e, 0x1120, 0x2009, 0x0003, 0x0804,
++	0x2b98, 0x7007, 0x0003, 0x701b, 0x3da6, 0x0005, 0x6830, 0x9086,
++	0x0100, 0x7020, 0x2060, 0x1138, 0x2009, 0x0004, 0x6204, 0x9294,
++	0x00ff, 0x0804, 0x47e3, 0x900e, 0x6868, 0xd0f4, 0x1904, 0x2b68,
++	0x080c, 0x57d6, 0x1108, 0xc185, 0x6000, 0xd0bc, 0x0108, 0xc18d,
++	0x0804, 0x2b68, 0x00e6, 0x00d6, 0x2029, 0x0000, 0x2001, 0x1136,
++	0x2004, 0xd0ac, 0x0138, 0x2021, 0x0000, 0x20a9, 0x00ff, 0x2071,
++	0x1000, 0x0030, 0x2021, 0x0080, 0x20a9, 0x007f, 0x2071, 0x1080,
++	0x2e04, 0x9005, 0x1130, 0x2100, 0x9406, 0x1570, 0x2428, 0xc5fd,
++	0x0458, 0x2068, 0x6f10, 0x2700, 0x9306, 0x11b0, 0x6e14, 0x2600,
++	0x9206, 0x1190, 0x2400, 0x9106, 0x1160, 0x2d60, 0xd884, 0x0568,
++	0x6004, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1538, 0x2001, 0x4000,
++	0x0428, 0x2001, 0x4007, 0x0410, 0x2400, 0x9106, 0x1168, 0x6e14,
++	0x87ff, 0x1138, 0x86ff, 0x09d0, 0x2001, 0x1136, 0x2004, 0xd0ac,
++	0x19a8, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x3dd8,
++	0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, 0x0030,
++	0x080c, 0x55b3, 0x1dd0, 0x6312, 0x6216, 0x9006, 0x9005, 0x00de,
++	0x00ee, 0x0005, 0x81ff, 0x1904, 0x2b98, 0x080c, 0x3eb9, 0x0904,
++	0x2b98, 0x6867, 0x0000, 0x6868, 0xc0fd, 0x686a, 0x7884, 0x9005,
++	0x0904, 0x2b9b, 0x9096, 0x00ff, 0x0120, 0x9092, 0x0004, 0x1a04,
++	0x2b9b, 0x2010, 0x2d18, 0x080c, 0x2811, 0x0904, 0x2b98, 0x7007,
++	0x0003, 0x701b, 0x3e44, 0x0005, 0x6830, 0x9086, 0x0100, 0x0904,
++	0x2b98, 0x0804, 0x2b68, 0x7984, 0x918c, 0xff00, 0x810f, 0x60d8,
++	0xd0ac, 0x1120, 0x9182, 0x0080, 0x0a04, 0x2b9b, 0x9182, 0x00ff,
++	0x1a04, 0x2b9b, 0x0126, 0x2091, 0x8000, 0x080c, 0xa972, 0x1188,
++	0x9190, 0x1000, 0x2204, 0x9065, 0x0160, 0x080c, 0x5100, 0x2001,
++	0x1136, 0x2004, 0xd0ac, 0x0110, 0x6017, 0x0000, 0x012e, 0x0804,
++	0x2b68, 0x012e, 0x0804, 0x2b98, 0x00f6, 0x2d78, 0x7998, 0x918c,
++	0xff00, 0x810f, 0x2001, 0x1136, 0x2004, 0xd0ac, 0x1118, 0x9182,
++	0x0080, 0x02e8, 0x9182, 0x00ff, 0x12d0, 0x0126, 0x2091, 0x8000,
++	0x080c, 0xa972, 0x1530, 0x9190, 0x1000, 0x2204, 0x9065, 0x0528,
++	0x080c, 0x5100, 0x2001, 0x1136, 0x2004, 0xd0ac, 0x0110, 0x6017,
++	0x0000, 0x012e, 0x0070, 0x7897, 0x4005, 0x799a, 0x0010, 0x7897,
++	0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x2f68, 0x00fe,
++	0x0005, 0x7897, 0x4000, 0x900e, 0x9085, 0x0001, 0x2f68, 0x00fe,
++	0x0005, 0x012e, 0x2009, 0x0003, 0x0c30, 0x012e, 0x2009, 0x000a,
++	0x0c10, 0x080c, 0x0eb6, 0x0188, 0x9006, 0x6802, 0x7010, 0x9005,
++	0x1120, 0x2d00, 0x7012, 0x7016, 0x0030, 0x7014, 0x6802, 0x2060,
++	0x2d00, 0x6006, 0x7016, 0x9d80, 0x0019, 0x0005, 0x7984, 0x810f,
++	0x918c, 0x00ff, 0x080c, 0x5608, 0x1130, 0x7e88, 0x9684, 0x3fff,
++	0x9082, 0x4000, 0x0208, 0x9066, 0x8cff, 0x0005, 0x7998, 0x810f,
++	0x918c, 0x00ff, 0x080c, 0x5608, 0x1130, 0x7e9c, 0x9684, 0x3fff,
++	0x9082, 0x4000, 0x0208, 0x9066, 0x8cff, 0x0005, 0x7e98, 0x0008,
++	0x7e84, 0x860f, 0x918c, 0x00ff, 0x080c, 0x5608, 0x1128, 0x96b4,
++	0x00ff, 0x9682, 0x4000, 0x0208, 0x9066, 0x8cff, 0x0005, 0x0016,
++	0x7110, 0x81ff, 0x0128, 0x2168, 0x6904, 0x080c, 0x0ecf, 0x0cc8,
++	0x7112, 0x7116, 0x001e, 0x0005, 0x2031, 0x0001, 0x0010, 0x2031,
++	0x0000, 0x2061, 0x11ea, 0x6606, 0x6116, 0x670e, 0x6012, 0x622a,
++	0x632e, 0x6432, 0x6536, 0x2c10, 0x080c, 0x0f22, 0x7007, 0x0002,
++	0x701b, 0x2b68, 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079,
++	0x0000, 0x2001, 0x11a3, 0x2004, 0x9005, 0x1190, 0x0e04, 0x3f40,
++	0x7a36, 0x7833, 0x0012, 0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080,
++	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x0fcd, 0x0804, 0x3f9d,
++	0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0x1193, 0x703c, 0x9005,
++	0x1540, 0x7140, 0x9182, 0x0010, 0x0288, 0x7030, 0x2060, 0x080c,
++	0x0eb6, 0x0904, 0x3f96, 0x684b, 0x0000, 0x2d00, 0x703e, 0x2001,
++	0x0002, 0x9080, 0x18fe, 0x2005, 0x6846, 0x0098, 0x7030, 0x90e0,
++	0x0004, 0x2001, 0x11aa, 0x9c82, 0x11ea, 0x0210, 0x2061, 0x11aa,
++	0x2c00, 0x7032, 0x7140, 0x81ff, 0x1108, 0x7036, 0x8108, 0x7142,
++	0x0428, 0x7140, 0x8108, 0x7142, 0x703c, 0x2078, 0x7944, 0x2105,
++	0x9f60, 0x8108, 0x2105, 0x9005, 0x7946, 0x11c0, 0x080c, 0x0eb6,
++	0x1130, 0x8109, 0x7946, 0x7140, 0x8109, 0x7142, 0x0078, 0x9006,
++	0x6806, 0x684a, 0x7846, 0x2f00, 0x6802, 0x2d00, 0x7806, 0x703e,
++	0x2001, 0x0002, 0x9080, 0x18fe, 0x2005, 0x6846, 0x2262, 0x6306,
++	0x640a, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x012e, 0x00fe, 0x0005,
++	0x00e6, 0x2071, 0x1193, 0x7040, 0x9005, 0x0904, 0x4024, 0x0126,
++	0x2091, 0x8000, 0x0e04, 0x4023, 0x00f6, 0x2079, 0x0000, 0x00c6,
++	0x00d6, 0x0086, 0x9006, 0x2040, 0x7038, 0x2068, 0x9005, 0x01c0,
++	0x6948, 0x2105, 0x9d60, 0x8108, 0x2105, 0x9005, 0x694a, 0x1190,
++	0x6804, 0x9005, 0x090c, 0x0d7e, 0x703a, 0x2d40, 0x2068, 0x6803,
++	0x0000, 0x2001, 0x0002, 0x9080, 0x18fe, 0x2005, 0x684a, 0x0010,
++	0x7034, 0x2060, 0x2c04, 0x7836, 0x7833, 0x0012, 0x7882, 0x6004,
++	0x7886, 0x6008, 0x788a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
++	0xd084, 0x190c, 0x0fcd, 0x88ff, 0x0118, 0x2868, 0x080c, 0x0ecf,
++	0x7040, 0x8001, 0x7042, 0x9005, 0x1170, 0x7038, 0x2068, 0x9005,
++	0x0128, 0x080c, 0x0ecf, 0x9006, 0x703a, 0x703e, 0x7033, 0x11aa,
++	0x7037, 0x11aa, 0x0420, 0x7038, 0x9005, 0x1508, 0x7230, 0x2c00,
++	0x9206, 0x0148, 0x9c80, 0x0004, 0x90fa, 0x11ea, 0x0210, 0x2001,
++	0x11aa, 0x7036, 0x00a0, 0x9006, 0x7036, 0x7032, 0x703c, 0x9005,
++	0x090c, 0x0d7e, 0x2068, 0x6800, 0x9005, 0x1de0, 0x2d00, 0x703a,
++	0x2001, 0x0002, 0x9080, 0x18fe, 0x2005, 0x684a, 0x0000, 0x008e,
++	0x00de, 0x00ce, 0x00fe, 0x012e, 0x00ee, 0x0005, 0x0026, 0x2001,
++	0x1153, 0x2004, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, 0x3f23,
++	0x002e, 0x0005, 0x81ff, 0x1904, 0x2b98, 0x0126, 0x2091, 0x8000,
++	0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x62e4, 0x1178,
++	0x2001, 0x12a8, 0x2003, 0x0001, 0x2001, 0x1100, 0x2003, 0x0001,
++	0x9085, 0x0001, 0x080c, 0x6331, 0x080c, 0x621a, 0x0010, 0x080c,
++	0x4faa, 0x012e, 0x0804, 0x2b68, 0x7884, 0x2008, 0x918c, 0xfffd,
++	0x1128, 0x61e4, 0x910d, 0x61e6, 0x0804, 0x2b68, 0x0804, 0x2b9b,
++	0x81ff, 0x1904, 0x2b98, 0x6000, 0x9086, 0x0003, 0x1904, 0x2b98,
++	0x080c, 0x58c6, 0x1904, 0x2b98, 0x080c, 0x3ef0, 0x0904, 0x2b9b,
++	0x6004, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1120, 0x7888, 0x9005,
++	0x0904, 0x2b68, 0x00c6, 0x080c, 0x3eb9, 0x00ce, 0x0904, 0x2b98,
++	0x9006, 0x6866, 0x6832, 0x6868, 0xc0fd, 0x686a, 0x080c, 0xab41,
++	0x0904, 0x2b98, 0x7007, 0x0003, 0x701b, 0x40ce, 0x0005, 0x00f6,
++	0x2d78, 0x2061, 0x1100, 0x6000, 0x9086, 0x0003, 0x2009, 0x0007,
++	0x11d0, 0x080c, 0x58c6, 0x2009, 0x0008, 0x11a8, 0x080c, 0x3eee,
++	0x01b0, 0x6004, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1118, 0x789c,
++	0x9005, 0x01b8, 0x2f68, 0x6868, 0xc0fc, 0x686a, 0x080c, 0xab41,
++	0x11c8, 0x2009, 0x0003, 0x7897, 0x4005, 0x799a, 0x0010, 0x7897,
++	0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x2f68, 0x00fe,
++	0x0005, 0x7897, 0x4000, 0x9006, 0x918d, 0x0001, 0x2008, 0x2f68,
++	0x00fe, 0x0005, 0x9006, 0x2f68, 0x00fe, 0x0005, 0x6830, 0x9086,
++	0x0100, 0x1904, 0x2b68, 0x0804, 0x47e3, 0x2001, 0x1100, 0x2004,
++	0x9086, 0x0003, 0x1904, 0x2b98, 0x7f84, 0x7a8c, 0x7b88, 0x7c9c,
++	0x7d98, 0x080c, 0x3eb9, 0x0904, 0x2b98, 0x900e, 0x2130, 0x7122,
++	0x712e, 0x9d80, 0x0005, 0x7026, 0x20a0, 0x20e1, 0x0001, 0x20e9,
++	0x0001, 0x080c, 0x5608, 0x1904, 0x4149, 0x6004, 0x90c4, 0x00ff,
++	0x98c6, 0x0006, 0x0130, 0x90c4, 0xff00, 0x98c6, 0x0600, 0x1904,
++	0x4149, 0x080c, 0x58c6, 0x1130, 0x080c, 0x57d6, 0x1118, 0xd79c,
++	0x0904, 0x4149, 0xd794, 0x1110, 0xd784, 0x0158, 0x9c80, 0x0006,
++	0x2098, 0x3400, 0x20a9, 0x0004, 0x4003, 0x080c, 0x3ce8, 0xd794,
++	0x0148, 0x9c80, 0x000a, 0x2098, 0x3400, 0x20a9, 0x0004, 0x4003,
++	0x080c, 0x3ce8, 0x21a2, 0x3400, 0x8000, 0x20a0, 0xd794, 0x01d8,
++	0x9c80, 0x0000, 0x2098, 0x20a9, 0x0002, 0x4003, 0x9c80, 0x0003,
++	0x2098, 0x20a9, 0x0001, 0x4005, 0x9c80, 0x0004, 0x2098, 0x3400,
++	0x20a9, 0x0002, 0x4003, 0x080c, 0x3cda, 0x9c80, 0x0026, 0x2098,
++	0x20a9, 0x0002, 0x4003, 0xd794, 0x0110, 0x96b0, 0x000b, 0x96b0,
++	0x0005, 0x8108, 0x2001, 0x1136, 0x2004, 0xd0ac, 0x0118, 0x9186,
++	0x0100, 0x0040, 0xd78c, 0x0120, 0x9186, 0x0100, 0x0170, 0x0018,
++	0x9186, 0x007e, 0x0150, 0xd794, 0x0118, 0x9686, 0x0020, 0x0010,
++	0x9686, 0x0028, 0x0150, 0x0804, 0x40ed, 0x86ff, 0x1120, 0x7120,
++	0x810b, 0x0804, 0x2b68, 0x702f, 0x0001, 0x711e, 0x7020, 0x9600,
++	0x7022, 0x772a, 0x2061, 0x11ea, 0x6007, 0x0000, 0x6616, 0x7024,
++	0x600f, 0x0001, 0x6012, 0x622a, 0x632e, 0x6432, 0x6536, 0x2c10,
++	0x080c, 0x0f22, 0x7007, 0x0002, 0x701b, 0x4187, 0x0005, 0x702c,
++	0x9005, 0x1168, 0x711c, 0x7024, 0x20a0, 0x7728, 0x9036, 0x2061,
++	0x11ea, 0x6228, 0x632c, 0x6430, 0x6534, 0x0804, 0x40ed, 0x7120,
++	0x810b, 0x0804, 0x2b68, 0x2029, 0x007e, 0x7984, 0x7a88, 0x7b8c,
++	0x7c98, 0x9184, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x2b9b,
++	0x9502, 0x0a04, 0x2b9b, 0x9184, 0x00ff, 0x90e2, 0x0020, 0x0a04,
++	0x2b9b, 0x9502, 0x0a04, 0x2b9b, 0x9284, 0xff00, 0x8007, 0x90e2,
++	0x0020, 0x0a04, 0x2b9b, 0x9502, 0x0a04, 0x2b9b, 0x9284, 0x00ff,
++	0x90e2, 0x0020, 0x0a04, 0x2b9b, 0x9502, 0x0a04, 0x2b9b, 0x9384,
++	0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x2b9b, 0x9502, 0x0a04,
++	0x2b9b, 0x9384, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x2b9b, 0x9502,
++	0x0a04, 0x2b9b, 0x9484, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04,
++	0x2b9b, 0x9502, 0x0a04, 0x2b9b, 0x9484, 0x00ff, 0x90e2, 0x0020,
++	0x0a04, 0x2b9b, 0x9502, 0x0a04, 0x2b9b, 0x2061, 0x12c3, 0x6102,
++	0x6206, 0x630a, 0x640e, 0x0804, 0x2b68, 0x0006, 0x2001, 0x1153,
++	0x2004, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x2001, 0x1172, 0x2004,
++	0xd0bc, 0x000e, 0x0005, 0x616c, 0x7a84, 0x6300, 0x82ff, 0x1118,
++	0x7986, 0x0804, 0x2b68, 0x83ff, 0x1904, 0x2b9b, 0x2001, 0xfff0,
++	0x9200, 0x1a04, 0x2b9b, 0x2019, 0xffff, 0x6070, 0x9302, 0x9200,
++	0x0a04, 0x2b9b, 0x7986, 0x626e, 0x0804, 0x2b68, 0x2001, 0x1100,
++	0x2004, 0x9086, 0x0003, 0x1904, 0x2b98, 0x7c88, 0x7d84, 0x7e98,
++	0x7f8c, 0x080c, 0x3eb9, 0x0904, 0x2b98, 0x900e, 0x901e, 0x7322,
++	0x732e, 0x9d80, 0x0003, 0x7026, 0x20a0, 0x91e0, 0x1000, 0x2c64,
++	0x8cff, 0x01d8, 0x6004, 0x9084, 0x00ff, 0x9086, 0x0006, 0x0130,
++	0x6004, 0x9084, 0xff00, 0x9086, 0x0600, 0x1178, 0x00d6, 0x3468,
++	0x6014, 0x206a, 0x8d68, 0x6010, 0x8007, 0x9105, 0x8007, 0x206a,
++	0x8d68, 0x2da0, 0x00de, 0x9398, 0x0002, 0x8108, 0x9182, 0x00ff,
++	0x0120, 0x9386, 0x002a, 0x0148, 0x08c0, 0x83ff, 0x1120, 0x7120,
++	0x810c, 0x0804, 0x2b68, 0x702f, 0x0001, 0x711e, 0x7020, 0x9300,
++	0x7022, 0x2061, 0x11ea, 0x6007, 0x0000, 0x6316, 0x7024, 0x6012,
++	0x600f, 0x0001, 0x642a, 0x652e, 0x6632, 0x6736, 0x2c10, 0x080c,
++	0x0f22, 0x7007, 0x0002, 0x701b, 0x427e, 0x0005, 0x702c, 0x9005,
++	0x1160, 0x711c, 0x7024, 0x20a0, 0x901e, 0x2061, 0x11ea, 0x6428,
++	0x652c, 0x6630, 0x6734, 0x0804, 0x4235, 0x7120, 0x810c, 0x0804,
++	0x2b68, 0x00f6, 0x2d78, 0x00e6, 0x2001, 0x1100, 0x2004, 0x9086,
++	0x0003, 0x2009, 0x0007, 0x1904, 0x4311, 0x2071, 0x1193, 0x7454,
++	0x84ff, 0x2009, 0x000e, 0x1904, 0x4311, 0x7c9c, 0x7d98, 0x7ea4,
++	0x7fa0, 0x080c, 0x0e9d, 0x2009, 0x0002, 0x0904, 0x4311, 0x2d00,
++	0x7056, 0x900e, 0x901e, 0x734e, 0x735a, 0x9d80, 0x0003, 0x7052,
++	0x20a0, 0x91e0, 0x1000, 0x2c64, 0x8cff, 0x01d8, 0x6004, 0x9084,
++	0x00ff, 0x9086, 0x0006, 0x0130, 0x6004, 0x9084, 0xff00, 0x9086,
++	0x0600, 0x1178, 0x00d6, 0x3468, 0x6014, 0x206a, 0x8d68, 0x6010,
++	0x8007, 0x9105, 0x8007, 0x206a, 0x8d68, 0x2da0, 0x00de, 0x9398,
++	0x0002, 0x8108, 0x9182, 0x00ff, 0x0120, 0x9386, 0x002a, 0x01b8,
++	0x08c0, 0x83ff, 0x1190, 0x714c, 0x810c, 0x7897, 0x4000, 0x799a,
++	0x7154, 0x81ff, 0x090c, 0x0d7e, 0x2168, 0x080c, 0x0ecf, 0x9006,
++	0x7056, 0x918d, 0x0001, 0x2008, 0x0420, 0x705b, 0x0001, 0x714a,
++	0x704c, 0x9300, 0x704e, 0x2061, 0x11fb, 0x6007, 0x0000, 0x6316,
++	0x7050, 0x6012, 0x600f, 0x0001, 0x642a, 0x652e, 0x6632, 0x6736,
++	0x603b, 0x431d, 0x2f00, 0x603e, 0x2c10, 0x080c, 0x0f22, 0x9006,
++	0x0040, 0x7897, 0x4005, 0x799a, 0x900e, 0x9085, 0x0001, 0x2001,
++	0x0030, 0x00ee, 0x2f68, 0x00fe, 0x0005, 0x00f6, 0x603c, 0x907d,
++	0x090c, 0x0d7e, 0x00e6, 0x2071, 0x1193, 0x6008, 0x908e, 0x0100,
++	0x0138, 0x787b, 0x0030, 0x7883, 0x0000, 0x7897, 0x4002, 0x00a8,
++	0x7058, 0x9005, 0x1148, 0x7148, 0x7050, 0x20a0, 0x901e, 0x6428,
++	0x652c, 0x6630, 0x6734, 0x0400, 0x787b, 0x0000, 0x7883, 0x0000,
++	0x7897, 0x4000, 0x714c, 0x810c, 0x799a, 0x7154, 0x81ff, 0x090c,
++	0x0d7e, 0x2168, 0x080c, 0x0ecf, 0x7057, 0x0000, 0x2f68, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x5b76, 0x012e, 0x603b, 0x0000, 0x603f,
++	0x0000, 0x00ee, 0x00fe, 0x0005, 0x91e0, 0x1000, 0x2c64, 0x8cff,
++	0x01d8, 0x6004, 0x9084, 0x00ff, 0x9086, 0x0006, 0x0130, 0x6004,
++	0x9084, 0xff00, 0x9086, 0x0600, 0x1178, 0x00d6, 0x3468, 0x6014,
++	0x206a, 0x8d68, 0x6010, 0x8007, 0x9105, 0x8007, 0x206a, 0x8d68,
++	0x2da0, 0x00de, 0x9398, 0x0002, 0x8108, 0x9182, 0x00ff, 0x0120,
++	0x9386, 0x002a, 0x0520, 0x08c0, 0x83ff, 0x11f8, 0x714c, 0x810c,
++	0x799a, 0x7897, 0x4000, 0x7154, 0x81ff, 0x090c, 0x0d7e, 0x2168,
++	0x080c, 0x0ecf, 0x9006, 0x7056, 0x918d, 0x0001, 0x2008, 0x2f68,
++	0x0126, 0x2091, 0x8000, 0x080c, 0x5b76, 0x012e, 0x2061, 0x11fb,
++	0x603b, 0x0000, 0x603f, 0x0000, 0x0088, 0x705b, 0x0001, 0x714a,
++	0x704c, 0x9300, 0x704e, 0x2061, 0x11fb, 0x6316, 0x642a, 0x652e,
++	0x6632, 0x6736, 0x2c10, 0x080c, 0x0f22, 0x9006, 0x00ee, 0x00fe,
++	0x0005, 0x81ff, 0x1904, 0x2b98, 0x60d8, 0xd0ac, 0x1118, 0xd09c,
++	0x0904, 0x2b98, 0x080c, 0x3eb9, 0x0904, 0x2b98, 0x7984, 0x7a8c,
++	0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x3f0c, 0x701b,
++	0x43d2, 0x0005, 0x00d6, 0x9de8, 0x0019, 0x6828, 0x90be, 0x7000,
++	0x0148, 0x90be, 0x7100, 0x0130, 0x90be, 0x7200, 0x0118, 0x00de,
++	0x0804, 0x2b9b, 0x6820, 0x6924, 0x080c, 0x1f63, 0x1510, 0x080c,
++	0x55b3, 0x11f8, 0x7122, 0x6612, 0x6516, 0x6e18, 0x00c6, 0x080c,
++	0x3eb9, 0x01b8, 0x080c, 0x3eb9, 0x01a0, 0x00ce, 0x00de, 0x6867,
++	0x0000, 0x6868, 0xc0fd, 0x686a, 0x6823, 0x0000, 0x6804, 0x2068,
++	0x080c, 0xaaa2, 0x0904, 0x2b98, 0x7007, 0x0003, 0x701b, 0x440c,
++	0x0005, 0x00de, 0x0804, 0x2b98, 0x7120, 0x080c, 0x2955, 0x6820,
++	0x9086, 0x8001, 0x0904, 0x2b98, 0x2d00, 0x701e, 0x6804, 0x9080,
++	0x0002, 0x0006, 0x20a9, 0x002a, 0x2098, 0x20a0, 0x080c, 0x504f,
++	0x000e, 0x9de8, 0x0019, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x2061,
++	0x11ea, 0x6007, 0x0000, 0x6e00, 0x6f28, 0x97c6, 0x7000, 0x1108,
++	0x0018, 0x97c6, 0x7100, 0x1150, 0x96c2, 0x0004, 0x0a04, 0x2b9b,
++	0x2009, 0x0004, 0x2039, 0x0001, 0x0804, 0x3f0f, 0x97c6, 0x7200,
++	0x1904, 0x2b9b, 0x96c2, 0x0054, 0x0a04, 0x2b9b, 0x600f, 0x0001,
++	0x6012, 0x6017, 0x002a, 0x622a, 0x632e, 0x6432, 0x6536, 0x2c10,
++	0x080c, 0x0f22, 0x7007, 0x0002, 0x701b, 0x4457, 0x0005, 0x701c,
++	0x2068, 0x6804, 0x9080, 0x0001, 0x2004, 0x9080, 0x0002, 0x0006,
++	0x20a9, 0x002a, 0x2098, 0x20a0, 0x080c, 0x504f, 0x000e, 0x2061,
++	0x11ea, 0x6228, 0x632c, 0x6430, 0x6534, 0x2039, 0x0001, 0x2009,
++	0x002a, 0x0804, 0x3f0f, 0x81ff, 0x1904, 0x2b98, 0x798c, 0x2001,
++	0x12a9, 0x2102, 0x080c, 0x3ece, 0x0904, 0x2b9b, 0x080c, 0x56ca,
++	0x0904, 0x2b98, 0x0126, 0x2091, 0x8000, 0x080c, 0x5782, 0x012e,
++	0x0804, 0x2b68, 0x00f6, 0x69a0, 0x2001, 0x12a9, 0x2102, 0x2d78,
++	0x080c, 0x3ede, 0x0170, 0x080c, 0x56ca, 0x2009, 0x0002, 0x0128,
++	0x080c, 0x5782, 0x1180, 0x2009, 0x0003, 0x7897, 0x4005, 0x799a,
++	0x0010, 0x7897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030,
++	0x2f68, 0x00fe, 0x0005, 0x7897, 0x4000, 0x900e, 0x9085, 0x0001,
++	0x2001, 0x0000, 0x2f68, 0x00fe, 0x0005, 0x7884, 0xd08c, 0x1118,
++	0xd084, 0x0904, 0x39e5, 0x080c, 0x3ef0, 0x0904, 0x2b9b, 0x00c6,
++	0x080c, 0x3eb9, 0x00ce, 0x1120, 0x2009, 0x0002, 0x0804, 0x2b98,
++	0x6004, 0x9084, 0x00ff, 0x9086, 0x0006, 0x0128, 0x908e, 0x0004,
++	0x0110, 0x908e, 0x0005, 0x15b8, 0x7884, 0xd08c, 0x0120, 0x6000,
++	0xc08c, 0x6002, 0x0030, 0x2001, 0x1153, 0x2004, 0xd0b4, 0x0904,
++	0x3a24, 0x7884, 0x9084, 0xff00, 0x908e, 0x7e00, 0x0904, 0x3a24,
++	0x908e, 0x7f00, 0x0904, 0x3a24, 0x908e, 0x8000, 0x0904, 0x3a24,
++	0x6000, 0xd08c, 0x1904, 0x3a24, 0x6867, 0x0000, 0x6868, 0xc0fd,
++	0x686a, 0x080c, 0xaabe, 0x1120, 0x2009, 0x0003, 0x0804, 0x2b98,
++	0x7007, 0x0003, 0x701b, 0x4505, 0x0005, 0x080c, 0x3ef0, 0x0904,
++	0x2b9b, 0x0804, 0x3a24, 0x080c, 0x2982, 0x0108, 0x0005, 0x2009,
++	0x1133, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x2b98,
++	0x2001, 0x1100, 0x2004, 0x9086, 0x0003, 0x0120, 0x2009, 0x0007,
++	0x0804, 0x2b98, 0x080c, 0x58c6, 0x0120, 0x2009, 0x0008, 0x0804,
++	0x2b98, 0x609c, 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x3a24, 0x9006,
++	0x6866, 0x6832, 0x6868, 0xc0fd, 0x686a, 0x080c, 0xab41, 0x1120,
++	0x2009, 0x0003, 0x0804, 0x2b98, 0x7007, 0x0003, 0x701b, 0x4541,
++	0x0005, 0x6830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804,
++	0x47e3, 0x080c, 0x3ef0, 0x0904, 0x2b9b, 0x0804, 0x44d4, 0x81ff,
++	0x2009, 0x0001, 0x1904, 0x2b98, 0x6000, 0x9086, 0x0003, 0x2009,
++	0x0007, 0x1904, 0x2b98, 0x080c, 0x58c6, 0x2009, 0x0008, 0x1904,
++	0x2b98, 0x080c, 0x3ef0, 0x0904, 0x2b9b, 0x6004, 0x9084, 0x00ff,
++	0x9086, 0x0006, 0x2009, 0x0009, 0x1904, 0x2b98, 0x00c6, 0x080c,
++	0x3eb9, 0x00ce, 0x2009, 0x0002, 0x0904, 0x2b98, 0x9006, 0x6866,
++	0x6832, 0x6868, 0xc0fd, 0x686a, 0x7988, 0x9194, 0xff00, 0x918c,
++	0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, 0x6952, 0x798c, 0x6956,
++	0x0038, 0x928e, 0x0100, 0x1904, 0x2b9b, 0xc0e5, 0x6952, 0x6956,
++	0x683e, 0x080c, 0xad71, 0x2009, 0x0003, 0x0904, 0x2b98, 0x7007,
++	0x0003, 0x701b, 0x459c, 0x0005, 0x6830, 0x9086, 0x0100, 0x2009,
++	0x0004, 0x0904, 0x2b98, 0x0804, 0x2b68, 0x81ff, 0x2009, 0x0001,
++	0x1904, 0x2b98, 0x6000, 0x9086, 0x0003, 0x2009, 0x0007, 0x1904,
++	0x2b98, 0x080c, 0x3ef0, 0x0904, 0x2b9b, 0x6004, 0x9084, 0x00ff,
++	0x9086, 0x0006, 0x2009, 0x0009, 0x1904, 0x2b98, 0x00c6, 0x080c,
++	0x3eb9, 0x00ce, 0x2009, 0x0002, 0x0904, 0x2b98, 0x9d80, 0x001b,
++	0x2039, 0x0001, 0x2009, 0x0008, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
++	0x080c, 0x3f0c, 0x701b, 0x45d5, 0x0005, 0x00d6, 0x9de8, 0x001b,
++	0x6800, 0x9086, 0x0500, 0x1138, 0x6804, 0x9005, 0x1120, 0x6808,
++	0x9084, 0xff00, 0x0118, 0x00de, 0x1904, 0x2b9b, 0x00de, 0x6866,
++	0x6832, 0x6868, 0xc0fd, 0x686a, 0x00c6, 0x080c, 0x3ef0, 0x1118,
++	0x00ce, 0x0804, 0x2b9b, 0x2009, 0x0043, 0x080c, 0xadda, 0x2009,
++	0x0003, 0x00ce, 0x0904, 0x2b98, 0x7007, 0x0003, 0x701b, 0x4601,
++	0x0005, 0x6830, 0x9086, 0x0100, 0x2009, 0x0004, 0x0904, 0x2b98,
++	0x0804, 0x2b68, 0x00f6, 0x00c6, 0x2d78, 0x2061, 0x1100, 0x6000,
++	0x9086, 0x0003, 0x2009, 0x0007, 0x1528, 0x080c, 0x3eee, 0x0530,
++	0x6004, 0x9084, 0x00ff, 0x9086, 0x0006, 0x2009, 0x0009, 0x11d0,
++	0x9fe8, 0x0031, 0x6800, 0x9086, 0x0500, 0x11c0, 0x6804, 0x9005,
++	0x11a8, 0x6808, 0x9084, 0xff00, 0x1188, 0x080c, 0x3eee, 0x1108,
++	0x0068, 0x2f68, 0x2009, 0x004b, 0x080c, 0xadda, 0x2009, 0x0003,
++	0x0108, 0x0078, 0x7897, 0x4005, 0x799a, 0x0010, 0x7897, 0x4006,
++	0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ce, 0x2f68, 0x00fe,
++	0x0005, 0x9006, 0x0cd0, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804,
++	0x2b98, 0x6000, 0x9086, 0x0003, 0x0120, 0x2009, 0x0007, 0x0804,
++	0x2b98, 0x7e84, 0x860f, 0x918c, 0x00ff, 0x96b4, 0x00ff, 0x080c,
++	0x5608, 0x1904, 0x2b9b, 0x9186, 0x007f, 0x0150, 0x6004, 0x9084,
++	0x00ff, 0x9086, 0x0006, 0x0120, 0x2009, 0x0009, 0x0804, 0x2b98,
++	0x00c6, 0x080c, 0x3eb9, 0x00ce, 0x1120, 0x2009, 0x0002, 0x0804,
++	0x2b98, 0x6867, 0x0000, 0x6868, 0xc0fd, 0x686a, 0x2001, 0x0100,
++	0x8007, 0x680a, 0x080c, 0xaad9, 0x1120, 0x2009, 0x0003, 0x0804,
++	0x2b98, 0x7007, 0x0003, 0x701b, 0x468e, 0x0005, 0x6808, 0x8007,
++	0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x2b98, 0x68e0,
++	0x6866, 0x6810, 0x8007, 0x9084, 0x00ff, 0x800c, 0x6814, 0x8007,
++	0x9084, 0x00ff, 0x8004, 0x9080, 0x0002, 0x9108, 0x9d80, 0x0004,
++	0x2039, 0x0001, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x3f0f,
++	0x080c, 0x3eb9, 0x1120, 0x2009, 0x0002, 0x0804, 0x2b98, 0x7984,
++	0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x0110, 0x0804,
++	0x2b9b, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039,
++	0x0001, 0x080c, 0x3f0c, 0x701b, 0x46ce, 0x0005, 0x2001, 0x112c,
++	0x2003, 0x0001, 0x9d80, 0x0019, 0x2098, 0x20e1, 0x0001, 0x20a9,
++	0x001a, 0x20a1, 0x12ea, 0x20e9, 0x0001, 0x4003, 0x0804, 0x2b68,
++	0x080c, 0x3eb9, 0x1120, 0x2009, 0x0002, 0x0804, 0x2b98, 0x7984,
++	0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x0110, 0x0804,
++	0x2b9b, 0x2099, 0x12ea, 0x20a0, 0x20e9, 0x0001, 0x20a9, 0x001a,
++	0x20e1, 0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c,
++	0x7d98, 0x2039, 0x0001, 0x0804, 0x3f0f, 0x7884, 0x908a, 0x1000,
++	0x1a04, 0x2b9b, 0x0126, 0x2091, 0x8000, 0x8003, 0x800b, 0x810b,
++	0x9108, 0x00c6, 0x2061, 0x1317, 0x6142, 0x00ce, 0x012e, 0x0804,
++	0x2b68, 0x00c6, 0x080c, 0x62e4, 0x1180, 0x2001, 0x12a8, 0x2003,
++	0x0001, 0x2001, 0x1100, 0x2003, 0x0001, 0x9085, 0x0001, 0x080c,
++	0x6331, 0x080c, 0x621a, 0x080c, 0x0d7e, 0x2061, 0x1100, 0x6030,
++	0xc09d, 0x6032, 0x080c, 0x4faa, 0x00ce, 0x0005, 0x00c6, 0x2001,
++	0x1100, 0x2004, 0x908e, 0x0000, 0x0904, 0x2b98, 0x7884, 0x9005,
++	0x0188, 0x7888, 0x2061, 0x12d6, 0x2c0c, 0x2062, 0x080c, 0x2328,
++	0x01a0, 0x080c, 0x2330, 0x0188, 0x080c, 0x2338, 0x0170, 0x2162,
++	0x0804, 0x2b9b, 0x2061, 0x0100, 0x6038, 0x9086, 0x0007, 0x1118,
++	0x2009, 0x0001, 0x0010, 0x2009, 0x0000, 0x7884, 0x9086, 0x0002,
++	0x1548, 0x2061, 0x0100, 0x6028, 0xc09c, 0x602a, 0x0026, 0x2011,
++	0x0003, 0x080c, 0x88e2, 0x2011, 0x0002, 0x080c, 0x88ec, 0x002e,
++	0x080c, 0x87a2, 0x0036, 0x901e, 0x080c, 0x8847, 0x003e, 0x60e3,
++	0x0000, 0x080c, 0xc44e, 0x080c, 0xc469, 0x9085, 0x0001, 0x080c,
++	0x6331, 0x9006, 0x080c, 0x2401, 0x2001, 0x1100, 0x2003, 0x0004,
++	0x6027, 0x0008, 0x00ce, 0x0804, 0x2b68, 0x81ff, 0x0120, 0x2009,
++	0x0001, 0x0804, 0x2b98, 0x6000, 0x9086, 0x0003, 0x0120, 0x2009,
++	0x0007, 0x0804, 0x2b98, 0x7e84, 0x860f, 0x918c, 0x00ff, 0x96b4,
++	0x00ff, 0x080c, 0x5608, 0x1904, 0x2b9b, 0x9186, 0x007f, 0x0150,
++	0x6004, 0x9084, 0x00ff, 0x9086, 0x0006, 0x0120, 0x2009, 0x0009,
++	0x0804, 0x2b98, 0x00c6, 0x080c, 0x3eb9, 0x00ce, 0x1120, 0x2009,
++	0x0002, 0x0804, 0x2b98, 0x6867, 0x0000, 0x6868, 0xc0fd, 0x686a,
++	0x080c, 0xaaf5, 0x1120, 0x2009, 0x0003, 0x0804, 0x2b98, 0x7007,
++	0x0003, 0x701b, 0x47cc, 0x0005, 0x6830, 0x9086, 0x0100, 0x1120,
++	0x2009, 0x0004, 0x0804, 0x2b98, 0x68e0, 0x6866, 0x6834, 0x8007,
++	0x800c, 0x9d80, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039,
++	0x0001, 0x0804, 0x3f0f, 0x6898, 0x9086, 0x000d, 0x1904, 0x2b98,
++	0x2021, 0x4005, 0x0126, 0x2091, 0x8000, 0x0e04, 0x47f0, 0x0010,
++	0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011,
++	0x0010, 0x7833, 0x0010, 0x7883, 0x4005, 0x6998, 0x7986, 0x69a4,
++	0x799a, 0x69a8, 0x799e, 0x080c, 0x3eff, 0x2091, 0x4080, 0x2001,
++	0x0089, 0x2004, 0xd084, 0x190c, 0x0fcd, 0x7007, 0x0001, 0x2091,
++	0x5000, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061,
++	0x1317, 0x7984, 0x6152, 0x614e, 0x6057, 0x0000, 0x604b, 0x0009,
++	0x7898, 0x606a, 0x789c, 0x6066, 0x7888, 0x6062, 0x788c, 0x605e,
++	0x2061, 0x12aa, 0x2001, 0x132c, 0x6012, 0x600f, 0x0001, 0x6017,
++	0x0001, 0x601b, 0x0002, 0x6007, 0x0000, 0x603b, 0x0000, 0x00ce,
++	0x012e, 0x0804, 0x2b68, 0x0126, 0x0156, 0x0136, 0x0146, 0x01c6,
++	0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2061, 0x0100, 0x2069,
++	0x0200, 0x2071, 0x1100, 0x6044, 0xd0a4, 0x11e8, 0xd084, 0x0118,
++	0x080c, 0x49ce, 0x0068, 0xd08c, 0x0118, 0x080c, 0x48e1, 0x0040,
++	0xd094, 0x0118, 0x080c, 0x48b4, 0x0018, 0xd09c, 0x0108, 0x0099,
++	0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e,
++	0x015e, 0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, 0xc19d,
++	0x612a, 0x001e, 0x0c68, 0x624c, 0x9286, 0xf0f0, 0x1150, 0x6048,
++	0x9086, 0xf0f0, 0x0130, 0x624a, 0x6043, 0x0090, 0x6043, 0x0010,
++	0x0490, 0x9294, 0xff00, 0x9296, 0xf700, 0x0178, 0x7134, 0xd1a4,
++	0x1160, 0x6240, 0x9295, 0x0100, 0x6242, 0x9294, 0x0010, 0x0128,
++	0x2009, 0x00f7, 0x080c, 0x507b, 0x00f0, 0x6040, 0x9084, 0x0010,
++	0x9085, 0x0140, 0x6042, 0x6043, 0x0000, 0x707f, 0x0000, 0x709b,
++	0x0001, 0x70c3, 0x0000, 0x70db, 0x0000, 0x2009, 0x1580, 0x200b,
++	0x0000, 0x708f, 0x0000, 0x7083, 0x000f, 0x2009, 0x000f, 0x2011,
++	0x4f50, 0x080c, 0x7283, 0x0005, 0x2001, 0x1174, 0x2004, 0xd08c,
++	0x0110, 0x7057, 0xffff, 0x7080, 0x9005, 0x1510, 0x2011, 0x4f50,
++	0x080c, 0x71fa, 0x6040, 0x9094, 0x0010, 0x9285, 0x0020, 0x6042,
++	0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, 0x48ca, 0x6242,
++	0x7093, 0x0000, 0x6040, 0x9094, 0x0010, 0x9285, 0x0080, 0x6042,
++	0x6242, 0x0030, 0x6242, 0x7093, 0x0000, 0x7087, 0x0000, 0x0000,
++	0x0005, 0x7084, 0x908a, 0x0003, 0x1a0c, 0x0d7e, 0x000b, 0x0005,
++	0x48eb, 0x4932, 0x49cd, 0x00f6, 0x7087, 0x0001, 0x6803, 0x00fc,
++	0x20a9, 0x0004, 0x6800, 0x9084, 0x00fc, 0x0120, 0x1f04, 0x48f2,
++	0x080c, 0x0d7e, 0x68a0, 0x68a2, 0x689c, 0x689e, 0x6898, 0x689a,
++	0xa001, 0x6803, 0x1600, 0x6837, 0x0020, 0x080c, 0x50d5, 0x2079,
++	0x1500, 0x7833, 0x1101, 0x7837, 0x0000, 0x20e1, 0x0001, 0x2099,
++	0x1105, 0x20e9, 0x0001, 0x20a1, 0x150e, 0x20a9, 0x0004, 0x4003,
++	0x080c, 0x8dc3, 0x20e1, 0x0001, 0x2099, 0x1500, 0x20e9, 0x0000,
++	0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x600f,
++	0x0000, 0x080c, 0x4f86, 0x00fe, 0x9006, 0x708a, 0x6043, 0x0008,
++	0x6042, 0x0005, 0x00f6, 0x7088, 0x708b, 0x0000, 0x9025, 0x0904,
++	0x49aa, 0x6020, 0xd0b4, 0x1904, 0x49a8, 0x7198, 0x81ff, 0x0904,
++	0x4996, 0x9486, 0x000c, 0x1904, 0x49a3, 0x9480, 0x0018, 0x8004,
++	0x20a8, 0x080c, 0x50ce, 0x2011, 0x0260, 0x2019, 0x1500, 0x220c,
++	0x2304, 0x9106, 0x11e8, 0x8210, 0x8318, 0x1f04, 0x494f, 0x6043,
++	0x0004, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061,
++	0x0100, 0x6043, 0x0006, 0x7087, 0x0002, 0x7093, 0x0002, 0x2009,
++	0x07d0, 0x2011, 0x4f57, 0x080c, 0x7283, 0x080c, 0x50d5, 0x04c0,
++	0x080c, 0x50ce, 0x2079, 0x0260, 0x7930, 0x918e, 0x1101, 0x1558,
++	0x7834, 0x9005, 0x1540, 0x7900, 0x918c, 0x00ff, 0x1118, 0x7804,
++	0x9005, 0x0190, 0x080c, 0x50ce, 0x2011, 0x026e, 0x2019, 0x1105,
++	0x20a9, 0x0004, 0x220c, 0x2304, 0x9102, 0x0230, 0x11a0, 0x8210,
++	0x8318, 0x1f04, 0x498a, 0x0078, 0x709b, 0x0000, 0x080c, 0x50ce,
++	0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0001, 0x20a1, 0x1500,
++	0x20a9, 0x0014, 0x4003, 0x6043, 0x0008, 0x6043, 0x0000, 0x0010,
++	0x00fe, 0x0005, 0x6040, 0x9085, 0x0100, 0x6042, 0x6020, 0xd0b4,
++	0x1db8, 0x080c, 0x8dc3, 0x20e1, 0x0001, 0x2099, 0x1500, 0x20e9,
++	0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c,
++	0x2011, 0x130e, 0x2013, 0x0000, 0x708b, 0x0000, 0x60a3, 0x0056,
++	0x60a7, 0x9575, 0x080c, 0x8599, 0x08d8, 0x0005, 0x7090, 0x908a,
++	0x001d, 0x1a0c, 0x0d7e, 0x000b, 0x0005, 0x49ff, 0x4a12, 0x4a3b,
++	0x4a5b, 0x4a81, 0x4ab0, 0x4ad6, 0x4b0e, 0x4b34, 0x4b62, 0x4b9b,
++	0x4bd3, 0x4bf1, 0x4c1c, 0x4c3e, 0x4c55, 0x4c5d, 0x4c91, 0x4cb7,
++	0x4ce6, 0x4d0c, 0x4d44, 0x4d7e, 0x4db3, 0x4dd1, 0x4e2a, 0x4e4c,
++	0x4e76, 0x4e76, 0x00c6, 0x2061, 0x1100, 0x6003, 0x0007, 0x2061,
++	0x0100, 0x6004, 0x9084, 0xfff9, 0x6006, 0x00ce, 0x0005, 0x2061,
++	0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043,
++	0x0002, 0x7093, 0x0001, 0x2009, 0x07d0, 0x2011, 0x4f57, 0x080c,
++	0x7283, 0x0005, 0x00f6, 0x7088, 0x9086, 0x0014, 0x1510, 0x6042,
++	0x6020, 0xd0b4, 0x11f0, 0x080c, 0x50ce, 0x2079, 0x0260, 0x7a30,
++	0x9296, 0x1102, 0x11a0, 0x7834, 0x9005, 0x1188, 0x7a38, 0xd2fc,
++	0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x2011, 0x4f57,
++	0x080c, 0x71fa, 0x7093, 0x0010, 0x080c, 0x4c5d, 0x0010, 0x708b,
++	0x0000, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x0003, 0x6043, 0x0004,
++	0x2011, 0x4f57, 0x080c, 0x71fa, 0x080c, 0x505d, 0x2079, 0x0240,
++	0x7833, 0x1102, 0x7837, 0x0000, 0x20a9, 0x0008, 0x9f88, 0x000e,
++	0x200b, 0x0000, 0x8108, 0x1f04, 0x4a50, 0x60c3, 0x0014, 0x080c,
++	0x4f86, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x0500, 0x2011,
++	0x4f57, 0x080c, 0x71fa, 0x9086, 0x0014, 0x11b8, 0x080c, 0x50ce,
++	0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x1178, 0x7834, 0x9005,
++	0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3,
++	0x0001, 0x7093, 0x0004, 0x0029, 0x0010, 0x080c, 0x50aa, 0x00fe,
++	0x0005, 0x00f6, 0x7093, 0x0005, 0x080c, 0x505d, 0x2079, 0x0240,
++	0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x50ce, 0x080c, 0x50b1,
++	0x1170, 0x707c, 0x9005, 0x1158, 0x7154, 0x9186, 0xffff, 0x0138,
++	0x2011, 0x0008, 0x080c, 0x4f04, 0x0168, 0x080c, 0x5092, 0x20a9,
++	0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1,
++	0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x4f86, 0x00fe, 0x0005,
++	0x00f6, 0x7088, 0x9005, 0x0500, 0x2011, 0x4f57, 0x080c, 0x71fa,
++	0x9086, 0x0014, 0x11b8, 0x080c, 0x50ce, 0x2079, 0x0260, 0x7a30,
++	0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc,
++	0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7093, 0x0006,
++	0x0029, 0x0010, 0x080c, 0x50aa, 0x00fe, 0x0005, 0x00f6, 0x7093,
++	0x0007, 0x080c, 0x505d, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837,
++	0x0000, 0x080c, 0x50ce, 0x080c, 0x50b1, 0x11b8, 0x707c, 0x9005,
++	0x11a0, 0x715c, 0x9186, 0xffff, 0x0180, 0x9180, 0x298c, 0x200d,
++	0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x4f04, 0x0180,
++	0x080c, 0x41fc, 0x0110, 0x080c, 0x1fad, 0x20a9, 0x0008, 0x20e1,
++	0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003,
++	0x60c3, 0x0014, 0x080c, 0x4f86, 0x00fe, 0x0005, 0x00f6, 0x7088,
++	0x9005, 0x0500, 0x2011, 0x4f57, 0x080c, 0x71fa, 0x9086, 0x0014,
++	0x11b8, 0x080c, 0x50ce, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104,
++	0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0,
++	0x9005, 0x1110, 0x70c3, 0x0001, 0x7093, 0x0008, 0x0029, 0x0010,
++	0x080c, 0x50aa, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x0009, 0x080c,
++	0x505d, 0x2079, 0x0240, 0x7833, 0x1105, 0x7837, 0x0100, 0x080c,
++	0x50b1, 0x1150, 0x707c, 0x9005, 0x1138, 0x080c, 0x4e77, 0x1188,
++	0x9085, 0x0001, 0x080c, 0x1fad, 0x20a9, 0x0008, 0x080c, 0x50ce,
++	0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e,
++	0x4003, 0x60c3, 0x0014, 0x080c, 0x4f86, 0x0010, 0x080c, 0x49f2,
++	0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x0598, 0x2011, 0x4f57,
++	0x080c, 0x71fa, 0x9086, 0x0014, 0x1550, 0x080c, 0x50ce, 0x2079,
++	0x0260, 0x7a30, 0x9296, 0x1105, 0x1510, 0x7834, 0x2011, 0x0100,
++	0x921e, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110,
++	0x70c3, 0x0001, 0x7093, 0x000a, 0x00b1, 0x0098, 0x9005, 0x1178,
++	0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001,
++	0x708f, 0x0000, 0x7093, 0x000e, 0x080c, 0x4c3e, 0x0010, 0x080c,
++	0x50aa, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x000b, 0x2011, 0x150e,
++	0x20e9, 0x0001, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, 0x4304,
++	0x080c, 0x505d, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000,
++	0x080c, 0x50b1, 0x0118, 0x2013, 0x0000, 0x0020, 0x7058, 0x9085,
++	0x0100, 0x2012, 0x20a9, 0x0040, 0x2009, 0x024e, 0x2011, 0x150e,
++	0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000,
++	0x6812, 0x2009, 0x0240, 0x1f04, 0x4bc0, 0x60c3, 0x0084, 0x080c,
++	0x4f86, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01c0, 0x2011,
++	0x4f57, 0x080c, 0x71fa, 0x9086, 0x0084, 0x1178, 0x080c, 0x50ce,
++	0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, 0x7834, 0x9005,
++	0x1120, 0x7093, 0x000c, 0x0029, 0x0010, 0x080c, 0x50aa, 0x00fe,
++	0x0005, 0x00f6, 0x7093, 0x000d, 0x080c, 0x505d, 0x2079, 0x0240,
++	0x7833, 0x1107, 0x7837, 0x0000, 0x080c, 0x50ce, 0x20a9, 0x0040,
++	0x2011, 0x026e, 0x2009, 0x024e, 0x220e, 0x8210, 0x8108, 0x9186,
++	0x0260, 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x6814,
++	0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, 0x4c04, 0x60c3, 0x0084,
++	0x080c, 0x4f86, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01e0,
++	0x2011, 0x4f57, 0x080c, 0x71fa, 0x9086, 0x0084, 0x1198, 0x080c,
++	0x50ce, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834,
++	0x9005, 0x1140, 0x708f, 0x0001, 0x080c, 0x502f, 0x7093, 0x000e,
++	0x0029, 0x0010, 0x080c, 0x50aa, 0x00fe, 0x0005, 0x7093, 0x000f,
++	0x708b, 0x0000, 0x2061, 0x0140, 0x605b, 0xbc85, 0x605f, 0xb5b5,
++	0x2061, 0x0100, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0,
++	0x2011, 0x4f57, 0x080c, 0x71ee, 0x0005, 0x7088, 0x9005, 0x0120,
++	0x2011, 0x4f57, 0x080c, 0x71fa, 0x0005, 0x7093, 0x0011, 0x080c,
++	0x8dc3, 0x080c, 0x50ce, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9,
++	0x0000, 0x20a1, 0x0240, 0x7488, 0x9480, 0x0018, 0x9080, 0x0007,
++	0x9084, 0x03f8, 0x8004, 0x20a8, 0x4003, 0x080c, 0x50b1, 0x11a0,
++	0x7174, 0x81ff, 0x0188, 0x900e, 0x7078, 0x9084, 0x00ff, 0x0160,
++	0x080c, 0x1f63, 0x9186, 0x007e, 0x0138, 0x9186, 0x0080, 0x0120,
++	0x2011, 0x0008, 0x080c, 0x4f04, 0x60c3, 0x0014, 0x080c, 0x4f86,
++	0x0005, 0x00f6, 0x7088, 0x9005, 0x0500, 0x2011, 0x4f57, 0x080c,
++	0x71fa, 0x9086, 0x0014, 0x11b8, 0x080c, 0x50ce, 0x2079, 0x0260,
++	0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38,
++	0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7093,
++	0x0012, 0x0029, 0x0010, 0x708b, 0x0000, 0x00fe, 0x0005, 0x00f6,
++	0x7093, 0x0013, 0x080c, 0x506b, 0x2079, 0x0240, 0x7833, 0x1103,
++	0x7837, 0x0000, 0x080c, 0x50ce, 0x080c, 0x50b1, 0x1170, 0x707c,
++	0x9005, 0x1158, 0x7154, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008,
++	0x080c, 0x4f04, 0x0168, 0x080c, 0x5092, 0x20a9, 0x0008, 0x20e1,
++	0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003,
++	0x60c3, 0x0014, 0x080c, 0x4f86, 0x00fe, 0x0005, 0x00f6, 0x7088,
++	0x9005, 0x0500, 0x2011, 0x4f57, 0x080c, 0x71fa, 0x9086, 0x0014,
++	0x11b8, 0x080c, 0x50ce, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104,
++	0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0,
++	0x9005, 0x1110, 0x70c3, 0x0001, 0x7093, 0x0014, 0x0029, 0x0010,
++	0x708b, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x0015, 0x080c,
++	0x506b, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c,
++	0x50ce, 0x080c, 0x50b1, 0x11b8, 0x707c, 0x9005, 0x11a0, 0x715c,
++	0x9186, 0xffff, 0x0180, 0x9180, 0x298c, 0x200d, 0x918c, 0xff00,
++	0x810f, 0x2011, 0x0008, 0x080c, 0x4f04, 0x0180, 0x080c, 0x41fc,
++	0x0110, 0x080c, 0x1fad, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099,
++	0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014,
++	0x080c, 0x4f86, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x05a0,
++	0x2011, 0x4f57, 0x080c, 0x71fa, 0x9086, 0x0014, 0x1558, 0x080c,
++	0x50ce, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1518, 0x7834,
++	0x2011, 0x0100, 0x921e, 0x1148, 0x7a38, 0xd2fc, 0x0128, 0x70c0,
++	0x9005, 0x1110, 0x70c3, 0x0001, 0x0060, 0x9005, 0x1198, 0x7a38,
++	0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x708f,
++	0x0000, 0x7a38, 0xd2f4, 0x0110, 0x70db, 0x0008, 0x7093, 0x0016,
++	0x0029, 0x0010, 0x708b, 0x0000, 0x00fe, 0x0005, 0x080c, 0x8dc3,
++	0x080c, 0x50ce, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000,
++	0x20a1, 0x0240, 0x20a9, 0x000e, 0x4003, 0x2011, 0x026e, 0x7093,
++	0x0017, 0x080c, 0x50b1, 0x1150, 0x707c, 0x9005, 0x1138, 0x080c,
++	0x4e77, 0x1188, 0x9085, 0x0001, 0x080c, 0x1fad, 0x20a9, 0x0008,
++	0x080c, 0x50ce, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000,
++	0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x4f86, 0x0010,
++	0x080c, 0x49f2, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01c0, 0x2011,
++	0x4f57, 0x080c, 0x71fa, 0x9086, 0x0084, 0x1178, 0x080c, 0x50ce,
++	0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, 0x7834, 0x9005,
++	0x1120, 0x7093, 0x0018, 0x0029, 0x0010, 0x708b, 0x0000, 0x00fe,
++	0x0005, 0x00f6, 0x7093, 0x0019, 0x080c, 0x506b, 0x2079, 0x0240,
++	0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x50ce, 0x2009, 0x026e,
++	0x2039, 0x150e, 0x20a9, 0x0040, 0x213e, 0x8738, 0x8108, 0x9186,
++	0x0280, 0x1128, 0x6814, 0x8000, 0x6816, 0x2009, 0x0260, 0x1f04,
++	0x4de4, 0x2039, 0x150e, 0x080c, 0x50b1, 0x11e8, 0x2728, 0x2514,
++	0x8207, 0x9084, 0x00ff, 0x8000, 0x2018, 0x9294, 0x00ff, 0x8007,
++	0x9205, 0x202a, 0x7058, 0x2310, 0x8214, 0x92a0, 0x150e, 0x2414,
++	0x938c, 0x0001, 0x0118, 0x9294, 0xff00, 0x0018, 0x9294, 0x00ff,
++	0x8007, 0x9215, 0x2222, 0x20a9, 0x0040, 0x2009, 0x024e, 0x270e,
++	0x8738, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000, 0x6812,
++	0x2009, 0x0240, 0x1f04, 0x4e17, 0x60c3, 0x0084, 0x080c, 0x4f86,
++	0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01e0, 0x2011, 0x4f57,
++	0x080c, 0x71fa, 0x9086, 0x0084, 0x1198, 0x080c, 0x50ce, 0x2079,
++	0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140,
++	0x708f, 0x0001, 0x080c, 0x502f, 0x7093, 0x001a, 0x0029, 0x0010,
++	0x708b, 0x0000, 0x00fe, 0x0005, 0x7093, 0x001b, 0x080c, 0x8dc3,
++	0x080c, 0x50ce, 0x2011, 0x0260, 0x2009, 0x0240, 0x7488, 0x9480,
++	0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x220e,
++	0x8210, 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812,
++	0x2009, 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04,
++	0x4e5f, 0x60c3, 0x0084, 0x080c, 0x4f86, 0x0005, 0x0005, 0x0086,
++	0x0096, 0x2029, 0x1153, 0x252c, 0x20a9, 0x0008, 0x2041, 0x150e,
++	0x20e9, 0x0001, 0x28a0, 0x080c, 0x50ce, 0x20e1, 0x0000, 0x2099,
++	0x026e, 0x4003, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0108,
++	0x9016, 0x2800, 0x9200, 0x200c, 0x91a6, 0xffff, 0x1148, 0xd5d4,
++	0x0110, 0x8210, 0x0008, 0x8211, 0x1f04, 0x4e91, 0x0804, 0x4f00,
++	0x82ff, 0x1160, 0xd5d4, 0x0120, 0x91a6, 0x3fff, 0x0d90, 0x0020,
++	0x91a6, 0x3fff, 0x0904, 0x4f00, 0x918d, 0xc000, 0x20a9, 0x0010,
++	0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4,
++	0x0110, 0x8423, 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319,
++	0x0008, 0x8318, 0x1f04, 0x4eb7, 0x04d8, 0x23a8, 0x2021, 0x0001,
++	0x8426, 0x8425, 0x1f04, 0x4ec9, 0x2328, 0x8529, 0x92be, 0x0007,
++	0x0158, 0x0006, 0x2039, 0x0007, 0x2200, 0x973a, 0x000e, 0x27a8,
++	0x95a8, 0x0010, 0x1f04, 0x4ed8, 0x7556, 0x95c8, 0x298c, 0x292d,
++	0x95ac, 0x00ff, 0x757a, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c,
++	0x1f8d, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304, 0x9405,
++	0x201a, 0x707f, 0x0001, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x20e1,
++	0x0001, 0x2898, 0x20a9, 0x0008, 0x4003, 0x9085, 0x0001, 0x0008,
++	0x9006, 0x009e, 0x008e, 0x0005, 0x0156, 0x01c6, 0x01d6, 0x0136,
++	0x0146, 0x22a8, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000,
++	0x2011, 0x024e, 0x22a0, 0x4003, 0x014e, 0x013e, 0x01de, 0x01ce,
++	0x015e, 0x2118, 0x9026, 0x2001, 0x0007, 0x939a, 0x0010, 0x0218,
++	0x8420, 0x8001, 0x0cd0, 0x2118, 0x84ff, 0x0120, 0x939a, 0x0010,
++	0x8421, 0x1de0, 0x2021, 0x0001, 0x83ff, 0x0118, 0x8423, 0x8319,
++	0x1de8, 0x9238, 0x2029, 0x026e, 0x9528, 0x2504, 0x942c, 0x11b8,
++	0x9405, 0x203a, 0x7156, 0x91a0, 0x298c, 0x242d, 0x95ac, 0x00ff,
++	0x757a, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x1f8d, 0x001e,
++	0x60e7, 0x0000, 0x65ea, 0x707f, 0x0001, 0x9084, 0x0000, 0x0005,
++	0x00e6, 0x2071, 0x1100, 0x7083, 0x0000, 0x00ee, 0x0005, 0x00e6,
++	0x00f6, 0x2079, 0x0100, 0x2071, 0x0140, 0x080c, 0x501e, 0x080c,
++	0x85a2, 0x7004, 0x9084, 0x4000, 0x0138, 0x2001, 0x1000, 0x080c,
++	0x2401, 0x9006, 0x080c, 0x2401, 0x0126, 0x2091, 0x8000, 0x2071,
++	0x1124, 0x2073, 0x0000, 0x7840, 0x0026, 0x0016, 0x2009, 0x00f7,
++	0x080c, 0x507b, 0x001e, 0x9094, 0x0010, 0x9285, 0x0080, 0x7842,
++	0x7a42, 0x002e, 0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091,
++	0x8000, 0x2011, 0x130e, 0x2013, 0x0000, 0x708b, 0x0000, 0x012e,
++	0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x8599, 0x6144, 0xd184,
++	0x0120, 0x7190, 0x918d, 0x2000, 0x0018, 0x7184, 0x918d, 0x1000,
++	0x2011, 0x12d3, 0x2112, 0x2009, 0x07d0, 0x2011, 0x4f57, 0x080c,
++	0x7283, 0x0005, 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000,
++	0x2011, 0x0003, 0x080c, 0x88e2, 0x2011, 0x0002, 0x080c, 0x88ec,
++	0x080c, 0x87a2, 0x0036, 0x901e, 0x080c, 0x8847, 0x003e, 0x2009,
++	0x00f7, 0x080c, 0x507b, 0x2061, 0x1317, 0x900e, 0x611a, 0x611e,
++	0x2061, 0x1100, 0x6003, 0x0001, 0x2061, 0x0100, 0x6043, 0x0090,
++	0x6043, 0x0010, 0x2009, 0x12d3, 0x200b, 0x0000, 0x2009, 0x002d,
++	0x2011, 0x4fe1, 0x080c, 0x71ee, 0x012e, 0x00ce, 0x002e, 0x001e,
++	0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x04b9, 0x2071,
++	0x0100, 0x080c, 0x85a2, 0x2071, 0x0140, 0x7004, 0x9084, 0x4000,
++	0x0138, 0x2001, 0x1000, 0x080c, 0x2401, 0x9006, 0x080c, 0x2401,
++	0x080c, 0x62ec, 0x01a8, 0x080c, 0x630a, 0x1190, 0x2001, 0x12a7,
++	0x2003, 0xaaaa, 0x0016, 0x080c, 0x205d, 0x2001, 0x1298, 0x2102,
++	0x001e, 0x2001, 0x12a8, 0x2003, 0x0000, 0x080c, 0x621a, 0x0050,
++	0x2009, 0x0001, 0x080c, 0x2355, 0x2001, 0x0001, 0x080c, 0x1f11,
++	0x080c, 0x4faa, 0x012e, 0x000e, 0x00ee, 0x0005, 0x2001, 0x110d,
++	0x2004, 0xd0bc, 0x0158, 0x0026, 0x0036, 0x2011, 0x8017, 0x2001,
++	0x12d3, 0x201c, 0x080c, 0x3f23, 0x003e, 0x002e, 0x0005, 0x20a9,
++	0x0012, 0x20e9, 0x0001, 0x20a1, 0x1580, 0x080c, 0x50ce, 0x20e9,
++	0x0000, 0x2099, 0x026e, 0x0099, 0x20a9, 0x0020, 0x080c, 0x50c8,
++	0x2099, 0x0260, 0x20a1, 0x1592, 0x0051, 0x20a9, 0x000e, 0x080c,
++	0x50cb, 0x2099, 0x0260, 0x20a1, 0x15b2, 0x0009, 0x0005, 0x0016,
++	0x0026, 0x3410, 0x3308, 0x2104, 0x8007, 0x2012, 0x8108, 0x8210,
++	0x1f04, 0x5053, 0x002e, 0x001e, 0x0005, 0x080c, 0x8dc3, 0x20e1,
++	0x0001, 0x2099, 0x1500, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9,
++	0x000c, 0x4003, 0x0005, 0x080c, 0x8dc3, 0x080c, 0x50ce, 0x20e1,
++	0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9,
++	0x000c, 0x4003, 0x0005, 0x00c6, 0x0006, 0x2061, 0x0100, 0x810f,
++	0x2001, 0x1133, 0x2004, 0x9005, 0x1138, 0x2001, 0x1116, 0x2004,
++	0x9084, 0x00ff, 0x9105, 0x0010, 0x9185, 0x00f7, 0x604a, 0x000e,
++	0x00ce, 0x0005, 0x0016, 0x0046, 0x080c, 0x58cb, 0x0158, 0x9006,
++	0x2020, 0x2009, 0x002a, 0x080c, 0xc12f, 0x2001, 0x110c, 0x200c,
++	0xc195, 0x2102, 0x2019, 0x002a, 0x900e, 0x080c, 0x2831, 0x004e,
++	0x001e, 0x0005, 0x080c, 0x4faa, 0x7093, 0x0000, 0x708b, 0x0000,
++	0x0005, 0x0006, 0x2001, 0x110c, 0x2004, 0xd09c, 0x0100, 0x000e,
++	0x0005, 0x0006, 0x0016, 0x0126, 0x2091, 0x8000, 0x2001, 0x0101,
++	0x200c, 0x918d, 0x0006, 0x2102, 0x012e, 0x001e, 0x000e, 0x0005,
++	0x2009, 0x0001, 0x0020, 0x2009, 0x0002, 0x0008, 0x900e, 0x6814,
++	0x9084, 0xffc0, 0x910d, 0x6916, 0x0005, 0x00f6, 0x0156, 0x0146,
++	0x01d6, 0x9006, 0x20a9, 0x0080, 0x20e9, 0x0001, 0x20a1, 0x1500,
++	0x4004, 0x2079, 0x1500, 0x7803, 0x2200, 0x7807, 0x00ef, 0x780f,
++	0x00ef, 0x7813, 0x0138, 0x7823, 0xffff, 0x7827, 0xffff, 0x01de,
++	0x014e, 0x015e, 0x00fe, 0x0005, 0x0156, 0x20a9, 0x00ff, 0x2009,
++	0x1000, 0x9006, 0x200a, 0x8108, 0x1f04, 0x50fa, 0x015e, 0x0005,
++	0x00d6, 0x0036, 0x0156, 0x0136, 0x0146, 0x2069, 0x1152, 0x9006,
++	0x6002, 0x6007, 0x0707, 0x600a, 0x600e, 0x6012, 0x9198, 0x298c,
++	0x231d, 0x939c, 0x00ff, 0x6316, 0x20a9, 0x0004, 0x9c98, 0x0006,
++	0x20e9, 0x0001, 0x23a0, 0x4004, 0x20a9, 0x0004, 0x9c98, 0x000a,
++	0x23a0, 0x4004, 0x603e, 0x6042, 0x604e, 0x6052, 0x6056, 0x605a,
++	0x605e, 0x6062, 0x6066, 0x606a, 0x606e, 0x6072, 0x6076, 0x607a,
++	0x608a, 0x608e, 0x6092, 0x6096, 0x609a, 0x609e, 0x60ae, 0x61a2,
++	0x00d6, 0x60a4, 0x906d, 0x0110, 0x080c, 0x0ecf, 0x60a7, 0x0000,
++	0x00de, 0x9006, 0x604a, 0x6810, 0x603a, 0x680c, 0x6046, 0x6814,
++	0x9084, 0x00ff, 0x6042, 0x014e, 0x013e, 0x015e, 0x003e, 0x00de,
++	0x0005, 0x0126, 0x2091, 0x8000, 0x6974, 0x6e78, 0x9684, 0x3fff,
++	0x9082, 0x4000, 0x1a04, 0x51c0, 0x918c, 0xff00, 0x810f, 0x9182,
++	0x00ff, 0x1a04, 0x51c4, 0x2001, 0x110c, 0x2004, 0x9084, 0x0003,
++	0x1904, 0x51ca, 0x9188, 0x1000, 0x2104, 0x9065, 0x0500, 0x6004,
++	0x9084, 0x00ff, 0x908e, 0x0006, 0x11f0, 0x60a4, 0x900d, 0x1904,
++	0x51df, 0x6050, 0x900d, 0x1148, 0x6802, 0x2d00, 0x6052, 0x604e,
++	0x080c, 0x758b, 0x9006, 0x012e, 0x0005, 0x2d00, 0x200a, 0x6803,
++	0x0000, 0x6052, 0x0ca8, 0x2001, 0x0005, 0x900e, 0x04c0, 0x2001,
++	0x0028, 0x900e, 0x04a0, 0x9082, 0x0006, 0x1298, 0x2001, 0x1136,
++	0x2004, 0xd0ac, 0x1158, 0x60a0, 0xd0bc, 0x1140, 0x6100, 0xd1fc,
++	0x09a0, 0x2001, 0x0029, 0x2009, 0x1000, 0x0408, 0x2001, 0x0028,
++	0x00a8, 0x2009, 0x110c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004,
++	0x0068, 0xd184, 0x0118, 0x2001, 0x0004, 0x0040, 0x2001, 0x0029,
++	0x6100, 0xd1fc, 0x0118, 0x2009, 0x1000, 0x0048, 0x900e, 0x0038,
++	0x2001, 0x0029, 0x900e, 0x0018, 0x2001, 0x0029, 0x900e, 0x9005,
++	0x012e, 0x0005, 0x2001, 0x110c, 0x2004, 0xd084, 0x19d0, 0x9188,
++	0x1000, 0x2104, 0x9065, 0x09a8, 0x6004, 0x9084, 0x00ff, 0x908e,
++	0x0006, 0x1978, 0x6000, 0xd0c4, 0x0960, 0x0804, 0x5175, 0x080c,
++	0x5791, 0x0904, 0x518b, 0x0804, 0x5179, 0x00e6, 0x0126, 0x2091,
++	0x8000, 0x6874, 0x8007, 0x9084, 0x00ff, 0x2008, 0x9182, 0x00ff,
++	0x1a04, 0x5247, 0x9188, 0x1000, 0x2104, 0x9065, 0x0538, 0x6004,
++	0x908c, 0x00ff, 0x918e, 0x0006, 0x0128, 0x908c, 0xff00, 0x918e,
++	0x0600, 0x11f8, 0x2c70, 0x687c, 0xd0fc, 0x0138, 0x6894, 0x9005,
++	0x0120, 0x2060, 0x2d00, 0x6016, 0x0058, 0x080c, 0x8e83, 0x05e8,
++	0x2e00, 0x6012, 0x2d00, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a,
++	0x2009, 0x0003, 0x080c, 0x8f53, 0x9006, 0x0460, 0x2001, 0x0028,
++	0x0440, 0x9082, 0x0006, 0x1298, 0x2001, 0x1136, 0x2004, 0xd0ac,
++	0x1158, 0x60a0, 0xd0bc, 0x1140, 0x6100, 0xd1fc, 0x0998, 0x2001,
++	0x0029, 0x2009, 0x1000, 0x00a8, 0x2001, 0x0028, 0x0090, 0x2009,
++	0x110c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0050, 0xd184,
++	0x0118, 0x2001, 0x0004, 0x0028, 0x2001, 0x0029, 0x0010, 0x2001,
++	0x0029, 0x9005, 0x012e, 0x00ee, 0x0005, 0x2001, 0x002c, 0x0cc8,
++	0x00f6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x68e0, 0x9005, 0x1568,
++	0x68dc, 0x9082, 0x0101, 0x1648, 0x68c8, 0x9005, 0x1530, 0x68c4,
++	0x9082, 0x0101, 0x1610, 0x6974, 0x2079, 0x1100, 0x918c, 0xff00,
++	0x810f, 0x9182, 0x00ff, 0x12e8, 0x7830, 0x9084, 0x0003, 0x1130,
++	0x6a98, 0x6b94, 0x6878, 0x9084, 0x0007, 0x00ea, 0x7930, 0xd18c,
++	0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004,
++	0x0010, 0x2001, 0x0029, 0x900e, 0x0038, 0x2001, 0x002c, 0x900e,
++	0x0018, 0x2001, 0x0029, 0x900e, 0x9006, 0x0008, 0x9005, 0x012e,
++	0x00ee, 0x00fe, 0x0005, 0x52e3, 0x529b, 0x52b4, 0x52e3, 0x52e3,
++	0x52e3, 0x52e3, 0x52e3, 0x2100, 0x9082, 0x007e, 0x1280, 0x080c,
++	0x55b3, 0x2c70, 0x0148, 0x7010, 0x9306, 0x1904, 0x52eb, 0x7014,
++	0x9206, 0x1904, 0x52eb, 0x0028, 0x7312, 0x7216, 0x0010, 0x080c,
++	0x3dc2, 0x2c70, 0x0158, 0x04b8, 0x080c, 0x5608, 0x15a0, 0x2c70,
++	0x7010, 0x9306, 0x1580, 0x7014, 0x9206, 0x1568, 0x080c, 0x8e83,
++	0x0530, 0x2e00, 0x6012, 0x080c, 0xad70, 0x2d00, 0x6016, 0x600b,
++	0xffff, 0x6023, 0x000a, 0x6878, 0x9086, 0x0001, 0x1170, 0x080c,
++	0x2862, 0x9006, 0x080c, 0x5556, 0x2001, 0x0002, 0x080c, 0x5568,
++	0x2001, 0x0200, 0x706e, 0x7093, 0x0002, 0x2009, 0x0003, 0x080c,
++	0x8f53, 0x9006, 0x0068, 0x2001, 0x0001, 0x900e, 0x0038, 0x2001,
++	0x002c, 0x900e, 0x0018, 0x2001, 0x0028, 0x900e, 0x9005, 0x0000,
++	0x012e, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x0126, 0x2091,
++	0x8000, 0x6894, 0x90c6, 0x0015, 0x0904, 0x54b0, 0x90c6, 0x0056,
++	0x0904, 0x54b4, 0x90c6, 0x0066, 0x0904, 0x54b8, 0x90c6, 0x0071,
++	0x0904, 0x54bc, 0x90c6, 0x0074, 0x0904, 0x54c0, 0x90c6, 0x007c,
++	0x0904, 0x54c4, 0x90c6, 0x007e, 0x0904, 0x54c8, 0x90c6, 0x0037,
++	0x0904, 0x54cc, 0x9016, 0x2079, 0x1100, 0x6974, 0x918c, 0xff00,
++	0x810f, 0x9182, 0x00ff, 0x1a04, 0x54ab, 0x080c, 0x5608, 0x11a0,
++	0x6004, 0x9084, 0x00ff, 0x9082, 0x0006, 0x1270, 0x6894, 0x90c6,
++	0x006f, 0x0150, 0x2001, 0x1136, 0x2004, 0xd0ac, 0x1904, 0x5496,
++	0x60a0, 0xd0bc, 0x1904, 0x5496, 0x6894, 0x90c6, 0x006f, 0x0158,
++	0x90c6, 0x005e, 0x0904, 0x53df, 0x90c6, 0x0064, 0x0904, 0x5413,
++	0x2008, 0x0804, 0x53aa, 0x6998, 0x2140, 0x918c, 0xff00, 0x810f,
++	0x78d8, 0xd0ac, 0x1120, 0x9182, 0x0080, 0x0a04, 0x53aa, 0x9182,
++	0x00ff, 0x1a04, 0x53aa, 0x6aa0, 0x6b9c, 0x7874, 0x9306, 0x1168,
++	0x7878, 0x924e, 0x1120, 0x2208, 0x2310, 0x0804, 0x53aa, 0x99cc,
++	0xff00, 0x1118, 0x2208, 0x2310, 0x04e8, 0x080c, 0x3dc2, 0x2c70,
++	0x0904, 0x53b2, 0x900e, 0x9016, 0x90c6, 0x4000, 0x1520, 0x0006,
++	0x2e60, 0x080c, 0x57d6, 0x1108, 0xc185, 0x7000, 0xd0bc, 0x0108,
++	0xc18d, 0x20a9, 0x0004, 0x9d80, 0x0031, 0x20a0, 0x20e9, 0x0001,
++	0x9e80, 0x0006, 0x2098, 0x080c, 0x504f, 0x20a9, 0x0004, 0x9d80,
++	0x0035, 0x20a0, 0x20e9, 0x0001, 0x9e80, 0x000a, 0x2098, 0x080c,
++	0x504f, 0x000e, 0x0088, 0x90c6, 0x4007, 0x1110, 0x2408, 0x0060,
++	0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0030, 0x90c6, 0x4009,
++	0x1108, 0x0010, 0x2001, 0x4006, 0x6896, 0x699a, 0x6a9e, 0x2001,
++	0x0030, 0x0440, 0x080c, 0x8e83, 0x1130, 0x2001, 0x4005, 0x2009,
++	0x0003, 0x9016, 0x0c88, 0x2e00, 0x6012, 0x080c, 0xad70, 0x2d00,
++	0x6016, 0x6023, 0x0001, 0x6868, 0xd88c, 0x0108, 0xc0f5, 0x686a,
++	0x0126, 0x2091, 0x8000, 0x080c, 0x2862, 0x012e, 0x9006, 0x080c,
++	0x5556, 0x2001, 0x0002, 0x080c, 0x5568, 0x2009, 0x0002, 0x080c,
++	0x8f53, 0x9006, 0x9005, 0x012e, 0x00ee, 0x00fe, 0x0005, 0x7800,
++	0x9086, 0x0003, 0x0118, 0x2009, 0x0007, 0x0448, 0x6e98, 0x860f,
++	0x918c, 0x00ff, 0x96b4, 0x00ff, 0x080c, 0x5608, 0x0120, 0x2009,
++	0x000a, 0x0804, 0x53aa, 0x9186, 0x007f, 0x0148, 0x6004, 0x9084,
++	0x00ff, 0x9086, 0x0006, 0x0118, 0x2009, 0x0009, 0x0080, 0x00d6,
++	0x080c, 0x0e9d, 0x1120, 0x00de, 0x2009, 0x0002, 0x0040, 0x2d00,
++	0x00de, 0x6806, 0x080c, 0xaaf5, 0x1960, 0x2009, 0x0003, 0x2001,
++	0x4005, 0x0804, 0x53ac, 0x6e98, 0x860f, 0x918c, 0x00ff, 0x96b4,
++	0x00ff, 0x080c, 0x5608, 0x0120, 0x2009, 0x000a, 0x0804, 0x53aa,
++	0x00d6, 0x080c, 0x0e9d, 0x1128, 0x00de, 0x2009, 0x0002, 0x0804,
++	0x547a, 0x2d00, 0x00de, 0x6806, 0x00d6, 0x2068, 0x20a9, 0x002b,
++	0x20e1, 0x0001, 0x2c98, 0x9de8, 0x0002, 0x20e9, 0x0001, 0x2da0,
++	0x4003, 0x20a9, 0x0004, 0x9d80, 0x0006, 0x20a0, 0x9c80, 0x0006,
++	0x2098, 0x080c, 0x504f, 0x20a9, 0x0004, 0x9d80, 0x000a, 0x20a0,
++	0x9c80, 0x000a, 0x2098, 0x080c, 0x504f, 0x00de, 0x687b, 0x0000,
++	0x6883, 0x0000, 0x6897, 0x4000, 0xd684, 0x1170, 0x2001, 0x1153,
++	0x2004, 0xd0b4, 0x1118, 0x689b, 0x000b, 0x0400, 0x6000, 0xd08c,
++	0x0118, 0x689b, 0x000c, 0x00d0, 0x6004, 0x9084, 0x00ff, 0x9086,
++	0x0006, 0x0118, 0x689b, 0x0009, 0x0088, 0x7800, 0x9086, 0x0003,
++	0x0118, 0x689b, 0x0007, 0x0050, 0x080c, 0xaabe, 0x1904, 0x53d9,
++	0x2009, 0x0003, 0x2001, 0x4005, 0x0804, 0x53ac, 0x687b, 0x0030,
++	0x6897, 0x4005, 0x6804, 0x2009, 0x002b, 0x6aa0, 0x6b9c, 0x6ca8,
++	0x6da4, 0x2031, 0x0000, 0x2039, 0x0001, 0x2041, 0x1078, 0x080c,
++	0x9367, 0x1904, 0x53d9, 0x2009, 0x0002, 0x0c20, 0x2001, 0x0028,
++	0x900e, 0x0804, 0x53da, 0x2009, 0x110c, 0x210c, 0xd18c, 0x0118,
++	0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010,
++	0x2001, 0x0029, 0x900e, 0x2001, 0x0029, 0x900e, 0x0804, 0x53da,
++	0x080c, 0x2d84, 0x0804, 0x53db, 0x080c, 0x460a, 0x0804, 0x53db,
++	0x080c, 0x3a74, 0x0804, 0x53db, 0x080c, 0x3e74, 0x0804, 0x53db,
++	0x080c, 0x408f, 0x0804, 0x53db, 0x080c, 0x4291, 0x0804, 0x53db,
++	0x080c, 0x448a, 0x0804, 0x53db, 0x080c, 0x2f43, 0x0804, 0x53db,
++	0x6974, 0x6e78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1648, 0x918c,
++	0xff00, 0x810f, 0x9182, 0x00ff, 0x1280, 0x9188, 0x1000, 0x2104,
++	0x9065, 0x0158, 0x6004, 0x9084, 0x00ff, 0x908e, 0x0006, 0x1148,
++	0x00e1, 0x080c, 0x5721, 0x9006, 0x00b0, 0x2001, 0x0028, 0x900e,
++	0x0090, 0x9082, 0x0006, 0x1240, 0x6100, 0xd1fc, 0x0d88, 0x2001,
++	0x0029, 0x2009, 0x1000, 0x0038, 0x2001, 0x0029, 0x900e, 0x0018,
++	0x2001, 0x0029, 0x900e, 0x9005, 0x0005, 0x0126, 0x2091, 0x8000,
++	0x6050, 0x900d, 0x0138, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052,
++	0x012e, 0x0005, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x0cc0,
++	0x0126, 0x2091, 0x8000, 0x604c, 0x9005, 0x0170, 0x00e6, 0x2071,
++	0x1304, 0x7004, 0x9086, 0x0002, 0x0168, 0x00ee, 0x604c, 0x6802,
++	0x2d00, 0x604e, 0x012e, 0x0005, 0x2d00, 0x6052, 0x604e, 0x6803,
++	0x0000, 0x0cc0, 0x701c, 0x9c06, 0x1d80, 0x604c, 0x2070, 0x7000,
++	0x6802, 0x2d00, 0x7002, 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091,
++	0x8000, 0x604c, 0x906d, 0x0130, 0x6800, 0x9005, 0x1108, 0x6052,
++	0x604e, 0x9d05, 0x012e, 0x0005, 0x604c, 0x906d, 0x0130, 0x6800,
++	0x9005, 0x1108, 0x6052, 0x604e, 0x9d05, 0x0005, 0x0126, 0x00c6,
++	0x0026, 0x2091, 0x8000, 0x6210, 0x2260, 0x6200, 0x9005, 0x0110,
++	0xc285, 0x0008, 0xc284, 0x6202, 0x002e, 0x00ce, 0x012e, 0x0005,
++	0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, 0x2260, 0x6204, 0x0006,
++	0x9086, 0x0006, 0x1170, 0x609c, 0xd0ac, 0x0158, 0x080c, 0x58cb,
++	0x0140, 0x9284, 0xff00, 0x8007, 0x9086, 0x0007, 0x1110, 0x2011,
++	0x0600, 0x000e, 0x9294, 0xff00, 0x9215, 0x6206, 0x0006, 0x9086,
++	0x0006, 0x1120, 0x6290, 0x82ff, 0x090c, 0x0d7e, 0x000e, 0x00ce,
++	0x012e, 0x0005, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, 0x2260,
++	0x6204, 0x0006, 0x9086, 0x0006, 0x1168, 0x609c, 0xd0a4, 0x0150,
++	0x080c, 0x58c6, 0x1138, 0x9284, 0x00ff, 0x9086, 0x0007, 0x1110,
++	0x2011, 0x0006, 0x000e, 0x9294, 0x00ff, 0x8007, 0x9215, 0x6206,
++	0x00ce, 0x012e, 0x0005, 0x0026, 0x9182, 0x00ff, 0x0218, 0x9085,
++	0x0001, 0x00a0, 0x9190, 0x1000, 0x2204, 0x9065, 0x1170, 0x0016,
++	0x00d6, 0x080c, 0x0e9d, 0x2d60, 0x00de, 0x001e, 0x0d80, 0x2c00,
++	0x2012, 0x9006, 0x60a6, 0x080c, 0x5100, 0x9006, 0x002e, 0x0005,
++	0x0126, 0x2091, 0x8000, 0x0026, 0x9182, 0x00ff, 0x0218, 0x9085,
++	0x0001, 0x0458, 0x00d6, 0x9190, 0x1000, 0x2204, 0x906d, 0x0518,
++	0x2013, 0x0000, 0x00d6, 0x00c6, 0x2d60, 0x60a4, 0x906d, 0x0110,
++	0x080c, 0x0ecf, 0x00ce, 0x00de, 0x00d6, 0x00c6, 0x68ac, 0x2060,
++	0x8cff, 0x0168, 0x600c, 0x0006, 0x6014, 0x2068, 0x080c, 0xa942,
++	0x0110, 0x080c, 0x0edf, 0x080c, 0x8ed9, 0x00ce, 0x0c88, 0x00ce,
++	0x00de, 0x080c, 0x0ecf, 0x00de, 0x9006, 0x002e, 0x012e, 0x0005,
++	0x0016, 0x9182, 0x00ff, 0x0218, 0x9085, 0x0001, 0x0030, 0x9188,
++	0x1000, 0x2104, 0x9065, 0x0dc0, 0x9006, 0x001e, 0x0005, 0x00d6,
++	0x0156, 0x0136, 0x0146, 0x9006, 0x600a, 0x600e, 0x6000, 0xc08c,
++	0x6002, 0x080c, 0x62e4, 0x1520, 0x60a0, 0x9086, 0x007e, 0x0130,
++	0x2001, 0x1136, 0x2004, 0xd0ac, 0x11d8, 0x0078, 0x7040, 0xd0e4,
++	0x01b8, 0x00c6, 0x2061, 0x12bc, 0x7048, 0x2062, 0x704c, 0x6006,
++	0x7050, 0x600a, 0x7054, 0x600e, 0x00ce, 0x703c, 0x2069, 0x0140,
++	0x9005, 0x1110, 0x2001, 0x0001, 0x6886, 0x2069, 0x1100, 0x68ae,
++	0x7040, 0x605e, 0x7048, 0x6062, 0x6138, 0x910a, 0x0208, 0x603a,
++	0x704c, 0x6066, 0x20e1, 0x0000, 0x2099, 0x0276, 0x9c88, 0x000a,
++	0x20e9, 0x0001, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2099, 0x027a,
++	0x9c88, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2069, 0x0200,
++	0x6817, 0x0001, 0x7040, 0x606a, 0x7144, 0x616e, 0x7048, 0x6072,
++	0x7050, 0x6076, 0x2069, 0x0200, 0x6817, 0x0000, 0x60a0, 0x9086,
++	0x007e, 0x1110, 0x7144, 0x616e, 0x9182, 0x0211, 0x1218, 0x2009,
++	0x0008, 0x0400, 0x9182, 0x0259, 0x1218, 0x2009, 0x0007, 0x00d0,
++	0x9182, 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0x9182, 0x0349,
++	0x1218, 0x2009, 0x0005, 0x0070, 0x9182, 0x0421, 0x1218, 0x2009,
++	0x0004, 0x0040, 0x9182, 0x0581, 0x1218, 0x2009, 0x0003, 0x0010,
++	0x2009, 0x0002, 0x6192, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005,
++	0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x7034, 0x6896, 0x703c,
++	0x689a, 0x7054, 0x689e, 0x6a00, 0x2009, 0x1172, 0x210c, 0xd0bc,
++	0x0120, 0xd1ec, 0x0110, 0xc2ad, 0x0008, 0xc2ac, 0xd0c4, 0x0120,
++	0xd1e4, 0x0110, 0xc2bd, 0x0008, 0xc2bc, 0x6a02, 0x00ee, 0x002e,
++	0x001e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x60a4, 0x906d,
++	0x01c0, 0x6900, 0x81ff, 0x1540, 0x6a04, 0x9282, 0x0010, 0x1648,
++	0x9d88, 0x0004, 0x20a9, 0x0010, 0x2104, 0x9086, 0xffff, 0x0128,
++	0x8108, 0x1f04, 0x56dc, 0x080c, 0x0d7e, 0x260a, 0x8210, 0x6a06,
++	0x0098, 0x080c, 0x0eb6, 0x01a8, 0x2d00, 0x60a6, 0x6803, 0x0000,
++	0x9d88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x1f04,
++	0x56f4, 0x6807, 0x0001, 0x6e12, 0x9085, 0x0001, 0x012e, 0x00de,
++	0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091, 0x8000, 0x00d6, 0x60a4,
++	0x900d, 0x01a0, 0x2168, 0x6800, 0x9005, 0x1160, 0x080c, 0x5791,
++	0x1168, 0x200b, 0xffff, 0x6804, 0x908a, 0x0002, 0x0218, 0x8001,
++	0x6806, 0x0020, 0x080c, 0x0ecf, 0x60a7, 0x0000, 0x00de, 0x012e,
++	0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x758b, 0x012e, 0x0005,
++	0x901e, 0x0010, 0x2019, 0x0001, 0x900e, 0x0126, 0x2091, 0x8000,
++	0x604c, 0x2068, 0x6000, 0xd0dc, 0x1170, 0x8dff, 0x01f8, 0x83ff,
++	0x0120, 0x6878, 0x9606, 0x0158, 0x0030, 0x686c, 0x9406, 0x1118,
++	0x6870, 0x9506, 0x0120, 0x2d08, 0x6800, 0x2068, 0x0c70, 0x080c,
++	0x895e, 0x6a00, 0x604c, 0x9d06, 0x1110, 0x624e, 0x0018, 0x9180,
++	0x0000, 0x2202, 0x82ff, 0x1110, 0x6152, 0x8dff, 0x012e, 0x0005,
++	0x9016, 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, 0x57d6,
++	0x0118, 0x080c, 0xa9f4, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c,
++	0x57d6, 0x0118, 0x080c, 0xa987, 0x0010, 0x9085, 0x0001, 0x0005,
++	0x080c, 0x57d6, 0x0118, 0x080c, 0xa9d7, 0x0010, 0x9085, 0x0001,
++	0x0005, 0x080c, 0x57d6, 0x0118, 0x080c, 0xa9a3, 0x0010, 0x9085,
++	0x0001, 0x0005, 0x080c, 0x57d6, 0x0118, 0x080c, 0xaa10, 0x0010,
++	0x9085, 0x0001, 0x0005, 0x60a4, 0x900d, 0x1118, 0x9085, 0x0001,
++	0x0005, 0x00e6, 0x2170, 0x7000, 0x9005, 0x1168, 0x20a9, 0x0010,
++	0x9e88, 0x0004, 0x2104, 0x9606, 0x0130, 0x8108, 0x1f04, 0x579a,
++	0x9085, 0x0001, 0x0008, 0x9006, 0x00ee, 0x0005, 0x00d6, 0x0126,
++	0x2091, 0x8000, 0x60a4, 0x906d, 0x1128, 0x080c, 0x0eb6, 0x01a0,
++	0x2d00, 0x60a6, 0x6803, 0x0001, 0x6807, 0x0000, 0x9d88, 0x0004,
++	0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x1f04, 0x57ba, 0x9085,
++	0x0001, 0x012e, 0x00de, 0x0005, 0x9006, 0x0cd8, 0x00d6, 0x0126,
++	0x2091, 0x8000, 0x60a4, 0x906d, 0x0130, 0x60a7, 0x0000, 0x080c,
++	0x0ecf, 0x9085, 0x0001, 0x012e, 0x00de, 0x0005, 0x609c, 0xd0a4,
++	0x0005, 0x00f6, 0x080c, 0x62e4, 0x01b0, 0x71c0, 0x81ff, 0x1198,
++	0x71d8, 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, 0x1000, 0x2004,
++	0x907d, 0x0148, 0x7804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1118,
++	0x7800, 0xc0ed, 0x7802, 0x2079, 0x1152, 0x7804, 0xd0a4, 0x01e0,
++	0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x5608,
++	0x1168, 0x6004, 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118,
++	0x9086, 0x0006, 0x1118, 0x6000, 0xc0ed, 0x6002, 0x001e, 0x8108,
++	0x1f04, 0x57fd, 0x00ce, 0x015e, 0x080c, 0x588e, 0x0120, 0x2001,
++	0x12bf, 0x200c, 0x0038, 0x2079, 0x1152, 0x7804, 0xd0a4, 0x0130,
++	0x2009, 0x07d0, 0x2011, 0x5828, 0x080c, 0x7283, 0x00fe, 0x0005,
++	0x2011, 0x5828, 0x080c, 0x71fa, 0x080c, 0x588e, 0x01d8, 0x2001,
++	0x107e, 0x2004, 0x9080, 0x0000, 0x200c, 0xc1ec, 0x2102, 0x080c,
++	0x58cb, 0x0130, 0x2009, 0x07d0, 0x2011, 0x5828, 0x080c, 0x7283,
++	0x00e6, 0x2071, 0x1100, 0x9006, 0x7076, 0x707a, 0x080c, 0x2679,
++	0x00ee, 0x0498, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016,
++	0x080c, 0x5608, 0x1520, 0x6000, 0xd0ec, 0x0508, 0x0046, 0x62a0,
++	0x9294, 0x00ff, 0x8227, 0x9006, 0x2009, 0x0029, 0x080c, 0xc12f,
++	0x6000, 0xc0e5, 0xc0ec, 0x6002, 0x6004, 0x9084, 0x00ff, 0x9085,
++	0x0700, 0x6006, 0x2019, 0x0029, 0x080c, 0x76f0, 0x0076, 0x903e,
++	0x080c, 0x75ee, 0x900e, 0x080c, 0xbec2, 0x007e, 0x004e, 0x001e,
++	0x8108, 0x1f04, 0x584f, 0x00ce, 0x015e, 0x0005, 0x00c6, 0x6010,
++	0x2060, 0x6000, 0xc0ec, 0x6002, 0x00ce, 0x0005, 0x7810, 0x2004,
++	0xd0ac, 0x0005, 0x7810, 0x2004, 0xd0bc, 0x0005, 0x00f6, 0x2001,
++	0x107e, 0x2004, 0x907d, 0x0110, 0x7800, 0xd0ec, 0x00fe, 0x0005,
++	0x0126, 0x0026, 0x2091, 0x8000, 0x0006, 0x62a0, 0x9290, 0x1000,
++	0x2204, 0x9c06, 0x190c, 0x0d7e, 0x000e, 0x6200, 0x9005, 0x0110,
++	0xc2fd, 0x0008, 0xc2fc, 0x6202, 0x002e, 0x012e, 0x0005, 0x2011,
++	0x1136, 0x2204, 0xd0cc, 0x0138, 0x2001, 0x12bd, 0x200c, 0x2011,
++	0x58bc, 0x080c, 0x7283, 0x0005, 0x2011, 0x58bc, 0x080c, 0x71fa,
++	0x2011, 0x1136, 0x2204, 0xc0cc, 0x2012, 0x0005, 0x2001, 0x1153,
++	0x2004, 0xd0ac, 0x0005, 0x2001, 0x1153, 0x2004, 0xd0a4, 0x0005,
++	0x2071, 0x1240, 0x7003, 0x0001, 0x7007, 0x0000, 0x9006, 0x7012,
++	0x7016, 0x701a, 0x701e, 0x700a, 0x7046, 0x2071, 0x1286, 0x7003,
++	0x1240, 0x7007, 0x0000, 0x700b, 0x0000, 0x700f, 0x0001, 0x7013,
++	0x1266, 0x7017, 0x0020, 0x701b, 0x0040, 0x703b, 0x0000, 0x2001,
++	0x1262, 0x2003, 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071, 0x1263,
++	0x900e, 0x710a, 0x2001, 0x1153, 0x2004, 0xd0fc, 0x1148, 0x2001,
++	0x1153, 0x2004, 0x900e, 0xd09c, 0x0108, 0x8108, 0x7102, 0x04d8,
++	0x2001, 0x1172, 0x200c, 0x9184, 0x000f, 0x0002, 0x58ff, 0x58ff,
++	0x58ff, 0x58ff, 0x58ff, 0x591e, 0x592c, 0x58ff, 0x592f, 0x58ff,
++	0x58ff, 0x58ff, 0x58ff, 0x58ff, 0x58ff, 0x58ff, 0x7003, 0x0003,
++	0x2009, 0x1173, 0x210c, 0x9184, 0xff00, 0x8007, 0x9005, 0x1110,
++	0x2001, 0x0002, 0x7006, 0x00b8, 0x7003, 0x0005, 0x0c88, 0x7003,
++	0x0004, 0x0136, 0x0146, 0x0156, 0x20e1, 0x0001, 0x2099, 0x1176,
++	0x20e9, 0x0001, 0x20a1, 0x1290, 0x20a9, 0x0004, 0x4003, 0x015e,
++	0x014e, 0x013e, 0x0000, 0x00ee, 0x001e, 0x0005, 0x00e6, 0x2071,
++	0x0050, 0x684c, 0x9005, 0x1158, 0x00e6, 0x2071, 0x1240, 0x7028,
++	0xc085, 0x702a, 0x00ee, 0x9085, 0x0001, 0x0804, 0x5998, 0x6844,
++	0x9005, 0x01d8, 0x900e, 0x0156, 0x20a9, 0x0006, 0x8003, 0x2011,
++	0x0100, 0x2214, 0x9296, 0x0008, 0x1110, 0x818d, 0x0010, 0x81f5,
++	0x3e08, 0x1f04, 0x595e, 0x015e, 0x6a60, 0x9200, 0x7002, 0x6864,
++	0x9101, 0x7006, 0x9006, 0x7012, 0x7016, 0x6860, 0x7002, 0x6864,
++	0x7006, 0x6868, 0x700a, 0x686c, 0x700e, 0x6844, 0x9005, 0x1110,
++	0x7012, 0x7016, 0x684c, 0x701a, 0x701c, 0x9085, 0x0040, 0x701e,
++	0x7037, 0x0019, 0x702b, 0x0001, 0x00e6, 0x2071, 0x1240, 0x7028,
++	0xc084, 0x702a, 0x7007, 0x0001, 0x700b, 0x0000, 0x00ee, 0x9006,
++	0x00ee, 0x0005, 0x6868, 0xd0fc, 0x11d0, 0x00e6, 0x0026, 0x2001,
++	0x1263, 0x2004, 0x9005, 0x0904, 0x5b7b, 0x687c, 0xd0bc, 0x1904,
++	0x5b7b, 0x6978, 0x6874, 0x9105, 0x1904, 0x5b7b, 0x2001, 0x1263,
++	0x2004, 0x0002, 0x5b7b, 0x59dc, 0x5a16, 0x5a16, 0x5efd, 0x0005,
++	0x6868, 0xd0fc, 0x1500, 0x00e6, 0x0026, 0x2009, 0x1263, 0x210c,
++	0x81ff, 0x0904, 0x5b7b, 0x687c, 0xd0cc, 0x0904, 0x5b7b, 0x6880,
++	0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x5b7b, 0x9186, 0x0003,
++	0x0904, 0x5a16, 0x9186, 0x0004, 0x0904, 0x5efd, 0x684f, 0x8021,
++	0x6853, 0x0017, 0x0028, 0x0005, 0x684f, 0x8020, 0x6853, 0x0016,
++	0x2071, 0x1240, 0x701c, 0x9005, 0x1904, 0x5d24, 0x0e04, 0x5d6d,
++	0x2071, 0x0000, 0x684c, 0x7082, 0x6850, 0x7032, 0x686c, 0x7086,
++	0x7036, 0x6870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
++	0xd084, 0x190c, 0x0fcd, 0x2071, 0x1100, 0x2011, 0x0001, 0x6804,
++	0x900d, 0x702c, 0x1148, 0x206a, 0x2d00, 0x702e, 0x70bc, 0x9200,
++	0x70be, 0x002e, 0x00ee, 0x0005, 0x00d6, 0x2168, 0x6904, 0x206a,
++	0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x00de, 0x0c68, 0x684f, 0x0000,
++	0x00f6, 0x2079, 0x0050, 0x2071, 0x1240, 0x206b, 0x0000, 0x7010,
++	0x9005, 0x1904, 0x5b0a, 0x782c, 0x908c, 0x0780, 0x190c, 0x5f3b,
++	0x8004, 0x8004, 0x8004, 0x9084, 0x0003, 0x0002, 0x5a34, 0x5b0a,
++	0x5a5a, 0x5aa3, 0x080c, 0x0d7e, 0x2071, 0x1100, 0x8d07, 0x8005,
++	0x8005, 0xc0d5, 0x7822, 0x6804, 0x900d, 0x1170, 0x2071, 0x1317,
++	0x703c, 0x9005, 0x1328, 0x2001, 0x1264, 0x2004, 0x8005, 0x703e,
++	0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2168, 0x6904,
++	0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200,
++	0x70be, 0x0c20, 0x2071, 0x1100, 0x8d07, 0x8005, 0x8005, 0xc0d5,
++	0x7822, 0x6804, 0x900d, 0x1588, 0x7824, 0x00e6, 0x2071, 0x0040,
++	0x712c, 0xd19c, 0x1148, 0x2009, 0x112f, 0x210c, 0x918a, 0x0010,
++	0x0218, 0x7022, 0x00ee, 0x0060, 0x00ee, 0xc0d4, 0x8006, 0x8006,
++	0x806f, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70bc, 0x8000, 0x70be,
++	0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd0a4, 0x19e8, 0x2071,
++	0x1317, 0x703c, 0x9005, 0x1328, 0x2001, 0x1264, 0x2004, 0x8005,
++	0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2168,
++	0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e, 0x70bc,
++	0x9200, 0x70be, 0x0808, 0x00d6, 0x00e6, 0x7824, 0xc0d4, 0x8006,
++	0x8006, 0x806f, 0x2071, 0x1100, 0x702c, 0x206a, 0x2d00, 0x702e,
++	0x70bc, 0x8000, 0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b,
++	0xd0a4, 0x1d58, 0x00ee, 0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b,
++	0xd09c, 0x11b8, 0x00de, 0x8d07, 0x8005, 0x8005, 0xc0d5, 0x7822,
++	0x6804, 0x900d, 0x1560, 0x2071, 0x1317, 0x703c, 0x9005, 0x1328,
++	0x2001, 0x1264, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee,
++	0x0005, 0x00de, 0x2d08, 0x7010, 0x8000, 0x7012, 0x7018, 0x906d,
++	0x711a, 0x0110, 0x6902, 0x0008, 0x711e, 0x2168, 0x6804, 0x900d,
++	0x1170, 0x2071, 0x1317, 0x703c, 0x9005, 0x1328, 0x2001, 0x1264,
++	0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071,
++	0x1100, 0x9016, 0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00,
++	0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x00fe, 0x002e,
++	0x00ee, 0x0005, 0x2d08, 0x7010, 0x8000, 0x7012, 0x7018, 0x906d,
++	0x711a, 0x0110, 0x6902, 0x0008, 0x711e, 0x2168, 0x6804, 0x900d,
++	0x1904, 0x5b63, 0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd09c,
++	0x11b0, 0x701c, 0x906d, 0x0198, 0x7010, 0x8001, 0x7012, 0x1108,
++	0x701a, 0x2d04, 0x701e, 0x8d07, 0x8005, 0x8005, 0xc0d5, 0x7822,
++	0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd09c, 0x0d50, 0x782c,
++	0x9094, 0x0780, 0x190c, 0x5f3b, 0xd0a4, 0x01b8, 0x00e6, 0x7824,
++	0xc0d4, 0x8006, 0x8006, 0x806f, 0x2071, 0x1100, 0x702c, 0x206a,
++	0x2d00, 0x702e, 0x70bc, 0x8000, 0x70be, 0x782c, 0x9094, 0x0780,
++	0x190c, 0x5f3b, 0xd0a4, 0x1d58, 0x00ee, 0x2071, 0x1317, 0x703c,
++	0x9005, 0x1328, 0x2001, 0x1264, 0x2004, 0x8005, 0x703e, 0x00fe,
++	0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1100, 0x9016, 0x702c,
++	0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e,
++	0x70bc, 0x9200, 0x70be, 0x00ee, 0x0804, 0x5b1a, 0x6868, 0xd0fc,
++	0x1500, 0x00e6, 0x0026, 0x684f, 0x0000, 0x00f6, 0x2079, 0x0050,
++	0x2071, 0x1240, 0x206b, 0x0000, 0x7010, 0x9005, 0x1904, 0x5c9c,
++	0x782c, 0x908c, 0x0780, 0x190c, 0x5f3b, 0x8004, 0x8004, 0x8004,
++	0x9084, 0x0003, 0x0002, 0x5b9a, 0x5c9c, 0x5bb6, 0x5c29, 0x080c,
++	0x0d7e, 0x0005, 0x2071, 0x1100, 0x8d07, 0x8005, 0x8005, 0xc0d5,
++	0x7822, 0x6804, 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005,
++	0x9016, 0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff,
++	0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x0c70, 0x2071, 0x1100,
++	0x8d07, 0x8005, 0x8005, 0xc0d5, 0x7822, 0x6804, 0x900d, 0x1904,
++	0x5c1a, 0x7830, 0x8007, 0x9084, 0x001f, 0x9082, 0x0005, 0x1220,
++	0x00fe, 0x002e, 0x00ee, 0x0005, 0x7824, 0x00e6, 0x2071, 0x0040,
++	0x712c, 0xd19c, 0x1148, 0x2009, 0x112f, 0x210c, 0x918a, 0x0010,
++	0x0218, 0x7022, 0x00ee, 0x0060, 0x00ee, 0xc0d4, 0x8006, 0x8006,
++	0x806f, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70bc, 0x8000, 0x70be,
++	0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd0a4, 0x19e8, 0x0e04,
++	0x5c11, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000,
++	0x6836, 0x6833, 0x0013, 0x00de, 0x2001, 0x1251, 0x200c, 0xc184,
++	0x2102, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
++	0x0fcd, 0x2009, 0x1262, 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee,
++	0x0005, 0x2001, 0x1251, 0x200c, 0xc185, 0x2102, 0x00fe, 0x002e,
++	0x00ee, 0x0005, 0x9016, 0x702c, 0x2168, 0x6904, 0x206a, 0x8210,
++	0x2d00, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x0804,
++	0x5bcc, 0x00d6, 0x00e6, 0x7824, 0xc0d4, 0x8006, 0x8006, 0x806f,
++	0x2071, 0x1100, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70bc, 0x8000,
++	0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd0a4, 0x1d58,
++	0x00ee, 0x0e04, 0x5c71, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6,
++	0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084,
++	0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
++	0x0fcd, 0x2009, 0x1262, 0x200b, 0x0000, 0x782c, 0x9094, 0x0780,
++	0x190c, 0x5f3b, 0xd09c, 0x1188, 0x00de, 0x8d07, 0x8005, 0x8005,
++	0xc0d5, 0x7822, 0x6804, 0x900d, 0x11e0, 0x00fe, 0x002e, 0x00ee,
++	0x0005, 0x7044, 0xc085, 0x7046, 0x0c40, 0x00de, 0x2d08, 0x7010,
++	0x8000, 0x7012, 0x7018, 0x906d, 0x711a, 0x0110, 0x6902, 0x0008,
++	0x711e, 0x2168, 0x6804, 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee,
++	0x0005, 0x2071, 0x1100, 0x9016, 0x702c, 0x2168, 0x6904, 0x206a,
++	0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be,
++	0x00fe, 0x002e, 0x00ee, 0x0005, 0x2d08, 0x7010, 0x8000, 0x7012,
++	0x7018, 0x906d, 0x711a, 0x0110, 0x6902, 0x0008, 0x711e, 0x2168,
++	0x6804, 0x900d, 0x1904, 0x5d11, 0x782c, 0x9094, 0x0780, 0x190c,
++	0x5f3b, 0xd09c, 0x11c8, 0x701c, 0x906d, 0x01b0, 0x684c, 0x9005,
++	0x1198, 0x7010, 0x8001, 0x7012, 0x1108, 0x701a, 0x2d04, 0x701e,
++	0x8d07, 0x8005, 0x8005, 0xc0d5, 0x7822, 0x782c, 0x9094, 0x0780,
++	0x190c, 0x5f3b, 0xd09c, 0x0d38, 0x782c, 0x9094, 0x0780, 0x190c,
++	0x5f3b, 0xd0a4, 0x05d0, 0x00e6, 0x7824, 0xc0d4, 0x8006, 0x8006,
++	0x806f, 0x2071, 0x1100, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70bc,
++	0x8000, 0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd0a4,
++	0x1d58, 0x00ee, 0x0e04, 0x5d0a, 0x7838, 0x7938, 0x910e, 0x1de0,
++	0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x7044,
++	0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084,
++	0x190c, 0x0fcd, 0x2009, 0x1262, 0x200b, 0x0000, 0x00fe, 0x002e,
++	0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x00fe, 0x002e, 0x00ee,
++	0x0005, 0x00e6, 0x2071, 0x1100, 0x9016, 0x702c, 0x2168, 0x6904,
++	0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200,
++	0x70be, 0x00ee, 0x0804, 0x5cac, 0x2071, 0x1240, 0x206b, 0x0000,
++	0x2d08, 0x7010, 0x8000, 0x7012, 0x7018, 0x906d, 0x711a, 0x0110,
++	0x6902, 0x0008, 0x711e, 0x2168, 0x6804, 0x900d, 0x1128, 0x1e04,
++	0x5d4d, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1100, 0x9016, 0x702c,
++	0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e,
++	0x70bc, 0x9200, 0x70be, 0x0e04, 0x5d39, 0x2071, 0x1240, 0x701c,
++	0x2068, 0x684c, 0x900d, 0x0d28, 0x2071, 0x0000, 0x7182, 0x6850,
++	0x7032, 0x686c, 0x7086, 0x7036, 0x6870, 0x708a, 0x2091, 0x4080,
++	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x0fcd, 0x2071, 0x1240,
++	0x080c, 0x5f27, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1240, 0x206b,
++	0x0000, 0x2d08, 0x7010, 0x8000, 0x7012, 0x7018, 0x906d, 0x711a,
++	0x0110, 0x6902, 0x0008, 0x711e, 0x2168, 0x6804, 0x900d, 0x1118,
++	0x002e, 0x00ee, 0x0005, 0x2071, 0x1100, 0x9016, 0x702c, 0x2168,
++	0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e, 0x70bc,
++	0x9200, 0x70be, 0x002e, 0x00ee, 0x0005, 0x0006, 0x687c, 0x0006,
++	0x6867, 0x0103, 0x20a9, 0x001c, 0x9d80, 0x001d, 0x20a0, 0x9006,
++	0x20e9, 0x0001, 0x4004, 0x000e, 0x9084, 0x00ff, 0x687e, 0x000e,
++	0x687a, 0x6982, 0x0005, 0x2071, 0x1240, 0x7004, 0x0002, 0x5db7,
++	0x5db8, 0x5efc, 0x5eea, 0x5db5, 0x5efc, 0x080c, 0x0d7e, 0x0005,
++	0x2001, 0x1263, 0x2004, 0x0002, 0x5dc2, 0x5dc2, 0x5e1a, 0x5e1b,
++	0x5e85, 0x5e1b, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x5f40, 0x701c,
++	0x906d, 0x01e0, 0x684c, 0x9005, 0x01d8, 0x0e04, 0x5de6, 0x694c,
++	0x2071, 0x0000, 0x7182, 0x6850, 0x7032, 0x686c, 0x7086, 0x7036,
++	0x6870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084,
++	0x190c, 0x0fcd, 0x2071, 0x1240, 0x080c, 0x5f27, 0x012e, 0x0488,
++	0x2001, 0x005b, 0x2004, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd09c,
++	0x2071, 0x1240, 0x1528, 0x2071, 0x1240, 0x700f, 0x0001, 0x6964,
++	0x9184, 0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff,
++	0x8101, 0x0108, 0x710e, 0x8d07, 0x8005, 0x8005, 0xc0d5, 0x00d6,
++	0x2069, 0x0050, 0x6822, 0x00de, 0x2071, 0x1240, 0x701c, 0x2068,
++	0x7010, 0x8001, 0x7012, 0x2d04, 0x701e, 0x9005, 0x1108, 0x701a,
++	0x012e, 0x0005, 0x0005, 0x00d6, 0x2008, 0x2069, 0x1317, 0x683c,
++	0x9005, 0x0760, 0x0158, 0x9186, 0x0003, 0x0540, 0x2001, 0x1113,
++	0x2004, 0x2009, 0x13a1, 0x210c, 0x9102, 0x1500, 0x0126, 0x2091,
++	0x8000, 0x2069, 0x0050, 0x693c, 0x6838, 0x9106, 0x0190, 0x0e04,
++	0x5e4d, 0x2069, 0x0000, 0x6837, 0x8040, 0x6833, 0x0012, 0x6883,
++	0x8040, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
++	0x0fcd, 0x2069, 0x1317, 0x683f, 0xffff, 0x012e, 0x00de, 0x0126,
++	0x2091, 0x8000, 0x1e0c, 0x5fb5, 0x701c, 0x906d, 0x0560, 0x2001,
++	0x005b, 0x2004, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd09c, 0x1518,
++	0x2071, 0x1240, 0x700f, 0x0001, 0x6964, 0x9184, 0x00ff, 0x9086,
++	0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, 0x710e,
++	0x8d07, 0x8005, 0x8005, 0xc0d5, 0x00d6, 0x2069, 0x0050, 0x6822,
++	0x00de, 0x701c, 0x2068, 0x7010, 0x8001, 0x7012, 0x2d04, 0x701e,
++	0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000,
++	0x1e0c, 0x5f40, 0x701c, 0x906d, 0x0548, 0x684c, 0x9086, 0x0004,
++	0x1538, 0x0136, 0x0146, 0x0156, 0x2099, 0x1176, 0x20e1, 0x0001,
++	0x20a1, 0x1290, 0x20e9, 0x0001, 0x20a9, 0x0004, 0x4003, 0x015e,
++	0x014e, 0x013e, 0x2071, 0x1286, 0x9d80, 0x001b, 0x700f, 0x0001,
++	0x7012, 0x7017, 0x0002, 0x7007, 0x0002, 0x700b, 0x0000, 0x2e10,
++	0x080c, 0x0f22, 0x2071, 0x1240, 0x7007, 0x0003, 0x012e, 0x0005,
++	0x2001, 0x005b, 0x2004, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd09c,
++	0x2071, 0x1240, 0x1d98, 0x2071, 0x1240, 0x700f, 0x0001, 0x6964,
++	0x9184, 0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff,
++	0x8101, 0x0108, 0x710e, 0x8d07, 0x8005, 0x8005, 0xc0d5, 0x00d6,
++	0x2069, 0x0050, 0x6822, 0x00de, 0x2071, 0x1240, 0x701c, 0x2068,
++	0x7010, 0x8001, 0x7012, 0x2d04, 0x701e, 0x9005, 0x1978, 0x701a,
++	0x012e, 0x0005, 0x2001, 0x1288, 0x2004, 0x908e, 0x0100, 0x1120,
++	0x7007, 0x0001, 0x04a1, 0x0005, 0x908e, 0x0000, 0x0de0, 0x908e,
++	0x0200, 0x1dc8, 0x080c, 0x5f3b, 0x0005, 0x684f, 0x0004, 0x206b,
++	0x0000, 0x2d08, 0x2071, 0x1240, 0x7010, 0x8000, 0x7012, 0x7018,
++	0x906d, 0x711a, 0x0110, 0x6902, 0x0008, 0x711e, 0x2168, 0x6804,
++	0x900d, 0x1118, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1100, 0x9016,
++	0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8,
++	0x702e, 0x70bc, 0x9200, 0x70be, 0x002e, 0x00ee, 0x0005, 0x0126,
++	0x2091, 0x8000, 0x701c, 0x906d, 0x0160, 0x7010, 0x8001, 0x7012,
++	0x2d04, 0x701e, 0x9005, 0x1108, 0x701a, 0x012e, 0x080c, 0x0ecf,
++	0x0005, 0x012e, 0x0005, 0x2011, 0x8004, 0x080c, 0x3f23, 0x0cf8,
++	0x00f6, 0x2079, 0x0050, 0x7044, 0xd084, 0x01d8, 0xc084, 0x7046,
++	0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836,
++	0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
++	0xd084, 0x190c, 0x0fcd, 0x2009, 0x1262, 0x200b, 0x0000, 0x00fe,
++	0x0005, 0x782c, 0x9094, 0x0780, 0x19b1, 0xd0a4, 0x0dc0, 0x2001,
++	0x1263, 0x2004, 0x9086, 0x0004, 0x0140, 0x2009, 0x1262, 0x2104,
++	0x8000, 0x200a, 0x9082, 0x000f, 0x0e50, 0x00e6, 0x2071, 0x1100,
++	0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009,
++	0x112f, 0x210c, 0x918a, 0x0010, 0x0218, 0x7022, 0x00ee, 0x0060,
++	0x00ee, 0xc0d4, 0x8006, 0x8006, 0x806f, 0x702c, 0x206a, 0x2d00,
++	0x702e, 0x70bc, 0x8000, 0x70be, 0x782c, 0x9094, 0x0780, 0x190c,
++	0x5f3b, 0xd0a4, 0x19e8, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6,
++	0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080,
++	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x0fcd, 0x2009, 0x1262,
++	0x200b, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0050,
++	0x7044, 0xd084, 0x01b8, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e,
++	0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de,
++	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x0fcd,
++	0x00fe, 0x0005, 0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd0a4,
++	0x0db8, 0x00e6, 0x2071, 0x1100, 0x7824, 0xc0d4, 0x8006, 0x8006,
++	0x806f, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70bc, 0x8000, 0x70be,
++	0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd0a4, 0x1d68, 0x00d6,
++	0x2069, 0x0050, 0x693c, 0x2069, 0x1263, 0x6808, 0x690a, 0x2069,
++	0x1317, 0x9102, 0x1118, 0x683c, 0x9005, 0x1328, 0x2001, 0x1264,
++	0x200c, 0x810d, 0x693e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x7090,
++	0x908a, 0x0029, 0x1a0c, 0x0d7e, 0x9082, 0x001d, 0x001b, 0x6027,
++	0x1e00, 0x0005, 0x60da, 0x6064, 0x6080, 0x60a8, 0x60c9, 0x6109,
++	0x611b, 0x6080, 0x60f1, 0x601f, 0x604d, 0x601e, 0x0005, 0x00d6,
++	0x2069, 0x0200, 0x6804, 0x9005, 0x1180, 0x6808, 0x9005, 0x1518,
++	0x7093, 0x0028, 0x2069, 0x12c9, 0x2d04, 0x7002, 0x080c, 0x6404,
++	0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, 0x7093, 0x0028, 0x2069,
++	0x12c9, 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, 0x602a, 0x00e6,
++	0x0036, 0x0046, 0x0056, 0x2071, 0x1347, 0x080c, 0x1577, 0x005e,
++	0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200,
++	0x6804, 0x9005, 0x1178, 0x6808, 0x9005, 0x1160, 0x7093, 0x0028,
++	0x2069, 0x12c9, 0x2d04, 0x7002, 0x080c, 0x6492, 0x6028, 0x9085,
++	0x0600, 0x602a, 0x00de, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c,
++	0x2401, 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x618c, 0xd1d4,
++	0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x7093, 0x0020, 0x080c,
++	0x618c, 0x0028, 0x7093, 0x001d, 0x0010, 0x7093, 0x001f, 0x0005,
++	0x2001, 0x0088, 0x080c, 0x2401, 0x6124, 0xd1cc, 0x11d8, 0xd1dc,
++	0x11b0, 0xd1e4, 0x1188, 0x9184, 0x1e00, 0x11c8, 0x60e3, 0x0001,
++	0x600c, 0xc0b4, 0x600e, 0x080c, 0x6314, 0x2001, 0x0080, 0x080c,
++	0x2401, 0x7093, 0x0028, 0x0058, 0x7093, 0x001e, 0x0040, 0x7093,
++	0x001d, 0x0028, 0x7093, 0x0020, 0x0010, 0x7093, 0x001f, 0x0005,
++	0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x6314, 0x2001,
++	0x0080, 0x080c, 0x2401, 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158,
++	0xd1e4, 0x1130, 0x9184, 0x1e00, 0x1158, 0x7093, 0x0028, 0x0040,
++	0x7093, 0x001e, 0x0028, 0x7093, 0x001d, 0x0010, 0x7093, 0x001f,
++	0x0005, 0x2001, 0x00a0, 0x080c, 0x2401, 0x6124, 0xd1dc, 0x1138,
++	0xd1e4, 0x0138, 0x080c, 0x15a1, 0x7093, 0x001e, 0x0010, 0x7093,
++	0x001d, 0x0005, 0x080c, 0x6205, 0x6124, 0xd1dc, 0x1188, 0x080c,
++	0x618c, 0x0016, 0x080c, 0x15a1, 0x001e, 0xd1d4, 0x1128, 0xd1e4,
++	0x0138, 0x7093, 0x001e, 0x0020, 0x7093, 0x001f, 0x080c, 0x618c,
++	0x0005, 0x0006, 0x2001, 0x00a0, 0x080c, 0x2401, 0x000e, 0x6124,
++	0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140,
++	0x7093, 0x001e, 0x0028, 0x7093, 0x001d, 0x0010, 0x7093, 0x0021,
++	0x0005, 0x080c, 0x6205, 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128,
++	0xd1e4, 0x0140, 0x7093, 0x001e, 0x0028, 0x7093, 0x001d, 0x0010,
++	0x7093, 0x001f, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x2401,
++	0x000e, 0x6124, 0xd1d4, 0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128,
++	0xd1e4, 0x0158, 0x7093, 0x001e, 0x0040, 0x7093, 0x001d, 0x0028,
++	0x7093, 0x0020, 0x0010, 0x7093, 0x001f, 0x0005, 0x0016, 0x00c6,
++	0x00d6, 0x00e6, 0x0126, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071,
++	0x1100, 0x2091, 0x8000, 0x080c, 0x62e4, 0x11f8, 0x2001, 0x110c,
++	0x200c, 0xd1b4, 0x01d0, 0xc1b4, 0x2102, 0x6027, 0x0200, 0x080c,
++	0x2340, 0x6024, 0xd0cc, 0x0168, 0x2001, 0x00a0, 0x080c, 0x2401,
++	0x2001, 0x12a8, 0x2003, 0x0001, 0x2001, 0x1100, 0x2003, 0x0001,
++	0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x6300, 0x0150,
++	0x080c, 0x62f6, 0x1138, 0x2001, 0x0001, 0x080c, 0x1f11, 0x080c,
++	0x62be, 0x00a0, 0x080c, 0x6202, 0x0178, 0x2001, 0x0001, 0x080c,
++	0x1f11, 0x7090, 0x9086, 0x001e, 0x0120, 0x7090, 0x9086, 0x0022,
++	0x1118, 0x7093, 0x0025, 0x0010, 0x7093, 0x0021, 0x012e, 0x00ee,
++	0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x619d, 0x080c,
++	0x72bf, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, 0x619d,
++	0x080c, 0x72b6, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016,
++	0x080c, 0x85a2, 0x2071, 0x1100, 0x080c, 0x6136, 0x001e, 0x00fe,
++	0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6,
++	0x00f6, 0x0126, 0x080c, 0x85a2, 0x2061, 0x0100, 0x2069, 0x0140,
++	0x2071, 0x1100, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, 0x2011,
++	0x0003, 0x080c, 0x88e2, 0x2011, 0x0002, 0x080c, 0x88ec, 0x080c,
++	0x87a2, 0x080c, 0x7271, 0x0036, 0x901e, 0x080c, 0x8847, 0x003e,
++	0x60e3, 0x0000, 0x080c, 0xc44e, 0x080c, 0xc469, 0x2009, 0x0004,
++	0x080c, 0x2355, 0x080c, 0x2261, 0x2001, 0x1100, 0x2003, 0x0004,
++	0x6027, 0x0008, 0x080c, 0x0b68, 0x2001, 0x0001, 0x080c, 0x1f11,
++	0x012e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e,
++	0x0005, 0x0026, 0x00e6, 0x2011, 0x61aa, 0x2071, 0x1317, 0x701c,
++	0x9206, 0x1118, 0x7018, 0x9005, 0x0110, 0x9085, 0x0001, 0x00ee,
++	0x002e, 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800, 0x9084, 0xfffe,
++	0x9086, 0x00c0, 0x0170, 0x2001, 0x00c0, 0x080c, 0x2401, 0x0156,
++	0x20a9, 0x002d, 0x1d04, 0x6212, 0x2091, 0x6000, 0x1f04, 0x6212,
++	0x015e, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069,
++	0x0140, 0x2071, 0x1100, 0x2001, 0x12a8, 0x200c, 0x9186, 0x0000,
++	0x0158, 0x9186, 0x0001, 0x0158, 0x9186, 0x0002, 0x0158, 0x9186,
++	0x0003, 0x0158, 0x0804, 0x62ac, 0x7093, 0x0022, 0x0040, 0x7093,
++	0x0021, 0x0028, 0x7093, 0x0023, 0x0010, 0x7093, 0x0024, 0x60e3,
++	0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x1fb8, 0x0026,
++	0x2011, 0x0003, 0x080c, 0x88e2, 0x2011, 0x0002, 0x080c, 0x88ec,
++	0x080c, 0x87a2, 0x0036, 0x901e, 0x080c, 0x8847, 0x003e, 0x002e,
++	0x7000, 0x908e, 0x0004, 0x0118, 0x602b, 0x0028, 0x0010, 0x602b,
++	0x0020, 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x6024,
++	0xd0ac, 0x0120, 0x012e, 0x015e, 0x0804, 0x62ba, 0x6800, 0x9084,
++	0x00a1, 0xc0bd, 0x6802, 0x080c, 0x2340, 0x6904, 0xd1d4, 0x1140,
++	0x2001, 0x0100, 0x080c, 0x2401, 0x1f04, 0x6267, 0x080c, 0x633e,
++	0x012e, 0x015e, 0x080c, 0x62f6, 0x01a8, 0x6044, 0x9005, 0x0168,
++	0x6050, 0x0006, 0x9085, 0x0020, 0x6052, 0x080c, 0x633e, 0x9006,
++	0x8001, 0x1df0, 0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110,
++	0x080c, 0x633e, 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, 0x0130,
++	0x2009, 0x00c8, 0x2011, 0x61aa, 0x080c, 0x7283, 0x002e, 0x001e,
++	0x2001, 0x12a8, 0x2003, 0x0004, 0x080c, 0x6007, 0x080c, 0x62f6,
++	0x0148, 0x6804, 0xd0d4, 0x1130, 0xd0dc, 0x1100, 0x2001, 0x12a8,
++	0x2003, 0x0000, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6,
++	0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1100, 0x2001,
++	0x12a7, 0x2003, 0x0000, 0x2001, 0x1298, 0x2003, 0x0000, 0x9006,
++	0x7092, 0x60e2, 0x6886, 0x080c, 0x1fb8, 0x9006, 0x080c, 0x2401,
++	0x6043, 0x0090, 0x6043, 0x0010, 0x6027, 0xffff, 0x602b, 0x182f,
++	0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, 0x2001, 0x12a7, 0x2004,
++	0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, 0x2001, 0x1172, 0x2004,
++	0x9084, 0x0030, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x2001,
++	0x1172, 0x2004, 0x9084, 0x0030, 0x9086, 0x0030, 0x000e, 0x0005,
++	0x0006, 0x2001, 0x1172, 0x2004, 0x9084, 0x0030, 0x9086, 0x0010,
++	0x000e, 0x0005, 0x0006, 0x2001, 0x1172, 0x2004, 0x9084, 0x0030,
++	0x9086, 0x0020, 0x000e, 0x0005, 0x0036, 0x0016, 0x2001, 0x110c,
++	0x2004, 0x908c, 0x0013, 0x0190, 0x9084, 0x0011, 0x0120, 0x080c,
++	0x1fd8, 0x900e, 0x0028, 0x080c, 0x58c6, 0x1dc8, 0x2009, 0x0002,
++	0x2019, 0x0028, 0x080c, 0x2831, 0x9006, 0x0019, 0x001e, 0x003e,
++	0x0005, 0x00e6, 0x2071, 0x110c, 0x2e04, 0x0118, 0x9085, 0x0010,
++	0x0010, 0x9084, 0xffef, 0x2072, 0x00ee, 0x0005, 0x6050, 0x0006,
++	0x60ec, 0x0006, 0x600c, 0x0006, 0x6004, 0x0006, 0x6028, 0x0006,
++	0x0016, 0x6138, 0x6050, 0x9084, 0xfbff, 0x9085, 0x2000, 0x6052,
++	0x613a, 0x20a9, 0x0012, 0x1d04, 0x6353, 0x2091, 0x6000, 0x1f04,
++	0x6353, 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, 0x9085, 0x0400,
++	0x9084, 0xdfff, 0x6052, 0x613a, 0x001e, 0x602f, 0x0040, 0x602f,
++	0x0000, 0x000e, 0x602a, 0x000e, 0x6006, 0x000e, 0x600e, 0x000e,
++	0x60ee, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c,
++	0x1fb8, 0x2001, 0x00a0, 0x080c, 0x2401, 0x000e, 0x6052, 0x0005,
++	0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061,
++	0x0100, 0x2069, 0x0140, 0x2071, 0x1100, 0x6020, 0x9084, 0x0080,
++	0x0138, 0x2001, 0x110c, 0x200c, 0xc1c5, 0x2102, 0x0804, 0x63fc,
++	0x2001, 0x110c, 0x200c, 0xc1c4, 0x2102, 0x6028, 0x9084, 0xe1ff,
++	0x602a, 0x6027, 0x0200, 0x2001, 0x0090, 0x080c, 0x2401, 0x20a9,
++	0x0366, 0x6024, 0xd0cc, 0x1510, 0x1d04, 0x63a9, 0x2091, 0x6000,
++	0x1f04, 0x63a9, 0x2011, 0x0003, 0x080c, 0x88e2, 0x2011, 0x0002,
++	0x080c, 0x88ec, 0x080c, 0x87a2, 0x901e, 0x080c, 0x8847, 0x2001,
++	0x00a0, 0x080c, 0x2401, 0x2001, 0x12a8, 0x2003, 0x0001, 0x2001,
++	0x1100, 0x2003, 0x0001, 0x9085, 0x0001, 0x0470, 0x86ff, 0x1110,
++	0x080c, 0x15a1, 0x60e3, 0x0000, 0x2001, 0x1298, 0x2004, 0x080c,
++	0x1fb8, 0x60e2, 0x2001, 0x0080, 0x080c, 0x2401, 0x20a9, 0x0366,
++	0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2340, 0x6024, 0x910c,
++	0x0138, 0x1d04, 0x63e0, 0x2091, 0x6000, 0x1f04, 0x63e0, 0x0810,
++	0x6028, 0x9085, 0x1e00, 0x602a, 0x70ac, 0x9005, 0x1118, 0x6887,
++	0x0001, 0x0008, 0x6886, 0x9006, 0x00ee, 0x00de, 0x00ce, 0x003e,
++	0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036,
++	0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1100, 0x2069,
++	0x0140, 0x6020, 0x9084, 0x00c0, 0x0120, 0x6884, 0x9005, 0x1904,
++	0x6458, 0x2001, 0x0088, 0x080c, 0x2401, 0x9006, 0x60e2, 0x6886,
++	0x080c, 0x1fb8, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, 0x6808,
++	0x9005, 0x01c0, 0x6028, 0x9084, 0xfbff, 0x602a, 0x6027, 0x0400,
++	0x2069, 0x12c9, 0x7000, 0x206a, 0x7093, 0x0026, 0x7003, 0x0001,
++	0x20a9, 0x0002, 0x1d04, 0x643a, 0x2091, 0x6000, 0x1f04, 0x643a,
++	0x0804, 0x648a, 0x2069, 0x0140, 0x20a9, 0x0384, 0x6027, 0x1e00,
++	0x2009, 0x1e00, 0x080c, 0x2340, 0x6024, 0x910c, 0x0528, 0x9084,
++	0x1a00, 0x1510, 0x1d04, 0x6446, 0x2091, 0x6000, 0x1f04, 0x6446,
++	0x2011, 0x0003, 0x080c, 0x88e2, 0x2011, 0x0002, 0x080c, 0x88ec,
++	0x080c, 0x87a2, 0x901e, 0x080c, 0x8847, 0x2001, 0x00a0, 0x080c,
++	0x2401, 0x2001, 0x12a8, 0x2003, 0x0001, 0x2001, 0x1100, 0x2003,
++	0x0001, 0x9085, 0x0001, 0x00b0, 0x2001, 0x0080, 0x080c, 0x2401,
++	0x2069, 0x0140, 0x60e3, 0x0000, 0x70ac, 0x9005, 0x1118, 0x6887,
++	0x0001, 0x0008, 0x6886, 0x2001, 0x1298, 0x2004, 0x080c, 0x1fb8,
++	0x60e2, 0x9006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e,
++	0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6,
++	0x00e6, 0x2061, 0x0100, 0x2071, 0x1100, 0x6020, 0x9084, 0x00c0,
++	0x01e8, 0x2011, 0x0003, 0x080c, 0x88e2, 0x2011, 0x0002, 0x080c,
++	0x88ec, 0x080c, 0x87a2, 0x901e, 0x080c, 0x8847, 0x2069, 0x0140,
++	0x2001, 0x00a0, 0x080c, 0x2401, 0x2001, 0x12a8, 0x2003, 0x0001,
++	0x2001, 0x1100, 0x2003, 0x0001, 0x0804, 0x6529, 0x2001, 0x110c,
++	0x200c, 0xd1b4, 0x1160, 0xc1b5, 0x2102, 0x080c, 0x6192, 0x2069,
++	0x0140, 0x2001, 0x0080, 0x080c, 0x2401, 0x60e3, 0x0000, 0x2069,
++	0x0200, 0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x0180, 0x6028,
++	0x9084, 0xfdff, 0x602a, 0x6027, 0x0200, 0x2069, 0x12c9, 0x7000,
++	0x206a, 0x7093, 0x0027, 0x7003, 0x0001, 0x0804, 0x6529, 0x6027,
++	0x1e00, 0x2009, 0x1e00, 0x080c, 0x2340, 0x6024, 0x910c, 0x01c8,
++	0x9084, 0x1c00, 0x11b0, 0x1d04, 0x64e7, 0x0006, 0x0016, 0x00c6,
++	0x00d6, 0x00e6, 0x080c, 0x715a, 0x00ee, 0x00de, 0x00ce, 0x001e,
++	0x000e, 0x00e6, 0x2071, 0x1317, 0x7018, 0x00ee, 0x9005, 0x19f8,
++	0x0500, 0x0026, 0x2011, 0x61aa, 0x080c, 0x71fa, 0x2011, 0x619d,
++	0x080c, 0x72bf, 0x002e, 0x2069, 0x0140, 0x60e3, 0x0000, 0x70ac,
++	0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, 0x1298,
++	0x2004, 0x080c, 0x1fb8, 0x60e2, 0x2001, 0x110c, 0x200c, 0xc1b4,
++	0x2102, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e,
++	0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x0046, 0x00c6, 0x00e6,
++	0x2061, 0x0100, 0x2071, 0x1100, 0x7130, 0xd184, 0x1170, 0x080c,
++	0x2987, 0x0138, 0xc18d, 0x7132, 0x2011, 0x1153, 0x2214, 0xd2ac,
++	0x1120, 0x7030, 0xd08c, 0x0904, 0x658f, 0x2011, 0x1153, 0x220c,
++	0xd1a4, 0x0528, 0x0016, 0x2019, 0x000e, 0x080c, 0xc0b9, 0x0156,
++	0x20a9, 0x007f, 0x900e, 0x9186, 0x007e, 0x01a0, 0x9186, 0x0080,
++	0x0188, 0x080c, 0x5608, 0x1170, 0x8127, 0x9006, 0x0016, 0x2009,
++	0x000e, 0x080c, 0xc12f, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c,
++	0x73af, 0x001e, 0x8108, 0x1f04, 0x655b, 0x015e, 0x001e, 0xd1ac,
++	0x1148, 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x2831,
++	0x001e, 0x0068, 0x0156, 0x20a9, 0x007f, 0x900e, 0x080c, 0x5608,
++	0x1110, 0x080c, 0x5100, 0x8108, 0x1f04, 0x6586, 0x015e, 0x080c,
++	0x15a1, 0x2011, 0x0003, 0x080c, 0x88e2, 0x2011, 0x0002, 0x080c,
++	0x88ec, 0x080c, 0x87a2, 0x0036, 0x901e, 0x080c, 0x8847, 0x003e,
++	0x60e3, 0x0000, 0x2001, 0x1100, 0x2003, 0x0001, 0x080c, 0x621a,
++	0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005,
++	0x2071, 0x120c, 0x7003, 0x0000, 0x7007, 0x0000, 0x708f, 0x0000,
++	0x7093, 0x0001, 0x70c7, 0x0000, 0x0005, 0x00e6, 0x2071, 0x0040,
++	0x6848, 0x9005, 0x1120, 0x9085, 0x0001, 0x0804, 0x660e, 0x6840,
++	0x9005, 0x01d8, 0x900e, 0x0156, 0x20a9, 0x0006, 0x8003, 0x2011,
++	0x0100, 0x2214, 0x9296, 0x0008, 0x1110, 0x818d, 0x0010, 0x81f5,
++	0x3e08, 0x1f04, 0x65ce, 0x015e, 0x6a50, 0x9200, 0x7002, 0x6854,
++	0x9101, 0x7006, 0x9006, 0x7012, 0x7016, 0x6850, 0x7002, 0x6854,
++	0x7006, 0x6858, 0x700a, 0x685c, 0x700e, 0x6840, 0x9005, 0x1110,
++	0x7012, 0x7016, 0x6848, 0x701a, 0x701c, 0x9085, 0x0040, 0x701e,
++	0x2001, 0x0019, 0x7036, 0x702b, 0x0001, 0x2001, 0x0004, 0x200c,
++	0x918c, 0xfff7, 0x918d, 0x8000, 0x2102, 0x00d6, 0x2069, 0x120c,
++	0x6807, 0x0001, 0x00de, 0x080c, 0x6b26, 0x9006, 0x00ee, 0x0005,
++	0x2079, 0x0040, 0x2071, 0x120c, 0x7004, 0x0002, 0x6620, 0x6621,
++	0x6bb3, 0x66b3, 0x67a9, 0x661e, 0x661e, 0x67d2, 0x080c, 0x0d7e,
++	0x0005, 0x2079, 0x0040, 0x782c, 0x908c, 0x0780, 0x190c, 0x6bb4,
++	0xd0a4, 0x0508, 0x7824, 0xc0d4, 0x8006, 0x8006, 0x806f, 0x9006,
++	0x6802, 0x6806, 0x6864, 0x9084, 0x00ff, 0x908a, 0x0040, 0x12c0,
++	0x04d3, 0x2001, 0x1100, 0x200c, 0x9186, 0x0003, 0x1160, 0x7104,
++	0x9186, 0x0004, 0x0140, 0x9186, 0x0007, 0x0128, 0x9186, 0x0003,
++	0x19d0, 0x080c, 0x66b3, 0x782c, 0xd09c, 0x090c, 0x6b26, 0x0005,
++	0x9082, 0x005a, 0x1218, 0x2100, 0x0023, 0x0c18, 0x080c, 0x66ec,
++	0x0c90, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec,
++	0x66ec, 0x670e, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec,
++	0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec,
++	0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66f8, 0x66ec, 0x688e,
++	0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66f8, 0x68cf, 0x6910,
++	0x6957, 0x696b, 0x66ec, 0x66ec, 0x670e, 0x66f8, 0x66ec, 0x66ec,
++	0x6782, 0x6a16, 0x6a31, 0x66ec, 0x670e, 0x66ec, 0x66ec, 0x66ec,
++	0x66ec, 0x6778, 0x6a31, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec,
++	0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x6722, 0x66ec, 0x66ec, 0x66ec,
++	0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x6b59, 0x66ec,
++	0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x6736, 0x66ec, 0x66ec, 0x66ec,
++	0x66ec, 0x66ec, 0x66ec, 0x2079, 0x0040, 0x7004, 0x9086, 0x0003,
++	0x11b0, 0x782c, 0x080c, 0x6b52, 0xd0a4, 0x0188, 0x7824, 0xc0d4,
++	0x8006, 0x8006, 0x806f, 0x9006, 0x6802, 0x6806, 0x6864, 0x9084,
++	0x00ff, 0x908a, 0x001a, 0x1210, 0x002b, 0x0c38, 0x00e9, 0x080c,
++	0x6b26, 0x0005, 0x66ec, 0x66f8, 0x687a, 0x66ec, 0x66f8, 0x66ec,
++	0x66f8, 0x66f8, 0x66ec, 0x66f8, 0x687a, 0x66f8, 0x66f8, 0x66f8,
++	0x66f8, 0x66f8, 0x66ec, 0x66f8, 0x687a, 0x66ec, 0x66ec, 0x66f8,
++	0x66ec, 0x66ec, 0x66ec, 0x66f8, 0x00e6, 0x2071, 0x120c, 0x2009,
++	0x0400, 0x0071, 0x00ee, 0x0005, 0x2009, 0x1000, 0x0049, 0x0005,
++	0x2009, 0x2000, 0x0029, 0x0005, 0x2009, 0x0800, 0x0009, 0x0005,
++	0x7007, 0x0001, 0x6868, 0x9084, 0x00ff, 0x9105, 0x686a, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x5b76, 0x012e, 0x0005, 0x6864, 0x8007,
++	0x9084, 0x00ff, 0x0d08, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804,
++	0x683b, 0x7007, 0x0003, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b,
++	0x683b, 0x0005, 0x6864, 0x8007, 0x9084, 0x00ff, 0x0968, 0x8001,
++	0x1120, 0x7007, 0x0001, 0x0804, 0x6853, 0x7007, 0x0003, 0x7012,
++	0x2d00, 0x7016, 0x701a, 0x704b, 0x6853, 0x0005, 0x6864, 0x8007,
++	0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x66f4, 0x7007, 0x0001,
++	0x2009, 0x1133, 0x210c, 0x81ff, 0x11a8, 0x6868, 0x9084, 0x00ff,
++	0x686a, 0x6883, 0x0000, 0x080c, 0x52f4, 0x1108, 0x0005, 0x0126,
++	0x2091, 0x8000, 0x6867, 0x0139, 0x687a, 0x6982, 0x080c, 0x5b76,
++	0x012e, 0x0ca0, 0x6994, 0x9186, 0x0071, 0x0d38, 0x9186, 0x0064,
++	0x0d20, 0x9186, 0x007c, 0x0d08, 0x9186, 0x0028, 0x09f0, 0x9186,
++	0x0038, 0x09d8, 0x9186, 0x0078, 0x09c0, 0x9186, 0x005f, 0x09a8,
++	0x6897, 0x4005, 0x689b, 0x0001, 0x2001, 0x0030, 0x900e, 0x08b8,
++	0x687c, 0x9084, 0x00c0, 0x9086, 0x00c0, 0x1120, 0x7007, 0x0001,
++	0x0804, 0x6a48, 0x2d00, 0x7016, 0x701a, 0x20a9, 0x0004, 0x20e1,
++	0x0001, 0x20e9, 0x0001, 0x9080, 0x0030, 0x2098, 0x20a1, 0x1239,
++	0x4003, 0x6888, 0x7012, 0x9082, 0x0401, 0x1a04, 0x66fc, 0x6ab4,
++	0x928a, 0x0002, 0x1a04, 0x66fc, 0x82ff, 0x1138, 0x68b8, 0x69bc,
++	0x9105, 0x0118, 0x2001, 0x680e, 0x0018, 0x9280, 0x6804, 0x2005,
++	0x70ce, 0x7010, 0x9015, 0x0904, 0x67f0, 0x080c, 0x0e9d, 0x1118,
++	0x7007, 0x0004, 0x0005, 0x2d00, 0x7022, 0x70cc, 0x2060, 0xe000,
++	0x6866, 0xe004, 0x9d00, 0x709e, 0x709b, 0x0001, 0xe008, 0x920a,
++	0x1210, 0x900e, 0x2200, 0x7112, 0xe20c, 0x8003, 0x800b, 0x9296,
++	0x0004, 0x0108, 0x9108, 0x71a2, 0x810b, 0x71a6, 0x9e90, 0x0023,
++	0x080c, 0x0f22, 0x7094, 0x908e, 0x0100, 0x0170, 0x9086, 0x0200,
++	0x0118, 0x7007, 0x0007, 0x0005, 0x7020, 0x2068, 0x080c, 0x0ecf,
++	0x7014, 0x2068, 0x0804, 0x66fc, 0x7020, 0x2068, 0x7018, 0x6802,
++	0x6807, 0x0000, 0x2d08, 0x2068, 0x6906, 0x711a, 0x0804, 0x67a9,
++	0x7014, 0x2068, 0x7007, 0x0001, 0x68b4, 0x9005, 0x1128, 0x68b8,
++	0x69bc, 0x9105, 0x0108, 0x00b1, 0x6864, 0x9084, 0x00ff, 0x9086,
++	0x001e, 0x0904, 0x6a48, 0x04b8, 0x6806, 0x680a, 0x0002, 0x001d,
++	0x0007, 0x0004, 0x000a, 0x001b, 0x0005, 0x0006, 0x000a, 0x001d,
++	0x0005, 0x0004, 0x00f6, 0x00e6, 0x00c6, 0x0076, 0x0066, 0x6fb8,
++	0x6ebc, 0x6804, 0x2060, 0x9cf0, 0x002d, 0x9cf8, 0x0033, 0x2009,
++	0x0005, 0x700c, 0x7816, 0x7008, 0x7812, 0x7004, 0x7806, 0x7000,
++	0x7802, 0x7e0e, 0x7f0a, 0x8109, 0x0128, 0x9ef2, 0x0004, 0x9ffa,
++	0x0006, 0x0c78, 0x6004, 0x9065, 0x1d30, 0x006e, 0x007e, 0x00ce,
++	0x00ee, 0x00fe, 0x0005, 0x2009, 0x1133, 0x210c, 0x81ff, 0x1178,
++	0x080c, 0x5151, 0x1108, 0x0005, 0x080c, 0x5d95, 0x0126, 0x2091,
++	0x8000, 0x080c, 0xac01, 0x080c, 0x5b76, 0x012e, 0x0ca0, 0x2001,
++	0x0028, 0x900e, 0x0c88, 0x2009, 0x1133, 0x210c, 0x81ff, 0x11d8,
++	0x6888, 0x9005, 0x01e0, 0x6883, 0x0000, 0x687c, 0xd0f4, 0x0120,
++	0x080c, 0x5250, 0x1138, 0x0005, 0x9006, 0x687a, 0x080c, 0x51e5,
++	0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0x687a, 0x6982, 0x080c,
++	0x5b76, 0x012e, 0x0cb0, 0x2001, 0x0028, 0x900e, 0x0c98, 0x2001,
++	0x0000, 0x0c80, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906, 0x711a,
++	0x7010, 0x8001, 0x7012, 0x0118, 0x7007, 0x0003, 0x0030, 0x7014,
++	0x2068, 0x7007, 0x0001, 0x7048, 0x080f, 0x0005, 0x7007, 0x0001,
++	0x6974, 0x810f, 0x918c, 0x00ff, 0x6878, 0x9084, 0x00ff, 0x20a9,
++	0x0001, 0x9096, 0x0001, 0x01a8, 0x900e, 0x20a9, 0x00ff, 0x9096,
++	0x0002, 0x0178, 0x9005, 0x11f0, 0x6974, 0x810f, 0x918c, 0x00ff,
++	0x080c, 0x5608, 0x11b8, 0x0066, 0x6e80, 0x080c, 0x5703, 0x006e,
++	0x0088, 0x0046, 0x2011, 0x110c, 0x2224, 0xc484, 0x2412, 0x004e,
++	0x00c6, 0x080c, 0x5608, 0x1110, 0x080c, 0x57c6, 0x8108, 0x1f04,
++	0x68b9, 0x00ce, 0x687c, 0xd084, 0x1118, 0x080c, 0x0ecf, 0x0005,
++	0x0126, 0x2091, 0x8000, 0x080c, 0x5b76, 0x012e, 0x0005, 0x0126,
++	0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x58cb, 0x0580, 0x2061,
++	0x1354, 0x6100, 0xd184, 0x0178, 0x6888, 0x9084, 0x00ff, 0x1550,
++	0x6000, 0xd084, 0x0520, 0x6004, 0x9005, 0x1538, 0x6003, 0x0000,
++	0x600b, 0x0000, 0x00c8, 0x2011, 0x0001, 0x6890, 0x9005, 0x1110,
++	0x2001, 0x001e, 0x8000, 0x6016, 0x6888, 0x9084, 0x00ff, 0x0178,
++	0x6006, 0x6888, 0x8007, 0x9084, 0x00ff, 0x0148, 0x600a, 0x6888,
++	0x8000, 0x1108, 0xc28d, 0x6202, 0x012e, 0x0804, 0x6b10, 0x012e,
++	0x0804, 0x6b0a, 0x012e, 0x0804, 0x6b04, 0x012e, 0x0804, 0x6b07,
++	0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x58cb, 0x05e0,
++	0x2061, 0x1354, 0x6000, 0xd084, 0x05b8, 0x6204, 0x6308, 0xd08c,
++	0x1530, 0x6c78, 0x9484, 0x0003, 0x0170, 0x6988, 0x918c, 0x00ff,
++	0x8001, 0x1120, 0x2100, 0x9210, 0x0620, 0x0028, 0x8001, 0x1508,
++	0x2100, 0x9212, 0x02f0, 0x9484, 0x000c, 0x0188, 0x6988, 0x810f,
++	0x918c, 0x00ff, 0x9082, 0x0004, 0x1120, 0x2100, 0x9318, 0x0288,
++	0x0030, 0x9082, 0x0004, 0x1168, 0x2100, 0x931a, 0x0250, 0x6890,
++	0x9005, 0x0110, 0x8000, 0x6016, 0x6206, 0x630a, 0x012e, 0x0804,
++	0x6b10, 0x012e, 0x0804, 0x6b0d, 0x012e, 0x0804, 0x6b0a, 0x0126,
++	0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0x1354, 0x6300, 0xd38c,
++	0x1120, 0x6308, 0x8318, 0x0220, 0x630a, 0x012e, 0x0804, 0x6b1e,
++	0x012e, 0x0804, 0x6b0d, 0x0126, 0x00c6, 0x2091, 0x8000, 0x7007,
++	0x0001, 0x687c, 0xd0ac, 0x0148, 0x00c6, 0x2061, 0x1354, 0x6000,
++	0x9084, 0xfcff, 0x6002, 0x00ce, 0x0440, 0x6888, 0x9005, 0x05c8,
++	0x688c, 0x9065, 0x0590, 0x2001, 0x1133, 0x2004, 0x9005, 0x0118,
++	0x080c, 0x8f09, 0x0068, 0x6017, 0x0400, 0x605b, 0x0000, 0x697c,
++	0xd1a4, 0x0110, 0x6980, 0x615a, 0x2009, 0x0041, 0x080c, 0x8f53,
++	0x6988, 0x918c, 0xff00, 0x9186, 0x2000, 0x1138, 0x0026, 0x900e,
++	0x2011, 0xfdff, 0x080c, 0x73af, 0x002e, 0x687c, 0xd0c4, 0x0148,
++	0x2061, 0x1354, 0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208,
++	0x600a, 0x00ce, 0x012e, 0x0804, 0x6b10, 0x00ce, 0x012e, 0x0804,
++	0x6b0a, 0x6984, 0x9186, 0x002e, 0x0d40, 0x9186, 0x002d, 0x0d28,
++	0x9186, 0x0045, 0x0528, 0x9186, 0x002a, 0x1130, 0x2001, 0x110c,
++	0x200c, 0xc194, 0x2102, 0x08c8, 0x9186, 0x0020, 0x0170, 0x9186,
++	0x0029, 0x1d18, 0x6974, 0x918c, 0xff00, 0x810f, 0x080c, 0x5608,
++	0x1960, 0x6000, 0xc0e4, 0x6002, 0x0840, 0x688c, 0x9065, 0x09a8,
++	0x6007, 0x0024, 0x2001, 0x12c0, 0x2004, 0x601a, 0x0804, 0x69a5,
++	0x688c, 0x9065, 0x0950, 0x00e6, 0x6890, 0x9075, 0x2001, 0x1133,
++	0x2004, 0x9005, 0x0150, 0x080c, 0x8f09, 0x8eff, 0x0118, 0x2e60,
++	0x080c, 0x8f09, 0x00ee, 0x0804, 0x69a5, 0x6024, 0xc0dc, 0xc0d5,
++	0x6026, 0x2e60, 0x6007, 0x003a, 0x68a0, 0x9005, 0x0130, 0x6007,
++	0x003b, 0x68a4, 0x602e, 0x68a8, 0x6016, 0x6003, 0x0001, 0x080c,
++	0x756e, 0x080c, 0x7aa4, 0x00ee, 0x0804, 0x69a5, 0x2061, 0x1354,
++	0x6000, 0xd084, 0x0190, 0xd08c, 0x1904, 0x6b1e, 0x0126, 0x2091,
++	0x8000, 0x6204, 0x8210, 0x0220, 0x6206, 0x012e, 0x0804, 0x6b1e,
++	0x012e, 0x6883, 0x0016, 0x0804, 0x6b17, 0x6883, 0x0007, 0x0804,
++	0x6b17, 0x6864, 0x8007, 0x9084, 0x00ff, 0x0130, 0x8001, 0x1138,
++	0x7007, 0x0001, 0x0069, 0x0005, 0x080c, 0x66f4, 0x0040, 0x7007,
++	0x0003, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x6a48, 0x0005,
++	0x00e6, 0x0126, 0x2091, 0x8000, 0x903e, 0x2061, 0x1100, 0x61cc,
++	0x81ff, 0x1904, 0x6aca, 0x6130, 0xd194, 0x1904, 0x6af4, 0x6878,
++	0x2070, 0x9e82, 0x15c0, 0x0a04, 0x6abe, 0x6060, 0x9e02, 0x1a04,
++	0x6abe, 0x7120, 0x9186, 0x0006, 0x1904, 0x6aad, 0x7010, 0x9005,
++	0x0904, 0x6aca, 0x2004, 0xd0e4, 0x1904, 0x6aef, 0x2061, 0x1354,
++	0x6100, 0x9184, 0x0301, 0x9086, 0x0001, 0x1590, 0x7024, 0xd0dc,
++	0x1904, 0x6af7, 0x6883, 0x0000, 0x6803, 0x0000, 0x2d08, 0x7014,
++	0x9005, 0x1198, 0x7116, 0x687c, 0xd0f4, 0x1904, 0x6afa, 0x2001,
++	0x1153, 0x2004, 0xd09c, 0x1118, 0x687c, 0xc0cc, 0x687e, 0x2e60,
++	0x080c, 0x72d9, 0x012e, 0x00ee, 0x0005, 0x2068, 0x6800, 0x9005,
++	0x1de0, 0x6902, 0x2168, 0x687c, 0xd0f4, 0x1904, 0x6afa, 0x012e,
++	0x00ee, 0x0005, 0x012e, 0x00ee, 0x6883, 0x0006, 0x0804, 0x6b17,
++	0xd184, 0x0dc0, 0xd1c4, 0x11a8, 0x00b8, 0x6974, 0x918c, 0xff00,
++	0x810f, 0x080c, 0x5608, 0x15d8, 0x6000, 0xd0e4, 0x15c0, 0x7120,
++	0x9186, 0x0007, 0x1118, 0x6883, 0x0002, 0x0498, 0x6883, 0x0008,
++	0x0480, 0x6883, 0x000e, 0x0468, 0x6883, 0x0017, 0x0450, 0x6883,
++	0x0035, 0x0438, 0x2001, 0x1172, 0x2004, 0xd0fc, 0x01e8, 0x6878,
++	0x2070, 0x9e82, 0x15c0, 0x02c0, 0x6060, 0x9e02, 0x12a8, 0x7120,
++	0x9186, 0x0006, 0x1188, 0x7010, 0x9005, 0x0170, 0x2004, 0xd0bc,
++	0x0158, 0x2039, 0x0001, 0x7000, 0x9086, 0x0007, 0x1904, 0x6a53,
++	0x7003, 0x0002, 0x0804, 0x6a53, 0x6883, 0x0028, 0x0010, 0x6883,
++	0x0029, 0x012e, 0x00ee, 0x0418, 0x6883, 0x002a, 0x0cd0, 0x6883,
++	0x0045, 0x0cb8, 0x2e60, 0x2019, 0x0002, 0x601b, 0x0014, 0x080c,
++	0xbd23, 0x012e, 0x00ee, 0x0005, 0x2009, 0x003e, 0x0058, 0x2009,
++	0x0004, 0x0040, 0x2009, 0x0006, 0x0028, 0x2009, 0x0016, 0x0010,
++	0x2009, 0x0001, 0x6884, 0x9084, 0xff00, 0x9105, 0x6886, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x5b76, 0x012e, 0x0005, 0x080c, 0x0ecf,
++	0x0005, 0x00d6, 0x080c, 0x72d0, 0x00de, 0x0005, 0x00d6, 0x00e6,
++	0x0126, 0x2091, 0x8000, 0x2071, 0x0040, 0x702c, 0xd084, 0x01f0,
++	0x908c, 0x0780, 0x190c, 0x6bb4, 0xd09c, 0x11c0, 0x2071, 0x1100,
++	0x70bc, 0x90ea, 0x0010, 0x0290, 0x8001, 0x70be, 0x702c, 0x2068,
++	0x2d04, 0x702e, 0x9006, 0x206a, 0x6806, 0x2071, 0x0040, 0x8d07,
++	0x8005, 0x8005, 0xc0d5, 0x7022, 0x702c, 0x0c10, 0x012e, 0x00ee,
++	0x00de, 0x0005, 0x0006, 0x9084, 0x0780, 0x190c, 0x6bb4, 0x000e,
++	0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x7007, 0x0001,
++	0x6a74, 0x9282, 0x0004, 0x1a04, 0x6ba4, 0x697c, 0x9188, 0x1000,
++	0x2104, 0x9065, 0x6004, 0xd284, 0x0140, 0x05e0, 0x8007, 0x9084,
++	0x00ff, 0x9084, 0x0006, 0x1108, 0x04a8, 0x2c10, 0x080c, 0x8e83,
++	0x1118, 0x080c, 0x8f26, 0x05a0, 0x6212, 0x6874, 0x0002, 0x6b83,
++	0x6b88, 0x6b8b, 0x6b91, 0x2019, 0x0002, 0x080c, 0xc0b9, 0x0060,
++	0x080c, 0xc05a, 0x0048, 0x2019, 0x0002, 0x6980, 0x080c, 0xc072,
++	0x0018, 0x6980, 0x080c, 0xc05a, 0x080c, 0x8ed9, 0x6887, 0x0000,
++	0x0126, 0x2091, 0x8000, 0x080c, 0x5b76, 0x012e, 0x001e, 0x002e,
++	0x003e, 0x00ce, 0x00de, 0x0005, 0x6887, 0x0006, 0x0c88, 0x6887,
++	0x0002, 0x0c70, 0x6887, 0x0005, 0x0c58, 0x6887, 0x0004, 0x0c40,
++	0x6887, 0x0007, 0x0c28, 0x0005, 0x2011, 0x8003, 0x080c, 0x3f23,
++	0x0cf8, 0x0005, 0x00f6, 0x2079, 0x0300, 0x2001, 0x0200, 0x200c,
++	0xc1e5, 0xc1dc, 0x2102, 0x2009, 0x0218, 0x210c, 0xd1ec, 0x1120,
++	0x080c, 0x12a2, 0x00fe, 0x0005, 0x2001, 0x020d, 0x2003, 0x0020,
++	0x2001, 0x0307, 0x2003, 0x0300, 0x00fe, 0x0005, 0x781c, 0xd08c,
++	0x05d8, 0x7d44, 0x7c40, 0x9584, 0x00f6, 0x1508, 0x9484, 0x7000,
++	0x0138, 0x908a, 0x2000, 0x1258, 0x9584, 0x0700, 0x8007, 0x0498,
++	0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x0db0, 0x00b0, 0x9484,
++	0x0fff, 0x1130, 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x11b0,
++	0x080c, 0xc426, 0x080c, 0x709e, 0x7817, 0x0140, 0x0098, 0x9584,
++	0x0076, 0x1118, 0x080c, 0x70fb, 0x19c8, 0xd5a4, 0x0138, 0x0046,
++	0x0056, 0x080c, 0x1a74, 0x005e, 0x004e, 0x0020, 0x080c, 0xc426,
++	0x7817, 0x0140, 0x080c, 0x6c56, 0x2001, 0x130d, 0x2004, 0x9005,
++	0x090c, 0x7aa4, 0x0005, 0x0002, 0x6c2d, 0x6eb5, 0x6c24, 0x6c24,
++	0x6c24, 0x6c24, 0x6c24, 0x6c24, 0x7817, 0x0140, 0x2001, 0x130d,
++	0x2004, 0x9005, 0x090c, 0x7aa4, 0x0005, 0x7000, 0x908c, 0xff00,
++	0x9194, 0xf000, 0x810f, 0x9484, 0x0fff, 0x688a, 0x9286, 0x2000,
++	0x1148, 0x6800, 0x9086, 0x0001, 0x1118, 0x080c, 0x483b, 0x0068,
++	0x0451, 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, 0x6e02, 0x0028,
++	0x9286, 0x8000, 0x1110, 0x080c, 0x6fc8, 0x7817, 0x0140, 0x2001,
++	0x130d, 0x2004, 0x9005, 0x090c, 0x7aa4, 0x0005, 0x2001, 0x110f,
++	0x2004, 0xd08c, 0x0178, 0x2001, 0x1100, 0x2004, 0x9086, 0x0003,
++	0x1148, 0x0026, 0x0036, 0x2011, 0x8048, 0x2518, 0x080c, 0x3f23,
++	0x003e, 0x002e, 0x0005, 0x00c6, 0x7010, 0x9084, 0xff00, 0x8007,
++	0x9096, 0x0001, 0x0120, 0x9096, 0x0023, 0x1904, 0x6dd3, 0x9186,
++	0x0023, 0x1550, 0x080c, 0x7061, 0x0904, 0x6dd3, 0x7124, 0x610a,
++	0x7030, 0x908e, 0x0200, 0x1130, 0x2009, 0x0015, 0x080c, 0x8f53,
++	0x0804, 0x6dd3, 0x908e, 0x0214, 0x0118, 0x908e, 0x0210, 0x1130,
++	0x2009, 0x0015, 0x080c, 0x8f53, 0x0804, 0x6dd3, 0x908e, 0x0100,
++	0x1904, 0x6dd3, 0x7034, 0x9005, 0x1904, 0x6dd3, 0x2009, 0x0016,
++	0x080c, 0x8f53, 0x0804, 0x6dd3, 0x9186, 0x0022, 0x1904, 0x6dd3,
++	0x7030, 0x908e, 0x0300, 0x1580, 0x68d8, 0xd0a4, 0x0528, 0xc0b5,
++	0x68da, 0x7100, 0x918c, 0x00ff, 0x6976, 0x7004, 0x687a, 0x00f6,
++	0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006, 0x9084, 0x00ff, 0x0016,
++	0x2008, 0x080c, 0x1f8d, 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe,
++	0x080c, 0x1f63, 0x6956, 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086,
++	0x2071, 0x1100, 0x70ae, 0x00ee, 0x7034, 0x9005, 0x1904, 0x6dd3,
++	0x2009, 0x0017, 0x0804, 0x6d92, 0x908e, 0x0400, 0x1158, 0x7034,
++	0x9005, 0x1904, 0x6dd3, 0x68d8, 0xc0a5, 0x68da, 0x2009, 0x0030,
++	0x0804, 0x6d92, 0x908e, 0x0500, 0x1140, 0x7034, 0x9005, 0x1904,
++	0x6dd3, 0x2009, 0x0018, 0x0804, 0x6d92, 0x908e, 0x2010, 0x1120,
++	0x2009, 0x0019, 0x0804, 0x6d92, 0x908e, 0x2110, 0x1120, 0x2009,
++	0x001a, 0x0804, 0x6d92, 0x908e, 0x5200, 0x1140, 0x7034, 0x9005,
++	0x1904, 0x6dd3, 0x2009, 0x001b, 0x0804, 0x6d92, 0x908e, 0x5000,
++	0x1140, 0x7034, 0x9005, 0x1904, 0x6dd3, 0x2009, 0x001c, 0x0804,
++	0x6d92, 0x908e, 0x1300, 0x1120, 0x2009, 0x0034, 0x0804, 0x6d92,
++	0x908e, 0x1200, 0x1140, 0x7034, 0x9005, 0x1904, 0x6dd3, 0x2009,
++	0x0024, 0x0804, 0x6d92, 0x908c, 0xff00, 0x918e, 0x2400, 0x1120,
++	0x2009, 0x002d, 0x0804, 0x6d92, 0x908c, 0xff00, 0x918e, 0x5300,
++	0x1120, 0x2009, 0x002a, 0x0804, 0x6d92, 0x908e, 0x0f00, 0x1120,
++	0x2009, 0x0020, 0x0804, 0x6d92, 0x908e, 0x5300, 0x1108, 0x00d8,
++	0x908e, 0x6104, 0x11c0, 0x2011, 0x026d, 0x8208, 0x2204, 0x9082,
++	0x0004, 0x8004, 0x8004, 0x20a8, 0x2011, 0x8015, 0x211c, 0x8108,
++	0x0046, 0x2124, 0x080c, 0x3f23, 0x004e, 0x8108, 0x1f04, 0x6d54,
++	0x2009, 0x0023, 0x0478, 0x908e, 0x6000, 0x1118, 0x2009, 0x003f,
++	0x0448, 0x908e, 0x7800, 0x1118, 0x2009, 0x0045, 0x0418, 0x908e,
++	0x1000, 0x1118, 0x2009, 0x004e, 0x00e8, 0x908e, 0x6300, 0x1118,
++	0x2009, 0x004a, 0x00b8, 0x908c, 0xff00, 0x918e, 0x5600, 0x1118,
++	0x2009, 0x004f, 0x0078, 0x908c, 0xff00, 0x918e, 0x5700, 0x1118,
++	0x2009, 0x0050, 0x0038, 0x2009, 0x001d, 0x6834, 0xd0d4, 0x0110,
++	0x2009, 0x004c, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c,
++	0x080c, 0x1f63, 0x15d0, 0x080c, 0x55b3, 0x15b8, 0x6612, 0x6516,
++	0x86ff, 0x01e8, 0x001e, 0x0016, 0x9186, 0x0017, 0x1158, 0x6874,
++	0x9606, 0x11a8, 0x6878, 0x9506, 0x9084, 0xff00, 0x1180, 0x6000,
++	0xc0f5, 0x6002, 0x9186, 0x0046, 0x1150, 0x6874, 0x9606, 0x1138,
++	0x6878, 0x9506, 0x9084, 0xff00, 0x1110, 0x001e, 0x00a0, 0x00c6,
++	0x080c, 0x8e83, 0x001e, 0x0198, 0x6112, 0x6023, 0x0004, 0x7120,
++	0x610a, 0x001e, 0x9186, 0x004c, 0x1110, 0x6023, 0x000a, 0x0016,
++	0x001e, 0x080c, 0x8f53, 0x00ce, 0x0005, 0x001e, 0x0ce0, 0x2001,
++	0x110d, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x3f23,
++	0x00c6, 0x080c, 0x8f26, 0x001e, 0x0d80, 0x6112, 0x6023, 0x0004,
++	0x7120, 0x610a, 0x001e, 0x0016, 0x9186, 0x0017, 0x0118, 0x9186,
++	0x0030, 0x1128, 0x6007, 0x0009, 0x6017, 0x2900, 0x0020, 0x6007,
++	0x0051, 0x6017, 0x0000, 0x602f, 0x0009, 0x6003, 0x0001, 0x080c,
++	0x75be, 0x0898, 0x080c, 0x297d, 0x1140, 0x7010, 0x9084, 0xff00,
++	0x8007, 0x908e, 0x0008, 0x1108, 0x0009, 0x0005, 0x00c6, 0x0046,
++	0x7000, 0x908c, 0xff00, 0x810f, 0x9186, 0x0033, 0x11e8, 0x080c,
++	0x7061, 0x0904, 0x6e5f, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200,
++	0x1140, 0x7034, 0x9005, 0x15d8, 0x2009, 0x0015, 0x080c, 0x8f53,
++	0x04b0, 0x908e, 0x0100, 0x1598, 0x7034, 0x9005, 0x1580, 0x2009,
++	0x0016, 0x080c, 0x8f53, 0x0458, 0x9186, 0x0032, 0x1540, 0x7030,
++	0x908e, 0x1400, 0x1520, 0x2009, 0x0038, 0x0016, 0x2011, 0x0263,
++	0x2204, 0x8211, 0x220c, 0x080c, 0x1f63, 0x11c0, 0x080c, 0x55b3,
++	0x11a8, 0x6612, 0x6516, 0x00c6, 0x080c, 0x8e83, 0x0170, 0x001e,
++	0x6112, 0x080c, 0xad70, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e,
++	0x080c, 0x8f53, 0x080c, 0x7aa4, 0x0010, 0x00ce, 0x001e, 0x004e,
++	0x00ce, 0x0005, 0x0046, 0x00e6, 0x00d6, 0x2028, 0x2130, 0x9696,
++	0x00ff, 0x11a8, 0x9592, 0xfffc, 0x0290, 0x9596, 0xfffd, 0x1118,
++	0x2009, 0x007f, 0x04e8, 0x9596, 0xfffe, 0x1118, 0x2009, 0x007e,
++	0x04b8, 0x9596, 0xfffc, 0x1118, 0x2009, 0x0080, 0x0488, 0x9016,
++	0x2019, 0x1136, 0x231c, 0xd3ac, 0x0130, 0x9026, 0x20a9, 0x00ff,
++	0x2071, 0x1000, 0x0030, 0x2021, 0x0081, 0x20a9, 0x007e, 0x2071,
++	0x1081, 0x2e1c, 0x93ed, 0x0000, 0x1128, 0x82ff, 0x1170, 0x2410,
++	0xc2fd, 0x0058, 0x6f10, 0x2600, 0x9706, 0x6814, 0x1120, 0x9546,
++	0x1110, 0x2408, 0x0068, 0x9745, 0x0d80, 0x8420, 0x8e70, 0x1f04,
++	0x6e91, 0x82ff, 0x1118, 0x9085, 0x0001, 0x0018, 0xc2fc, 0x2208,
++	0x9006, 0x00de, 0x00ee, 0x004e, 0x0005, 0x7000, 0x908c, 0xff00,
++	0x810f, 0x9184, 0x000f, 0x004a, 0x7817, 0x0140, 0x2001, 0x130d,
++	0x2004, 0x9005, 0x090c, 0x7aa4, 0x0005, 0x6ed5, 0x6ed5, 0x6ed5,
++	0x7073, 0x6ed5, 0x6ede, 0x6f0b, 0x6f9b, 0x6ed5, 0x6ed5, 0x6ed5,
++	0x6ed5, 0x6ed5, 0x6ed5, 0x6ed5, 0x6ed5, 0x7817, 0x0140, 0x2001,
++	0x130d, 0x2004, 0x9005, 0x090c, 0x7aa4, 0x0005, 0x7110, 0xd1bc,
++	0x0508, 0x7120, 0x2160, 0x9c8c, 0x0007, 0x11e0, 0x9c8a, 0x15c0,
++	0x02c8, 0x6860, 0x9c02, 0x12b0, 0x7008, 0x9084, 0x00ff, 0x6110,
++	0x9188, 0x0004, 0x210c, 0x9106, 0x1168, 0x700c, 0x6110, 0x9188,
++	0x0005, 0x210c, 0x9106, 0x1130, 0x7124, 0x610a, 0x2009, 0x0046,
++	0x080c, 0x8f53, 0x7817, 0x0140, 0x2001, 0x130d, 0x2004, 0x9005,
++	0x090c, 0x7aa4, 0x0005, 0x00c6, 0x9484, 0x0fff, 0x0904, 0x6f71,
++	0x7110, 0xd1bc, 0x1904, 0x6f71, 0x7108, 0x700c, 0x2028, 0x918c,
++	0x00ff, 0x2130, 0x9094, 0xff00, 0x15c0, 0x81ff, 0x15b0, 0x9080,
++	0x298c, 0x200d, 0x918c, 0xff00, 0x810f, 0x2001, 0x0080, 0x9106,
++	0x0904, 0x6f71, 0x080c, 0x55b3, 0x1904, 0x6f71, 0x6612, 0x6516,
++	0x6000, 0xd0ec, 0x15f0, 0x6204, 0x9294, 0xff00, 0x8217, 0x9286,
++	0x0006, 0x1188, 0x00c6, 0x080c, 0x8e83, 0x001e, 0x05e0, 0x6112,
++	0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x6156, 0x2009, 0x0044,
++	0x080c, 0xb7dd, 0x0430, 0x6204, 0x9294, 0x00ff, 0x9286, 0x0006,
++	0x1140, 0x9295, 0x0600, 0x6206, 0x0c28, 0x190c, 0x6e62, 0x11c8,
++	0x0888, 0x00c6, 0x080c, 0x8e83, 0x001e, 0x0198, 0x6112, 0x6023,
++	0x0004, 0x7120, 0x610a, 0x9286, 0x0004, 0x1118, 0x6007, 0x0005,
++	0x0010, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x75be, 0x080c,
++	0x7aa4, 0x7817, 0x0140, 0x2001, 0x130d, 0x2004, 0x9005, 0x090c,
++	0x7aa4, 0x00ce, 0x0005, 0x2001, 0x110d, 0x2004, 0xd0ec, 0x0120,
++	0x2011, 0x8049, 0x080c, 0x3f23, 0x00c6, 0x080c, 0x8f26, 0x001e,
++	0x0d40, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x6156,
++	0x6017, 0x0300, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x756e,
++	0x080c, 0x7aa4, 0x08b0, 0x7110, 0xd1bc, 0x0508, 0x7020, 0x2060,
++	0x9c84, 0x0007, 0x11e0, 0x9c82, 0x15c0, 0x02c8, 0x6860, 0x9c02,
++	0x12b0, 0x7008, 0x9084, 0x00ff, 0x6110, 0x9188, 0x0004, 0x210c,
++	0x9106, 0x1168, 0x700c, 0x6110, 0x9188, 0x0005, 0x210c, 0x9106,
++	0x1130, 0x7124, 0x610a, 0x2009, 0x0045, 0x080c, 0x8f53, 0x7817,
++	0x0140, 0x2001, 0x130d, 0x2004, 0x9005, 0x090c, 0x7aa4, 0x0005,
++	0x080c, 0x297d, 0x1168, 0x7010, 0x9084, 0xff00, 0x8007, 0x9086,
++	0x0000, 0x1130, 0x9184, 0x000f, 0x908a, 0x0006, 0x1208, 0x000b,
++	0x0005, 0x6fdf, 0x6fe0, 0x6fdf, 0x6fdf, 0x7049, 0x7055, 0x0005,
++	0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904, 0x7048, 0x700c,
++	0x7108, 0x080c, 0x1f63, 0x1904, 0x7048, 0x080c, 0x55b3, 0x1904,
++	0x7048, 0x6612, 0x6516, 0x6204, 0x7110, 0xd1bc, 0x01f8, 0x928c,
++	0x00ff, 0x9186, 0x0004, 0x0118, 0x9186, 0x0006, 0x15c8, 0x00c6,
++	0x080c, 0x7061, 0x00ce, 0x0904, 0x7048, 0x00c6, 0x080c, 0x8e83,
++	0x001e, 0x05f0, 0x6112, 0x080c, 0xad70, 0x6023, 0x0002, 0x7120,
++	0x610a, 0x2009, 0x0088, 0x080c, 0x8f53, 0x0490, 0x928c, 0x00ff,
++	0x9186, 0x0006, 0x0160, 0x9186, 0x0004, 0x0148, 0x9294, 0xff00,
++	0x8217, 0x9286, 0x0004, 0x0118, 0x9286, 0x0006, 0x1188, 0x00c6,
++	0x080c, 0x8e83, 0x001e, 0x01e0, 0x6112, 0x080c, 0xad70, 0x6023,
++	0x0005, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0x8f53, 0x0080,
++	0x00c6, 0x080c, 0x8e83, 0x001e, 0x0158, 0x6112, 0x080c, 0xad70,
++	0x6023, 0x0004, 0x7120, 0x610a, 0x2009, 0x0001, 0x080c, 0x8f53,
++	0x0005, 0x7110, 0xd1bc, 0x0140, 0x00a1, 0x0130, 0x7124, 0x610a,
++	0x2009, 0x0089, 0x080c, 0x8f53, 0x0005, 0x7110, 0xd1bc, 0x0140,
++	0x0041, 0x0130, 0x7124, 0x610a, 0x2009, 0x008a, 0x080c, 0x8f53,
++	0x0005, 0x7020, 0x2060, 0x9c84, 0x0007, 0x1158, 0x9c82, 0x15c0,
++	0x0240, 0x2001, 0x1118, 0x2004, 0x9c02, 0x1218, 0x9085, 0x0001,
++	0x0005, 0x9006, 0x0ce8, 0x7110, 0xd1bc, 0x11f8, 0x7024, 0x2060,
++	0x9c84, 0x0007, 0x11d0, 0x9c82, 0x15c0, 0x02b8, 0x6860, 0x9c02,
++	0x12a0, 0x7008, 0x9084, 0x00ff, 0x6110, 0x9188, 0x0004, 0x210c,
++	0x9106, 0x1158, 0x700c, 0x6110, 0x9188, 0x0005, 0x210c, 0x9106,
++	0x1120, 0x2009, 0x0051, 0x080c, 0x8f53, 0x7817, 0x0140, 0x2001,
++	0x130d, 0x2004, 0x9005, 0x090c, 0x7aa4, 0x0005, 0x2031, 0x0105,
++	0x0069, 0x0005, 0x2031, 0x0206, 0x0049, 0x0005, 0x2031, 0x0207,
++	0x0029, 0x0005, 0x2031, 0x0213, 0x0009, 0x0005, 0x00c6, 0x00d6,
++	0x00f6, 0x7000, 0x9084, 0xf000, 0x9086, 0xc000, 0x05c8, 0x080c,
++	0x8e83, 0x05b0, 0x0066, 0x00c6, 0x0046, 0x2011, 0x0263, 0x2204,
++	0x8211, 0x220c, 0x080c, 0x1f63, 0x1598, 0x080c, 0x55b3, 0x1580,
++	0x6612, 0x6516, 0x2c00, 0x004e, 0x00ce, 0x6012, 0x080c, 0xad70,
++	0x080c, 0x0eb6, 0x0508, 0x2d00, 0x605a, 0x9006, 0x6802, 0x6866,
++	0x6c6a, 0x9df8, 0x001b, 0x20a9, 0x000e, 0x20e9, 0x0001, 0x20e1,
++	0x0000, 0x2fa0, 0x2e98, 0x4003, 0x006e, 0x6616, 0x6007, 0x003e,
++	0x6023, 0x0001, 0x6003, 0x0001, 0x080c, 0x75be, 0x080c, 0x7aa4,
++	0x00fe, 0x00de, 0x00ce, 0x0005, 0x080c, 0x8ed9, 0x006e, 0x0cc0,
++	0x004e, 0x00ce, 0x0cc8, 0x00c6, 0x7000, 0x908c, 0xff00, 0x9184,
++	0xf000, 0x810f, 0x9086, 0x2000, 0x1540, 0x9186, 0x0022, 0x11d0,
++	0x2001, 0x0111, 0x2004, 0x9005, 0x1510, 0x7030, 0x908e, 0x0400,
++	0x01f0, 0x908e, 0x6000, 0x01d8, 0x908e, 0x5400, 0x01c0, 0x908e,
++	0x0300, 0x1138, 0x2009, 0x1136, 0x210c, 0xd18c, 0x1180, 0xd1a4,
++	0x1170, 0x0058, 0x9186, 0x0023, 0x1140, 0x080c, 0x7061, 0x0128,
++	0x6004, 0x9086, 0x0002, 0x0118, 0x0000, 0x9006, 0x0010, 0x9085,
++	0x0001, 0x00ce, 0x0005, 0x2071, 0x1317, 0x7003, 0x0003, 0x700f,
++	0x0361, 0x9006, 0x701a, 0x7072, 0x7012, 0x7017, 0x15c0, 0x7007,
++	0x0000, 0x7026, 0x702b, 0x85b8, 0x7032, 0x7037, 0x861b, 0x703b,
++	0xffff, 0x703f, 0xffff, 0x7042, 0x7047, 0x4719, 0x704a, 0x705b,
++	0x728c, 0x2001, 0x12aa, 0x2003, 0x0003, 0x2001, 0x12ac, 0x2003,
++	0x0100, 0x0005, 0x2071, 0x1317, 0x1d04, 0x71e9, 0x2091, 0x6000,
++	0x700c, 0x8001, 0x700e, 0x1500, 0x2001, 0x1174, 0x2004, 0xd0c4,
++	0x0158, 0x3a00, 0xd08c, 0x1140, 0x20d1, 0x0000, 0x20d1, 0x0001,
++	0x20d1, 0x0000, 0x080c, 0x0d7e, 0x700f, 0x0361, 0x7007, 0x0001,
++	0x0126, 0x2091, 0x8000, 0x7040, 0x900d, 0x0148, 0x8109, 0x7142,
++	0x1130, 0x7044, 0x080f, 0x0018, 0x0126, 0x2091, 0x8000, 0x7024,
++	0x900d, 0x0188, 0x7020, 0x8001, 0x7022, 0x1168, 0x7023, 0x0009,
++	0x8109, 0x7126, 0x9186, 0x03e8, 0x1110, 0x7028, 0x080f, 0x81ff,
++	0x1110, 0x7028, 0x080f, 0x7030, 0x900d, 0x0180, 0x702c, 0x8001,
++	0x702e, 0x1160, 0x702f, 0x0009, 0x8109, 0x7132, 0x0128, 0x9184,
++	0x007f, 0x090c, 0x8696, 0x0010, 0x7034, 0x080f, 0x7038, 0x9005,
++	0x0118, 0x0310, 0x8001, 0x703a, 0x703c, 0x9005, 0x0118, 0x0310,
++	0x8001, 0x703e, 0x704c, 0x900d, 0x0168, 0x7048, 0x8001, 0x704a,
++	0x1148, 0x704b, 0x0009, 0x8109, 0x714e, 0x1120, 0x7150, 0x714e,
++	0x7058, 0x080f, 0x7018, 0x900d, 0x01d8, 0x0016, 0x7070, 0x900d,
++	0x0158, 0x706c, 0x8001, 0x706e, 0x1138, 0x706f, 0x0009, 0x8109,
++	0x7172, 0x1110, 0x7074, 0x080f, 0x001e, 0x7008, 0x8001, 0x700a,
++	0x1138, 0x700b, 0x0009, 0x8109, 0x711a, 0x1110, 0x701c, 0x080f,
++	0x012e, 0x7004, 0x0002, 0x720f, 0x7210, 0x7228, 0x00e6, 0x2071,
++	0x1317, 0x7018, 0x9005, 0x1120, 0x711a, 0x721e, 0x700b, 0x0009,
++	0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x1317, 0x701c, 0x9206,
++	0x1110, 0x701a, 0x701e, 0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071,
++	0x1317, 0x6088, 0x9102, 0x0208, 0x618a, 0x00ee, 0x0005, 0x0005,
++	0x7110, 0x080c, 0x5608, 0x1158, 0x6088, 0x8001, 0x0240, 0x608a,
++	0x1130, 0x0126, 0x2091, 0x8000, 0x080c, 0x7aa4, 0x012e, 0x8108,
++	0x9182, 0x00ff, 0x0218, 0x900e, 0x7007, 0x0002, 0x7112, 0x0005,
++	0x7014, 0x2060, 0x0126, 0x2091, 0x8000, 0x6040, 0x9005, 0x0128,
++	0x8001, 0x6042, 0x1110, 0x080c, 0xac18, 0x6018, 0x9005, 0x0518,
++	0x8001, 0x601a, 0x1500, 0x6120, 0x9186, 0x0003, 0x0118, 0x9186,
++	0x0006, 0x11b8, 0x6014, 0x2068, 0x6884, 0x908a, 0x199a, 0x0288,
++	0x9082, 0x1999, 0x6886, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999,
++	0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0x687c, 0x9084, 0x1000,
++	0x0110, 0x080c, 0xa6b1, 0x012e, 0x9c88, 0x0018, 0x7116, 0x2001,
++	0x45c0, 0x9102, 0x0220, 0x7017, 0x15c0, 0x7007, 0x0000, 0x0005,
++	0x00e6, 0x2071, 0x1317, 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee,
++	0x0005, 0x2001, 0x1320, 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071,
++	0x1317, 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, 0x1323,
++	0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, 0x1317, 0x711a, 0x721e,
++	0x700b, 0x0009, 0x00ee, 0x0005, 0x00c6, 0x0026, 0x7054, 0x8000,
++	0x7056, 0x2061, 0x12aa, 0x6008, 0x9086, 0x0000, 0x0158, 0x7068,
++	0x6036, 0x7064, 0x6032, 0x7060, 0x602e, 0x705c, 0x602a, 0x2c10,
++	0x080c, 0x0f22, 0x002e, 0x00ce, 0x0005, 0x0006, 0x0016, 0x00c6,
++	0x00d6, 0x00e6, 0x00f6, 0x0156, 0x080c, 0x715a, 0x015e, 0x00fe,
++	0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071,
++	0x1317, 0x7172, 0x7276, 0x706f, 0x0009, 0x00ee, 0x0005, 0x00e6,
++	0x0006, 0x2071, 0x1317, 0x7074, 0x9206, 0x1110, 0x7072, 0x7076,
++	0x000e, 0x00ee, 0x0005, 0x00c6, 0x2061, 0x1354, 0x00ce, 0x0005,
++	0x9184, 0x000f, 0x8003, 0x8003, 0x8003, 0x9080, 0x1354, 0x2060,
++	0x0005, 0x6884, 0x908a, 0x199a, 0x1630, 0x9005, 0x1150, 0x00c6,
++	0x2061, 0x1354, 0x6014, 0x00ce, 0x9005, 0x1130, 0x2001, 0x001e,
++	0x0018, 0x908e, 0xffff, 0x01a8, 0x8003, 0x800b, 0x810b, 0x9108,
++	0x611a, 0x687c, 0x908c, 0x00c0, 0x918e, 0x00c0, 0x0904, 0x735c,
++	0xd0b4, 0x1160, 0xd0bc, 0x15e0, 0x2009, 0x0006, 0x080c, 0x7386,
++	0x0005, 0x900e, 0x0c68, 0x2001, 0x1999, 0x08b8, 0xd0fc, 0x0160,
++	0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x7380, 0x908c,
++	0x2020, 0x918e, 0x2020, 0x01a8, 0x6024, 0xd0d4, 0x11d0, 0x2009,
++	0x1174, 0x2104, 0xd084, 0x1138, 0x87ff, 0x1120, 0x2009, 0x0043,
++	0x0804, 0x8f53, 0x0005, 0x87ff, 0x1de8, 0x2009, 0x0042, 0x0804,
++	0x8f53, 0x6110, 0x210c, 0xd1ac, 0x0d38, 0x6024, 0xc0cd, 0x6026,
++	0x0c18, 0xc0d4, 0x6026, 0x6890, 0x602e, 0x688c, 0x6032, 0x08f8,
++	0xd0fc, 0x0160, 0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904,
++	0x7380, 0x908c, 0x2020, 0x918e, 0x2020, 0x0170, 0x0076, 0x00f6,
++	0x2c78, 0x080c, 0x137e, 0x00fe, 0x007e, 0x87ff, 0x1120, 0x2009,
++	0x0042, 0x080c, 0x8f53, 0x0005, 0x6110, 0x210c, 0xd1ac, 0x0d70,
++	0x6124, 0xc1cd, 0x6126, 0x0c50, 0xd0fc, 0x0188, 0x908c, 0x2020,
++	0x918e, 0x2020, 0x01a8, 0x9084, 0x0003, 0x908e, 0x0002, 0x0148,
++	0x87ff, 0x1120, 0x2009, 0x0041, 0x080c, 0x8f53, 0x0005, 0x00a1,
++	0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, 0x8f53, 0x0cb0,
++	0x6110, 0x210c, 0xd1ac, 0x0d38, 0x6124, 0xc1cd, 0x6126, 0x0c18,
++	0x2009, 0x0004, 0x0019, 0x0005, 0x2009, 0x0001, 0x00d6, 0x6014,
++	0x90ec, 0xf000, 0x0510, 0x2068, 0x6982, 0x6800, 0x6016, 0x9186,
++	0x0001, 0x1188, 0x697c, 0x918c, 0x8100, 0x918e, 0x8100, 0x1158,
++	0x00c6, 0x2061, 0x1354, 0x6200, 0xd28c, 0x1120, 0x6204, 0x8210,
++	0x0208, 0x6206, 0x00ce, 0x080c, 0x59b8, 0x6014, 0x906d, 0x0076,
++	0x2039, 0x0000, 0x190c, 0x72d9, 0x007e, 0x00de, 0x0005, 0x0156,
++	0x00c6, 0x2061, 0x1354, 0x6000, 0x81ff, 0x0110, 0x9205, 0x0008,
++	0x9204, 0x6002, 0x00ce, 0x015e, 0x0005, 0x6800, 0xd08c, 0x1138,
++	0x6808, 0x9005, 0x0120, 0x8001, 0x680a, 0x9085, 0x0001, 0x0005,
++	0x0126, 0x2091, 0x8000, 0x0036, 0x0046, 0x20a9, 0x0010, 0x9006,
++	0x8004, 0x2019, 0x0100, 0x231c, 0x93a6, 0x0008, 0x1118, 0x8086,
++	0x818e, 0x0020, 0x80f6, 0x3e00, 0x81f6, 0x3e08, 0x1208, 0x9200,
++	0x1f04, 0x73d1, 0x93a6, 0x0008, 0x1118, 0x8086, 0x818e, 0x0020,
++	0x80f6, 0x3e00, 0x81f6, 0x3e08, 0x004e, 0x003e, 0x012e, 0x0005,
++	0x0126, 0x2091, 0x8000, 0x0076, 0x0156, 0x20a9, 0x0010, 0x9005,
++	0x0510, 0x911a, 0x1600, 0x8213, 0x2039, 0x0100, 0x273c, 0x97be,
++	0x0008, 0x1110, 0x818d, 0x0010, 0x81f5, 0x3e08, 0x0228, 0x911a,
++	0x1220, 0x1f04, 0x73fb, 0x0028, 0x911a, 0x2308, 0x8210, 0x1f04,
++	0x73fb, 0x0006, 0x3200, 0x9084, 0xefff, 0x2080, 0x000e, 0x015e,
++	0x007e, 0x012e, 0x0005, 0x0006, 0x3200, 0x9085, 0x1000, 0x0ca8,
++	0x0126, 0x2091, 0x2800, 0x2079, 0x1304, 0x012e, 0x00d6, 0x2069,
++	0x1304, 0x6803, 0x0005, 0x0156, 0x0146, 0x01d6, 0x20e9, 0x0000,
++	0x2069, 0x0200, 0x080c, 0x8dc3, 0x0401, 0x080c, 0x8dae, 0x00e9,
++	0x080c, 0x8db1, 0x00d1, 0x080c, 0x8db4, 0x00b9, 0x080c, 0x8db7,
++	0x00a1, 0x080c, 0x8dba, 0x0089, 0x080c, 0x8dbd, 0x0071, 0x080c,
++	0x8dc0, 0x0059, 0x01de, 0x014e, 0x015e, 0x2069, 0x0004, 0x2d04,
++	0x9085, 0x8001, 0x206a, 0x00de, 0x0005, 0x20a9, 0x0020, 0x20a1,
++	0x0240, 0x9006, 0x4004, 0x0005, 0x00c6, 0x6027, 0x0001, 0x7804,
++	0x9084, 0x0007, 0x0002, 0x746d, 0x7491, 0x74db, 0x7473, 0x7491,
++	0x746d, 0x746b, 0x746b, 0x080c, 0x0d7e, 0x080c, 0x7271, 0x080c,
++	0x7aa4, 0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110, 0x00ce, 0x0005,
++	0x2011, 0x4f57, 0x080c, 0x71fa, 0x7828, 0x9092, 0x00c8, 0x1228,
++	0x8000, 0x782a, 0x080c, 0x4f94, 0x0c88, 0x62c0, 0x080c, 0x8dc7,
++	0x080c, 0x4f57, 0x7807, 0x0003, 0x7827, 0x0000, 0x782b, 0x0000,
++	0x0c28, 0x080c, 0x7271, 0x6220, 0xd2a4, 0x0178, 0x62c0, 0x82ff,
++	0x1160, 0x782b, 0x0000, 0x7824, 0x9065, 0x090c, 0x0d7e, 0x2009,
++	0x0013, 0x080c, 0x8f53, 0x00ce, 0x0005, 0x00c6, 0x7824, 0x9065,
++	0x090c, 0x0d7e, 0x7804, 0x9086, 0x0004, 0x0904, 0x7517, 0x7828,
++	0x9092, 0xc350, 0x1230, 0x8000, 0x782a, 0x00ce, 0x080c, 0x857e,
++	0x0c50, 0x2011, 0x0130, 0x2214, 0x080c, 0x8dc7, 0x6104, 0x9186,
++	0x0003, 0x1188, 0x00e6, 0x2071, 0x1100, 0x70e4, 0x00ee, 0xd08c,
++	0x0150, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1100, 0x080c,
++	0x4faa, 0x00ee, 0x00ce, 0x080c, 0xc463, 0x2009, 0x0014, 0x080c,
++	0x8f53, 0x00ce, 0x0840, 0x2001, 0x1320, 0x2003, 0x0000, 0x62c0,
++	0x82ff, 0x1160, 0x782b, 0x0000, 0x7824, 0x9065, 0x090c, 0x0d7e,
++	0x2009, 0x0013, 0x080c, 0x8fab, 0x00ce, 0x0005, 0x00c6, 0x00d6,
++	0x7824, 0x9005, 0x090c, 0x0d7e, 0x781c, 0x906d, 0x090c, 0x0d7e,
++	0x080c, 0x8dc7, 0x6800, 0xc0dc, 0x6802, 0x7924, 0x2160, 0x080c,
++	0x8ed9, 0x693c, 0x81ff, 0x090c, 0x0d7e, 0x8109, 0x693e, 0x6854,
++	0x9015, 0x0110, 0x7a1e, 0x0010, 0x7918, 0x791e, 0x7807, 0x0000,
++	0x7827, 0x0000, 0x00de, 0x00ce, 0x080c, 0x7aa4, 0x08a8, 0x6104,
++	0x9186, 0x0002, 0x0128, 0x9186, 0x0004, 0x0110, 0x0804, 0x74af,
++	0x7808, 0x9c06, 0x0904, 0x74af, 0x080c, 0x79ab, 0x080c, 0x75be,
++	0x00ce, 0x080c, 0x7aa4, 0x0804, 0x74a3, 0x00c6, 0x6024, 0x6027,
++	0x0002, 0xd0f4, 0x1580, 0x62c8, 0x60c4, 0x9205, 0x1170, 0x783c,
++	0x9065, 0x0130, 0x2009, 0x0049, 0x080c, 0x8f53, 0x00ce, 0x0005,
++	0x2011, 0x1323, 0x2013, 0x0000, 0x0cc8, 0x793c, 0x81ff, 0x0dc0,
++	0x7944, 0x9192, 0x7530, 0x12f0, 0x8108, 0x7946, 0x793c, 0x9188,
++	0x0008, 0x210c, 0x918e, 0x0006, 0x1138, 0x6014, 0x9084, 0x1984,
++	0x9085, 0x0012, 0x6016, 0x0c10, 0x6014, 0x9084, 0x1984, 0x9085,
++	0x0016, 0x6016, 0x08d8, 0x793c, 0x2160, 0x2009, 0x004a, 0x080c,
++	0x8f53, 0x08a0, 0x7848, 0xc085, 0x784a, 0x0880, 0x0006, 0x0016,
++	0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061,
++	0x1304, 0x6020, 0x8000, 0x6022, 0x6010, 0x9005, 0x0148, 0x9080,
++	0x0003, 0x2102, 0x6112, 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005,
++	0x6116, 0x6112, 0x0cc0, 0x00d6, 0x2069, 0x1304, 0x6000, 0xd0d4,
++	0x01b8, 0x6820, 0x8000, 0x6822, 0x9086, 0x0001, 0x1110, 0x2c00,
++	0x681e, 0x2001, 0x110c, 0x2004, 0xd0fc, 0x0118, 0x00de, 0x0804,
++	0x7aa4, 0x6804, 0x9084, 0x0007, 0x0804, 0x7abb, 0x00de, 0x0005,
++	0xc0d5, 0x6002, 0x6818, 0x9005, 0x0158, 0x6056, 0x605b, 0x0000,
++	0x0006, 0x2c00, 0x681a, 0x00de, 0x685a, 0x2069, 0x1304, 0x08c8,
++	0x6056, 0x605a, 0x2c00, 0x681a, 0x681e, 0x0898, 0x0006, 0x0016,
++	0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061,
++	0x1304, 0x6020, 0x8000, 0x6022, 0x6008, 0x9005, 0x0148, 0x9080,
++	0x0003, 0x2102, 0x610a, 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005,
++	0x610e, 0x610a, 0x0cc0, 0x00c6, 0x600f, 0x0000, 0x2c08, 0x2061,
++	0x1304, 0x6034, 0x9005, 0x0130, 0x9080, 0x0003, 0x2102, 0x6136,
++	0x00ce, 0x0005, 0x613a, 0x6136, 0x00ce, 0x0005, 0x00f6, 0x00e6,
++	0x00d6, 0x00c6, 0x0076, 0x0066, 0x0056, 0x0036, 0x0026, 0x0016,
++	0x0006, 0x0126, 0x902e, 0x2071, 0x1304, 0x7638, 0x2660, 0x2678,
++	0x2091, 0x8000, 0x8cff, 0x0904, 0x7664, 0x6010, 0x9080, 0x0028,
++	0x2004, 0x9206, 0x1904, 0x765f, 0x87ff, 0x0120, 0x6054, 0x9106,
++	0x1904, 0x765f, 0x703c, 0x9c06, 0x1178, 0x0036, 0x2019, 0x0001,
++	0x080c, 0x8847, 0x7033, 0x0000, 0x9006, 0x703e, 0x7042, 0x7046,
++	0x704a, 0x003e, 0x2029, 0x0001, 0x7038, 0x9c36, 0x1110, 0x660c,
++	0x763a, 0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00,
++	0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06,
++	0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xa942,
++	0x01c8, 0x6014, 0x2068, 0x6020, 0x9086, 0x0003, 0x1580, 0x6867,
++	0x0103, 0x6b7a, 0x6877, 0x0000, 0x0016, 0x0036, 0x0076, 0x080c,
++	0xac01, 0x080c, 0xc3c7, 0x080c, 0x5b76, 0x007e, 0x003e, 0x001e,
++	0x080c, 0xab11, 0x080c, 0x8f09, 0x00ce, 0x0804, 0x7602, 0x2c78,
++	0x600c, 0x2060, 0x0804, 0x7602, 0x85ff, 0x0120, 0x0036, 0x080c,
++	0x7b72, 0x003e, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, 0x005e,
++	0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020,
++	0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0076, 0x080c, 0xc3c7,
++	0x080c, 0xc0e9, 0x007e, 0x003e, 0x001e, 0x08a0, 0x6020, 0x9086,
++	0x000a, 0x0904, 0x7649, 0x0804, 0x7647, 0x0006, 0x0066, 0x00c6,
++	0x00d6, 0x00f6, 0x9036, 0x0126, 0x2091, 0x8000, 0x2079, 0x1304,
++	0x7838, 0x9065, 0x0904, 0x76db, 0x600c, 0x0006, 0x600f, 0x0000,
++	0x783c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, 0x080c, 0x8847,
++	0x7833, 0x0000, 0x901e, 0x7b3e, 0x7b42, 0x7b46, 0x7b4a, 0x003e,
++	0x080c, 0xa942, 0x0518, 0x6014, 0x2068, 0x6020, 0x9086, 0x0003,
++	0x1558, 0x3e08, 0x918e, 0x0002, 0x1180, 0x6010, 0x9005, 0x0168,
++	0x9080, 0x0000, 0x2004, 0xd0bc, 0x0140, 0x6040, 0x9005, 0x1180,
++	0x2001, 0x12c2, 0x2004, 0x6042, 0x0058, 0x6867, 0x0103, 0x6b7a,
++	0x6877, 0x0000, 0x080c, 0x5b76, 0x080c, 0xab11, 0x080c, 0x8f09,
++	0x000e, 0x0804, 0x7699, 0x7e3a, 0x7e36, 0x012e, 0x00fe, 0x00de,
++	0x00ce, 0x006e, 0x000e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1118,
++	0x080c, 0xc0e9, 0x0c58, 0x6020, 0x9086, 0x000a, 0x0d00, 0x08e8,
++	0x0016, 0x0026, 0x0086, 0x9046, 0x0099, 0x080c, 0x77c0, 0x008e,
++	0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0x1304, 0x2091,
++	0x8000, 0x080c, 0x7851, 0x080c, 0x78c5, 0x012e, 0x00fe, 0x0005,
++	0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126,
++	0x2091, 0x8000, 0x2071, 0x1304, 0x7614, 0x2660, 0x2678, 0x8cff,
++	0x0904, 0x7796, 0x6010, 0x9080, 0x0028, 0x2004, 0x9206, 0x1904,
++	0x7791, 0x88ff, 0x0120, 0x6054, 0x9106, 0x1904, 0x7791, 0x7024,
++	0x9c06, 0x1550, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0508, 0x080c,
++	0x7271, 0x080c, 0x85a2, 0x68c3, 0x0000, 0x080c, 0x8a7d, 0x7027,
++	0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138,
++	0x2001, 0x0100, 0x080c, 0x2401, 0x9006, 0x080c, 0x2401, 0x2069,
++	0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0020,
++	0x6003, 0x0009, 0x630a, 0x04e8, 0x7014, 0x9c36, 0x1110, 0x660c,
++	0x7616, 0x7010, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00,
++	0x7012, 0x0010, 0x7013, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06,
++	0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6014, 0x2068,
++	0x080c, 0xa942, 0x01b8, 0x6020, 0x9086, 0x0003, 0x1540, 0x6867,
++	0x0103, 0x6b7a, 0x6877, 0x0000, 0x0016, 0x0036, 0x0086, 0x080c,
++	0xac01, 0x080c, 0xc3c7, 0x080c, 0x5b76, 0x008e, 0x003e, 0x001e,
++	0x080c, 0xab11, 0x080c, 0x8f09, 0x080c, 0x895e, 0x00ce, 0x0804,
++	0x7717, 0x2c78, 0x600c, 0x2060, 0x0804, 0x7717, 0x012e, 0x000e,
++	0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020,
++	0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0086, 0x080c, 0xc3c7,
++	0x080c, 0xc0e9, 0x008e, 0x003e, 0x001e, 0x08e0, 0x6020, 0x9086,
++	0x0002, 0x1128, 0x6004, 0x9086, 0x0085, 0x0908, 0x0898, 0x6020,
++	0x9086, 0x0005, 0x1978, 0x6004, 0x9086, 0x0085, 0x0d20, 0x0850,
++	0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x9280, 0x1000, 0x2004,
++	0x9065, 0x0904, 0x784d, 0x00f6, 0x00e6, 0x00d6, 0x0066, 0x2071,
++	0x1304, 0x6654, 0x7018, 0x9c06, 0x1108, 0x761a, 0x701c, 0x9c06,
++	0x1130, 0x86ff, 0x1118, 0x7018, 0x701e, 0x0008, 0x761e, 0x6058,
++	0x907d, 0x0108, 0x7e56, 0x96ed, 0x0000, 0x0110, 0x2f00, 0x685a,
++	0x6057, 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002,
++	0x080c, 0x554c, 0x0904, 0x7849, 0x7624, 0x86ff, 0x0904, 0x7838,
++	0x9680, 0x0005, 0x2004, 0x9d06, 0x15d8, 0x00d6, 0x2069, 0x0100,
++	0x68c0, 0x9005, 0x0560, 0x080c, 0x7271, 0x080c, 0x85a2, 0x68c3,
++	0x0000, 0x080c, 0x8a7d, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140,
++	0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2401,
++	0x9006, 0x080c, 0x2401, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110,
++	0x6827, 0x0001, 0x003e, 0x00de, 0x00c6, 0x603c, 0x9005, 0x0110,
++	0x8001, 0x603e, 0x2660, 0x080c, 0x8f09, 0x00ce, 0x0048, 0x00de,
++	0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x77f0,
++	0x8dff, 0x0158, 0x6867, 0x0103, 0x6b7a, 0x6877, 0x0000, 0x080c,
++	0xac01, 0x080c, 0xc3c7, 0x080c, 0x5b76, 0x080c, 0x895e, 0x0804,
++	0x77f0, 0x006e, 0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce,
++	0x0005, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x9036, 0x7814, 0x9065,
++	0x0904, 0x78a5, 0x600c, 0x0006, 0x600f, 0x0000, 0x7824, 0x9c06,
++	0x1558, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0508, 0x080c, 0x7271,
++	0x080c, 0x85a2, 0x68c3, 0x0000, 0x080c, 0x8a7d, 0x7827, 0x0000,
++	0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001,
++	0x0100, 0x080c, 0x2401, 0x9006, 0x080c, 0x2401, 0x2069, 0x0100,
++	0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0028, 0x6003,
++	0x0009, 0x630a, 0x2c30, 0x00b0, 0x6014, 0x2068, 0x080c, 0xa942,
++	0x0168, 0x6020, 0x9086, 0x0003, 0x11b8, 0x6867, 0x0103, 0x6b7a,
++	0x6877, 0x0000, 0x080c, 0x5b76, 0x080c, 0xab11, 0x080c, 0x8f09,
++	0x080c, 0x895e, 0x000e, 0x0804, 0x7857, 0x7e16, 0x7e12, 0x00de,
++	0x00ce, 0x006e, 0x000e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1118,
++	0x080c, 0xc0e9, 0x0c58, 0x6020, 0x9086, 0x0002, 0x1128, 0x6004,
++	0x9086, 0x0085, 0x09d0, 0x0c10, 0x6020, 0x9086, 0x0005, 0x19f0,
++	0x6004, 0x9086, 0x0085, 0x0d60, 0x08c8, 0x0006, 0x0066, 0x00c6,
++	0x00d6, 0x7818, 0x9065, 0x0904, 0x7940, 0x6054, 0x0006, 0x9006,
++	0x6056, 0x605a, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x080c, 0x554c,
++	0x0904, 0x793d, 0x7e24, 0x86ff, 0x0904, 0x7930, 0x9680, 0x0005,
++	0x2004, 0x9d06, 0x1904, 0x7930, 0x00d6, 0x2069, 0x0100, 0x68c0,
++	0x9005, 0x05e8, 0x080c, 0x7271, 0x080c, 0x85a2, 0x68c3, 0x0000,
++	0x080c, 0x8a7d, 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04,
++	0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2401, 0x9006,
++	0x080c, 0x2401, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827,
++	0x0001, 0x003e, 0x00de, 0x00c6, 0x3e08, 0x918e, 0x0002, 0x1168,
++	0x6000, 0xd0bc, 0x0150, 0x9680, 0x0010, 0x200c, 0x81ff, 0x1508,
++	0x2009, 0x12c2, 0x210c, 0x2102, 0x00e0, 0x603c, 0x9005, 0x0110,
++	0x8001, 0x603e, 0x2660, 0x080c, 0x8f09, 0x00ce, 0x0048, 0x00de,
++	0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x78d6,
++	0x8dff, 0x0138, 0x6867, 0x0103, 0x6b7a, 0x6877, 0x0000, 0x080c,
++	0x5b76, 0x080c, 0x895e, 0x0804, 0x78d6, 0x000e, 0x0804, 0x78ca,
++	0x781e, 0x781a, 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005, 0x00e6,
++	0x00d6, 0x0066, 0x6000, 0xd0dc, 0x01a0, 0x604c, 0x906d, 0x0188,
++	0x6878, 0x9606, 0x1170, 0x2071, 0x1304, 0x7024, 0x9035, 0x0148,
++	0x9080, 0x0005, 0x2004, 0x9d06, 0x1120, 0x6000, 0xc0dc, 0x6002,
++	0x0021, 0x006e, 0x00de, 0x00ee, 0x0005, 0x00f6, 0x2079, 0x0100,
++	0x78c0, 0x9005, 0x1138, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a,
++	0x00ce, 0x04b8, 0x080c, 0x85a2, 0x78c3, 0x0000, 0x080c, 0x8a7d,
++	0x7027, 0x0000, 0x0036, 0x2079, 0x0140, 0x7b04, 0x9384, 0x1000,
++	0x0138, 0x2001, 0x0100, 0x080c, 0x2401, 0x9006, 0x080c, 0x2401,
++	0x2079, 0x0100, 0x7824, 0xd084, 0x0110, 0x7827, 0x0001, 0x080c,
++	0x8a7d, 0x003e, 0x080c, 0x554c, 0x00c6, 0x603c, 0x9005, 0x0110,
++	0x8001, 0x603e, 0x2660, 0x080c, 0x8ed9, 0x00ce, 0x6867, 0x0103,
++	0x6b7a, 0x6877, 0x0000, 0x080c, 0xac01, 0x080c, 0x5b76, 0x080c,
++	0x895e, 0x00fe, 0x0005, 0x00e6, 0x00c6, 0x2001, 0x110c, 0x2014,
++	0xc2e4, 0x2202, 0x2071, 0x1304, 0x7004, 0x9084, 0x0007, 0x0002,
++	0x79c2, 0x79c5, 0x79db, 0x7a03, 0x7a40, 0x79c2, 0x79c0, 0x79c0,
++	0x080c, 0x0d7e, 0x00ce, 0x00ee, 0x0005, 0x7024, 0x9065, 0x0148,
++	0x7020, 0x8001, 0x7022, 0x600c, 0x9015, 0x0150, 0x7216, 0x600f,
++	0x0000, 0x7007, 0x0000, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x0005,
++	0x7216, 0x7212, 0x0cb0, 0x6010, 0x2060, 0x080c, 0x554c, 0x6000,
++	0xc0dc, 0x6002, 0x7007, 0x0000, 0x7027, 0x0000, 0x7020, 0x8001,
++	0x7022, 0x1140, 0x2001, 0x110c, 0x2014, 0xd2ec, 0x1178, 0x00ce,
++	0x00ee, 0x0005, 0x6054, 0x9015, 0x0120, 0x721e, 0x080c, 0x7aa4,
++	0x0cb0, 0x7218, 0x721e, 0x080c, 0x7aa4, 0x0c88, 0xc2ec, 0x2202,
++	0x080c, 0x7b72, 0x0c60, 0x7024, 0x9065, 0x05b8, 0x700c, 0x9c06,
++	0x1160, 0x080c, 0x895e, 0x600c, 0x9015, 0x0120, 0x720e, 0x600f,
++	0x0000, 0x0448, 0x720e, 0x720a, 0x0430, 0x7014, 0x9c06, 0x1160,
++	0x080c, 0x895e, 0x600c, 0x9015, 0x0120, 0x7216, 0x600f, 0x0000,
++	0x00d0, 0x7216, 0x7212, 0x00b8, 0x6020, 0x9086, 0x0003, 0x1198,
++	0x6010, 0x2060, 0x080c, 0x554c, 0x6000, 0xc0dc, 0x6002, 0x080c,
++	0x895e, 0x701c, 0x9065, 0x0138, 0x6054, 0x9015, 0x0110, 0x721e,
++	0x0010, 0x7218, 0x721e, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x0005,
++	0x7024, 0x9065, 0x0140, 0x080c, 0x895e, 0x600c, 0x9015, 0x0150,
++	0x720e, 0x600f, 0x0000, 0x080c, 0x8a7d, 0x7027, 0x0000, 0x00ce,
++	0x00ee, 0x0005, 0x720e, 0x720a, 0x0cb0, 0x00d6, 0x2069, 0x1304,
++	0x6830, 0x9084, 0x0003, 0x0002, 0x7a62, 0x7a64, 0x7a88, 0x7a60,
++	0x080c, 0x0d7e, 0x00de, 0x0005, 0x00c6, 0x6840, 0x9086, 0x0001,
++	0x01b8, 0x683c, 0x9065, 0x0130, 0x600c, 0x9015, 0x0170, 0x6a3a,
++	0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011, 0x1323,
++	0x2013, 0x0000, 0x00ce, 0x00de, 0x0005, 0x683a, 0x6836, 0x0c90,
++	0x6843, 0x0000, 0x6838, 0x9065, 0x0d68, 0x6003, 0x0003, 0x0c50,
++	0x00c6, 0x9006, 0x6842, 0x6846, 0x684a, 0x683c, 0x9065, 0x0160,
++	0x600c, 0x9015, 0x0130, 0x6a3a, 0x600f, 0x0000, 0x683f, 0x0000,
++	0x0018, 0x683e, 0x683a, 0x6836, 0x00ce, 0x00de, 0x0005, 0xc1e5,
++	0x2001, 0x110c, 0x2102, 0x0005, 0x2001, 0x110c, 0x200c, 0xd1ec,
++	0x0138, 0xc1ec, 0x2102, 0x080c, 0x7b72, 0x2001, 0x110c, 0x200c,
++	0x9184, 0x0600, 0x9086, 0x0600, 0x0d50, 0x00d6, 0x2069, 0x1304,
++	0x6804, 0x9084, 0x0007, 0x0002, 0x7ac6, 0x7b51, 0x7b51, 0x7b51,
++	0x7b51, 0x7b53, 0x7ac4, 0x7ac4, 0x080c, 0x0d7e, 0x6820, 0x9005,
++	0x1110, 0x00de, 0x0005, 0x00c6, 0x680c, 0x9065, 0x0150, 0x6807,
++	0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x7bb7, 0x00ce, 0x00de,
++	0x0005, 0x6814, 0x9065, 0x0150, 0x6807, 0x0001, 0x6826, 0x682b,
++	0x0000, 0x080c, 0x7bb7, 0x00ce, 0x00de, 0x0005, 0x00e6, 0x6a1c,
++	0x92f5, 0x0000, 0x0904, 0x7b4e, 0x704c, 0x900d, 0x0118, 0x7088,
++	0x9005, 0x01a0, 0x7054, 0x9075, 0x0120, 0x920e, 0x0904, 0x7b4e,
++	0x0028, 0x6818, 0x920e, 0x0904, 0x7b4e, 0x2070, 0x704c, 0x900d,
++	0x0d88, 0x7088, 0x9005, 0x1d70, 0x2e00, 0x681e, 0x733c, 0x7038,
++	0x9302, 0x1e40, 0x080c, 0x8eb0, 0x0904, 0x7b4e, 0x8318, 0x733e,
++	0x6116, 0x2e10, 0x6212, 0x9180, 0x0020, 0x2004, 0x9084, 0x00ff,
++	0x605e, 0x9180, 0x0020, 0x2003, 0x0000, 0x9180, 0x0021, 0x2004,
++	0x908a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x801b, 0x831b,
++	0x9318, 0x631a, 0x00f6, 0x2c78, 0x2061, 0x0100, 0x609b, 0x0000,
++	0x00d6, 0x00e6, 0x2069, 0x0200, 0x2071, 0x0240, 0x080c, 0x81a1,
++	0x00ee, 0x00de, 0x7300, 0xc3dd, 0x7302, 0x6807, 0x0002, 0x2f18,
++	0x6b26, 0x682b, 0x0000, 0x7823, 0x0003, 0x7803, 0x0001, 0x7807,
++	0x0040, 0x00fe, 0x00ee, 0x00ce, 0x00de, 0x0005, 0x00ee, 0x00ce,
++	0x0cd8, 0x00de, 0x0005, 0x00c6, 0x680c, 0x9065, 0x0138, 0x6807,
++	0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x7bb7, 0x00ce, 0x00de,
++	0x0005, 0x2001, 0x110c, 0x2014, 0xc2ed, 0x2202, 0x00de, 0x00fe,
++	0x0005, 0x2001, 0x110c, 0x2014, 0xd2e4, 0x0120, 0xc2e4, 0x2202,
++	0x080c, 0x7ab5, 0x00f6, 0x00d6, 0x2069, 0x1304, 0x6830, 0x9086,
++	0x0000, 0x11f0, 0x2001, 0x110c, 0x200c, 0xd1c4, 0x11e0, 0x6838,
++	0x907d, 0x01b0, 0x6a04, 0x9296, 0x0000, 0x19d8, 0x6833, 0x0001,
++	0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x0126, 0x00f6, 0x2091,
++	0x2400, 0x002e, 0x080c, 0x167d, 0x1178, 0x012e, 0x080c, 0x83f0,
++	0x00de, 0x00fe, 0x0005, 0xc1c4, 0x2102, 0x0066, 0x2031, 0x0001,
++	0x080c, 0x6380, 0x006e, 0x08d8, 0x012e, 0x6843, 0x0000, 0x7803,
++	0x0002, 0x780c, 0x9015, 0x0140, 0x6a3a, 0x780f, 0x0000, 0x6833,
++	0x0000, 0x683f, 0x0000, 0x0c20, 0x683a, 0x6836, 0x0cc0, 0x6020,
++	0x9084, 0x000f, 0x000b, 0x0005, 0x7bcb, 0x7bd0, 0x8097, 0x8157,
++	0x7bd0, 0x8097, 0x8157, 0x7bcb, 0x7bd0, 0x7bcb, 0x7bcb, 0x7bcb,
++	0x7bcb, 0x7bcb, 0x7bcb, 0x080c, 0x79ab, 0x080c, 0x7aa4, 0x0005,
++	0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6,
++	0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004, 0x908a, 0x0053,
++	0x1a0c, 0x0d7e, 0x6110, 0x2178, 0x79a0, 0x2011, 0x1136, 0x2214,
++	0xd2ac, 0x1110, 0xd1bc, 0x0148, 0x7900, 0xd1f4, 0x0120, 0x7914,
++	0x918c, 0x00ff, 0x0038, 0x900e, 0x0028, 0x91f8, 0x298c, 0x2f0d,
++	0x918c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0x908a, 0x0040,
++	0x1a04, 0x7c4f, 0x0053, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de,
++	0x01ce, 0x014e, 0x013e, 0x015e, 0x0005, 0x7dc3, 0x7e04, 0x7e33,
++	0x7ee5, 0x7f08, 0x7f0e, 0x7f1c, 0x7f25, 0x7f32, 0x7f38, 0x7f4a,
++	0x7f38, 0x7fa1, 0x7f25, 0x7fae, 0x7fb4, 0x7f32, 0x7fb4, 0x7fc1,
++	0x7c4d, 0x7c4d, 0x7c4d, 0x7c4d, 0x7c4d, 0x7c4d, 0x7c4d, 0x7c4d,
++	0x7c4d, 0x7c4d, 0x7c4d, 0x86e5, 0x86fc, 0x8707, 0x8728, 0x8757,
++	0x7f1c, 0x7c4d, 0x7f1c, 0x7f38, 0x7c4d, 0x7e33, 0x7ee5, 0x7c4d,
++	0x8b65, 0x7f38, 0x7c4d, 0x8b81, 0x7f38, 0x7c4d, 0x7f32, 0x7dbc,
++	0x7c6f, 0x7c4d, 0x8b98, 0x8c05, 0x8cda, 0x7c4d, 0x8ce7, 0x7f19,
++	0x8cfd, 0x7c4d, 0x8762, 0x8d37, 0x7c4d, 0x080c, 0x0d7e, 0x2100,
++	0x0053, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e,
++	0x013e, 0x015e, 0x0005, 0x7c6d, 0x7c6d, 0x7c6d, 0x7c95, 0x7d39,
++	0x7d49, 0x7c6d, 0x7c6d, 0x7c6d, 0x7d8e, 0x7d9d, 0x7caf, 0x7c6d,
++	0x7cc9, 0x7cfa, 0x8de7, 0x8e2c, 0x7f38, 0x080c, 0x0d7e, 0x00d6,
++	0x080c, 0x7fd5, 0x7003, 0x2414, 0x7007, 0x0018, 0x700b, 0x0800,
++	0x7814, 0x2068, 0x683c, 0x700e, 0x6850, 0x7022, 0x6854, 0x7026,
++	0x60c3, 0x0018, 0x080c, 0x8576, 0x00de, 0x0005, 0x00d6, 0x7810,
++	0x2068, 0x68a0, 0x2069, 0x1100, 0x6ad8, 0xd2ac, 0x1110, 0xd0bc,
++	0x0110, 0x9085, 0x0001, 0x00de, 0x0005, 0x00d6, 0x080c, 0x7fd5,
++	0x7003, 0x0500, 0x7814, 0x90e8, 0x001b, 0x6808, 0x700a, 0x680c,
++	0x700e, 0x6810, 0x7012, 0x6814, 0x7016, 0x6818, 0x701a, 0x681c,
++	0x701e, 0x60c3, 0x0010, 0x080c, 0x8576, 0x00de, 0x0005, 0x00d6,
++	0x080c, 0x7fd5, 0x7003, 0x0500, 0x7814, 0x90e8, 0x0031, 0x6808,
++	0x700a, 0x680c, 0x700e, 0x6810, 0x7012, 0x6814, 0x7016, 0x6818,
++	0x701a, 0x681c, 0x701e, 0x60c3, 0x0010, 0x080c, 0x8576, 0x00de,
++	0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x080c, 0x7fd5, 0x20e9,
++	0x0000, 0x20e1, 0x0001, 0x2001, 0x12dd, 0x2003, 0x0000, 0x7814,
++	0x2068, 0x6814, 0x8003, 0x60c2, 0x6830, 0x20a8, 0x9d80, 0x001b,
++	0x2098, 0x2001, 0x12dd, 0x0016, 0x200c, 0x2001, 0x0001, 0x080c,
++	0x1b4c, 0x080c, 0xb539, 0x9006, 0x080c, 0x1b4c, 0x001e, 0x6804,
++	0x9005, 0x0110, 0x2068, 0x0c40, 0x04b9, 0x080c, 0x8576, 0x012e,
++	0x00de, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x080c, 0x804b,
++	0x20e9, 0x0000, 0x20e1, 0x0001, 0x2001, 0x12dd, 0x2003, 0x0000,
++	0x7814, 0x2068, 0x686f, 0x0200, 0x6873, 0x0000, 0x6814, 0x8003,
++	0x60c2, 0x6830, 0x20a8, 0x9d80, 0x001b, 0x2098, 0x2001, 0x12dd,
++	0x0016, 0x200c, 0x080c, 0xb539, 0x001e, 0x6804, 0x9005, 0x0110,
++	0x2068, 0x0c78, 0x0049, 0x7814, 0x2068, 0x080c, 0x0edf, 0x080c,
++	0x8576, 0x012e, 0x00de, 0x0005, 0x60c0, 0x8004, 0x9084, 0x0003,
++	0x9005, 0x0130, 0x9082, 0x0004, 0x20a3, 0x0000, 0x8000, 0x1de0,
++	0x0005, 0x080c, 0x7fd5, 0x7003, 0x7800, 0x7007, 0x0000, 0x7808,
++	0x8007, 0x700a, 0x700f, 0x0000, 0x60c3, 0x0008, 0x080c, 0x8576,
++	0x0005, 0x00d6, 0x00e6, 0x080c, 0x804b, 0x2073, 0x0200, 0x8e70,
++	0x2073, 0x0000, 0x8e70, 0x2073, 0xdf10, 0x8e70, 0x2073, 0x0034,
++	0x8e70, 0x2069, 0x1105, 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70,
++	0x1f04, 0x7d5d, 0x2069, 0x1101, 0x20a9, 0x0004, 0x2d76, 0x8d68,
++	0x8e70, 0x1f04, 0x7d66, 0x2069, 0x12ea, 0x20a9, 0x001a, 0x9e86,
++	0x0260, 0x1148, 0x00c6, 0x2061, 0x0200, 0x6010, 0x8000, 0x6012,
++	0x00ce, 0x2071, 0x0240, 0x2d04, 0x8007, 0x2072, 0x8d68, 0x8e70,
++	0x1f04, 0x7d6f, 0x2073, 0x0000, 0x8e70, 0x2073, 0x0000, 0x60c3,
++	0x004c, 0x080c, 0x8576, 0x00ee, 0x00de, 0x0005, 0x080c, 0x7fd5,
++	0x7003, 0x6300, 0x7007, 0x0028, 0x700b, 0x0000, 0x7808, 0x700e,
++	0x60c3, 0x0008, 0x080c, 0x8576, 0x0005, 0x00d6, 0x0026, 0x0016,
++	0x080c, 0x804b, 0x7003, 0x0200, 0x7814, 0x700e, 0x00e6, 0x9ef0,
++	0x0004, 0x2009, 0x0001, 0x2011, 0x000c, 0x2073, 0x0800, 0x8e70,
++	0x2073, 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, 0x8576,
++	0x001e, 0x002e, 0x00de, 0x0005, 0x2001, 0x1116, 0x2004, 0x609a,
++	0x080c, 0x8576, 0x0005, 0x080c, 0x7fd5, 0x7003, 0x5200, 0x2069,
++	0x1152, 0x6804, 0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x1f77,
++	0x710e, 0x001e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1105,
++	0x20e9, 0x0000, 0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099,
++	0x1101, 0x20a1, 0x0254, 0x4003, 0x2001, 0x1136, 0x2004, 0xd0ac,
++	0x1138, 0x7810, 0x9080, 0x0028, 0x2004, 0x9082, 0x007f, 0x0248,
++	0x2001, 0x111d, 0x2004, 0x7032, 0x2001, 0x111e, 0x2004, 0x7036,
++	0x0030, 0x2001, 0x1116, 0x2004, 0x9084, 0x00ff, 0x7036, 0x60c3,
++	0x001c, 0x080c, 0x8576, 0x0005, 0x080c, 0x7fd5, 0x7003, 0x0500,
++	0x2001, 0x1136, 0x2004, 0xd0ac, 0x1138, 0x7810, 0x9080, 0x0028,
++	0x2004, 0x9082, 0x007f, 0x0248, 0x2001, 0x111d, 0x2004, 0x700a,
++	0x2001, 0x111e, 0x2004, 0x700e, 0x0030, 0x2001, 0x1116, 0x2004,
++	0x9084, 0x00ff, 0x700e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099,
++	0x1105, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x4003, 0x60c3, 0x0010,
++	0x080c, 0x8576, 0x0005, 0x080c, 0x7fd5, 0x00c6, 0x7810, 0x2060,
++	0x9006, 0x080c, 0x5898, 0x00ce, 0x7810, 0x9080, 0x0028, 0x2004,
++	0x9086, 0x007e, 0x1130, 0x7003, 0x0400, 0x620c, 0xc2b4, 0x620e,
++	0x0068, 0x7814, 0x00d6, 0x906d, 0x0130, 0x689b, 0x0000, 0x68a7,
++	0x0000, 0x68ab, 0x0000, 0x00de, 0x7003, 0x0300, 0x7810, 0x9080,
++	0x0028, 0x2004, 0x9086, 0x007e, 0x1904, 0x7eab, 0x00d6, 0x2069,
++	0x1297, 0x2001, 0x1136, 0x2004, 0xd0a4, 0x0178, 0x6800, 0x700a,
++	0x6808, 0x9084, 0x2000, 0x7012, 0x680c, 0x7016, 0x701f, 0x2710,
++	0x6818, 0x7022, 0x681c, 0x7026, 0x0080, 0x6800, 0x700a, 0x6804,
++	0x700e, 0x6808, 0x080c, 0x62e4, 0x1118, 0x9084, 0x37ff, 0x0010,
++	0x9084, 0x3fff, 0x7012, 0x680c, 0x7016, 0x00de, 0x20a9, 0x0004,
++	0x20e1, 0x0001, 0x2099, 0x1105, 0x20e9, 0x0000, 0x20a1, 0x0256,
++	0x4003, 0x20a9, 0x0004, 0x2099, 0x1101, 0x20a1, 0x025a, 0x4003,
++	0x00d6, 0x080c, 0x8dae, 0x2069, 0x129f, 0x2071, 0x024e, 0x6800,
++	0xc0dd, 0x7002, 0x2001, 0x1172, 0x2004, 0xd0e4, 0x0110, 0x680c,
++	0x700e, 0x00de, 0x04a8, 0x2001, 0x1136, 0x2004, 0xd0a4, 0x0170,
++	0x0016, 0x2001, 0x1298, 0x200c, 0x60e0, 0x9106, 0x0130, 0x2100,
++	0x60e3, 0x0000, 0x080c, 0x1fb8, 0x61e2, 0x001e, 0x20e1, 0x0001,
++	0x2099, 0x1297, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x20a9, 0x0008,
++	0x4003, 0x20a9, 0x0004, 0x2099, 0x1105, 0x20a1, 0x0256, 0x4003,
++	0x20a9, 0x0004, 0x2099, 0x1101, 0x20a1, 0x025a, 0x4003, 0x080c,
++	0x8dae, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x2099, 0x129f, 0x4003,
++	0x60c3, 0x0074, 0x080c, 0x8576, 0x0005, 0x080c, 0x7fd5, 0x7003,
++	0x2010, 0x7007, 0x0014, 0x700b, 0x0800, 0x700f, 0x2000, 0x9006,
++	0x00f6, 0x2079, 0x1152, 0x7904, 0x00fe, 0xd1ac, 0x1110, 0x9085,
++	0x0020, 0xd1a4, 0x0110, 0x9085, 0x0010, 0x9085, 0x0002, 0x00d6,
++	0x0804, 0x7f85, 0x7026, 0x60c3, 0x0014, 0x080c, 0x8576, 0x0005,
++	0x080c, 0x7fd5, 0x7003, 0x5000, 0x0804, 0x7e56, 0x080c, 0x7fd5,
++	0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, 0x080c, 0x8576,
++	0x0005, 0x080c, 0x8042, 0x0010, 0x080c, 0x804b, 0x7003, 0x0200,
++	0x60c3, 0x0004, 0x080c, 0x8576, 0x0005, 0x080c, 0x804b, 0x7003,
++	0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x080c,
++	0x8576, 0x0005, 0x080c, 0x804b, 0x7003, 0x0200, 0x0804, 0x7e56,
++	0x080c, 0x804b, 0x7003, 0x0100, 0x782c, 0x9005, 0x0110, 0x700a,
++	0x0010, 0x700b, 0x0003, 0x7814, 0x700e, 0x60c3, 0x0008, 0x080c,
++	0x8576, 0x0005, 0x00d6, 0x080c, 0x804b, 0x7003, 0x0210, 0x7007,
++	0x0014, 0x700b, 0x0800, 0x7810, 0x2068, 0x6894, 0x9086, 0x0014,
++	0x1198, 0x699c, 0x9184, 0x0030, 0x0190, 0x6998, 0x9184, 0xc000,
++	0x1140, 0xd1ec, 0x0118, 0x700f, 0x2100, 0x0058, 0x700f, 0x0100,
++	0x0040, 0x700f, 0x0400, 0x0028, 0x700f, 0x0700, 0x0010, 0x700f,
++	0x0800, 0x00f6, 0x2079, 0x1152, 0x7904, 0x00fe, 0xd1ac, 0x1110,
++	0x9085, 0x0020, 0xd1a4, 0x0110, 0x9085, 0x0010, 0x2009, 0x1174,
++	0x210c, 0xd184, 0x1110, 0x9085, 0x0002, 0x0026, 0x2009, 0x1172,
++	0x210c, 0xd1e4, 0x0130, 0xc0c5, 0x9094, 0x0030, 0x9296, 0x0010,
++	0x0140, 0xd1ec, 0x0130, 0x9094, 0x0030, 0x9296, 0x0010, 0x0108,
++	0xc0bd, 0x002e, 0x7026, 0x60c3, 0x0014, 0x00de, 0x080c, 0x8576,
++	0x0005, 0x080c, 0x804b, 0x7003, 0x0210, 0x7007, 0x0014, 0x700f,
++	0x0100, 0x60c3, 0x0014, 0x080c, 0x8576, 0x0005, 0x080c, 0x804b,
++	0x7003, 0x0200, 0x0804, 0x7dc7, 0x080c, 0x804b, 0x7003, 0x0100,
++	0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x080c, 0x8576,
++	0x0005, 0x080c, 0x804b, 0x7003, 0x0100, 0x700b, 0x000b, 0x60c3,
++	0x0008, 0x080c, 0x8576, 0x0005, 0x0026, 0x00d6, 0x0036, 0x0046,
++	0x2019, 0x3200, 0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036,
++	0x0046, 0x2019, 0x2200, 0x2021, 0x0100, 0x080c, 0x8dc3, 0x7810,
++	0x2068, 0x6810, 0x9305, 0x7002, 0x6814, 0x7006, 0x6aa0, 0x2069,
++	0x1100, 0x6858, 0x700e, 0x9286, 0x007e, 0x1168, 0x9385, 0x00ff,
++	0x7002, 0x7007, 0xfffe, 0x2001, 0x12a7, 0x2004, 0x9005, 0x01e8,
++	0x6a78, 0x720e, 0x00d0, 0x9286, 0x007f, 0x1130, 0x9385, 0x00ff,
++	0x7002, 0x7007, 0xfffd, 0x0068, 0x68d8, 0xd0ac, 0x1110, 0xd2bc,
++	0x0160, 0x9286, 0x0080, 0x1128, 0x9385, 0x00ff, 0x7002, 0x7007,
++	0xfffc, 0x6874, 0x700a, 0x6878, 0x700e, 0x9485, 0x0029, 0x7012,
++	0x004e, 0x003e, 0x00de, 0x080c, 0x8565, 0x721a, 0x9f95, 0x0000,
++	0x7222, 0x7027, 0xffff, 0x2071, 0x024c, 0x002e, 0x0005, 0x0026,
++	0x080c, 0x8dc3, 0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6, 0x2069,
++	0x1100, 0x6874, 0x700a, 0x6878, 0x700e, 0x00de, 0x7013, 0x2029,
++	0x0c10, 0x7003, 0x0100, 0x7007, 0x0000, 0x700b, 0xfc02, 0x700f,
++	0x0000, 0x0005, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x3300,
++	0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019,
++	0x2300, 0x2021, 0x0100, 0x080c, 0x8dc3, 0x7810, 0x2068, 0x6810,
++	0x9305, 0x7002, 0x6814, 0x7006, 0x68a0, 0x2069, 0x1100, 0x6a58,
++	0x720e, 0x6ad8, 0xd2ac, 0x1118, 0x9092, 0x007e, 0x02a0, 0x7810,
++	0x00c6, 0x2060, 0x6010, 0x9005, 0x1140, 0x6014, 0x9005, 0x1128,
++	0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020, 0x6874, 0x700a, 0x6878,
++	0x700e, 0x00ce, 0x0000, 0x9485, 0x0098, 0x7012, 0x004e, 0x003e,
++	0x00de, 0x080c, 0x8565, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226,
++	0x2071, 0x024c, 0x002e, 0x0005, 0x080c, 0x8565, 0x721a, 0x7a08,
++	0x7222, 0x7814, 0x7026, 0x2071, 0x024c, 0x002e, 0x0005, 0x00c6,
++	0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004,
++	0x908a, 0x0085, 0x0a0c, 0x0d7e, 0x908a, 0x0092, 0x1a0c, 0x0d7e,
++	0x6110, 0x2178, 0x79a0, 0x2011, 0x1136, 0x2214, 0xd2ac, 0x1110,
++	0xd1bc, 0x0148, 0x7900, 0xd1f4, 0x0120, 0x7914, 0x918c, 0x00ff,
++	0x0038, 0x900e, 0x0028, 0x91f8, 0x298c, 0x2f0d, 0x918c, 0x00ff,
++	0x2c78, 0x2061, 0x0100, 0x619a, 0x9082, 0x0085, 0x002b, 0x00fe,
++	0x00ee, 0x00de, 0x00ce, 0x0005, 0x80db, 0x80e1, 0x80ed, 0x80d9,
++	0x80d9, 0x80d9, 0x80db, 0x80d9, 0x80d9, 0x80d9, 0x80d9, 0x80d9,
++	0x80d9, 0x080c, 0x0d7e, 0x00e1, 0x60c3, 0x0000, 0x080c, 0x8576,
++	0x0005, 0x04a9, 0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff,
++	0x60c3, 0x000c, 0x080c, 0x8576, 0x0005, 0x080c, 0x8137, 0x7003,
++	0x0003, 0x7007, 0x0300, 0x60c3, 0x0004, 0x080c, 0x8576, 0x0005,
++	0x0026, 0x080c, 0x8dc3, 0x7810, 0x2068, 0x6810, 0x9085, 0x8100,
++	0x7002, 0x6814, 0x7006, 0x68a0, 0x2069, 0x1100, 0x6ad8, 0xd2ac,
++	0x1118, 0x9092, 0x007e, 0x0240, 0x6874, 0x700a, 0x6878, 0x700e,
++	0x7013, 0x0009, 0x0804, 0x801b, 0x6a58, 0x720e, 0x0cc8, 0x0026,
++	0x080c, 0x8dc3, 0x7810, 0x2068, 0x6810, 0x9085, 0x8400, 0x7002,
++	0x6814, 0x7006, 0x68a0, 0x2069, 0x1100, 0x6ad8, 0xd2ac, 0x1118,
++	0x9092, 0x007e, 0x0248, 0x6874, 0x700a, 0x6878, 0x700e, 0x2001,
++	0x0099, 0x7012, 0x0804, 0x808c, 0x6a58, 0x720e, 0x0cc0, 0x0026,
++	0x080c, 0x8dc3, 0x7810, 0x2068, 0x6810, 0x9085, 0x8500, 0x7002,
++	0x6814, 0x7006, 0x68a0, 0x2069, 0x1100, 0x6ad8, 0xd2ac, 0x1118,
++	0x9092, 0x007e, 0x0248, 0x6874, 0x700a, 0x6878, 0x700e, 0x2001,
++	0x0099, 0x7012, 0x0804, 0x808c, 0x6a58, 0x720e, 0x0cc0, 0x00c6,
++	0x00d6, 0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200, 0x2071, 0x0240,
++	0x7804, 0x908a, 0x0040, 0x0a0c, 0x0d7e, 0x908a, 0x0054, 0x1a0c,
++	0x0d7e, 0x7910, 0x2160, 0x61a0, 0x2011, 0x1136, 0x2214, 0xd2ac,
++	0x1110, 0xd1bc, 0x0148, 0x6100, 0xd1f4, 0x0120, 0x6114, 0x918c,
++	0x00ff, 0x0038, 0x900e, 0x0028, 0x91e0, 0x298c, 0x2c0d, 0x918c,
++	0x00ff, 0x2061, 0x0100, 0x619a, 0x9082, 0x0040, 0x002b, 0x00fe,
++	0x00ee, 0x00de, 0x00ce, 0x0005, 0x81a1, 0x825f, 0x8226, 0x8391,
++	0x819f, 0x819f, 0x819f, 0x819f, 0x819f, 0x819f, 0x819f, 0x893a,
++	0x8942, 0x894a, 0x8952, 0x819f, 0x8d0a, 0x819f, 0x8932, 0x080c,
++	0x0d7e, 0x780b, 0xffff, 0x080c, 0x81f4, 0x7914, 0x2168, 0x6978,
++	0x7956, 0x7132, 0x697c, 0x9184, 0x000f, 0x1118, 0x2001, 0x0005,
++	0x0040, 0xd184, 0x0118, 0x2001, 0x0004, 0x0018, 0x9084, 0x0006,
++	0x8004, 0x2010, 0x785c, 0x9084, 0x00ff, 0x8007, 0x9205, 0x7042,
++	0xd1ac, 0x0128, 0x7047, 0x0002, 0x080c, 0x137e, 0x0050, 0xd1b4,
++	0x0118, 0x7047, 0x0001, 0x0028, 0x7047, 0x0000, 0x9016, 0x2230,
++	0x0010, 0x6ab0, 0x6eac, 0x726a, 0x766e, 0x20a9, 0x0008, 0x20e9,
++	0x0000, 0x9d88, 0x0023, 0x20e1, 0x0001, 0x2198, 0x20a1, 0x0252,
++	0x2069, 0x0200, 0x6813, 0x0018, 0x4003, 0x6813, 0x0008, 0x60c3,
++	0x0020, 0x6017, 0x0009, 0x2001, 0x1320, 0x2003, 0x07d0, 0x2001,
++	0x131f, 0x2003, 0x0009, 0x0005, 0x00d6, 0x6813, 0x0008, 0x7a10,
++	0x2268, 0x6a8c, 0x8210, 0x9294, 0x00ff, 0x6a8e, 0x8217, 0x721a,
++	0x6a10, 0x9295, 0x0600, 0x7202, 0x6a14, 0x7206, 0x68a0, 0x6900,
++	0x2069, 0x1100, 0x6bd8, 0xd3ac, 0x1138, 0xd0bc, 0x0188, 0xd1f4,
++	0x0118, 0x9294, 0x00ff, 0x629a, 0x6a74, 0x720a, 0x6a78, 0x720e,
++	0x7013, 0x0829, 0x2f10, 0x7222, 0x7027, 0xffff, 0x00de, 0x0005,
++	0x9294, 0x00ff, 0x629a, 0x6a58, 0x720e, 0x0c90, 0x00d6, 0x0081,
++	0x7814, 0x2068, 0x6890, 0x7002, 0x688c, 0x7006, 0x68b0, 0x700a,
++	0x68ac, 0x700e, 0x60c3, 0x000c, 0x00de, 0x080c, 0x8576, 0x0005,
++	0x00d6, 0x6813, 0x0008, 0x7810, 0x2068, 0x6810, 0x9085, 0x0500,
++	0x7002, 0x6814, 0x7006, 0x68a0, 0x2069, 0x1100, 0x6ad8, 0xd2ac,
++	0x1110, 0xd0bc, 0x0188, 0x6874, 0x700a, 0x6878, 0x700e, 0x7013,
++	0x0889, 0x080c, 0x8565, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226,
++	0x2071, 0x024c, 0x00de, 0x0005, 0x6a58, 0x720e, 0x0c80, 0x00d6,
++	0x080c, 0x8364, 0x7814, 0x2068, 0x9084, 0xf000, 0x1130, 0x7814,
++	0x9084, 0x0700, 0x8007, 0x002b, 0x0010, 0x9006, 0x0013, 0x00de,
++	0x0005, 0x827b, 0x82e8, 0x82f8, 0x831f, 0x832c, 0x833e, 0x8346,
++	0x8279, 0x080c, 0x0d7e, 0x0016, 0x0036, 0x697c, 0x918c, 0x0003,
++	0x0118, 0x9186, 0x0003, 0x11a0, 0x6ba8, 0x7824, 0xd0cc, 0x1170,
++	0x7316, 0x6898, 0x701a, 0x6894, 0x701e, 0x003e, 0x001e, 0x2001,
++	0x12e8, 0x2004, 0x60c2, 0x080c, 0x8576, 0x0005, 0xc3e5, 0x0c80,
++	0x9186, 0x0001, 0x190c, 0x0d7e, 0x6ba8, 0x7824, 0xd0cc, 0x1904,
++	0x82e5, 0x7316, 0x6898, 0x701a, 0x6894, 0x701e, 0x68a4, 0x7026,
++	0x68ac, 0x702e, 0x2009, 0x0018, 0x9384, 0x0300, 0x0580, 0xd3c4,
++	0x0110, 0x68ac, 0x9108, 0xd3cc, 0x0110, 0x68a4, 0x9108, 0x2011,
++	0x0258, 0x0156, 0x20a9, 0x0008, 0x9d80, 0x002c, 0x201c, 0x831f,
++	0x2312, 0x8000, 0x8210, 0x1f04, 0x82be, 0x0016, 0x00d6, 0x2069,
++	0x0200, 0x080c, 0x8dae, 0x00de, 0x001e, 0x2011, 0x0240, 0x20a9,
++	0x0005, 0x201c, 0x831f, 0x2312, 0x8000, 0x8210, 0x1f04, 0x82d1,
++	0x015e, 0x9184, 0x0003, 0x0118, 0x2019, 0x0245, 0x201a, 0x61c2,
++	0x003e, 0x001e, 0x080c, 0x8576, 0x0005, 0xc3e5, 0x0804, 0x82a1,
++	0x2011, 0x0008, 0x2001, 0x110e, 0x2004, 0xd0a4, 0x0110, 0x2011,
++	0x0028, 0x7824, 0xd0cc, 0x1110, 0x7216, 0x0478, 0x0ce8, 0xc2e5,
++	0x2011, 0x0302, 0x0016, 0x782c, 0x701a, 0x7930, 0x711e, 0x9105,
++	0x0108, 0xc2dd, 0x001e, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216,
++	0x7027, 0x0012, 0x702f, 0x0008, 0x7043, 0x7000, 0x7047, 0x0500,
++	0x704f, 0x000a, 0x2069, 0x0200, 0x6813, 0x0009, 0x2071, 0x0240,
++	0x700b, 0x2500, 0x60c3, 0x0032, 0x080c, 0x8576, 0x0005, 0x2011,
++	0x0028, 0x7824, 0xd0cc, 0x1130, 0x7216, 0x60c3, 0x0018, 0x080c,
++	0x8576, 0x0005, 0x0cc8, 0xc2e5, 0x2011, 0x0100, 0x7824, 0xd0cc,
++	0x0108, 0xc2e5, 0x7216, 0x702f, 0x0008, 0x7858, 0x9084, 0x00ff,
++	0x7036, 0x60c3, 0x0020, 0x080c, 0x8576, 0x0005, 0x2011, 0x0008,
++	0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x08f8, 0x0036, 0x7b14,
++	0x9384, 0xff00, 0x7816, 0x9384, 0x00ff, 0x8001, 0x1138, 0x7824,
++	0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x003e, 0x0878, 0x0046, 0x2021,
++	0x0800, 0x0006, 0x7824, 0xd0cc, 0x000e, 0x0108, 0xc4e5, 0x7416,
++	0x004e, 0x701e, 0x003e, 0x0808, 0x00d6, 0x6813, 0x0008, 0x7a10,
++	0x2268, 0x6810, 0x9085, 0x0700, 0x7002, 0x6814, 0x7006, 0x68a0,
++	0x2069, 0x1100, 0x6ad8, 0xd2ac, 0x1110, 0xd0bc, 0x01a0, 0x6874,
++	0x700a, 0x6878, 0x700e, 0x7824, 0xd0cc, 0x1180, 0x7013, 0x0898,
++	0x080c, 0x8565, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071,
++	0x024c, 0x00de, 0x0005, 0x6a58, 0x720e, 0x0c68, 0x7013, 0x0889,
++	0x0c78, 0x0016, 0x7814, 0x9084, 0x0700, 0x8007, 0x0013, 0x001e,
++	0x0005, 0x83a1, 0x83a1, 0x83a3, 0x83a1, 0x83a1, 0x83a1, 0x83c0,
++	0x83a1, 0x080c, 0x0d7e, 0x7914, 0x918c, 0xf8ff, 0x918d, 0x0600,
++	0x7916, 0x2009, 0x0003, 0x00d1, 0x00d6, 0x2069, 0x1152, 0x6804,
++	0xd0bc, 0x0130, 0x682c, 0x9084, 0x00ff, 0x8007, 0x7032, 0x0010,
++	0x7033, 0x3f00, 0x00de, 0x60c3, 0x0001, 0x080c, 0x8576, 0x0005,
++	0x2009, 0x0003, 0x0019, 0x7033, 0x7f00, 0x0ca8, 0x00d6, 0x0016,
++	0x080c, 0x8dc3, 0x001e, 0x7810, 0x2068, 0x6810, 0x9085, 0x0100,
++	0x7002, 0x6814, 0x7006, 0x68a0, 0x2069, 0x1100, 0x6ad8, 0xd2ac,
++	0x1110, 0xd0bc, 0x0190, 0x6a74, 0x720a, 0x6a78, 0x720e, 0x7013,
++	0x0888, 0x918d, 0x0008, 0x7116, 0x080c, 0x8565, 0x721a, 0x7a08,
++	0x7222, 0x2f10, 0x7226, 0x00de, 0x0005, 0x6a58, 0x720e, 0x0c78,
++	0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100,
++	0x2071, 0x1100, 0x7158, 0x7810, 0x2068, 0x68a0, 0x2028, 0x6910,
++	0x6a14, 0x76d8, 0xd6ac, 0x1128, 0xd0bc, 0x1118, 0x901e, 0x7458,
++	0x0010, 0x7374, 0x7478, 0x7820, 0x90be, 0x0006, 0x0904, 0x84dd,
++	0x90be, 0x000a, 0x1904, 0x8496, 0x609f, 0x0000, 0x7814, 0x2070,
++	0x707c, 0xd0fc, 0x0904, 0x845d, 0x7790, 0x9784, 0xff00, 0x9105,
++	0x6062, 0x873f, 0x9784, 0xff00, 0x0006, 0x7814, 0x9080, 0x001e,
++	0x2004, 0x9005, 0x000e, 0x1160, 0x7794, 0x87ff, 0x0548, 0x2039,
++	0x0098, 0x9705, 0x6072, 0x7808, 0x6082, 0x2f00, 0x6086, 0x0470,
++	0x9185, 0x2200, 0x6062, 0x6073, 0x0129, 0x6077, 0x0000, 0x609f,
++	0x0000, 0x2001, 0x1136, 0x2004, 0x9084, 0x0020, 0x11d8, 0x2001,
++	0x1136, 0x2004, 0x9084, 0x0008, 0x0140, 0x7814, 0x9080, 0x001d,
++	0x2004, 0x8007, 0x9082, 0x0080, 0x1268, 0x6814, 0x609e, 0x0050,
++	0x2039, 0x0029, 0x9705, 0x6072, 0x0028, 0x9185, 0x0200, 0x6062,
++	0x6073, 0x2029, 0x2f00, 0x6082, 0x7808, 0x6086, 0x6266, 0x636a,
++	0x646e, 0x6077, 0x0000, 0x688c, 0x8000, 0x9084, 0x00ff, 0x688e,
++	0x8007, 0x607a, 0x607f, 0x0000, 0x7038, 0x608a, 0x7034, 0x608e,
++	0x7048, 0x60c6, 0x7044, 0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5,
++	0x60d7, 0x0000, 0x080c, 0x8da8, 0x2009, 0x07d0, 0x60c4, 0x9084,
++	0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x7276, 0x003e,
++	0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x9185, 0x0100,
++	0x6062, 0x6266, 0x636a, 0x646e, 0x6073, 0x0809, 0x6077, 0x0008,
++	0x60af, 0x95d5, 0x60d7, 0x0000, 0x688c, 0x8000, 0x9084, 0x00ff,
++	0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808,
++	0x6086, 0x7814, 0x2070, 0x7038, 0x608a, 0x7034, 0x608e, 0x7048,
++	0x60c6, 0x7044, 0x60ca, 0x686c, 0x60ce, 0x9582, 0x0080, 0x0240,
++	0x6a00, 0xd2f4, 0x0120, 0x6a14, 0x9294, 0x00ff, 0x0008, 0x9016,
++	0x629e, 0x080c, 0x8da8, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0,
++	0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x7276, 0x003e, 0x004e,
++	0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7814, 0x2070, 0x707c,
++	0x9084, 0x0003, 0x9086, 0x0002, 0x05e8, 0x9185, 0x0100, 0x6062,
++	0x6266, 0x636a, 0x646e, 0x6073, 0x0880, 0x6077, 0x0008, 0x688c,
++	0x8000, 0x9084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x7838, 0x607e,
++	0x2f00, 0x6086, 0x7808, 0x6082, 0x7090, 0x608a, 0x708c, 0x608e,
++	0x70b0, 0x60c6, 0x70ac, 0x60ca, 0x70ac, 0x7930, 0x9108, 0x7932,
++	0x70b0, 0x792c, 0x9109, 0x792e, 0x686c, 0x60ce, 0x60af, 0x95d5,
++	0x60d7, 0x0000, 0x9582, 0x0080, 0x0240, 0x6a00, 0xd2f4, 0x0120,
++	0x6a14, 0x9294, 0x00ff, 0x0008, 0x9016, 0x629e, 0x080c, 0x8d83,
++	0x0804, 0x84cb, 0x9185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e,
++	0x7824, 0xd0cc, 0x7826, 0x0118, 0x6073, 0x0889, 0x0010, 0x6073,
++	0x0898, 0x6077, 0x0000, 0x688c, 0x8000, 0x9084, 0x00ff, 0x688e,
++	0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, 0x6082,
++	0x7038, 0x608a, 0x7034, 0x608e, 0x7048, 0x60c6, 0x7044, 0x60ca,
++	0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0x9582, 0x0080,
++	0x0240, 0x6a00, 0xd2f4, 0x0120, 0x6a14, 0x9294, 0x00ff, 0x0008,
++	0x9016, 0x629e, 0x7824, 0xd0cc, 0x0120, 0x080c, 0x8da8, 0x0804,
++	0x84cb, 0x080c, 0x8d83, 0x0804, 0x84cb, 0x7a10, 0x9280, 0x0023,
++	0x2014, 0x8210, 0x9294, 0x00ff, 0x2202, 0x8217, 0x0005, 0x00d6,
++	0x2069, 0x1304, 0x6843, 0x0001, 0x00de, 0x0005, 0x60a3, 0x0056,
++	0x60a7, 0x9575, 0x00f1, 0x080c, 0x7268, 0x0005, 0x0016, 0x2001,
++	0x110c, 0x200c, 0x9184, 0x0600, 0x9086, 0x0600, 0x0128, 0x0089,
++	0x080c, 0x7268, 0x001e, 0x0005, 0xc1e5, 0x2001, 0x110c, 0x2102,
++	0x2001, 0x1305, 0x2003, 0x0000, 0x2001, 0x130d, 0x2003, 0x0000,
++	0x0c88, 0x0006, 0x6014, 0x9084, 0x1804, 0x9085, 0x0009, 0x6016,
++	0x000e, 0x0005, 0x0016, 0x00c6, 0x0006, 0x2061, 0x0100, 0x61a4,
++	0x60a7, 0x95f5, 0x6014, 0x9084, 0x1804, 0x9085, 0x0008, 0x6016,
++	0x000e, 0xa001, 0xa001, 0xa001, 0x61a6, 0x00ce, 0x001e, 0x0005,
++	0x00c6, 0x00d6, 0x0016, 0x0026, 0x2061, 0x0100, 0x2069, 0x0140,
++	0x080c, 0x62e4, 0x1198, 0x2001, 0x1320, 0x2004, 0x9005, 0x15d0,
++	0x0066, 0x2031, 0x0001, 0x080c, 0x6380, 0x006e, 0x1118, 0x080c,
++	0x7268, 0x0480, 0x00c6, 0x2061, 0x1304, 0x00f0, 0x6904, 0x9194,
++	0x4000, 0x0568, 0x0839, 0x2001, 0x1000, 0x080c, 0x2401, 0x9006,
++	0x080c, 0x2401, 0x00c6, 0x2061, 0x1304, 0x6128, 0x9192, 0x00c8,
++	0x1258, 0x8108, 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c,
++	0x7268, 0x080c, 0x8599, 0x0070, 0x6124, 0x91e5, 0x0000, 0x0140,
++	0x080c, 0xc463, 0x080c, 0x7271, 0x2009, 0x0014, 0x080c, 0x8f53,
++	0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001,
++	0x1320, 0x2004, 0x9005, 0x1db0, 0x00c6, 0x2061, 0x1304, 0x6128,
++	0x9192, 0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, 0x7268,
++	0x080c, 0x4faa, 0x0c38, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026,
++	0x080c, 0x727e, 0x2071, 0x1304, 0x713c, 0x81ff, 0x0904, 0x868e,
++	0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x62e4, 0x11b0, 0x0036,
++	0x2019, 0x0002, 0x080c, 0x8847, 0x003e, 0x713c, 0x2160, 0x080c,
++	0xc463, 0x2009, 0x004a, 0x080c, 0x8f53, 0x0066, 0x2031, 0x0001,
++	0x080c, 0x6380, 0x006e, 0x0804, 0x868e, 0x6904, 0x9194, 0x4000,
++	0x0904, 0x8694, 0x2001, 0x1000, 0x080c, 0x2401, 0x9006, 0x080c,
++	0x2401, 0x00c6, 0x703c, 0x9065, 0x090c, 0x0d7e, 0x6020, 0x00ce,
++	0x9086, 0x0006, 0x1528, 0x61c8, 0x60c4, 0x9105, 0x1508, 0x2009,
++	0x110c, 0x2104, 0xd0d4, 0x01e0, 0x6214, 0x9294, 0x1800, 0x1128,
++	0x6224, 0x9294, 0x0002, 0x1510, 0x0030, 0xc0d4, 0x200a, 0xd0cc,
++	0x0110, 0x080c, 0x2369, 0x6014, 0x9084, 0xe7fd, 0x9085, 0x0010,
++	0x6016, 0x703c, 0x2060, 0x2009, 0x0049, 0x080c, 0x8f53, 0x0070,
++	0x0036, 0x2019, 0x0001, 0x080c, 0x8847, 0x003e, 0x713c, 0x2160,
++	0x080c, 0xc463, 0x2009, 0x004a, 0x080c, 0x8f53, 0x002e, 0x001e,
++	0x00ee, 0x00de, 0x00ce, 0x0005, 0x0804, 0x8651, 0x0026, 0x00e6,
++	0x2071, 0x1304, 0x7048, 0xd084, 0x01c0, 0x713c, 0x81ff, 0x01a8,
++	0x2071, 0x0100, 0x9188, 0x0008, 0x2114, 0x928e, 0x0006, 0x1138,
++	0x7014, 0x9084, 0x1984, 0x9085, 0x0012, 0x7016, 0x0030, 0x7014,
++	0x9084, 0x1984, 0x9085, 0x0016, 0x7016, 0x00ee, 0x002e, 0x0005,
++	0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, 0x0006, 0x0126,
++	0x2091, 0x8000, 0x6010, 0x2068, 0x6ca0, 0x2071, 0x1304, 0x7018,
++	0x2068, 0x8dff, 0x0188, 0x68a0, 0x9406, 0x0118, 0x6854, 0x2068,
++	0x0cc0, 0x6014, 0x2060, 0x646c, 0x6570, 0x6678, 0x2d60, 0x080c,
++	0x5728, 0x0110, 0x9085, 0x0001, 0x012e, 0x000e, 0x004e, 0x005e,
++	0x006e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x080c, 0x7fd5, 0x7003,
++	0x1200, 0x7820, 0x9086, 0x0004, 0x1110, 0x6098, 0x0018, 0x2001,
++	0x1116, 0x2004, 0x700e, 0x7838, 0x7012, 0x783c, 0x7016, 0x60c3,
++	0x002c, 0x080c, 0x8576, 0x0005, 0x080c, 0x7fd5, 0x7003, 0x0f00,
++	0x7808, 0x700e, 0x60c3, 0x0008, 0x080c, 0x8576, 0x0005, 0x0156,
++	0x080c, 0x804b, 0x7003, 0x0200, 0x2011, 0x1148, 0x63f0, 0x2312,
++	0x20a9, 0x0006, 0x2011, 0x1140, 0x2019, 0x1141, 0x9ef0, 0x0002,
++	0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002,
++	0x1f04, 0x8718, 0x60c3, 0x001c, 0x080c, 0x8576, 0x015e, 0x0005,
++	0x0016, 0x0026, 0x080c, 0x8027, 0x080c, 0x8039, 0x9e80, 0x0004,
++	0x20e9, 0x0000, 0x20a0, 0x7814, 0x9080, 0x0000, 0x2004, 0x9080,
++	0x0021, 0x20e1, 0x0001, 0x2098, 0x7808, 0x9088, 0x0002, 0x21a8,
++	0x9192, 0x0010, 0x1250, 0x4003, 0x9080, 0x0004, 0x8003, 0x60c2,
++	0x080c, 0x8576, 0x002e, 0x001e, 0x0005, 0x20a9, 0x0010, 0x4003,
++	0x080c, 0x8dae, 0x20a1, 0x0240, 0x22a8, 0x4003, 0x0c68, 0x080c,
++	0x7fd5, 0x7003, 0x6200, 0x7808, 0x700e, 0x60c3, 0x0008, 0x080c,
++	0x8576, 0x0005, 0x0016, 0x0026, 0x080c, 0x7fd5, 0x20e9, 0x0000,
++	0x20a1, 0x024c, 0x7814, 0x9080, 0x0000, 0x2004, 0x9080, 0x0023,
++	0x20e1, 0x0001, 0x2098, 0x7808, 0x9088, 0x0002, 0x21a8, 0x4003,
++	0x8003, 0x60c2, 0x080c, 0x8576, 0x002e, 0x001e, 0x0005, 0x00e6,
++	0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x1304, 0x700c,
++	0x2060, 0x8cff, 0x0178, 0x080c, 0xab2e, 0x1110, 0x080c, 0x97dc,
++	0x600c, 0x0006, 0x080c, 0xad68, 0x080c, 0x8ed9, 0x080c, 0x895e,
++	0x00ce, 0x0c78, 0x2c00, 0x700e, 0x700a, 0x012e, 0x000e, 0x00ce,
++	0x00ee, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6,
++	0x0026, 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x110c, 0x200c,
++	0x918c, 0xe7ff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071,
++	0x1304, 0x7024, 0x2060, 0x8cff, 0x0904, 0x87ff, 0x080c, 0x85a2,
++	0x6ac0, 0x68c3, 0x0000, 0x080c, 0x7271, 0x00c6, 0x2061, 0x0100,
++	0x080c, 0x8dc7, 0x00ce, 0x2009, 0x0013, 0x080c, 0x8f53, 0x20a9,
++	0x01f4, 0x6824, 0xd094, 0x0170, 0x6827, 0x0004, 0x7804, 0x9084,
++	0x4000, 0x01d0, 0x2001, 0x1000, 0x080c, 0x2401, 0x9006, 0x080c,
++	0x2401, 0x0090, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04,
++	0x87d1, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c,
++	0x2401, 0x9006, 0x080c, 0x2401, 0x6824, 0x000e, 0x001e, 0x002e,
++	0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001,
++	0x1100, 0x2004, 0x9096, 0x0001, 0x05c0, 0x9096, 0x0004, 0x05a8,
++	0x080c, 0x7271, 0x6814, 0x9084, 0x0001, 0x0110, 0x68a7, 0x95f5,
++	0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x4f57, 0x080c, 0x71fa,
++	0x20a9, 0x01f4, 0x6824, 0xd094, 0x0170, 0x6827, 0x0004, 0x7804,
++	0x9084, 0x4000, 0x01d0, 0x7803, 0x1000, 0x080c, 0x2401, 0x9006,
++	0x080c, 0x2401, 0x0090, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010,
++	0x1f04, 0x881a, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100,
++	0x080c, 0x2401, 0x9006, 0x080c, 0x2401, 0x000e, 0x001e, 0x002e,
++	0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x0126,
++	0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0026, 0x0016, 0x0006,
++	0x2091, 0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2001, 0x110c,
++	0x200c, 0x918c, 0xdbff, 0x2102, 0x2071, 0x1304, 0x703c, 0x2060,
++	0x8cff, 0x0904, 0x88d8, 0x9386, 0x0002, 0x1128, 0x6814, 0x9084,
++	0x0002, 0x0904, 0x88d8, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009,
++	0x00fa, 0x8109, 0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c, 0x727e,
++	0x080c, 0x1872, 0x0046, 0x2009, 0x017f, 0x200b, 0x00a5, 0x2021,
++	0x0169, 0x2404, 0x9084, 0x000f, 0x9086, 0x0004, 0x11f8, 0x68af,
++	0x95f5, 0x68c6, 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0090,
++	0x2071, 0x134a, 0x6814, 0x9084, 0x1984, 0x9085, 0x0012, 0x6816,
++	0x782b, 0x0008, 0x7003, 0x0000, 0x00fe, 0x00ee, 0x9386, 0x0002,
++	0x1128, 0x7884, 0x9005, 0x1110, 0x7887, 0x0001, 0x2001, 0x12bb,
++	0x2004, 0x200a, 0x004e, 0x939d, 0x0000, 0x1120, 0x2009, 0x0049,
++	0x080c, 0x8f53, 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0170, 0x6827,
++	0x0004, 0x7804, 0x9084, 0x4000, 0x01d0, 0x2001, 0x1000, 0x080c,
++	0x2401, 0x9006, 0x080c, 0x2401, 0x0090, 0xd08c, 0x0118, 0x6827,
++	0x0002, 0x0010, 0x1f04, 0x88b4, 0x7804, 0x9084, 0x1000, 0x0138,
++	0x2001, 0x0100, 0x080c, 0x2401, 0x9006, 0x080c, 0x2401, 0x6824,
++	0x000e, 0x001e, 0x002e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e,
++	0x012e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x1304,
++	0x6a06, 0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000,
++	0x2069, 0x1304, 0x6a32, 0x012e, 0x00de, 0x0005, 0x00f6, 0x00e6,
++	0x00c6, 0x0066, 0x0006, 0x0126, 0x2071, 0x1304, 0x7614, 0x2660,
++	0x2678, 0x2091, 0x8000, 0x8cff, 0x0530, 0x6020, 0x9206, 0x11f8,
++	0x7014, 0x9c36, 0x1110, 0x660c, 0x7616, 0x7010, 0x9c36, 0x1140,
++	0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000,
++	0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678,
++	0x600f, 0x0000, 0x080c, 0x8f09, 0x04c9, 0x00ce, 0x08e0, 0x2c78,
++	0x600c, 0x2060, 0x08c0, 0x012e, 0x000e, 0x006e, 0x00ce, 0x00ee,
++	0x00fe, 0x0005, 0x080c, 0x81f4, 0x7814, 0x7032, 0x7042, 0x7047,
++	0x1000, 0x00f8, 0x080c, 0x81f4, 0x7814, 0x7032, 0x7042, 0x7047,
++	0x4000, 0x00b8, 0x080c, 0x81f4, 0x7814, 0x7032, 0x7042, 0x7047,
++	0x2000, 0x0078, 0x080c, 0x81f4, 0x7814, 0x7032, 0x7042, 0x7047,
++	0x0400, 0x0038, 0x080c, 0x81f4, 0x7814, 0x7032, 0x7042, 0x7047,
++	0x0200, 0x60c3, 0x0020, 0x080c, 0x8576, 0x0005, 0x00e6, 0x2071,
++	0x1304, 0x7020, 0x9005, 0x0110, 0x8001, 0x7022, 0x00ee, 0x0005,
++	0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126,
++	0x2091, 0x8000, 0x2071, 0x1304, 0x7614, 0x2660, 0x2678, 0x2039,
++	0x0001, 0x87ff, 0x0904, 0x89fa, 0x8cff, 0x0904, 0x89fa, 0x6020,
++	0x9086, 0x0006, 0x1904, 0x89f5, 0x88ff, 0x0138, 0x2800, 0x9c06,
++	0x1904, 0x89f5, 0x2039, 0x0000, 0x0050, 0x6010, 0x9206, 0x1904,
++	0x89f5, 0x85ff, 0x0120, 0x6054, 0x9106, 0x1904, 0x89f5, 0x7024,
++	0x9c06, 0x1578, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0530, 0x080c,
++	0x7271, 0x6820, 0xd0b4, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008,
++	0x68c3, 0x0000, 0x080c, 0x8a7d, 0x7027, 0x0000, 0x0036, 0x2069,
++	0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c,
++	0x2401, 0x9006, 0x080c, 0x2401, 0x2069, 0x0100, 0x6824, 0xd084,
++	0x0110, 0x6827, 0x0001, 0x003e, 0x0020, 0x6003, 0x0009, 0x630a,
++	0x0460, 0x7014, 0x9c36, 0x1110, 0x660c, 0x7616, 0x7010, 0x9c36,
++	0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013,
++	0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008,
++	0x2678, 0x89ff, 0x1158, 0x600f, 0x0000, 0x6014, 0x2068, 0x080c,
++	0xa942, 0x0110, 0x080c, 0xc0e9, 0x080c, 0x8f09, 0x080c, 0x895e,
++	0x88ff, 0x1190, 0x00ce, 0x0804, 0x8979, 0x2c78, 0x600c, 0x2060,
++	0x0804, 0x8979, 0x9006, 0x012e, 0x000e, 0x006e, 0x007e, 0x00ce,
++	0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x98c5,
++	0x0001, 0x0c88, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026,
++	0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x1304, 0x7638, 0x2660,
++	0x2678, 0x8cff, 0x0904, 0x8a6d, 0x6020, 0x9086, 0x0006, 0x1904,
++	0x8a68, 0x87ff, 0x0128, 0x2700, 0x9c06, 0x1904, 0x8a68, 0x0040,
++	0x6010, 0x9206, 0x15e8, 0x85ff, 0x0118, 0x6054, 0x9106, 0x15c0,
++	0x703c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, 0x080c, 0x8847,
++	0x7033, 0x0000, 0x9006, 0x703e, 0x7042, 0x7046, 0x704a, 0x003e,
++	0x7038, 0x9c36, 0x1110, 0x660c, 0x763a, 0x7034, 0x9c36, 0x1140,
++	0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000,
++	0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678,
++	0x600f, 0x0000, 0x6014, 0x2068, 0x080c, 0xa942, 0x0110, 0x080c,
++	0xc0e9, 0x080c, 0x8f09, 0x87ff, 0x1190, 0x00ce, 0x0804, 0x8a19,
++	0x2c78, 0x600c, 0x2060, 0x0804, 0x8a19, 0x9006, 0x012e, 0x000e,
++	0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b,
++	0x0000, 0x00ce, 0x97bd, 0x0001, 0x0c88, 0x00e6, 0x2071, 0x1304,
++	0x2001, 0x1100, 0x2004, 0x9086, 0x0002, 0x1118, 0x7007, 0x0005,
++	0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00c6,
++	0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x1304,
++	0x2c10, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0518, 0x2200, 0x9c06,
++	0x11e0, 0x7038, 0x9c36, 0x1110, 0x660c, 0x763a, 0x7034, 0x9c36,
++	0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037,
++	0x0000, 0x660c, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678,
++	0x600f, 0x0000, 0x9085, 0x0001, 0x0020, 0x2c78, 0x600c, 0x2060,
++	0x08d8, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00ee, 0x00fe,
++	0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0006, 0x0126,
++	0x2091, 0x8000, 0x2071, 0x1304, 0x760c, 0x2660, 0x2678, 0x8cff,
++	0x0904, 0x8b56, 0x6010, 0x9080, 0x0028, 0x2004, 0x9206, 0x1904,
++	0x8b51, 0x7024, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005,
++	0x0904, 0x8b2d, 0x080c, 0x85a2, 0x68c3, 0x0000, 0x080c, 0x8a7d,
++	0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000,
++	0x0138, 0x2001, 0x0100, 0x080c, 0x2401, 0x9006, 0x080c, 0x2401,
++	0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e,
++	0x700c, 0x9c36, 0x1110, 0x660c, 0x760e, 0x7008, 0x9c36, 0x1140,
++	0x2c00, 0x9f36, 0x0118, 0x2f00, 0x700a, 0x0010, 0x700b, 0x0000,
++	0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678,
++	0x600f, 0x0000, 0x080c, 0xab1d, 0x1158, 0x080c, 0x2886, 0x080c,
++	0xab2e, 0x11f0, 0x080c, 0x97dc, 0x00d8, 0x080c, 0x8a7d, 0x08c0,
++	0x080c, 0xab2e, 0x1118, 0x080c, 0x97dc, 0x0090, 0x6014, 0x2068,
++	0x080c, 0xa942, 0x0168, 0x6020, 0x9086, 0x0003, 0x11f8, 0x6867,
++	0x0103, 0x6b7a, 0x6877, 0x0000, 0x080c, 0x5b76, 0x080c, 0xab11,
++	0x080c, 0xad68, 0x080c, 0x8f09, 0x080c, 0x895e, 0x00ce, 0x0804,
++	0x8ad7, 0x2c78, 0x600c, 0x2060, 0x0804, 0x8ad7, 0x012e, 0x000e,
++	0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086,
++	0x0006, 0x1d30, 0x080c, 0xc0e9, 0x0c18, 0x00d6, 0x080c, 0x804b,
++	0x7003, 0x0200, 0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1, 0x0001,
++	0x2099, 0x12c3, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9, 0x0004,
++	0x4003, 0x7023, 0x0004, 0x7027, 0x7878, 0x080c, 0x8576, 0x00de,
++	0x0005, 0x080c, 0x804b, 0x7003, 0x0214, 0x7007, 0x0018, 0x700b,
++	0x0800, 0x7814, 0x9084, 0xff00, 0x700e, 0x7814, 0x9084, 0x00ff,
++	0x7022, 0x782c, 0x7026, 0x60c3, 0x0018, 0x080c, 0x8576, 0x0005,
++	0x00d6, 0x0016, 0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, 0xaf4e,
++	0x00de, 0x1904, 0x8bfe, 0x080c, 0x7fd5, 0x7003, 0x1300, 0x782c,
++	0x2068, 0x6820, 0x9086, 0x0003, 0x0570, 0x7810, 0x9080, 0x0028,
++	0x2014, 0x2001, 0x1136, 0x2004, 0xd0ac, 0x11d0, 0x9286, 0x007e,
++	0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x04a8, 0x9286, 0x007f,
++	0x1128, 0x700b, 0x00ff, 0x700f, 0xfffd, 0x0468, 0xd2bc, 0x0180,
++	0x9286, 0x0080, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffc, 0x0418,
++	0x92e8, 0x1000, 0x2d6c, 0x6810, 0x700a, 0x6814, 0x700e, 0x00d8,
++	0x6098, 0x700e, 0x00c0, 0x2001, 0x1136, 0x2004, 0xd0ac, 0x1138,
++	0x7810, 0x9080, 0x0028, 0x2004, 0x9082, 0x007e, 0x0250, 0x00d6,
++	0x2069, 0x111d, 0x2d04, 0x700a, 0x8d68, 0x2d04, 0x700e, 0x00de,
++	0x0010, 0x6034, 0x700e, 0x7838, 0x7012, 0x783c, 0x7016, 0x60c3,
++	0x000c, 0x001e, 0x00de, 0x080c, 0x8576, 0x0005, 0x781b, 0x0001,
++	0x7803, 0x0006, 0x001e, 0x00de, 0x0005, 0x792c, 0x9180, 0x0008,
++	0x200c, 0x9186, 0x0006, 0x01b0, 0x9186, 0x0003, 0x0904, 0x8c75,
++	0x9186, 0x0005, 0x0904, 0x8c5e, 0x9186, 0x0004, 0x05c8, 0x9186,
++	0x0008, 0x0904, 0x8c66, 0x7807, 0x0037, 0x7817, 0x1700, 0x080c,
++	0x8cda, 0x0005, 0x080c, 0x8c9a, 0x00d6, 0x0026, 0x792c, 0x2168,
++	0x2009, 0x4000, 0x6800, 0x0002, 0x8c3f, 0x8c4a, 0x8c41, 0x8c4a,
++	0x8c46, 0x8c3f, 0x8c3f, 0x8c4a, 0x8c4a, 0x8c4a, 0x8c4a, 0x8c3f,
++	0x8c3f, 0x8c3f, 0x8c3f, 0x8c3f, 0x8c4a, 0x8c3f, 0x8c4a, 0x080c,
++	0x0d7e, 0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0x900e, 0x0010,
++	0x2009, 0x2000, 0x682c, 0x7022, 0x6830, 0x7026, 0x0804, 0x8c92,
++	0x080c, 0x8c9a, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000,
++	0x6a00, 0x9286, 0x0002, 0x1108, 0x900e, 0x04a0, 0x04d9, 0x00d6,
++	0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x0460, 0x0499, 0x00d6,
++	0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x9286, 0x0005, 0x0118,
++	0x9286, 0x0002, 0x1108, 0x900e, 0x00e8, 0x0421, 0x00d6, 0x0026,
++	0x792c, 0x2168, 0x6814, 0x2068, 0x69ac, 0x6834, 0x9112, 0x69b0,
++	0x6838, 0x9103, 0x7022, 0x7226, 0x792c, 0x9180, 0x0000, 0x2004,
++	0x908e, 0x0002, 0x0130, 0x908e, 0x0004, 0x0118, 0x2009, 0x4000,
++	0x0008, 0x900e, 0x712a, 0x60c3, 0x0018, 0x002e, 0x00de, 0x080c,
++	0x8576, 0x0005, 0x0036, 0x0046, 0x0056, 0x0066, 0x080c, 0x804b,
++	0x9006, 0x7003, 0x0200, 0x7938, 0x710a, 0x793c, 0x710e, 0x7810,
++	0x9080, 0x0028, 0x2004, 0x2011, 0x1136, 0x2214, 0xd2ac, 0x1118,
++	0x9092, 0x007e, 0x0268, 0x00d6, 0x2069, 0x111d, 0x2d2c, 0x8d68,
++	0x2d34, 0x90e8, 0x1000, 0x2d6c, 0x6b10, 0x6c14, 0x00de, 0x0028,
++	0x901e, 0x6498, 0x2029, 0x0000, 0x6634, 0x782c, 0x9080, 0x0008,
++	0x2004, 0x9086, 0x0003, 0x1128, 0x7512, 0x7616, 0x731a, 0x741e,
++	0x0020, 0x7312, 0x7416, 0x751a, 0x761e, 0x006e, 0x005e, 0x004e,
++	0x003e, 0x0005, 0x080c, 0x804b, 0x7003, 0x0100, 0x700b, 0x0009,
++	0x7814, 0x700e, 0x60c3, 0x0008, 0x080c, 0x8576, 0x0005, 0x080c,
++	0x7fcc, 0x7003, 0x1400, 0x7838, 0x700a, 0x783c, 0x700e, 0x782c,
++	0x7012, 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, 0x701a,
++	0x60c3, 0x0010, 0x080c, 0x8576, 0x0005, 0x080c, 0x8042, 0x7003,
++	0x0100, 0x782c, 0x700a, 0x7814, 0x700e, 0x60c3, 0x0008, 0x080c,
++	0x8576, 0x0005, 0x0029, 0x60c3, 0x0000, 0x080c, 0x8576, 0x0005,
++	0x00d6, 0x080c, 0x8dc3, 0x7810, 0x2068, 0x6810, 0x9085, 0x0300,
++	0x7002, 0x6814, 0x7006, 0x68a0, 0x2069, 0x1100, 0x6ad8, 0xd2ac,
++	0x1110, 0xd0bc, 0x0188, 0x6874, 0x700a, 0x6878, 0x700e, 0x7013,
++	0x0819, 0x080c, 0x8565, 0x721a, 0x2f10, 0x7222, 0x7a08, 0x7226,
++	0x2071, 0x024c, 0x00de, 0x0005, 0x6234, 0x720e, 0x0c80, 0x0059,
++	0x7914, 0x712a, 0x60c3, 0x0000, 0x60a7, 0x9575, 0x080c, 0x8599,
++	0x080c, 0x7268, 0x0005, 0x0036, 0x00d6, 0x00e6, 0x7858, 0x2068,
++	0x9df0, 0x001b, 0x7210, 0x9296, 0x00c0, 0x9294, 0xfffd, 0x7212,
++	0x7214, 0x9294, 0x0300, 0x7216, 0x7100, 0x9194, 0x00ff, 0x7308,
++	0x9384, 0x00ff, 0x908d, 0xc200, 0x7102, 0x9384, 0xff00, 0x9215,
++	0x720a, 0x7004, 0x720c, 0x700e, 0x7206, 0x00d6, 0x2069, 0x0200,
++	0x080c, 0x8dc3, 0x00de, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9,
++	0x000a, 0x20e1, 0x0001, 0x2e98, 0x4003, 0x60a3, 0x0035, 0x6a68,
++	0x9294, 0x7000, 0x9286, 0x3000, 0x0110, 0x60a3, 0x0037, 0x00ee,
++	0x00de, 0x003e, 0x0005, 0x900e, 0x7814, 0x9080, 0x001f, 0x2004,
++	0xd0fc, 0x01d8, 0x9084, 0x0003, 0x11c0, 0x2001, 0x110c, 0x2004,
++	0xd0bc, 0x0198, 0x7824, 0xd0cc, 0x1180, 0xd0c4, 0x1170, 0x7814,
++	0x9080, 0x002a, 0x2004, 0x9005, 0x1140, 0x2001, 0x110c, 0x200c,
++	0xc1d5, 0x2102, 0x2009, 0x12e9, 0x210c, 0x918d, 0x0092, 0x0010,
++	0x2009, 0x0096, 0x60ab, 0x0036, 0x6116, 0x0005, 0x2009, 0x0009,
++	0x00a0, 0x2009, 0x000a, 0x0088, 0x2009, 0x000b, 0x0070, 0x2009,
++	0x000c, 0x0058, 0x2009, 0x000d, 0x0040, 0x2009, 0x000e, 0x0028,
++	0x2009, 0x000f, 0x0010, 0x2009, 0x0008, 0x6912, 0x0005, 0x00d6,
++	0x9290, 0x0018, 0x8214, 0x20e9, 0x0000, 0x2069, 0x0200, 0x6813,
++	0x0000, 0x22a8, 0x9284, 0x00e0, 0x0128, 0x20a9, 0x0020, 0x9292,
++	0x0020, 0x0008, 0x9016, 0x20a1, 0x0240, 0x9006, 0x4004, 0x82ff,
++	0x0120, 0x6810, 0x8000, 0x6812, 0x0c60, 0x00de, 0x0005, 0x00d6,
++	0x0156, 0x080c, 0x804b, 0x7a14, 0x82ff, 0x0138, 0x7003, 0x0100,
++	0x700b, 0x0003, 0x60c3, 0x0008, 0x0490, 0x7003, 0x0200, 0x7007,
++	0x0000, 0x2069, 0x1100, 0x901e, 0x6800, 0x9086, 0x0004, 0x1110,
++	0xc38d, 0x0060, 0x080c, 0x62e4, 0x1110, 0xc3ad, 0x0008, 0xc3a5,
++	0x6ad8, 0xd29c, 0x1110, 0xd2ac, 0x0108, 0xc39d, 0x730e, 0x2011,
++	0x1148, 0x63f0, 0x2312, 0x20a9, 0x0006, 0x2011, 0x1140, 0x2019,
++	0x1141, 0x2071, 0x0250, 0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398,
++	0x0002, 0x9290, 0x0002, 0x1f04, 0x8e1b, 0x60c3, 0x0040, 0x080c,
++	0x8576, 0x015e, 0x00de, 0x0005, 0x0156, 0x080c, 0x804b, 0x7a14,
++	0x82ff, 0x0168, 0x9286, 0xffff, 0x0118, 0x9282, 0x000e, 0x1238,
++	0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x04b8, 0x7003,
++	0x0200, 0x7007, 0x001c, 0x700f, 0x0001, 0x2011, 0x12f4, 0x2204,
++	0x8007, 0x701a, 0x8210, 0x2204, 0x8007, 0x701e, 0x2001, 0x1136,
++	0x2004, 0xd0ac, 0x1138, 0x7810, 0x9080, 0x0028, 0x2004, 0x9082,
++	0x007f, 0x0248, 0x2001, 0x111d, 0x2004, 0x7022, 0x2001, 0x111e,
++	0x2004, 0x7026, 0x0030, 0x2001, 0x1116, 0x2004, 0x9084, 0x00ff,
++	0x7026, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1105, 0x20e9,
++	0x0000, 0x20a1, 0x0256, 0x4003, 0x60c3, 0x001c, 0x080c, 0x8576,
++	0x015e, 0x0005, 0x2061, 0x15c0, 0x2071, 0x1100, 0x706c, 0x704e,
++	0x7053, 0x15c0, 0x0005, 0x00e6, 0x0126, 0x2071, 0x1100, 0x2091,
++	0x8000, 0x754c, 0x9582, 0x0010, 0x0608, 0x7050, 0x2060, 0x6000,
++	0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7060, 0x9c02, 0x1208,
++	0x0cb0, 0x2061, 0x15c0, 0x0c98, 0x6003, 0x0008, 0x8529, 0x754e,
++	0x9ca8, 0x0018, 0x7060, 0x9502, 0x1230, 0x7552, 0x9085, 0x0001,
++	0x012e, 0x00ee, 0x0005, 0x7053, 0x15c0, 0x0cc0, 0x9006, 0x0cc0,
++	0x00e6, 0x2071, 0x1100, 0x754c, 0x9582, 0x0010, 0x0600, 0x7050,
++	0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7060,
++	0x9c02, 0x1208, 0x0cb0, 0x2061, 0x15c0, 0x0c98, 0x6003, 0x0008,
++	0x8529, 0x754e, 0x9ca8, 0x0018, 0x7060, 0x9502, 0x1228, 0x7552,
++	0x9085, 0x0001, 0x00ee, 0x0005, 0x7053, 0x15c0, 0x0cc8, 0x9006,
++	0x0cc8, 0x9c82, 0x15c0, 0x0a0c, 0x0d7e, 0x2001, 0x1118, 0x2004,
++	0x9c02, 0x1a0c, 0x0d7e, 0x9006, 0x6006, 0x600a, 0x600e, 0x6016,
++	0x601a, 0x6012, 0x6023, 0x0000, 0x6003, 0x0000, 0x601e, 0x6056,
++	0x605a, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036, 0x603a, 0x603e,
++	0x6042, 0x2061, 0x1100, 0x604c, 0x8000, 0x604e, 0x9086, 0x0001,
++	0x0108, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x7aa4, 0x012e,
++	0x0cc0, 0x0006, 0x6000, 0x9086, 0x0000, 0x01b0, 0x601c, 0xd084,
++	0x190c, 0x1509, 0x6017, 0x0000, 0x6023, 0x0007, 0x2001, 0x12c0,
++	0x2004, 0x0006, 0x9082, 0x0051, 0x000e, 0x0208, 0x8004, 0x601a,
++	0x080c, 0xc381, 0x6043, 0x0000, 0x000e, 0x0005, 0x00e6, 0x0126,
++	0x2071, 0x1100, 0x2091, 0x8000, 0x754c, 0x9582, 0x0001, 0x0608,
++	0x7050, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018,
++	0x7060, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x15c0, 0x0c98, 0x6003,
++	0x0008, 0x8529, 0x754e, 0x9ca8, 0x0018, 0x7060, 0x9502, 0x1230,
++	0x7552, 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x7053, 0x15c0,
++	0x0cc0, 0x9006, 0x0cc0, 0x6020, 0x9084, 0x000f, 0x0002, 0x8f66,
++	0x8f75, 0x8f90, 0x8fab, 0xaf90, 0xafab, 0xafc6, 0x8f66, 0x8f75,
++	0x8f66, 0x8fc7, 0x8f66, 0x8f66, 0x8f66, 0x8f66, 0x9186, 0x0013,
++	0x1128, 0x080c, 0x79ab, 0x080c, 0x7aa4, 0x0005, 0x9186, 0x0047,
++	0x1118, 0x9016, 0x080c, 0x137c, 0x0005, 0x0066, 0x6000, 0x90b2,
++	0x0016, 0x1a0c, 0x0d7e, 0x0013, 0x006e, 0x0005, 0x8f8e, 0x9655,
++	0x9815, 0x8f8e, 0x98a2, 0x9248, 0x8f8e, 0x8f8e, 0x95e1, 0x9d9e,
++	0x8f8e, 0x8f8e, 0x8f8e, 0x8f8e, 0x8f8e, 0x8f8e, 0x080c, 0x0d7e,
++	0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d7e, 0x0013, 0x006e,
++	0x0005, 0x8fa9, 0xa3c8, 0x8fa9, 0x8fa9, 0x8fa9, 0x8fa9, 0x8fa9,
++	0x8fa9, 0xa36e, 0xa544, 0x8fa9, 0xa3fb, 0xa478, 0xa3fb, 0xa478,
++	0x8fa9, 0x080c, 0x0d7e, 0x6000, 0x9082, 0x0016, 0x1a0c, 0x0d7e,
++	0x6000, 0x0002, 0x8fc5, 0x9ddf, 0x9eaf, 0x9fd9, 0xa13a, 0x8fc5,
++	0x8fc5, 0x8fc5, 0x9db9, 0xa31e, 0xa321, 0x8fc5, 0x8fc5, 0x8fc5,
++	0x8fc5, 0xa34b, 0x8fc5, 0x8fc5, 0x8fc5, 0x080c, 0x0d7e, 0x0066,
++	0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d7e, 0x0013, 0x006e, 0x0005,
++	0x8fe0, 0x8fe0, 0x901f, 0x90ad, 0x910e, 0x8fe0, 0x8fe0, 0x8fe0,
++	0x8fe2, 0x8fe0, 0x8fe0, 0x8fe0, 0x8fe0, 0x8fe0, 0x8fe0, 0x8fe0,
++	0x080c, 0x0d7e, 0x9186, 0x004c, 0x0588, 0x9186, 0x0003, 0x190c,
++	0x0d7e, 0x00d6, 0x601c, 0xc0ed, 0x601e, 0x6003, 0x0003, 0x6106,
++	0x6014, 0x2068, 0x687c, 0x9084, 0x8000, 0xc0b5, 0x687e, 0x68ac,
++	0x6846, 0x68b0, 0x684a, 0x9006, 0x6836, 0x683a, 0x6884, 0x9092,
++	0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x8013, 0x8213, 0x9210,
++	0x621a, 0x00de, 0x2c10, 0x080c, 0x1605, 0x080c, 0x75db, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x7b72, 0x012e, 0x0005, 0x6010, 0x9080,
++	0x0028, 0x2024, 0x8427, 0x2c00, 0x080c, 0x912f, 0x0005, 0x00d6,
++	0x00f6, 0x2079, 0x1100, 0x7a88, 0x9290, 0x0018, 0x6014, 0x2068,
++	0x6c78, 0x0046, 0x68e0, 0x9005, 0x1140, 0x68dc, 0x921a, 0x0140,
++	0x0220, 0x687b, 0x0007, 0x2010, 0x0028, 0x687b, 0x0015, 0x0010,
++	0x687b, 0x0000, 0x8214, 0x6883, 0x0000, 0x6a02, 0x0006, 0x0016,
++	0x0026, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2400, 0x9005, 0x1108,
++	0x009a, 0x2100, 0x9086, 0x0015, 0x1118, 0x2001, 0x0001, 0x0038,
++	0x2100, 0x9086, 0x0016, 0x0118, 0x2001, 0x0001, 0x002a, 0x94a4,
++	0x0007, 0x8423, 0x9405, 0x0002, 0x907e, 0x907e, 0x9079, 0x907c,
++	0x907e, 0x9076, 0x906c, 0x906c, 0x906c, 0x906c, 0x906c, 0x906c,
++	0x906c, 0x906c, 0x906c, 0x906c, 0x00fe, 0x00ee, 0x00de, 0x00ce,
++	0x002e, 0x001e, 0x000e, 0x000e, 0x080c, 0x0d7e, 0x080c, 0x9a2c,
++	0x0028, 0x080c, 0x9b03, 0x0010, 0x080c, 0x9bfa, 0x00fe, 0x00ee,
++	0x00de, 0x00ce, 0x002e, 0x001e, 0x2c00, 0x6896, 0x000e, 0x080c,
++	0x91df, 0x01e8, 0x6804, 0x680e, 0x200c, 0x9080, 0x0002, 0x6acc,
++	0x6bd0, 0x6cd4, 0x6dd8, 0x2039, 0x0001, 0x2031, 0x0000, 0x2041,
++	0x1091, 0x080c, 0x9367, 0x0158, 0x000e, 0x9005, 0x0118, 0x00fe,
++	0x00de, 0x0005, 0x00fe, 0x00de, 0x080c, 0x8ed9, 0x0005, 0x2001,
++	0x002c, 0x900e, 0x080c, 0x923d, 0x0c78, 0x9182, 0x0047, 0x0002,
++	0x90b9, 0x90b9, 0x90bb, 0x90e8, 0x90b9, 0x90b9, 0x90b9, 0x90b9,
++	0x90fa, 0x080c, 0x0d7e, 0x00d6, 0x0016, 0x080c, 0x7a55, 0x080c,
++	0x7b72, 0x6003, 0x0004, 0x6114, 0x2168, 0x687c, 0xd0fc, 0x0188,
++	0x6878, 0x9005, 0x1158, 0x6894, 0x9005, 0x0140, 0x2001, 0x0000,
++	0x900e, 0x080c, 0x923d, 0x080c, 0x8ed9, 0x0078, 0x6003, 0x0002,
++	0x0060, 0x687f, 0x0020, 0x688c, 0x688a, 0x68a4, 0x68ae, 0x68a8,
++	0x68b2, 0x68c7, 0x0000, 0x68cb, 0x0000, 0x001e, 0x00de, 0x0005,
++	0x080c, 0x7a55, 0x00d6, 0x6114, 0x2168, 0x080c, 0xa942, 0x0120,
++	0x687b, 0x0006, 0x080c, 0x5b76, 0x00de, 0x080c, 0x8ed9, 0x080c,
++	0x7b72, 0x0005, 0x080c, 0x7a55, 0x080c, 0x2862, 0x00d6, 0x6114,
++	0x2168, 0x080c, 0xa942, 0x0120, 0x687b, 0x0029, 0x080c, 0x5b76,
++	0x00de, 0x080c, 0x8ed9, 0x080c, 0x7b72, 0x0005, 0x9182, 0x0047,
++	0x0002, 0x911e, 0x9120, 0x911e, 0x911e, 0x911e, 0x911e, 0x911e,
++	0x911e, 0x911e, 0x911e, 0x911e, 0x911e, 0x9120, 0x080c, 0x0d7e,
++	0x00d6, 0x080c, 0x1303, 0x6114, 0x2168, 0x687b, 0x0000, 0x6883,
++	0x0000, 0x080c, 0x5b76, 0x00de, 0x080c, 0x8ed9, 0x0005, 0x0026,
++	0x0036, 0x0056, 0x0066, 0x00d6, 0x00f6, 0x0006, 0x080c, 0x0eb6,
++	0x000e, 0x090c, 0x0d7e, 0x20e9, 0x0001, 0x9d88, 0x0019, 0x21a0,
++	0x900e, 0x20a9, 0x0020, 0x4104, 0x687a, 0x2079, 0x1100, 0x7988,
++	0x9188, 0x0018, 0x918c, 0x0fff, 0x6972, 0x6c76, 0x2d78, 0x00f6,
++	0x2001, 0x0205, 0x2003, 0x0000, 0x901e, 0x2029, 0x0001, 0x9182,
++	0x0034, 0x1228, 0x9f90, 0x001f, 0x080c, 0xa5c9, 0x04c0, 0x2130,
++	0x2009, 0x0034, 0x9f90, 0x001f, 0x080c, 0xa5c9, 0x96b2, 0x0034,
++	0x7804, 0x906d, 0x0110, 0x080c, 0x0edf, 0x080c, 0x0eb6, 0x01d0,
++	0x8528, 0x6867, 0x0110, 0x686b, 0x0000, 0x2d20, 0x7c06, 0x968a,
++	0x003d, 0x1230, 0x2608, 0x9d90, 0x001b, 0x080c, 0xa5c9, 0x00b8,
++	0x96b2, 0x003c, 0x2009, 0x003c, 0x2d78, 0x9d90, 0x001b, 0x080c,
++	0xa5c9, 0x0c18, 0x2079, 0x0200, 0x7817, 0x0000, 0x00fe, 0x852f,
++	0x95ad, 0x0050, 0x7d66, 0x7870, 0xc0fd, 0x7872, 0x0048, 0x2079,
++	0x0200, 0x7817, 0x0000, 0x00fe, 0x852f, 0x95ad, 0x0050, 0x7d66,
++	0x2f68, 0x6804, 0x6807, 0x0000, 0x0006, 0x080c, 0x5b76, 0x000e,
++	0x2068, 0x9005, 0x1db0, 0x00fe, 0x00de, 0x006e, 0x005e, 0x003e,
++	0x002e, 0x0005, 0x00d6, 0x00f6, 0x0006, 0x080c, 0x0eb6, 0x000e,
++	0x090c, 0x0d7e, 0x20e9, 0x0001, 0x9d88, 0x0019, 0x21a0, 0x900e,
++	0x20a9, 0x0020, 0x4104, 0x6a66, 0x687a, 0x2079, 0x1100, 0x7988,
++	0x810c, 0x9188, 0x000c, 0x9182, 0x001a, 0x0210, 0x2009, 0x001a,
++	0x21a8, 0x810b, 0x6972, 0x6c76, 0x2e98, 0x9d80, 0x001f, 0x20a0,
++	0x080c, 0x504f, 0x080c, 0x5b76, 0x00fe, 0x00de, 0x0005, 0x0016,
++	0x00d6, 0x00f6, 0x2079, 0x0200, 0x2e98, 0x2021, 0x003e, 0x901e,
++	0x9282, 0x0020, 0x0218, 0x2011, 0x0020, 0x2018, 0x9486, 0x003e,
++	0x1168, 0x00d6, 0x080c, 0x0e9d, 0x2d00, 0x00de, 0x05f0, 0x6806,
++	0x2068, 0x20e9, 0x0001, 0x9080, 0x0002, 0x20a0, 0x3300, 0x908e,
++	0x0260, 0x0140, 0x2009, 0x0280, 0x9102, 0x920a, 0x0218, 0x2010,
++	0x2100, 0x9318, 0x2200, 0x9402, 0x1220, 0x2410, 0x9006, 0x9398,
++	0x0002, 0x2020, 0x22a8, 0x6800, 0x9200, 0x6802, 0x0016, 0x0026,
++	0x3410, 0x3308, 0x2104, 0x8007, 0x2012, 0x8108, 0x8210, 0x1f04,
++	0x921a, 0x22a0, 0x2198, 0x002e, 0x001e, 0x83ff, 0x0170, 0x3300,
++	0x9086, 0x0280, 0x1120, 0x7814, 0x8000, 0x7816, 0x2e98, 0x2310,
++	0x84ff, 0x0904, 0x91e5, 0x0804, 0x91e7, 0x9085, 0x0001, 0x7817,
++	0x0000, 0x00fe, 0x00de, 0x001e, 0x0005, 0x00d6, 0x0036, 0x6314,
++	0x2368, 0x687a, 0x6982, 0x080c, 0x5b76, 0x003e, 0x00de, 0x0005,
++	0x91b6, 0x0015, 0x1118, 0x080c, 0x8ed9, 0x0030, 0x91b6, 0x0016,
++	0x190c, 0x0d7e, 0x080c, 0x8ed9, 0x0005, 0x20a9, 0x000e, 0x20e1,
++	0x0000, 0x2e98, 0x6014, 0x20e9, 0x0001, 0x20a0, 0x4003, 0x9080,
++	0x001b, 0x2020, 0x20a9, 0x0006, 0x3310, 0x9298, 0x0001, 0x94a8,
++	0x0001, 0x222e, 0x2326, 0x9290, 0x0002, 0x95a8, 0x0002, 0x9398,
++	0x0002, 0x94a0, 0x0002, 0x1f04, 0x9269, 0x00e6, 0x080c, 0xa942,
++	0x0130, 0x6014, 0x2070, 0x7007, 0x0000, 0x7067, 0x0103, 0x00ee,
++	0x080c, 0x8ed9, 0x0005, 0x00d6, 0x0036, 0x7330, 0x9386, 0x0200,
++	0x1130, 0x6010, 0x2068, 0x6813, 0x00ff, 0x6817, 0xfffd, 0x6014,
++	0x9005, 0x0130, 0x2068, 0x6807, 0x0000, 0x6867, 0x0103, 0x6b32,
++	0x080c, 0x8ed9, 0x003e, 0x00de, 0x0005, 0x0016, 0x20a9, 0x0014,
++	0x9e80, 0x000c, 0x20e1, 0x0000, 0x2098, 0x6014, 0x9080, 0x0002,
++	0x20e9, 0x0001, 0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0001,
++	0x2099, 0x0260, 0x20a9, 0x0016, 0x4003, 0x20a9, 0x000a, 0x6014,
++	0x9080, 0x0001, 0x2004, 0x9080, 0x0002, 0x20a0, 0x4003, 0x2001,
++	0x0205, 0x2003, 0x0002, 0x2099, 0x0260, 0x20a9, 0x0020, 0x4003,
++	0x2003, 0x0000, 0x00e6, 0x6014, 0x2004, 0x2070, 0x7067, 0x0103,
++	0x00ee, 0x080c, 0x8ed9, 0x001e, 0x0005, 0x0016, 0x900e, 0x7030,
++	0x9086, 0x0100, 0x0140, 0x7038, 0x9084, 0x00ff, 0x800c, 0x703c,
++	0x9084, 0x00ff, 0x8004, 0x9080, 0x0004, 0x9108, 0x9192, 0x0014,
++	0x1218, 0x2011, 0x0000, 0x0010, 0x2009, 0x0014, 0x21a8, 0x9e80,
++	0x000c, 0x2098, 0x6014, 0x9080, 0x0002, 0x20a0, 0x080c, 0x504f,
++	0x82ff, 0x0170, 0x2009, 0x0205, 0x2104, 0x8000, 0x200a, 0x2e00,
++	0x2098, 0x3400, 0x9080, 0x0014, 0x20a0, 0x22a8, 0x080c, 0x504f,
++	0x00e6, 0x080c, 0xa942, 0x0140, 0x6014, 0x2070, 0x7007, 0x0000,
++	0x7064, 0x70e2, 0x7067, 0x0103, 0x00ee, 0x080c, 0x8ed9, 0x001e,
++	0x0005, 0x0016, 0x00d6, 0x7030, 0x9086, 0x0100, 0x1118, 0x2009,
++	0x0004, 0x0010, 0x7034, 0x800c, 0x21a8, 0x9e80, 0x000c, 0x2098,
++	0x6014, 0x2068, 0x6804, 0x9005, 0x1108, 0x2d00, 0x9080, 0x000c,
++	0x20a0, 0x080c, 0x504f, 0x080c, 0xa942, 0x0148, 0x6804, 0x9005,
++	0x1158, 0x6807, 0x0000, 0x6864, 0x68e2, 0x6867, 0x0103, 0x080c,
++	0x8ed9, 0x00de, 0x001e, 0x0005, 0x00e6, 0x2070, 0x7030, 0x8007,
++	0x9086, 0x0100, 0x1118, 0x080c, 0x97dc, 0x00b8, 0x7034, 0x8007,
++	0x800c, 0x9e80, 0x000c, 0x687b, 0x0000, 0x6883, 0x0000, 0x6897,
++	0x4000, 0x6aa0, 0x6b9c, 0x6ca8, 0x6da4, 0x2031, 0x0000, 0x2039,
++	0x0001, 0x2041, 0x1078, 0x0019, 0x0d30, 0x00ee, 0x08c0, 0x00d6,
++	0x0006, 0x080c, 0x0e9d, 0x000e, 0x0190, 0x6812, 0x000e, 0x683e,
++	0x0006, 0x6e06, 0x2800, 0x683a, 0x6916, 0x6f0e, 0x6a2a, 0x6b2e,
++	0x6c32, 0x6d36, 0x2d10, 0x080c, 0x0f22, 0x9085, 0x0001, 0x00de,
++	0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210,
++	0x9290, 0x0004, 0x2214, 0x9206, 0x1518, 0x700c, 0x6210, 0x9290,
++	0x0005, 0x2214, 0x9206, 0x11e0, 0x6043, 0x0000, 0x2c68, 0x0016,
++	0x2009, 0x0035, 0x080c, 0xaf4e, 0x001e, 0x1158, 0x622c, 0x2268,
++	0x2071, 0x026c, 0x6b20, 0x9386, 0x0003, 0x0130, 0x9386, 0x0006,
++	0x0128, 0x080c, 0x8ed9, 0x0020, 0x0039, 0x0010, 0x080c, 0x946d,
++	0x002e, 0x00de, 0x00ee, 0x0005, 0x00f6, 0x6814, 0x2078, 0x9186,
++	0x0015, 0x0904, 0x9454, 0x918e, 0x0016, 0x1904, 0x946b, 0x700c,
++	0x908c, 0xff00, 0x9186, 0x1700, 0x0120, 0x9186, 0x0300, 0x1904,
++	0x9433, 0x8fff, 0x1138, 0x6800, 0x9086, 0x000f, 0x0904, 0x9417,
++	0x0804, 0x9469, 0x6808, 0x9086, 0xffff, 0x1904, 0x9456, 0x787c,
++	0x9084, 0x0060, 0x9086, 0x0020, 0x1128, 0x783c, 0x7940, 0x9105,
++	0x1904, 0x9456, 0x080c, 0xab11, 0x685c, 0x7882, 0x787c, 0xc0dc,
++	0xc0f4, 0xc0d4, 0x787e, 0x0026, 0x900e, 0x6a18, 0x2001, 0x000a,
++	0x080c, 0x73f0, 0x7884, 0x920a, 0x0208, 0x8011, 0x7a86, 0x82ff,
++	0x002e, 0x1138, 0x00c6, 0x2d60, 0x080c, 0xa6d9, 0x00ce, 0x0804,
++	0x9469, 0x00c6, 0x00d6, 0x2f68, 0x6868, 0xd0fc, 0x1118, 0x080c,
++	0x5151, 0x0010, 0x080c, 0x54d0, 0x00de, 0x00ce, 0x1904, 0x9456,
++	0x00c6, 0x2d60, 0x080c, 0x8ed9, 0x00ce, 0x0804, 0x9469, 0x00c6,
++	0x080c, 0x8f26, 0x0190, 0x6017, 0x0000, 0x6810, 0x6012, 0x080c,
++	0xad70, 0x6023, 0x0003, 0x6904, 0x00c6, 0x2d60, 0x080c, 0x8ed9,
++	0x00ce, 0x080c, 0x8f53, 0x00ce, 0x04e0, 0x2001, 0x12c2, 0x2004,
++	0x6842, 0x00ce, 0x04b0, 0x7008, 0x9086, 0x000b, 0x11a0, 0x6010,
++	0x200c, 0xc1bc, 0x2102, 0x00c6, 0x2d60, 0x7883, 0x0003, 0x6007,
++	0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x756e, 0x080c,
++	0x7aa4, 0x00ce, 0x00f0, 0x700c, 0x9086, 0x2a00, 0x1138, 0x2001,
++	0x12c2, 0x2004, 0x6842, 0x00a8, 0x0481, 0x00a8, 0x8fff, 0x090c,
++	0x0d7e, 0x00c6, 0x00d6, 0x2d60, 0x2f68, 0x6867, 0x0103, 0x687b,
++	0x0003, 0x080c, 0xa5b9, 0x080c, 0xab11, 0x080c, 0x8f09, 0x00de,
++	0x00ce, 0x080c, 0x8ed9, 0x00fe, 0x0005, 0x9186, 0x0015, 0x1128,
++	0x2001, 0x12c2, 0x2004, 0x6842, 0x0068, 0x918e, 0x0016, 0x1160,
++	0x00c6, 0x2d00, 0x2060, 0x080c, 0xc381, 0x080c, 0x7384, 0x080c,
++	0x8ed9, 0x00ce, 0x080c, 0x8ed9, 0x0005, 0x0026, 0x0036, 0x0046,
++	0x7228, 0x7cb0, 0x7bac, 0xd2f4, 0x0130, 0x2001, 0x12c2, 0x2004,
++	0x6842, 0x0804, 0x94e9, 0x00c6, 0x2d60, 0x080c, 0xa5e6, 0x00ce,
++	0x6804, 0x9086, 0x0050, 0x1170, 0x00c6, 0x2d00, 0x2060, 0x6003,
++	0x0001, 0x6007, 0x0050, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x00ce,
++	0x0804, 0x94e9, 0x6800, 0x9086, 0x000f, 0x01c8, 0x8fff, 0x090c,
++	0x0d7e, 0x6824, 0xd0dc, 0x1198, 0x6800, 0x9086, 0x0004, 0x1198,
++	0x787c, 0xd0ac, 0x0180, 0x7843, 0x0fff, 0x783f, 0x0fff, 0x7880,
++	0xc0f4, 0xc0fc, 0x7882, 0x2001, 0x0001, 0x6832, 0x00e8, 0x2001,
++	0x0007, 0x6832, 0x00c8, 0x787c, 0xd0b4, 0x1138, 0xd0ac, 0x0db8,
++	0x7838, 0x7934, 0x9105, 0x0d98, 0x0c30, 0xd2ec, 0x1d80, 0x7024,
++	0x9306, 0x1118, 0x7020, 0x9406, 0x0d50, 0x7020, 0x683e, 0x7024,
++	0x683a, 0x2001, 0x0005, 0x6832, 0x080c, 0xac68, 0x080c, 0x7aa4,
++	0x0010, 0x080c, 0x8ed9, 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6,
++	0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x9290, 0x0004,
++	0x2214, 0x9206, 0x1904, 0x9561, 0x700c, 0x6210, 0x9290, 0x0005,
++	0x2214, 0x9206, 0x1904, 0x9561, 0x6038, 0x2068, 0x6a20, 0x9286,
++	0x0007, 0x0904, 0x955f, 0x9286, 0x0002, 0x0904, 0x955f, 0x9286,
++	0x0000, 0x0904, 0x955f, 0x6808, 0x633c, 0x9306, 0x1904, 0x955f,
++	0x2071, 0x026c, 0x9186, 0x0015, 0x05e0, 0x918e, 0x0016, 0x1190,
++	0x6034, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1160, 0x700c, 0x9086,
++	0x2a00, 0x1140, 0x6038, 0x9080, 0x0009, 0x200c, 0xc1dd, 0xc1f5,
++	0x2102, 0x0438, 0x00c6, 0x6038, 0x2060, 0x6104, 0x9186, 0x004b,
++	0x01a0, 0x9186, 0x004c, 0x0188, 0x9186, 0x004d, 0x0170, 0x9186,
++	0x004e, 0x0158, 0x9186, 0x0052, 0x0140, 0x6014, 0x2068, 0x080c,
++	0xa942, 0x090c, 0x0d7e, 0x6883, 0x0003, 0x6007, 0x0085, 0x6003,
++	0x000b, 0x6023, 0x0002, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x00ce,
++	0x0030, 0x6038, 0x2070, 0x2001, 0x12c2, 0x2004, 0x7042, 0x080c,
++	0x8ed9, 0x002e, 0x00de, 0x00ee, 0x0005, 0x00d6, 0x00f6, 0x6014,
++	0x2068, 0x6010, 0x2078, 0x91b6, 0x0015, 0x0130, 0x7a08, 0x7b0c,
++	0x7c00, 0xc48c, 0x7c02, 0x0448, 0x0156, 0x0036, 0x0026, 0x9e90,
++	0x000c, 0x9290, 0x0004, 0x20a9, 0x0004, 0x9f98, 0x000a, 0x080c,
++	0x9d60, 0x002e, 0x003e, 0x015e, 0x15f0, 0x0156, 0x0036, 0x0026,
++	0x9e90, 0x000c, 0x9290, 0x0008, 0x20a9, 0x0004, 0x9f98, 0x0006,
++	0x080c, 0x9d60, 0x002e, 0x003e, 0x015e, 0x1568, 0x7238, 0x7a0a,
++	0x733c, 0x7b0e, 0x7c00, 0xc48d, 0x7c02, 0x6804, 0x9005, 0x1120,
++	0x00fe, 0x00de, 0x0804, 0x9275, 0x9080, 0x0002, 0x00d6, 0x2068,
++	0x6a0a, 0x6b0e, 0x6c02, 0x00de, 0x2009, 0x002b, 0x6aa0, 0x6b9c,
++	0x6ca8, 0x6da4, 0x2031, 0x0000, 0x2039, 0x0001, 0x2041, 0x1078,
++	0x080c, 0x9367, 0x0128, 0x00fe, 0x00de, 0x080c, 0x8ed9, 0x0005,
++	0x080c, 0x97dc, 0x0cc0, 0x00f6, 0x080c, 0x2862, 0x00fe, 0x00c6,
++	0x080c, 0x8e83, 0x2f00, 0x6012, 0x6017, 0x0000, 0x6023, 0x0001,
++	0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x080c, 0x5568,
++	0x080c, 0x5592, 0x080c, 0x75be, 0x080c, 0x7aa4, 0x00ce, 0x0804,
++	0x959d, 0x2100, 0x91b2, 0x0053, 0x1a0c, 0x0d7e, 0x91b2, 0x0040,
++	0x1a04, 0x963f, 0x0002, 0x962d, 0x962d, 0x962d, 0x962d, 0x962d,
++	0x962d, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b,
++	0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b,
++	0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b,
++	0x962b, 0x962b, 0x962d, 0x962b, 0x962d, 0x962d, 0x962b, 0x962b,
++	0x962b, 0x962b, 0x962b, 0x962d, 0x962b, 0x962b, 0x962b, 0x962b,
++	0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962d, 0x962d, 0x962b,
++	0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b,
++	0x962d, 0x962b, 0x962b, 0x080c, 0x0d7e, 0x6003, 0x0001, 0x6106,
++	0x9186, 0x0032, 0x0118, 0x080c, 0x75be, 0x0010, 0x080c, 0x756e,
++	0x0126, 0x2091, 0x8000, 0x080c, 0x7aa4, 0x012e, 0x0005, 0x2600,
++	0x0002, 0x9653, 0x9653, 0x9653, 0x962d, 0x962d, 0x9653, 0x9653,
++	0x9653, 0x9653, 0x962d, 0x9653, 0x962d, 0x9653, 0x962d, 0x9653,
++	0x9653, 0x9653, 0x9653, 0x080c, 0x0d7e, 0x6004, 0x90b2, 0x0053,
++	0x1a0c, 0x0d7e, 0x91b6, 0x0013, 0x0904, 0x9702, 0x91b6, 0x0027,
++	0x1904, 0x96c8, 0x080c, 0x79ab, 0x6004, 0x080c, 0xab1d, 0x0190,
++	0x080c, 0xab2e, 0x0904, 0x96c2, 0x908e, 0x0021, 0x0904, 0x96c5,
++	0x908e, 0x0022, 0x0904, 0x96c2, 0x908e, 0x003d, 0x0904, 0x96c5,
++	0x0804, 0x96bb, 0x080c, 0x2886, 0x2001, 0x0007, 0x080c, 0x5568,
++	0x6010, 0x9080, 0x0028, 0x200c, 0x080c, 0x97dc, 0x9186, 0x007e,
++	0x1148, 0x2001, 0x1136, 0x2014, 0xc285, 0x080c, 0x62e4, 0x1108,
++	0xc2ad, 0x2202, 0x0016, 0x0026, 0x0036, 0x2110, 0x0026, 0x2019,
++	0x0028, 0x080c, 0x8ac9, 0x002e, 0x080c, 0xc3d4, 0x003e, 0x002e,
++	0x001e, 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, 0x0028, 0x080c,
++	0x76f0, 0x0076, 0x903e, 0x080c, 0x75ee, 0x6010, 0x00c6, 0x9065,
++	0x0100, 0x00ce, 0x2c08, 0x080c, 0xbec2, 0x007e, 0x003e, 0x002e,
++	0x001e, 0x080c, 0x55d0, 0x080c, 0xad68, 0x080c, 0x8ed9, 0x080c,
++	0x7aa4, 0x0005, 0x080c, 0x97dc, 0x0cb0, 0x080c, 0x9809, 0x0c98,
++	0x9186, 0x0014, 0x1db0, 0x080c, 0x79ab, 0x080c, 0x2862, 0x080c,
++	0xab1d, 0x1188, 0x080c, 0x2886, 0x6010, 0x9080, 0x0028, 0x200c,
++	0x080c, 0x97dc, 0x9186, 0x007e, 0x1128, 0x2001, 0x1136, 0x200c,
++	0xc185, 0x2102, 0x08c0, 0x080c, 0xab2e, 0x1118, 0x080c, 0x97dc,
++	0x0890, 0x6004, 0x908e, 0x0032, 0x1158, 0x00e6, 0x00f6, 0x2071,
++	0x1193, 0x2079, 0x0000, 0x080c, 0x2b98, 0x00fe, 0x00ee, 0x0818,
++	0x6004, 0x908e, 0x0021, 0x0d50, 0x908e, 0x0022, 0x090c, 0x97dc,
++	0x0804, 0x96bb, 0x90b2, 0x0040, 0x1a04, 0x97c5, 0x2008, 0x0002,
++	0x974a, 0x974b, 0x974e, 0x9751, 0x9754, 0x9757, 0x9748, 0x9748,
++	0x9748, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748,
++	0x9748, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748,
++	0x9748, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748, 0x975a, 0x9769,
++	0x9748, 0x976b, 0x9769, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748,
++	0x9769, 0x9769, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748,
++	0x9748, 0x9748, 0x97a5, 0x9769, 0x9748, 0x9765, 0x9748, 0x9748,
++	0x9748, 0x9766, 0x9748, 0x9748, 0x9748, 0x9769, 0x979c, 0x9748,
++	0x080c, 0x0d7e, 0x00f0, 0x2001, 0x000b, 0x0460, 0x2001, 0x0003,
++	0x0448, 0x2001, 0x0005, 0x0430, 0x2001, 0x0001, 0x0418, 0x2001,
++	0x0009, 0x0400, 0x080c, 0x79ab, 0x6003, 0x0005, 0x2001, 0x12c2,
++	0x2004, 0x6042, 0x080c, 0x7aa4, 0x00a0, 0x0018, 0x0010, 0x080c,
++	0x5568, 0x0804, 0x97b6, 0x080c, 0x79ab, 0x2001, 0x12c0, 0x2004,
++	0x601a, 0x2001, 0x12c2, 0x2004, 0x6042, 0x6003, 0x0004, 0x080c,
++	0x7aa4, 0x0005, 0x080c, 0x5568, 0x080c, 0x79ab, 0x6003, 0x0002,
++	0x2001, 0x12c2, 0x2004, 0x6042, 0x0036, 0x2019, 0x115d, 0x2304,
++	0x9084, 0xff00, 0x1120, 0x2001, 0x12c0, 0x201c, 0x0040, 0x8007,
++	0x909a, 0x0004, 0x0ec0, 0x8003, 0x801b, 0x831b, 0x9318, 0x631a,
++	0x003e, 0x080c, 0x7aa4, 0x08e8, 0x080c, 0x79ab, 0x080c, 0xad68,
++	0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x08a0, 0x00e6, 0x00f6, 0x2071,
++	0x1193, 0x2079, 0x0000, 0x080c, 0x2b98, 0x00fe, 0x00ee, 0x080c,
++	0x79ab, 0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x0818, 0x080c, 0x79ab,
++	0x2001, 0x12c2, 0x2004, 0x6042, 0x6003, 0x0002, 0x2001, 0x12c0,
++	0x2004, 0x601a, 0x080c, 0x7aa4, 0x0005, 0x2600, 0x2008, 0x0002,
++	0x97da, 0x97da, 0x97da, 0x97b6, 0x97b6, 0x97da, 0x97da, 0x97da,
++	0x97da, 0x97b6, 0x97da, 0x97b6, 0x97da, 0x97b6, 0x97da, 0x97da,
++	0x97da, 0x97da, 0x080c, 0x0d7e, 0x00e6, 0x0026, 0x0016, 0x080c,
++	0xa942, 0x0500, 0x6014, 0x2070, 0x7064, 0x9086, 0x0139, 0x1140,
++	0x2001, 0x0030, 0x900e, 0x2011, 0x4005, 0x080c, 0xaec0, 0x0090,
++	0x7068, 0xd0fc, 0x0178, 0x7007, 0x0000, 0x0016, 0x6004, 0x908e,
++	0x0021, 0x0160, 0x908e, 0x003d, 0x0148, 0x001e, 0x7067, 0x0103,
++	0x7033, 0x0100, 0x001e, 0x002e, 0x00ee, 0x0005, 0x001e, 0x0009,
++	0x0cc8, 0x00e6, 0x9cf0, 0x0005, 0x2e74, 0x7000, 0x2070, 0x7067,
++	0x0103, 0x7023, 0x8001, 0x00ee, 0x0005, 0x00d6, 0x6610, 0x2668,
++	0x6804, 0x9084, 0x00ff, 0x00de, 0x90b2, 0x000c, 0x1a0c, 0x0d7e,
++	0x6604, 0x96b6, 0x004d, 0x1120, 0x080c, 0xadf6, 0x0804, 0x9892,
++	0x6604, 0x96b6, 0x0043, 0x1120, 0x080c, 0xae39, 0x0804, 0x9892,
++	0x6604, 0x96b6, 0x004b, 0x1120, 0x080c, 0xae66, 0x0804, 0x9892,
++	0x6604, 0x96b6, 0x0033, 0x1120, 0x080c, 0xad8b, 0x0804, 0x9892,
++	0x6604, 0x96b6, 0x0028, 0x1120, 0x080c, 0xab5e, 0x0804, 0x9892,
++	0x6604, 0x96b6, 0x0029, 0x1120, 0x080c, 0xab9a, 0x0804, 0x9892,
++	0x6604, 0x96b6, 0x001f, 0x1118, 0x080c, 0x9255, 0x04d8, 0x6604,
++	0x96b6, 0x0000, 0x1118, 0x080c, 0x9565, 0x04a0, 0x6604, 0x96b6,
++	0x0022, 0x1118, 0x080c, 0x9283, 0x0468, 0x6604, 0x96b6, 0x0035,
++	0x1118, 0x080c, 0x9381, 0x0430, 0x6604, 0x96b6, 0x0039, 0x1118,
++	0x080c, 0x94ef, 0x00f8, 0x6604, 0x96b6, 0x003d, 0x1118, 0x080c,
++	0x929d, 0x00c0, 0x6604, 0x96b6, 0x0044, 0x1118, 0x080c, 0x92d5,
++	0x0088, 0x6604, 0x96b6, 0x0049, 0x1118, 0x080c, 0x9319, 0x0050,
++	0x91b6, 0x0015, 0x1110, 0x0053, 0x0028, 0x91b6, 0x0016, 0x1118,
++	0x0804, 0x9ab5, 0x0005, 0x080c, 0x8f6e, 0x0ce0, 0x98b0, 0x98b3,
++	0x98b0, 0x98f6, 0x98b0, 0x9a2c, 0x9ac3, 0x98b0, 0x98b0, 0x9a8f,
++	0x98b0, 0x9aa5, 0x00e6, 0x080c, 0x1303, 0x9cf0, 0x0005, 0x2e74,
++	0x7000, 0x2070, 0x7067, 0x0103, 0x00ee, 0x080c, 0x8ed9, 0x0005,
++	0xa001, 0xa001, 0x0005, 0x00e6, 0x2071, 0x1100, 0x7088, 0x9086,
++	0x0074, 0x1540, 0x080c, 0xbe99, 0x11b0, 0x6010, 0x00d6, 0x2068,
++	0x7030, 0xd08c, 0x0128, 0x6800, 0xd0bc, 0x0110, 0xc0c5, 0x6802,
++	0x00e9, 0x00de, 0x2001, 0x0006, 0x080c, 0x5568, 0x080c, 0x2886,
++	0x080c, 0x8ed9, 0x0088, 0x2001, 0x000a, 0x080c, 0x5568, 0x080c,
++	0x2886, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x75be, 0x080c,
++	0x7aa4, 0x0010, 0x080c, 0x9a13, 0x00ee, 0x0005, 0x6800, 0xd084,
++	0x0160, 0x9006, 0x080c, 0x5556, 0x2069, 0x1152, 0x6804, 0xd0a4,
++	0x0120, 0x2001, 0x0006, 0x080c, 0x5592, 0x0005, 0x00d6, 0x2011,
++	0x1122, 0x2204, 0x9086, 0x0074, 0x1904, 0x9a10, 0x6010, 0x2068,
++	0x6aa0, 0x9286, 0x007e, 0x1120, 0x080c, 0x9c04, 0x0804, 0x9971,
++	0x080c, 0x9bfa, 0x6010, 0x2068, 0x6aa0, 0x9286, 0x0080, 0x1530,
++	0x6813, 0x00ff, 0x6817, 0xfffc, 0x6014, 0x9005, 0x01a8, 0x2068,
++	0x6864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0000,
++	0x900e, 0x2011, 0x4000, 0x080c, 0xaec0, 0x0030, 0x6807, 0x0000,
++	0x6867, 0x0103, 0x6833, 0x0200, 0x2001, 0x0006, 0x080c, 0x5568,
++	0x080c, 0x2886, 0x080c, 0x8ed9, 0x0804, 0x9a11, 0x00e6, 0x2071,
++	0x1136, 0x2e04, 0xd09c, 0x0188, 0x2071, 0x0260, 0x7108, 0x720c,
++	0x918c, 0x00ff, 0x1118, 0x9284, 0xff00, 0x0138, 0x6010, 0x2070,
++	0x70a0, 0xd0bc, 0x1110, 0x7112, 0x7216, 0x00ee, 0x6014, 0x9005,
++	0x0190, 0x2068, 0x6868, 0xd0f4, 0x0170, 0x6864, 0x9084, 0x00ff,
++	0x9086, 0x0039, 0x1958, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000,
++	0x080c, 0xaec0, 0x0848, 0x2001, 0x0004, 0x080c, 0x5568, 0x6003,
++	0x0001, 0x6007, 0x0003, 0x080c, 0x75be, 0x080c, 0x7aa4, 0x0804,
++	0x9a11, 0x685c, 0xd0e4, 0x01d8, 0x080c, 0xad0a, 0x080c, 0x62e4,
++	0x0118, 0xd0dc, 0x1904, 0x992c, 0x2011, 0x1136, 0x2204, 0xc0ad,
++	0x2012, 0x2001, 0x1298, 0x2004, 0x00f6, 0x2079, 0x0100, 0x78e3,
++	0x0000, 0x080c, 0x1fb8, 0x78e2, 0x00fe, 0x0804, 0x992c, 0x080c,
++	0xad47, 0x2011, 0x1136, 0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c,
++	0xbfdb, 0x000e, 0x1904, 0x992c, 0xc0b5, 0x2012, 0x2001, 0x0006,
++	0x080c, 0x5568, 0x9006, 0x080c, 0x5556, 0x00c6, 0x2001, 0x110e,
++	0x2004, 0xd09c, 0x0520, 0x00f6, 0x2079, 0x0100, 0x00e6, 0x2071,
++	0x1100, 0x700c, 0x9084, 0x00ff, 0x78e6, 0x7076, 0x7010, 0x78ea,
++	0x707a, 0x908c, 0x00ff, 0x00ee, 0x780c, 0xc0b5, 0x780e, 0x00fe,
++	0x080c, 0x1f8d, 0x00f6, 0x2100, 0x900e, 0x080c, 0x1f63, 0x7956,
++	0x00fe, 0x9186, 0x0081, 0x01d8, 0x2009, 0x0081, 0x00c8, 0x2009,
++	0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea, 0x7932, 0x7936, 0x780c,
++	0xc0b5, 0x780e, 0x00fe, 0x080c, 0x1f8d, 0x00f6, 0x2079, 0x1100,
++	0x797a, 0x2100, 0x900e, 0x080c, 0x1f63, 0x7956, 0x00fe, 0x8108,
++	0x080c, 0x55b3, 0x2c00, 0x00ce, 0x1904, 0x992c, 0x6012, 0x2009,
++	0x110e, 0x210c, 0xd19c, 0x0168, 0x2009, 0x027c, 0x9080, 0x0004,
++	0x210c, 0x918c, 0x00ff, 0x2102, 0x2009, 0x027d, 0x210c, 0x8000,
++	0x2102, 0x2001, 0x0002, 0x080c, 0x5568, 0x6023, 0x0001, 0x6003,
++	0x0001, 0x6007, 0x0002, 0x080c, 0x75be, 0x080c, 0x7aa4, 0x0008,
++	0x0011, 0x00de, 0x0005, 0x2030, 0x2001, 0x0007, 0x080c, 0x5568,
++	0x2001, 0x1100, 0x2004, 0x9086, 0x0003, 0x1120, 0x2001, 0x0007,
++	0x080c, 0x5592, 0x080c, 0x2886, 0x6020, 0x9086, 0x000a, 0x1108,
++	0x0005, 0x080c, 0x8ed9, 0x0005, 0x00e6, 0x0026, 0x0016, 0x2071,
++	0x1100, 0x7088, 0x9086, 0x0014, 0x1904, 0x9a87, 0x7000, 0x9086,
++	0x0003, 0x1178, 0x6014, 0x9005, 0x1160, 0x0036, 0x0046, 0x6010,
++	0x9080, 0x0028, 0x201c, 0x2021, 0x0006, 0x080c, 0x4026, 0x004e,
++	0x003e, 0x00d6, 0x6010, 0x2068, 0x080c, 0x56a8, 0x080c, 0x98e6,
++	0x00de, 0x080c, 0x9cc9, 0x1598, 0x6010, 0x00d6, 0x2068, 0x6890,
++	0x00de, 0x9005, 0x0560, 0x2001, 0x0006, 0x080c, 0x5568, 0x00e6,
++	0x6014, 0x9075, 0x01d0, 0x7064, 0x9084, 0x00ff, 0x9086, 0x0039,
++	0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xaec0,
++	0x0060, 0x7064, 0x9084, 0x00ff, 0x9086, 0x0029, 0x0130, 0x7007,
++	0x0000, 0x7067, 0x0103, 0x7033, 0x0200, 0x00ee, 0x080c, 0x2886,
++	0x6020, 0x9086, 0x000a, 0x0138, 0x080c, 0x8ed9, 0x0020, 0x080c,
++	0x97dc, 0x080c, 0x9a13, 0x001e, 0x002e, 0x00ee, 0x0005, 0x2011,
++	0x1122, 0x2204, 0x9086, 0x0014, 0x1168, 0x2001, 0x0002, 0x080c,
++	0x5568, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x75be, 0x080c,
++	0x7aa4, 0x0010, 0x080c, 0x9a13, 0x0005, 0x2011, 0x1122, 0x2204,
++	0x9086, 0x0004, 0x1138, 0x2001, 0x0007, 0x080c, 0x5568, 0x080c,
++	0x8ed9, 0x0010, 0x080c, 0x9a13, 0x0005, 0x000b, 0x0005, 0x98b0,
++	0x9ace, 0x98b0, 0x9b03, 0x98b0, 0x9bb0, 0x9ac3, 0x98b0, 0x98b0,
++	0x9bc5, 0x98b0, 0x9bd7, 0x6604, 0x9686, 0x0003, 0x0904, 0x9a2c,
++	0x96b6, 0x001e, 0x1110, 0x080c, 0x8ed9, 0x0005, 0x00d6, 0x00c6,
++	0x080c, 0x9be9, 0x1180, 0x9006, 0x080c, 0x5556, 0x2001, 0x0002,
++	0x080c, 0x5568, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x75be,
++	0x080c, 0x7aa4, 0x00e8, 0x2009, 0x026e, 0x2104, 0x9086, 0x0009,
++	0x1160, 0x6010, 0x2068, 0x6840, 0x9084, 0x00ff, 0x9005, 0x0170,
++	0x8001, 0x6842, 0x601b, 0x000a, 0x0058, 0x2009, 0x026f, 0x2104,
++	0x9084, 0xff00, 0x9086, 0x1900, 0x1108, 0x08c0, 0x080c, 0x9a13,
++	0x00ce, 0x00de, 0x0005, 0x0026, 0x9016, 0x080c, 0x9bf7, 0x00d6,
++	0x2069, 0x12a7, 0x2d04, 0x9005, 0x0168, 0x6010, 0x2068, 0x68a0,
++	0x9086, 0x007e, 0x1138, 0x2069, 0x111e, 0x2d04, 0x8000, 0x206a,
++	0x00de, 0x0010, 0x00de, 0x0088, 0x9006, 0x080c, 0x5556, 0x2001,
++	0x0002, 0x080c, 0x5568, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c,
++	0x75be, 0x080c, 0x7aa4, 0x0804, 0x9b7e, 0x080c, 0xa942, 0x01b0,
++	0x6014, 0x9080, 0x0019, 0x2004, 0x2010, 0x9086, 0x0139, 0x1128,
++	0x2001, 0x0002, 0x080c, 0xaf0f, 0x00c8, 0x6014, 0x9080, 0x001a,
++	0x2004, 0xd0fc, 0x0118, 0x2001, 0x0001, 0x0ca0, 0x2001, 0x110d,
++	0x2004, 0xd0dc, 0x0158, 0x6010, 0x00d6, 0x2068, 0x6840, 0x00de,
++	0x9084, 0x00ff, 0x9005, 0x1110, 0x9006, 0x0c20, 0x080c, 0x97dc,
++	0x2009, 0x026e, 0x2134, 0x96b4, 0x00ff, 0x9686, 0x0005, 0x0500,
++	0x9686, 0x000b, 0x01c8, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00,
++	0x1118, 0x9686, 0x0009, 0x01a0, 0x9086, 0x1900, 0x1168, 0x9686,
++	0x0009, 0x0170, 0x2001, 0x0004, 0x080c, 0x5568, 0x2001, 0x0028,
++	0x601a, 0x6007, 0x0052, 0x0010, 0x080c, 0x9a13, 0x002e, 0x0005,
++	0x00d6, 0x9286, 0x0139, 0x0160, 0x6014, 0x2068, 0x080c, 0xa942,
++	0x0148, 0x6864, 0x9086, 0x0139, 0x0118, 0x6868, 0xd0fc, 0x0110,
++	0x00de, 0x0c50, 0x6010, 0x2068, 0x6840, 0x9084, 0x00ff, 0x9005,
++	0x0140, 0x8001, 0x6842, 0x601b, 0x000a, 0x6007, 0x0016, 0x00de,
++	0x08e8, 0x68a0, 0x9086, 0x007e, 0x1138, 0x00e6, 0x2071, 0x1100,
++	0x080c, 0x5092, 0x00ee, 0x0010, 0x080c, 0x2862, 0x00de, 0x0860,
++	0x080c, 0x9bf7, 0x1168, 0x2001, 0x0004, 0x080c, 0x5568, 0x6003,
++	0x0001, 0x6007, 0x0003, 0x080c, 0x75be, 0x080c, 0x7aa4, 0x0020,
++	0x080c, 0x97dc, 0x080c, 0x9a13, 0x0005, 0x0489, 0x1168, 0x2001,
++	0x0008, 0x080c, 0x5568, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c,
++	0x75be, 0x080c, 0x7aa4, 0x0010, 0x080c, 0x9a13, 0x0005, 0x00f9,
++	0x1168, 0x2001, 0x000a, 0x080c, 0x5568, 0x6003, 0x0001, 0x6007,
++	0x0001, 0x080c, 0x75be, 0x080c, 0x7aa4, 0x0010, 0x080c, 0x9a13,
++	0x0005, 0x2009, 0x026e, 0x2104, 0x9086, 0x0003, 0x1138, 0x2009,
++	0x026f, 0x2104, 0x9084, 0xff00, 0x9086, 0x2a00, 0x0005, 0x9085,
++	0x0001, 0x0005, 0x00c6, 0x0016, 0x9c88, 0x0004, 0x2164, 0x080c,
++	0x5617, 0x001e, 0x00ce, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x0036,
++	0x0016, 0x6010, 0x2068, 0x2009, 0x1136, 0x2104, 0x9085, 0x0003,
++	0x200a, 0x080c, 0x9c9e, 0x0560, 0x2009, 0x1136, 0x2104, 0xc0cd,
++	0x200a, 0x080c, 0x58cb, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a,
++	0x080c, 0xc12f, 0x2001, 0x110c, 0x200c, 0xc195, 0x2102, 0x2019,
++	0x002a, 0x2009, 0x0001, 0x080c, 0x2831, 0x00e6, 0x2071, 0x1100,
++	0x080c, 0x2679, 0x00ee, 0x00c6, 0x0156, 0x20a9, 0x0081, 0x2009,
++	0x007f, 0x080c, 0x2955, 0x8108, 0x1f04, 0x9c39, 0x015e, 0x00ce,
++	0x080c, 0x9bfa, 0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071, 0x0260,
++	0x2079, 0x0200, 0x7817, 0x0001, 0x2001, 0x1136, 0x200c, 0xc1c5,
++	0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118, 0x7038, 0xd0dc, 0x1108,
++	0xc1c4, 0x7817, 0x0000, 0x2001, 0x1136, 0x2102, 0x2079, 0x0100,
++	0x2e04, 0x9084, 0x00ff, 0x2069, 0x111d, 0x206a, 0x78e6, 0x0006,
++	0x8e70, 0x2e04, 0x2069, 0x111e, 0x206a, 0x78ea, 0x7832, 0x7836,
++	0x2010, 0x9084, 0xff00, 0x001e, 0x9105, 0x2009, 0x112a, 0x200a,
++	0x2200, 0x9084, 0x00ff, 0x2008, 0x080c, 0x1f8d, 0x080c, 0x62e4,
++	0x0170, 0x2071, 0x0260, 0x2069, 0x12bc, 0x7048, 0x206a, 0x704c,
++	0x6806, 0x7050, 0x680a, 0x7054, 0x680e, 0x080c, 0xad0a, 0x0040,
++	0x2001, 0x0006, 0x080c, 0x5568, 0x080c, 0x2886, 0x080c, 0x8ed9,
++	0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x0026, 0x0036,
++	0x00e6, 0x0156, 0x2019, 0x112a, 0x231c, 0x83ff, 0x01e8, 0x2071,
++	0x0260, 0x7200, 0x9294, 0x00ff, 0x7004, 0x9084, 0xff00, 0x9205,
++	0x9306, 0x1190, 0x2011, 0x0276, 0x20a9, 0x0004, 0x9d98, 0x000a,
++	0x080c, 0x9d60, 0x1148, 0x2011, 0x027a, 0x20a9, 0x0004, 0x9d98,
++	0x0006, 0x080c, 0x9d60, 0x1100, 0x015e, 0x00ee, 0x003e, 0x002e,
++	0x0005, 0x00e6, 0x2071, 0x0260, 0x7034, 0x9086, 0x0014, 0x11a8,
++	0x7038, 0x9086, 0x0800, 0x1188, 0x703c, 0xd0ec, 0x0160, 0x9084,
++	0x0f00, 0x9086, 0x0100, 0x1138, 0x7054, 0xd0a4, 0x1110, 0xd0ac,
++	0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ee, 0x0005, 0x00e6,
++	0x00d6, 0x00c6, 0x0076, 0x0056, 0x0046, 0x0026, 0x0006, 0x0126,
++	0x2091, 0x8000, 0x2029, 0x130d, 0x252c, 0x2021, 0x1313, 0x2424,
++	0x2061, 0x15c0, 0x2071, 0x1100, 0x724c, 0x706c, 0x9202, 0x1a04,
++	0x9d4c, 0x080c, 0xc15b, 0x0904, 0x9d45, 0x6720, 0x9786, 0x0001,
++	0x05e0, 0x9786, 0x0007, 0x05c8, 0x2500, 0x9c06, 0x05b0, 0x2400,
++	0x9c06, 0x0598, 0x3e08, 0x9186, 0x0002, 0x1140, 0x6010, 0x9005,
++	0x0128, 0x9080, 0x0000, 0x2004, 0xd0bc, 0x1538, 0x00c6, 0x6000,
++	0x9086, 0x0004, 0x1110, 0x080c, 0x1509, 0x9786, 0x0008, 0x1148,
++	0x080c, 0xab2e, 0x1130, 0x00ce, 0x080c, 0x97dc, 0x080c, 0x8f09,
++	0x00a0, 0x6014, 0x2068, 0x080c, 0xa942, 0x0160, 0x9786, 0x0003,
++	0x11e8, 0x6867, 0x0103, 0x6b7a, 0x6877, 0x0000, 0x080c, 0x5b76,
++	0x080c, 0xab11, 0x080c, 0x8f09, 0x00ce, 0x9ce0, 0x0018, 0x7060,
++	0x9c02, 0x1210, 0x0804, 0x9cfc, 0x012e, 0x000e, 0x002e, 0x004e,
++	0x005e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x9786, 0x0006,
++	0x1118, 0x080c, 0xc0e9, 0x0c30, 0x9786, 0x000a, 0x09e0, 0x08c8,
++	0x220c, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, 0x9d60,
++	0x9006, 0x0005, 0x2304, 0x9102, 0x0218, 0x2001, 0x0001, 0x0008,
++	0x9006, 0x918d, 0x0001, 0x0005, 0x0136, 0x01c6, 0x0016, 0x8906,
++	0x8006, 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9300,
++	0x2098, 0x3518, 0x20a9, 0x0001, 0x220c, 0x4002, 0x910e, 0x1140,
++	0x8210, 0x8319, 0x1dc8, 0x9006, 0x001e, 0x01ce, 0x013e, 0x0005,
++	0x220c, 0x9102, 0x0218, 0x2001, 0x0001, 0x0010, 0x2001, 0x0000,
++	0x918d, 0x0001, 0x001e, 0x01ce, 0x013e, 0x0005, 0x6004, 0x908a,
++	0x0053, 0x1a0c, 0x0d7e, 0x080c, 0xab1d, 0x0120, 0x080c, 0xab2e,
++	0x0168, 0x0028, 0x080c, 0x2886, 0x080c, 0xab2e, 0x0138, 0x080c,
++	0x79ab, 0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x0005, 0x080c, 0x97dc,
++	0x0cb0, 0x9182, 0x0040, 0x0002, 0x9dcf, 0x9dcf, 0x9dcf, 0x9dcf,
++	0x9dcf, 0x9dcf, 0x9dcf, 0x9dcf, 0x9dcf, 0x9dcf, 0x9dcf, 0x9dd1,
++	0x9dd1, 0x9dd1, 0x9dd1, 0x9dcf, 0x9dcf, 0x9dcf, 0x9dd1, 0x080c,
++	0x0d7e, 0x600b, 0xffff, 0x6003, 0x0001, 0x6106, 0x080c, 0x756e,
++	0x0126, 0x2091, 0x8000, 0x080c, 0x7aa4, 0x012e, 0x0005, 0x9186,
++	0x0013, 0x1128, 0x6004, 0x9082, 0x0040, 0x0804, 0x9e6c, 0x9186,
++	0x0027, 0x11e8, 0x080c, 0x79ab, 0x080c, 0x2862, 0x00d6, 0x6114,
++	0x2168, 0x080c, 0xa942, 0x0168, 0x6867, 0x0103, 0x687b, 0x0029,
++	0x6877, 0x0000, 0x697c, 0xc1c5, 0x697e, 0x080c, 0x5b76, 0x080c,
++	0xab11, 0x00de, 0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x0005, 0x9186,
++	0x0014, 0x1120, 0x6004, 0x9082, 0x0040, 0x0430, 0x9186, 0x0046,
++	0x0150, 0x9186, 0x0045, 0x0138, 0x9186, 0x0053, 0x0120, 0x9186,
++	0x0048, 0x190c, 0x0d7e, 0x2001, 0x0109, 0x2004, 0xd084, 0x0198,
++	0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x745c,
++	0x002e, 0x001e, 0x000e, 0x012e, 0xa001, 0x6000, 0x9086, 0x0002,
++	0x1110, 0x0804, 0x9eaf, 0x0005, 0x0002, 0x9e4a, 0x9e48, 0x9e48,
++	0x9e48, 0x9e48, 0x9e48, 0x9e48, 0x9e48, 0x9e48, 0x9e48, 0x9e48,
++	0x9e65, 0x9e65, 0x9e65, 0x9e65, 0x9e48, 0x9e65, 0x9e48, 0x9e65,
++	0x080c, 0x0d7e, 0x080c, 0x79ab, 0x00d6, 0x6114, 0x2168, 0x080c,
++	0xa942, 0x0168, 0x6867, 0x0103, 0x687b, 0x0006, 0x6877, 0x0000,
++	0x6880, 0xc0ec, 0x6882, 0x080c, 0x5b76, 0x080c, 0xab11, 0x00de,
++	0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x0005, 0x080c, 0x79ab, 0x080c,
++	0x8ed9, 0x080c, 0x7aa4, 0x0005, 0x0002, 0x9e82, 0x9e80, 0x9e80,
++	0x9e80, 0x9e80, 0x9e80, 0x9e80, 0x9e80, 0x9e80, 0x9e80, 0x9e80,
++	0x9e99, 0x9e99, 0x9e99, 0x9e99, 0x9e80, 0x9ea8, 0x9e80, 0x9e99,
++	0x080c, 0x0d7e, 0x00d6, 0x080c, 0x79ab, 0x6014, 0x2068, 0x2001,
++	0x12c2, 0x2004, 0x6042, 0x697c, 0xd1ac, 0x0140, 0x6003, 0x0004,
++	0x687c, 0x9085, 0x0400, 0x687e, 0x00de, 0x0005, 0x6003, 0x0002,
++	0x0cb8, 0x080c, 0x79ab, 0x2001, 0x12c0, 0x2004, 0x601a, 0x2001,
++	0x12c2, 0x2004, 0x6042, 0x6003, 0x000f, 0x080c, 0x7aa4, 0x0005,
++	0x080c, 0x79ab, 0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x0005, 0x9182,
++	0x0040, 0x0002, 0x9ec6, 0x9ec6, 0x9ec6, 0x9ec6, 0x9ec6, 0x9ec8,
++	0x9fa9, 0x9ec6, 0x9ec6, 0x9ec6, 0x9ec6, 0x9ec6, 0x9ec6, 0x9ec6,
++	0x9ec6, 0x9ec6, 0x9ec6, 0x9ec6, 0x9ec6, 0x9fd8, 0x080c, 0x0d7e,
++	0x00d6, 0x6114, 0x2168, 0x7644, 0x96b4, 0x0fff, 0x86ff, 0x1518,
++	0x6010, 0x2004, 0xd0bc, 0x1904, 0x9f94, 0x687b, 0x0000, 0x6867,
++	0x0103, 0x6e76, 0x687c, 0xd0ac, 0x0128, 0x6834, 0x6938, 0x9115,
++	0x190c, 0xa12c, 0x080c, 0x599a, 0x6210, 0x2268, 0x6a3c, 0x82ff,
++	0x0110, 0x8211, 0x6a3e, 0x7044, 0xd0e4, 0x1904, 0x9f74, 0x080c,
++	0x8ed9, 0x00de, 0x0005, 0x968c, 0x0c00, 0x0148, 0x6010, 0x2004,
++	0xd0bc, 0x1904, 0x9f78, 0x7348, 0x6b92, 0x734c, 0x6b8e, 0x968c,
++	0x00ff, 0x9186, 0x0002, 0x0508, 0x9186, 0x0028, 0x1118, 0x687b,
++	0x001c, 0x00e8, 0xd6dc, 0x01a0, 0x687b, 0x0015, 0x687c, 0xd0ac,
++	0x0170, 0x6938, 0x6a34, 0x2100, 0x9205, 0x0148, 0x7048, 0x9106,
++	0x1118, 0x704c, 0x9206, 0x0118, 0x6992, 0x6a8e, 0xc6dc, 0x0038,
++	0xd6d4, 0x0118, 0x687b, 0x0007, 0x0010, 0x687b, 0x0000, 0x6867,
++	0x0103, 0x6e76, 0x901e, 0xd6c4, 0x01d8, 0x9686, 0x0100, 0x1130,
++	0x7064, 0x9005, 0x1118, 0xc6c4, 0x0804, 0x9ece, 0x735c, 0x6b86,
++	0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036,
++	0x2308, 0x2019, 0x0018, 0x9d90, 0x0025, 0x080c, 0xa5c9, 0x003e,
++	0xd6cc, 0x0904, 0x9ee2, 0x7154, 0x698a, 0x81ff, 0x0904, 0x9ee2,
++	0x9192, 0x0021, 0x1278, 0x8304, 0x9098, 0x0018, 0x9d90, 0x0029,
++	0x080c, 0xa5c9, 0x2011, 0x0205, 0x2013, 0x0000, 0x080c, 0xaf7b,
++	0x0804, 0x9ee2, 0x6868, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x698a,
++	0x0c50, 0x00f6, 0x2d78, 0x080c, 0xa568, 0x00fe, 0x080c, 0xaf7b,
++	0x080c, 0xa5b9, 0x0804, 0x9ee4, 0x080c, 0xac0b, 0x0804, 0x9ef1,
++	0x687c, 0xd0ac, 0x0904, 0x9efb, 0x6024, 0xd0dc, 0x1904, 0x9efb,
++	0x6880, 0xd0bc, 0x1904, 0x9efb, 0x7348, 0x6838, 0x9306, 0x11e8,
++	0x734c, 0x6834, 0x931e, 0x0904, 0x9efb, 0xd6d4, 0x01b0, 0x6b38,
++	0x9305, 0x0904, 0x9efb, 0x0088, 0x687c, 0xd0ac, 0x0904, 0x9ed5,
++	0x6838, 0x6934, 0x9105, 0x0904, 0x9ed5, 0x6024, 0xd0dc, 0x1904,
++	0x9ed5, 0x6880, 0xd0bc, 0x1904, 0x9ed5, 0x080c, 0xac39, 0x0804,
++	0x9ef1, 0x00f6, 0x6003, 0x0003, 0x2079, 0x026c, 0x7c04, 0x7b00,
++	0x7e0c, 0x7d08, 0x6014, 0x2078, 0x787c, 0xd0ac, 0x0138, 0x6003,
++	0x0002, 0x00fe, 0x0005, 0x2130, 0x2228, 0x0058, 0x2400, 0x79ac,
++	0x910a, 0x2300, 0x7ab0, 0x9213, 0x2600, 0x9102, 0x2500, 0x9203,
++	0x0e90, 0x7c36, 0x7b3a, 0x7e46, 0x7d4a, 0x00fe, 0x6043, 0x0000,
++	0x2c10, 0x080c, 0x1605, 0x080c, 0x75db, 0x080c, 0x7b72, 0x0005,
++	0x0005, 0x9182, 0x0040, 0x0002, 0x9fef, 0x9fef, 0x9fef, 0x9fef,
++	0x9fef, 0x9ff1, 0xa085, 0x9fef, 0x9fef, 0xa09b, 0xa103, 0x9fef,
++	0x9fef, 0x9fef, 0x9fef, 0xa112, 0x9fef, 0x9fef, 0x9fef, 0x080c,
++	0x0d7e, 0x0076, 0x00f6, 0x00e6, 0x00d6, 0x2071, 0x0260, 0x6114,
++	0x2178, 0x7644, 0x7e76, 0x96b4, 0x0fff, 0x7f7c, 0xc7e5, 0x7f7e,
++	0x6210, 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e, 0x86ff,
++	0x0904, 0xa080, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, 0x7048,
++	0x7892, 0x704c, 0x788e, 0x9284, 0x0300, 0x0904, 0xa080, 0x080c,
++	0x0eb6, 0x090c, 0x0d7e, 0x2d00, 0x787a, 0x7f7c, 0xc7cd, 0x7f7e,
++	0x6867, 0x0103, 0x7868, 0x686a, 0x786c, 0x686e, 0x7870, 0x6872,
++	0x6e76, 0x968c, 0x0c00, 0x0120, 0x7348, 0x6b92, 0x734c, 0x6b8e,
++	0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, 0x0028, 0x1118,
++	0x687b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0x687b, 0x0015, 0x0038,
++	0xd6d4, 0x0118, 0x687b, 0x0007, 0x0010, 0x687b, 0x0000, 0x6f7e,
++	0x7880, 0x6882, 0x7884, 0x6886, 0x901e, 0xd6c4, 0x0190, 0x735c,
++	0x6b86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008,
++	0x0036, 0x2308, 0x2019, 0x0018, 0x9d90, 0x0025, 0x080c, 0xa5c9,
++	0x003e, 0xd6cc, 0x01e8, 0x7154, 0x698a, 0x81ff, 0x01c8, 0x9192,
++	0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x9d90, 0x0029, 0x080c,
++	0xa5c9, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0x7868, 0xd0fc,
++	0x0120, 0x2009, 0x0020, 0x698a, 0x0c68, 0x2d78, 0x080c, 0xa568,
++	0x00de, 0x00ee, 0x00fe, 0x007e, 0x0005, 0x00f6, 0x6003, 0x0003,
++	0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6014, 0x2078,
++	0x7c36, 0x7b3a, 0x7e46, 0x7d4a, 0x00fe, 0x2c10, 0x080c, 0x1605,
++	0x080c, 0x856f, 0x0005, 0x00d6, 0x2001, 0x12c2, 0x2004, 0x6042,
++	0x6003, 0x0002, 0x080c, 0x7a55, 0x080c, 0x7b72, 0x6114, 0x2168,
++	0x697c, 0xd1e4, 0x0904, 0xa0fe, 0xd1cc, 0x0570, 0x6978, 0x6868,
++	0xd0fc, 0x0500, 0x0016, 0x687c, 0x0006, 0x6880, 0x0006, 0x9d90,
++	0x0019, 0x9198, 0x0019, 0x2009, 0x0020, 0x0156, 0x21a8, 0x2304,
++	0x2012, 0x8318, 0x8210, 0x1f04, 0xa0bf, 0x015e, 0x000e, 0x6882,
++	0x000e, 0x687e, 0x001e, 0x6874, 0x0006, 0x2168, 0x080c, 0x0edf,
++	0x001e, 0x0440, 0x0016, 0x080c, 0x0edf, 0x00de, 0x6974, 0x0016,
++	0x080c, 0xa5b9, 0x001e, 0x00f0, 0x6867, 0x0103, 0x6974, 0x9184,
++	0x00ff, 0x90b6, 0x0002, 0x0180, 0x9086, 0x0028, 0x1118, 0x687b,
++	0x001c, 0x0060, 0xd1dc, 0x0118, 0x687b, 0x0015, 0x0038, 0xd1d4,
++	0x0118, 0x687b, 0x0007, 0x0010, 0x687b, 0x0000, 0x0016, 0x080c,
++	0x599a, 0x001e, 0xd1e4, 0x1120, 0x080c, 0x8ed9, 0x00de, 0x0005,
++	0x080c, 0xac0b, 0x0cd8, 0x2019, 0x0001, 0x080c, 0x8847, 0x6003,
++	0x0002, 0x2001, 0x12c2, 0x2004, 0x6042, 0x080c, 0x7a55, 0x080c,
++	0x7b72, 0x0005, 0x080c, 0x7a55, 0x080c, 0x2862, 0x00d6, 0x6114,
++	0x2168, 0x080c, 0xa942, 0x0150, 0x6867, 0x0103, 0x687b, 0x0029,
++	0x6877, 0x0000, 0x080c, 0x5b76, 0x080c, 0xab11, 0x00de, 0x080c,
++	0x8ed9, 0x080c, 0x7b72, 0x0005, 0x687b, 0x0015, 0xd1fc, 0x0138,
++	0x687b, 0x0007, 0x8002, 0x8000, 0x810a, 0x9189, 0x0000, 0x6992,
++	0x688e, 0x0005, 0x9182, 0x0040, 0x0002, 0xa151, 0xa151, 0xa151,
++	0xa151, 0xa151, 0xa153, 0xa151, 0xa151, 0xa1f7, 0xa151, 0xa151,
++	0xa151, 0xa151, 0xa151, 0xa151, 0xa151, 0xa151, 0xa151, 0xa151,
++	0xa31d, 0x080c, 0x0d7e, 0x0076, 0x00f6, 0x00e6, 0x00d6, 0x2071,
++	0x0260, 0x6114, 0x2178, 0x7644, 0x7e76, 0x96b4, 0x0fff, 0x7f7c,
++	0xc7e5, 0x7f7e, 0x6210, 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211,
++	0x6a3e, 0x86ff, 0x0904, 0xa1f0, 0x9694, 0xff00, 0x9284, 0x0c00,
++	0x0120, 0x7048, 0x7892, 0x704c, 0x788e, 0x9284, 0x0300, 0x0904,
++	0xa1f0, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4,
++	0x7e76, 0x0c38, 0x080c, 0x0eb6, 0x090c, 0x0d7e, 0x2d00, 0x787a,
++	0x7f7c, 0x97bd, 0x0200, 0x7f7e, 0x6867, 0x0103, 0x7868, 0x686a,
++	0x786c, 0x686e, 0x7870, 0x6872, 0x7044, 0x9084, 0xf000, 0x9635,
++	0x6e76, 0x968c, 0x0c00, 0x0120, 0x7348, 0x6b92, 0x734c, 0x6b8e,
++	0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, 0x0028, 0x1118,
++	0x687b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0x687b, 0x0015, 0x0038,
++	0xd6d4, 0x0118, 0x687b, 0x0007, 0x0010, 0x687b, 0x0000, 0x6f7e,
++	0x7880, 0x6882, 0x7884, 0x6886, 0x901e, 0xd6c4, 0x0190, 0x735c,
++	0x6b86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008,
++	0x0036, 0x2308, 0x2019, 0x0018, 0x9d90, 0x0025, 0x080c, 0xa5c9,
++	0x003e, 0xd6cc, 0x01e8, 0x7154, 0x698a, 0x81ff, 0x01c8, 0x9192,
++	0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x9d90, 0x0029, 0x080c,
++	0xa5c9, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0x7868, 0xd0fc,
++	0x0120, 0x2009, 0x0020, 0x698a, 0x0c68, 0x2d78, 0x080c, 0xa568,
++	0x080c, 0x14d3, 0x00de, 0x00ee, 0x00fe, 0x007e, 0x0005, 0x2001,
++	0x12c2, 0x2004, 0x6042, 0x00d6, 0x6114, 0x2168, 0x683c, 0x6940,
++	0x9105, 0x1118, 0x687c, 0xc0dc, 0x687e, 0x6003, 0x0002, 0x697c,
++	0xd1e4, 0x0904, 0xa318, 0x6043, 0x0000, 0x6010, 0x2004, 0xd0bc,
++	0x11f8, 0xd1cc, 0x0904, 0xa2e7, 0x6978, 0x6868, 0xd0fc, 0x0904,
++	0xa2a8, 0x0016, 0x687c, 0x0006, 0x6880, 0x0006, 0x00f6, 0x2178,
++	0x7974, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x0904, 0xa27b, 0x9086,
++	0x0028, 0x15e8, 0x687b, 0x001c, 0x787b, 0x001c, 0x0804, 0xa283,
++	0x6024, 0xd0f4, 0x11d0, 0x6838, 0x6a34, 0x9205, 0x09d0, 0x6838,
++	0x6a90, 0x9206, 0x1120, 0x688c, 0x6a34, 0x9206, 0x0990, 0x6024,
++	0xd0d4, 0x1148, 0x69ac, 0x6834, 0x9102, 0x603a, 0x69b0, 0x6838,
++	0x9103, 0x603e, 0x6024, 0xc0f5, 0x6026, 0x6010, 0x00d6, 0x2068,
++	0x683c, 0x8000, 0x683e, 0x00de, 0x9006, 0x6876, 0x6892, 0x688e,
++	0x687c, 0xc0e4, 0x687e, 0xd0cc, 0x0130, 0x00d6, 0x6878, 0x2068,
++	0x080c, 0x0edf, 0x00de, 0x080c, 0xac39, 0x0804, 0xa318, 0xd1dc,
++	0x0158, 0x687b, 0x0015, 0x787b, 0x0015, 0x080c, 0xaea9, 0x0118,
++	0x7974, 0xc1dc, 0x7976, 0x0078, 0xd1d4, 0x0128, 0x687b, 0x0007,
++	0x787b, 0x0007, 0x0040, 0x687c, 0xd0ac, 0x0128, 0x6834, 0x6938,
++	0x9115, 0x190c, 0xa12c, 0x687c, 0x787e, 0x6890, 0x7892, 0x688c,
++	0x788e, 0x9d90, 0x0019, 0x9f98, 0x0019, 0x2009, 0x0020, 0x0156,
++	0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, 0x1f04, 0xa291, 0x015e,
++	0x00fe, 0x000e, 0x6882, 0x000e, 0x687e, 0x080c, 0xaf7b, 0x001e,
++	0x6874, 0x0006, 0x2168, 0x080c, 0x0edf, 0x001e, 0x0804, 0xa314,
++	0x0016, 0x00f6, 0x2178, 0x7974, 0x9184, 0x00ff, 0x90b6, 0x0002,
++	0x01e0, 0x9086, 0x0028, 0x1128, 0x687b, 0x001c, 0x787b, 0x001c,
++	0x00e0, 0xd1dc, 0x0158, 0x687b, 0x0015, 0x787b, 0x0015, 0x080c,
++	0xaea9, 0x0118, 0x7974, 0xc1dc, 0x7976, 0x0078, 0xd1d4, 0x0128,
++	0x687b, 0x0007, 0x787b, 0x0007, 0x0040, 0x687c, 0xd0ac, 0x0128,
++	0x6834, 0x6938, 0x9115, 0x190c, 0xa12c, 0x6890, 0x7892, 0x688c,
++	0x788e, 0x687c, 0x787e, 0x00fe, 0x080c, 0x0edf, 0x00de, 0x080c,
++	0xaf7b, 0x6974, 0x0016, 0x080c, 0xa5b9, 0x001e, 0x0468, 0x6867,
++	0x0103, 0x6974, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01b0, 0x9086,
++	0x0028, 0x1118, 0x687b, 0x001c, 0x00d0, 0xd1dc, 0x0148, 0x687b,
++	0x0015, 0x080c, 0xaea9, 0x0118, 0x6974, 0xc1dc, 0x6976, 0x0078,
++	0xd1d4, 0x0118, 0x687b, 0x0007, 0x0050, 0x687b, 0x0000, 0x687c,
++	0xd0ac, 0x0128, 0x6834, 0x6938, 0x9115, 0x190c, 0xa12c, 0x6974,
++	0x0016, 0x080c, 0x599a, 0x001e, 0xd1e4, 0x1120, 0x080c, 0x8ed9,
++	0x00de, 0x0005, 0x080c, 0xac0b, 0x0cd8, 0x0005, 0x080c, 0x79ab,
++	0x0010, 0x080c, 0x7a55, 0x080c, 0xa942, 0x01c0, 0x00d6, 0x6114,
++	0x2168, 0x6867, 0x0103, 0x2009, 0x110c, 0x210c, 0xd18c, 0x11c0,
++	0xd184, 0x1198, 0x6108, 0x697a, 0x918e, 0x0029, 0x1110, 0x080c,
++	0xc3c7, 0x6877, 0x0000, 0x080c, 0x5b76, 0x00de, 0x080c, 0x8ed9,
++	0x080c, 0x7aa4, 0x080c, 0x7b72, 0x0005, 0x687b, 0x0004, 0x0c88,
++	0x687b, 0x0004, 0x0c70, 0x9182, 0x0040, 0x0002, 0xa361, 0xa361,
++	0xa361, 0xa361, 0xa361, 0xa363, 0xa361, 0xa366, 0xa361, 0xa361,
++	0xa361, 0xa361, 0xa361, 0xa361, 0xa361, 0xa361, 0xa361, 0xa361,
++	0xa361, 0x080c, 0x0d7e, 0x080c, 0x8ed9, 0x0005, 0x0006, 0x0026,
++	0x9016, 0x080c, 0x137c, 0x002e, 0x000e, 0x0005, 0x9182, 0x0085,
++	0x0002, 0xa380, 0xa37e, 0xa37e, 0xa38c, 0xa37e, 0xa37e, 0xa37e,
++	0xa37e, 0xa37e, 0xa37e, 0xa37e, 0xa37e, 0xa37e, 0x080c, 0x0d7e,
++	0x6003, 0x0001, 0x6106, 0x080c, 0x756e, 0x0126, 0x2091, 0x8000,
++	0x080c, 0x7aa4, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6,
++	0x2071, 0x0260, 0x7224, 0x6216, 0x7220, 0x080c, 0xa932, 0x01a0,
++	0x2268, 0x6800, 0x9086, 0x0000, 0x0178, 0x6010, 0x6d10, 0x952e,
++	0x1158, 0x00c6, 0x2d60, 0x080c, 0xa5e6, 0x00ce, 0x0128, 0x6803,
++	0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, 0x6003, 0x0001,
++	0x080c, 0x756e, 0x080c, 0x7aa4, 0x9280, 0x0004, 0x2004, 0xd0bc,
++	0x0150, 0x6824, 0xd0ec, 0x0138, 0x00c6, 0x2260, 0x6043, 0x0000,
++	0x080c, 0xac39, 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e, 0x0005,
++	0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d7e,
++	0x908a, 0x0092, 0x1a0c, 0x0d7e, 0x9082, 0x0085, 0x0072, 0x9186,
++	0x0027, 0x0120, 0x9186, 0x0014, 0x190c, 0x0d7e, 0x080c, 0x79ab,
++	0x080c, 0x8f09, 0x080c, 0x7aa4, 0x0005, 0xa3f2, 0xa3f4, 0xa3f4,
++	0xa3f2, 0xa3f2, 0xa3f2, 0xa3f2, 0xa3f2, 0xa3f2, 0xa3f2, 0xa3f2,
++	0xa3f2, 0xa3f2, 0x080c, 0x0d7e, 0x080c, 0x79ab, 0x080c, 0x8f09,
++	0x080c, 0x7aa4, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082,
++	0x0085, 0x2008, 0x04a8, 0x9186, 0x0027, 0x11e8, 0x080c, 0x79ab,
++	0x080c, 0x2862, 0x00d6, 0x6014, 0x2068, 0x080c, 0xa942, 0x0150,
++	0x6867, 0x0103, 0x6877, 0x0000, 0x687b, 0x0029, 0x080c, 0x5b76,
++	0x080c, 0xab11, 0x00de, 0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x0005,
++	0x080c, 0x8f6e, 0x0ce0, 0x9186, 0x0014, 0x1dd0, 0x080c, 0x79ab,
++	0x00d6, 0x6014, 0x2068, 0x080c, 0xa942, 0x0d60, 0x6867, 0x0103,
++	0x6877, 0x0000, 0x687b, 0x0006, 0x6880, 0xc0ec, 0x6882, 0x08f0,
++	0x0002, 0xa448, 0xa446, 0xa446, 0xa446, 0xa446, 0xa446, 0xa460,
++	0xa446, 0xa446, 0xa446, 0xa446, 0xa446, 0xa446, 0x080c, 0x0d7e,
++	0x080c, 0x79ab, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039,
++	0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x12c0, 0x0010, 0x2001,
++	0x12c1, 0x2004, 0x601a, 0x6003, 0x000c, 0x080c, 0x7aa4, 0x0005,
++	0x080c, 0x79ab, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039,
++	0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x12c0, 0x0010, 0x2001,
++	0x12c1, 0x2004, 0x601a, 0x6003, 0x000e, 0x080c, 0x7aa4, 0x0005,
++	0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x001a, 0x080c,
++	0x8f6e, 0x0005, 0xa48f, 0xa48f, 0xa48f, 0xa48f, 0xa491, 0xa4ea,
++	0xa48f, 0xa48f, 0xa48f, 0xa48f, 0xa48f, 0xa48f, 0xa48f, 0x080c,
++	0x0d7e, 0x00d6, 0x6010, 0x2004, 0xd0bc, 0x0168, 0x6034, 0x908c,
++	0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118,
++	0x00de, 0x0804, 0xa4fb, 0x080c, 0xa942, 0x1118, 0x080c, 0xab11,
++	0x00f0, 0x6014, 0x2068, 0x687c, 0xd0e4, 0x1110, 0x080c, 0xab11,
++	0x6867, 0x0103, 0x6880, 0xd0b4, 0x0128, 0x687b, 0x0006, 0xc0ec,
++	0x6882, 0x0048, 0xd0bc, 0x0118, 0x687b, 0x0002, 0x0020, 0x687b,
++	0x0005, 0x080c, 0xac07, 0x6877, 0x0000, 0x080c, 0x5b76, 0x2c68,
++	0x080c, 0x8e83, 0x01d0, 0x6003, 0x0001, 0x6007, 0x001e, 0x600b,
++	0xffff, 0x2009, 0x026e, 0x210c, 0x613a, 0x2009, 0x026f, 0x210c,
++	0x613e, 0x6910, 0x6112, 0x080c, 0xad70, 0x6954, 0x6156, 0x6023,
++	0x0001, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x2d60, 0x080c, 0x8ed9,
++	0x00de, 0x0005, 0x6010, 0x2004, 0xd0bc, 0x0598, 0x6034, 0x908c,
++	0xff00, 0x810f, 0x9186, 0x0035, 0x0130, 0x9186, 0x001e, 0x0118,
++	0x9186, 0x0039, 0x1530, 0x00d6, 0x2c68, 0x080c, 0xaf4e, 0x1904,
++	0xa540, 0x080c, 0x8e83, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023,
++	0x0001, 0x6910, 0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934,
++	0x918c, 0x00ff, 0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x6954,
++	0x6156, 0x080c, 0xad70, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x2d60,
++	0x00f8, 0x00d6, 0x6014, 0x2068, 0x080c, 0xa942, 0x01c8, 0x6867,
++	0x0103, 0x6880, 0xd0b4, 0x0128, 0xc0ec, 0x6882, 0x687b, 0x0006,
++	0x0048, 0xd0bc, 0x0118, 0x687b, 0x0002, 0x0020, 0x687b, 0x0005,
++	0x080c, 0xac07, 0x6877, 0x0000, 0x080c, 0x5b76, 0x080c, 0xab11,
++	0x00de, 0x080c, 0x8ed9, 0x0005, 0x0016, 0x00d6, 0x6014, 0x2068,
++	0x080c, 0xa942, 0x0140, 0x6867, 0x0103, 0x687b, 0x0028, 0x6877,
++	0x0000, 0x080c, 0x5b76, 0x00de, 0x001e, 0x9186, 0x0013, 0x0148,
++	0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0x8f6e,
++	0x0030, 0x080c, 0x79ab, 0x080c, 0x8f09, 0x080c, 0x7aa4, 0x0005,
++	0x0056, 0x0066, 0x00d6, 0x00f6, 0x2029, 0x0001, 0x9182, 0x0101,
++	0x1208, 0x0010, 0x2009, 0x0100, 0x2130, 0x8304, 0x9098, 0x0018,
++	0x2009, 0x0020, 0x9f90, 0x0029, 0x080c, 0xa5c9, 0x96b2, 0x0020,
++	0x7804, 0x906d, 0x0110, 0x080c, 0x0edf, 0x080c, 0x0eb6, 0x0520,
++	0x8528, 0x6867, 0x0110, 0x686b, 0x0000, 0x2d20, 0x7c06, 0x968a,
++	0x003d, 0x1228, 0x2608, 0x9d90, 0x001b, 0x0499, 0x00a8, 0x96b2,
++	0x003c, 0x2009, 0x003c, 0x2d78, 0x9d90, 0x001b, 0x0451, 0x0c28,
++	0x2079, 0x0200, 0x7817, 0x0000, 0x00fe, 0x852f, 0x95ad, 0x0003,
++	0x7d66, 0x95ac, 0x0000, 0x0048, 0x2079, 0x0200, 0x7817, 0x0000,
++	0x00fe, 0x852f, 0x95ad, 0x0003, 0x7d66, 0x00de, 0x006e, 0x005e,
++	0x0005, 0x00f6, 0x8dff, 0x0158, 0x6804, 0x907d, 0x0130, 0x6807,
++	0x0000, 0x080c, 0x5b76, 0x2f68, 0x0cb8, 0x080c, 0x5b76, 0x00fe,
++	0x0005, 0x00f6, 0x0156, 0x2079, 0x0200, 0x9184, 0x0001, 0x0108,
++	0x8108, 0x810c, 0x21a8, 0x2300, 0x9e00, 0x2004, 0x8007, 0x2012,
++	0x8318, 0x9386, 0x0020, 0x1120, 0x2018, 0x7814, 0x8000, 0x7816,
++	0x8210, 0x1f04, 0xa5d3, 0x015e, 0x00fe, 0x0005, 0x0066, 0x0126,
++	0x2091, 0x8000, 0x2031, 0x0001, 0x6020, 0x9084, 0x000f, 0x0083,
++	0x012e, 0x006e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0066, 0x2031,
++	0x0000, 0x6020, 0x9084, 0x000f, 0x001b, 0x006e, 0x012e, 0x0005,
++	0xa621, 0xa621, 0xa61c, 0xa643, 0xa60f, 0xa61c, 0xa643, 0xa61c,
++	0xa60f, 0xa60f, 0xa61c, 0xa61c, 0xa61c, 0xa60f, 0xa60f, 0x080c,
++	0x0d7e, 0x0036, 0x2019, 0x0010, 0x080c, 0xbd23, 0x6023, 0x0006,
++	0x6003, 0x0007, 0x003e, 0x0005, 0x9006, 0x0005, 0x9085, 0x0001,
++	0x0005, 0x00d6, 0x86ff, 0x11d8, 0x6014, 0x2068, 0x080c, 0xa942,
++	0x01c0, 0x6864, 0x9086, 0x0139, 0x1128, 0x687b, 0x0005, 0x6883,
++	0x0000, 0x0028, 0x900e, 0x2001, 0x0005, 0x080c, 0x5d95, 0x080c,
++	0xac07, 0x080c, 0x5b76, 0x080c, 0x8f09, 0x9085, 0x0001, 0x00de,
++	0x0005, 0x9006, 0x0ce0, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7e,
++	0x000b, 0x0005, 0xa65a, 0xa67b, 0xa65c, 0xa69a, 0xa678, 0xa65a,
++	0xa61c, 0xa621, 0xa621, 0xa61c, 0xa61c, 0xa61c, 0xa61c, 0xa61c,
++	0xa61c, 0xa61c, 0x080c, 0x0d7e, 0x86ff, 0x11b8, 0x6020, 0x9086,
++	0x0006, 0x0198, 0x00d6, 0x6014, 0x2068, 0x080c, 0xa942, 0x0110,
++	0x080c, 0xac07, 0x00de, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023,
++	0x0002, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x9085, 0x0001, 0x0005,
++	0x080c, 0x1509, 0x0c08, 0x00e6, 0x2071, 0x1304, 0x7024, 0x9c06,
++	0x1110, 0x080c, 0x87a2, 0x6020, 0x9084, 0x000f, 0x9086, 0x0006,
++	0x1150, 0x0086, 0x0096, 0x2049, 0x0001, 0x2c40, 0x080c, 0x8968,
++	0x009e, 0x008e, 0x0010, 0x080c, 0x86b8, 0x00ee, 0x1928, 0x080c,
++	0xa61c, 0x0005, 0x0036, 0x00e6, 0x2071, 0x1304, 0x703c, 0x9c06,
++	0x1138, 0x901e, 0x080c, 0x8847, 0x00ee, 0x003e, 0x0804, 0xa65c,
++	0x080c, 0x8a8d, 0x00ee, 0x003e, 0x1904, 0xa65c, 0x080c, 0xa61c,
++	0x0005, 0x00c6, 0x6020, 0x9084, 0x000f, 0x0013, 0x00ce, 0x0005,
++	0xa6ce, 0xa759, 0xa8a3, 0xa6d9, 0x8f09, 0xa6ce, 0xbd15, 0x8ed9,
++	0xa759, 0xa6c7, 0xa90e, 0xa6c7, 0xa6c7, 0xa6c7, 0xa6c7, 0x080c,
++	0x0d7e, 0x080c, 0xab2e, 0x1110, 0x080c, 0x97dc, 0x0005, 0x080c,
++	0x79ab, 0x080c, 0x7aa4, 0x080c, 0x8ed9, 0x0005, 0x601b, 0x0001,
++	0x0005, 0x080c, 0xa942, 0x0120, 0x6014, 0x9080, 0x0025, 0x2c02,
++	0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7e, 0x000b, 0x0005, 0xa6f7,
++	0xa6f9, 0xa719, 0xa72b, 0xa738, 0xa6f7, 0xa6ce, 0xa6ce, 0xa6ce,
++	0xa72b, 0xa72b, 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7, 0xa735, 0x080c,
++	0x0d7e, 0x00e6, 0x6014, 0x2070, 0x7080, 0xc0b5, 0x7082, 0x2071,
++	0x1304, 0x7024, 0x9c06, 0x0190, 0x080c, 0x86b8, 0x6007, 0x0085,
++	0x6003, 0x000b, 0x6023, 0x0002, 0x2001, 0x12c1, 0x2004, 0x601a,
++	0x080c, 0x756e, 0x080c, 0x7aa4, 0x00ee, 0x0005, 0x601b, 0x0001,
++	0x0cd8, 0x00d6, 0x6014, 0x2068, 0x6880, 0xc0b5, 0x6882, 0x00de,
++	0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x756e,
++	0x080c, 0x7aa4, 0x0005, 0x00d6, 0x601b, 0x0001, 0x6014, 0x2068,
++	0x6880, 0xc0b5, 0x6882, 0x00de, 0x0005, 0x080c, 0x8ed9, 0x0005,
++	0x6014, 0x9005, 0x01d8, 0x9088, 0x001f, 0x210c, 0xd1e4, 0x01b0,
++	0x9080, 0x0021, 0x2004, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a,
++	0x2001, 0x0037, 0x2c08, 0x080c, 0x130c, 0x6000, 0x9086, 0x0004,
++	0x1120, 0x2009, 0x0048, 0x080c, 0x8f53, 0x0005, 0x080c, 0x1509,
++	0x0800, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7e, 0x000b, 0x0005,
++	0xa770, 0xa6d6, 0xa772, 0xa770, 0xa772, 0xa772, 0xa6cf, 0xa770,
++	0xa6c9, 0xa6c9, 0xa770, 0xa770, 0xa770, 0xa770, 0xa770, 0xa770,
++	0x080c, 0x0d7e, 0x6010, 0x00d6, 0x2068, 0x6804, 0x9084, 0x00ff,
++	0x00de, 0x908a, 0x000c, 0x1a0c, 0x0d7e, 0x000b, 0x0005, 0xa78b,
++	0xa849, 0xa78d, 0xa7cb, 0xa78d, 0xa7cb, 0xa78d, 0xa79b, 0xa78b,
++	0xa7cb, 0xa78b, 0xa7b7, 0x080c, 0x0d7e, 0x6004, 0x908e, 0x0016,
++	0x05a8, 0x908e, 0x0004, 0x0590, 0x908e, 0x0002, 0x0578, 0x908e,
++	0x0052, 0x0904, 0xa845, 0x6004, 0x080c, 0xab2e, 0x0904, 0xa862,
++	0x908e, 0x0021, 0x0904, 0xa866, 0x908e, 0x0022, 0x0904, 0xa862,
++	0x908e, 0x003d, 0x0904, 0xa866, 0x908e, 0x0039, 0x0904, 0xa86a,
++	0x908e, 0x0035, 0x0904, 0xa86a, 0x908e, 0x001e, 0x0188, 0x908e,
++	0x0001, 0x1150, 0x6010, 0x00d6, 0x2068, 0x6804, 0x9084, 0x00ff,
++	0x00de, 0x9086, 0x0006, 0x0110, 0x080c, 0x2862, 0x080c, 0x97dc,
++	0x080c, 0x8f09, 0x0005, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016,
++	0x0904, 0xa836, 0x9186, 0x0002, 0x15b8, 0x2001, 0x1136, 0x2004,
++	0xd08c, 0x1178, 0x080c, 0x62e4, 0x1160, 0x2001, 0x12a8, 0x2003,
++	0x0001, 0x2001, 0x1100, 0x2003, 0x0001, 0x080c, 0x621a, 0x0804,
++	0xa88c, 0x6010, 0x2068, 0x2001, 0x1136, 0x2004, 0xd0ac, 0x1904,
++	0xa88c, 0x68a0, 0xd0bc, 0x1904, 0xa88c, 0x6840, 0x9084, 0x00ff,
++	0x9005, 0x0190, 0x8001, 0x6842, 0x6017, 0x0000, 0x6023, 0x0007,
++	0x601b, 0x0398, 0x6043, 0x0000, 0x080c, 0x8e83, 0x0128, 0x2d00,
++	0x6012, 0x6023, 0x0001, 0x0450, 0x00de, 0x00ce, 0x6004, 0x908e,
++	0x0002, 0x11a8, 0x6010, 0x9080, 0x0028, 0x2004, 0x9086, 0x007e,
++	0x1170, 0x2009, 0x1136, 0x2104, 0xc085, 0x200a, 0x00e6, 0x2071,
++	0x1100, 0x080c, 0x5092, 0x00ee, 0x080c, 0x97dc, 0x0020, 0x080c,
++	0x97dc, 0x080c, 0x2862, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c,
++	0x2886, 0x012e, 0x00ee, 0x080c, 0x8f09, 0x0005, 0x2001, 0x0002,
++	0x080c, 0x5568, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x75be,
++	0x080c, 0x7aa4, 0x00de, 0x00ce, 0x0c80, 0x080c, 0x2886, 0x0804,
++	0xa7c6, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0d38, 0x6010,
++	0x2068, 0x6840, 0x9084, 0x00ff, 0x9005, 0x0904, 0xa80c, 0x8001,
++	0x6842, 0x6003, 0x0001, 0x080c, 0x75be, 0x080c, 0x7aa4, 0x00de,
++	0x00ce, 0x0898, 0x080c, 0x97dc, 0x0804, 0xa7c8, 0x080c, 0x9809,
++	0x0804, 0xa7c8, 0x00d6, 0x2c68, 0x6104, 0x080c, 0xaf4e, 0x00de,
++	0x0118, 0x080c, 0x8ed9, 0x00b8, 0x6004, 0x8007, 0x6134, 0x918c,
++	0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023,
++	0x0002, 0x603c, 0x600a, 0x2001, 0x12c1, 0x2004, 0x601a, 0x080c,
++	0x756e, 0x080c, 0x7aa4, 0x0005, 0x00de, 0x00ce, 0x080c, 0x97dc,
++	0x080c, 0x2862, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2886,
++	0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x6043, 0x0000,
++	0x012e, 0x00ee, 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7e,
++	0x00d6, 0x0013, 0x00de, 0x0005, 0xa8bc, 0xa8bc, 0xa8bc, 0xa8bc,
++	0xa8bc, 0xa8bc, 0xa8bc, 0xa8bc, 0xa8bc, 0xa6ce, 0xa8bc, 0xa6d6,
++	0xa8be, 0xa6d6, 0xa8cb, 0xa8bc, 0x080c, 0x0d7e, 0x6004, 0x9086,
++	0x008b, 0x0148, 0x6007, 0x008b, 0x6003, 0x000d, 0x080c, 0x756e,
++	0x080c, 0x7aa4, 0x0005, 0x080c, 0xab11, 0x080c, 0xa942, 0x0570,
++	0x080c, 0x2862, 0x080c, 0xa942, 0x0168, 0x6014, 0x2068, 0x6867,
++	0x0103, 0x687b, 0x0006, 0x6877, 0x0000, 0x6880, 0xc0ed, 0x6882,
++	0x080c, 0x5b76, 0x2c68, 0x080c, 0x8e83, 0x0150, 0x6810, 0x6012,
++	0x080c, 0xad70, 0x00c6, 0x2d60, 0x080c, 0x8f09, 0x00ce, 0x0008,
++	0x2d60, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003,
++	0x0001, 0x080c, 0x75be, 0x080c, 0x7aa4, 0x0078, 0x6034, 0x908c,
++	0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118,
++	0x080c, 0x2862, 0x08b8, 0x080c, 0x8f09, 0x0005, 0x6000, 0x908a,
++	0x0016, 0x1a0c, 0x0d7e, 0x000b, 0x0005, 0xa925, 0xa925, 0xa927,
++	0xa927, 0xa927, 0xa925, 0xa925, 0xa925, 0xa925, 0xa925, 0xa925,
++	0xa925, 0xa925, 0xa925, 0xa925, 0xa925, 0x080c, 0x0d7e, 0x080c,
++	0x8a8d, 0x6114, 0x2168, 0x687b, 0x0006, 0x080c, 0x5b76, 0x080c,
++	0x8ed9, 0x0005, 0x9284, 0x0007, 0x1158, 0x9282, 0x15c0, 0x0240,
++	0x2001, 0x1118, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001, 0x0005,
++	0x9006, 0x0ce8, 0x0026, 0x6214, 0x9294, 0xf000, 0x002e, 0x0005,
++	0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126, 0x2091, 0x8000, 0x2061,
++	0x15c0, 0x2071, 0x1100, 0x734c, 0x706c, 0x9302, 0x12a8, 0x6020,
++	0x9206, 0x1160, 0x080c, 0xacea, 0x0148, 0x080c, 0xab2e, 0x1110,
++	0x080c, 0x97dc, 0x00c6, 0x080c, 0x8ed9, 0x00ce, 0x9ce0, 0x0018,
++	0x7060, 0x9c02, 0x1208, 0x0c38, 0x012e, 0x000e, 0x003e, 0x00ce,
++	0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, 0x210c,
++	0x81ff, 0x0128, 0x2061, 0x1389, 0x6112, 0x080c, 0x2862, 0x9006,
++	0x0010, 0x9085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6,
++	0x0056, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x8e83, 0x005e,
++	0x0180, 0x6616, 0x6512, 0x080c, 0xad70, 0x6023, 0x0003, 0x2009,
++	0x004b, 0x080c, 0x8f53, 0x9085, 0x0001, 0x012e, 0x005e, 0x00ce,
++	0x0005, 0x9006, 0x0cd0, 0x00c6, 0x0056, 0x0126, 0x2091, 0x8000,
++	0x62a0, 0x00c6, 0x080c, 0x8f26, 0x005e, 0x0538, 0x6017, 0x0000,
++	0x6512, 0x080c, 0xad70, 0x6023, 0x0003, 0x0016, 0x00c6, 0x2560,
++	0x00ce, 0x080c, 0x76f0, 0x0076, 0x903e, 0x080c, 0x75ee, 0x2c08,
++	0x080c, 0xbec2, 0x007e, 0x001e, 0xd184, 0x0128, 0x080c, 0x8ed9,
++	0x9085, 0x0001, 0x0030, 0x2009, 0x004c, 0x080c, 0x8f53, 0x9085,
++	0x0001, 0x012e, 0x005e, 0x00ce, 0x0005, 0x9006, 0x0cd0, 0x00f6,
++	0x00c6, 0x0046, 0x00c6, 0x080c, 0x8e83, 0x2c78, 0x00ce, 0x0180,
++	0x7e16, 0x2c00, 0x7812, 0x7823, 0x0003, 0x2021, 0x0005, 0x080c,
++	0xaa35, 0x2f60, 0x2009, 0x004d, 0x080c, 0x8f53, 0x9085, 0x0001,
++	0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, 0x00c6,
++	0x080c, 0x8e83, 0x2c78, 0x00ce, 0x0178, 0x7e16, 0x2c00, 0x7812,
++	0x7823, 0x0003, 0x2021, 0x0005, 0x0481, 0x2f60, 0x2009, 0x004e,
++	0x080c, 0x8f53, 0x9085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005,
++	0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c, 0x8e83, 0x2c78, 0x00ce,
++	0x01c0, 0x7e16, 0x2c00, 0x7812, 0x7823, 0x0003, 0x2021, 0x0004,
++	0x00a1, 0x2001, 0x12a9, 0x2004, 0xd0fc, 0x0120, 0x2f60, 0x080c,
++	0x8ed9, 0x0028, 0x2f60, 0x2009, 0x0052, 0x080c, 0x8f53, 0x9085,
++	0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x0096, 0x0076, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x572a, 0x0158, 0x2001, 0xaa3a, 0x0006,
++	0x900e, 0x2400, 0x080c, 0x5d95, 0x080c, 0x5b76, 0x000e, 0x0807,
++	0x2418, 0x080c, 0x7947, 0x62a0, 0x0086, 0x2041, 0x0001, 0x2039,
++	0x0001, 0x2608, 0x080c, 0x7708, 0x008e, 0x080c, 0x75ee, 0x2f08,
++	0x2648, 0x080c, 0xbec2, 0x613c, 0x81ff, 0x090c, 0x77c0, 0x080c,
++	0x7aa4, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091,
++	0x8000, 0x00c6, 0x080c, 0x8e83, 0x001e, 0x0188, 0x660a, 0x6112,
++	0x080c, 0xad70, 0x6023, 0x0001, 0x2d00, 0x6016, 0x2009, 0x001f,
++	0x080c, 0x8f53, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006,
++	0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x8e83,
++	0x001e, 0x01b0, 0x660a, 0x6112, 0x080c, 0xad70, 0x6023, 0x0008,
++	0x2d00, 0x6016, 0x00f6, 0x2c78, 0x080c, 0x137e, 0x00fe, 0x2009,
++	0x0021, 0x080c, 0x8f53, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005,
++	0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c,
++	0x8e83, 0x001e, 0x0188, 0x660a, 0x6112, 0x080c, 0xad70, 0x6023,
++	0x0001, 0x2d00, 0x6016, 0x2009, 0x003d, 0x080c, 0x8f53, 0x9085,
++	0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126,
++	0x2091, 0x8000, 0x00c6, 0x080c, 0x8f26, 0x001e, 0x0180, 0x6112,
++	0x080c, 0xad70, 0x6023, 0x0001, 0x2d00, 0x6016, 0x2009, 0x0000,
++	0x080c, 0x8f53, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006,
++	0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x8e83,
++	0x001e, 0x0188, 0x660a, 0x6112, 0x080c, 0xad70, 0x6023, 0x0001,
++	0x2d00, 0x6016, 0x2009, 0x0044, 0x080c, 0x8f53, 0x9085, 0x0001,
++	0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091,
++	0x8000, 0x00c6, 0x080c, 0x8e83, 0x001e, 0x0188, 0x660a, 0x6112,
++	0x080c, 0xad70, 0x6023, 0x0001, 0x2d00, 0x6016, 0x2009, 0x0049,
++	0x080c, 0x8f53, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006,
++	0x0cd8, 0x0026, 0x00d6, 0x6210, 0x2268, 0x6a3c, 0x82ff, 0x0110,
++	0x8211, 0x6a3e, 0x00de, 0x002e, 0x0005, 0x0006, 0x0016, 0x6004,
++	0x908e, 0x0002, 0x0140, 0x908e, 0x0003, 0x0128, 0x908e, 0x0004,
++	0x0110, 0x9085, 0x0001, 0x001e, 0x000e, 0x0005, 0x0006, 0x00d6,
++	0x6014, 0x906d, 0x0148, 0x6864, 0x9086, 0x0139, 0x0138, 0x6868,
++	0xd0fc, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x00de, 0x000e,
++	0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x8e83,
++	0x001e, 0x0190, 0x6112, 0x080c, 0xad70, 0x6023, 0x0001, 0x2d00,
++	0x6016, 0x080c, 0x2862, 0x2009, 0x0028, 0x080c, 0x8f53, 0x9085,
++	0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015,
++	0x1188, 0x2011, 0x1122, 0x2204, 0x9086, 0x0074, 0x1158, 0x080c,
++	0x9bfa, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, 0x75be, 0x080c,
++	0x7aa4, 0x0070, 0x6014, 0x9080, 0x001a, 0x2004, 0xd0fc, 0x0148,
++	0x2001, 0x0001, 0x080c, 0xaf0f, 0x080c, 0x97dc, 0x080c, 0x8ed9,
++	0x0005, 0x00d6, 0x6014, 0x906d, 0x090c, 0x0d7e, 0x687b, 0x0030,
++	0x6883, 0x0000, 0x6897, 0x4005, 0x689b, 0x0004, 0x6867, 0x0139,
++	0x0126, 0x2091, 0x8000, 0x080c, 0x5b76, 0x012e, 0x00de, 0x080c,
++	0x8ed9, 0x0c30, 0x9186, 0x0016, 0x1128, 0x2001, 0x0004, 0x080c,
++	0x5568, 0x00e8, 0x9186, 0x0015, 0x1518, 0x2011, 0x1122, 0x2204,
++	0x9086, 0x0014, 0x11e8, 0x6010, 0x00d6, 0x2068, 0x080c, 0x56a8,
++	0x00de, 0x080c, 0x9cc9, 0x11a0, 0x6010, 0x00d6, 0x2068, 0x6890,
++	0x00de, 0x9005, 0x0168, 0x2001, 0x0006, 0x080c, 0x5568, 0x6014,
++	0x9080, 0x001a, 0x2004, 0xd0fc, 0x0170, 0x080c, 0x9275, 0x0050,
++	0x6014, 0x9080, 0x001a, 0x2004, 0xd0fc, 0x01d0, 0x080c, 0x97dc,
++	0x080c, 0x8ed9, 0x0005, 0x6014, 0x00d6, 0x906d, 0x090c, 0x0d7e,
++	0x687b, 0x0000, 0x6883, 0x0000, 0x6897, 0x4000, 0x0126, 0x2091,
++	0x8000, 0x080c, 0x5b76, 0x012e, 0x00de, 0x080c, 0x8ed9, 0x0c50,
++	0x6014, 0x00d6, 0x906d, 0x090c, 0x0d7e, 0x687b, 0x0030, 0x6883,
++	0x0000, 0x6897, 0x4005, 0x689b, 0x0004, 0x6867, 0x0139, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x5b76, 0x012e, 0x00de, 0x080c, 0x8ed9,
++	0x0888, 0x6878, 0x9086, 0x0005, 0x1108, 0x0009, 0x0005, 0x6880,
++	0xc0ad, 0x6882, 0x0005, 0x6043, 0x0000, 0x6017, 0x0000, 0x6003,
++	0x0001, 0x6007, 0x0050, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x0005,
++	0x00c6, 0x6010, 0x2004, 0xd0bc, 0x0120, 0x6020, 0x9084, 0x000f,
++	0x0013, 0x00ce, 0x0005, 0xa6ce, 0xac34, 0xac34, 0xac37, 0xc172,
++	0xc18d, 0xc190, 0xa6ce, 0xa6ce, 0xa6ce, 0xa6ce, 0xa6ce, 0xa6ce,
++	0xa6ce, 0xa6ce, 0x080c, 0x0d7e, 0xa001, 0xa001, 0x0005, 0x0009,
++	0x0005, 0x6010, 0x2004, 0xd0bc, 0x0550, 0x00f6, 0x2c78, 0x080c,
++	0x8e83, 0x1128, 0x2001, 0x12c2, 0x2004, 0x7842, 0x00f8, 0x7810,
++	0x6012, 0x080c, 0xad70, 0x7820, 0x9086, 0x0003, 0x0128, 0x7808,
++	0x603a, 0x2f00, 0x603e, 0x0020, 0x7808, 0x603e, 0x2f00, 0x603a,
++	0x602e, 0x6023, 0x0001, 0x6007, 0x0035, 0x6003, 0x0001, 0x7954,
++	0x6156, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x2f60, 0x00fe, 0x0005,
++	0x0016, 0x00f6, 0x6814, 0x2078, 0x787c, 0xd0e4, 0x0180, 0xc0e4,
++	0x787e, 0x7877, 0x0000, 0x7893, 0x0000, 0x788f, 0x0000, 0xd0cc,
++	0x0130, 0x7878, 0x00d6, 0x2068, 0x080c, 0x0edf, 0x00de, 0x6830,
++	0x6036, 0x908e, 0x0001, 0x0148, 0x6803, 0x0002, 0x9086, 0x0005,
++	0x0168, 0x9006, 0x602e, 0x6032, 0x00c8, 0x681c, 0xc085, 0x681e,
++	0x6803, 0x0004, 0x6824, 0xc0f4, 0xc0d5, 0x6826, 0x6814, 0x2078,
++	0x78ac, 0x6938, 0x9102, 0x78b0, 0x693c, 0x9103, 0x1e50, 0x683c,
++	0x602e, 0x6838, 0x9084, 0xfffc, 0x683a, 0x6032, 0x2d00, 0x603a,
++	0x6808, 0x603e, 0x6910, 0x6112, 0x6954, 0x6156, 0x6023, 0x0001,
++	0x6007, 0x0039, 0x6003, 0x0001, 0x080c, 0x756e, 0x080c, 0x7aa4,
++	0x00fe, 0x001e, 0x0005, 0x6024, 0xd0d4, 0x0510, 0xd0f4, 0x11f8,
++	0x6038, 0x940a, 0x603c, 0x9303, 0x0230, 0x9105, 0x0120, 0x6024,
++	0xc0d4, 0xc0f5, 0x0098, 0x643a, 0x633e, 0x6c3e, 0x6b42, 0x0046,
++	0x0036, 0x2400, 0x6cac, 0x9402, 0x6836, 0x2300, 0x6bb0, 0x9303,
++	0x683a, 0x003e, 0x004e, 0x6024, 0xc0d4, 0x0000, 0x6026, 0x0005,
++	0xd0f4, 0x1138, 0x683c, 0x603a, 0x6840, 0x603e, 0x6024, 0xc0f5,
++	0x6026, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, 0x0034, 0x01b8,
++	0x908e, 0x0035, 0x01a0, 0x908e, 0x0036, 0x0188, 0x908e, 0x0037,
++	0x0170, 0x908e, 0x0038, 0x0158, 0x908e, 0x0039, 0x0140, 0x908e,
++	0x003a, 0x0128, 0x908e, 0x003b, 0x0110, 0x9085, 0x0001, 0x001e,
++	0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x2001,
++	0x12bc, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, 0x73f0,
++	0x2001, 0x12c0, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001,
++	0x12be, 0x200c, 0x8000, 0x2014, 0x2071, 0x1297, 0x711a, 0x721e,
++	0x2001, 0x0064, 0x080c, 0x73f0, 0x2001, 0x12c1, 0x82ff, 0x1110,
++	0x2011, 0x0014, 0x2202, 0x2001, 0x12c2, 0x9288, 0x000a, 0x2102,
++	0x2001, 0x136b, 0x2102, 0x2001, 0x0032, 0x080c, 0x130c, 0x080c,
++	0x58af, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006,
++	0x0016, 0x00e6, 0x2001, 0x12c0, 0x2003, 0x0028, 0x2001, 0x12c1,
++	0x2003, 0x0014, 0x2071, 0x1297, 0x701b, 0x0000, 0x701f, 0x07d0,
++	0x2001, 0x12c2, 0x2009, 0x001e, 0x2102, 0x2001, 0x136b, 0x2102,
++	0x2001, 0x0032, 0x080c, 0x130c, 0x00ee, 0x001e, 0x000e, 0x0005,
++	0x00d6, 0x6058, 0x906d, 0x0110, 0x080c, 0x0ecf, 0x00de, 0x0005,
++	0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x8e83,
++	0x001e, 0x0178, 0x6112, 0x0ca1, 0x6023, 0x0001, 0x2d00, 0x6016,
++	0x2009, 0x0033, 0x080c, 0x8f53, 0x9085, 0x0001, 0x012e, 0x00ce,
++	0x0005, 0x9006, 0x0cd8, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0x1100,
++	0x9186, 0x0015, 0x11f8, 0x7088, 0x9086, 0x0018, 0x11d8, 0x6014,
++	0x2068, 0x6a3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x7c86, 0x01d0,
++	0x7074, 0x6a50, 0x9206, 0x1158, 0x7078, 0x6a54, 0x9206, 0x1138,
++	0x6210, 0x9290, 0x0028, 0x2214, 0x900e, 0x080c, 0x28a5, 0x080c,
++	0x9275, 0x0020, 0x080c, 0x97dc, 0x080c, 0x8ed9, 0x00fe, 0x00ee,
++	0x00de, 0x0005, 0x7058, 0x6a54, 0x9206, 0x0d50, 0x0c80, 0x00c6,
++	0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x8e83, 0x001e, 0x0180,
++	0x6112, 0x080c, 0xad70, 0x6023, 0x0001, 0x2d00, 0x6016, 0x2009,
++	0x004d, 0x080c, 0x8f53, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005,
++	0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0016, 0x00c6,
++	0x080c, 0x8e83, 0x001e, 0x0178, 0x6112, 0x080c, 0xad70, 0x6023,
++	0x0001, 0x2d00, 0x6016, 0x001e, 0x080c, 0x8f53, 0x9085, 0x0001,
++	0x012e, 0x00ce, 0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016, 0x0026,
++	0x0036, 0x0046, 0x0056, 0x0066, 0x00d6, 0x00e6, 0x00f6, 0x2071,
++	0x1100, 0x9186, 0x0015, 0x1538, 0x7188, 0x6014, 0x2068, 0x6814,
++	0x8003, 0x9106, 0x1500, 0x20e1, 0x0000, 0x2001, 0x12da, 0x2003,
++	0x0000, 0x6014, 0x20e9, 0x0001, 0x2068, 0x6830, 0x20a8, 0x9d80,
++	0x001b, 0x20a0, 0x2001, 0x12da, 0x0016, 0x200c, 0x080c, 0xb4ed,
++	0x001e, 0x6804, 0x9005, 0x0110, 0x2068, 0x0c78, 0x6014, 0x2070,
++	0x7067, 0x0103, 0x0010, 0x080c, 0x97dc, 0x080c, 0x8ed9, 0x00fe,
++	0x00ee, 0x00de, 0x006e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e,
++	0x0005, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0x1100, 0x9186, 0x0015,
++	0x11c0, 0x7088, 0x9086, 0x0004, 0x11a0, 0x6014, 0x90e8, 0x001b,
++	0x2c78, 0x080c, 0x7c86, 0x01a8, 0x7074, 0x6a08, 0x9206, 0x1130,
++	0x7078, 0x6a0c, 0x9206, 0x1110, 0x080c, 0x2862, 0x080c, 0x9275,
++	0x0020, 0x080c, 0x97dc, 0x080c, 0x8ed9, 0x00fe, 0x00ee, 0x00de,
++	0x0005, 0x7058, 0x6a0c, 0x9206, 0x0d78, 0x0c80, 0x00d6, 0x00e6,
++	0x00f6, 0x2071, 0x1100, 0x9186, 0x0015, 0x11f0, 0x7088, 0x9086,
++	0x0004, 0x11d0, 0x6014, 0x90e8, 0x0031, 0x2c78, 0x080c, 0x7c86,
++	0x0558, 0x7074, 0x6a08, 0x9206, 0x1130, 0x7078, 0x6a0c, 0x9206,
++	0x1110, 0x080c, 0x2862, 0x6014, 0x2068, 0x687b, 0x0000, 0x6883,
++	0x0000, 0x6897, 0x4000, 0x0050, 0x6014, 0x2068, 0x687b, 0x0030,
++	0x6883, 0x0000, 0x6897, 0x4005, 0x689b, 0x0004, 0x0126, 0x2091,
++	0x8000, 0x6867, 0x0139, 0x080c, 0x5b76, 0x012e, 0x080c, 0x8ed9,
++	0x00fe, 0x00ee, 0x00de, 0x0005, 0x7058, 0x6a0c, 0x9206, 0x09c8,
++	0x08d0, 0x0016, 0x0026, 0x687c, 0xd0ac, 0x0178, 0x6938, 0x6a34,
++	0x2100, 0x9205, 0x0150, 0x6890, 0x9106, 0x1118, 0x688c, 0x9206,
++	0x0120, 0x6992, 0x6a8e, 0x9085, 0x0001, 0x002e, 0x001e, 0x0005,
++	0x00d6, 0x0036, 0x6314, 0x2368, 0x687a, 0x6982, 0x929e, 0x4000,
++	0x1558, 0x6310, 0x00c6, 0x2360, 0x900e, 0x6868, 0xd0f4, 0x1140,
++	0x080c, 0x57d6, 0x1108, 0xc185, 0x6000, 0xd0bc, 0x0108, 0xc18d,
++	0x6a96, 0x699a, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x20e9, 0x0001,
++	0x9d80, 0x0031, 0x20a0, 0x9c80, 0x0006, 0x2098, 0x080c, 0x504f,
++	0x20a9, 0x0004, 0x9d80, 0x0035, 0x20a0, 0x9c80, 0x000a, 0x2098,
++	0x080c, 0x504f, 0x00ce, 0x00a0, 0x6a96, 0x3918, 0x9398, 0x0006,
++	0x231c, 0x6004, 0x9086, 0x0016, 0x0110, 0x689b, 0x0004, 0x6ba2,
++	0x6310, 0x00c6, 0x2360, 0x6004, 0x00ce, 0x9084, 0x00ff, 0x689e,
++	0x080c, 0x5b76, 0x6017, 0x0000, 0x003e, 0x00de, 0x0005, 0x0026,
++	0x0036, 0x0046, 0x00e6, 0x00d6, 0x00f6, 0x6214, 0x2268, 0x6210,
++	0x2270, 0x2079, 0x0260, 0x9096, 0x0000, 0x11a0, 0x7014, 0x9084,
++	0x00ff, 0x900e, 0x080c, 0x1f63, 0x2118, 0x831f, 0x939c, 0xff00,
++	0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, 0x2011, 0x8018, 0x080c,
++	0x3f23, 0x00a8, 0x9096, 0x0001, 0x1148, 0x8dff, 0x0180, 0x689b,
++	0x000d, 0x7838, 0x68a6, 0x783c, 0x68aa, 0x0048, 0x9096, 0x0002,
++	0x1130, 0x689b, 0x000d, 0x7838, 0x68a6, 0x783c, 0x68aa, 0x00fe,
++	0x00de, 0x00ee, 0x004e, 0x003e, 0x002e, 0x0005, 0x00c6, 0x0026,
++	0x0016, 0x9186, 0x0035, 0x0110, 0x6a38, 0x0008, 0x6a2c, 0x080c,
++	0xa932, 0x01f0, 0x2260, 0x6120, 0x9186, 0x0003, 0x0118, 0x9186,
++	0x0006, 0x1190, 0x6838, 0x9206, 0x0140, 0x683c, 0x9206, 0x1160,
++	0x6108, 0x6838, 0x9106, 0x1140, 0x0020, 0x6008, 0x693c, 0x9106,
++	0x1118, 0x6010, 0x6910, 0x9106, 0x001e, 0x002e, 0x00ce, 0x0005,
++	0x9085, 0x0001, 0x0cc8, 0x6974, 0xd1cc, 0x0188, 0x918c, 0x00ff,
++	0x918e, 0x0002, 0x1160, 0x69a8, 0x918c, 0x0f00, 0x810f, 0x918e,
++	0x0001, 0x1128, 0x6834, 0x6938, 0x9115, 0x190c, 0xa12c, 0x0005,
++	0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d7e, 0x0013, 0x006e,
++	0x0005, 0xafa9, 0xb5ee, 0xb74e, 0xafa9, 0xafa9, 0xafa9, 0xafa9,
++	0xafa9, 0xafe0, 0xb7d1, 0xafa9, 0xafa9, 0xafa9, 0xafa9, 0xafa9,
++	0xafa9, 0x080c, 0x0d7e, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c,
++	0x0d7e, 0x0013, 0x006e, 0x0005, 0xafc4, 0xbcae, 0xafc4, 0xafc4,
++	0xafc4, 0xafc4, 0xafc4, 0xafc4, 0xbc5d, 0xbd02, 0xafc4, 0xc2b5,
++	0xc2eb, 0xc2b5, 0xc2eb, 0xafc4, 0x080c, 0x0d7e, 0x6000, 0x9082,
++	0x0016, 0x1a0c, 0x0d7e, 0x6000, 0x000a, 0x0005, 0xafde, 0xb91e,
++	0xba17, 0xba39, 0xbaf9, 0xafde, 0xbbd0, 0xbb7b, 0xb7dd, 0xbc33,
++	0xbc48, 0xafde, 0xafde, 0xafde, 0xafde, 0xafde, 0x080c, 0x0d7e,
++	0x91b2, 0x0053, 0x1a0c, 0x0d7e, 0x2100, 0x91b2, 0x0040, 0x1a04,
++	0xb414, 0x0002, 0xb02a, 0xb214, 0xb02a, 0xb02a, 0xb02a, 0xb21d,
++	0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb02a,
++	0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb02a,
++	0xb02a, 0xb02c, 0xb087, 0xb096, 0xb0f8, 0xb122, 0xb1a0, 0xb1ff,
++	0xb02a, 0xb02a, 0xb220, 0xb02a, 0xb02a, 0xb235, 0xb242, 0xb02a,
++	0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb2c9, 0xb02a, 0xb02a, 0xb2d8,
++	0xb02a, 0xb02a, 0xb294, 0xb02a, 0xb02a, 0xb02a, 0xb2f0, 0xb02a,
++	0xb02a, 0xb02a, 0xb368, 0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb02a,
++	0xb02a, 0xb3dd, 0x080c, 0x0d7e, 0x080c, 0x588e, 0x1150, 0x2001,
++	0x1136, 0x2004, 0xd0cc, 0x1128, 0x9084, 0x0009, 0x9086, 0x0008,
++	0x1140, 0x6007, 0x0009, 0x602f, 0x0009, 0x6017, 0x0000, 0x0804,
++	0xb20d, 0x080c, 0x587e, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016,
++	0x6210, 0x2270, 0x72a0, 0x0026, 0x2019, 0x0029, 0x080c, 0x76f0,
++	0x0076, 0x903e, 0x080c, 0x75ee, 0x2c08, 0x080c, 0xbec2, 0x007e,
++	0x001e, 0x2e60, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610,
++	0x00c6, 0x2660, 0x080c, 0x5617, 0x00ce, 0x96b0, 0x0001, 0x2634,
++	0x9684, 0x00ff, 0x9082, 0x0006, 0x0278, 0x080c, 0xbe06, 0x1904,
++	0xb0f2, 0x080c, 0xbda3, 0x1120, 0x6007, 0x0008, 0x0804, 0xb20d,
++	0x6007, 0x0009, 0x0804, 0xb20d, 0x080c, 0xbfdb, 0x0128, 0x080c,
++	0xbe06, 0x0d78, 0x0804, 0xb0f2, 0x6017, 0x1900, 0x0c88, 0x080c,
++	0x297d, 0x1904, 0xb411, 0x6106, 0x080c, 0xbd61, 0x6007, 0x0006,
++	0x0804, 0xb20d, 0x6007, 0x0007, 0x0804, 0xb20d, 0x080c, 0xc327,
++	0x1904, 0xb411, 0x080c, 0x297d, 0x1904, 0xb411, 0x00d6, 0x6610,
++	0x2668, 0x6e04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x1220, 0x2001,
++	0x0001, 0x080c, 0x5556, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006,
++	0x0188, 0x9686, 0x0004, 0x0170, 0x6e04, 0x96b4, 0x00ff, 0x9686,
++	0x0006, 0x0140, 0x9686, 0x0004, 0x0128, 0x9686, 0x0005, 0x0110,
++	0x00de, 0x0480, 0x00e6, 0x2071, 0x0260, 0x7034, 0x90b4, 0x0003,
++	0x1138, 0x90b2, 0x0014, 0x0220, 0x7030, 0x9084, 0x0003, 0x0130,
++	0x00ee, 0x6017, 0x0000, 0x602f, 0x0007, 0x00b8, 0x00ee, 0x080c,
++	0xbe64, 0x1198, 0x9686, 0x0006, 0x1148, 0x0026, 0x6210, 0x9290,
++	0x0028, 0x2214, 0x900e, 0x080c, 0x28a5, 0x002e, 0x080c, 0x56a8,
++	0x6007, 0x000a, 0x00de, 0x0804, 0xb20d, 0x6007, 0x000b, 0x00de,
++	0x0804, 0xb20d, 0x080c, 0x2862, 0x6007, 0x0001, 0x0804, 0xb20d,
++	0x080c, 0xc327, 0x1904, 0xb411, 0x080c, 0x297d, 0x1904, 0xb411,
++	0x2071, 0x0260, 0x7034, 0x90b4, 0x0003, 0x1950, 0x90b2, 0x0014,
++	0x0a38, 0x7030, 0x9084, 0x0003, 0x1918, 0x6610, 0x00d6, 0x2668,
++	0x6e04, 0x00de, 0x9686, 0x0707, 0x09e8, 0x0026, 0x6210, 0x9290,
++	0x0028, 0x2214, 0x900e, 0x080c, 0x28a5, 0x002e, 0x6007, 0x000c,
++	0x0804, 0xb20d, 0x080c, 0x588e, 0x1140, 0x2001, 0x1136, 0x2004,
++	0x9084, 0x0009, 0x9086, 0x0008, 0x1110, 0x0804, 0xb039, 0x080c,
++	0x587e, 0x6610, 0x96b0, 0x0001, 0x2634, 0x9684, 0x00ff, 0x9082,
++	0x0006, 0x06e8, 0x1138, 0x0026, 0x2001, 0x0006, 0x080c, 0x5592,
++	0x002e, 0x0050, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0004, 0x0120,
++	0x9686, 0x0006, 0x1904, 0xb0f2, 0x080c, 0xbe71, 0x1120, 0x6007,
++	0x000e, 0x0804, 0xb20d, 0x0046, 0x6410, 0x94a0, 0x0028, 0x2424,
++	0x94a4, 0x00ff, 0x8427, 0x0046, 0x080c, 0x2862, 0x004e, 0x0016,
++	0x9006, 0x2009, 0x1153, 0x210c, 0xd1a4, 0x0158, 0x2009, 0x0029,
++	0x080c, 0xc12f, 0x6010, 0x00d6, 0x2068, 0x6800, 0xc0e5, 0x6802,
++	0x00de, 0x001e, 0x004e, 0x6007, 0x0001, 0x0804, 0xb20d, 0x2001,
++	0x0001, 0x080c, 0x5556, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9,
++	0x0004, 0x2019, 0x1105, 0x2011, 0x0270, 0x080c, 0x9d60, 0x003e,
++	0x002e, 0x001e, 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637,
++	0x9682, 0x0004, 0x0a04, 0xb0f2, 0x9682, 0x0007, 0x0a04, 0xb14c,
++	0x0804, 0xb0f2, 0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xb20d,
++	0x080c, 0x588e, 0x1140, 0x2001, 0x1136, 0x2004, 0x9084, 0x0009,
++	0x9086, 0x0008, 0x1110, 0x0804, 0xb039, 0x080c, 0x587e, 0x6610,
++	0x96b0, 0x0001, 0x2634, 0x9684, 0x00ff, 0x9082, 0x0006, 0x06b8,
++	0x96b4, 0xff00, 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006,
++	0x1904, 0xb0f2, 0x080c, 0xbe99, 0x1138, 0x080c, 0xbda3, 0x1120,
++	0x6007, 0x0010, 0x0804, 0xb20d, 0x0046, 0x6410, 0x94a0, 0x0028,
++	0x2424, 0x94a4, 0x00ff, 0x8427, 0x0046, 0x080c, 0x2862, 0x004e,
++	0x0016, 0x9006, 0x2009, 0x1153, 0x210c, 0xd1a4, 0x0158, 0x2009,
++	0x0029, 0x080c, 0xc12f, 0x6010, 0x00d6, 0x2068, 0x6800, 0xc0e5,
++	0x6802, 0x00de, 0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c,
++	0xbfdb, 0x0140, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0950,
++	0x0804, 0xb0f2, 0x6017, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c,
++	0x297d, 0x1904, 0xb411, 0x080c, 0xc327, 0x1904, 0xb411, 0x080c,
++	0xb588, 0x1904, 0xb0f2, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c,
++	0x75be, 0x080c, 0x7aa4, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001,
++	0x080c, 0x75be, 0x080c, 0x7aa4, 0x0cb0, 0x6007, 0x0005, 0x0c68,
++	0x080c, 0xc327, 0x1904, 0xb411, 0x080c, 0x297d, 0x1904, 0xb411,
++	0x080c, 0xb588, 0x1904, 0xb0f2, 0x6007, 0x0020, 0x6003, 0x0001,
++	0x080c, 0x75be, 0x080c, 0x7aa4, 0x0005, 0x080c, 0x297d, 0x1904,
++	0xb411, 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x75be, 0x080c,
++	0x7aa4, 0x0005, 0x080c, 0xc327, 0x1904, 0xb411, 0x080c, 0x297d,
++	0x1904, 0xb411, 0x080c, 0xb588, 0x1904, 0xb0f2, 0x0016, 0x0026,
++	0x00e6, 0x2071, 0x0260, 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08,
++	0x080c, 0xa932, 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188,
++	0x6010, 0x9190, 0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240,
++	0x2c08, 0x9006, 0x080c, 0xc101, 0x1180, 0x7244, 0x9286, 0xffff,
++	0x01b0, 0x2160, 0x6007, 0x0026, 0x6017, 0x1700, 0x7214, 0x9296,
++	0xffff, 0x1180, 0x6007, 0x0025, 0x0068, 0x6020, 0x9086, 0x0007,
++	0x1d80, 0x6004, 0x9086, 0x0024, 0x1110, 0x080c, 0x8ed9, 0x2160,
++	0x6007, 0x0025, 0x6003, 0x0001, 0x080c, 0x75be, 0x080c, 0x7aa4,
++	0x00ee, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x5556,
++	0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1105,
++	0x2011, 0x0276, 0x080c, 0x9d60, 0x003e, 0x002e, 0x001e, 0x015e,
++	0x0120, 0x6007, 0x0031, 0x0804, 0xb20d, 0x080c, 0x9a13, 0x080c,
++	0x62e4, 0x11b0, 0x0006, 0x0026, 0x0036, 0x080c, 0x6300, 0x1158,
++	0x2001, 0x12a8, 0x2003, 0x0001, 0x2001, 0x1100, 0x2003, 0x0001,
++	0x080c, 0x621a, 0x0010, 0x080c, 0x62be, 0x003e, 0x002e, 0x000e,
++	0x0005, 0x080c, 0x297d, 0x1904, 0xb411, 0x6106, 0x080c, 0xb5a4,
++	0x6007, 0x002b, 0x0804, 0xb20d, 0x6007, 0x002c, 0x0804, 0xb20d,
++	0x080c, 0xc327, 0x1904, 0xb411, 0x080c, 0x297d, 0x1904, 0xb411,
++	0x080c, 0xb588, 0x1904, 0xb0f2, 0x6106, 0x080c, 0xb5a8, 0x1120,
++	0x6007, 0x002e, 0x0804, 0xb20d, 0x6007, 0x002f, 0x0804, 0xb20d,
++	0x080c, 0x297d, 0x1904, 0xb411, 0x00e6, 0x00d6, 0x00c6, 0x6010,
++	0x9080, 0x0001, 0x200c, 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158,
++	0x9184, 0xff00, 0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de,
++	0x00ee, 0x0804, 0xb214, 0x2001, 0x1172, 0x2004, 0xd0e4, 0x0904,
++	0xb365, 0x2071, 0x026c, 0x7010, 0x603a, 0x7014, 0x603e, 0x7108,
++	0x720c, 0x080c, 0x58cb, 0x0140, 0x6010, 0x2068, 0x6810, 0x9106,
++	0x1118, 0x6814, 0x9206, 0x01f8, 0x080c, 0x58c6, 0x15a0, 0x2069,
++	0x1100, 0x6878, 0x9206, 0x1578, 0x6874, 0x9106, 0x1560, 0x7210,
++	0x080c, 0xa932, 0x0568, 0x080c, 0xc19f, 0x0550, 0x622e, 0x6007,
++	0x0036, 0x6003, 0x0001, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x00ce,
++	0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff, 0x0150, 0x080c,
++	0xa932, 0x01b0, 0x9280, 0x0002, 0x2004, 0x7110, 0x9106, 0x1180,
++	0x08f8, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c, 0xc101, 0x2c10,
++	0x2160, 0x0130, 0x08a8, 0x6007, 0x0037, 0x6017, 0x1500, 0x08c8,
++	0x6007, 0x0037, 0x6017, 0x1700, 0x08a0, 0x6007, 0x0012, 0x0888,
++	0x080c, 0x297d, 0x1904, 0xb411, 0x6010, 0x9080, 0x0001, 0x2004,
++	0x9084, 0xff00, 0x8007, 0x9086, 0x0006, 0x1904, 0xb214, 0x00e6,
++	0x00d6, 0x00c6, 0x2001, 0x1172, 0x2004, 0xd0e4, 0x0904, 0xb3d5,
++	0x2069, 0x1100, 0x2071, 0x026c, 0x7008, 0x603a, 0x720c, 0x623e,
++	0x9286, 0xffff, 0x1150, 0x7208, 0x00c6, 0x2c08, 0x9085, 0x0001,
++	0x080c, 0xc101, 0x2c10, 0x00ce, 0x0598, 0x080c, 0xa932, 0x0580,
++	0x00c6, 0x0026, 0x2260, 0x080c, 0xa5e6, 0x002e, 0x00ce, 0x7118,
++	0x918c, 0xff00, 0x810f, 0x9186, 0x0001, 0x0158, 0x9186, 0x0005,
++	0x0118, 0x9186, 0x0007, 0x1178, 0x9280, 0x0005, 0x2004, 0x9005,
++	0x0150, 0x0056, 0x7510, 0x7614, 0x080c, 0xc1b8, 0x005e, 0x00ce,
++	0x00de, 0x00ee, 0x0005, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017,
++	0x2a00, 0x6003, 0x0001, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x0c78,
++	0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x1700, 0x6003, 0x0001,
++	0x080c, 0x756e, 0x080c, 0x7aa4, 0x0c10, 0x6007, 0x003b, 0x602f,
++	0x000b, 0x6017, 0x0000, 0x0804, 0xb339, 0x00e6, 0x0026, 0x080c,
++	0x588e, 0x0548, 0x080c, 0x587e, 0x080c, 0xc392, 0x1510, 0x2071,
++	0x1100, 0x70d8, 0xc085, 0x70da, 0x00f6, 0x2079, 0x0100, 0x72a8,
++	0x9284, 0x00ff, 0x7076, 0x78e6, 0x9284, 0xff00, 0x7278, 0x9205,
++	0x707a, 0x78ea, 0x00fe, 0x70e3, 0x0000, 0x080c, 0x58cb, 0x0120,
++	0x2011, 0x131d, 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2679,
++	0x0010, 0x080c, 0xc3be, 0x002e, 0x00ee, 0x080c, 0x8ed9, 0x0804,
++	0xb213, 0x080c, 0x8ed9, 0x0005, 0x2600, 0x0002, 0xb428, 0xb428,
++	0xb428, 0xb428, 0xb428, 0xb42a, 0xb428, 0xb428, 0xb428, 0xb428,
++	0xb443, 0xb428, 0xb428, 0xb428, 0xb455, 0xb462, 0xb491, 0xb428,
++	0x080c, 0x0d7e, 0x080c, 0xc327, 0x1d20, 0x080c, 0x297d, 0x1d08,
++	0x080c, 0xb588, 0x1138, 0x6007, 0x0045, 0x6003, 0x0001, 0x080c,
++	0x75be, 0x0005, 0x080c, 0x2862, 0x6007, 0x0001, 0x6003, 0x0001,
++	0x080c, 0x75be, 0x0005, 0x080c, 0xc327, 0x1958, 0x080c, 0x297d,
++	0x1940, 0x080c, 0xb588, 0x1d70, 0x703c, 0x6016, 0x6007, 0x004a,
++	0x6003, 0x0001, 0x080c, 0x75be, 0x0005, 0x080c, 0xb496, 0x0904,
++	0xb411, 0x6007, 0x004e, 0x6003, 0x0001, 0x080c, 0x75be, 0x080c,
++	0x7aa4, 0x0005, 0x6007, 0x004f, 0x6017, 0x0000, 0x7134, 0x918c,
++	0x00ff, 0x81ff, 0x01f8, 0x9186, 0x0001, 0x1160, 0x7140, 0x2001,
++	0x12f4, 0x2004, 0x9106, 0x11a0, 0x7144, 0x2001, 0x12f5, 0x2004,
++	0x9106, 0x0180, 0x9186, 0x0002, 0x1158, 0x2011, 0x0276, 0x20a9,
++	0x0004, 0x6010, 0x6010, 0x9098, 0x000a, 0x080c, 0x9d60, 0x0110,
++	0x6017, 0x0001, 0x6003, 0x0001, 0x080c, 0x75be, 0x080c, 0x7aa4,
++	0x0005, 0x6007, 0x0050, 0x703c, 0x6016, 0x0ca0, 0x0016, 0x00d6,
++	0x00e6, 0x01c6, 0x01d6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1100,
++	0x7088, 0x908a, 0x00f9, 0x16c8, 0x20e1, 0x0000, 0x20e9, 0x0001,
++	0x2001, 0x12da, 0x2003, 0x0000, 0x080c, 0x0e9d, 0x0570, 0x2d00,
++	0x6016, 0x7088, 0x8004, 0x6816, 0x908a, 0x001e, 0x02b8, 0x6833,
++	0x001e, 0x20a9, 0x001e, 0x9d80, 0x001b, 0x20a0, 0x2001, 0x12da,
++	0x0016, 0x200c, 0x0451, 0x001e, 0x2d70, 0x080c, 0x0e9d, 0x01a8,
++	0x2d00, 0x7006, 0x2100, 0x81ff, 0x0168, 0x0c30, 0x6832, 0x20a8,
++	0x9d80, 0x001b, 0x20a0, 0x2001, 0x12da, 0x0016, 0x200c, 0x00a9,
++	0x001e, 0x0000, 0x9085, 0x0001, 0x0048, 0x2071, 0x1100, 0x708b,
++	0x0000, 0x6014, 0x2068, 0x080c, 0x0edf, 0x9006, 0x012e, 0x01de,
++	0x01ce, 0x00ee, 0x00de, 0x001e, 0x0005, 0x0006, 0x0016, 0x0026,
++	0x0036, 0x00c6, 0x918c, 0xffff, 0x11a8, 0x080c, 0x1b40, 0x2099,
++	0x026c, 0x2001, 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003,
++	0x00f8, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x1b40, 0x2099,
++	0x0260, 0x0ca8, 0x080c, 0x1b40, 0x2061, 0x12da, 0x6004, 0x2098,
++	0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0048, 0x20a8,
++	0x4003, 0x22a8, 0x8108, 0x080c, 0x1b40, 0x2099, 0x0260, 0x0ca8,
++	0x2061, 0x12da, 0x2019, 0x0280, 0x3300, 0x931e, 0x0110, 0x6006,
++	0x0020, 0x2001, 0x0260, 0x6006, 0x8108, 0x2162, 0x9292, 0x0021,
++	0x9296, 0xffff, 0x620a, 0x00ce, 0x003e, 0x002e, 0x001e, 0x000e,
++	0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00c6, 0x81ff, 0x11b8,
++	0x080c, 0x1b58, 0x20a1, 0x024c, 0x2001, 0x0014, 0x3518, 0x9312,
++	0x1218, 0x23a8, 0x4003, 0x0418, 0x20a8, 0x4003, 0x82ff, 0x01f8,
++	0x22a8, 0x8108, 0x080c, 0x1b58, 0x20a1, 0x0240, 0x0c98, 0x080c,
++	0x1b58, 0x2061, 0x12dd, 0x6004, 0x20a0, 0x6008, 0x3518, 0x9312,
++	0x1218, 0x23a8, 0x4003, 0x0058, 0x20a8, 0x4003, 0x82ff, 0x0138,
++	0x22a8, 0x8108, 0x080c, 0x1b58, 0x20a1, 0x0240, 0x0c98, 0x2061,
++	0x12dd, 0x2019, 0x0260, 0x3400, 0x931e, 0x0110, 0x6006, 0x0020,
++	0x2001, 0x0240, 0x6006, 0x8108, 0x2162, 0x9292, 0x0021, 0x9296,
++	0xffff, 0x620a, 0x00ce, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005,
++	0x00d6, 0x0066, 0x6610, 0x2668, 0x6e04, 0x96b4, 0xff00, 0x8637,
++	0x9686, 0x0006, 0x0170, 0x9686, 0x0004, 0x0158, 0x6e04, 0x96b4,
++	0x00ff, 0x9686, 0x0006, 0x0128, 0x9686, 0x0004, 0x0110, 0x9085,
++	0x0001, 0x006e, 0x00de, 0x0005, 0x00d6, 0x0441, 0x00de, 0x0005,
++	0x00d6, 0x0489, 0x11e8, 0x680c, 0x908c, 0xff00, 0x6820, 0x9084,
++	0x00ff, 0x9115, 0x6216, 0x6824, 0x602e, 0xd1e4, 0x0118, 0x2009,
++	0x0001, 0x0058, 0xd1ec, 0x0160, 0x6920, 0x918c, 0x00ff, 0x6824,
++	0x080c, 0x1f63, 0x1128, 0x2110, 0x900e, 0x080c, 0x28a5, 0x0018,
++	0x9085, 0x0001, 0x0008, 0x9006, 0x00de, 0x0005, 0x2069, 0x026d,
++	0x6800, 0x9082, 0x0010, 0x1228, 0x6017, 0x0000, 0x9085, 0x0001,
++	0x0008, 0x9006, 0x0005, 0x6017, 0x0000, 0x2069, 0x026c, 0x6808,
++	0x9084, 0xff00, 0x9086, 0x0800, 0x1140, 0x6800, 0x9084, 0x00ff,
++	0x908e, 0x0014, 0x0110, 0x908e, 0x0010, 0x0005, 0x6004, 0x90b2,
++	0x0053, 0x1a0c, 0x0d7e, 0x91b6, 0x0013, 0x1130, 0x2008, 0x91b2,
++	0x0040, 0x1a04, 0xb720, 0x0092, 0x91b6, 0x0027, 0x0120, 0x91b6,
++	0x0014, 0x190c, 0x0d7e, 0x2001, 0x0007, 0x080c, 0x5592, 0x080c,
++	0x79ab, 0x080c, 0x8f09, 0x080c, 0x7aa4, 0x0005, 0xb64e, 0xb650,
++	0xb64e, 0xb64e, 0xb64e, 0xb650, 0xb661, 0xb719, 0xb6b8, 0xb719,
++	0xb6cc, 0xb719, 0xb661, 0xb719, 0xb711, 0xb719, 0xb711, 0xb719,
++	0xb719, 0xb64e, 0xb64e, 0xb64e, 0xb64e, 0xb64e, 0xb64e, 0xb64e,
++	0xb64e, 0xb64e, 0xb64e, 0xb64e, 0xb650, 0xb64e, 0xb719, 0xb64e,
++	0xb64e, 0xb719, 0xb64e, 0xb716, 0xb719, 0xb64e, 0xb64e, 0xb64e,
++	0xb64e, 0xb719, 0xb719, 0xb64e, 0xb719, 0xb719, 0xb64e, 0xb65c,
++	0xb64e, 0xb64e, 0xb64e, 0xb64e, 0xb715, 0xb719, 0xb64e, 0xb64e,
++	0xb719, 0xb719, 0xb64e, 0xb64e, 0xb64e, 0xb64e, 0x080c, 0x0d7e,
++	0x080c, 0x79ab, 0x2001, 0x12c0, 0x2004, 0x601a, 0x6003, 0x0002,
++	0x080c, 0x7aa4, 0x0804, 0xb71f, 0x9006, 0x080c, 0x5556, 0x0804,
++	0xb719, 0x080c, 0x58c6, 0x1904, 0xb719, 0x9006, 0x080c, 0x5556,
++	0x6010, 0x9080, 0x0004, 0x2004, 0x9086, 0x00ff, 0x1140, 0x00f6,
++	0x2079, 0x1100, 0x78a0, 0x8000, 0x78a2, 0x00fe, 0x0438, 0x6010,
++	0x00c6, 0x2060, 0x6000, 0xd0f4, 0x1178, 0x6010, 0x9005, 0x0160,
++	0x0036, 0x0046, 0x63a0, 0x2021, 0x0007, 0x080c, 0x4026, 0x004e,
++	0x003e, 0x00ce, 0x0804, 0xb719, 0x00ce, 0x080c, 0x2982, 0x1904,
++	0xb719, 0x2001, 0x1100, 0x2004, 0x9086, 0x0002, 0x1138, 0x00f6,
++	0x2079, 0x1100, 0x78a0, 0x8000, 0x78a2, 0x00fe, 0x2001, 0x0002,
++	0x080c, 0x5568, 0x080c, 0x79ab, 0x6023, 0x0001, 0x6003, 0x0001,
++	0x6007, 0x0002, 0x080c, 0x75be, 0x080c, 0x7aa4, 0x6110, 0x00c6,
++	0x2160, 0x2009, 0x0001, 0x080c, 0x7206, 0x00ce, 0x0804, 0xb71f,
++	0x6610, 0x00d6, 0x2668, 0x6e04, 0x00de, 0x96b4, 0xff00, 0x8637,
++	0x9686, 0x0006, 0x0904, 0xb719, 0x9686, 0x0004, 0x0904, 0xb719,
++	0x2001, 0x0004, 0x0804, 0xb717, 0x2001, 0x1100, 0x2004, 0x9086,
++	0x0003, 0x1160, 0x0036, 0x0046, 0x6010, 0x9080, 0x0028, 0x201c,
++	0x2021, 0x0006, 0x080c, 0x4026, 0x004e, 0x003e, 0x2001, 0x0006,
++	0x080c, 0xb73d, 0x6610, 0x00d6, 0x2668, 0x6e04, 0x00de, 0x0066,
++	0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x006e, 0x0120, 0x2001,
++	0x0006, 0x080c, 0x5592, 0x080c, 0x58c6, 0x1518, 0x2001, 0x1136,
++	0x2004, 0xd0a4, 0x01f0, 0x00d6, 0x6610, 0x2668, 0x6e04, 0x00de,
++	0x96b4, 0x00ff, 0x9686, 0x0006, 0x01a0, 0x00f6, 0x2079, 0x1100,
++	0x78a0, 0x8000, 0x78a2, 0x00fe, 0x0804, 0xb69e, 0x2001, 0x0004,
++	0x0030, 0x2001, 0x0006, 0x0449, 0x0020, 0x0018, 0x0010, 0x080c,
++	0x5592, 0x080c, 0x79ab, 0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x0005,
++	0x2600, 0x0002, 0xb734, 0xb734, 0xb734, 0xb734, 0xb734, 0xb736,
++	0xb734, 0xb734, 0xb734, 0xb734, 0xb736, 0xb734, 0xb734, 0xb734,
++	0xb736, 0xb736, 0xb736, 0xb736, 0x080c, 0x0d7e, 0x080c, 0x79ab,
++	0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x0005, 0x0016, 0x00d6, 0x6110,
++	0x2168, 0x6900, 0xd184, 0x0138, 0x080c, 0x5568, 0x9006, 0x080c,
++	0x5556, 0x080c, 0x2886, 0x00de, 0x001e, 0x0005, 0x6610, 0x00d6,
++	0x2668, 0x6804, 0x9084, 0xff00, 0x8007, 0x00de, 0x90b2, 0x000c,
++	0x1a0c, 0x0d7e, 0x91b6, 0x0015, 0x1110, 0x003b, 0x0028, 0x91b6,
++	0x0016, 0x190c, 0x0d7e, 0x006b, 0x0005, 0x98b0, 0x98b0, 0x98b0,
++	0x98b0, 0x98b0, 0x98b0, 0xb7bb, 0xb77d, 0x98b0, 0x98b0, 0x98b0,
++	0x98b0, 0x98b0, 0x98b0, 0x98b0, 0x98b0, 0x98b0, 0x98b0, 0xb7bb,
++	0xb7c2, 0x98b0, 0x98b0, 0x98b0, 0x98b0, 0x00f6, 0x080c, 0x58c6,
++	0x11d8, 0x6010, 0x907d, 0x01c0, 0x7800, 0xd0f4, 0x1118, 0x7810,
++	0x9005, 0x1190, 0x9006, 0x080c, 0x5556, 0x2001, 0x0002, 0x080c,
++	0x5568, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c,
++	0x75be, 0x080c, 0x7aa4, 0x00e8, 0x2011, 0x0263, 0x2204, 0x8211,
++	0x220c, 0x080c, 0x1f63, 0x11a8, 0x00c6, 0x080c, 0x5608, 0x0120,
++	0x00ce, 0x080c, 0x8ed9, 0x0068, 0x6010, 0x0006, 0x6014, 0x0006,
++	0x080c, 0x5100, 0x000e, 0x6016, 0x000e, 0x6012, 0x00ce, 0x080c,
++	0x8ed9, 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110, 0x080c,
++	0x8ed9, 0x0005, 0x080c, 0x9bf7, 0x1148, 0x6003, 0x0001, 0x6007,
++	0x0001, 0x080c, 0x75be, 0x080c, 0x7aa4, 0x0010, 0x080c, 0x8ed9,
++	0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d7e, 0x080c, 0x79ab,
++	0x080c, 0x8f09, 0x080c, 0x7aa4, 0x0005, 0x9182, 0x0040, 0x0002,
++	0xb7f3, 0xb7f3, 0xb7f3, 0xb7f3, 0xb7f5, 0xb7f3, 0xb7f3, 0xb7f3,
++	0xb7f3, 0xb7f3, 0xb7f3, 0xb7f3, 0xb7f3, 0xb7f3, 0xb7f3, 0xb7f3,
++	0xb7f3, 0xb7f3, 0xb7f3, 0x080c, 0x0d7e, 0x00d6, 0x00e6, 0x00f6,
++	0x0046, 0x0026, 0x6210, 0x9280, 0x002b, 0x2004, 0x9005, 0x1190,
++	0x6106, 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, 0x0904, 0xb858,
++	0x9486, 0x2000, 0x1158, 0x2009, 0x0001, 0x2011, 0x0200, 0x080c,
++	0x73af, 0x0020, 0x9026, 0x080c, 0xc363, 0x0c50, 0x080c, 0x0eb6,
++	0x090c, 0x0d7e, 0x6003, 0x0007, 0x2d00, 0x6867, 0x010d, 0x9006,
++	0x6802, 0x686a, 0x6c8a, 0x2c00, 0x688e, 0x6008, 0x68e2, 0x6010,
++	0x2078, 0x78a0, 0x8007, 0x7130, 0x697a, 0x0016, 0x9084, 0xff00,
++	0x6876, 0x687f, 0x0000, 0x6883, 0x0000, 0x6887, 0x0036, 0x080c,
++	0x5b76, 0x001e, 0x9486, 0x2000, 0x1130, 0x2019, 0x0017, 0x080c,
++	0xc0b9, 0x0804, 0xb8b2, 0x9486, 0x0400, 0x1130, 0x2019, 0x0002,
++	0x080c, 0xc072, 0x0804, 0xb8b2, 0x9486, 0x0200, 0x1110, 0x080c,
++	0xc05a, 0x9486, 0x1000, 0x1110, 0x080c, 0xc0a1, 0x0804, 0xb8b2,
++	0x2069, 0x1354, 0x6a00, 0xd284, 0x0904, 0xb91a, 0x9284, 0x0300,
++	0x1904, 0xb913, 0x6804, 0x9005, 0x0904, 0xb8fb, 0x2d78, 0x6003,
++	0x0007, 0x080c, 0x0e9d, 0x0904, 0xb8bc, 0x7800, 0xd08c, 0x1118,
++	0x7804, 0x8001, 0x7806, 0x6017, 0x0000, 0x9006, 0x6802, 0x6867,
++	0x0116, 0x686a, 0x6008, 0x68e2, 0x2c00, 0x687a, 0x6010, 0x2078,
++	0x78a0, 0x8007, 0x7130, 0x69b6, 0x6876, 0x7928, 0x69ba, 0x792c,
++	0x69be, 0x7930, 0x69c2, 0x7934, 0x69c6, 0x6883, 0x003d, 0x7044,
++	0x9084, 0x0003, 0x9080, 0xb8b8, 0x2005, 0x687e, 0x20a9, 0x000a,
++	0x2001, 0x0270, 0x9d90, 0x0021, 0x2009, 0x0205, 0x200b, 0x0080,
++	0x20e1, 0x0000, 0x20e9, 0x0001, 0x2098, 0x22a0, 0x4003, 0x200b,
++	0x0000, 0x2001, 0x027a, 0x200c, 0x69b2, 0x8000, 0x200c, 0x69ae,
++	0x080c, 0x5b76, 0x002e, 0x004e, 0x00fe, 0x00ee, 0x00de, 0x0005,
++	0x0000, 0x0080, 0x0040, 0x0000, 0x2001, 0x110f, 0x2004, 0xd084,
++	0x0120, 0x080c, 0x0eb6, 0x1904, 0xb86d, 0x6017, 0x0100, 0x6003,
++	0x0001, 0x6007, 0x0041, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x0c10,
++	0x2069, 0x0260, 0x6848, 0x9084, 0xff00, 0x9086, 0x1200, 0x1198,
++	0x686c, 0x9084, 0x00ff, 0x0016, 0x6114, 0x918c, 0x0700, 0x910d,
++	0x6116, 0x001e, 0x6003, 0x0001, 0x6007, 0x0043, 0x080c, 0x756e,
++	0x080c, 0x7aa4, 0x0838, 0x6868, 0x602e, 0x686c, 0x6032, 0x6017,
++	0x0200, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x756e, 0x080c,
++	0x7aa4, 0x0804, 0xb8b2, 0x2001, 0x110d, 0x2004, 0xd0ec, 0x0120,
++	0x2011, 0x8049, 0x080c, 0x3f23, 0x6017, 0x0300, 0x0010, 0x6017,
++	0x0100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x756e, 0x080c,
++	0x7aa4, 0x0804, 0xb8b2, 0x6017, 0x0500, 0x0c98, 0x6017, 0x0600,
++	0x0804, 0xb8d0, 0x6017, 0x0200, 0x0804, 0xb8d0, 0x9186, 0x0013,
++	0x1160, 0x6004, 0x908a, 0x0054, 0x1a0c, 0x0d7e, 0x9082, 0x0040,
++	0x0a0c, 0x0d7e, 0x2008, 0x0804, 0xb9ca, 0x9186, 0x0051, 0x0140,
++	0x9186, 0x0047, 0x11e8, 0x6004, 0x9086, 0x0041, 0x0904, 0xb97e,
++	0x2001, 0x0109, 0x2004, 0xd084, 0x0904, 0xb97e, 0x0126, 0x2091,
++	0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x745c, 0x002e, 0x001e,
++	0x000e, 0x012e, 0x6000, 0x9086, 0x0002, 0x1580, 0x0804, 0xba17,
++	0x9186, 0x0027, 0x0530, 0x9186, 0x0048, 0x0128, 0x9186, 0x0014,
++	0x0500, 0x190c, 0x0d7e, 0x2001, 0x0109, 0x2004, 0xd084, 0x01f0,
++	0x00c6, 0x0126, 0x2091, 0x2800, 0x00c6, 0x2061, 0x0100, 0x0006,
++	0x0016, 0x0026, 0x080c, 0x745c, 0x002e, 0x001e, 0x000e, 0x00ce,
++	0x012e, 0x00ce, 0x6000, 0x9086, 0x0004, 0x190c, 0x0d7e, 0x0804,
++	0xbaf9, 0x6004, 0x9082, 0x0040, 0x2008, 0x001a, 0x080c, 0x8f6e,
++	0x0005, 0xb994, 0xb996, 0xb996, 0xb9ba, 0xb994, 0xb994, 0xb994,
++	0xb994, 0xb994, 0xb994, 0xb994, 0xb994, 0xb994, 0xb994, 0xb994,
++	0xb994, 0xb994, 0xb994, 0xb994, 0x080c, 0x0d7e, 0x080c, 0x79ab,
++	0x080c, 0x7aa4, 0x0036, 0x00d6, 0x6014, 0x906d, 0x01c0, 0x9d84,
++	0xf000, 0x01a8, 0x6003, 0x0002, 0x6010, 0x2004, 0xd0bc, 0x1178,
++	0x2019, 0x0004, 0x080c, 0xc0e9, 0x6017, 0x0000, 0x6018, 0x9005,
++	0x1120, 0x2001, 0x12c1, 0x2004, 0x601a, 0x6003, 0x0007, 0x00de,
++	0x003e, 0x0005, 0x00d6, 0x080c, 0x79ab, 0x080c, 0x7aa4, 0x080c,
++	0xa942, 0x0120, 0x6014, 0x2068, 0x080c, 0x0ecf, 0x080c, 0x8f09,
++	0x00de, 0x0005, 0x0002, 0xb9de, 0xb9fb, 0xb9e7, 0xba11, 0xb9de,
++	0xb9de, 0xb9de, 0xb9de, 0xb9de, 0xb9de, 0xb9de, 0xb9de, 0xb9de,
++	0xb9de, 0xb9de, 0xb9de, 0xb9de, 0xb9de, 0xb9de, 0x080c, 0x0d7e,
++	0x6014, 0x9088, 0x001f, 0x2104, 0x9085, 0x0400, 0x200a, 0x080c,
++	0x79ab, 0x6014, 0x9080, 0x001f, 0x2004, 0xd0b4, 0x0138, 0x6003,
++	0x0007, 0x2009, 0x0043, 0x080c, 0x8f53, 0x0010, 0x6003, 0x0004,
++	0x080c, 0x7aa4, 0x0005, 0x080c, 0x79ab, 0x6114, 0x9184, 0xf000,
++	0x0128, 0x9180, 0x001f, 0x200c, 0xd1ec, 0x1138, 0x080c, 0x7384,
++	0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x0005, 0x080c, 0xc32e, 0x0db0,
++	0x0cc8, 0x080c, 0x79ab, 0x2009, 0x0041, 0x0804, 0xbb7b, 0x9182,
++	0x0040, 0x0002, 0xba2d, 0xba2f, 0xba2d, 0xba2d, 0xba2d, 0xba2d,
++	0xba2d, 0xba2d, 0xba2d, 0xba2d, 0xba2d, 0xba2d, 0xba2d, 0xba2d,
++	0xba2d, 0xba2d, 0xba2d, 0xba30, 0xba2d, 0x080c, 0x0d7e, 0x0005,
++	0x00d6, 0x080c, 0x7384, 0x00de, 0x080c, 0xc381, 0x080c, 0x8ed9,
++	0x0005, 0x9182, 0x0040, 0x0002, 0xba4f, 0xba4f, 0xba4f, 0xba4f,
++	0xba4f, 0xba4f, 0xba4f, 0xba51, 0xba4f, 0xba54, 0xbac4, 0xba4f,
++	0xba4f, 0xba4f, 0xba4f, 0xbac4, 0xba4f, 0xba4f, 0xba4f, 0x080c,
++	0x0d7e, 0x080c, 0x8f6e, 0x0005, 0x2001, 0x0105, 0x2004, 0x9084,
++	0x1800, 0x01c8, 0x2001, 0x0132, 0x200c, 0x2001, 0x0131, 0x2004,
++	0x9105, 0x1904, 0xbac4, 0x2009, 0x110c, 0x2104, 0xd0d4, 0x0904,
++	0xbac4, 0xc0d4, 0x200a, 0x2009, 0x0105, 0x2104, 0x9084, 0xe7fd,
++	0x9085, 0x0010, 0x200a, 0x2001, 0x1172, 0x2004, 0xd0e4, 0x1528,
++	0x603b, 0x0000, 0x080c, 0x7a55, 0x6014, 0x00d6, 0x2068, 0x687c,
++	0xd0fc, 0x0188, 0x908c, 0x0003, 0x918e, 0x0002, 0x0508, 0x2001,
++	0x110c, 0x2004, 0xd0d4, 0x11e0, 0x080c, 0x7b69, 0x2009, 0x0041,
++	0x00de, 0x0804, 0xbb7b, 0x080c, 0x7b69, 0x6003, 0x0007, 0x601b,
++	0x0000, 0x080c, 0x7384, 0x00de, 0x0005, 0x2001, 0x0100, 0x2004,
++	0x9082, 0x0005, 0x0aa8, 0x2001, 0x011f, 0x2004, 0x603a, 0x0890,
++	0x2001, 0x110c, 0x200c, 0xc1d4, 0x2102, 0xd1cc, 0x0110, 0x080c,
++	0x2369, 0x080c, 0x7b69, 0x6014, 0x9080, 0x001f, 0x200c, 0xd1ec,
++	0x1130, 0x080c, 0x7384, 0x080c, 0x8ed9, 0x00de, 0x0005, 0x080c,
++	0xc32e, 0x0db8, 0x00de, 0x0005, 0x2001, 0x110c, 0x200c, 0xc1d4,
++	0x2102, 0x0036, 0x080c, 0x7a55, 0x080c, 0x7b69, 0x6014, 0x00d6,
++	0x2068, 0x6010, 0x2004, 0xd0bc, 0x0188, 0x687c, 0x9084, 0x0003,
++	0x9086, 0x0002, 0x0140, 0x68ac, 0x6330, 0x931a, 0x6332, 0x68b0,
++	0x632c, 0x931b, 0x632e, 0x6003, 0x0002, 0x0080, 0x2019, 0x0004,
++	0x080c, 0xc0e9, 0x6018, 0x9005, 0x1128, 0x2001, 0x12c1, 0x2004,
++	0x8003, 0x601a, 0x6017, 0x0000, 0x6003, 0x0007, 0x00de, 0x003e,
++	0x0005, 0x9182, 0x0040, 0x0002, 0xbb10, 0xbb10, 0xbb10, 0xbb10,
++	0xbb10, 0xbb10, 0xbb10, 0xbb10, 0xbb12, 0xbb10, 0xbb10, 0xbb10,
++	0xbb10, 0xbb10, 0xbb10, 0xbb10, 0xbb10, 0xbb10, 0xbb10, 0xbb57,
++	0x080c, 0x0d7e, 0x6014, 0x00d6, 0x2068, 0x6834, 0x6a38, 0x6110,
++	0x210c, 0xd1bc, 0x1190, 0x920d, 0x1518, 0x687c, 0xd0fc, 0x0128,
++	0x2009, 0x0041, 0x00de, 0x0804, 0xbb7b, 0x6003, 0x0007, 0x601b,
++	0x0000, 0x080c, 0x7384, 0x00de, 0x0005, 0x6124, 0xd1f4, 0x1d58,
++	0x0006, 0x0046, 0x6cac, 0x9422, 0x69b0, 0x2200, 0x910b, 0x6030,
++	0x9420, 0x6432, 0x602c, 0x9109, 0x612e, 0x004e, 0x000e, 0x08d8,
++	0x6110, 0x210c, 0xd1bc, 0x1178, 0x2009, 0x110d, 0x210c, 0xd19c,
++	0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006, 0x00e9, 0x080c,
++	0x7386, 0x00de, 0x0005, 0x6003, 0x0002, 0x00de, 0x0005, 0x6024,
++	0xd0f4, 0x0128, 0x080c, 0x1303, 0x1904, 0xbb12, 0x0005, 0x6014,
++	0x00d6, 0x2068, 0x6834, 0x6938, 0x00de, 0x9105, 0x1120, 0x080c,
++	0x1303, 0x1904, 0xbb12, 0x0005, 0xd2fc, 0x0140, 0x8002, 0x8000,
++	0x8212, 0x9291, 0x0000, 0x2009, 0x0009, 0x0010, 0x2009, 0x0015,
++	0x6a9a, 0x6896, 0x0005, 0x9182, 0x0040, 0x0208, 0x0062, 0x9186,
++	0x0013, 0x0120, 0x9186, 0x0014, 0x190c, 0x0d7e, 0x6024, 0xd0dc,
++	0x090c, 0x0d7e, 0x0005, 0xbb9e, 0xbba5, 0xbbb1, 0xbbbd, 0xbb9e,
++	0xbb9e, 0xbb9e, 0xbbcc, 0xbb9e, 0xbba0, 0xbba0, 0xbb9e, 0xbb9e,
++	0xbb9e, 0xbb9e, 0xbba0, 0xbb9e, 0xbba0, 0xbb9e, 0x080c, 0x0d7e,
++	0x6024, 0xd0dc, 0x090c, 0x0d7e, 0x0005, 0x6003, 0x0001, 0x6106,
++	0x080c, 0x756e, 0x0126, 0x2091, 0x8000, 0x080c, 0x7aa4, 0x012e,
++	0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x756e, 0x0126, 0x2091,
++	0x8000, 0x080c, 0x7aa4, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106,
++	0x2c10, 0x080c, 0x1605, 0x0126, 0x2091, 0x8000, 0x080c, 0x75db,
++	0x080c, 0x7b72, 0x012e, 0x0005, 0x9016, 0x080c, 0x137c, 0x0005,
++	0x0126, 0x2091, 0x8000, 0x0036, 0x00d6, 0x9182, 0x0040, 0x0023,
++	0x00de, 0x003e, 0x012e, 0x0005, 0xbbec, 0xbbee, 0xbc00, 0xbc1a,
++	0xbbec, 0xbbec, 0xbbec, 0xbc2f, 0xbbec, 0xbbec, 0xbbec, 0xbbec,
++	0xbbec, 0xbbec, 0xbbec, 0xbbec, 0x080c, 0x0d7e, 0x6014, 0x2068,
++	0x687c, 0xd0fc, 0x01f8, 0x909c, 0x0003, 0x939e, 0x0003, 0x01d0,
++	0x6003, 0x0001, 0x6106, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x0490,
++	0x6014, 0x2068, 0x687c, 0xd0fc, 0x0168, 0x909c, 0x0003, 0x939e,
++	0x0003, 0x0140, 0x6003, 0x0001, 0x6106, 0x080c, 0x756e, 0x080c,
++	0x7aa4, 0x0400, 0x901e, 0x6316, 0x631a, 0x2019, 0x0004, 0x080c,
++	0xc0e9, 0x00c0, 0x6014, 0x2068, 0x687c, 0xd0fc, 0x0d98, 0x909c,
++	0x0003, 0x939e, 0x0003, 0x0d70, 0x6003, 0x0003, 0x6106, 0x2c10,
++	0x080c, 0x1605, 0x080c, 0x75db, 0x080c, 0x7b72, 0x0018, 0x9016,
++	0x080c, 0x137c, 0x0005, 0x080c, 0x79ab, 0x6114, 0x81ff, 0x0158,
++	0x00d6, 0x2168, 0x080c, 0xc3c7, 0x0036, 0x2019, 0x0029, 0x080c,
++	0xc0e9, 0x003e, 0x00de, 0x080c, 0x8f09, 0x080c, 0x7aa4, 0x0005,
++	0x080c, 0x7a55, 0x6114, 0x81ff, 0x0158, 0x00d6, 0x2168, 0x080c,
++	0xc3c7, 0x0036, 0x2019, 0x0029, 0x080c, 0xc0e9, 0x003e, 0x00de,
++	0x080c, 0x8f09, 0x080c, 0x7b72, 0x0005, 0x9182, 0x0085, 0x0002,
++	0xbc6f, 0xbc6d, 0xbc6d, 0xbc7b, 0xbc6d, 0xbc6d, 0xbc6d, 0xbc6d,
++	0xbc6d, 0xbc6d, 0xbc6d, 0xbc6d, 0xbc6d, 0x080c, 0x0d7e, 0x6003,
++	0x000b, 0x6106, 0x080c, 0x756e, 0x0126, 0x2091, 0x8000, 0x080c,
++	0x7aa4, 0x012e, 0x0005, 0x0026, 0x00e6, 0x080c, 0xc327, 0x0118,
++	0x080c, 0x8ed9, 0x0440, 0x2071, 0x0260, 0x7224, 0x6216, 0x2001,
++	0x110d, 0x2004, 0xd0e4, 0x0150, 0x6010, 0x9080, 0x0028, 0x2024,
++	0x8427, 0x2c00, 0x2011, 0x014e, 0x080c, 0x91b2, 0x7220, 0x080c,
++	0xbf8f, 0x0118, 0x6007, 0x0086, 0x0040, 0x6007, 0x0087, 0x7224,
++	0x9296, 0xffff, 0x1110, 0x6007, 0x0086, 0x6003, 0x0001, 0x080c,
++	0x756e, 0x080c, 0x7aa4, 0x00ee, 0x002e, 0x0005, 0x9186, 0x0013,
++	0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d7e, 0x908a, 0x0092,
++	0x1a0c, 0x0d7e, 0x9082, 0x0085, 0x00a2, 0x9186, 0x0027, 0x0130,
++	0x9186, 0x0014, 0x0118, 0x080c, 0x8f6e, 0x0050, 0x2001, 0x0007,
++	0x080c, 0x5592, 0x080c, 0x79ab, 0x080c, 0x8f09, 0x080c, 0x7aa4,
++	0x0005, 0xbcde, 0xbce0, 0xbce0, 0xbcde, 0xbcde, 0xbcde, 0xbcde,
++	0xbcde, 0xbcde, 0xbcde, 0xbcde, 0xbcde, 0xbcde, 0x080c, 0x0d7e,
++	0x080c, 0x79ab, 0x080c, 0x8f09, 0x080c, 0x7aa4, 0x0005, 0x9182,
++	0x0085, 0x0a0c, 0x0d7e, 0x9182, 0x0092, 0x1a0c, 0x0d7e, 0x9182,
++	0x0085, 0x0002, 0xbcff, 0xbcff, 0xbcff, 0xbd01, 0xbcff, 0xbcff,
++	0xbcff, 0xbcff, 0xbcff, 0xbcff, 0xbcff, 0xbcff, 0xbcff, 0x080c,
++	0x0d7e, 0x0005, 0x9186, 0x0013, 0x0148, 0x9186, 0x0014, 0x0130,
++	0x9186, 0x0027, 0x0118, 0x080c, 0x8f6e, 0x0030, 0x080c, 0x79ab,
++	0x080c, 0x8f09, 0x080c, 0x7aa4, 0x0005, 0x0036, 0x080c, 0xc381,
++	0x6043, 0x0000, 0x2019, 0x000b, 0x0031, 0x6023, 0x0006, 0x6003,
++	0x0007, 0x003e, 0x0005, 0x0126, 0x0036, 0x2091, 0x8000, 0x0086,
++	0x2c40, 0x0096, 0x904e, 0x080c, 0x8968, 0x009e, 0x008e, 0x1570,
++	0x0076, 0x2c38, 0x080c, 0x8a0a, 0x007e, 0x1540, 0x6000, 0x9086,
++	0x0000, 0x0520, 0x6020, 0x9086, 0x0007, 0x0500, 0x00d6, 0x601c,
++	0xd084, 0x0150, 0x080c, 0xc381, 0x2001, 0x12c0, 0x2004, 0x601a,
++	0x080c, 0x1509, 0x6023, 0x0007, 0x6014, 0x2068, 0x080c, 0xa942,
++	0x0110, 0x080c, 0xc0e9, 0x00de, 0x6017, 0x0000, 0x080c, 0xc381,
++	0x6023, 0x0007, 0x2001, 0x12c0, 0x2004, 0x601a, 0x003e, 0x012e,
++	0x0005, 0x00f6, 0x00c6, 0x0036, 0x0156, 0x2079, 0x0260, 0x7938,
++	0x783c, 0x080c, 0x1f63, 0x1590, 0x0016, 0x00c6, 0x080c, 0x5608,
++	0x1558, 0x001e, 0x002e, 0x0026, 0x0016, 0x2019, 0x0029, 0x080c,
++	0x8ac9, 0x080c, 0x76f0, 0x0076, 0x903e, 0x080c, 0x75ee, 0x007e,
++	0x001e, 0x0076, 0x903e, 0x080c, 0xbec2, 0x007e, 0x0026, 0x6204,
++	0x9294, 0xff00, 0x8217, 0x9286, 0x0006, 0x0118, 0x9286, 0x0004,
++	0x1118, 0x62a0, 0x080c, 0x2915, 0x002e, 0x001e, 0x080c, 0x5100,
++	0x6612, 0x6516, 0x9006, 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e,
++	0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x2009,
++	0x1122, 0x2104, 0x9086, 0x0074, 0x1904, 0xbdfb, 0x2069, 0x0260,
++	0x6944, 0x9182, 0x0100, 0x06d8, 0x6940, 0x9184, 0x8000, 0x0904,
++	0xbdf8, 0x2001, 0x12a7, 0x2004, 0x9005, 0x1160, 0x6010, 0x2070,
++	0x7010, 0x9084, 0x00ff, 0x0118, 0x7000, 0xd0f4, 0x0118, 0x9184,
++	0x0800, 0x0570, 0x6948, 0x918a, 0x0001, 0x0620, 0x694c, 0x2009,
++	0x0205, 0x200b, 0x0001, 0x693c, 0x81ff, 0x1198, 0x6944, 0x9182,
++	0x0100, 0x02a8, 0x6940, 0x81ff, 0x1178, 0x6948, 0x918a, 0x0001,
++	0x0288, 0x6950, 0x918a, 0x0001, 0x0298, 0x00d0, 0x6017, 0x0100,
++	0x00a0, 0x6017, 0x0300, 0x0088, 0x6017, 0x0500, 0x0070, 0x6017,
++	0x0700, 0x0058, 0x6017, 0x0900, 0x0040, 0x6017, 0x0b00, 0x0028,
++	0x6017, 0x0f00, 0x0010, 0x6017, 0x2d00, 0x9085, 0x0001, 0x0008,
++	0x9006, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6,
++	0x0026, 0x0036, 0x0156, 0x6210, 0x2268, 0x6b04, 0x9394, 0x00ff,
++	0x9286, 0x0006, 0x0190, 0x9286, 0x0004, 0x0178, 0x9394, 0xff00,
++	0x8217, 0x9286, 0x0006, 0x0148, 0x9286, 0x0004, 0x0130, 0x00c6,
++	0x2d60, 0x080c, 0x5617, 0x00ce, 0x04c0, 0x2011, 0x0276, 0x20a9,
++	0x0004, 0x9d98, 0x000a, 0x080c, 0x9d60, 0x1580, 0x2011, 0x027a,
++	0x20a9, 0x0004, 0x9d98, 0x0006, 0x080c, 0x9d60, 0x1538, 0x0046,
++	0x0016, 0x6aa0, 0x9294, 0x00ff, 0x8227, 0x9006, 0x2009, 0x1153,
++	0x210c, 0xd1a4, 0x0138, 0x2009, 0x0029, 0x080c, 0xc12f, 0x6800,
++	0xc0e5, 0x6802, 0x2019, 0x0029, 0x080c, 0x76f0, 0x0076, 0x2039,
++	0x0000, 0x080c, 0x75ee, 0x2c08, 0x080c, 0xbec2, 0x007e, 0x2001,
++	0x0007, 0x080c, 0x5592, 0x001e, 0x004e, 0x9006, 0x015e, 0x003e,
++	0x002e, 0x00de, 0x00ce, 0x0005, 0x00d6, 0x2069, 0x026e, 0x6800,
++	0x9086, 0x0800, 0x0118, 0x6017, 0x0000, 0x0008, 0x9006, 0x00de,
++	0x0005, 0x00c6, 0x00f6, 0x0016, 0x0026, 0x0036, 0x0156, 0x2079,
++	0x026c, 0x7930, 0x7834, 0x080c, 0x1f63, 0x11a0, 0x080c, 0x5608,
++	0x1188, 0x2011, 0x0270, 0x20a9, 0x0004, 0x9c98, 0x000a, 0x080c,
++	0x9d60, 0x1140, 0x2011, 0x0274, 0x20a9, 0x0004, 0x9c98, 0x0006,
++	0x080c, 0x9d60, 0x015e, 0x003e, 0x002e, 0x001e, 0x00fe, 0x00ce,
++	0x0005, 0x00c6, 0x0006, 0x0016, 0x0026, 0x0036, 0x0156, 0x2011,
++	0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x1f63, 0x11a0, 0x080c,
++	0x5608, 0x1188, 0x2011, 0x0276, 0x20a9, 0x0004, 0x9c98, 0x000a,
++	0x080c, 0x9d60, 0x1140, 0x2011, 0x027a, 0x20a9, 0x0004, 0x9c98,
++	0x0006, 0x080c, 0x9d60, 0x015e, 0x003e, 0x002e, 0x001e, 0x000e,
++	0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0056,
++	0x0046, 0x0026, 0x0126, 0x2091, 0x8000, 0x2740, 0x2029, 0x130d,
++	0x252c, 0x2021, 0x1313, 0x2424, 0x2061, 0x15c0, 0x2071, 0x1100,
++	0x764c, 0x706c, 0x81ff, 0x0150, 0x0006, 0x9186, 0x1389, 0x000e,
++	0x0128, 0x8001, 0x9602, 0x1a04, 0xbf4b, 0x0018, 0x9606, 0x0904,
++	0xbf4b, 0x2100, 0x9c06, 0x0904, 0xbf42, 0x080c, 0xc15b, 0x0904,
++	0xbf42, 0x6720, 0x9786, 0x0001, 0x1148, 0x080c, 0x2982, 0x0904,
++	0xbf66, 0x6004, 0x9086, 0x0000, 0x1904, 0xbf66, 0x9786, 0x0004,
++	0x0904, 0xbf66, 0x9786, 0x0007, 0x05e8, 0x2500, 0x9c06, 0x05d0,
++	0x2400, 0x9c06, 0x05b8, 0x080c, 0xc16b, 0x15a0, 0x88ff, 0x0118,
++	0x6054, 0x9906, 0x1578, 0x00d6, 0x6000, 0x9086, 0x0004, 0x1120,
++	0x0016, 0x080c, 0x1509, 0x001e, 0x9786, 0x0008, 0x1148, 0x080c,
++	0xab2e, 0x1130, 0x080c, 0x97dc, 0x00de, 0x080c, 0x8f09, 0x00d0,
++	0x6014, 0x2068, 0x080c, 0xa942, 0x0190, 0x9786, 0x0003, 0x1528,
++	0x6867, 0x0103, 0x6b7a, 0x6877, 0x0000, 0x080c, 0xc3c7, 0x0016,
++	0x080c, 0xac01, 0x080c, 0x5b76, 0x001e, 0x080c, 0xab11, 0x00de,
++	0x080c, 0x8f09, 0x9ce0, 0x0018, 0x2001, 0x1118, 0x2004, 0x9c02,
++	0x1210, 0x0804, 0xbed6, 0x012e, 0x002e, 0x004e, 0x005e, 0x006e,
++	0x007e, 0x008e, 0x00ce, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1150,
++	0x9386, 0x0005, 0x0128, 0x080c, 0xc3c7, 0x080c, 0xc0e9, 0x08f8,
++	0x00de, 0x0c00, 0x9786, 0x000a, 0x0968, 0x0850, 0x080c, 0xc16b,
++	0x19c8, 0x81ff, 0x09b8, 0x9180, 0x0001, 0x2004, 0x9086, 0x0018,
++	0x0130, 0x9180, 0x0001, 0x2004, 0x9086, 0x002d, 0x1958, 0x6000,
++	0x9086, 0x0002, 0x1938, 0x080c, 0xab1d, 0x0130, 0x080c, 0xab2e,
++	0x1908, 0x080c, 0x97dc, 0x0038, 0x080c, 0x2886, 0x080c, 0xab2e,
++	0x1110, 0x080c, 0x97dc, 0x080c, 0x8f09, 0x0804, 0xbf42, 0x00c6,
++	0x00e6, 0x0016, 0x2c08, 0x2170, 0x9006, 0x080c, 0xc101, 0x001e,
++	0x0120, 0x6020, 0x9084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005,
++	0xbfae, 0xbfae, 0xbfae, 0xbfae, 0xbfae, 0xbfae, 0xbfb0, 0xbfae,
++	0xbfae, 0xbfae, 0xbfae, 0x8f09, 0x8f09, 0xbfae, 0x9006, 0x0005,
++	0x0046, 0x0016, 0x7010, 0x9080, 0x0028, 0x2024, 0x94a4, 0x00ff,
++	0x8427, 0x2c00, 0x2009, 0x0020, 0x080c, 0xc12f, 0x001e, 0x004e,
++	0x0036, 0x2019, 0x0002, 0x080c, 0xbd23, 0x003e, 0x9085, 0x0001,
++	0x0005, 0x00d6, 0x6014, 0x906d, 0x9084, 0xf000, 0x0130, 0x080c,
++	0xa5f3, 0x687b, 0x0005, 0x080c, 0x5b76, 0x00de, 0x080c, 0x8f09,
++	0x9085, 0x0001, 0x0005, 0x2001, 0x0001, 0x080c, 0x5556, 0x0156,
++	0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1105, 0x2011,
++	0x0276, 0x080c, 0x9d60, 0x003e, 0x002e, 0x001e, 0x015e, 0x9005,
++	0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0026,
++	0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0x15c0, 0x2079, 0x0001,
++	0x8fff, 0x0904, 0xc04d, 0x2071, 0x1100, 0x764c, 0x706c, 0x8001,
++	0x9602, 0x1a04, 0xc04d, 0x88ff, 0x0120, 0x2800, 0x9c06, 0x15a0,
++	0x2078, 0x080c, 0xc15b, 0x0580, 0x2400, 0x9c06, 0x0568, 0x6720,
++	0x9786, 0x0006, 0x1548, 0x9786, 0x0007, 0x0530, 0x88ff, 0x1140,
++	0x6010, 0x9206, 0x1508, 0x85ff, 0x0118, 0x6054, 0x9106, 0x11e0,
++	0x00d6, 0x601c, 0xd084, 0x0150, 0x080c, 0xc381, 0x2001, 0x12c0,
++	0x2004, 0x601a, 0x080c, 0x1509, 0x6023, 0x0007, 0x6014, 0x2068,
++	0x080c, 0xa942, 0x0120, 0x0046, 0x080c, 0xc0e9, 0x004e, 0x00de,
++	0x080c, 0x8f09, 0x88ff, 0x1198, 0x9ce0, 0x0018, 0x2001, 0x1118,
++	0x2004, 0x9c02, 0x1210, 0x0804, 0xc000, 0x9006, 0x012e, 0x002e,
++	0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x98c5,
++	0x0001, 0x0ca0, 0x0076, 0x0056, 0x0086, 0x9046, 0x2029, 0x0001,
++	0x2c20, 0x2019, 0x0002, 0x6210, 0x0096, 0x904e, 0x080c, 0x8968,
++	0x009e, 0x008e, 0x903e, 0x080c, 0x8a0a, 0x080c, 0xbff1, 0x005e,
++	0x007e, 0x0005, 0x0026, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156,
++	0x2c20, 0x2128, 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c,
++	0x5608, 0x1198, 0x2c10, 0x0056, 0x0086, 0x9046, 0x2508, 0x2029,
++	0x0001, 0x0096, 0x904e, 0x080c, 0x8968, 0x009e, 0x008e, 0x903e,
++	0x080c, 0x8a0a, 0x080c, 0xbff1, 0x005e, 0x003e, 0x001e, 0x8108,
++	0x1f04, 0xc07d, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x002e,
++	0x0005, 0x0076, 0x0056, 0x6210, 0x0086, 0x9046, 0x2029, 0x0001,
++	0x2019, 0x0048, 0x0096, 0x904e, 0x080c, 0x8968, 0x009e, 0x008e,
++	0x903e, 0x080c, 0x8a0a, 0x2c20, 0x080c, 0xbff1, 0x005e, 0x007e,
++	0x0005, 0x0026, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20,
++	0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c, 0x5608, 0x11a8,
++	0x2c10, 0x0086, 0x9046, 0x2828, 0x0046, 0x2021, 0x0001, 0x080c,
++	0xc363, 0x004e, 0x0096, 0x904e, 0x080c, 0x8968, 0x009e, 0x008e,
++	0x903e, 0x080c, 0x8a0a, 0x080c, 0xbff1, 0x003e, 0x001e, 0x8108,
++	0x1f04, 0xc0c3, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x002e,
++	0x0005, 0x0016, 0x00f6, 0x9d82, 0x45c0, 0x0280, 0x9d82, 0xffff,
++	0x1268, 0x6800, 0x907d, 0x0138, 0x6803, 0x0000, 0x6b82, 0x080c,
++	0x5b76, 0x2f68, 0x0cb0, 0x6b82, 0x080c, 0x5b76, 0x00fe, 0x001e,
++	0x0005, 0x00e6, 0x0046, 0x0036, 0x2061, 0x15c0, 0x9005, 0x1138,
++	0x2071, 0x1100, 0x744c, 0x706c, 0x8001, 0x9402, 0x12d8, 0x2100,
++	0x9c06, 0x0168, 0x6000, 0x9086, 0x0000, 0x0148, 0x6008, 0x9206,
++	0x1130, 0x6010, 0x91a0, 0x0004, 0x2424, 0x9406, 0x0140, 0x9ce0,
++	0x0018, 0x2001, 0x1118, 0x2004, 0x9c02, 0x1220, 0x0c40, 0x9085,
++	0x0001, 0x0008, 0x9006, 0x003e, 0x004e, 0x00ee, 0x0005, 0x00d6,
++	0x0006, 0x080c, 0x0eb6, 0x000e, 0x090c, 0x0d7e, 0x6867, 0x010d,
++	0x688e, 0x0026, 0x2010, 0x080c, 0xa932, 0x2001, 0x0000, 0x0120,
++	0x2200, 0x9080, 0x0015, 0x2004, 0x002e, 0x687a, 0x6986, 0x6c76,
++	0x687f, 0x0000, 0x2001, 0x12c8, 0x2004, 0x6882, 0x9006, 0x68e2,
++	0x6802, 0x686a, 0x688a, 0x0126, 0x2091, 0x8000, 0x080c, 0x5b76,
++	0x012e, 0x00de, 0x0005, 0x6700, 0x9786, 0x0000, 0x0158, 0x9786,
++	0x0001, 0x0140, 0x9786, 0x000a, 0x0128, 0x9786, 0x0009, 0x0110,
++	0x9085, 0x0001, 0x0005, 0x00e6, 0x6010, 0x2070, 0x70a0, 0x9206,
++	0x00ee, 0x0005, 0x0016, 0x6004, 0x908e, 0x001e, 0x11a0, 0x8007,
++	0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003,
++	0x000b, 0x6023, 0x0005, 0x2001, 0x12c1, 0x2004, 0x601a, 0x080c,
++	0x756e, 0x080c, 0x7aa4, 0x001e, 0x0005, 0xa001, 0xa001, 0x0005,
++	0x6024, 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, 0xac39, 0x0030,
++	0x080c, 0xc381, 0x080c, 0x7384, 0x080c, 0x8ed9, 0x0005, 0x9280,
++	0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xc1b3, 0xc1b3, 0xc1b3,
++	0xc1b5, 0xc1b3, 0xc1b5, 0xc1b5, 0xc1b3, 0xc1b5, 0xc1b3, 0xc1b3,
++	0xc1b3, 0xc1b3, 0xc1b3, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005,
++	0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xc1cc, 0xc1cc,
++	0xc1cc, 0xc1cc, 0xc1cc, 0xc1cc, 0xc1d9, 0xc1cc, 0xc1cc, 0xc1cc,
++	0xc1cc, 0xc1cc, 0xc1cc, 0xc1cc, 0x6007, 0x003b, 0x602f, 0x0009,
++	0x6017, 0x2a00, 0x6003, 0x0001, 0x080c, 0x756e, 0x080c, 0x7aa4,
++	0x0005, 0x00c6, 0x2260, 0x080c, 0xc381, 0x6043, 0x0000, 0x6024,
++	0xc0f4, 0xc0e4, 0x6026, 0x603b, 0x0000, 0x00ce, 0x00d6, 0x2268,
++	0x9186, 0x0007, 0x1904, 0xc234, 0x6814, 0x9005, 0x0138, 0x9080,
++	0x001f, 0x2004, 0xd0fc, 0x1110, 0x00de, 0x08b0, 0x6007, 0x003a,
++	0x6003, 0x0001, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x00c6, 0x2d60,
++	0x6100, 0x9186, 0x0002, 0x1904, 0xc2b2, 0x6014, 0x9005, 0x1138,
++	0x6000, 0x9086, 0x0007, 0x190c, 0x0d7e, 0x0804, 0xc2b2, 0x908c,
++	0xf000, 0x1130, 0x0028, 0x2068, 0x6800, 0x9005, 0x1de0, 0x2d00,
++	0x9080, 0x001f, 0x2004, 0x9084, 0x0003, 0x9086, 0x0002, 0x1180,
++	0x6014, 0x2068, 0x687c, 0xc0dc, 0xc0f4, 0x687e, 0x6880, 0xc0f4,
++	0xc0fc, 0x6882, 0x2009, 0x0043, 0x080c, 0xbb7b, 0x0804, 0xc2b2,
++	0x2009, 0x0041, 0x0804, 0xc2ac, 0x9186, 0x0005, 0x15b8, 0x6814,
++	0x9080, 0x001f, 0x2004, 0xd0bc, 0x1118, 0x00de, 0x0804, 0xc1cc,
++	0xd0b4, 0x0128, 0xd0fc, 0x090c, 0x0d7e, 0x0804, 0xc1ec, 0x6007,
++	0x003a, 0x6003, 0x0001, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x00c6,
++	0x2d60, 0x6100, 0x9186, 0x0002, 0x0120, 0x9186, 0x0004, 0x1904,
++	0xc2b2, 0x6814, 0x9080, 0x001f, 0x200c, 0xc1f4, 0xc1dc, 0x2102,
++	0x8000, 0x200c, 0xc1f4, 0xc1fc, 0xc1bc, 0x2102, 0x00f6, 0x2c78,
++	0x080c, 0x137e, 0x00fe, 0x2009, 0x0042, 0x04f0, 0x0036, 0x00d6,
++	0x00d6, 0x080c, 0x0eb6, 0x003e, 0x090c, 0x0d7e, 0x6867, 0x010d,
++	0x9006, 0x6802, 0x686a, 0x688a, 0x6b8e, 0x6887, 0x0045, 0x2c00,
++	0x6892, 0x6038, 0x68a2, 0x2360, 0x6024, 0xc0dd, 0x6026, 0x6010,
++	0x9080, 0x0028, 0x2004, 0x9084, 0x00ff, 0x8007, 0x6354, 0x6b7a,
++	0x6876, 0x9006, 0x687e, 0x6882, 0x6d9a, 0x6e96, 0x689f, 0x0001,
++	0x080c, 0x5b76, 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xbd23,
++	0x2d00, 0x600a, 0x6023, 0x0006, 0x6003, 0x0007, 0x901e, 0x631a,
++	0x6342, 0x00de, 0x003e, 0x0038, 0x6043, 0x0000, 0x6003, 0x0007,
++	0x080c, 0xbb7b, 0x00ce, 0x00de, 0x0005, 0x9186, 0x0013, 0x1128,
++	0x6004, 0x9082, 0x0085, 0x2008, 0x00c2, 0x9186, 0x0027, 0x1178,
++	0x080c, 0x79ab, 0x0036, 0x00d6, 0x6014, 0x2068, 0x2019, 0x0004,
++	0x080c, 0xc0e9, 0x00de, 0x003e, 0x080c, 0x7aa4, 0x0005, 0x9186,
++	0x0014, 0x0d70, 0x080c, 0x8f6e, 0x0005, 0xc2e4, 0xc2e2, 0xc2e2,
++	0xc2e2, 0xc2e2, 0xc2e2, 0xc2e4, 0xc2e2, 0xc2e2, 0xc2e2, 0xc2e2,
++	0xc2e2, 0xc2e2, 0x080c, 0x0d7e, 0x080c, 0x79ab, 0x6003, 0x000c,
++	0x080c, 0x7aa4, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085,
++	0x0208, 0x001a, 0x080c, 0x8f6e, 0x0005, 0xc302, 0xc302, 0xc302,
++	0xc302, 0xc304, 0xc324, 0xc302, 0xc302, 0xc302, 0xc302, 0xc302,
++	0xc302, 0xc302, 0x080c, 0x0d7e, 0x00d6, 0x2c68, 0x080c, 0x8e83,
++	0x01b0, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0x026e, 0x210c,
++	0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x600b, 0xffff, 0x6910,
++	0x6112, 0x6023, 0x0004, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x2d60,
++	0x080c, 0x8ed9, 0x00de, 0x0005, 0x080c, 0x8ed9, 0x0005, 0x00e6,
++	0x6010, 0x2070, 0x7000, 0xd0ec, 0x00ee, 0x0005, 0x2009, 0x1172,
++	0x210c, 0xd1ec, 0x0578, 0x6003, 0x0002, 0x6024, 0xc0e5, 0x6026,
++	0xd0cc, 0x0150, 0x2001, 0x12c2, 0x2004, 0x6042, 0x2009, 0x1172,
++	0x210c, 0xd1f4, 0x11e8, 0x0080, 0x2009, 0x1172, 0x210c, 0xd1f4,
++	0x0128, 0x6024, 0xc0e4, 0x6026, 0x9006, 0x00a0, 0x2001, 0x12c2,
++	0x200c, 0x8103, 0x9100, 0x6042, 0x6010, 0x9088, 0x002b, 0x2104,
++	0x9005, 0x0118, 0x9088, 0x0003, 0x0cd0, 0x2c0a, 0x600f, 0x0000,
++	0x9085, 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6, 0x6154, 0x92f0,
++	0x002b, 0x2e04, 0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, 0x6054,
++	0x9106, 0x1138, 0x600c, 0x2072, 0x080c, 0x7384, 0x080c, 0x8ed9,
++	0x0010, 0x9cf0, 0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce, 0x001e,
++	0x0005, 0x00d6, 0x6010, 0x90e8, 0x002b, 0x2d04, 0x9005, 0x0140,
++	0x9c06, 0x0120, 0x2d04, 0x90e8, 0x0003, 0x0cb8, 0x600c, 0x206a,
++	0x00de, 0x0005, 0x0026, 0x0036, 0x0156, 0x2011, 0x112a, 0x2204,
++	0x9084, 0x00ff, 0x2019, 0x026e, 0x2334, 0x9636, 0x11d8, 0x8318,
++	0x2334, 0x2204, 0x9084, 0xff00, 0x9636, 0x11a0, 0x2011, 0x0270,
++	0x20a9, 0x0004, 0x6010, 0x9098, 0x000a, 0x080c, 0x9d60, 0x1150,
++	0x2011, 0x0274, 0x20a9, 0x0004, 0x6010, 0x9098, 0x0006, 0x080c,
++	0x9d60, 0x1100, 0x015e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x2071,
++	0x1100, 0x080c, 0x5092, 0x080c, 0x2679, 0x00ee, 0x0005, 0x00e6,
++	0x6010, 0x2070, 0x7000, 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005,
++	0x6880, 0xc0e5, 0x6882, 0x0005, 0x00e6, 0x00c6, 0x0076, 0x0066,
++	0x0056, 0x0046, 0x0026, 0x0016, 0x0126, 0x2091, 0x8000, 0x2029,
++	0x130d, 0x252c, 0x2021, 0x1313, 0x2424, 0x2061, 0x15c0, 0x2071,
++	0x1100, 0x764c, 0x706c, 0x9606, 0x0578, 0x6720, 0x9786, 0x0001,
++	0x0118, 0x9786, 0x0008, 0x1500, 0x2500, 0x9c06, 0x01e8, 0x2400,
++	0x9c06, 0x01d0, 0x080c, 0xc15b, 0x01b8, 0x080c, 0xc16b, 0x11a0,
++	0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1509, 0x001e,
++	0x080c, 0xab1d, 0x1110, 0x080c, 0x2886, 0x080c, 0xab2e, 0x1110,
++	0x080c, 0x97dc, 0x080c, 0x8f09, 0x9ce0, 0x0018, 0x2001, 0x1118,
++	0x2004, 0x9c02, 0x1208, 0x0858, 0x012e, 0x001e, 0x002e, 0x004e,
++	0x005e, 0x006e, 0x007e, 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0006,
++	0x00e6, 0x0016, 0x2091, 0x8000, 0x2071, 0x1140, 0xd5a4, 0x0118,
++	0x7034, 0x8000, 0x7036, 0xd5b4, 0x0118, 0x7030, 0x8000, 0x7032,
++	0xd5ac, 0x0178, 0x2500, 0x9084, 0x0007, 0x908e, 0x0003, 0x0148,
++	0x908e, 0x0004, 0x0130, 0x908e, 0x0005, 0x0118, 0x2071, 0x114a,
++	0x0089, 0x001e, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0126, 0x0006,
++	0x00e6, 0x2091, 0x8000, 0x2071, 0x1142, 0x0021, 0x00ee, 0x000e,
++	0x012e, 0x0005, 0x2e04, 0x8000, 0x2072, 0x1220, 0x8e70, 0x2e04,
++	0x8000, 0x2072, 0x0005, 0x00e6, 0x2071, 0x1140, 0x0c99, 0x00ee,
++	0x0005, 0x00e6, 0x2071, 0x1144, 0x0c69, 0x00ee, 0x0005, 0x0126,
++	0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0x1140, 0x7044, 0x8000,
++	0x7046, 0x00ee, 0x000e, 0x012e, 0x0005, 0x8064, 0x0008, 0x0010,
++	0x0000, 0x8066, 0x0000, 0x0101, 0x0008, 0x4404, 0x0003, 0x8060,
++	0x0000, 0x0400, 0x0000, 0x580a, 0x0003, 0x7933, 0x0003, 0x5089,
++	0x0003, 0x4c07, 0x000b, 0xbac0, 0x0009, 0x0082, 0x0008, 0x0c07,
++	0x0003, 0x15fe, 0x0008, 0x3407, 0x000b, 0x808c, 0x0008, 0x0001,
++	0x0000, 0x0000, 0x0007, 0x4047, 0x000a, 0x808c, 0x0008, 0x0002,
++	0x0000, 0x0819, 0x000b, 0x4022, 0x0000, 0x001a, 0x0003, 0x4122,
++	0x0008, 0x4447, 0x0002, 0x0de5, 0x000b, 0x0bfe, 0x0008, 0x11a0,
++	0x0001, 0x11c7, 0x0003, 0x0ca0, 0x0001, 0x11c7, 0x0003, 0x9180,
++	0x0001, 0x0004, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009,
++	0x0008, 0x4426, 0x0003, 0x8080, 0x0001, 0x0004, 0x0000, 0x7f62,
++	0x0008, 0x8066, 0x0000, 0x0411, 0x0000, 0x442c, 0x0003, 0x808c,
++	0x0008, 0x0000, 0x0008, 0x03fe, 0x0000, 0x43e0, 0x0001, 0x0dc4,
++	0x000b, 0xc2c0, 0x0009, 0x00ff, 0x0008, 0x02e0, 0x0001, 0x0dc4,
++	0x000b, 0x9180, 0x0001, 0x0005, 0x0008, 0x7f62, 0x0008, 0x8066,
++	0x0000, 0x0019, 0x0000, 0x443b, 0x0003, 0x0240, 0x0002, 0x09c1,
++	0x0003, 0x00fe, 0x0000, 0x31c4, 0x000b, 0x112a, 0x0000, 0x002e,
++	0x0008, 0x022c, 0x0008, 0x3a44, 0x0002, 0x0c07, 0x0003, 0x9780,
++	0x0001, 0x000f, 0x0008, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0011,
++	0x0008, 0x444a, 0x0003, 0x808c, 0x0008, 0x0002, 0x0000, 0x01fe,
++	0x0008, 0x42e0, 0x0009, 0x0db7, 0x0003, 0x00fe, 0x0000, 0x43e0,
++	0x0001, 0x0db7, 0x0003, 0x1734, 0x0000, 0x1530, 0x0000, 0x1632,
++	0x0008, 0x0d2a, 0x0008, 0x9880, 0x0001, 0x0010, 0x0000, 0x7f62,
++	0x0008, 0x8066, 0x0000, 0x1e0a, 0x0008, 0x445c, 0x000b, 0x808a,
++	0x0008, 0x0003, 0x0008, 0x9a80, 0x0009, 0x0002, 0x0000, 0x7f62,
++	0x0008, 0x5862, 0x000b, 0x8066, 0x0000, 0x3679, 0x0000, 0x4465,
++	0x000b, 0x5866, 0x0003, 0x8054, 0x0008, 0x0011, 0x0008, 0x8074,
++	0x0000, 0x1010, 0x0008, 0x1efe, 0x0000, 0x3007, 0x0003, 0x006f,
++	0x0004, 0x0007, 0x0003, 0x1cfe, 0x0008, 0x1b80, 0x0009, 0x7f62,
++	0x0008, 0x8066, 0x0000, 0x0231, 0x0008, 0x4474, 0x000b, 0x5875,
++	0x000b, 0x0140, 0x0008, 0x0242, 0x0000, 0x1f43, 0x0002, 0x0c7f,
++	0x0003, 0x0d44, 0x0000, 0x0d46, 0x0008, 0x0348, 0x0008, 0x044a,
++	0x0008, 0x0083, 0x0003, 0x0344, 0x0008, 0x0446, 0x0008, 0x0548,
++	0x0008, 0x064a, 0x0000, 0x5883, 0x000b, 0x8054, 0x0008, 0x0001,
++	0x0000, 0x8074, 0x0000, 0x2020, 0x0008, 0x4000, 0x000f, 0x3a40,
++	0x000a, 0x0c0a, 0x000b, 0x2b24, 0x0008, 0x2b24, 0x0008, 0x588d,
++	0x0003, 0x8054, 0x0008, 0x0002, 0x0000, 0x1242, 0x0002, 0x08d7,
++	0x0003, 0x3a45, 0x000a, 0x08c8, 0x000b, 0x1e10, 0x000a, 0x7f3c,
++	0x0000, 0x08c5, 0x0003, 0x1d00, 0x0002, 0x7f3a, 0x0000, 0x0d60,
++	0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x449d,
++	0x0003, 0x8060, 0x0000, 0x0400, 0x0000, 0x00fe, 0x0000, 0x34c2,
++	0x000b, 0x1cfe, 0x0008, 0xff80, 0x0009, 0x0001, 0x0000, 0x7f62,
++	0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x44a8, 0x0003, 0x00fe,
++	0x0000, 0x31a0, 0x0003, 0x0038, 0x0000, 0x00fe, 0x0000, 0xff80,
++	0x0009, 0x0019, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009,
++	0x0008, 0x44b2, 0x000b, 0x80c0, 0x0009, 0x00ff, 0x0008, 0x7f3e,
++	0x0008, 0x0d60, 0x0000, 0x0efe, 0x0008, 0x1f80, 0x0001, 0x7f62,
++	0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x44bc, 0x0003, 0x8060,
++	0x0000, 0x0400, 0x0000, 0x003a, 0x0008, 0x1dfe, 0x0000, 0x0099,
++	0x000b, 0x0036, 0x0008, 0x006f, 0x0004, 0x00d7, 0x000b, 0x8074,
++	0x0000, 0x2000, 0x0000, 0x00d7, 0x000b, 0x3a44, 0x0002, 0x09ca,
++	0x000b, 0x8074, 0x0000, 0x1000, 0x0000, 0x2d0e, 0x0000, 0x2d0e,
++	0x0000, 0x35a0, 0x000b, 0x26fe, 0x0008, 0x26fe, 0x0008, 0x2700,
++	0x0008, 0x2700, 0x0008, 0x00d0, 0x0009, 0x0ce5, 0x0003, 0x8074,
++	0x0000, 0x4040, 0x0008, 0x58d7, 0x0003, 0x5089, 0x0003, 0x3a46,
++	0x000a, 0x0ce5, 0x0003, 0x3a47, 0x0002, 0x08e2, 0x0003, 0x8054,
++	0x0008, 0x0004, 0x0000, 0x8074, 0x0000, 0x8000, 0x0000, 0x0126,
++	0x000b, 0x92c0, 0x0009, 0x0f88, 0x0008, 0x0807, 0x000b, 0x9a80,
++	0x0009, 0x0002, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x362a,
++	0x0000, 0x44ea, 0x0003, 0x2000, 0x0000, 0x2000, 0x0000, 0x2102,
++	0x0000, 0x2102, 0x0000, 0x2204, 0x0000, 0x2204, 0x0000, 0x2306,
++	0x0000, 0x2306, 0x0000, 0x2408, 0x0000, 0x2408, 0x0000, 0x250a,
++	0x0000, 0x250a, 0x0000, 0x260c, 0x0000, 0x260c, 0x0000, 0x270e,
++	0x0000, 0x270e, 0x0000, 0x2810, 0x0000, 0x2810, 0x0000, 0x2912,
++	0x0000, 0x2912, 0x0000, 0x9a80, 0x0009, 0x0007, 0x0000, 0x7f62,
++	0x0008, 0x8066, 0x0000, 0x0052, 0x0000, 0x4504, 0x000b, 0x92c0,
++	0x0009, 0x0780, 0x0008, 0x0db1, 0x0003, 0x124b, 0x0002, 0x090d,
++	0x0003, 0x2e4d, 0x0002, 0x2e4d, 0x0002, 0x09a0, 0x000b, 0x3a46,
++	0x000a, 0x0d1a, 0x000b, 0x590f, 0x000b, 0x8054, 0x0008, 0x0004,
++	0x0000, 0x1243, 0x000a, 0x0924, 0x000b, 0x8010, 0x0008, 0x000d,
++	0x0000, 0x0191, 0x0004, 0x1810, 0x0000, 0x0191, 0x0004, 0x0124,
++	0x0003, 0x194d, 0x000a, 0x091e, 0x000b, 0x1243, 0x000a, 0x09a7,
++	0x0003, 0x591e, 0x000b, 0x8054, 0x0008, 0x0004, 0x0000, 0x0188,
++	0x000c, 0x1810, 0x0000, 0x0191, 0x0004, 0x8074, 0x0000, 0xf000,
++	0x0008, 0x3a42, 0x0002, 0x0d2c, 0x000b, 0x15fe, 0x0008, 0x3445,
++	0x000b, 0x0d30, 0x0000, 0x0007, 0x0003, 0x0d30, 0x0000, 0x8074,
++	0x0000, 0x0501, 0x0000, 0x8010, 0x0008, 0x000c, 0x0008, 0x0191,
++	0x0004, 0x0007, 0x0003, 0xbbe0, 0x0009, 0x0030, 0x0008, 0x0d43,
++	0x000b, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x0940, 0x0003, 0x15fe,
++	0x0008, 0x3ce0, 0x0009, 0x0940, 0x0003, 0x0183, 0x0004, 0x8076,
++	0x0008, 0x0040, 0x0000, 0x0180, 0x000b, 0x8076, 0x0008, 0x0041,
++	0x0008, 0x0180, 0x000b, 0xbbe0, 0x0009, 0x0032, 0x0000, 0x0d48,
++	0x0003, 0x3c1e, 0x0008, 0x0180, 0x000b, 0xbbe0, 0x0009, 0x0037,
++	0x0000, 0x0d65, 0x0003, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x0d40,
++	0x000b, 0x1afe, 0x0008, 0xff80, 0x0009, 0x000d, 0x0000, 0x7f62,
++	0x0008, 0x2604, 0x0008, 0x2604, 0x0008, 0x2706, 0x0008, 0x2706,
++	0x0008, 0x2808, 0x0000, 0x2808, 0x0000, 0x290a, 0x0000, 0x290a,
++	0x0000, 0x8066, 0x0000, 0x0422, 0x0000, 0x455c, 0x0003, 0x0188,
++	0x000c, 0x8054, 0x0008, 0x0004, 0x0000, 0x8074, 0x0000, 0xf000,
++	0x0008, 0x8072, 0x0000, 0x8000, 0x0000, 0x0126, 0x000b, 0xbbe0,
++	0x0009, 0x0038, 0x0000, 0x0d77, 0x0003, 0x18fe, 0x0000, 0x3ce0,
++	0x0009, 0x0974, 0x000b, 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x0d3c,
++	0x0003, 0x0183, 0x0004, 0x8076, 0x0008, 0x0040, 0x0000, 0x8072,
++	0x0000, 0x8000, 0x0000, 0x01c1, 0x000b, 0x8076, 0x0008, 0x0042,
++	0x0008, 0x0180, 0x000b, 0xbbe0, 0x0009, 0x0016, 0x0000, 0x0d80,
++	0x000b, 0x3a44, 0x0002, 0x0c09, 0x000b, 0x8072, 0x0000, 0x8000,
++	0x0000, 0x8000, 0x000f, 0x0007, 0x0003, 0x8072, 0x0000, 0x8000,
++	0x0000, 0x0007, 0x0003, 0x3d30, 0x000a, 0x7f00, 0x0000, 0xbc80,
++	0x0001, 0x0007, 0x0000, 0x018c, 0x000b, 0x1930, 0x000a, 0x7f00,
++	0x0000, 0x9880, 0x0001, 0x0007, 0x0000, 0x7f62, 0x0008, 0x8066,
++	0x0000, 0x000a, 0x0008, 0x458f, 0x000b, 0x4000, 0x000f, 0x2191,
++	0x0003, 0x0870, 0x0008, 0x4000, 0x000f, 0xbac0, 0x0009, 0x0090,
++	0x0008, 0x099a, 0x000b, 0x8074, 0x0000, 0x0706, 0x0000, 0x019c,
++	0x0003, 0x8074, 0x0000, 0x0703, 0x0000, 0x4000, 0x000f, 0x8010,
++	0x0008, 0x0008, 0x0000, 0x01cf, 0x0003, 0x0188, 0x000c, 0x8010,
++	0x0008, 0x0007, 0x0000, 0x0191, 0x0004, 0x1810, 0x0000, 0x0191,
++	0x0004, 0x01d9, 0x000b, 0x0188, 0x000c, 0x8010, 0x0008, 0x001b,
++	0x0008, 0x0191, 0x0004, 0x1810, 0x0000, 0x0191, 0x0004, 0x8074,
++	0x0000, 0xf080, 0x0000, 0x0d30, 0x0000, 0x0007, 0x0003, 0x8010,
++	0x0008, 0x0009, 0x0008, 0x01cf, 0x0003, 0x8010, 0x0008, 0x0005,
++	0x0008, 0x01cf, 0x0003, 0x808c, 0x0008, 0x0001, 0x0000, 0x8010,
++	0x0008, 0x0004, 0x0000, 0x4143, 0x000a, 0x0853, 0x0003, 0x3a44,
++	0x0002, 0x0c07, 0x0003, 0x0d2a, 0x0008, 0x01cf, 0x0003, 0x8010,
++	0x0008, 0x0003, 0x0008, 0x01d1, 0x0003, 0x8010, 0x0008, 0x000b,
++	0x0000, 0x01d1, 0x0003, 0x8010, 0x0008, 0x0002, 0x0000, 0x01d1,
++	0x0003, 0x3a47, 0x0002, 0x0cd7, 0x000b, 0x8010, 0x0008, 0x0006,
++	0x0008, 0x01d1, 0x0003, 0x8074, 0x0000, 0xf000, 0x0008, 0x0191,
++	0x0004, 0x0194, 0x0004, 0x3a40, 0x000a, 0x0807, 0x000b, 0x8010,
++	0x0008, 0x000c, 0x0008, 0x0191, 0x0004, 0x0007, 0x0003, 0x8074,
++	0x0000, 0xf080, 0x0000, 0x0d30, 0x0000, 0x2e4d, 0x0002, 0x2e4d,
++	0x0002, 0x09e2, 0x000b, 0x8054, 0x0008, 0x0019, 0x0000, 0x0007,
++	0x0003, 0x8054, 0x0008, 0x0009, 0x0008, 0x0007, 0x0003, 0x3a44,
++	0x0002, 0x0c07, 0x0003, 0x01c4, 0x000b, 0xde59, 0xf666, 0x0001,
++	0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100,
++	0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0xfe91
++};
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp.c	2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,6714 @@
++/* @(#)isp.c 1.86 */
++/*
++ * Machine and OS Independent (well, as best as possible)
++ * code for the Qlogic ISP SCSI adapters.
++ *
++ * Copyright (c) 1997, 1998, 1999, 2000, 2001 by Matthew Jacob
++ * Feral Software
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice immediately at the beginning of the file, without modification,
++ *    this list of conditions, and the following disclaimer.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ */
++
++/*
++ * Inspiration and ideas about this driver are from Erik Moe's Linux driver
++ * (qlogicisp.c) and Dave Miller's SBus version of same (qlogicisp.c). Some
++ * ideas dredged from the Solaris driver.
++ */
++
++/*
++ * Include header file appropriate for platform we're building on.
++ */
++
++#ifdef	__NetBSD__
++#include <dev/ic/isp_netbsd.h>
++#endif
++#ifdef	__FreeBSD__
++#include <dev/isp/isp_freebsd.h>
++#endif
++#ifdef	__OpenBSD__
++#include <dev/ic/isp_openbsd.h>
++#endif
++#ifdef	__linux__
++#include "isp_linux.h"
++#endif
++#ifdef	__svr4__
++#include "isp_solaris.h"
++#endif
++
++/*
++ * General defines
++ */
++
++#define	MBOX_DELAY_COUNT	1000000 / 100
++
++/*
++ * Local static data
++ */
++static const char portshift[] =
++    "Target %d Loop ID 0x%x (Port 0x%x) => Loop 0x%x (Port 0x%x)";
++static const char portdup[] =
++    "Target %d duplicates Target %d- killing off both";
++static const char retained[] =
++    "Retaining Loop ID 0x%x for Target %d (Port 0x%x)";
++static const char lretained[] =
++    "Retained login of Target %d (Loop ID 0x%x) Port 0x%x";
++static const char plogout[] =
++    "Logging out Target %d at Loop ID 0x%x (Port 0x%x)";
++static const char plogierr[] =
++    "Command Error in PLOGI for Port 0x%x (0x%x)";
++static const char nopdb[] =
++    "Could not get PDB for Device @ Port 0x%x";
++static const char pdbmfail1[] =
++    "PDB Loop ID info for Device @ Port 0x%x does not match up (0x%x)";
++static const char pdbmfail2[] =
++    "PDB Port info for Device @ Port 0x%x does not match up (0x%x)";
++static const char ldumped[] =
++    "Target %d (Loop ID 0x%x) Port 0x%x dumped after login info mismatch";
++static const char notresp[] =
++  "Not RESPONSE in RESPONSE Queue (type 0x%x) @ idx %d (next %d) nlooked %d";
++static const char xact1[] =
++    "HBA attempted queued transaction with disconnect not set for %d.%d.%d";
++static const char xact2[] =
++    "HBA attempted queued transaction to target routine %d on target %d bus %d";
++static const char xact3[] =
++    "HBA attempted queued cmd for %d.%d.%d when queueing disabled";
++static const char pskip[] =
++    "SCSI phase skipped for target %d.%d.%d";
++static const char topology[] =
++    "Loop ID %d, AL_PA 0x%x, Port ID 0x%x, Loop State 0x%x, Topology '%s'";
++static const char swrej[] =
++    "Fabric Nameserver rejected %s (Reason=0x%x Expl=0x%x) for Port ID 0x%x";
++static const char finmsg[] =
++    "(%d.%d.%d): FIN dl%d resid %d STS 0x%x SKEY %c XS_ERR=0x%x";
++static const char sc0[] =
++    "%s CHAN %d FTHRSH %d IID %d RESETD %d RETRYC %d RETRYD %d ASD 0x%x";
++static const char sc1[] =
++    "%s RAAN 0x%x DLAN 0x%x DDMAB 0x%x CDMAB 0x%x SELTIME %d MQD %d";
++static const char sc2[] = "%s CHAN %d TGT %d FLAGS 0x%x 0x%x/0x%x";
++static const char sc3[] = "Generated";
++static const char sc4[] = "NVRAM";
++static const char bun[] =
++    "bad underrun for %d.%d (count %d, resid %d, status %s)";
++
++/*
++ * Local function prototypes.
++ */
++static int isp_parse_async(struct ispsoftc *, u_int16_t);
++static int isp_handle_other_response(struct ispsoftc *, int, isphdr_t *,
++    u_int16_t *);
++static void
++isp_parse_status(struct ispsoftc *, ispstatusreq_t *, XS_T *);
++static void isp_fastpost_complete(struct ispsoftc *, u_int16_t);
++static int isp_mbox_continue(struct ispsoftc *);
++static void isp_scsi_init(struct ispsoftc *);
++static void isp_scsi_channel_init(struct ispsoftc *, int);
++static void isp_fibre_init(struct ispsoftc *);
++static void isp_mark_getpdb_all(struct ispsoftc *);
++static int isp_getmap(struct ispsoftc *, fcpos_map_t *);
++static int isp_getpdb(struct ispsoftc *, int, isp_pdb_t *);
++static u_int64_t isp_get_portname(struct ispsoftc *, int, int);
++static int isp_fclink_test(struct ispsoftc *, int);
++static char *isp2100_fw_statename(int);
++static int isp_pdb_sync(struct ispsoftc *);
++static int isp_scan_loop(struct ispsoftc *);
++static int isp_fabric_mbox_cmd(struct ispsoftc *, mbreg_t *);
++static int isp_scan_fabric(struct ispsoftc *, int);
++static void isp_register_fc4_type(struct ispsoftc *);
++static void isp_fw_state(struct ispsoftc *);
++static void isp_mboxcmd_qnw(struct ispsoftc *, mbreg_t *, int);
++static void isp_mboxcmd(struct ispsoftc *, mbreg_t *, int);
++
++static void isp_update(struct ispsoftc *);
++static void isp_update_bus(struct ispsoftc *, int);
++static void isp_setdfltparm(struct ispsoftc *, int);
++static int isp_read_nvram(struct ispsoftc *);
++static void isp_rdnvram_word(struct ispsoftc *, int, u_int16_t *);
++static void isp_parse_nvram_1020(struct ispsoftc *, u_int8_t *);
++static void isp_parse_nvram_1080(struct ispsoftc *, int, u_int8_t *);
++static void isp_parse_nvram_12160(struct ispsoftc *, int, u_int8_t *);
++static void isp_parse_nvram_2100(struct ispsoftc *, u_int8_t *);
++
++/*
++ * Reset Hardware.
++ *
++ * Hit the chip over the head, download new f/w if available and set it running.
++ *
++ * Locking done elsewhere.
++ */
++
++void
++isp_reset(struct ispsoftc *isp)
++{
++	mbreg_t mbs;
++	u_int16_t code_org;
++	int loops, i, dodnld = 1;
++	char *btype = "????";
++
++	isp->isp_state = ISP_NILSTATE;
++
++	/*
++	 * Basic types (SCSI, FibreChannel and PCI or SBus)
++	 * have been set in the MD code. We figure out more
++	 * here. Possibly more refined types based upon PCI
++	 * identification. Chip revision has been gathered.
++	 *
++	 * After we've fired this chip up, zero out the conf1 register
++	 * for SCSI adapters and do other settings for the 2100.
++	 */
++
++	/*
++	 * Get the current running firmware revision out of the
++	 * chip before we hit it over the head (if this is our
++	 * first time through). Note that we store this as the
++	 * 'ROM' firmware revision- which it may not be. In any
++	 * case, we don't really use this yet, but we may in
++	 * the future.
++	 */
++	if (isp->isp_touched == 0) {
++		/*
++		 * First see whether or not we're sitting in the ISP PROM.
++		 * If we've just been reset, we'll have the string "ISP   "
++		 * spread through outgoing mailbox registers 1-3. We do
++		 * this for PCI cards because otherwise we really don't
++		 * know what state the card is in and we could hang if
++		 * we try this command otherwise.
++		 *
++		 * For SBus cards, we just do this because they almost
++		 * certainly will be running firmware by now.
++		 */
++		if (ISP_READ(isp, OUTMAILBOX1) != 0x4953 ||
++		    ISP_READ(isp, OUTMAILBOX2) != 0x5020 ||
++		    ISP_READ(isp, OUTMAILBOX3) != 0x2020) {
++			/*
++			 * Just in case it was paused...
++			 */
++			ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
++			mbs.param[0] = MBOX_ABOUT_FIRMWARE;
++			isp_mboxcmd(isp, &mbs, MBLOGNONE);
++			if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++				isp->isp_romfw_rev[0] = mbs.param[1];
++				isp->isp_romfw_rev[1] = mbs.param[2];
++				isp->isp_romfw_rev[2] = mbs.param[3];
++			}
++		}
++		isp->isp_touched = 1;
++	}
++
++	DISABLE_INTS(isp);
++
++	/*
++	 * Set up default request/response queue in-pointer/out-pointer
++	 * register indices.
++	 */
++	if (IS_23XX(isp)) {
++		isp->isp_rqstinrp = BIU_REQINP;
++		isp->isp_rqstoutrp = BIU_REQOUTP;
++		isp->isp_respinrp = BIU_RSPINP;
++		isp->isp_respoutrp = BIU_RSPOUTP;
++	} else {
++		isp->isp_rqstinrp = INMAILBOX4;
++		isp->isp_rqstoutrp = OUTMAILBOX4;
++		isp->isp_respinrp = OUTMAILBOX5;
++		isp->isp_respoutrp = INMAILBOX5;
++	}
++
++	/*
++	 * Put the board into PAUSE mode (so we can read the SXP registers
++	 * or write FPM/FBM registers).
++	 */
++	ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
++
++	if (IS_FC(isp)) {
++		switch (isp->isp_type) {
++		case ISP_HA_FC_2100:
++			btype = "2100";
++			break;
++		case ISP_HA_FC_2200:
++			btype = "2200";
++			break;
++		case ISP_HA_FC_2300:
++			btype = "2300";
++			break;
++		case ISP_HA_FC_2312:
++			btype = "2312";
++			break;
++		default:
++			break;
++		}
++		/*
++		 * While we're paused, reset the FPM module and FBM fifos.
++		 */
++		ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS);
++		ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET);
++		ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS);
++		ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL);
++		ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS);
++	} else if (IS_1240(isp)) {
++		sdparam *sdp = isp->isp_param;
++		btype = "1240";
++		isp->isp_clock = 60;
++		sdp->isp_ultramode = 1;
++		sdp++;
++		sdp->isp_ultramode = 1;
++		/*
++		 * XXX: Should probably do some bus sensing.
++		 */
++	} else if (IS_ULTRA2(isp)) {
++		static const char m[] = "bus %d is in %s Mode";
++		u_int16_t l;
++		sdparam *sdp = isp->isp_param;
++
++		isp->isp_clock = 100;
++
++		if (IS_1280(isp))
++			btype = "1280";
++		else if (IS_1080(isp))
++			btype = "1080";
++		else if (IS_10160(isp))
++			btype = "10160";
++		else if (IS_12160(isp))
++			btype = "12160";
++		else
++			btype = "<UNKLVD>";
++
++		l = ISP_READ(isp, SXP_PINS_DIFF) & ISP1080_MODE_MASK;
++		switch (l) {
++		case ISP1080_LVD_MODE:
++			sdp->isp_lvdmode = 1;
++			isp_prt(isp, ISP_LOGCONFIG, m, 0, "LVD");
++			break;
++		case ISP1080_HVD_MODE:
++			sdp->isp_diffmode = 1;
++			isp_prt(isp, ISP_LOGCONFIG, m, 0, "Differential");
++			break;
++		case ISP1080_SE_MODE:
++			sdp->isp_ultramode = 1;
++			isp_prt(isp, ISP_LOGCONFIG, m, 0, "Single-Ended");
++			break;
++		default:
++			isp_prt(isp, ISP_LOGERR,
++			    "unknown mode on bus %d (0x%x)", 0, l);
++			break;
++		}
++
++		if (IS_DUALBUS(isp)) {
++			sdp++;
++			l = ISP_READ(isp, SXP_PINS_DIFF|SXP_BANK1_SELECT);
++			l &= ISP1080_MODE_MASK;
++			switch(l) {
++			case ISP1080_LVD_MODE:
++				sdp->isp_lvdmode = 1;
++				isp_prt(isp, ISP_LOGCONFIG, m, 1, "LVD");
++				break;
++			case ISP1080_HVD_MODE:
++				sdp->isp_diffmode = 1;
++				isp_prt(isp, ISP_LOGCONFIG,
++				    m, 1, "Differential");
++				break;
++			case ISP1080_SE_MODE:
++				sdp->isp_ultramode = 1;
++				isp_prt(isp, ISP_LOGCONFIG,
++				    m, 1, "Single-Ended");
++				break;
++			default:
++				isp_prt(isp, ISP_LOGERR,
++				    "unknown mode on bus %d (0x%x)", 1, l);
++				break;
++			}
++		}
++	} else {
++		sdparam *sdp = isp->isp_param;
++		i = ISP_READ(isp, BIU_CONF0) & BIU_CONF0_HW_MASK;
++		switch (i) {
++		default:
++			isp_prt(isp, ISP_LOGALL, "Unknown Chip Type 0x%x", i);
++			/* FALLTHROUGH */
++		case 1:
++			btype = "1020";
++			isp->isp_type = ISP_HA_SCSI_1020;
++			isp->isp_clock = 40;
++			break;
++		case 2:
++			/*
++			 * Some 1020A chips are Ultra Capable, but don't
++			 * run the clock rate up for that unless told to
++			 * do so by the Ultra Capable bits being set.
++			 */
++			btype = "1020A";
++			isp->isp_type = ISP_HA_SCSI_1020A;
++			isp->isp_clock = 40;
++			break;
++		case 3:
++			btype = "1040";
++			isp->isp_type = ISP_HA_SCSI_1040;
++			isp->isp_clock = 60;
++			break;
++		case 4:
++			btype = "1040A";
++			isp->isp_type = ISP_HA_SCSI_1040A;
++			isp->isp_clock = 60;
++			break;
++		case 5:
++			btype = "1040B";
++			isp->isp_type = ISP_HA_SCSI_1040B;
++			isp->isp_clock = 60;
++			break;
++		case 6:
++			btype = "1040C";
++			isp->isp_type = ISP_HA_SCSI_1040C;
++			isp->isp_clock = 60;
++                        break;
++		}
++		/*
++		 * Now, while we're at it, gather info about ultra
++		 * and/or differential mode.
++		 */
++		if (ISP_READ(isp, SXP_PINS_DIFF) & SXP_PINS_DIFF_MODE) {
++			isp_prt(isp, ISP_LOGCONFIG, "Differential Mode");
++			sdp->isp_diffmode = 1;
++		} else {
++			sdp->isp_diffmode = 0;
++		}
++		i = ISP_READ(isp, RISC_PSR);
++		if (isp->isp_bustype == ISP_BT_SBUS) {
++			i &= RISC_PSR_SBUS_ULTRA;
++		} else {
++			i &= RISC_PSR_PCI_ULTRA;
++		}
++		if (i != 0) {
++			isp_prt(isp, ISP_LOGCONFIG, "Ultra Mode Capable");
++			sdp->isp_ultramode = 1;
++			/*
++			 * If we're in Ultra Mode, we have to be 60MHz clock-
++			 * even for the SBus version.
++			 */
++			isp->isp_clock = 60;
++		} else {
++			sdp->isp_ultramode = 0;
++			/*
++			 * Clock is known. Gronk.
++			 */
++		}
++
++		/*
++		 * Machine dependent clock (if set) overrides
++		 * our generic determinations.
++		 */
++		if (isp->isp_mdvec->dv_clock) {
++			if (isp->isp_mdvec->dv_clock < isp->isp_clock) {
++				isp->isp_clock = isp->isp_mdvec->dv_clock;
++			}
++		}
++
++	}
++
++	/*
++	 * Clear instrumentation
++	 */
++	isp->isp_intcnt = isp->isp_intbogus = 0;
++
++	/*
++	 * Do MD specific pre initialization
++	 */
++	ISP_RESET0(isp);
++
++again:
++
++	/*
++	 * Hit the chip over the head with hammer,
++	 * and give the ISP a chance to recover.
++	 */
++
++	if (IS_SCSI(isp)) {
++		ISP_WRITE(isp, BIU_ICR, BIU_ICR_SOFT_RESET);
++		/*
++		 * A slight delay...
++		 */
++		USEC_DELAY(100);
++
++		/*
++		 * Clear data && control DMA engines.
++		 */
++		ISP_WRITE(isp, CDMA_CONTROL,
++		    DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT);
++		ISP_WRITE(isp, DDMA_CONTROL,
++		    DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT);
++
++
++	} else {
++		ISP_WRITE(isp, BIU2100_CSR, BIU2100_SOFT_RESET);
++		/*
++		 * A slight delay...
++		 */
++		USEC_DELAY(100);
++
++		/*
++		 * Clear data && control DMA engines.
++		 */
++		ISP_WRITE(isp, CDMA2100_CONTROL,
++			DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
++		ISP_WRITE(isp, TDMA2100_CONTROL,
++			DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
++		ISP_WRITE(isp, RDMA2100_CONTROL,
++			DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
++	}
++
++	/*
++	 * Wait for ISP to be ready to go...
++	 */
++	loops = MBOX_DELAY_COUNT;
++	for (;;) {
++		if (IS_SCSI(isp)) {
++			if (!(ISP_READ(isp, BIU_ICR) & BIU_ICR_SOFT_RESET))
++				break;
++		} else {
++			if (!(ISP_READ(isp, BIU2100_CSR) & BIU2100_SOFT_RESET))
++				break;
++		}
++		USEC_DELAY(100);
++		if (--loops < 0) {
++			ISP_DUMPREGS(isp, "chip reset timed out");
++			return;
++		}
++	}
++
++	/*
++	 * After we've fired this chip up, zero out the conf1 register
++	 * for SCSI adapters and other settings for the 2100.
++	 */
++
++	if (IS_SCSI(isp)) {
++		ISP_WRITE(isp, BIU_CONF1, 0);
++	} else {
++		ISP_WRITE(isp, BIU2100_CSR, 0);
++	}
++
++	/*
++	 * Reset RISC Processor
++	 */
++	ISP_WRITE(isp, HCCR, HCCR_CMD_RESET);
++	USEC_DELAY(100);
++	/* Clear semaphore register (just to be sure) */
++	ISP_WRITE(isp, BIU_SEMA, 0);
++
++	/*
++	 * Establish some initial burst rate stuff.
++	 * (only for the 1XX0 boards). This really should
++	 * be done later after fetching from NVRAM.
++	 */
++	if (IS_SCSI(isp)) {
++		u_int16_t tmp = isp->isp_mdvec->dv_conf1;
++		/*
++		 * Busted FIFO. Turn off all but burst enables.
++		 */
++		if (isp->isp_type == ISP_HA_SCSI_1040A) {
++			tmp &= BIU_BURST_ENABLE;
++		}
++		ISP_SETBITS(isp, BIU_CONF1, tmp);
++		if (tmp & BIU_BURST_ENABLE) {
++			ISP_SETBITS(isp, CDMA_CONF, DMA_ENABLE_BURST);
++			ISP_SETBITS(isp, DDMA_CONF, DMA_ENABLE_BURST);
++		}
++#ifdef	PTI_CARDS
++		if (((sdparam *) isp->isp_param)->isp_ultramode) {
++			while (ISP_READ(isp, RISC_MTR) != 0x1313) {
++				ISP_WRITE(isp, RISC_MTR, 0x1313);
++				ISP_WRITE(isp, HCCR, HCCR_CMD_STEP);
++			}
++		} else {
++			ISP_WRITE(isp, RISC_MTR, 0x1212);
++		}
++		/*
++		 * PTI specific register
++		 */
++		ISP_WRITE(isp, RISC_EMB, DUAL_BANK)
++#else
++		ISP_WRITE(isp, RISC_MTR, 0x1212);
++#endif
++	} else {
++		ISP_WRITE(isp, RISC_MTR2100, 0x1212);
++		if (IS_2200(isp) || IS_23XX(isp)) {
++			ISP_WRITE(isp, HCCR, HCCR_2X00_DISABLE_PARITY_PAUSE);
++		}
++	}
++
++	ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); /* release paused processor */
++
++	/*
++	 * Do MD specific post initialization
++	 */
++	ISP_RESET1(isp);
++
++	/*
++	 * Wait for everything to finish firing up.
++	 *
++	 * Avoid doing this on the 2312 because you can generate a PCI
++	 * parity error (chip breakage).
++	 */
++	if (IS_23XX(isp)) {
++		USEC_DELAY(5);
++	} else {
++		loops = MBOX_DELAY_COUNT;
++		while (ISP_READ(isp, OUTMAILBOX0) == MBOX_BUSY) {
++			USEC_DELAY(100);
++			if (--loops < 0) {
++				isp_prt(isp, ISP_LOGERR,
++				    "MBOX_BUSY never cleared on reset");
++				return;
++			}
++		}
++	}
++
++	/*
++	 * Up until this point we've done everything by just reading or
++	 * setting registers. From this point on we rely on at least *some*
++	 * kind of firmware running in the card.
++	 */
++
++	/*
++	 * Do some sanity checking.
++	 */
++	mbs.param[0] = MBOX_NO_OP;
++	isp_mboxcmd(isp, &mbs, MBLOGALL);
++	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++		return;
++	}
++
++	if (IS_SCSI(isp)) {
++		mbs.param[0] = MBOX_MAILBOX_REG_TEST;
++		mbs.param[1] = 0xdead;
++		mbs.param[2] = 0xbeef;
++		mbs.param[3] = 0xffff;
++		mbs.param[4] = 0x1111;
++		mbs.param[5] = 0xa5a5;
++		isp_mboxcmd(isp, &mbs, MBLOGALL);
++		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++			return;
++		}
++		if (mbs.param[1] != 0xdead || mbs.param[2] != 0xbeef ||
++		    mbs.param[3] != 0xffff || mbs.param[4] != 0x1111 ||
++		    mbs.param[5] != 0xa5a5) {
++			isp_prt(isp, ISP_LOGERR,
++			    "Register Test Failed (0x%x 0x%x 0x%x 0x%x 0x%x)",
++			    mbs.param[1], mbs.param[2], mbs.param[3],
++			    mbs.param[4], mbs.param[5]);
++			return;
++		}
++
++	}
++
++	/*
++	 * Download new Firmware, unless requested not to do so.
++	 * This is made slightly trickier in some cases where the
++	 * firmware of the ROM revision is newer than the revision
++	 * compiled into the driver. So, where we used to compare
++	 * versions of our f/w and the ROM f/w, now we just see
++	 * whether we have f/w at all and whether a config flag
++	 * has disabled our download.
++	 */
++	if ((isp->isp_mdvec->dv_ispfw == NULL) ||
++	    (isp->isp_confopts & ISP_CFG_NORELOAD)) {
++		dodnld = 0;
++	}
++
++	if (IS_23XX(isp))
++		code_org = ISP_CODE_ORG_2300;
++	else
++		code_org = ISP_CODE_ORG;
++
++	if (dodnld) {
++		isp->isp_mbxworkp = (void *) &isp->isp_mdvec->dv_ispfw[1];
++		isp->isp_mbxwrk0 = isp->isp_mdvec->dv_ispfw[3] - 1;
++		isp->isp_mbxwrk1 = code_org + 1;
++		mbs.param[0] = MBOX_WRITE_RAM_WORD;
++		mbs.param[1] = code_org;
++		mbs.param[2] = isp->isp_mdvec->dv_ispfw[0];
++		isp_mboxcmd(isp, &mbs, MBLOGNONE);
++		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++			isp_prt(isp, ISP_LOGERR,
++			    "F/W download failed at word %d",
++			    isp->isp_mbxwrk1 - code_org);
++			dodnld = 0;
++			goto again;
++		}
++		/*
++		 * Verify that it downloaded correctly.
++		 */
++		mbs.param[0] = MBOX_VERIFY_CHECKSUM;
++		mbs.param[1] = code_org;
++		isp_mboxcmd(isp, &mbs, MBLOGNONE);
++		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++			isp_prt(isp, ISP_LOGERR, "Ram Checksum Failure");
++			return;
++		}
++		isp->isp_loaded_fw = 1;
++	} else {
++		isp->isp_loaded_fw = 0;
++		isp_prt(isp, ISP_LOGDEBUG2, "skipping f/w download");
++	}
++
++	/*
++	 * Now start it rolling.
++	 *
++	 * If we didn't actually download f/w,
++	 * we still need to (re)start it.
++	 */
++
++
++	mbs.param[0] = MBOX_EXEC_FIRMWARE;
++	mbs.param[1] = code_org;
++	isp_mboxcmd(isp, &mbs, MBLOGNONE);
++	/*
++	 * Give it a chance to start.
++	 */
++	USEC_DELAY(500);
++
++	if (IS_SCSI(isp)) {
++		/*
++		 * Set CLOCK RATE, but only if asked to.
++		 */
++		if (isp->isp_clock) {
++			mbs.param[0] = MBOX_SET_CLOCK_RATE;
++			mbs.param[1] = isp->isp_clock;
++			isp_mboxcmd(isp, &mbs, MBLOGALL);
++			/* we will try not to care if this fails */
++		}
++	}
++
++	mbs.param[0] = MBOX_ABOUT_FIRMWARE;
++	isp_mboxcmd(isp, &mbs, MBLOGALL);
++	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++		return;
++	}
++
++	/*
++	 * The SBus firmware that we are using apparently does not return
++	 * major, minor, micro revisions in the mailbox registers, which
++	 * is really, really, annoying.
++	 */
++	if (ISP_SBUS_SUPPORTED && isp->isp_bustype == ISP_BT_SBUS) {
++		if (dodnld) {
++#ifdef	ISP_TARGET_MODE
++			isp->isp_fwrev[0] = 7;
++			isp->isp_fwrev[1] = 55;
++#else
++			isp->isp_fwrev[0] = 1;
++			isp->isp_fwrev[1] = 37;
++#endif
++			isp->isp_fwrev[2] = 0;
++		} 
++	} else {
++		isp->isp_fwrev[0] = mbs.param[1];
++		isp->isp_fwrev[1] = mbs.param[2];
++		isp->isp_fwrev[2] = mbs.param[3];
++	}
++	isp_prt(isp, ISP_LOGCONFIG,
++	    "Board Type %s, Chip Revision 0x%x, %s F/W Revision %d.%d.%d",
++	    btype, isp->isp_revision, dodnld? "loaded" : "resident",
++	    isp->isp_fwrev[0], isp->isp_fwrev[1], isp->isp_fwrev[2]);
++
++	if (IS_FC(isp)) {
++		/*
++		 * We do not believe firmware attributes for 2100 code less
++		 * than 1.17.0, unless it's the firmware we specifically
++		 * are loading.
++		 *
++		 * Note that all 22XX and 23XX f/w is greater than 1.X.0.
++		 */
++		if (!(ISP_FW_NEWER_THAN(isp, 1, 17, 0))) {
++#ifdef	USE_SMALLER_2100_FIRMWARE
++			FCPARAM(isp)->isp_fwattr = ISP_FW_ATTR_SCCLUN;
++#else
++			FCPARAM(isp)->isp_fwattr = 0;
++#endif
++		} else {
++			FCPARAM(isp)->isp_fwattr = mbs.param[6];
++			isp_prt(isp, ISP_LOGDEBUG0,
++			    "Firmware Attributes = 0x%x", mbs.param[6]);
++		}
++		if (ISP_READ(isp, BIU2100_CSR) & BIU2100_PCI64) {
++			isp_prt(isp, ISP_LOGCONFIG,
++			    "Installed in 64-Bit PCI slot");
++		}
++	}
++
++	if (isp->isp_romfw_rev[0] || isp->isp_romfw_rev[1] ||
++	    isp->isp_romfw_rev[2]) {
++		isp_prt(isp, ISP_LOGCONFIG, "Last F/W revision was %d.%d.%d",
++		    isp->isp_romfw_rev[0], isp->isp_romfw_rev[1],
++		    isp->isp_romfw_rev[2]);
++	}
++
++	mbs.param[0] = MBOX_GET_FIRMWARE_STATUS;
++	isp_mboxcmd(isp, &mbs, MBLOGALL);
++	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++		return;
++	}
++	isp->isp_maxcmds = mbs.param[2];
++	isp_prt(isp, ISP_LOGINFO,
++	    "%d max I/O commands supported", mbs.param[2]);
++	isp_fw_state(isp);
++
++	/*
++	 * Set up DMA for the request and result mailboxes.
++	 */
++	if (ISP_MBOXDMASETUP(isp) != 0) {
++		isp_prt(isp, ISP_LOGERR, "Cannot setup DMA");
++		return;
++	}
++	isp->isp_state = ISP_RESETSTATE;
++
++	/*
++	 * Okay- now that we have new firmware running, we now (re)set our
++	 * notion of how many luns we support. This is somewhat tricky because
++	 * if we haven't loaded firmware, we sometimes do not have an easy way
++	 * of knowing how many luns we support.
++	 *
++	 * Expanded lun firmware gives you 32 luns for SCSI cards and
++	 * 16384 luns for Fibre Channel cards.
++	 *
++	 * It turns out that even for QLogic 2100s with ROM 1.10 and above
++	 * we do get a firmware attributes word returned in mailbox register 6.
++	 *
++	 * Because the lun is in a different position in the Request Queue
++	 * Entry structure for Fibre Channel with expanded lun firmware, we
++	 * can only support one lun (lun zero) when we don't know what kind
++	 * of firmware we're running.
++	 */
++	if (IS_SCSI(isp)) {
++		if (dodnld) {
++			if (IS_ULTRA2(isp) || IS_ULTRA3(isp)) {
++				isp->isp_maxluns = 32;
++			} else {
++				isp->isp_maxluns = 8;
++			}
++		} else {
++			isp->isp_maxluns = 8;
++		}
++	} else {
++		if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) {
++			isp->isp_maxluns = 16384;
++		} else {
++			isp->isp_maxluns = 16;
++		}
++	}
++}
++
++/*
++ * Initialize Parameters of Hardware to a known state.
++ *
++ * Locks are held before coming here.
++ */
++
++void
++isp_init(struct ispsoftc *isp)
++{
++	/*
++	 * Must do this first to get defaults established.
++	 */
++	isp_setdfltparm(isp, 0);
++	if (IS_DUALBUS(isp)) {
++		isp_setdfltparm(isp, 1);
++	}
++	if (IS_FC(isp)) {
++		isp_fibre_init(isp);
++	} else {
++		isp_scsi_init(isp);
++	}
++}
++
++static void
++isp_scsi_init(struct ispsoftc *isp)
++{
++	sdparam *sdp_chan0, *sdp_chan1;
++	mbreg_t mbs;
++
++	sdp_chan0 = isp->isp_param;
++	sdp_chan1 = sdp_chan0;
++	if (IS_DUALBUS(isp)) {
++		sdp_chan1++;
++	}
++
++	/*
++	 * If we have no role (neither target nor initiator), return.
++	 */
++	if (isp->isp_role == ISP_ROLE_NONE) {
++		return;
++	}
++
++	/* First do overall per-card settings. */
++
++	/*
++	 * If we have fast memory timing enabled, turn it on.
++	 */
++	if (sdp_chan0->isp_fast_mttr) {
++		ISP_WRITE(isp, RISC_MTR, 0x1313);
++	}
++
++	/*
++	 * Set Retry Delay and Count.
++	 * You set both channels at the same time.
++	 */
++	mbs.param[0] = MBOX_SET_RETRY_COUNT;
++	mbs.param[1] = sdp_chan0->isp_retry_count;
++	mbs.param[2] = sdp_chan0->isp_retry_delay;
++	mbs.param[6] = sdp_chan1->isp_retry_count;
++	mbs.param[7] = sdp_chan1->isp_retry_delay;
++
++	isp_mboxcmd(isp, &mbs, MBLOGALL);
++	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++		return;
++	}
++
++	/*
++	 * Set ASYNC DATA SETUP time. This is very important.
++	 */
++	mbs.param[0] = MBOX_SET_ASYNC_DATA_SETUP_TIME;
++	mbs.param[1] = sdp_chan0->isp_async_data_setup;
++	mbs.param[2] = sdp_chan1->isp_async_data_setup;
++	isp_mboxcmd(isp, &mbs, MBLOGALL);
++	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++		return;
++	}
++
++	/*
++	 * Set ACTIVE Negation State.
++	 */
++	mbs.param[0] = MBOX_SET_ACT_NEG_STATE;
++	mbs.param[1] =
++	    (sdp_chan0->isp_req_ack_active_neg << 4) |
++	    (sdp_chan0->isp_data_line_active_neg << 5);
++	mbs.param[2] =
++	    (sdp_chan1->isp_req_ack_active_neg << 4) |
++	    (sdp_chan1->isp_data_line_active_neg << 5);
++
++	isp_mboxcmd(isp, &mbs, MBLOGNONE);
++	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++		isp_prt(isp, ISP_LOGERR,
++		    "failed to set active negation state (%d,%d), (%d,%d)",
++		    sdp_chan0->isp_req_ack_active_neg,
++		    sdp_chan0->isp_data_line_active_neg,
++		    sdp_chan1->isp_req_ack_active_neg,
++		    sdp_chan1->isp_data_line_active_neg);
++		/*
++		 * But don't return.
++		 */
++	}
++
++	/*
++	 * Set the Tag Aging limit
++	 */
++	mbs.param[0] = MBOX_SET_TAG_AGE_LIMIT;
++	mbs.param[1] = sdp_chan0->isp_tag_aging;
++	mbs.param[2] = sdp_chan1->isp_tag_aging;
++	isp_mboxcmd(isp, &mbs, MBLOGALL);
++	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++		isp_prt(isp, ISP_LOGERR, "failed to set tag age limit (%d,%d)",
++		    sdp_chan0->isp_tag_aging, sdp_chan1->isp_tag_aging);
++		return;
++	}
++
++	/*
++	 * Set selection timeout.
++	 */
++	mbs.param[0] = MBOX_SET_SELECT_TIMEOUT;
++	mbs.param[1] = sdp_chan0->isp_selection_timeout;
++	mbs.param[2] = sdp_chan1->isp_selection_timeout;
++	isp_mboxcmd(isp, &mbs, MBLOGALL);
++	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++		return;
++	}
++
++	/* now do per-channel settings */
++	isp_scsi_channel_init(isp, 0);
++	if (IS_DUALBUS(isp))
++		isp_scsi_channel_init(isp, 1);
++
++	/*
++	 * Now enable request/response queues
++	 */
++
++	if (IS_ULTRA2(isp) || IS_1240(isp)) {
++		mbs.param[0] = MBOX_INIT_RES_QUEUE_A64;
++		mbs.param[1] = RESULT_QUEUE_LEN(isp);
++		mbs.param[2] = DMA_WD1(isp->isp_result_dma);
++		mbs.param[3] = DMA_WD0(isp->isp_result_dma);
++		mbs.param[4] = 0;
++		mbs.param[6] = DMA_WD3(isp->isp_result_dma);
++		mbs.param[7] = DMA_WD2(isp->isp_result_dma);
++		isp_mboxcmd(isp, &mbs, MBLOGALL);
++		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++			return;
++		}
++		isp->isp_residx = mbs.param[5];
++
++		mbs.param[0] = MBOX_INIT_REQ_QUEUE_A64;
++		mbs.param[1] = RQUEST_QUEUE_LEN(isp);
++		mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
++		mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
++		mbs.param[5] = 0;
++		mbs.param[6] = DMA_WD3(isp->isp_result_dma);
++		mbs.param[7] = DMA_WD2(isp->isp_result_dma);
++		isp_mboxcmd(isp, &mbs, MBLOGALL);
++		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++			return;
++		}
++		isp->isp_reqidx = isp->isp_reqodx = mbs.param[4];
++	} else {
++		mbs.param[0] = MBOX_INIT_RES_QUEUE;
++		mbs.param[1] = RESULT_QUEUE_LEN(isp);
++		mbs.param[2] = DMA_WD1(isp->isp_result_dma);
++		mbs.param[3] = DMA_WD0(isp->isp_result_dma);
++		mbs.param[4] = 0;
++		isp_mboxcmd(isp, &mbs, MBLOGALL);
++		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++			return;
++		}
++		isp->isp_residx = mbs.param[5];
++
++		mbs.param[0] = MBOX_INIT_REQ_QUEUE;
++		mbs.param[1] = RQUEST_QUEUE_LEN(isp);
++		mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
++		mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
++		mbs.param[5] = 0;
++		isp_mboxcmd(isp, &mbs, MBLOGALL);
++		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++			return;
++		}
++		isp->isp_reqidx = isp->isp_reqodx = mbs.param[4];
++	}
++
++	/*
++	 * Turn on Fast Posting, LVD transitions
++	 *
++	 * Ultra2 F/W always has had fast posting (and LVD transitions)
++	 *
++	 * Ultra and older (i.e., SBus) cards may not. It's just safer
++	 * to assume not for them.
++	 */
++
++	mbs.param[0] = MBOX_SET_FW_FEATURES;
++	mbs.param[1] = 0;
++	if (IS_ULTRA2(isp))
++		mbs.param[1] |= FW_FEATURE_LVD_NOTIFY;
++#ifndef	ISP_NO_RIO
++	if (IS_ULTRA2(isp) || IS_1240(isp))
++		mbs.param[1] |= FW_FEATURE_RIO_16BIT;
++#else
++#ifndef	ISP_NO_FASTPOST
++	if (IS_ULTRA2(isp) || IS_1240(isp))
++		mbs.param[1] |= FW_FEATURE_FAST_POST;
++#endif
++#endif
++	if (mbs.param[1] != 0) {
++		u_int16_t sfeat = mbs.param[1];
++		isp_mboxcmd(isp, &mbs, MBLOGALL);
++		if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++			isp_prt(isp, ISP_LOGINFO,
++			    "Enabled FW features (0x%x)", sfeat);
++		}
++	}
++
++	/*
++	 * Let the outer layers decide whether to issue a SCSI bus reset.
++	 */
++	isp->isp_state = ISP_INITSTATE;
++}
++
++static void
++isp_scsi_channel_init(struct ispsoftc *isp, int channel)
++{
++	sdparam *sdp;
++	mbreg_t mbs;
++	int tgt;
++
++	sdp = isp->isp_param;
++	sdp += channel;
++
++	/*
++	 * Set (possibly new) Initiator ID.
++	 */
++	mbs.param[0] = MBOX_SET_INIT_SCSI_ID;
++	mbs.param[1] = (channel << 7) | sdp->isp_initiator_id;
++	isp_mboxcmd(isp, &mbs, MBLOGALL);
++	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++		return;
++	}
++	isp_prt(isp, ISP_LOGINFO, "Initiator ID is %d on Channel %d",
++	    sdp->isp_initiator_id, channel);
++
++
++	/*
++	 * Set current per-target parameters to an initial safe minimum.
++	 */
++	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++		int lun;
++		u_int16_t sdf;
++
++		if (sdp->isp_devparam[tgt].dev_enable == 0) {
++			continue;
++		}
++#ifndef	ISP_TARGET_MODE
++		sdf = sdp->isp_devparam[tgt].goal_flags;
++		sdf &= DPARM_SAFE_DFLT;
++		/*
++		 * It is not quite clear when this changed over so that
++		 * we could force narrow and async for 1000/1020 cards,
++		 * but assume that this is only the case for loaded
++		 * firmware.
++		 */
++		if (isp->isp_loaded_fw) {
++			sdf |= DPARM_NARROW | DPARM_ASYNC;
++		}
++#else
++		/*
++		 * The !$*!)$!$)* f/w uses the same index into some
++		 * internal table to decide how to respond to negotiations,
++		 * so if we've said "let's be safe" for ID X, and ID X
++		 * selects *us*, the negotiations will back to 'safe'
++		 * (as in narrow/async). What the f/w *should* do is
++		 * use the initiator id settings to decide how to respond.
++		 */
++		sdp->isp_devparam[tgt].goal_flags = sdf = DPARM_DEFAULT;
++#endif
++		mbs.param[0] = MBOX_SET_TARGET_PARAMS;
++		mbs.param[1] = (channel << 15) | (tgt << 8);
++		mbs.param[2] = sdf;
++		if ((sdf & DPARM_SYNC) == 0) {
++			mbs.param[3] = 0;
++		} else {
++			mbs.param[3] =
++			    (sdp->isp_devparam[tgt].goal_offset << 8) |
++			    (sdp->isp_devparam[tgt].goal_period);
++		}
++		isp_prt(isp, ISP_LOGDEBUG0,
++		    "Initial Settings bus%d tgt%d flags 0x%x off 0x%x per 0x%x",
++		    channel, tgt, mbs.param[2], mbs.param[3] >> 8,
++		    mbs.param[3] & 0xff);
++		isp_mboxcmd(isp, &mbs, MBLOGNONE);
++		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++			sdf = DPARM_SAFE_DFLT;
++			mbs.param[0] = MBOX_SET_TARGET_PARAMS;
++			mbs.param[1] = (tgt << 8) | (channel << 15);
++			mbs.param[2] = sdf;
++			mbs.param[3] = 0;
++			isp_mboxcmd(isp, &mbs, MBLOGALL);
++			if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++				continue;
++			}
++		}
++
++		/*
++		 * We don't update any information directly from the f/w
++		 * because we need to run at least one command to cause a
++		 * new state to be latched up. So, we just assume that we
++		 * converge to the values we just had set.
++		 *
++		 * Ensure that we don't believe tagged queuing is enabled yet.
++		 * It turns out that sometimes the ISP just ignores our
++		 * attempts to set parameters for devices that it hasn't
++		 * seen yet.
++		 */
++		sdp->isp_devparam[tgt].actv_flags = sdf & ~DPARM_TQING;
++		for (lun = 0; lun < (int) isp->isp_maxluns; lun++) {
++			mbs.param[0] = MBOX_SET_DEV_QUEUE_PARAMS;
++			mbs.param[1] = (channel << 15) | (tgt << 8) | lun;
++			mbs.param[2] = sdp->isp_max_queue_depth;
++			mbs.param[3] = sdp->isp_devparam[tgt].exc_throttle;
++			isp_mboxcmd(isp, &mbs, MBLOGALL);
++			if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++				break;
++			}
++		}
++	}
++	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++		if (sdp->isp_devparam[tgt].dev_refresh) {
++			isp->isp_sendmarker |= (1 << channel);
++			isp->isp_update |= (1 << channel);
++			break;
++		}
++	}
++}
++
++/*
++ * Fibre Channel specific initialization.
++ *
++ * Locks are held before coming here.
++ */
++static void
++isp_fibre_init(struct ispsoftc *isp)
++{
++	fcparam *fcp;
++	isp_icb_t local, *icbp = &local;
++	mbreg_t mbs;
++	int loopid;
++	u_int64_t nwwn, pwwn;
++
++	fcp = isp->isp_param;
++
++	/*
++	 * Do this *before* initializing the firmware.
++	 */
++	isp_mark_getpdb_all(isp);
++	fcp->isp_fwstate = FW_CONFIG_WAIT;
++	fcp->isp_loopstate = LOOP_NIL;
++
++	/*
++	 * If we have no role (neither target nor initiator), return.
++	 */
++	if (isp->isp_role == ISP_ROLE_NONE) {
++		return;
++	}
++
++	loopid = fcp->isp_loopid;
++	MEMZERO(icbp, sizeof (*icbp));
++	icbp->icb_version = ICB_VERSION1;
++
++	/*
++	 * Firmware Options are either retrieved from NVRAM or
++	 * are patched elsewhere. We check them for sanity here
++	 * and make changes based on board revision, but otherwise
++	 * let others decide policy.
++	 */
++
++	/*
++	 * If this is a 2100 < revision 5, we have to turn off FAIRNESS.
++	 */
++	if ((isp->isp_type == ISP_HA_FC_2100) && isp->isp_revision < 5) {
++		fcp->isp_fwoptions &= ~ICBOPT_FAIRNESS;
++	}
++
++	/*
++	 * We have to use FULL LOGIN even though it resets the loop too much
++	 * because otherwise port database entries don't get updated after
++	 * a LIP- this is a known f/w bug for 2100 f/w less than 1.17.0.
++	 */
++	if (!ISP_FW_NEWER_THAN(isp, 1, 17, 0)) {
++		fcp->isp_fwoptions |= ICBOPT_FULL_LOGIN;
++	}
++
++	/*
++	 * Insist on Port Database Update Async notifications
++	 */
++	fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE;
++
++	/*
++	 * Make sure that target role reflects into fwoptions.
++	 */
++	if (isp->isp_role & ISP_ROLE_TARGET) {
++		fcp->isp_fwoptions |= ICBOPT_TGT_ENABLE;
++	} else {
++		fcp->isp_fwoptions &= ~ICBOPT_TGT_ENABLE;
++	}
++
++	/*
++	 * Propagate all of this into the ICB structure.
++	 */
++	icbp->icb_fwoptions = fcp->isp_fwoptions;
++	icbp->icb_maxfrmlen = fcp->isp_maxfrmlen;
++	if (icbp->icb_maxfrmlen < ICB_MIN_FRMLEN ||
++	    icbp->icb_maxfrmlen > ICB_MAX_FRMLEN) {
++		isp_prt(isp, ISP_LOGERR,
++		    "bad frame length (%d) from NVRAM- using %d",
++		    fcp->isp_maxfrmlen, ICB_DFLT_FRMLEN);
++		icbp->icb_maxfrmlen = ICB_DFLT_FRMLEN;
++	}
++	icbp->icb_maxalloc = fcp->isp_maxalloc;
++	if (icbp->icb_maxalloc < 1) {
++		isp_prt(isp, ISP_LOGERR,
++		    "bad maximum allocation (%d)- using 16", fcp->isp_maxalloc);
++		icbp->icb_maxalloc = 16;
++	}
++	icbp->icb_execthrottle = fcp->isp_execthrottle;
++	if (icbp->icb_execthrottle < 1) {
++		isp_prt(isp, ISP_LOGERR,
++		    "bad execution throttle of %d- using 16",
++		    fcp->isp_execthrottle);
++		icbp->icb_execthrottle = ICB_DFLT_THROTTLE;
++	}
++	icbp->icb_retry_delay = fcp->isp_retry_delay;
++	icbp->icb_retry_count = fcp->isp_retry_count;
++	icbp->icb_hardaddr = loopid;
++	/*
++	 * Right now we just set extended options to prefer point-to-point
++	 * over loop based upon some soft config options.
++	 * 
++	 * NB: for the 2300, ICBOPT_EXTENDED is required.
++	 */
++	if (IS_2200(isp) || IS_23XX(isp)) {
++		icbp->icb_fwoptions |= ICBOPT_EXTENDED;
++		/*
++		 * Prefer or force Point-To-Point instead Loop?
++		 */
++		switch(isp->isp_confopts & ISP_CFG_PORT_PREF) {
++		case ISP_CFG_NPORT:
++			icbp->icb_xfwoptions |= ICBXOPT_PTP_2_LOOP;
++			break;
++		case ISP_CFG_NPORT_ONLY:
++			icbp->icb_xfwoptions |= ICBXOPT_PTP_ONLY;
++			break;
++		case ISP_CFG_LPORT_ONLY:
++			icbp->icb_xfwoptions |= ICBXOPT_LOOP_ONLY;
++			break;
++		default:
++			icbp->icb_xfwoptions |= ICBXOPT_LOOP_2_PTP;
++			break;
++		}
++		if (IS_23XX(isp)) {
++			/*
++			 * QLogic recommends that FAST Posting be turned
++			 * off for 23XX cards and instead allow the HBA
++			 * to write response queue entries and interrupt
++			 * after a delay (ZIO).
++			 *
++			 * If we set ZIO, it will disable fast posting,
++			 * so we don't need to clear it in fwoptions.
++			 */
++#ifndef	ISP_NO_ZIO
++			icbp->icb_xfwoptions |= ICBXOPT_ZIO;
++#else
++			icbp->icb_fwoptions |= ICBOPT_FAST_POST;
++#endif
++#if	0
++			/*
++			 * Values, in 100us increments. The default
++			 * is 2 (200us) if a value 0 (default) is
++			 * selected.
++			 */
++			icbp->icb_idelaytimer = 2;
++#endif
++
++			if (isp->isp_confopts & ISP_CFG_ONEGB) {
++				icbp->icb_zfwoptions |= ICBZOPT_RATE_ONEGB;
++			} else if (isp->isp_confopts & ISP_CFG_TWOGB) {
++				icbp->icb_zfwoptions |= ICBZOPT_RATE_TWOGB;
++			} else {
++				icbp->icb_zfwoptions |= ICBZOPT_RATE_AUTO;
++			}
++		}
++	}
++
++#ifndef	ISP_NO_RIO_FC
++	/*
++	 * RIO seems to be enabled in 2100s for fw >= 1.17.0.
++	 *
++	 * I've had some questionable problems with RIO on 2200.
++	 * More specifically, on a 2204 I had problems with RIO
++	 * on a Linux system where I was dropping commands right
++	 * and left. It's not clear to me what the actual problem
++	 * was.
++	 *
++	 * 23XX Cards do not support RIO. Instead they support ZIO.
++	 */
++#if	0
++	if (!IS_23XX(isp) && ISP_FW_NEWER_THAN(isp, 1, 17, 0)) {
++		icbp->icb_xfwoptions |= ICBXOPT_RIO_16BIT;
++		icbp->icb_racctimer = 4;
++		icbp->icb_idelaytimer = 8;
++	}
++#endif
++#endif
++
++	/*
++	 * For 22XX > 2.1.26 && 23XX, set someoptions.
++	 * XXX: Probably okay for newer 2100 f/w too.
++	 */
++	if (ISP_FW_NEWER_THAN(isp, 2, 26, 0)) {
++		/*
++		 * Turn on LIP F8 async event (1)
++		 * Turn on generate AE 8013 on all LIP Resets (2)
++		 * Disable LIP F7 switching (8)
++		 */
++		mbs.param[0] = MBOX_SET_FIRMWARE_OPTIONS;
++		mbs.param[1] = 0xb;
++		mbs.param[2] = 0;
++		mbs.param[3] = 0;
++		isp_mboxcmd(isp, &mbs, MBLOGALL);
++	}
++	icbp->icb_logintime = 30;	/* 30 second login timeout */
++
++	if (IS_23XX(isp)) {
++		ISP_WRITE(isp, isp->isp_rqstinrp, 0);
++        	ISP_WRITE(isp, isp->isp_rqstoutrp, 0);
++        	ISP_WRITE(isp, isp->isp_respinrp, 0);
++		ISP_WRITE(isp, isp->isp_respoutrp, 0);
++	}
++
++	nwwn = ISP_NODEWWN(isp);
++	pwwn = ISP_PORTWWN(isp);
++	if (nwwn && pwwn) {
++		icbp->icb_fwoptions |= ICBOPT_BOTH_WWNS;
++		MAKE_NODE_NAME_FROM_WWN(icbp->icb_nodename, nwwn);
++		MAKE_NODE_NAME_FROM_WWN(icbp->icb_portname, pwwn);
++		isp_prt(isp, ISP_LOGDEBUG1,
++		    "Setting ICB Node 0x%08x%08x Port 0x%08x%08x",
++		    ((u_int32_t) (nwwn >> 32)),
++		    ((u_int32_t) (nwwn & 0xffffffff)),
++		    ((u_int32_t) (pwwn >> 32)),
++		    ((u_int32_t) (pwwn & 0xffffffff)));
++	} else {
++		isp_prt(isp, ISP_LOGDEBUG1, "Not using any WWNs");
++		icbp->icb_fwoptions &= ~(ICBOPT_BOTH_WWNS|ICBOPT_FULL_LOGIN);
++	}
++	icbp->icb_rqstqlen = RQUEST_QUEUE_LEN(isp);
++	icbp->icb_rsltqlen = RESULT_QUEUE_LEN(isp);
++	icbp->icb_rqstaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_rquest_dma);
++	icbp->icb_rqstaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_rquest_dma);
++	icbp->icb_rqstaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_rquest_dma);
++	icbp->icb_rqstaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_rquest_dma);
++	icbp->icb_respaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_result_dma);
++	icbp->icb_respaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_result_dma);
++	icbp->icb_respaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_result_dma);
++	icbp->icb_respaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_result_dma);
++	isp_prt(isp, ISP_LOGDEBUG0,
++	    "isp_fibre_init: fwopt 0x%x xfwopt 0x%x zfwopt 0x%x",
++	    icbp->icb_fwoptions, icbp->icb_xfwoptions, icbp->icb_zfwoptions);
++
++	FC_SCRATCH_ACQUIRE(isp);
++	isp_put_icb(isp, icbp, (isp_icb_t *)fcp->isp_scratch);
++
++	/*
++	 * Init the firmware
++	 */
++	mbs.param[0] = MBOX_INIT_FIRMWARE;
++	mbs.param[1] = 0;
++	mbs.param[2] = DMA_WD1(fcp->isp_scdma);
++	mbs.param[3] = DMA_WD0(fcp->isp_scdma);
++	mbs.param[4] = 0;
++	mbs.param[5] = 0;
++	mbs.param[6] = DMA_WD3(fcp->isp_scdma);
++	mbs.param[7] = DMA_WD2(fcp->isp_scdma);
++	isp_mboxcmd(isp, &mbs, MBLOGALL);
++	FC_SCRATCH_RELEASE(isp);
++	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++		return;
++	}
++	isp->isp_reqidx = isp->isp_reqodx = 0;
++	isp->isp_residx = 0;
++	isp->isp_sendmarker = 1;
++
++	/*
++	 * Whatever happens, we're now committed to being here.
++	 */
++	isp->isp_state = ISP_INITSTATE;
++}
++
++/*
++ * Fibre Channel Support- get the port database for the id.
++ *
++ * Locks are held before coming here. Return 0 if success,
++ * else failure.
++ */
++
++static int
++isp_getmap(struct ispsoftc *isp, fcpos_map_t *map)
++{
++	fcparam *fcp = (fcparam *) isp->isp_param;
++	mbreg_t mbs;
++
++	mbs.param[0] = MBOX_GET_FC_AL_POSITION_MAP;
++	mbs.param[1] = 0;
++	mbs.param[2] = DMA_WD1(fcp->isp_scdma);
++	mbs.param[3] = DMA_WD0(fcp->isp_scdma);
++	/*
++	 * Unneeded. For the 2100, except for initializing f/w, registers
++	 * 4/5 have to not be written to.
++	 *	mbs.param[4] = 0;
++	 *	mbs.param[5] = 0;
++	 *
++	 */
++	mbs.param[6] = 0;
++	mbs.param[7] = 0;
++	FC_SCRATCH_ACQUIRE(isp);
++	isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR);
++	if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++		MEMCPY(map, fcp->isp_scratch, sizeof (fcpos_map_t));
++		map->fwmap = mbs.param[1] != 0;
++		FC_SCRATCH_RELEASE(isp);
++		return (0);
++	}
++	FC_SCRATCH_RELEASE(isp);
++	return (-1);
++}
++
++static void
++isp_mark_getpdb_all(struct ispsoftc *isp)
++{
++	fcparam *fcp = (fcparam *) isp->isp_param;
++	int i;
++	for (i = 0; i < MAX_FC_TARG; i++) {
++		fcp->portdb[i].valid = fcp->portdb[i].fabric_dev = 0;
++	}
++}
++
++static int
++isp_getpdb(struct ispsoftc *isp, int id, isp_pdb_t *pdbp)
++{
++	fcparam *fcp = (fcparam *) isp->isp_param;
++	mbreg_t mbs;
++
++	mbs.param[0] = MBOX_GET_PORT_DB;
++	mbs.param[1] = id << 8;
++	mbs.param[2] = DMA_WD1(fcp->isp_scdma);
++	mbs.param[3] = DMA_WD0(fcp->isp_scdma);
++	/*
++	 * Unneeded. For the 2100, except for initializing f/w, registers
++	 * 4/5 have to not be written to.
++	 *	mbs.param[4] = 0;
++	 *	mbs.param[5] = 0;
++	 *
++	 */
++	mbs.param[6] = DMA_WD3(fcp->isp_scdma);
++	mbs.param[7] = DMA_WD2(fcp->isp_scdma);
++	FC_SCRATCH_ACQUIRE(isp);
++	isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR);
++	if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++		isp_get_pdb(isp, (isp_pdb_t *)fcp->isp_scratch, pdbp);
++		FC_SCRATCH_RELEASE(isp);
++		return (0);
++	}
++	FC_SCRATCH_RELEASE(isp);
++	return (-1);
++}
++
++static u_int64_t
++isp_get_portname(struct ispsoftc *isp, int loopid, int nodename)
++{
++	u_int64_t wwn = 0;
++	mbreg_t mbs;
++
++	mbs.param[0] = MBOX_GET_PORT_NAME;
++	mbs.param[1] = loopid << 8;
++	if (nodename)
++		mbs.param[1] |= 1;
++	isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR);
++	if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++		wwn =
++		    (((u_int64_t)(mbs.param[2] & 0xff)) << 56) |
++		    (((u_int64_t)(mbs.param[2] >> 8))	<< 48) |
++		    (((u_int64_t)(mbs.param[3] & 0xff))	<< 40) |
++		    (((u_int64_t)(mbs.param[3] >> 8))	<< 32) |
++		    (((u_int64_t)(mbs.param[6] & 0xff))	<< 24) |
++		    (((u_int64_t)(mbs.param[6] >> 8))	<< 16) |
++		    (((u_int64_t)(mbs.param[7] & 0xff))	<<  8) |
++		    (((u_int64_t)(mbs.param[7] >> 8)));
++	}
++	return (wwn);
++}
++
++/*
++ * Make sure we have good FC link and know our Loop ID.
++ */
++
++static int
++isp_fclink_test(struct ispsoftc *isp, int usdelay)
++{
++	static char *toponames[] = {
++		"Private Loop",
++		"FL Port",
++		"N-Port to N-Port",
++		"F Port",
++		"F Port (no FLOGI_ACC response)"
++	};
++	mbreg_t mbs;
++	int count, check_for_fabric;
++	u_int8_t lwfs;
++	fcparam *fcp;
++	struct lportdb *lp;
++	isp_pdb_t pdb;
++
++	fcp = isp->isp_param;
++
++	/*
++	 * XXX: Here is where we would start a 'loop dead' timeout
++	 */
++
++	/*
++	 * Wait up to N microseconds for F/W to go to a ready state.
++	 */
++	lwfs = FW_CONFIG_WAIT;
++	count = 0;
++	while (count < usdelay) {
++		u_int64_t enano;
++		u_int32_t wrk;
++		NANOTIME_T hra, hrb;
++
++		GET_NANOTIME(&hra);
++		isp_fw_state(isp);
++		if (lwfs != fcp->isp_fwstate) {
++			isp_prt(isp, ISP_LOGINFO, "Firmware State <%s->%s>",
++			    isp2100_fw_statename((int)lwfs),
++			    isp2100_fw_statename((int)fcp->isp_fwstate));
++			lwfs = fcp->isp_fwstate;
++		}
++		if (fcp->isp_fwstate == FW_READY) {
++			break;
++		}
++		GET_NANOTIME(&hrb);
++
++		/*
++		 * Get the elapsed time in nanoseconds.
++		 * Always guaranteed to be non-zero.
++		 */
++		enano = NANOTIME_SUB(&hrb, &hra);
++
++		isp_prt(isp, ISP_LOGDEBUG1,
++		    "usec%d: 0x%lx->0x%lx enano 0x%x%08x",
++		    count, (long) GET_NANOSEC(&hra), (long) GET_NANOSEC(&hrb),
++		    (u_int32_t)(enano >> 32), (u_int32_t)(enano & 0xffffffff));
++
++		/*
++		 * If the elapsed time is less than 1 millisecond,
++		 * delay a period of time up to that millisecond of
++		 * waiting.
++		 *
++		 * This peculiar code is an attempt to try and avoid
++		 * invoking u_int64_t math support functions for some
++		 * platforms where linkage is a problem.
++		 */
++		if (enano < (1000 * 1000)) {
++			count += 1000;
++			enano = (1000 * 1000) - enano;
++			while (enano > (u_int64_t) 4000000000U) {
++				USEC_SLEEP(isp, 4000000);
++				enano -= (u_int64_t) 4000000000U;
++			}
++			wrk = enano;
++			wrk /= 1000;
++			USEC_SLEEP(isp, wrk);
++		} else {
++			while (enano > (u_int64_t) 4000000000U) {
++				count += 4000000;
++				enano -= (u_int64_t) 4000000000U;
++			}
++			wrk = enano;
++			count += (wrk / 1000);
++		}
++	}
++
++	/*
++	 * If we haven't gone to 'ready' state, return.
++	 */
++	if (fcp->isp_fwstate != FW_READY) {
++		return (-1);
++	}
++
++	/*
++	 * Get our Loop ID (if possible). We really need to have it.
++	 */
++	mbs.param[0] = MBOX_GET_LOOP_ID;
++	isp_mboxcmd(isp, &mbs, MBLOGALL);
++	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++		return (-1);
++	}
++	fcp->isp_loopid = mbs.param[1];
++	if (IS_2200(isp) || IS_23XX(isp)) {
++		int topo = (int) mbs.param[6];
++		if (topo < TOPO_NL_PORT || topo > TOPO_PTP_STUB)
++			topo = TOPO_PTP_STUB;
++		fcp->isp_topo = topo;
++	} else {
++		fcp->isp_topo = TOPO_NL_PORT;
++	}
++	fcp->isp_portid = fcp->isp_alpa = mbs.param[2] & 0xff;
++
++	/*
++	 * Check to see if we're on a fabric by trying to see if we
++	 * can talk to the fabric name server. This can be a bit
++	 * tricky because if we're a 2100, we should check always
++	 * (in case we're connected to a server doing aliasing).
++	 */
++	fcp->isp_onfabric = 0;
++
++	if (IS_2100(isp)) {
++		/*
++		 * Don't bother with fabric if we are using really old
++		 * 2100 firmware. It's just not worth it.
++		 */
++		if (ISP_FW_NEWER_THAN(isp, 1, 15, 37)) {
++			check_for_fabric = 1;
++		} else {
++			check_for_fabric = 0;
++		}
++	} else if (fcp->isp_topo == TOPO_FL_PORT ||
++	    fcp->isp_topo == TOPO_F_PORT) {
++		check_for_fabric = 1;
++	} else
++		check_for_fabric = 0;
++
++	if (check_for_fabric && isp_getpdb(isp, FL_PORT_ID, &pdb) == 0) {
++		int loopid = FL_PORT_ID;
++		if (IS_2100(isp)) {
++			fcp->isp_topo = TOPO_FL_PORT;
++		}
++
++		if (BITS2WORD(pdb.pdb_portid_bits) == 0) {
++			/*
++			 * Crock.
++			 */
++			fcp->isp_topo = TOPO_NL_PORT;
++			goto not_on_fabric;
++		}
++		fcp->isp_portid = mbs.param[2] | ((int) mbs.param[3] << 16);
++
++		/*
++		 * Save the Fabric controller's port database entry.
++		 */
++		lp = &fcp->portdb[loopid];
++		lp->node_wwn =
++		    (((u_int64_t)pdb.pdb_nodename[0]) << 56) |
++		    (((u_int64_t)pdb.pdb_nodename[1]) << 48) |
++		    (((u_int64_t)pdb.pdb_nodename[2]) << 40) |
++		    (((u_int64_t)pdb.pdb_nodename[3]) << 32) |
++		    (((u_int64_t)pdb.pdb_nodename[4]) << 24) |
++		    (((u_int64_t)pdb.pdb_nodename[5]) << 16) |
++		    (((u_int64_t)pdb.pdb_nodename[6]) <<  8) |
++		    (((u_int64_t)pdb.pdb_nodename[7]));
++		lp->port_wwn =
++		    (((u_int64_t)pdb.pdb_portname[0]) << 56) |
++		    (((u_int64_t)pdb.pdb_portname[1]) << 48) |
++		    (((u_int64_t)pdb.pdb_portname[2]) << 40) |
++		    (((u_int64_t)pdb.pdb_portname[3]) << 32) |
++		    (((u_int64_t)pdb.pdb_portname[4]) << 24) |
++		    (((u_int64_t)pdb.pdb_portname[5]) << 16) |
++		    (((u_int64_t)pdb.pdb_portname[6]) <<  8) |
++		    (((u_int64_t)pdb.pdb_portname[7]));
++		lp->roles =
++		    (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT;
++		lp->portid = BITS2WORD(pdb.pdb_portid_bits);
++		lp->loopid = pdb.pdb_loopid;
++		lp->loggedin = lp->valid = 1;
++		fcp->isp_onfabric = 1;
++		(void) isp_async(isp, ISPASYNC_PROMENADE, &loopid);
++		isp_register_fc4_type(isp);
++	} else {
++not_on_fabric:
++		fcp->isp_onfabric = 0;
++		fcp->portdb[FL_PORT_ID].valid = 0;
++	}
++
++	fcp->isp_gbspeed = 1;
++	if (IS_23XX(isp)) {
++		mbs.param[0] = MBOX_GET_SET_DATA_RATE;
++		mbs.param[1] = MBGSD_GET_RATE;
++		/* mbs.param[2] undefined if we're just getting rate */
++		isp_mboxcmd(isp, &mbs, MBLOGALL);
++		if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++			if (mbs.param[1] == MBGSD_TWOGB) {
++				isp_prt(isp, ISP_LOGINFO, "2Gb link speed/s");
++				fcp->isp_gbspeed = 2;
++			}
++		}
++	}
++
++	isp_prt(isp, ISP_LOGCONFIG, topology, fcp->isp_loopid, fcp->isp_alpa,
++	    fcp->isp_portid, fcp->isp_loopstate, toponames[fcp->isp_topo]);
++
++	/*
++	 * Announce ourselves, too. This involves synthesizing an entry.
++	 */
++	if (fcp->isp_iid_set == 0) {
++		fcp->isp_iid_set = 1;
++		fcp->isp_iid = fcp->isp_loopid;
++		lp = &fcp->portdb[fcp->isp_iid];
++	} else {
++		lp = &fcp->portdb[fcp->isp_iid];
++		if (fcp->isp_portid != lp->portid ||
++		    fcp->isp_loopid != lp->loopid ||
++		    fcp->isp_nodewwn != ISP_NODEWWN(isp) ||
++		    fcp->isp_portwwn != ISP_PORTWWN(isp)) {
++			lp->valid = 0;
++			count = fcp->isp_iid;
++			(void) isp_async(isp, ISPASYNC_PROMENADE, &count);
++		}
++	}
++	lp->loopid = fcp->isp_loopid;
++	lp->portid = fcp->isp_portid;
++	lp->node_wwn = ISP_NODEWWN(isp);
++	lp->port_wwn = ISP_PORTWWN(isp);
++	switch (isp->isp_role) {
++	case ISP_ROLE_NONE:
++		lp->roles = 0;
++		break;
++	case ISP_ROLE_TARGET:
++		lp->roles = SVC3_TGT_ROLE >> SVC3_ROLE_SHIFT;
++		break;
++	case ISP_ROLE_INITIATOR:
++		lp->roles = SVC3_INI_ROLE >> SVC3_ROLE_SHIFT;
++		break;
++	case ISP_ROLE_BOTH:
++		lp->roles = (SVC3_INI_ROLE|SVC3_TGT_ROLE) >> SVC3_ROLE_SHIFT;
++		break;
++	}
++	lp->loggedin = lp->valid = 1;
++	count = fcp->isp_iid;
++	(void) isp_async(isp, ISPASYNC_PROMENADE, &count);
++	return (0);
++}
++
++static char *
++isp2100_fw_statename(int state)
++{
++	switch(state) {
++	case FW_CONFIG_WAIT:	return "Config Wait";
++	case FW_WAIT_AL_PA:	return "Waiting for AL_PA";
++	case FW_WAIT_LOGIN:	return "Wait Login";
++	case FW_READY:		return "Ready";
++	case FW_LOSS_OF_SYNC:	return "Loss Of Sync";
++	case FW_ERROR:		return "Error";
++	case FW_REINIT:		return "Re-Init";
++	case FW_NON_PART:	return "Nonparticipating";
++	default:		return "?????";
++	}
++}
++
++/*
++ * Synchronize our soft copy of the port database with what the f/w thinks
++ * (with a view toward possibly for a specific target....)
++ */
++
++static int
++isp_pdb_sync(struct ispsoftc *isp)
++{
++	struct lportdb *lp;
++	fcparam *fcp = isp->isp_param;
++	isp_pdb_t pdb;
++	int loopid, base, lim;
++
++	/*
++	 * Make sure we're okay for doing this right now.
++	 */
++	if (fcp->isp_loopstate != LOOP_PDB_RCVD &&
++	    fcp->isp_loopstate != LOOP_FSCAN_DONE &&
++	    fcp->isp_loopstate != LOOP_LSCAN_DONE) {
++		return (-1);
++	}
++
++	if (fcp->isp_topo == TOPO_FL_PORT || fcp->isp_topo == TOPO_NL_PORT ||
++	    fcp->isp_topo == TOPO_N_PORT) {
++		if (fcp->isp_loopstate < LOOP_LSCAN_DONE) {
++			if (isp_scan_loop(isp) != 0) {
++				return (-1);
++			}
++		}
++	}
++	fcp->isp_loopstate = LOOP_SYNCING_PDB;
++
++	/*
++	 * If we get this far, we've settled our differences with the f/w
++	 * (for local loop device) and we can say that the loop state is ready.
++	 */
++
++	if (fcp->isp_topo == TOPO_NL_PORT) {
++		fcp->loop_seen_once = 1;
++		fcp->isp_loopstate = LOOP_READY;
++		return (0);
++	}
++
++	/*
++	 * Find all Fabric Entities that didn't make it from one scan to the
++	 * next and let the world know they went away. Scan the whole database.
++	 */
++	for (lp = &fcp->portdb[0]; lp < &fcp->portdb[MAX_FC_TARG]; lp++) {
++		if (lp->was_fabric_dev && lp->fabric_dev == 0) {
++			loopid = lp - fcp->portdb;
++			lp->valid = 0;	/* should already be set */
++			(void) isp_async(isp, ISPASYNC_PROMENADE, &loopid);
++			MEMZERO((void *) lp, sizeof (*lp));
++			continue;
++		}
++		lp->was_fabric_dev = lp->fabric_dev;
++	}
++
++	if (fcp->isp_topo == TOPO_FL_PORT)
++		base = FC_SNS_ID+1;
++	else
++		base = 0;
++
++	if (fcp->isp_topo == TOPO_N_PORT)
++		lim = 1;
++	else
++		lim = MAX_FC_TARG;
++
++	/*
++	 * Now log in any fabric devices that the outer layer has
++	 * left for us to see. This seems the most sane policy
++	 * for the moment.
++	 */
++	for (lp = &fcp->portdb[base]; lp < &fcp->portdb[lim]; lp++) {
++		u_int32_t portid;
++		mbreg_t mbs;
++
++		loopid = lp - fcp->portdb;
++		if (loopid >= FL_PORT_ID && loopid <= FC_SNS_ID) {
++			continue;
++		}
++
++		/*
++		 * Anything here?
++		 */
++		if (lp->port_wwn == 0) {
++			continue;
++		}
++
++		/*
++		 * Don't try to log into yourself.
++		 */
++		if ((portid = lp->portid) == fcp->isp_portid) {
++			continue;
++		}
++
++
++		/*
++		 * If we'd been logged in- see if we still are and we haven't
++		 * changed. If so, no need to log ourselves out, etc..
++		 *
++		 * Unfortunately, our charming Qlogic f/w has decided to
++		 * return a valid port database entry for a fabric device
++		 * that has, in fact, gone away. And it hangs trying to
++		 * log it out.
++		 */
++		if (lp->loggedin && lp->force_logout == 0 &&
++		    isp_getpdb(isp, lp->loopid, &pdb) == 0) {
++			int nrole;
++			u_int64_t nwwnn, nwwpn;
++			nwwnn =
++			    (((u_int64_t)pdb.pdb_nodename[0]) << 56) |
++			    (((u_int64_t)pdb.pdb_nodename[1]) << 48) |
++			    (((u_int64_t)pdb.pdb_nodename[2]) << 40) |
++			    (((u_int64_t)pdb.pdb_nodename[3]) << 32) |
++			    (((u_int64_t)pdb.pdb_nodename[4]) << 24) |
++			    (((u_int64_t)pdb.pdb_nodename[5]) << 16) |
++			    (((u_int64_t)pdb.pdb_nodename[6]) <<  8) |
++			    (((u_int64_t)pdb.pdb_nodename[7]));
++			nwwpn =
++			    (((u_int64_t)pdb.pdb_portname[0]) << 56) |
++			    (((u_int64_t)pdb.pdb_portname[1]) << 48) |
++			    (((u_int64_t)pdb.pdb_portname[2]) << 40) |
++			    (((u_int64_t)pdb.pdb_portname[3]) << 32) |
++			    (((u_int64_t)pdb.pdb_portname[4]) << 24) |
++			    (((u_int64_t)pdb.pdb_portname[5]) << 16) |
++			    (((u_int64_t)pdb.pdb_portname[6]) <<  8) |
++			    (((u_int64_t)pdb.pdb_portname[7]));
++			nrole = (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >>
++			    SVC3_ROLE_SHIFT;
++			if (pdb.pdb_loopid == lp->loopid && lp->portid ==
++			    (u_int32_t) BITS2WORD(pdb.pdb_portid_bits) &&
++			    nwwnn == lp->node_wwn && nwwpn == lp->port_wwn &&
++			    lp->roles == nrole && lp->force_logout == 0) {
++				lp->loggedin = lp->valid = 1;
++				isp_prt(isp, ISP_LOGCONFIG, lretained,
++				    (int) (lp - fcp->portdb),
++				    (int) lp->loopid, lp->portid);
++				continue;
++			}
++		}
++
++		if (fcp->isp_fwstate != FW_READY ||
++		    fcp->isp_loopstate != LOOP_SYNCING_PDB) {
++			return (-1);
++		}
++
++		/*
++		 * Force a logout if we were logged in.
++		 */
++		if (lp->loggedin) {
++			if (lp->force_logout ||
++			    isp_getpdb(isp, lp->loopid, &pdb) == 0) {
++				mbs.param[0] = MBOX_FABRIC_LOGOUT;
++				mbs.param[1] = lp->loopid << 8;
++				mbs.param[2] = 0;
++				mbs.param[3] = 0;
++				isp_mboxcmd(isp, &mbs, MBLOGNONE);
++				isp_prt(isp, ISP_LOGINFO, plogout,
++				    (int) (lp - fcp->portdb), lp->loopid,
++				    lp->portid);
++			}
++			lp->force_logout = lp->loggedin = 0;
++			if (fcp->isp_fwstate != FW_READY ||
++			    fcp->isp_loopstate != LOOP_SYNCING_PDB) {
++				return (-1);
++			}
++		}
++
++		/*
++		 * And log in....
++		 */
++		loopid = lp - fcp->portdb;
++		lp->loopid = FL_PORT_ID;
++		do {
++			mbs.param[0] = MBOX_FABRIC_LOGIN;
++			mbs.param[1] = loopid << 8;
++			mbs.param[2] = portid >> 16;
++			mbs.param[3] = portid & 0xffff;
++			isp_mboxcmd(isp, &mbs, MBLOGALL & ~(MBOX_LOOP_ID_USED |
++			    MBOX_PORT_ID_USED | MBOX_COMMAND_ERROR));
++			if (fcp->isp_fwstate != FW_READY ||
++			    fcp->isp_loopstate != LOOP_SYNCING_PDB) {
++				return (-1);
++			}
++			switch (mbs.param[0]) {
++			case MBOX_LOOP_ID_USED:
++				/*
++				 * Try the next available loop id.
++				 */
++				loopid++;
++				break;
++			case MBOX_PORT_ID_USED:
++				/*
++				 * This port is already logged in.
++				 * Snaffle the loop id it's using if it's
++				 * nonzero, otherwise we're hosed.
++				 */
++				if (mbs.param[1] != 0) {
++					loopid = mbs.param[1];
++					isp_prt(isp, ISP_LOGINFO, retained,
++					    loopid, (int) (lp - fcp->portdb),
++					    lp->portid);
++				} else {
++					loopid = MAX_FC_TARG;
++					break;
++				}
++				/* FALLTHROUGH */
++			case MBOX_COMMAND_COMPLETE:
++				lp->loggedin = 1;
++				lp->loopid = loopid;
++				break;
++			case MBOX_COMMAND_ERROR:
++				isp_prt(isp, ISP_LOGINFO, plogierr,
++				    portid, mbs.param[1]);
++				/* FALLTHROUGH */
++			case MBOX_ALL_IDS_USED: /* We're outta IDs */
++			default:
++				loopid = MAX_FC_TARG;
++				break;
++			}
++		} while (lp->loopid == FL_PORT_ID && loopid < MAX_FC_TARG);
++
++		/*
++		 * If we get here and we haven't set a Loop ID,
++		 * we failed to log into this device.
++		 */
++
++		if (lp->loopid == FL_PORT_ID) {
++			lp->loopid = 0;
++			continue;
++		}
++
++		/*
++		 * Make sure we can get the approriate port information.
++		 */
++		if (isp_getpdb(isp, lp->loopid, &pdb) != 0) {
++			isp_prt(isp, ISP_LOGWARN, nopdb, lp->portid);
++			goto dump_em;
++		}
++
++		if (fcp->isp_fwstate != FW_READY ||
++		    fcp->isp_loopstate != LOOP_SYNCING_PDB) {
++			return (-1);
++		}
++
++		if (pdb.pdb_loopid != lp->loopid) {
++			isp_prt(isp, ISP_LOGWARN, pdbmfail1,
++			    lp->portid, pdb.pdb_loopid);
++			goto dump_em;
++		}
++
++		if (lp->portid != (u_int32_t) BITS2WORD(pdb.pdb_portid_bits)) {
++			isp_prt(isp, ISP_LOGWARN, pdbmfail2,
++			    lp->portid, BITS2WORD(pdb.pdb_portid_bits));
++			goto dump_em;
++		}
++
++		lp->roles =
++		    (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT;
++		lp->node_wwn =
++		    (((u_int64_t)pdb.pdb_nodename[0]) << 56) |
++		    (((u_int64_t)pdb.pdb_nodename[1]) << 48) |
++		    (((u_int64_t)pdb.pdb_nodename[2]) << 40) |
++		    (((u_int64_t)pdb.pdb_nodename[3]) << 32) |
++		    (((u_int64_t)pdb.pdb_nodename[4]) << 24) |
++		    (((u_int64_t)pdb.pdb_nodename[5]) << 16) |
++		    (((u_int64_t)pdb.pdb_nodename[6]) <<  8) |
++		    (((u_int64_t)pdb.pdb_nodename[7]));
++		lp->port_wwn =
++		    (((u_int64_t)pdb.pdb_portname[0]) << 56) |
++		    (((u_int64_t)pdb.pdb_portname[1]) << 48) |
++		    (((u_int64_t)pdb.pdb_portname[2]) << 40) |
++		    (((u_int64_t)pdb.pdb_portname[3]) << 32) |
++		    (((u_int64_t)pdb.pdb_portname[4]) << 24) |
++		    (((u_int64_t)pdb.pdb_portname[5]) << 16) |
++		    (((u_int64_t)pdb.pdb_portname[6]) <<  8) |
++		    (((u_int64_t)pdb.pdb_portname[7]));
++		/*
++		 * Check to make sure this all makes sense.
++		 */
++		if (lp->node_wwn && lp->port_wwn) {
++			lp->valid = 1;
++			loopid = lp - fcp->portdb;
++			(void) isp_async(isp, ISPASYNC_PROMENADE, &loopid);
++			continue;
++		}
++dump_em:
++		lp->valid = 0;
++		isp_prt(isp, ISP_LOGINFO,
++		    ldumped, loopid, lp->loopid, lp->portid);
++		mbs.param[0] = MBOX_FABRIC_LOGOUT;
++		mbs.param[1] = lp->loopid << 8;
++		mbs.param[2] = 0;
++		mbs.param[3] = 0;
++		isp_mboxcmd(isp, &mbs, MBLOGNONE);
++		if (fcp->isp_fwstate != FW_READY ||
++		    fcp->isp_loopstate != LOOP_SYNCING_PDB) {
++			return (-1);
++		}
++	}
++	/*
++	 * If we get here, we've for sure seen not only a valid loop
++	 * but know what is or isn't on it, so mark this for usage
++	 * in isp_start.
++	 */
++	fcp->loop_seen_once = 1;
++	fcp->isp_loopstate = LOOP_READY;
++	return (0);
++}
++
++static int
++isp_scan_loop(struct ispsoftc *isp)
++{
++	struct lportdb *lp;
++	fcparam *fcp = isp->isp_param;
++	isp_pdb_t pdb;
++	int loopid, lim, hival;
++
++	switch (fcp->isp_topo) {
++	case TOPO_NL_PORT:
++		hival = FL_PORT_ID;
++		break;
++	case TOPO_N_PORT:
++		hival = 2;
++		break;
++	case TOPO_FL_PORT:
++		hival = FC_PORT_ID;
++		break;
++	default:
++		fcp->isp_loopstate = LOOP_LSCAN_DONE;
++		return (0);
++	}
++	fcp->isp_loopstate = LOOP_SCANNING_LOOP;
++
++	/*
++	 * make sure the temp port database is clean...
++	 */
++	MEMZERO((void *)fcp->tport, sizeof (fcp->tport));
++
++	/*
++	 * Run through the local loop ports and get port database info
++	 * for each loop ID.
++	 *
++	 * There's a somewhat unexplained situation where the f/w passes back
++	 * the wrong database entity- if that happens, just restart (up to
++	 * FL_PORT_ID times).
++	 */
++	for (lim = loopid = 0; loopid < hival; loopid++) {
++		lp = &fcp->tport[loopid];
++
++		/*
++		 * Don't even try for ourselves...
++	 	 */
++		if (loopid == fcp->isp_loopid)
++			continue;
++
++		lp->node_wwn = isp_get_portname(isp, loopid, 1);
++		if (fcp->isp_loopstate < LOOP_SCANNING_LOOP)
++			return (-1);
++		if (lp->node_wwn == 0)
++			continue;
++		lp->port_wwn = isp_get_portname(isp, loopid, 0);
++		if (fcp->isp_loopstate < LOOP_SCANNING_LOOP)
++			return (-1);
++		if (lp->port_wwn == 0) {
++			lp->node_wwn = 0;
++			continue;
++		}
++
++		/*
++		 * Get an entry....
++		 */
++		if (isp_getpdb(isp, loopid, &pdb) != 0) {
++			if (fcp->isp_loopstate < LOOP_SCANNING_LOOP)
++				return (-1);
++			continue;
++		}
++		if (fcp->isp_loopstate < LOOP_SCANNING_LOOP) {
++			return (-1);
++		}
++
++		/*
++		 * If the returned database element doesn't match what we
++		 * asked for, restart the process entirely (up to a point...).
++		 */
++		if (pdb.pdb_loopid != loopid) {
++			loopid = 0;
++			if (lim++ < hival) {
++				continue;
++			}
++			isp_prt(isp, ISP_LOGWARN,
++			    "giving up on synchronizing the port database");
++			return (-1);
++		}
++
++		/*
++		 * Save the pertinent info locally.
++		 */
++		lp->node_wwn =
++		    (((u_int64_t)pdb.pdb_nodename[0]) << 56) |
++		    (((u_int64_t)pdb.pdb_nodename[1]) << 48) |
++		    (((u_int64_t)pdb.pdb_nodename[2]) << 40) |
++		    (((u_int64_t)pdb.pdb_nodename[3]) << 32) |
++		    (((u_int64_t)pdb.pdb_nodename[4]) << 24) |
++		    (((u_int64_t)pdb.pdb_nodename[5]) << 16) |
++		    (((u_int64_t)pdb.pdb_nodename[6]) <<  8) |
++		    (((u_int64_t)pdb.pdb_nodename[7]));
++		lp->port_wwn =
++		    (((u_int64_t)pdb.pdb_portname[0]) << 56) |
++		    (((u_int64_t)pdb.pdb_portname[1]) << 48) |
++		    (((u_int64_t)pdb.pdb_portname[2]) << 40) |
++		    (((u_int64_t)pdb.pdb_portname[3]) << 32) |
++		    (((u_int64_t)pdb.pdb_portname[4]) << 24) |
++		    (((u_int64_t)pdb.pdb_portname[5]) << 16) |
++		    (((u_int64_t)pdb.pdb_portname[6]) <<  8) |
++		    (((u_int64_t)pdb.pdb_portname[7]));
++		lp->roles =
++		    (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT;
++		lp->portid = BITS2WORD(pdb.pdb_portid_bits);
++		lp->loopid = pdb.pdb_loopid;
++	}
++
++	/*
++	 * Mark all of the permanent local loop database entries as invalid
++	 * (except our own entry).
++	 */
++	for (loopid = 0; loopid < hival; loopid++) {
++		if (loopid == fcp->isp_iid) {
++			fcp->portdb[loopid].valid = 1;
++			fcp->portdb[loopid].loopid = fcp->isp_loopid;
++			continue;
++		}
++		fcp->portdb[loopid].valid = 0;
++	}
++
++	/*
++	 * Now merge our local copy of the port database into our saved copy.
++	 * Notify the outer layers of new devices arriving.
++	 */
++	for (loopid = 0; loopid < hival; loopid++) {
++		int i;
++
++		/*
++		 * If we don't have a non-zero Port WWN, we're not here.
++		 */
++		if (fcp->tport[loopid].port_wwn == 0) {
++			continue;
++		}
++
++		/*
++		 * Skip ourselves.
++		 */
++		if (loopid == fcp->isp_iid) {
++			continue;
++		}
++
++		/*
++		 * For the purposes of deciding whether this is the
++		 * 'same' device or not, we only search for an identical
++		 * Port WWN. Node WWNs may or may not be the same as
++		 * the Port WWN, and there may be multiple different
++		 * Port WWNs with the same Node WWN. It would be chaos
++		 * to have multiple identical Port WWNs, so we don't
++		 * allow that.
++		 */
++
++		for (i = 0; i < hival; i++) {
++			int j;
++			if (fcp->portdb[i].port_wwn == 0)
++				continue;
++			if (fcp->portdb[i].port_wwn !=
++			    fcp->tport[loopid].port_wwn)
++				continue;
++			/*
++			 * We found this WWN elsewhere- it's changed
++			 * loopids then. We don't change it's actual
++			 * position in our cached port database- we
++			 * just change the actual loop ID we'd use.
++			 */
++			if (fcp->portdb[i].loopid != loopid) {
++				isp_prt(isp, ISP_LOGINFO, portshift, i,
++				    fcp->portdb[i].loopid,
++				    fcp->portdb[i].portid, loopid,
++				    fcp->tport[loopid].portid);
++			}
++			fcp->portdb[i].portid = fcp->tport[loopid].portid;
++			fcp->portdb[i].loopid = loopid;
++			fcp->portdb[i].valid = 1;
++			fcp->portdb[i].roles = fcp->tport[loopid].roles;
++
++			/*
++			 * Now make sure this Port WWN doesn't exist elsewhere
++			 * in the port database.
++			 */
++			for (j = i+1; j < hival; j++) {
++				if (fcp->portdb[i].port_wwn !=
++				    fcp->portdb[j].port_wwn) {
++					continue;
++				}
++				isp_prt(isp, ISP_LOGWARN, portdup, j, i);
++				/*
++				 * Invalidate the 'old' *and* 'new' ones.
++				 * This is really harsh and not quite right,
++				 * but if this happens, we really don't know
++				 * who is what at this point.
++				 */
++				fcp->portdb[i].valid = 0;
++				fcp->portdb[j].valid = 0;
++			}
++			break;
++		}
++
++		/*
++		 * If we didn't traverse the entire port database,
++		 * then we found (and remapped) an existing entry.
++		 * No need to notify anyone- go for the next one.
++		 */
++		if (i < hival) {
++			isp_prt(isp, ISP_LOGINFO, retained,
++			    fcp->portdb[i].loopid, i, fcp->portdb[i].portid);
++			continue;
++		}
++
++		/*
++		 * We've not found this Port WWN anywhere. It's a new entry.
++		 * See if we can leave it where it is (with target == loopid).
++		 */
++		if (fcp->portdb[loopid].port_wwn != 0) {
++			for (lim = 0; lim < hival; lim++) {
++				if (fcp->portdb[lim].port_wwn == 0)
++					break;
++			}
++			/* "Cannot Happen" */
++			if (lim == hival) {
++				isp_prt(isp, ISP_LOGWARN, "Remap Overflow");
++				continue;
++			}
++			i = lim;
++		} else {
++			i = loopid;
++		}
++
++		/*
++		 * NB:	The actual loopid we use here is loopid- we may
++		 *	in fact be at a completely different index (target).
++		 */
++		fcp->portdb[i].loopid = loopid;
++		fcp->portdb[i].port_wwn = fcp->tport[loopid].port_wwn;
++		fcp->portdb[i].node_wwn = fcp->tport[loopid].node_wwn;
++		fcp->portdb[i].roles = fcp->tport[loopid].roles;
++		fcp->portdb[i].portid = fcp->tport[loopid].portid;
++		fcp->portdb[i].valid = 1;
++
++		/*
++		 * Tell the outside world we've arrived.
++		 */
++		(void) isp_async(isp, ISPASYNC_PROMENADE, &i);
++	}
++
++	/*
++	 * Now find all previously used targets that are now invalid and
++	 * notify the outer layers that they're gone.
++	 */
++	for (lp = &fcp->portdb[0]; lp < &fcp->portdb[hival]; lp++) {
++		if (lp->valid || lp->port_wwn == 0) {
++			continue;
++		}
++
++		/*
++		 * Tell the outside world we've gone
++		 * away and erase our pdb entry.
++		 *
++		 */
++		loopid = lp - fcp->portdb;
++		(void) isp_async(isp, ISPASYNC_PROMENADE, &loopid);
++		MEMZERO((void *) lp, sizeof (*lp));
++	}
++	fcp->isp_loopstate = LOOP_LSCAN_DONE;
++	return (0);
++}
++
++
++static int
++isp_fabric_mbox_cmd(struct ispsoftc *isp, mbreg_t *mbp)
++{
++	isp_mboxcmd(isp, mbp, MBLOGNONE);
++	if (mbp->param[0] != MBOX_COMMAND_COMPLETE) {
++		if (FCPARAM(isp)->isp_loopstate == LOOP_SCANNING_FABRIC) {
++			FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD;
++		}
++		if (mbp->param[0] == MBOX_COMMAND_ERROR) {
++			char tbuf[16];
++			char *m;
++			switch (mbp->param[1]) {
++			case 1:
++				m = "No Loop";
++				break;
++			case 2:
++				m = "Failed to allocate IOCB buffer";
++				break;
++			case 3:
++				m = "Failed to allocate XCB buffer";
++				break;
++			case 4:
++				m = "timeout or transmit failed";
++				break;
++			case 5:
++				m = "no fabric loop";
++				break;
++			case 6:
++				m = "remote device not a target";
++				break;
++			default:
++				SNPRINTF(tbuf, sizeof tbuf, "%x",
++				    mbp->param[1]);
++				m = tbuf;
++				break;
++			}
++			isp_prt(isp, ISP_LOGERR, "SNS Failed- %s", m);
++		}
++		return (-1);
++	}
++
++	if (FCPARAM(isp)->isp_fwstate != FW_READY ||
++	    FCPARAM(isp)->isp_loopstate < LOOP_SCANNING_FABRIC) {
++		return (-1);
++	}
++	return(0);
++}
++
++#ifdef	ISP_USE_GA_NXT
++static int
++isp_scan_fabric(struct ispsoftc *isp, int ftype)
++{
++	fcparam *fcp = isp->isp_param;
++	u_int32_t portid, first_portid, last_portid;
++	int hicap, last_port_same;
++
++	if (fcp->isp_onfabric == 0) {
++		fcp->isp_loopstate = LOOP_FSCAN_DONE;
++		return (0);
++	}
++
++	FC_SCRATCH_ACQUIRE(isp);
++
++	/*
++	 * Since Port IDs are 24 bits, we can check against having seen
++	 * anything yet with this value.
++	 */
++	last_port_same = 0;
++	last_portid = 0xffffffff;	/* not a port */
++	first_portid = portid = fcp->isp_portid;
++	fcp->isp_loopstate = LOOP_SCANNING_FABRIC;
++
++	for (hicap = 0; hicap < GA_NXT_MAX; hicap++) {
++		mbreg_t mbs;
++		sns_screq_t *rq;
++		sns_ga_nxt_rsp_t *rs0, *rs1;
++		struct lportdb lcl;
++		u_int8_t sc[SNS_GA_NXT_RESP_SIZE];
++
++		rq = (sns_screq_t *)sc;
++		MEMZERO((void *) rq, SNS_GA_NXT_REQ_SIZE);
++		rq->snscb_rblen = SNS_GA_NXT_RESP_SIZE >> 1;
++		rq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+0x100);
++		rq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+0x100);
++		rq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+0x100);
++		rq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+0x100);
++		rq->snscb_sblen = 6;
++		rq->snscb_data[0] = SNS_GA_NXT;
++		rq->snscb_data[4] = portid & 0xffff;
++		rq->snscb_data[5] = (portid >> 16) & 0xff;
++		isp_put_sns_request(isp, rq, (sns_screq_t *) fcp->isp_scratch);
++		MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GA_NXT_REQ_SIZE);
++		mbs.param[0] = MBOX_SEND_SNS;
++		mbs.param[1] = SNS_GA_NXT_REQ_SIZE >> 1;
++		mbs.param[2] = DMA_WD1(fcp->isp_scdma);
++		mbs.param[3] = DMA_WD0(fcp->isp_scdma);
++		/*
++		 * Leave 4 and 5 alone
++		 */
++		mbs.param[6] = DMA_WD3(fcp->isp_scdma);
++		mbs.param[7] = DMA_WD2(fcp->isp_scdma);
++		if (isp_fabric_mbox_cmd(isp, &mbs)) {
++			if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) {
++				fcp->isp_loopstate = LOOP_PDB_RCVD;
++			}
++			FC_SCRATCH_RELEASE(isp);
++			return (-1);
++		}
++		MEMORYBARRIER(isp, SYNC_SFORCPU, 0x100, SNS_GA_NXT_RESP_SIZE);
++		rs1 = (sns_ga_nxt_rsp_t *) sc;
++		rs0 = (sns_ga_nxt_rsp_t *) ((u_int8_t *)fcp->isp_scratch+0x100);
++		isp_get_ga_nxt_response(isp, rs0, rs1);
++		if (rs1->snscb_cthdr.ct_response != FS_ACC) {
++			int level;
++			if (rs1->snscb_cthdr.ct_reason == 9 &&
++			    rs1->snscb_cthdr.ct_explanation == 7)
++				level = ISP_LOGDEBUG0;
++			else
++				level = ISP_LOGWARN;
++			isp_prt(isp, level, swrej, "GA_NXT",
++			    rs1->snscb_cthdr.ct_reason,
++			    rs1->snscb_cthdr.ct_explanation, portid);
++			FC_SCRATCH_RELEASE(isp);
++			fcp->isp_loopstate = LOOP_FSCAN_DONE;
++			return (0);
++		}
++		portid =
++		    (((u_int32_t) rs1->snscb_port_id[0]) << 16) |
++		    (((u_int32_t) rs1->snscb_port_id[1]) << 8) |
++		    (((u_int32_t) rs1->snscb_port_id[2]));
++
++		/*
++		 * XXX: We should check to make sure that this entry
++		 * XXX: supports the type(s) we are interested in.
++		 */
++		/*
++		 * Okay, we now have information about a fabric object.
++		 * If it is the type we're interested in, tell the outer layers
++		 * about it. The outer layer needs to  know: Port ID, WWNN,
++		 * WWPN, FC4 type, and port type.
++		 *
++		 * The lportdb structure is adequate for this.
++		 */
++		MEMZERO(&lcl, sizeof (lcl));
++		lcl.port_type = rs1->snscb_port_type;
++		lcl.fc4_type = ftype;
++		lcl.portid = portid;
++		lcl.node_wwn =
++		    (((u_int64_t)rs1->snscb_nodename[0]) << 56) |
++		    (((u_int64_t)rs1->snscb_nodename[1]) << 48) |
++		    (((u_int64_t)rs1->snscb_nodename[2]) << 40) |
++		    (((u_int64_t)rs1->snscb_nodename[3]) << 32) |
++		    (((u_int64_t)rs1->snscb_nodename[4]) << 24) |
++		    (((u_int64_t)rs1->snscb_nodename[5]) << 16) |
++		    (((u_int64_t)rs1->snscb_nodename[6]) <<  8) |
++		    (((u_int64_t)rs1->snscb_nodename[7]));
++		lcl.port_wwn =
++		    (((u_int64_t)rs1->snscb_portname[0]) << 56) |
++		    (((u_int64_t)rs1->snscb_portname[1]) << 48) |
++		    (((u_int64_t)rs1->snscb_portname[2]) << 40) |
++		    (((u_int64_t)rs1->snscb_portname[3]) << 32) |
++		    (((u_int64_t)rs1->snscb_portname[4]) << 24) |
++		    (((u_int64_t)rs1->snscb_portname[5]) << 16) |
++		    (((u_int64_t)rs1->snscb_portname[6]) <<  8) |
++		    (((u_int64_t)rs1->snscb_portname[7]));
++
++		/*
++		 * Does this fabric object support the type we want?
++		 * If not, skip it.
++		 */
++		if (rs1->snscb_fc4_types[ftype >> 5] & (1 << (ftype & 0x1f))) {
++			if (first_portid == portid) {
++				lcl.last_fabric_dev = 1;
++			} else {
++				lcl.last_fabric_dev = 0;
++			}
++			(void) isp_async(isp, ISPASYNC_FABRIC_DEV, &lcl);
++		} else {
++			isp_prt(isp, ISP_LOGDEBUG0,
++			    "PortID 0x%x doesn't support FC4 type 0x%x",
++			    portid, ftype);
++		}
++		if (first_portid == portid) {
++			fcp->isp_loopstate = LOOP_FSCAN_DONE;
++			FC_SCRATCH_RELEASE(isp);
++			return (0);
++		}
++		if (portid == last_portid) {
++			if (last_port_same++ > 20) {
++				isp_prt(isp, ISP_LOGWARN,
++				    "tangled fabric database detected");
++				break;
++			}
++		} else {
++			last_port_same = 0 ;
++			last_portid = portid;
++		}
++	}
++	FC_SCRATCH_RELEASE(isp);
++	if (hicap >= GA_NXT_MAX) {
++		isp_prt(isp, ISP_LOGWARN, "fabric too big (> %d)", GA_NXT_MAX);
++	}
++	fcp->isp_loopstate = LOOP_FSCAN_DONE;
++	return (0);
++}
++#else
++#define	GIDLEN	((ISP2100_SCRLEN >> 1) + 16)
++#define	NGENT	((GIDLEN - 16) >> 2)
++
++#define	IGPOFF	(ISP2100_SCRLEN - GIDLEN)
++#define	GXOFF	(256)
++
++static int
++isp_scan_fabric(struct ispsoftc *isp, int ftype)
++{
++	fcparam *fcp = FCPARAM(isp);
++	mbreg_t mbs;
++	int i;
++	sns_gid_ft_req_t *rq;
++	sns_gid_ft_rsp_t *rs0, *rs1;
++
++	if (fcp->isp_onfabric == 0) {
++		fcp->isp_loopstate = LOOP_FSCAN_DONE;
++		return (0);
++	}
++
++	FC_SCRATCH_ACQUIRE(isp);
++	fcp->isp_loopstate = LOOP_SCANNING_FABRIC;
++
++	rq = (sns_gid_ft_req_t *)fcp->tport;
++	MEMZERO((void *) rq, SNS_GID_FT_REQ_SIZE);
++	rq->snscb_rblen = GIDLEN >> 1;
++	rq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+IGPOFF);
++	rq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+IGPOFF);
++	rq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+IGPOFF);
++	rq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+IGPOFF);
++	rq->snscb_sblen = 6;
++	rq->snscb_cmd = SNS_GID_FT;
++	rq->snscb_mword_div_2 = NGENT;
++	rq->snscb_fc4_type = ftype;
++	isp_put_gid_ft_request(isp, rq, (sns_gid_ft_req_t *) fcp->isp_scratch);
++	MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GID_FT_REQ_SIZE);
++	mbs.param[0] = MBOX_SEND_SNS;
++	mbs.param[1] = SNS_GID_FT_REQ_SIZE >> 1;
++	mbs.param[2] = DMA_WD1(fcp->isp_scdma);
++	mbs.param[3] = DMA_WD0(fcp->isp_scdma);
++
++	/*
++	 * Leave 4 and 5 alone
++	 */
++	mbs.param[6] = DMA_WD3(fcp->isp_scdma);
++	mbs.param[7] = DMA_WD2(fcp->isp_scdma);
++	if (isp_fabric_mbox_cmd(isp, &mbs)) {
++		if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) {
++			fcp->isp_loopstate = LOOP_PDB_RCVD;
++		}
++		FC_SCRATCH_RELEASE(isp);
++		return (-1);
++	}
++	if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
++		FC_SCRATCH_RELEASE(isp);
++		return (-1);
++	}
++	MEMORYBARRIER(isp, SYNC_SFORCPU, IGPOFF, GIDLEN);
++	rs1 = (sns_gid_ft_rsp_t *) fcp->tport;
++	rs0 = (sns_gid_ft_rsp_t *) ((u_int8_t *)fcp->isp_scratch+IGPOFF);
++	isp_get_gid_ft_response(isp, rs0, rs1, NGENT);
++	if (rs1->snscb_cthdr.ct_response != FS_ACC) {
++		int level;
++		if (rs1->snscb_cthdr.ct_reason == 9 &&
++		    rs1->snscb_cthdr.ct_explanation == 7)
++			level = ISP_LOGDEBUG0;
++		else
++			level = ISP_LOGWARN;
++		isp_prt(isp, level, swrej, "GID_FT",
++		    rs1->snscb_cthdr.ct_reason,
++		    rs1->snscb_cthdr.ct_explanation, 0);
++		FC_SCRATCH_RELEASE(isp);
++		fcp->isp_loopstate = LOOP_FSCAN_DONE;
++		return (0);
++	}
++
++	/*
++	 * Okay, we now have a list of Port IDs for this class of device.
++	 * Go through the list and for each one get the WWPN/WWNN for it
++	 * and tell the outer layers about it. The outer layer needs to
++	 * know: Port ID, WWNN, WWPN, FC4 type, and (possibly) port type.
++	 *
++	 * The lportdb structure is adequate for this.
++	 */
++	i = -1;
++	do {
++		sns_gxn_id_req_t grqbuf, *gq = &grqbuf;
++		sns_gxn_id_rsp_t *gs0, grsbuf, *gs1 = &grsbuf;
++		struct lportdb lcl;
++#if	0
++		sns_gff_id_rsp_t *fs0, ffsbuf, *fs1 = &ffsbuf;
++#endif
++
++		i++;
++		MEMZERO(&lcl, sizeof (lcl));
++		lcl.fc4_type = ftype;
++		lcl.portid =
++		    (((u_int32_t) rs1->snscb_ports[i].portid[0]) << 16) |
++		    (((u_int32_t) rs1->snscb_ports[i].portid[1]) << 8) |
++		    (((u_int32_t) rs1->snscb_ports[i].portid[2]));
++
++		MEMZERO((void *) gq, sizeof (sns_gxn_id_req_t));
++		gq->snscb_rblen = SNS_GXN_ID_RESP_SIZE >> 1;
++		gq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+GXOFF);
++		gq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+GXOFF);
++		gq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+GXOFF);
++		gq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+GXOFF);
++		gq->snscb_sblen = 6;
++		gq->snscb_cmd = SNS_GPN_ID;
++		gq->snscb_portid = lcl.portid;
++		isp_put_gxn_id_request(isp, gq,
++		    (sns_gxn_id_req_t *) fcp->isp_scratch);
++		MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GXN_ID_REQ_SIZE);
++		mbs.param[0] = MBOX_SEND_SNS;
++		mbs.param[1] = SNS_GXN_ID_REQ_SIZE >> 1;
++		mbs.param[2] = DMA_WD1(fcp->isp_scdma);
++		mbs.param[3] = DMA_WD0(fcp->isp_scdma);
++		/*
++		 * Leave 4 and 5 alone
++		 */
++		mbs.param[6] = DMA_WD3(fcp->isp_scdma);
++		mbs.param[7] = DMA_WD2(fcp->isp_scdma);
++		if (isp_fabric_mbox_cmd(isp, &mbs)) {
++			if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) {
++				fcp->isp_loopstate = LOOP_PDB_RCVD;
++			}
++			FC_SCRATCH_RELEASE(isp);
++			return (-1);
++		}
++		if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
++			FC_SCRATCH_RELEASE(isp);
++			return (-1);
++		}
++		MEMORYBARRIER(isp, SYNC_SFORCPU, GXOFF, SNS_GXN_ID_RESP_SIZE);
++		gs0 = (sns_gxn_id_rsp_t *) ((u_int8_t *)fcp->isp_scratch+GXOFF);
++		isp_get_gxn_id_response(isp, gs0, gs1);
++		if (gs1->snscb_cthdr.ct_response != FS_ACC) {
++			isp_prt(isp, ISP_LOGWARN, swrej, "GPN_ID",
++			    gs1->snscb_cthdr.ct_reason,
++			    gs1->snscb_cthdr.ct_explanation, lcl.portid);
++			if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
++				FC_SCRATCH_RELEASE(isp);
++				return (-1);
++			}
++			continue;
++		}
++		lcl.port_wwn = 
++		    (((u_int64_t)gs1->snscb_wwn[0]) << 56) |
++		    (((u_int64_t)gs1->snscb_wwn[1]) << 48) |
++		    (((u_int64_t)gs1->snscb_wwn[2]) << 40) |
++		    (((u_int64_t)gs1->snscb_wwn[3]) << 32) |
++		    (((u_int64_t)gs1->snscb_wwn[4]) << 24) |
++		    (((u_int64_t)gs1->snscb_wwn[5]) << 16) |
++		    (((u_int64_t)gs1->snscb_wwn[6]) <<  8) |
++		    (((u_int64_t)gs1->snscb_wwn[7]));
++
++		MEMZERO((void *) gq, sizeof (sns_gxn_id_req_t));
++		gq->snscb_rblen = SNS_GXN_ID_RESP_SIZE >> 1;
++		gq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+GXOFF);
++		gq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+GXOFF);
++		gq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+GXOFF);
++		gq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+GXOFF);
++		gq->snscb_sblen = 6;
++		gq->snscb_cmd = SNS_GNN_ID;
++		gq->snscb_portid = lcl.portid;
++		isp_put_gxn_id_request(isp, gq,
++		    (sns_gxn_id_req_t *) fcp->isp_scratch);
++		MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GXN_ID_REQ_SIZE);
++		mbs.param[0] = MBOX_SEND_SNS;
++		mbs.param[1] = SNS_GXN_ID_REQ_SIZE >> 1;
++		mbs.param[2] = DMA_WD1(fcp->isp_scdma);
++		mbs.param[3] = DMA_WD0(fcp->isp_scdma);
++		/*
++		 * Leave 4 and 5 alone
++		 */
++		mbs.param[6] = DMA_WD3(fcp->isp_scdma);
++		mbs.param[7] = DMA_WD2(fcp->isp_scdma);
++		if (isp_fabric_mbox_cmd(isp, &mbs)) {
++			if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) {
++				fcp->isp_loopstate = LOOP_PDB_RCVD;
++			}
++			FC_SCRATCH_RELEASE(isp);
++			return (-1);
++		}
++		if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
++			FC_SCRATCH_RELEASE(isp);
++			return (-1);
++		}
++		MEMORYBARRIER(isp, SYNC_SFORCPU, GXOFF, SNS_GXN_ID_RESP_SIZE);
++		gs0 = (sns_gxn_id_rsp_t *) ((u_int8_t *)fcp->isp_scratch+GXOFF);
++		isp_get_gxn_id_response(isp, gs0, gs1);
++		if (gs1->snscb_cthdr.ct_response != FS_ACC) {
++			isp_prt(isp, ISP_LOGWARN, swrej, "GNN_ID",
++			    gs1->snscb_cthdr.ct_reason,
++			    gs1->snscb_cthdr.ct_explanation, lcl.portid);
++			if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
++				FC_SCRATCH_RELEASE(isp);
++				return (-1);
++			}
++			continue;
++		}
++		lcl.node_wwn = 
++		    (((u_int64_t)gs1->snscb_wwn[0]) << 56) |
++		    (((u_int64_t)gs1->snscb_wwn[1]) << 48) |
++		    (((u_int64_t)gs1->snscb_wwn[2]) << 40) |
++		    (((u_int64_t)gs1->snscb_wwn[3]) << 32) |
++		    (((u_int64_t)gs1->snscb_wwn[4]) << 24) |
++		    (((u_int64_t)gs1->snscb_wwn[5]) << 16) |
++		    (((u_int64_t)gs1->snscb_wwn[6]) <<  8) |
++		    (((u_int64_t)gs1->snscb_wwn[7]));
++
++		/*
++		 * The QLogic f/w is bouncing this with a parameter error.
++		 */
++#if	0
++		/*
++		 * Try and get FC4 Features (FC-GS-3 only).
++		 * We can use the sns_gxn_id_req_t for this request.
++		 */
++		MEMZERO((void *) gq, sizeof (sns_gxn_id_req_t));
++		gq->snscb_rblen = SNS_GFF_ID_RESP_SIZE >> 1;
++		gq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+GXOFF);
++		gq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+GXOFF);
++		gq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+GXOFF);
++		gq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+GXOFF);
++		gq->snscb_sblen = 6;
++		gq->snscb_cmd = SNS_GFF_ID;
++		gq->snscb_portid = lcl.portid;
++		isp_put_gxn_id_request(isp, gq,
++		    (sns_gxn_id_req_t *) fcp->isp_scratch);
++		MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GXN_ID_REQ_SIZE);
++		mbs.param[0] = MBOX_SEND_SNS;
++		mbs.param[1] = SNS_GXN_ID_REQ_SIZE >> 1;
++		mbs.param[2] = DMA_WD1(fcp->isp_scdma);
++		mbs.param[3] = DMA_WD0(fcp->isp_scdma);
++		/*
++		 * Leave 4 and 5 alone
++		 */
++		mbs.param[6] = DMA_WD3(fcp->isp_scdma);
++		mbs.param[7] = DMA_WD2(fcp->isp_scdma);
++		if (isp_fabric_mbox_cmd(isp, &mbs)) {
++			if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) {
++				fcp->isp_loopstate = LOOP_PDB_RCVD;
++			}
++			FC_SCRATCH_RELEASE(isp);
++			return (-1);
++		}
++		if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
++			FC_SCRATCH_RELEASE(isp);
++			return (-1);
++		}
++		MEMORYBARRIER(isp, SYNC_SFORCPU, GXOFF, SNS_GFF_ID_RESP_SIZE);
++		fs0 = (sns_gff_id_rsp_t *) ((u_int8_t *)fcp->isp_scratch+GXOFF);
++		isp_get_gff_id_response(isp, fs0, fs1);
++		if (fs1->snscb_cthdr.ct_response != FS_ACC) {
++			isp_prt(isp, /* ISP_LOGDEBUG0 */ ISP_LOGWARN,
++			    swrej, "GFF_ID",
++			    fs1->snscb_cthdr.ct_reason,
++			    fs1->snscb_cthdr.ct_explanation, lcl.portid);
++			if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
++				FC_SCRATCH_RELEASE(isp);
++				return (-1);
++			}
++		} else {
++			int index = (ftype >> 3);
++			int bshft = (ftype & 0x7) * 4;
++			int fc4_fval =
++			    (fs1->snscb_fc4_features[index] >> bshft) & 0xf;
++			if (fc4_fval & 0x1) {
++				lcl.roles |=
++				    (SVC3_INI_ROLE >> SVC3_ROLE_SHIFT);
++			}
++			if (fc4_fval & 0x2) {
++				lcl.roles |=
++				    (SVC3_TGT_ROLE >> SVC3_ROLE_SHIFT);
++			}
++		}
++#endif
++
++		/*
++		 * If we really want to know what kind of port type this is,
++		 * we have to run another CT command. Otherwise, we'll leave
++		 * it as undefined.
++		 *
++		lcl.port_type = 0;
++		 */
++		if (rs1->snscb_ports[i].control & 0x80) {
++			lcl.last_fabric_dev = 1;
++		} else {
++			lcl.last_fabric_dev = 0;
++		}
++		(void) isp_async(isp, ISPASYNC_FABRIC_DEV, &lcl);
++
++	} while ((rs1->snscb_ports[i].control & 0x80) == 0 && i < NGENT-1);
++
++	/*
++	 * If we're not at the last entry, our list isn't big enough.
++	 */
++	if ((rs1->snscb_ports[i].control & 0x80) == 0) {
++		isp_prt(isp, ISP_LOGWARN, "fabric too big for scratch area");
++	}
++
++	FC_SCRATCH_RELEASE(isp);
++	fcp->isp_loopstate = LOOP_FSCAN_DONE;
++	return (0);
++}
++#endif
++
++static void
++isp_register_fc4_type(struct ispsoftc *isp)
++{
++	fcparam *fcp = isp->isp_param;
++	u_int8_t local[SNS_RFT_ID_REQ_SIZE];
++	sns_screq_t *reqp = (sns_screq_t *) local;
++	mbreg_t mbs;
++
++	MEMZERO((void *) reqp, SNS_RFT_ID_REQ_SIZE);
++	reqp->snscb_rblen = SNS_RFT_ID_RESP_SIZE >> 1;
++	reqp->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma + 0x100);
++	reqp->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma + 0x100);
++	reqp->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma + 0x100);
++	reqp->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma + 0x100);
++	reqp->snscb_sblen = 22;
++	reqp->snscb_data[0] = SNS_RFT_ID;
++	reqp->snscb_data[4] = fcp->isp_portid & 0xffff;
++	reqp->snscb_data[5] = (fcp->isp_portid >> 16) & 0xff;
++	reqp->snscb_data[6] = (1 << FC4_SCSI);
++#if	0
++	reqp->snscb_data[6] |= (1 << FC4_IP);	/* ISO/IEC 8802-2 LLC/SNAP */
++#endif
++	FC_SCRATCH_ACQUIRE(isp);
++	isp_put_sns_request(isp, reqp, (sns_screq_t *) fcp->isp_scratch);
++	mbs.param[0] = MBOX_SEND_SNS;
++	mbs.param[1] = SNS_RFT_ID_REQ_SIZE >> 1;
++	mbs.param[2] = DMA_WD1(fcp->isp_scdma);
++	mbs.param[3] = DMA_WD0(fcp->isp_scdma);
++	/*
++	 * Leave 4 and 5 alone
++	 */
++	mbs.param[6] = DMA_WD3(fcp->isp_scdma);
++	mbs.param[7] = DMA_WD2(fcp->isp_scdma);
++	isp_mboxcmd(isp, &mbs, MBLOGALL);
++	FC_SCRATCH_RELEASE(isp);
++	if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++		isp_prt(isp, ISP_LOGDEBUG0, "Register FC4 types succeeded");
++	}
++}
++
++/*
++ * Start a command. Locking is assumed done in the caller.
++ */
++
++int
++isp_start(XS_T *xs)
++{
++	struct ispsoftc *isp;
++	u_int16_t nxti, optr, handle;
++	u_int8_t local[QENTRY_LEN];
++	ispreq_t *reqp, *qep;
++	int target, i;
++
++	XS_INITERR(xs);
++	isp = XS_ISP(xs);
++
++	/*
++	 * Check to make sure we're supporting initiator role.
++	 */
++	if ((isp->isp_role & ISP_ROLE_INITIATOR) == 0) {
++		XS_SETERR(xs, HBA_SELTIMEOUT);
++		return (CMD_COMPLETE);
++	}
++
++	/*
++	 * Now make sure we're running.
++	 */
++
++	if (isp->isp_state != ISP_RUNSTATE) {
++		isp_prt(isp, ISP_LOGERR, "Adapter not at RUNSTATE");
++		XS_SETERR(xs, HBA_BOTCH);
++		return (CMD_COMPLETE);
++	}
++
++	/*
++	 * Check command CDB length, etc.. We really are limited to 16 bytes
++	 * for Fibre Channel, but can do up to 44 bytes in parallel SCSI,
++	 * but probably only if we're running fairly new firmware (we'll
++	 * let the old f/w choke on an extended command queue entry).
++	 */
++
++	if (XS_CDBLEN(xs) > (IS_FC(isp)? 16 : 44) || XS_CDBLEN(xs) == 0) {
++		isp_prt(isp, ISP_LOGERR,
++		    "unsupported cdb length (%d, CDB[0]=0x%x)",
++		    XS_CDBLEN(xs), XS_CDBP(xs)[0] & 0xff);
++		XS_SETERR(xs, HBA_BOTCH);
++		return (CMD_COMPLETE);
++	}
++
++	/*
++	 * Check to see whether we have good firmware state still or
++	 * need to refresh our port database for this target.
++	 */
++	target = XS_TGT(xs);
++	if (IS_FC(isp)) {
++		fcparam *fcp = isp->isp_param;
++		struct lportdb *lp;
++#ifdef	HANDLE_LOOPSTATE_IN_OUTER_LAYERS
++		if (fcp->isp_fwstate != FW_READY ||
++		    fcp->isp_loopstate != LOOP_READY) {
++			return (CMD_RQLATER);
++		}
++
++		/*
++		 * If we're not on a Fabric, we can't have a target
++		 * above FL_PORT_ID-1.
++		 *
++		 * If we're on a fabric and *not* connected as an F-port,
++		 * we can't have a target less than FC_SNS_ID+1. This
++		 * keeps us from having to sort out the difference between
++		 * local public loop devices and those which we might get
++		 * from a switch's database.
++		 */
++		if (fcp->isp_onfabric == 0) {
++			if (target >= FL_PORT_ID) {
++				XS_SETERR(xs, HBA_SELTIMEOUT);
++				return (CMD_COMPLETE);
++			}
++		} else {
++			if (target >= FL_PORT_ID && target <= FC_SNS_ID) {
++				XS_SETERR(xs, HBA_SELTIMEOUT);
++				return (CMD_COMPLETE);
++			}
++			/*
++			 * We used to exclude having local loop ports
++			 * at the same time that we have fabric ports.
++			 * That is, we used to exclude having ports
++			 * at < FL_PORT_ID if we're FL-port.
++			 *
++			 * That's wrong. The only thing that could be
++			 * dicey is if the switch you're connected to
++			 * has these local loop ports appear on the
++			 * fabric and we somehow attach them twice.
++			 */
++		}
++#else
++		/*
++		 * Check for f/w being in ready state. If the f/w
++		 * isn't in ready state, then we don't know our
++		 * loop ID and the f/w hasn't completed logging
++		 * into all targets on the loop. If this is the
++		 * case, then bounce the command. We pretend this is
++		 * a SELECTION TIMEOUT error if we've never gone to
++		 * FW_READY state at all- in this case we may not
++		 * be hooked to a loop at all and we shouldn't hang
++		 * the machine for this. Otherwise, defer this command
++		 * until later.
++		 */
++		if (fcp->isp_fwstate != FW_READY) {
++			/*
++			 * Give ourselves at most a 250ms delay.
++			 */
++			if (isp_fclink_test(isp, 250000)) {
++				XS_SETERR(xs, HBA_SELTIMEOUT);
++				if (fcp->loop_seen_once) {
++					return (CMD_RQLATER);
++				} else {
++					return (CMD_COMPLETE);
++				}
++			}
++		}
++
++		/*
++		 * If we're not on a Fabric, we can't have a target
++		 * above FL_PORT_ID-1.
++		 *
++		 * If we're on a fabric and *not* connected as an F-port,
++		 * we can't have a target less than FC_SNS_ID+1. This
++		 * keeps us from having to sort out the difference between
++		 * local public loop devices and those which we might get
++		 * from a switch's database.
++		 */
++		if (fcp->isp_onfabric == 0) {
++			if (target >= FL_PORT_ID) {
++				XS_SETERR(xs, HBA_SELTIMEOUT);
++				return (CMD_COMPLETE);
++			}
++		} else {
++			if (target >= FL_PORT_ID && target <= FC_SNS_ID) {
++				XS_SETERR(xs, HBA_SELTIMEOUT);
++				return (CMD_COMPLETE);
++			}
++			if (fcp->isp_topo != TOPO_F_PORT &&
++			    target < FL_PORT_ID) {
++				XS_SETERR(xs, HBA_SELTIMEOUT);
++				return (CMD_COMPLETE);
++			}
++		}
++
++		/*
++		 * If our loop state is such that we haven't yet received
++		 * a "Port Database Changed" notification (after a LIP or
++		 * a Loop Reset or firmware initialization), then defer
++		 * sending commands for a little while, but only if we've
++		 * seen a valid loop at one point (otherwise we can get
++		 * stuck at initialization time).
++		 */
++		if (fcp->isp_loopstate < LOOP_PDB_RCVD) {
++			XS_SETERR(xs, HBA_SELTIMEOUT);
++			if (fcp->loop_seen_once) {
++				return (CMD_RQLATER);
++			} else {
++				return (CMD_COMPLETE);
++			}
++		}
++
++		/*
++		 * If we're in the middle of loop or fabric scanning
++		 * or merging the port databases, retry this command later.
++		 */
++		if (fcp->isp_loopstate == LOOP_SCANNING_FABRIC ||
++		    fcp->isp_loopstate == LOOP_SCANNING_LOOP ||
++		    fcp->isp_loopstate == LOOP_SYNCING_PDB) {
++			return (CMD_RQLATER);
++		}
++
++		/*
++		 * If our loop state is now such that we've just now
++		 * received a Port Database Change notification, then
++		 * we have to go off and (re)scan the fabric. We back
++		 * out and try again later if this doesn't work.
++		 */
++		if (fcp->isp_loopstate == LOOP_PDB_RCVD && fcp->isp_onfabric) {
++			if (isp_scan_fabric(isp, FC4_SCSI)) {
++				return (CMD_RQLATER);
++			}
++			if (fcp->isp_fwstate != FW_READY ||
++			    fcp->isp_loopstate < LOOP_FSCAN_DONE) {
++				return (CMD_RQLATER);
++			}
++		}
++
++		/*
++		 * If our loop state is now such that we've just now
++		 * received a Port Database Change notification, then
++		 * we have to go off and (re)synchronize our port
++		 * database.
++		 */
++		if (fcp->isp_loopstate < LOOP_READY) {
++			if (isp_pdb_sync(isp)) {
++				return (CMD_RQLATER);
++			}
++			if (fcp->isp_fwstate != FW_READY ||
++			    fcp->isp_loopstate != LOOP_READY) {
++				return (CMD_RQLATER);
++			}
++		}
++
++		/*
++		 * XXX: Here's were we would cancel any loop_dead flag
++		 * XXX: also cancel in dead_loop timeout that's running
++		 */
++#endif
++
++		/*
++		 * Now check whether we should even think about pursuing this.
++		 */
++		lp = &fcp->portdb[target];
++		if (lp->valid == 0) {
++			XS_SETERR(xs, HBA_SELTIMEOUT);
++			return (CMD_COMPLETE);
++		}
++		if ((lp->roles & (SVC3_TGT_ROLE >> SVC3_ROLE_SHIFT)) == 0) {
++			isp_prt(isp, ISP_LOGDEBUG2,
++			    "Target %d does not have target service", target);
++			XS_SETERR(xs, HBA_SELTIMEOUT);
++			return (CMD_COMPLETE);
++		}
++		/*
++		 * Now turn target into what the actual Loop ID is.
++		 */
++		target = lp->loopid;
++	}
++
++	/*
++	 * Next check to see if any HBA or Device
++	 * parameters need to be updated.
++	 */
++	if (isp->isp_update != 0) {
++		isp_update(isp);
++	}
++
++	if (isp_getrqentry(isp, &nxti, &optr, (void *)&qep)) {
++		isp_prt(isp, ISP_LOGDEBUG0, "Request Queue Overflow");
++		XS_SETERR(xs, HBA_BOTCH);
++		return (CMD_EAGAIN);
++	}
++
++	/*
++	 * Now see if we need to synchronize the ISP with respect to anything.
++	 * We do dual duty here (cough) for synchronizing for busses other
++	 * than which we got here to send a command to.
++	 */
++	reqp = (ispreq_t *) local;
++	if (isp->isp_sendmarker) {
++		u_int8_t n = (IS_DUALBUS(isp)? 2: 1);
++		/*
++		 * Check ports to send markers for...
++		 */
++		for (i = 0; i < n; i++) {
++			if ((isp->isp_sendmarker & (1 << i)) == 0) {
++				continue;
++			}
++			MEMZERO((void *) reqp, QENTRY_LEN);
++			reqp->req_header.rqs_entry_count = 1;
++			reqp->req_header.rqs_entry_type = RQSTYPE_MARKER;
++			reqp->req_modifier = SYNC_ALL;
++			reqp->req_target = i << 7;	/* insert bus number */
++			isp_put_request(isp, reqp, qep);
++			ISP_ADD_REQUEST(isp, nxti);
++			isp->isp_sendmarker &= ~(1 << i);
++			if (isp_getrqentry(isp, &nxti, &optr, (void *) &qep)) {
++				isp_prt(isp, ISP_LOGDEBUG0,
++				    "Request Queue Overflow+");
++				XS_SETERR(xs, HBA_BOTCH);
++				return (CMD_EAGAIN);
++			}
++		}
++	}
++
++	MEMZERO((void *)reqp, QENTRY_LEN);
++	reqp->req_header.rqs_entry_count = 1;
++	if (IS_FC(isp)) {
++		reqp->req_header.rqs_entry_type = RQSTYPE_T2RQS;
++	} else {
++		if (XS_CDBLEN(xs) > 12)
++			reqp->req_header.rqs_entry_type = RQSTYPE_CMDONLY;
++		else
++			reqp->req_header.rqs_entry_type = RQSTYPE_REQUEST;
++	}
++	/* reqp->req_header.rqs_flags = 0; */
++	/* reqp->req_header.rqs_seqno = 0; */
++	if (IS_FC(isp)) {
++		/*
++		 * See comment in isp_intr
++		 */
++		/* XS_RESID(xs) = 0; */
++
++		/*
++		 * Fibre Channel always requires some kind of tag.
++		 * The Qlogic drivers seem be happy not to use a tag,
++		 * but this breaks for some devices (IBM drives).
++		 */
++		if (XS_TAG_P(xs)) {
++			((ispreqt2_t *)reqp)->req_flags = XS_TAG_TYPE(xs);
++		} else {
++			/*
++			 * If we don't know what tag to use, use HEAD OF QUEUE
++			 * for Request Sense or Simple.
++			 */
++			if (XS_CDBP(xs)[0] == 0x3)	/* REQUEST SENSE */
++				((ispreqt2_t *)reqp)->req_flags = REQFLAG_HTAG;
++			else
++				((ispreqt2_t *)reqp)->req_flags = REQFLAG_STAG;
++		}
++	} else {
++		sdparam *sdp = (sdparam *)isp->isp_param;
++		sdp += XS_CHANNEL(xs);
++		if ((sdp->isp_devparam[target].actv_flags & DPARM_TQING) &&
++		    XS_TAG_P(xs)) {
++			reqp->req_flags = XS_TAG_TYPE(xs);
++		}
++	}
++	reqp->req_target = target | (XS_CHANNEL(xs) << 7);
++	if (IS_SCSI(isp)) {
++		reqp->req_lun_trn = XS_LUN(xs);
++		reqp->req_cdblen = XS_CDBLEN(xs);
++	} else {
++		if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN)
++			((ispreqt2_t *)reqp)->req_scclun = XS_LUN(xs);
++		else
++			((ispreqt2_t *)reqp)->req_lun_trn = XS_LUN(xs);
++	}
++	MEMCPY(reqp->req_cdb, XS_CDBP(xs), XS_CDBLEN(xs));
++
++	reqp->req_time = XS_TIME(xs) / 1000;
++	if (reqp->req_time == 0 && XS_TIME(xs)) {
++		reqp->req_time = 1;
++	}
++
++	if (isp_save_xs(isp, xs, &handle)) {
++		isp_prt(isp, ISP_LOGDEBUG0, "out of xflist pointers");
++		XS_SETERR(xs, HBA_BOTCH);
++		return (CMD_EAGAIN);
++	}
++	reqp->req_handle = handle;
++
++	/*
++	 * Set up DMA and/or do any bus swizzling of the request entry
++	 * so that the Qlogic F/W understands what is being asked of it.
++	 */
++	i = ISP_DMASETUP(isp, xs, reqp, &nxti, optr);
++	if (i != CMD_QUEUED) {
++		isp_destroy_handle(isp, handle);
++		/*
++		 * dmasetup sets actual error in packet, and
++		 * return what we were given to return.
++		 */
++		return (i);
++	}
++	XS_SETERR(xs, HBA_NOERROR);
++	isp_prt(isp, ISP_LOGDEBUG2,
++	    "START cmd for %d.%d.%d cmd 0x%x datalen %ld",
++	    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), XS_CDBP(xs)[0],
++	    (long) XS_XFRLEN(xs));
++	ISP_ADD_REQUEST(isp, nxti);
++	isp->isp_nactive++;
++	return (CMD_QUEUED);
++}
++
++/*
++ * isp control
++ * Locks (ints blocked) assumed held.
++ */
++
++int
++isp_control(struct ispsoftc *isp, ispctl_t ctl, void *arg)
++{
++	XS_T *xs;
++	mbreg_t mbs;
++	int bus, tgt;
++	u_int16_t handle;
++
++	switch (ctl) {
++	default:
++		isp_prt(isp, ISP_LOGERR, "Unknown Control Opcode 0x%x", ctl);
++		break;
++
++	case ISPCTL_RESET_BUS:
++		/*
++		 * Issue a bus reset.
++		 */
++		mbs.param[0] = MBOX_BUS_RESET;
++		mbs.param[2] = 0;
++		if (IS_SCSI(isp)) {
++			mbs.param[1] =
++			    ((sdparam *) isp->isp_param)->isp_bus_reset_delay;
++			if (mbs.param[1] < 2)
++				mbs.param[1] = 2;
++			bus = *((int *) arg);
++			if (IS_DUALBUS(isp))
++				mbs.param[2] = bus;
++		} else {
++			mbs.param[1] = 10;
++			bus = 0;
++		}
++		isp->isp_sendmarker |= (1 << bus);
++		isp_mboxcmd(isp, &mbs, MBLOGALL);
++		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++			break;
++		}
++		isp_prt(isp, ISP_LOGINFO,
++		    "driver initiated bus reset of bus %d", bus);
++		return (0);
++
++	case ISPCTL_RESET_DEV:
++		tgt = (*((int *) arg)) & 0xffff;
++		bus = (*((int *) arg)) >> 16;
++		mbs.param[0] = MBOX_ABORT_TARGET;
++		mbs.param[1] = (tgt << 8) | (bus << 15);
++		mbs.param[2] = 3;	/* 'delay', in seconds */
++		isp_mboxcmd(isp, &mbs, MBLOGALL);
++		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++			break;
++		}
++		isp_prt(isp, ISP_LOGINFO,
++		    "Target %d on Bus %d Reset Succeeded", tgt, bus);
++		isp->isp_sendmarker |= (1 << bus);
++		return (0);
++
++	case ISPCTL_ABORT_CMD:
++		xs = (XS_T *) arg;
++		tgt = XS_TGT(xs);
++		handle = isp_find_handle(isp, xs);
++		if (handle == 0) {
++			isp_prt(isp, ISP_LOGWARN,
++			    "cannot find handle for command to abort");
++			break;
++		}
++		bus = XS_CHANNEL(xs);
++		mbs.param[0] = MBOX_ABORT;
++		if (IS_FC(isp)) {
++			if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN)  {
++				mbs.param[1] = tgt << 8;
++				mbs.param[4] = 0;
++				mbs.param[5] = 0;
++				mbs.param[6] = XS_LUN(xs);
++			} else {
++				mbs.param[1] = tgt << 8 | XS_LUN(xs);
++			}
++		} else {
++			mbs.param[1] =
++			    (bus << 15) | (XS_TGT(xs) << 8) | XS_LUN(xs);
++		}
++		mbs.param[3] = 0;
++		mbs.param[2] = handle;
++		isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_ERROR);
++		if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++			return (0);
++		}
++		/*
++		 * XXX: Look for command in the REQUEST QUEUE. That is,
++		 * XXX: It hasen't been picked up by firmware yet.
++		 */
++		break;
++
++	case ISPCTL_UPDATE_PARAMS:
++
++		isp_update(isp);
++		return (0);
++
++	case ISPCTL_FCLINK_TEST:
++
++		if (IS_FC(isp)) {
++			int usdelay = (arg)? *((int *) arg) : 250000;
++			return (isp_fclink_test(isp, usdelay));
++		}
++		break;
++
++	case ISPCTL_SCAN_FABRIC:
++
++		if (IS_FC(isp)) {
++			int ftype = (arg)? *((int *) arg) : FC4_SCSI;
++			return (isp_scan_fabric(isp, ftype));
++		}
++		break;
++
++	case ISPCTL_SCAN_LOOP:
++
++		if (IS_FC(isp)) {
++			return (isp_scan_loop(isp));
++		}
++		break;
++
++	case ISPCTL_PDB_SYNC:
++
++		if (IS_FC(isp)) {
++			return (isp_pdb_sync(isp));
++		}
++		break;
++
++	case ISPCTL_SEND_LIP:
++
++		if (IS_FC(isp)) {
++			mbs.param[0] = MBOX_INIT_LIP;
++			isp_mboxcmd(isp, &mbs, MBLOGALL);
++			if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++				return (0);
++			}
++		}
++		break;
++
++	case ISPCTL_GET_POSMAP:
++
++		if (IS_FC(isp) && arg) {
++			return (isp_getmap(isp, arg));
++		}
++		break;
++
++	case ISPCTL_RUN_MBOXCMD:
++
++		isp_mboxcmd(isp, arg, MBLOGALL);
++		return(0);
++
++#ifdef	ISP_TARGET_MODE
++	case ISPCTL_TOGGLE_TMODE:
++	{
++
++		/*
++		 * We don't check/set against role here- that's the
++		 * responsibility for the outer layer to coordinate.
++		 */
++		if (IS_SCSI(isp)) {
++			int param = *(int *)arg;
++			mbs.param[0] = MBOX_ENABLE_TARGET_MODE;
++			mbs.param[1] = param & 0xffff;
++			mbs.param[2] = param >> 16;
++			isp_mboxcmd(isp, &mbs, MBLOGALL);
++			if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++				break;
++			}
++		}
++		return (0);
++	}
++#endif
++	}
++	return (-1);
++}
++
++/*
++ * Interrupt Service Routine(s).
++ *
++ * External (OS) framework has done the appropriate locking,
++ * and the locking will be held throughout this function.
++ */
++
++/*
++ * Limit our stack depth by sticking with the max likely number
++ * of completions on a request queue at any one time.
++ */
++#ifndef	MAX_REQUESTQ_COMPLETIONS
++#define	MAX_REQUESTQ_COMPLETIONS	64
++#endif
++
++void
++isp_intr(struct ispsoftc *isp, u_int16_t isr, u_int16_t sema, u_int16_t mbox)
++{
++	XS_T *complist[MAX_REQUESTQ_COMPLETIONS], *xs;
++	u_int16_t iptr, optr, junk;
++	int i, nlooked = 0, ndone = 0;
++
++again:
++	/*
++	 * Is this a mailbox related interrupt?
++	 * The mailbox semaphore will be nonzero if so.
++	 */
++	if (sema) {
++		if (mbox & 0x4000) {
++			isp->isp_intmboxc++;
++			if (isp->isp_mboxbsy) {
++				int i = 0, obits = isp->isp_obits;
++				isp->isp_mboxtmp[i++] = mbox;
++				for (i = 1; i < MAX_MAILBOX; i++) {
++					if ((obits & (1 << i)) == 0) {
++						continue;
++					}
++					isp->isp_mboxtmp[i] =
++					    ISP_READ(isp, MBOX_OFF(i));
++				}
++				if (isp->isp_mbxwrk0) {
++					if (isp_mbox_continue(isp) == 0) {
++						return;
++					}
++				}
++				MBOX_NOTIFY_COMPLETE(isp);
++			} else {
++				isp_prt(isp, ISP_LOGWARN,
++				    "Mbox Command Async (0x%x) with no waiters",
++				    mbox);
++			}
++		} else if (isp_parse_async(isp, mbox) < 0) {
++			return;
++		}
++		if ((IS_FC(isp) && mbox != ASYNC_RIO_RESP) ||
++		    isp->isp_state != ISP_RUNSTATE) {
++			ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
++			ISP_WRITE(isp, BIU_SEMA, 0);
++			return;
++		}
++	}
++
++	/*
++	 * We can't be getting this now.
++	 */
++	if (isp->isp_state != ISP_RUNSTATE) {
++		isp_prt(isp, ISP_LOGWARN,
++		    "interrupt (ISR=%x SEMA=%x) when not ready", isr, sema);
++		/*
++		 * Thank you very much!  *Burrrp*!
++		 */
++		WRITE_RESPONSE_QUEUE_OUT_POINTER(isp,
++		    READ_RESPONSE_QUEUE_IN_POINTER(isp));
++
++		ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
++		ISP_WRITE(isp, BIU_SEMA, 0);
++		return;
++	}
++
++	/*
++	 * Get the current Response Queue Out Pointer.
++	 *
++	 * If we're a 2300, we can ask what hardware what it thinks.
++	 */
++	if (IS_23XX(isp)) {
++		optr = ISP_READ(isp, isp->isp_respoutrp);
++		/*
++		 * Debug: to be taken out eventually
++		 */
++		if (isp->isp_residx != optr) {
++			isp_prt(isp, ISP_LOGWARN, "optr %x soft optr %x",
++			    optr, isp->isp_residx);
++		}
++	} else {
++		optr = isp->isp_residx;
++	}
++
++	/*
++	 * You *must* read the Response Queue In Pointer
++	 * prior to clearing the RISC interrupt.
++	 *
++	 * Debounce the 2300 if revision less than 2.
++	 */
++	if (IS_2100(isp) || (IS_2300(isp) && isp->isp_revision < 2)) {
++		i = 0;
++		do {
++			iptr = READ_RESPONSE_QUEUE_IN_POINTER(isp);
++			junk = READ_RESPONSE_QUEUE_IN_POINTER(isp);
++		} while (junk != iptr && ++i < 1000);
++
++		if (iptr != junk) {
++			ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
++			isp_prt(isp, ISP_LOGWARN,
++			    "Response Queue Out Pointer Unstable (%x, %x)",
++			    iptr, junk);
++			return;
++		}
++	} else {
++		iptr = READ_RESPONSE_QUEUE_IN_POINTER(isp);
++	}
++	isp->isp_resodx = iptr;
++
++
++	if (optr == iptr && sema == 0) {
++		/*
++		 * There are a lot of these- reasons unknown- mostly on
++		 * faster Alpha machines.
++		 *
++		 * I tried delaying after writing HCCR_CMD_CLEAR_RISC_INT to
++		 * make sure the old interrupt went away (to avoid 'ringing'
++		 * effects), but that didn't stop this from occurring.
++		 */
++		if (IS_23XX(isp)) {
++			USEC_DELAY(100);
++			iptr = READ_RESPONSE_QUEUE_IN_POINTER(isp);
++			junk = ISP_READ(isp, BIU_R2HSTSLO);
++		} else {
++			junk = ISP_READ(isp, BIU_ISR);
++		}
++		if (optr == iptr) {
++			if (IS_23XX(isp)) {
++				;
++			} else {
++				sema = ISP_READ(isp, BIU_SEMA);
++				mbox = ISP_READ(isp, OUTMAILBOX0);
++				if ((sema & 0x3) && (mbox & 0x8000)) {
++					goto again;
++				}
++			}
++			isp->isp_intbogus++;
++			isp_prt(isp, ISP_LOGDEBUG1,
++			    "bogus intr- isr %x (%x) iptr %x optr %x",
++			    isr, junk, iptr, optr);
++		}
++	}
++	isp->isp_resodx = iptr;
++	ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
++	ISP_WRITE(isp, BIU_SEMA, 0);
++
++	if (isp->isp_rspbsy) {
++		return;
++	}
++	isp->isp_rspbsy = 1;
++
++	while (optr != iptr) {
++		ispstatusreq_t local, *sp = &local;
++		isphdr_t *hp;
++		int type;
++		u_int16_t oop;
++		int buddaboom = 0;
++
++		hp = (isphdr_t *) ISP_QUEUE_ENTRY(isp->isp_result, optr);
++		oop = optr;
++		optr = ISP_NXT_QENTRY(optr, RESULT_QUEUE_LEN(isp));
++		nlooked++;
++		/*
++		 * Synchronize our view of this response queue entry.
++		 */
++		MEMORYBARRIER(isp, SYNC_RESULT, oop, QENTRY_LEN);
++
++		type = isp_get_response_type(isp, hp);
++
++		if (type == RQSTYPE_RESPONSE) {
++			isp_get_response(isp, (ispstatusreq_t *) hp, sp);
++		} else if (type == RQSTYPE_RIO2) {
++			isp_rio2_t rio;
++			isp_get_rio2(isp, (isp_rio2_t *) hp, &rio);
++			for (i = 0; i < rio.req_header.rqs_seqno; i++) {
++				isp_fastpost_complete(isp, rio.req_handles[i]);
++			}
++			if (isp->isp_fpcchiwater < rio.req_header.rqs_seqno)
++				isp->isp_fpcchiwater = rio.req_header.rqs_seqno;
++			MEMZERO(hp, QENTRY_LEN);	/* PERF */
++			continue;
++		} else {
++			/*
++			 * Somebody reachable via isp_handle_other_response
++			 * may have updated the response queue pointers for
++			 * us, so we reload our goal index.
++			 */
++			if (isp_handle_other_response(isp, type, hp, &optr)) {
++				iptr = isp->isp_resodx;
++				MEMZERO(hp, QENTRY_LEN);	/* PERF */
++				continue;
++			}
++
++			/*
++			 * After this point, we'll just look at the header as
++			 * we don't know how to deal with the rest of the
++			 * response.
++			 */
++			isp_get_response(isp, (ispstatusreq_t *) hp, sp);
++
++			/*
++			 * It really has to be a bounced request just copied
++			 * from the request queue to the response queue. If
++			 * not, something bad has happened.
++			 */
++			if (sp->req_header.rqs_entry_type != RQSTYPE_REQUEST) {
++				isp_prt(isp, ISP_LOGERR, notresp,
++				    sp->req_header.rqs_entry_type, oop, optr,
++				    nlooked);
++				if (isp->isp_dblev & ISP_LOGDEBUG0) {
++					isp_print_bytes(isp, "Queue Entry",
++					    QENTRY_LEN, sp);
++				}
++				MEMZERO(hp, QENTRY_LEN);	/* PERF */
++				continue;
++			}
++			buddaboom = 1;
++		}
++
++		if (sp->req_header.rqs_flags & 0xf) {
++#define	_RQS_OFLAGS	\
++	~(RQSFLAG_CONTINUATION|RQSFLAG_FULL|RQSFLAG_BADHEADER|RQSFLAG_BADPACKET)
++			if (sp->req_header.rqs_flags & RQSFLAG_CONTINUATION) {
++				isp_prt(isp, ISP_LOGWARN,
++				    "continuation segment");
++				WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr);
++				continue;
++			}
++			if (sp->req_header.rqs_flags & RQSFLAG_FULL) {
++				isp_prt(isp, ISP_LOGDEBUG1,
++				    "internal queues full");
++				/*
++				 * We'll synthesize a QUEUE FULL message below.
++				 */
++			}
++			if (sp->req_header.rqs_flags & RQSFLAG_BADHEADER) {
++				isp_prt(isp, ISP_LOGERR,  "bad header flag");
++				buddaboom++;
++			}
++			if (sp->req_header.rqs_flags & RQSFLAG_BADPACKET) {
++				isp_prt(isp, ISP_LOGERR, "bad request packet");
++				buddaboom++;
++			}
++			if (sp->req_header.rqs_flags & _RQS_OFLAGS) {
++				isp_prt(isp, ISP_LOGERR,
++				    "unknown flags (0x%x) in response",
++				    sp->req_header.rqs_flags);
++				buddaboom++;
++			}
++#undef	_RQS_OFLAGS
++		}
++		if (sp->req_handle > isp->isp_maxcmds || sp->req_handle < 1) {
++			MEMZERO(hp, QENTRY_LEN);	/* PERF */
++			isp_prt(isp, ISP_LOGERR,
++			    "bad request handle %d (type 0x%x, flags 0x%x)",
++			    sp->req_handle, sp->req_header.rqs_entry_type,
++			    sp->req_header.rqs_flags);
++			WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr);
++			continue;
++		}
++		xs = isp_find_xs(isp, sp->req_handle);
++		if (xs == NULL) {
++			u_int8_t ts = sp->req_completion_status & 0xff;
++			MEMZERO(hp, QENTRY_LEN);	/* PERF */
++			/*
++			 * Only whine if this isn't the expected fallout of
++			 * aborting the command.
++			 */
++			if (sp->req_header.rqs_entry_type != RQSTYPE_RESPONSE) {
++				isp_prt(isp, ISP_LOGERR,
++				    "cannot find handle 0x%x (type 0x%x)",
++				    sp->req_handle,
++				    sp->req_header.rqs_entry_type);
++			} else if (ts != RQCS_ABORTED) {
++				isp_prt(isp, ISP_LOGERR,
++				    "cannot find handle 0x%x (status 0x%x)",
++				    sp->req_handle, ts);
++			}
++			WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr);
++			continue;
++		}
++		isp_destroy_handle(isp, sp->req_handle);
++		if (sp->req_status_flags & RQSTF_BUS_RESET) {
++			XS_SETERR(xs, HBA_BUSRESET);
++			isp->isp_sendmarker |= (1 << XS_CHANNEL(xs));
++		}
++		if (buddaboom) {
++			XS_SETERR(xs, HBA_BOTCH);
++		}
++
++		if (IS_FC(isp) && (sp->req_scsi_status & RQCS_SV)) {
++			/*
++			 * Fibre Channel F/W doesn't say we got status
++			 * if there's Sense Data instead. I guess they
++			 * think it goes w/o saying.
++			 */
++			sp->req_state_flags |= RQSF_GOT_STATUS;
++		}
++		if (sp->req_state_flags & RQSF_GOT_STATUS) {
++			*XS_STSP(xs) = sp->req_scsi_status & 0xff;
++		}
++
++		switch (sp->req_header.rqs_entry_type) {
++		case RQSTYPE_RESPONSE:
++			XS_SET_STATE_STAT(isp, xs, sp);
++			isp_parse_status(isp, sp, xs);
++			if ((XS_NOERR(xs) || XS_ERR(xs) == HBA_NOERROR) &&
++			    (*XS_STSP(xs) == SCSI_BUSY)) {
++				XS_SETERR(xs, HBA_TGTBSY);
++			}
++			if (IS_SCSI(isp)) {
++				XS_RESID(xs) = sp->req_resid;
++				if ((sp->req_state_flags & RQSF_GOT_STATUS) &&
++				    (*XS_STSP(xs) == SCSI_CHECK) &&
++				    (sp->req_state_flags & RQSF_GOT_SENSE)) {
++					XS_SAVE_SENSE(xs, sp);
++				}
++				/*
++				 * A new synchronous rate was negotiated for
++				 * this target. Mark state such that we'll go
++				 * look up that which has changed later.
++				 */
++				if (sp->req_status_flags & RQSTF_NEGOTIATION) {
++					int t = XS_TGT(xs);
++					sdparam *sdp = isp->isp_param;
++					sdp += XS_CHANNEL(xs);
++					sdp->isp_devparam[t].dev_refresh = 1;
++					isp->isp_update |=
++					    (1 << XS_CHANNEL(xs));
++				}
++			} else {
++				if (sp->req_status_flags & RQSF_XFER_COMPLETE) {
++					XS_RESID(xs) = 0;
++				} else if (sp->req_scsi_status & RQCS_RESID) {
++					XS_RESID(xs) = sp->req_resid;
++				} else {
++					XS_RESID(xs) = 0;
++				}
++				if ((sp->req_state_flags & RQSF_GOT_STATUS) &&
++				    (*XS_STSP(xs) == SCSI_CHECK) &&
++				    (sp->req_scsi_status & RQCS_SV)) {
++					XS_SAVE_SENSE(xs, sp);
++					/* solely for the benefit of debug */
++					sp->req_state_flags |= RQSF_GOT_SENSE;
++				}
++			}
++			isp_prt(isp, ISP_LOGDEBUG2,
++			   "asked for %ld got resid %ld", (long) XS_XFRLEN(xs),
++			   (long) sp->req_resid);
++			break;
++		case RQSTYPE_REQUEST:
++			if (sp->req_header.rqs_flags & RQSFLAG_FULL) {
++				/*
++				 * Force Queue Full status.
++				 */
++				*XS_STSP(xs) = SCSI_QFULL;
++				XS_SETERR(xs, HBA_NOERROR);
++			} else if (XS_NOERR(xs)) {
++				/*
++				 * ????
++				 */
++				isp_prt(isp, ISP_LOGDEBUG0,
++				    "Request Queue Entry bounced back");
++				XS_SETERR(xs, HBA_BOTCH);
++			}
++			XS_RESID(xs) = XS_XFRLEN(xs);
++			break;
++		default:
++			isp_prt(isp, ISP_LOGWARN,
++			    "unhandled response queue type 0x%x",
++			    sp->req_header.rqs_entry_type);
++			if (XS_NOERR(xs)) {
++				XS_SETERR(xs, HBA_BOTCH);
++			}
++			break;
++		}
++
++		/*
++		 * Free any dma resources. As a side effect, this may
++		 * also do any cache flushing necessary for data coherence.			 */
++		if (XS_XFRLEN(xs)) {
++			ISP_DMAFREE(isp, xs, sp->req_handle);
++		}
++
++		if (((isp->isp_dblev & (ISP_LOGDEBUG2|ISP_LOGDEBUG3))) ||
++		    ((isp->isp_dblev & ISP_LOGDEBUG1) && ((!XS_NOERR(xs)) ||
++		    (*XS_STSP(xs) != SCSI_GOOD)))) {
++			char skey;
++			if (sp->req_state_flags & RQSF_GOT_SENSE) {
++				skey = XS_SNSKEY(xs) & 0xf;
++				if (skey < 10)
++					skey += '0';
++				else
++					skey += 'a' - 10;
++			} else if (*XS_STSP(xs) == SCSI_CHECK) {
++				skey = '?';
++			} else {
++				skey = '.';
++			}
++			isp_prt(isp, ISP_LOGALL, finmsg, XS_CHANNEL(xs),
++			    XS_TGT(xs), XS_LUN(xs), XS_XFRLEN(xs), XS_RESID(xs),
++			    *XS_STSP(xs), skey, XS_ERR(xs));
++		}
++
++		if (isp->isp_nactive > 0)
++		    isp->isp_nactive--;
++		complist[ndone++] = xs;	/* defer completion call until later */
++		MEMZERO(hp, QENTRY_LEN);	/* PERF */
++		if (ndone == MAX_REQUESTQ_COMPLETIONS) {
++			break;
++		}
++	}
++
++	/*
++	 * If we looked at any commands, then it's valid to find out
++	 * what the outpointer is. It also is a trigger to update the
++	 * ISP's notion of what we've seen so far.
++	 */
++	if (nlooked) {
++		WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr);
++		/*
++		 * While we're at it, read the requst queue out pointer.
++		 */
++		isp->isp_reqodx = READ_REQUEST_QUEUE_OUT_POINTER(isp);
++		if (isp->isp_rscchiwater < ndone)
++			isp->isp_rscchiwater = ndone;
++	}
++
++	isp->isp_residx = optr;
++	isp->isp_rspbsy = 0;
++	for (i = 0; i < ndone; i++) {
++		xs = complist[i];
++		if (xs) {
++			isp->isp_rsltccmplt++;
++			isp_done(xs);
++		}
++	}
++}
++
++/*
++ * Support routines.
++ */
++
++static int
++isp_parse_async(struct ispsoftc *isp, u_int16_t mbox)
++{
++	int rval = 0;
++	int bus;
++
++	if (IS_DUALBUS(isp)) {
++		bus = ISP_READ(isp, OUTMAILBOX6);
++	} else {
++		bus = 0;
++	}
++	isp_prt(isp, ISP_LOGDEBUG2, "Async Mbox 0x%x", mbox);
++
++	switch (mbox) {
++	case ASYNC_BUS_RESET:
++		isp->isp_sendmarker |= (1 << bus);
++#ifdef	ISP_TARGET_MODE
++		if (isp_target_async(isp, bus, mbox))
++			rval = -1;
++#endif
++		isp_async(isp, ISPASYNC_BUS_RESET, &bus);
++		break;
++	case ASYNC_SYSTEM_ERROR:
++#ifdef	ISP_FW_CRASH_DUMP
++		/*
++		 * If we have crash dumps enabled, it's up to the handler
++		 * for isp_async to reinit stuff and restart the firmware
++		 * after performing the crash dump. The reason we do things
++		 * this way is that we may need to activate a kernel thread
++		 * to do all the crash dump goop.
++		 */
++		isp_async(isp, ISPASYNC_FW_CRASH, NULL);
++#else
++		isp_async(isp, ISPASYNC_FW_CRASH, NULL);
++		isp_reinit(isp);
++		isp_async(isp, ISPASYNC_FW_RESTARTED, NULL);
++#endif
++		rval = -1;
++		break;
++
++	case ASYNC_RQS_XFER_ERR:
++		isp_prt(isp, ISP_LOGERR, "Request Queue Transfer Error");
++		break;
++
++	case ASYNC_RSP_XFER_ERR:
++		isp_prt(isp, ISP_LOGERR, "Response Queue Transfer Error");
++		break;
++
++	case ASYNC_QWAKEUP:
++		/*
++		 * We've just been notified that the Queue has woken up.
++		 * We don't need to be chatty about this- just unlatch things
++		 * and move on.
++		 */
++		mbox = READ_REQUEST_QUEUE_OUT_POINTER(isp);
++		break;
++
++	case ASYNC_TIMEOUT_RESET:
++		isp_prt(isp, ISP_LOGWARN,
++		    "timeout initiated SCSI bus reset of bus %d", bus);
++		isp->isp_sendmarker |= (1 << bus);
++#ifdef	ISP_TARGET_MODE
++		if (isp_target_async(isp, bus, mbox))
++			rval = -1;
++#endif
++		break;
++
++	case ASYNC_DEVICE_RESET:
++		isp_prt(isp, ISP_LOGINFO, "device reset on bus %d", bus);
++		isp->isp_sendmarker |= (1 << bus);
++#ifdef	ISP_TARGET_MODE
++		if (isp_target_async(isp, bus, mbox))
++			rval = -1;
++#endif
++		break;
++
++	case ASYNC_EXTMSG_UNDERRUN:
++		isp_prt(isp, ISP_LOGWARN, "extended message underrun");
++		break;
++
++	case ASYNC_SCAM_INT:
++		isp_prt(isp, ISP_LOGINFO, "SCAM interrupt");
++		break;
++
++	case ASYNC_HUNG_SCSI:
++		isp_prt(isp, ISP_LOGERR,
++		    "stalled SCSI Bus after DATA Overrun");
++		/* XXX: Need to issue SCSI reset at this point */
++		break;
++
++	case ASYNC_KILLED_BUS:
++		isp_prt(isp, ISP_LOGERR, "SCSI Bus reset after DATA Overrun");
++		break;
++
++	case ASYNC_BUS_TRANSIT:
++		mbox = ISP_READ(isp, OUTMAILBOX2);
++		switch (mbox & 0x1c00) {
++		case SXP_PINS_LVD_MODE:
++			isp_prt(isp, ISP_LOGINFO, "Transition to LVD mode");
++			SDPARAM(isp)->isp_diffmode = 0;
++			SDPARAM(isp)->isp_ultramode = 0;
++			SDPARAM(isp)->isp_lvdmode = 1;
++			break;
++		case SXP_PINS_HVD_MODE:
++			isp_prt(isp, ISP_LOGINFO,
++			    "Transition to Differential mode");
++			SDPARAM(isp)->isp_diffmode = 1;
++			SDPARAM(isp)->isp_ultramode = 0;
++			SDPARAM(isp)->isp_lvdmode = 0;
++			break;
++		case SXP_PINS_SE_MODE:
++			isp_prt(isp, ISP_LOGINFO,
++			    "Transition to Single Ended mode");
++			SDPARAM(isp)->isp_diffmode = 0;
++			SDPARAM(isp)->isp_ultramode = 1;
++			SDPARAM(isp)->isp_lvdmode = 0;
++			break;
++		default:
++			isp_prt(isp, ISP_LOGWARN,
++			    "Transition to Unknown Mode 0x%x", mbox);
++			break;
++		}
++		/*
++		 * XXX: Set up to renegotiate again!
++		 */
++		/* Can only be for a 1080... */
++		isp->isp_sendmarker |= (1 << bus);
++		break;
++
++	/*
++	 * We can use bus, which will always be zero for FC cards,
++	 * as a mailbox pattern accumulator to be checked below.
++	 */
++	case ASYNC_RIO5:
++		bus = 0x1ce;	/* outgoing mailbox regs 1-3, 6-7 */
++		break;
++
++	case ASYNC_RIO4:
++		bus = 0x14e;	/* outgoing mailbox regs 1-3, 6 */
++		break;
++
++	case ASYNC_RIO3:
++		bus = 0x10e;	/* outgoing mailbox regs 1-3 */
++		break;
++
++	case ASYNC_RIO2:
++		bus = 0x106;	/* outgoing mailbox regs 1-2 */
++		break;
++
++	case ASYNC_RIO1:
++	case ASYNC_CMD_CMPLT:
++		bus = 0x102;	/* outgoing mailbox regs 1 */
++		break;
++
++	case ASYNC_RIO_RESP:
++		return (rval);
++
++	case ASYNC_CTIO_DONE:
++	{
++#ifdef	ISP_TARGET_MODE
++		int handle =
++		    (ISP_READ(isp, OUTMAILBOX2) << 16) | 
++		    (ISP_READ(isp, OUTMAILBOX1));
++		if (isp_target_async(isp, handle, mbox))
++			rval = -1;
++#else
++		isp_prt(isp, ISP_LOGINFO, "Fast Posting CTIO done");
++#endif
++		isp->isp_fphccmplt++;	/* count it as a fast posting intr */
++		break;
++	}
++	case ASYNC_LIP_F8:
++	case ASYNC_LIP_OCCURRED:
++		FCPARAM(isp)->isp_lipseq =
++		    ISP_READ(isp, OUTMAILBOX1);
++		FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
++		FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD;
++		isp->isp_sendmarker = 1;
++		isp_mark_getpdb_all(isp);
++		isp_async(isp, ISPASYNC_LIP, NULL);
++#ifdef	ISP_TARGET_MODE
++		if (isp_target_async(isp, bus, mbox))
++			rval = -1;
++#endif
++		/*
++		 * We've had problems with data corruption occuring on
++		 * commands that complete (with no apparent error) after
++		 * we receive a LIP. This has been observed mostly on
++		 * Local Loop topologies. To be safe, let's just mark
++		 * all active commands as dead.
++		 */
++		if (FCPARAM(isp)->isp_topo == TOPO_NL_PORT ||
++		    FCPARAM(isp)->isp_topo == TOPO_FL_PORT) {
++			int i, j;
++			for (i = j = 0; i < isp->isp_maxcmds; i++) {
++				XS_T *xs;
++				xs = isp->isp_xflist[i];
++				if (xs != NULL) {
++					j++;
++					XS_SETERR(xs, HBA_BUSRESET);
++				}
++			}
++			if (j) {
++				isp_prt(isp, ISP_LOGERR,
++				    "LIP destroyed %d active commands", j);
++			}
++		}
++		break;
++
++	case ASYNC_LOOP_UP:
++		isp->isp_sendmarker = 1;
++		FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
++		FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD;
++		isp_mark_getpdb_all(isp);
++		isp_async(isp, ISPASYNC_LOOP_UP, NULL);
++#ifdef	ISP_TARGET_MODE
++		if (isp_target_async(isp, bus, mbox))
++			rval = -1;
++#endif
++		break;
++
++	case ASYNC_LOOP_DOWN:
++		isp->isp_sendmarker = 1;
++		FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
++		FCPARAM(isp)->isp_loopstate = LOOP_NIL;
++		isp_mark_getpdb_all(isp);
++		isp_async(isp, ISPASYNC_LOOP_DOWN, NULL);
++#ifdef	ISP_TARGET_MODE
++		if (isp_target_async(isp, bus, mbox))
++			rval = -1;
++#endif
++		break;
++
++	case ASYNC_LOOP_RESET:
++		isp->isp_sendmarker = 1;
++		FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
++		FCPARAM(isp)->isp_loopstate = LOOP_NIL;
++		isp_mark_getpdb_all(isp);
++		isp_async(isp, ISPASYNC_LOOP_RESET, NULL);
++#ifdef	ISP_TARGET_MODE
++		if (isp_target_async(isp, bus, mbox))
++			rval = -1;
++#endif
++		break;
++
++	case ASYNC_PDB_CHANGED:
++		isp->isp_sendmarker = 1;
++		FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD;
++		isp_mark_getpdb_all(isp);
++		isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_PDB);
++		break;
++
++	case ASYNC_CHANGE_NOTIFY:
++		/*
++		 * Not correct, but it will force us to rescan the loop.
++		 */
++		FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD;
++		isp_mark_getpdb_all(isp);
++		isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_SNS);
++		break;
++
++	case ASYNC_PTPMODE:
++		if (FCPARAM(isp)->isp_onfabric)
++			FCPARAM(isp)->isp_topo = TOPO_F_PORT;
++		else
++			FCPARAM(isp)->isp_topo = TOPO_N_PORT;
++		isp_mark_getpdb_all(isp);
++		isp->isp_sendmarker = 1;
++		FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
++		FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD;
++		isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_OTHER);
++#ifdef	ISP_TARGET_MODE
++		if (isp_target_async(isp, bus, mbox))
++			rval = -1;
++#endif
++		isp_prt(isp, ISP_LOGINFO, "Point-to-Point mode");
++		break;
++
++	case ASYNC_CONNMODE:
++		mbox = ISP_READ(isp, OUTMAILBOX1);
++		isp_mark_getpdb_all(isp);
++		switch (mbox) {
++		case ISP_CONN_LOOP:
++			isp_prt(isp, ISP_LOGINFO,
++			    "Point-to-Point -> Loop mode");
++			break;
++		case ISP_CONN_PTP:
++			isp_prt(isp, ISP_LOGINFO,
++			    "Loop -> Point-to-Point mode");
++			break;
++		case ISP_CONN_BADLIP:
++			isp_prt(isp, ISP_LOGWARN,
++			    "Point-to-Point -> Loop mode (BAD LIP)");
++			break;
++		case ISP_CONN_FATAL:
++			isp_prt(isp, ISP_LOGERR, "FATAL CONNECTION ERROR");
++#ifdef	ISP_FW_CRASH_DUMP
++			isp_async(isp, ISPASYNC_FW_CRASH, NULL);
++#else
++			isp_async(isp, ISPASYNC_FW_CRASH, NULL);
++			isp_reinit(isp);
++			isp_async(isp, ISPASYNC_FW_RESTARTED, NULL);
++#endif
++			return (-1);
++		case ISP_CONN_LOOPBACK:
++			isp_prt(isp, ISP_LOGWARN,
++			    "Looped Back in Point-to-Point mode");
++			break;
++		default:
++			isp_prt(isp, ISP_LOGWARN,
++			    "Unknown connection mode (0x%x)", mbox);
++			break;
++		}
++		isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_OTHER);
++		isp->isp_sendmarker = 1;
++		FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
++		FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD;
++		break;
++
++	default:
++		isp_prt(isp, ISP_LOGWARN, "Unknown Async Code 0x%x", mbox);
++		break;
++	}
++
++	if (bus & 0x100) {
++		int i, nh;
++		u_int16_t handles[5];
++
++		for (nh = 0, i = 1; i < MAX_MAILBOX; i++) {
++			if ((bus & (1 << i)) == 0) {
++				continue;
++			}
++			handles[nh++] = ISP_READ(isp, MBOX_OFF(i));
++		}
++		for (i = 0; i < nh; i++) {
++			isp_fastpost_complete(isp, handles[i]);
++			isp_prt(isp,  ISP_LOGDEBUG3,
++			    "fast post completion of %u", handles[i]);
++		}
++		if (isp->isp_fpcchiwater < nh)
++			isp->isp_fpcchiwater = nh;
++	} else {
++		isp->isp_intoasync++;
++	}
++	return (rval);
++}
++
++/*
++ * Handle other response entries. A pointer to the request queue output
++ * index is here in case we want to eat several entries at once, although
++ * this is not used currently.
++ */
++
++static int
++isp_handle_other_response(struct ispsoftc *isp, int type,
++    isphdr_t *hp, u_int16_t *optrp)
++{
++	switch (type) {
++	case RQSTYPE_STATUS_CONT:
++		isp_prt(isp, ISP_LOGINFO, "Ignored Continuation Response");
++		return (1);
++	case RQSTYPE_ATIO:
++	case RQSTYPE_CTIO:
++	case RQSTYPE_ENABLE_LUN:
++	case RQSTYPE_MODIFY_LUN:
++	case RQSTYPE_NOTIFY:
++	case RQSTYPE_NOTIFY_ACK:
++	case RQSTYPE_CTIO1:
++	case RQSTYPE_ATIO2:
++	case RQSTYPE_CTIO2:
++	case RQSTYPE_CTIO3:
++		isp->isp_rsltccmplt++;	/* count as a response completion */
++#ifdef	ISP_TARGET_MODE
++		if (isp_target_notify(isp, (ispstatusreq_t *) hp, optrp)) {
++			return (1);
++		}
++#endif
++		/* FALLTHROUGH */
++	case RQSTYPE_REQUEST:
++	default:
++		if (isp_async(isp, ISPASYNC_UNHANDLED_RESPONSE, hp)) {
++			return (1);
++		}
++		isp_prt(isp, ISP_LOGWARN, "Unhandled Response Type 0x%x",
++		    isp_get_response_type(isp, hp));
++		return (0);
++	}
++}
++
++static void
++isp_parse_status(struct ispsoftc *isp, ispstatusreq_t *sp, XS_T *xs)
++{
++	switch (sp->req_completion_status & 0xff) {
++	case RQCS_COMPLETE:
++		if (XS_NOERR(xs)) {
++			XS_SETERR(xs, HBA_NOERROR);
++		}
++		return;
++
++	case RQCS_INCOMPLETE:
++		if ((sp->req_state_flags & RQSF_GOT_TARGET) == 0) {
++			isp_prt(isp, ISP_LOGDEBUG1,
++			    "Selection Timeout for %d.%d.%d",
++			    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++			if (XS_NOERR(xs)) {
++				XS_SETERR(xs, HBA_SELTIMEOUT);
++			}
++			return;
++		}
++		isp_prt(isp, ISP_LOGERR,
++		    "command incomplete for %d.%d.%d, state 0x%x",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs),
++		    sp->req_state_flags);
++		break;
++
++	case RQCS_DMA_ERROR:
++		isp_prt(isp, ISP_LOGERR, "DMA error for command on %d.%d.%d",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		break;
++
++	case RQCS_TRANSPORT_ERROR:
++	{
++		char buf[172];
++		SNPRINTF(buf, sizeof (buf), "states=>");
++		if (sp->req_state_flags & RQSF_GOT_BUS) {
++			SNPRINTF(buf, sizeof (buf), "%s GOT_BUS", buf);
++		}
++		if (sp->req_state_flags & RQSF_GOT_TARGET) {
++			SNPRINTF(buf, sizeof (buf), "%s GOT_TGT", buf);
++		}
++		if (sp->req_state_flags & RQSF_SENT_CDB) {
++			SNPRINTF(buf, sizeof (buf), "%s SENT_CDB", buf);
++		}
++		if (sp->req_state_flags & RQSF_XFRD_DATA) {
++			SNPRINTF(buf, sizeof (buf), "%s XFRD_DATA", buf);
++		}
++		if (sp->req_state_flags & RQSF_GOT_STATUS) {
++			SNPRINTF(buf, sizeof (buf), "%s GOT_STS", buf);
++		}
++		if (sp->req_state_flags & RQSF_GOT_SENSE) {
++			SNPRINTF(buf, sizeof (buf), "%s GOT_SNS", buf);
++		}
++		if (sp->req_state_flags & RQSF_XFER_COMPLETE) {
++			SNPRINTF(buf, sizeof (buf), "%s XFR_CMPLT", buf);
++		}
++		SNPRINTF(buf, sizeof (buf), "%s\nstatus=>", buf);
++		if (sp->req_status_flags & RQSTF_DISCONNECT) {
++			SNPRINTF(buf, sizeof (buf), "%s Disconnect", buf);
++		}
++		if (sp->req_status_flags & RQSTF_SYNCHRONOUS) {
++			SNPRINTF(buf, sizeof (buf), "%s Sync_xfr", buf);
++		}
++		if (sp->req_status_flags & RQSTF_PARITY_ERROR) {
++			SNPRINTF(buf, sizeof (buf), "%s Parity", buf);
++		}
++		if (sp->req_status_flags & RQSTF_BUS_RESET) {
++			SNPRINTF(buf, sizeof (buf), "%s Bus_Reset", buf);
++		}
++		if (sp->req_status_flags & RQSTF_DEVICE_RESET) {
++			SNPRINTF(buf, sizeof (buf), "%s Device_Reset", buf);
++		}
++		if (sp->req_status_flags & RQSTF_ABORTED) {
++			SNPRINTF(buf, sizeof (buf), "%s Aborted", buf);
++		}
++		if (sp->req_status_flags & RQSTF_TIMEOUT) {
++			SNPRINTF(buf, sizeof (buf), "%s Timeout", buf);
++		}
++		if (sp->req_status_flags & RQSTF_NEGOTIATION) {
++			SNPRINTF(buf, sizeof (buf), "%s Negotiation", buf);
++		}
++		isp_prt(isp, ISP_LOGERR, "%s", buf);
++		isp_prt(isp, ISP_LOGERR, "transport error for %d.%d.%d:\n%s",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), buf);
++		break;
++	}
++	case RQCS_RESET_OCCURRED:
++		isp_prt(isp, ISP_LOGWARN,
++		    "bus reset destroyed command for %d.%d.%d",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		isp->isp_sendmarker |= (1 << XS_CHANNEL(xs));
++		if (XS_NOERR(xs)) {
++			XS_SETERR(xs, HBA_BUSRESET);
++		}
++		return;
++
++	case RQCS_ABORTED:
++		isp_prt(isp, ISP_LOGERR, "command aborted for %d.%d.%d",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		isp->isp_sendmarker |= (1 << XS_CHANNEL(xs));
++		if (XS_NOERR(xs)) {
++			XS_SETERR(xs, HBA_ABORTED);
++		}
++		return;
++
++	case RQCS_TIMEOUT:
++		isp_prt(isp, ISP_LOGWARN, "command timed out for %d.%d.%d",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		/*
++	 	 * Check to see if we logged out the device.
++		 */
++		if (IS_FC(isp)) {
++			if ((sp->req_completion_status & RQSTF_LOGOUT) &&
++			    FCPARAM(isp)->portdb[XS_TGT(xs)].valid &&
++			    FCPARAM(isp)->portdb[XS_TGT(xs)].fabric_dev) {
++				FCPARAM(isp)->portdb[XS_TGT(xs)].relogin = 1;
++			}
++		}
++		if (XS_NOERR(xs)) {
++			XS_SETERR(xs, HBA_CMDTIMEOUT);
++		}
++		return;
++
++	case RQCS_DATA_OVERRUN:
++		XS_RESID(xs) = sp->req_resid;
++		isp_prt(isp, ISP_LOGERR, "data overrun for command on %d.%d.%d",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		if (XS_NOERR(xs)) {
++			XS_SETERR(xs, HBA_DATAOVR);
++		}
++		return;
++
++	case RQCS_COMMAND_OVERRUN:
++		isp_prt(isp, ISP_LOGERR,
++		    "command overrun for command on %d.%d.%d",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		break;
++
++	case RQCS_STATUS_OVERRUN:
++		isp_prt(isp, ISP_LOGERR,
++		    "status overrun for command on %d.%d.%d",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		break;
++
++	case RQCS_BAD_MESSAGE:
++		isp_prt(isp, ISP_LOGERR,
++		    "msg not COMMAND COMPLETE after status %d.%d.%d",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		break;
++
++	case RQCS_NO_MESSAGE_OUT:
++		isp_prt(isp, ISP_LOGERR,
++		    "No MESSAGE OUT phase after selection on %d.%d.%d",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		break;
++
++	case RQCS_EXT_ID_FAILED:
++		isp_prt(isp, ISP_LOGERR, "EXTENDED IDENTIFY failed %d.%d.%d",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		break;
++
++	case RQCS_IDE_MSG_FAILED:
++		isp_prt(isp, ISP_LOGERR,
++		    "INITIATOR DETECTED ERROR rejected by %d.%d.%d",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		break;
++
++	case RQCS_ABORT_MSG_FAILED:
++		isp_prt(isp, ISP_LOGERR, "ABORT OPERATION rejected by %d.%d.%d",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		break;
++
++	case RQCS_REJECT_MSG_FAILED:
++		isp_prt(isp, ISP_LOGERR, "MESSAGE REJECT rejected by %d.%d.%d",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		break;
++
++	case RQCS_NOP_MSG_FAILED:
++		isp_prt(isp, ISP_LOGERR, "NOP rejected by %d.%d.%d",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		break;
++
++	case RQCS_PARITY_ERROR_MSG_FAILED:
++		isp_prt(isp, ISP_LOGERR,
++		    "MESSAGE PARITY ERROR rejected by %d.%d.%d",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		break;
++
++	case RQCS_DEVICE_RESET_MSG_FAILED:
++		isp_prt(isp, ISP_LOGWARN,
++		    "BUS DEVICE RESET rejected by %d.%d.%d",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		break;
++
++	case RQCS_ID_MSG_FAILED:
++		isp_prt(isp, ISP_LOGERR, "IDENTIFY rejected by %d.%d.%d",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		break;
++
++	case RQCS_UNEXP_BUS_FREE:
++		isp_prt(isp, ISP_LOGERR, "%d.%d.%d had an unexpected bus free",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		break;
++
++	case RQCS_DATA_UNDERRUN:
++	{
++		if (IS_FC(isp)) {
++			int ru_marked = (sp->req_scsi_status & RQCS_RU) != 0;
++			if (!ru_marked || sp->req_resid > XS_XFRLEN(xs)) {
++				isp_prt(isp, ISP_LOGWARN, bun, XS_TGT(xs),
++				    XS_LUN(xs), XS_XFRLEN(xs), sp->req_resid,
++				    (ru_marked)? "marked" : "not marked");
++				if (XS_NOERR(xs)) {
++					XS_SETERR(xs, HBA_BOTCH);
++				}
++				return;
++			}
++		}
++		XS_RESID(xs) = sp->req_resid;
++		if (XS_NOERR(xs)) {
++			XS_SETERR(xs, HBA_NOERROR);
++		}
++		return;
++	}
++
++	case RQCS_XACT_ERR1:
++		isp_prt(isp, ISP_LOGERR, xact1, XS_CHANNEL(xs),
++		    XS_TGT(xs), XS_LUN(xs));
++		break;
++
++	case RQCS_XACT_ERR2:
++		isp_prt(isp, ISP_LOGERR, xact2,
++		    XS_LUN(xs), XS_TGT(xs), XS_CHANNEL(xs));
++		break;
++
++	case RQCS_XACT_ERR3:
++		isp_prt(isp, ISP_LOGERR, xact3,
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		break;
++
++	case RQCS_BAD_ENTRY:
++		isp_prt(isp, ISP_LOGERR, "Invalid IOCB entry type detected");
++		break;
++
++	case RQCS_QUEUE_FULL:
++		isp_prt(isp, ISP_LOGDEBUG0,
++		    "internal queues full for %d.%d.%d status 0x%x",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), *XS_STSP(xs));
++
++		/*
++		 * If QFULL or some other status byte is set, then this
++		 * isn't an error, per se.
++		 *
++		 * Unfortunately, some QLogic f/w writers have, in
++		 * some cases, ommitted to *set* status to QFULL.
++		 *
++
++		if (*XS_STSP(xs) != SCSI_GOOD && XS_NOERR(xs)) {
++			XS_SETERR(xs, HBA_NOERROR);
++			return;
++		}
++
++		 *
++		 *
++		 */
++
++		*XS_STSP(xs) = SCSI_QFULL;
++		XS_SETERR(xs, HBA_NOERROR);
++		return;
++
++	case RQCS_PHASE_SKIPPED:
++		isp_prt(isp, ISP_LOGERR, pskip, XS_CHANNEL(xs),
++		    XS_TGT(xs), XS_LUN(xs));
++		break;
++
++	case RQCS_ARQS_FAILED:
++		isp_prt(isp, ISP_LOGERR,
++		    "Auto Request Sense failed for %d.%d.%d",
++		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++		if (XS_NOERR(xs)) {
++			XS_SETERR(xs, HBA_ARQFAIL);
++		}
++		return;
++
++	case RQCS_WIDE_FAILED:
++		isp_prt(isp, ISP_LOGERR,
++		    "Wide Negotiation failed for %d.%d.%d",
++		    XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs));
++		if (IS_SCSI(isp)) {
++			sdparam *sdp = isp->isp_param;
++			sdp += XS_CHANNEL(xs);
++			sdp->isp_devparam[XS_TGT(xs)].goal_flags &= ~DPARM_WIDE;
++			sdp->isp_devparam[XS_TGT(xs)].dev_update = 1;
++			isp->isp_update |= (1 << XS_CHANNEL(xs));
++		}
++		if (XS_NOERR(xs)) {
++			XS_SETERR(xs, HBA_NOERROR);
++		}
++		return;
++
++	case RQCS_SYNCXFER_FAILED:
++		isp_prt(isp, ISP_LOGERR,
++		    "SDTR Message failed for target %d.%d.%d",
++		    XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs));
++		if (IS_SCSI(isp)) {
++			sdparam *sdp = isp->isp_param;
++			sdp += XS_CHANNEL(xs);
++			sdp->isp_devparam[XS_TGT(xs)].goal_flags &= ~DPARM_SYNC;
++			sdp->isp_devparam[XS_TGT(xs)].dev_update = 1;
++			isp->isp_update |= (1 << XS_CHANNEL(xs));
++		}
++		break;
++
++	case RQCS_LVD_BUSERR:
++		isp_prt(isp, ISP_LOGERR,
++		    "Bad LVD condition while talking to %d.%d.%d",
++		    XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs));
++		break;
++
++	case RQCS_PORT_UNAVAILABLE:
++		/*
++		 * No such port on the loop. Moral equivalent of SELTIMEO
++		 */
++	case RQCS_PORT_LOGGED_OUT:
++		/*
++		 * It was there (maybe)- treat as a selection timeout.
++		 */
++		if ((sp->req_completion_status & 0xff) == RQCS_PORT_UNAVAILABLE)
++			isp_prt(isp, ISP_LOGINFO,
++			    "port unavailable for target %d", XS_TGT(xs));
++		else
++			isp_prt(isp, ISP_LOGINFO,
++			    "port logout for target %d", XS_TGT(xs));
++		/*
++		 * If we're on a local loop, force a LIP (which is overkill)
++		 * to force a re-login of this unit. If we're on fabric,
++		 * then we'll have to relogin as a matter of course.
++		 */
++		if (FCPARAM(isp)->isp_topo == TOPO_NL_PORT ||
++		    FCPARAM(isp)->isp_topo == TOPO_FL_PORT) {
++			mbreg_t mbs;
++			mbs.param[0] = MBOX_INIT_LIP;
++			isp_mboxcmd_qnw(isp, &mbs, 1);
++		}
++
++		/*
++		 * Probably overkill.
++		 */
++		isp->isp_sendmarker = 1;
++		FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD;
++		isp_mark_getpdb_all(isp);
++		isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_OTHER);
++		if (XS_NOERR(xs)) {
++			XS_SETERR(xs, HBA_SELTIMEOUT);
++		}
++		return;
++
++	case RQCS_PORT_CHANGED:
++		isp_prt(isp, ISP_LOGWARN,
++		    "port changed for target %d", XS_TGT(xs));
++		if (XS_NOERR(xs)) {
++			XS_SETERR(xs, HBA_SELTIMEOUT);
++		}
++		return;
++
++	case RQCS_PORT_BUSY:
++		isp_prt(isp, ISP_LOGWARN,
++		    "port busy for target %d", XS_TGT(xs));
++		if (XS_NOERR(xs)) {
++			XS_SETERR(xs, HBA_TGTBSY);
++		}
++		return;
++
++	default:
++		isp_prt(isp, ISP_LOGERR, "Unknown Completion Status 0x%x",
++		    sp->req_completion_status);
++		break;
++	}
++	if (XS_NOERR(xs)) {
++		XS_SETERR(xs, HBA_BOTCH);
++	}
++}
++
++static void
++isp_fastpost_complete(struct ispsoftc *isp, u_int16_t fph)
++{
++	XS_T *xs;
++
++	if (fph == 0) {
++		return;
++	}
++	xs = isp_find_xs(isp, fph);
++	if (xs == NULL) {
++		isp_prt(isp, ISP_LOGWARN,
++		    "Command for fast post handle 0x%x not found", fph);
++		return;
++	}
++	isp_destroy_handle(isp, fph);
++
++	/*
++	 * Since we don't have a result queue entry item,
++	 * we must believe that SCSI status is zero and
++	 * that all data transferred.
++	 */
++	XS_SET_STATE_STAT(isp, xs, NULL);
++	XS_RESID(xs) = 0;
++	*XS_STSP(xs) = SCSI_GOOD;
++	if (XS_XFRLEN(xs)) {
++		ISP_DMAFREE(isp, xs, fph);
++	}
++	if (isp->isp_nactive)
++		isp->isp_nactive--;
++	isp->isp_fphccmplt++;
++	isp_done(xs);
++}
++
++static int
++isp_mbox_continue(struct ispsoftc *isp)
++{
++	mbreg_t mbs;
++	u_int16_t *ptr;
++
++	switch (isp->isp_lastmbxcmd) {
++	case MBOX_WRITE_RAM_WORD:
++	case MBOX_READ_RAM_WORD:
++	case MBOX_READ_RAM_WORD_EXTENDED:
++		break;
++	default:
++		return (1);
++	}
++	if (isp->isp_mboxtmp[0] != MBOX_COMMAND_COMPLETE) {
++		isp->isp_mbxwrk0 = 0;
++		return (-1);
++	}
++
++
++	/*
++	 * Clear the previous interrupt.
++	 */
++	ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
++	ISP_WRITE(isp, BIU_SEMA, 0);
++
++	/*
++	 * Continue with next word.
++	 */
++	ptr = isp->isp_mbxworkp;
++	switch (isp->isp_lastmbxcmd) {
++	case MBOX_WRITE_RAM_WORD:
++		mbs.param[2] = *ptr++;
++		mbs.param[1] = isp->isp_mbxwrk1++;
++		break;
++	case MBOX_READ_RAM_WORD:
++	case MBOX_READ_RAM_WORD_EXTENDED:
++		*ptr++ = isp->isp_mboxtmp[2];
++		mbs.param[1] = isp->isp_mbxwrk1++;
++		break;
++	}
++	isp->isp_mbxworkp = ptr;
++	mbs.param[0] = isp->isp_lastmbxcmd;
++	isp->isp_mbxwrk0 -= 1;
++	isp_mboxcmd_qnw(isp, &mbs, 0);
++	return (0);
++}
++
++
++#define	HIBYT(x)			((x) >> 0x8)
++#define	LOBYT(x)			((x)  & 0xff)
++#define	ISPOPMAP(a, b)			(((a) << 8) | (b))
++static const u_int16_t mbpscsi[] = {
++	ISPOPMAP(0x01, 0x01),	/* 0x00: MBOX_NO_OP */
++	ISPOPMAP(0x1f, 0x01),	/* 0x01: MBOX_LOAD_RAM */
++	ISPOPMAP(0x03, 0x01),	/* 0x02: MBOX_EXEC_FIRMWARE */
++	ISPOPMAP(0x1f, 0x01),	/* 0x03: MBOX_DUMP_RAM */
++	ISPOPMAP(0x07, 0x07),	/* 0x04: MBOX_WRITE_RAM_WORD */
++	ISPOPMAP(0x03, 0x07),	/* 0x05: MBOX_READ_RAM_WORD */
++	ISPOPMAP(0x3f, 0x3f),	/* 0x06: MBOX_MAILBOX_REG_TEST */
++	ISPOPMAP(0x03, 0x07),	/* 0x07: MBOX_VERIFY_CHECKSUM	*/
++	ISPOPMAP(0x01, 0x0f),	/* 0x08: MBOX_ABOUT_FIRMWARE */
++	ISPOPMAP(0x00, 0x00),	/* 0x09: */
++	ISPOPMAP(0x00, 0x00),	/* 0x0a: */
++	ISPOPMAP(0x00, 0x00),	/* 0x0b: */
++	ISPOPMAP(0x00, 0x00),	/* 0x0c: */
++	ISPOPMAP(0x00, 0x00),	/* 0x0d: */
++	ISPOPMAP(0x01, 0x05),	/* 0x0e: MBOX_CHECK_FIRMWARE */
++	ISPOPMAP(0x00, 0x00),	/* 0x0f: */
++	ISPOPMAP(0x1f, 0x1f),	/* 0x10: MBOX_INIT_REQ_QUEUE */
++	ISPOPMAP(0x3f, 0x3f),	/* 0x11: MBOX_INIT_RES_QUEUE */
++	ISPOPMAP(0x0f, 0x0f),	/* 0x12: MBOX_EXECUTE_IOCB */
++	ISPOPMAP(0x03, 0x03),	/* 0x13: MBOX_WAKE_UP	*/
++	ISPOPMAP(0x01, 0x3f),	/* 0x14: MBOX_STOP_FIRMWARE */
++	ISPOPMAP(0x0f, 0x0f),	/* 0x15: MBOX_ABORT */
++	ISPOPMAP(0x03, 0x03),	/* 0x16: MBOX_ABORT_DEVICE */
++	ISPOPMAP(0x07, 0x07),	/* 0x17: MBOX_ABORT_TARGET */
++	ISPOPMAP(0x07, 0x07),	/* 0x18: MBOX_BUS_RESET */
++	ISPOPMAP(0x03, 0x07),	/* 0x19: MBOX_STOP_QUEUE */
++	ISPOPMAP(0x03, 0x07),	/* 0x1a: MBOX_START_QUEUE */
++	ISPOPMAP(0x03, 0x07),	/* 0x1b: MBOX_SINGLE_STEP_QUEUE */
++	ISPOPMAP(0x03, 0x07),	/* 0x1c: MBOX_ABORT_QUEUE */
++	ISPOPMAP(0x03, 0x4f),	/* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */
++	ISPOPMAP(0x00, 0x00),	/* 0x1e: */
++	ISPOPMAP(0x01, 0x07),	/* 0x1f: MBOX_GET_FIRMWARE_STATUS */
++	ISPOPMAP(0x01, 0x07),	/* 0x20: MBOX_GET_INIT_SCSI_ID */
++	ISPOPMAP(0x01, 0x07),	/* 0x21: MBOX_GET_SELECT_TIMEOUT */
++	ISPOPMAP(0x01, 0xc7),	/* 0x22: MBOX_GET_RETRY_COUNT	*/
++	ISPOPMAP(0x01, 0x07),	/* 0x23: MBOX_GET_TAG_AGE_LIMIT */
++	ISPOPMAP(0x01, 0x03),	/* 0x24: MBOX_GET_CLOCK_RATE */
++	ISPOPMAP(0x01, 0x07),	/* 0x25: MBOX_GET_ACT_NEG_STATE */
++	ISPOPMAP(0x01, 0x07),	/* 0x26: MBOX_GET_ASYNC_DATA_SETUP_TIME */
++	ISPOPMAP(0x01, 0x07),	/* 0x27: MBOX_GET_PCI_PARAMS */
++	ISPOPMAP(0x03, 0x4f),	/* 0x28: MBOX_GET_TARGET_PARAMS */
++	ISPOPMAP(0x03, 0x0f),	/* 0x29: MBOX_GET_DEV_QUEUE_PARAMS */
++	ISPOPMAP(0x01, 0x07),	/* 0x2a: MBOX_GET_RESET_DELAY_PARAMS */
++	ISPOPMAP(0x00, 0x00),	/* 0x2b: */
++	ISPOPMAP(0x00, 0x00),	/* 0x2c: */
++	ISPOPMAP(0x00, 0x00),	/* 0x2d: */
++	ISPOPMAP(0x00, 0x00),	/* 0x2e: */
++	ISPOPMAP(0x00, 0x00),	/* 0x2f: */
++	ISPOPMAP(0x03, 0x03),	/* 0x30: MBOX_SET_INIT_SCSI_ID */
++	ISPOPMAP(0x07, 0x07),	/* 0x31: MBOX_SET_SELECT_TIMEOUT */
++	ISPOPMAP(0xc7, 0xc7),	/* 0x32: MBOX_SET_RETRY_COUNT	*/
++	ISPOPMAP(0x07, 0x07),	/* 0x33: MBOX_SET_TAG_AGE_LIMIT */
++	ISPOPMAP(0x03, 0x03),	/* 0x34: MBOX_SET_CLOCK_RATE */
++	ISPOPMAP(0x07, 0x07),	/* 0x35: MBOX_SET_ACT_NEG_STATE */
++	ISPOPMAP(0x07, 0x07),	/* 0x36: MBOX_SET_ASYNC_DATA_SETUP_TIME */
++	ISPOPMAP(0x07, 0x07),	/* 0x37: MBOX_SET_PCI_CONTROL_PARAMS */
++	ISPOPMAP(0x4f, 0x4f),	/* 0x38: MBOX_SET_TARGET_PARAMS */
++	ISPOPMAP(0x0f, 0x0f),	/* 0x39: MBOX_SET_DEV_QUEUE_PARAMS */
++	ISPOPMAP(0x07, 0x07),	/* 0x3a: MBOX_SET_RESET_DELAY_PARAMS */
++	ISPOPMAP(0x00, 0x00),	/* 0x3b: */
++	ISPOPMAP(0x00, 0x00),	/* 0x3c: */
++	ISPOPMAP(0x00, 0x00),	/* 0x3d: */
++	ISPOPMAP(0x00, 0x00),	/* 0x3e: */
++	ISPOPMAP(0x00, 0x00),	/* 0x3f: */
++	ISPOPMAP(0x01, 0x03),	/* 0x40: MBOX_RETURN_BIOS_BLOCK_ADDR */
++	ISPOPMAP(0x3f, 0x01),	/* 0x41: MBOX_WRITE_FOUR_RAM_WORDS */
++	ISPOPMAP(0x03, 0x07),	/* 0x42: MBOX_EXEC_BIOS_IOCB */
++	ISPOPMAP(0x00, 0x00),	/* 0x43: */
++	ISPOPMAP(0x00, 0x00),	/* 0x44: */
++	ISPOPMAP(0x03, 0x03),	/* 0x45: SET SYSTEM PARAMETER */
++	ISPOPMAP(0x01, 0x03),	/* 0x46: GET SYSTEM PARAMETER */
++	ISPOPMAP(0x00, 0x00),	/* 0x47: */
++	ISPOPMAP(0x01, 0xcf),	/* 0x48: GET SCAM CONFIGURATION */
++	ISPOPMAP(0xcf, 0xcf),	/* 0x49: SET SCAM CONFIGURATION */
++	ISPOPMAP(0x03, 0x03),	/* 0x4a: MBOX_SET_FIRMWARE_FEATURES */
++	ISPOPMAP(0x01, 0x03),	/* 0x4b: MBOX_GET_FIRMWARE_FEATURES */
++	ISPOPMAP(0x00, 0x00),	/* 0x4c: */
++	ISPOPMAP(0x00, 0x00),	/* 0x4d: */
++	ISPOPMAP(0x00, 0x00),	/* 0x4e: */
++	ISPOPMAP(0x00, 0x00),	/* 0x4f: */
++	ISPOPMAP(0xdf, 0xdf),	/* 0x50: LOAD RAM A64 */
++	ISPOPMAP(0xdf, 0xdf),	/* 0x51: DUMP RAM A64 */
++	ISPOPMAP(0xdf, 0xff),	/* 0x52: INITIALIZE REQUEST QUEUE A64 */
++	ISPOPMAP(0xef, 0xff),	/* 0x53: INITIALIZE RESPONSE QUEUE A64 */
++	ISPOPMAP(0xcf, 0x01),	/* 0x54: EXECUTE IOCB A64 */
++	ISPOPMAP(0x07, 0x01),	/* 0x55: ENABLE TARGET MODE */
++	ISPOPMAP(0x03, 0x0f),	/* 0x56: GET TARGET STATUS */
++	ISPOPMAP(0x00, 0x00),	/* 0x57: */
++	ISPOPMAP(0x00, 0x00),	/* 0x58: */
++	ISPOPMAP(0x00, 0x00),	/* 0x59: */
++	ISPOPMAP(0x03, 0x03),	/* 0x5a: SET DATA OVERRUN RECOVERY MODE */
++	ISPOPMAP(0x01, 0x03),	/* 0x5b: GET DATA OVERRUN RECOVERY MODE */
++	ISPOPMAP(0x0f, 0x0f),	/* 0x5c: SET HOST DATA */
++	ISPOPMAP(0x01, 0x01)	/* 0x5d: GET NOST DATA */
++};
++
++#ifndef	ISP_STRIPPED
++static char *scsi_mbcmd_names[] = {
++	"NO-OP",
++	"LOAD RAM",
++	"EXEC FIRMWARE",
++	"DUMP RAM",
++	"WRITE RAM WORD",
++	"READ RAM WORD",
++	"MAILBOX REG TEST",
++	"VERIFY CHECKSUM",
++	"ABOUT FIRMWARE",
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	"CHECK FIRMWARE",
++	NULL,
++	"INIT REQUEST QUEUE",
++	"INIT RESULT QUEUE",
++	"EXECUTE IOCB",
++	"WAKE UP",
++	"STOP FIRMWARE",
++	"ABORT",
++	"ABORT DEVICE",
++	"ABORT TARGET",
++	"BUS RESET",
++	"STOP QUEUE",
++	"START QUEUE",
++	"SINGLE STEP QUEUE",
++	"ABORT QUEUE",
++	"GET DEV QUEUE STATUS",
++	NULL,
++	"GET FIRMWARE STATUS",
++	"GET INIT SCSI ID",
++	"GET SELECT TIMEOUT",
++	"GET RETRY COUNT",
++	"GET TAG AGE LIMIT",
++	"GET CLOCK RATE",
++	"GET ACT NEG STATE",
++	"GET ASYNC DATA SETUP TIME",
++	"GET PCI PARAMS",
++	"GET TARGET PARAMS",
++	"GET DEV QUEUE PARAMS",
++	"GET RESET DELAY PARAMS",
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	"SET INIT SCSI ID",
++	"SET SELECT TIMEOUT",
++	"SET RETRY COUNT",
++	"SET TAG AGE LIMIT",
++	"SET CLOCK RATE",
++	"SET ACT NEG STATE",
++	"SET ASYNC DATA SETUP TIME",
++	"SET PCI CONTROL PARAMS",
++	"SET TARGET PARAMS",
++	"SET DEV QUEUE PARAMS",
++	"SET RESET DELAY PARAMS",
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	"RETURN BIOS BLOCK ADDR",
++	"WRITE FOUR RAM WORDS",
++	"EXEC BIOS IOCB",
++	NULL,
++	NULL,
++	"SET SYSTEM PARAMETER",
++	"GET SYSTEM PARAMETER",
++	NULL,
++	"GET SCAM CONFIGURATION",
++	"SET SCAM CONFIGURATION",
++	"SET FIRMWARE FEATURES",
++	"GET FIRMWARE FEATURES",
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	"LOAD RAM A64",
++	"DUMP RAM A64",
++	"INITIALIZE REQUEST QUEUE A64",
++	"INITIALIZE RESPONSE QUEUE A64",
++	"EXECUTE IOCB A64",
++	"ENABLE TARGET MODE",
++	"GET TARGET MODE STATE",
++	NULL,
++	NULL,
++	NULL,
++	"SET DATA OVERRUN RECOVERY MODE",
++	"GET DATA OVERRUN RECOVERY MODE",
++	"SET HOST DATA",
++	"GET NOST DATA",
++};
++#endif
++
++static const u_int16_t mbpfc[] = {
++	ISPOPMAP(0x01, 0x01),	/* 0x00: MBOX_NO_OP */
++	ISPOPMAP(0x1f, 0x01),	/* 0x01: MBOX_LOAD_RAM */
++	ISPOPMAP(0x03, 0x01),	/* 0x02: MBOX_EXEC_FIRMWARE */
++	ISPOPMAP(0xdf, 0x01),	/* 0x03: MBOX_DUMP_RAM */
++	ISPOPMAP(0x07, 0x07),	/* 0x04: MBOX_WRITE_RAM_WORD */
++	ISPOPMAP(0x03, 0x07),	/* 0x05: MBOX_READ_RAM_WORD */
++	ISPOPMAP(0xff, 0xff),	/* 0x06: MBOX_MAILBOX_REG_TEST */
++	ISPOPMAP(0x03, 0x05),	/* 0x07: MBOX_VERIFY_CHECKSUM	*/
++	ISPOPMAP(0x01, 0x4f),	/* 0x08: MBOX_ABOUT_FIRMWARE */
++	ISPOPMAP(0xdf, 0x01),	/* 0x09: LOAD RAM */
++	ISPOPMAP(0xdf, 0x01),	/* 0x0a: DUMP RAM */
++	ISPOPMAP(0x00, 0x00),	/* 0x0b: */
++	ISPOPMAP(0x00, 0x00),	/* 0x0c: */
++	ISPOPMAP(0x00, 0x00),	/* 0x0d: */
++	ISPOPMAP(0x01, 0x05),	/* 0x0e: MBOX_CHECK_FIRMWARE */
++	ISPOPMAP(0x03, 0x07),	/* 0x0f: MBOX_READ_RAM_WORD_EXTENDED(1) */
++	ISPOPMAP(0x1f, 0x11),	/* 0x10: MBOX_INIT_REQ_QUEUE */
++	ISPOPMAP(0x2f, 0x21),	/* 0x11: MBOX_INIT_RES_QUEUE */
++	ISPOPMAP(0x0f, 0x01),	/* 0x12: MBOX_EXECUTE_IOCB */
++	ISPOPMAP(0x03, 0x03),	/* 0x13: MBOX_WAKE_UP	*/
++	ISPOPMAP(0x01, 0xff),	/* 0x14: MBOX_STOP_FIRMWARE */
++	ISPOPMAP(0x4f, 0x01),	/* 0x15: MBOX_ABORT */
++	ISPOPMAP(0x07, 0x01),	/* 0x16: MBOX_ABORT_DEVICE */
++	ISPOPMAP(0x07, 0x01),	/* 0x17: MBOX_ABORT_TARGET */
++	ISPOPMAP(0x03, 0x03),	/* 0x18: MBOX_BUS_RESET */
++	ISPOPMAP(0x07, 0x05),	/* 0x19: MBOX_STOP_QUEUE */
++	ISPOPMAP(0x07, 0x05),	/* 0x1a: MBOX_START_QUEUE */
++	ISPOPMAP(0x07, 0x05),	/* 0x1b: MBOX_SINGLE_STEP_QUEUE */
++	ISPOPMAP(0x07, 0x05),	/* 0x1c: MBOX_ABORT_QUEUE */
++	ISPOPMAP(0x07, 0x03),	/* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */
++	ISPOPMAP(0x00, 0x00),	/* 0x1e: */
++	ISPOPMAP(0x01, 0x07),	/* 0x1f: MBOX_GET_FIRMWARE_STATUS */
++	ISPOPMAP(0x01, 0x4f),	/* 0x20: MBOX_GET_LOOP_ID */
++	ISPOPMAP(0x00, 0x00),	/* 0x21: */
++	ISPOPMAP(0x01, 0x07),	/* 0x22: MBOX_GET_RETRY_COUNT	*/
++	ISPOPMAP(0x00, 0x00),	/* 0x23: */
++	ISPOPMAP(0x00, 0x00),	/* 0x24: */
++	ISPOPMAP(0x00, 0x00),	/* 0x25: */
++	ISPOPMAP(0x00, 0x00),	/* 0x26: */
++	ISPOPMAP(0x00, 0x00),	/* 0x27: */
++	ISPOPMAP(0x01, 0x03),	/* 0x28: MBOX_GET_FIRMWARE_OPTIONS */
++	ISPOPMAP(0x03, 0x07),	/* 0x29: MBOX_GET_PORT_QUEUE_PARAMS */
++	ISPOPMAP(0x00, 0x00),	/* 0x2a: */
++	ISPOPMAP(0x00, 0x00),	/* 0x2b: */
++	ISPOPMAP(0x00, 0x00),	/* 0x2c: */
++	ISPOPMAP(0x00, 0x00),	/* 0x2d: */
++	ISPOPMAP(0x00, 0x00),	/* 0x2e: */
++	ISPOPMAP(0x00, 0x00),	/* 0x2f: */
++	ISPOPMAP(0x00, 0x00),	/* 0x30: */
++	ISPOPMAP(0x00, 0x00),	/* 0x31: */
++	ISPOPMAP(0x07, 0x07),	/* 0x32: MBOX_SET_RETRY_COUNT	*/
++	ISPOPMAP(0x00, 0x00),	/* 0x33: */
++	ISPOPMAP(0x00, 0x00),	/* 0x34: */
++	ISPOPMAP(0x00, 0x00),	/* 0x35: */
++	ISPOPMAP(0x00, 0x00),	/* 0x36: */
++	ISPOPMAP(0x00, 0x00),	/* 0x37: */
++	ISPOPMAP(0x0f, 0x01),	/* 0x38: MBOX_SET_FIRMWARE_OPTIONS */
++	ISPOPMAP(0x0f, 0x07),	/* 0x39: MBOX_SET_PORT_QUEUE_PARAMS */
++	ISPOPMAP(0x00, 0x00),	/* 0x3a: */
++	ISPOPMAP(0x00, 0x00),	/* 0x3b: */
++	ISPOPMAP(0x00, 0x00),	/* 0x3c: */
++	ISPOPMAP(0x00, 0x00),	/* 0x3d: */
++	ISPOPMAP(0x00, 0x00),	/* 0x3e: */
++	ISPOPMAP(0x00, 0x00),	/* 0x3f: */
++	ISPOPMAP(0x03, 0x01),	/* 0x40: MBOX_LOOP_PORT_BYPASS */
++	ISPOPMAP(0x03, 0x01),	/* 0x41: MBOX_LOOP_PORT_ENABLE */
++	ISPOPMAP(0x03, 0x07),	/* 0x42: MBOX_GET_RESOURCE_COUNTS */
++	ISPOPMAP(0x01, 0x01),	/* 0x43: MBOX_REQUEST_NON_PARTICIPATING_MODE */
++	ISPOPMAP(0x00, 0x00),	/* 0x44: */
++	ISPOPMAP(0x00, 0x00),	/* 0x45: */
++	ISPOPMAP(0x00, 0x00),	/* 0x46: */
++	ISPOPMAP(0xcf, 0x03),	/* 0x47: GET PORT_DATABASE ENHANCED */
++	ISPOPMAP(0x00, 0x00),	/* 0x48: */
++	ISPOPMAP(0x00, 0x00),	/* 0x49: */
++	ISPOPMAP(0x00, 0x00),	/* 0x4a: */
++	ISPOPMAP(0x00, 0x00),	/* 0x4b: */
++	ISPOPMAP(0x00, 0x00),	/* 0x4c: */
++	ISPOPMAP(0x00, 0x00),	/* 0x4d: */
++	ISPOPMAP(0x00, 0x00),	/* 0x4e: */
++	ISPOPMAP(0x00, 0x00),	/* 0x4f: */
++	ISPOPMAP(0x00, 0x00),	/* 0x50: */
++	ISPOPMAP(0x00, 0x00),	/* 0x51: */
++	ISPOPMAP(0x00, 0x00),	/* 0x52: */
++	ISPOPMAP(0x00, 0x00),	/* 0x53: */
++	ISPOPMAP(0xcf, 0x01),	/* 0x54: EXECUTE IOCB A64 */
++	ISPOPMAP(0x00, 0x00),	/* 0x55: */
++	ISPOPMAP(0x00, 0x00),	/* 0x56: */
++	ISPOPMAP(0x00, 0x00),	/* 0x57: */
++	ISPOPMAP(0x00, 0x00),	/* 0x58: */
++	ISPOPMAP(0x00, 0x00),	/* 0x59: */
++	ISPOPMAP(0x00, 0x00),	/* 0x5a: */
++	ISPOPMAP(0x03, 0x01),	/* 0x5b: MBOX_DRIVER_HEARTBEAT */
++	ISPOPMAP(0xcf, 0x01),	/* 0x5c: MBOX_FW_HEARTBEAT */
++	ISPOPMAP(0x07, 0x03),	/* 0x5d: MBOX_GET_SET_DATA_RATE */
++	ISPOPMAP(0x00, 0x00),	/* 0x5e: */
++	ISPOPMAP(0x00, 0x00),	/* 0x5f: */
++	ISPOPMAP(0xfd, 0x31),	/* 0x60: MBOX_INIT_FIRMWARE */
++	ISPOPMAP(0x00, 0x00),	/* 0x61: */
++	ISPOPMAP(0x01, 0x01),	/* 0x62: MBOX_INIT_LIP */
++	ISPOPMAP(0xcd, 0x03),	/* 0x63: MBOX_GET_FC_AL_POSITION_MAP */
++	ISPOPMAP(0xcf, 0x01),	/* 0x64: MBOX_GET_PORT_DB */
++	ISPOPMAP(0x07, 0x01),	/* 0x65: MBOX_CLEAR_ACA */
++	ISPOPMAP(0x07, 0x01),	/* 0x66: MBOX_TARGET_RESET */
++	ISPOPMAP(0x07, 0x01),	/* 0x67: MBOX_CLEAR_TASK_SET */
++	ISPOPMAP(0x07, 0x01),	/* 0x68: MBOX_ABORT_TASK_SET */
++	ISPOPMAP(0x01, 0x07),	/* 0x69: MBOX_GET_FW_STATE */
++	ISPOPMAP(0x03, 0xcf),	/* 0x6a: MBOX_GET_PORT_NAME */
++	ISPOPMAP(0xcf, 0x01),	/* 0x6b: MBOX_GET_LINK_STATUS */
++	ISPOPMAP(0x0f, 0x01),	/* 0x6c: MBOX_INIT_LIP_RESET */
++	ISPOPMAP(0x00, 0x00),	/* 0x6d: */
++	ISPOPMAP(0xcf, 0x03),	/* 0x6e: MBOX_SEND_SNS */
++	ISPOPMAP(0x0f, 0x07),	/* 0x6f: MBOX_FABRIC_LOGIN */
++	ISPOPMAP(0x03, 0x01),	/* 0x70: MBOX_SEND_CHANGE_REQUEST */
++	ISPOPMAP(0x03, 0x03),	/* 0x71: MBOX_FABRIC_LOGOUT */
++	ISPOPMAP(0x0f, 0x0f),	/* 0x72: MBOX_INIT_LIP_LOGIN */
++	ISPOPMAP(0x00, 0x00),	/* 0x73: */
++	ISPOPMAP(0x07, 0x01),	/* 0x74: LOGIN LOOP PORT */
++	ISPOPMAP(0xcf, 0x03),	/* 0x75: GET PORT/NODE NAME LIST */
++	ISPOPMAP(0x4f, 0x01),	/* 0x76: SET VENDOR ID */
++	ISPOPMAP(0xcd, 0x01),	/* 0x77: INITIALIZE IP MAILBOX */
++	ISPOPMAP(0x00, 0x00),	/* 0x78: */
++	ISPOPMAP(0x00, 0x00),	/* 0x79: */
++	ISPOPMAP(0x00, 0x00),	/* 0x7a: */
++	ISPOPMAP(0x00, 0x00),	/* 0x7b: */
++	ISPOPMAP(0x4f, 0x03),	/* 0x7c: Get ID List */
++	ISPOPMAP(0xcf, 0x01),	/* 0x7d: SEND LFA */
++	ISPOPMAP(0x07, 0x01)	/* 0x7e: Lun RESET */
++};
++/*
++ * Footnotes
++ *
++ * (1): this sets bits 21..16 in mailbox register #8, which we nominally 
++ *	do not access at this time in the core driver. The caller is
++ *	responsible for setting this register first (Gross!).
++ */
++
++#ifndef	ISP_STRIPPED
++static char *fc_mbcmd_names[] = {
++	"NO-OP",
++	"LOAD RAM",
++	"EXEC FIRMWARE",
++	"DUMP RAM",
++	"WRITE RAM WORD",
++	"READ RAM WORD",
++	"MAILBOX REG TEST",
++	"VERIFY CHECKSUM",
++	"ABOUT FIRMWARE",
++	"LOAD RAM",
++	"DUMP RAM",
++	NULL,
++	NULL,
++	"READ RAM WORD EXTENDED",
++	"CHECK FIRMWARE",
++	NULL,
++	"INIT REQUEST QUEUE",
++	"INIT RESULT QUEUE",
++	"EXECUTE IOCB",
++	"WAKE UP",
++	"STOP FIRMWARE",
++	"ABORT",
++	"ABORT DEVICE",
++	"ABORT TARGET",
++	"BUS RESET",
++	"STOP QUEUE",
++	"START QUEUE",
++	"SINGLE STEP QUEUE",
++	"ABORT QUEUE",
++	"GET DEV QUEUE STATUS",
++	NULL,
++	"GET FIRMWARE STATUS",
++	"GET LOOP ID",
++	NULL,
++	"GET RETRY COUNT",
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	"GET FIRMWARE OPTIONS",
++	"GET PORT QUEUE PARAMS",
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	"SET RETRY COUNT",
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	"SET FIRMWARE OPTIONS",
++	"SET PORT QUEUE PARAMS",
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	"LOOP PORT BYPASS",
++	"LOOP PORT ENABLE",
++	"GET RESOURCE COUNTS",
++	"REQUEST NON PARTICIPATING MODE",
++	NULL,
++	NULL,
++	NULL,
++	"GET PORT DATABASE,, ENHANCED",
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	"EXECUTE IOCB A64",
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	"DRIVER HEARTBEAT",
++	NULL,
++	"GET/SET DATA RATE",
++	NULL,
++	NULL,
++	"INIT FIRMWARE",
++	NULL,
++	"INIT LIP",
++	"GET FC-AL POSITION MAP",
++	"GET PORT DATABASE",
++	"CLEAR ACA",
++	"TARGET RESET",
++	"CLEAR TASK SET",
++	"ABORT TASK SET",
++	"GET FW STATE",
++	"GET PORT NAME",
++	"GET LINK STATUS",
++	"INIT LIP RESET",
++	NULL,
++	"SEND SNS",
++	"FABRIC LOGIN",
++	"SEND CHANGE REQUEST",
++	"FABRIC LOGOUT",
++	"INIT LIP LOGIN",
++	NULL,
++	"LOGIN LOOP PORT",
++	"GET PORT/NODE NAME LIST",
++	"SET VENDOR ID",
++	"INITIALIZE IP MAILBOX",
++	NULL,
++	NULL,
++	NULL,
++	NULL,
++	"Get ID List",
++	"SEND LFA",
++	"Lun RESET"
++};
++#endif
++
++static void
++isp_mboxcmd_qnw(struct ispsoftc *isp, mbreg_t *mbp, int nodelay)
++{
++	unsigned int ibits, obits, box, opcode;
++	const u_int16_t *mcp;
++
++	if (IS_FC(isp)) {
++		mcp = mbpfc;
++	} else {
++		mcp = mbpscsi;
++	}
++	opcode = mbp->param[0];
++	ibits = HIBYT(mcp[opcode]) & NMBOX_BMASK(isp);
++	obits = LOBYT(mcp[opcode]) & NMBOX_BMASK(isp);
++	for (box = 0; box < MAX_MAILBOX; box++) {
++		if (ibits & (1 << box)) {
++			ISP_WRITE(isp, MBOX_OFF(box), mbp->param[box]);
++		}
++		if (nodelay == 0) {
++			isp->isp_mboxtmp[box] = mbp->param[box] = 0;
++		}
++	}
++	if (nodelay == 0) {
++		isp->isp_lastmbxcmd = opcode;
++		isp->isp_obits = obits;
++		isp->isp_mboxbsy = 1;
++	}
++	ISP_WRITE(isp, HCCR, HCCR_CMD_SET_HOST_INT);
++	/*
++	 * Oddly enough, if we're not delaying for an answer,
++	 * delay a bit to give the f/w a chance to pick up the
++	 * command.
++	 */
++	if (nodelay) {
++		USEC_DELAY(1000);
++	}
++}
++
++static void
++isp_mboxcmd(struct ispsoftc *isp, mbreg_t *mbp, int logmask)
++{
++	char *cname, *xname, tname[16], mname[16];
++	unsigned int lim, ibits, obits, box, opcode;
++	const u_int16_t *mcp;
++
++	if (IS_FC(isp)) {
++		mcp = mbpfc;
++		lim = (sizeof (mbpfc) / sizeof (mbpfc[0]));
++	} else {
++		mcp = mbpscsi;
++		lim = (sizeof (mbpscsi) / sizeof (mbpscsi[0]));
++	}
++
++	if ((opcode = mbp->param[0]) >= lim) {
++		mbp->param[0] = MBOX_INVALID_COMMAND;
++		isp_prt(isp, ISP_LOGERR, "Unknown Command 0x%x", opcode);
++		return;
++	}
++
++	ibits = HIBYT(mcp[opcode]) & NMBOX_BMASK(isp);
++	obits = LOBYT(mcp[opcode]) & NMBOX_BMASK(isp);
++
++	if (ibits == 0 && obits == 0) {
++		mbp->param[0] = MBOX_COMMAND_PARAM_ERROR;
++		isp_prt(isp, ISP_LOGERR, "no parameters for 0x%x", opcode);
++		return;
++	}
++
++	/*
++	 * Get exclusive usage of mailbox registers.
++	 */
++	MBOX_ACQUIRE(isp);
++
++	for (box = 0; box < MAX_MAILBOX; box++) {
++		if (ibits & (1 << box)) {
++			ISP_WRITE(isp, MBOX_OFF(box), mbp->param[box]);
++		}
++		isp->isp_mboxtmp[box] = mbp->param[box] = 0;
++	}
++
++	isp->isp_lastmbxcmd = opcode;
++
++	/*
++	 * We assume that we can't overwrite a previous command.
++	 */
++	isp->isp_obits = obits;
++	isp->isp_mboxbsy = 1;
++
++	/*
++	 * Set Host Interrupt condition so that RISC will pick up mailbox regs.
++	 */
++	ISP_WRITE(isp, HCCR, HCCR_CMD_SET_HOST_INT);
++
++	/*
++	 * While we haven't finished the command, spin our wheels here.
++	 */
++	MBOX_WAIT_COMPLETE(isp);
++
++	if (isp->isp_mboxbsy) {
++		/*
++		 * Command timed out.
++		 */
++		isp->isp_mboxbsy = 0;
++		MBOX_RELEASE(isp);
++		return;
++	}
++
++	/*
++	 * Copy back output registers.
++	 */
++	for (box = 0; box < MAX_MAILBOX; box++) {
++		if (obits & (1 << box)) {
++			mbp->param[box] = isp->isp_mboxtmp[box];
++		}
++	}
++
++	MBOX_RELEASE(isp);
++
++	if (logmask == 0 || opcode == MBOX_EXEC_FIRMWARE) {
++		return;
++	}
++#ifdef	ISP_STRIPPED
++	cname = NULL;
++#else
++	cname = (IS_FC(isp))? fc_mbcmd_names[opcode] : scsi_mbcmd_names[opcode];
++#endif
++	if (cname == NULL) {
++		cname = tname;
++		SNPRINTF(tname, sizeof tname, "opcode %x", opcode);
++	}
++
++	/*
++	 * Just to be chatty here...
++	 */
++	xname = NULL;
++	switch (mbp->param[0]) {
++	case MBOX_COMMAND_COMPLETE:
++		break;
++	case MBOX_INVALID_COMMAND:
++		if (logmask & MBLOGMASK(MBOX_COMMAND_COMPLETE))
++			xname = "INVALID COMMAND";
++		break;
++	case MBOX_HOST_INTERFACE_ERROR:
++		if (logmask & MBLOGMASK(MBOX_HOST_INTERFACE_ERROR))
++			xname = "HOST INTERFACE ERROR";
++		break;
++	case MBOX_TEST_FAILED:
++		if (logmask & MBLOGMASK(MBOX_TEST_FAILED))
++			xname = "TEST FAILED";
++		break;
++	case MBOX_COMMAND_ERROR:
++		if (logmask & MBLOGMASK(MBOX_COMMAND_ERROR))
++			xname = "COMMAND ERROR";
++		break;
++	case MBOX_COMMAND_PARAM_ERROR:
++		if (logmask & MBLOGMASK(MBOX_COMMAND_PARAM_ERROR))
++			xname = "COMMAND PARAMETER ERROR";
++		break;
++	case MBOX_LOOP_ID_USED:
++		if (logmask & MBLOGMASK(MBOX_LOOP_ID_USED))
++			xname = "LOOP ID ALREADY IN USE";
++		break;
++	case MBOX_PORT_ID_USED:
++		if (logmask & MBLOGMASK(MBOX_PORT_ID_USED))
++			xname = "PORT ID ALREADY IN USE";
++		break;
++	case MBOX_ALL_IDS_USED:
++		if (logmask & MBLOGMASK(MBOX_ALL_IDS_USED))
++			xname = "ALL LOOP IDS IN USE";
++		break;
++	case 0:		/* special case */
++		xname = "TIMEOUT";
++		break;
++	default:
++		SNPRINTF(mname, sizeof mname, "error 0x%x", mbp->param[0]);
++		xname = mname;
++		break;
++	}
++	if (xname)
++		isp_prt(isp, ISP_LOGALL, "Mailbox Command '%s' failed (%s)",
++		    cname, xname);
++}
++
++static void
++isp_fw_state(struct ispsoftc *isp)
++{
++	if (IS_FC(isp)) {
++		mbreg_t mbs;
++		fcparam *fcp = isp->isp_param;
++
++		mbs.param[0] = MBOX_GET_FW_STATE;
++		isp_mboxcmd(isp, &mbs, MBLOGALL);
++		if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++			fcp->isp_fwstate = mbs.param[1];
++		}
++	}
++}
++
++static void
++isp_update(struct ispsoftc *isp)
++{
++	int bus, upmask;
++
++	for (bus = 0, upmask = isp->isp_update; upmask != 0; bus++) {
++		if (upmask & (1 << bus)) {
++			isp_update_bus(isp, bus);
++		}
++		upmask &= ~(1 << bus);
++	}
++}
++
++static void
++isp_update_bus(struct ispsoftc *isp, int bus)
++{
++	int tgt;
++	mbreg_t mbs;
++	sdparam *sdp;
++
++	isp->isp_update &= ~(1 << bus);
++	if (IS_FC(isp)) {
++		/*
++		 * There are no 'per-bus' settings for Fibre Channel.
++		 */
++		return;
++	}
++	sdp = isp->isp_param;
++	sdp += bus;
++
++	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++		u_int16_t flags, period, offset;
++		int get;
++
++		if (sdp->isp_devparam[tgt].dev_enable == 0) {
++			sdp->isp_devparam[tgt].dev_update = 0;
++			sdp->isp_devparam[tgt].dev_refresh = 0;
++			isp_prt(isp, ISP_LOGDEBUG0,
++	 		    "skipping target %d bus %d update", tgt, bus);
++			continue;
++		}
++		/*
++		 * If the goal is to update the status of the device,
++		 * take what's in goal_flags and try and set the device
++		 * toward that. Otherwise, if we're just refreshing the
++		 * current device state, get the current parameters.
++		 */
++
++		/*
++		 * Refresh overrides set
++		 */
++		if (sdp->isp_devparam[tgt].dev_refresh) {
++			mbs.param[0] = MBOX_GET_TARGET_PARAMS;
++			sdp->isp_devparam[tgt].dev_refresh = 0;
++			get = 1;
++		} else if (sdp->isp_devparam[tgt].dev_update) {
++			mbs.param[0] = MBOX_SET_TARGET_PARAMS;
++			/*
++			 * Make sure goal_flags has "Renegotiate on Error"
++			 * on and "Freeze Queue on Error" off.
++			 */
++			sdp->isp_devparam[tgt].goal_flags |= DPARM_RENEG;
++			sdp->isp_devparam[tgt].goal_flags &= ~DPARM_QFRZ;
++
++			mbs.param[2] = sdp->isp_devparam[tgt].goal_flags;
++
++			/*
++			 * Insist that PARITY must be enabled
++			 * if SYNC or WIDE is enabled.
++			 */
++			if ((mbs.param[2] & (DPARM_SYNC|DPARM_WIDE)) != 0) {
++				mbs.param[2] |= DPARM_PARITY;
++			}
++
++			if ((mbs.param[2] & DPARM_SYNC) == 0) {
++				mbs.param[3] = 0;
++			} else {
++				mbs.param[3] =
++				    (sdp->isp_devparam[tgt].goal_offset << 8) |
++				    (sdp->isp_devparam[tgt].goal_period);
++			}
++			/*
++			 * A command completion later that has
++			 * RQSTF_NEGOTIATION set can cause
++			 * the dev_refresh/announce cycle also.
++			 *
++			 * Note: It is really important to update our current
++			 * flags with at least the state of TAG capabilities-
++			 * otherwise we might try and send a tagged command
++			 * when we have it all turned off. So change it here
++			 * to say that current already matches goal.
++			 */
++			sdp->isp_devparam[tgt].actv_flags &= ~DPARM_TQING;
++			sdp->isp_devparam[tgt].actv_flags |=
++			    (sdp->isp_devparam[tgt].goal_flags & DPARM_TQING);
++			isp_prt(isp, ISP_LOGDEBUG0,
++			    "bus %d set tgt %d flags 0x%x off 0x%x period 0x%x",
++			    bus, tgt, mbs.param[2], mbs.param[3] >> 8,
++			    mbs.param[3] & 0xff);
++			sdp->isp_devparam[tgt].dev_update = 0;
++			sdp->isp_devparam[tgt].dev_refresh = 1;
++			get = 0;
++		} else {
++			continue;
++		}
++		mbs.param[1] = (bus << 15) | (tgt << 8);
++		isp_mboxcmd(isp, &mbs, MBLOGALL);
++		if (get == 0) {
++			isp->isp_sendmarker |= (1 << bus);
++			continue;
++		}
++		flags = mbs.param[2];
++		period = mbs.param[3] & 0xff;
++		offset = mbs.param[3] >> 8;
++		sdp->isp_devparam[tgt].actv_flags = flags;
++		sdp->isp_devparam[tgt].actv_period = period;
++		sdp->isp_devparam[tgt].actv_offset = offset;
++		get = (bus << 16) | tgt;
++		(void) isp_async(isp, ISPASYNC_NEW_TGT_PARAMS, &get);
++	}
++
++	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++		if (sdp->isp_devparam[tgt].dev_update ||
++		    sdp->isp_devparam[tgt].dev_refresh) {
++			isp->isp_update |= (1 << bus);
++			break;
++		}
++	}
++}
++
++#ifndef	DEFAULT_FRAMESIZE
++#define	DEFAULT_FRAMESIZE(isp)		ICB_DFLT_FRMLEN
++#endif
++#ifndef	DEFAULT_EXEC_THROTTLE
++#define	DEFAULT_EXEC_THROTTLE(isp)	ISP_EXEC_THROTTLE
++#endif
++
++static void
++isp_setdfltparm(struct ispsoftc *isp, int channel)
++{
++	int tgt;
++	mbreg_t mbs;
++	sdparam *sdp;
++
++	if (IS_FC(isp)) {
++		fcparam *fcp = (fcparam *) isp->isp_param;
++		int nvfail;
++
++		fcp += channel;
++		if (fcp->isp_gotdparms) {
++			return;
++		}
++		fcp->isp_gotdparms = 1;
++		fcp->isp_maxfrmlen = DEFAULT_FRAMESIZE(isp);
++		fcp->isp_maxalloc = ICB_DFLT_ALLOC;
++		fcp->isp_execthrottle = DEFAULT_EXEC_THROTTLE(isp);
++		fcp->isp_retry_delay = ICB_DFLT_RDELAY;
++		fcp->isp_retry_count = ICB_DFLT_RCOUNT;
++		/* Platform specific.... */
++		fcp->isp_loopid = DEFAULT_LOOPID(isp);
++		fcp->isp_nodewwn = DEFAULT_NODEWWN(isp);
++		fcp->isp_portwwn = DEFAULT_PORTWWN(isp);
++		fcp->isp_fwoptions = 0;
++		fcp->isp_fwoptions |= ICBOPT_FAIRNESS;
++		fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE;
++		fcp->isp_fwoptions |= ICBOPT_HARD_ADDRESS;
++#ifndef	ISP_NO_FASTPOST_FC
++		fcp->isp_fwoptions |= ICBOPT_FAST_POST;
++#endif
++		if (isp->isp_confopts & ISP_CFG_FULL_DUPLEX)
++			fcp->isp_fwoptions |= ICBOPT_FULL_DUPLEX;
++
++		/*
++		 * Make sure this is turned off now until we get
++		 * extended options from NVRAM
++		 */
++		fcp->isp_fwoptions &= ~ICBOPT_EXTENDED;
++
++		/*
++		 * Now try and read NVRAM unless told to not do so.
++		 * This will set fcparam's isp_nodewwn && isp_portwwn.
++		 */
++		if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) {
++		    	nvfail = isp_read_nvram(isp);
++			if (nvfail)
++				isp->isp_confopts |= ISP_CFG_NONVRAM;
++		} else {
++			nvfail = 1;
++		}
++		/*
++		 * Set node && port to override platform set defaults
++		 * unless the nvram read failed (or none was done),
++		 * or the platform code wants to use what had been
++		 * set in the defaults.
++		 */
++		if (nvfail) {
++			isp->isp_confopts |= ISP_CFG_OWNWWPN|ISP_CFG_OWNWWNN;
++		}
++		if (isp->isp_confopts & ISP_CFG_OWNWWNN) {
++			isp_prt(isp, ISP_LOGCONFIG, "Using Node WWN 0x%08x%08x",
++			    (u_int32_t) (DEFAULT_NODEWWN(isp) >> 32),
++			    (u_int32_t) (DEFAULT_NODEWWN(isp) & 0xffffffff));
++			ISP_NODEWWN(isp) = DEFAULT_NODEWWN(isp);
++		} else {
++			/*
++			 * We always start out with values derived
++			 * from NVRAM or our platform default.
++			 */
++			ISP_NODEWWN(isp) = fcp->isp_nodewwn;
++		}
++		if (isp->isp_confopts & ISP_CFG_OWNWWPN) {
++			isp_prt(isp, ISP_LOGCONFIG, "Using Port WWN 0x%08x%08x",
++			    (u_int32_t) (DEFAULT_PORTWWN(isp) >> 32),
++			    (u_int32_t) (DEFAULT_PORTWWN(isp) & 0xffffffff));
++			ISP_PORTWWN(isp) = DEFAULT_PORTWWN(isp);
++		} else {
++			/*
++			 * We always start out with values derived
++			 * from NVRAM or our platform default.
++			 */
++			ISP_PORTWWN(isp) = fcp->isp_portwwn;
++		}
++		return;
++	}
++
++	sdp = (sdparam *) isp->isp_param;
++	sdp += channel;
++
++	/*
++	 * Been there, done that, got the T-shirt...
++	 */
++	if (sdp->isp_gotdparms) {
++		return;
++	}
++	sdp->isp_gotdparms = 1;
++
++	/*
++	 * Establish some default parameters.
++	 */
++	sdp->isp_cmd_dma_burst_enable = 0;
++	sdp->isp_data_dma_burst_enabl = 1;
++	sdp->isp_fifo_threshold = 0;
++	sdp->isp_initiator_id = DEFAULT_IID(isp);
++	if (isp->isp_type >= ISP_HA_SCSI_1040) {
++		sdp->isp_async_data_setup = 9;
++	} else {
++		sdp->isp_async_data_setup = 6;
++	}
++	sdp->isp_selection_timeout = 250;
++	sdp->isp_max_queue_depth = MAXISPREQUEST(isp);
++	sdp->isp_tag_aging = 8;
++	sdp->isp_bus_reset_delay = 5;
++	/*
++	 * Don't retry selection, busy or queue full automatically- reflect
++	 * these back to us.
++	 */
++	sdp->isp_retry_count = 0;
++	sdp->isp_retry_delay = 0;
++
++	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++		sdp->isp_devparam[tgt].exc_throttle = ISP_EXEC_THROTTLE;
++		sdp->isp_devparam[tgt].dev_enable = 1;
++	}
++
++	/*
++	 * If we've not been told to avoid reading NVRAM, try and read it.
++	 * If we're successful reading it, we can then return because NVRAM
++	 * will tell us what the desired settings are. Otherwise, we establish
++	 * some reasonable 'fake' nvram and goal defaults.
++	 */
++
++	if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) {
++		if (isp_read_nvram(isp) == 0) {
++			return;
++		}
++	}
++
++	/*
++	 * Now try and see whether we have specific values for them.
++	 */
++	if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) {
++		mbs.param[0] = MBOX_GET_ACT_NEG_STATE;
++		isp_mboxcmd(isp, &mbs, MBLOGNONE);
++		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++			sdp->isp_req_ack_active_neg = 1;
++			sdp->isp_data_line_active_neg = 1;
++		} else {
++			sdp->isp_req_ack_active_neg =
++			    (mbs.param[1+channel] >> 4) & 0x1;
++			sdp->isp_data_line_active_neg =
++			    (mbs.param[1+channel] >> 5) & 0x1;
++		}
++	}
++
++	isp_prt(isp, ISP_LOGDEBUG0, sc0, sc3,
++	    0, sdp->isp_fifo_threshold, sdp->isp_initiator_id,
++	    sdp->isp_bus_reset_delay, sdp->isp_retry_count,
++	    sdp->isp_retry_delay, sdp->isp_async_data_setup);
++	isp_prt(isp, ISP_LOGDEBUG0, sc1, sc3,
++	    sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg,
++	    sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable,
++	    sdp->isp_selection_timeout, sdp->isp_max_queue_depth);
++
++	/*
++	 * The trick here is to establish a default for the default (honk!)
++	 * state (goal_flags). Then try and get the current status from
++	 * the card to fill in the current state. We don't, in fact, set
++	 * the default to the SAFE default state- that's not the goal state.
++	 */
++	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++		u_int8_t off, per;
++		sdp->isp_devparam[tgt].actv_offset = 0;
++		sdp->isp_devparam[tgt].actv_period = 0;
++		sdp->isp_devparam[tgt].actv_flags = 0;
++
++		sdp->isp_devparam[tgt].goal_flags =
++		    sdp->isp_devparam[tgt].nvrm_flags = DPARM_DEFAULT;
++
++		/*
++		 * We default to Wide/Fast for versions less than a 1040
++		 * (unless it's SBus).
++		 */
++		if (IS_ULTRA3(isp)) {
++			off = ISP_80M_SYNCPARMS >> 8;
++			per = ISP_80M_SYNCPARMS & 0xff;
++		} else if (IS_ULTRA2(isp)) {
++			off = ISP_40M_SYNCPARMS >> 8;
++			per = ISP_40M_SYNCPARMS & 0xff;
++		} else if (IS_1240(isp)) {
++			off = ISP_20M_SYNCPARMS >> 8;
++			per = ISP_20M_SYNCPARMS & 0xff;
++		} else if ((isp->isp_bustype == ISP_BT_SBUS &&
++		    isp->isp_type < ISP_HA_SCSI_1020A) ||
++		    (isp->isp_bustype == ISP_BT_PCI &&
++		    isp->isp_type < ISP_HA_SCSI_1040) ||
++		    (isp->isp_clock && isp->isp_clock < 60) ||
++		    (sdp->isp_ultramode == 0)) {
++			off = ISP_10M_SYNCPARMS >> 8;
++			per = ISP_10M_SYNCPARMS & 0xff;
++		} else {
++			off = ISP_20M_SYNCPARMS_1040 >> 8;
++			per = ISP_20M_SYNCPARMS_1040 & 0xff;
++		}
++		sdp->isp_devparam[tgt].goal_offset =
++		    sdp->isp_devparam[tgt].nvrm_offset = off;
++		sdp->isp_devparam[tgt].goal_period =
++		    sdp->isp_devparam[tgt].nvrm_period = per;
++
++		isp_prt(isp, ISP_LOGDEBUG0, sc2, sc3,
++		    channel, tgt, sdp->isp_devparam[tgt].nvrm_flags,
++		    sdp->isp_devparam[tgt].nvrm_offset,
++		    sdp->isp_devparam[tgt].nvrm_period);
++	}
++}
++
++/*
++ * Re-initialize the ISP and complete all orphaned commands
++ * with a 'botched' notice. The reset/init routines should
++ * not disturb an already active list of commands.
++ *
++ * Locks held prior to coming here.
++ */
++
++void
++isp_reinit(struct ispsoftc *isp)
++{
++	XS_T *xs;
++	u_int16_t handle;
++
++	if (IS_FC(isp)) {
++		isp_mark_getpdb_all(isp);
++	}
++	isp_reset(isp);
++	if (isp->isp_state != ISP_RESETSTATE) {
++		isp_prt(isp, ISP_LOGERR, "isp_reinit cannot reset card");
++	} else if (isp->isp_role != ISP_ROLE_NONE) {
++		isp_init(isp);
++		if (isp->isp_state == ISP_INITSTATE) {
++			isp->isp_state = ISP_RUNSTATE;
++		}
++		if (isp->isp_state != ISP_RUNSTATE) {
++			isp_prt(isp, ISP_LOGERR,
++			    "isp_reinit cannot restart card");
++		}
++	}
++	isp->isp_nactive = 0;
++
++	for (handle = 1; (int) handle <= isp->isp_maxcmds; handle++) {
++		xs = isp_find_xs(isp, handle);
++		if (xs == NULL) {
++			continue;
++		}
++		isp_destroy_handle(isp, handle);
++		if (XS_XFRLEN(xs)) {
++			ISP_DMAFREE(isp, xs, handle);
++			XS_RESID(xs) = XS_XFRLEN(xs);
++		} else {
++			XS_RESID(xs) = 0;
++		}
++		XS_SETERR(xs, HBA_BUSRESET);
++		isp_done(xs);
++	}
++}
++
++/*
++ * NVRAM Routines
++ */
++static int
++isp_read_nvram(struct ispsoftc *isp)
++{
++	int i, amt;
++	u_int8_t csum, minversion;
++	union {
++		u_int8_t _x[ISP2100_NVRAM_SIZE];
++		u_int16_t _s[ISP2100_NVRAM_SIZE>>1];
++	} _n;
++#define	nvram_data	_n._x
++#define	nvram_words	_n._s
++
++	if (IS_FC(isp)) {
++		amt = ISP2100_NVRAM_SIZE;
++		minversion = 1;
++	} else if (IS_ULTRA2(isp)) {
++		amt = ISP1080_NVRAM_SIZE;
++		minversion = 0;
++	} else {
++		amt = ISP_NVRAM_SIZE;
++		minversion = 2;
++	}
++
++	/*
++	 * Just read the first two words first to see if we have a valid
++	 * NVRAM to continue reading the rest with.
++	 */
++	for (i = 0; i < 2; i++) {
++		isp_rdnvram_word(isp, i, &nvram_words[i]);
++	}
++	if (nvram_data[0] != 'I' || nvram_data[1] != 'S' ||
++	    nvram_data[2] != 'P') {
++		if (isp->isp_bustype != ISP_BT_SBUS) {
++			isp_prt(isp, ISP_LOGWARN, "invalid NVRAM header");
++			isp_prt(isp, ISP_LOGDEBUG0, "%x %x %x",
++			    nvram_data[0], nvram_data[1], nvram_data[2]);
++		}
++		return (-1);
++	}
++	for (i = 2; i < amt>>1; i++) {
++		isp_rdnvram_word(isp, i, &nvram_words[i]);
++	}
++	for (csum = 0, i = 0; i < amt; i++) {
++		csum += nvram_data[i];
++	}
++	if (csum != 0) {
++		isp_prt(isp, ISP_LOGWARN, "invalid NVRAM checksum");
++		return (-1);
++	}
++	if (ISP_NVRAM_VERSION(nvram_data) < minversion) {
++		isp_prt(isp, ISP_LOGWARN, "version %d NVRAM not understood",
++		    ISP_NVRAM_VERSION(nvram_data));
++		return (-1);
++	}
++
++	if (IS_ULTRA3(isp)) {
++		isp_parse_nvram_12160(isp, 0, nvram_data);
++		if (IS_12160(isp))
++			isp_parse_nvram_12160(isp, 1, nvram_data);
++	} else if (IS_1080(isp)) {
++		isp_parse_nvram_1080(isp, 0, nvram_data);
++	} else if (IS_1280(isp) || IS_1240(isp)) {
++		isp_parse_nvram_1080(isp, 0, nvram_data);
++		isp_parse_nvram_1080(isp, 1, nvram_data);
++	} else if (IS_SCSI(isp)) {
++		isp_parse_nvram_1020(isp, nvram_data);
++	} else {
++		isp_parse_nvram_2100(isp, nvram_data);
++	}
++	return (0);
++#undef	nvram_data
++#undef	nvram_words
++}
++
++static void
++isp_rdnvram_word(struct ispsoftc *isp, int wo, u_int16_t *rp)
++{
++	int i, cbits;
++	u_int16_t bit, rqst;
++
++	ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT);
++	USEC_DELAY(2);
++	ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK);
++	USEC_DELAY(2);
++
++	if (IS_FC(isp)) {
++		wo &= ((ISP2100_NVRAM_SIZE >> 1) - 1);
++		if (IS_2312(isp) && isp->isp_port) {
++			wo += 128;
++		}
++		rqst = (ISP_NVRAM_READ << 8) | wo;
++		cbits = 10;
++	} else if (IS_ULTRA2(isp)) {
++		wo &= ((ISP1080_NVRAM_SIZE >> 1) - 1);
++		rqst = (ISP_NVRAM_READ << 8) | wo;
++		cbits = 10;
++	} else {
++		wo &= ((ISP_NVRAM_SIZE >> 1) - 1);
++		rqst = (ISP_NVRAM_READ << 6) | wo;
++		cbits = 8;
++	}
++
++	/*
++	 * Clock the word select request out...
++	 */
++	for (i = cbits; i >= 0; i--) {
++		if ((rqst >> i) & 1) {
++			bit = BIU_NVRAM_SELECT | BIU_NVRAM_DATAOUT;
++		} else {
++			bit = BIU_NVRAM_SELECT;
++		}
++		ISP_WRITE(isp, BIU_NVRAM, bit);
++		USEC_DELAY(2);
++		ISP_WRITE(isp, BIU_NVRAM, bit | BIU_NVRAM_CLOCK);
++		USEC_DELAY(2);
++		ISP_WRITE(isp, BIU_NVRAM, bit);
++		USEC_DELAY(2);
++	}
++	/*
++	 * Now read the result back in (bits come back in MSB format).
++	 */
++	*rp = 0;
++	for (i = 0; i < 16; i++) {
++		u_int16_t rv;
++		*rp <<= 1;
++		ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK);
++		USEC_DELAY(2);
++		rv = ISP_READ(isp, BIU_NVRAM);
++		if (rv & BIU_NVRAM_DATAIN) {
++			*rp |= 1;
++		}
++		USEC_DELAY(2);
++		ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT);
++		USEC_DELAY(2);
++	}
++	ISP_WRITE(isp, BIU_NVRAM, 0);
++	USEC_DELAY(2);
++	ISP_SWIZZLE_NVRAM_WORD(isp, rp);
++}
++
++static void
++isp_parse_nvram_1020(struct ispsoftc *isp, u_int8_t *nvram_data)
++{
++	sdparam *sdp = (sdparam *) isp->isp_param;
++	int tgt;
++
++	sdp->isp_fifo_threshold =
++		ISP_NVRAM_FIFO_THRESHOLD(nvram_data) |
++		(ISP_NVRAM_FIFO_THRESHOLD_128(nvram_data) << 2);
++
++	if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0)
++		sdp->isp_initiator_id =
++			ISP_NVRAM_INITIATOR_ID(nvram_data);
++
++	sdp->isp_bus_reset_delay =
++		ISP_NVRAM_BUS_RESET_DELAY(nvram_data);
++
++	sdp->isp_retry_count =
++		ISP_NVRAM_BUS_RETRY_COUNT(nvram_data);
++
++	sdp->isp_retry_delay =
++		ISP_NVRAM_BUS_RETRY_DELAY(nvram_data);
++
++	sdp->isp_async_data_setup =
++		ISP_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data);
++
++	if (isp->isp_type >= ISP_HA_SCSI_1040) {
++		if (sdp->isp_async_data_setup < 9) {
++			sdp->isp_async_data_setup = 9;
++		}
++	} else {
++		if (sdp->isp_async_data_setup != 6) {
++			sdp->isp_async_data_setup = 6;
++		}
++	}
++
++	sdp->isp_req_ack_active_neg =
++		ISP_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data);
++
++	sdp->isp_data_line_active_neg =
++		ISP_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data);
++
++	sdp->isp_data_dma_burst_enabl =
++		ISP_NVRAM_DATA_DMA_BURST_ENABLE(nvram_data);
++
++	sdp->isp_cmd_dma_burst_enable =
++		ISP_NVRAM_CMD_DMA_BURST_ENABLE(nvram_data);
++
++	sdp->isp_tag_aging =
++		ISP_NVRAM_TAG_AGE_LIMIT(nvram_data);
++
++	sdp->isp_selection_timeout =
++		ISP_NVRAM_SELECTION_TIMEOUT(nvram_data);
++
++	sdp->isp_max_queue_depth =
++		ISP_NVRAM_MAX_QUEUE_DEPTH(nvram_data);
++
++	sdp->isp_fast_mttr = ISP_NVRAM_FAST_MTTR_ENABLE(nvram_data);
++
++	isp_prt(isp, ISP_LOGDEBUG0, sc0, sc4,
++	    0, sdp->isp_fifo_threshold, sdp->isp_initiator_id,
++	    sdp->isp_bus_reset_delay, sdp->isp_retry_count,
++	    sdp->isp_retry_delay, sdp->isp_async_data_setup);
++	isp_prt(isp, ISP_LOGDEBUG0, sc1, sc4,
++	    sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg,
++	    sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable,
++	    sdp->isp_selection_timeout, sdp->isp_max_queue_depth);
++
++	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++		sdp->isp_devparam[tgt].dev_enable =
++			ISP_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt);
++		sdp->isp_devparam[tgt].exc_throttle =
++			ISP_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt);
++		sdp->isp_devparam[tgt].nvrm_offset =
++			ISP_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt);
++		sdp->isp_devparam[tgt].nvrm_period =
++			ISP_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt);
++		/*
++		 * We probably shouldn't lie about this, but it
++		 * it makes it much safer if we limit NVRAM values
++		 * to sanity.
++		 */
++		if (isp->isp_type < ISP_HA_SCSI_1040) {
++			/*
++			 * If we're not ultra, we can't possibly
++			 * be a shorter period than this.
++			 */
++			if (sdp->isp_devparam[tgt].nvrm_period < 0x19) {
++				sdp->isp_devparam[tgt].nvrm_period = 0x19;
++			}
++			if (sdp->isp_devparam[tgt].nvrm_offset > 0xc) {
++				sdp->isp_devparam[tgt].nvrm_offset = 0x0c;
++			}
++		} else {
++			if (sdp->isp_devparam[tgt].nvrm_offset > 0x8) {
++				sdp->isp_devparam[tgt].nvrm_offset = 0x8;
++			}
++		}
++		sdp->isp_devparam[tgt].nvrm_flags = 0;
++		if (ISP_NVRAM_TGT_RENEG(nvram_data, tgt))
++			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG;
++		sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ;
++		if (ISP_NVRAM_TGT_TQING(nvram_data, tgt))
++			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING;
++		if (ISP_NVRAM_TGT_SYNC(nvram_data, tgt))
++			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC;
++		if (ISP_NVRAM_TGT_WIDE(nvram_data, tgt))
++			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE;
++		if (ISP_NVRAM_TGT_PARITY(nvram_data, tgt))
++			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY;
++		if (ISP_NVRAM_TGT_DISC(nvram_data, tgt))
++			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC;
++		sdp->isp_devparam[tgt].actv_flags = 0; /* we don't know */
++		isp_prt(isp, ISP_LOGDEBUG0, sc2, sc4,
++		    0, tgt, sdp->isp_devparam[tgt].nvrm_flags,
++		    sdp->isp_devparam[tgt].nvrm_offset,
++		    sdp->isp_devparam[tgt].nvrm_period);
++		sdp->isp_devparam[tgt].goal_offset =
++		    sdp->isp_devparam[tgt].nvrm_offset;
++		sdp->isp_devparam[tgt].goal_period =
++		    sdp->isp_devparam[tgt].nvrm_period;
++		sdp->isp_devparam[tgt].goal_flags =
++		    sdp->isp_devparam[tgt].nvrm_flags;
++	}
++}
++
++static void
++isp_parse_nvram_1080(struct ispsoftc *isp, int bus, u_int8_t *nvram_data)
++{
++	sdparam *sdp = (sdparam *) isp->isp_param;
++	int tgt;
++
++	sdp += bus;
++
++	sdp->isp_fifo_threshold =
++	    ISP1080_NVRAM_FIFO_THRESHOLD(nvram_data);
++
++	if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0)
++		sdp->isp_initiator_id =
++		    ISP1080_NVRAM_INITIATOR_ID(nvram_data, bus);
++
++	sdp->isp_bus_reset_delay =
++	    ISP1080_NVRAM_BUS_RESET_DELAY(nvram_data, bus);
++
++	sdp->isp_retry_count =
++	    ISP1080_NVRAM_BUS_RETRY_COUNT(nvram_data, bus);
++
++	sdp->isp_retry_delay =
++	    ISP1080_NVRAM_BUS_RETRY_DELAY(nvram_data, bus);
++
++	sdp->isp_async_data_setup =
++	    ISP1080_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data, bus);
++
++	sdp->isp_req_ack_active_neg =
++	    ISP1080_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data, bus);
++
++	sdp->isp_data_line_active_neg =
++	    ISP1080_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data, bus);
++
++	sdp->isp_data_dma_burst_enabl =
++	    ISP1080_NVRAM_BURST_ENABLE(nvram_data);
++
++	sdp->isp_cmd_dma_burst_enable =
++	    ISP1080_NVRAM_BURST_ENABLE(nvram_data);
++
++	sdp->isp_selection_timeout =
++	    ISP1080_NVRAM_SELECTION_TIMEOUT(nvram_data, bus);
++
++	sdp->isp_max_queue_depth =
++	     ISP1080_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus);
++
++	isp_prt(isp, ISP_LOGDEBUG0, sc0, sc4,
++	    bus, sdp->isp_fifo_threshold, sdp->isp_initiator_id,
++	    sdp->isp_bus_reset_delay, sdp->isp_retry_count,
++	    sdp->isp_retry_delay, sdp->isp_async_data_setup);
++	isp_prt(isp, ISP_LOGDEBUG0, sc1, sc4,
++	    sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg,
++	    sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable,
++	    sdp->isp_selection_timeout, sdp->isp_max_queue_depth);
++
++
++	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++		sdp->isp_devparam[tgt].dev_enable =
++		    ISP1080_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt, bus);
++		sdp->isp_devparam[tgt].exc_throttle =
++			ISP1080_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt, bus);
++		sdp->isp_devparam[tgt].nvrm_offset =
++			ISP1080_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt, bus);
++		sdp->isp_devparam[tgt].nvrm_period =
++			ISP1080_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt, bus);
++		sdp->isp_devparam[tgt].nvrm_flags = 0;
++		if (ISP1080_NVRAM_TGT_RENEG(nvram_data, tgt, bus))
++			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG;
++		sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ;
++		if (ISP1080_NVRAM_TGT_TQING(nvram_data, tgt, bus))
++			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING;
++		if (ISP1080_NVRAM_TGT_SYNC(nvram_data, tgt, bus))
++			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC;
++		if (ISP1080_NVRAM_TGT_WIDE(nvram_data, tgt, bus))
++			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE;
++		if (ISP1080_NVRAM_TGT_PARITY(nvram_data, tgt, bus))
++			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY;
++		if (ISP1080_NVRAM_TGT_DISC(nvram_data, tgt, bus))
++			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC;
++		sdp->isp_devparam[tgt].actv_flags = 0;
++		isp_prt(isp, ISP_LOGDEBUG0, sc2, sc4,
++		    bus, tgt, sdp->isp_devparam[tgt].nvrm_flags,
++		    sdp->isp_devparam[tgt].nvrm_offset,
++		    sdp->isp_devparam[tgt].nvrm_period);
++		sdp->isp_devparam[tgt].goal_offset =
++		    sdp->isp_devparam[tgt].nvrm_offset;
++		sdp->isp_devparam[tgt].goal_period =
++		    sdp->isp_devparam[tgt].nvrm_period;
++		sdp->isp_devparam[tgt].goal_flags =
++		    sdp->isp_devparam[tgt].nvrm_flags;
++	}
++}
++
++static void
++isp_parse_nvram_12160(struct ispsoftc *isp, int bus, u_int8_t *nvram_data)
++{
++	sdparam *sdp = (sdparam *) isp->isp_param;
++	int tgt;
++
++	sdp += bus;
++
++	sdp->isp_fifo_threshold =
++	    ISP12160_NVRAM_FIFO_THRESHOLD(nvram_data);
++
++	if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0)
++		sdp->isp_initiator_id =
++		    ISP12160_NVRAM_INITIATOR_ID(nvram_data, bus);
++
++	sdp->isp_bus_reset_delay =
++	    ISP12160_NVRAM_BUS_RESET_DELAY(nvram_data, bus);
++
++	sdp->isp_retry_count =
++	    ISP12160_NVRAM_BUS_RETRY_COUNT(nvram_data, bus);
++
++	sdp->isp_retry_delay =
++	    ISP12160_NVRAM_BUS_RETRY_DELAY(nvram_data, bus);
++
++	sdp->isp_async_data_setup =
++	    ISP12160_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data, bus);
++
++	sdp->isp_req_ack_active_neg =
++	    ISP12160_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data, bus);
++
++	sdp->isp_data_line_active_neg =
++	    ISP12160_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data, bus);
++
++	sdp->isp_data_dma_burst_enabl =
++	    ISP12160_NVRAM_BURST_ENABLE(nvram_data);
++
++	sdp->isp_cmd_dma_burst_enable =
++	    ISP12160_NVRAM_BURST_ENABLE(nvram_data);
++
++	sdp->isp_selection_timeout =
++	    ISP12160_NVRAM_SELECTION_TIMEOUT(nvram_data, bus);
++
++	sdp->isp_max_queue_depth =
++	     ISP12160_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus);
++
++	isp_prt(isp, ISP_LOGDEBUG0, sc0, sc4,
++	    bus, sdp->isp_fifo_threshold, sdp->isp_initiator_id,
++	    sdp->isp_bus_reset_delay, sdp->isp_retry_count,
++	    sdp->isp_retry_delay, sdp->isp_async_data_setup);
++	isp_prt(isp, ISP_LOGDEBUG0, sc1, sc4,
++	    sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg,
++	    sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable,
++	    sdp->isp_selection_timeout, sdp->isp_max_queue_depth);
++
++	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++		sdp->isp_devparam[tgt].dev_enable =
++		    ISP12160_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt, bus);
++		sdp->isp_devparam[tgt].exc_throttle =
++			ISP12160_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt, bus);
++		sdp->isp_devparam[tgt].nvrm_offset =
++			ISP12160_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt, bus);
++		sdp->isp_devparam[tgt].nvrm_period =
++			ISP12160_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt, bus);
++		sdp->isp_devparam[tgt].nvrm_flags = 0;
++		if (ISP12160_NVRAM_TGT_RENEG(nvram_data, tgt, bus))
++			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG;
++		sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ;
++		if (ISP12160_NVRAM_TGT_TQING(nvram_data, tgt, bus))
++			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING;
++		if (ISP12160_NVRAM_TGT_SYNC(nvram_data, tgt, bus))
++			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC;
++		if (ISP12160_NVRAM_TGT_WIDE(nvram_data, tgt, bus))
++			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE;
++		if (ISP12160_NVRAM_TGT_PARITY(nvram_data, tgt, bus))
++			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY;
++		if (ISP12160_NVRAM_TGT_DISC(nvram_data, tgt, bus))
++			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC;
++		sdp->isp_devparam[tgt].actv_flags = 0;
++		isp_prt(isp, ISP_LOGDEBUG0, sc2, sc4,
++		    bus, tgt, sdp->isp_devparam[tgt].nvrm_flags,
++		    sdp->isp_devparam[tgt].nvrm_offset,
++		    sdp->isp_devparam[tgt].nvrm_period);
++		sdp->isp_devparam[tgt].goal_offset =
++		    sdp->isp_devparam[tgt].nvrm_offset;
++		sdp->isp_devparam[tgt].goal_period =
++		    sdp->isp_devparam[tgt].nvrm_period;
++		sdp->isp_devparam[tgt].goal_flags =
++		    sdp->isp_devparam[tgt].nvrm_flags;
++	}
++}
++
++static void
++isp_parse_nvram_2100(struct ispsoftc *isp, u_int8_t *nvram_data)
++{
++	fcparam *fcp = (fcparam *) isp->isp_param;
++	u_int64_t wwn;
++
++	/*
++	 * There is NVRAM storage for both Port and Node entities-
++	 * but the Node entity appears to be unused on all the cards
++	 * I can find. However, we should account for this being set
++	 * at some point in the future.
++	 *
++	 * Qlogic WWNs have an NAA of 2, but usually nothing shows up in
++	 * bits 48..60. In the case of the 2202, it appears that they do
++	 * use bit 48 to distinguish between the two instances on the card.
++	 * The 2204, which I've never seen, *probably* extends this method.
++	 */
++	wwn = ISP2100_NVRAM_PORT_NAME(nvram_data);
++	if (wwn) {
++		isp_prt(isp, ISP_LOGCONFIG, "NVRAM Port WWN 0x%08x%08x",
++		    (u_int32_t) (wwn >> 32), (u_int32_t) (wwn & 0xffffffff));
++		if ((wwn >> 60) == 0) {
++			wwn |= (((u_int64_t) 2)<< 60);
++		}
++	}
++	fcp->isp_portwwn = wwn;
++	if (IS_2200(isp) || IS_23XX(isp)) {
++		wwn = ISP2200_NVRAM_NODE_NAME(nvram_data);
++		if (wwn) {
++			isp_prt(isp, ISP_LOGCONFIG, "NVRAM Node WWN 0x%08x%08x",
++			    (u_int32_t) (wwn >> 32),
++			    (u_int32_t) (wwn & 0xffffffff));
++			if ((wwn >> 60) == 0) {
++				wwn |= (((u_int64_t) 2)<< 60);
++			}
++		}
++	} else {
++		wwn &= ~((u_int64_t) 0xfff << 48);
++	}
++	fcp->isp_nodewwn = wwn;
++
++	/*
++	 * Make sure we have both Node and Port as non-zero values.
++	 */
++	if (fcp->isp_nodewwn != 0 && fcp->isp_portwwn == 0) {
++		fcp->isp_portwwn = fcp->isp_nodewwn;
++	} else if (fcp->isp_nodewwn == 0 && fcp->isp_portwwn != 0) {
++		fcp->isp_nodewwn = fcp->isp_portwwn;
++	}
++
++	/*
++	 * Make the Node and Port values sane if they're NAA == 2.
++	 * This means to clear bits 48..56 for the Node WWN and
++	 * make sure that there's some non-zero value in 48..56
++	 * for the Port WWN.
++	 */
++	if (fcp->isp_nodewwn && fcp->isp_portwwn) {
++		if ((fcp->isp_nodewwn & (((u_int64_t) 0xfff) << 48)) != 0 &&
++		    (fcp->isp_nodewwn >> 60) == 2) {
++			fcp->isp_nodewwn &= ~((u_int64_t) 0xfff << 48);
++		}
++		if ((fcp->isp_portwwn & (((u_int64_t) 0xfff) << 48)) == 0 &&
++		    (fcp->isp_portwwn >> 60) == 2) {
++			fcp->isp_portwwn |= ((u_int64_t) 1 << 56);
++		}
++	}
++
++	isp_prt(isp, ISP_LOGDEBUG0,
++	    "NVRAM: maxfrmlen %d execthrottle %d fwoptions 0x%x loopid %x",
++	    ISP2100_NVRAM_MAXFRAMELENGTH(nvram_data),
++	    ISP2100_NVRAM_EXECUTION_THROTTLE(nvram_data),
++	    ISP2100_NVRAM_OPTIONS(nvram_data),
++	    ISP2100_NVRAM_HARDLOOPID(nvram_data));
++
++	fcp->isp_maxalloc =
++		ISP2100_NVRAM_MAXIOCBALLOCATION(nvram_data);
++	if ((isp->isp_confopts & ISP_CFG_OWNFSZ) == 0)
++		fcp->isp_maxfrmlen =
++			ISP2100_NVRAM_MAXFRAMELENGTH(nvram_data);
++	fcp->isp_retry_delay =
++		ISP2100_NVRAM_RETRY_DELAY(nvram_data);
++	fcp->isp_retry_count =
++		ISP2100_NVRAM_RETRY_COUNT(nvram_data);
++	if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0)
++		fcp->isp_loopid =
++			ISP2100_NVRAM_HARDLOOPID(nvram_data);
++	if ((isp->isp_confopts & ISP_CFG_OWNEXCTHROTTLE) == 0)
++		fcp->isp_execthrottle =
++			ISP2100_NVRAM_EXECUTION_THROTTLE(nvram_data);
++	fcp->isp_fwoptions = ISP2100_NVRAM_OPTIONS(nvram_data);
++}
++
++#ifdef	ISP_FW_CRASH_DUMP
++static void isp2200_fw_dump(struct ispsoftc *);
++static void isp2300_fw_dump(struct ispsoftc *);
++
++static void
++isp2200_fw_dump(struct ispsoftc *isp)
++{
++	int i, j;
++	mbreg_t mbs;
++	u_int16_t *ptr;
++
++	ptr = FCPARAM(isp)->isp_dump_data;
++	if (ptr == NULL) {
++		isp_prt(isp, ISP_LOGERR,
++		   "No place to dump RISC registers and SRAM");
++		return;
++	}
++	if (*ptr++) {
++		isp_prt(isp, ISP_LOGERR,
++		   "dump area for RISC registers and SRAM already used");
++		return;
++	}
++	ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
++	for (i = 0; i < 100; i++) {
++		USEC_DELAY(100);
++		if (ISP_READ(isp, HCCR) & HCCR_PAUSE) {
++			break;
++		}
++	}
++	if (ISP_READ(isp, HCCR) & HCCR_PAUSE) {
++		/*
++		 * PBIU Registers
++		 */
++		for (i = 0; i < 8; i++) {
++			*ptr++ = ISP_READ(isp, BIU_BLOCK + (i << 1));
++		}
++
++		/*
++		 * Mailbox Registers
++		 */
++		for (i = 0; i < 8; i++) {
++			*ptr++ = ISP_READ(isp, MBOX_BLOCK + (i << 1));
++		}
++
++		/*
++		 * DMA Registers
++		 */
++		for (i = 0; i < 48; i++) {
++			*ptr++ = ISP_READ(isp, DMA_BLOCK + 0x20 + (i << 1));
++		}
++
++		/*
++		 * RISC H/W Registers
++		 */
++		ISP_WRITE(isp, BIU2100_CSR, 0);
++		for (i = 0; i < 16; i++) {
++			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0xA0 + (i << 1));
++		}
++
++		/*
++		 * RISC GP Registers
++		 */
++		for (j = 0; j < 8; j++) {
++			ISP_WRITE(isp, BIU_BLOCK + 0xA4, 0x2000 + (j << 8));
++			for (i = 0; i < 16; i++) {
++				*ptr++ =
++				    ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++			}
++		}
++
++		/*
++		 * Frame Buffer Hardware Registers
++		 */
++		ISP_WRITE(isp, BIU2100_CSR, 0x10);
++		for (i = 0; i < 16; i++) {
++			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++		}
++
++		/*
++		 * Fibre Protocol Module 0 Hardware Registers
++		 */
++		ISP_WRITE(isp, BIU2100_CSR, 0x20);
++		for (i = 0; i < 64; i++) {
++			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++		}
++
++		/*
++		 * Fibre Protocol Module 1 Hardware Registers
++		 */
++		ISP_WRITE(isp, BIU2100_CSR, 0x30);
++		for (i = 0; i < 64; i++) {
++			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++		}
++	} else {
++		isp_prt(isp, ISP_LOGERR, "RISC Would Not Pause");
++		return;
++	}
++	isp_prt(isp, ISP_LOGALL,
++	   "isp_fw_dump: RISC registers dumped successfully");
++	ISP_WRITE(isp, BIU2100_CSR, BIU2100_SOFT_RESET);
++	for (i = 0; i < 100; i++) {
++		USEC_DELAY(100);
++		if (ISP_READ(isp, OUTMAILBOX0) == 0) {
++			break;
++		}
++	}
++	if (ISP_READ(isp, OUTMAILBOX0) != 0) {
++		isp_prt(isp, ISP_LOGERR, "Board Would Not Reset");
++		return;
++	}
++	ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
++	for (i = 0; i < 100; i++) {
++		USEC_DELAY(100);
++		if (ISP_READ(isp, HCCR) & HCCR_PAUSE) {
++			break;
++		}
++	}
++	if ((ISP_READ(isp, HCCR) & HCCR_PAUSE) == 0) {
++		isp_prt(isp, ISP_LOGERR, "RISC Would Not Pause After Reset");
++		return;
++	}
++	ISP_WRITE(isp, RISC_EMB, 0xf2);
++	ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
++	for (i = 0; i < 100; i++) {
++		USEC_DELAY(100);
++		if ((ISP_READ(isp, HCCR) & HCCR_PAUSE) == 0) {
++			break;
++		}
++	}
++	ENABLE_INTS(isp);
++	mbs.param[0] = MBOX_READ_RAM_WORD;
++	mbs.param[1] = 0x1000;
++	isp->isp_mbxworkp = (void *) ptr;
++	isp->isp_mbxwrk0 = 0xefff;	/* continuation count */
++	isp->isp_mbxwrk1 = 0x1001;	/* next SRAM address */
++	isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs);
++	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++		isp_prt(isp, ISP_LOGWARN,
++		    "RAM DUMP FAILED @ WORD %x", isp->isp_mbxwrk1);
++		return;
++	}
++	ptr = isp->isp_mbxworkp;	/* finish fetch of final word */
++	*ptr++ = isp->isp_mboxtmp[2];
++	isp_prt(isp, ISP_LOGALL, "isp_fw_dump: SRAM dumped successfully");
++	FCPARAM(isp)->isp_dump_data[0] = isp->isp_type; /* now used */
++	(void) isp_async(isp, ISPASYNC_FW_DUMPED, 0);
++}
++
++static void
++isp2300_fw_dump(struct ispsoftc *isp)
++{
++	int i, j;
++	mbreg_t mbs;
++	u_int16_t *ptr;
++
++	ptr = FCPARAM(isp)->isp_dump_data;
++	if (ptr == NULL) {
++		isp_prt(isp, ISP_LOGERR,
++		   "No place to dump RISC registers and SRAM");
++		return;
++	}
++	if (*ptr++) {
++		isp_prt(isp, ISP_LOGERR,
++		   "dump area for RISC registers and SRAM already used");
++		return;
++	}
++	ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
++	for (i = 0; i < 100; i++) {
++		USEC_DELAY(100);
++		if (ISP_READ(isp, HCCR) & HCCR_PAUSE) {
++			break;
++		}
++	}
++	if (ISP_READ(isp, HCCR) & HCCR_PAUSE) {
++		/*
++		 * PBIU registers
++		 */
++		for (i = 0; i < 8; i++) {
++			*ptr++ = ISP_READ(isp, BIU_BLOCK + (i << 1));
++		}
++
++		/*
++		 * ReqQ-RspQ-Risc2Host Status registers
++		 */
++		for (i = 0; i < 8; i++) {
++			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0x10 + (i << 1));
++		}
++
++		/*
++		 * Mailbox Registers
++		 */
++		for (i = 0; i < 32; i++) {
++			*ptr++ =
++			    ISP_READ(isp, PCI_MBOX_REGS2300_OFF + (i << 1));
++		}
++
++		/*
++		 * Auto Request Response DMA registers
++		 */
++		ISP_WRITE(isp, BIU2100_CSR, 0x40);
++		for (i = 0; i < 32; i++) {
++			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++		}
++
++		/*
++		 * DMA registers
++		 */
++		ISP_WRITE(isp, BIU2100_CSR, 0x50);
++		for (i = 0; i < 48; i++) {
++			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++		}
++
++		/*
++		 * RISC hardware registers
++		 */
++		ISP_WRITE(isp, BIU2100_CSR, 0);
++		for (i = 0; i < 16; i++) {
++			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0xA0 + (i << 1));
++		}
++
++		/*
++		 * RISC GP? registers
++		 */
++		for (j = 0; j < 8; j++) {
++			ISP_WRITE(isp, BIU_BLOCK + 0xA4, 0x2000 + (j << 9));
++			for (i = 0; i < 16; i++) {
++				*ptr++ =
++				    ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++			}
++		}
++
++		/*
++		 * frame buffer hardware registers
++		 */
++		ISP_WRITE(isp, BIU2100_CSR, 0x10);
++		for (i = 0; i < 64; i++) {
++			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++		}
++
++		/*
++		 * FPM B0 hardware registers
++		 */
++		ISP_WRITE(isp, BIU2100_CSR, 0x20);
++		for (i = 0; i < 64; i++) {
++			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++		}
++
++		/*
++		 * FPM B1 hardware registers
++		 */
++		ISP_WRITE(isp, BIU2100_CSR, 0x30);
++		for (i = 0; i < 64; i++) {
++			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++		}
++	} else {
++		isp_prt(isp, ISP_LOGERR, "RISC Would Not Pause");
++		return;
++	}
++	isp_prt(isp, ISP_LOGALL,
++	   "isp_fw_dump: RISC registers dumped successfully");
++	ISP_WRITE(isp, BIU2100_CSR, BIU2100_SOFT_RESET);
++	for (i = 0; i < 100; i++) {
++		USEC_DELAY(100);
++		if (ISP_READ(isp, OUTMAILBOX0) == 0) {
++			break;
++		}
++	}
++	if (ISP_READ(isp, OUTMAILBOX0) != 0) {
++		isp_prt(isp, ISP_LOGERR, "Board Would Not Reset");
++		return;
++	}
++	ENABLE_INTS(isp);
++	mbs.param[0] = MBOX_READ_RAM_WORD;
++	mbs.param[1] = 0x800;
++	isp->isp_mbxworkp = (void *) ptr;
++	isp->isp_mbxwrk0 = 0xf7ff;	/* continuation count */
++	isp->isp_mbxwrk1 = 0x801;	/* next SRAM address */
++	isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs);
++	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++		isp_prt(isp, ISP_LOGWARN,
++		    "RAM DUMP FAILED @ WORD %x", isp->isp_mbxwrk1);
++		return;
++	}
++	ptr = isp->isp_mbxworkp;	/* finish fetch of final word */
++	*ptr++ = isp->isp_mboxtmp[2];
++
++	/*
++	 * We don't have access to mailbox registers 8.. onward
++	 * in our 'common' device model- so we have to set it
++	 * here and hope it stays the same!
++	 */
++	ISP_WRITE(isp, PCI_MBOX_REGS2300_OFF + (8 << 1), 0x1);
++
++	mbs.param[0] = MBOX_READ_RAM_WORD_EXTENDED;
++	mbs.param[1] = 0;
++	isp->isp_mbxworkp = (void *) ptr;
++	isp->isp_mbxwrk0 = 0xffff;	/* continuation count */
++	isp->isp_mbxwrk1 = 0x1;		/* next SRAM address */
++	isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs);
++	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++		isp_prt(isp, ISP_LOGWARN,
++		    "RAM DUMP FAILED @ WORD %x", 0x10000 + isp->isp_mbxwrk1);
++		return;
++	}
++	ptr = isp->isp_mbxworkp;	/* finish final word */
++	*ptr++ = mbs.param[2];
++	isp_prt(isp, ISP_LOGALL, "isp_fw_dump: SRAM dumped successfully");
++	FCPARAM(isp)->isp_dump_data[0] = isp->isp_type; /* now used */
++	(void) isp_async(isp, ISPASYNC_FW_DUMPED, 0);
++}
++
++void
++isp_fw_dump(struct ispsoftc *isp)
++{
++	if (IS_2200(isp))
++		isp2200_fw_dump(isp);
++	else if (IS_23XX(isp))
++		isp2300_fw_dump(isp);
++}
++#endif
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp_cb_ops.c	2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,646 @@
++/* %W% */
++/*
++ * Qlogic ISP Host Adapter procfs and open/close entry points
++ *---------------------------------------
++ *
++ * Copyright (c) 2003 by Matthew Jacob
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification, immediately at the beginning of the file.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * the GNU Public License ("GPL").
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ * 
++ * Matthew Jacob
++ * Feral Software
++ * PMB #825
++ * 5214-F Diamond Hts Blvd
++ * San Francisco, CA, 94131
++ * mjacob@feral.com
++ *
++ *----
++ * proc safe pretty print code courtesy of Gerard Roudier (groudier@free.fr)
++ *
++ */
++
++#include "isp_linux.h"
++#include "isp_ioctl.h"
++#include <asm/uaccess.h>
++#ifdef	CONFIG_PROC_FS
++
++/*
++ * 'safe' proc pretty print code 
++ */
++struct info_str {
++    char *buffer;
++    int length;
++    off_t offset;
++    int pos;
++};
++
++static void
++copy_mem_info(struct info_str *info, char *data, int len)
++{
++	if (info->pos + len > info->offset + info->length)
++		len = info->offset + info->length - info->pos;
++
++	if (info->pos + len < info->offset) {
++		info->pos += len;
++		return;
++	}
++
++	if (info->pos < info->offset) {
++		off_t partial;
++
++		partial = info->offset - info->pos;
++		data += partial;
++		info->pos += partial;
++		len  -= partial;
++	}
++
++	if (len > 0) {
++		memcpy(info->buffer, data, len);
++		info->pos += len;
++		info->buffer += len;
++	}
++}
++
++static int
++copy_info(struct info_str *info, char *fmt, ...)
++{
++	va_list args;
++	char buf[256];
++	int len;
++
++	va_start(args, fmt);
++	len = vsprintf(buf, fmt, args);
++	va_end(args);
++
++	copy_mem_info(info, buf, len);
++	return (len);
++}
++
++
++int
++isplinux_proc_info(char *buf, char **st, off_t off, int len, int host, int io)
++{
++    int i;
++    struct info_str info;
++    struct ispsoftc *isp;
++
++    isp = isplist;
++    while (isp) {
++	if (isp->isp_host->host_no == host) {
++	    break;
++	}
++	isp = isp->isp_next;
++    }
++    if (isp == NULL) {
++	return (-ENODEV);
++    }
++
++    if (io) {
++	buf[len] = 0;
++	io = -ENOSYS;
++	if (strncmp(buf, "debug=", 6) == 0) {
++	    unsigned long debug;
++	    char *p = &buf[6], *q;
++	    debug = simple_strtoul(p, &q, 16);
++	    if (q == &buf[6]) {
++		isp_prt(isp, ISP_LOGERR, "Garbled Debug Line '%s'", buf);
++		return (-EINVAL);
++	    }
++	    isp_prt(isp, ISP_LOGINFO, "setting debug level to 0x%lx", debug);
++	    ISP_LOCKU_SOFTC(isp);
++	    isp->isp_dblev = debug;
++	    ISP_UNLKU_SOFTC(isp);
++	    io = len;
++	} else if (strncmp(buf, "rescan", 6) == 0) {
++	    if (IS_FC(isp)) {
++		SEND_THREAD_EVENT(isp, ISP_THREAD_FC_RESCAN, 1);
++		io = len;
++	    }
++	} else if (strncmp(buf, "lip", 3) == 0) {
++	    if (IS_FC(isp)) {
++		ISP_LOCKU_SOFTC(isp);
++		(void) isp_control(isp, ISPCTL_SEND_LIP, 0);
++		ISP_UNLKU_SOFTC(isp);
++		io = len;
++	    }
++	} else if (strncmp(buf, "busreset=", 9) == 0) {
++	    char *p = &buf[6], *q;
++	    int bus = (int) simple_strtoul(p, &q, 16);
++	    if (q == &buf[6]) {
++		isp_prt(isp, ISP_LOGERR, "Garbled Bus Reset Line '%s'", buf);
++		return (-EINVAL);
++	    }
++	    ISP_LOCKU_SOFTC(isp);
++	    (void) isp_control(isp, ISPCTL_RESET_BUS, &bus);
++	    ISP_UNLKU_SOFTC(isp);
++	    io = len;
++	} else if (strncmp(buf, "devreset=", 9) == 0) {
++	    char *p = &buf[6], *q;
++	    int dev = (int) simple_strtoul(p, &q, 16);
++	    if (q == &buf[6]) {
++		isp_prt(isp, ISP_LOGERR, "Garbled Dev Reset Line '%s'", buf);
++		return (-EINVAL);
++	    }
++	    /* always bus 0 */
++	    ISP_LOCKU_SOFTC(isp);
++	    (void) isp_control(isp, ISPCTL_RESET_DEV, &dev);
++	    ISP_UNLKU_SOFTC(isp);
++	    io = len;
++	} else if (strncmp(buf, "reset", 5) == 0) {
++	    ISP_LOCKU_SOFTC(isp);
++	    io = isp_drain_reset(isp, "proc_reset");
++	    ISP_UNLKU_SOFTC(isp);
++	    if (io == 0)
++		io = len;
++	    else
++		io = -EIO;
++	} else if (strncmp(buf, "drain", 5) == 0) {
++	    ISP_LOCKU_SOFTC(isp);
++	    io = isp_drain(isp, "proc_reset");
++	    ISP_UNLKU_SOFTC(isp);
++	    if (io == 0)
++		io = len;
++	    else
++		io = -EIO;
++	}
++#ifdef	ISP_FW_CRASH_DUMP
++	else if (strncmp(buf, "fwcrash", 7) == 0) {
++	    if (IS_FC(isp)) {
++		ISP_LOCKU_SOFTC(isp);
++		SEND_THREAD_EVENT(isp, ISP_THREAD_FW_CRASH_DUMP, 0);
++		ISP_UNLKU_SOFTC(isp);
++		io = len;
++	    }
++	}
++#endif
++	return (io);
++    }
++
++    ISP_LOCKU_SOFTC(isp);
++    if (st)
++	*st = buf;
++    info.buffer	= buf;
++    info.length	= len;
++    info.offset	= off;
++    info.pos	= 0;
++    
++    copy_info(&info, (char *)isplinux_info(isp->isp_host));
++#ifdef	HBA_VERSION
++    copy_info(&info, "\n HBA Version %s, built %s, %s",
++	HBA_VERSION, __DATE__, __TIME__);
++#endif
++    copy_info(&info, "\n DEVID %x role %d\n",
++	isp->isp_osinfo.device_id, isp->isp_role);
++    copy_info(&info,
++        " Interrupt Stats:\n"
++	"  total=0x%08x%08x bogus=0x%08x%08x\n"
++	"  MboxC=0x%08x%08x async=0x%08x%08x\n"
++	"  CRslt=0x%08x%08x CPost=0x%08x%08x\n"
++	"  RspnsCHiWater=0x%04x FastPostC_Hiwater=0x%04x\n",
++	(u_int32_t) (isp->isp_intcnt >> 32),
++	(u_int32_t) (isp->isp_intcnt & 0xffffffff),
++	(u_int32_t) (isp->isp_intbogus >> 32),
++	(u_int32_t) (isp->isp_intbogus & 0xffffffff),
++	(u_int32_t) (isp->isp_intmboxc >> 32),
++	(u_int32_t) (isp->isp_intmboxc & 0xffffffff),
++	(u_int32_t) (isp->isp_intoasync >> 32),
++	(u_int32_t) (isp->isp_intoasync & 0xffffffff),
++	(u_int32_t) (isp->isp_rsltccmplt >> 32),
++	(u_int32_t) (isp->isp_rsltccmplt & 0xffffffff),
++	(u_int32_t) (isp->isp_fphccmplt >> 32),
++	(u_int32_t) (isp->isp_fphccmplt & 0xffffffff),
++	isp->isp_rscchiwater, isp->isp_fpcchiwater);
++    copy_info(&info,
++	" Request In %d Request Out %d Result %d Nactv %d"
++	" HiWater %u QAVAIL %d WtQHi %d\n",
++	isp->isp_reqidx, isp->isp_reqodx, isp->isp_residx, isp->isp_nactive,
++	isp->isp_osinfo.hiwater, ISP_QAVAIL(isp),
++	isp->isp_osinfo.wqhiwater);
++    for (i = 0; i < isp->isp_maxcmds; i++) {
++	if (isp->isp_xflist[i]) {
++	    copy_info(&info, " %d:%p", i, isp->isp_xflist[i]);
++	}
++    }
++    copy_info(&info, "\n");
++    if (isp->isp_osinfo.wqnext) {
++	Scsi_Cmnd *f = isp->isp_osinfo.wqnext;
++	copy_info(&info, "WaitQ(%d)", isp->isp_osinfo.wqcnt);
++	while (f) {
++	    copy_info(&info, "->%p", f);
++	    f = (Scsi_Cmnd *) f->host_scribble;
++	}
++	copy_info(&info, "\n");
++    }
++    if (isp->isp_osinfo.dqnext) {
++	Scsi_Cmnd *f = isp->isp_osinfo.dqnext;
++	copy_info(&info, "DoneQ");
++	while (f) {
++	    copy_info(&info, "->%p", f);
++	    f = (Scsi_Cmnd *) f->host_scribble;
++	}
++        copy_info(&info, "\n");
++    }
++    if (IS_FC(isp)) {
++	fcparam *fcp = isp->isp_param;
++	copy_info(&info,
++	    "Loop ID: %d AL_PA 0x%x Port ID 0x%x FW State %x Loop State %x\n",
++	    fcp->isp_loopid, fcp->isp_alpa, fcp->isp_portid, fcp->isp_fwstate,
++	    fcp->isp_loopstate);
++	copy_info(&info, "Port WWN 0x%08x%08x Node WWN 0x%08x%08x\n",
++	    (unsigned int) (ISP_PORTWWN(isp) >> 32),
++	    (unsigned int) (ISP_PORTWWN(isp) & 0xffffffff),
++	    (unsigned int) (ISP_NODEWWN(isp) >> 32),
++	    (unsigned int) (ISP_NODEWWN(isp) & 0xffffffff));
++	for (i = 0; i < MAX_FC_TARG; i++) {
++	    if (fcp->portdb[i].valid == 0 && i < FL_PORT_ID)
++		continue;
++	    if (fcp->portdb[i].port_wwn == 0)
++		continue;
++	    copy_info(&info, "TGT % 3d Loop ID % 3d Port id 0x%04x, role %s"
++		"\n Port WWN 0x%08x%08x Node WWN 0x%08x%08x\n\n", i,
++		fcp->portdb[i].loopid,
++		fcp->portdb[i].portid, class3_roles[fcp->portdb[i].roles],
++		(unsigned int) (fcp->portdb[i].port_wwn >> 32),
++		(unsigned int) (fcp->portdb[i].port_wwn & 0xffffffff),
++		(unsigned int) (fcp->portdb[i].node_wwn >> 32),
++		(unsigned int) (fcp->portdb[i].node_wwn & 0xffffffff));
++	}
++    } else {
++	sdparam *sdp = (sdparam *)isp->isp_param;
++
++	copy_info(&info, "Initiator ID: %d\n", sdp->isp_initiator_id);
++	copy_info(&info, "Target Flag  Period Offset\n");
++	for (i = 0; i < MAX_TARGETS; i++) {
++	    copy_info(&info, "%6d: 0x%04x 0x%04x 0x%x\n",
++		i, sdp->isp_devparam[i].actv_flags,
++		sdp->isp_devparam[i].actv_offset,
++		sdp->isp_devparam[i].actv_period);
++	}
++	if (IS_DUALBUS(isp)) {
++	    sdp++;
++  	    copy_info(&info, "\nInitiator ID: %d, Channel B\n",
++		sdp->isp_initiator_id);
++	    copy_info(&info,
++		"Target     CurFlag    DevFlag  Period Offset B-Channel\n");
++	    for (i = 0; i < MAX_TARGETS; i++) {
++		    copy_info(&info, "%6d: 0x%04x 0x%04x 0x%x\n",
++			i, sdp->isp_devparam[i].actv_flags,
++			sdp->isp_devparam[i].actv_offset,
++			sdp->isp_devparam[i].actv_period);
++	    }
++	}
++    }
++    ISP_UNLKU_SOFTC(isp);
++    return (info.pos > info.offset ? info.pos - info.offset : 0);
++}
++
++#if	LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++static int isp_open(struct inode *, struct file *);
++static int isp_close(struct inode *, struct file *);
++static int
++isp_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
++
++struct file_operations isp_procfs_operations = {
++ owner:		THIS_MODULE,
++ open:		isp_open,
++ release:	isp_close,
++ ioctl:		isp_ioctl,
++};
++
++static struct proc_dir_entry *isp_root = 0;
++
++void
++isplinux_init_proc(struct ispsoftc *isp)
++{
++    struct proc_dir_entry *isp_entry;
++    char tbuf[64];
++
++    SNPRINTF(tbuf, sizeof(tbuf), "isp%d@0x%x", isp->isp_unit,
++	isp->isp_osinfo.device_id);
++    if (isp_root == NULL) {
++	isp_root = proc_mkdir("isp", 0);
++    }
++    if (isp_root) {
++	isp_entry = create_proc_entry(tbuf, S_IFREG|S_IRUGO|S_IWUSR, isp_root);
++	if (isp_entry == NULL) {
++	    return;
++	}
++	isp_entry->proc_fops = &isp_procfs_operations;
++    }
++}
++
++void
++isplinux_undo_proc(struct ispsoftc *isp)
++{
++    char tbuf[64];
++    SNPRINTF(tbuf, sizeof(tbuf), "isp/isp%d@0x%x", isp->isp_unit,
++	isp->isp_osinfo.device_id);
++    remove_proc_entry(tbuf, 0);
++    remove_proc_entry("isp", 0);
++}
++
++static struct ispsoftc *
++get_isp_from_procname(const unsigned char *name)
++{
++    struct ispsoftc *isp;
++
++    for (isp = isplist; isp; isp = isp->isp_next) {
++	char tbuf[32];
++	SNPRINTF(tbuf, sizeof(tbuf), "isp%d@0x%x", isp->isp_unit,
++	   isp->isp_osinfo.device_id);
++	if (strcmp(name, tbuf) == 0) {
++	    return (isp);
++	}
++    }
++    return (0);
++}
++
++static int
++isp_open(struct inode *ip, struct file *fp)
++{
++    struct ispsoftc *isp = get_isp_from_procname(fp->f_dentry->d_name.name);
++    if (isp == NULL) {
++	return (-ENXIO);
++    }
++    if (isp->isp_isopen) {
++	return (-EBUSY);
++    }
++    isp->isp_isopen = 1;
++    fp->private_data = isp;
++    return (0);
++}
++
++static int
++isp_close(struct inode *ip, struct file *fp)
++{
++    struct ispsoftc *isp = fp->private_data;
++    isp->isp_isopen = 0;
++    return (0);
++}
++
++static int
++isp_ioctl(struct inode *ip, struct file *fp, unsigned int c, unsigned long arg)
++{
++    struct ispsoftc *isp = fp->private_data;
++    int rv, inarg, outarg;
++    fcparam *fcp;
++
++    if (isp == (struct ispsoftc *)NULL) {
++    	return -ENXIO;
++    }
++
++    if (IS_SCSI(isp)) {
++    	switch (c) {
++    	case ISP_SDBLEV:
++    	case ISP_RESCAN:
++    	case ISP_GETROLE:
++    	case ISP_SETROLE:
++    	case ISP_RESETHBA:
++    		break;
++    	default:
++		return (-EINVAL);
++    	}
++    	fcp = NULL;
++    } else {
++    	fcp = isp->isp_param;
++    }
++
++    rv = 0;
++    isp_prt(isp, ISP_LOGDEBUG0, "isp_ioctl: cmd=%x", c);
++
++    switch (c) {
++    case ISP_GET_STATS:
++    {
++    	isp_stats_t stats;
++
++    	MEMZERO(&stats, sizeof stats);
++    	stats.isp_stat_version = ISP_STATS_VERSION;
++    	stats.isp_type = isp->isp_type;
++    	stats.isp_revision = isp->isp_revision;
++    	ISP_LOCK_SOFTC(isp);
++    	stats.isp_stats[ISP_INTCNT] = isp->isp_intcnt;
++    	stats.isp_stats[ISP_INTBOGUS] = isp->isp_intbogus;
++    	stats.isp_stats[ISP_INTMBOXC] = isp->isp_intmboxc;
++    	stats.isp_stats[ISP_INGOASYNC] = isp->isp_intoasync;
++    	stats.isp_stats[ISP_RSLTCCMPLT] = isp->isp_rsltccmplt;
++    	stats.isp_stats[ISP_FPHCCMCPLT] = isp->isp_fphccmplt;
++    	stats.isp_stats[ISP_RSCCHIWAT] = isp->isp_rscchiwater;
++    	stats.isp_stats[ISP_FPCCHIWAT] = isp->isp_fpcchiwater;
++    	ISP_UNLK_SOFTC(isp);
++    	if (COPYOUT(&stats, (void *)arg, sizeof (stats), 0)) {
++    		rv = EFAULT;
++    	}
++    	break;
++    }
++    case ISP_CLR_STATS:
++    	ISP_LOCK_SOFTC(isp);
++    	isp->isp_intcnt = 0;
++    	isp->isp_intbogus = 0;
++    	isp->isp_intmboxc = 0;
++    	isp->isp_intoasync = 0;
++    	isp->isp_rsltccmplt = 0;
++    	isp->isp_fphccmplt = 0;
++    	isp->isp_rscchiwater = 0;
++    	isp->isp_fpcchiwater = 0;
++    	ISP_UNLK_SOFTC(isp);
++    	break;
++#ifdef	ISP_FW_CRASH_DUMP
++    case ISP_GET_FW_CRASH_DUMP:
++    {
++    	u_int16_t *ptr = fcp->isp_dump_data;
++    	size_t sz;
++    	if (IS_2200(isp))
++    		sz = QLA2200_RISC_IMAGE_DUMP_SIZE;
++    	else
++    		sz = QLA2300_RISC_IMAGE_DUMP_SIZE;
++    	ISP_LOCK_SOFTC(isp);
++    	if (ptr && *ptr) {
++    		if (COPYOUT(ptr, (void *)arg, sz, mode)) {
++    			rv = EFAULT;
++    		} else {
++    			*ptr = 0;
++    		}
++    	} else {
++    		rv = ENXIO;
++    	}
++    	ISP_UNLK_SOFTC(isp);
++    	break;
++    }
++
++    case ISP_FORCE_CRASH_DUMP:
++    	ISP_LOCK_SOFTC(isp);
++    	isp_async(isp, ISPASYNC_FW_CRASH, NULL);
++    	ISP_UNLK_SOFTC(isp);
++    	break;
++#endif
++    case ISP_SDBLEV:
++    	if (COPYIN((void *)arg, &inarg, sizeof (inarg), 0)) {
++    		rv = EFAULT;
++    		break;
++    	}
++    	outarg = isp->isp_dblev;
++    	isp->isp_dblev = inarg;
++    	if (COPYOUT(&outarg, (void *)arg, sizeof (outarg), 0)) {
++    		rv = EFAULT;
++    		break;
++    	}
++    	break;
++
++    case ISP_RESCAN:
++    	if (IS_FC(isp)) {
++	    ISP_LOCKU_SOFTC(isp);
++	    SEND_THREAD_EVENT(isp, ISP_THREAD_FC_RESCAN, 0)
++	    ISP_UNLKU_SOFTC(isp);
++    	}
++    	break;
++
++    case ISP_GETROLE:
++    	outarg = isp->isp_role;
++    	if (COPYOUT(&outarg, (void *)arg, sizeof (outarg), 0)) {
++    		rv = EFAULT;
++    		break;
++    	}
++    	break;
++
++    case ISP_SETROLE:
++    	if (COPYIN((void *)arg, &inarg, sizeof (inarg), 0)) {
++    		rv = EFAULT;
++    		break;
++    	}
++    	if (inarg & ~(ISP_ROLE_INITIATOR|ISP_ROLE_TARGET)) {
++    		rv = EINVAL;
++    		break;
++    	}
++    	/*
++    	 * Check to see if we're already in that role.
++    	 */
++    	if (isp->isp_role == inarg) {
++    		outarg = isp->isp_role;
++    		if (COPYOUT(&outarg, (void *)arg, sizeof (outarg), mode)) {
++    			rv = EFAULT;
++    		}
++    		break;
++    	}
++    	/*FALLTHROUGH*/
++    case ISP_RESETHBA:
++    {
++    	ISP_LOCK_SOFTC(isp);
++    	if (c == ISP_SETROLE) {
++    		outarg = isp->isp_role;
++    		isp->isp_role = inarg;
++    	}
++    	if (isp_drain_reset(isp, "isp_ioctl")) {
++    		ISP_UNLK_SOFTC(isp);
++    		rv = EIO;
++    		break;
++    	}
++    	isp_async(isp, ISPASYNC_FW_RESTARTED, NULL);
++    	ISP_UNLK_SOFTC(isp);
++    	if (c == ISP_SETROLE &&
++    	    COPYOUT(&outarg, (void *)arg, sizeof (outarg), mode)) {
++    		rv = EFAULT;
++    		break;
++    	}
++    	break;
++    }
++    case ISP_FC_LIP:
++    	ISP_LOCK_SOFTC(isp);
++    	if (isp_control(isp, ISPCTL_SEND_LIP, NULL)) {
++    		rv = EIO;
++    	}
++    	ISP_UNLK_SOFTC(isp);
++    	break;
++    case ISP_FC_GETDINFO:
++    {
++    	struct isp_fc_device local, *ifc = &local;
++    	struct lportdb *lp;
++
++    	if (COPYIN((void *)arg, ifc, sizeof (*ifc), mode)) {
++    		rv = EFAULT;
++    		break;
++    	}
++    	if (ifc->loopid < 0 || ifc->loopid >= MAX_FC_TARG) {
++    		rv = EINVAL;
++    		break;
++    	}
++    	ISP_LOCK_SOFTC(isp);
++    	lp = &FCPARAM(isp)->portdb[ifc->loopid];
++    	if (lp->valid) {
++    		ifc->loopid = lp->loopid;
++    		ifc->portid = lp->portid;
++    		ifc->node_wwn = lp->node_wwn;
++    		ifc->port_wwn = lp->port_wwn;
++    		rv = 0;
++    	} else {
++    		rv = ENODEV;
++    	}
++    	ISP_UNLK_SOFTC(isp);
++    	if (rv == 0) {
++    		if (COPYOUT((void *)ifc, (void *)arg,
++    		    sizeof (*ifc), mode)) {
++    			rv = EFAULT;
++    		}
++    	}
++    	break;
++    }
++    case ISP_FC_GETHINFO:
++    {
++	struct isp_hba_device local, *hba = &local;
++	MEMZERO(hba, sizeof (*hba));
++	ISP_LOCK_SOFTC(isp);
++	hba->fc_speed = FCPARAM(isp)->isp_gbspeed;
++	hba->fc_scsi_supported = 1;
++	hba->fc_topology = FCPARAM(isp)->isp_topo + 1;
++	hba->fc_loopid = FCPARAM(isp)->isp_loopid;
++	hba->active_node_wwn = FCPARAM(isp)->isp_nodewwn;
++	hba->active_port_wwn = FCPARAM(isp)->isp_portwwn;
++	ISP_UNLK_SOFTC(isp);
++	if (COPYOUT(hba, (void *)arg, sizeof (*hba), mode)) {
++	    rv = EFAULT;
++	    break;
++	}
++	break;
++    }
++    default:
++    	rv = EINVAL;
++    	break;
++    }
++    return(rv? -rv : 0);
++}
++#endif	/* LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) */
++#endif
++/*
++ * mode: c
++ * 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
++ * End:
++ */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp_inline.h	2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,1495 @@
++/* @(#)isp_inline.h 1.20 */
++/*
++ * Qlogic Host Adapter Inline Functions
++ *
++ * Copyright (c) 1999, 2000, 2001 by Matthew Jacob
++ * Feral Software
++ * All rights reserved.
++ * mjacob@feral.com
++ *
++ * 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 immediately at the beginning of the file, without modification,
++ *    this list of conditions, and the following disclaimer.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ *
++ */
++#ifndef	_ISP_INLINE_H
++#define	_ISP_INLINE_H
++
++/*
++ * Handle Functions.
++ * For each outstanding command there will be a non-zero handle.
++ * There will be at most isp_maxcmds handles, and isp_lasthdls
++ * will be a seed for the last handled allocated.
++ */
++
++static INLINE int isp_save_xs(struct ispsoftc *, XS_T *, u_int16_t *);
++static INLINE XS_T *isp_find_xs(struct ispsoftc *, u_int16_t);
++static INLINE u_int16_t isp_find_handle(struct ispsoftc *, XS_T *);
++static INLINE int isp_handle_index(u_int16_t);
++static INLINE void isp_destroy_handle(struct ispsoftc *, u_int16_t);
++static INLINE void isp_remove_handle(struct ispsoftc *, XS_T *);
++
++static INLINE int
++isp_save_xs(struct ispsoftc *isp, XS_T *xs, u_int16_t *handlep)
++{
++	int i, j;
++
++	for (j = isp->isp_lasthdls, i = 0; i < (int) isp->isp_maxcmds; i++) {
++		if (isp->isp_xflist[j] == NULL) {
++			break;
++		}
++		if (++j == isp->isp_maxcmds) {
++			j = 0;
++		}
++	}
++	if (i == isp->isp_maxcmds) {
++		return (-1);
++	}
++	isp->isp_xflist[j] = xs;
++	*handlep = j+1;
++	if (++j == isp->isp_maxcmds)
++		j = 0;
++	isp->isp_lasthdls = (u_int16_t)j;
++	return (0);
++}
++
++static INLINE XS_T *
++isp_find_xs(struct ispsoftc *isp, u_int16_t handle)
++{
++	if (handle < 1 || handle > (u_int16_t) isp->isp_maxcmds) {
++		return (NULL);
++	} else {
++		return (isp->isp_xflist[handle - 1]);
++	}
++}
++
++static INLINE u_int16_t
++isp_find_handle(struct ispsoftc *isp, XS_T *xs)
++{
++	int i;
++	if (xs != NULL) {
++		for (i = 0; i < isp->isp_maxcmds; i++) {
++			if (isp->isp_xflist[i] == xs) {
++				return ((u_int16_t) i+1);
++			}
++		}
++	}
++	return (0);
++}
++
++static INLINE int
++isp_handle_index(u_int16_t handle)
++{
++	return (handle-1);
++}
++
++static INLINE void
++isp_destroy_handle(struct ispsoftc *isp, u_int16_t handle)
++{
++	if (handle > 0 && handle <= (u_int16_t) isp->isp_maxcmds) {
++		isp->isp_xflist[isp_handle_index(handle)] = NULL;
++	}
++}
++
++static INLINE void
++isp_remove_handle(struct ispsoftc *isp, XS_T *xs)
++{
++	isp_destroy_handle(isp, isp_find_handle(isp, xs));
++}
++
++static INLINE int
++isp_getrqentry(struct ispsoftc *, u_int16_t *, u_int16_t *, void **);
++
++static INLINE int
++isp_getrqentry(struct ispsoftc *isp, u_int16_t *iptrp,
++    u_int16_t *optrp, void **resultp)
++{
++	volatile u_int16_t iptr, optr;
++
++	optr = isp->isp_reqodx = READ_REQUEST_QUEUE_OUT_POINTER(isp);
++	iptr = isp->isp_reqidx;
++	*resultp = ISP_QUEUE_ENTRY(isp->isp_rquest, iptr);
++	iptr = ISP_NXT_QENTRY(iptr, RQUEST_QUEUE_LEN(isp));
++	if (iptr == optr) {
++		return (1);
++	}
++	if (optrp)
++		*optrp = optr;
++	if (iptrp)
++		*iptrp = iptr;
++	return (0);
++}
++
++static INLINE void isp_print_qentry (struct ispsoftc *, char *, int, void *);
++
++
++#define	TBA	(4 * (((QENTRY_LEN >> 2) * 3) + 1) + 1)
++static INLINE void
++isp_print_qentry(struct ispsoftc *isp, char *msg, int idx, void *arg)
++{
++	char buf[TBA];
++	int amt, i, j;
++	u_int8_t *ptr = arg;
++
++	isp_prt(isp, ISP_LOGALL, "%s index %d=>", msg, idx);
++	for (buf[0] = 0, amt = i = 0; i < 4; i++) {
++		buf[0] = 0;
++		SNPRINTF(buf, TBA, "  ");
++		for (j = 0; j < (QENTRY_LEN >> 2); j++) {
++			SNPRINTF(buf, TBA, "%s %02x", buf, ptr[amt++] & 0xff);
++		}
++		isp_prt(isp, ISP_LOGALL, buf);
++	}
++}
++
++static INLINE void isp_print_bytes(struct ispsoftc *, char *, int, void *);
++
++static INLINE void
++isp_print_bytes(struct ispsoftc *isp, char *msg, int amt, void *arg)
++{
++	char buf[128];
++	u_int8_t *ptr = arg;
++	int off;
++
++	if (msg)
++		isp_prt(isp, ISP_LOGALL, "%s:", msg);
++	off = 0;
++	buf[0] = 0;
++	while (off < amt) {
++		int j, to;
++		to = off;
++		for (j = 0; j < 16; j++) {
++			SNPRINTF(buf, 128, "%s %02x", buf, ptr[off++] & 0xff);
++			if (off == amt)
++				break;
++		}
++		isp_prt(isp, ISP_LOGALL, "0x%08x:%s", to, buf);
++		buf[0] = 0;
++	}
++}
++
++/*
++ * Do the common path to try and ensure that link is up, we've scanned
++ * the fabric (if we're on a fabric), and that we've synchronized this
++ * all with our own database and done the appropriate logins.
++ *
++ * We repeatedly check for firmware state and loop state after each
++ * action because things may have changed while we were doing this.
++ * Any failure or change of state causes us to return a nonzero value.
++ *
++ * We honor HBA roles in that if we're not in Initiator mode, we don't
++ * attempt to sync up the database (that's for somebody else to do,
++ * if ever).
++ *
++ * We assume we enter here with any locks held.
++ */
++
++static INLINE int isp_fc_runstate(struct ispsoftc *, int);
++
++static INLINE int
++isp_fc_runstate(struct ispsoftc *isp, int tval)
++{
++	fcparam *fcp;
++	int *tptr;
++
++	if (IS_SCSI(isp))
++		return (0);
++
++	tptr = tval? &tval : NULL;
++	if (isp_control(isp, ISPCTL_FCLINK_TEST, tptr) != 0) {
++		return (-1);
++	}
++	fcp = FCPARAM(isp);
++	if (fcp->isp_fwstate != FW_READY || fcp->isp_loopstate < LOOP_PDB_RCVD)
++		return (-1);
++	if (isp_control(isp, ISPCTL_SCAN_FABRIC, NULL) != 0) {
++		return (-1);
++	}
++	if (isp_control(isp, ISPCTL_SCAN_LOOP, NULL) != 0) {
++		return (-1);
++	}
++	if ((isp->isp_role & ISP_ROLE_INITIATOR) == 0) {
++		return (0);
++	}
++	if (isp_control(isp, ISPCTL_PDB_SYNC, NULL) != 0) {
++		return (-1);
++	}
++	if (fcp->isp_fwstate != FW_READY || fcp->isp_loopstate != LOOP_READY) {
++		return (-1);
++	}
++	return (0);
++}
++
++/*
++ * Functions to move stuff to a form that the QLogic RISC engine understands
++ * and functions to move stuff back to a form the processor understands.
++ *
++ * Each platform is required to provide the 8, 16 and 32 bit
++ * swizzle and unswizzle macros (ISP_IOX{PUT|GET}_{8,16,32})
++ *
++ * The assumption is that swizzling and unswizzling is mostly done 'in place'
++ * (with a few exceptions for efficiency).
++ */
++
++static INLINE void isp_copy_out_hdr(struct ispsoftc *, isphdr_t *, isphdr_t *);
++static INLINE void isp_copy_in_hdr(struct ispsoftc *, isphdr_t *, isphdr_t *);
++static INLINE int isp_get_response_type(struct ispsoftc *, isphdr_t *);
++
++static INLINE void
++isp_put_request(struct ispsoftc *, ispreq_t *, ispreq_t *);
++static INLINE void
++isp_put_request_t2(struct ispsoftc *, ispreqt2_t *, ispreqt2_t *);
++static INLINE void
++isp_put_request_t3(struct ispsoftc *, ispreqt3_t *, ispreqt3_t *);
++static INLINE void
++isp_put_extended_request(struct ispsoftc *, ispextreq_t *, ispextreq_t *);
++static INLINE void
++isp_put_cont_req(struct ispsoftc *, ispcontreq_t *, ispcontreq_t *);
++static INLINE void
++isp_put_cont64_req(struct ispsoftc *, ispcontreq64_t *, ispcontreq64_t *);
++static INLINE void
++isp_get_response(struct ispsoftc *, ispstatusreq_t *, ispstatusreq_t *);
++static INLINE void
++isp_get_response_x(struct ispsoftc *, ispstatus_cont_t *, ispstatus_cont_t *);
++static INLINE void
++isp_get_rio2(struct ispsoftc *, isp_rio2_t *, isp_rio2_t *);
++static INLINE void
++isp_put_icb(struct ispsoftc *, isp_icb_t *, isp_icb_t *);
++static INLINE void
++isp_get_pdb(struct ispsoftc *, isp_pdb_t *, isp_pdb_t *);
++static INLINE void
++isp_get_ct_hdr(struct ispsoftc *isp, ct_hdr_t *, ct_hdr_t *);
++static INLINE void
++isp_put_sns_request(struct ispsoftc *, sns_screq_t *, sns_screq_t *);
++static INLINE void
++isp_put_gid_ft_request(struct ispsoftc *, sns_gid_ft_req_t *,
++    sns_gid_ft_req_t *);
++static INLINE void
++isp_put_gxn_id_request(struct ispsoftc *, sns_gxn_id_req_t *,
++    sns_gxn_id_req_t *);
++static INLINE void
++isp_get_sns_response(struct ispsoftc *, sns_scrsp_t *, sns_scrsp_t *, int);
++static INLINE void
++isp_get_gid_ft_response(struct ispsoftc *, sns_gid_ft_rsp_t *,
++    sns_gid_ft_rsp_t *, int);
++static INLINE void
++isp_get_gxn_id_response(struct ispsoftc *, sns_gxn_id_rsp_t *,
++    sns_gxn_id_rsp_t *);
++static INLINE void
++isp_get_gff_id_response(struct ispsoftc *, sns_gff_id_rsp_t *,
++    sns_gff_id_rsp_t *);
++static INLINE void
++isp_get_ga_nxt_response(struct ispsoftc *, sns_ga_nxt_rsp_t *,
++    sns_ga_nxt_rsp_t *);
++#ifdef	ISP_TARGET_MODE
++#ifndef	_ISP_TARGET_H
++#include "isp_target.h"
++#endif
++static INLINE void
++isp_put_atio(struct ispsoftc *, at_entry_t *, at_entry_t *);
++static INLINE void
++isp_get_atio(struct ispsoftc *, at_entry_t *, at_entry_t *);
++static INLINE void
++isp_put_atio2(struct ispsoftc *, at2_entry_t *, at2_entry_t *);
++static INLINE void
++isp_get_atio2(struct ispsoftc *, at2_entry_t *, at2_entry_t *);
++static INLINE void
++isp_put_ctio(struct ispsoftc *, ct_entry_t *, ct_entry_t *);
++static INLINE void
++isp_get_ctio(struct ispsoftc *, ct_entry_t *, ct_entry_t *);
++static INLINE void
++isp_put_ctio2(struct ispsoftc *, ct2_entry_t *, ct2_entry_t *);
++static INLINE void
++isp_get_ctio2(struct ispsoftc *, ct2_entry_t *, ct2_entry_t *);
++static INLINE void
++isp_put_enable_lun(struct ispsoftc *, lun_entry_t *, lun_entry_t *);
++static INLINE void
++isp_get_enable_lun(struct ispsoftc *, lun_entry_t *, lun_entry_t *);
++static INLINE void
++isp_put_notify(struct ispsoftc *, in_entry_t *, in_entry_t *);
++static INLINE void
++isp_get_notify(struct ispsoftc *, in_entry_t *, in_entry_t *);
++static INLINE void
++isp_put_notify_fc(struct ispsoftc *, in_fcentry_t *, in_fcentry_t *);
++static INLINE void
++isp_get_notify_fc(struct ispsoftc *, in_fcentry_t *, in_fcentry_t *);
++static INLINE void
++isp_put_notify_ack(struct ispsoftc *, na_entry_t *, na_entry_t *);
++static INLINE void
++isp_get_notify_ack(struct ispsoftc *, na_entry_t *, na_entry_t *);
++static INLINE void
++isp_put_notify_ack_fc(struct ispsoftc *, na_fcentry_t *, na_fcentry_t *);
++static INLINE void
++isp_get_notify_ack_fc(struct ispsoftc *, na_fcentry_t *, na_fcentry_t *);
++#endif
++
++#define	ISP_IS_SBUS(isp)	\
++	(ISP_SBUS_SUPPORTED && (isp)->isp_bustype == ISP_BT_SBUS)
++
++/*
++ * Swizzle/Copy Functions
++ */
++static INLINE void
++isp_copy_out_hdr(struct ispsoftc *isp, isphdr_t *hpsrc, isphdr_t *hpdst)
++{
++	if (ISP_IS_SBUS(isp)) {
++		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_type,
++		    &hpdst->rqs_entry_count);
++		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_count,
++		    &hpdst->rqs_entry_type);
++		ISP_IOXPUT_8(isp, hpsrc->rqs_seqno,
++		    &hpdst->rqs_flags);
++		ISP_IOXPUT_8(isp, hpsrc->rqs_flags,
++		    &hpdst->rqs_seqno);
++	} else {
++		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_type,
++		    &hpdst->rqs_entry_type);
++		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_count,
++		    &hpdst->rqs_entry_count);
++		ISP_IOXPUT_8(isp, hpsrc->rqs_seqno,
++		    &hpdst->rqs_seqno);
++		ISP_IOXPUT_8(isp, hpsrc->rqs_flags,
++		    &hpdst->rqs_flags);
++	}
++}
++
++static INLINE void
++isp_copy_in_hdr(struct ispsoftc *isp, isphdr_t *hpsrc, isphdr_t *hpdst)
++{
++	if (ISP_IS_SBUS(isp)) {
++		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_type,
++		    hpdst->rqs_entry_count);
++		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_count,
++		    hpdst->rqs_entry_type);
++		ISP_IOXGET_8(isp, &hpsrc->rqs_seqno,
++		    hpdst->rqs_flags);
++		ISP_IOXGET_8(isp, &hpsrc->rqs_flags,
++		    hpdst->rqs_seqno);
++	} else {
++		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_type,
++		    hpdst->rqs_entry_type);
++		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_count,
++		    hpdst->rqs_entry_count);
++		ISP_IOXGET_8(isp, &hpsrc->rqs_seqno,
++		    hpdst->rqs_seqno);
++		ISP_IOXGET_8(isp, &hpsrc->rqs_flags,
++		    hpdst->rqs_flags);
++	}
++}
++
++static INLINE int
++isp_get_response_type(struct ispsoftc *isp, isphdr_t *hp)
++{
++	u_int8_t type;
++	if (ISP_IS_SBUS(isp)) {
++		ISP_IOXGET_8(isp, &hp->rqs_entry_count, type);
++	} else {
++		ISP_IOXGET_8(isp, &hp->rqs_entry_type, type);
++	}
++	return ((int)type);
++}
++
++static INLINE void
++isp_put_request(struct ispsoftc *isp, ispreq_t *rqsrc, ispreq_t *rqdst)
++{
++	int i;
++	isp_copy_out_hdr(isp, &rqsrc->req_header, &rqdst->req_header);
++	ISP_IOXPUT_32(isp, rqsrc->req_handle, &rqdst->req_handle);
++	if (ISP_IS_SBUS(isp)) {
++		ISP_IOXPUT_8(isp, rqsrc->req_lun_trn, &rqdst->req_target);
++		ISP_IOXPUT_8(isp, rqsrc->req_target, &rqdst->req_lun_trn);
++	} else {
++		ISP_IOXPUT_8(isp, rqsrc->req_lun_trn, &rqdst->req_lun_trn);
++		ISP_IOXPUT_8(isp, rqsrc->req_target, &rqdst->req_target);
++	}
++	ISP_IOXPUT_16(isp, rqsrc->req_cdblen, &rqdst->req_cdblen);
++	ISP_IOXPUT_16(isp, rqsrc->req_flags, &rqdst->req_flags);
++	ISP_IOXPUT_16(isp, rqsrc->req_time, &rqdst->req_time);
++	ISP_IOXPUT_16(isp, rqsrc->req_seg_count, &rqdst->req_seg_count);
++	for (i = 0; i < 12; i++) {
++		ISP_IOXPUT_8(isp, rqsrc->req_cdb[i], &rqdst->req_cdb[i]);
++	}
++	for (i = 0; i < ISP_RQDSEG; i++) {
++		ISP_IOXPUT_32(isp, rqsrc->req_dataseg[i].ds_base,
++		    &rqdst->req_dataseg[i].ds_base);
++		ISP_IOXPUT_32(isp, rqsrc->req_dataseg[i].ds_count,
++		    &rqdst->req_dataseg[i].ds_count);
++	}
++}
++
++static INLINE void
++isp_put_request_t2(struct ispsoftc *isp, ispreqt2_t *tqsrc, ispreqt2_t *tqdst)
++{
++	int i;
++	isp_copy_out_hdr(isp, &tqsrc->req_header, &tqdst->req_header);
++	ISP_IOXPUT_32(isp, tqsrc->req_handle, &tqdst->req_handle);
++	ISP_IOXPUT_8(isp, tqsrc->req_lun_trn, &tqdst->req_lun_trn);
++	ISP_IOXPUT_8(isp, tqsrc->req_target, &tqdst->req_target);
++	ISP_IOXPUT_16(isp, tqsrc->req_scclun, &tqdst->req_scclun);
++	ISP_IOXPUT_16(isp, tqsrc->req_flags,  &tqdst->req_flags);
++	ISP_IOXPUT_16(isp, tqsrc->_res2, &tqdst->_res2);
++	ISP_IOXPUT_16(isp, tqsrc->req_time, &tqdst->req_time);
++	ISP_IOXPUT_16(isp, tqsrc->req_seg_count, &tqdst->req_seg_count);
++	for (i = 0; i < 16; i++) {
++		ISP_IOXPUT_8(isp, tqsrc->req_cdb[i], &tqdst->req_cdb[i]);
++	}
++	ISP_IOXPUT_32(isp, tqsrc->req_totalcnt, &tqdst->req_totalcnt);
++	for (i = 0; i < ISP_RQDSEG_T2; i++) {
++		ISP_IOXPUT_32(isp, tqsrc->req_dataseg[i].ds_base,
++		    &tqdst->req_dataseg[i].ds_base);
++		ISP_IOXPUT_32(isp, tqsrc->req_dataseg[i].ds_count,
++		    &tqdst->req_dataseg[i].ds_count);
++	}
++}
++
++static INLINE void
++isp_put_request_t3(struct ispsoftc *isp, ispreqt3_t *tqsrc, ispreqt3_t *tqdst)
++{
++	int i;
++	isp_copy_out_hdr(isp, &tqsrc->req_header, &tqdst->req_header);
++	ISP_IOXPUT_32(isp, tqsrc->req_handle, &tqdst->req_handle);
++	ISP_IOXPUT_8(isp, tqsrc->req_lun_trn, &tqdst->req_lun_trn);
++	ISP_IOXPUT_8(isp, tqsrc->req_target, &tqdst->req_target);
++	ISP_IOXPUT_16(isp, tqsrc->req_scclun, &tqdst->req_scclun);
++	ISP_IOXPUT_16(isp, tqsrc->req_flags,  &tqdst->req_flags);
++	ISP_IOXPUT_16(isp, tqsrc->_res2, &tqdst->_res2);
++	ISP_IOXPUT_16(isp, tqsrc->req_time, &tqdst->req_time);
++	ISP_IOXPUT_16(isp, tqsrc->req_seg_count, &tqdst->req_seg_count);
++	for (i = 0; i < 16; i++) {
++		ISP_IOXPUT_8(isp, tqsrc->req_cdb[i], &tqdst->req_cdb[i]);
++	}
++	ISP_IOXPUT_32(isp, tqsrc->req_totalcnt, &tqdst->req_totalcnt);
++	for (i = 0; i < ISP_RQDSEG_T3; i++) {
++		ISP_IOXPUT_32(isp, tqsrc->req_dataseg[i].ds_base,
++		    &tqdst->req_dataseg[i].ds_base);
++		ISP_IOXPUT_32(isp, tqsrc->req_dataseg[i].ds_basehi,
++		    &tqdst->req_dataseg[i].ds_basehi);
++		ISP_IOXPUT_32(isp, tqsrc->req_dataseg[i].ds_count,
++		    &tqdst->req_dataseg[i].ds_count);
++	}
++}
++
++static INLINE void
++isp_put_extended_request(struct ispsoftc *isp, ispextreq_t *xqsrc,
++    ispextreq_t *xqdst)
++{
++	int i;
++	isp_copy_out_hdr(isp, &xqsrc->req_header, &xqdst->req_header);
++	ISP_IOXPUT_32(isp, xqsrc->req_handle, &xqdst->req_handle);
++	if (ISP_IS_SBUS(isp)) {
++		ISP_IOXPUT_8(isp, xqsrc->req_lun_trn, &xqdst->req_target);
++		ISP_IOXPUT_8(isp, xqsrc->req_target, &xqdst->req_lun_trn);
++	} else {
++		ISP_IOXPUT_8(isp, xqsrc->req_lun_trn, &xqdst->req_lun_trn);
++		ISP_IOXPUT_8(isp, xqsrc->req_target, &xqdst->req_target);
++	}
++	ISP_IOXPUT_16(isp, xqsrc->req_cdblen, &xqdst->req_cdblen);
++	ISP_IOXPUT_16(isp, xqsrc->req_flags, &xqdst->req_flags);
++	ISP_IOXPUT_16(isp, xqsrc->req_time, &xqdst->req_time);
++	ISP_IOXPUT_16(isp, xqsrc->req_seg_count, &xqdst->req_seg_count);
++	for (i = 0; i < 44; i++) {
++		ISP_IOXPUT_8(isp, xqsrc->req_cdb[i], &xqdst->req_cdb[i]);
++	}
++}
++
++static INLINE void
++isp_put_cont_req(struct ispsoftc *isp, ispcontreq_t *cqsrc, ispcontreq_t *cqdst)
++{
++	int i;
++	isp_copy_out_hdr(isp, &cqsrc->req_header, &cqdst->req_header);
++	for (i = 0; i < ISP_CDSEG; i++) {
++		ISP_IOXPUT_32(isp, cqsrc->req_dataseg[i].ds_base,
++		    &cqdst->req_dataseg[i].ds_base);
++		ISP_IOXPUT_32(isp, cqsrc->req_dataseg[i].ds_count,
++		    &cqdst->req_dataseg[i].ds_count);
++	}
++}
++
++static INLINE void
++isp_put_cont64_req(struct ispsoftc *isp, ispcontreq64_t *cqsrc,
++    ispcontreq64_t *cqdst)
++{
++	int i;
++	isp_copy_out_hdr(isp, &cqsrc->req_header, &cqdst->req_header);
++	for (i = 0; i < ISP_CDSEG64; i++) {
++		ISP_IOXPUT_32(isp, cqsrc->req_dataseg[i].ds_base,
++		    &cqdst->req_dataseg[i].ds_base);
++		ISP_IOXPUT_32(isp, cqsrc->req_dataseg[i].ds_basehi,
++		    &cqdst->req_dataseg[i].ds_basehi);
++		ISP_IOXPUT_32(isp, cqsrc->req_dataseg[i].ds_count,
++		    &cqdst->req_dataseg[i].ds_count);
++	}
++}
++
++static INLINE void
++isp_get_response(struct ispsoftc *isp, ispstatusreq_t *spsrc,
++    ispstatusreq_t *spdst)
++{
++	int i;
++	isp_copy_in_hdr(isp, &spsrc->req_header, &spdst->req_header);
++	ISP_IOXGET_32(isp, &spsrc->req_handle, spdst->req_handle);
++	ISP_IOXGET_16(isp, &spsrc->req_scsi_status, spdst->req_scsi_status);
++	ISP_IOXGET_16(isp, &spsrc->req_completion_status,
++	    spdst->req_completion_status);
++	ISP_IOXGET_16(isp, &spsrc->req_state_flags, spdst->req_state_flags);
++	ISP_IOXGET_16(isp, &spsrc->req_status_flags, spdst->req_status_flags);
++	ISP_IOXGET_16(isp, &spsrc->req_time, spdst->req_time);
++	ISP_IOXGET_16(isp, &spsrc->req_sense_len, spdst->req_sense_len);
++	ISP_IOXGET_32(isp, &spsrc->req_resid, spdst->req_resid);
++	for (i = 0; i < 8; i++) {
++		ISP_IOXGET_8(isp, &spsrc->req_response[i],
++		    spdst->req_response[i]);
++	}
++	for (i = 0; i < 32; i++) {
++		ISP_IOXGET_8(isp, &spsrc->req_sense_data[i],
++		    spdst->req_sense_data[i]);
++	}
++}
++
++static INLINE void
++isp_get_response_x(struct ispsoftc *isp, ispstatus_cont_t *cpsrc,
++    ispstatus_cont_t *cpdst)
++{
++	int i;
++	isp_copy_in_hdr(isp, &cpsrc->req_header, &cpdst->req_header);
++	for (i = 0; i < 60; i++) {
++		ISP_IOXGET_8(isp, &cpsrc->req_sense_data[i],
++		    cpdst->req_sense_data[i]);
++	}
++}
++
++static INLINE void
++isp_get_rio2(struct ispsoftc *isp, isp_rio2_t *r2src, isp_rio2_t *r2dst)
++{
++	int i;
++	isp_copy_in_hdr(isp, &r2src->req_header, &r2dst->req_header);
++	if (r2dst->req_header.rqs_seqno > 30)
++		r2dst->req_header.rqs_seqno = 30;
++	for (i = 0; i < r2dst->req_header.rqs_seqno; i++) {
++		ISP_IOXGET_16(isp, &r2src->req_handles[i],
++		    r2dst->req_handles[i]);
++	}
++	while (i < 30) {
++		r2dst->req_handles[i++] = 0;
++	}
++}
++
++static INLINE void
++isp_put_icb(struct ispsoftc *isp, isp_icb_t *Is, isp_icb_t *Id)
++{
++	int i;
++	ISP_SWAP8(Is->icb_version, Is->_reserved0);
++	ISP_IOXPUT_8(isp, Is->icb_version, &Id->icb_version);
++	ISP_IOXPUT_8(isp, Is->_reserved0, &Id->_reserved0);
++	ISP_IOXPUT_16(isp, Is->icb_fwoptions, &Id->icb_fwoptions);
++	ISP_IOXPUT_16(isp, Is->icb_maxfrmlen, &Id->icb_maxfrmlen);
++	ISP_IOXPUT_16(isp, Is->icb_maxalloc, &Id->icb_maxalloc);
++	ISP_IOXPUT_16(isp, Is->icb_execthrottle, &Id->icb_execthrottle);
++	ISP_SWAP8(Is->icb_retry_count, Is->icb_retry_delay);
++	ISP_IOXPUT_8(isp, Is->icb_retry_count, &Id->icb_retry_count);
++	ISP_IOXPUT_8(isp, Is->icb_retry_delay, &Id->icb_retry_delay);
++	for (i = 0; i < 8; i++) {
++		ISP_IOXPUT_8(isp, Is->icb_portname[i], &Id->icb_portname[i]);
++	}
++	ISP_IOXPUT_16(isp, Is->icb_hardaddr, &Id->icb_hardaddr);
++	ISP_SWAP8(Is->icb_iqdevtype, Is->icb_logintime);
++	ISP_IOXPUT_8(isp, Is->icb_iqdevtype, &Id->icb_iqdevtype);
++	ISP_IOXPUT_8(isp, Is->icb_logintime, &Id->icb_logintime);
++	for (i = 0; i < 8; i++) {
++		ISP_IOXPUT_8(isp, Is->icb_nodename[i], &Id->icb_nodename[i]);
++	}
++	ISP_IOXPUT_16(isp, Is->icb_rqstout, &Id->icb_rqstout);
++	ISP_IOXPUT_16(isp, Is->icb_rspnsin, &Id->icb_rspnsin);
++	ISP_IOXPUT_16(isp, Is->icb_rqstqlen, &Id->icb_rqstqlen);
++	ISP_IOXPUT_16(isp, Is->icb_rsltqlen, &Id->icb_rsltqlen);
++	for (i = 0; i < 4; i++) {
++		ISP_IOXPUT_16(isp, Is->icb_rqstaddr[i], &Id->icb_rqstaddr[i]);
++	}
++	for (i = 0; i < 4; i++) {
++		ISP_IOXPUT_16(isp, Is->icb_respaddr[i], &Id->icb_respaddr[i]);
++	}
++	ISP_IOXPUT_16(isp, Is->icb_lunenables, &Id->icb_lunenables);
++	ISP_SWAP8(Is->icb_ccnt, Is->icb_icnt);
++	ISP_IOXPUT_8(isp, Is->icb_ccnt, &Id->icb_ccnt);
++	ISP_IOXPUT_8(isp, Is->icb_icnt, &Id->icb_icnt);
++	ISP_IOXPUT_16(isp, Is->icb_lunetimeout, &Id->icb_lunetimeout);
++	ISP_IOXPUT_16(isp, Is->icb_xfwoptions, &Id->icb_xfwoptions);
++	ISP_SWAP8(Is->icb_racctimer, Is->icb_idelaytimer);
++	ISP_IOXPUT_8(isp, Is->icb_racctimer, &Id->icb_racctimer);
++	ISP_IOXPUT_8(isp, Is->icb_idelaytimer, &Id->icb_idelaytimer);
++	ISP_IOXPUT_16(isp, Is->icb_zfwoptions, &Id->icb_zfwoptions);
++}
++
++static INLINE void
++isp_get_pdb(struct ispsoftc *isp, isp_pdb_t *src, isp_pdb_t *dst)
++{
++	int i;
++	ISP_IOXGET_16(isp, &src->pdb_options, dst->pdb_options);
++        ISP_IOXGET_8(isp, &src->pdb_mstate, dst->pdb_mstate);
++        ISP_IOXGET_8(isp, &src->pdb_sstate, dst->pdb_sstate);
++	for (i = 0; i < 4; i++) {
++		ISP_IOXGET_8(isp, &src->pdb_hardaddr_bits[i],
++		    dst->pdb_hardaddr_bits[i]);
++	}
++	for (i = 0; i < 4; i++) {
++		ISP_IOXGET_8(isp, &src->pdb_portid_bits[i],
++		    dst->pdb_portid_bits[i]);
++	}
++	for (i = 0; i < 8; i++) {
++		ISP_IOXGET_8(isp, &src->pdb_nodename[i], dst->pdb_nodename[i]);
++	}
++	for (i = 0; i < 8; i++) {
++		ISP_IOXGET_8(isp, &src->pdb_portname[i], dst->pdb_portname[i]);
++	}
++	ISP_IOXGET_16(isp, &src->pdb_execthrottle, dst->pdb_execthrottle);
++	ISP_IOXGET_16(isp, &src->pdb_exec_count, dst->pdb_exec_count);
++	ISP_IOXGET_8(isp, &src->pdb_retry_count, dst->pdb_retry_count);
++	ISP_IOXGET_8(isp, &src->pdb_retry_delay, dst->pdb_retry_delay);
++	ISP_IOXGET_16(isp, &src->pdb_resalloc, dst->pdb_resalloc);
++	ISP_IOXGET_16(isp, &src->pdb_curalloc, dst->pdb_curalloc);
++	ISP_IOXGET_16(isp, &src->pdb_qhead, dst->pdb_qhead);
++	ISP_IOXGET_16(isp, &src->pdb_qtail, dst->pdb_qtail);
++	ISP_IOXGET_16(isp, &src->pdb_tl_next, dst->pdb_tl_next);
++	ISP_IOXGET_16(isp, &src->pdb_tl_last, dst->pdb_tl_last);
++	ISP_IOXGET_16(isp, &src->pdb_features, dst->pdb_features);
++	ISP_IOXGET_16(isp, &src->pdb_pconcurrnt, dst->pdb_pconcurrnt);
++	ISP_IOXGET_16(isp, &src->pdb_roi, dst->pdb_roi);
++	ISP_IOXGET_8(isp, &src->pdb_target, dst->pdb_target);
++	ISP_IOXGET_8(isp, &src->pdb_initiator, dst->pdb_initiator);
++	ISP_IOXGET_16(isp, &src->pdb_rdsiz, dst->pdb_rdsiz);
++	ISP_IOXGET_16(isp, &src->pdb_ncseq, dst->pdb_ncseq);
++	ISP_IOXGET_16(isp, &src->pdb_noseq, dst->pdb_noseq);
++	ISP_IOXGET_16(isp, &src->pdb_labrtflg, dst->pdb_labrtflg);
++	ISP_IOXGET_16(isp, &src->pdb_lstopflg, dst->pdb_lstopflg);
++	ISP_IOXGET_16(isp, &src->pdb_sqhead, dst->pdb_sqhead);
++	ISP_IOXGET_16(isp, &src->pdb_sqtail, dst->pdb_sqtail);
++	ISP_IOXGET_16(isp, &src->pdb_ptimer, dst->pdb_ptimer);
++	ISP_IOXGET_16(isp, &src->pdb_nxt_seqid, dst->pdb_nxt_seqid);
++	ISP_IOXGET_16(isp, &src->pdb_fcount, dst->pdb_fcount);
++	ISP_IOXGET_16(isp, &src->pdb_prli_len, dst->pdb_prli_len);
++	ISP_IOXGET_16(isp, &src->pdb_prli_svc0, dst->pdb_prli_svc0);
++	ISP_IOXGET_16(isp, &src->pdb_prli_svc3, dst->pdb_prli_svc3);
++	ISP_IOXGET_16(isp, &src->pdb_loopid, dst->pdb_loopid);
++	ISP_IOXGET_16(isp, &src->pdb_il_ptr, dst->pdb_il_ptr);
++	ISP_IOXGET_16(isp, &src->pdb_sl_ptr, dst->pdb_sl_ptr);
++}
++
++
++/*
++ * CT_HDR canonicalization- only needed for SNS responses
++ */
++static INLINE void
++isp_get_ct_hdr(struct ispsoftc *isp, ct_hdr_t *src, ct_hdr_t *dst)
++{
++	ISP_IOXGET_8(isp, &src->ct_revision, dst->ct_revision);
++	ISP_IOXGET_8(isp, &src->ct_portid[0], dst->ct_portid[0]);
++	ISP_IOXGET_8(isp, &src->ct_portid[1], dst->ct_portid[1]);
++	ISP_IOXGET_8(isp, &src->ct_portid[2], dst->ct_portid[2]);
++	ISP_IOXGET_8(isp, &src->ct_fcs_type, dst->ct_fcs_type);
++	ISP_IOXGET_8(isp, &src->ct_fcs_subtype, dst->ct_fcs_subtype);
++	ISP_IOXGET_8(isp, &src->ct_options, dst->ct_options);
++	ISP_IOXGET_8(isp, &src->ct_res0, dst->ct_res0);
++	ISP_IOXGET_16(isp, &src->ct_response, dst->ct_response);
++	dst->ct_response = (dst->ct_response << 8) | (dst->ct_response >> 8);
++	ISP_IOXGET_16(isp, &src->ct_resid, dst->ct_resid);
++	dst->ct_resid = (dst->ct_resid << 8) | (dst->ct_resid >> 8);
++	ISP_IOXGET_8(isp, &src->ct_res1, dst->ct_res1);
++	ISP_IOXGET_8(isp, &src->ct_reason, dst->ct_reason);
++	ISP_IOXGET_8(isp, &src->ct_explanation, dst->ct_explanation);
++	ISP_IOXGET_8(isp, &src->ct_vunique, dst->ct_vunique);
++}
++
++/*
++ * Generic SNS request - not particularly useful since the per-command data
++ * isn't always 16 bit words.
++ */
++static INLINE void
++isp_put_sns_request(struct ispsoftc *isp, sns_screq_t *src, sns_screq_t *dst)
++{
++	int i, nw = (int) src->snscb_sblen;
++	ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
++	for (i = 0; i < 4; i++) {
++		ISP_IOXPUT_16(isp, src->snscb_addr[i], &dst->snscb_addr[i]);
++	}
++	ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
++	for (i = 0; i < nw; i++) {
++		ISP_IOXPUT_16(isp, src->snscb_data[i], &dst->snscb_data[i]);
++	}
++	
++}
++
++static INLINE void
++isp_put_gid_ft_request(struct ispsoftc *isp, sns_gid_ft_req_t *src,
++    sns_gid_ft_req_t *dst)
++{
++	ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
++	ISP_IOXPUT_16(isp, src->snscb_res0, &dst->snscb_res0);
++	ISP_IOXPUT_16(isp, src->snscb_addr[0], &dst->snscb_addr[0]);
++	ISP_IOXPUT_16(isp, src->snscb_addr[1], &dst->snscb_addr[1]);
++	ISP_IOXPUT_16(isp, src->snscb_addr[2], &dst->snscb_addr[2]);
++	ISP_IOXPUT_16(isp, src->snscb_addr[3], &dst->snscb_addr[3]);
++	ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
++	ISP_IOXPUT_16(isp, src->snscb_res1, &dst->snscb_res1);
++	ISP_IOXPUT_16(isp, src->snscb_cmd, &dst->snscb_cmd);
++	ISP_IOXPUT_16(isp, src->snscb_mword_div_2, &dst->snscb_mword_div_2);
++	ISP_IOXPUT_32(isp, src->snscb_res3, &dst->snscb_res3);
++	ISP_IOXPUT_32(isp, src->snscb_fc4_type, &dst->snscb_fc4_type);
++}
++
++static INLINE void
++isp_put_gxn_id_request(struct ispsoftc *isp, sns_gxn_id_req_t *src,
++    sns_gxn_id_req_t *dst)
++{
++	ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
++	ISP_IOXPUT_16(isp, src->snscb_res0, &dst->snscb_res0);
++	ISP_IOXPUT_16(isp, src->snscb_addr[0], &dst->snscb_addr[0]);
++	ISP_IOXPUT_16(isp, src->snscb_addr[1], &dst->snscb_addr[1]);
++	ISP_IOXPUT_16(isp, src->snscb_addr[2], &dst->snscb_addr[2]);
++	ISP_IOXPUT_16(isp, src->snscb_addr[3], &dst->snscb_addr[3]);
++	ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
++	ISP_IOXPUT_16(isp, src->snscb_res1, &dst->snscb_res1);
++	ISP_IOXPUT_16(isp, src->snscb_cmd, &dst->snscb_cmd);
++	ISP_IOXPUT_16(isp, src->snscb_res2, &dst->snscb_res2);
++	ISP_IOXPUT_32(isp, src->snscb_res3, &dst->snscb_res3);
++	ISP_IOXPUT_32(isp, src->snscb_portid, &dst->snscb_portid);
++}
++
++/*
++ * Generic SNS response - not particularly useful since the per-command data
++ * isn't always 16 bit words.
++ */
++static INLINE void
++isp_get_sns_response(struct ispsoftc *isp, sns_scrsp_t *src,
++    sns_scrsp_t *dst, int nwords)
++{
++	int i;
++	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
++	ISP_IOXGET_8(isp, &src->snscb_port_type, dst->snscb_port_type);
++	for (i = 0; i < 3; i++) {
++		ISP_IOXGET_8(isp, &src->snscb_port_id[i],
++		    dst->snscb_port_id[i]);
++	}
++	for (i = 0; i < 8; i++) {
++		ISP_IOXGET_8(isp, &src->snscb_portname[i],
++		    dst->snscb_portname[i]);
++	}
++	for (i = 0; i < nwords; i++) {
++		ISP_IOXGET_16(isp, &src->snscb_data[i], dst->snscb_data[i]);
++	}
++}
++
++static INLINE void
++isp_get_gid_ft_response(struct ispsoftc *isp, sns_gid_ft_rsp_t *src,
++    sns_gid_ft_rsp_t *dst, int nwords)
++{
++	int i;
++	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
++	for (i = 0; i < nwords; i++) {
++		int j;
++		ISP_IOXGET_8(isp,
++		    &src->snscb_ports[i].control,
++		    dst->snscb_ports[i].control);
++		for (j = 0; j < 3; j++) {
++			ISP_IOXGET_8(isp,
++			    &src->snscb_ports[i].portid[j],
++			    dst->snscb_ports[i].portid[j]);
++		}
++		if (dst->snscb_ports[i].control & 0x80) {
++			break;
++		}
++	}
++}
++
++static INLINE void
++isp_get_gxn_id_response(struct ispsoftc *isp, sns_gxn_id_rsp_t *src,
++    sns_gxn_id_rsp_t *dst)
++{
++	int i;
++	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
++	for (i = 0; i < 8; i++)
++		ISP_IOXGET_8(isp, &src->snscb_wwn[i], dst->snscb_wwn[i]);
++}
++
++static INLINE void
++isp_get_gff_id_response(struct ispsoftc *isp, sns_gff_id_rsp_t *src,
++    sns_gff_id_rsp_t *dst)
++{
++	int i;
++	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
++	for (i = 0; i < 32; i++) {
++		ISP_IOXGET_32(isp, &src->snscb_fc4_features[i],
++		    dst->snscb_fc4_features[i]);
++	}
++}
++
++static INLINE void
++isp_get_ga_nxt_response(struct ispsoftc *isp, sns_ga_nxt_rsp_t *src,
++    sns_ga_nxt_rsp_t *dst)
++{
++	int i;
++	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
++	ISP_IOXGET_8(isp, &src->snscb_port_type, dst->snscb_port_type);
++	for (i = 0; i < 3; i++) {
++		ISP_IOXGET_8(isp, &src->snscb_port_id[i],
++		    dst->snscb_port_id[i]);
++	}
++	for (i = 0; i < 8; i++) {
++		ISP_IOXGET_8(isp, &src->snscb_portname[i],
++		    dst->snscb_portname[i]);
++	}
++	ISP_IOXGET_8(isp, &src->snscb_pnlen, dst->snscb_pnlen);
++	for (i = 0; i < 255; i++) {
++		ISP_IOXGET_8(isp, &src->snscb_pname[i], dst->snscb_pname[i]);
++	}
++	for (i = 0; i < 8; i++) {
++		ISP_IOXGET_8(isp, &src->snscb_nodename[i],
++		    dst->snscb_nodename[i]);
++	}
++	ISP_IOXGET_8(isp, &src->snscb_nnlen, dst->snscb_nnlen);
++	for (i = 0; i < 255; i++) {
++		ISP_IOXGET_8(isp, &src->snscb_nname[i], dst->snscb_nname[i]);
++	}
++	for (i = 0; i < 8; i++) {
++		ISP_IOXGET_8(isp, &src->snscb_ipassoc[i],
++		    dst->snscb_ipassoc[i]);
++	}
++	for (i = 0; i < 16; i++) {
++		ISP_IOXGET_8(isp, &src->snscb_ipaddr[i], dst->snscb_ipaddr[i]);
++	}
++	for (i = 0; i < 4; i++) {
++		ISP_IOXGET_8(isp, &src->snscb_svc_class[i],
++		    dst->snscb_svc_class[i]);
++	}
++	for (i = 0; i < 32; i++) {
++		ISP_IOXGET_8(isp, &src->snscb_fc4_types[i],
++		    dst->snscb_fc4_types[i]);
++	}
++	for (i = 0; i < 8; i++) {
++		ISP_IOXGET_8(isp, &src->snscb_fpname[i], dst->snscb_fpname[i]);
++	}
++	ISP_IOXGET_8(isp, &src->snscb_reserved, dst->snscb_reserved);
++	for (i = 0; i < 3; i++) {
++		ISP_IOXGET_8(isp, &src->snscb_hardaddr[i],
++		    dst->snscb_hardaddr[i]);
++	}
++}
++
++#ifdef	ISP_TARGET_MODE
++static INLINE void
++isp_put_atio(struct ispsoftc *isp, at_entry_t *atsrc, at_entry_t *atdst)
++{
++	int i;
++	isp_copy_out_hdr(isp, &atsrc->at_header, &atdst->at_header);
++	ISP_IOXPUT_16(isp, atsrc->at_reserved, &atdst->at_reserved);
++	ISP_IOXPUT_16(isp, atsrc->at_handle, &atdst->at_handle);
++	if (ISP_IS_SBUS(isp)) {
++		ISP_IOXPUT_8(isp, atsrc->at_lun, &atdst->at_iid);
++		ISP_IOXPUT_8(isp, atsrc->at_iid, &atdst->at_lun);
++		ISP_IOXPUT_8(isp, atsrc->at_cdblen, &atdst->at_tgt);
++		ISP_IOXPUT_8(isp, atsrc->at_tgt, &atdst->at_cdblen);
++		ISP_IOXPUT_8(isp, atsrc->at_status, &atdst->at_scsi_status);
++		ISP_IOXPUT_8(isp, atsrc->at_scsi_status, &atdst->at_status);
++		ISP_IOXPUT_8(isp, atsrc->at_tag_val, &atdst->at_tag_type);
++		ISP_IOXPUT_8(isp, atsrc->at_tag_type, &atdst->at_tag_val);
++	} else {
++		ISP_IOXPUT_8(isp, atsrc->at_lun, &atdst->at_lun);
++		ISP_IOXPUT_8(isp, atsrc->at_iid, &atdst->at_iid);
++		ISP_IOXPUT_8(isp, atsrc->at_cdblen, &atdst->at_cdblen);
++		ISP_IOXPUT_8(isp, atsrc->at_tgt, &atdst->at_tgt);
++		ISP_IOXPUT_8(isp, atsrc->at_status, &atdst->at_status);
++		ISP_IOXPUT_8(isp, atsrc->at_scsi_status,
++		    &atdst->at_scsi_status);
++		ISP_IOXPUT_8(isp, atsrc->at_tag_val, &atdst->at_tag_val);
++		ISP_IOXPUT_8(isp, atsrc->at_tag_type, &atdst->at_tag_type);
++	}
++	ISP_IOXPUT_32(isp, atsrc->at_flags, &atdst->at_flags);
++	for (i = 0; i < ATIO_CDBLEN; i++) {
++		ISP_IOXPUT_8(isp, atsrc->at_cdb[i], &atdst->at_cdb[i]);
++	}
++	for (i = 0; i < QLTM_SENSELEN; i++) {
++		ISP_IOXPUT_8(isp, atsrc->at_sense[i], &atdst->at_sense[i]);
++	}
++}
++
++static INLINE void
++isp_get_atio(struct ispsoftc *isp, at_entry_t *atsrc, at_entry_t *atdst)
++{
++	int i;
++	isp_copy_in_hdr(isp, &atsrc->at_header, &atdst->at_header);
++	ISP_IOXGET_16(isp, &atsrc->at_reserved, atdst->at_reserved);
++	ISP_IOXGET_16(isp, &atsrc->at_handle, atdst->at_handle);
++	if (ISP_IS_SBUS(isp)) {
++		ISP_IOXGET_8(isp, &atsrc->at_lun, atdst->at_iid);
++		ISP_IOXGET_8(isp, &atsrc->at_iid, atdst->at_lun);
++		ISP_IOXGET_8(isp, &atsrc->at_cdblen, atdst->at_tgt);
++		ISP_IOXGET_8(isp, &atsrc->at_tgt, atdst->at_cdblen);
++		ISP_IOXGET_8(isp, &atsrc->at_status, atdst->at_scsi_status);
++		ISP_IOXGET_8(isp, &atsrc->at_scsi_status, atdst->at_status);
++		ISP_IOXGET_8(isp, &atsrc->at_tag_val, atdst->at_tag_type);
++		ISP_IOXGET_8(isp, &atsrc->at_tag_type, atdst->at_tag_val);
++	} else {
++		ISP_IOXGET_8(isp, &atsrc->at_lun, atdst->at_lun);
++		ISP_IOXGET_8(isp, &atsrc->at_iid, atdst->at_iid);
++		ISP_IOXGET_8(isp, &atsrc->at_cdblen, atdst->at_cdblen);
++		ISP_IOXGET_8(isp, &atsrc->at_tgt, atdst->at_tgt);
++		ISP_IOXGET_8(isp, &atsrc->at_status, atdst->at_status);
++		ISP_IOXGET_8(isp, &atsrc->at_scsi_status,
++		    atdst->at_scsi_status);
++		ISP_IOXGET_8(isp, &atsrc->at_tag_val, atdst->at_tag_val);
++		ISP_IOXGET_8(isp, &atsrc->at_tag_type, atdst->at_tag_type);
++	}
++	ISP_IOXGET_32(isp, &atsrc->at_flags, atdst->at_flags);
++	for (i = 0; i < ATIO_CDBLEN; i++) {
++		ISP_IOXGET_8(isp, &atsrc->at_cdb[i], atdst->at_cdb[i]);
++	}
++	for (i = 0; i < QLTM_SENSELEN; i++) {
++		ISP_IOXGET_8(isp, &atsrc->at_sense[i], atdst->at_sense[i]);
++	}
++}
++
++static INLINE void
++isp_put_atio2(struct ispsoftc *isp, at2_entry_t *atsrc, at2_entry_t *atdst)
++{
++	int i;
++	isp_copy_out_hdr(isp, &atsrc->at_header, &atdst->at_header);
++	ISP_IOXPUT_32(isp, atsrc->at_reserved, &atdst->at_reserved);
++	ISP_IOXPUT_8(isp, atsrc->at_lun, &atdst->at_lun);
++	ISP_IOXPUT_8(isp, atsrc->at_iid, &atdst->at_iid);
++	ISP_IOXPUT_16(isp, atsrc->at_rxid, &atdst->at_rxid);
++	ISP_IOXPUT_16(isp, atsrc->at_flags, &atdst->at_flags);
++	ISP_IOXPUT_16(isp, atsrc->at_status, &atdst->at_status);
++	ISP_IOXPUT_8(isp, atsrc->at_crn, &atdst->at_crn);
++	ISP_IOXPUT_8(isp, atsrc->at_taskcodes, &atdst->at_taskcodes);
++	ISP_IOXPUT_8(isp, atsrc->at_taskflags, &atdst->at_taskflags);
++	ISP_IOXPUT_8(isp, atsrc->at_execodes, &atdst->at_execodes);
++	for (i = 0; i < ATIO2_CDBLEN; i++) {
++		ISP_IOXPUT_8(isp, atsrc->at_cdb[i], &atdst->at_cdb[i]);
++	}
++	ISP_IOXPUT_32(isp, atsrc->at_datalen, &atdst->at_datalen);
++	ISP_IOXPUT_16(isp, atsrc->at_scclun, &atdst->at_scclun);
++	for (i = 0; i < 4; i++) {
++		ISP_IOXPUT_16(isp, atsrc->at_wwpn[i], &atdst->at_wwpn[i]);
++	}
++	for (i = 0; i < 6; i++) {
++		ISP_IOXPUT_16(isp, atsrc->at_reserved2[i],
++		    &atdst->at_reserved2[i]);
++	}
++	ISP_IOXPUT_16(isp, atsrc->at_oxid, &atdst->at_oxid);
++}
++
++static INLINE void
++isp_get_atio2(struct ispsoftc *isp, at2_entry_t *atsrc, at2_entry_t *atdst)
++{
++	int i;
++	isp_copy_in_hdr(isp, &atsrc->at_header, &atdst->at_header);
++	ISP_IOXGET_32(isp, &atsrc->at_reserved, atdst->at_reserved);
++	ISP_IOXGET_8(isp, &atsrc->at_lun, atdst->at_lun);
++	ISP_IOXGET_8(isp, &atsrc->at_iid, atdst->at_iid);
++	ISP_IOXGET_16(isp, &atsrc->at_rxid, atdst->at_rxid);
++	ISP_IOXGET_16(isp, &atsrc->at_flags, atdst->at_flags);
++	ISP_IOXGET_16(isp, &atsrc->at_status, atdst->at_status);
++	ISP_IOXGET_8(isp, &atsrc->at_crn, atdst->at_crn);
++	ISP_IOXGET_8(isp, &atsrc->at_taskcodes, atdst->at_taskcodes);
++	ISP_IOXGET_8(isp, &atsrc->at_taskflags, atdst->at_taskflags);
++	ISP_IOXGET_8(isp, &atsrc->at_execodes, atdst->at_execodes);
++	for (i = 0; i < ATIO2_CDBLEN; i++) {
++		ISP_IOXGET_8(isp, &atsrc->at_cdb[i], atdst->at_cdb[i]);
++	}
++	ISP_IOXGET_32(isp, &atsrc->at_datalen, atdst->at_datalen);
++	ISP_IOXGET_16(isp, &atsrc->at_scclun, atdst->at_scclun);
++	for (i = 0; i < 4; i++) {
++		ISP_IOXGET_16(isp, &atsrc->at_wwpn[i], atdst->at_wwpn[i]);
++	}
++	for (i = 0; i < 6; i++) {
++		ISP_IOXGET_16(isp, &atsrc->at_reserved2[i],
++		    atdst->at_reserved2[i]);
++	}
++	ISP_IOXGET_16(isp, &atsrc->at_oxid, atdst->at_oxid);
++}
++
++static INLINE void
++isp_put_ctio(struct ispsoftc *isp, ct_entry_t *ctsrc, ct_entry_t *ctdst)
++{
++	int i;
++	isp_copy_out_hdr(isp, &ctsrc->ct_header, &ctdst->ct_header);
++	ISP_IOXPUT_16(isp, ctsrc->ct_reserved, &ctdst->ct_reserved);
++	ISP_IOXPUT_16(isp, ctsrc->ct_fwhandle, &ctdst->ct_fwhandle);
++	if (ISP_IS_SBUS(isp)) {
++		ISP_IOXPUT_8(isp, ctsrc->ct_iid, &ctdst->ct_lun);
++		ISP_IOXPUT_8(isp, ctsrc->ct_lun, &ctdst->ct_iid);
++		ISP_IOXPUT_8(isp, ctsrc->ct_tgt, &ctdst->ct_reserved2);
++		ISP_IOXPUT_8(isp, ctsrc->ct_reserved2, &ctdst->ct_tgt);
++		ISP_IOXPUT_8(isp, ctsrc->ct_status, &ctdst->ct_scsi_status);
++		ISP_IOXPUT_8(isp, ctsrc->ct_scsi_status, &ctdst->ct_status);
++		ISP_IOXPUT_8(isp, ctsrc->ct_tag_type, &ctdst->ct_tag_val);
++		ISP_IOXPUT_8(isp, ctsrc->ct_tag_val, &ctdst->ct_tag_type);
++	} else {
++		ISP_IOXPUT_8(isp, ctsrc->ct_iid, &ctdst->ct_iid);
++		ISP_IOXPUT_8(isp, ctsrc->ct_lun, &ctdst->ct_lun);
++		ISP_IOXPUT_8(isp, ctsrc->ct_tgt, &ctdst->ct_tgt);
++		ISP_IOXPUT_8(isp, ctsrc->ct_reserved2, &ctdst->ct_reserved2);
++		ISP_IOXPUT_8(isp, ctsrc->ct_scsi_status,
++		    &ctdst->ct_scsi_status);
++		ISP_IOXPUT_8(isp, ctsrc->ct_status, &ctdst->ct_status);
++		ISP_IOXPUT_8(isp, ctsrc->ct_tag_type, &ctdst->ct_tag_type);
++		ISP_IOXPUT_8(isp, ctsrc->ct_tag_val, &ctdst->ct_tag_val);
++	}
++	ISP_IOXPUT_32(isp, ctsrc->ct_flags, &ctdst->ct_flags);
++	ISP_IOXPUT_32(isp, ctsrc->ct_xfrlen, &ctdst->ct_xfrlen);
++	ISP_IOXPUT_32(isp, ctsrc->ct_resid, &ctdst->ct_resid);
++	ISP_IOXPUT_16(isp, ctsrc->ct_timeout, &ctdst->ct_timeout);
++	ISP_IOXPUT_16(isp, ctsrc->ct_seg_count, &ctdst->ct_seg_count);
++	for (i = 0; i < ISP_RQDSEG; i++) {
++		ISP_IOXPUT_32(isp, ctsrc->ct_dataseg[i].ds_base,
++		    &ctdst->ct_dataseg[i].ds_base);
++		ISP_IOXPUT_32(isp, ctsrc->ct_dataseg[i].ds_count,
++		    &ctdst->ct_dataseg[i].ds_count);
++	}
++}
++
++static INLINE void
++isp_get_ctio(struct ispsoftc *isp, ct_entry_t *ctsrc, ct_entry_t *ctdst)
++{
++	int i;
++	isp_copy_in_hdr(isp, &ctsrc->ct_header, &ctdst->ct_header);
++	ISP_IOXGET_16(isp, &ctsrc->ct_reserved, ctdst->ct_reserved);
++	ISP_IOXGET_16(isp, &ctsrc->ct_fwhandle, ctdst->ct_fwhandle);
++	if (ISP_IS_SBUS(isp)) {
++		ISP_IOXGET_8(isp, &ctsrc->ct_lun, ctdst->ct_iid);
++		ISP_IOXGET_8(isp, &ctsrc->ct_iid, ctdst->ct_lun);
++		ISP_IOXGET_8(isp, &ctsrc->ct_reserved2, ctdst->ct_tgt);
++		ISP_IOXGET_8(isp, &ctsrc->ct_tgt, ctdst->ct_reserved2);
++		ISP_IOXGET_8(isp, &ctsrc->ct_status, ctdst->ct_scsi_status);
++		ISP_IOXGET_8(isp, &ctsrc->ct_scsi_status, ctdst->ct_status);
++		ISP_IOXGET_8(isp, &ctsrc->ct_tag_val, ctdst->ct_tag_type);
++		ISP_IOXGET_8(isp, &ctsrc->ct_tag_type, ctdst->ct_tag_val);
++	} else {
++		ISP_IOXGET_8(isp, &ctsrc->ct_lun, ctdst->ct_lun);
++		ISP_IOXGET_8(isp, &ctsrc->ct_iid, ctdst->ct_iid);
++		ISP_IOXGET_8(isp, &ctsrc->ct_reserved2, ctdst->ct_reserved2);
++		ISP_IOXGET_8(isp, &ctsrc->ct_tgt, ctdst->ct_tgt);
++		ISP_IOXGET_8(isp, &ctsrc->ct_status, ctdst->ct_status);
++		ISP_IOXGET_8(isp, &ctsrc->ct_scsi_status,
++		    ctdst->ct_scsi_status);
++		ISP_IOXGET_8(isp, &ctsrc->ct_tag_val, ctdst->ct_tag_val);
++		ISP_IOXGET_8(isp, &ctsrc->ct_tag_type, ctdst->ct_tag_type);
++	}
++	ISP_IOXGET_32(isp, &ctsrc->ct_flags, ctdst->ct_flags);
++	ISP_IOXGET_32(isp, &ctsrc->ct_xfrlen, ctdst->ct_xfrlen);
++	ISP_IOXGET_32(isp, &ctsrc->ct_resid, ctdst->ct_resid);
++	ISP_IOXGET_16(isp, &ctsrc->ct_timeout, ctdst->ct_timeout);
++	ISP_IOXGET_16(isp, &ctsrc->ct_seg_count, ctdst->ct_seg_count);
++	for (i = 0; i < ISP_RQDSEG; i++) {
++		ISP_IOXGET_32(isp,
++		    &ctsrc->ct_dataseg[i].ds_base,
++		    ctdst->ct_dataseg[i].ds_base);
++		ISP_IOXGET_32(isp,
++		    &ctsrc->ct_dataseg[i].ds_count,
++		    ctdst->ct_dataseg[i].ds_count);
++	}
++}
++
++static INLINE void
++isp_put_ctio2(struct ispsoftc *isp, ct2_entry_t *ctsrc, ct2_entry_t *ctdst)
++{
++	int i;
++	isp_copy_out_hdr(isp, &ctsrc->ct_header, &ctdst->ct_header);
++	ISP_IOXPUT_16(isp, ctsrc->ct_reserved, &ctdst->ct_reserved);
++	ISP_IOXPUT_16(isp, ctsrc->ct_fwhandle, &ctdst->ct_fwhandle);
++	ISP_IOXPUT_8(isp, ctsrc->ct_lun, &ctdst->ct_lun);
++	ISP_IOXPUT_8(isp, ctsrc->ct_iid, &ctdst->ct_iid);
++	ISP_IOXPUT_16(isp, ctsrc->ct_rxid, &ctdst->ct_rxid);
++	ISP_IOXPUT_16(isp, ctsrc->ct_flags, &ctdst->ct_flags);
++	ISP_IOXPUT_16(isp, ctsrc->ct_timeout, &ctdst->ct_timeout);
++	ISP_IOXPUT_16(isp, ctsrc->ct_seg_count, &ctdst->ct_seg_count);
++	ISP_IOXPUT_32(isp, ctsrc->ct_resid, &ctdst->ct_resid);
++	ISP_IOXPUT_32(isp, ctsrc->ct_reloff, &ctdst->ct_reloff);
++	if ((ctsrc->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) {
++		ISP_IOXPUT_32(isp, ctsrc->rsp.m0._reserved,
++		    &ctdst->rsp.m0._reserved);
++		ISP_IOXPUT_16(isp, ctsrc->rsp.m0._reserved2,
++		    &ctdst->rsp.m0._reserved2);
++		ISP_IOXPUT_16(isp, ctsrc->rsp.m0.ct_scsi_status,
++		    &ctdst->rsp.m0.ct_scsi_status);
++		ISP_IOXPUT_32(isp, ctsrc->rsp.m0.ct_xfrlen,
++		    &ctdst->rsp.m0.ct_xfrlen);
++		if (ctsrc->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
++			for (i = 0; i < ISP_RQDSEG_T2; i++) {
++				ISP_IOXPUT_32(isp,
++				    ctsrc->rsp.m0.ct_dataseg[i].ds_base,
++				    &ctdst->rsp.m0.ct_dataseg[i].ds_base);
++				ISP_IOXPUT_32(isp,
++				    ctsrc->rsp.m0.ct_dataseg[i].ds_count,
++				    &ctdst->rsp.m0.ct_dataseg[i].ds_count);
++			}
++		} else if (ctsrc->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
++			for (i = 0; i < ISP_RQDSEG_T3; i++) {
++				ISP_IOXPUT_32(isp,
++				    ctsrc->rsp.m0.ct_dataseg64[i].ds_base,
++				    &ctdst->rsp.m0.ct_dataseg64[i].ds_base);
++				ISP_IOXPUT_32(isp,
++				    ctsrc->rsp.m0.ct_dataseg64[i].ds_basehi,
++				    &ctdst->rsp.m0.ct_dataseg64[i].ds_basehi);
++				ISP_IOXPUT_32(isp,
++				    ctsrc->rsp.m0.ct_dataseg64[i].ds_count,
++				    &ctdst->rsp.m0.ct_dataseg64[i].ds_count);
++			}
++		} else if (ctsrc->ct_header.rqs_entry_type == RQSTYPE_CTIO4) {
++			ISP_IOXPUT_16(isp, ctsrc->rsp.m0.ct_dslist.ds_type,
++			    &ctdst->rsp.m0.ct_dslist.ds_type);
++			ISP_IOXPUT_32(isp, ctsrc->rsp.m0.ct_dslist.ds_segment,
++			    &ctdst->rsp.m0.ct_dslist.ds_segment);
++			ISP_IOXPUT_32(isp, ctsrc->rsp.m0.ct_dslist.ds_base,
++			    &ctdst->rsp.m0.ct_dslist.ds_base);
++		}
++	} else if ((ctsrc->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) {
++		ISP_IOXPUT_16(isp, ctsrc->rsp.m1._reserved,
++		    &ctdst->rsp.m1._reserved);
++		ISP_IOXPUT_16(isp, ctsrc->rsp.m1._reserved2,
++		    &ctdst->rsp.m1._reserved2);
++		ISP_IOXPUT_16(isp, ctsrc->rsp.m1.ct_senselen,
++		    &ctdst->rsp.m1.ct_senselen);
++		ISP_IOXPUT_16(isp, ctsrc->rsp.m1.ct_scsi_status,
++		    &ctdst->rsp.m1.ct_scsi_status);
++		ISP_IOXPUT_16(isp, ctsrc->rsp.m1.ct_resplen,
++		    &ctdst->rsp.m1.ct_resplen);
++		for (i = 0; i < MAXRESPLEN; i++) {
++			ISP_IOXPUT_8(isp, ctsrc->rsp.m1.ct_resp[i],
++			    &ctdst->rsp.m1.ct_resp[i]);
++		}
++	} else {
++		ISP_IOXPUT_32(isp, ctsrc->rsp.m2._reserved,
++		    &ctdst->rsp.m2._reserved);
++		ISP_IOXPUT_16(isp, ctsrc->rsp.m2._reserved2,
++		    &ctdst->rsp.m2._reserved2);
++		ISP_IOXPUT_16(isp, ctsrc->rsp.m2._reserved3,
++		    &ctdst->rsp.m2._reserved3);
++		ISP_IOXPUT_32(isp, ctsrc->rsp.m2.ct_datalen,
++		    &ctdst->rsp.m2.ct_datalen);
++		ISP_IOXPUT_32(isp, ctsrc->rsp.m2.ct_fcp_rsp_iudata.ds_base,
++		    &ctdst->rsp.m2.ct_fcp_rsp_iudata.ds_base);
++		ISP_IOXPUT_32(isp, ctsrc->rsp.m2.ct_fcp_rsp_iudata.ds_count,
++		    &ctdst->rsp.m2.ct_fcp_rsp_iudata.ds_count);
++	}
++}
++
++static INLINE void
++isp_get_ctio2(struct ispsoftc *isp, ct2_entry_t *ctsrc, ct2_entry_t *ctdst)
++{
++	int i;
++	isp_copy_in_hdr(isp, &ctsrc->ct_header, &ctdst->ct_header);
++	ISP_IOXGET_16(isp, &ctsrc->ct_reserved, ctdst->ct_reserved);
++	ISP_IOXGET_16(isp, &ctsrc->ct_fwhandle, ctdst->ct_fwhandle);
++	ISP_IOXGET_8(isp, &ctsrc->ct_lun, ctdst->ct_lun);
++	ISP_IOXGET_8(isp, &ctsrc->ct_iid, ctdst->ct_iid);
++	ISP_IOXGET_16(isp, &ctsrc->ct_rxid, ctdst->ct_rxid);
++	ISP_IOXGET_16(isp, &ctsrc->ct_flags, ctdst->ct_flags);
++	ISP_IOXGET_16(isp, &ctsrc->ct_status, ctdst->ct_status);
++	ISP_IOXGET_16(isp, &ctsrc->ct_timeout, ctdst->ct_timeout);
++	ISP_IOXGET_16(isp, &ctsrc->ct_seg_count, ctdst->ct_seg_count);
++	ISP_IOXGET_32(isp, &ctsrc->ct_reloff, ctdst->ct_reloff);
++	ISP_IOXGET_32(isp, &ctsrc->ct_resid, ctdst->ct_resid);
++	for (i = 0; i < 4; i++) {
++		ISP_IOXGET_32(isp, &ctsrc->rsp.fw._reserved[i],
++		    ctdst->rsp.fw._reserved[i]);
++	}
++	ISP_IOXGET_16(isp, &ctsrc->rsp.fw.ct_scsi_status,
++	    ctdst->rsp.fw.ct_scsi_status);
++	for (i = 0; i < QLTM_SENSELEN; i++) {
++		ISP_IOXGET_8(isp, &ctsrc->rsp.fw.ct_sense[i],
++		    ctdst->rsp.fw.ct_sense[i]);
++	}
++}
++
++static INLINE void
++isp_put_enable_lun(struct ispsoftc *isp, lun_entry_t *lesrc, lun_entry_t *ledst)
++{
++	int i;
++	isp_copy_out_hdr(isp, &lesrc->le_header, &ledst->le_header);
++	ISP_IOXPUT_32(isp, lesrc->le_reserved, &ledst->le_reserved);
++	if (ISP_IS_SBUS(isp)) {
++		ISP_IOXPUT_8(isp, lesrc->le_lun, &ledst->le_rsvd);
++		ISP_IOXPUT_8(isp, lesrc->le_rsvd, &ledst->le_lun);
++		ISP_IOXPUT_8(isp, lesrc->le_ops, &ledst->le_tgt);
++		ISP_IOXPUT_8(isp, lesrc->le_tgt, &ledst->le_ops);
++		ISP_IOXPUT_8(isp, lesrc->le_status, &ledst->le_reserved2);
++		ISP_IOXPUT_8(isp, lesrc->le_reserved2, &ledst->le_status);
++		ISP_IOXPUT_8(isp, lesrc->le_cmd_count, &ledst->le_in_count);
++		ISP_IOXPUT_8(isp, lesrc->le_in_count, &ledst->le_cmd_count);
++		ISP_IOXPUT_8(isp, lesrc->le_cdb6len, &ledst->le_cdb7len);
++		ISP_IOXPUT_8(isp, lesrc->le_cdb7len, &ledst->le_cdb6len);
++	} else {
++		ISP_IOXPUT_8(isp, lesrc->le_lun, &ledst->le_lun);
++		ISP_IOXPUT_8(isp, lesrc->le_rsvd, &ledst->le_rsvd);
++		ISP_IOXPUT_8(isp, lesrc->le_ops, &ledst->le_ops);
++		ISP_IOXPUT_8(isp, lesrc->le_tgt, &ledst->le_tgt);
++		ISP_IOXPUT_8(isp, lesrc->le_status, &ledst->le_status);
++		ISP_IOXPUT_8(isp, lesrc->le_reserved2, &ledst->le_reserved2);
++		ISP_IOXPUT_8(isp, lesrc->le_cmd_count, &ledst->le_cmd_count);
++		ISP_IOXPUT_8(isp, lesrc->le_in_count, &ledst->le_in_count);
++		ISP_IOXPUT_8(isp, lesrc->le_cdb6len, &ledst->le_cdb6len);
++		ISP_IOXPUT_8(isp, lesrc->le_cdb7len, &ledst->le_cdb7len);
++	}
++	ISP_IOXPUT_32(isp, lesrc->le_flags, &ledst->le_flags);
++	ISP_IOXPUT_16(isp, lesrc->le_timeout, &ledst->le_timeout);
++	for (i = 0; i < 20; i++) {
++		ISP_IOXPUT_8(isp, lesrc->le_reserved3[i],
++		    &ledst->le_reserved3[i]);
++	}
++}
++
++static INLINE void
++isp_get_enable_lun(struct ispsoftc *isp, lun_entry_t *lesrc, lun_entry_t *ledst)
++{
++	int i;
++	isp_copy_in_hdr(isp, &lesrc->le_header, &ledst->le_header);
++	ISP_IOXGET_32(isp, &lesrc->le_reserved, ledst->le_reserved);
++	if (ISP_IS_SBUS(isp)) {
++		ISP_IOXGET_8(isp, &lesrc->le_lun, ledst->le_rsvd);
++		ISP_IOXGET_8(isp, &lesrc->le_rsvd, ledst->le_lun);
++		ISP_IOXGET_8(isp, &lesrc->le_ops, ledst->le_tgt);
++		ISP_IOXGET_8(isp, &lesrc->le_tgt, ledst->le_ops);
++		ISP_IOXGET_8(isp, &lesrc->le_status, ledst->le_reserved2);
++		ISP_IOXGET_8(isp, &lesrc->le_reserved2, ledst->le_status);
++		ISP_IOXGET_8(isp, &lesrc->le_cmd_count, ledst->le_in_count);
++		ISP_IOXGET_8(isp, &lesrc->le_in_count, ledst->le_cmd_count);
++		ISP_IOXGET_8(isp, &lesrc->le_cdb6len, ledst->le_cdb7len);
++		ISP_IOXGET_8(isp, &lesrc->le_cdb7len, ledst->le_cdb6len);
++	} else {
++		ISP_IOXGET_8(isp, &lesrc->le_lun, ledst->le_lun);
++		ISP_IOXGET_8(isp, &lesrc->le_rsvd, ledst->le_rsvd);
++		ISP_IOXGET_8(isp, &lesrc->le_ops, ledst->le_ops);
++		ISP_IOXGET_8(isp, &lesrc->le_tgt, ledst->le_tgt);
++		ISP_IOXGET_8(isp, &lesrc->le_status, ledst->le_status);
++		ISP_IOXGET_8(isp, &lesrc->le_reserved2, ledst->le_reserved2);
++		ISP_IOXGET_8(isp, &lesrc->le_cmd_count, ledst->le_cmd_count);
++		ISP_IOXGET_8(isp, &lesrc->le_in_count, ledst->le_in_count);
++		ISP_IOXGET_8(isp, &lesrc->le_cdb6len, ledst->le_cdb6len);
++		ISP_IOXGET_8(isp, &lesrc->le_cdb7len, ledst->le_cdb7len);
++	}
++	ISP_IOXGET_32(isp, &lesrc->le_flags, ledst->le_flags);
++	ISP_IOXGET_16(isp, &lesrc->le_timeout, ledst->le_timeout);
++	for (i = 0; i < 20; i++) {
++		ISP_IOXGET_8(isp, &lesrc->le_reserved3[i],
++		    ledst->le_reserved3[i]);
++	}
++}
++
++static INLINE void
++isp_put_notify(struct ispsoftc *isp, in_entry_t *insrc, in_entry_t *indst)
++{
++	int i;
++	isp_copy_out_hdr(isp, &insrc->in_header, &indst->in_header);
++	ISP_IOXPUT_32(isp, insrc->in_reserved, &indst->in_reserved);
++	if (ISP_IS_SBUS(isp)) {
++		ISP_IOXPUT_8(isp, insrc->in_lun, &indst->in_iid);
++		ISP_IOXPUT_8(isp, insrc->in_iid, &indst->in_lun);
++		ISP_IOXPUT_8(isp, insrc->in_reserved2, &indst->in_tgt);
++		ISP_IOXPUT_8(isp, insrc->in_tgt, &indst->in_reserved2);
++		ISP_IOXPUT_8(isp, insrc->in_status, &indst->in_rsvd2);
++		ISP_IOXPUT_8(isp, insrc->in_rsvd2, &indst->in_status);
++		ISP_IOXPUT_8(isp, insrc->in_tag_val, &indst->in_tag_type);
++		ISP_IOXPUT_8(isp, insrc->in_tag_type, &indst->in_tag_val);
++	} else {
++		ISP_IOXPUT_8(isp, insrc->in_lun, &indst->in_lun);
++		ISP_IOXPUT_8(isp, insrc->in_iid, &indst->in_iid);
++		ISP_IOXPUT_8(isp, insrc->in_reserved2, &indst->in_reserved2);
++		ISP_IOXPUT_8(isp, insrc->in_tgt, &indst->in_tgt);
++		ISP_IOXPUT_8(isp, insrc->in_status, &indst->in_status);
++		ISP_IOXPUT_8(isp, insrc->in_rsvd2, &indst->in_rsvd2);
++		ISP_IOXPUT_8(isp, insrc->in_tag_val, &indst->in_tag_val);
++		ISP_IOXPUT_8(isp, insrc->in_tag_type, &indst->in_tag_type);
++	}
++	ISP_IOXPUT_32(isp, insrc->in_flags, &indst->in_flags);
++	ISP_IOXPUT_16(isp, insrc->in_seqid, &indst->in_seqid);
++	for (i = 0; i < IN_MSGLEN; i++) {
++		ISP_IOXPUT_8(isp, insrc->in_msg[i], &indst->in_msg[i]);
++	}
++	for (i = 0; i < IN_RSVDLEN; i++) {
++		ISP_IOXPUT_8(isp, insrc->in_reserved3[i],
++		    &indst->in_reserved3[i]);
++	}
++	for (i = 0; i < QLTM_SENSELEN; i++) {
++		ISP_IOXPUT_8(isp, insrc->in_sense[i],
++		    &indst->in_sense[i]);
++	}
++}
++
++static INLINE void
++isp_get_notify(struct ispsoftc *isp, in_entry_t *insrc, in_entry_t *indst)
++{
++	int i;
++	isp_copy_in_hdr(isp, &insrc->in_header, &indst->in_header);
++	ISP_IOXGET_32(isp, &insrc->in_reserved, indst->in_reserved);
++	if (ISP_IS_SBUS(isp)) {
++		ISP_IOXGET_8(isp, &insrc->in_lun, indst->in_iid);
++		ISP_IOXGET_8(isp, &insrc->in_iid, indst->in_lun);
++		ISP_IOXGET_8(isp, &insrc->in_reserved2, indst->in_tgt);
++		ISP_IOXGET_8(isp, &insrc->in_tgt, indst->in_reserved2);
++		ISP_IOXGET_8(isp, &insrc->in_status, indst->in_rsvd2);
++		ISP_IOXGET_8(isp, &insrc->in_rsvd2, indst->in_status);
++		ISP_IOXGET_8(isp, &insrc->in_tag_val, indst->in_tag_type);
++		ISP_IOXGET_8(isp, &insrc->in_tag_type, indst->in_tag_val);
++	} else {
++		ISP_IOXGET_8(isp, &insrc->in_lun, indst->in_lun);
++		ISP_IOXGET_8(isp, &insrc->in_iid, indst->in_iid);
++		ISP_IOXGET_8(isp, &insrc->in_reserved2, indst->in_reserved2);
++		ISP_IOXGET_8(isp, &insrc->in_tgt, indst->in_tgt);
++		ISP_IOXGET_8(isp, &insrc->in_status, indst->in_status);
++		ISP_IOXGET_8(isp, &insrc->in_rsvd2, indst->in_rsvd2);
++		ISP_IOXGET_8(isp, &insrc->in_tag_val, indst->in_tag_val);
++		ISP_IOXGET_8(isp, &insrc->in_tag_type, indst->in_tag_type);
++	}
++	ISP_IOXGET_32(isp, &insrc->in_flags, indst->in_flags);
++	ISP_IOXGET_16(isp, &insrc->in_seqid, indst->in_seqid);
++	for (i = 0; i < IN_MSGLEN; i++) {
++		ISP_IOXGET_8(isp, &insrc->in_msg[i], indst->in_msg[i]);
++	}
++	for (i = 0; i < IN_RSVDLEN; i++) {
++		ISP_IOXGET_8(isp, &insrc->in_reserved3[i],
++		    indst->in_reserved3[i]);
++	}
++	for (i = 0; i < QLTM_SENSELEN; i++) {
++		ISP_IOXGET_8(isp, &insrc->in_sense[i],
++		    indst->in_sense[i]);
++	}
++}
++
++static INLINE void
++isp_put_notify_fc(struct ispsoftc *isp, in_fcentry_t *insrc,
++    in_fcentry_t *indst)
++{
++	isp_copy_out_hdr(isp, &insrc->in_header, &indst->in_header);
++	ISP_IOXPUT_32(isp, insrc->in_reserved, &indst->in_reserved);
++	ISP_IOXPUT_8(isp, insrc->in_lun, &indst->in_lun);
++	ISP_IOXPUT_8(isp, insrc->in_iid, &indst->in_iid);
++	ISP_IOXPUT_16(isp, insrc->in_scclun, &indst->in_scclun);
++	ISP_IOXPUT_32(isp, insrc->in_reserved2, &indst->in_reserved2);
++	ISP_IOXPUT_16(isp, insrc->in_status, &indst->in_status);
++	ISP_IOXPUT_16(isp, insrc->in_task_flags, &indst->in_task_flags);
++	ISP_IOXPUT_16(isp, insrc->in_seqid, &indst->in_seqid);
++}
++
++static INLINE void
++isp_get_notify_fc(struct ispsoftc *isp, in_fcentry_t *insrc,
++    in_fcentry_t *indst)
++{
++	isp_copy_in_hdr(isp, &insrc->in_header, &indst->in_header);
++	ISP_IOXGET_32(isp, &insrc->in_reserved, indst->in_reserved);
++	ISP_IOXGET_8(isp, &insrc->in_lun, indst->in_lun);
++	ISP_IOXGET_8(isp, &insrc->in_iid, indst->in_iid);
++	ISP_IOXGET_16(isp, &insrc->in_scclun, indst->in_scclun);
++	ISP_IOXGET_32(isp, &insrc->in_reserved2, indst->in_reserved2);
++	ISP_IOXGET_16(isp, &insrc->in_status, indst->in_status);
++	ISP_IOXGET_16(isp, &insrc->in_task_flags, indst->in_task_flags);
++	ISP_IOXGET_16(isp, &insrc->in_seqid, indst->in_seqid);
++}
++
++static INLINE void
++isp_put_notify_ack(struct ispsoftc *isp, na_entry_t *nasrc,  na_entry_t *nadst)
++{
++	int i;
++	isp_copy_out_hdr(isp, &nasrc->na_header, &nadst->na_header);
++	ISP_IOXPUT_32(isp, nasrc->na_reserved, &nadst->na_reserved);
++	if (ISP_IS_SBUS(isp)) {
++		ISP_IOXPUT_8(isp, nasrc->na_lun, &nadst->na_iid);
++		ISP_IOXPUT_8(isp, nasrc->na_iid, &nadst->na_lun);
++		ISP_IOXPUT_8(isp, nasrc->na_status, &nadst->na_event);
++		ISP_IOXPUT_8(isp, nasrc->na_event, &nadst->na_status);
++	} else {
++		ISP_IOXPUT_8(isp, nasrc->na_lun, &nadst->na_lun);
++		ISP_IOXPUT_8(isp, nasrc->na_iid, &nadst->na_iid);
++		ISP_IOXPUT_8(isp, nasrc->na_status, &nadst->na_status);
++		ISP_IOXPUT_8(isp, nasrc->na_event, &nadst->na_event);
++	}
++	ISP_IOXPUT_32(isp, nasrc->na_flags, &nadst->na_flags);
++	for (i = 0; i < NA_RSVDLEN; i++) {
++		ISP_IOXPUT_16(isp, nasrc->na_reserved3[i],
++		    &nadst->na_reserved3[i]);
++	}
++}
++
++static INLINE void
++isp_get_notify_ack(struct ispsoftc *isp, na_entry_t *nasrc, na_entry_t *nadst)
++{
++	int i;
++	isp_copy_in_hdr(isp, &nasrc->na_header, &nadst->na_header);
++	ISP_IOXGET_32(isp, &nasrc->na_reserved, nadst->na_reserved);
++	if (ISP_IS_SBUS(isp)) {
++		ISP_IOXGET_8(isp, &nasrc->na_lun, nadst->na_iid);
++		ISP_IOXGET_8(isp, &nasrc->na_iid, nadst->na_lun);
++		ISP_IOXGET_8(isp, &nasrc->na_status, nadst->na_event);
++		ISP_IOXGET_8(isp, &nasrc->na_event, nadst->na_status);
++	} else {
++		ISP_IOXGET_8(isp, &nasrc->na_lun, nadst->na_lun);
++		ISP_IOXGET_8(isp, &nasrc->na_iid, nadst->na_iid);
++		ISP_IOXGET_8(isp, &nasrc->na_status, nadst->na_status);
++		ISP_IOXGET_8(isp, &nasrc->na_event, nadst->na_event);
++	}
++	ISP_IOXGET_32(isp, &nasrc->na_flags, nadst->na_flags);
++	for (i = 0; i < NA_RSVDLEN; i++) {
++		ISP_IOXGET_16(isp, &nasrc->na_reserved3[i],
++		    nadst->na_reserved3[i]);
++	}
++}
++
++static INLINE void
++isp_put_notify_ack_fc(struct ispsoftc *isp, na_fcentry_t *nasrc,
++    na_fcentry_t *nadst)
++{
++	int i;
++	isp_copy_out_hdr(isp, &nasrc->na_header, &nadst->na_header);
++	ISP_IOXPUT_32(isp, nasrc->na_reserved, &nadst->na_reserved);
++	ISP_IOXPUT_8(isp, nasrc->na_lun, &nadst->na_lun);
++	ISP_IOXPUT_8(isp, nasrc->na_iid, &nadst->na_iid);
++	ISP_IOXPUT_16(isp, nasrc->na_scclun, &nadst->na_scclun);
++	ISP_IOXPUT_16(isp, nasrc->na_flags, &nadst->na_flags);
++	ISP_IOXPUT_16(isp, nasrc->na_reserved2, &nadst->na_reserved2);
++	ISP_IOXPUT_16(isp, nasrc->na_status, &nadst->na_status);
++	ISP_IOXPUT_16(isp, nasrc->na_task_flags, &nadst->na_task_flags);
++	ISP_IOXPUT_16(isp, nasrc->na_seqid, &nadst->na_seqid);
++	for (i = 0; i < NA2_RSVDLEN; i++) {
++		ISP_IOXPUT_16(isp, nasrc->na_reserved3[i],
++		    &nadst->na_reserved3[i]);
++	}
++}
++
++static INLINE void
++isp_get_notify_ack_fc(struct ispsoftc *isp, na_fcentry_t *nasrc,
++    na_fcentry_t *nadst)
++{
++	int i;
++	isp_copy_in_hdr(isp, &nasrc->na_header, &nadst->na_header);
++	ISP_IOXGET_32(isp, &nasrc->na_reserved, nadst->na_reserved);
++	ISP_IOXGET_8(isp, &nasrc->na_lun, nadst->na_lun);
++	ISP_IOXGET_8(isp, &nasrc->na_iid, nadst->na_iid);
++	ISP_IOXGET_16(isp, &nasrc->na_scclun, nadst->na_scclun);
++	ISP_IOXGET_16(isp, &nasrc->na_flags, nadst->na_flags);
++	ISP_IOXGET_16(isp, &nasrc->na_reserved2, nadst->na_reserved2);
++	ISP_IOXGET_16(isp, &nasrc->na_status, nadst->na_status);
++	ISP_IOXGET_16(isp, &nasrc->na_task_flags, nadst->na_task_flags);
++	ISP_IOXGET_16(isp, &nasrc->na_seqid, nadst->na_seqid);
++	for (i = 0; i < NA2_RSVDLEN; i++) {
++		ISP_IOXGET_16(isp, &nasrc->na_reserved3[i],
++		    nadst->na_reserved3[i]);
++	}
++}
++#endif
++#endif	/* _ISP_INLINE_H */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp_ioctl.h	2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,128 @@
++/* %W% */
++/*
++ * ioctl definitions for Qlogic FC/SCSI HBA driver
++ */
++#define	ISP_IOC		(0x4D4A5100)	/* 'MJQ' << 8 */
++
++/*
++ * This ioctl sets/retrieves the debugging level for this hba instance.
++ * Note that this is not a simple integer level- see ispvar.h for definitions.
++ *
++ * The arguments is a pointer to an integer with the new debugging level.
++ * The old value is written into this argument.
++ */
++
++#define	ISP_SDBLEV	(ISP_IOC | 1)
++
++/*
++ * This ioctl resets the HBA. Use with caution.
++ */
++#define	ISP_RESETHBA	(ISP_IOC | 2)
++
++/*
++ * This ioctl performs a fibre chanel rescan.
++ */
++#define	ISP_RESCAN	(ISP_IOC | 3)
++
++/*
++ * This ioctl performs a reset and then will set the adapter to the
++ * role that was passed in (the old role will be returned). It almost
++ * goes w/o saying: use with caution.
++ */
++#define ISP_SETROLE     (ISP_IOC | 4)
++
++#define ISP_ROLE_NONE           0x0
++#define ISP_ROLE_INITIATOR      0x1
++#define ISP_ROLE_TARGET         0x2
++#define ISP_ROLE_BOTH           (ISP_ROLE_TARGET|ISP_ROLE_INITIATOR)
++#ifndef ISP_DEFAULT_ROLES
++#define ISP_DEFAULT_ROLES       ISP_ROLE_BOTH
++#endif
++
++/*
++ * Get the current adapter role
++ */
++#define ISP_GETROLE     (ISP_IOC | 5)
++
++/*
++ * Get/Clear Stats
++ */
++#define	ISP_STATS_VERSION	0
++typedef struct {
++	u_int8_t	isp_stat_version;
++	u_int8_t	isp_type;		/* (ro) reflects chip type */
++	u_int8_t	isp_revision;		/* (ro) reflects chip version */
++	u_int8_t	unused1;
++	u_int32_t	unused2;
++	/*
++	 * Statistics Counters
++	 */
++#define	ISP_NSTATS	16
++#define	ISP_INTCNT	0
++#define	ISP_INTBOGUS	1
++#define	ISP_INTMBOXC	2
++#define	ISP_INGOASYNC	3
++#define	ISP_RSLTCCMPLT	4
++#define	ISP_FPHCCMCPLT	5
++#define	ISP_RSCCHIWAT	6
++#define	ISP_FPCCHIWAT	7
++	u_int64_t	isp_stats[ISP_NSTATS];
++} isp_stats_t;
++
++#define	ISP_GET_STATS	(ISP_IOC | 6)
++#define	ISP_CLR_STATS	(ISP_IOC | 7)
++
++/*
++ * Initiate a LIP
++ */
++#define	ISP_FC_LIP	(ISP_IOC | 8)
++
++/*
++ * Return the Port Database structure for the named device, or ENODEV if none.
++ * Caller fills in virtual loopid (0..255), aka 'target'. The driver returns
++ * ENODEV (if nothing valid there) or the actual loopid (for local loop devices
++ * only), 24 bit Port ID and Node and Port WWNs.
++ */
++struct isp_fc_device {
++	u_int32_t	loopid;	/* 0..255 */
++	u_int32_t	portid;	/* 24 bit Port ID */
++	u_int64_t	node_wwn;
++	u_int64_t	port_wwn;
++};
++#define	ISP_FC_GETDINFO	(ISP_IOC | 9)
++
++/*
++ * Get F/W crash dump
++ */
++#define	ISP_GET_FW_CRASH_DUMP	(ISP_IOC | 10)
++#define	ISP_FORCE_CRASH_DUMP	(ISP_IOC | 11)
++
++/*
++ * Get information about this Host Adapter, including current connection
++ * topology and capabilities.
++ */
++struct isp_hba_device {
++	u_int32_t
++					: 8,
++					: 4,
++		fc_speed		: 4,	/* Gbps */
++					: 2,
++		fc_class2		: 1,
++		fc_ip_supported		: 1,
++		fc_scsi_supported	: 1,
++		fc_topology		: 3,
++		fc_loopid		: 8;
++	u_int64_t	nvram_node_wwn;
++	u_int64_t	nvram_port_wwn;
++	u_int64_t	active_node_wwn;
++	u_int64_t	active_port_wwn;
++};
++
++#define	ISP_TOPO_UNKNOWN	0	/* connection topology unknown */
++#define	ISP_TOPO_FCAL		1	/* private or PL_DA */
++#define	ISP_TOPO_LPORT		2	/* public loop */
++#define	ISP_TOPO_NPORT		3	/* N-port */
++#define	ISP_TOPO_FPORT		4	/* F-port */
++
++#define	ISP_FC_GETHINFO		(ISP_IOC|12)
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp_linux.c	2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,3015 @@
++/* @(#)isp_linux.c 1.66 */
++/*
++ * Qlogic ISP Host Adapter Common Bus Linux routies
++ *---------------------------------------
++ *
++ * Copyright (c) 1998, 1999, 2000, 2001 by Matthew Jacob
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification, immediately at the beginning of the file.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * the GNU Public License ("GPL").
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ * 
++ * Matthew Jacob
++ * Feral Software
++ * PMB #825
++ * 5214-F Diamond Hts Blvd
++ * San Francisco, CA, 94131
++ * mjacob@feral.com
++ *
++ *--------
++ * Bug fixes from Janice McLaughlin (janus@somemore.com)
++ * gratefully acknowledged.
++ *
++ */
++
++#define	ISP_MODULE	1
++#include "isp_linux.h"
++#include "linux/smp_lock.h"
++
++
++#if	LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
++#define	scsi_add_timer		_scsi_add_timer
++#define	scsi_delete_timer	_scsi_delete_timer
++static INLINE void _scsi_add_timer(Scsi_Cmnd *, int, void ((*)(Scsi_Cmnd *)));
++static INLINE int _scsi_delete_timer(Scsi_Cmnd *);
++
++static INLINE void
++scsi_add_timer(Scsi_Cmnd *SCset, int timeout, void (*complete)(Scsi_Cmnd *))
++{
++    if (SCset->eh_timeout.function != NULL) {
++	del_timer(&SCset->eh_timeout);
++    }
++    SCset->eh_timeout.data = (unsigned long) SCset;
++    SCset->eh_timeout.expires = jiffies + timeout;
++    SCset->eh_timeout.function = (void (*)(unsigned long))complete;
++    add_timer(&SCset->eh_timeout);
++}
++static INLINE int
++scsi_delete_timer(Scsi_Cmnd *SCset)
++{
++    if (SCset->eh_timeout.function != NULL) {
++	del_timer(&SCset->eh_timeout);
++    }
++    SCset->eh_timeout.data = 0UL;
++    SCset->eh_timeout.function = NULL;
++    return 0;
++}
++#else
++extern void scsi_add_timer(Scsi_Cmnd *, int, void ((*)(Scsi_Cmnd *)));
++extern int scsi_delete_timer(Scsi_Cmnd *);
++#endif
++static int isp_task_thread(void *);
++
++struct ispsoftc *isplist = NULL;
++const char *class3_roles[4] = {
++    "None", "Target", "Initiator", "Target/Initiator"
++};
++int isp_debug = 0;
++int isp_throttle = 0;
++int isp_cmd_per_lun = 0;
++int isp_unit_seed = 0;
++int isp_disable = 0;
++int isp_nofwreload = 0;
++int isp_nonvram = 0;
++int isp_maxluns = 8;
++int isp_fcduplex = 0;
++int isp_nport_only = 0;
++int isp_loop_only = 0;
++int isp_deadloop_time = 30;	/* how long to wait before assume loop dead */
++int isp_xtime = 0;
++int isp_default_frame_size;
++int isp_default_exec_throttle;
++
++static char *isp_roles;
++static char *isp_wwpns;
++static char *isp_wwnns;
++
++
++#ifdef	LINUX_ISP_TARGET_MODE
++#ifndef	ISP_PARENT_TARGET
++#define	ISP_PARENT_TARGET	scsi_target_handler
++#endif
++extern void ISP_PARENT_TARGET (qact_e, void *);
++static void isp_taction(qact_e, void *);
++static INLINE int nolunsenabled(struct ispsoftc *, int);
++static void isp_target_start_ctio(struct ispsoftc *, tmd_cmd_t *);
++static int isp_handle_platform_atio(struct ispsoftc *, at_entry_t *);
++static int isp_handle_platform_atio2(struct ispsoftc *, at2_entry_t *);
++static int isp_handle_platform_ctio(struct ispsoftc *, void *);
++static int isp_handle_platform_ctio_fastpost(struct ispsoftc *, u_int32_t);
++static void isp_target_putback_atio(struct ispsoftc *, tmd_cmd_t *);
++static void isp_complete_ctio(struct ispsoftc *, tmd_cmd_t *);
++#endif
++
++extern int isplinux_pci_detect(Scsi_Host_Template *);
++extern void isplinux_pci_release(struct Scsi_Host *);
++
++int
++isplinux_detect(Scsi_Host_Template *tmpt)
++{
++    int rval;
++#if	LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
++    extern struct proc_dir_entry proc_scsi_qlc;
++    tmpt->proc_dir = &proc_scsi_qlc;
++#else
++    tmpt->proc_name = "isp";
++#endif
++#if	LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++    spin_unlock_irq(&io_request_lock);
++    rval = isplinux_pci_detect(tmpt);
++    spin_lock_irq(&io_request_lock);
++#else
++    rval = isplinux_pci_detect(tmpt);
++#endif
++    return (rval);
++}
++
++/* io_request_lock *not* held here */
++int
++isplinux_release(struct Scsi_Host *host)
++{
++    struct ispsoftc *isp = (struct ispsoftc *) host->hostdata;
++#ifdef	ISP_TARGET_MODE
++    isp_detach_target(isp);
++#endif
++    if (isp->isp_osinfo.task_thread) {
++        SEND_THREAD_EVENT(isp, ISP_THREAD_EXIT, 1);
++    }
++    ISP_LOCKU_SOFTC(isp);
++    isp->isp_role = ISP_ROLE_NONE;
++    ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
++    if (IS_FC(isp)) {
++	ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS);
++	ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET);
++	ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS);
++	ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL);
++	ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS);
++    }
++    isp->dogactive = 0;
++    del_timer(&isp->isp_osinfo.timer);
++    DISABLE_INTS(isp);
++    if (isp->isp_bustype == ISP_BT_PCI) {
++	isplinux_pci_release(host);
++    }
++    ISP_UNLKU_SOFTC(isp);
++#ifdef	ISP_FW_CRASH_DUMP
++    if (FCPARAM(isp)->isp_dump_data) {
++	size_t amt;
++	if (IS_2200(isp))
++	    amt = QLA2200_RISC_IMAGE_DUMP_SIZE;
++	else
++	    amt = QLA2200_RISC_IMAGE_DUMP_SIZE;
++	isp_prt(isp, ISP_LOGCONFIG, "freeing crash dump area");
++	isp_kfree(FCPARAM(isp)->isp_dump_data, amt);
++	FCPARAM(isp)->isp_dump_data = 0;
++    }
++#if defined(CONFIG_PROC_FS) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++    /*
++     * Undo any PROCFS stuff
++     */
++    isplinux_undo_proc(isp);
++#endif
++    return (1);
++#endif
++}
++
++const char *
++isplinux_info(struct Scsi_Host *host)
++{
++    struct ispsoftc *isp = (struct ispsoftc *) host->hostdata;
++    if (IS_FC(isp)) {
++	static char *foo = "Driver for a Qlogic ISP 2X00 Host Adapter";
++	foo[26] = '0';
++	foo[27] = '0';
++	if (isp->isp_type == ISP_HA_FC_2100)
++	    foo[25] = '1';
++	else if (isp->isp_type == ISP_HA_FC_2200)
++	    foo[25] = '2';
++	else if (isp->isp_type == ISP_HA_FC_2300)
++	    foo[25] = '3';
++	else if (isp->isp_type == ISP_HA_FC_2312) {
++	    foo[25] = '3';
++	    foo[26] = '1';
++	    foo[27] = '2';
++	}
++	return (foo);
++    } else if (IS_1240(isp)) {
++	return ("Driver for a Qlogic ISP 1240 Host Adapter");
++    } else if (IS_1080(isp)) {
++	return ("Driver for a Qlogic ISP 1080 Host Adapter");
++    } else if (IS_1280(isp)) {
++	return ("Driver for a Qlogic ISP 1280 Host Adapter");
++    } else if (IS_10160(isp)) {
++	return ("Driver for a Qlogic ISP 10160 Host Adapter");
++    } else if (IS_12160(isp)) {
++	return ("Driver for a Qlogic ISP 12160 Host Adapter");
++    } else {
++	return ("Driver for a Qlogic ISP 1020/1040 Host Adapter");
++    }
++}
++
++static INLINE void
++isplinux_append_to_waitq(struct ispsoftc *isp, Scsi_Cmnd *Cmnd)
++{
++    /*
++     * If we're a fibre channel card and we consider the loop to be
++     * down, we just finish the command here and now.
++     */
++    if (IS_FC(isp) && isp->isp_deadloop) {
++	XS_INITERR(Cmnd);
++	XS_SETERR(Cmnd, DID_NO_CONNECT);
++
++	/*
++	 * Add back a timer else scsi_done drops this on the floor.
++	 */
++	scsi_add_timer(Cmnd, Cmnd->timeout_per_command, Cmnd->done);
++	isp_prt(isp, ISP_LOGDEBUG0, "giving up on target %d", XS_TGT(Cmnd));
++	ISP_UNLK_SOFTC(isp);
++	ISP_LOCK_SCSI_DONE(isp);
++	(*Cmnd->scsi_done)(Cmnd);
++	ISP_UNLK_SCSI_DONE(isp);
++	ISP_LOCK_SOFTC(isp);
++	return;
++    }
++
++    isp->isp_osinfo.wqcnt++;
++    if (isp->isp_osinfo.wqhiwater < isp->isp_osinfo.wqcnt)
++	isp->isp_osinfo.wqhiwater = isp->isp_osinfo.wqcnt;
++    if (isp->isp_osinfo.wqnext == NULL) {
++	isp->isp_osinfo.wqtail = isp->isp_osinfo.wqnext = Cmnd;
++    } else {
++	isp->isp_osinfo.wqtail->host_scribble = (unsigned char *) Cmnd;
++	isp->isp_osinfo.wqtail = Cmnd;
++    }
++    Cmnd->host_scribble = NULL;
++
++
++    /*
++     * Stop the clock for this command.
++     */
++    (void) scsi_delete_timer(Cmnd);
++}
++
++static INLINE void
++isplinux_insert_head_waitq(struct ispsoftc *isp, Scsi_Cmnd *Cmnd)
++{
++    isp->isp_osinfo.wqcnt++;
++    if (isp->isp_osinfo.wqnext == NULL) {
++	isp->isp_osinfo.wqtail = isp->isp_osinfo.wqnext = Cmnd;
++	Cmnd->host_scribble = NULL;
++    } else {
++	Cmnd->host_scribble = (unsigned char *) isp->isp_osinfo.wqnext;
++	isp->isp_osinfo.wqnext = Cmnd;
++    }
++}
++
++static INLINE Scsi_Cmnd *
++isp_remove_from_waitq(Scsi_Cmnd *Cmnd)
++{
++    struct ispsoftc *isp;
++    Scsi_Cmnd *f;
++    if (Cmnd == NULL)
++	return (Cmnd);
++    isp = XS_ISP(Cmnd);
++    if ((f = isp->isp_osinfo.wqnext) == Cmnd) {
++	isp->isp_osinfo.wqnext = (Scsi_Cmnd *) Cmnd->host_scribble;
++    } else {
++	Scsi_Cmnd *b = f;
++	while (f) {
++	    f = (Scsi_Cmnd *) b->host_scribble;
++	    if (f == Cmnd) {
++		b->host_scribble = f->host_scribble;
++		if (isp->isp_osinfo.wqtail == Cmnd)
++		     isp->isp_osinfo.wqtail = b;
++		break;
++	    }
++	    b = f;
++	}
++    }
++    if (f) {
++	f->host_scribble = NULL;
++	isp->isp_osinfo.wqcnt -= 1;
++    }
++    return (f);
++}
++
++static INLINE void
++isplinux_runwaitq(struct ispsoftc *isp)
++{
++    Scsi_Cmnd *f;
++    if (isp->isp_blocked || isp->isp_draining)
++	return;
++    while ((f = isp_remove_from_waitq(isp->isp_osinfo.wqnext)) != NULL) {
++	int result = isp_start(f);
++	/*
++	 * Restart the timer for this command if it is queued or completing.
++	 */
++	if (result == CMD_QUEUED || result == CMD_COMPLETE) {
++	    int ntime = f->timeout_per_command * (isp_xtime? isp_xtime : 1);
++	    scsi_add_timer(f, ntime, f->done);
++	}
++	if (result == CMD_QUEUED) {
++	    if (isp->isp_osinfo.hiwater < isp->isp_nactive)
++		isp->isp_osinfo.hiwater = isp->isp_nactive;
++	    continue;
++	}
++
++	/*
++	 * If we cannot start a command on a fibre channel card, it means
++	 * that loop state isn't ready for us to do so. Activate the FC
++	 * thread to rediscover loop and fabric residency- but not if
++	 * we consider the loop to be dead. If the loop is considered dead,
++	 * we wait until a PDB Changed after a Loop UP activates the FC
++	 * thread.
++	 */
++	if (result == CMD_RQLATER && IS_FC(isp) && isp->isp_deadloop == 0) {
++	    SEND_THREAD_EVENT(isp, ISP_THREAD_FC_RESCAN, 0);
++	}
++
++	/*
++	 * Put the command back on the wait queue. Don't change any
++	 * timer parameters for it because they were established
++	 * when we originally put the command on the waitq in the first
++	 * place.
++	 */
++	if (result == CMD_EAGAIN || result == CMD_RQLATER) {
++	    isplinux_insert_head_waitq(isp, f);
++	    break;
++	}
++	if (result == CMD_COMPLETE) {
++	    isp_done(f);
++	} else {
++	    panic("isplinux_runwaitq: result %d", result);
++	}
++    }
++}
++
++static INLINE void
++isplinux_flushwaitq(struct ispsoftc *isp)
++{
++    Scsi_Cmnd *Cmnd, *Ncmnd;
++   
++    if ((Cmnd = isp->isp_osinfo.wqnext) == NULL) {
++	return;
++    }
++    isp->isp_osinfo.wqnext = isp->isp_osinfo.wqtail = NULL;
++    isp->isp_osinfo.wqcnt = 0;
++    ISP_UNLK_SOFTC(isp);
++    do {
++        Ncmnd = (Scsi_Cmnd *) Cmnd->host_scribble;
++        Cmnd->host_scribble = NULL;
++	XS_INITERR(Cmnd);
++	XS_SETERR(Cmnd, DID_NO_CONNECT);
++	/*
++	 * Add back a timer else scsi_done drops this on the floor.
++	 */
++	scsi_add_timer(Cmnd, Cmnd->timeout_per_command, Cmnd->done);
++	ISP_LOCK_SCSI_DONE(isp);
++	(*Cmnd->scsi_done)(Cmnd);
++	ISP_UNLK_SCSI_DONE(isp);
++    } while ((Cmnd = Ncmnd) != NULL);
++    ISP_LOCK_SOFTC(isp);
++}
++
++static INLINE Scsi_Cmnd *
++isplinux_remove_from_doneq(Scsi_Cmnd *Cmnd)
++{
++    Scsi_Cmnd *f;
++    struct ispsoftc *isp;
++
++    if (Cmnd == NULL)
++	return (NULL);
++    isp = XS_ISP(Cmnd);
++    if (isp->isp_osinfo.dqnext == NULL)
++	return (NULL);
++    if ((f = isp->isp_osinfo.dqnext) == Cmnd) {
++	isp->isp_osinfo.dqnext = (Scsi_Cmnd *) Cmnd->host_scribble;
++    } else {
++	Scsi_Cmnd *b = f;
++	while (f) {
++	    f = (Scsi_Cmnd *) b->host_scribble;
++	    if (f == Cmnd) {
++		b->host_scribble = f->host_scribble;
++		if (isp->isp_osinfo.dqtail == Cmnd)
++		     isp->isp_osinfo.dqtail = b;
++		break;
++	    }
++	    b = f;
++	}
++    }
++    if (f) {
++	f->host_scribble = NULL;
++    }
++    return (f);
++}
++
++int
++isplinux_queuecommand(Scsi_Cmnd *Cmnd, void (*donecmd)(Scsi_Cmnd *))
++{
++    struct Scsi_Host *host = XS_HOST(Cmnd);
++    struct ispsoftc *isp = (struct ispsoftc *) (host->hostdata);
++    int result;
++
++
++    Cmnd->scsi_done = donecmd;
++    Cmnd->sense_buffer[0] = 0;
++    if (isp_xtime) {
++	Cmnd->timeout *= isp_xtime;
++    }
++
++    ISP_DRIVER_ENTRY_LOCK(isp);
++    ISP_LOCK_SOFTC(isp);
++
++    /*
++     * First off, see whether we need to (re)init the HBA.
++     * If we need to and fail to, pretend that this was a selection timeout.
++     */
++    if (isp->isp_state != ISP_RUNSTATE) {
++	if (isp->isp_role != ISP_ROLE_NONE) {
++	    isplinux_reinit(isp);
++	}
++	if (isp->isp_state != ISP_RUNSTATE) {
++	    ISP_UNLK_SOFTC(isp);
++	    ISP_DRIVER_EXIT_LOCK(isp);
++	    XS_INITERR(Cmnd);
++	    XS_SETERR(Cmnd, DID_NO_CONNECT);
++	    (*Cmnd->scsi_done)(Cmnd);
++	    return (0);
++	}
++    }
++
++
++   /*
++    * See if we're currently blocked. If we are, just queue up the command
++    * to be run later.
++    */
++   if (isp->isp_blocked || isp->isp_draining) {
++	isplinux_append_to_waitq(isp, Cmnd);
++	ISP_UNLK_SOFTC(isp);
++	ISP_DRIVER_EXIT_LOCK(isp);
++	return (0);
++   }
++
++   /*
++    * Next see if we have any stored up commands to run. If so, run them.
++    * If we get back from this with commands still ready to run, put the
++    * current command at the tail of waiting commands to be run later.
++    */
++
++    isplinux_runwaitq(isp);
++    if (isp->isp_osinfo.wqnext) {
++	isplinux_append_to_waitq(isp, Cmnd);
++	ISP_UNLK_SOFTC(isp);
++	ISP_DRIVER_EXIT_LOCK(isp);
++	return (0);
++    }
++
++   /*
++    * Finally, try and run this command.
++    */
++
++    result = isp_start(Cmnd);
++    if (result == CMD_QUEUED) {
++	if (isp->isp_osinfo.hiwater < isp->isp_nactive)
++	    isp->isp_osinfo.hiwater = isp->isp_nactive;
++	result = 0;
++	if (isp_xtime) {
++		int ntime = isp_xtime * Cmnd->timeout_per_command;
++		scsi_delete_timer(Cmnd);
++		scsi_add_timer(Cmnd, ntime, Cmnd->done);
++	}
++    } else if (result == CMD_EAGAIN) {
++	/*
++	 * We ran out of request queue space (or could not
++	 * get DMA resources). Tell the upper layer to try
++	 * later.
++	 */
++	result = 1;
++    } else if (result == CMD_RQLATER) {
++	/*
++	 * Temporarily hold off on this one.
++	 * Typically this means for fibre channel
++	 * that the loop is down or we're processing
++	 * some other change (e.g., fabric membership
++	 * change)
++	 */
++	isplinux_append_to_waitq(isp, Cmnd);
++	if (IS_FC(isp) && isp->isp_deadloop == 0) {
++	    SEND_THREAD_EVENT(isp, ISP_THREAD_FC_RESCAN, 0);
++	}
++	result = 0;
++    } else if (result == CMD_COMPLETE) {
++	result = -1;
++    } else {
++	panic("unknown return code %d from isp_start", result);
++    }
++    ISP_UNLK_SOFTC(isp);
++    ISP_DRIVER_EXIT_LOCK(isp);
++    if (result == -1) {
++	Cmnd->result &= ~0xff;
++	Cmnd->result |= Cmnd->SCp.Status;
++        Cmnd->host_scribble = NULL;
++	(*Cmnd->scsi_done)(Cmnd);
++	result = 0;
++    }
++    return (result);
++}
++
++static INLINE void isplinux_scsi_probe_done(Scsi_Cmnd *);
++
++static INLINE void
++isplinux_scsi_probe_done(Scsi_Cmnd *Cmnd)
++{
++    struct ispsoftc *isp = XS_ISP(Cmnd);
++
++    /*
++     * If we haven't seen this target yet, check the command result. If
++     * it was an inquiry and it succeeded okay, then we can update our
++     * notions about this target's capabilities.
++     *
++     * If the command did *not* succeed, we also update our notions about
++     * this target's capabilities (pessimistically) - it's probably not there.
++     * All of this so we can know when we're done so we stop wasting cycles
++     * seeing whether we can enable sync mode or not.
++     */
++
++    if (isp->isp_psco[XS_CHANNEL(Cmnd)][XS_TGT(Cmnd)] == 0) {
++	int i, b;
++	caddr_t iqd;
++	sdparam *sdp = (sdparam *) isp->isp_param;
++
++	sdp += XS_CHANNEL(Cmnd);
++	if (Cmnd->cmnd[0] == 0x12 && host_byte(Cmnd->result) == DID_OK) {
++	    if (Cmnd->use_sg == 0) {
++		iqd = (caddr_t) Cmnd->buffer;
++	    } else {
++#if	LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++		iqd = ((struct scatterlist *) Cmnd->request_buffer)->address;
++#else
++		struct scatterlist *sg;
++		sg = (struct scatterlist *) Cmnd->request_buffer;
++		iqd = page_address(sg->page) + sg->offset;
++#endif
++	    }
++	    sdp->isp_devparam[XS_TGT(Cmnd)].goal_flags &=
++		~(DPARM_TQING|DPARM_SYNC|DPARM_WIDE);
++	    if (iqd[7] & 0x2) {
++		sdp->isp_devparam[XS_TGT(Cmnd)].goal_flags |= DPARM_TQING;
++	    }
++	    if (iqd[7] & 0x10) {
++		sdp->isp_devparam[XS_TGT(Cmnd)].goal_flags |= DPARM_SYNC;
++	    }
++	    if (iqd[7] & 0x20) {
++		sdp->isp_devparam[XS_TGT(Cmnd)].goal_flags |= DPARM_WIDE;
++	    }
++	    sdp->isp_devparam[XS_TGT(Cmnd)].dev_update = 1;
++	    isp->isp_psco[XS_CHANNEL(Cmnd)][XS_TGT(Cmnd)] = 1;
++	} else if (host_byte(Cmnd->result) != DID_OK) {
++	    isp->isp_psco[XS_CHANNEL(Cmnd)][XS_TGT(Cmnd)] = 1;
++	}
++
++	isp->isp_dutydone = 1;
++	for (b = 0; b < (IS_DUALBUS(isp)?2 : 1) && isp->isp_dutydone; b++) {
++	    for (i = 0; i < MAX_TARGETS; i++) {
++		if (i != sdp->isp_initiator_id) {
++		    if (isp->isp_psco[b][i] == 0) {
++			isp->isp_dutydone = 0;
++			break;
++		    }
++		}
++	    }
++	}
++
++	/*
++	 * Have we scanned all busses and all targets? You only get
++	 * one chance (per reset) to see what devices on this bus have
++	 * to offer.
++	 */
++	if (isp->isp_dutydone) {
++	    for (b = 0; b < (IS_DUALBUS(isp)?2 : 1) && isp->isp_dutydone; b++) {
++		for (i = 0; i < MAX_TARGETS; i++) {
++		    isp->isp_psco[b][i] = 0;
++		}
++		isp->isp_update |= (1 << b);
++	    }
++	}	    
++    }
++}
++
++void
++isp_done(Scsi_Cmnd *Cmnd)
++{
++    struct ispsoftc *isp = XS_ISP(Cmnd);
++
++    if (IS_SCSI(isp) && isp->isp_dutydone == 0)  {
++	isplinux_scsi_probe_done(Cmnd);
++    }
++
++    Cmnd->result &= ~0xff;
++    Cmnd->result |= Cmnd->SCp.Status;
++
++    if (Cmnd->SCp.Status != GOOD) {
++	isp_prt(isp, ISP_LOGDEBUG0, "%d.%d.%d: cmd finishes with status 0x%x",
++	    XS_CHANNEL(Cmnd), XS_TGT(Cmnd), XS_LUN(Cmnd), Cmnd->SCp.Status);
++    }
++
++#if	LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,99)
++    Cmnd->resid = XS_RESID(Cmnd);
++#endif
++    /*
++     * Queue command on completion queue.
++     */
++    if (isp->isp_osinfo.dqnext == NULL) {
++	isp->isp_osinfo.dqnext = Cmnd;
++    } else {
++	isp->isp_osinfo.dqtail->host_scribble = (unsigned char *) Cmnd;
++    }
++    isp->isp_osinfo.dqtail = Cmnd;
++    Cmnd->host_scribble = NULL;
++}
++
++/*
++ * Error handling routines
++ */
++
++int
++isplinux_abort(Scsi_Cmnd *Cmnd)
++{
++    struct ispsoftc *isp;
++    u_int16_t handle;
++
++    if (Cmnd == NULL || XS_HOST(Cmnd) == NULL) {
++	return (FAILED);
++    }
++
++    isp = XS_ISP(Cmnd);
++    if (Cmnd->serial_number != Cmnd->serial_number_at_timeout) {
++	isp_prt(isp, ISP_LOGWARN, "isplinux_abort: serial number mismatch");
++	return (FAILED);
++    }
++    ISP_DRIVER_ENTRY_LOCK(isp);
++    ISP_LOCKU_SOFTC(isp);
++    handle = isp_find_handle(isp, Cmnd);
++    if (handle == 0) {
++	int wqfnd = 0;
++	Scsi_Cmnd *NewCmnd = isp_remove_from_waitq(Cmnd);
++	if (NewCmnd == NULL) {
++		NewCmnd = isplinux_remove_from_doneq(Cmnd);
++		wqfnd++;
++	}
++	ISP_UNLKU_SOFTC(isp);
++	isp_prt(isp, ISP_LOGINFO,
++	    "isplinux_abort: found %d:%p for non-running cmd for %d.%d.%d",
++	    wqfnd, NewCmnd, XS_CHANNEL(Cmnd), XS_TGT(Cmnd), XS_LUN(Cmnd));
++	if (NewCmnd == NULL) {
++	    ISP_DRIVER_EXIT_LOCK(isp);
++	    return (FAILED);
++	}
++    } else {
++	if (isp_control(isp, ISPCTL_ABORT_CMD, Cmnd)) {
++	    ISP_UNLKU_SOFTC(isp);
++	    ISP_DRIVER_EXIT_LOCK(isp);
++	    return (FAILED);
++	}
++	if (isp->isp_nactive > 0)
++	    isp->isp_nactive--;
++	isp_destroy_handle(isp, handle);
++	ISP_UNLKU_SOFTC(isp);
++	ISP_DRIVER_EXIT_LOCK(isp);
++	isp_prt(isp, ISP_LOGINFO,
++	    "isplinux_abort: aborted running cmd (handle 0x%x) for %d.%d.%d",
++	    handle, XS_CHANNEL(Cmnd), XS_TGT(Cmnd), XS_LUN(Cmnd));
++    }
++    Cmnd->result = DID_ABORT << 16;
++    (*Cmnd->scsi_done)(Cmnd);
++    return (SUCCESS);
++}
++
++/*
++ * XXX: What does the midlayer expect for commands in process?
++ * XXX: Are we supposed to clean up dead commands ourselves?
++ */
++int
++isplinux_bdr(Scsi_Cmnd *Cmnd)
++{
++    struct ispsoftc *isp;
++    int arg;
++
++    if (Cmnd == NULL || XS_HOST(Cmnd) == NULL) {
++	return (FAILED);
++    }
++
++    isp = XS_ISP(Cmnd);
++    arg = XS_CHANNEL(Cmnd) << 16 | XS_TGT(Cmnd);
++    ISP_DRIVER_ENTRY_LOCK(isp);
++    ISP_LOCKU_SOFTC(isp);
++    arg = isp_control(isp, ISPCTL_RESET_DEV, &arg);
++    ISP_UNLKU_SOFTC(isp);
++    ISP_DRIVER_EXIT_LOCK(isp);
++    isp_prt(isp, ISP_LOGINFO, "Bus Device Reset %succesfully sent to %d.%d.%d",
++	arg == 0? "s" : "uns", XS_CHANNEL(Cmnd), XS_TGT(Cmnd), XS_LUN(Cmnd));
++    return ((arg == 0)? SUCCESS : FAILED);
++}
++
++/*
++ * XXX: What does the midlayer expect for commands in process?
++ */
++int
++isplinux_sreset(Scsi_Cmnd *Cmnd)
++{
++    struct ispsoftc *isp;
++    int arg;
++
++    if (Cmnd == NULL || XS_HOST(Cmnd) == NULL)
++	return (FAILED);
++
++    isp = XS_ISP(Cmnd);
++    arg = XS_CHANNEL(Cmnd);
++    ISP_DRIVER_ENTRY_LOCK(isp);
++    ISP_LOCKU_SOFTC(isp);
++    arg = isp_control(isp, ISPCTL_RESET_BUS, &arg);
++    ISP_UNLKU_SOFTC(isp);
++    ISP_DRIVER_EXIT_LOCK(isp);
++    isp_prt(isp, ISP_LOGINFO, "SCSI Bus Reset on Channel %d %succesful",
++	XS_CHANNEL(Cmnd), arg == 0? "s" : "uns");
++    return ((arg == 0)? SUCCESS : FAILED);
++}
++
++/*
++ * We call completion on any commands owned here-
++ * except the one we were called with.
++ */
++int
++isplinux_hreset(Scsi_Cmnd *Cmnd)
++{
++    Scsi_Cmnd *tmp, *dq, *wq, *xqf, *xql;
++    struct ispsoftc *isp;
++    u_int16_t handle;
++
++    if (Cmnd == NULL || XS_HOST(Cmnd) == NULL)
++	return (FAILED);
++
++    isp = XS_ISP(Cmnd);
++
++    isp_prt(isp, ISP_LOGINFO, "Resetting Host Adapter");
++
++    ISP_DRIVER_ENTRY_LOCK(isp);
++    ISP_LOCKU_SOFTC(isp);
++
++    /*
++     * Save pending, running, and completed commands.
++     */
++    xql = xqf = NULL;
++    for (handle = 1; handle <= isp->isp_maxcmds; handle++) {
++	tmp = isp_find_xs(isp, handle);
++	if (tmp == NULL) {
++	    continue;
++        }
++	isp_destroy_handle(isp, handle);
++	tmp->host_scribble = NULL;
++	if (xqf) {
++	    xql->host_scribble = (unsigned char *) tmp;
++	} else {
++	    xqf = xql = tmp;
++	}
++        xql = tmp;
++    }
++    dq = isp->isp_osinfo.dqnext;
++    isp->isp_osinfo.dqnext = NULL;
++    wq = isp->isp_osinfo.wqnext;
++    isp->isp_osinfo.wqnext = NULL;
++    isp->isp_nactive = 0;
++
++    isplinux_reinit(isp);
++
++    ISP_UNLKU_SOFTC(isp);
++    ISP_DRIVER_EXIT_LOCK(isp);
++
++    /*
++     * Call completion on the detritus, skipping the one we were called with.
++     */
++    while ((tmp = xqf) != NULL) {
++	xqf = (Scsi_Cmnd *) tmp->host_scribble;
++	tmp->host_scribble = NULL;
++	if (tmp == Cmnd)
++	    continue;
++	tmp->result = DID_RESET << 16;
++	/*
++	 * Get around silliness in midlayer.
++	 */
++	tmp->flags |= IS_RESETTING;
++	if (tmp->scsi_done)
++	    (*tmp->scsi_done)(tmp);
++    }
++    while ((tmp = wq) != NULL) {
++	wq = (Scsi_Cmnd *) tmp->host_scribble;
++	tmp->host_scribble = NULL;
++	if (tmp == Cmnd)
++	    continue;
++	tmp->result = DID_RESET << 16;
++	/*
++	 * Get around silliness in midlayer.
++	 */
++	tmp->flags |= IS_RESETTING;
++	if (tmp->scsi_done)
++	    (*tmp->scsi_done)(tmp);
++    }
++    while ((tmp = dq) != NULL) {
++	dq = (Scsi_Cmnd *) tmp->host_scribble;
++	tmp->host_scribble = NULL;
++	if (tmp == Cmnd)
++	    continue;
++	tmp->result = DID_RESET << 16;
++	/*
++	 * Get around silliness in midlayer.
++	 */
++	tmp->flags |= IS_RESETTING;
++	if (tmp->scsi_done)
++	    (*tmp->scsi_done)(tmp);
++    }
++    Cmnd->result = DID_RESET << 16;
++    return (SUCCESS);
++}
++
++
++#ifdef	LINUX_ISP_TARGET_MODE
++void
++isp_attach_target(struct ispsoftc *isp)
++{
++    int i;
++    hba_register_t hba;
++
++    isp->isp_osinfo.pool = isp_kzalloc(NTGT_CMDS * TMD_SIZE, GFP_KERNEL);
++    if (isp->isp_osinfo.pool == NULL) {
++	isp_prt(isp, ISP_LOGERR, "cannot allocate TMD structures");
++	return;
++    }
++    for (i = 0; i < NTGT_CMDS-1; i++) {
++	isp->isp_osinfo.pool[i].cd_private = &isp->isp_osinfo.pool[i+1];
++    }
++    isp->isp_osinfo.pending_t = NULL;
++    isp->isp_osinfo.tfreelist = isp->isp_osinfo.pool;
++
++    hba.r_identity = isp;
++    sprintf(hba.r_name, "isp");
++    hba.r_inst = isp->isp_unit;
++    hba.r_version = QR_VERSION;
++    hba.r_action = (void (*)(tact_e, void *))isp_taction;
++    if (IS_FC(isp)) {
++	hba.r_type = R_FC;
++    } else{
++	hba.r_type = R_SCSI;
++    }
++    ISP_UNLKU_SOFTC(isp);
++    ISP_PARENT_TARGET(QOUT_HBA_REG, &hba);
++    ISP_LOCKU_SOFTC(isp);
++}
++
++void
++isp_detach_target(struct ispsoftc *isp)
++{
++    hba_register_t hba;
++
++    hba.r_identity = isp;
++    sprintf(hba.r_name, "isp");
++    hba.r_inst = isp->isp_unit;
++    hba.r_version = QR_VERSION;
++    hba.r_action = (void (*)(tact_e, void *))isp_taction;
++    if (IS_FC(isp)) {
++	hba.r_type = R_FC;
++    } else{
++	hba.r_type = R_SCSI;
++    }
++    ISP_PARENT_TARGET(QOUT_HBA_UNREG, &hba);
++    if (isp->isp_osinfo.pool) {
++	isp_kfree(isp->isp_osinfo.pool, NTGT_CMDS * TMD_SIZE);
++	isp->isp_osinfo.pool = 0;
++    }
++}
++
++static void
++isp_taction(qact_e action, void *arg)
++{
++    tmd_cmd_t *tmd;
++    struct ispsoftc *isp;
++
++    switch (action) {
++    case QIN_HBA_REG:
++    {
++	hba_register_t *hp = (hba_register_t *) arg;
++	isp = hp->r_identity;
++	isp_prt(isp, ISP_LOGINFO, "completed target registration");
++	ISP_LOCK_SOFTC(isp);
++	isp->isp_osinfo.hcb = 1;
++	ISP_UNLK_SOFTC(isp);
++	ISP_PARENT_TARGET(QOUT_HBA_REG, hp);
++	break;
++    }
++    case QIN_ENABLE:
++    case QIN_DISABLE:
++    {
++	enadis_t *ep = arg;
++	int bus, lun, tgt, chan;
++
++	isp = ep->cd_hba;
++	bus = (int) ep->cd_chan;
++	lun = (int) ep->cd_lun;
++	tgt = (int) ep->cd_tgt;
++	chan = (int) ep->cd_chan;
++	ep->cd_error = isp_en_dis_lun(isp, (action == QIN_ENABLE)? 1 : chan,
++	    bus, tgt, lun);
++	ISP_PARENT_TARGET(action, ep);
++	break;
++    }
++    case QIN_TMD_CONT:
++	tmd = (tmd_cmd_t *) arg;
++	isp = tmd->cd_hba;
++	isp_target_start_ctio(isp, tmd);
++	break;
++
++    case QIN_TMD_FIN:
++	tmd = (tmd_cmd_t *) arg;
++	isp = tmd->cd_hba;
++	MEMZERO(tmd, TMD_SIZE);
++	ISP_LOCK_SOFTC(isp);
++	tmd->cd_private = isp->isp_osinfo.tfreelist;
++	isp->isp_osinfo.tfreelist = tmd;
++	ISP_UNLK_SOFTC(isp);
++	break;
++
++    case QIN_IOCTL:
++    {
++	ioctl_cmd_t *ip = arg;
++	ip->i_errno = ENOTTY;
++	ISP_PARENT_TARGET(QOUT_IOCTL, ip);
++  	break;
++    }
++    case QIN_HBA_UNREG:
++    {
++	hba_register_t *hp = (hba_register_t *) arg;
++	isp = hp->r_identity;
++	isp->isp_osinfo.hcb = 0;
++	ISP_PARENT_TARGET(QOUT_HBA_REG, hp);
++	break;
++    }
++    default:
++	break;
++   }
++}
++
++static INLINE int
++nolunsenabled(struct ispsoftc *isp, int port)
++{
++    int i, wbase, wend;
++
++    if (IS_FC(isp)) {
++	wbase = 0;
++	wend = TM_MAX_LUN_FC >> 5;
++    } else {
++	if (port) {
++		wend = TM_MAX_LUN_FC >> 5;
++		wbase = wend >> 1;
++	} else {
++		wend = (TM_MAX_LUN_FC >> 5) >> 1;
++		wbase = 0;
++	}
++    }
++    for (i = wbase; i < wend; i++) {
++	if (isp->isp_osinfo.lunbmap[i]) {
++	    return (0);
++	}
++    }
++    return (1);
++}
++
++
++
++static void
++isp_target_start_ctio(struct ispsoftc *isp, tmd_cmd_t *tmd)
++{
++    void *qe;
++    u_int16_t *hp, save_handle;
++    u_int32_t *rp;
++    u_int16_t nxti, optr;
++    u_int8_t local[QENTRY_LEN];
++
++    /*
++     * If the transfer length is zero, we have to be sending status.
++     * If we're sending data, we have to have one and only one data
++     * direction set.
++     */
++    if (tmd->cd_xfrlen == 0) {
++	if ((tmd->cd_hflags & CDFH_STSVALID) == 0) {
++	    isp_prt(isp, ISP_LOGERR, "CTIO, no data, and no status is wrong");
++	    tmd->cd_error = -EINVAL;
++	    tmd->cd_lflags |= CDFL_ERROR;
++	    return;
++	}
++    } else {
++	if ((tmd->cd_hflags & CDFH_DATA_MASK) == 0) {
++	    isp_prt(isp, ISP_LOGERR, "data CTIO with no direction is wrong");
++	    tmd->cd_error = -EINVAL;
++	    tmd->cd_lflags |= CDFL_ERROR;
++	    return;
++	}
++	if ((tmd->cd_hflags & CDFH_DATA_MASK) == CDFH_DATA_MASK) {
++	    isp_prt(isp, ISP_LOGERR, "data CTIO with both directions is wrong");
++	    tmd->cd_error = -EINVAL;
++	    tmd->cd_lflags |= CDFL_ERROR;
++	    return;
++	}
++    }
++    tmd->cd_lflags &= ~CDFL_ERROR;
++    MEMZERO(local, QENTRY_LEN);
++
++    ISP_LOCK_SOFTC(isp);
++    if (isp_getrqentry(isp, &nxti, &optr, &qe)) {
++	isp_prt(isp, ISP_LOGWARN,
++	    "isp_target_start_ctio: request queue overflow");
++	tmd->cd_error = -ENOMEM;
++	tmd->cd_lflags |= CDFL_ERROR;
++	ISP_UNLK_SOFTC(isp);
++	return;
++    }
++
++    /*
++     * We're either moving data or completing a command here (or both).
++     */
++
++    if (IS_FC(isp)) {
++	ct2_entry_t *cto = (ct2_entry_t *) local;
++	u_int16_t *ssptr = NULL;
++
++	cto->ct_header.rqs_entry_type = RQSTYPE_CTIO2;
++	cto->ct_header.rqs_entry_count = 1;
++	cto->ct_iid = tmd->cd_iid;
++	if ((FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) == 0)
++		cto->ct_lun = tmd->cd_lun;
++	else
++		cto->ct_lun = 0;
++	cto->ct_rxid = tmd->cd_tagval;
++	if (cto->ct_rxid == 0) {
++	    isp_prt(isp, ISP_LOGERR, "a tagval of zero is not acceptable");
++	    tmd->cd_error = -EINVAL;
++	    tmd->cd_lflags |= CDFL_ERROR;
++	    ISP_UNLK_SOFTC(isp);
++	    return;
++	}
++	cto->ct_flags = CT2_FASTPOST;
++
++	if (tmd->cd_xfrlen == 0) {
++	    cto->ct_flags |= CT2_FLAG_MODE1 | CT2_NO_DATA | CT2_SENDSTATUS;
++	    ssptr = &cto->rsp.m1.ct_scsi_status;
++	    *ssptr = tmd->cd_scsi_status;
++	    if ((tmd->cd_hflags & CDFH_SNSVALID) != 0) {
++		MEMCPY(cto->rsp.m1.ct_resp, tmd->cd_sense, QLTM_SENSELEN);
++		cto->rsp.m1.ct_senselen = QLTM_SENSELEN;
++		cto->rsp.m1.ct_scsi_status |= CT2_SNSLEN_VALID;
++	    }
++	} else {
++	    cto->ct_flags |= CT2_FLAG_MODE0;
++	    if (tmd->cd_hflags & CDFH_DATA_IN) {
++		cto->ct_flags |= CT2_DATA_IN;
++	    } else {
++		cto->ct_flags |= CT2_DATA_OUT;
++	    }
++	    if (tmd->cd_hflags & CDFH_STSVALID) {
++		ssptr = &cto->rsp.m0.ct_scsi_status;
++		cto->ct_flags |= CT2_SENDSTATUS;
++		cto->rsp.m0.ct_scsi_status = tmd->cd_scsi_status;
++		/*
++		 * It will be up to the low level mapping routine
++		 * to check for sense data.
++		 */
++	    }
++	    /*
++	     * We assume we'll transfer what we say we'll transfer.
++	     * It should get added back in if we fail.
++	     */
++	    tmd->cd_resid -= tmd->cd_xfrlen;
++	}
++
++	if (ssptr && tmd->cd_resid) {
++	    cto->ct_resid = tmd->cd_resid;
++	    *ssptr |= CT2_DATA_UNDER;
++	} else {
++	    cto->ct_resid = 0;
++	}
++	isp_prt(isp, ISP_LOGTDEBUG0,
++	    "CTIO2[%x] ssts %x flags %x resid %d",
++	    cto->ct_rxid, tmd->cd_scsi_status, cto->ct_flags, cto->ct_resid);
++	hp = &cto->ct_syshandle;
++	rp = &cto->ct_resid;
++	if (cto->ct_flags & CT2_SENDSTATUS) {
++	    cto->ct_flags |= CT2_CCINCR;
++	}
++    } else {
++	ct_entry_t *cto = (ct_entry_t *) local;
++
++	cto->ct_header.rqs_entry_type = RQSTYPE_CTIO;
++	cto->ct_header.rqs_entry_count = 1;
++	cto->ct_iid = tmd->cd_iid;
++	cto->ct_tgt = tmd->cd_tgt;
++	cto->ct_lun = tmd->cd_lun;
++	cto->ct_flags = 0;
++	cto->ct_fwhandle = AT_GET_HANDLE(tmd->cd_tagval);
++	if (AT_HAS_TAG(tmd->cd_tagval)) {
++	    cto->ct_tag_val = AT_GET_TAG(tmd->cd_tagval);
++	    cto->ct_flags |= CT_TQAE;
++	}
++	if (tmd->cd_lflags & CDFL_NODISC) {
++	    cto->ct_flags |= CT_NODISC;
++	}
++	if (tmd->cd_xfrlen == 0) {
++	    cto->ct_flags |= CT_NO_DATA | CT_SENDSTATUS;
++	    cto->ct_scsi_status = tmd->cd_scsi_status;
++	    cto->ct_resid = 0;
++	} else {
++	    if (tmd->cd_hflags & CDFH_STSVALID) {
++		cto->ct_flags |= CT_SENDSTATUS;
++	    }
++	    if (tmd->cd_hflags & CDFH_DATA_IN) {
++		cto->ct_flags |= CT_DATA_IN;
++	    } else {
++		cto->ct_flags |= CT_DATA_OUT;
++	    }
++	    /*
++	     * We assume we'll transfer what we say we'll transfer.
++	     * Otherwise, the command is dead.
++	     */
++	    tmd->cd_resid -= tmd->cd_xfrlen;
++	    if (tmd->cd_hflags & CDFH_STSVALID) {
++		cto->ct_resid = tmd->cd_resid;
++	    }
++	}
++	isp_prt(isp, ISP_LOGTDEBUG0, "CTIO[%x] ssts %x resid %d cd_hflags %x",
++	    AT_GET_HANDLE(tmd->cd_tagval), tmd->cd_scsi_status, tmd->cd_resid,
++	    tmd->cd_hflags);
++	hp = &cto->ct_syshandle;
++	rp = &cto->ct_resid;
++	if (cto->ct_flags & CT_SENDSTATUS) {
++	    cto->ct_flags |= CT_CCINCR;
++	}
++    }
++
++    if (isp_save_xs(isp, (XS_T *)tmd, hp)) {
++	isp_prt(isp, ISP_LOGERR, "isp_target_start_ctio: No XFLIST pointers");
++	tmd->cd_error = -ENOMEM;
++	tmd->cd_lflags |= CDFL_ERROR;
++	ISP_UNLK_SOFTC(isp);
++	ISP_PARENT_TARGET(QOUT_TMD_DONE, tmd);
++	return;
++    }
++
++    /*
++     * Call the dma setup routines for this entry (and any subsequent
++     * CTIOs) if there's data to move, and then tell the f/w it's got
++     * new things to play with. As with isp_start's usage of DMA setup,
++     * any swizzling is done in the machine dependent layer. Because
++     * of this, we put the request onto the queue area first in native
++     * format.
++     */
++
++    save_handle = *hp;
++    switch (ISP_DMASETUP(isp, (XS_T *)tmd, (ispreq_t *) local, &nxti, optr)) {
++    case CMD_QUEUED:
++	ISP_ADD_REQUEST(isp, nxti);
++	ISP_UNLK_SOFTC(isp);
++	return;
++
++    case CMD_EAGAIN:
++	tmd->cd_error = -ENOMEM;
++	tmd->cd_lflags |= CDFL_ERROR;
++	isp_destroy_handle(isp, save_handle);
++	break;
++
++    case CMD_COMPLETE:
++	tmd->cd_error = *rp;	/* propagated back */
++	tmd->cd_lflags |= CDFL_ERROR;
++	isp_destroy_handle(isp, save_handle);
++	break;
++
++    default:
++	tmd->cd_error = -EFAULT;	/* probably dma mapping failure */
++	tmd->cd_lflags |= CDFL_ERROR;
++	isp_destroy_handle(isp, save_handle);
++	break;
++    }
++    ISP_UNLK_SOFTC(isp);
++    ISP_PARENT_TARGET(QOUT_TMD_DONE, tmd);
++}
++
++/*
++ * Handle ATIO stuff that the generic code can't.
++ * This means handling CDBs.
++ */
++
++static int
++isp_handle_platform_atio(struct ispsoftc *isp, at_entry_t *aep)
++{
++    tmd_cmd_t *tmd;
++    int status;
++
++    /*
++     * The firmware status (except for the QLTM_SVALID bit)
++     * indicates why this ATIO was sent to us.
++     *
++     * If QLTM_SVALID is set, the firware has recommended Sense Data.
++     *
++     * If the DISCONNECTS DISABLED bit is set in the flags field,
++     * we're still connected on the SCSI bus.
++     */
++    status = aep->at_status;
++
++    if ((status & ~QLTM_SVALID) == AT_PHASE_ERROR) {
++	/*
++	 * Bus Phase Sequence error. We should have sense data
++	 * suggested by the f/w. I'm not sure quite yet what
++	 * to do about this.
++	 */
++	isp_prt(isp, ISP_LOGERR, "PHASE ERROR in atio");
++	isp_endcmd(isp, aep, SCSI_BUSY, 0);
++	return (0);
++    }
++
++    if ((status & ~QLTM_SVALID) != AT_CDB) {
++	isp_prt(isp, ISP_LOGERR, "bad atio (0x%x) leaked to platform", status);
++	isp_endcmd(isp, aep, SCSI_BUSY, 0);
++	return (0);
++    }
++
++    if ((tmd = isp->isp_osinfo.tfreelist) == NULL) {
++	/*
++	 * We're out of resources.
++	 *
++	 * Because we can't autofeed sense data back with a command for
++	 * parallel SCSI, we can't give back a CHECK CONDITION. We'll give
++	 * back a QUEUE FULL or BUSY status instead.
++	 */
++	isp_prt(isp, ISP_LOGERR,
++	    "no ATIOS for lun %d from initiator %d on channel %d",
++	    aep->at_lun, GET_IID_VAL(aep->at_iid), GET_BUS_VAL(aep->at_iid));
++	if (aep->at_flags & AT_TQAE)
++	    isp_endcmd(isp, aep, SCSI_QFULL, 0);
++	else
++	    isp_endcmd(isp, aep, SCSI_BUSY, 0);
++	return (0);
++    }
++    isp->isp_osinfo.tfreelist = tmd->cd_private;
++    tmd->cd_lflags = CDFL_BUSY;
++    tmd->cd_chan = GET_BUS_VAL(aep->at_iid);
++    tmd->cd_iid = GET_IID_VAL(aep->at_iid);
++    tmd->cd_tgt = aep->at_tgt;
++    tmd->cd_lun = aep->at_lun;
++    if (aep->at_flags & AT_NODISC) {
++	tmd->cd_lflags |= CDFL_NODISC;
++    }
++    if (status & QLTM_SVALID) {
++	MEMCPY(tmd->cd_sense, aep->at_sense, QLTM_SENSELEN);
++	tmd->cd_lflags |= CDFL_SNSVALID;
++    }
++    MEMCPY(tmd->cd_cdb, aep->at_cdb, min(TMD_CDBLEN, ATIO_CDBLEN));
++    AT_MAKE_TAGID(tmd->cd_tagval, aep);
++    tmd->cd_tagtype = aep->at_tag_type;
++    tmd->cd_hba = isp;
++    tmd->cd_data = NULL;
++    tmd->cd_hflags = 0;
++    tmd->cd_totlen = tmd->cd_resid = tmd->cd_xfrlen = tmd->cd_error = 0;
++    tmd->cd_scsi_status = 0;
++    isp_prt(isp, ISP_LOGTDEBUG1,
++        "ATIO[%x] CDB=0x%x bus %d iid%d->lun%d tag 0x%x ttype 0x%x %s",
++	aep->at_handle, aep->at_cdb[0] & 0xff, GET_BUS_VAL(aep->at_iid),
++	GET_IID_VAL(aep->at_iid), aep->at_lun, aep->at_tag_val & 0xff,
++	aep->at_tag_type, (aep->at_flags & AT_NODISC)?
++	"nondisc" : "disconnecting");
++    if (isp->isp_osinfo.hcb == 0) {
++	isp_endcmd(isp, aep, SCSI_BUSY, 0);
++    } else {
++	isp->isp_osinfo.tfreelist = tmd->cd_private;
++	tmd->cd_lreserved[0].bytes[0] = QOUT_TMD_START;
++	tmd->cd_lreserved[1].ptrs[0] = isp->isp_osinfo.pending_t;
++	isp->isp_osinfo.pending_t = tmd;
++    }
++    return (0);
++}
++
++static int
++isp_handle_platform_atio2(struct ispsoftc *isp, at2_entry_t *aep)
++{
++    tmd_cmd_t *tmd;
++    int lun;
++
++    /*
++     * The firmware status (except for the QLTM_SVALID bit)
++     * indicates why this ATIO was sent to us.
++     *
++     * If QLTM_SVALID is set, the firware has recommended Sense Data.
++     */
++    if ((aep->at_status & ~QLTM_SVALID) != AT_CDB) {
++	isp_prt(isp, ISP_LOGERR, "bad atio (0x%x) leaked to platform",
++	    aep->at_status);
++	isp_endcmd(isp, aep, SCSI_BUSY, 0);
++	return (0);
++    }
++    if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN)
++	lun = aep->at_scclun;
++    else
++	lun = aep->at_lun;
++
++    /*
++     * If we're out of resources, just send a QFULL status back.
++     */
++    if ((tmd = isp->isp_osinfo.tfreelist) == NULL) {
++	isp_endcmd(isp, aep, SCSI_QFULL, 0);
++	return (0);
++    }
++    tmd->cd_lflags = CDFL_BUSY;
++    tmd->cd_iid = aep->at_iid;
++    tmd->cd_tgt = ((fcparam *)isp->isp_param)->isp_loopid;
++    tmd->cd_lun = lun;
++    tmd->cd_chan = 0;
++    MEMCPY(tmd->cd_cdb, aep->at_cdb, min(TMD_CDBLEN, ATIO2_CDBLEN));
++    switch (aep->at_taskflags & ATIO2_TC_ATTR_MASK) {
++    case ATIO2_TC_ATTR_SIMPLEQ:
++	tmd->cd_tagtype = MSG_SIMPLE_Q_TAG;
++	break;
++    case ATIO2_TC_ATTR_HEADOFQ:
++	tmd->cd_tagtype = MSG_HEAD_OF_Q_TAG;
++	break;
++    case ATIO2_TC_ATTR_ORDERED:
++	tmd->cd_tagtype = MSG_ORDERED_Q_TAG;
++	break;
++    case ATIO2_TC_ATTR_ACAQ:		/* ?? */
++    case ATIO2_TC_ATTR_UNTAGGED:
++    default:
++	tmd->cd_tagtype = 0;
++	break;
++    }
++    switch (aep->at_execodes & (ATIO2_EX_WRITE|ATIO2_EX_READ)) {
++    case ATIO2_EX_WRITE:
++	tmd->cd_lflags |= CDFL_DATA_OUT;
++	break;
++    case ATIO2_EX_READ:
++	tmd->cd_lflags |= CDFL_DATA_IN;
++	break;
++    case ATIO2_EX_WRITE|ATIO2_EX_READ:
++	tmd->cd_lflags |= CDFL_BIDIR;
++	isp_prt(isp, ISP_LOGWARN, "ATIO2 with both read/write set");
++	break;
++    default:
++	break;
++    }
++    tmd->cd_tagval = aep->at_rxid;
++    tmd->cd_hba = isp;
++    tmd->cd_data = NULL;
++    tmd->cd_hflags = 0;
++    tmd->cd_totlen = aep->at_datalen;
++    tmd->cd_resid = tmd->cd_xfrlen = tmd->cd_error = 0;
++    tmd->cd_scsi_status = 0;
++    if ((isp->isp_dblev & ISP_LOGTDEBUG0) || isp->isp_osinfo.hcb == 0) {
++	const char *sstr;
++	switch (tmd->cd_lflags & CDFL_BIDIR) {
++	default:
++	    sstr = "nodatadir";
++	    break;
++	case CDFL_DATA_OUT:
++	    sstr = "DATA OUT";
++	    break;
++	case CDFL_DATA_IN:
++	    sstr = "DATA IN";
++	    break;
++	case CDFL_DATA_OUT|CDFL_DATA_IN:
++	    sstr = "BIDIR";
++	    break;
++	}
++	isp_prt(isp, ISP_LOGALL,
++	    "ATIO2[%x] CDB=0x%x iid %d for lun %d tcode 0x%x dlen %d %s",
++	    aep->at_rxid, aep->at_cdb[0] & 0xff, aep->at_iid,
++	    lun, aep->at_taskcodes, aep->at_datalen, sstr);
++    }
++    if (isp->isp_osinfo.hcb == 0) {
++	if (aep->at_cdb[0] == INQUIRY && lun == 0) {
++	    if (aep->at_cdb[1] == 0 && aep->at_cdb[2] == 0) {
++		static u_int8_t inqdata[] = {
++		    DEFAULT_DEVICE_TYPE, 0x0, 0x2, 0x2, 32, 0, 0, 0x40,
++		    'L', 'I', 'N', 'U', 'X', ' ', ' ', ' ',
++		    'T', 'A', 'R', 'G', 'E', 'T', ' ', 'D',
++		    'D', 'E', 'V', 'I', 'C', 'E', ' ', ' ',
++		    '0', '0', '0', '1'
++		};
++		struct scatterlist single, *dp = &single;
++		MEMZERO(dp, sizeof (*dp));
++		dp->address = inqdata;
++		dp->length = sizeof (inqdata);
++		tmd->cd_data = dp;
++		tmd->cd_resid = tmd->cd_xfrlen = sizeof (inqdata);
++		tmd->cd_hflags |= CDFH_DATA_IN|CDFH_STSVALID;
++		ISP_DROP_LK_SOFTC(isp);
++		isp_target_start_ctio(isp, tmd);
++		ISP_IGET_LK_SOFTC(isp);
++	    } else {
++		/*
++		 * Illegal field in CDB
++		 *  0x24 << 24 | 0x5 << 12 | ECMD_SVALID | SCSI_CHECK
++		 */
++		isp_endcmd(isp, aep, 0x24005102, 0);
++	    }
++	} else if (lun == 0) {
++		/*
++		 * Not Ready, Cause Not Reportable
++		 *
++		 *  0x4 << 24 | 0x2 << 12 | ECMD_SVALID | SCSI_CHECK
++		 */
++		isp_endcmd(isp, aep, 0x04002102, 0);
++	} else {
++	    /*
++	     * Logical Unit Not Supported:
++	     * 	0x25 << 24 | 0x5 << 12 | ECMD_SVALID | SCSI_CHECK
++	     */
++	    isp_endcmd(isp, aep, 0x25005102, 0);
++	}
++	MEMZERO(tmd, TMD_SIZE);
++	return (0);
++    }
++    isp->isp_osinfo.tfreelist = tmd->cd_private;
++    tmd->cd_lreserved[0].bytes[0] = QOUT_TMD_START;
++    tmd->cd_lreserved[1].ptrs[0] = isp->isp_osinfo.pending_t;
++    isp->isp_osinfo.pending_t = tmd;
++    return (0);
++}
++
++static int
++isp_handle_platform_ctio(struct ispsoftc *isp, void *arg)
++{
++    tmd_cmd_t *tmd;
++    int sentstatus, ok, resid = 0, sts;
++
++    /*
++     * CTIO and CTIO2 are close enough....
++     */
++    tmd = (tmd_cmd_t *) isp_find_xs(isp, ((ct_entry_t *)arg)->ct_syshandle);
++    if (tmd == NULL) {
++	isp_prt(isp, ISP_LOGERR, "isp_handle_platform_ctio: null tmd");
++	return (0);
++    }
++    isp_destroy_handle(isp, ((ct_entry_t *)arg)->ct_syshandle);
++
++    if (IS_FC(isp)) {
++	ct2_entry_t *ct = arg;
++	sentstatus = ct->ct_flags & CT2_SENDSTATUS;
++	if (sentstatus) {
++	    tmd->cd_lflags |= CDFL_SENTSTATUS;
++	}
++	sts = ct->ct_status & ~QLTM_SVALID;
++	ok = (ct->ct_status & ~QLTM_SVALID) == CT_OK;
++	if (ok && sentstatus && (tmd->cd_hflags & CDFH_SNSVALID)) {
++	    tmd->cd_lflags |= CDFL_SENTSENSE;
++	}
++	isp_prt(isp, ISP_LOGTDEBUG1,
++	    "CTIO2[%x] sts 0x%x flg 0x%x sns %d %s",
++	    ct->ct_rxid, ct->ct_status, ct->ct_flags,
++	    (tmd->cd_lflags & CDFL_SENTSENSE) != 0,
++	    sentstatus? "FIN" : "MID");
++	if ((ct->ct_flags & CT2_DATAMASK) != CT2_NO_DATA) {
++	    resid = ct->ct_resid;
++	}
++    } else {
++	ct_entry_t *ct = arg;
++	sts = ct->ct_status & ~QLTM_SVALID;
++	sentstatus = ct->ct_flags & CT_SENDSTATUS;
++	if (sentstatus) {
++	    tmd->cd_lflags |= CDFL_SENTSTATUS;
++	}
++	ok = (ct->ct_status & ~QLTM_SVALID) == CT_OK;
++	if (ok && sentstatus && (tmd->cd_hflags & CDFH_SNSVALID)) {
++	    tmd->cd_lflags |= CDFL_SENTSENSE;
++	}
++	isp_prt(isp, ISP_LOGTDEBUG1,
++	    "CTIO[%x] tag %x iid %x tgt %d lun %d sts 0x%x flg %x %s",
++	    ct->ct_fwhandle, ct->ct_tag_val, ct->ct_iid, ct->ct_tgt,
++	    ct->ct_lun, ct->ct_status, ct->ct_flags,
++	    sentstatus? "FIN" : "MID");
++	if (ct->ct_status & QLTM_SVALID) {
++	    char *sp = (char *)ct;
++	    sp += CTIO_SENSE_OFFSET;
++	    MEMCPY(tmd->cd_sense, sp, QLTM_SENSELEN);
++	    tmd->cd_lflags |= CDFL_SNSVALID;
++	}
++	if ((ct->ct_flags & CT_DATAMASK) != CT_NO_DATA) {
++	    resid = ct->ct_resid;
++	}
++    }
++    tmd->cd_resid += resid;
++
++    /*
++     * We're here either because intermediate data transfers are done
++     * and/or the final status CTIO (which may have joined with a
++     * Data Transfer) is done.
++     *
++     * In any case, for this platform, the upper layers figure out
++     * what to do next, so all we do here is collect status and
++     * pass information along.
++     */
++    isp_prt(isp, ISP_LOGTDEBUG0, "%s CTIO done (resid %d)",
++	(sentstatus)? "  FINAL " : "MIDTERM ", tmd->cd_resid);
++
++    if (!ok) {
++	isp_prt(isp, ISP_LOGERR, "CTIO ended with badstate (0x%x)", sts);
++	tmd->cd_lflags |= CDFL_ERROR;
++	tmd->cd_error = -EIO;
++	isp_target_putback_atio(isp, tmd);
++    } else {
++	isp_complete_ctio(isp, tmd);
++    }
++    return (0);
++}
++
++static int
++isp_handle_platform_ctio_fastpost(struct ispsoftc *isp, u_int32_t token)
++{
++    tmd_cmd_t *tmd;
++    u_int16_t handle;
++
++    handle = token & 0xffff;
++    tmd = (tmd_cmd_t *) isp_find_xs(isp, handle);
++    if (tmd == NULL) {
++	isp_prt(isp, ISP_LOGERR,
++	    "isp_handle_platform_ctio_fastpost: null tmd");
++	return (0);
++    }
++    isp_destroy_handle(isp, handle);
++    isp_prt(isp, ISP_LOGTDEBUG1, "CTIOx[%x] fastpost complete", tmd->cd_tagval);
++    /*
++     * In this implementation we only set fast posting for the last ctio2
++     * of a command where we haven't sent sense data as well.
++     */
++    tmd->cd_lflags |= CDFL_SENTSTATUS;
++    isp_complete_ctio(isp, tmd);
++    return (0);
++}
++
++static void
++isp_target_putback_atio(struct ispsoftc *isp, tmd_cmd_t *tmd)
++{
++    u_int16_t nxti;
++    u_int8_t local[QENTRY_LEN];
++    void *qe;
++
++    if (isp_getrqentry(isp, &nxti, NULL, &qe)) {
++	isp_prt(isp, ISP_LOGWARN,
++	    "isp_target_putback_atio: Request Queue Overflow");
++	/* XXXX */
++	isp_complete_ctio(isp, tmd);
++	return;
++    }
++    MEMZERO(local, sizeof (local));
++    if (IS_FC(isp)) {
++	at2_entry_t *at = (at2_entry_t *) local;
++	at->at_header.rqs_entry_type = RQSTYPE_ATIO2;
++	at->at_header.rqs_entry_count = 1;
++	if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN)
++	    at->at_scclun = (uint16_t) tmd->cd_lun;
++	else
++	    at->at_lun = (uint8_t) tmd->cd_lun;
++	at->at_status = CT_OK;
++	at->at_rxid = tmd->cd_tagval;
++	isp_put_atio2(isp, at, qe);
++    } else {
++	at_entry_t *at = (at_entry_t *)local;
++	at->at_header.rqs_entry_type = RQSTYPE_ATIO;
++	at->at_header.rqs_entry_count = 1;
++	at->at_iid = tmd->cd_iid;
++	at->at_iid |= tmd->cd_chan << 7;
++	at->at_tgt = tmd->cd_tgt;
++	at->at_lun = tmd->cd_lun;
++	at->at_status = CT_OK;
++	at->at_tag_val = AT_GET_TAG(tmd->cd_tagval);
++	at->at_handle = AT_GET_HANDLE(tmd->cd_tagval);
++	isp_put_atio(isp, at, qe);
++    }
++    ISP_TDQE(isp, "isp_target_putback_atio", isp->isp_reqidx, qe);
++    ISP_ADD_REQUEST(isp, nxti);
++    isp_complete_ctio(isp, tmd);
++}
++
++static void
++isp_complete_ctio(struct ispsoftc *isp, tmd_cmd_t *tmd)
++{
++    if (isp->isp_osinfo.hcb == 0) {
++	isp_prt(isp, ISP_LOGWARN, "nobody to tell about completing command");
++	MEMZERO(tmd, TMD_SIZE);
++	tmd->cd_private = isp->isp_osinfo.tfreelist;
++	isp->isp_osinfo.tfreelist = tmd;
++    } else {
++	tmd->cd_lreserved[0].bytes[0] = QOUT_TMD_DONE;
++	tmd->cd_lreserved[1].ptrs[0] = isp->isp_osinfo.pending_t;
++	isp->isp_osinfo.pending_t = tmd;
++    }
++}
++
++int
++isp_en_dis_lun(struct ispsoftc *isp, int enable, int bus, int tgt, int lun)
++{
++    DECLARE_MUTEX_LOCKED(rsem);
++    u_int16_t rstat;
++    int rv, enabled, cmd;
++
++    /*
++     * First, we can't do anything unless we have an upper
++     * level target driver to route commands to.
++     */
++    if (isp->isp_osinfo.hcb == 0) {
++	return (-EINVAL);
++    }
++
++    /*
++     * Second, check for sanity of enable argument.
++     */
++    enabled = ((isp->isp_osinfo.tmflags & (1 << bus)) != 0);
++    if (enable == 0 && enabled == 0) {
++	return (-EINVAL);
++    }
++
++    /*
++     * Third, check to see if we're enabling on fibre channel
++     * and don't yet have a notion of who the heck we are (no
++     * loop yet).
++     */
++    if (IS_FC(isp) && !enabled) {
++	ISP_LOCK_SOFTC(isp);
++	if ((isp->isp_role & ISP_ROLE_TARGET) == 0) {
++	    isp->isp_role |= ISP_ROLE_TARGET;
++	    if (isp_drain_reset(isp, "lun enables")) {
++		return (-EIO);
++	    }
++	}
++	ISP_UNLK_SOFTC(isp);
++	SEND_THREAD_EVENT(isp, ISP_THREAD_FC_RESCAN, 1);
++    }
++
++    /*
++     * If this is a wildcard target, select our initiator
++     * id/loop id for use as what we enable as.
++     */
++
++    if (tgt == -1) {
++	if (IS_FC(isp)) {
++	    tgt = ((fcparam *)isp->isp_param)->isp_loopid;
++	} else {
++	    tgt = ((sdparam *)isp->isp_param)->isp_initiator_id;
++	}
++    }
++
++    /*
++     * Do some sanity checking on lun arguments.
++     */
++
++    if (lun < 0 || lun >= (IS_FC(isp)? TM_MAX_LUN_FC : TM_MAX_LUN_SCSI)) {
++	return (-EINVAL);
++    }
++
++    /*
++     * Snag the semaphore on the return state value on enables/disables.
++     */
++    if (down_interruptible(&isp->isp_osinfo.tgt_inisem)) {
++	return (-EINTR);
++    }
++
++    if (enable && LUN_BTST(isp, bus, lun)) {
++	up(&isp->isp_osinfo.tgt_inisem);
++	return (-EEXIST);
++    }
++    if (!enable && !LUN_BTST(isp, bus, lun)) {
++	up(&isp->isp_osinfo.tgt_inisem);
++	return (-NODEV);
++    }
++
++    if (enable && nolunsenabled(isp, bus)) {
++	int av = (bus << 31) | ENABLE_TARGET_FLAG;
++	ISP_LOCK_SOFTC(isp);
++	rv = isp_control(isp, ISPCTL_TOGGLE_TMODE, &av);
++	ISP_UNLK_SOFTC(isp);
++	if (rv) {
++	    up(&isp->isp_osinfo.tgt_inisem);
++	    return (-EIO);
++	}
++    }
++
++    ISP_LOCK_SOFTC(isp);
++    isp->isp_osinfo.rsemap = &rsem;
++    if (enable) {
++	u_int32_t seq = isp->isp_osinfo.rollinfo++;
++	int n, ulun = lun;
++
++	cmd = RQSTYPE_ENABLE_LUN;
++	n = DFLT_INOT_CNT;
++	if (IS_FC(isp) && lun != 0) {
++	    cmd = RQSTYPE_MODIFY_LUN;
++	    n = 0;
++	    /*
++	     * For SCC firmware, we only deal with setting
++	     * (enabling or modifying) lun 0.
++	     */
++	    ulun = 0;
++	}
++	rstat = LUN_ERR;
++	if (isp_lun_cmd(isp, cmd, bus, tgt, ulun, DFLT_CMND_CNT, n, seq)) {
++	    isp_prt(isp, ISP_LOGERR, "isp_lun_cmd failed");
++	    goto out;
++	}
++	ISP_UNLK_SOFTC(isp);
++	down(isp->isp_osinfo.rsemap);
++	ISP_LOCK_SOFTC(isp);
++	isp->isp_osinfo.rsemap = NULL;
++	rstat = isp->isp_osinfo.rstatus;
++	if (rstat != LUN_OK) {
++	    isp_prt(isp, ISP_LOGERR, "MODIFY/ENABLE LUN returned 0x%x", rstat);
++	    goto out;
++	}
++    } else {
++	int n, ulun = lun;
++	u_int32_t seq;
++
++	rstat = LUN_ERR;
++	seq = isp->isp_osinfo.rollinfo++;
++	cmd = -RQSTYPE_MODIFY_LUN;
++
++	n = DFLT_INOT_CNT;
++	if (IS_FC(isp) && lun != 0) {
++	    n = 0;
++	    /*
++	     * For SCC firmware, we only deal with setting
++	     * (enabling or modifying) lun 0.
++	     */
++	    ulun = 0;
++	}
++	if (isp_lun_cmd(isp, cmd, bus, tgt, ulun, DFLT_CMND_CNT, n, seq)) {
++	    isp_prt(isp, ISP_LOGERR, "isp_lun_cmd failed");
++	    goto out;
++	}
++	ISP_UNLK_SOFTC(isp);
++	down(isp->isp_osinfo.rsemap);
++	ISP_LOCK_SOFTC(isp);
++	isp->isp_osinfo.rsemap = NULL;
++	rstat = isp->isp_osinfo.rstatus;
++	if (rstat != LUN_OK) {
++	    isp_prt(isp, ISP_LOGERR, "MODIFY LUN returned 0x%x", rstat);
++	    goto out;
++	}
++	if (IS_FC(isp) && lun) {
++	    goto out;
++	}
++	seq = isp->isp_osinfo.rollinfo++;
++	isp->isp_osinfo.rsemap = &rsem;
++
++	rstat = LUN_ERR;
++	cmd = -RQSTYPE_ENABLE_LUN;
++	if (isp_lun_cmd(isp, cmd, bus, tgt, lun, 0, 0, seq)) {
++	    isp_prt(isp, ISP_LOGERR, "isp_lun_cmd failed");
++	    goto out;
++	}
++	ISP_UNLK_SOFTC(isp);
++	down(isp->isp_osinfo.rsemap);
++	ISP_LOCK_SOFTC(isp);
++	isp->isp_osinfo.rsemap = NULL;
++	rstat = isp->isp_osinfo.rstatus;
++	if (rstat != LUN_OK) {
++	    isp_prt(isp, ISP_LOGERR, "DISABLE LUN returned 0x%x", rstat);
++	    goto out;
++	}
++    }
++out:
++
++    if (rstat != LUN_OK) {
++	isp_prt(isp, ISP_LOGERR, "lun %d %sable failed", lun,
++	    (enable) ? "en" : "dis");
++	ISP_UNLK_SOFTC(isp);
++	up(&isp->isp_osinfo.tgt_inisem);
++	return (-EIO);
++    } else {
++	isp_prt(isp, ISP_LOGINFO,
++	    "lun %d now %sabled for target mode on channel %d", lun,
++	    (enable)? "en" : "dis", bus);
++	if (enable == 0) {
++	    LUN_BCLR(isp, bus, lun);
++	    if (nolunsenabled(isp, bus)) {
++		int av = bus << 31;
++		rv = isp_control(isp, ISPCTL_TOGGLE_TMODE, &av);
++		if (rv) {
++		    isp_prt(isp, ISP_LOGERR,
++			"failed to disable target mode on channel %d", bus);
++		    /* but proceed */
++		    ISP_UNLK_SOFTC(isp);
++		    return (-EIO);
++		}
++		isp->isp_osinfo.tmflags &= ~(1 << bus);
++		isp->isp_role &= ~ISP_ROLE_TARGET;
++		if (IS_FC(isp)) {
++		    if (isp_drain_reset(isp, "lun disables")) {
++			return (-EIO);
++		    }
++		    if ((isp->isp_role & ISP_ROLE_INITIATOR) != 0) {
++			ISP_UNLK_SOFTC(isp);
++			SEND_THREAD_EVENT(isp, ISP_THREAD_FC_RESCAN, 1);
++			ISP_LOCK_SOFTC(isp);
++		    }
++		}
++	    }
++	} else {
++	    isp->isp_osinfo.tmflags |= (1 << bus);
++	    LUN_BSET(isp, bus, lun);
++	}
++	ISP_UNLK_SOFTC(isp);
++	up(&isp->isp_osinfo.tgt_inisem);
++	return (0);
++    }
++}
++#endif
++
++#ifdef	ISP_PRIVATE_ASYNC
++#define	ISP_ASYNC	isp_async_level1
++#else
++#define	ISP_ASYNC	isp_async
++#endif
++
++int
++ISP_ASYNC(struct ispsoftc *isp, ispasync_t cmd, void *arg)
++{
++    switch (cmd) {
++    case ISPASYNC_NEW_TGT_PARAMS:
++	if (IS_SCSI(isp)) {
++	    sdparam *sdp = isp->isp_param;
++	    char *wt;
++	    int mhz, flags, bus, tgt, period;
++
++	    tgt = *((int *) arg);
++	    bus = (tgt >> 16) & 0xffff;
++	    tgt &= 0xffff;
++
++	    sdp += bus;
++	    flags = sdp->isp_devparam[tgt].actv_flags;
++	    period = sdp->isp_devparam[tgt].actv_period;
++	    if ((flags & DPARM_SYNC) && period &&
++		(sdp->isp_devparam[tgt].actv_offset) != 0) {
++		if (sdp->isp_lvdmode || period < 0xc) {
++		    switch (period) {
++		    case 0x9:
++			mhz = 80;
++			break;
++		    case 0xa:
++			mhz = 40;
++			break;
++		    case 0xb:
++			mhz = 33;
++			break;
++		    case 0xc:
++			mhz = 25;
++			break;
++		    default:
++			mhz = 1000 / (period * 4);
++			break;
++		    }
++		} else {
++		    mhz = 1000 / (period * 4);
++		}
++	    } else {
++		mhz = 0;
++	    }
++	    switch (flags & (DPARM_WIDE|DPARM_TQING)) {
++	    case DPARM_WIDE:
++		wt = ", 16 bit wide";
++		break;
++	    case DPARM_TQING:
++		wt = ", Tagged Queueing Enabled";
++		break;
++	    case DPARM_WIDE|DPARM_TQING:
++		wt = ", 16 bit wide, Tagged Queueing Enabled";
++		break;
++	    default:
++		wt = " ";
++		break;
++	    }
++	    if (mhz) {
++		isp_prt(isp, ISP_LOGINFO,
++		    "Channel %d Target %d at %dMHz Max Offset %d%s",
++		    bus, tgt, mhz, sdp->isp_devparam[tgt].actv_offset, wt);
++	    } else {
++		isp_prt(isp, ISP_LOGINFO, "Channel %d Target %d Async Mode%s",
++		    bus, tgt, wt);
++	    }
++	}
++	break;
++    case ISPASYNC_LIP:
++	isp_prt(isp, ISP_LOGINFO, "LIP Received");
++	break;
++    case ISPASYNC_LOOP_RESET:
++	isp_prt(isp, ISP_LOGINFO, "Loop Reset Received");
++	break;
++    case ISPASYNC_BUS_RESET:
++	isp_prt(isp, ISP_LOGINFO, "SCSI bus %d reset detected", *((int *) arg));
++	break;
++    case ISPASYNC_LOOP_DOWN:
++	isp_prt(isp, ISP_LOGINFO, "Loop DOWN");
++	break;
++    case ISPASYNC_LOOP_UP:
++	isp_prt(isp, ISP_LOGINFO, "Loop UP");
++	break;
++    case ISPASYNC_PROMENADE:
++    {
++	fcparam *fcp = isp->isp_param;
++	struct lportdb *lp;
++	int tgt;
++
++	tgt = *((int *) arg);
++	lp = &fcp->portdb[tgt];
++
++	if (lp->valid) {
++	    isp_prt(isp, ISP_LOGINFO,
++		"ID %d (Loop 0x%x) Port WWN 0x%08x%08x @ 0x%x arrived, role %s",
++		tgt, lp->loopid, (unsigned int) (lp->port_wwn >> 32),
++		(unsigned int) (lp->port_wwn & 0xffffffff), lp->portid,
++		class3_roles[fcp->portdb[tgt].roles]);
++	} else {
++	    isp_prt(isp, ISP_LOGINFO,
++		"ID %d (Loop 0x%x) Port WWN 0x%08x%08x @ 0x%x departed", tgt,
++		lp->loopid, (unsigned int) (lp->port_wwn >> 32),
++		(unsigned int) (lp->port_wwn & 0xffffffff), lp->portid);
++#ifdef	DEVICE_POLICY_IS_FLUID
++		MEMZERO((void *) lp, sizeof (*lp));
++#endif
++	}
++	break;
++    }
++    case ISPASYNC_CHANGE_NOTIFY:
++	if (arg == ISPASYNC_CHANGE_PDB) {
++		isp_prt(isp, ISP_LOGINFO,
++		    "Port Database Changed");
++	} else if (arg == ISPASYNC_CHANGE_SNS) {
++		isp_prt(isp, ISP_LOGINFO,
++		    "Name Server Database Changed");
++	}
++	SEND_THREAD_EVENT(isp, ISP_THREAD_FC_RESCAN, 0);
++	break;
++    case ISPASYNC_FABRIC_DEV:
++    {
++	int target, base, lim;
++	fcparam *fcp = isp->isp_param;
++	struct lportdb *lp = NULL;
++	struct lportdb *clp = (struct lportdb *) arg;
++	char *pt;
++
++	switch (clp->port_type) {
++	case 1:
++		pt = "   N_Port";
++		break;
++	case 2:
++		pt = "  NL_Port";
++		break;
++	case 3:
++		pt = "F/NL_Port";
++		break;
++	case 0x7f:
++		pt = "  Nx_Port";
++		break;
++	case 0x81:
++		pt = "  F_port";
++		break;
++	case 0x82:
++		pt = "  FL_Port";
++		break;
++	case 0x84:
++		pt = "   E_port";
++		break;
++	default:
++		pt = " ";
++		break;
++	}
++
++	isp_prt(isp, ISP_LOGINFO,
++	    "%s Fabric Device @ PortID 0x%x", pt, clp->portid);
++
++	/*
++	 * If we don't have an initiator role we bail.
++	 *
++	 * We just use ISPASYNC_FABRIC_DEV for announcement purposes.
++	 */
++
++	if ((isp->isp_role & ISP_ROLE_INITIATOR) == 0) {
++		break;
++	}
++
++	/*
++	 * Is this entry for us? If so, we bail.
++	 */
++
++	if (fcp->isp_portid == clp->portid) {
++		break;
++	}
++
++	/*
++	 * Else, the default policy is to find room for it in
++	 * our local port database. Later, when we execute
++	 * the call to isp_pdb_sync either this newly arrived
++	 * or already logged in device will be (re)announced.
++	 */
++
++	if (fcp->isp_topo == TOPO_FL_PORT)
++		base = FC_SNS_ID+1;
++	else
++		base = 0;
++
++	if (fcp->isp_topo == TOPO_N_PORT)
++		lim = 1;
++	else
++		lim = MAX_FC_TARG;
++
++	/*
++	 * Is it already in our list?
++	 */
++	for (target = base; target < lim; target++) {
++		if (target >= FL_PORT_ID && target <= FC_SNS_ID) {
++			continue;
++		}
++		lp = &fcp->portdb[target];
++		if (lp->port_wwn == clp->port_wwn &&
++		    lp->node_wwn == clp->node_wwn) {
++			lp->fabric_dev = 1;
++			/*
++			 * Propagate possibly new port id.
++			 */
++			lp->portid = clp->portid;
++			break;
++		}
++	}
++	if (target < lim) {
++		break;
++	}
++	for (target = base; target < lim; target++) {
++		if (target >= FL_PORT_ID && target <= FC_SNS_ID) {
++			continue;
++		}
++		lp = &fcp->portdb[target];
++		if (lp->port_wwn == 0) {
++			break;
++		}
++	}
++	if (target == lim) {
++		isp_prt(isp, ISP_LOGWARN,
++		    "out of space for fabric devices");
++		break;
++	}
++	lp->port_type = clp->port_type;
++	lp->fc4_type = clp->fc4_type;
++	lp->node_wwn = clp->node_wwn;
++	lp->port_wwn = clp->port_wwn;
++	lp->portid = clp->portid;
++	lp->fabric_dev = 1;
++	break;
++    }
++#ifdef	LINUX_ISP_TARGET_MODE
++    case ISPASYNC_TARGET_MESSAGE:
++    {
++	tmd_msg_t *mp = arg;
++	isp_prt(isp, ISP_LOGTDEBUG2,
++	    "bus %d iid %d tgt %d lun %d ttype %x tval %x msg[0]=%x",
++	    mp->nt_bus, (int) mp->nt_iid, (int) mp->nt_tgt, (int) mp->nt_lun,
++	    mp->nt_tagtype, mp->nt_tagval, mp->nt_msg[0]);
++	break;
++    }
++    case ISPASYNC_TARGET_EVENT:
++    {
++	tmd_event_t *ep = arg;
++	switch (ep->ev_event) {
++	case  ASYNC_CTIO_DONE:
++	    /*
++	     * ACK the interrupt first
++	     */
++	    ISP_WRITE(isp, BIU_SEMA, 0);
++	    ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
++	    isp_handle_platform_ctio_fastpost(isp, ep->ev_bus);
++	    break;
++	default:
++	    isp_prt(isp, ISP_LOGTDEBUG2,
++		"bus %d event code 0x%x", ep->ev_bus, ep->ev_event);
++	}
++	break;
++    }
++    case ISPASYNC_TARGET_ACTION:
++	switch (((isphdr_t *)arg)->rqs_entry_type) {
++	default:
++	    isp_prt(isp, ISP_LOGWARN, "event 0x%x for unhandled target action",
++		((isphdr_t *)arg)->rqs_entry_type);
++	    break;
++	case RQSTYPE_ATIO:
++	    (void) isp_handle_platform_atio(isp, (at_entry_t *) arg);
++	    break;
++	case RQSTYPE_ATIO2:
++	    (void) isp_handle_platform_atio2(isp, (at2_entry_t *)arg);
++	    break;
++	case RQSTYPE_CTIO2:
++	case RQSTYPE_CTIO:
++	    (void) isp_handle_platform_ctio(isp, arg);
++	    break;
++	case RQSTYPE_ENABLE_LUN:
++	case RQSTYPE_MODIFY_LUN:
++	    isp->isp_osinfo.rstatus = ((lun_entry_t *)arg)->le_status;
++	    if (isp->isp_osinfo.rsemap) {
++		up(isp->isp_osinfo.rsemap);
++	    }
++	    break;
++	}
++	break;
++#endif
++    case ISPASYNC_UNHANDLED_RESPONSE:
++	break;
++    case ISPASYNC_FW_CRASH:
++    {
++	u_int16_t mbox1, mbox6;
++	mbox1 = ISP_READ(isp, OUTMAILBOX1);
++	if (IS_DUALBUS(isp)) {
++	    mbox6 = ISP_READ(isp, OUTMAILBOX6);
++	} else {
++	    mbox6 = 0;
++	}
++	isp_prt(isp, ISP_LOGERR,
++	    "Internal F/W Error on bus %d @ RISC Address 0x%x", mbox6, mbox1);
++#ifdef	ISP_FW_CRASH_DUMP
++	if (IS_FC(isp)) {
++	    isp->isp_blocked = 1;
++	    SEND_THREAD_EVENT(isp, ISP_THREAD_FW_CRASH_DUMP, 0);
++	} else {
++	    isp_reinit(isp);
++	    isp_async(isp, ISPASYNC_FW_RESTARTED, NULL);
++	}
++#endif
++	break;
++    }
++    case ISPASYNC_FW_RESTARTED:
++    {
++	if (IS_FC(isp)) {
++	    SEND_THREAD_EVENT(isp, ISP_THREAD_FC_RESCAN, 0);
++	}
++	break;
++    }
++    default:
++	return (-1);
++    }
++    return (0);
++}
++
++#if	LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++#include "sd.h"
++int
++isplinux_biosparam(Disk *disk, kdev_t n, int ip[])
++{
++    int size = disk->capacity;
++    ip[0] = 64;
++    ip[1] = 32;
++    ip[2] = size >> 11;
++    if (ip[2] > 1024) {
++	ip[0] = 255;
++	ip[1] = 63;
++	ip[2] = size / (ip[0] * ip[1]);
++    }
++    return (0);
++}
++
++/*
++ * Set the queue depth for this device.
++ */
++
++void
++isplinux_sqd(struct Scsi_Host *host, Scsi_Device *devs)
++{
++    while (devs) {
++	if (devs->host == host && devs->tagged_supported == 0) {
++	    /*
++	     * If this device doesn't support tagged operations, don't waste
++	     * queue space for it, even if it has multiple luns.
++	     */
++	    devs->queue_depth = 2;
++	} else if (devs->host == host) {
++	    int depth = 2;
++	    struct ispsoftc *isp = (struct ispsoftc *) host->hostdata;
++
++	    if (IS_SCSI(isp)) {
++		sdparam *sdp = isp->isp_param;
++		sdp += devs->channel;
++		depth = sdp->isp_devparam[devs->id].exc_throttle;
++	    } else {
++		depth = FCPARAM(isp)->isp_execthrottle;
++	    }
++	    if (isp_throttle) {
++		/*
++		 * This limit is due to the size of devs->queue_depth
++		 */
++		depth = (unsigned char) min(isp_throttle, 255);;
++	    }
++	    if (depth < 4) {
++		depth = 4;
++	    }
++	    devs->queue_depth = depth;
++	}
++	devs = devs->next;
++    }
++}
++
++#else
++int
++isplinux_biosparam(struct scsi_device *sdev, struct block_device *n,
++		   sector_t capacity, int ip[])
++{
++    int size = capacity;
++    ip[0] = 64;
++    ip[1] = 32;
++    ip[2] = size >> 11;
++    if (ip[2] > 1024) {
++	ip[0] = 255;
++	ip[1] = 63;
++	ip[2] = size / (ip[0] * ip[1]);
++    }
++    return (0);
++}
++
++static int
++isplinux_slave_configure(Scsi_Device * device)
++{
++    if (device->tagged_supported) {
++	/*
++	 *  FIX LATER
++	 */
++	scsi_adjust_queue_depth(device, MSG_ORDERED_TAG, 63);
++    }
++    return 0;
++}
++#endif
++
++/*
++ * Periodic watchdog timer.. the main purpose here is to restart
++ * commands that were pegged on resources, etc...
++ */
++void
++isplinux_timer(unsigned long arg)
++{
++    Scsi_Cmnd *Cmnd;
++    struct ispsoftc *isp = (struct ispsoftc *) arg;
++
++    ISP_ILOCK_SOFTC(isp);
++    if (IS_FC(isp)) {
++	int rql;
++	if (isp->isp_role & ISP_ROLE_INITIATOR)
++	    rql = LOOP_READY;
++	else
++	    rql = LOOP_LSCAN_DONE;
++	if (isp->isp_fcrswdog || FCPARAM(isp)->isp_fwstate != FW_READY ||
++	    FCPARAM(isp)->isp_loopstate < rql) {
++	    isp->isp_fcrswdog = 0;
++	    if (isp->isp_deadloop == 0 && isp->isp_role != ISP_ROLE_NONE) {
++		SEND_THREAD_EVENT(isp, ISP_THREAD_FC_RESCAN, 0);
++	    }
++	}
++    }
++    isplinux_runwaitq(isp);
++    if ((Cmnd = isp->isp_osinfo.dqnext) != NULL) {
++	isp->isp_osinfo.dqnext = isp->isp_osinfo.dqtail = NULL;
++    }
++    if (isp->dogactive) {
++	isp->isp_osinfo.timer.expires = jiffies + ISP_WATCH_TIME;
++	add_timer(&isp->isp_osinfo.timer);
++    }
++    ISP_IUNLK_SOFTC(isp);
++    if (Cmnd) {
++	ISP_LOCK_SCSI_DONE(isp);
++        while (Cmnd) {
++	    Scsi_Cmnd *f = (Scsi_Cmnd *) Cmnd->host_scribble;
++	    Cmnd->host_scribble = NULL;
++	    /*
++	     * Get around silliness in midlayer.
++	     */
++	    if (host_byte(Cmnd->result) == DID_RESET) {
++		Cmnd->flags |= IS_RESETTING;
++	    }
++	    (*Cmnd->scsi_done)(Cmnd);
++	    Cmnd = f;
++	}
++	ISP_UNLK_SCSI_DONE(isp);
++    }
++}
++
++void
++isplinux_mbtimer(unsigned long arg)
++{
++    struct ispsoftc *isp = (struct ispsoftc *) arg;
++    ISP_ILOCK_SOFTC(isp);
++    if (isp->mbox_waiting) {
++	isp->mbox_waiting = 0;
++	up(&isp->mbox_c_sem);
++    }
++    ISP_IUNLK_SOFTC(isp);
++}
++
++irqreturn_t
++isplinux_intr(int irq, void *arg, struct pt_regs *pt)
++{
++    struct ispsoftc *isp = arg;
++    u_int16_t isr, sema, mbox;
++    Scsi_Cmnd *Cmnd;
++
++    ISP_ILOCK_SOFTC(isp);
++    isp->isp_intcnt++;
++    if (ISP_READ_ISR(isp, &isr, &sema, &mbox) == 0) {
++	isp->isp_intbogus++;
++	ISP_IUNLK_SOFTC(isp);
++	return IRQ_NONE;
++    }
++    isp_intr(isp, isr, sema, mbox);
++    isplinux_runwaitq(isp);
++    if ((Cmnd = isp->isp_osinfo.dqnext) != NULL) {
++	isp->isp_osinfo.dqnext = isp->isp_osinfo.dqtail = NULL;
++    }
++#ifdef	LINUX_ISP_TARGET_MODE
++    if (isp->isp_osinfo.pending_t) {
++	struct tmd_cmd *tmd = isp->isp_osinfo.pending_t;
++	isp->isp_osinfo.pending_t = NULL;
++	ISP_IUNLK_SOFTC(isp);
++	do {
++	    struct tmd_cmd *next = tmd->cd_lreserved[1].ptrs[0];
++	    tmd->cd_lreserved[1].ptrs[0] = NULL;
++	    ISP_PARENT_TARGET(tmd->cd_lreserved[0].bytes[0], tmd);
++	    tmd = next;
++	} while (tmd != NULL);
++    } else {
++	ISP_IUNLK_SOFTC(isp);
++    }
++#else
++    ISP_IUNLK_SOFTC(isp);
++#endif
++    if (Cmnd) {
++	ISP_LOCK_SCSI_DONE(isp);
++        while (Cmnd) {
++	    Scsi_Cmnd *f = (Scsi_Cmnd *) Cmnd->host_scribble;
++	    Cmnd->host_scribble = NULL;
++	    /*
++	     * Get around silliness in midlayer.
++	     */
++	    if (host_byte(Cmnd->result) == DID_RESET) {
++		Cmnd->flags |= IS_RESETTING;
++	    }
++	    (*Cmnd->scsi_done)(Cmnd);
++	    Cmnd = f;
++	}
++	ISP_UNLK_SCSI_DONE(isp);
++    }
++    return IRQ_HANDLED;
++}
++
++static INLINE int
++isp_parse_rolearg(struct ispsoftc *isp, char *roles)
++{
++    char *role = roles;
++
++    while (role && *role) {
++	unsigned int id;
++	char *eqtok, *commatok, *p, *q;
++	
++	eqtok = role;
++	eqtok = strchr(role, '=');
++	if (eqtok == NULL)
++	   break;
++	*eqtok = 0;
++	commatok = strchr(eqtok+1, ',');
++	if (commatok)
++	    *commatok = 0;
++	if (strncmp(role, "0x", 2) == 0)
++	    q = role + 2;
++	else
++	    q = role;
++	if (*q == '*')
++	    id = isp->isp_osinfo.device_id;
++	else
++	    id = simple_strtoul(q, &p, 16);
++	*eqtok = '=';
++	if (p != q && id == isp->isp_osinfo.device_id) {
++	    p = eqtok + 1;
++	    if (strcmp(p, "none") == 0) {
++		if (commatok) {
++		    *commatok = ',';
++		}
++		return (ISP_ROLE_NONE);
++	    }
++	    if (strcmp(p, "target") == 0) {
++		if (commatok) {
++		    *commatok = ',';
++		}
++		return (ISP_ROLE_TARGET);
++	    }
++	    if (strcmp(p, "initiator") == 0) {
++		if (commatok) {
++		    *commatok = ',';
++		}
++		return (ISP_ROLE_INITIATOR);
++	    }
++	    if (strcmp(p, "both") == 0) {
++		if (commatok) {
++		    *commatok = ',';
++		}
++		return (ISP_ROLE_BOTH);
++	    }
++	    break;
++	}
++        if (commatok) {
++	    role = commatok+1;
++	    *commatok = ',';
++	} else {
++	    break;
++	}
++    }
++    return (ISP_DEFAULT_ROLES);
++}
++
++static INLINE u_int64_t
++isp_parse_wwnarg(struct ispsoftc *isp, char *wwns)
++{
++    char *wwnt = wwns;
++    u_int64_t wwn = 0;
++
++    while (wwn == 0 && wwnt && *wwnt) {
++	unsigned int id;
++	char *eqtok, *commatok, *p, *q;
++	
++	eqtok = wwnt;
++	eqtok = strchr(wwnt, '=');
++	if (eqtok == NULL)
++	   break;
++	*eqtok = 0;
++	commatok = strchr(eqtok+1, ',');
++	if (commatok)
++	    *commatok = 0;
++	if (strncmp(wwnt, "0x", 2) == 0)
++	    q = wwnt + 2;
++	else
++	    q = wwnt;
++	id = simple_strtoul(q, &p, 16);
++	if (p != q && id == isp->isp_osinfo.device_id) {
++	    unsigned long t, t2;
++	    p = eqtok + 1;
++	    while (*p) {
++		p++;
++	    }
++	    p -= 8;
++	    if (p > eqtok + 1) {
++		char *q;
++		char c;
++		q = p;
++		t = simple_strtoul(p, &q, 16);
++		c = *p;
++		*p = 0;
++		t2 = simple_strtoul(eqtok+1, NULL, 16);
++		*p = c;
++	    } else {
++		t = simple_strtoul(eqtok+1, NULL, 16);
++		t2 = 0;
++	    }
++	    wwn = (((u_int64_t) t2) << 32) | (u_int64_t) t;
++	}
++	*eqtok = '=';
++        if (commatok) {
++	    wwnt = commatok+1;
++	    *commatok = ',';
++	} else {
++	    break;
++	}
++    }
++    return (wwn);
++}
++
++void
++isplinux_common_init(struct ispsoftc *isp)
++{
++    /*
++     * Set up config options, etc...
++     */
++    if (isp_debug) {
++	isp->isp_dblev = isp_debug;
++    } else {
++	isp->isp_dblev = ISP_LOGCONFIG|ISP_LOGWARN|ISP_LOGERR;
++    }
++
++    if (isp_nofwreload & (1 << isp->isp_unit)) {
++	isp->isp_confopts |= ISP_CFG_NORELOAD;
++    }
++    if (isp_nonvram & (1 << isp->isp_unit)) {
++	isp->isp_confopts |= ISP_CFG_NONVRAM;
++    }
++    if (IS_FC(isp)) {
++	if (isp_fcduplex & (1 << isp->isp_unit)) {
++	    isp->isp_confopts |= ISP_CFG_FULL_DUPLEX;
++	}
++        isp->isp_defwwpn = isp_parse_wwnarg(isp, isp_wwpns);
++	if (isp->isp_defwwpn == 0) {
++	    isp->isp_defwwpn = (u_int64_t) 0x400000007F7F7F01;
++	} else {
++	    isp->isp_confopts |= ISP_CFG_OWNWWPN;
++	}
++        isp->isp_defwwnn = isp_parse_wwnarg(isp, isp_wwnns);
++	if (isp->isp_defwwnn == 0) {
++	    isp->isp_defwwnn = (u_int64_t) 0x400000007F7F7F02;
++	} else {
++	    isp->isp_confopts |= ISP_CFG_OWNWWNN;
++	}
++	isp->isp_osinfo.host->max_id = MAX_FC_TARG; 
++	if (IS_2200(isp) || IS_2300(isp)) {
++	    if (isp_nport_only & (1 << isp->isp_unit)) {
++		isp->isp_confopts |= ISP_CFG_NPORT_ONLY;
++	    } else if (isp_loop_only & (1 << isp->isp_unit)) {
++		isp->isp_confopts |= ISP_CFG_LPORT_ONLY;
++	    } else {
++		isp->isp_confopts |= ISP_CFG_NPORT;
++	    }
++	}
++	isp->isp_osinfo.host->this_id = MAX_FC_TARG+1;
++#ifdef	ISP_FW_CRASH_DUMP
++	if (IS_2200(isp))
++	    FCPARAM(isp)->isp_dump_data =
++		isp_kalloc(QLA2200_RISC_IMAGE_DUMP_SIZE, GFP_KERNEL);
++	else if (IS_23XX(isp))
++	    FCPARAM(isp)->isp_dump_data =
++		isp_kalloc(QLA2300_RISC_IMAGE_DUMP_SIZE, GFP_KERNEL);
++	if (FCPARAM(isp)->isp_dump_data) {
++	    isp_prt(isp, ISP_LOGCONFIG, "f/w crash dump area allocated");
++	    FCPARAM(isp)->isp_dump_data[0] = 0;
++	}
++#endif
++	if (isp_default_frame_size) {
++	    if (isp_default_frame_size != 512 &&
++		isp_default_frame_size != 1024 &&
++		isp_default_frame_size != 2048) {
++		    isp_prt(isp, ISP_LOGERR,
++			"bad frame size (%d), defaulting to (%d)",
++			isp_default_frame_size, ICB_DFLT_FRMLEN);
++		isp_default_frame_size = 0;
++	    }
++	}
++	if (isp_default_frame_size) {
++	    isp->isp_confopts |= ISP_CFG_OWNFSZ;
++	    isp->isp_osinfo.storep->fibre_scsi.default_frame_size =
++		isp_default_frame_size;
++	} else {
++	    isp->isp_osinfo.storep->fibre_scsi.default_frame_size =
++		isp_default_frame_size = ICB_DFLT_FRMLEN;
++	}
++	if (isp_default_exec_throttle) {
++	    if (isp_default_exec_throttle < 16 ||
++		isp_default_exec_throttle > 255) {
++		isp_prt(isp, ISP_LOGERR,
++		    "bad execution throttle size (%d), defaulting to (%d)",
++		    isp_default_exec_throttle, ICB_DFLT_THROTTLE);
++		isp_default_exec_throttle = 0;
++	    }
++	}
++	if (isp_default_exec_throttle) {
++	    isp->isp_confopts |= ISP_CFG_OWNEXCTHROTTLE;
++	    isp->isp_osinfo.storep->fibre_scsi.default_exec_throttle =
++		isp_default_exec_throttle;
++	} else {
++	    isp->isp_osinfo.storep->fibre_scsi.default_exec_throttle =
++		ICB_DFLT_THROTTLE;
++	}
++    } else {
++	isp->isp_osinfo.host->max_id = MAX_TARGETS;
++	isp->isp_osinfo.host->this_id = 7;	/* temp default */
++    }
++    isp->isp_role = isp_parse_rolearg(isp, isp_roles);
++
++
++    /*
++     * Initialize locks
++     */
++    ISP_LOCK_INIT(isp);
++    ISP_TLOCK_INIT(isp);
++    sema_init(&isp->mbox_sem, 1);
++    sema_init(&isp->mbox_c_sem, 0);
++    sema_init(&isp->fcs_sem, 1);
++
++#if defined(CONFIG_PROC_FS) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++    /*
++     * Initialize any PROCFS stuff
++     */
++    isplinux_init_proc(isp);
++#endif
++
++    /*
++     * Start watchdog timer
++     */
++    ISP_LOCK_SOFTC(isp);
++    init_timer(&isp->isp_osinfo.timer);
++    isp->isp_osinfo.timer.data = (unsigned long) isp;
++    isp->isp_osinfo.timer.function = isplinux_timer;
++    isp->isp_osinfo.timer.expires = jiffies + ISP_WATCH_TIME;
++    add_timer(&isp->isp_osinfo.timer);
++    isp->dogactive = 1;
++    if (IS_FC(isp)) {
++	DECLARE_MUTEX_LOCKED(sem);
++	ISP_UNLK_SOFTC(isp);
++	isp->isp_osinfo.task_ctl_sem = &sem;
++	kernel_thread(isp_task_thread, isp, 0);
++	down(&sem);
++	isp->isp_osinfo.task_ctl_sem = NULL;
++	ISP_LOCK_SOFTC(isp);
++    }
++    isplinux_reinit(isp);
++#ifdef	LINUX_ISP_TARGET_MODE
++    sema_init(&isp->isp_osinfo.tgt_inisem, 1);
++#endif
++#ifdef	ISP_TARGET_MODE
++    isp_attach_target(isp);
++#endif
++    ISP_UNLK_SOFTC(isp);
++}
++
++void
++isplinux_reinit(struct ispsoftc *isp)
++{
++    int maxluns = isp_maxluns;
++    isp_reset(isp);
++    if (isp->isp_state != ISP_RESETSTATE) {
++	isp_prt(isp, ISP_LOGERR, "failed to enter RESET state");
++	return;
++    } 
++    /*
++     * Until the midlayer starts using REPORT LUNS to dertermine how many
++     * luns there are for SCSI-3 devices and sets a reasonable limit for
++     * SCSI-2 devices, we'll follow this ruleset:
++     * 
++     * 	If our isp_maxluns parameter is unchanged from its default, we
++     * 	limit ourselves to 8 luns for parallel SCSI, 256 for FC-SCSI.
++     *
++     * 	If somebody has set isp_maxluns away from the fefault, we follow that.
++     *
++     * 	We filter any value through the HBA maximum
++     */
++    if (isp_maxluns == 8) {
++	if (IS_FC(isp)) {
++		maxluns = 256;
++	}
++    }
++    isp->isp_osinfo.host->max_lun = min(maxluns, ISP_MAX_LUNS(isp));
++    isp_init(isp);
++    if (isp->isp_role == ISP_ROLE_NONE) {
++	return;
++    }
++    if (isp->isp_state != ISP_INITSTATE) {
++	isp_prt(isp, ISP_LOGERR, "failed to enter INIT state");
++	return;
++    }
++    isp->isp_state = ISP_RUNSTATE;
++
++#if	LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++    isp->isp_osinfo.host->can_queue = isp->isp_maxcmds;
++#else
++    isp->isp_osinfo.host->can_queue = min(255, isp->isp_maxcmds);
++#endif
++    if (isp->isp_osinfo.host->can_queue == 0)
++	isp->isp_osinfo.host->can_queue = 1;
++
++    if (IS_FC(isp)) {
++	isp->isp_osinfo.host->this_id = MAX_FC_TARG;
++	/*
++	 * This is *not* the same as execution throttle- that is set
++	 * in isplinux_sqd and is per-device.
++	 *
++	 * What we try and do here is take how much we can queue at
++	 * a given time and spread it, reasonably, over all the luns
++	 * we expect to run at a time.
++	 */
++	if (isp_cmd_per_lun) {
++	    isp->isp_osinfo.host->cmd_per_lun = isp_cmd_per_lun;
++	} else {
++	    /*
++	     * JAWAG.
++	     */
++	    isp->isp_osinfo.host->cmd_per_lun = isp->isp_maxcmds >> 3;
++	}
++
++	/*
++	 * We seem to need a bit of settle time.
++	 */
++	USEC_DELAY(1 * 1000000);
++    } else {
++	int bus;
++
++	if (isp_cmd_per_lun) {
++	    isp->isp_osinfo.host->cmd_per_lun = isp_cmd_per_lun;
++	} else {
++	    /*
++	     * Maximum total commands spread over either 8 targets,
++	     * or 4 targets, 2 luns, etc.
++	     */
++	    isp->isp_osinfo.host->cmd_per_lun = isp->isp_maxcmds >> 3;
++	}
++
++	/*
++	 * No way to give different ID's for the second bus.
++	 */
++	isp->isp_osinfo.host->this_id = SDPARAM(isp)->isp_initiator_id;
++	bus = 0;
++	(void) isp_control(isp, ISPCTL_RESET_BUS, &bus);
++	if (IS_DUALBUS(isp)) {
++	    bus = 1;
++	    (void) isp_control(isp, ISPCTL_RESET_BUS, &bus);
++	}
++	/*
++	 * Bus Reset delay handled by firmware.
++	 */
++    }
++}
++
++int
++isp_drain_reset(struct ispsoftc *isp, char *msg)
++{
++    isp->isp_blocked = 1;
++    /*
++     * Drain active commands.
++     */
++    if (isp_drain(isp, msg)) {
++	isp->isp_failed = 1;
++	isp->isp_blocked = 0;
++	return (-1);
++    }
++    isp_reinit(isp);
++    if ((isp->isp_role == ISP_ROLE_NONE && isp->isp_state < ISP_RESETSTATE) ||
++        (isp->isp_role != ISP_ROLE_NONE && isp->isp_state < ISP_RUNSTATE)) {
++	isp->isp_blocked = 0;
++	return (-1);
++    }
++    isp->isp_failed = 0;
++    isp->isp_blocked = 0;
++    return (0);
++}
++
++int
++isp_drain(struct ispsoftc *isp, char *whom)
++{
++    int nslept;
++
++    if (isp->isp_nactive == 0)
++	return (0);
++
++    isp->isp_draining = 1;
++    nslept = 0;
++    isp_prt(isp, ISP_LOGDEBUG0, "draining %d commands", isp->isp_nactive);
++    while (isp->isp_nactive) {
++        USEC_SLEEP(isp, 100000);	/* drops lock */
++	if (++nslept >= (60 * 10)) {	/* 60 seconds */
++		isp_prt(isp, ISP_LOGERR, "%s: command drain timed out", whom);
++		isp->isp_draining = 0;
++		return (-1);
++	}
++    }
++    isp_prt(isp, ISP_LOGDEBUG0, "done draining commands");
++    isp->isp_draining = 0;
++    isplinux_runwaitq(isp);
++    return (0);
++}
++
++#if	LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++#define	ISP_THREAD_CAN_EXIT	isp->isp_host->loaded_as_module
++#else
++#define	ISP_THREAD_CAN_EXIT	0
++#endif
++
++static int
++isp_task_thread(void *arg)
++{
++    DECLARE_MUTEX_LOCKED(thread_sleep_semaphore);
++    struct ispsoftc *isp = arg;
++    unsigned long flags;
++    int action, nactions, exit_thread = 0;
++    isp_thread_action_t curactions[MAX_THREAD_ACTION];
++
++#if	LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++    /* XXX: Not really sure why the 2.5.X changes do this */
++    if (ISP_THREAD_CAN_EXIT) {
++	siginitsetinv(&current->blocked, sigmask(SIGHUP));
++    } else {
++	siginitsetinv(&current->blocked, 0);
++    }
++    lock_kernel();
++    daemonize();
++    sprintf(current->comm, "isp_thrd%d", isp->isp_unit);
++#else
++    lock_kernel();
++    daemonize("isp_thrd%d", isp->isp_unit);
++#endif
++    isp->isp_osinfo.task_thread = current;
++    isp->isp_osinfo.task_request = &thread_sleep_semaphore;
++    unlock_kernel();
++
++    if (isp->isp_osinfo.task_ctl_sem) {
++	up(isp->isp_osinfo.task_ctl_sem);
++    }
++    isp_prt(isp, ISP_LOGDEBUG1, "isp_task_thread starting");
++
++    while (exit_thread == 0) {
++	isp_prt(isp, ISP_LOGDEBUG1, "isp_task_thread sleeping");
++	down_interruptible(&thread_sleep_semaphore);
++	if (ISP_THREAD_CAN_EXIT) {
++	    if (signal_pending(current))
++		break;
++	}
++	isp_prt(isp, ISP_LOGDEBUG1, "isp_task_thread running");
++
++	spin_lock_irqsave(&isp->isp_osinfo.tlock, flags);
++	nactions = isp->isp_osinfo.nt_actions;
++	isp->isp_osinfo.nt_actions = 0;
++	for (action = 0; action < nactions; action++) {
++		curactions[action] = isp->isp_osinfo.t_actions[action];
++		isp->isp_osinfo.t_actions[action].thread_action = 0;
++		isp->isp_osinfo.t_actions[action].thread_waiter = 0;
++	}
++	spin_unlock_irqrestore(&isp->isp_osinfo.tlock, flags);
++
++	for (action = 0; action < nactions; action++) {
++	    isp_thread_action_t *tap = &curactions[action];
++	    isp_prt(isp, ISP_LOGDEBUG1, "isp_task_thread[%d]: action %d (%p)",
++		action, tap->thread_action, tap->thread_waiter);
++	    switch (tap->thread_action) {
++	    case ISP_THREAD_NIL:
++		break;
++#ifdef	ISP_FW_CRASH_DUMP
++	    case ISP_THREAD_FW_CRASH_DUMP:
++		ISP_LOCKU_SOFTC(isp);
++		FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
++		FCPARAM(isp)->isp_loopstate = LOOP_NIL;
++		isp_fw_dump(isp);
++		SEND_THREAD_EVENT(isp, ISP_THREAD_REINIT, 0);
++		ISP_UNLKU_SOFTC(isp);
++		break;
++#endif
++	    case ISP_THREAD_REINIT:
++	    {
++		int level;
++		ISP_LOCKU_SOFTC(isp);
++		level = (isp->isp_role == ISP_ROLE_NONE)?
++		    ISP_RESETSTATE : ISP_INITSTATE;
++		isp_reinit(isp);
++		if (isp->isp_state >= level) {
++		    isp_async(isp, ISPASYNC_FW_RESTARTED, NULL);
++		} else {
++		    SEND_THREAD_EVENT(isp, ISP_THREAD_REINIT, 0);
++		}
++		ISP_UNLKU_SOFTC(isp);
++		break;
++	    }
++	    case ISP_THREAD_FC_RESCAN:
++		ISP_LOCKU_SOFTC(isp);
++		if (isp_fc_runstate(isp, 250000) == 0) {
++		    isp->isp_deadloop = 0;
++		    isp->isp_downcnt = 0;
++		    isp->isp_fcrspend = 0;
++	    	    isp->isp_blocked = 0;
++		    isplinux_runwaitq(isp);
++		} else {
++		    /*
++		     * Try again in a little while.
++		     */
++		    isp->isp_fcrspend = 0;
++		    if (++isp->isp_downcnt == isp_deadloop_time) {
++			isp_prt(isp, ISP_LOGWARN, "assuming loop is dead");
++			FCPARAM(isp)->loop_seen_once = 0;
++			isp->isp_deadloop = 1;
++			isp->isp_downcnt = 0;
++			isp->isp_blocked = 0;	/* unblock anyway */
++			isplinux_flushwaitq(isp);
++		    } else {
++			isp->isp_fcrswdog = 1;
++		    }
++		}
++		ISP_UNLKU_SOFTC(isp);
++		break;
++	    case ISP_THREAD_EXIT:
++		if (ISP_THREAD_CAN_EXIT) {
++		    exit_thread = 1;
++		}
++		break;
++	   default:
++		break;
++	   }
++	   if (tap->thread_waiter) {
++		isp_prt(isp, ISP_LOGDEBUG1, "isp_task_thread signalling %p",
++		    tap->thread_waiter);
++		up(tap->thread_waiter);
++	   }
++	}
++    }
++    isp_prt(isp, ISP_LOGDEBUG1, "isp_task_thread exiting");
++    isp->isp_osinfo.task_request = NULL;
++    return (0);
++}
++
++void
++isp_prt(struct ispsoftc *isp, int level, const char *fmt, ...)
++{
++    char buf[256];
++    char *prefl;
++    va_list ap;
++
++    if (level != ISP_LOGALL && (level & isp->isp_dblev) == 0) {
++	return;
++    }
++    if (level & ISP_LOGERR) {
++	prefl = KERN_ERR "%s: ";
++    } else if (level & ISP_LOGWARN) {
++	prefl = KERN_WARNING "%s: ";
++    } else if (level & ISP_LOGINFO) {
++	prefl = KERN_NOTICE "%s: ";
++    } else if (level & ISP_LOGCONFIG) {
++	prefl = KERN_INFO "%s: ";
++    } else {
++	prefl = "%s: ";
++    }
++    printk(prefl, isp->isp_name);
++    va_start(ap, fmt);
++    vsprintf(buf, fmt, ap);
++    va_end(ap);
++    printk("%s\n", buf);
++}
++
++char *
++isp_snprintf(char *buf, size_t amt, const char *fmt, ...)
++{
++    va_list ap;
++    ARGSUSED(amt);
++    va_start(ap, fmt);
++    (void) vsprintf(buf, fmt, ap);
++    va_end(ap);
++    return (buf);
++}
++
++#ifdef MODULE
++#ifndef	ISP_LICENSE
++#define	ISP_LICENSE	"Dual BSD/GPL"
++#endif
++#ifdef	MODULE_LICENSE
++MODULE_LICENSE( ISP_LICENSE );
++#endif
++MODULE_PARM(isp_debug, "i");
++MODULE_PARM(isp_disable, "i");
++MODULE_PARM(isp_nonvram, "i");
++MODULE_PARM(isp_nofwreload, "i");
++MODULE_PARM(isp_maxluns, "i");
++MODULE_PARM(isp_throttle, "i");
++MODULE_PARM(isp_cmd_per_lun, "i");
++MODULE_PARM(isp_roles, "s");
++MODULE_PARM(isp_fcduplex, "i");
++MODULE_PARM(isp_wwpns, "s");
++MODULE_PARM(isp_wwnns, "s");
++MODULE_PARM(isp_nport_only, "i");
++MODULE_PARM(isp_loop_only, "i");
++MODULE_PARM(isp_deadloop_time, "i");
++MODULE_PARM(isp_xtime, "i");
++MODULE_PARM(isp_default_frame_size, "i");
++MODULE_PARM(isp_default_exec_throttle, "i");
++#endif
++#if	LINUX_VERSION_CODE < KERNEL_VERSION(2,3,27)
++struct proc_dir_entry proc_scsi_qlc = {
++    PROC_SCSI_QLOGICISP, 3, "isp", S_IFDIR | S_IRUGO | S_IXUGO, 2
++};
++#endif
++#if	LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) || defined(MODULE)
++Scsi_Host_Template driver_template = QLOGICISP;
++#include "scsi_module.c"
++#endif
++/*
++ * mode: c
++ * 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
++ * End:
++ */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp_linux.h	2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,1035 @@
++/* @(#)isp_linux.h 1.51 */
++/*
++ * Qlogic ISP SCSI Host Adapter Linux Wrapper Definitions
++ *---------------------------------------
++ * Copyright (c) 1998, 1999, 2000, 2001 by Matthew Jacob
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification, immediately at the beginning of the file.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * the GNU Public License ("GPL").
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ * 
++ * Matthew Jacob
++ * Feral Software
++ * PMB #825
++ * 5214-F Diamond Hts Blvd
++ * San Francisco, CA, 94131
++ * mjacob@feral.com
++ */
++
++#ifndef _ISP_LINUX_H
++#define _ISP_LINUX_H
++
++#include <linux/vmalloc.h>
++
++#ifndef	ISP_MODULE
++#define	__NO_VERSION__
++#endif
++#ifdef	LINUX_ISP_TARGET_MODE
++#define	EXPORT_SYMTAB
++#endif
++
++#include <linux/version.h>
++#ifndef	KERNEL_VERSION
++#define KERNEL_VERSION(v,p,s)		(((v)<<16)+(p<<8)+s)
++#endif
++#define	_KVC	KERNEL_VERSION
++
++#if LINUX_VERSION_CODE <= _KVC(2,2,0)
++#error	"Linux 2.0 and 2.1 kernels are not supported anymore"
++#endif
++#if LINUX_VERSION_CODE >= _KVC(2,3,0) && LINUX_VERSION_CODE < _KVC(2,4,0)
++#error	"Linux 2.3 kernels are not supported"
++#endif
++
++#ifndef	UNUSED_PARAMETER
++#define	UNUSED_PARAMETER(x)	(void) x
++#endif
++
++#include <linux/autoconf.h>
++#ifdef	CONFIG_SMP
++#define	__SMP__	1
++#endif
++
++#define COPYIN(u, k, n, m) \
++	copy_from_user((void*)(k), (const void*)(u), (n))
++#define COPYOUT(k, u, n, m) \
++	copy_to_user((void*)(u), (const void*)(k), (n))
++
++/*
++ * Be nice and get ourselves out of the way of other drivers.
++ * Note that if all the other drivers are there, then the only
++ * thing we'd attach to that they wouldn't would be the obsolete
++ *  and unavailable 1240 or the 23XX.
++ */
++#ifdef	CONFIG_SCSI_QLOGIC_ISP
++#define	ISP_DISABLE_1020_SUPPORT 1
++#endif
++#ifdef	CONFIG_SCSI_QLOGIC_FC
++#define	ISP_DISABLE_2100_SUPPORT 1
++#define	ISP_DISABLE_2200_SUPPORT 1
++#endif
++#ifdef	CONFIG_SCSI_QLOGIC_1280
++#define	ISP_DISABLE_1080_SUPPORT 1
++#define	ISP_DISABLE_12160_SUPPORT 1
++#endif
++
++#include <linux/module.h>
++#include <linux/config.h>
++#include <linux/init.h>
++#include <linux/types.h>
++#include <linux/blk.h>
++#include <linux/blkdev.h>
++#include <linux/delay.h>
++#include <linux/ioport.h>
++#include <linux/mm.h>
++#include <linux/sched.h>
++#include <linux/stat.h>
++#include <linux/pci.h>
++#include <asm/dma.h>
++#include <asm/io.h>
++#include <asm/irq.h>
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++#include <linux/smp.h>
++#include <linux/spinlock.h>
++#else
++#include <asm/spinlock.h>
++#endif
++#include <asm/system.h>
++#include <asm/byteorder.h>
++#include <linux/interrupt.h>
++#include "scsi.h"
++#include "hosts.h"
++
++#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,2,14)
++#define	DECLARE_MUTEX_LOCKED(sem) struct semaphore sem = MUTEX_LOCKED
++#define	__set_current_state(state_value)			\
++	do { current->state = (state_value); } while (0)
++static __inline void daemonize(void);
++static __inline void daemonize(void)
++{
++	struct fs_struct *fs;
++
++	exit_mm(current);
++	current->session = 1;
++	current->pgrp = 1;
++	current->tty = NULL;
++	exit_fs(current);	/* current->fs->count--; */
++	fs = init_task.fs;
++	current->fs = fs;
++	atomic_inc(&fs->count);
++}
++#endif
++/*
++ * These bits and pieces of keeping track of Linux versions
++ * and some of the various foo items for locking/unlocking
++ * gratefully borrowed from (amongst others) Doug Ledford
++ * and Gerard Roudier.
++ */
++
++#define	PWRB(p, o, r)	pci_write_config_byte(p->pci_dev, o, r)
++#define	PWRW(p, o, r)	pci_write_config_word(p->pci_dev, o, r)
++#define	PWRL(p, o, r)	pci_write_config_dword(p->pci_dev, o, r)
++#define	PRDW(p, o, r)	pci_read_config_word(p->pci_dev, o, r)
++#define	PRDD(p, o, r)	pci_read_config_dword(p->pci_dev, o, r)
++#define	PRDB(p, o, r)	pci_read_config_byte(p->pci_dev, o, r)
++
++#ifndef	bus_dvma_to_mem
++#if defined (__alpha__)
++#define bus_dvma_to_mem(p)              ((p) & 0xfffffffful)
++#else
++#define bus_dvma_to_mem(p)              (p)
++#endif
++#endif
++
++#if defined (__powerpc__)
++#undef	__pa
++#define	__pa(x)	x
++#endif
++#if defined (__i386__) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++#undef	__pa
++#define	__pa(x)	x
++#endif
++#if defined (__sparc__) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++#undef	__pa
++#define	__pa(x)	x
++#endif
++#if defined (__alpha__) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++#undef	__pa
++#define	__pa(x)	x
++#endif
++
++/*
++ * Efficiency- get rid of SBus code && tests unless we need them.
++ */
++#if	defined(__sparcv9__ ) || defined(__sparc__)
++#define	ISP_SBUS_SUPPORTED	1
++#else
++#define	ISP_SBUS_SUPPORTED	0
++#endif
++
++#define	ISP_PLATFORM_VERSION_MAJOR	2
++#define	ISP_PLATFORM_VERSION_MINOR	1
++
++#ifndef	BIG_ENDIAN
++#define	BIG_ENDIAN	4321
++#endif
++#ifndef	LITTLE_ENDIAN
++#define	LITTLE_ENDIAN	1234
++#endif
++
++#ifdef	__BIG_ENDIAN
++#define	BYTE_ORDER	BIG_ENDIAN
++#endif
++#ifdef	__LITTLE_ENDIAN
++#define	BYTE_ORDER	LITTLE_ENDIAN
++#endif
++
++#if	LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
++#define	DMA_ADDR_T		unsigned long
++#define	QLA_SG_C(sg)		sg->length
++#define	QLA_SG_A(sg)		virt_to_bus(sg->address)
++#else
++#define	DMA_ADDR_T		dma_addr_t
++#define	QLA_SG_C(sg)		sg_dma_len(sg)
++#define	QLA_SG_A(sg)		sg_dma_address(sg)
++#if	LINUX_VERSION_CODE < KERNEL_VERSION(2,4,16)
++#define	DMA_HTYPE_T		char *
++#define	QLA_HANDLE(cmd)		(cmd)->SCp.ptr
++#else
++#define	DMA_HTYPE_T		dma_addr_t
++#define	QLA_HANDLE(cmd)		(cmd)->SCp.dma_handle
++#endif
++#endif
++
++#define	HANDLE_LOOPSTATE_IN_OUTER_LAYERS	1
++#ifdef	min
++#undef	min
++#endif
++#ifdef	max
++#undef	max
++#endif
++
++
++/*
++ * Normally this should be taken care of by typedefs,
++ * but linux includes are a complete dog's breakfast.
++ */
++
++#define	u_int8_t	unsigned char
++#define	u_int16_t	unsigned short
++#define	u_int32_t	unsigned int
++#if BITS_PER_LONG == 64
++#define	u_int64_t	unsigned long
++#else
++#define	u_int64_t	unsigned long long
++#endif
++#define	int8_t		char
++#define	int16_t		short
++#define	int32_t		int
++#define	u_long		unsigned long
++#define	u_int		unsigned int
++#define	u_char		unsigned char
++typedef u_long vm_offset_t;
++
++#ifdef	LINUX_ISP_TARGET_MODE
++#define	DEFAULT_DEVICE_TYPE	3
++#define	NTGT_CMDS		256
++
++#define	_WIX(isp, b, ix)	(((b << 6)) | (ix >> 5))
++#define	_BIX(isp, ix)		(1 << (ix & 0x1f))
++
++#define	LUN_BTST(isp, b, ix)	\
++	(((isp)->isp_osinfo.lunbmap[_WIX(isp, b, ix)] & _BIX(isp, ix)) != 0)
++
++#define	LUN_BSET(isp, b, ix)	\
++	isp->isp_osinfo.lunbmap[_WIX(isp, b, ix)] |= _BIX(isp, ix)
++
++#define	LUN_BCLR(isp, b, ix)	\
++	isp->isp_osinfo.lunbmap[_WIX(isp, b, ix)] &= ~_BIX(isp, ix)
++
++#endif
++
++typedef struct {
++	enum {
++	    ISP_THREAD_NIL=1,
++	    ISP_THREAD_FC_RESCAN,
++	    ISP_THREAD_REINIT,
++	    ISP_THREAD_FW_CRASH_DUMP,
++	    ISP_THREAD_EXIT
++	}			thread_action;
++	struct semaphore *	thread_waiter;
++} isp_thread_action_t;
++#define	MAX_THREAD_ACTION	10
++
++union pstore;
++struct isposinfo {
++    struct ispsoftc *		isp_next;
++    struct Scsi_Host *		host;
++    Scsi_Cmnd			*wqnext, *wqtail;
++    Scsi_Cmnd			*dqnext, *dqtail;
++    union pstore		*storep;
++    char			hbaname[16];
++    unsigned short		instance;
++    unsigned short		wqcnt;
++    unsigned short		wqhiwater;
++    unsigned short		hiwater;
++    struct timer_list		timer;
++    struct timer_list		_mbtimer;
++    struct semaphore		_mbox_sem;
++    struct semaphore		_mbox_c_sem;
++    struct semaphore		_fcs_sem;
++    spinlock_t			slock;
++    unsigned volatile int
++		_downcnt	: 8,
++				: 15,
++		_isopen		: 1,
++		_deadloop	: 1,
++		_draining	: 1,
++		_blocked	: 1,
++		_fcrswdog	: 1,
++		_fcrspend	: 1,
++    		_dogactive	: 1,
++		_mbox_waiting	: 1,
++    		_mbintsok	: 1;
++    void *			misc[8]; /* private platform variant usage */
++    unsigned long		_iflags;
++    struct task_struct *	task_thread;
++    struct semaphore *		task_request;
++    struct semaphore *		task_ctl_sem;
++    spinlock_t			tlock;
++    unsigned int		nt_actions;
++    unsigned int		device_id;
++    isp_thread_action_t		t_actions[MAX_THREAD_ACTION];
++#ifdef	LINUX_ISP_TARGET_MODE
++#define	TM_WANTED		0x08
++#define	TM_BUSY			0x04
++#define	TM_TMODE_ENABLED	0x03
++    u_int32_t		rollinfo	: 16,
++    			rstatus		: 8,
++					: 3,
++			hcb		: 1,
++			tmflags		: 4;
++    struct semaphore		tgt_inisem;
++    struct semaphore *		rsemap;
++   /*
++    * This is very inefficient, but is in fact big enough
++    * to cover a complete bitmap for Fibre Channel, as well
++    * as the dual bus SCSI cards. This works out without
++    * overflow easily because the most you can enable
++    * for the SCSI cards is 64 luns (x 2 busses).
++    *
++    * For Fibre Channel, we can run the max luns up to 16384
++    * but we'll default to the minimum we can support here.
++    */
++#define	TM_MAX_LUN_FC		128
++#define	TM_MAX_LUN_SCSI		64
++    u_int32_t			lunbmap[TM_MAX_LUN_FC >> 5];
++    struct tmd_cmd *		pending_t;
++    struct tmd_cmd *		tfreelist;
++    struct tmd_cmd *		pool;
++#endif
++};
++#define	mbtimer		isp_osinfo._mbtimer
++#define	dogactive	isp_osinfo._dogactive
++#define	mbox_sem	isp_osinfo._mbox_sem
++#define	mbox_c_sem	isp_osinfo._mbox_c_sem
++#define	fcs_sem		isp_osinfo._fcs_sem
++#define	mbintsok	isp_osinfo._mbintsok
++#define	mbox_waiting	isp_osinfo._mbox_waiting
++#define	isp_pbuf	isp_osinfo._pbuf
++#define	isp_fcrspend	isp_osinfo._fcrspend
++#define	isp_fcrswdog	isp_osinfo._fcrswdog
++#define	isp_blocked	isp_osinfo._blocked
++#define	isp_draining	isp_osinfo._draining
++#define	isp_downcnt	isp_osinfo._downcnt
++#define	isp_isopen	isp_osinfo._isopen
++#define	isp_deadloop	isp_osinfo._deadloop
++
++#define	iflags		isp_osinfo._iflags
++
++#define	SEND_THREAD_EVENT(isp, action, dowait)				\
++if (isp->isp_osinfo.task_request) {					\
++    unsigned long flags;						\
++    spin_lock_irqsave(&isp->isp_osinfo.tlock, flags);			\
++    if (isp->isp_osinfo.nt_actions >= MAX_THREAD_ACTION) {		\
++	spin_unlock_irqrestore(&isp->isp_osinfo.tlock, flags);		\
++	isp_prt(isp, ISP_LOGERR, "thread event overflow");		\
++    } else if (action == ISP_THREAD_FC_RESCAN && isp->isp_fcrspend) {	\
++	spin_unlock_irqrestore(&isp->isp_osinfo.tlock, flags);		\
++    } else {								\
++	DECLARE_MUTEX_LOCKED(sem);					\
++	isp_thread_action_t *tap;					\
++	tap = &isp->isp_osinfo.t_actions[isp->isp_osinfo.nt_actions++];	\
++	tap->thread_action = action;					\
++	if (dowait)							\
++	    tap->thread_waiter = &sem;					\
++	else								\
++	    tap->thread_waiter = 0;					\
++	if (action == ISP_THREAD_FC_RESCAN)				\
++	    isp->isp_fcrspend = 1;					\
++	up(isp->isp_osinfo.task_request);				\
++	spin_unlock_irqrestore(&isp->isp_osinfo.tlock, flags);		\
++	if (dowait) {							\
++	    down(&sem);							\
++	    isp_prt(isp, ISP_LOGDEBUG1,					\
++		"action %d done from %p", action, &sem);		\
++	} else {							\
++	    isp_prt(isp, ISP_LOGDEBUG1,					\
++		"action %d sent", action);				\
++	}								\
++    }									\
++}
++
++/*
++ * Locking macros...
++ */
++#define	ISP_LOCK_INIT(isp)		spin_lock_init(&isp->isp_osinfo.slock)
++#define	ISP_LOCK_SOFTC(isp)		{				\
++		unsigned long _flags;					\
++		spin_lock_irqsave(&isp->isp_osinfo.slock, _flags);	\
++		isp->iflags = _flags;					\
++	}
++#define	ISP_UNLK_SOFTC(isp)		{				\
++		unsigned long _flags = isp->iflags;			\
++		spin_unlock_irqrestore(&isp->isp_osinfo.slock, _flags);	\
++	}
++
++#define	ISP_ILOCK_SOFTC			ISP_LOCK_SOFTC
++#define	ISP_IUNLK_SOFTC			ISP_UNLK_SOFTC
++#define	ISP_IGET_LK_SOFTC		ISP_LOCK_SOFTC
++#define	ISP_DROP_LK_SOFTC		ISP_UNLK_SOFTC
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
++#define	ISP_LOCK_SCSI_DONE(isp)		{				\
++		unsigned long _flags;					\
++		spin_lock_irqsave(&io_request_lock, _flags);		\
++		isp->iflags = _flags;					\
++	}
++#define	ISP_UNLK_SCSI_DONE(isp)		{				\
++		unsigned long _flags = isp->iflags;			\
++		spin_unlock_irqrestore(&io_request_lock, _flags);	\
++	}
++#else
++#define	ISP_LOCK_SCSI_DONE(isp)		do { } while(0)
++#define	ISP_UNLK_SCSI_DONE(isp)		do { } while(0)
++#endif
++#define	ISP_LOCKU_SOFTC			ISP_ILOCK_SOFTC
++#define	ISP_UNLKU_SOFTC			ISP_IUNLK_SOFTC
++#define	ISP_TLOCK_INIT(isp)		spin_lock_init(&isp->isp_osinfo.tlock)
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++#define	ISP_DRIVER_ENTRY_LOCK(isp)	spin_unlock_irq(&io_request_lock)
++#define	ISP_DRIVER_EXIT_LOCK(isp)	spin_lock_irq(&io_request_lock)
++#else
++#define	ISP_DRIVER_ENTRY_LOCK(isp)	\
++	spin_unlock_irq(isp->isp_osinfo.host->host_lock)
++#define	ISP_DRIVER_EXIT_LOCK(isp)	\
++	spin_lock_irq(isp->isp_osinfo.host->host_lock)
++#endif
++
++#define	ISP_MUST_POLL(isp)	(in_interrupt() || isp->mbintsok == 0)
++/*
++ * Misc SCSI defines
++ */
++#define	MSG_SIMPLE_Q_TAG	0x21
++#define	MSG_HEAD_OF_Q_TAG	0x22
++#define	MSG_ORDERED_Q_TAG	0x23
++
++/*
++ * Required Macros/Defines
++ */
++
++#define	INLINE			__inline
++
++#if	LINUX_VERSION_CODE > KERNEL_VERSION(2,4,18) && \
++    defined(CONFIG_HIGHMEM64G) && !defined(LINUX_ISP_TARGET_MODE)
++#define	ISP_DAC_SUPPORTED	1
++#else
++#define	ISP_DAC_SUPPORTED	0
++#endif
++
++#define	ISP2100_SCRLEN		0x800
++
++#if	LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
++#define	MEMZERO			_isp_memzero
++#define	MEMCPY			_isp_memcpy
++#else
++#define	MEMZERO(b, a)		memset(b, 0, a)
++#define	MEMCPY			memcpy
++#endif
++#define	SNPRINTF		isp_snprintf
++#define	USEC_DELAY		_isp_usec_delay
++#define	USEC_SLEEP(isp, x)						\
++		ISP_DROP_LK_SOFTC(isp);					\
++		__set_current_state(TASK_UNINTERRUPTIBLE);		\
++		(void) schedule_timeout(_usec_to_jiffies(x));		\
++		ISP_IGET_LK_SOFTC(isp)
++
++#define	NANOTIME_T		struct timeval
++/* for prior to 2.2.19, use do_gettimeofday, and, well, it'll be inaccurate */
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18)
++#define	GET_NANOTIME(ptr)	\
++	(ptr)->tv_sec = 0, (ptr)->tv_usec = 0, get_fast_time(ptr)
++#else
++#define	GET_NANOTIME(ptr)	\
++	(ptr)->tv_sec = 0, (ptr)->tv_usec = 0, do_gettimeofday(ptr)
++#endif
++#define	GET_NANOSEC(x)		\
++  ((u_int64_t) ((((u_int64_t)(x)->tv_sec) * 1000000 + (x)->tv_usec)))
++#define	NANOTIME_SUB		_isp_microtime_sub
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
++#define	MAXISPREQUEST(isp)	256
++#else
++#define	MAXISPREQUEST(isp)	((IS_FC(isp) || IS_ULTRA2(isp))? 1024 : 256)
++#endif
++
++#if	defined(__i386__)
++#define	MEMORYBARRIER(isp, type, offset, size)	barrier()
++#elif	defined(__alpha__)
++#define	MEMORYBARRIER(isp, type, offset, size)	mb()
++#elif	defined(__sparc__)
++#define	MEMORYBARRIER(isp, type, offset, size)	mb()
++#elif	defined(__powerpc__)
++#define	MEMORYBARRIER(isp, type, offset, size)	\
++	__asm__ __volatile__("eieio" ::: "memory")
++#else
++#  ifdef mb
++#    define	MEMORYBARRIER(isp, type, offset, size)	mb()
++#  else
++#    define	MEMORYBARRIER(isp, type, offset, size)	barrier()
++#  endif
++#endif
++
++#define	MBOX_ACQUIRE(isp)						\
++	/*								\
++	 * Try and acquire semaphore the easy way first-		\
++	 * with our lock already held.					\
++	 */								\
++	if (down_trylock(&isp->mbox_sem)) {				\
++	    if (in_interrupt()) {					\
++		mbp->param[0] = MBOX_HOST_INTERFACE_ERROR;		\
++		isp_prt(isp, ISP_LOGERR, "cannot acquire MBOX sema");	\
++		return;							\
++	    }								\
++	    ISP_DROP_LK_SOFTC(isp);					\
++	    down(&isp->mbox_sem);					\
++	    ISP_IGET_LK_SOFTC(isp);					\
++	}
++
++#define	MBOX_WAIT_COMPLETE(isp)						\
++	if (ISP_MUST_POLL(isp)) {					\
++		int j, lim = 5000000;					\
++		if (isp->isp_mbxwrk0) {					\
++			lim *= 12;					\
++		}							\
++		for (j = 0; j < 5000000; j += 100) {			\
++			u_int16_t isr, sema, mbox;			\
++			if (isp->isp_mboxbsy == 0) {			\
++				break;					\
++			}						\
++			if (ISP_READ_ISR(isp, &isr, &sema, &mbox)) {	\
++				isp_intr(isp, isr, sema, mbox);		\
++				if (isp->isp_mboxbsy == 0) {		\
++					break;				\
++				}					\
++			}						\
++			ISP_DROP_LK_SOFTC(isp);				\
++			udelay(100);					\
++			ISP_IGET_LK_SOFTC(isp);				\
++		}							\
++		if (isp->isp_mboxbsy != 0) {				\
++			isp_prt(isp, ISP_LOGWARN,			\
++			    "Polled Mailbox Command (0x%x) Timeout",	\
++			    isp->isp_lastmbxcmd);			\
++			isp->isp_mboxbsy = 0;				\
++		}							\
++	} else {							\
++		int lim = (isp->isp_mbxwrk0)? 60 : 5;			\
++		init_timer(&isp->mbtimer);				\
++		isp->mbtimer.data = (unsigned long) isp;		\
++		isp->mbtimer.function = isplinux_mbtimer;		\
++    		isp->mbtimer.expires = jiffies + (lim * HZ);		\
++    		add_timer(&isp->mbtimer);				\
++		isp->mbox_waiting = 1;					\
++		ISP_DROP_LK_SOFTC(isp);					\
++		down(&isp->mbox_c_sem);					\
++		ISP_IGET_LK_SOFTC(isp);					\
++		isp->mbox_waiting = 0;					\
++    		del_timer(&isp->mbtimer);				\
++		if (isp->isp_mboxbsy != 0) {				\
++			isp_prt(isp, ISP_LOGWARN,			\
++			    "Interrupting Mailbox Command (0x%x) Timeout",\
++			    isp->isp_lastmbxcmd);			\
++			isp->isp_mboxbsy = 0;				\
++		}							\
++	}
++
++#define	MBOX_NOTIFY_COMPLETE(isp)					\
++	if (isp->mbox_waiting) {					\
++		isp->mbox_waiting = 0;					\
++		up(&isp->mbox_c_sem);					\
++	}								\
++	isp->isp_mboxbsy = 0
++
++#define	MBOX_RELEASE(isp)	up(&isp->mbox_sem)
++
++#define	FC_SCRATCH_ACQUIRE(isp)						\
++	/*								\
++	 * Try and acquire semaphore the easy way first-		\
++	 * with our lock already held.					\
++	 */								\
++	if (in_interrupt()) {						\
++		while (down_trylock(&isp->fcs_sem)) {			\
++			ISP_DROP_LK_SOFTC(isp);				\
++			USEC_DELAY(5000);				\
++			ISP_IGET_LK_SOFTC(isp);				\
++		}							\
++	} else {							\
++	    ISP_DROP_LK_SOFTC(isp);					\
++	    down(&isp->fcs_sem);					\
++	    ISP_IGET_LK_SOFTC(isp);					\
++	}
++
++#define	FC_SCRATCH_RELEASE(isp)	up(&isp->fcs_sem)
++
++
++#ifndef	SCSI_GOOD
++#define	SCSI_GOOD	0x0
++#endif
++#ifndef	SCSI_CHECK
++#define	SCSI_CHECK	0x2
++#endif
++#ifndef	SCSI_BUSY
++#define	SCSI_BUSY	0x8
++#endif
++#ifndef	SCSI_QFULL
++#define	SCSI_QFULL	0x28
++#endif
++
++#define	XS_T			Scsi_Cmnd
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++#define	XS_HOST(Cmnd)		Cmnd->device->host
++#define	XS_ISP(Cmnd)		((struct ispsoftc *) (Cmnd)->host->hostdata)
++#define	XS_CHANNEL(Cmnd)	(Cmnd)->channel
++#define	XS_TGT(Cmnd)		(Cmnd)->target
++#define	XS_LUN(Cmnd)		(Cmnd)->lun
++#else
++#define	XS_HOST(Cmnd)		Cmnd->device->host
++#define	XS_ISP(Cmnd)		\
++	((struct ispsoftc *) (Cmnd)->device->host->hostdata)
++#define	XS_CHANNEL(Cmnd)	(Cmnd)->device->channel
++#define	XS_TGT(Cmnd)		(Cmnd)->device->id
++#define	XS_LUN(Cmnd)		(Cmnd)->device->lun
++#endif
++#define	XS_CDBP(Cmnd)		(Cmnd)->cmnd
++#define	XS_CDBLEN(Cmnd)		(Cmnd)->cmd_len
++#define	XS_XFRLEN(Cmnd)		(Cmnd)->request_bufflen
++#define	XS_TIME(Cmnd)		(Cmnd)->timeout
++#define	XS_RESID(Cmnd)		(Cmnd)->SCp.this_residual
++#define	XS_STSP(Cmnd)		(&(Cmnd)->SCp.Status)
++#define	XS_SNSP(Cmnd)		(Cmnd)->sense_buffer
++#define	XS_SNSLEN(Cmnd)		(sizeof (Cmnd)->sense_buffer)
++#define	XS_SNSKEY(Cmnd)		((Cmnd)->sense_buffer[2] & 0xf)
++#define	XS_TAG_P(Cmnd)		(Cmnd->device->tagged_supported != 0)
++#define	XS_TAG_TYPE(xs)		REQFLAG_STAG
++
++#define	XS_SETERR(xs, v)	\
++	if ((v) == HBA_TGTBSY) { \
++		(xs)->SCp.Status = SCSI_BUSY; \
++	} else { \
++		(xs)->result &= ~0xff0000; \
++		(xs)->result |= ((v) << 16); \
++	}
++
++#	define	HBA_NOERROR		DID_OK
++#	define	HBA_BOTCH		DID_ERROR
++#	define	HBA_CMDTIMEOUT		DID_TIME_OUT
++#	define	HBA_SELTIMEOUT		DID_NO_CONNECT
++#	define	HBA_TGTBSY		123456 /* special handling */
++#	define	HBA_BUSRESET		DID_RESET
++#	define	HBA_ABORTED		DID_ABORT
++#	define	HBA_DATAOVR		DID_ERROR
++#	define	HBA_ARQFAIL		DID_ERROR
++
++#define	XS_ERR(xs)		host_byte((xs)->result)
++
++#define	XS_NOERR(xs)		host_byte((xs)->result) == DID_OK
++
++#define	XS_INITERR(xs)		(xs)->result = 0, (xs)->SCp.Status = 0
++
++#define	XS_SAVE_SENSE(Cmnd, sp)				\
++	MEMCPY(&Cmnd->sense_buffer, sp->req_sense_data, \
++	    min(sizeof Cmnd->sense_buffer, sp->req_sense_len))
++
++#define	XS_SET_STATE_STAT(a, b, c)
++
++#define	DEFAULT_IID(x)		7
++#define	DEFAULT_LOOPID(x)	111
++#define	DEFAULT_NODEWWN(isp)	(isp)->isp_defwwnn
++#define	DEFAULT_PORTWWN(isp)	(isp)->isp_defwwpn
++#define	DEFAULT_FRAME_SIZE(isp)	\
++    (IS_SCSI(isp)? 0 : isp->isp_osinfo.storep->fibre_scsi.default_frame_size)
++#define	DEFAULT_EXEC_ALLOC(isp)	\
++    (IS_SCSI(isp)? 0 : isp->isp_osinfo.storep->fibre_scsi.default_exec_alloc)
++#define	ISP_NODEWWN(isp)	(isp)->isp_nvramwwnn
++#define	ISP_PORTWWN(isp)	(isp)->isp_nvramwwpn
++
++#define	ISP_IOXPUT_8(isp, s, d)		*(d) = s
++#define	ISP_IOXPUT_16(isp, s, d)	*(d) = cpu_to_le16(s)
++#define	ISP_IOXPUT_32(isp, s, d)	*(d) = cpu_to_le32(s)
++
++#define	ISP_IOXGET_8(isp, s, d)		d = *(s)
++#define	ISP_IOXGET_16(isp, s, d)	d = le16_to_cpu(*((u_int16_t *)s))
++#define	ISP_IOXGET_32(isp, s, d)	d = le32_to_cpu(*((u_int32_t *)s))
++
++#define	ISP_SWIZZLE_NVRAM_WORD(isp, rp)	*rp = le16_to_cpu(*rp)
++
++
++/*
++ * Includes of common header files
++ */
++#include "ispreg.h"
++#include "ispvar.h"
++#include "ispmbox.h"
++
++/*
++ * isp_osinfo definitions, extensions and shorthand.
++ */
++
++/*
++ * Parameter storage. The order of tags is important- sdparam && fcp
++ * must come first because isp->isp_params is set to point there...
++ */
++union pstore {
++    struct {
++	sdparam _sdp[2];	/* they need to be sequential */
++	u_char psc_opts[2][MAX_TARGETS];
++	u_char dutydone;
++    } parallel_scsi;
++    struct {
++	fcparam fcp;
++	u_int64_t wwnn;
++	u_int64_t wwpn;
++	u_int64_t nvram_wwnn;
++	u_int64_t nvram_wwpn;
++	u_int16_t default_frame_size;
++	u_int16_t default_exec_throttle;
++    } fibre_scsi;
++};
++#define	isp_next	isp_osinfo.isp_next
++#define	isp_name	isp_osinfo.hbaname
++#define	isp_host	isp_osinfo.host
++#define	isp_unit	isp_osinfo.instance
++#define	isp_psco	isp_osinfo.storep->parallel_scsi.psc_opts
++#define	isp_dutydone	isp_osinfo.storep->parallel_scsi.dutydone
++#define	isp_defwwnn	isp_osinfo.storep->fibre_scsi.wwnn
++#define	isp_defwwpn	isp_osinfo.storep->fibre_scsi.wwpn
++#define	isp_nvramwwnn	isp_osinfo.storep->fibre_scsi.nvram_wwnn
++#define	isp_nvramwwpn	isp_osinfo.storep->fibre_scsi.nvram_wwpn
++
++/*
++ * Driver prototypes..
++ */
++void isplinux_timer(unsigned long);
++void isplinux_mbtimer(unsigned long);
++irqreturn_t isplinux_intr(int, void *, struct pt_regs *);
++void isplinux_common_init(struct ispsoftc *);
++#ifdef	CONFIG_PROC_FS
++void isplinux_init_proc(struct ispsoftc *);
++void isplinux_undo_proc(struct ispsoftc *);
++#endif
++void isplinux_reinit(struct ispsoftc *);
++void isplinux_sqd(struct Scsi_Host *, Scsi_Device *);
++
++int isp_drain_reset(struct ispsoftc *, char *);
++int isp_drain(struct ispsoftc *, char *);
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
++static INLINE void _isp_memcpy(void *, void *, size_t);
++static INLINE void _isp_memzero(void *,  size_t);
++#endif
++static INLINE u_int64_t _isp_microtime_sub(struct timeval *, struct timeval *);
++static INLINE void _isp_usec_delay(unsigned int);
++static INLINE unsigned long _usec_to_jiffies(unsigned int);
++
++int isplinux_proc_info(char *, char **, off_t, int, int, int);
++int isplinux_detect(Scsi_Host_Template *);
++int isplinux_release(struct Scsi_Host *);
++#define	ISPLINUX_RELEASE	isplinux_release
++const char *isplinux_info(struct Scsi_Host *);
++int isplinux_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *));
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++int isplinux_biosparam(Disk *, kdev_t, int[]);
++#else
++int isplinux_biosparam(struct scsi_device *, struct block_device *,
++    sector_t, int[]); 
++#endif
++
++
++/*
++ * Driver wide data...
++ */
++extern int isp_debug;
++extern int isp_unit_seed;
++extern int isp_disable;
++extern int isp_nofwreload;
++extern int isp_nonvram;
++extern int isp_fcduplex;
++extern struct ispsoftc *isplist;
++extern const char *class3_roles[4];
++
++/*
++ * Platform private flags
++ */
++#ifndef NULL
++#define NULL ((void *) 0)
++#endif
++
++#define	ISP_WATCH_TIME		HZ
++
++#ifndef	min
++#define min(a,b) (((a)<(b))?(a):(b))
++#endif
++#ifndef	max
++#define	max(a, b)		(((a) > (b)) ? (a) : (b))
++#endif
++#ifndef	roundup
++#define	roundup(x, y)	((((x)+((y)-1))/(y))*(y))
++#endif
++#ifndef	ARGSUSED
++#define	ARGSUSED(x)	x = x
++#endif
++
++
++
++
++/*
++ * Platform specific 'inline' or support functions
++ */
++
++#ifdef	__sparc__
++#define	_SBSWAP(isp, b, c)						\
++	if (isp->isp_bustype == ISP_BT_SBUS) {				\
++		u_int8_t tmp = b;					\
++		b = c;							\
++		c = tmp;						\
++	}
++#else
++#define	_SBSWAP(a, b, c)
++#endif
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
++static INLINE void
++_isp_memcpy(void *to, void *from, size_t amt)
++{
++	unsigned char *x = to; unsigned char *y = from;
++	while (amt-- != 0) *x++ = *y++;
++}
++
++static INLINE void
++_isp_memzero(void *to, size_t amt)
++{
++	unsigned char *x = to;
++	while (amt-- != 0) *x++ = 0;
++}
++
++static INLINE unsigned long IspOrder(int);
++static INLINE unsigned long
++IspOrder(int nelem)
++{
++    unsigned long order, rsize;
++
++    order = 0;
++    rsize = PAGE_SIZE;
++    while (rsize < (unsigned long) ISP_QUEUE_SIZE(nelem)) {
++	order++;
++	rsize <<= 1;
++    }
++    return (order);
++}
++#endif
++
++static INLINE u_int64_t
++_isp_microtime_sub(struct timeval *b, struct timeval *a)
++{
++	u_int64_t elapsed;
++	struct timeval x = *b;
++	x.tv_sec -= a->tv_sec;
++	x.tv_usec -= a->tv_usec;
++        if (x.tv_usec < 0) {
++                x.tv_sec--;
++                x.tv_usec += 1000000;
++        }
++        if (x.tv_usec >= 1000000) {
++                x.tv_sec++;
++                x.tv_usec -= 1000000;
++        }
++	elapsed = GET_NANOSEC(&x);
++	if (elapsed == 0)
++		elapsed++;
++	if ((int64_t) elapsed < 0)	/* !!!! */
++		return (1000);
++	return (elapsed * 1000);
++}
++
++static INLINE void
++_isp_usec_delay(unsigned int usecs)
++{
++    while (usecs > 1000) {
++	mdelay(1);
++	usecs -= 1000;
++    }
++    if (usecs)
++	udelay(usecs);
++}
++
++static INLINE unsigned long
++_usec_to_jiffies(unsigned int usecs)
++{
++	struct timespec lt;
++	if (usecs == 0)
++		usecs++;
++	lt.tv_sec = 0;
++	lt.tv_nsec = usecs * 1000;
++	return (timespec_to_jiffies(&lt));
++}
++
++#define	GetPages(a)	__get_dma_pages(GFP_ATOMIC|GFP_DMA, a)
++#define	RlsPages(a, b)	free_pages((unsigned long) a, b)
++
++char *isp_snprintf(char *, size_t, const char *, ...);
++
++static INLINE void *isp_kalloc(size_t, int);
++static INLINE void *isp_kzalloc(size_t, int);
++static INLINE void isp_kfree(void *, size_t);
++
++static INLINE void *
++isp_kalloc(size_t size, int flags)
++{
++    void *ptr;
++    if (size > PAGE_SIZE) {
++        ptr = vmalloc(size);
++    } else {
++        ptr = kmalloc(size, flags);
++    }
++    return (ptr);
++}
++
++static INLINE void *
++isp_kzalloc(size_t size, int flags)
++{
++    void *ptr = isp_kalloc(size, flags);
++    if (ptr != NULL){
++        memset(ptr, 0, size);
++    }
++    return (ptr);
++}
++
++static INLINE void
++isp_kfree(void *ptr, size_t size)
++{
++    if (size > PAGE_SIZE) {
++        vfree(ptr);
++    } else {
++        kfree(ptr);
++    }
++}
++
++/*
++ * Common inline functions
++ */
++
++#include "isp_inline.h"
++
++#ifdef	ISP_TARGET_MODE
++void isp_attach_target(ispsoftc_t *);
++void isp_detach_target(ispsoftc_t *);
++int isp_target_async(struct ispsoftc *, int, int);
++int isp_target_notify(struct ispsoftc *, void *, u_int16_t *);
++#endif
++#ifdef	LINUX_ISP_TARGET_MODE
++int isp_en_dis_lun(struct ispsoftc *, int, int, int, int);
++#endif
++/*
++ * Config data
++ */
++
++int isplinux_abort(Scsi_Cmnd *);
++int isplinux_bdr(Scsi_Cmnd *);
++int isplinux_sreset(Scsi_Cmnd *);
++int isplinux_hreset(Scsi_Cmnd *);
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++#define QLOGICISP {							\
++	next:				NULL,				\
++	module:				NULL,				\
++	proc_info:			isplinux_proc_info,		\
++	name:				"Qlogic ISP 10X0/2X00",		\
++	detect:				isplinux_detect,		\
++	release:			ISPLINUX_RELEASE,		\
++	info:				isplinux_info,			\
++	queuecommand:			isplinux_queuecommand,		\
++	use_new_eh_code:		1,				\
++	eh_abort_handler:		isplinux_abort,			\
++	eh_device_reset_handler:	isplinux_bdr,			\
++	eh_bus_reset_handler:		isplinux_sreset,		\
++	eh_host_reset_handler:		isplinux_hreset,		\
++	bios_param:			isplinux_biosparam,		\
++	can_queue:			1,	   			\
++	sg_tablesize:			SG_ALL,				\
++	use_clustering:			ENABLE_CLUSTERING,		\
++	cmd_per_lun:			1				\
++}
++#else
++#define QLOGICISP {							\
++	module:				NULL,				\
++	proc_info:			isplinux_proc_info,		\
++	name:				"Qlogic ISP 10X0/2X00",		\
++	detect:				isplinux_detect,		\
++	release:			ISPLINUX_RELEASE,		\
++	info:				isplinux_info,			\
++	queuecommand:			isplinux_queuecommand,		\
++	eh_abort_handler:		isplinux_abort,			\
++	eh_device_reset_handler:	isplinux_bdr,			\
++	eh_bus_reset_handler:		isplinux_sreset,		\
++	eh_host_reset_handler:		isplinux_hreset,		\
++	bios_param:			isplinux_biosparam,		\
++	can_queue:			1,	   			\
++	sg_tablesize:			SG_ALL,				\
++	use_clustering:			ENABLE_CLUSTERING,		\
++	cmd_per_lun:			1,				\
++	slave_configure:		isplinux_slave_configure,	\
++}
++#endif
++/*
++ * mode: c
++ * 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
++ * End:
++ */
++#endif /* _ISP_LINUX_H */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/ispmbox.h	2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,938 @@
++/* @(#)ispmbox.h 1.24 */
++/*
++ * Mailbox and Queue Entry Definitions for for Qlogic ISP SCSI adapters.
++ *
++ * Copyright (c) 1997, 1998, 1999, 2000 by Matthew Jacob
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice immediately at the beginning of the file, without modification,
++ *    this list of conditions, and the following disclaimer.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ *
++ */
++#ifndef	_ISPMBOX_H
++#define	_ISPMBOX_H
++
++/*
++ * Mailbox Command Opcodes
++ */
++#define MBOX_NO_OP			0x0000
++#define MBOX_LOAD_RAM			0x0001
++#define MBOX_EXEC_FIRMWARE		0x0002
++#define MBOX_DUMP_RAM			0x0003
++#define MBOX_WRITE_RAM_WORD		0x0004
++#define MBOX_READ_RAM_WORD		0x0005
++#define MBOX_MAILBOX_REG_TEST		0x0006
++#define MBOX_VERIFY_CHECKSUM		0x0007
++#define MBOX_ABOUT_FIRMWARE		0x0008
++					/*   9 */
++					/*   a */
++					/*   b */
++					/*   c */
++					/*   d */
++#define MBOX_CHECK_FIRMWARE		0x000e
++#define	MBOX_READ_RAM_WORD_EXTENDED	0x000f
++#define MBOX_INIT_REQ_QUEUE		0x0010
++#define MBOX_INIT_RES_QUEUE		0x0011
++#define MBOX_EXECUTE_IOCB		0x0012
++#define MBOX_WAKE_UP			0x0013
++#define MBOX_STOP_FIRMWARE		0x0014
++#define MBOX_ABORT			0x0015
++#define MBOX_ABORT_DEVICE		0x0016
++#define MBOX_ABORT_TARGET		0x0017
++#define MBOX_BUS_RESET			0x0018
++#define MBOX_STOP_QUEUE			0x0019
++#define MBOX_START_QUEUE		0x001a
++#define MBOX_SINGLE_STEP_QUEUE		0x001b
++#define MBOX_ABORT_QUEUE		0x001c
++#define MBOX_GET_DEV_QUEUE_STATUS	0x001d
++					/*  1e */
++#define MBOX_GET_FIRMWARE_STATUS	0x001f
++#define MBOX_GET_INIT_SCSI_ID		0x0020
++#define MBOX_GET_SELECT_TIMEOUT		0x0021
++#define MBOX_GET_RETRY_COUNT		0x0022
++#define MBOX_GET_TAG_AGE_LIMIT		0x0023
++#define MBOX_GET_CLOCK_RATE		0x0024
++#define MBOX_GET_ACT_NEG_STATE		0x0025
++#define MBOX_GET_ASYNC_DATA_SETUP_TIME	0x0026
++#define MBOX_GET_SBUS_PARAMS		0x0027
++#define		MBOX_GET_PCI_PARAMS	MBOX_GET_SBUS_PARAMS
++#define MBOX_GET_TARGET_PARAMS		0x0028
++#define MBOX_GET_DEV_QUEUE_PARAMS	0x0029
++#define	MBOX_GET_RESET_DELAY_PARAMS	0x002a
++					/*  2b */
++					/*  2c */
++					/*  2d */
++					/*  2e */
++					/*  2f */
++#define MBOX_SET_INIT_SCSI_ID		0x0030
++#define MBOX_SET_SELECT_TIMEOUT		0x0031
++#define MBOX_SET_RETRY_COUNT		0x0032
++#define MBOX_SET_TAG_AGE_LIMIT		0x0033
++#define MBOX_SET_CLOCK_RATE		0x0034
++#define MBOX_SET_ACT_NEG_STATE		0x0035
++#define MBOX_SET_ASYNC_DATA_SETUP_TIME	0x0036
++#define MBOX_SET_SBUS_CONTROL_PARAMS	0x0037
++#define		MBOX_SET_PCI_PARAMETERS	0x0037
++#define MBOX_SET_TARGET_PARAMS		0x0038
++#define MBOX_SET_DEV_QUEUE_PARAMS	0x0039
++#define	MBOX_SET_RESET_DELAY_PARAMS	0x003a
++					/*  3b */
++					/*  3c */
++					/*  3d */
++					/*  3e */
++					/*  3f */
++#define	MBOX_RETURN_BIOS_BLOCK_ADDR	0x0040
++#define	MBOX_WRITE_FOUR_RAM_WORDS	0x0041
++#define	MBOX_EXEC_BIOS_IOCB		0x0042
++#define	MBOX_SET_FW_FEATURES		0x004a
++#define	MBOX_GET_FW_FEATURES		0x004b
++#define		FW_FEATURE_FAST_POST	0x1
++#define		FW_FEATURE_LVD_NOTIFY	0x2
++#define		FW_FEATURE_RIO_32BIT	0x4
++#define		FW_FEATURE_RIO_16BIT	0x8
++
++#define	MBOX_INIT_REQ_QUEUE_A64		0x0052
++#define	MBOX_INIT_RES_QUEUE_A64		0x0053
++
++#define	MBOX_ENABLE_TARGET_MODE		0x0055
++#define		ENABLE_TARGET_FLAG	0x8000
++#define		ENABLE_TQING_FLAG	0x0004
++#define		ENABLE_MANDATORY_DISC	0x0002
++#define	MBOX_GET_TARGET_STATUS		0x0056
++
++/* These are for the ISP2X00 FC cards */
++#define	MBOX_GET_LOOP_ID		0x0020
++#define	MBOX_GET_FIRMWARE_OPTIONS	0x0028
++#define	MBOX_SET_FIRMWARE_OPTIONS	0x0038
++#define	MBOX_GET_RESOURCE_COUNT		0x0042
++#define	MBOX_ENHANCED_GET_PDB		0x0047
++#define	MBOX_EXEC_COMMAND_IOCB_A64	0x0054
++#define	MBOX_INIT_FIRMWARE		0x0060
++#define	MBOX_GET_INIT_CONTROL_BLOCK	0x0061
++#define	MBOX_INIT_LIP			0x0062
++#define	MBOX_GET_FC_AL_POSITION_MAP	0x0063
++#define	MBOX_GET_PORT_DB		0x0064
++#define	MBOX_CLEAR_ACA			0x0065
++#define	MBOX_TARGET_RESET		0x0066
++#define	MBOX_CLEAR_TASK_SET		0x0067
++#define	MBOX_ABORT_TASK_SET		0x0068
++#define	MBOX_GET_FW_STATE		0x0069
++#define	MBOX_GET_PORT_NAME		0x006A
++#define	MBOX_GET_LINK_STATUS		0x006B
++#define	MBOX_INIT_LIP_RESET		0x006C
++#define	MBOX_SEND_SNS			0x006E
++#define	MBOX_FABRIC_LOGIN		0x006F
++#define	MBOX_SEND_CHANGE_REQUEST	0x0070
++#define	MBOX_FABRIC_LOGOUT		0x0071
++#define	MBOX_INIT_LIP_LOGIN		0x0072
++
++#define	MBOX_DRIVER_HEARTBEAT		0x005B
++#define	MBOX_FW_HEARTBEAT		0x005C
++
++#define	MBOX_GET_SET_DATA_RATE		0x005D	/* 23XX only */
++#define		MBGSD_GET_RATE	0
++#define		MBGSD_SET_RATE	1
++#define		MBGSD_ONEGB	0
++#define		MBGSD_TWOGB	1
++#define		MBGSD_AUTO	2
++
++
++#define	ISP2100_SET_PCI_PARAM		0x00ff
++
++#define	MBOX_BUSY			0x04
++
++typedef struct {
++	u_int16_t param[8];
++} mbreg_t;
++
++/*
++ * Mailbox Command Complete Status Codes
++ */
++#define	MBOX_COMMAND_COMPLETE		0x4000
++#define	MBOX_INVALID_COMMAND		0x4001
++#define	MBOX_HOST_INTERFACE_ERROR	0x4002
++#define	MBOX_TEST_FAILED		0x4003
++#define	MBOX_COMMAND_ERROR		0x4005
++#define	MBOX_COMMAND_PARAM_ERROR	0x4006
++#define	MBOX_PORT_ID_USED		0x4007
++#define	MBOX_LOOP_ID_USED		0x4008
++#define	MBOX_ALL_IDS_USED		0x4009
++#define	MBOX_NOT_LOGGED_IN		0x400A
++#define	MBLOGALL			0x000f
++#define	MBLOGNONE			0x0000
++#define	MBLOGMASK(x)			((x) & 0xf)
++
++/*
++ * Asynchronous event status codes
++ */
++#define	ASYNC_BUS_RESET			0x8001
++#define	ASYNC_SYSTEM_ERROR		0x8002
++#define	ASYNC_RQS_XFER_ERR		0x8003
++#define	ASYNC_RSP_XFER_ERR		0x8004
++#define	ASYNC_QWAKEUP			0x8005
++#define	ASYNC_TIMEOUT_RESET		0x8006
++#define	ASYNC_DEVICE_RESET		0x8007
++#define	ASYNC_EXTMSG_UNDERRUN		0x800A
++#define	ASYNC_SCAM_INT			0x800B
++#define	ASYNC_HUNG_SCSI			0x800C
++#define	ASYNC_KILLED_BUS		0x800D
++#define	ASYNC_BUS_TRANSIT		0x800E	/* LVD -> HVD, eg. */
++#define	ASYNC_LIP_OCCURRED		0x8010
++#define	ASYNC_LOOP_UP			0x8011
++#define	ASYNC_LOOP_DOWN			0x8012
++#define	ASYNC_LOOP_RESET		0x8013
++#define	ASYNC_PDB_CHANGED		0x8014
++#define	ASYNC_CHANGE_NOTIFY		0x8015
++#define	ASYNC_LIP_F8			0x8016
++#define	ASYNC_CMD_CMPLT			0x8020
++#define	ASYNC_CTIO_DONE			0x8021
++#define	ASYNC_IP_XMIT_DONE		0x8022
++#define	ASYNC_IP_RECV_DONE		0x8023
++#define	ASYNC_IP_BROADCAST		0x8024
++#define	ASYNC_IP_RCVQ_LOW		0x8025
++#define	ASYNC_IP_RCVQ_EMPTY		0x8026
++#define	ASYNC_IP_RECV_DONE_ALIGNED	0x8027
++#define	ASYNC_PTPMODE			0x8030
++#define	ASYNC_RIO1			0x8031
++#define	ASYNC_RIO2			0x8032
++#define	ASYNC_RIO3			0x8033
++#define	ASYNC_RIO4			0x8034
++#define	ASYNC_RIO5			0x8035
++#define	ASYNC_CONNMODE			0x8036
++#define		ISP_CONN_LOOP		1
++#define		ISP_CONN_PTP		2
++#define		ISP_CONN_BADLIP		3
++#define		ISP_CONN_FATAL		4
++#define		ISP_CONN_LOOPBACK	5
++#define	ASYNC_RIO_RESP			0x8040
++#define	ASYNC_RIO_COMP			0x8042
++/*
++ * 2.01.31 2200 Only. Need Bit 13 in Mailbox 1 for Set Firmware Options
++ * mailbox command to enable this.
++ */
++#define	ASYNC_QFULL_SENT		0x8049
++
++/*
++ * Mailbox Usages
++ */
++
++#define	WRITE_REQUEST_QUEUE_IN_POINTER(isp, value)	\
++	ISP_WRITE(isp, isp->isp_rqstinrp, value)
++
++#define	READ_REQUEST_QUEUE_OUT_POINTER(isp)		\
++	ISP_READ(isp, isp->isp_rqstoutrp)
++
++#define	READ_RESPONSE_QUEUE_IN_POINTER(isp)		\
++	ISP_READ(isp, isp->isp_respinrp)
++
++#define	WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, value)	\
++	ISP_WRITE(isp, isp->isp_respoutrp, value)
++
++/*
++ * Command Structure Definitions
++ */
++
++typedef struct {
++	u_int32_t	ds_base;
++	u_int32_t	ds_count;
++} ispds_t;
++
++typedef struct {
++	u_int32_t	ds_base;
++	u_int32_t	ds_basehi;
++	u_int32_t	ds_count;
++} ispds64_t;
++
++#define	DSTYPE_32BIT	0
++#define	DSTYPE_64BIT	1
++typedef struct {
++	u_int16_t	ds_type;	/* 0-> ispds_t, 1-> ispds64_t */
++	u_int32_t	ds_segment;	/* unused */
++	u_int32_t	ds_base;	/* 32 bit address of DSD list */
++} ispdslist_t;
++
++
++/*
++ * These elements get swizzled around for SBus instances.
++ */
++#define	ISP_SWAP8(a, b)	{		\
++	u_int8_t tmp;			\
++	tmp = a;			\
++	a = b;				\
++	b = tmp;			\
++}
++typedef struct {
++	u_int8_t	rqs_entry_type;
++	u_int8_t	rqs_entry_count;
++	u_int8_t	rqs_seqno;
++	u_int8_t	rqs_flags;
++} isphdr_t;
++
++/* RQS Flag definitions */
++#define	RQSFLAG_CONTINUATION	0x01
++#define	RQSFLAG_FULL		0x02
++#define	RQSFLAG_BADHEADER	0x04
++#define	RQSFLAG_BADPACKET	0x08
++
++/* RQS entry_type definitions */
++#define	RQSTYPE_REQUEST		0x01
++#define	RQSTYPE_DATASEG		0x02
++#define	RQSTYPE_RESPONSE	0x03
++#define	RQSTYPE_MARKER		0x04
++#define	RQSTYPE_CMDONLY		0x05
++#define	RQSTYPE_ATIO		0x06	/* Target Mode */
++#define	RQSTYPE_CTIO		0x07	/* Target Mode */
++#define	RQSTYPE_SCAM		0x08
++#define	RQSTYPE_A64		0x09
++#define	RQSTYPE_A64_CONT	0x0a
++#define	RQSTYPE_ENABLE_LUN	0x0b	/* Target Mode */
++#define	RQSTYPE_MODIFY_LUN	0x0c	/* Target Mode */
++#define	RQSTYPE_NOTIFY		0x0d	/* Target Mode */
++#define	RQSTYPE_NOTIFY_ACK	0x0e	/* Target Mode */
++#define	RQSTYPE_CTIO1		0x0f	/* Target Mode */
++#define	RQSTYPE_STATUS_CONT	0x10
++#define	RQSTYPE_T2RQS		0x11
++#define	RQSTYPE_IP_XMIT		0x13
++#define	RQSTYPE_T4RQS		0x15
++#define	RQSTYPE_ATIO2		0x16	/* Target Mode */
++#define	RQSTYPE_CTIO2		0x17	/* Target Mode */
++#define	RQSTYPE_CSET0		0x18
++#define	RQSTYPE_T3RQS		0x19
++#define	RQSTYPE_IP_XMIT_64	0x1b
++#define	RQSTYPE_CTIO4		0x1e	/* Target Mode */
++#define	RQSTYPE_CTIO3		0x1f	/* Target Mode */
++#define	RQSTYPE_RIO1		0x21
++#define	RQSTYPE_RIO2		0x22
++#define	RQSTYPE_IP_RECV		0x23
++#define	RQSTYPE_IP_RECV_CONT	0x24
++
++
++#define	ISP_RQDSEG	4
++typedef struct {
++	isphdr_t	req_header;
++	u_int32_t	req_handle;
++	u_int8_t	req_lun_trn;
++	u_int8_t	req_target;
++	u_int16_t	req_cdblen;
++#define	req_modifier	req_cdblen	/* marker packet */
++	u_int16_t	req_flags;
++	u_int16_t	req_reserved;
++	u_int16_t	req_time;
++	u_int16_t	req_seg_count;
++	u_int8_t	req_cdb[12];
++	ispds_t		req_dataseg[ISP_RQDSEG];
++} ispreq_t;
++
++#define	ispreq64_t	ispreqt3_t	/* same as.... */
++#define	ISP_RQDSEG_A64	2
++
++/*
++ * A request packet can also be a marker packet.
++ */
++#define SYNC_DEVICE	0
++#define SYNC_TARGET	1
++#define SYNC_ALL	2
++
++#define	ISP_RQDSEG_T2		3
++typedef struct {
++	isphdr_t	req_header;
++	u_int32_t	req_handle;
++	u_int8_t	req_lun_trn;
++	u_int8_t	req_target;
++	u_int16_t	req_scclun;
++	u_int16_t	req_flags;
++	u_int16_t	_res2;
++	u_int16_t	req_time;
++	u_int16_t	req_seg_count;
++	u_int8_t	req_cdb[16];
++	u_int32_t	req_totalcnt;
++	ispds_t		req_dataseg[ISP_RQDSEG_T2];
++} ispreqt2_t;
++
++#define	ISP_RQDSEG_T3		2
++typedef struct {
++	isphdr_t	req_header;
++	u_int32_t	req_handle;
++	u_int8_t	req_lun_trn;
++	u_int8_t	req_target;
++	u_int16_t	req_scclun;
++	u_int16_t	req_flags;
++	u_int16_t	_res2;
++	u_int16_t	req_time;
++	u_int16_t	req_seg_count;
++	u_int8_t	req_cdb[16];
++	u_int32_t	req_totalcnt;
++	ispds64_t	req_dataseg[ISP_RQDSEG_T3];
++} ispreqt3_t;
++
++/* req_flag values */
++#define	REQFLAG_NODISCON	0x0001
++#define	REQFLAG_HTAG		0x0002
++#define	REQFLAG_OTAG		0x0004
++#define	REQFLAG_STAG		0x0008
++#define	REQFLAG_TARGET_RTN	0x0010
++
++#define	REQFLAG_NODATA		0x0000
++#define	REQFLAG_DATA_IN		0x0020
++#define	REQFLAG_DATA_OUT	0x0040
++#define	REQFLAG_DATA_UNKNOWN	0x0060
++
++#define	REQFLAG_DISARQ		0x0100
++#define	REQFLAG_FRC_ASYNC	0x0200
++#define	REQFLAG_FRC_SYNC	0x0400
++#define	REQFLAG_FRC_WIDE	0x0800
++#define	REQFLAG_NOPARITY	0x1000
++#define	REQFLAG_STOPQ		0x2000
++#define	REQFLAG_XTRASNS		0x4000
++#define	REQFLAG_PRIORITY	0x8000
++
++typedef struct {
++	isphdr_t	req_header;
++	u_int32_t	req_handle;
++	u_int8_t	req_lun_trn;
++	u_int8_t	req_target;
++	u_int16_t	req_cdblen;
++	u_int16_t	req_flags;
++	u_int16_t	_res1;
++	u_int16_t	req_time;
++	u_int16_t	req_seg_count;
++	u_int8_t	req_cdb[44];
++} ispextreq_t;
++
++#define	ISP_CDSEG	7
++typedef struct {
++	isphdr_t	req_header;
++	u_int32_t	_res1;
++	ispds_t		req_dataseg[ISP_CDSEG];
++} ispcontreq_t;
++
++#define	ISP_CDSEG64	5
++typedef struct {
++	isphdr_t	req_header;
++	ispds64_t	req_dataseg[ISP_CDSEG64];
++} ispcontreq64_t;
++
++typedef struct {
++	isphdr_t	req_header;
++	u_int32_t	req_handle;
++	u_int16_t	req_scsi_status;
++	u_int16_t	req_completion_status;
++	u_int16_t	req_state_flags;
++	u_int16_t	req_status_flags;
++	u_int16_t	req_time;
++#define	req_response_len	req_time	/* FC only */
++	u_int16_t	req_sense_len;
++	u_int32_t	req_resid;
++	u_int8_t	req_response[8];	/* FC only */
++	u_int8_t	req_sense_data[32];
++} ispstatusreq_t;
++
++typedef struct {
++	isphdr_t	req_header;
++	u_int8_t	req_sense_data[60];
++} ispstatus_cont_t;
++
++/* 
++ * For Qlogic 2X00, the high order byte of SCSI status has
++ * additional meaning.
++ */
++#define	RQCS_RU	0x800	/* Residual Under */
++#define	RQCS_RO	0x400	/* Residual Over */
++#define	RQCS_RESID	(RQCS_RU|RQCS_RO)
++#define	RQCS_SV	0x200	/* Sense Length Valid */
++#define	RQCS_RV	0x100	/* FCP Response Length Valid */
++
++/* 
++ * Completion Status Codes.
++ */
++#define RQCS_COMPLETE			0x0000
++#define RQCS_DMA_ERROR			0x0002
++#define RQCS_RESET_OCCURRED		0x0004
++#define RQCS_ABORTED			0x0005
++#define RQCS_TIMEOUT			0x0006
++#define RQCS_DATA_OVERRUN		0x0007
++#define RQCS_DATA_UNDERRUN		0x0015
++#define	RQCS_QUEUE_FULL			0x001C
++
++/* 1X00 Only Completion Codes */
++#define RQCS_INCOMPLETE			0x0001
++#define RQCS_TRANSPORT_ERROR		0x0003
++#define RQCS_COMMAND_OVERRUN		0x0008
++#define RQCS_STATUS_OVERRUN		0x0009
++#define RQCS_BAD_MESSAGE		0x000a
++#define RQCS_NO_MESSAGE_OUT		0x000b
++#define RQCS_EXT_ID_FAILED		0x000c
++#define RQCS_IDE_MSG_FAILED		0x000d
++#define RQCS_ABORT_MSG_FAILED		0x000e
++#define RQCS_REJECT_MSG_FAILED		0x000f
++#define RQCS_NOP_MSG_FAILED		0x0010
++#define RQCS_PARITY_ERROR_MSG_FAILED	0x0011
++#define RQCS_DEVICE_RESET_MSG_FAILED	0x0012
++#define RQCS_ID_MSG_FAILED		0x0013
++#define RQCS_UNEXP_BUS_FREE		0x0014
++#define	RQCS_XACT_ERR1			0x0018
++#define	RQCS_XACT_ERR2			0x0019
++#define	RQCS_XACT_ERR3			0x001A
++#define	RQCS_BAD_ENTRY			0x001B
++#define	RQCS_PHASE_SKIPPED		0x001D
++#define	RQCS_ARQS_FAILED		0x001E
++#define	RQCS_WIDE_FAILED		0x001F
++#define	RQCS_SYNCXFER_FAILED		0x0020
++#define	RQCS_LVD_BUSERR			0x0021
++
++/* 2X00 Only Completion Codes */
++#define	RQCS_PORT_UNAVAILABLE		0x0028
++#define	RQCS_PORT_LOGGED_OUT		0x0029
++#define	RQCS_PORT_CHANGED		0x002A
++#define	RQCS_PORT_BUSY			0x002B
++
++/*
++ * 1X00 specific State Flags 
++ */
++#define RQSF_GOT_BUS			0x0100
++#define RQSF_GOT_TARGET			0x0200
++#define RQSF_SENT_CDB			0x0400
++#define RQSF_XFRD_DATA			0x0800
++#define RQSF_GOT_STATUS			0x1000
++#define RQSF_GOT_SENSE			0x2000
++#define	RQSF_XFER_COMPLETE		0x4000
++
++/*
++ * 2X00 specific State Flags
++ * (same as 1X00 except RQSF_GOT_BUS/RQSF_GOT_TARGET are not available)
++ */
++#define	RQSF_DATA_IN			0x0020
++#define	RQSF_DATA_OUT			0x0040
++#define	RQSF_STAG			0x0008
++#define	RQSF_OTAG			0x0004
++#define	RQSF_HTAG			0x0002
++/*
++ * 1X00 Status Flags
++ */
++#define RQSTF_DISCONNECT		0x0001
++#define RQSTF_SYNCHRONOUS		0x0002
++#define RQSTF_PARITY_ERROR		0x0004
++#define RQSTF_BUS_RESET			0x0008
++#define RQSTF_DEVICE_RESET		0x0010
++#define RQSTF_ABORTED			0x0020
++#define RQSTF_TIMEOUT			0x0040
++#define RQSTF_NEGOTIATION		0x0080
++
++/*
++ * 2X00 specific state flags
++ */
++/* RQSF_SENT_CDB	*/
++/* RQSF_XFRD_DATA	*/
++/* RQSF_GOT_STATUS	*/
++/* RQSF_XFER_COMPLETE	*/
++
++/*
++ * 2X00 specific status flags
++ */
++/* RQSTF_ABORTED */
++/* RQSTF_TIMEOUT */
++#define	RQSTF_DMA_ERROR			0x0080
++#define	RQSTF_LOGOUT			0x2000
++
++/*
++ * Miscellaneous
++ */
++#ifndef	ISP_EXEC_THROTTLE
++#define	ISP_EXEC_THROTTLE	16
++#endif
++
++/*
++ * About Firmware returns an 'attribute' word in mailbox 6.
++ */
++#define	ISP_FW_ATTR_TMODE	0x01
++#define	ISP_FW_ATTR_SCCLUN	0x02
++#define	ISP_FW_ATTR_FABRIC	0x04
++#define	ISP_FW_ATTR_CLASS2	0x08
++#define	ISP_FW_ATTR_FCTAPE	0x10
++#define	ISP_FW_ATTR_IP		0x20
++
++/*
++ * Reduced Interrupt Operation Response Queue Entreis
++ */
++
++typedef struct {
++	isphdr_t	req_header;
++	u_int32_t	req_handles[15];
++} isp_rio1_t;
++
++typedef struct {
++	isphdr_t	req_header;
++	u_int16_t	req_handles[30];
++} isp_rio2_t;
++
++/*
++ * FC (ISP2100) specific data structures
++ */
++
++/*
++ * Initialization Control Block
++ *
++ * Version One (prime) format.
++ */
++typedef struct isp_icb {
++	u_int8_t	icb_version;
++	u_int8_t	_reserved0;
++	u_int16_t	icb_fwoptions;
++	u_int16_t	icb_maxfrmlen;
++	u_int16_t	icb_maxalloc;
++	u_int16_t	icb_execthrottle;
++	u_int8_t	icb_retry_count;
++	u_int8_t	icb_retry_delay;
++	u_int8_t	icb_portname[8];
++	u_int16_t	icb_hardaddr;
++	u_int8_t	icb_iqdevtype;
++	u_int8_t	icb_logintime;
++	u_int8_t	icb_nodename[8];
++	u_int16_t	icb_rqstout;
++	u_int16_t	icb_rspnsin;
++	u_int16_t	icb_rqstqlen;
++	u_int16_t	icb_rsltqlen;
++	u_int16_t	icb_rqstaddr[4];
++	u_int16_t	icb_respaddr[4];
++	u_int16_t	icb_lunenables;
++	u_int8_t	icb_ccnt;
++	u_int8_t	icb_icnt;
++	u_int16_t	icb_lunetimeout;
++	u_int16_t	_reserved1;
++	u_int16_t	icb_xfwoptions;
++	u_int8_t	icb_racctimer;
++	u_int8_t	icb_idelaytimer;
++	u_int16_t	icb_zfwoptions;
++	u_int16_t	_reserved2[13];
++} isp_icb_t;
++#define	ICB_VERSION1	1
++
++#define	ICBOPT_HARD_ADDRESS	0x0001
++#define	ICBOPT_FAIRNESS		0x0002
++#define	ICBOPT_FULL_DUPLEX	0x0004
++#define	ICBOPT_FAST_POST	0x0008
++#define	ICBOPT_TGT_ENABLE	0x0010
++#define	ICBOPT_INI_DISABLE	0x0020
++#define	ICBOPT_INI_ADISC	0x0040
++#define	ICBOPT_INI_TGTTYPE	0x0080
++#define	ICBOPT_PDBCHANGE_AE	0x0100
++#define	ICBOPT_NOLIP		0x0200
++#define	ICBOPT_SRCHDOWN		0x0400
++#define	ICBOPT_PREVLOOP		0x0800
++#define	ICBOPT_STOP_ON_QFULL	0x1000
++#define	ICBOPT_FULL_LOGIN	0x2000
++#define	ICBOPT_BOTH_WWNS	0x4000
++#define	ICBOPT_EXTENDED		0x8000
++
++#define	ICBXOPT_CLASS2_ACK0	0x0200
++#define	ICBXOPT_CLASS2		0x0100
++#define	ICBXOPT_LOOP_ONLY	(0 << 4)
++#define	ICBXOPT_PTP_ONLY	(1 << 4)
++#define	ICBXOPT_LOOP_2_PTP	(2 << 4)
++#define	ICBXOPT_PTP_2_LOOP	(3 << 4)
++
++/*
++ * The lower 4 bits of the xfwoptions field are the OPERATION MODE bits.
++ * RIO is not defined for the 23XX cards
++ */
++#define	ICBXOPT_RIO_OFF		0
++#define	ICBXOPT_RIO_16BIT	1
++#define	ICBXOPT_RIO_32BIT	2
++#define	ICBXOPT_RIO_16BIT_IOCB	3
++#define	ICBXOPT_RIO_32BIT_IOCB	4
++#define	ICBXOPT_ZIO		5	
++
++#define	ICBZOPT_ENA_RDXFR_RDY	0x01
++#define	ICBZOPT_ENA_OOF		(1 << 6) /* out of order frame handling */
++/* These 3 only apply to the 2300 */
++#define	ICBZOPT_RATE_ONEGB	(MBGSD_ONEGB << 14)
++#define	ICBZOPT_RATE_TWOGB	(MBGSD_TWOGB << 14)
++#define	ICBZOPT_RATE_AUTO	(MBGSD_AUTO << 14)
++
++
++#define	ICB_MIN_FRMLEN		256
++#define	ICB_MAX_FRMLEN		2112
++#define	ICB_DFLT_FRMLEN		1024
++#define	ICB_DFLT_ALLOC		256
++#define	ICB_DFLT_THROTTLE	16
++#define	ICB_DFLT_RDELAY		5
++#define	ICB_DFLT_RCOUNT		3
++
++
++#define	RQRSP_ADDR0015	0
++#define	RQRSP_ADDR1631	1
++#define	RQRSP_ADDR3247	2
++#define	RQRSP_ADDR4863	3
++
++
++#define	ICB_NNM0	7
++#define	ICB_NNM1	6
++#define	ICB_NNM2	5
++#define	ICB_NNM3	4
++#define	ICB_NNM4	3
++#define	ICB_NNM5	2
++#define	ICB_NNM6	1
++#define	ICB_NNM7	0
++
++#define	MAKE_NODE_NAME_FROM_WWN(array, wwn)	\
++	array[ICB_NNM0] = (u_int8_t) ((wwn >>  0) & 0xff), \
++	array[ICB_NNM1] = (u_int8_t) ((wwn >>  8) & 0xff), \
++	array[ICB_NNM2] = (u_int8_t) ((wwn >> 16) & 0xff), \
++	array[ICB_NNM3] = (u_int8_t) ((wwn >> 24) & 0xff), \
++	array[ICB_NNM4] = (u_int8_t) ((wwn >> 32) & 0xff), \
++	array[ICB_NNM5] = (u_int8_t) ((wwn >> 40) & 0xff), \
++	array[ICB_NNM6] = (u_int8_t) ((wwn >> 48) & 0xff), \
++	array[ICB_NNM7] = (u_int8_t) ((wwn >> 56) & 0xff)
++
++/*
++ * FC-AL Position Map
++ *
++ * This is an at most 128 byte map that returns either
++ * the LILP or Firmware generated list of ports.
++ *
++ * We deviate a bit from the returned qlogic format to
++ * use an extra bit to say whether this was a LILP or
++ * f/w generated map.
++ */
++typedef struct {
++	u_int8_t	fwmap	: 1,
++			count	: 7;
++	u_int8_t	map[127];
++} fcpos_map_t;
++
++/*
++ * Port Data Base Element
++ */
++
++typedef struct {
++	u_int16_t	pdb_options;
++	u_int8_t	pdb_mstate;
++	u_int8_t	pdb_sstate;
++#define	BITS2WORD(x)	((x)[0] << 16 | (x)[3] << 8 | (x)[2])
++	u_int8_t	pdb_hardaddr_bits[4];
++	u_int8_t	pdb_portid_bits[4];
++	u_int8_t	pdb_nodename[8];
++	u_int8_t	pdb_portname[8];
++	u_int16_t	pdb_execthrottle;
++	u_int16_t	pdb_exec_count;
++	u_int8_t	pdb_retry_count;
++	u_int8_t	pdb_retry_delay;
++	u_int16_t	pdb_resalloc;
++	u_int16_t	pdb_curalloc;
++	u_int16_t	pdb_qhead;
++	u_int16_t	pdb_qtail;
++	u_int16_t	pdb_tl_next;
++	u_int16_t	pdb_tl_last;
++	u_int16_t	pdb_features;	/* PLOGI, Common Service */
++	u_int16_t	pdb_pconcurrnt;	/* PLOGI, Common Service */
++	u_int16_t	pdb_roi;	/* PLOGI, Common Service */
++	u_int8_t	pdb_target;
++	u_int8_t	pdb_initiator;	/* PLOGI, Class 3 Control Flags */
++	u_int16_t	pdb_rdsiz;	/* PLOGI, Class 3 */
++	u_int16_t	pdb_ncseq;	/* PLOGI, Class 3 */
++	u_int16_t	pdb_noseq;	/* PLOGI, Class 3 */
++	u_int16_t	pdb_labrtflg;
++	u_int16_t	pdb_lstopflg;
++	u_int16_t	pdb_sqhead;
++	u_int16_t	pdb_sqtail;
++	u_int16_t	pdb_ptimer;
++	u_int16_t	pdb_nxt_seqid;
++	u_int16_t	pdb_fcount;
++	u_int16_t	pdb_prli_len;
++	u_int16_t	pdb_prli_svc0;
++	u_int16_t	pdb_prli_svc3;
++	u_int16_t	pdb_loopid;
++	u_int16_t	pdb_il_ptr;
++	u_int16_t	pdb_sl_ptr;
++} isp_pdb_t;
++
++#define	PDB_OPTIONS_XMITTING	(1<<11)
++#define	PDB_OPTIONS_LNKXMIT	(1<<10)
++#define	PDB_OPTIONS_ABORTED	(1<<9)
++#define	PDB_OPTIONS_ADISC	(1<<1)
++
++#define	PDB_STATE_DISCOVERY	0
++#define	PDB_STATE_WDISC_ACK	1
++#define	PDB_STATE_PLOGI		2
++#define	PDB_STATE_PLOGI_ACK	3
++#define	PDB_STATE_PRLI		4
++#define	PDB_STATE_PRLI_ACK	5
++#define	PDB_STATE_LOGGED_IN	6
++#define	PDB_STATE_PORT_UNAVAIL	7
++#define	PDB_STATE_PRLO		8
++#define	PDB_STATE_PRLO_ACK	9
++#define	PDB_STATE_PLOGO		10
++#define	PDB_STATE_PLOG_ACK	11
++
++#define		SVC3_TGT_ROLE		0x10
++#define 	SVC3_INI_ROLE		0x20
++#define			SVC3_ROLE_MASK	0x30
++#define			SVC3_ROLE_SHIFT	4
++
++/*
++ * CT definition
++ *
++ * This is as the QLogic f/w documentations defines it- which is just opposite,
++ * bit wise, from what the specification defines it as. Additionally, the
++ * ct_response and ct_resid (really from FC-GS-2) need to be byte swapped.
++ */
++
++typedef struct {
++	u_int8_t	ct_revision;
++	u_int8_t	ct_portid[3];
++	u_int8_t	ct_fcs_type;
++	u_int8_t	ct_fcs_subtype;
++	u_int8_t	ct_options;
++	u_int8_t	ct_res0;
++	u_int16_t	ct_response;
++	u_int16_t	ct_resid;
++	u_int8_t	ct_res1;
++	u_int8_t	ct_reason;
++	u_int8_t	ct_explanation;
++	u_int8_t	ct_vunique;
++} ct_hdr_t;
++#define	FS_ACC	0x8002
++#define	FS_RJT	0x8001
++
++#define	FC4_IP		5 /* ISO/EEC 8802-2 LLC/SNAP "Out of Order Delivery" */
++#define	FC4_SCSI	8 /* SCSI-3 via Fivre Channel Protocol (FCP) */
++#define	FC4_FC_SVC	0x20	/* Fibre Channel Services */
++
++#define	SNS_GA_NXT	0x100
++#define	SNS_GPN_ID	0x112
++#define	SNS_GNN_ID	0x113
++#define	SNS_GFF_ID	0x11F
++#define	SNS_GID_FT	0x171
++#define	SNS_RFT_ID	0x217
++typedef struct {
++	u_int16_t	snscb_rblen;	/* response buffer length (words) */
++	u_int16_t	snscb_res0;
++	u_int16_t	snscb_addr[4];	/* response buffer address */
++	u_int16_t	snscb_sblen;	/* subcommand buffer length (words) */
++	u_int16_t	snscb_res1;
++	u_int16_t	snscb_data[1];	/* variable data */
++} sns_screq_t;	/* Subcommand Request Structure */
++
++typedef struct {
++	u_int16_t	snscb_rblen;	/* response buffer length (words) */
++	u_int16_t	snscb_res0;
++	u_int16_t	snscb_addr[4];	/* response buffer address */
++	u_int16_t	snscb_sblen;	/* subcommand buffer length (words) */
++	u_int16_t	snscb_res1;
++	u_int16_t	snscb_cmd;
++	u_int16_t	snscb_res2;
++	u_int32_t	snscb_res3;
++	u_int32_t	snscb_port;
++} sns_ga_nxt_req_t;
++#define	SNS_GA_NXT_REQ_SIZE	(sizeof (sns_ga_nxt_req_t))
++
++typedef struct {
++	u_int16_t	snscb_rblen;	/* response buffer length (words) */
++	u_int16_t	snscb_res0;
++	u_int16_t	snscb_addr[4];	/* response buffer address */
++	u_int16_t	snscb_sblen;	/* subcommand buffer length (words) */
++	u_int16_t	snscb_res1;
++	u_int16_t	snscb_cmd;
++	u_int16_t	snscb_res2;
++	u_int32_t	snscb_res3;
++	u_int32_t	snscb_portid;
++} sns_gxn_id_req_t;
++#define	SNS_GXN_ID_REQ_SIZE	(sizeof (sns_gxn_id_req_t))
++
++typedef struct {
++	u_int16_t	snscb_rblen;	/* response buffer length (words) */
++	u_int16_t	snscb_res0;
++	u_int16_t	snscb_addr[4];	/* response buffer address */
++	u_int16_t	snscb_sblen;	/* subcommand buffer length (words) */
++	u_int16_t	snscb_res1;
++	u_int16_t	snscb_cmd;
++	u_int16_t	snscb_mword_div_2;
++	u_int32_t	snscb_res3;
++	u_int32_t	snscb_fc4_type;
++} sns_gid_ft_req_t;
++#define	SNS_GID_FT_REQ_SIZE	(sizeof (sns_gid_ft_req_t))
++
++typedef struct {
++	u_int16_t	snscb_rblen;	/* response buffer length (words) */
++	u_int16_t	snscb_res0;
++	u_int16_t	snscb_addr[4];	/* response buffer address */
++	u_int16_t	snscb_sblen;	/* subcommand buffer length (words) */
++	u_int16_t	snscb_res1;
++	u_int16_t	snscb_cmd;
++	u_int16_t	snscb_res2;
++	u_int32_t	snscb_res3;
++	u_int32_t	snscb_port;
++	u_int32_t	snscb_fc4_types[8];
++} sns_rft_id_req_t;
++#define	SNS_RFT_ID_REQ_SIZE	(sizeof (sns_rft_id_req_t))
++
++typedef struct {
++	ct_hdr_t	snscb_cthdr;
++	u_int8_t	snscb_port_type;
++	u_int8_t	snscb_port_id[3];
++	u_int8_t	snscb_portname[8];
++	u_int16_t	snscb_data[1];	/* variable data */
++} sns_scrsp_t;	/* Subcommand Response Structure */
++
++typedef struct {
++	ct_hdr_t	snscb_cthdr;
++	u_int8_t	snscb_port_type;
++	u_int8_t	snscb_port_id[3];
++	u_int8_t	snscb_portname[8];
++	u_int8_t	snscb_pnlen;		/* symbolic port name length */
++	u_int8_t	snscb_pname[255];	/* symbolic port name */
++	u_int8_t	snscb_nodename[8];
++	u_int8_t	snscb_nnlen;		/* symbolic node name length */
++	u_int8_t	snscb_nname[255];	/* symbolic node name */
++	u_int8_t	snscb_ipassoc[8];
++	u_int8_t	snscb_ipaddr[16];
++	u_int8_t	snscb_svc_class[4];
++	u_int8_t	snscb_fc4_types[32];
++	u_int8_t	snscb_fpname[8];
++	u_int8_t	snscb_reserved;
++	u_int8_t	snscb_hardaddr[3];
++} sns_ga_nxt_rsp_t;	/* Subcommand Response Structure */
++#define	SNS_GA_NXT_RESP_SIZE	(sizeof (sns_ga_nxt_rsp_t))
++
++typedef struct {
++	ct_hdr_t	snscb_cthdr;
++	u_int8_t	snscb_wwn[8];
++} sns_gxn_id_rsp_t;
++#define	SNS_GXN_ID_RESP_SIZE	(sizeof (sns_gxn_id_rsp_t))
++
++typedef struct {
++	ct_hdr_t	snscb_cthdr;
++	u_int32_t	snscb_fc4_features[32];
++} sns_gff_id_rsp_t;
++#define	SNS_GFF_ID_RESP_SIZE	(sizeof (sns_gff_id_rsp_t))
++
++typedef struct {
++	ct_hdr_t	snscb_cthdr;
++	struct {
++		u_int8_t	control;
++		u_int8_t	portid[3];
++	} snscb_ports[1];
++} sns_gid_ft_rsp_t;
++#define	SNS_GID_FT_RESP_SIZE(x)	((sizeof (sns_gid_ft_rsp_t)) + ((x - 1) << 2))
++
++#define	SNS_RFT_ID_RESP_SIZE	(sizeof (ct_hdr_t))
++
++#endif	/* _ISPMBOX_H */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp_pci.c	2003-07-19 17:06:34.000000000 -0700
+@@ -0,0 +1,2363 @@
++/* @(#)isp_pci.c 1.39 */
++/*
++ * Qlogic ISP Host Adapter PCI specific probe and attach routines
++ *---------------------------------------
++ * Copyright (c) 1998, 1999, 2000, 2001 by Matthew Jacob
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification, immediately at the beginning of the file.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * the GNU Public License ("GPL").
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ * 
++ * Matthew Jacob
++ * Feral Software
++ * PMB #825
++ * 5214-F Diamond Hts Blvd
++ * San Francisco, CA, 94131
++ * mjacob@feral.com
++ */
++
++#include "isp_linux.h"
++#if	defined(__powerpc__) || defined(__sparc__)
++static int isp_pci_mapmem = 0xffffffff;
++#else
++static int isp_pci_mapmem = 0;
++#endif
++#if	defined(__sparc__)
++#undef	ioremap_nocache
++#define	ioremap_nocache	ioremap
++#endif
++static int isplinux_pci_init(struct Scsi_Host *);
++static u_int16_t isp_pci_rd_reg(struct ispsoftc *, int);
++static void isp_pci_wr_reg(struct ispsoftc *, int, u_int16_t);
++#if !(defined(ISP_DISABLE_1080_SUPPORT) && defined(ISP_DISABLE_12160_SUPPORT))
++static u_int16_t isp_pci_rd_reg_1080(struct ispsoftc *, int);
++static void isp_pci_wr_reg_1080(struct ispsoftc *, int, u_int16_t);
++#endif
++static int
++isp_pci_rd_isr(struct ispsoftc *, u_int16_t *, u_int16_t *, u_int16_t *);
++#ifndef	ISP_DISABLE_2300_SUPPORT
++static int
++isp_pci_rd_isr_2300(struct ispsoftc *, u_int16_t *, u_int16_t *, u_int16_t *);
++#endif
++static int isp_pci_mbxdma(struct ispsoftc *);
++static int
++isp_pci_dmasetup(struct ispsoftc *, XS_T *, ispreq_t *, u_int16_t *, u_int16_t);
++
++#if	LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++static void isp_pci_dmateardown(struct ispsoftc *, XS_T *, u_int16_t);
++#define	IS_HIGH_ISP_ADDR(addr)	(addr >= (u_int64_t) 0x100000000)
++#else
++#define	isp_pci_dmateardown	NULL
++#define	IS_HIGH_ISP_ADDR(addr)	0
++#define	sg_dma_address(sg)	virt_to_bus(sg->address)
++#define	sg_dma_len(sg)		sg->length
++#endif
++
++#if	ISP_DAC_SUPPORTED == 1
++#define	ISP_A64			1
++#define	HIWD(x)			((x) >> 32)
++#else
++#define	ISP_A64			0
++#define	HIWD(x)			0
++#endif
++#define	LOWD(x)			x
++
++static void isp_pci_reset1(struct ispsoftc *);
++static void isp_pci_dumpregs(struct ispsoftc *, const char *);
++
++#ifndef	ISP_CODE_ORG
++#define	ISP_CODE_ORG		0x1000
++#endif
++
++#ifndef	ISP_DISABLE_1020_SUPPORT
++#include "asm_1040.h"
++#define	ISP_1040_RISC_CODE	(u_int16_t *) isp_1040_risc_code
++#else
++#define	ISP_1040_RISC_CODE	NULL
++#endif
++
++#ifndef	ISP_DISABLE_1080_SUPPORT
++#include "asm_1080.h"
++#define	ISP_1080_RISC_CODE	(u_int16_t *) isp_1080_risc_code
++#else
++#define	ISP_1080_RISC_CODE	NULL
++#endif
++
++#ifndef	ISP_DISABLE_12160_SUPPORT
++#include "asm_12160.h"
++#define	ISP_12160_RISC_CODE	(u_int16_t *) isp_12160_risc_code
++#else
++#define	ISP_12160_RISC_CODE	NULL
++#endif
++
++#ifndef	ISP_DISABLE_2100_SUPPORT
++#include "asm_2100.h"
++#define	ISP_2100_RISC_CODE	(u_int16_t *) isp_2100_risc_code
++#else
++#define	ISP_2100_RISC_CODE	NULL
++#endif
++
++#ifndef	ISP_DISABLE_2200_SUPPORT
++#include "asm_2200.h"
++#define	ISP_2200_RISC_CODE	(u_int16_t *) isp_2200_risc_code
++#else
++#define	ISP_2200_RISC_CODE	NULL
++#endif
++
++#ifndef	ISP_DISABLE_2300_SUPPORT
++#include "asm_2300.h"
++#define	ISP_2300_RISC_CODE	(u_int16_t *) isp_2300_risc_code
++#else
++#define	ISP_2300_RISC_CODE	NULL
++#endif
++
++#ifndef	ISP_DISABLE_1020_SUPPORT
++static struct ispmdvec mdvec = {
++    isp_pci_rd_isr,
++    isp_pci_rd_reg,
++    isp_pci_wr_reg,
++    isp_pci_mbxdma,
++    isp_pci_dmasetup,
++    isp_pci_dmateardown,
++    NULL,
++    isp_pci_reset1,
++    isp_pci_dumpregs,
++    ISP_1040_RISC_CODE,
++    BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_64
++};
++#endif
++
++#ifndef	ISP_DISABLE_1080_SUPPORT
++static struct ispmdvec mdvec_1080 = {
++    isp_pci_rd_isr,
++    isp_pci_rd_reg_1080,
++    isp_pci_wr_reg_1080,
++    isp_pci_mbxdma,
++    isp_pci_dmasetup,
++    isp_pci_dmateardown,
++    NULL,
++    isp_pci_reset1,
++    isp_pci_dumpregs,
++    ISP_1080_RISC_CODE,
++    BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_128
++};
++#endif
++
++#ifndef	ISP_DISABLE_12160_SUPPORT
++static struct ispmdvec mdvec_12160 = {
++    isp_pci_rd_isr,
++    isp_pci_rd_reg_1080,
++    isp_pci_wr_reg_1080,
++    isp_pci_mbxdma,
++    isp_pci_dmasetup,
++    isp_pci_dmateardown,
++    NULL,
++    isp_pci_reset1,
++    isp_pci_dumpregs,
++    ISP_12160_RISC_CODE,
++    BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_128
++};
++#endif
++
++#ifndef	ISP_DISABLE_2100_SUPPORT
++static struct ispmdvec mdvec_2100 = {
++    isp_pci_rd_isr,
++    isp_pci_rd_reg,
++    isp_pci_wr_reg,
++    isp_pci_mbxdma,
++    isp_pci_dmasetup,
++    isp_pci_dmateardown,
++    NULL,
++    isp_pci_reset1,
++    isp_pci_dumpregs,
++    ISP_2100_RISC_CODE
++};
++#endif
++
++#ifndef	ISP_DISABLE_2200_SUPPORT
++static struct ispmdvec mdvec_2200 = {
++    isp_pci_rd_isr,
++    isp_pci_rd_reg,
++    isp_pci_wr_reg,
++    isp_pci_mbxdma,
++    isp_pci_dmasetup,
++    isp_pci_dmateardown,
++    NULL,
++    isp_pci_reset1,
++    isp_pci_dumpregs,
++    ISP_2200_RISC_CODE
++};
++#endif
++
++#ifndef	ISP_DISABLE_2300_SUPPORT
++static struct ispmdvec mdvec_2300 = {
++    isp_pci_rd_isr_2300,
++    isp_pci_rd_reg,
++    isp_pci_wr_reg,
++    isp_pci_mbxdma,
++    isp_pci_dmasetup,
++    isp_pci_dmateardown,
++    NULL,
++    isp_pci_reset1,
++    isp_pci_dumpregs,
++    ISP_2300_RISC_CODE
++};
++#endif
++
++#ifndef	PCI_DEVICE_ID_QLOGIC_ISP1020
++#define	PCI_DEVICE_ID_QLOGIC_ISP1020	0x1020
++#endif
++
++#ifndef	PCI_DEVICE_ID_QLOGIC_ISP1020
++#define	PCI_DEVICE_ID_QLOGIC_ISP1020	0x1020
++#endif
++
++#ifndef	PCI_DEVICE_ID_QLOGIC_ISP1080
++#define	PCI_DEVICE_ID_QLOGIC_ISP1080	0x1080
++#endif
++
++#ifndef	PCI_DEVICE_ID_QLOGIC_ISP10160
++#define	PCI_DEVICE_ID_QLOGIC_ISP10160	0x1016
++#endif
++
++#ifndef	PCI_DEVICE_ID_QLOGIC_ISP12160
++#define	PCI_DEVICE_ID_QLOGIC_ISP12160	0x1216
++#endif
++
++#ifndef	PCI_DEVICE_ID_QLOGIC_ISP1240
++#define	PCI_DEVICE_ID_QLOGIC_ISP1240	0x1240
++#endif
++
++#ifndef	PCI_DEVICE_ID_QLOGIC_ISP1280
++#define	PCI_DEVICE_ID_QLOGIC_ISP1280	0x1280
++#endif
++
++#ifndef	PCI_DEVICE_ID_QLOGIC_ISP2100
++#define	PCI_DEVICE_ID_QLOGIC_ISP2100	0x2100
++#endif
++
++#ifndef	PCI_DEVICE_ID_QLOGIC_ISP2200
++#define	PCI_DEVICE_ID_QLOGIC_ISP2200	0x2200
++#endif
++
++#ifndef	PCI_DEVICE_ID_QLOGIC_ISP2300
++#define	PCI_DEVICE_ID_QLOGIC_ISP2300	0x2300
++#endif
++
++#ifndef	PCI_DEVICE_ID_QLOGIC_ISP2312
++#define	PCI_DEVICE_ID_QLOGIC_ISP2312	0x2312
++#endif
++
++#define	PCI_DFLT_LTNCY	0x40
++#define	PCI_DFLT_LNSZ	0x10
++#define	PCI_CMD_ISP	\
++ (PCI_COMMAND_MASTER|PCI_COMMAND_INVALIDATE|PCI_COMMAND_PARITY|PCI_COMMAND_SERR)
++
++/*
++ * Encapsulating softc... Order of elements is important. The tag
++ * pci_isp must come first because of multiple structure punning
++ * (Scsi_Host * == struct isp_pcisoftc * == struct ispsofct *).
++ */
++struct isp_pcisoftc {
++    struct ispsoftc	pci_isp;
++    struct pci_dev *	pci_dev;
++    vm_offset_t		port;	/* I/O port address */
++    vm_offset_t		paddr;	/* Physical Memory Address */
++    vm_offset_t		vaddr;	/* Mapped Memory Address */
++    vm_offset_t		poff[_NREG_BLKS];
++    union pstore	params;
++};
++
++/*
++ * Gratefully borrowed from Gerard Roudier's sym53c8xx driver
++ */
++static INLINE vm_offset_t
++map_pci_mem(u_long base, u_long size)
++{
++    u_long page_base	= ((u_long) base) & PAGE_MASK;
++    u_long page_offs	= ((u_long) base) - page_base;
++    u_long map_size =  roundup(page_offs+size, PAGE_SIZE);
++    u_long page_remapped = (u_long) ioremap_nocache(page_base, map_size);
++    (void) map_size;
++    return (vm_offset_t) (page_remapped ? (page_remapped + page_offs) : 0);
++}
++
++static INLINE
++void unmap_pci_mem(vm_offset_t vaddr, u_long size)
++{
++    if (vaddr)
++	iounmap((void *) (vaddr & PAGE_MASK));
++}
++
++static INLINE int 
++map_isp_mem(struct isp_pcisoftc *isp_pci, u_short cmd, vm_offset_t mem_base)
++{
++    if (cmd & PCI_COMMAND_MEMORY) {
++	isp_pci->paddr = __pa(mem_base);
++	isp_pci->paddr &= PCI_BASE_ADDRESS_MEM_MASK;
++	isp_pci->vaddr = map_pci_mem(isp_pci->paddr, 0xff);
++	return (isp_pci->vaddr != (vm_offset_t) 0);
++    }
++    return (0);
++}
++
++static INLINE int 
++map_isp_io(struct isp_pcisoftc *isp_pci, u_short cmd, vm_offset_t io_base)
++{
++    if ((cmd & PCI_COMMAND_IO) && (io_base & 3) == 1) {
++   	isp_pci->port = io_base & PCI_BASE_ADDRESS_IO_MASK;
++#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,0)
++	if (check_region(isp_pci->port, 0xff)) {
++	    return (0);
++	}
++#endif
++	request_region(isp_pci->port, 0xff, "isp");
++	return (1);
++    }
++    return (0);
++}
++
++#define	ISP_PCI_BUS	pcidev->bus->number
++#define	ISP_PCI_DEVICE	pcidev->devfn
++#define	ISEARCH_RESET	pcidev = NULL
++#define	ISEARCH(x)	\
++  (pcidev = pci_find_device(PCI_VENDOR_ID_QLOGIC, x, pcidev)) != NULL
++#define	ISEARCH_NEXT
++#define	ISTORE_ARGS		struct pci_dev *pcidev
++#define	ISTORE_FNDARGS		ISTORE_ARGS
++#define	ISTORE_FNCARGS		pcidev
++#define	ISTORE_ISP_INFO(x)	(x)->pci_dev = pcidev
++
++static INLINE struct isp_pcisoftc *
++isplinux_pci_addhost(Scsi_Host_Template *tmpt, ISTORE_FNDARGS)
++{
++    struct Scsi_Host *host;
++    struct ispsoftc *isp;
++    struct isp_pcisoftc *pci_isp;
++
++    host = scsi_register(tmpt, sizeof(struct isp_pcisoftc));
++    if (host == NULL) {
++	printk("isplinux_pci_addhost: scsi_register failed\n");
++	return (NULL);
++    }
++    pci_isp = (struct isp_pcisoftc *) host->hostdata;
++    if (pci_isp == NULL) {
++	printk("isplinux_pci_addhost: cannot get softc out of scsi_register\n");
++	return (NULL);
++    }
++    ISTORE_ISP_INFO(pci_isp);
++    isp = (struct ispsoftc *) pci_isp;
++    isp->isp_host = host;
++    isp->isp_osinfo.storep = &pci_isp->params;
++    if (isplinux_pci_init(host)) {
++	scsi_unregister(host);
++	return (NULL);
++    }
++    isp->isp_next = isplist;
++    isplist = isp;
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,4)
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,61)
++    scsi_set_device(host, &pci_isp->pci_dev->dev);
++#else
++    scsi_set_pci_device(host, pci_isp->pci_dev);
++#endif
++#endif
++    return (pci_isp);
++}
++
++#if	LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,18) && \
++    	LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++#include <linux/reboot.h>
++static int
++isp_notify_reboot(struct notifier_block *ispnb, unsigned long Event, void *b)
++{
++    struct ispsoftc *isp;
++    switch (Event) {
++    case SYS_RESTART:
++    case SYS_HALT:
++    case SYS_POWER_OFF:
++	break;
++    default:
++	return (NOTIFY_DONE);
++    }
++    for (isp = isplist; isp != NULL; isp = isp->isp_next) {
++	ISP_LOCKU_SOFTC(isp);
++	ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
++	if (IS_FC(isp)) {
++	    ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS);
++	    ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET);
++	    ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS);
++	    ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL);
++	    ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS);
++	}
++	ISP_UNLKU_SOFTC(isp);
++    }
++    return (NOTIFY_OK);
++}
++static struct notifier_block isp_notifier = {
++	notifier_call:	isp_notify_reboot,
++	next:		NULL,
++	priority:	0
++};
++#endif
++
++static int isp_nfound = 0;
++int
++isplinux_pci_detect(Scsi_Host_Template *tmpt)
++{
++    static const char *fmt =
++	"ISP SCSI and Fibre Channel Host Adapter Driver\n"
++	"      Linux Platform Version %d.%d\n"
++	"      Common Core Code Version %d.%d\n"
++	"      Built on %s, %s\n";
++    struct isp_pcisoftc *pci_isp;
++    ISTORE_ARGS;
++
++    printk(fmt, ISP_PLATFORM_VERSION_MAJOR, ISP_PLATFORM_VERSION_MINOR,
++	ISP_CORE_VERSION_MAJOR, ISP_CORE_VERSION_MINOR, __DATE__ , __TIME__ );
++
++#ifndef	ISP_DISABLE_1020_SUPPORT
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP1020); ISEARCH_NEXT) {
++	pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++		isp_nfound++;
++	}
++    }
++#endif
++
++#ifndef	ISP_DISABLE_1080_SUPPORT
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP1240); ISEARCH_NEXT) {
++	pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++		isp_nfound++;
++	}
++    }
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP1080); ISEARCH_NEXT) {
++	pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++		isp_nfound++;
++	}
++    }
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP1280); ISEARCH_NEXT) {
++	pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++		isp_nfound++;
++	}
++    }
++#endif
++
++#ifndef	ISP_DISABLE_12160_SUPPORT
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP10160); ISEARCH_NEXT) {
++	pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++		isp_nfound++;
++	}
++    }
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP12160); ISEARCH_NEXT) {
++	pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++		isp_nfound++;
++	}
++    }
++#endif
++
++#ifndef	ISP_DISABLE_2100_SUPPORT
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP2100); ISEARCH_NEXT) {
++	pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++		isp_nfound++;
++	}
++    }
++#endif
++
++#ifndef	ISP_DISABLE_2200_SUPPORT
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP2200); ISEARCH_NEXT) {
++	pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++		isp_nfound++;
++	}
++    }
++#endif
++
++#ifndef	ISP_DISABLE_2300_SUPPORT
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP2300); ISEARCH_NEXT) {
++	pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++		isp_nfound++;
++	}
++    }
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP2312); ISEARCH_NEXT) {
++	pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++		isp_nfound++;
++	}
++    }
++#endif
++    /*
++     * Don't do reboot notifier stuff for 2.5.X yet
++     */
++#if	LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,18) && \
++    	LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++    if (isp_nfound) {
++	register_reboot_notifier(&isp_notifier);
++    }
++#endif
++    return (isp_nfound);
++}
++
++void
++isplinux_pci_release(struct Scsi_Host *host)
++{
++    struct ispsoftc *isp = (struct ispsoftc *) host->hostdata;
++    struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) host->hostdata;
++    free_irq(host->irq, pcs);
++    if (pcs->vaddr != 0) {
++	unmap_pci_mem(pcs->vaddr, 0xff);
++	pcs->vaddr = 0;
++    } else {
++	release_region(pcs->port, 0xff);
++	pcs->port = 0;
++    }
++    kfree(isp->isp_xflist);
++#if	LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++    pci_free_consistent(pcs->pci_dev, RQUEST_QUEUE_LEN(isp) * QENTRY_LEN,
++	isp->isp_rquest, isp->isp_rquest_dma);
++    pci_free_consistent(pcs->pci_dev, RESULT_QUEUE_LEN(isp) * QENTRY_LEN,
++	isp->isp_result, isp->isp_result_dma);
++    if (IS_FC(isp)) {
++	pci_free_consistent(pcs->pci_dev, ISP2100_SCRLEN,
++	    FCPARAM(isp)->isp_scratch, FCPARAM(isp)->isp_scdma);
++    }
++#else
++    RlsPages(isp->isp_rquest, IspOrder(RQUEST_QUEUE_LEN(isp)));
++    RlsPages(isp->isp_result, IspOrder(RESULT_QUEUE_LEN(isp)));
++    if (IS_FC(isp) && FCPARAM(isp)->isp_scratch) {
++	RlsPages(FCPARAM(isp)->isp_scratch, 1);
++    }
++#endif
++#if	LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,18) && \
++    	LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++    if (--isp_nfound <= 0) {
++        unregister_reboot_notifier(&isp_notifier);
++    }
++#endif
++}
++
++static int
++isplinux_pci_init(struct Scsi_Host *host)
++{
++    static char *nomap = "cannot map either memory or I/O space";
++    unsigned long io_base, mem_base;
++    unsigned int irq, pci_cmd_isp = PCI_CMD_ISP;
++    struct isp_pcisoftc *isp_pci;
++    u_char rev, lnsz, timer;
++    u_short vid, did, cmd;
++    char loc[32];
++    struct ispsoftc *isp;
++
++    isp_pci = (struct isp_pcisoftc *) host->hostdata;
++    isp = (struct ispsoftc *) isp_pci;
++    sprintf(loc, "isp@<PCI%d,Slot%d,Func%d>", isp_pci->pci_dev->bus->number,
++	PCI_SLOT(isp_pci->pci_dev->devfn), PCI_FUNC(isp_pci->pci_dev->devfn));
++    if (PRDW(isp_pci, PCI_COMMAND, &cmd) ||
++	PRDB(isp_pci, PCI_CACHE_LINE_SIZE, &lnsz) ||
++	PRDB(isp_pci, PCI_LATENCY_TIMER, &timer) ||
++	PRDB(isp_pci, PCI_CLASS_REVISION, &rev)) {
++	printk("%s: error reading PCI configuration", loc);
++	return (1);
++    }
++    vid = isp_pci->pci_dev->vendor;
++    did = isp_pci->pci_dev->device;
++
++#if	LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++    io_base = pci_resource_start(isp_pci->pci_dev, 0);
++    if (pci_resource_flags(isp_pci->pci_dev, 0) & PCI_BASE_ADDRESS_MEM_TYPE_64)
++	irq = 2;
++    else
++	irq = 1;
++    mem_base = pci_resource_start(isp_pci->pci_dev, irq);
++    if (pci_resource_flags(isp_pci->pci_dev, irq) &
++	PCI_BASE_ADDRESS_MEM_TYPE_64) {
++#if	BITS_PER_LONG == 64
++	mem_base |= pci_resource_start(isp_pci->pci_dev, irq+1) << 32;
++#else
++	isp_pci_mapmem &= ~(1 << isp->isp_unit);
++#endif
++    }
++#else	/* LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) */
++    io_base = isp_pci->pci_dev->base_address[0];
++    mem_base = isp_pci->pci_dev->base_address[1];
++    if (mem_base & PCI_BASE_ADDRESS_MEM_TYPE_64) {
++#if	BITS_PER_LONG == 64
++	mem_base |= isp_pci->pci_dev->base_address[2] << 32;
++#else
++	isp_pci_mapmem &= ~(1 << isp->isp_unit);
++#endif
++    }
++#endif	/* LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) */
++    irq = isp_pci->pci_dev->irq;
++
++    if (vid != PCI_VENDOR_ID_QLOGIC) {
++	printk("%s: 0x%04x is not QLogic's PCI Vendor ID\n", loc, vid);
++	return (1);
++    }
++
++    isp_pci->poff[BIU_BLOCK >> _BLK_REG_SHFT] = BIU_REGS_OFF;
++    isp_pci->poff[MBOX_BLOCK >> _BLK_REG_SHFT] = PCI_MBOX_REGS_OFF;
++    isp_pci->poff[SXP_BLOCK >> _BLK_REG_SHFT] = PCI_SXP_REGS_OFF;
++    isp_pci->poff[RISC_BLOCK >> _BLK_REG_SHFT] = PCI_RISC_REGS_OFF;
++    isp_pci->poff[DMA_BLOCK >> _BLK_REG_SHFT] = DMA_REGS_OFF;
++    switch (did) {
++    case PCI_DEVICE_ID_QLOGIC_ISP1020:
++	break;
++    case PCI_DEVICE_ID_QLOGIC_ISP1080:
++    case PCI_DEVICE_ID_QLOGIC_ISP1240:
++    case PCI_DEVICE_ID_QLOGIC_ISP1280:
++    case PCI_DEVICE_ID_QLOGIC_ISP10160:
++    case PCI_DEVICE_ID_QLOGIC_ISP12160:
++	isp_pci->poff[DMA_BLOCK >> _BLK_REG_SHFT] = ISP1080_DMA_REGS_OFF;
++	break;
++    case PCI_DEVICE_ID_QLOGIC_ISP2200:
++    case PCI_DEVICE_ID_QLOGIC_ISP2100:
++	isp_pci->poff[MBOX_BLOCK >> _BLK_REG_SHFT] = PCI_MBOX_REGS2100_OFF;
++	break;
++    case PCI_DEVICE_ID_QLOGIC_ISP2300:
++	pci_cmd_isp &= ~PCI_COMMAND_INVALIDATE;	/* per errata */
++	isp_pci->poff[MBOX_BLOCK >> _BLK_REG_SHFT] = PCI_MBOX_REGS2300_OFF;
++	break;
++    case PCI_DEVICE_ID_QLOGIC_ISP2312:
++	isp->isp_port = PCI_FUNC(isp_pci->pci_dev->devfn);
++	isp_pci->poff[MBOX_BLOCK >> _BLK_REG_SHFT] = PCI_MBOX_REGS2300_OFF;
++	break;
++    default:
++	printk("%s: Device ID 0x%04x is not a known Qlogic Device", loc, did);
++	return (1);
++    }
++
++    /*
++     * Bump unit seed- we're here, whether we complete the attachment or not.
++     */
++    isp->isp_unit = isp_unit_seed++;
++    sprintf(isp->isp_name, "isp%d", isp->isp_unit);
++
++    isp->isp_osinfo.device_id =
++	((isp_pci->pci_dev->bus->number) << 16)		|
++        (PCI_SLOT(isp_pci->pci_dev->devfn) << 8)	|
++	(PCI_FUNC(isp_pci->pci_dev->devfn));
++
++    if (isp_disable & (1 << isp->isp_unit)) {
++	isp_prt(isp, ISP_LOGALL, "disabled at user request");
++	return (1);
++    }
++
++#if	LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++    if (pci_enable_device(isp_pci->pci_dev)) {
++	printk("%s: fails to be PCI_ENABLEd\n", loc);
++	return (1);
++    }
++    (void) PRDW(isp_pci, PCI_COMMAND, &cmd);
++#endif
++
++    if ((cmd & PCI_CMD_ISP) != pci_cmd_isp) {
++	if (isp_debug & ISP_LOGINFO)
++	    printk("%s: rewriting command register from 0x%x to 0x%x\n",
++		loc, cmd, (cmd & ~PCI_CMD_ISP) | pci_cmd_isp);
++	cmd &= ~PCI_CMD_ISP;
++	cmd |= pci_cmd_isp;
++	PWRW(isp_pci, PCI_COMMAND, cmd);
++    }
++
++    if (lnsz != PCI_DFLT_LNSZ) {
++	if (isp_debug & ISP_LOGINFO)
++	    printk("%s: rewriting cache line size from 0x%x to 0x%x\n",
++		loc, lnsz, PCI_DFLT_LNSZ);
++	lnsz = PCI_DFLT_LNSZ;
++	PWRB(isp_pci, PCI_CACHE_LINE_SIZE, lnsz);
++    }
++
++#ifdef	__sparc__
++    if (PRDB(isp_pci, PCI_MIN_GNT, &rev)) {
++	printk("%s: unable to read min grant\n", loc);
++	return (1);
++    }
++    if (rev) {
++	rev = (rev << 3) & 0xff;
++    }
++    if (rev == 0) {
++	rev = 64;
++    }
++    if (isp_debug & ISP_LOGINFO) {
++	printk("%s: rewriting latency timer from 0x%x to 0x%x\n",
++	    loc, timer, rev);
++    }
++    PWRB(isp_pci, PCI_LATENCY_TIMER, rev);
++#else
++    if (timer < PCI_DFLT_LTNCY) {
++	if (isp_debug & ISP_LOGINFO)
++	    printk("%s: rewriting latency timer from 0x%x to 0x%x\n",
++		loc, timer, PCI_DFLT_LTNCY);
++	timer = PCI_DFLT_LTNCY;
++	PWRB(isp_pci, PCI_LATENCY_TIMER, timer);
++    }
++#endif
++
++    if ((cmd & (PCI_COMMAND_MEMORY|PCI_COMMAND_IO)) == 0) {
++#ifdef	__powerpc__
++	if (io_base == 0 && mem_base == 0) {
++	    printk("%s: you lose- no register access defined.\n", loc);
++	    return (1);
++	}
++	if (io_base)
++		cmd |= PCI_COMMAND_IO;
++	if (mem_base)
++		cmd |= PCI_COMMAND_MEMORY;
++	PWRW(isp_pci, PCI_COMMAND, cmd);
++#else
++	printk("%s: you lose- no register access defined.\n", loc);
++	return (1);
++#endif
++    }
++
++    /*
++     * Disable the ROM.
++     */
++    PWRL(isp_pci, PCI_ROM_ADDRESS, 0);
++
++    /*
++     * Set up stuff...
++     */
++    isp_pci->port = isp_pci->vaddr = 0;
++
++    /*
++     * If we prefer to map memory space over I/O, try that first.
++     */
++    if (isp_pci_mapmem & (1 << isp->isp_unit)) {
++	if (map_isp_mem(isp_pci, cmd, mem_base) == 0) {
++	    if (map_isp_io(isp_pci, cmd, io_base) == 0) {
++		isp_prt(isp, ISP_LOGERR, nomap);
++		return (1);
++	    }
++	}
++    } else {
++	if (map_isp_io(isp_pci, cmd, io_base) == 0) {
++	    if (map_isp_mem(isp_pci, cmd, mem_base) == 0) {
++		isp_prt(isp, ISP_LOGERR, nomap);
++		return (1);
++	    }
++	}
++    }
++    if (isp_pci->vaddr) {
++	isp_prt(isp, ISP_LOGCONFIG,
++	    "mapped memory 0x%lx at 0x%lx\n", isp_pci->paddr, isp_pci->vaddr);
++	host->io_port = isp_pci->paddr;
++    } else {
++        isp_prt(isp, ISP_LOGCONFIG,
++	    "mapped I/O space at 0x%lx\n", isp_pci->port);
++	host->io_port = isp_pci->port;
++    }
++    host->irq = 0;
++    isp_pci->pci_isp.isp_revision = rev;
++#ifndef	ISP_DISABLE_1020_SUPPORT
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP1020) {
++	isp_pci->pci_isp.isp_mdvec = &mdvec;
++	isp_pci->pci_isp.isp_type = ISP_HA_SCSI_UNKNOWN;
++    } 
++#endif
++#ifndef	ISP_DISABLE_1080_SUPPORT
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP1080) {
++	isp_pci->pci_isp.isp_mdvec = &mdvec_1080;
++	isp_pci->pci_isp.isp_type = ISP_HA_SCSI_1080;
++    }
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP1240) {
++	isp_pci->pci_isp.isp_mdvec = &mdvec_1080;
++	isp_pci->pci_isp.isp_type = ISP_HA_SCSI_1240;
++	host->max_channel = 1;
++    }
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP1280) {
++	isp_pci->pci_isp.isp_mdvec = &mdvec_1080;
++	isp_pci->pci_isp.isp_type = ISP_HA_SCSI_1280;
++	host->max_channel = 1;
++    }
++#endif
++#ifndef	ISP_DISABLE_12160_SUPPORT
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP10160) {
++	isp_pci->pci_isp.isp_mdvec = &mdvec_12160;
++	isp_pci->pci_isp.isp_type = ISP_HA_SCSI_12160;
++    }
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP12160) {
++	isp_pci->pci_isp.isp_mdvec = &mdvec_12160;
++	isp_pci->pci_isp.isp_type = ISP_HA_SCSI_12160;
++	host->max_channel = 1;
++    }
++#endif
++#ifndef	ISP_DISABLE_2100_SUPPORT
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP2100) {
++	isp_pci->pci_isp.isp_mdvec = &mdvec_2100;
++	isp_pci->pci_isp.isp_type = ISP_HA_FC_2100;
++    }
++#endif
++#ifndef	ISP_DISABLE_2200_SUPPORT
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP2200) {
++	isp_pci->pci_isp.isp_mdvec = &mdvec_2200;
++	isp_pci->pci_isp.isp_type = ISP_HA_FC_2200;
++    }
++#endif
++#ifndef	ISP_DISABLE_2300_SUPPORT
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP2300) {
++	isp_pci->pci_isp.isp_mdvec = &mdvec_2300;
++	isp_pci->pci_isp.isp_type = ISP_HA_FC_2300;
++    }
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP2312) {
++	isp_pci->pci_isp.isp_mdvec = &mdvec_2300;
++	isp_pci->pci_isp.isp_type = ISP_HA_FC_2312;
++    }
++
++    if (IS_23XX(isp)) {
++	/*
++	 * Can't tell if the ROM will hang on 'ABOUT FIRMWARE' command
++	 */
++	isp->isp_touched = 1;
++    }
++#endif
++
++    if (request_irq(irq, isplinux_intr, SA_SHIRQ, isp->isp_name, isp_pci)) {
++	isp_prt(isp, ISP_LOGERR, "could not snag irq %u (0x%x)", irq, irq);
++	goto bad;
++    }
++    host->irq = irq;
++#if	LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++    host->select_queue_depths = isplinux_sqd;
++#endif
++    isp->isp_param = &isp_pci->params;
++#if	LINUX_VERSION_CODE > KERNEL_VERSION(2,4,19)
++    host->highmem_io = 0;
++    if (IS_FC(isp) || IS_ULTRA2(isp) || IS_1240(isp)) {
++	if (!ISP_A64 || pci_set_dma_mask(isp_pci->pci_dev, (u64) 0xffffffffffffffffULL)) {
++	    if (pci_set_dma_mask(isp_pci->pci_dev, (u64)0xffffffff)) {
++		isp_prt(isp, ISP_LOGERR, "cannot set 32 bit dma mask");
++		goto bad;
++	    } else {
++	    	isp_prt(isp, ISP_LOGCONFIG, "enabling 32 bit DMA");
++        	host->highmem_io = 1;
++	    }
++	} else {
++	    isp_prt(isp, ISP_LOGCONFIG, "enabling 64 bit DMA");
++	}
++        host->highmem_io = 1;
++    }
++#endif
++
++    /*
++     * At this point, we're committed to keeping this adapter around.
++     */
++    isplinux_common_init(isp);
++    return (0);
++bad:
++    if (host->irq) {
++	DISABLE_INTS(isp);
++	free_irq(host->irq, isp_pci);
++	host->irq = 0;
++    }
++    if (isp_pci->vaddr != 0) {
++	unmap_pci_mem(isp_pci->vaddr, 0xff);
++	isp_pci->vaddr = 0;
++    } else {
++	release_region(isp_pci->port, 0xff);
++	isp_pci->port = 0;
++    }
++    return (1);
++}
++
++static INLINE u_int16_t
++ispregrd(struct isp_pcisoftc *pcs, vm_offset_t offset)
++{
++    u_int16_t rv;
++    if (pcs->vaddr) {
++	offset += pcs->vaddr;
++	rv = readw(offset);
++    } else {
++	offset += pcs->port;
++	rv = inw(offset);
++    }
++    return (rv);
++}
++
++static INLINE void
++ispregwr(struct isp_pcisoftc *pcs, vm_offset_t offset, u_int16_t val)
++{
++    if (pcs->vaddr) {
++	offset += pcs->vaddr;
++	writew(val, offset);
++    } else {
++	offset += pcs->port;
++	outw(val, offset);
++    }
++    MEMORYBARRIER(isp, SYNC_REG, offset, 2);
++}
++
++static INLINE int
++isp_pci_rd_debounced(struct isp_pcisoftc *pcs, vm_offset_t off, u_int16_t *rp)
++{
++    u_int16_t val0, val1;
++    int i = 0;
++    do {
++	val0 = ispregrd(pcs, off);
++	val1 = ispregrd(pcs, off);
++    } while (val0 != val1 && ++i < 1000);
++    if (val0 != val1) {
++	return (1);
++    }
++    *rp = val0;
++    return (0);
++}
++
++#define	IspVirt2Off(a, x)	\
++	((a)->poff[((x) & _BLK_REG_MASK) >> _BLK_REG_SHFT] + ((x) & 0xff))
++
++static int
++isp_pci_rd_isr(struct ispsoftc *isp, u_int16_t *isrp,
++    u_int16_t *semap, u_int16_t *mbp)
++{
++    struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++    u_int16_t isr, sema;
++
++    if (IS_2100(isp)) {
++	if (isp_pci_rd_debounced(pcs, IspVirt2Off(pcs, BIU_ISR), &isr)) {
++	    return (0);
++        }
++	if (isp_pci_rd_debounced(pcs, IspVirt2Off(pcs, BIU_SEMA), &sema)) {
++	    return (0);
++        }
++    } else {
++	isr = ispregrd(pcs, IspVirt2Off(pcs, BIU_ISR));
++	sema = ispregrd(pcs, IspVirt2Off(pcs, BIU_SEMA));
++    }
++    isp_prt(isp, ISP_LOGDEBUG3, "ISR 0x%x SEMA 0x%x", isr, sema);
++    isr &= INT_PENDING_MASK(isp);
++    sema &= BIU_SEMA_LOCK;
++    if (isr == 0 && sema == 0) {
++	return (0);
++    }
++    *isrp = isr;
++    if ((*semap = sema) != 0) {
++	if (IS_2100(isp)) {
++	    if (isp_pci_rd_debounced(pcs, IspVirt2Off(pcs, OUTMAILBOX0), mbp)) {
++		return (0);
++	    }
++	} else {
++	    *mbp = ispregrd(pcs, IspVirt2Off(pcs, OUTMAILBOX0));
++	}
++    }
++    return (1);
++}
++
++#ifndef	ISP_DISABLE_2300_SUPPORT
++static INLINE u_int32_t
++ispregrd32(struct isp_pcisoftc *pcs, vm_offset_t offset)
++{
++    u_int32_t rv;
++    if (pcs->vaddr) {
++	offset += pcs->vaddr;
++	rv = readl(offset);
++    } else {
++	offset += pcs->port;
++	rv = inl(offset);
++    }
++    return (rv);
++}
++
++static int
++isp_pci_rd_isr_2300(struct ispsoftc *isp, u_int16_t *isrp,
++    u_int16_t *semap, u_int16_t *mbox0p)
++{
++    struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++    u_int32_t r2hisr;
++
++   /*
++    * Avoid parity errors on the 2312.
++    */
++    if (!(ispregrd(pcs, IspVirt2Off(pcs, BIU_ISR)) & BIU2100_ISR_RISC_INT)) {
++	*isrp = 0;
++	return (0);
++    }
++
++    r2hisr = ispregrd32(pcs, IspVirt2Off(pcs, BIU_R2HSTSLO));
++    isp_prt(isp, ISP_LOGDEBUG3, "RISC2HOST ISR 0x%x", r2hisr);
++    if ((r2hisr & BIU_R2HST_INTR) == 0) {
++	*isrp = 0;
++	return (0);
++    }
++    switch (r2hisr & BIU_R2HST_ISTAT_MASK) {
++    case ISPR2HST_ROM_MBX_OK:
++    case ISPR2HST_ROM_MBX_FAIL:
++    case ISPR2HST_MBX_OK:
++    case ISPR2HST_MBX_FAIL:
++    case ISPR2HST_ASYNC_EVENT:
++	*isrp = r2hisr & 0xffff;
++	*mbox0p = (r2hisr >> 16);
++	*semap = 1;
++	return (1);
++    case ISPR2HST_RIO_16:
++	*isrp = r2hisr & 0xffff;
++	*mbox0p = ASYNC_RIO1;
++	*semap = 1;
++	return (1);
++    case ISPR2HST_FPOST:
++	*isrp = r2hisr & 0xffff;
++	*mbox0p = ASYNC_CMD_CMPLT;
++	*semap = 1;
++	return (1);
++    case ISPR2HST_FPOST_CTIO:
++	*isrp = r2hisr & 0xffff;
++	*mbox0p = ASYNC_CTIO_DONE;
++	*semap = 1;
++	return (1);
++    case ISPR2HST_RSPQ_UPDATE:
++	*isrp = r2hisr & 0xffff;
++	*mbox0p = 0;
++	*semap = 0;
++	return (1);
++   default:
++	return (0);
++   }
++}
++#endif
++
++static u_int16_t
++isp_pci_rd_reg(struct ispsoftc *isp, int regoff)
++{
++    u_int16_t rv, oldconf = 0;
++    struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++
++    if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) {
++	/*
++	 * We will assume that someone has paused the RISC processor.
++	 */
++	oldconf = ispregrd(pcs, IspVirt2Off(pcs, BIU_CONF1));
++	ispregwr(pcs, IspVirt2Off(pcs, BIU_CONF1), oldconf | BIU_PCI_CONF1_SXP);
++    }
++    rv = ispregrd(pcs, IspVirt2Off(pcs, regoff));
++    if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) {
++	ispregwr(pcs, IspVirt2Off(pcs, BIU_CONF1), oldconf);
++    }
++    return (rv);
++}
++
++static void
++isp_pci_wr_reg(struct ispsoftc *isp, int regoff, u_int16_t val)
++{
++    struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++    u_int16_t oldconf = 0;
++    if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) {
++	/*
++	 * We will assume that someone has paused the RISC processor.
++	 */
++	oldconf = ispregrd(pcs, IspVirt2Off(pcs, BIU_CONF1));
++	ispregwr(pcs, IspVirt2Off(pcs, BIU_CONF1), oldconf | BIU_PCI_CONF1_SXP);
++    }
++    ispregwr(pcs, IspVirt2Off(pcs, regoff), val);
++    if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) {
++	ispregwr(pcs, IspVirt2Off(pcs, BIU_CONF1), oldconf);
++    }
++}
++
++#if !(defined(ISP_DISABLE_1080_SUPPORT) && defined(ISP_DISABLE_12160_SUPPORT))
++static u_int16_t
++isp_pci_rd_reg_1080(struct ispsoftc *isp, int regoff)
++{
++    struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++    u_int16_t rv, oldconf = 0;
++
++    if ((regoff & _BLK_REG_MASK) == SXP_BLOCK ||
++	(regoff & _BLK_REG_MASK) == (SXP_BLOCK|SXP_BANK1_SELECT)) {
++	u_int16_t tmpconf;
++	/*
++	 * We will assume that someone has paused the RISC processor.
++	 */
++	oldconf = ispregrd(pcs,  IspVirt2Off(pcs, BIU_CONF1));
++	tmpconf = oldconf & ~BIU_PCI1080_CONF1_DMA;
++	if (IS_1280(isp)) {
++	    if (regoff & SXP_BANK1_SELECT) {
++		tmpconf |= BIU_PCI1080_CONF1_SXP0;
++	    } else {
++		tmpconf |= BIU_PCI1080_CONF1_SXP1;
++	    }
++	} else {
++	    tmpconf |= BIU_PCI1080_CONF1_SXP0;
++	}
++	ispregwr(pcs,  IspVirt2Off(pcs, BIU_CONF1), tmpconf);
++    } else if ((regoff & _BLK_REG_MASK) == DMA_BLOCK) {
++	oldconf = ispregrd(pcs,  IspVirt2Off(pcs, BIU_CONF1));
++	ispregwr(pcs, IspVirt2Off(pcs, BIU_CONF1),
++	    oldconf | BIU_PCI1080_CONF1_DMA);
++    }
++    rv = ispregrd(pcs, IspVirt2Off(pcs, regoff));
++    if (oldconf) {
++	ispregwr(pcs, IspVirt2Off(pcs, BIU_CONF1), oldconf);
++    }
++    return (rv);
++}
++
++static void
++isp_pci_wr_reg_1080(struct ispsoftc *isp, int regoff, u_int16_t val)
++{
++    struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++    u_int16_t oldconf = 0;
++
++    if ((regoff & _BLK_REG_MASK) == SXP_BLOCK ||
++	(regoff & _BLK_REG_MASK) == (SXP_BLOCK|SXP_BANK1_SELECT)) {
++	u_int16_t tmpconf;
++	/*
++	 * We will assume that someone has paused the RISC processor.
++	 */
++	oldconf = ispregrd(pcs,  IspVirt2Off(pcs, BIU_CONF1));
++	tmpconf = oldconf & ~BIU_PCI1080_CONF1_DMA;
++	if (IS_1280(isp)) {
++	    if (regoff & SXP_BANK1_SELECT) {
++		tmpconf |= BIU_PCI1080_CONF1_SXP0;
++	    } else {
++		tmpconf |= BIU_PCI1080_CONF1_SXP1;
++	    }
++	} else {
++	    tmpconf |= BIU_PCI1080_CONF1_SXP0;
++	}
++	ispregwr(pcs,  IspVirt2Off(pcs, BIU_CONF1), tmpconf);
++    } else if ((regoff & _BLK_REG_MASK) == DMA_BLOCK) {
++	oldconf = ispregrd(pcs,  IspVirt2Off(pcs, BIU_CONF1));
++	ispregwr(pcs, IspVirt2Off(pcs, BIU_CONF1),
++	    oldconf | BIU_PCI1080_CONF1_DMA);
++    }
++    ispregwr(pcs, IspVirt2Off(pcs, regoff), val);
++    if (oldconf) {
++	ispregwr(pcs, IspVirt2Off(pcs, BIU_CONF1), oldconf);
++    }
++}
++#endif
++
++static int
++isp_pci_mbxdma(struct ispsoftc *isp)
++{
++    if (isp->isp_xflist == NULL) {
++	size_t amt = isp->isp_maxcmds * sizeof (XS_T **);
++	isp->isp_xflist = kmalloc(amt, GFP_KERNEL);
++	if (isp->isp_xflist == NULL) {
++	    isp_prt(isp, ISP_LOGERR, "unable to allocate xflist array");
++	    return (1);
++	}
++	MEMZERO(isp->isp_xflist, amt);
++    }
++    if (isp->isp_rquest == NULL) {
++#if	LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++	struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++	dma_addr_t busaddr;
++	isp->isp_rquest =
++	    pci_alloc_consistent(pcs->pci_dev,
++		RQUEST_QUEUE_LEN(isp) * QENTRY_LEN, &busaddr);
++	if (isp->isp_rquest == NULL) {
++	    isp_prt(isp, ISP_LOGERR, "unable to allocate request queue");
++	    return (1);
++	}
++	isp->isp_rquest_dma = busaddr;
++#else
++	isp->isp_rquest = (caddr_t) GetPages(IspOrder(RQUEST_QUEUE_LEN(isp)));
++	if (isp->isp_rquest == NULL) {
++	    isp_prt(isp, ISP_LOGERR, "unable to allocate request queue");
++	    return (1);
++	}
++	/*
++	 * Map the Request queue.
++	 */
++	isp->isp_rquest_dma = virt_to_bus(isp->isp_rquest);
++#endif
++	if (isp->isp_rquest_dma & 0x3f) {
++	    isp_prt(isp, ISP_LOGERR, "Request Queue not on 64 byte boundary");
++	    return (1);
++        }
++	MEMZERO(isp->isp_rquest, ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)));
++    }
++
++    if (isp->isp_result == NULL) {
++#if	LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++	struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++	dma_addr_t busaddr;
++	isp->isp_result =
++	    pci_alloc_consistent(pcs->pci_dev,
++		RESULT_QUEUE_LEN(isp) * QENTRY_LEN, &busaddr);
++	if (isp->isp_result == NULL) {
++	    isp_prt(isp, ISP_LOGERR, "unable to allocate result queue");
++	    return (1);
++	}
++	isp->isp_result_dma = busaddr;
++#else
++	isp->isp_result = (caddr_t) GetPages(IspOrder(RESULT_QUEUE_LEN(isp)));
++	if (isp->isp_result == NULL) {
++	    isp_prt(isp, ISP_LOGERR, "unable to allocate result queue");
++	    free_pages((unsigned long)isp->isp_rquest,
++		IspOrder(RQUEST_QUEUE_LEN(isp)));
++	    return (1);
++	}
++	/*
++	 * Map the result queue.
++	 */
++	isp->isp_result_dma = virt_to_bus(isp->isp_result);
++#endif
++	if (isp->isp_rquest_dma & 0x3f) {
++	    isp_prt(isp, ISP_LOGERR, "Result Queue not on 64 byte boundary");
++	    return (1);
++        }
++	MEMZERO(isp->isp_result, ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)));
++    }
++
++    if (IS_FC(isp)) {
++	fcparam *fcp = isp->isp_param;
++	if (fcp->isp_scratch == NULL) {
++#if	LINUX_VERSION_CODE > KERNEL_VERSION(2,3,92)
++	    struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++	    dma_addr_t busaddr;
++	    fcp->isp_scratch =
++		pci_alloc_consistent(pcs->pci_dev, ISP2100_SCRLEN, &busaddr);
++	    if (fcp->isp_scratch == NULL) {
++		isp_prt(isp, ISP_LOGERR, "unable to allocate scratch space");
++		return (1);
++	    }
++	    fcp->isp_scdma = busaddr;
++#else
++	   /*
++	    * Just get a page....
++	    */
++	    fcp->isp_scratch = (void *) GetPages(1);
++	    if (fcp->isp_scratch == NULL) {
++		isp_prt(isp, ISP_LOGERR, "unable to allocate scratch space");
++		return (1);
++	    }
++	    fcp->isp_scdma = virt_to_bus((void *)fcp->isp_scratch);
++#endif
++	    MEMZERO(fcp->isp_scratch, ISP2100_SCRLEN);
++	    if (fcp->isp_scdma & 0x7) {
++		isp_prt(isp, ISP_LOGERR, "scratch space not 8 byte aligned");
++		return (1);
++	    }
++	}
++    }
++    return (0);
++}
++
++#ifdef	LINUX_ISP_TARGET_MODE
++/*
++ * We need to handle DMA for target mode differently from initiator mode.
++ * 
++ * DMA mapping and construction and submission of CTIO Request Entries
++ * and rendevous for completion are very tightly coupled because we start
++ * out by knowing (per platform) how much data we have to move, but we
++ * don't know, up front, how many DMA mapping segments will have to be used
++ * cover that data, so we don't know how many CTIO Request Entries we
++ * will end up using. Further, for performance reasons we may want to
++ * (on the last CTIO for Fibre Channel), send status too (if all went well).
++ *
++ * The standard vector still goes through isp_pci_dmasetup, but the callback
++ * for the DMA mapping routines comes here instead with the whole transfer
++ * mapped and a pointer to a partially filled in already allocated request
++ * queue entry. We finish the job.
++ */
++
++static int tdma_mk(struct ispsoftc *, tmd_cmd_t *, ct_entry_t *,
++    u_int16_t *, u_int16_t);
++#define	STATUS_WITH_DATA        1
++    
++static int
++tdma_mk(struct ispsoftc *isp, tmd_cmd_t *tcmd, ct_entry_t *cto,
++    u_int16_t *nxtip, u_int16_t optr)
++{
++    static const char ctx[] =
++	"CTIO[%x] lun %d for iid%d flgs 0x%x sts 0x%x ssts 0x%x res %u %s";
++    struct scatterlist *sg;
++    ct_entry_t *qe;
++    u_int8_t scsi_status;
++    u_int16_t curi, nxti, handle;
++    u_int32_t sflags;
++    int32_t resid;
++    int nth_ctio, nctios, send_status, nseg;
++
++
++    curi = isp->isp_reqidx;
++    qe = (ct_entry_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, isp->isp_reqidx);
++
++    cto->ct_xfrlen = 0;
++    cto->ct_seg_count = 0;
++    cto->ct_header.rqs_entry_count = 1;
++    MEMZERO(cto->ct_dataseg, sizeof (cto->ct_dataseg));
++
++    if (tcmd->cd_xfrlen == 0) {
++	ISP_TDQE(isp, "tdma_mk[no data]", curi, cto);
++	isp_prt(isp, ISP_LOGTDEBUG1, ctx, cto->ct_fwhandle, (int) tcmd->cd_lun,
++	    (int) cto->ct_iid, cto->ct_flags, cto->ct_status,
++	    cto->ct_scsi_status, cto->ct_resid, "<END>");
++	isp_put_ctio(isp, cto, qe);
++	return (CMD_QUEUED);
++    }
++
++    sg = tcmd->cd_data;
++    nseg = 0;
++    resid = (int32_t) tcmd->cd_xfrlen;
++    while (resid > 0) {
++	nseg++;
++	resid -= sg_dma_len(sg);
++	sg++;
++    }
++    sg = tcmd->cd_data;
++#if	 LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++    {
++	struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++	int new_seg_cnt;
++	new_seg_cnt = pci_map_sg(pcs->pci_dev, sg, nseg,
++	  (cto->ct_flags & CT_DATA_IN)? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE);
++	if (new_seg_cnt == 0) {
++	    isp_prt(isp, ISP_LOGWARN, "unable to dma map request");
++	    cto->ct_resid = -ENOMEM;
++	    return (CMD_COMPLETE);
++	}
++	if (new_seg_cnt != nseg) {
++	    isp_prt(isp, ISP_LOGERR, "new seg cnt != old");
++	    cto->ct_resid = -EINVAL;
++	    return (CMD_COMPLETE);
++	}
++    }
++#endif
++    nctios = nseg / ISP_RQDSEG;
++    if (nseg % ISP_RQDSEG) {
++	nctios++;
++    }
++
++    /*
++     * Save handle, and potentially any SCSI status, which
++     * we'll reinsert on the last CTIO we're going to send.
++     */
++    handle = cto->ct_syshandle;
++    cto->ct_syshandle = 0;
++    cto->ct_header.rqs_seqno = 0;
++    send_status = (cto->ct_flags & CT_SENDSTATUS) != 0;
++
++    if (send_status) {
++	sflags = cto->ct_flags & (CT_SENDSTATUS | CT_CCINCR);
++	cto->ct_flags &= ~(CT_SENDSTATUS|CT_CCINCR);
++	/*
++	 * Preserve residual.
++	 */
++	resid = cto->ct_resid;
++
++	/*
++	 * Save actual SCSI status.
++	 */
++	scsi_status = cto->ct_scsi_status;
++
++#ifndef	STATUS_WITH_DATA
++	sflags |= CT_NO_DATA;
++	/*
++	 * We can't do a status at the same time as a data CTIO, so
++	 * we need to synthesize an extra CTIO at this level.
++	 */
++	nctios++;
++#endif
++    } else {
++	sflags = scsi_status = resid = 0;
++    }
++
++    cto->ct_resid = 0;
++    cto->ct_scsi_status = 0;
++
++    nxti = *nxtip;
++
++    for (nth_ctio = 0; nth_ctio < nctios; nth_ctio++) {
++	int seglim;
++
++	seglim = nseg;
++	if (seglim) {
++	    int seg;
++
++	    if (seglim > ISP_RQDSEG)
++		seglim = ISP_RQDSEG;
++
++	    for (seg = 0; seg < seglim; seg++, nseg--) {
++		/*
++		 * Unlike normal initiator commands, we don't do
++		 * any swizzling here.
++		 */
++		cto->ct_dataseg[seg].ds_base = (u_int32_t) sg_dma_address(sg);
++		cto->ct_dataseg[seg].ds_count = (u_int32_t) sg_dma_len(sg);
++		cto->ct_xfrlen += sg_dma_len(sg);
++		sg++;
++	    }
++	    cto->ct_seg_count = seg;
++	} else {
++	    /*
++	     * This case should only happen when we're
++	     * sending an extra CTIO with final status.
++	     */
++	    if (send_status == 0) {
++		isp_prt(isp, ISP_LOGERR,
++		    "tdma_mk ran out of segments, no status to send");
++		return (CMD_EAGAIN);
++	    }
++	}
++
++	/*
++	 * At this point, the fields ct_lun, ct_iid, ct_tagval, ct_tagtype, and
++	 * ct_timeout have been carried over unchanged from what our caller had
++	 * set.
++	 *
++	 * The dataseg fields and the seg_count fields we just got through
++	 * setting. The data direction we've preserved all along and only
++	 * clear it if we're now sending status.
++	 */
++
++	if (nth_ctio == nctios - 1) {
++	    /*
++	     * We're the last in a sequence of CTIOs, so mark this
++	     * CTIO and save the handle to the command such that when
++	     * this CTIO completes we can free dma resources and
++	     * do whatever else we need to do to finish the rest
++	     * of the command.
++	     */
++	    cto->ct_syshandle = handle;
++	    cto->ct_header.rqs_seqno = 1;
++
++	    if (send_status) {
++		cto->ct_scsi_status = scsi_status;
++		cto->ct_flags |= sflags;
++		cto->ct_resid = resid;
++	    }
++	    if (send_status) {
++		isp_prt(isp, ISP_LOGTDEBUG1, ctx, 
++		    cto->ct_fwhandle, (int) tcmd->cd_lun, (int) cto->ct_iid,
++		    cto->ct_flags, cto->ct_status, cto->ct_scsi_status,
++		    cto->ct_resid, "<END>");
++	    } else {
++		isp_prt(isp, ISP_LOGTDEBUG1, ctx, 
++		    cto->ct_fwhandle, (int) tcmd->cd_lun, (int) cto->ct_iid,
++		    cto->ct_flags, cto->ct_status, cto->ct_scsi_status,
++		    cto->ct_resid, "<MID>");
++	    }
++	    isp_put_ctio(isp, cto, qe);
++	    ISP_TDQE(isp, "last tdma_mk", curi, cto);
++	    if (nctios > 1) {
++		MEMORYBARRIER(isp, SYNC_REQUEST, curi, QENTRY_LEN);
++	    }
++	} else {
++	    ct_entry_t *oqe = qe;
++
++	    /*
++	     * Make sure handle fields are clean
++	     */
++	    cto->ct_syshandle = 0;
++	    cto->ct_header.rqs_seqno = 0;
++
++	    isp_prt(isp, ISP_LOGTDEBUG1,
++		"CTIO[%x] lun%d for ID%d ct_flags 0x%x",
++		cto->ct_fwhandle, (int) tcmd->cd_lun,
++		(int) cto->ct_iid, cto->ct_flags);
++
++	    /*
++	     * Get a new CTIO
++	     */
++	    qe = (ct_entry_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, nxti);
++	    nxti = ISP_NXT_QENTRY(nxti, RQUEST_QUEUE_LEN(isp));
++	    if (nxti == optr) {
++		isp_prt(isp, ISP_LOGERR, "queue overflow in tdma_mk");
++		return (CMD_EAGAIN);
++	    }
++
++	   /*
++	    * Now that we're done with the old CTIO,
++	    * flush it out to the request queue.
++	    */
++	    ISP_TDQE(isp, "tdma_mk", curi, cto);
++	    isp_put_ctio(isp, cto, oqe);
++	    if (nth_ctio != 0) {
++		MEMORYBARRIER(isp, SYNC_REQUEST, curi, QENTRY_LEN);
++	    }
++	    curi = ISP_NXT_QENTRY(curi, RQUEST_QUEUE_LEN(isp));
++
++	    /*
++	     * Reset some fields in the CTIO so we can reuse
++	     * for the next one we'll flush to the request
++	     * queue.
++	     */
++	    cto->ct_header.rqs_entry_type = RQSTYPE_CTIO;
++	    cto->ct_header.rqs_entry_count = 1;
++	    cto->ct_header.rqs_flags = 0;
++	    cto->ct_status = 0;
++	    cto->ct_scsi_status = 0;
++	    cto->ct_xfrlen = 0;
++	    cto->ct_resid = 0;
++	    cto->ct_seg_count = 0;
++	    MEMZERO(cto->ct_dataseg, sizeof (cto->ct_dataseg));
++	}
++    }
++    *nxtip = nxti;
++    return (CMD_QUEUED);
++}
++
++static int tdma_mkfc(struct ispsoftc *, tmd_cmd_t *, ct2_entry_t *,
++    u_int16_t *, u_int16_t);
++
++
++/*
++ * We're passed a pointer to a prototype ct2_entry_t.
++ *
++ * If it doesn't contain any data movement, it has to be for sending status,
++ * possibly with Sense Data as well, so we send a single CTIO2. This should
++ * be a Mode 1 CTIO2, and it's up to the caller to set up the Sense Data
++ * and flags appropriately.
++ *
++ * If it does contain data movement, it may *also* be for sending status
++ * (possibly with Sense Data also). It's possible to describe to the firmware
++ * what we want in one CTIO2. However, under some conditions it is not,
++ * so we must also send a *second* CTIO2 after the first one.
++ *
++ * If the data to be sent is in segments that exceeds that which we can
++ * fit into a CTIO2 (likely, as there's only room for 3 segments), we
++ * utilize normal continuation entries, which get pushed after the
++ * first CTIO2, and possibly are followed by a final CTIO2.
++ *
++ * In any case, it's up to the caller to send us a Mode 0 CTIO2 describing
++ * the data to be moved (if any) and the appropriate flags indicating
++ * status. We'll clear and set as appropriate. We'll also check to see
++ * whether Sense Data is attempting to be sent and retrieve it as appropriate.
++ *
++ * In all cases the caller should not assume that the prototype CTIO2
++ * has been left unchanged.
++ */
++
++static int
++tdma_mkfc(struct ispsoftc *isp, tmd_cmd_t *tmd, ct2_entry_t *cto,
++    u_int16_t *nxtip, u_int16_t optr)
++{
++    static const char ctx[] = 
++	"CTIO2[%x] lun %d for iid %d flgs 0x%x sts 0x%x ssts 0x%x res %d %s";
++    struct scatterlist *sg;
++    void *qe;
++    ct2_entry_t ct2, *cto2;
++    u_int16_t swd, curi, nxti;
++    u_int32_t bc;
++    long xfcnt;	/* must be signed */
++    int nseg, seg;
++
++    nxti = *nxtip;
++    curi = isp->isp_reqidx;
++    qe = ISP_QUEUE_ENTRY(isp->isp_rquest, curi);
++    if (cto->ct_flags & CT2_FASTPOST) {
++	if ((tmd->cd_hflags & (CDFH_STSVALID|CDFH_SNSVALID)) != CDFH_STSVALID) {
++	    cto->ct_flags &= ~CT2_FASTPOST;
++	}
++    }
++
++    /*
++     * Handle commands that transfer no data right away.
++     */
++    if (tmd->cd_xfrlen == 0) {
++	if ((cto->ct_flags & CT2_FLAG_MMASK) != CT2_FLAG_MODE1) {
++	    isp_prt(isp, ISP_LOGERR,
++		"tdma_mkfc, a status CTIO2 without MODE1 set (0x%x)",
++		cto->ct_flags);
++	    cto->ct_resid = -EINVAL;
++	    return (CMD_COMPLETE);
++	}
++	cto->ct_header.rqs_entry_count = 1;
++	cto->ct_header.rqs_seqno = 1;
++
++	/* ct_syshandle contains the synchronization handle set by caller */
++	/*
++	 * We preserve ct_lun, ct_iid, ct_rxid. We set the data movement
++	 * flags to NO DATA and clear relative offset flags. We preserve
++	 * ct_resid and the response area. We assume that if there is
++	 * associated sense data that it has been appropriately set by
++	 * the caller.
++	 */
++	cto->ct_flags |= CT2_NO_DATA;
++	if (cto->ct_resid > 0)
++	    cto->rsp.m1.ct_scsi_status |= CT2_DATA_UNDER;
++	else if (cto->ct_resid < 0)
++	    cto->rsp.m1.ct_scsi_status |= CT2_DATA_OVER;
++	cto->ct_seg_count = 0;
++	cto->ct_reloff = 0;
++	isp_prt(isp, ISP_LOGTDEBUG1, ctx, cto->ct_rxid, (int) tmd->cd_lun,
++	    cto->ct_iid, cto->ct_flags, cto->ct_status,
++	    cto->rsp.m1.ct_scsi_status, cto->ct_resid, "<END>");
++	isp_put_ctio2(isp, cto, qe);
++	ISP_TDQE(isp, "tdma_mkfc[no data]", curi, qe);
++	return (CMD_QUEUED);
++    }
++
++    if ((cto->ct_flags & CT2_FLAG_MMASK) != CT2_FLAG_MODE0) {
++	isp_prt(isp, ISP_LOGERR,
++	    "tdma_mkfc, a data CTIO2 without MODE0 set (0x%x)", cto->ct_flags);
++	cto->ct_resid = -EINVAL;
++	return (CMD_COMPLETE);
++    }
++
++   /*
++    * First, count and map all S/G segments
++    *
++    * The byte counter has to be signed because
++    * we can have descriptors that are, in fact,
++    * longer than our data transfer count.
++    */
++    sg = tmd->cd_data;
++    nseg = 0;
++    xfcnt = tmd->cd_xfrlen;
++    while (xfcnt > 0) {
++        nseg++;
++        xfcnt -= sg_dma_len(sg);
++        sg++;
++    }
++    sg = tmd->cd_data;
++#if	 LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++    {
++	struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++	int new_seg_cnt;
++	new_seg_cnt = pci_map_sg(pcs->pci_dev, sg, nseg,
++	  (cto->ct_flags & CT2_DATA_IN)? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE);
++	if (new_seg_cnt == 0) {
++	    isp_prt(isp, ISP_LOGWARN, "unable to dma map request");
++	    cto->ct_resid = -ENOMEM;
++	    return (CMD_COMPLETE);
++	}
++	if (new_seg_cnt != nseg) {
++	    isp_prt(isp, ISP_LOGERR, "new seg cnt != old");
++	    cto->ct_resid = -EINVAL;
++	    return (CMD_COMPLETE);
++	}
++    }
++#endif
++
++   /*
++    * Second, figure out whether we need to send a final separate CTIO2
++    *
++    * The 2100/2200 firmware documentation indicates that if we have
++    * good SCSI status (0), but still have a residual, we can still
++    * describe this as part of a Mode 0 CTIO2. The 2300 firmware docs
++    * seem to indicate that if we wish to convey a non-zero residual,
++    * we can't do it as part of a Mode 0 CTIO2. To be safe, as well
++    * as follow the most likely occurrences, we'll push a second
++    * Mode 1 CTIO2 in any case that we have nonzero SCSI status
++    * or a residual.
++    */
++    swd = cto->rsp.m0.ct_scsi_status;
++
++    if ((cto->ct_flags & CT2_SENDSTATUS) && ((swd & 0xf) || cto->ct_resid)) {
++	cto2 = &ct2;
++	/*
++	 * Copy over CTIO2
++	 */
++	MEMCPY(cto2, cto, sizeof (ct2_entry_t));
++
++	/*
++	 * Clear fields from first CTIO2 that now need to be cleared
++	 */
++	cto->ct_flags &= ~(CT2_SENDSTATUS|CT2_CCINCR|CT2_FASTPOST);
++	cto->ct_resid = 0;
++	cto->ct_syshandle = 0;
++	cto->rsp.m0.ct_scsi_status = 0;
++
++	/*
++	 * Reset fields in the second CTIO2 as appropriate.
++	 */
++	cto2->ct_flags &= ~(CT2_FLAG_MMASK|CT2_DATAMASK);
++	cto2->ct_flags |= CT2_NO_DATA|CT2_NO_DATA|CT2_FLAG_MODE1;
++	cto2->ct_seg_count = 0;
++	cto2->ct_reloff = 0;
++    	MEMZERO(&cto2->rsp, sizeof (cto2->rsp));
++	cto2->rsp.m1.ct_scsi_status = swd;
++	if ((swd & 0xf) == SCSI_CHECK && (swd & CT2_SNSLEN_VALID)) {
++		MEMCPY(cto2->rsp.m1.ct_resp, tmd->cd_sense, QLTM_SENSELEN);
++                cto2->rsp.m1.ct_senselen = QLTM_SENSELEN;
++                cto2->rsp.m1.ct_scsi_status |= CT2_SNSLEN_VALID;
++	}
++    } else {
++	cto2 = NULL;
++    }
++
++    /*
++     * Third, Fill in the data segments in the first CTIO2 itself.
++     */
++    xfcnt = tmd->cd_xfrlen;
++    cto->ct_seg_count = nseg;
++
++    for (seg = 0; seg < min(nseg, ISP_RQDSEG_T2); seg++) {
++	cto->rsp.m0.ct_dataseg[seg].ds_base = sg_dma_address(sg);
++	bc = min(sg_dma_len(sg), xfcnt);
++	cto->rsp.m0.ct_dataseg[seg].ds_count = bc;
++	cto->rsp.m0.ct_xfrlen += bc;
++	xfcnt -= bc;
++	isp_prt(isp, ISP_LOGTDEBUG1, "  ent0[%d]%lx:%lu", seg,
++	    (unsigned long)sg_dma_address(sg), (unsigned long)sg_dma_len(sg));
++	sg++;
++    }
++
++    /*
++     * Now do any continuation segments that are required.
++     */
++    while (seg < nseg) {
++	int curseg;
++	ispcontreq_t local, *crq = &local;
++
++	qe = (ispcontreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, nxti);
++	curi = nxti;
++	nxti = ISP_NXT_QENTRY(curi, RQUEST_QUEUE_LEN(isp));
++	if (nxti == optr) {
++	    isp_prt(isp, ISP_LOGTDEBUG0, 
++		"tdma_mkfc: request queue overflow");
++	    cto->ct_resid = -EAGAIN;
++	    return (CMD_COMPLETE);
++        }
++	cto->ct_header.rqs_entry_count++;
++	MEMZERO((void *)crq, sizeof (*crq));
++	crq->req_header.rqs_entry_count = 1;
++	crq->req_header.rqs_entry_type = RQSTYPE_DATASEG;
++	for (curseg = 0; seg < nseg && curseg < ISP_CDSEG; curseg++, seg++) {
++	    crq->req_dataseg[curseg].ds_base = sg_dma_address(sg);
++	    bc = min(sg_dma_len(sg), xfcnt);
++	    crq->req_dataseg[curseg].ds_count = bc;
++	    cto->rsp.m0.ct_xfrlen += bc;
++	    xfcnt -= bc;
++	    isp_prt(isp, ISP_LOGTDEBUG1, "  ent%d[%d]%lx:%lu",
++		cto->ct_header.rqs_entry_count - 1, curseg,
++		(unsigned long)sg_dma_address(sg), (unsigned long)bc);
++	    sg++;
++	}
++	isp_put_cont_req(isp, crq, (ispcontreq_t *)qe);
++	MEMORYBARRIER(isp, SYNC_REQUEST, curi, QENTRY_LEN);
++	ISP_TDQE(isp, "tdma_mkfc:cont", curi, cto);
++    }
++
++    /*
++     * If we have a final CTIO2, allocate and push *that*
++     * onto the request queue.
++     */
++    if (cto2) {
++	qe = (ct2_entry_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, nxti);
++	curi = nxti;
++	nxti = ISP_NXT_QENTRY(curi, RQUEST_QUEUE_LEN(isp));
++	if (nxti == optr) {
++	    isp_prt(isp, ISP_LOGTDEBUG0, 
++		"tdma_mkfc: request queue overflow");
++	    cto->ct_resid = -EAGAIN;
++	    return (CMD_COMPLETE);
++        }
++	MEMORYBARRIER(isp, SYNC_REQUEST, curi, QENTRY_LEN);
++	isp_put_ctio2(isp, cto2, (ct2_entry_t *)qe);
++	ISP_TDQE(isp, "tdma_mkfc:final", curi, cto2);
++    }
++    qe = ISP_QUEUE_ENTRY(isp->isp_rquest, isp->isp_reqidx);
++    isp_put_ctio2(isp, cto, qe);
++    ISP_TDQE(isp, "tdma_mkfc", isp->isp_reqidx, cto);
++    *nxtip = nxti;
++    return (CMD_QUEUED);
++}
++#endif
++
++#if	LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++#define	FOURG_SEG(x)	(((u64) (x)) & 0xffffffff00000000ULL)
++
++static int
++isp_pci_dmasetup(struct ispsoftc *isp, Scsi_Cmnd *Cmnd, ispreq_t *rq,
++    u_int16_t *nxi, u_int16_t optr)
++{
++    struct scatterlist *sg, *savesg;
++    DMA_ADDR_T one_shot_addr, last_synthetic_addr;
++    unsigned int one_shot_length, last_synthetic_count;
++    int segcnt, seg, ovseg, seglim;
++    void *h;
++    u_int16_t nxti;
++
++
++#ifdef	LINUX_ISP_TARGET_MODE
++    if (rq->req_header.rqs_entry_type == RQSTYPE_CTIO ||
++        rq->req_header.rqs_entry_type == RQSTYPE_CTIO2) {
++	int s;
++	if (IS_SCSI(isp))
++	    s = tdma_mk(isp, (tmd_cmd_t *)Cmnd, (ct_entry_t *)rq, nxi, optr);
++	else
++	    s = tdma_mkfc(isp, (tmd_cmd_t *)Cmnd, (ct2_entry_t *)rq, nxi, optr);
++	return (s);
++   }
++#endif
++
++    nxti = *nxi;
++    h = (void *) ISP_QUEUE_ENTRY(isp->isp_rquest, isp->isp_reqidx);
++
++    if (Cmnd->sc_data_direction == SCSI_DATA_NONE ||
++        Cmnd->request_bufflen == 0) {
++	rq->req_seg_count = 1;
++	goto mbxsync;
++    }
++
++    if (IS_FC(isp)) {
++	seglim = ISP_RQDSEG_T2;
++	((ispreqt2_t *)rq)->req_totalcnt = Cmnd->request_bufflen;
++	if (Cmnd->sc_data_direction == SCSI_DATA_WRITE) {
++	    ((ispreqt2_t *)rq)->req_flags |= REQFLAG_DATA_OUT;
++	} else if (Cmnd->sc_data_direction == SCSI_DATA_READ) {
++	    ((ispreqt2_t *)rq)->req_flags |= REQFLAG_DATA_IN;
++	} else {
++	    isp_prt(isp, ISP_LOGERR,
++		"unkown data direction (%x) for %d byte request (opcode 0x%x)",
++	        Cmnd->sc_data_direction, Cmnd->request_bufflen, Cmnd->cmnd[0]);
++	    XS_SETERR(Cmnd, HBA_BOTCH);
++	    return (CMD_COMPLETE);
++	}
++    } else {
++	if (Cmnd->cmd_len > 12)
++	    seglim = 0;
++	else
++	    seglim = ISP_RQDSEG;
++	if (Cmnd->sc_data_direction == SCSI_DATA_WRITE) {
++	    rq->req_flags |= REQFLAG_DATA_OUT;
++	} else if (Cmnd->sc_data_direction == SCSI_DATA_READ) {
++	    rq->req_flags |= REQFLAG_DATA_IN;
++	} else {
++	    isp_prt(isp, ISP_LOGERR,
++		"unkown data direction (%x) for %d byte request (opcode 0x%x)",
++	        Cmnd->sc_data_direction, Cmnd->request_bufflen, Cmnd->cmnd[0]);
++	    XS_SETERR(Cmnd, HBA_BOTCH);
++	    return (CMD_COMPLETE);
++	}
++    }
++
++    one_shot_addr = (DMA_ADDR_T) 0;
++    one_shot_length = 0;
++    if ((segcnt = Cmnd->use_sg) == 0) {
++	struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++	segcnt = 1;
++	sg = NULL;
++	one_shot_length = Cmnd->request_bufflen;
++	one_shot_addr = pci_map_single(pcs->pci_dev,
++	    Cmnd->request_buffer, Cmnd->request_bufflen,
++	    scsi_to_pci_dma_dir(Cmnd->sc_data_direction));
++	QLA_HANDLE(Cmnd) = (DMA_HTYPE_T) one_shot_addr;
++    } else {
++	struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++	sg = (struct scatterlist *) Cmnd->request_buffer;
++	segcnt = pci_map_sg(pcs->pci_dev, sg, Cmnd->use_sg,
++	    scsi_to_pci_dma_dir(Cmnd->sc_data_direction));
++    }
++    if (segcnt == 0) {
++	isp_prt(isp, ISP_LOGWARN, "unable to dma map request");
++	XS_SETERR(Cmnd, HBA_BOTCH);
++	return (CMD_EAGAIN);
++    }
++    savesg = sg;
++
++again:
++    last_synthetic_count = 0;
++    last_synthetic_addr = 0;
++    for (seg = 0, rq->req_seg_count = 0;
++	 seg < segcnt && rq->req_seg_count < seglim;
++	 seg++, rq->req_seg_count++) {
++	DMA_ADDR_T addr;
++	unsigned int length;
++
++	if (sg) {
++		length = QLA_SG_C(sg);
++		addr = QLA_SG_A(sg);
++		sg++;
++	} else {
++		length = one_shot_length;
++		addr = one_shot_addr;
++	}
++
++	if (ISP_A64 && IS_HIGH_ISP_ADDR(addr)) {
++	   if (IS_FC(isp)) {
++		if (rq->req_header.rqs_entry_type != RQSTYPE_T3RQS) {
++			rq->req_header.rqs_entry_type = RQSTYPE_T3RQS;
++			seglim = ISP_RQDSEG_T3;
++			sg = savesg;
++			goto again;
++		}
++	   } else {
++		if (rq->req_header.rqs_entry_type != RQSTYPE_A64) {
++			rq->req_header.rqs_entry_type = RQSTYPE_A64;
++			seglim = ISP_RQDSEG_A64;
++			sg = savesg;
++			goto again;
++		}
++	   }
++	}
++	if (ISP_A64 && rq->req_header.rqs_entry_type == RQSTYPE_T3RQS) {
++	    ispreqt3_t *rq3 = (ispreqt3_t *)rq;
++	    rq3->req_dataseg[rq3->req_seg_count].ds_count = length;
++	    rq3->req_dataseg[rq3->req_seg_count].ds_base = LOWD(addr);
++	    rq3->req_dataseg[rq3->req_seg_count].ds_basehi = HIWD(addr);
++	    /*
++	     * Make sure we don't cross a 4GB boundary.
++	     */
++	    if (FOURG_SEG(addr) != FOURG_SEG(addr + length)) {
++		isp_prt(isp, ISP_LOGDEBUG1, "seg0[%d]%llx:%u (TRUNC'd)",
++		    rq->req_seg_count, (long long)addr, length);
++		rq3->req_dataseg[rq3->req_seg_count].ds_count =
++		    (unsigned int) (FOURG_SEG(addr + length) - addr);
++		addr += rq3->req_dataseg[rq3->req_seg_count].ds_count;
++		length -= rq3->req_dataseg[rq3->req_seg_count].ds_count;
++		/*
++		 * Do we have space to split it here?
++		 */
++		if (rq3->req_seg_count == seglim - 1) {
++		    last_synthetic_count = length;
++		    last_synthetic_addr = addr;
++		} else {
++		    rq3->req_seg_count++;
++		    rq3->req_dataseg[rq3->req_seg_count].ds_count = length;
++		    rq3->req_dataseg[rq3->req_seg_count].ds_base = LOWD(addr);
++		    rq3->req_dataseg[rq3->req_seg_count].ds_basehi = HIWD(addr);
++		}
++	    }
++	} else if (ISP_A64 && rq->req_header.rqs_entry_type == RQSTYPE_A64) {
++	    ispreq64_t *rq6 = (ispreq64_t *)rq;
++	    rq6->req_dataseg[rq6->req_seg_count].ds_count = length;
++	    rq6->req_dataseg[rq6->req_seg_count].ds_base = LOWD(addr);
++	    rq6->req_dataseg[rq6->req_seg_count].ds_basehi = HIWD(addr);
++	    /*
++	     * Make sure we don't cross a 4GB boundary.
++	     */
++	    if (FOURG_SEG(addr) != FOURG_SEG(addr + length)) {
++		isp_prt(isp, ISP_LOGDEBUG1, "seg0[%d]%llx:%u (TRUNC'd)",
++		    rq->req_seg_count, (long long)addr, length);
++		rq6->req_dataseg[rq6->req_seg_count].ds_count =
++		    (unsigned int) (FOURG_SEG(addr + length) - addr);
++		addr += rq6->req_dataseg[rq6->req_seg_count].ds_count;
++		length -= rq6->req_dataseg[rq6->req_seg_count].ds_count;
++		/*
++		 * Do we have space to split it here?
++		 */
++		if (rq6->req_seg_count == seglim - 1) {
++		    last_synthetic_count = length;
++		    last_synthetic_addr = LOWD(addr);
++		} else {
++		    rq6->req_seg_count++;
++		    rq6->req_dataseg[rq6->req_seg_count].ds_count = length;
++		    rq6->req_dataseg[rq6->req_seg_count].ds_base = LOWD(addr);
++		    rq6->req_dataseg[rq6->req_seg_count].ds_basehi = HIWD(addr);
++		}
++	    }
++	} else if (rq->req_header.rqs_entry_type == RQSTYPE_T2RQS) {
++	    ispreqt2_t *rq2 = (ispreqt2_t *)rq;
++	    rq2->req_dataseg[rq2->req_seg_count].ds_count = length;
++	    rq2->req_dataseg[rq2->req_seg_count].ds_base = addr;
++	} else {
++	    rq->req_dataseg[rq->req_seg_count].ds_count = length;
++	    rq->req_dataseg[rq->req_seg_count].ds_base = addr;
++	}
++	isp_prt(isp, ISP_LOGDEBUG1, "seg0[%d]%llx:%u",
++	    rq->req_seg_count, (long long)addr, length);
++    }
++
++    if (seg == segcnt && last_synthetic_count == 0) {
++	goto mbxsync;
++    }
++
++    do {
++	int lim;
++	u_int16_t curip;
++	ispcontreq_t local, *crq = &local, *qep;
++
++	curip = nxti;
++	qep = (ispcontreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, curip);
++	nxti = ISP_NXT_QENTRY((curip), RQUEST_QUEUE_LEN(isp));
++	if (nxti == optr) {
++	    isp_pci_dmateardown(isp, Cmnd, 0);
++	    isp_prt(isp, ISP_LOGDEBUG0, "out of space for continuations");
++	    XS_SETERR(Cmnd, HBA_BOTCH);
++	    return (CMD_EAGAIN);
++	}
++	rq->req_header.rqs_entry_count++;
++	MEMZERO((void *)crq, sizeof (*crq));
++	crq->req_header.rqs_entry_count = 1;
++	if (rq->req_header.rqs_entry_type == RQSTYPE_T3RQS ||
++	    rq->req_header.rqs_entry_type == RQSTYPE_A64) {
++	    crq->req_header.rqs_entry_type = RQSTYPE_A64_CONT;
++	    lim = ISP_CDSEG64;
++	} else {
++	    crq->req_header.rqs_entry_type = RQSTYPE_DATASEG;
++	    lim = ISP_CDSEG;
++	}
++
++	for (ovseg = 0; (seg < segcnt || last_synthetic_count) && ovseg < lim;
++	    rq->req_seg_count++, seg++, ovseg++, sg++) {
++	    DMA_ADDR_T addr;
++	    unsigned int length;
++
++	    if (last_synthetic_count) {
++		addr = last_synthetic_addr;
++		length = last_synthetic_count;
++		last_synthetic_count = 0;
++		sg--;
++		seg--;
++	    } else {
++		addr = QLA_SG_A(sg);
++		length = QLA_SG_C(sg);
++	    }
++
++	    if (length == 0) {
++		panic("zero length s-g element at line %d", __LINE__);
++	    }
++	    isp_prt(isp, ISP_LOGDEBUG1, "seg%d[%d]%llx:%u",
++		rq->req_header.rqs_entry_count-1, ovseg,
++	    	(unsigned long long) addr, length);
++
++	    if (crq->req_header.rqs_entry_type == RQSTYPE_A64_CONT) {
++		ispcontreq64_t *xrq = (ispcontreq64_t *) crq;
++		xrq->req_dataseg[ovseg].ds_count = length;
++		xrq->req_dataseg[ovseg].ds_base = LOWD(addr);
++		xrq->req_dataseg[ovseg].ds_basehi = HIWD(addr);
++		/*
++		 * Make sure we don't cross a 4GB boundary.
++		 */
++		if (FOURG_SEG(addr) != FOURG_SEG(addr + length)) {
++		    isp_prt(isp, ISP_LOGDEBUG1, "seg0[%d]%llx:%u (TRUNC'd)",
++			rq->req_seg_count, (long long)addr, length);
++		    xrq->req_dataseg[ovseg].ds_count =
++			(unsigned int) (FOURG_SEG(addr + length) - addr);
++		    addr += xrq->req_dataseg[ovseg].ds_count;
++		    length -= xrq->req_dataseg[ovseg].ds_count;
++		    /*
++		     * Do we have space to split it here?
++		     */
++		    if (ovseg == lim - 1) {
++			last_synthetic_count = length;
++			last_synthetic_addr = addr;
++		    } else {
++			ovseg++;
++			xrq->req_dataseg[ovseg].ds_count = length;
++			xrq->req_dataseg[ovseg].ds_base = LOWD(addr);
++			xrq->req_dataseg[ovseg].ds_basehi = HIWD(addr);
++		    }
++		}
++		continue;
++	    }
++	    /*
++	     * We get here if we're a 32 bit continuation entry.
++	     * We also check for being over 32 bits with our PCI
++	     * address. If we are, we set ourselves up to do 64
++	     * bit addressing and start the whole mapping process
++	     * all over again- we apparently can't really mix types
++	     */
++	    if (ISP_A64 && IS_HIGH_ISP_ADDR(addr)) {
++		if (IS_FC(isp)) {
++		    rq->req_header.rqs_entry_type = RQSTYPE_T3RQS;
++		    seglim = ISP_RQDSEG_T3;
++		} else {
++		    rq->req_header.rqs_entry_type = RQSTYPE_A64;
++		    seglim = ISP_RQDSEG_A64;
++		}
++		sg = savesg;
++		nxti = *nxi;
++		rq->req_header.rqs_entry_count = 1;
++		goto again;
++	    }
++	    crq->req_dataseg[ovseg].ds_count = length;
++	    crq->req_dataseg[ovseg].ds_base = addr;
++	}
++	MEMORYBARRIER(isp, SYNC_REQUEST, curip, QENTRY_LEN);
++	if (crq->req_header.rqs_entry_type == RQSTYPE_A64_CONT) {
++	    isp_put_cont64_req(isp,
++		(ispcontreq64_t *)crq, (ispcontreq64_t *)qep);
++	} else {
++	    isp_put_cont_req(isp, crq, qep);
++	}
++    } while (seg < segcnt || last_synthetic_count);
++mbxsync:
++    if (rq->req_header.rqs_entry_type == RQSTYPE_T3RQS) {
++	isp_put_request_t3(isp, (ispreqt3_t *) rq, (ispreqt3_t *) h);
++    } else if (rq->req_header.rqs_entry_type == RQSTYPE_T2RQS) {
++	isp_put_request_t2(isp, (ispreqt2_t *) rq, (ispreqt2_t *) h);
++    } else {
++	isp_put_request(isp, (ispreq_t *) rq, (ispreq_t *) h);
++    }
++    *nxi = nxti;
++    return (CMD_QUEUED);
++}
++
++static void
++isp_pci_dmateardown(struct ispsoftc *isp, Scsi_Cmnd *Cmnd, u_int16_t handle)
++{
++#ifdef	LINUX_ISP_TARGET_MODE
++    if (Cmnd->sc_magic != SCSI_CMND_MAGIC) {
++	struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp;
++	tmd_cmd_t *tmd = (tmd_cmd_t *) Cmnd;
++	struct scatterlist *sg = tmd->cd_data;
++	int nseg = 0;
++
++	while (sg->address) {
++		nseg++;
++		sg++;
++	}
++        pci_unmap_sg(pcs->pci_dev, tmd->cd_data, nseg,
++	    (tmd->cd_hflags & CDFH_DATA_IN)? PCI_DMA_TODEVICE :
++	    PCI_DMA_FROMDEVICE);
++    } else
++#endif
++    if (Cmnd->sc_data_direction != SCSI_DATA_NONE) {
++	struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp;
++	if (Cmnd->use_sg) {
++	    pci_unmap_sg(pcs->pci_dev, (struct scatterlist *)Cmnd->buffer,
++		Cmnd->use_sg, scsi_to_pci_dma_dir(Cmnd->sc_data_direction));
++	} else if (Cmnd->request_bufflen) {
++	    DMA_ADDR_T handle = (DMA_ADDR_T) QLA_HANDLE(Cmnd);
++	    pci_unmap_single(pcs->pci_dev, handle, Cmnd->request_bufflen,
++		scsi_to_pci_dma_dir(Cmnd->sc_data_direction));
++	}
++    }
++}
++
++#else
++
++static int
++isp_pci_dmasetup(struct ispsoftc *isp, Scsi_Cmnd *Cmnd, ispreq_t *rq,
++    u_int16_t *nxi, u_int16_t optr)
++{
++    struct scatterlist *sg;
++    DMA_ADDR_T one_shot_addr;
++    unsigned int one_shot_length;
++    int segcnt, seg, ovseg, seglim;
++    void *h;
++    u_int16_t nxti;
++
++#ifdef	LINUX_ISP_TARGET_MODE
++    if (rq->req_header.rqs_entry_type == RQSTYPE_CTIO ||
++        rq->req_header.rqs_entry_type == RQSTYPE_CTIO2) {
++	int s;
++	if (IS_SCSI(isp))
++	    s = tdma_mk(isp, (tmd_cmd_t *)Cmnd, (ct_entry_t *)rq, nxi, optr);
++	else
++	    s = tdma_mkfc(isp, (tmd_cmd_t *)Cmnd, (ct2_entry_t *)rq, nxi, optr);
++	return (s);
++   }
++#endif
++
++    nxti = *nxi;
++    h = (void *) ISP_QUEUE_ENTRY(isp->isp_rquest, isp->isp_reqidx);
++
++    if (Cmnd->request_bufflen == 0) {
++	rq->req_seg_count = 1;
++	goto mbxsync;
++    }
++
++    if (IS_FC(isp)) {
++	if (rq->req_header.rqs_entry_type == RQSTYPE_T3RQS)
++	    seglim = ISP_RQDSEG_T3;
++	else
++	    seglim = ISP_RQDSEG_T2;
++	((ispreqt2_t *)rq)->req_totalcnt = Cmnd->request_bufflen;
++	/*
++	 * Linux doesn't make it easy to tell which direction
++	 * the data is expected to go, and you really need to
++	 * know this for FC. We'll have to assume that some
++	 * of these commands that might be used for writes
++	 * our outbounds and all else are inbound.
++	 */
++	switch (Cmnd->cmnd[0]) {
++	case FORMAT_UNIT:
++	case WRITE_6:
++	case MODE_SELECT:
++	case SEND_DIAGNOSTIC:
++	case WRITE_10:
++	case WRITE_BUFFER:
++	case WRITE_LONG:
++	case WRITE_SAME:
++	case MODE_SELECT_10:
++	case WRITE_12:
++	case WRITE_VERIFY_12:
++	case SEND_VOLUME_TAG:
++	    ((ispreqt2_t *)rq)->req_flags |= REQFLAG_DATA_OUT;
++	    break;
++	default:
++	    ((ispreqt2_t *)rq)->req_flags |= REQFLAG_DATA_IN;
++	}
++    } else {
++	if (Cmnd->cmd_len > 12)
++	    seglim = 0;
++	else
++	    seglim = ISP_RQDSEG;
++	rq->req_flags |=  REQFLAG_DATA_OUT | REQFLAG_DATA_IN;
++    }
++
++    one_shot_addr = (DMA_ADDR_T) 0;
++    one_shot_length = 0;
++    if ((segcnt = Cmnd->use_sg) == 0) {
++	segcnt = 1;
++	sg = NULL;
++	one_shot_length = Cmnd->request_bufflen;
++	one_shot_addr = virt_to_bus(Cmnd->request_buffer);
++    } else {
++	sg = (struct scatterlist *) Cmnd->request_buffer;
++    }
++    if (segcnt == 0) {
++	isp_prt(isp, ISP_LOGWARN, "unable to dma map request");
++	XS_SETERR(Cmnd, HBA_BOTCH);
++	return (CMD_EAGAIN);
++    }
++
++    for (seg = 0, rq->req_seg_count = 0;
++	 seg < segcnt && rq->req_seg_count < seglim;
++	 seg++, rq->req_seg_count++) {
++	DMA_ADDR_T addr;
++	unsigned int length;
++
++	if (sg) {
++		length = QLA_SG_C(sg);
++		addr = QLA_SG_A(sg);
++		sg++;
++	} else {
++		length = one_shot_length;
++		addr = one_shot_addr;
++	}
++
++	if (rq->req_header.rqs_entry_type == RQSTYPE_T2RQS) {
++	    ispreqt2_t *rq2 = (ispreqt2_t *)rq;
++	    rq2->req_dataseg[rq2->req_seg_count].ds_count = length;
++	    rq2->req_dataseg[rq2->req_seg_count].ds_base = addr;
++	} else {
++	    rq->req_dataseg[rq->req_seg_count].ds_count = length;
++	    rq->req_dataseg[rq->req_seg_count].ds_base = addr;
++	}
++	isp_prt(isp, ISP_LOGDEBUG1, "seg0[%d]%llx:%u from %p", seg,
++	    (long long)addr, length, sg? sg->address : Cmnd->request_buffer);
++    }
++
++    if (seg == segcnt) {
++	goto mbxsync;
++    }
++
++    do {
++	int lim;
++	u_int16_t curip;
++	ispcontreq_t local, *crq = &local, *qep;
++
++	curip = nxti;
++	qep = (ispcontreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, curip);
++	nxti = ISP_NXT_QENTRY((curip), RQUEST_QUEUE_LEN(isp));
++	if (nxti == optr) {
++	    isp_prt(isp, ISP_LOGDEBUG0, "out of space for continuations");
++	    XS_SETERR(Cmnd, HBA_BOTCH);
++	    return (CMD_EAGAIN);
++	}
++	rq->req_header.rqs_entry_count++;
++	MEMZERO((void *)crq, sizeof (*crq));
++	crq->req_header.rqs_entry_count = 1;
++	if (rq->req_header.rqs_entry_type == RQSTYPE_T3RQS) {
++	    lim = ISP_CDSEG64;
++	    crq->req_header.rqs_entry_type = RQSTYPE_A64_CONT;
++	} else {
++	    lim = ISP_CDSEG;
++	    crq->req_header.rqs_entry_type = RQSTYPE_DATASEG;
++	}
++
++	for (ovseg = 0; seg < segcnt && ovseg < lim;
++	     rq->req_seg_count++, seg++, ovseg++, sg++) {
++	    if (sg_dma_len(sg) == 0) {
++		panic("zero length s-g element at line %d", __LINE__);
++	    }
++	    crq->req_dataseg[ovseg].ds_count = QLA_SG_C(sg);
++	    crq->req_dataseg[ovseg].ds_base = QLA_SG_A(sg);
++	    isp_prt(isp, ISP_LOGDEBUG1, "seg%d[%d]%llx:%u from %p",
++		rq->req_header.rqs_entry_count-1, ovseg,
++	    	(unsigned long long) QLA_SG_A(sg), QLA_SG_C(sg), sg->address);
++	}
++	MEMORYBARRIER(isp, SYNC_REQUEST, curip, QENTRY_LEN);
++	isp_put_cont_req(isp, crq, qep);
++    } while (seg < segcnt);
++mbxsync:
++    if (rq->req_header.rqs_entry_type == RQSTYPE_T3RQS) {
++	isp_put_request_t3(isp, (ispreqt3_t *) rq, (ispreqt3_t *) h);
++    } else if (rq->req_header.rqs_entry_type == RQSTYPE_T2RQS) {
++	isp_put_request_t2(isp, (ispreqt2_t *) rq, (ispreqt2_t *) h);
++    } else {
++	isp_put_request(isp, (ispreq_t *) rq, (ispreq_t *) h);
++    }
++    *nxi = nxti;
++    return (CMD_QUEUED);
++}
++#endif
++
++static void
++isp_pci_reset1(struct ispsoftc *isp)
++{
++    isp_pci_wr_reg(isp, HCCR, PCI_HCCR_CMD_BIOS);
++    ENABLE_INTS(isp);
++    isp->mbintsok = 1;
++}
++
++static void
++isp_pci_dumpregs(struct ispsoftc *isp, const char *msg)
++{
++    struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;    
++    u_int16_t csr;
++
++    pci_read_config_word(pcs->pci_dev, PCI_COMMAND, &csr);
++    printk("%s: ", isp->isp_name);
++    if (msg)
++	printk("%s\n", msg);
++    if (IS_SCSI(isp))
++	printk("    biu_conf1=%x", ISP_READ(isp, BIU_CONF1));
++    else
++	printk("    biu_csr=%x", ISP_READ(isp, BIU2100_CSR));
++    printk(" biu_icr=%x biu_isr=%x biu_sema=%x ", ISP_READ(isp, BIU_ICR),
++	   ISP_READ(isp, BIU_ISR), ISP_READ(isp, BIU_SEMA));
++    printk("risc_hccr=%x\n", ISP_READ(isp, HCCR));
++    if (IS_SCSI(isp)) {
++	ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
++	printk("    cdma_conf=%x cdma_sts=%x cdma_fifostat=%x\n",
++	       ISP_READ(isp, CDMA_CONF), ISP_READ(isp, CDMA_STATUS),
++	       ISP_READ(isp, CDMA_FIFO_STS));
++	printk("    ddma_conf=%x ddma_sts=%x ddma_fifostat=%x\n",
++	       ISP_READ(isp, DDMA_CONF), ISP_READ(isp, DDMA_STATUS),
++	       ISP_READ(isp, DDMA_FIFO_STS));
++	printk("    sxp_int=%x sxp_gross=%x sxp(scsi_ctrl)=%x\n",
++	       ISP_READ(isp, SXP_INTERRUPT),
++	       ISP_READ(isp, SXP_GROSS_ERR),
++	       ISP_READ(isp, SXP_PINS_CTRL));
++	ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
++    }
++    printk("    mbox regs: %x %x %x %x %x\n",
++	   ISP_READ(isp, OUTMAILBOX0), ISP_READ(isp, OUTMAILBOX1),
++	   ISP_READ(isp, OUTMAILBOX2), ISP_READ(isp, OUTMAILBOX3),
++	   ISP_READ(isp, OUTMAILBOX4));
++    printk("    PCI Status Command/Status=%x\n", csr);
++}
++
++#ifdef	MODULE
++MODULE_PARM(isp_pci_mapmem, "i");
++#endif
++/*
++ * mode: c
++ * 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
++ * End:
++ */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/ispreg.h	2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,1011 @@
++/* @(#)ispreg.h 1.6 */
++/*
++ * Machine Independent (well, as best as possible) register
++ * definitions for Qlogic ISP SCSI adapters.
++ *
++ * Copyright (c) 1997, 1998, 1999, 2000 by Matthew Jacob
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice immediately at the beginning of the file, without modification,
++ *    this list of conditions, and the following disclaimer.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ */
++#ifndef	_ISPREG_H
++#define	_ISPREG_H
++
++/*
++ * Hardware definitions for the Qlogic ISP  registers.
++ */
++
++/*
++ * This defines types of access to various registers.
++ *
++ *  	R:		Read Only
++ *	W:		Write Only
++ *	RW:		Read/Write
++ *
++ *	R*, W*, RW*:	Read Only, Write Only, Read/Write, but only
++ *			if RISC processor in ISP is paused.
++ */
++
++/*
++ * Offsets for various register blocks.
++ *
++ * Sad but true, different architectures have different offsets.
++ *
++ * Don't be alarmed if none of this makes sense. The original register
++ * layout set some defines in a certain pattern. Everything else has been
++ * grafted on since. For example, the ISP1080 manual will state that DMA
++ * registers start at 0x80 from the base of the register address space.
++ * That's true, but for our purposes, we define DMA_REGS_OFF for the 1080
++ * to start at offset 0x60 because the DMA registers are all defined to
++ * be DMA_BLOCK+0x20 and so on. Clear?
++ */
++
++#define	BIU_REGS_OFF			0x00
++
++#define	PCI_MBOX_REGS_OFF		0x70
++#define	PCI_MBOX_REGS2100_OFF		0x10
++#define	PCI_MBOX_REGS2300_OFF		0x40
++#define	SBUS_MBOX_REGS_OFF		0x80
++
++#define	PCI_SXP_REGS_OFF		0x80
++#define	SBUS_SXP_REGS_OFF		0x200
++
++#define	PCI_RISC_REGS_OFF		0x80
++#define	SBUS_RISC_REGS_OFF		0x400
++
++/* Bless me! Chip designers have putzed it again! */
++#define	ISP1080_DMA_REGS_OFF		0x60
++#define	DMA_REGS_OFF			0x00	/* same as BIU block */
++
++#define	SBUS_REGSIZE			0x450
++#define	PCI_REGSIZE			0x100
++
++/*
++ * NB:	The *_BLOCK definitions have no specific hardware meaning.
++ *	They serve simply to note to the MD layer which block of
++ *	registers offsets are being accessed.
++ */
++#define	_NREG_BLKS	5
++#define	_BLK_REG_SHFT	13
++#define	_BLK_REG_MASK	(7 << _BLK_REG_SHFT)
++#define	BIU_BLOCK	(0 << _BLK_REG_SHFT)
++#define	MBOX_BLOCK	(1 << _BLK_REG_SHFT)
++#define	SXP_BLOCK	(2 << _BLK_REG_SHFT)
++#define	RISC_BLOCK	(3 << _BLK_REG_SHFT)
++#define	DMA_BLOCK	(4 << _BLK_REG_SHFT)
++
++/*
++ * Bus Interface Block Register Offsets
++ */
++
++#define	BIU_ID_LO	(BIU_BLOCK+0x0)		/* R  : Bus ID, Low */
++#define		BIU2100_FLASH_ADDR	(BIU_BLOCK+0x0)
++#define	BIU_ID_HI	(BIU_BLOCK+0x2)		/* R  : Bus ID, High */
++#define		BIU2100_FLASH_DATA	(BIU_BLOCK+0x2)
++#define	BIU_CONF0	(BIU_BLOCK+0x4)		/* R  : Bus Configuration #0 */
++#define	BIU_CONF1	(BIU_BLOCK+0x6)		/* R  : Bus Configuration #1 */
++#define		BIU2100_CSR		(BIU_BLOCK+0x6)
++#define	BIU_ICR		(BIU_BLOCK+0x8)		/* RW : Bus Interface Ctrl */
++#define	BIU_ISR		(BIU_BLOCK+0xA)		/* R  : Bus Interface Status */
++#define	BIU_SEMA	(BIU_BLOCK+0xC)		/* RW : Bus Semaphore */
++#define	BIU_NVRAM	(BIU_BLOCK+0xE)		/* RW : Bus NVRAM */
++/*
++ * These are specific to the 2300.
++ *
++ * They *claim* you can read BIU_R2HSTSLO with a full 32 bit access
++ * and get both registers, but I'm a bit dubious about that. But the
++ * point here is that the top 16 bits are firmware defined bits that
++ * the RISC processor uses to inform the host about something- usually
++ * something which was nominally in a mailbox register.
++ */
++#define	BIU_REQINP	(BIU_BLOCK+0x10)	/* Request Queue In */
++#define	BIU_REQOUTP	(BIU_BLOCK+0x12)	/* Request Queue Out */
++#define	BIU_RSPINP	(BIU_BLOCK+0x14)	/* Response Queue In */
++#define	BIU_RSPOUTP	(BIU_BLOCK+0x16)	/* Response Queue Out */
++
++#define	BIU_R2HSTSLO	(BIU_BLOCK+0x18)
++#define	BIU_R2HSTSHI	(BIU_BLOCK+0x1A)
++
++#define	BIU_R2HST_INTR		(1 << 15)	/* RISC to Host Interrupt */
++#define	BIU_R2HST_PAUSED	(1 <<  8)	/* RISC paused */
++#define	BIU_R2HST_ISTAT_MASK	0x3f		/* intr information && status */
++#define		ISPR2HST_ROM_MBX_OK	0x1	/* ROM mailbox cmd done ok */
++#define		ISPR2HST_ROM_MBX_FAIL	0x2	/* ROM mailbox cmd done fail */
++#define		ISPR2HST_MBX_OK		0x10	/* mailbox cmd done ok */
++#define		ISPR2HST_MBX_FAIL	0x11	/* mailbox cmd done fail */
++#define		ISPR2HST_ASYNC_EVENT	0x12	/* Async Event */
++#define		ISPR2HST_RSPQ_UPDATE	0x13	/* Response Queue Update */
++#define		ISPR2HST_RQST_UPDATE	0x14	/* Resquest Queue Update */
++#define		ISPR2HST_RIO_16		0x15	/* RIO 1-16 */
++#define		ISPR2HST_FPOST		0x16	/* Low 16 bits fast post */
++#define		ISPR2HST_FPOST_CTIO	0x17	/* Low 16 bits fast post ctio */
++
++#define	DFIFO_COMMAND	(BIU_BLOCK+0x60)	/* RW : Command FIFO Port */
++#define		RDMA2100_CONTROL	DFIFO_COMMAND
++#define	DFIFO_DATA	(BIU_BLOCK+0x62)	/* RW : Data FIFO Port */
++
++/*
++ * Putzed DMA register layouts.
++ */
++#define	CDMA_CONF	(DMA_BLOCK+0x20)	/* RW*: DMA Configuration */
++#define		CDMA2100_CONTROL	CDMA_CONF
++#define	CDMA_CONTROL	(DMA_BLOCK+0x22)	/* RW*: DMA Control */
++#define	CDMA_STATUS 	(DMA_BLOCK+0x24)	/* R  : DMA Status */
++#define	CDMA_FIFO_STS	(DMA_BLOCK+0x26)	/* R  : DMA FIFO Status */
++#define	CDMA_COUNT	(DMA_BLOCK+0x28)	/* RW*: DMA Transfer Count */
++#define	CDMA_ADDR0	(DMA_BLOCK+0x2C)	/* RW*: DMA Address, Word 0 */
++#define	CDMA_ADDR1	(DMA_BLOCK+0x2E)	/* RW*: DMA Address, Word 1 */
++#define	CDMA_ADDR2	(DMA_BLOCK+0x30)	/* RW*: DMA Address, Word 2 */
++#define	CDMA_ADDR3	(DMA_BLOCK+0x32)	/* RW*: DMA Address, Word 3 */
++
++#define	DDMA_CONF	(DMA_BLOCK+0x40)	/* RW*: DMA Configuration */
++#define		TDMA2100_CONTROL	DDMA_CONF
++#define	DDMA_CONTROL	(DMA_BLOCK+0x42)	/* RW*: DMA Control */
++#define	DDMA_STATUS	(DMA_BLOCK+0x44)	/* R  : DMA Status */
++#define	DDMA_FIFO_STS	(DMA_BLOCK+0x46)	/* R  : DMA FIFO Status */
++#define	DDMA_COUNT_LO	(DMA_BLOCK+0x48)	/* RW*: DMA Xfer Count, Low */
++#define	DDMA_COUNT_HI	(DMA_BLOCK+0x4A)	/* RW*: DMA Xfer Count, High */
++#define	DDMA_ADDR0	(DMA_BLOCK+0x4C)	/* RW*: DMA Address, Word 0 */
++#define	DDMA_ADDR1	(DMA_BLOCK+0x4E)	/* RW*: DMA Address, Word 1 */
++/* these are for the 1040A cards */
++#define	DDMA_ADDR2	(DMA_BLOCK+0x50)	/* RW*: DMA Address, Word 2 */
++#define	DDMA_ADDR3	(DMA_BLOCK+0x52)	/* RW*: DMA Address, Word 3 */
++
++
++/*
++ * Bus Interface Block Register Definitions
++ */
++/* BUS CONFIGURATION REGISTER #0 */
++#define	BIU_CONF0_HW_MASK		0x000F	/* Hardware revision mask */
++/* BUS CONFIGURATION REGISTER #1 */
++
++#define	BIU_SBUS_CONF1_PARITY		0x0100 	/* Enable parity checking */
++#define	BIU_SBUS_CONF1_FCODE_MASK	0x00F0	/* Fcode cycle mask */
++
++#define	BIU_PCI_CONF1_FIFO_128		0x0040	/* 128 bytes FIFO threshold */
++#define	BIU_PCI_CONF1_FIFO_64		0x0030	/* 64 bytes FIFO threshold */
++#define	BIU_PCI_CONF1_FIFO_32		0x0020	/* 32 bytes FIFO threshold */
++#define	BIU_PCI_CONF1_FIFO_16		0x0010	/* 16 bytes FIFO threshold */
++#define	BIU_BURST_ENABLE		0x0004	/* Global enable Bus bursts */
++#define	BIU_SBUS_CONF1_FIFO_64		0x0003	/* 64 bytes FIFO threshold */
++#define	BIU_SBUS_CONF1_FIFO_32		0x0002	/* 32 bytes FIFO threshold */
++#define	BIU_SBUS_CONF1_FIFO_16		0x0001	/* 16 bytes FIFO threshold */
++#define	BIU_SBUS_CONF1_FIFO_8		0x0000	/* 8 bytes FIFO threshold */
++#define	BIU_SBUS_CONF1_BURST8		0x0008 	/* Enable 8-byte  bursts */
++#define	BIU_PCI_CONF1_SXP		0x0008	/* SXP register select */
++
++#define	BIU_PCI1080_CONF1_SXP0		0x0100	/* SXP bank #1 select */
++#define	BIU_PCI1080_CONF1_SXP1		0x0200	/* SXP bank #2 select */
++#define	BIU_PCI1080_CONF1_DMA		0x0300	/* DMA bank select */
++
++/* ISP2100 Bus Control/Status Register */
++
++#define	BIU2100_ICSR_REGBSEL		0x30	/* RW: register bank select */
++#define		BIU2100_RISC_REGS	(0 << 4)	/* RISC Regs */
++#define		BIU2100_FB_REGS		(1 << 4)	/* FrameBuffer Regs */
++#define		BIU2100_FPM0_REGS	(2 << 4)	/* FPM 0 Regs */
++#define		BIU2100_FPM1_REGS	(3 << 4)	/* FPM 1 Regs */
++#define	BIU2100_PCI64			0x04	/*  R: 64 Bit PCI slot */
++#define	BIU2100_FLASH_ENABLE		0x02	/* RW: Enable Flash RAM */
++#define	BIU2100_SOFT_RESET		0x01
++/* SOFT RESET FOR ISP2100 is same bit, but in this register, not ICR */
++
++
++/* BUS CONTROL REGISTER */
++#define	BIU_ICR_ENABLE_DMA_INT		0x0020	/* Enable DMA interrupts */
++#define	BIU_ICR_ENABLE_CDMA_INT		0x0010	/* Enable CDMA interrupts */
++#define	BIU_ICR_ENABLE_SXP_INT		0x0008	/* Enable SXP interrupts */
++#define	BIU_ICR_ENABLE_RISC_INT		0x0004	/* Enable Risc interrupts */
++#define	BIU_ICR_ENABLE_ALL_INTS		0x0002	/* Global enable all inter */
++#define	BIU_ICR_SOFT_RESET		0x0001	/* Soft Reset of ISP */
++
++#define	BIU2100_ICR_ENABLE_ALL_INTS	0x8000
++#define	BIU2100_ICR_ENA_FPM_INT		0x0020
++#define	BIU2100_ICR_ENA_FB_INT		0x0010
++#define	BIU2100_ICR_ENA_RISC_INT	0x0008
++#define	BIU2100_ICR_ENA_CDMA_INT	0x0004
++#define	BIU2100_ICR_ENABLE_RXDMA_INT	0x0002
++#define	BIU2100_ICR_ENABLE_TXDMA_INT	0x0001
++#define	BIU2100_ICR_DISABLE_ALL_INTS	0x0000
++
++#define	ENABLE_INTS(isp)	(IS_SCSI(isp))?  \
++ ISP_WRITE(isp, BIU_ICR, BIU_ICR_ENABLE_RISC_INT | BIU_ICR_ENABLE_ALL_INTS) : \
++ ISP_WRITE(isp, BIU_ICR, BIU2100_ICR_ENA_RISC_INT | BIU2100_ICR_ENABLE_ALL_INTS)
++
++#define	INTS_ENABLED(isp)	((IS_SCSI(isp))?  \
++ (ISP_READ(isp, BIU_ICR) & (BIU_ICR_ENABLE_RISC_INT|BIU_ICR_ENABLE_ALL_INTS)) :\
++ (ISP_READ(isp, BIU_ICR) & \
++	(BIU2100_ICR_ENA_RISC_INT|BIU2100_ICR_ENABLE_ALL_INTS)))
++
++#define	DISABLE_INTS(isp)	ISP_WRITE(isp, BIU_ICR, 0)
++
++/* BUS STATUS REGISTER */
++#define	BIU_ISR_DMA_INT			0x0020	/* DMA interrupt pending */
++#define	BIU_ISR_CDMA_INT		0x0010	/* CDMA interrupt pending */
++#define	BIU_ISR_SXP_INT			0x0008	/* SXP interrupt pending */
++#define	BIU_ISR_RISC_INT		0x0004	/* Risc interrupt pending */
++#define	BIU_ISR_IPEND			0x0002	/* Global interrupt pending */
++
++#define	BIU2100_ISR_INT_PENDING		0x8000	/* Global interrupt pending */
++#define	BIU2100_ISR_FPM_INT		0x0020	/* FPM interrupt pending */
++#define	BIU2100_ISR_FB_INT		0x0010	/* FB interrupt pending */
++#define	BIU2100_ISR_RISC_INT		0x0008	/* Risc interrupt pending */
++#define	BIU2100_ISR_CDMA_INT		0x0004	/* CDMA interrupt pending */
++#define	BIU2100_ISR_RXDMA_INT_PENDING	0x0002	/* Global interrupt pending */
++#define	BIU2100_ISR_TXDMA_INT_PENDING	0x0001	/* Global interrupt pending */
++
++#define	INT_PENDING(isp, isr)	(IS_FC(isp)? \
++	((isr & BIU2100_ISR_RISC_INT) != 0) : ((isr & BIU_ISR_RISC_INT) != 0))
++
++#define	INT_PENDING_MASK(isp)	\
++	(IS_FC(isp)? BIU2100_ISR_RISC_INT: BIU_ISR_RISC_INT)
++
++/* BUS SEMAPHORE REGISTER */
++#define	BIU_SEMA_STATUS		0x0002	/* Semaphore Status Bit */
++#define	BIU_SEMA_LOCK  		0x0001	/* Semaphore Lock Bit */
++
++/* NVRAM SEMAPHORE REGISTER */
++#define	BIU_NVRAM_CLOCK		0x0001
++#define	BIU_NVRAM_SELECT	0x0002
++#define	BIU_NVRAM_DATAOUT	0x0004
++#define	BIU_NVRAM_DATAIN	0x0008
++#define		ISP_NVRAM_READ		6
++
++/* COMNMAND && DATA DMA CONFIGURATION REGISTER */
++#define	DMA_ENABLE_SXP_DMA		0x0008	/* Enable SXP to DMA Data */
++#define	DMA_ENABLE_INTS			0x0004	/* Enable interrupts to RISC */
++#define	DMA_ENABLE_BURST		0x0002	/* Enable Bus burst trans */
++#define	DMA_DMA_DIRECTION		0x0001	/*
++						 * Set DMA direction:
++						 *	0 - DMA FIFO to host
++						 *	1 - Host to DMA FIFO
++						 */
++
++/* COMMAND && DATA DMA CONTROL REGISTER */
++#define	DMA_CNTRL_SUSPEND_CHAN		0x0010	/* Suspend DMA transfer */
++#define	DMA_CNTRL_CLEAR_CHAN		0x0008	/*
++						 * Clear FIFO and DMA Channel,
++						 * reset DMA registers
++						 */
++#define	DMA_CNTRL_CLEAR_FIFO		0x0004	/* Clear DMA FIFO */
++#define	DMA_CNTRL_RESET_INT		0x0002	/* Clear DMA interrupt */
++#define	DMA_CNTRL_STROBE		0x0001	/* Start DMA transfer */
++
++/*
++ * Variants of same for 2100
++ */
++#define	DMA_CNTRL2100_CLEAR_CHAN	0x0004
++#define	DMA_CNTRL2100_RESET_INT		0x0002
++
++
++
++/* DMA STATUS REGISTER */
++#define	DMA_SBUS_STATUS_PIPE_MASK	0x00C0	/* DMA Pipeline status mask */
++#define	DMA_SBUS_STATUS_CHAN_MASK	0x0030	/* Channel status mask */
++#define	DMA_SBUS_STATUS_BUS_PARITY	0x0008	/* Parity Error on bus */
++#define	DMA_SBUS_STATUS_BUS_ERR		0x0004	/* Error Detected on bus */
++#define	DMA_SBUS_STATUS_TERM_COUNT	0x0002	/* DMA Transfer Completed */
++#define	DMA_SBUS_STATUS_INTERRUPT	0x0001	/* Enable DMA channel inter */
++
++#define	DMA_PCI_STATUS_INTERRUPT	0x8000	/* Enable DMA channel inter */
++#define	DMA_PCI_STATUS_RETRY_STAT	0x4000	/* Retry status */
++#define	DMA_PCI_STATUS_CHAN_MASK	0x3000	/* Channel status mask */
++#define	DMA_PCI_STATUS_FIFO_OVR		0x0100	/* DMA FIFO overrun cond */
++#define	DMA_PCI_STATUS_FIFO_UDR		0x0080	/* DMA FIFO underrun cond */
++#define	DMA_PCI_STATUS_BUS_ERR		0x0040	/* Error Detected on bus */
++#define	DMA_PCI_STATUS_BUS_PARITY	0x0020	/* Parity Error on bus */
++#define	DMA_PCI_STATUS_CLR_PEND		0x0010	/* DMA clear pending */
++#define	DMA_PCI_STATUS_TERM_COUNT	0x0008	/* DMA Transfer Completed */
++#define	DMA_PCI_STATUS_DMA_SUSP		0x0004	/* DMA suspended */
++#define	DMA_PCI_STATUS_PIPE_MASK	0x0003	/* DMA Pipeline status mask */
++
++/* DMA Status Register, pipeline status bits */
++#define	DMA_SBUS_PIPE_FULL		0x00C0	/* Both pipeline stages full */
++#define	DMA_SBUS_PIPE_OVERRUN		0x0080	/* Pipeline overrun */
++#define	DMA_SBUS_PIPE_STAGE1		0x0040	/*
++						 * Pipeline stage 1 Loaded,
++						 * stage 2 empty
++						 */
++#define	DMA_PCI_PIPE_FULL		0x0003	/* Both pipeline stages full */
++#define	DMA_PCI_PIPE_OVERRUN		0x0002	/* Pipeline overrun */
++#define	DMA_PCI_PIPE_STAGE1		0x0001	/*
++						 * Pipeline stage 1 Loaded,
++						 * stage 2 empty
++						 */
++#define	DMA_PIPE_EMPTY			0x0000	/* All pipeline stages empty */
++
++/* DMA Status Register, channel status bits */
++#define	DMA_SBUS_CHAN_SUSPEND	0x0030	/* Channel error or suspended */
++#define	DMA_SBUS_CHAN_TRANSFER	0x0020	/* Chan transfer in progress */
++#define	DMA_SBUS_CHAN_ACTIVE	0x0010	/* Chan trans to host active */
++#define	DMA_PCI_CHAN_TRANSFER	0x3000	/* Chan transfer in progress */
++#define	DMA_PCI_CHAN_SUSPEND	0x2000	/* Channel error or suspended */
++#define	DMA_PCI_CHAN_ACTIVE	0x1000	/* Chan trans to host active */
++#define	ISP_DMA_CHAN_IDLE	0x0000	/* Chan idle (normal comp) */
++
++
++/* DMA FIFO STATUS REGISTER */
++#define	DMA_FIFO_STATUS_OVERRUN		0x0200	/* FIFO Overrun Condition */
++#define	DMA_FIFO_STATUS_UNDERRUN	0x0100	/* FIFO Underrun Condition */
++#define	DMA_FIFO_SBUS_COUNT_MASK	0x007F	/* FIFO Byte count mask */
++#define	DMA_FIFO_PCI_COUNT_MASK		0x00FF	/* FIFO Byte count mask */
++
++/*
++ * Mailbox Block Register Offsets
++ */
++
++#define	INMAILBOX0	(MBOX_BLOCK+0x0)
++#define	INMAILBOX1	(MBOX_BLOCK+0x2)
++#define	INMAILBOX2	(MBOX_BLOCK+0x4)
++#define	INMAILBOX3	(MBOX_BLOCK+0x6)
++#define	INMAILBOX4	(MBOX_BLOCK+0x8)
++#define	INMAILBOX5	(MBOX_BLOCK+0xA)
++#define	INMAILBOX6	(MBOX_BLOCK+0xC)
++#define	INMAILBOX7	(MBOX_BLOCK+0xE)
++
++#define	OUTMAILBOX0	(MBOX_BLOCK+0x0)
++#define	OUTMAILBOX1	(MBOX_BLOCK+0x2)
++#define	OUTMAILBOX2	(MBOX_BLOCK+0x4)
++#define	OUTMAILBOX3	(MBOX_BLOCK+0x6)
++#define	OUTMAILBOX4	(MBOX_BLOCK+0x8)
++#define	OUTMAILBOX5	(MBOX_BLOCK+0xA)
++#define	OUTMAILBOX6	(MBOX_BLOCK+0xC)
++#define	OUTMAILBOX7	(MBOX_BLOCK+0xE)
++
++#define	MBOX_OFF(n)	(MBOX_BLOCK + ((n) << 1))
++#define	NMBOX(isp)	\
++	(((((isp)->isp_type & ISP_HA_SCSI) >= ISP_HA_SCSI_1040A) || \
++	 ((isp)->isp_type & ISP_HA_FC))? 8 : 6)
++#define	NMBOX_BMASK(isp)	\
++	(((((isp)->isp_type & ISP_HA_SCSI) >= ISP_HA_SCSI_1040A) || \
++	 ((isp)->isp_type & ISP_HA_FC))? 0xff : 0x3f)
++
++#define	MAX_MAILBOX	8
++
++/*
++ * Fibre Protocol Module and Frame Buffer Register Offsets/Definitions (2X00).
++ * NB: The RISC processor must be paused and the appropriate register
++ * bank selected via BIU2100_CSR bits.
++ */
++
++#define	FPM_DIAG_CONFIG	(BIU_BLOCK + 0x96)
++#define		FPM_SOFT_RESET		0x0100
++
++#define	FBM_CMD		(BIU_BLOCK + 0xB8)
++#define		FBMCMD_FIFO_RESET_ALL	0xA000
++
++
++/*
++ * SXP Block Register Offsets
++ */
++#define	SXP_PART_ID	(SXP_BLOCK+0x0)		/* R  : Part ID Code */
++#define	SXP_CONFIG1	(SXP_BLOCK+0x2)		/* RW*: Configuration Reg #1 */
++#define	SXP_CONFIG2	(SXP_BLOCK+0x4)		/* RW*: Configuration Reg #2 */
++#define	SXP_CONFIG3	(SXP_BLOCK+0x6)		/* RW*: Configuration Reg #2 */
++#define	SXP_INSTRUCTION	(SXP_BLOCK+0xC)		/* RW*: Instruction Pointer */
++#define	SXP_RETURN_ADDR	(SXP_BLOCK+0x10)	/* RW*: Return Address */
++#define	SXP_COMMAND	(SXP_BLOCK+0x14)	/* RW*: Command */
++#define	SXP_INTERRUPT	(SXP_BLOCK+0x18)	/* R  : Interrupt */
++#define	SXP_SEQUENCE	(SXP_BLOCK+0x1C)	/* RW*: Sequence */
++#define	SXP_GROSS_ERR	(SXP_BLOCK+0x1E)	/* R  : Gross Error */
++#define	SXP_EXCEPTION	(SXP_BLOCK+0x20)	/* RW*: Exception Enable */
++#define	SXP_OVERRIDE	(SXP_BLOCK+0x24)	/* RW*: Override */
++#define	SXP_LIT_BASE	(SXP_BLOCK+0x28)	/* RW*: Literal Base */
++#define	SXP_USER_FLAGS	(SXP_BLOCK+0x2C)	/* RW*: User Flags */
++#define	SXP_USER_EXCEPT	(SXP_BLOCK+0x30)	/* RW*: User Exception */
++#define	SXP_BREAKPOINT	(SXP_BLOCK+0x34)	/* RW*: Breakpoint */
++#define	SXP_SCSI_ID	(SXP_BLOCK+0x40)	/* RW*: SCSI ID */
++#define	SXP_DEV_CONFIG1	(SXP_BLOCK+0x42)	/* RW*: Device Config Reg #1 */
++#define	SXP_DEV_CONFIG2	(SXP_BLOCK+0x44)	/* RW*: Device Config Reg #2 */
++#define	SXP_PHASE_PTR	(SXP_BLOCK+0x48)	/* RW*: SCSI Phase Pointer */
++#define	SXP_BUF_PTR	(SXP_BLOCK+0x4C)	/* RW*: SCSI Buffer Pointer */
++#define	SXP_BUF_CTR	(SXP_BLOCK+0x50)	/* RW*: SCSI Buffer Counter */
++#define	SXP_BUFFER	(SXP_BLOCK+0x52)	/* RW*: SCSI Buffer */
++#define	SXP_BUF_BYTE	(SXP_BLOCK+0x54)	/* RW*: SCSI Buffer Byte */
++#define	SXP_BUF_WD	(SXP_BLOCK+0x56)	/* RW*: SCSI Buffer Word */
++#define	SXP_BUF_WD_TRAN	(SXP_BLOCK+0x58)	/* RW*: SCSI Buffer Wd xlate */
++#define	SXP_FIFO	(SXP_BLOCK+0x5A)	/* RW*: SCSI FIFO */
++#define	SXP_FIFO_STATUS	(SXP_BLOCK+0x5C)	/* RW*: SCSI FIFO Status */
++#define	SXP_FIFO_TOP	(SXP_BLOCK+0x5E)	/* RW*: SCSI FIFO Top Resid */
++#define	SXP_FIFO_BOTTOM	(SXP_BLOCK+0x60)	/* RW*: SCSI FIFO Bot Resid */
++#define	SXP_TRAN_REG	(SXP_BLOCK+0x64)	/* RW*: SCSI Transferr Reg */
++#define	SXP_TRAN_CNT_LO	(SXP_BLOCK+0x68)	/* RW*: SCSI Trans Count */
++#define	SXP_TRAN_CNT_HI	(SXP_BLOCK+0x6A)	/* RW*: SCSI Trans Count */
++#define	SXP_TRAN_CTR_LO	(SXP_BLOCK+0x6C)	/* RW*: SCSI Trans Counter */
++#define	SXP_TRAN_CTR_HI	(SXP_BLOCK+0x6E)	/* RW*: SCSI Trans Counter */
++#define	SXP_ARB_DATA	(SXP_BLOCK+0x70)	/* R  : SCSI Arb Data */
++#define	SXP_PINS_CTRL	(SXP_BLOCK+0x72)	/* RW*: SCSI Control Pins */
++#define	SXP_PINS_DATA	(SXP_BLOCK+0x74)	/* RW*: SCSI Data Pins */
++#define	SXP_PINS_DIFF	(SXP_BLOCK+0x76)	/* RW*: SCSI Diff Pins */
++
++/* for 1080/1280/1240 only */
++#define	SXP_BANK1_SELECT	0x100
++
++
++/* SXP CONF1 REGISTER */
++#define	SXP_CONF1_ASYNCH_SETUP		0xF000	/* Asynchronous setup time */
++#define	SXP_CONF1_SELECTION_UNIT	0x0000	/* Selection time unit */
++#define	SXP_CONF1_SELECTION_TIMEOUT	0x0600	/* Selection timeout */
++#define	SXP_CONF1_CLOCK_FACTOR		0x00E0	/* Clock factor */
++#define	SXP_CONF1_SCSI_ID		0x000F	/* SCSI id */
++
++/* SXP CONF2 REGISTER */
++#define	SXP_CONF2_DISABLE_FILTER	0x0040	/* Disable SCSI rec filters */
++#define	SXP_CONF2_REQ_ACK_PULLUPS	0x0020	/* Enable req/ack pullups */
++#define	SXP_CONF2_DATA_PULLUPS		0x0010	/* Enable data pullups */
++#define	SXP_CONF2_CONFIG_AUTOLOAD	0x0008	/* Enable dev conf auto-load */
++#define	SXP_CONF2_RESELECT		0x0002	/* Enable reselection */
++#define	SXP_CONF2_SELECT		0x0001	/* Enable selection */
++
++/* SXP INTERRUPT REGISTER */
++#define	SXP_INT_PARITY_ERR		0x8000	/* Parity error detected */
++#define	SXP_INT_GROSS_ERR		0x4000	/* Gross error detected */
++#define	SXP_INT_FUNCTION_ABORT		0x2000	/* Last cmd aborted */
++#define	SXP_INT_CONDITION_FAILED	0x1000	/* Last cond failed test */
++#define	SXP_INT_FIFO_EMPTY		0x0800	/* SCSI FIFO is empty */
++#define	SXP_INT_BUF_COUNTER_ZERO	0x0400	/* SCSI buf count == zero */
++#define	SXP_INT_XFER_ZERO		0x0200	/* SCSI trans count == zero */
++#define	SXP_INT_INT_PENDING		0x0080	/* SXP interrupt pending */
++#define	SXP_INT_CMD_RUNNING		0x0040	/* SXP is running a command */
++#define	SXP_INT_INT_RETURN_CODE		0x000F	/* Interrupt return code */
++
++
++/* SXP GROSS ERROR REGISTER */
++#define	SXP_GROSS_OFFSET_RESID		0x0040	/* Req/Ack offset not zero */
++#define	SXP_GROSS_OFFSET_UNDERFLOW	0x0020	/* Req/Ack offset underflow */
++#define	SXP_GROSS_OFFSET_OVERFLOW	0x0010	/* Req/Ack offset overflow */
++#define	SXP_GROSS_FIFO_UNDERFLOW	0x0008	/* SCSI FIFO underflow */
++#define	SXP_GROSS_FIFO_OVERFLOW		0x0004	/* SCSI FIFO overflow */
++#define	SXP_GROSS_WRITE_ERR		0x0002	/* SXP and RISC wrote to reg */
++#define	SXP_GROSS_ILLEGAL_INST		0x0001	/* Bad inst loaded into SXP */
++
++/* SXP EXCEPTION REGISTER */
++#define	SXP_EXCEPT_USER_0		0x8000	/* Enable user exception #0 */
++#define	SXP_EXCEPT_USER_1		0x4000	/* Enable user exception #1 */
++#define	PCI_SXP_EXCEPT_SCAM		0x0400	/* SCAM Selection enable */
++#define	SXP_EXCEPT_BUS_FREE		0x0200	/* Enable Bus Free det */
++#define	SXP_EXCEPT_TARGET_ATN		0x0100	/* Enable TGT mode atten det */
++#define	SXP_EXCEPT_RESELECTED		0x0080	/* Enable ReSEL exc handling */
++#define	SXP_EXCEPT_SELECTED		0x0040	/* Enable SEL exc handling */
++#define	SXP_EXCEPT_ARBITRATION		0x0020	/* Enable ARB exc handling */
++#define	SXP_EXCEPT_GROSS_ERR		0x0010	/* Enable gross error except */
++#define	SXP_EXCEPT_BUS_RESET		0x0008	/* Enable Bus Reset except */
++
++	/* SXP OVERRIDE REGISTER */
++#define	SXP_ORIDE_EXT_TRIGGER		0x8000	/* Enable external trigger */
++#define	SXP_ORIDE_STEP			0x4000	/* Enable single step mode */
++#define	SXP_ORIDE_BREAKPOINT		0x2000	/* Enable breakpoint reg */
++#define	SXP_ORIDE_PIN_WRITE		0x1000	/* Enable write to SCSI pins */
++#define	SXP_ORIDE_FORCE_OUTPUTS		0x0800	/* Force SCSI outputs on */
++#define	SXP_ORIDE_LOOPBACK		0x0400	/* Enable SCSI loopback mode */
++#define	SXP_ORIDE_PARITY_TEST		0x0200	/* Enable parity test mode */
++#define	SXP_ORIDE_TRISTATE_ENA_PINS	0x0100	/* Tristate SCSI enable pins */
++#define	SXP_ORIDE_TRISTATE_PINS		0x0080	/* Tristate SCSI pins */
++#define	SXP_ORIDE_FIFO_RESET		0x0008	/* Reset SCSI FIFO */
++#define	SXP_ORIDE_CMD_TERMINATE		0x0004	/* Terminate cur SXP com */
++#define	SXP_ORIDE_RESET_REG		0x0002	/* Reset SXP registers */
++#define	SXP_ORIDE_RESET_MODULE		0x0001	/* Reset SXP module */
++
++/* SXP COMMANDS */
++#define	SXP_RESET_BUS_CMD		0x300b
++
++/* SXP SCSI ID REGISTER */
++#define	SXP_SELECTING_ID		0x0F00	/* (Re)Selecting id */
++#define	SXP_SELECT_ID			0x000F	/* Select id */
++
++/* SXP DEV CONFIG1 REGISTER */
++#define	SXP_DCONF1_SYNC_HOLD		0x7000	/* Synchronous data hold */
++#define	SXP_DCONF1_SYNC_SETUP		0x0F00	/* Synchronous data setup */
++#define	SXP_DCONF1_SYNC_OFFSET		0x000F	/* Synchronous data offset */
++
++
++/* SXP DEV CONFIG2 REGISTER */
++#define	SXP_DCONF2_FLAGS_MASK		0xF000	/* Device flags */
++#define	SXP_DCONF2_WIDE			0x0400	/* Enable wide SCSI */
++#define	SXP_DCONF2_PARITY		0x0200	/* Enable parity checking */
++#define	SXP_DCONF2_BLOCK_MODE		0x0100	/* Enable blk mode xfr count */
++#define	SXP_DCONF2_ASSERTION_MASK	0x0007	/* Assersion period mask */
++
++
++/* SXP PHASE POINTER REGISTER */
++#define	SXP_PHASE_STATUS_PTR		0x1000	/* Status buffer offset */
++#define	SXP_PHASE_MSG_IN_PTR		0x0700	/* Msg in buffer offset */
++#define	SXP_PHASE_COM_PTR		0x00F0	/* Command buffer offset */
++#define	SXP_PHASE_MSG_OUT_PTR		0x0007	/* Msg out buffer offset */
++
++
++/* SXP FIFO STATUS REGISTER */
++#define	SXP_FIFO_TOP_RESID		0x8000	/* Top residue reg full */
++#define	SXP_FIFO_ACK_RESID		0x4000	/* Wide transfers odd resid */
++#define	SXP_FIFO_COUNT_MASK		0x001C	/* Words in SXP FIFO */
++#define	SXP_FIFO_BOTTOM_RESID		0x0001	/* Bottom residue reg full */
++
++
++/* SXP CONTROL PINS REGISTER */
++#define	SXP_PINS_CON_PHASE		0x8000	/* Scsi phase valid */
++#define	SXP_PINS_CON_PARITY_HI		0x0400	/* Parity pin */
++#define	SXP_PINS_CON_PARITY_LO		0x0200	/* Parity pin */
++#define	SXP_PINS_CON_REQ		0x0100	/* SCSI bus REQUEST */
++#define	SXP_PINS_CON_ACK		0x0080	/* SCSI bus ACKNOWLEDGE */
++#define	SXP_PINS_CON_RST		0x0040	/* SCSI bus RESET */
++#define	SXP_PINS_CON_BSY		0x0020	/* SCSI bus BUSY */
++#define	SXP_PINS_CON_SEL		0x0010	/* SCSI bus SELECT */
++#define	SXP_PINS_CON_ATN		0x0008	/* SCSI bus ATTENTION */
++#define	SXP_PINS_CON_MSG		0x0004	/* SCSI bus MESSAGE */
++#define	SXP_PINS_CON_CD 		0x0002	/* SCSI bus COMMAND */
++#define	SXP_PINS_CON_IO 		0x0001	/* SCSI bus INPUT */
++
++/*
++ * Set the hold time for the SCSI Bus Reset to be 250 ms
++ */
++#define	SXP_SCSI_BUS_RESET_HOLD_TIME	250
++
++/* SXP DIFF PINS REGISTER */
++#define	SXP_PINS_DIFF_SENSE		0x0200	/* DIFFSENS sig on SCSI bus */
++#define	SXP_PINS_DIFF_MODE		0x0100	/* DIFFM signal */
++#define	SXP_PINS_DIFF_ENABLE_OUTPUT	0x0080	/* Enable SXP SCSI data drv */
++#define	SXP_PINS_DIFF_PINS_MASK		0x007C	/* Differential control pins */
++#define	SXP_PINS_DIFF_TARGET		0x0002	/* Enable SXP target mode */
++#define	SXP_PINS_DIFF_INITIATOR		0x0001	/* Enable SXP initiator mode */
++
++/* Ultra2 only */
++#define	SXP_PINS_LVD_MODE		0x1000
++#define	SXP_PINS_HVD_MODE		0x0800
++#define	SXP_PINS_SE_MODE		0x0400
++
++/* The above have to be put together with the DIFFM pin to make sense */
++#define	ISP1080_LVD_MODE		(SXP_PINS_LVD_MODE)
++#define	ISP1080_HVD_MODE		(SXP_PINS_HVD_MODE|SXP_PINS_DIFF_MODE)
++#define	ISP1080_SE_MODE			(SXP_PINS_SE_MODE)
++#define	ISP1080_MODE_MASK	\
++    (SXP_PINS_LVD_MODE|SXP_PINS_HVD_MODE|SXP_PINS_SE_MODE|SXP_PINS_DIFF_MODE)
++
++/*
++ * RISC and Host Command and Control Block Register Offsets
++ */
++
++#define	RISC_ACC	RISC_BLOCK+0x0	/* RW*: Accumulator */
++#define	RISC_R1		RISC_BLOCK+0x2	/* RW*: GP Reg R1  */
++#define	RISC_R2		RISC_BLOCK+0x4	/* RW*: GP Reg R2  */
++#define	RISC_R3		RISC_BLOCK+0x6	/* RW*: GP Reg R3  */
++#define	RISC_R4		RISC_BLOCK+0x8	/* RW*: GP Reg R4  */
++#define	RISC_R5		RISC_BLOCK+0xA	/* RW*: GP Reg R5  */
++#define	RISC_R6		RISC_BLOCK+0xC	/* RW*: GP Reg R6  */
++#define	RISC_R7		RISC_BLOCK+0xE	/* RW*: GP Reg R7  */
++#define	RISC_R8		RISC_BLOCK+0x10	/* RW*: GP Reg R8  */
++#define	RISC_R9		RISC_BLOCK+0x12	/* RW*: GP Reg R9  */
++#define	RISC_R10	RISC_BLOCK+0x14	/* RW*: GP Reg R10 */
++#define	RISC_R11	RISC_BLOCK+0x16	/* RW*: GP Reg R11 */
++#define	RISC_R12	RISC_BLOCK+0x18	/* RW*: GP Reg R12 */
++#define	RISC_R13	RISC_BLOCK+0x1a	/* RW*: GP Reg R13 */
++#define	RISC_R14	RISC_BLOCK+0x1c	/* RW*: GP Reg R14 */
++#define	RISC_R15	RISC_BLOCK+0x1e	/* RW*: GP Reg R15 */
++#define	RISC_PSR	RISC_BLOCK+0x20	/* RW*: Processor Status */
++#define	RISC_IVR	RISC_BLOCK+0x22	/* RW*: Interrupt Vector */
++#define	RISC_PCR	RISC_BLOCK+0x24	/* RW*: Processor Ctrl */
++#define	RISC_RAR0	RISC_BLOCK+0x26	/* RW*: Ram Address #0 */
++#define	RISC_RAR1	RISC_BLOCK+0x28	/* RW*: Ram Address #1 */
++#define	RISC_LCR	RISC_BLOCK+0x2a	/* RW*: Loop Counter */
++#define	RISC_PC		RISC_BLOCK+0x2c	/* R  : Program Counter */
++#define	RISC_MTR	RISC_BLOCK+0x2e	/* RW*: Memory Timing */
++#define		RISC_MTR2100	RISC_BLOCK+0x30
++
++#define	RISC_EMB	RISC_BLOCK+0x30	/* RW*: Ext Mem Boundary */
++#define		DUAL_BANK	8
++#define	RISC_SP		RISC_BLOCK+0x32	/* RW*: Stack Pointer */
++#define	RISC_HRL	RISC_BLOCK+0x3e	/* R *: Hardware Rev Level */
++#define	HCCR		RISC_BLOCK+0x40	/* RW : Host Command & Ctrl */
++#define	BP0		RISC_BLOCK+0x42	/* RW : Processor Brkpt #0 */
++#define	BP1		RISC_BLOCK+0x44	/* RW : Processor Brkpt #1 */
++#define	TCR		RISC_BLOCK+0x46	/*  W : Test Control */
++#define	TMR		RISC_BLOCK+0x48	/*  W : Test Mode */
++
++
++/* PROCESSOR STATUS REGISTER */
++#define	RISC_PSR_FORCE_TRUE		0x8000
++#define	RISC_PSR_LOOP_COUNT_DONE	0x4000
++#define	RISC_PSR_RISC_INT		0x2000
++#define	RISC_PSR_TIMER_ROLLOVER		0x1000
++#define	RISC_PSR_ALU_OVERFLOW		0x0800
++#define	RISC_PSR_ALU_MSB		0x0400
++#define	RISC_PSR_ALU_CARRY		0x0200
++#define	RISC_PSR_ALU_ZERO		0x0100
++
++#define	RISC_PSR_PCI_ULTRA		0x0080
++#define	RISC_PSR_SBUS_ULTRA		0x0020
++
++#define	RISC_PSR_DMA_INT		0x0010
++#define	RISC_PSR_SXP_INT		0x0008
++#define	RISC_PSR_HOST_INT		0x0004
++#define	RISC_PSR_INT_PENDING		0x0002
++#define	RISC_PSR_FORCE_FALSE  		0x0001
++
++
++/* Host Command and Control */
++#define	HCCR_CMD_NOP			0x0000	/* NOP */
++#define	HCCR_CMD_RESET			0x1000	/* Reset RISC */
++#define	HCCR_CMD_PAUSE			0x2000	/* Pause RISC */
++#define	HCCR_CMD_RELEASE		0x3000	/* Release Paused RISC */
++#define	HCCR_CMD_STEP			0x4000	/* Single Step RISC */
++#define	HCCR_2X00_DISABLE_PARITY_PAUSE	0x4001	/*
++						 * Disable RISC pause on FPM
++						 * parity error.
++						 */
++#define	HCCR_CMD_SET_HOST_INT		0x5000	/* Set Host Interrupt */
++#define	HCCR_CMD_CLEAR_HOST_INT		0x6000	/* Clear Host Interrupt */
++#define	HCCR_CMD_CLEAR_RISC_INT		0x7000	/* Clear RISC interrupt */
++#define	HCCR_CMD_BREAKPOINT		0x8000	/* Change breakpoint enables */
++#define	PCI_HCCR_CMD_BIOS		0x9000	/* Write BIOS (disable) */
++#define	PCI_HCCR_CMD_PARITY		0xA000	/* Write parity enable */
++#define	PCI_HCCR_CMD_PARITY_ERR		0xE000	/* Generate parity error */
++#define	HCCR_CMD_TEST_MODE		0xF000	/* Set Test Mode */
++
++#define	ISP2100_HCCR_PARITY_ENABLE_2	0x0400
++#define	ISP2100_HCCR_PARITY_ENABLE_1	0x0200
++#define	ISP2100_HCCR_PARITY_ENABLE_0	0x0100
++#define	ISP2100_HCCR_PARITY		0x0001
++
++#define	PCI_HCCR_PARITY			0x0400	/* Parity error flag */
++#define	PCI_HCCR_PARITY_ENABLE_1	0x0200	/* Parity enable bank 1 */
++#define	PCI_HCCR_PARITY_ENABLE_0	0x0100	/* Parity enable bank 0 */
++
++#define	HCCR_HOST_INT			0x0080	/* R  : Host interrupt set */
++#define	HCCR_RESET			0x0040	/* R  : reset in progress */
++#define	HCCR_PAUSE			0x0020	/* R  : RISC paused */
++
++#define	PCI_HCCR_BIOS			0x0001	/*  W : BIOS enable */
++
++/*
++ * NVRAM Definitions (PCI cards only)
++ */
++
++#define	ISPBSMX(c, byte, shift, mask)	\
++	(((c)[(byte)] >> (shift)) & (mask))
++/*
++ * Qlogic 1020/1040 NVRAM is an array of 128 bytes.
++ *
++ * Some portion of the front of this is for general host adapter properties
++ * This is followed by an array of per-target parameters, and is tailed off
++ * with a checksum xor byte at offset 127. For non-byte entities data is
++ * stored in Little Endian order.
++ */
++
++#define	ISP_NVRAM_SIZE	128
++
++#define	ISP_NVRAM_VERSION(c)			(c)[4]
++#define	ISP_NVRAM_FIFO_THRESHOLD(c)		ISPBSMX(c, 5, 0, 0x03)
++#define	ISP_NVRAM_BIOS_DISABLE(c)		ISPBSMX(c, 5, 2, 0x01)
++#define	ISP_NVRAM_HBA_ENABLE(c)			ISPBSMX(c, 5, 3, 0x01)
++#define	ISP_NVRAM_INITIATOR_ID(c)		ISPBSMX(c, 5, 4, 0x0f)
++#define	ISP_NVRAM_BUS_RESET_DELAY(c)		(c)[6]
++#define	ISP_NVRAM_BUS_RETRY_COUNT(c)		(c)[7]
++#define	ISP_NVRAM_BUS_RETRY_DELAY(c)		(c)[8]
++#define	ISP_NVRAM_ASYNC_DATA_SETUP_TIME(c)	ISPBSMX(c, 9, 0, 0x0f)
++#define	ISP_NVRAM_REQ_ACK_ACTIVE_NEGATION(c)	ISPBSMX(c, 9, 4, 0x01)
++#define	ISP_NVRAM_DATA_LINE_ACTIVE_NEGATION(c)	ISPBSMX(c, 9, 5, 0x01)
++#define	ISP_NVRAM_DATA_DMA_BURST_ENABLE(c)	ISPBSMX(c, 9, 6, 0x01)
++#define	ISP_NVRAM_CMD_DMA_BURST_ENABLE(c)	ISPBSMX(c, 9, 7, 0x01)
++#define	ISP_NVRAM_TAG_AGE_LIMIT(c)		(c)[10]
++#define	ISP_NVRAM_LOWTRM_ENABLE(c)		ISPBSMX(c, 11, 0, 0x01)
++#define	ISP_NVRAM_HITRM_ENABLE(c)		ISPBSMX(c, 11, 1, 0x01)
++#define	ISP_NVRAM_PCMC_BURST_ENABLE(c)		ISPBSMX(c, 11, 2, 0x01)
++#define	ISP_NVRAM_ENABLE_60_MHZ(c)		ISPBSMX(c, 11, 3, 0x01)
++#define	ISP_NVRAM_SCSI_RESET_DISABLE(c)		ISPBSMX(c, 11, 4, 0x01)
++#define	ISP_NVRAM_ENABLE_AUTO_TERM(c)		ISPBSMX(c, 11, 5, 0x01)
++#define	ISP_NVRAM_FIFO_THRESHOLD_128(c)		ISPBSMX(c, 11, 6, 0x01)
++#define	ISP_NVRAM_AUTO_TERM_SUPPORT(c)		ISPBSMX(c, 11, 7, 0x01)
++#define	ISP_NVRAM_SELECTION_TIMEOUT(c)		(((c)[12]) | ((c)[13] << 8))
++#define	ISP_NVRAM_MAX_QUEUE_DEPTH(c)		(((c)[14]) | ((c)[15] << 8))
++#define	ISP_NVRAM_SCSI_BUS_SIZE(c)		ISPBSMX(c, 16, 0, 0x01)
++#define	ISP_NVRAM_SCSI_BUS_TYPE(c)		ISPBSMX(c, 16, 1, 0x01)
++#define	ISP_NVRAM_ADAPTER_CLK_SPEED(c)		ISPBSMX(c, 16, 2, 0x01)
++#define	ISP_NVRAM_SOFT_TERM_SUPPORT(c)		ISPBSMX(c, 16, 3, 0x01)
++#define	ISP_NVRAM_FLASH_ONBOARD(c)		ISPBSMX(c, 16, 4, 0x01)
++#define	ISP_NVRAM_FAST_MTTR_ENABLE(c)		ISPBSMX(c, 22, 0, 0x01)
++
++#define	ISP_NVRAM_TARGOFF			28
++#define	ISP_NVARM_TARGSIZE			6
++#define	_IxT(tgt, tidx)			\
++	(ISP_NVRAM_TARGOFF + (ISP_NVARM_TARGSIZE * (tgt)) + (tidx))
++#define	ISP_NVRAM_TGT_RENEG(c, t)		ISPBSMX(c, _IxT(t, 0), 0, 0x01)
++#define	ISP_NVRAM_TGT_QFRZ(c, t)		ISPBSMX(c, _IxT(t, 0), 1, 0x01)
++#define	ISP_NVRAM_TGT_ARQ(c, t)			ISPBSMX(c, _IxT(t, 0), 2, 0x01)
++#define	ISP_NVRAM_TGT_TQING(c, t)		ISPBSMX(c, _IxT(t, 0), 3, 0x01)
++#define	ISP_NVRAM_TGT_SYNC(c, t)		ISPBSMX(c, _IxT(t, 0), 4, 0x01)
++#define	ISP_NVRAM_TGT_WIDE(c, t)		ISPBSMX(c, _IxT(t, 0), 5, 0x01)
++#define	ISP_NVRAM_TGT_PARITY(c, t)		ISPBSMX(c, _IxT(t, 0), 6, 0x01)
++#define	ISP_NVRAM_TGT_DISC(c, t)		ISPBSMX(c, _IxT(t, 0), 7, 0x01)
++#define	ISP_NVRAM_TGT_EXEC_THROTTLE(c, t)	ISPBSMX(c, _IxT(t, 1), 0, 0xff)
++#define	ISP_NVRAM_TGT_SYNC_PERIOD(c, t)		ISPBSMX(c, _IxT(t, 2), 0, 0xff)
++#define	ISP_NVRAM_TGT_SYNC_OFFSET(c, t)		ISPBSMX(c, _IxT(t, 3), 0, 0x0f)
++#define	ISP_NVRAM_TGT_DEVICE_ENABLE(c, t)	ISPBSMX(c, _IxT(t, 3), 4, 0x01)
++#define	ISP_NVRAM_TGT_LUN_DISABLE(c, t)		ISPBSMX(c, _IxT(t, 3), 5, 0x01)
++
++/*
++ * Qlogic 1080/1240 NVRAM is an array of 256 bytes.
++ *
++ * Some portion of the front of this is for general host adapter properties
++ * This is followed by an array of per-target parameters, and is tailed off
++ * with a checksum xor byte at offset 256. For non-byte entities data is
++ * stored in Little Endian order.
++ */
++
++#define	ISP1080_NVRAM_SIZE	256
++
++#define	ISP1080_NVRAM_VERSION(c)		ISP_NVRAM_VERSION(c)
++
++/* Offset 5 */
++/*
++	u_int8_t bios_configuration_mode     :2;
++	u_int8_t bios_disable                :1;
++	u_int8_t selectable_scsi_boot_enable :1;
++	u_int8_t cd_rom_boot_enable          :1;
++	u_int8_t disable_loading_risc_code   :1;
++	u_int8_t enable_64bit_addressing     :1;
++	u_int8_t unused_7                    :1;
++ */
++
++/* Offsets 6, 7 */
++/*
++        u_int8_t boot_lun_number    :5;
++        u_int8_t scsi_bus_number    :1;
++        u_int8_t unused_6           :1;
++        u_int8_t unused_7           :1;
++        u_int8_t boot_target_number :4;
++        u_int8_t unused_12          :1;
++        u_int8_t unused_13          :1;
++        u_int8_t unused_14          :1;
++        u_int8_t unused_15          :1;
++ */
++
++#define	ISP1080_NVRAM_HBA_ENABLE(c)			ISPBSMX(c, 16, 3, 0x01)
++
++#define	ISP1080_NVRAM_BURST_ENABLE(c)			ISPBSMX(c, 16, 1, 0x01)
++#define	ISP1080_NVRAM_FIFO_THRESHOLD(c)			ISPBSMX(c, 16, 4, 0x0f)
++
++#define	ISP1080_NVRAM_AUTO_TERM_SUPPORT(c)		ISPBSMX(c, 17, 7, 0x01)
++#define	ISP1080_NVRAM_BUS0_TERM_MODE(c)			ISPBSMX(c, 17, 0, 0x03)
++#define	ISP1080_NVRAM_BUS1_TERM_MODE(c)			ISPBSMX(c, 17, 2, 0x03)
++
++#define	ISP1080_ISP_PARAMETER(c)			\
++	(((c)[18]) | ((c)[19] << 8))
++
++#define	ISP1080_FAST_POST(c)				ISPBSMX(c, 20, 0, 0x01)
++#define	ISP1080_REPORT_LVD_TRANSITION(c)		ISPBSMX(c, 20, 1, 0x01)
++
++#define	ISP1080_BUS1_OFF				112
++
++#define	ISP1080_NVRAM_INITIATOR_ID(c, b)		\
++	ISPBSMX(c, ((b == 0)? 0 : ISP1080_BUS1_OFF) + 24, 0, 0x0f)
++#define	ISP1080_NVRAM_BUS_RESET_DELAY(c, b)		\
++	(c)[((b == 0)? 0 : ISP1080_BUS1_OFF) + 25]
++#define	ISP1080_NVRAM_BUS_RETRY_COUNT(c, b)		\
++	(c)[((b == 0)? 0 : ISP1080_BUS1_OFF) + 26]
++#define	ISP1080_NVRAM_BUS_RETRY_DELAY(c, b)		\
++	(c)[((b == 0)? 0 : ISP1080_BUS1_OFF) + 27]
++
++#define	ISP1080_NVRAM_ASYNC_DATA_SETUP_TIME(c, b)	\
++	ISPBSMX(c, ((b == 0)? 0 : ISP1080_BUS1_OFF) + 28, 0, 0x0f)
++#define	ISP1080_NVRAM_REQ_ACK_ACTIVE_NEGATION(c, b)	\
++	ISPBSMX(c, ((b == 0)? 0 : ISP1080_BUS1_OFF) + 28, 4, 0x01)
++#define	ISP1080_NVRAM_DATA_LINE_ACTIVE_NEGATION(c, b)	\
++	ISPBSMX(c, ((b == 0)? 0 : ISP1080_BUS1_OFF) + 28, 5, 0x01)
++#define	ISP1080_NVRAM_SELECTION_TIMEOUT(c, b)		\
++	(((c)[((b == 0)? 0 : ISP1080_BUS1_OFF) + 30]) | \
++	((c)[((b == 0)? 0 : ISP1080_BUS1_OFF) + 31] << 8))
++#define	ISP1080_NVRAM_MAX_QUEUE_DEPTH(c, b)		\
++	(((c)[((b == 0)? 0 : ISP1080_BUS1_OFF) + 32]) | \
++	((c)[((b == 0)? 0 : ISP1080_BUS1_OFF) + 33] << 8))
++
++#define	ISP1080_NVRAM_TARGOFF(b)		\
++	((b == 0)? 40: (40 + ISP1080_BUS1_OFF))
++#define	ISP1080_NVRAM_TARGSIZE			6
++#define	_IxT8(tgt, tidx, b)			\
++	(ISP1080_NVRAM_TARGOFF((b)) + (ISP1080_NVRAM_TARGSIZE * (tgt)) + (tidx))
++
++#define	ISP1080_NVRAM_TGT_RENEG(c, t, b)		\
++	ISPBSMX(c, _IxT8(t, 0, (b)), 0, 0x01)
++#define	ISP1080_NVRAM_TGT_QFRZ(c, t, b)			\
++	ISPBSMX(c, _IxT8(t, 0, (b)), 1, 0x01)
++#define	ISP1080_NVRAM_TGT_ARQ(c, t, b)			\
++	ISPBSMX(c, _IxT8(t, 0, (b)), 2, 0x01)
++#define	ISP1080_NVRAM_TGT_TQING(c, t, b)		\
++	ISPBSMX(c, _IxT8(t, 0, (b)), 3, 0x01)
++#define	ISP1080_NVRAM_TGT_SYNC(c, t, b)			\
++	ISPBSMX(c, _IxT8(t, 0, (b)), 4, 0x01)
++#define	ISP1080_NVRAM_TGT_WIDE(c, t, b)			\
++	ISPBSMX(c, _IxT8(t, 0, (b)), 5, 0x01)
++#define	ISP1080_NVRAM_TGT_PARITY(c, t, b)		\
++	ISPBSMX(c, _IxT8(t, 0, (b)), 6, 0x01)
++#define	ISP1080_NVRAM_TGT_DISC(c, t, b)			\
++	ISPBSMX(c, _IxT8(t, 0, (b)), 7, 0x01)
++#define	ISP1080_NVRAM_TGT_EXEC_THROTTLE(c, t, b)	\
++	ISPBSMX(c, _IxT8(t, 1, (b)), 0, 0xff)
++#define	ISP1080_NVRAM_TGT_SYNC_PERIOD(c, t, b)		\
++	ISPBSMX(c, _IxT8(t, 2, (b)), 0, 0xff)
++#define	ISP1080_NVRAM_TGT_SYNC_OFFSET(c, t, b)		\
++	ISPBSMX(c, _IxT8(t, 3, (b)), 0, 0x0f)
++#define	ISP1080_NVRAM_TGT_DEVICE_ENABLE(c, t, b)	\
++	ISPBSMX(c, _IxT8(t, 3, (b)), 4, 0x01)
++#define	ISP1080_NVRAM_TGT_LUN_DISABLE(c, t, b)		\
++	ISPBSMX(c, _IxT8(t, 3, (b)), 5, 0x01)
++
++#define	ISP12160_NVRAM_HBA_ENABLE	ISP1080_NVRAM_HBA_ENABLE
++#define	ISP12160_NVRAM_BURST_ENABLE	ISP1080_NVRAM_BURST_ENABLE
++#define	ISP12160_NVRAM_FIFO_THRESHOLD	ISP1080_NVRAM_FIFO_THRESHOLD
++#define	ISP12160_NVRAM_AUTO_TERM_SUPPORT	ISP1080_NVRAM_AUTO_TERM_SUPPORT
++#define	ISP12160_NVRAM_BUS0_TERM_MODE	ISP1080_NVRAM_BUS0_TERM_MODE
++#define	ISP12160_NVRAM_BUS1_TERM_MODE	ISP1080_NVRAM_BUS1_TERM_MODE
++#define	ISP12160_ISP_PARAMETER		ISP12160_ISP_PARAMETER
++#define	ISP12160_FAST_POST		ISP1080_FAST_POST
++#define	ISP12160_REPORT_LVD_TRANSITION	ISP1080_REPORT_LVD_TRANSTION
++
++#define	ISP12160_NVRAM_INITIATOR_ID			\
++	ISP1080_NVRAM_INITIATOR_ID
++#define	ISP12160_NVRAM_BUS_RESET_DELAY			\
++	ISP1080_NVRAM_BUS_RESET_DELAY
++#define	ISP12160_NVRAM_BUS_RETRY_COUNT			\
++	ISP1080_NVRAM_BUS_RETRY_COUNT
++#define	ISP12160_NVRAM_BUS_RETRY_DELAY			\
++	ISP1080_NVRAM_BUS_RETRY_DELAY
++#define	ISP12160_NVRAM_ASYNC_DATA_SETUP_TIME		\
++	ISP1080_NVRAM_ASYNC_DATA_SETUP_TIME
++#define	ISP12160_NVRAM_REQ_ACK_ACTIVE_NEGATION		\
++	ISP1080_NVRAM_REQ_ACK_ACTIVE_NEGATION
++#define	ISP12160_NVRAM_DATA_LINE_ACTIVE_NEGATION	\
++	ISP1080_NVRAM_DATA_LINE_ACTIVE_NEGATION
++#define	ISP12160_NVRAM_SELECTION_TIMEOUT		\
++	ISP1080_NVRAM_SELECTION_TIMEOUT
++#define	ISP12160_NVRAM_MAX_QUEUE_DEPTH			\
++	ISP1080_NVRAM_MAX_QUEUE_DEPTH
++
++
++#define	ISP12160_BUS0_OFF	24
++#define	ISP12160_BUS1_OFF	136
++
++#define	ISP12160_NVRAM_TARGOFF(b)		\
++	(((b == 0)? ISP12160_BUS0_OFF : ISP12160_BUS1_OFF) + 16)
++
++#define	ISP12160_NVRAM_TARGSIZE			6
++#define	_IxT16(tgt, tidx, b)			\
++	(ISP12160_NVRAM_TARGOFF((b))+(ISP12160_NVRAM_TARGSIZE * (tgt))+(tidx))
++
++#define	ISP12160_NVRAM_TGT_RENEG(c, t, b)		\
++	ISPBSMX(c, _IxT16(t, 0, (b)), 0, 0x01)
++#define	ISP12160_NVRAM_TGT_QFRZ(c, t, b)		\
++	ISPBSMX(c, _IxT16(t, 0, (b)), 1, 0x01)
++#define	ISP12160_NVRAM_TGT_ARQ(c, t, b)			\
++	ISPBSMX(c, _IxT16(t, 0, (b)), 2, 0x01)
++#define	ISP12160_NVRAM_TGT_TQING(c, t, b)		\
++	ISPBSMX(c, _IxT16(t, 0, (b)), 3, 0x01)
++#define	ISP12160_NVRAM_TGT_SYNC(c, t, b)		\
++	ISPBSMX(c, _IxT16(t, 0, (b)), 4, 0x01)
++#define	ISP12160_NVRAM_TGT_WIDE(c, t, b)		\
++	ISPBSMX(c, _IxT16(t, 0, (b)), 5, 0x01)
++#define	ISP12160_NVRAM_TGT_PARITY(c, t, b)		\
++	ISPBSMX(c, _IxT16(t, 0, (b)), 6, 0x01)
++#define	ISP12160_NVRAM_TGT_DISC(c, t, b)		\
++	ISPBSMX(c, _IxT16(t, 0, (b)), 7, 0x01)
++
++#define	ISP12160_NVRAM_TGT_EXEC_THROTTLE(c, t, b)	\
++	ISPBSMX(c, _IxT16(t, 1, (b)), 0, 0xff)
++#define	ISP12160_NVRAM_TGT_SYNC_PERIOD(c, t, b)		\
++	ISPBSMX(c, _IxT16(t, 2, (b)), 0, 0xff)
++
++#define	ISP12160_NVRAM_TGT_SYNC_OFFSET(c, t, b)		\
++	ISPBSMX(c, _IxT16(t, 3, (b)), 0, 0x1f)
++#define	ISP12160_NVRAM_TGT_DEVICE_ENABLE(c, t, b)	\
++	ISPBSMX(c, _IxT16(t, 3, (b)), 5, 0x01)
++
++#define	ISP12160_NVRAM_PPR_OPTIONS(c, t, b)		\
++	ISPBSMX(c, _IxT16(t, 4, (b)), 0, 0x0f)
++#define	ISP12160_NVRAM_PPR_WIDTH(c, t, b)		\
++	ISPBSMX(c, _IxT16(t, 4, (b)), 4, 0x03)
++#define	ISP12160_NVRAM_PPR_ENABLE(c, t, b)		\
++	ISPBSMX(c, _IxT16(t, 4, (b)), 7, 0x01)
++
++/*
++ * Qlogic 2XXX NVRAM is an array of 256 bytes.
++ *
++ * Some portion of the front of this is for general RISC engine parameters,
++ * mostly reflecting the state of the last INITIALIZE FIRMWARE mailbox command.
++ *
++ * This is followed by some general host adapter parameters, and ends with
++ * a checksum xor byte at offset 255. For non-byte entities data is stored
++ * in Little Endian order.
++ */
++#define	ISP2100_NVRAM_SIZE	256
++/* ISP_NVRAM_VERSION is in same overall place */
++#define	ISP2100_NVRAM_RISCVER(c)		(c)[6]
++#define	ISP2100_NVRAM_OPTIONS(c)		(c)[8]
++#define	ISP2100_NVRAM_MAXFRAMELENGTH(c)		(((c)[10]) | ((c)[11] << 8))
++#define	ISP2100_NVRAM_MAXIOCBALLOCATION(c)	(((c)[12]) | ((c)[13] << 8))
++#define	ISP2100_NVRAM_EXECUTION_THROTTLE(c)	(((c)[14]) | ((c)[15] << 8))
++#define	ISP2100_NVRAM_RETRY_COUNT(c)		(c)[16]
++#define	ISP2100_NVRAM_RETRY_DELAY(c)		(c)[17]
++
++#define	ISP2100_NVRAM_PORT_NAME(c)	(\
++		(((u_int64_t)(c)[18]) << 56) | \
++		(((u_int64_t)(c)[19]) << 48) | \
++		(((u_int64_t)(c)[20]) << 40) | \
++		(((u_int64_t)(c)[21]) << 32) | \
++		(((u_int64_t)(c)[22]) << 24) | \
++		(((u_int64_t)(c)[23]) << 16) | \
++		(((u_int64_t)(c)[24]) <<  8) | \
++		(((u_int64_t)(c)[25]) <<  0))
++
++#define	ISP2100_NVRAM_HARDLOOPID(c)		(c)[26]
++
++#define	ISP2200_NVRAM_NODE_NAME(c)	(\
++		(((u_int64_t)(c)[30]) << 56) | \
++		(((u_int64_t)(c)[31]) << 48) | \
++		(((u_int64_t)(c)[32]) << 40) | \
++		(((u_int64_t)(c)[33]) << 32) | \
++		(((u_int64_t)(c)[34]) << 24) | \
++		(((u_int64_t)(c)[35]) << 16) | \
++		(((u_int64_t)(c)[36]) <<  8) | \
++		(((u_int64_t)(c)[37]) <<  0))
++
++#define	ISP2100_NVRAM_HBA_OPTIONS(c)		(c)[70]
++#define	ISP2100_NVRAM_HBA_DISABLE(c)		ISPBSMX(c, 70, 0, 0x01)
++#define	ISP2100_NVRAM_BIOS_DISABLE(c)		ISPBSMX(c, 70, 1, 0x01)
++#define	ISP2100_NVRAM_LUN_DISABLE(c)		ISPBSMX(c, 70, 2, 0x01)
++#define	ISP2100_NVRAM_ENABLE_SELECT_BOOT(c)	ISPBSMX(c, 70, 3, 0x01)
++#define	ISP2100_NVRAM_DISABLE_CODELOAD(c)	ISPBSMX(c, 70, 4, 0x01)
++#define	ISP2100_NVRAM_SET_CACHELINESZ(c)	ISPBSMX(c, 70, 5, 0x01)
++
++#define	ISP2100_NVRAM_BOOT_NODE_NAME(c)	(\
++		(((u_int64_t)(c)[72]) << 56) | \
++		(((u_int64_t)(c)[73]) << 48) | \
++		(((u_int64_t)(c)[74]) << 40) | \
++		(((u_int64_t)(c)[75]) << 32) | \
++		(((u_int64_t)(c)[76]) << 24) | \
++		(((u_int64_t)(c)[77]) << 16) | \
++		(((u_int64_t)(c)[78]) <<  8) | \
++		(((u_int64_t)(c)[79]) <<  0))
++
++#define	ISP2100_NVRAM_BOOT_LUN(c)		(c)[80]
++
++#define	ISP2200_HBA_FEATURES(c)			(c)[232] | ((c)[233] << 8)
++
++/*
++ * Firmware Crash Dump
++ *
++ * QLogic needs specific information format when they look at firmware crashes.
++ *
++ * This is incredibly kernel memory consumptive (to say the least), so this
++ * code is only compiled in when needed.
++ */
++
++#define	QLA2200_RISC_IMAGE_DUMP_SIZE					\
++	(1 * sizeof (u_int16_t)) +	/* 'used' flag (also HBA type) */ \
++	(352 * sizeof (u_int16_t)) +	/* RISC registers */		\
++ 	(61440 * sizeof (u_int16_t))	/* RISC SRAM (offset 0x1000..0xffff) */
++#define	QLA2300_RISC_IMAGE_DUMP_SIZE					\
++	(1 * sizeof (u_int16_t)) +	/* 'used' flag (also HBA type) */ \
++	(464 * sizeof (u_int16_t)) +	/* RISC registers */		\
++ 	(63488 * sizeof (u_int16_t)) +	/* RISC SRAM (0x0800..0xffff) */ \
++	(4096 * sizeof (u_int16_t)) +	/* RISC SRAM (0x10000..0x10FFF) */ \
++	(61440 * sizeof (u_int16_t))	/* RISC SRAM (0x11000..0x1FFFF) */
++/* the larger of the two */
++#define	ISP_CRASH_IMAGE_SIZE	QLA2300_RISC_IMAGE_DUMP_SIZE
++#endif	/* _ISPREG_H */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp_target.c	2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,1195 @@
++/* @(#)isp_target.c 1.21 */
++/*
++ * Machine and OS Independent Target Mode Code for the Qlogic SCSI/FC adapters.
++ *
++ * Copyright (c) 1999, 2000, 2001 by Matthew Jacob
++ * All rights reserved.
++ * mjacob@feral.com
++ *
++ * 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 immediately at the beginning of the file, without modification,
++ *    this list of conditions, and the following disclaimer.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ */
++
++/*
++ * Bug fixes gratefully acknowledged from:
++ *	Oded Kedem <oded@kashya.com>
++ */
++/*
++ * Include header file appropriate for platform we're building on.
++ */
++
++#ifdef	__NetBSD__
++#include <dev/ic/isp_netbsd.h>
++#endif
++#ifdef	__FreeBSD__
++#include <dev/isp/isp_freebsd.h>
++#endif
++#ifdef	__OpenBSD__
++#include <dev/ic/isp_openbsd.h>
++#endif
++#ifdef	__linux__
++#include "isp_linux.h"
++#endif
++
++#ifdef	ISP_TARGET_MODE
++static const char atiocope[] =
++    "ATIO returned for lun %d because it was in the middle of Bus Device Reset "
++    "on bus %d";
++static const char atior[] =
++    "ATIO returned on for lun %d on from IID %d because a Bus Reset occurred "
++    "on bus %d";
++
++static void isp_got_msg(struct ispsoftc *, int, in_entry_t *);
++static void isp_got_msg_fc(struct ispsoftc *, int, in_fcentry_t *);
++static void isp_notify_ack(struct ispsoftc *, void *);
++static void isp_handle_atio(struct ispsoftc *, at_entry_t *);
++static void isp_handle_atio2(struct ispsoftc *, at2_entry_t *);
++static void isp_handle_ctio(struct ispsoftc *, ct_entry_t *);
++static void isp_handle_ctio2(struct ispsoftc *, ct2_entry_t *);
++
++/*
++ * The Qlogic driver gets an interrupt to look at response queue entries.
++ * Some of these are status completions for initiatior mode commands, but
++ * if target mode is enabled, we get a whole wad of response queue entries
++ * to be handled here.
++ *
++ * Basically the split into 3 main groups: Lun Enable/Modification responses,
++ * SCSI Command processing, and Immediate Notification events.
++ *
++ * You start by writing a request queue entry to enable target mode (and
++ * establish some resource limitations which you can modify later).
++ * The f/w responds with a LUN ENABLE or LUN MODIFY response with
++ * the status of this action. If the enable was successful, you can expect...
++ *
++ * Response queue entries with SCSI commands encapsulate show up in an ATIO
++ * (Accept Target IO) type- sometimes with enough info to stop the command at
++ * this level. Ultimately the driver has to feed back to the f/w's request
++ * queue a sequence of CTIOs (continue target I/O) that describe data to
++ * be moved and/or status to be sent) and finally finishing with sending
++ * to the f/w's response queue an ATIO which then completes the handshake
++ * with the f/w for that command. There's a lot of variations on this theme,
++ * including flags you can set in the CTIO for the Qlogic 2X00 fibre channel
++ * cards that 'auto-replenish' the f/w's ATIO count, but this is the basic
++ * gist of it.
++ *
++ * The third group that can show up in the response queue are Immediate
++ * Notification events. These include things like notifications of SCSI bus
++ * resets, or Bus Device Reset messages or other messages received. This
++ * a classic oddbins area. It can get  a little weird because you then turn
++ * around and acknowledge the Immediate Notify by writing an entry onto the
++ * request queue and then the f/w turns around and gives you an acknowledgement
++ * to *your* acknowledgement on the response queue (the idea being to let
++ * the f/w tell you when the event is *really* over I guess).
++ *
++ */
++
++
++/*
++ * A new response queue entry has arrived. The interrupt service code
++ * has already swizzled it into the platform dependent from canonical form.
++ *
++ * Because of the way this driver is designed, unfortunately most of the
++ * actual synchronization work has to be done in the platform specific
++ * code- we have no synchroniation primitives in the common code.
++ */
++
++int
++isp_target_notify(struct ispsoftc *isp, void *vptr, u_int16_t *optrp)
++{
++	u_int16_t status, seqid;
++	union {
++		at_entry_t	*atiop;
++		at2_entry_t	*at2iop;
++		ct_entry_t	*ctiop;
++		ct2_entry_t	*ct2iop;
++		lun_entry_t	*lunenp;
++		in_entry_t	*inotp;
++		in_fcentry_t	*inot_fcp;
++		na_entry_t	*nackp;
++		na_fcentry_t	*nack_fcp;
++		isphdr_t	*hp;
++		void *		*vp;
++#define	atiop		unp.atiop
++#define	at2iop		unp.at2iop
++#define	ctiop		unp.ctiop
++#define	ct2iop		unp.ct2iop
++#define	lunenp		unp.lunenp
++#define	inotp		unp.inotp
++#define	inot_fcp	unp.inot_fcp
++#define	nackp		unp.nackp
++#define	nack_fcp	unp.nack_fcp
++#define	hdrp		unp.hp
++	} unp;
++	u_int8_t local[QENTRY_LEN];
++	int bus, type, rval = 1;
++
++	type = isp_get_response_type(isp, (isphdr_t *)vptr);
++	unp.vp = vptr;
++
++	ISP_TDQE(isp, "isp_target_notify", (int) *optrp, vptr);
++
++	switch(type) {
++	case RQSTYPE_ATIO:
++		isp_get_atio(isp, atiop, (at_entry_t *) local);
++		isp_handle_atio(isp, (at_entry_t *) local);
++		break;
++	case RQSTYPE_CTIO:
++		isp_get_ctio(isp, ctiop, (ct_entry_t *) local);
++		isp_handle_ctio(isp, (ct_entry_t *) local);
++		break;
++	case RQSTYPE_ATIO2:
++		isp_get_atio2(isp, at2iop, (at2_entry_t *) local);
++		isp_handle_atio2(isp, (at2_entry_t *) local);
++		break;
++	case RQSTYPE_CTIO2:
++		isp_get_ctio2(isp, ct2iop, (ct2_entry_t *) local);
++		isp_handle_ctio2(isp, (ct2_entry_t *) local);
++		break;
++	case RQSTYPE_ENABLE_LUN:
++	case RQSTYPE_MODIFY_LUN:
++		isp_get_enable_lun(isp, lunenp, (lun_entry_t *) local);
++		(void) isp_async(isp, ISPASYNC_TARGET_ACTION, local);
++		break;
++
++	case RQSTYPE_NOTIFY:
++		/*
++		 * Either the ISP received a SCSI message it can't
++		 * handle, or it's returning an Immed. Notify entry
++		 * we sent. We can send Immed. Notify entries to
++		 * increment the firmware's resource count for them
++		 * (we set this initially in the Enable Lun entry).
++		 */
++		bus = 0;
++		if (IS_FC(isp)) {
++			isp_get_notify_fc(isp, inot_fcp, (in_fcentry_t *)local);
++			inot_fcp = (in_fcentry_t *) local;
++			status = inot_fcp->in_status;
++			seqid = inot_fcp->in_seqid;
++		} else {
++			isp_get_notify(isp, inotp, (in_entry_t *)local);
++			inotp = (in_entry_t *) local;
++			status = inotp->in_status & 0xff;
++			seqid = inotp->in_seqid;
++			if (IS_DUALBUS(isp)) {
++				bus = GET_BUS_VAL(inotp->in_iid);
++				SET_BUS_VAL(inotp->in_iid, 0);
++			}
++		}
++		isp_prt(isp, ISP_LOGTDEBUG0,
++		    "Immediate Notify On Bus %d, status=0x%x seqid=0x%x",
++		    bus, status, seqid);
++
++		/*
++		 * ACK it right away.
++		 */
++		isp_notify_ack(isp, (status == IN_RESET)? NULL : local);
++		switch (status) {
++		case IN_RESET:
++			(void) isp_async(isp, ISPASYNC_BUS_RESET, &bus);
++			break;
++		case IN_MSG_RECEIVED:
++		case IN_IDE_RECEIVED:
++			if (IS_FC(isp)) {
++				isp_got_msg_fc(isp, bus, (in_fcentry_t *)local);
++			} else {
++				isp_got_msg(isp, bus, (in_entry_t *)local);
++			}
++			break;
++		case IN_RSRC_UNAVAIL:
++			isp_prt(isp, ISP_LOGWARN, "Firmware out of ATIOs");
++			break;
++		case IN_PORT_LOGOUT:
++		case IN_ABORT_TASK:
++		case IN_PORT_CHANGED:
++		case IN_GLOBAL_LOGO:
++			(void) isp_async(isp, ISPASYNC_TARGET_ACTION, &local);
++			break;
++		default:
++			isp_prt(isp, ISP_LOGERR,
++			    "bad status (0x%x) in isp_target_notify", status);
++			break;
++		}
++		break;
++
++	case RQSTYPE_NOTIFY_ACK:
++		/*
++		 * The ISP is acknowledging our acknowledgement of an
++		 * Immediate Notify entry for some asynchronous event.
++		 */
++		if (IS_FC(isp)) {
++			isp_get_notify_ack_fc(isp, nack_fcp,
++			    (na_fcentry_t *)local);
++			nack_fcp = (na_fcentry_t *)local;
++			isp_prt(isp, ISP_LOGTDEBUG1,
++			    "Notify Ack status=0x%x seqid 0x%x",
++			    nack_fcp->na_status, nack_fcp->na_seqid);
++		} else {
++			isp_get_notify_ack(isp, nackp, (na_entry_t *)local);
++			nackp = (na_entry_t *)local;
++			isp_prt(isp, ISP_LOGTDEBUG1,
++			    "Notify Ack event 0x%x status=0x%x seqid 0x%x",
++			    nackp->na_event, nackp->na_status, nackp->na_seqid);
++		}
++		break;
++	default:
++		isp_prt(isp, ISP_LOGERR,
++		    "Unknown entry type 0x%x in isp_target_notify", type);
++		rval = 0;
++		break;
++	}
++#undef	atiop
++#undef	at2iop
++#undef	ctiop
++#undef	ct2iop
++#undef	lunenp
++#undef	inotp
++#undef	inot_fcp
++#undef	nackp
++#undef	nack_fcp
++#undef	hdrp
++	return (rval);
++}
++
++ 
++/*
++ * Toggle (on/off) target mode for bus/target/lun
++ *
++ * The caller has checked for overlap and legality.
++ *
++ * Note that not all of bus, target or lun can be paid attention to.
++ * Note also that this action will not be complete until the f/w writes
++ * response entry. The caller is responsible for synchronizing this.
++ */
++int
++isp_lun_cmd(struct ispsoftc *isp, int cmd, int bus, int tgt, int lun,
++    int cmd_cnt, int inot_cnt, u_int32_t opaque)
++{
++	lun_entry_t el;
++	u_int16_t nxti, optr;
++	void *outp;
++
++
++	MEMZERO(&el, sizeof (el));
++	if (IS_DUALBUS(isp)) {
++		el.le_rsvd = (bus & 0x1) << 7;
++	}
++	el.le_cmd_count = cmd_cnt;
++	el.le_in_count = inot_cnt;
++	if (cmd == RQSTYPE_ENABLE_LUN) {
++		if (IS_SCSI(isp)) {
++			el.le_flags = LUN_TQAE|LUN_DISAD;
++			el.le_cdb6len = 12;
++			el.le_cdb7len = 12;
++		}
++	} else if (cmd == -RQSTYPE_ENABLE_LUN) {
++		cmd = RQSTYPE_ENABLE_LUN;
++		el.le_cmd_count = 0;
++		el.le_in_count = 0;
++	} else if (cmd == -RQSTYPE_MODIFY_LUN) {
++		cmd = RQSTYPE_MODIFY_LUN;
++		el.le_ops = LUN_CCDECR | LUN_INDECR;
++	} else {
++		el.le_ops = LUN_CCINCR | LUN_ININCR;
++	}
++	el.le_header.rqs_entry_type = cmd;
++	el.le_header.rqs_entry_count = 1;
++	el.le_reserved = opaque;
++	if (IS_SCSI(isp)) {
++		el.le_tgt = tgt;
++		el.le_lun = lun;
++	} else if ((FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) == 0) {
++		el.le_lun = lun;
++	}
++	el.le_timeout = 2;
++
++	if (isp_getrqentry(isp, &nxti, &optr, &outp)) {
++		isp_prt(isp, ISP_LOGERR,
++		    "Request Queue Overflow in isp_lun_cmd");
++		return (-1);
++	}
++	ISP_TDQE(isp, "isp_lun_cmd", (int) optr, &el);
++	isp_put_enable_lun(isp, &el, outp);
++	ISP_ADD_REQUEST(isp, nxti);
++	return (0);
++}
++
++
++int
++isp_target_put_entry(struct ispsoftc *isp, void *ap)
++{
++	void *outp;
++	u_int16_t nxti, optr;
++	u_int8_t etype = ((isphdr_t *) ap)->rqs_entry_type;
++
++	if (isp_getrqentry(isp, &nxti, &optr, &outp)) {
++		isp_prt(isp, ISP_LOGWARN,
++		    "Request Queue Overflow in isp_target_put_entry");
++		return (-1);
++	}
++	switch (etype) {
++	case RQSTYPE_ATIO:
++		isp_put_atio(isp, (at_entry_t *) ap, (at_entry_t *) outp);
++		break;
++	case RQSTYPE_ATIO2:
++		isp_put_atio2(isp, (at2_entry_t *) ap, (at2_entry_t *) outp);
++		break;
++	case RQSTYPE_CTIO:
++		isp_put_ctio(isp, (ct_entry_t *) ap, (ct_entry_t *) outp);
++		break;
++	case RQSTYPE_CTIO2:
++		isp_put_ctio2(isp, (ct2_entry_t *) ap, (ct2_entry_t *) outp);
++		break;
++	default:
++		isp_prt(isp, ISP_LOGERR,
++		    "Unknown type 0x%x in isp_put_entry", etype);
++		return (-1);
++	}
++
++	ISP_TDQE(isp, "isp_target_put_entry", (int) optr, ap);
++	ISP_ADD_REQUEST(isp, nxti);
++	return (0);
++}
++
++int
++isp_target_put_atio(struct ispsoftc *isp, void *arg)
++{
++	union {
++		at_entry_t _atio;
++		at2_entry_t _atio2;
++	} atun;
++
++	MEMZERO(&atun, sizeof atun);
++	if (IS_FC(isp)) {
++		at2_entry_t *aep = arg;
++		atun._atio2.at_header.rqs_entry_type = RQSTYPE_ATIO2;
++		atun._atio2.at_header.rqs_entry_count = 1;
++		if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) {
++			atun._atio2.at_scclun = (u_int16_t) aep->at_scclun;
++		} else {
++			atun._atio2.at_lun = (u_int8_t) aep->at_lun;
++		}
++		atun._atio2.at_iid = aep->at_iid;
++		atun._atio2.at_rxid = aep->at_rxid;
++		atun._atio2.at_status = CT_OK;
++	} else {
++		at_entry_t *aep = arg;
++		atun._atio.at_header.rqs_entry_type = RQSTYPE_ATIO;
++		atun._atio.at_header.rqs_entry_count = 1;
++		atun._atio.at_handle = aep->at_handle;
++		atun._atio.at_iid = aep->at_iid;
++		atun._atio.at_tgt = aep->at_tgt;
++		atun._atio.at_lun = aep->at_lun;
++		atun._atio.at_tag_type = aep->at_tag_type;
++		atun._atio.at_tag_val = aep->at_tag_val;
++		atun._atio.at_status = (aep->at_flags & AT_TQAE);
++		atun._atio.at_status |= CT_OK;
++	}
++	return (isp_target_put_entry(isp, &atun));
++}
++
++/*
++ * Command completion- both for handling cases of no resources or
++ * no blackhole driver, or other cases where we have to, inline,
++ * finish the command sanely, or for normal command completion.
++ *
++ * The 'completion' code value has the scsi status byte in the low 8 bits.
++ * If status is a CHECK CONDITION and bit 8 is nonzero, then bits 12..15 have
++ * the sense key and  bits 16..23 have the ASCQ and bits 24..31 have the ASC
++ * values.
++ *
++ * NB: the key, asc, ascq, cannot be used for parallel SCSI as it doesn't
++ * NB: inline SCSI sense reporting. As such, we lose this information. XXX.
++ *
++ * For both parallel && fibre channel, we use the feature that does
++ * an automatic resource autoreplenish so we don't have then later do
++ * put of an atio to replenish the f/w's resource count.
++ */
++
++int
++isp_endcmd(struct ispsoftc *isp, void *arg, u_int32_t code, u_int16_t hdl)
++{
++	int sts;
++	union {
++		ct_entry_t _ctio;
++		ct2_entry_t _ctio2;
++	} un;
++
++	MEMZERO(&un, sizeof un);
++	sts = code & 0xff;
++
++	if (IS_FC(isp)) {
++		at2_entry_t *aep = arg;
++		ct2_entry_t *cto = &un._ctio2;
++
++		cto->ct_header.rqs_entry_type = RQSTYPE_CTIO2;
++		cto->ct_header.rqs_entry_count = 1;
++		cto->ct_iid = aep->at_iid;
++		if ((FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) == 0) {
++			cto->ct_lun = aep->at_lun;
++		}
++		cto->ct_rxid = aep->at_rxid;
++		cto->rsp.m1.ct_scsi_status = sts & 0xff;
++		cto->ct_flags = CT2_SENDSTATUS | CT2_NO_DATA | CT2_FLAG_MODE1;
++		if (hdl == 0) {
++			cto->ct_flags |= CT2_CCINCR;
++		}
++		if (aep->at_datalen) {
++			cto->ct_resid = aep->at_datalen;
++			cto->rsp.m1.ct_scsi_status |= CT2_DATA_UNDER;
++		}
++		if ((sts & 0xff) == SCSI_CHECK && (sts & ECMD_SVALID)) {
++			cto->rsp.m1.ct_resp[0] = 0xf0;
++			cto->rsp.m1.ct_resp[2] = (code >> 12) & 0xf;
++			cto->rsp.m1.ct_resp[7] = 8;
++			cto->rsp.m1.ct_resp[12] = (code >> 24) & 0xff;
++			cto->rsp.m1.ct_resp[13] = (code >> 16) & 0xff;
++			cto->rsp.m1.ct_senselen = 16;
++			cto->rsp.m1.ct_scsi_status |= CT2_SNSLEN_VALID;
++		}
++		cto->ct_syshandle = hdl;
++	} else {
++		at_entry_t *aep = arg;
++		ct_entry_t *cto = &un._ctio;
++
++		cto->ct_header.rqs_entry_type = RQSTYPE_CTIO;
++		cto->ct_header.rqs_entry_count = 1;
++		cto->ct_fwhandle = aep->at_handle;
++		cto->ct_iid = aep->at_iid;
++		cto->ct_tgt = aep->at_tgt;
++		cto->ct_lun = aep->at_lun;
++		cto->ct_tag_type = aep->at_tag_type;
++		cto->ct_tag_val = aep->at_tag_val;
++		if (aep->at_flags & AT_TQAE) {
++			cto->ct_flags |= CT_TQAE;
++		}
++		cto->ct_flags = CT_SENDSTATUS | CT_NO_DATA;
++		if (hdl == 0) {
++			cto->ct_flags |= CT_CCINCR;
++		}
++		cto->ct_scsi_status = sts;
++		cto->ct_syshandle = hdl;
++	}
++	return (isp_target_put_entry(isp, &un));
++}
++
++int
++isp_target_async(struct ispsoftc *isp, int bus, int event)
++{
++	tmd_event_t evt;
++	tmd_msg_t msg;
++
++	switch (event) {
++	/*
++	 * These three we handle here to propagate an effective bus reset
++	 * upstream, but these do not require any immediate notify actions
++	 * so we return when done.
++	 */
++	case ASYNC_LIP_F8:
++	case ASYNC_LIP_OCCURRED:
++	case ASYNC_LOOP_UP:
++	case ASYNC_LOOP_DOWN:
++	case ASYNC_LOOP_RESET:
++	case ASYNC_PTPMODE:
++		/*
++		 * These don't require any immediate notify actions. We used
++		 * treat them like SCSI Bus Resets, but that was just plain
++		 * wrong. Let the normal CTIO completion report what occurred.
++		 */
++                return (0);
++
++	case ASYNC_BUS_RESET:
++	case ASYNC_TIMEOUT_RESET:
++		if (IS_FC(isp)) {
++			return (0); /* we'll be getting an inotify instead */
++		}
++		evt.ev_bus = bus;
++		evt.ev_event = event;
++		(void) isp_async(isp, ISPASYNC_TARGET_EVENT, &evt);
++		break;
++	case ASYNC_DEVICE_RESET:
++		/*
++		 * Bus Device Reset resets a specific target, so
++		 * we pass this as a synthesized message.
++		 */
++		MEMZERO(&msg, sizeof msg);
++		if (IS_FC(isp)) {
++			msg.nt_iid = FCPARAM(isp)->isp_loopid;
++		} else {
++			msg.nt_iid = SDPARAM(isp)->isp_initiator_id;
++		}
++		msg.nt_bus = bus;
++		msg.nt_msg[0] = MSG_BUS_DEV_RESET;
++		(void) isp_async(isp, ISPASYNC_TARGET_MESSAGE, &msg);
++		break;
++	case ASYNC_CTIO_DONE:
++		evt.ev_bus = bus;
++		evt.ev_event = event;
++		(void) isp_async(isp, ISPASYNC_TARGET_EVENT, &evt);
++		return (0);
++	default:
++		isp_prt(isp, ISP_LOGERR,
++		    "isp_target_async: unknown event 0x%x", event);
++		break;
++	}
++	if (isp->isp_state == ISP_RUNSTATE)
++		isp_notify_ack(isp, NULL);
++	return(0);
++}
++
++
++/*
++ * Process a received message.
++ * The ISP firmware can handle most messages, there are only
++ * a few that we need to deal with:
++ * - abort: clean up the current command
++ * - abort tag and clear queue
++ */
++
++static void
++isp_got_msg(struct ispsoftc *isp, int bus, in_entry_t *inp)
++{
++	u_int8_t status = inp->in_status & ~QLTM_SVALID;
++
++	if (status == IN_IDE_RECEIVED || status == IN_MSG_RECEIVED) {
++		tmd_msg_t msg;
++
++		MEMZERO(&msg, sizeof (msg));
++		msg.nt_bus = bus;
++		msg.nt_iid = inp->in_iid;
++		msg.nt_tgt = inp->in_tgt;
++		msg.nt_lun = inp->in_lun;
++		msg.nt_tagtype = inp->in_tag_type;
++		msg.nt_tagval = inp->in_tag_val;
++		MEMCPY(msg.nt_msg, inp->in_msg, IN_MSGLEN);
++		(void) isp_async(isp, ISPASYNC_TARGET_MESSAGE, &msg);
++	} else {
++		isp_prt(isp, ISP_LOGERR,
++		    "unknown immediate notify status 0x%x", inp->in_status);
++	}
++}
++
++/*
++ * Synthesize a message from the task management flags in a FCP_CMND_IU.
++ */
++static void
++isp_got_msg_fc(struct ispsoftc *isp, int bus, in_fcentry_t *inp)
++{
++	int lun;
++	static const char f1[] = "%s from iid %d lun %d seq 0x%x";
++	static const char f2[] = 
++	    "unknown %s 0x%x lun %d iid %d task flags 0x%x seq 0x%x\n";
++
++	if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) {
++		lun = inp->in_scclun;
++	} else {
++		lun = inp->in_lun;
++	}
++
++	if (inp->in_status != IN_MSG_RECEIVED) {
++		isp_prt(isp, ISP_LOGINFO, f2, "immediate notify status",
++		    inp->in_status, lun, inp->in_iid,
++		    inp->in_task_flags,  inp->in_seqid);
++	} else {
++		tmd_msg_t msg;
++
++		MEMZERO(&msg, sizeof (msg));
++		msg.nt_bus = bus;
++		msg.nt_iid = inp->in_iid;
++		msg.nt_tagval = inp->in_seqid;
++		msg.nt_lun = lun;
++
++		if (inp->in_task_flags & TASK_FLAGS_ABORT_TASK) {
++			isp_prt(isp, ISP_LOGINFO, f1, "ABORT TASK",
++			    inp->in_iid, lun, inp->in_seqid);
++			msg.nt_msg[0] = MSG_ABORT_TAG;
++		} else if (inp->in_task_flags & TASK_FLAGS_CLEAR_TASK_SET) {
++			isp_prt(isp, ISP_LOGINFO, f1, "CLEAR TASK SET",
++			    inp->in_iid, lun, inp->in_seqid);
++			msg.nt_msg[0] = MSG_CLEAR_QUEUE;
++		} else if (inp->in_task_flags & TASK_FLAGS_TARGET_RESET) {
++			isp_prt(isp, ISP_LOGINFO, f1, "TARGET RESET",
++			    inp->in_iid, lun, inp->in_seqid);
++			msg.nt_msg[0] = MSG_BUS_DEV_RESET;
++		} else if (inp->in_task_flags & TASK_FLAGS_CLEAR_ACA) {
++			isp_prt(isp, ISP_LOGINFO, f1, "CLEAR ACA",
++			    inp->in_iid, lun, inp->in_seqid);
++			/* ???? */
++			msg.nt_msg[0] = MSG_REL_RECOVERY;
++		} else if (inp->in_task_flags & TASK_FLAGS_TERMINATE_TASK) {
++			isp_prt(isp, ISP_LOGINFO, f1, "TERMINATE TASK",
++			    inp->in_iid, lun, inp->in_seqid);
++			msg.nt_msg[0] = MSG_TERM_IO_PROC;
++		} else {
++			isp_prt(isp, ISP_LOGWARN, f2, "task flag",
++			    inp->in_status, lun, inp->in_iid,
++			    inp->in_task_flags,  inp->in_seqid);
++		}
++		if (msg.nt_msg[0]) {
++			(void) isp_async(isp, ISPASYNC_TARGET_MESSAGE, &msg);
++		}
++	}
++}
++
++static void
++isp_notify_ack(struct ispsoftc *isp, void *arg)
++{
++	char storage[QENTRY_LEN];
++	u_int16_t nxti, optr;
++	void *outp;
++
++	if (isp_getrqentry(isp, &nxti, &optr, &outp)) {
++		isp_prt(isp, ISP_LOGWARN,
++		    "Request Queue Overflow For isp_notify_ack");
++		return;
++	}
++
++	MEMZERO(storage, QENTRY_LEN);
++
++	if (IS_FC(isp)) {
++		na_fcentry_t *na = (na_fcentry_t *) storage;
++		if (arg) {
++			in_fcentry_t *inp = arg;
++			MEMCPY(storage, arg, sizeof (isphdr_t));
++			na->na_iid = inp->in_iid;
++			if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) {
++				na->na_lun = inp->in_scclun;
++			} else {
++				na->na_lun = inp->in_lun;
++			}
++			na->na_task_flags = inp->in_task_flags;
++			na->na_seqid = inp->in_seqid;
++			na->na_flags = NAFC_RCOUNT;
++			na->na_status = inp->in_status;
++			if (inp->in_status == IN_RESET) {
++				na->na_flags |= NAFC_RST_CLRD;
++			}
++		} else {
++			na->na_flags = NAFC_RST_CLRD;
++		}
++		na->na_header.rqs_entry_type = RQSTYPE_NOTIFY_ACK;
++		na->na_header.rqs_entry_count = 1;
++		isp_put_notify_ack_fc(isp, na, (na_fcentry_t *)outp);
++	} else {
++		na_entry_t *na = (na_entry_t *) storage;
++		if (arg) {
++			in_entry_t *inp = arg;
++			MEMCPY(storage, arg, sizeof (isphdr_t));
++			na->na_iid = inp->in_iid;
++			na->na_lun = inp->in_lun;
++			na->na_tgt = inp->in_tgt;
++			na->na_seqid = inp->in_seqid;
++			if (inp->in_status == IN_RESET) {
++				na->na_event = NA_RST_CLRD;
++			}
++		} else {
++			na->na_event = NA_RST_CLRD;
++		}
++		na->na_header.rqs_entry_type = RQSTYPE_NOTIFY_ACK;
++		na->na_header.rqs_entry_count = 1;
++		isp_put_notify_ack(isp, na, (na_entry_t *)outp);
++	}
++	ISP_TDQE(isp, "isp_notify_ack", (int) optr, storage);
++	ISP_ADD_REQUEST(isp, nxti);
++}
++
++static void
++isp_handle_atio(struct ispsoftc *isp, at_entry_t *aep)
++{
++	int lun;
++	lun = aep->at_lun;
++	/*
++	 * The firmware status (except for the QLTM_SVALID bit) indicates
++	 * why this ATIO was sent to us.
++	 *
++	 * If QLTM_SVALID is set, the firware has recommended Sense Data.
++	 *
++	 * If the DISCONNECTS DISABLED bit is set in the flags field,
++	 * we're still connected on the SCSI bus - i.e. the initiator
++	 * did not set DiscPriv in the identify message. We don't care
++	 * about this so it's ignored.
++	 */
++
++	switch(aep->at_status & ~QLTM_SVALID) {
++	case AT_PATH_INVALID:
++		/*
++		 * ATIO rejected by the firmware due to disabled lun.
++		 */
++		isp_prt(isp, ISP_LOGERR,
++		    "rejected ATIO for disabled lun %d", lun);
++		break;
++	case AT_NOCAP:
++		/*
++		 * Requested Capability not available
++		 * We sent an ATIO that overflowed the firmware's
++		 * command resource count.
++		 */
++		isp_prt(isp, ISP_LOGERR,
++		    "rejected ATIO for lun %d because of command count"
++		    " overflow", lun);
++		break;
++
++	case AT_BDR_MSG:
++		/*
++		 * If we send an ATIO to the firmware to increment
++		 * its command resource count, and the firmware is
++		 * recovering from a Bus Device Reset, it returns
++		 * the ATIO with this status. We set the command
++		 * resource count in the Enable Lun entry and do
++		 * not increment it. Therefore we should never get
++		 * this status here.
++		 */
++		isp_prt(isp, ISP_LOGERR, atiocope, lun,
++		    GET_BUS_VAL(aep->at_iid));
++		break;
++
++	case AT_CDB:		/* Got a CDB */
++	case AT_PHASE_ERROR:	/* Bus Phase Sequence Error */
++		/*
++		 * Punt to platform specific layer.
++		 */
++		(void) isp_async(isp, ISPASYNC_TARGET_ACTION, aep);
++		break;
++
++	case AT_RESET:
++		/*
++		 * A bus reset came along and blew away this command. Why
++		 * they do this in addition the async event code stuff,
++		 * I dunno.
++		 *
++		 * Ignore it because the async event will clear things
++		 * up for us.
++		 */
++		isp_prt(isp, ISP_LOGWARN, atior, lun,
++		    GET_IID_VAL(aep->at_iid), GET_BUS_VAL(aep->at_iid));
++		break;
++
++
++	default:
++		isp_prt(isp, ISP_LOGERR,
++		    "Unknown ATIO status 0x%x from initiator %d for lun %d",
++		    aep->at_status, aep->at_iid, lun);
++		(void) isp_target_put_atio(isp, aep);
++		break;
++	}
++}
++
++static void
++isp_handle_atio2(struct ispsoftc *isp, at2_entry_t *aep)
++{
++	int lun;
++
++	if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) {
++		lun = aep->at_scclun;
++	} else {
++		lun = aep->at_lun;
++	}
++
++	/*
++	 * The firmware status (except for the QLTM_SVALID bit) indicates
++	 * why this ATIO was sent to us.
++	 *
++	 * If QLTM_SVALID is set, the firware has recommended Sense Data.
++	 *
++	 * If the DISCONNECTS DISABLED bit is set in the flags field,
++	 * we're still connected on the SCSI bus - i.e. the initiator
++	 * did not set DiscPriv in the identify message. We don't care
++	 * about this so it's ignored.
++	 */
++
++	switch(aep->at_status & ~QLTM_SVALID) {
++	case AT_PATH_INVALID:
++		/*
++		 * ATIO rejected by the firmware due to disabled lun.
++		 */
++		isp_prt(isp, ISP_LOGERR,
++		    "rejected ATIO2 for disabled lun %d", lun);
++		break;
++	case AT_NOCAP:
++		/*
++		 * Requested Capability not available
++		 * We sent an ATIO that overflowed the firmware's
++		 * command resource count.
++		 */
++		isp_prt(isp, ISP_LOGERR,
++		    "rejected ATIO2 for lun %d- command count overflow", lun);
++		break;
++
++	case AT_BDR_MSG:
++		/*
++		 * If we send an ATIO to the firmware to increment
++		 * its command resource count, and the firmware is
++		 * recovering from a Bus Device Reset, it returns
++		 * the ATIO with this status. We set the command
++		 * resource count in the Enable Lun entry and no
++		 * not increment it. Therefore we should never get
++		 * this status here.
++		 */
++		isp_prt(isp, ISP_LOGERR, atiocope, lun, 0);
++		break;
++
++	case AT_CDB:		/* Got a CDB */
++		/*
++		 * Punt to platform specific layer.
++		 */
++		(void) isp_async(isp, ISPASYNC_TARGET_ACTION, aep);
++		break;
++
++	case AT_RESET:
++		/*
++		 * A bus reset came along an blew away this command. Why
++		 * they do this in addition the async event code stuff,
++		 * I dunno.
++		 *
++		 * Ignore it because the async event will clear things
++		 * up for us.
++		 */
++		isp_prt(isp, ISP_LOGERR, atior, lun, aep->at_iid, 0);
++		break;
++
++
++	default:
++		isp_prt(isp, ISP_LOGERR,
++		    "Unknown ATIO2 status 0x%x from initiator %d for lun %d",
++		    aep->at_status, aep->at_iid, lun);
++		(void) isp_target_put_atio(isp, aep);
++		break;
++	}
++}
++
++static void
++isp_handle_ctio(struct ispsoftc *isp, ct_entry_t *ct)
++{
++	void *xs;
++	int pl = ISP_LOGTDEBUG2;
++	char *fmsg = NULL;
++
++	if (ct->ct_syshandle) {
++		xs = isp_find_xs(isp, ct->ct_syshandle);
++		if (xs == NULL)
++			pl = ISP_LOGALL;
++	} else {
++		xs = NULL;
++	}
++
++	switch(ct->ct_status & ~QLTM_SVALID) {
++	case CT_OK:
++		/*
++		 * There are generally 3 possibilities as to why we'd get
++		 * this condition:
++		 * 	We disconnected after receiving a CDB.
++		 * 	We sent or received data.
++		 * 	We sent status & command complete.
++		 */
++
++		if (ct->ct_flags & CT_SENDSTATUS) {
++			break;
++		} else if ((ct->ct_flags & CT_DATAMASK) == CT_NO_DATA) {
++			/*
++			 * Nothing to do in this case.
++			 */
++			isp_prt(isp, pl, "CTIO- iid %d disconnected OK",
++			    ct->ct_iid);
++			return;
++		}
++		break;
++
++	case CT_BDR_MSG:
++		/*
++		 * Bus Device Reset message received or the SCSI Bus has
++		 * been Reset; the firmware has gone to Bus Free.
++		 *
++		 * The firmware generates an async mailbox interupt to
++		 * notify us of this and returns outstanding CTIOs with this
++		 * status. These CTIOs are handled in that same way as
++		 * CT_ABORTED ones, so just fall through here.
++		 */
++		fmsg = "Bus Device Reset";
++		/*FALLTHROUGH*/
++	case CT_RESET:
++		if (fmsg == NULL)
++			fmsg = "Bus Reset";
++		/*FALLTHROUGH*/
++	case CT_ABORTED:
++		/*
++		 * When an Abort message is received the firmware goes to
++		 * Bus Free and returns all outstanding CTIOs with the status
++		 * set, then sends us an Immediate Notify entry.
++		 */
++		if (fmsg == NULL)
++			fmsg = "ABORT TAG message sent by Initiator";
++
++		isp_prt(isp, ISP_LOGWARN, "CTIO destroyed by %s", fmsg);
++		break;
++
++	case CT_INVAL:
++		/*
++		 * CTIO rejected by the firmware due to disabled lun.
++		 * "Cannot Happen".
++		 */
++		isp_prt(isp, ISP_LOGERR,
++		    "Firmware rejected CTIO for disabled lun %d",
++		    ct->ct_lun);
++		break;
++
++	case CT_NOPATH:
++		/*
++		 * CTIO rejected by the firmware due "no path for the
++		 * nondisconnecting nexus specified". This means that
++		 * we tried to access the bus while a non-disconnecting
++		 * command is in process.
++		 */
++		isp_prt(isp, ISP_LOGERR,
++		    "Firmware rejected CTIO for bad nexus %d/%d/%d",
++		    ct->ct_iid, ct->ct_tgt, ct->ct_lun);
++		break;
++
++	case CT_RSELTMO:
++		fmsg = "Reselection";
++		/*FALLTHROUGH*/
++	case CT_TIMEOUT:
++		if (fmsg == NULL)
++			fmsg = "Command";
++		isp_prt(isp, ISP_LOGERR, "Firmware timed out on %s", fmsg);
++		break;
++
++	case	CT_PANIC:
++		if (fmsg == NULL)
++			fmsg = "Unrecoverable Error";
++		/*FALLTHROUGH*/
++	case CT_ERR:
++		if (fmsg == NULL)
++			fmsg = "Completed with Error";
++		/*FALLTHROUGH*/
++	case CT_PHASE_ERROR:
++		if (fmsg == NULL)
++			fmsg = "Phase Sequence Error";
++		/*FALLTHROUGH*/
++	case CT_TERMINATED:
++		if (fmsg == NULL)
++			fmsg = "terminated by TERMINATE TRANSFER";
++		/*FALLTHROUGH*/
++	case CT_NOACK:
++		if (fmsg == NULL)
++			fmsg = "unacknowledged Immediate Notify pending";
++		isp_prt(isp, ISP_LOGERR, "CTIO returned by f/w- %s", fmsg);
++		break;
++	default:
++		isp_prt(isp, ISP_LOGERR, "Unknown CTIO status 0x%x",
++		    ct->ct_status & ~QLTM_SVALID);
++		break;
++	}
++
++	if (xs == NULL) {
++		/*
++		 * There may be more than one CTIO for a data transfer,
++		 * or this may be a status CTIO we're not monitoring.
++		 *
++		 * The assumption is that they'll all be returned in the
++		 * order we got them.
++		 */
++		if (ct->ct_syshandle == 0) {
++			if ((ct->ct_flags & CT_SENDSTATUS) == 0) {
++				isp_prt(isp, pl,
++				    "intermediate CTIO completed ok");
++			} else {
++				isp_prt(isp, pl,
++				    "unmonitored CTIO completed ok");
++			}
++		} else {
++			isp_prt(isp, pl,
++			    "NO xs for CTIO (handle 0x%x) status 0x%x",
++			    ct->ct_syshandle, ct->ct_status & ~QLTM_SVALID);
++		}
++	} else {
++		/*
++		 * Final CTIO completed. Release DMA resources and
++		 * notify platform dependent layers.
++		 */
++		if ((ct->ct_flags & CT_DATAMASK) != CT_NO_DATA) {
++			ISP_DMAFREE(isp, xs, ct->ct_syshandle);
++		}
++		isp_prt(isp, pl, "final CTIO complete");
++		/*
++		 * The platform layer will destroy the handle if appropriate.
++		 */
++		(void) isp_async(isp, ISPASYNC_TARGET_ACTION, ct);
++	}
++}
++
++static void
++isp_handle_ctio2(struct ispsoftc *isp, ct2_entry_t *ct)
++{
++	XS_T *xs;
++	int pl = ISP_LOGTDEBUG2;
++	char *fmsg = NULL;
++
++	if (ct->ct_syshandle) {
++		xs = isp_find_xs(isp, ct->ct_syshandle);
++		if (xs == NULL)
++			pl = ISP_LOGALL;
++	} else {
++		xs = NULL;
++	}
++
++	switch(ct->ct_status & ~QLTM_SVALID) {
++	case CT_BUS_ERROR:
++		isp_prt(isp, ISP_LOGERR, "PCI DMA Bus Error");
++		/* FALL Through */
++	case CT_DATA_OVER:
++	case CT_DATA_UNDER:
++	case CT_OK:
++		/*
++		 * There are generally 2 possibilities as to why we'd get
++		 * this condition:
++		 * 	We sent or received data.
++		 * 	We sent status & command complete.
++		 */
++
++		break;
++
++	case CT_BDR_MSG:
++		/*
++		 * Target Reset function received.
++		 *
++		 * The firmware generates an async mailbox interupt to
++		 * notify us of this and returns outstanding CTIOs with this
++		 * status. These CTIOs are handled in that same way as
++		 * CT_ABORTED ones, so just fall through here.
++		 */
++		fmsg = "TARGET RESET Task Management Function Received";
++		/*FALLTHROUGH*/
++	case CT_RESET:
++		if (fmsg == NULL)
++			fmsg = "LIP Reset";
++		/*FALLTHROUGH*/
++	case CT_ABORTED:
++		/*
++		 * When an Abort message is received the firmware goes to
++		 * Bus Free and returns all outstanding CTIOs with the status
++		 * set, then sends us an Immediate Notify entry.
++		 */
++		if (fmsg == NULL)
++			fmsg = "ABORT Task Management Function Received";
++
++		isp_prt(isp, ISP_LOGERR, "CTIO2 destroyed by %s", fmsg);
++		break;
++
++	case CT_INVAL:
++		/*
++		 * CTIO rejected by the firmware - invalid data direction.
++		 */
++		isp_prt(isp, ISP_LOGERR, "CTIO2 had wrong data directiond");
++		break;
++
++	case CT_RSELTMO:
++		fmsg = "failure to reconnect to initiator";
++		/*FALLTHROUGH*/
++	case CT_TIMEOUT:
++		if (fmsg == NULL)
++			fmsg = "command";
++		isp_prt(isp, ISP_LOGERR, "Firmware timed out on %s", fmsg);
++		break;
++
++	case CT_ERR:
++		fmsg = "Completed with Error";
++		/*FALLTHROUGH*/
++	case CT_LOGOUT:
++		if (fmsg == NULL)
++			fmsg = "Port Logout";
++		/*FALLTHROUGH*/
++	case CT_PORTNOTAVAIL:
++		if (fmsg == NULL)
++			fmsg = "Port not available";
++		/*FALLTHROUGH*/
++	case CT_PORTCHANGED:
++		if (fmsg == NULL)
++			fmsg = "Port Changed";
++		/*FALLTHROUGH*/
++	case CT_NOACK:
++		if (fmsg == NULL)
++			fmsg = "unacknowledged Immediate Notify pending";
++		isp_prt(isp, ISP_LOGERR, "CTIO returned by f/w- %s", fmsg);
++		break;
++
++	case CT_INVRXID:
++		/*
++		 * CTIO rejected by the firmware because an invalid RX_ID.
++		 * Just print a message.
++		 */
++		isp_prt(isp, ISP_LOGERR,
++		    "CTIO2 completed with Invalid RX_ID 0x%x", ct->ct_rxid);
++		break;
++
++	default:
++		isp_prt(isp, ISP_LOGERR, "Unknown CTIO2 status 0x%x",
++		    ct->ct_status & ~QLTM_SVALID);
++		break;
++	}
++
++	if (xs == NULL) {
++		/*
++		 * There may be more than one CTIO for a data transfer,
++		 * or this may be a status CTIO we're not monitoring.
++		 *
++		 * The assumption is that they'll all be returned in the
++		 * order we got them.
++		 */
++		if (ct->ct_syshandle == 0) {
++			if ((ct->ct_flags & CT_SENDSTATUS) == 0) {
++				isp_prt(isp, pl,
++				    "intermediate CTIO completed ok");
++			} else {
++				isp_prt(isp, pl,
++				    "unmonitored CTIO completed ok");
++			}
++		} else {
++			isp_prt(isp, pl,
++			    "NO xs for CTIO (handle 0x%x) status 0x%x",
++			    ct->ct_syshandle, ct->ct_status & ~QLTM_SVALID);
++		}
++	} else {
++		if ((ct->ct_flags & CT2_DATAMASK) != CT2_NO_DATA) {
++			ISP_DMAFREE(isp, xs, ct->ct_syshandle);
++		}
++		if (ct->ct_flags & CT_SENDSTATUS) {
++			/*
++			 * Sent status and command complete.
++			 *
++			 * We're now really done with this command, so we
++			 * punt to the platform dependent layers because
++			 * only there can we do the appropriate command
++			 * complete thread synchronization.
++			 */
++			isp_prt(isp, pl, "status CTIO complete");
++		} else {
++			/*
++			 * Final CTIO completed. Release DMA resources and
++			 * notify platform dependent layers.
++			 */
++			isp_prt(isp, pl, "data CTIO complete");
++		}
++		(void) isp_async(isp, ISPASYNC_TARGET_ACTION, ct);
++		/*
++		 * The platform layer will destroy the handle if appropriate.
++		 */
++	}
++}
++#endif
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp_target.h	2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,562 @@
++/* @(#)isp_target.h 1.18 */
++/*
++ * Qlogic Target Mode Structure and Flag Definitions
++ *
++ * Copyright (c) 1997, 1998
++ * Patrick Stirling
++ * pms@psconsult.com
++ * All rights reserved.
++ *
++ * Additional Copyright (c) 1999, 2000, 2001
++ * Matthew Jacob
++ * mjacob@feral.com
++ * All rights reserved.
++ *
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice immediately at the beginning of the file, without modification,
++ *    this list of conditions, and the following disclaimer.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * 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	_ISP_TARGET_H
++#define	_ISP_TARGET_H
++
++/*
++ * Defines for all entry types
++ */
++#define QLTM_SVALID	0x80
++#define	QLTM_SENSELEN	18
++
++/*
++ * Structure for Enable Lun and Modify Lun queue entries
++ */
++typedef struct {
++	isphdr_t	le_header;
++	u_int32_t	le_reserved;
++	u_int8_t	le_lun;
++	u_int8_t	le_rsvd;
++	u_int8_t	le_ops;		/* Modify LUN only */
++	u_int8_t	le_tgt;		/* Not for FC */
++	u_int32_t	le_flags;	/* Not for FC */
++	u_int8_t	le_status;
++	u_int8_t	le_reserved2;
++	u_int8_t	le_cmd_count;
++	u_int8_t	le_in_count;
++	u_int8_t	le_cdb6len;	/* Not for FC */
++	u_int8_t	le_cdb7len;	/* Not for FC */
++	u_int16_t	le_timeout;
++	u_int16_t	le_reserved3[20];
++} lun_entry_t;
++
++/*
++ * le_flags values
++ */
++#define LUN_TQAE	0x00000002	/* bit1  Tagged Queue Action Enable */
++#define LUN_DSSM	0x01000000	/* bit24 Disable Sending SDP Message */
++#define	LUN_DISAD	0x02000000	/* bit25 Disable autodisconnect */
++#define LUN_DM		0x40000000	/* bit30 Disconnects Mandatory */
++
++/*
++ * le_ops values
++ */
++#define LUN_CCINCR	0x01	/* increment command count */
++#define LUN_CCDECR	0x02	/* decrement command count */
++#define LUN_ININCR	0x40	/* increment immed. notify count */
++#define LUN_INDECR	0x80	/* decrement immed. notify count */
++
++/*
++ * le_status values
++ */
++#define	LUN_OK		0x01	/* we be rockin' */
++#define LUN_ERR		0x04	/* request completed with error */
++#define LUN_INVAL	0x06	/* invalid request */
++#define LUN_NOCAP	0x16	/* can't provide requested capability */
++#define LUN_ENABLED	0x3E	/* LUN already enabled */
++
++/*
++ * Immediate Notify Entry structure
++ */
++#define IN_MSGLEN	8	/* 8 bytes */
++#define IN_RSVDLEN	8	/* 8 words */
++typedef struct {
++	isphdr_t	in_header;
++	u_int32_t	in_reserved;
++	u_int8_t	in_lun;		/* lun */
++	u_int8_t	in_iid;		/* initiator */
++	u_int8_t	in_reserved2;
++	u_int8_t	in_tgt;		/* target */
++	u_int32_t	in_flags;
++	u_int8_t	in_status;
++	u_int8_t	in_rsvd2;
++	u_int8_t	in_tag_val;	/* tag value */
++	u_int8_t	in_tag_type;	/* tag type */
++	u_int16_t	in_seqid;	/* sequence id */
++	u_int8_t	in_msg[IN_MSGLEN];	/* SCSI message bytes */
++	u_int16_t	in_reserved3[IN_RSVDLEN];
++	u_int8_t	in_sense[QLTM_SENSELEN];/* suggested sense data */
++} in_entry_t;
++
++typedef struct {
++	isphdr_t	in_header;
++	u_int32_t	in_reserved;
++	u_int8_t	in_lun;		/* lun */
++	u_int8_t	in_iid;		/* initiator */
++	u_int16_t	in_scclun;
++	u_int32_t	in_reserved2;
++	u_int16_t	in_status;
++	u_int16_t	in_task_flags;
++	u_int16_t	in_seqid;	/* sequence id */
++} in_fcentry_t;
++
++/*
++ * Values for the in_status field
++ */
++#define	IN_REJECT	0x0D	/* Message Reject message received */
++#define IN_RESET	0x0E	/* Bus Reset occurred */
++#define IN_NO_RCAP	0x16	/* requested capability not available */
++#define IN_IDE_RECEIVED	0x33	/* Initiator Detected Error msg received */
++#define IN_RSRC_UNAVAIL	0x34	/* resource unavailable */
++#define IN_MSG_RECEIVED	0x36	/* SCSI message received */
++#define	IN_ABORT_TASK	0x20	/* task named in RX_ID is being aborted (FC) */
++#define	IN_PORT_LOGOUT	0x29	/* port has logged out (FC) */
++#define	IN_PORT_CHANGED	0x2A	/* port changed */
++#define	IN_GLOBAL_LOGO	0x2E	/* all ports logged out */
++#define	IN_NO_NEXUS	0x3B	/* Nexus not established */
++
++/*
++ * Values for the in_task_flags field- should only get one at a time!
++ */
++#define	TASK_FLAGS_ABORT_TASK		(1<<9)
++#define	TASK_FLAGS_CLEAR_TASK_SET	(1<<10)
++#define	TASK_FLAGS_TARGET_RESET		(1<<13)
++#define	TASK_FLAGS_CLEAR_ACA		(1<<14)
++#define	TASK_FLAGS_TERMINATE_TASK	(1<<15)
++
++#ifndef	MSG_ABORT_TAG
++#define	MSG_ABORT_TAG		0x06
++#endif
++#ifndef	MSG_CLEAR_QUEUE
++#define	MSG_CLEAR_QUEUE		0x0e
++#endif
++#ifndef	MSG_BUS_DEV_RESET
++#define	MSG_BUS_DEV_RESET	0x0b
++#endif
++#ifndef	MSG_REL_RECOVERY
++#define	MSG_REL_RECOVERY	0x10
++#endif
++#ifndef	MSG_TERM_IO_PROC
++#define	MSG_TERM_IO_PROC	0x11
++#endif
++
++
++/*
++ * Notify Acknowledge Entry structure
++ */
++#define NA_RSVDLEN	22
++typedef struct {
++	isphdr_t	na_header;
++	u_int32_t	na_reserved;
++	u_int8_t	na_lun;		/* lun */
++	u_int8_t	na_iid;		/* initiator */
++	u_int8_t	na_reserved2;
++	u_int8_t	na_tgt;		/* target */
++	u_int32_t	na_flags;
++	u_int8_t	na_status;
++	u_int8_t	na_event;
++	u_int16_t	na_seqid;	/* sequence id */
++	u_int16_t	na_reserved3[NA_RSVDLEN];
++} na_entry_t;
++
++/*
++ * Value for the na_event field
++ */
++#define NA_RST_CLRD	0x80	/* Clear an async event notification */
++#define	NA_OK		0x01	/* Notify Acknowledge Succeeded */
++#define	NA_INVALID	0x06	/* Invalid Notify Acknowledge */
++
++#define	NA2_RSVDLEN	21
++typedef struct {
++	isphdr_t	na_header;
++	u_int32_t	na_reserved;
++	u_int8_t	na_lun;		/* lun */
++	u_int8_t	na_iid;		/* initiator */
++	u_int16_t	na_scclun;
++	u_int16_t	na_flags;
++	u_int16_t	na_reserved2;
++	u_int16_t	na_status;
++	u_int16_t	na_task_flags;
++	u_int16_t	na_seqid;	/* sequence id */
++	u_int16_t	na_reserved3[NA2_RSVDLEN];
++} na_fcentry_t;
++#define	NAFC_RCOUNT	0x80	/* increment resource count */
++#define NAFC_RST_CLRD	0x20	/* Clear LIP Reset */
++/*
++ * Accept Target I/O Entry structure
++ */
++#define ATIO_CDBLEN	26
++
++typedef struct {
++	isphdr_t	at_header;
++	u_int16_t	at_reserved;
++	u_int16_t	at_handle;
++	u_int8_t	at_lun;		/* lun */
++	u_int8_t	at_iid;		/* initiator */
++	u_int8_t	at_cdblen; 	/* cdb length */
++	u_int8_t	at_tgt;		/* target */
++	u_int32_t	at_flags;
++	u_int8_t	at_status;	/* firmware status */
++	u_int8_t	at_scsi_status;	/* scsi status */
++	u_int8_t	at_tag_val;	/* tag value */
++	u_int8_t	at_tag_type;	/* tag type */
++	u_int8_t	at_cdb[ATIO_CDBLEN];	/* received CDB */
++	u_int8_t	at_sense[QLTM_SENSELEN];/* suggested sense data */
++} at_entry_t;
++
++/*
++ * at_flags values
++ */
++#define AT_NODISC	0x00008000	/* disconnect disabled */
++#define AT_TQAE		0x00000002	/* Tagged Queue Action enabled */
++
++/*
++ * at_status values
++ */
++#define AT_PATH_INVALID	0x07	/* ATIO sent to firmware for disabled lun */
++#define	AT_RESET	0x0E	/* SCSI Bus Reset Occurred */
++#define AT_PHASE_ERROR	0x14	/* Bus phase sequence error */
++#define AT_NOCAP	0x16	/* Requested capability not available */
++#define AT_BDR_MSG	0x17	/* Bus Device Reset msg received */
++#define AT_CDB		0x3D	/* CDB received */
++
++/*
++ * Macros to create and fetch and test concatenated handle and tag value macros
++ */
++
++#define	AT_MAKE_TAGID(tid, aep)						\
++	tid = ((aep)->at_handle << 16);					\
++	if ((aep)->at_flags & AT_TQAE)					\
++		(tid) |= ((aep)->at_tag_val + 1)
++
++#define	CT_MAKE_TAGID(tid, ct)						\
++	tid = ((ct)->ct_fwhandle << 16);				\
++	if ((ct)->ct_flags & CT_TQAE)					\
++		(tid) |= ((ct)->ct_tag_val + 1)
++
++#define	AT_HAS_TAG(val)		((val) & 0xffff)
++#define	AT_GET_TAG(val)		AT_HAS_TAG(val) - 1
++#define	AT_GET_HANDLE(val)	((val) >> 16)
++
++/*
++ * Accept Target I/O Entry structure, Type 2
++ */
++#define ATIO2_CDBLEN	16
++
++typedef struct {
++	isphdr_t	at_header;
++	u_int32_t	at_reserved;
++	u_int8_t	at_lun;		/* lun or reserved */
++	u_int8_t	at_iid;		/* initiator */
++	u_int16_t	at_rxid; 	/* response ID */
++	u_int16_t	at_flags;
++	u_int16_t	at_status;	/* firmware status */
++	u_int8_t	at_crn;		/* command reference number */
++	u_int8_t	at_taskcodes;
++	u_int8_t	at_taskflags;
++	u_int8_t	at_execodes;
++	u_int8_t	at_cdb[ATIO2_CDBLEN];	/* received CDB */
++	u_int32_t	at_datalen;		/* allocated data len */
++	u_int16_t	at_scclun;		/* SCC Lun or reserved */
++	u_int16_t	at_wwpn[4];		/* WWPN of initiator */
++	u_int16_t	at_reserved2[6];
++	u_int16_t	at_oxid;
++} at2_entry_t;
++
++#define	ATIO2_WWPN_OFFSET	0x2A
++#define	ATIO2_OXID_OFFSET	0x3E
++
++#define	ATIO2_TC_ATTR_MASK	0x7
++#define	ATIO2_TC_ATTR_SIMPLEQ	0
++#define	ATIO2_TC_ATTR_HEADOFQ	1
++#define	ATIO2_TC_ATTR_ORDERED	2
++#define	ATIO2_TC_ATTR_ACAQ	4
++#define	ATIO2_TC_ATTR_UNTAGGED	5
++
++#define	ATIO2_EX_WRITE		0x1
++#define	ATIO2_EX_READ		0x2
++
++/*
++ * Continue Target I/O Entry structure
++ * Request from driver. The response from the
++ * ISP firmware is the same except that the last 18
++ * bytes are overwritten by suggested sense data if
++ * the 'autosense valid' bit is set in the status byte.
++ */
++typedef struct {
++	isphdr_t	ct_header;
++	u_int16_t	ct_reserved;
++#define	ct_syshandle	ct_reserved	/* we use this */
++	u_int16_t	ct_fwhandle;	/* required by f/w */
++	u_int8_t	ct_lun;	/* lun */
++	u_int8_t	ct_iid;	/* initiator id */
++	u_int8_t	ct_reserved2;
++	u_int8_t	ct_tgt;	/* our target id */
++	u_int32_t	ct_flags;
++	u_int8_t 	ct_status;	/* isp status */
++	u_int8_t 	ct_scsi_status;	/* scsi status */
++	u_int8_t 	ct_tag_val;	/* tag value */
++	u_int8_t 	ct_tag_type;	/* tag type */
++	u_int32_t	ct_xfrlen;	/* transfer length */
++	u_int32_t	ct_resid;	/* residual length */
++	u_int16_t	ct_timeout;
++	u_int16_t	ct_seg_count;
++	/*
++	 * This is so we can share tag name space with
++	 * CTIO{2,3,4} with the minimum of pain.
++	 */
++	union {
++		ispds_t		ct_a[ISP_RQDSEG];
++	} _u;
++#define	ct_dataseg	_u.ct_a
++} ct_entry_t;
++
++/*
++ * For some of the dual port SCSI adapters, port (bus #) is reported
++ * in the MSbit of ct_iid. Bit fields are a bit too awkward here.
++ *
++ * Note that this does not apply to FC adapters at all which can and
++ * do report IIDs between 129 && 255 (these represent devices that have
++ * logged in across a SCSI fabric).
++ */
++#define	GET_IID_VAL(x)		(x & 0x3f)
++#define	GET_BUS_VAL(x)		((x >> 7) & 0x1)
++#define	SET_IID_VAL(y, x)	y = ((y & ~0x3f) | (x & 0x3f))
++#define	SET_BUS_VAL(y, x)	y = ((y & 0x3f) | ((x & 0x1) << 7))
++
++/*
++ * ct_flags values
++ */
++#define CT_TQAE		0x00000002	/* bit  1, Tagged Queue Action enable */
++#define CT_DATA_IN	0x00000040	/* bits 6&7, Data direction */
++#define CT_DATA_OUT	0x00000080	/* bits 6&7, Data direction */
++#define CT_NO_DATA	0x000000C0	/* bits 6&7, Data direction */
++#define	CT_CCINCR	0x00000100	/* bit 8, autoincrement atio count */
++#define CT_DATAMASK	0x000000C0	/* bits 6&7, Data direction */
++#define	CT_INISYNCWIDE	0x00004000	/* bit 14, Do Sync/Wide Negotiation */
++#define CT_NODISC	0x00008000	/* bit 15, Disconnects disabled */
++#define CT_DSDP		0x01000000	/* bit 24, Disable Save Data Pointers */
++#define CT_SENDRDP	0x04000000	/* bit 26, Send Restore Pointers msg */
++#define CT_SENDSTATUS	0x80000000	/* bit 31, Send SCSI status byte */
++
++/*
++ * ct_status values
++ * - set by the firmware when it returns the CTIO
++ */
++#define CT_OK		0x01	/* completed without error */
++#define CT_ABORTED	0x02	/* aborted by host */
++#define CT_ERR		0x04	/* see sense data for error */
++#define CT_INVAL	0x06	/* request for disabled lun */
++#define CT_NOPATH	0x07	/* invalid ITL nexus */
++#define	CT_INVRXID	0x08	/* (FC only) Invalid RX_ID */
++#define	CT_DATA_OVER	0x09	/* (FC only) Data Overrun */
++#define CT_RSELTMO	0x0A	/* reselection timeout after 2 tries */
++#define CT_TIMEOUT	0x0B	/* timed out */
++#define CT_RESET	0x0E	/* SCSI Bus Reset occurred */
++#define	CT_PARITY	0x0F	/* Uncorrectable Parity Error */
++#define	CT_BUS_ERROR	0x10	/* (FC Only) DMA PCI Error */
++#define	CT_PANIC	0x13	/* Unrecoverable Error */
++#define CT_PHASE_ERROR	0x14	/* Bus phase sequence error */
++#define CT_BDR_MSG	0x17	/* Bus Device Reset msg received */
++#define	CT_DATA_UNDER	0x15	/* (FC only) Data Underrun */
++#define CT_TERMINATED	0x19	/* due to Terminate Transfer mbox cmd */
++#define	CT_PORTNOTAVAIL	0x28	/* port not available */
++#define	CT_LOGOUT	0x29	/* port logout */
++#define	CT_PORTCHANGED	0x2A	/* port changed */
++#define	CT_IDE		0x33	/* Initiator Detected Error */
++#define CT_NOACK	0x35	/* Outstanding Immed. Notify. entry */
++
++/*
++ * When the firmware returns a CTIO entry, it may overwrite the last
++ * part of the structure with sense data. This starts at offset 0x2E
++ * into the entry, which is in the middle of ct_dataseg[1]. Rather
++ * than define a new struct for this, I'm just using the sense data
++ * offset.
++ */
++#define CTIO_SENSE_OFFSET	0x2E
++
++/*
++ * Entry length in u_longs. All entries are the same size so
++ * any one will do as the numerator.
++ */
++#define UINT32_ENTRY_SIZE	(sizeof(at_entry_t)/sizeof(u_int32_t))
++
++/*
++ * QLA2100 CTIO (type 2) entry
++ */
++#define	MAXRESPLEN	26
++typedef struct {
++	isphdr_t	ct_header;
++	u_int16_t	ct_reserved;
++	u_int16_t	ct_fwhandle;	/* just to match CTIO */
++	u_int8_t	ct_lun;		/* lun */
++	u_int8_t	ct_iid;		/* initiator id */
++	u_int16_t	ct_rxid;	/* response ID */
++	u_int16_t	ct_flags;
++	u_int16_t 	ct_status;	/* isp status */
++	u_int16_t	ct_timeout;
++	u_int16_t	ct_seg_count;
++	u_int32_t	ct_reloff;	/* relative offset */
++	int32_t		ct_resid;	/* residual length */
++	union {
++		/*
++		 * The three different modes that the target driver
++		 * can set the CTIO{2,3,4} up as.
++		 *
++		 * The first is for sending FCP_DATA_IUs as well as
++		 * (optionally) sending a terminal SCSI status FCP_RSP_IU.
++		 *
++		 * The second is for sending SCSI sense data in an FCP_RSP_IU.
++		 * Note that no FCP_DATA_IUs will be sent.
++		 *
++		 * The third is for sending FCP_RSP_IUs as built specifically
++		 * in system memory as located by the isp_dataseg.
++		 */
++		struct {
++			u_int32_t _reserved;
++			u_int16_t _reserved2;
++			u_int16_t ct_scsi_status;
++			u_int32_t ct_xfrlen;
++			union {
++				ispds_t ct_a[ISP_RQDSEG_T2];	/* CTIO2 */
++				ispds64_t ct_b[ISP_RQDSEG_T3];	/* CTIO3 */
++				ispdslist_t ct_c;		/* CTIO4 */
++			} _u;
++#define	ct_dataseg	_u.ct_a
++#define	ct_dataseg64	_u.ct_b
++#define	ct_dslist	_u.ct_c
++		} m0;
++		struct {
++			u_int16_t _reserved;
++			u_int16_t _reserved2;
++			u_int16_t ct_senselen;
++			u_int16_t ct_scsi_status;
++			u_int16_t ct_resplen;
++			u_int8_t  ct_resp[MAXRESPLEN];
++		} m1;
++		struct {
++			u_int32_t _reserved;
++			u_int16_t _reserved2;
++			u_int16_t _reserved3;
++			u_int32_t ct_datalen;
++			ispds_t ct_fcp_rsp_iudata;
++		} m2;
++		/*
++		 * CTIO2 returned from F/W...
++		 */
++		struct {
++			u_int32_t _reserved[4];
++			u_int16_t ct_scsi_status;
++			u_int8_t  ct_sense[QLTM_SENSELEN];
++		} fw;
++	} rsp;
++} ct2_entry_t;
++
++/*
++ * ct_flags values for CTIO2
++ */
++#define	CT2_FLAG_MMASK	0x0003
++#define	CT2_FLAG_MODE0	0x0000
++#define	CT2_FLAG_MODE1	0x0001
++#define	CT2_FLAG_MODE2	0x0002
++#define CT2_DATA_IN	CT_DATA_IN
++#define CT2_DATA_OUT	CT_DATA_OUT
++#define CT2_NO_DATA	CT_NO_DATA
++#define CT2_DATAMASK	CT_DATAMASK
++#define	CT2_CCINCR	0x0100
++#define	CT2_FASTPOST	0x0200
++#define	CT2_TERMINATE	0x4000
++#define CT2_SENDSTATUS	0x8000
++
++/*
++ * ct_status values are (mostly) the same as that for ct_entry.
++ */
++
++/*
++ * ct_scsi_status values- the low 8 bits are the normal SCSI status
++ * we know and love. The upper 8 bits are validity markers for FCP_RSP_IU
++ * fields.
++ */
++#define	CT2_RSPLEN_VALID	0x0100
++#define	CT2_SNSLEN_VALID	0x0200
++#define	CT2_DATA_OVER		0x0400
++#define	CT2_DATA_UNDER		0x0800
++
++/*
++ * Debug macros
++ */
++
++#define	ISP_TDQE(isp, msg, idx, arg)	\
++    if (isp->isp_dblev & ISP_LOGTDEBUG2) isp_print_qentry(isp, msg, idx, arg)
++
++#ifdef	ISP_TARGET_FUNCTIONS
++/*
++ * The functions below are for the publicly available
++ * target mode functions that are internal to the Qlogic driver.
++ */
++
++/*
++ * This function handles new response queue entry appropriate for target mode.
++ */
++int isp_target_notify(struct ispsoftc *, void *, u_int16_t *);
++
++/*
++ * Enable/Disable/Modify a logical unit.
++ * (softc, cmd, bus, tgt, lun, cmd_cnt, inotify_cnt, opaque)
++ */
++#define	DFLT_CMND_CNT	0xfe	/* unmonitored */
++#define	DFLT_INOT_CNT	16
++int isp_lun_cmd(struct ispsoftc *, int, int, int, int, int, int, u_int32_t);
++
++/*
++ * General request queue 'put' routine for target mode entries.
++ */
++int isp_target_put_entry(struct ispsoftc *isp, void *);
++
++/*
++ * General routine to put back an ATIO entry-
++ * used for replenishing f/w resource counts.
++ * The argument is a pointer to a source ATIO
++ * or ATIO2.
++ */
++int isp_target_put_atio(struct ispsoftc *, void *);
++
++/*
++ * General routine to send a final CTIO for a command- used mostly for
++ * local responses.
++ */
++int isp_endcmd(struct ispsoftc *, void *, u_int32_t, u_int16_t);
++#define	ECMD_SVALID	0x100
++
++/*
++ * Handle an asynchronous event
++ *
++ * Return nonzero if the interrupt that generated this event has been dismissed.
++ */
++
++int isp_target_async(struct ispsoftc *, int, int);
++#endif
++#endif	/* _ISP_TARGET_H */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp_tpublic.h	2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,396 @@
++/* @(#)isp_tpublic.h 1.11 */
++/*
++ * Qlogic ISP Host Adapter Public Target Interface Structures && Routines
++ *---------------------------------------
++ * Copyright (c) 2000, 2001, 2002, 2003 by Matthew Jacob
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification, immediately at the beginning of the file.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ * 
++ * Matthew Jacob
++ * Feral Software
++ * mjacob@feral.com
++ */
++
++/*
++ * Required software target mode message and event handling structures.
++ *
++ * The message and event structures are used by the MI layer
++ * to propagate messages and events upstream.
++ */
++
++#ifndef	IN_MSGLEN
++#define	IN_MSGLEN	8
++#endif
++typedef struct {
++	void *		nt_hba;			/* HBA tag */
++	u_int64_t	nt_iid;			/* inititator id */
++	u_int64_t	nt_tgt;			/* target id */
++	u_int64_t	nt_lun;			/* logical unit */
++	u_int32_t	nt_tagval;		/* tag value */
++	u_int8_t	nt_bus;			/* bus */
++	u_int8_t	nt_tagtype;		/* tag type */
++	u_int8_t	nt_msg[IN_MSGLEN];	/* message content */
++} tmd_msg_t;
++
++typedef struct {
++	void *		ev_hba;			/* HBA tag */
++	u_int32_t	ev_bus;			/* bus */
++	u_int32_t	ev_event;		/* type of async event */
++} tmd_event_t;
++
++/*
++ * Suggested Software Target Mode Command Handling structure.
++ *
++ * A note about terminology:
++ *
++ *   MD stands for "Machine Dependent".
++ *
++ *    This driver is structured in three layers: Outer MD, core, and inner MD.
++ *    The latter also is bus dependent (i.e., is cognizant of PCI bus issues
++ *    as well as platform issues).
++ *
++ *
++ *   "Outer Layer" means "Other Module"
++ *
++ *    Some additional module that actually implements SCSI target command
++ *    policy is the recipient of incoming commands and the source of the
++ *    disposition for them.
++ *
++ * The command structure below is one suggested possible MD command structure,
++ * but since the handling of thbis is entirely in the MD layer, there is
++ * no explicit or implicit requirement that it be used.
++ *
++ * The cd_private tag should be used by the MD layer to keep a free list
++ * of these structures. Code outside of this driver can then use this
++ * to identify it's own unit structures. That is, when not on the MD
++ * layer's freelist, the MD layer should shove into it the identifier
++ * that the outer layer has for it- passed in on an initial QIN_HBA_REG
++ * call (see below).
++ *
++ * The cd_hba tag is a tag that uniquely identifies the HBA this target
++ * mode command is coming from. The outer layer has to pass this back
++ * unchanged to avoid chaos.
++ *
++ * The cd_iid, cd_tgt, cd_lun and cd_bus tags are used to identify the
++ * id of the initiator who sent us a command, the target claim to be, the
++ * lun on the target we claim to be, and the bus instance (for multiple
++ * bus host adapters) that this applies to (consider it an extra Port
++ * parameter). The iid, tgt and lun values are deliberately chosen to be
++ * fat so that, for example, World Wide Names can be used instead of
++ * the units that the Qlogic firmware uses (in the case where the MD
++ * layer maintains a port database, for example).
++ *
++ * The cd_tagtype field specifies what kind of command tag has been
++ * sent with the command. The cd_tagval is the tag's value (low 16
++ * bits). It also contains (in the upper 16 bits) any command handle.
++ *
++ *
++ * N.B.: when the MD layer sends this command to outside software
++ * the outside software likely *MUST* return the same cd_tagval that
++ * was in place because this value is likely what the Qlogic f/w uses
++ * to identify a command.
++ *
++ * The cd_cdb contains storage for the passed in command descriptor block.
++ * This is the maximum size we can get out of the Qlogic f/w. There's no
++ * passed in length because whoever decodes the command to act upon it
++ * will know what the appropriate length is.
++ *
++ * The tag cd_lflags are the flags set by the MD driver when it gets
++ * command incoming or when it needs to inform any outside entities
++ * that the last requested action failed.
++ *
++ * The tag cd_hflags should be set by any outside software to indicate
++ * the validity of sense and status fields (defined below) and to indicate
++ * the direction data is expected to move. It is an error to have both
++ * CDFH_DATA_IN and CDFH_DATA_OUT set.
++ *
++ * If the CDFH_STSVALID flag is set, the command should be completed (after
++ * sending any data and/or status). If CDFH_SNSVALID is set and the MD layer
++ * can also handle sending the associated sense data (either back with an
++ * FCP RESPONSE IU for Fibre Channel or otherwise automatically handling a
++ * REQUEST SENSE from the initator for this target/lun), the MD layer will
++ * set the CDFL_SENTSENSE flag on successful transmission of the sense data.
++ * It is an error for the CDFH_SNSVALID bit to be set and CDFH_STSVALID not
++ * to be set. It is an error for the CDFH_SNSVALID be set and the associated
++ * SCSI status (cd_scsi_status) not be set to CHECK CONDITON.
++ * 
++ * The tag cd_data points to a data segment to either be filled or
++ * read from depending on the direction of data movement. The tag
++ * is undefined if no data direction is set. The MD layer and outer
++ * layers must agree on the meaning of cd_data.
++ *
++ * The tag cd_totlen is the total data amount expected to be moved
++ * over the life of the command. It *may* be set by the MD layer, possibly
++ * from the datalen field of an FCP CMND IU unit. If it shows up in the outer
++ * layers set to zero and the CDB indicates data should be moved, the outer
++ * layer should set it to the amount expected to be moved.
++ *
++ * The tag cd_resid should be the total residual of data not transferred.
++ * The outer layers need to set this at the begining of command processing
++ * to equal cd_totlen. As data is successfully moved, this value is decreased.
++ * At the end of a command, any nonzero residual indicates the number of bytes
++ * requested but not moved. XXXXXXXXXXXXXXXXXXXXXXX TOO VAGUE!!! 
++ *
++ * The tag cd_xfrlen is the length of the currently active data transfer.
++ * This allows several interations between any outside software and the
++ * MD layer to move data.
++ *
++ * The reason that total length and total residual have to be tracked
++ * is that fibre channel FCP DATA IU units have to have a relative
++ * offset field.
++ *
++ * N.B.: there is no necessary 1-to-1 correspondence between any one
++ * data transfer segment and the number of CTIOs that will be generated
++ * satisfy the current data transfer segment. It's not also possible to
++ * predict how big a transfer can be before it will be 'too big'. Be
++ * reasonable- a 64KB transfer is 'reasonable'. A 1MB transfer may not
++ * be. A 32MB transfer is unreasonable. The problem here has to do with
++ * how CTIOs can be used to map passed data pointers. In systems which
++ * have page based scatter-gather requirements, each PAGESIZEd chunk will
++ * consume one data segment descriptor- you get 3 or 4 of them per CTIO.
++ * The size of the REQUEST QUEUE you drop a CTIO onto is finite (typically
++ * it's 256, but on some systems it's even smaller, and note you have to
++ * sure this queue with the initiator side of this driver).
++ *
++ * The tags cd_sense and cd_scsi_status are pretty obvious.
++ *
++ * The tag cd_error is to communicate between the MD layer and outer software
++ * the current error conditions.
++ *
++ * The tag cd_lreserved, cd_hreserved are scratch areas for use for the MD
++ * and outer layers respectively.
++ * 
++ */
++
++#ifndef	TMD_CDBLEN
++#define	TMD_CDBLEN	18	/* 16 bytes, plus pad for alignment */
++#endif
++#ifndef	QLTM_SENSELEN
++#define	QLTM_SENSELEN	18
++#endif
++#ifndef	QCDS
++#define	QCDS	8
++#endif
++
++typedef struct tmd_cmd {
++	void *			cd_private;	/* private data pointer */
++	void *			cd_hba;		/* HBA tag */
++	void *			cd_data;	/* 'pointer' to data */
++	u_int64_t		cd_iid;		/* initiator ID */
++	u_int64_t		cd_tgt;		/* target id */
++	u_int64_t		cd_lun;		/* logical unit */
++	u_int32_t		cd_tagval;	/* tag value */
++	u_int32_t		cd_lflags;	/* flags lower level sets */
++	u_int32_t		cd_hflags;	/* flags higher level sets */
++	u_int32_t		cd_totlen;	/* total data requirement */
++	u_int32_t		cd_resid;	/* total data residual */
++	u_int32_t		cd_xfrlen;	/* current data requirement */
++	int32_t			cd_error;	/* current error */
++	u_int16_t		cd_scsi_status;	/* closing SCSI status */
++	u_int8_t		cd_chan;	/* channel on card */
++	u_int8_t		cd_tagtype;	/* tag type */
++	u_int8_t		cd_sense[QLTM_SENSELEN];
++	u_int8_t		cd_cdb[TMD_CDBLEN];	/* Command */
++	union {
++		void *		ptrs[QCDS / sizeof (void *)];
++		u_int64_t	llongs[QCDS / sizeof (u_int64_t)];
++		u_int32_t	longs[QCDS / sizeof (u_int32_t)];
++		u_int16_t	shorts[QCDS / sizeof (u_int16_t)];
++		u_int8_t	bytes[QCDS];
++	} cd_lreserved[2], cd_hreserved[2];
++} tmd_cmd_t;
++
++#ifndef	TMD_SIZE
++#define	TMD_SIZE	(sizeof (tmd_cmd_t))
++#endif
++
++/*
++ * Note that NODISC (obviously) doesn't apply to non-SPI transport.
++ *
++ * Note that knowing the data direction and lengh at the time of receipt of
++ * a command from the initiator is a feature only of Fibre Channel.
++ *
++ * The CDFL_BIDIR is in anticipation of the adoption of some newer
++ * features required by OSD.
++ *
++ * The principle selector for MD layer to know whether data is to
++ * be transferred in any QOUT_TMD_CONT call is cd_xfrlen- the
++ * flags CDFH_DATA_IN and CDFH_DATA_OUT define which direction.
++ */
++#define	CDFL_SNSVALID	0x01		/* sense data (from f/w) good */
++#define	CDFL_SENTSTATUS	0x02		/* last action sent status */
++#define	CDFL_DATA_IN	0x04		/* target (us) -> initiator (them) */
++#define	CDFL_DATA_OUT	0x08		/* initiator (them) -> target (us) */
++#define	CDFL_BIDIR	0x0C		/* bidirectional data */
++#define	CDFL_ERROR	0x10		/* last action ended in error */
++#define	CDFL_NODISC	0x20		/* disconnects disabled */
++#define	CDFL_SENTSENSE	0x40		/* last action sent sense data */
++#define	CDFL_BUSY	0x80		/* this command is not on a free list */
++#define	CDFL_PRIVATE	0xFF000000	/* private layer flags */
++
++#define	CDFH_SNSVALID	0x01		/* sense data (from outer layer) good */
++#define	CDFH_STSVALID	0x02		/* status valid */
++#define	CDFH_DATA_IN	0x04		/* target (us) -> initiator (them) */
++#define	CDFH_DATA_OUT	0x08		/* initiator (them) -> target (us) */
++#define	CDFH_DATA_MASK	0x0C		/* mask to cover data direction */
++#define	CDFH_PRIVATE	0xFF000000	/* private layer flags */
++
++
++/*
++ * Action codes set by the Qlogic MD target driver for
++ * the external layer to figure out what to do with.
++ */
++typedef enum {
++	QOUT_HBA_REG=0,	/* the argument is a pointer to a hba_register_t */
++	QOUT_ENABLE,	/* the argument is a pointer to a enadis_t */
++	QOUT_DISABLE,	/* the argument is a pointer to a enadis_t */
++	QOUT_TMD_START,	/* the argument is a pointer to a tmd_cmd_t */
++	QOUT_TMD_DONE,	/* the argument is a pointer to a tmd_cmd_t */
++	QOUT_TEVENT,	/* the argument is a pointer to a tmd_event_t */
++	QOUT_TMSG,	/* the argument is a pointer to a tmd_msg_t */
++	QOUT_IOCTL,	/* the argument is a pointer to a ioctl_cmd_t */
++	QOUT_HBA_UNREG	/* the argument is a pointer to a hba_register_t */
++} tact_e;
++
++/*
++ * Action codes set by the external layer for the
++ * MD Qlogic driver to figure out what to do with.
++ */
++typedef enum {
++	QIN_HBA_REG=99,	/* the argument is a pointer to a hba_register_t */
++	QIN_ENABLE,	/* the argument is a pointer to a enadis_t */
++	QIN_DISABLE,	/* the argument is a pointer to a enadis_t */
++	QIN_TMD_CONT,	/* the argument is a pointer to a tmd_cmd_t */
++	QIN_TMD_FIN,	/* the argument is a pointer to a tmd_cmd_t */
++	QIN_IOCTL,	/* the argument is a pointer to a ioctl_cmd_t */
++	QIN_HBA_UNREG,	/* the argument is a pointer to a hba_register_t */
++} qact_e;
++
++
++/*
++ * A word about the START/CONT/DONE/FIN dance:
++ *
++ *	When the HBA is enabled for receiving commands, one may	show up
++ *	without notice. When that happens, the Qlogic target mode driver
++ *	gets a tmd_cmd_t, fills it with the info that just arrived, and
++ *	calls the outer layer with a QOUT_TMD_START code and pointer to
++ *	the tmd_cmd_t.
++ *
++ *	The outer layer decodes the command, fetches data, prepares stuff,
++ *	whatever, and starts by passing back the pointer with a QIN_TMD_CONT
++ *	code which causes the Qlogic target mode driver to generate CTIOs to
++ *	satisfy whatever action needs to be taken. When those CTIOs complete,
++ *	the Qlogic target driver sends the pointer to the cmd_tmd_t back with
++ *	a QOUT_TMD_DONE code. This repeats for as long as necessary.
++ *
++ *	The outer layer signals it wants to end the command by settings within
++ *	the tmd_cmd_t itself. When the final QIN_TMD_CONT is reported completed,
++ *	the outer layer frees the tmd_cmd_t by sending the pointer to it
++ *	back with a QIN_TMD_FIN code.
++ *
++ *	The graph looks like:
++ *
++ *	QOUT_TMD_START -> [ QIN_TMD_CONT -> QOUT_TMD_DONE ] * -> QIN_TMD_FIN.
++ *
++ */
++
++/*
++ * A word about ENABLE/DISABLE: the argument is a pointer to a enadis_t
++ * with cd_hba, cd_iid, cd_chan, cd_tgt and cd_lun filled out.
++ *
++ * If an error occurs in either enabling or disabling the described lun
++ * cd_error is set with an appropriate non-zero value.
++ *
++ * Logical unit zero must be the first enabled and the last disabled.
++ */
++typedef struct {
++	void *			cd_private;	/* for outer layer usage */
++	void *			cd_hba;		/* HBA tag */
++	u_int64_t		cd_iid;		/* initiator ID */
++	u_int64_t		cd_tgt;		/* target id */
++	u_int64_t		cd_lun;		/* logical unit */
++	u_int8_t		cd_chan;	/* channel on card */
++	int32_t			cd_error;
++} enadis_t;
++
++/*
++ * This structure is used to register to other software modules the
++ * binding of an HBA identifier, driver name and instance and the
++ * lun width capapbilities of this target driver. It's up to each
++ * platform to figure out how it wants to do this, but a typical
++ * sequence would be for the MD layer to find some external module's
++ * entry point and start by sending a QOUT_HBA_REG with info filled
++ * in, and the external module to call back with a QIN_HBA_REG that
++ * passes back the corresponding information.
++ */
++#define	QR_VERSION	1
++typedef struct {
++	void *	r_identity;
++	void   (*r_action)(qact_e, void *);
++	char	r_name[8];
++	int	r_inst;
++	int	r_version;
++	enum { R_FC, R_SCSI } r_type;
++} hba_register_t;
++
++/*
++ * This structure is used to pass an encapsulated ioctl through to the
++ * MD layer. In many implementations it's often convenient to open just
++ * one device, but actions you want to take need to be taken on the
++ * underlying HBA. Rather than invent a separate protocol for each action,
++ * an ioctl passthrough seems simpler.
++ *
++ * In order to avoid cross domain copy problems, though, the caller will
++ * be responsible for allocating and providing a staging area for all ioctl
++ * related data. This, unavoidably, requires some ioctl decode capability
++ * in the outer layer code.`
++ *
++ * And also, albeit being cheesy, we'll define a few internal ioctls here.
++ */
++typedef struct {
++	void *	i_identity;	/* HBA tag */
++	void *	i_syncptr;	/* synchronization pointer */
++	int	i_cmd;		/* ioctl command */
++	void *	i_arg;		/* ioctl argument area */
++	int	i_errno;	/* ioctl error return */
++} ioctl_cmd_t;
++
++#define	QI_IOC	('Q' << 8)
++#define	QI_SCSI_TINI	QI_IOC|0
++#define	QI_SCSI_CMD	QI_IOC|1
++#define	QI_WWPN_XLT	QI_IOC|2
++
++/*
++ * Target handler functions.
++ *
++ * The MD target handler function (the outer layer calls this)
++ * should be be prototyped like:
++ *
++ *	void target_action(qact_e, void *arg)
++ *
++ * The outer layer target handler function (the MD layer calls this)
++ * should be be prototyped like:
++ *
++ *	void system_target_handler(tact_e, void *arg)
++ */
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/ispvar.h	2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,902 @@
++/* @(#)ispvar.h 1.44 */
++/*
++ * Soft Definitions for for Qlogic ISP SCSI adapters.
++ *
++ * Copyright (c) 1997, 1998, 1999, 2000 by Matthew Jacob
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice immediately at the beginning of the file, without modification,
++ *    this list of conditions, and the following disclaimer.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ *
++ */
++
++#ifndef	_ISPVAR_H
++#define	_ISPVAR_H
++
++#if defined(__NetBSD__) || defined(__OpenBSD__)
++#include <dev/ic/ispmbox.h>
++#ifdef	ISP_TARGET_MODE
++#include <dev/ic/isp_target.h>
++#include <dev/ic/isp_tpublic.h>
++#endif
++#endif
++#ifdef	__FreeBSD__
++#include <dev/isp/ispmbox.h>
++#ifdef	ISP_TARGET_MODE
++#include <dev/isp/isp_target.h>
++#include <dev/isp/isp_tpublic.h>
++#endif
++#endif
++#ifdef	__linux__
++#include "ispmbox.h"
++#ifdef	ISP_TARGET_MODE
++#include "isp_target.h"
++#include "isp_tpublic.h"
++#endif
++#endif
++
++#define	ISP_CORE_VERSION_MAJOR	2
++#define	ISP_CORE_VERSION_MINOR	7
++
++/*
++ * Vector for bus specific code to provide specific services.
++ */
++struct ispsoftc;
++struct ispmdvec {
++	int		(*dv_rd_isr)
++	    (struct ispsoftc *, u_int16_t *, u_int16_t *, u_int16_t *);
++	u_int16_t	(*dv_rd_reg) (struct ispsoftc *, int);
++	void		(*dv_wr_reg) (struct ispsoftc *, int, u_int16_t);
++	int		(*dv_mbxdma) (struct ispsoftc *);
++	int		(*dv_dmaset) (struct ispsoftc *,
++	    XS_T *, ispreq_t *, u_int16_t *, u_int16_t);
++	void		(*dv_dmaclr)
++	    (struct ispsoftc *, XS_T *, u_int16_t);
++	void		(*dv_reset0) (struct ispsoftc *);
++	void		(*dv_reset1) (struct ispsoftc *);
++	void		(*dv_dregs) (struct ispsoftc *, const char *);
++	u_int16_t	*dv_ispfw;	/* ptr to f/w */
++	u_int16_t	dv_conf1;
++	u_int16_t	dv_clock;	/* clock frequency */
++};
++
++/*
++ * Overall parameters
++ */
++#define	MAX_TARGETS		16
++#define	MAX_FC_TARG		256
++#define	ISP_MAX_TARGETS(isp)	(IS_FC(isp)? MAX_FC_TARG : MAX_TARGETS)
++#define	ISP_MAX_LUNS(isp)	(isp)->isp_maxluns
++
++/*
++ * 'Types'
++ */
++#ifdef	ISP_DAC_SUPPORTED
++typedef	u_int64_t	isp_dma_addr_t;
++#else
++typedef	u_int32_t	isp_dma_addr_t;
++#endif
++
++/*
++ * Macros to access ISP registers through bus specific layers-
++ * mostly wrappers to vector through the mdvec structure.
++ */
++#define	ISP_READ_ISR(isp, isrp, semap, mbox0p)	\
++	(*(isp)->isp_mdvec->dv_rd_isr)(isp, isrp, semap, mbox0p)
++
++#define	ISP_READ(isp, reg)	\
++	(*(isp)->isp_mdvec->dv_rd_reg)((isp), (reg))
++
++#define	ISP_WRITE(isp, reg, val)	\
++	(*(isp)->isp_mdvec->dv_wr_reg)((isp), (reg), (val))
++
++#define	ISP_MBOXDMASETUP(isp)	\
++	(*(isp)->isp_mdvec->dv_mbxdma)((isp))
++
++#define	ISP_DMASETUP(isp, xs, req, iptrp, optr)	\
++	(*(isp)->isp_mdvec->dv_dmaset)((isp), (xs), (req), (iptrp), (optr))
++
++#define	ISP_DMAFREE(isp, xs, hndl)	\
++	if ((isp)->isp_mdvec->dv_dmaclr) \
++	    (*(isp)->isp_mdvec->dv_dmaclr)((isp), (xs), (hndl))
++
++#define	ISP_RESET0(isp)	\
++	if ((isp)->isp_mdvec->dv_reset0) (*(isp)->isp_mdvec->dv_reset0)((isp))
++#define	ISP_RESET1(isp)	\
++	if ((isp)->isp_mdvec->dv_reset1) (*(isp)->isp_mdvec->dv_reset1)((isp))
++#define	ISP_DUMPREGS(isp, m)	\
++	if ((isp)->isp_mdvec->dv_dregs) (*(isp)->isp_mdvec->dv_dregs)((isp),(m))
++
++#define	ISP_SETBITS(isp, reg, val)	\
++ (*(isp)->isp_mdvec->dv_wr_reg)((isp), (reg), ISP_READ((isp), (reg)) | (val))
++
++#define	ISP_CLRBITS(isp, reg, val)	\
++ (*(isp)->isp_mdvec->dv_wr_reg)((isp), (reg), ISP_READ((isp), (reg)) & ~(val))
++
++/*
++ * The MEMORYBARRIER macro is defined per platform (to provide synchronization
++ * on Request and Response Queues, Scratch DMA areas, and Registers)
++ *
++ * Defined Memory Barrier Synchronization Types
++ */
++#define	SYNC_REQUEST	0	/* request queue synchronization */
++#define	SYNC_RESULT	1	/* result queue synchronization */
++#define	SYNC_SFORDEV	2	/* scratch, sync for ISP */
++#define	SYNC_SFORCPU	3	/* scratch, sync for CPU */
++#define	SYNC_REG	4	/* for registers */
++
++/*
++ * Request/Response Queue defines and macros.
++ * The maximum is defined per platform (and can be based on board type).
++ */
++/* This is the size of a queue entry (request and response) */
++#define	QENTRY_LEN			64
++/* Both request and result queue length must be a power of two */
++#define	RQUEST_QUEUE_LEN(x)		MAXISPREQUEST(x)
++#ifdef	ISP_TARGET_MODE
++#define	RESULT_QUEUE_LEN(x)		MAXISPREQUEST(x)
++#else
++#define	RESULT_QUEUE_LEN(x)		\
++	(((MAXISPREQUEST(x) >> 2) < 64)? 64 : MAXISPREQUEST(x) >> 2)
++#endif
++#define	ISP_QUEUE_ENTRY(q, idx)		((q) + ((idx) * QENTRY_LEN))
++#define	ISP_QUEUE_SIZE(n)		((n) * QENTRY_LEN)
++#define	ISP_NXT_QENTRY(idx, qlen)	(((idx) + 1) & ((qlen)-1))
++#define	ISP_QFREE(in, out, qlen)	\
++	((in == out)? (qlen - 1) : ((in > out)? \
++	((qlen - 1) - (in - out)) : (out - in - 1)))
++#define	ISP_QAVAIL(isp)	\
++	ISP_QFREE(isp->isp_reqidx, isp->isp_reqodx, RQUEST_QUEUE_LEN(isp))
++
++#define	ISP_ADD_REQUEST(isp, nxti)					\
++	MEMORYBARRIER(isp, SYNC_REQUEST, isp->isp_reqidx, QENTRY_LEN);	\
++	WRITE_REQUEST_QUEUE_IN_POINTER(isp, nxti);			\
++	isp->isp_reqidx = nxti
++
++/*
++ * SCSI Specific Host Adapter Parameters- per bus, per target
++ */
++
++typedef struct {
++	u_int		isp_gotdparms		: 1,
++			isp_req_ack_active_neg	: 1,
++			isp_data_line_active_neg: 1,
++			isp_cmd_dma_burst_enable: 1,
++			isp_data_dma_burst_enabl: 1,
++			isp_fifo_threshold	: 3,
++			isp_ultramode		: 1,
++			isp_diffmode		: 1,
++			isp_lvdmode		: 1,
++			isp_fast_mttr		: 1,	/* fast sram */
++			isp_initiator_id	: 4,
++			isp_async_data_setup	: 4;
++	u_int16_t	isp_selection_timeout;
++	u_int16_t	isp_max_queue_depth;
++	u_int8_t	isp_tag_aging;
++	u_int8_t	isp_bus_reset_delay;
++	u_int8_t	isp_retry_count;
++	u_int8_t	isp_retry_delay;
++	struct {
++		u_int32_t	
++			exc_throttle	:	8,
++					:	1,
++			dev_enable	:	1,	/* ignored */
++			dev_update	:	1,
++			dev_refresh	:	1,
++			actv_offset	:	4,
++			goal_offset	:	4,
++			nvrm_offset	:	4;
++		u_int8_t	actv_period;	/* current sync period */
++		u_int8_t	goal_period;	/* goal sync period */
++		u_int8_t	nvrm_period;	/* nvram sync period */
++		u_int16_t	actv_flags;	/* current device flags */
++		u_int16_t	goal_flags;	/* goal device flags */
++		u_int16_t	nvrm_flags;	/* nvram device flags */
++	} isp_devparam[MAX_TARGETS];
++} sdparam;
++
++/*
++ * Device Flags
++ */
++#define	DPARM_DISC	0x8000
++#define	DPARM_PARITY	0x4000
++#define	DPARM_WIDE	0x2000
++#define	DPARM_SYNC	0x1000
++#define	DPARM_TQING	0x0800
++#define	DPARM_ARQ	0x0400
++#define	DPARM_QFRZ	0x0200
++#define	DPARM_RENEG	0x0100
++#define	DPARM_NARROW	0x0080
++#define	DPARM_ASYNC	0x0040
++#define	DPARM_PPR	0x0020
++#define	DPARM_DEFAULT	(0xFF00 & ~DPARM_QFRZ)
++#define	DPARM_SAFE_DFLT	(DPARM_DEFAULT & ~(DPARM_WIDE|DPARM_SYNC|DPARM_TQING))
++
++
++/* technically, not really correct, as they need to be rated based upon clock */
++#define	ISP_80M_SYNCPARMS	0x0c09
++#define	ISP_40M_SYNCPARMS	0x0c0a
++#define	ISP_20M_SYNCPARMS	0x0c0c
++#define	ISP_20M_SYNCPARMS_1040	0x080c
++#define	ISP_10M_SYNCPARMS	0x0c19
++#define	ISP_08M_SYNCPARMS	0x0c25
++#define	ISP_05M_SYNCPARMS	0x0c32
++#define	ISP_04M_SYNCPARMS	0x0c41
++
++/*
++ * Fibre Channel Specifics
++ */
++#define	FL_PORT_ID		0x7e	/* FL_Port Special ID */
++#define	FC_PORT_ID		0x7f	/* Fabric Controller Special ID */
++#define	FC_SNS_ID		0x80	/* SNS Server Special ID */
++
++/* #define	ISP_USE_GA_NXT	1 */	/* Use GA_NXT with switches */
++#ifndef	GA_NXT_MAX
++#define	GA_NXT_MAX	256
++#endif
++
++typedef struct {
++	u_int32_t		isp_fwoptions	: 16,
++				isp_gbspeed	: 2,
++				isp_iid_set	: 1,
++				loop_seen_once	: 1,
++				isp_loopstate	: 4,	/* Current Loop State */
++				isp_fwstate	: 3,	/* ISP F/W state */
++				isp_gotdparms	: 1,
++				isp_topo	: 3,
++				isp_onfabric	: 1;
++	u_int8_t		isp_iid;	/* 'initiator' id */
++	u_int8_t		isp_loopid;	/* hard loop id */
++	u_int8_t		isp_alpa;	/* ALPA */
++	u_int32_t		isp_portid;
++	volatile u_int16_t	isp_lipseq;	/* LIP sequence # */
++	u_int16_t		isp_fwattr;	/* firmware attributes */
++	u_int8_t		isp_execthrottle;
++	u_int8_t		isp_retry_delay;
++	u_int8_t		isp_retry_count;
++	u_int8_t		isp_reserved;
++	u_int16_t		isp_maxalloc;
++	u_int16_t		isp_maxfrmlen;
++	u_int64_t		isp_nodewwn;
++	u_int64_t		isp_portwwn;
++	/*
++	 * Port Data Base. This is indexed by 'target', which is invariate.
++	 * However, elements within can move around due to loop changes,
++	 * so the actual loop ID passed to the F/W is in this structure.
++	 * The first time the loop is seen up, loopid will match the index
++	 * (except for fabric nodes which are above mapped above FC_SNS_ID
++	 * and are completely virtual), but subsequent LIPs can cause things
++	 * to move around.
++	 */
++	struct lportdb {
++		u_int32_t
++					port_type	: 8,
++					loopid		: 8,
++					fc4_type	: 4,
++					last_fabric_dev	: 1,
++							: 2,
++					relogin		: 1,
++					force_logout	: 1,
++					was_fabric_dev	: 1,
++					fabric_dev	: 1,
++					loggedin	: 1,
++					roles		: 2,
++					valid		: 1;
++		u_int32_t		portid;
++		u_int64_t		node_wwn;
++		u_int64_t		port_wwn;
++	} portdb[MAX_FC_TARG], tport[FC_PORT_ID];
++
++	/*
++	 * Scratch DMA mapped in area to fetch Port Database stuff, etc.
++	 */
++	caddr_t			isp_scratch;
++	isp_dma_addr_t		isp_scdma;
++#ifdef	ISP_FW_CRASH_DUMP
++	u_int16_t		*isp_dump_data;
++#endif
++} fcparam;
++
++#define	FW_CONFIG_WAIT		0
++#define	FW_WAIT_AL_PA		1
++#define	FW_WAIT_LOGIN		2
++#define	FW_READY		3
++#define	FW_LOSS_OF_SYNC		4
++#define	FW_ERROR		5
++#define	FW_REINIT		6
++#define	FW_NON_PART		7
++
++#define	LOOP_NIL		0
++#define	LOOP_LIP_RCVD		1
++#define	LOOP_PDB_RCVD		2
++#define	LOOP_SCANNING_FABRIC	3
++#define	LOOP_FSCAN_DONE		4
++#define	LOOP_SCANNING_LOOP	5
++#define	LOOP_LSCAN_DONE		6
++#define	LOOP_SYNCING_PDB	7
++#define	LOOP_READY		8
++
++#define	TOPO_NL_PORT		0
++#define	TOPO_FL_PORT		1
++#define	TOPO_N_PORT		2
++#define	TOPO_F_PORT		3
++#define	TOPO_PTP_STUB		4
++
++/*
++ * Soft Structure per host adapter
++ */
++typedef struct ispsoftc {
++	/*
++	 * Platform (OS) specific data
++	 */
++	struct isposinfo	isp_osinfo;
++
++	/*
++	 * Pointer to bus specific functions and data
++	 */
++	struct ispmdvec *	isp_mdvec;
++
++	/*
++	 * (Mostly) nonvolatile state. Board specific parameters
++	 * may contain some volatile state (e.g., current loop state).
++	 */
++
++	void * 			isp_param;	/* type specific */
++	u_int16_t		isp_fwrev[3];	/* Loaded F/W revision */
++	u_int16_t		isp_romfw_rev[3]; /* PROM F/W revision */
++	u_int16_t		isp_maxcmds;	/* max possible I/O cmds */
++	u_int8_t		isp_type;	/* HBA Chip Type */
++	u_int8_t		isp_revision;	/* HBA Chip H/W Revision */
++	u_int32_t		isp_maxluns;	/* maximum luns supported */
++
++	u_int32_t		isp_clock	: 8,	/* input clock */
++						: 4,
++				isp_port	: 1,	/* 23XX only */
++				isp_failed	: 1,	/* board failed */
++				isp_open	: 1,	/* opened (ioctl) */
++				isp_touched	: 1,	/* board ever seen? */
++				isp_bustype	: 1,	/* SBus or PCI */
++				isp_loaded_fw	: 1,	/* loaded firmware */
++				isp_role	: 2,	/* roles supported */
++				isp_dblev	: 12;	/* debug log mask */
++
++	u_int32_t		isp_confopts;		/* config options */
++
++	u_int16_t		isp_rqstinrp;	/* register for REQINP */
++	u_int16_t		isp_rqstoutrp;	/* register for REQOUTP */
++	u_int16_t		isp_respinrp;	/* register for RESINP */
++	u_int16_t		isp_respoutrp;	/* register for RESOUTP */
++
++	/*
++	 * Instrumentation
++	 */
++	u_int64_t		isp_intcnt;		/* total int count */
++	u_int64_t		isp_intbogus;		/* spurious int count */
++	u_int64_t		isp_intmboxc;		/* mbox completions */
++	u_int64_t		isp_intoasync;		/* other async */
++	u_int64_t		isp_rsltccmplt;		/* CMDs on result q */
++	u_int64_t		isp_fphccmplt;		/* CMDs via fastpost */
++	u_int16_t		isp_rscchiwater;
++	u_int16_t		isp_fpcchiwater;
++
++	/*
++	 * Volatile state
++	 */
++
++	volatile u_int32_t
++		isp_obits	:	8,	/* mailbox command output */
++		isp_mboxbsy	:	1,	/* mailbox command active */
++		isp_state	:	3,
++		isp_sendmarker	:	2,	/* send a marker entry */
++		isp_update	:	2,	/* update parameters */
++		isp_nactive	:	16;	/* how many commands active */
++	volatile u_int16_t	isp_reqodx;	/* index of last ISP pickup */
++	volatile u_int16_t	isp_reqidx;	/* index of next request */
++	volatile u_int16_t	isp_residx;	/* index of next result */
++	volatile u_int16_t	isp_resodx;	/* index of next result */
++	volatile u_int16_t	isp_rspbsy;
++	volatile u_int16_t	isp_lasthdls;	/* last handle seed */
++	volatile u_int16_t	isp_mboxtmp[MAX_MAILBOX];
++	volatile u_int16_t	isp_lastmbxcmd;	/* last mbox command sent */
++	volatile u_int16_t	isp_mbxwrk0;
++	volatile u_int16_t	isp_mbxwrk1;
++	volatile u_int16_t	isp_mbxwrk2;
++	void *			isp_mbxworkp;
++
++	/*
++	 * Active commands are stored here, indexed by handle functions.
++	 */
++	XS_T **isp_xflist;
++
++	/*
++	 * request/result queue pointers and dma handles for them.
++	 */
++	caddr_t			isp_rquest;
++	caddr_t			isp_result;
++	isp_dma_addr_t		isp_rquest_dma;
++	isp_dma_addr_t		isp_result_dma;
++} ispsoftc_t;
++
++#define	SDPARAM(isp)	((sdparam *) (isp)->isp_param)
++#define	FCPARAM(isp)	((fcparam *) (isp)->isp_param)
++
++/*
++ * ISP Driver Run States
++ */
++#define	ISP_NILSTATE	0
++#define	ISP_RESETSTATE	1
++#define	ISP_INITSTATE	2
++#define	ISP_RUNSTATE	3
++
++/*
++ * ISP Configuration Options
++ */
++#define	ISP_CFG_NORELOAD	0x80	/* don't download f/w */
++#define	ISP_CFG_NONVRAM		0x40	/* ignore NVRAM */
++#define	ISP_CFG_TWOGB		0x20	/* force 2GB connection (23XX only) */
++#define	ISP_CFG_ONEGB		0x10	/* force 1GB connection (23XX only) */
++#define	ISP_CFG_FULL_DUPLEX	0x01	/* Full Duplex (Fibre Channel only) */
++#define	ISP_CFG_PORT_PREF	0x0C	/* Mask for Port Prefs (2200 only) */
++#define	ISP_CFG_LPORT		0x00	/* prefer {N/F}L-Port connection */
++#define	ISP_CFG_NPORT		0x04	/* prefer {N/F}-Port connection */
++#define	ISP_CFG_NPORT_ONLY	0x08	/* insist on {N/F}-Port connection */
++#define	ISP_CFG_LPORT_ONLY	0x0C	/* insist on {N/F}L-Port connection */
++#define	ISP_CFG_OWNWWPN		0x100	/* override NVRAM wwpn */
++#define	ISP_CFG_OWNWWNN		0x200	/* override NVRAM wwnn */
++#define	ISP_CFG_OWNFSZ		0x400	/* override NVRAM frame size */
++#define	ISP_CFG_OWNLOOPID	0x800	/* override NVRAM loopid */
++#define	ISP_CFG_OWNEXCTHROTTLE	0x1000	/* override NVRAM execution throttle */
++
++/*
++ * Prior to calling isp_reset for the first time, the outer layer
++ * should set isp_role to one of NONE, INITIATOR, TARGET, BOTH.
++ *
++ * If you set ISP_ROLE_NONE, the cards will be reset, new firmware loaded,
++ * NVRAM read, and defaults set, but any further initialization (e.g.
++ * INITIALIZE CONTROL BLOCK commands for 2X00 cards) won't be done.
++ *
++ * If INITIATOR MODE isn't set, attempts to run commands will be stopped
++ * at isp_start and completed with the moral equivalent of SELECTION TIMEOUT.
++ *
++ * If TARGET MODE is set, it doesn't mean that the rest of target mode support
++ * needs to be enabled, or will even work. What happens with the 2X00 cards
++ * here is that if you have enabled it with TARGET MODE as part of the ICB
++ * options, but you haven't given the f/w any ram resources for ATIOs or
++ * Immediate Notifies, the f/w just handles what it can and you never see
++ * anything. Basically, it sends a single byte of data (the first byte,
++ * which you can set as part of the INITIALIZE CONTROL BLOCK command) for
++ * INQUIRY, and sends back QUEUE FULL status for any other command.
++ *
++ */
++#define	ISP_ROLE_NONE		0x0
++#define	ISP_ROLE_INITIATOR	0x1
++#define	ISP_ROLE_TARGET		0x2
++#define	ISP_ROLE_BOTH		(ISP_ROLE_TARGET|ISP_ROLE_INITIATOR)
++#define	ISP_ROLE_EITHER		ISP_ROLE_BOTH
++#ifndef	ISP_DEFAULT_ROLES
++#define	ISP_DEFAULT_ROLES	ISP_ROLE_INITIATOR
++#endif
++
++
++/*
++ * Firmware related defines
++ */
++#define	ISP_CODE_ORG			0x1000	/* default f/w code start */
++#define	ISP_CODE_ORG_2300		0x0800	/* ..except for 2300s */
++#define	ISP_FW_REV(maj, min, mic)	((maj << 24) | (min << 16) | mic)
++#define	ISP_FW_MAJOR(code)		((code >> 24) & 0xff)
++#define	ISP_FW_MINOR(code)		((code >> 16) & 0xff)
++#define	ISP_FW_MICRO(code)		((code >>  8) & 0xff)
++#define	ISP_FW_REVX(xp)			((xp[0]<<24) | (xp[1] << 16) | xp[2])
++#define	ISP_FW_MAJORX(xp)		(xp[0])
++#define	ISP_FW_MINORX(xp)		(xp[1])
++#define	ISP_FW_MICROX(xp)		(xp[2])
++#define	ISP_FW_NEWER_THAN(i, major, minor, micro)		\
++ (ISP_FW_REVX((i)->isp_fwrev) > ISP_FW_REV(major, minor, micro))
++
++/*
++ * Bus (implementation) types
++ */
++#define	ISP_BT_PCI		0	/* PCI Implementations */
++#define	ISP_BT_SBUS		1	/* SBus Implementations */
++
++/*
++ * If we have not otherwise defined SBus support away make sure
++ * it is defined here such that the code is included as default
++ */
++#ifndef	ISP_SBUS_SUPPORTED
++#define	ISP_SBUS_SUPPORTED	1
++#endif
++
++/*
++ * Chip Types
++ */
++#define	ISP_HA_SCSI		0xf
++#define	ISP_HA_SCSI_UNKNOWN	0x1
++#define	ISP_HA_SCSI_1020	0x2
++#define	ISP_HA_SCSI_1020A	0x3
++#define	ISP_HA_SCSI_1040	0x4
++#define	ISP_HA_SCSI_1040A	0x5
++#define	ISP_HA_SCSI_1040B	0x6
++#define	ISP_HA_SCSI_1040C	0x7
++#define	ISP_HA_SCSI_1240	0x8
++#define	ISP_HA_SCSI_1080	0x9
++#define	ISP_HA_SCSI_1280	0xa
++#define	ISP_HA_SCSI_10160	0xb
++#define	ISP_HA_SCSI_12160	0xc
++#define	ISP_HA_FC		0xf0
++#define	ISP_HA_FC_2100		0x10
++#define	ISP_HA_FC_2200		0x20
++#define	ISP_HA_FC_2300		0x30
++#define	ISP_HA_FC_2312		0x40
++
++#define	IS_SCSI(isp)	(isp->isp_type & ISP_HA_SCSI)
++#define	IS_1240(isp)	(isp->isp_type == ISP_HA_SCSI_1240)
++#define	IS_1080(isp)	(isp->isp_type == ISP_HA_SCSI_1080)
++#define	IS_1280(isp)	(isp->isp_type == ISP_HA_SCSI_1280)
++#define	IS_10160(isp)	(isp->isp_type == ISP_HA_SCSI_10160)
++#define	IS_12160(isp)	(isp->isp_type == ISP_HA_SCSI_12160)
++
++#define	IS_12X0(isp)	(IS_1240(isp) || IS_1280(isp))
++#define	IS_1X160(isp)	(IS_10160(isp) || IS_12160(isp))
++#define	IS_DUALBUS(isp)	(IS_12X0(isp) || IS_12160(isp))
++#define	IS_ULTRA2(isp)	(IS_1080(isp) || IS_1280(isp) || IS_1X160(isp))
++#define	IS_ULTRA3(isp)	(IS_1X160(isp))
++
++#define	IS_FC(isp)	((isp)->isp_type & ISP_HA_FC)
++#define	IS_2100(isp)	((isp)->isp_type == ISP_HA_FC_2100)
++#define	IS_2200(isp)	((isp)->isp_type == ISP_HA_FC_2200)
++#define	IS_23XX(isp)	((isp)->isp_type >= ISP_HA_FC_2300)
++#define	IS_2300(isp)	((isp)->isp_type == ISP_HA_FC_2300)
++#define	IS_2312(isp)	((isp)->isp_type == ISP_HA_FC_2312)
++
++/*
++ * DMA cookie macros
++ */
++#ifdef	ISP_DAC_SUPPORTRED
++#define	DMA_WD3(x)	(((x) >> 48) & 0xffff)
++#define	DMA_WD2(x)	(((x) >> 32) & 0xffff)
++#else
++#define	DMA_WD3(x)	0
++#define	DMA_WD2(x)	0
++#endif
++#define	DMA_WD1(x)	(((x) >> 16) & 0xffff)
++#define	DMA_WD0(x)	(((x) & 0xffff))
++
++/*
++ * Core System Function Prototypes
++ */
++
++/*
++ * Reset Hardware. Totally. Assumes that you'll follow this with
++ * a call to isp_init.
++ */
++void isp_reset(struct ispsoftc *);
++
++/*
++ * Initialize Hardware to known state
++ */
++void isp_init(struct ispsoftc *);
++
++/*
++ * Reset the ISP and call completion for any orphaned commands.
++ */
++void isp_reinit(struct ispsoftc *);
++
++#ifdef	ISP_FW_CRASH_DUMP
++/*
++ * Dump firmware entry point.
++ */
++void isp_fw_dump(struct ispsoftc *isp);
++#endif
++
++/*
++ * Internal Interrupt Service Routine
++ *
++ * The outer layers do the spade work to get the appropriate status register,
++ * semaphore register and first mailbox register (if appropriate). This also
++ * means that most spurious/bogus interrupts not for us can be filtered first.
++ */
++void isp_intr(struct ispsoftc *, u_int16_t, u_int16_t, u_int16_t);
++
++
++/*
++ * Command Entry Point- Platform Dependent layers call into this
++ */
++int isp_start(XS_T *);
++/* these values are what isp_start returns */
++#define	CMD_COMPLETE	101	/* command completed */
++#define	CMD_EAGAIN	102	/* busy- maybe retry later */
++#define	CMD_QUEUED	103	/* command has been queued for execution */
++#define	CMD_RQLATER 	104	/* requeue this command later */
++
++/*
++ * Command Completion Point- Core layers call out from this with completed cmds
++ */
++void isp_done(XS_T *);
++
++/*
++ * Platform Dependent to External to Internal Control Function
++ *
++ * Assumes locks are held on entry. You should note that with many of
++ * these commands and locks may be released while this is occurring.
++ *
++ * A few notes about some of these functions:
++ *
++ * ISPCTL_FCLINK_TEST tests to make sure we have good fibre channel link.
++ * The argument is a pointer to an integer which is the time, in microseconds,
++ * we should wait to see whether we have good link. This test, if successful,
++ * lets us know our connection topology and our Loop ID/AL_PA and so on.
++ * You can't get anywhere without this.
++ *
++ * ISPCTL_SCAN_FABRIC queries the name server (if we're on a fabric) for
++ * all entities using the FC Generic Services subcommand GET ALL NEXT.
++ * For each found entity, an ISPASYNC_FABRICDEV event is generated (see
++ * below).
++ *
++ * ISPCTL_SCAN_LOOP does a local loop scan. This is only done if the connection
++ * topology is NL or FL port (private or public loop). Since the Qlogic f/w
++ * 'automatically' manages local loop connections, this function essentially
++ * notes the arrival, departure, and possible shuffling around of local loop
++ * entities. Thus for each arrival and departure this generates an isp_async
++ * event of ISPASYNC_PROMENADE (see below).
++ *
++ * ISPCTL_PDB_SYNC is somewhat misnamed. It actually is the final step, in
++ * order, of ISPCTL_FCLINK_TEST, ISPCTL_SCAN_FABRIC, and ISPCTL_SCAN_LOOP.
++ * The main purpose of ISPCTL_PDB_SYNC is to complete management of logging
++ * and logging out of fabric devices (if one is on a fabric) and then marking
++ * the 'loop state' as being ready to now be used for sending commands to
++ * devices. Originally fabric name server and local loop scanning were
++ * part of this function. It's now been separated to allow for finer control.
++ */
++typedef enum {
++	ISPCTL_RESET_BUS,		/* Reset Bus */
++	ISPCTL_RESET_DEV,		/* Reset Device */
++	ISPCTL_ABORT_CMD,		/* Abort Command */
++	ISPCTL_UPDATE_PARAMS,		/* Update Operating Parameters (SCSI) */
++	ISPCTL_FCLINK_TEST,		/* Test FC Link Status */
++	ISPCTL_SCAN_FABRIC,		/* (Re)scan Fabric Name Server */
++	ISPCTL_SCAN_LOOP,		/* (Re)scan Local Loop */
++	ISPCTL_PDB_SYNC,		/* Synchronize Port Database */
++	ISPCTL_SEND_LIP,		/* Send a LIP */
++	ISPCTL_GET_POSMAP,		/* Get FC-AL position map */
++	ISPCTL_RUN_MBOXCMD,		/* run a mailbox command */
++	ISPCTL_TOGGLE_TMODE		/* toggle target mode */
++} ispctl_t;
++int isp_control(struct ispsoftc *, ispctl_t, void *);
++
++
++/*
++ * Platform Dependent to Internal to External Control Function
++ * (each platform must provide such a function)
++ *
++ * Assumes locks are held.
++ *
++ * A few notes about some of these functions:
++ *
++ * ISPASYNC_CHANGE_NOTIFY notifies the outer layer that a change has
++ * occurred that invalidates the list of fabric devices known and/or
++ * the list of known loop devices. The argument passed is a pointer
++ * whose values are defined below  (local loop change, name server
++ * change, other). 'Other' may simply be a LIP, or a change in
++ * connection topology.
++ *
++ * ISPASYNC_FABRIC_DEV announces the next element in a list of
++ * fabric device names we're getting out of the name server. The
++ * argument points to a GET ALL NEXT response structure. The list
++ * is known to terminate with an entry that refers to ourselves.
++ * One of the main purposes of this function is to allow outer
++ * layers, which are OS dependent, to set policy as to which fabric
++ * devices might actually be logged into (and made visible) later
++ * at ISPCTL_PDB_SYNC time. Since there's a finite number of fabric
++ * devices that we can log into (256 less 3 'reserved' for F-port
++ * topologies), and fabrics can grow up to 8 million or so entries
++ * (24 bits of Port Address, less a wad of reserved spaces), clearly
++ * we had better let the OS determine login policy.
++ *
++ * ISPASYNC_PROMENADE has an argument that is a pointer to an integer which
++ * is an index into the portdb in the softc ('target'). Whether that entry's
++ * valid tag is set or not says whether something has arrived or departed.
++ * The name refers to a favorite pastime of many city dwellers- watching
++ * people come and go, talking of Michaelangelo, and so on..
++ *
++ * ISPASYNC_UNHANDLED_RESPONSE gives outer layers a chance to parse a
++ * response queue entry not otherwise handled. The outer layer should
++ * return non-zero if it handled it. The 'arg' points to an unmassaged
++ * response queue entry.
++ */
++
++typedef enum {
++	ISPASYNC_NEW_TGT_PARAMS,	/* New Target Parameters Negotiated */
++	ISPASYNC_BUS_RESET,		/* Bus Was Reset */
++	ISPASYNC_LOOP_DOWN,		/* FC Loop Down */
++	ISPASYNC_LOOP_UP,		/* FC Loop Up */
++	ISPASYNC_LIP,			/* LIP Received */
++	ISPASYNC_LOOP_RESET,		/* Loop Reset Received */
++	ISPASYNC_CHANGE_NOTIFY,		/* FC Change Notification */
++	ISPASYNC_FABRIC_DEV,		/* FC Fabric Device Arrival */
++	ISPASYNC_PROMENADE,		/* FC Objects coming && going */
++	ISPASYNC_TARGET_MESSAGE,	/* target message */
++	ISPASYNC_TARGET_EVENT,		/* target asynchronous event */
++	ISPASYNC_TARGET_ACTION,		/* other target command action */
++	ISPASYNC_CONF_CHANGE,		/* Platform Configuration Change */
++	ISPASYNC_UNHANDLED_RESPONSE,	/* Unhandled Response Entry */
++	ISPASYNC_FW_CRASH,		/* Firmware has crashed */
++	ISPASYNC_FW_DUMPED,		/* Firmware crashdump taken */
++	ISPASYNC_FW_RESTARTED		/* Firmware has been restarted */
++} ispasync_t;
++int isp_async(struct ispsoftc *, ispasync_t, void *);
++
++#define	ISPASYNC_CHANGE_PDB	((void *) 0)
++#define	ISPASYNC_CHANGE_SNS	((void *) 1)
++#define	ISPASYNC_CHANGE_OTHER	((void *) 2)
++
++/*
++ * Platform Dependent Error and Debug Printout
++ */
++#ifdef	__GNUC__
++void isp_prt(struct ispsoftc *, int level, const char *, ...)
++	__attribute__((__format__(__printf__,3,4)));
++#else
++void isp_prt(struct ispsoftc *, int level, const char *, ...);
++#endif
++
++#define	ISP_LOGALL	0x0	/* log always */
++#define	ISP_LOGCONFIG	0x1	/* log configuration messages */
++#define	ISP_LOGINFO	0x2	/* log informational messages */
++#define	ISP_LOGWARN	0x4	/* log warning messages */
++#define	ISP_LOGERR	0x8	/* log error messages */
++#define	ISP_LOGDEBUG0	0x10	/* log simple debug messages */
++#define	ISP_LOGDEBUG1	0x20	/* log intermediate debug messages */
++#define	ISP_LOGDEBUG2	0x40	/* log most debug messages */
++#define	ISP_LOGDEBUG3	0x80	/* log high frequency debug messages */
++#define	ISP_LOGDEBUG4	0x100	/* log high frequency debug messages */
++#define	ISP_LOGTDEBUG0	0x200	/* log simple debug messages (target mode) */
++#define	ISP_LOGTDEBUG1	0x400	/* log intermediate debug messages (target) */
++#define	ISP_LOGTDEBUG2	0x800	/* log all debug messages (target) */
++
++/*
++ * Each Platform provides it's own isposinfo substructure of the ispsoftc
++ * defined above.
++ *
++ * Each platform must also provide the following macros/defines:
++ *
++ *
++ *	INLINE		-	platform specific define for 'inline' functions
++ *
++ *	ISP_DAC_SUPPORTED -	Is DAC (Dual Address Cycle) is supported?
++ *				Basically means whether or not DMA for PCI
++ *				PCI cards (Ultra2 or better or FC) works
++ *				above 4GB.
++ *
++ *	ISP2100_SCRLEN	-	length for the Fibre Channel scratch DMA area
++ *
++ *	MEMZERO(dst, src)			platform zeroing function
++ *	MEMCPY(dst, src, count)			platform copying function
++ *	SNPRINTF(buf, bufsize, fmt, ...)	snprintf
++ *	USEC_DELAY(usecs)			microsecond spindelay function
++ *	USEC_SLEEP(isp, usecs)			microsecond sleep function
++ *
++ *	NANOTIME_T				nanosecond time type
++ *
++ *	GET_NANOTIME(NANOTIME_T *)		get current nanotime.
++ *
++ *	GET_NANOSEC(NANOTIME_T *)		get u_int64_t from NANOTIME_T
++ *
++ *	NANOTIME_SUB(NANOTIME_T *, NANOTIME_T *)
++ *						subtract two NANOTIME_T values
++ *
++ *
++ *	MAXISPREQUEST(struct ispsoftc *)	maximum request queue size
++ *						for this particular board type
++ *
++ *	MEMORYBARRIER(struct ispsoftc *, barrier_type, offset, size)
++ *
++ *		Function/Macro the provides memory synchronization on
++ *		various objects so that the ISP's and the system's view
++ *		of the same object is consistent.
++ *
++ *	MBOX_ACQUIRE(struct ispsoftc *)		acquire lock on mailbox regs
++ *	MBOX_WAIT_COMPLETE(struct ispsoftc *)	wait for mailbox cmd to be done
++ *	MBOX_NOTIFY_COMPLETE(struct ispsoftc *)	notification of mbox cmd donee
++ *	MBOX_RELEASE(struct ispsoftc *)		release lock on mailbox regs
++ *
++ *	FC_SCRATCH_ACQUIRE(struct ispsoftc *)	acquire lock on FC scratch area
++ *	FC_SCRATCH_RELEASE(struct ispsoftc *)	acquire lock on FC scratch area
++ *
++ *	SCSI_GOOD	SCSI 'Good' Status
++ *	SCSI_CHECK	SCSI 'Check Condition' Status
++ *	SCSI_BUSY	SCSI 'Busy' Status
++ *	SCSI_QFULL	SCSI 'Queue Full' Status
++ *
++ *	XS_T		Platform SCSI transaction type (i.e., command for HBA)
++ *	XS_ISP(xs)	gets an instance out of an XS_T
++ *	XS_CHANNEL(xs)	gets the channel (bus # for DUALBUS cards) ""
++ *	XS_TGT(xs)	gets the target ""
++ *	XS_LUN(xs)	gets the lun ""
++ *	XS_CDBP(xs)	gets a pointer to the scsi CDB ""
++ *	XS_CDBLEN(xs)	gets the CDB's length ""
++ *	XS_XFRLEN(xs)	gets the associated data transfer length ""
++ *	XS_TIME(xs)	gets the time (in milliseconds) for this command
++ *	XS_RESID(xs)	gets the current residual count
++ *	XS_STSP(xs)	gets a pointer to the SCSI status byte ""
++ *	XS_SNSP(xs)	gets a pointer to the associate sense data
++ *	XS_SNSLEN(xs)	gets the length of sense data storage
++ *	XS_SNSKEY(xs)	dereferences XS_SNSP to get the current stored Sense Key
++ *	XS_TAG_P(xs)	predicate of whether this command should be tagged
++ *	XS_TAG_TYPE(xs)	which type of tag to use
++ *	XS_SETERR(xs)	set error state
++ *
++ *		HBA_NOERROR	command has no erros
++ *		HBA_BOTCH	hba botched something
++ *		HBA_CMDTIMEOUT	command timed out
++ *		HBA_SELTIMEOUT	selection timed out (also port logouts for FC)
++ *		HBA_TGTBSY	target returned a BUSY status
++ *		HBA_BUSRESET	bus reset destroyed command
++ *		HBA_ABORTED	command was aborted (by request)
++ *		HBA_DATAOVR	a data overrun was detected
++ *		HBA_ARQFAIL	Automatic Request Sense failed
++ *
++ *	XS_ERR(xs)	return current error state
++ *	XS_NOERR(xs)	there is no error currently set
++ *	XS_INITERR(xs)	initialize error state
++ *
++ *	XS_SAVE_SENSE(xs, sp)		save sense data
++ *
++ *	XS_SET_STATE_STAT(isp, sp, xs)	platform dependent interpreter of
++ *					response queue entry status bits
++ *
++ *
++ *	DEFAULT_IID(struct ispsoftc *)		Default SCSI initiator ID
++ *	DEFAULT_LOOPID(struct ispsoftc *)	Default FC Loop ID
++ *	DEFAULT_NODEWWN(struct ispsoftc *)	Default Node WWN
++ *	DEFAULT_PORTWWN(struct ispsoftc *)	Default Port WWN
++ *	DEFAULT_FRAMESIZE(struct ispsoftc *)	Default Frame Size
++ *	DEFAULT_EXEC_THROTTLE(struct ispsoftc *) Default Execution Throttle
++ *		These establish reasonable defaults for each platform.
++ * 		These must be available independent of card NVRAM and are
++ *		to be used should NVRAM not be readable.
++ *
++ *	ISP_NODEWWN(struct ispsoftc *)	FC Node WWN to use
++ *	ISP_PORTWWN(struct ispsoftc *)	FC Port WWN to use
++ *
++ *		These are to be used after NVRAM is read. The tags
++ *		in fcparam.isp_{node,port}wwn reflect the values
++ *		read from NVRAM (possibly corrected for card botches).
++ *		Each platform can take that information and override
++ *		it or ignore and return the Node and Port WWNs to be
++ * 		used when sending the Qlogic f/w the Initialization Control
++ *		Block.
++ *
++ *	(XXX these do endian specific transformations- in transition XXX)
++ *
++ *	ISP_IOXPUT_8(struct ispsoftc *, u_int8_t srcval, u_int8_t *dstptr)
++ *	ISP_IOXPUT_16(struct ispsoftc *, u_int16_t srcval, u_int16_t *dstptr)
++ *	ISP_IOXPUT_32(struct ispsoftc *, u_int32_t srcval, u_int32_t *dstptr)
++ *
++ *	ISP_IOXGET_8(struct ispsoftc *, u_int8_t *srcptr, u_int8_t dstrval)
++ *	ISP_IOXGET_16(struct ispsoftc *, u_int16_t *srcptr, u_int16_t dstrval)
++ *	ISP_IOXGET_32(struct ispsoftc *, u_int32_t *srcptr, u_int32_t dstrval)
++ *
++ *	ISP_SWIZZLE_NVRAM_WORD(struct ispsoftc *, u_int16_t *)
++ */
++
++#endif	/* _ISPVAR_H */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/Makefile	2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,7 @@
++obj-$(CONFIG_SCSI_FERAL_ISP)	+= isp_mod.o
++
++EXTRA_CFLAGS			+= -Idrivers/scsi -g
++EXTRA_LDFLAGS			+= -g
++
++isp_mod-y			+= isp_pci.o isp_linux.o isp.o \
++				isp_cb_ops.o isp_target.o
+--- linux-2.6.0-test1/drivers/scsi/jazz_esp.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/jazz_esp.c	2003-07-19 17:03:50.000000000 -0700
+@@ -11,7 +11,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ 
+--- linux-2.6.0-test1/drivers/scsi/Kconfig	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/Kconfig	2003-07-19 17:06:33.000000000 -0700
+@@ -1834,6 +1834,15 @@ config WD33C93_PIO
+ 
+ #      bool 'Cyberstorm Mk III SCSI support (EXPERIMENTAL)' CONFIG_CYBERSTORMIII_SCSI
+ #      bool 'GVP Turbo 040/060 SCSI support (EXPERIMENTAL)' CONFIG_GVP_TURBO_SCSI
++
++config SCSI_FERAL_ISP
++	tristate "Feral ISP driver for 10x0/12x0/2x00"
++	depends on SCSI
++	help
++	  Feral Driver for the following qlogic ISP chips
++	  1020/1040/1080/1280/12160/2100/2200/2300
++	  If this doesn't work, there are other drivers for these chips
++	  below.
+ endmenu
+ 
+ source "drivers/scsi/pcmcia/Kconfig"
+--- linux-2.6.0-test1/drivers/scsi/lasi700.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/lasi700.c	2003-07-19 17:03:50.000000000 -0700
+@@ -128,7 +128,8 @@ lasi700_driver_callback(struct parisc_de
+ 	}
+ 
+ 	dev_set_drvdata(&dev->dev, host);
+-	scsi_add_host(host, &dev->dev);
++	scsi_add_host(host, &dev->dev); /* XXX handle failure */
++	scsi_scan_host(host);
+ 
+ 	return 0;
+ 
+@@ -165,7 +166,6 @@ static void __exit
+ lasi700_exit(void)
+ {
+ 	unregister_parisc_driver(&lasi700_driver);
+-	scsi_sysfs_release_attributes(&lasi700_template);
+ }
+ 
+ module_init(lasi700_init);
+--- linux-2.6.0-test1/drivers/scsi/mac53c94.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/scsi/mac53c94.c	2003-07-19 17:03:50.000000000 -0700
+@@ -12,7 +12,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/spinlock.h>
+--- linux-2.6.0-test1/drivers/scsi/mac_esp.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/mac_esp.c	2003-07-19 17:03:50.000000000 -0700
+@@ -19,7 +19,7 @@
+ #include <linux/ctype.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/mac_scsi.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/scsi/mac_scsi.c	2003-07-19 17:03:50.000000000 -0700
+@@ -39,7 +39,7 @@
+ #include <linux/sched.h>
+ #include <linux/ioport.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ 
+ #include <asm/io.h>
+--- linux-2.6.0-test1/drivers/scsi/Makefile	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/Makefile	2003-07-19 17:06:33.000000000 -0700
+@@ -70,6 +70,7 @@ obj-$(CONFIG_SCSI_NCR53C406A)	+= NCR53c4
+ obj-$(CONFIG_SCSI_NCR_D700)	+= NCR_D700.o 53c700.o
+ obj-$(CONFIG_SCSI_NCR_Q720)	+= NCR_Q720_mod.o
+ obj-$(CONFIG_SCSI_SYM53C416)	+= sym53c416.o
++obj-$(CONFIG_SCSI_FERAL_ISP)	+= isp/
+ obj-$(CONFIG_SCSI_QLOGIC_FAS)	+= qlogicfas.o
+ obj-$(CONFIG_SCSI_QLOGIC_ISP)	+= qlogicisp.o 
+ obj-$(CONFIG_SCSI_QLOGIC_FC)	+= qlogicfc.o 
+--- linux-2.6.0-test1/drivers/scsi/mca_53c9x.c	2003-06-14 12:18:05.000000000 -0700
++++ 25/drivers/scsi/mca_53c9x.c	2003-07-19 17:03:50.000000000 -0700
+@@ -37,7 +37,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/mca-legacy.h>
+--- linux-2.6.0-test1/drivers/scsi/megaraid.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/megaraid.c	2003-07-19 17:03:50.000000000 -0700
+@@ -32,7 +32,7 @@
+ 
+ #include <linux/mm.h>
+ #include <linux/fs.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/uaccess.h>
+ #include <asm/io.h>
+ #include <linux/delay.h>
+--- linux-2.6.0-test1/drivers/scsi/mesh.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/mesh.c	2003-07-19 17:03:50.000000000 -0700
+@@ -21,7 +21,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/mvme147.c	2003-06-14 12:18:05.000000000 -0700
++++ 25/drivers/scsi/mvme147.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1,6 +1,6 @@
+ #include <linux/types.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/sched.h>
+ #include <linux/version.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/mvme16x.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/mvme16x.c	2003-07-19 17:03:50.000000000 -0700
+@@ -5,7 +5,7 @@
+  */
+ #include <linux/types.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/sched.h>
+ #include <linux/version.h>
+ 
+--- linux-2.6.0-test1/drivers/scsi/NCR53c406a.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/NCR53c406a.c	2003-07-19 17:05:05.000000000 -0700
+@@ -51,7 +51,7 @@
+ #include <asm/bitops.h>
+ #include <asm/irq.h>
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/spinlock.h>
+ #include "scsi.h"
+ #include "hosts.h"
+@@ -450,6 +450,7 @@ static __inline__ int NCR53c406a_pio_wri
+ 
+ static int __init NCR53c406a_detect(Scsi_Host_Template * tpnt)
+ {
++	int present = 0;
+ 	struct Scsi_Host *shpnt = NULL;
+ #ifndef PORT_BASE
+ 	int i;
+@@ -522,7 +523,7 @@ static int __init NCR53c406a_detect(Scsi
+ 
+ 	DEB(printk("NCR53c406a: using port_base 0x%x\n", port_base));
+ 
+-	tpnt->present = 1;
++	present = 1;
+ 	tpnt->proc_name = "NCR53c406a";
+ 
+ 	shpnt = scsi_register(tpnt, 0);
+@@ -576,7 +577,7 @@ static int __init NCR53c406a_detect(Scsi
+ 	sprintf(info_msg, "NCR53c406a at 0x%x, IRQ %d, %s PIO mode.", port_base, irq_level, fast_pio ? "fast" : "slow");
+ #endif
+ 
+-	return (tpnt->present);
++	return (present);
+ 
+ #if USE_DMA
+       err_free_irq:
+--- linux-2.6.0-test1/drivers/scsi/ncr53c8xx.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/ncr53c8xx.c	2003-07-19 17:03:50.000000000 -0700
+@@ -140,7 +140,7 @@
+ #include <linux/timer.h>
+ #include <linux/stat.h>
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ 
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,35)
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/NCR53C9x.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/NCR53C9x.c	2003-07-19 17:03:50.000000000 -0700
+@@ -29,7 +29,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+--- linux-2.6.0-test1/drivers/scsi/NCR_D700.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/NCR_D700.c	2003-07-19 17:03:50.000000000 -0700
+@@ -218,7 +218,8 @@ NCR_D700_probe_one(struct NCR_D700_priva
+ 		goto irq_failed;
+ 	}
+ 
+-	scsi_add_host(host, p->dev);
++	scsi_add_host(host, p->dev); /* XXX handle failure */
++	scsi_scan_host(host);
+ 
+ 	p->hosts[siop] = host;
+ 	hostdata->dev = p->dev;
+@@ -387,7 +388,6 @@ static int __init NCR_D700_init(void)
+ static void __exit NCR_D700_exit(void)
+ {
+ 	mca_unregister_driver(&NCR_D700_driver);
+-	scsi_sysfs_release_attributes(&NCR_D700_driver_template);
+ }
+ 
+ module_init(NCR_D700_init);
+--- linux-2.6.0-test1/drivers/scsi/NCR_Q720.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/NCR_Q720.c	2003-07-19 17:03:50.000000000 -0700
+@@ -85,6 +85,7 @@ NCR_Q720_probe_one(struct NCR_Q720_priva
+ 	__u8 scsr1 = readb(vaddr + NCR_Q720_SCSR_OFFSET + 1);
+ 	__u8 differential = readb(vaddr + NCR_Q720_SCSR_OFFSET) & 0x20;
+ 	__u8 version;
++	int error;
+ 
+ 	scsi_id = scsr1 >> 4;
+ 	/* enable burst length 16 (FIXME: should allow this) */
+@@ -120,9 +121,12 @@ NCR_Q720_probe_one(struct NCR_Q720_priva
+ 	scsr1 &= ~0x01;
+ 	writeb(scsr1, vaddr + NCR_Q720_SCSR_OFFSET + 1);
+ 
+-	scsi_add_host(p->hosts[siop], p->dev);
+-
+-	return 0;
++	error = scsi_add_host(p->hosts[siop], p->dev);
++	if (error)
++		ncr53c8xx_release(p->hosts[siop]);
++	else
++		scsi_scan_host(p->hosts[siop]);
++	return error;
+ 
+  fail:
+ 	return -ENODEV;
+@@ -347,7 +351,6 @@ static void __exit
+ NCR_Q720_exit(void)
+ {
+ 	mca_unregister_driver(&NCR_Q720_driver);
+-	//scsi_sysfs_release_attributes(&NCR_Q720_driver_template);
+ }
+ 
+ module_init(NCR_Q720_init);
+--- linux-2.6.0-test1/drivers/scsi/nsp32.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/nsp32.c	2003-07-19 17:03:50.000000000 -0700
+@@ -25,7 +25,7 @@
+ #include <linux/timer.h>
+ #include <linux/ioport.h>
+ #include <linux/major.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/pci.h>
+ #include <linux/delay.h>
+@@ -1820,7 +1820,8 @@ static int nsp32_detect(struct pci_dev *
+ 		goto free_irq;
+         }
+ 
+-	scsi_add_host(host, &pdev->dev);
++	scsi_add_host(host, &pdev->dev); /* XXX handle failure */
++	scsi_scan_host(host);
+ 	pci_set_drvdata(pdev, host);
+ 	return 0;
+ 
+--- linux-2.6.0-test1/drivers/scsi/oktagon_esp.c	2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/scsi/oktagon_esp.c	2003-07-19 17:03:50.000000000 -0700
+@@ -20,7 +20,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/reboot.h>
+--- linux-2.6.0-test1/drivers/scsi/osst.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/osst.c	2003-07-19 17:03:50.000000000 -0700
+@@ -46,7 +46,7 @@ const char * osst_version = "0.99.0";
+ #include <linux/spinlock.h>
+ #include <linux/vmalloc.h>
+ #include <linux/version.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/devfs_fs_kernel.h>
+ #include <asm/uaccess.h>
+ #include <asm/dma.h>
+--- linux-2.6.0-test1/drivers/scsi/pas16.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/pas16.c	2003-07-19 17:03:50.000000000 -0700
+@@ -117,7 +117,8 @@
+ #include <linux/proc_fs.h>
+ #include <linux/sched.h>
+ #include <asm/io.h>
+-#include <linux/blk.h>
++#include <asm/dma.h>
++#include <linux/blkdev.h>
+ #include <linux/delay.h>
+ #include <linux/interrupt.h>
+ #include <linux/stat.h>
+--- linux-2.6.0-test1/drivers/scsi/pc980155.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/scsi/pc980155.c	2003-07-19 17:03:50.000000000 -0700
+@@ -11,7 +11,7 @@
+  */
+ 
+ #include <linux/module.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/ioport.h>
+ #include <linux/interrupt.h>
+ #include <linux/types.h>
+--- linux-2.6.0-test1/drivers/scsi/pci2000.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/pci2000.c	2003-07-19 17:03:50.000000000 -0700
+@@ -35,7 +35,7 @@
+  ****************************************************************************/
+ #define PCI2000_VERSION		"1.20"
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/module.h>
+ #include <linux/kernel.h>
+--- linux-2.6.0-test1/drivers/scsi/pci2220i.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/pci2220i.c	2003-07-19 17:03:50.000000000 -0700
+@@ -50,7 +50,7 @@
+ #include <linux/sched.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/timer.h>
+ #include <linux/spinlock.h>
+ 
+--- linux-2.6.0-test1/drivers/scsi/pcmcia/aha152x_stub.c	2003-06-14 12:18:33.000000000 -0700
++++ 25/drivers/scsi/pcmcia/aha152x_stub.c	2003-07-19 17:03:50.000000000 -0700
+@@ -44,7 +44,7 @@
+ #include <linux/ioport.h>
+ #include <scsi/scsi.h>
+ #include <linux/major.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <scsi/scsi_ioctl.h>
+ 
+ #include "scsi.h"
+@@ -278,7 +278,8 @@ static void aha152x_config_cs(dev_link_t
+ 	goto cs_failed;
+     }
+ 
+-    scsi_add_host(host, NULL);
++    scsi_add_host(host, NULL); /* XXX handle failure */
++    scsi_scan_host(host);
+ 
+     sprintf(info->node.dev_name, "scsi%d", host->host_no);
+     link->dev = &info->node;
+--- linux-2.6.0-test1/drivers/scsi/pcmcia/fdomain_stub.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/scsi/pcmcia/fdomain_stub.c	2003-07-19 17:03:50.000000000 -0700
+@@ -41,7 +41,7 @@
+ #include <linux/ioport.h>
+ #include <scsi/scsi.h>
+ #include <linux/major.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <scsi/scsi_ioctl.h>
+ 
+ #include "scsi.h"
+@@ -254,7 +254,8 @@ static void fdomain_config(dev_link_t *l
+ 	goto cs_failed;
+     }
+  
+-    scsi_add_host(host, NULL);
++    scsi_add_host(host, NULL); /* XXX handle failure */
++    scsi_scan_host(host);
+ 
+     sprintf(info->node.dev_name, "scsi%d", host->host_no);
+     link->dev = &info->node;
+--- linux-2.6.0-test1/drivers/scsi/pcmcia/nsp_cs.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/pcmcia/nsp_cs.c	2003-07-19 17:03:50.000000000 -0700
+@@ -44,7 +44,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/module.h>
+ #include <linux/major.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/stat.h>
+ 
+ #include <asm/io.h>
+@@ -1773,7 +1773,8 @@ static void nsp_cs_config(dev_link_t *li
+ 		       req.Base+req.Size-1);
+ 	printk("\n");
+ 
+-	scsi_add_host(host, NULL);
++	scsi_add_host(host, NULL); /* XXX handle failure */
++	scsi_scan_host(host);
+ 	link->state &= ~DEV_CONFIG_PENDING;
+ 	return;
+ 
+--- linux-2.6.0-test1/drivers/scsi/pcmcia/qlogic_stub.c	2003-06-14 12:18:22.000000000 -0700
++++ 25/drivers/scsi/pcmcia/qlogic_stub.c	2003-07-19 17:03:50.000000000 -0700
+@@ -42,7 +42,7 @@
+ #include <asm/io.h>
+ #include <scsi/scsi.h>
+ #include <linux/major.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <scsi/scsi_ioctl.h>
+ 
+ #include "scsi.h"
+@@ -270,7 +270,8 @@ static void qlogic_config(dev_link_t * l
+ 	link->dev = &info->node;
+ 	info->host = host;
+ 
+-	scsi_add_host(host, NULL);
++	scsi_add_host(host, NULL); /* XXX handle failure */
++	scsi_scan_host(host);
+ 
+ out:
+ 	link->state &= ~DEV_CONFIG_PENDING;
+--- linux-2.6.0-test1/drivers/scsi/pluto.c	2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/scsi/pluto.c	2003-07-19 17:03:50.000000000 -0700
+@@ -9,7 +9,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/ppa.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/ppa.c	2003-07-19 17:03:50.000000000 -0700
+@@ -15,7 +15,7 @@
+ /* The following #define is to avoid a clash with hosts.c */
+ #define PPA_CODE 1
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/io.h>
+ #include <linux/parport.h>
+ #include <linux/workqueue.h>
+--- linux-2.6.0-test1/drivers/scsi/ppa.h	2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/scsi/ppa.h	2003-07-19 17:03:50.000000000 -0700
+@@ -82,7 +82,7 @@
+ #include  <linux/delay.h>
+ #include  <linux/proc_fs.h>
+ #include  <linux/stat.h>
+-#include  <linux/blk.h>
++#include  <linux/blkdev.h>
+ #include  <linux/sched.h>
+ #include  <linux/interrupt.h>
+ 
+--- linux-2.6.0-test1/drivers/scsi/psi240i.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/psi240i.c	2003-07-19 17:03:50.000000000 -0700
+@@ -26,7 +26,7 @@
+ 
+ #include <linux/module.h>
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/types.h>
+ #include <linux/string.h>
+--- linux-2.6.0-test1/drivers/scsi/qla1280.c	2003-06-14 12:18:51.000000000 -0700
++++ 25/drivers/scsi/qla1280.c	2003-07-19 17:03:50.000000000 -0700
+@@ -252,7 +252,7 @@
+ #include <linux/timer.h>
+ #include <linux/pci.h>
+ #include <linux/proc_fs.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/workqueue.h>
+ #include <linux/stat.h>
+ #include <linux/slab.h>
+@@ -327,7 +327,7 @@
+ /* 3.16 */
+ #ifdef QLA_64BIT_PTR
+ #define pci_dma_lo32(a)		(a & 0xffffffff)
+-#define pci_dma_hi32(a)		(a >> 32)
++#define pci_dma_hi32(a)		((a >> 16)>>16)
+ #else
+ #define pci_dma_lo32(a)		(a & 0xffffffff)
+ #define pci_dma_hi32(a)		0
+--- linux-2.6.0-test1/drivers/scsi/qlogicfas.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/qlogicfas.c	2003-07-19 17:03:50.000000000 -0700
+@@ -127,7 +127,7 @@
+ #endif
+ 
+ #include <linux/module.h>
+-#include <linux/blk.h>		/* to get disk capacity */
++#include <linux/blkdev.h>		/* to get disk capacity */
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/init.h>
+@@ -140,6 +140,7 @@
+ 
+ #include <asm/io.h>
+ #include <asm/irq.h>
++#include <asm/dma.h>
+ 
+ #include "scsi.h"
+ #include "hosts.h"
+--- linux-2.6.0-test1/drivers/scsi/qlogicfc.c	2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/scsi/qlogicfc.c	2003-07-19 17:03:50.000000000 -0700
+@@ -50,7 +50,7 @@
+  *
+  */
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/qlogicisp.c	2003-06-14 12:18:35.000000000 -0700
++++ 25/drivers/scsi/qlogicisp.c	2003-07-19 17:03:50.000000000 -0700
+@@ -20,7 +20,7 @@
+  * General Public License for more details.
+  */
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/config.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+--- linux-2.6.0-test1/drivers/scsi/qlogicpti.c	2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/scsi/qlogicpti.c	2003-07-19 17:03:50.000000000 -0700
+@@ -17,7 +17,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/scsicam.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/scsi/scsicam.c	2003-07-19 17:03:50.000000000 -0700
+@@ -15,7 +15,7 @@
+ #include <linux/fs.h>
+ #include <linux/genhd.h>
+ #include <linux/kernel.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/buffer_head.h>
+ #include <asm/unaligned.h>
+ #include "scsi.h"
+--- linux-2.6.0-test1/drivers/scsi/scsi_debug.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/scsi_debug.c	2003-07-19 17:03:50.000000000 -0700
+@@ -41,7 +41,7 @@
+ #include <linux/vmalloc.h>
+ #include <linux/moduleparam.h>
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+ #include <scsi/scsicam.h>
+@@ -687,7 +687,7 @@ static int resp_mode_sense(unsigned char
+ 	pcontrol = (cmd[2] & 0xc0) >> 6;
+ 	pcode = cmd[2] & 0x3f;
+ 	msense_6 = (MODE_SENSE == cmd[0]);
+-	alloc_len = msense_6 ? cmd[4] : ((cmd[7] << 8) | cmd[6]);
++	alloc_len = msense_6 ? cmd[4] : ((cmd[7] << 8) | cmd[8]);
+ 	/* printk(KERN_INFO "msense: dbd=%d pcontrol=%d pcode=%d "
+ 		"msense_6=%d alloc_len=%d\n", dbd, pcontrol, pcode, "
+ 		"msense_6, alloc_len); */
+@@ -1701,7 +1701,8 @@ static int sdebug_driver_probe(struct de
+                 printk(KERN_ERR "%s: scsi_add_host failed\n", __FUNCTION__);
+                 error = -ENODEV;
+ 		scsi_host_put(hpnt);
+-        }
++        } else
++		scsi_scan_host(hpnt);
+ 
+ 
+         return error;
+--- linux-2.6.0-test1/drivers/scsi/scsi.h	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/scsi.h	2003-07-19 17:03:50.000000000 -0700
+@@ -174,11 +174,6 @@ extern const char *scsi_extd_sense_forma
+ #define SCSI_MLQUEUE_DEVICE_BUSY 0x1056
+ #define SCSI_MLQUEUE_EH_RETRY    0x1057
+ 
+-extern int scsi_sysfs_modify_sdev_attribute(struct device_attribute ***dev_attrs,
+-					    struct device_attribute *attr);
+-extern int scsi_sysfs_modify_shost_attribute(struct class_device_attribute ***class_attrs,
+-					     struct class_device_attribute *attr);
+-
+ /*
+  * Legacy dma direction interfaces.
+  *
+--- linux-2.6.0-test1/drivers/scsi/scsi_ioctl.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/scsi_ioctl.c	2003-07-19 17:03:50.000000000 -0700
+@@ -18,7 +18,7 @@
+ #include <linux/mm.h>
+ #include <linux/string.h>
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+ #include <scsi/scsi_ioctl.h>
+--- linux-2.6.0-test1/drivers/scsi/scsi_lib.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/scsi_lib.c	2003-07-19 17:03:50.000000000 -0700
+@@ -8,7 +8,7 @@
+  */
+ 
+ #include <linux/bio.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/completion.h>
+ #include <linux/kernel.h>
+ #include <linux/mempool.h>
+@@ -444,22 +444,8 @@ static void scsi_run_queue(struct reques
+  */
+ static void scsi_requeue_command(struct request_queue *q, struct scsi_cmnd *cmd)
+ {
+-	unsigned long flags;
+-
+-	spin_lock_irqsave(q->queue_lock, flags);
+-	cmd->request->special = cmd;
+-	if (blk_rq_tagged(cmd->request))
+-		blk_queue_end_tag(q, cmd->request);
+-
+-	/*
+-	 * set REQ_SPECIAL - we have a command
+-	 * clear REQ_DONTPREP - we assume the sg table has been 
+-	 *	nuked so we need to set it up again.
+-	 */
+-	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);
++	blk_insert_request(q, cmd->request, 1, cmd);
+ 
+ 	scsi_run_queue(q);
+ }
+@@ -1213,9 +1199,7 @@ static void scsi_request_fn(struct reque
+ 	 * 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);
++	blk_requeue_request(q, req);
+ 	sdev->device_busy--;
+ 	if(sdev->device_busy == 0)
+ 		blk_plug_device(q);
+@@ -1426,17 +1410,17 @@ __scsi_mode_sense(struct scsi_request *s
+ 	if(scsi_status_is_good(sreq->sr_result)) {
+ 		data->header_length = header_length;
+ 		if(use_10_for_ms) {
+-			data->length = buffer[0]*256 + buffer[1];
++			data->length = buffer[0]*256 + buffer[1] + 2;
+ 			data->medium_type = buffer[2];
+ 			data->device_specific = buffer[3];
+ 			data->longlba = buffer[4] & 0x01;
+ 			data->block_descriptor_length = buffer[6]*256
+ 				+ buffer[7];
+ 		} else {
+-			data->length = buffer[0];
++			data->length = buffer[0] + 1;
+ 			data->medium_type = buffer[1];
+-			data->device_specific = buffer[3];
+-			data->block_descriptor_length = buffer[4];
++			data->device_specific = buffer[2];
++			data->block_descriptor_length = buffer[3];
+ 		}
+ 	}
+ 
+--- linux-2.6.0-test1/drivers/scsi/scsi_module.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/scsi_module.c	2003-07-19 17:05:05.000000000 -0700
+@@ -33,13 +33,14 @@ static int __init init_this_scsi_driver(
+ 	INIT_LIST_HEAD(&sht->legacy_hosts);
+ 
+ 	sht->detect(sht);
+-	if (!sht->present)
++	if (list_empty(&sht->legacy_hosts))
+ 		return -ENODEV;
+ 
+ 	list_for_each_entry(shost, &sht->legacy_hosts, sht_legacy_list) {
+ 		error = scsi_add_host(shost, NULL);
+ 		if (error)
+ 			goto fail;
++		scsi_scan_host(shost);
+ 	}
+ 	return 0;
+  fail:
+--- linux-2.6.0-test1/drivers/scsi/scsi_pc98.c	2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/scsi/scsi_pc98.c	2003-07-19 17:03:50.000000000 -0700
+@@ -8,7 +8,7 @@
+ #include <linux/fs.h>
+ #include <linux/kernel.h>
+ #include <linux/genhd.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/pc9800.h>
+ 
+ #include "scsi.h"
+--- linux-2.6.0-test1/drivers/scsi/scsi_priv.h	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/scsi_priv.h	2003-07-19 17:05:05.000000000 -0700
+@@ -90,11 +90,15 @@ extern void scsi_exit_queue(void);
+ 
+ /* scsi_proc.c */
+ #ifdef CONFIG_PROC_FS
++extern void scsi_proc_hostdir_add(struct scsi_host_template *);
++extern void scsi_proc_hostdir_rm(struct scsi_host_template *);
+ extern void scsi_proc_host_add(struct Scsi_Host *);
+ extern void scsi_proc_host_rm(struct Scsi_Host *);
+ extern int scsi_init_procfs(void);
+ extern void scsi_exit_procfs(void);
+ #else
++# define scsi_proc_hostdir_add(sht)	do { } while (0)
++# define scsi_proc_hostdir_rm(sht)	do { } while (0)
+ # define scsi_proc_host_add(shost)	do { } while (0)
+ # define scsi_proc_host_rm(shost)	do { } while (0)
+ # define scsi_init_procfs()		(0)
+@@ -102,7 +106,6 @@ extern void scsi_exit_procfs(void);
+ #endif /* CONFIG_PROC_FS */
+ 
+ /* scsi_scan.c */
+-extern void scsi_scan_host(struct Scsi_Host *);
+ extern void scsi_forget_host(struct Scsi_Host *);
+ extern void scsi_free_sdev(struct scsi_device *);
+ extern void scsi_free_shost(struct Scsi_Host *);
+@@ -117,11 +120,6 @@ extern void scsi_sysfs_remove_host(struc
+ extern int scsi_sysfs_register(void);
+ extern void scsi_sysfs_unregister(void);
+ 
+-/* definitions for the linker default sections covering the host
+- * class and device attributes */
+-extern struct class_device_attribute *scsi_sysfs_shost_attrs[];
+-extern struct device_attribute *scsi_sysfs_sdev_attrs[];
+-
+ extern struct class shost_class;
+ extern struct bus_type scsi_bus_type;
+ 
+--- linux-2.6.0-test1/drivers/scsi/scsi_proc.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/scsi_proc.c	2003-07-19 17:05:05.000000000 -0700
+@@ -23,7 +23,7 @@
+ #include <linux/slab.h>
+ #include <linux/proc_fs.h>
+ #include <linux/errno.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/seq_file.h>
+ #include <asm/uaccess.h>
+ 
+@@ -41,6 +41,8 @@
+ struct proc_dir_entry *proc_scsi;
+ EXPORT_SYMBOL(proc_scsi);
+ 
++/* Protect sht->present and sht->proc_dir */
++static DECLARE_MUTEX(global_host_template_sem);
+ 
+ static int proc_scsi_read(char *buffer, char **start, off_t offset,
+ 			  int length, int *eof, void *data)
+@@ -77,16 +79,10 @@ out:
+ 	return ret;
+ }
+ 
+-void scsi_proc_host_add(struct Scsi_Host *shost)
++void scsi_proc_hostdir_add(struct scsi_host_template *sht)
+ {
+-	struct scsi_host_template *sht = shost->hostt;
+-	struct proc_dir_entry *p;
+-	char name[10];
+-
+-	if (!sht->proc_info)
+-		return;
+-
+-	if (!sht->proc_dir) {
++	down(&global_host_template_sem);
++	if (!sht->present++) {
+ 		sht->proc_dir = proc_mkdir(sht->proc_name, proc_scsi);
+         	if (!sht->proc_dir) {
+ 			printk(KERN_ERR "%s: proc_mkdir failed for %s\n",
+@@ -95,6 +91,27 @@ void scsi_proc_host_add(struct Scsi_Host
+ 		}
+ 		sht->proc_dir->owner = sht->module;
+ 	}
++	up(&global_host_template_sem);
++}
++
++void scsi_proc_hostdir_rm(struct scsi_host_template *sht)
++{
++	down(&global_host_template_sem);
++	if (!--sht->present && sht->proc_dir) {
++		remove_proc_entry(sht->proc_name, proc_scsi);
++		sht->proc_dir = NULL;
++	}
++	up(&global_host_template_sem);
++}
++
++void scsi_proc_host_add(struct Scsi_Host *shost)
++{
++	struct scsi_host_template *sht = shost->hostt;
++	struct proc_dir_entry *p;
++	char name[10];
++
++	if (!sht->proc_dir)
++		return;
+ 
+ 	sprintf(name,"%d", shost->host_no);
+ 	p = create_proc_read_entry(name, S_IFREG | S_IRUGO | S_IWUSR,
+@@ -107,20 +124,18 @@ void scsi_proc_host_add(struct Scsi_Host
+ 	} 
+ 
+ 	p->write_proc = proc_scsi_write_proc;
+-	p->owner = shost->hostt->module;
++	p->owner = sht->module;
+ }
+ 
+ void scsi_proc_host_rm(struct Scsi_Host *shost)
+ {
+-	struct scsi_host_template *sht = shost->hostt;
+ 	char name[10];
+ 
+-	if (sht->proc_info) {
+-		sprintf(name,"%d", shost->host_no);
+-		remove_proc_entry(name, sht->proc_dir);
+-		if (!sht->present)
+-			remove_proc_entry(sht->proc_name, proc_scsi);
+-	}
++	if (!shost->hostt->proc_dir)
++		return;
++
++	sprintf(name,"%d", shost->host_no);
++	remove_proc_entry(name, shost->hostt->proc_dir);
+ }
+ 
+ static int proc_print_scsidevice(struct device *dev, void *data)
+--- linux-2.6.0-test1/drivers/scsi/scsi_scan.c	2003-07-10 18:50:31.000000000 -0700
++++ 25/drivers/scsi/scsi_scan.c	2003-07-19 17:03:50.000000000 -0700
+@@ -29,7 +29,7 @@
+ #include <linux/module.h>
+ #include <linux/moduleparam.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ 
+ #include "scsi.h"
+ #include "hosts.h"
+@@ -464,8 +464,7 @@ static void scsi_set_name(struct scsi_de
+ 	while (i >= 0 && type[i] == ' ')
+ 		type[i--] = '\0';
+ 
+-	snprintf(sdev->sdev_driverfs_dev.name, DEVICE_NAME_SIZE, "SCSI %s",
+-		 type);
++	snprintf(sdev->sdev_gendev.name, DEVICE_NAME_SIZE, "SCSI %s", type);
+ }
+ 
+ /**
+--- linux-2.6.0-test1/drivers/scsi/scsi_syms.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/scsi_syms.c	2003-07-19 17:03:50.000000000 -0700
+@@ -11,7 +11,7 @@
+ #include <linux/slab.h>
+ #include <linux/ioport.h>
+ #include <linux/kernel.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/fs.h>
+ 
+ #include <asm/system.h>
+@@ -34,6 +34,7 @@ EXPORT_SYMBOL(scsi_register_driver);
+ EXPORT_SYMBOL(scsi_register_interface);
+ EXPORT_SYMBOL(scsi_host_alloc);
+ EXPORT_SYMBOL(scsi_add_host);
++EXPORT_SYMBOL(scsi_scan_host);
+ EXPORT_SYMBOL(scsi_remove_host);
+ EXPORT_SYMBOL(scsi_host_get);
+ EXPORT_SYMBOL(scsi_host_put);
+--- linux-2.6.0-test1/drivers/scsi/scsi_sysfs.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/scsi_sysfs.c	2003-07-19 17:03:50.000000000 -0700
+@@ -45,7 +45,7 @@ shost_rd_attr(cmd_per_lun, "%hd\n");
+ shost_rd_attr(sg_tablesize, "%hu\n");
+ shost_rd_attr(unchecked_isa_dma, "%d\n");
+ 
+-struct class_device_attribute *scsi_sysfs_shost_attrs[] = {
++static struct class_device_attribute *scsi_sysfs_shost_attrs[] = {
+ 	&class_device_attr_unique_id,
+ 	&class_device_attr_host_busy,
+ 	&class_device_attr_cmd_per_lun,
+@@ -204,7 +204,7 @@ store_rescan_field (struct device *dev, 
+ static DEVICE_ATTR(rescan, S_IWUSR, NULL, store_rescan_field)
+ 
+ /* Default template for device attributes.  May NOT be modified */
+-struct device_attribute *scsi_sysfs_sdev_attrs[] = {
++static struct device_attribute *scsi_sysfs_sdev_attrs[] = {
+ 	&dev_attr_device_blocked,
+ 	&dev_attr_queue_depth,
+ 	&dev_attr_type,
+@@ -228,6 +228,42 @@ static void scsi_device_release(struct d
+ 	scsi_free_sdev(sdev);
+ }
+ 
++static struct device_attribute *attr_overridden(
++		struct device_attribute **attrs,
++		struct device_attribute *attr)
++{
++	int i;
++
++	if (!attrs)
++		return NULL;
++	for (i = 0; attrs[i]; i++)
++		if (!strcmp(attrs[i]->attr.name, attr->attr.name))
++			return attrs[i];
++	return NULL;
++}
++
++static int attr_add(struct device *dev, struct device_attribute *attr)
++{
++	struct device_attribute *base_attr;
++
++	/*
++	 * Spare the caller from having to copy things it's not interested in.
++	 */
++	base_attr = attr_overridden(scsi_sysfs_sdev_attrs, attr);
++	if (base_attr) {
++		/* extend permissions */
++		attr->attr.mode |= base_attr->attr.mode;
++
++		/* override null show/store with default */
++		if (!attr->show)
++			attr->show = base_attr->show;
++		if (!attr->store)
++			attr->store = base_attr->store;
++	}
++
++	return device_create_file(dev, attr);
++}
++
+ /**
+  * scsi_device_register - register a scsi device with the scsi bus
+  * @sdev:	scsi_device to register
+@@ -239,20 +275,20 @@ int scsi_device_register(struct scsi_dev
+ {
+ 	int error = 0, i;
+ 
+-	device_initialize(&sdev->sdev_driverfs_dev);
+-	sprintf(sdev->sdev_driverfs_dev.bus_id,"%d:%d:%d:%d",
++	device_initialize(&sdev->sdev_gendev);
++	sprintf(sdev->sdev_gendev.bus_id,"%d:%d:%d:%d",
+ 		sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
+-	sdev->sdev_driverfs_dev.parent = &sdev->host->host_gendev;
+-	sdev->sdev_driverfs_dev.bus = &scsi_bus_type;
+-	sdev->sdev_driverfs_dev.release = scsi_device_release;
++	sdev->sdev_gendev.parent = &sdev->host->shost_gendev;
++	sdev->sdev_gendev.bus = &scsi_bus_type;
++	sdev->sdev_gendev.release = scsi_device_release;
+ 
+ 	class_device_initialize(&sdev->sdev_classdev);
+-	sdev->sdev_classdev.dev = &sdev->sdev_driverfs_dev;
++	sdev->sdev_classdev.dev = &sdev->sdev_gendev;
+ 	sdev->sdev_classdev.class = &sdev_class;
+ 	snprintf(sdev->sdev_classdev.class_id, BUS_ID_SIZE, "%d:%d:%d:%d",
+ 		sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
+ 
+-	error = device_add(&sdev->sdev_driverfs_dev);
++	error = device_add(&sdev->sdev_gendev);
+ 	if (error) {
+ 		printk(KERN_INFO "error 1\n");
+ 		return error;
+@@ -260,16 +296,28 @@ int scsi_device_register(struct scsi_dev
+ 	error = class_device_add(&sdev->sdev_classdev);
+ 	if (error) {
+ 		printk(KERN_INFO "error 2\n");
+-		device_unregister(&sdev->sdev_driverfs_dev);
++		device_unregister(&sdev->sdev_gendev);
+ 		return error;
+ 	}
+ 
+-	for (i = 0; !error && sdev->host->hostt->sdev_attrs[i] != NULL; i++)
+-		error = device_create_file(&sdev->sdev_driverfs_dev,
+-					   sdev->host->hostt->sdev_attrs[i]);
+-
+-	if (error)
+-		scsi_device_unregister(sdev);
++	if (sdev->host->hostt->sdev_attrs) {
++		for (i = 0; sdev->host->hostt->sdev_attrs[i]; i++) {
++			error = attr_add(&sdev->sdev_gendev,
++					sdev->host->hostt->sdev_attrs[i]);
++			if (error)
++				scsi_device_unregister(sdev);
++		}
++	}
++	
++	for (i = 0; scsi_sysfs_sdev_attrs[i]; i++) {
++		if (!attr_overridden(sdev->host->hostt->sdev_attrs,
++					scsi_sysfs_sdev_attrs[i])) {
++			error = device_create_file(&sdev->sdev_gendev,
++					scsi_sysfs_sdev_attrs[i]);
++			if (error)
++				scsi_device_unregister(sdev);
++		}
++	}
+ 
+ 	return error;
+ }
+@@ -280,12 +328,8 @@ int scsi_device_register(struct scsi_dev
+  **/
+ void scsi_device_unregister(struct scsi_device *sdev)
+ {
+-	int i;
+-
+-	for (i = 0; sdev->host->hostt->sdev_attrs[i] != NULL; i++)
+-		device_remove_file(&sdev->sdev_driverfs_dev, sdev->host->hostt->sdev_attrs[i]);
+ 	class_device_unregister(&sdev->sdev_classdev);
+-	device_unregister(&sdev->sdev_driverfs_dev);
++	device_unregister(&sdev->sdev_gendev);
+ }
+ 
+ int scsi_register_driver(struct device_driver *drv)
+@@ -315,20 +359,57 @@ static void scsi_host_release(struct dev
+ 
+ void scsi_sysfs_init_host(struct Scsi_Host *shost)
+ {
+-	device_initialize(&shost->host_gendev);
+-	snprintf(shost->host_gendev.bus_id, BUS_ID_SIZE, "host%d",
++	device_initialize(&shost->shost_gendev);
++	snprintf(shost->shost_gendev.bus_id, BUS_ID_SIZE, "host%d",
+ 		shost->host_no);
+-	snprintf(shost->host_gendev.name, DEVICE_NAME_SIZE, "%s",
++	snprintf(shost->shost_gendev.name, DEVICE_NAME_SIZE, "%s",
+ 		shost->hostt->proc_name);
+-	shost->host_gendev.release = scsi_host_release;
++	shost->shost_gendev.release = scsi_host_release;
+ 
+-	class_device_initialize(&shost->class_dev);
+-	shost->class_dev.dev = &shost->host_gendev;
+-	shost->class_dev.class = &shost_class;
+-	snprintf(shost->class_dev.class_id, BUS_ID_SIZE, "host%d",
++	class_device_initialize(&shost->shost_classdev);
++	shost->shost_classdev.dev = &shost->shost_gendev;
++	shost->shost_classdev.class = &shost_class;
++	snprintf(shost->shost_classdev.class_id, BUS_ID_SIZE, "host%d",
+ 		  shost->host_no);
+ }
+ 
++static struct class_device_attribute *class_attr_overridden(
++		struct class_device_attribute **attrs,
++		struct class_device_attribute *attr)
++{
++	int i;
++
++	if (!attrs)
++		return NULL;
++	for (i = 0; attrs[i]; i++)
++		if (!strcmp(attrs[i]->attr.name, attr->attr.name))
++			return attrs[i];
++	return NULL;
++}
++
++static int class_attr_add(struct class_device *classdev,
++		struct class_device_attribute *attr)
++{
++	struct class_device_attribute *base_attr;
++
++	/*
++	 * Spare the caller from having to copy things it's not interested in.
++	 */
++	base_attr = class_attr_overridden(scsi_sysfs_shost_attrs, attr);
++	if (base_attr) {
++		/* extend permissions */
++		attr->attr.mode |= base_attr->attr.mode;
++
++		/* override null show/store with default */
++		if (!attr->show)
++			attr->show = base_attr->show;
++		if (!attr->store)
++			attr->store = base_attr->store;
++	}
++
++	return class_device_create_file(classdev, attr);
++}
++
+ /**
+  * scsi_sysfs_add_host - add scsi host to subsystem
+  * @shost:     scsi host struct to add to subsystem
+@@ -336,31 +417,44 @@ void scsi_sysfs_init_host(struct Scsi_Ho
+  **/
+ int scsi_sysfs_add_host(struct Scsi_Host *shost, struct device *dev)
+ {
+-	int i, error;
++	int error, i;
+ 
+-	if (!shost->host_gendev.parent)
+-		shost->host_gendev.parent = dev ? dev : &legacy_bus;
++	if (!shost->shost_gendev.parent)
++		shost->shost_gendev.parent = dev ? dev : &legacy_bus;
+ 
+-	error = device_add(&shost->host_gendev);
++	error = device_add(&shost->shost_gendev);
+ 	if (error)
+ 		return error;
+ 
+-	error = class_device_add(&shost->class_dev);
++	error = class_device_add(&shost->shost_classdev);
+ 	if (error)
+ 		goto clean_device;
+ 
+-	for (i = 0; !error && shost->hostt->shost_attrs[i] != NULL; i++)
+-		error = class_device_create_file(&shost->class_dev,
+-					   shost->hostt->shost_attrs[i]);
+-	if (error)
+-		goto clean_class;
++	if (shost->hostt->shost_attrs) {
++		for (i = 0; shost->hostt->shost_attrs[i]; i++) {
++			error = class_attr_add(&shost->shost_classdev,
++					shost->hostt->shost_attrs[i]);
++			if (error)
++				goto clean_class;
++		}
++	}
++
++	for (i = 0; scsi_sysfs_shost_attrs[i]; i++) {
++		if (!class_attr_overridden(shost->hostt->shost_attrs,
++					scsi_sysfs_shost_attrs[i])) {
++			error = class_device_create_file(&shost->shost_classdev,
++					scsi_sysfs_shost_attrs[i]);
++			if (error)
++				goto clean_class;
++		}
++	}
+ 
+ 	return error;
+ 
+ clean_class:
+-	class_device_del(&shost->class_dev);
++	class_device_del(&shost->shost_classdev);
+ clean_device:
+-	device_del(&shost->host_gendev);
++	device_del(&shost->shost_gendev);
+ 
+ 	return error;
+ }
+@@ -371,133 +465,6 @@ clean_device:
+  **/
+ void scsi_sysfs_remove_host(struct Scsi_Host *shost)
+ {
+-	class_device_del(&shost->class_dev);
+-	device_del(&shost->host_gendev);
+-}
+-
+-/** scsi_sysfs_modify_shost_attribute - modify or add a host class attribute
+- *
+- * @class_attrs:host class attribute list to be added to or modified
+- * @attr:	individual attribute to change or added
+- *
+- * returns zero if successful or error if not
+- **/
+-int scsi_sysfs_modify_shost_attribute(
+-			struct class_device_attribute ***class_attrs,
+-			struct class_device_attribute *attr)
+-{
+-	int modify = -1;
+-	int num_attrs;
+-
+-	if(*class_attrs == NULL)
+-		*class_attrs = scsi_sysfs_shost_attrs;
+-
+-	for(num_attrs=0; (*class_attrs)[num_attrs] != NULL; num_attrs++)
+-		if(strcmp((*class_attrs)[num_attrs]->attr.name,
+-				attr->attr.name) == 0)
+-			modify = num_attrs;
+-
+-	if(*class_attrs == scsi_sysfs_shost_attrs || modify < 0) {
+-		/* note: need space for null at the end as well */
+-		struct class_device_attribute **tmp_attrs =
+-				kmalloc(sizeof(*tmp_attrs) *
+-					  (num_attrs + (modify >= 0 ? 1 : 2)),
+-					GFP_KERNEL);
+-		if(tmp_attrs == NULL)
+-			return -ENOMEM;
+-		memcpy(tmp_attrs, *class_attrs, sizeof(*tmp_attrs) *
+-				(num_attrs + 1));
+-		if(*class_attrs != scsi_sysfs_shost_attrs)
+-			kfree(*class_attrs);
+-		*class_attrs = tmp_attrs;
+-	}
+-	if(modify >= 0) {
+-		/* spare the caller from having to copy things it's
+-		 * not interested in */
+-		struct class_device_attribute *old_attr =
+-			(*class_attrs)[modify];
+-		/* extend permissions */
+-		attr->attr.mode |= old_attr->attr.mode;
+-
+-		/* override null show/store with default */
+-		if(attr->show == NULL)
+-			attr->show = old_attr->show;
+-		if(attr->store == NULL)
+-			attr->store = old_attr->store;
+-		(*class_attrs)[modify] = attr;
+-	} else {
+-		(*class_attrs)[num_attrs++] = attr;
+-		(*class_attrs)[num_attrs] = NULL;
+-	}
+-
+-	return 0;
+-}
+-EXPORT_SYMBOL(scsi_sysfs_modify_shost_attribute);
+-
+-/** scsi_sysfs_modify_sdev_attribute - modify or add a host device attribute
+- *
+- * @dev_attrs:	pointer to the attribute list to be added to or modified
+- * @attr:	individual attribute to change or added
+- *
+- * returns zero if successful or error if not
+- **/
+-int scsi_sysfs_modify_sdev_attribute(struct device_attribute ***dev_attrs,
+-				     struct device_attribute *attr)
+-{
+-	int modify = -1;
+-	int num_attrs;
+-
+-	if(*dev_attrs == NULL)
+-		*dev_attrs = scsi_sysfs_sdev_attrs;
+-
+-	for(num_attrs=0; (*dev_attrs)[num_attrs] != NULL; num_attrs++)
+-		if(strcmp((*dev_attrs)[num_attrs]->attr.name,
+-				attr->attr.name) == 0)
+-			modify = num_attrs;
+-
+-	if(*dev_attrs == scsi_sysfs_sdev_attrs || modify < 0) {
+-		/* note: need space for null at the end as well */
+-		struct device_attribute **tmp_attrs =
+-				kmalloc(sizeof(*tmp_attrs) *
+-					  (num_attrs + (modify >= 0 ? 1 : 2)),
+-					GFP_KERNEL);
+-		if(tmp_attrs == NULL)
+-			return -ENOMEM;
+-		memcpy(tmp_attrs, *dev_attrs, sizeof(*tmp_attrs) *
+-				(num_attrs + 1));
+-		if(*dev_attrs != scsi_sysfs_sdev_attrs)
+-			kfree(*dev_attrs);
+-		*dev_attrs = tmp_attrs;
+-	}
+-	if(modify >= 0) {
+-		/* spare the caller from having to copy things it's
+-		 * not interested in */
+-		struct device_attribute *old_attr =
+-			(*dev_attrs)[modify];
+-		/* extend permissions */
+-		attr->attr.mode |= old_attr->attr.mode;
+-
+-		/* override null show/store with default */
+-		if(attr->show == NULL)
+-			attr->show = old_attr->show;
+-		if(attr->store == NULL)
+-			attr->store = old_attr->store;
+-		(*dev_attrs)[modify] = attr;
+-	} else {
+-		(*dev_attrs)[num_attrs++] = attr;
+-		(*dev_attrs)[num_attrs] = NULL;
+-	}
+-
+-	return 0;
+-}
+-EXPORT_SYMBOL(scsi_sysfs_modify_sdev_attribute);
+-
+-void scsi_sysfs_release_attributes(struct scsi_host_template *hostt)
+-{
+-	if(hostt->sdev_attrs != scsi_sysfs_sdev_attrs)
+-		kfree(hostt->sdev_attrs);
+-
+-	if(hostt->shost_attrs != scsi_sysfs_shost_attrs)
+-		kfree(hostt->shost_attrs);
++	class_device_del(&shost->shost_classdev);
++	device_del(&shost->shost_gendev);
+ }
+-EXPORT_SYMBOL(scsi_sysfs_release_attributes);
+--- linux-2.6.0-test1/drivers/scsi/sd.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/sd.c	2003-07-19 17:03:50.000000000 -0700
+@@ -43,7 +43,7 @@
+ #include <linux/init.h>
+ #include <linux/reboot.h>
+ #include <linux/vmalloc.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/blkpg.h>
+ #include <asm/uaccess.h>
+ 
+@@ -606,35 +606,8 @@ not_present:
+ 
+ static void sd_rescan(struct device *dev)
+ {
+-	struct scsi_device *sdp = to_scsi_device(dev);
+ 	struct scsi_disk *sdkp = dev_get_drvdata(dev);
+-	struct gendisk *gd;
+-	struct scsi_request *SRpnt;
+-	unsigned char *buffer;
+-
+-	if (!sdkp || sdp->online == FALSE || !sdkp->media_present)
+-		return;
+-		
+-	gd = sdkp->disk;
+-	
+-	SCSI_LOG_HLQUEUE(3, printk("sd_rescan: disk=%s\n", gd->disk_name));
+-	
+-	SRpnt = scsi_allocate_request(sdp);
+-	if (!SRpnt) {
+-		printk(KERN_WARNING "(sd_rescan:) Request allocation "
+-		       "failure.\n");
+-		return;
+-	}
+-
+-	if (sdkp->device->host->unchecked_isa_dma)
+-		buffer = kmalloc(512, GFP_DMA);
+-	else
+-		buffer = kmalloc(512, GFP_KERNEL);
+-
+-    	sd_read_capacity(sdkp, gd->disk_name, SRpnt, buffer);
+-	set_capacity(gd, sdkp->capacity);	
+-	scsi_release_request(SRpnt);
+-	kfree(buffer);
++	sd_revalidate_disk(sdkp->disk);
+ }
+ 
+ static struct block_device_operations sd_fops = {
+@@ -1318,7 +1291,7 @@ static int sd_probe(struct device *dev)
+ 
+ 	sd_revalidate_disk(gd);
+ 
+-	gd->driverfs_dev = &sdp->sdev_driverfs_dev;
++	gd->driverfs_dev = &sdp->sdev_gendev;
+ 	gd->flags = GENHD_FL_DRIVERFS;
+ 	if (sdp->removable)
+ 		gd->flags |= GENHD_FL_REMOVABLE;
+--- linux-2.6.0-test1/drivers/scsi/seagate.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/seagate.c	2003-07-19 17:03:50.000000000 -0700
+@@ -95,7 +95,7 @@
+ #include <linux/proc_fs.h>
+ #include <linux/init.h>
+ #include <linux/delay.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/stat.h>
+ 
+ #include <asm/io.h>
+--- linux-2.6.0-test1/drivers/scsi/sg.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/sg.c	2003-07-19 17:06:39.000000000 -0700
+@@ -61,7 +61,7 @@ static int sg_version_num = 30529;	/* 2 
+ #include <asm/uaccess.h>
+ #include <asm/system.h>
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+ #include <scsi/scsi_driver.h>
+@@ -83,7 +83,7 @@ static void sg_proc_cleanup(void);
+ #define SG_ALLOW_DIO_DEF 0
+ #define SG_ALLOW_DIO_CODE /* compile out by commenting this define */
+ 
+-#define SG_MAX_DEVS_MASK ((1U << KDEV_MINOR_BITS) - 1)
++#define SG_MAX_DEVS_MASK 255
+ 
+ /*
+  * Suppose you want to calculate the formula muldiv(x,m,d)=int(x * m / d)
+--- linux-2.6.0-test1/drivers/scsi/sgiwd93.c	2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/scsi/sgiwd93.c	2003-07-19 17:03:50.000000000 -0700
+@@ -15,7 +15,7 @@
+ #include <linux/init.h>
+ #include <linux/types.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/version.h>
+ #include <linux/delay.h>
+ #include <linux/spinlock.h>
+--- linux-2.6.0-test1/drivers/scsi/sim710.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/sim710.c	2003-07-19 17:03:50.000000000 -0700
+@@ -29,7 +29,7 @@
+ #include <linux/config.h>
+ #include <linux/module.h>
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/device.h>
+ #include <linux/init.h>
+ #include <linux/mca.h>
+@@ -138,7 +138,8 @@ sim710_probe_common(struct device *dev, 
+ 		goto out_unregister;
+ 	}
+ 
+-	scsi_add_host(host, dev);
++	scsi_add_host(host, dev); /* XXX handle failure */
++	scsi_scan_host(host);
+ 	hostdata->dev = dev;
+ 
+ 	return 0;
+--- linux-2.6.0-test1/drivers/scsi/sr.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/sr.c	2003-07-19 17:06:39.000000000 -0700
+@@ -43,7 +43,7 @@
+ #include <linux/cdrom.h>
+ #include <linux/interrupt.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/uaccess.h>
+ 
+ #include "scsi.h"
+@@ -59,7 +59,7 @@
+ MODULE_PARM(xa_test, "i");	/* see sr_ioctl.c */
+ 
+ 
+-#define SR_DISKS	(1 << KDEV_MINOR_BITS)
++#define SR_DISKS	256
+ 
+ #define MAX_RETRIES	3
+ #define SR_TIMEOUT	(30 * HZ)
+@@ -533,7 +533,7 @@ static int sr_probe(struct device *dev)
+ 
+ 	snprintf(disk->devfs_name, sizeof(disk->devfs_name),
+ 			"%s/cd", sdev->devfs_name);
+-	disk->driverfs_dev = &sdev->sdev_driverfs_dev;
++	disk->driverfs_dev = &sdev->sdev_gendev;
+ 	register_cdrom(&cd->cdi);
+ 	set_capacity(disk, cd->capacity);
+ 	disk->private_data = &cd->driver;
+--- linux-2.6.0-test1/drivers/scsi/sr_ioctl.c	2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/scsi/sr_ioctl.c	2003-07-19 17:03:50.000000000 -0700
+@@ -4,7 +4,7 @@
+ #include <linux/fs.h>
+ #include <linux/errno.h>
+ #include <linux/string.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/blkpg.h>
+ #include <linux/cdrom.h>
+ #include <asm/io.h>
+--- linux-2.6.0-test1/drivers/scsi/sr_vendor.c	2003-06-14 12:18:09.000000000 -0700
++++ 25/drivers/scsi/sr_vendor.c	2003-07-19 17:03:50.000000000 -0700
+@@ -39,7 +39,7 @@
+ #include <linux/string.h>
+ #include <linux/bcd.h>
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+ #include <scsi/scsi_ioctl.h>
+--- linux-2.6.0-test1/drivers/scsi/st.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/st.c	2003-07-19 17:03:50.000000000 -0700
+@@ -32,7 +32,7 @@ static char *verstr = "20030622";
+ #include <linux/ioctl.h>
+ #include <linux/fcntl.h>
+ #include <linux/spinlock.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/moduleparam.h>
+ #include <linux/devfs_fs_kernel.h>
+ #include <asm/uaccess.h>
+--- linux-2.6.0-test1/drivers/scsi/sun3_scsi.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/scsi/sun3_scsi.c	2003-07-19 17:03:50.000000000 -0700
+@@ -61,7 +61,7 @@
+ #include <linux/sched.h>
+ #include <linux/ioport.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ 
+ #include <asm/io.h>
+ #include <asm/system.h>
+--- linux-2.6.0-test1/drivers/scsi/sun3_scsi_vme.c	2003-06-14 12:18:52.000000000 -0700
++++ 25/drivers/scsi/sun3_scsi_vme.c	2003-07-19 17:03:50.000000000 -0700
+@@ -23,7 +23,7 @@
+ #include <linux/sched.h>
+ #include <linux/ioport.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ 
+ #include <asm/io.h>
+ #include <asm/system.h>
+--- linux-2.6.0-test1/drivers/scsi/sun3x_esp.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/sun3x_esp.c	2003-07-19 17:03:50.000000000 -0700
+@@ -9,7 +9,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/delay.h>
+--- linux-2.6.0-test1/drivers/scsi/sym53c416.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/sym53c416.c	2003-07-19 17:03:50.000000000 -0700
+@@ -40,7 +40,7 @@
+ #include <asm/dma.h>
+ #include <asm/system.h>
+ #include <asm/io.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/version.h>
+ #include <linux/isapnp.h>
+ #include "scsi.h"
+--- linux-2.6.0-test1/drivers/scsi/sym53c8xx_2/sym_glue.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/sym53c8xx_2/sym_glue.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1110,6 +1110,7 @@ static int sym_eh_handler(int op, char *
+ 	int sts = -1;
+ 	struct sym_eh_wait eh, *ep = &eh;
+ 	char devname[20];
++	unsigned long flags;
+ 
+ 	sprintf(devname, "%s:%d:%d", sym_name(np), cmd->device->id, cmd->device->lun);
+ 
+@@ -1201,7 +1202,11 @@ finish:
+ 		ep->timer.data = (u_long)cmd;
+ 		ep->timed_out = 1;	/* Be pessimistic for once :) */
+ 		add_timer(&ep->timer);
++		local_save_flags(flags);
++		spin_unlock_irq(cmd->device->host->host_lock);
+ 		down(&ep->sem);
++		local_irq_restore(flags);
++		spin_lock(cmd->device->host->host_lock);
+ 		if (ep->timed_out)
+ 			sts = -2;
+ 	}
+--- linux-2.6.0-test1/drivers/scsi/sym53c8xx_2/sym_glue.h	2003-06-14 12:18:51.000000000 -0700
++++ 25/drivers/scsi/sym53c8xx_2/sym_glue.h	2003-07-19 17:03:50.000000000 -0700
+@@ -84,7 +84,7 @@
+ #include <linux/stat.h>
+ #include <linux/interrupt.h>
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ 
+ #ifdef __sparc__
+ #  include <asm/irq.h>
+--- linux-2.6.0-test1/drivers/scsi/sym53c8xx_2/sym_hipd.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/sym53c8xx_2/sym_hipd.c	2003-07-19 17:04:52.000000000 -0700
+@@ -800,7 +800,8 @@ static int sym_prepare_setting(hcb_p np,
+ 	 * Btw, 'period' is in tenths of nanoseconds.
+ 	 */
+ 	period = (4 * div_10M[0] + np->clock_khz - 1) / np->clock_khz;
+-	if	(period <= 250)		np->minsync = 10;
++	if	(period == 250)		np->minsync = 9;
++	else if	(period <= 250)		np->minsync = 10;
+ 	else if	(period <= 303)		np->minsync = 11;
+ 	else if	(period <= 500)		np->minsync = 12;
+ 	else				np->minsync = (period + 40 - 1) / 40;
+--- linux-2.6.0-test1/drivers/scsi/sym53c8xx.c	2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/scsi/sym53c8xx.c	2003-07-19 17:03:50.000000000 -0700
+@@ -123,7 +123,7 @@
+ #include <linux/timer.h>
+ #include <linux/stat.h>
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ 
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,35)
+ #include <linux/init.h>
+@@ -1327,7 +1327,7 @@ MODULE_PARM(sym53c8xx, "s");
+ #define SetScsiAbortResult(cmd) SetScsiResult(cmd, DID_ABORT, 0xff)
+ #endif
+ 
+-static void sym53c8xx_intr(int irq, void *dev_id, struct pt_regs * regs);
++static irqreturn_t sym53c8xx_intr(int irq, void *dev_id, struct pt_regs * regs);
+ static void sym53c8xx_timeout(unsigned long np);
+ 
+ #define initverbose (driver_setup.verbose)
+@@ -7374,7 +7374,7 @@ void ncr_complete (ncb_p np, ccb_p cp)
+ 		}
+ 		if (cp->xerr_status & XE_BAD_PHASE) {
+ 			PRINT_ADDR(cmd);
+-			printk ("illegal scsi phase (4/5).\n");
++			printk ("invalid scsi phase (4/5).\n");
+ 		}
+ 		if (cp->xerr_status & XE_SODL_UNRUN) {
+ 			PRINT_ADDR(cmd);
+@@ -13660,7 +13660,7 @@ printk("sym53c8xx : command successfully
+ **   routine for each host that uses this IRQ.
+ */
+ 
+-static void sym53c8xx_intr(int irq, void *dev_id, struct pt_regs * regs)
++static irqreturn_t sym53c8xx_intr(int irq, void *dev_id, struct pt_regs * regs)
+ {
+      unsigned long flags;
+      ncb_p np = (ncb_p) dev_id;
+@@ -13685,6 +13685,7 @@ static void sym53c8xx_intr(int irq, void
+           ncr_flush_done_cmds(done_list);
+           NCR_UNLOCK_SCSI_DONE(done_list->device->host, flags);
+      }
++     return IRQ_HANDLED;
+ }
+ 
+ /*
+--- linux-2.6.0-test1/drivers/scsi/t128.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/t128.c	2003-07-19 17:03:50.000000000 -0700
+@@ -110,7 +110,7 @@
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ #include <asm/io.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/stat.h>
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/tmscsim.c	2003-06-14 12:18:52.000000000 -0700
++++ 25/drivers/scsi/tmscsim.c	2003-07-19 17:03:50.000000000 -0700
+@@ -224,7 +224,7 @@
+ #include <linux/mm.h>
+ #include <linux/config.h>
+ #include <linux/version.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/timer.h>
+ 
+ #include "scsi.h"
+--- linux-2.6.0-test1/drivers/scsi/u14-34f.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/u14-34f.c	2003-07-19 17:03:50.000000000 -0700
+@@ -414,7 +414,7 @@
+ #include <asm/system.h>
+ #include <asm/byteorder.h>
+ #include <linux/proc_fs.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/stat.h>
+ #include <linux/pci.h>
+--- linux-2.6.0-test1/drivers/scsi/ultrastor.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/ultrastor.c	2003-07-19 17:03:50.000000000 -0700
+@@ -128,7 +128,7 @@
+  */
+ 
+ #include <linux/module.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/stddef.h>
+ #include <linux/string.h>
+--- linux-2.6.0-test1/drivers/scsi/wd33c93.c	2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/scsi/wd33c93.c	2003-07-19 17:03:50.000000000 -0700
+@@ -79,7 +79,7 @@
+ #include <linux/delay.h>
+ #include <linux/version.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/irq.h>
+ 
+ #include "scsi.h"
+--- linux-2.6.0-test1/drivers/scsi/wd7000.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/wd7000.c	2003-07-19 17:03:50.000000000 -0700
+@@ -174,7 +174,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/ioport.h>
+ #include <linux/proc_fs.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/init.h>
+ #include <linux/stat.h>
+ 
+--- linux-2.6.0-test1/drivers/scsi/zalon.c	2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/zalon.c	2003-07-19 17:03:50.000000000 -0700
+@@ -7,7 +7,7 @@
+ #include <linux/types.h>
+ #include <linux/stat.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/sched.h>
+ #include <linux/version.h>
+ #include <linux/config.h>
+@@ -85,7 +85,7 @@ zalon_scsi_callback(struct parisc_device
+ {
+ 	struct gsc_irq gsc_irq;
+ 	u32 zalon_vers;
+-	int irq;
++	int irq, error = -ENODEV;
+ 	unsigned long zalon = dev->hpa;
+ 	unsigned long io_port = zalon + GSC_SCSI_ZALON_OFFSET;
+ 	static int unit = 0;
+@@ -147,11 +147,18 @@ zalon_scsi_callback(struct parisc_device
+ 
+ 	dev_set_drvdata(&dev->dev, host);
+ 
+-	scsi_add_host(host, &dev->dev);
++	error = scsi_add_host(host, &dev->dev);
++	if (error)
++		goto fail_free_irq;
+ 
++	scsi_scan_host(host);
+ 	return 0;
++
++ fail_free_irq:
++	free_irq(irq, host);
+  fail:
+-	return -ENODEV;
++	ncr53c8xx_release(host);
++	return error;
+ }
+ 
+ static struct parisc_device_id zalon_tbl[] = {
+--- linux-2.6.0-test1/drivers/serial/8250.c	2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/serial/8250.c	2003-07-19 17:04:02.000000000 -0700
+@@ -823,7 +823,7 @@ receive_chars(struct uart_8250_port *up,
+ 		if (unlikely(tty->flip.count >= TTY_FLIPBUF_SIZE)) {
+ 			tty->flip.work.func((void *)tty);
+ 			if (tty->flip.count >= TTY_FLIPBUF_SIZE)
+-				return; // if TTY_DONT_FLIP is set
++				return;	/* if TTY_DONT_FLIP is set */
+ 		}
+ 		ch = serial_inp(up, UART_RX);
+ 		*tty->flip.char_buf_ptr = ch;
+@@ -1183,13 +1183,20 @@ static void serial8250_break_ctl(struct 
+ 	serial_out(up, UART_LCR, up->lcr);
+ 	spin_unlock_irqrestore(&up->port.lock, flags);
+ }
++#ifdef CONFIG_KGDB
++static int kgdb_irq = -1;
++#endif
+ 
+ static int serial8250_startup(struct uart_port *port)
+ {
+ 	struct uart_8250_port *up = (struct uart_8250_port *)port;
+ 	unsigned long flags;
+ 	int retval;
+-
++#ifdef CONFIG_KGDB
++	if ( up->port.irq == kgdb_irq){
++		return -EBUSY;
++	}
++#endif
+ 	if (up->port.type == PORT_16C950) {
+ 		/* Wake up and initialize UART */
+ 		up->acr = 0;
+@@ -1853,6 +1860,11 @@ static void __init serial8250_register_p
+ 	for (i = 0; i < UART_NR; i++) {
+ 		struct uart_8250_port *up = &serial8250_ports[i];
+ 
++#ifdef CONFIG_KGDB
++		if(up->port.irq == kgdb_irq){
++			up->port.iobase = up->port.mapbase = 0;
++		}
++#endif
+ 		up->port.line = i;
+ 		up->port.ops = &serial8250_pops;
+ 		init_timer(&up->timer);
+@@ -2116,7 +2128,31 @@ void serial8250_resume_port(int line, u3
+ {
+ 	uart_resume_port(&serial8250_reg, &serial8250_ports[line].port, level);
+ }
+-
++#ifdef CONFIG_KGDB
++/*
++ * Find all the ports using the given irq and shut them down.
++ * Result should be that the irq will be released.
++ */
++void shutdown_for_kgdb(struct async_struct * info)
++{
++        int irq = info->state->irq;
++        struct uart_8250_port *up;
++	int ttyS;
++
++	kgdb_irq = irq;			/* save for later init */
++	for (ttyS = 0; ttyS < UART_NR; ttyS++){
++		up =  &serial8250_ports[ttyS];
++		if( up->port.irq == irq && (irq_lists + irq)->head){
++#ifdef CONFIG_DEBUG_SPINLOCK   /* ugly business... */
++			if(up->port.lock.magic != SPINLOCK_MAGIC){
++				spin_lock_init(&up->port.lock);
++			}
++#endif
++			serial8250_shutdown(&up->port);
++		}
++        }
++}
++#endif
+ static int __init serial8250_init(void)
+ {
+ 	int ret, i;
+--- linux-2.6.0-test1/drivers/serial/core.c	2003-07-10 18:50:31.000000000 -0700
++++ 25/drivers/serial/core.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1667,23 +1667,25 @@ static int uart_line_info(char *buf, str
+ 		return ret + 1;
+ 	}
+ 
+-	status = port->ops->get_mctrl(port);
+-
+-	ret += sprintf(buf + ret, " tx:%d rx:%d",
+-			port->icount.tx, port->icount.rx);
+-	if (port->icount.frame)
+-		ret += sprintf(buf + ret, " fe:%d",
+-			port->icount.frame);
+-	if (port->icount.parity)
+-		ret += sprintf(buf + ret, " pe:%d",
+-			port->icount.parity);
+-	if (port->icount.brk)
+-		ret += sprintf(buf + ret, " brk:%d",
+-			port->icount.brk);
+-	if (port->icount.overrun)
+-		ret += sprintf(buf + ret, " oe:%d",
+-			port->icount.overrun);
+-
++	if(capable(CAP_SYS_ADMIN))
++	{
++		status = port->ops->get_mctrl(port);
++
++		ret += sprintf(buf + ret, " tx:%d rx:%d",
++				port->icount.tx, port->icount.rx);
++		if (port->icount.frame)
++			ret += sprintf(buf + ret, " fe:%d",
++				port->icount.frame);
++		if (port->icount.parity)
++			ret += sprintf(buf + ret, " pe:%d",
++				port->icount.parity);
++		if (port->icount.brk)
++			ret += sprintf(buf + ret, " brk:%d",
++				port->icount.brk);
++		if (port->icount.overrun)
++			ret += sprintf(buf + ret, " oe:%d",
++				port->icount.overrun);
++	
+ #define INFOBIT(bit,str) \
+ 	if (port->mctrl & (bit)) \
+ 		strncat(stat_buf, (str), sizeof(stat_buf) - \
+@@ -1693,19 +1695,22 @@ static int uart_line_info(char *buf, str
+ 		strncat(stat_buf, (str), sizeof(stat_buf) - \
+ 		       strlen(stat_buf) - 2)
+ 
+-	stat_buf[0] = '\0';
+-	stat_buf[1] = '\0';
+-	INFOBIT(TIOCM_RTS, "|RTS");
+-	STATBIT(TIOCM_CTS, "|CTS");
+-	INFOBIT(TIOCM_DTR, "|DTR");
+-	STATBIT(TIOCM_DSR, "|DSR");
+-	STATBIT(TIOCM_CAR, "|CD");
+-	STATBIT(TIOCM_RNG, "|RI");
+-	if (stat_buf[0])
+-		stat_buf[0] = ' ';
+-	strcat(stat_buf, "\n");
+-
+-	ret += sprintf(buf + ret, stat_buf);
++		stat_buf[0] = '\0';
++		stat_buf[1] = '\0';
++		INFOBIT(TIOCM_RTS, "|RTS");
++		STATBIT(TIOCM_CTS, "|CTS");
++		INFOBIT(TIOCM_DTR, "|DTR");
++		STATBIT(TIOCM_DSR, "|DSR");
++		STATBIT(TIOCM_CAR, "|CD");
++		STATBIT(TIOCM_RNG, "|RI");
++		if (stat_buf[0])
++			stat_buf[0] = ' ';
++		strcat(stat_buf, "\n");
++	
++		ret += sprintf(buf + ret, stat_buf);
++	}
++#undef STATBIT
++#undef INFOBIT
+ 	return ret;
+ }
+ 
+--- linux-2.6.0-test1/drivers/serial/Kconfig	2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/serial/Kconfig	2003-07-19 17:03:50.000000000 -0700
+@@ -404,14 +404,19 @@ config SERIAL_SUNSAB_CONSOLE
+ 	  on your Sparc system as the console, you can do so by answering
+ 	  Y to this option.
+ 
+-config V850E_NB85E_UART
++config V850E_UART
+ 	bool "NEC V850E on-chip UART support"
+-	depends on V850E_NB85E || V850E2_ANNA || V850E_AS85EP1
++	depends on V850E_MA1 || V850E_ME2 || V850E_TEG || V850E2_ANNA || V850E_AS85EP1
+ 	default y
+ 
+-config V850E_NB85E_UART_CONSOLE
++config V850E_UARTB
++        bool
++	depends V850E_UART && V850E_ME2
++	default y
++
++config V850E_UART_CONSOLE
+ 	bool "Use NEC V850E on-chip UART for console"
+-	depends on V850E_NB85E_UART
++	depends on V850E_UART
+ 
+ config SERIAL98
+ 	tristate "PC-9800 8251-based primary serial port support"
+@@ -426,12 +431,12 @@ config SERIAL98_CONSOLE
+ 
+ config SERIAL_CORE
+ 	tristate
+-	default m if SERIAL_AMBA!=y && SERIAL_CLPS711X!=y && SERIAL_21285!=y && !SERIAL_SA1100 && !SERIAL_ANAKIN && !SERIAL_UART00 && SERIAL_8250!=y && SERIAL_MUX!=y && !SERIAL_ROCKETPORT && !SERIAL_SUNCORE && !V850E_NB85E_UART && (SERIAL_AMBA=m || SERIAL_CLPS711X=m || SERIAL_21285=m || SERIAL_8250=m || SERIAL_MUX=m || SERIAL98=m)
+-	default y if SERIAL_AMBA=y || SERIAL_CLPS711X=y || SERIAL_21285=y || SERIAL_SA1100 || SERIAL_ANAKIN || SERIAL_UART00 || SERIAL_8250=y || SERIAL_MUX=y || SERIAL_ROCKETPORT || SERIAL_SUNCORE || V850E_NB85E_UART || SERIAL98=y
++	default m if SERIAL_AMBA!=y && SERIAL_CLPS711X!=y && SERIAL_21285!=y && !SERIAL_SA1100 && !SERIAL_ANAKIN && !SERIAL_UART00 && SERIAL_8250!=y && SERIAL_MUX!=y && !SERIAL_ROCKETPORT && !SERIAL_SUNCORE && !V850E_UART && (SERIAL_AMBA=m || SERIAL_CLPS711X=m || SERIAL_21285=m || SERIAL_8250=m || SERIAL_MUX=m || SERIAL98=m)
++	default y if SERIAL_AMBA=y || SERIAL_CLPS711X=y || SERIAL_21285=y || SERIAL_SA1100 || SERIAL_ANAKIN || SERIAL_UART00 || SERIAL_8250=y || SERIAL_MUX=y || SERIAL_ROCKETPORT || SERIAL_SUNCORE || V850E_UART || SERIAL98=y
+ 
+ config SERIAL_CORE_CONSOLE
+ 	bool
+-	depends on SERIAL_AMBA_CONSOLE || SERIAL_CLPS711X_CONSOLE || SERIAL_21285_CONSOLE || SERIAL_SA1100_CONSOLE || SERIAL_ANAKIN_CONSOLE || SERIAL_UART00_CONSOLE || SERIAL_8250_CONSOLE || SERIAL_MUX_CONSOLE || SERIAL_SUNZILOG_CONSOLE || SERIAL_SUNSU_CONSOLE || SERIAL_SUNSAB_CONSOLE || V850E_NB85E_UART_CONSOLE || SERIAL98_CONSOLE
++	depends on SERIAL_AMBA_CONSOLE || SERIAL_CLPS711X_CONSOLE || SERIAL_21285_CONSOLE || SERIAL_SA1100_CONSOLE || SERIAL_ANAKIN_CONSOLE || SERIAL_UART00_CONSOLE || SERIAL_8250_CONSOLE || SERIAL_MUX_CONSOLE || SERIAL_SUNZILOG_CONSOLE || SERIAL_SUNSU_CONSOLE || SERIAL_SUNSAB_CONSOLE || V850E_UART_CONSOLE || SERIAL98_CONSOLE
+ 	default y
+ 
+ config SERIAL_68328
+--- linux-2.6.0-test1/drivers/serial/Makefile	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/serial/Makefile	2003-07-19 17:03:50.000000000 -0700
+@@ -29,5 +29,5 @@ obj-$(CONFIG_SERIAL_MUX) += mux.o
+ obj-$(CONFIG_SERIAL_68328) += 68328serial.o
+ obj-$(CONFIG_SERIAL_68360) += 68360serial.o
+ obj-$(CONFIG_SERIAL_COLDFIRE) += mcfserial.o
+-obj-$(CONFIG_V850E_NB85E_UART) += nb85e_uart.o
++obj-$(CONFIG_V850E_UART) += v850e_uart.o
+ obj-$(CONFIG_SERIAL98) += serial98.o
+--- linux-2.6.0-test1/drivers/serial/nb85e_uart.c	2003-06-14 12:18:30.000000000 -0700
++++ /dev/null	2002-08-30 16:31:37.000000000 -0700
+@@ -1,610 +0,0 @@
+-/*
+- * drivers/serial/nb85e_uart.c -- Serial I/O using V850E/NB85E on-chip UART
+- *
+- *  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
+- * archive for more details.
+- *
+- * Written by Miles Bader <miles@gnu.org>
+- */
+-
+-#include <linux/kernel.h>
+-#include <linux/init.h>
+-#include <linux/module.h>
+-#include <linux/console.h>
+-#include <linux/tty.h>
+-#include <linux/tty_flip.h>
+-#include <linux/serial.h>
+-#include <linux/serial_core.h>
+-
+-#include <asm/nb85e_uart.h>
+-#include <asm/nb85e_utils.h>
+-
+-/* Initial UART state.  This may be overridden by machine-dependent headers. */
+-#ifndef NB85E_UART_INIT_BAUD
+-#define NB85E_UART_INIT_BAUD	115200
+-#endif
+-#ifndef NB85E_UART_INIT_CFLAGS
+-#define NB85E_UART_INIT_CFLAGS	(B115200 | CS8 | CREAD)
+-#endif
+-
+-/* XXX This should be in a header file.  */
+-#define NB85E_UART_BRGC_MIN	8
+-
+-/* A string used for prefixing printed descriptions; since the same UART
+-   macro is actually used on other chips than the V850E/NB85E.  This must
+-   be a constant string.  */
+-#ifndef NB85E_UART_CHIP_NAME
+-#define NB85E_UART_CHIP_NAME "V850E/NB85E"
+-#endif
+-
+-
+-/* Helper functions for doing baud-rate/frequency calculations.  */
+-
+-/* Calculate the minimum value for CKSR on this processor.  */
+-static inline unsigned cksr_min (void)
+-{
+-	int min = 0;
+-	unsigned freq = NB85E_UART_BASE_FREQ;
+-	while (freq > NB85E_UART_CKSR_MAX_FREQ) {
+-		freq >>= 1;
+-		min++;
+-	}
+-	return min;
+-}
+-
+-/* Minimum baud rate possible.  */
+-#define min_baud() \
+-   ((NB85E_UART_BASE_FREQ >> NB85E_UART_CKSR_MAX) / (2 * 255) + 1)
+-
+-/* Maximum baud rate possible.  The error is quite high at max, though.  */
+-#define max_baud() \
+-   ((NB85E_UART_BASE_FREQ >> cksr_min()) / (2 * NB85E_UART_BRGC_MIN))
+-
+-
+-/* Low-level UART functions.  */
+-
+-/* These masks define which control bits affect TX/RX modes, respectively.  */
+-#define RX_BITS \
+-  (NB85E_UART_ASIM_PS_MASK | NB85E_UART_ASIM_CL_8 | NB85E_UART_ASIM_ISRM)
+-#define TX_BITS \
+-  (NB85E_UART_ASIM_PS_MASK | NB85E_UART_ASIM_CL_8 | NB85E_UART_ASIM_SL_2)
+-
+-/* The UART require various delays after writing control registers.  */
+-static inline void nb85e_uart_delay (unsigned cycles)
+-{
+-	/* The loop takes 2 insns, so loop CYCLES / 2 times.  */
+-	register unsigned count = cycles >> 1;
+-	while (--count != 0)
+-		/* nothing */;
+-}
+-
+-/* Configure and turn on uart channel CHAN, using the termios `control
+-   modes' bits in CFLAGS, and a baud-rate of BAUD.  */
+-void nb85e_uart_configure (unsigned chan, unsigned cflags, unsigned baud)
+-{
+-	int flags;
+-	unsigned new_config = 0; /* What we'll write to the control reg. */
+-	unsigned new_clk_divlog2; /* New baud-rate generate clock divider. */
+-	unsigned new_brgen_count; /* New counter max for baud-rate generator.*/
+-	/* These are the current values corresponding to the above.  */
+-	unsigned old_config, old_clk_divlog2, old_brgen_count;
+-
+-	/* Calculate new baud-rate generator config values.  */
+-
+-	/* Calculate the log2 clock divider and baud-rate counter values
+-	   (note that the UART divides the resulting clock by 2, so
+-	   multiply BAUD by 2 here to compensate).  */
+-	calc_counter_params (NB85E_UART_BASE_FREQ, baud * 2,
+-			     cksr_min(), NB85E_UART_CKSR_MAX, 8/*bits*/,
+-			     &new_clk_divlog2, &new_brgen_count);
+-
+-	/* Figure out new configuration of control register.  */
+-	if (cflags & CSTOPB)
+-		/* Number of stop bits, 1 or 2.  */
+-		new_config |= NB85E_UART_ASIM_SL_2;
+-	if ((cflags & CSIZE) == CS8)
+-		/* Number of data bits, 7 or 8.  */
+-		new_config |= NB85E_UART_ASIM_CL_8;
+-	if (! (cflags & PARENB))
+-		/* No parity check/generation.  */
+-		new_config |= NB85E_UART_ASIM_PS_NONE;
+-	else if (cflags & PARODD)
+-		/* Odd parity check/generation.  */
+-		new_config |= NB85E_UART_ASIM_PS_ODD;
+-	else
+-		/* Even parity check/generation.  */
+-		new_config |= NB85E_UART_ASIM_PS_EVEN;
+-	if (cflags & CREAD)
+-		/* Reading enabled.  */
+-		new_config |= NB85E_UART_ASIM_RXE;
+-
+-	new_config |= NB85E_UART_ASIM_TXE; /* Writing is always enabled.  */
+-	new_config |= NB85E_UART_ASIM_CAE;
+-	new_config |= NB85E_UART_ASIM_ISRM; /* Errors generate a read-irq.  */
+-
+-	/* Disable interrupts while we're twiddling the hardware.  */
+-	local_irq_save (flags);
+-
+-#ifdef NB85E_UART_PRE_CONFIGURE
+-	NB85E_UART_PRE_CONFIGURE (chan, cflags, baud);
+-#endif
+-
+-	old_config = NB85E_UART_ASIM (chan);
+-	old_clk_divlog2 = NB85E_UART_CKSR (chan);
+-	old_brgen_count = NB85E_UART_BRGC (chan);
+-
+-	if (new_clk_divlog2 != old_clk_divlog2
+-	    || new_brgen_count != old_brgen_count)
+-	{
+-		/* The baud rate has changed.  First, disable the UART.  */
+-		NB85E_UART_ASIM (chan) = 0;
+-		old_config = 0;
+-		/* Reprogram the baud-rate generator.  */
+-		NB85E_UART_CKSR (chan) = new_clk_divlog2;
+-		NB85E_UART_BRGC (chan) = new_brgen_count;
+-	}
+-
+-	if (! (old_config & NB85E_UART_ASIM_CAE)) {
+-		/* If we are enabling the uart for the first time, start
+-		   by turning on the enable bit, which must be done
+-		   before turning on any other bits.  */
+-		NB85E_UART_ASIM (chan) = NB85E_UART_ASIM_CAE;
+-		/* Enabling the uart also resets it.  */
+-		old_config = NB85E_UART_ASIM_CAE;
+-	}
+-
+-	if (new_config != old_config) {
+-		/* Which of the TXE/RXE bits we'll temporarily turn off
+-		   before changing other control bits.  */
+-		unsigned temp_disable = 0;
+-		/* Which of the TXE/RXE bits will be enabled.  */
+-		unsigned enable = 0;
+-		unsigned changed_bits = new_config ^ old_config;
+-
+-		/* Which of RX/TX will be enabled in the new configuration.  */
+-		if (new_config & RX_BITS)
+-			enable |= (new_config & NB85E_UART_ASIM_RXE);
+-		if (new_config & TX_BITS)
+-			enable |= (new_config & NB85E_UART_ASIM_TXE);
+-
+-		/* Figure out which of RX/TX needs to be disabled; note
+-		   that this will only happen if they're not already
+-		   disabled.  */
+-		if (changed_bits & RX_BITS)
+-			temp_disable |= (old_config & NB85E_UART_ASIM_RXE);
+-		if (changed_bits & TX_BITS)
+-			temp_disable |= (old_config & NB85E_UART_ASIM_TXE);
+-
+-		/* We have to turn off RX and/or TX mode before changing
+-		   any associated control bits.  */
+-		if (temp_disable)
+-			NB85E_UART_ASIM (chan) = old_config & ~temp_disable;
+-
+-		/* Write the new control bits, while RX/TX are disabled. */ 
+-		if (changed_bits & ~enable)
+-			NB85E_UART_ASIM (chan) = new_config & ~enable;
+-
+-		/* The UART may not be reset properly unless we
+-		   wait at least 2 `basic-clocks' until turning
+-		   on the TXE/RXE bits again.  A `basic clock'
+-		   is the clock used by the baud-rate generator, i.e.,
+-		   the cpu clock divided by the 2^new_clk_divlog2.  */
+-		nb85e_uart_delay (1 << (new_clk_divlog2 + 1));
+-
+-		/* Write the final version, with enable bits turned on.  */
+-		NB85E_UART_ASIM (chan) = new_config;
+-	}
+-
+-	local_irq_restore (flags);
+-}
+-
+-
+-/*  Low-level console. */
+-
+-#ifdef CONFIG_V850E_NB85E_UART_CONSOLE
+-
+-static void nb85e_uart_cons_write (struct console *co,
+-				   const char *s, unsigned count)
+-{
+-	if (count > 0) {
+-		unsigned chan = co->index;
+-		unsigned irq = IRQ_INTST (chan);
+-		int irq_was_enabled, irq_was_pending, flags;
+-
+-		/* We don't want to get `transmission completed' (INTST)
+-		   interrupts, since we're busy-waiting, so we disable
+-		   them while sending (we don't disable interrupts
+-		   entirely because sending over a serial line is really
+-		   slow).  We save the status of INTST and restore it
+-		   when we're done so that using printk doesn't
+-		   interfere with normal serial transmission (other than
+-		   interleaving the output, of course!).  This should
+-		   work correctly even if this function is interrupted
+-		   and the interrupt printks something.  */
+-
+-		/* Disable interrupts while fiddling with INTST.  */
+-		local_irq_save (flags);
+-		/* Get current INTST status.  */
+-		irq_was_enabled = nb85e_intc_irq_enabled (irq);
+-		irq_was_pending = nb85e_intc_irq_pending (irq);
+-		/* Disable INTST if necessary.  */
+-		if (irq_was_enabled)
+-			nb85e_intc_disable_irq (irq);
+-		/* Turn interrupts back on.  */
+-		local_irq_restore (flags);
+-
+-		/* Send characters.  */
+-		while (count > 0) {
+-			int ch = *s++;
+-
+-			if (ch == '\n') {
+-				/* We don't have the benefit of a tty
+-				   driver, so translate NL into CR LF.  */
+-				nb85e_uart_wait_for_xmit_ok (chan);
+-				nb85e_uart_putc (chan, '\r');
+-			}
+-
+-			nb85e_uart_wait_for_xmit_ok (chan);
+-			nb85e_uart_putc (chan, ch);
+-
+-			count--;
+-		}
+-
+-		/* Restore saved INTST status.  */
+-		if (irq_was_enabled) {
+-			/* Wait for the last character we sent to be
+-			   completely transmitted (as we'll get an INTST
+-			   interrupt at that point).  */
+-			nb85e_uart_wait_for_xmit_done (chan);
+-			/* Clear pending interrupts received due
+-			   to our transmission, unless there was already
+-			   one pending, in which case we want the
+-			   handler to be called.  */
+-			if (! irq_was_pending)
+-				nb85e_intc_clear_pending_irq (irq);
+-			/* ... and then turn back on handling.  */
+-			nb85e_intc_enable_irq (irq);
+-		}
+-	}
+-}
+-
+-extern struct uart_driver nb85e_uart_driver;
+-static struct console nb85e_uart_cons =
+-{
+-    .name	= "ttyS",
+-    .write	= nb85e_uart_cons_write,
+-    .device	= uart_console_device,
+-    .flags	= CON_PRINTBUFFER,
+-    .cflag	= NB85E_UART_INIT_CFLAGS,
+-    .index	= -1,
+-    .data	= &nb85e_uart_driver,
+-};
+-
+-void nb85e_uart_cons_init (unsigned chan)
+-{
+-	nb85e_uart_configure (chan, NB85E_UART_INIT_CFLAGS,
+-			      NB85E_UART_INIT_BAUD);
+-	nb85e_uart_cons.index = chan;
+-	register_console (&nb85e_uart_cons);
+-	printk ("Console: %s on-chip UART channel %d\n",
+-		NB85E_UART_CHIP_NAME, chan);
+-}
+-
+-#define NB85E_UART_CONSOLE &nb85e_uart_cons
+-
+-#else /* !CONFIG_V850E_NB85E_UART_CONSOLE */
+-#define NB85E_UART_CONSOLE 0
+-#endif /* CONFIG_V850E_NB85E_UART_CONSOLE */
+-
+-/* TX/RX interrupt handlers.  */
+-
+-static void nb85e_uart_stop_tx (struct uart_port *port, unsigned tty_stop);
+-
+-void nb85e_uart_tx (struct uart_port *port)
+-{
+-	struct circ_buf *xmit = &port->info->xmit;
+-	int stopped = uart_tx_stopped (port);
+-
+-	if (nb85e_uart_xmit_ok (port->line)) {
+-		int tx_ch;
+-
+-		if (port->x_char) {
+-			tx_ch = port->x_char;
+-			port->x_char = 0;
+-		} else if (!uart_circ_empty (xmit) && !stopped) {
+-			tx_ch = xmit->buf[xmit->tail];
+-			xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
+-		} else
+-			goto no_xmit;
+-
+-		nb85e_uart_putc (port->line, tx_ch);
+-		port->icount.tx++;
+-
+-		if (uart_circ_chars_pending (xmit) < WAKEUP_CHARS)
+-			uart_write_wakeup (port);
+-	}
+-
+- no_xmit:
+-	if (uart_circ_empty (xmit) || stopped)
+-		nb85e_uart_stop_tx (port, stopped);
+-}
+-
+-static void nb85e_uart_tx_irq (int irq, void *data, struct pt_regs *regs)
+-{
+-	struct uart_port *port = data;
+-	nb85e_uart_tx (port);
+-}
+-
+-static void nb85e_uart_rx_irq (int irq, void *data, struct pt_regs *regs)
+-{
+-	struct uart_port *port = data;
+-	unsigned ch_stat = TTY_NORMAL;
+-	unsigned ch = NB85E_UART_RXB (port->line);
+-	unsigned err = NB85E_UART_ASIS (port->line);
+-
+-	if (err) {
+-		if (err & NB85E_UART_ASIS_OVE) {
+-			ch_stat = TTY_OVERRUN;
+-			port->icount.overrun++;
+-		} else if (err & NB85E_UART_ASIS_FE) {
+-			ch_stat = TTY_FRAME;
+-			port->icount.frame++;
+-		} else if (err & NB85E_UART_ASIS_PE) {
+-			ch_stat = TTY_PARITY;
+-			port->icount.parity++;
+-		}
+-	}
+-
+-	port->icount.rx++;
+-
+-	tty_insert_flip_char (port->info->tty, ch, ch_stat);
+-	tty_schedule_flip (port->info->tty);
+-}
+-
+-/* Control functions for the serial framework.  */
+-
+-static void nb85e_uart_nop (struct uart_port *port) { }
+-static int nb85e_uart_success (struct uart_port *port) { return 0; }
+-
+-static unsigned nb85e_uart_tx_empty (struct uart_port *port)
+-{
+-	return TIOCSER_TEMT;	/* Can't detect.  */
+-}
+-
+-static void nb85e_uart_set_mctrl (struct uart_port *port, unsigned mctrl)
+-{
+-#ifdef NB85E_UART_SET_RTS
+-	NB85E_UART_SET_RTS (port->line, (mctrl & TIOCM_RTS));
+-#endif
+-}
+-
+-static unsigned nb85e_uart_get_mctrl (struct uart_port *port)
+-{
+-	/* We don't support DCD or DSR, so consider them permanently active. */
+-	int mctrl = TIOCM_CAR | TIOCM_DSR;
+-
+-	/* We may support CTS.  */
+-#ifdef NB85E_UART_CTS
+-	mctrl |= NB85E_UART_CTS(port->line) ? TIOCM_CTS : 0;
+-#else
+-	mctrl |= TIOCM_CTS;
+-#endif
+-
+-	return mctrl;
+-}
+-
+-static void nb85e_uart_start_tx (struct uart_port *port, unsigned tty_start)
+-{
+-	nb85e_intc_disable_irq (IRQ_INTST (port->line));
+-	nb85e_uart_tx (port);
+-	nb85e_intc_enable_irq (IRQ_INTST (port->line));
+-}
+-
+-static void nb85e_uart_stop_tx (struct uart_port *port, unsigned tty_stop)
+-{
+-	nb85e_intc_disable_irq (IRQ_INTST (port->line));
+-}
+-
+-static void nb85e_uart_start_rx (struct uart_port *port)
+-{
+-	nb85e_intc_enable_irq (IRQ_INTSR (port->line));
+-}
+-
+-static void nb85e_uart_stop_rx (struct uart_port *port)
+-{
+-	nb85e_intc_disable_irq (IRQ_INTSR (port->line));
+-}
+-
+-static void nb85e_uart_break_ctl (struct uart_port *port, int break_ctl)
+-{
+-	/* Umm, do this later.  */
+-}
+-
+-static int nb85e_uart_startup (struct uart_port *port)
+-{
+-	int err;
+-
+-	/* Alloc RX irq.  */
+-	err = request_irq (IRQ_INTSR (port->line), nb85e_uart_rx_irq,
+-			   SA_INTERRUPT, "nb85e_uart", port);
+-	if (err)
+-		return err;
+-
+-	/* Alloc TX irq.  */
+-	err = request_irq (IRQ_INTST (port->line), nb85e_uart_tx_irq,
+-			   SA_INTERRUPT, "nb85e_uart", port);
+-	if (err) {
+-		free_irq (IRQ_INTSR (port->line), port);
+-		return err;
+-	}
+-
+-	nb85e_uart_start_rx (port);
+-
+-	return 0;
+-}
+-
+-static void nb85e_uart_shutdown (struct uart_port *port)
+-{
+-	/* Disable port interrupts.  */
+-	free_irq (IRQ_INTST (port->line), port);
+-	free_irq (IRQ_INTSR (port->line), port);
+-
+-	/* Turn off xmit/recv enable bits.  */
+-	NB85E_UART_ASIM (port->line)
+-		&= ~(NB85E_UART_ASIM_TXE | NB85E_UART_ASIM_RXE);
+-	/* Then reset the channel.  */
+-	NB85E_UART_ASIM (port->line) = 0;
+-}
+-
+-static void
+-nb85e_uart_set_termios (struct uart_port *port, struct termios *termios,
+-		        struct termios *old)
+-{
+-	unsigned cflags = termios->c_cflag;
+-
+-	/* Restrict flags to legal values.  */
+-	if ((cflags & CSIZE) != CS7 && (cflags & CSIZE) != CS8)
+-		/* The new value of CSIZE is invalid, use the old value.  */
+-		cflags = (cflags & ~CSIZE)
+-			| (old ? (old->c_cflag & CSIZE) : CS8);
+-
+-	termios->c_cflag = cflags;
+-
+-	nb85e_uart_configure (port->line, cflags,
+-			      uart_get_baud_rate (port, termios, old,
+-						  min_baud(), max_baud()));
+-}
+-
+-static const char *nb85e_uart_type (struct uart_port *port)
+-{
+-	return port->type == PORT_NB85E_UART ? "nb85e_uart" : 0;
+-}
+-
+-static void nb85e_uart_config_port (struct uart_port *port, int flags)
+-{
+-	if (flags & UART_CONFIG_TYPE)
+-		port->type = PORT_NB85E_UART;
+-}
+-
+-static int
+-nb85e_uart_verify_port (struct uart_port *port, struct serial_struct *ser)
+-{
+-	if (ser->type != PORT_UNKNOWN && ser->type != PORT_NB85E_UART)
+-		return -EINVAL;
+-	if (ser->irq != IRQ_INTST (port->line))
+-		return -EINVAL;
+-	return 0;
+-}
+-
+-static struct uart_ops nb85e_uart_ops = {
+-	.tx_empty	= nb85e_uart_tx_empty,
+-	.get_mctrl	= nb85e_uart_get_mctrl,
+-	.set_mctrl	= nb85e_uart_set_mctrl,
+-	.start_tx	= nb85e_uart_start_tx,
+-	.stop_tx	= nb85e_uart_stop_tx,
+-	.stop_rx	= nb85e_uart_stop_rx,
+-	.enable_ms	= nb85e_uart_nop,
+-	.break_ctl	= nb85e_uart_break_ctl,
+-	.startup	= nb85e_uart_startup,
+-	.shutdown	= nb85e_uart_shutdown,
+-	.set_termios	= nb85e_uart_set_termios,
+-	.type		= nb85e_uart_type,
+-	.release_port	= nb85e_uart_nop,
+-	.request_port	= nb85e_uart_success,
+-	.config_port	= nb85e_uart_config_port,
+-	.verify_port	= nb85e_uart_verify_port,
+-};
+-
+-/* Initialization and cleanup.  */
+-
+-static struct uart_driver nb85e_uart_driver = {
+-	.owner			= THIS_MODULE,
+-	.driver_name		= "nb85e_uart",
+-	.devfs_name		= "tts/",
+-	.dev_name		= "ttyS",
+-	.major			= TTY_MAJOR,
+-	.minor			= NB85E_UART_MINOR_BASE,
+-	.nr			= NB85E_UART_NUM_CHANNELS,
+-	.cons			= NB85E_UART_CONSOLE,
+-};
+-
+-
+-static struct uart_port nb85e_uart_ports[NB85E_UART_NUM_CHANNELS];
+-
+-static int __init nb85e_uart_init (void)
+-{
+-	int rval;
+-
+-	printk (KERN_INFO "%s on-chip UART\n", NB85E_UART_CHIP_NAME);
+-
+-	rval = uart_register_driver (&nb85e_uart_driver);
+-	if (rval == 0) {
+-		unsigned chan;
+-
+-		for (chan = 0; chan < NB85E_UART_NUM_CHANNELS; chan++) {
+-			struct uart_port *port = &nb85e_uart_ports[chan];
+-			
+-			memset (port, 0, sizeof *port);
+-
+-			port->ops = &nb85e_uart_ops;
+-			port->line = chan;
+-			port->iotype = SERIAL_IO_MEM;
+-			port->flags = UPF_BOOT_AUTOCONF;
+-
+-			/* We actually use multiple IRQs, but the serial
+-			   framework seems to mainly use this for
+-			   informational purposes anyway.  Here we use the TX
+-			   irq.  */
+-			port->irq = IRQ_INTST (chan);
+-
+-			/* The serial framework doesn't really use these
+-			   membase/mapbase fields for anything useful, but
+-			   it requires that they be something non-zero to
+-			   consider the port `valid', and also uses them
+-			   for informational purposes.  */
+-			port->membase = (void *)NB85E_UART_BASE_ADDR (chan);
+-			port->mapbase = NB85E_UART_BASE_ADDR (chan);
+-
+-			/* The framework insists on knowing the uart's master
+-			   clock freq, though it doesn't seem to do anything
+-			   useful for us with it.  We must make it at least
+-			   higher than (the maximum baud rate * 16), otherwise
+-			   the framework will puke during its internal
+-			   calculations, and force the baud rate to be 9600.
+-			   To be accurate though, just repeat the calculation
+-			   we use when actually setting the speed.
+-
+-			   The `* 8' means `* 16 / 2':  16 to account for for
+-			   the serial framework's built-in bias, and 2 because
+-			   there's an additional / 2 in the hardware.  */
+-			port->uartclk =
+-				(NB85E_UART_BASE_FREQ >> cksr_min()) * 8;
+-
+-			uart_add_one_port (&nb85e_uart_driver, port);
+-		}
+-	}
+-
+-	return rval;
+-}
+-
+-static void __exit nb85e_uart_exit (void)
+-{
+-	unsigned chan;
+-
+-	for (chan = 0; chan < NB85E_UART_NUM_CHANNELS; chan++)
+-		uart_remove_one_port (&nb85e_uart_driver,
+-				      &nb85e_uart_ports[chan]);
+-
+-	uart_unregister_driver (&nb85e_uart_driver);
+-}
+-
+-module_init (nb85e_uart_init);
+-module_exit (nb85e_uart_exit);
+-
+-MODULE_AUTHOR ("Miles Bader");
+-MODULE_DESCRIPTION ("NEC " NB85E_UART_CHIP_NAME " on-chip UART");
+-MODULE_LICENSE ("GPL");
+--- linux-2.6.0-test1/drivers/serial/sunsu.c	2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/serial/sunsu.c	2003-07-19 17:03:50.000000000 -0700
+@@ -102,6 +102,7 @@ struct uart_sunsu_port {
+ 	int			l1_down;
+ #ifdef CONFIG_SERIO
+ 	struct serio		serio;
++	int			serio_open;
+ #endif
+ };
+ 
+@@ -1021,12 +1022,13 @@ static int sunsu_serio_write(struct seri
+ 
+ static int sunsu_serio_open(struct serio *serio)
+ {
++	struct uart_sunsu_port *up = serio->driver;
+ 	unsigned long flags;
+ 	int ret;
+ 
+ 	spin_lock_irqsave(&sunsu_serio_lock, flags);
+-	if (serio->private == NULL) {
+-		serio->private = (void *) -1L;
++	if (!up->serio_open) {
++		up->serio_open = 1;
+ 		ret = 0;
+ 	} else
+ 		ret = -EBUSY;
+@@ -1037,10 +1039,11 @@ static int sunsu_serio_open(struct serio
+ 
+ static void sunsu_serio_close(struct serio *serio)
+ {
++	struct uart_sunsu_port *up = serio->driver;
+ 	unsigned long flags;
+ 
+ 	spin_lock_irqsave(&sunsu_serio_lock, flags);
+-	serio->private = NULL;
++	up->serio_open = 0;
+ 	spin_unlock_irqrestore(&sunsu_serio_lock, flags);
+ }
+ 
+--- linux-2.6.0-test1/drivers/serial/sunzilog.c	2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/serial/sunzilog.c	2003-07-19 17:03:50.000000000 -0700
+@@ -112,6 +112,7 @@ struct uart_sunzilog_port {
+ 
+ #ifdef CONFIG_SERIO
+ 	struct serio			serio;
++	int				serio_open;
+ #endif
+ };
+ 
+@@ -1311,12 +1312,13 @@ static int sunzilog_serio_write(struct s
+ 
+ static int sunzilog_serio_open(struct serio *serio)
+ {
++	struct uart_sunzilog_port *up = serio->driver;
+ 	unsigned long flags;
+ 	int ret;
+ 
+ 	spin_lock_irqsave(&sunzilog_serio_lock, flags);
+-	if (serio->private == NULL) {
+-		serio->private = (void *) -1L;
++	if (!up->serio_open) {
++		up->serio_open = 1;
+ 		ret = 0;
+ 	} else
+ 		ret = -EBUSY;
+@@ -1327,10 +1329,11 @@ static int sunzilog_serio_open(struct se
+ 
+ static void sunzilog_serio_close(struct serio *serio)
+ {
++	struct uart_sunzilog_port *up = serio->driver;
+ 	unsigned long flags;
+ 
+ 	spin_lock_irqsave(&sunzilog_serio_lock, flags);
+-	serio->private = NULL;
++	up->serio_open = 0;
+ 	spin_unlock_irqrestore(&sunzilog_serio_lock, flags);
+ }
+ 
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/serial/v850e_uart.c	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,549 @@
++/*
++ * drivers/serial/v850e_uart.c -- Serial I/O using V850E on-chip UART or UARTB
++ *
++ *  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>
++ */
++
++/* This driver supports both the original V850E UART interface (called
++   merely `UART' in the docs) and the newer `UARTB' interface, which is
++   roughly a superset of the first one.  The selection is made at
++   configure time -- if CONFIG_V850E_UARTB is defined, then UARTB is
++   presumed, otherwise the old UART -- as these are on-CPU UARTS, a system
++   can never have both.
++
++   The UARTB interface also has a 16-entry FIFO mode, which is not
++   yet supported by this driver.  */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/console.h>
++#include <linux/tty.h>
++#include <linux/tty_flip.h>
++#include <linux/serial.h>
++#include <linux/serial_core.h>
++
++#include <asm/v850e_uart.h>
++
++/* Initial UART state.  This may be overridden by machine-dependent headers. */
++#ifndef V850E_UART_INIT_BAUD
++#define V850E_UART_INIT_BAUD	115200
++#endif
++#ifndef V850E_UART_INIT_CFLAGS
++#define V850E_UART_INIT_CFLAGS	(B115200 | CS8 | CREAD)
++#endif
++
++/* A string used for prefixing printed descriptions; since the same UART
++   macro is actually used on other chips than the V850E.  This must be a
++   constant string.  */
++#ifndef V850E_UART_CHIP_NAME
++#define V850E_UART_CHIP_NAME	"V850E"
++#endif
++
++#define V850E_UART_MINOR_BASE	64	   /* First tty minor number */
++
++
++/* Low-level UART functions.  */
++
++/* Configure and turn on uart channel CHAN, using the termios `control
++   modes' bits in CFLAGS, and a baud-rate of BAUD.  */
++void v850e_uart_configure (unsigned chan, unsigned cflags, unsigned baud)
++{
++	int flags;
++	v850e_uart_speed_t old_speed;
++	v850e_uart_config_t old_config;
++	v850e_uart_speed_t new_speed = v850e_uart_calc_speed (baud);
++	v850e_uart_config_t new_config = v850e_uart_calc_config (cflags);
++
++	/* Disable interrupts while we're twiddling the hardware.  */
++	local_irq_save (flags);
++
++#ifdef V850E_UART_PRE_CONFIGURE
++	V850E_UART_PRE_CONFIGURE (chan, cflags, baud);
++#endif
++
++	old_config = V850E_UART_CONFIG (chan);
++	old_speed = v850e_uart_speed (chan);
++
++	if (! v850e_uart_speed_eq (old_speed, new_speed)) {
++		/* The baud rate has changed.  First, disable the UART.  */
++		V850E_UART_CONFIG (chan) = V850E_UART_CONFIG_FINI;
++		old_config = 0;	/* Force the uart to be re-initialized. */
++
++		/* Reprogram the baud-rate generator.  */
++		v850e_uart_set_speed (chan, new_speed);
++	}
++
++	if (! (old_config & V850E_UART_CONFIG_ENABLED)) {
++		/* If we are using the uart for the first time, start by
++		   enabling it, which must be done before turning on any
++		   other bits.  */
++		V850E_UART_CONFIG (chan) = V850E_UART_CONFIG_INIT;
++		/* See the initial state.  */
++		old_config = V850E_UART_CONFIG (chan);
++	}
++
++	if (new_config != old_config) {
++		/* Which of the TXE/RXE bits we'll temporarily turn off
++		   before changing other control bits.  */
++		unsigned temp_disable = 0;
++		/* Which of the TXE/RXE bits will be enabled.  */
++		unsigned enable = 0;
++		unsigned changed_bits = new_config ^ old_config;
++
++		/* Which of RX/TX will be enabled in the new configuration.  */
++		if (new_config & V850E_UART_CONFIG_RX_BITS)
++			enable |= (new_config & V850E_UART_CONFIG_RX_ENABLE);
++		if (new_config & V850E_UART_CONFIG_TX_BITS)
++			enable |= (new_config & V850E_UART_CONFIG_TX_ENABLE);
++
++		/* Figure out which of RX/TX needs to be disabled; note
++		   that this will only happen if they're not already
++		   disabled.  */
++		if (changed_bits & V850E_UART_CONFIG_RX_BITS)
++			temp_disable
++				|= (old_config & V850E_UART_CONFIG_RX_ENABLE);
++		if (changed_bits & V850E_UART_CONFIG_TX_BITS)
++			temp_disable
++				|= (old_config & V850E_UART_CONFIG_TX_ENABLE);
++
++		/* We have to turn off RX and/or TX mode before changing
++		   any associated control bits.  */
++		if (temp_disable)
++			V850E_UART_CONFIG (chan) = old_config & ~temp_disable;
++
++		/* Write the new control bits, while RX/TX are disabled. */ 
++		if (changed_bits & ~enable)
++			V850E_UART_CONFIG (chan) = new_config & ~enable;
++
++		v850e_uart_config_delay (new_config, new_speed);
++
++		/* Write the final version, with enable bits turned on.  */
++		V850E_UART_CONFIG (chan) = new_config;
++	}
++
++	local_irq_restore (flags);
++}
++
++
++/*  Low-level console. */
++
++#ifdef CONFIG_V850E_UART_CONSOLE
++
++static void v850e_uart_cons_write (struct console *co,
++				   const char *s, unsigned count)
++{
++	if (count > 0) {
++		unsigned chan = co->index;
++		unsigned irq = V850E_UART_TX_IRQ (chan);
++		int irq_was_enabled, irq_was_pending, flags;
++
++		/* We don't want to get `transmission completed'
++		   interrupts, since we're busy-waiting, so we disable them
++		   while sending (we don't disable interrupts entirely
++		   because sending over a serial line is really slow).  We
++		   save the status of the tx interrupt and restore it when
++		   we're done so that using printk doesn't interfere with
++		   normal serial transmission (other than interleaving the
++		   output, of course!).  This should work correctly even if
++		   this function is interrupted and the interrupt printks
++		   something.  */
++
++		/* Disable interrupts while fiddling with tx interrupt.  */
++		local_irq_save (flags);
++		/* Get current tx interrupt status.  */
++		irq_was_enabled = v850e_intc_irq_enabled (irq);
++		irq_was_pending = v850e_intc_irq_pending (irq);
++		/* Disable tx interrupt if necessary.  */
++		if (irq_was_enabled)
++			v850e_intc_disable_irq (irq);
++		/* Turn interrupts back on.  */
++		local_irq_restore (flags);
++
++		/* Send characters.  */
++		while (count > 0) {
++			int ch = *s++;
++
++			if (ch == '\n') {
++				/* We don't have the benefit of a tty
++				   driver, so translate NL into CR LF.  */
++				v850e_uart_wait_for_xmit_ok (chan);
++				v850e_uart_putc (chan, '\r');
++			}
++
++			v850e_uart_wait_for_xmit_ok (chan);
++			v850e_uart_putc (chan, ch);
++
++			count--;
++		}
++
++		/* Restore saved tx interrupt status.  */
++		if (irq_was_enabled) {
++			/* Wait for the last character we sent to be
++			   completely transmitted (as we'll get an
++			   interrupt interrupt at that point).  */
++			v850e_uart_wait_for_xmit_done (chan);
++			/* Clear pending interrupts received due
++			   to our transmission, unless there was already
++			   one pending, in which case we want the
++			   handler to be called.  */
++			if (! irq_was_pending)
++				v850e_intc_clear_pending_irq (irq);
++			/* ... and then turn back on handling.  */
++			v850e_intc_enable_irq (irq);
++		}
++	}
++}
++
++extern struct uart_driver v850e_uart_driver;
++static struct console v850e_uart_cons =
++{
++    .name	= "ttyS",
++    .write	= v850e_uart_cons_write,
++    .device	= uart_console_device,
++    .flags	= CON_PRINTBUFFER,
++    .cflag	= V850E_UART_INIT_CFLAGS,
++    .index	= -1,
++    .data	= &v850e_uart_driver,
++};
++
++void v850e_uart_cons_init (unsigned chan)
++{
++	v850e_uart_configure (chan, V850E_UART_INIT_CFLAGS,
++			      V850E_UART_INIT_BAUD);
++	v850e_uart_cons.index = chan;
++	register_console (&v850e_uart_cons);
++	printk ("Console: %s on-chip UART channel %d\n",
++		V850E_UART_CHIP_NAME, chan);
++}
++
++/* This is what the init code actually calls.  */
++static int v850e_uart_console_init (void)
++{
++	v850e_uart_cons_init (V850E_UART_CONSOLE_CHANNEL);
++	return 0;
++}
++console_initcall(v850e_uart_console_init);
++
++#define V850E_UART_CONSOLE &v850e_uart_cons
++
++#else /* !CONFIG_V850E_UART_CONSOLE */
++#define V850E_UART_CONSOLE 0
++#endif /* CONFIG_V850E_UART_CONSOLE */
++
++/* TX/RX interrupt handlers.  */
++
++static void v850e_uart_stop_tx (struct uart_port *port, unsigned tty_stop);
++
++void v850e_uart_tx (struct uart_port *port)
++{
++	struct circ_buf *xmit = &port->info->xmit;
++	int stopped = uart_tx_stopped (port);
++
++	if (v850e_uart_xmit_ok (port->line)) {
++		int tx_ch;
++
++		if (port->x_char) {
++			tx_ch = port->x_char;
++			port->x_char = 0;
++		} else if (!uart_circ_empty (xmit) && !stopped) {
++			tx_ch = xmit->buf[xmit->tail];
++			xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
++		} else
++			goto no_xmit;
++
++		v850e_uart_putc (port->line, tx_ch);
++		port->icount.tx++;
++
++		if (uart_circ_chars_pending (xmit) < WAKEUP_CHARS)
++			uart_write_wakeup (port);
++	}
++
++ no_xmit:
++	if (uart_circ_empty (xmit) || stopped)
++		v850e_uart_stop_tx (port, stopped);
++}
++
++static irqreturn_t v850e_uart_tx_irq(int irq, void *data, struct pt_regs *regs)
++{
++	struct uart_port *port = data;
++	v850e_uart_tx (port);
++	return IRQ_HANDLED;
++}
++
++static irqreturn_t v850e_uart_rx_irq(int irq, void *data, struct pt_regs *regs)
++{
++	struct uart_port *port = data;
++	unsigned ch_stat = TTY_NORMAL;
++	unsigned ch = v850e_uart_getc (port->line);
++	unsigned err = v850e_uart_err (port->line);
++
++	if (err) {
++		if (err & V850E_UART_ERR_OVERRUN) {
++			ch_stat = TTY_OVERRUN;
++			port->icount.overrun++;
++		} else if (err & V850E_UART_ERR_FRAME) {
++			ch_stat = TTY_FRAME;
++			port->icount.frame++;
++		} else if (err & V850E_UART_ERR_PARITY) {
++			ch_stat = TTY_PARITY;
++			port->icount.parity++;
++		}
++	}
++
++	port->icount.rx++;
++
++	tty_insert_flip_char (port->info->tty, ch, ch_stat);
++	tty_schedule_flip (port->info->tty);
++
++	return IRQ_HANDLED;
++}
++
++
++/* Control functions for the serial framework.  */
++
++static void v850e_uart_nop (struct uart_port *port) { }
++static int v850e_uart_success (struct uart_port *port) { return 0; }
++
++static unsigned v850e_uart_tx_empty (struct uart_port *port)
++{
++	return TIOCSER_TEMT;	/* Can't detect.  */
++}
++
++static void v850e_uart_set_mctrl (struct uart_port *port, unsigned mctrl)
++{
++#ifdef V850E_UART_SET_RTS
++	V850E_UART_SET_RTS (port->line, (mctrl & TIOCM_RTS));
++#endif
++}
++
++static unsigned v850e_uart_get_mctrl (struct uart_port *port)
++{
++	/* We don't support DCD or DSR, so consider them permanently active. */
++	int mctrl = TIOCM_CAR | TIOCM_DSR;
++
++	/* We may support CTS.  */
++#ifdef V850E_UART_CTS
++	mctrl |= V850E_UART_CTS(port->line) ? TIOCM_CTS : 0;
++#else
++	mctrl |= TIOCM_CTS;
++#endif
++
++	return mctrl;
++}
++
++static void v850e_uart_start_tx (struct uart_port *port, unsigned tty_start)
++{
++	v850e_intc_disable_irq (V850E_UART_TX_IRQ (port->line));
++	v850e_uart_tx (port);
++	v850e_intc_enable_irq (V850E_UART_TX_IRQ (port->line));
++}
++
++static void v850e_uart_stop_tx (struct uart_port *port, unsigned tty_stop)
++{
++	v850e_intc_disable_irq (V850E_UART_TX_IRQ (port->line));
++}
++
++static void v850e_uart_start_rx (struct uart_port *port)
++{
++	v850e_intc_enable_irq (V850E_UART_RX_IRQ (port->line));
++}
++
++static void v850e_uart_stop_rx (struct uart_port *port)
++{
++	v850e_intc_disable_irq (V850E_UART_RX_IRQ (port->line));
++}
++
++static void v850e_uart_break_ctl (struct uart_port *port, int break_ctl)
++{
++	/* Umm, do this later.  */
++}
++
++static int v850e_uart_startup (struct uart_port *port)
++{
++	int err;
++
++	/* Alloc RX irq.  */
++	err = request_irq (V850E_UART_RX_IRQ (port->line), v850e_uart_rx_irq,
++			   SA_INTERRUPT, "v850e_uart", port);
++	if (err)
++		return err;
++
++	/* Alloc TX irq.  */
++	err = request_irq (V850E_UART_TX_IRQ (port->line), v850e_uart_tx_irq,
++			   SA_INTERRUPT, "v850e_uart", port);
++	if (err) {
++		free_irq (V850E_UART_RX_IRQ (port->line), port);
++		return err;
++	}
++
++	v850e_uart_start_rx (port);
++
++	return 0;
++}
++
++static void v850e_uart_shutdown (struct uart_port *port)
++{
++	/* Disable port interrupts.  */
++	free_irq (V850E_UART_TX_IRQ (port->line), port);
++	free_irq (V850E_UART_RX_IRQ (port->line), port);
++
++	/* Turn off xmit/recv enable bits.  */
++	V850E_UART_CONFIG (port->line)
++		&= ~(V850E_UART_CONFIG_TX_ENABLE
++		     | V850E_UART_CONFIG_RX_ENABLE);
++	/* Then reset the channel.  */
++	V850E_UART_CONFIG (port->line) = 0;
++}
++
++static void
++v850e_uart_set_termios (struct uart_port *port, struct termios *termios,
++		        struct termios *old)
++{
++	unsigned cflags = termios->c_cflag;
++
++	/* Restrict flags to legal values.  */
++	if ((cflags & CSIZE) != CS7 && (cflags & CSIZE) != CS8)
++		/* The new value of CSIZE is invalid, use the old value.  */
++		cflags = (cflags & ~CSIZE)
++			| (old ? (old->c_cflag & CSIZE) : CS8);
++
++	termios->c_cflag = cflags;
++
++	v850e_uart_configure (port->line, cflags,
++			      uart_get_baud_rate (port, termios, old,
++						  v850e_uart_min_baud(),
++						  v850e_uart_max_baud()));
++}
++
++static const char *v850e_uart_type (struct uart_port *port)
++{
++	return port->type == PORT_V850E_UART ? "v850e_uart" : 0;
++}
++
++static void v850e_uart_config_port (struct uart_port *port, int flags)
++{
++	if (flags & UART_CONFIG_TYPE)
++		port->type = PORT_V850E_UART;
++}
++
++static int
++v850e_uart_verify_port (struct uart_port *port, struct serial_struct *ser)
++{
++	if (ser->type != PORT_UNKNOWN && ser->type != PORT_V850E_UART)
++		return -EINVAL;
++	if (ser->irq != V850E_UART_TX_IRQ (port->line))
++		return -EINVAL;
++	return 0;
++}
++
++static struct uart_ops v850e_uart_ops = {
++	.tx_empty	= v850e_uart_tx_empty,
++	.get_mctrl	= v850e_uart_get_mctrl,
++	.set_mctrl	= v850e_uart_set_mctrl,
++	.start_tx	= v850e_uart_start_tx,
++	.stop_tx	= v850e_uart_stop_tx,
++	.stop_rx	= v850e_uart_stop_rx,
++	.enable_ms	= v850e_uart_nop,
++	.break_ctl	= v850e_uart_break_ctl,
++	.startup	= v850e_uart_startup,
++	.shutdown	= v850e_uart_shutdown,
++	.set_termios	= v850e_uart_set_termios,
++	.type		= v850e_uart_type,
++	.release_port	= v850e_uart_nop,
++	.request_port	= v850e_uart_success,
++	.config_port	= v850e_uart_config_port,
++	.verify_port	= v850e_uart_verify_port,
++};
++
++/* Initialization and cleanup.  */
++
++static struct uart_driver v850e_uart_driver = {
++	.owner			= THIS_MODULE,
++	.driver_name		= "v850e_uart",
++	.devfs_name		= "tts/",
++	.dev_name		= "ttyS",
++	.major			= TTY_MAJOR,
++	.minor			= V850E_UART_MINOR_BASE,
++	.nr			= V850E_UART_NUM_CHANNELS,
++	.cons			= V850E_UART_CONSOLE,
++};
++
++
++static struct uart_port v850e_uart_ports[V850E_UART_NUM_CHANNELS];
++
++static int __init v850e_uart_init (void)
++{
++	int rval;
++
++	printk (KERN_INFO "%s on-chip UART\n", V850E_UART_CHIP_NAME);
++
++	rval = uart_register_driver (&v850e_uart_driver);
++	if (rval == 0) {
++		unsigned chan;
++
++		for (chan = 0; chan < V850E_UART_NUM_CHANNELS; chan++) {
++			struct uart_port *port = &v850e_uart_ports[chan];
++			
++			memset (port, 0, sizeof *port);
++
++			port->ops = &v850e_uart_ops;
++			port->line = chan;
++			port->iotype = SERIAL_IO_MEM;
++			port->flags = UPF_BOOT_AUTOCONF;
++
++			/* We actually use multiple IRQs, but the serial
++			   framework seems to mainly use this for
++			   informational purposes anyway.  Here we use the TX
++			   irq.  */
++			port->irq = V850E_UART_TX_IRQ (chan);
++
++			/* The serial framework doesn't really use these
++			   membase/mapbase fields for anything useful, but
++			   it requires that they be something non-zero to
++			   consider the port `valid', and also uses them
++			   for informational purposes.  */
++			port->membase = (void *)V850E_UART_BASE_ADDR (chan);
++			port->mapbase = V850E_UART_BASE_ADDR (chan);
++
++			/* The framework insists on knowing the uart's master
++			   clock freq, though it doesn't seem to do anything
++			   useful for us with it.  We must make it at least
++			   higher than (the maximum baud rate * 16), otherwise
++			   the framework will puke during its internal
++			   calculations, and force the baud rate to be 9600.
++			   To be accurate though, just repeat the calculation
++			   we use when actually setting the speed.  */
++			port->uartclk = v850e_uart_max_clock() * 16;
++
++			uart_add_one_port (&v850e_uart_driver, port);
++		}
++	}
++
++	return rval;
++}
++
++static void __exit v850e_uart_exit (void)
++{
++	unsigned chan;
++
++	for (chan = 0; chan < V850E_UART_NUM_CHANNELS; chan++)
++		uart_remove_one_port (&v850e_uart_driver,
++				      &v850e_uart_ports[chan]);
++
++	uart_unregister_driver (&v850e_uart_driver);
++}
++
++module_init (v850e_uart_init);
++module_exit (v850e_uart_exit);
++
++MODULE_AUTHOR ("Miles Bader");
++MODULE_DESCRIPTION ("NEC " V850E_UART_CHIP_NAME " on-chip UART");
++MODULE_LICENSE ("GPL");
+--- linux-2.6.0-test1/drivers/telephony/ixj.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/telephony/ixj.c	2003-07-19 17:03:50.000000000 -0700
+@@ -23,6 +23,7 @@
+  * Fixes:           David Huggins-Daines, <dhd@cepstral.com>
+  *                  Fabio Ferrari, <fabio.ferrari@digitro.com.br>
+  *                  Artis Kugevics, <artis@mt.lv>
++ *                  Daniele Bellucci, <bellucda@tiscali.it>
+  *
+  * More information about the hardware related to this driver can be found  
+  * at our website:    http://www.quicknet.net
+@@ -45,6 +46,10 @@ static char ixj_c_revision[] = "$Revisio
+ 
+ /*
+  * $Log: 2.6.0-test1-mm2.patch,v $
+  * Revision 1.1.2.2  2003/07/22 07:20:21  braam
+  * - these should apply, but they don't quite compile (something with netdump)
+  *
++ *
++ * Revision 4.8  2003/07/09 19:39:00  Daniele Bellucci
++ * Audit some copy_*_user and minor cleanup.
++ *
+  * Revision 4.7  2001/08/13 06:19:33  craigs
+  * Added additional changes from Alan Cox and John Anderson for
+  * 2.2 to 2.4 cleanup and bounds checking
+@@ -363,12 +368,9 @@ static IXJ ixj[IXJMAX];
+ static IXJ *ixj_alloc(void)
+ {
+ 	int cnt;
+-	for(cnt=0; cnt<IXJMAX; cnt++)
+-	{
++	for(cnt=0; cnt<IXJMAX; cnt++) {
+ 		if(!ixj[cnt].DSPbase)
+-		{
+ 			return &ixj[cnt];
+-		}
+ 	}
+ 	return NULL;
+ }
+@@ -6260,9 +6262,11 @@ static int ixj_ioctl(struct inode *inode
+ 		break;
+ 	case IXJCTL_CIDCW:
+ 		if(arg) {
+-			copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID));
+-		}
+-		else {
++			if (copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID))) {
++				retval = -EFAULT;
++				break;
++			}
++		} else {
+ 			memset(&j->cid_send, 0, sizeof(PHONE_CID));
+ 		}
+ 		ixj_write_cidcw(j);
+@@ -6273,14 +6277,12 @@ static int ixj_ioctl(struct inode *inode
+                 /* Fall through */
+  	case PHONE_RING_START:
+ 		if(arg) {
+-			if(copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID)))
+-			{
++			if (copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID))) {
+ 				retval = -EFAULT;
+ 				break;
+ 			}
+ 			ixj_write_cid(j);
+-		}
+-		else {
++		} else {
+ 			memset(&j->cid_send, 0, sizeof(PHONE_CID));
+ 		}
+ 		ixj_ring_start(j);
+@@ -6696,7 +6698,8 @@ static int ixj_ioctl(struct inode *inode
+ 	case IXJCTL_SET_FILTER_RAW:
+ 		if (copy_from_user(&jfr, (char *) arg, sizeof(jfr))) 
+ 			retval = -EFAULT;
+-		retval = ixj_init_filter_raw(j, &jfr);
++		else
++			retval = ixj_init_filter_raw(j, &jfr);
+ 		break;
+ 	case IXJCTL_GET_FILTER_HIST:
+ 		if(arg<0||arg>3)
+@@ -6705,8 +6708,10 @@ static int ixj_ioctl(struct inode *inode
+ 			retval = j->filter_hist[arg];
+ 		break;
+ 	case IXJCTL_INIT_TONE:
+-		copy_from_user(&ti, (char *) arg, sizeof(ti));
+-		retval = ixj_init_tone(j, &ti);
++		if (copy_from_user(&ti, (char *) arg, sizeof(ti)))
++			retval = -EFAULT;
++		else
++			retval = ixj_init_tone(j, &ti);
+ 		break;
+ 	case IXJCTL_TONE_CADENCE:
+ 		retval = ixj_build_cadence(j, (IXJ_CADENCE *) arg);
+@@ -6715,8 +6720,10 @@ static int ixj_ioctl(struct inode *inode
+ 		retval = ixj_build_filter_cadence(j, (IXJ_FILTER_CADENCE *) arg);
+ 		break;
+ 	case IXJCTL_SIGCTL:
+-		if (copy_from_user(&j->sigdef, (char *)arg, sizeof(IXJ_SIGDEF)))
++		if (copy_from_user(&j->sigdef, (char *)arg, sizeof(IXJ_SIGDEF))) {
+ 			retval = -EFAULT;
++			break;
++		}
+ 		j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
+ 		if(j->sigdef.event < 33) {
+ 			raise = 1;
+@@ -7693,7 +7700,7 @@ MODULE_DESCRIPTION("Quicknet VoIP Teleph
+ MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
+ MODULE_LICENSE("GPL");
+ 
+-void ixj_exit(void)
++static void __exit ixj_exit(void)
+ {
+         cleanup();
+ }
+@@ -7852,7 +7859,7 @@ int __init ixj_probe_pci(int *cnt)
+ 	return probe;
+ }
+ 
+-int __init ixj_init(void)
++static int __init ixj_init(void)
+ {
+ 	int cnt = 0;
+ 	int probe = 0;   
+--- linux-2.6.0-test1/drivers/telephony/Kconfig	2003-06-14 12:18:00.000000000 -0700
++++ 25/drivers/telephony/Kconfig	2003-07-19 17:03:50.000000000 -0700
+@@ -39,7 +39,7 @@ config PHONE_IXJ
+ 
+ config PHONE_IXJ_PCMCIA
+ 	tristate "QuickNet Internet LineJack/PhoneJack PCMCIA support"
+-	depends on PHONE_IXJ
++	depends on PHONE_IXJ && PCMCIA
+ 	help
+ 	  Say Y here to configure in PCMCIA service support for the Quicknet
+ 	  cards manufactured by Quicknet Technologies, Inc.  This changes the
+--- linux-2.6.0-test1/drivers/usb/class/bluetty.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/class/bluetty.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1320,7 +1320,8 @@ int usb_bluetooth_init(void)
+ 
+ 	bluetooth_tty_driver->owner = THIS_MODULE;
+ 	bluetooth_tty_driver->driver_name = "usb-bluetooth";
+-	bluetooth_tty_driver->name = "usb/ttub/";
++	bluetooth_tty_driver->name = "ttyUB";
++	bluetooth_tty_driver->devfs_name = "usb/ttub/";
+ 	bluetooth_tty_driver->major = BLUETOOTH_TTY_MAJOR;
+ 	bluetooth_tty_driver->minor_start = 0;
+ 	bluetooth_tty_driver->type = TTY_DRIVER_TYPE_SERIAL;
+--- linux-2.6.0-test1/drivers/usb/class/cdc-acm.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/class/cdc-acm.c	2003-07-19 17:03:50.000000000 -0700
+@@ -765,7 +765,8 @@ static int __init acm_init(void)
+ 		return -ENOMEM;
+ 	acm_tty_driver->owner = THIS_MODULE,
+ 	acm_tty_driver->driver_name = "acm",
+-	acm_tty_driver->name = "usb/acm/",
++	acm_tty_driver->name = "ttyACM",
++	acm_tty_driver->devfs_name = "usb/acm/",
+ 	acm_tty_driver->major = ACM_TTY_MAJOR,
+ 	acm_tty_driver->minor_start = 0,
+ 	acm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL,
+--- linux-2.6.0-test1/drivers/usb/class/usblp.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/usb/class/usblp.c	2003-07-19 17:03:50.000000000 -0700
+@@ -359,7 +359,6 @@ static int usblp_open(struct inode *inod
+ 	file->private_data = usblp;
+ 
+ 	usblp->writeurb->transfer_buffer_length = 0;
+-	usblp->writeurb->status = 0;
+ 	usblp->wcomplete = 1; /* we begin writeable */
+ 	usblp->rcomplete = 0;
+ 
+@@ -833,22 +832,15 @@ static int usblp_probe(struct usb_interf
+ 	init_waitqueue_head(&usblp->wait);
+ 	usblp->ifnum = intf->altsetting->desc.bInterfaceNumber;
+ 
+-	retval = usb_register_dev(intf, &usblp_class);
+-	if (retval) {
+-		err("Not able to get a minor for this device.");
+-		goto abort;
+-	}
+-	usblp->minor = intf->minor;
+-
+ 	usblp->writeurb = usb_alloc_urb(0, GFP_KERNEL);
+ 	if (!usblp->writeurb) {
+ 		err("out of memory");
+-		goto abort_minor;
++		goto abort;
+ 	}
+ 	usblp->readurb = usb_alloc_urb(0, GFP_KERNEL);
+ 	if (!usblp->readurb) {
+ 		err("out of memory");
+-		goto abort_minor;
++		goto abort;
+ 	}
+ 
+ 	/* Malloc device ID string buffer to the largest expected length,
+@@ -856,7 +848,7 @@ static int usblp_probe(struct usb_interf
+ 	 * could change in length. */
+ 	if (!(usblp->device_id_string = kmalloc(USBLP_DEVICE_ID_SIZE, GFP_KERNEL))) {
+ 		err("out of memory for device_id_string");
+-		goto abort_minor;
++		goto abort;
+ 	}
+ 
+ 	usblp->writebuf = usblp->readbuf = NULL;
+@@ -868,19 +860,19 @@ static int usblp_probe(struct usb_interf
+ 	if (!(usblp->writebuf = usb_buffer_alloc(dev, USBLP_BUF_SIZE,
+ 				GFP_KERNEL, &usblp->writeurb->transfer_dma))) {
+ 		err("out of memory for write buf");
+-		goto abort_minor;
++		goto abort;
+ 	}
+ 	if (!(usblp->readbuf = usb_buffer_alloc(dev, USBLP_BUF_SIZE,
+ 				GFP_KERNEL, &usblp->readurb->transfer_dma))) {
+ 		err("out of memory for read buf");
+-		goto abort_minor;
++		goto abort;
+ 	}
+ 
+ 	/* Allocate buffer for printer status */
+ 	usblp->statusbuf = kmalloc(STATUS_BUF_SIZE, GFP_KERNEL);
+ 	if (!usblp->statusbuf) {
+ 		err("out of memory for statusbuf");
+-		goto abort_minor;
++		goto abort;
+ 	}
+ 
+ 	/* Lookup quirks for this printer. */
+@@ -894,12 +886,12 @@ static int usblp_probe(struct usb_interf
+ 		dbg("incompatible printer-class device 0x%4.4X/0x%4.4X",
+ 			dev->descriptor.idVendor,
+ 			dev->descriptor.idProduct);
+-		goto abort_minor;
++		goto abort;
+ 	}
+ 
+ 	/* Setup the selected alternate setting and endpoints. */
+ 	if (usblp_set_protocol(usblp, protocol) < 0)
+-		goto abort_minor;
++		goto abort;
+ 
+ 	/* Retrieve and store the device ID string. */
+ 	usblp_cache_device_id_string(usblp);
+@@ -920,10 +912,17 @@ static int usblp_probe(struct usb_interf
+ 
+ 	usblp->present = 1;
+ 
++	retval = usb_register_dev(intf, &usblp_class);
++	if (retval) {
++		err("Not able to get a minor for this device.");
++		goto abort_intfdata;
++	}
++	usblp->minor = intf->minor;
++
+ 	return 0;
+ 
+-abort_minor:
+-	usb_deregister_dev(intf, &usblp_class);
++abort_intfdata:
++	usb_set_intfdata (intf, NULL);
+ abort:
+ 	if (usblp) {
+ 		if (usblp->writebuf)
+--- linux-2.6.0-test1/drivers/usb/core/file.c	2003-06-14 12:18:51.000000000 -0700
++++ 25/drivers/usb/core/file.c	2003-07-19 17:06:13.000000000 -0700
+@@ -93,7 +93,7 @@ static ssize_t show_dev(struct class_dev
+ {
+ 	struct usb_interface *intf = class_dev_to_usb_interface(class_dev);
+ 	dev_t dev = MKDEV(USB_MAJOR, intf->minor);
+-	return sprintf(buf, "%04x\n", dev);
++	return print_dev_t(buf, dev);
+ }
+ static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
+ 
+--- linux-2.6.0-test1/drivers/usb/core/hcd.c	2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/usb/core/hcd.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1293,7 +1293,8 @@ rescan:
+ 	}
+ 
+ 	/* then kill any current requests */
+-	spin_lock_irqsave (&hcd_data_lock, flags);
++	local_irq_save (flags);
++	spin_lock (&hcd_data_lock);
+ 	list_for_each_entry (urb, &dev->urb_list, urb_list) {
+ 		int	tmp = urb->pipe;
+ 
+@@ -1311,13 +1312,13 @@ rescan:
+ 		if (urb->status != -EINPROGRESS)
+ 			continue;
+ 		usb_get_urb (urb);
+-		spin_unlock_irqrestore (&hcd_data_lock, flags);
++		spin_unlock (&hcd_data_lock);
+ 
+-		spin_lock_irqsave (&urb->lock, flags);
++		spin_lock (&urb->lock);
+ 		tmp = urb->status;
+ 		if (tmp == -EINPROGRESS)
+ 			urb->status = -ESHUTDOWN;
+-		spin_unlock_irqrestore (&urb->lock, flags);
++		spin_unlock (&urb->lock);
+ 
+ 		/* kick hcd unless it's already returning this */
+ 		if (tmp == -EINPROGRESS) {
+@@ -1340,7 +1341,8 @@ rescan:
+ 		/* list contents may have changed */
+ 		goto rescan;
+ 	}
+-	spin_unlock_irqrestore (&hcd_data_lock, flags);
++	spin_unlock (&hcd_data_lock);
++	local_irq_restore (flags);
+ 
+ 	/* synchronize with the hardware, so old configuration state
+ 	 * clears out immediately (and will be freed).
+--- linux-2.6.0-test1/drivers/usb/core/hcd-pci.c	2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/usb/core/hcd-pci.c	2003-07-19 17:03:50.000000000 -0700
+@@ -81,7 +81,7 @@ int usb_hcd_pci_probe (struct pci_dev *d
+ 	
+         if (!dev->irq) {
+         	err ("Found HC with no IRQ.  Check BIOS/PCI %s setup!",
+-			dev->slot_name);
++			pci_name(dev));
+    	        return -ENODEV;
+         }
+ 	
+@@ -99,7 +99,7 @@ int usb_hcd_pci_probe (struct pci_dev *d
+ 			retval = -EFAULT;
+ clean_1:
+ 			release_mem_region (resource, len);
+-			err ("init %s fail, %d", dev->slot_name, retval);
++			err ("init %s fail, %d", pci_name(dev), retval);
+ 			return retval;
+ 		}
+ 
+@@ -136,7 +136,7 @@ clean_2:
+ 			goto clean_1;
+ 		} else {
+ 			release_region (resource, len);
+-			err ("init %s fail, %d", dev->slot_name, retval);
++			err ("init %s fail, %d", pci_name(dev), retval);
+ 			return retval;
+ 		}
+ 	}
+@@ -144,7 +144,7 @@ clean_2:
+ 	hcd->driver = driver;
+ 	hcd->description = driver->description;
+ 	hcd->pdev = dev;
+-	hcd->self.bus_name = dev->slot_name;
++	hcd->self.bus_name = pci_name(dev);
+ 	hcd->product_desc = dev->dev.name;
+ 	hcd->self.controller = &dev->dev;
+ 	hcd->controller = hcd->self.controller;
+@@ -279,6 +279,7 @@ EXPORT_SYMBOL (usb_hcd_pci_remove);
+ /**
+  * usb_hcd_pci_suspend - power management suspend of a PCI-based HCD
+  * @dev: USB Host Controller being suspended
++ * @state: state that the controller is going into
+  *
+  * Store this function in the HCD's struct pci_driver as suspend().
+  */
+--- linux-2.6.0-test1/drivers/usb/core/usb.c	2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/usb/core/usb.c	2003-07-19 17:03:50.000000000 -0700
+@@ -80,6 +80,23 @@ static struct device_driver usb_generic_
+ 
+ static int usb_generic_driver_data;
+ 
++/* deallocate hcd/hardware state ... and nuke all pending urbs */
++static void nuke_urbs(struct usb_device *dev)
++{
++	void (*disable)(struct usb_device *, int);
++	int i;
++
++	if (!dev || !dev->bus || !dev->bus->op || !dev->bus->op->disable)
++		return;
++	dbg("nuking urbs assigned to %s", dev->dev.bus_id);
++
++	disable = dev->bus->op->disable;
++	for (i = 0; i < 15; i++) {
++		disable(dev, i);
++		disable(dev, USB_DIR_IN | i);
++	}
++}
++
+ /* needs to be called with BKL held */
+ int usb_device_probe(struct device *dev)
+ {
+@@ -116,6 +133,9 @@ int usb_device_remove(struct device *dev
+ 
+ 	down(&driver->serialize);
+ 
++	/* release all urbs for this device */
++	nuke_urbs(interface_to_usbdev(intf));
++
+ 	if (intf->driver && intf->driver->disconnect)
+ 		intf->driver->disconnect(intf);
+ 
+@@ -896,6 +916,9 @@ void usb_disconnect(struct usb_device **
+ 			usb_disconnect(child);
+ 	}
+ 
++	/* deallocate hcd/hardware state ... and nuke all pending urbs */
++	nuke_urbs(dev);
++
+ 	/* disconnect() drivers from interfaces (a key side effect) */
+ 	dev_dbg (&dev->dev, "unregistering interfaces\n");
+ 	if (dev->actconfig) {
+@@ -908,16 +931,6 @@ void usb_disconnect(struct usb_device **
+ 		}
+ 	}
+ 
+-	/* 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) {
+--- linux-2.6.0-test1/drivers/usb/gadget/ether.c	2003-06-14 12:18:35.000000000 -0700
++++ 25/drivers/usb/gadget/ether.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * ether.c -- CDC 1.1 Ethernet gadget driver
++ * ether.c -- Ethernet gadget driver, with CDC and non-CDC options
+  *
+  * Copyright (C) 2003 David Brownell
+  *
+@@ -58,21 +58,23 @@
+ /*-------------------------------------------------------------------------*/
+ 
+ /*
+- * "Communications Device Class" (CDC) Ethernet class driver
++ * Ethernet gadget driver -- with CDC and non-CDC options
+  *
+  * CDC Ethernet is the standard USB solution for sending Ethernet frames
+  * using USB.  Real hardware tends to use the same framing protocol but look
+  * different for control features.  And Microsoft pushes their own approach
+  * (RNDIS) instead of the standard.
++ *
++ * There's some hardware that can't talk CDC.  We make that hardware
++ * implement a "minimalist" vendor-agnostic CDC core:  same framing, but
++ * link-level setup only requires activating the configuration.
+  */
+ 
+-#define DRIVER_DESC		"CDC Ethernet Gadget"
+-#define DRIVER_VERSION		"29 April 2003"
++#define DRIVER_DESC		"Ethernet Gadget"
++#define DRIVER_VERSION		"Bastille Day 2003"
+ 
+ static const char shortname [] = "ether";
+ static const char driver_desc [] = DRIVER_DESC;
+-static const char control_name [] = "Communications Control";
+-static const char data_name [] = "CDC Ethernet Data";
+ 
+ #define MIN_PACKET	sizeof(struct ethhdr)
+ #define	MAX_PACKET	ETH_DATA_LEN	/* biggest packet we'll rx/tx */
+@@ -92,8 +94,7 @@ struct eth_dev {
+ 	const struct usb_endpoint_descriptor
+ 				*in, *out, *status;
+ 
+-	struct semaphore	mutex;
+-	struct net_device	net;
++	struct net_device	*net;
+ 	struct net_device_stats	stats;
+ 	atomic_t		tx_qlen;
+ 
+@@ -112,7 +113,7 @@ struct eth_dev {
+ 
+ static unsigned qmult = 4;
+ 
+-#define HS_FACTOR	15
++#define HS_FACTOR	5
+ 
+ #define qlen(gadget) \
+ 	(qmult*((gadget->speed == USB_SPEED_HIGH) ? HS_FACTOR : 1))
+@@ -128,7 +129,7 @@ module_param (qmult, uint, S_IRUGO|S_IWU
+ 
+ /* Thanks to NetChip Technologies for donating this product ID.
+  *
+- * DO NOT REUSE THESE IDs with any other driver!!  Ever!!
++ * DO NOT REUSE THESE IDs with a protocol-incompatible driver!!  Ever!!
+  * Instead:  allocate your own, using normal USB-IF procedures.
+  */
+ #define DRIVER_VENDOR_NUM	0x0525		/* NetChip */
+@@ -158,6 +159,11 @@ module_param (qmult, uint, S_IRUGO|S_IWU
+  * for some reason doesn't handle full speed bulk maxpacket of 64.
+  */
+ 
++#define DEV_CONFIG_VALUE	3	/* some hardware cares */
++
++/* #undef on hardware that can't implement CDC */
++#define	DEV_CONFIG_CDC
++
+ /*
+  * NetChip 2280, PCI based.
+  *
+@@ -172,7 +178,7 @@ module_param (qmult, uint, S_IRUGO|S_IWU
+ #define DRIVER_VERSION_NUM	0x0101
+ #define EP0_MAXPACKET		64
+ static const char EP_OUT_NAME [] = "ep-a";
+-#define EP_OUT_NUM	2
++#define EP_OUT_NUM	1
+ static const char EP_IN_NAME [] = "ep-b";
+ #define EP_IN_NUM	2
+ static const char EP_STATUS_NAME [] = "ep-f";
+@@ -194,22 +200,21 @@ static inline void hw_optimize (struct u
+ #endif
+ 
+ /*
+- * PXA-250 UDC:  widely used in second gen Linux-capable PDAs.
++ * PXA-2xx UDC:  widely used in second gen Linux-capable ARM PDAs
++ * and other products.
+  *
+- * no limitations except from set_interface: docs say "no" to a third
+- * interface. and the interrupt-only endpoints don't toggle, so we'll
+- * just use a bulk-capable one instead.
++ * multiple interfaces (or altsettings) aren't usable.  so this hardware
++ * can't implement CDC, which needs both capabilities.
+  */
+-#ifdef	CONFIG_USB_ETH_PXA250
+-#define CHIP			"pxa250"
++#ifdef	CONFIG_USB_ETH_PXA2XX
++#undef	DEV_CONFIG_CDC
++#define CHIP			"pxa2xx"
+ #define DRIVER_VERSION_NUM	0x0103
+ #define EP0_MAXPACKET		16
+-static const char EP_OUT_NAME [] = "ep12out-bulk";
+-#define EP_OUT_NUM	12
+-static const char EP_IN_NAME [] = "ep11in-bulk";
+-#define EP_IN_NUM	11
+-static const char EP_STATUS_NAME [] = "ep6in-bulk";
+-#define EP_STATUS_NUM	6
++static const char EP_OUT_NAME [] = "ep2out-bulk";
++#define EP_OUT_NUM	2
++static const char EP_IN_NAME [] = "ep1in-bulk";
++#define EP_IN_NUM	1
+ /* doesn't support bus-powered operation */
+ #define SELFPOWER USB_CONFIG_ATT_SELFPOWER
+ /* supports remote wakeup, but this driver doesn't */
+@@ -247,6 +252,29 @@ static const char EP_IN_NAME [] = "ep2in
+ #	error Configure some USB peripheral controller driver!
+ #endif
+ 
++/* We normally expect hardware that can talk CDC.  That involves
++ * using multiple interfaces and altsettings, and maybe a status
++ * interrupt.  Driver binding to be done according to USB-IF class,
++ * though you can use different VENDOR and PRODUCT numbers if you
++ * want (and they're officially assigned).
++ * 
++ * For hardware that can't talk CDC, we use the same vendor ID that
++ * ARM Linux has used for ethernet-over-usb, both with sa1100 and
++ * with pxa250.  We're protocol-compatible, if the host-side drivers
++ * use the endpoint descriptors.  DRIVER_VERSION_NUM is nonzero, so
++ * drivers that need to hard-wire endpoint numbers have a hook.
++ */
++#ifdef	DEV_CONFIG_CDC
++#define	DEV_CONFIG_CLASS	USB_CLASS_COMM
++#else	
++#define	DEV_CONFIG_CLASS	USB_CLASS_VENDOR_SPEC
++#undef	EP_STATUS_NUM
++#undef	DRIVER_VENDOR_NUM
++#undef	DRIVER_PRODUCT_NUM
++#define	DRIVER_VENDOR_NUM	0x049f
++#define	DRIVER_PRODUCT_NUM	0x505a
++#endif /* CONFIG_CDC_ETHER */
++
+ /* power usage is config specific.
+  * hardware that supports remote wakeup defaults to disabling it.
+  */
+@@ -274,7 +302,8 @@ static const char EP_IN_NAME [] = "ep2in
+ /*-------------------------------------------------------------------------*/
+ 
+ #define xprintk(d,level,fmt,args...) \
+-	dev_printk(level , &(d)->gadget->dev , fmt , ## args)
++	printk(level "%s %s: " fmt , shortname , (d)->gadget->dev.bus_id , \
++		## args)
+ 
+ #ifdef DEBUG
+ #undef DEBUG
+@@ -309,7 +338,7 @@ static const char EP_IN_NAME [] = "ep2in
+ /*
+  * DESCRIPTORS ... most are static, but strings and (full) configuration
+  * descriptors are built on demand.  Notice how most of the cdc descriptors
+- * add no value to simple (typical) configurations.
++ * aren't needed in the "minimalist" mode.
+  */
+ 
+ #define STRING_MANUFACTURER		1
+@@ -323,15 +352,14 @@ static const char EP_IN_NAME [] = "ep2in
+ /*
+  * This device advertises one configuration.
+  */
+-#define	CONFIG_CDC_ETHER	3
+-
+ static const struct usb_device_descriptor
+ device_desc = {
+ 	.bLength =		sizeof device_desc,
+ 	.bDescriptorType =	USB_DT_DEVICE,
+ 
+ 	.bcdUSB =		__constant_cpu_to_le16 (0x0200),
+-	.bDeviceClass =		USB_CLASS_COMM,
++
++	.bDeviceClass =		DEV_CONFIG_CLASS,
+ 	.bDeviceSubClass =	0,
+ 	.bDeviceProtocol =	0,
+ 	.bMaxPacketSize0 =	EP0_MAXPACKET,
+@@ -350,13 +378,26 @@ eth_config = {
+ 	.bDescriptorType =	USB_DT_CONFIG,
+ 
+ 	/* compute wTotalLength on the fly */
++#ifdef	DEV_CONFIG_CDC
+ 	.bNumInterfaces =	2,
+-	.bConfigurationValue =	CONFIG_CDC_ETHER,
++#else
++	.bNumInterfaces =	1,
++#endif
++	.bConfigurationValue =	DEV_CONFIG_VALUE,
+ 	.iConfiguration =	STRING_PRODUCT,
+ 	.bmAttributes =		USB_CONFIG_ATT_ONE | SELFPOWER | WAKEUP,
+ 	.bMaxPower =		(MAX_USB_POWER + 1) / 2,
+ };
+ 
++#ifdef	DEV_CONFIG_CDC
++
++/*
++ * Compared to the "minimalist" non-CDC model, the CDC model adds
++ * three class descriptors, two interface descrioptors, and a status
++ * endpoint.  Both have a "data" interface and two bulk endpoints.
++ * There are also differences in how control requests are handled.
++ */
++
+ /* master comm interface optionally has a status notification endpoint */
+ 
+ static const struct usb_interface_descriptor
+@@ -446,7 +487,7 @@ static const struct ether_desc ether_des
+  * some drivers (like current Linux cdc-ether!) "need" it to exist even
+  * if they ignore the connect/disconnect notifications that real aether
+  * can provide.  more advanced cdc configurations might want to support
+- * encapsulated commands.
++ * encapsulated commands (vendor-specific, using control-OUT).
+  */
+  
+ #define LOG2_STATUS_INTERVAL_MSEC	6
+@@ -494,6 +535,29 @@ data_intf = {
+ 	.bInterfaceProtocol =	0,
+ 	.iInterface =		STRING_DATA,
+ };
++#else
++
++/*
++ * "Minimalist" non-CDC option is a simple vendor-neutral model that most
++ * full speed controllers can handle:  one interface, two bulk endpoints.
++ */
++
++static const struct usb_interface_descriptor
++data_intf = {
++	.bLength =		sizeof data_intf,
++	.bDescriptorType =	USB_DT_INTERFACE,
++
++	.bInterfaceNumber =	0,
++	.bAlternateSetting =	0,
++	.bNumEndpoints =	2,
++	.bInterfaceClass =	USB_CLASS_VENDOR_SPEC,
++	.bInterfaceSubClass =	0,
++	.bInterfaceProtocol =	0,
++	.iInterface =		STRING_DATA,
++};
++
++#endif	/* DEV_CONFIG_CDC */
++
+ 
+ static const struct usb_endpoint_descriptor
+ fs_source_desc = {
+@@ -563,12 +627,12 @@ dev_qualifier = {
+ 	.bDescriptorType =	USB_DT_DEVICE_QUALIFIER,
+ 
+ 	.bcdUSB =		__constant_cpu_to_le16 (0x0200),
+-	.bDeviceClass =		USB_CLASS_VENDOR_SPEC,
++	.bDeviceClass =		DEV_CONFIG_CLASS,
+ 
+ 	/* assumes ep0 uses the same value for both speeds ... */
+ 	.bMaxPacketSize0 =	EP0_MAXPACKET,
+ 
+-	.bNumConfigurations =	2,
++	.bNumConfigurations =	1,
+ };
+ 
+ /* maxpacket and other transfer characteristics vary by speed. */
+@@ -581,16 +645,24 @@ dev_qualifier = {
+ 
+ #endif	/* !HIGHSPEED */
+ 
++/*-------------------------------------------------------------------------*/
++
++/* descriptors that are built on-demand */
++
++#ifdef	DEV_CONFIG_CDC
+ /* address that the host will use ... usually assigned at random */
+ static char				ethaddr [2 * ETH_ALEN + 1];
++#endif
+ 
+ /* static strings, in iso 8859/1 */
+ static struct usb_string		strings [] = {
+ 	{ STRING_MANUFACTURER,	UTS_SYSNAME " " UTS_RELEASE "/" CHIP, },
+ 	{ STRING_PRODUCT,	driver_desc, },
++#ifdef	DEV_CONFIG_CDC
+ 	{ STRING_ETHADDR,	ethaddr, },
+-	{ STRING_CONTROL,	control_name, },
+-	{ STRING_DATA,		data_name, },
++	{ STRING_CONTROL,	"CDC Communications Control", },
++#endif
++	{ STRING_DATA,		"Ethernet Data", },
+ 	{  }		/* end of list */
+ };
+ 
+@@ -607,14 +679,18 @@ static int
+ config_buf (enum usb_device_speed speed, u8 *buf, u8 type, unsigned index)
+ {
+ 	const unsigned	config_len = USB_DT_CONFIG_SIZE
+-				+ 3 * USB_DT_INTERFACE_SIZE
++#ifdef DEV_CONFIG_CDC
++				+ 2 * USB_DT_INTERFACE_SIZE
+ 				+ sizeof header_desc
+ 				+ sizeof union_desc
+ 				+ sizeof ether_desc
+ #ifdef	EP_STATUS_NUM
+ 				+ USB_DT_ENDPOINT_SIZE
+ #endif
++#endif /* DEV_CONFIG_CDC */
++				+ USB_DT_INTERFACE_SIZE
+ 				+ 2 * USB_DT_ENDPOINT_SIZE;
++
+ #ifdef HIGHSPEED
+ 	int		hs;
+ #endif
+@@ -636,6 +712,7 @@ config_buf (enum usb_device_speed speed,
+ 		hs = !hs;
+ #endif
+ 
++#ifdef DEV_CONFIG_CDC
+ 	/* control interface, class descriptors, optional status endpoint */
+ 	memcpy (buf, &control_intf, USB_DT_INTERFACE_SIZE);
+ 	buf += USB_DT_INTERFACE_SIZE;
+@@ -660,6 +737,7 @@ config_buf (enum usb_device_speed speed,
+ 	/* default data altsetting has no endpoints */
+ 	memcpy (buf, &data_nop_intf, USB_DT_INTERFACE_SIZE);
+ 	buf += USB_DT_INTERFACE_SIZE;
++#endif /* DEV_CONFIG_CDC */
+ 
+ 	/* the "real" data interface has two endpoints */
+ 	memcpy (buf, &data_intf, USB_DT_INTERFACE_SIZE);
+@@ -684,6 +762,8 @@ config_buf (enum usb_device_speed speed,
+ 
+ /*-------------------------------------------------------------------------*/
+ 
++static void eth_start (struct eth_dev *dev, int gfp_flags);
++
+ static int
+ set_ether_config (struct eth_dev *dev, int gfp_flags)
+ {
+@@ -694,7 +774,8 @@ set_ether_config (struct eth_dev *dev, i
+ 	gadget_for_each_ep (ep, gadget) {
+ 		const struct usb_endpoint_descriptor	*d;
+ 
+-		/* NOTE:  the host isn't allowed to use these two data
++#ifdef	DEV_CONFIG_CDC
++		/* With CDC,  the host isn't allowed to use these two data
+ 		 * endpoints in the default altsetting for the interface.
+ 		 * so we don't activate them yet.
+ 		 */
+@@ -714,10 +795,11 @@ set_ether_config (struct eth_dev *dev, i
+ 			dev->out_ep = ep;
+ 			dev->out = d;
+ 			continue;
++		}
+ 
+ #ifdef	EP_STATUS_NUM
+ 		/* optional status/notification endpoint */
+-		} else if (strcmp (ep->name, EP_STATUS_NAME) == 0) {
++		else if (strcmp (ep->name, EP_STATUS_NAME) == 0) {
+ 			d = ep_desc (gadget, &hs_status_desc, &fs_status_desc);
+ 			result = usb_ep_enable (ep, d);
+ 			if (result == 0) {
+@@ -726,16 +808,57 @@ set_ether_config (struct eth_dev *dev, i
+ 				dev->status = d;
+ 				continue;
+ 			}
++		}
+ #endif
+ 
++#else	/* !CONFIG_CDC_ETHER */
++
++		/* non-CDC is simpler:  if the device is there,
++		 * it's live with rx and tx endpoints.
++		 */
++		/* one endpoint writes data back IN to the host */
++		if (strcmp (ep->name, EP_IN_NAME) == 0) {
++			d = ep_desc (gadget, &hs_source_desc, &fs_source_desc);
++			result = usb_ep_enable (ep, d);
++			if (result == 0) {
++				ep->driver_data = dev;
++				dev->in_ep = ep;
++				dev->in = d;
++				continue;
++			}
++
++		/* one endpoint just reads OUT packets */
++		} else if (strcmp (ep->name, EP_OUT_NAME) == 0) {
++			d = ep_desc (gadget, &hs_sink_desc, &fs_sink_desc);
++			result = usb_ep_enable (ep, d);
++			if (result == 0) {
++				ep->driver_data = dev;
++				dev->out_ep = ep;
++				dev->out = d;
++				continue;
++			}
++		}
++
++#endif /* !CONFIG_CDC_ETHER */
++
+ 		/* ignore any other endpoints */
+-		} else
++		else
+ 			continue;
+ 
+ 		/* stop on error */
+ 		ERROR (dev, "can't enable %s, result %d\n", ep->name, result);
+ 		break;
+ 	}
++	if (!result && (!dev->in_ep || !dev->out_ep))
++		result = -ENODEV;
++
++#ifndef	DEV_CONFIG_CDC
++	if (result == 0) {
++		netif_carrier_on (dev->net);
++		if (netif_running (dev->net))
++			eth_start (dev, GFP_ATOMIC);
++	}
++#endif /* !CONFIG_CDC_ETHER */
+ 
+ 	if (result == 0)
+ 		DEBUG (dev, "qlen %d\n", qlen (gadget));
+@@ -751,8 +874,8 @@ static void eth_reset_config (struct eth
+ 
+ 	DEBUG (dev, "%s\n", __FUNCTION__);
+ 
+-	netif_stop_queue (&dev->net);
+-	netif_carrier_off (&dev->net);
++	netif_stop_queue (dev->net);
++	netif_carrier_off (dev->net);
+ 
+ 	/* just disable endpoints, forcing completion of pending i/o.
+ 	 * all our completion handlers free their requests in this case.
+@@ -797,7 +920,7 @@ eth_set_config (struct eth_dev *dev, uns
+ 	hw_optimize (gadget);
+ 
+ 	switch (number) {
+-	case CONFIG_CDC_ETHER:
++	case DEV_CONFIG_VALUE:
+ 		result = set_ether_config (dev, gfp_flags);
+ 		break;
+ 	default:
+@@ -807,8 +930,6 @@ eth_set_config (struct eth_dev *dev, uns
+ 		return result;
+ 	}
+ 
+-	if (!result && (!dev->in_ep || !dev->out_ep))
+-		result = -ENODEV;
+ 	if (result)
+ 		eth_reset_config (dev);
+ 	else {
+@@ -896,6 +1017,7 @@ static void issue_start_status (struct e
+ 	 * FIXME ugly idiom, maybe we'd be better with just
+ 	 * a "cancel the whole queue" primitive since any
+ 	 * unlink-one primitive has way too many error modes.
++	 * here, we "know" toggle is already clear...
+ 	 */
+ 	usb_ep_disable (dev->status_ep);
+ 	usb_ep_enable (dev->status_ep, dev->status);
+@@ -953,8 +1075,6 @@ static void eth_setup_complete (struct u
+  */
+ #define CDC_SET_ETHERNET_PACKET_FILTER	0x43	/* required */
+ 
+-static void eth_start (struct eth_dev *dev, int gfp_flags);
+-
+ /*
+  * The setup() callback implements all the ep0 functionality that's not
+  * handled lower down.  CDC has a number of less-common features:
+@@ -1018,6 +1138,17 @@ eth_setup (struct usb_gadget *gadget, co
+ 		value = eth_set_config (dev, ctrl->wValue, GFP_ATOMIC);
+ 		spin_unlock (&dev->lock);
+ 		break;
++#ifdef	CONFIG_USB_ETH_PXA2XX
++	/* PXA UDC prevents us from using SET_INTERFACE in normal ways.
++	 * And it hides GET_CONFIGURATION and GET_INTERFACE too.
++	 */
++	case USB_REQ_SET_INTERFACE:
++		spin_lock (&dev->lock);
++		value = eth_set_config (dev, DEV_CONFIG_VALUE, GFP_ATOMIC);
++		spin_unlock (&dev->lock);
++		break;
++
++#else	/* hardware that that stays out of our way */
+ 	case USB_REQ_GET_CONFIGURATION:
+ 		if (ctrl->bRequestType != USB_DIR_IN)
+ 			break;
+@@ -1056,15 +1187,15 @@ eth_setup (struct usb_gadget *gadget, co
+ 			if (ctrl->wValue == 1) {
+ 				usb_ep_enable (dev->in_ep, dev->in);
+ 				usb_ep_enable (dev->out_ep, dev->out);
+-				netif_carrier_on (&dev->net);
++				netif_carrier_on (dev->net);
+ #ifdef	EP_STATUS_NUM
+ 				issue_start_status (dev);
+ #endif
+-				if (netif_running (&dev->net))
++				if (netif_running (dev->net))
+ 					eth_start (dev, GFP_ATOMIC);
+ 			} else {
+-				netif_stop_queue (&dev->net);
+-				netif_carrier_off (&dev->net);
++				netif_stop_queue (dev->net);
++				netif_carrier_off (dev->net);
+ 			}
+ 			value = 0;
+ 			break;
+@@ -1079,12 +1210,14 @@ eth_setup (struct usb_gadget *gadget, co
+ 
+ 		/* if carrier is on, data interface is active. */
+ 		*(u8 *)req->buf =
+-			((ctrl->wIndex == 1) && netif_carrier_ok (&dev->net))
++			((ctrl->wIndex == 1) && netif_carrier_ok (dev->net))
+ 				? 1
+ 				: 0,
+ 		value = min (ctrl->wLength, (u16) 1);
+ 		break;
++#endif
+ 
++#ifdef DEV_CONFIG_CDC
+ 	case CDC_SET_ETHERNET_PACKET_FILTER:
+ 		/* see 6.2.30: no data, wIndex = interface,
+ 		 * wValue = packet filter bitmap
+@@ -1099,6 +1232,7 @@ eth_setup (struct usb_gadget *gadget, co
+ 		 */
+ 		value = 0;
+ 		break;
++#endif /* DEV_CONFIG_CDC */
+ 
+ 	default:
+ 		VDEBUG (dev,
+@@ -1129,8 +1263,8 @@ eth_disconnect (struct usb_gadget *gadge
+ 	unsigned long		flags;
+ 
+ 	spin_lock_irqsave (&dev->lock, flags);
+-	netif_stop_queue (&dev->net);
+-	netif_carrier_off (&dev->net);
++	netif_stop_queue (dev->net);
++	netif_carrier_off (dev->net);
+ 	eth_reset_config (dev);
+ 	spin_unlock_irqrestore (&dev->lock, flags);
+ 
+@@ -1175,10 +1309,10 @@ static int eth_ethtool_ioctl (struct net
+ 
+ 		memset (&info, 0, sizeof info);
+ 		info.cmd = ETHTOOL_GDRVINFO;
+-		strncpy (info.driver, shortname, sizeof info.driver);
+-		strncpy (info.version, DRIVER_VERSION, sizeof info.version);
+-		strncpy (info.fw_version, CHIP, sizeof info.fw_version);
+-		strncpy (info.bus_info, dev->gadget->dev.bus_id,
++		strlcpy (info.driver, shortname, sizeof info.driver);
++		strlcpy (info.version, DRIVER_VERSION, sizeof info.version);
++		strlcpy (info.fw_version, CHIP, sizeof info.fw_version);
++		strlcpy (info.bus_info, dev->gadget->dev.bus_id,
+ 			sizeof info.bus_info);
+ 		if (copy_to_user (useraddr, &info, sizeof (info)))
+ 			return -EFAULT;
+@@ -1227,7 +1361,7 @@ rx_submit (struct eth_dev *dev, struct u
+ 	int			retval = 0;
+ 	size_t			size;
+ 
+-	size = (sizeof (struct ethhdr) + dev->net.mtu + RX_EXTRA);
++	size = (sizeof (struct ethhdr) + dev->net->mtu + RX_EXTRA);
+ 
+ 	if ((skb = alloc_skb (size, gfp_flags)) == 0) {
+ 		DEBUG (dev, "no rx skb\n");
+@@ -1241,16 +1375,9 @@ rx_submit (struct eth_dev *dev, struct u
+ 	req->complete = rx_complete;
+ 	req->context = skb;
+ 
+-	if (netif_running (&dev->net)) {
+-		retval = usb_ep_queue (dev->out_ep, req, gfp_flags);
+-		if (retval == -ENOMEM)
+-			defer_kevent (dev, WORK_RX_MEMORY);
+-		if (retval)
+-			DEBUG (dev, "%s %d\n", __FUNCTION__, retval);
+-	} else {
+-		DEBUG (dev, "%s stopped\n", __FUNCTION__);
+-		retval = -ENOLINK;
+-	}
++	retval = usb_ep_queue (dev->out_ep, req, gfp_flags);
++	if (retval == -ENOMEM)
++		defer_kevent (dev, WORK_RX_MEMORY);
+ 	if (retval) {
+ 		DEBUG (dev, "rx submit --> %d\n", retval);
+ 		dev_kfree_skb_any (skb);
+@@ -1278,8 +1405,8 @@ static void rx_complete (struct usb_ep *
+ 			break;
+ 		}
+ 
+-		skb->dev = &dev->net;
+-		skb->protocol = eth_type_trans (skb, &dev->net);
++		skb->dev = dev->net;
++		skb->protocol = eth_type_trans (skb, dev->net);
+ 		dev->stats.rx_packets++;
+ 		dev->stats.rx_bytes += skb->len;
+ 
+@@ -1294,9 +1421,7 @@ static void rx_complete (struct usb_ep *
+ 	case -ECONNRESET:		// unlink
+ 	case -ESHUTDOWN:		// disconnect etc
+ 		VDEBUG (dev, "rx shutdown, code %d\n", status);
+-		usb_ep_free_request (dev->out_ep, req);
+-		req = 0;
+-		break;
++		goto clean;
+ 
+ 	/* data overrun */
+ 	case -EOVERFLOW:
+@@ -1311,7 +1436,11 @@ static void rx_complete (struct usb_ep *
+ 
+ 	if (skb)
+ 		dev_kfree_skb_any (skb);
+-
++	if (!netif_running (dev->net)) {
++clean:
++		usb_ep_free_request (dev->out_ep, req);
++		req = 0;
++	}
+ 	if (req)
+ 		rx_submit (dev, req, GFP_ATOMIC);
+ }
+@@ -1323,7 +1452,7 @@ static void eth_work (void *_dev)
+ 	if (test_bit (WORK_RX_MEMORY, &dev->todo)) {
+ 		struct usb_request	*req = 0;
+ 
+-		if (netif_running (&dev->net))
++		if (netif_running (dev->net))
+ 			req = usb_ep_alloc_request (dev->in_ep, GFP_KERNEL);
+ 		else
+ 			clear_bit (WORK_RX_MEMORY, &dev->todo);
+@@ -1342,18 +1471,25 @@ static void tx_complete (struct usb_ep *
+ 	struct sk_buff	*skb = req->context;
+ 	struct eth_dev	*dev = ep->driver_data;
+ 
+-	if (req->status)
++	switch (req->status) {
++	default:
+ 		dev->stats.tx_errors++;
+-	else
++		VDEBUG (dev, "tx err %d\n", req->status);
++		/* FALLTHROUGH */
++	case -ECONNRESET:		// unlink
++	case -ESHUTDOWN:		// disconnect etc
++		break;
++	case 0:
+ 		dev->stats.tx_bytes += skb->len;
++	}
+ 	dev->stats.tx_packets++;
+ 
+ 	usb_ep_free_request (ep, req);
+ 	dev_kfree_skb_any (skb);
+ 
+ 	atomic_inc (&dev->tx_qlen);
+-	if (netif_carrier_ok (&dev->net))
+-		netif_wake_queue (&dev->net);
++	if (netif_carrier_ok (dev->net))
++		netif_wake_queue (dev->net);
+ }
+ 
+ static int eth_start_xmit (struct sk_buff *skb, struct net_device *net)
+@@ -1437,7 +1573,7 @@ static void eth_start (struct eth_dev *d
+ 
+ 	/* and open the tx floodgates */ 
+ 	atomic_set (&dev->tx_qlen, size);
+-	netif_wake_queue (&dev->net);
++	netif_wake_queue (dev->net);
+ }
+ 
+ static int eth_open (struct net_device *net)
+@@ -1445,10 +1581,8 @@ static int eth_open (struct net_device *
+ 	struct eth_dev		*dev = (struct eth_dev *) net->priv;
+ 
+ 	DEBUG (dev, "%s\n", __FUNCTION__);
+-	down (&dev->mutex);
+-	if (netif_carrier_ok (&dev->net))
++	if (netif_carrier_ok (dev->net))
+ 		eth_start (dev, GFP_KERNEL);
+-	up (&dev->mutex);
+ 	return 0;
+ }
+ 
+@@ -1457,7 +1591,6 @@ static int eth_stop (struct net_device *
+ 	struct eth_dev		*dev = (struct eth_dev *) net->priv;
+ 
+ 	DEBUG (dev, "%s\n", __FUNCTION__);
+-	down (&dev->mutex);
+ 	netif_stop_queue (net);
+ 
+ 	DEBUG (dev, "stop stats: rx/tx %ld/%ld, errs %ld/%ld\n",
+@@ -1469,7 +1602,7 @@ static int eth_stop (struct net_device *
+ 	if (dev->gadget->speed != USB_SPEED_UNKNOWN) {
+ 		usb_ep_disable (dev->in_ep);
+ 		usb_ep_disable (dev->out_ep);
+-		if (netif_carrier_ok (&dev->net)) {
++		if (netif_carrier_ok (dev->net)) {
+ 			DEBUG (dev, "host still using in/out endpoints\n");
+ 			usb_ep_enable (dev->in_ep, dev->in);
+ 			usb_ep_enable (dev->out_ep, dev->out);
+@@ -1480,7 +1613,6 @@ static int eth_stop (struct net_device *
+ #endif
+ 	}
+ 
+-	up (&dev->mutex);
+ 	return 0;
+ }
+ 
+@@ -1492,7 +1624,6 @@ eth_unbind (struct usb_gadget *gadget)
+ 	struct eth_dev		*dev = get_gadget_data (gadget);
+ 
+ 	DEBUG (dev, "unbind\n");
+-	down (&dev->mutex);
+ 
+ 	/* we've already been disconnected ... no i/o is active */
+ 	if (dev->req) {
+@@ -1500,15 +1631,13 @@ eth_unbind (struct usb_gadget *gadget)
+ 				dev->req->buf, dev->req->dma,
+ 				USB_BUFSIZ);
+ 		usb_ep_free_request (gadget->ep0, dev->req);
++		dev->req = 0;
+ 	}
+ 
+-	unregister_netdev (&dev->net);
+-	up (&dev->mutex);
++	unregister_netdev (dev->net);
+ 
+ 	/* assuming we used keventd, it must quiesce too */
+ 	flush_scheduled_work ();
+-
+-	kfree (dev);
+ 	set_gadget_data (gadget, 0);
+ }
+ 
+@@ -1517,22 +1646,24 @@ eth_bind (struct usb_gadget *gadget)
+ {
+ 	struct eth_dev		*dev;
+ 	struct net_device	*net;
++	int			status = -ENOMEM;
++#ifdef	DEV_CONFIG_CDC
+ 	u8			node_id [ETH_ALEN];
+ 
+ 	/* just one upstream link at a time */
+ 	if (ethaddr [0] != 0)
+ 		return -ENODEV;
++#endif
+ 
+-	dev = kmalloc (sizeof *dev, SLAB_KERNEL);
+-	if (!dev)
+-		return -ENOMEM;
+-	memset (dev, 0, sizeof *dev);
++ 	net = alloc_etherdev (sizeof *dev);
++ 	if (!net)
++		return status;
++	dev = net->priv;
+ 	spin_lock_init (&dev->lock);
+-	init_MUTEX_LOCKED (&dev->mutex);
+ 	INIT_WORK (&dev->work, eth_work, dev);
+ 
+ 	/* network device setup */
+-	net = &dev->net;
++	dev->net = net;
+ 	SET_MODULE_OWNER (net);
+ 	net->priv = dev;
+ 	strcpy (net->name, "usb%d");
+@@ -1545,6 +1676,7 @@ eth_bind (struct usb_gadget *gadget)
+ 	net->dev_addr [0] &= 0xfe;	// clear multicast bit
+ 	net->dev_addr [0] |= 0x02;	// set local assignment bit (IEEE802)
+ 
++#ifdef	DEV_CONFIG_CDC
+ 	/* ... another address for the host, on the other end of the
+ 	 * link, gets exported through CDC (see CDC spec table 41)
+ 	 */
+@@ -1554,6 +1686,7 @@ eth_bind (struct usb_gadget *gadget)
+ 	snprintf (ethaddr, sizeof ethaddr, "%02X%02X%02X%02X%02X%02X",
+ 		node_id [0], node_id [1], node_id [2],
+ 		node_id [3], node_id [4], node_id [5]);
++#endif
+ 
+ 	net->change_mtu = eth_change_mtu;
+ 	net->get_stats = eth_get_stats;
+@@ -1567,36 +1700,38 @@ eth_bind (struct usb_gadget *gadget)
+ 	/* preallocate control response and buffer */
+ 	dev->req = usb_ep_alloc_request (gadget->ep0, GFP_KERNEL);
+ 	if (!dev->req)
+-		goto enomem;
++		goto fail;
+ 	dev->req->complete = eth_setup_complete;
+ 	dev->req->buf = usb_ep_alloc_buffer (gadget->ep0, USB_BUFSIZ,
+ 				&dev->req->dma, GFP_KERNEL);
+ 	if (!dev->req->buf) {
+ 		usb_ep_free_request (gadget->ep0, dev->req);
+-		goto enomem;
++		goto fail;
+ 	}
+ 
+ 	/* finish hookup to lower layer ... */
+ 	dev->gadget = gadget;
+ 	set_gadget_data (gadget, dev);
+ 	gadget->ep0->driver_data = dev;
+-
++	INFO (dev, "%s, " CHIP ", version: " DRIVER_VERSION "\n", driver_desc);
++#ifdef	DEV_CONFIG_CDC
++	INFO (dev, "CDC host enet %s\n", ethaddr);
++#endif
++	
+ 	/* two kinds of host-initiated state changes:
+ 	 *  - iff DATA transfer is active, carrier is "on"
+ 	 *  - tx queueing enabled if open *and* carrier is "on"
+ 	 */
+-	INFO (dev, "%s, host enet %s, version: " DRIVER_VERSION "\n",
+-			driver_desc, ethaddr);
+-	register_netdev (&dev->net);
+-	netif_stop_queue (&dev->net);
+-	netif_carrier_off (&dev->net);
+-
+-	up (&dev->mutex);
+-	return 0;
++	netif_stop_queue (dev->net);
++	netif_carrier_off (dev->net);
+ 
+-enomem:
++ 	// SET_NETDEV_DEV (dev->net, &gadget->dev);
++ 	status = register_netdev (dev->net);
++ 	if (status == 0)
++ 		return status;
++fail:
+ 	eth_unbind (gadget);
+-	return -ENOMEM;
++	return status;
+ }
+ 
+ /*-------------------------------------------------------------------------*/
+--- linux-2.6.0-test1/drivers/usb/gadget/net2280.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/gadget/net2280.c	2003-07-19 17:03:50.000000000 -0700
+@@ -2496,7 +2496,7 @@ static void net2280_remove (struct pci_d
+ 	device_remove_file (&pdev->dev, &dev_attr_registers);
+ 	pci_set_drvdata (pdev, 0);
+ 
+-	INFO (dev, "unbind from pci %s\n", pdev->slot_name);
++	INFO (dev, "unbind from pci %s\n", pci_name(pdev));
+ 
+ 	kfree (dev);
+ 	the_controller = 0;
+@@ -2518,7 +2518,7 @@ static int net2280_probe (struct pci_dev
+ 	 * usb_gadget_driver_{register,unregister}() must change.
+ 	 */
+ 	if (the_controller) {
+-		WARN (the_controller, "ignoring %s\n", pdev->slot_name);
++		WARN (the_controller, "ignoring %s\n", pci_name(pdev));
+ 		return -EBUSY;
+ 	}
+ 
+@@ -2534,7 +2534,7 @@ static int net2280_probe (struct pci_dev
+ 	dev->pdev = pdev;
+ 	dev->gadget.ops = &net2280_ops;
+ 
+-	strcpy (dev->gadget.dev.bus_id, pdev->slot_name);
++	strcpy (dev->gadget.dev.bus_id, pci_name(pdev));
+ 	strcpy (dev->gadget.dev.name, pdev->dev.name);
+ 	dev->gadget.dev.parent = &pdev->dev;
+ 	dev->gadget.dev.dma_mask = pdev->dev.dma_mask;
+--- linux-2.6.0-test1/drivers/usb/gadget/net2280.h	2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/usb/gadget/net2280.h	2003-07-19 17:03:50.000000000 -0700
+@@ -654,7 +654,7 @@ static inline void net2280_led_shutdown 
+ 
+ #define xprintk(dev,level,fmt,args...) \
+ 	printk(level "%s %s: " fmt , driver_name , \
+-			dev->pdev->slot_name , ## args)
++			pci_name(dev->pdev) , ## args)
+ 
+ #ifdef DEBUG
+ #undef DEBUG
+--- linux-2.6.0-test1/drivers/usb/gadget/zero.c	2003-06-14 12:18:08.000000000 -0700
++++ 25/drivers/usb/gadget/zero.c	2003-07-19 17:03:50.000000000 -0700
+@@ -92,7 +92,7 @@
+ 
+ /*-------------------------------------------------------------------------*/
+ 
+-#define DRIVER_VERSION		"19 Feb 2003"
++#define DRIVER_VERSION		"Bastille Day 2003"
+ 
+ static const char shortname [] = "zero";
+ static const char longname [] = "Gadget Zero";
+@@ -160,18 +160,18 @@ static inline void hw_optimize (struct u
+ #endif
+ 
+ /*
+- * PXA-250 UDC:  widely used in second gen Linux-capable PDAs.
++ * PXA-2xx UDC:  widely used in second gen Linux-capable PDAs.
+  *
+  * This has fifteen fixed-function full speed endpoints, and it
+  * can support all USB transfer types.
+  *
+- * It only supports three configurations (numbered 1, 2, or 3)
+- * with two interfaces each ... there's partial hardware support
+- * for set_configuration and set_interface, preventing some more
+- * interesting config/interface/endpoint arrangements.
++ * These supports three or four configurations, with fixed numbers.
++ * The hardware interprets SET_INTERFACE, net effect is that you
++ * can't use altsettings or reset the interfaces independently.
++ * So stick to a single interface.
+  */
+-#ifdef	CONFIG_USB_ZERO_PXA250
+-#define CHIP			"pxa250"
++#ifdef	CONFIG_USB_ZERO_PXA2XX
++#define CHIP			"pxa2xx"
+ #define DRIVER_VERSION_NUM	0x0103
+ #define EP0_MAXPACKET		16
+ static const char EP_OUT_NAME [] = "ep12out-bulk";
+@@ -291,9 +291,12 @@ struct zero_dev {
+ 
+ static unsigned buflen = 4096;
+ static unsigned qlen = 32;
++static unsigned pattern = 0;
+ 
+ module_param (buflen, uint, S_IRUGO|S_IWUSR);
+ module_param (qlen, uint, S_IRUGO|S_IWUSR);
++module_param (pattern, uint, S_IRUGO|S_IWUSR);
++
+ 
+ /*
+  * Normally the "loopback" configuration is second (index 1) so
+@@ -497,8 +500,8 @@ static struct usb_gadget_strings	stringt
+ 
+ /*
+  * config descriptors are also handcrafted.  these must agree with code
+- * that sets configurations, and with code managing interface altsettings.
+- * other complexity may come from:
++ * that sets configurations, and with code managing interfaces and their
++ * altsettings.  other complexity may come from:
+  *
+  *  - high speed support, including "other speed config" rules
+  *  - multiple configurations
+@@ -506,7 +509,7 @@ static struct usb_gadget_strings	stringt
+  *  - embedded class or vendor-specific descriptors
+  *
+  * this handles high speed, and has a second config that could as easily
+- * have been an alternate interface setting.
++ * have been an alternate interface setting (on most hardware).
+  *
+  * NOTE:  to demonstrate (and test) more USB capabilities, this driver
+  * should include an altsetting to test interrupt transfers, including
+@@ -608,16 +611,29 @@ check_read_data (
+ 	struct usb_request	*req
+ )
+ {
+-	int i;
++	unsigned	i;
++	u8		*buf = req->buf;
+ 
+-	for (i = 0; i < req->actual; i++) {
+-		if (((u8 *)req->buf) [i] != 0) {
+-			ERROR (dev, "nonzero OUT byte from host, "
+-					"buf [%d] = %d\n",
+-					i, ((u8 *)req->buf) [i]);
+-			usb_ep_set_halt (ep);
+-			return -EINVAL;
++	for (i = 0; i < req->actual; i++, buf++) {
++		switch (pattern) {
++		/* all-zeroes has no synchronization issues */
++		case 0:
++			if (*buf == 0)
++				continue;
++			break;
++		/* mod63 stays in sync with short-terminated transfers,
++		 * or otherwise when host and gadget agree on how large
++		 * each usb transfer request should be.  resync is done
++		 * with set_interface or set_config.
++		 */
++		case 1:
++			if (*buf == (u8)(i % 63))
++				continue;
++			break;
+ 		}
++		ERROR (dev, "bad OUT byte, buf [%d] = %d\n", i, *buf);
++		usb_ep_set_halt (ep);
++		return -EINVAL;
+ 	}
+ 	return 0;
+ }
+@@ -629,7 +645,18 @@ reinit_write_data (
+ 	struct usb_request	*req
+ )
+ {
+-	memset (req->buf, 0, req->length);
++	unsigned	i;
++	u8		*buf = req->buf;
++
++	switch (pattern) {
++	case 0:
++		memset (req->buf, 0, req->length);
++		break;
++	case 1:
++		for  (i = 0; i < req->length; i++)
++			*buf++ = (u8) (i % 63);
++		break;
++	}
+ }
+ 
+ /* if there is only one request in the queue, there'll always be an
+@@ -651,10 +678,13 @@ static void source_sink_complete (struct
+ 		break;
+ 
+ 	/* this endpoint is normally active while we're configured */
++	case -ECONNABORTED: 		/* hardware forced ep reset */
+ 	case -ECONNRESET:		/* request dequeued */
+ 	case -ESHUTDOWN:		/* disconnect from host */
+ 		VDEBUG (dev, "%s gone (%d), %d/%d\n", ep->name, status,
+ 				req->actual, req->length);
++		if (ep == dev->out_ep)
++			check_read_data (dev, ep, req);
+ 		free_ep_req (ep, req);
+ 		return;
+ 
+@@ -693,6 +723,9 @@ source_sink_start_ep (struct usb_ep *ep,
+ 	memset (req->buf, 0, req->length);
+ 	req->complete = source_sink_complete;
+ 
++	if (strcmp (ep->name, EP_IN_NAME) == 0)
++		reinit_write_data (ep->driver_data, ep, req);
++
+ 	status = usb_ep_queue (ep, req, gfp_flags);
+ 	if (status) {
+ 		struct zero_dev	*dev = ep->driver_data;
+@@ -801,6 +834,8 @@ static void loopback_complete (struct us
+ 	 * rely on the hardware driver to clean up on disconnect or
+ 	 * endpoint disable.
+ 	 */
++	case -ECONNABORTED: 		/* hardware forced ep reset */
++	case -ECONNRESET:		/* request dequeued */
+ 	case -ESHUTDOWN:		/* disconnect from host */
+ 		free_ep_req (ep, req);
+ 		return;
+@@ -905,7 +940,7 @@ static void zero_reset_config (struct ze
+  *
+  * note that some device controller hardware will constrain what this
+  * code can do, perhaps by disallowing more than one configuration or
+- * by limiting configuration choices (like the pxa250).
++ * by limiting configuration choices (like the pxa2xx).
+  */
+ static int
+ zero_set_config (struct zero_dev *dev, unsigned number, int gfp_flags)
+@@ -1046,7 +1081,8 @@ zero_setup (struct usb_gadget *gadget, c
+ 		break;
+ 
+ 	/* until we add altsetting support, or other interfaces,
+-	 * only 0/0 are possible.
++	 * only 0/0 are possible.  pxa2xx only supports 0/0 (poorly)
++	 * and already killed pending endpoint I/O.
+ 	 */
+ 	case USB_REQ_SET_INTERFACE:
+ 		if (ctrl->bRequestType != USB_RECIP_INTERFACE)
+--- linux-2.6.0-test1/drivers/usb/host/ohci-hcd.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/usb/host/ohci-hcd.c	2003-07-19 17:03:50.000000000 -0700
+@@ -319,6 +319,7 @@ ohci_endpoint_disable (struct usb_hcd *h
+ 	int			epnum = ep & USB_ENDPOINT_NUMBER_MASK;
+ 	unsigned long		flags;
+ 	struct ed		*ed;
++	unsigned		limit = 1000;
+ 
+ 	/* ASSERT:  any requests/urbs are being unlinked */
+ 	/* ASSERT:  nobody can be submitting urbs for this any more */
+@@ -337,6 +338,8 @@ rescan:
+ 		ed->state = ED_IDLE;
+ 	switch (ed->state) {
+ 	case ED_UNLINK:		/* wait for hw to finish? */
++		/* major IRQ delivery trouble loses INTR_SF too... */
++		WARN_ON (limit-- == 0);
+ 		spin_unlock_irqrestore (&ohci->lock, flags);
+ 		set_current_state (TASK_UNINTERRUPTIBLE);
+ 		schedule_timeout (1);
+--- linux-2.6.0-test1/drivers/usb/host/ohci-q.c	2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/usb/host/ohci-q.c	2003-07-19 17:03:50.000000000 -0700
+@@ -43,6 +43,16 @@ finish_urb (struct ohci_hcd *ohci, struc
+ 	spin_lock (&urb->lock);
+ 	if (likely (urb->status == -EINPROGRESS))
+ 		urb->status = 0;
++	/* report short control reads right even though the data TD always
++	 * has TD_R set.  (much simpler, but creates the 1-td limit.)
++	 */
++	if (unlikely (urb->transfer_flags & URB_SHORT_NOT_OK)
++			&& unlikely (usb_pipecontrol (urb->pipe))
++			&& urb->actual_length < urb->transfer_buffer_length
++			&& usb_pipein (urb->pipe)
++			&& urb->status == 0) {
++		urb->status = -EREMOTEIO;
++	}
+ 	spin_unlock (&urb->lock);
+ 
+ 	// what lock protects these?
+--- linux-2.6.0-test1/drivers/usb/host/uhci-hcd.c	2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/usb/host/uhci-hcd.c	2003-07-19 17:03:50.000000000 -0700
+@@ -2007,19 +2007,17 @@ static int suspend_allowed(struct uhci_h
+ 	unsigned int io_addr = uhci->io_addr;
+ 	int i;
+ 
+-	if (!uhci->hcd.pdev ||
+-	     uhci->hcd.pdev->vendor != PCI_VENDOR_ID_INTEL ||
+-	     uhci->hcd.pdev->device != PCI_DEVICE_ID_INTEL_82371AB_2)
++	if (!uhci->hcd.pdev || uhci->hcd.pdev->vendor != PCI_VENDOR_ID_INTEL)
+ 		return 1;
+ 
+-	/* This is a 82371AB/EB/MB USB controller which has a bug that
+-	 * causes false resume indications if any port has an
+-	 * over current condition.  To prevent problems, we will not
+-	 * allow a global suspend if any ports are OC.
++	/* Some of Intel's USB controllers have a bug that causes false
++	 * resume indications if any port has an over current condition.
++	 * To prevent problems, we will not allow a global suspend if
++	 * any ports are OC.
+ 	 *
+-	 * Some motherboards using the 82371AB/EB/MB (but not the USB portion)
+-	 * appear to hardwire the over current inputs active to disable
+-	 * the USB ports.
++	 * Some motherboards using Intel's chipsets (but not using all
++	 * the USB ports) appear to hardwire the over current inputs active
++	 * to disable the USB ports.
+ 	 */
+ 
+ 	/* check for over current condition on any port */
+--- linux-2.6.0-test1/drivers/usb/image/hpusbscsi.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/image/hpusbscsi.c	2003-07-19 17:03:50.000000000 -0700
+@@ -9,7 +9,7 @@
+ #include <linux/smp_lock.h>
+ #include <linux/usb.h>
+ #include <asm/atomic.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "../../scsi/scsi.h"
+ #include "../../scsi/hosts.h"
+ 
+@@ -109,7 +109,8 @@ hpusbscsi_usb_probe(struct usb_interface
+ 		goto out_unlink_controlurb;
+ 
+ 	new->host->hostdata[0] = (unsigned long)new;
+-	scsi_add_host(new->host, &intf->dev);
++	scsi_add_host(new->host, &intf->dev); /* XXX handle failure */
++	scsi_scan_host(new->host);
+ 
+ 	new->sense_command[0] = REQUEST_SENSE;
+ 	new->sense_command[4] = HPUSBSCSI_SENSE_LENGTH;
+@@ -306,7 +307,10 @@ DEBUG("Getting status byte %d \n",hpusbs
+ 	if(unlikely(u->status < 0)) {
+                 if (likely(hpusbscsi->state != HP_STATE_FREE))
+                         handle_usb_error(hpusbscsi);
+-		return;
++		if (u->status == -ECONNRESET || u->status == -ENOENT || u->status == -ESHUTDOWN)
++			return;
++		else
++			goto resub;
+ 	}
+ 
+ 	scsi_state = hpusbscsi->scsi_state_byte;
+@@ -348,6 +352,8 @@ DEBUG("Getting status byte %d \n",hpusbs
+ 	TRACE_STATE;
+ 		break;
+ 	}
++resub:
++	usb_submit_urb(u, GFP_ATOMIC);
+ }
+ 
+ static void simple_command_callback(struct urb *u, struct pt_regs *regs)
+@@ -427,7 +433,7 @@ static void simple_done (struct urb *u, 
+ 				hpusbscsi->state = HP_STATE_WAIT;
+ 			} else {
+ 				issue_request_sense(hpusbscsi);
+-			}			
++			}
+ 		}
+ 	} else {
+ 		if (likely(hpusbscsi->scallback != NULL))
+--- linux-2.6.0-test1/drivers/usb/image/microtek.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/image/microtek.c	2003-07-19 17:03:50.000000000 -0700
+@@ -134,7 +134,7 @@
+ #include <linux/proc_fs.h>
+ 
+ #include <asm/atomic.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "../../scsi/scsi.h"
+ #include "../../scsi/hosts.h"
+ 
+@@ -817,7 +817,8 @@ static int mts_usb_probe(struct usb_inte
+ 		goto out_free_urb;
+ 
+ 	new_desc->host->hostdata[0] = (unsigned long)new_desc;
+-	scsi_add_host(new_desc->host, NULL);
++	scsi_add_host(new_desc->host, NULL); /* XXX handle failure */
++	scsi_scan_host(new_desc->host);
+ 
+ 	usb_set_intfdata(intf, new_desc);
+ 	return 0;
+--- linux-2.6.0-test1/drivers/usb/image/scanner.c	2003-06-14 12:18:05.000000000 -0700
++++ 25/drivers/usb/image/scanner.c	2003-07-19 17:03:50.000000000 -0700
+@@ -364,6 +364,11 @@
+  *      Mustek, Pacific Image Electronics, Plustek, and Visioneer scanners.
+  *      Fixed names of some other scanners.
+  *
++ * 0.4.14  2003-07-15
++ *    - Fixed race between open and probe (Oliver Neukum).
++ *    - Added vendor/product ids for Avision, Canon, HP, Microtek and Relisys scanners.
++ *    - Clean up irq urb when not enough memory is available.
++ *
+  * TODO
+  *    - Performance
+  *    - Select/poll methods
+@@ -1068,6 +1073,9 @@ probe_scanner(struct usb_interface *intf
+ /* Ok, now initialize all the relevant values */
+ 	if (!(scn->obuf = (char *)kmalloc(OBUF_SIZE, GFP_KERNEL))) {
+ 		err("probe_scanner(%d): Not enough memory for the output buffer.", intf->minor);
++		if (have_intr)
++			usb_unlink_urb(scn->scn_irq);
++		usb_free_urb(scn->scn_irq);
+ 		kfree(scn);
+ 		up(&scn_mutex);
+ 		return -ENOMEM;
+@@ -1076,6 +1084,9 @@ probe_scanner(struct usb_interface *intf
+ 
+ 	if (!(scn->ibuf = (char *)kmalloc(IBUF_SIZE, GFP_KERNEL))) {
+ 		err("probe_scanner(%d): Not enough memory for the input buffer.", intf->minor);
++		if (have_intr)
++			usb_unlink_urb(scn->scn_irq);
++		usb_free_urb(scn->scn_irq);
+ 		kfree(scn->obuf);
+ 		kfree(scn);
+ 		up(&scn_mutex);
+@@ -1117,10 +1128,9 @@ probe_scanner(struct usb_interface *intf
+ 	info ("USB scanner device (0x%04x/0x%04x) now attached to %s",
+ 	      dev->descriptor.idVendor, dev->descriptor.idProduct, name);
+ 
+-	up(&scn_mutex);
+-
+ 	usb_set_intfdata(intf, scn);
+-
++	up(&scn_mutex);
++	
+ 	return 0;
+ }
+ 
+--- linux-2.6.0-test1/drivers/usb/image/scanner.h	2003-06-14 12:18:08.000000000 -0700
++++ 25/drivers/usb/image/scanner.h	2003-07-19 17:03:50.000000000 -0700
+@@ -43,7 +43,7 @@
+ 
+ // #define DEBUG
+ 
+-#define DRIVER_VERSION "0.4.13"
++#define DRIVER_VERSION "0.4.14"
+ #define DRIVER_DESC "USB Scanner Driver"
+ 
+ #include <linux/usb.h>
+@@ -103,6 +103,7 @@ static struct usb_device_id scanner_devi
+ 	/* Avision */
+ 	{ USB_DEVICE(0x0638, 0x0268) }, /* iVina 1200U */
+ 	{ USB_DEVICE(0x0638, 0x0a10) },	/* iVina FB1600 (=Umax Astra 4500) */
++	{ USB_DEVICE(0x0638, 0x0a20) }, /* iVina FB1800 (=Umax Astra 4700) */
+ 	/* Benq: see Acer */
+ 	/* Brother */
+ 	{ USB_DEVICE(0x04f9, 0x010f) },	/* MFC 5100C */
+@@ -115,10 +116,12 @@ static struct usb_device_id scanner_devi
+ 	{ USB_DEVICE(0x04a9, 0x2206) }, /* CanoScan N650U/N656U */
+ 	{ USB_DEVICE(0x04a9, 0x2207) }, /* CanoScan N1220U */
+ 	{ USB_DEVICE(0x04a9, 0x2208) }, /* CanoScan D660U */ 
++	{ USB_DEVICE(0x04a9, 0x220a) },	/* CanoScan D2400UF */
+ 	{ USB_DEVICE(0x04a9, 0x220b) }, /* CanoScan D646U */
+ 	{ USB_DEVICE(0x04a9, 0x220c) },	/* CanoScan D1250U2 */
+ 	{ USB_DEVICE(0x04a9, 0x220d) }, /* CanoScan N670U/N676U/LIDE 20 */
+ 	{ USB_DEVICE(0x04a9, 0x220e) }, /* CanoScan N1240U/LIDE 30 */
++	{ USB_DEVICE(0x04a9, 0x220f) },	/* CanoScan 8000F */
+ 	{ USB_DEVICE(0x04a9, 0x2213) },	/* LIDE 50 */
+ 	{ USB_DEVICE(0x04a9, 0x3042) }, /* FS4000US */
+ 	/* Colorado -- See Primax/Colorado below */
+@@ -158,6 +161,7 @@ static struct usb_device_id scanner_devi
+ 	{ USB_DEVICE(0x03f0, 0x0901) }, /* ScanJet 2300C */
+ 	{ USB_DEVICE(0x03F0, 0x1005) },	/* ScanJet 5400C */
+ 	{ USB_DEVICE(0x03F0, 0x1105) },	/* ScanJet 5470C */
++	{ USB_DEVICE(0x03f0, 0x1205) }, /* ScanJet 5550C */
+ 	{ USB_DEVICE(0x03f0, 0x1305) },	/* Scanjet 4570c */
+ 	{ USB_DEVICE(0x03f0, 0x1411) }, /* PSC 750 */
+ 	{ USB_DEVICE(0x03f0, 0x2005) },	/* ScanJet 3570c */
+@@ -173,6 +177,7 @@ static struct usb_device_id scanner_devi
+ 	/* Memorex */
+ 	{ USB_DEVICE(0x0461, 0x0346) }, /* 6136u - repackaged Primax ? */
+ 	/* Microtek */
++	{ USB_DEVICE(0x05da, 0x20c9) }, /* ScanMaker 6700 */
+ 	{ USB_DEVICE(0x05da, 0x30ce) },	/* ScanMaker 3800 */
+ 	{ USB_DEVICE(0x05da, 0x30cf) },	/* ScanMaker 4800 */
+ 	{ USB_DEVICE(0x04a7, 0x0224) },	/* Scanport 3000 (actually Visioneer?)*/
+@@ -250,6 +255,7 @@ static struct usb_device_id scanner_devi
+ 	{ USB_DEVICE(0x06dc, 0x0014) }, /* Winscan Pro 2448U */
+ 	/* Relisis */
+ 	// { USB_DEVICE(0x0475, 0x0103) },	/* Episode - undetected endpoint */
++	{ USB_DEVICE(0x0475, 0x0210) }, /* Scorpio Ultra 3 */
+ 	/* Seiko/Epson Corp. */
+ 	{ USB_DEVICE(0x04b8, 0x0101) },	/* Perfection 636U and 636Photo */
+ 	{ USB_DEVICE(0x04b8, 0x0102) }, /* GT-2200 */
+--- linux-2.6.0-test1/drivers/usb/media/dabusb.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/usb/media/dabusb.c	2003-07-19 17:03:50.000000000 -0700
+@@ -721,7 +721,7 @@ static struct usb_class_driver dabusb_cl
+ 
+ 
+ /* --------------------------------------------------------------------- */
+-static int dabusb_probe (struct usb_interface *intf, 
++static int dabusb_probe (struct usb_interface *intf,
+ 			 const struct usb_device_id *id)
+ {
+ 	struct usb_device *usbdev = interface_to_usbdev(intf);
+@@ -738,9 +738,7 @@ static int dabusb_probe (struct usb_inte
+ 	if (intf->altsetting->desc.bInterfaceNumber != _DABUSB_IF && usbdev->descriptor.idProduct == 0x9999)
+ 		return -ENODEV;
+ 
+-	retval = usb_register_dev(intf, &dabusb_class);
+-	if (retval)
+-		return -ENOMEM;
++
+ 
+ 	s = &dabusb[intf->minor];
+ 
+@@ -766,8 +764,15 @@ static int dabusb_probe (struct usb_inte
+ 		}
+ 	}
+ 	dbg("bound to interface: %d", ifnum);
+-	up (&s->mutex);
+ 	usb_set_intfdata (intf, s);
++	up (&s->mutex);
++
++	retval = usb_register_dev(intf, &dabusb_class);
++	if (retval) {
++		usb_set_intfdata (intf, NULL);
++		return -ENOMEM;
++	}
++
+ 	return 0;
+ 
+       reject:
+--- linux-2.6.0-test1/drivers/usb/media/vicam.c	2003-06-26 22:07:25.000000000 -0700
++++ 25/drivers/usb/media/vicam.c	2003-07-19 17:04:54.000000000 -0700
+@@ -611,15 +611,20 @@ vicam_ioctl(struct inode *inode, struct 
+ 
+ 	case VIDIOCSPICT:
+ 		{
+-			struct video_picture *vp = (struct video_picture *) arg;
++			struct video_picture vp;
+ 
+-			DBG("VIDIOCSPICT depth = %d, pal = %d\n", vp->depth,
+-			    vp->palette);
++			if (copy_from_user(&vp, arg, sizeof (vp))) {
++				retval = -EFAULT;
++				break;
++			}
+ 
+-			cam->gain = vp->brightness >> 8;
++			DBG("VIDIOCSPICT depth = %d, pal = %d\n", vp.depth,
++			    vp.palette);
+ 
+-			if (vp->depth != 24
+-			    || vp->palette != VIDEO_PALETTE_RGB24)
++			cam->gain = vp.brightness >> 8;
++
++			if (vp.depth != 24
++			    || vp.palette != VIDEO_PALETTE_RGB24)
+ 				retval = -EINVAL;
+ 
+ 			break;
+@@ -652,10 +657,15 @@ vicam_ioctl(struct inode *inode, struct 
+ 	case VIDIOCSWIN:
+ 		{
+ 
+-			struct video_window *vw = (struct video_window *) arg;
+-			DBG("VIDIOCSWIN %d x %d\n", vw->width, vw->height);
++			struct video_window vw;
++
++			if (copy_from_user(&vw, arg, sizeof (vw))) {
++				retval = -EFAULT;
++				break;
++			}
++			DBG("VIDIOCSWIN %d x %d\n", vw.width, vw.height);
+ 
+-			if ( vw->width != 320 || vw->height != 240 )
++			if ( vw.width != 320 || vw.height != 240 )
+ 				retval = -EFAULT;
+ 			
+ 			break;
+--- linux-2.6.0-test1/drivers/usb/misc/usblcd.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/misc/usblcd.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1,4 +1,4 @@
+-/***************************************************************************** 
++/*****************************************************************************
+  *                          USBLCD Kernel Driver                             *
+  *        See http://www.usblcd.de for Hardware and Documentation.           *
+  *                            Version 1.03                                   *
+@@ -18,7 +18,7 @@
+ #include <asm/uaccess.h>
+ #include <linux/usb.h>
+ 
+-#define DRIVER_VERSION "USBLCD Driver Version 1.03"
++#define DRIVER_VERSION "USBLCD Driver Version 1.04"
+ 
+ #define USBLCD_MINOR		144
+ 
+@@ -257,7 +257,7 @@ static int probe_lcd(struct usb_interfac
+ 	struct lcd_usb_data *lcd = &lcd_instance;
+ 	int i;
+ 	int retval;
+-	
++
+ 	if (dev->descriptor.idProduct != 0x0001  ) {
+ 		warn(KERN_INFO "USBLCD model not supported.");
+ 		return -ENODEV;
+@@ -274,30 +274,32 @@ static int probe_lcd(struct usb_interfac
+ 		(i & 0xF000)>>12,(i & 0xF00)>>8,(i & 0xF0)>>4,(i & 0xF),
+ 		dev->devnum);
+ 
+-	retval = usb_register_dev(intf, &usb_lcd_class);
+-	if (retval) {
+-		err("Not able to get a minor for this device.");
+-		return -ENOMEM;
+-	}
++
+ 
+ 	lcd->present = 1;
+ 	lcd->lcd_dev = dev;
+ 
+ 	if (!(lcd->obuf = (char *) kmalloc(OBUF_SIZE, GFP_KERNEL))) {
+ 		err("probe_lcd: Not enough memory for the output buffer");
+-		usb_deregister_dev(intf, &usb_lcd_class);
+ 		return -ENOMEM;
+ 	}
+ 	dbg("probe_lcd: obuf address:%p", lcd->obuf);
+ 
+ 	if (!(lcd->ibuf = (char *) kmalloc(IBUF_SIZE, GFP_KERNEL))) {
+ 		err("probe_lcd: Not enough memory for the input buffer");
+-		usb_deregister_dev(intf, &usb_lcd_class);
+ 		kfree(lcd->obuf);
+ 		return -ENOMEM;
+ 	}
+ 	dbg("probe_lcd: ibuf address:%p", lcd->ibuf);
+ 
++	retval = usb_register_dev(intf, &usb_lcd_class);
++	if (retval) {
++		err("Not able to get a minor for this device.");
++		kfree(lcd->obuf);
++		kfree(lcd->ibuf);
++		return -ENOMEM;
++	}
++
+ 	usb_set_intfdata (intf, lcd);
+ 	return 0;
+ }
+--- linux-2.6.0-test1/drivers/usb/misc/usbtest.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/misc/usbtest.c	2003-07-19 17:03:50.000000000 -0700
+@@ -47,6 +47,7 @@ struct usbtest_info {
+ 	const char		*name;
+ 	u8			ep_in;		/* bulk/intr source */
+ 	u8			ep_out;		/* bulk/intr sink */
++	unsigned		autoconf : 1;
+ 	int			alt;
+ };
+ 
+@@ -78,6 +79,61 @@ static struct usb_device *testdev_to_usb
+ 
+ /*-------------------------------------------------------------------------*/
+ 
++static int
++get_endpoints (struct usbtest_dev *dev, struct usb_interface *intf)
++{
++	int				tmp;
++	struct usb_host_interface	*alt;
++	struct usb_host_endpoint	*in, *out;
++	struct usb_device		*udev;
++
++	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:
++	udev = testdev_to_usbdev (dev);
++	if (alt->desc.bAlternateSetting != 0) {
++		tmp = usb_set_interface (udev,
++				alt->desc.bInterfaceNumber,
++				alt->desc.bAlternateSetting);
++		if (tmp < 0)
++			return tmp;
++	}
++
++	dev->in_pipe = usb_rcvbulkpipe (udev,
++			in->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
++	dev->out_pipe = usb_sndbulkpipe (udev,
++			out->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
++	return 0;
++}
++
++/*-------------------------------------------------------------------------*/
++
+ /* Support for testing basic non-queued I/O streams.
+  *
+  * These just package urbs as requests that can be easily canceled.
+@@ -1275,14 +1331,26 @@ usbtest_probe (struct usb_interface *int
+ 			wtest = " intr-out";
+ 		}
+ 	} else {
+-		if (info->ep_in) {
+-			dev->in_pipe = usb_rcvbulkpipe (udev, info->ep_in);
+-			rtest = " bulk-in";
++		if (info->autoconf) {
++			int status;
++
++			status = get_endpoints (dev, intf);
++			if (status < 0) {
++				dbg ("couldn't get endpoints, %d\n", status);
++				return status;
++			}
++		} else {
++			if (info->ep_in)
++				dev->in_pipe = usb_rcvbulkpipe (udev,
++							info->ep_in);
++			if (info->ep_out)
++				dev->out_pipe = usb_sndbulkpipe (udev,
++							info->ep_out);
+ 		}
+-		if (info->ep_out) {
+-			dev->out_pipe = usb_sndbulkpipe (udev, info->ep_out);
++		if (dev->in_pipe)
++			rtest = " bulk-in";
++		if (dev->out_pipe)
+ 			wtest = " bulk-out";
+-		}
+ 	}
+ 
+ 	usb_set_intfdata (intf, dev);
+@@ -1336,11 +1404,6 @@ static struct usbtest_info ez2_info = {
+ };
+ 
+ /* ezusb family device with dedicated usb test firmware,
+- * or a peripheral running Linux and 'zero.c' test firmware.
+- *
+- * FIXME usbtest should read the descriptors, since compatible
+- * test firmware might run on hardware (pxa250 for one) that
+- * can't configure an ep2in-bulk.
+  */
+ static struct usbtest_info fw_info = {
+ 	.name		= "usb test device",
+@@ -1349,10 +1412,20 @@ static struct usbtest_info fw_info = {
+ 	.alt		= 0,
+ };
+ 
++/* peripheral running Linux and 'zero.c' test firmware, or
++ * its user-mode cousin. different versions of this use
++ * different hardware with the same vendor/product codes.
++ * host side MUST rely on the endpoint descriptors.
++ */
++static struct usbtest_info gz_info = {
++	.name		= "Linux gadget zero",
++	.autoconf	= 1,
++	.alt		= 0,
++};
++
+ static struct usbtest_info um_info = {
+-	.name		= "user mode test driver",
+-	.ep_in		= 7,
+-	.ep_out		= 3,
++	.name		= "Linux user mode test driver",
++	.autoconf	= 1,
+ 	.alt		= -1,
+ };
+ 
+@@ -1418,7 +1491,7 @@ static struct usb_device_id id_table [] 
+ 
+ 	/* "Gadget Zero" firmware runs under Linux */
+ 	{ USB_DEVICE (0x0525, 0xa4a0),
+-		.driver_info = (unsigned long) &fw_info,
++		.driver_info = (unsigned long) &gz_info,
+ 		},
+ 
+ 	/* so does a user-mode variant */
+--- linux-2.6.0-test1/drivers/usb/net/ax8817x.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/net/ax8817x.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1208,6 +1208,7 @@ static int ax8817x_bind(struct usb_inter
+ 	net->init = ax8817x_net_init;
+ 	net->priv = ax_info;
+ 
++	SET_NETDEV_DEV(net, &intf->dev);
+ 	ret = register_netdev(net);
+ 	if (ret < 0) {
+ 		err("%s: Failed net init (%d)\n", __FUNCTION__, ret);
+--- linux-2.6.0-test1/drivers/usb/net/catc.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/net/catc.c	2003-07-19 17:03:50.000000000 -0700
+@@ -936,6 +936,7 @@ static int catc_probe(struct usb_interfa
+ 	printk("%2.2x.\n", netdev->dev_addr[i]);
+ 	usb_set_intfdata(intf, catc);
+ 
++	SET_NETDEV_DEV(netdev, &intf->dev);
+ 	if (register_netdev(netdev) != 0) {
+ 		usb_set_intfdata(intf, NULL);
+ 		usb_free_urb(catc->ctrl_urb);
+--- linux-2.6.0-test1/drivers/usb/net/kaweth.c	2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/usb/net/kaweth.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1123,8 +1123,9 @@ static int kaweth_probe(
+ 	if (dma_supported (&intf->dev, 0xffffffffffffffffULL))
+ 		kaweth->net->features |= NETIF_F_HIGHDMA;
+ 
++	SET_NETDEV_DEV(netdev, &intf->dev);
+ 	if (register_netdev(netdev) != 0) {
+-		kaweth_err("Error calling init_etherdev.");
++		kaweth_err("Error registering netdev.");
+ 		goto err_intfdata;
+ 	}
+ 
+--- linux-2.6.0-test1/drivers/usb/net/pegasus.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/net/pegasus.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1262,7 +1262,6 @@ static int pegasus_probe(struct usb_inte
+ 	}
+ 	set_ethernet_addr(pegasus);
+ 	fill_skb_pool(pegasus);
+-	printk("%s: %s\n", net->name, usb_dev_id[dev_index].name);
+ 	if (pegasus->features & PEGASUS_II) {
+ 		info("setup Pegasus II specific registers");
+ 		setup_pegasus_II(pegasus);
+@@ -1273,9 +1272,11 @@ static int pegasus_probe(struct usb_inte
+ 		pegasus->phy = 1;
+ 	}
+ 	usb_set_intfdata(intf, pegasus);
++	SET_NETDEV_DEV(net, &intf->dev);
+ 	res = register_netdev(net);
+ 	if (res)
+ 		goto out4;
++	printk("%s: %s\n", net->name, usb_dev_id[dev_index].name);
+ 	return 0;
+ 
+ out4:
+--- linux-2.6.0-test1/drivers/usb/net/rtl8150.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/net/rtl8150.c	2003-07-19 17:03:50.000000000 -0700
+@@ -830,6 +830,7 @@ static int rtl8150_probe(struct usb_inte
+ 	
+ 	usb_set_intfdata(intf, dev);
+ 
++	SET_NETDEV_DEV(netdev, &intf->dev);
+ 	if (register_netdev(netdev) != 0) {
+ 		err("couldn't register the device");
+ 		goto out2;
+--- linux-2.6.0-test1/drivers/usb/net/usbnet.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/usb/net/usbnet.c	2003-07-19 17:03:50.000000000 -0700
+@@ -2602,7 +2602,7 @@ usbnet_probe (struct usb_interface *udev
+ 
+ 	dev->maxpacket = usb_maxpacket (dev->udev, dev->out, 1);
+ 	
+-	SET_NETDEV_DEV(dev->net, &dev->udev->dev);
++	SET_NETDEV_DEV(dev->net, &udev->dev);
+ 	status = register_netdev (dev->net);
+ 	if (status)
+ 		goto out3;
+--- linux-2.6.0-test1/drivers/usb/serial/ftdi_sio.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/usb/serial/ftdi_sio.c	2003-07-19 17:03:50.000000000 -0700
+@@ -257,6 +257,7 @@ static struct usb_device_id id_table_8U2
+ 	{ USB_DEVICE_VER(FTDI_VID, FTDI_XF_634_PID, 0, 0x3ff) },
+ 	{ USB_DEVICE_VER(FTDI_VID, FTDI_XF_632_PID, 0, 0x3ff) },
+ 	{ USB_DEVICE_VER(FTDI_VID, FTDI_VNHCPCUSB_D_PID, 0, 0x3ff) },
++	{ USB_DEVICE_VER(FTDI_VID, FTDI_DSS20_PID, 0, 0x3ff) },
+ 	{ USB_DEVICE_VER(FTDI_MTXORB_VID, FTDI_MTXORB_0_PID, 0, 0x3ff) },
+ 	{ USB_DEVICE_VER(FTDI_MTXORB_VID, FTDI_MTXORB_1_PID, 0, 0x3ff) },
+ 	{ USB_DEVICE_VER(FTDI_MTXORB_VID, FTDI_MTXORB_2_PID, 0, 0x3ff) },
+@@ -321,6 +322,7 @@ static struct usb_device_id id_table_FT2
+ 	{ USB_DEVICE_VER(FTDI_VID, FTDI_XF_634_PID, 0x400, 0xffff) },
+ 	{ USB_DEVICE_VER(FTDI_VID, FTDI_XF_632_PID, 0x400, 0xffff) },
+ 	{ USB_DEVICE_VER(FTDI_VID, FTDI_VNHCPCUSB_D_PID, 0x400, 0xffff) },
++	{ USB_DEVICE_VER(FTDI_VID, FTDI_DSS20_PID, 0x400, 0xffff) },
+ 	{ USB_DEVICE_VER(FTDI_MTXORB_VID, FTDI_MTXORB_0_PID, 0x400, 0xffff) },
+ 	{ USB_DEVICE_VER(FTDI_MTXORB_VID, FTDI_MTXORB_1_PID, 0x400, 0xffff) },
+ 	{ USB_DEVICE_VER(FTDI_MTXORB_VID, FTDI_MTXORB_2_PID, 0x400, 0xffff) },
+@@ -396,6 +398,7 @@ static __devinitdata struct usb_device_i
+ 	{ USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) },
+ 	{ USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) },
+ 	{ USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_DSS20_PID) },
+ 	{ USB_DEVICE(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID) },
+ 	{ USB_DEVICE(FTDI_VID, FTDI_VNHCPCUSB_D_PID) },
+ 	{ USB_DEVICE(FTDI_MTXORB_VID, FTDI_MTXORB_0_PID) },
+--- linux-2.6.0-test1/drivers/usb/serial/ftdi_sio.h	2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/usb/serial/ftdi_sio.h	2003-07-19 17:03:50.000000000 -0700
+@@ -105,7 +105,13 @@
+ #define SEALEVEL_2803_6_PID	0X2863 	/* SeaLINK+8 (2803) Port 6 */
+ #define SEALEVEL_2803_7_PID	0X2873 	/* SeaLINK+8 (2803) Port 7 */
+ #define SEALEVEL_2803_8_PID	0X2883 	/* SeaLINK+8 (2803) Port 8 */
++
++/*
++ * DSS-20 Sync Station for Sony Ericsson P800
++ */
+  
++#define FTDI_DSS20_PID          0xFC82  
++
+ /*
+  * Home Electronics (www.home-electro.com) USB gadgets
+  */
+--- linux-2.6.0-test1/drivers/usb/serial/ipaq.c	2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/usb/serial/ipaq.c	2003-07-19 17:03:50.000000000 -0700
+@@ -125,10 +125,13 @@ static struct usb_device_id ipaq_id_tabl
+ 	{ USB_DEVICE(LINKUP_VENDOR_ID, LINKUP_PRODUCT_ID) },
+ 	{ USB_DEVICE(MICROSOFT_VENDOR_ID, MICROSOFT_00CE_ID) },
+ 	{ USB_DEVICE(PORTATEC_VENDOR_ID, PORTATEC_PRODUCT_ID) },
++	{ USB_DEVICE(ROVER_VENDOR_ID, ROVER_P5_ID) },
+ 	{ USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_WIRELESS_ID) },
+ 	{ USB_DEVICE(SOCKET_VENDOR_ID, SOCKET_PRODUCT_ID) },
+ 	{ USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_ID) },
++	{ USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_E310_ID) },
+ 	{ USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_E740_ID) },
++	{ USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_E335_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) },
+--- linux-2.6.0-test1/drivers/usb/serial/ipaq.h	2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/usb/serial/ipaq.h	2003-07-19 17:03:50.000000000 -0700
+@@ -61,6 +61,9 @@
+ #define PORTATEC_VENDOR_ID	0x0961
+ #define PORTATEC_PRODUCT_ID	0x0010
+ 
++#define ROVER_VENDOR_ID		0x047b
++#define ROVER_P5_ID		0x3000
++
+ #define SAGEM_VENDOR_ID		0x5e04
+ #define SAGEM_WIRELESS_ID	0xce00
+ 
+@@ -69,7 +72,9 @@
+ 
+ #define TOSHIBA_VENDOR_ID	0x0930
+ #define TOSHIBA_PRODUCT_ID	0x0700
++#define TOSHIBA_E310_ID		0x0705
+ #define TOSHIBA_E740_ID		0x0706
++#define TOSHIBA_E335_ID		0x0707
+ 
+ #define HTC_VENDOR_ID		0x0bb4
+ #define HTC_PRODUCT_ID		0x00ce
+--- linux-2.6.0-test1/drivers/usb/serial/usb-serial.c	2003-06-14 12:18:08.000000000 -0700
++++ 25/drivers/usb/serial/usb-serial.c	2003-07-19 17:03:50.000000000 -0700
+@@ -530,7 +530,9 @@ static void serial_close(struct tty_stru
+ 	/* if disconnect beat us to the punch here, there's nothing to do */
+ 	if (tty && tty->driver_data) {
+ 		__serial_close(port, filp);
++		tty->driver_data = NULL;
+ 	}
++	port->tty = NULL;
+ }
+ 
+ static int serial_write (struct tty_struct * tty, int from_user, const unsigned char *buf, int count)
+--- linux-2.6.0-test1/drivers/usb/serial/visor.c	2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/usb/serial/visor.c	2003-07-19 17:03:50.000000000 -0700
+@@ -509,18 +509,17 @@ static void visor_write_bulk_callback (s
+ {
+ 	struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
+ 
++	/* free up the transfer buffer, as usb_free_urb() does not do this */
++	kfree (urb->transfer_buffer);
++
+ 	if (port_paranoia_check (port, __FUNCTION__))
+ 		return;
+ 	
+ 	dbg("%s - port %d", __FUNCTION__, port->number);
+ 	
+-	if (urb->status) {
+-		dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
+-		return;
+-	}
+-
+-	/* free up the transfer buffer, as usb_free_urb() does not do this */
+-	kfree (urb->transfer_buffer);
++	if (urb->status)
++		dbg("%s - nonzero write bulk status received: %d",
++		    __FUNCTION__, urb->status);
+ 
+ 	schedule_work(&port->work);
+ }
+--- linux-2.6.0-test1/drivers/usb/storage/debug.h	2003-06-14 12:18:52.000000000 -0700
++++ 25/drivers/usb/storage/debug.h	2003-07-19 17:03:50.000000000 -0700
+@@ -46,7 +46,6 @@
+ 
+ #include <linux/config.h>
+ #include <linux/kernel.h>
+-#include <linux/blk.h>
+ #include <linux/cdrom.h>
+ #include "usb.h"
+ 
+--- linux-2.6.0-test1/drivers/usb/storage/isd200.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/storage/isd200.c	2003-07-19 17:03:50.000000000 -0700
+@@ -280,6 +280,7 @@ struct isd200_info {
+ 
+ 	/* maximum number of LUNs supported */
+ 	unsigned char MaxLUNs;
++	struct scsi_cmnd srb;
+ };
+ 
+ 
+@@ -404,15 +405,15 @@ static int isd200_action( struct us_data
+ 			  void* pointer, int value )
+ {
+ 	union ata_cdb ata;
+-	struct scsi_cmnd srb;
+ 	struct scsi_device srb_dev;
+ 	struct isd200_info *info = (struct isd200_info *)us->extra;
++	struct scsi_cmnd *srb = &info->srb;
+ 	int status;
+ 
+ 	memset(&ata, 0, sizeof(ata));
+-	memset(&srb, 0, sizeof(srb));
+ 	memset(&srb_dev, 0, sizeof(srb_dev));
+-	srb.device = &srb_dev;
++	srb->device = &srb_dev;
++	++srb->serial_number;
+ 
+ 	ata.generic.SignatureByte0 = info->ConfigData.ATAMajorCommand;
+ 	ata.generic.SignatureByte1 = info->ConfigData.ATAMinorCommand;
+@@ -425,9 +426,9 @@ static int isd200_action( struct us_data
+ 		ata.generic.RegisterSelect =
+ 		  REG_CYLINDER_LOW | REG_CYLINDER_HIGH |
+ 		  REG_STATUS | REG_ERROR;
+-		srb.sc_data_direction = SCSI_DATA_READ;
+-		srb.request_buffer = pointer;
+-		srb.request_bufflen = value;
++		srb->sc_data_direction = SCSI_DATA_READ;
++		srb->request_buffer = pointer;
++		srb->request_bufflen = value;
+ 		break;
+ 
+ 	case ACTION_ENUM:
+@@ -437,7 +438,7 @@ static int isd200_action( struct us_data
+ 					   ACTION_SELECT_5;
+ 		ata.generic.RegisterSelect = REG_DEVICE_HEAD;
+ 		ata.write.DeviceHeadByte = value;
+-		srb.sc_data_direction = SCSI_DATA_NONE;
++		srb->sc_data_direction = SCSI_DATA_NONE;
+ 		break;
+ 
+ 	case ACTION_RESET:
+@@ -446,7 +447,7 @@ static int isd200_action( struct us_data
+ 					   ACTION_SELECT_3|ACTION_SELECT_4;
+ 		ata.generic.RegisterSelect = REG_DEVICE_CONTROL;
+ 		ata.write.DeviceControlByte = ATA_DC_RESET_CONTROLLER;
+-		srb.sc_data_direction = SCSI_DATA_NONE;
++		srb->sc_data_direction = SCSI_DATA_NONE;
+ 		break;
+ 
+ 	case ACTION_REENABLE:
+@@ -455,7 +456,7 @@ static int isd200_action( struct us_data
+ 					   ACTION_SELECT_3|ACTION_SELECT_4;
+ 		ata.generic.RegisterSelect = REG_DEVICE_CONTROL;
+ 		ata.write.DeviceControlByte = ATA_DC_REENABLE_CONTROLLER;
+-		srb.sc_data_direction = SCSI_DATA_NONE;
++		srb->sc_data_direction = SCSI_DATA_NONE;
+ 		break;
+ 
+ 	case ACTION_SOFT_RESET:
+@@ -464,16 +465,16 @@ static int isd200_action( struct us_data
+ 		ata.generic.RegisterSelect = REG_DEVICE_HEAD | REG_COMMAND;
+ 		ata.write.DeviceHeadByte = info->DeviceHead;
+ 		ata.write.CommandByte = WIN_SRST;
+-		srb.sc_data_direction = SCSI_DATA_NONE;
++		srb->sc_data_direction = SCSI_DATA_NONE;
+ 		break;
+ 
+ 	case ACTION_IDENTIFY:
+ 		US_DEBUGP("   isd200_action(IDENTIFY)\n");
+ 		ata.generic.RegisterSelect = REG_COMMAND;
+ 		ata.write.CommandByte = WIN_IDENTIFY;
+-		srb.sc_data_direction = SCSI_DATA_READ;
+-		srb.request_buffer = (void *)&info->drive;
+-		srb.request_bufflen = sizeof(struct hd_driveid);
++		srb->sc_data_direction = SCSI_DATA_READ;
++		srb->request_buffer = (void *)&info->drive;
++		srb->request_bufflen = sizeof(struct hd_driveid);
+ 		break;
+ 
+ 	default:
+@@ -481,9 +482,9 @@ static int isd200_action( struct us_data
+ 		break;
+ 	}
+ 
+-	memcpy(srb.cmnd, &ata, sizeof(ata.generic));
+-	srb.cmd_len = sizeof(ata.generic);
+-	status = usb_stor_Bulk_transport(&srb, us);
++	memcpy(srb->cmnd, &ata, sizeof(ata.generic));
++	srb->cmd_len = sizeof(ata.generic);
++	status = usb_stor_Bulk_transport(srb, us);
+ 	if (status == USB_STOR_TRANSPORT_GOOD)
+ 		status = ISD200_GOOD;
+ 	else {
+@@ -834,7 +835,7 @@ static int isd200_try_enum(struct us_dat
+ 			   int detect )
+ {
+ 	int status = ISD200_GOOD;
+-	unsigned char regs[8];
++	unsigned char *regs = us->iobuf;
+ 	unsigned long endTime;
+ 	struct isd200_info *info = (struct isd200_info *)us->extra;
+ 	int recheckAsMaster = FALSE;
+@@ -856,7 +857,7 @@ static int isd200_try_enum(struct us_dat
+ 			break;
+ 
+ 		status = isd200_action( us, ACTION_READ_STATUS, 
+-					regs, sizeof(regs) );
++					regs, 8 );
+ 		if ( status != ISD200_GOOD )
+ 			break;
+ 
+--- linux-2.6.0-test1/drivers/usb/storage/jumpshot.c	2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/usb/storage/jumpshot.c	2003-07-19 17:03:50.000000000 -0700
+@@ -86,7 +86,6 @@ static inline int jumpshot_bulk_write(st
+ 
+ static int jumpshot_get_status(struct us_data  *us)
+ {
+-	unsigned char reply;
+ 	int rc;
+ 
+ 	if (!us)
+@@ -94,14 +93,14 @@ static int jumpshot_get_status(struct us
+ 
+ 	// send the setup
+ 	rc = usb_stor_ctrl_transfer(us, us->recv_ctrl_pipe,
+-				   0, 0xA0, 0, 7, &reply, 1);
++				   0, 0xA0, 0, 7, us->iobuf, 1);
+ 
+ 	if (rc != USB_STOR_XFER_GOOD)
+ 		return USB_STOR_TRANSPORT_ERROR;
+ 
+-	if (reply != 0x50) {
++	if (us->iobuf[0] != 0x50) {
+ 		US_DEBUGP("jumpshot_get_status:  0x%2x\n",
+-			  (unsigned short) (reply));
++			  us->iobuf[0]);
+ 		return USB_STOR_TRANSPORT_ERROR;
+ 	}
+ 
+@@ -115,7 +114,7 @@ static int jumpshot_read_data(struct us_
+ 			      unsigned char *dest, 
+ 			      int use_sg)
+ {
+-	unsigned char command[] = { 0, 0, 0, 0, 0, 0xe0, 0x20 };
++	unsigned char *command = us->iobuf;
+ 	unsigned char *buffer = NULL;
+ 	unsigned char *ptr;
+ 	unsigned char  thistime;
+@@ -154,7 +153,8 @@ static int jumpshot_read_data(struct us_
+ 		command[3] = (sector >>  8) & 0xFF;
+ 		command[4] = (sector >> 16) & 0xFF;
+ 
+-		command[5] |= (sector >> 24) & 0x0F;
++		command[5] = 0xE0 | ((sector >> 24) & 0x0F);
++		command[6] = 0x20;
+ 
+ 		// send the setup + command
+ 		result = usb_stor_ctrl_transfer(us, us->send_ctrl_pipe,
+@@ -199,7 +199,7 @@ static int jumpshot_write_data(struct us
+ 			       unsigned char *src, 
+ 			       int use_sg)
+ {
+-	unsigned char command[7] = { 0, 0, 0, 0, 0, 0xE0, 0x30 };
++	unsigned char *command = us->iobuf;
+ 	unsigned char *buffer = NULL;
+ 	unsigned char *ptr;
+ 	unsigned char  thistime;
+@@ -240,7 +240,8 @@ static int jumpshot_write_data(struct us
+ 		command[3] = (sector >>  8) & 0xFF;
+ 		command[4] = (sector >> 16) & 0xFF;
+ 
+-		command[5] |= (sector >> 24) & 0x0F;
++		command[5] = 0xE0 | ((sector >> 24) & 0x0F);
++		command[6] = 0x30;
+ 
+ 		// send the setup + command
+ 		result = usb_stor_ctrl_transfer(us, us->send_ctrl_pipe,
+@@ -291,13 +292,19 @@ static int jumpshot_write_data(struct us
+ static int jumpshot_id_device(struct us_data *us,
+ 			      struct jumpshot_info *info)
+ {
+-	unsigned char command[2] = { 0xe0, 0xec };
+-	unsigned char reply[512];
++	unsigned char *command = us->iobuf;
++	unsigned char *reply;
+ 	int 	 rc;
+ 
+ 	if (!us || !info)
+ 		return USB_STOR_TRANSPORT_ERROR;
+ 
++	command[0] = 0xE0;
++	command[1] = 0xEC;
++	reply = kmalloc(512, GFP_NOIO);
++	if (!reply)
++		return USB_STOR_TRANSPORT_ERROR;
++
+ 	// send the setup
+ 	rc = usb_stor_ctrl_transfer(us, us->send_ctrl_pipe,
+ 				   0, 0x20, 0, 6, command, 2);
+@@ -305,20 +312,27 @@ static int jumpshot_id_device(struct us_
+ 	if (rc != USB_STOR_XFER_GOOD) {
+ 		US_DEBUGP("jumpshot_id_device:  Gah! "
+ 			  "send_control for read_capacity failed\n");
+-		return rc;
++		rc = USB_STOR_TRANSPORT_ERROR;
++		goto leave;
+ 	}
+ 
+ 	// read the reply
+ 	rc = jumpshot_bulk_read(us, reply, sizeof(reply));
+-	if (rc != USB_STOR_XFER_GOOD)
+-		return USB_STOR_TRANSPORT_ERROR;
++	if (rc != USB_STOR_XFER_GOOD) {
++		rc = USB_STOR_TRANSPORT_ERROR;
++		goto leave;
++	}
+ 
+ 	info->sectors = ((u32)(reply[117]) << 24) |
+ 			((u32)(reply[116]) << 16) |
+ 			((u32)(reply[115]) <<  8) |
+ 			((u32)(reply[114])      );
+ 
+-	return USB_STOR_TRANSPORT_GOOD;
++	rc = USB_STOR_TRANSPORT_GOOD;
++
++ leave:
++	kfree(reply);
++	return rc;
+ }
+ 
+ static int jumpshot_handle_mode_sense(struct us_data *us,
+--- linux-2.6.0-test1/drivers/usb/storage/protocol.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/storage/protocol.c	2003-07-19 17:03:50.000000000 -0700
+@@ -130,8 +130,9 @@ static void fix_read_capacity(Scsi_Cmnd 
+ void usb_stor_qic157_command(Scsi_Cmnd *srb, struct us_data *us)
+ {
+ 	/* Pad the ATAPI command with zeros 
++	 *
+ 	 * NOTE: This only works because a Scsi_Cmnd struct field contains
+-	 * a unsigned char cmnd[12], so we know we have storage available
++	 * a unsigned char cmnd[16], so we know we have storage available
+ 	 */
+ 	for (; srb->cmd_len<12; srb->cmd_len++)
+ 		srb->cmnd[srb->cmd_len] = 0;
+@@ -149,13 +150,10 @@ void usb_stor_qic157_command(Scsi_Cmnd *
+ 
+ void usb_stor_ATAPI_command(Scsi_Cmnd *srb, struct us_data *us)
+ {
+-	int old_cmnd = 0;
+-
+-	/* Fix some commands -- this is a form of mode translation
+-	 * ATAPI devices only accept 12 byte long commands 
++	/* Pad the ATAPI command with zeros 
+ 	 *
+ 	 * NOTE: This only works because a Scsi_Cmnd struct field contains
+-	 * a unsigned char cmnd[12], so we know we have storage available
++	 * a unsigned char cmnd[16], so we know we have storage available
+ 	 */
+ 
+ 	/* Pad the ATAPI command with zeros */
+@@ -165,60 +163,10 @@ void usb_stor_ATAPI_command(Scsi_Cmnd *s
+ 	/* set command length to 12 bytes */
+ 	srb->cmd_len = 12;
+ 
+-	/* determine the correct (or minimum) data length for these commands */
+-	switch (srb->cmnd[0]) {
+-
+-		/* change MODE_SENSE/MODE_SELECT from 6 to 10 byte commands */
+-	case MODE_SENSE:
+-	case MODE_SELECT:
+-		/* save the command so we can tell what it was */
+-		old_cmnd = srb->cmnd[0];
+-
+-		srb->cmnd[11] = 0;
+-		srb->cmnd[10] = 0;
+-		srb->cmnd[9] = 0;
+-		srb->cmnd[8] = srb->cmnd[4];
+-		srb->cmnd[7] = 0;
+-		srb->cmnd[6] = 0;
+-		srb->cmnd[5] = 0;
+-		srb->cmnd[4] = 0;
+-		srb->cmnd[3] = 0;
+-		srb->cmnd[2] = srb->cmnd[2];
+-		srb->cmnd[1] = srb->cmnd[1];
+-		srb->cmnd[0] = srb->cmnd[0] | 0x40;
+-		break;
+-
+-		/* change READ_6/WRITE_6 to READ_10/WRITE_10, which 
+-		 * are ATAPI commands */
+-	case WRITE_6:
+-	case READ_6:
+-		srb->cmnd[11] = 0;
+-		srb->cmnd[10] = 0;
+-		srb->cmnd[9] = 0;
+-		srb->cmnd[8] = srb->cmnd[4];
+-		srb->cmnd[7] = 0;
+-		srb->cmnd[6] = 0;
+-		srb->cmnd[5] = srb->cmnd[3];
+-		srb->cmnd[4] = srb->cmnd[2];
+-		srb->cmnd[3] = srb->cmnd[1] & 0x1F;
+-		srb->cmnd[2] = 0;
+-		srb->cmnd[1] = srb->cmnd[1] & 0xE0;
+-		srb->cmnd[0] = srb->cmnd[0] | 0x20;
+-		break;
+-	} /* end switch on cmnd[0] */
+-
+-	/* convert MODE_SELECT data here */
+-	if (old_cmnd == MODE_SELECT)
+-		usb_stor_scsiSense6to10(srb);
+-
+ 	/* send the command to the transport layer */
+ 	usb_stor_invoke_transport(srb, us);
+-	if (srb->result == SAM_STAT_GOOD) {
+-
+-		/* Fix the MODE_SENSE data if we translated the command */
+-		if (old_cmnd == MODE_SENSE)
+-			usb_stor_scsiSense10to6(srb);
+ 
++	if (srb->result == SAM_STAT_GOOD) {
+ 		/* fix the INQUIRY data if necessary */
+ 		fix_inquiry_data(srb);
+ 	}
+@@ -227,19 +175,23 @@ void usb_stor_ATAPI_command(Scsi_Cmnd *s
+ 
+ void usb_stor_ufi_command(Scsi_Cmnd *srb, struct us_data *us)
+ {
+-	int old_cmnd = 0;
+-
+ 	/* fix some commands -- this is a form of mode translation
+ 	 * UFI devices only accept 12 byte long commands 
+ 	 *
+ 	 * NOTE: This only works because a Scsi_Cmnd struct field contains
+-	 * a unsigned char cmnd[12], so we know we have storage available
++	 * a unsigned char cmnd[16], so we know we have storage available
+ 	 */
+ 
++	/* Pad the ATAPI command with zeros */
++	for (; srb->cmd_len<12; srb->cmd_len++)
++		srb->cmnd[srb->cmd_len] = 0;
++
+ 	/* set command length to 12 bytes (this affects the transport layer) */
+ 	srb->cmd_len = 12;
+ 
+-	/* determine the correct (or minimum) data length for these commands */
++	/* XXX We should be constantly re-evaluating the need for these */
++
++	/* determine the correct data length for these commands */
+ 	switch (srb->cmnd[0]) {
+ 
+ 		/* for INQUIRY, UFI devices only ever return 36 bytes */
+@@ -247,33 +199,6 @@ void usb_stor_ufi_command(Scsi_Cmnd *srb
+ 		srb->cmnd[4] = 36;
+ 		break;
+ 
+-		/* change MODE_SENSE/MODE_SELECT from 6 to 10 byte commands */
+-	case MODE_SENSE:
+-	case MODE_SELECT:
+-		/* save the command so we can tell what it was */
+-		old_cmnd = srb->cmnd[0];
+-
+-		srb->cmnd[11] = 0;
+-		srb->cmnd[10] = 0;
+-		srb->cmnd[9] = 0;
+-
+-		/* if we're sending data, we send all.	If getting data, 
+-		 * get the minimum */
+-		if (srb->cmnd[0] == MODE_SELECT)
+-			srb->cmnd[8] = srb->cmnd[4];
+-		else
+-			srb->cmnd[8] = 8;
+-
+-		srb->cmnd[7] = 0;
+-		srb->cmnd[6] = 0;
+-		srb->cmnd[5] = 0;
+-		srb->cmnd[4] = 0;
+-		srb->cmnd[3] = 0;
+-		srb->cmnd[2] = srb->cmnd[2];
+-		srb->cmnd[1] = srb->cmnd[1];
+-		srb->cmnd[0] = srb->cmnd[0] | 0x40;
+-		break;
+-
+ 		/* again, for MODE_SENSE_10, we get the minimum (8) */
+ 	case MODE_SENSE_10:
+ 		srb->cmnd[7] = 0;
+@@ -284,38 +209,12 @@ void usb_stor_ufi_command(Scsi_Cmnd *srb
+ 	case REQUEST_SENSE:
+ 		srb->cmnd[4] = 18;
+ 		break;
+-
+-		/* change READ_6/WRITE_6 to READ_10/WRITE_10, which 
+-		 * are UFI commands */
+-	case WRITE_6:
+-	case READ_6:
+-		srb->cmnd[11] = 0;
+-		srb->cmnd[10] = 0;
+-		srb->cmnd[9] = 0;
+-		srb->cmnd[8] = srb->cmnd[4];
+-		srb->cmnd[7] = 0;
+-		srb->cmnd[6] = 0;
+-		srb->cmnd[5] = srb->cmnd[3];
+-		srb->cmnd[4] = srb->cmnd[2];
+-		srb->cmnd[3] = srb->cmnd[1] & 0x1F;
+-		srb->cmnd[2] = 0;
+-		srb->cmnd[1] = srb->cmnd[1] & 0xE0;
+-		srb->cmnd[0] = srb->cmnd[0] | 0x20;
+-		break;
+ 	} /* end switch on cmnd[0] */
+ 
+-	/* convert MODE_SELECT data here */
+-	if (old_cmnd == MODE_SELECT)
+-		usb_stor_scsiSense6to10(srb);
+-
+ 	/* send the command to the transport layer */
+ 	usb_stor_invoke_transport(srb, us);
+-	if (srb->result == SAM_STAT_GOOD) {
+-
+-		/* Fix the MODE_SENSE data if we translated the command */
+-		if (old_cmnd == MODE_SENSE)
+-			usb_stor_scsiSense10to6(srb);
+ 
++	if (srb->result == SAM_STAT_GOOD) {
+ 		/* Fix the data for an INQUIRY, if necessary */
+ 		fix_inquiry_data(srb);
+ 	}
+@@ -323,68 +222,10 @@ void usb_stor_ufi_command(Scsi_Cmnd *srb
+ 
+ void usb_stor_transparent_scsi_command(Scsi_Cmnd *srb, struct us_data *us)
+ {
+-	int old_cmnd = 0;
+-
+-	/* This code supports devices which do not support {READ|WRITE}_6
+-	 * Apparently, neither Windows or MacOS will use these commands,
+-	 * so some devices do not support them
+-	 */
+-	if (us->flags & US_FL_MODE_XLATE) {
+-		US_DEBUGP("Invoking Mode Translation\n");
+-		/* save the old command for later */
+-		old_cmnd = srb->cmnd[0];
+-
+-		switch (srb->cmnd[0]) {
+-		/* change READ_6/WRITE_6 to READ_10/WRITE_10 */
+-		case WRITE_6:
+-		case READ_6:
+-			srb->cmd_len = 12;
+-			srb->cmnd[11] = 0;
+-			srb->cmnd[10] = 0;
+-			srb->cmnd[9] = 0;
+-			srb->cmnd[8] = srb->cmnd[4];
+-			srb->cmnd[7] = 0;
+-			srb->cmnd[6] = 0;
+-			srb->cmnd[5] = srb->cmnd[3];
+-			srb->cmnd[4] = srb->cmnd[2];
+-			srb->cmnd[3] = srb->cmnd[1] & 0x1F;
+-			srb->cmnd[2] = 0;
+-			srb->cmnd[1] = srb->cmnd[1] & 0xE0;
+-			srb->cmnd[0] = srb->cmnd[0] | 0x20;
+-			break;
+-
+-		/* convert MODE_SELECT data here */
+-		case MODE_SENSE:
+-		case MODE_SELECT:
+-			srb->cmd_len = 12;
+-			srb->cmnd[11] = 0;
+-			srb->cmnd[10] = 0;
+-			srb->cmnd[9] = 0;
+-			srb->cmnd[8] = srb->cmnd[4];
+-			srb->cmnd[7] = 0;
+-			srb->cmnd[6] = 0;
+-			srb->cmnd[5] = 0;
+-			srb->cmnd[4] = 0;
+-			srb->cmnd[3] = 0;
+-			srb->cmnd[2] = srb->cmnd[2];
+-			srb->cmnd[1] = srb->cmnd[1];
+-			srb->cmnd[0] = srb->cmnd[0] | 0x40;
+-			break;
+-		} /* switch (srb->cmnd[0]) */
+-	} /* if (us->flags & US_FL_MODE_XLATE) */
+-
+-	/* convert MODE_SELECT data here */
+-	if ((us->flags & US_FL_MODE_XLATE) && (old_cmnd == MODE_SELECT))
+-		usb_stor_scsiSense6to10(srb);
+-
+ 	/* send the command to the transport layer */
+ 	usb_stor_invoke_transport(srb, us);
+-	if (srb->result == SAM_STAT_GOOD) {
+-
+-		/* Fix the MODE_SENSE data if we translated the command */
+-		if ((us->flags & US_FL_MODE_XLATE) && (old_cmnd == MODE_SENSE))
+-			usb_stor_scsiSense10to6(srb);
+ 
++	if (srb->result == SAM_STAT_GOOD) {
+ 		/* Fix the INQUIRY data if necessary */
+ 		fix_inquiry_data(srb);
+ 
+--- linux-2.6.0-test1/drivers/usb/storage/protocol.h	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/storage/protocol.h	2003-07-19 17:03:50.000000000 -0700
+@@ -41,7 +41,7 @@
+ #ifndef _PROTOCOL_H_
+ #define _PROTOCOL_H_
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "usb.h"
+ 
+--- linux-2.6.0-test1/drivers/usb/storage/scsiglue.c	2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/usb/storage/scsiglue.c	2003-07-19 17:03:50.000000000 -0700
+@@ -263,7 +263,6 @@ static int proc_info (struct Scsi_Host *
+ 
+ #define DO_FLAG(a)  	if (f & US_FL_##a)  pos += sprintf(pos, " " #a)
+ 		DO_FLAG(SINGLE_LUN);
+-		DO_FLAG(MODE_XLATE);
+ 		DO_FLAG(SCM_MULT_TARG);
+ 		DO_FLAG(FIX_INQUIRY);
+ 		DO_FLAG(FIX_CAPACITY);
+@@ -346,499 +345,3 @@ unsigned char usb_stor_sense_invalidCDB[
+ 	[12]	= 0x24			    /* Invalid Field in CDB */
+ };
+ 
+-#define USB_STOR_SCSI_SENSE_HDRSZ 4
+-#define USB_STOR_SCSI_SENSE_10_HDRSZ 8
+-
+-struct usb_stor_scsi_sense_hdr
+-{
+-  __u8* dataLength;
+-  __u8* mediumType;
+-  __u8* devSpecParms;
+-  __u8* blkDescLength;
+-};
+-
+-typedef struct usb_stor_scsi_sense_hdr Usb_Stor_Scsi_Sense_Hdr;
+-
+-union usb_stor_scsi_sense_hdr_u
+-{
+-  Usb_Stor_Scsi_Sense_Hdr hdr;
+-  __u8* array[USB_STOR_SCSI_SENSE_HDRSZ];
+-};
+-
+-typedef union usb_stor_scsi_sense_hdr_u Usb_Stor_Scsi_Sense_Hdr_u;
+-
+-struct usb_stor_scsi_sense_hdr_10
+-{
+-  __u8* dataLengthMSB;
+-  __u8* dataLengthLSB;
+-  __u8* mediumType;
+-  __u8* devSpecParms;
+-  __u8* reserved1;
+-  __u8* reserved2;
+-  __u8* blkDescLengthMSB;
+-  __u8* blkDescLengthLSB;
+-};
+-
+-typedef struct usb_stor_scsi_sense_hdr_10 Usb_Stor_Scsi_Sense_Hdr_10;
+-
+-union usb_stor_scsi_sense_hdr_10_u
+-{
+-  Usb_Stor_Scsi_Sense_Hdr_10 hdr;
+-  __u8* array[USB_STOR_SCSI_SENSE_10_HDRSZ];
+-};
+-
+-typedef union usb_stor_scsi_sense_hdr_10_u Usb_Stor_Scsi_Sense_Hdr_10_u;
+-
+-void usb_stor_scsiSenseParseBuffer( Scsi_Cmnd* , Usb_Stor_Scsi_Sense_Hdr_u*,
+-				    Usb_Stor_Scsi_Sense_Hdr_10_u*, int* );
+-
+-int usb_stor_scsiSense10to6( Scsi_Cmnd* the10 )
+-{
+-  __u8 *buffer=0;
+-  int outputBufferSize = 0;
+-  int length=0;
+-  struct scatterlist *sg = 0;
+-  int i=0, j=0, element=0;
+-  Usb_Stor_Scsi_Sense_Hdr_u the6Locations;
+-  Usb_Stor_Scsi_Sense_Hdr_10_u the10Locations;
+-  int sb=0,si=0,db=0,di=0;
+-  int sgLength=0;
+-
+-  US_DEBUGP("-- converting 10 byte sense data to 6 byte\n");
+-  the10->cmnd[0] = the10->cmnd[0] & 0xBF;
+-
+-  /* Determine buffer locations */
+-  usb_stor_scsiSenseParseBuffer( the10, &the6Locations, &the10Locations,
+-				 &length );
+-
+-  /* Work out minimum buffer to output */
+-  outputBufferSize = *the10Locations.hdr.dataLengthLSB;
+-  outputBufferSize += USB_STOR_SCSI_SENSE_HDRSZ;
+-
+-  /* Check to see if we need to trucate the output */
+-  if ( outputBufferSize > length )
+-    {
+-      printk( KERN_WARNING USB_STORAGE 
+-	      "Had to truncate MODE_SENSE_10 buffer into MODE_SENSE.\n" );
+-      printk( KERN_WARNING USB_STORAGE
+-	      "outputBufferSize is %d and length is %d.\n",
+-	      outputBufferSize, length );
+-    }
+-  outputBufferSize = length;
+-
+-  /* Data length */
+-  if ( *the10Locations.hdr.dataLengthMSB != 0 ) /* MSB must be zero */
+-    {
+-      printk( KERN_WARNING USB_STORAGE 
+-	      "Command will be truncated to fit in SENSE6 buffer.\n" );
+-      *the6Locations.hdr.dataLength = 0xff;
+-    }
+-  else
+-    {
+-      *the6Locations.hdr.dataLength = *the10Locations.hdr.dataLengthLSB;
+-    }
+-
+-  /* Medium type and DevSpecific parms */
+-  *the6Locations.hdr.mediumType = *the10Locations.hdr.mediumType;
+-  *the6Locations.hdr.devSpecParms = *the10Locations.hdr.devSpecParms;
+-
+-  /* Block descriptor length */
+-  if ( *the10Locations.hdr.blkDescLengthMSB != 0 ) /* MSB must be zero */
+-    {
+-      printk( KERN_WARNING USB_STORAGE 
+-	      "Command will be truncated to fit in SENSE6 buffer.\n" );
+-      *the6Locations.hdr.blkDescLength = 0xff;
+-    }
+-  else
+-    {
+-      *the6Locations.hdr.blkDescLength = *the10Locations.hdr.blkDescLengthLSB;
+-    }
+-
+-  if ( the10->use_sg == 0 )
+-    {
+-      buffer = the10->request_buffer;
+-      /* Copy the rest of the data */
+-      memmove( &(buffer[USB_STOR_SCSI_SENSE_HDRSZ]),
+-	       &(buffer[USB_STOR_SCSI_SENSE_10_HDRSZ]),
+-	       outputBufferSize - USB_STOR_SCSI_SENSE_HDRSZ );
+-      /* initialise last bytes left in buffer due to smaller header */
+-      memset( &(buffer[outputBufferSize
+-	    -(USB_STOR_SCSI_SENSE_10_HDRSZ-USB_STOR_SCSI_SENSE_HDRSZ)]),
+-	      0,
+-	      USB_STOR_SCSI_SENSE_10_HDRSZ-USB_STOR_SCSI_SENSE_HDRSZ );
+-    }
+-  else
+-    {
+-      sg = (struct scatterlist *) the10->request_buffer;
+-      /* scan through this scatterlist and figure out starting positions */
+-      for ( i=0; i < the10->use_sg; i++)
+-	{
+-	  sgLength = sg[i].length;
+-	  for ( j=0; j<sgLength; j++ )
+-	    {
+-	      /* get to end of header */
+-	      if ( element == USB_STOR_SCSI_SENSE_HDRSZ )
+-		{
+-		  db=i;
+-		  di=j;
+-		}
+-	      if ( element == USB_STOR_SCSI_SENSE_10_HDRSZ )
+-		{
+-		  sb=i;
+-		  si=j;
+-		  /* we've found both sets now, exit loops */
+-		  j=sgLength;
+-		  i=the10->use_sg;
+-		}
+-	      element++;
+-	    }
+-	}
+-
+-      /* Now we know where to start the copy from */
+-      element = USB_STOR_SCSI_SENSE_HDRSZ;
+-      while ( element < outputBufferSize
+-	      -(USB_STOR_SCSI_SENSE_10_HDRSZ-USB_STOR_SCSI_SENSE_HDRSZ) )
+-	{
+-	  /* check limits */
+-	  if ( sb >= the10->use_sg ||
+-	       si >= sg[sb].length ||
+-	       db >= the10->use_sg ||
+-	       di >= sg[db].length )
+-	    {
+-	      printk( KERN_ERR USB_STORAGE
+-		      "Buffer overrun averted, this shouldn't happen!\n" );
+-	      break;
+-	    }
+-
+-	  /* copy one byte */
+-	  {
+-		char *src = sg_address(sg[sb]) + si;
+-		char *dst = sg_address(sg[db]) + di;
+-
+-		 *dst = *src;
+-	  }
+-
+-	  /* get next destination */
+-	  if ( sg[db].length-1 == di )
+-	    {
+-	      db++;
+-	      di=0;
+-	    }
+-	  else
+-	    {
+-	      di++;
+-	    }
+-
+-	  /* get next source */
+-	  if ( sg[sb].length-1 == si )
+-	    {
+-	      sb++;
+-	      si=0;
+-	    }
+-	  else
+-	    {
+-	      si++;
+-	    }
+-
+-	  element++;
+-	}
+-      /* zero the remaining bytes */
+-      while ( element < outputBufferSize )
+-	{
+-	  /* check limits */
+-	  if ( db >= the10->use_sg ||
+-	       di >= sg[db].length )
+-	    {
+-	      printk( KERN_ERR USB_STORAGE
+-		      "Buffer overrun averted, this shouldn't happen!\n" );
+-	      break;
+-	    }
+-
+-	  *(char*)(sg_address(sg[db])) = 0;
+-
+-	  /* get next destination */
+-	  if ( sg[db].length-1 == di )
+-	    {
+-	      db++;
+-	      di=0;
+-	    }
+-	  else
+-	    {
+-	      di++;
+-	    }
+-	  element++;
+-	}
+-    }
+-
+-  /* All done any everything was fine */
+-  return 0;
+-}
+-
+-int usb_stor_scsiSense6to10( Scsi_Cmnd* the6 )
+-{
+-  /* will be used to store part of buffer */  
+-  __u8 tempBuffer[USB_STOR_SCSI_SENSE_10_HDRSZ-USB_STOR_SCSI_SENSE_HDRSZ],
+-    *buffer=0;
+-  int outputBufferSize = 0;
+-  int length=0;
+-  struct scatterlist *sg = 0;
+-  int i=0, j=0, element=0;
+-  Usb_Stor_Scsi_Sense_Hdr_u the6Locations;
+-  Usb_Stor_Scsi_Sense_Hdr_10_u the10Locations;
+-  int sb=0,si=0,db=0,di=0;
+-  int lsb=0,lsi=0,ldb=0,ldi=0;
+-
+-  US_DEBUGP("-- converting 6 byte sense data to 10 byte\n");
+-  the6->cmnd[0] = the6->cmnd[0] | 0x40;
+-
+-  /* Determine buffer locations */
+-  usb_stor_scsiSenseParseBuffer( the6, &the6Locations, &the10Locations,
+-				 &length );
+-
+-  /* Work out minimum buffer to output */
+-  outputBufferSize = *the6Locations.hdr.dataLength;
+-  outputBufferSize += USB_STOR_SCSI_SENSE_10_HDRSZ;
+-
+-  /* Check to see if we need to trucate the output */
+-  if ( outputBufferSize > length )
+-    {
+-      printk( KERN_WARNING USB_STORAGE 
+-	      "Had to truncate MODE_SENSE into MODE_SENSE_10 buffer.\n" );
+-      printk( KERN_WARNING USB_STORAGE
+-	      "outputBufferSize is %d and length is %d.\n",
+-	      outputBufferSize, length );
+-    }
+-  outputBufferSize = length;
+-
+-  /* Block descriptor length - save these before overwriting */
+-  tempBuffer[2] = *the10Locations.hdr.blkDescLengthMSB;
+-  tempBuffer[3] = *the10Locations.hdr.blkDescLengthLSB;
+-  *the10Locations.hdr.blkDescLengthLSB = *the6Locations.hdr.blkDescLength;
+-  *the10Locations.hdr.blkDescLengthMSB = 0;
+-
+-  /* reserved - save these before overwriting */
+-  tempBuffer[0] = *the10Locations.hdr.reserved1;
+-  tempBuffer[1] = *the10Locations.hdr.reserved2;
+-  *the10Locations.hdr.reserved1 = *the10Locations.hdr.reserved2 = 0;
+-
+-  /* Medium type and DevSpecific parms */
+-  *the10Locations.hdr.devSpecParms = *the6Locations.hdr.devSpecParms;
+-  *the10Locations.hdr.mediumType = *the6Locations.hdr.mediumType;
+-
+-  /* Data length */
+-  *the10Locations.hdr.dataLengthLSB = *the6Locations.hdr.dataLength;
+-  *the10Locations.hdr.dataLengthMSB = 0;
+-
+-  if ( !the6->use_sg )
+-    {
+-      buffer = the6->request_buffer;
+-      /* Copy the rest of the data */
+-      memmove( &(buffer[USB_STOR_SCSI_SENSE_10_HDRSZ]),
+-	      &(buffer[USB_STOR_SCSI_SENSE_HDRSZ]),
+-	      outputBufferSize-USB_STOR_SCSI_SENSE_10_HDRSZ );
+-      /* Put the first four bytes (after header) in place */
+-      memcpy( &(buffer[USB_STOR_SCSI_SENSE_10_HDRSZ]),
+-	      tempBuffer,
+-	      USB_STOR_SCSI_SENSE_10_HDRSZ-USB_STOR_SCSI_SENSE_HDRSZ );
+-    }
+-  else
+-    {
+-      sg = (struct scatterlist *) the6->request_buffer;
+-      /* scan through this scatterlist and figure out ending positions */
+-      for ( i=0; i < the6->use_sg; i++)
+-	{
+-	  for ( j=0; j<sg[i].length; j++ )
+-	    {
+-	      /* get to end of header */
+-	      if ( element == USB_STOR_SCSI_SENSE_HDRSZ )
+-		{
+-		  ldb=i;
+-		  ldi=j;
+-		}
+-	      if ( element == USB_STOR_SCSI_SENSE_10_HDRSZ )
+-		{
+-		  lsb=i;
+-		  lsi=j;
+-		  /* we've found both sets now, exit loops */
+-		  j=sg[i].length;
+-		  i=the6->use_sg;
+-		  break;
+-		}
+-	      element++;
+-	    }
+-	}
+-      /* scan through this scatterlist and figure out starting positions */
+-      element = length-1;
+-      /* destination is the last element */
+-      db=the6->use_sg-1;
+-      di=sg[db].length-1;
+-      for ( i=the6->use_sg-1; i >= 0; i--)
+-	{
+-	  for ( j=sg[i].length-1; j>=0; j-- )
+-	    {
+-	      /* get to end of header and find source for copy */
+-	      if ( element == length - 1
+-		   - (USB_STOR_SCSI_SENSE_10_HDRSZ-USB_STOR_SCSI_SENSE_HDRSZ) )
+-		{
+-		  sb=i;
+-		  si=j;
+-		  /* we've found both sets now, exit loops */
+-		  j=-1;
+-		  i=-1;
+-		}
+-	      element--;
+-	    }
+-	}
+-      /* Now we know where to start the copy from */
+-      element = length-1
+-	- (USB_STOR_SCSI_SENSE_10_HDRSZ-USB_STOR_SCSI_SENSE_HDRSZ);
+-      while ( element >= USB_STOR_SCSI_SENSE_10_HDRSZ )
+-	{
+-	  /* check limits */
+-	  if ( ( sb <= lsb && si < lsi ) ||
+-	       ( db <= ldb && di < ldi ) )
+-	    {
+-	      printk( KERN_ERR USB_STORAGE
+-		      "Buffer overrun averted, this shouldn't happen!\n" );
+-	      break;
+-	    }
+-
+-	  /* copy one byte */
+-	  {
+-		char *src = sg_address(sg[sb]) + si;
+-		char *dst = sg_address(sg[db]) + di;
+-
+-		 *dst = *src;
+-	  }
+-
+-	  /* get next destination */
+-	  if ( di == 0 )
+-	    {
+-	      db--;
+-	      di=sg[db].length-1;
+-	    }
+-	  else
+-	    {
+-	      di--;
+-	    }
+-
+-	  /* get next source */
+-	  if ( si == 0 )
+-	    {
+-	      sb--;
+-	      si=sg[sb].length-1;
+-	    }
+-	  else
+-	    {
+-	      si--;
+-	    }
+-
+-	  element--;
+-	}
+-      /* copy the remaining four bytes */
+-      while ( element >= USB_STOR_SCSI_SENSE_HDRSZ )
+-	{
+-	  /* check limits */
+-	  if ( db <= ldb && di < ldi )
+-	    {
+-	      printk( KERN_ERR USB_STORAGE
+-		      "Buffer overrun averted, this shouldn't happen!\n" );
+-	      break;
+-	    }
+-
+-	 {
+-		 char *dst = sg_address(sg[db]) + di;
+-
+-		 *dst = tempBuffer[element-USB_STOR_SCSI_SENSE_HDRSZ];
+-	 }
+-
+-
+-	  /* get next destination */
+-	  if ( di == 0 )
+-	    {
+-	      db--;
+-	      di=sg[db].length-1;
+-	    }
+-	  else
+-	    {
+-	      di--;
+-	    }
+-	  element--;
+-	}
+-    }
+-
+-  /* All done and everything was fine */
+-  return 0;
+-}
+-
+-void usb_stor_scsiSenseParseBuffer( Scsi_Cmnd* srb, Usb_Stor_Scsi_Sense_Hdr_u* the6,
+-			       Usb_Stor_Scsi_Sense_Hdr_10_u* the10,
+-			       int* length_p )
+-
+-{
+-  int i = 0, j=0, element=0;
+-  struct scatterlist *sg = 0;
+-  int length = 0;
+-  __u8* buffer=0;
+-
+-  /* are we scatter-gathering? */
+-  if ( srb->use_sg != 0 )
+-    {
+-      /* loop over all the scatter gather structures and 
+-       * get pointer to the data members in the headers
+-       * (also work out the length while we're here)
+-       */
+-      sg = (struct scatterlist *) srb->request_buffer;
+-      for (i = 0; i < srb->use_sg; i++)
+-	{
+-	  length += sg[i].length;
+-	  /* We only do the inner loop for the headers */
+-	  if ( element < USB_STOR_SCSI_SENSE_10_HDRSZ )
+-	    {
+-	      /* scan through this scatterlist */
+-	      for ( j=0; j<sg[i].length; j++ )
+-		{
+-		  if ( element < USB_STOR_SCSI_SENSE_HDRSZ )
+-		    {
+-		      /* fill in the pointers for both header types */
+-		      the6->array[element] = sg_address(sg[i]) + j;
+-		      the10->array[element] = sg_address(sg[i]) + j;
+-
+-		    }
+-		  else if ( element < USB_STOR_SCSI_SENSE_10_HDRSZ )
+-		    {
+-		      /* only the longer headers still cares now */
+-		      the10->array[element] = sg_address(sg[i]) + j;
+-		       
+-		    }
+-		  /* increase element counter */
+-		  element++;
+-		}
+-	    }
+-	}
+-    }
+-  else
+-    {
+-      length = srb->request_bufflen;
+-      buffer = srb->request_buffer;
+-      if ( length < USB_STOR_SCSI_SENSE_10_HDRSZ )
+-	printk( KERN_ERR USB_STORAGE
+-		"Buffer length smaller than header!!" );
+-      for( i=0; i<USB_STOR_SCSI_SENSE_10_HDRSZ; i++ )
+-	{
+-	  if ( i < USB_STOR_SCSI_SENSE_HDRSZ )
+-	    {
+-	      the6->array[i] = &(buffer[i]);
+-	      the10->array[i] = &(buffer[i]);
+-	    }
+-	  else
+-	    {
+-	      the10->array[i] = &(buffer[i]);
+-	    }
+-	}
+-    }
+-
+-  /* Set value of length passed in */
+-  *length_p = length;
+-}
+-
+--- linux-2.6.0-test1/drivers/usb/storage/scsiglue.h	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/storage/scsiglue.h	2003-07-19 17:03:50.000000000 -0700
+@@ -41,7 +41,7 @@
+ #ifndef _SCSIGLUE_H_
+ #define _SCSIGLUE_H_
+ 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+ 
+--- linux-2.6.0-test1/drivers/usb/storage/sddr09.c	2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/usb/storage/sddr09.c	2003-07-19 17:03:50.000000000 -0700
+@@ -261,12 +261,13 @@ sddr09_send_scsi_command(struct us_data 
+  */
+ static int
+ sddr09_test_unit_ready(struct us_data *us) {
+-	unsigned char command[6] = {
+-		0, LUNBITS, 0, 0, 0, 0
+-	};
++	unsigned char *command = us->iobuf;
+ 	int result;
+ 
+-	result = sddr09_send_scsi_command(us, command, sizeof(command));
++	memset(command, 0, 6);
++	command[1] = LUNBITS;
++
++	result = sddr09_send_scsi_command(us, command, 6);
+ 
+ 	US_DEBUGP("sddr09_test_unit_ready returns %d\n", result);
+ 
+@@ -281,12 +282,15 @@ sddr09_test_unit_ready(struct us_data *u
+  */
+ static int
+ sddr09_request_sense(struct us_data *us, unsigned char *sensebuf, int buflen) {
+-	unsigned char command[12] = {
+-		0x03, LUNBITS, 0, 0, buflen, 0, 0, 0, 0, 0, 0, 0
+-	};
++	unsigned char *command = us->iobuf;
+ 	int result;
+ 
+-	result = sddr09_send_scsi_command(us, command, sizeof(command));
++	memset(command, 0, 12);
++	command[0] = 0x03;
++	command[1] = LUNBITS;
++	command[4] = buflen;
++
++	result = sddr09_send_scsi_command(us, command, 12);
+ 	if (result != USB_STOR_TRANSPORT_GOOD) {
+ 		US_DEBUGP("request sense failed\n");
+ 		return result;
+@@ -331,20 +335,23 @@ sddr09_readX(struct us_data *us, int x, 
+ 	     int nr_of_pages, int bulklen, unsigned char *buf,
+ 	     int use_sg) {
+ 
+-	unsigned char command[12] = {
+-		0xe8, LUNBITS | x, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+-	};
++	unsigned char *command = us->iobuf;
+ 	int result;
+ 
++	command[0] = 0xE8;
++	command[1] = LUNBITS | x;
+ 	command[2] = MSB_of(fromaddress>>16);
+ 	command[3] = LSB_of(fromaddress>>16); 
+ 	command[4] = MSB_of(fromaddress & 0xFFFF);
+ 	command[5] = LSB_of(fromaddress & 0xFFFF); 
+-
++	command[6] = 0;
++	command[7] = 0;
++	command[8] = 0;
++	command[9] = 0;
+ 	command[10] = MSB_of(nr_of_pages);
+ 	command[11] = LSB_of(nr_of_pages);
+ 
+-	result = sddr09_send_scsi_command(us, command, sizeof(command));
++	result = sddr09_send_scsi_command(us, command, 12);
+ 
+ 	if (result != USB_STOR_TRANSPORT_GOOD) {
+ 		US_DEBUGP("Result for send_control in sddr09_read2%d %d\n",
+@@ -458,17 +465,18 @@ sddr09_read23(struct us_data *us, unsign
+  */
+ static int
+ sddr09_erase(struct us_data *us, unsigned long Eaddress) {
+-	unsigned char command[12] = {
+-		0xea, LUNBITS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+-	};
++	unsigned char *command = us->iobuf;
+ 	int result;
+ 
++	memset(command, 0, 12);
++	command[0] = 0xEA;
++	command[1] = LUNBITS;
+ 	command[6] = MSB_of(Eaddress>>16);
+ 	command[7] = LSB_of(Eaddress>>16);
+ 	command[8] = MSB_of(Eaddress & 0xFFFF);
+ 	command[9] = LSB_of(Eaddress & 0xFFFF);
+ 
+-	result = sddr09_send_scsi_command(us, command, sizeof(command));
++	result = sddr09_send_scsi_command(us, command, 12);
+ 
+ 	if (result != USB_STOR_TRANSPORT_GOOD)
+ 		US_DEBUGP("Result for send_control in sddr09_erase %d\n",
+@@ -493,11 +501,12 @@ sddr09_writeX(struct us_data *us,
+ 	      unsigned long Waddress, unsigned long Eaddress,
+ 	      int nr_of_pages, int bulklen, unsigned char *buf, int use_sg) {
+ 
+-	unsigned char command[12] = {
+-		0xe9, LUNBITS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+-	};
++	unsigned char *command = us->iobuf;
+ 	int result;
+ 
++	command[0] = 0xE9;
++	command[1] = LUNBITS;
++
+ 	command[2] = MSB_of(Waddress>>16);
+ 	command[3] = LSB_of(Waddress>>16);
+ 	command[4] = MSB_of(Waddress & 0xFFFF);
+@@ -511,7 +520,7 @@ sddr09_writeX(struct us_data *us,
+ 	command[10] = MSB_of(nr_of_pages);
+ 	command[11] = LSB_of(nr_of_pages);
+ 
+-	result = sddr09_send_scsi_command(us, command, sizeof(command));
++	result = sddr09_send_scsi_command(us, command, 12);
+ 
+ 	if (result != USB_STOR_TRANSPORT_GOOD) {
+ 		US_DEBUGP("Result for send_control in sddr09_writeX %d\n",
+@@ -554,15 +563,15 @@ sddr09_write_inplace(struct us_data *us,
+  */
+ static int
+ sddr09_read_sg_test_only(struct us_data *us) {
+-	unsigned char command[15] = {
+-		0xe7, LUNBITS, 0
+-	};
++	unsigned char *command = us->iobuf;
+ 	int result, bulklen, nsg, ct;
+ 	unsigned char *buf;
+ 	unsigned long address;
+ 
+ 	nsg = bulklen = 0;
+-
++	command[0] = 0xE7;
++	command[1] = LUNBITS;
++	command[2] = 0;
+ 	address = 040000; ct = 1;
+ 	nsg++;
+ 	bulklen += (ct << 9);
+@@ -628,20 +637,22 @@ sddr09_read_sg_test_only(struct us_data 
+ static int
+ sddr09_read_status(struct us_data *us, unsigned char *status) {
+ 
+-	unsigned char command[12] = {
+-		0xec, LUNBITS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+-	};
+-	unsigned char data[64];
++	unsigned char *command = us->iobuf;
++	unsigned char *data = us->iobuf;
+ 	int result;
+ 
+ 	US_DEBUGP("Reading status...\n");
+ 
+-	result = sddr09_send_scsi_command(us, command, sizeof(command));
++	memset(command, 0, 12);
++	command[0] = 0xEC;
++	command[1] = LUNBITS;
++
++	result = sddr09_send_scsi_command(us, command, 12);
+ 	if (result != USB_STOR_TRANSPORT_GOOD)
+ 		return result;
+ 
+ 	result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
+-				       data, sizeof(data), NULL);
++				       data, 64, NULL);
+ 	*status = data[0];
+ 	return (result == USB_STOR_XFER_GOOD ?
+ 			USB_STOR_TRANSPORT_GOOD : USB_STOR_TRANSPORT_ERROR);
+@@ -953,13 +964,15 @@ sddr09_read_control(struct us_data *us,
+  */
+ static int
+ sddr09_read_deviceID(struct us_data *us, unsigned char *deviceID) {
+-	unsigned char command[12] = {
+-		0xed, LUNBITS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+-	};
+-	unsigned char content[64];
++	unsigned char *command = us->iobuf;
++	unsigned char *content = us->iobuf;
+ 	int result, i;
+ 
+-	result = sddr09_send_scsi_command(us, command, sizeof(command));
++	memset(command, 0, 12);
++	command[0] = 0xED;
++	command[1] = LUNBITS;
++
++	result = sddr09_send_scsi_command(us, command, 12);
+ 	if (result != USB_STOR_TRANSPORT_GOOD)
+ 		return result;
+ 
+@@ -1006,11 +1019,13 @@ sddr09_get_wp(struct us_data *us, struct
+ static int
+ sddr09_reset(struct us_data *us) {
+ 
+-	unsigned char command[12] = {
+-		0xeb, LUNBITS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+-	};
++	unsigned char *command = us->iobuf;
++
++	memset(command, 0, 12);
++	command[0] = 0xEB;
++	command[1] = LUNBITS;
+ 
+-	return sddr09_send_scsi_command(us, command, sizeof(command));
++	return sddr09_send_scsi_command(us, command, 12);
+ }
+ #endif
+ 
+@@ -1313,7 +1328,7 @@ sddr09_init_card_info(struct us_data *us
+ int
+ sddr09_init(struct us_data *us) {
+ 	int result;
+-	unsigned char data[18];
++	unsigned char *data = us->iobuf;
+ 
+ 	result = sddr09_send_command(us, 0x01, USB_DIR_IN, data, 2);
+ 	if (result != USB_STOR_TRANSPORT_GOOD) {
+@@ -1333,10 +1348,10 @@ sddr09_init(struct us_data *us) {
+ 	US_DEBUGP("SDDR09init: %02X %02X\n", data[0], data[1]);
+ 	// get 07 00
+ 
+-	result = sddr09_request_sense(us, data, sizeof(data));
++	result = sddr09_request_sense(us, data, 18);
+ 	if (result == USB_STOR_TRANSPORT_GOOD && data[2] != 0) {
+ 		int j;
+-		for (j=0; j<sizeof(data); j++)
++		for (j=0; j<18; j++)
+ 			printk(" %02X", data[j]);
+ 		printk("\n");
+ 		// get 70 00 00 00 00 00 00 * 00 00 00 00 00 00
+--- linux-2.6.0-test1/drivers/usb/storage/sddr55.c	2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/usb/storage/sddr55.c	2003-07-19 17:03:50.000000000 -0700
+@@ -91,13 +91,14 @@ sddr55_bulk_transport(struct us_data *us
+ static int sddr55_status(struct us_data *us)
+ {
+ 	int result;
+-	unsigned char command[8] = {
+-		0, 0, 0, 0, 0, 0xb0, 0, 0x80
+-	};
+-	unsigned char status[8];
++	unsigned char *command = us->iobuf;
++	unsigned char *status = us->iobuf;
+ 	struct sddr55_card_info *info = (struct sddr55_card_info *)us->extra;
+ 
+ 	/* send command */
++	memset(command, 0, 8);
++	command[5] = 0xB0;
++	command[7] = 0x80;
+ 	result = sddr55_bulk_transport(us,
+ 		SCSI_DATA_WRITE, command, 8);
+ 
+@@ -158,10 +159,8 @@ static int sddr55_read_data(struct us_da
+ 		int use_sg) {
+ 
+ 	int result = USB_STOR_TRANSPORT_GOOD;
+-	unsigned char command[8] = {
+-		0, 0, 0, 0, 0, 0xb0, 0, 0x85
+-	};
+-	unsigned char status[8];
++	unsigned char *command = us->iobuf;
++	unsigned char *status = us->iobuf;
+ 	struct sddr55_card_info *info = (struct sddr55_card_info *)us->extra;
+ 
+ 	unsigned int pba;
+@@ -205,11 +204,15 @@ static int sddr55_read_data(struct us_da
+ 
+ 			address = (pba << info->blockshift) + page;
+ 
++			command[0] = 0;
+ 			command[1] = LSB_of(address>>16);
+ 			command[2] = LSB_of(address>>8);
+ 			command[3] = LSB_of(address);
+ 
++			command[4] = 0;
++			command[5] = 0xB0;
+ 			command[6] = LSB_of(pages << (1 - info->smallpageshift));
++			command[7] = 0x85;
+ 
+ 			/* send command */
+ 			result = sddr55_bulk_transport(us,
+@@ -274,10 +277,8 @@ static int sddr55_write_data(struct us_d
+ 		int use_sg) {
+ 
+ 	int result = USB_STOR_TRANSPORT_GOOD;
+-	unsigned char command[8] = {
+-		0, 0, 0, 0, 0, 0xb0, 0, 0x86
+-	};
+-	unsigned char status[8];
++	unsigned char *command = us->iobuf;
++	unsigned char *status = us->iobuf;
+ 	struct sddr55_card_info *info = (struct sddr55_card_info *)us->extra;
+ 
+ 	unsigned int pba;
+@@ -380,6 +381,8 @@ static int sddr55_write_data(struct us_d
+ 		command[6] = MSB_of(lba % 1000);
+ 
+ 		command[4] |= LSB_of(pages >> info->smallpageshift);
++		command[5] = 0xB0;
++		command[7] = 0x86;
+ 
+ 		/* send command */
+ 		result = sddr55_bulk_transport(us,
+@@ -473,11 +476,12 @@ static int sddr55_read_deviceID(struct u
+ 		unsigned char *deviceID) {
+ 
+ 	int result;
+-	unsigned char command[8] = {
+-		0, 0, 0, 0, 0, 0xb0, 0, 0x84
+-	};
+-	unsigned char content[64];
++	unsigned char *command = us->iobuf;
++	unsigned char *content = us->iobuf;
+ 
++	memset(command, 0, 8);
++	command[5] = 0xB0;
++	command[7] = 0x84;
+ 	result = sddr55_bulk_transport(us, SCSI_DATA_WRITE, command, 8);
+ 
+ 	US_DEBUGP("Result of send_control for device ID is %d\n",
+@@ -598,7 +602,7 @@ static int sddr55_read_map(struct us_dat
+ 	struct sddr55_card_info *info = (struct sddr55_card_info *)(us->extra);
+ 	int numblocks;
+ 	unsigned char *buffer;
+-	unsigned char command[8] = { 0, 0, 0, 0, 0, 0xb0, 0, 0x8a};	
++	unsigned char *command = us->iobuf;
+ 	int i;
+ 	unsigned short lba;
+ 	unsigned short max_lba;
+@@ -614,7 +618,10 @@ static int sddr55_read_map(struct us_dat
+ 	if (!buffer)
+ 		return -1;
+ 
++	memset(command, 0, 8);
++	command[5] = 0xB0;
+ 	command[6] = numblocks * 2 / 256;
++	command[7] = 0x8A;
+ 
+ 	result = sddr55_bulk_transport(us, SCSI_DATA_WRITE, command, 8);
+ 
+--- linux-2.6.0-test1/drivers/usb/storage/transport.h	2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/storage/transport.h	2003-07-19 17:03:50.000000000 -0700
+@@ -42,7 +42,7 @@
+ #define _TRANSPORT_H_
+ 
+ #include <linux/config.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "usb.h"
+ #include "scsi.h"
+ 
+--- linux-2.6.0-test1/drivers/usb/storage/unusual_devs.h	2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/usb/storage/unusual_devs.h	2003-07-19 17:03:50.000000000 -0700
+@@ -119,7 +119,7 @@ UNUSUAL_DEV(  0x04b8, 0x0602, 0x0110, 0x
+ UNUSUAL_DEV(  0x04cb, 0x0100, 0x0000, 0x2210,
+ 		"Fujifilm",
+ 		"FinePix 1400Zoom",
+-		US_SC_8070, US_PR_CBI, NULL, US_FL_FIX_INQUIRY),
++		US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY),
+ 
+ /* Reported by Peter Wächtler <pwaechtler@loewe-komp.de>
+  * The device needs the flags only.
+@@ -236,7 +236,7 @@ UNUSUAL_DEV(  0x0525, 0xa140, 0x0100, 0x
+ UNUSUAL_DEV(  0x054c, 0x0010, 0x0106, 0x0450, 
+ 		"Sony",
+ 		"DSC-S30/S70/S75/505V/F505/F707/F717/P8", 
+-		US_SC_SCSI, US_PR_CB, NULL,
++		US_SC_SCSI, US_PR_DEVICE, NULL,
+ 		US_FL_SINGLE_LUN | US_FL_MODE_XLATE ),
+ 
+ /* Reported by wim@geeks.nl */
+@@ -555,7 +555,7 @@ UNUSUAL_DEV( 0x0839, 0x000a, 0x0001, 0x0
+ UNUSUAL_DEV(  0x08ca, 0x2011, 0x0000, 0x9999,
+ 		"AIPTEK",
+ 		"PocketCAM 3Mega",
+-		US_SC_SCSI, US_PR_BULK, NULL,
++		US_SC_DEVICE, US_PR_DEVICE, NULL,
+ 		US_FL_MODE_XLATE ),
+ 
+ /* aeb */
+--- linux-2.6.0-test1/drivers/usb/storage/usb.c	2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/usb/storage/usb.c	2003-07-19 17:03:50.000000000 -0700
+@@ -958,6 +958,8 @@ static int storage_probe(struct usb_inte
+ 		goto BadDevice;
+ 	}
+ 
++	scsi_scan_host(us->host);
++
+ 	printk(KERN_DEBUG 
+ 	       "WARNING: USB Mass Storage data integrity not assured\n");
+ 	printk(KERN_DEBUG 
+--- linux-2.6.0-test1/drivers/usb/storage/usb.h	2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/usb/storage/usb.h	2003-07-19 17:03:50.000000000 -0700
+@@ -45,7 +45,7 @@
+ #define _USB_H_
+ 
+ #include <linux/usb.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/smp_lock.h>
+ #include <linux/completion.h>
+ #include <linux/version.h>
+@@ -69,11 +69,10 @@ struct us_unusual_dev {
+ 
+ /* Flag definitions: these entries are static */
+ #define US_FL_SINGLE_LUN      0x00000001 /* allow access to only LUN 0	    */
+-#define US_FL_MODE_XLATE      0x00000002 /* translate _6 to _10 commands for
+-						    Win/MacOS compatibility */
++#define US_FL_MODE_XLATE      0          /* [no longer used]                */
+ #define US_FL_IGNORE_SER      0		 /* [no longer used]		    */
+ #define US_FL_SCM_MULT_TARG   0x00000020 /* supports multiple targets	    */
+-#define US_FL_FIX_INQUIRY     0x00000040 /* INQUIRY response needs fixing   */
++#define US_FL_FIX_INQUIRY     0x00000040 /* INQUIRY response needs faking   */
+ #define US_FL_FIX_CAPACITY    0x00000080 /* READ CAPACITY response too big  */
+ 
+ /* Dynamic flag definitions: used in set_bit() etc. */
+--- linux-2.6.0-test1/drivers/usb/usb-skeleton.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/usb/usb-skeleton.c	2003-07-19 17:03:50.000000000 -0700
+@@ -507,7 +507,7 @@ static int skel_probe(struct usb_interfa
+ 	struct usb_endpoint_descriptor *endpoint;
+ 	size_t buffer_size;
+ 	int i;
+-	int retval;
++	int retval = -ENOMEM;
+ 
+ 	/* See if the device offered us matches what we can accept */
+ 	if ((udev->descriptor.idVendor != USB_SKEL_VENDOR_ID) ||
+@@ -515,18 +515,11 @@ static int skel_probe(struct usb_interfa
+ 		return -ENODEV;
+ 	}
+ 
+-	retval = usb_register_dev (interface, &skel_class);
+-	if (retval) {
+-		/* something prevented us from registering this driver */
+-		err ("Not able to get a minor for this device.");
+-		goto exit;
+-	}
+-
+ 	/* allocate memory for our device state and initialize it */
+ 	dev = kmalloc (sizeof(struct usb_skel), GFP_KERNEL);
+ 	if (dev == NULL) {
+ 		err ("Out of memory");
+-		goto exit_minor;
++		goto error;
+ 	}
+ 	memset (dev, 0x00, sizeof (*dev));
+ 
+@@ -603,24 +596,24 @@ static int skel_probe(struct usb_interfa
+ 	/* allow device read, write and ioctl */
+ 	dev->present = 1;
+ 
++	/* we can register the device now, as it is ready */
++	usb_set_intfdata (interface, dev);
++	retval = usb_register_dev (interface, &skel_class);
++	if (retval) {
++		/* something prevented us from registering this driver */
++		err ("Not able to get a minor for this device.");
++		usb_set_intfdata (interface, NULL);
++		goto error;
++	}
++
++
+ 	/* let the user know what node this device is now attached to */
+ 	info ("USB Skeleton device now attached to USBSkel-%d", dev->minor);
+-
+-	goto exit;
++	return 0;
+ 
+ error:
+ 	skel_delete (dev);
+-	dev = NULL;
+-
+-exit_minor:
+-	usb_deregister_dev (interface, &skel_class);
+-
+-exit:
+-	if (dev) {
+-		usb_set_intfdata (interface, dev);
+-		return 0;
+-	}
+-	return -ENODEV;
++	return retval;
+ }
+ 
+ 
+--- linux-2.6.0-test1/drivers/video/cfbimgblt.c	2003-06-26 22:07:25.000000000 -0700
++++ 25/drivers/video/cfbimgblt.c	2003-07-19 17:04:55.000000000 -0700
+@@ -325,7 +325,7 @@ void cfb_imageblit(struct fb_info *p, co
+ 		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);
+ }
+ 
+--- linux-2.6.0-test1/drivers/video/chipsfb.c	2003-06-14 12:18:09.000000000 -0700
++++ 25/drivers/video/chipsfb.c	2003-07-19 17:04:55.000000000 -0700
+@@ -85,7 +85,7 @@ static struct pmu_sleep_notifier chips_s
+ /*
+  * Exported functions
+  */
+-int chips_init(void);
++int chipsfb_init(void);
+ 
+ static int chipsfb_pci_init(struct pci_dev *dp, const struct pci_device_id *);
+ static int chipsfb_check_var(struct fb_var_screeninfo *var,
+@@ -460,7 +460,7 @@ static struct pci_driver chipsfb_driver 
+ 	.remove =	__devexit_p(chipsfb_remove),
+ };
+ 
+-int __init chips_init(void)
++int __init chipsfb_init(void)
+ {
+ 	return pci_module_init(&chipsfb_driver);
+ }
+--- linux-2.6.0-test1/drivers/video/console/fbcon.c	2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/video/console/fbcon.c	2003-07-19 17:04:55.000000000 -0700
+@@ -195,8 +195,7 @@ 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))
++	if (!info)
+ 		return;
+ 	info->cursor.enable ^= 1;
+ 	info->fbops->fb_cursor(info, &info->cursor);
+@@ -226,8 +225,7 @@ static void cursor_timer_handler(unsigne
+ 	struct fb_info *info = (struct fb_info *) dev_addr;
+ 	
+ 	schedule_work(&info->queue);	
+-	cursor_timer.expires = jiffies + HZ / 5;
+-	add_timer(&cursor_timer);
++	mod_timer(&cursor_timer, jiffies + HZ/5);
+ }
+ 
+ int __init fb_console_setup(char *this_opt)
+@@ -308,97 +306,6 @@ int set_con2fb_map(int unit, int newidx)
+ }
+ 
+ /*
+- * drawing helpers
+- */
+-static void putcs_unaligned(struct vc_data *vc, struct fb_info *info,
+-			    struct fb_image *image, int count,
+-			    const unsigned short *s)
+-{
+-	unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
+-	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 >> 3;
+-	u8 mask, *src, *dst, *dst0;
+-
+-	while (count) {
+-		if (count > maxcnt)
+-			cnt = k = maxcnt;
+-		else
+-			cnt = k = count;
+-
+-		image->width = vc->vc_font.width * cnt;
+-		pitch = ((image->width + 7) >> 3) + scan_align;
+-		pitch &= ~scan_align;
+-		size = pitch * vc->vc_font.height + buf_align;
+-		size &= ~buf_align;
+-		dst0 = info->pixmap.addr + fb_get_buffer_offset(info, size);
+-		image->data = dst0;
+-		while (k--) {
+-			src = vc->vc_font.data + (scr_readw(s++) & charmask)*
+-			cellsize;
+-			dst = dst0;
+-			mask = (u8) (0xfff << shift_high);
+-			move_buf_unaligned(info, dst, src, pitch, image->height,
+-					mask, shift_high, shift_low, mod, idx);
+-			shift_low += mod;
+-			dst0 += (shift_low >= 8) ? width : width - 1;
+-			shift_low &= 7;
+-			shift_high = 8 - shift_low;
+-		}
+-		info->fbops->fb_imageblit(info, image);
+-		image->dx += cnt * vc->vc_font.width;
+-		count -= cnt;
+-		atomic_dec(&info->pixmap.count);
+-		smp_mb__after_atomic_dec();
+-	}
+-}
+-
+-static void putcs_aligned(struct vc_data *vc, struct fb_info *info,
+-			  struct fb_image *image, int count,
+-			  const unsigned short *s)
+-{
+-	unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
+-	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;
+-	unsigned int buf_align = info->pixmap.buf_align - 1;
+-	unsigned int pitch, cnt, size, k;
+-	u8 *src, *dst, *dst0;
+-
+-	while (count) {
+-		if (count > maxcnt)
+-			cnt = k = maxcnt;
+-		else
+-			cnt = k = count;
+-		
+-		pitch = width * cnt + scan_align;
+-		pitch &= ~scan_align;
+-		size = pitch * vc->vc_font.height + buf_align;
+-		size &= ~buf_align;
+-		image->width = vc->vc_font.width * cnt;
+-		dst0 = info->pixmap.addr + fb_get_buffer_offset(info, size);
+-		image->data = dst0;
+-		while (k--) {
+-			src = vc->vc_font.data + (scr_readw(s++)&charmask)*cellsize;
+-			dst = dst0;
+-			move_buf_aligned(info, dst, src, pitch, width, image->height);
+-			dst0 += width;
+-		}
+-		info->fbops->fb_imageblit(info, image);
+-		image->dx += cnt * vc->vc_font.width;
+-		count -= cnt;
+-		atomic_dec(&info->pixmap.count);
+-		smp_mb__after_atomic_dec();
+-	}
+-}
+-
+-/*
+  * Accelerated handlers.
+  */
+ void accel_bmove(struct vc_data *vc, struct fb_info *info, int sy, 
+@@ -432,48 +339,21 @@ void accel_clear(struct vc_data *vc, str
+ 	info->fbops->fb_fillrect(info, &region);
+ }	
+ 
+-static void accel_putc(struct vc_data *vc, struct fb_info *info,
+-                      int c, int ypos, int xpos)
++void accel_putcs(struct vc_data *vc, struct fb_info *info,
++			const unsigned short *s, int count, int yy, int xx)
+ {
+ 	unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
+ 	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 scan_align = info->pixmap.scan_align - 1;
+ 	unsigned int buf_align = info->pixmap.buf_align - 1;
++	unsigned int shift_low = 0, mod = vc->vc_font.width % 8;
++	unsigned int shift_high = 8, pitch, cnt, size, k;
+ 	int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
+ 	int fgshift = (vc->vc_hi_font_mask) ? 9 : 8;
+-	unsigned int size, pitch;
+-	struct fb_image image;
+-	u8 *src, *dst;
+-
+-	image.dx = xpos * vc->vc_font.width;
+-	image.dy = ypos * vc->vc_font.height;
+-	image.width = vc->vc_font.width;
+-	image.height = vc->vc_font.height;
+-	image.fg_color = attr_fgcol(fgshift, c);
+-	image.bg_color = attr_bgcol(bgshift, c);
+-	image.depth = 1;
+-
+-	pitch = width + scan_align;
+-	pitch &= ~scan_align;
+-	size = pitch * vc->vc_font.height;
+-	size += buf_align;
+-	size &= ~buf_align;
+-	dst = info->pixmap.addr + fb_get_buffer_offset(info, size);
+-	image.data = dst;
+-	src = vc->vc_font.data + (c & charmask) * vc->vc_font.height * width;
+-
+-	move_buf_aligned(info, dst, src, pitch, width, image.height);
+-
+-	info->fbops->fb_imageblit(info, &image);
+-	atomic_dec(&info->pixmap.count);
+-	smp_mb__after_atomic_dec();
+-}
+-
+-void accel_putcs(struct vc_data *vc, struct fb_info *info,
+-			const unsigned short *s, int count, int yy, int xx)
+-{
+-	int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
+-	int fgshift = (vc->vc_hi_font_mask) ? 9 : 8;
++	unsigned int idx = vc->vc_font.width >> 3;
++	u8 *src, *dst, *dst0, mask;
+ 	struct fb_image image;
+ 	u16 c = scr_readw(s);
+ 
+@@ -484,10 +364,44 @@ void accel_putcs(struct vc_data *vc, str
+ 	image.height = vc->vc_font.height;
+ 	image.depth = 1;
+ 
+-	if (!(vc->vc_font.width & 7))
+-               putcs_aligned(vc, info, &image, count, s);
+-        else
+-               putcs_unaligned(vc, info, &image, count, s);
++	while (count) {
++		if (count > maxcnt)
++			cnt = k = maxcnt;
++		else
++			cnt = k = count;
++
++		image.width = vc->vc_font.width * cnt;
++		pitch = ((image.width + 7) >> 3) + scan_align;
++		pitch &= ~scan_align;
++		size = pitch * vc->vc_font.height + buf_align;
++		size &= ~buf_align;
++		dst0 = fb_get_buffer_offset(info, &info->pixmap, size);
++		image.data = dst0;
++		while (k--) {
++			src = vc->vc_font.data + (scr_readw(s++) & charmask)*cellsize;
++			dst = dst0;
++		
++			if (mod) {
++				mask = (u8) (0xfff << shift_high);
++				move_buf_unaligned(info, &info->pixmap, dst, src, pitch,
++						   image.height, mask, shift_high, 
++						   shift_low, mod, idx);
++				shift_low += mod;
++				dst0 += (shift_low >= 8) ? width : width - 1;
++				shift_low &= 7;
++				shift_high = 8 - shift_low;
++			} else {
++				move_buf_aligned(info, &info->pixmap, dst, src, pitch, idx, 
++						 image.height);
++				dst0 += width;
++			}	
++		}
++		info->fbops->fb_imageblit(info, &image);
++		image.dx += cnt * vc->vc_font.width;
++		count -= cnt;
++		atomic_dec(&info->pixmap.count);
++		smp_mb__after_atomic_dec();
++	}
+ }
+ 
+ void accel_clear_margins(struct vc_data *vc, struct fb_info *info,
+@@ -676,7 +590,7 @@ static const char *fbcon_startup(void)
+ 	if (!info->queue.func) {
+ 		INIT_WORK(&info->queue, fb_flashcursor, info);
+ 		
+-		cursor_timer.expires = jiffies + HZ / 50;
++		cursor_timer.expires = jiffies + HZ / 5;
+ 		cursor_timer.data = (unsigned long ) info;
+ 		add_timer(&cursor_timer);
+ 	}
+@@ -728,15 +642,13 @@ static __inline__ void updatescrollmode(
+ static void fbcon_set_display(struct vc_data *vc, int init, int logo)
+ {
+ 	struct fb_info *info = registered_fb[(int) con2fb_map[vc->vc_num]];
++	int nr_rows, nr_cols, old_rows, old_cols, i, charcnt = 256;
+ 	struct display *p = &fb_display[vc->vc_num];
+-	int nr_rows, nr_cols;
+-	int old_rows, old_cols;
+ 	unsigned short *save = NULL, *r, *q;
+-	int i, charcnt = 256;
+ 	struct font_desc *font;
+ 
+ 	if (vc->vc_num != fg_console || (info->flags & FBINFO_FLAG_MODULE) ||
+-	    info->fix.type == FB_TYPE_TEXT)
++	    (info->fix.type == FB_TYPE_TEXT))
+ 		logo = 0;
+ 
+ 	info->var.xoffset = info->var.yoffset = p->yscroll = 0;	/* reset wrap/pan */
+@@ -960,19 +872,51 @@ static void fbcon_clear(struct vc_data *
+ 		accel_clear(vc, info, real_y(p, sy), sx, height, width);
+ }
+ 
+-
+ static void fbcon_putc(struct vc_data *vc, int c, int ypos, int xpos)
+ {
+ 	struct fb_info *info = registered_fb[(int) con2fb_map[vc->vc_num]];
++	unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
++	unsigned int scan_align = info->pixmap.scan_align - 1;
++	unsigned int buf_align = info->pixmap.buf_align - 1;
++	unsigned int width = (vc->vc_font.width + 7) >> 3;
++	int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
++	int fgshift = (vc->vc_hi_font_mask) ? 9 : 8;
+ 	struct display *p = &fb_display[vc->vc_num];
+-
++	unsigned int size, pitch;
++	struct fb_image image;
++	u8 *src, *dst;
++	
+ 	if (!info->fbops->fb_blank && console_blanked)
+ 		return;
+ 
+ 	if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
+ 		return;
+ 
+-	accel_putc(vc, info, c, real_y(p, ypos), xpos);
++	image.dx = xpos * vc->vc_font.width;
++	image.dy = real_y(p, ypos) * vc->vc_font.height;
++	image.width = vc->vc_font.width;
++	image.height = vc->vc_font.height;
++	image.fg_color = attr_fgcol(fgshift, c);
++	image.bg_color = attr_bgcol(bgshift, c);
++	image.depth = 1;
++
++	src = vc->vc_font.data + (c & charmask) * vc->vc_font.height * width;
++
++	pitch = width + scan_align;
++	pitch &= ~scan_align;
++	size = pitch * vc->vc_font.height;
++	size += buf_align;
++	size &= ~buf_align;
++
++	dst = fb_get_buffer_offset(info, &info->pixmap, size);
++	image.data = dst;
++	
++	move_buf_aligned(info, &info->pixmap, dst, src, pitch, width,
++			image.height);
++
++	info->fbops->fb_imageblit(info, &image);
++	atomic_dec(&info->pixmap.count);
++	smp_mb__after_atomic_dec();
+ }
+ 
+ static void fbcon_putcs(struct vc_data *vc, const unsigned short *s,
+@@ -994,12 +938,16 @@ static void fbcon_cursor(struct vc_data 
+ {
+ 	struct fb_info *info = registered_fb[(int) con2fb_map[vc->vc_num]];
+ 	unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
++	unsigned int scan_align = info->sprite.scan_align - 1;
++	unsigned int buf_align = info->sprite.buf_align - 1;
+ 	int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
+ 	int fgshift = (vc->vc_hi_font_mask) ? 9 : 8;
+ 	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);
++	int y = real_y(p, vc->vc_y), d_pitch, dsize;
++	int s_pitch = (vc->vc_font.width + 7) >> 3;
++	int size = s_pitch * vc->vc_font.height, c;
+ 	struct fb_cursor cursor;
++	u8 *src, *dst;
+ 	
+ 	if (mode & CM_SOFTBACK) {
+ 		mode &= ~CM_SOFTBACK;
+@@ -1012,28 +960,27 @@ static void fbcon_cursor(struct vc_data 
+ 	} else if (softback_lines)
+ 		fbcon_set_origin(vc);
+ 
+- 	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 (info->cursor.rop == ROP_XOR) {
++		del_timer(&cursor_timer);
++		if (info->cursor.enable) {
+ 			info->cursor.enable = 0;
+-			info->cursor.rop = ROP_COPY;
+-			info->fbops->fb_cursor(info, &cursor);
+-		}	
++			info->fbops->fb_cursor(info, &info->cursor);
++		}
+ 		break;
+ 	case CM_MOVE:
+ 	case CM_DRAW:
++		memset(&cursor, 0, sizeof(struct fb_cursor));
+ 		info->cursor.enable = 1;
+-		
++
++ 		c = scr_readw((u16 *) vc->vc_pos);
++
++		src = vc->vc_font.data + ((c & charmask) * size);
+ 		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.image.depth = 1;
+ 			cursor.set |= FB_CUR_SETCMAP;
+ 		}
+ 		
+@@ -1056,18 +1003,29 @@ static void fbcon_cursor(struct vc_data 
+ 			cursor.set |= FB_CUR_SETHOT;
+ 		}
+ 
++		src = vc->vc_font.data + ((c & charmask) * size);
++
++		d_pitch = (s_pitch + scan_align) & ~scan_align;
++		dsize = d_pitch * vc->vc_font.height + buf_align;
++		dsize &= ~buf_align;
++		dst = fb_get_buffer_offset(info, &info->sprite, dsize);
++		move_buf_aligned(info, &info->sprite, dst, src, d_pitch, s_pitch, vc->vc_font.height);
++		info->cursor.image.data = dst;
++		cursor.set |= FB_CUR_SETSHAPE;
++		
+ 		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;
++			char *mask = kmalloc(dsize, GFP_ATOMIC);
++			int cur_height, i, j, k;
+ 
+ 			if (!mask)	return;	
+-		
++	
++			memset(mask, 0, dsize);
++			
+ 			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:
+@@ -1090,15 +1048,18 @@ static void fbcon_cursor(struct vc_data 
+ 				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;
++			i = (vc->vc_font.height - cur_height) * d_pitch;
++			for (j = 0; j < cur_height; j++) {
++				for (k = 0; k < s_pitch; k++)	
++					mask[i++] = 0xff;
++				i += (d_pitch - s_pitch);
++			}
+ 		}
+         	info->cursor.rop = ROP_XOR;
+ 		info->fbops->fb_cursor(info, &cursor);
++		atomic_dec(&info->sprite.count);
++		smp_mb__after_atomic_dec();
++		mod_timer(&cursor_timer, jiffies + HZ/5);
+ 		vbl_cursor_cnt = CURSOR_DRAW_DELAY;
+ 		break;
+ 	}
+@@ -1826,9 +1787,11 @@ static int fbcon_do_set_font(struct vc_d
+ 	vc->vc_font.height = h;
+ 	if (vc->vc_hi_font_mask && cnt == 256) {
+ 		vc->vc_hi_font_mask = 0;
+-		if (vc->vc_can_do_color)
++		if (vc->vc_can_do_color) {
+ 			vc->vc_complement_mask >>= 1;
+-
++			vc->vc_s_complement_mask >>= 1;
++		}
++			
+ 		/* ++Edmund: reorder the attribute bits */
+ 		if (vc->vc_can_do_color) {
+ 			unsigned short *cp =
+@@ -1847,9 +1810,11 @@ static int fbcon_do_set_font(struct vc_d
+ 		}
+ 	} else if (!vc->vc_hi_font_mask && cnt == 512) {
+ 		vc->vc_hi_font_mask = 0x100;
+-		if (vc->vc_can_do_color)
++		if (vc->vc_can_do_color) {
+ 			vc->vc_complement_mask <<= 1;
+-
++			vc->vc_s_complement_mask <<= 1;
++		}
++			
+ 		/* ++Edmund: reorder the attribute bits */
+ 		{
+ 			unsigned short *cp =
+--- linux-2.6.0-test1/drivers/video/controlfb.c	2003-06-14 12:18:00.000000000 -0700
++++ 25/drivers/video/controlfb.c	2003-07-19 17:04:55.000000000 -0700
+@@ -136,8 +136,8 @@ static int controlfb_check_var (struct f
+ /*
+  * inititialization
+  */
+-int control_init(void);
+-void control_setup(char *);
++int controlfb_init(void);
++void controlfb_setup(char *);
+ 
+ /******************** Prototypes for internal functions **********************/
+ 
+@@ -475,7 +475,7 @@ try_again:
+ 
+ 	/* Apply default var */
+ 	var.activate = FB_ACTIVATE_NOW;
+-	rc = fb_set_var(&var, &p->info);
++	rc = fb_set_var(&p->info, &var);
+ 	if (rc && (vmode != VMODE_640_480_60 || cmode != CMODE_8))
+ 		goto try_again;
+ 
+@@ -553,7 +553,7 @@ static void control_set_hardware(struct 
+ /*
+  * Called from fbmem.c for probing & initializing
+  */
+-int __init control_init(void)
++int __init controlfb_init(void)
+ {
+ 	struct device_node *dp;
+ 
+@@ -1057,7 +1057,7 @@ static void control_cleanup(void)
+ /*
+  * Parse user speficied options (`video=controlfb:')
+  */
+-void __init control_setup(char *options)
++void __init controlfb_setup(char *options)
+ {
+ 	char *this_opt;
+ 
+--- linux-2.6.0-test1/drivers/video/epson1355fb.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/video/epson1355fb.c	2003-07-19 17:04:55.000000000 -0700
+@@ -1,541 +1,714 @@
+ /*
+- * linux/drivers/video/epson1355fb.c
+- *	-- Support for the Epson SED1355 LCD/CRT controller
++ * linux/drivers/video/epson1355fb.c -- Epson S1D13505 frame buffer for 2.5.
+  *
+- * Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>
++ * Epson Research S1D13505 Embedded RAMDAC LCD/CRT Controller
++ *   (previously known as SED1355)
+  *
+- * based on linux/drivers/video/skeletonfb.c, which was
++ * Cf. http://www.erd.epson.com/vdc/html/S1D13505.html
++ *
++ *
++ * Copyright (C) Hewlett-Packard Company.  All rights reserved.
++ *
++ * Written by Christopher Hoover <ch@hpl.hp.com>
++ *
++ * Adapted from:
++ *
++ *  linux/drivers/video/skeletonfb.c
++ *  Modified to new api Jan 2001 by James Simmons (jsimmons@transvirtual.com)
+  *  Created 28 Dec 1997 by Geert Uytterhoeven
+  *
++ *  linux/drivers/video/epson1355fb.c (2.4 driver)
++ *  Copyright (C) 2000 Philipp Rumpf <prumpf@tux.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.
+- */
+-/* TODO (roughly in order of priority):
+- * 16 bpp support
+- * crt support
+- * hw cursor support
+- * SwivelView
++ * License. See the file COPYING in the main directory of this archive for
++ * more details.
++ *
++ *
++ * Noteworthy Issues
++ * -----------------
++ *
++ * This driver is complicated by the fact that this is a 16-bit chip
++ * and, on at least one platform (ceiva), we can only do 16-bit reads
++ * and writes to the framebuffer.  We hide this from user space
++ * except in the case of mmap().
++ *
++ *
++ * To Do
++ * -----
++ *
++ * - Test 8-bit pseudocolor mode
++ * - Allow setting bpp, virtual resolution 
++ * - Implement horizontal panning
++ * - (maybe) Implement hardware cursor
+  */
+ 
+-#include <asm/io.h>
+-#include <linux/config.h>
+-#include <linux/delay.h>
+-#include <linux/errno.h>
+-#include <linux/fb.h>
+-#include <linux/init.h>
+-#include <linux/kernel.h>
+-#include <linux/slab.h>
+-#include <linux/mm.h>
+ #include <linux/module.h>
+-#include <linux/sched.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
+ #include <linux/string.h>
++#include <linux/mm.h>
+ #include <linux/tty.h>
+-#include <video/fbcon-cfb8.h>
+-#include <video/fbcon-mfb.h>
+-#include <video/fbcon.h>
+-
+-/* Register defines.  The docs don't seem to provide nice mnemonic names
+- * so I made them up myself ... */
+-
+-#define E1355_PANEL	0x02
+-#define E1355_DISPLAY	0x0D
+-#define E1355_MISC	0x1B
+-#define E1355_GPIO	0x20
+-#define E1355_LUT_INDEX 0x24
+-#define E1355_LUT_DATA	0x26
++#include <linux/slab.h>
++#include <linux/delay.h>
++#include <linux/fb.h>
++#include <linux/init.h>
++#include <linux/ioport.h>
++#include <asm/types.h>
++#include <asm/io.h>
++#include <asm/uaccess.h>
++
++#include <video/epson1355.h>
++
++static struct fb_info info;
++
++static struct epson1355fb_par {
++	unsigned long reg_addr;
++} par;
++
++static u32 pseudo_palette[16];
++
++/* ------------------------------------------------------------------------- */
+ 
+ #ifdef CONFIG_SUPERH
+-#define E1355_REG_BASE	CONFIG_E1355_REG_BASE
+-#define E1355_FB_BASE	CONFIG_E1355_FB_BASE
+ 
+-static inline u8 e1355_read_reg(int index)
++static inline u8 epson1355_read_reg(int index)
+ {
+-	return ctrl_inb(E1355_REG_BASE + index);
++	return ctrl_inb(par.reg_addr + index);
+ }
+ 
+-static inline void e1355_write_reg(u8 data, int index)
++static inline void epson1355_write_reg(u8 data, int index)
+ {
+-	ctrl_outb(data, E1355_REG_BASE + index);
++	ctrl_outb(data, par.reg_addr + index);
+ }
+ 
+-static inline u16 e1355_read_reg16(int index)
++#elif defined(CONFIG_ARM)
++
++# ifdef CONFIG_ARCH_CEIVA
++#  include <asm/arch/hardware.h>
++#  define EPSON1355FB_BASE_PHYS	(CEIVA_PHYS_SED1355)
++# endif
++
++static inline u8 epson1355_read_reg(int index)
+ {
+-	return e1355_read_reg(index) + (e1355_read_reg(index+1) << 8);
++	return __raw_readb(par.reg_addr + index);
+ }
+ 
+-static inline void e1355_write_reg16(u16 data, int index)
++static inline void epson1355_write_reg(u8 data, int index)
+ {
+-	e1355_write_reg((data&0xff), index);
+-	e1355_write_reg(((data>>8)&0xff), index + 1);
++	__raw_writeb(data, par.reg_addr + index);
+ }
++
+ #else
+-#error unknown architecture
++# error "no architecture-specific epson1355_{read,write}_reg"
+ #endif
+ 
+-struct e1355fb_info {
+-	struct fb_info_gen gen;
+-};
+-
+-static int current_par_valid = 0;
+-static struct display disp;
++#ifndef EPSON1355FB_BASE_PHYS
++# error  "EPSON1355FB_BASE_PHYS is not defined"
++#endif
+ 
+-static struct fb_var_screeninfo default_var;
++#define EPSON1355FB_REGS_OFS	(0)
++#define EPSON1355FB_REGS_PHYS	(EPSON1355FB_BASE_PHYS + EPSON1355FB_REGS_OFS)
++#define EPSON1355FB_REGS_LEN	(64)
+ 
+-int e1355fb_init(void);
+-int e1355fb_setup(char*);
+-static int e1355_encode_var(struct fb_var_screeninfo *var, const void *par,
+-			    struct fb_info_gen *info);
+-/* ------------------- chipset specific functions -------------------------- */
++#define EPSON1355FB_FB_OFS	(0x00200000)
++#define EPSON1355FB_FB_PHYS	(EPSON1355FB_BASE_PHYS + EPSON1355FB_FB_OFS)
++#define EPSON1355FB_FB_LEN	(2 * 1024 * 1024)
+ 
++/* ------------------------------------------------------------------------- */
+ 
+-static void disable_hw_cursor(void)
++static inline u16 epson1355_read_reg16(int index)
+ {
+-	u8 curs;
++	u8 lo = epson1355_read_reg(index);
++	u8 hi = epson1355_read_reg(index + 1);
+ 
+-	curs = e1355_read_reg(0x27);
+-	curs &= ~0xc0;
+-	e1355_write_reg(curs, 0x27);
++	return (hi << 8) | lo;
+ }
+ 
+-static void e1355_detect(void)
++static inline void epson1355_write_reg16(u16 data, int index)
+ {
+-	u8 rev;
++	u8 lo = data & 0xff;
++	u8 hi = (data >> 8) & 0xff;
+ 
+-	e1355_write_reg(0x00, E1355_MISC);
++	epson1355_write_reg(lo, index);
++	epson1355_write_reg(hi, index + 1);
++}
+ 
+-	rev = e1355_read_reg(0x00);
++static inline u32 epson1355_read_reg20(int index)
++{
++	u8 b0 = epson1355_read_reg(index);
++	u8 b1 = epson1355_read_reg(index + 1);
++	u8 b2 = epson1355_read_reg(index + 2);
+ 
+-	if ((rev & 0xfc) != 0x0c) {
+-		printk(KERN_WARNING "Epson 1355 not detected\n");
+-	}
++	return (b2 & 0x0f) << 16 | (b1 << 8) | b0;
++}
+ 
+-	/* XXX */
+-	disable_hw_cursor();
++static inline void epson1355_write_reg20(u32 data, int index)
++{
++	u8 b0 = data & 0xff;
++	u8 b1 = (data >> 8) & 0xff;
++	u8 b2 = (data >> 16) & 0x0f;
+ 
+-	e1355_encode_var(&default_var, NULL, NULL);
++	epson1355_write_reg(b0, index);
++	epson1355_write_reg(b1, index + 1);
++	epson1355_write_reg(b2, index + 2);
+ }
+ 
+-struct e1355_par {
+-	u32 xres;
+-	u32 yres;
++/* ------------------------------------------------------------------------- */
+ 
+-	int bpp;
+-	int mem_bpp;
++static void set_lut(u8 index, u8 r, u8 g, u8 b)
++{
++	epson1355_write_reg(index, REG_LUT_ADDR);
++	epson1355_write_reg(r, REG_LUT_DATA);
++	epson1355_write_reg(g, REG_LUT_DATA);
++	epson1355_write_reg(b, REG_LUT_DATA);
++}
+ 
+-	u32 panel_xres;
+-	u32 panel_yres;
+-	
+-	int panel_width;
+-	int panel_ymul;
+-};
+ 
+-static int e1355_encode_fix(struct fb_fix_screeninfo *fix,
+-			    const void *raw_par,
+-			    struct fb_info_gen *info)
+-{
+-	const struct e1355_par *par = raw_par;
+-	
+-	memset(fix, 0, sizeof *fix);
+-	
+-	fix->type= FB_TYPE_PACKED_PIXELS;
++/**
++ *  	epson1355fb_setcolreg - sets a color register.
++ *      @regno: Which register in the CLUT we are programming 
++ *      @red: The red value which can be up to 16 bits wide 
++ *	@green: The green value which can be up to 16 bits wide 
++ *	@blue:  The blue value which can be up to 16 bits wide.
++ *	@transp: If supported the alpha value which can be up to 16 bits wide.
++ *      @info: frame buffer info structure
++ * 
++ *	Returns negative errno on error, or zero on success.
++ */
++static int epson1355fb_setcolreg(unsigned regno, unsigned r, unsigned g,
++				 unsigned b, unsigned transp,
++				 struct fb_info *info)
++{
++	if (info->var.grayscale)
++		r = g = b = (19595 * r + 38470 * g + 7471 * b) >> 16;
++
++	switch (info->fix.visual) {
++	case FB_VISUAL_TRUECOLOR:
++		if (regno >= 16)
++			return -EINVAL;
+ 
+-	if (!par)
+-		BUG();
++		((u32 *) info->pseudo_palette)[regno] =
++		    (r & 0xf800) | (g & 0xfc00) >> 5 | (b & 0xf800) >> 11;
+ 
+-	if (par->bpp == 1) {
+-		fix->visual = FB_VISUAL_MONO10;
+-	} else if (par->bpp <= 8) {
+-		fix->visual = FB_VISUAL_PSEUDOCOLOR;
+-	} else {
+-		fix->visual = FB_VISUAL_TRUECOLOR;
+-	}
++		break;
++	case FB_VISUAL_PSEUDOCOLOR:
++		if (regno >= 256)
++			return -EINVAL;
+ 
+-	return 0;
+-}
++		set_lut(regno, r >> 8, g >> 8, b >> 8);
+ 
+-static int e1355_set_bpp(struct e1355_par *par, int bpp)
+-{
+-	int code;
+-	u8 disp;
+-	u16 bytes_per_line;
+-
+-	switch(bpp) {
+-	case 1:
+-		code = 0; break;
+-	case 2:
+-		code = 1; break;
+-	case 4:
+-		code = 2; break;
+-	case 8:
+-		code = 3; break;
+-	case 16:
+-		code = 5; break;
++		break;
+ 	default:
+-		return -EINVAL; break;
++		return -ENOSYS;
+ 	}
+-
+-	disp = e1355_read_reg(E1355_DISPLAY);
+-	disp &= ~0x1c;
+-	disp |= code << 2;
+-	e1355_write_reg(disp, E1355_DISPLAY);
+-	
+-	bytes_per_line = (par->xres * bpp) >> 3;
+-	
+-	e1355_write_reg16(bytes_per_line, 0x16);
+-
+-	par->bpp = bpp;
+-
+ 	return 0;
+ }
+-		
+-static int e1355_decode_var(const struct fb_var_screeninfo *var,
+-			    void *raw_par,
+-			    struct fb_info_gen *info)
++
++/* ------------------------------------------------------------------------- */
++
++/**
++ *      epson1355fb_pan_display - Pans the display.
++ *      @var: frame buffer variable screen structure
++ *      @info: frame buffer structure that represents a single frame buffer
++ *
++ *	Pan (or wrap, depending on the `vmode' field) the display using the
++ *  	`xoffset' and `yoffset' fields of the `var' structure.
++ *  	If the values don't fit, return -EINVAL.
++ *
++ *      Returns negative errno on error, or zero on success.
++ */
++static int epson1355fb_pan_display(struct fb_var_screeninfo *var,
++				   struct fb_info *info)
+ {
+-	struct e1355_par *par = raw_par;
+-	int ret;
++	u32 start;
+ 
+-	if (!par)
+-		BUG();
++	if (var->xoffset != 0)	/* not yet ... */
++		return -EINVAL;
+ 
+-	/*
+-	 * Don't allow setting any of these yet: xres and yres don't
+-	 * make sense for LCD panels; xres_virtual and yres_virtual
+-	 * should be supported fine by our hardware though.
+-	 */
+-	if (var->xres != par->xres ||
+-	    var->yres != par->yres ||
+-	    var->xres != var->xres_virtual ||
+-	    var->yres != var->yres_virtual ||
+-	    var->xoffset != 0 ||
+-	    var->yoffset != 0)
++	if (var->yoffset + info->var.yres > info->var.yres_virtual)
+ 		return -EINVAL;
+ 
+-	if(var->bits_per_pixel != par->bpp) {
+-		ret = e1355_set_bpp(par, var->bits_per_pixel);
++	start = (info->fix.line_length >> 1) * var->yoffset;
+ 
+-		if (ret)
+-			goto out_err;
+-	}
+-		
+-	return 0;
++	epson1355_write_reg20(start, REG_SCRN1_DISP_START_ADDR0);
+ 
+- out_err:
+-	return ret;
++	return 0;
+ }
+ 
+-static void dump_panel_data(void)
++/* ------------------------------------------------------------------------- */
++
++static void lcd_enable(int enable)
+ {
+-	u8 panel = e1355_read_reg(E1355_PANEL);
+-	int width[2][4] = { { 4, 8, 16, -1 }, { 9, 12, 16, -1 } };
++	u8 mode = epson1355_read_reg(REG_DISPLAY_MODE);
+ 
+-	printk("%s %s %s panel, width %d bits\n",
+-	       panel & 2 ? "dual" : "single",
+-	       panel & 4 ? "color" : "mono",
+-	       panel & 1 ? "TFT" : "passive",
+-	       width[panel&1][(panel>>4)&3]);
++	if (enable)
++		mode |= 1;
++	else
++		mode &= ~1;
+ 
+-	printk("resolution %d x %d\n",
+-	       (e1355_read_reg(0x04) + 1) * 8,
+-	       ((e1355_read_reg16(0x08) + 1) * (1 + ((panel & 3) == 2))));
++	epson1355_write_reg(mode, REG_DISPLAY_MODE);
+ }
+ 
+-static int e1355_bpp_to_var(int bpp, struct fb_var_screeninfo *var)
++#if defined(CONFIG_ARCH_CEIVA)
++static void backlight_enable(int enable)
+ {
+-	switch(bpp) {
+-	case 1:
+-	case 2:
+-	case 4:
+-	case 8:
+-		var->bits_per_pixel = bpp;
+-		var->red.offset = var->green.offset = var->blue.offset = 0;
+-		var->red.length = var->green.length = var->blue.length = bpp;
++	/* ### this should be protected by a spinlock ... */
++	u8 pddr = clps_readb(PDDR);
++	if (enable)
++		pddr |= (1 << 5);
++	else
++		pddr &= ~(1 << 5);
++	clps_writeb(pddr, PDDR);
++}
++#else
++static void backlight_enable(int enable)
++{
++}
++#endif
++
++
++/**
++ *      epson1355fb_blank - blanks the display.
++ *      @blank_mode: the blank mode we want. 
++ *      @info: frame buffer structure that represents a single frame buffer
++ *
++ *      Blank the screen if blank_mode != 0, else unblank. Return 0 if
++ *      blanking succeeded, != 0 if un-/blanking failed due to e.g. a 
++ *      video mode which doesn't support it. Implements VESA suspend
++ *      and powerdown modes on hardware that supports disabling hsync/vsync:
++ *      blank_mode == 2: suspend vsync
++ *      blank_mode == 3: suspend hsync
++ *      blank_mode == 4: powerdown
++ *
++ *      Returns negative errno on error, or zero on success.
++ *
++ */
++static int epson1355fb_blank(int blank_mode, struct fb_info *info)
++{
++	switch (blank_mode) {
++	case VESA_NO_BLANKING:
++		lcd_enable(1);
++		backlight_enable(1);
+ 		break;
+-	case 16:
+-		var->bits_per_pixel = 16;
+-		var->red.offset = 11;
+-		var->red.length = 5;
+-		var->green.offset = 5;
+-		var->green.length = 6;
+-		var->blue.offset = 0;
+-		var->blue.length = 5;
++	case VESA_VSYNC_SUSPEND:
++	case VESA_HSYNC_SUSPEND:
++		backlight_enable(0);
+ 		break;
++	case VESA_POWERDOWN:
++		backlight_enable(0);
++		lcd_enable(0);
++		break;
++	default:
++		return -EINVAL;
+ 	}
+-
+ 	return 0;
+ }
+ 
+-static int e1355_encode_var(struct fb_var_screeninfo *var, const void *raw_par,
+-			    struct fb_info_gen *info)
++/* ------------------------------------------------------------------------- */
++
++/*
++ * We can't use the cfb generic routines, as we have to limit
++ * ourselves to 16-bit or 8-bit loads and stores to this 16-bit
++ * chip.
++ */
++
++static inline void epson1355fb_fb_writel(unsigned long v, unsigned long *a)
+ {
+-	u8 panel, display;
+-	u32 xres, xres_virtual, yres;
+-	static int width[2][4] = { { 4, 8, 16, -1 }, { 9, 12, 16, -1 } };
+-	static int bpp_tab[8] = { 1, 2, 4, 8, 15, 16 };
+-	int bpp, hw_bpp;
+-	int is_color, is_dual, is_tft;
+-	int lcd_enabled, crt_enabled;
++	u16 *p = (u16 *) a;
++	u16 l = v & 0xffff;
++	u16 h = v >> 16;
+ 
+-	panel = e1355_read_reg(E1355_PANEL);
+-	display = e1355_read_reg(E1355_DISPLAY);
++	fb_writew(l, p);
++	fb_writew(h, p + 1);
++}
+ 
+-	is_color = (panel & 0x04) != 0;
+-	is_dual  = (panel & 0x02) != 0;
+-	is_tft   = (panel & 0x01) != 0;
++static inline unsigned long epson1355fb_fb_readl(const unsigned long *a)
++{
++	const u16 *p = (u16 *) a;
++	u16 l = fb_readw(p);
++	u16 h = fb_readw(p + 1);
+ 
+-	bpp = bpp_tab[(display>>2)&7]; 
+-	e1355_bpp_to_var(bpp, var);
++	return (h << 16) | l;
++}
+ 
+-	crt_enabled = (display & 0x02) != 0;
+-	lcd_enabled = (display & 0x02) != 0;
++#define FB_READL epson1355fb_fb_readl
++#define FB_WRITEL epson1355fb_fb_writel
+ 
+-	hw_bpp = width[is_tft][(panel>>4)&3];
++/* ------------------------------------------------------------------------- */
+ 
+-	xres = e1355_read_reg(0x04) + 1;
+-	yres = e1355_read_reg16(0x08) + 1;
+-	
+-	xres *= 8;
+-	/* talk about weird hardware .. */
+-	yres *= (is_dual && !crt_enabled) ? 2 : 1;
+-
+-	xres_virtual = e1355_read_reg16(0x16);
+-	/* it's in 2-byte words initially */
+-	xres_virtual *= 16;
+-	xres_virtual /= var->bits_per_pixel;
++static inline unsigned long copy_from_user16(void *to, const void *from,
++					     unsigned long n)
++{
++	u16 *dst = (u16 *) to;
++	u16 *src = (u16 *) from;
+ 
+-	var->xres = xres;
+-	var->yres = yres;
+-	var->xres_virtual = xres_virtual;
+-	var->yres_virtual = yres;
++	if (!access_ok(VERIFY_READ, from, n))
++		return n;
+ 
+-	var->xoffset = var->yoffset = 0;
++	while (n > 1) {
++		u16 v;
++		if (__get_user(v, src))
++			return n;
+ 
+-	var->grayscale = !is_color;
+-	
+-	return 0;
+-}
++		fb_writew(v, dst);
+ 
+-#define is_dual(panel) (((panel)&3)==2)
++		src++, dst++;
++		n -= 2;
++	}
+ 
+-static void get_panel_data(struct e1355_par *par)
+-{
+-	u8 panel;
+-	int width[2][4] = { { 4, 8, 16, -1 }, { 9, 12, 16, -1 } };
++	if (n) {
++		u8 v;
+ 
+-	panel = e1355_read_reg(E1355_PANEL);
++		if (__get_user(v, ((u8 *) src)))
++			return n;
+ 
+-	par->panel_width = width[panel&1][(panel>>4)&3];
+-	par->panel_xres = (e1355_read_reg(0x04) + 1) * 8;
+-	par->panel_ymul = is_dual(panel) ? 2 : 1;
+-	par->panel_yres = ((e1355_read_reg16(0x08) + 1)
+-			   * par->panel_ymul);
++		fb_writeb(v, dst);
++	}
++	return 0;
+ }
+ 
+-static void e1355_get_par(void *raw_par, struct fb_info_gen *info)
++static inline unsigned long copy_to_user16(void *to, const void *from,
++					   unsigned long n)
+ {
+-	struct e1355_par *par = raw_par;
++	u16 *dst = (u16 *) to;
++	u16 *src = (u16 *) from;
+ 
+-	get_panel_data(par);
+-}
++	if (!access_ok(VERIFY_WRITE, to, n))
++		return n;
+ 
+-static void e1355_set_par(const void *par, struct fb_info_gen *info)
+-{
+-}
++	while (n > 1) {
++		u16 v = fb_readw(src);
+ 
+-static int e1355_getcolreg(unsigned regno, unsigned *red, unsigned *green,
+-			   unsigned *blue, unsigned *transp,
+-			   struct fb_info *info)
+-{
+-	u8 r, g, b;
++		if (__put_user(v, dst))
++			return n;
+ 
+-	e1355_write_reg(regno, E1355_LUT_INDEX);
+-	r = e1355_read_reg(E1355_LUT_DATA);
+-	g = e1355_read_reg(E1355_LUT_DATA);
+-	b = e1355_read_reg(E1355_LUT_DATA);
++		src++, dst++;
++		n -= 2;
++	}
+ 
+-	*red = r << 8;
+-	*green = g << 8;
+-	*blue = b << 8;
++	if (n) {
++		u8 v = fb_readb(src);
+ 
++		if (__put_user(v, ((u8 *) dst)))
++			return n;
++	}
+ 	return 0;
+ }
+ 
+-static int e1355fb_setcolreg(unsigned regno, unsigned red, unsigned green,
+-			     unsigned blue, unsigned transp,
+-			     struct fb_info *info)
+-{
+-	u8 r = (red >> 8) & 0xf0;
+-	u8 g = (green>>8) & 0xf0;
+-	u8 b = (blue>> 8) & 0xf0;
+-
+-	e1355_write_reg(regno, E1355_LUT_INDEX);
+-	e1355_write_reg(r, E1355_LUT_DATA);
+-	e1355_write_reg(g, E1355_LUT_DATA);
+-	e1355_write_reg(b, E1355_LUT_DATA);
+-	
+-	return 0;
+-}
+ 
+-static int e1355_pan_display(const struct fb_var_screeninfo *var,
+-			     struct fb_info_gen *info)
++static ssize_t
++epson1355fb_read(struct file *file, char *buf, size_t count, loff_t * ppos)
+ {
+-	BUG();
+-	
+-	return -EINVAL;
++	unsigned long p = *ppos;
++
++	/* from fbmem.c except for our own copy_*_user */
++	if (p >= info.fix.smem_len)
++		return 0;
++	if (count >= info.fix.smem_len)
++		count = info.fix.smem_len;
++	if (count + p > info.fix.smem_len)
++		count = info.fix.smem_len - p;
++
++	if (count) {
++		char *base_addr;
++
++		base_addr = info.screen_base;
++		count -= copy_to_user16(buf, base_addr + p, count);
++		if (!count)
++			return -EFAULT;
++		*ppos += count;
++	}
++	return count;
+ }
+ 
+-/*
+- * The AERO_HACKS parts disable/enable the backlight on the Compaq Aero 8000.
+- * I'm not sure they aren't dangerous to the hardware, so be warned.
+- */
+-#undef AERO_HACKS
++static ssize_t
++epson1355fb_write(struct file *file, const char *buf,
++		  size_t count, loff_t * ppos)
++{
++	unsigned long p = *ppos;
++	int err;
++
++	/* from fbmem.c except for our own copy_*_user */
++	if (p > info.fix.smem_len)
++		return -ENOSPC;
++	if (count >= info.fix.smem_len)
++		count = info.fix.smem_len;
++	err = 0;
++	if (count + p > info.fix.smem_len) {
++		count = info.fix.smem_len - p;
++		err = -ENOSPC;
++	}
+ 
+-static int e1355_blank(int blank_mode, struct fb_info_gen *info)
+-{
+-	u8 disp;
++	if (count) {
++		char *base_addr;
+ 
+-	switch (blank_mode) {
+-	case VESA_NO_BLANKING:
+-		disp = e1355_read_reg(E1355_DISPLAY);
+-		disp |= 1;
+-		e1355_write_reg(disp, E1355_DISPLAY);
+- 		
+-#ifdef AERO_HACKS
+-		e1355_write_reg(0x6, 0x20);
+-#endif
+-		break;
++		base_addr = info.screen_base;
++		count -= copy_from_user16(base_addr + p, buf, count);
++		*ppos += count;
++		err = -EFAULT;
++	}
++	if (count)
++		return count;
++	return err;
++}
++
++/* ------------------------------------------------------------------------- */
++
++static struct fb_ops epson1355fb_fbops = {
++	.owner 		= THIS_MODULE,
++	.fb_setcolreg 	= epson1355fb_setcolreg,
++	.fb_pan_display = epson1355fb_pan_display,
++	.fb_blank 	= epson1355fb_blank,
++	.fb_fillrect 	= cfb_fillrect,
++	.fb_copyarea 	= cfb_copyarea,
++	.fb_imageblit 	= cfb_imageblit,
++	.fb_read 	= epson1355fb_read,
++	.fb_write 	= epson1355fb_write,
++	.fb_cursor 	= soft_cursor,
++};
+ 
+-	case VESA_VSYNC_SUSPEND:
+-	case VESA_HSYNC_SUSPEND:
+-	case VESA_POWERDOWN:
+-		disp = e1355_read_reg(E1355_DISPLAY);
+-		disp &= ~1;
+-		e1355_write_reg(disp, E1355_DISPLAY);
++/* ------------------------------------------------------------------------- */
+ 
+-#ifdef AERO_HACKS
+-		e1355_write_reg(0x0, 0x20);
+-#endif
+-		break;
++static __init unsigned int get_fb_size(struct fb_info *info)
++{
++	unsigned int size = 2 * 1024 * 1024;
++	char *p = info->screen_base;
+ 
+-	default:
+-		return -EINVAL;
+-	}
++	/* the 512k framebuffer is aliased at start + 0x80000 * n */
++	fb_writeb(1, p);
++	fb_writeb(0, p + 0x80000);
++	if (!fb_readb(p))
++		size = 512 * 1024;
+ 
+-	return 0;
++	fb_writeb(0, p);
++
++	return size;
+ }
+ 
+-static struct display_switch e1355_dispsw;
++static int epson1355_width_tab[2][4] __initdata =
++    { {4, 8, 16, -1}, {9, 12, 16, -1} };
++static int epson1355_bpp_tab[8] __initdata = { 1, 2, 4, 8, 15, 16 };
+ 
+-static void e1355_set_disp(const void *unused, struct display *disp,
+-			   struct fb_info_gen *info)
++static void __init fetch_hw_state(struct fb_info *info)
+ {
+-	struct display_switch *d;
++	struct fb_var_screeninfo *var = &info->var;
++	struct fb_fix_screeninfo *fix = &info->fix;
++	u8 panel, display;
++	u16 offset;
++	u32 xres, yres;
++	u32 xres_virtual, yres_virtual;
++	int bpp, lcd_bpp;
++	int is_color, is_dual, is_tft;
++	int lcd_enabled, crt_enabled;
++
++	fix->type = FB_TYPE_PACKED_PIXELS;
++
++	display = epson1355_read_reg(REG_DISPLAY_MODE);
++	bpp = epson1355_bpp_tab[(display >> 2) & 7];
+ 
+-	disp->dispsw = &e1355_dispsw;
+-	
+-	switch(disp->var.bits_per_pixel) {
+-#ifdef FBCON_HAS_MFB
+-	case 1:
+-		d = &fbcon_mfb; break;
+-#endif	       
+-#ifdef FBCON_HAS_CFB8
++	switch (bpp) {
+ 	case 8:
+-		d = &fbcon_cfb8; break;
+-#endif
++		fix->visual = FB_VISUAL_PSEUDOCOLOR;
++		var->bits_per_pixel = 8;
++		var->red.offset = var->green.offset = var->blue.offset = 0;
++		var->red.length = var->green.length = var->blue.length = 8;
++		break;
++	case 16:
++		/* 5-6-5 RGB */
++		fix->visual = FB_VISUAL_TRUECOLOR;
++		var->bits_per_pixel = 16;
++		var->red.offset = 11;
++		var->red.length = 5;
++		var->green.offset = 5;
++		var->green.length = 6;
++		var->blue.offset = 0;
++		var->blue.length = 5;
++		break;
+ 	default:
+-		BUG(); break;
++		BUG();
+ 	}
+ 
+-	memcpy(&e1355_dispsw, d, sizeof *d);
++	if (fix->visual == FB_VISUAL_TRUECOLOR) {
++		info->pseudo_palette = &pseudo_palette;
++		fb_alloc_cmap(&(info->cmap), 16, 0);
++	} else
++		fb_alloc_cmap(&(info->cmap), 1 << bpp, 0);
++
++	panel = epson1355_read_reg(REG_PANEL_TYPE);
++	is_color = (panel & 0x04) != 0;
++	is_dual = (panel & 0x02) != 0;
++	is_tft = (panel & 0x01) != 0;
++	crt_enabled = (display & 0x02) != 0;
++	lcd_enabled = (display & 0x01) != 0;
++	lcd_bpp = epson1355_width_tab[is_tft][(panel >> 4) & 3];
++
++	xres = (epson1355_read_reg(REG_HORZ_DISP_WIDTH) + 1) * 8;
++	yres = (epson1355_read_reg16(REG_VERT_DISP_HEIGHT0) + 1) *
++	    ((is_dual && !crt_enabled) ? 2 : 1);
++	offset = epson1355_read_reg16(REG_MEM_ADDR_OFFSET0) & 0x7ff;
++	xres_virtual = offset * 16 / bpp;
++	yres_virtual = fix->smem_len / (offset * 2);
++
++	var->xres = xres;
++	var->yres = yres;
++	var->xres_virtual = xres_virtual;
++	var->yres_virtual = yres_virtual;
++	var->xoffset = var->yoffset = 0;
++
++	fix->line_length = offset * 2;
++
++	fix->xpanstep = 0;	/* no pan yet */
++	fix->ypanstep = 1;
++	fix->ywrapstep = 0;
++	fix->accel = FB_ACCEL_NONE;
++
++	var->grayscale = !is_color;
+ 
+-	/* reading is terribly slow for us */
+-#if 0 /* XXX: need to work out why this doesn't work */
+-	e1355_dispsw.bmove = fbcon_redraw_bmove;
++#ifdef DEBUG
++	printk(KERN_INFO
++	       "epson1355fb: xres=%d, yres=%d, "
++	       "is_color=%d, is_dual=%d, is_tft=%d\n",
++	       xres, yres, is_color, is_dual, is_tft);
++	printk(KERN_INFO
++	       "epson1355fb: bpp=%d, lcd_bpp=%d, "
++	       "crt_enabled=%d, lcd_enabled=%d\n",
++	       bpp, lcd_bpp, crt_enabled, lcd_enabled);
+ #endif
+ }
+ 
+-/* ------------ Interfaces to hardware functions ------------ */
+ 
++static void clearfb16(struct fb_info *info)
++{
++	u16 *dst = (u16 *) info->screen_base;
++	unsigned long n = info->fix.smem_len;
+ 
+-struct fbgen_hwswitch e1355_switch = {
+-	.detect =	e1355_detect,
+-	.encode_fix =	e1355_encode_fix,
+-	.decode_var =	e1355_decode_var,
+-	.encode_var =	e1355_encode_var,
+-	.get_par =	e1355_get_par,
+-	.set_par =	e1355_set_par,
+-	.getcolreg =	e1355_getcolreg,
+-	.pan_display =	e1355_pan_display,
+-	.blank =	e1355_blank,
+-	.set_disp =	e1355_set_disp,
+-};
++	while (n > 1) {
++		fb_writew(0, dst);
++		dst++, n -= 2;
++	}
+ 
++	if (n)
++		fb_writeb(0, dst);
++}
+ 
+-/* ------------ Hardware Independent Functions ------------ */
++static void epson1355fb_deinit(void);
+ 
++int __init epson1355fb_init(void)
++{
++	u8 revision;
++	int rc = 0;
+ 
+-static struct fb_ops e1355fb_ops = {
+-	.owner =	THIS_MODULE,
+-	.fb_get_fix =	fbgen_get_fix,
+-	.fb_get_var =	fbgen_get_var,
+-	.fb_set_var =	fbgen_set_var,
+-	.fb_get_cmap =	fbgen_get_cmap,
+-	.fb_set_cmap =	gen_set_cmap,
+-	.fb_setcolreg =	e1355fb_setcolreg,
+-	.fb_pan_display =fbgen_pan_display,
+-	.fb_blank =	fbgen_blank,
+-};
++	if (!request_mem_region
++	    (EPSON1355FB_REGS_PHYS, EPSON1355FB_REGS_LEN,
++	     "S1D13505 registers")) {
++		printk(KERN_ERR "epson1355fb: unable to reserve "
++		       "registers at 0x%0x\n", EPSON1355FB_REGS_PHYS);
++		rc = -EBUSY;
++		goto bail;
++	}
+ 
+-static struct e1355fb_info fb_info;
++	if (!request_mem_region(EPSON1355FB_FB_PHYS, EPSON1355FB_FB_LEN,
++				"S1D13505 framebuffer")) {
++		printk(KERN_ERR "epson1355fb: unable to reserve "
++		       "framebuffer at 0x%0x\n", EPSON1355FB_FB_PHYS);
++		rc = -EBUSY;
++		goto bail;
++	}
++
++	par.reg_addr = (unsigned long)
++	    ioremap(EPSON1355FB_REGS_PHYS, EPSON1355FB_REGS_LEN);
++	if (!par.reg_addr) {
++		printk(KERN_ERR "epson1355fb: unable to map registers\n");
++		rc = -ENOMEM;
++		goto bail;
++	}
++
++	info.screen_base =
++	    ioremap(EPSON1355FB_FB_PHYS, EPSON1355FB_FB_LEN);
++	if (!info.screen_base) {
++		printk(KERN_ERR
++		       "epson1355fb: unable to map framebuffer\n");
++		rc = -ENOMEM;
++		goto bail;
++	}
++
++	revision = epson1355_read_reg(REG_REVISION_CODE);
++	if ((revision >> 2) != 3) {
++		printk(KERN_INFO "epson1355fb: epson1355 not found\n");
++		rc = -ENODEV;
++		goto bail;
++	}
++
++	info.fix.mmio_start = EPSON1355FB_REGS_PHYS;
++	info.fix.mmio_len = EPSON1355FB_REGS_LEN;
++	info.fix.smem_start = EPSON1355FB_FB_PHYS;
++	info.fix.smem_len = get_fb_size(&info);
++
++	printk(KERN_INFO
++	       "epson1355fb: regs mapped at 0x%lx, fb %d KiB mapped at 0x%p\n",
++	       par.reg_addr, info.fix.smem_len / 1024, info.screen_base);
++
++	strcpy(info.fix.id, "S1D13505");
++	info.par = &par;
++	info.node = NODEV;
++	info.fbops = &epson1355fb_fbops;
++	info.flags = FBINFO_FLAG_DEFAULT;
++
++	/* we expect the boot loader to have initialized the chip
++	   with appropriate parameters from which we can determinte
++	   the flavor of lcd panel attached */
++	fetch_hw_state(&info);
++
++	/* turn this puppy on ... */
++	clearfb16(&info);
++	backlight_enable(1);
++	lcd_enable(1);
++
++	if (register_framebuffer(&info) < 0) {
++		rc = -EINVAL;
++		goto bail;
++	}
++
++	printk(KERN_INFO "fb%d: %s frame buffer device\n",
++	       minor(info.node), info.fix.id);
+ 
+-int __init e1355fb_setup(char *str)
+-{
+ 	return 0;
++
++      bail:
++	epson1355fb_deinit();
++	return rc;
+ }
+ 
+-int __init e1355fb_init(void)
++static void epson1355fb_deinit(void)
+ {
+-	fb_info.gen.fbhw = &e1355_switch;
+-	fb_info.gen.fbhw->detect();
+-	strcpy(fb_info.gen.info.modename, "SED1355");
+-	fb_info.gen.info.changevar = NULL;
+-	fb_info.gen.info.fbops = &e1355fb_ops;
+-	fb_info.gen.info.screen_base = (void *)E1355_FB_BASE;
+-	fb_info.gen.currcon = -1;
+-	fb_info.gen.info.disp = &disp;
+-	fb_info.gen.parsize = sizeof(struct e1355_par);
+-	fb_info.gen.info.switch_con = &fbgen_switch;
+-	fb_info.gen.info.updatevar = &fbgen_update_var;
+-	fb_info.gen.info.flags = FBINFO_FLAG_DEFAULT;
+-	/* This should give a reasonable default video mode */
+-	fbgen_get_var(&disp.var, -1, &fb_info.gen.info);
+-	fbgen_do_set_var(&disp.var, 1, &fb_info.gen);
+-	fbgen_set_disp(-1, &fb_info.gen);
+-	if (disp.var.bits_per_pixel > 1) 
+-		do_install_cmap(0, &fb_info.gen);
+-	if (register_framebuffer(&fb_info.gen.info) < 0)
+-		return -EINVAL;
+-	printk(KERN_INFO "fb%d: %s frame buffer device\n", fb_info.gen.info.node,
+-	       fb_info.gen.info.modename);
++	fb_dealloc_cmap(&info.cmap);
+ 
+-	return 0;
++	if (info.screen_base)
++		iounmap(info.screen_base);
++	if (par.reg_addr)
++		iounmap((void *) par.reg_addr);
++
++	release_mem_region(EPSON1355FB_FB_PHYS, EPSON1355FB_FB_LEN);
++	release_mem_region(EPSON1355FB_REGS_PHYS, EPSON1355FB_REGS_LEN);
+ }
+ 
++static void __exit epson1355fb_cleanup(void)
++{
++	backlight_enable(0);
++	lcd_enable(0);
+ 
+-    /*
+-     *  Cleanup
+-     */
+-
+-void e1355fb_cleanup(struct fb_info *info)
+-{
+-	/*
+-	 *  If your driver supports multiple boards, you should unregister and
+-	 *  clean up all instances.
+-	 */
+-	
+-	unregister_framebuffer(info);
+-	/* ... */
++	unregister_framebuffer(&info);
++	epson1355fb_deinit();
+ }
+ 
++/* ------------------------------------------------------------------------- */
++
++#ifdef MODULE
++module_init(epson1355fb_init);
++#endif
++module_exit(epson1355fb_cleanup);
++
++MODULE_AUTHOR("Christopher Hoover <ch@hpl.hp.com>");
++MODULE_DESCRIPTION("Framebuffer driver for Epson S1D13505");
+ MODULE_LICENSE("GPL");
+--- linux-2.6.0-test1/drivers/video/fbmem.c	2003-06-14 12:17:55.000000000 -0700
++++ 25/drivers/video/fbmem.c	2003-07-19 17:04:55.000000000 -0700
+@@ -25,7 +25,6 @@
+ #include <linux/mman.h>
+ #include <linux/tty.h>
+ #include <linux/init.h>
+-#include <linux/linux_logo.h>
+ #include <linux/proc_fs.h>
+ #ifdef CONFIG_KMOD
+ #include <linux/kmod.h>
+@@ -102,13 +101,13 @@ extern int hgafb_setup(char*);
+ extern int matroxfb_init(void);
+ extern int matroxfb_setup(char*);
+ extern int hpfb_init(void);
+-extern int control_init(void);
+-extern int control_setup(char*);
+-extern int platinum_init(void);
+-extern int platinum_setup(char*);
++extern int controlfb_init(void);
++extern int controlfb_setup(char*);
++extern int platinumfb_init(void);
++extern int platinumfb_setup(char*);
+ extern int valkyriefb_init(void);
+ extern int valkyriefb_setup(char*);
+-extern int chips_init(void);
++extern int chipsfb_init(void);
+ extern int g364fb_init(void);
+ extern int sa1100fb_init(void);
+ extern int fm2fb_init(void);
+@@ -135,8 +134,7 @@ extern int tx3912fb_init(void);
+ extern int tx3912fb_setup(char*);
+ extern int radeonfb_init(void);
+ extern int radeonfb_setup(char*);
+-extern int e1355fb_init(void);
+-extern int e1355fb_setup(char*);
++extern int epson1355fb_init(void);
+ extern int pvr2fb_init(void);
+ extern int pvr2fb_setup(char*);
+ extern int sstfb_init(void);
+@@ -218,16 +216,16 @@ static struct {
+ 	{ "radeonfb", radeonfb_init, radeonfb_setup },
+ #endif
+ #ifdef CONFIG_FB_CONTROL
+-	{ "controlfb", control_init, control_setup },
++	{ "controlfb", controlfb_init, controlfb_setup },
+ #endif
+ #ifdef CONFIG_FB_PLATINUM
+-	{ "platinumfb", platinum_init, platinum_setup },
++	{ "platinumfb", platinumfb_init, platinumfb_setup },
+ #endif
+ #ifdef CONFIG_FB_VALKYRIE
+ 	{ "valkyriefb", valkyriefb_init, valkyriefb_setup },
+ #endif
+ #ifdef CONFIG_FB_CT65550
+-	{ "chipsfb", chips_init, NULL },
++	{ "chipsfb", chipsfb_init, NULL },
+ #endif
+ #ifdef CONFIG_FB_IMSTT
+ 	{ "imsttfb", imsttfb_init, imsttfb_setup },
+@@ -342,8 +340,8 @@ static struct {
+ #ifdef CONFIG_FB_TX3912
+ 	{ "tx3912fb", tx3912fb_init, tx3912fb_setup },
+ #endif
+-#ifdef CONFIG_FB_E1355
+-	{ "e1355fb", e1355fb_init, e1355fb_setup },
++#ifdef CONFIG_FB_EPSON1355
++	{ "s1d1355fb", epson1355fb_init, NULL },
+ #endif
+ #ifdef CONFIG_FB_PVR2
+ 	{ "pvr2fb", pvr2fb_init, pvr2fb_setup },
+@@ -409,20 +407,20 @@ void sys_outbuf(u8 *src, u8 *dst, unsign
+ 	memcpy(dst, src, size);
+ }	
+ 
+-void move_buf_aligned(struct fb_info *info, u8 *dst, u8 *src, u32 d_pitch, 
+-			u32 s_pitch, u32 height)
++void move_buf_aligned(struct fb_info *info, struct fb_pixmap *buf, u8 *dst, u8 *src,
++			u32 d_pitch, u32 s_pitch, u32 height)
+ {
+ 	int i;
+ 
+ 	for (i = height; i--; ) {
+-		info->pixmap.outbuf(src, dst, s_pitch);
++		buf->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,
++void move_buf_unaligned(struct fb_info *info, struct fb_pixmap *buf, u8 *dst, u8 *src, 
++			u32 d_pitch, u32 height, u32 mask, u32 shift_high, u32 shift_low,
+ 			u32 mod, u32 idx)
+ {
+ 	int i, j;
+@@ -430,21 +428,21 @@ void move_buf_unaligned(struct fb_info *
+ 
+ 	for (i = height; i--; ) {
+ 		for (j = 0; j < idx; j++) {
+-			tmp = info->pixmap.inbuf(dst+j);
++			tmp = buf->inbuf(dst+j);
+ 			tmp &= mask;
+ 			tmp |= *src >> shift_low;
+-			info->pixmap.outbuf(&tmp, dst+j, 1);
++			buf->outbuf(&tmp, dst+j, 1);
+ 			tmp = *src << shift_high;
+-			info->pixmap.outbuf(&tmp, dst+j+1, 1);
++			buf->outbuf(&tmp, dst+j+1, 1);
+ 			src++;
+ 		}
+-		tmp = info->pixmap.inbuf(dst+idx);
++		tmp = buf->inbuf(dst+idx);
+ 		tmp &= mask;
+ 		tmp |= *src >> shift_low;
+-		info->pixmap.outbuf(&tmp, dst+idx, 1);
++		buf->outbuf(&tmp, dst+idx, 1);
+ 		if (shift_high < mod) {
+ 			tmp = *src << shift_high;
+-			info->pixmap.outbuf(&tmp, dst+idx+1, 1);
++			buf->outbuf(&tmp, dst+idx+1, 1);
+ 		}	
+ 		src++;
+ 		dst += d_pitch;
+@@ -455,26 +453,29 @@ void move_buf_unaligned(struct fb_info *
+  * we need to lock this section since fb_cursor
+  * may use fb_imageblit()
+  */
+-u32 fb_get_buffer_offset(struct fb_info *info, u32 size)
++char* fb_get_buffer_offset(struct fb_info *info, struct fb_pixmap *buf, u32 size)
+ {
+-	u32 align = info->pixmap.buf_align - 1;
++	u32 align = buf->buf_align - 1;
+ 	u32 offset, count = 1000;
++	char *addr = buf->addr;
+ 
+-	spin_lock(&info->pixmap.lock);
+-	offset = info->pixmap.offset + align;
+-	offset &= ~align;
+-	if (offset + size > info->pixmap.size) {
+-		while (atomic_read(&info->pixmap.count) && count--);
+-		if (info->fbops->fb_sync && 
+-		    info->pixmap.flags & FB_PIXMAP_SYNC)
+-			info->fbops->fb_sync(info);
+-		offset = 0;
++	spin_lock(&buf->lock);
++	if (!(buf->flags & FB_PIXMAP_IO)) { 
++		offset = buf->offset + align;
++		offset &= ~align;
++		if (offset + size > buf->size) {
++			while (atomic_read(&buf->count) && count--);
++			if (info->fbops->fb_sync && (buf->flags & FB_PIXMAP_SYNC))
++				info->fbops->fb_sync(info);
++			offset = 0;
++		}
++		buf->offset = offset + size;
++		addr += offset;	
+ 	}
+-	info->pixmap.offset = offset + size;
+-	atomic_inc(&info->pixmap.count);	
++	atomic_inc(&buf->count);
+ 	smp_mb__after_atomic_inc();
+-	spin_unlock(&info->pixmap.lock);
+-	return offset;
++	spin_unlock(&buf->lock);
++	return addr;
+ }
+ 
+ #ifdef CONFIG_LOGO
+@@ -656,7 +657,7 @@ int fb_prepare_logo(struct fb_info *info
+ 	}
+ 
+ 	/* Return if no suitable logo was found */
+-	fb_logo.logo = fb_find_logo(info->var.bits_per_pixel);
++	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;
+@@ -726,8 +727,6 @@ int fb_show_logo(struct fb_info *info)
+ 	     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();
+ 	}
+ 	
+ 	if (palette != NULL)
+@@ -1238,6 +1237,22 @@ register_framebuffer(struct fb_info *fb_
+ 		fb_info->pixmap.inbuf = sys_inbuf;
+ 	spin_lock_init(&fb_info->pixmap.lock);
+ 
++	if (fb_info->sprite.addr == NULL) {
++		fb_info->sprite.addr = kmalloc(FBPIXMAPSIZE, GFP_KERNEL);
++		if (fb_info->sprite.addr) {
++			fb_info->sprite.size = FBPIXMAPSIZE;
++			fb_info->sprite.buf_align = 1;
++			fb_info->sprite.scan_align = 1;
++			fb_info->sprite.flags = FB_PIXMAP_IO;
++		}
++	}	
++	fb_info->sprite.offset = 0;
++	if (fb_info->sprite.outbuf == NULL)
++		fb_info->sprite.outbuf = sys_outbuf;
++	if (fb_info->sprite.inbuf == NULL)
++		fb_info->sprite.inbuf = sys_inbuf;
++	spin_lock_init(&fb_info->sprite.lock);
++
+ 	registered_fb[i] = fb_info;
+ 
+ 	devfs_mk_cdev(MKDEV(FB_MAJOR, i),
+--- linux-2.6.0-test1/drivers/video/g364fb.c	2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/video/g364fb.c	2003-07-19 17:04:55.000000000 -0700
+@@ -127,20 +127,55 @@ static struct fb_ops g364fb_ops = {
+ 
+ int g364fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
+ {
++
++	/* Turn the cursor off before we start changing it. */
++	*(unsigned int *) CTLA_REG |= CURS_TOGGLE;
++
++	if (cursor->set & FB_CUR_SETHOT)
++		info->cursor.hot = cursor->hot;
+ 	
+-	switch (cursor->enable) {
+-	case CM_ERASE:
+-		*(unsigned int *) CTLA_REG |= CURS_TOGGLE;
+-		break;
++	if (cursor->set & FB_CUR_SETPOS) {
++		unsigned int tmp;
++		
++		info->cursor.image.dx = cursor->image.dx;
++		info->cursor.image.dy = cursor->image.dy;
++
++		tmp = cursor->image.dy - info->var.yoffset;
++		tmp |= (cursor->image.dx - info->var.xoffset) << 12;	
++		
++		*(unsigned int *) CURS_POS_REG = tmp;
++	}
+ 
+-	case CM_MOVE:
+-	case CM_DRAW:
++	if (cursor->set & FB_CUR_SETSIZE) {
++		info->cursor.image.height = cursor->image.height;
++		info->cursor.image.width = cursor->image.width;
++	
++	 	/* set the whole cursor to transparent */
++		for (i = 0; i < 512; i++)
++			*(unsigned short *) (CURS_PAT_REG + i * 8) = 0;
++	}	
++
++	if (cursor->set & FB_CUR_SETCMAP) {
++		volatile unsigned int *curs_pal_ptr =
++	    			(volatile unsigned int *) CURS_PAL_REG;
++
++		/* setup cursor */
++		curs_pal_ptr[0] |= 0x00ffffff;
++		curs_pal_ptr[2] |= 0x00ffffff;
++		curs_pal_ptr[4] |= 0x00ffffff;
++	}	
++	
++	if (cursor->set & FB_CUR_SETSHAPE) {
++		/*
++	 	 * switch the last two lines to cursor palette 3
++	 	 * we assume here, that FONTSIZE_X is 8
++	 	 */
++		*(unsigned short *) (CURS_PAT_REG + 14 * 64) = 0xffff;
++		*(unsigned short *) (CURS_PAT_REG + 15 * 64) = 0xffff;
++	}	
++	
++	if (info->cursor.enable)
+ 		*(unsigned int *) CTLA_REG &= ~CURS_TOGGLE;
+-		*(unsigned int *) CURS_POS_REG =
+-		    ((x * fontwidth(p)) << 12) | ((y * fontheight(p)) -
+-						  info->var.yoffset);
+-		break;
+-	}
+ 	return 0;
+ }
+ 
+@@ -196,10 +231,6 @@ static int g364fb_setcolreg(u_int regno,
+  */
+ int __init g364fb_init(void)
+ {
+-	volatile unsigned int *pal_ptr =
+-	    (volatile unsigned int *) CLR_PAL_REG;
+-	volatile unsigned int *curs_pal_ptr =
+-	    (volatile unsigned int *) CURS_PAL_REG;
+ 	int mem, i, j;
+ 
+ 	/* TBD: G364 detection */
+@@ -212,23 +243,6 @@ int __init g364fb_init(void)
+ 	    (*((volatile unsigned int *) VDISPLAY_REG) & 0x00ffffff) / 2;
+ 	*(volatile unsigned int *) CTLA_REG |= ENABLE_VTG;
+ 
+-	/* setup cursor */
+-	curs_pal_ptr[0] |= 0x00ffffff;
+-	curs_pal_ptr[2] |= 0x00ffffff;
+-	curs_pal_ptr[4] |= 0x00ffffff;
+-
+-	/*
+-	 * first set the whole cursor to transparent
+-	 */
+-	for (i = 0; i < 512; i++)
+-		*(unsigned short *) (CURS_PAT_REG + i * 8) = 0;
+-
+-	/*
+-	 * switch the last two lines to cursor palette 3
+-	 * we assume here, that FONTSIZE_X is 8
+-	 */
+-	*(unsigned short *) (CURS_PAT_REG + 14 * 64) = 0xffff;
+-	*(unsigned short *) (CURS_PAT_REG + 15 * 64) = 0xffff;
+ 	fb_var.xres_virtual = fbvar.xres;
+ 	fb_fix.line_length = (xres / 8) * fb_var.bits_per_pixel;
+ 	fb_fix.smem_start = 0x40000000;	/* physical address */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/video/i2c.c	2003-07-19 17:04:55.000000000 -0700
+@@ -0,0 +1,333 @@
++/*
++ *   Generic i2c interface for the framebuffer layer 
++ *
++ *   (c) 2003 "Crazy" James Simmons <jsimmons@infradead.org>
++ * 	Based on the ALSA i2c interface 
++ *   		Gerd Knorr <kraxel@cs.tu-berlin.de>
++ *   		Jaroslav Kysela <perex@suse.cz>
++ *
++ *   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/init.h>
++#include <linux/slab.h>
++#include <linux/string.h>
++#include <linux/errno.h>
++#include <linux/fb.h>
++#include "i2c.h"
++
++MODULE_AUTHOR("James Simmons <jsimmons@infradead.org>");
++MODULE_DESCRIPTION("Generic i2c interface for the Framebuffer layer");
++MODULE_LICENSE("GPL");
++
++static int fb_i2c_bit_sendbytes(fb_i2c_device_t *device, unsigned char *bytes, int count);
++static int fb_i2c_bit_readbytes(fb_i2c_device_t *device, unsigned char *bytes, int count);
++static int fb_i2c_bit_probeaddr(fb_i2c_bus_t *bus, unsigned short addr);
++
++static fb_i2c_ops_t fb_i2c_bit_ops = {
++	.sendbytes = fb_i2c_bit_sendbytes,
++	.readbytes = fb_i2c_bit_readbytes,
++	.probeaddr = fb_i2c_bit_probeaddr,
++};
++
++static int fb_i2c_bus_free(fb_i2c_bus_t *bus)
++{
++	fb_i2c_bus_t *slave;
++	fb_i2c_device_t *device;
++
++	fb_assert(bus != NULL, return -EINVAL);
++	while (!list_empty(&bus->devices)) {
++		device = fb_i2c_device(bus->devices.next);
++		fb_i2c_device_free(device);
++	}
++	if (bus->master)
++		list_del(&bus->buses);
++	else {
++		while (!list_empty(&bus->buses)) {
++			slave = fb_i2c_slave_bus(bus->buses.next);
++			fb_device_free(bus->card, slave);
++		}
++	}
++	if (bus->private_free)
++		bus->private_free(bus);
++	fb_magic_kfree(bus);
++	return 0;
++}
++
++static int fb_i2c_bus_dev_free(fb_device_t *device)
++{
++	fb_i2c_bus_t *bus = fb_magic_cast(fb_i2c_bus_t, device->device_data, return -ENXIO);
++	return fb_i2c_bus_free(bus);
++}
++
++int fb_i2c_bus_create(fb_card_t *card, const char *name, fb_i2c_bus_t *master, fb_i2c_bus_t **ri2c)
++{
++	static fb_device_ops_t ops = {
++		.dev_free =	fb_i2c_bus_dev_free,
++	};
++	fb_i2c_bus_t *bus;
++	int err;
++	
++	*ri2c = NULL;
++	bus = (fb_i2c_bus_t *)fb_magic_kcalloc(fb_i2c_bus_t, 0, GFP_KERNEL);
++	if (bus == NULL)
++		return -ENOMEM;
++	spin_lock_init(&bus->lock);
++	INIT_LIST_HEAD(&bus->devices);
++	INIT_LIST_HEAD(&bus->buses);
++	bus->card = card;
++	bus->ops = &fb_i2c_bit_ops;
++	if (master) {
++		list_add_tail(&bus->buses, &master->buses);
++		bus->master = master;
++	}
++	strlcpy(bus->name, name, sizeof(bus->name));
++	if ((err = fb_device_new(card, SNDRV_DEV_LOWLEVEL, bus, &ops)) < 0) {
++		fb_i2c_bus_free(bus);
++		return err;
++	}
++	*ri2c = bus;
++	return 0;
++}
++
++int fb_i2c_device_create(fb_i2c_bus_t *bus, const char *name, unsigned char addr, fb_i2c_device_t **rdevice)
++{
++	fb_i2c_device_t *device;
++
++	*rdevice = NULL;
++	fb_assert(bus != NULL, return -EINVAL);
++	device = (fb_i2c_device_t *)fb_magic_kcalloc(fb_i2c_device_t, 0, GFP_KERNEL);
++	if (device == NULL)
++		return -ENOMEM;
++	device->addr = addr;
++	strlcpy(device->name, name, sizeof(device->name));
++	list_add_tail(&device->list, &bus->devices);
++	device->bus = bus;
++	*rdevice = device;
++	return 0;
++}
++
++int fb_i2c_device_free(fb_i2c_device_t *device)
++{
++	if (device->bus)
++		list_del(&device->list);
++	if (device->private_free)
++		device->private_free(device);
++	fb_magic_kfree(device);
++	return 0;
++}
++
++int fb_i2c_sendbytes(fb_i2c_device_t *device, unsigned char *bytes, int count)
++{
++	return device->bus->ops->sendbytes(device, bytes, count);
++}
++
++
++int fb_i2c_readbytes(fb_i2c_device_t *device, unsigned char *bytes, int count)
++{
++	return device->bus->ops->readbytes(device, bytes, count);
++}
++
++int fb_i2c_probeaddr(fb_i2c_bus_t *bus, unsigned short addr)
++{
++	return bus->ops->probeaddr(bus, addr);
++}
++
++/*
++ *  bit-operations
++ */
++
++static inline void fb_i2c_bit_hw_start(fb_i2c_bus_t *bus)
++{
++	if (bus->hw_ops.bit->start)
++		bus->hw_ops.bit->start(bus);
++}
++
++static inline void fb_i2c_bit_hw_stop(fb_i2c_bus_t *bus)
++{
++	if (bus->hw_ops.bit->stop)
++		bus->hw_ops.bit->stop(bus);
++}
++
++static void fb_i2c_bit_direction(fb_i2c_bus_t *bus, int clock, int data)
++{
++	if (bus->hw_ops.bit->direction)
++		bus->hw_ops.bit->direction(bus, clock, data);
++}
++
++static void fb_i2c_bit_set(fb_i2c_bus_t *bus, int clock, int data)
++{
++	bus->hw_ops.bit->setlines(bus, clock, data);
++}
++
++#if 0
++static int fb_i2c_bit_clock(fb_i2c_bus_t *bus)
++{
++	if (bus->hw_ops.bit->getclock)
++		return bus->hw_ops.bit->getclock(bus);
++	return -ENXIO;
++}
++#endif
++
++static int fb_i2c_bit_data(fb_i2c_bus_t *bus, int ack)
++{
++	return bus->hw_ops.bit->getdata(bus, ack);
++}
++
++static void fb_i2c_bit_start(fb_i2c_bus_t *bus)
++{
++	fb_i2c_bit_hw_start(bus);
++	fb_i2c_bit_direction(bus, 1, 1);	/* SCL - wr, SDA - wr */
++	fb_i2c_bit_set(bus, 1, 1);
++	fb_i2c_bit_set(bus, 1, 0);
++	fb_i2c_bit_set(bus, 0, 0);
++}
++
++static void fb_i2c_bit_stop(fb_i2c_bus_t *bus)
++{
++	fb_i2c_bit_set(bus, 0, 0);
++	fb_i2c_bit_set(bus, 1, 0);
++	fb_i2c_bit_set(bus, 1, 1);
++	fb_i2c_bit_hw_stop(bus);
++}
++
++static void fb_i2c_bit_send(fb_i2c_bus_t *bus, int data)
++{
++	fb_i2c_bit_set(bus, 0, data);
++	fb_i2c_bit_set(bus, 1, data);
++	fb_i2c_bit_set(bus, 0, data);
++}
++
++static int fb_i2c_bit_ack(fb_i2c_bus_t *bus)
++{
++	int ack;
++
++	fb_i2c_bit_set(bus, 0, 1);
++	fb_i2c_bit_set(bus, 1, 1);
++	fb_i2c_bit_direction(bus, 1, 0);	/* SCL - wr, SDA - rd */
++	ack = fb_i2c_bit_data(bus, 1);
++	fb_i2c_bit_direction(bus, 1, 1);	/* SCL - wr, SDA - wr */
++	fb_i2c_bit_set(bus, 0, 1);
++	return ack ? -EIO : 0;
++}
++
++static int fb_i2c_bit_sendbyte(fb_i2c_bus_t *bus, unsigned char data)
++{
++	int i, err;
++
++	for (i = 7; i >= 0; i--)
++		fb_i2c_bit_send(bus, !!(data & (1 << i)));
++	if ((err = fb_i2c_bit_ack(bus)) < 0)
++		return err;
++	return 0;
++}
++
++static int fb_i2c_bit_readbyte(fb_i2c_bus_t *bus, int last)
++{
++	int i;
++	unsigned char data = 0;
++
++	fb_i2c_bit_set(bus, 0, 1);
++	fb_i2c_bit_direction(bus, 1, 0);	/* SCL - wr, SDA - rd */
++	for (i = 7; i >= 0; i--) {
++		fb_i2c_bit_set(bus, 1, 1);
++		if (fb_i2c_bit_data(bus, 0))
++			data |= (1 << i);
++		fb_i2c_bit_set(bus, 0, 1);
++	}
++	fb_i2c_bit_direction(bus, 1, 1);	/* SCL - wr, SDA - wr */
++	fb_i2c_bit_send(bus, !!last);
++	return data;
++}
++
++static int fb_i2c_bit_sendbytes(fb_i2c_device_t *device, unsigned char *bytes, int count)
++{
++	fb_i2c_bus_t *bus = device->bus;
++	int err, res = 0;
++
++	if (device->flags & FB_I2C_DEVICE_ADDRTEN)
++		return -EIO;		/* not yet implemented */
++	fb_i2c_bit_start(bus);
++	if ((err = fb_i2c_bit_sendbyte(bus, device->addr << 1)) < 0) {
++		fb_i2c_bit_hw_stop(bus);
++		return err;
++	}
++	while (count-- > 0) {
++		if ((err = fb_i2c_bit_sendbyte(bus, *bytes++)) < 0) {
++			fb_i2c_bit_hw_stop(bus);
++			return err;
++		}
++		res++;
++	}
++	fb_i2c_bit_stop(bus);
++	return res;
++}
++
++static int fb_i2c_bit_readbytes(fb_i2c_device_t *device, unsigned char *bytes, int count)
++{
++	fb_i2c_bus_t *bus = device->bus;
++	int err, res = 0;
++
++	if (device->flags & FB_I2C_DEVICE_ADDRTEN)
++		return -EIO;		/* not yet implemented */
++	fb_i2c_bit_start(bus);
++	if ((err = fb_i2c_bit_sendbyte(bus, (device->addr << 1) | 1)) < 0) {
++		fb_i2c_bit_hw_stop(bus);
++		return err;
++	}
++	while (count-- > 0) {
++		if ((err = fb_i2c_bit_readbyte(bus, count == 0)) < 0) {
++			fb_i2c_bit_hw_stop(bus);
++			return err;
++		}
++		*bytes++ = (unsigned char)err;
++		res++;
++	}
++	fb_i2c_bit_stop(bus);
++	return res;
++}
++
++static int fb_i2c_bit_probeaddr(fb_i2c_bus_t *bus, unsigned short addr)
++{
++	int err;
++
++	if (addr & 0x8000)	/* 10-bit address */
++		return -EIO;	/* not yet implemented */
++	if (addr & 0x7f80)	/* invalid address */
++		return -EINVAL;
++	fb_i2c_bit_start(bus);
++	err = fb_i2c_bit_sendbyte(bus, addr << 1);
++	fb_i2c_bit_stop(bus);
++	return err;
++}
++
++EXPORT_SYMBOL(fb_i2c_bus_create);
++EXPORT_SYMBOL(fb_i2c_device_create);
++EXPORT_SYMBOL(fb_i2c_device_free);
++EXPORT_SYMBOL(fb_i2c_sendbytes);
++EXPORT_SYMBOL(fb_i2c_readbytes);
++EXPORT_SYMBOL(fb_i2c_probeaddr);
++
++static int __init alsa_i2c_init(void)
++{
++	return 0;
++}
++
++static void __exit alsa_i2c_exit(void)
++{
++}
++
++module_init(alsa_i2c_init)
++module_exit(alsa_i2c_exit)
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/video/i2c.h	2003-07-19 17:04:55.000000000 -0700
+@@ -0,0 +1,102 @@
++#ifndef __FB_I2C_H
++#define __FB_I2C_H
++
++/*
++ *
++ *
++ *   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
++ *
++ *
++ */
++
++typedef struct _fb_i2c_device fb_i2c_device_t;
++typedef struct _fb_i2c_bus fb_i2c_bus_t;
++
++#define FB_I2C_DEVICE_ADDRTEN	(1<<0)	/* 10-bit I2C address */
++
++struct _fb_i2c_device {
++	struct list_head list;
++	fb_i2c_bus_t *bus;	/* I2C bus */
++	char name[32];		/* some useful device name */
++	unsigned short flags;	/* device flags */
++	unsigned short addr;	/* device address (might be 10-bit) */
++	unsigned long private_value;
++	void *private_data;
++	void (*private_free)(fb_i2c_device_t *device);
++};
++
++#define fb_i2c_device(n) list_entry(n, fb_i2c_device_t, list)
++
++typedef struct _fb_i2c_bit_ops {
++	void (*start)(fb_i2c_bus_t *bus);	/* transfer start */
++	void (*stop)(fb_i2c_bus_t *bus);	/* transfer stop */
++	void (*direction)(fb_i2c_bus_t *bus, int clock, int data);  /* set line direction (0 = write, 1 = read) */
++	void (*setlines)(fb_i2c_bus_t *bus, int clock, int data);
++	int (*getclock)(fb_i2c_bus_t *bus);
++	int (*getdata)(fb_i2c_bus_t *bus, int ack);
++} fb_i2c_bit_ops_t;
++
++typedef struct _fb_i2c_ops {
++	int (*sendbytes)(fb_i2c_device_t *device, unsigned char *bytes, int count);
++	int (*readbytes)(fb_i2c_device_t *device, unsigned char *bytes, int count);
++	int (*probeaddr)(fb_i2c_bus_t *bus, unsigned short addr);
++} fb_i2c_ops_t;
++
++struct _fb_i2c_bus {
++	fb_card_t *card;	/* card which I2C belongs to */
++	char name[32];		/* some useful label */
++
++	spinlock_t lock;
++
++	fb_i2c_bus_t *master;	/* master bus when SCK/SCL is shared */
++	struct list_head buses;	/* master: slave buses sharing SCK/SCL, slave: link list */
++
++	struct list_head devices; /* attached devices to this bus */
++
++	union {
++		fb_i2c_bit_ops_t *bit;
++		void *ops;
++	} hw_ops;		/* lowlevel operations */
++	fb_i2c_ops_t *ops;	/* midlevel operations */
++
++	unsigned long private_value;
++	void *private_data;
++	void (*private_free)(fb_i2c_bus_t *bus);
++};
++
++#define fb_i2c_slave_bus(n) list_entry(n, fb_i2c_bus_t, buses)
++
++int fb_i2c_bus_create(fb_card_t *card, const char *name, fb_i2c_bus_t *master, fb_i2c_bus_t **ri2c);
++int fb_i2c_device_create(fb_i2c_bus_t *bus, const char *name, unsigned char addr, fb_i2c_device_t **rdevice);
++int fb_i2c_device_free(fb_i2c_device_t *device);
++
++static inline void fb_i2c_lock(fb_i2c_bus_t *bus) {
++	if (bus->master)
++		spin_lock(&bus->master->lock);
++	else
++		spin_lock(&bus->lock);
++}
++static inline void fb_i2c_unlock(fb_i2c_bus_t *bus) {
++	if (bus->master)
++		spin_unlock(&bus->master->lock);
++	else
++		spin_unlock(&bus->lock);
++}
++
++int fb_i2c_sendbytes(fb_i2c_device_t *device, unsigned char *bytes, int count);
++int fb_i2c_readbytes(fb_i2c_device_t *device, unsigned char *bytes, int count);
++int fb_i2c_probeaddr(fb_i2c_bus_t *bus, unsigned short addr);
++
++#endif /* __FB_I2C_H */
+--- linux-2.6.0-test1/drivers/video/Kconfig	2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/video/Kconfig	2003-07-19 17:04:55.000000000 -0700
+@@ -423,35 +423,15 @@ config FB_PVR2_DEBUG
+ 	  messages. Most people will want to say N here. If unsure, you will
+ 	  also want to say N.
+ 
+-config FB_E1355
++config FB_EPSON1355
+ 	bool "Epson 1355 framebuffer support"
+-	depends on FB && SUPERH
++	depends on FB && (SUPERH || ARCH_CEIVA)
+ 	help
+ 	  Build in support for the SED1355 Epson Research Embedded RAMDAC
+ 	  LCD/CRT Controller (since redesignated as the S1D13505) as a
+ 	  framebuffer.  Product specs at
+ 	  <http://www.erd.epson.com/vdc/html/products.htm>.
+ 
+-config E1355_REG_BASE
+-	hex "Register Base Address"
+-	depends on FB_E1355
+-	default "a8000000"
+-	help
+-	  Epson SED1355/S1D13505 LCD/CRT controller register base address.
+-	  See the manuals at
+-	  <http://www.erd.epson.com/vdc/html/contents/S1D13505.htm> for
+-	  discussion.
+-
+-config E1355_FB_BASE
+-	hex "Framebuffer Base Address"
+-	depends on FB_E1355
+-	default "a8200000"
+-	help
+-	  Epson SED1355/S1D13505 LCD/CRT controller memory base address.  See
+-	  the manuals at
+-	  <http://www.erd.epson.com/vdc/html/contents/S1D13505.htm> for
+-	  discussion.
+-
+ config FB_RIVA
+ 	tristate "nVidia Riva support"
+ 	depends on FB && PCI
+@@ -725,23 +705,43 @@ config FB_SIS
+ 	tristate "SIS acceleration"
+ 	depends on FB && PCI
+ 	help
+-	  This is the frame buffer device driver for the SiS 630 and 640 Super
+-	  Socket 7 UMA cards.  Specs available at <http://www.sis.com.tw/>.
++	  This is the frame buffer device driver for SiS VGA chipsets. It
++	  supports the SiS 300, 540, 630, 730, 315, 550, 650, M650, 651,
++	  740 and possibly (because untested) the Xabre (SiS330).
++
++	  Specs available at <http://www.sis.com.tw/>.
++
++	  See <http://www.winischhofer.net/linuxsisvga.shtml> for
++	  documentation and updates.
++
++	  The driver is also available as a module ( = code which can be
++	  inserted and removed from the running kernel whenever you want). The
++	  module will be called sisfb. If you want to compile it as a
++	  module, say M here and read Documentation/modules.txt.
+ 
+ config FB_SIS_300
+-	bool "SIS 630/540/730 support"
++	bool "SIS 300/630/540/730 support"
+ 	depends on FB_SIS
+ 	help
+-	  This is the frame buffer device driver for the SiS 630 and related
+-	  Super Socket 7 UMA cards.  Specs available at
+-	  <http://www.sis.com.tw/>.
++	  This is the frame buffer device driver for the SiS 300, 540, 630
++	  and 730 VGA controllers.
++
++	  Specs available at <http://www.sis.com.tw/>.
++
++	  See <http://www.winischhofer.net/linuxsisvga.shtml> for
++	  documentation and updates.
+ 
+ config FB_SIS_315
+-	bool "SIS 315H/315 support"
++	bool "SIS 315/550/65x/740/330 support"
+ 	depends on FB_SIS
+ 	help
+-	  This is the frame buffer device driver for the SiS 315 graphics
+-	  card.  Specs available at <http://www.sis.com.tw/>.
++	  This is the frame buffer device driver for the SiS 315, 550, 65x
++	  (650, 651, M650), 740 and Xabre (330) VGA controllers.
++
++	  Specs available at <http://www.sis.com.tw/>.
++
++	  See <http://www.winischhofer.net/linuxsisvga.shtml> for
++	  documentation and updates.
+ 
+ config FB_NEOMAGIC
+ 	tristate "NeoMagic display support"
+--- linux-2.6.0-test1/drivers/video/logo/logo.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/video/logo/logo.c	2003-07-19 17:04:55.000000000 -0700
+@@ -32,8 +32,7 @@ extern const struct linux_logo logo_supe
+ extern const struct linux_logo logo_superh_vga16;
+ extern const struct linux_logo logo_superh_clut224;
+ 
+-
+-const struct linux_logo *fb_find_logo(int depth)
++const struct linux_logo *find_logo(int depth)
+ {
+ 	const struct linux_logo *logo = 0;
+ 
+@@ -66,7 +65,7 @@ const struct linux_logo *fb_find_logo(in
+ #endif
+ #ifdef CONFIG_LOGO_DEC_CLUT224
+ 		/* DEC Linux logo on MIPS/MIPS64 */
+-		if (mips_machgroup == MACH_GROUP_SGI)
++		if (mips_machgroup == MACH_GROUP_DEC)
+ 			logo = &logo_dec_clut224;
+ #endif
+ #ifdef CONFIG_LOGO_MAC_CLUT224
+--- linux-2.6.0-test1/drivers/video/macfb.c	2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/video/macfb.c	2003-07-19 17:04:55.000000000 -0700
+@@ -233,11 +233,11 @@ static int dafb_setpalette (unsigned int
+ 		
+ 		/* Loop until we get to the register we want */
+ 		for (i = 0; i < regno; i++) {
+-			nubus_writeb(info->cmap[i].red >> 8, &dafb_cmap_regs->lut);
++			nubus_writeb(info->cmap.red[i] >> 8, &dafb_cmap_regs->lut);
+ 			nop();
+-			nubus_writeb(info->cmap[i].green >> 8, &dafb_cmap_regs->lut);
++			nubus_writeb(info->cmap.green[i] >> 8, &dafb_cmap_regs->lut);
+ 			nop();
+-			nubus_writeb(info->cmap[i].blue >> 8, &dafb_cmap_regs->lut);
++			nubus_writeb(info->cmap.blue[i] >> 8, &dafb_cmap_regs->lut);
+ 			nop();
+ 		}
+ 	}
+@@ -528,10 +528,10 @@ static int macfb_setcolreg(unsigned regn
+ 	 *  != 0 for invalid regno.
+ 	 */
+ 	
+-	if (regno >= info->cmap.len)
++	if (regno >= fb_info->cmap.len)
+ 		return 1;
+ 
+-	switch (info->var.bits_per_pixel) {
++	switch (fb_info->var.bits_per_pixel) {
+ 	case 1:
+ 		/* We shouldn't get here */
+ 		break;
+@@ -539,21 +539,21 @@ static int macfb_setcolreg(unsigned regn
+ 	case 4:
+ 	case 8:
+ 		if (macfb_setpalette)
+-			macfb_setpalette(regno, red, green, blue, info);
++			macfb_setpalette(regno, red, green, blue, fb_info);
+ 		else
+ 			return 1;
+ 		break;
+ 	case 16:
+-		if (info->var.red.offset == 10) {
++		if (fb_info->var.red.offset == 10) {
+ 			/* 1:5:5:5 */
+-			((u32*) (info->pseudo_palette))[regno] =
++			((u32*) (fb_info->pseudo_palette))[regno] =
+ 					((red   & 0xf800) >>  1) |
+ 					((green & 0xf800) >>  6) |
+ 					((blue  & 0xf800) >> 11) |
+ 					((transp != 0) << 15);
+ 		} else {
+ 			/* 0:5:6:5 */
+-			((u32*) (info->pseudo_palette))[regno] =
++			((u32*) (fb_info->pseudo_palette))[regno] =
+ 					((red   & 0xf800)      ) |
+ 					((green & 0xfc00) >>  5) |
+ 					((blue  & 0xf800) >> 11);
+@@ -565,19 +565,19 @@ static int macfb_setcolreg(unsigned regn
+ 		red   >>= 8;
+ 		green >>= 8;
+ 		blue  >>= 8;
+-		((u32 *)(info->pseudo_palette))[regno] =
+-			(red   << info->var.red.offset)   |
+-			(green << info->var.green.offset) |
+-			(blue  << info->var.blue.offset);
++		((u32 *)(fb_info->pseudo_palette))[regno] =
++			(red   << fb_info->var.red.offset)   |
++			(green << fb_info->var.green.offset) |
++			(blue  << fb_info->var.blue.offset);
+ 		break;
+ 	case 32:
+ 		red   >>= 8;
+ 		green >>= 8;
+ 		blue  >>= 8;
+-		((u32 *)(info->pseudo_palette))[regno] =
+-			(red   << info->var.red.offset)   |
+-			(green << info->var.green.offset) |
+-			(blue  << info->var.blue.offset);
++		((u32 *)(fb_info->pseudo_palette))[regno] =
++			(red   << fb_info->var.red.offset)   |
++			(green << fb_info->var.green.offset) |
++			(blue  << fb_info->var.blue.offset);
+ 		break;
+     }
+     return 0;
+--- linux-2.6.0-test1/drivers/video/Makefile	2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/video/Makefile	2003-07-19 17:03:50.000000000 -0700
+@@ -69,7 +69,7 @@ obj-$(CONFIG_FB_SA1100)           += sa1
+ obj-$(CONFIG_FB_VIRTUAL)          += vfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o 
+ obj-$(CONFIG_FB_HIT)              += hitfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
+ obj-$(CONFIG_FB_E1355)            += epson1355fb.o
+-obj-$(CONFIG_FB_PVR2)             += pvr2fb.o
++obj-$(CONFIG_FB_PVR2)             += pvr2fb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
+ obj-$(CONFIG_FB_VOODOO1)          += sstfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
+ 
+ obj-$(CONFIG_FB_FFB)               += ffb.o sbuslib.o cfbimgblt.o cfbcopyarea.o
+--- linux-2.6.0-test1/drivers/video/neofb.c	2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/video/neofb.c	2003-07-19 17:04:55.000000000 -0700
+@@ -81,9 +81,10 @@ extern int tosh_smm(SMMRegisters *regs);
+ #include <asm/mtrr.h>
+ #endif
+ 
++#include <video/vga.h>
+ #include <video/neomagic.h>
+ 
+-#define NEOFB_VERSION "0.4.1"
++#define NEOFB_VERSION "0.4.2"
+ 
+ /* --------------------------------------------------------------------- */
+ 
+@@ -370,37 +371,55 @@ static int vgaHWInit(const struct fb_var
+ static void vgaHWLock(void)
+ {
+ 	/* Protect CRTC[0-7] */
+-	VGAwCR(0x11, VGArCR(0x11) | 0x80);
++	vga_wcrt(NULL, 0x11, vga_rcrt(NULL, 0x11) | 0x80);
+ }
+ 
+ static void vgaHWUnlock(void)
+ {
+ 	/* Unprotect CRTC[0-7] */
+-	VGAwCR(0x11, VGArCR(0x11) & ~0x80);
++	vga_wcrt(NULL, 0x11, vga_rcrt(NULL, 0x11) & ~0x80);
+ }
+ 
+ static void neoLock(void)
+ {
+-	VGAwGR(0x09, 0x00);
++	vga_wgfx(NULL, 0x09, 0x00);
+ 	vgaHWLock();
+ }
+ 
+ static void neoUnlock(void)
+ {
+ 	vgaHWUnlock();
+-	VGAwGR(0x09, 0x26);
++	vga_wgfx(NULL, 0x09, 0x26);
+ }
+ 
+ /*
+- * vgaHWSeqReset
+- *      perform a sequencer reset.
++ * VGA Palette management
+  */
+-void vgaHWSeqReset(int start)
++static int paletteEnabled = 0;
++
++inline void VGAenablePalette(void)
++{
++	vga_r(NULL, VGA_IS1_RC);
++	vga_w(NULL, VGA_ATT_W, 0x00);
++	paletteEnabled = 1;
++}
++
++inline void VGAdisablePalette(void)
+ {
+-	if (start)
+-		VGAwSEQ(0x00, 0x01);	/* Synchronous Reset */
++	vga_r(NULL, VGA_IS1_RC);
++	vga_w(NULL, VGA_ATT_W, 0x20);
++	paletteEnabled = 0;
++}
++
++inline void VGAwATTR(u8 index, u8 value)
++{
++	if (paletteEnabled)
++		index &= ~0x20;
+ 	else
+-		VGAwSEQ(0x00, 0x03);	/* End Reset */
++		index |= 0x20;
++
++	vga_r(NULL, VGA_IS1_RC);
++	vga_wattr(NULL, index, value);
+ }
+ 
+ void vgaHWProtect(int on)
+@@ -411,21 +430,18 @@ void vgaHWProtect(int on)
+ 		/*
+ 		 * Turn off screen and disable sequencer.
+ 		 */
+-		tmp = VGArSEQ(0x01);
+-
+-		vgaHWSeqReset(1);	/* start synchronous reset */
+-		VGAwSEQ(0x01, tmp | 0x20);	/* disable the display */
++		tmp = vga_rseq(NULL, 0x01);
++		vga_wseq(NULL, 0x00, 0x01);		/* Synchronous Reset */
++		vga_wseq(NULL, 0x01, tmp | 0x20);	/* disable the display */
+ 
+ 		VGAenablePalette();
+ 	} else {
+ 		/*
+ 		 * Reenable sequencer, then turn on screen.
+ 		 */
+-
+-		tmp = VGArSEQ(0x01);
+-
+-		VGAwSEQ(0x01, tmp & ~0x20);	/* reenable display */
+-		vgaHWSeqReset(0);	/* clear synchronousreset */
++		tmp = vga_rseq(NULL, 0x01);
++		vga_wseq(NULL, 0x01, tmp & ~0x20);	/* reenable display */
++		vga_wseq(NULL, 0x00, 0x03);		/* clear synchronousreset */
+ 
+ 		VGAdisablePalette();
+ 	}
+@@ -436,19 +452,19 @@ static void vgaHWRestore(const struct fb
+ {
+ 	int i;
+ 
+-	VGAwMISC(par->MiscOutReg);
++	vga_w(NULL, VGA_MIS_W, par->MiscOutReg);
+ 
+ 	for (i = 1; i < 5; i++)
+-		VGAwSEQ(i, par->Sequencer[i]);
++		vga_wseq(NULL, i, par->Sequencer[i]);
+ 
+ 	/* Ensure CRTC registers 0-7 are unlocked by clearing bit 7 or CRTC[17] */
+-	VGAwCR(17, par->CRTC[17] & ~0x80);
++	vga_wcrt(NULL, 17, par->CRTC[17] & ~0x80);
+ 
+ 	for (i = 0; i < 25; i++)
+-		VGAwCR(i, par->CRTC[i]);
++		vga_wcrt(NULL, i, par->CRTC[i]);
+ 
+ 	for (i = 0; i < 9; i++)
+-		VGAwGR(i, par->Graphics[i]);
++		vga_wgfx(NULL, i, par->Graphics[i]);
+ 
+ 	VGAenablePalette();
+ 
+@@ -981,13 +997,13 @@ static int neofb_set_par(struct fb_info 
+ 	}
+ 
+ 	/* alread unlocked above */
+-	/* BOGUS  VGAwGR (0x09, 0x26); */
++	/* BOGUS  vga_wgfx(NULL, 0x09, 0x26); */
+ 
+ 	/* don't know what this is, but it's 0 from bootup anyway */
+-	VGAwGR(0x15, 0x00);
++	vga_wgfx(NULL, 0x15, 0x00);
+ 
+ 	/* was set to 0x01 by my bios in text and vesa modes */
+-	VGAwGR(0x0A, par->GeneralLockReg);
++	vga_wgfx(NULL, 0x0A, par->GeneralLockReg);
+ 
+ 	/*
+ 	 * The color mode needs to be set before calling vgaHWRestore
+@@ -996,7 +1012,7 @@ static int neofb_set_par(struct fb_info 
+ 	 * NOTE: Make sure we don't change bits make sure we don't change
+ 	 * any reserved bits.
+ 	 */
+-	temp = VGArGR(0x90);
++	temp = vga_rgfx(NULL, 0x90);
+ 	switch (info->fix.accel) {
+ 	case FB_ACCEL_NEOMAGIC_NM2070:
+ 		temp &= 0xF0;	/* Save bits 7:4 */
+@@ -1015,7 +1031,7 @@ static int neofb_set_par(struct fb_info 
+ 		break;
+ 	}
+ 
+-	VGAwGR(0x90, temp);
++	vga_wgfx(NULL, 0x90, temp);
+ 
+ 	/*
+ 	 * In some rare cases a lockup might occur if we don't delay
+@@ -1027,9 +1043,9 @@ static int neofb_set_par(struct fb_info 
+ 	 * Disable horizontal and vertical graphics and text expansions so
+ 	 * that vgaHWRestore works properly.
+ 	 */
+-	temp = VGArGR(0x25);
++	temp = vga_rgfx(NULL, 0x25);
+ 	temp &= 0x39;
+-	VGAwGR(0x25, temp);
++	vga_wgfx(NULL, 0x25, temp);
+ 
+ 	/*
+ 	 * Sleep for 200ms to make sure that the two operations above have
+@@ -1041,19 +1057,18 @@ static int neofb_set_par(struct fb_info 
+ 	 * This function handles restoring the generic VGA registers.  */
+ 	vgaHWRestore(info, par);
+ 
+-
+-	VGAwGR(0x0E, par->ExtCRTDispAddr);
+-	VGAwGR(0x0F, par->ExtCRTOffset);
+-	temp = VGArGR(0x10);
++	vga_wgfx(NULL, 0x0E, par->ExtCRTDispAddr);
++	vga_wgfx(NULL, 0x0F, par->ExtCRTOffset);
++	temp = vga_rgfx(NULL, 0x10);
+ 	temp &= 0x0F;		/* Save bits 3:0 */
+ 	temp |= (par->SysIfaceCntl1 & ~0x0F);	/* VESA Bios sets bit 1! */
+-	VGAwGR(0x10, temp);
++	vga_wgfx(NULL, 0x10, temp);
+ 
+-	VGAwGR(0x11, par->SysIfaceCntl2);
+-	VGAwGR(0x15, 0 /*par->SingleAddrPage */ );
+-	VGAwGR(0x16, 0 /*par->DualAddrPage */ );
++	vga_wgfx(NULL, 0x11, par->SysIfaceCntl2);
++	vga_wgfx(NULL, 0x15, 0 /*par->SingleAddrPage */ );
++	vga_wgfx(NULL, 0x16, 0 /*par->DualAddrPage */ );
+ 
+-	temp = VGArGR(0x20);
++	temp = vga_rgfx(NULL, 0x20);
+ 	switch (info->fix.accel) {
+ 	case FB_ACCEL_NEOMAGIC_NM2070:
+ 		temp &= 0xFC;	/* Save bits 7:2 */
+@@ -1074,73 +1089,72 @@ static int neofb_set_par(struct fb_info 
+ 		temp |= (par->PanelDispCntlReg1 & ~0x98);
+ 		break;
+ 	}
+-	VGAwGR(0x20, temp);
++	vga_wgfx(NULL, 0x20, temp);
+ 
+-	temp = VGArGR(0x25);
++	temp = vga_rgfx(NULL, 0x25);
+ 	temp &= 0x38;		/* Save bits 5:3 */
+ 	temp |= (par->PanelDispCntlReg2 & ~0x38);
+-	VGAwGR(0x25, temp);
++	vga_wgfx(NULL, 0x25, temp);
+ 
+ 	if (info->fix.accel != FB_ACCEL_NEOMAGIC_NM2070) {
+-		temp = VGArGR(0x30);
++		temp = vga_rgfx(NULL, 0x30);
+ 		temp &= 0xEF;	/* Save bits 7:5 and bits 3:0 */
+ 		temp |= (par->PanelDispCntlReg3 & ~0xEF);
+-		VGAwGR(0x30, temp);
++		vga_wgfx(NULL, 0x30, temp);
+ 	}
+ 
+-	VGAwGR(0x28, par->PanelVertCenterReg1);
+-	VGAwGR(0x29, par->PanelVertCenterReg2);
+-	VGAwGR(0x2a, par->PanelVertCenterReg3);
++	vga_wgfx(NULL, 0x28, par->PanelVertCenterReg1);
++	vga_wgfx(NULL, 0x29, par->PanelVertCenterReg2);
++	vga_wgfx(NULL, 0x2a, par->PanelVertCenterReg3);
+ 
+ 	if (info->fix.accel != FB_ACCEL_NEOMAGIC_NM2070) {
+-		VGAwGR(0x32, par->PanelVertCenterReg4);
+-		VGAwGR(0x33, par->PanelHorizCenterReg1);
+-		VGAwGR(0x34, par->PanelHorizCenterReg2);
+-		VGAwGR(0x35, par->PanelHorizCenterReg3);
++		vga_wgfx(NULL, 0x32, par->PanelVertCenterReg4);
++		vga_wgfx(NULL, 0x33, par->PanelHorizCenterReg1);
++		vga_wgfx(NULL, 0x34, par->PanelHorizCenterReg2);
++		vga_wgfx(NULL, 0x35, par->PanelHorizCenterReg3);
+ 	}
+ 
+ 	if (info->fix.accel == FB_ACCEL_NEOMAGIC_NM2160)
+-		VGAwGR(0x36, par->PanelHorizCenterReg4);
++		vga_wgfx(NULL, 0x36, par->PanelHorizCenterReg4);
+ 
+ 	if (info->fix.accel == FB_ACCEL_NEOMAGIC_NM2200 ||
+ 	    info->fix.accel == FB_ACCEL_NEOMAGIC_NM2230 ||
+ 	    info->fix.accel == FB_ACCEL_NEOMAGIC_NM2360 ||
+ 	    info->fix.accel == FB_ACCEL_NEOMAGIC_NM2380) {
+-		VGAwGR(0x36, par->PanelHorizCenterReg4);
+-		VGAwGR(0x37, par->PanelVertCenterReg5);
+-		VGAwGR(0x38, par->PanelHorizCenterReg5);
++		vga_wgfx(NULL, 0x36, par->PanelHorizCenterReg4);
++		vga_wgfx(NULL, 0x37, par->PanelVertCenterReg5);
++		vga_wgfx(NULL, 0x38, par->PanelHorizCenterReg5);
+ 
+ 		clock_hi = 1;
+ 	}
+ 
+ 	/* Program VCLK3 if needed. */
+-	if (par->ProgramVCLK && ((VGArGR(0x9B) != par->VCLK3NumeratorLow)
+-				 || (VGArGR(0x9F) != par->VCLK3Denominator)
+-				 || (clock_hi && ((VGArGR(0x8F) & ~0x0f)
+-						  != (par->
+-						      VCLK3NumeratorHigh &
++	if (par->ProgramVCLK && ((vga_rgfx(NULL, 0x9B) != par->VCLK3NumeratorLow)
++				 || (vga_rgfx(NULL, 0x9F) != par->VCLK3Denominator)
++				 || (clock_hi && ((vga_rgfx(NULL, 0x8F) & ~0x0f)
++						  != (par->VCLK3NumeratorHigh &
+ 						      ~0x0F))))) {
+-		VGAwGR(0x9B, par->VCLK3NumeratorLow);
++		vga_wgfx(NULL, 0x9B, par->VCLK3NumeratorLow);
+ 		if (clock_hi) {
+-			temp = VGArGR(0x8F);
++			temp = vga_rgfx(NULL, 0x8F);
+ 			temp &= 0x0F;	/* Save bits 3:0 */
+ 			temp |= (par->VCLK3NumeratorHigh & ~0x0F);
+-			VGAwGR(0x8F, temp);
++			vga_wgfx(NULL, 0x8F, temp);
+ 		}
+-		VGAwGR(0x9F, par->VCLK3Denominator);
++		vga_wgfx(NULL, 0x9F, par->VCLK3Denominator);
+ 	}
+ 
+ 	if (par->biosMode)
+-		VGAwCR(0x23, par->biosMode);
++		vga_wcrt(NULL, 0x23, par->biosMode);
+ 
+-	VGAwGR(0x93, 0xc0);	/* Gives 5x faster framebuffer writes !!! */
++	vga_wgfx(NULL, 0x93, 0xc0);	/* Gives 5x faster framebuffer writes !!! */
+ 
+ 	/* Program vertical extension register */
+ 	if (info->fix.accel == FB_ACCEL_NEOMAGIC_NM2200 ||
+ 	    info->fix.accel == FB_ACCEL_NEOMAGIC_NM2230 ||
+ 	    info->fix.accel == FB_ACCEL_NEOMAGIC_NM2360 ||
+ 	    info->fix.accel == FB_ACCEL_NEOMAGIC_NM2380) {
+-		VGAwCR(0x70, par->VerticalExt);
++		vga_wcrt(NULL, 0x70, par->VerticalExt);
+ 	}
+ 
+ 	vgaHWProtect(0);	/* Turn on screen */
+@@ -1180,16 +1194,16 @@ static void neofb_update_start(struct fb
+ 	/*
+ 	 * These are the generic starting address registers.
+ 	 */
+-	VGAwCR(0x0C, (Base & 0x00FF00) >> 8);
+-	VGAwCR(0x0D, (Base & 0x00FF));
++	vga_wcrt(NULL, 0x0C, (Base & 0x00FF00) >> 8);
++	vga_wcrt(NULL, 0x0D, (Base & 0x00FF));
+ 
+ 	/*
+ 	 * Make sure we don't clobber some other bits that might already
+ 	 * have been set. NOTE: NM2200 has a writable bit 3, but it shouldn't
+ 	 * be needed.
+ 	 */
+-	oldExtCRTDispAddr = VGArGR(0x0E);
+-	VGAwGR(0x0E, (((Base >> 16) & 0x0f) | (oldExtCRTDispAddr & 0xf0)));
++	oldExtCRTDispAddr = vga_rgfx(NULL, 0x0E);
++	vga_wgfx(NULL, 0x0E, (((Base >> 16) & 0x0f) | (oldExtCRTDispAddr & 0xf0)));
+ 
+ 	neoLock();
+ }
+@@ -1353,7 +1367,7 @@ neo2200_fillrect(struct fb_info *info, c
+ 	}
+ 
+ 	par->neo2200->dstStart =
+-	    dst * ((info->var.bits_per_pixel + 7) / 8);
++	    dst * ((info->var.bits_per_pixel + 7) >> 3);
+ 	par->neo2200->xyExt =
+ 	    (rect->height << 16) | (rect->width & 0xffff);
+ }
+@@ -1361,26 +1375,22 @@ neo2200_fillrect(struct fb_info *info, c
+ static void
+ neo2200_copyarea(struct fb_info *info, const struct fb_copyarea *area)
+ {
+-	struct neofb_par *par = (struct neofb_par *) info->par;
+ 	u32 sx = area->sx, sy = area->sy, dx = area->dx, dy = area->dy;
++	struct neofb_par *par = (struct neofb_par *) info->par;
+ 	u_long src, dst, bltCntl;
+-
++	
+ 	bltCntl = NEO_BC3_FIFO_EN | NEO_BC3_SKIP_MAPPING | 0x0C0000;
+ 
+-	if (sy < dy) {
++	if ((dy > sy) || ((dy == sy) && (dx > sx))) {	
++		/* Start with the lower right corner */
+ 		sy += (area->height - 1);
+ 		dy += (area->height - 1);
+-
+-		bltCntl |= NEO_BC0_DST_Y_DEC | NEO_BC0_SRC_Y_DEC;
+-	}
+-
+-	if (area->sx < area->dx) {
+ 		sx += (area->width - 1);
+-		dx += (area->width - 1);
+-
+-		bltCntl |= NEO_BC0_X_DEC;
+-	}
+-
++		dx += (area->width - 1);	
++		
++		bltCntl |= NEO_BC0_X_DEC | NEO_BC0_DST_Y_DEC | NEO_BC0_SRC_Y_DEC;
++	}		
++				
+ 	src = sx * (info->var.bits_per_pixel >> 3) + sy*info->fix.line_length;
+ 	dst = dx * (info->var.bits_per_pixel >> 3) + dy*info->fix.line_length;
+ 
+@@ -1725,16 +1735,16 @@ static int __devinit neo_init_hw(struct 
+ 	printk(KERN_DEBUG "--- Neo extended register dump ---\n");
+ 	for (w = 0; w < 0x85; w++)
+ 		printk(KERN_DEBUG "CR %p: %p\n", (void *) w,
+-		       (void *) VGArCR(w));
++		       (void *) vga_rcrt(NULL, w);
+ 	for (w = 0; w < 0xC7; w++)
+ 		printk(KERN_DEBUG "GR %p: %p\n", (void *) w,
+-		       (void *) VGArGR(w));
++		       (void *) vga_rgfx(NULL, w));
+ #endif
+ 
+ 	/* Determine the panel type */
+-	VGAwGR(0x09, 0x26);
+-	type = VGArGR(0x21);
+-	display = VGArGR(0x20);
++	vga_wgfx(NULL, 0x09, 0x26);
++	type = vga_rgfx(NULL, 0x21);
++	display = vga_rgfx(NULL, 0x20);
+ 	if (!par->internal_display && !par->external_display) {
+ 		par->internal_display = display & 2 || !(display & 3) ? 1 : 0;
+ 		par->external_display = display & 1;
+@@ -1744,8 +1754,8 @@ static int __devinit neo_init_hw(struct 
+ 	}
+ 
+ 	/* Determine panel width -- used in NeoValidMode. */
+-	w = VGArGR(0x20);
+-	VGAwGR(0x09, 0x00);
++	w = vga_rgfx(NULL, 0x20);
++	vga_wgfx(NULL, 0x09, 0x00);
+ 	switch ((w & 0x18) >> 3) {
+ 	case 0x00:
+ 		par->NeoPanelWidth = 640;
+--- linux-2.6.0-test1/drivers/video/platinumfb.c	2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/video/platinumfb.c	2003-07-19 17:04:55.000000000 -0700
+@@ -104,8 +104,8 @@ static int platinum_var_to_par(const str
+  * Interface used by the world
+  */
+ 
+-int platinum_init(void);
+-int platinum_setup(char*);
++int platinumfb_init(void);
++int platinumfb_setup(char*);
+ 
+ static struct fb_ops platinumfb_ops = {
+ 	.owner =	THIS_MODULE,
+@@ -399,7 +399,7 @@ try_again:
+ 	/* Apply default var */
+ 	p->info.var = var;
+ 	var.activate = FB_ACTIVATE_NOW;
+-	rc = fb_set_var(&var, &p->info);
++	rc = fb_set_var(&p->info, &var);
+ 	if (rc && (default_vmode != VMODE_640_480_60 || default_cmode != CMODE_8))
+ 		goto try_again;
+ 
+@@ -413,7 +413,7 @@ try_again:
+ 	return 1;
+ }
+ 
+-int __init platinum_init(void)
++int __init platinumfb_init(void)
+ {
+ 	struct device_node *dp;
+ 
+@@ -597,7 +597,7 @@ static int platinum_par_to_var(struct fb
+ /* 
+  * Parse user speficied options (`video=platinumfb:')
+  */
+-int __init platinum_setup(char *options)
++int __init platinumfb_setup(char *options)
+ {
+ 	char *this_opt;
+ 
+--- linux-2.6.0-test1/drivers/video/pvr2fb.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/video/pvr2fb.c	2003-07-19 17:03:50.000000000 -0700
+@@ -4,7 +4,7 @@
+  * Dreamcast.
+  *
+  * Copyright (c) 2001 M. R. Brown <mrbrown@0xd6.org>
+- * Copyright (c) 2001 Paul Mundt  <lethal@chaoticdreams.org>
++ * Copyright (c) 2001, 2002, 2003 Paul Mundt <lethal@linux-sh.org>
+  *
+  * This file is part of the LinuxDC project (linuxdc.sourceforge.net).
+  *
+@@ -12,14 +12,15 @@
+ 
+ /*
+  * This driver is mostly based on the excellent amifb and vfb sources.  It uses
+- * an odd scheme for converting hardware values to/from framebuffer values, here are
+- * some hacked-up formulas:
++ * an odd scheme for converting hardware values to/from framebuffer values,
++ * here are some hacked-up formulas:
+  *
+- *  The Dreamcast has screen offsets from each side of its four borders and the start
+- *  offsets of the display window.  I used these values to calculate 'pseudo' values
+- *  (think of them as placeholders) for the fb video mode, so that when it came time
+- *  to convert these values back into their hardware values, I could just add mode-
+- *  specific offsets to get the correct mode settings:
++ *  The Dreamcast has screen offsets from each side of its four borders and
++ *  the start offsets of the display window.  I used these values to calculate
++ *  'pseudo' values (think of them as placeholders) for the fb video mode, so
++ *  that when it came time to convert these values back into their hardware
++ *  values, I could just add mode- specific offsets to get the correct mode
++ *  settings:
+  *
+  *      left_margin = diwstart_h - borderstart_h;
+  *      right_margin = borderstop_h - (diwstart_h + xres);
+@@ -29,9 +30,9 @@
+  *      hsync_len = borderstart_h + (hsync_total - borderstop_h);
+  *      vsync_len = borderstart_v + (vsync_total - borderstop_v);
+  *
+- *  Then, when it's time to convert back to hardware settings, the only constants
+- *  are the borderstart_* offsets, all other values are derived from the fb video
+- *  mode:
++ *  Then, when it's time to convert back to hardware settings, the only
++ *  constants are the borderstart_* offsets, all other values are derived from
++ *  the fb video mode:
+  *  
+  *      // PAL
+  *      borderstart_h = 116;
+@@ -57,7 +58,6 @@
+ #include <linux/interrupt.h>
+ #include <linux/fb.h>
+ #include <linux/init.h>
+-#include <linux/console.h>
+ 
+ #ifdef CONFIG_SH_DREAMCAST
+ #include <asm/io.h>
+@@ -66,14 +66,9 @@
+ #endif
+ 
+ #ifdef CONFIG_MTRR
+-  #include <asm/mtrr.h>
++#include <asm/mtrr.h>
+ #endif
+ 
+-#include <video/fbcon.h>
+-#include <video/fbcon-cfb16.h>
+-#include <video/fbcon-cfb24.h>
+-#include <video/fbcon-cfb32.h>
+-
+ #ifdef CONFIG_FB_PVR2_DEBUG
+ #  define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , ## args)
+ #else
+@@ -124,16 +119,6 @@ static struct pvr2_params outputs[] __in
+  */
+ 
+ static struct pvr2fb_par {
+-
+-	int xres;
+-	int yres;
+-	int vxres;
+-	int vyres;
+-	int xoffset;
+-	int yoffset;
+-	u_short bpp;
+-
+-	u_long pixclock;
+ 	u_short hsync_total;	/* Clocks/line */
+ 	u_short vsync_total;	/* Lines/field */
+ 	u_short borderstart_h;
+@@ -144,53 +129,49 @@ static struct pvr2fb_par {
+ 	u_short diwstart_v;	/* Vertical offset of the display field, for
+ 				   interlaced modes, this is the long field */
+ 	u_long disp_start;	/* Address of image within VRAM */
+-
+-	u_long next_line;	/* Modulo for next line */
+-
+ 	u_char is_interlaced;	/* Is the display interlaced? */
+ 	u_char is_doublescan;	/* Are scanlines output twice? (doublescan) */
+ 	u_char is_lowres;	/* Is horizontal pixel-doubling enabled? */
++} *currentpar;
+ 
+-	u_long bordercolor;	/* RGB888 format border color */
+-
+-	u_long vmode;
+-	
+-} currentpar;
+-
+-static int currbpp;
+-static struct display disp;
+-static struct fb_info fb_info;
++static struct fb_info *fb_info;
+ static int pvr2fb_inverse = 0;
+ 
+-static struct { u_short red, green, blue, alpha; } palette[256];
+-static union {
+-#ifdef FBCON_HAS_CFB16
+-	u16 cfb16[16];
+-#endif
+-#ifdef FBCON_HAS_CFB24
+-	u32 cfb24[16];
+-#endif
+-#ifdef FBCON_HAS_CFB32
+-	u32 cfb32[16];
+-#endif
+-} fbcon_cmap;
++static struct fb_fix_screeninfo pvr2_fix __initdata = {
++	.id =		"NEC PowerVR2",
++	.type = 	FB_TYPE_PACKED_PIXELS,
++	.visual = 	FB_VISUAL_TRUECOLOR,
++	.ypanstep =	1,
++	.ywrapstep =	1,
++	.accel = 	FB_ACCEL_NONE,
++};
+ 
+-static char pvr2fb_name[16] = "NEC PowerVR2";
++static struct fb_var_screeninfo pvr2_var __initdata = {
++	.xres =		640,
++	.yres =		480,
++	.xres_virtual =	640,
++	.yres_virtual = 480,
++	.bits_per_pixel	=16,
++	.red =		{ 11, 5, 0 },
++	.green =	{  5, 6, 0 },
++	.blue =		{  0, 5, 0 },
++	.activate =	FB_ACTIVATE_NOW,
++	.height =	-1,
++	.width =	-1,
++	.vmode =	FB_VMODE_NONINTERLACED,
++};
+ 
+ #define VIDEOMEMSIZE (8*1024*1024)
+ static u_long videomemory = 0xa5000000, videomemorysize = VIDEOMEMSIZE;
+ static int cable_type = -1;
+ static int video_output = -1;
+ 
+-#ifdef CONFIG_MTRR
+-static int enable_mtrr = 1;
+-static int mtrr_handle;
+-#endif
++static int nopan = 0;
++static int nowrap = 1;
+ 
+ /*
+  * We do all updating, blanking, etc. during the vertical retrace period
+  */
+-
+ static u_short do_vmode_full = 0;	/* Change the video mode */
+ static u_short do_vmode_pan = 0;	/* Update the video mode */
+ static short do_blank = 0;		/* (Un)Blank the screen */
+@@ -201,50 +182,15 @@ static u_short is_blanked = 0;		/* Is th
+ 
+ int pvr2fb_setup(char*);
+ 
+-static int pvr2fb_get_fix(struct fb_fix_screeninfo *fix, int con,
+-                            struct fb_info *info);
+-static int pvr2fb_get_var(struct fb_var_screeninfo *var, int con,
+-                            struct fb_info *info);
+-static int pvr2fb_set_var(struct fb_var_screeninfo *var, int con,
+-                            struct fb_info *info);
+-static int pvr2fb_pan_display(struct fb_var_screeninfo *var, int con,
+-                                struct fb_info *info);
+-static int pvr2fb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+-                             struct fb_info *info);
+-static int pvr2fb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+-                             struct fb_info *info);
+ static int pvr2fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
+                             u_int transp, struct fb_info *info);
+ static int pvr2fb_blank(int blank, struct fb_info *info);
+-
+-	/*
+-	 * Interface to the low level console driver
+-	 */
+-
+-static int pvr2fbcon_switch(int con, struct fb_info *info);
+-static int pvr2fbcon_updatevar(int con, struct fb_info *info);
+-
+-	/*
+-	 * Internal/hardware-specific routines
+-	 */
+-
+ static u_long get_line_length(int xres_virtual, int bpp);
+ static void set_color_bitfields(struct fb_var_screeninfo *var);
+-static int pvr2_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
+-                            u_int *transp, struct fb_info *info);
+-
+-static int pvr2_encode_fix(struct fb_fix_screeninfo *fix,
+-                             struct pvr2fb_par *par);
+-static int pvr2_decode_var(struct fb_var_screeninfo *var,
+-                          struct pvr2fb_par *par);
+-static int pvr2_encode_var(struct fb_var_screeninfo *var,
+-                          struct pvr2fb_par *par);
+-static void pvr2_get_par(struct pvr2fb_par *par);
+-static void pvr2_set_var(struct fb_var_screeninfo *var);
+-static void pvr2_pan_var(struct fb_var_screeninfo *var);
+-static int pvr2_update_par(void);
+-static void pvr2_update_display(void);
+-static void pvr2_init_display(void);
++static int pvr2fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info);
++static int pvr2fb_set_par(struct fb_info *info);
++static void pvr2_update_display(struct fb_info *info);
++static void pvr2_init_display(struct fb_info *info);
+ static void pvr2_do_blank(void);
+ static irqreturn_t pvr2fb_interrupt(int irq, void *dev_id, struct pt_regs *fp);
+ static int pvr2_init_cable(void);
+@@ -252,19 +198,18 @@ static int pvr2_get_param(const struct p
+                             int val, int size);
+ 
+ static struct fb_ops pvr2fb_ops = {
+-	.owner =	THIS_MODULE,
+-	.fb_get_fix =	pvr2fb_get_fix,
+-	.fb_get_var =	pvr2fb_get_var,
+-	.fb_set_var =	pvr2fb_set_var,
+-	.fb_get_cmap =	pvr2fb_get_cmap,
+-	.fb_set_cmap =	pvr2fb_set_cmap,
+-	.fb_setcolreg =	pvr2fb_setcolreg,
+-	.fb_pan_display = pvr2fb_pan_display,
+-	.fb_blank =	pvr2fb_blank,
++	.owner 		= THIS_MODULE,
++	.fb_setcolreg 	= pvr2fb_setcolreg,
++	.fb_blank 	= pvr2fb_blank,
++	.fb_check_var 	= pvr2fb_check_var,
++	.fb_set_par 	= pvr2fb_set_par,
++	.fb_fillrect 	= cfb_fillrect,
++	.fb_copyarea	= cfb_copyarea,
++	.fb_imageblit	= cfb_imageblit,
++	.fb_cursor	= soft_cursor,
+ };
+ 
+ static struct fb_videomode pvr2_modedb[] __initdata = {
+-
+     /*
+      * Broadcast video modes (PAL and NTSC).  I'm unfamiliar with
+      * PAL-M and PAL-N, but from what I've read both modes parallel PAL and
+@@ -275,21 +220,16 @@ static struct fb_videomode pvr2_modedb[]
+ 	/* 640x480 @ 60Hz interlaced (NTSC) */
+ 	"ntsc_640x480i", 60, 640, 480, TV_CLK, 38, 33, 0, 18, 146, 26,
+ 	FB_SYNC_BROADCAST, FB_VMODE_INTERLACED | FB_VMODE_YWRAP
+-    },
+-
+-    {
++    }, {
+ 	/* 640x240 @ 60Hz (NTSC) */
+ 	/* XXX: Broken! Don't use... */
+ 	"ntsc_640x240", 60, 640, 240, TV_CLK, 38, 33, 0, 0, 146, 22,
+ 	FB_SYNC_BROADCAST, FB_VMODE_YWRAP
+-    },
+-
+-    {
++    }, {
+ 	/* 640x480 @ 60hz (VGA) */
+ 	"vga_640x480", 60, 640, 480, VGA_CLK, 38, 33, 0, 18, 146, 26,
+ 	0, FB_VMODE_YWRAP
+-    },
+-
++    }, 
+ };
+ 
+ #define NUM_TOTAL_MODES  ARRAY_SIZE(pvr2_modedb)
+@@ -301,222 +241,10 @@ static struct fb_videomode pvr2_modedb[]
+ static int defmode = DEFMODE_NTSC;
+ static char *mode_option __initdata = NULL;
+ 
+-/* Get the fixed part of the display */
+-
+-static int pvr2fb_get_fix(struct fb_fix_screeninfo *fix, int con,
+-                            struct fb_info *info)
+-{
+-	struct pvr2fb_par par;
+-
+-	if (con == -1)
+-		pvr2_get_par(&par);
+-	else {
+-		int err;
+-
+-		if ((err = pvr2_decode_var(&fb_display[con].var, &par)))
+-			return err;
+-	}
+-	return pvr2_encode_fix(fix, &par);
+-}
+-
+-/* Get the user-defined part of the display */
+-
+-static int pvr2fb_get_var(struct fb_var_screeninfo *var, int con,
+-                            struct fb_info *info)
+-{
+-	int err = 0;
+-
+-	if (con == -1) {
+-		struct pvr2fb_par par;
+-
+-		pvr2_get_par(&par);
+-		err = pvr2_encode_var(var, &par);
+-	} else
+-		*var = fb_display[con].var;
+-	
+-	return err;
+-}
+-
+-/* Set the user-defined part of the display */
+-
+-static int pvr2fb_set_var(struct fb_var_screeninfo *var, int con,
+-                            struct fb_info *info)
+-{
+-	int err, activate = var->activate;
+-	int oldxres, oldyres, oldvxres, oldvyres, oldbpp;
+-	struct pvr2fb_par par;
+-
+-	struct display *display;
+-	if (con >= 0)
+-		display = &fb_display[con];
+-	else
+-		display = &disp;        /* used during initialization */
+-
+-	/*
+-	 * FB_VMODE_CONUPDATE and FB_VMODE_SMOOTH_XPAN are equal!
+-	 * as FB_VMODE_SMOOTH_XPAN is only used internally
+-	 */
+-
+-	if (var->vmode & FB_VMODE_CONUPDATE) {
+-		var->vmode |= FB_VMODE_YWRAP;
+-		var->xoffset = display->var.xoffset;
+-		var->yoffset = display->var.yoffset;
+-	}
+-	if ((err = pvr2_decode_var(var, &par)))
+-		return err;
+-	pvr2_encode_var(var, &par);
+-
+-	/* Do memory check and bitfield set here?? */
+-
+-	if ((activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) {
+-		oldxres = display->var.xres;
+-		oldyres = display->var.yres;
+-		oldvxres = display->var.xres_virtual;
+-		oldvyres = display->var.yres_virtual;
+-		oldbpp = display->var.bits_per_pixel;
+-		display->var = *var;
+-		if (oldxres != var->xres || oldyres != var->yres ||
+-		    oldvxres != var->xres_virtual || oldvyres != var->yres_virtual ||
+-		    oldbpp != var->bits_per_pixel) {
+-			struct fb_fix_screeninfo fix;
+-
+-			pvr2_encode_fix(&fix, &par);
+-			display->scrollmode = SCROLL_YREDRAW;
+-			display->visual = fix.visual;
+-			display->type = fix.type;
+-			display->type_aux = fix.type_aux;
+-			display->ypanstep = fix.ypanstep;
+-			display->ywrapstep = fix.ywrapstep;
+-			display->line_length = fix.line_length;
+-			display->can_soft_blank = 1;
+-			display->inverse = pvr2fb_inverse;
+-			switch (var->bits_per_pixel) {
+-#ifdef FBCON_HAS_CFB16
+-			    case 16:
+-				display->dispsw = &fbcon_cfb16;
+-				display->dispsw_data = fbcon_cmap.cfb16;
+-				break;
+-#endif
+-#ifdef FBCON_HAS_CFB24
+-			    case 24:
+-				display->dispsw = &fbcon_cfb24;
+-				display->dispsw_data = fbcon_cmap.cfb24;
+-				break;
+-#endif
+-#ifdef FBCON_HAS_CFB32
+-			    case 32:
+-				display->dispsw = &fbcon_cfb32;
+-				display->dispsw_data = fbcon_cmap.cfb32;
+-				break;
+-#endif
+-			    default:
+-				display->dispsw = &fbcon_dummy;
+-				break;
+-			}
+-			if (fb_info.changevar)
+-				(*fb_info.changevar)(con);
+-		}
+-		if (oldbpp != var->bits_per_pixel) {
+-			if ((err = fb_alloc_cmap(&display->cmap, 0, 0)))
+-				return err;
+-			do_install_cmap(con, info);
+-		}
+-		if (con == info->currcon)
+-			pvr2_set_var(&display->var);
+-	}
+-
+-	return 0;
+-}
+-
+-/*
+- * Pan or wrap the display.
+- * This call looks only at xoffset, yoffset and the FB_VMODE_YRAP flag
+- */
+-
+-static int pvr2fb_pan_display(struct fb_var_screeninfo *var, int con,
+-                                struct fb_info *info)
+-{
+-	if (var->vmode & FB_VMODE_YWRAP) {
+-		if (var->yoffset<0 || var->yoffset >=
+-		    fb_display[con].var.yres_virtual || var->xoffset)
+-			return -EINVAL;
+-	 } else {
+-		if (var->xoffset+fb_display[con].var.xres >
+-		    fb_display[con].var.xres_virtual ||
+-		    var->yoffset+fb_display[con].var.yres >
+-		    fb_display[con].var.yres_virtual)
+-		    return -EINVAL;
+-	}
+-	if (con == info->currcon)
+-		pvr2_pan_var(var);
+-	fb_display[con].var.xoffset = var->xoffset;
+-	fb_display[con].var.yoffset = var->yoffset;
+-	if (var->vmode & FB_VMODE_YWRAP)
+-		fb_display[con].var.vmode |= FB_VMODE_YWRAP;
+-	else
+-		fb_display[con].var.vmode &= ~FB_VMODE_YWRAP;
+-			
+-	return 0;
+-}
+-
+-/* Get the colormap */
+-
+-static int pvr2fb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+-                             struct fb_info *info)
+-{
+-	if (con == info->currcon) /* current console? */
+-		return fb_get_cmap(cmap, kspc, pvr2_getcolreg, info);
+-	else if (fb_display[con].cmap.len) /* non default colormap? */
+-		fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
+-	else
+-		fb_copy_cmap(fb_default_cmap(1<<fb_display[con].var.bits_per_pixel),
+-		             cmap, kspc ? 0 : 2);
+-	return 0;
+-}
+-
+-/* Set the colormap */
+-
+-static int pvr2fb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+-	                     struct fb_info *info)
+-{
+-	int err;
+-
+-	if (!fb_display[con].cmap.len) {        /* no colormap allocated? */
+-		if ((err = fb_alloc_cmap(&fb_display[con].cmap,
+-		                         1<<fb_display[con].var.bits_per_pixel,
+-					 0)))
+-			 return err;
+-	}
+-	if (con == info->currcon)                     /* current console? */
+-		return fb_set_cmap(cmap, kspc, info);
+-	else
+-		fb_copy_cmap(cmap, &fb_display[con].cmap, kspc ? 0 : 1);
+-
+-	return 0;
+-}
+-
+-static int pvr2fbcon_switch(int con, struct fb_info *info)
+-{
+-	/* Do we have to save the colormap? */
+-	if (fb_display[info->currcon].cmap.len)
+-		fb_get_cmap(&fb_display[info->currcon].cmap, 1, pvr2_getcolreg, info);
+-
+-	info->currcon = con;
+-	pvr2_set_var(&fb_display[con].var);
+-	/* Install new colormap */
+-	do_install_cmap(con, info);
+-	return 0;
+-}
+-
+-static int pvr2fbcon_updatevar(int con, struct fb_info *info)
+-{
+-	pvr2_pan_var(&fb_display[con].var);
+-	return 0;
+-}
+-
+ static int pvr2fb_blank(int blank, struct fb_info *info)
+ {
+ 	do_blank = blank ? blank : -1;
++	return 0;
+ }
+ 
+ static inline u_long get_line_length(int xres_virtual, int bpp)
+@@ -548,52 +276,29 @@ static void set_color_bitfields(struct f
+ 	}
+ }
+ 
+-static int pvr2_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
+-                            u_int *transp, struct fb_info *info)
+-{
+-	if (regno > 255)
+-	    return 1;
+-	
+-	*red = palette[regno].red;
+-	*green = palette[regno].green;
+-	*blue = palette[regno].blue;
+-	*transp = 0;
+-	return 0;
+-}
+-	
+ static int pvr2fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
+                             u_int transp, struct fb_info *info)
+ {
+ 	if (regno > 255)
+ 		return 1;
+ 
+-	palette[regno].red = red;
+-	palette[regno].green = green;
+-	palette[regno].blue = blue;
+-
+ 	if (regno < 16) {
+-		switch (currbpp) {
+-#ifdef FBCON_HAS_CFB16
++		switch (info->var.bits_per_pixel) {
+ 		    case 16: /* RGB 565 */
+-			fbcon_cmap.cfb16[regno] = (red & 0xf800) |
+-			                          ((green & 0xfc00) >> 5) |
++			((u16*)(info->pseudo_palette))[regno] = (red & 0xf800) |
++						((green & 0xfc00) >> 5) |
+ 						  ((blue & 0xf800) >> 11);
+ 			break;
+-#endif
+-#ifdef FBCON_HAS_CFB24
+ 		    case 24: /* RGB 888 */
+ 			red >>= 8; green >>= 8; blue >>= 8;
+-			fbcon_cmap.cfb24[regno] = (red << 16) | (green << 8) | blue;
++			((u32*)(info->pseudo_palette))[regno] = (red << 16) | (green << 8) | blue;
+ 			break;
+-#endif
+-#ifdef FBCON_HAS_CFB32
+ 		    case 32: /* ARGB 8888 */
+ 			red >>= 8; green >>= 8; blue >>= 8;
+-			fbcon_cmap.cfb32[regno] = (red << 16) | (green << 8) | blue;
++			((u32*)(info->pseudo_palette))[regno] = (transp << 24) |(red << 16) | (green << 8) | blue;
+ 			break;
+-#endif
+ 		    default:
+-			DPRINTK("Invalid bit depth %d?!?\n", currbpp);
++			DPRINTK("Invalid bit depth %d?!?\n", info->var.bits_per_pixel);
+ 			return 1;
+ 		}
+ 	}
+@@ -601,85 +306,33 @@ static int pvr2fb_setcolreg(u_int regno,
+ 	return 0;
+ }
+ 
+-
+-static int pvr2_encode_fix(struct fb_fix_screeninfo *fix,
+-                             struct pvr2fb_par *par)
+-{
+-	memset(fix, 0, sizeof(struct fb_fix_screeninfo));
+-	strcpy(fix->id, pvr2fb_name);
+-	fix->smem_start = videomemory;
+-	fix->smem_len = videomemorysize;
+-	fix->type = FB_TYPE_PACKED_PIXELS;
+-	fix->type_aux = 0;
+-	fix->visual = FB_VISUAL_TRUECOLOR;
+-
+-	if (par->vmode & FB_VMODE_YWRAP) {
+-		fix->ywrapstep = 1;
+-		fix->xpanstep = fix->ypanstep = 0;
+-	} else {
+-		fix->ywrapstep = 0;
+-		fix->xpanstep = 1;
+-		fix->ypanstep = 1;
+-	}
+-	fix->line_length = par->next_line;
+-
+-	return 0;
+-}
+-
+-/*
+- * Create a hardware video mode using the framebuffer values.  If a value needs
+- * to be clipped or constrained it's done here.  This routine needs a bit more
+- * work to make sure we're doing the right tests at the right time.
+- */
+-static int pvr2_decode_var(struct fb_var_screeninfo *var,
+-                             struct pvr2fb_par *par)
++static int pvr2fb_set_par(struct fb_info *info)
+ {
++	struct pvr2fb_par *par = (struct pvr2fb_par *)info->par;
++	struct fb_var_screeninfo *var = &info->var;
+ 	u_long line_length;
+ 	u_short vtotal;
+ 
+-	if (var->pixclock != TV_CLK && var->pixclock != VGA_CLK) {
+-		DPRINTK("Invalid pixclock value %d\n", var->pixclock);
+-		return -EINVAL;
+-	}
+-	par->pixclock = var->pixclock;
+-	
+-	if ((par->xres = var->xres) < 320)
+-		par->xres = 320;
+-	if ((par->yres = var->yres) < 240)
+-		par->yres = 240;
+-	if ((par->vxres = var->xres_virtual) < par->xres)
+-		par->vxres = par->xres;
+-	if ((par->vyres = var->yres_virtual) < par->yres)
+-		par->vyres = par->yres;
+-
+-	if ((par->bpp = var->bits_per_pixel) <= 16)
+-		par->bpp = 16;
+-	else if ((par->bpp = var->bits_per_pixel) <= 24)
+-		par->bpp = 24;
+-	else if ((par->bpp = var->bits_per_pixel) <= 32)
+-		par->bpp = 32;
+-
+-	currbpp = par->bpp;
+-
+ 	/*
+ 	 * XXX: It's possible that a user could use a VGA box, change the cable
+-	 * type in hardware (i.e. switch from VGA<->composite), then change modes
+-	 * (i.e. switching to another VT).  If that happens we should automagically
+-	 * change the output format to cope, but currently I don't have a VGA box
+-	 * to make sure this works properly.
++	 * type in hardware (i.e. switch from VGA<->composite), then change
++	 * modes (i.e. switching to another VT).  If that happens we should
++	 * automagically change the output format to cope, but currently I
++	 * don't have a VGA box to make sure this works properly.
+ 	 */
+ 	cable_type = pvr2_init_cable();
+ 	if (cable_type == CT_VGA && video_output != VO_VGA)
+ 		video_output = VO_VGA;
+ 
+-	par->vmode = var->vmode & FB_VMODE_MASK;
+-	if (par->vmode & FB_VMODE_INTERLACED && video_output != VO_VGA)
++	var->vmode &= FB_VMODE_MASK;
++	if (var->vmode & FB_VMODE_INTERLACED && video_output != VO_VGA)
+ 		par->is_interlaced = 1;
+ 	/* 
+ 	 * XXX: Need to be more creative with this (i.e. allow doublecan for
+ 	 * PAL/NTSC output).
+ 	 */
+-	par->is_doublescan = (par->yres < 480 && video_output == VO_VGA);
++	if (var->vmode & FB_VMODE_DOUBLE && video_output == VO_VGA)
++		par->is_doublescan = 1;
+ 	
+ 	par->hsync_total = var->left_margin + var->xres + var->right_margin +
+ 	                   var->hsync_len;
+@@ -691,22 +344,12 @@ static int pvr2_decode_var(struct fb_var
+ 		if (par->is_interlaced)
+ 			vtotal /= 2;
+ 		if (vtotal > (PAL_VTOTAL + NTSC_VTOTAL)/2) {
+-			/* PAL video output */
+-			/* XXX: Should be using a range here ... ? */
+-			if (par->hsync_total != PAL_HTOTAL) {
+-				DPRINTK("invalid hsync total for PAL\n");
+-				return -EINVAL;
+-			}
+ 			/* XXX: Check for start values here... */
+ 			/* XXX: Check hardware for PAL-compatibility */
+ 			par->borderstart_h = 116;
+ 			par->borderstart_v = 44;
+ 		} else {
+ 			/* NTSC video output */
+-			if (par->hsync_total != NTSC_HTOTAL) {
+-				DPRINTK("invalid hsync total for NTSC\n");
+-				return -EINVAL;
+-			}
+ 			par->borderstart_h = 126;
+ 			par->borderstart_v = 18;
+ 		}
+@@ -714,155 +357,123 @@ static int pvr2_decode_var(struct fb_var
+ 		/* VGA mode */
+ 		/* XXX: What else needs to be checked? */
+ 		/* 
+-		 * XXX: We have a little freedom in VGA modes, what ranges should
+-		 * be here (i.e. hsync/vsync totals, etc.)?
++		 * XXX: We have a little freedom in VGA modes, what ranges
++		 * should be here (i.e. hsync/vsync totals, etc.)?
+ 		 */
+ 		par->borderstart_h = 126;
+ 		par->borderstart_v = 40;
+ 	}
+ 
+ 	/* Calculate the remainding offsets */
+-	par->borderstop_h = par->borderstart_h + par->hsync_total -
+-	                    var->hsync_len;
+-	par->borderstop_v = par->borderstart_v + par->vsync_total -
+-	                    var->vsync_len;
+ 	par->diwstart_h = par->borderstart_h + var->left_margin;
+ 	par->diwstart_v = par->borderstart_v + var->upper_margin;
++	par->borderstop_h = par->diwstart_h + var->xres + 
++			    var->right_margin;    
++	par->borderstop_v = par->diwstart_v + var->yres +
++			    var->lower_margin;
++
+ 	if (!par->is_interlaced)
+ 		par->borderstop_v /= 2;
+-
+-	if (par->xres < 640)
++	if (info->var.xres < 640)
+ 		par->is_lowres = 1;
+ 
+-	/* XXX: Needs testing. */
+-	if (!((par->vmode ^ var->vmode) & FB_VMODE_YWRAP)) {
+-		par->xoffset = var->xoffset;
+-		par->yoffset = var->yoffset;
+-		if (par->vmode & FB_VMODE_YWRAP) {
+-			if (par->xoffset || par->yoffset < 0 || par->yoffset >=
+-			    par->vyres)
+-				par->xoffset = par->yoffset = 0;
+-		} else {
+-			if (par->xoffset < 0 || par->xoffset > par->vxres-par->xres ||
+-			    par->yoffset < 0 || par->yoffset > par->vyres-par->yres)
+-				par->xoffset = par->yoffset = 0;
+-		}
+-	} else
+-		par->xoffset = par->yoffset = 0;
+-
+-	/* Check memory sizes */
+ 	line_length = get_line_length(var->xres_virtual, var->bits_per_pixel);
+-	if (line_length * var->yres_virtual > videomemorysize)
+-		return -ENOMEM;
+-	par->disp_start = videomemory + (get_line_length(par->vxres, par->bpp) *
+-	                  par->yoffset) * get_line_length(par->xoffset, par->bpp);
+-	par->next_line = line_length;
+-	
++	par->disp_start = videomemory + (line_length * var->yoffset) * line_length;
++	info->fix.line_length = line_length;
+ 	return 0;
+ }
+ 
+-static int pvr2_encode_var(struct fb_var_screeninfo *var,
+-                             struct pvr2fb_par *par)
++static int pvr2fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
+ {
+-	memset(var, 0, sizeof(struct fb_var_screeninfo));
++	u_short vtotal, hsync_total;
++	u_long line_length;
+ 
+-	var->xres = par->xres;
+-	var->yres = par->yres;
+-	var->xres_virtual = par->vxres;
+-	var->yres_virtual = par->vyres;
+-	var->xoffset = par->xoffset;
+-	var->yoffset = par->yoffset;
++	if (var->pixclock != TV_CLK || var->pixclock != VGA_CLK) {
++		DPRINTK("Invalid pixclock value %d\n", var->pixclock);
++		return -EINVAL;
++	}
+ 
+-	var->bits_per_pixel = par->bpp;
+-	set_color_bitfields(var);
++	if (var->xres < 320)
++		var->xres = 320;
++	if (var->yres < 240)
++		var->yres = 240;
++	if (var->xres_virtual < var->xres)
++		var->xres_virtual = var->xres;
++	if (var->yres_virtual < var->yres)
++		var->yres_virtual = var->yres;
++
++	if (var->bits_per_pixel <= 16)
++		var->bits_per_pixel = 16;
++	else if (var->bits_per_pixel <= 24)
++		var->bits_per_pixel = 24;
++	else if (var->bits_per_pixel <= 32)
++		var->bits_per_pixel = 32;
+ 
+-	var->activate = FB_ACTIVATE_NOW;
+-	var->height = -1;
+-	var->width = -1;
++	set_color_bitfields(var);
+ 
+-	var->pixclock = par->pixclock;
++	if (var->vmode & FB_VMODE_YWRAP) {
++		if (var->xoffset || var->yoffset < 0 || 
++		    var->yoffset >= var->yres_virtual) {
++			var->xoffset = var->yoffset = 0;
++		} else {
++			if (var->xoffset > var->xres_virtual - var->xres ||
++		    	    var->yoffset > var->yres_virtual - var->yres || 
++			    var->xoffset < 0 || var->yoffset < 0)
++				var->xoffset = var->yoffset = 0;
++		}
++	} else {
++		var->xoffset = var->yoffset = 0;
++	}
+ 
+-	if (par->is_doublescan)
++	/* 
++	 * XXX: Need to be more creative with this (i.e. allow doublecan for
++	 * PAL/NTSC output).
++	 */
++	if (var->yres < 480 && video_output == VO_VGA)
+ 		var->vmode = FB_VMODE_DOUBLE;
+ 
+-	if (par->is_interlaced)
+-		var->vmode |= FB_VMODE_INTERLACED;
+-	else
+-		var->vmode |= FB_VMODE_NONINTERLACED;
+-
+-	var->right_margin = par->borderstop_h - (par->diwstart_h + par->xres);
+-	var->left_margin = par->diwstart_h - par->borderstart_h;
+-	var->hsync_len = par->borderstart_h + (par->hsync_total - par->borderstop_h);
+-	var->upper_margin = par->diwstart_v - par->borderstart_v;
+-	var->lower_margin = par->borderstop_v - (par->diwstart_v + par->yres);
+-	var->vsync_len = par->borderstart_v + (par->vsync_total - par->borderstop_v);
+ 	if (video_output != VO_VGA)
+-		var->sync = FB_SYNC_BROADCAST;
+-
+-	if (par->vmode & FB_VMODE_YWRAP)
+-		var->vmode |= FB_VMODE_YWRAP;
+-	
+-	return 0;
+-}
+-
+-static void pvr2_get_par(struct pvr2fb_par *par)
+-{
+-	*par = currentpar;
+-}
+-
+-/* Setup the new videomode in hardware */
+-
+-static void pvr2_set_var(struct fb_var_screeninfo *var)
+-{
+-	do_vmode_pan = 0;
+-	do_vmode_full = 0;
+-	pvr2_decode_var(var, &currentpar);
+-
+-	do_vmode_full = 1;
+-}
+-
+-/* 
+- * Pan or wrap the display
+- * This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag in `var'.
+- */
+-static void pvr2_pan_var(struct fb_var_screeninfo *var)
+-{
+-	struct pvr2fb_par *par = &currentpar;
++		var->sync = FB_SYNC_BROADCAST | FB_VMODE_INTERLACED;
+ 
+-	par->xoffset = var->xoffset;
+-	par->yoffset = var->yoffset;
+-	if (var->vmode & FB_VMODE_YWRAP)
+-		par->vmode |= FB_VMODE_YWRAP;
+-	else
+-		par->vmode &= ~FB_VMODE_YWRAP;
+-
+-	do_vmode_pan = 0;
+-	pvr2_update_par();
+-	do_vmode_pan = 1;
+-}
+-
+-static int pvr2_update_par(void)
+-{
+-	struct pvr2fb_par *par = &currentpar;
+-	u_long move;
+-
+-	move = get_line_length(par->xoffset, par->bpp);
+-	if (par->yoffset) {
+-		par->disp_start += (par->next_line * par->yoffset) + move;
+-	} else
+-		par->disp_start += move;
++	hsync_total = var->left_margin + var->xres + var->right_margin +
++		      var->hsync_len;
++	vtotal = var->upper_margin + var->yres + var->lower_margin +
++		 var->vsync_len;
+ 
++	if (var->sync & FB_SYNC_BROADCAST) {
++		if (var->vmode & FB_VMODE_INTERLACED)
++			vtotal /= 2;
++		if (vtotal > (PAL_VTOTAL + NTSC_VTOTAL)/2) {
++			/* PAL video output */
++			/* XXX: Should be using a range here ... ? */
++			if (hsync_total != PAL_HTOTAL) {
++				DPRINTK("invalid hsync total for PAL\n");
++				return -EINVAL;
++			}
++		} else {
++			/* NTSC video output */
++			if (hsync_total != NTSC_HTOTAL) {
++				DPRINTK("invalid hsync total for NTSC\n");
++				return -EINVAL;
++			}
++		}
++	}
++	/* Check memory sizes */
++	line_length = get_line_length(var->xres_virtual, var->bits_per_pixel);
++	if (line_length * var->yres_virtual > videomemorysize)
++		return -ENOMEM;
+ 	return 0;
+ }
+ 
+-static void pvr2_update_display(void)
++static void pvr2_update_display(struct fb_info *info)
+ {
+-	struct pvr2fb_par *par = &currentpar;
++	struct pvr2fb_par *par = (struct pvr2fb_par *) info->par;
++	struct fb_var_screeninfo *var = &info->var;
+ 
+ 	/* Update the start address of the display image */
+ 	ctrl_outl(par->disp_start, DISP_DIWADDRL);
+ 	ctrl_outl(par->disp_start +
+-		  get_line_length(par->xoffset + par->xres, par->bpp),
++		  get_line_length(var->xoffset+var->xres, var->bits_per_pixel),
+ 	          DISP_DIWADDRS);
+ }
+ 
+@@ -872,11 +483,12 @@ static void pvr2_update_display(void)
+  * registers are still undocumented.
+  */
+ 
+-static void pvr2_init_display(void)
++static void pvr2_init_display(struct fb_info *info)
+ {
+-	struct pvr2fb_par *par = &currentpar;
++	struct pvr2fb_par *par = (struct pvr2fb_par *) info->par;
++	struct fb_var_screeninfo *var = &info->var;
+ 	u_short diw_height, diw_width, diw_modulo = 1;
+-	u_short bytesperpixel = par->bpp / 8;
++	u_short bytesperpixel = var->bits_per_pixel >> 3;
+ 
+ 	/* hsync and vsync totals */
+ 	ctrl_outl((par->vsync_total << 16) | par->hsync_total, DISP_SYNCSIZE);
+@@ -885,16 +497,16 @@ static void pvr2_init_display(void)
+ 	/* since we're "panning" within vram, we need to offset things based
+ 	 * on the offset from the virtual x start to our real gfx. */
+ 	if (video_output != VO_VGA && par->is_interlaced)
+-		diw_modulo += par->next_line / 4;
+-	diw_height = (par->is_interlaced ? par->yres / 2 : par->yres);
+-	diw_width = get_line_length(par->xres, par->bpp) / 4;
++		diw_modulo += info->fix.line_length / 4;
++	diw_height = (par->is_interlaced ? var->yres / 2 : var->yres);
++	diw_width = get_line_length(var->xres, var->bits_per_pixel) / 4;
+ 	ctrl_outl((diw_modulo << 20) | (--diw_height << 10) | --diw_width,
+ 	          DISP_DIWSIZE);
+ 
+ 	/* display address, long and short fields */
+ 	ctrl_outl(par->disp_start, DISP_DIWADDRL);
+ 	ctrl_outl(par->disp_start +
+-	          get_line_length(par->xoffset + par->xres, par->bpp),
++	          get_line_length(var->xoffset+var->xres, var->bits_per_pixel),
+ 	          DISP_DIWADDRS);
+ 
+ 	/* border horizontal, border vertical, border color */
+@@ -919,7 +531,6 @@ static void pvr2_init_display(void)
+ 	/* video enable, color sync, interlace, 
+ 	 * hsync and vsync polarity (currently unused) */
+ 	ctrl_outl(0x100 | ((par->is_interlaced /*|4*/) << 4), DISP_SYNCCONF);
+-
+ }
+ 
+ /* Simulate blanking by making the border cover the entire screen */
+@@ -941,23 +552,20 @@ static void pvr2_do_blank(void)
+ 
+ static irqreturn_t pvr2fb_interrupt(int irq, void *dev_id, struct pt_regs *fp)
+ {
+-	if (do_vmode_pan || do_vmode_full)
+-		pvr2_update_display();
++	struct fb_info *info = dev_id;
+ 
++	if (do_vmode_pan || do_vmode_full)
++		pvr2_update_display(info);
+ 	if (do_vmode_full)
+-		pvr2_init_display();
+-
++		pvr2_init_display(info);
+ 	if (do_vmode_pan)
+ 		do_vmode_pan = 0;
+-
++	if (do_vmode_full)
++		do_vmode_full = 0;
+ 	if (do_blank) {
+ 		pvr2_do_blank();
+ 		do_blank = 0;
+ 	}
+-
+-	if (do_vmode_full) {
+-		do_vmode_full = 0;
+-	}
+ 	return IRQ_HANDLED;
+ }
+ 
+@@ -991,94 +599,120 @@ static int pvr2_init_cable(void)
+ 
+ int __init pvr2fb_init(void)
+ {
+-	struct fb_var_screeninfo var;
+ 	u_long modememused;
++	int err = -EINVAL;
+ 
+-	if (!MACH_DREAMCAST)
++	if (!mach_is_dreamcast())
+ 		return -ENXIO;
+ 
++	fb_info = kmalloc(sizeof(struct fb_info) + sizeof(struct pvr2fb_par) +
++			  sizeof(u32) * 16, GFP_KERNEL);
++	
++	if (!fb_info) {
++		printk(KERN_ERR "Failed to allocate memory for fb_info\n");
++		return -ENOMEM;
++	}
++
++	memset(fb_info, 0, sizeof(fb_info) + sizeof(struct pvr2fb_par) + sizeof(u32) * 16);
++
++	currentpar = (struct pvr2fb_par *)(fb_info + 1);
++
+ 	/* Make a guess at the monitor based on the attached cable */
+ 	if (pvr2_init_cable() == CT_VGA) {
+-		fb_info.monspecs.hfmin = 30000;
+-		fb_info.monspecs.hfmax = 70000;
+-		fb_info.monspecs.vfmin = 60;
+-		fb_info.monspecs.vfmax = 60;
+-	}
+-	else { /* Not VGA, using a TV (taken from acornfb) */
+-		fb_info.monspecs.hfmin = 15469;
+-		fb_info.monspecs.hfmax = 15781;
+-		fb_info.monspecs.vfmin = 49;
+-		fb_info.monspecs.vfmax = 51;
++		fb_info->monspecs.hfmin = 30000;
++		fb_info->monspecs.hfmax = 70000;
++		fb_info->monspecs.vfmin = 60;
++		fb_info->monspecs.vfmax = 60;
++	} else {
++		/* Not VGA, using a TV (taken from acornfb) */
++		fb_info->monspecs.hfmin = 15469;
++		fb_info->monspecs.hfmax = 15781;
++		fb_info->monspecs.vfmin = 49;
++		fb_info->monspecs.vfmax = 51;
+ 	}
+ 
+-	/* XXX: This needs to pull default video output via BIOS or other means */
++	/*
++	 * XXX: This needs to pull default video output via BIOS or other means
++	 */
+ 	if (video_output < 0) {
+-		if (cable_type == CT_VGA)
++		if (cable_type == CT_VGA) {
+ 			video_output = VO_VGA;
+-		else
++		} else {
+ 			video_output = VO_NTSC;
++		}
+ 	}
+ 	
+-	strcpy(fb_info.modename, pvr2fb_name);
+-	fb_info.changevar = NULL;
+-	fb_info.fbops = &pvr2fb_ops;
+-	fb_info.screen_base = (char *) videomemory;
+-	fb_info.disp = &disp;
+-	fb_info.currcon = -1;
+-	fb_info.switch_con = &pvr2fbcon_switch;
+-	fb_info.updatevar = &pvr2fbcon_updatevar;
+-	fb_info.flags = FBINFO_FLAG_DEFAULT;
+-	memset(&var, 0, sizeof(var));
++	pvr2_fix.smem_start = videomemory;
++	pvr2_fix.smem_len = videomemorysize;
++
++	fb_info->screen_base = ioremap_nocache(pvr2_fix.smem_start,
++					       pvr2_fix.smem_len);
++	
++	if (!fb_info->screen_base) {
++		printk("Failed to remap MMIO space\n");
++		err = -ENXIO;
++		goto out_err;
++	}
++
++	memset_io((unsigned long)fb_info->screen_base, 0, pvr2_fix.smem_len);
++
++	pvr2_fix.ypanstep	= nopan  ? 0 : 1;
++	pvr2_fix.ywrapstep	= nowrap ? 0 : 1;
++
++	fb_info->fbops		= &pvr2fb_ops;
++	fb_info->fix		= pvr2_fix;
++	fb_info->par		= currentpar;
++	fb_info->pseudo_palette	= (void *)(fb_info->par + 1);
++	fb_info->flags		= FBINFO_FLAG_DEFAULT;
+ 
+ 	if (video_output == VO_VGA)
+ 		defmode = DEFMODE_VGA;
+ 
+-	if (!fb_find_mode(&var, &fb_info, mode_option, pvr2_modedb,
+-	                  NUM_TOTAL_MODES, &pvr2_modedb[defmode], 16)) {
+-		return -EINVAL;
+-	}
++	if (!mode_option)
++		mode_option = "640x480@60";
+ 
+-	if (request_irq(HW_EVENT_VSYNC, pvr2fb_interrupt, 0,
+-	                "pvr2 VBL handler", &currentpar)) {
+-		DPRINTK("couldn't register VBL int\n");
+-		return -EBUSY;
+-	}
++	if (!fb_find_mode(&fb_info->var, fb_info, mode_option, pvr2_modedb,
++	                  NUM_TOTAL_MODES, &pvr2_modedb[defmode], 16))
++		fb_info->var = pvr2_var;
+ 
+-#ifdef CONFIG_MTRR
+-	if (enable_mtrr) {
+-		mtrr_handle = mtrr_add(videomemory, videomemorysize, MTRR_TYPE_WRCOMB, 1);
+-		printk("pvr2fb: MTRR turned on\n");
++	if (request_irq(HW_EVENT_VSYNC, pvr2fb_interrupt, 0,
++	                "pvr2 VBL handler", fb_info)) {
++		err = -EBUSY;
++		goto out_err;
+ 	}
+-#endif
+ 
+-	pvr2fb_set_var(&var, -1, &fb_info);
++	if (register_framebuffer(fb_info) < 0)
++		goto reg_failed;
+ 
+-	if (register_framebuffer(&fb_info) < 0)
+-		return -EINVAL;
++	modememused = get_line_length(fb_info->var.xres_virtual,
++				      fb_info->var.bits_per_pixel);
++	modememused *= fb_info->var.yres_virtual;
+ 
+-	modememused = get_line_length(var.xres_virtual, var.bits_per_pixel);
+-	modememused *= var.yres_virtual;
+ 	printk("fb%d: %s frame buffer device, using %ldk/%ldk of video memory\n",
+-	       fb_info.node, fb_info.modename, modememused>>10,
++	       fb_info->node, fb_info->fix.id, modememused>>10,
+ 	       videomemorysize>>10);
+ 	printk("fb%d: Mode %dx%d-%d pitch = %ld cable: %s video output: %s\n", 
+-	       fb_info.node, var.xres, var.yres, var.bits_per_pixel, 
+-	       get_line_length(var.xres, var.bits_per_pixel),
++	       fb_info->node, fb_info->var.xres, fb_info->var.yres,
++	       fb_info->var.bits_per_pixel, 
++	       get_line_length(fb_info->var.xres, fb_info->var.bits_per_pixel),
+ 	       (char *)pvr2_get_param(cables, NULL, cable_type, 3),
+ 	       (char *)pvr2_get_param(outputs, NULL, video_output, 3));
+ 
+ 	return 0;
++
++reg_failed:
++	free_irq(HW_EVENT_VSYNC, 0);
++out_err:
++	kfree(fb_info);
++
++	return err;
+ }
+ 
+ static void __exit pvr2fb_exit(void)
+ {
+-#ifdef CONFIG_MTRR
+-	if (enable_mtrr) {
+-		mtrr_del(mtrr_handle, videomemory, videomemorysize);
+-		printk("pvr2fb: MTRR turned off\n");
+-	}
+-#endif
+-	unregister_framebuffer(&fb_info);
++	unregister_framebuffer(fb_info);
++	free_irq(HW_EVENT_VSYNC, 0);
++	kfree(fb_info);
+ }
+ 
+ static int __init pvr2_get_param(const struct pvr2_params *p, const char *s,
+@@ -1102,7 +736,6 @@ static int __init pvr2_get_param(const s
+  * Parse command arguments.  Supported arguments are:
+  *    inverse                             Use inverse color maps
+  *    nomtrr                              Disable MTRR usage
+- *    font:<fontname>                     Specify console font
+  *    cable:composite|rgb|vga             Override the video cable type
+  *    output:NTSC|PAL|VGA                 Override the video output format
+  *
+@@ -1117,8 +750,6 @@ int __init pvr2fb_setup(char *options)
+ 	char cable_arg[80];
+ 	char output_arg[80];
+ 
+-	fb_info.fontname[0] = '\0';
+-
+ 	if (!options || !*options)
+ 		return 0;
+ 
+@@ -1128,23 +759,21 @@ int __init pvr2fb_setup(char *options)
+ 		if (!strcmp(this_opt, "inverse")) {
+ 			pvr2fb_inverse = 1;
+ 			fb_invert_cmaps();
+-		} else if (!strncmp(this_opt, "font:", 5))
+-			strcpy(fb_info.fontname, this_opt + 5);
+-		else if (!strncmp(this_opt, "cable:", 6))
++		} else if (!strncmp(this_opt, "cable:", 6)) {
+ 			strcpy(cable_arg, this_opt + 6);
+-		else if (!strncmp(this_opt, "output:", 7))
++		} else if (!strncmp(this_opt, "output:", 7)) {
+ 			strcpy(output_arg, this_opt + 7);
+-#ifdef CONFIG_MTRR
+-		else if (!strncmp(this_opt, "nomtrr", 6))
+-			enable_mtrr = 0;
+-#endif
+-		else
++		} else if (!strncmp(this_opt, "nopan", 5)) {
++			nopan = 1;
++		} else if (!strncmp(this_opt, "nowrap", 6)) {
++			nowrap = 1;
++		} else {
+ 			mode_option = this_opt;
++		}
+ 	}
+ 
+ 	if (*cable_arg)
+ 		cable_type = pvr2_get_param(cables, cable_arg, 0, 3);
+-
+ 	if (*output_arg)
+ 		video_output = pvr2_get_param(outputs, output_arg, 0, 3);
+ 
+--- linux-2.6.0-test1/drivers/video/sis/300vtbl.h	2003-06-14 12:17:59.000000000 -0700
++++ 25/drivers/video/sis/300vtbl.h	2003-07-19 17:04:55.000000000 -0700
+@@ -1,7 +1,30 @@
+-
+-
+-/* Register settings for SiS 300 series */
+-
++/* $XFree86$ */
++/*
++ * Register settings for SiS 300 series
++ *
++ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of the copyright holder not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  The copyright holder makes no representations
++ * about the suitability of this software for any purpose.  It is provided
++ * "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
++ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++ * PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Author: 	Thomas Winischhofer <thomas@winischhofer.net>
++ *
++ */
+ 
+ typedef struct _SiS300_StStruct
+ {
+@@ -39,470 +62,109 @@ static const SiS300_StStruct  SiS300_SMo
+ 	{0xff,     0,   0,   0,   0,   0,   0,   0}
+ };
+ 
+-typedef struct _SiS300_StandTableStruct
+-{
+-	UCHAR CRT_COLS;
+-	UCHAR ROWS;
+-	UCHAR CHAR_HEIGHT;
+-	USHORT CRT_LEN;
+-	UCHAR SR[4];
+-	UCHAR MISC;
+-	UCHAR CRTC[0x19];
+-	UCHAR ATTR[0x14];
+-	UCHAR GRC[9];
+-} SiS300_StandTableStruct;
+-
+-static const SiS300_StandTableStruct  SiS300_StandTable[] =
+-{
+- {0x28,0x18,0x08,0x0800,			/* 0x00 */
+-  {0x09,0x03,0x00,0x02},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+-   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x28,0x18,0x08,0x0800,			/* 0x01 */
+-  {0x09,0x03,0x00,0x02},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+-   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x50,0x18,0x08,0x1000,			/* 0x02 */
+-  {0x01,0x03,0x00,0x02},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x50,0x18,0x08,0x1000,			/* 0x03 */
+-  {0x01,0x03,0x00,0x02},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x28,0x18,0x08,0x4000,			/* 0x04 */
+-  {0x09,0x03,0x00,0x02},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2b,0x80,0xbf,0x1f,
+-   0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x00,0x96,0xb9,0xa2,
+-   0xff},
+-  {0x00,0x13,0x15,0x17,0x02,0x04,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x01,0x00,0x03,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x30,0x0f,0x00,
+-   0xff} },
+- {0x28,0x18,0x08,0x4000,			/* 0x05 */
+-  {0x09,0x03,0x00,0x02},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2b,0x80,0xbf,0x1f,
+-   0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x00,0x96,0xb9,0xa2,
+-   0xff},
+-  {0x00,0x13,0x15,0x17,0x02,0x04,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x01,0x00,0x03,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x30,0x0f,0x00,
+-   0xff} },
+- {0x50,0x18,0x08,0x4000,			/* 0x06 */
+-  {0x01,0x01,0x00,0x06},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x54,0x80,0xbf,0x1f,
+-   0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x00,0x96,0xb9,0xc2,
+-   0xff},
+-  {0x00,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+-   0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+-   0x01,0x00,0x01,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,
+-   0xff} },
+- {0x50,0x18,0x0e,0x1000,			/* 0x07 */
+-  {0x00,0x03,0x00,0x03},
+-  0xa6,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x28,0x0d,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
+-   0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+-   0x0e,0x00,0x0f,0x08},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0a,0x00,
+-   0xff} },
+-/* MDA_DAC*/
+- {0x00,0x00,0x00,0x0000,			/* 0x08 */
+-  {0x00,0x00,0x00,0x15},
+-  0x15,
+-  {0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
+-   0x15,0x15,0x15,0x15,0x15,0x15,0x3f,0x3f,
+-   0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x00,0x00,
+-   0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x15,
+-   0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
+-   0x15,0x15,0x15,0x15},
+-  {0x15,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
+-   0x3f} },
+-/* CGA_DAC*/
+- {0x00,0x10,0x04,0x0114,			/* 0x09 */
+-  {0x11,0x09,0x15,0x00},
+-  0x10,
+-  {0x04,0x14,0x01,0x11,0x09,0x15,0x2a,0x3a,
+-   0x2e,0x3e,0x2b,0x3b,0x2f,0x3f,0x2a,0x3a,
+-   0x2e,0x3e,0x2b,0x3b,0x2f,0x3f,0x00,0x10,
+-   0x04},
+-  {0x14,0x01,0x11,0x09,0x15,0x00,0x10,0x04,
+-   0x14,0x01,0x11,0x09,0x15,0x2a,0x3a,0x2e,
+-   0x3e,0x2b,0x3b,0x2f},
+-  {0x3f,0x2a,0x3a,0x2e,0x3e,0x2b,0x3b,0x2f,
+-   0x3f} },
+-/* EGA_DAC*/
+- {0x00,0x10,0x04,0x0114,			/* 0x0a */
+-  {0x11,0x05,0x15,0x20},
+-  0x30,
+-  {0x24,0x34,0x21,0x31,0x25,0x35,0x08,0x18,
+-   0x0c,0x1c,0x09,0x19,0x0d,0x1d,0x28,0x38,
+-   0x2c,0x3c,0x29,0x39,0x2d,0x3d,0x02,0x12,
+-   0x06},
+-  {0x16,0x03,0x13,0x07,0x17,0x22,0x32,0x26,
+-   0x36,0x23,0x33,0x27,0x37,0x0a,0x1a,0x0e,
+-   0x1e,0x0b,0x1b,0x0f},
+-  {0x1f,0x2a,0x3a,0x2e,0x3e,0x2b,0x3b,0x2f,
+-   0x3f} },
+-/* VGA_DAC*/
+- {0x00,0x10,0x04,0x0114,			/* 0x0b */
+-  {0x11,0x09,0x15,0x2a},
+-  0x3a,
+-  {0x2e,0x3e,0x2b,0x3b,0x2f,0x3f,0x00,0x05,
+-   0x08,0x0b,0x0e,0x11,0x14,0x18,0x1c,0x20,
+-   0x24,0x28,0x2d,0x32,0x38,0x3f,0x00,0x10,
+-   0x1f},
+-  {0x2f,0x3f,0x1f,0x27,0x2f,0x37,0x3f,0x2d,
+-   0x31,0x36,0x3a,0x3f,0x00,0x07,0x0e,0x15,
+-   0x1c,0x0e,0x11,0x15},
+-  {0x18,0x1c,0x14,0x16,0x18,0x1a,0x1c,0x00,
+-   0x04} },
+- {0x08,0x0c,0x10,0x0a08,			/* 0x0c */
+-  {0x0c,0x0e,0x10,0x0b},
+-  0x0c,
+-  {0x0d,0x0f,0x10,0x10,0x01,0x08,0x00,0x00,
+-   0x00,0x00,0x01,0x00,0x02,0x02,0x01,0x00,
+-   0x04,0x04,0x01,0x00,0x05,0x02,0x05,0x00,
+-   0x06},
+-  {0x01,0x06,0x05,0x06,0x00,0x08,0x01,0x08,
+-   0x00,0x07,0x02,0x07,0x06,0x07,0x00,0x00,
+-   0x00,0x00,0x00,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x00} },
+- {0x28,0x18,0x08,0x2000,			/* 0x0d */
+-  {0x09,0x0f,0x00,0x06},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2b,0x80,0xbf,0x1f,
+-   0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x00,0x96,0xb9,0xe3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
+-   0xff} },
+- {0x50,0x18,0x08,0x4000,			/* 0x0e */
+-  {0x01,0x0f,0x00,0x06},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x54,0x80,0xbf,0x1f,
+-   0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x00,0x96,0xb9,0xe3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
+-   0xff} },
+- {0x00,0x00,0x00,0x0000,			/* 0x0f */	/* TW: Standtable for VGA modes */
+-  {0x01,0x0f,0x00,0x0e},
+-  0x23,
+-  {0x5f,0x4f,0x50,0x82,0x54,0x80,0x0b,0x3e,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0xea,0x8c,0xdf,0x28,0x40,0xe7,0x04,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
+-   0x01,0x00,0x00,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0f,
+-   0xff} },
+- {0x4a,0x36,0x00,0x00c0,			/* 0x10 */
+-  {0x00,0x00,0x00,0x00},
+-  0x00,
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x3a,
+-   0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x00,0x00,0x1a,0x00,0x57,0x39,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} },
+- {0x50,0x18,0x0e,0x8000,			/* 0x11 */
+-  {0x01,0x0f,0x00,0x06},
+-  0xa2,
+-  {0x5f,0x4f,0x50,0x82,0x54,0x80,0xbf,0x1f,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x28,0x0f,0x63,0xba,0xe3,
+-   0xff},
+-  {0x00,0x08,0x00,0x00,0x18,0x18,0x00,0x00,
+-   0x00,0x08,0x00,0x00,0x00,0x18,0x00,0x00,
+-   0x0b,0x00,0x05,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,
+-   0xff} },
+- {0x50,0x18,0x0e,0x8000,			/* 0x12 */
+-  {0x01,0x0f,0x00,0x06},
+-  0xa3,
+-  {0x5f,0x4f,0x50,0x82,0x54,0x80,0xbf,0x1f,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x28,0x0f,0x63,0xba,0xe3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
+-   0xff} },
+- {0x28,0x18,0x0e,0x0800,			/* 0x13 */
+-  {0x09,0x03,0x00,0x02},
+-  0xa3,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x14,0x1f,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x28,0x18,0x0e,0x0800,			/* 0x14 */
+-  {0x09,0x03,0x00,0x02},
+-  0xa3,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x14,0x1f,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x50,0x18,0x0e,0x1000,			/* 0x15 */
+-  {0x01,0x03,0x00,0x02},
+-  0xa3,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x28,0x1f,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x50,0x18,0x0e,0x1000,			/* 0x16 */
+-  {0x01,0x03,0x00,0x02},
+-  0xa3,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x28,0x1f,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x28,0x18,0x10,0x0800,			/* 0x17 */
+-  {0x08,0x03,0x00,0x02},
+-  0x67,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+-   0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x0c,0x00,0x0f,0x08},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x50,0x18,0x10,0x1000,			/* 0x18 */
+-  {0x00,0x03,0x00,0x02},
+-  0x67,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x0c,0x00,0x0f,0x08},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x50,0x18,0x10,0x1000,			/* 0x19 */
+-  {0x00,0x03,0x00,0x02},
+-  0x66,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x0f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
+-   0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+-   0x0e,0x00,0x0f,0x08},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0a,0x00,
+-   0xff} },
+- {0x50,0x1d,0x10,0xa000,			/* 0x1a */
+-  {0x01,0x0f,0x00,0x06},
+-  0xe3,
+-  {0x5f,0x4f,0x50,0x82,0x54,0x80,0x0b,0x3e,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0xea,0x8c,0xdf,0x28,0x00,0xe7,0x04,0xc3,
+-   0xff},
+-  {0x00,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
+-   0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01,
+-   0xff} },
+- {0x50,0x1d,0x10,0xa000,			/* 0x1b */
+-  {0x01,0x0f,0x00,0x06},
+-  0xe3,
+-  {0x5f,0x4f,0x50,0x82,0x54,0x80,0x0b,0x3e,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0xea,0x8c,0xdf,0x28,0x00,0xe7,0x04,0xe3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
+-   0xff} },
+- {0x28,0x18,0x08,0x2000,			/* 0x1c */
+-  {0x01,0x0f,0x00,0x0e},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x54,0x80,0xbf,0x1f,
+-   0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x40,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
+-   0x41,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0f,
+-   0xff} }
+-};
+-
+ typedef struct _SiS300_ExtStruct
+ {
+-	UCHAR Ext_ModeID;
++	UCHAR  Ext_ModeID;
+ 	USHORT Ext_ModeFlag;
+ 	USHORT Ext_ModeInfo;
+-	USHORT Ext_Point;
+ 	USHORT Ext_VESAID;
+-	UCHAR Ext_VESAMEMSize;
+-	UCHAR Ext_RESINFO;
+-	UCHAR VB_ExtTVFlickerIndex;
+-	UCHAR VB_ExtTVEdgeIndex;
+-	UCHAR VB_ExtTVYFilterIndex;
+-	UCHAR REFindex;
++	UCHAR  Ext_RESINFO;
++	UCHAR  VB_ExtTVFlickerIndex;
++	UCHAR  VB_ExtTVEdgeIndex;
++	UCHAR  VB_ExtTVYFilterIndex;
++	UCHAR  REFindex;
+ } SiS300_ExtStruct;
+ 
+ static const SiS300_ExtStruct  SiS300_EModeIDTable[] =
+ {
+-	{0x6a,0x2212,0x47,0x3563,0x0102,0x08,0x07,0x00,0x00,0x00,0x00},  /* 800x600x? */
+-	{0x2e,0x0a1b,0x36,0x3539,0x0101,0x08,0x06,0x00,0x00,0x00,0x08},
+-	{0x2f,0x021b,0x35,0x3532,0x0100,0x08,0x05,0x00,0x00,0x00,0x10},  /* 640x400x8 */
+-	{0x30,0x2a1b,0x47,0x3563,0x0103,0x08,0x07,0x00,0x00,0x00,0x00},
+-	{0x31,0x0a1b,0xad,0x3630,0x0000,0x08,0x0c,0x00,0x00,0x00,0x11},  /* 720x480x8 */
+-	{0x32,0x2a1b,0xae,0x3637,0x0000,0x08,0x0d,0x00,0x00,0x00,0x12},  /* 720x576x8 */
+-	{0x33,0x0a1d,0xad,0x3630,0x0000,0x08,0x0c,0x00,0x00,0x00,0x11},  /* 720x480x16 */
+-	{0x34,0x2a1d,0xae,0x3637,0x0000,0x08,0x0d,0x00,0x00,0x00,0x12},  /* 720x576x16 */
+-	{0x35,0x0a1f,0xad,0x3630,0x0000,0x08,0x0c,0x00,0x00,0x00,0x11},  /* 720x480x32 */
+-	{0x36,0x2a1f,0xae,0x3637,0x0000,0x08,0x0d,0x00,0x00,0x00,0x12},  /* 720x576x32 */
+-	{0x37,0x0212,0x58,0x358d,0x0104,0x08,0x08,0x00,0x00,0x00,0x13},  /* 1024x768x? */
+-	{0x38,0x0a1b,0x58,0x358d,0x0105,0x08,0x08,0x00,0x00,0x00,0x13},  /* 1024x768x8 */
+-	{0x3a,0x0e3b,0x69,0x35be,0x0107,0x08,0x09,0x00,0x00,0x00,0x1a},  /* 1280x1024x8 */
+-	{0x3c,0x063b,0x7a,0x35d4,0x0130,0x08,0x0a,0x00,0x00,0x00,0x1e},
+-	{0x3d,0x067d,0x7a,0x35d4,0x0131,0x08,0x0a,0x00,0x00,0x00,0x1e},
+-	{0x40,0x921c,0x00,0x3516,0x010d,0x08,0x00,0x00,0x00,0x00,0x23},
+-	{0x41,0x921d,0x00,0x3516,0x010e,0x08,0x00,0x00,0x00,0x00,0x23},
+-	{0x43,0x0a1c,0x36,0x3539,0x0110,0x08,0x06,0x00,0x00,0x00,0x08},
+-	{0x44,0x0a1d,0x36,0x3539,0x0111,0x08,0x06,0x00,0x00,0x00,0x08},
+-	{0x46,0x2a1c,0x47,0x3563,0x0113,0x08,0x07,0x00,0x00,0x00,0x00},  /* 800x600 */
+-	{0x47,0x2a1d,0x47,0x3563,0x0114,0x08,0x07,0x00,0x00,0x00,0x00},  /* 800x600 */
+-	{0x49,0x0a3c,0x58,0x358d,0x0116,0x08,0x08,0x00,0x00,0x00,0x13},
+-	{0x4a,0x0a3d,0x58,0x358d,0x0117,0x08,0x08,0x00,0x00,0x00,0x13},
+-	{0x4c,0x0e7c,0x69,0x35be,0x0119,0x08,0x09,0x00,0x00,0x00,0x1a},
+-	{0x4d,0x0e7d,0x69,0x35be,0x011a,0x08,0x09,0x00,0x00,0x00,0x1a},
+-	{0x50,0x921b,0x01,0x351d,0x0132,0x08,0x01,0x00,0x00,0x00,0x24},
+-	{0x51,0xb21b,0x13,0x3524,0x0133,0x08,0x03,0x00,0x00,0x00,0x25},  /* 400x300 */
+-	{0x52,0x921b,0x24,0x352b,0x0134,0x08,0x04,0x00,0x00,0x00,0x26},
+-	{0x56,0x921d,0x01,0x351d,0x0135,0x08,0x01,0x00,0x00,0x00,0x24},
+-	{0x57,0xb21d,0x13,0x3524,0x0136,0x08,0x03,0x00,0x00,0x00,0x25},  /* 400x300 */
+-	{0x58,0x921d,0x24,0x352b,0x0137,0x08,0x04,0x00,0x00,0x00,0x26},  
+-	{0x59,0x921b,0x00,0x3516,0x0138,0x08,0x00,0x00,0x00,0x00,0x23}, 
+-	{0x5c,0x921f,0x24,0x352b,0x0000,0x08,0x04,0x00,0x00,0x00,0x26},  /* TW: inserted 512x384x32 */
+-	{0x5d,0x021d,0x35,0x3532,0x0139,0x08,0x05,0x00,0x00,0x00,0x10},  /* 640x400x16 */
+- 	{0x5e,0x021f,0x35,0x3532,0x0000,0x08,0x05,0x00,0x00,0x00,0x10},  /* TW: inserted 640x400x32 */
+-	{0x62,0x0a3f,0x36,0x3539,0x013a,0x08,0x06,0x00,0x00,0x00,0x08},
+-	{0x63,0x2a3f,0x47,0x3563,0x013b,0x08,0x07,0x00,0x00,0x00,0x00},  /* 800x600 */
+-	{0x64,0x0a7f,0x58,0x358d,0x013c,0x08,0x08,0x00,0x00,0x00,0x13},
+-	{0x65,0x0eff,0x69,0x35be,0x013d,0x08,0x09,0x00,0x00,0x00,0x1a},
+-	{0x66,0x06ff,0x7a,0x35d4,0x013e,0x08,0x0a,0x00,0x00,0x00,0x1e},
+-	{0x68,0x067b,0x8b,0x35ef,0x013f,0x08,0x0b,0x00,0x00,0x00,0x27},
+-	{0x69,0x06fd,0x8b,0x35ef,0x0140,0x08,0x0b,0x00,0x00,0x00,0x27},
+-	{0x6b,0x07ff,0x8b,0x35ef,0x0000,0x10,0x0b,0x00,0x00,0x00,0x27},
+-	{0x6c,0x067b,0x9c,0x35f6,0x0000,0x08,0x11,0x00,0x00,0x00,0x28},  /* TW: 2048x1536x8 - not in BIOS! */
+-	{0x6d,0x06fd,0x9c,0x35f6,0x0000,0x10,0x11,0x00,0x00,0x00,0x28},  /* TW: 2048x1536x16 - not in BIOS! */
+-	{0x6e,0x0a3b,0x6f,0x35b2,0x0000,0x08,0x0e,0x00,0x00,0x00,0x29},  /* 1280x960x8 */
+-	{0x6f,0x0a7d,0x6f,0x35b2,0x0000,0x08,0x0e,0x00,0x00,0x00,0x29},  /* 1280x960x16 */
+-	/* TW: 16:9 modes copied from 310/325 series - not in ANY BIOS */
+-	{0x70,0x2a1b,0x40,0x3b52,0x0000,0x08,0x12,0x00,0x00,0x07,0x2d},    /* 800x480x8 */
+-	{0x71,0x0a1b,0x51,0x3b63,0x0000,0x08,0x13,0x00,0x00,0x00,0x30},    /* 1024x576x8 */
+-	{0x74,0x0a1d,0x51,0x3b63,0x0000,0x08,0x13,0x00,0x00,0x00,0x30},    /* 1024x576x16 */
+-	{0x75,0x0e3d,0x62,0x3b74,0x0000,0x08,0x14,0x00,0x00,0x00,0x33},	   /* 1280x720x16 */
+-	{0x76,0x2a1f,0x40,0x3b52,0x0000,0x08,0x12,0x00,0x00,0x07,0x2d},    /* 800x480x32 */
+-	{0x77,0x0a3f,0x51,0x3b63,0x0000,0x08,0x13,0x00,0x00,0x00,0x30},	   /* 1024x576x32 */
+-	{0x78,0x0eff,0x62,0x3b74,0x0000,0x08,0x14,0x00,0x00,0x00,0x33},	   /* 1280x720x32 */
+-	{0x79,0x0e3b,0x62,0x3b74,0x0000,0x08,0x14,0x00,0x00,0x00,0x33},	   /* 1280x720x8 */
+-	{0x7a,0x2a1d,0x40,0x3b52,0x0000,0x08,0x12,0x00,0x00,0x07,0x2d},    /* 800x480x16 */
+-	/* TW: End of new 16:9 modes */
+-	{0x7b,0x0aff,0x6f,0x35b2,0x0000,0x08,0x0e,0x00,0x00,0x00,0x29},    /* 1280x960x32 */
+-	{0x20,0x0a1b,0x54,0x0000,0x0000,0x08,0x0f,0x00,0x00,0x00,0x2b},    /* 1024x600 */
+-	{0x21,0x0a3d,0x54,0x0000,0x0000,0x08,0x0f,0x00,0x00,0x00,0x2b},
+-	{0x22,0x0a7f,0x54,0x0000,0x0000,0x08,0x0f,0x00,0x00,0x00,0x2b},
+-	{0x23,0x0a1b,0xc5,0x0000,0x0000,0x08,0x10,0x00,0x00,0x00,0x2c},    /* 1152x768 */
+-	{0x24,0x0a3d,0xc5,0x431d,0x0000,0x08,0x10,0x00,0x00,0x00,0x2c},
+-	{0x25,0x0a7f,0xc5,0x431d,0x0000,0x08,0x10,0x00,0x00,0x00,0x2c},
+-	{0x29,0x0e1b,0xc5,0x0000,0x0000,0x08,0x15,0x00,0x00,0x00,0x36},    /* TW: NEW 1152x864 - not in BIOS */
+-	{0x2a,0x0e3d,0xc5,0x0000,0x0000,0x08,0x15,0x00,0x00,0x00,0x36},
+-	{0x2b,0x0e7f,0xc5,0x0000,0x0000,0x08,0x15,0x00,0x00,0x00,0x36},
+-	{0x39,0x2a1b,0xd6,0x0000,0x0000,0x08,0x16,0x00,0x00,0x00,0x38},    /* TW: NEW 848x480 - not in BIOS */
+-	{0x3b,0x2a3d,0xd6,0x0000,0x0000,0x08,0x16,0x00,0x00,0x00,0x38},
+-	{0x3e,0x2a7f,0xd6,0x0000,0x0000,0x08,0x16,0x00,0x00,0x00,0x38},
+-	{0x3f,0x2a1b,0xd7,0x0000,0x0000,0x08,0x17,0x00,0x00,0x00,0x3a},    /* TW: NEW 856x480 - not in BIOS */
+-	{0x42,0x2a3d,0xd7,0x0000,0x0000,0x08,0x17,0x00,0x00,0x00,0x3a},
+-	{0x45,0x2a7f,0xd7,0x0000,0x0000,0x08,0x17,0x00,0x00,0x00,0x3a},
+-	{0x48,0x223b,0xe8,0x0000,0x0000,0x08,0x18,0x00,0x00,0x00,0x3c},    /* TW: NEW 1360x768 - not in BIOS */
+-	{0x4b,0x227d,0xe8,0x0000,0x0000,0x08,0x18,0x00,0x00,0x00,0x3c},
+-	{0x4e,0x22ff,0xe8,0x0000,0x0000,0x08,0x18,0x00,0x00,0x00,0x3c},
+-	{0xff,0x0000,0x00,0x0000,0xffff,0x00,0x00,0x00,0x00,0x00,0x00}
++	{0x6a,0x2212,0x0407,0x0102,SIS_RI_800x600,  0x00,0x00,0x00,0x00},  /* 800x600x? */
++	{0x2e,0x0a1b,0x0306,0x0101,SIS_RI_640x480,  0x00,0x00,0x00,0x08},
++	{0x2f,0x021b,0x0305,0x0100,SIS_RI_640x400,  0x00,0x00,0x00,0x10},  /* 640x400x8 */
++	{0x30,0x2a1b,0x0407,0x0103,SIS_RI_800x600,  0x00,0x00,0x00,0x00},
++	{0x31,0x0a1b,0x0a0d,0x0000,SIS_RI_720x480,  0x00,0x00,0x00,0x11},  /* 720x480x8 */
++	{0x32,0x2a1b,0x0a0e,0x0000,SIS_RI_720x576,  0x00,0x00,0x00,0x12},  /* 720x576x8 */
++	{0x33,0x0a1d,0x0a0d,0x0000,SIS_RI_720x480,  0x00,0x00,0x00,0x11},  /* 720x480x16 */
++	{0x34,0x2a1d,0x0a0e,0x0000,SIS_RI_720x576,  0x00,0x00,0x00,0x12},  /* 720x576x16 */
++	{0x35,0x0a1f,0x0a0d,0x0000,SIS_RI_720x480,  0x00,0x00,0x00,0x11},  /* 720x480x32 */
++	{0x36,0x2a1f,0x0a0e,0x0000,SIS_RI_720x576,  0x00,0x00,0x00,0x12},  /* 720x576x32 */
++	{0x37,0x0212,0x0508,0x0104,SIS_RI_1024x768, 0x00,0x00,0x00,0x13},  /* 1024x768x? */
++	{0x38,0x0a1b,0x0508,0x0105,SIS_RI_1024x768, 0x00,0x00,0x00,0x13},  /* 1024x768x8 */
++	{0x3a,0x0e3b,0x0609,0x0107,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a},  /* 1280x1024x8 */
++	{0x3c,0x063b,0x070a,0x0130,SIS_RI_1600x1200,0x00,0x00,0x00,0x1e},
++	{0x3d,0x067d,0x070a,0x0131,SIS_RI_1600x1200,0x00,0x00,0x00,0x1e},
++	{0x40,0x921c,0x0000,0x010d,SIS_RI_320x200,  0x00,0x00,0x00,0x23},  /* 320x200x15 */
++	{0x41,0x921d,0x0000,0x010e,SIS_RI_320x200,  0x00,0x00,0x00,0x23},  /* 320x200x16 */
++	{0x43,0x0a1c,0x0306,0x0110,SIS_RI_640x480,  0x00,0x00,0x00,0x08},
++	{0x44,0x0a1d,0x0306,0x0111,SIS_RI_640x480,  0x00,0x00,0x00,0x08},
++	{0x46,0x2a1c,0x0407,0x0113,SIS_RI_800x600,  0x00,0x00,0x00,0x00},  /* 800x600x15 */
++	{0x47,0x2a1d,0x0407,0x0114,SIS_RI_800x600,  0x00,0x00,0x00,0x00},  /* 800x600x16 */
++	{0x49,0x0a3c,0x0508,0x0116,SIS_RI_1024x768, 0x00,0x00,0x00,0x13},
++	{0x4a,0x0a3d,0x0508,0x0117,SIS_RI_1024x768, 0x00,0x00,0x00,0x13},
++	{0x4c,0x0e7c,0x0609,0x0119,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a},
++	{0x4d,0x0e7d,0x0609,0x011a,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a},
++	{0x50,0x921b,0x0001,0x0132,SIS_RI_320x240,  0x00,0x00,0x00,0x24},  /* 320x240x8  */
++	{0x51,0xb21b,0x0103,0x0133,SIS_RI_400x300,  0x00,0x00,0x00,0x25},  /* 400x300x8  */
++	{0x52,0x921b,0x0204,0x0134,SIS_RI_512x384,  0x00,0x00,0x00,0x26},  /* 512x384x8  */
++	{0x56,0x921d,0x0001,0x0135,SIS_RI_320x240,  0x00,0x00,0x00,0x24},  /* 320x240x16 */
++	{0x57,0xb21d,0x0103,0x0136,SIS_RI_400x300,  0x00,0x00,0x00,0x25},  /* 400x300x16 */
++	{0x58,0x921d,0x0204,0x0137,SIS_RI_512x384,  0x00,0x00,0x00,0x26},  /* 512x384x16 */
++	{0x59,0x921b,0x0000,0x0138,SIS_RI_320x200,  0x00,0x00,0x00,0x23},  /* 320x200x8  */
++	{0x5c,0x921f,0x0204,0x0000,SIS_RI_512x384,  0x00,0x00,0x00,0x26},  /* 512x384x32 */
++	{0x5d,0x021d,0x0305,0x0139,SIS_RI_640x400,  0x00,0x00,0x00,0x10},  /* 640x400x16 */
++ 	{0x5e,0x021f,0x0305,0x0000,SIS_RI_640x400,  0x00,0x00,0x00,0x10},  /* 640x400x32 */
++	{0x62,0x0a3f,0x0306,0x013a,SIS_RI_640x480,  0x00,0x00,0x00,0x08},
++	{0x63,0x2a3f,0x0407,0x013b,SIS_RI_800x600,  0x00,0x00,0x00,0x00},  /* 800x600x32 */
++	{0x64,0x0a7f,0x0508,0x013c,SIS_RI_1024x768, 0x00,0x00,0x00,0x13},
++	{0x65,0x0eff,0x0609,0x013d,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a},
++	{0x66,0x06ff,0x070a,0x013e,SIS_RI_1600x1200,0x00,0x00,0x00,0x1e},
++	{0x68,0x067b,0x080b,0x013f,SIS_RI_1920x1440,0x00,0x00,0x00,0x27},
++	{0x69,0x06fd,0x080b,0x0140,SIS_RI_1920x1440,0x00,0x00,0x00,0x27},
++	{0x6b,0x07ff,0x080b,0x0000,SIS_RI_1920x1440,0x00,0x00,0x00,0x27},
++	{0x6c,0x067b,0x090c,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x28},  /* 2048x1536x8 - not in BIOS! */
++	{0x6d,0x06fd,0x090c,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x28},  /* 2048x1536x16 - not in BIOS! */
++	{0x70,0x2a1b,0x0400,0x0000,SIS_RI_800x480,  0x00,0x00,0x07,0x2d},  /* 800x480x8 */
++	{0x71,0x0a1b,0x0501,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x30},  /* 1024x576x8 */
++	{0x74,0x0a1d,0x0501,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x30},  /* 1024x576x16 */
++	{0x75,0x0e3d,0x0602,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x33},  /* 1280x720x16 */
++	{0x76,0x2a1f,0x0400,0x0000,SIS_RI_800x480,  0x00,0x00,0x07,0x2d},  /* 800x480x32 */
++	{0x77,0x0a3f,0x0501,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x30},  /* 1024x576x32 */
++	{0x78,0x0eff,0x0602,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x33},  /* 1280x720x32 */
++	{0x79,0x0e3b,0x0602,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x33},  /* 1280x720x8 */
++	{0x7a,0x2a1d,0x0400,0x0000,SIS_RI_800x480,  0x00,0x00,0x07,0x2d},  /* 800x480x16 */
++	{0x7c,0x0a3b,0x060f,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x29},  /* 1280x960x8 */
++	{0x7d,0x0a7d,0x060f,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x29},  /* 1280x960x16 */
++	{0x7e,0x0aff,0x060f,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x29},  /* 1280x960x32 */
++	{0x20,0x0a1b,0x0504,0x0000,SIS_RI_1024x600, 0x00,0x00,0x00,0x2b},  /* 1024x600 */
++	{0x21,0x0a3d,0x0504,0x0000,SIS_RI_1024x600, 0x00,0x00,0x00,0x2b},
++	{0x22,0x0a7f,0x0504,0x0000,SIS_RI_1024x600, 0x00,0x00,0x00,0x2b},
++	{0x23,0x0a1b,0x0c05,0x0000,SIS_RI_1152x768, 0x00,0x00,0x00,0x2c},  /* 1152x768 */
++	{0x24,0x0a3d,0x0c05,0x0000,SIS_RI_1152x768, 0x00,0x00,0x00,0x2c},
++	{0x25,0x0a7f,0x0c05,0x0000,SIS_RI_1152x768, 0x00,0x00,0x00,0x2c},
++	{0x29,0x0e1b,0x0c05,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x36},  /* 1152x864 */
++	{0x2a,0x0e3d,0x0c05,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x36},
++	{0x2b,0x0e7f,0x0c05,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x36},
++	{0x39,0x2a1b,0x0d06,0x0000,SIS_RI_848x480,  0x00,0x00,0x00,0x38},  /* 848x480 */
++	{0x3b,0x2a3d,0x0d06,0x0000,SIS_RI_848x480,  0x00,0x00,0x00,0x38},
++	{0x3e,0x2a7f,0x0d06,0x0000,SIS_RI_848x480,  0x00,0x00,0x00,0x38},
++	{0x3f,0x2a1b,0x0d07,0x0000,SIS_RI_856x480,  0x00,0x00,0x00,0x3a},  /* 856x480 */
++	{0x42,0x2a3d,0x0d07,0x0000,SIS_RI_856x480,  0x00,0x00,0x00,0x3a},
++	{0x45,0x2a7f,0x0d07,0x0000,SIS_RI_856x480,  0x00,0x00,0x00,0x3a},
++	{0x48,0x223b,0x0e08,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x3c},  /* 1360x768 */
++	{0x4b,0x227d,0x0e08,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x3c},
++	{0x4e,0x22ff,0x0e08,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x3c},
++	{0x4f,0x921f,0x0000,0x0000,SIS_RI_320x200,  0x00,0x00,0x00,0x23},  /* 320x200x32 */
++	{0x53,0x921f,0x0001,0x0000,SIS_RI_320x240,  0x00,0x00,0x00,0x24},  /* 320x240x32 */
++	{0x54,0xb21f,0x0103,0x0000,SIS_RI_400x300,  0x00,0x00,0x00,0x25},  /* 400x300x32 */
++	{0x55,0x2e3b,0x0609,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x3d},  /* 1280x768   */
++	{0x5a,0x2e7d,0x0609,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x3d},
++	{0x5b,0x2eff,0x0609,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x3d},
++	{0x5f,0x2a1b,0x0f0e,0x0000,SIS_RI_768x576,  0x00,0x00,0x00,0x3e},  /* 768x576x8 */
++	{0x60,0x2a1d,0x0f0e,0x0000,SIS_RI_768x576,  0x00,0x00,0x00,0x3e},  /* 768x576x16 */
++	{0x61,0x2a1f,0x0f0e,0x0000,SIS_RI_768x576,  0x00,0x00,0x00,0x3e},  /* 768x576x32 */
++	{0x67,0x2e3b,0x0e08,0x0000,SIS_RI_1360x1024,0x00,0x00,0x00,0x3f},  /* 1360x1024x8 (BARCO) */
++	{0x6f,0x2e7d,0x0e08,0x0000,SIS_RI_1360x1024,0x00,0x00,0x00,0x3f},  /* 1360x1024x16 (BARCO) */
++	{0x72,0x2eff,0x0e08,0x0000,SIS_RI_1360x1024,0x00,0x00,0x00,0x3f},  /* 1360x1024x32 (BARCO) */
++	{0xff,0x0000,0x0000,0xffff,0x00,            0x00,0x00,0x00,0x00}
+ };
+ 
+ typedef struct _SiS300_Ext2Struct
+@@ -514,76 +176,77 @@ typedef struct _SiS300_Ext2Struct
+ 	UCHAR  ModeID;
+ 	USHORT XRes;
+ 	USHORT YRes;
+-	USHORT ROM_OFFSET;
+ } SiS300_Ext2Struct;
+ 
+ static const SiS300_Ext2Struct  SiS300_RefIndex[] =
+ { /* TW: Don't ever insert anything here, table is indexed */
+-	{0x085f,0x0d,0x03,0x05,0x6a, 800, 600,0x3563}, /* 00 */
+-	{0x0467,0x0e,0x44,0x05,0x6a, 800, 600,0x3568}, /* 01 */
+-	{0x0067,0x0f,0x07,0x48,0x6a, 800, 600,0x356d}, /* 02 - CRT1CRTC was 0x4f */
+-	{0x0067,0x10,0x06,0x8b,0x6a, 800, 600,0x3572}, /* 03 */
+-	{0x0147,0x11,0x08,0x00,0x6a, 800, 600,0x3577}, /* 04 */
+-	{0x0147,0x12,0x0c,0x00,0x6a, 800, 600,0x357c}, /* 05 */
+-	{0x0047,0x11,0x4e,0x00,0x6a, 800, 600,0x3581}, /* 06 - CRT1CRTC was 0x51 */
+-	{0x0047,0x11,0x13,0x00,0x6a, 800, 600,0x3586}, /* 07 */
+-	{0xc85f,0x05,0x00,0x04,0x2e, 640, 480,0x3539}, /* 08 */
+-	{0xc067,0x06,0x02,0x04,0x2e, 640, 480,0x353e}, /* 09 */
+-	{0xc067,0x07,0x02,0x47,0x2e, 640, 480,0x3543}, /* 0a */
+-	{0xc067,0x08,0x03,0x8a,0x2e, 640, 480,0x3548}, /* 0b */
+-	{0xc047,0x09,0x05,0x00,0x2e, 640, 480,0x354d}, /* 0c */
+-	{0xc047,0x0a,0x08,0x00,0x2e, 640, 480,0x3552}, /* 0d */
+-	{0xc047,0x0b,0x0a,0x00,0x2e, 640, 480,0x3557}, /* 0e */
+-	{0xc047,0x0c,0x10,0x00,0x2e, 640, 480,0x355c}, /* 0f */
+-	{0x487f,0x04,0x00,0x00,0x2f, 640, 400,0x3532}, /* 10 */
+-	{0xc00f,0x31,0x01,0x06,0x31, 720, 480,0x3630}, /* 11 */
+-	{0x000f,0x32,0x03,0x06,0x32, 720, 576,0x3637}, /* 12 */
+-	{0x0187,0x15,0x05,0x00,0x37,1024, 768,0x358d}, /* 13 */
+-        {0xc877,0x16,0x09,0x06,0x37,1024, 768,0x3592}, /* 14 */
+-	{0xc067,0x17,0x0b,0x49,0x37,1024, 768,0x3597}, /* 15 - CRT1CRTC was 0x97 */
+-	{0x0267,0x18,0x0d,0x00,0x37,1024, 768,0x359c}, /* 16 */
+-	{0x0047,0x19,0x11,0x8c,0x37,1024, 768,0x35a1}, /* 17 - CRT1CRTC was 0x59 */
+-	{0x0047,0x1a,0x52,0x00,0x37,1024, 768,0x35a6}, /* 18 */
+-	{0x0007,0x1b,0x16,0x00,0x37,1024, 768,0x35ab}, /* 19 - CRT1CRTC was 0x5b */
+-	{0x0387,0x1c,0x4d,0x00,0x3a,1280,1024,0x35be}, /* 1a - CRT1CRTC was 0x5c */
+-	{0x0077,0x1d,0x14,0x07,0x3a,1280,1024,0x35c3}, /* 1b */
+-	{0x0047,0x1e,0x17,0x00,0x3a,1280,1024,0x35c8}, /* 1c */
+-	{0x0007,0x1f,0x98,0x00,0x3a,1280,1024,0x35cd}, /* 1d */
+-	{0x0007,0x20,0x59,0x00,0x3c,1600,1200,0x35d4}, /* 1e - CRT1CRTC was 0x60 */
+-	{0x0007,0x21,0x5a,0x00,0x3c,1600,1200,0x35d9}, /* 1f */
+-	{0x0007,0x22,0x1b,0x00,0x3c,1600,1200,0x35de}, /* 20 */
+-	{0x0007,0x23,0x1d,0x00,0x3c,1600,1200,0x35e3}, /* 21 - CRT1CRTC was 0x63 */
+-	{0x0007,0x24,0x1e,0x00,0x3c,1600,1200,0x35e8}, /* 22 */
+-	{0x407f,0x00,0x00,0x00,0x40, 320, 200,0x3516}, /* 23 */
+-	{0xc07f,0x01,0x00,0x04,0x50, 320, 240,0x351d}, /* 24 */
+-	{0x0077,0x02,0x04,0x05,0x51, 400, 300,0x3524}, /* 25 */
+-	{0xc877,0x03,0x09,0x06,0x52, 512, 384,0x352b}, /* 26 */  /* was c077 */
+-	{0x8207,0x25,0x1f,0x00,0x68,1920,1440,0x35ef}, /* 27 */
+-	{0x0007,0x26,0x20,0x00,0x6c,2048,1536,0x35f6}, /* 28 */
+-	{0x0067,0x27,0x14,0x08,0x6e,1280, 960,0x35b7}, /* 29 - TW: 1280x960-60 */
+-	{0x0027,0x45,0x3c,0x08,0x6e,1280, 960,0x35b7}, /* 2a - TW: 1280x960-85 */
+-	{0xc077,0x33,0x09,0x06,0x20,1024, 600,0x0000}, /* 2b */
+-	{0xc077,0x34,0x0b,0x06,0x23,1152, 768,0x0000}, /* 2c */	/* VCLK 0x09 */
+-	{0x0057,0x35,0x27,0x08,0x70, 800, 480,0x3b52}, /* 2d - TW: 16:9 modes */
+-	{0x0047,0x36,0x37,0x08,0x70, 800, 480,0x3b57}, /* 2e */
+-	{0x0047,0x37,0x08,0x08,0x70, 800, 480,0x3b5c}, /* 2f */
+-	{0x0057,0x38,0x09,0x09,0x71,1024, 576,0x3b63}, /* 30 */
+-	{0x0047,0x39,0x38,0x09,0x71,1024, 576,0x3b68}, /* 31 */
+-	{0x0047,0x3a,0x11,0x09,0x71,1024, 576,0x3b6d}, /* 32 */
+-	{0x0057,0x3b,0x39,0x0a,0x75,1280, 720,0x3b74}, /* 33 */
+-	{0x0047,0x3c,0x3a,0x0a,0x75,1280, 720,0x3b79}, /* 34 */
+-	{0x0007,0x3d,0x3b,0x0a,0x75,1280, 720,0x3b7e}, /* 35 - TW: END of 16:9 modes */
+-	{0x0047,0x3e,0x34,0x06,0x29,1152, 864,0x0000}, /* 36 TW: 1152x864-75Hz - Non-BIOS, new */
+-	{0x0047,0x44,0x3a,0x06,0x29,1152, 864,0x0000}, /* 37 TW: 1152x864-85Hz - Non-BIOS, new */
+-	{0x00c7,0x3f,0x28,0x00,0x39, 848, 480,0x0000}, /* 38 TW: 848x480-38Hzi - Non-BIOS, new */
+-	{0xc047,0x40,0x3d,0x00,0x39, 848, 480,0x0000}, /* 39 TW: 848x480-60Hz  - Non-BIOS, new */
+-	{0x00c7,0x41,0x28,0x00,0x3f, 856, 480,0x0000}, /* 3a TW: 856x480-38Hzi - Non-BIOS, new */
+-	{0xc047,0x42,0x28,0x00,0x3f, 856, 480,0x0000}, /* 3b TW: 856x480-60Hz  - Non-BIOS, new */
+-	{0x0047,0x43,0x3e,0x00,0x48,1360, 768,0x0000}, /* 3c TW: 1360x768-60Hz - Non-BIOS, new */
+-	{0xffff,0,0,0,0,0,0,0}
++	{0x085f,0x0d,0x03,0x05,0x6a, 800, 600}, /* 00 */
++	{0x0467,0x0e,0x44,0x05,0x6a, 800, 600}, /* 01 */
++	{0x0067,0x0f,0x07,0x48,0x6a, 800, 600}, /* 02 - CRT1CRTC was 0x4f */
++	{0x0067,0x10,0x06,0x8b,0x6a, 800, 600}, /* 03 */
++	{0x0147,0x11,0x08,0x00,0x6a, 800, 600}, /* 04 */
++	{0x0147,0x12,0x0c,0x00,0x6a, 800, 600}, /* 05 */
++	{0x0047,0x11,0x4e,0x00,0x6a, 800, 600}, /* 06 - CRT1CRTC was 0x51 */
++	{0x0047,0x11,0x13,0x00,0x6a, 800, 600}, /* 07 */
++	{0xc85f,0x05,0x00,0x04,0x2e, 640, 480}, /* 08 */
++	{0xc067,0x06,0x02,0x04,0x2e, 640, 480}, /* 09 */
++	{0xc067,0x07,0x02,0x47,0x2e, 640, 480}, /* 0a */
++	{0xc067,0x08,0x03,0x8a,0x2e, 640, 480}, /* 0b */
++	{0xc047,0x09,0x05,0x00,0x2e, 640, 480}, /* 0c */
++	{0xc047,0x0a,0x08,0x00,0x2e, 640, 480}, /* 0d */
++	{0xc047,0x0b,0x0a,0x00,0x2e, 640, 480}, /* 0e */
++	{0xc047,0x0c,0x10,0x00,0x2e, 640, 480}, /* 0f */
++	{0x487f,0x04,0x00,0x00,0x2f, 640, 400}, /* 10 */
++	{0xc00f,0x31,0x01,0x06,0x31, 720, 480}, /* 11 */
++	{0x000f,0x32,0x03,0x06,0x32, 720, 576}, /* 12 */
++	{0x0187,0x15,0x05,0x00,0x37,1024, 768}, /* 13 */
++        {0xc877,0x16,0x09,0x06,0x37,1024, 768}, /* 14 */
++	{0xc067,0x17,0x0b,0x49,0x37,1024, 768}, /* 15 - CRT1CRTC was 0x97 */
++	{0x0267,0x18,0x0d,0x00,0x37,1024, 768}, /* 16 */
++	{0x0047,0x19,0x11,0x8c,0x37,1024, 768}, /* 17 - CRT1CRTC was 0x59 */
++	{0x0047,0x1a,0x52,0x00,0x37,1024, 768}, /* 18 */
++	{0x0007,0x1b,0x16,0x00,0x37,1024, 768}, /* 19 - CRT1CRTC was 0x5b */
++	{0x0387,0x1c,0x4d,0x00,0x3a,1280,1024}, /* 1a - CRT1CRTC was 0x5c */
++	{0x0077,0x1d,0x14,0x07,0x3a,1280,1024}, /* 1b */
++	{0x0047,0x1e,0x17,0x00,0x3a,1280,1024}, /* 1c */
++	{0x0007,0x1f,0x98,0x00,0x3a,1280,1024}, /* 1d */
++	{0x0007,0x20,0x59,0x00,0x3c,1600,1200}, /* 1e - CRT1CRTC was 0x60 */
++	{0x0007,0x21,0x5a,0x00,0x3c,1600,1200}, /* 1f */
++	{0x0007,0x22,0x1b,0x00,0x3c,1600,1200}, /* 20 */
++	{0x0007,0x23,0x1d,0x00,0x3c,1600,1200}, /* 21 - CRT1CRTC was 0x63 */
++	{0x0007,0x24,0x1e,0x00,0x3c,1600,1200}, /* 22 */
++	{0x407f,0x00,0x00,0x00,0x40, 320, 200}, /* 23 */
++	{0xc07f,0x01,0x00,0x04,0x50, 320, 240}, /* 24 */
++	{0x0077,0x02,0x04,0x05,0x51, 400, 300}, /* 25 */
++	{0xc877,0x03,0x09,0x06,0x52, 512, 384}, /* 26 */  /* was c077 */
++	{0x8207,0x25,0x1f,0x00,0x68,1920,1440}, /* 27 */
++	{0x0007,0x26,0x20,0x00,0x6c,2048,1536}, /* 28 */
++	{0x0067,0x27,0x14,0x08,0x6e,1280, 960}, /* 29 - TW: 1280x960-60 */
++	{0x0027,0x45,0x3c,0x08,0x6e,1280, 960}, /* 2a - TW: 1280x960-85 */
++	{0xc077,0x33,0x09,0x06,0x20,1024, 600}, /* 2b */
++	{0xc077,0x34,0x0b,0x06,0x23,1152, 768}, /* 2c */	/* VCLK 0x09 */
++	{0x0057,0x35,0x27,0x08,0x70, 800, 480}, /* 2d */
++	{0x0047,0x36,0x37,0x08,0x70, 800, 480}, /* 2e */
++	{0x0047,0x37,0x08,0x08,0x70, 800, 480}, /* 2f */
++	{0x0057,0x38,0x09,0x09,0x71,1024, 576}, /* 30 */
++	{0x0047,0x39,0x38,0x09,0x71,1024, 576}, /* 31 */
++	{0x0047,0x3a,0x11,0x09,0x71,1024, 576}, /* 32 */
++	{0x0057,0x3b,0x39,0x0a,0x75,1280, 720}, /* 33 */
++	{0x0047,0x3c,0x3a,0x0a,0x75,1280, 720}, /* 34 */
++	{0x0007,0x3d,0x3b,0x0a,0x75,1280, 720}, /* 35 */
++	{0x0047,0x3e,0x34,0x06,0x29,1152, 864}, /* 36 1152x864-75Hz */
++	{0x0047,0x44,0x3a,0x06,0x29,1152, 864}, /* 37 1152x864-85Hz */
++	{0x00c7,0x3f,0x28,0x00,0x39, 848, 480}, /* 38 848x480-38Hzi */
++	{0xc047,0x40,0x3d,0x00,0x39, 848, 480}, /* 39 848x480-60Hz  */
++	{0x00c7,0x41,0x28,0x00,0x3f, 856, 480}, /* 3a 856x480-38Hzi */
++	{0xc047,0x42,0x28,0x00,0x3f, 856, 480}, /* 3b 856x480-60Hz  */
++	{0x0047,0x43,0x3e,0x00,0x48,1360, 768}, /* 3c 1360x768-60Hz */
++	{0x0077,0x46,0x3f,0x08,0x55,1280, 768}, /* 3d 1280x768-60Hz */
++	{0x000f,0x47,0x03,0x06,0x5f, 768, 576}, /* 3e 768x576 */
++	{0x0027,0x48,0x13,0x08,0x67,1360,1024}, /* 3f 1360x1024-59Hz (BARCO1366 only) */
++	{0xffff,   0,   0,   0,   0,   0,   0}
+ };
+ 
+-/*add for 300 oem util*/
+ typedef struct _SiS_VBModeIDTableStruct
+ {
+ 	UCHAR  ModeID;
+@@ -649,9 +312,8 @@ static const SiS_VBModeIDTableStruct  Si
+ 	{0x6e,0x00,0x00,0x01,0x00,0x00,0x0b,0x0d},
+ 	{0x6f,0x00,0x00,0x01,0x00,0x00,0x0b,0x0d},
+ 	{0x7b,0x00,0x00,0x01,0x00,0x00,0x0b,0x0d},
+-	{0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00}  /* TW: added! */
++	{0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
+ };
+-/*end*/
+ 
+ typedef struct _SiS300_CRT1TableStruct
+ {
+@@ -660,15 +322,32 @@ typedef struct _SiS300_CRT1TableStruct
+ 
+ static const SiS300_CRT1TableStruct  SiS300_CRT1Table[] =
+ {
+- {{0x2d,0x27,0x28,0x90,0x2c,0x80,0xbf,0x1f,    /* 0x00 */
+-  0x9c,0x8e,0x8f,0x96,0xb9,0x30,0x00,0x00,
++#if 1
++ {{0x2d,0x27,0x28,0x90,0x2c,0x80,0xbf,0x1f,    /* 0x00 - 320x200 */
++  0x9c,0x8e,0x8f,0x96,0xb9,0x30,0x00,0x00,     /* HRE [4],[15] is invalid - but correcting it does not work */
++  0x00}},
++#endif
++#if 0
++ {{0x2d,0x27,0x27,0x91,0x2c,0x92,0xbf,0x1f,    /* 0x00 - corrected 320x200-72 - does not work */
++  0x9c,0x8e,0x8f,0x96,0xb9,0x30,0x00,0x04,
+   0x00}},
+- {{0x2d,0x27,0x28,0x90,0x2c,0x80,0x0b,0x3e,
+-  0xe9,0x8b,0xdf,0xe7,0x04,0x00,0x00,0x00,
++#endif
++ {{0x2d,0x27,0x28,0x90,0x2c,0x80,0x0b,0x3e,    /* 0x01 */
++  0xe9,0x8b,0xdf,0xe7,0x04,0x00,0x00,0x00,     /* HRE [4],[15] is invalid - but correcting it does not work */
+   0x00}},
+- {{0x3d,0x31,0x31,0x81,0x37,0x1f,0x72,0xf0,
++#if 0
++ {{0x2d,0x27,0x27,0x91,0x2c,0x92,0x0b,0x3e,    /* 0x01 - corrected 320x240-60 - does not work */
++  0xe9,0x8b,0xdf,0xe7,0x04,0x00,0x00,0x04,
++  0x00}},
++#endif
++ {{0x3d,0x31,0x31,0x81,0x37,0x1f,0x72,0xf0,    /* 0x02 */
++  0x58,0x8c,0x57,0x57,0x73,0x20,0x00,0x05,
++  0x01}},
++#if 0
++ {{0x3d,0x31,0x31,0x81,0x37,0x1f,0x72,0xf0,    /* 0x02 - corrected 400x300-60 */
+   0x58,0x8c,0x57,0x57,0x73,0x20,0x00,0x05,
+   0x01}},
++#endif  
+  {{0x4f,0x3f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+   0x02,0x88,0xff,0xff,0x25,0x10,0x00,0x01,
+   0x01}},
+@@ -683,7 +362,7 @@ static const SiS300_CRT1TableStruct  SiS
+  {{0x5f,0x4f,0x4f,0x83,0x55,0x81,0x0b,0x3e,    /* 0x05 - corrected 640x480-60 */
+   0xe9,0x8b,0xdf,0xe8,0x0c,0x00,0x00,0x05,
+   0x00}},
+- #if 0  
++#if 0  
+  {{0x63,0x4f,0x50,0x86,0x56,0x9b,0x06,0x3e,    /* 0x06 */
+   0xe8,0x8b,0xdf,0xe7,0xff,0x10,0x00,0x01,
+   0x00}},
+@@ -841,15 +520,10 @@ static const SiS300_CRT1TableStruct  SiS
+  {{0xa3,0x7f,0x7f,0x87,0x86,0x97,0x1e,0xf1,  /* 0x33 - 1024x600 */
+   0xae,0x85,0x57,0x57,0x1f,0x30,0x00,0x02,
+   0x01}},
+-#if 0
+- {{0xa3,0x7f,0x7f,0x87,0x86,0x97,0x24,0xf5,  /* 0x34 - 1152x768 */
+-  0x02,0x88,0xff,0xff,0x25,0x10,0x00,0x02,
+-  0x01}},
+-#endif
+- {{0xa3,0x8f,0x8f,0x97,0x96,0x97,0x24,0xf5,  /* 0x34 - 1152x768 - TW: corrected */
++ {{0xa3,0x8f,0x8f,0x97,0x96,0x97,0x24,0xf5,  /* 0x34 - 1152x768 - corrected */
+   0x02,0x88,0xff,0xff,0x25,0x10,0x00,0x02,
+   0x01}},
+- {{0x7f,0x63,0x63,0x83,0x6c,0x1c,0x72,0xba,  /* 0x35 - NEW 16:9 modes, not in BIOS ------ */
++ {{0x7f,0x63,0x63,0x83,0x6c,0x1c,0x72,0xba,  /* 0x35 */
+    0x27,0x8b,0xdf,0xdf,0x73,0x00,0x00,0x06,
+    0x01}}, /* 0x35 */
+  {{0x7f,0x63,0x63,0x83,0x69,0x13,0x6f,0xba,
+@@ -864,7 +538,7 @@ static const SiS300_CRT1TableStruct  SiS
+  {{0x9f,0x7f,0x7f,0x83,0x85,0x91,0x1e,0xf1,
+    0xad,0x81,0x3f,0x3f,0x1f,0x30,0x00,0x02,
+    0x01}}, /* 0x39 */
+- {{0xa7,0x7f,0x7f,0x88,0x89,0x95,0x26,0xf1,   	/* TW: 95 was 15 - illegal HBE! */
++ {{0xa7,0x7f,0x7f,0x88,0x89,0x95,0x26,0xf1,  /* 95 was 15 - illegal HBE! */
+    0xb1,0x85,0x3f,0x3f,0x27,0x30,0x00,0x02,
+    0x01}}, /* 0x3a */
+  {{0xce,0x9f,0x9f,0x92,0xa9,0x17,0x28,0xc4,
+@@ -875,36 +549,40 @@ static const SiS300_CRT1TableStruct  SiS
+    0x01}}, /* 0x3c */
+  {{0xd3,0x9f,0x9f,0x97,0xab,0x1f,0x2e,0xd4,
+    0x7d,0x81,0xcf,0xcf,0x2f,0x21,0x00,0x07,
+-   0x01}}, /* 0x3d */			     /* TW: End of 16:9 modes --------------- */
+- {{0xc3,0x8f,0x8f,0x87,0x9b,0x0b,0x82,0xef,  /* TW: New, 1152x864-75 (not in any BIOS)   */
++   0x01}}, /* 0x3d */
++ {{0xc3,0x8f,0x8f,0x87,0x9b,0x0b,0x82,0xef,  /* 1152x864-75 */
+    0x60,0x83,0x5f,0x5f,0x83,0x10,0x00,0x07,
+    0x01}},  /* 0x3e */
+- {{0x86,0x69,0x69,0x8A,0x74,0x06,0x8C,0x15,  /* TW: New, 848x480-38i, not in BIOS */
++ {{0x86,0x69,0x69,0x8A,0x74,0x06,0x8C,0x15,  /* 848x480-38i */
+    0x4F,0x83,0xEF,0xEF,0x8D,0x30,0x00,0x02,
+    0x00}}, /* 0x3f */
+-#if 0
+- {{0x81,0x69,0x69,0x85,0x70,0x00,0x0F,0x3E,  /* TW: New, 848x480-60, not in BIOS - incorrect for Philips panel */
+-   0xEB,0x8E,0xDF,0xDF,0x10,0x00,0x00,0x02,
+-   0x00}}, /* 0x40 */
+-#endif
+- {{0x83,0x69,0x69,0x87,0x6f,0x1d,0x03,0x3E,  /* TW: New, 848x480-60, not in BIOS */
++ {{0x83,0x69,0x69,0x87,0x6f,0x1d,0x03,0x3E,  /* 848x480-60  */
+    0xE5,0x8d,0xDF,0xe4,0x04,0x00,0x00,0x06,
+    0x00}}, /* 0x40 */
+- {{0x86,0x6A,0x6A,0x8A,0x74,0x06,0x8C,0x15,  /* TW: New, 856x480-38i, not in BIOS */
++ {{0x86,0x6A,0x6A,0x8A,0x74,0x06,0x8C,0x15,  /* 856x480-38i */
+    0x4F,0x83,0xEF,0xEF,0x8D,0x30,0x00,0x02,
+    0x00}}, /* 0x41 */
+- {{0x81,0x6A,0x6A,0x85,0x70,0x00,0x0F,0x3E,  /* TW: New, 856x480-60, not in BIOS */
++ {{0x81,0x6A,0x6A,0x85,0x70,0x00,0x0F,0x3E,  /* 856x480-60  */
+    0xEB,0x8E,0xDF,0xDF,0x10,0x00,0x00,0x02,
+    0x00}}, /* 0x42 */
+- {{0xdd,0xa9,0xa9,0x81,0xb4,0x97,0x26,0xfd,  /* TW: New, 1360x768-60, not in BIOS */
++ {{0xdd,0xa9,0xa9,0x81,0xb4,0x97,0x26,0xfd,  /* 1360x768-60 */
+    0x01,0x8d,0xff,0x00,0x27,0x10,0x00,0x03,
+    0x01}}, /* 0x43 */
+- {{0xd9,0x8f,0x8f,0x9d,0xba,0x0a,0x8a,0xff,  /* TW: New, 1152x864-84 (not in any BIOS)   */
++ {{0xd9,0x8f,0x8f,0x9d,0xba,0x0a,0x8a,0xff,  /* 1152x864-84 */
+    0x60,0x8b,0x5f,0x5f,0x8b,0x10,0x00,0x03,
+-   0x01}}, /* 0x44 */   
+- {{0xd3,0x9f,0x9f,0x97,0xab,0x1f,0xf1,0xff,  /* TW: New, 1280x960-85 (not in any BIOS)   */
++   0x01}}, /* 0x44 */
++ {{0xd3,0x9f,0x9f,0x97,0xab,0x1f,0xf1,0xff,  /* 1280x960-85 */
+    0xc0,0x83,0xbf,0xbf,0xf2,0x10,0x00,0x07,
+-   0x01}}  /* 0x45 */
++   0x01}}, /* 0x45 */
++ {{0xce,0x9f,0x9f,0x92,0xa9,0x17,0x20,0xf5,  /* 1280x768-60 */
++   0x03,0x88,0xff,0xff,0x21,0x10,0x00,0x07,
++   0x01}},  /* 0x46 */
++ {{0x7b,0x5f,0x63,0x9f,0x6a,0x93,0x6f,0xf0,  /* 768x576 */
++   0x58,0x8a,0x3f,0x57,0x70,0x20,0x00,0x05,
++   0x01}},  /* 0x47 */
++ {{0xce,0xa9,0xa9,0x92,0xb1,0x07,0x28,0x52,  /* 1360x1024 (Barco iQ Pro R300) */
++   0x02,0x8e,0xff,0x00,0x29,0x0d,0x00,0x03,
++   0x00}}   /* 0x48 */
+ };
+ 
+ typedef struct _SiS300_MCLKDataStruct
+@@ -913,8 +591,8 @@ typedef struct _SiS300_MCLKDataStruct
+ 	USHORT CLOCK;
+ } SiS300_MCLKDataStruct;
+ 
+-static const SiS300_MCLKDataStruct  SiS300_MCLKData_630[] =	/* 630 */
+-{ /* TW: at 0x54 in BIOS */
++static const SiS300_MCLKDataStruct  SiS300_MCLKData_630[] =
++{
+ 	{ 0x5a,0x64,0x80, 66},
+ 	{ 0xb3,0x45,0x80, 83},
+ 	{ 0x37,0x61,0x80,100},
+@@ -925,8 +603,8 @@ static const SiS300_MCLKDataStruct  SiS3
+ 	{ 0x37,0x61,0x80,100}
+ };
+ 
+-static const SiS300_MCLKDataStruct  SiS300_MCLKData_300[] =  /* 300 */
+-{ /* TW: at 0x54 in BIOS */
++static const SiS300_MCLKDataStruct  SiS300_MCLKData_300[] =
++{
+ 	{ 0x68,0x43,0x80,125},
+ 	{ 0x68,0x43,0x80,125},
+ 	{ 0x68,0x43,0x80,125},
+@@ -937,6 +615,7 @@ static const SiS300_MCLKDataStruct  SiS3
+ 	{ 0x37,0x61,0x80,100}
+ };
+ 
++#ifdef LINUXBIOS
+ typedef struct _SiS300_ECLKDataStruct
+ {
+ 	UCHAR SR2E,SR2F,SR30;
+@@ -954,6 +633,7 @@ static const SiS300_ECLKDataStruct  SiS3
+ 	{ 0x54,0x43,0x80,100},
+ 	{ 0x54,0x43,0x80,100}
+ };
++#endif
+ 
+ typedef struct _SiS300_VCLKDataStruct
+ {
+@@ -964,71 +644,77 @@ typedef struct _SiS300_VCLKDataStruct
+ static const SiS300_VCLKDataStruct  SiS300_VCLKData[] =
+ {
+ 	{ 0x1b,0xe1, 25}, /* 0x00 */
+-	{ 0x4e,0xe4, 28},
++	{ 0x4e,0xe4, 28}, /* 0x01 */
+ 	{ 0x57,0xe4, 32}, /* 0x02 */
+-	{ 0xc3,0xc8, 36},
++	{ 0xc3,0xc8, 36}, /* 0x03 */
+ 	{ 0x42,0xc3, 40}, /* 0x04 */
+-	{ 0x5d,0xc4, 45},
++	{ 0x5d,0xc4, 45}, /* 0x05 */
+ 	{ 0x52,0x65, 50}, /* 0x06 */
+-	{ 0x53,0x65, 50},
++	{ 0x53,0x65, 50}, /* 0x07 */
+ 	{ 0x6d,0x66, 56}, /* 0x08 */
+-	{ 0x5a,0x64, 65},
++	{ 0x5a,0x64, 65}, /* 0x09 */
+ 	{ 0x46,0x44, 68}, /* 0x0a */
+-	{ 0x3e,0x43, 75},
+-	{ 0x6d,0x46, 76}, /* 0x0c: 800x600 | LVDS_2(CH), MITAC(CH);  - 730, A901(301B): 0xb1,0x46, 76 */
+-	{ 0x41,0x43, 79},
++	{ 0x3e,0x43, 75}, /* 0x0b */
++	{ 0x6d,0x46, 76}, /* 0x0c */  /* 800x600 | LVDS_2(CH), MITAC(CH);  - 730, A901(301B): 0xb1,0x46, 76 */
++	{ 0x41,0x43, 79}, /* 0x0d */
+ 	{ 0x31,0x42, 79}, /* 0x0e */
+-	{ 0x46,0x25, 85},
++	{ 0x46,0x25, 85}, /* 0x0f */
+ 	{ 0x78,0x29, 87}, /* 0x10 */
+-	{ 0x62,0x44, 95},
++	{ 0x62,0x44, 95}, /* 0x11 */
+ 	{ 0x2b,0x22,105}, /* 0x12 */
+-	{ 0x49,0x24,106},
++	{ 0x49,0x24,106}, /* 0x13 */
+ 	{ 0xc3,0x28,108}, /* 0x14 */
+-	{ 0x3c,0x23,109},
++	{ 0x3c,0x23,109}, /* 0x15 */
+ 	{ 0xf7,0x2c,132}, /* 0x16 */
+-	{ 0xd4,0x28,136},
++	{ 0xd4,0x28,136}, /* 0x17 */
+ 	{ 0x41,0x05,158}, /* 0x18 */
+-	{ 0x43,0x05,162},
++	{ 0x43,0x05,162}, /* 0x19 */
+ 	{ 0xe1,0x0f,175}, /* 0x1a */
+ 	{ 0xfc,0x12,189}, /* 0x1b */
+ 	{ 0xde,0x26,194}, /* 0x1c */
+-	{ 0x54,0x05,203},
++	{ 0x54,0x05,203}, /* 0x1d */
+ 	{ 0x3f,0x03,230}, /* 0x1e */
+-	{ 0x30,0x02,234},
++	{ 0x30,0x02,234}, /* 0x1f */
+ 	{ 0x24,0x01,266}, /* 0x20 */
+-	{ 0x52,0x2a, 54}, /* 301 TV */
+-	{ 0x52,0x6a, 27}, /* 301 TV */
+-	{ 0x62,0x24, 70}, /* 301 TV */
+-	{ 0x62,0x64, 70}, /* 301 TV */
+-	{ 0xa8,0x4c, 30}, /* 301 TV */
+-	{ 0x20,0x26, 33}, /* 301 TV */
+-	{ 0x31,0xc2, 39},
+-	{ 0xbf,0xc8, 35}, /* 0x28 - 856x480 */
+-	{ 0x60,0x36, 30}, /* 0x29  CH/UNTSC TEXT | LVDS_2(CH) - 730, A901(301B), Mitac(CH): 0xe0, 0xb6, 30 */
+-	{ 0x40,0x4a, 28},
+-	{ 0x9f,0x46, 44},
+-	{ 0x97,0x2c, 26},
+-	{ 0x44,0xe4, 25},
+-	{ 0x7e,0x32, 47},
+-	{ 0x8a,0x24, 31}, /* 0x2f  CH/PAL TEXT | LVDS_2(CH), Mitac(CH) -  730, A901(301B): 0x57, 0xe4, 31 */
+-	{ 0x97,0x2c, 26},
+-	{ 0xce,0x3c, 39},
+-	{ 0x52,0x4a, 36}, /* 0x32  CH/PAL 800x600 5/6 */
+-	{ 0x34,0x61, 95},
+-	{ 0x78,0x27,108},
+-	{ 0xce,0x25,189}, /* 0x35 */
+-	{ 0x45,0x6b, 21}, /* 0x36 */  /* TW: Added from Mitac */
+-	{ 0x52,0xe2, 49}, /* 0x37 - added for 16:9 modes (not in any BIOS) */
+-	{ 0x2b,0x61, 78}, /* 0x38 - added for 16:9 modes (not in any BIOS) */
+-	{ 0x70,0x44,108}, /* 0x39 - added for 16:9 modes (not in any BIOS) */
+-	{ 0x54,0x42,135}, /* 0x3a - added for 16:9 modes (not in any BIOS) */
+-	{ 0x41,0x22,157}, /* 0x3b - added for 16:9 modes (not in any BIOS) */
+-	{ 0x52,0x07,149}, /* 0x3c - added for 1280x960-85 (not in any BIOS)*/
+-	{ 0x62,0xc6, 34}, /* 0x3d - added for 848x480-60 (not in any BIOS) */
+-	{ 0x30,0x23, 88}, /* 0x3e - added for 1360x768-60 (not in any BIOS)*/
+-	{ 0x3f,0x64, 46}, /* 0x3f - added for 640x480-100 (not in any BIOS)*/
+-	{ 0x72,0x2a, 76}, /* 0x40 - test for SiS730 */
+-	{ 0x15,0x21, 79}, /* 0x41 - test for SiS730 */
++	{ 0x52,0x2a, 54}, /* 0x21 */  /* 301 TV */
++	{ 0x52,0x6a, 27}, /* 0x22 */  /* 301 TV */
++	{ 0x62,0x24, 70}, /* 0x23 */  /* 301 TV */
++	{ 0x62,0x64, 70}, /* 0x24 */  /* 301 TV */
++	{ 0xa8,0x4c, 30}, /* 0x25 */  /* 301 TV */
++	{ 0x20,0x26, 33}, /* 0x26 */  /* 301 TV */
++	{ 0x31,0xc2, 39}, /* 0x27 */
++	{ 0xbf,0xc8, 35}, /* 0x28 */  /* 856x480 */
++	{ 0x60,0x36, 30}, /* 0x29 */  /* CH/UNTSC TEXT | LVDS_2(CH) - 730, A901(301B), Mitac(CH): 0xe0, 0xb6, 30 */
++	{ 0x40,0x4a, 28}, /* 0x2a */
++	{ 0x9f,0x46, 44}, /* 0x2b */
++	{ 0x97,0x2c, 26}, /* 0x2c */
++	{ 0x44,0xe4, 25}, /* 0x2d */
++	{ 0x7e,0x32, 47}, /* 0x2e */
++	{ 0x8a,0x24, 31}, /* 0x2f */  /* CH/PAL TEXT | LVDS_2(CH), Mitac(CH) -  730, A901(301B): 0x57, 0xe4, 31 */
++	{ 0x97,0x2c, 26}, /* 0x30 */
++	{ 0xce,0x3c, 39}, /* 0x31 */
++	{ 0x52,0x4a, 36}, /* 0x32 */  /* CH/PAL 800x600 5/6 */
++	{ 0x34,0x61, 95}, /* 0x33 */
++	{ 0x78,0x27,108}, /* 0x34 */  /* Replacement for index 0x14 for 630 (?) */
++	{ 0xce,0x25,189}, /* 0x35 */  /* Replacement for index 0x1b for 730 (and 540?) */
++	{ 0x45,0x6b, 21}, /* 0x36 */
++	{ 0x52,0xe2, 49}, /* 0x37 */  /* 16:9 modes  */
++	{ 0x2b,0x61, 78}, /* 0x38 */  /* 16:9 modes  */
++	{ 0x70,0x44,108}, /* 0x39 */  /* 16:9 modes  */
++	{ 0x54,0x42,135}, /* 0x3a */  /* 16:9 modes  */
++	{ 0x41,0x22,157}, /* 0x3b */  /* 16:9 modes  */
++	{ 0x52,0x07,149}, /* 0x3c */  /* 1280x960-85 */
++	{ 0x62,0xc6, 34}, /* 0x3d */  /* 848x480-60  */
++	{ 0x30,0x23, 88}, /* 0x3e */  /* 1360x768-60 */
++#if 0
++	{ 0x3f,0x64, 46}, /* 0x3f */  /* 640x480-100 */
++#endif
++        { 0x70,0x29, 81}, /* 0x3f */  /* 1280x768-60 */
++	{ 0x72,0x2a, 76}, /* 0x40 */  /* test for SiS730 */
++	{ 0x15,0x21, 79}, /* 0x41 */  /* test for SiS730 */
++	{ 0xa1,0x42,108}, /* 0x42 */  /* 1280x960 LCD */
++	{ 0x37,0x61,100}, /* 0x43 */  /* 1280x960 LCD */
++	{ 0xe3,0x9a,106}, /* 0x44 */  /* 1360x1024 - special for Barco iQ R300 */
+ 	{ 0xff,0x00,  0}   
+ };
+ 
+@@ -1089,66 +775,10 @@ static const SiS300_VCLKDataStruct  SiS3
+ static const UCHAR  SiS300_ScreenOffset[] =
+ {
+ 	0x14,0x19,0x20,0x28,0x32,0x40,0x50,
+-        0x64,0x78,0x80,0x2d,0x35,0x48,0x35,  /* 0x35 for 848 and 856 */
+-	0x55,0xff			     /* 0x55 for 1360 */	
++        0x64,0x78,0x80,0x2d,0x35,0x48,0x35,
++	0x55,0x30,0xff
+ };
+ 
+-typedef struct _SiS300_StResInfoStruct
+-{
+-	USHORT HTotal;
+-	USHORT VTotal;
+-} SiS300_StResInfoStruct;
+-
+-static const SiS300_StResInfoStruct  SiS300_StResInfo[] =
+-{
+-	{ 640,400},
+-	{ 640,350},
+-	{ 720,400},
+-	{ 720,350},
+-	{ 640,480}
+-};
+-
+-typedef struct _SiS300_ModeResInfoStruct
+-{
+-	USHORT HTotal;
+-	USHORT VTotal;
+-	UCHAR  XChar;
+-	UCHAR  YChar;
+-} SiS300_ModeResInfoStruct;
+-
+-static const SiS300_ModeResInfoStruct  SiS300_ModeResInfo[] =
+-{
+-	{  320, 200, 8, 8},  /* 0x00 */
+-	{  320, 240, 8, 8},  /* 0x01 */
+-	{  320, 400, 8, 8},  /* 0x02 */
+-	{  400, 300, 8, 8},  /* 0x03 */
+-	{  512, 384, 8, 8},  /* 0x04 */
+-	{  640, 400, 8,16},  /* 0x05 */
+-	{  640, 480, 8,16},  /* 0x06 */
+-	{  800, 600, 8,16},  /* 0x07 */
+-	{ 1024, 768, 8,16},  /* 0x08 */
+-	{ 1280,1024, 8,16},  /* 0x09 */
+-	{ 1600,1200, 8,16},  /* 0x0a */
+-	{ 1920,1440, 8,16},  /* 0x0b */
+-	{  720, 480, 8,16},  /* 0x0c */
+-	{  720, 576, 8,16},  /* 0x0d */
+-	{ 1280, 960, 8,16},  /* 0x0e */
+-	{ 1024, 600, 8,16},  /* 0x0f */
+-	{ 1152, 768, 8,16},  /* 0x10 */
+-	{ 2048,1536, 8,16},  /* 0x11 - TW: Not in BIOS! */
+-	{  800, 480, 8,16},  /* 0x12 - TW: New, not in any BIOS */
+-	{ 1024, 576, 8,16},  /* 0x13 - TW: New, not in any BIOS */
+-	{ 1280, 720, 8,16},  /* 0x14 - TW: New, not in any BIOS */
+-	{ 1152, 864, 8,16},  /* 0x15 - TW: New, not in any BIOS */
+-	{  848, 480, 8,16},  /* 0x16 - TW: New, not in any BIOS */
+-	{  856, 480, 8,16},  /* 0x17 - TW: New, not in any BIOS */
+-	{ 1360, 768, 8,16}   /* 0x18 - TW: New, not in any BIOS */
+-};
+-
+-static const UCHAR SiS300_OutputSelect = 0x40;
+-
+-static const UCHAR SiS300_SoftSetting  = 0x30;
+-
+ #ifndef LINUX_XF86
+ static UCHAR SiS300_SR07 = 0x10;
+ #endif
+@@ -1183,7 +813,7 @@ static UCHAR SiS300_CRT2Data_4_10 = 0x80
+ static const USHORT SiS300_RGBSenseData = 0xd1;
+ static const USHORT SiS300_VideoSenseData = 0xb3;
+ static const USHORT SiS300_YCSenseData = 0xb9;
+-static const USHORT SiS300_RGBSenseData2 = 0x0190;     /*301b*/
++static const USHORT SiS300_RGBSenseData2 = 0x0190;
+ static const USHORT SiS300_VideoSenseData2 = 0x0174;
+ static const USHORT SiS300_YCSenseData2 = 0x016b;
+ 
+@@ -1192,15 +822,6 @@ static const UCHAR SiS300_CR40[5][4];
+ static UCHAR SiS300_CR49[2];
+ #endif
+ 
+-static const UCHAR SiS300_NTSCPhase[]  = {0x21,0xed,0xba,0x08};  /* TW: Was {0x21,0xed,0x8a,0x08}; */
+-static const UCHAR SiS300_PALPhase[]   = {0x2a,0x05,0xe3,0x00};  /* TW: Was {0x2a,0x05,0xd3,0x00};  */
+-static const UCHAR SiS300_PALMPhase[]  = {0x21,0xE4,0x2E,0x9B};  /* palmn */
+-static const UCHAR SiS300_PALNPhase[]  = {0x21,0xF4,0x3E,0xBA};
+-static const UCHAR SiS300_NTSCPhase2[] = {0x21,0xF0,0x7B,0xD6};  /* 301b */
+-static const UCHAR SiS300_PALPhase2[]  = {0x2a,0x09,0x86,0xe9};  /* 301b */
+-static const UCHAR SiS300_PALMPhase2[] = {0x21,0xE6,0xEF,0xA4}; /* TW: palm 301b*/
+-static const UCHAR SiS300_PALNPhase2[] = {0x21,0xF6,0x94,0x46}; /* TW: paln 301b*/
+-
+ typedef struct _SiS300_PanelDelayTblStruct
+ {
+ 	UCHAR timer[2];
+@@ -1208,7 +829,7 @@ typedef struct _SiS300_PanelDelayTblStru
+ 
+ static const SiS300_PanelDelayTblStruct  SiS300_PanelDelayTbl[] =
+ {
+-	{{0x05,0xaa}}, /* TW: From 2.04.5a */
++	{{0x05,0xaa}},
+ 	{{0x05,0x14}},
+ 	{{0x05,0x36}},
+ 	{{0x05,0x14}},
+@@ -1355,309 +976,6 @@ static const SiS300_LCDDataStruct  SiS30
+ 	{    1,   1,1688,1066,1688,1066}
+ };
+ 
+-static const SiS300_LCDDataStruct  SiS300_LCD1280x960Data[] =
+-{
+-	{    9,   2, 800, 500,1800,1000},
+-	{    9,   2, 800, 500,1800,1000},
+-	{    4,   1, 900, 500,1800,1000},
+-	{    4,   1, 900, 500,1800,1000},
+-	{    9,   2, 800, 500,1800,1000},
+-	{   30,  11,1056, 625,1800,1000},
+-	{    5,   3,1350, 800,1800,1000},
+-	{    1,   1,1576,1050,1576,1050},
+-	{    1,   1,1800,1000,1800,1000}
+-};
+-
+-static const SiS300_LCDDataStruct  SiS300_ExtLCD1400x1050Data[] =  /* TW: New */
+-{
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    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 const SiS300_LCDDataStruct  SiS300_ExtLCD1600x1200Data[] =  /* TW: New */
+-{
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    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 const SiS300_LCDDataStruct  SiS300_StLCD1400x1050Data[] =  /* TW: New */
+-{
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    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 const SiS300_LCDDataStruct  SiS300_StLCD1600x1200Data[] =  /* TW: New */
+-{
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    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 const SiS300_LCDDataStruct  SiS300_NoScaleData1400x1050[] =  /* TW: New */
+-{
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    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 const SiS300_LCDDataStruct  SiS300_NoScaleData1600x1200[] =  /* TW: New */
+-{
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0},
+-	{    0,   0,   0,   0,   0,   0}
+-};
+-
+-
+-typedef struct _SiS300_TVDataStruct
+-{
+-	USHORT RVBHCMAX;
+-	USHORT RVBHCFACT;
+-	USHORT VGAHT;
+-	USHORT VGAVT;
+-	USHORT TVHDE;
+-	USHORT TVVDE;
+-	USHORT RVBHRS;
+-	UCHAR FlickerMode;
+-	USHORT HALFRVBHRS;
+-	UCHAR RY1COE;
+-	UCHAR RY2COE;
+-	UCHAR RY3COE;
+-	UCHAR RY4COE;
+-} SiS300_TVDataStruct;
+-
+-static const SiS300_TVDataStruct  SiS300_StPALData[] =
+-{
+-	{    1,   1, 864, 525,1270, 400, 100,   0, 760,0xf4,0xff,0x1c,0x22},
+-	{    1,   1, 864, 525,1270, 350, 100,   0, 760,0xf4,0xff,0x1c,0x22},
+-	{    1,   1, 864, 525,1270, 400,   0,   0, 720,0xf1,0x04,0x1f,0x18},
+-	{    1,   1, 864, 525,1270, 350,   0,   0, 720,0xf4,0x0b,0x1c,0x0a},
+-	{    1,   1, 864, 525,1270, 480,  50,   0, 760,0xf4,0xff,0x1c,0x22},
+-	{    1,   1, 864, 525,1270, 600,  50,   0,   0,0xf4,0xff,0x1c,0x22}
+-};
+-
+-static const SiS300_TVDataStruct  SiS300_ExtPALData[] =
+-{
+-	{   27,  10, 848, 448,1270, 530,  50,   0,  50,0xf4,0xff,0x1c,0x22},
+-	{  108,  35, 848, 398,1270, 530,  50,   0,  50,0xf4,0xff,0x1c,0x22},
+-	{   12,   5, 954, 448,1270, 530,  50,   0,  50,0xf1,0x04,0x1f,0x18},
+-	{    9,   4, 960, 463,1644, 438,  50,   0,  50,0xf4,0x0b,0x1c,0x0a},
+-	{    9,   4, 848, 528,1270, 530,   0,   0,  50,0xf5,0xfb,0x1b,0x2a},
+-	{   36,  25,1060, 648,1316, 530, 438,   0, 438,0xeb,0x05,0x25,0x16},
+-	{    3,   2,1080, 619,1270, 540, 438,   0, 438,0xf3,0x00,0x1d,0x20},
+-	{    1,   1,1170, 821,1270, 520, 686,   0, 686,0xF3,0x00,0x1D,0x20}
+-
+-};
+-
+-static const SiS300_TVDataStruct  SiS300_StNTSCData[] =
+-{
+-	{    1,   1, 858, 525,1270, 400,  50,   0, 760,0xf1,0x04,0x1f,0x18},
+-	{    1,   1, 858, 525,1270, 350,  50,   0, 640,0xf1,0x04,0x1f,0x18},
+-	{    1,   1, 858, 525,1270, 400,   0,   0, 720,0xf1,0x04,0x1f,0x18},
+-	{    1,   1, 858, 525,1270, 350,   0,   0, 720,0xf4,0x0b,0x1c,0x0a},
+-	{    1,   1, 858, 525,1270, 480,   0,   0, 760,0xf1,0x04,0x1f,0x18}
+-};
+-
+-static const SiS300_TVDataStruct  SiS300_ExtNTSCData[] =
+-{
+-	{  143,  65, 858, 443,1270, 440, 171,   0, 171,0xf1,0x04,0x1f,0x18},
+-	{   88,  35, 858, 393,1270, 440, 171,   0, 171,0xf1,0x04,0x1f,0x18},
+-	{  143,  70, 924, 443,1270, 440,  92,   0,  92,0xf1,0x04,0x1f,0x18},
+-	{  143,  70, 924, 393,1270, 440,  92,   0,  92,0xf4,0x0b,0x1c,0x0a},
+-	{  143,  76, 836, 523,1270, 440, 224,   0,   0,0xf1,0x05,0x1f,0x16},
+-	{  143, 120,1056, 643,1270, 440,   0, 128,   0,0xf4,0x10,0x1c,0x00},
+-	{  143,  76, 836, 523,1270, 440,   0, 128,   0,0xee,0x0c,0x22,0x08},
+-	{   65,  64,1056, 791,1270, 480, 638,   0,   0,0xf1,0x04,0x1f,0x18}
+-};
+-
+-#if 0
+-static const SiS300_TVDataStruct  SiS300_St1HiTVData[]=
+-{
+-  
+-};
+-#endif
+-
+-static const SiS300_TVDataStruct  SiS300_St2HiTVData[]=
+-{
+- {    3,   1, 0x348,0x1e3,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
+- {    1,   1, 0x37c,0x233,0x2b2,0x2bc, 	  0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    3,   1, 0x348,0x1e3,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
+- {    1,   1, 0x3e8,0x233,0x311,0x2bc,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    5,   2, 0x348,0x233,0x670,0x3c0,0x08d,128, 0, 0x00,0x00,0x00,0x00},
+- {    8,   5, 0x41a,0x2ab,0x670,0x3c0,0x17c,128, 0, 0x00,0x00,0x00,0x00}
+-};
+-
+-static const SiS300_TVDataStruct  SiS300_ExtHiTVData[]=
+-{
+- {    6,   1, 0x348,0x233,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    3,   1, 0x3c0,0x233,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    3,   1, 0x348,0x1e3,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    3,   1, 0x3c0,0x233,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    5,   1, 0x348,0x233,0x670,0x3c0,0x166,128, 0, 0x00,0x00,0x00,0x00},
+- {   16,   5, 0x41a,0x2ab,0x670,0x3c0,0x143,128, 0, 0x00,0x00,0x00,0x00},
+- {   25,  12, 0x4ec,0x353,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
+- {    5,   4, 0x627,0x464,0x670,0x3c0,0x128,  0, 0, 0x00,0x00,0x00,0x00},
+- {    4,   1, 0x41a,0x233,0x670,0x3c0,0x143,128, 0, 0x00,0x00,0x00,0x00},
+- {    5,   2, 0x578,0x293,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
+- {    8,   5, 0x6d6,0x323,0x670,0x3c0,0x128,  0, 0, 0x00,0x00,0x00,0x00}
+-};
+-
+-static const UCHAR SiS300_NTSCTiming[] =
+-{
+-	0x17,0x1d,0x03,0x09,0x05,0x06,0x0c,0x0c,
+-	0x94,0x49,0x01,0x0a,0x06,0x0d,0x04,0x0a,
+-	0x06,0x14,0x0d,0x04,0x0a,0x00,0x85,0x1b,
+-	0x0c,0x50,0x00,0x97,0x00,0xda,0x4a,0x17,  /* (in 2.06.50) */
+-/*	0x0c,0x50,0x00,0x99,0x00,0xec,0x4a,0x17,     (in 2.04.5a) */
+-	0x7d,0x05,0x4b,0x00,0x00,0xe2,0x00,0x02,  /* (in 2.06.50) */
+-/*	0x88,0x00,0x4b,0x00,0x00,0xe2,0x00,0x02,     (in 2.04.5a) */
+-	0x03,0x0a,0x65,0x9d,0x08,0x92,0x8f,0x40,
+-	0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x50,
+-	0x00,0x40,0x44,0x00,0xdb,0x02,0x3b,0x00
+-};
+-
+-static const UCHAR SiS300_PALTiming[] =
+-{
+-	0x19,0x52,0x35,0x6e,0x04,0x38,0x3d,0x70,
+-	0x94,0x49,0x01,0x12,0x06,0x3e,0x35,0x6d,
+-	0x06,0x14,0x3e,0x35,0x6d,0x00,0x45,0x2b,
+-        0x70,0x50,0x00,0x9b,0x00,0xd9,0x5d,0x17,  /* (in 2.06.50) */
+-/*	0x70,0x50,0x00,0x97,0x00,0xd7,0x5d,0x17,     (in 2.04.5a) */
+-	0x7d,0x05,0x45,0x00,0x00,0xe8,0x00,0x02,  /* (in 2.06.50) */
+-/*	0x88,0x00,0x45,0x00,0x00,0xe8,0x00,0x02,     (in 2.04.5a) */
+-	0x0d,0x00,0x68,0xb0,0x0b,0x92,0x8f,0x40,
+-	0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x63,
+-	0x00,0x40,0x3e,0x00,0xe1,0x02,0x28,0x00
+-};
+-
+-static const UCHAR SiS300_HiTVExtTiming[] =	 /* TW: New */
+-{
+-        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x64,
+-	0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
+-	0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
+-	0x64,0x90,0x33,0x8c,0x18,0x36,0x3e,0x13,
+-	0x2a,0xde,0x2a,0x44,0x40,0x2a,0x44,0x40,
+-	0x8e,0x8e,0x82,0x07,0x0b,0x92,0x0f,0x40,
+-	0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x3d,
+-	0x63,0x4f,0x27,0x00,0xfc,0xff,0x6a,0x00
+-};
+-
+-static const UCHAR SiS300_HiTVSt1Timing[] =   	/* TW: New */
+-{
+-        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x65,
+-	0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
+-	0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
+-	0x65,0x90,0x7b,0xa8,0x03,0xf0,0x87,0x03,
+-	0x11,0x15,0x11,0xcf,0x10,0x11,0xcf,0x10,
+-	0x35,0x35,0x3b,0x69,0x1d,0x92,0x0f,0x40,
+-	0x60,0x80,0x14,0x90,0x8c,0x60,0x04,0x86,
+-	0xaf,0x5d,0x0e,0x00,0xfc,0xff,0x2d,0x00
+-};
+-
+-static const UCHAR SiS300_HiTVSt2Timing[] =	/* TW: New */
+-{
+-        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x64,
+-	0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
+-	0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
+-	0x64,0x90,0x33,0x8c,0x18,0x36,0x3e,0x13,
+-	0x2a,0xde,0x2a,0x44,0x40,0x2a,0x44,0x40,
+-	0x8e,0x8e,0x82,0x07,0x0b,0x92,0x0f,0x40,
+-	0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x3d,
+-	0x63,0x4f,0x27,0x00,0xfc,0xff,0x6a,0x00
+-};
+-
+-static const UCHAR SiS300_HiTVTextTiming[] =   	/* TW: New */
+-{
+-        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x65,
+-	0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
+-	0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
+-	0x65,0x90,0xe7,0xbc,0x03,0x0c,0x97,0x03,
+-	0x14,0x78,0x14,0x08,0x20,0x14,0x08,0x20,
+-	0xc8,0xc8,0x3b,0xd2,0x26,0x92,0x0f,0x40,
+-        0x60,0x80,0x14,0x90,0x8c,0x60,0x04,0x96,
+-	0x72,0x5c,0x11,0x00,0xfc,0xff,0x32,0x00
+-};
+-
+-static const UCHAR SiS300_HiTVGroup3Data[] =   	/* TW: New */
+-{
+-        0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0x5f,
+-	0x05,0x21,0xb2,0xb2,0x55,0x77,0x2a,0xa6,
+-	0x25,0x2f,0x47,0xfa,0xc8,0xff,0x8e,0x20,
+-	0x8c,0x6e,0x60,0x2e,0x58,0x48,0x72,0x44,
+-	0x56,0x36,0x4f,0x6e,0x3f,0x80,0x00,0x80,
+-	0x4f,0x7f,0x03,0xa8,0x7d,0x20,0x1a,0xa9,
+-	0x14,0x05,0x03,0x7e,0x64,0x31,0x14,0x75,
+-	0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
+-};
+-
+-static const UCHAR SiS300_HiTVGroup3Simu[] =   	/* TW: New */
+-{
+-        0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0x95,
+-	0xdb,0x20,0xb8,0xb8,0x55,0x47,0x2a,0xa6,
+-	0x25,0x2f,0x47,0xfa,0xc8,0xff,0x8e,0x20,
+-	0x8c,0x6e,0x60,0x15,0x26,0xd3,0xe4,0x11,
+-	0x56,0x36,0x4f,0x6e,0x3f,0x80,0x00,0x80,
+-	0x67,0x36,0x01,0x47,0x0e,0x10,0xbe,0xb4,
+-	0x01,0x05,0x03,0x7e,0x65,0x31,0x14,0x75,
+-	0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
+-};
+-
+-static const UCHAR SiS300_HiTVGroup3Text[] =   	/* TW: New */
+-{
+-        0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0xa7,
+-	0xf5,0x20,0xce,0xce,0x55,0x47,0x2a,0xa6,
+-	0x25,0x2f,0x47,0xfa,0xc8,0xff,0x8e,0x20,
+-	0x8c,0x6e,0x60,0x18,0x2c,0x0c,0x20,0x22,
+-	0x56,0x36,0x4f,0x6e,0x3f,0x80,0x00,0x80,
+-	0x93,0x3c,0x01,0x50,0x2f,0x10,0xf4,0xca,
+-	0x01,0x05,0x03,0x7e,0x65,0x31,0x14,0x75,
+-	0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
+-};
+-
+ typedef struct _SiS300_LVDSDataStruct
+ {
+ 	USHORT VGAHT;
+@@ -1666,366 +984,14 @@ typedef struct _SiS300_LVDSDataStruct
+ 	USHORT LCDVT;
+ } SiS300_LVDSDataStruct;
+ 
+-static const SiS300_LVDSDataStruct  SiS300_LVDS320x480Data_1[] =
+-{
+-	{848, 433,400, 525},
+-	{848, 389,400, 525},
+-	{848, 433,400, 525},
+-	{848, 389,400, 525},
+-	{848, 518,400, 525},
+-	{1056,628,400, 525},
+-	{400, 525,400, 525},
+-	{800, 449,1000, 644},
+-	{800, 525,1000, 635}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS800x600Data_1[] =
+-{
+-	{848, 433,1060, 629},
+-	{848, 389,1060, 629},
+-	{848, 433,1060, 629},
+-	{848, 389,1060, 629},
+-	{848, 518,1060, 629},
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628},
+-	{800, 449,1000, 644},
+-	{800, 525,1000, 635}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS800x600Data_2[] =
+-{
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628},
+-	{800, 449,1000, 644},
+-	{800, 525,1000, 635}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1024x768Data_1[] =
+-{
+-	{840, 438,1344, 806},
+-	{840, 409,1344, 806},
+-	{840, 438,1344, 806},
+-	{840, 409,1344, 806},
+-	{840, 518,1344, 806},
+-	{1050, 638,1344, 806},
+-	{1344, 806,1344, 806},
+-	{800, 449,1280, 801},
+-	{800, 525,1280, 813}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1024x768Data_2[] =
+-{
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{800, 449,1280, 801},
+-	{800, 525,1280, 813}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1280x1024Data_1[]=  
+-{	
+-	{1048, 442,1688,1066},
+-	{1048, 392,1688,1066},
+-	{1048, 442,1688,1066},
+-	{1048, 392,1688,1066},
+-	{1048, 522,1688,1066},
+-	{1208, 642,1688,1066},
+-	{1432, 810,1688,1066},
+-	{1688,1066,1688,1066}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1280x1024Data_2[]=  
+-{	
+-	{1688,1066,1688,1066},
+-	{1688,1066,1688,1066},
+-	{1688,1066,1688,1066},
+-	{1688,1066,1688,1066},
+-	{1688,1066,1688,1066},
+-	{1688,1066,1688,1066},
+-	{1688,1066,1688,1066},
+-	{1688,1066,1688,1066}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1400x1050Data_1[] =   
+-{
+-        {928, 416, 1688, 1066},
+-	{928, 366, 1688, 1066},
+-	{928, 416, 1688, 1066},
+-	{928, 366, 1688, 1066},
+-	{928, 496, 1688, 1066},
+-	{1088, 616, 1688, 1066},
+-	{1312, 784, 1688, 1066},
+-	{1568, 1040, 1688, 1066},
+-	{1688, 1066, 1688, 1066}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1400x1050Data_2[] =  
+-{
+-        {1688,1066, 1688,1066},
+-	{1688,1066, 1688,1066},
+-	{1688,1066, 1688,1066},
+-	{1688,1066, 1688,1066},
+-	{1688,1066, 1688,1066},
+-	{1688,1066, 1688,1066},
+-	{1688,1066, 1688,1066},
+-	{1688,1066, 1688,1066},
+-	{1688,1066, 1688,1066},
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1600x1200Data_1[]=  
+-{
+-        {1088, 450, 2048,1250},
+-	{1088, 400, 2048,1250},
+-	{1088, 450, 2048,1250},
+-	{1088, 400, 2048,1250},
+-	{1088, 530, 2048,1250},
+-	{1248, 650, 2048,1250},
+-	{1472, 818, 2048,1250},
+-	{1728,1066, 2048,1250},
+-	{1848,1066, 2048,1250},
+-	{2048,1250, 2048,1250}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1600x1200Data_2[]= 
+-{
+-        {2048,1250, 2048,1250},
+-	{2048,1250, 2048,1250},
+-	{2048,1250, 2048,1250},
+-	{2048,1250, 2048,1250},
+-	{2048,1250, 2048,1250},
+-	{2048,1250, 2048,1250},
+-	{2048,1250, 2048,1250},
+-	{2048,1250, 2048,1250},
+-	{2048,1250, 2048,1250},
+-	{2048,1250, 2048,1250}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1280x768Data_1[]= 
+-{	
+-	{ 768, 438, 1408, 806},
+-	{ 768, 388, 1408, 806},
+-	{ 768, 438, 1408, 806},
+-	{ 768, 388, 1408, 806},
+-	{ 768, 518, 1408, 806},
+-	{ 928, 638, 1408, 806},
+-	{1152, 806, 1408, 806},
+-	{1408, 806, 1408, 806},
+-	{1408, 806, 1408, 806}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1280x768Data_2[]=  
+-{	
+-	{1408, 806, 1408, 806},
+-	{1408, 806, 1408, 806},
+-	{1408, 806, 1408, 806},
+-	{1408, 806, 1408, 806},
+-	{1408, 806, 1408, 806},
+-	{1408, 806, 1408, 806},
+-	{1408, 806, 1408, 806},
+-	{1408, 806, 1408, 806},
+-	{1408, 806, 1408, 806}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1024x600Data_1[] =
+-{
+-	{840, 604,1344, 800},
+-	{840, 560,1344, 800},
+-	{840, 604,1344, 800},
+-	{840, 560,1344, 800},
+-	{840, 689,1344, 800},
+-	{1050, 800,1344, 800},
+-	{1344, 800,1344, 800},
+-	{800, 449,1280, 789},
+-	{800, 525,1280, 785}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1024x600Data_2[] =
+-{
+-	{1344, 800,1344, 800},
+-	{1344, 800,1344, 800},
+-	{1344, 800,1344, 800},
+-	{1344, 800,1344, 800},
+-	{1344, 800,1344, 800},
+-	{1344, 800,1344, 800},
+-	{1344, 800,1344, 800},
+-	{800, 449,1280, 801},
+-	{800, 525,1280, 813}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1152x768Data_1[] =
+-{
+-	{840, 438,1344, 806},
+-	{840, 409,1344, 806},
+-	{840, 438,1344, 806},
+-	{840, 409,1344, 806},
+-	{840, 518,1344, 806},
+-	{1050, 638,1344, 806},
+-	{1344, 806,1344, 806},
+-	{800, 449,1280, 801},
+-	{800, 525,1280, 813}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1152x768Data_2[] =
+-{
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{800, 449,1280, 801},
+-	{800, 525,1280, 813}
+-};
+-
+-/* TW: pass 1:1 data */
+-static const SiS300_LVDSDataStruct  SiS300_LVDSXXXxXXXData_1[]=  
+-{
+-        { 800, 449,  800, 449},
+-	{ 800, 449,  800, 449},
+-	{ 900, 449,  900, 449},
+-	{ 900, 449,  900, 449},
+-	{ 800, 525,  800, 525},  /*  640x480   */
+-	{1056, 628, 1056, 628},  /*  800x600   */
+-	{1344, 806, 1344, 806},  /* 1024x768   */
+-	{1344,1066, 1344,1066},  /* 1280x1024  */  /* INSERTED ! */
+- 	{1688, 806, 1688, 806},  /* 1280x768 ! */
+-	/* No other panels ! */
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS640x480Data_1[] =
+-{
+-	{800, 449, 800, 449},
+-	{800, 449, 800, 449},
+-	{800, 449, 800, 449},
+-	{800, 449, 800, 449},
+-	{800, 525, 800, 525},
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1280x960Data_1[] =   /* TW: New */
+-{
+-	{840, 438,1344, 806},
+-	{840, 409,1344, 806},
+-	{840, 438,1344, 806},
+-	{840, 409,1344, 806},
+-	{840, 518,1344, 806},
+-	{1050, 638,1344, 806},
+-	{1344, 806,1344, 806},
+-	{800, 449,1280, 801},
+-	{800, 525,1280, 813}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1280x960Data_2[] =   /* TW: New */
+-{
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{800, 449,1280, 801},
+-	{800, 525,1280, 813}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LCDA1400x1050Data_1[] =   /* TW: New */
+-{	/* TW: Might be temporary (invalid) data */
+-        {928, 416, 1688, 1066},
+-	{928, 366, 1688, 1066},
+-	{1008, 416, 1688, 1066},
+-	{1008, 366, 1688, 1066},
+-	{1200, 530, 1688, 1066},
+-	{1088, 616, 1688, 1066},
+-	{1312, 784, 1688, 1066},
+-	{1568, 1040, 1688, 1066},
+-	{1688, 1066, 1688, 1066}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LCDA1400x1050Data_2[] =   /* TW: New */
+-{	/* TW: Temporary data. Not valid */
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{800, 449,1280, 801},
+-	{800, 525,1280, 813}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LCDA1600x1200Data_1[] =   /* TW: New */
+-{	/* TW: Temporary data. Not valid */
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{800, 449,1280, 801},
+-	{800, 525,1280, 813}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LCDA1600x1200Data_2[] =   /* TW: New */
+-{	/* TW: Temporary data. Not valid */
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0}
+-};
+-
+-
+-/* TW: New: */
+-static const SiS300_LVDSDataStruct  SiS300_CHTVUNTSCData[] =
+-{
+-	{840, 600, 840, 600},
+-	{840, 600, 840, 600},
+-	{840, 600, 840, 600},
+-	{840, 600, 840, 600},
+-	{784, 600, 784, 600},
+-	{1064, 750,1064, 750}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_CHTVONTSCData[] =
+-{
+-	{840, 525, 840, 525},
+-	{840, 525, 840, 525},
+-	{840, 525, 840, 525},
+-	{840, 525, 840, 525},
+-	{784, 525, 784, 525},
+-	{1040, 700,1040, 700}
+-};
+-
+ static const SiS300_LVDSDataStruct  SiS300_CHTVUPALData[] =
+ {
+ 	{1008, 625,1008, 625},
+ 	{1008, 625,1008, 625},
+ 	{1008, 625,1008, 625},
+ 	{1008, 625,1008, 625},
+-	{840, 750, 840, 750},
+-	{936, 836, 936, 836}
++	{ 840, 750, 840, 750},
++	{ 936, 836, 936, 836}
+ };
+ 
+ static const SiS300_LVDSDataStruct  SiS300_CHTVOPALData[] =
+@@ -2034,8 +1000,8 @@ static const SiS300_LVDSDataStruct  SiS3
+ 	{1008, 625,1008, 625},
+ 	{1008, 625,1008, 625},
+ 	{1008, 625,1008, 625},
+-	{840, 625, 840, 625},
+-	{960, 750, 960, 750}
++	{ 840, 625, 840, 625},
++	{ 960, 750, 960, 750}
+ };
+ 
+ static const SiS300_LVDSDataStruct  SiS300_CHTVSOPALData[] =
+@@ -2044,12 +1010,10 @@ static const SiS300_LVDSDataStruct  SiS3
+ 	{1008, 625,1008, 625},
+ 	{1008, 625,1008, 625},
+ 	{1008, 625,1008, 625},
+-	{840, 500, 840, 500},
+-	{944, 625, 944, 625}
++	{ 840, 500, 840, 500},
++	{ 944, 625, 944, 625}
+ };
+ 
+-/* TW: new end */
+-
+ typedef struct _SiS300_LVDSDesStruct
+ {
+ 	USHORT LCDHDES;
+@@ -2058,57 +1022,90 @@ typedef struct _SiS300_LVDSDesStruct
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType00_1[] =
+ {
++	{ 1059, 626 },   /* 2.08 */
++	{ 1059, 624 },
++	{ 1059, 626 },
++	{ 1059, 624 },
++	{ 1059, 624 },
++	{    0, 627 },
++	{    0, 627 },
++	{    0,   0 },
++	{    0,   0 }
++#if 0
+ 	{0, 626},
+ 	{0, 624},
+ 	{0, 626},
+ 	{0, 624},
+ 	{0, 624},
+-	{ 0, 627},
+-	{ 0, 627},
+-	{ 0,   0},
+-	{ 0,   0}
++	{0, 627},
++	{0, 627},
++	{0,   0},
++	{0,   0}
++#endif
+ };
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType01_1[] =
+ {
++	{   0,   0 },  /* 2.08 */
++	{   0,   0 },
++	{   0,   0 },
++	{   0,   0 },
++	{   0,   0 },
++	{   0,   0 },
++	{   0,   0 },
++	{   0,   0 },
++	{   0,   0 }
++#if 0
+ 	{1343, 798},
+ 	{1343, 794},
+ 	{1343, 798},
+ 	{1343, 794},
+ 	{1343,   0},
+ 	{1343,   0},
+-	{ 0, 805},
+-	{ 0, 794},
+-	{ 0,   0}
++	{   0, 805},
++	{   0, 794},
++	{   0,   0}
++#endif
+ };
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType02_1[] =
+ {
++	{ 1059, 626 },  /* 2.08 */
++	{ 1059, 624 },
++	{ 1059, 626 },
++	{ 1059, 624 },
++	{ 1059, 624 },
++	{    0, 627 },
++	{    0, 627 },
++	{    0,   0 },
++	{    0,   0 }
++#if 0
+ 	{0, 626},
+ 	{0, 624},
+ 	{0, 626},
+ 	{0, 624},
+ 	{0, 624},
+-	{ 0, 627},
+-	{ 0, 627},
+-	{ 0,   0},
+-	{ 0,   0}
++	{0, 627},
++	{0, 627},
++	{0,   0},
++	{0,   0}
++#endif
+ };
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType03_1[] =
+ {
+-	{ 8, 436},
+-	{ 8, 440},
+-	{ 8, 436},
+-	{ 8, 440},
+-	{ 8, 512},
++	{   8, 436},
++	{   8, 440},
++	{   8, 436},
++	{   8, 440},
++	{   8, 512},
+ 	{1343, 798},
+ 	{1343, 794},
+ 	{1343, 798},
+ 	{1343, 794}
+ };
+ 
+-static const SiS300_LVDSDesStruct  SiS300_PanelType04_1[] =
++static const SiS300_LVDSDesStruct  SiS300_PanelType04_1[] =	/* 1280x1024 */
+ {
+ 	{1343, 798},
+ 	{1343, 794},
+@@ -2116,9 +1113,9 @@ static const SiS300_LVDSDesStruct  SiS30
+ 	{1343, 794},
+ 	{1343,   0},
+ 	{1343,   0},
+-	{ 0, 805},
+-	{ 0, 794},
+-	{ 0,   0}
++	{   0, 805},
++	{   0, 794},
++	{   0,   0}
+ };
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType05_1[] =
+@@ -2129,9 +1126,9 @@ static const SiS300_LVDSDesStruct  SiS30
+ 	{1343, 794},
+ 	{1343,   0},
+ 	{1343,   0},
+-	{ 0, 805},
+-	{ 0, 794},
+-	{ 0,   0}
++	{   0, 805},
++	{   0, 794},
++	{   0,   0}
+ };
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType06_1[] =
+@@ -2142,9 +1139,9 @@ static const SiS300_LVDSDesStruct  SiS30
+ 	{1343, 794},
+ 	{1343,   0},
+ 	{1343,   0},
+-	{ 0, 805},
+-	{ 0, 794},
+-	{ 0,   0}
++	{   0, 805},
++	{   0, 794},
++	{   0,   0}
+ };
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType07_1[] =
+@@ -2155,9 +1152,9 @@ static const SiS300_LVDSDesStruct  SiS30
+ 	{1343, 794},
+ 	{1343,   0},
+ 	{1343,   0},
+-	{ 0, 805},
+-	{ 0, 794},
+-	{ 0,   0}
++	{   0, 805},
++	{   0, 794},
++	{   0,   0}
+ };
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType08_1[] =
+@@ -2167,10 +1164,10 @@ static const SiS300_LVDSDesStruct  SiS30
+ 	{1059, 626},
+ 	{1059, 624},
+ 	{1059, 624},
+-	{ 0, 627},
+-	{ 0, 627},
+-	{ 0,   0},
+-	{ 0,   0}
++	{   0, 627},
++	{   0, 627},
++	{   0,   0},
++	{   0,   0}
+ };
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType09_1[] =
+@@ -2181,9 +1178,9 @@ static const SiS300_LVDSDesStruct  SiS30
+ 	{1343, 794},
+ 	{1343,   0},
+ 	{1343,   0},
+-	{ 0, 805},
+-	{ 0, 794},
+-	{ 0,   0}
++	{   0, 805},
++	{   0, 794},
++	{   0,   0}
+ };
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType0a_1[] =
+@@ -2193,23 +1190,23 @@ static const SiS300_LVDSDesStruct  SiS30
+ 	{1059, 626},
+ 	{1059, 624},
+ 	{1059, 624},
+-	{ 0, 627},
+-	{ 0, 627},
+-	{ 0,   0},
+-	{ 0,   0}
++	{   0, 627},
++	{   0, 627},
++	{   0,   0},
++	{   0,   0}
+ };
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType0b_1[] =
+ {
+-	{1343, 0},
+-	{1343, 0},
+-	{1343, 0},
+-	{1343, 0},
+-	{1343, 0},   /* 640x480 - BIOS 1343, 0 */
+-	{1343, 0},
+-	{ 0, 799},
+-	{ 0, 0},
+-	{ 0, 0}
++	{1343,   0},
++	{1343,   0},
++	{1343,   0},
++	{1343,   0},
++	{1343,   0},
++	{1343,   0},
++	{   0, 799},
++	{   0,   0},
++	{   0,   0}
+ };
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType0c_1[] =
+@@ -2220,9 +1217,9 @@ static const SiS300_LVDSDesStruct  SiS30
+ 	{1343, 794},
+ 	{1343,   0},
+ 	{1343,   0},
+-	{ 0, 805},
+-	{ 0, 794},
+-	{ 0,   0}
++	{   0, 805},
++	{   0, 794},
++	{   0,   0}
+ };
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType0d_1[] =
+@@ -2233,9 +1230,9 @@ static const SiS300_LVDSDesStruct  SiS30
+ 	{1343, 794},
+ 	{1343,   0},
+ 	{1343,   0},
+-	{ 0, 805},
+-	{ 0, 794},
+-	{ 0,   0}
++	{   0, 805},
++	{   0, 794},
++	{   0,   0}
+ };
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType0e_1[] =
+@@ -2244,11 +1241,11 @@ static const SiS300_LVDSDesStruct  SiS30
+ 	{1343, 794},
+ 	{1343, 798},
+ 	{1343, 794},
+-	{1343,   0},  /* 640x480 */
+-	{1343,   0},  /* 800x600 */
+-	{ 0, 805},    /* 1024x768 */
+-	{ 0, 794},    /* 1280x1024 */
+-	{ 0,   0}     /* 1280x960 - not applicable */
++	{1343,   0},    /* 640x480 */
++	{1343,   0},    /* 800x600 */
++	{   0, 805},    /* 1024x768 */
++	{   0, 794},    /* 1280x1024 */
++	{   0,   0}     /* 1280x960 - not applicable */
+ };
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType0f_1[] =
+@@ -2259,9 +1256,9 @@ static const SiS300_LVDSDesStruct  SiS30
+ 	{1343, 794},
+ 	{1343,   0},
+ 	{1343,   0},
+-	{ 0, 805},
+-	{ 0, 794},
+-	{ 0,   0}
++	{   0, 805},
++	{   0, 794},
++	{   0,   0}
+ };
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType00_2[] =
+@@ -2271,10 +1268,10 @@ static const SiS300_LVDSDesStruct  SiS30
+ 	{976, 527},
+ 	{976, 502},
+ 	{976, 567},
+-	{ 0, 627},
+-	{ 0, 627},
+-	{ 0,   0},
+-	{ 0,   0}
++	{  0, 627},
++	{  0, 627},
++	{  0,   0},
++	{  0,   0}
+ };
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType01_2[] =
+@@ -2285,9 +1282,9 @@ static const SiS300_LVDSDesStruct  SiS30
+ 	{1152, 597},
+ 	{1152, 662},
+ 	{1232, 722},
+-	{ 0, 805},
+-	{ 0, 794},
+-	{ 0,   0}
++	{   0, 805},
++	{   0, 794},
++	{   0,   0}
+ };
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType02_2[] =
+@@ -2297,10 +1294,10 @@ static const SiS300_LVDSDesStruct  SiS30
+ 	{976, 527},
+ 	{976, 502},
+ 	{976, 567},
+-	{ 0, 627},
+-	{ 0, 627},
+-	{ 0,   0},
+-	{ 0,   0}
++	{  0, 627},
++	{  0, 627},
++	{  0,   0},
++	{  0,   0}
+ };
+ 
+ static const SiS300_LVDSDesStruct  SiS300_PanelType03_2[] =
+@@ -2472,156 +1469,57 @@ static const SiS300_LVDSDesStruct  SiS30
+  	{   0,   0}
+ };
+ 
+-static const SiS300_LVDSDesStruct  SiS300_PanelTypeNS_1[]= 
++/* Custom data for Barco iQ R200/300/400 (BIOS 2.00.07) */
++static const SiS300_LVDSDesStruct  SiS300_PanelType04_1a[] =	/* 1280x1024 (1366x1024) */
+ {
+-	{ 8,   0},
+-	{ 8,   0},
+-	{ 8,   0},
+-	{ 8,   0},
+-	{ 8,   0},
+-	{ 0,   0},
+-	{ 0,   0},
+-	{ 0,   0},
+-	{ 0, 806},
+-	{ 0, 0 }
+-};
+-
+-static const SiS300_LVDSDesStruct  SiS300_PanelTypeNS_2[] = 
+-{
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0}
+-};
+-
+-static const SiS300_LVDSDesStruct SiS300_PanelType1076_1[] =   /* TW: New */
+-{
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0}
+-};
+-
+-static const SiS300_LVDSDesStruct SiS300_PanelType1076_2[] =   /* TW: New */
+-{
+-	{ 1152, 622 },
+-	{ 1152, 597 },
+-	{ 1152, 622 },
+-	{ 1152, 597 },
+-	{ 1152, 622 },
+-	{ 1232, 722 },
+-	{    0, 0   },
+-	{    0, 794 },
+-	{    0, 0   }
+-};
+-
+-static const SiS300_LVDSDesStruct SiS300_PanelType1210_1[] =   /* TW: New */
+-{
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0}
+-};
+-
+-static const SiS300_LVDSDesStruct SiS300_PanelType1210_2[] =   /* TW: New */
+-{
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0}
+-};
+-
+-static const SiS300_LVDSDesStruct SiS300_PanelType1296_1[] =   /* TW: New */
+-{
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0}
+-};
+-
+-static const SiS300_LVDSDesStruct SiS300_PanelType1296_2[] =   /* TW: New */
+-{
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0}
+-};
+-
+-
+-/* TW: New */
+-static const SiS300_LVDSDesStruct  SiS300_CHTVUNTSCDesData[] =
+-{
+- 	{ 0,   0},
+- 	{ 0,   0},
+- 	{ 0,   0},
+- 	{ 0,   0},
+- 	{ 0,   0},
+- 	{ 0,   0}
+-};
+-
+-static const SiS300_LVDSDesStruct  SiS300_CHTVONTSCDesData[] =
+-{
+- 	{ 0,   0},
+- 	{ 0,   0},
+- 	{ 0,   0},
+- 	{ 0,   0},
+- 	{ 0,   0},
+- 	{ 0,   0}
+-};
+-
+-static const SiS300_LVDSDesStruct  SiS300_CHTVUPALDesData[] =
+-{
+- 	{256,   0},
+- 	{256,   0},
+- 	{256,   0},
+- 	{256,   0},
+- 	{  0,   0},
+- 	{  0,   0}
++	{1330, 798},  /* 320x200 */
++	{1330, 794},
++	{1330, 798},
++	{1330, 794},
++	{1330,   0},  /* 640x480 / 320x240  */
++	{1343,   0},  /* 800x600 / 400x300  */
++	{   0, 805},  /* 1024x768 / 512x384 */
++	{1688,1066},  /* 1280x1024          */
++	{   0,   0}   /* 1360x1024          */
+ };
+ 
+-static const SiS300_LVDSDesStruct  SiS300_CHTVOPALDesData[] =
++static const SiS300_LVDSDesStruct  SiS300_PanelType04_2a[] =
+ {
+- 	{256,   0},
+- 	{256,   0},
+- 	{256,   0},
+- 	{256,   0},
+- 	{  0,   0},
+- 	{  0,   0}
++	{1152, 622},
++	{1152, 597},
++	{1152, 622},
++	{1152, 597},
++	{1152, 662},
++	{1232, 722},
++	{   0, 805},
++	{1688,1066},
++	{   0,   0}
++};
++
++/* Custom data for Barco iQ G200/300/400 (BIOS 2.00.07) */
++static const SiS300_LVDSDesStruct  SiS300_PanelType04_1b[] =	/* 1024x768 */
++{
++	{1330, 798},  /* 320x200 */
++	{1330, 794},
++	{1330, 798},
++	{1330, 794},
++	{1330,   0},  /* 640x480 / 320x240  */
++	{1343,   0},  /* 800x600 / 400x300  */
++	{   0, 805}   /* 1024x768 / 512x384 */
++};
++
++static const SiS300_LVDSDesStruct  SiS300_PanelType04_2b[] =
++{
++	{1152, 622},
++	{1152, 597},
++	{1152, 622},
++	{1152, 597},
++	{1152, 662},
++	{1232, 722},
++	{   0, 805}
+ };
+-/* TW: New end */
+ 
+-/* TW: New for SiS300+301LV */
++
+ typedef struct _SiS300_Part2PortTblStruct
+ {
+  	UCHAR CR[12];
+@@ -2726,6 +1624,28 @@ static const SiS300_LVDSCRT1DataStruct  
+ 	  0x01 }}
+ };
+ 
++static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT1800x600_1_H[] =
++{
++	{{0x30,0x27,0x94,0x2c,0x92,0xaf,0x1f,
++	  0x90,0x85,0x8f,0xab,0x30,0x00,0x04,
++	  0x00 }},
++	{{0x30,0x27,0x94,0x2c,0x92,0x83,0x1f,
++	  0x5e,0x83,0x5d,0x79,0x10,0x00,0x04,
++	  0x00 }},
++	{{0x30,0x27,0x94,0x2c,0x92,0xaf,0x1f,
++	  0x90,0x85,0x8f,0xab,0x30,0x00,0x04,
++	  0x00 }},
++	{{0x30,0x27,0x94,0x2c,0x92,0x83,0x1f,
++	  0x5e,0x83,0x5d,0x79,0x10,0x00,0x04,
++	  0x00 }},
++	{{0x30,0x27,0x94,0x2c,0x92,0x04,0x3e,
++	  0xe0,0x85,0xdf,0xfb,0x10,0x00,0x04,
++	  0x00 }},
++	{{0x3d,0x31,0x81,0x37,0x1f,0x72,0xf0,
++	  0x58,0x8c,0x57,0x73,0x20,0x00,0x05,
++	  0x01 }}
++};
++
+ static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x768_1[] =
+ { 
+ 	{{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
+@@ -2751,55 +1671,31 @@ static const SiS300_LVDSCRT1DataStruct  
+ 	  0x01}}
+ };
+ 
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11280x1024_1[] =
+-{
+-	{{0x63,0x4f,0x87,0x54,0x9f,0xb4,0x1f,
+-	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
+-	  0x00 }},
+-	{{0x63,0x4f,0x87,0x54,0x9f,0x82,0x1f,
+-	  0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
+-	  0x00 }},
+-	{{0x63,0x4f,0x87,0x54,0x9f,0xb4,0x1f,
+-	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
+-	  0x00 }},
+-	{{0x63,0x4f,0x87,0x54,0x9f,0x82,0x1f,
+-	  0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
+-	  0x00 }},
+-	{{0x63,0x4f,0x87,0x54,0x9f,0x04,0x3e,
+-	  0xe2,0x89,0xdf,0x05,0x00,0x00,0x01,
+-	  0x00 }},
+-	{{0x7e,0x63,0x82,0x68,0x15,0x7c,0xf0,
+-	  0x5a,0x8f,0x57,0x7d,0x20,0x00,0x26,
+-	  0x01 }},
+-	{{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+-	  0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+-	  0x01 }}
+-};
+-
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT1800x600_1_H[] =
++static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x768_1_H[] =
+ {
+-	{{0x30,0x27,0x94,0x2c,0x92,0xaf,0x1f,
+-	  0x90,0x85,0x8f,0xab,0x30,0x00,0x04,
+-	  0x00 }},
+-	{{0x30,0x27,0x94,0x2c,0x92,0x83,0x1f,
+-	  0x5e,0x83,0x5d,0x79,0x10,0x00,0x04,
+-	  0x00 }},
+-	{{0x30,0x27,0x94,0x2c,0x92,0xaf,0x1f,
+-	  0x90,0x85,0x8f,0xab,0x30,0x00,0x04,
+-	  0x00 }},
+-	{{0x30,0x27,0x94,0x2c,0x92,0x83,0x1f,
+-	  0x5e,0x83,0x5d,0x79,0x10,0x00,0x04,
+-	  0x00 }},
+-	{{0x30,0x27,0x94,0x2c,0x92,0x04,0x3e,
+-	  0xe0,0x85,0xdf,0xfb,0x10,0x00,0x04,
++	{{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
++	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+ 	  0x00 }},
+-	{{0x3d,0x31,0x81,0x37,0x1f,0x72,0xf0,
+-	  0x58,0x8c,0x57,0x73,0x20,0x00,0x05,
++	{{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
++	  0x60,0x87,0x5D,0x83,0x10,0x00,0x44,
++	  0x00}},
++	{{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
++	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
++	  0x00}},
++	{{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
++	  0x60,0x87,0x5D,0x83,0x10,0x00,0x44,
++	  0x00}},
++	{{0x2f,0x27,0x93,0x2b,0x90,0x04,0x3e,
++	  0xE2,0x89,0xdf,0x05,0x00,0x00,0x44,
++	  0x00}},
++	{{0x3c,0x31,0x80,0x35,0x1c,0x7c,0xf0,
++	  0x5A,0x8F,0x57,0x7D,0x20,0x00,0x55,
++	  0x01}},
++	{{0x4f,0x3F,0x93,0x45,0x0D,0x24,0xf5,
++	  0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+ 	  0x01 }}
+-};
+ 
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x768_1_H[] =
+-{
++#if 0
+ 	{{0x37,0x27,0x9B,0x2b,0x94,0xc4,0x1f,
+ 	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+ 	  0x00 }},
+@@ -2821,6 +1717,32 @@ static const SiS300_LVDSCRT1DataStruct  
+ 	{{0x4f,0x3F,0x93,0x45,0x0D,0x24,0xf5,
+ 	  0x02,0x88,0xFf,0x25,0x10,0x00,0x01,
+ 	  0x01 }}
++#endif
++};
++
++static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11280x1024_1[] =
++{
++	{{0x63,0x4f,0x87,0x54,0x9f,0xb4,0x1f,
++	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
++	  0x00 }},
++	{{0x63,0x4f,0x87,0x54,0x9f,0x82,0x1f,
++	  0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
++	  0x00 }},
++	{{0x63,0x4f,0x87,0x54,0x9f,0xb4,0x1f,
++	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
++	  0x00 }},
++	{{0x63,0x4f,0x87,0x54,0x9f,0x82,0x1f,
++	  0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
++	  0x00 }},
++	{{0x63,0x4f,0x87,0x54,0x9f,0x04,0x3e,
++	  0xe2,0x89,0xdf,0x05,0x00,0x00,0x01,
++	  0x00 }},
++	{{0x7e,0x63,0x82,0x68,0x15,0x7c,0xf0,
++	  0x5a,0x8f,0x57,0x7d,0x20,0x00,0x26,
++	  0x01 }},
++	{{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
++	  0x02,0x88,0xff,0x25,0x10,0x00,0x02,
++	  0x01 }}
+ };
+ 
+ static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11280x1024_1_H[] =
+@@ -2870,32 +1792,29 @@ static const SiS300_LVDSCRT1DataStruct  
+ 	  0x01 }}
+ };
+ 
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x768_2[] =
++static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT1800x600_2_H[] =
+ {
+-	{{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
++	{{0x3d,0x27,0x81,0x32,0x1a,0x72,0x3e,
++	  0xf4,0x88,0x8f,0x73,0x20,0x00,0x05,
+ 	  0x00 }},
+-	{{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
++	{{0x3d,0x27,0x81,0x32,0x1a,0x72,0x3e,
++	  0xdb,0x8f,0x5d,0x73,0x20,0x00,0x05,
+ 	  0x00 }},
+-	{{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
++	{{0x3d,0x27,0x81,0x32,0x1a,0x72,0x3e,
++	  0xf4,0x88,0x8f,0x73,0x20,0x00,0x05,
+ 	  0x00 }},
+-	{{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
++	{{0x3d,0x27,0x81,0x3a,0x1a,0x72,0x3e,
++	  0xdb,0x8f,0x5d,0x73,0x20,0x00,0x05,
+ 	  0x00 }},
+-	{{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
++	{{0x3d,0x27,0x81,0x32,0x1a,0x72,0xba,
++	  0x1c,0x80,0xdf,0x73,0x00,0x00,0x05,
+ 	  0x00 }},
+-	{{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
+-	  0xae,0x84,0x57,0x25,0x30,0x00,0x02,
+-	  0x01 }},
+-	{{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+-	  0x02,0x88,0xff,0x25,0x10,0x00,0x02,
++	{{0x3d,0x31,0x81,0x37,0x1f,0x72,0xf0,
++	  0x58,0x8c,0x57,0x73,0x20,0x00,0x05,
+ 	  0x01 }}
+ };
+ 
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11280x1024_2[] =
++static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x768_2[] =
+ {
+ 	{{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+@@ -2920,28 +1839,6 @@ static const SiS300_LVDSCRT1DataStruct  
+ 	  0x01 }}
+ };
+ 
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT1800x600_2_H[] =
+-{
+-	{{0x3d,0x27,0x81,0x32,0x1a,0x72,0x3e,
+-	  0xf4,0x88,0x8f,0x73,0x20,0x00,0x05,
+-	  0x00 }},
+-	{{0x3d,0x27,0x81,0x32,0x1a,0x72,0x3e,
+-	  0xdb,0x8f,0x5d,0x73,0x20,0x00,0x05,
+-	  0x00 }},
+-	{{0x3d,0x27,0x81,0x32,0x1a,0x72,0x3e,
+-	  0xf4,0x88,0x8f,0x73,0x20,0x00,0x05,
+-	  0x00 }},
+-	{{0x3d,0x27,0x81,0x3a,0x1a,0x72,0x3e,
+-	  0xdb,0x8f,0x5d,0x73,0x20,0x00,0x05,
+-	  0x00 }},
+-	{{0x3d,0x27,0x81,0x32,0x1a,0x72,0xba,
+-	  0x1c,0x80,0xdf,0x73,0x00,0x00,0x05,
+-	  0x00 }},
+-	{{0x3d,0x31,0x81,0x37,0x1f,0x72,0xf0,
+-	  0x58,0x8c,0x57,0x73,0x20,0x00,0x05,
+-	  0x01 }}
+-};
+-
+ static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x768_2_H[] =
+ {
+ 	{{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+@@ -2967,6 +1864,31 @@ static const SiS300_LVDSCRT1DataStruct  
+ 	  0x01 }}
+ };
+ 
++static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11280x1024_2[] =
++{
++	{{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
++	  0x00 }},
++	{{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++	  0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
++	  0x00 }},
++	{{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
++	  0x00 }},
++	{{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++	  0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
++	  0x00 }},
++	{{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++	  0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
++	  0x00 }},
++	{{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
++	  0xae,0x84,0x57,0x25,0x30,0x00,0x02,
++	  0x01 }},
++	{{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
++	  0x02,0x88,0xff,0x25,0x10,0x00,0x02,
++	  0x01 }}
++};
++
+ static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11280x1024_2_H[] =
+ {
+ 	{{0x4f,0x27,0x93,0x39,0x81,0x24,0xbb,
+@@ -2992,207 +1914,6 @@ static const SiS300_LVDSCRT1DataStruct  
+ 	  0x01}}
+ };
+ 
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x600_1[] =
+-{
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x5a,0x3e,
+-	  0xe8,0x8f,0x8f,0x5b,0x00,0x00,0x01,
+-	  0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x2e,0x3e,
+-	  0xb9,0x80,0x5d,0x2f,0x00,0x00,0x01,
+-	  0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x5a,0x3e,
+-	  0xe8,0x8f,0x8f,0x5b,0x00,0x00,0x01,
+-	  0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x2e,0x3e,
+-	  0xb9,0x80,0x5d,0x2f,0x00,0x00,0x01,
+-	  0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0xaf,0xba,
+-	  0x3b,0x82,0xdf,0xb0,0x00,0x00,0x01,
+-	  0x00}},
+-        {{0x7e,0x63,0x82,0x68,0x15,0x1e,0xf1,
+-	  0xae,0x85,0x57,0x1f,0x30,0x00,0x26,
+-	  0x01}},
+-        {{0xa3,0x7f,0x87,0x86,0x97,0x1e,0xf1,
+-	  0xae,0x85,0x57,0x1f,0x30,0x00,0x02,
+-	  0x01}}
+-};
+-
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x600_1_H[] =
+-{
+-        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+-	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+-	  0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+-	  0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+-          0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+-	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+-	  0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+-	  0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+-	  0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x04,0x3e,
+-	  0xe2,0x89,0xdf,0x05,0x00,0x00,0x44,
+-	  0x00}},
+-        {{0x3c,0x31,0x80,0x35,0x1c,0x7c,0xf0,
+-	  0x5a,0x8f,0x57,0x7d,0x20,0x00,0x55,
+-	  0x01}},
+-        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+-	  0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+-	  0x01}}
+-};
+-
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x600_2[] =
+-{
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-          0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
+-	  0xae,0x84,0x57,0x25,0x30,0x00,0x02,
+-	  0x01}},
+-        {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+-	  0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+-	  0x01}}
+-};
+-
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x600_2_H[] =
+-{
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x72,0x88,0xdf,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x31,0x93,0x3e,0x06,0x24,0xf1,
+-	  0xae,0x84,0x57,0x25,0x30,0x00,0x01,
+-	  0x01}},
+-        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+-	  0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+-	  0x01}}
+-};
+-
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11152x768_1[] =
+-{
+-        {{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
+-	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x97,0x1f,
+-	  0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
+-	  0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
+-	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x97,0x1f,
+-	  0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
+-	  0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x04,0x3e,
+-	  0xe2,0x89,0xdf,0x05,0x00,0x00,0x01,
+-	  0x00}},
+-        {{0x7e,0x63,0x82,0x68,0x15,0x7c,0xf0,
+-	  0x5a,0x8f,0x57,0x7d,0x20,0x00,0x26,
+-	  0x01}},
+-        {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+-	  0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+-	  0x01}}
+-};
+-
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11152x768_1_H[] =
+-{
+-        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+-	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+-	  0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+-	  0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+-	  0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+-	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+-	  0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+-	  0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+-	  0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x04,0x3e,
+-	  0xe2,0x89,0xdf,0x05,0x00,0x00,0x44,
+-	  0x00}},
+-        {{0x3c,0x31,0x80,0x35,0x1c,0x7c,0xf0,
+-	  0x5a,0x8f,0x57,0x7d,0x20,0x00,0x55,
+-	  0x01}},
+-        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+-	  0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+-	  0x01}}
+-};
+-
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11152x768_2[] =
+-{
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
+-	  0xae,0x84,0x57,0x25,0x30,0x00,0x02,
+-	  0x01}},
+-        {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+-	  0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+-	  0x01}}
+-};
+-
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11152x768_2_H[] =
+-{
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x72,0x88,0xdf,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x31,0x93,0x3e,0x06,0x24,0xf1,
+-	  0xae,0x84,0x57,0x25,0x30,0x00,0x01,
+-	  0x01}},
+-        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+-	  0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+-	  0x01}}
+-};
+-
+-/* TW: New */
+ static const SiS300_LVDSCRT1DataStruct  SiS300_CHTVCRT1UNTSC[] =
+ {
+ 	{{0x64,0x4f,0x88,0x56,0x9f,0x56,0x3e,
+@@ -3302,9 +2023,7 @@ static const SiS300_LVDSCRT1DataStruct  
+ 	  0x90,0x8c,0x57,0xed,0x20,0x00,0x05,
+ 	  0x01 }}
+ };
+-/* TW: New end */
+ 
+-/* TW: New */
+ typedef struct _SiS300_CHTVRegDataStruct
+ {
+ 	UCHAR Reg[16];
+@@ -3361,9 +2080,7 @@ static const SiS300_CHTVRegDataStruct Si
+ 	{{0x60,0x30,0x00,0x10,0x00,0,0,0,0,0,0,0,0,0,0,0}}, /* TW: Mode 13: 640x480 PAL 5/4 */
+ 	{{0x81,0x50,0x00,0x1b,0x00,0,0,0,0,0,0,0,0,0,0,0}}  /* TW: Mode 19: 800x600 PAL 1/1 */
+ };
+-/* TW: New end */
+ 
+-/* TW: New */
+ static const UCHAR SiS300_CHTVVCLKUNTSC[]  = {0x29,0x29,0x29,0x29,0x2a,0x2e};
+ 
+ static const UCHAR SiS300_CHTVVCLKONTSC[]  = {0x2c,0x2c,0x2c,0x2c,0x2d,0x2b};
+@@ -3375,6 +2092,5 @@ static const UCHAR SiS300_CHTVVCLKUPAL[]
+ static const UCHAR SiS300_CHTVVCLKOPAL[]   = {0x2f,0x2f,0x2f,0x2f,0x30,0x32};
+ 
+ static const UCHAR SiS300_CHTVVCLKSOPAL[]  = {0x2f,0x2f,0x2f,0x2f,0x36,0x29};
+-/* TW: New end */
+ 
+ 
+--- linux-2.6.0-test1/drivers/video/sis/310vtbl.h	2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/video/sis/310vtbl.h	2003-07-19 17:04:55.000000000 -0700
+@@ -1,7 +1,30 @@
+-
+-
+-/* Register settings for SiS 310/325/330 series */
+-
++/* $XFree86$ */
++/*
++ * Register settings for SiS 315/330 series
++ *
++ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of the copyright holder not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  The copyright holder makes no representations
++ * about the suitability of this software for any purpose.  It is provided
++ * "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
++ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++ * PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Author: 	Thomas Winischhofer <thomas@winischhofer.net>
++ *
++ */
+ 
+ typedef struct _SiS310_StStruct
+ {
+@@ -39,466 +62,12 @@ static const SiS310_StStruct SiS310_SMod
+ 	{0xff,0x0000,0x00,0x00,0x00,0x00,0x00,0x00}
+ };
+ 
+-typedef struct _SiS310_StandTableStruct
+-{
+-	UCHAR CRT_COLS;
+-	UCHAR ROWS;
+-	UCHAR CHAR_HEIGHT;
+-	USHORT CRT_LEN;
+-	UCHAR SR[4];
+-	UCHAR MISC;
+-	UCHAR CRTC[0x19];
+-	UCHAR ATTR[0x14];
+-	UCHAR GRC[9];
+-} SiS310_StandTableStruct;
+-
+-static const SiS310_StandTableStruct SiS310_StandTable[]=
+-{
+-/* 0x00: MD_0_200 */
+- {
+-  0x28,0x18,0x08,0x0800,
+-  {0x09,0x03,0x00,0x02},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+-   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x01: MD_1_200 */
+- {
+-  0x28,0x18,0x08,0x0800,
+-  {0x09,0x03,0x00,0x02},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+-   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x02: MD_2_200 */
+- {
+-  0x50,0x18,0x08,0x1000,
+-  {0x01,0x03,0x00,0x02},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x03: MD_3_200 - mode 0x03 - 0 */
+- {
+-  0x50,0x18,0x08,0x1000,
+-  {0x01,0x03,0x00,0x02},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x04: MD_4 */
+- {
+-  0x28,0x18,0x08,0x4000,
+-  {0x09,0x03,0x00,0x02},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2c,0x80,0xbf,0x1f,
+-   0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x00,0x96,0xb9,0xa2,
+-   0xff},
+-  {0x00,0x13,0x15,0x17,0x02,0x04,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x01,0x00,0x03,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x30,0x0f,0x00,
+-   0xff}
+- },
+-/* 0x05: MD_5 */
+- {
+-  0x28,0x18,0x08,0x4000,
+-  {0x09,0x03,0x00,0x02},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2c,0x80,0xbf,0x1f,
+-   0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x00,0x96,0xb9,0xa2,
+-   0xff},
+-  {0x00,0x13,0x15,0x17,0x02,0x04,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x01,0x00,0x03,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x30,0x0f,0x00,
+-   0xff}
+- },
+-/* 0x06: MD_6 */
+- {
+-  0x50,0x18,0x08,0x4000,
+-  {0x01,0x01,0x00,0x06},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x00,0x96,0xb9,0xc2,
+-   0xff},
+-  {0x00,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+-   0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+-   0x01,0x00,0x01,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,
+-   0xff}
+- },
+-/* 0x07: MD_7 */
+- {
+-  0x50,0x18,0x0e,0x1000,
+-  {0x00,0x03,0x00,0x03},
+-  0xa6,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x28,0x0d,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
+-   0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+-   0x0e,0x00,0x0f,0x08},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0a,0x00,
+-   0xff}
+- },
+-/* 0x08: MDA_DAC */
+- {
+-  0x00,0x00,0x00,0x0000,
+-  {0x00,0x00,0x00,0x15},
+-  0x15,
+-  {0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
+-   0x15,0x15,0x15,0x15,0x15,0x15,0x3f,0x3f,
+-   0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x00,0x00,
+-   0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x15,
+-   0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
+-   0x15,0x15,0x15,0x15},
+-  {0x15,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
+-   0x3f}
+- },
+-/* 0x09: CGA_DAC */
+- {
+-  0x00,0x10,0x04,0x0114,
+-  {0x11,0x09,0x15,0x00},
+-  0x10,
+-  {0x04,0x14,0x01,0x11,0x09,0x15,0x2a,0x3a,
+-   0x2e,0x3e,0x2b,0x3b,0x2f,0x3f,0x2a,0x3a,
+-   0x2e,0x3e,0x2b,0x3b,0x2f,0x3f,0x00,0x10,
+-   0x04},
+-  {0x14,0x01,0x11,0x09,0x15,0x00,0x10,0x04,
+-   0x14,0x01,0x11,0x09,0x15,0x2a,0x3a,0x2e,
+-   0x3e,0x2b,0x3b,0x2f},
+-  {0x3f,0x2a,0x3a,0x2e,0x3e,0x2b,0x3b,0x2f,
+-   0x3f}
+- },
+-/* 0x0a: EGA_DAC */
+- {
+-  0x00,0x10,0x04,0x0114,
+-  {0x11,0x05,0x15,0x20},
+-  0x30,
+-  {0x24,0x34,0x21,0x31,0x25,0x35,0x08,0x18,
+-   0x0c,0x1c,0x09,0x19,0x0d,0x1d,0x28,0x38,
+-   0x2c,0x3c,0x29,0x39,0x2d,0x3d,0x02,0x12,
+-   0x06},
+-  {0x16,0x03,0x13,0x07,0x17,0x22,0x32,0x26,
+-   0x36,0x23,0x33,0x27,0x37,0x0a,0x1a,0x0e,
+-   0x1e,0x0b,0x1b,0x0f},
+-  {0x1f,0x2a,0x3a,0x2e,0x3e,0x2b,0x3b,0x2f,
+-   0x3f}
+- },
+-/* 0x0b: VGA_DAC */
+- {
+-  0x00,0x10,0x04,0x0114,
+-  {0x11,0x09,0x15,0x2a},
+-  0x3a,
+-  {0x2e,0x3e,0x2b,0x3b,0x2f,0x3f,0x00,0x05,
+-   0x08,0x0b,0x0e,0x11,0x14,0x18,0x1c,0x20,
+-   0x24,0x28,0x2d,0x32,0x38,0x3f,0x00,0x10,
+-   0x1f},
+-  {0x2f,0x3f,0x1f,0x27,0x2f,0x37,0x3f,0x2d,
+-   0x31,0x36,0x3a,0x3f,0x00,0x07,0x0e,0x15,
+-   0x1c,0x0e,0x11,0x15},
+-  {0x18,0x1c,0x14,0x16,0x18,0x1a,0x1c,0x00,
+-   0x04}
+- },
+-/* 0x0c */ 
+- {
+-  0x08,0x0c,0x10,0x0a08,
+-  {0x0c,0x0e,0x10,0x0b},
+-  0x0c,
+-  {0x0d,0x0f,0x10,0x10,0x01,0x08,0x00,0x00,
+-   0x00,0x00,0x01,0x00,0x02,0x02,0x01,0x00,
+-   0x04,0x04,0x01,0x00,0x05,0x02,0x05,0x00,
+-   0x06},
+-  {0x01,0x06,0x05,0x06,0x00,0x08,0x01,0x08,
+-   0x00,0x07,0x02,0x07,0x06,0x07,0x00,0x00,
+-   0x00,0x00,0x00,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x00}
+- },
+-/* 0x0d: MD_D */
+- {
+-  0x28,0x18,0x08,0x2000,
+-  {0x09,0x0f,0x00,0x06},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2c,0x80,0xbf,0x1f,
+-   0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x00,0x96,0xb9,0xe3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
+-   0xff}
+- },
+-/* 0x0e: MD_E */
+- {
+-  0x50,0x18,0x08,0x4000,
+-  {0x01,0x0f,0x00,0x06},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x00,0x96,0xb9,0xe3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
+-   0xff}
+- },
+-/* 0x0f: ExtVGATable - modes > 0x13 */
+- {
+-  0x00,0x00,0x00,0x0000,
+-  {0x01,0x0f,0x00,0x0e},
+-  0x23,
+-  {0x5f,0x4f,0x50,0x82,0x54,0x80,0x0b,0x3e,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0xea,0x8c,0xdf,0x28,0x40,0xe7,0x04,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
+-   0x01,0x00,0x00,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0f,
+-   0xff}
+- },
+-/* 0x10: ROM_SAVEPTR */
+- {
+-  0x9f,0x3b,0x00,0x00c0,
+-  {0x00,0x00,0x00,0x00},
+-  0x00,
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x3f,
+-   0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x00,0x00,0x1a,0x00,0xac,0x3e,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}
+- },
+-/* 0x11: MD_F */
+- {
+-  0x50,0x18,0x0e,0x8000,
+-  {0x01,0x0f,0x00,0x06},
+-  0xa2,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x82,0x84,0x5d,0x28,0x0f,0x63,0xba,0xe3,
+-   0xff},
+-  {0x00,0x08,0x00,0x00,0x18,0x18,0x00,0x00,
+-   0x00,0x08,0x00,0x00,0x00,0x18,0x00,0x00,
+-   0x0b,0x00,0x05,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,
+-   0xff}
+- },
+-/* 0x12: MD_10 */
+- {
+-  0x50,0x18,0x0e,0x8000,
+-  {0x01,0x0f,0x00,0x06},
+-  0xa3,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x82,0x84,0x5d,0x28,0x0f,0x63,0xba,0xe3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
+-   0xff}
+- },
+-/* 0x13: MD_0_350 */
+- {
+-  0x28,0x18,0x0e,0x0800,
+-  {0x09,0x03,0x00,0x02},
+-  0xa3,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xb1,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x14,0x1f,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x14: MD_1_350 */
+- {
+-  0x28,0x18,0x0e,0x0800,
+-  {0x09,0x03,0x00,0x02},
+-  0xa3,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x14,0x1f,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x15: MD_2_350 */
+- {
+-  0x50,0x18,0x0e,0x1000,
+-  {0x01,0x03,0x00,0x02},
+-  0xa3,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x28,0x1f,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x16: MD_3_350 - mode 0x03 - 1 */
+- {
+-  0x50,0x18,0x0e,0x1000,
+-  {0x01,0x03,0x00,0x02},
+-  0xa3,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x28,0x1f,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x17: MD_0_1_400 */
+- {
+-  0x28,0x18,0x10,0x0800,
+-  {0x08,0x03,0x00,0x02},
+-  0x67,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xb1,0xbf,0x1f,
+-   0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x0c,0x00,0x0f,0x08},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x18: MD_2_3_400 - mode 0x03 - 2 */
+- {
+-  0x50,0x18,0x10,0x1000,
+-  {0x00,0x03,0x00,0x02},
+-  0x67,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x0c,0x00,0x0f,0x08},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x19: MD_7_400 */
+- {
+-  0x50,0x18,0x10,0x1000,
+-  {0x00,0x03,0x00,0x02},
+-  0x66,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x0f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
+-   0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+-   0x0e,0x00,0x0f,0x08},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0a,0x00,
+-   0xff}
+- },
+-/* 0x1a: MD_11 */
+- {
+-  0x50,0x1d,0x10,0xa000,
+-  {0x01,0x0f,0x00,0x06},
+-  0xe3,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0x0b,0x3e,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0xe9,0x8b,0xdf,0x28,0x00,0xe7,0x04,0xc3,
+-   0xff},
+-  {0x00,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
+-   0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01,
+-   0xff}
+- },
+-/* 0x1b: ExtEGATable - Modes <= 0x02 */
+- {
+-  0x50,0x1d,0x10,0xa000,
+-  {0x01,0x0f,0x00,0x06},
+-  0xe3,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0x0b,0x3e,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0xe9,0x8b,0xdf,0x28,0x00,0xe7,0x04,0xe3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
+-   0xff}
+- },
+-/* 0x1c: MD_13 */
+- {
+-  0x28,0x18,0x08,0x2000,
+-  {0x01,0x0f,0x00,0x0e},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x40,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
+-   0x41,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0f,
+-   0xff}
+- }
+-};
+-
+ typedef struct _SiS310_ExtStruct
+ {
+ 	UCHAR Ext_ModeID;
+ 	USHORT Ext_ModeFlag;
+ 	USHORT Ext_ModeInfo;
+-	USHORT Ext_Point;    /* TW: Address of table entry in (older) BIOS image */
+ 	USHORT Ext_VESAID;
+-	UCHAR Ext_VESAMEMSize;
+ 	UCHAR Ext_RESINFO;
+ 	UCHAR VB_ExtTVFlickerIndex;
+ 	UCHAR VB_ExtTVEdgeIndex;
+@@ -506,93 +75,93 @@ typedef struct _SiS310_ExtStruct
+ 	UCHAR REFindex;
+ } SiS310_ExtStruct;
+ 
+-/* TW: Checked with 650/LVDS and 650/301LVx 1.10.6s */
+ static const SiS310_ExtStruct  SiS310_EModeIDTable[]=
+ {
+-	{0x6a,0x2212,0x0407,0x3a81,0x0102,0x08,0x07,0x00,0x00,0x07,0x00},          /* 800x600x? */
+-	{0x2e,0x0a1b,0x0306,0x3a57,0x0101,0x08,0x06,0x00,0x00,0x05,0x08},          /* 640x480x8 */
+-/*	{0x2e,0x021b,0x0306,0x3a57,0x0101,0x08,0x06,0x00,0x00,0x05,0x08},    */    /* 640x480x8 - 650/LVDS BIOS (no CRt2Mode) */
+-	{0x2f,0x0a1b,0x0305,0x3a50,0x0100,0x08,0x05,0x00,0x00,0x05,0x10},          /* 640x400x8 */
+-/*	{0x2f,0x021b,0x0305,0x3a50,0x0100,0x08,0x05,0x00,0x00,0x05,0x10},    */    /* 640x400x8 - 650/LVDS BIOS (no CRt2Mode) */
+-	{0x30,0x2a1b,0x0407,0x3a81,0x0103,0x08,0x07,0x00,0x00,0x07,0x00},          /* 800x600x8 */
+-/*	{0x30,0x221b,0x0407,0x3a81,0x0103,0x08,0x07,0x00,0x00,0x07,0x00},    */    /* 800x600x8 - 650/LVDS BIOS (no CRt2Mode) */
+-/*      {0x31,0x0a1b,0x030d,0x3b85,0x0000,0x08,0x0d,0x00,0x00,0x06,0x11},    */    /* 720x480x8 */
+-        {0x31,0x0a1b,0x0a0d,0x3b85,0x0000,0x08,0x0d,0x00,0x00,0x06,0x11},          /* 720x480x8 BIOS (301/LVDS) */
+-	{0x32,0x0a1b,0x0a0e,0x3b8c,0x0000,0x08,0x0e,0x00,0x00,0x06,0x12},          /* 720x576x8 */
+-	{0x33,0x0a1d,0x0a0d,0x3b85,0x0000,0x08,0x0d,0x00,0x00,0x06,0x11},          /* 720x480x16 */
+-	{0x34,0x2a1d,0x0a0e,0x3b8c,0x0000,0x08,0x0e,0x00,0x00,0x06,0x12},          /* 720x576x16 */
+-	{0x35,0x0a1f,0x0a0d,0x3b85,0x0000,0x08,0x0d,0x00,0x00,0x06,0x11},          /* 720x480x32 */
+-	{0x36,0x2a1f,0x0a0e,0x3b8c,0x0000,0x08,0x0e,0x00,0x00,0x06,0x12},          /* 720x576x32 */
+-	{0x37,0x0212,0x0508,0x3aab,0x0104,0x08,0x08,0x00,0x00,0x08,0x13},          /* 1024x768x? */
+-	{0x38,0x0a1b,0x0508,0x3aab,0x0105,0x08,0x08,0x00,0x00,0x08,0x13},          /* 1024x768x8 */
+-	{0x3a,0x0e3b,0x0609,0x3adc,0x0107,0x08,0x09,0x00,0x00,0x00,0x1a},          /* 1280x1024x8 */
+-	{0x3c,0x0e3b,0x070a,0x3af2,0x0130,0x08,0x0a,0x00,0x00,0x00,0x1e},          /* 1600x1200x8 */
+-	{0x3d,0x0e7d,0x070a,0x3af2,0x0131,0x08,0x0a,0x00,0x00,0x00,0x1e},          /* 1600x1200x16 - 650/301LVx - no CRT2Mode? */
+-	{0x40,0x9a1c,0x0000,0x3a34,0x010d,0x08,0x00,0x00,0x00,0x04,0x25},
+-	{0x41,0x9a1d,0x0000,0x3a34,0x010e,0x08,0x00,0x00,0x00,0x04,0x25},
+-	{0x43,0x0a1c,0x0306,0x3a57,0x0110,0x08,0x06,0x00,0x00,0x05,0x08},
+-	{0x44,0x0a1d,0x0306,0x3a57,0x0111,0x08,0x06,0x00,0x00,0x05,0x08},          /* 640x480x16 */
+-	{0x46,0x2a1c,0x0407,0x3a81,0x0113,0x08,0x07,0x00,0x00,0x07,0x00},
+-	{0x47,0x2a1d,0x0407,0x3a81,0x0114,0x08,0x07,0x00,0x00,0x07,0x00},          /* 800x600x16 */
+-	{0x49,0x0a3c,0x0508,0x3aab,0x0116,0x08,0x08,0x00,0x00,0x00,0x13},
+-	{0x4a,0x0a3d,0x0508,0x3aab,0x0117,0x08,0x08,0x00,0x00,0x08,0x13},          /* 1024x768x16 */
+-	{0x4c,0x0e7c,0x0609,0x3adc,0x0119,0x08,0x09,0x00,0x00,0x00,0x1a},
+-	{0x4d,0x0e7d,0x0609,0x3adc,0x011a,0x08,0x09,0x00,0x00,0x00,0x1a},          /* 1280x1024x16 */
+-	{0x50,0x9a1b,0x0001,0x3a3b,0x0132,0x08,0x01,0x00,0x00,0x04,0x26},	   /* 320x240 */
+-	{0x51,0xba1b,0x0103,0x3a42,0x0133,0x08,0x03,0x00,0x00,0x07,0x27},
+-  	{0x52,0xba1b,0x0204,0x3a49,0x0134,0x08,0x04,0x00,0x00,0x00,0x28},          /* 650/301 BIOS */
+-	{0x56,0x9a1d,0x0001,0x3a3b,0x0135,0x08,0x01,0x00,0x00,0x04,0x26},
+-	{0x57,0xba1d,0x0103,0x3a42,0x0136,0x08,0x03,0x00,0x00,0x07,0x27},
+- 	{0x58,0xba1d,0x0204,0x3a49,0x0137,0x08,0x04,0x00,0x00,0x00,0x28},          /* BIOS (301+LVDS) */
+-	{0x59,0x9a1b,0x0000,0x3a34,0x0138,0x08,0x00,0x00,0x00,0x04,0x25},	   /* 320x200 */
+-	{0x5A,0x021b,0x0014,0x3b83,0x0138,0x08,0x01,0x00,0x00,0x04,0x3f},          /* 320x480x8 fstn add new mode*/
+-	{0x5B,0x0a1d,0x0014,0x3b83,0x0135,0x08,0x01,0x00,0x00,0x04,0x3f},          /* 320x480x16 fstn add new mode*/
+-	{0x5c,0xba1f,0x0204,0x3a49,0x0000,0x08,0x04,0x00,0x00,0x00,0x28},          /* TW: inserted 512x384x32 */
+-	{0x5d,0x0a1d,0x0305,0x3a50,0x0139,0x08,0x05,0x00,0x00,0x07,0x10},
+-	{0x5e,0x0a1f,0x0305,0x3a50,0x0000,0x08,0x05,0x00,0x00,0x07,0x10},          /* TW: Inserted 640x400x32 */
+-	{0x62,0x0a3f,0x0306,0x3a57,0x013a,0x08,0x06,0x00,0x00,0x05,0x08},          /* 640x480x32 */
+-	{0x63,0x2a3f,0x0407,0x3a81,0x013b,0x08,0x07,0x00,0x00,0x07,0x00},          /* 800x600x32 */
+-	{0x64,0x0a7f,0x0508,0x3aab,0x013c,0x08,0x08,0x00,0x00,0x08,0x13},          /* 1024x768x32 */
+-	{0x65,0x0eff,0x0609,0x3adc,0x013d,0x08,0x09,0x00,0x00,0x00,0x1a},          /* 1280x1024x32 */
+-	{0x66,0x0eff,0x070a,0x3af2,0x013e,0x08,0x0a,0x00,0x00,0x00,0x1e},          /* 1600x1200x32 */
+-	{0x68,0x067b,0x080b,0x3b17,0x013f,0x08,0x0b,0x00,0x00,0x00,0x29},          /* 1920x1440x8 */
+-	{0x69,0x06fd,0x080b,0x3b17,0x0140,0x08,0x0b,0x00,0x00,0x00,0x29},          /* 1920x1440x16 */
+-	{0x6b,0x07ff,0x080b,0x3b17,0x0141,0x10,0x0b,0x00,0x00,0x00,0x29},          /* 1920x1440x32 */
+-	{0x6c,0x067b,0x090c,0x3b37,0x0000,0x08,0x0c,0x00,0x00,0x00,0x2f},          /* 2048x1536x8 */
+-	{0x6d,0x06fd,0x090c,0x3b37,0x0000,0x10,0x0c,0x00,0x00,0x00,0x2f},          /* 2048x1536x16 */
+-	{0x6e,0x07ff,0x090c,0x3b37,0x0000,0x10,0x0c,0x00,0x00,0x00,0x2f},          /* 2048x1536x32 */
+-	{0x70,0x2a1b,0x0410,0x3b52,0x0000,0x08,0x10,0x00,0x00,0x07,0x34},          /* 800x480x8 */
+-	{0x71,0x0a1b,0x0511,0x3b63,0x0000,0x08,0x11,0x00,0x00,0x00,0x37},          /* 1024x576x8 */
+-	{0x74,0x0a1d,0x0511,0x3b63,0x0000,0x08,0x11,0x00,0x00,0x00,0x37},          /* 1024x576x16 */
+-	{0x75,0x0a3d,0x0612,0x3b74,0x0000,0x08,0x12,0x00,0x00,0x00,0x3a},	   /* 1280x720x16 */
+-	{0x76,0x2a1f,0x0410,0x3b52,0x0000,0x08,0x10,0x00,0x00,0x07,0x34},          /* 800x480x32 */
+-	{0x77,0x0a1f,0x0511,0x3b63,0x0000,0x08,0x11,0x00,0x00,0x00,0x37},	   /* 1024x576x32 */
+-	{0x78,0x0a3f,0x0612,0x3b74,0x0000,0x08,0x12,0x00,0x00,0x00,0x3a},	   /* 1280x720x32 */
+-	{0x79,0x0a3b,0x0612,0x3b74,0x0000,0x08,0x12,0x00,0x00,0x00,0x3a},	   /* 1280x720x8 */
+-	{0x7a,0x2a1d,0x0410,0x3b52,0x0000,0x08,0x10,0x00,0x00,0x07,0x34},          /* 800x480x16 */
+-	{0x7c,0x0e3b,0x060f,0x3ad0,0x0000,0x08,0x0f,0x00,0x00,0x00,0x3d},          /* 1280x960x8 - TW */
+-	{0x7d,0x0e7d,0x060f,0x3ad0,0x0000,0x08,0x0f,0x00,0x00,0x00,0x3d},          /* 1280x960x16 - TW */
+-	{0x7e,0x0eff,0x060f,0x3ad0,0x0000,0x08,0x0f,0x00,0x00,0x00,0x3d},          /* 1280x960x32 - TW */
+-        /* TW: 650/LVDS BIOS new modes */
+-	{0x23,0x0e3b,0x0614,0x36f7,0x0000,0x08,0x14,0x00,0x00,0x00,0x40},          /* 1280x768x8 */
+-	{0x24,0x0e7d,0x0614,0x36f7,0x0000,0x08,0x14,0x00,0x00,0x00,0x40},          /* 1280x768x16 */
+-	{0x25,0x0eff,0x0614,0x36f7,0x0000,0x08,0x14,0x00,0x00,0x00,0x40},          /* 1280x768x32 */
+-	{0x26,0x0e3b,0x0c15,0x36fe,0x0000,0x08,0x15,0x00,0x00,0x00,0x41},          /* 1400x1050x8 */
+-	{0x27,0x0e7d,0x0c15,0x36fe,0x0000,0x08,0x15,0x00,0x00,0x00,0x41},          /* 1400x1050x16 */
+-	{0x28,0x0eff,0x0c15,0x36fe,0x0000,0x08,0x15,0x00,0x00,0x00,0x41},          /* 1400x1050x32*/
+-	{0x29,0x0e1b,0x0d16,0x0000,0x0000,0x08,0x16,0x00,0x00,0x00,0x43},    /* TW: NEW 1152x864 - not in BIOS */
+-	{0x2a,0x0e3d,0x0d16,0x0000,0x0000,0x08,0x16,0x00,0x00,0x00,0x43},
+-	{0x2b,0x0e7f,0x0d16,0x0000,0x0000,0x08,0x16,0x00,0x00,0x00,0x43},
+-	{0x39,0x2a1b,0x0b17,0x0000,0x0000,0x08,0x17,0x00,0x00,0x00,0x45},    /* TW: NEW 848x480 - not in BIOS */
+-	{0x3b,0x2a3d,0x0b17,0x0000,0x0000,0x08,0x17,0x00,0x00,0x00,0x45},
+-	{0x3e,0x2a7f,0x0b17,0x0000,0x0000,0x08,0x17,0x00,0x00,0x00,0x45},
+-	{0x3f,0x2a1b,0x0b13,0x0000,0x0000,0x08,0x13,0x00,0x00,0x00,0x47},    /* TW: NEW 856x480 - not in BIOS */
+-	{0x42,0x2a3d,0x0b13,0x0000,0x0000,0x08,0x13,0x00,0x00,0x00,0x47},
+-	{0x45,0x2a7f,0x0b13,0x0000,0x0000,0x08,0x13,0x00,0x00,0x00,0x47},
+-	{0x48,0x2a1b,0x0e18,0x0000,0x0000,0x08,0x18,0x00,0x00,0x00,0x49},    /* TW: NEW 1360x768 - not in BIOS */
+-	{0x4b,0x2a3d,0x0e18,0x0000,0x0000,0x08,0x18,0x00,0x00,0x00,0x49},
+-	{0x4e,0x2a7f,0x0e18,0x0000,0x0000,0x08,0x18,0x00,0x00,0x00,0x49},
+-	{0xff,0x0000,0x0000,0x0000,0x0000,0x00,0x00,0x00,0x00,0x00,0x00}
++	{0x6a,0x2212,0x0407,0x0102,SIS_RI_800x600,  0x00,0x00,0x07,0x00}, /* 800x600x? */
++	{0x2e,0x0a1b,0x0306,0x0101,SIS_RI_640x480,  0x00,0x00,0x05,0x08}, /* 640x480x8 */
++        {0x2f,0x0a1b,0x0305,0x0100,SIS_RI_640x400,  0x00,0x00,0x05,0x10}, /* 640x400x8 */
++	{0x30,0x2a1b,0x0407,0x0103,SIS_RI_800x600,  0x00,0x00,0x07,0x00}, /* 800x600x8 */
++        {0x31,0x0a1b,0x0a0d,0x0000,SIS_RI_720x480,  0x00,0x00,0x06,0x11}, /* 720x480x8 */
++	{0x32,0x0a1b,0x0a0e,0x0000,SIS_RI_720x576,  0x00,0x00,0x06,0x12}, /* 720x576x8 */
++	{0x33,0x0a1d,0x0a0d,0x0000,SIS_RI_720x480,  0x00,0x00,0x06,0x11}, /* 720x480x16 */
++	{0x34,0x2a1d,0x0a0e,0x0000,SIS_RI_720x576,  0x00,0x00,0x06,0x12}, /* 720x576x16 */
++	{0x35,0x0a1f,0x0a0d,0x0000,SIS_RI_720x480,  0x00,0x00,0x06,0x11}, /* 720x480x32 */
++	{0x36,0x2a1f,0x0a0e,0x0000,SIS_RI_720x576,  0x00,0x00,0x06,0x12}, /* 720x576x32 */
++	{0x37,0x0212,0x0508,0x0104,SIS_RI_1024x768, 0x00,0x00,0x08,0x13}, /* 1024x768x? */
++	{0x38,0x0a1b,0x0508,0x0105,SIS_RI_1024x768, 0x00,0x00,0x08,0x13}, /* 1024x768x8 */
++	{0x3a,0x0e3b,0x0609,0x0107,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a}, /* 1280x1024x8 */
++	{0x3c,0x0e3b,0x070a,0x0130,SIS_RI_1600x1200,0x00,0x00,0x00,0x1e}, /* 1600x1200x8 */
++	{0x3d,0x0e7d,0x070a,0x0131,SIS_RI_1600x1200,0x00,0x00,0x00,0x1e}, /* 1600x1200x16 */
++	{0x40,0x9a1c,0x0000,0x010d,SIS_RI_320x200,  0x00,0x00,0x04,0x25}, /* 320x200x15 */
++	{0x41,0x9a1d,0x0000,0x010e,SIS_RI_320x200,  0x00,0x00,0x04,0x25}, /* 320x200x16 */
++	{0x43,0x0a1c,0x0306,0x0110,SIS_RI_640x480,  0x00,0x00,0x05,0x08},
++	{0x44,0x0a1d,0x0306,0x0111,SIS_RI_640x480,  0x00,0x00,0x05,0x08}, /* 640x480x16 */
++	{0x46,0x2a1c,0x0407,0x0113,SIS_RI_800x600,  0x00,0x00,0x07,0x00},
++	{0x47,0x2a1d,0x0407,0x0114,SIS_RI_800x600,  0x00,0x00,0x07,0x00}, /* 800x600x16 */
++	{0x49,0x0a3c,0x0508,0x0116,SIS_RI_1024x768, 0x00,0x00,0x00,0x13},
++	{0x4a,0x0a3d,0x0508,0x0117,SIS_RI_1024x768, 0x00,0x00,0x08,0x13}, /* 1024x768x16 */
++	{0x4c,0x0e7c,0x0609,0x0119,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a},
++	{0x4d,0x0e7d,0x0609,0x011a,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a}, /* 1280x1024x16 */
++	{0x50,0x9a1b,0x0001,0x0132,SIS_RI_320x240,  0x00,0x00,0x04,0x26}, /* 320x240x8  */
++	{0x51,0xba1b,0x0103,0x0133,SIS_RI_400x300,  0x00,0x00,0x07,0x27}, /* 400x300x8  */
++  	{0x52,0xba1b,0x0204,0x0134,SIS_RI_512x384,  0x00,0x00,0x00,0x28}, /* 512x384x8  */
++	{0x56,0x9a1d,0x0001,0x0135,SIS_RI_320x240,  0x00,0x00,0x04,0x26}, /* 320x240x16 */
++	{0x57,0xba1d,0x0103,0x0136,SIS_RI_400x300,  0x00,0x00,0x07,0x27}, /* 400x300x16 */
++ 	{0x58,0xba1d,0x0204,0x0137,SIS_RI_512x384,  0x00,0x00,0x00,0x28}, /* 512x384x16 */
++	{0x59,0x9a1b,0x0000,0x0138,SIS_RI_320x200,  0x00,0x00,0x04,0x25}, /* 320x200x8  */
++	{0x5a,0x021b,0x0014,0x0138,SIS_RI_320x240,  0x00,0x00,0x04,0x3f}, /* 320x240x8  fstn */
++	{0x5b,0x0a1d,0x0014,0x0135,SIS_RI_320x240,  0x00,0x00,0x04,0x3f}, /* 320x240x16 fstn */
++	{0x5c,0xba1f,0x0204,0x0000,SIS_RI_512x384,  0x00,0x00,0x00,0x28}, /* 512x384x32 */
++	{0x5d,0x0a1d,0x0305,0x0139,SIS_RI_640x400,  0x00,0x00,0x07,0x10},
++	{0x5e,0x0a1f,0x0305,0x0000,SIS_RI_640x400,  0x00,0x00,0x07,0x10}, /* 640x400x32 */
++	{0x62,0x0a3f,0x0306,0x013a,SIS_RI_640x480,  0x00,0x00,0x05,0x08}, /* 640x480x32 */
++	{0x63,0x2a3f,0x0407,0x013b,SIS_RI_800x600,  0x00,0x00,0x07,0x00}, /* 800x600x32 */
++	{0x64,0x0a7f,0x0508,0x013c,SIS_RI_1024x768, 0x00,0x00,0x08,0x13}, /* 1024x768x32 */
++	{0x65,0x0eff,0x0609,0x013d,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a}, /* 1280x1024x32 */
++	{0x66,0x0eff,0x070a,0x013e,SIS_RI_1600x1200,0x00,0x00,0x00,0x1e}, /* 1600x1200x32 */
++	{0x68,0x067b,0x080b,0x013f,SIS_RI_1920x1440,0x00,0x00,0x00,0x29}, /* 1920x1440x8 */
++	{0x69,0x06fd,0x080b,0x0140,SIS_RI_1920x1440,0x00,0x00,0x00,0x29}, /* 1920x1440x16 */
++	{0x6b,0x07ff,0x080b,0x0141,SIS_RI_1920x1440,0x00,0x00,0x00,0x29}, /* 1920x1440x32 */
++	{0x6c,0x067b,0x090c,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x2f}, /* 2048x1536x8 */
++	{0x6d,0x06fd,0x090c,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x2f}, /* 2048x1536x16 */
++	{0x6e,0x07ff,0x090c,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x2f}, /* 2048x1536x32 */
++	{0x70,0x2a1b,0x0410,0x0000,SIS_RI_800x480,  0x00,0x00,0x07,0x34}, /* 800x480x8 */
++	{0x71,0x0a1b,0x0511,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x37}, /* 1024x576x8 */
++	{0x74,0x0a1d,0x0511,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x37}, /* 1024x576x16 */
++	{0x75,0x0a3d,0x0612,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x3a}, /* 1280x720x16 */
++	{0x76,0x2a1f,0x0410,0x0000,SIS_RI_800x480,  0x00,0x00,0x07,0x34}, /* 800x480x32 */
++	{0x77,0x0a1f,0x0511,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x37}, /* 1024x576x32 */
++	{0x78,0x0a3f,0x0612,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x3a}, /* 1280x720x32 */
++	{0x79,0x0a3b,0x0612,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x3a}, /* 1280x720x8 */
++	{0x7a,0x2a1d,0x0410,0x0000,SIS_RI_800x480,  0x00,0x00,0x07,0x34}, /* 800x480x16 */
++	{0x7c,0x0e3b,0x060f,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x3d}, /* 1280x960x8 */
++	{0x7d,0x0e7d,0x060f,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x3d}, /* 1280x960x16 */
++	{0x7e,0x0eff,0x060f,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x3d}, /* 1280x960x32 */
++	{0x23,0x0e3b,0x0614,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x40}, /* 1280x768x8 */
++	{0x24,0x0e7d,0x0614,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x40}, /* 1280x768x16 */
++	{0x25,0x0eff,0x0614,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x40}, /* 1280x768x32 */
++	{0x26,0x0e3b,0x0c15,0x0000,SIS_RI_1400x1050,0x00,0x00,0x00,0x41}, /* 1400x1050x8 */
++	{0x27,0x0e7d,0x0c15,0x0000,SIS_RI_1400x1050,0x00,0x00,0x00,0x41}, /* 1400x1050x16 */
++	{0x28,0x0eff,0x0c15,0x0000,SIS_RI_1400x1050,0x00,0x00,0x00,0x41}, /* 1400x1050x32*/
++	{0x29,0x0e1b,0x0d16,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x43}, /* 1152x864 */
++	{0x2a,0x0e3d,0x0d16,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x43},
++	{0x2b,0x0e7f,0x0d16,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x43},
++	{0x39,0x2a1b,0x0b17,0x0000,SIS_RI_848x480,  0x00,0x00,0x00,0x45}, /* 848x480 */
++	{0x3b,0x2a3d,0x0b17,0x0000,SIS_RI_848x480,  0x00,0x00,0x00,0x45},
++	{0x3e,0x2a7f,0x0b17,0x0000,SIS_RI_848x480,  0x00,0x00,0x00,0x45},
++	{0x3f,0x2a1b,0x0b13,0x0000,SIS_RI_856x480,  0x00,0x00,0x00,0x47}, /* 856x480 */
++	{0x42,0x2a3d,0x0b13,0x0000,SIS_RI_856x480,  0x00,0x00,0x00,0x47},
++	{0x45,0x2a7f,0x0b13,0x0000,SIS_RI_856x480,  0x00,0x00,0x00,0x47},
++	{0x48,0x2a1b,0x0e18,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x49}, /* 1360x768 */
++	{0x4b,0x2a3d,0x0e18,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x49},
++	{0x4e,0x2a7f,0x0e18,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x49},
++	{0x4f,0x9a1f,0x0000,0x0000,SIS_RI_320x200,  0x00,0x00,0x04,0x25}, /* 320x200x32 */
++	{0x53,0x9a1f,0x0001,0x0000,SIS_RI_320x240,  0x00,0x00,0x04,0x26}, /* 320x240x32 */
++	{0x54,0xba1f,0x0103,0x0000,SIS_RI_400x300,  0x00,0x00,0x07,0x27}, /* 400x300x32 */
++	{0x5f,0x2a1b,0x0f0e,0x0000,SIS_RI_768x576,  0x00,0x00,0x00,0x4a}, /* 768x576x8 */
++	{0x60,0x2a1d,0x0f0e,0x0000,SIS_RI_768x576,  0x00,0x00,0x00,0x4a}, /* 768x576x16 */
++	{0x61,0x2a1f,0x0f0e,0x0000,SIS_RI_768x576,  0x00,0x00,0x00,0x4a}, /* 768x576x32 */
++	{0xff,0x0000,0x0000,0x0000,0x00,            0x00,0x00,0x00,0x00}
+ };
+ 
+ typedef struct _SiS310_Ext2Struct
+@@ -604,89 +173,87 @@ typedef struct _SiS310_Ext2Struct
+ 	UCHAR  ModeID;
+ 	USHORT XRes;
+ 	USHORT YRes;
+-	USHORT ROM_OFFSET;
+ } SiS310_Ext2Struct;
+ 
+ static const SiS310_Ext2Struct SiS310_RefIndex[]=
+ {
+-/*	{0x005f,0x0d,0x03,0x05,0x6a, 800, 600,0x3a81},    0x0 - TW: Patch for Chrontel 7019  */
+-	{0x085f,0x0d,0x03,0x05,0x6a, 800, 600,0x3a81}, /* 0x0 */
+-	{0x0467,0x0e,0x04,0x05,0x6a, 800, 600,0x3a86}, /* 0x1 */
+-	{0x0067,0x0f,0x08,0x48,0x6a, 800, 600,0x3a8b}, /* 0x2 */
+-	{0x0067,0x10,0x07,0x8b,0x6a, 800, 600,0x3a90}, /* 0x3 */
+-	{0x0147,0x11,0x0a,0x00,0x6a, 800, 600,0x3a95}, /* 0x4 */
+-	{0x0147,0x12,0x0d,0x00,0x6a, 800, 600,0x3a9a}, /* 0x5 - 4147 TW: Test sync change */
+-	{0x0047,0x13,0x13,0x00,0x6a, 800, 600,0x3a9f}, /* 0x6 - 4047 */
+-	{0x0047,0x14,0x1c,0x00,0x6a, 800, 600,0x3aa4}, /* 0x7 - 4047 */
+-/*	{0xc05f,0x05,0x00,0x04,0x2e, 640, 480,0x3a57},    0x8 - TW: Patch for Chrontel 7019  */
+-	{0xc85f,0x05,0x00,0x04,0x2e, 640, 480,0x3a57}, /* 0x8 */
+-	{0xc067,0x06,0x02,0x04,0x2e, 640, 480,0x3a5c}, /* 0x9 */
+-	{0xc067,0x07,0x02,0x47,0x2e, 640, 480,0x3a61}, /* 0xa */
+-	{0xc067,0x08,0x03,0x8a,0x2e, 640, 480,0x3a66}, /* 0xb */
+-	{0xc047,0x09,0x05,0x00,0x2e, 640, 480,0x3a6b}, /* 0xc - 4047 */
+-	{0xc047,0x0a,0x09,0x00,0x2e, 640, 480,0x3a70}, /* 0xd - 4047 */
+-	{0xc047,0x0b,0x0e,0x00,0x2e, 640, 480,0x3a75}, /* 0xe - 4047 */
+-	{0xc047,0x0c,0x15,0x00,0x2e, 640, 480,0x3a7a}, /* 0xf */
+-	{0x407f,0x04,0x00,0x00,0x2f, 640, 400,0x3a50}, /* 0x10 */
+-	{0xc00f,0x3c,0x01,0x06,0x31, 720, 480,0x3b85}, /* 0x11 */
+-	{0x000f,0x3d,0x03,0x06,0x32, 720, 576,0x3b8c}, /* 0x12 */
+-	{0x0187,0x15,0x06,0x00,0x37,1024, 768,0x3aab}, /* 0x13 */
+-	{0xc877,0x16,0x0b,0x06,0x37,1024, 768,0x3ab0}, /* 0x14 */
+-	{0xc067,0x17,0x0f,0x49,0x37,1024, 768,0x3ab5}, /* 0x15 */
+-	{0x0267,0x18,0x11,0x00,0x37,1024, 768,0x3aba}, /* 0x16 */
+-	{0x0047,0x19,0x16,0x8c,0x37,1024, 768,0x3abf}, /* 0x17 */
+-	{0x0047,0x1a,0x1b,0x00,0x37,1024, 768,0x3ac4}, /* 0x18 - 4047 */
+-	{0x0007,0x1b,0x1f,0x00,0x37,1024, 768,0x3ac9}, /* 0x19 - 4047 */
+-	{0x0387,0x1c,0x11,0x00,0x3a,1280,1024,0x3adc}, /* 0x1a */
+-	{0x0077,0x1d,0x19,0x07,0x3a,1280,1024,0x3ae1}, /* 0x1b */
+-	{0x0047,0x1e,0x1e,0x00,0x3a,1280,1024,0x3ae6}, /* 0x1c */
+-	{0x0007,0x1f,0x20,0x00,0x3a,1280,1024,0x3aeb}, /* 0x1d */
+-	{0x0027,0x20,0x21,0x09,0x3c,1600,1200,0x3af2}, /* 0x1e */
+-	{0x0007,0x21,0x22,0x00,0x3c,1600,1200,0x3af7}, /* 0x1f */
+-	{0x0007,0x22,0x23,0x00,0x3c,1600,1200,0x3afc}, /* 0x20 */
+-	{0x0007,0x23,0x25,0x00,0x3c,1600,1200,0x3b01}, /* 0x21 */
+-	{0x0007,0x24,0x26,0x00,0x3c,1600,1200,0x3b06}, /* 0x22 */
+-	{0x0007,0x25,0x2c,0x00,0x3c,1600,1200,0x3b0b}, /* 0x23 */
+-	{0x0007,0x26,0x34,0x00,0x3c,1600,1200,0x3b10}, /* 0x24 */
+-	{0x407f,0x00,0x00,0x00,0x40, 320, 200,0x3a34}, /* 0x25 */
+-	{0xc07f,0x01,0x00,0x04,0x50, 320, 240,0x3a3b}, /* 0x26 */
+-	{0x007f,0x02,0x04,0x05,0x51, 400, 300,0x3a42}, /* 0x27 */
+-	{0xc077,0x03,0x0b,0x06,0x52, 512, 384,0x3a49}, /* 0x28 */
+-	{0x8007,0x27,0x27,0x00,0x68,1920,1440,0x3b17}, /* 0x29 */
+-	{0x4007,0x28,0x29,0x00,0x68,1920,1440,0x3b1c}, /* 0x2a */
+-	{0x4007,0x29,0x2e,0x00,0x68,1920,1440,0x3b21}, /* 0x2b */
+-	{0x4007,0x2a,0x30,0x00,0x68,1920,1440,0x3b26}, /* 0x2c */
+-	{0x4007,0x2b,0x35,0x00,0x68,1920,1440,0x3b2b}, /* 0x2d */
+-	{0x4005,0x2c,0x39,0x00,0x68,1920,1440,0x3b30}, /* 0x2e */
+-	{0x4007,0x2d,0x2b,0x00,0x6c,2048,1536,0x3b37}, /* 0x2f */
+-	{0x4007,0x2e,0x31,0x00,0x6c,2048,1536,0x3b3c}, /* 0x30 */
+-	{0x4007,0x2f,0x33,0x00,0x6c,2048,1536,0x3b41}, /* 0x31 */
+-	{0x4007,0x30,0x37,0x00,0x6c,2048,1536,0x3b46}, /* 0x32 */
+-	{0x4005,0x31,0x38,0x00,0x6c,2048,1536,0x3b4b}, /* 0x33 */
+-	{0x0057,0x32,0x40,0x08,0x70, 800, 480,0x3b52}, /* 0x34 */
+-	{0x0047,0x33,0x07,0x08,0x70, 800, 480,0x3b57}, /* 0x35 */
+-	{0x0047,0x34,0x0a,0x08,0x70, 800, 480,0x3b5c}, /* 0x36 */
+-	{0x0057,0x35,0x0b,0x09,0x71,1024, 576,0x3b63}, /* 0x37 */
+-	{0x0047,0x36,0x11,0x09,0x71,1024, 576,0x3b68}, /* 0x38 */
+-	{0x0047,0x37,0x16,0x09,0x71,1024, 576,0x3b6d}, /* 0x39 */
+-	{0x0057,0x38,0x19,0x0a,0x75,1280, 720,0x3b74}, /* 0x3a */
+-	{0x0047,0x39,0x1e,0x0a,0x75,1280, 720,0x3b79}, /* 0x3b */
+-	{0x0007,0x3a,0x20,0x0a,0x75,1280, 720,0x3b7e}, /* 0x3c */
+-	{0x0067,0x3b,0x19,0x08,0x7c,1280, 960,0x3ad0}, /* 0x3d */
+-	{0x0027,0x4c,0x59,0x08,0x7c,1280, 960,0x3ad0}, /* 0x3e */
+-	{0xc07f,0x01,0x00,0x06,0x5a, 320, 480,0x3b83}, /* 0x3f */    /* FSTN mode */
+-        {0x0077,0x42,0x12,0x08,0x23,1280, 768,0x0000}, /* 0x40 */  
+-	{0x0067,0x43,0x4d,0x08,0x26,1400,1050,0x0000}, /* 0x41 */  
+-	{0x0007,0x4b,0x5a,0x08,0x26,1400,1050,0x0000}, /* 0x42 */    /* TW: new, not in any BIOS */
+-	{0x0047,0x44,0x19,0x00,0x29,1152, 864,0x0000}, /* 0x43 TW: Non-BIOS, new */
+-	{0x0047,0x4a,0x1e,0x00,0x29,1152, 864,0x0000}, /* 0x44 TW: Non-BIOS, new */
+-	{0x00c7,0x45,0x57,0x00,0x39, 848, 480,0x0000}, /* 0x45 TW: 848x480-38Hzi - Non-BIOS, new */
+-	{0xc047,0x46,0x55,0x00,0x39, 848, 480,0x0000}, /* 0x46 TW: 848x480-60Hz  - Non-BIOS, new */
+-	{0x00c7,0x47,0x57,0x00,0x3f, 856, 480,0x0000}, /* 0x47 TW: 856x480-38Hzi - Non-BIOS, new */
+-	{0xc047,0x48,0x57,0x00,0x3f, 856, 480,0x0000}, /* 0x48 TW: 856x480-60Hz  - Non-BIOS, new */
+-	{0x0047,0x49,0x58,0x00,0x48,1360, 768,0x0000}, /* 0x49 TW: 1360x768-60Hz - Non-BIOS, new */
+-	{0xffff,0x00,0x00,0x00,0x00,   0,   0,0x0000}
+-}; 
++	{0x085f,0x0d,0x03,0x05,0x6a, 800, 600}, /* 0x0 */
++	{0x0467,0x0e,0x04,0x05,0x6a, 800, 600}, /* 0x1 */
++	{0x0067,0x0f,0x08,0x48,0x6a, 800, 600}, /* 0x2 */
++	{0x0067,0x10,0x07,0x8b,0x6a, 800, 600}, /* 0x3 */
++	{0x0147,0x11,0x0a,0x00,0x6a, 800, 600}, /* 0x4 */
++	{0x0147,0x12,0x0d,0x00,0x6a, 800, 600}, /* 0x5 - TW: Test sync change */
++	{0x0047,0x13,0x13,0x00,0x6a, 800, 600}, /* 0x6 */
++	{0x0047,0x14,0x1c,0x00,0x6a, 800, 600}, /* 0x7 */
++	{0xc85f,0x05,0x00,0x04,0x2e, 640, 480}, /* 0x8 */
++	{0xc067,0x06,0x02,0x04,0x2e, 640, 480}, /* 0x9 */
++	{0xc067,0x07,0x02,0x47,0x2e, 640, 480}, /* 0xa */
++	{0xc067,0x08,0x03,0x8a,0x2e, 640, 480}, /* 0xb */
++	{0xc047,0x09,0x05,0x00,0x2e, 640, 480}, /* 0xc */
++	{0xc047,0x0a,0x09,0x00,0x2e, 640, 480}, /* 0xd */
++	{0xc047,0x0b,0x0e,0x00,0x2e, 640, 480}, /* 0xe */
++	{0xc047,0x0c,0x15,0x00,0x2e, 640, 480}, /* 0xf */
++	{0x407f,0x04,0x00,0x00,0x2f, 640, 400}, /* 0x10 */
++	{0xc00f,0x3c,0x01,0x06,0x31, 720, 480}, /* 0x11 */
++	{0x000f,0x3d,0x03,0x06,0x32, 720, 576}, /* 0x12 */
++	{0x0187,0x15,0x06,0x00,0x37,1024, 768}, /* 0x13 */
++	{0xc877,0x16,0x0b,0x06,0x37,1024, 768}, /* 0x14 */
++	{0xc067,0x17,0x0f,0x49,0x37,1024, 768}, /* 0x15 */
++	{0x0267,0x18,0x11,0x00,0x37,1024, 768}, /* 0x16 */
++	{0x0047,0x19,0x16,0x8c,0x37,1024, 768}, /* 0x17 */
++	{0x0047,0x1a,0x1b,0x00,0x37,1024, 768}, /* 0x18 */
++	{0x0007,0x1b,0x1f,0x00,0x37,1024, 768}, /* 0x19 */
++	{0x0387,0x1c,0x11,0x00,0x3a,1280,1024}, /* 0x1a */
++	{0x0077,0x1d,0x19,0x07,0x3a,1280,1024}, /* 0x1b */
++	{0x0047,0x1e,0x1e,0x00,0x3a,1280,1024}, /* 0x1c */
++	{0x0007,0x1f,0x20,0x00,0x3a,1280,1024}, /* 0x1d */
++	{0x0867,0x20,0x21,0x09,0x3c,1600,1200}, /* 0x1e */
++	{0x0007,0x21,0x22,0x00,0x3c,1600,1200}, /* 0x1f */
++	{0x0007,0x22,0x23,0x00,0x3c,1600,1200}, /* 0x20 */
++	{0x0007,0x23,0x25,0x00,0x3c,1600,1200}, /* 0x21 */
++	{0x0007,0x24,0x26,0x00,0x3c,1600,1200}, /* 0x22 */
++	{0x0007,0x25,0x2c,0x00,0x3c,1600,1200}, /* 0x23 */
++	{0x0007,0x26,0x34,0x00,0x3c,1600,1200}, /* 0x24 */
++	{0x407f,0x00,0x00,0x00,0x40, 320, 200}, /* 0x25 */
++	{0xc07f,0x01,0x00,0x04,0x50, 320, 240}, /* 0x26 */
++	{0x007f,0x02,0x04,0x05,0x51, 400, 300}, /* 0x27 */
++	{0xc077,0x03,0x0b,0x06,0x52, 512, 384}, /* 0x28 */
++	{0x8007,0x27,0x27,0x00,0x68,1920,1440}, /* 0x29 */
++	{0x4007,0x28,0x29,0x00,0x68,1920,1440}, /* 0x2a */
++	{0x4007,0x29,0x2e,0x00,0x68,1920,1440}, /* 0x2b */
++	{0x4007,0x2a,0x30,0x00,0x68,1920,1440}, /* 0x2c */
++	{0x4007,0x2b,0x35,0x00,0x68,1920,1440}, /* 0x2d */
++	{0x4005,0x2c,0x39,0x00,0x68,1920,1440}, /* 0x2e */
++	{0x4007,0x2d,0x2b,0x00,0x6c,2048,1536}, /* 0x2f */
++	{0x4007,0x2e,0x31,0x00,0x6c,2048,1536}, /* 0x30 */
++	{0x4007,0x2f,0x33,0x00,0x6c,2048,1536}, /* 0x31 */
++	{0x4007,0x30,0x37,0x00,0x6c,2048,1536}, /* 0x32 */
++	{0x4005,0x31,0x38,0x00,0x6c,2048,1536}, /* 0x33 */
++	{0x0057,0x32,0x40,0x08,0x70, 800, 480}, /* 0x34 */
++	{0x0047,0x33,0x07,0x08,0x70, 800, 480}, /* 0x35 */
++	{0x0047,0x34,0x0a,0x08,0x70, 800, 480}, /* 0x36 */
++	{0x0057,0x35,0x0b,0x09,0x71,1024, 576}, /* 0x37 */
++	{0x0047,0x36,0x11,0x09,0x71,1024, 576}, /* 0x38 */
++	{0x0047,0x37,0x16,0x09,0x71,1024, 576}, /* 0x39 */
++	{0x0057,0x38,0x19,0x0a,0x75,1280, 720}, /* 0x3a */
++	{0x0047,0x39,0x1e,0x0a,0x75,1280, 720}, /* 0x3b */
++	{0x0007,0x3a,0x20,0x0a,0x75,1280, 720}, /* 0x3c */
++	{0x0067,0x3b,0x19,0x08,0x7c,1280, 960}, /* 0x3d */
++	{0x0027,0x4c,0x59,0x08,0x7c,1280, 960}, /* 0x3e */
++	{0xc07f,0x4e,0x00,0x06,0x5a, 320, 240}, /* 0x3f */    /* FSTN 320x240 */
++        {0x0077,0x42,0x5b,0x08,0x23,1280, 768}, /* 0x40 */    /* TW: 0x5b was 0x12 */
++	{0x0067,0x43,0x4d,0x08,0x26,1400,1050}, /* 0x41 */
++	{0x0007,0x4b,0x5a,0x08,0x26,1400,1050}, /* 0x42 TW: not in any BIOS */
++	{0x0047,0x44,0x19,0x00,0x29,1152, 864}, /* 0x43 TW: Non-BIOS, new */
++	{0x0047,0x4a,0x1e,0x00,0x29,1152, 864}, /* 0x44 TW: Non-BIOS, new */
++	{0x00c7,0x45,0x57,0x00,0x39, 848, 480}, /* 0x45 TW: 848x480-38Hzi - Non-BIOS, new */
++	{0xc047,0x46,0x55,0x00,0x39, 848, 480}, /* 0x46 TW: 848x480-60Hz  - Non-BIOS, new */
++	{0x00c7,0x47,0x57,0x00,0x3f, 856, 480}, /* 0x47 TW: 856x480-38Hzi - Non-BIOS, new */
++	{0xc047,0x48,0x57,0x00,0x3f, 856, 480}, /* 0x48 TW: 856x480-60Hz  - Non-BIOS, new */
++	{0x0047,0x49,0x58,0x00,0x48,1360, 768}, /* 0x49 TW: 1360x768-60Hz - Non-BIOS, new */
++	{0x000f,0x4d,0x03,0x06,0x5f, 768, 576}, /* 0x4a TW: 768x576 */
++	{0xffff,0x00,0x00,0x00,0x00,   0,   0}
++};
+ 
+ typedef struct _SiS310_CRT1TableStruct
+ {
+@@ -710,7 +277,7 @@ static const SiS310_CRT1TableStruct SiS3
+  {{0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+    0x9c,0x8e,0x8f,0x96,0xb9,0x30,0x00,0x05,
+    0x00}}, /* 0x4 */
+-#if 0   
++#if 0
+  {{0x5f,0x4f,0x50,0x82,0x55,0x81,0x0b,0x3e,
+    0xe9,0x8b,0xdf,0xe7,0x04,0x00,0x00,0x05,
+    0x00}}, /* 0x5 */
+@@ -940,19 +507,25 @@ static const SiS310_CRT1TableStruct SiS3
+    0x00}},  /* 0x4b */ 
+  {{0xd3,0x9f,0x9f,0x97,0xab,0x1f,0xf1,0xff, /* TW: New, 1280x960-85, not in any BIOS */
+    0xc0,0x83,0xbf,0xbf,0xf2,0x10,0x00,0x07,
+-   0x01}}   /* 0x4c */
++   0x01}},  /* 0x4c */
++ {{0x7b,0x5f,0x63,0x9f,0x6a,0x93,0x6f,0xf0, /* 768x576 */
++   0x58,0x8a,0x3f,0x57,0x70,0x20,0x00,0x05,
++   0x01}},  /* 0x4d */
++ {{0x2d,0x27,0x28,0x90,0x2c,0x80,0x0b,0x3e, /* FSTN 320x480, TEMP - possibly invalid */
++   0xe9,0x8b,0xdf,0xe7,0x04,0x00,0x00,0x00,
++   0x00}}   /* 0x4e */
+ };
+ 
+-
+ typedef struct _SiS310_MCLKDataStruct
+ {
+ 	UCHAR SR28,SR29,SR2A;
+ 	USHORT CLOCK;
+ } SiS310_MCLKDataStruct;
+ 
++#ifdef LINUXBIOS
+ static const SiS310_MCLKDataStruct SiS310_MCLKData_0_315[] =
+ {
+-	{ 0x3b,0x22,0x01,143},   /* TW: Was { 0x5c,0x23,0x01,166}, */
++	{ 0x3b,0x22,0x01,143},
+ 	{ 0x5c,0x23,0x01,166},
+ 	{ 0x5c,0x23,0x01,166},
+ 	{ 0x5c,0x23,0x01,166},
+@@ -962,7 +535,7 @@ static const SiS310_MCLKDataStruct SiS31
+ 	{ 0x5c,0x23,0x01,166}
+ };
+ 
+-static const SiS310_MCLKDataStruct SiS310_MCLKData_0_650[] =	/* @ 0x54 */
++static const SiS310_MCLKDataStruct SiS310_MCLKData_0_650[] =
+ {
+ 	{ 0x5a,0x64,0x82, 66},
+ 	{ 0xb3,0x45,0x82, 83},
+@@ -973,8 +546,22 @@ static const SiS310_MCLKDataStruct SiS31
+ 	{ 0x37,0x22,0x82,133},
+ 	{ 0x37,0x22,0x82,133}
+ };
++#endif
++
++static const SiS310_MCLKDataStruct SiS310_MCLKData_0_330[] =
++{
++	{ 0x5c,0x23,0x01,166},
++	{ 0x5c,0x23,0x01,166},
++	{ 0x7c,0x08,0x01,200},
++	{ 0x79,0x06,0x01,250},
++	{ 0x7c,0x08,0x01,200},
++	{ 0x7c,0x08,0x01,200},
++	{ 0x7c,0x08,0x01,200},
++	{ 0x79,0x06,0x01,250}
++};
+ 
+-static const SiS310_MCLKDataStruct SiS310_MCLKData_0_330[] =   /* @ 0x54 */
++#ifdef LINUXBIOS
++static const SiS310_MCLKDataStruct SiS310_MCLKData_0_660[] =  /* TODO */
+ {
+ 	{ 0x5c,0x23,0x01,166},
+ 	{ 0x5c,0x23,0x01,166},
+@@ -985,8 +572,9 @@ static const SiS310_MCLKDataStruct SiS31
+ 	{ 0x7c,0x08,0x01,200},
+ 	{ 0x79,0x06,0x01,250}
+ };
++#endif
+ 
+-static const SiS310_MCLKDataStruct SiS310_MCLKData_1[] =	/* @ 0x155 */
++static const SiS310_MCLKDataStruct SiS310_MCLKData_1[] =
+ {
+         { 0x29,0x21,0x82,150},
+ 	{ 0x5c,0x23,0x82,166},
+@@ -998,6 +586,7 @@ static const SiS310_MCLKDataStruct SiS31
+ 	{ 0x37,0x22,0x82,133}
+ };
+ 
++#ifdef LINUXBIOS
+ typedef struct _SiS310_ECLKDataStruct
+ {
+  	UCHAR SR2E,SR2F,SR30;
+@@ -1011,6 +600,7 @@ static const SiS310_ECLKDataStruct SiS31
+ 	{ 0x5c,0x23,0x01,166},
+ 	{ 0x5c,0x23,0x01,166}
+ };
++#endif
+ 
+ typedef struct _SiS310_VCLKDataStruct
+ {
+@@ -1020,22 +610,22 @@ typedef struct _SiS310_VCLKDataStruct
+ 
+ static const SiS310_VCLKDataStruct SiS310_VCLKData[]=
+ {
+-	{ 0x1b,0xe1, 25}, /* 0x0 */   /* 650/LVDS BIOS: @ 0x5647 */
+-	{ 0x4e,0xe4, 28}, /* 0x1 */
+-	{ 0x57,0xe4, 31}, /* 0x2 */
+-	{ 0xc3,0xc8, 36}, /* 0x3 */
+-	{ 0x42,0xe2, 40}, /* 0x4 */
+-	{ 0xfe,0xcd, 43}, /* 0x5 */
+-	{ 0x5d,0xc4, 44}, /* 0x6 */
+-	{ 0x52,0xe2, 49}, /* 0x7 */
+-	{ 0x53,0xe2, 50}, /* 0x8 */
+-	{ 0x74,0x67, 52}, /* 0x9 */
+-	{ 0x6d,0x66, 56}, /* 0xa */
+-	{ 0x5a,0x64, 65}, /* 0xb */   /* TW: was 6c c3 - WRONG */
+-	{ 0x46,0x44, 67}, /* 0xc */
+-	{ 0xb1,0x46, 68}, /* 0xd */
+-	{ 0xd3,0x4a, 72}, /* 0xe */
+-	{ 0x29,0x61, 75}, /* 0xf */
++	{ 0x1b,0xe1, 25}, /* 0x00 */
++	{ 0x4e,0xe4, 28}, /* 0x01 */
++	{ 0x57,0xe4, 31}, /* 0x02 */
++	{ 0xc3,0xc8, 36}, /* 0x03 */
++	{ 0x42,0xe2, 40}, /* 0x04 */
++	{ 0xfe,0xcd, 43}, /* 0x05 */
++	{ 0x5d,0xc4, 44}, /* 0x06 */
++	{ 0x52,0xe2, 49}, /* 0x07 */
++	{ 0x53,0xe2, 50}, /* 0x08 */
++	{ 0x74,0x67, 52}, /* 0x09 */
++	{ 0x6d,0x66, 56}, /* 0x0a */
++	{ 0x5a,0x64, 65}, /* 0x0b */  /* TW: was 6c c3 - WRONG */
++	{ 0x46,0x44, 67}, /* 0x0c */
++	{ 0xb1,0x46, 68}, /* 0x0d */
++	{ 0xd3,0x4a, 72}, /* 0x0e */
++	{ 0x29,0x61, 75}, /* 0x0f */
+ 	{ 0x6e,0x46, 76}, /* 0x10 */
+ 	{ 0x2b,0x61, 78}, /* 0x11 */
+ 	{ 0x31,0x42, 79}, /* 0x12 */
+@@ -1045,7 +635,7 @@ static const SiS310_VCLKDataStruct SiS31
+ 	{ 0x62,0x44, 94}, /* 0x16 */
+ 	{ 0x2b,0x41,104}, /* 0x17 */
+ 	{ 0x3a,0x23,105}, /* 0x18 */
+-	{ 0x70,0x44,108}, /* 0x19 */
++	{ 0x70,0x44,108}, /* 0x19 */  /* 1400x1050 LCD */
+ 	{ 0x3c,0x23,109}, /* 0x1a */
+ 	{ 0x5e,0x43,113}, /* 0x1b */
+ 	{ 0xbc,0x44,116}, /* 0x1c */
+@@ -1078,12 +668,12 @@ static const SiS310_VCLKDataStruct SiS31
+ 	{ 0xea,0x08,340}, /* 0x37 */
+ 	{ 0xe8,0x07,376}, /* 0x38 */
+ 	{ 0xde,0x06,389}, /* 0x39 */
+-	{ 0x52,0x2a, 54}, /* 0x3a */
+-	{ 0x52,0x6a, 27}, /* 0x3b */
+-	{ 0x62,0x24, 70}, /* 0x3c */
+-	{ 0x62,0x64, 70}, /* 0x3d */
+-	{ 0xa8,0x4c, 30}, /* 0x3e */
+-	{ 0x20,0x26, 33}, /* 0x3f */
++	{ 0x52,0x2a, 54}, /* 0x3a */  /* 301 TV */
++	{ 0x52,0x6a, 27}, /* 0x3b */  /* 301 TV */
++	{ 0x62,0x24, 70}, /* 0x3c */  /* 301 TV */
++	{ 0x62,0x64, 70}, /* 0x3d */  /* 301 TV */
++	{ 0xa8,0x4c, 30}, /* 0x3e */  /* 301 TV */
++	{ 0x20,0x26, 33}, /* 0x3f */  /* 301 TV */
+ 	{ 0x31,0xc2, 39}, /* 0x40 */
+ 	{ 0x60,0x36, 30}, /* 0x41 */  /* Chrontel */
+ 	{ 0x40,0x4a, 28}, /* 0x42 */  /* Chrontel */
+@@ -1096,7 +686,7 @@ static const SiS310_VCLKDataStruct SiS31
+ 	{ 0xce,0x3c, 39}, /* 0x49 */
+ 	{ 0x52,0x4a, 36}, /* 0x4a */  /* Chrontel */
+ 	{ 0x34,0x61, 95}, /* 0x4b */
+-	{ 0x78,0x27,108}, /* 0x4c - was 102 */  /* TW: Last entry in 650/301 BIOS */
++	{ 0x78,0x27,108}, /* 0x4c - was 102 */
+ 	{ 0x66,0x43,123}, /* 0x4d */  /* Modes 0x26-0x28 (1400x1050) */
+ 	{ 0x41,0x4e, 21}, /* 0x4e */
+ 	{ 0xa1,0x4a, 29}, /* 0x4f */  /* Chrontel */
+@@ -1110,7 +700,8 @@ static const SiS310_VCLKDataStruct SiS31
+ 	{ 0xbf,0xc8, 35}, /* 0x57 - added for 856x480-38i,60 (not in any BIOS) */
+ 	{ 0x30,0x23, 88}, /* 0x58 - added for 1360x768-62 (is 60Hz!) (not in any BIOS) */
+ 	{ 0x52,0x07,149}, /* 0x59 - added for 1280x960-85 (Not in any BIOS) */
+-	{ 0x56,0x07,156}  /* 0x5a - added for 1400x1050-75 */
++	{ 0x56,0x07,156}, /* 0x5a - added for 1400x1050-75 */
++   	{ 0x70,0x29, 81}  /* 0x5b */  /* 1280x768 LCD */
+ };
+ 
+ typedef struct _SiS310_VBVCLKDataStruct
+@@ -1121,22 +712,22 @@ typedef struct _SiS310_VBVCLKDataStruct
+ 
+ static const SiS310_VBVCLKDataStruct SiS310_VBVCLKData[]=
+ {
+-	{ 0x1b,0xe1, 25}, /* 0x0 */   /* 650/LVDS BIOS: @ 0x579c */
+-	{ 0x4e,0xe4, 28}, /* 0x1 */
+-	{ 0x57,0xe4, 31}, /* 0x2 */
+-	{ 0xc3,0xc8, 36}, /* 0x3 */
+-	{ 0x42,0x47, 40}, /* 0x4 */
+-	{ 0xfe,0xcd, 43}, /* 0x5 */
+-	{ 0x5d,0xc4, 44}, /* 0x6 */
+-	{ 0x52,0x47, 49}, /* 0x7 */
+-	{ 0x53,0x47, 50}, /* 0x8 */
+-	{ 0x74,0x67, 52}, /* 0x9 */
+-	{ 0x6d,0x66, 56}, /* 0xa */
+-	{ 0x35,0x62, 65}, /* 0xb */  /* Was 0x5a,0x64 - 650/LVDS+301 bios: 35,62  */
+-	{ 0x46,0x44, 67}, /* 0xc */
+-	{ 0xb1,0x46, 68}, /* 0xd */
+-	{ 0xd3,0x4a, 72}, /* 0xe */
+-	{ 0x29,0x61, 75}, /* 0xf */
++	{ 0x1b,0xe1, 25}, /* 0x00 */
++	{ 0x4e,0xe4, 28}, /* 0x01 */
++	{ 0x57,0xe4, 31}, /* 0x02 */
++	{ 0xc3,0xc8, 36}, /* 0x03 */
++	{ 0x42,0x47, 40}, /* 0x04 */
++	{ 0xfe,0xcd, 43}, /* 0x05 */
++	{ 0x5d,0xc4, 44}, /* 0x06 */
++	{ 0x52,0x47, 49}, /* 0x07 */
++	{ 0x53,0x47, 50}, /* 0x08 */
++	{ 0x74,0x67, 52}, /* 0x09 */
++	{ 0x6d,0x66, 56}, /* 0x0a */
++	{ 0x35,0x62, 65}, /* 0x0b */  /* Was 0x5a,0x64 - 650/LVDS+301 bios: 35,62  */
++	{ 0x46,0x44, 67}, /* 0x0c */
++	{ 0xb1,0x46, 68}, /* 0x0d */
++	{ 0xd3,0x4a, 72}, /* 0x0e */
++	{ 0x29,0x61, 75}, /* 0x0f */
+ 	{ 0x6d,0x46, 75}, /* 0x10 */
+ 	{ 0x41,0x43, 78}, /* 0x11 */
+ 	{ 0x31,0x42, 79}, /* 0x12 */
+@@ -1146,7 +737,7 @@ static const SiS310_VBVCLKDataStruct SiS
+ 	{ 0x62,0x44, 94}, /* 0x16 */
+ 	{ 0x2b,0x22,104}, /* 0x17 */
+ 	{ 0x49,0x24,105}, /* 0x18 */
+-	{ 0xf8,0x2f,108}, /* 0x19 */
++	{ 0xf8,0x2f,108}, /* 0x19 */  /* 1400x1050 LCD */
+ 	{ 0x3c,0x23,109}, /* 0x1a */
+ 	{ 0x5e,0x43,113}, /* 0x1b */
+ 	{ 0xbc,0x44,116}, /* 0x1c */
+@@ -1179,19 +770,19 @@ static const SiS310_VBVCLKDataStruct SiS
+ 	{ 0xea,0x08,340}, /* 0x37 */
+ 	{ 0xe8,0x07,376}, /* 0x38 */
+ 	{ 0xde,0x06,389}, /* 0x39 */
+-	{ 0x52,0x2a, 54}, /* 0x3a */
+-	{ 0x52,0x6a, 27}, /* 0x3b */
+-	{ 0x62,0x24, 70}, /* 0x3c */
+-	{ 0x62,0x64, 70}, /* 0x3d */
+-	{ 0xa8,0x4c, 30}, /* 0x3e */
+-	{ 0x20,0x26, 33}, /* 0x3f */
++	{ 0x52,0x2a, 54}, /* 0x3a */  /* 301 TV */
++	{ 0x52,0x6a, 27}, /* 0x3b */  /* 301 TV */
++	{ 0x62,0x24, 70}, /* 0x3c */  /* 301 TV */
++	{ 0x62,0x64, 70}, /* 0x3d */  /* 301 TV */
++	{ 0xa8,0x4c, 30}, /* 0x3e */  /* 301 TV */
++	{ 0x20,0x26, 33}, /* 0x3f */  /* 301 TV */
+ 	{ 0x31,0xc2, 39}, /* 0x40 */
+-	{ 0x2e,0x48, 25}, /* 0x41 */
+-	{ 0x24,0x46, 25}, /* 0x42 */
+-	{ 0x26,0x64, 28}, /* 0x43 */
+-	{ 0x37,0x64, 40}, /* 0x44 */
+-	{ 0xa1,0x42,108}, /* 0x45 */
+-	{ 0x37,0x61,100}, /* 0x46 */
++	{ 0x2e,0x48, 25}, /* 0x41 */  /* Replacement for LCD on 315 for index 0 */
++	{ 0x24,0x46, 25}, /* 0x42 */  /* Replacement for LCD on 315 for modes 0x01, 0x03, 0x0f, 0x10, 0x12 */
++	{ 0x26,0x64, 28}, /* 0x43 */  /* Replacement for LCD on 315 for index 1 */
++	{ 0x37,0x64, 40}, /* 0x44 */  /* Replacement for LCD on 315 for index 4 */
++	{ 0xa1,0x42,108}, /* 0x45 */  /* 1280x960 LCD */
++	{ 0x37,0x61,100}, /* 0x46 */  /* 1280x960 LCD */
+ 	{ 0x78,0x27,108}, /* 0x47 */
+ 	{ 0x97,0x2c, 26}, /* 0x48 */  /* UNUSED - Entries from here new, not in any BIOS */
+ 	{ 0xce,0x3c, 39}, /* 0x49 */  /* UNUSED */
+@@ -1211,72 +802,17 @@ static const SiS310_VBVCLKDataStruct SiS
+ 	{ 0xbf,0xc8, 35}, /* 0x57 */  /* 856x480-38i,60  */
+ 	{ 0x30,0x23, 88}, /* 0x58 */  /* 1360x768-62 (is 60Hz!) TEMP, UNUSED */
+ 	{ 0x52,0x07,149}, /* 0x59 */  /* 1280x960-85  - UNUSED */
+-	{ 0x56,0x07,156}  /* 0x5a */  /* 1400x1050-75 - UNUSED */
++	{ 0x56,0x07,156}, /* 0x5a */  /* 1400x1050-75 - UNUSED */
++   	{ 0x70,0x29, 81}  /* 0x5b */  /* 1280x768 LCD */
+ };
+ 
+ static const UCHAR SiS310_ScreenOffset[] = 
+ {
+         0x14,0x19,0x20,0x28,0x32,0x40,0x50,0x64,
+-	0x78,0x80,0x2d,0x35,0x57,0x48,0x55,
++	0x78,0x80,0x2d,0x35,0x57,0x48,0x55,0x30,
+ 	0xff
+-};      /* TW: Added 1400x1050, 1152x864, 848/856x480, 1360x768 */
+-
+-typedef struct _SiS310_StResInfoStruct
+-{
+-	USHORT HTotal;
+-	USHORT VTotal;
+-} SiS310_StResInfoStruct;
+-
+-static const SiS310_StResInfoStruct SiS310_StResInfo[]=
+-{
+-	{ 640,400},
+-	{ 640,350},
+-	{ 720,400},
+-	{ 720,350},
+-	{ 640,480}
+-};
+-
+-typedef struct _SiS310_ModeResInfoStruct
+-{
+-	USHORT HTotal;
+-	USHORT VTotal;
+-	UCHAR  XChar;
+-	UCHAR  YChar;
+-} SiS310_ModeResInfoStruct;
+-
+-static const SiS310_ModeResInfoStruct SiS310_ModeResInfo[] =
+-{
+-	{  320, 200, 8, 8},   /* 0x00 */
+-	{  320, 240, 8, 8},   /* 0x01 */
+-	{  320, 400, 8, 8},   /* 0x02 */
+-	{  400, 300, 8, 8},   /* 0x03 */
+-	{  512, 384, 8, 8},   /* 0x04 */
+-	{  640, 400, 8,16},   /* 0x05 */
+-	{  640, 480, 8,16},   /* 0x06 */
+-	{  800, 600, 8,16},   /* 0x07 */
+-	{ 1024, 768, 8,16},   /* 0x08 */
+-	{ 1280,1024, 8,16},   /* 0x09 */
+-	{ 1600,1200, 8,16},   /* 0x0a */
+-	{ 1920,1440, 8,16},   /* 0x0b */
+-	{ 2048,1536, 8,16},   /* 0x0c */
+-	{  720, 480, 8,16},   /* 0x0d */
+-	{  720, 576, 8,16},   /* 0x0e */
+-	{ 1280, 960, 8,16},   /* 0x0f */
+-	{  800, 480, 8,16},   /* 0x10 */
+-	{ 1024, 576, 8,16},   /* 0x11 */
+-	{ 1280, 720, 8,16},   /* 0x12 */
+-	{  856, 480, 8,16},   /* 0x13 - TW: New, not in any BIOS */
+-	{ 1280, 768, 8,16},   /* 0x14 20; TW: New */
+-	{ 1400,1050, 8,16},   /* 0x15 21; TW: New */
+-	{ 1152, 864, 8,16},   /* 0x16 - TW: New, not in any BIOS */
+-	{  848, 480, 8,16},   /* 0x17 - TW: New, not in any BIOS */
+-	{ 1360, 768, 8,16}    /* 0x18 - TW: New, not in any BIOS */
+ };
+ 
+-static const UCHAR SiS310_OutputSelect = 0x40;
+-
+-static const UCHAR SiS310_SoftSetting  = 0x30;   /* TW: RAM setting */
+-
+ static const UCHAR SiS310_SR15[8][4]={
+ 	{0x00,0x04,0x60,0x60},
+ 	{0x0f,0x0f,0x0f,0x0f},
+@@ -1322,16 +858,6 @@ static const USHORT SiS310_VideoSenseDat
+ static const USHORT SiS310_YCSenseData2    = 0x016b;
+ #endif
+ 
+-static const UCHAR SiS310_NTSCPhase[]    = {0x21,0xed,0xba,0x08};  /* TW: Was {0x21,0xed,0x8a,0x08}; */
+-static const UCHAR SiS310_PALPhase[]     = {0x2a,0x05,0xe3,0x00};  /* TW: Was {0x2a,0x05,0xd3,0x00}; */
+-static const UCHAR SiS310_PALMPhase[]    = {0x21,0xE4,0x2E,0x9B};  /* TW: palm*/
+-static const UCHAR SiS310_PALNPhase[]    = {0x21,0xF4,0x3E,0xBA};  /* TW: paln*/
+-static const UCHAR SiS310_NTSCPhase2[]   = {0x21,0xF0,0x7B,0xD6};
+-static const UCHAR SiS310_PALPhase2[]    = {0x2a,0x09,0x86,0xe9};
+-static const UCHAR SiS310_PALMPhase2[]   = {0x21,0xE6,0xEF,0xA4};  /* TW: palm 301b*/
+-static const UCHAR SiS310_PALNPhase2[]   = {0x21,0xF6,0x94,0x46};  /* TW: paln 301b*/
+-static const UCHAR SiS310_SpecialPhase[] = {0x1e,0x8c,0x5c,0x7a};
+-
+ typedef struct _SiS310_LCDDataStruct
+ {
+ 	USHORT RVBHCMAX;
+@@ -1353,25 +879,6 @@ static const SiS310_LCDDataStruct  SiS31
+ 	{    1,   1,1344, 806,1344, 806}
+ };
+ 
+-#if 0   /* Seems out-dated, all BIOSes since 03/27/2002 have the other version */
+-static const SiS310_LCDDataStruct  SiS310_ExtLCD1024x768Data[] = 
+-{
+-	{   12,   5, 896, 512,1344, 806},
+-	{   12,   5, 896, 510,1344, 806},
+-	{   32,  15,1008, 505,1344, 806},
+-	{   32,  15,1008, 514,1344, 806},
+-	{   12,   5, 896, 500,1344, 806},
+-	{   42,  25,1024, 625,1344, 806},
+-	{    1,   1,1344, 806,1344, 806},
+-	{   12,   5, 896, 500,1344, 806},
+-	{   42,  25,1024, 625,1344, 806},
+-	{    1,   1,1344, 806,1344, 806},
+-	{   12,   5, 896, 500,1344, 806},
+-	{   42,  25,1024, 625,1344, 806},
+-	{    1,   1,1344, 806,1344, 806}
+-};
+-#endif
+-
+ static const SiS310_LCDDataStruct  SiS310_ExtLCD1024x768Data[] =   
+ {
+ 	{   42,  25,1536, 419,1344, 806},
+@@ -1463,272 +970,14 @@ static const SiS310_LCDDataStruct  SiS31
+ 	{    1,   1,1688,1066,1688,1066}
+ };
+ 
+-static const SiS310_LCDDataStruct  SiS310_LCD1280x960Data[] =
+-{
+-	{    9,   2, 800, 500,1800,1000},
+-	{    9,   2, 800, 500,1800,1000},
+-	{    4,   1, 900, 500,1800,1000},
+-	{    4,   1, 900, 500,1800,1000},
+-	{    9,   2, 800, 500,1800,1000},
+-	{   30,  11,1056, 625,1800,1000},
+-	{    5,   3,1350, 800,1800,1000},
+-	{    1,   1,1576,1050,1576,1050},
+-	{    1,   1,1800,1000,1800,1000}
+-};
+-
+-static const SiS310_LCDDataStruct  SiS310_StLCD1400x1050Data[] = 
+-{  /* TW: New from 1.11.6s */
+-	{ 211,  100, 2100,  408, 1688, 1066 },
+-	{ 211,   64, 1536,  358, 1688, 1066 },
+-	{ 211,  100, 2100,  408, 1688, 1066 },
+-	{ 211,   64, 1536,  358, 1688, 1066 },
+-	{ 211,   48,  840,  488, 1688, 1066 },
+-	{ 211,   72, 1008,  609, 1688, 1066 },
+-	{ 211,  128, 1400,  776, 1688, 1066 },
+-	{ 211,  205, 1680, 1041, 1688, 1066 },
+-	{   1,    1, 1688, 1066, 1688, 1066 }
+-};
+-
+-static const SiS310_LCDDataStruct  SiS310_ExtLCD1400x1050Data[] = 
+-{  /* TW: New from 1.11.6s */
+-	{ 211,  100, 2100,  408, 1688, 1066 },
+-	{ 211,   64, 1536,  358, 1688, 1066 },
+-	{ 211,  100, 2100,  408, 1688, 1066 },
+-	{ 211,   64, 1536,  358, 1688, 1066 },
+-	{ 211,   48,  840,  488, 1688, 1066 },
+-	{ 211,   72, 1008,  609, 1688, 1066 },
+-	{ 211,  128, 1400,  776, 1688, 1066 },
+-	{ 211,  205, 1680, 1041, 1688, 1066 },
+-	{   1,    1, 1688, 1066, 1688, 1066 }
+-};
+-
+-static const SiS310_LCDDataStruct  SiS310_NoScaleData1400x1050[] = 
+-{  /* TW: To be checked (BIOS uses 1280x1024 data, one line too short) */
+-	{ 1, 1, 1688, 1066, 1688, 1066 },
+-	{ 1, 1, 1688, 1066, 1688, 1066 },
+-	{ 1, 1, 1688, 1066, 1688, 1066 },
+-	{ 1, 1, 1688, 1066, 1688, 1066 },
+-	{ 1, 1, 1688, 1066, 1688, 1066 },
+-	{ 1, 1, 1688, 1066, 1688, 1066 },
+-	{ 1, 1, 1688, 1066, 1688, 1066 },
+-	{ 1, 1, 1688, 1066, 1688, 1066 },
+-	{ 1, 1, 1688, 1066, 1688, 1066 }
+-};
+-
+-static const SiS310_LCDDataStruct  SiS310_StLCD1600x1200Data[] = 
+-{  /* TODO */
+-	{    0,   0,   0,   0,   0,   0}
+-};
+-
+-static const SiS310_LCDDataStruct  SiS310_ExtLCD1600x1200Data[] = 
+-{  /* TODO */
+-	{    0,   0,   0,   0,   0,   0}
+-};
+-
+-static const SiS310_LCDDataStruct  SiS310_NoScaleData1600x1200[] = 
+-{  /* TODO */
+-	{    0,   0,   0,   0,   0,   0}
+-};
+-
+-typedef struct _SiS310_TVDataStruct
+-{
+-	USHORT RVBHCMAX;
+-	USHORT RVBHCFACT;
+-	USHORT VGAHT;
+-	USHORT VGAVT;
+-	USHORT TVHDE;
+-	USHORT TVVDE;
+-	USHORT RVBHRS;
+-	UCHAR FlickerMode;
+-	USHORT HALFRVBHRS;
+-	UCHAR RY1COE;
+-	UCHAR RY2COE;
+-	UCHAR RY3COE;
+-	UCHAR RY4COE;
+-} SiS310_TVDataStruct;
+-
+-static const SiS310_TVDataStruct  SiS310_StPALData[]=
+-{
+- {    1,   1, 864, 525,1270, 400, 100,   0, 760,0xf4,0xff,0x1c,0x22},
+- {    1,   1, 864, 525,1270, 350, 100,   0, 760,0xf4,0xff,0x1c,0x22},
+- {    1,   1, 864, 525,1270, 400,   0,   0, 720,0xf1,0x04,0x1f,0x18},
+- {    1,   1, 864, 525,1270, 350,   0,   0, 720,0xf4,0x0b,0x1c,0x0a},
+- {    1,   1, 864, 525,1270, 480,  50,   0, 760,0xf4,0xff,0x1c,0x22},
+- {    1,   1, 864, 525,1270, 600,  50,   0,   0,0xf4,0xff,0x1c,0x22}
+-};
+-
+-static const SiS310_TVDataStruct  SiS310_ExtPALData[] =   
+-{
+- {   27,  10, 848, 448,1270, 530,  50,   0,  50,0xf4,0xff,0x1c,0x22},
+- {  108,  35, 848, 398,1270, 530,  50,   0,  50,0xf4,0xff,0x1c,0x22},
+- {   12,   5, 954, 448,1270, 530,  50,   0,  50,0xf1,0x04,0x1f,0x18},
+- {    9,   4, 960, 463,1644, 438,  50,   0,  50,0xf4,0x0b,0x1c,0x0a},
+- {    9,   4, 848, 528,1270, 530,   0,   0,  50,0xf5,0xfb,0x1b,0x2a},  /* 640x480 */
+- {   36,  25,1060, 648,1316, 530, 438,   0, 438,0xeb,0x05,0x25,0x16},  /* 800x600 */
+- {    3,   2,1080, 619,1270, 540, 438,   0, 438,0xf3,0x00,0x1d,0x20},  /* 720x480/576 */
+- {    1,   1,1170, 821,1270, 520, 686,   0, 686,0xF3,0x00,0x1D,0x20}   /* 1024x768 */
+-};
+-
+-static const SiS310_TVDataStruct  SiS310_StNTSCData[]=
+-{
+- {    1,   1, 858, 525,1270, 400,  50,   0, 760,0xf1,0x04,0x1f,0x18},
+- {    1,   1, 858, 525,1270, 350,  50,   0, 640,0xf1,0x04,0x1f,0x18},
+- {    1,   1, 858, 525,1270, 400,   0,   0, 720,0xf1,0x04,0x1f,0x18},
+- {    1,   1, 858, 525,1270, 350,   0,   0, 720,0xf4,0x0b,0x1c,0x0a},
+- {    1,   1, 858, 525,1270, 480,   0,   0, 760,0xf1,0x04,0x1f,0x18}
+-};
+-
+-static const SiS310_TVDataStruct  SiS310_ExtNTSCData[]=
+-{
+- {  143,  65, 858, 443,1270, 440, 171,   0, 171,0xf1,0x04,0x1f,0x18},
+- {   88,  35, 858, 393,1270, 440, 171,   0, 171,0xf1,0x04,0x1f,0x18},
+- {  143,  70, 924, 443,1270, 440,  92,   0,  92,0xf1,0x04,0x1f,0x18},
+- {  143,  70, 924, 393,1270, 440,  92,   0,  92,0xf4,0x0b,0x1c,0x0a},
+- {  143,  76, 836, 523,1270, 440, 224,   0,   0,0xf1,0x05,0x1f,0x16},  /* 640x480 */
+- {  143, 120,1056, 643,1270, 440,   0, 128,   0,0xf4,0x10,0x1c,0x00},  /* 800x600  */
+- {    2,   1, 858, 503,1270, 480,   0, 128,   0,0xee,0x0c,0x22,0x08},  /* 720x480/576 */
+- {   65,  64,1056, 791,1270, 480, 638,   0,   0,0xEE,0x0C,0x22,0x08}   /* 1024x768 */
+-};
+-
+-#if 0
+-static const SiS310_TVDataStruct  SiS310_St1HiTVData[]=
+-{
+-  
+-};
+-#endif
+-
+-static const SiS310_TVDataStruct  SiS310_St2HiTVData[]=
+-{
+- {    3,   1, 0x348,0x1e3,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
+- {    1,   1, 0x37c,0x233,0x2b2,0x2bc, 	  0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    3,   1, 0x348,0x1e3,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
+- {    1,   1, 0x3e8,0x233,0x311,0x2bc,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    5,   2, 0x348,0x233,0x670,0x3c0,0x08d,128, 0, 0x00,0x00,0x00,0x00},
+- {    8,   5, 0x41a,0x2ab,0x670,0x3c0,0x17c,128, 0, 0x00,0x00,0x00,0x00}
+-};
+-
+-static const SiS310_TVDataStruct  SiS310_ExtHiTVData[]=
+-{
+- {    6,   1, 0x348,0x233,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    3,   1, 0x3c0,0x233,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    3,   1, 0x348,0x1e3,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    3,   1, 0x3c0,0x233,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    5,   1, 0x348,0x233,0x670,0x3c0,0x166,128, 0, 0x00,0x00,0x00,0x00},
+- {   16,   5, 0x41a,0x2ab,0x670,0x3c0,0x143,128, 0, 0x00,0x00,0x00,0x00},
+- {   25,  12, 0x4ec,0x353,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
+- {    5,   4, 0x627,0x464,0x670,0x3c0,0x128,  0, 0, 0x00,0x00,0x00,0x00},
+- {    4,   1, 0x41a,0x233,0x670,0x3c0,0x143,128, 0, 0x00,0x00,0x00,0x00},
+- {    5,   2, 0x578,0x293,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
+- {    8,   5, 0x6d6,0x323,0x670,0x3c0,0x128,  0, 0, 0x00,0x00,0x00,0x00}
+-};
+-
+-static const UCHAR SiS310_NTSCTiming[] = { 
+-	0x17,0x1d,0x03,0x09,0x05,0x06,0x0c,0x0c,
+-	0x94,0x49,0x01,0x0a,0x06,0x0d,0x04,0x0a,
+-	0x06,0x14,0x0d,0x04,0x0a,0x00,0x85,0x1b,
+-	0x0c,0x50,0x00,0x97,0x00,0xda,0x4a,0x17,
+-	0x7d,0x05,0x4b,0x00,0x00,0xe2,0x00,0x02,
+-	0x03,0x0a,0x65,0x9d,0x08,0x92,0x8f,0x40,
+-	0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x50,
+-	0x00,0x40,0x44,0x00,0xdb,0x02,0x3b,0x00
+-};
+-
+-static const UCHAR SiS310_PALTiming[] = {  
+-	0x19,0x52,0x35,0x6e,0x04,0x38,0x3d,0x70,
+-	0x94,0x49,0x01,0x12,0x06,0x3e,0x35,0x6d,
+-	0x06,0x14,0x3e,0x35,0x6d,0x00,0x45,0x2b,
+-	0x70,0x50,0x00,0x9b,0x00,0xd9,0x5d,0x17,
+-	0x7d,0x05,0x45,0x00,0x00,0xe8,0x00,0x02,
+-	0x0d,0x00,0x68,0xb0,0x0b,0x92,0x8f,0x40,
+-	0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x63,
+-	0x00,0x40,0x3e,0x00,0xe1,0x02,0x28,0x00
+-};
+-
+-static const UCHAR SiS310_HiTVExtTiming[] = {  
+-        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x64,
+-	0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
+-	0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
+-	0x64,0x90,0x33,0x8c,0x18,0x36,0x3e,0x13,
+-	0x2a,0xde,0x2a,0x44,0x40,0x2a,0x44,0x40,
+-	0x8e,0x8e,0x82,0x07,0x0b,0x92,0x0f,0x40,
+-	0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x3d,
+-	0x63,0x4f,0x27,0x00,0xfc,0xff,0x6a,0x00
+-};
+-
+-static const UCHAR SiS310_HiTVSt1Timing[] = {  
+-        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x65,
+-	0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
+-	0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
+-	0x65,0x90,0x7b,0xa8,0x03,0xf0,0x87,0x03,
+-	0x11,0x15,0x11,0xcf,0x10,0x11,0xcf,0x10,
+-	0x35,0x35,0x3b,0x69,0x1d,0x92,0x0f,0x40,
+-	0x60,0x80,0x14,0x90,0x8c,0x60,0x04,0x86,
+-	0xaf,0x5d,0x0e,0x00,0xfc,0xff,0x2d,0x00
+-};
+-
+-static const UCHAR SiS310_HiTVSt2Timing[] = {  
+-        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x64,
+-	0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
+-	0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
+-	0x64,0x90,0x33,0x8c,0x18,0x36,0x3e,0x13,
+-	0x2a,0xde,0x2a,0x44,0x40,0x2a,0x44,0x40,
+-	0x8e,0x8e,0x82,0x07,0x0b,0x92,0x0f,0x40,
+-	0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x3d,
+-	0x63,0x4f,0x27,0x00,0xfc,0xff,0x6a,0x00
+-};
+-
+-static const UCHAR SiS310_HiTVTextTiming[] = {  
+-        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x65,
+-	0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
+-	0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
+-	0x65,0x90,0xe7,0xbc,0x03,0x0c,0x97,0x03,
+-	0x14,0x78,0x14,0x08,0x20,0x14,0x08,0x20,
+-	0xc8,0xc8,0x3b,0xd2,0x26,0x92,0x0f,0x40,
+-        0x60,0x80,0x14,0x90,0x8c,0x60,0x04,0x96,
+-	0x72,0x5c,0x11,0x00,0xfc,0xff,0x32,0x00
+-};
+-
+-static const UCHAR SiS310_HiTVGroup3Data[] = {  
+-        0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0x5f,
+-	0x05,0x21,0xb2,0xb2,0x55,0x77,0x2a,0xa6,
+-	0x25,0x2f,0x47,0xfa,0xc8,0xff,0x8e,0x20,
+-	0x8c,0x6e,0x60,0x2e,0x58,0x48,0x72,0x44,
+-	0x56,0x36,0x4f,0x6e,0x3f,0x80,0x00,0x80,
+-	0x4f,0x7f,0x03,0xa8,0x7d,0x20,0x1a,0xa9,
+-	0x14,0x05,0x03,0x7e,0x64,0x31,0x14,0x75,
+-	0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
+-};
+-
+-static const UCHAR SiS310_HiTVGroup3Simu[] = {  
+-        0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0x95,
+-	0xdb,0x20,0xb8,0xb8,0x55,0x47,0x2a,0xa6,
+-	0x25,0x2f,0x47,0xfa,0xc8,0xff,0x8e,0x20,
+-	0x8c,0x6e,0x60,0x15,0x26,0xd3,0xe4,0x11,
+-	0x56,0x36,0x4f,0x6e,0x3f,0x80,0x00,0x80,
+-	0x67,0x36,0x01,0x47,0x0e,0x10,0xbe,0xb4,
+-	0x01,0x05,0x03,0x7e,0x65,0x31,0x14,0x75,
+-	0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
+-};
+-
+-static const UCHAR SiS310_HiTVGroup3Text[] = {  
+-        0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0xa7,
+-	0xf5,0x20,0xce,0xce,0x55,0x47,0x2a,0xa6,
+-	0x25,0x2f,0x47,0xfa,0xc8,0xff,0x8e,0x20,
+-	0x8c,0x6e,0x60,0x18,0x2c,0x0c,0x20,0x22,
+-	0x56,0x36,0x4f,0x6e,0x3f,0x80,0x00,0x80,
+-	0x93,0x3c,0x01,0x50,0x2f,0x10,0xf4,0xca,
+-	0x01,0x05,0x03,0x7e,0x65,0x31,0x14,0x75,
+-	0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
+-};
+-
+ typedef struct _SiS310_PanelDelayTblStruct
+ {
+  	UCHAR timer[2];
+ } SiS310_PanelDelayTblStruct;
+ 
+-static const SiS310_PanelDelayTblStruct SiS310_PanelDelayTbl[]=  
++static const SiS310_PanelDelayTblStruct SiS310_PanelDelayTbl[]=
+ {
+-        {{0x10,0x40}},		/* TW: from 650/301LVx 1.10.6s BIOS */
++        {{0x10,0x40}},
+ 	{{0x10,0x40}},
+ 	{{0x10,0x40}},
+ 	{{0x10,0x40}},
+@@ -1744,24 +993,6 @@ static const SiS310_PanelDelayTblStruct 
+ 	{{0x10,0x40}},
+ 	{{0x10,0x40}},
+ 	{{0x10,0x40}}
+-#if 0
+-	{{0x28,0xc8}},		/* TW: from 650/301LV BIOS */
+-	{{0x28,0xc8}},
+-	{{0x28,0xc8}},
+-	{{0x28,0xc8}},
+-	{{0x28,0xc8}},
+-	{{0x28,0xc8}},
+-	{{0x28,0xc8}},
+-	{{0x28,0xc8}},
+-	{{0x28,0xc8}},
+-	{{0x28,0xc8}},
+-	{{0x28,0xc8}},
+-	{{0x28,0xc8}},
+-	{{0x28,0xc8}},
+-	{{0x28,0xc8}},
+-	{{0x28,0xc8}},
+-	{{0x28,0xc8}}
+-#endif
+ };
+ 
+ static const SiS310_PanelDelayTblStruct SiS310_PanelDelayTblLVDS[]=
+@@ -1792,363 +1023,7 @@ typedef struct _SiS310_LVDSDataStruct
+ 	USHORT LCDVT;
+ } SiS310_LVDSDataStruct;
+ 
+-static const SiS310_LVDSDataStruct  SiS310_LVDS320x480Data_1[]=
+-{
+-	{ 848, 433, 400, 525},
+-	{ 848, 389, 400, 525},
+-	{ 848, 433, 400, 525},
+-	{ 848, 389, 400, 525},
+-	{ 848, 518, 400, 525},
+-	{1056, 628, 400, 525},
+-	{ 400, 525, 400, 525},
+-	{ 800, 449,1000, 644},
+-	{ 800, 525,1000, 635}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS800x600Data_1[]= 
+-{
+-	{ 848, 433,1060, 629},
+-	{ 848, 389,1060, 629},
+-	{ 848, 433,1060, 629},
+-	{ 848, 389,1060, 629},
+-	{ 848, 518,1060, 629},
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628},
+-	{ 800, 449,1000, 644},
+-	{ 800, 525,1000, 635}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS800x600Data_2[]=  
+-{
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628},
+-	{ 800, 449,1000, 644},
+-	{ 800, 525,1000, 635}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1024x768Data_1[]=  
+-{
+-	{ 840, 438,1344, 806},
+-	{ 840, 409,1344, 806},
+-	{ 840, 438,1344, 806},
+-	{ 840, 409,1344, 806},
+-	{ 840, 518,1344, 806},   /* 640x480 */
+-	{1050, 638,1344, 806},   /* 800x600 */
+-	{1344, 806,1344, 806},   /* 1024x768 */
+-	{ 800, 449,1280, 801},
+-	{ 800, 525,1280, 813}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1024x768Data_2[]= 
+-{
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{ 800, 449,1280, 801},
+-	{ 800, 525,1280, 813}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1280x1024Data_1[]=  
+-{	
+-	{1048, 442,1688,1066},
+-	{1048, 392,1688,1066},
+-	{1048, 442,1688,1066},
+-	{1048, 392,1688,1066},
+-	{1048, 522,1688,1066},
+-	{1208, 642,1688,1066},
+-	{1432, 810,1688,1066},
+-	{1688,1066,1688,1066}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1280x1024Data_2[]=  
+-{	
+-	{1688,1066,1688,1066},
+-	{1688,1066,1688,1066},
+-	{1688,1066,1688,1066},
+-	{1688,1066,1688,1066},
+-	{1688,1066,1688,1066},
+-	{1688,1066,1688,1066},
+-	{1688,1066,1688,1066},
+-	{1688,1066,1688,1066}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1400x1050Data_1[]=  
+-{
+-        { 928, 416, 1688,1066},
+-	{ 928, 366, 1688,1066},
+-	{ 928, 416, 1688,1066},
+-	{ 928, 366, 1688,1066},
+-	{ 928, 496, 1688,1066},
+-	{1088, 616, 1688,1066},
+-	{1312, 784, 1688,1066},
+-	{1568,1040, 1688,1066},
+-	{1688,1066, 1688,1066}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1400x1050Data_2[]= 
+-{
+-        {1688,1066, 1688,1066},
+-	{1688,1066, 1688,1066},
+-	{1688,1066, 1688,1066},
+-	{1688,1066, 1688,1066},
+-	{1688,1066, 1688,1066},
+-	{1688,1066, 1688,1066},
+-	{1688,1066, 1688,1066},
+-	{1688,1066, 1688,1066},
+-	{1688,1066, 1688,1066},
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1600x1200Data_1[]=  
+-{
+-        {1088, 450, 2048,1250},
+-	{1088, 400, 2048,1250},
+-	{1088, 450, 2048,1250},
+-	{1088, 400, 2048,1250},
+-	{1088, 530, 2048,1250},
+-	{1248, 650, 2048,1250},
+-	{1472, 818, 2048,1250},
+-	{1728,1066, 2048,1250},
+-	{1848,1066, 2048,1250},
+-	{2048,1250, 2048,1250}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1600x1200Data_2[]= 
+-{
+-        {2048,1250, 2048,1250},
+-	{2048,1250, 2048,1250},
+-	{2048,1250, 2048,1250},
+-	{2048,1250, 2048,1250},
+-	{2048,1250, 2048,1250},
+-	{2048,1250, 2048,1250},
+-	{2048,1250, 2048,1250},
+-	{2048,1250, 2048,1250},
+-	{2048,1250, 2048,1250},
+-	{2048,1250, 2048,1250}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1280x768Data_1[]= 
+-{	
+-	{ 768, 438, 1408, 806},
+-	{ 768, 388, 1408, 806},
+-	{ 768, 438, 1408, 806},
+-	{ 768, 388, 1408, 806},
+-	{ 768, 518, 1408, 806},
+-	{ 928, 638, 1408, 806},
+-	{1152, 806, 1408, 806},
+-	{1408, 806, 1408, 806},
+-	{1408, 806, 1408, 806}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1280x768Data_2[]=  
+-{	
+-	{1408, 806, 1408, 806},
+-	{1408, 806, 1408, 806},
+-	{1408, 806, 1408, 806},
+-	{1408, 806, 1408, 806},
+-	{1408, 806, 1408, 806},
+-	{1408, 806, 1408, 806},
+-	{1408, 806, 1408, 806},
+-	{1408, 806, 1408, 806},
+-	{1408, 806, 1408, 806}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1024x600Data_1[]=
+-{
+-	{ 840, 604, 1344, 800},
+-	{ 840, 560, 1344, 800},
+-	{ 840, 604, 1344, 800},
+-	{ 840, 560, 1344, 800},
+-	{ 840, 689, 1344, 800},
+-	{1050, 800, 1344, 800},
+-	{1344, 800, 1344, 800},
+-	{ 800, 449, 1280, 801},
+-	{ 800, 525, 1280, 813}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1024x600Data_2[]=
+-{
+-	{1344, 800, 1344, 800},
+-	{1344, 800, 1344, 800},
+-	{1344, 800, 1344, 800},
+-	{1344, 800, 1344, 800},
+-	{1344, 800, 1344, 800},
+-	{1344, 800, 1344, 800},
+-	{1344, 800, 1344, 800},
+-	{ 800, 449, 1280, 801},
+-	{ 800, 525, 1280, 813}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1152x768Data_1[]=
+-{
+-	{ 840, 438, 1344, 806},
+-	{ 840, 409, 1344, 806},
+-	{ 840, 438, 1344, 806},
+-	{ 840, 409, 1344, 806},
+-	{ 840, 518, 1344, 806},
+-	{1050, 638, 1344, 806},
+-	{1344, 806, 1344, 806},
+-	{ 800, 449, 1280, 801},
+-	{ 800, 525, 1280, 813}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1152x768Data_2[]=
+-{
+-	{1344, 806, 1344, 806},
+-	{1344, 806, 1344, 806},
+-	{1344, 806, 1344, 806},
+-	{1344, 806, 1344, 806},
+-	{1344, 806, 1344, 806},
+-	{1344, 806, 1344, 806},
+-	{1344, 806, 1344, 806},
+-	{ 800, 449, 1280, 801},
+-	{ 800, 525, 1280, 813}
+-};
+-
+-/* TW: Pass 1:1 data */
+-static const SiS310_LVDSDataStruct  SiS310_LVDSXXXxXXXData_1[]=  
+-{
+-        { 800, 449,  800, 449},
+-	{ 800, 449,  800, 449},
+-	{ 900, 449,  900, 449},
+-	{ 900, 449,  900, 449},
+-	{ 800, 525,  800, 525},  /*  640x480   */
+-	{1056, 628, 1056, 628},  /*  800x600   */
+-	{1344, 806, 1344, 806},  /* 1024x768   */
+-	{1344,1066, 1344,1066},  /* 1280x1024  */  /* INSERTED ! */
+- 	{1688, 806, 1688, 806},  /* 1280x768 ! */
+-	/* No other panels ! */
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS640x480Data_1[]=  
+-{
+-	{ 800, 449, 800, 449},
+-	{ 800, 449, 800, 449},
+-	{ 800, 449, 800, 449},
+-	{ 800, 449, 800, 449},
+-	{ 800, 525, 800, 525},
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628},
+-	{1056, 628,1056, 628}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1280x960Data_1[]=   
+-{
+-	{ 840, 438,1344, 806},
+-	{ 840, 409,1344, 806},
+-	{ 840, 438,1344, 806},
+-	{ 840, 409,1344, 806},
+-	{ 840, 518,1344, 806},
+-	{1050, 638,1344, 806},
+-	{1344, 806,1344, 806},
+-	{ 800, 449,1280, 801},
+-	{ 800, 525,1280, 813}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1280x960Data_2[]=  
+-{
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{ 800, 449,1280, 801},
+-	{ 800, 525,1280, 813}
+-};
+-
+-/* LCDA */
+-
+-static const SiS310_LVDSDataStruct  SiS310_LCDA1400x1050Data_1[]=   
+-{	/* TW: Might be temporary (invalid) data */
+-        { 928, 416, 1688,1066},
+-	{ 928, 366, 1688,1066},
+-	{1008, 416, 1688,1066},
+-	{1008, 366, 1688,1066},
+-	{1200, 530, 1688,1066},
+-	{1088, 616, 1688,1066},
+-	{1312, 784, 1688,1066},
+-	{1568,1040, 1688,1066},
+-	{1688,1066, 1688,1066}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LCDA1400x1050Data_2[]=   
+-{	/* TW: Temporary data. Not valid */
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{ 800, 449,1280, 801},
+-	{ 800, 525,1280, 813}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LCDA1600x1200Data_1[]=  
+-{	/* TW: Temporary data. Not valid */
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{1344, 806,1344, 806},
+-	{ 800, 449,1280, 801},
+-	{ 800, 525,1280, 813}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LCDA1600x1200Data_2[]=  
+-{	/* TW: Temporary data. Not valid */
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0},
+-	{0, 0, 0, 0}
+-};
+-
+-/* Chrontel TV */
+-
+-static const SiS310_LVDSDataStruct  SiS310_CHTVUNTSCData[]=   
+-{
+-	{ 840, 600, 840, 600},
+-	{ 840, 600, 840, 600},
+-	{ 840, 600, 840, 600},
+-	{ 840, 600, 840, 600},
+-	{ 784, 600, 784, 600},
+-	{1064, 750,1064, 750},
+-        {1160, 945,1160, 945}           /* TW: For Ch7019 1024 */
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_CHTVONTSCData[]=   
+-{
+-	{ 840, 525, 840, 525},
+-	{ 840, 525, 840, 525},
+-	{ 840, 525, 840, 525},
+-	{ 840, 525, 840, 525},
+-	{ 784, 525, 784, 525},
+-	{1040, 700,1040, 700},
+-        {1160, 840,1160, 840}          	/* TW: For Ch7019 1024 */
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_CHTVUPALData[]=   
++static const SiS310_LVDSDataStruct  SiS310_CHTVUPALData[]=
+ {
+ 	{1008, 625,1008, 625},
+ 	{1008, 625,1008, 625},
+@@ -2156,7 +1031,7 @@ static const SiS310_LVDSDataStruct  SiS3
+ 	{1008, 625,1008, 625},
+ 	{ 840, 625, 840, 625},
+ 	{ 960, 750, 960, 750},
+-	{1400,1000,1400,1000}   	/*  TW: For Ch7019 1024 */
++	{1400,1000,1400,1000}
+ };
+ 
+ static const SiS310_LVDSDataStruct  SiS310_CHTVOPALData[]= 
+@@ -2167,7 +1042,7 @@ static const SiS310_LVDSDataStruct  SiS3
+ 	{1008, 625,1008, 625},
+ 	{ 840, 625, 840, 625},
+ 	{ 944, 625, 944, 625},
+-        {1400, 875,1400, 875}       	/*  TW: For Ch7019 1024 */
++        {1400, 875,1400, 875}
+ };
+ 
+ static const SiS310_LVDSDataStruct  SiS310_CHTVUPALMData[]=  
+@@ -2178,7 +1053,7 @@ static const SiS310_LVDSDataStruct  SiS3
+ 	{ 840, 600, 840, 600},
+ 	{ 784, 600, 784, 600},
+ 	{1064, 750,1064, 750},
+-        {1160, 945,1160, 945}           /* TW: For Ch7019 1024 */
++        {1160, 945,1160, 945}
+ };
+ 
+ static const SiS310_LVDSDataStruct  SiS310_CHTVOPALMData[]=  
+@@ -2189,7 +1064,7 @@ static const SiS310_LVDSDataStruct  SiS3
+ 	{ 840, 525, 840, 525},
+ 	{ 784, 525, 784, 525},
+ 	{1040, 700,1040, 700},
+-        {1160, 840,1160, 840}          	/* TW: For Ch7019 1024 */
++        {1160, 840,1160, 840}
+ };
+ 
+ static const SiS310_LVDSDataStruct  SiS310_CHTVUPALNData[]=  
+@@ -2200,7 +1075,7 @@ static const SiS310_LVDSDataStruct  SiS3
+ 	{1008, 625,1008, 625},
+ 	{ 840, 625, 840, 625},
+ 	{ 960, 750, 960, 750},
+-	{1400,1000,1400,1000}   	/*  TW: For Ch7019 1024 */
++	{1400,1000,1400,1000}
+ };
+ 
+ static const SiS310_LVDSDataStruct  SiS310_CHTVOPALNData[]= 
+@@ -2211,7 +1086,7 @@ static const SiS310_LVDSDataStruct  SiS3
+ 	{1008, 625,1008, 625},
+ 	{ 840, 625, 840, 625},
+ 	{ 944, 625, 944, 625},
+-        {1400, 875,1400, 875}       	/*  TW: For Ch7019 1024 */
++        {1400, 875,1400, 875}
+ };
+ 
+ static const SiS310_LVDSDataStruct  SiS310_CHTVSOPALData[]=   /* TW: (super overscan - no effect on 7019) */
+@@ -2231,7 +1106,7 @@ typedef struct _SiS310_LVDSDesStruct
+ 	USHORT LCDVDES;
+ } SiS310_LVDSDesStruct;
+ 
+-static const SiS310_LVDSDesStruct  SiS310_PanelType00_1[]=  
++static const SiS310_LVDSDesStruct  SiS310_PanelType00_1[]=  /* 800x600 */
+ {
+ 	{ 0, 0},
+ 	{ 0, 0},
+@@ -2244,7 +1119,7 @@ static const SiS310_LVDSDesStruct  SiS31
+ 	{ 0, 0}
+ };
+ 
+-static const SiS310_LVDSDesStruct  SiS310_PanelType01_1[]=   
++static const SiS310_LVDSDesStruct  SiS310_PanelType01_1[]=  /* 1024x768 */
+ {
+ 	{ 0, 0},
+ 	{ 0, 0},
+@@ -2257,7 +1132,7 @@ static const SiS310_LVDSDesStruct  SiS31
+ 	{ 0, 0}
+ };
+ 
+-static const SiS310_LVDSDesStruct  SiS310_PanelType02_1[]=  
++static const SiS310_LVDSDesStruct  SiS310_PanelType02_1[]=  /* 1280x1024 */
+ {
+ 	{ 0, 0},
+ 	{ 0, 0},
+@@ -2382,33 +1257,31 @@ static const SiS310_LVDSDesStruct  SiS31
+ 	{ 0, 0}
+ };
+ 
+-static const SiS310_LVDSDesStruct  SiS310_PanelType0b_1[]= 
+-{
+-	{1343, 798},
+-	{1343, 794},
+-	{1343, 798},
+-	{1343, 794},
+-	{1343,   0},
+-	{1343,   0},
+-	{ 0, 805},
+-	{ 0, 794},
+-	{ 0,   0}
+-};
+-
+-static const SiS310_LVDSDesStruct  SiS310_PanelType0c_1[]=  
++static const SiS310_LVDSDesStruct  SiS310_PanelType0b_1[]=  /* 640x480_2 */
+ {
+-	{1343, 798},
+-	{1343, 794},
+-	{1343, 798},
+-	{1343, 794},
+-	{1343,   0},
+-	{1343,   0},
+-	{ 0, 805},
+-	{ 0, 794},
+-	{ 0,   0}
++	{ 0, 524},
++	{ 0, 524},
++	{ 0, 524},
++	{ 0, 524},
++	{ 0, 524},
++	{ 0, 524},
++	{ 8, 524},
++	{ 0, 524}
++};
++
++static const SiS310_LVDSDesStruct  SiS310_PanelType0c_1[]=  /* 640x480_3 */
++{
++	{ 0, 524},
++	{ 0, 524},
++	{ 0, 524},
++	{ 0, 524},
++	{ 0, 524},
++	{ 0, 524},
++	{ 8, 524},
++	{ 0, 524}
+ };
+ 
+-static const SiS310_LVDSDesStruct  SiS310_PanelType0d_1[]= 
++static const SiS310_LVDSDesStruct  SiS310_PanelType0d_1[]=
+ {
+ 	{1343, 798},
+ 	{1343, 794},
+@@ -2604,7 +1477,7 @@ static const SiS310_LVDSDesStruct  SiS31
+ 	{   0,   0}
+ };
+ 
+-static const SiS310_LVDSDesStruct  SiS310_PanelType0b_2[]=  
++static const SiS310_LVDSDesStruct  SiS310_PanelType0b_2[]=  /* 640x480_2 */
+ {
+ 	{1152, 622},
+ 	{1152, 597},
+@@ -2617,7 +1490,7 @@ static const SiS310_LVDSDesStruct  SiS31
+ 	{ 0,   0}
+ };
+ 
+-static const SiS310_LVDSDesStruct  SiS310_PanelType0c_2[]= 
++static const SiS310_LVDSDesStruct  SiS310_PanelType0c_2[]=  /* 640x480_3 */
+ {
+ 	{1152, 622},
+ 	{1152, 597},
+@@ -2669,184 +1542,6 @@ static const SiS310_LVDSDesStruct  SiS31
+ 	{ 0,   0}
+ };
+ 
+-static const SiS310_LVDSDesStruct  SiS310_PanelTypeNS_1[]= 
+-{
+-	{ 8,   0},
+-	{ 8,   0},
+-	{ 8,   0},
+-	{ 8,   0},
+-	{ 8,   0},
+-	{ 0,   0},
+-	{ 0,   0},
+-	{ 0,   0},
+-	{ 0, 806},
+-	{ 0, 0 }
+-};
+-
+-static const SiS310_LVDSDesStruct  SiS310_PanelTypeNS_2[] = 
+-{
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0}
+-};
+-
+-static const SiS310_LVDSDesStruct SiS310_PanelType1076_1[]=  
+-{  /* 1024x768 - Checked (1.10.6s) */
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0}
+-};
+-
+-static const SiS310_LVDSDesStruct SiS310_PanelType1076_2[]=  
+-{  /* 1024x768 - Checked (1.10.6s) */
+-	{ 1184, 622 },
+-	{ 1184, 597 },
+-	{ 1184, 622 },
+-	{ 1184, 597 },
+-	{ 1152, 622 },
+-	{ 1232, 722 },
+-	{    0, 0   },
+-	{    0, 794 },
+-	{    0, 0   }
+-};
+-
+-static const SiS310_LVDSDesStruct SiS310_PanelType1210_1[]=  
+-{  /* 1280x1024 - Checked (1.10.6s) */
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0}
+-};
+-
+-static const SiS310_LVDSDesStruct SiS310_PanelType1210_2[]=  
+-{  /* 1280x1024 - Checked (1.10.6s) */
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0}
+-};
+-
+-static const SiS310_LVDSDesStruct SiS310_PanelType1296_1[]=  
+-{  /* 1400x1050 - Checked (1.10.6s) */
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0}
+-};
+-
+-static const SiS310_LVDSDesStruct SiS310_PanelType1296_2[]=  
+-{  /* 1400x1050 - Checked (1.10.6s) - looks heavily invalid */
+-	{ 808 , 740},
+-	{ 0   , 715},
+-	{ 632 , 740},
+-	{ 632 , 715},
+-	{ 1307, 780},
+-	{ 1387,1157},
+-	{ 1499, 924},
+-	{ 1627,1052},
+-	{ 0 , 0}
+-};
+-
+-static const SiS310_LVDSDesStruct SiS310_PanelType1600_1[]= 
+-{  /* 1600x1200 - Checked (1.10.6s) */
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0}
+-};
+-
+-static const SiS310_LVDSDesStruct SiS310_PanelType1600_2[]= 
+-{  /* 1600x1200 - Checked (1.10.6s) - looks heavily invalid, not copied */
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0},
+-	{ 0 , 0}
+-};
+-
+-static const SiS310_LVDSDesStruct  SiS310_CHTVUNTSCDesData[]=
+-{
+-	{ 0,   0},
+-	{ 0,   0},
+-	{ 0,   0},
+-	{ 0,   0},
+-	{ 0,   0},
+-	{ 0,   0},
+-	{ 0,   0}
+-};
+-
+-static const SiS310_LVDSDesStruct  SiS310_CHTVONTSCDesData[]=
+-{
+-	{ 0,   0},
+-	{ 0,   0},
+-	{ 0,   0},
+-	{ 0,   0},
+-	{ 0,   0},
+-	{ 0,   0},
+-	{ 0,   0}
+-};
+-
+-static const SiS310_LVDSDesStruct  SiS310_CHTVUPALDesData[]=
+-{
+-	{256,   0},
+-	{256,   0},
+-	{256,   0},
+-	{256,   0},
+-	{ 0,   0},
+-	{ 0,   0},
+-	{ 0,   0}
+-};
+-
+-static const SiS310_LVDSDesStruct  SiS310_CHTVOPALDesData[]=
+-{
+-	{256,   0},
+-	{256,   0},
+-	{256,   0},
+-	{256,   0},
+-	{ 0,   0},
+-	{ 0,   0},
+-	{ 0,   0}
+-};
+-
+ typedef struct _SiS310_Part2PortTblStruct
+ {
+  	UCHAR CR[12];
+@@ -2866,16 +1561,15 @@ static const SiS310_Part2PortTblStruct S
+ };
+ 
+ static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1280x1024_1[] =
+-{	/* TW: Temporary data, invalid */
+- {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+- {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+- {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+- {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+- {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+- {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+- {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+- {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+- {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}}
++{	/* TW: BIOS data invalid, last row taken from _3 */
++ {{0x25,0x12,0x51,0x6E,0x48,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}},
++ {{0x2C,0x12,0x38,0x55,0x2F,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}},
++ {{0x25,0x12,0x51,0x6E,0x48,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}},
++ {{0x2C,0x12,0x38,0x55,0x2F,0xC1,0x35,0xB1,0x47,0xE9,0x71,0x33}},
++ {{0x2D,0x12,0x79,0x96,0x70,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}},
++ {{0x29,0x12,0xB5,0xD2,0xAC,0xE9,0x35,0xD9,0x47,0x11,0x99,0x33}},
++ {{0x36,0x13,0x02,0x25,0xFF,0x03,0x45,0x09,0x07,0xF9,0x00,0x24}},
++ {{0x47,0x1C,0x14,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}}
+ };
+ 
+ static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1400x1050_1[] =
+@@ -2912,7 +1606,8 @@ static const SiS310_Part2PortTblStruct S
+  {{0x2c,0x12,0x38,0x55,0x2f,0xc1,0x35,0xb1,0x47,0xe9,0x71,0x33}},
+  {{0x2d,0x12,0x79,0x96,0x70,0x99,0x35,0x89,0x47,0xc1,0x49,0x33}},
+  {{0x29,0x12,0xb5,0xd2,0xac,0xe9,0x35,0xd9,0x47,0x11,0x99,0x33}},
+- {{0x36,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
++ {{0x36,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},  /* old  */
++/* 0x36,0x13,0x02,0x25,0xff,0x03,0x45,0x09,0x07,0xf9,0x00,0x24        new? */
+  {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+  {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
+ };
+@@ -2959,6 +1654,7 @@ static const SiS310_Part2PortTblStruct S
+ 
+ static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1024x768_3[] =
+ {	/* TW: Data from 650/301LVx 1.10.6s */
++#if 0
+  {{0x25,0x13,0xc9,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+  {{0x2c,0x13,0x9a,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+  {{0x25,0x13,0xc9,0x24,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+@@ -2968,56 +1664,55 @@ static const SiS310_Part2PortTblStruct S
+  {{0x36,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+  {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+  {{0x25,0x13,0xc9,0x25,0xff,0xf9,0x45,0x09,0x07,0xf9,0x09,0x24}}
+-#if 0	/* TW: Data from 650/301LV */
+- {{0x25,0x12,0xc9,0xdc,0xb6,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+- {{0x2c,0x12,0x9a,0xae,0x88,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+- {{0x25,0x12,0xc9,0xdc,0xb6,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+- {{0x38,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+- {{0x38,0x18,0x16,0x00,0x00,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+- {{0x36,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
+-#endif
++#endif	/* Data from my 301LV */
++ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},   /* @@@@@ TEST */
++ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
++ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
++ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
++ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
++ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
++ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
++ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
++ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}}
+ };
+ 
+ /*   1     2    4    5    6   1c   1d   1f   20   21   23   25   */
+ static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1280x1024_3[] =
+-{	/* TW: Temporary data, invalid */
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}
++{
++ {{0x31,0x1B,0xC4,0xDA,0xB0,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}},
++ {{0x34,0x1B,0x9F,0xC0,0x80,0xB8,0x23,0x0A,0x07,0x14,0x8A,0x12}},
++ {{0x3E,0x1B,0xCF,0xF0,0xB0,0xB8,0x23,0x0A,0x07,0x14,0x8A,0x12}},
++ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
++ {{0x48,0x1C,0x15,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}},
++ {{0x48,0x1C,0x15,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}},
++ {{0x48,0x1C,0x15,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}},
++ {{0x47,0x1C,0x14,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}}
+ };
+ 
+ static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1400x1050_3[] =
+ {	
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}
+ };
+ 
+ static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1600x1200_3[] =
+ {	/* TW: Temporary data, invalid */
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}
+ };
+ 
+ typedef struct _SiS310_LCDACRT1DataStruct
+@@ -3054,7 +1749,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ 
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11024x768_1[]=
+-{  /* TW: Checked (1.10.6s) */
++{
+  {{0x73,0x4f,0x4f,0x97,0x55,0x86,0xc4,0x1f,
+    0x92,0x89,0x8f,0x8f,0xb5,0x30,0x00,0x05,
+    0x00}},
+@@ -3079,7 +1774,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ 
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11280x1024_1[]=
+-{  /* Checked (1.10.6s) */
++{
+  {{0x7e,0x4f,0x4f,0x82,0x58,0x06,0xb8,0x1f,
+    0x90,0x84,0x8f,0x8f,0xb9,0x30,0x00,0x06,
+    0x00}},
+@@ -3107,7 +1802,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ 
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11400x1050_1[]=
+-{    /* Checked (1.10.6s) */
++{
+  {{0x6f,0x4f,0x4f,0x93,0x54,0x82,0x9e,0x1f,
+    0x93,0x86,0x8f,0x8f,0x9f,0x30,0x00,0x05,
+    0x00}},
+@@ -3200,7 +1895,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ 
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11024x768_1_H[]=
+-{  /* TW: Checked (1.10.6s) */
++{
+  {{0x4b,0x27,0x27,0x8f,0x2b,0x03,0xc4,0x1f,
+    0x92,0x89,0x8f,0x8f,0xb5,0x30,0x00,0x44,
+    0x00}},
+@@ -3225,7 +1920,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ 
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11280x1024_1_H[]=
+-{   /* Checked (1.10.6s) */
++{
+  {{0x56,0x27,0x27,0x9a,0x30,0x1e,0xb8,0x1f,
+    0x90,0x84,0x8f,0x8f,0xb9,0x30,0x00,0x05,
+    0x00}},
+@@ -3250,7 +1945,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ 
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11400x1050_1_H[]=
+-{   /* Checked (1.10.6s) */
++{
+   {{0x47,0x27,0x27,0x8b,0x2c,0x1a,0x9e,0x1f,
+     0x93,0x86,0x8f,0x8f,0x9f,0x30,0x00,0x05,
+     0x00}},
+@@ -3343,7 +2038,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ 
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11024x768_2[]=
+-{   /* Checked (1.10.6s) */
++{
+  {{0xa3,0x4f,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+    0x4a,0x80,0x8f,0x8f,0x25,0x30,0x00,0x06,
+    0x00}},
+@@ -3368,7 +2063,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ 
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11280x1024_2[]=
+-{   /* Checked (1.10.6s) */
++{
+  {{0xa3,0x4f,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+    0x4a,0x80,0x8f,0x8f,0x25,0x30,0x00,0x06,
+    0x00}},
+@@ -3393,7 +2088,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ 
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11400x1050_2[]=
+-{    /* Checked (1.10.6s) */
++{
+  {{0xce,0x4f,0x4f,0x92,0x8c,0x1a,0x28,0x9a,
+    0xdb,0x8f,0x8f,0x8f,0x29,0x21,0x00,0x03,
+    0x00}},
+@@ -3486,7 +2181,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ 
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11024x768_2_H[]=
+-{   /* Checked (1.10.6s) */
++{
+  {{0x4f,0x27,0x27,0x93,0x39,0x01,0x24,0xbb,
+    0x4a,0x80,0x8f,0x8f,0x25,0x30,0x00,0x01,
+    0x00 }},
+@@ -3511,7 +2206,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ 
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11280x1024_2_H[]=
+-{   /* Checked (1.10.6s) */
++{
+  {{0x4f,0x27,0x27,0x93,0x39,0x81,0x24,0xbb,
+    0x4a,0x80,0x8f,0x8f,0x25,0x30,0x00,0x01,
+    0x00 }},
+@@ -3536,7 +2231,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ 
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11400x1050_2_H[]=
+-{  /* Checked (1.10.6s) */
++{
+  {{0xa6,0x27,0x27,0x8a,0x64,0x92,0x28,0x9a,
+    0xdb,0x8f,0x8f,0x8f,0x29,0x21,0x00,0x06,
+    0x00}},
+@@ -3605,32 +2300,7 @@ typedef struct _SiS310_LVDSCRT1DataStruc
+  	UCHAR CR[15];
+ } SiS310_LVDSCRT1DataStruct;
+ 
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT1320x480_1[] =
+-{
+- {{0x65,0x4f,0x89,0x56,0x83,0xaa,0x1f,
+-   0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
+-   0x00 }},
+- {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
+-   0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
+-   0x00 }},
+- {{0x65,0x4f,0x89,0x54,0x9f,0xc4,0x1f,
+-   0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
+-   0x00 }},
+- {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
+-   0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
+-   0x00 }},
+- {{0x65,0x4f,0x89,0x56,0x83,0x04,0x3e,
+-   0xe0,0x85,0xdf,0xfb,0x10,0x00,0x05,
+-   0x00 }},
+- {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
+-   0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
+-   0x01 }},
+- {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
+-   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
+-   0x00 }}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT1800x600_1[] =   
++static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT1800x600_1[] =
+ {
+  {{0x6b,0x4f,0x8f,0x55,0x85,0xaa,0x1f,
+    0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
+@@ -3924,63 +2594,7 @@ static const SiS310_LVDSCRT1DataStruct  
+    0x01}}
+ };
+ 
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT1XXXxXXX_1[] =  
+-{
+- {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
+-   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
+-   0x00}},
+- {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
+-   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
+-   0x00}},
+- {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
+-   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
+-   0x00}},
+- {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
+-   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
+-   0x00}},
+- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
+-   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x05,
+-   0x00}},
+- {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
+-   0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
+-   0x01}},
+- {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+-   0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+-   0x01}},
+- {{0xce,0x9f,0x92,0xa8,0x14,0x28,0x5a,
+-   0x00,0x84,0xff,0x29,0x09,0x00,0x07,
+-   0x01}},
+- {{0xce,0x9f,0x92,0xa9,0x17,0x24,0xf5,
+-   0x02,0x88,0xff,0x25,0x10,0x00,0x07,
+-   0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT1XXXxXXX_1_H[] = 
+-{
+- {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
+-   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
+-   0x00}},
+- {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
+-   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
+-   0x00}},
+- {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
+-   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
+-   0x00}},
+- {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
+-   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
+-   0x00}},
+- {{0x38,0x27,0x9c,0x2c,0x80,0x0b,0x3e,
+-   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
+-   0x00}},
+- {{0x4d,0x31,0x91,0x3b,0x03,0x72,0xf0,
+-   0x58,0x8c,0x57,0x73,0x20,0x00,0x01,
+-   0x01}},
+- {{0x63,0x3f,0x87,0x4a,0x92,0x24,0xf5,
+-   0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+-   0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11400x1050_1[] =  
++static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11400x1050_1[] =
+ {
+   {{0x6f,0x4f,0x93,0x54,0x82,0x9e,0x1f,
+     0x8f,0x81,0x8f,0x9f,0x30,0x00,0x05,
+@@ -4220,332 +2834,8 @@ static const SiS310_LVDSCRT1DataStruct  
+ #endif   
+ };
+ 
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11280x768_1[] =  
+-{	
+- {{0x5b,0x4f,0x9f,0x55,0x19,0xb4,0x1f,
+-   0x9c,0x8e,0x8f,0xb5,0x10,0x00,0x01,
+-   0x00}},
+- {{0x5b,0x4f,0x9f,0x55,0x19,0x82,0x1f,
+-   0x6a,0x8c,0x5d,0x83,0x30,0x00,0x01,
+-   0x00}},
+- {{0x5b,0x4f,0x9f,0x55,0x19,0xb4,0x1f,
+-   0x9c,0x8e,0x8f,0xb5,0x10,0x00,0x01,
+-   0x00}},
+- {{0x5b,0x4f,0x9f,0x55,0x19,0x82,0x1f,
+-   0x6a,0x8c,0x5d,0x83,0x30,0x00,0x01,
+-   0x00}},
+- {{0x5b,0x4f,0x9f,0x55,0x19,0x04,0x3e,
+-   0xec,0x8e,0xdf,0x05,0x20,0x00,0x01,
+-   0x00}},
+- {{0x6f,0x63,0x93,0x69,0x8d,0x7c,0xf0,
+-   0x64,0x86,0x57,0x7d,0x20,0x00,0x05,
+-   0x01}},
+- {{0x8b,0x7f,0x8f,0x85,0x09,0x24,0xf5,
+-   0x0c,0x8e,0xff,0x25,0x30,0x00,0x02,
+-   0x01}},
+- {{0xab,0x9f,0x8f,0xa5,0x89,0x24,0xf5,
+-   0x0c,0x8e,0xff,0x25,0x30,0x00,0x06,
+-   0x01}},
+- {{0xab,0x9f,0x8f,0xa5,0x89,0x24,0xf5,
+-   0x0c,0x8e,0xff,0x25,0x30,0x00,0x06,
+-   0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11280x768_1_H[] = 
+-{
+- {{0x47,0x27,0x8b,0x2c,0x1a,0x9e,0x1f,
+-   0x93,0x86,0x8f,0x9f,0x30,0x00,0x05,
+-   0x00}},
+- {{0x47,0x27,0x8b,0x2c,0x1a,0x6c,0x1f,
+-   0x60,0x84,0x5d,0x6d,0x10,0x00,0x05,
+-   0x00}},
+- {{0x47,0x27,0x8b,0x30,0x1e,0x9e,0x1f,
+-   0x92,0x86,0x8f,0x9f,0x30,0x00,0x05,
+-   0x00}},
+- {{0x47,0x27,0x8b,0x2c,0x1a,0x6c,0x1f,
+-   0x60,0x84,0x5d,0x6d,0x10,0x00,0x05,
+-   0x00}},
+- {{0x47,0x27,0x8b,0x2c,0x1a,0xee,0x1f,
+-   0xe2,0x86,0xdf,0xef,0x10,0x00,0x05,
+-   0x00}},
+- {{0x51,0x31,0x95,0x36,0x04,0x66,0xf0,
+-   0x5a,0x8e,0x57,0x67,0x20,0x00,0x01,
+-   0x01}},
+- {{0x5f,0x3f,0x83,0x44,0x92,0x0e,0xf5,
+-   0x02,0x86,0xff,0x0f,0x10,0x00,0x01,
+-   0x01}},
+- {{0x6f,0x4f,0x93,0x54,0x82,0x0e,0x5a,
+-   0x02,0x86,0xff,0x0f,0x09,0x00,0x05,
+-   0x01}},
+- {{0x6f,0x4f,0x93,0x54,0x82,0x0e,0x5a,
+-   0x02,0x86,0xff,0x0f,0x09,0x00,0x05,
+-   0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11280x768_2[] = 
++static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11600x1200_1[] =
+ {
+- {{0xab,0x60,0x9f,0x80,0x04,0x24,0xbb,
+-   0x54,0x86,0xdb,0xda,0x00,0x00,0x02,
+-   0x00}},
+- {{0xab,0x60,0x9f,0x80,0x04,0x24,0xbb,
+-   0x3b,0x8d,0xc2,0xc1,0x00,0x00,0x02,
+-   0x00}},
+- {{0xab,0x60,0x9f,0x80,0x04,0x24,0xbb,
+-   0x54,0x86,0xdb,0xda,0x00,0x00,0x02,
+-   0x00}},
+- {{0xab,0x60,0x9f,0x80,0x04,0x24,0xbb,
+-   0x3b,0x8d,0xc2,0xc1,0x00,0x00,0x02,
+-   0x00}},
+- {{0xab,0x60,0x9f,0x80,0x04,0x24,0xb3,
+-   0x7c,0x8e,0x03,0x02,0x10,0x00,0x02,
+-   0x01}},
+- {{0xab,0x63,0x8f,0x8a,0x8e,0x24,0xf1,
+-   0xb6,0x88,0x57,0x25,0x10,0x00,0x02,
+-   0x01}},
+- {{0xab,0x7f,0x8f,0x98,0x9c,0x24,0xf5,
+-   0x0a,0x8c,0xff,0x25,0x30,0x00,0x02,
+-   0x01}},
+- {{0xab,0x9f,0x8f,0xa8,0x8c,0x24,0xf5,
+-   0x0a,0x8c,0xff,0x25,0x30,0x00,0x06,
+-   0x01}},
+- {{0xab,0x9f,0x8f,0xa8,0x8c,0x24,0xf5,
+-   0x0a,0x8c,0xff,0x25,0x30,0x00,0x06,
+-   0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11280x768_2_H[] =
+-{
+- {{0x83,0x38,0x97,0x58,0x9c,0x24,0xbb,
+-   0x54,0x86,0xdb,0xda,0x00,0x00,0x01,
+-   0x00}},
+- {{0x83,0x38,0x97,0x58,0x9c,0x24,0xbb,
+-   0x3b,0x8d,0xc2,0xc1,0x00,0x00,0x01,
+-   0x00}},
+- {{0x83,0x38,0x97,0x58,0x9c,0x24,0xbb,
+-   0x54,0x86,0xdb,0xda,0x00,0x00,0x01,
+-   0x00}},
+- {{0x83,0x38,0x97,0x58,0x9c,0x24,0xbb,
+-   0x3b,0x8d,0xc2,0xc1,0x00,0x00,0x01,
+-   0x00}},
+- {{0x83,0x38,0x97,0x58,0x9c,0x24,0xb3,
+-   0x7c,0x8e,0x03,0x02,0x10,0x00,0x01,
+-   0x01}},
+- {{0x79,0x31,0x9d,0x58,0x9c,0x24,0xf1,
+-   0xb6,0x88,0x57,0x25,0x10,0x00,0x01,
+-   0x01}},
+- {{0x6b,0x3f,0x8f,0x58,0x9c,0x24,0xf5,
+-   0x0a,0x8c,0xff,0x25,0x30,0x00,0x01,
+-   0x01}},
+- {{0xab,0x9f,0x8f,0xa8,0x8c,0x24,0xf5,
+-   0x0a,0x8c,0xff,0x25,0x30,0x00,0x06,
+-   0x01}},
+- {{0xab,0x9f,0x8f,0xa8,0x8c,0x24,0xf5,
+-   0x0a,0x8c,0xff,0x25,0x30,0x00,0x06,
+-   0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11024x600_1[] =
+-{
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x5a,0x3e,
+-	  0xe8,0x8f,0x8f,0x5b,0x00,0x00,0x01,
+-	  0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x2e,0x3e,
+-	  0xb9,0x80,0x5d,0x2f,0x00,0x00,0x01,
+-	  0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x5a,0x3e,
+-	  0xe8,0x8f,0x8f,0x5b,0x00,0x00,0x01,
+-	  0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x2e,0x3e,
+-	  0xb9,0x80,0x5d,0x2f,0x00,0x00,0x01,
+-	  0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0xaf,0xba,
+-	  0x3b,0x82,0xdf,0xb0,0x00,0x00,0x01,
+-	  0x00}},
+-        {{0x7e,0x63,0x82,0x68,0x15,0x1e,0xf1,
+-	  0xae,0x85,0x57,0x1f,0x30,0x00,0x26,
+-	  0x01}},
+-        {{0xa3,0x7f,0x87,0x86,0x97,0x1e,0xf1,
+-	  0xae,0x85,0x57,0x1f,0x30,0x00,0x02,
+-	  0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11024x600_1_H[] =
+-{
+-        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+-	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+-	  0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+-	  0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+-          0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+-	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+-	  0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+-	  0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+-	  0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x04,0x3e,
+-	  0xe2,0x89,0xdf,0x05,0x00,0x00,0x44,
+-	  0x00}},
+-        {{0x3c,0x31,0x80,0x35,0x1c,0x7c,0xf0,
+-	  0x5a,0x8f,0x57,0x7d,0x20,0x00,0x55,
+-	  0x01}},
+-        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+-	  0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+-	  0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11024x600_2[] =
+-{
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-          0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
+-	  0xae,0x84,0x57,0x25,0x30,0x00,0x02,
+-	  0x01}},
+-        {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+-	  0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+-	  0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11024x600_2_H[] =
+-{
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x72,0x88,0xdf,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x31,0x93,0x3e,0x06,0x24,0xf1,
+-	  0xae,0x84,0x57,0x25,0x30,0x00,0x01,
+-	  0x01}},
+-        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+-	  0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+-	  0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11152x768_1[] =
+-{
+-        {{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
+-	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x97,0x1f,
+-	  0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
+-	  0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
+-	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x97,0x1f,
+-	  0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
+-	  0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x04,0x3e,
+-	  0xe2,0x89,0xdf,0x05,0x00,0x00,0x01,
+-	  0x00}},
+-        {{0x7e,0x63,0x82,0x68,0x15,0x7c,0xf0,
+-	  0x5a,0x8f,0x57,0x7d,0x20,0x00,0x26,
+-	  0x01}},
+-        {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+-	  0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+-	  0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11152x768_1_H[] =
+-{
+-        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+-	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+-	  0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+-	  0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+-	  0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+-	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+-	  0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+-	  0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+-	  0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x04,0x3e,
+-	  0xe2,0x89,0xdf,0x05,0x00,0x00,0x44,
+-	  0x00}},
+-        {{0x3c,0x31,0x80,0x35,0x1c,0x7c,0xf0,
+-	  0x5a,0x8f,0x57,0x7d,0x20,0x00,0x55,
+-	  0x01}},
+-        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+-	  0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+-	  0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11152x768_2[] =
+-{
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-	  0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
+-	  0x00}},
+-        {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
+-	  0xae,0x84,0x57,0x25,0x30,0x00,0x02,
+-	  0x01}},
+-        {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+-	  0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+-	  0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11152x768_2_H[] =
+-{
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-	  0x72,0x88,0xdf,0x25,0x30,0x00,0x01,
+-	  0x00}},
+-        {{0x4f,0x31,0x93,0x3e,0x06,0x24,0xf1,
+-	  0xae,0x84,0x57,0x25,0x30,0x00,0x01,
+-	  0x01}},
+-        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+-	  0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+-	  0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11600x1200_1[] =  
+-{    
+  {{0x83,0x4f,0x87,0x51,0x09,0xc0,0x1f,
+    0x90,0x84,0x8f,0xc1,0x30,0x00,0x06,
+    0x00}},
+@@ -4701,7 +2991,7 @@ static const SiS310_LVDSCRT1DataStruct  
+ 	{{0x80,0x63,0x84,0x6d,0x0f,0xec,0xf0,
+ 	  0x7a,0x8f,0x57,0xed,0x20,0x00,0x06,
+ 	  0x01 }},
+-	{{0x8c,0x7f,0x90,0x86,0x09,0xaf,0xf5,  /* TW: 1024x768 */
++	{{0x8c,0x7f,0x90,0x86,0x09,0xaf,0xf5,
+ 	  0x36,0x88,0xff,0xb0,0x10,0x00,0x02,
+ 	  0x01}}
+ };
+@@ -4726,7 +3016,7 @@ static const SiS310_LVDSCRT1DataStruct  
+ 	{{0x7d,0x63,0x81,0x68,0x0e,0xba,0xf0,
+ 	  0x78,0x8a,0x57,0xbb,0x20,0x00,0x06,
+ 	  0x01 }},
+-	{{0x8c,0x7f,0x90,0x82,0x06,0x46,0xf5,   /* TW: 1024x768 */
++	{{0x8c,0x7f,0x90,0x82,0x06,0x46,0xf5,
+ 	  0x15,0x88,0xff,0x47,0x70,0x00,0x02,
+ 	  0x01 }}
+ };
+@@ -4751,7 +3041,7 @@ static const SiS310_LVDSCRT1DataStruct  
+ 	{{0x73,0x63,0x97,0x69,0x8b,0xec,0xf0,
+ 	  0x90,0x8c,0x57,0xed,0x20,0x00,0x05,
+ 	  0x01 }},
+-	{{0xaa,0x7f,0x8e,0x8e,0x96,0xe6,0xf5,   /* TW: 1024x768 */
++	{{0xaa,0x7f,0x8e,0x8e,0x96,0xe6,0xf5,
+ 	  0x50,0x88,0xff,0xe7,0x10,0x00,0x02,
+ 	  0x01}}
+ };
+@@ -4776,7 +3066,7 @@ static const SiS310_LVDSCRT1DataStruct  
+ 	{{0x71,0x63,0x95,0x69,0x8c,0x6f,0xf0,
+ 	  0x5a,0x8b,0x57,0x70,0x20,0x00,0x05,
+ 	  0x01 }},
+-	{{0xaa,0x7f,0x8e,0x8f,0x96,0x69,0xf5,   /* TW:  1024x768 */
++	{{0xaa,0x7f,0x8e,0x8f,0x96,0x69,0xf5,
+ 	  0x28,0x88,0xff,0x6a,0x10,0x00,0x02,
+ 	  0x01 }}
+ };
+@@ -4801,12 +3091,11 @@ static const SiS310_LVDSCRT1DataStruct  
+ 	{{0x71,0x63,0x95,0x69,0x8c,0x6f,0xf0,
+ 	  0x5a,0x8b,0x57,0x70,0x20,0x00,0x05,
+ 	  0x01 }},
+-	{{0xaa,0x7f,0x8e,0x8f,0x96,0x69,0xf5,   /* TW:  1024x768 */
++	{{0xaa,0x7f,0x8e,0x8f,0x96,0x69,0xf5,
+ 	  0x28,0x88,0xff,0x6a,0x10,0x00,0x02,
+ 	  0x01 }}
+ };
+ 
+-/* TW: Data for Chrontel 7019  */
+ typedef struct _SiS310_CHTVRegDataStruct
+ {
+  	UCHAR Reg[16];
+--- linux-2.6.0-test1/drivers/video/sis/init301.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/video/sis/init301.c	2003-07-19 17:04:55.000000000 -0700
+@@ -1,27 +1,11 @@
+ /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init301.c,v 1.3 2002/22/04 01:16:16 dawes Exp $ */
+ /*
+- * Mode switching code (CRT2 section) for SiS 300/540/630/730/315/550/650/740/330
+- * (Universal module for Linux kernel framebuffer, XFree86 4.x)
++ * Mode switching code (CRT2 section) for SiS 300/540/630/730/315/550/650/740/330/660
++ * (Universal module for Linux kernel framebuffer and XFree86 4.x)
+  *
+  * Assembler-To-C translation
+  * Copyright 2002, 2003 by Thomas Winischhofer <thomas@winischhofer.net>
+- * Minor parts Copyright SiS, Inc.
+- *
+- * Based on BIOS
+- *     1.10.07, 1.10a for 650/CH7019
+- *     1.11.21a for 740/CH7019
+- *     1.11.05 for 650/LVDS (w/o Chrontel)
+- *     1.07.1b, 1.10.6s, 1.11.6w, 1.11.7w, 1.11.8r for 650/301(B/LV), 650/302LV
+- *     2.04.50 (I) and 2.04.5c (II) for 630/301(B)
+- *     2.02.3b, 2.03.02, 2.04.2c, 2.04.5c, 2.07a and 2.08.b3 for 630/LVDS/LVDS+CH7005
+- *     2.04.5c, 2.04.6c for 730+LVDS+CH7005
+- *     1.09b for 315/301(B)
+- *     1.16.51 for 300+301LV (ECS A907)
+- *     1.01.03 for 330 (Xabre 400)
+- *
+- * Known bugs:
+- *   1024x768 panel, expanding (CR37=1): Mode 640x480 does not work on SOME panels
+- *       therefore, we always do the scaling ourselves for now.
++ * Formerly based on non-functional code-fragements by SiS, Inc.
+  *
+  * Permission to use, copy, modify, distribute, and sell this software and its
+  * documentation for any purpose is hereby granted without fee, provided that
+@@ -73,8 +57,8 @@
+ #define SiS_I2CDELAYSHORT  150
+ 
+ BOOLEAN
+-SiS_SetCRT2Group301(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+-                    PSIS_HW_DEVICE_INFO HwDeviceExtension)
++SiS_SetCRT2Group(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
++                 PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
+    USHORT ModeIdIndex;
+    USHORT RefreshRateTableIndex;
+@@ -85,9 +69,9 @@ SiS_SetCRT2Group301(SiS_Private *SiS_Pr,
+       SiS_SearchModeID(SiS_Pr,ROMAddr,&ModeNo,&ModeIdIndex);
+    } else {
+       ModeIdIndex = 0;
+-   }      
++   }
+ 
+-   /* TW: Used for shifting CR33 */
++   /* Used for shifting CR33 */
+    SiS_Pr->SiS_SelectCRT2Rate = 4;
+ 
+    SiS_UnLockCRT2(SiS_Pr, HwDeviceExtension, BaseAddr);
+@@ -110,8 +94,6 @@ SiS_SetCRT2Group301(SiS_Private *SiS_Pr,
+       return(TRUE);
+    }
+ 
+-   if(SiS_Pr->UseCustomMode) return(FALSE);
+-   
+    SiS_GetCRT2Data(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+                    HwDeviceExtension);
+ 
+@@ -153,9 +135,9 @@ SiS_SetCRT2Group301(SiS_Private *SiS_Pr,
+       	   SiS_SetGroup5(SiS_Pr,HwDeviceExtension, BaseAddr,ROMAddr,
+ 	                 ModeNo,ModeIdIndex);
+ 
+-	   /* TW: For 301BDH (Panel link initialization): */
++	   /* For 301BDH (Panel link initialization): */
+ 	   if((SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
+-	      if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {	 
++	      if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+ 		 if(!((SiS_Pr->SiS_SetFlag & SetDOSMode) && ((ModeNo == 0x03) || (ModeNo = 0x10)))) {
+ 		    if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+ 		       SiS_ModCRT1CRTC(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+@@ -176,10 +158,10 @@ SiS_SetCRT2Group301(SiS_Private *SiS_Pr,
+ 	                      RefreshRateTableIndex,HwDeviceExtension);
+ 	   }
+ 	}
+-        if(SiS_Pr->SiS_IF_DEF_FSTN == 0) {
+-     	   SiS_SetCRT2ECLK(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+-	 	           RefreshRateTableIndex,HwDeviceExtension);
+-	}
++
++        SiS_SetCRT2ECLK(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
++	                RefreshRateTableIndex,HwDeviceExtension);
++
+ 	if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+      	   if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+ 	      if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
+@@ -199,74 +181,64 @@ SiS_SetCRT2Group301(SiS_Private *SiS_Pr,
+    }
+ 
+ #ifdef SIS300
+-   if ( (HwDeviceExtension->jChipType == SIS_540) ||
+-        (HwDeviceExtension->jChipType == SIS_630) ||
+-        (HwDeviceExtension->jChipType == SIS_730) ||
+-        (HwDeviceExtension->jChipType == SIS_300) )
+-    {
+-	if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+-	   if(SiS_Pr->SiS_UseOEM) {
+-	      if((SiS_Pr->SiS_UseROM) && ROMAddr && (SiS_Pr->SiS_UseOEM == -1)) {
+-	         if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
+-	            SiS_OEM300Setting(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo);
+-	         }
+-	      } else {
+-       	         SiS_OEM300Setting(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo);
+-	      }
+-	   }
+-	}
+-    }
+-#endif
+-
+-#ifdef SIS315H
+-   if ( (HwDeviceExtension->jChipType == SIS_315H)  ||
+-        (HwDeviceExtension->jChipType == SIS_315)   ||
+-	(HwDeviceExtension->jChipType == SIS_315PRO)||
+-        (HwDeviceExtension->jChipType == SIS_550)   ||
+-        (HwDeviceExtension->jChipType == SIS_740)   ||
+-        (HwDeviceExtension->jChipType == SIS_650)   ||
+-	(HwDeviceExtension->jChipType == SIS_330) )
+-   {
+-        if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+-	   SiS_FinalizeLCD(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex, HwDeviceExtension);
+-#if 0      /* Instead of FinalizeLCD(), older BIOSes (A92x) used OEMLCD() */
+-	   SiS_OEMLCD(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+-#endif
+-           if(SiS_Pr->SiS_UseOEM) {
+-              SiS_OEM310Setting(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+-           }
+-           SiS_CRT2AutoThreshold(SiS_Pr,BaseAddr);
+-        }
+-   }
+-#endif
+-
+    if(HwDeviceExtension->jChipType < SIS_315H) {
++      if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
++	 if(SiS_Pr->SiS_UseOEM) {
++	    if((SiS_Pr->SiS_UseROM) && ROMAddr && (SiS_Pr->SiS_UseOEM == -1)) {
++	       if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
++	          SiS_OEM300Setting(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
++	       			    RefreshRateTableIndex);
++	       }
++	    } else {
++       	       SiS_OEM300Setting(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
++	       			 RefreshRateTableIndex);
++	    }
++	 }
++	 if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
++            if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
++	       (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
++	       SetOEMLCDData2(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,
++	                      ModeIdIndex,RefreshRateTableIndex);
++	    }
++            if(HwDeviceExtension->jChipType == SIS_730) {
++               SiS_DisplayOn(SiS_Pr);
++	    }
++         }
++      }
+       if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+           if(HwDeviceExtension->jChipType != SIS_730) {
+              SiS_DisplayOn(SiS_Pr);
+ 	  }
+       }
+    }
++#endif
+ 
+-   if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+-      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+-         if(HwDeviceExtension->jChipType == SIS_730) {
+-            SiS_DisplayOn(SiS_Pr);
+-	 }
++#ifdef SIS315H
++   if(HwDeviceExtension->jChipType >= SIS_315H) {
++      if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
++	 SiS_FinalizeLCD(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex, HwDeviceExtension);
++         if(SiS_Pr->SiS_UseOEM) {
++            SiS_OEM310Setting(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
++         }
++         SiS_CRT2AutoThreshold(SiS_Pr,BaseAddr);
+       }
++   }
++#endif
++
++   if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+       SiS_EnableBridge(SiS_Pr,HwDeviceExtension,BaseAddr);
+    }
+ 
+    SiS_DisplayOn(SiS_Pr);
+ 
+    if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
+-	if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-	     /* TW: Disable LCD panel when using TV */
+-	     SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x11,0x0C);
+-	} else {
+-	     /* TW: Disable TV when using LCD */
+-	     SiS_SetCH70xxANDOR(SiS_Pr,0x010E,0xF8);
+-	}
++      if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++	 /* Disable LCD panel when using TV */
++	 SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x11,0x0C);
++      } else {
++	 /* Disable TV when using LCD */
++	 SiS_SetCH70xxANDOR(SiS_Pr,0x010E,0xF8);
++      }
+    }
+ 
+    if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+@@ -283,7 +255,7 @@ SiS_LowModeStuff(SiS_Private *SiS_Pr, US
+     USHORT temp,temp1,temp2;
+ 
+     if((ModeNo != 0x03) && (ModeNo != 0x10) && (ModeNo != 0x12))
+-         return(1);
++       return(1);
+     temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x11);
+     SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x11,0x80);
+     temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x00);
+@@ -304,7 +276,7 @@ SiS_LowModeStuff(SiS_Private *SiS_Pr, US
+     }
+ }
+ 
+-/* TW: Set Part1 registers */
++/* Set Part1 registers */
+ void
+ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+               USHORT ModeIdIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+@@ -313,25 +285,29 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+   USHORT  temp=0, tempax=0, tempbx=0, tempcx=0;
+   USHORT  pushbx=0, CRT1Index=0;
+ #ifdef SIS315H
+-  USHORT  pushcx=0, tempbl=0;
++  USHORT  tempbl=0;
+ #endif
+   USHORT  modeflag, resinfo=0;
+ 
+-  if(ModeNo<=0x13) {
+-	modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
++  if(ModeNo <= 0x13) {
++     modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+   } else {
++     if(SiS_Pr->UseCustomMode) {
++	modeflag = SiS_Pr->CModeFlag;
++     } else {
+     	CRT1Index = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
+     	resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+ 	modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
++     }
+   }
+ 
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+-
+-	   SiS_SetCRT2Sync(SiS_Pr,BaseAddr,ROMAddr,ModeNo,
+-                           RefreshRateTableIndex,HwDeviceExtension);
+ #ifdef SIS315H
+-	   SiS_SetGroup1_LCDA(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+-     	                      HwDeviceExtension,RefreshRateTableIndex);
++     SiS_SetCRT2Sync(SiS_Pr,BaseAddr,ROMAddr,ModeNo,
++                     RefreshRateTableIndex,HwDeviceExtension);
++
++     SiS_SetGroup1_LCDA(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
++                        HwDeviceExtension,RefreshRateTableIndex);
+ #endif
+   } else {
+ 
+@@ -367,13 +343,13 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+ #ifdef SIS300   /* ------------- 300 series --------------*/
+ 
+     		temp = (SiS_Pr->SiS_VGAHT - 1) & 0x0FF;   			/* BTVGA2HT 0x08,0x09 */
+-    		SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,temp);                   /* TW: CRT2 Horizontal Total */
++    		SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,temp);                   /* CRT2 Horizontal Total */
+ 
+     		temp = (((SiS_Pr->SiS_VGAHT - 1) & 0xFF00) >> 8) << 4;
+-    		SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x09,0x0f,temp);          /* TW: CRT2 Horizontal Total Overflow [7:4] */
++    		SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x09,0x0f,temp);          /* CRT2 Horizontal Total Overflow [7:4] */
+ 
+     		temp = (SiS_Pr->SiS_VGAHDE + 12) & 0x0FF;                       /* BTVGA2HDEE 0x0A,0x0C */
+-    		SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0A,temp);                   /* TW: CRT2 Horizontal Display Enable End */
++    		SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0A,temp);                   /* CRT2 Horizontal Display Enable End */
+ 
+     		pushbx = SiS_Pr->SiS_VGAHDE + 12;                               /* bx  BTVGA@HRS 0x0B,0x0C */
+     		tempcx = (SiS_Pr->SiS_VGAHT - SiS_Pr->SiS_VGAHDE) >> 2;
+@@ -382,108 +358,129 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+     		tempcx += tempbx;
+ 
+     		if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+-      			if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC){
+-			        /* CRT1Index &= 0x3F; - Not any longer */
+-        			tempbx = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[4];
+-        			tempbx |= ((SiS_Pr->SiS_CRT1Table[CRT1Index].CR[14] & 0xC0) << 2);
+-        			tempbx = (tempbx - 1) << 3;
+-        			tempcx = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[5];
+-        			tempcx &= 0x1F;
+-        			temp = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[15];
+-        			temp = (temp & 0x04) << (6-2);
+-        			tempcx = (tempcx | temp);
+-				tempcx--;
+-				tempcx <<= 3;
+-      			}
+-
+-    			if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (resinfo == 0x08)){
+-        			if(!(SiS_Pr->SiS_VBInfo & SetPALTV)){
+-      					tempbx = 1040;
+-      					tempcx = 1042;
+-      				}
+-    			}
++
++		   if(SiS_Pr->UseCustomMode) {
++		      tempbx = SiS_Pr->CHSyncStart + 12;
++		      tempcx = SiS_Pr->CHSyncEnd + 12;
++		   }
++
++      		   if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
++		      unsigned char cr4, cr14, cr5, cr15;
++		      if(SiS_Pr->UseCustomMode) {
++		         cr4  = SiS_Pr->CCRT1CRTC[4];
++			 cr14 = SiS_Pr->CCRT1CRTC[14];
++			 cr5  = SiS_Pr->CCRT1CRTC[5];
++			 cr15 = SiS_Pr->CCRT1CRTC[15];
++		      } else {
++		         cr4  = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[4];
++			 cr14 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[14];
++			 cr5  = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[5];
++			 cr15 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[15];
++		      }
++        	      tempbx = ((cr4 | ((cr14 & 0xC0) << 2)) - 1) << 3;
++        	      tempcx = (((cr5 & 0x1F) | ((cr15 & 0x04) << (6-2))) - 1) << 3;
++      		   }
++
++    		   if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (resinfo == SIS_RI_1024x768)){
++        	      if(!(SiS_Pr->SiS_VBInfo & SetPALTV)){
++      			 tempbx = 1040;
++      			 tempcx = 1042;
++      		      }
++    		   }
+ 	        }
+ 
+     		temp = tempbx & 0x00FF;
+-    		SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0B,temp);                   /* TW: CRT2 Horizontal Retrace Start */
++    		SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0B,temp);                   /* CRT2 Horizontal Retrace Start */
+ #endif /* SIS300 */
+ 
+  	} else {
+ 
+-#ifdef SIS315H  /* ----------------- 310/325/330 series ------------- */
++#ifdef SIS315H  /* ------------------- 315/330 series --------------- */
+ 
+ 	        tempcx = SiS_Pr->SiS_VGAHT;				       /* BTVGA2HT 0x08,0x09 */
+-		pushcx = tempcx;
+ 		if(modeflag & HalfDCLK) {
+-#ifndef NEWCH701x		
+-		    if((SiS_Pr->SiS_IF_DEF_LVDS == 1) && (SiS_Pr->SiS_IF_DEF_CH70xx == 0)) {
+-#endif		    
++		    if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ 		          tempax = SiS_Pr->SiS_VGAHDE >> 1;
+ 			  tempcx = SiS_Pr->SiS_HT - SiS_Pr->SiS_HDE + tempax;
+ 			  if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+ 			      tempcx = SiS_Pr->SiS_HT - tempax;
+ 			  }
+-#ifndef NEWCH701x					  
+ 		    } else {
+ 			  tempcx >>= 1;
+ 		    }
+-#endif		    
+ 		}
+ 		tempcx--;
+ 
+ 		temp = tempcx & 0xff;
+-		SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,temp);                  /* TW: CRT2 Horizontal Total */
++		SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,temp);                  /* CRT2 Horizontal Total */
+ 
+ 		temp = ((tempcx & 0xff00) >> 8) << 4;
+-		SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x09,0x0F,temp);         /* TW: CRT2 Horizontal Total Overflow [7:4] */
++		SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x09,0x0F,temp);         /* CRT2 Horizontal Total Overflow [7:4] */
+ 
+-		tempcx = pushcx;					       /* BTVGA2HDEE 0x0A,0x0C */
++		tempcx = SiS_Pr->SiS_VGAHT;				       /* BTVGA2HDEE 0x0A,0x0C */
+ 		tempbx = SiS_Pr->SiS_VGAHDE;
+ 		tempcx -= tempbx;
+ 		tempcx >>= 2;
+ 		if(modeflag & HalfDCLK) {
+-		    tempbx >>= 1;
+-		    tempcx >>= 1;
++		   tempbx >>= 1;
++		   tempcx >>= 1;
+ 		}
+ 		tempbx += 16;
+ 
+ 		temp = tempbx & 0xff;
+-		SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0A,temp);                  /* TW: CRT2 Horizontal Display Enable End */
++		SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0A,temp);                  /* CRT2 Horizontal Display Enable End */
+ 
+ 		pushbx = tempbx;
+ 		tempcx >>= 1;
+ 		tempbx += tempcx;
+ 		tempcx += tempbx;
+ 
+-		if(SiS_Pr->SiS_IF_DEF_LVDS==0) {
++		if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
++
++		   if(SiS_Pr->UseCustomMode) {
++		      tempbx = SiS_Pr->CHSyncStart + 16;
++		      tempcx = SiS_Pr->CHSyncEnd + 16;
++		      tempax = SiS_Pr->SiS_VGAHT;
++		      if(modeflag & HalfDCLK) tempax >>= 1;
++		      tempax--;
++		      if(tempcx > tempax)  tempcx = tempax;
++		   }
++
+              	   if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
+-                	tempbx = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[4];
+-                	tempbx |= ((SiS_Pr->SiS_CRT1Table[CRT1Index].CR[14] & 0xC0) << 2);
+-                	tempbx = (tempbx - 3) << 3;         		/*(VGAHRS-3)*8 */
+-                	tempcx = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[5];
+-               		tempcx &= 0x1F;
+-                	temp = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[15];
+-                	temp = (temp & 0x04) << (5-2);      		/* VGAHRE D[5] */
+-                	tempcx = (tempcx | temp);	  	  	/* (VGAHRE-3)*8 */
+-			tempcx -= 3;
+-			tempcx <<= 3;
+-			tempcx &= 0x00FF;
+-			tempcx |= (tempbx & 0xFF00);
+-                	tempbx += 16;
+-                	tempcx += 16;
+-			tempax = SiS_Pr->SiS_VGAHT;
+-			if(modeflag & HalfDCLK)  tempax >>= 1;
+-			tempax--;
+-			if(tempcx > tempax)  tempcx = tempax;
++		      unsigned char cr4, cr14, cr5, cr15;
++		      if(SiS_Pr->UseCustomMode) {
++		         cr4  = SiS_Pr->CCRT1CRTC[4];
++			 cr14 = SiS_Pr->CCRT1CRTC[14];
++			 cr5  = SiS_Pr->CCRT1CRTC[5];
++			 cr15 = SiS_Pr->CCRT1CRTC[15];
++		      } else {
++		         cr4  = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[4];
++			 cr14 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[14];
++			 cr5  = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[5];
++			 cr15 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[15];
++		      }
++                      tempbx = ((cr4 | ((cr14 & 0xC0) << 2)) - 3) << 3; 		/* (VGAHRS-3)*8 */
++                      tempcx = (((cr5 & 0x1f) | ((cr15 & 0x04) << (5-2))) - 3) << 3; 	/* (VGAHRE-3)*8 */
++		      tempcx &= 0x00FF;
++		      tempcx |= (tempbx & 0xFF00);
++                      tempbx += 16;
++                      tempcx += 16;
++		      tempax = SiS_Pr->SiS_VGAHT;
++		      if(modeflag & HalfDCLK) tempax >>= 1;
++		      tempax--;
++		      if(tempcx > tempax)  tempcx = tempax;
+              	   }
+-         	   if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (resinfo == 0x08)){
+-             	      if(!(SiS_Pr->SiS_VBInfo & SetPALTV)){
+-      		 	 tempbx = 1040;
+-      		 	 tempcx = 1042;
+-      	     	      }
++         	   if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++		      if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
++		         if(resinfo == SIS_RI_1024x768) {
++      		 	    tempbx = 1040;
++      		 	    tempcx = 1042;
++      	     	         }
++		      }
+          	   }
+-		   /* TW: Makes no sense, but is in 650/302LV 1.10.6s */
+-         	   if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (resinfo == 0x08)){
++#if 0
++		   /* Makes no sense, but is in 650/30xLV 1.10.6s */
++         	   if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (resinfo == SIS_RI_1024x768)){
+ 		      if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV)) {
+              	         if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+       		 	    tempbx = 1040;
+@@ -491,25 +488,26 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+       	     	         }
+ 		      }
+          	   }
++#endif
+                 }
+ 
+ 		temp = tempbx & 0xff;
+-	 	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0B,temp);                 /* TW: CRT2 Horizontal Retrace Start */
++	 	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0B,temp);                 /* CRT2 Horizontal Retrace Start */
+ #endif  /* SIS315H */
+ 
+-     	}  /* 310/325/330 series */
++     	}  /* 315/330 series */
+ 
+-  	/* TW: The following is done for all bridge/chip types/series */
++  	/* The following is done for all bridge/chip types/series */
+ 
+   	tempax = tempbx & 0xFF00;
+   	tempbx = pushbx;
+   	tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
+   	tempax |= (tempbx & 0xFF00);
+   	temp = (tempax & 0xFF00) >> 8;
+-  	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0C,temp);                        /* TW: Overflow */
++  	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0C,temp);                        /* Overflow */
+ 
+   	temp = tempcx & 0x00FF;
+-  	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0D,temp);                        /* TW: CRT2 Horizontal Retrace End */
++  	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0D,temp);                        /* CRT2 Horizontal Retrace End */
+ 
+   	/* 2. Vertical setup */
+ 
+@@ -517,30 +515,30 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+   	temp = tempcx & 0x00FF;
+ 
+         if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+-	     if(HwDeviceExtension->jChipType < SIS_315H) {
+-	          if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+-		       if(SiS_Pr->SiS_VBInfo & (SetCRT2ToSVIDEO | SetCRT2ToAVIDEO)) {
+-		           temp--;
+-		       }
+-                  }
+-	     } else {
+- 		      temp--;
+-             }
++	   if(HwDeviceExtension->jChipType < SIS_315H) {
++	      if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
++	         if(SiS_Pr->SiS_VBInfo & (SetCRT2ToSVIDEO | SetCRT2ToAVIDEO)) {
++	            temp--;
++	         }
++              }
++	   } else {
++ 	      temp--;
++           }
+         } else if(HwDeviceExtension->jChipType >= SIS_315H) {
+-	    /* TW: 650/30xLV 1.10.6s */
+-	    temp--;
++	   /* 650/30xLV 1.10.6s */
++	   temp--;
+ 	}
+-  	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0E,temp);                        /* TW: CRT2 Vertical Total */
++  	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0E,temp);                        /* CRT2 Vertical Total */
+ 
+   	tempbx = SiS_Pr->SiS_VGAVDE - 1;
+   	temp = tempbx & 0x00FF;
+-  	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0F,temp);                        /* TW: CRT2 Vertical Display Enable End */
++  	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0F,temp);                        /* CRT2 Vertical Display Enable End */
+ 
+   	temp = ((tempbx & 0xFF00) << 3) >> 8;
+   	temp |= ((tempcx & 0xFF00) >> 8);
+-  	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x12,temp);                        /* TW: Overflow (and HWCursor Test Mode) */
++  	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x12,temp);                        /* Overflow (and HWCursor Test Mode) */
+ 
+-	/* TW: 650/LVDS (1.10.07), 650/30xLV (1.10.6s) */
++	/* 650/LVDS (1.10.07), 650/30xLV (1.10.6s) */
+ 	if(HwDeviceExtension->jChipType >= SIS_315H) {
+            tempbx++;
+    	   tempax = tempbx;
+@@ -553,29 +551,44 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+ 	   tempcx += tempbx;
+ 	   tempcx++;
+ 	} else {
+-	   /* TW: 300 series, LVDS/301B: */
++	   /* 300 series, LVDS/301B: */
+   	   tempbx = (SiS_Pr->SiS_VGAVT + SiS_Pr->SiS_VGAVDE) >> 1;                 /*  BTVGA2VRS     0x10,0x11   */
+   	   tempcx = ((SiS_Pr->SiS_VGAVT - SiS_Pr->SiS_VGAVDE) >> 4) + tempbx + 1;  /*  BTVGA2VRE     0x11        */
+ 	}
+ 
+   	if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+-    	   if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC){
+-      		tempbx = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[8];
+-      		temp = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[7];
+-      		if(temp & 0x04) tempbx |= 0x0100;
+-      		if(temp & 0x80) tempbx |= 0x0200;
+-      		temp = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[13];
+-      		if(temp & 0x08) tempbx |= 0x0400;
+-      		temp = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[9];
+-      		tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
++
++	   if(SiS_Pr->UseCustomMode) {
++	      tempbx = SiS_Pr->CVSyncStart;
++	      tempcx = (tempcx & 0xFF00) | (SiS_Pr->CVSyncEnd & 0x00FF);
++	   }
++
++    	   if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
++	      unsigned char cr8, cr7, cr13, cr9;
++	      if(SiS_Pr->UseCustomMode) {
++	         cr8  = SiS_Pr->CCRT1CRTC[8];
++		 cr7  = SiS_Pr->CCRT1CRTC[7];
++		 cr13 = SiS_Pr->CCRT1CRTC[13];
++		 cr9  = SiS_Pr->CCRT1CRTC[9];
++	      } else {
++	         cr8  = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[8];
++		 cr7  = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[7];
++		 cr13 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[13];
++		 cr9  = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[9];
++	      }
++      	      tempbx = cr8;
++      	      if(cr7 & 0x04)  tempbx |= 0x0100;
++      	      if(cr7 & 0x80)  tempbx |= 0x0200;
++      	      if(cr13 & 0x08) tempbx |= 0x0400;
++      	      tempcx = (tempcx & 0xFF00) | (cr9 & 0x00FF);
+     	   }
+   	}
+   	temp = tempbx & 0x00FF;
+-  	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x10,temp);           /* TW: CRT2 Vertical Retrace Start */
++  	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x10,temp);           /* CRT2 Vertical Retrace Start */
+ 
+   	temp = ((tempbx & 0xFF00) >> 8) << 4;
+   	temp |= (tempcx & 0x000F);
+-  	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x11,temp);           /* TW: CRT2 Vert. Retrace End; Overflow; "Enable CRTC Check" */
++  	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x11,temp);           /* CRT2 Vert. Retrace End; Overflow; "Enable CRTC Check" */
+ 
+   	/* 3. Panel compensation delay */
+ 
+@@ -590,18 +603,18 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+ 		   temp = 0x10;
+ 		   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)  temp = 0x2c;
+ 		   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) temp = 0x20;
+-		   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960)  temp = 0x24;
+ 		}
+ 		if(SiS_Pr->SiS_VBType & VB_SIS301) {
+ 		   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) temp = 0x20;
+ 		}
+ 		if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960)     temp = 0x24;
++		if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom)       temp = 0x2c;
+ 		if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) 		temp = 0x08;
+ 		if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+       		   if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) 	temp = 0x2c;
+       		   else 					temp = 0x20;
+     	        }
+-		if((ROMAddr) && (SiS_Pr->SiS_UseROM) && (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) {
++		if((ROMAddr) && (SiS_Pr->SiS_UseROM)) {
+ 		    if(ROMAddr[0x220] & 0x80) {
+ 		        if(SiS_Pr->SiS_VBInfo & (SetCRT2ToTV-SetCRT2ToHiVisionTV))
+ 				temp = ROMAddr[0x221];
+@@ -636,19 +649,20 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+ 		}
+ 	   }
+ 
+-    	   SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,~0x03C,temp);         /* TW: Panel Link Delay Compensation; (Software Command Reset; Power Saving) */
++    	   SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,~0x03C,temp);         /* Panel Link Delay Compensation; (Software Command Reset; Power Saving) */
+ 
+ #endif  /* SIS300 */
+ 
+   	} else {
+ 
+-#ifdef SIS315H   /* ----------- 310/325/330 series ---------------*/
++#ifdef SIS315H   /* --------------- 315/330 series ---------------*/
+ 
+ 	   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+                 temp = 0x10;
+                 if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)  temp = 0x2c;
+     	        if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) temp = 0x20;
+     	        if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960)  temp = 0x24;
++		if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom)    temp = 0x2c;
+ 		if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ 		   temp = 0x08;
+ 		   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+@@ -664,7 +678,7 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+ 		      }
+     	           }
+ 		}
+-		if(SiS_Pr->SiS_VBType & VB_SIS301B302B) {
++		if((SiS_Pr->SiS_VBType & VB_SIS301B302B) && (!(SiS_Pr->SiS_VBType & VB_NoLCD))) {
+ 		   tempbl = 0x00;
+ 		   if((ROMAddr) && (SiS_Pr->SiS_UseROM)) {
+ 		      if(HwDeviceExtension->jChipType < SIS_330) {
+@@ -689,8 +703,16 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+ 		      if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) tempbl = 0x0F;
+ 		   }
+ 		}
++		
++		if(SiS_Pr->SiS_IF_DEF_DSTN || SiS_Pr->SiS_IF_DEF_FSTN) {
++		   temp = 0x08;
++		   tempbl = 0;
++		   if((ROMAddr) && (SiS_Pr->SiS_UseROM)) {
++		      if(ROMAddr[0x13c] & 0x80) tempbl = 0xf0;
++		   }
++		}
+ 	   }
+-	   SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,tempbl,temp);	    /* TW: Panel Link Delay Compensation */
++	   SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,tempbl,temp);	    /* Panel Link Delay Compensation */
+ 
+     	   tempax = 0;
+     	   if (modeflag & DoubleScanMode) tempax |= 0x80;
+@@ -705,14 +727,13 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+ 
+      if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ 
+-        /* TW: For 301BDH, we set up the Panel Link */
+-        if( (SiS_Pr->SiS_VBType & VB_NoLCD) &&
+-	    (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) ) {
++        /* For 301BDH with LCD, we set up the Panel Link */
++        if( (SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) ) {
+ 
+ 	    SiS_SetGroup1_LVDS(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+ 	                       HwDeviceExtension,RefreshRateTableIndex);
+ 
+-        } else if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {                             
++        } else if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+ 
+     	    SiS_SetGroup1_301(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+ 	                      HwDeviceExtension,RefreshRateTableIndex);
+@@ -749,23 +770,27 @@ SiS_SetGroup1_301(SiS_Private *SiS_Pr, U
+   USHORT  push1,push2;
+   USHORT  tempax,tempbx,tempcx,temp;
+   USHORT  resinfo,modeflag;
++  unsigned char p1_7, p1_8;
+ 
+   if(ModeNo <= 0x13) {
+-    	modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+-    	resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
++     modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
++     resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+   } else {
++     if(SiS_Pr->UseCustomMode) {
++        modeflag = SiS_Pr->CModeFlag;
++	resinfo = 0;
++     } else {
+     	modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+     	resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
++     }
+   }
+ 
+-  /* TW: The following is only done if bridge is in slave mode: */
++  /* The following is only done if bridge is in slave mode: */
+ 
+   tempax = 0xFFFF;
+   if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV))  tempax = SiS_GetVGAHT2(SiS_Pr);
+ 
+-  if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-  	modeflag |= Charx8Dot;
+-  }
++  if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)  modeflag |= Charx8Dot;
+ 
+   if(modeflag & Charx8Dot) tempcx = 0x08;
+   else                     tempcx = 0x09;
+@@ -777,8 +802,7 @@ SiS_SetGroup1_301(SiS_Private *SiS_Pr, U
+   tempax = (tempax / tempcx) - 5;
+   tempbx = tempax & 0x00FF;
+ 
+-  temp = 0xFF;                                                  /* set MAX HT */
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x03,temp);
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x03,0xff);                 /* set MAX HT */
+ 
+   tempax = SiS_Pr->SiS_VGAHDE;                                 	/* 0x04 Horizontal Display End */
+   if(modeflag & HalfDCLK) tempax >>= 1;
+@@ -789,13 +813,13 @@ SiS_SetGroup1_301(SiS_Private *SiS_Pr, U
+ 
+   temp = (tempbx & 0xFF00) >> 8;
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-        if(!(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) {        
+-    	    temp += 2;
+-        }
+-  }	
++     if(!(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) {
++        temp += 2;
++     }
++  }
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+      if(SiS_Pr->SiS_HiVision == 3) {
+-              if(resinfo == 7) temp -= 2;
++        if(resinfo == SIS_RI_800x600) temp -= 2;
+      }
+   }
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x05,temp);                 /* 0x05 Horizontal Display Start */
+@@ -804,140 +828,133 @@ SiS_SetGroup1_301(SiS_Private *SiS_Pr, U
+ 
+   if((SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+      (SiS_Pr->SiS_HiVision == 3)) {
+-    temp = (tempbx & 0x00FF) - 1;
+-    if(!(modeflag & HalfDCLK)) {
+-      temp -= 6;
+-      if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
+-        temp -= 2;
+-        if(ModeNo > 0x13) temp -= 10;
+-      }
+-    }
++     temp = (tempbx & 0x00FF) - 1;
++     if(!(modeflag & HalfDCLK)) {
++        temp -= 6;
++        if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
++           temp -= 2;
++           if(ModeNo > 0x13) temp -= 10;
++        }
++     }
+   } else {
+-    tempcx = tempbx & 0x00FF;
+-    tempbx = (tempbx & 0xFF00) >> 8;
+-    tempcx = (tempcx + tempbx) >> 1;
+-    temp = (tempcx & 0x00FF) + 2;
+-    if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV){
+-       temp--;
+-       if(!(modeflag & HalfDCLK)){
+-          if((modeflag & Charx8Dot)){
+-             temp += 4;
+-             if(SiS_Pr->SiS_VGAHDE >= 800) temp -= 6;
+-             if(HwDeviceExtension->jChipType >= SIS_315H) {
+-	        if(SiS_Pr->SiS_VGAHDE == 800) temp += 2;
+-             }
+-          }
+-       }
+-    } else {
+-       if(!(modeflag & HalfDCLK)) {
+-          temp -= 4;
+-          if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x960) {
+-             if(SiS_Pr->SiS_VGAHDE >= 800) {
+-                temp -= 7;
+-	        if(HwDeviceExtension->jChipType < SIS_315H) {
+-	           /* 650/301LV(x) does not do this, 630/301B, 300/301LV do */
+-                   if(SiS_Pr->SiS_ModeType == ModeEGA) {
+-                      if(SiS_Pr->SiS_VGAVDE == 1024) {
+-                         temp += 15;
+-                         if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024) 
+-			    temp += 7;
+-                      }
+-                   }
+-	        }
+-                if(SiS_Pr->SiS_VGAHDE >= 1280) {
+-                   if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x960) {
+-                      if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) temp += 28;
+-                   }
+-                }
+-             }
+-          }
+-       }
+-    }
++     tempcx = tempbx & 0x00FF;
++     tempbx = (tempbx & 0xFF00) >> 8;
++     tempcx = (tempcx + tempbx) >> 1;
++     temp = (tempcx & 0x00FF) + 2;
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++        temp--;
++        if(!(modeflag & HalfDCLK)) {
++           if((modeflag & Charx8Dot)) {
++              temp += 4;
++              if(SiS_Pr->SiS_VGAHDE >= 800) temp -= 6;
++              if(HwDeviceExtension->jChipType >= SIS_315H) {
++	         if(SiS_Pr->SiS_VGAHDE == 800) temp += 2;
++              }
++           }
++        }
++     } else {
++        if(!(modeflag & HalfDCLK)) {
++           temp -= 4;
++           if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x960) {
++              if(SiS_Pr->SiS_VGAHDE >= 800) {
++                 temp -= 7;
++	         if(HwDeviceExtension->jChipType < SIS_315H) {
++	            /* 650/301LV(x) does not do this, 630/301B, 300/301LV do */
++                    if(SiS_Pr->SiS_ModeType == ModeEGA) {
++                       if(SiS_Pr->SiS_VGAVDE == 1024) {
++                          temp += 15;
++                          if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024)
++		  	     temp += 7;
++                       }
++                    }
++	         }
++                 if(SiS_Pr->SiS_VGAHDE >= 1280) {
++                    if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) temp += 28;
++                 }
++              }
++           }
++        }
++     }
+   }
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,temp);               	/* 0x07 Horizontal Retrace Start */
+ 
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,0x00);                 /* 0x08 Horizontal Retrace End   */
++  p1_7 = temp;
++  p1_8 = 0x00;
+ 
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+      if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
+-            if(ModeNo <= 0x01) {
+-	        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0x2a);
+-		if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-		    SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,0x61);
+-		} else {
+-		    SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,0x41);
+-		}
+-	    } else if(SiS_Pr->SiS_ModeType == ModeText) {
+-	        if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-		    SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0x54);
+-		} else {
+-		    SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0x55);
+-		}
+-		SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,0x00);
+-	    } else if(ModeNo <= 0x13) {
+-	        if(modeflag & HalfDCLK) {
+-		    if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-		        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0x30);
+-			SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,0x03);
+-		    } else {
+-		        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0x2f);
+-			SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,0x02);
+-		    }
+-		} else {
+-		    SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0x5b);
+-		    SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,0x03);
+-		}
+-	    } else if( ((HwDeviceExtension->jChipType >= SIS_315H) && (ModeNo == 0x50)) ||
+-	               ((HwDeviceExtension->jChipType < SIS_315H) && (resinfo == 0 || resinfo == 1)) ) {
+-	        if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-		    SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0x30);
+-		    SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,0x03);
+-		} else {
+-		    SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0x2f);
+-		    SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,0x03);
+-		}
+-	    }
+-
++        if(ModeNo <= 0x01) {
++	   p1_7 = 0x2a;
++	   if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) p1_8 = 0x61;
++	   else 	      			p1_8 = 0x41;
++	} else if(SiS_Pr->SiS_ModeType == ModeText) {
++	   if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) p1_7 = 0x54;
++	   else 	    			p1_7 = 0x55;
++	   p1_8 = 0x00;
++	} else if(ModeNo <= 0x13) {
++	   if(modeflag & HalfDCLK) {
++	      if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
++		 p1_7 = 0x30;
++		 p1_8 = 0x03;
++	      } else {
++	 	 p1_7 = 0x2f;
++		 p1_8 = 0x02;
++	      }
++	   } else {
++	      p1_7 = 0x5b;
++	      p1_8 = 0x03;
++	   }
++	} else if( ((HwDeviceExtension->jChipType >= SIS_315H) &&
++	            ((ModeNo == 0x50) || (ModeNo = 0x56) || (ModeNo = 0x53))) ||
++	           ((HwDeviceExtension->jChipType < SIS_315H) &&
++		    (resinfo == SIS_RI_320x200 || resinfo == SIS_RI_320x240)) ) {
++	   if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
++	      p1_7 = 0x30,
++	      p1_8 = 0x03;
++	   } else {
++	      p1_7 = 0x2f;
++	      p1_8 = 0x03;
++	   }
++        }
+      }
+   }
++
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+      if(SiS_Pr->SiS_HiVision & 0x03) {
+-        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0xb2);
++	p1_7 = 0xb2;
+ 	if(SiS_Pr->SiS_HiVision & 0x02) {
+-	   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0xab);
++	   p1_7 = 0xab;
+ 	}
+      }
+   }
+ 
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,p1_7);			/* 0x07 Horizontal Retrace Start */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,p1_8);			/* 0x08 Horizontal Retrace End   */
++
++
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x03);                	/* 0x18 SR08 (FIFO Threshold?)   */
+ 
+   SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x19,0xF0);
+ 
+-  tempbx = SiS_Pr->SiS_VGAVT;
+-  push1 = tempbx;
+-
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x09,0xFF);                	/* 0x09 Set Max VT    */
+ 
+   tempcx = 0x121;
+   tempbx = SiS_Pr->SiS_VGAVDE;                               	/* 0x0E Vertical Display End */
+-  if(tempbx == 357) tempbx = 350;
+-  if(tempbx == 360) tempbx = 350;
+-  if(tempbx == 375) tempbx = 350;
+-  if(tempbx == 405) tempbx = 400;
+-  if(tempbx == 420) tempbx = 400;
+-  if(tempbx == 525) tempbx = 480;
++  if     (tempbx == 357) tempbx = 350;
++  else if(tempbx == 360) tempbx = 350;
++  else if(tempbx == 375) tempbx = 350;
++  else if(tempbx == 405) tempbx = 400;
++  else if(tempbx == 420) tempbx = 400;
++  else if(tempbx == 525) tempbx = 480;
+   push2 = tempbx;
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-    	if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+-      		if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
+-        		if(tempbx == 350) tempbx += 5;
+-        		if(tempbx == 480) tempbx += 5;
+-      		}
+-    	}
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
++      	if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
++           if     (tempbx == 350) tempbx += 5;
++           else if(tempbx == 480) tempbx += 5;
++      	}
++     }
+   }
+-  tempbx--;
+-  temp = tempbx & 0x00FF;
+-  tempbx--;
++  tempbx -= 2;
+   temp = tempbx & 0x00FF;
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x10,temp);        		/* 0x10 vertical Blank Start */
+ 
+@@ -945,126 +962,91 @@ SiS_SetGroup1_301(SiS_Private *SiS_Pr, U
+   tempbx--;
+   temp = tempbx & 0x00FF;
+ #if 0
+-  /* TW: Missing code from 630/301B 2.04.5a and 650/302LV 1.10.6s (calles int 2f) */
++  /* Missing code from 630/301B 2.04.5a and 650/302LV 1.10.6s (calles int 2f) */
+   if(xxx()) {
+       if(temp == 0xdf) temp = 0xda;
+   }
+ #endif
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0E,temp);
+ 
+-  if(tempbx & 0x0100) {
+-  	tempcx |= 0x0002;
+-	if(SiS_Pr->SiS_VBType & VB_SIS301) tempcx |= 0x000a;
+-  }
++  if(tempbx & 0x0100)  tempcx |= 0x0002;
+ 
+   tempax = 0x000B;
+   if(modeflag & DoubleScanMode) tempax |= 0x8000;
+ 
+-  if(tempbx & 0x0200) {
+-  	tempcx |= 0x0040;
+-	if(SiS_Pr->SiS_VBType & VB_SIS301) tempax |= 0x2000;
+-  }
+-
+-  if(SiS_Pr->SiS_VBType & VB_SIS301) {
+-        if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+-	      if(SiS_Pr->SiS_VGAVDE == 480) {
+-	             tempax = (tempax & 0x00ff) | 0x2000;
+-		     if(modeflag & DoubleScanMode)  tempax |= 0x8000;
+-	      }
+-	}
+-  }
++  if(tempbx & 0x0200)  tempcx |= 0x0040;
+ 
+   temp = (tempax & 0xFF00) >> 8;
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0B,temp);
+ 
+-  if(tempbx & 0x0400) tempcx |= 0x0600;
++  if(tempbx & 0x0400)  tempcx |= 0x0600;
+ 
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x11,0x00);                	/* 0x11 Vertical Blank End */
+ 
+-  tempax = push1;
+-  tempax -= tempbx;
+-  tempax >>= 2;
+-  push1 = tempax;
++  tempax = (SiS_Pr->SiS_VGAVT - tempbx) >> 2;
+ 
+-  if(HwDeviceExtension->jChipType >= SIS_315H) {
+-        /* TW: 650/30xLV 1.10.6s */
+-        if(ModeNo > 0x13) {
+-	    if(resinfo != 0x09) {  /* 1280x1024 */
+-	        tempax <<= 1;
+-		tempbx += tempax;
+-	    }
+-	} else {
+-	    if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1400x1050) {
+-	        tempax <<= 1;
+-		tempbx += tempax;
+-	    }
+-	}
+-  } else if((resinfo != 0x09) || (SiS_Pr->SiS_VBType & VB_SIS301)) {
+-    	tempax <<= 1;
+-    	tempbx += tempax;
++  if((ModeNo > 0x13) || (HwDeviceExtension->jChipType < SIS_315H)) {
++     if(resinfo != SIS_RI_1280x1024) {
++	tempbx += (tempax << 1);
++     }
++  } else if(HwDeviceExtension->jChipType >= SIS_315H) {
++     if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1400x1050) {
++	tempbx += (tempax << 1);
++     }
+   }
+ 
+-  if( (SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+-      (SiS_Pr->SiS_HiVision == 3) ) {
+-    	tempbx -= 10;
++  if((SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
++     (SiS_Pr->SiS_HiVision == 3)) {
++     tempbx -= 10;
+   } else {
+-    	if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
+-      	   if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+-	       if(!(SiS_Pr->SiS_HiVision & 0x03)) {
+-                    tempbx += 40;
+-		    if(HwDeviceExtension->jChipType >= SIS_315H) {
+-		       if(SiS_Pr->SiS_VGAHDE == 800) tempbx += 10;
+-		    }
+-      	       }
+-	   }
+-    	}
++     if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
++        if(SiS_Pr->SiS_VBInfo & SetPALTV) {
++	   if(!(SiS_Pr->SiS_HiVision & 0x03)) {
++              tempbx += 40;
++	      if(HwDeviceExtension->jChipType >= SIS_315H) {
++	         if(SiS_Pr->SiS_VGAHDE == 800) tempbx += 10;
++	      }
++      	   }
++	}
++     }
+   }
+-  tempax = push1;
+   tempax >>= 2;
+   tempax++;
+   tempax += tempbx;
+   push1 = tempax;
+   if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+-    	if(tempbx <= 513)  {
+-      		if(tempax >= 513) tempbx = 513;
+-    	}
++     if(tempbx <= 513)  {
++     	if(tempax >= 513) tempbx = 513;
++     }
+   }
+   temp = tempbx & 0x00FF;
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0C,temp);			/* 0x0C Vertical Retrace Start */
+ 
+-  if(!(SiS_Pr->SiS_VBType & VB_SIS301)) {
+-  	tempbx--;
+-  	temp = tempbx & 0x00FF;
+-  	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x10,temp);
+-
+-	if(tempbx & 0x0100) tempcx |= 0x0008;
++  tempbx--;
++  temp = tempbx & 0x00FF;
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x10,temp);
+ 
+-  	if(tempbx & 0x0200) {
+-    	   SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x0B,0x20);
+-	}
++  if(tempbx & 0x0100) tempcx |= 0x0008;
+ 
+-  	tempbx++;
++  if(tempbx & 0x0200) {
++     SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x0B,0x20);
+   }
++  tempbx++;
++
+   if(tempbx & 0x0100) tempcx |= 0x0004;
+   if(tempbx & 0x0200) tempcx |= 0x0080;
+   if(tempbx & 0x0400) {
+-        if(SiS_Pr->SiS_VBType & VB_SIS301) tempcx |= 0x0800;
+-  	else                               tempcx |= 0x0C00;
++     if(SiS_Pr->SiS_VBType & VB_SIS301) tempcx |= 0x0800;
++     else                               tempcx |= 0x0C00;
+   }
+ 
+   tempbx = push1;
+-  temp = tempbx & 0x00FF;
+-  temp &= 0x0F;
++  temp = tempbx & 0x000F;
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0D,temp);        		/* 0x0D vertical Retrace End */
+ 
+   if(tempbx & 0x0010) tempcx |= 0x2000;
+ 
+   temp = tempcx & 0x00FF;
+-  if(SiS_Pr->SiS_VBType & VB_SIS301) {
+-	if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+-	      if(SiS_Pr->SiS_VGAVDE == 480)  temp = 0xa3;
+-	}
+-  }
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0A,temp);              	/* 0x0A CR07 */
+ 
+   temp = (tempcx & 0xFF00) >> 8;
+@@ -1074,8 +1056,8 @@ SiS_SetGroup1_301(SiS_Private *SiS_Pr, U
+   temp = (tempax & 0xFF00) >> 8;
+   temp = (temp >> 1) & 0x09;
+   if(!(SiS_Pr->SiS_VBType & VB_SIS301)) {
+-       /* Only use 8 dot clock */
+-       temp |= 0x01;
++     /* Only use 8 dot clock */
++     temp |= 0x01;
+   }
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x16,temp);              	/* 0x16 SR01 */
+ 
+@@ -1084,16 +1066,15 @@ SiS_SetGroup1_301(SiS_Private *SiS_Pr, U
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x12,0x00);              	/* 0x12 CR17 */
+ 
+   if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
+-       if(IS_SIS650) {
+-           /* TW: 650/30xLV 1.10.6s */
+-           if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) {
+-	       temp = 0x80;
+-	   }
+-       } else temp = 0x80;
+-  } else  temp = 0x00;
++     if(IS_SIS650) {
++        /* 650/30xLV 1.10.6s */
++        if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) {
++	   temp = 0x80;
++	}
++     } else temp = 0x80;
++  } else temp = 0x00;
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1A,temp);                	/* 0x1A SR0E */
+ 
+-  return;
+ }
+ 
+ void
+@@ -1108,40 +1089,52 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+ #endif
+   ULONG  tempeax=0, tempebx, tempecx, tempvcfact=0;
+ 
++  /* This is not supported on LVDS */
++  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) return;
++  if(SiS_Pr->UseCustomMode) return;
++
+   if(ModeNo <= 0x13) {
+-    	modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+-    	resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
++     modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
++     resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+   } else {
+-    	modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+-    	resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
++     modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
++     resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+   }
+ 
+-  /* TW: Set up Panel Link */
++  /* Set up Panel Link */
+ 
+   /* 1. Horizontal setup */
+ 
+   tempax = SiS_Pr->SiS_LCDHDES;
+ 
+-  if( (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) &&
+-      (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ) {
+-  	tempax -= 8;
++  if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
++     if( (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) &&
++         (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ) {
++  	   tempax -= 8;
++     }
+   }
+ 
+   tempcx = SiS_Pr->SiS_HT;    				  /* Horiz. Total */
+ 
+   tempbx = SiS_Pr->SiS_HDE;                               /* Horiz. Display End */
+ 
++  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
++     SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) {
++     tempbx >>= 1;
++  }
++
+   if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
+      if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+-        if((!SiS_Pr->SiS_IF_DEF_DSTN) && (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480)) {
+- 	   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)        tempbx =  800;
+-	   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)  tempbx = 1024;  /* TW */
+-    	   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)  tempbx = 1024;
+-	   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768)  tempbx = 1152;  /* TW */
+-	   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768)  tempbx = 1280;
+-	   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempbx = 1280; 
+-	   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempbx = 1400; 
+-	   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempbx = 1600; 
++        if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
++	   tempbx = SiS_Pr->PanelXRes;
++	} else if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
++	   tempbx = SiS_Pr->PanelXRes;
++	   if(SiS_Pr->SiS_CustomT == CUT_BARCO1024) {
++	      tempbx = 800;
++	      if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel800x600) {
++	         tempbx = 1024;
++	      }
++	   }
+         }
+      }
+   }
+@@ -1154,13 +1147,17 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+   if(tempax >= SiS_Pr->SiS_HT) tempax -= SiS_Pr->SiS_HT;
+ 
+   push2 = tempax;
+-  
+-  if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) { 
+-     if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-        if((!SiS_Pr->SiS_IF_DEF_DSTN) && (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480)) {
+-     	   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)        tempcx = 0x0028;
+-	   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)  tempcx = 0x0018;
+-     	   else if( (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) ||
++
++  if((!SiS_Pr->SiS_IF_DEF_FSTN) &&
++     (!SiS_Pr->SiS_IF_DEF_DSTN) &&
++     (SiS_Pr->SiS_CustomT != CUT_BARCO1366) &&
++     (SiS_Pr->SiS_CustomT != CUT_BARCO1024)) {
++     if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
++        if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
++           if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
++     	      if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)        tempcx = 0x0028;
++	      else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)  tempcx = 0x0018;
++     	      else if( (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) ||
+ 	            (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) ) {
+ 	  	   if(HwDeviceExtension->jChipType < SIS_315H) {
+ 		      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+@@ -1174,11 +1171,12 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+ 		   } else {
+ 		      tempcx = 0x0018;
+ 		   }
++	      }
++	      else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768)  tempcx = 0x0028;
++	      else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempcx = 0x0030;
++	      else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempcx = 0x0030;
++	      else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempcx = 0x0040;
+ 	   }
+-	   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768)  tempcx = 0x0028;
+-	   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempcx = 0x0030;
+-	   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempcx = 0x0030;
+-	   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempcx = 0x0040;
+         }
+      }
+   }
+@@ -1188,14 +1186,17 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+ 
+   tempax = tempcx >> 3;                          /* BPLHRS */
+   temp = tempax & 0x00FF;
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x14,temp);		 /* Part1_14h; TW: Panel Link Horizontal Retrace Start  */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x14,temp);		 /* Part1_14h; Panel Link Horizontal Retrace Start  */
+ 
+   if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
+      temp = (tempax & 0x00FF) + 2;
+   } else {
+      temp = (tempax & 0x00FF) + 10;
+      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-        if(!SiS_Pr->SiS_IF_DEF_DSTN) {
++        if((!SiS_Pr->SiS_IF_DEF_DSTN) &&
++	   (!SiS_Pr->SiS_IF_DEF_FSTN) &&
++	   (SiS_Pr->SiS_CustomT != CUT_BARCO1366) &&
++	   (SiS_Pr->SiS_CustomT != CUT_BARCO1024)) {
+            if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+ 	      temp += 6;
+               if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel800x600) {
+@@ -1219,47 +1220,57 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+ 
+   temp &= 0x1F;
+   temp |= ((tempcx & 0x0007) << 5);
+-  if(SiS_Pr->SiS_IF_DEF_FSTN) temp = 0x20;
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x15,temp);    	 /* Part1_15h; TW: Panel Link Horizontal Retrace End/Skew */
++#if 0
++  if(SiS_Pr->SiS_IF_DEF_FSTN) temp = 0x20;       /* WRONG? BIOS loads cl, not ah */
++#endif  
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x15,temp);    	 /* Part1_15h; Panel Link Horizontal Retrace End/Skew */
+ 
+   tempbx = push2;
+   tempcx = push1;                                /* lcdhdes  */
+ 
+   temp = (tempcx & 0x0007);                      /* BPLHDESKEW  */
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1A,temp);   	 /* Part1_1Ah; TW: Panel Link Vertical Retrace Start (2:0) */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1A,temp);   	 /* Part1_1Ah; Panel Link Vertical Retrace Start (2:0) */
+ 
+   tempcx >>= 3;                                  /* BPLHDES */
+   temp = (tempcx & 0x00FF);
+-  if(ModeNo == 0x5b) temp--;                     
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x16,temp);    	 /* Part1_16h; TW: Panel Link Horizontal Display Enable Start  */
++#if 0 /* Not 550 FSTN */
++  if(HwDeviceExtension->jChipType >= SIS_315H) {
++     if(ModeNo == 0x5b) temp--; */
++  }
++#endif
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x16,temp);    	 /* Part1_16h; Panel Link Horizontal Display Enable Start  */
+ 
+-  if(HwDeviceExtension->jChipType < SIS_315H) {  
++  if((HwDeviceExtension->jChipType < SIS_315H) ||
++     (SiS_Pr->SiS_IF_DEF_FSTN) ||
++     (SiS_Pr->SiS_IF_DEF_DSTN)) {
+      if(tempbx & 0x07) tempbx += 8;              
+   }
+   tempbx >>= 3;                                  /* BPLHDEE  */
+   temp = tempbx & 0x00FF;
+-  if(ModeNo == 0x5b) temp--;			 
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x17,temp);   	 /* Part1_17h; TW: Panel Link Horizontal Display Enable End  */
+-
++#if 0 /* Not 550 FSTN */
++  if(HwDeviceExtension->jChipType >= SIS_315H) {
++     if(ModeNo == 0x5b) temp--;
++  }
++#endif
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x17,temp);   	 /* Part1_17h; Panel Link Horizontal Display Enable End  */
++
+   /* 2. Vertical setup */
+ 
+   if(HwDeviceExtension->jChipType < SIS_315H) {
+      tempcx = SiS_Pr->SiS_VGAVT;
+      tempbx = SiS_Pr->SiS_VGAVDE;
+-     if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+-        if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+-	   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)       tempbx =  600;
+-	   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) tempbx =  600;
+-	   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) tempbx =  768;
+-	   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) tempbx =  768;
+-	   else								tempbx = 1024;
+-        }
++     if((SiS_Pr->SiS_CustomT != CUT_BARCO1366) && (SiS_Pr->SiS_CustomT != CUT_BARCO1024)) {
++        if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
++           if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
++	      tempbx = SiS_Pr->PanelYRes;
++           }
++	}
+      }
+      tempcx -= tempbx;
+ 
+   } else {
+ 
+-     tempcx = SiS_Pr->SiS_VGAVT - SiS_Pr->SiS_VGAVDE;          /* VGAVT-VGAVDE  */
++     tempcx = SiS_Pr->SiS_VGAVT - SiS_Pr->SiS_VGAVDE;           /* VGAVT-VGAVDE  */
+ 
+   }
+ 
+@@ -1268,18 +1279,20 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+ 
+   tempax = SiS_Pr->SiS_VGAVDE;
+ 
+-  if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
+-     if( (SiS_Pr->SiS_IF_DEF_TRUMPION == 0)   && 
+-         (!(SiS_Pr->SiS_LCDInfo & LCDPass11)) &&
+-         (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) ) {
+-        if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)        tempax =  600;
+-        else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)  tempax =  600;  
+-        else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)  tempax =  768;
+-        else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768)  tempax =  768;  
+-        else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768)  tempax =  768;  
+-        else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempax = 1024; 
+-        else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempax = 1050; 
+-        else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempax = 1200; 
++  if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
++     if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) || (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
++        if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
++           tempax = 600;
++	   if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel800x600) {
++	      tempax = 768;
++	   }
++	}
++     } else if( (SiS_Pr->SiS_IF_DEF_TRUMPION == 0)   &&
++                (!(SiS_Pr->SiS_LCDInfo & LCDPass11)) &&
++                ((SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) ||
++	         (SiS_Pr->SiS_IF_DEF_FSTN) ||
++	         (SiS_Pr->SiS_IF_DEF_DSTN)) ) {
++	tempax = SiS_Pr->PanelYRes;
+      }
+   }
+ 
+@@ -1290,11 +1303,24 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+ 
+   tempcx >>= 1;
+ 
+-  if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480)) {
+-     if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
+-        if(!SiS_Pr->SiS_IF_DEF_DSTN) {
+-     	   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)        tempcx = 0x0001;
+-	   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)  tempcx = 0x0001;
++  if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) &&
++     (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) &&
++     (SiS_Pr->SiS_CustomT != CUT_BARCO1366) &&
++     (SiS_Pr->SiS_CustomT != CUT_BARCO1024)) {
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
++        SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) {
++	tempcx = 0x0017;
++     } else if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
++        if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
++	   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)         tempcx = 0x0003;
++  	   else if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) ||
++	           (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768)) tempcx = 0x0003;
++           else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024)  tempcx = 0x0001;
++           else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050)  tempcx = 0x0001;
++	   else 							  tempcx = 0x0057;
++        } else  {
++     	   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)         tempcx = 0x0001;
++	   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)   tempcx = 0x0001;
+      	   else if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) ||
+ 	           (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768)) {
+ 		   if(HwDeviceExtension->jChipType < SIS_315H) {
+@@ -1304,7 +1330,7 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+ 			    tempcx = 0x0003;
+ #endif
+ 		      } else {
+-		            tempcx = 0x0002;   /* TW: A901; sometimes 0x0003; */
++		            tempcx = 0x0002;   /* A901; sometimes 0x0003; */
+ 		      }
+ 		   } else tempcx = 0x0003;
+            }
+@@ -1319,26 +1345,32 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+ 
+   tempbx += tempcx;			 	/* BPLVRS  */
+ 
+-  if(HwDeviceExtension->jChipType < SIS_315H) {
+-      tempbx++;
++  if((HwDeviceExtension->jChipType < SIS_315H) ||
++     (SiS_Pr->SiS_IF_DEF_FSTN) ||
++     (SiS_Pr->SiS_IF_DEF_DSTN)) {
++     tempbx++;
+   }
+ 
+   if(tempbx >= SiS_Pr->SiS_VT) tempbx -= SiS_Pr->SiS_VT;
+ 
+   temp = tempbx & 0x00FF;
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,temp);       	 /* Part1_18h; TW: Panel Link Vertical Retrace Start  */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,temp);       	 /* Part1_18h; Panel Link Vertical Retrace Start  */
+ 
+   tempcx >>= 3;
+ 
+-  if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
++  if((!(SiS_Pr->SiS_LCDInfo & LCDPass11)) &&
++     (SiS_Pr->SiS_CustomT != CUT_BARCO1366) &&
++     (SiS_Pr->SiS_CustomT != CUT_BARCO1024)) {
+      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+         if( (HwDeviceExtension->jChipType < SIS_315H) &&
+             (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) )     tempcx = 0x0001;
++	else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2)  tempcx = 0x0002;
++	else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3)  tempcx = 0x0002;
+         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)    tempcx = 0x0003;
+         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)   tempcx = 0x0005;
+         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768)   tempcx = 0x0005;
+ 	else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768)   tempcx = 0x0011;
+-        else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024)  tempcx = 0x0005;	 
++        else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024)  tempcx = 0x0005;
+         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050)  tempcx = 0x0002;
+         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)  tempcx = 0x0011;
+         else if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480)  {
+@@ -1360,26 +1392,36 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+ 
+   tempcx = tempcx + tempbx + 1;                  /* BPLVRE  */
+   temp = tempcx & 0x000F;
+-  SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0xf0,temp); /* Part1_19h; TW: Panel Link Vertical Retrace End (3:0); Misc.  */
++  if(SiS_Pr->SiS_IF_DEF_FSTN ||
++     SiS_Pr->SiS_IF_DEF_DSTN ||
++     (SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
++     (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
++     temp |= 0x30;
++  }
++  SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0xf0,temp); /* Part1_19h; Panel Link Vertical Retrace End (3:0); Misc.  */
+ 
+   temp = ((tempbx & 0x0700) >> 8) << 3;          /* BPLDESKEW =0 */
+-  if(SiS_Pr->SiS_VGAVDE != SiS_Pr->SiS_VDE)  temp |= 0x40;
+-  if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA)    temp |= 0x40;
++  if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
++     if(SiS_Pr->SiS_HDE != 640) {
++        if(SiS_Pr->SiS_VGAVDE != SiS_Pr->SiS_VDE)   temp |= 0x40;
++     }
++  } else if(SiS_Pr->SiS_VGAVDE != SiS_Pr->SiS_VDE)  temp |= 0x40;
++  if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA)           temp |= 0x40;
+   if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
+-      if(HwDeviceExtension->jChipType >= SIS_315H) {
+-         if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) {
+-            temp |= 0x80;
+-         }
+-      } else {
+-	 if( (HwDeviceExtension->jChipType == SIS_630) ||
+-	     (HwDeviceExtension->jChipType == SIS_730) ) {
+-	    if(HwDeviceExtension->jChipRevision >= 0x30) {
+-	       temp |= 0x80;
+-	    }
+-	 }
+-      }
++     if(HwDeviceExtension->jChipType >= SIS_315H) {
++        if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) {
++           temp |= 0x80;
++        }
++     } else {
++	if( (HwDeviceExtension->jChipType == SIS_630) ||
++	    (HwDeviceExtension->jChipType == SIS_730) ) {
++	   if(HwDeviceExtension->jChipRevision >= 0x30) {
++	      temp |= 0x80;
++	   }
++	}
++     }
+   }
+-  SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x1A,0x87,temp);  /* Part1_1Ah; TW: Panel Link Control Signal (7:3); Vertical Retrace Start (2:0) */
++  SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x1A,0x87,temp);  /* Part1_1Ah; Panel Link Control Signal (7:3); Vertical Retrace Start (2:0) */
+ 
+   if (HwDeviceExtension->jChipType < SIS_315H) {
+ 
+@@ -1396,19 +1438,19 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+ 	}
+ 
+   	temp = (USHORT)(tempebx & 0x00FF);
+-  	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1E,temp);      /* Part1_1Eh; TW: Panel Link Vertical Scaling Factor */
++  	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1E,temp);      /* Part1_1Eh; Panel Link Vertical Scaling Factor */
+ 
+ #endif /* SIS300 */
+ 
+   } else {
+ 
+-#ifdef SIS315H  /* 310/325 series */
++#ifdef SIS315H  /* 315 series */
+ 
+-#ifdef NEWCH701x
+-        SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x03);
+-#else
+-	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1E,0x23);
+-#endif	
++        if(HwDeviceExtension->jChipType == SIS_740) {
++           SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x03);
++        } else {
++	   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1E,0x23);
++	}
+ 
+ 	tempeax = SiS_Pr->SiS_VGAVDE << 18;
+     	temp = (USHORT)(tempeax % (ULONG)SiS_Pr->SiS_VDE);
+@@ -1417,12 +1459,13 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+     	tempebx = tempeax;                         /* BPLVCFACT  */
+         tempvcfact = tempeax;
+     	temp = (USHORT)(tempebx & 0x00FF);
+-    	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x37,temp);      /* Part1_37h; TW: Panel Link Vertical Scaling Factor */
++    	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x37,temp);      /* Part1_37h; Panel Link Vertical Scaling Factor */
+     	temp = (USHORT)((tempebx & 0x00FF00) >> 8);
+-    	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x36,temp);      /* Part1_36h; TW: Panel Link Vertical Scaling Factor */
++    	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x36,temp);      /* Part1_36h; Panel Link Vertical Scaling Factor */
+     	temp = (USHORT)((tempebx & 0x00030000) >> 16);
++	temp &= 0x03;
+     	if(SiS_Pr->SiS_VDE == SiS_Pr->SiS_VGAVDE) temp |= 0x04;
+-    	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x35,temp);      /* Part1_35h; TW: Panel Link Vertical Scaling Factor */
++    	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x35,temp);      /* Part1_35h; Panel Link Vertical Scaling Factor */
+ 
+ #endif /* SIS315H */
+ 
+@@ -1434,47 +1477,50 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+   push1 = temp;					   
+ 
+   if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-   	if(!SiS_Pr->SiS_IF_DEF_DSTN){
++   	if(!SiS_Pr->SiS_IF_DEF_FSTN && !SiS_Pr->SiS_IF_DEF_DSTN) {
+ 		if(HwDeviceExtension->jChipType < SIS_315H) {
+ 			if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+-      				if(resinfo == 15) tempcx++;
++      				if(resinfo == SIS_RI_1024x600) tempcx++;
+ 				if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+-					if(resinfo == 7) tempcx++;
++					if(resinfo == SIS_RI_800x600) tempcx++;
+ 		    		}
+ 			} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+-      				if(resinfo == 7) tempcx++;
+-				if(resinfo == 8) tempcx++; /* TW: Doesnt make sense anyway... */
+-			} else  if(resinfo == 8) tempcx++;
++      				if(resinfo == SIS_RI_800x600)  tempcx++;
++				if(resinfo == SIS_RI_1024x768) tempcx++; /* Doesnt make sense anyway... */
++			} else  if(resinfo == SIS_RI_1024x768) tempcx++;
+ 		} else {
+ 			if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+-      				if(resinfo == 7) tempcx++;
++      				if(resinfo == SIS_RI_800x600)  tempcx++;
+ 			}
+ 		}
+ 	}
+   }
+ 
+   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+-     tempcx = SiS_Pr->SiS_VGAVDE;
+-     tempbx = SiS_Pr->SiS_VGAVDE - 1;
++     if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
++        tempcx = SiS_Pr->SiS_VGAVDE;
++        tempbx = SiS_Pr->SiS_VGAVDE - 1;
++     }
+   }
+ 
+   temp = ((tempbx & 0x0700) >> 8) << 3;
+   temp |= ((tempcx & 0x0700) >> 8);
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1D,temp);     	/* Part1_1Dh; TW: Vertical Display Overflow; Control Signal */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1D,temp);     	/* Part1_1Dh; Vertical Display Overflow; Control Signal */
+ 
+   temp = tempbx & 0x00FF;
+-  if(SiS_Pr->SiS_IF_DEF_FSTN) temp++;
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1C,temp);      	/* Part1_1Ch; TW: Panel Link Vertical Display Enable End  */
++  /* if(SiS_Pr->SiS_IF_DEF_FSTN) temp++;  */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1C,temp);      	/* Part1_1Ch; Panel Link Vertical Display Enable End  */
+ 
+   temp = tempcx & 0x00FF;
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1B,temp);      	/* Part1_1Bh; TW: Panel Link Vertical Display Enable Start  */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1B,temp);      	/* Part1_1Bh; Panel Link Vertical Display Enable Start  */
+ 
+   /* 3. Additional horizontal setup (scaling, etc) */
+ 
+   tempecx = SiS_Pr->SiS_VGAHDE;
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+-     if(modeflag & HalfDCLK)
+-        tempecx >>= 1;
++     if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
++        if(modeflag & HalfDCLK) tempecx >>= 1;
++     }
+   }
+   tempebx = SiS_Pr->SiS_HDE;
+   if(tempecx == tempebx) tempeax = 0xFFFF;
+@@ -1484,134 +1530,162 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+      temp = (USHORT)(tempeax % tempebx);
+      tempeax = tempeax / tempebx;
+      if(HwDeviceExtension->jChipType >= SIS_315H) {
+-         if(temp) tempeax++;
++        if(temp) tempeax++;
+      }
+   }
+   tempecx = tempeax;
+ 
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      tempeax = SiS_Pr->SiS_VGAHDE;
+-      if(modeflag & HalfDCLK) tempeax >>= 1;
+-      tempeax <<= 16;
+-      tempeax = (tempeax / tempecx) - 1;
++     tempeax = SiS_Pr->SiS_VGAHDE;
++     if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
++        if(modeflag & HalfDCLK) tempeax >>= 1;
++     }
++     tempeax <<= 16;
++     tempeax = (tempeax / tempecx) - 1;
+   } else {
+-      tempeax = ((SiS_Pr->SiS_VGAHT << 16) / tempecx) - 1;
++     tempeax = ((SiS_Pr->SiS_VGAHT << 16) / tempecx) - 1;
+   }
+   tempecx <<= 16;
+   tempecx |= (tempeax & 0xFFFF);
+   temp = (USHORT)(tempecx & 0x00FF);
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1F,temp);  	 /* Part1_1Fh; TW: Panel Link DDA Operational Number in each horiz. line */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1F,temp);  	 /* Part1_1Fh; Panel Link DDA Operational Number in each horiz. line */
+ 
+   tempbx = SiS_Pr->SiS_VDE;
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      tempeax = (SiS_Pr->SiS_VGAVDE << 18) / tempvcfact;
+-      tempbx = (USHORT)(tempeax & 0x0FFFF);
++     tempeax = (SiS_Pr->SiS_VGAVDE << 18) / tempvcfact;
++     tempbx = (USHORT)(tempeax & 0x0FFFF);
+   } else {
+-      tempax = SiS_Pr->SiS_VGAVDE << 6;
+-      tempbx = push1;
+-      tempbx &= 0x3f;
+-      if(tempbx == 0) tempbx = 64;
+-      tempax = tempax / tempbx;
+-      tempbx = tempax;
++     tempeax = SiS_Pr->SiS_VGAVDE << 6;
++     tempbx = push1 & 0x3f;
++     if(tempbx == 0) tempbx = 64;
++     tempeax /= tempbx;
++     tempbx = (USHORT)(tempeax & 0x0FFFF);
+   }
+   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) tempbx--;
+-  if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA)                 tempbx = 1;
++  if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA) {
++     if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) tempbx = 1;
++     else if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480)  tempbx = 1;
++  }
+ 
+   temp = ((tempbx & 0xFF00) >> 8) << 3;
+   temp |= (USHORT)((tempecx & 0x0700) >> 8);
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x20,temp);  	/* Part1_20h; TW: Overflow register */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x20,temp);  	/* Part1_20h; Overflow register */
+ 
+   temp = tempbx & 0x00FF;
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x21,temp);  	/* Part1_21h; TW: Panel Link Vertical Accumulator Register */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x21,temp);  	/* Part1_21h; Panel Link Vertical Accumulator Register */
+ 
+   tempecx >>= 16;                               /* BPLHCFACT  */
+-  if(HwDeviceExtension->jChipType < SIS_315H) {
+-      if(modeflag & HalfDCLK) tempecx >>= 1;
++  if((HwDeviceExtension->jChipType < SIS_315H) || (SiS_Pr->SiS_IF_DEF_FSTN) || (SiS_Pr->SiS_IF_DEF_DSTN)) {
++     if(modeflag & HalfDCLK) tempecx >>= 1;
+   }
+   temp = (USHORT)((tempecx & 0xFF00) >> 8);
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x22,temp);     	/* Part1_22h; TW: Panel Link Horizontal Scaling Factor High */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x22,temp);     	/* Part1_22h; Panel Link Horizontal Scaling Factor High */
+ 
+   temp = (USHORT)(tempecx & 0x00FF);
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x23,temp);         /* Part1_22h; TW: Panel Link Horizontal Scaling Factor Low */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x23,temp);         /* Part1_22h; Panel Link Horizontal Scaling Factor Low */
+ 
+   /* 630/301B and 630/LVDS do something for 640x480 panels here */
+ 
+ #ifdef SIS315H
+-  /* TW: DSTN/FSTN initialisation - hardcoded for 320x480 panel */
+-  if(SiS_Pr->SiS_IF_DEF_DSTN) {
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1E,0x01);
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x25,0x00);
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x26,0x00);
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x27,0x00);
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x28,0x87);
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x29,0x5A);
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2A,0x4B);
+-     	SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x44,~0x007,0x03);
+-     	tempbx = SiS_Pr->SiS_HDE + 64;                       	/*Blps = lcdhdee(lcdhdes+HDE) + 64*/
+-     	temp = tempbx & 0x00FF;
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x38,temp);
+-     	temp=((tempbx & 0xFF00) >> 8) << 3;
+-     	SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x35,~0x078,temp);
+-     	tempbx += 32;		                     		/*Blpe=lBlps+32*/
+-     	temp = tempbx & 0x00FF;
+-     	if(SiS_Pr->SiS_IF_DEF_FSTN)  temp=0;
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x39,temp);
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3A,0x00);        	/*Bflml=0*/
+-     	SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x007,0x00);
+-     	tempbx = SiS_Pr->SiS_VDE / 2;
+-     	temp = tempbx & 0x00FF;
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3B,temp);
+-     	temp = ((tempbx & 0xFF00) >> 8) << 3;
+-     	SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x038,temp);
+-     	tempeax = SiS_Pr->SiS_HDE << 2;                       	/* BDxFIFOSTOP = (HDE*4)/128 */
+-     	tempebx = 128;
+-     	temp = (USHORT)(tempeax % tempebx);
+-     	tempeax = tempeax / tempebx;
+-     	if(temp != 0)  tempeax++;
+-     	temp = (USHORT)(tempeax & 0x003F);
+-     	SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x45,~0x0FF,temp);
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3F,0x00);         	/* BDxWadrst0 */
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3E,0x00);
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3D,0x10);
+-     	SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x040,0x00);
+-     	tempax = SiS_Pr->SiS_HDE >> 4;                        	/* BDxWadroff = HDE*4/8/8 */
+-     	pushcx = tempax;
+-     	temp = tempax & 0x00FF;
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x43,temp);
+-     	temp = ((tempax & 0xFF00) >> 8) << 3;
+-     	SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x44,~0x0F8,temp);
+-     	tempax = SiS_Pr->SiS_VDE;                             /*BDxWadrst1 = BDxWadrst0 + BDxWadroff * VDE */
+-     	tempeax = (tempax * pushcx);
+-     	tempebx = 0x00100000 + tempeax;
+-     	temp = (USHORT)tempebx & 0x000000FF;
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x42,temp);
+-     	temp = (USHORT)((tempebx & 0x0000FF00)>>8);
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x41,temp);
+-     	temp = (USHORT)((tempebx & 0x00FF0000)>>16);
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x40,temp);
+-     	temp = (USHORT)(((tempebx & 0x01000000)>>24) << 7);
+-     	SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x080,temp);
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2F,0x03);
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x03,0x50);
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x04,0x00);
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2F,0x01);
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x13,0x00);
+-     	SiS_SetReg1(SiS_Pr->SiS_P3c4,0x05,0x86);        /* Unlock */
+-     	SiS_SetReg1(SiS_Pr->SiS_P3c4,0x1e,0x62);
+-     	if(SiS_Pr->SiS_IF_DEF_FSTN){
+-         	SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2b,0x1b);
+-         	SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2c,0xe3);
+-         	SiS_SetReg1(SiS_Pr->SiS_P3c4,0x1e,0x62);
+-         	SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2e,0x04);
+-         	SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2f,0x42);
+-         	SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,0x01);
+-         	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2b,0x02);
+-         	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2c,0x00);
+-         	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2d,0x00);
+-     	}
+-     	SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0f,0x30);
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1e,0x7d);
+-     	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2e,0xe0);
++  if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x25,0x00);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x26,0x00);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x27,0x00);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x28,0x87);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x29,0x5A);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2A,0x4B);
++     SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x44,~0x007,0x03);
++     tempax = SiS_Pr->SiS_HDE;                       		/* Blps = lcdhdee(lcdhdes+HDE) + 64 */
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
++        SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempax >>= 1;
++     tempax += 64;
++     temp = tempax & 0x00FF;
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x38,temp);
++     temp = ((tempax & 0xFF00) >> 8) << 3;
++     SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x35,~0x078,temp);
++     tempax += 32;		                     		/* Blpe=lBlps+32 */
++     temp = tempax & 0x00FF;
++     if(SiS_Pr->SiS_IF_DEF_FSTN) temp = 0;
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x39,temp);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3A,0x00);        	/* Bflml=0 */
++     SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x007,0x00);
++
++     tempax = SiS_Pr->SiS_VDE;
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
++        SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempax >>= 1;
++     tempax >>= 1;
++     temp = tempax & 0x00FF;
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3B,temp);
++     temp = ((tempax & 0xFF00) >> 8) << 3;
++     SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x038,temp);
++
++     tempeax = SiS_Pr->SiS_HDE;
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
++        SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempeax >>= 1;
++     tempeax <<= 2;                       			/* BDxFIFOSTOP = (HDE*4)/128 */
++     tempebx = 128;
++     temp = (USHORT)(tempeax % tempebx);
++     tempeax = tempeax / tempebx;
++     if(temp) tempeax++;
++     temp = (USHORT)(tempeax & 0x003F);
++     SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x45,~0x0FF,temp);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3F,0x00);         	/* BDxWadrst0 */
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3E,0x00);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3D,0x10);
++     SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x040,0x00);
++
++     tempax = SiS_Pr->SiS_HDE;
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
++        SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempax >>= 1;
++     tempax >>= 4;                        			/* BDxWadroff = HDE*4/8/8 */
++     pushcx = tempax;
++     temp = tempax & 0x00FF;
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x43,temp);
++     temp = ((tempax & 0xFF00) >> 8) << 3;
++     SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x44,~0x0F8,temp);
++
++     tempax = SiS_Pr->SiS_VDE;                             	/* BDxWadrst1 = BDxWadrst0 + BDxWadroff * VDE */
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
++        SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempax >>= 1;
++     tempeax = (tempax * pushcx);
++     tempebx = 0x00100000 + tempeax;
++     temp = (USHORT)tempebx & 0x000000FF;
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x42,temp);
++     temp = (USHORT)((tempebx & 0x0000FF00) >> 8);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x41,temp);
++     temp = (USHORT)((tempebx & 0x00FF0000) >> 16);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x40,temp);
++     temp = (USHORT)(((tempebx & 0x01000000) >> 24) << 7);
++     SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x080,temp);
++
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2F,0x03);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x03,0x50);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x04,0x00);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2F,0x01);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x19,0x38);
++
++     if(SiS_Pr->SiS_IF_DEF_FSTN) {
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2b,0x02);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2c,0x00);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2d,0x00);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x35,0x0c);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x36,0x00);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x37,0x00);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x38,0x80);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x39,0xA0);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3a,0x00);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3b,0xf0);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3c,0x00);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3d,0x10);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3e,0x00);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3f,0x00);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x40,0x10);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x41,0x25);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x42,0x80);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x43,0x14);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x44,0x03);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x45,0x0a);
++     }
+   }
+ #endif  /* SIS315H */
+ 
+@@ -1629,7 +1703,7 @@ SiS_CRT2AutoThreshold(SiS_Private *SiS_P
+ 
+ 
+ #ifdef SIS315H
+-/* TW: For LVDS / 302B/30xLV - LCDA (this must only be called on 310/325 series!) */
++/* For LVDS / 302B/30xLV - LCDA (this must only be called on 315 series!) */
+ void
+ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, USHORT  BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                    PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex)
+@@ -1638,6 +1712,10 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+   USHORT push1,push2,tempax,tempbx,tempcx,temp;
+   ULONG tempeax=0,tempebx,tempecx,tempvcfact;
+ 
++  /* This is not supported with LCDA */
++  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) return;
++  if(SiS_Pr->UseCustomMode) return;
++
+   if(IS_SIS330) {
+      SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x10);			/* Xabre 1.01.03 */
+   } else if(IS_SIS740) {
+@@ -1645,7 +1723,7 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+         SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,0xfb,0x04);      	/* 740/LVDS */
+ 	SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x03);
+      } else {
+-        SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x10);			/* 740/301LV 1.10.1i */
++        SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x10);			/* 740/301LV, 301BDH */
+      }
+   } else {
+      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {					/* 650/LVDS */
+@@ -1669,10 +1747,7 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+   tempcx = SiS_Pr->SiS_HT;
+ 
+   if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+-        if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)       tempbx = 1024;
+-	else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempbx = 1400;
+-	else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempbx = 1600;
+-	else 							      tempbx = 1280;
++        tempbx = SiS_Pr->PanelXRes;
+   }
+   tempcx -= tempbx;                        	            	/* HT-HDE  */
+   push1 = tempax;
+@@ -1684,7 +1759,7 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+ 
+   tempcx >>= 2;
+ 
+-  /* TW: 650/30xLV 1.10.6s, 740/LVDS */
++  /* 650/30xLV 1.10.6s, 740/LVDS */
+   if( ((SiS_Pr->SiS_IF_DEF_LVDS == 0) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) ||
+       ((SiS_Pr->SiS_IF_DEF_LVDS == 1) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) ) {
+      if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+@@ -1748,13 +1823,10 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+   tempbx = SiS_Pr->SiS_LCDVDES;                                	/* VGAVDES  */
+   push1 = tempbx;                                      		
+   if(SiS_Pr->SiS_IF_DEF_TRUMPION == 0) {
+-    if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)        tempax = 768;
+-    else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768)   tempax = 768;
+-    else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024)  tempax = 1024;
+-    else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050)  tempax = 1050;
+-    else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)  tempax = 1200;
+-    else                                                           tempax = 960;
+-  } else tempax = SiS_Pr->SiS_VGAVDE;  /* Trumpion */
++     tempax = SiS_Pr->PanelYRes;
++  } else {
++     tempax = SiS_Pr->SiS_VGAVDE;
++  }
+ 
+   tempbx += tempax;
+   tempax = SiS_Pr->SiS_VT;                                    	/* VT  */
+@@ -1764,7 +1836,7 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+  
+   tempcx >>= 2;	
+ 
+-  /* TW: 650/30xLV 1.10.6s, 740/LVDS */
++  /* 650/30xLV 1.10.6s, 740/LVDS */
+   if( ((SiS_Pr->SiS_IF_DEF_LVDS == 0) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) ||
+       ((SiS_Pr->SiS_IF_DEF_LVDS == 1) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) ) {
+      if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+@@ -1806,7 +1878,7 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+   if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+      SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0xF0,temp);
+   } else {
+-     /* TW: 650/30xLV 1.10.6s, Xabre */
++     /* 650/30xLV 1.10.6s, Xabre */
+      temp |= 0xC0;
+      SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0xF0,temp);             /* Part1_19h  */
+   }
+@@ -1823,7 +1895,7 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+      }
+   } else {
+      if(IS_SIS650) {
+-        /* TW: 650/30xLV 1.10.6s */
++        /* 650/30xLV 1.10.6s */
+         if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
+            if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) temp |= 0x80;
+         }
+@@ -1839,7 +1911,7 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+ 
+   if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+-      if(resinfo == 7) tempcx++;
++      if(resinfo == SIS_RI_800x600) tempcx++;
+     }
+   }
+   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+@@ -1925,15 +1997,15 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x23,temp);
+ 
+ #if 0
+-  /* TW: Missing code (calles int 2f) (650/302LV 1.10.6s; 1.10.7w doesn't do this) */
++  /* Missing code (calles int 2f) (650/302LV 1.10.6s; 1.10.7w doesn't do this) */
+   if(xxx()) {
+       SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0e,0xda);
+   }
+ #endif
+ 
+-  /* TW: Only for LVDS and 301LV/302LV */
++  /* Only for LVDS and 301LV/302LV */
+   if((SiS_Pr->SiS_IF_DEF_LVDS == 1) || (SiS_Pr->SiS_VBInfo & VB_SIS301LV302LV)){
+-  	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1e,0x20);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1e,0x20);
+   }
+ 
+   return;
+@@ -1951,10 +2023,10 @@ void SiS_SetCRT2Offset(SiS_Private *SiS_
+ 
+   offset = SiS_GetOffset(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+                          HwDeviceExtension);
+-#if 0
+-  if(SiS_Pr->LCDResInfo == 13) offset >>= 1;
+-  if(SiS_Pr->LCDResInfo == 12) offset >>= 1;
+-#endif			 
++
++  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
++     SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) offset >>= 1;
++
+   temp = (UCHAR)(offset & 0xFF);
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,temp);
+   temp = (UCHAR)((offset & 0xFF00) >> 8);
+@@ -1976,13 +2048,7 @@ SiS_GetOffset(SiS_Private *SiS_Pr, UCHAR
+   } else {
+      infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
+      modeinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeInfo;
+-  
+-     if(HwDeviceExtension->jChipType < SIS_315H ) {
+-    	index = (modeinfo >> 4) & 0xFF;
+-     } else {
+-    	index = (modeinfo >> 8) & 0xFF;
+-     }
+-
++     index = (modeinfo >> 8) & 0xFF;
+      temp = SiS_Pr->SiS_ScreenOffset[index];
+   }
+   
+@@ -1992,9 +2058,8 @@ SiS_GetOffset(SiS_Private *SiS_Pr, UCHAR
+ 
+   temp *= colordepth;
+ 
+-  /* TW: For 1400x1050 and 856x480 */
+-  if( ( ((ModeNo >= 0x26) && (ModeNo <= 0x28)) || 
+-        ModeNo == 0x3f || 
++  if( ( ((ModeNo >= 0x26) && (ModeNo <= 0x28)) ||
++        ModeNo == 0x3f ||
+ 	ModeNo == 0x42 || 
+ 	ModeNo == 0x45 ) ||
+       (SiS_Pr->UseCustomMode && (SiS_Pr->CHDisplay % 16)) ) {
+@@ -2012,7 +2077,8 @@ SiS_GetColorDepth(SiS_Private *SiS_Pr, U
+   SHORT  index;
+   USHORT modeflag;
+ 
+-  if(SiS_Pr->UseCustomMode) {
++  /* Do NOT check UseCustomMode, will skrew up FIFO */
++  if(ModeNo == 0xfe) {
+      modeflag = SiS_Pr->CModeFlag;
+   } else {
+      if(ModeNo <= 0x13)
+@@ -2035,7 +2101,11 @@ SiS_SetCRT2Sync(SiS_Private *SiS_Pr, USH
+   flag = 0;
+   tempbl = 0xC0;
+ 
+-  infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
++  if(SiS_Pr->UseCustomMode) {
++     infoflag = SiS_Pr->CInfoFlag;
++  } else {
++     infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
++  }
+ 
+   if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {					/* LVDS */
+ 
+@@ -2044,12 +2114,19 @@ SiS_SetCRT2Sync(SiS_Private *SiS_Pr, USH
+     } else if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->SiS_LCDInfo & LCDSync)) {
+        tempah = SiS_Pr->SiS_LCDInfo;
+     } else tempah = infoflag >> 8;
+-    
++
+     tempah &= 0xC0;
+-    
++
+     tempah |= 0x20;
+     if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
+ 
++    if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
++       if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
++          (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
++	  tempah |= 0xc0;
++       }
++    }
++
+     if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+        if(HwDeviceExtension->jChipType >= SIS_315H) {
+           tempah >>= 3;
+@@ -2079,9 +2156,11 @@ SiS_SetCRT2Sync(SiS_Private *SiS_Pr, USH
+             tempah |= 0x20;
+             if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
+ 
++#if 0
+             if (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+-	       	/* TW: BIOS does something here @@@ */
++	       	/* BIOS does something here @@@ */
+             }
++#endif
+ 
+  	    tempah &= 0x3f;
+   	    tempah |= tempbl;
+@@ -2089,16 +2168,11 @@ SiS_SetCRT2Sync(SiS_Private *SiS_Pr, USH
+ 
+          } else {							/* 630 - 301 */
+ 
+-            if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-               tempah = SiS_Pr->SiS_LCDInfo;
+-	       if(SiS_Pr->SiS_LCDInfo & DontExpandLCDShift) { /* ! */
+-	          flag = 1;
+-	       }
+-            }
+-            if(flag != 1) tempah = infoflag >> 8;
++            tempah = infoflag >> 8;
+             tempah &= 0xC0;
+-            tempah |= 0x30;
+-            SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x3F,tempah);
++            tempah |= 0x20;
++	    if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
++            SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
+ 
+          }
+ 
+@@ -2106,9 +2180,9 @@ SiS_SetCRT2Sync(SiS_Private *SiS_Pr, USH
+ 
+       } else {
+ 
+-#ifdef SIS315H  /* ----- 310/325 series ---- */
++#ifdef SIS315H  /* ------- 315 series ------ */
+ 
+-         if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {	  		/* 310/325 - 30xLV */
++         if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {	  		/* 315 - 30xLV */
+ 
+             tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37);
+             tempah &= 0xC0;
+@@ -2116,24 +2190,33 @@ SiS_SetCRT2Sync(SiS_Private *SiS_Pr, USH
+             if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
+             SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
+ 
+-         } else {							/* 310/325 - 301, 301B */
++         } else {							/* 315 - 301, 301B */
+ 
+             tempah = infoflag >> 8;
+             tempah &= 0xC0;
+-	    if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-	       if(SiS_Pr->SiS_LCDInfo & LCDSync) {
+-	          tempah = SiS_Pr->SiS_LCDInfo;
+-	          tempah &= 0xC0;
++	    if(!SiS_Pr->UseCustomMode) {
++	       if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
++	          if(SiS_Pr->SiS_LCDInfo & LCDSync) {
++	             tempah = SiS_Pr->SiS_LCDInfo;
++	             tempah &= 0xC0;
++	          }
+ 	       }
+ 	    }
+ 	    
+             tempah |= 0x20;
+             if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
++	    
+ #if 0
+             if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+-		/* TW: BIOS does something here @@@ */
++		/* BIOS does something here @@@ */
+             }
+-#endif	    
++#endif
++
++	    if(SiS_Pr->SiS_VBType & VB_NoLCD) {			/* TEST, imitate BIOS bug */
++	       if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++	          tempah |= 0xc0;
++	       }
++	    }
+             SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
+ 
+          } 
+@@ -2143,7 +2226,7 @@ SiS_SetCRT2Sync(SiS_Private *SiS_Pr, USH
+    }
+ }
+ 
+-/* TW: Set CRT2 FIFO on 300/630/730 */
++/* Set CRT2 FIFO on 300/630/730 */
+ #ifdef SIS300
+ void
+ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,
+@@ -2197,7 +2280,7 @@ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,
+ 
+   if(!SiS_Pr->CRT1UsesCustomMode) {
+   
+-     CRT1ModeNo = SiS_Pr->SiS_CRT1Mode;                                 /* get CRT1 ModeNo */
++     CRT1ModeNo = SiS_Pr->SiS_CRT1Mode;                                 	/* get CRT1 ModeNo */
+      SiS_SearchModeID(SiS_Pr,ROMAddr,&CRT1ModeNo,&modeidindex);
+      SiS_Pr->SiS_SetFlag &= (~ProgrammingCRT2);
+      SiS_Pr->SiS_SelectCRT2Rate = 0;
+@@ -2205,20 +2288,32 @@ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,
+ 						modeidindex,HwDeviceExtension);
+ 
+      if(CRT1ModeNo >= 0x13) {
+-       index = SiS_Pr->SiS_RefIndex[refreshratetableindex].Ext_CRTVCLK;
+-       index &= 0x3F;
+-       VCLK = SiS_Pr->SiS_VCLKData[index].CLOCK;			/* Get VCLK */
+-       data2 = SiS_Pr->SiS_ModeType - 2;
++        index = SiS_Pr->SiS_RefIndex[refreshratetableindex].Ext_CRTVCLK;
++        index &= 0x3F;
++        VCLK = SiS_Pr->SiS_VCLKData[index].CLOCK;				/* Get VCLK */
++
++	colorth = SiS_GetColorDepth(SiS_Pr,ROMAddr,CRT1ModeNo,modeidindex); 	/* Get colordepth */
++        colorth >>= 1;
++        if(!colorth) colorth++;
+      }
+-     
++
+   } else {
+   
+      CRT1ModeNo = 0xfe;
+-     VCLK = SiS_Pr->CSRClock;						/* Get VCLK */
+-     data2 = (SiS_Pr->CModeFlag & ModeInfoFlag) - 2;
+-  
+-  }			
+-     
++     VCLK = SiS_Pr->CSRClock_CRT1;						/* Get VCLK */
++     data2 = (SiS_Pr->CModeFlag_CRT1 & ModeInfoFlag) - 2;
++     switch(data2) {								/* Get color depth */
++        case 0 : colorth = 1; break;
++        case 1 : colorth = 1; break;
++        case 2 : colorth = 2; break;
++        case 3 : colorth = 2; break;
++        case 4 : colorth = 3; break;
++        case 5 : colorth = 4; break;
++        default: colorth = 2;
++     }
++
++  }
++
+   if(CRT1ModeNo >= 0x13) {
+     if(HwDeviceExtension->jChipType == SIS_300) {
+        index = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x3A);
+@@ -2227,22 +2322,8 @@ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,
+     }
+     index &= 0x07;
+     MCLK = SiS_Pr->SiS_MCLKData_0[index].CLOCK;				/* Get MCLK */
+-    
+-#ifdef TWDEBUG
+-    xf86DrvMsg(0, X_INFO, "FIFO2: CRT1Mode 0x%x VCLK %d MCLK %d modetype-2 = %d\n",
+-    	CRT1ModeNo, VCLK, MCLK, data2);
+-#endif  
+-  
+-    switch(data2) {							/* Get color depth */
+-      case 0 : 	colorth = 1; break;
+-      case 1 : 	colorth = 1; break;
+-      case 2 : 	colorth = 2; break;
+-      case 3 : 	colorth = 2; break;
+-      case 4 : 	colorth = 3; break;
+-      case 5 : 	colorth = 4; break;
+-      default:  colorth = 2; break;
+-    }
+-    data2 = (colorth * VCLK) / MCLK;  
++
++    data2 = (colorth * VCLK) / MCLK;
+ 
+     temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14);
+     temp = ((temp & 0x00FF) >> 6) << 1;
+@@ -2252,22 +2333,12 @@ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,
+ 
+     data2 = temp - data2;
+     
+-#ifdef TWDEBUG
+-    xf86DrvMsg(0, X_INFO, "FIFO2: data2 (step1) = %d\n",
+-    	data2);
+-#endif    
+-
+     if((28 * 16) % data2) {
+       	data2 = (28 * 16) / data2;
+       	data2++;
+     } else {
+       	data2 = (28 * 16) / data2;
+     }
+-    
+-#ifdef TWDEBUG
+-    xf86DrvMsg(0, X_INFO, "FIFO2: data2 (step2) = %d\n",
+-    	data2);
+-#endif
+ 
+     if(HwDeviceExtension->jChipType == SIS_300) {
+ 
+@@ -2313,10 +2384,6 @@ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,
+        temp &= 0x0F;   
+        tempal |= temp;
+ 
+-#ifdef TWDEBUG
+-       xf86DrvMsg(0, X_INFO, "FIFO2: Latencyfactorindex = 0x%x\n", tempal);
+-#endif
+-      
+        tempbx = tempal;   /* BIOS BUG (2.04.5d, 2.04.6a use ah here, which is unset!) */
+        tempbx = 0;        /* -- do it like the BIOS anyway... */
+        tempax = tempbx;
+@@ -2341,7 +2408,7 @@ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,
+        SiS_SetReg4(0xcf8,0x800000A0);
+        eax = SiS_GetReg3(0xcfc);
+ #else
+-       /* TW: We use pci functions X offers. We use tag 0, because
++       /* We use pci functions X offers. We use tag 0, because
+         * we want to read/write to the host bridge (which is always
+         * 00:00.0 on 630, 730 and 540), not the VGA device.
+         */
+@@ -2368,43 +2435,41 @@ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,
+        if(!(temp & 0x80)) data += 5;
+     }
+     
+-#ifdef TWDEBUG    
+-    xf86DrvMsg(0, X_INFO, "FIFO2: latencyfactor (CRT1) = %d\n", data);
+-#endif
+-
+     data += data2;				/* CRT1 Request Period */
+     
+-#ifdef TWDEBUG    
+-    xf86DrvMsg(0, X_INFO, "FIFO2: CRT1 request period = %d\n", data);
+-#endif
+-
+-    CRT2ModeNo = ModeNo;
+     SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
+     SiS_Pr->SiS_SelectCRT2Rate = SelectRate_backup;
+-    SiS_SearchModeID(SiS_Pr,ROMAddr,&CRT2ModeNo,&modeidindex);    
+ 
+-    refreshratetableindex = SiS_GetRatePtrCRT2(SiS_Pr,ROMAddr,CRT2ModeNo,
+-                                               modeidindex,HwDeviceExtension);
++    if(!SiS_Pr->UseCustomMode) {
++
++       CRT2ModeNo = ModeNo;
++       SiS_SearchModeID(SiS_Pr,ROMAddr,&CRT2ModeNo,&modeidindex);
++
++       refreshratetableindex = SiS_GetRatePtrCRT2(SiS_Pr,ROMAddr,CRT2ModeNo,
++                                                  modeidindex,HwDeviceExtension);
++
++       index = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,CRT2ModeNo,modeidindex,
++                               refreshratetableindex,HwDeviceExtension);
++       VCLK = SiS_Pr->SiS_VCLKData[index].CLOCK;                         	/* Get VCLK  */
++
++       if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) || (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
++          if((ROMAddr) && SiS_Pr->SiS_UseROM) {
++	     if(ROMAddr[0x220] & 0x01) {
++                VCLK = ROMAddr[0x229] | (ROMAddr[0x22a] << 8);
++	     }
++          }
++       }
++
++    } else {
++
++       CRT2ModeNo = 0xfe;
++       VCLK = SiS_Pr->CSRClock;							/* Get VCLK */
+ 
+-    index = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,CRT2ModeNo,modeidindex,
+-                            refreshratetableindex,HwDeviceExtension);
+-    VCLK = SiS_Pr->SiS_VCLKData[index].CLOCK;                         	/* Get VCLK  */
+-    
+-    data2 = SiS_Pr->SiS_ModeType - 2;
+-    switch(data2) {							/* Get color depth */
+-      case 0 : 	colorth = 1; break;
+-      case 1 : 	colorth = 1; break;
+-      case 2 : 	colorth = 2; break;
+-      case 3 : 	colorth = 2; break;
+-      case 4 : 	colorth = 3; break;
+-      case 5 : 	colorth = 4; break;
+-      default:  colorth = 2; break;
+     }
+-    
+-#ifdef TWDEBUG    
+-    xf86DrvMsg(0, X_INFO, "FIFO2: CRT2Mode 0x%x VCLK %d MCLK %d modetype-2 = %d, colorth %d\n",
+-    	CRT2ModeNo, VCLK, MCLK, data2, colorth);
+-#endif
++
++    colorth = SiS_GetColorDepth(SiS_Pr,ROMAddr,CRT2ModeNo,modeidindex);   	/* Get colordepth */
++    colorth >>= 1;
++    if(!colorth) colorth++;
+ 
+     data = data * VCLK * colorth;
+     if(data % (MCLK << 4)) {
+@@ -2414,10 +2479,6 @@ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,
+       	data = data / (MCLK << 4);
+     }
+     
+-#ifdef TWDEBUG    
+-    xf86DrvMsg(0, X_INFO, "FIFO2: data (unclipped) = 0x%x\n", data);
+-#endif    
+-    
+     if(data <= 6) data = 6;
+     if(data > 0x14) data = 0x14;
+ 
+@@ -2456,13 +2517,13 @@ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,
+ }
+ #endif
+ 
+-/* TW: Set FIFO on 310/325/330 series */
++/* Set FIFO on 315/330 series */
+ #ifdef SIS315H
+ void
+ SiS_SetCRT2FIFO_310(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,
+                     PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
+-
++#if 0   /* This code is obsolete */
+   UCHAR CombCode[]  = { 1, 1, 1, 4, 3, 1, 3, 4,
+                         4, 1, 4, 4, 5, 1, 5, 4};
+   UCHAR CRT2ThLow[] = { 39, 63, 55, 79, 78,102, 90,114,
+@@ -2474,11 +2535,13 @@ SiS_SetCRT2FIFO_310(SiS_Private *SiS_Pr,
+   USHORT ModeIdIndex;
+   USHORT RefreshRateTableIndex;
+   USHORT SelectRate_backup;
+-  
++
+   SelectRate_backup = SiS_Pr->SiS_SelectCRT2Rate;
+-  
++#endif
++
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x01,0x3B);
+ 
++#if 0
+   if(!SiS_Pr->CRT1UsesCustomMode) {
+   
+      CRT1ModeNo = SiS_Pr->SiS_CRT1Mode;                                 /* get CRT1 ModeNo */
+@@ -2489,28 +2552,27 @@ SiS_SetCRT2FIFO_310(SiS_Private *SiS_Pr,
+ 
+      /* Get REFIndex for crt1 refreshrate */
+      RefreshRateTableIndex = SiS_GetRatePtrCRT2(SiS_Pr,ROMAddr,CRT1ModeNo,
+-                                             ModeIdIndex,HwDeviceExtension);
++                                                ModeIdIndex,HwDeviceExtension);
++     index = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
++     tempax = SiS_Pr->SiS_VCLKData[index].CLOCK;			/* Get VCLK */
+ 
+-     index = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,CRT1ModeNo,ModeIdIndex,
+-                          RefreshRateTableIndex,HwDeviceExtension);
+-     tempax = SiS_Pr->SiS_VCLKData[index].CLOCK;                        /* Get VCLK */
+-     
+      tempbx = SiS_GetColorDepth(SiS_Pr,ROMAddr,CRT1ModeNo,ModeIdIndex); /* Get colordepth */
+      tempbx >>= 1;
+-     if(!tempbx) tempbx++; 
+-     
++     if(!tempbx) tempbx++;
++
+   } else {
+-  
+-     tempax = SiS_Pr->CSRClock;						/* Get VCLK */
+-     tempbx = (SiS_Pr->CModeFlag & ModeInfoFlag) - 2;
++
++     CRT1ModeNo = 0xfe;
++     tempax = SiS_Pr->CSRClock_CRT1;					/* Get VCLK */
++     tempbx = (SiS_Pr->CModeFlag_CRT1 & ModeInfoFlag) - 2;
+      switch(tempbx) {							/* Get color depth */
+-       case 0 : 	tempbx = 1; break;
+-       case 1 : 	tempbx = 1; break;
+-       case 2 : 	tempbx = 2; break;
+-       case 3 : 	tempbx = 2; break;
+-       case 4 : 	tempbx = 3; break;
+-       case 5 : 	tempbx = 4; break;
+-       default:  	tempbx = 2; break;
++       case 0 : tempbx = 1; break;
++       case 1 : tempbx = 1; break;
++       case 2 : tempbx = 2; break;
++       case 3 : tempbx = 2; break;
++       case 4 : tempbx = 3; break;
++       case 5 : tempbx = 4; break;
++       default: tempbx = 2;
+      }
+   
+   }
+@@ -2523,13 +2585,6 @@ SiS_SetCRT2FIFO_310(SiS_Private *SiS_Pr,
+ 
+   tempbx = tempax;
+ 
+-#if 0 /* TW: BIOS code is skrewed */
+-  if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14) & 0x02) {
+-   	tempax = 16;
+-  } else {
+-    	tempax = 8;
+-  }
+-#endif
+   tempax = 16;
+ 
+   tempax -= tempbx;
+@@ -2556,24 +2611,33 @@ SiS_SetCRT2FIFO_310(SiS_Private *SiS_Pr,
+ 
+   tempcx +=  temp3;                                      /* CRT1 Request Period */
+ 
+-  CRT2ModeNo = ModeNo;                                                 /* get CRT2 ModeNo */
+-  SiS_SearchModeID(SiS_Pr,ROMAddr,&CRT2ModeNo,&ModeIdIndex);           /* Get ModeID Table */
+-
+   SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
+   SiS_Pr->SiS_SelectCRT2Rate = SelectRate_backup;
+ 
+-  RefreshRateTableIndex = SiS_GetRatePtrCRT2(SiS_Pr,ROMAddr,CRT2ModeNo,
+-                                           ModeIdIndex,HwDeviceExtension);
++  if(!SiS_Pr->UseCustomMode) {
++
++     CRT2ModeNo = ModeNo;                                                 /* get CRT2 ModeNo */
++     SiS_SearchModeID(SiS_Pr,ROMAddr,&CRT2ModeNo,&ModeIdIndex);
++
++     RefreshRateTableIndex = SiS_GetRatePtrCRT2(SiS_Pr,ROMAddr,CRT2ModeNo,
++                                                ModeIdIndex,HwDeviceExtension);
++
++     index = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,CRT2ModeNo,ModeIdIndex,
++                             RefreshRateTableIndex,HwDeviceExtension);
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
++        tempax = SiS_Pr->SiS_VCLKData[index].CLOCK;                       /* Get VCLK  */
++     } else {
++        tempax = SiS_Pr->SiS_VBVCLKData[index].CLOCK;
++     }
+ 
+-  index = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,CRT2ModeNo,ModeIdIndex,
+-                          RefreshRateTableIndex,HwDeviceExtension);
+-  if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+-     tempax = SiS_Pr->SiS_VCLKData[index].CLOCK;                       /* Get VCLK  */
+   } else {
+-     tempax = SiS_Pr->SiS_VBVCLKData[index].CLOCK;                     /* Get VCLK  */
++
++     CRT2ModeNo = 0xfe;							  /* Get VCLK  */
++     tempax = SiS_Pr->CSRClock;
++
+   }
+ 
+-  tempbx = SiS_GetColorDepth(SiS_Pr,ROMAddr,CRT2ModeNo,ModeIdIndex);   /* Get colordepth */
++  tempbx = SiS_GetColorDepth(SiS_Pr,ROMAddr,CRT2ModeNo,ModeIdIndex);   	  /* Get colordepth */
+   tempbx >>= 1;
+   if(!tempbx) tempbx++;
+ 
+@@ -2590,12 +2654,16 @@ SiS_SetCRT2FIFO_310(SiS_Private *SiS_Pr,
+ 
+   if (tempax > 0x37)  tempax = 0x37;
+ 
+-  /* TW: 650/LVDS (1.10.07, 1.10.00), 650/301LV, 740, 330 overrule calculated value; 315 does not */
++  /* 650/LVDS, 650/301LV, 740, 330 overrule calculated value; 315 does not */
+   if(HwDeviceExtension->jChipType >= SIS_650) {
+   	tempax = 0x04;
+   }
+-  
+   SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x02,~0x3F,tempax);
++#else
++
++  SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x02,~0x3F,0x04);
++
++#endif
+ }
+ 
+ USHORT
+@@ -2611,9 +2679,10 @@ SiS_GetMCLK(SiS_Private *SiS_Pr, UCHAR *
+     return(SiS_Pr->SiS_MCLKData_0[index].CLOCK);
+   }
+ }
++
+ #endif
+ 
+-/* TW: Checked against 650/LVDS 1.10.07 BIOS */
++/* Checked against 650/LVDS 1.10.07 BIOS */
+ void
+ SiS_GetLVDSDesData(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                    USHORT RefreshRateTableIndex,
+@@ -2623,6 +2692,13 @@ SiS_GetLVDSDesData(SiS_Private *SiS_Pr, 
+   USHORT PanelIndex,ResIndex;
+   const  SiS_LVDSDesStruct *PanelDesPtr = NULL;
+ 
++  if((SiS_Pr->UseCustomMode) ||
++     (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom)) {
++     SiS_Pr->SiS_LCDHDES = 0;
++     SiS_Pr->SiS_LCDVDES = 0;
++     return;
++  }
++
+   if((SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) ) {
+ 
+ #ifdef SIS315H  
+@@ -2689,11 +2765,11 @@ SiS_GetLVDSDesData(SiS_Private *SiS_Pr, 
+      	case 52: PanelDesPtr = SiS_Pr->SiS_CHTVUPALDesData;    break;
+      	case 53: PanelDesPtr = SiS_Pr->SiS_CHTVOPALDesData;    break;
+ 	default:
+-		if(HwDeviceExtension->jChipType < SIS_315H)
+-		   PanelDesPtr = SiS_Pr->SiS_PanelType0e_1;
+-		else
+-		   PanelDesPtr = SiS_Pr->SiS_PanelType01_1;
+-		break;
++		 if(HwDeviceExtension->jChipType < SIS_315H)
++		    PanelDesPtr = SiS_Pr->SiS_PanelType0e_1;
++		 else
++		    PanelDesPtr = SiS_Pr->SiS_PanelType01_1;
++		 break;
+      }
+   }
+   SiS_Pr->SiS_LCDHDES = (PanelDesPtr+ResIndex)->LCDHDES;
+@@ -2710,7 +2786,7 @@ SiS_GetLVDSDesData(SiS_Private *SiS_Pr, 
+      } else {
+         if(!(SiS_Pr->SiS_SetFlag & SetDOSMode)) {
+            if( (HwDeviceExtension->jChipType < SIS_315H) || 
+-	       (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024) ) {  
++	       (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024) ) {
+               if(SiS_Pr->SiS_LCDResInfo >= SiS_Pr->SiS_Panel1024x768){
+                  if(ModeNo <= 0x13) {
+ 	            modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+@@ -2737,7 +2813,7 @@ SiS_GetLVDSDesData(SiS_Private *SiS_Pr, 
+         }
+      }
+   }
+-  return;
++
+ }
+ 
+ void
+@@ -2757,11 +2833,11 @@ SiS_GetLVDSDesPtr(SiS_Private *SiS_Pr, U
+ 
+   tempbx = 0;
+   if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+-     if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+         tempbx = 50;
+         if((SiS_Pr->SiS_VBInfo & SetPALTV) && (!SiS_Pr->SiS_CHPALM)) tempbx += 2;
+         if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
+-        /* TW: Nothing special needed for SOverscan    */
++        /* Nothing special needed for SOverscan    */
+         /*     PALM uses NTSC data, PALN uses PAL data */
+      }
+   }
+@@ -2773,7 +2849,7 @@ SiS_GetLVDSDesPtr(SiS_Private *SiS_Pr, U
+         if(modeflag & HalfDCLK) tempbx++;
+      }
+   }
+-  /* TW: 630/LVDS and 650/LVDS (1.10.07) BIOS */
++  /* 630/LVDS and 650/LVDS (1.10.07) BIOS */
+   if(SiS_Pr->SiS_SetFlag & SetDOSMode) {
+      if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480)  {
+         tempal = 0x07;
+@@ -2833,14 +2909,13 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+      }
+   }
+   
+-  /* TW: BIOS does not do this (neither 301 nor LVDS) */
++  /* BIOS does not do this (neither 301 nor LVDS) */
+   /*     (But it's harmless; see SetCRT2Offset) */
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x03,0x00);   /* fix write part1 index 0  BTDRAM bit Bug */
+ 
+-  /* TW: Removed 301B302B301LV302LV check here to match 650/LVDS BIOS */
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+ 
+-	/* TW:   1. for LVDS/302B/302LV **LCDA** */
++	/*   1. for LVDS/302B/302LV **LCDA** */
+ 
+       SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x00,0xAF,0x40); /* FUNCTION CONTROL */
+       SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2E,0xF7);
+@@ -2855,23 +2930,23 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+ 
+ #ifdef SIS300    /* ---- 300 series ---- */
+ 
+-      /* For 301BDH: */
++      /* For 301BDH: (with LCD via LVDS) */
+       if(SiS_Pr->SiS_VBType & VB_NoLCD) {
+-	  temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32);
+-	  temp &= 0xef;
+-	  temp |= 0x02;
+-	  if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) || (SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC)) {
+-	     temp |= 0x10;
+-	     temp &= 0xfd;
+-	  }
+-	  SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp);
++	 temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32);
++	 temp &= 0xef;
++	 temp |= 0x02;
++	 if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) || (SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC)) {
++	    temp |= 0x10;
++	    temp &= 0xfd;
++	 }
++	 SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp);
+       }
+ 
+       if(ModeNo > 0x13) {
+-        tempcl -= ModeVGA;
+-        if((tempcl > 0) || (tempcl == 0)) {      /* TW: tempcl is USHORT -> always true! */
+-           tempah = ((0x10 >> tempcl) | 0x80);
+-        }
++         tempcl -= ModeVGA;
++         if((tempcl > 0) || (tempcl == 0)) {      /* tempcl is USHORT -> always true! */
++            tempah = ((0x10 >> tempcl) | 0x80);
++         }
+       } else tempah = 0x80;
+ 
+       if(SiS_Pr->SiS_VBInfo & SetInSlaveMode)  tempah ^= 0xA0;
+@@ -2880,7 +2955,7 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+ 
+     } else {
+ 
+-#ifdef SIS315H    /* ---- 310/325/330 series ---- */
++#ifdef SIS315H    /* ------- 315/330 series ------ */
+ 
+       if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+          if(SiS_Pr->SiS_VBInfo & CRT2DisplayFlag) {
+@@ -2889,12 +2964,12 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+       }
+ 
+       if(ModeNo > 0x13) {
+-        tempcl -= ModeVGA;
+-        if((tempcl > 0) || (tempcl == 0)) {  /* TW: tempcl is USHORT -> always true! */
+-           tempah = (0x08 >> tempcl);
+-           if (tempah == 0) tempah = 1;
+-           tempah |= 0x40;
+-        }
++         tempcl -= ModeVGA;
++         if((tempcl > 0) || (tempcl == 0)) {  /* tempcl is USHORT -> always true! */
++            tempah = (0x08 >> tempcl);
++            if (tempah == 0) tempah = 1;
++            tempah |= 0x40;
++         }
+       } else tempah = 0x40;
+ 
+       if(SiS_Pr->SiS_VBInfo & SetInSlaveMode)  tempah ^= 0x50;
+@@ -2921,7 +2996,7 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+ 
+     if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ 
+-	/* TW:   2. for 301 (301B, 302B 301LV, 302LV non-LCDA) */
++	/*   2. for 301 (301B, 302B 301LV, 302LV non-LCDA) */
+ 
+     	tempah = 0x01;
+     	if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+@@ -2938,7 +3013,7 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+ 
+     	if(HwDeviceExtension->jChipType < SIS_315H) {
+ 
+-		/* --- 300 series --- */
++		/* ---- 300 series ---- */
+ 
+       		tempah = (tempah << 5) & 0xFF;
+       		SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x01,tempah);
+@@ -2946,7 +3021,7 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+ 
+     	} else {
+ 
+-		/* --- 310 series --- */
++		/* ---- 315 series ---- */
+ 
+       		SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2E,0xF8,tempah);
+ 
+@@ -2956,9 +3031,9 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+       		tempah |= 0x10;
+ 	}
+ 
+-	/* TW: 630/301 BIOS */
+ 	if((HwDeviceExtension->jChipType < SIS_315H) && (SiS_Pr->SiS_VBType & VB_SIS301)) {
+-		if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
++		if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
++		   (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960)) {
+ 			tempah |= 0x80;
+ 		}
+ 	} else {
+@@ -2996,28 +3071,31 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+       	      }
+ 	   }
+     	}
+-	/* TW: For 302LV dual-channel */
++
++	/* For 302LV dual-channel */
+ 	if(HwDeviceExtension->jChipType >= SIS_315H) {
+-	    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-	        if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04)
+-		    tempah |= 0x40;
+-	    }
++	   if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++	      if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04)
++	         tempah |= 0x40;
++	   }
+ 	}
+ 
+ 	if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
+-	   (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960)) {
+-		tempah |= 0x80;
++	   (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960)  ||
++	   ((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) &&
++	    (SiS_Pr->CP_MaxX >= 1280) && (SiS_Pr->CP_MaxY >= 960))) {
++	   tempah |= 0x80;
+ 	}
+ 
+     	SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0C,tempah);
+ 
+     } else {
+ 
+-    	/* TW: 3. for LVDS */
++    	/* 3. for LVDS */
+ 
+ 	if(HwDeviceExtension->jChipType >= SIS_315H) {
+ 
+-	   /* TW: Inserted this entire section (BIOS 650/LVDS); added ModeType check
++	   /* Inserted this entire section (BIOS 650/LVDS); added ModeType check
+ 	    *     (LVDS can only be slave in 8bpp modes)
+ 	    */
+ 	   tempah = 0x80;
+@@ -3043,7 +3121,7 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+ 
+ 	} else {
+ 
+-	   /* TW: (added ModeType check) */
++	   /* (added ModeType check) */
+ 	   tempah = 0;
+ 	   if( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) && (SiS_Pr->SiS_ModeType > ModeVGA) ) {
+                	  tempah |= 0x02;
+@@ -3060,50 +3138,69 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+ 
+   }
+ 
+-  /* TW: Inserted the entire following section */
++  /* Inserted the entire following section */
+ 
+   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ 
+       if(HwDeviceExtension->jChipType >= SIS_315H) {
+ 
+ #ifdef SIS315H
++
++         unsigned char bridgerev = SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x01);;
++
++	 /* The following is nearly unpreditable and varies from machine
++	  * to machine. Especially the 301DH seems to be a real trouble
++	  * maker. Some BIOSes simply set the registers (like in the
++	  * NoLCD-if-statements here), some set them according to the
++	  * LCDA stuff. It is very likely that some machines are not
++	  * treated correctly in the following, very case-orientated
++	  * code. What do I do then...?
++	  */
++
++	 /* 740 variants match for 30xB, 301B-DH, 30xLV */
++
+          if(!(IS_SIS740)) {
+             tempah = 0x04;						   /* For all bridges */
+             tempbl = 0xfb;
+             if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+                tempah = 0x00;
+-	       if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr))
++	       if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr)) {
+ 	          tempbl = 0xff;
++	       }
+             }
+             SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,tempbl,tempah);   
+ 	 }
+-	 
+-	 if(IS_SIS740) {						
++
++	 /* The following two are responsible for eventually wrong colors
++	  * in TV output. The DH (VB_NoLCD) conditions are unknown; the
++	  * b0 was found in some 651 machine (Pim); the b1 version in a
++	  * 650 box (Jake). What is the criteria?
++	  */
++
++	 if(IS_SIS740) {
+ 	    tempah = 0x30;
+ 	    tempbl = 0xcf;
+ 	    if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
+ 	       tempah = 0x00;
+ 	    }
+-	    SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,tempbl,tempah);    
++	    SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,tempbl,tempah);
++	 } else if(SiS_Pr->SiS_VBType & VB_SIS301) {
++	    /* Fixes "TV-blue-bug" on 315+301 */
++	    SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2c,0xCF);          /* For 301   */
++	 } else if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
++	    SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,0xCF,0x30);   /* For 30xLV */
++	 } else if((SiS_Pr->SiS_VBType & VB_NoLCD) && (bridgerev == 0xb0)) {
++	    SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,0xCF,0x30);   /* For 30xB-DH rev b0 (or "DH on 651"?) */
+ 	 } else {
+-	    /* TW: This in order to fix "TV-blue-bug" on 315+301 */
+-            if(SiS_Pr->SiS_VBType & VB_SIS301) {
+-	       SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2c,0xCF);             /* For 301   */
+-	    } else {
+-	       if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+-	          SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,0xCF,0x30);   /* For 30xLV */
+-	       } else {
+-	          tempah = 0x30;					   /* For 301B  */
+-	          tempbl = 0xcf;
+-	          if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+-	             tempah = 0x00;
+-		     if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr)) {
+-		        tempbl = 0xff;
+-		     }
+-	          }
+-	          SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,tempbl,tempah);    
++	    tempah = 0x30;					     /* For 30xB (and 301BDH rev b1) */
++	    tempbl = 0xcf;
++	    if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
++	       tempah = 0x00;
++	       if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr)) {
++		  tempbl = 0xff;
+ 	       }
+ 	    }
++	    SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,tempbl,tempah);
+ 	 }
+ 
+ 	 if(IS_SIS740) {
+@@ -3111,25 +3208,25 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+   	    tempbl = 0x3f;
+ 	    if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
+ 	       tempah = 0x00;
+-	    } 
+-	    SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,tempbl,tempah);     
++	    }
++	    SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,tempbl,tempah);
++	 } else if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
++	    SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,0x3f,0xc0);	/* For 30xLV */
++	 } else if((SiS_Pr->SiS_VBType & VB_NoLCD) && (bridgerev == 0xb0)) {
++	    SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,0x3f,0xc0);	/* For 30xB-DH rev b0 (or "DH on 651"? */
+ 	 } else {
+-	    if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {			/* For 30xLV */
+-	       SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,0x3f,0xc0);
+-	    } else {							/* For 301, 301B */ 
+-	        tempah = 0xc0;
+-	        tempbl = 0x3f;
+-	        if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+-	           tempah = 0x00;
+-		   if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr)) {
+-		      tempbl = 0xff;
+-		   }
+-	        }
+-	        SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,tempbl,tempah);     
++	    tempah = 0xc0;						/* For 301, 301B (and 301BDH rev b1) */
++	    tempbl = 0x3f;
++	    if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
++	       tempah = 0x00;
++	       if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr)) {
++		  tempbl = 0xff;
++	       }
+ 	    }
++	    SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,tempbl,tempah);
+ 	 }
+ 
+-	 if(IS_SIS740) {						
++	 if(IS_SIS740) {
+ 	    tempah = 0x80;
+ 	    tempbl = 0x7f;
+ 	    if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
+@@ -3141,8 +3238,9 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+             tempbl = 0x7f;
+             if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+                tempbl = 0xff;
+-	       if(!(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr)))
++	       if(!(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr))) {
+ 	          tempah |= 0x80;
++	       }
+             }
+             SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x23,tempbl,tempah);
+ 	 }
+@@ -3174,16 +3272,32 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+ 	    tempbl = 0xfb;
+             if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+                tempah = 0x00;
+-	       if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr))
++	       if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr)) {
+ 	          tempbl = 0xff;
++	       }
+             }
+ 	    SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,tempbl,tempah);
+ 
+-	    if(SiS_Pr->SiS_VBInfo & DisableCRT2Display)
++	    if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
+ 	       SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,0xfb,0x00);
++	    }
+ 
+ 	    SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,0xcf,0x30);
+ 
++	 } else if(HwDeviceExtension->jChipType == SIS_550) {
++
++#if 0
++	    tempah = 0x00;
++	    tempbl = 0xfb;
++	    if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
++	       tempah = 0x00;
++	       tempbl = 0xfb;
++	    }
++	    SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,tempbl,tempah);
++#endif
++	    SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xfb);
++
++	    SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,0xcf,0x30);
+ 	 }
+ 
+       }
+@@ -3209,10 +3323,9 @@ SiS_GetCRT2Data(SiS_Private *SiS_Pr, UCH
+ 	                      HwDeviceExtension);
+         } else {
+ 
+-	   if( (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) &&
+-	       (SiS_Pr->SiS_VBType & VB_NoLCD) ) {
+-	       
+-	      /* TW: Need LVDS Data for LCD on 301BDH */
++	   if( (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->SiS_VBType & VB_NoLCD) ) {
++
++	      /* Need LVDS Data for LCD on 301B-DH */
+ 	      SiS_GetCRT2DataLVDS(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ 	                          HwDeviceExtension);
+ 				  
+@@ -3282,18 +3395,16 @@ SiS_GetCRT2DataLVDS(SiS_Private *SiS_Pr,
+ 
+    } else {
+ 
+-      /* TW: 301BDH needs LVDS Data */
+-      if( (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) &&
+-          (SiS_Pr->SiS_VBType & VB_NoLCD) ) {
++      /* 301BDH needs LVDS Data */
++      if( (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->SiS_VBType & VB_NoLCD) ) {
+ 	      SiS_Pr->SiS_IF_DEF_LVDS = 1;
+       }
+ 
+       SiS_GetCRT2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+                      &CRT2Index,&ResIndex,HwDeviceExtension);
+ 
+-      /* TW: 301BDH needs LVDS Data */
+-      if( (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) &&
+-          (SiS_Pr->SiS_VBType & VB_NoLCD) ) {
++      /* 301BDH needs LVDS Data */
++      if( (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->SiS_VBType & VB_NoLCD) ) {
+               SiS_Pr->SiS_IF_DEF_LVDS = 0;
+       }
+ 
+@@ -3321,11 +3432,16 @@ SiS_GetCRT2DataLVDS(SiS_Private *SiS_Pr,
+ 	case 20:  LVDSData = SiS_Pr->SiS_LVDS1280x768Data_2;   break;
+ 	case 21:  LVDSData = SiS_Pr->SiS_LVDS1600x1200Data_1;  break;
+ 	case 22:  LVDSData = SiS_Pr->SiS_LVDS1600x1200Data_2;  break;
++	case 30:  LVDSData = SiS_Pr->SiS_LVDS640x480Data_2;    break;
++	case 80:  LVDSData = SiS_Pr->SiS_LVDSBARCO1366Data_1;  break;
++	case 81:  LVDSData = SiS_Pr->SiS_LVDSBARCO1366Data_2;  break;
++	case 82:  LVDSData = SiS_Pr->SiS_LVDSBARCO1024Data_1;  break;
++	case 83:  LVDSData = SiS_Pr->SiS_LVDSBARCO1024Data_2;  break;
+ 	case 90:  LVDSData = SiS_Pr->SiS_CHTVUPALMData;        break;
+       	case 91:  LVDSData = SiS_Pr->SiS_CHTVOPALMData;        break;
+       	case 92:  LVDSData = SiS_Pr->SiS_CHTVUPALNData;        break;
+       	case 93:  LVDSData = SiS_Pr->SiS_CHTVOPALNData;        break;
+-	case 99:  LVDSData = SiS_Pr->SiS_CHTVSOPALData;	       break;  /* TW: Super Overscan */
++	case 99:  LVDSData = SiS_Pr->SiS_CHTVSOPALData;	       break;  /* Super Overscan */
+ 	default:  LVDSData = SiS_Pr->SiS_LVDS1024x768Data_1;   break;
+      }
+    }
+@@ -3337,67 +3453,36 @@ SiS_GetCRT2DataLVDS(SiS_Private *SiS_Pr,
+ 
+   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ 
+-    if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)){
+-         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768){
+-           SiS_Pr->SiS_HDE = 1024;
+-           SiS_Pr->SiS_VDE =  768;
+-         } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024){
+-           SiS_Pr->SiS_HDE = 1280;
+-           SiS_Pr->SiS_VDE = 1024;
+-	 } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050){
+-           SiS_Pr->SiS_HDE = 1400;
+-           SiS_Pr->SiS_VDE = 1050;
+-	 } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200){
+-           SiS_Pr->SiS_HDE = 1600;
+-           SiS_Pr->SiS_VDE = 1200;
+-         } else {
+-	   SiS_Pr->SiS_HDE = 1280;
+-	   SiS_Pr->SiS_VDE =  960;
+-	 }
+-    }
++     if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
++        SiS_Pr->SiS_HDE = SiS_Pr->PanelXRes;
++        SiS_Pr->SiS_VDE = SiS_Pr->PanelYRes;
++     }
+ 
+   } else {
+ 
+-    if(SiS_Pr->SiS_IF_DEF_TRUMPION == 0) {
+-      if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
+-        if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+-          if((!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) || (SiS_Pr->SiS_SetFlag & SetDOSMode)) {
+-            if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+-              SiS_Pr->SiS_HDE =  800;
+-              SiS_Pr->SiS_VDE =  600;
+-	    } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+-	      SiS_Pr->SiS_HDE = 1024;
+-              SiS_Pr->SiS_VDE =  600;  
+-            } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+-              SiS_Pr->SiS_HDE = 1024;
+-              SiS_Pr->SiS_VDE =  768;
+- 	    } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) {
+-	      SiS_Pr->SiS_HDE = 1152;
+-	      SiS_Pr->SiS_VDE =  768;	
+-	    } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x864) {
+-	      SiS_Pr->SiS_HDE = 1152;
+-	      SiS_Pr->SiS_VDE =  864;  
+-	    } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
+-	      SiS_Pr->SiS_HDE = 1280;
+-	      SiS_Pr->SiS_VDE =  768;        
+-            } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+-              SiS_Pr->SiS_HDE = 1280;
+-              SiS_Pr->SiS_VDE = 1024;
+-	    } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+-	      SiS_Pr->SiS_HDE = 1400;
+-              SiS_Pr->SiS_VDE = 1050;
+-	    } else {
+-	      SiS_Pr->SiS_HDE = 1600;
+-	      SiS_Pr->SiS_VDE = 1200;
+-	    }
+-            if(SiS_Pr->SiS_IF_DEF_FSTN) {
+-              SiS_Pr->SiS_HDE = 320;
+-              SiS_Pr->SiS_VDE = 480;
+-            }
+-          }
++     if(SiS_Pr->SiS_IF_DEF_TRUMPION == 0) {
++        if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
++           if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
++              if((!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) || (SiS_Pr->SiS_SetFlag & SetDOSMode)) {
++	         SiS_Pr->SiS_HDE = SiS_Pr->PanelXRes;
++                 SiS_Pr->SiS_VDE = SiS_Pr->PanelYRes;
++
++		 if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
++		    if(ResIndex < 0x08) {
++		       SiS_Pr->SiS_HDE = 1280;
++                       SiS_Pr->SiS_VDE = 1024;
++		    }
++		 }
++#if 0
++                 if(SiS_Pr->SiS_IF_DEF_FSTN) {
++                    SiS_Pr->SiS_HDE = 320;
++                    SiS_Pr->SiS_VDE = 480;
++                 }
++#endif		 
++              }
++           }
+         }
+-      }
+-    }
++     }
+   }
+ }
+ 
+@@ -3413,11 +3498,16 @@ SiS_GetCRT2Data301(SiS_Private *SiS_Pr, 
+   const SiS_TVDataStruct  *TVPtr  = NULL;
+ 
+   if(ModeNo <= 0x13) {
+-    	modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+-    	resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
++     modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
++     resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+   } else {
++     if(SiS_Pr->UseCustomMode) {
++        modeflag = SiS_Pr->CModeFlag;
++	resinfo = 0;
++     } else {
+     	modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+     	resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
++     }
+   }
+   
+   SiS_Pr->SiS_NewFlickerMode = 0;
+@@ -3429,20 +3519,29 @@ SiS_GetCRT2Data301(SiS_Private *SiS_Pr, 
+ 
+   SiS_GetCRT2ResInfo(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension);
+ 
+-  /* TW: For VGA2 ("RAMDAC2") */
+-
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC){
+-     SiS_GetRAMDAC2DATA(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+-                        HwDeviceExtension);
+-     return;
+-  }
+ 
+-  /* TW: For TV */
++     if(SiS_Pr->UseCustomMode) {
+ 
+-  if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++        SiS_Pr->SiS_RVBHCMAX  = 1;
++        SiS_Pr->SiS_RVBHCFACT = 1;
++        SiS_Pr->SiS_VGAHT     = SiS_Pr->CHTotal;
++        SiS_Pr->SiS_VGAVT     = SiS_Pr->CVTotal;
++        SiS_Pr->SiS_HT        = SiS_Pr->CHTotal;
++        SiS_Pr->SiS_VT        = SiS_Pr->CVTotal;
++	SiS_Pr->SiS_HDE       = SiS_Pr->SiS_VGAHDE;
++        SiS_Pr->SiS_VDE       = SiS_Pr->SiS_VGAVDE;
+ 
+-    SiS_GetCRT2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+-                   &CRT2Index,&ResIndex,HwDeviceExtension);
++     } else {
++
++        SiS_GetRAMDAC2DATA(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
++                           HwDeviceExtension);
++     }
++
++  } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++
++    SiS_GetCRT2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
++                   &CRT2Index,&ResIndex,HwDeviceExtension);
+ 
+     switch (CRT2Index) {
+       case  2:  TVPtr = SiS_Pr->SiS_ExtHiTVData;   break;
+@@ -3452,7 +3551,7 @@ SiS_GetCRT2Data301(SiS_Private *SiS_Pr, 
+       case  4:  TVPtr = SiS_Pr->SiS_ExtNTSCData;   break;
+       case  8:  TVPtr = SiS_Pr->SiS_StPALData;     break;
+       case  9:  TVPtr = SiS_Pr->SiS_StNTSCData;    break;
+-      default:  TVPtr = SiS_Pr->SiS_StPALData;     break;  /* TW: Just to avoid a crash */
++      default:  TVPtr = SiS_Pr->SiS_StPALData;     break;  /* Just to avoid a crash */
+     }
+ 
+     SiS_Pr->SiS_RVBHCMAX  = (TVPtr+ResIndex)->RVBHCMAX;
+@@ -3464,18 +3563,16 @@ SiS_GetCRT2Data301(SiS_Private *SiS_Pr, 
+     SiS_Pr->SiS_RVBHRS    = (TVPtr+ResIndex)->RVBHRS;
+     SiS_Pr->SiS_NewFlickerMode = (TVPtr+ResIndex)->FlickerMode;
+     if(modeflag & HalfDCLK) {
+-	SiS_Pr->SiS_RVBHRS    = (TVPtr+ResIndex)->HALFRVBHRS;
++	SiS_Pr->SiS_RVBHRS     = (TVPtr+ResIndex)->HALFRVBHRS;
+     }
+ 
+     if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {  
+     
+        if(SiS_Pr->SiS_HiVision != 3) {
+-       
+-      	  if(resinfo == 0x08) SiS_Pr->SiS_NewFlickerMode = 0x40;
+-      	  if(resinfo == 0x09) SiS_Pr->SiS_NewFlickerMode = 0x40;
+-	  if(resinfo == 0x12) SiS_Pr->SiS_NewFlickerMode = 0x40;
+-	  
+-       } 
++      	  if(resinfo == SIS_RI_1024x768)  SiS_Pr->SiS_NewFlickerMode = 0x40;
++      	  if(resinfo == SIS_RI_1280x1024) SiS_Pr->SiS_NewFlickerMode = 0x40;
++	  if(resinfo == SIS_RI_1280x720)  SiS_Pr->SiS_NewFlickerMode = 0x40;
++       }
+        
+        switch(SiS_Pr->SiS_HiVision) {
+        case 2:
+@@ -3504,119 +3601,127 @@ SiS_GetCRT2Data301(SiS_Private *SiS_Pr, 
+ 
+     } else {
+ 
+-      SiS_Pr->SiS_RY1COE = (TVPtr+ResIndex)->RY1COE;
+-      SiS_Pr->SiS_RY2COE = (TVPtr+ResIndex)->RY2COE;
+-      SiS_Pr->SiS_RY3COE = (TVPtr+ResIndex)->RY3COE;
+-      SiS_Pr->SiS_RY4COE = (TVPtr+ResIndex)->RY4COE;
+-
+-      if(modeflag & HalfDCLK) {
+-         SiS_Pr->SiS_RY1COE = 0x00;
+-         SiS_Pr->SiS_RY2COE = 0xf4;
+-         SiS_Pr->SiS_RY3COE = 0x10;
+-         SiS_Pr->SiS_RY4COE = 0x38;
+-      }
+-
+-      if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-        SiS_Pr->SiS_HT = NTSCHT;
+-	if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {  
+-	   if((ModeNo == 0x4a) || (ModeNo == 0x38)) SiS_Pr->SiS_HT = NTSC2HT;
+-	}  
+-        SiS_Pr->SiS_VT = NTSCVT;
+-      } else {
+-        SiS_Pr->SiS_HT = PALHT;
+-        SiS_Pr->SiS_VT = PALVT;
+-      }
++       SiS_Pr->SiS_RY1COE = (TVPtr+ResIndex)->RY1COE;
++       SiS_Pr->SiS_RY2COE = (TVPtr+ResIndex)->RY2COE;
++       SiS_Pr->SiS_RY3COE = (TVPtr+ResIndex)->RY3COE;
++       SiS_Pr->SiS_RY4COE = (TVPtr+ResIndex)->RY4COE;
++
++       if(modeflag & HalfDCLK) {
++          SiS_Pr->SiS_RY1COE = 0x00;
++          SiS_Pr->SiS_RY2COE = 0xf4;
++          SiS_Pr->SiS_RY3COE = 0x10;
++          SiS_Pr->SiS_RY4COE = 0x38;
++       }
++
++       if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
++          SiS_Pr->SiS_HT = NTSCHT;
++	  if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++	     if((ModeNo == 0x64) || (ModeNo == 0x4a) || (ModeNo == 0x38)) SiS_Pr->SiS_HT = NTSC2HT;
++	  }
++          SiS_Pr->SiS_VT = NTSCVT;
++       } else {
++          SiS_Pr->SiS_HT = PALHT;
++          SiS_Pr->SiS_VT = PALVT;
++       }
+ 
+     }
+ 
+-    return;
+-  }
++  } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
++
++     if(SiS_Pr->UseCustomMode) {
+ 
+-  /* TW: For LCD */
++        SiS_Pr->SiS_RVBHCMAX  = 1;
++        SiS_Pr->SiS_RVBHCFACT = 1;
++        SiS_Pr->SiS_VGAHT     = SiS_Pr->CHTotal;
++        SiS_Pr->SiS_VGAVT     = SiS_Pr->CVTotal;
++        SiS_Pr->SiS_HT        = SiS_Pr->CHTotal;
++        SiS_Pr->SiS_VT        = SiS_Pr->CVTotal;
++	SiS_Pr->SiS_HDE       = SiS_Pr->SiS_VGAHDE;
++        SiS_Pr->SiS_VDE       = SiS_Pr->SiS_VGAVDE;
+ 
+-  if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
++     } else {
+ 
+-    SiS_GetCRT2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+-                   &CRT2Index,&ResIndex,HwDeviceExtension);
++        SiS_GetCRT2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
++                      &CRT2Index,&ResIndex,HwDeviceExtension);
++
++        switch(CRT2Index) {
++         case  0: LCDPtr = SiS_Pr->SiS_ExtLCD1024x768Data;        break; /* VESA Timing */
++         case  1: LCDPtr = SiS_Pr->SiS_ExtLCD1280x1024Data;       break; /* VESA Timing */
++         case  5: LCDPtr = SiS_Pr->SiS_StLCD1024x768Data;         break; /* Obviously unused */
++         case  6: LCDPtr = SiS_Pr->SiS_StLCD1280x1024Data;        break; /* Obviously unused */
++         case 10: LCDPtr = SiS_Pr->SiS_St2LCD1024x768Data;        break; /* Non-VESA Timing */
++         case 11: LCDPtr = SiS_Pr->SiS_St2LCD1280x1024Data;       break; /* Non-VESA Timing */
++         case 13: LCDPtr = SiS_Pr->SiS_NoScaleData1024x768;       break; /* Non-expanding */
++         case 14: LCDPtr = SiS_Pr->SiS_NoScaleData1280x1024;      break; /* Non-expanding */
++         case 15: LCDPtr = SiS_Pr->SiS_LCD1280x960Data;           break; /* 1280x960 */
++         case 20: LCDPtr = SiS_Pr->SiS_ExtLCD1400x1050Data;       break; /* VESA Timing */
++         case 21: LCDPtr = SiS_Pr->SiS_NoScaleData1400x1050;      break; /* Non-expanding (let panel scale) */
++         case 22: LCDPtr = SiS_Pr->SiS_StLCD1400x1050Data;        break; /* Non-VESA Timing (let panel scale) */
++         case 23: LCDPtr = SiS_Pr->SiS_ExtLCD1600x1200Data;       break; /* VESA Timing */
++         case 24: LCDPtr = SiS_Pr->SiS_NoScaleData1600x1200;      break; /* Non-expanding */
++         case 25: LCDPtr = SiS_Pr->SiS_StLCD1600x1200Data;        break; /* Non-VESA Timing */
++         case 26: LCDPtr = SiS_Pr->SiS_ExtLCD1280x768Data;        break; /* VESA Timing */
++         case 27: LCDPtr = SiS_Pr->SiS_NoScaleData1280x768;       break; /* Non-expanding */
++         case 28: LCDPtr = SiS_Pr->SiS_StLCD1280x768Data;         break; /* Non-VESA Timing */
++         case 29: LCDPtr = SiS_Pr->SiS_NoScaleData;	          break; /* Generic no-scale data */
++         default: LCDPtr = SiS_Pr->SiS_ExtLCD1024x768Data;	  break; /* Just to avoid a crash */
++        }
++
++        SiS_Pr->SiS_RVBHCMAX  = (LCDPtr+ResIndex)->RVBHCMAX;
++        SiS_Pr->SiS_RVBHCFACT = (LCDPtr+ResIndex)->RVBHCFACT;
++        SiS_Pr->SiS_VGAHT     = (LCDPtr+ResIndex)->VGAHT;
++        SiS_Pr->SiS_VGAVT     = (LCDPtr+ResIndex)->VGAVT;
++        SiS_Pr->SiS_HT        = (LCDPtr+ResIndex)->LCDHT;
++        SiS_Pr->SiS_VT        = (LCDPtr+ResIndex)->LCDVT;
+ 
+-    switch (CRT2Index) {
+-      case  0: LCDPtr = SiS_Pr->SiS_ExtLCD1024x768Data;        break; /* VESA Timing */
+-      case  1: LCDPtr = SiS_Pr->SiS_ExtLCD1280x1024Data;       break; /* VESA Timing */
+-      case  5: LCDPtr = SiS_Pr->SiS_StLCD1024x768Data;         break; /* Obviously unused */
+-      case  6: LCDPtr = SiS_Pr->SiS_StLCD1280x1024Data;        break; /* Obviously unused */
+-      case 10: LCDPtr = SiS_Pr->SiS_St2LCD1024x768Data;        break; /* Non-VESA Timing */
+-      case 11: LCDPtr = SiS_Pr->SiS_St2LCD1280x1024Data;       break; /* Non-VESA Timing */
+-      case 13: LCDPtr = SiS_Pr->SiS_NoScaleData1024x768;       break; /* Non-expanding */
+-      case 14: LCDPtr = SiS_Pr->SiS_NoScaleData1280x1024;      break; /* Non-expanding */
+-      case 15: LCDPtr = SiS_Pr->SiS_LCD1280x960Data;           break; /* 1280x960 */
+-      case 20: LCDPtr = SiS_Pr->SiS_ExtLCD1400x1050Data;       break; /* VESA Timing */
+-      case 21: LCDPtr = SiS_Pr->SiS_NoScaleData1400x1050;      break; /* Non-expanding (let panel scale) */
+-      case 22: LCDPtr = SiS_Pr->SiS_StLCD1400x1050Data;	       break; /* Non-VESA Timing (let panel scale) */
+-      case 23: LCDPtr = SiS_Pr->SiS_ExtLCD1600x1200Data;       break; /* VESA Timing */
+-      case 24: LCDPtr = SiS_Pr->SiS_NoScaleData1600x1200;      break; /* Non-expanding */
+-      case 25: LCDPtr = SiS_Pr->SiS_StLCD1600x1200Data;	       break; /* Non-VESA Timing */
+-      default: LCDPtr = SiS_Pr->SiS_ExtLCD1024x768Data;	       break; /* Just to avoid a crash */
+-    }
+-
+-    SiS_Pr->SiS_RVBHCMAX  = (LCDPtr+ResIndex)->RVBHCMAX;
+-    SiS_Pr->SiS_RVBHCFACT = (LCDPtr+ResIndex)->RVBHCFACT;
+-    SiS_Pr->SiS_VGAHT     = (LCDPtr+ResIndex)->VGAHT;
+-    SiS_Pr->SiS_VGAVT     = (LCDPtr+ResIndex)->VGAVT;
+-    SiS_Pr->SiS_HT        = (LCDPtr+ResIndex)->LCDHT;
+-    SiS_Pr->SiS_VT        = (LCDPtr+ResIndex)->LCDVT;
+-    
+ #ifdef TWDEBUG
+-    xf86DrvMsg(0, X_INFO,
+-    	"GetCRT2Data: Index %d ResIndex %d\n", CRT2Index, ResIndex);
+-#endif    
++        xf86DrvMsg(0, X_INFO,
++    	    "GetCRT2Data: Index %d ResIndex %d\n", CRT2Index, ResIndex);
++#endif
+ 
+-    tempax = 1024;
+-    if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
+-      if(HwDeviceExtension->jChipType < SIS_315H) {
+-         if     (SiS_Pr->SiS_VGAVDE == 350) tempbx = 560;
+-         else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 640;
+-         else                               tempbx = 768;
+-      } else {      
+-         tempbx = 768; 
+-      }
+-    } else {
+-      if     (SiS_Pr->SiS_VGAVDE == 357) tempbx = 527;
+-      else if(SiS_Pr->SiS_VGAVDE == 420) tempbx = 620;
+-      else if(SiS_Pr->SiS_VGAVDE == 525) tempbx = 775;
+-      else if(SiS_Pr->SiS_VGAVDE == 600) tempbx = 775;
+-      else if(SiS_Pr->SiS_VGAVDE == 350) tempbx = 560;
+-      else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 640;
+-      else                               tempbx = 768;
+-    }
+-    if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+-      tempax = 1280;
+-      if     (SiS_Pr->SiS_VGAVDE == 360) tempbx = 768;
+-      else if(SiS_Pr->SiS_VGAVDE == 375) tempbx = 800;
+-      else if(SiS_Pr->SiS_VGAVDE == 405) tempbx = 864;
+-      else                               tempbx = 1024;
+-    }
+-    if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
+-      tempax = 1280;
+-      if     (SiS_Pr->SiS_VGAVDE == 350)  tempbx = 700;
+-      else if(SiS_Pr->SiS_VGAVDE == 400)  tempbx = 800;
+-      else if(SiS_Pr->SiS_VGAVDE == 1024) tempbx = 960;
+-      else                                tempbx = 960;
+-    }
+-    if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+-      tempax = 1400;
+-      tempbx = 1050;
+-    }
+-    if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
+-      tempax = 1600;
+-      tempbx = 1200;
+-    }
+-    if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+-       tempax = SiS_Pr->SiS_VGAHDE;
+-       tempbx = SiS_Pr->SiS_VGAVDE;
+-    }
+-    SiS_Pr->SiS_HDE = tempax;
+-    SiS_Pr->SiS_VDE = tempbx;
+-    return;
++	if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
++           tempax = 1024;
++           if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
++              if(HwDeviceExtension->jChipType < SIS_315H) {
++                 if     (SiS_Pr->SiS_VGAVDE == 350) tempbx = 560;
++                 else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 640;
++                 else                               tempbx = 768;
++              } else {
++                 tempbx = 768;
++              }
++           } else {
++              if     (SiS_Pr->SiS_VGAVDE == 357) tempbx = 527;
++              else if(SiS_Pr->SiS_VGAVDE == 420) tempbx = 620;
++              else if(SiS_Pr->SiS_VGAVDE == 525) tempbx = 775;
++              else if(SiS_Pr->SiS_VGAVDE == 600) tempbx = 775;
++              else if(SiS_Pr->SiS_VGAVDE == 350) tempbx = 560;
++              else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 640;
++              else                               tempbx = 768;
++           }
++	} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
++           tempax = 1280;
++           if     (SiS_Pr->SiS_VGAVDE == 360) tempbx = 768;
++           else if(SiS_Pr->SiS_VGAVDE == 375) tempbx = 800;
++           else if(SiS_Pr->SiS_VGAVDE == 405) tempbx = 864;
++           else                               tempbx = 1024;
++        } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
++           tempax = 1280;
++           if     (SiS_Pr->SiS_VGAVDE == 350)  tempbx = 700;
++           else if(SiS_Pr->SiS_VGAVDE == 400)  tempbx = 800;
++           else if(SiS_Pr->SiS_VGAVDE == 1024) tempbx = 960;
++           else                                tempbx = 960;
++        } else {
++	   tempax = SiS_Pr->PanelXRes;
++           tempbx = SiS_Pr->PanelYRes;
++	}
++        if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
++           tempax = SiS_Pr->SiS_VGAHDE;
++           tempbx = SiS_Pr->SiS_VGAVDE;
++        }
++        SiS_Pr->SiS_HDE = tempax;
++        SiS_Pr->SiS_VDE = tempbx;
++        return;
++     }
+   }
+ }
+ 
+@@ -3626,9 +3731,9 @@ SiS_GetResInfo(SiS_Private *SiS_Pr, UCHA
+   USHORT resindex;
+ 
+   if(ModeNo <= 0x13)
+-    	resindex=SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
++     resindex=SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+   else
+-    	resindex=SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
++     resindex=SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+ 
+   return(resindex);
+ }
+@@ -3639,41 +3744,46 @@ SiS_GetCRT2ResInfo(SiS_Private *SiS_Pr, 
+ {
+   USHORT xres,yres,modeflag=0,resindex;
+ 
++  if(SiS_Pr->UseCustomMode) {
++     SiS_Pr->SiS_VGAHDE = SiS_Pr->SiS_HDE = SiS_Pr->CHDisplay;
++     SiS_Pr->SiS_VGAVDE = SiS_Pr->SiS_VDE = SiS_Pr->CVDisplay;
++     return;
++  }
++
+   resindex = SiS_GetResInfo(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex);
+ 
+   if(ModeNo <= 0x13) {
+-    	xres = SiS_Pr->SiS_StResInfo[resindex].HTotal;
+-    	yres = SiS_Pr->SiS_StResInfo[resindex].VTotal;
++     xres = SiS_Pr->SiS_StResInfo[resindex].HTotal;
++     yres = SiS_Pr->SiS_StResInfo[resindex].VTotal;
+   } else {
+-	xres = SiS_Pr->SiS_ModeResInfo[resindex].HTotal;
+-    	yres = SiS_Pr->SiS_ModeResInfo[resindex].VTotal;
+-    	modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
++     xres = SiS_Pr->SiS_ModeResInfo[resindex].HTotal;
++     yres = SiS_Pr->SiS_ModeResInfo[resindex].VTotal;
++     modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+   }
+ 
+-  if((HwDeviceExtension->jChipType >= SIS_315H) && (SiS_Pr->SiS_IF_DEF_LVDS == 1)) {
+-      if((ModeNo != 0x03) && (SiS_Pr->SiS_SetFlag & SetDOSMode)) {
+-          if(yres == 350) yres = 400;
+-      }
+-      if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x3a) & 0x01) {
+- 	  if(ModeNo == 0x12) yres = 400;
+-      }
+-  }
++  if((!SiS_Pr->SiS_IF_DEF_DSTN) && (!SiS_Pr->SiS_IF_DEF_FSTN)) {
++
++     if((HwDeviceExtension->jChipType >= SIS_315H) && (SiS_Pr->SiS_IF_DEF_LVDS == 1)) {
++        if((ModeNo != 0x03) && (SiS_Pr->SiS_SetFlag & SetDOSMode)) {
++           if(yres == 350) yres = 400;
++        }
++        if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x3a) & 0x01) {
++ 	   if(ModeNo == 0x12) yres = 400;
++        }
++     }
++
++     if(ModeNo > 0x13) {
++  	if(modeflag & HalfDCLK)       xres *= 2;
++  	if(modeflag & DoubleScanMode) yres *= 2;
++     }
+ 
+-  if(ModeNo > 0x13) {
+-      if(SiS_Pr->SiS_IF_DEF_FSTN == 1){
+-            xres *= 2;
+-            yres *= 2;
+-      } else {
+-  	    if(modeflag & HalfDCLK)       xres *= 2;
+-  	    if(modeflag & DoubleScanMode) yres *= 2;
+-      }
+   }
+ 
+   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+         if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+            if(xres == 720) xres = 640;
+ 	} else {
+-	   if(SiS_Pr->SiS_VBType & VB_NoLCD) {           /* TW: 301BDH */
++	   if(SiS_Pr->SiS_VBType & VB_NoLCD) {           /* 301BDH */
+ 	        if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+                    if(xres == 720) xres = 640;
+ 		}
+@@ -3694,9 +3804,8 @@ SiS_GetCRT2ResInfo(SiS_Private *SiS_Pr, 
+ 	         if(xres == 720) xres = 640;
+ 	      }
+ 	      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-    	         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
++		 if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+ 		    if(ModeNo <= 0x13) {
+-		       /* TW: This is wrong for 640x400 *graphics* mode */
+       		       if(yres == 400) yres = 405;
+ 		    }
+       		    if(yres == 350) yres = 360;
+@@ -3719,12 +3828,15 @@ SiS_GetCRT2ResInfo(SiS_Private *SiS_Pr, 
+   } else {
+     	if(xres == 720) xres = 640;
+ 	if(SiS_Pr->SiS_SetFlag & SetDOSMode) {
+-	      yres = 400;
+-	      if(HwDeviceExtension->jChipType >= SIS_315H) {
+-	          if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x80) yres = 480;
+-	      } else {
+-	          if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x80) yres = 480;
+-	      }
++	   yres = 400;
++	   if(HwDeviceExtension->jChipType >= SIS_315H) {
++	      if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x80) yres = 480;
++	   } else {
++	      if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x80) yres = 480;
++	   }
++	   if(SiS_Pr->SiS_IF_DEF_DSTN || SiS_Pr->SiS_IF_DEF_FSTN) {
++	      yres = 480;
++	   }
+ 	}
+   }
+   SiS_Pr->SiS_VGAHDE = SiS_Pr->SiS_HDE = xres;
+@@ -3739,6 +3851,13 @@ SiS_GetCRT2Ptr(SiS_Private *SiS_Pr, UCHA
+   USHORT tempbx=0,tempal=0;
+   USHORT Flag,resinfo=0;
+ 
++  if(ModeNo <= 0x13) {
++     tempal = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
++  } else {
++     tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
++     resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
++  }
++
+   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ 
+     	if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {                            /* LCD */
+@@ -3753,15 +3872,32 @@ SiS_GetCRT2Ptr(SiS_Private *SiS_Pr, UCHA
+ 		        tempbx = 23;
+ 			if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)         tempbx = 24;
+ 			else if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx = 25;
++#if 0
++	        } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
++		        tempbx = 26;
++			if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)         tempbx = 27;
++			else if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx = 28;
++#endif
+ 		} else if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+-			tempbx = 13;
+-			if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempbx++;
++			if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
++			   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)       tempbx = 13;
++			   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempbx = 14;
++			   else 							 tempbx = 29;
++			} else {
++			   tempbx = 29;
++			   if(ModeNo >= 0x13) {
++			      /* 1280x768 and 1280x960 have same CRT2CRTC,
++			       * so we change it here if 1280x960 is chosen
++			       */
++			      if(resinfo == SIS_RI_1280x960) tempal = 10;
++			   }
++			}
+ 		} else {
+       		   tempbx = SiS_Pr->SiS_LCDResInfo - SiS_Pr->SiS_Panel1024x768;
+       		   if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
+         		tempbx += 5;
+                         /* GetRevisionID();  */
+-			/* TW: BIOS only adds 5 once */
++			/* BIOS only adds 5 once */
+         		tempbx += 5;
+        		   }
+ 	        }
+@@ -3783,34 +3919,18 @@ SiS_GetCRT2Ptr(SiS_Private *SiS_Pr, UCHA
+ 		
+      	}
+ 
+-     	if(ModeNo <= 0x13) {
+-       		tempal = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+-     	} else {
+-       		tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+-		resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+-        }
+-
+-     	tempal &= 0x3F;
+-
+-      	if((SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) &&
+-           (SiS_Pr->SiS_VBInfo & (SetCRT2ToTV-SetCRT2ToHiVisionTV))) {
+-      		if(tempal == 0x06) tempal = 0x07;
+-        }
+-
+-	/* TW: 300/301LV BIOS */
+-	if((HwDeviceExtension->jChipType == SIS_300) &&
+-	   (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) {
+-	    if(ModeNo > 0x13) {
+-	        if((resinfo == 0x0c) || (resinfo == 0x0d))  /* 720 (index diff. on 310/325!) */
+-		    tempal = 6;
+-	    }
+-	}
++        tempal &= 0x3F;
+ 
+-	if(HwDeviceExtension->jChipType != SIS_300) {
+-           if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-              if((ModeNo == 0x31) || (ModeNo == 0x32)) tempal = 6;
++      	if(SiS_Pr->SiS_VBInfo & (SetCRT2ToTV - SetCRT2ToHiVisionTV)) {
++	   if(ModeNo > 0x13) {
++      	      if(tempal == 6) tempal = 7;
++              if((resinfo == SIS_RI_720x480) ||
++	         (resinfo == SIS_RI_720x576) ||
++	         (resinfo == SIS_RI_768x576)) {
++		 tempal = 6;
++	      }
+ 	   }
+-	}
++        }
+ 
+      	*CRT2Index = tempbx;
+      	*ResIndex = tempal;
+@@ -3820,25 +3940,22 @@ SiS_GetCRT2Ptr(SiS_Private *SiS_Pr, UCHA
+     	Flag = 1;
+     	tempbx = 0;
+     	if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+-	
+-      		if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
+-        		Flag = 0;
+-        		tempbx = 10;
+-			if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
+-        		if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+-				tempbx += 2;
+-				if(SiS_Pr->SiS_CHSOverScan) tempbx = 99;
+-				if(SiS_Pr->SiS_CHPALM) {
+-					tempbx = 90;
+-					if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
+-				} else if(SiS_Pr->SiS_CHPALN) {
+-					tempbx = 92;
+-					if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
+-				}
+-				
+-			}
+-      		}
+-		
++      	   if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
++              Flag = 0;
++              tempbx = 10;
++	      if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
++              if(SiS_Pr->SiS_VBInfo & SetPALTV) {
++		 tempbx += 2;
++		 if(SiS_Pr->SiS_CHSOverScan) tempbx = 99;
++		 if(SiS_Pr->SiS_CHPALM) {
++		    tempbx = 90;
++		    if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
++		 } else if(SiS_Pr->SiS_CHPALN) {
++		    tempbx = 92;
++		    if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
++	 	 }
++              }
++           }
+     	}
+ 
+     	if(Flag) {
+@@ -3846,11 +3963,19 @@ SiS_GetCRT2Ptr(SiS_Private *SiS_Pr, UCHA
+ 		if(SiS_Pr->SiS_LCDResInfo <= SiS_Pr->SiS_Panel1280x1024) {
+ 		   tempbx = SiS_Pr->SiS_LCDResInfo - SiS_Pr->SiS_PanelMinLVDS;
+    	      	   if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)  tempbx += 3;
++		   if(SiS_Pr->SiS_CustomT == CUT_BARCO1024) {
++		      tempbx = 82;
++		      if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)  tempbx++;
++		   }
+ 		} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
+ 		   tempbx = 18;
+ 		   if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)  tempbx++; 
+-	        } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) { 
++	        } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+ 		   tempbx = 6;
++		} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2) {
++		   tempbx = 30;
++		} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) {
++		   tempbx = 30;
+ 		} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+ 		   tempbx = 15;
+   		   if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)  tempbx += 2;
+@@ -3863,27 +3988,25 @@ SiS_GetCRT2Ptr(SiS_Private *SiS_Pr, UCHA
+ 		} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
+ 		   tempbx = 21;
+ 		   if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)  tempbx++;
++		} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelBarco1366) {
++		   tempbx = 80;
++   	      	   if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)  tempbx++;
+ 		}
+-		
++
+ 		if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
+ 		   tempbx = 7;
+         	}
+ 		
+ 	}
+ 
+-    	if(ModeNo <= 0x13)
+-      		tempal = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+-    	else {
+-      		tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+-		resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+-	}
+-
++#if 0
+ 	if(SiS_Pr->SiS_IF_DEF_FSTN){
+        	 	if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel320x480){
+          		tempbx = 14;
+          		tempal = 6;
+         	}
+     	}
++#endif	
+ 
+ 	if(SiS_Pr->SiS_SetFlag & SetDOSMode) {
+ 	        if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) tempal = 7;
+@@ -3895,13 +4018,10 @@ SiS_GetCRT2Ptr(SiS_Private *SiS_Pr, UCHA
+ 
+ 	if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ 	    if(ModeNo > 0x13) {
+-	        if(HwDeviceExtension->jChipType < SIS_315H) {
+-	           if((resinfo == 0x0c) || (resinfo == 0x0d))  /* 720 */
+-		       tempal = 6;
+-	        } else {
+-		   if((resinfo == 0x0d) || (resinfo == 0x0e))  /* 720 */
+-		       tempal = 6;
+-		}
++	       if((resinfo == SIS_RI_720x480) ||
++	          (resinfo == SIS_RI_720x576) ||
++		  (resinfo == SIS_RI_768x576))
++		  tempal = 6;
+ 	    }
+ 	}
+ 
+@@ -3969,8 +4089,9 @@ SiS_GetRatePtrCRT2(SiS_Private *SiS_Pr, 
+   USHORT RefreshRateTableIndex,i,backup_i;
+   USHORT modeflag,index,temp,backupindex;
+ 
+-  if(SiS_Pr->UseCustomMode) return 0;
+-  
++  /* Do NOT check for UseCustomMode here, will skrew up FIFO */
++  if(ModeNo == 0xfe) return 0;
++
+   if(ModeNo <= 0x13)
+     	modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+   else
+@@ -3984,7 +4105,7 @@ SiS_GetRatePtrCRT2(SiS_Private *SiS_Pr, 
+ 
+   if(ModeNo < 0x14) return(0xFFFF);
+ 
+- /* TW: CR33 holds refresh rate index for CRT1 [3:0] and CRT2 [7:4].
++ /* CR33 holds refresh rate index for CRT1 [3:0] and CRT2 [7:4].
+   *     On LVDS machines, CRT2 index is always 0 and will be
+   *     set to 0 by the following code; this causes the function
+   *     to take the first non-interlaced mode in SiS_Ext2Struct
+@@ -3998,40 +4119,38 @@ SiS_GetRatePtrCRT2(SiS_Private *SiS_Pr, 
+   if(index > 0) index--;
+ 
+   if(SiS_Pr->SiS_SetFlag & ProgrammingCRT2) {
+-      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
++     if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+         if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))  index = 0;
+-      } else {
++     } else {
+         if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-	    if(SiS_Pr->SiS_VBType & VB_NoLCD)
+-	       	    index = 0;
+-	    else if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)
+-	    	    index = backupindex = 0;
++	   if(SiS_Pr->SiS_VBType & VB_NoLCD)
++	      index = 0;
++	   else if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)
++	      index = backupindex = 0;
+ 	}
+-      }
+-  }
++     }
+ 
+-  if(SiS_Pr->SiS_SetFlag & ProgrammingCRT2) {
+-    	if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+-      		if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-        		index = 0;
+-      		}
+-    	}
+-    	if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
+-      		if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+-			if(!(SiS_Pr->SiS_VBType & VB_NoLCD)) {
+-           		   temp = LCDRefreshIndex[SiS_Pr->SiS_LCDResInfo];
+-        		   if(index > temp) index = temp;
+-			}
+-      		} else {
+-        		index = 0;
+-      		}
+-    	}
++     if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
++        if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++           index = 0;
++        }
++     }
++     if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
++        if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
++	   if(!(SiS_Pr->SiS_VBType & VB_NoLCD)) {
++              temp = LCDRefreshIndex[SiS_Pr->SiS_LCDResInfo];
++              if(index > temp) index = temp;
++	   }
++      	} else {
++           index = 0;
++      	}
++     }
+   }
+ 
+   RefreshRateTableIndex = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].REFindex;
+   ModeNo = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].ModeID;
+ 
+-  /* TW: 650/LVDS 1.10.07, 650/30xLV 1.10.6s */
++  /* 650/LVDS 1.10.07, 650/30xLV 1.10.6s */
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+      if(!(SiS_Pr->SiS_VBInfo & DriverMode)) {
+         if( (SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_VESAID == 0x105) ||
+@@ -4066,7 +4185,7 @@ SiS_GetRatePtrCRT2(SiS_Private *SiS_Pr, 
+     	backup_i = i;
+     	if (!(SiS_AdjustCRT2Rate(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+ 	                             RefreshRateTableIndex,&i,HwDeviceExtension))) {
+-		/* TW: This is for avoiding random data to be used; i is
++		/* This is for avoiding random data to be used; i is
+ 		 *     in an undefined state if no matching CRT2 mode is
+ 		 *     found.
+ 		 */
+@@ -4085,196 +4204,199 @@ SiS_AdjustCRT2Rate(SiS_Private *SiS_Pr, 
+   USHORT tempax,tempbx,resinfo;
+   USHORT modeflag,infoflag;
+ 
+-  if (ModeNo <= 0x13)
++  if(ModeNo <= 0x13) {
+     	modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+-  else
++	resinfo = 0;
++  } else {
+     	modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
++        resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
++  }
+ 
+-  resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+   tempbx = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + (*i)].ModeID;
+ 
+   tempax = 0;
++
+   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
++
+     	if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
+       		tempax |= SupportRAMDAC2;
+ 		if(HwDeviceExtension->jChipType >= SIS_315H) {
+-		    tempax |= SupportTV;
+-		    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-		        if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-			    if(resinfo == 0x0a) tempax |= SupportTV1024;
+-			}
+-		    }
++		   tempax |= SupportTV;
++		   if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++		      if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++			 if(resinfo == SIS_RI_1600x1200) tempax |= SupportTV1024;
++		      }
++		   }
+ 		}
+-    	}
+-    	if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
++    	} else if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
+       		tempax |= SupportLCD;
+ 		if(HwDeviceExtension->jChipType >= SIS_315H) {
+                    if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1600x1200) {
+ 		      if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1400x1050) {
+-		         if((resinfo == 6) && (SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
++		         if((resinfo == SIS_RI_640x480) && (SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
+ 			    (*i) = 0;
+                             return(1);
+ 		         } else {
+       		            if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024) {
+-        		      if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x960) {
+-           			if((resinfo == 6) && (SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
+-				    return(0);
+-				} else {
+-             			    if((resinfo >= 9) && (resinfo != 0x14)) {
++        		       if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x960) {
++           			  if((resinfo == SIS_RI_640x480) && (SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
++				     return(0);
++				  } else {
++             			     if((resinfo >= SIS_RI_1280x1024) && (resinfo != SIS_RI_1280x768)) {
+                				return(0);
+-             			    }
+-           			}
+-        		      }
++             			     }
++           			  }
++        		       }
+ 		            }
+ 		         }
+ 		      }
+       		   }
+ 		} else {
+ 		  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+-		     if((resinfo != 0x0f) && ((resinfo == 4) || (resinfo >= 8))) return(0);
++		     if( (resinfo != SIS_RI_1024x600) &&
++		         ((resinfo == SIS_RI_512x384) || (resinfo >= SIS_RI_1024x768))) return(0);
+ 		  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) {
+-		     if((resinfo != 0x10) && (resinfo > 8)) return(0);
++		     if((resinfo != SIS_RI_1152x768) && (resinfo > SIS_RI_1024x768)) return(0);
+ 		  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
+-		     if((resinfo != 0x0e) && (resinfo > 8)) return(0);
++		     if((resinfo != SIS_RI_1280x960) && (resinfo > SIS_RI_1024x768)) return(0);
+ 		  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+-		     if(resinfo > 9) return(0);
++		     if(resinfo > SIS_RI_1280x1024) return(0);
+ 		  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+-		     if(resinfo > 8) return(0);
++		     if(resinfo > SIS_RI_1024x768) return(0);
+ 		  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+-		     if((resinfo == 4) || (resinfo > 7)) return(0);
++		     if((resinfo == SIS_RI_512x384) || (resinfo > SIS_RI_800x600)) return(0);
+ 		  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+-		     if((resinfo == 4) || (resinfo == 3) || (resinfo > 6)) return(0);
++		     if((resinfo == SIS_RI_512x384) ||
++		        (resinfo == SIS_RI_400x300) ||
++			(resinfo > SIS_RI_640x480)) return(0);
+ 		  }
+ 		}
+-    	}
+-    	if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) { 
++    	} else if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+ 	        if(SiS_Pr->SiS_HiVision == 3) {
+ 		      	tempax |= SupportHiVisionTV2;
+       			if(SiS_Pr->SiS_VBInfo & SetInSlaveMode){
+-        			if(resinfo == 4) return(0);
+-        			if(resinfo == 3) return(0);
+-				if(resinfo == 7) {
++        			if(resinfo == SIS_RI_512x384) return(0);
++        			if(resinfo == SIS_RI_400x300) return(0);
++				if(resinfo == SIS_RI_800x600) {
+ 	          			if(SiS_Pr->SiS_SetFlag & TVSimuMode) return(0);
+         			}
+-        			if(resinfo > 7) return(0);
++        			if(resinfo > SIS_RI_800x600) return(0);
+ 			}
+ 		} else {  
+       			tempax |= SupportHiVisionTV;
+       			if(SiS_Pr->SiS_VBInfo & SetInSlaveMode){
+-        			if(resinfo == 4) return(0);
+-        			if((resinfo == 3) || (resinfo == 7)) {
++        			if(resinfo == SIS_RI_512x384) return(0);
++        			if((resinfo == SIS_RI_400x300) || (resinfo == SIS_RI_800x600)) {
+ 	          			if(SiS_Pr->SiS_SetFlag & TVSimuMode) return(0);
+         			}
+-        			if(resinfo > 7) return(0);
++        			if(resinfo > SIS_RI_800x600) return(0);
+ 			}
+ 		}
+-    	} else {
+-      	   if(SiS_Pr->SiS_VBInfo & (SetCRT2ToAVIDEO|SetCRT2ToSVIDEO|SetCRT2ToSCART)) {
++    	} else if(SiS_Pr->SiS_VBInfo & (SetCRT2ToAVIDEO|SetCRT2ToSVIDEO|SetCRT2ToSCART)) {
+         	tempax |= SupportTV;
+ 		tempax |= SupportTV1024;
+ 		if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-		    if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+-		        if((SiS_Pr->SiS_VBInfo & SetNotSimuMode) && (SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-			     if(resinfo != 8) {
+-			         if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
+-				     ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != 4)) ) {
+-				     tempax &= ~(SupportTV1024);
+-				     if(HwDeviceExtension->jChipType >= SIS_315H) {
+-                                         if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-				             if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
+-			                         ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != 7)) ) {
+-			                         if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
+-		                             }
+-				         }
+-		                     } else {
+-				         if( (resinfo != 3) ||
+-					     (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+-					     (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
+-					     if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-						 if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-						     if(resinfo == 3) return(0);
+-						     if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
+-						 }
+-		                             }
+-                                         } else return(0);
+-				     }
+-				 }
+-			     }
+-			} else {
+-			    tempax &= ~(SupportTV1024);
+-			    if(HwDeviceExtension->jChipType >= SIS_315H) {
+-			        if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-			            if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
+-			                ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != 7)) ) {
++		   if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
++		      if((SiS_Pr->SiS_VBInfo & SetNotSimuMode) && (SiS_Pr->SiS_VBInfo & SetPALTV)) {
++		         if(resinfo != SIS_RI_1024x768) {
++			    if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
++			        ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != SIS_RI_512x384)) ) {
++			       tempax &= ~(SupportTV1024);
++			       if(HwDeviceExtension->jChipType >= SIS_315H) {
++                                  if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++			             if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
++			                 ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != SIS_RI_800x600)) ) {
+ 			                if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
+-		                    }
+-		                }
+-			    } else {
+-			        if( (resinfo != 3) ||
+-				    (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+-				    (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
+-				     if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-					 if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-					     if(resinfo == 3) return(0);
+-					     if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
+-					 }
+ 		                     }
+-                                } else return(0);
+-                            }
+-			}
+-		    } else {  /* slavemode */
+-			if(resinfo != 8) {
+-			    if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
+-			        ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != 4) ) ) {
+-				 tempax &= ~(SupportTV1024);
+-				 if(HwDeviceExtension->jChipType >= SIS_315H) {
+-				     if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-				         if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
+-			                     ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != 7)) ) {
+-			                     if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode))  return(0);
+-		                         }
++				  }
++		               } else {
++				  if( (resinfo != SIS_RI_400x300) ||
++				      (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
++				      (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
++				     if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
++					if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++					   if(resinfo == SIS_RI_400x300) return(0);
++					   if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
++					}
+ 		                     }
+-			        } else {
+-				    if( (resinfo != 3) ||
+-				        (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+-				        (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
+-				         if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-					     if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-					         if(resinfo == 3) return(0);
+-					         if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
+-					     }
+-		                         }
+-                                    } else return(0);
+-				}
++                                  } else return(0);
++			       }
+ 			    }
+-			}
+-		    }
+-		} else {   /* 301 */
+-		    tempax &= ~(SupportTV1024);
+-		    if(HwDeviceExtension->jChipType >= SIS_315H) {
+-		        if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-		            if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
+-			        ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != 7)) ) {
+-			        if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
+-		            }
+-		        }
+-		    } else {
+-		        if( (resinfo != 3) ||
+-			    (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+-			    (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
+-			    if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-			        if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-				    if(resinfo == 3) return(0);
+-				    if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
+-				}
++			 }
++		      } else {
++			 tempax &= ~(SupportTV1024);
++			 if(HwDeviceExtension->jChipType >= SIS_315H) {
++			    if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++			       if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
++			           ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != SIS_RI_800x600)) ) {
++			          if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
++		               }
+ 		            }
+-                        } else return(0);
+-		    }
+-		}
+-           }
+-    	}
+-	
+-  } else {	/* TW: for LVDS  */
++			 } else {
++			    if( (resinfo != SIS_RI_400x300) ||
++			        (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
++				(SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
++			       if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
++				  if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++				     if(resinfo == SIS_RI_400x300) return(0);
++				     if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
++				  }
++		               }
++                            } else return(0);
++                         }
++		      }
++		   } else {  /* slavemode */
++		      if(resinfo != SIS_RI_1024x768) {
++			 if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
++			     ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != SIS_RI_512x384) ) ) {
++			    tempax &= ~(SupportTV1024);
++			    if(HwDeviceExtension->jChipType >= SIS_315H) {
++			       if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++			          if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
++			              ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != SIS_RI_800x600)) ) {
++			             if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode))  return(0);
++		                  }
++		               }
++			    } else {
++			       if( (resinfo != SIS_RI_400x300) ||
++			           (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
++			           (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
++			          if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
++				     if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++				        if(resinfo == SIS_RI_400x300) return(0);
++				        if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
++				     }
++		                  }
++                               } else return(0);
++			    }
++		  	 }
++		      }
++		   }
++	        } else {   /* 301 */
++		   tempax &= ~(SupportTV1024);
++		   if(HwDeviceExtension->jChipType >= SIS_315H) {
++		      if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++		         if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
++		             ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != SIS_RI_800x600)) ) {
++		            if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
++		         }
++		      }
++		   } else {
++		      if( (resinfo != SIS_RI_400x300) ||
++			  (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
++			  (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
++		         if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
++			    if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++			       if(resinfo == SIS_RI_400x300) return(0);
++			       if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
++			    }
++		         }
++                      } else return(0);
++		   }
++	        }
++        }
++
++  } else {	/* for LVDS  */
+ 
+     	if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+       		if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+@@ -4284,24 +4406,29 @@ SiS_AdjustCRT2Rate(SiS_Private *SiS_Pr, 
+     	if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+       		tempax |= SupportLCD;
+ 		if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
+-		     if((resinfo != 0x14) && (resinfo > 0x09)) return(0);
++		     if((resinfo != SIS_RI_1280x768) && (resinfo >= SIS_RI_1280x1024)) return(0);
+ 		} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+-		     if((resinfo != 0x0f) && (resinfo > 0x08)) return(0);
++		     if((resinfo != SIS_RI_1024x600) && (resinfo >= SIS_RI_1024x768))  return(0);
+ 		} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) {
+-		     if((resinfo != 0x10) && (resinfo > 0x08)) return(0);
++		     if((resinfo != SIS_RI_1152x768) && (resinfo > SIS_RI_1024x768))   return(0);
+ 		} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+-		     if((resinfo != 0x15) && (resinfo > 0x09)) return(0);
++		     if((resinfo != SIS_RI_1400x1050) && (resinfo > SIS_RI_1280x1024)) return(0);
++		} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
++                     if(resinfo > SIS_RI_1600x1200) return(0);
+ 		} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+-                     if(resinfo > 0x09) return(0);
++                     if(resinfo > SIS_RI_1280x1024) return(0);
+                 } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+-		     if(resinfo > 0x08) return(0);
++		     if(resinfo > SIS_RI_1024x768)  return(0);
+ 		} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600){
+-		     if(resinfo > 0x07) return(0);
+-		     if(resinfo == 0x04) return(0);
++		     if(resinfo > SIS_RI_800x600)   return(0);
++		     if(resinfo == SIS_RI_512x384)  return(0);
++		} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelBarco1366) {
++                     if((resinfo != SIS_RI_1360x1024) && (resinfo > SIS_RI_1280x1024)) return(0);
+ 		}
+     	}
+   }
+-  /* TW: Look backwards in table for matching CRT2 mode */
++  
++  /* Look backwards in table for matching CRT2 mode */
+   for(; SiS_Pr->SiS_RefIndex[RefreshRateTableIndex+(*i)].ModeID == tempbx; (*i)--) {
+      	infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + (*i)].Ext_InfoFlag;
+      	if(infoflag & tempax) {
+@@ -4309,7 +4436,7 @@ SiS_AdjustCRT2Rate(SiS_Private *SiS_Pr, 
+      	}
+      	if ((*i) == 0) break;
+   }
+-  /* TW: Look through the whole mode-section of the table from the beginning
++  /* Look through the whole mode-section of the table from the beginning
+    *     for a matching CRT2 mode if no mode was found yet.
+    */
+   for((*i) = 0; ; (*i)++) {
+@@ -4329,7 +4456,7 @@ SiS_SaveCRT2Info(SiS_Private *SiS_Pr, US
+ {
+   USHORT temp1,temp2;
+ 
+-  /* TW: We store CRT1 ModeNo in CR34 */
++  /* We store CRT1 ModeNo in CR34 */
+   SiS_SetReg1(SiS_Pr->SiS_P3d4,0x34,ModeNo);
+   temp1 = (SiS_Pr->SiS_VBInfo & SetInSlaveMode) >> 8;
+   temp2 = ~(SetInSlaveMode >> 8);
+@@ -4345,16 +4472,16 @@ SiS_GetVBInfo(SiS_Private *SiS_Pr, USHOR
+   USHORT modeflag, resinfo=0;
+   UCHAR  OutputSelect = *SiS_Pr->pSiS_OutputSelect;
+ 
+-  if(SiS_Pr->UseCustomMode) {
+-        modeflag = SiS_Pr->CModeFlag;
++  if(ModeNo <= 0x13) {
++     modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+   } else {
+-    if (ModeNo <= 0x13)
+-    	modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+-    else {
++     if(SiS_Pr->UseCustomMode) {
++        modeflag = SiS_Pr->CModeFlag;
++     } else {
+    	modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ 	resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+-    }
+-  }    
++     }
++  }
+ 
+   SiS_Pr->SiS_SetFlag = 0;
+ 
+@@ -4364,22 +4491,24 @@ SiS_GetVBInfo(SiS_Private *SiS_Pr, USHOR
+   if(SiS_BridgeIsOn(SiS_Pr,BaseAddr,HwDeviceExtension) == 0) {  
+     	temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
+ #if 0	
+-	/* SiS_HiVision is only used on 310/325/330+30xLV */
++	/* SiS_HiVision is only used on 315/330+30xLV */
+ 	if(SiS_Pr->SiS_VBType & (VB_SIS301LV302LV)) {
+-	   if(SiS_Pr->SiS_HiVision & 0x03) {	/* TW: New from 650/30xLV 1.10.6s */
++	   if(SiS_Pr->SiS_HiVision & 0x03) {	/* New from 650/30xLV 1.10.6s */
+ 	      temp &= (SetCRT2ToHiVisionTV | SwitchToCRT2 | SetSimuScanMode); 	/* 0x83 */
+ 	      temp |= SetCRT2ToHiVisionTV;   					/* 0x80 */
+ 	   }
+-	   if(SiS_Pr->SiS_HiVision & 0x04) {	/* TW: New from 650/30xLV 1.10.6s */
++	   if(SiS_Pr->SiS_HiVision & 0x04) {	/* New from 650/30xLV 1.10.6s */
+ 	      temp &= (SetCRT2ToHiVisionTV | SwitchToCRT2 | SetSimuScanMode); 	/* 0x83 */
+ 	      temp |= SetCRT2ToSVIDEO;  					/* 0x08 */
+ 	   }
+ 	}
+-#endif	
++#endif
++#if 0
+     	if(SiS_Pr->SiS_IF_DEF_FSTN) {   /* fstn must set CR30=0x21 */
+        		temp = (SetCRT2ToLCD | SetSimuScanMode);
+        		SiS_SetReg1(SiS_Pr->SiS_P3d4,0x30,temp);
+     	}
++#endif	
+     	tempbx |= temp;
+     	tempax = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) << 8;
+         tempax &= (LoadDACFlag | DriverMode | SetDispDevSwitch | SetNotSimuMode | SetPALTV);
+@@ -4519,7 +4648,7 @@ SiS_GetVBInfo(SiS_Private *SiS_Pr, USHOR
+       		tempbx |= SetSimuScanMode;
+     	}
+ 
+-	/* TW: LVDS (LCD/TV) and 301BDH (LCD) can only be slave in 8bpp modes */
++	/* LVDS (LCD/TV) and 301BDH (LCD) can only be slave in 8bpp modes */
+ 	if(SiS_Pr->SiS_ModeType <= ModeVGA) {
+ 	   if( (SiS_Pr->SiS_IF_DEF_LVDS == 1) ||
+ 	       ((tempbx & SetCRT2ToLCD) && (SiS_Pr->SiS_VBType & VB_NoLCD)) ) {
+@@ -4527,12 +4656,12 @@ SiS_GetVBInfo(SiS_Private *SiS_Pr, USHOR
+ 	   }
+ 	}
+ 	
+-    	if(!(tempbx & SetSimuScanMode)){
++    	if(!(tempbx & SetSimuScanMode)) {
+       	    if(tempbx & SwitchToCRT2) {
+         	if((!(modeflag & CRT2Mode)) && (checkcrt2mode)) {
+ 		     if( (HwDeviceExtension->jChipType >= SIS_315H) &&
+ 			 (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) ) {
+-			 if(resinfo != 0x0a)
++			 if(resinfo != SIS_RI_1600x1200)
+                               tempbx |= SetSimuScanMode;
+ 		     } else {
+             		      tempbx |= SetSimuScanMode;
+@@ -4555,7 +4684,7 @@ SiS_GetVBInfo(SiS_Private *SiS_Pr, USHOR
+           	    if((!(modeflag & CRT2Mode)) && (checkcrt2mode)) {
+ 	                if( (HwDeviceExtension->jChipType >= SIS_315H) &&
+ 			    (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) ) {
+-			     if(resinfo != 0x0a) {  /* TW: 650/301 BIOS */
++			     if(resinfo != SIS_RI_1600x1200) {  /* 650/301 BIOS */
+ 			          tempbx |= SetInSlaveMode;
+             		          if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+               		 	     if(tempbx & SetCRT2ToTV) {
+@@ -4563,7 +4692,7 @@ SiS_GetVBInfo(SiS_Private *SiS_Pr, USHOR
+ 					     SiS_Pr->SiS_SetFlag |= TVSimuMode;
+               			     }
+                                   }
+-			     }                      /* TW: 650/301 BIOS */
++			     }                      /* 650/301 BIOS */
+ 		        } else {
+             		    tempbx |= SetInSlaveMode;
+             		    if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+@@ -4621,7 +4750,7 @@ SiS_GetVBInfo(SiS_Private *SiS_Pr, USHOR
+      	if(HwDeviceExtension->jChipType >= SIS_315H) {
+ 	        if(ROMAddr && SiS_Pr->SiS_UseROM) {
+ 		    OutputSelect = ROMAddr[0xf3];
+-		    if(HwDeviceExtension->jChipType == SIS_330) {
++		    if(HwDeviceExtension->jChipType >= SIS_330) {
+ 			OutputSelect = ROMAddr[0x11b];
+ 		    }
+                 }
+@@ -4652,7 +4781,7 @@ SiS_GetVBInfo(SiS_Private *SiS_Pr, USHOR
+   SiS_Pr->SiS_VBInfo = tempbx;
+ 
+   if(HwDeviceExtension->jChipType == SIS_630) {
+-       SiS_WhatIsThis(SiS_Pr, SiS_Pr->SiS_VBInfo);
++       SiS_SetChrontelGPIO(SiS_Pr, SiS_Pr->SiS_VBInfo);
+   }
+ 
+ #ifdef TWDEBUG
+@@ -4666,61 +4795,35 @@ SiS_GetVBInfo(SiS_Private *SiS_Pr, USHOR
+ #endif
+ #endif
+ 
+-#if 0  /* TW: Incomplete! (But does not seem to be required) */
+-  if(HwDeviceExtension->jChipType < SIS_315H) {
+-     /* TW: From A901/630+301B BIOS */
+-     if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-         if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x80)
+-     }
+-     if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
+-         if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x80)
+-	     if( [si] == 3) ModeIdIndex = 0x3f2b;
+-	 }
+-     }
+-     SiS_SetRegAND(SiS_Pr->SiS_P3d4, 0x31, 0xF7);
+-     if(ModeNo == 0x13) bp+4 = 0x03;
+-  } else {
+-     /* From 650/30xLV BIOS: */
+-     SiS_SetRegAND(SiS_Pr->SiS_P3d4, 0x31, 0xF7);
+-     if(ModeNo == 0x13) bp+4 = 0x03;
+-     else bp+4 = ModeNo;
+-  }
+-#endif
+-
+-  /* TW: 630/301B and 650/301 (not 301LV!) BIOSes do more here, but this seems for DOS mode */
+-
+ }
+ 
++/* Setup general purpose IO for Chrontel communication */
+ void
+-SiS_WhatIsThis(SiS_Private *SiS_Pr, USHORT myvbinfo)
++SiS_SetChrontelGPIO(SiS_Private *SiS_Pr, USHORT myvbinfo)
+ {
+-   unsigned long eax, temp;
+-   unsigned short temp1;
++   unsigned long  acpibase;
++   unsigned short temp;
+ 
+    if(!(SiS_Pr->SiS_ChSW)) return;
+ 
+ #ifndef LINUX_XF86
+-   SiS_SetReg4(0xcf8,0x80000874);
+-   eax = SiS_GetReg3(0xcfc);
++   SiS_SetReg4(0xcf8,0x80000874);		   /* get ACPI base */
++   acpibase = SiS_GetReg3(0xcfc);
+ #else
+-   eax = pciReadLong(0x00000800, 0x74);
++   acpibase = pciReadLong(0x00000800, 0x74);
+ #endif
+-   eax &= 0xFFFF;
+-   temp = eax;
+-   eax += 0x3c;
+-   temp1 = SiS_GetReg4((USHORT)eax);
+-   temp1 &= 0xFEFF;
+-   SiS_SetReg5((USHORT)eax, temp1);
+-   temp1 = SiS_GetReg4((USHORT)eax);
+-   eax = temp;
+-   eax += 0x3a;
+-   temp1 = SiS_GetReg4((USHORT)eax);
+-   temp1 &= 0xFEFF;
++   acpibase &= 0xFFFF;
++   temp = SiS_GetReg4((USHORT)(acpibase + 0x3c));  /* ACPI register 0x3c: GP Event 1 I/O mode select */
++   temp &= 0xFEFF;
++   SiS_SetReg5((USHORT)(acpibase + 0x3c), temp);
++   temp = SiS_GetReg4((USHORT)(acpibase + 0x3c));
++   temp = SiS_GetReg4((USHORT)(acpibase + 0x3a));  /* ACPI register 0x3a: GP Pin Level (low/high) */
++   temp &= 0xFEFF;
+    if(!(myvbinfo & SetCRT2ToTV)) {
+-      temp1 |= 0x0100;
++      temp |= 0x0100;
+    }
+-   SiS_SetReg5((USHORT)eax, temp1);
+-   temp1 = SiS_GetReg4((USHORT)eax);
++   SiS_SetReg5((USHORT)(acpibase + 0x3a), temp);
++   temp = SiS_GetReg4((USHORT)(acpibase + 0x3a));
+ }
+ 
+ void
+@@ -4731,14 +4834,14 @@ SiS_GetRAMDAC2DATA(SiS_Private *SiS_Pr, 
+   USHORT temp1=0,modeflag=0,tempcx=0;
+   USHORT StandTableIndex,CRT1Index;
+ #ifdef SIS315H   
+-  USHORT ResInfo,DisplayType,temp=0;
++  USHORT ResIndex,DisplayType,temp=0;
+   const  SiS_LVDSCRT1DataStruct *LVDSCRT1Ptr = NULL;
+ #endif
+ 
+   SiS_Pr->SiS_RVBHCMAX  = 1;
+   SiS_Pr->SiS_RVBHCFACT = 1;
+ 
+-  if(ModeNo <= 0x13){
++  if(ModeNo <= 0x13) {
+ 
+     	modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+     	StandTableIndex = SiS_GetModePtr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex);
+@@ -4752,7 +4855,7 @@ SiS_GetRAMDAC2DATA(SiS_Private *SiS_Pr, 
+ 
+ #ifdef SIS315H     
+     	temp = SiS_GetLVDSCRT1Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+-			RefreshRateTableIndex,&ResInfo,&DisplayType);
++			RefreshRateTableIndex,&ResIndex,&DisplayType);
+ 
+     	if(temp == 0)  return;
+ 
+@@ -4795,16 +4898,16 @@ SiS_GetRAMDAC2DATA(SiS_Private *SiS_Pr, 
+ 		case 99: LVDSCRT1Ptr = SiS_Pr->SiS_CHTVCRT1OPAL;                break;
+ 		default: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_1;          break;
+     	}
+-	tempax = (LVDSCRT1Ptr+ResInfo)->CR[0];
+-	tempax |= (LVDSCRT1Ptr+ResInfo)->CR[14] << 8;
++	tempax = (LVDSCRT1Ptr+ResIndex)->CR[0];
++	tempax |= (LVDSCRT1Ptr+ResIndex)->CR[14] << 8;
+ 	tempax &= 0x03FF;
+-    	tempbx = (LVDSCRT1Ptr+ResInfo)->CR[6];
+-    	tempcx = (LVDSCRT1Ptr+ResInfo)->CR[13] << 8;
++    	tempbx = (LVDSCRT1Ptr+ResIndex)->CR[6];
++    	tempcx = (LVDSCRT1Ptr+ResIndex)->CR[13] << 8;
+     	tempcx &= 0x0100;
+     	tempcx <<= 2;
+     	tempbx |= tempcx;
+-	temp1  = (LVDSCRT1Ptr+ResInfo)->CR[7];
+-#endif	
++	temp1  = (LVDSCRT1Ptr+ResIndex)->CR[7];
++#endif
+ 
+     } else {
+ 
+@@ -4840,11 +4943,12 @@ SiS_GetRAMDAC2DATA(SiS_Private *SiS_Pr, 
+   if(modeflag & Charx8Dot) tempax *= 8;
+   else                     tempax *= 9;
+ 
+-  /* TW: From 650/30xLV 1.10.6s */
++  /* From 650/30xLV 1.10.6s */
+   if(modeflag & HalfDCLK)  tempax <<= 1;
+ 
+-  SiS_Pr->SiS_VGAHT = SiS_Pr->SiS_HT = tempax;
+   tempbx++;
++
++  SiS_Pr->SiS_VGAHT = SiS_Pr->SiS_HT = tempax;
+   SiS_Pr->SiS_VGAVT = SiS_Pr->SiS_VT = tempbx;
+ }
+ 
+@@ -4852,18 +4956,18 @@ void
+ SiS_UnLockCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
+ {
+   if(HwDeviceExtension->jChipType >= SIS_315H)
+-    	SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2f,0x01);
++     SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2f,0x01);
+   else
+-    	SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x24,0x01);
++     SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x24,0x01);
+ }
+ 
+ void
+ SiS_LockCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
+ {
+   if(HwDeviceExtension->jChipType >= SIS_315H)
+-    	SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2F,0xFE);
++     SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2F,0xFE);
+   else
+-     	SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x24,0xFE);
++     SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x24,0xFE);
+ }
+ 
+ void
+@@ -4872,7 +4976,6 @@ SiS_EnableCRT2(SiS_Private *SiS_Pr)
+   SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
+ }
+ 
+-/* Checked against all BIOSes */
+ void
+ SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
+ {
+@@ -4882,9 +4985,9 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+   USHORT temp=0;
+   UCHAR *ROMAddr = HwDeviceExtension->pjVirtualRomBase;
+ 
+-  if (SiS_Pr->SiS_IF_DEF_LVDS == 0) {
++  if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ 
+-      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {   /* ===== TW: For 30xB/LV ===== */
++      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {   /* ===== For 30xB/LV ===== */
+ 
+         if(HwDeviceExtension->jChipType < SIS_315H) {
+ 
+@@ -4940,9 +5043,9 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+ 
+         } else {
+ 
+-#ifdef SIS315H	   /* 310/325 series */
++#ifdef SIS315H	   /* 315 series */
+ 
+-           if(IS_SIS650740) {		/* 650, 740 */
++           if(IS_SIS550650740660) {		/* 550, 650, 740, 660 */
+ 
+ #if 0
+ 	      if(SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x00) != 1) return;	/* From 1.10.7w */
+@@ -4966,22 +5069,35 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+ 	         SiS_SetReg3(SiS_Pr->SiS_P3c6,0x00);
+ 
+                  pushax = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06);
+-		 
++
+ 		 if(IS_SIS740) {
+ 		    SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x06,0xE3);
+ 		 }
+ 
+ 	         SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
+-		 
+-		 if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-	            tempah = 0xef;
+-	            if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-	               tempah = 0xf7;
+-                    }
+-	            SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,tempah);
++
++		 if(!(IS_SIS740)) {
++		    if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++	               tempah = 0xef;
++	               if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++	                  tempah = 0xf7;
++                       }
++	               SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,tempah);
++		    }
+ 	         }
+ 
+-              }
++              } else if(SiS_Pr->SiS_VBType & VB_NoLCD) {
++	         if(HwDeviceExtension->jChipType == SIS_650) {
++	            if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++	               SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,0xef);
++	            }
++		    if((!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) ||
++		       (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ) {
++	     	       SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFE,0x00);
++	            }
++		    SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 3);
++		 }
++	      }
+ 
+               if(SiS_Pr->SiS_VBType & VB_SIS301B302B) {
+ 	         tempah = 0x3f;
+@@ -5046,8 +5162,8 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+ 
+ 	      if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+ 
+-		 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,~0x10);    /* 1.10.8r */
+-		 
++		 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,~0x10);    		/* 1.10.8r, 8m */
++
+ 	         tempah = 0x3f;
+ 	         if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ 	            tempah = 0x7f;
+@@ -5057,9 +5173,9 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+ 	         }
+ 	         SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1F,tempah);
+ 
+-		 if(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr)) {   /* 1.10.8r */
++		 if(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr)) {   /* 1.10.8r, 8m */
+ 	            SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
+-		 }								/* 1.10.8r */
++		 }								/* 1.10.8r, 8m */
+ 
+ 	         if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ 	            SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xdf);
+@@ -5075,81 +5191,33 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+ 
+ 	         SiS_SetReg1(SiS_Pr->SiS_P3c4,0x06,pushax);
+ 
+-  	      }
+-
+-#if 0
+-          } else if(IS_SIS740) {	/* 740 */
+-	  
+-	     if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {   /* 30xLV */
+-	     
+-	        if( (!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) ||
+-		    (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ) {
+-	     	      SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFE,0x00);
+-	        }
+-		
+-		SiS_SetReg3(SiS_Pr->SiS_P3c6,0x00);
++  	      } else if(SiS_Pr->SiS_VBType & VB_NoLCD) {
++	         if(HwDeviceExtension->jChipType == SIS_650) {
++		    if((SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
++		       (!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)))) {
++		       if((!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) ||
++		          (!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)))) {
++			  SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 2);
++	     	          SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFD,0x00);
++			  SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 4);
++	               }
++		    }
++		 }
++	      } else if(SiS_Pr->SiS_VBType & VB_SIS301B302B) {
++	         if(HwDeviceExtension->jChipType == SIS_650) {
++		    if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++	               tempah = 0xef;
++	               if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++		          if(modenum > 0x13) {
++	                     tempah = 0xf7;
++			  }
++                       }
++	               SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,tempah);
++		    }
++		 }
++	      }
+ 
+-                pushax = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06);
+-		
+-		SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x06,0xE3);
+-
+-	        SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
+-		
+-		if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-		   SiS_DisplayOff(SiS_Pr);
+-	           SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
+-	           SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
+-	           SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1E,0xDF);
+-		} else {
+-		   SiS_DisplayOff(SiS_Pr);
+-	           SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
+-	           SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
+-	           SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
+-	           temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00);
+-                   SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x10);
+-	           SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
+-	           SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x00,temp);
+-		}
+-		
+-		SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1F,0x3F);
+-		SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1F,0xEF);  /* (from 650) */
+-		
+-		SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
+-		
+-		if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-	           SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xdf);
+-	        }
+-		
+-		if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-		   if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-	              if(!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) {
+-	                 if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-		            SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFD,0x00);
+-                         }
+-                      }
+-	           }
+-		}
+-	        SiS_SetReg1(SiS_Pr->SiS_P3c4,0x06,pushax);
+-	     
+-	     } else {	/* (301,) 301B */
+-	  
+-	        if(SiS_Is301B(SiS_Pr,BaseAddr)) {
+-	           SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1F,0x3F);
+-	        }
+-	     
+-	        SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xDF);
+-	        SiS_DisplayOff(SiS_Pr);
+-	        SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
+-	        SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
+-
+-	        temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00);
+-                SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x10);
+-	        SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
+-	        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x00,temp);
+-		
+-	     }
+-#endif	  
+-	  } else {			/* 315, 330 - all bridge types */
++	  } else {			/* 315, 330 - all bridge types */
+ 
+ 	     if(SiS_Is301B(SiS_Pr,BaseAddr)) {
+ 	        tempah = 0x3f;
+@@ -5193,13 +5261,13 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+ 
+ 	}
+ 
+-      } else {     /* ============ TW: For 301 ================ */
++      } else {     /* ============ For 301 ================ */
+ 
+         if(HwDeviceExtension->jChipType < SIS_315H) {
+-            if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) {
+-                SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF0,0x0B);
+-	        SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 1);
+-	    }
++            if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) {
++	      SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF7,0x08);
++	      SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
++	   }
+ 	}
+ 
+         SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xDF);           /* disable VB */
+@@ -5218,18 +5286,23 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+ 	    SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x00,temp);
+ 	} else {
+             SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);            /* disable CRT2 */
++	    if( (!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) ||
++	        (!(SiS_CR36BIOSWord23d(SiS_Pr,HwDeviceExtension))) ) {
++		SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
++		SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xFB,0x04);
++	    }
+ 	}
+ 
+       }
+ 
+-  } else {     /* ============ TW: For LVDS =============*/
++  } else {     /* ============ For LVDS =============*/
+ 
+     if(HwDeviceExtension->jChipType < SIS_315H) {
+ 
+ #ifdef SIS300	/* 300 series */
+ 
+ 	if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
+-	    SiS_SetCH700x(SiS_Pr,0x090E);
++	   SiS_SetCH700x(SiS_Pr,0x090E);
+ 	}
+ 
+ 	if(HwDeviceExtension->jChipType == SIS_730) {
+@@ -5245,17 +5318,17 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+ 
+ 	      if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x40)) {
+   
+-  	          if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) {
++  	         if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) {
+ 
+-                     SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
++                    SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
+ 
+-		     if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06) & 0x1c)) {
+-		         SiS_DisplayOff(SiS_Pr);
+-	             }
++		    if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06) & 0x1c)) {
++		        SiS_DisplayOff(SiS_Pr);
++	            }
+ 
+-	             SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF7,0x08);
+-	             SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
+-                  }
++	            SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF7,0x08);
++	            SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
++                 }
+               }
+ 	   }
+ 	}
+@@ -5279,29 +5352,40 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+ 
+     } else {
+ 
+-#ifdef SIS315H	/* 310/325 series */
++#ifdef SIS315H	/* 315 series */
+ 
+ 	if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+-		temp = SiS_GetCH701x(SiS_Pr,0x61);
+-		if(temp < 1) {
+-		   SiS_SetCH701x(SiS_Pr,0xac76);
+-		   SiS_SetCH701x(SiS_Pr,0x0066);
+-		}
+-		
+-		if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++
++		if(HwDeviceExtension->jChipType == SIS_740) {
++		   temp = SiS_GetCH701x(SiS_Pr,0x61);
++		   if(temp < 1) {
++		      SiS_SetCH701x(SiS_Pr,0xac76);
++		      SiS_SetCH701x(SiS_Pr,0x0066);
++		   }
++
++		   if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ 			SiS_SetCH701x(SiS_Pr,0x3e49);
+-		} else if(SiS_IsTVOrYPbPrOrScart(SiS_Pr,HwDeviceExtension, BaseAddr))  {
++		   } else if(SiS_IsTVOrYPbPrOrScart(SiS_Pr,HwDeviceExtension, BaseAddr))  {
+ 			SiS_SetCH701x(SiS_Pr,0x3e49);
++		   }
+ 		}
+-		
++
+ 		if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ 			SiS_Chrontel701xBLOff(SiS_Pr);
+-			SiS_Chrontel701xOff(SiS_Pr);
++			SiS_Chrontel701xOff(SiS_Pr,HwDeviceExtension);
+ 		} else if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ 			SiS_Chrontel701xBLOff(SiS_Pr);
+-			SiS_Chrontel701xOff(SiS_Pr);
++			SiS_Chrontel701xOff(SiS_Pr,HwDeviceExtension);
+ 		}
+-		
++
++		if(HwDeviceExtension->jChipType != SIS_740) {
++		   if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++			SiS_SetCH701x(SiS_Pr,0x0149);
++		   } else if(SiS_IsTVOrYPbPrOrScart(SiS_Pr,HwDeviceExtension, BaseAddr))  {
++			SiS_SetCH701x(SiS_Pr,0x0149);
++		   }
++		}
++
+ 	}
+ 
+ 	if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
+@@ -5325,6 +5409,10 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+ 		SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
+ 	}
+ 
++	if(HwDeviceExtension->jChipType == SIS_740) {
++	   SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
++	}
++
+ 	SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
+ 
+ 	if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
+@@ -5337,15 +5425,27 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+ 
+ 	if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
+ 	        if(SiS_CRT2IsLCD(SiS_Pr, BaseAddr,HwDeviceExtension)) {
+-			SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
++		   SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
++		   if(HwDeviceExtension->jChipType == SIS_550) {
++		      SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xbf);
++		      SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xef);
++		   }
++		}
++	} else {
++	   if(HwDeviceExtension->jChipType == SIS_740) {
++	        if(SiS_IsLCDOrLCDA(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++		   SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
+ 		}
+-	} else if(SiS_IsLCDOrLCDA(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-		SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
++	   } else {
++	        if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++		   SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
++	        }
++	   }
+ 	}
+ 
+ 	if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+ 	    	if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-			SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xff);
++			/* SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xff); */
+ 		} else {
+ 			SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xfb);
+ 		}
+@@ -5353,7 +5453,10 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+ 
+ 	SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension, BaseAddr);
+ 
+-	if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
++	if(HwDeviceExtension->jChipType == SIS_550) {
++	        SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x01,0x80);
++		SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x02,0x40);
++	} else if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
+ 		SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0xf7);
+ 	} else if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ 		SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0xf7);
+@@ -5361,7 +5464,7 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+ 		SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0xf7);
+ 	}
+ 
+-#if 0  /* TW: BIOS code makes no sense */
++#if 0  /* BIOS code makes no sense */
+        if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+            if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ 	        if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+@@ -5387,7 +5490,6 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+ 
+ }
+ 
+-/* TW: Checked against all BIOSes */
+ void
+ SiS_EnableBridge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+ {
+@@ -5400,7 +5502,7 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+ 
+   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ 
+-    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {   /* TW: ====== For 301B et al  ====== */
++    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {   /* ====== For 301B et al  ====== */
+ 
+       if(HwDeviceExtension->jChipType < SIS_315H) {
+ 
+@@ -5497,9 +5599,9 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+ 
+       } else {
+ 
+-#ifdef SIS315H    /* 310/325 series */
++#ifdef SIS315H    /* 315 series */
+ 
+-	 if(IS_SIS650740) {		/* 650 */
++	 if(IS_SIS550650740660) {		/* 550, 650, 740, 660 */
+ 
+ #if 0
+ 	    if(SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x00) != 1) return;	/* From 1.10.7w */
+@@ -5541,7 +5643,32 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+ 		  delaylong = TRUE;
+ 	       }
+ 
+-	    }
++	    } else if(SiS_Pr->SiS_VBType & VB_NoLCD) {
++	       if(HwDeviceExtension->jChipType == SIS_650) {
++	          if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++	             SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x4c,0x10);
++	          }
++		  if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
++		      (SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) ) {
++		     SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
++		     SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 0);
++		  }
++	       }
++  	    } else if(SiS_Pr->SiS_VBType & VB_SIS301B302B) {
++
++	         if(HwDeviceExtension->jChipType == SIS_650) {
++		    if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++	               tempah = 0x10;
++		       if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x13) & 0x04) {
++		          tempah = 0x18;
++		          if((SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x00) & 0x0f) == 0x0c) {
++			     tempah = 0x08;
++			  }
++		       }
++	               SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x4c,tempah);
++		    }
++		 }
++	      }
+ 
+ 	    if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+                temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32) & 0xDF;
+@@ -5595,11 +5722,24 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+ 	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);	/* All this from 1.10.7u */
+ 	       SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x0c);
+ 	       SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x20);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x05);  
+-	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x60);  
+-	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x00);  
+-	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10); 
+-	       SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40); 
++
++	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x12);
++	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0xd0);
++	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x6b);
++	       if((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0x0f) == 0x02) {
++	          SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x0d);
++	          SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x70);
++	          SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x40);
++		  if(((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xf0) != 0x03)) {
++		     SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x05);
++	             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x60);
++	             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x33);  /* 00 */
++		  }
++	       }
++	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
++	       if((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0x0f) != 0x03) {
++	          SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40);
++	       }
+ 	       
+ 	       SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
+ 	    
+@@ -5610,127 +5750,44 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+ 	       if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ 	          if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
+ 	              ((SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) ) {
+-		    SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10);
+-		    if(delaylong) {
++		     SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10);
++		     if(delaylong) {
+ 			SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10);
+-		    }
+-                    SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
+-		    SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xfe,0x01);
+-	         }
+-	      }
++		     }
++                     SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
++		     SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xfe,0x01);
++	          }
++	       }
+ 
+-	      SiS_SetReg1(SiS_Pr->SiS_P3c4,0x06,pushax);
+-	      SiS_DisplayOn(SiS_Pr);
+-	      SiS_SetReg3(SiS_Pr->SiS_P3c6,0xff);
++	       SiS_SetReg1(SiS_Pr->SiS_P3c4,0x06,pushax);
++	       SiS_DisplayOn(SiS_Pr);
++	       SiS_SetReg3(SiS_Pr->SiS_P3c6,0xff);
+ 
+-	      if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++	       if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ 	          SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
+-	      }
++	       }
+ #if 0
+-              SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
+-	      SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x0c);
+-	      SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x20);
+-	      SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x05);   /* 1.10.8r: 0x0d */
+-	      SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x60);   /* 1.10.8r: 0x70 */
+-	      SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x00);   /* 1.10.8r: 0x40 */
+-	      SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10); 
+-	      SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40); 
++               SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
++	       SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x0c);
++	       SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x20);
++	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x05);   /* 1.10.8r: 0x0d */
++	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x60);   /* 1.10.8r: 0x70 */
++	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x00);   /* 1.10.8r: 0x40 */
++	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
++	       SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40);
+ #endif	      
++	    } if(SiS_Pr->SiS_VBType & VB_NoLCD) {
++	       if(HwDeviceExtension->jChipType == SIS_650) {
++	          if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++		     if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
++		         (SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) ) {
++			SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1);
++		        SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x01);
++		     }
++		  }
++	       }
++  	    }
+ 
+-	  }
+-
+-#if 0
+-         } else if(IS_SIS740) {		/* 740 */
+-	 
+-	   if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {  /* 30xLV */
+-	   
+-	      SiS_SetReg3(SiS_Pr->SiS_P3c6,0x00);
+-	      SiS_DisplayOff(SiS_Pr);
+-	      pushax = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06);
+-	      SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x06,0xE3);
+-	      
+-	      if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
+-	          (SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) ) {
+-                   if(!(SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x26) & 0x02)) {
+-		      SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
+-	              SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
+-		   }
+-	      }
+-	      
+-	      if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-	         temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32) & 0xDF;
+-	         if(SiS_BridgeInSlave(SiS_Pr)) {
+-                    tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
+-                    if(!(tempah & SetCRT2ToRAMDAC))  temp |= 0x20;
+-                 }
+-                 SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp);
+-
+-	         SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);  	
+-		 SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
+-	      }
+-	      
+-	      if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-	         SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
+-	      }
+-	      
+-	      SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1f,0x20);
+-	      SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,0xC0);
+-	      SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,0x10);  /* (taken from 650 1.10.8r) */
+-	      SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80);
+-	      
+-	      if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-	         if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
+-	             (SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) ) {
+-		    SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10);
+-		    if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x40) {
+-		       SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
+-		    }
+-		    SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xfe,0x01);
+-		    SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10);
+-		    SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
+-	         }
+-              }
+-	      
+-	      SiS_SetReg1(SiS_Pr->SiS_P3c4,0x06,pushax);
+-	      SiS_DisplayOn(SiS_Pr);
+-	      SiS_SetReg3(SiS_Pr->SiS_P3c6,0xff);
+-	      
+-	      if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-	         SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
+-	      }
+-	   
+-	   } else {	/* (301), 301B */
+-	 
+-	      if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-	         temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32) & 0xDF;
+-	         if(SiS_BridgeInSlave(SiS_Pr)) {
+-                    tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
+-                    if(!(tempah & SetCRT2ToRAMDAC))  temp |= 0x20;
+-                 }
+-                 SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp);
+-
+-	         SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);                   /* enable CRT2 */
+-
+-	         temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2E);
+-                 if(!(temp & 0x80))
+-                    SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80);
+-              }
+-
+-	      SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1f,0x20);
+-
+-	      if(SiS_Is301B(SiS_Pr,BaseAddr)) { 
+-	         SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,0xC0);
+-	         SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
+-	      } else {
+-	         SiS_VBLongWait(SiS_Pr);
+-                 SiS_DisplayOn(SiS_Pr);
+-	         SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7F);
+-                 SiS_VBLongWait(SiS_Pr);
+-	      }
+-	      
+-	   }
+-#endif
+-	  
+ 	 } else {			/* 315, 330 */
+ 
+ 	   if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+@@ -5782,11 +5839,11 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+ 
+       }
+ 
+-    } else {	/* ============  TW: For 301 ================ */
++    } else {	/* ============  For 301 ================ */
+ 
+        if(HwDeviceExtension->jChipType < SIS_315H) {
+             if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) {
+-                SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF0,0x0B);
++                SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xFB);
+ 	        SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 0);
+ 	    }
+        }
+@@ -5818,13 +5875,13 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+        if(HwDeviceExtension->jChipType < SIS_315H) {
+             if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) {
+ 	        SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 1);
+-                SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF0,0x03);
++                SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xF7);
+ 	    }
+        }
+ 
+     }
+ 
+-  } else {   /* =================== TW: For LVDS ================== */
++  } else {   /* =================== For LVDS ================== */
+ 
+     if(HwDeviceExtension->jChipType < SIS_315H) {
+ 
+@@ -5875,7 +5932,7 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+ 
+     } else {
+ 
+-#ifdef SIS315H    /* 310/325 series */
++#ifdef SIS315H    /* 315 series */
+ 
+ #if 0  /* BIOS code makes no sense */
+        if(SiS_IsVAMode()) {
+@@ -5902,36 +5959,41 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+ 	  SiS_Chrontel701xBLOff(SiS_Pr);
+        }
+ 
+-       SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
+-       
+-#ifdef NEWCH701x
+-       if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
+-           if(SiS_IsLCDOrLCDA(SiS_Pr,HwDeviceExtension,BaseAddr)) {
++       if(HwDeviceExtension->jChipType != SIS_550) {
++          SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
++       }
++
++       if(HwDeviceExtension->jChipType == SIS_740) {
++          if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
++             if(SiS_IsLCDOrLCDA(SiS_Pr,HwDeviceExtension,BaseAddr)) {
+ 	   	SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
+-	   }
++	     }
++	  }
+        }
+-#endif       
+ 
+        temp1 = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2E);
+-       if (!(temp1 & 0x80))
++       if(!(temp1 & 0x80))
+            SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80);
+ 
+        if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
+            if(temp) {
+-	       SiS_Chrontel701xBLOn(SiS_Pr);
++	       SiS_Chrontel701xBLOn(SiS_Pr, HwDeviceExtension);
+ 	   }
+        }
+ 
+        if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
+            if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) {
+ 	   	SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
++		if(HwDeviceExtension->jChipType == SIS_550) {
++		   SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x40);
++		   SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x10);
++		}
++	   }
++       } else if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++           if(HwDeviceExtension->jChipType != SIS_740) {
++              SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
+ 	   }
+-       } 
+-#ifndef NEWCH701x       
+-         else if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-           SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
+        }
+-#endif       
+ 
+        if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+            SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
+@@ -5954,10 +6016,10 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+        if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
+        	 	if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+  	   		if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-	            		SiS_Chrontel701xBLOn(SiS_Pr);
++	            		SiS_Chrontel701xBLOn(SiS_Pr, HwDeviceExtension);
+ 	            		SiS_ChrontelDoSomething4(SiS_Pr,HwDeviceExtension, BaseAddr);
+            		} else if(SiS_IsLCDOrLCDA(SiS_Pr,HwDeviceExtension, BaseAddr))  {
+-       				SiS_Chrontel701xBLOn(SiS_Pr);
++       				SiS_Chrontel701xBLOn(SiS_Pr, HwDeviceExtension);
+        				SiS_ChrontelDoSomething4(SiS_Pr,HwDeviceExtension, BaseAddr);
+ 	   		}
+        		}
+@@ -5983,7 +6045,7 @@ SiS_SiS30xBLOn(SiS_Private *SiS_Pr, PSIS
+ {
+   USHORT  BaseAddr = (USHORT)HwDeviceExtension->ulIOAddress;
+ 
+-  /* TW: Switch on LCD backlight on SiS30xLV */
++  /* Switch on LCD backlight on SiS30xLV */
+   if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
+       (SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) ) {
+     if(!(SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x26) & 0x02)) {
+@@ -6001,7 +6063,7 @@ SiS_SiS30xBLOff(SiS_Private *SiS_Pr, PSI
+ {
+   USHORT  BaseAddr = (USHORT)HwDeviceExtension->ulIOAddress;
+ 
+-  /* TW: Switch off LCD backlight on SiS30xLV */
++  /* Switch off LCD backlight on SiS30xLV */
+   if( (!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) ||
+       (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ) {
+ 	 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFE,0x00);
+@@ -6023,12 +6085,14 @@ SiS_CR36BIOSWord23b(SiS_Private *SiS_Pr,
+   UCHAR *ROMAddr;
+ 
+   if((ROMAddr = (UCHAR *)HwDeviceExtension->pjVirtualRomBase) && SiS_Pr->SiS_UseROM) {
+-     temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xff;
+-     temp >>= 4;
+-     temp = 1 << temp;
+-     temp1 = (ROMAddr[0x23c] << 8) | ROMAddr[0x23b];
+-     if(temp1 & temp) return(1);
+-     else return(0);
++     if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
++        temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xff;
++        temp >>= 4;
++        temp = 1 << temp;
++        temp1 = (ROMAddr[0x23c] << 8) | ROMAddr[0x23b];
++        if(temp1 & temp) return(1);
++        else return(0);
++     } else return(0);
+   } else {
+      return(0);
+   }
+@@ -6041,12 +6105,14 @@ SiS_CR36BIOSWord23d(SiS_Private *SiS_Pr,
+   UCHAR *ROMAddr;
+ 
+   if((ROMAddr = (UCHAR *)HwDeviceExtension->pjVirtualRomBase) && SiS_Pr->SiS_UseROM) {
+-     temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xff;
+-     temp >>= 4;
+-     temp = 1 << temp;
+-     temp1 = (ROMAddr[0x23e] << 8) | ROMAddr[0x23d];
+-     if(temp1 & temp) return(1);
+-     else return(0);
++     if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
++        temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xff;
++        temp >>= 4;
++        temp = 1 << temp;
++        temp1 = (ROMAddr[0x23e] << 8) | ROMAddr[0x23d];
++        if(temp1 & temp) return(1);
++        else return(0);
++     } else return(0);
+   } else {
+      return(0);
+   }
+@@ -6143,7 +6209,7 @@ SiS_SetPanelDelay(SiS_Private *SiS_Pr, U
+ 
+ #ifdef SIS315H
+ 
+-      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {			/* 310/325 series, LVDS */
++      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {			/* 315 series, LVDS */
+ 
+           if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
+               PanelID = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36);
+@@ -6171,7 +6237,7 @@ SiS_SetPanelDelay(SiS_Private *SiS_Pr, U
+ 	      SiS_ShortDelay(SiS_Pr,Delay);
+ 	  }
+ 
+-      } else {							/* 310/325 series, 301(B) */
++      } else {							/* 315 series, 301(B) */
+ 
+           PanelID = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36);
+ 	  DelayIndex = PanelID >> 4;
+@@ -6271,14 +6337,7 @@ SiS_IsVAMode(SiS_Private *SiS_Pr, PSIS_H
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+      flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
+      if((flag & EnableDualEdge) && (flag & SetToLCDA))   return(1);
+-#if 0 /* Not done in 650/30xLV 1.10.6s, but in 650/301LV */
+-     else if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-       if(flag) return(1);
+-       else     return(0);   			         
+-     }
+-#endif
+-     else
+-       return(0);
++     else return(0);
+   } else
+ #endif
+      return(0);
+@@ -6325,7 +6384,9 @@ SiS_IsNotM650or651(SiS_Private *SiS_Pr, 
+   if(HwDeviceExtension->jChipType == SIS_650) {
+      flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5f);
+      flag &= 0xF0;
+-     if((flag == 0xb0) || (flag == 0x90)) return 0;
++     /* Check for revision != A0 only */
++     if((flag == 0xe0) || (flag == 0xc0) ||
++        (flag == 0xb0) || (flag == 0x90)) return 0;
+      else return 1;
+   } else
+ #endif
+@@ -6443,7 +6504,7 @@ SiS_BridgeIsEnable(SiS_Private *SiS_Pr, 
+       if((flag == 0x80) || (flag == 0x20)) return 0;
+       else	                           return 1;
+     } else {
+-      /* 310/325 series (650/30xLV 1.10.6s) */
++      /* 315 series (650/30xLV 1.10.6s) */
+       flag &= 0x50;
+       if((flag == 0x40) || (flag == 0x10)) return 0;
+       else                                 return 1;
+@@ -6493,8 +6554,8 @@ SiS_GetLCDResInfo(SiS_Private *SiS_Pr, U
+ {
+   USHORT temp,modeflag,resinfo=0;
+   const unsigned char SiS300SeriesLCDRes[] =
+-         { 0, 1, 2, 3, 7, 4, 5, 8,
+-	   0, 0, 0, 0, 0, 0, 0, 0 };
++         { 0,  1,  2,  3,  7,  4,  5,  8,
++	   0,  0, 10,  0,  0,  0,  0, 15 };
+ 
+   SiS_Pr->SiS_LCDResInfo = 0;
+   SiS_Pr->SiS_LCDTypeInfo = 0;
+@@ -6517,11 +6578,13 @@ SiS_GetLCDResInfo(SiS_Private *SiS_Pr, U
+ 
+   temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36);
+ 
++#if 0
+   /* FSTN: Fake CR36 (TypeInfo 2, ResInfo SiS_Panel320x480) */
+   if(SiS_Pr->SiS_IF_DEF_FSTN) {
+    	temp = 0x20 | SiS_Pr->SiS_Panel320x480;
+    	SiS_SetReg1(SiS_Pr->SiS_P3d4,0x36,temp);
+   }
++#endif
+ 
+   if(HwDeviceExtension->jChipType < SIS_315H) {
+   	SiS_Pr->SiS_LCDTypeInfo = temp >> 4;
+@@ -6530,14 +6593,16 @@ SiS_GetLCDResInfo(SiS_Private *SiS_Pr, U
+   }
+   temp &= 0x0f;
+   if(HwDeviceExtension->jChipType < SIS_315H) {
+-      /* TW: Translate 300 series LCDRes to 310/325 series for unified usage */
++      /* Translate 300 series LCDRes to 315 series for unified usage */
+       temp = SiS300SeriesLCDRes[temp];
+   }
+   SiS_Pr->SiS_LCDResInfo = temp;
+ 
++#if 0
+   if(SiS_Pr->SiS_IF_DEF_FSTN){
+        	SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_Panel320x480;
+   }
++#endif
+ 
+   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+     	if(SiS_Pr->SiS_LCDResInfo < SiS_Pr->SiS_PanelMin301)
+@@ -6547,75 +6612,109 @@ SiS_GetLCDResInfo(SiS_Private *SiS_Pr, U
+ 		SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_PanelMinLVDS;
+   }
+ 
+-  if(SiS_Pr->SiS_LCDResInfo > SiS_Pr->SiS_PanelMax)
++  if((!SiS_Pr->CP_HaveCustomData) || (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_PanelCustom)) {
++     if(SiS_Pr->SiS_LCDResInfo > SiS_Pr->SiS_PanelMax)
+   	SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_Panel1024x768;
++  }
++
++  if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
++     SiS_Pr->SiS_LCDResInfo = Panel_Barco1366;
++  }
++
++  switch(SiS_Pr->SiS_LCDResInfo) {
++     case Panel_800x600:   SiS_Pr->PanelXRes =  800; SiS_Pr->PanelYRes =  600; break;
++     case Panel_1024x768:  SiS_Pr->PanelXRes = 1024; SiS_Pr->PanelYRes =  768; break;
++     case Panel_1280x1024: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 1024; break;
++     case Panel_640x480_3:
++     case Panel_640x480_2:
++     case Panel_640x480:   SiS_Pr->PanelXRes =  640; SiS_Pr->PanelYRes =  480; break;
++     case Panel_1024x600:  SiS_Pr->PanelXRes = 1024; SiS_Pr->PanelYRes =  600; break;
++     case Panel_1152x864:  SiS_Pr->PanelXRes = 1152; SiS_Pr->PanelYRes =  864; break;
++     case Panel_1280x960:  SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes =  960; break;
++     case Panel_1152x768:  SiS_Pr->PanelXRes = 1152; SiS_Pr->PanelYRes =  768; break;
++     case Panel_1400x1050: SiS_Pr->PanelXRes = 1400; SiS_Pr->PanelYRes = 1050; break;
++     case Panel_1280x768:  SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes =  768; break;
++     case Panel_1600x1200: SiS_Pr->PanelXRes = 1600; SiS_Pr->PanelYRes = 1200; break;
++     case Panel_320x480:   SiS_Pr->PanelXRes =  320; SiS_Pr->PanelYRes =  480; break;
++     case Panel_Custom:    SiS_Pr->PanelXRes = SiS_Pr->CP_MaxX;
++    			   SiS_Pr->PanelYRes = SiS_Pr->CP_MaxY;
++			   break;
++     case Panel_Barco1366: SiS_Pr->PanelXRes = 1360; SiS_Pr->PanelYRes = 1024; break;
++     default:		   SiS_Pr->PanelXRes = 1024; SiS_Pr->PanelYRes =  768; break;
++  }
+ 
+   temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37);
++#if 0
+   if(SiS_Pr->SiS_IF_DEF_FSTN){
+-        /* TW: Fake LVDS bridge for FSTN */
++        /* Fake LVDS bridge for FSTN */
+       	temp = 0x04;
+       	SiS_SetReg1(SiS_Pr->SiS_P3d4,0x37,temp);
+   }
++#endif
+   SiS_Pr->SiS_LCDInfo = temp;
+   
+   if(!(SiS_Pr->UsePanelScaler))        SiS_Pr->SiS_LCDInfo &= ~DontExpandLCD;
+   else if(SiS_Pr->UsePanelScaler == 1) SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
+ 
+-  /* TW: Inserted entire 315-block from 650/LVDS/30xLV BIOSes */
++  if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
++        /* For non-standard LCD resolution, we let the panel scale */
++        if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) {
++           SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
++        } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
++	   if(ModeNo == 0x7c || ModeNo == 0x7d || ModeNo == 0x7e) {
++	      /* Bridge does not scale to 1280x960 */
++              SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
++	   } else if(ModeNo == 0x2f || ModeNo == 0x5d || ModeNo == 0x5e) {
++	      if(!(SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) {
++	         /* Bridge does not scale to 640x400 */
++	         SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
++	      }
++	   }
++        } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
++           /* TEMP - no idea about the timing and zoom factors */
++           SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
++        } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
++	   if(ModeNo == 0x3a || ModeNo == 0x4d || ModeNo == 0x65) {
++	      /* Bridge does not scale to 1280x1024 */
++	      SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
++	   }
++	} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
++	   /* TEMP - no idea about the timing and zoom factors */
++	   SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
++	}
++     }
++  }
++
++
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+ #ifdef SIS315H
+-     if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+-         if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-	     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+-		 if(ModeNo == 0x3a || ModeNo == 0x4d || ModeNo == 0x65) {
+-		     /* Bridge does not scale to 1280x1024 */
+-		     SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
+-		 }
+-	     }
+-	     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+-	         if(ModeNo == 0x7c || ModeNo == 0x7d || ModeNo == 0x7e) {
+-		     /* TW: Bridge does not scale to 1280x960 */
+-		     SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
+-		 }
+-		 if(ModeNo == 0x2f || ModeNo == 0x5d || ModeNo == 0x5e) {
+-		     /* TW: Bridge does not scale to 640x400 */
+-		     SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
+-		 }
+-	     }
+-	     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+-	         if(ModeNo == 0x2f || ModeNo == 0x5d || ModeNo == 0x5e) {
+-		     /* TW: Most panels can't scale to 640x400 */
+-		     SiS_Pr->SiS_LCDInfo &= ~DontExpandLCD;
+-		 }
+-	     }
+-	 }
+-     }
+      if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x01) {
+-         SiS_Pr->SiS_LCDInfo &= 0xFFEF;    
+-	 SiS_Pr->SiS_LCDInfo |= LCDPass11;
++        SiS_Pr->SiS_LCDInfo &= 0xFFEF;
++	SiS_Pr->SiS_LCDInfo |= LCDPass11;
+      }
+ #endif
+   } else {
+ #ifdef SIS300
+      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+         if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+-           if(!(ROMAddr[0x235] & 0x02)) {
+-	      SiS_Pr->SiS_LCDInfo &= 0xEF;
++	   if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
++              if(!(ROMAddr[0x235] & 0x02)) {
++	         SiS_Pr->SiS_LCDInfo &= 0xEF;
++ 	      }
+ 	   }
+         }
+-     } else {
+-        if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-	   if((SiS_Pr->SiS_SetFlag & SetDOSMode) && ((ModeNo == 0x03) || (ModeNo == 0x10))) {
+-               SiS_Pr->SiS_LCDInfo &= 0xEF;
+-	   }
++     } else if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++	if((SiS_Pr->SiS_SetFlag & SetDOSMode) && ((ModeNo == 0x03) || (ModeNo == 0x10))) {
++           SiS_Pr->SiS_LCDInfo &= 0xEF;
+ 	}
+      }
+ #endif
+   }
+-  
+-  /* TW: With Trumpion, always Expanding */
+-  if(SiS_Pr->SiS_IF_DEF_TRUMPION != 0){
+-       SiS_Pr->SiS_LCDInfo &= (~DontExpandLCD);
++
++  /* Trumpion: Assume non-expanding */
++  if(SiS_Pr->SiS_IF_DEF_TRUMPION != 0) {
++     SiS_Pr->SiS_LCDInfo &= (~DontExpandLCD);
+   }
+ 
+   if(!((HwDeviceExtension->jChipType < SIS_315H) && (SiS_Pr->SiS_SetFlag & SetDOSMode))) {
+@@ -6624,7 +6723,7 @@ SiS_GetLCDResInfo(SiS_Private *SiS_Pr, U
+         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+ 	   if(ModeNo > 0x13) {
+ 	      if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
+-                 if((resinfo == 7) || (resinfo == 3)) {
++                 if((resinfo == SIS_RI_800x600) || (resinfo == SIS_RI_400x300)) {
+                     SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
+ 		 }
+               }
+@@ -6644,9 +6743,9 @@ SiS_GetLCDResInfo(SiS_Private *SiS_Pr, U
+ 	                                      (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480))) {
+                  if(ModeNo > 0x13) {
+                     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+-                       if(resinfo == 4) SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;     /* 512x384  */
++                       if(resinfo == SIS_RI_512x384) SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
+                     } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+-                       if(resinfo == 3) SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;     /* 400x300  */
++                       if(resinfo == SIS_RI_400x300) SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
+                     }
+                  }
+ 	      } else SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
+@@ -6665,19 +6764,21 @@ SiS_GetLCDResInfo(SiS_Private *SiS_Pr, U
+   }
+ 
+ #ifdef SIS315H
+-  /* TW: 650/30xLV 1.10.6s */
++  /* 650/30xLV 1.10.6s */
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+-    if(SiS_Pr->SiS_VBType & (VB_SIS302B | VB_SIS302LV)) {
+-      /* Enable 302B/302LV dual link mode */
+-      /* (302B is a theory - not in any BIOS */
+-      temp = 0x00;
+-      if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) temp = 0x04;
+-      if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) temp = 0x04;
+-      if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) temp = 0x04;
+-      SiS_SetReg1(SiS_Pr->SiS_P3d4,0x39,temp);
+-    } else if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+-      SiS_SetReg1(SiS_Pr->SiS_P3d4,0x39,0x00);
+-    }
++     if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
++        SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x39,~0x04);
++        if(SiS_Pr->SiS_VBType & (VB_SIS302B | VB_SIS302LV)) {
++           /* Enable 302B/302LV dual link mode.
++            * (302B is a theory - not in any BIOS)
++	    */
++           if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) ||
++              (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
++              (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)) {
++	      SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x39,0x04);
++	   }
++  	}
++     }
+   }
+ #endif
+ 
+@@ -6697,19 +6798,6 @@ SiS_GetLCDResInfo(SiS_Private *SiS_Pr, U
+ }
+ 
+ void
+-SiS_PresetScratchregister(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
+-{
+-  return;
+-  /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x30,0x21);  */
+-  /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x31,0x41);  */
+-  /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x32,0x28);  */
+-  /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x33,0x22);  */
+-  /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x35,0x43);  */
+-  /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x36,0x01);  */
+-  /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x37,0x00);  */
+-}
+-
+-void
+ SiS_LongWait(SiS_Private *SiS_Pr)
+ {
+   USHORT i;
+@@ -6803,7 +6891,7 @@ SiS_WaitRetrace1(SiS_Private *SiS_Pr, PS
+ #endif
+   } else {
+ #ifdef SIS300
+-#if 0  /* TW: Not done in A901 BIOS */
++#if 0  /* Not done in A901 BIOS */
+      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+         if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1f) & 0xc0) return;
+      }
+@@ -6898,7 +6986,51 @@ void SiS_SetRegOR(USHORT Port,USHORT Ind
+ 
+ /* ========================================================= */
+ 
+-/* TW: Set 301 TV Encoder (and some LCD relevant) registers */
++static void
++SiS_SetTVSpecial(SiS_Private *SiS_Pr, USHORT ModeNo)
++{
++  if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++        if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
++           if((ModeNo == 0x64) || (ModeNo == 0x4a) || (ModeNo == 0x38)) {
++              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1c,0xa7);
++              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1d,0x07);
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1e,0xf2);
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1f,0x6e);
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x20,0x17);
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x21,0x8b);
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x22,0x73);
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x23,0x53);
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x24,0x13);
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x25,0x40);
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x26,0x34);
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x27,0xf4);
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x28,0x63);
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x29,0xbb);
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2a,0xcc);
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2b,0x7a);
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2c,0x58);   /* 48 */
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2d,0xe4);
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2e,0x73);
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,0xda);   /* de */
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x30,0x13);
++	      if((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38)) & 0x40) {
++	         SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x14);
++	      } else {
++	         SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x15);
++	      }
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x1b);
++	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x43,0x72);
++           }
++        } else {
++	   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x21);
++	   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x5a);
++	}
++     }
++  }
++}
++
++/* Set 301 TV Encoder (and some LCD relevant) registers */
+ void
+ SiS_SetGroup2(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr, USHORT ModeNo,
+               USHORT ModeIdIndex,USHORT RefreshRateTableIndex,
+@@ -6911,67 +7043,46 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+ #ifdef SIS315H   
+   const       SiS_Part2PortTblStruct *CRT2Part2Ptr = NULL;
+   USHORT      resindex, CRT2Index;
+-#endif  
++#endif
+   USHORT      modeflag, resinfo, crt2crtc;
+-  ULONG       longtemp, tempeax, tempebx, temp2, tempecx;
++  ULONG       longtemp, tempeax;
++#ifdef SIS300
+   const UCHAR atable[] = {
+                  0xc3,0x9e,0xc3,0x9e,0x02,0x02,0x02,
+ 	         0xab,0x87,0xab,0x9e,0xe7,0x02,0x02
+   };
++#endif  
+ 
+ #ifdef SIS315H   
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+-     /* TW: 650/30xLV 1.10.6s: (Is at end of SetGroup2!) */
++     /* 650/30xLV 1.10.6s: (Is at end of SetGroup2!) */
+      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+ 	   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1a,0xfc,0x03);
+-	   temp = 1;
+-	   if(ModeNo <= 0x13) temp = 3;
++	   temp = 0x01;
++	   if(ModeNo <= 0x13) temp = 0x03;
+ 	   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x0b,temp);
+ 	}
+      }
+-     if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-       if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-         if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-           if((ModeNo == 0x4a) || (ModeNo == 0x38)) {
+-               SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1c,0xa7);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1d,0x07);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1e,0xf2);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1f,0x6e);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x20,0x17);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x21,0x8b);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x22,0x73);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x23,0x53);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x24,0x13);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x25,0x40);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x26,0x34);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x27,0xf4);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x28,0x63);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x29,0xbb);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2a,0xcc);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2b,0x7a);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2c,0x58);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2d,0xe4);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2e,0x73);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,0xda);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x30,0x13);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x43,0x72);
+-           }
+-         }
+-       }
+-     }
++     SiS_SetTVSpecial(SiS_Pr, ModeNo);
+      return;
+   }
+-#endif  
++#endif
+ 
+-  if(ModeNo<=0x13) {
+-    	modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;      /* si+St_ResInfo */
+-    	resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+-    	crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
++  if(ModeNo <= 0x13) {
++     modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
++     resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
++     crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+   } else {
+-    	modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;     /* si+Ext_ResInfo */
++     if(SiS_Pr->UseCustomMode) {
++        modeflag = SiS_Pr->CModeFlag;
++	resinfo = 0;
++	crt2crtc = 0;
++     } else {
++        modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+     	resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+     	crt2crtc = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
++     }
+   }
+ 
+   tempcx = SiS_Pr->SiS_VBInfo;
+@@ -6984,9 +7095,9 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   temp |= ((tempbx & 0x00FF) >> 3);
+   temp ^= 0x0C;
+ 
+-  /* TW: From 1.10.7w (no vb check there; don't care - this only disables SVIDEO and CVBS signal) */
++  /* From 1.10.7w (no vb check there; don't care - this only disables SVIDEO and CVBS signal) */
+   if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+-  	temp |= 0x0c;
++     temp |= 0x0c;
+   }
+ 
+   PhasePoint  = SiS_Pr->SiS_PALPhase;
+@@ -6994,44 +7105,44 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {          
+   
+-    temp ^= 0x01;
+-    if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+-      TimingPoint = SiS_Pr->SiS_HiTVSt2Timing;
+-      if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
+-        if(modeflag & Charx8Dot) TimingPoint = SiS_Pr->SiS_HiTVSt1Timing;
+-        else TimingPoint = SiS_Pr->SiS_HiTVTextTiming;
+-      }
+-    } else TimingPoint = SiS_Pr->SiS_HiTVExtTiming;
+-    
+-    if(SiS_Pr->SiS_HiVision & 0x03) temp &= 0xfe;
+-    
++     temp ^= 0x01;
++     if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
++        TimingPoint = SiS_Pr->SiS_HiTVSt2Timing;
++        if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
++           if(modeflag & Charx8Dot) TimingPoint = SiS_Pr->SiS_HiTVSt1Timing;
++           else TimingPoint = SiS_Pr->SiS_HiTVTextTiming;
++        }
++     } else TimingPoint = SiS_Pr->SiS_HiTVExtTiming;
++
++     if(SiS_Pr->SiS_HiVision & 0x03) temp &= 0xfe;
++
+   } else {
+-  
+-    if(SiS_Pr->SiS_VBInfo & SetPALTV){
+ 
+-      TimingPoint = SiS_Pr->SiS_PALTiming;
+-      PhasePoint  = SiS_Pr->SiS_PALPhase;
++     if(SiS_Pr->SiS_VBInfo & SetPALTV){
+ 
+-      if( (SiS_Pr->SiS_VBType & VB_SIS301B302B) &&
+-          ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+-	    (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
+-         PhasePoint = SiS_Pr->SiS_PALPhase2;
+-      }
++        TimingPoint = SiS_Pr->SiS_PALTiming;
++        PhasePoint  = SiS_Pr->SiS_PALPhase;
+ 
+-    } else {
++        if( (SiS_Pr->SiS_VBType & VB_SIS301B302B) &&
++            ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
++	      (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
++           PhasePoint = SiS_Pr->SiS_PALPhase2;
++        }
++
++     } else {
+ 
+         temp |= 0x10;
+-	TimingPoint = SiS_Pr->SiS_NTSCTiming;
+-	PhasePoint  = SiS_Pr->SiS_NTSCPhase;
++        TimingPoint = SiS_Pr->SiS_NTSCTiming;
++        PhasePoint  = SiS_Pr->SiS_NTSCPhase;
+ 
+         if( (SiS_Pr->SiS_VBType & VB_SIS301B302B) &&
+ 	    ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+ 	      (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
+-        	PhasePoint = SiS_Pr->SiS_NTSCPhase2;
++           PhasePoint = SiS_Pr->SiS_NTSCPhase2;
+         }
+ 
+-    }
+-    
++     }
++
+   }
+   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x00,temp);
+ 
+@@ -7044,36 +7155,35 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+      temp = 0x38;
+   }
+   if(temp) {
+-    if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-      if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x01) {
+-          temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,temp);
+-          if(temp1 & EnablePALM) {	/* 0x40 */
+-              	PhasePoint = SiS_Pr->SiS_PALMPhase;
+-		if( (SiS_Pr->SiS_VBType & VB_SIS301B302B) &&
+-		    ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+-		      (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
+-	           PhasePoint = SiS_Pr->SiS_PALMPhase2;
+-		}
+-	  }
+-          if(temp1 & EnablePALN) {	/* 0x80 */
+-               	PhasePoint = SiS_Pr->SiS_PALNPhase;
+-		if( (SiS_Pr->SiS_VBType & VB_SIS301B302B) &&
+-		    ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+-		      (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
+-	           PhasePoint = SiS_Pr->SiS_PALNPhase2;
+-		}
+-	  }
+-      }
+-    }
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++        if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x01) {
++           temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,temp);
++           if(temp1 & EnablePALM) {	/* 0x40 */
++              PhasePoint = SiS_Pr->SiS_PALMPhase;
++	      if( (SiS_Pr->SiS_VBType & VB_SIS301B302B) &&
++		  ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
++		    (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
++	         PhasePoint = SiS_Pr->SiS_PALMPhase2;
++	      }
++	   }
++           if(temp1 & EnablePALN) {	/* 0x80 */
++              PhasePoint = SiS_Pr->SiS_PALNPhase;
++	      if( (SiS_Pr->SiS_VBType & VB_SIS301B302B) &&
++		  ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
++		    (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
++	         PhasePoint = SiS_Pr->SiS_PALNPhase2;
++	      }
++	   }
++        }
++     }
+   }
+ 
+ #ifdef SIS315H
+-  /* TW: 650/301LV BIOS */
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {  
+         if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+            if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-              if((ModeNo == 0x4a) || (ModeNo == 0x38)) {
++              if((ModeNo == 0x64) || (ModeNo == 0x4a) || (ModeNo == 0x38)) {
+ 	         PhasePoint = SiS_Pr->SiS_SpecialPhase;
+ 	      }
+            }
+@@ -7094,12 +7204,12 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   }
+ 
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-    if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      if(!(SiS_Pr->SiS_ModeType & 0x07))
++     if(HwDeviceExtension->jChipType >= SIS_315H) {
++        if(!(SiS_Pr->SiS_ModeType & 0x07))
++           SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x3A,0x1F);
++     } else {
+         SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x3A,0x1F);
+-    } else {
+-      SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x3A,0x1F);
+-    }
++     }
+   }
+ 
+   SiS_SetRegOR(SiS_Pr->SiS_Part2Port,0x0A,SiS_Pr->SiS_NewFlickerMode);
+@@ -7110,11 +7220,11 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x38,SiS_Pr->SiS_RY4COE);
+ 
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+-      if(SiS_Pr->SiS_HiVision == 3) tempax = 950;
+-      else tempax = 440;
++     if(SiS_Pr->SiS_HiVision == 3) tempax = 950;
++     else tempax = 440;
+   } else {
+-    if(SiS_Pr->SiS_VBInfo & SetPALTV) tempax = 520;
+-    else tempax = 440;
++     if(SiS_Pr->SiS_VBInfo & SetPALTV) tempax = 520;
++     else tempax = 440;
+   }
+ 
+   if( ( ( (!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) || (SiS_Pr->SiS_HiVision == 3) ) && (SiS_Pr->SiS_VDE <= tempax) ) ||
+@@ -7134,18 +7244,18 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,temp);
+ 
+      if( (SiS_Pr->SiS_VBInfo & (SetCRT2ToTV - SetCRT2ToHiVisionTV)) &&
+-        (SiS_Pr->SiS_HiVision != 3) &&
+-        (SiS_Pr->SiS_VGAHDE >= 1024) ) {
++         (SiS_Pr->SiS_HiVision != 3) &&
++         (SiS_Pr->SiS_VGAHDE >= 1024) ) {
+         if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x19);
+            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x52);
+         } else {
+            if(HwDeviceExtension->jChipType >= SIS_315H) {
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x17);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x1d);
++              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x17);
++              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x1d);
+ 	   } else {
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x0b);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x11);
++              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x0b);
++              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x11);
+ 	   }
+         }
+      }
+@@ -7154,7 +7264,7 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+ 
+   tempcx = SiS_Pr->SiS_HT;
+ 
+-  /* TW: 650/30xLV 1.10.6s */
++  /* 650/30xLV 1.10.6s */
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+       if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) {
+       	   tempcx >>= 1;
+@@ -7181,7 +7291,7 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   tempcx += 7;
+   if((SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+      (SiS_Pr->SiS_HiVision == 3)) {
+-       tempcx -= 4;
++     tempcx -= 4;
+   }
+   temp = (tempcx & 0x00FF) << 4;
+   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x22,0x0F,temp);
+@@ -7201,8 +7311,8 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   tempbx += 8;
+   if((SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+      (SiS_Pr->SiS_HiVision == 3)) {
+-    tempbx -= 4;
+-    tempcx = tempbx;
++     tempbx -= 4;
++     tempcx = tempbx;
+   }
+   temp = (tempbx & 0x00FF) << 4;
+   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x29,0x0F,temp);
+@@ -7231,8 +7341,8 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+ 
+   tempcx -= 11;
+   if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
+-    tempax = SiS_GetVGAHT2(SiS_Pr) - 1;
+-    tempcx = tempax;
++     tempax = SiS_GetVGAHT2(SiS_Pr) - 1;
++     tempcx = tempax;
+   }
+   temp = tempcx & 0x00FF;
+   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2E,temp);
+@@ -7242,38 +7352,38 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   if(SiS_Pr->SiS_VGAVDE == 375) tempbx = 746;
+   if(SiS_Pr->SiS_VGAVDE == 405) tempbx = 853;
+   if(HwDeviceExtension->jChipType < SIS_315H) {
+-  	if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) tempbx >>= 1;
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) tempbx >>= 1;
+   } else {
+-	if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (!(SiS_Pr->SiS_HiVision & 0x03))) {
+-	   tempbx >>= 1;
+-	   if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
+-	      if(ModeNo <= 0x13) {
+-	         if(crt2crtc == 1) {
+-	            tempbx++;
+-                 }
+-	      }
+-	   } else {
+-              if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+-	         if(crt2crtc == 4)   /* TW: BIOS calls GetRatePtrCRT2 here - does not make sense */
+-                    if(SiS_Pr->SiS_ModeType <= 3) tempbx++;
+-	      }
++     if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (!(SiS_Pr->SiS_HiVision & 0x03))) {
++	tempbx >>= 1;
++	if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
++	   if(ModeNo <= 0x13) {
++	      if(crt2crtc == 1) {
++	         tempbx++;
++              }
+ 	   }
+-        }
++	} else {
++           if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
++	      if(crt2crtc == 4)   /* BIOS calls GetRatePtrCRT2 here - does not make sense */
++                 if(SiS_Pr->SiS_ModeType <= 3) tempbx++;
++	   }
++	}
++     }
+   }
+   tempbx -= 2;
+   temp = tempbx & 0x00FF;
+   if((SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+      (SiS_Pr->SiS_HiVision == 3)) {
+-    if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+-      if(ModeNo == 0x2f) temp++;
+-    }
++     if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
++        if(ModeNo == 0x2f) temp++;
++     }
+   }
+-  /* TW: From 1.10.7w - doesn't make sense */
++  /* From 1.10.7w - doesn't make sense */
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+      if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+         if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+ 	   if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {   /* SetFlag?? */
+-	       if(ModeNo == 0x03) temp++;
++	      if(ModeNo == 0x03) temp++;
+ 	   }
+ 	}
+      }
+@@ -7285,15 +7395,15 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   tempax |= (tempbx & 0xFF00);
+   if(HwDeviceExtension->jChipType < SIS_315H) {
+      if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV)) {
+-        if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToSCART)) {		/* TW: New from 630/301B (II) BIOS */
++        if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToSCART)) {		/* New from 630/301B (II) BIOS */
+            tempax |= 0x1000;
+            if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToSVIDEO))  tempax |= 0x2000;
+         }
+      }
+   } else {
+      /* TODO Check this with other BIOSes */
+-     if((!(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV)) && 
+-        (SiS_Pr->SiS_HiVision == 3)) {
++     if((!(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV))
++         /* && (SiS_Pr->SiS_HiVision == 3) */ ) {
+ 	tempax |= 0x1000;
+         if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToSVIDEO))  tempax |= 0x2000;
+      }
+@@ -7301,12 +7411,12 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   temp = (tempax & 0xFF00) >> 8;
+   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x30,temp);
+ 
+-  /* TW: 650/30xLV 1.10.6s */
++  /* 650/30xLV 1.10.6s */
+   if(HwDeviceExtension->jChipType > SIS_315H) {
+      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+         if( (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) ||
+             (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) ) {
+-            SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x10,0x60);
++           SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x10,0x60);
+         }
+      }
+   }
+@@ -7322,79 +7432,70 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+      }
+   }
+ 
+-  if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {     
+-    tempbx = SiS_Pr->SiS_VDE;
+-    if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (!(SiS_Pr->SiS_HiVision & 0x03))) {
+-         tempbx >>= 1;
+-    }
+-    tempbx -= 3;
+-    tempbx &= 0x03ff;
+-    temp = ((tempbx & 0xFF00) >> 8) << 5;
+-    temp |= 0x18;
+-    SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x46,temp);
+-    temp = tempbx & 0x00FF;
+-    SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x47,temp);	/* tv gatingno */
+-    if(HwDeviceExtension->jChipType >= SIS_315H) {	/* TW: 650/30xLV 1.10.6s */
+-       if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+-          tempax = 0;
+-          if(SiS_Pr->SiS_HiVision & 0x03) {
+-	     tempax = 0x3000;
+-	     if(SiS_Pr->SiS_HiVision & 0x01) tempax = 0x5000;
+-	  }
+-	  temp = (tempax & 0xFF00) >> 8;
+-          SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4d,temp);
+-       }
+-    }
++  if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++     tempbx = SiS_Pr->SiS_VDE;
++     if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (!(SiS_Pr->SiS_HiVision & 0x03))) {
++        tempbx >>= 1;
++     }
++     tempbx -= 3;
++     tempbx &= 0x03ff;
++     temp = ((tempbx & 0xFF00) >> 8) << 5;
++     temp |= 0x18;
++     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x46,temp);
++     temp = tempbx & 0x00FF;
++     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x47,temp);	/* tv gatingno */
++     if(HwDeviceExtension->jChipType >= SIS_315H) {
++        if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
++           tempax = 0;
++           if(SiS_Pr->SiS_HiVision & 0x03) {
++ 	      tempax = 0x3000;
++	      if(SiS_Pr->SiS_HiVision & 0x01) tempax = 0x5000;
++	   }
++	   temp = (tempax & 0xFF00) >> 8;
++           SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4d,temp);
++        }
++     }
+   }
+ 
+   tempbx &= 0x00FF;
+   if(!(modeflag & HalfDCLK)) {
+-    tempcx = SiS_Pr->SiS_VGAHDE;
+-    if(tempcx >= SiS_Pr->SiS_HDE) {
+-      tempbx |= 0x2000;
+-      tempax &= 0x00FF;
+-    }
++     if(SiS_Pr->SiS_VGAHDE >= SiS_Pr->SiS_HDE) {
++        tempbx |= 0x2000;
++        tempax &= 0x00FF;
++     }
+   }
+ 
+   tempcx = 0x0101;
+-/*if(SiS_Pr->SiS_VBInfo & (SetPALTV | SetCRT2ToTV)) {  */ /*301b- TW: BIOS BUG? */
++/*if(SiS_Pr->SiS_VBInfo & (SetPALTV | SetCRT2ToTV)) {  */ /* BIOS BUG? */
+   if(SiS_Pr->SiS_VBInfo & (SetCRT2ToTV - SetCRT2ToHiVisionTV)) {
+-    if(!(SiS_Pr->SiS_HiVision & 0x03)) {
+-      if(SiS_Pr->SiS_VGAHDE >= 1024) {
+-        if((!(modeflag & HalfDCLK)) || (HwDeviceExtension->jChipType < SIS_315H)) {   /* TW: This check not in 630/301B */
+-          tempcx = 0x1920;
+-          if(SiS_Pr->SiS_VGAHDE >= 1280) {
+-            tempcx = 0x1420;
+-            tempbx &= 0xDFFF;
+-          }
++     if(!(SiS_Pr->SiS_HiVision & 0x03)) {
++        if(SiS_Pr->SiS_VGAHDE >= 1024) {
++           if((!(modeflag & HalfDCLK)) || (HwDeviceExtension->jChipType < SIS_315H)) {
++              tempcx = 0x1920;
++              if(SiS_Pr->SiS_VGAHDE >= 1280) {
++                 tempcx = 0x1420;
++                 tempbx &= 0xDFFF;
++              }
++           }
+         }
+-      }
+-    }
++     }
+   }
+ 
+   if(!(tempbx & 0x2000)) {
+-    if(modeflag & HalfDCLK) {
+-         tempcx = (tempcx & 0xFF00) | (((tempcx & 0x00FF) << 1) & 0xff);
+-    }
+-    push1 = tempbx;
+-    tempeax = SiS_Pr->SiS_VGAHDE;
+-    tempebx = (tempcx & 0xFF00) >> 8;
+-    longtemp = tempeax * tempebx;
+-    tempecx = tempcx & 0x00FF;
+-    longtemp /= tempecx;
+-    longtemp <<= 0x0d;
+-    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++     if(modeflag & HalfDCLK) {
++        tempcx = (tempcx & 0xFF00) | ((tempcx << 1) & 0x00FF);
++     }
++     longtemp = (SiS_Pr->SiS_VGAHDE * ((tempcx & 0xFF00) >> 8)) / (tempcx & 0x00FF);
++     longtemp <<= 13;
++     if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+      	longtemp <<= 3;
+-    }
+-    tempecx = SiS_Pr->SiS_HDE;
+-    temp2 = longtemp % tempecx;
+-    tempeax = longtemp / tempecx;
+-    if(temp2 != 0) tempeax++;
+-    tempax = (USHORT)tempeax;
+-    tempbx = push1;
+-    tempcx = (tempcx & 0xff00) | (((tempax & 0xFF00) >> 8) >> 5);
+-    tempbx |= (tempax & 0x1F00);
+-    tempax = ((tempax & 0x00FF) << 8) | (tempax & 0x00FF);
++     }
++     tempeax = longtemp / SiS_Pr->SiS_HDE;
++     if(longtemp % SiS_Pr->SiS_HDE) tempeax++;
++     tempax = (USHORT)tempeax;
++     tempcx = (tempcx & 0xFF00) | ((tempax & 0xFF00) >> (8 + 5));
++     tempbx |= (tempax & 0x1F00);
++     tempax = ((tempax & 0x00FF) << 8) | (tempax & 0x00FF);
+   }
+ 
+   temp = (tempax & 0xFF00) >> 8;
+@@ -7403,33 +7504,32 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x45,0xC0,temp);
+ 
+   if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-       temp = tempcx & 0x00FF;
+-       if(tempbx & 0x2000) temp = 0;
+-       temp |= 0x18;
+-       SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x46,0xE0,temp);
+-       if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+-             tempbx = 0x0382;  
+-             tempcx = 0x007e;  
+-       } else {
+-             tempbx = 0x0369;  
+-             tempcx = 0x0061;  
+-       }
+-       temp = (tempbx & 0x00FF) ;
+-       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4B,temp);
+-       temp = (tempcx & 0x00FF) ;
+-       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4C,temp);
+-       tempbx &= 0x03FF;
+-       temp = (tempcx & 0xFF00) >> 8;
+-       temp = (temp & 0x0003) << 2;
+-       temp |= (tempbx >> 8);
+-       if(HwDeviceExtension->jChipType < SIS_315H) {
+-          SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4D,temp);
+-       } else {
+-          SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x4D,0xF0,temp);
+-       }
++     temp = tempcx & 0x00FF;
++     if(tempbx & 0x2000) temp = 0;
++     temp |= 0x18;
++     SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x46,0xE0,temp);
++
++     if(SiS_Pr->SiS_VBInfo & SetPALTV) {
++        tempbx = 0x0382;
++        tempcx = 0x007e;
++     } else {
++        tempbx = 0x0369;
++        tempcx = 0x0061;
++     }
++     temp = (tempbx & 0x00FF) ;
++     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4B,temp);
++     temp = (tempcx & 0x00FF) ;
++     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4C,temp);
++     temp = (tempcx & 0x0300) >> (8 - 2);
++     temp |= ((tempbx >> 8) & 0x03);
++     if(HwDeviceExtension->jChipType < SIS_315H) {
++        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4D,temp);
++     } else {
++        SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x4D,0xF0,temp);
++     }
+ 
+-       temp = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x43);
+-       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x43,(USHORT)(temp - 3));
++     temp = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x43);
++     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x43,(USHORT)(temp - 3));
+   }
+ 
+   temp = 0;
+@@ -7440,23 +7540,33 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+      temp = 0x38;
+   }
+   if(temp) {
+-      if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-          if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x01) {
+-               if(SiS_GetReg1(SiS_Pr->SiS_P3d4,temp) & EnablePALM) {  /* 0x40 */
+-                     SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xEF);
+-                     temp = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x01);
+-                     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,temp - 1);
+-               }
+-          }
+-      }
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++        if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x01) {
++           if(SiS_GetReg1(SiS_Pr->SiS_P3d4,temp) & EnablePALM) {  /* 0x40 */
++              SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xEF);
++              temp = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x01);
++              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,temp - 1);
++           }
++        }
++     }
++  }
++
++  if(HwDeviceExtension->jChipType >= SIS_315H) {
++     if((SiS_Pr->SiS_VBType & VB_SIS301B302B) && (!(SiS_Pr->SiS_VBType & VB_NoLCD))) {
++        if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++           SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x0B,0x00);
++        }
++     }
+   }
+ 
++#if 0  /* Old: Why HiVision? */
+   if( (SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+       (!(SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) ) {
+-    if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x0B,0x00);
+-    }
++     if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x0B,0x00);
++     }
+   }
++#endif
+ 
+   if(HwDeviceExtension->jChipType < SIS_315H) {
+      if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+@@ -7465,74 +7575,43 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+ 	return;
+      }
+   } else {
+-     /* TW: !!! The following is a duplicate, done for LCDA as well (see above) */
++     /* !!! The following is a duplicate, done for LCDA as well (see above) */
+      if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-       if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {    
+-         if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-           if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-             if((ModeNo == 0x4a) || (ModeNo == 0x38)) {
+-               SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1c,0xa7);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1d,0x07);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1e,0xf2);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1f,0x6e);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x20,0x17);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x21,0x8b);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x22,0x73);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x23,0x53);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x24,0x13);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x25,0x40);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x26,0x34);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x27,0xf4);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x28,0x63);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x29,0xbb);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2a,0xcc);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2b,0x7a);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2c,0x58);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2d,0xe4);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2e,0x73);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,0xda);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x30,0x13);
+-	       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x43,0x72);
+-	     }
+-           }
+-         }
+-       }
+-       return;
++        SiS_SetTVSpecial(SiS_Pr, ModeNo);
++        return;
+      }
+   }
+ 
+-  /* TW: From here: Part2 LCD setup */
++  /* From here: Part2 LCD setup */
+ 
+   tempbx = SiS_Pr->SiS_HDE;
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      /* TW: 650/30xLV 1.10.6s */
+-      if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) tempbx >>= 1;
++     /* 650/30xLV 1.10.6s */
++     if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) tempbx >>= 1;
+   }
+   tempbx--;			         	/* RHACTE=HDE-1 */
+   temp = tempbx & 0x00FF;
+   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2C,temp);
+-  temp = (tempbx & 0xFF00) >> 8;
+-  temp <<= 4;
++  temp = (tempbx & 0xFF00) >> 4;
+   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x2B,0x0F,temp);
+ 
+   temp = 0x01;
+   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+-    if(SiS_Pr->SiS_ModeType == ModeEGA) {
+-      if(SiS_Pr->SiS_VGAHDE >= 1024) {
+-        temp = 0x02;
+-	if(HwDeviceExtension->jChipType >= SIS_315H) {
+-           if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
+-             temp = 0x01;
++     if(SiS_Pr->SiS_ModeType == ModeEGA) {
++        if(SiS_Pr->SiS_VGAHDE >= 1024) {
++           temp = 0x02;
++	   if(HwDeviceExtension->jChipType >= SIS_315H) {
++              if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
++                 temp = 0x01;
++	      }
+ 	   }
+-	}
+-      }
+-    }
++        }
++     }
+   }
+   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x0B,temp);
+ 
+-  tempbx = SiS_Pr->SiS_VDE;         		/* RTVACTEO=(VDE-1)&0xFF */
+-  push1 = tempbx;
+-
++  tempbx = SiS_Pr->SiS_VDE;         		/* RTVACTEO = VDE - 1 */
++  /* push1 = tempbx; */
+   tempbx--;
+   temp = tempbx & 0x00FF;
+   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x03,temp);
+@@ -7540,10 +7619,9 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x0C,0xF8,temp);
+ 
+   tempcx = SiS_Pr->SiS_VT;
+-  push2 = tempcx;
+-
++  /* push2 = tempcx; */
+   tempcx--;
+-  temp = tempcx & 0x00FF;  			 /* RVTVT=VT-1 */
++  temp = tempcx & 0x00FF;  			 /* RVTVT = VT - 1 */
+   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x19,temp);
+ 
+   temp = (tempcx & 0xFF00) >> 8;
+@@ -7551,30 +7629,26 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   
+   /* Enable dithering; newer versions only do this for 32bpp mode */
+   if((HwDeviceExtension->jChipType == SIS_300) && (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) {
+-    if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) temp |= 0x10;
++     if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) temp |= 0x10;
+   } else if(HwDeviceExtension->jChipType < SIS_315H) {
+-    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) temp |= 0x10;
+-    else {
+-      if(SiS_Pr->SiS_LCDInfo & LCDSync)       /* TW: 630/301 BIOS checks this */
+-         temp |= 0x10;
+-    }
++     temp |= 0x10;
+   } else {
+-      if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+-         /* TW: 650/30xLV 1.10.6s */
+-         if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
+-            if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) {  /* 32bpp mode? */
+-      	       temp |= 0x10;
+-	    }
+-         }
+-      } else {
+-         temp |= 0x10;
+-      }
++     if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
++        /* 650/30xLV 1.10.6s */
++        if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
++           if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) {  /* 32bpp mode? */
++              temp |= 0x10;
++	   }
++        }
++     } else {
++        temp |= 0x10;
++     }
+   }
+ 
+   /* 630/301 does not do all this */
+   if((SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
+      if((HwDeviceExtension->jChipType >= SIS_315H) && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) {
+-        /* TW: 650/30xLV 1.10.6s */
++        /* 650/30xLV 1.10.6s */
+         temp |= (SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37) >> 6);
+ 	temp |= 0x08;   					/* From 1.10.7w */
+ 	if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) temp |= 0x04; 	/* From 1.10.7w */
+@@ -7595,17 +7669,15 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x17,0xFB);
+   SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x18,0xDF);
+ 
+-  /* 1280x960, 1280x1024 and 1600x1200 data invalid/missing in tables, use old calculation */
+-  if((HwDeviceExtension->jChipType >= SIS_315H)             && 
+-     (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)                &&  
+-     (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024) &&
+-     (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1600x1200) &&
+-     (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x960)) {
++  /* much data invalid/missing in tables, use old calculation in such case */
++  if((HwDeviceExtension->jChipType >= SIS_315H)         &&
++     (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)            &&
++     ((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)  ||
++      (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
++      (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050)) ) {
+      
+-#ifdef SIS315H 							/* ------------- 310/325/330 series ------------ */
++#ifdef SIS315H 							/* ------------- 315/330 series ------------ */
+ 
+-      /* TW: Inserted this entire section from 650/301LV(x) BIOS */
+-      
+       /* Using this on the 301B with an auto-expanding 1024 panel (CR37=1) results
+        * in a black bar in modes < 1024; if the panel is non-expanding, the bridge
+        * scales all modes to 1024. All modes in both variants (exp/non-exp) work.
+@@ -7664,7 +7736,6 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+ 	}
+      }
+ 
+-     /* TW: 650/30xLV 1.10.6s: */
+      /* !!! This is a duplicate, done for LCDA as well - see above */
+      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+@@ -7683,15 +7754,12 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+        * the bridge scales all modes to 1024.
+        * !!! Malfunction at 640x480 and 640x400 when panel is auto-expanding - black screen !!!
+        */
+-  
++
++    /* cx = VT - 1 */
++
+     tempcx++;
+-    
+-    if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)       tempbx =  768;
+-    else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempbx = 1024;
+-    else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempbx = 1200;
+-    else if(SiS_Pr->SiS_VDE != 1024) 				  tempbx =  960;
+-    else            						  tempbx = 1024;
+-    
++
++    tempbx = SiS_Pr->PanelYRes;
+ #if 0  /* old */
+     tempbx = 768;
+     if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1024x768) {
+@@ -7706,36 +7774,40 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+       }
+     }
+ #endif
+-    
++
+     if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+-      tempbx = SiS_Pr->SiS_VDE - 1;
+-      tempcx--;
++       tempbx = SiS_Pr->SiS_VDE - 1;
++       tempcx--;
+     }
+-    
++
+     tempax = 1;
+     if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
+-      if(tempbx != SiS_Pr->SiS_VDE) {
+-        tempax = tempbx;
+-/*	if(SiS_Pr->SiS_VGAVDE == 525) tempax += 60;   in 650/301B BIOS */
+-        if(tempax < SiS_Pr->SiS_VDE) {
+-          tempax = 0;
+-          tempcx = 0;
+-        } else {
+-          tempax -= SiS_Pr->SiS_VDE;
+-        }
+-        tempax >>= 1;
+-      }
+-      tempcx -= tempax; /* lcdvdes */
+-      tempbx -= tempax; /* lcdvdee */
+-    } else {
+-      tempax >>= 1;
+-      tempcx -= tempax; /* lcdvdes */
+-      tempbx -= tempax; /* lcdvdee */
++       if(tempbx != SiS_Pr->SiS_VDE) {
++          tempax = tempbx;
++          if(tempax < SiS_Pr->SiS_VDE) {
++             tempax = 0;
++             tempcx = 0;
++          } else {
++             tempax -= SiS_Pr->SiS_VDE;
++          }
++          tempax >>= 1;
++       }
++       tempcx -= tempax; /* lcdvdes */
++       tempbx -= tempax; /* lcdvdee */
+     }
+-    
++#if 0  /* meaningless: 1 / 2 = 0... */
++    else {
++       tempax >>= 1;
++       tempcx -= tempax; /* lcdvdes */
++       tempbx -= tempax; /* lcdvdee */
++    }
++#endif
++
++    /* Non-expanding: lcdvdees = tempcx = VT-1; lcdvdee = tempbx = VDE-1 */
++
+ #ifdef TWDEBUG
+-    xf86DrvMsg(0, X_INFO, "lcdvds 0x%x lcdvde 0x%x\n", tempcx, tempbx);
+-#endif    
++    xf86DrvMsg(0, X_INFO, "lcdvdes 0x%x lcdvdee 0x%x\n", tempcx, tempbx);
++#endif
+ 
+     temp = tempcx & 0x00FF;   				/* RVEQ1EQ=lcdvdes */
+     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x05,temp);
+@@ -7746,140 +7818,183 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+     temp |= ((tempcx & 0xFF00) >> 8);
+     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,temp);
+ 
+-    tempbx = push2;
+-    tempax = push1;
+-    tempcx = tempbx;
+-    tempcx -= tempax;
+-    tempcx >>= 4;
++    tempbx = SiS_Pr->SiS_VT;    /* push2; */
++    tempax = SiS_Pr->SiS_VDE;   /* push1; */
++    tempcx = (tempbx - tempax) >> 4;
+     tempbx += tempax;
+     tempbx >>= 1;
+     if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)  tempbx -= 10;
+-    
++
++    /* non-expanding: lcdvrs = tempbx = ((VT + VDE) / 2) - 10 */
++
++    if(SiS_Pr->UseCustomMode) {
++       tempbx = SiS_Pr->CVSyncStart;
++    }
++
+ #ifdef TWDEBUG
+     xf86DrvMsg(0, X_INFO, "lcdvrs 0x%x\n", tempbx);
+ #endif
+ 
+-    temp = tempbx & 0x00FF;   				/* RTVACTEE=lcdvrs */
++    temp = tempbx & 0x00FF;   				/* RTVACTEE = lcdvrs */
+     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,temp);
+ 
+     temp = ((tempbx & 0xFF00) >> 8) << 4;
+     tempbx += (tempcx + 1);
+     temp |= (tempbx & 0x000F);
++
++    if(SiS_Pr->UseCustomMode) {
++       temp &= 0xf0;
++       temp |= (SiS_Pr->CVSyncEnd & 0x0f);
++    }
++
++#ifdef TWDEBUG
++    xf86DrvMsg(0, X_INFO, "lcdvre[3:0] 0x%x\n", (temp & 0x0f));
++#endif
++
+     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,temp);
+ 
+-    /* TW: Code from 630/301B (I+II) BIOS */
++    /* Code from 630/301B (I+II) BIOS */
+ 
+-    if( ( ( (HwDeviceExtension->jChipType == SIS_630) ||
+-            (HwDeviceExtension->jChipType == SIS_730) ) &&
+-          (HwDeviceExtension->jChipRevision > 2) )  &&
+-        (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) &&
+-        (!(SiS_Pr->SiS_SetFlag & LCDVESATiming))  &&
+-        (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) ) {
+-            if(ModeNo == 0x13) {
+-              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,0xB9);
+-              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x05,0xCC);
+-              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x06,0xA6);
+-            } else {
+-              if((crt2crtc & 0x3F) == 4) {
++    if(!SiS_Pr->UseCustomMode) {
++       if( ( ( (HwDeviceExtension->jChipType == SIS_630) ||
++               (HwDeviceExtension->jChipType == SIS_730) ) &&
++             (HwDeviceExtension->jChipRevision > 2) )  &&
++           (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) &&
++           (!(SiS_Pr->SiS_SetFlag & LCDVESATiming))  &&
++           (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) ) {
++          if(ModeNo == 0x13) {
++             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,0xB9);
++             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x05,0xCC);
++             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x06,0xA6);
++          } else {
++             if((crt2crtc & 0x3F) == 4) {
+                 SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x2B);
+                 SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x13);
+                 SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,0xE5);
+                 SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x05,0x08);
+                 SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x06,0xE2);
+-              }
+-            }
++             }
++          }
++       }
+     }
+ 
+-    /* TW: Inserted missing code from 630/301B BIOS;
++    /* Inserted missing code from 630/301B BIOS;
+      *     Strangely, this is done in all 650 BIOSes as
+      *     well (although LCDTypeInfo is not used there
+      *     in the same way as on 300 series)
+      */
++#ifdef SIS300
++    if(HwDeviceExtension->jChipType < SIS_315H) {
++       if(!SiS_Pr->UseCustomMode) {
++          if(SiS_Pr->SiS_LCDTypeInfo == 0x0c) {
++             crt2crtc &= 0x1f;
++             tempcx = 0;
++             if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) {
++                if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
++                   tempcx += 7;
++                }
++             }
++             tempcx += crt2crtc;
++             if(crt2crtc >= 4) {
++                SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x06,0xff);
++             }
+ 
+-    if(SiS_Pr->SiS_LCDTypeInfo == 0x0c) {
+-         crt2crtc &= 0x1f;
+-         tempcx = 0;
+-         if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) {
+-           if (SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+-              tempcx += 7;
+-           }
+-         }
+-         tempcx += crt2crtc;
+-         if (crt2crtc >= 4) {
+-           SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x06,0xff);
+-         }
+-
+-         if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) {
+-           if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+-             if(crt2crtc == 4) {
+-                SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x28);
++             if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) {
++                if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
++                   if(crt2crtc == 4) {
++                      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x28);
++                   }
++                }
+              }
+-           }
+-         }
+-         SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x18);
+-         SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,atable[tempcx]);
++             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x18);
++             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,atable[tempcx]);
++          }
++       }
+     }
++#endif
+ 
+-    tempcx = (SiS_Pr->SiS_HT - SiS_Pr->SiS_HDE) >> 2;     /* (HT-HDE)>>2     */
++    tempcx = (SiS_Pr->SiS_HT - SiS_Pr->SiS_HDE) >> 2;     /* (HT - HDE) >> 2 */
+     tempbx = SiS_Pr->SiS_HDE + 7;            		  /* lcdhdee         */
+     if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-         tempbx += 2;
++       tempbx += 2;
+     }
+     push1 = tempbx;
++
+ #ifdef TWDEBUG
+-    xf86DrvMsg(0, X_INFO, "lcdhde 0x%x\n", tempbx);
+-#endif    
+-    temp = tempbx & 0x00FF;    			          /* RHEQPLE=lcdhdee */
++    xf86DrvMsg(0, X_INFO, "lcdhdee 0x%x\n", tempbx);
++#endif
++
++    temp = tempbx & 0x00FF;    			          /* RHEQPLE = lcdhdee */
+     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x23,temp);
+     temp = (tempbx & 0xFF00) >> 8;
+     SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x25,0xF0,temp);
+ 
+     temp = 7;
+     if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-         temp += 2;
++       temp += 2;
+     }
+-    SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1F,temp);  	  /* RHBLKE=lcdhdes[7:0] */
++    SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1F,temp);  	  /* RHBLKE = lcdhdes[7:0] */
+     SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x20,0x0F);	  /* lcdhdes [11:8] */
+ 
+     tempbx += tempcx;
+     push2 = tempbx;
++
++    if(SiS_Pr->UseCustomMode) {
++       tempbx = SiS_Pr->CHSyncStart + 7;
++       if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++          tempbx += 2;
++       }
++    }
++
+ #ifdef TWDEBUG
+     xf86DrvMsg(0, X_INFO, "lcdhrs 0x%x\n", tempbx);
+ #endif
+-    temp = tempbx & 0x00FF;            		          /* RHBURSTS=lcdhrs */
+-    if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+-       if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) { 
+-          if(SiS_Pr->SiS_HDE == 1280) temp = 0x47;
++
++    temp = tempbx & 0x00FF;            		          /* RHBURSTS = lcdhrs */
++    if(!SiS_Pr->UseCustomMode) {
++       if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
++          if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
++             if(SiS_Pr->SiS_HDE == 1280) temp = 0x47;
++          }
+        }
+     }
+     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1C,temp);
+-    temp = ((tempbx & 0xFF00) >> 8) << 4;
++    temp = (tempbx & 0x0F00) >> 4;
+     SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1D,0x0F,temp);
+ 
+     tempbx = push2;
+     tempcx <<= 1;
+     tempbx += tempcx;
++
++    if(SiS_Pr->UseCustomMode) {
++       tempbx = SiS_Pr->CHSyncEnd + 7;
++       if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++          tempbx += 2;
++       }
++    }
++
+ #ifdef TWDEBUG
+     xf86DrvMsg(0, X_INFO, "lcdhre 0x%x\n", tempbx);
+-#endif    
+-    temp = tempbx & 0x00FF;            		          /* RHSYEXP2S=lcdhre */
++#endif
++
++    temp = tempbx & 0x00FF;            		          /* RHSYEXP2S = lcdhre */
+     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x21,temp);
+ 
+     if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
+-      if(SiS_Pr->SiS_VGAVDE == 525) {
+-        if(SiS_Pr->SiS_ModeType <= ModeVGA)
+-    	   temp=0xC6;
+-        else
+-       	   temp=0xC3;
+-        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,temp);
+-        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x30,0xB3);
+-      } else if(SiS_Pr->SiS_VGAVDE == 420) {
+-        if(SiS_Pr->SiS_ModeType <= ModeVGA)
+-	   temp=0x4F;
+-        else
+-       	   temp=0x4D;   
+-        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,temp);
+-      }
++       if(SiS_Pr->SiS_VGAVDE == 525) {
++          if(SiS_Pr->SiS_ModeType <= ModeVGA)
++    	     temp=0xC6;
++          else
++       	     temp=0xC3;
++          SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,temp);
++          SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x30,0xB3);
++       } else if(SiS_Pr->SiS_VGAVDE == 420) {
++          if(SiS_Pr->SiS_ModeType <= ModeVGA)
++	     temp=0x4F;
++          else
++       	     temp=0x4D;
++          SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,temp);
++       }
+     }
+     SiS_Set300Part2Regs(SiS_Pr, HwDeviceExtension, ModeIdIndex,
+                         RefreshRateTableIndex, BaseAddr, ModeNo);
+@@ -7898,7 +8013,7 @@ SiS_GetVGAHT2(SiS_Private *SiS_Pr)
+   return((USHORT) tempax);
+ }
+ 
+-/* TW: New from 300/301LV BIOS 1.16.51 for ECS A907. Seems highly preliminary. */
++/* New from 300/301LV BIOS 1.16.51 for ECS A907. Seems highly preliminary. */
+ void
+ SiS_Set300Part2Regs(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+     			USHORT ModeIdIndex, USHORT RefreshRateTableIndex,
+@@ -7910,18 +8025,19 @@ SiS_Set300Part2Regs(SiS_Private *SiS_Pr,
+ 
+   if(HwDeviceExtension->jChipType != SIS_300) return;
+   if(!(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) return;
++  if(SiS_Pr->UseCustomMode) return;
+ 
+-  if(ModeNo<=0x13) {
+-    	crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
++  if(ModeNo <= 0x13) {
++     crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+   } else {
+-    	crt2crtc = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
++     crt2crtc = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+   }
+ 
+   resindex = crt2crtc & 0x3F;
+   if(SiS_Pr->SiS_SetFlag & LCDVESATiming) CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_1;
+   else                                    CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_2;
+ 
+-  /* TW: The BIOS code (1.16.51) is obviously a fragment! */
++  /* The BIOS code (1.16.51) is obviously a fragment! */
+   if(ModeNo > 0x13) {
+      CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_1;
+      resindex = 4;
+@@ -7942,7 +8058,6 @@ SiS_Set300Part2Regs(SiS_Private *SiS_Pr,
+   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x25,0x0f,(CRT2Part2Ptr+resindex)->CR[11]);
+ }
+ 
+-/* TW: Set 301 Macrovision(tm) registers */
+ void
+ SiS_SetGroup3(SiS_Private *SiS_Pr, USHORT  BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+               USHORT ModeIdIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+@@ -7954,24 +8069,35 @@ SiS_SetGroup3(SiS_Private *SiS_Pr, USHOR
+ 
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) return;
+ 
+-  if(ModeNo<=0x13)
+-    	modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+-  else
++  if(ModeNo<=0x13) {
++     modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
++  } else {
++     if(SiS_Pr->UseCustomMode) {
++        modeflag = SiS_Pr->CModeFlag;
++     } else {
+     	modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
++     }
++  }
+ 
++#ifndef SIS_CP
+   SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x00,0x00);
++#endif  
++
++#ifdef SIS_CP
++  SIS_CP_INIT301_CP
++#endif
+ 
+   if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+-    SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xFA);
+-    SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xC8);
++     SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xFA);
++     SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xC8);
+   } else {
+-    if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xF5);
+-      SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xB7);
+-    } else {
+-      SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xF6);
+-      SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xBf);
+-    }
++     if(HwDeviceExtension->jChipType >= SIS_315H) {
++        SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xF5);
++        SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xB7);
++     } else {
++        SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xF6);
++        SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xBf);
++     }
+   }
+ 
+   temp = 0;
+@@ -7982,38 +8108,41 @@ SiS_SetGroup3(SiS_Private *SiS_Pr, USHOR
+      temp = 0x38;
+   }
+   if(temp) {
+-      if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-          if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x01) {
+-              if(SiS_GetReg1(SiS_Pr->SiS_P3d4,temp) & EnablePALM){  /* 0x40 */
+-                  SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xFA);
+-                  SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xC8);
+-                  SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x3D,0xA8);
+-              }
+-          }
+-      }
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++        if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x01) {
++           if(SiS_GetReg1(SiS_Pr->SiS_P3d4,temp) & EnablePALM){  /* 0x40 */
++              SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xFA);
++              SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xC8);
++              SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x3D,0xA8);
++           }
++        }
++     }
+   }
+ 
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+-    tempdi = SiS_Pr->SiS_HiTVGroup3Data;
+-    if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
+-      tempdi = SiS_Pr->SiS_HiTVGroup3Simu;
+-      if(!(modeflag & Charx8Dot)) {
+-        tempdi = SiS_Pr->SiS_HiTVGroup3Text;
+-      }
+-    }
+-    if(SiS_Pr->SiS_HiVision & 0x03) {
+-       tempdi = SiS_HiTVGroup3_1;
+-       if(SiS_Pr->SiS_HiVision & 0x02) tempdi = SiS_HiTVGroup3_2;
+-    }
+-    for(i=0; i<=0x3E; i++){
+-       SiS_SetReg1(SiS_Pr->SiS_Part3Port,i,tempdi[i]);
+-    }
++     tempdi = SiS_Pr->SiS_HiTVGroup3Data;
++     if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
++        tempdi = SiS_Pr->SiS_HiTVGroup3Simu;
++        if(!(modeflag & Charx8Dot)) {
++           tempdi = SiS_Pr->SiS_HiTVGroup3Text;
++        }
++     }
++     if(SiS_Pr->SiS_HiVision & 0x03) {
++        tempdi = SiS_HiTVGroup3_1;
++        if(SiS_Pr->SiS_HiVision & 0x02) tempdi = SiS_HiTVGroup3_2;
++     }
++     for(i=0; i<=0x3E; i++){
++        SiS_SetReg1(SiS_Pr->SiS_Part3Port,i,tempdi[i]);
++     }
+   }
+ 
+-  return;
++#ifdef SIS_CP
++  SIS_CP_INIT301_CP2
++#endif
++
+ }
+ 
+-/* TW: Set 301 VGA2 registers */
++/* Set 301 VGA2 registers */
+ void
+ SiS_SetGroup4(SiS_Private *SiS_Pr, USHORT  BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+               USHORT ModeIdIndex,USHORT RefreshRateTableIndex,
+@@ -8022,17 +8151,20 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHOR
+   USHORT tempax,tempcx,tempbx,modeflag,temp,temp2,resinfo;
+   ULONG tempebx,tempeax,templong;
+ 
+-
+-  if(ModeNo<=0x13) {
+-    	modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+-	resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
++  if(ModeNo <= 0x13) {
++     modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
++     resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+   } else {
++     if(SiS_Pr->UseCustomMode) {
++        modeflag = SiS_Pr->CModeFlag;
++	resinfo = 0;
++     } else {
+     	modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ 	resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
++     }
+   }
+ 
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      /* TW: From 650/302LV 1.10.6s (not for 300/301LV - no LCDA on this combination) */
+      if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+         if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+            SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x24,0x0e);
+@@ -8049,10 +8181,10 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHOR
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+         if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+-	   /* TW: From 650/301LV (any, incl. 1.10.6s, 1.10.7w) */
+-  	   /* TW: This is a duplicate; done at the end, too */
++	   /* From 650/301LV (any, incl. 1.10.6s, 1.10.7w) */
++  	   /* This is a duplicate; done at the end, too */
+ 	   if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) {
+-		SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x2c);
++	      SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x2c);
+ 	   }
+ 	   SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00);
+ 	   SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
+@@ -8090,39 +8222,33 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHOR
+   tempbx = SiS_Pr->SiS_VGAHDE;
+   if(modeflag & HalfDCLK)  tempbx >>= 1;
+ 
+-  /* TW: New for 650/301LV and 630/301B */
+   temp = 0xA0;
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+-       temp = 0;
+-       if(tempbx > 800) {
+-          temp = 0xA0;
+-          if(tempbx != 1024) {
+-             temp = 0xC0;
+-             if(tempbx != 1280) temp = 0;
+-	  }
+-       }
+-  } else
+-    if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-      if(tempbx <= 800) {
+-         temp = 0x80;
+-	 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-            temp = 0;
+-            if(tempbx > 800) temp = 0x60;
+-         }
+-      }
++     temp = 0;
++     if(tempbx > 800) {
++        temp = 0xA0;
++        if(tempbx != 1024) {
++           temp = 0xC0;
++           if(tempbx != 1280) temp = 0;
++	}
++     }
++  } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++     if(tempbx <= 800) {
++        temp = 0x80;
++     }
+   } else {
+-      temp = 0x80;
+-      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-            temp = 0;
+-            if(tempbx > 800) temp = 0x60;
+-      }
++     temp = 0x80;
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
++        temp = 0;
++        if(tempbx > 800) temp = 0x60;
++     }
+   }
+   if(SiS_Pr->SiS_HiVision & 0x03) {
+         temp = 0;
+ 	if(SiS_Pr->SiS_VGAHDE == 1024) temp = 0x20;
+   }
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+-  	if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) temp = 0;
++     if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) temp = 0;
+   }
+ 
+   if(SiS_Pr->SiS_VBType & VB_SIS301) {
+@@ -8144,10 +8270,10 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHOR
+ 
+   tempeax = SiS_Pr->SiS_VGAVDE;
+   tempcx |= 0x4000;
+-  if(tempeax <= tempebx){
+-    tempcx ^= 0x4000;
++  if(tempeax <= tempebx) {
++     tempcx ^= 0x4000;
+   } else {
+-    tempeax -= tempebx;
++     tempeax -= tempebx;
+   }
+ 
+   templong = (tempeax * 256 * 1024) % tempebx;
+@@ -8173,64 +8299,64 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHOR
+          tempax = SiS_Pr->SiS_VGAHDE;
+          if(modeflag & HalfDCLK) tempax >>= 1;
+          if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) || (SiS_Pr->SiS_HiVision & 0x03)) {
+-	     if(HwDeviceExtension->jChipType >= SIS_315H) {
+-	         if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) tempax >>= 1;
+-		 else if(tempax > 800) tempax -= 800;
+-	     } else {
+-                 if(tempax > 800) tempax -= 800;
+-             }
++	    if(HwDeviceExtension->jChipType >= SIS_315H) {
++	       if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) tempax >>= 1;
++	       else if(tempax > 800) tempax -= 800;
++	    } else {
++               if(tempax > 800) tempax -= 800;
++            }
+          }
+ 
+ /*       if((SiS_Pr->SiS_VBInfo & (SetCRT2ToTV | SetPALTV)) && (!(SiS_Pr->SiS_HiVision & 0x03))) {  */
+  	 if((SiS_Pr->SiS_VBInfo & (SetCRT2ToTV - SetCRT2ToHiVisionTV)) && (!(SiS_Pr->SiS_HiVision & 0x03))) {
+-           if(tempax > 800) {
+-	      tempbx = 8;
+-              if(tempax == 1024)
+-	        tempax *= 25;
+-              else
+-	        tempax *= 20;
+-
+-	      temp = tempax % 32;
+-	      tempax /= 32;
+-	      tempax--;
+-	      if (temp!=0) tempax++;
+-           }
++            if(tempax > 800) {
++	       tempbx = 8;
++               if(tempax == 1024)
++	          tempax *= 25;
++               else
++	          tempax *= 20;
++
++	       temp = tempax % 32;
++	       tempax /= 32;
++	       tempax--;
++	       if (temp!=0) tempax++;
++            }
+          }
+ 	 tempax--;
+          temp = (tempax & 0xFF00) >> 8;
+          temp &= 0x03;
+-	 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {		/* From 1.10.7w */
+-	 	if(ModeNo > 0x13) {			/* From 1.10.7w */
+-			if(resinfo == 8) tempax = 0x1f;	/* From 1.10.7w */
+-		}					/* From 1.10.7w */
+-	 }						/* From 1.10.7w */
++	 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {			/* From 1.10.7w */
++	    if(ModeNo > 0x13) {					/* From 1.10.7w */
++	       if(resinfo == SIS_RI_1024x768) tempax = 0x1f;	/* From 1.10.7w */
++	    }							/* From 1.10.7w */
++	 }							/* From 1.10.7w */
+ 	 SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x1D,tempax & 0x00FF);
+ 	 temp <<= 4;
+ 	 temp |= tempbx;
+ 	 SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x1E,temp);
+ 
+ 	 if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+-	    if(IS_SIS650740) {
+-	        temp = 0x0026;  /* 1.10.7w; 1.10.8r; needs corresponding code in Dis/EnableBridge! */
++	    if(IS_SIS550650740660) {
++	       temp = 0x0026;  /* 1.10.7w; 1.10.8r; needs corresponding code in Dis/EnableBridge! */
+ 	    } else {
+-	        temp = 0x0036;
++	       temp = 0x0036;
+ 	    }
+ 	 } else {
+-	     temp = 0x0036;
++	    temp = 0x0036;
+ 	 }
+          if((SiS_Pr->SiS_VBInfo & (SetCRT2ToTV - SetCRT2ToHiVisionTV)) &&
+ 	                               (!(SiS_Pr->SiS_HiVision & 0x03))) {
+-		temp |= 0x01;
+-	        if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+-	          if(!(SiS_Pr->SiS_SetFlag & TVSimuMode))
+-  	                  temp &= 0xFE;
+-		}
++	    temp |= 0x01;
++	    if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
++	       if(!(SiS_Pr->SiS_SetFlag & TVSimuMode))
++  	          temp &= 0xFE;
++	    }
+          }
+          SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x1F,0xC0,temp);
+ 
+ 	 tempbx = SiS_Pr->SiS_HT;
+ 	 if(HwDeviceExtension->jChipType >= SIS_315H) {
+-	 	if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) tempbx >>= 1;
++	    if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) tempbx >>= 1;
+ 	 }
+          tempbx >>= 1;
+ 	 tempbx -= 2;
+@@ -8238,7 +8364,7 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHOR
+          SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,0xC0,temp);
+          temp = tempbx & 0x00FF;
+          SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x22,temp);
+-	 
++
+          if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+ 	    if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+                SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x24,0x0e);
+@@ -8246,24 +8372,24 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHOR
+ 	 }
+ 
+ 	 if(HwDeviceExtension->jChipType >= SIS_315H) {
+-	     /* TW: 650/LV BIOS does this for all bridge types - assumingly wrong */
+-	     /* 315, 330, 650+301B BIOS don't do this at all */
+-             /* TW: This is a duplicate; done for LCDA as well (see above) */
+-	     if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+-	        if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) {
+-		   SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x2c);
+-	        }
+-	        SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00);
+-	        SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
+-	        SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
+-	     }
++	    /* 650/LV BIOS does this for all bridge types - assumingly wrong */
++	    /* 315, 330, 650+301B BIOS don't do this at all */
++            /* This is a duplicate; done for LCDA as well (see above) */
++	    if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
++	       if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) {
++		  SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x2c);
++	       }
++	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00);
++	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
++	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
++	    }
+          } else if(HwDeviceExtension->jChipType == SIS_300) {
+-	     /* TW: 300/301LV BIOS does this for all bridge types - assumingly wrong */
+-	     if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+-	        SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00);
+-	        SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
+-	        SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
+-	     }
++	    /* 300/301LV BIOS does this for all bridge types - assumingly wrong */
++	    if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
++	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00);
++	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
++	       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
++	    }
+ 	 }
+ 
+   }  /* 301B */
+@@ -8278,21 +8404,26 @@ SiS_SetCRT2VCLK(SiS_Private *SiS_Pr, USH
+                  USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
+   USHORT vclkindex;
+-  USHORT tempah;
++  USHORT temp, reg1, reg2;
+ 
+-  vclkindex = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+-                              HwDeviceExtension);
++  if(SiS_Pr->UseCustomMode) {
++     reg1 = SiS_Pr->CSR2B;
++     reg2 = SiS_Pr->CSR2C;
++  } else {
++     vclkindex = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
++                                 HwDeviceExtension);
++     reg1 = SiS_Pr->SiS_VBVCLKData[vclkindex].Part4_A;
++     reg2 = SiS_Pr->SiS_VBVCLKData[vclkindex].Part4_B;
++  }
+ 
+   if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-     tempah = SiS_Pr->SiS_VBVCLKData[vclkindex].Part4_A;
+-     SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0A,tempah);
+-     tempah = SiS_Pr->SiS_VBVCLKData[vclkindex].Part4_B;
+-     SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0B,tempah);
++     SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0A,reg1);
++     SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0B,reg2);
+      if(HwDeviceExtension->jChipType >= SIS_315H) {
+ 	if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+            if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ 	      if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-                 if((ModeNo == 0x4a) || (ModeNo == 0x38)) {
++                 if((ModeNo == 0x64) || (ModeNo == 0x4a) || (ModeNo == 0x38)) {
+ 		    SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0a,0x57);
+ 		    SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0b,0x46);
+ 		    SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x1f,0xf6);
+@@ -8303,15 +8434,13 @@ SiS_SetCRT2VCLK(SiS_Private *SiS_Pr, USH
+      }
+   } else {	
+      SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0A,0x01);
+-     tempah = SiS_Pr->SiS_VBVCLKData[vclkindex].Part4_B;
+-     SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0B,tempah);
+-     tempah = SiS_Pr->SiS_VBVCLKData[vclkindex].Part4_A;
+-     SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0A,tempah);
++     SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0B,reg2);
++     SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0A,reg1);
+   }
+   SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x12,0x00);
+-  tempah = 0x08;
+-  if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) tempah |= 0x20;
+-  SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x12,tempah);
++  temp = 0x08;
++  if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) temp |= 0x20;
++  SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x12,temp);
+ }
+ 
+ USHORT
+@@ -8319,23 +8448,24 @@ SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCH
+                 USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
+   USHORT tempbx;
+-  const USHORT LCDXlat0VCLK[4]    = {VCLK40, VCLK40, VCLK40, VCLK40};
+-  const USHORT LVDSXlat1VCLK[4]   = {VCLK40, VCLK40, VCLK40, VCLK40};
++  const USHORT LCDXlat0VCLK[4]    = {VCLK40,       VCLK40,       VCLK40,       VCLK40};
++  const USHORT LVDSXlat1VCLK[4]   = {VCLK40,       VCLK40,       VCLK40,       VCLK40};
++  const USHORT LVDSXlat4VCLK[4]   = {VCLK28,       VCLK28,       VCLK28,       VCLK28};
+ #ifdef SIS300
+-  const USHORT LCDXlat1VCLK300[4] = {VCLK65,   VCLK65,   VCLK65,   VCLK65};
+-  const USHORT LCDXlat2VCLK300[4] = {VCLK108_2,VCLK108_2,VCLK108_2,VCLK108_2};
+-  const USHORT LVDSXlat2VCLK300[4]= {VCLK65,   VCLK65,   VCLK65,   VCLK65};
+-  const USHORT LVDSXlat3VCLK300[4]= {VCLK65,   VCLK65,   VCLK65,   VCLK65};
++  const USHORT LCDXlat1VCLK300[4] = {VCLK65_300,   VCLK65_300,   VCLK65_300,   VCLK65_300};
++  const USHORT LCDXlat2VCLK300[4] = {VCLK108_2_300,VCLK108_2_300,VCLK108_2_300,VCLK108_2_300};
++  const USHORT LVDSXlat2VCLK300[4]= {VCLK65_300,   VCLK65_300,   VCLK65_300,   VCLK65_300};
++  const USHORT LVDSXlat3VCLK300[4]= {VCLK65_300,   VCLK65_300,   VCLK65_300,   VCLK65_300};
+ #endif
+ #ifdef SIS315H
+-  const USHORT LCDXlat1VCLK310[4] = {VCLK65+2,   VCLK65+2,   VCLK65+2,   VCLK65+2};
+-  const USHORT LCDXlat2VCLK310[4] = {VCLK108_2+5,VCLK108_2+5,VCLK108_2+5,VCLK108_2+5};
+-  const USHORT LVDSXlat2VCLK310[4]= {VCLK65+2,   VCLK65+2,   VCLK65+2,   VCLK65+2};
+-  const USHORT LVDSXlat3VCLK310[4]= {VCLK108_2+5,VCLK108_2+5,VCLK108_2+5,VCLK108_2+5};
++  const USHORT LCDXlat1VCLK310[4] = {VCLK65_315,   VCLK65_315,   VCLK65_315,   VCLK65_315};
++  const USHORT LCDXlat2VCLK310[4] = {VCLK108_2_315,VCLK108_2_315,VCLK108_2_315,VCLK108_2_315};
++  const USHORT LVDSXlat2VCLK310[4]= {VCLK65_315,   VCLK65_315,   VCLK65_315,   VCLK65_315};
++  const USHORT LVDSXlat3VCLK310[4]= {VCLK108_2_315,VCLK108_2_315,VCLK108_2_315,VCLK108_2_315};
+ #endif
+   USHORT CRT2Index,VCLKIndex=0;
+   USHORT modeflag,resinfo;
+-  const UCHAR *CHTVVCLKPtr=NULL;
++  const UCHAR  *CHTVVCLKPtr = NULL;
+   const USHORT *LCDXlatVCLK1 = NULL;
+   const USHORT *LCDXlatVCLK2 = NULL;
+   const USHORT *LVDSXlatVCLK2 = NULL;
+@@ -8372,33 +8502,40 @@ SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCH
+      if(SiS_Pr->SiS_SetFlag & ProgrammingCRT2) {
+ 
+         CRT2Index >>= 6;
+-        if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)){      /*  LCD */
++        if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {      /*  LCD */
+             if(HwDeviceExtension->jChipType < SIS_315H) {
+-	       if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)
++	       if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+ 	    		VCLKIndex = LCDXlat0VCLK[CRT2Index];
+-	       else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)
++	       } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+ 	    		VCLKIndex = LCDXlatVCLK1[CRT2Index];
+-	       else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)
++	       } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+ 	    		VCLKIndex = LCDXlatVCLK1[CRT2Index];
+-	       else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768)
++	       } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) {
+ 	    		VCLKIndex = LCDXlatVCLK1[CRT2Index];
+-	       else
++	       } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
++	                VCLKIndex = VCLK81_300;	/* guessed */
++	       } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
++		        VCLKIndex = VCLK108_3_300;
++		        if(resinfo == SIS_RI_1280x1024) VCLKIndex = VCLK100_300;
++	       } else {
+ 	    		VCLKIndex = LCDXlatVCLK2[CRT2Index];
++	       }
+ 	    } else {
+-               /* TW: 330, 650/301LV BIOS does not check expanding, 315 does  */
+-	       if( (HwDeviceExtension->jChipType > SIS_315PRO) ||
++	       if( (SiS_Pr->SiS_VBType & VB_SIS301LV302LV) ||
+ 	           (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) ) {
+       	          if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+-		     VCLKIndex = 0x19;
++		     VCLKIndex = VCLK108_2_315;
++		  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
++		     VCLKIndex = VCLK81_315;  	/* guessed */
+ 		  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+-		     VCLKIndex = 0x19;
++		     VCLKIndex = VCLK108_2_315;
+ 		  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
+-		     VCLKIndex = 0x21;
++		     VCLKIndex = VCLK162_315;
++		  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
++		     VCLKIndex = VCLK108_3_315;
++		     if(resinfo == SIS_RI_1280x1024) VCLKIndex = VCLK100_315;
+ 		  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+ 		     VCLKIndex = LCDXlatVCLK1[CRT2Index];
+-                  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
+-		     VCLKIndex = 0x45;  /* TW: in VBVCLK table */
+-		     if(resinfo == 0x09) VCLKIndex++;
+ 	          } else {
+ 		     VCLKIndex = LCDXlatVCLK2[CRT2Index];
+       	          }
+@@ -8408,12 +8545,18 @@ SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCH
+         	   if(ModeNo > 0x13) {
+           		VCLKIndex = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
+         	   }
+-		   if(ModeNo <= 0x13) {  /* TW: 315 BIOS */
+-		      if(SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC == 1) VCLKIndex = 0x42;
++		   if(ModeNo <= 0x13) {
++		      if(HwDeviceExtension->jChipType <= SIS_315PRO) {
++		         if(SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC == 1) VCLKIndex = 0x42;
++	              } else {
++		         if(SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC == 1) VCLKIndex = 0x00;
++		      }
++		   }
++		   if(HwDeviceExtension->jChipType <= SIS_315PRO) {
++		      if(VCLKIndex == 0) VCLKIndex = 0x41;
++		      if(VCLKIndex == 1) VCLKIndex = 0x43;
++		      if(VCLKIndex == 4) VCLKIndex = 0x44;
+ 		   }
+-		   if(VCLKIndex == 0) VCLKIndex = 0x41;
+-		   if(VCLKIndex == 1) VCLKIndex = 0x43;
+-		   if(VCLKIndex == 4) VCLKIndex = 0x44;
+ 	       }
+ 	    }
+         } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {                 /*  TV */
+@@ -8429,9 +8572,11 @@ SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCH
+        			if(SiS_Pr->SiS_SetFlag & RPLLDIV2XO)  VCLKIndex = TVVCLKDIV2;
+             		else         		              VCLKIndex = TVVCLK;
+           	}
+-		if(HwDeviceExtension->jChipType >= SIS_315H) {
+-              		VCLKIndex += 25;
+-  		}
++		if(HwDeviceExtension->jChipType < SIS_315H) {
++              		VCLKIndex += TVCLKBASE_300;
++  		} else {
++			VCLKIndex += TVCLKBASE_315;
++		}
+         } else {         					/* RAMDAC2 */
+         	VCLKIndex = (UCHAR)SiS_GetReg2((USHORT)(SiS_Pr->SiS_P3ca+0x02));
+         	VCLKIndex = ((VCLKIndex >> 2) & 0x03);
+@@ -8441,7 +8586,11 @@ SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCH
+           			VCLKIndex &= 0x3f;
+ 				if( (HwDeviceExtension->jChipType == SIS_630) &&
+ 				    (HwDeviceExtension->jChipRevision >= 0x30)) {
+-				     if(VCLKIndex == 0x14) VCLKIndex = 0x2e;
++				     /* This is certainly wrong: It replaces clock
++				      * 108 by 47...
++				      */
++				     /* if(VCLKIndex == 0x14) VCLKIndex = 0x2e; */
++				     if(VCLKIndex == 0x14) VCLKIndex = 0x34;
+ 				}
+ 			}
+         	}
+@@ -8505,6 +8654,10 @@ SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCH
+      		if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) ||
+ 		   (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel320x480))
+      			VCLKIndex = LVDSXlat1VCLK[VCLKIndex];
++		else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480   ||
++		        SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
++			SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3)
++			VCLKIndex = LVDSXlat4VCLK[VCLKIndex];
+      		else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)
+      			VCLKIndex = LVDSXlatVCLK2[VCLKIndex];
+ 		else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)
+@@ -8513,6 +8666,11 @@ SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCH
+                         VCLKIndex = LVDSXlatVCLK2[VCLKIndex];			
+      		else    VCLKIndex = LVDSXlatVCLK3[VCLKIndex];
+ 
++		if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
++		   /* Special Timing: Barco iQ Pro R300/400 */
++		   VCLKIndex = 0x44;
++		}
++
+ 	   } else {
+ 
+ 	        VCLKIndex = (UCHAR)SiS_GetReg2((USHORT)(SiS_Pr->SiS_P3ca+0x02));
+@@ -8556,11 +8714,11 @@ SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCH
+ #ifdef TWDEBUG
+   xf86DrvMsg(0, X_INFO, "VCLKIndex %d (0x%x)\n", VCLKIndex, VCLKIndex);
+ #endif
+-  return (VCLKIndex);
++  return(VCLKIndex);
+ }
+ 
+-/* TW: Set 301 Palette address port registers */
+-/* TW: Checked against 650/301LV BIOS */
++/* Set 301 Palette address port registers */
++/* Checked against 650/301LV BIOS */
+ void
+ SiS_SetGroup5(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr,
+               UCHAR *ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
+@@ -8568,7 +8726,7 @@ SiS_SetGroup5(SiS_Private *SiS_Pr, PSIS_
+ 
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)  return;
+ 
+-  if(SiS_Pr->SiS_ModeType == ModeVGA){
++  if(SiS_Pr->SiS_ModeType == ModeVGA) {
+      if(!(SiS_Pr->SiS_VBInfo & (SetInSlaveMode | LoadDACFlag))){
+         SiS_EnableCRT2(SiS_Pr);
+         SiS_LoadDAC(SiS_Pr,HwDeviceExtension,ROMAddr,ModeNo,ModeIdIndex);
+@@ -8581,17 +8739,21 @@ SiS_ModCRT1CRTC(SiS_Private *SiS_Pr, UCH
+                 USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
+   USHORT temp,tempah,i,modeflag,j;
+-  USHORT ResInfo,DisplayType;
++  USHORT ResIndex,DisplayType;
+   const SiS_LVDSCRT1DataStruct *LVDSCRT1Ptr=NULL;
+ 
+   if(ModeNo <= 0x13) {
+-    	modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
++     modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+   } else {
+-    	modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
++     modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+   }
+ 
++  if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
++     (SiS_Pr->SiS_CustomT == CUT_BARCO1024))
++     return;
++
+   temp = SiS_GetLVDSCRT1Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+-                            &ResInfo,&DisplayType);
++                            &ResIndex,&DisplayType);
+ 
+   if(temp == 0) return;
+ 
+@@ -8639,47 +8801,53 @@ SiS_ModCRT1CRTC(SiS_Private *SiS_Pr, UCH
+     case 41: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x768_1_H;        break;
+     case 42: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x768_2;          break;
+     case 43: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x768_2_H;        break;
++    case 50: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1640x480_1;           break;
++    case 51: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1640x480_1_H;         break;
++    case 52: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1640x480_2;           break;
++    case 53: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1640x480_2_H;         break;
++    case 54: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1640x480_3;           break;
++    case 55: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1640x480_3_H;         break;
+     case 99: LVDSCRT1Ptr = SiS_Pr->SiS_CHTVCRT1SOPAL;               break;
+     default: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_1;          break;
+   }
+ 
+   SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x11,0x7f);                        /*unlock cr0-7  */
+ 
+-  tempah = (LVDSCRT1Ptr+ResInfo)->CR[0];
++  tempah = (LVDSCRT1Ptr + ResIndex)->CR[0];
+   SiS_SetReg1(SiS_Pr->SiS_P3d4,0x00,tempah);
+ 
+   for(i=0x02,j=1;i<=0x05;i++,j++){
+-    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
++    tempah = (LVDSCRT1Ptr + ResIndex)->CR[j];
+     SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
+   }
+   for(i=0x06,j=5;i<=0x07;i++,j++){
+-    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
++    tempah = (LVDSCRT1Ptr + ResIndex)->CR[j];
+     SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
+   }
+   for(i=0x10,j=7;i<=0x11;i++,j++){
+-    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
++    tempah = (LVDSCRT1Ptr + ResIndex)->CR[j];
+     SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
+   }
+   for(i=0x15,j=9;i<=0x16;i++,j++){
+-    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
++    tempah = (LVDSCRT1Ptr + ResIndex)->CR[j];
+     SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
+   }
+   for(i=0x0A,j=11;i<=0x0C;i++,j++){
+-    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
++    tempah = (LVDSCRT1Ptr + ResIndex)->CR[j];
+     SiS_SetReg1(SiS_Pr->SiS_P3c4,i,tempah);
+   }
+ 
+-  tempah = (LVDSCRT1Ptr+ResInfo)->CR[14];
++  tempah = (LVDSCRT1Ptr + ResIndex)->CR[14];
+   tempah &= 0xE0;
+-  SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x0E,0x1f,tempah);     
++  SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x0E,0x1f,tempah);
+ 
+-  tempah = (LVDSCRT1Ptr+ResInfo)->CR[14];
++  tempah = (LVDSCRT1Ptr + ResIndex)->CR[14];
+   tempah &= 0x01;
+   tempah <<= 5;
+   if(modeflag & DoubleScanMode)  tempah |= 0x080;
+   SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x09,~0x020,tempah);
+ 
+-  /* TW: 650/LVDS BIOS - doesn't make sense */
++  /* 650/LVDS BIOS - doesn't make sense */
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+      if(modeflag & HalfDCLK)
+         SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x11,0x7f);
+@@ -8688,7 +8856,7 @@ SiS_ModCRT1CRTC(SiS_Private *SiS_Pr, UCH
+ 
+ BOOLEAN
+ SiS_GetLVDSCRT1Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+-		   USHORT RefreshRateTableIndex,USHORT *ResInfo,
++		   USHORT RefreshRateTableIndex,USHORT *ResIndex,
+ 		   USHORT *DisplayType)
+  {
+   USHORT tempbx,modeflag=0;
+@@ -8757,19 +8925,33 @@ SiS_GetLVDSCRT1Ptr(SiS_Private *SiS_Pr, 
+            tempbx = 40;
+ 	   if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 2;
+ 	   if(modeflag & HalfDCLK) tempbx++;
++        } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) {
++           tempbx = 54;
++	   if(modeflag & HalfDCLK) tempbx++;
++	} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2) {
++           tempbx = 52;
++	   if(modeflag & HalfDCLK) tempbx++;
++	} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
++           tempbx = 50;
++	   if(modeflag & HalfDCLK) tempbx++;
+         }
++
+      }
+      if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
+         tempbx = 12;
+ 	if(modeflag & HalfDCLK) tempbx++;
+      }
+   }
+-  if(SiS_Pr->SiS_IF_DEF_FSTN){
++
++#if 0
++  if(SiS_Pr->SiS_IF_DEF_FSTN) {
+      if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel320x480){
+         tempbx = 22;
+      }
+   }
+-  *ResInfo = CRT2CRTC & 0x3F;
++#endif
++
++  *ResIndex = CRT2CRTC & 0x3F;
+   *DisplayType = tempbx;
+   return 1;
+ }
+@@ -8778,54 +8960,54 @@ void
+ SiS_SetCRT2ECLK(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT ModeNo,USHORT ModeIdIndex,
+            USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
+-  USHORT tempah,tempal,pushax;
+-  USHORT vclkindex=0;
+-    
++  USHORT clkbase, vclkindex=0;
++  UCHAR  sr2b, sr2c;
++
+   if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) || (SiS_Pr->SiS_IF_DEF_TRUMPION == 1)) {
+ 	SiS_Pr->SiS_SetFlag &= (~ProgrammingCRT2);
+-        tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
+-    	tempal &= 0x3F;
+-	if(tempal == 2) RefreshRateTableIndex--;
++        if((SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK & 0x3f) == 2) {
++	   RefreshRateTableIndex--;
++	}
+ 	vclkindex = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+-                               RefreshRateTableIndex,HwDeviceExtension);
++                                    RefreshRateTableIndex,HwDeviceExtension);
+ 	SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
+   } else {
+         vclkindex = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+-                               RefreshRateTableIndex,HwDeviceExtension);
++                                    RefreshRateTableIndex,HwDeviceExtension);
+   }
+-  
+-  tempal = 0x02B;
++
++  sr2b = SiS_Pr->SiS_VCLKData[vclkindex].SR2B;
++  sr2c = SiS_Pr->SiS_VCLKData[vclkindex].SR2C;
++
++  if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) || (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
++     if((ROMAddr) && SiS_Pr->SiS_UseROM) {
++	if(ROMAddr[0x220] & 0x01) {
++           sr2b = ROMAddr[0x227];
++	   sr2c = ROMAddr[0x228];
++	}
++     }
++  }
++
++  clkbase = 0x02B;
+   if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+      if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-    	tempal += 3;
++    	clkbase += 3;
+      }
+   }
++
+   SiS_SetReg1(SiS_Pr->SiS_P3c4,0x05,0x86);
+-  pushax = tempal;
+   SiS_SetReg1(SiS_Pr->SiS_P3c4,0x31,0x20);
+-  tempah = SiS_Pr->SiS_VCLKData[vclkindex].SR2B;
+-  SiS_SetReg1(SiS_Pr->SiS_P3c4,tempal,tempah);
+-  tempal++;
+-  tempah = SiS_Pr->SiS_VCLKData[vclkindex].SR2C;
+-  SiS_SetReg1(SiS_Pr->SiS_P3c4,tempal,tempah);
++  SiS_SetReg1(SiS_Pr->SiS_P3c4,clkbase,sr2b);
++  SiS_SetReg1(SiS_Pr->SiS_P3c4,clkbase+1,sr2c);
+   SiS_SetReg1(SiS_Pr->SiS_P3c4,0x31,0x10);
+-  tempal = pushax;
+-  tempah = SiS_Pr->SiS_VCLKData[vclkindex].SR2B;
+-  SiS_SetReg1(SiS_Pr->SiS_P3c4,tempal,tempah);
+-  tempal++;
+-  tempah = SiS_Pr->SiS_VCLKData[vclkindex].SR2C;
+-  SiS_SetReg1(SiS_Pr->SiS_P3c4,tempal,tempah);
++  SiS_SetReg1(SiS_Pr->SiS_P3c4,clkbase,sr2b);
++  SiS_SetReg1(SiS_Pr->SiS_P3c4,clkbase+1,sr2c);
+   SiS_SetReg1(SiS_Pr->SiS_P3c4,0x31,0x00);
+-  tempal = pushax;
+-  tempah = SiS_Pr->SiS_VCLKData[vclkindex].SR2B;
+-  SiS_SetReg1(SiS_Pr->SiS_P3c4,tempal,tempah);
+-  tempal++;
+-  tempah = SiS_Pr->SiS_VCLKData[vclkindex].SR2C;
+-  SiS_SetReg1(SiS_Pr->SiS_P3c4,tempal,tempah);
+-  return;
++  SiS_SetReg1(SiS_Pr->SiS_P3c4,clkbase,sr2b);
++  SiS_SetReg1(SiS_Pr->SiS_P3c4,clkbase+1,sr2c);
+ }
+ 
+-#if 0  /* TW: Not used */
++#if 0  /* Not used */
+ void
+ SiS_SetDefCRT2ExtRegs(SiS_Private *SiS_Pr, USHORT BaseAddr)
+ {
+@@ -8844,7 +9026,7 @@ SiS_SetDefCRT2ExtRegs(SiS_Private *SiS_P
+ }
+ #endif
+ 
+-/* TW: Start of Chrontel 70xx functions ---------------------- */
++/* Start of Chrontel 70xx functions ---------------------- */
+ 
+ /* Set-up the Chrontel Registers */
+ void
+@@ -8890,44 +9072,44 @@ SiS_SetCHTVReg(SiS_Private *SiS_Pr, UCHA
+   if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
+ 
+ #ifdef SIS300
+-  
+-     /* Chrontel 7005 - I assume that it does not come with a 310/325 series chip */
+ 
+-     /* TW: We don't support modes >800x600 */
++     /* Chrontel 7005 - I assume that it does not come with a 315 series chip */
++
++     /* We don't support modes >800x600 */
+      if (resindex > 5) return;
+ 
+      if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+-    	SiS_SetCH700x(SiS_Pr,0x4304);   /* TW: 0x40=76uA (PAL); 0x03=15bit non-multi RGB*/
+-    	SiS_SetCH700x(SiS_Pr,0x6909);	/* TW: Black level for PAL (105)*/
++    	SiS_SetCH700x(SiS_Pr,0x4304);   /* 0x40=76uA (PAL); 0x03=15bit non-multi RGB*/
++    	SiS_SetCH700x(SiS_Pr,0x6909);	/* Black level for PAL (105)*/
+      } else {
+-    	SiS_SetCH700x(SiS_Pr,0x0304);   /* TW: upper nibble=71uA (NTSC), 0x03=15bit non-multi RGB*/
+-    	SiS_SetCH700x(SiS_Pr,0x7109);	/* TW: Black level for NTSC (113)*/
++    	SiS_SetCH700x(SiS_Pr,0x0304);   /* upper nibble=71uA (NTSC), 0x03=15bit non-multi RGB*/
++    	SiS_SetCH700x(SiS_Pr,0x7109);	/* Black level for NTSC (113)*/
+      }
+ 
+      temp = CHTVRegData[resindex].Reg[0];
+-     tempbx=((temp&0x00FF)<<8)|0x00;	/* TW: Mode register */
++     tempbx=((temp&0x00FF)<<8)|0x00;	/* Mode register */
+      SiS_SetCH700x(SiS_Pr,tempbx);
+      temp = CHTVRegData[resindex].Reg[1];
+-     tempbx=((temp&0x00FF)<<8)|0x07;	/* TW: Start active video register */
++     tempbx=((temp&0x00FF)<<8)|0x07;	/* Start active video register */
+      SiS_SetCH700x(SiS_Pr,tempbx);
+      temp = CHTVRegData[resindex].Reg[2];
+-     tempbx=((temp&0x00FF)<<8)|0x08;	/* TW: Position overflow register */
++     tempbx=((temp&0x00FF)<<8)|0x08;	/* Position overflow register */
+      SiS_SetCH700x(SiS_Pr,tempbx);
+      temp = CHTVRegData[resindex].Reg[3];
+-     tempbx=((temp&0x00FF)<<8)|0x0A;	/* TW: Horiz Position register */
++     tempbx=((temp&0x00FF)<<8)|0x0A;	/* Horiz Position register */
+      SiS_SetCH700x(SiS_Pr,tempbx);
+      temp = CHTVRegData[resindex].Reg[4];
+-     tempbx=((temp&0x00FF)<<8)|0x0B;	/* TW: Vertical Position register */
++     tempbx=((temp&0x00FF)<<8)|0x0B;	/* Vertical Position register */
+      SiS_SetCH700x(SiS_Pr,tempbx);
+ 
+-     /* TW: Set minimum flicker filter for Luma channel (SR1-0=00),
++     /* Set minimum flicker filter for Luma channel (SR1-0=00),
+                 minimum text enhancement (S3-2=10),
+    	        maximum flicker filter for Chroma channel (S5-4=10)
+ 	        =00101000=0x28 (When reading, S1-0->S3-2, and S3-2->S1-0!)
+       */
+      SiS_SetCH700x(SiS_Pr,0x2801);
+ 
+-     /* TW: Set video bandwidth
++     /* Set video bandwidth
+             High bandwith Luma composite video filter(S0=1)
+             low bandwith Luma S-video filter (S2-1=00)
+ 	    disable peak filter in S-video channel (S3=0)
+@@ -8936,22 +9118,24 @@ SiS_SetCHTVReg(SiS_Private *SiS_Pr, UCHA
+      */
+      SiS_SetCH700x(SiS_Pr,0xb103);       /* old: 3103 */
+ 
+-     /* TW: Register 0x3D does not exist in non-macrovision register map
++     /* Register 0x3D does not exist in non-macrovision register map
+             (Maybe this is a macrovision register?)
+       */
+-     /* SiS_SetCH70xx(SiS_Pr,0x003D); */
++#ifndef SIS_CP
++     SiS_SetCH70xx(SiS_Pr,0x003D);
++#endif     
+ 
+-     /* TW: Register 0x10 only contains 1 writable bit (S0) for sensing,
++     /* Register 0x10 only contains 1 writable bit (S0) for sensing,
+             all other bits a read-only. Macrovision?
+       */
+      SiS_SetCH70xxANDOR(SiS_Pr,0x0010,0x1F);
+ 
+-     /* TW: Register 0x11 only contains 3 writable bits (S0-S2) for
++     /* Register 0x11 only contains 3 writable bits (S0-S2) for
+             contrast enhancement (set to 010 -> gain 1 Yout = 17/16*(Yin-30) )
+       */
+      SiS_SetCH70xxANDOR(SiS_Pr,0x0211,0xF8);
+ 
+-     /* TW: Clear DSEN
++     /* Clear DSEN
+       */
+      SiS_SetCH70xxANDOR(SiS_Pr,0x001C,0xEF);
+ 
+@@ -8994,7 +9178,7 @@ SiS_SetCHTVReg(SiS_Private *SiS_Pr, UCHA
+          }
+        }
+      } else {				/* ---- PAL ---- */
+-           /* TW: We don't play around with FSCI in PAL mode */
++           /* We don't play around with FSCI in PAL mode */
+          if (resindex == 0x04) {
+            SiS_SetCH70xxANDOR(SiS_Pr,0x0020,0xEF); 	/* loop filter off */
+            SiS_SetCH70xxANDOR(SiS_Pr,0x0121,0xFE);      /* ACIV on */
+@@ -9012,7 +9196,7 @@ SiS_SetCHTVReg(SiS_Private *SiS_Pr, UCHA
+ 
+ #ifdef SIS315H
+ 
+-     /* TW: We don't support modes >1024x768 */
++     /* We don't support modes >1024x768 */
+      if (resindex > 6) return;
+ 
+      temp = CHTVRegData[resindex].Reg[0];
+@@ -9082,26 +9266,29 @@ SiS_SetCHTVReg(SiS_Private *SiS_Pr, UCHA
+ #endif	/* 315 */
+ 
+   }
++
++#ifdef SIS_CP
++  SIS_CP_INIT301_CP3
++#endif
++
+ }
+ 
+-/* TW: Chrontel 701x functions ================================= */
++/* Chrontel 701x functions ================================= */
+ 
+ void
+-SiS_Chrontel701xBLOn(SiS_Private *SiS_Pr)
++SiS_Chrontel701xBLOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
+-#ifndef NEWCH701x
+   USHORT temp;
+-#endif  
+ 
+-  /* TW: Enable Chrontel 7019 LCD panel backlight */
++  /* Enable Chrontel 7019 LCD panel backlight */
+   if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
+-#ifdef NEWCH701x
++     if(HwDeviceExtension->jChipType == SIS_740) {
+         SiS_SetCH701x(SiS_Pr,0x6566);
+-#else  
++     } else {
+         temp = SiS_GetCH701x(SiS_Pr,0x66);
+         temp |= 0x20;
+ 	SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x66);
+-#endif	
++     }
+   }
+ }
+ 
+@@ -9110,7 +9297,7 @@ SiS_Chrontel701xBLOff(SiS_Private *SiS_P
+ {
+   USHORT temp;
+ 
+-  /* TW: Disable Chrontel 7019 LCD panel backlight */
++  /* Disable Chrontel 7019 LCD panel backlight */
+   if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
+         temp = SiS_GetCH701x(SiS_Pr,0x66);
+         temp &= 0xDF;
+@@ -9118,47 +9305,54 @@ SiS_Chrontel701xBLOff(SiS_Private *SiS_P
+   }
+ }
+ 
+-#ifdef SIS315H  /* -------- 310/325 series only --------- */
++#ifdef SIS315H  /* ----------- 315 series only ---------- */
+ 
+ void
+ SiS_SetCH701xForLCD(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
+ {
+-#ifdef NEWCH701x  
+-  UCHAR regtable[]  = { 0x1c, 0x5f, 0x64, 0x6f, 0x70, 0x71,
+-                        0x72, 0x73, 0x74, 0x76, 0x78, 0x7d, 0x66 };
+-  UCHAR table1024[] = { 0x60, 0x02, 0x00, 0x07, 0x40, 0xed,
+-                        0xa3, 0xc8, 0xc7, 0xac, 0xe0, 0x02, 0x44 }; 
+-  UCHAR table1280[] = { 0x60, 0x03, 0x11, 0x00, 0x40, 0xe3,
+-   			0xad, 0xdb, 0xf6, 0xac, 0xe0, 0x02, 0x44 }; 			
+-  UCHAR table1400[] = { 0x60, 0x03, 0x11, 0x00, 0x40, 0xe3,         
+-                        0xad, 0xdb, 0xf6, 0xac, 0xe0, 0x02, 0x44 }; 
+-  UCHAR table1600[] = { 0x60, 0x04, 0x11, 0x00, 0x40, 0xe3,
+-  			0xad, 0xde, 0xf6, 0xac, 0x60, 0x1a, 0x44 };
+-#else
+-  UCHAR regtable[]  = { 0x1c, 0x5f, 0x64, 0x6f, 0x70, 0x71,
+-                        0x72, 0x73, 0x74, 0x76, 0x78, 0x7d };
+-  UCHAR table1024[] = { 0x60, 0x02, 0x00, 0x07, 0x40, 0xed,
+-                        0xa3, 0xc8, 0xc7, 0xac, 0x60, 0x02 }; 
+-  UCHAR table1280[] = { 0x60, 0x03, 0x11, 0x00, 0x40, 0xe3,
+-   			0xad, 0xdb, 0xf6, 0xac, 0xe0, 0x02 }; 			
+-  UCHAR table1400[] = { 0x60, 0x03, 0x11, 0x00, 0x40, 0xef,   
+-                        0xad, 0xdb, 0xf6, 0xac, 0x60, 0x02 }; 
+-  UCHAR table1600[] = { 0x60, 0x04, 0x11, 0x00, 0x40, 0xe3,
+-  			0xad, 0xde, 0xf6, 0xac, 0x60, 0x1a };
+-#endif			
++  UCHAR regtable[]      = { 0x1c, 0x5f, 0x64, 0x6f, 0x70, 0x71,
++                            0x72, 0x73, 0x74, 0x76, 0x78, 0x7d, 0x66 };
++  UCHAR table1024_740[] = { 0x60, 0x02, 0x00, 0x07, 0x40, 0xed,
++                            0xa3, 0xc8, 0xc7, 0xac, 0xe0, 0x02, 0x44 };
++  UCHAR table1280_740[] = { 0x60, 0x03, 0x11, 0x00, 0x40, 0xe3,
++   			    0xad, 0xdb, 0xf6, 0xac, 0xe0, 0x02, 0x44 };
++  UCHAR table1400_740[] = { 0x60, 0x03, 0x11, 0x00, 0x40, 0xe3,
++                            0xad, 0xdb, 0xf6, 0xac, 0xe0, 0x02, 0x44 };
++  UCHAR table1600_740[] = { 0x60, 0x04, 0x11, 0x00, 0x40, 0xe3,
++  			    0xad, 0xde, 0xf6, 0xac, 0x60, 0x1a, 0x44 };
++  UCHAR table1024_650[] = { 0x60, 0x02, 0x00, 0x07, 0x40, 0xed,
++                            0xa3, 0xc8, 0xc7, 0xac, 0x60, 0x02 };
++  UCHAR table1280_650[] = { 0x60, 0x03, 0x11, 0x00, 0x40, 0xe3,
++   		   	    0xad, 0xdb, 0xf6, 0xac, 0xe0, 0x02 };
++  UCHAR table1400_650[] = { 0x60, 0x03, 0x11, 0x00, 0x40, 0xef,
++                            0xad, 0xdb, 0xf6, 0xac, 0x60, 0x02 };
++  UCHAR table1600_650[] = { 0x60, 0x04, 0x11, 0x00, 0x40, 0xe3,
++  			    0xad, 0xde, 0xf6, 0xac, 0x60, 0x1a };
+   UCHAR *tableptr = NULL;
+   USHORT tempbh;
+   int i;
+ 
+-  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+-     tableptr = table1024;
+-  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+-     tableptr = table1280;
+-  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+-     tableptr = table1400;
+-  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
+-     tableptr = table1600;
+-  } else return;
++  if(HwDeviceExtension->jChipType == SIS_740) {
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
++        tableptr = table1024_740;
++     } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
++        tableptr = table1280_740;
++     } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
++        tableptr = table1400_740;
++     } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
++        tableptr = table1600_740;
++     } else return;
++  } else {
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
++        tableptr = table1024_650;
++     } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
++        tableptr = table1280_650;
++     } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
++        tableptr = table1400_650;
++     } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
++        tableptr = table1600_650;
++     } else return;
++  }
+ 
+   tempbh = SiS_GetCH701x(SiS_Pr,0x74);
+   if((tempbh == 0xf6) || (tempbh == 0xc7)) {
+@@ -9172,54 +9366,64 @@ SiS_SetCH701xForLCD(SiS_Private *SiS_Pr,
+         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) return;
+      }
+   }
+-#ifdef NEWCH701x     /* New from 740/LVDS: */    
+-  for(i=0; i<0x0d; i++) {	
+-#else
+-  for(i=0; i<0x0c; i++) {
+-#endif  
++
++  if(HwDeviceExtension->jChipType == SIS_740) {
++     tempbh = 0x0d;
++  } else {
++     tempbh = 0x0c;
++  }
++  for(i = 0; i < tempbh; i++) {
+      SiS_SetCH701x(SiS_Pr,(tableptr[i] << 8) | regtable[i]);
+   }
+-  SiS_ChrontelPowerSequencing(SiS_Pr);
++  SiS_ChrontelPowerSequencing(SiS_Pr,HwDeviceExtension);
+   tempbh = SiS_GetCH701x(SiS_Pr,0x1e);
+   tempbh |= 0xc0;
+   SiS_SetCH701x(SiS_Pr,(tempbh << 8) | 0x1e);
+-  
+-#ifdef NEWCH701x     /* 740/LVDS: */
+-  tempbh = SiS_GetCH701x(SiS_Pr,0x1c);
+-  tempbh &= 0xfb;
+-  SiS_SetCH701x(SiS_Pr,(tempbh << 8) | 0x1c);
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port, 0x2d, 0x03);
+-  tempbh = SiS_GetCH701x(SiS_Pr,0x64);
+-  tempbh |= 0x40;
+-  SiS_SetCH701x(SiS_Pr,(tempbh << 8) | 0x64);
+-  tempbh = SiS_GetCH701x(SiS_Pr,0x03);
+-  tempbh &= 0x3f;
+-  SiS_SetCH701x(SiS_Pr,(tempbh << 8) | 0x03);
+-#endif  /* End 740/LVDS */
++
++  if(HwDeviceExtension->jChipType == SIS_740) {
++     tempbh = SiS_GetCH701x(SiS_Pr,0x1c);
++     tempbh &= 0xfb;
++     SiS_SetCH701x(SiS_Pr,(tempbh << 8) | 0x1c);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2d,0x03);
++     tempbh = SiS_GetCH701x(SiS_Pr,0x64);
++     tempbh |= 0x40;
++     SiS_SetCH701x(SiS_Pr,(tempbh << 8) | 0x64);
++     tempbh = SiS_GetCH701x(SiS_Pr,0x03);
++     tempbh &= 0x3f;
++     SiS_SetCH701x(SiS_Pr,(tempbh << 8) | 0x03);
++  }
+ }
+ 
+ void
+-SiS_ChrontelPowerSequencing(SiS_Private *SiS_Pr)
+-{
+-  UCHAR regtable[]  = { 0x67, 0x68, 0x69, 0x6a, 0x6b };
+-#ifdef NEWCH701x  
+-  UCHAR table1024[] = { 0x01, 0x02, 0x01, 0x01, 0x01 };
+-  UCHAR table1400[] = { 0x01, 0x6e, 0x01, 0x01, 0x01 };
+-#else
+-  UCHAR table1024[] = { 0x01, 0x02, 0x01, 0x01, 0x02 };
+-  UCHAR table1400[] = { 0x01, 0x02, 0x01, 0x01, 0x02 };
+-#endif  
++SiS_ChrontelPowerSequencing(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
++{
++  UCHAR regtable[]      = { 0x67, 0x68, 0x69, 0x6a, 0x6b };
++  UCHAR table1024_740[] = { 0x01, 0x02, 0x01, 0x01, 0x01 };
++  UCHAR table1400_740[] = { 0x01, 0x6e, 0x01, 0x01, 0x01 };
++  UCHAR table1024_650[] = { 0x01, 0x02, 0x01, 0x01, 0x02 };
++  UCHAR table1400_650[] = { 0x01, 0x02, 0x01, 0x01, 0x02 };
+   UCHAR *tableptr = NULL;
+   int i;
+ 
+   /* Set up Power up/down timing */
+-  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+-     tableptr = table1024;
+-  } else if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
+-            (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) ||
+-	    (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)) {
+-     tableptr = table1400;
+-  } else return;
++
++  if(HwDeviceExtension->jChipType == SIS_740) {
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
++        tableptr = table1024_740;
++     } else if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
++               (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) ||
++	       (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)) {
++        tableptr = table1400_740;
++     } else return;
++  } else {
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
++        tableptr = table1024_650;
++     } else if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
++               (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) ||
++	       (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)) {
++        tableptr = table1400_650;
++     } else return;
++  }
+   
+   for(i=0; i<5; i++) {
+      SiS_SetCH701x(SiS_Pr,(tableptr[i] << 8) | regtable[i]);
+@@ -9232,66 +9436,72 @@ SiS_Chrontel701xOn(SiS_Private *SiS_Pr, 
+   USHORT temp;
+ 
+   if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
+-#ifdef NEWCH701x
+-     temp = SiS_GetCH701x(SiS_Pr,0x1c);
+-     temp |= 0x04;
+-     SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x1c);
+-#endif 
++     if(HwDeviceExtension->jChipType == SIS_740) {
++        temp = SiS_GetCH701x(SiS_Pr,0x1c);
++        temp |= 0x04;
++        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x1c);
++     }
+      if(SiS_IsYPbPr(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+         temp = SiS_GetCH701x(SiS_Pr,0x01);
+ 	temp &= 0x3f;
+-	temp |= 0x80;	/* TW: Enable YPrPb (HDTV) */
++	temp |= 0x80;	/* Enable YPrPb (HDTV) */
+ 	SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x01);
+      }
+      if(SiS_IsChScart(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+         temp = SiS_GetCH701x(SiS_Pr,0x01);
+ 	temp &= 0x3f;
+-	temp |= 0xc0;	/* TW: Enable SCART + CVBS */
++	temp |= 0xc0;	/* Enable SCART + CVBS */
+ 	SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x01);
+      }
+-#ifdef NEWCH701x
+-     SiS_ChrontelDoSomething5(SiS_Pr);
+-     SiS_SetCH701x(SiS_Pr,0x2049);   			/* TW: Enable TV path */
+-#else      
+-     SiS_SetCH701x(SiS_Pr,0x2049);   			/* TW: Enable TV path */
+-     temp = SiS_GetCH701x(SiS_Pr,0x49);
+-     if(SiS_IsYPbPr(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-        temp = SiS_GetCH701x(SiS_Pr,0x73);
+-	temp |= 0x60;
+-	SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x73);
++     if(HwDeviceExtension->jChipType == SIS_740) {
++        SiS_ChrontelDoSomething5(SiS_Pr);
++        SiS_SetCH701x(SiS_Pr,0x2049);   			/* Enable TV path */
++     } else {
++        SiS_SetCH701x(SiS_Pr,0x2049);   			/* Enable TV path */
++        temp = SiS_GetCH701x(SiS_Pr,0x49);
++        if(SiS_IsYPbPr(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++           temp = SiS_GetCH701x(SiS_Pr,0x73);
++	   temp |= 0x60;
++	   SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x73);
++        }
++        temp = SiS_GetCH701x(SiS_Pr,0x47);
++        temp &= 0x7f;
++        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);
++        SiS_LongDelay(SiS_Pr,2);
++        temp = SiS_GetCH701x(SiS_Pr,0x47);
++        temp |= 0x80;
++        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);
+      }
+-     temp = SiS_GetCH701x(SiS_Pr,0x47);
+-     temp &= 0x7f;
+-     SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);
+-     SiS_LongDelay(SiS_Pr,2);
+-     temp = SiS_GetCH701x(SiS_Pr,0x47);
+-     temp |= 0x80;
+-     SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);
+-#endif     
+   }
+ }
+ 
+ void
+-SiS_Chrontel701xOff(SiS_Private *SiS_Pr)
++SiS_Chrontel701xOff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
+   USHORT temp;
+ 
++  /* Complete power down of LVDS */
+   if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
++     if(HwDeviceExtension->jChipType == SIS_740) {
++        SiS_LongDelay(SiS_Pr,1);
++	SiS_GenericDelay(SiS_Pr,0x16ff);
++	SiS_SetCH701x(SiS_Pr,0xac76);
++	SiS_SetCH701x(SiS_Pr,0x0066);
++     } else {
+         SiS_LongDelay(SiS_Pr,2);
+-	/* TW: Complete power down of LVDS */
+ 	temp = SiS_GetCH701x(SiS_Pr,0x76);
+ 	temp &= 0xfc;
+ 	SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x76);
+ 	SiS_SetCH701x(SiS_Pr,0x0066);
++     }
+   }
+ }
+ 
+-#ifdef NEWCH701x
+ void
+ SiS_ChrontelDoSomething5(SiS_Private *SiS_Pr)
+ {
+      unsigned char temp, temp1;
+-     
++
+      temp1 = SiS_GetCH701x(SiS_Pr,0x49);
+      SiS_SetCH701x(SiS_Pr,0x3e49);
+      temp = SiS_GetCH701x(SiS_Pr,0x47);
+@@ -9303,130 +9513,134 @@ SiS_ChrontelDoSomething5(SiS_Private *Si
+      SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);
+      SiS_SetCH701x(SiS_Pr,(temp1 << 8) | 0x49);
+ }
+-#endif
+ 
+ void
+ SiS_ChrontelResetDB(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+ {
+-#ifdef NEWCH701x
+      USHORT temp;
+-     
+-     /* 740/LVDS: */
+-     temp = SiS_GetCH701x(SiS_Pr,0x4a);
+-     temp &= 0x01;
+-     if(!(temp)) {
+-     
+-        if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-	   temp = SiS_GetCH701x(SiS_Pr,0x49);
+-	   SiS_SetCH701x(SiS_Pr,0x3e49);
+-	}
+-	/* TW: Reset Chrontel 7019 datapath */
++
++     if(HwDeviceExtension->jChipType == SIS_740) {
++        temp = SiS_GetCH701x(SiS_Pr,0x4a);
++        temp &= 0x01;
++        if(!(temp)) {
++
++           if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++	      temp = SiS_GetCH701x(SiS_Pr,0x49);
++	      SiS_SetCH701x(SiS_Pr,0x3e49);
++	   }
++	   /* Reset Chrontel 7019 datapath */
++           SiS_SetCH701x(SiS_Pr,0x1048);
++           SiS_LongDelay(SiS_Pr,1);
++           SiS_SetCH701x(SiS_Pr,0x1848);
++
++	   if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++	      SiS_ChrontelDoSomething5(SiS_Pr);
++	      SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x49);
++	   }
++
++        } else {
++
++           temp = SiS_GetCH701x(SiS_Pr,0x5c);
++	   temp &= 0xef;
++	   SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x5c);
++	   temp = SiS_GetCH701x(SiS_Pr,0x5c);
++	   temp |= 0x10;
++	   SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x5c);
++	   temp = SiS_GetCH701x(SiS_Pr,0x5c);
++	   temp &= 0xef;
++	   SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x5c);
++	   temp = SiS_GetCH701x(SiS_Pr,0x61);
++	   if(!temp) {
++	      SiS_SetCH701xForLCD(SiS_Pr,HwDeviceExtension,BaseAddr);
++	   }
++        }
++     } else { /* 650 */
++        /* Reset Chrontel 7019 datapath */
+         SiS_SetCH701x(SiS_Pr,0x1048);
+         SiS_LongDelay(SiS_Pr,1);
+         SiS_SetCH701x(SiS_Pr,0x1848);
+-	
+-	if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-	   SiS_ChrontelDoSomething5(SiS_Pr);
+-	   SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x49);
+-	}    
+-     } else {
+-     
+-        temp = SiS_GetCH701x(SiS_Pr,0x5c);
+-	temp &= 0xef;
+-	SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x5c);
+-	temp = SiS_GetCH701x(SiS_Pr,0x5c);
+-	temp |= 0x10;
+-	SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x5c);
+-	temp = SiS_GetCH701x(SiS_Pr,0x5c);
+-	temp &= 0xef;
+-	SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x5c);
+-	temp = SiS_GetCH701x(SiS_Pr,0x61);
+-	if(!temp) {
+-	   SiS_SetCH701xForLCD(SiS_Pr,HwDeviceExtension,BaseAddr);
+-	}
+-     }
+-#else /* pre 740/LVDS code */     
+-     /* TW: Reset Chrontel 7019 datapath */
+-     SiS_SetCH701x(SiS_Pr,0x1048);
+-     SiS_LongDelay(SiS_Pr,1);
+-     SiS_SetCH701x(SiS_Pr,0x1848);
+-#endif     
++     }
+ }
+ 
+ void
+ SiS_ChrontelDoSomething4(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+ {
+-#ifdef NEWCH701x
+-     if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-        SiS_ChrontelDoSomething5(SiS_Pr);
+-     }
+-#else
+      USHORT temp;
+ 
+-     SiS_SetCH701x(SiS_Pr,0xaf76);  /* Power up LVDS block */
+-     temp = SiS_GetCH701x(SiS_Pr,0x49);
+-     temp &= 1;
+-     if(temp != 1) {  /* TV block powered? (0 = yes, 1 = no) */
+-	temp = SiS_GetCH701x(SiS_Pr,0x47);
+-	temp &= 0x70;
+-	SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);  /* enable VSYNC */
+-	SiS_LongDelay(SiS_Pr,3);
+-	temp = SiS_GetCH701x(SiS_Pr,0x47);
+-	temp |= 0x80;
+-	SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);  /* disable VSYNC */
++     if(HwDeviceExtension->jChipType == SIS_740) {
++
++        if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++           SiS_ChrontelDoSomething5(SiS_Pr);
++        }
++
++     } else {
++
++        SiS_SetCH701x(SiS_Pr,0xaf76);  /* Power up LVDS block */
++        temp = SiS_GetCH701x(SiS_Pr,0x49);
++        temp &= 1;
++        if(temp != 1) {  /* TV block powered? (0 = yes, 1 = no) */
++	   temp = SiS_GetCH701x(SiS_Pr,0x47);
++	   temp &= 0x70;
++	   SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);  /* enable VSYNC */
++	   SiS_LongDelay(SiS_Pr,3);
++	   temp = SiS_GetCH701x(SiS_Pr,0x47);
++	   temp |= 0x80;
++	   SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);  /* disable VSYNC */
++        }
++
+      }
+-#endif     
+ }
+ 
+ void
+ SiS_ChrontelDoSomething3(SiS_Private *SiS_Pr, USHORT ModeNo, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+                          USHORT BaseAddr)
+ {
+-#ifdef NEWCH701x
+-     USHORT temp;
+-     
+-     temp = SiS_GetCH701x(SiS_Pr,0x61);
+-     if(temp < 1) {
+-          temp++;
+-	  SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x61);
+-     }
+-     SiS_SetCH701x(SiS_Pr,0x4566);
+-     SiS_SetCH701x(SiS_Pr,0xaf76);
+-     SiS_LongDelay(SiS_Pr,1);
+-     SiS_GenericDelay(SiS_Pr,0x16ff);
+-
+-#else
+      USHORT temp,temp1;
+-     
+-     temp1 = 0;
+-     temp = SiS_GetCH701x(SiS_Pr,0x61);
+-     if(temp < 2) {
+-          temp++;
+-	  SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x61);
+-	  temp1 = 1;
+-     }
+-     SiS_SetCH701x(SiS_Pr,0xac76);
+-     temp = SiS_GetCH701x(SiS_Pr,0x66);
+-     temp |= 0x5f;
+-     SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x66);
+-     if(ModeNo > 0x13) {
+-         if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-	    SiS_GenericDelay(SiS_Pr,0x3ff);
+-	 } else {
+-	    SiS_GenericDelay(SiS_Pr,0x2ff);
+-	 }
+-     } else {
+-         if(!temp1)
+-	    SiS_GenericDelay(SiS_Pr,0x2ff);
++
++     if(HwDeviceExtension->jChipType == SIS_740) {
++
++        temp = SiS_GetCH701x(SiS_Pr,0x61);
++        if(temp < 1) {
++           temp++;
++	   SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x61);
++        }
++        SiS_SetCH701x(SiS_Pr,0x4566);
++        SiS_SetCH701x(SiS_Pr,0xaf76);
++        SiS_LongDelay(SiS_Pr,1);
++        SiS_GenericDelay(SiS_Pr,0x16ff);
++
++     } else {  /* 650 */
++
++        temp1 = 0;
++        temp = SiS_GetCH701x(SiS_Pr,0x61);
++        if(temp < 2) {
++           temp++;
++	   SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x61);
++	   temp1 = 1;
++        }
++        SiS_SetCH701x(SiS_Pr,0xac76);
++        temp = SiS_GetCH701x(SiS_Pr,0x66);
++        temp |= 0x5f;
++        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x66);
++        if(ModeNo > 0x13) {
++           if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++	      SiS_GenericDelay(SiS_Pr,0x3ff);
++	   } else {
++	      SiS_GenericDelay(SiS_Pr,0x2ff);
++	   }
++        } else {
++           if(!temp1)
++	      SiS_GenericDelay(SiS_Pr,0x2ff);
++        }
++        temp = SiS_GetCH701x(SiS_Pr,0x76);
++        temp |= 0x03;
++        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x76);
++        temp = SiS_GetCH701x(SiS_Pr,0x66);
++        temp &= 0x7f;
++        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x66);
++        SiS_LongDelay(SiS_Pr,1);
++
+      }
+-     temp = SiS_GetCH701x(SiS_Pr,0x76);
+-     temp |= 0x03;
+-     SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x76);
+-     temp = SiS_GetCH701x(SiS_Pr,0x66);
+-     temp &= 0x7f;
+-     SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x66);
+-     SiS_LongDelay(SiS_Pr,1);
+-#endif     
+ }
+ 
+ void
+@@ -9443,9 +9657,9 @@ SiS_ChrontelDoSomething2(SiS_Private *Si
+        temp &= 0x04;
+        if(temp == 0x04) break;
+        
+-#ifdef NEWCH701x
+-       SiS_SetCH701x(SiS_Pr,0xac76);    /* 740/LVDS */
+-#endif       
++       if(HwDeviceExtension->jChipType == SIS_740) {
++          SiS_SetCH701x(SiS_Pr,0xac76);
++       }
+ 
+        SiS_SetCH701xForLCD(SiS_Pr,HwDeviceExtension,BaseAddr);
+ 
+@@ -9463,11 +9677,11 @@ SiS_ChrontelDoSomething2(SiS_Private *Si
+        temp = SiS_GetCH701x(SiS_Pr,0x76);
+        temp |= 0x04;
+        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x76);
+-#ifdef NEWCH701x
+-       SiS_SetCH701x(SiS_Pr,0xe078);
+-#else       
+-       SiS_SetCH701x(SiS_Pr,0x6078);
+-#endif       
++       if(HwDeviceExtension->jChipType == SIS_740) {
++          SiS_SetCH701x(SiS_Pr,0xe078);
++       } else {
++          SiS_SetCH701x(SiS_Pr,0x6078);
++       }
+        SiS_LongDelay(SiS_Pr,2);
+     } while(0);
+ 
+@@ -9485,51 +9699,52 @@ SiS_ChrontelDoSomething1(SiS_Private *Si
+      temp &= 0xbf;	/* Set datapath 2 to LVDS */
+      SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x03);
+      
+-#ifdef NEWCH701x   /* 740/LVDS: */
++     if(HwDeviceExtension->jChipType == SIS_740) {
++
++        temp = SiS_GetCH701x(SiS_Pr,0x1c);
++        temp &= 0xfb;
++        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x1c);
++
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2d,0x03);
++
++        temp = SiS_GetCH701x(SiS_Pr,0x64);
++        temp |= 0x40;
++        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x64);
++
++        temp = SiS_GetCH701x(SiS_Pr,0x03);
++        temp &= 0x3f;
++        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x03);
++
++        temp = SiS_GetCH701x(SiS_Pr,0x66);
++        if(temp != 0x45) {
++           SiS_ChrontelResetDB(SiS_Pr,HwDeviceExtension,BaseAddr);
++           SiS_ChrontelDoSomething2(SiS_Pr,HwDeviceExtension,BaseAddr);
++	   temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x34);
++           SiS_ChrontelDoSomething3(SiS_Pr,temp,HwDeviceExtension,BaseAddr);
++        }
++
++     } else { /* 650 */
+ 
+-     temp = SiS_GetCH701x(SiS_Pr,0x1c);
+-     temp &= 0xfb;
+-     SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x1c);
+-     
+-     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2d,0x03);
+-     
+-     temp = SiS_GetCH701x(SiS_Pr,0x64);
+-     temp |= 0x40;
+-     SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x64);
+-     
+-     temp = SiS_GetCH701x(SiS_Pr,0x03);
+-     temp &= 0x3f;	
+-     SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x03);
+-     
+-     temp = SiS_GetCH701x(SiS_Pr,0x66);
+-     if(temp != 0x45) {
+         SiS_ChrontelResetDB(SiS_Pr,HwDeviceExtension,BaseAddr);
+-        SiS_ChrontelDoSomething2(SiS_Pr,HwDeviceExtension,BaseAddr);
+-	temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x34);
+-        SiS_ChrontelDoSomething3(SiS_Pr,temp,HwDeviceExtension,BaseAddr);
+-     }     
+ 
+-#else  /* pre-740/LVDS: */     
++        SiS_ChrontelDoSomething2(SiS_Pr,HwDeviceExtension,BaseAddr);
+ 
+-     SiS_ChrontelResetDB(SiS_Pr);
++        temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x34);
++        SiS_ChrontelDoSomething3(SiS_Pr,temp,HwDeviceExtension,BaseAddr);
+ 
+-     SiS_ChrontelDoSomething2(SiS_Pr,HwDeviceExtension,BaseAddr);
++        SiS_SetCH701x(SiS_Pr,0xaf76);
+ 
+-     temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x34);
+-     SiS_ChrontelDoSomething3(SiS_Pr,temp,HwDeviceExtension,BaseAddr);
++     }
+ 
+-     SiS_SetCH701x(SiS_Pr,0xaf76);
+-     
+-#endif  /* End of pre-740/LVDS */
+ }
+ 
+-#endif  /* 310/325 series --------------------------------- */
++#endif  /* 315 series ------------------------------------ */
+ 
+-/* TW: End of Chrontel 701x functions ==================================== */
++/* End of Chrontel 701x functions ==================================== */
+ 
+-/* TW: Generic Read/write routines for Chrontel ========================== */
++/* Generic Read/write routines for Chrontel ========================== */
+ 
+-/* TW: The Chrontel is connected to the 630/730 via
++/* The Chrontel is connected to the 630/730 via
+  * the 630/730's DDC/I2C port.
+  *
+  * On 630(S)T chipset, the index changed from 0x11 to 0x0a,
+@@ -9539,13 +9754,13 @@ SiS_ChrontelDoSomething1(SiS_Private *Si
+ void
+ SiS_SetCH70xx(SiS_Private *SiS_Pr, USHORT tempbx)
+ {
+-   if (SiS_Pr->SiS_IF_DEF_CH70xx == 1)
++   if(SiS_Pr->SiS_IF_DEF_CH70xx == 1)
+       SiS_SetCH700x(SiS_Pr,tempbx);
+    else
+       SiS_SetCH701x(SiS_Pr,tempbx);
+ }
+ 
+-/* TW: Write to Chrontel 700x */
++/* Write to Chrontel 700x */
+ /* Parameter is [Data (S15-S8) | Register no (S7-S0)] */
+ void
+ SiS_SetCH700x(SiS_Private *SiS_Pr, USHORT tempbx)
+@@ -9553,100 +9768,100 @@ SiS_SetCH700x(SiS_Private *SiS_Pr, USHOR
+   USHORT tempah,temp,i;
+ 
+   if(!(SiS_Pr->SiS_ChrontelInit)) {
+-     SiS_Pr->SiS_DDC_Index = 0x11;		   /* TW: Bit 0 = SC;  Bit 1 = SD */
++     SiS_Pr->SiS_DDC_Index = 0x11;		   /* Bit 0 = SC;  Bit 1 = SD */
+      SiS_Pr->SiS_DDC_Data  = 0x02;                 /* Bitmask in IndexReg for Data */
+      SiS_Pr->SiS_DDC_Clk   = 0x01;                 /* Bitmask in IndexReg for Clk */
+      SiS_Pr->SiS_DDC_DataShift = 0x00;
+-     SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;  	   /* TW: DAB (Device Address Byte) */
++     SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;  	   /* DAB (Device Address Byte) */
+   }
+ 
+-  for(i=0;i<10;i++) {	/* TW: Do only 10 attempts to write */
++  for(i=0;i<10;i++) {	/* Do only 10 attempts to write */
+     /* SiS_SetSwitchDDC2(SiS_Pr); */
+-    if(SiS_SetStart(SiS_Pr)) continue;		/* TW: Set start condition */
++    if(SiS_SetStart(SiS_Pr)) continue;		/* Set start condition */
+     tempah = SiS_Pr->SiS_DDC_DeviceAddr;
+-    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* TW: Write DAB (S0=0=write) */
+-    if(temp) continue;				/* TW:    (ERROR: no ack) */
+-    tempah = tempbx & 0x00FF;			/* TW: Write RAB */
+-    tempah |= 0x80;                             /* TW: (set bit 7, see datasheet) */
++    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* Write DAB (S0=0=write) */
++    if(temp) continue;				/*    (ERROR: no ack) */
++    tempah = tempbx & 0x00FF;			/* Write RAB */
++    tempah |= 0x80;                             /* (set bit 7, see datasheet) */
+     temp = SiS_WriteDDC2Data(SiS_Pr,tempah);
+-    if(temp) continue;				/* TW:    (ERROR: no ack) */
++    if(temp) continue;				/*    (ERROR: no ack) */
+     tempah = (tempbx & 0xFF00) >> 8;
+-    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* TW: Write data */
+-    if(temp) continue;				/* TW:    (ERROR: no ack) */
+-    if(SiS_SetStop(SiS_Pr)) continue;		/* TW: Set stop condition */
++    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* Write data */
++    if(temp) continue;				/*    (ERROR: no ack) */
++    if(SiS_SetStop(SiS_Pr)) continue;		/* Set stop condition */
+     SiS_Pr->SiS_ChrontelInit = 1;
+     return;
+   }
+ 
+-  /* TW: For 630ST */
++  /* For 630ST */
+   if(!(SiS_Pr->SiS_ChrontelInit)) {
+-     SiS_Pr->SiS_DDC_Index = 0x0a;		/* TW: Bit 7 = SC;  Bit 6 = SD */
++     SiS_Pr->SiS_DDC_Index = 0x0a;		/* Bit 7 = SC;  Bit 6 = SD */
+      SiS_Pr->SiS_DDC_Data  = 0x80;              /* Bitmask in IndexReg for Data */
+      SiS_Pr->SiS_DDC_Clk   = 0x40;              /* Bitmask in IndexReg for Clk */
+      SiS_Pr->SiS_DDC_DataShift = 0x00;
+-     SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;  	/* TW: DAB (Device Address Byte) */
++     SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;  	/* DAB (Device Address Byte) */
+ 
+-     for(i=0;i<10;i++) {	/* TW: Do only 10 attempts to write */
++     for(i=0;i<10;i++) {	/* Do only 10 attempts to write */
+        /* SiS_SetSwitchDDC2(SiS_Pr); */
+-       if (SiS_SetStart(SiS_Pr)) continue;	/* TW: Set start condition */
++       if (SiS_SetStart(SiS_Pr)) continue;	/* Set start condition */
+        tempah = SiS_Pr->SiS_DDC_DeviceAddr;
+-       temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* TW: Write DAB (S0=0=write) */
+-       if(temp) continue;			/* TW:    (ERROR: no ack) */
+-       tempah = tempbx & 0x00FF;		/* TW: Write RAB */
+-       tempah |= 0x80;                          /* TW: (set bit 7, see datasheet) */
++       temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* Write DAB (S0=0=write) */
++       if(temp) continue;			/*    (ERROR: no ack) */
++       tempah = tempbx & 0x00FF;		/* Write RAB */
++       tempah |= 0x80;                          /* (set bit 7, see datasheet) */
+        temp = SiS_WriteDDC2Data(SiS_Pr,tempah);
+-       if(temp) continue;			/* TW:    (ERROR: no ack) */
++       if(temp) continue;			/*    (ERROR: no ack) */
+        tempah = (tempbx & 0xFF00) >> 8;
+-       temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* TW: Write data */
+-       if(temp) continue;			/* TW:    (ERROR: no ack) */
+-       if(SiS_SetStop(SiS_Pr)) continue;	/* TW: Set stop condition */
++       temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* Write data */
++       if(temp) continue;			/*    (ERROR: no ack) */
++       if(SiS_SetStop(SiS_Pr)) continue;	/* Set stop condition */
+        SiS_Pr->SiS_ChrontelInit = 1;
+        return;
+     }
+   }
+ }
+ 
+-/* TW: Write to Chrontel 701x */
++/* Write to Chrontel 701x */
+ /* Parameter is [Data (S15-S8) | Register no (S7-S0)] */
+ void
+ SiS_SetCH701x(SiS_Private *SiS_Pr, USHORT tempbx)
+ {
+   USHORT tempah,temp,i;
+ 
+-  SiS_Pr->SiS_DDC_Index = 0x11;			/* TW: Bit 0 = SC;  Bit 1 = SD */
++  SiS_Pr->SiS_DDC_Index = 0x11;			/* Bit 0 = SC;  Bit 1 = SD */
+   SiS_Pr->SiS_DDC_Data  = 0x08;                 /* Bitmask in IndexReg for Data */
+   SiS_Pr->SiS_DDC_Clk   = 0x04;                 /* Bitmask in IndexReg for Clk */
+   SiS_Pr->SiS_DDC_DataShift = 0x00;
+-  SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;  		/* TW: DAB (Device Address Byte) */
++  SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;  		/* DAB (Device Address Byte) */
+ 
+-  for(i=0;i<10;i++) {	/* TW: Do only 10 attempts to write */
+-    if (SiS_SetStart(SiS_Pr)) continue;		/* TW: Set start condition */
++  for(i=0;i<10;i++) {	/* Do only 10 attempts to write */
++    if (SiS_SetStart(SiS_Pr)) continue;		/* Set start condition */
+     tempah = SiS_Pr->SiS_DDC_DeviceAddr;
+-    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* TW: Write DAB (S0=0=write) */
+-    if(temp) continue;				/* TW:    (ERROR: no ack) */
++    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* Write DAB (S0=0=write) */
++    if(temp) continue;				/*    (ERROR: no ack) */
+     tempah = tempbx & 0x00FF;
+-    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* TW: Write RAB */
+-    if(temp) continue;				/* TW:    (ERROR: no ack) */
++    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* Write RAB */
++    if(temp) continue;				/*    (ERROR: no ack) */
+     tempah = (tempbx & 0xFF00) >> 8;
+-    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* TW: Write data */
+-    if(temp) continue;				/* TW:    (ERROR: no ack) */
+-    if(SiS_SetStop(SiS_Pr)) continue;		/* TW: Set stop condition */
++    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* Write data */
++    if(temp) continue;				/*    (ERROR: no ack) */
++    if(SiS_SetStop(SiS_Pr)) continue;		/* Set stop condition */
+     return;
+   }
+ }
+ 
+-/* TW: Read from Chrontel 70xx */
++/* Read from Chrontel 70xx */
+ /* Parameter is [Register no (S7-S0)] */
+ USHORT
+ SiS_GetCH70xx(SiS_Private *SiS_Pr, USHORT tempbx)
+ {
+-   if (SiS_Pr->SiS_IF_DEF_CH70xx == 1)
++   if(SiS_Pr->SiS_IF_DEF_CH70xx == 1)
+       return(SiS_GetCH700x(SiS_Pr,tempbx));
+    else
+       return(SiS_GetCH701x(SiS_Pr,tempbx));
+ }
+ 
+-/* TW: Read from Chrontel 700x */
++/* Read from Chrontel 700x */
+ /* Parameter is [Register no (S7-S0)] */
+ USHORT
+ SiS_GetCH700x(SiS_Private *SiS_Pr, USHORT tempbx)
+@@ -9654,57 +9869,57 @@ SiS_GetCH700x(SiS_Private *SiS_Pr, USHOR
+   USHORT tempah,temp,i;
+ 
+   if(!(SiS_Pr->SiS_ChrontelInit)) {
+-     SiS_Pr->SiS_DDC_Index = 0x11;		/* TW: Bit 0 = SC;  Bit 1 = SD */
++     SiS_Pr->SiS_DDC_Index = 0x11;		/* Bit 0 = SC;  Bit 1 = SD */
+      SiS_Pr->SiS_DDC_Data  = 0x02;              /* Bitmask in IndexReg for Data */
+      SiS_Pr->SiS_DDC_Clk   = 0x01;              /* Bitmask in IndexReg for Clk */
+      SiS_Pr->SiS_DDC_DataShift = 0x00;
+-     SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;		/* TW: DAB */
++     SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;		/* DAB */
+   }
+ 
+   SiS_Pr->SiS_DDC_ReadAddr = tempbx;
+ 
+-  for(i=0;i<20;i++) {	/* TW: Do only 20 attempts to read */
++  for(i=0;i<20;i++) {	/* Do only 20 attempts to read */
+     /* SiS_SetSwitchDDC2(SiS_Pr); */
+-    if(SiS_SetStart(SiS_Pr)) continue;		/* TW: Set start condition */
++    if(SiS_SetStart(SiS_Pr)) continue;		/* Set start condition */
+     tempah = SiS_Pr->SiS_DDC_DeviceAddr;
+-    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* TW: Write DAB (S0=0=write) */
+-    if(temp) continue;				/* TW:        (ERROR: no ack) */
+-    tempah = SiS_Pr->SiS_DDC_ReadAddr | 0x80;	/* TW: Write RAB | 0x80 */
++    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* Write DAB (S0=0=write) */
++    if(temp) continue;				/*        (ERROR: no ack) */
++    tempah = SiS_Pr->SiS_DDC_ReadAddr | 0x80;	/* Write RAB | 0x80 */
+     temp = SiS_WriteDDC2Data(SiS_Pr,tempah);
+-    if(temp) continue;				/* TW:        (ERROR: no ack) */
+-    if (SiS_SetStart(SiS_Pr)) continue;		/* TW: Re-start */
++    if(temp) continue;				/*        (ERROR: no ack) */
++    if (SiS_SetStart(SiS_Pr)) continue;		/* Re-start */
+     tempah = SiS_Pr->SiS_DDC_DeviceAddr | 0x01; /* DAB | 0x01 = Read */
+-    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* TW: DAB (S0=1=read) */
+-    if(temp) continue;				/* TW:        (ERROR: no ack) */
+-    tempah = SiS_ReadDDC2Data(SiS_Pr,tempah);	/* TW: Read byte */
+-    if (SiS_SetStop(SiS_Pr)) continue;		/* TW: Stop condition */
++    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* DAB (S0=1=read) */
++    if(temp) continue;				/*        (ERROR: no ack) */
++    tempah = SiS_ReadDDC2Data(SiS_Pr,tempah);	/* Read byte */
++    if (SiS_SetStop(SiS_Pr)) continue;		/* Stop condition */
+     SiS_Pr->SiS_ChrontelInit = 1;
+     return(tempah);
+   }
+ 
+-  /* TW: For 630ST */
++  /* For 630ST */
+   if(!SiS_Pr->SiS_ChrontelInit) {
+-     SiS_Pr->SiS_DDC_Index = 0x0a;		/* TW: Bit 0 = SC;  Bit 1 = SD */
++     SiS_Pr->SiS_DDC_Index = 0x0a;		/* Bit 0 = SC;  Bit 1 = SD */
+      SiS_Pr->SiS_DDC_Data  = 0x80;              /* Bitmask in IndexReg for Data */
+      SiS_Pr->SiS_DDC_Clk   = 0x40;              /* Bitmask in IndexReg for Clk */
+      SiS_Pr->SiS_DDC_DataShift = 0x00;
+-     SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;  	/* TW: DAB (Device Address Byte) */
++     SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;  	/* DAB (Device Address Byte) */
+ 
+-     for(i=0;i<20;i++) {	/* TW: Do only 20 attempts to read */
++     for(i=0;i<20;i++) {	/* Do only 20 attempts to read */
+        /* SiS_SetSwitchDDC2(SiS_Pr); */
+-       if(SiS_SetStart(SiS_Pr)) continue;		/* TW: Set start condition */
++       if(SiS_SetStart(SiS_Pr)) continue;		/* Set start condition */
+        tempah = SiS_Pr->SiS_DDC_DeviceAddr;
+-       temp = SiS_WriteDDC2Data(SiS_Pr,tempah);		/* TW: Write DAB (S0=0=write) */
+-       if(temp) continue;				/* TW:        (ERROR: no ack) */
+-       tempah = SiS_Pr->SiS_DDC_ReadAddr | 0x80;	/* TW: Write RAB | 0x80 */
++       temp = SiS_WriteDDC2Data(SiS_Pr,tempah);		/* Write DAB (S0=0=write) */
++       if(temp) continue;				/*        (ERROR: no ack) */
++       tempah = SiS_Pr->SiS_DDC_ReadAddr | 0x80;	/* Write RAB | 0x80 */
+        temp = SiS_WriteDDC2Data(SiS_Pr,tempah);
+-       if(temp) continue;				/* TW:        (ERROR: no ack) */
+-       if (SiS_SetStart(SiS_Pr)) continue;		/* TW: Re-start */
++       if(temp) continue;				/*        (ERROR: no ack) */
++       if (SiS_SetStart(SiS_Pr)) continue;		/* Re-start */
+        tempah = SiS_Pr->SiS_DDC_DeviceAddr | 0x01; 	/* DAB | 0x01 = Read */
+-       temp = SiS_WriteDDC2Data(SiS_Pr,tempah);		/* TW: DAB (S0=1=read) */
+-       if(temp) continue;				/* TW:        (ERROR: no ack) */
+-       tempah = SiS_ReadDDC2Data(SiS_Pr,tempah);	/* TW: Read byte */
+-       if (SiS_SetStop(SiS_Pr)) continue;		/* TW: Stop condition */
++       temp = SiS_WriteDDC2Data(SiS_Pr,tempah);		/* DAB (S0=1=read) */
++       if(temp) continue;				/*        (ERROR: no ack) */
++       tempah = SiS_ReadDDC2Data(SiS_Pr,tempah);	/* Read byte */
++       if (SiS_SetStop(SiS_Pr)) continue;		/* Stop condition */
+        SiS_Pr->SiS_ChrontelInit = 1;
+        return(tempah);
+      }
+@@ -9712,52 +9927,51 @@ SiS_GetCH700x(SiS_Private *SiS_Pr, USHOR
+   return(0xFFFF);
+ }
+ 
+-/* TW: Read from Chrontel 701x */
++/* Read from Chrontel 701x */
+ /* Parameter is [Register no (S7-S0)] */
+ USHORT
+ SiS_GetCH701x(SiS_Private *SiS_Pr, USHORT tempbx)
+ {
+   USHORT tempah,temp,i;
+ 
+-  SiS_Pr->SiS_DDC_Index = 0x11;			/* TW: Bit 0 = SC;  Bit 1 = SD */
++  SiS_Pr->SiS_DDC_Index = 0x11;			/* Bit 0 = SC;  Bit 1 = SD */
+   SiS_Pr->SiS_DDC_Data  = 0x08;                 /* Bitmask in IndexReg for Data */
+   SiS_Pr->SiS_DDC_Clk   = 0x04;                 /* Bitmask in IndexReg for Clk */
+   SiS_Pr->SiS_DDC_DataShift = 0x00;
+-  SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;		/* TW: DAB */
++  SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;		/* DAB */
+   SiS_Pr->SiS_DDC_ReadAddr = tempbx;
+ 
+-   for(i=0;i<20;i++) {	/* TW: Do only 20 attempts to read */
+-    if(SiS_SetStart(SiS_Pr)) continue;		/* TW: Set start condition */
++   for(i=0;i<20;i++) {	/* Do only 20 attempts to read */
++    if(SiS_SetStart(SiS_Pr)) continue;		/* Set start condition */
+     tempah = SiS_Pr->SiS_DDC_DeviceAddr;
+-    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* TW: Write DAB (S0=0=write) */
+-    if(temp) continue;				/* TW:        (ERROR: no ack) */
+-    tempah = SiS_Pr->SiS_DDC_ReadAddr;		/* TW: Write RAB */
++    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* Write DAB (S0=0=write) */
++    if(temp) continue;				/*        (ERROR: no ack) */
++    tempah = SiS_Pr->SiS_DDC_ReadAddr;		/* Write RAB */
+     temp = SiS_WriteDDC2Data(SiS_Pr,tempah);
+-    if(temp) continue;				/* TW:        (ERROR: no ack) */
+-    if (SiS_SetStart(SiS_Pr)) continue;		/* TW: Re-start */
++    if(temp) continue;				/*        (ERROR: no ack) */
++    if (SiS_SetStart(SiS_Pr)) continue;		/* Re-start */
+     tempah = SiS_Pr->SiS_DDC_DeviceAddr | 0x01; /* DAB | 0x01 = Read */
+-    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* TW: DAB (S0=1=read) */
+-    if(temp) continue;				/* TW:        (ERROR: no ack) */
+-    tempah = SiS_ReadDDC2Data(SiS_Pr,tempah);	/* TW: Read byte */
+-    SiS_SetStop(SiS_Pr);			/* TW: Stop condition */
++    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);	/* DAB (S0=1=read) */
++    if(temp) continue;				/*        (ERROR: no ack) */
++    tempah = SiS_ReadDDC2Data(SiS_Pr,tempah);	/* Read byte */
++    SiS_SetStop(SiS_Pr);			/* Stop condition */
+     return(tempah);
+    }
+   return 0xFFFF;
+ }
+ 
+-#ifdef LINUX_XF86
+-/* TW: Our own DDC functions */
++/* Our own DDC functions */
+ USHORT
+-SiS_InitDDCRegs(SiS_Private *SiS_Pr, SISPtr pSiS, USHORT adaptnum, USHORT DDCdatatype,
+-		BOOLEAN checkcr32)
++SiS_InitDDCRegs(SiS_Private *SiS_Pr, unsigned long VBFlags, int VGAEngine,
++                USHORT adaptnum, USHORT DDCdatatype, BOOLEAN checkcr32)
+ {
+      unsigned char ddcdtype[] = { 0xa0, 0xa0, 0xa0, 0xa2, 0xa6 };
+      unsigned char flag, cr32;
+      USHORT        temp = 0, myadaptnum = adaptnum;
+ 
+      if(adaptnum != 0) {
+-        if(!(pSiS->VBFlags & (VB_301|VB_301B|VB_302B))) return 0xFFFF;
+-	if((pSiS->VBFlags & VB_30xBDH) && (adaptnum == 1)) return 0xFFFF;
++        if(!(VBFlags & (VB_301|VB_301B|VB_302B))) return 0xFFFF;
++	if((VBFlags & VB_30xBDH) && (adaptnum == 1)) return 0xFFFF;
+      }	
+      
+      /* adapternum for SiS bridges: 0 = CRT1, 1 = LCD, 2 = VGA2 */
+@@ -9771,8 +9985,9 @@ SiS_InitDDCRegs(SiS_Private *SiS_Pr, SIS
+      flag = 0xff;
+ 
+      cr32 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x32);
+-  
+-     if(pSiS->VBFlags & VB_SISBRIDGE) {
++
++#if 0
++     if(VBFlags & VB_SISBRIDGE) {
+ 	if(myadaptnum == 0) {
+ 	   if(!(cr32 & 0x20)) {
+ 	      myadaptnum = 2;
+@@ -9785,18 +10000,19 @@ SiS_InitDDCRegs(SiS_Private *SiS_Pr, SIS
+ 	   }
+         }
+      }
++#endif
+ 
+-     if(pSiS->VGAEngine == SIS_300_VGA) {		/* 300 series */
++     if(VGAEngine == SIS_300_VGA) {		/* 300 series */
+ 	
+         if(myadaptnum != 0) {
+ 	   flag = 0;
+-	   if(pSiS->VBFlags & VB_SISBRIDGE) {
++	   if(VBFlags & VB_SISBRIDGE) {
+ 	      SiS_Pr->SiS_DDC_Port = SiS_Pr->SiS_Part4Port;
+               SiS_Pr->SiS_DDC_Index = 0x0f;
+ 	   }
+         }
+ 
+-	if(!(pSiS->VBFlags & VB_301)) {
++	if(!(VBFlags & VB_301)) {
+ 	   if((cr32 & 0x80) && (checkcr32)) {
+               if(myadaptnum >= 1) {
+ 	         if(!(cr32 & 0x08)) {
+@@ -9810,11 +10026,11 @@ SiS_InitDDCRegs(SiS_Private *SiS_Pr, SIS
+ 	temp = 4 - (myadaptnum * 2);
+ 	if(flag) temp = 0;
+ 
+-     } else {						/* 310/325/330 series */
++     } else {						/* 315/330 series */
+ 
+      	/* here we simplify: 0 = CRT1, 1 = CRT2 (VGA, LCD) */
+ 	
+-	if(pSiS->VBFlags & VB_SISBRIDGE) {
++	if(VBFlags & VB_SISBRIDGE) {
+ 	   if(myadaptnum == 2) {
+ 	      myadaptnum = 1;
+            }
+@@ -9822,7 +10038,7 @@ SiS_InitDDCRegs(SiS_Private *SiS_Pr, SIS
+ 
+         if(myadaptnum == 1) {
+      	   flag = 0;
+-	   if(pSiS->VBFlags & VB_SISBRIDGE) {
++	   if(VBFlags & VB_SISBRIDGE) {
+ 	      SiS_Pr->SiS_DDC_Port = SiS_Pr->SiS_Part4Port;
+               SiS_Pr->SiS_DDC_Index = 0x0f;
+ 	   }
+@@ -9840,7 +10056,7 @@ SiS_InitDDCRegs(SiS_Private *SiS_Pr, SIS
+         temp = myadaptnum;
+         if(myadaptnum == 1) {
+            temp = 0;
+-	   if(pSiS->VBFlags & VB_LVDS) flag = 0xff;
++	   if(VBFlags & VB_LVDS) flag = 0xff;
+         }
+ 
+ 	if(flag) temp = 0;
+@@ -9852,7 +10068,7 @@ SiS_InitDDCRegs(SiS_Private *SiS_Pr, SIS
+ #ifdef TWDEBUG
+     xf86DrvMsg(0, X_INFO, "DDC Port %x Index %x Shift %d\n",
+     		SiS_Pr->SiS_DDC_Port, SiS_Pr->SiS_DDC_Index, temp);
+-#endif	 
++#endif
+     
+     return 0;
+ }
+@@ -9862,15 +10078,9 @@ SiS_WriteDABDDC(SiS_Private *SiS_Pr)
+ {
+    if(SiS_SetStart(SiS_Pr)) return 0xFFFF;
+    if(SiS_WriteDDC2Data(SiS_Pr, SiS_Pr->SiS_DDC_DeviceAddr)) {
+-#ifdef TWDEBUG
+-        xf86DrvMsg(0, X_INFO, "WriteDAB 1 failed\n");
+-#endif	 
+   	return 0xFFFF;
+    }
+    if(SiS_WriteDDC2Data(SiS_Pr, SiS_Pr->SiS_DDC_SecAddr)) {
+-#ifdef TWDEBUG
+-        xf86DrvMsg(0, X_INFO, "WriteDAB 2 failed\n");
+-#endif	 
+    	return 0xFFFF;
+    }
+    return(0);
+@@ -9881,9 +10091,6 @@ SiS_PrepareReadDDC(SiS_Private *SiS_Pr)
+ {
+    if(SiS_SetStart(SiS_Pr)) return 0xFFFF;
+    if(SiS_WriteDDC2Data(SiS_Pr, (SiS_Pr->SiS_DDC_DeviceAddr | 0x01))) {
+-#ifdef TWDEBUG
+-        xf86DrvMsg(0, X_INFO, "PrepareReadDDC 1 failed\n");
+-#endif	 
+    	return 0xFFFF;
+    }
+    return(0);
+@@ -9921,9 +10128,6 @@ SiS_DoProbeDDC(SiS_Private *SiS_Pr)
+     SiS_SetSwitchDDC2(SiS_Pr);
+     if(SiS_PrepareDDC(SiS_Pr)) {
+          SiS_SetStop(SiS_Pr);
+-#ifdef TWDEBUG
+-	 xf86DrvMsg(0, X_INFO, "DoProbeDDC 1 failed at PrepareDDC\n");
+-#endif	 
+          return(0xFFFF);
+     }
+     mask = 0xf0;
+@@ -9972,7 +10176,7 @@ SiS_ProbeDDC(SiS_Private *SiS_Pr)
+ }
+ 
+ USHORT
+-SiS_ReadDDC(SiS_Private *SiS_Pr, SISPtr pSiS, USHORT DDCdatatype, unsigned char *buffer)
++SiS_ReadDDC(SiS_Private *SiS_Pr, USHORT DDCdatatype, unsigned char *buffer)
+ {
+    USHORT flag, length, i;
+    unsigned char chksum,gotcha;
+@@ -10004,28 +10208,7 @@ SiS_ReadDDC(SiS_Private *SiS_Pr, SISPtr 
+    return(flag);
+ }
+ 
+-USHORT
+-SiS_ReadLCDDDC(SiS_Private *SiS_Pr, USHORT length, unsigned char *buffer)
+-{
+-   USHORT i=0, flag=0;
+-
+-   length--;
+-   
+-   SiS_SetSwitchDDC2(SiS_Pr);
+-   if(!(SiS_PrepareDDC(SiS_Pr))) {
+-      for(i=0; i<length; i++) {
+-         buffer[i] = (unsigned char)SiS_ReadDDC2Data(SiS_Pr, 0);
+-         SiS_SendACK(SiS_Pr, 0);
+-      }
+-      buffer[i] = (unsigned char)SiS_ReadDDC2Data(SiS_Pr, 0);
+-      SiS_SendACK(SiS_Pr, 1);
+-   } else flag = 0xFFFF;
+-   
+-   SiS_SetStop(SiS_Pr);
+-   return(0);
+-}
+-
+-/* TW: Our private DDC function
++/* Our private DDC functions
+ 
+    It complies somewhat with the corresponding VESA function
+    in arguments and return values.
+@@ -10036,7 +10219,7 @@ SiS_ReadLCDDDC(SiS_Private *SiS_Pr, USHO
+ 
+    Arguments:
+        adaptnum: 0=CRT1, 1=LCD, 2=VGA2
+-                 CRT2 DDC is only supported on SiS301, 301B (non-DH version), 302B.
++                 CRT2 DDC is only supported on SiS301, 301B, 302B.
+        DDCdatatype: 0=Probe, 1=EDID, 2=EDID+VDIF, 3=EDID V2 (P&D), 4=EDID V2 (FPDI-2)
+        buffer: ptr to 256 data bytes which will be filled with read data.
+ 
+@@ -10046,43 +10229,48 @@ SiS_ReadLCDDDC(SiS_Private *SiS_Pr, USHO
+ 
+  */
+ USHORT
+-SiS_HandleDDC(SiS_Private *SiS_Pr, SISPtr pSiS, USHORT adaptnum,
+-              USHORT DDCdatatype, unsigned char *buffer)
++SiS_HandleDDC(SiS_Private *SiS_Pr, unsigned long VBFlags, int VGAEngine,
++              USHORT adaptnum, USHORT DDCdatatype, unsigned char *buffer)
+ {
+    if(adaptnum > 2) return 0xFFFF;
+    if(DDCdatatype > 4) return 0xFFFF;
+-   if((!(pSiS->VBFlags & VB_VIDEOBRIDGE)) && (adaptnum > 0)) return 0xFFFF;
+-   if(SiS_InitDDCRegs(SiS_Pr, pSiS, adaptnum, DDCdatatype, TRUE) == 0xFFFF) return 0xFFFF;
++   if((!(VBFlags & VB_VIDEOBRIDGE)) && (adaptnum > 0)) return 0xFFFF;
++   if(SiS_InitDDCRegs(SiS_Pr, VBFlags, VGAEngine, adaptnum, DDCdatatype, TRUE) == 0xFFFF) return 0xFFFF;
+    if(DDCdatatype == 0) {
+        return(SiS_ProbeDDC(SiS_Pr));
+    } else {
+-       return(SiS_ReadDDC(SiS_Pr, pSiS, DDCdatatype, buffer));
++       return(SiS_ReadDDC(SiS_Pr, DDCdatatype, buffer));
+    }
+ }
+ 
++#ifdef LINUX_XF86
+ /* Sense the LCD parameters (CR36, CR37) via DDC */
+ /* SiS30x(B) only */
+ USHORT
+ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
+ {
+-   USHORT DDCdatatype, paneltype, flag, xres, yres;
++   USHORT DDCdatatype, paneltype, flag, xres=0, yres=0;
+    USHORT index, myindex, lumsize, numcodes;
+    unsigned char cr37=0, seekcode;
+    BOOLEAN checkexpand = FALSE;
+    int retry, i;
+    unsigned char buffer[256];
+-   
++
++   for(i=0; i<7; i++) SiS_Pr->CP_DataValid[i] = FALSE;
++   SiS_Pr->CP_HaveCustomData = FALSE;
++   SiS_Pr->CP_MaxX = SiS_Pr->CP_MaxY = SiS_Pr->CP_MaxClock = 0;
++
+    if(!(pSiS->VBFlags & (VB_301|VB_301B|VB_302B))) return 0;
+    if(pSiS->VBFlags & VB_30xBDH) return 0;
+   
+-   if(SiS_InitDDCRegs(SiS_Pr, pSiS, 1, 0, FALSE) == 0xFFFF) return 0;
++   if(SiS_InitDDCRegs(SiS_Pr, pSiS->VBFlags, pSiS->VGAEngine, 1, 0, FALSE) == 0xFFFF) return 0;
+    
+    SiS_Pr->SiS_DDC_SecAddr = 0x00;
+    
+    /* Probe supported DA's */
+    flag = SiS_ProbeDDC(SiS_Pr);
+ #ifdef TWDEBUG   
+-   xf86DrvMsg(pSiS->pScrn->scrnIndex, X_INFO, 
++   xf86DrvMsg(pSiS->pScrn->scrnIndex, X_INFO,
+    	"CRT2 DDC capabilities 0x%x\n", flag);
+ #endif	
+    if(flag & 0x10) {
+@@ -10099,7 +10287,7 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SIS
+    /* Read the entire EDID */
+    retry = 2;
+    do {
+-      if(SiS_ReadDDC(SiS_Pr, pSiS, DDCdatatype, buffer)) {
++      if(SiS_ReadDDC(SiS_Pr, DDCdatatype, buffer)) {
+          xf86DrvMsg(pSiS->pScrn->scrnIndex, X_INFO, 
+ 	 	"CRT2: DDC read failed (attempt %d), %s\n", 
+ 		(3-retry), (retry == 1) ? "giving up" : "retrying");
+@@ -10132,7 +10320,7 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SIS
+       }
+       
+       if((buffer[0x18] & 0x18) != 0x08) {
+-         xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED, 
++         xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
+ 	 	"CRT2: Attached display is not of RGB but of %s type (0x%02x)\n", 
+ 		((buffer[0x18] & 0x18) == 0x00) ? "monochrome/greyscale" :
+ 		  ( ((buffer[0x18] & 0x18) == 0x10) ? "non-RGB multicolor" : 
+@@ -10140,103 +10328,226 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SIS
+ 		buffer[0x18]);
+ 	 return 0;
+       }
+-      
+-      /* Now analyze the first Detailed Timing Block and hope
+-       * that the preferred timing mode is stored there.
+-       */	
+-      xres = buffer[0x38] | ((buffer[0x3a] & 0xf0) << 4);
+-      yres = buffer[0x3b] | ((buffer[0x3d] & 0xf0) << 4);
++
++      /* Now analyze the first Detailed Timing Block and see
++       * if the preferred timing mode is stored there. If so,
++       * check if this is a standard panel for which we already
++       * know the timing.
++       */
++
++      paneltype = Panel_Custom;
+       checkexpand = FALSE;
+-      switch(xres) {
+-         case 800:
+-	     if(yres == 600) {
+-	     	paneltype = Panel310_800x600;
+-	     	checkexpand = TRUE;
+-	     }
+-	     break;
+-         case 1024:
+-	     if(yres == 768) {
+-	     	paneltype = Panel310_1024x768;
+-	     	checkexpand = FALSE;    /* expand causes error at 640x480, should otherwise be TRUE; */
+-	     }
+-	     break;
+-	 case 1280:
+-	     if(yres == 960) {
+-	        if(pSiS->VGAEngine == SIS_300_VGA) {
+-		   paneltype = Panel300_1280x960;
+-		} else {
+-		   paneltype = Panel310_1280x960; 
+-		}
+-	     } else if(yres == 1024) {
+-	     	paneltype = Panel310_1280x1024;  
+-		checkexpand = TRUE;
+-	     } else if(pSiS->VGAEngine == SIS_315_VGA) {
++
++      if(buffer[0x18] & 0x02) {
++
++         xres = buffer[0x38] | ((buffer[0x3a] & 0xf0) << 4);
++         yres = buffer[0x3b] | ((buffer[0x3d] & 0xf0) << 4);
++
++	 SiS_Pr->CP_PreferredX = xres;
++	 SiS_Pr->CP_PreferredY = yres;
++
++         switch(xres) {
++            case 800:
++	        if(yres == 600) {
++	     	   paneltype = Panel_800x600;
++	     	   checkexpand = TRUE;
++	        }
++	        break;
++            case 1024:
+ 	        if(yres == 768) {
+-	       	   paneltype = Panel310_1280x768; 	/* Panel size 1280x768 not supported yet */
+-		   checkexpand = TRUE;	
+-	        }	
+-	     }
+-	     break;
+-	 case 1400:
+-	     if(pSiS->VGAEngine == SIS_315_VGA) {
+-	        if(yres == 1050) {
+-	           paneltype = Panel310_1400x1050;
+-		   checkexpand = TRUE; 
+-	        } 
+-	     }
+-      	     break;
+-	 case 1600:
+-	     if(pSiS->VGAEngine == SIS_315_VGA) {
+-	        if(yres == 1200) {
+-	           paneltype = Panel310_1600x1200;
++	     	   paneltype = Panel_1024x768;
++	     	   checkexpand = TRUE;
++	        }
++	        break;
++	    case 1280:
++	        if(yres == 1024) {
++	     	   paneltype = Panel_1280x1024;
+ 		   checkexpand = TRUE;
+-	        } 
+-	     }
+-      	     break;
++	        } else if(yres == 960) {
++	           if(pSiS->VGAEngine == SIS_300_VGA) {
++		      paneltype = Panel300_1280x960;
++		   } else {
++		      paneltype = Panel310_1280x960;
++		   }
++	        } else if(yres == 768) {
++	       	   paneltype = Panel_1280x768;
++		   checkexpand = FALSE;
++		   cr37 |= 0x10;
++	        }
++	        break;
++	    case 1400:
++	        if(pSiS->VGAEngine == SIS_315_VGA) {
++	           if(yres == 1050) {
++	              paneltype = Panel310_1400x1050;
++		      checkexpand = TRUE;
++	           }
++	        }
++      	        break;
++#if 0	    /* Treat this as custom, as we have no valid timing data yet */
++	    case 1600:
++	        if(pSiS->VGAEngine == SIS_315_VGA) {
++	           if(yres == 1200) {
++	              paneltype = Panel310_1600x1200;
++		      checkexpand = TRUE;
++	           }
++	        }
++      	        break;
++#endif
++         }
++
++	 if(paneltype != Panel_Custom) {
++	    if((buffer[0x47] & 0x18) == 0x18) {
++	       cr37 |= ((((buffer[0x47] & 0x06) ^ 0x06) << 5) | 0x20);
++	    } else {
++	       /* What now? There is no digital separate output timing... */
++	       xf86DrvMsg(pSiS->pScrn->scrnIndex, X_WARNING,
++	       	   "CRT2: Unable to retrieve Sync polarity information\n");
++	    }
++	 }
++
+       }
+ 
+-      if(buffer[0x18] & 0x02) {
+-         /* If the preferred timing mode is stored in the first
+-	  * detailed timing block, we now can extract the sync
+-	  * polarisation information as well. This only works
+-	  * if the Flags indicate a digital separate output.
+-	  */
+-	  if((buffer[0x47] & 0x18) == 0x18) {
+-	     cr37 |= ((((buffer[0x47] & 0x06) ^ 0x06) << 5) | 0x20);
+-	  } else {
+-	     /* What now? There is no digital separate output timing... */
+-	     xf86DrvMsg(pSiS->pScrn->scrnIndex, X_WARNING, 
+-	     	"CRT2: Unable to retrieve Sync polarity information\n");
+-	  }
+-	  
+-      } else {
+-         /* If the preferred timing mode is *not* stored in the first
+-	  * detailed timing block, we need to guess the resolution
+-	  * from the supported Established Timings and assume the
+-	  * default sync polarity
+-	  */
++      /* If we still don't know what panel this is, we take it
++       * as a custom panel and derive the timing data from the
++       * detailed timing blocks
++       */
++      if(paneltype == Panel_Custom) {
++
++         BOOLEAN havesync = FALSE;
++	 int i, temp, base = 0x36;
++	 unsigned long estpack;
++	 unsigned short estx[] = {
++	 	720, 720, 640, 640, 640, 640, 800, 800,
++		800, 800, 832,1024,1024,1024,1024,1280,
++		1152
++	 };
++	 unsigned short esty[] = {
++	 	400, 400, 480, 480, 480, 480, 600, 600,
++		600, 600, 624, 768, 768, 768, 768,1024,
++		870
++	 };
++
+ 	 paneltype = 0;
+-	 if(buffer[0x24] & 0x01) { 	
+-	 	paneltype = Panel310_1280x1024;
+-		checkexpand = TRUE;
+-		cr37 |= 0x20;
+-	 } else if(buffer[0x24] & 0x0e) {
+-	 	paneltype = Panel310_1024x768;
+-		cr37 |= 0xe0;
+-		checkexpand = FALSE;		/* Bug at 640x480 */
+-	 } else if(buffer[0x23] & 0x01) {
+-	 	paneltype = Panel310_800x600;
+-		cr37 |= 0xe0;
+-		checkexpand = TRUE;
+-         }
++
++	 /* Find the maximum resolution */
++
++	 /* 1. From Established timings */
++	 estpack = (buffer[0x23] << 9) | (buffer[0x24] << 1) | ((buffer[0x25] >> 7) & 0x01);
++	 for(i=16; i>=0; i--) {
++	     if(estpack & (1 << i)) {
++	        if(estx[16 - i] > SiS_Pr->CP_MaxX) SiS_Pr->CP_MaxX = estx[16 - i];
++		if(esty[16 - i] > SiS_Pr->CP_MaxY) SiS_Pr->CP_MaxY = esty[16 - i];
++	     }
++	 }
++
++	 /* 2. From Standard Timings */
++	 for(i=0x26; i < 0x36; i+=2) {
++	    if((buffer[i] != 0x01) && (buffer[i+1] != 0x01)) {
++	       temp = (buffer[i] + 31) * 8;
++	       if(temp > SiS_Pr->CP_MaxX) SiS_Pr->CP_MaxX = temp;
++	       switch((buffer[i+1] & 0xc0) >> 6) {
++	       case 0x03: temp = temp * 9 / 16; break;
++	       case 0x02: temp = temp * 4 / 5;  break;
++	       case 0x01: temp = temp * 3 / 4;  break;
++	       }
++	       if(temp > SiS_Pr->CP_MaxY) SiS_Pr->CP_MaxY = temp;
++	    }
++	 }
++
++	 /* Now extract the Detailed Timings and convert them into modes */
++
++         for(i = 0; i < 4; i++, base += 18) {
++
++	    /* Is this a detailed timing block or a monitor descriptor? */
++	    if(buffer[base] || buffer[base+1] || buffer[base+2]) {
++
++      	       xres = buffer[base+2] | ((buffer[base+4] & 0xf0) << 4);
++               yres = buffer[base+5] | ((buffer[base+7] & 0xf0) << 4);
++
++	       SiS_Pr->CP_HDisplay[i] = xres;
++	       SiS_Pr->CP_HSyncStart[i] = xres + (buffer[base+8] | ((buffer[base+11] & 0xc0) << 2));
++               SiS_Pr->CP_HSyncEnd[i]   = SiS_Pr->CP_HSyncStart[i] + (buffer[base+9] | ((buffer[base+11] & 0x30) << 4));
++	       SiS_Pr->CP_HTotal[i] = xres + (buffer[base+3] | ((buffer[base+4] & 0x0f) << 8));
++	       SiS_Pr->CP_HBlankStart[i] = xres + 1;
++	       SiS_Pr->CP_HBlankEnd[i] = SiS_Pr->CP_HTotal[i];
++
++	       SiS_Pr->CP_VDisplay[i] = yres;
++               SiS_Pr->CP_VSyncStart[i] = yres + (((buffer[base+10] & 0xf0) >> 4) | ((buffer[base+11] & 0x0c) << 2));
++               SiS_Pr->CP_VSyncEnd[i] = SiS_Pr->CP_VSyncStart[i] + ((buffer[base+10] & 0x0f) | ((buffer[base+11] & 0x03) << 4));
++	       SiS_Pr->CP_VTotal[i] = yres + (buffer[base+6] | ((buffer[base+7] & 0x0f) << 8));
++	       SiS_Pr->CP_VBlankStart[i] = yres + 1;
++	       SiS_Pr->CP_VBlankEnd[i] = SiS_Pr->CP_VTotal[i];
++
++	       SiS_Pr->CP_Clock[i] = (buffer[base] | (buffer[base+1] << 8)) * 10;
++
++	       SiS_Pr->CP_DataValid[i] = TRUE;
++
++	       /* Sort out invalid timings, interlace and too high clocks */
++	       if((SiS_Pr->CP_HDisplay[i] > SiS_Pr->CP_HSyncStart[i])  ||
++	          (SiS_Pr->CP_HDisplay[i] >= SiS_Pr->CP_HSyncEnd[i])   ||
++	          (SiS_Pr->CP_HDisplay[i] >= SiS_Pr->CP_HTotal[i])     ||
++	          (SiS_Pr->CP_HSyncStart[i] >= SiS_Pr->CP_HSyncEnd[i]) ||
++	          (SiS_Pr->CP_HSyncStart[i] > SiS_Pr->CP_HTotal[i])    ||
++	          (SiS_Pr->CP_HSyncEnd[i] > SiS_Pr->CP_HTotal[i])      ||
++	          (SiS_Pr->CP_VDisplay[i] > SiS_Pr->CP_VSyncStart[i])  ||
++	          (SiS_Pr->CP_VDisplay[i] >= SiS_Pr->CP_VSyncEnd[i])   ||
++	          (SiS_Pr->CP_VDisplay[i] >= SiS_Pr->CP_VTotal[i])     ||
++	          (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VSyncEnd[i])  ||
++	          (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VTotal[i])    ||
++	          (SiS_Pr->CP_VSyncEnd[i] > SiS_Pr->CP_VTotal[i])      ||
++	          (SiS_Pr->CP_Clock[i] > 108000)                       ||
++		  (buffer[base+17] & 0x80)) {
++
++	          SiS_Pr->CP_DataValid[i] = FALSE;
++
++	       } else {
++
++	          paneltype = Panel_Custom;
++
++		  SiS_Pr->CP_HaveCustomData = TRUE;
++
++		  if(xres > SiS_Pr->CP_MaxX) SiS_Pr->CP_MaxX = xres;
++	          if(yres > SiS_Pr->CP_MaxY) SiS_Pr->CP_MaxY = yres;
++		  if(SiS_Pr->CP_Clock[i] > SiS_Pr->CP_MaxClock) SiS_Pr->CP_MaxClock = SiS_Pr->CP_Clock[i];
++
++		  SiS_Pr->CP_Vendor = buffer[9] | (buffer[8] << 8);
++		  SiS_Pr->CP_Product = buffer[10] | (buffer[11] << 8);
++
++	          /* We must assume the panel can scale, since we have
++	           * no scaling data
++		   */
++	          checkexpand = FALSE;
++	          cr37 |= 0x10;
++
++	          /* Extract the sync polarisation information. This only works
++	           * if the Flags indicate a digital separate output.
++	           */
++	          if((buffer[base+17] & 0x18) == 0x18) {
++		     SiS_Pr->CP_HSync_P[i] = (buffer[base+17] & 0x02) ? TRUE : FALSE;
++		     SiS_Pr->CP_VSync_P[i] = (buffer[base+17] & 0x04) ? TRUE : FALSE;
++		     SiS_Pr->CP_SyncValid[i] = TRUE;
++		     if(!havesync) {
++	                cr37 |= ((((buffer[base+17] & 0x06) ^ 0x06) << 5) | 0x20);
++			havesync = TRUE;
++	   	     }
++	          } else {
++		     SiS_Pr->CP_SyncValid[i] = FALSE;
++		  }
++	       }
++            }
++	 }
++	 if(!havesync) {
++	    xf86DrvMsg(pSiS->pScrn->scrnIndex, X_WARNING,
++	       	   "CRT2: Unable to retrieve Sync polarity information\n");
++   	 }
+       }
+-      
+-      if(checkexpand) {
+-         /* If any of the Established low-res modes is supported, the 
++
++      if(paneltype && checkexpand) {
++         /* If any of the Established low-res modes is supported, the
+ 	  * panel can scale automatically. For 800x600 panels, we only 
+ 	  * check the even lower ones.
+ 	  */
+-	 if(paneltype == Panel310_800x600) {
++	 if(paneltype == Panel_800x600) {
+ 	    if(buffer[0x23] & 0xfc) cr37 |= 0x10;
+ 	 } else {
+             if(buffer[0x23])	    cr37 |= 0x10;
+@@ -10262,20 +10573,31 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SIS
+ 		buffer[0x41]);
+ 	 return 0;
+       }
+-   
+-      xres = buffer[0x76] | (buffer[0x77] << 8);
+-      yres = buffer[0x78] | (buffer[0x79] << 8);
++
++      paneltype = Panel_Custom;
++      SiS_Pr->CP_MaxX = xres = buffer[0x76] | (buffer[0x77] << 8);
++      SiS_Pr->CP_MaxY = yres = buffer[0x78] | (buffer[0x79] << 8);
+       switch(xres) {
+          case 800:
+ 	     if(yres == 600) {
+-	     	paneltype = Panel310_800x600;
++	     	paneltype = Panel_800x600;
+ 	     	checkexpand = TRUE;
+ 	     }
+ 	     break;
+          case 1024:
+ 	     if(yres == 768) {
+-	     	paneltype = Panel310_1024x768;
+-	     	checkexpand = FALSE;			/* Bug at 640x480; we do the scaling ourselves */
++	     	paneltype = Panel_1024x768;
++	     	checkexpand = TRUE;
++	     }
++	     break;
++	 case 1152:
++	     if(yres == 768) {
++	        if(pSiS->VGAEngine == SIS_300_VGA) {
++		   paneltype = Panel300_1152x768;
++		} else {
++		   paneltype = Panel310_1152x768;
++		}
++	     	checkexpand = TRUE;
+ 	     }
+ 	     break;
+ 	 case 1280:
+@@ -10286,45 +10608,46 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SIS
+ 		   paneltype = Panel300_1280x960;
+ 		}
+ 	     } else if(yres == 1024) {
+-	     	paneltype = Panel310_1280x1024;  
++	     	paneltype = Panel_1280x1024;
+ 		checkexpand = TRUE;
+-	     } else if(pSiS->VGAEngine == SIS_315_VGA) {
+-	        if(yres == 768) {
+-	       	   paneltype = Panel310_1280x768; 	/* Panel size 1280x768 not supported yet */
+-		   checkexpand = TRUE;
+-	        }
+-	     } 
++	     } else if(yres == 768) {
++	        paneltype = Panel_1280x768;
++		checkexpand = FALSE;
++		cr37 |= 0x10;
++	     }
+ 	     break;
+ 	 case 1400:
+ 	     if(pSiS->VGAEngine == SIS_315_VGA) {
+ 	        if(yres == 1050) {
+ 	           paneltype = Panel310_1400x1050;
+ 		   checkexpand = TRUE;
+-	        } 
++	        }
+ 	     }
+       	     break;
++#if 0    /* Treat this one as custom since we have no timing data yet */
+ 	 case 1600:
+ 	     if(pSiS->VGAEngine == SIS_315_VGA) {
+ 	        if(yres == 1200) {
+ 	           paneltype = Panel310_1600x1200;
+ 		   checkexpand = TRUE;
+-	        } 
++	        }
+ 	     }
+       	     break;
++#endif
+       }
+-                 
++
+       /* Determine if RGB18 or RGB24 */
+       if(index) {
+          if((buffer[index] == 0x20) || (buffer[index] == 0x34)) {
+ 	    cr37 |= 0x01;
+ 	 }
+       }
+-      
++
+       if(checkexpand) {
+          /* TODO - for now, we let the panel scale */
+ 	 cr37 |= 0x10;
+       }
+-     
++
+       /* Now seek 4-Byte Timing codes and extract sync pol info */
+       index = 0x80;
+       if(buffer[0x7e] & 0x20) {			    /* skip Luminance Table (if provided) */
+@@ -10346,28 +10669,117 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SIS
+ 	 if(buffer[myindex] == seekcode) {
+ 	    cr37 |= ((((buffer[myindex + 1] & 0x0c) ^ 0x0c) << 4) | 0x20);
+ 	 } else {
+-	    xf86DrvMsg(pSiS->pScrn->scrnIndex, X_WARNING, 
+-	    	"CRT2: Unable to retrieve Sync polarity information\n");    
++	    xf86DrvMsg(pSiS->pScrn->scrnIndex, X_WARNING,
++	        "CRT2: Unable to retrieve Sync polarity information\n");
+ 	 }
+       } else {
+-         xf86DrvMsg(pSiS->pScrn->scrnIndex, X_WARNING, 
+-	    	"CRT2: Unable to retrieve Sync polarity information\n");
++         xf86DrvMsg(pSiS->pScrn->scrnIndex, X_WARNING,
++	     "CRT2: Unable to retrieve Sync polarity information\n");
++      }
++
++      /* Now seek the detailed timing descriptions for custom panels */
++      if(paneltype == Panel_Custom) {
++         index += (numcodes * 4);
++	 numcodes = buffer[0x7f] & 0x07;
++	 for(i=0; i<numcodes; i++) {
++	    xres = buffer[index+2] | ((buffer[index+4] & 0xf0) << 4);
++            yres = buffer[index+5] | ((buffer[index+7] & 0xf0) << 4);
++
++	    SiS_Pr->CP_HDisplay[i] = xres;
++	    SiS_Pr->CP_HSyncStart[i] = xres + (buffer[index+8] | ((buffer[index+11] & 0xc0) << 2));
++            SiS_Pr->CP_HSyncEnd[i] = SiS_Pr->CP_HSyncStart[i] + (buffer[index+9] | ((buffer[index+11] & 0x30) << 4));
++	    SiS_Pr->CP_HTotal[i] = xres + (buffer[index+3] | ((buffer[index+4] & 0x0f) << 8));
++	    SiS_Pr->CP_HBlankStart[i] = xres + 1;
++	    SiS_Pr->CP_HBlankEnd[i] = SiS_Pr->CP_HTotal[i];
++
++	    SiS_Pr->CP_VDisplay[i] = yres;
++            SiS_Pr->CP_VSyncStart[i] = yres + (((buffer[index+10] & 0xf0) >> 4) | ((buffer[index+11] & 0x0c) << 2));
++            SiS_Pr->CP_VSyncEnd[i] = SiS_Pr->CP_VSyncStart[i] + ((buffer[index+10] & 0x0f) | ((buffer[index+11] & 0x03) << 4));
++	    SiS_Pr->CP_VTotal[i] = yres + (buffer[index+6] | ((buffer[index+7] & 0x0f) << 8));
++	    SiS_Pr->CP_VBlankStart[i] = yres + 1;
++	    SiS_Pr->CP_VBlankEnd[i] = SiS_Pr->CP_VTotal[i];
++
++	    SiS_Pr->CP_Clock[i] = (buffer[index] | (buffer[index+1] << 8)) * 10;
++
++	    SiS_Pr->CP_DataValid[i] = TRUE;
++
++	    if((SiS_Pr->CP_HDisplay[i] > SiS_Pr->CP_HSyncStart[i])  ||
++	       (SiS_Pr->CP_HDisplay[i] >= SiS_Pr->CP_HSyncEnd[i])   ||
++	       (SiS_Pr->CP_HDisplay[i] >= SiS_Pr->CP_HTotal[i])     ||
++	       (SiS_Pr->CP_HSyncStart[i] >= SiS_Pr->CP_HSyncEnd[i]) ||
++	       (SiS_Pr->CP_HSyncStart[i] > SiS_Pr->CP_HTotal[i])    ||
++	       (SiS_Pr->CP_HSyncEnd[i] > SiS_Pr->CP_HTotal[i])      ||
++	       (SiS_Pr->CP_VDisplay[i] > SiS_Pr->CP_VSyncStart[i])  ||
++	       (SiS_Pr->CP_VDisplay[i] >= SiS_Pr->CP_VSyncEnd[i])   ||
++	       (SiS_Pr->CP_VDisplay[i] >= SiS_Pr->CP_VTotal[i])     ||
++	       (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VSyncEnd[i])  ||
++	       (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VTotal[i])    ||
++	       (SiS_Pr->CP_VSyncEnd[i] > SiS_Pr->CP_VTotal[i])      ||
++	       (SiS_Pr->CP_Clock[i] > 108000)                       ||
++	       (buffer[index + 17] & 0x80)) {
++
++	       SiS_Pr->CP_DataValid[i] = FALSE;
++
++	    } else {
++
++	       SiS_Pr->CP_HaveCustomData = TRUE;
++
++	       if(SiS_Pr->CP_Clock[i] > SiS_Pr->CP_MaxClock) SiS_Pr->CP_MaxClock = SiS_Pr->CP_Clock[i];
++
++	       SiS_Pr->CP_HSync_P[i] = (buffer[index + 17] & 0x02) ? TRUE : FALSE;
++	       SiS_Pr->CP_VSync_P[i] = (buffer[index + 17] & 0x04) ? TRUE : FALSE;
++	       SiS_Pr->CP_SyncValid[i] = TRUE;
++
++	       SiS_Pr->CP_Vendor = buffer[2] | (buffer[1] << 8);
++	       SiS_Pr->CP_Product = buffer[3] | (buffer[4] << 8);
++
++	       /* We must assume the panel can scale, since we have
++	        * no scaling data
++    	        */
++	       cr37 |= 0x10;
++
++	    }
++	 }
++
+       }
+ 
+       break;
+-     
++
+    }
+-   
++
+    /* 1280x960 panels are always RGB24, unable to scale and use
+     * high active sync polarity
+     */
+    if(pSiS->VGAEngine == SIS_315_VGA) {
+-      if(paneltype == Panel310_1280x960) cr37 &= 0x0e; 
++      if(paneltype == Panel310_1280x960) cr37 &= 0x0e;
+    } else {
+-      if(paneltype == Panel300_1280x960) cr37 &= 0x0e; 
++      if(paneltype == Panel300_1280x960) cr37 &= 0x0e;
+    }
+-   
++
++   for(i = 0; i < 7; i++) {
++      if(SiS_Pr->CP_DataValid[i]) {
++         xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
++            "Non-standard LCD timing data no. %d:\n", i);
++         xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
++	    "   HDisplay %d HSync %d HSyncEnd %d HTotal %d\n",
++	    SiS_Pr->CP_HDisplay[i], SiS_Pr->CP_HSyncStart[i],
++	    SiS_Pr->CP_HSyncEnd[i], SiS_Pr->CP_HTotal[i]);
++         xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
++            "   VDisplay %d VSync %d VSyncEnd %d VTotal %d\n",
++            SiS_Pr->CP_VDisplay[i], SiS_Pr->CP_VSyncStart[i],
++   	    SiS_Pr->CP_VSyncEnd[i], SiS_Pr->CP_VTotal[i]);
++         xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
++	    "   Pixel clock: %3.3fMhz\n", (float)SiS_Pr->CP_Clock[i] / 1000);
++	 xf86DrvMsg(pSiS->pScrn->scrnIndex, X_INFO,
++	    "   To use this, add \"%dx%d\" to the list of Modes in the Display section\n",
++	    SiS_Pr->CP_HDisplay[i],
++	    SiS_Pr->CP_VDisplay[i]);
++      }
++   }
++
+    if(paneltype) {
++       if(!SiS_Pr->CP_PreferredX) SiS_Pr->CP_PreferredX = SiS_Pr->CP_MaxX;
++       if(!SiS_Pr->CP_PreferredY) SiS_Pr->CP_PreferredY = SiS_Pr->CP_MaxY;
+        cr37 &= 0xf1;
+        cr37 |= 0x02;    /* SiS301 */
+        SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x36,0xf0,paneltype);
+@@ -10392,7 +10804,7 @@ SiS_SenseVGA2DDC(SiS_Private *SiS_Pr, SI
+    if(!(pSiS->VBFlags & (VB_301|VB_301B|VB_302B))) return 0;
+ /* if(pSiS->VBFlags & VB_30xBDH) return 0;  */
+    
+-   if(SiS_InitDDCRegs(SiS_Pr, pSiS, 2, 0, FALSE) == 0xFFFF) return 0;
++   if(SiS_InitDDCRegs(SiS_Pr, pSiS->VBFlags, pSiS->VGAEngine, 2, 0, FALSE) == 0xFFFF) return 0;
+    
+    SiS_Pr->SiS_DDC_SecAddr = 0x00;
+    
+@@ -10416,7 +10828,7 @@ SiS_SenseVGA2DDC(SiS_Private *SiS_Pr, SI
+    /* Read the entire EDID */
+    retry = 2;
+    do {
+-      if(SiS_ReadDDC(SiS_Pr, pSiS, DDCdatatype, buffer)) {
++      if(SiS_ReadDDC(SiS_Pr, DDCdatatype, buffer)) {
+          xf86DrvMsg(pSiS->pScrn->scrnIndex, X_INFO, 
+ 	 	"CRT2: DDC read failed (attempt %d), %s\n", 
+ 		(3-retry), (retry == 1) ? "giving up" : "retrying");
+@@ -10435,6 +10847,8 @@ SiS_SenseVGA2DDC(SiS_Private *SiS_Pr, SI
+ 	  	"CRT2: Attached display expects digital input\n");
+       	  return 0;  	
+       }
++      SiS_Pr->CP_Vendor = buffer[9] | (buffer[8] << 8);
++      SiS_Pr->CP_Product = buffer[10] | (buffer[11] << 8);
+       foundcrt = TRUE;
+       break;
+    case 3:
+@@ -10448,198 +10862,19 @@ SiS_SenseVGA2DDC(SiS_Private *SiS_Pr, SI
+ 		buffer[0x41]);
+ 	  return 0;
+       }
++      SiS_Pr->CP_Vendor = buffer[2] | (buffer[1] << 8);
++      SiS_Pr->CP_Product = buffer[3] | (buffer[4] << 8);
+       foundcrt = TRUE;
+-      break;	  
++      break;
+    }
+-   
++
+    if(foundcrt) {
+        SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x32,0x10);
+    }
+    return(0);
+ }
+ 
+-#if 0
+-   /* ----- */
+-USHORT
+-SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
+-{
+-   USHORT DDCdatatype, paneltype, flag;
+-   unsigned char cr36=0, cr37=0;
+-   unsigned char tempal, tempah, tempbl, tempbh;
+-   USHORT tempax, tempbx, tempcx, push1, push2, push3;
+-   unsigned char addresstable[] = { 0x00, 0x22, 0x30, 0x40 };
+-   int i;
+-   unsigned char buffer[256];
+-   
+-   if(pSiS->VGAEngine != SIS_315_VGA) return 0xFFFF;
+-   if(!(pSiS->VBFlags & (VB_301B|VB_302B))) return 0xFFFF;
+-   
+-   if(SiS_InitDDCRegs(SiS_Pr, pSiS, 1, 0, FALSE) == 0xFFFF) return 0xFFFF;   
+-   
+-   flag = SiS_ProbeDDC(SiS_Pr);
+-   if(flag & 0x02) {
+-      SiS_Pr->SiS_DDC_DeviceAddr = 0xa0;	/* EDID V1 */
+-      DDCdatatype = 1;
+-      SiS_Pr->SiS_DDC_SecAddr = 0x3a;
+-   } else if(flag & 0x08) {
+-      SiS_Pr->SiS_DDC_DeviceAddr = 0xa2;	/* EDID V2 (P&D-D Monitor) */
+-      DDCdatatype = 3;
+-      SiS_Pr->SiS_DDC_SecAddr = 0x76;
+-   } else if(flag & 0x10) {
+-      SiS_Pr->SiS_DDC_DeviceAddr = 0xa6;	/* EDID V2 (FP) */
+-      DDCdatatype = 4;
+-      SiS_Pr->SiS_DDC_SecAddr = 0x76;
+-   } else return 0xFFFF;
+-   
+-   
+-   SiS_ReadLCDDDC(SiS_Pr, 4, buffer);
+-   tempbl = buffer[0];  /* 3a - 76 */
+-   tempbh = buffer[1];  /* 3b - 77 */
+-   
+-   if(SiS_Pr->SiS_DDC_DeviceAddr == 0xa0) {
+-   
+-      /* Read and analyze EDID V1 (res) */
+-   
+-      tempah = 0x02;				/* 1024x768 by default */
+-      tempbl &= 0xf0;
+-      if(tempbl != 0x40) {			
+-         tempah = 0x03;				/* 1280x1024 by default */
+-	 if(tempbl == 0x50) {
+-	    if(!tempbh) {
+-	       tempbh = buffer[3] & 0xf0;
+-	       if(tempbh == 0x30) {
+-	           SiS_Pr->SiS_DDC_DeviceAddr = 0xa0;
+-      		   SiS_Pr->SiS_DDC_SecAddr = 0x23;
+-		   SiS_ReadLCDDDC(SiS_Pr, 2, buffer);
+-		   tempbl = buffer[0];  /* 0x23 */
+-		   tempbh = buffer[1];  /* 0x24 */
+-		   if(tempbl) cr37 |= 0x10;
+-		   tempah = 0x0a;		/* 1280x768 */
+-	       }
+-	       if(tempbh == 0x40) {
+-	           SiS_Pr->SiS_DDC_DeviceAddr = 0xa0;
+-      		   SiS_Pr->SiS_DDC_SecAddr = 0x23;
+-		   SiS_ReadLCDDDC(SiS_Pr, 2, buffer);
+-		   tempbl = buffer[0];  /* 0x23 */
+-		   tempbh = buffer[1];  /* 0x24 */
+-		   if(tempbl) cr37 |= 0x10;
+-		   tempah = 0x03;		/* 1280x1024 */
+-	       }
+-	       tempbh = 0x00;
+-	    }
+-	 }
+-	 if(tempbh == 0x00) goto cr36ready;
+-	 tempah = 0x07;				/* 1280x960 */
+-	 if(tempbh == 0xc0) goto cr36ready;
+-      }
+-      SiS_Pr->SiS_DDC_DeviceAddr = 0xa0;
+-      SiS_Pr->SiS_DDC_SecAddr = 0x18;		/* feature support */
+-      SiS_ReadLCDDDC(SiS_Pr, 2, buffer);
+-      tempbl = buffer[0];
+-      tempbh = buffer[1];
+-      if(tempbl & 0x02) goto cr36ready;
+-      SiS_Pr->SiS_DDC_DeviceAddr = 0xa0;
+-      SiS_Pr->SiS_DDC_SecAddr = 0x23;		/* Established Timings */
+-      SiS_ReadLCDDDC(SiS_Pr, 2, buffer);
+-      tempbl = buffer[0];
+-      tempbh = buffer[1];
+-      tempah = 0x03;
+-      if(!(tempbh & 0x01)) tempah = 0x02;
+-      if(!tempbl) cr37 |= 0x10;
+-      
+-  } else {
+-  
+-      /* Read and analyze EDID V2 (res) */
+-      
+-      tempah = 0x02;
+-      tempbx = tempbl | (tempbh << 8);
+-      if(tempbx != 1024) tempah = 0x03;
+-      
+-  }     
+-
+-cr36ready:
+-  cr36 = tempah;      
+-  
+-  if(SiS_Pr->SiS_DDC_DeviceAddr == 0xa0) {
+-  
+-     /* Read and analyze EDID V1 (pol) */
+-  
+-     SiS_Pr->SiS_DDC_SecAddr = 0x47;
+-     SiS_ReadLCDDDC(SiS_Pr, 2, buffer);
+-     tempah = buffer[0];
+-     tempah &= 0x06;
+-     tempah ^= 0x06;
+-     tempah <<= 5;
+-     tempah |= 0x20;
+-     cr37 &= 0x1f;
+-     cr37 |= tempah;
+-     if((cr36 & 0x07) == 0x07) cr37 &= 0x0e;
+-     
+-  } else {
+-  
+-     /* Read and analyze EDID V2 (depth, pol) */
+-  
+-     push1 = tempah;
+-     SiS_Pr->SiS_DDC_SecAddr = 0x45;
+-     SiS_ReadLCDDDC(SiS_Pr, 2, buffer);
+-     tempah = 0x01;
+-     if((buffer[0] != 0x20) && (buffer[0] != 0x34)) {   /* RGB18 or 24? */
+-        tempah = 0x00;
+-     }
+-     cr37 &= 0xfe;
+-     cr37 |= tempah;
+-     
+-     SiS_Pr->SiS_DDC_SecAddr = 0x7e;
+-     SiS_ReadLCDDDC(SiS_Pr, 2, buffer);
+-     tempax = (USHORT)(buffer[0] | (buffer[1] << 8));
+-     push2 = tempax;
+-     tempax &= 0x0003;
+-     tempax *= 0x1b;
+-     push3 = tempax;
+-     tempax = (USHORT)buffer[0];
+-     tempax &= 0x001c;
+-     tempax >>= 2;
+-     tempax *= 8;
+-     tempbx = push3;
+-     tempbx += tempax;
+-     if(buffer[0] & 0x20) {		/* Luminance table provided? */
+-        SiS_Pr->SiS_DDC_SecAddr = 0x80;
+-	SiS_ReadLCDDDC(SiS_Pr, 2, buffer);
+-	tempax = buffer[0] | (buffer[1] << 8);
+-	tempax &= 0x1f;
+-	if(buffer[0] & 0x70) tempax <<= 1;
+-	tempax++;	
+-	tempbx += tempax;        	/* yes -> skip it */
+-     }
+-     tempcx = push2;
+-     tempax = push1 << 8;
+-     tempbx = (tempbx & 0xff00) | (((tempbx & 0x00ff) + 0x80) & 0x00ff);
+-     if(tempcx & 0xf800) {
+-        tempal = addresstable[((tempax & 0xff00) >> 8)];
+-	tempcx &= 0xf8ff;
+-	tempcx >>= 11;
+-	for(i=0; i<tempcx; i++) {
+-	   SiS_Pr->SiS_DDC_SecAddr = (tempbx & 0x00ff);
+-	   SiS_ReadLCDDDC(SiS_Pr, 2, buffer);
+-	   tempbx += 0x04;
+-	   if(buffer[0] == tempal) break;
+-	}
+-	tempah = buffer[1];
+-	tempah &= 0x0c;
+-	tempah ^= 0x0c;
+-	tempah <<= 4;
+-	tempah |= 0x20;
+-        cr37 &= 0x1f;
+-        cr37 |= tempah;
+-	if((cr36 & 0x07) == 0x07) cr37 &= 0x0e;
+-     }
+-  }
+-  xf86DrvMsg(0, X_INFO, "DDC: cr36 = 0x%02x, cr37 = 0x%02x\n", cr36, cr37);
+-  return 0;
+-}
+-#endif
+-
+-/* TW: Generic I2C functions (compliant to i2c library) */
++/* Generic I2C functions (compliant to i2c library) */
+ 
+ #if 0
+ USHORT
+@@ -10684,7 +10919,7 @@ SiS_SetCH70xxANDOR(SiS_Private *SiS_Pr, 
+   SiS_SetCH70xx(SiS_Pr,tempbl);
+ }
+ 
+-/* TW: Generic I2C functions for Chrontel --------- */
++/* Generic I2C functions for Chrontel --------- */
+ 
+ void
+ SiS_SetSwitchDDC2(SiS_Private *SiS_Pr)
+@@ -10698,37 +10933,37 @@ SiS_SetSwitchDDC2(SiS_Private *SiS_Pr)
+   SiS_WaitRetraceDDC(SiS_Pr);
+ }
+ 
+-/* TW: Set I2C start condition */
+-/* TW: This is done by a SD high-to-low transition while SC is high */
++/* Set I2C start condition */
++/* This is done by a SD high-to-low transition while SC is high */
+ USHORT
+ SiS_SetStart(SiS_Private *SiS_Pr)
+ {
+-  if(SiS_SetSCLKLow(SiS_Pr)) return 0xFFFF;			           /* TW: (SC->low)  */
++  if(SiS_SetSCLKLow(SiS_Pr)) return 0xFFFF;			           /* (SC->low)  */
+   SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+-                  ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data);             /* TW: SD->high */
+-  if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF;			           /* TW: SC->high */
++                  ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data);             /* SD->high */
++  if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF;			           /* SC->high */
+   SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+-                  ~SiS_Pr->SiS_DDC_Data,0x00);                             /* TW: SD->low = start condition */
+-  if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF;			           /* TW: (SC->low) */
++                  ~SiS_Pr->SiS_DDC_Data,0x00);                             /* SD->low = start condition */
++  if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF;			           /* (SC->low) */
+   return 0;
+ }
+ 
+-/* TW: Set I2C stop condition */
+-/* TW: This is done by a SD low-to-high transition while SC is high */
++/* Set I2C stop condition */
++/* This is done by a SD low-to-high transition while SC is high */
+ USHORT
+ SiS_SetStop(SiS_Private *SiS_Pr)
+ {
+-  if(SiS_SetSCLKLow(SiS_Pr)) return 0xFFFF;			           /* TW: (SC->low) */
++  if(SiS_SetSCLKLow(SiS_Pr)) return 0xFFFF;			           /* (SC->low) */
+   SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+-                  ~SiS_Pr->SiS_DDC_Data,0x00);          		   /* TW: SD->low   */
+-  if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF;			           /* TW: SC->high  */
++                  ~SiS_Pr->SiS_DDC_Data,0x00);          		   /* SD->low   */
++  if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF;			           /* SC->high  */
+   SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+-                  ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data);  	   /* TW: SD->high = stop condition */
+-  if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF;			           /* TW: (SC->high) */
++                  ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data);  	   /* SD->high = stop condition */
++  if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF;			           /* (SC->high) */
+   return 0;
+ }
+ 
+-/* TW: Write 8 bits of data */
++/* Write 8 bits of data */
+ USHORT
+ SiS_WriteDDC2Data(SiS_Private *SiS_Pr, USHORT tempax)
+ {
+@@ -10736,18 +10971,18 @@ SiS_WriteDDC2Data(SiS_Private *SiS_Pr, U
+ 
+   flag=0x80;
+   for(i=0;i<8;i++) {
+-    SiS_SetSCLKLow(SiS_Pr);				                      /* TW: SC->low */
++    SiS_SetSCLKLow(SiS_Pr);				                      /* SC->low */
+     if(tempax & flag) {
+       SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+-                      ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data);            /* TW: Write bit (1) to SD */
++                      ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data);            /* Write bit (1) to SD */
+     } else {
+       SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+-                      ~SiS_Pr->SiS_DDC_Data,0x00);                            /* TW: Write bit (0) to SD */
++                      ~SiS_Pr->SiS_DDC_Data,0x00);                            /* Write bit (0) to SD */
+     }
+-    SiS_SetSCLKHigh(SiS_Pr);				                      /* TW: SC->high */
++    SiS_SetSCLKHigh(SiS_Pr);				                      /* SC->high */
+     flag >>= 1;
+   }
+-  temp = SiS_CheckACK(SiS_Pr);				                      /* TW: Check acknowledge */
++  temp = SiS_CheckACK(SiS_Pr);				                      /* Check acknowledge */
+   return(temp);
+ }
+ 
+@@ -10808,27 +11043,27 @@ SiS_DDC2Delay(SiS_Private *SiS_Pr, USHOR
+   }
+ }
+ 
+-/* TW: Check I2C acknowledge */
++/* Check I2C acknowledge */
+ /* Returns 0 if ack ok, non-0 if ack not ok */
+ USHORT
+ SiS_CheckACK(SiS_Private *SiS_Pr)
+ {
+   USHORT tempah;
+ 
+-  SiS_SetSCLKLow(SiS_Pr);				           /* TW: (SC->low) */
++  SiS_SetSCLKLow(SiS_Pr);				           /* (SC->low) */
+   SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+-                  ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data);     /* TW: (SD->high) */
+-  SiS_SetSCLKHigh(SiS_Pr);				           /* TW: SC->high = clock impulse for ack */
+-  tempah = SiS_GetReg1(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index);/* TW: Read SD */
+-  SiS_SetSCLKLow(SiS_Pr);				           /* TW: SC->low = end of clock impulse */
+-  if(tempah & SiS_Pr->SiS_DDC_Data) return(1);			   /* TW: Ack OK if bit = 0 */
++                  ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data);     /* (SD->high) */
++  SiS_SetSCLKHigh(SiS_Pr);				           /* SC->high = clock impulse for ack */
++  tempah = SiS_GetReg1(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index);/* Read SD */
++  SiS_SetSCLKLow(SiS_Pr);				           /* SC->low = end of clock impulse */
++  if(tempah & SiS_Pr->SiS_DDC_Data) return(1);			   /* Ack OK if bit = 0 */
+   else return(0);
+ }
+ 
+-/* TW: End of I2C functions ----------------------- */
++/* End of I2C functions ----------------------- */
+ 
+ 
+-/* =============== SiS 310/325/330 O.E.M. ================= */
++/* =============== SiS 315/330 O.E.M. ================= */
+ 
+ #ifdef SIS315H
+ 
+@@ -10838,11 +11073,11 @@ GetRAMDACromptr(SiS_Private *SiS_Pr, PSI
+   USHORT romptr;
+ 
+   if(HwDeviceExtension->jChipType < SIS_330) {
+-     romptr = ROMAddr[0x128] | (ROMAddr[0x129] << 8);  
++     romptr = ROMAddr[0x128] | (ROMAddr[0x129] << 8);
+      if(SiS_Pr->SiS_VBType & VB_SIS301B302B)
+         romptr = ROMAddr[0x12a] | (ROMAddr[0x12b] << 8);
+   } else {
+-     romptr = ROMAddr[0x1a8] | (ROMAddr[0x1a9] << 8);  
++     romptr = ROMAddr[0x1a8] | (ROMAddr[0x1a9] << 8);
+      if(SiS_Pr->SiS_VBType & VB_SIS301B302B)
+         romptr = ROMAddr[0x1aa] | (ROMAddr[0x1ab] << 8);
+   }
+@@ -10855,11 +11090,11 @@ GetLCDromptr(SiS_Private *SiS_Pr, PSIS_H
+   USHORT romptr;
+ 
+   if(HwDeviceExtension->jChipType < SIS_330) {
+-     romptr = ROMAddr[0x120] | (ROMAddr[0x121] << 8);  
++     romptr = ROMAddr[0x120] | (ROMAddr[0x121] << 8);
+      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)
+         romptr = ROMAddr[0x122] | (ROMAddr[0x123] << 8);
+   } else {
+-     romptr = ROMAddr[0x1a0] | (ROMAddr[0x1a1] << 8);  
++     romptr = ROMAddr[0x1a0] | (ROMAddr[0x1a1] << 8);
+      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)
+         romptr = ROMAddr[0x1a2] | (ROMAddr[0x1a3] << 8);
+   }
+@@ -10884,10 +11119,22 @@ GetTVromptr(SiS_Private *SiS_Pr, PSIS_HW
+ }
+ 
+ static USHORT
+-GetLCDPtrIndexBIOS(SiS_Private *SiS_Pr)
++GetLCDPtrIndexBIOS(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+ {
+   USHORT index;
+-  
++
++  if((IS_SIS650) && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) {
++     if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++        if((index = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xf0)) {
++	   index >>= 4;
++	   index *= 3;
++	   if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) index += 2;
++           else if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) index++;
++           return index;
++	}
++     }
++  }
++
+   index = SiS_Pr->SiS_LCDResInfo & 0x0F;
+   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050)      index -= 5;
+   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) index -= 6;
+@@ -10895,7 +11142,6 @@ GetLCDPtrIndexBIOS(SiS_Private *SiS_Pr)
+   index *= 3;
+   if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) index += 2;
+   else if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) index++;
+-
+   return index;
+ }
+ 
+@@ -10946,7 +11192,7 @@ SetDelayComp(SiS_Private *SiS_Pr, PSIS_H
+              UCHAR *ROMAddr, USHORT ModeNo)
+ {
+   USHORT delay,index,myindex,temp,romptr=0;
+-  
++
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {			/* VGA */
+      
+      if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+@@ -10971,8 +11217,10 @@ SetDelayComp(SiS_Private *SiS_Pr, PSIS_H
+      }
+   
+   } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {		/* LCD */
++
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) return;
+   
+-     index = GetLCDPtrIndexBIOS(SiS_Pr);
++     index = GetLCDPtrIndexBIOS(SiS_Pr, HwDeviceExtension, BaseAddr);
+      myindex = GetLCDPtrIndex(SiS_Pr);
+      
+      if(IS_SIS650 && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) { 	/* 650+30xLV */
+@@ -10980,7 +11228,7 @@ SetDelayComp(SiS_Private *SiS_Pr, PSIS_H
+           if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+ #if 0	     /* Always use the second pointer on 650; some BIOSes */
+              /* still carry old 301 data at the first location    */  
+-	     romptr = ROMAddr[0x120] | (ROMAddr[0x121] << 8); 
++	     romptr = ROMAddr[0x120] | (ROMAddr[0x121] << 8);
+ 	     if(SiS_Pr->SiS_VBType & VB_SIS302LV) 
+ #endif		
+ 	        romptr = ROMAddr[0x122] | (ROMAddr[0x123] << 8);
+@@ -10994,13 +11242,13 @@ SetDelayComp(SiS_Private *SiS_Pr, PSIS_H
+ #endif		
+ 	  }
+        } else {
+-          delay = SiS310_LCDDelayCompensation_651301LV[myindex];     
++          delay = SiS310_LCDDelayCompensation_651301LV[myindex];
+ 	  if(SiS_Pr->SiS_VBType & VB_SIS302LV)
+-	     delay = SiS310_LCDDelayCompensation_651302LV[myindex];  
++	     delay = SiS310_LCDDelayCompensation_651302LV[myindex];
+        }
+      } else {
+         if((ROMAddr) && SiS_Pr->SiS_UseROM && 				/* 315, 330, 740, 650+301B */
+-	   (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024)) { 
++	   (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024)) {
+            romptr = GetLCDromptr(SiS_Pr, HwDeviceExtension, ROMAddr);
+ 	   if(!romptr) return;
+ 	   delay = ROMAddr[(romptr + index)];
+@@ -11008,7 +11256,7 @@ SetDelayComp(SiS_Private *SiS_Pr, PSIS_H
+            delay = SiS310_LCDDelayCompensation_301[myindex];
+            if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ #if 0 	      /* This data is (like the one in the BIOS) wrong. */	   
+-	      if(IS_SIS650740) {  /* V */
++	      if(IS_SIS550650740660) {
+ 	         delay = SiS310_LCDDelayCompensation_650301B[myindex];
+ 	      } else {
+ #endif	      
+@@ -11088,14 +11336,16 @@ SetDelayComp(SiS_Private *SiS_Pr, PSIS_H
+   } else {
+      if(IS_SIS650 && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) {
+         temp = (SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xf0) >> 4;
+-        if(temp == 8) {
++        if(temp == 8) {		/* 1400x1050 BIOS */
+ 	   delay &= 0x0f;
+ 	   delay |= 0xb0;
+         } else if(temp == 6) {
+            delay &= 0x0f;
+ 	   delay |= 0xc0;
++        } else if(temp > 7) {	/* 1280x1024 BIOS */
++	   delay = 0x35;
+         }
+-        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2D,delay);  /* index 2D D[3:0] */
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2D,delay);
+      } else {
+         SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,0xF0,delay);
+      }
+@@ -11118,7 +11368,7 @@ SetAntiFlicker(SiS_Private *SiS_Pr, PSIS
+ 
+   if(ROMAddr && SiS_Pr->SiS_UseROM) {
+      romptr = ROMAddr[0x112] | (ROMAddr[0x113] << 8);
+-     if(HwDeviceExtension->jChipType == SIS_330) {
++     if(HwDeviceExtension->jChipType >= SIS_330) {
+         romptr = ROMAddr[0x192] | (ROMAddr[0x193] << 8);
+      }
+   }
+@@ -11150,7 +11400,7 @@ SetEdgeEnhance(SiS_Private *SiS_Pr, PSIS
+ 
+   if(ROMAddr && SiS_Pr->SiS_UseROM) {
+      romptr = ROMAddr[0x124] | (ROMAddr[0x125] << 8);
+-     if(HwDeviceExtension->jChipType == SIS_330) {
++     if(HwDeviceExtension->jChipType >= SIS_330) {
+         romptr = ROMAddr[0x1a4] | (ROMAddr[0x1a5] << 8);
+      }
+   }
+@@ -11198,7 +11448,7 @@ SetYFilter(SiS_Private *SiS_Pr, PSIS_HW_
+ 
+   if(ROMAddr && SiS_Pr->SiS_UseROM) {
+   	OutputSelect = ROMAddr[0xf3];
+-	if(HwDeviceExtension->jChipType == SIS_330) {
++	if(HwDeviceExtension->jChipType >= SIS_330) {
+ 	    OutputSelect = ROMAddr[0x11b];
+ 	}
+   }
+@@ -11262,17 +11512,17 @@ SetPhaseIncr(SiS_Private *SiS_Pr, PSIS_H
+    */
+   if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+      romptr = ROMAddr[0x116] | (ROMAddr[0x117] << 8);
+-     if(HwDeviceExtension->jChipType == SIS_330) {
++     if(HwDeviceExtension->jChipType >= SIS_330) {
+         romptr = ROMAddr[0x196] | (ROMAddr[0x197] << 8);
+      }
+      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+         romptr = ROMAddr[0x11c] | (ROMAddr[0x11d] << 8);
+-	if(HwDeviceExtension->jChipType == SIS_330) {
++	if(HwDeviceExtension->jChipType >= SIS_330) {
+ 	   romptr = ROMAddr[0x19c] | (ROMAddr[0x19d] << 8);
+ 	}
+ 	if((SiS_Pr->SiS_VBInfo & SetInSlaveMode) && (!(SiS_Pr->SiS_SetFlag & TVSimuMode))) {
+ 	   romptr = ROMAddr[0x116] | (ROMAddr[0x117] << 8);
+-	   if(HwDeviceExtension->jChipType == SIS_330) {
++	   if(HwDeviceExtension->jChipType >= SIS_330) {
+               romptr = ROMAddr[0x196] | (ROMAddr[0x197] << 8);
+            }
+ 	}
+@@ -11296,19 +11546,19 @@ SetPhaseIncr(SiS_Private *SiS_Pr, PSIS_H
+      }
+   }
+ 
+-  if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {    /* TW: 650/301LV: (VB_SIS301LV | VB_SIS302LV)) */
++  if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {    /* 650/301LV: (VB_SIS301LV | VB_SIS302LV)) */
+      if((!(SiS_Pr->SiS_VBInfo & SetPALTV)) && (ModeNo > 0x13)) {
+-        if(resinfo == 6) {
++        if(resinfo == SIS_RI_640x480) {
+ 	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x31,0x21);
+ 	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x32,0xf0);
+ 	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x33,0xf5);
+ 	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x34,0x7f);
+-	} else if (resinfo == 7) {
++	} else if (resinfo == SIS_RI_800x600) {
+ 	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x31,0x21);
+ 	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x32,0xf0);
+ 	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x33,0xf5);
+ 	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x34,0x7f);
+-	} else if (resinfo == 8) {
++	} else if (resinfo == SIS_RI_1024x768) {
+ 	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x31,0x1e);
+ 	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x32,0x8b);
+ 	      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x33,0xfb);
+@@ -11323,7 +11573,9 @@ SiS_OEM310Setting(SiS_Private *SiS_Pr, P
+                   UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
+ {
+    SetDelayComp(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo);
+-   /* TW: The TV functions are not for LVDS */
++
++   if(SiS_Pr->UseCustomMode) return;
++
+    if( (SiS_Pr->SiS_IF_DEF_LVDS == 0) && (SiS_Pr->SiS_VBInfo & SetCRT2ToTV) ) {
+        SetAntiFlicker(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+        SetPhaseIncr(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+@@ -11335,7 +11587,7 @@ SiS_OEM310Setting(SiS_Private *SiS_Pr, P
+ }
+ 
+ /* FinalizeLCD
+- * This finalizes some Part1 registers for the very panel used.
++ * This finalizes some CRT2 registers for the very panel used.
+  * If we have a backup if these registers, we use it; otherwise
+  * we set the register according to most BIOSes. However, this
+  * function looks quite different in every BIOS, so you better
+@@ -11350,6 +11602,9 @@ SiS_FinalizeLCD(SiS_Private *SiS_Pr, USH
+ 
+   if(!(SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) return;
+ 
++  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) return;
++  if(SiS_Pr->UseCustomMode) return;
++
+   if(ModeNo <= 0x13) {
+ 	resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+ 	modeflag =  SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+@@ -11358,20 +11613,31 @@ SiS_FinalizeLCD(SiS_Private *SiS_Pr, USH
+ 	modeflag =  SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+   }
+ 
++  if((SiS_GetReg1(SiS_Pr->SiS_P3d4, 0x5f) & 0xf0)) {
++     SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1e,0x03);
++  }
++
+   if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
+      if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+         SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00);
+ 	SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
+ 	SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
++     } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {   /* For all panels? */
++        SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,0xfc,0x01);
+      }
+      tempch = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36);
+      tempch &= 0xf0;
+      tempch >>= 4;
+      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
++        if(tempch == 0x03) {
++	   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x02);
++	   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1b,0x25);
++	   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1c,0x00);
++	   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1d,0x1b);
++	}
+ 	if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+ 	   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1f,0x76);
+-	}
+-	if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {	
++	} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+ 	   if((SiS_Pr->Backup == TRUE) && (SiS_Pr->Backup_Mode == ModeNo)) {
+ 	      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x14,SiS_Pr->Backup_14);
+ 	      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x15,SiS_Pr->Backup_15);
+@@ -11387,14 +11653,14 @@ SiS_FinalizeLCD(SiS_Private *SiS_Pr, USH
+ 	       SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x14,0x90);
+ 	       if(ModeNo <= 0x13) {
+ 	          SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x11);
+-		  if((resinfo == 0) && (resinfo == 2)) return;
++		  if((resinfo == 0) || (resinfo == 2)) return;
+ 		  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x18);
+-		  if((resinfo == 1) && (resinfo == 3)) return;
++		  if((resinfo == 1) || (resinfo == 3)) return;
+ 	       }
+ 	       SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x02);
+-	       if((ModeNo > 0x13) && (resinfo == 8)) {
++	       if((ModeNo > 0x13) && (resinfo == SIS_RI_1024x768)) {
+ 	          SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x02);  /* 1.10.7u */
+-#if 0	       
++#if 0
+ 	          tempbx = 806;  /* 0x326 */			 /* other older BIOSes */
+ 		  tempbx--;
+ 		  temp = tempbx & 0xff;
+@@ -11449,7 +11715,7 @@ SiS_FinalizeLCD(SiS_Private *SiS_Pr, USH
+ 	tempbl = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x04);
+ 	tempbx = (tempbh << 8) | tempbl;
+ 	if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+-	   if((resinfo == 8) || (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD))) {
++	   if((resinfo == SIS_RI_1024x768) || (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD))) {
+ 	      if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
+ 	      	tempbx = 770;
+ 	      } else {
+@@ -11477,67 +11743,56 @@ SiS_FinalizeLCD(SiS_Private *SiS_Pr, USH
+   }
+ }
+ 
+-#if 0
+-/* TW: New and checked from 650/301LV BIOS */
+-/* This might clash with newer "FinalizeLCD()" function */
++#endif
++
++
++/*  =================  SiS 300 O.E.M. ================== */
++
++#ifdef SIS300
++
+ void
+-SiS_OEMLCD(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+-                  UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
++SetOEMLCDData2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
++              UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, USHORT RefTabIndex)
+ {
+-   USHORT tempbx,tempah,tempbl,tempbh,tempcl;
+-
+-   if(!(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) return;
++  USHORT crt2crtc=0, modeflag, myindex=0;
++  UCHAR  temp;
++  int i;
+ 
+-   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+-      SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension,BaseAddr);
+-      tempbh = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x1a);
+-      tempbh &= 0x38;
+-      tempbh >>= 3;
+-      tempbl = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x18);
+-      tempbx = (tempbh << 8) | tempbl;
+-      if(SiS_Pr->SiS_LCDTypeInfo == 1)  tempbx -= 0x12;
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,tempbx & 0x00ff);
+-      tempah = (tempbx & 0xff00) >> 8;
+-      tempah &= 0x07;
+-      tempah <<= 3;
+-      SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x1a,0xc7,tempah);
+-      tempah = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x19);
+-      tempah &= 0x0f;
+-      if(SiS_Pr->SiS_LCDTypeInfo == 1)  tempah -= 2;
+-      tempah &= 0x0f;
+-      SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0xF0,tempah);
+-      tempah = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x14);
+-      if(SiS_Pr->SiS_LCDTypeInfo == 1)  tempah++;
+-      tempah -= 8;
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x14,tempah);
+-   } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-      tempcl = tempbh = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x01);
+-      tempbh &= 0x70;
+-      tempbh >>= 4;
+-      tempbl = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x04);
+-      tempbx = (tempbh << 8) | tempbl;
+-      if(SiS_Pr->SiS_LCDTypeInfo == 1)  {
+-           tempbx -= 0x1e;
+-	   tempcl &= 0x0f;
+-	   tempcl -= 4;
+-	   tempcl &= 0x0f;
+-      }
+-      tempbl = tempbx & 0x00ff;
+-      tempbh = (tempbx >> 8) & 0x00ff;
+-      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,tempbl);
+-      tempbh <<= 4;
+-      tempbh |= tempcl;
+-      SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x01,0x80,tempbh);
+-   }
+-}
+-#endif
++  if(ModeNo <= 0x13) {
++        modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
++	crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
++  } else {
++        modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
++	crt2crtc = SiS_Pr->SiS_RefIndex[RefTabIndex].Ext_CRT2CRTC;
++  }
+ 
+-#endif
++  crt2crtc &= 0x3f;
+ 
++  if(SiS_Pr->SiS_CustomT == CUT_BARCO1024) {
++     SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xdf);
++  }
+ 
+-/*  =================  SiS 300 O.E.M. ================== */
++  if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
++     if(modeflag & HalfDCLK) myindex = 1;
+ 
+-#ifdef SIS300
++     if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
++        for(i=0; i<7; i++) {
++           if(barco_p1[myindex][crt2crtc][i][0]) {
++	      SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,
++	                      barco_p1[myindex][crt2crtc][i][0],
++	   	   	      barco_p1[myindex][crt2crtc][i][2],
++			      barco_p1[myindex][crt2crtc][i][1]);
++	   }
++        }
++     }
++     temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00);
++     if(temp & 0x80) {
++        temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x18);
++        temp++;
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,temp);
++     }
++  }
++}
+ 
+ #if 0   /* Not used */
+ static USHORT
+@@ -11582,7 +11837,7 @@ GetOEMLCDPtr(SiS_Private *SiS_Pr, PSIS_H
+ 
+   if(HwDeviceExtension->jChipType == SIS_300) {
+ 
+-    tempbx = SiS_Pr->SiS_LCDResInfo - 2;
++    tempbx = (SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0x0f) - 2;
+     if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx += 4;
+     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+        if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 3;
+@@ -11636,24 +11891,29 @@ SetOEMLCDDelay(SiS_Private *SiS_Pr, PSIS
+ {
+   USHORT index,temp,romptr=0;
+ 
++  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) return;
++
+   if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+      if(!(ROMAddr[0x237] & 0x01)) return;
+      if(!(ROMAddr[0x237] & 0x02)) return;
+      romptr = ROMAddr[0x24b] | (ROMAddr[0x24c] << 8);
+   }
+ 
+-  /* TW: The Panel Compensation Delay should be set according to tables
+-   *     here. Unfortunately, various BIOS versions don't case about
+-   *     a uniform way using eg. ROM byte 0x220, but use different
+-   *     hard coded delays (0x04, 0x20, 0x18) in SetGroup1().
+-   *     Thus we don't set this if the user select a custom pdc or if
+-   *     we otherwise detected a valid pdc.
++  /* The Panel Compensation Delay should be set according to tables
++   * here. Unfortunately, various BIOS versions don't case about
++   * a uniform way using eg. ROM byte 0x220, but use different
++   * hard coded delays (0x04, 0x20, 0x18) in SetGroup1().
++   * Thus we don't set this if the user select a custom pdc or if
++   * we otherwise detected a valid pdc.
+    */
+   if(HwDeviceExtension->pdc) return;
+ 
+   temp = GetOEMLCDPtr(SiS_Pr,HwDeviceExtension, ROMAddr, 0);
+ 
+-  index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex].VB_LCDDelayIndex;
++  if(SiS_Pr->UseCustomMode)
++     index = 0;
++  else
++     index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex].VB_LCDDelayIndex;
+ 
+   if(HwDeviceExtension->jChipType != SIS_300) {
+ 	if(romptr) {
+@@ -11700,9 +11960,9 @@ SetOEMLCDDelay(SiS_Private *SiS_Pr, PSIS
+ 
+ static void
+ SetOEMLCDData(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+-               UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
++              UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
+ {
+-#if 0  /* TW: Unfinished; VData table missing */
++#if 0  /* Unfinished; Data table missing */
+   USHORT index,temp;
+ 
+   if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+@@ -11899,25 +12159,29 @@ SetOEMYFilter(SiS_Private *SiS_Pr, PSIS_
+ 
+ void
+ SiS_OEM300Setting(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+-		  USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo)
++		  USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
++		  USHORT RefTableIndex)
+ {
+-  USHORT ModeIdIndex;
++  USHORT OEMModeIdIndex=0;
+ 
+-  ModeIdIndex = SiS_SearchVBModeID(SiS_Pr,ROMAddr,&ModeNo);
+-  if(!(ModeIdIndex)) return;
++  if(!SiS_Pr->UseCustomMode) {
++     OEMModeIdIndex = SiS_SearchVBModeID(SiS_Pr,ROMAddr,&ModeNo);
++     if(!(OEMModeIdIndex)) return;
++  }
+ 
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-       SetOEMLCDDelay(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
++       SetOEMLCDDelay(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,OEMModeIdIndex);
+        if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+-            SetOEMLCDData(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
++            SetOEMLCDData(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,OEMModeIdIndex);
+        }
+   }
++  if(SiS_Pr->UseCustomMode) return;
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-       SetOEMTVDelay(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
++       SetOEMTVDelay(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,OEMModeIdIndex);
+        if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+-       		SetOEMAntiFlicker(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+-    		SetOEMPhaseIncr(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+-       		SetOEMYFilter(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
++       		SetOEMAntiFlicker(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,OEMModeIdIndex);
++    		SetOEMPhaseIncr(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,OEMModeIdIndex);
++       		SetOEMYFilter(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,OEMModeIdIndex);
+        }
+   }
+ }
+--- linux-2.6.0-test1/drivers/video/sis/init301.h	2003-06-14 12:18:21.000000000 -0700
++++ 25/drivers/video/sis/init301.h	2003-07-19 17:04:55.000000000 -0700
+@@ -1,20 +1,39 @@
+-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init301.h,v 1.4 2000/12/02 01:16:17 dawes Exp $ */
++/* $XFree86$ */
++/*
++ * Data and prototypes for init301.c
++ *
++ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of the copyright holder not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  The copyright holder makes no representations
++ * about the suitability of this software for any purpose.  It is provided
++ * "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
++ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++ * PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Author: 	Thomas Winischhofer <thomas@winischhofer.net>
++ */
++
+ #ifndef  _INIT301_
+ #define  _INIT301_
+ 
+ #include "osdef.h"
++
+ #include "initdef.h"
+ #include "vgatypes.h"
+ #include "vstruct.h"
+ 
+-#ifdef TC
+-#include <stdio.h>
+-#include <string.h>
+-#include <conio.h>
+-#include <dos.h>
+-#include <stdlib.h>
+-#endif
+-
+ #ifdef LINUX_XF86
+ #include "xf86.h"
+ #include "xf86Pci.h"
+@@ -24,6 +43,9 @@
+ #endif
+ 
+ #ifdef LINUX_KERNEL
++#ifdef SIS_CP
++#undef SIS_CP
++#endif
+ #include <linux/config.h>
+ #include <linux/version.h>
+ #include <asm/io.h>
+@@ -35,24 +57,60 @@
+ #endif
+ #endif
+ 
+-#ifdef WIN2000
+-#include <stdio.h>
+-#include <string.h>
+-#include <miniport.h>
+-#include "dderror.h"
+-#include "devioctl.h"
+-#include "miniport.h"
+-#include "ntddvdeo.h"
+-#include "video.h"
+-#include "sisv.h"
+-#endif
++const UCHAR SiS_HiVisionTable[3][64] = {
++  {
++    0x17, 0x1d, 0x03, 0x09, 0x05, 0x06, 0x0c, 0x0c,
++    0x94, 0x49, 0x01, 0x0a, 0x06, 0x0d, 0x04, 0x0a,
++    0x06, 0x14, 0x0d, 0x04, 0x0a, 0x00, 0x85, 0x1b,
++    0x0c, 0x50, 0x00, 0x97, 0x00, 0xd4, 0x4a, 0x17,
++    0x7d, 0x05, 0x4b, 0x00, 0x00, 0xe2, 0x00, 0x02,
++    0x03, 0x0a, 0x65, 0x9d, 0x08, 0x92, 0x8f, 0x40,
++    0x60, 0x80, 0x14, 0x90, 0x8c, 0x60, 0x14, 0x53,
++    0x00, 0x40, 0x44, 0x00, 0xdb, 0x02, 0x3b, 0x00
++  },
++  {
++    0x1d, 0x1d, 0x06, 0x09, 0x0b, 0x0c, 0x0c, 0x0c,
++    0x98, 0x0a, 0x01, 0x0d, 0x06, 0x0d, 0x04, 0x0a,
++    0x06, 0x14, 0x0d, 0x04, 0x0a, 0x00, 0x85, 0x3f,
++    0x0c, 0x50, 0xb2, 0x2e, 0x16, 0xb5, 0xf4, 0x03,
++    0x7d, 0x11, 0x7d, 0xea, 0x30, 0x36, 0x18, 0x96,
++    0x21, 0x0a, 0x58, 0xee, 0x42, 0x92, 0x0f, 0x40,
++    0x60, 0x80, 0x14, 0x90, 0x8c, 0x60, 0x04, 0xf3,
++    0x00, 0x40, 0x11, 0x00, 0xfc, 0xff, 0x32, 0x00
++  },
++  {
++    0x13, 0x1d, 0xe8, 0x09, 0x09, 0xed, 0x0c, 0x0c,
++    0x98, 0x0a, 0x01, 0x0c, 0x06, 0x0d, 0x04, 0x0a,
++    0x06, 0x14, 0x0d, 0x04, 0x0a, 0x00, 0x85, 0x3f,
++    0xed, 0x50, 0x70, 0x9f, 0x16, 0x59, 0x2b, 0x13,
++    0x27, 0x0b, 0x27, 0xfc, 0x30, 0x27, 0x1c, 0xb0,
++    0x4b, 0x4b, 0x6f, 0x2f, 0x63, 0x92, 0x0f, 0x40,
++    0x60, 0x80, 0x14, 0x90, 0x8c, 0x60, 0x14, 0x2a,
++    0x00, 0x40, 0x11, 0x00, 0xfc, 0xff, 0x32, 0x00
++  }
++};
+ 
+-#if 0
+-extern   const USHORT   SiS_MDA_DAC[];
+-extern   const USHORT   SiS_CGA_DAC[];
+-extern   const USHORT   SiS_EGA_DAC[];
+-extern   const USHORT   SiS_VGA_DAC[];
+-#endif
++const UCHAR SiS_HiTVGroup3_1[] = {
++    0x00, 0x14, 0x15, 0x25, 0x55, 0x15, 0x0b, 0x13,
++    0xb1, 0x41, 0x62, 0x62, 0xff, 0xf4, 0x45, 0xa6,
++    0x25, 0x2f, 0x67, 0xf6, 0xbf, 0xff, 0x8e, 0x20,
++    0xac, 0xda, 0x60, 0xfe, 0x6a, 0x9a, 0x06, 0x10,
++    0xd1, 0x04, 0x18, 0x0a, 0xff, 0x80, 0x00, 0x80,
++    0x3b, 0x77, 0x00, 0xef, 0xe0, 0x10, 0xb0, 0xe0,
++    0x10, 0x4f, 0x0f, 0x0f, 0x05, 0x0f, 0x08, 0x6e,
++    0x1a, 0x1f, 0x25, 0x2a, 0x4c, 0xaa, 0x01
++};
++
++const UCHAR SiS_HiTVGroup3_2[] = {
++    0x00, 0x14, 0x15, 0x25, 0x55, 0x15, 0x0b, 0x7a,
++    0x54, 0x41, 0xe7, 0xe7, 0xff, 0xf4, 0x45, 0xa6,
++    0x25, 0x2f, 0x67, 0xf6, 0xbf, 0xff, 0x8e, 0x20,
++    0xac, 0x6a, 0x60, 0x2b, 0x52, 0xcd, 0x61, 0x10,
++    0x51, 0x04, 0x18, 0x0a, 0x1f, 0x80, 0x00, 0x80,
++    0xff, 0xa4, 0x04, 0x2b, 0x94, 0x21, 0x72, 0x94,
++    0x26, 0x05, 0x01, 0x0f, 0xed, 0x0f, 0x0a, 0x64,
++    0x18, 0x1d, 0x23, 0x28, 0x4c, 0xaa, 0x01
++};
+ 
+ extern   BOOLEAN  SiS_SearchVBModeID(SiS_Private *SiS_Pr, UCHAR *RomAddr, USHORT *);
+ 
+@@ -129,7 +187,6 @@ void     SiS_GetVBInfo(SiS_Private *SiS_
+ BOOLEAN  SiS_BridgeIsOn(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO);
+ BOOLEAN  SiS_BridgeIsEnable(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO);
+ BOOLEAN  SiS_BridgeInSlave(SiS_Private *SiS_Pr);
+-void     SiS_PresetScratchregister(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ void     SiS_SetTVSystem(SiS_Private *SiS_Pr);
+ void     SiS_LongWait(SiS_Private *SiS_Pr);
+ USHORT   SiS_GetQueueConfig(SiS_Private *SiS_Pr);
+@@ -149,7 +206,7 @@ void     SiS_GetLVDSDesPtrA(SiS_Private 
+                             USHORT RefreshRateTableIndex,USHORT *PanelIndex,USHORT *ResIndex);
+ #endif			    
+ void     SiS_SetTPData(SiS_Private *SiS_Pr);
+-void     SiS_WhatIsThis(SiS_Private *SiS_Pr, USHORT myvbinfo);
++void     SiS_SetChrontelGPIO(SiS_Private *SiS_Pr, USHORT myvbinfo);
+ void     SiS_ModCRT1CRTC(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                          USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ void     SiS_SetCHTVReg(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+@@ -178,20 +235,18 @@ USHORT   SiS_SetSCLKHigh(SiS_Private *Si
+ USHORT   SiS_ReadDDC2Data(SiS_Private *SiS_Pr, USHORT tempax);
+ USHORT   SiS_WriteDDC2Data(SiS_Private *SiS_Pr, USHORT tempax);
+ USHORT   SiS_CheckACK(SiS_Private *SiS_Pr);
+-USHORT   SiS_ReadLCDDDC(SiS_Private *SiS_Pr, USHORT length, unsigned char *buffer);
+-#ifdef LINUX_XF86
+-USHORT   SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS);
+-USHORT   SiS_SenseVGA2DDC(SiS_Private *SiS_Pr, SISPtr pSiS);
+-#endif
++
+ #ifdef SIS315H
+ void     SiS_OEM310Setting(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+                            UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex);
+ void     SiS_OEMLCD(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+-                    UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex);
++                    UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex);
+ #endif
+ #ifdef SIS300
+ void     SiS_OEM300Setting(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+-                           UCHAR *ROMAddr,USHORT ModeNo);
++                           UCHAR *ROMAddr,USHORT ModeNo, USHORT ModeIdIndex, USHORT RefTabindex);
++void     SetOEMLCDData2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
++			UCHAR *ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,USHORT RefTableIndex);
+ #endif
+ BOOLEAN  SiS_LowModeStuff(SiS_Private *SiS_Pr, USHORT ModeNo,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ 
+@@ -200,8 +255,8 @@ BOOLEAN  SiS_GetLCDResInfo(SiS_Private *
+ /* void    SiS_CHACRT1CRTC(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                         USHORT RefreshRateTableIndex); */
+ 
+-BOOLEAN  SiS_SetCRT2Group301(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+-                             PSIS_HW_DEVICE_INFO HwDeviceExtension);
++BOOLEAN  SiS_SetCRT2Group(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
++                          PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ void     SiS_SetGroup1(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                        PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex);
+ void     SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+@@ -237,19 +292,19 @@ void     SiS_VBWait(SiS_Private *SiS_Pr)
+ void     SiS_SiS30xBLOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ void     SiS_SiS30xBLOff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ 
+-void     SiS_Chrontel701xBLOn(SiS_Private *SiS_Pr);
++void     SiS_Chrontel701xBLOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ void     SiS_Chrontel701xBLOff(SiS_Private *SiS_Pr);
+ #ifdef SIS315H
+ void     SiS_Chrontel701xOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+                             USHORT BaseAddr);
+-void     SiS_Chrontel701xOff(SiS_Private *SiS_Pr);
++void     SiS_Chrontel701xOff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ void     SiS_ChrontelResetDB(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+ void     SiS_ChrontelDoSomething4(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+ void     SiS_ChrontelDoSomething3(SiS_Private *SiS_Pr, USHORT ModeNo, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+ void     SiS_ChrontelDoSomething2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+ void     SiS_ChrontelDoSomething1(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+ BOOLEAN  SiS_WeHaveBacklightCtrl(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+-void     SiS_ChrontelPowerSequencing(SiS_Private *SiS_Pr);
++void     SiS_ChrontelPowerSequencing(SiS_Private *SiS_Pr,  PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ void     SiS_SetCH701xForLCD(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+ #ifdef NEWCH701x
+ void     SiS_ChrontelDoSomething5(SiS_Private *SiS_Pr);
+@@ -289,73 +344,21 @@ extern   void     SiS_LoadDAC(SiS_Privat
+ extern   UCHAR    SiS_Get310DRAMType(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ #endif
+ 
+-#ifdef LINUX_XF86
+ /* DDC functions */
+-USHORT   SiS_InitDDCRegs(SiS_Private *SiS_Pr, SISPtr pSiS, USHORT adaptnum, USHORT DDCdatatype, BOOLEAN checkcr32);
++USHORT   SiS_InitDDCRegs(SiS_Private *SiS_Pr, unsigned long VBFlags, int VGAEngine,
++                         USHORT adaptnum, USHORT DDCdatatype, BOOLEAN checkcr32);
+ USHORT   SiS_WriteDABDDC(SiS_Private *SiS_Pr);
+ USHORT   SiS_PrepareReadDDC(SiS_Private *SiS_Pr);
+ USHORT   SiS_PrepareDDC(SiS_Private *SiS_Pr);
+ void     SiS_SendACK(SiS_Private *SiS_Pr, USHORT yesno);
+ USHORT   SiS_DoProbeDDC(SiS_Private *SiS_Pr);
+ USHORT   SiS_ProbeDDC(SiS_Private *SiS_Pr);
+-USHORT   SiS_ReadDDC(SiS_Private *SiS_Pr, SISPtr pSiS, USHORT DDCdatatype, unsigned char *buffer);
+-USHORT   SiS_HandleDDC(SiS_Private *SiS_Pr, SISPtr pSiS, USHORT adaptnum,
+-                       USHORT DDCdatatype, unsigned char *buffer);
++USHORT   SiS_ReadDDC(SiS_Private *SiS_Pr, USHORT DDCdatatype, unsigned char *buffer);
++USHORT   SiS_HandleDDC(SiS_Private *SiS_Pr, unsigned long VBFlags, int VGAEngine,
++		       USHORT adaptnum, USHORT DDCdatatype, unsigned char *buffer);
++#ifdef LINUX_XF86
++USHORT   SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS);
++USHORT   SiS_SenseVGA2DDC(SiS_Private *SiS_Pr, SISPtr pSiS);
+ #endif
+ 
+-const UCHAR SiS_HiVisionTable[3][64] = {
+-  { 
+-    0x17, 0x1d, 0x03, 0x09, 0x05, 0x06, 0x0c, 0x0c,
+-    0x94, 0x49, 0x01, 0x0a, 0x06, 0x0d, 0x04, 0x0a,
+-    0x06, 0x14, 0x0d, 0x04, 0x0a, 0x00, 0x85, 0x1b,
+-    0x0c, 0x50, 0x00, 0x97, 0x00, 0xd4, 0x4a, 0x17,
+-    0x7d, 0x05, 0x4b, 0x00, 0x00, 0xe2, 0x00, 0x02,
+-    0x03, 0x0a, 0x65, 0x9d, 0x08, 0x92, 0x8f, 0x40,
+-    0x60, 0x80, 0x14, 0x90, 0x8c, 0x60, 0x14, 0x53,
+-    0x00, 0x40, 0x44, 0x00, 0xdb, 0x02, 0x3b, 0x00
+-  },
+-  { 
+-    0x1d, 0x1d, 0x06, 0x09, 0x0b, 0x0c, 0x0c, 0x0c,
+-    0x98, 0x0a, 0x01, 0x0d, 0x06, 0x0d, 0x04, 0x0a,
+-    0x06, 0x14, 0x0d, 0x04, 0x0a, 0x00, 0x85, 0x3f,
+-    0x0c, 0x50, 0xb2, 0x2e, 0x16, 0xb5, 0xf4, 0x03,
+-    0x7d, 0x11, 0x7d, 0xea, 0x30, 0x36, 0x18, 0x96,
+-    0x21, 0x0a, 0x58, 0xee, 0x42, 0x92, 0x0f, 0x40,
+-    0x60, 0x80, 0x14, 0x90, 0x8c, 0x60, 0x04, 0xf3,
+-    0x00, 0x40, 0x11, 0x00, 0xfc, 0xff, 0x32, 0x00
+-  },
+-  { 
+-    0x13, 0x1d, 0xe8, 0x09, 0x09, 0xed, 0x0c, 0x0c, 
+-    0x98, 0x0a, 0x01, 0x0c, 0x06, 0x0d, 0x04, 0x0a, 
+-    0x06, 0x14, 0x0d, 0x04, 0x0a, 0x00, 0x85, 0x3f, 
+-    0xed, 0x50, 0x70, 0x9f, 0x16, 0x59, 0x2b, 0x13, 
+-    0x27, 0x0b, 0x27, 0xfc, 0x30, 0x27, 0x1c, 0xb0, 
+-    0x4b, 0x4b, 0x6f, 0x2f, 0x63, 0x92, 0x0f, 0x40, 
+-    0x60, 0x80, 0x14, 0x90, 0x8c, 0x60, 0x14, 0x2a, 
+-    0x00, 0x40, 0x11, 0x00, 0xfc, 0xff, 0x32, 0x00 
+-  }
+-};
+-
+-const UCHAR SiS_HiTVGroup3_1[] = {
+-    0x00, 0x14, 0x15, 0x25, 0x55, 0x15, 0x0b, 0x13,
+-    0xb1, 0x41, 0x62, 0x62, 0xff, 0xf4, 0x45, 0xa6,
+-    0x25, 0x2f, 0x67, 0xf6, 0xbf, 0xff, 0x8e, 0x20,
+-    0xac, 0xda, 0x60, 0xfe, 0x6a, 0x9a, 0x06, 0x10,
+-    0xd1, 0x04, 0x18, 0x0a, 0xff, 0x80, 0x00, 0x80,
+-    0x3b, 0x77, 0x00, 0xef, 0xe0, 0x10, 0xb0, 0xe0,
+-    0x10, 0x4f, 0x0f, 0x0f, 0x05, 0x0f, 0x08, 0x6e,
+-    0x1a, 0x1f, 0x25, 0x2a, 0x4c, 0xaa, 0x01
+-};
+-
+-const UCHAR SiS_HiTVGroup3_2[] = {
+-    0x00, 0x14, 0x15, 0x25, 0x55, 0x15, 0x0b, 0x7a,
+-    0x54, 0x41, 0xe7, 0xe7, 0xff, 0xf4, 0x45, 0xa6,
+-    0x25, 0x2f, 0x67, 0xf6, 0xbf, 0xff, 0x8e, 0x20,
+-    0xac, 0x6a, 0x60, 0x2b, 0x52, 0xcd, 0x61, 0x10,
+-    0x51, 0x04, 0x18, 0x0a, 0x1f, 0x80, 0x00, 0x80,
+-    0xff, 0xa4, 0x04, 0x2b, 0x94, 0x21, 0x72, 0x94,
+-    0x26, 0x05, 0x01, 0x0f, 0xed, 0x0f, 0x0a, 0x64,
+-    0x18, 0x1d, 0x23, 0x28, 0x4c, 0xaa, 0x01
+-};
+-
+ #endif
+--- linux-2.6.0-test1/drivers/video/sis/init.c	2003-06-14 12:18:05.000000000 -0700
++++ 25/drivers/video/sis/init.c	2003-07-19 17:04:55.000000000 -0700
+@@ -1,24 +1,11 @@
+ /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init.c,v 1.3 2002/24/04 01:16:16 dawes Exp $ */
+ /*
+- * Mode switching code (CRT1 section) for SiS 300/540/630/730/315/550/650/740/330
++ * Mode switching code (CRT1 section) for SiS 300/540/630/730/315/550/650/740/330/660
+  * (Universal module for Linux kernel framebuffer and XFree86 4.x)
+  *
+  * Assembler-To-C translation
+- * Copyright 2002 by Thomas Winischhofer <thomas@winischhofer.net>
+- * Minor parts Copyright SiS, Inc.
+- *
+- * Based on BIOS
+- *     1.10.07, 1.10a for 650/CH7019
+- *     1.11.21a for 740/CH7019
+- *     1.11.05 for 650/LVDS (w/o Chrontel)
+- *     1.07.1b, 1.11.6s, 1.11.6w, 1.11.7w, 1.11.8r for 650/301(B/LV)
+- *     2.04.50 (I) and 2.04.5c (II) for 630/301(B)
+- *     2.06.50 for 630/301B (dual VGA)
+- *     2.02.3b, 2.03.02, 2.04.5c, 2.07a and 2.08.b3 for 630/LVDS/LVDS+CH7005
+- *     2.04.5c, 2.04.6c for 730+LVDS+CH7005
+- *     1.09b for 315/301(B)
+- *     1.16.51 for 300+301LV (ECS A907)
+- *     1.01.03 for 330 (Xabre 400)
++ * Copyright 2002, 2003 by Thomas Winischhofer <thomas@winischhofer.net>
++ * Formerly based on non-functional code-fragements by SiS, Inc.
+  *
+  * Permission to use, copy, modify, distribute, and sell this software and its
+  * documentation for any purpose is hereby granted without fee, provided that
+@@ -61,12 +48,12 @@
+ #ifdef LINUX_XF86
+ BOOLEAN SiSBIOSSetMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+                        ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN IsCustom);
+-DisplayModePtr SiSBuildBuiltInModeList(ScrnInfoPtr pScrn);
+-#ifdef SISDUALHEAD /* TW: For dual head */
++DisplayModePtr SiSBuildBuiltInModeList(ScrnInfoPtr pScrn, BOOLEAN includelcdmodes, BOOLEAN isfordvi);
++#ifdef SISDUALHEAD
+ BOOLEAN SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+                        ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN IsCustom);
+ BOOLEAN SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+-                       ScrnInfoPtr pScrn, DisplayModePtr mode);
++                       ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN IsCustom);
+ #endif /* dual head */
+ #endif /* linux_xf86 */
+ 
+@@ -90,49 +77,199 @@ BOOLEAN SiSSetMode(SiS_Private *SiS_Pr, 
+ static ULONG GetDRAMSize(SiS_Private *SiS_Pr,
+                          PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ 
+-static void DelaySeconds(int seconds);
+-void SiS_DebugCode(SiS_Private *SiS_Pr, UCHAR code);
+-
+ static void
+-DelaySeconds(int seconds)
++InitCommonPointer(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
+-  int i;
+-#ifdef WIN2000
+-  int j;
+-#endif
+-
+-  for (i=0;i<seconds;i++) {
+-#ifdef TC
+-    delay(1000);
+-#endif
+-
+-#ifdef WIN2000
+-    for (j=0;j<20000;j++)
+-      VideoPortStallExecution(50);
+-#endif
+-
+-#ifdef WINCE_HEADER
+-#endif
+-
+-#ifdef LINUX_KERNEL
+-#endif
+-  }
+-}
+-
+-void
+-SiS_DebugCode(SiS_Private *SiS_Pr, UCHAR code)
+-{
+-  OutPortByte(0x80, code);
+-  DelaySeconds(0x3);
++   SiS_Pr->SiS_StResInfo     = SiS_StResInfo;
++   SiS_Pr->SiS_ModeResInfo   = SiS_ModeResInfo;
++   SiS_Pr->SiS_StandTable    = SiS_StandTable;
++   if(HwDeviceExtension->jChipType < SIS_315H) {
++      SiS_StandTable[0x04].CRTC[4] = 0x2b;
++      SiS_StandTable[0x05].CRTC[4] = 0x2b;
++      SiS_StandTable[0x06].CRTC[4] = 0x54;
++      SiS_StandTable[0x06].CRTC[5] = 0x80;
++      SiS_StandTable[0x0d].CRTC[4] = 0x2b;
++      SiS_StandTable[0x0e].CRTC[4] = 0x54;
++      SiS_StandTable[0x0e].CRTC[5] = 0x80;
++      SiS_StandTable[0x11].CRTC[4] = 0x54;
++      SiS_StandTable[0x11].CRTC[5] = 0x80;
++      SiS_StandTable[0x11].CRTC[16] = 0x83;
++      SiS_StandTable[0x11].CRTC[17] = 0x85;
++      SiS_StandTable[0x12].CRTC[4] = 0x54;
++      SiS_StandTable[0x12].CRTC[5] = 0x80;
++      SiS_StandTable[0x12].CRTC[16] = 0x83;
++      SiS_StandTable[0x12].CRTC[17] = 0x85;
++      SiS_StandTable[0x13].CRTC[5] = 0xa0;
++      SiS_StandTable[0x17].CRTC[5] = 0xa0;
++      SiS_StandTable[0x1a].CRTC[4] = 0x54;
++      SiS_StandTable[0x1a].CRTC[5] = 0x80;
++      SiS_StandTable[0x1a].CRTC[16] = 0xea;
++      SiS_StandTable[0x1a].CRTC[17] = 0x8c;
++      SiS_StandTable[0x1b].CRTC[4] = 0x54;
++      SiS_StandTable[0x1b].CRTC[5] = 0x80;
++      SiS_StandTable[0x1b].CRTC[16] = 0xea;
++      SiS_StandTable[0x1b].CRTC[17] = 0x8c;
++      SiS_StandTable[0x1c].CRTC[4] = 0x54;
++      SiS_StandTable[0x1c].CRTC[5] = 0x80;
++   } else {
++      SiS_StandTable[0x04].CRTC[4] = 0x2c;
++      SiS_StandTable[0x05].CRTC[4] = 0x2c;
++      SiS_StandTable[0x06].CRTC[4] = 0x55;
++      SiS_StandTable[0x06].CRTC[5] = 0x81;
++      SiS_StandTable[0x0d].CRTC[4] = 0x2c;
++      SiS_StandTable[0x0e].CRTC[4] = 0x55;
++      SiS_StandTable[0x0e].CRTC[5] = 0x81;
++      SiS_StandTable[0x11].CRTC[4] = 0x55;
++      SiS_StandTable[0x11].CRTC[5] = 0x81;
++      SiS_StandTable[0x11].CRTC[16] = 0x82;
++      SiS_StandTable[0x11].CRTC[17] = 0x84;
++      SiS_StandTable[0x12].CRTC[4] = 0x55;
++      SiS_StandTable[0x12].CRTC[5] = 0x81;
++      SiS_StandTable[0x12].CRTC[16] = 0x82;
++      SiS_StandTable[0x12].CRTC[17] = 0x84;
++      SiS_StandTable[0x13].CRTC[5] = 0xb1;
++      SiS_StandTable[0x17].CRTC[5] = 0xb1;
++      SiS_StandTable[0x1a].CRTC[4] = 0x55;
++      SiS_StandTable[0x1a].CRTC[5] = 0x81;
++      SiS_StandTable[0x1a].CRTC[16] = 0xe9;
++      SiS_StandTable[0x1a].CRTC[17] = 0x8b;
++      SiS_StandTable[0x1b].CRTC[4] = 0x55;
++      SiS_StandTable[0x1b].CRTC[5] = 0x81;
++      SiS_StandTable[0x1b].CRTC[16] = 0xe9;
++      SiS_StandTable[0x1b].CRTC[17] = 0x8b;
++      SiS_StandTable[0x1c].CRTC[4] = 0x55;
++      SiS_StandTable[0x1c].CRTC[5] = 0x81;
++   }
++
++   SiS_Pr->SiS_NTSCPhase    = SiS_NTSCPhase;
++   SiS_Pr->SiS_PALPhase     = SiS_PALPhase;
++   SiS_Pr->SiS_NTSCPhase2   = SiS_NTSCPhase2;
++   SiS_Pr->SiS_PALPhase2    = SiS_PALPhase2;
++   SiS_Pr->SiS_PALMPhase    = SiS_PALMPhase;
++   SiS_Pr->SiS_PALNPhase    = SiS_PALNPhase;
++   SiS_Pr->SiS_PALMPhase2   = SiS_PALMPhase2;
++   SiS_Pr->SiS_PALNPhase2   = SiS_PALNPhase2;
++   SiS_Pr->SiS_SpecialPhase = SiS_SpecialPhase;
++
++   SiS_Pr->SiS_NTSCTiming     = SiS_NTSCTiming;
++   SiS_Pr->SiS_PALTiming      = SiS_PALTiming;
++   SiS_Pr->SiS_HiTVSt1Timing  = SiS_HiTVSt1Timing;
++   SiS_Pr->SiS_HiTVSt2Timing  = SiS_HiTVSt2Timing;
++   SiS_Pr->SiS_HiTVTextTiming = SiS_HiTVTextTiming;
++   SiS_Pr->SiS_HiTVExtTiming  = SiS_HiTVExtTiming;
++   SiS_Pr->SiS_HiTVGroup3Data = SiS_HiTVGroup3Data;
++   SiS_Pr->SiS_HiTVGroup3Simu = SiS_HiTVGroup3Simu;
++   SiS_Pr->SiS_HiTVGroup3Text = SiS_HiTVGroup3Text;
++
++   SiS_Pr->SiS_StPALData   = SiS_StPALData;
++   SiS_Pr->SiS_ExtPALData  = SiS_ExtPALData;
++   SiS_Pr->SiS_StNTSCData  = SiS_StNTSCData;
++   SiS_Pr->SiS_ExtNTSCData = SiS_ExtNTSCData;
++/* SiS_Pr->SiS_St1HiTVData = SiS_St1HiTVData;  */
++   SiS_Pr->SiS_St2HiTVData = SiS_St2HiTVData;
++   SiS_Pr->SiS_ExtHiTVData = SiS_ExtHiTVData;
++
++   SiS_Pr->pSiS_OutputSelect = &SiS_OutputSelect;
++   SiS_Pr->pSiS_SoftSetting  = &SiS_SoftSetting;
++
++   SiS_Pr->SiS_LCD1280x960Data      = SiS_LCD1280x960Data;
++   SiS_Pr->SiS_ExtLCD1400x1050Data  = SiS_ExtLCD1400x1050Data;
++   SiS_Pr->SiS_ExtLCD1600x1200Data  = SiS_ExtLCD1600x1200Data;
++   SiS_Pr->SiS_StLCD1400x1050Data   = SiS_StLCD1400x1050Data;
++   SiS_Pr->SiS_StLCD1600x1200Data   = SiS_StLCD1600x1200Data;
++   SiS_Pr->SiS_NoScaleData1400x1050 = SiS_NoScaleData1400x1050;
++   SiS_Pr->SiS_NoScaleData1600x1200 = SiS_NoScaleData1600x1200;
++   SiS_Pr->SiS_ExtLCD1280x768Data   = SiS_ExtLCD1280x768Data;
++   SiS_Pr->SiS_StLCD1280x768Data    = SiS_StLCD1280x768Data;
++   SiS_Pr->SiS_NoScaleData1280x768  = SiS_NoScaleData1280x768;
++   SiS_Pr->SiS_NoScaleData          = SiS_NoScaleData;
++
++   SiS_Pr->SiS_LVDS320x480Data_1   = SiS_LVDS320x480Data_1;
++   SiS_Pr->SiS_LVDS800x600Data_1   = SiS_LVDS800x600Data_1;
++   SiS_Pr->SiS_LVDS800x600Data_2   = SiS_LVDS800x600Data_2;
++   SiS_Pr->SiS_LVDS1024x768Data_1  = SiS_LVDS1024x768Data_1;
++   SiS_Pr->SiS_LVDS1024x768Data_2  = SiS_LVDS1024x768Data_2;
++   SiS_Pr->SiS_LVDS1280x1024Data_1 = SiS_LVDS1280x1024Data_1;
++   SiS_Pr->SiS_LVDS1280x1024Data_2 = SiS_LVDS1280x1024Data_2;
++   SiS_Pr->SiS_LVDS1400x1050Data_1 = SiS_LVDS1400x1050Data_1;
++   SiS_Pr->SiS_LVDS1400x1050Data_2 = SiS_LVDS1400x1050Data_2;
++   SiS_Pr->SiS_LVDS1600x1200Data_1 = SiS_LVDS1600x1200Data_1;
++   SiS_Pr->SiS_LVDS1600x1200Data_2 = SiS_LVDS1600x1200Data_2;
++   SiS_Pr->SiS_LVDS1280x768Data_1  = SiS_LVDS1280x768Data_1;
++   SiS_Pr->SiS_LVDS1280x768Data_2  = SiS_LVDS1280x768Data_2;
++   SiS_Pr->SiS_LVDS1024x600Data_1  = SiS_LVDS1024x600Data_1;
++   SiS_Pr->SiS_LVDS1024x600Data_2  = SiS_LVDS1024x600Data_2;
++   SiS_Pr->SiS_LVDS1152x768Data_1  = SiS_LVDS1152x768Data_1;
++   SiS_Pr->SiS_LVDS1152x768Data_2  = SiS_LVDS1152x768Data_2;
++   SiS_Pr->SiS_LVDSXXXxXXXData_1   = SiS_LVDSXXXxXXXData_1;
++   SiS_Pr->SiS_LVDS1280x960Data_1  = SiS_LVDS1280x960Data_1;
++   SiS_Pr->SiS_LVDS1280x960Data_2  = SiS_LVDS1280x960Data_2;
++   SiS_Pr->SiS_LVDS640x480Data_1   = SiS_LVDS640x480Data_1;
++   SiS_Pr->SiS_LVDS1280x960Data_1  = SiS_LVDS1280x1024Data_1;
++   SiS_Pr->SiS_LVDS1280x960Data_2  = SiS_LVDS1280x1024Data_2;
++   SiS_Pr->SiS_LVDS640x480Data_1   = SiS_LVDS640x480Data_1;
++   SiS_Pr->SiS_LVDS640x480Data_2   = SiS_LVDS640x480Data_2;
++
++   SiS_Pr->SiS_LVDSBARCO1366Data_1 = SiS_LVDSBARCO1366Data_1;
++   SiS_Pr->SiS_LVDSBARCO1366Data_2 = SiS_LVDSBARCO1366Data_2;
++   SiS_Pr->SiS_LVDSBARCO1024Data_1 = SiS_LVDSBARCO1024Data_1;
++   SiS_Pr->SiS_LVDSBARCO1024Data_2 = SiS_LVDSBARCO1024Data_2;
++
++   SiS_Pr->SiS_LCDA1400x1050Data_1 = SiS_LCDA1400x1050Data_1;
++   SiS_Pr->SiS_LCDA1400x1050Data_2 = SiS_LCDA1400x1050Data_2;
++   SiS_Pr->SiS_LCDA1600x1200Data_1 = SiS_LCDA1600x1200Data_1;
++   SiS_Pr->SiS_LCDA1600x1200Data_2 = SiS_LCDA1600x1200Data_2;
++   SiS_Pr->SiS_CHTVUNTSCData = SiS_CHTVUNTSCData;
++   SiS_Pr->SiS_CHTVONTSCData = SiS_CHTVONTSCData;
++
++   SiS_Pr->LVDS1024x768Des_1  = SiS_PanelType1076_1;
++   SiS_Pr->LVDS1280x1024Des_1 = SiS_PanelType1210_1;
++   SiS_Pr->LVDS1400x1050Des_1 = SiS_PanelType1296_1;
++   SiS_Pr->LVDS1600x1200Des_1 = SiS_PanelType1600_1;
++   SiS_Pr->LVDS1024x768Des_2  = SiS_PanelType1076_2;
++   SiS_Pr->LVDS1280x1024Des_2 = SiS_PanelType1210_2;
++   SiS_Pr->LVDS1400x1050Des_2 = SiS_PanelType1296_2;
++   SiS_Pr->LVDS1600x1200Des_2 = SiS_PanelType1600_2;
++
++   SiS_Pr->SiS_PanelTypeNS_1 = SiS_PanelTypeNS_1;
++   SiS_Pr->SiS_PanelTypeNS_2 = SiS_PanelTypeNS_2;
++
++   SiS_Pr->SiS_CHTVUNTSCDesData = SiS_CHTVUNTSCDesData;
++   SiS_Pr->SiS_CHTVONTSCDesData = SiS_CHTVONTSCDesData;
++   SiS_Pr->SiS_CHTVUPALDesData  = SiS_CHTVUPALDesData;
++   SiS_Pr->SiS_CHTVOPALDesData  = SiS_CHTVOPALDesData;
++
++   SiS_Pr->SiS_LVDSCRT11280x768_1    = SiS_LVDSCRT11280x768_1;
++   SiS_Pr->SiS_LVDSCRT11024x600_1    = SiS_LVDSCRT11024x600_1;
++   SiS_Pr->SiS_LVDSCRT11152x768_1    = SiS_LVDSCRT11152x768_1;
++   SiS_Pr->SiS_LVDSCRT11280x768_1_H  = SiS_LVDSCRT11280x768_1_H;
++   SiS_Pr->SiS_LVDSCRT11024x600_1_H  = SiS_LVDSCRT11024x600_1_H;
++   SiS_Pr->SiS_LVDSCRT11152x768_1_H  = SiS_LVDSCRT11152x768_1_H;
++   SiS_Pr->SiS_LVDSCRT11280x768_2    = SiS_LVDSCRT11280x768_2;
++   SiS_Pr->SiS_LVDSCRT11024x600_2    = SiS_LVDSCRT11024x600_2;
++   SiS_Pr->SiS_LVDSCRT11152x768_2    = SiS_LVDSCRT11152x768_2;
++   SiS_Pr->SiS_LVDSCRT11280x768_2_H  = SiS_LVDSCRT11280x768_2_H;
++   SiS_Pr->SiS_LVDSCRT11024x600_2_H  = SiS_LVDSCRT11024x600_2_H;
++   SiS_Pr->SiS_LVDSCRT11152x768_2_H  = SiS_LVDSCRT11152x768_2_H;
++   SiS_Pr->SiS_LVDSCRT1320x480_1     = SiS_LVDSCRT1320x480_1;
++   SiS_Pr->SiS_LVDSCRT1XXXxXXX_1     = SiS_LVDSCRT1XXXxXXX_1;
++   SiS_Pr->SiS_LVDSCRT1XXXxXXX_1_H   = SiS_LVDSCRT1XXXxXXX_1_H;
++   SiS_Pr->SiS_LVDSCRT1640x480_1     = SiS_LVDSCRT1640x480_1;
++   SiS_Pr->SiS_LVDSCRT1640x480_1_H   = SiS_LVDSCRT1640x480_1_H;
++   SiS_Pr->SiS_LVDSCRT1640x480_2     = SiS_LVDSCRT1640x480_2;
++   SiS_Pr->SiS_LVDSCRT1640x480_2_H   = SiS_LVDSCRT1640x480_2_H;
++   SiS_Pr->SiS_LVDSCRT1640x480_3     = SiS_LVDSCRT1640x480_3;
++   SiS_Pr->SiS_LVDSCRT1640x480_3_H   = SiS_LVDSCRT1640x480_3_H;
+ }
+ 
+ #ifdef SIS300
+ static void
+ InitTo300Pointer(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
++   InitCommonPointer(SiS_Pr, HwDeviceExtension);
++
+    SiS_Pr->SiS_SModeIDTable  = (SiS_StStruct *)SiS300_SModeIDTable;
+    SiS_Pr->SiS_VBModeIDTable = (SiS_VBModeStruct *)SiS300_VBModeIDTable;
+-   SiS_Pr->SiS_StandTable    = (SiS_StandTableStruct *)SiS300_StandTable;
+    SiS_Pr->SiS_EModeIDTable  = (SiS_ExtStruct *)SiS300_EModeIDTable;
+    SiS_Pr->SiS_RefIndex      = (SiS_Ext2Struct *)SiS300_RefIndex;
+    SiS_Pr->SiS_CRT1Table     = (SiS_CRT1TableStruct *)SiS300_CRT1Table;
+@@ -141,15 +278,12 @@ InitTo300Pointer(SiS_Private *SiS_Pr, PS
+    } else {
+       SiS_Pr->SiS_MCLKData_0    = (SiS_MCLKDataStruct *)SiS300_MCLKData_630; /* 630, 730 */
+    }
++#ifdef LINUXBIOS
+    SiS_Pr->SiS_ECLKData      = (SiS_ECLKDataStruct *)SiS300_ECLKData;
++#endif
+    SiS_Pr->SiS_VCLKData      = (SiS_VCLKDataStruct *)SiS300_VCLKData;
+    SiS_Pr->SiS_VBVCLKData    = (SiS_VBVCLKDataStruct *)SiS300_VCLKData;
+    SiS_Pr->SiS_ScreenOffset  = SiS300_ScreenOffset;
+-   SiS_Pr->SiS_StResInfo     = (SiS_StResInfoStruct *)SiS300_StResInfo;
+-   SiS_Pr->SiS_ModeResInfo   = (SiS_ModeResInfoStruct *)SiS300_ModeResInfo;
+-
+-   SiS_Pr->pSiS_OutputSelect = &SiS300_OutputSelect;
+-   SiS_Pr->pSiS_SoftSetting  = &SiS300_SoftSetting;
+ 
+    SiS_Pr->SiS_SR15  = SiS300_SR15;
+ 
+@@ -178,15 +312,6 @@ InitTo300Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->pSiS_YCSenseData2    = &SiS300_YCSenseData2;
+ #endif
+ 
+-   SiS_Pr->SiS_NTSCPhase  = SiS300_NTSCPhase;
+-   SiS_Pr->SiS_PALPhase   = SiS300_PALPhase;
+-   SiS_Pr->SiS_NTSCPhase2 = SiS300_NTSCPhase2;
+-   SiS_Pr->SiS_PALPhase2  = SiS300_PALPhase2;
+-   SiS_Pr->SiS_PALMPhase  = SiS300_PALMPhase;
+-   SiS_Pr->SiS_PALNPhase  = SiS300_PALNPhase;
+-   SiS_Pr->SiS_PALMPhase2 = SiS300_PALMPhase2;
+-   SiS_Pr->SiS_PALNPhase2 = SiS300_PALNPhase2;
+-
+    SiS_Pr->SiS_StLCD1024x768Data    = (SiS_LCDDataStruct *)SiS300_StLCD1024x768Data;
+    SiS_Pr->SiS_ExtLCD1024x768Data   = (SiS_LCDDataStruct *)SiS300_ExtLCD1024x768Data;
+    SiS_Pr->SiS_St2LCD1024x768Data   = (SiS_LCDDataStruct *)SiS300_St2LCD1024x768Data;
+@@ -195,68 +320,18 @@ InitTo300Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_St2LCD1280x1024Data  = (SiS_LCDDataStruct *)SiS300_St2LCD1280x1024Data;
+    SiS_Pr->SiS_NoScaleData1024x768  = (SiS_LCDDataStruct *)SiS300_NoScaleData1024x768;
+    SiS_Pr->SiS_NoScaleData1280x1024 = (SiS_LCDDataStruct *)SiS300_NoScaleData1280x1024;
+-   SiS_Pr->SiS_LCD1280x960Data      = (SiS_LCDDataStruct *)SiS300_LCD1280x960Data;
+-   SiS_Pr->SiS_ExtLCD1400x1050Data  = (SiS_LCDDataStruct *)SiS300_ExtLCD1400x1050Data;
+-   SiS_Pr->SiS_ExtLCD1600x1200Data  = (SiS_LCDDataStruct *)SiS300_ExtLCD1600x1200Data;
+-   SiS_Pr->SiS_StLCD1400x1050Data   = (SiS_LCDDataStruct *)SiS300_StLCD1400x1050Data;
+-   SiS_Pr->SiS_StLCD1600x1200Data   = (SiS_LCDDataStruct *)SiS300_StLCD1600x1200Data;
+-   SiS_Pr->SiS_NoScaleData1400x1050 = (SiS_LCDDataStruct *)SiS300_NoScaleData1400x1050;
+-   SiS_Pr->SiS_NoScaleData1600x1200 = (SiS_LCDDataStruct *)SiS300_NoScaleData1600x1200;
+-
+-   SiS_Pr->SiS_StPALData   = (SiS_TVDataStruct *)SiS300_StPALData;
+-   SiS_Pr->SiS_ExtPALData  = (SiS_TVDataStruct *)SiS300_ExtPALData;
+-   SiS_Pr->SiS_StNTSCData  = (SiS_TVDataStruct *)SiS300_StNTSCData;
+-   SiS_Pr->SiS_ExtNTSCData = (SiS_TVDataStruct *)SiS300_ExtNTSCData;
+-/* SiS_Pr->SiS_St1HiTVData = (SiS_TVDataStruct *)SiS300_St1HiTVData;  */
+-   SiS_Pr->SiS_St2HiTVData = (SiS_TVDataStruct *)SiS300_St2HiTVData;
+-   SiS_Pr->SiS_ExtHiTVData = (SiS_TVDataStruct *)SiS300_ExtHiTVData;
+-
+-   SiS_Pr->SiS_NTSCTiming     = SiS300_NTSCTiming;
+-   SiS_Pr->SiS_PALTiming      = SiS300_PALTiming;
+-   SiS_Pr->SiS_HiTVSt1Timing  = SiS300_HiTVSt1Timing;
+-   SiS_Pr->SiS_HiTVSt2Timing  = SiS300_HiTVSt2Timing;
+-   SiS_Pr->SiS_HiTVTextTiming = SiS300_HiTVTextTiming;
+-   SiS_Pr->SiS_HiTVGroup3Data = SiS300_HiTVGroup3Data;
+-   SiS_Pr->SiS_HiTVGroup3Simu = SiS300_HiTVGroup3Simu;
+-   SiS_Pr->SiS_HiTVGroup3Text = SiS300_HiTVGroup3Text;
+ 
+    SiS_Pr->SiS_PanelDelayTbl     = (SiS_PanelDelayTblStruct *)SiS300_PanelDelayTbl;
+    SiS_Pr->SiS_PanelDelayTblLVDS = (SiS_PanelDelayTblStruct *)SiS300_PanelDelayTblLVDS;
+ 
+-   SiS_Pr->SiS_LVDS800x600Data_1   = (SiS_LVDSDataStruct *)SiS300_LVDS800x600Data_1;
+-   SiS_Pr->SiS_LVDS800x600Data_2   = (SiS_LVDSDataStruct *)SiS300_LVDS800x600Data_2;
+-   SiS_Pr->SiS_LVDS1024x768Data_1  = (SiS_LVDSDataStruct *)SiS300_LVDS1024x768Data_1;
+-   SiS_Pr->SiS_LVDS1024x768Data_2  = (SiS_LVDSDataStruct *)SiS300_LVDS1024x768Data_2;
+-   SiS_Pr->SiS_LVDS1280x1024Data_1 = (SiS_LVDSDataStruct *)SiS300_LVDS1280x1024Data_1;
+-   SiS_Pr->SiS_LVDS1280x1024Data_2 = (SiS_LVDSDataStruct *)SiS300_LVDS1280x1024Data_2;
+-   SiS_Pr->SiS_LVDS1280x960Data_1  = (SiS_LVDSDataStruct *)SiS300_LVDS1280x1024Data_1;
+-   SiS_Pr->SiS_LVDS1280x960Data_2  = (SiS_LVDSDataStruct *)SiS300_LVDS1280x1024Data_2;
+-   SiS_Pr->SiS_LVDS1400x1050Data_1 = (SiS_LVDSDataStruct *)SiS300_LVDS1400x1050Data_1;
+-   SiS_Pr->SiS_LVDS1400x1050Data_2 = (SiS_LVDSDataStruct *)SiS300_LVDS1400x1050Data_2;
+-   SiS_Pr->SiS_LVDS1600x1200Data_1 = (SiS_LVDSDataStruct *)SiS300_LVDS1600x1200Data_1;
+-   SiS_Pr->SiS_LVDS1600x1200Data_2 = (SiS_LVDSDataStruct *)SiS300_LVDS1600x1200Data_2;
+-   SiS_Pr->SiS_LVDS1280x768Data_1  = (SiS_LVDSDataStruct *)SiS300_LVDS1280x768Data_1;
+-   SiS_Pr->SiS_LVDS1280x768Data_2  = (SiS_LVDSDataStruct *)SiS300_LVDS1280x768Data_2;
+-   SiS_Pr->SiS_LVDS1024x600Data_1  = (SiS_LVDSDataStruct *)SiS300_LVDS1024x600Data_1;
+-   SiS_Pr->SiS_LVDS1024x600Data_2  = (SiS_LVDSDataStruct *)SiS300_LVDS1024x600Data_2;
+-   SiS_Pr->SiS_LVDS1152x768Data_1  = (SiS_LVDSDataStruct *)SiS300_LVDS1152x768Data_1;
+-   SiS_Pr->SiS_LVDS1152x768Data_2  = (SiS_LVDSDataStruct *)SiS300_LVDS1152x768Data_2;
+-   SiS_Pr->SiS_LVDSXXXxXXXData_1   = (SiS_LVDSDataStruct *)SiS300_LVDSXXXxXXXData_1;
+-   SiS_Pr->SiS_LVDS320x480Data_1   = (SiS_LVDSDataStruct *)SiS300_LVDS320x480Data_1;
+-   SiS_Pr->SiS_LVDS640x480Data_1   = (SiS_LVDSDataStruct *)SiS300_LVDS640x480Data_1;
+-   SiS_Pr->SiS_LCDA1400x1050Data_1 = (SiS_LVDSDataStruct *)SiS300_LCDA1400x1050Data_1;
+-   SiS_Pr->SiS_LCDA1400x1050Data_2 = (SiS_LVDSDataStruct *)SiS300_LCDA1400x1050Data_2;
+-   SiS_Pr->SiS_LCDA1600x1200Data_1 = (SiS_LVDSDataStruct *)SiS300_LCDA1600x1200Data_1;
+-   SiS_Pr->SiS_LCDA1600x1200Data_2 = (SiS_LVDSDataStruct *)SiS300_LCDA1600x1200Data_2;
+-   SiS_Pr->SiS_CHTVUNTSCData = (SiS_LVDSDataStruct *)SiS300_CHTVUNTSCData;
+-   SiS_Pr->SiS_CHTVONTSCData = (SiS_LVDSDataStruct *)SiS300_CHTVONTSCData;
+    SiS_Pr->SiS_CHTVUPALData  = (SiS_LVDSDataStruct *)SiS300_CHTVUPALData;
+    SiS_Pr->SiS_CHTVOPALData  = (SiS_LVDSDataStruct *)SiS300_CHTVOPALData;
+-   SiS_Pr->SiS_CHTVUPALMData = (SiS_LVDSDataStruct *)SiS300_CHTVUNTSCData; /* not supported on 300 series */
+-   SiS_Pr->SiS_CHTVOPALMData = (SiS_LVDSDataStruct *)SiS300_CHTVONTSCData; /* not supported on 300 series */
++   SiS_Pr->SiS_CHTVUPALMData = SiS_CHTVUNTSCData; 			   /* not supported on 300 series */
++   SiS_Pr->SiS_CHTVOPALMData = SiS_CHTVONTSCData; 			   /* not supported on 300 series */
+    SiS_Pr->SiS_CHTVUPALNData = (SiS_LVDSDataStruct *)SiS300_CHTVUPALData;  /* not supported on 300 series */
+    SiS_Pr->SiS_CHTVOPALNData = (SiS_LVDSDataStruct *)SiS300_CHTVOPALData;  /* not supported on 300 series */
+    SiS_Pr->SiS_CHTVSOPALData = (SiS_LVDSDataStruct *)SiS300_CHTVSOPALData;
++
+    SiS_Pr->SiS_PanelType00_1 = (SiS_LVDSDesStruct *)SiS300_PanelType00_1;
+    SiS_Pr->SiS_PanelType01_1 = (SiS_LVDSDesStruct *)SiS300_PanelType01_1;
+    SiS_Pr->SiS_PanelType02_1 = (SiS_LVDSDesStruct *)SiS300_PanelType02_1;
+@@ -289,32 +364,28 @@ InitTo300Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_PanelType0d_2 = (SiS_LVDSDesStruct *)SiS300_PanelType0d_2;
+    SiS_Pr->SiS_PanelType0e_2 = (SiS_LVDSDesStruct *)SiS300_PanelType0e_2;
+    SiS_Pr->SiS_PanelType0f_2 = (SiS_LVDSDesStruct *)SiS300_PanelType0f_2;
+-   SiS_Pr->SiS_PanelTypeNS_1 = (SiS_LVDSDesStruct *)SiS300_PanelTypeNS_1;
+-   SiS_Pr->SiS_PanelTypeNS_2 = (SiS_LVDSDesStruct *)SiS300_PanelTypeNS_2;
+-   SiS_Pr->SiS_CHTVUNTSCDesData = (SiS_LVDSDesStruct *)SiS300_CHTVUNTSCDesData;
+-   SiS_Pr->SiS_CHTVONTSCDesData = (SiS_LVDSDesStruct *)SiS300_CHTVONTSCDesData;
+-   SiS_Pr->SiS_CHTVUPALDesData  = (SiS_LVDSDesStruct *)SiS300_CHTVUPALDesData;
+-   SiS_Pr->SiS_CHTVOPALDesData  = (SiS_LVDSDesStruct *)SiS300_CHTVOPALDesData;
++
++   if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
++      SiS_Pr->SiS_PanelType04_1 = (SiS_LVDSDesStruct *)SiS300_PanelType04_1a;
++      SiS_Pr->SiS_PanelType04_2 = (SiS_LVDSDesStruct *)SiS300_PanelType04_2a;
++   }
++   if(SiS_Pr->SiS_CustomT == CUT_BARCO1024) {
++      SiS_Pr->SiS_PanelType04_1 = (SiS_LVDSDesStruct *)SiS300_PanelType04_1b;
++      SiS_Pr->SiS_PanelType04_2 = (SiS_LVDSDesStruct *)SiS300_PanelType04_2b;
++   }
++
+    SiS_Pr->SiS_LVDSCRT1800x600_1     = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT1800x600_1;
+    SiS_Pr->SiS_LVDSCRT11024x768_1    = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x768_1;
+    SiS_Pr->SiS_LVDSCRT11280x1024_1   = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11280x1024_1;
+-   SiS_Pr->SiS_LVDSCRT11024x600_1    = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x600_1;
+-   SiS_Pr->SiS_LVDSCRT11152x768_1    = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11152x768_1;
+    SiS_Pr->SiS_LVDSCRT1800x600_1_H   = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT1800x600_1_H;
+    SiS_Pr->SiS_LVDSCRT11024x768_1_H  = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x768_1_H;
+    SiS_Pr->SiS_LVDSCRT11280x1024_1_H = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11280x1024_1_H;
+-   SiS_Pr->SiS_LVDSCRT11024x600_1_H  = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x600_1_H;
+-   SiS_Pr->SiS_LVDSCRT11152x768_1_H  = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11152x768_1_H;
+    SiS_Pr->SiS_LVDSCRT1800x600_2     = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT1800x600_2;
+    SiS_Pr->SiS_LVDSCRT11024x768_2    = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x768_2;
+    SiS_Pr->SiS_LVDSCRT11280x1024_2   = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11280x1024_2;
+-   SiS_Pr->SiS_LVDSCRT11024x600_2    = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x600_2;
+-   SiS_Pr->SiS_LVDSCRT11152x768_2    = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11152x768_2;
+    SiS_Pr->SiS_LVDSCRT1800x600_2_H   = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT1800x600_2_H;
+    SiS_Pr->SiS_LVDSCRT11024x768_2_H  = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x768_2_H;
+    SiS_Pr->SiS_LVDSCRT11280x1024_2_H = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11280x1024_2_H;
+-   SiS_Pr->SiS_LVDSCRT11024x600_2_H  = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x600_2_H;
+-   SiS_Pr->SiS_LVDSCRT11152x768_2_H  = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11152x768_2_H;
+    SiS_Pr->SiS_CHTVCRT1UNTSC = (SiS_LVDSCRT1DataStruct *)SiS300_CHTVCRT1UNTSC;
+    SiS_Pr->SiS_CHTVCRT1ONTSC = (SiS_LVDSCRT1DataStruct *)SiS300_CHTVCRT1ONTSC;
+    SiS_Pr->SiS_CHTVCRT1UPAL  = (SiS_LVDSCRT1DataStruct *)SiS300_CHTVCRT1UPAL;
+@@ -339,7 +410,6 @@ InitTo300Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_CHTVVCLKOPALN = SiS300_CHTVVCLKOPAL;   /* not supported on 300 series */
+    SiS_Pr->SiS_CHTVVCLKSOPAL = SiS300_CHTVVCLKSOPAL;
+ 
+-   /* TW: New from 300/301LV BIOS */
+    SiS_Pr->SiS_CRT2Part2_1024x768_1  = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1024x768_1;
+    SiS_Pr->SiS_CRT2Part2_1280x1024_1 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1280x1024_1;
+    SiS_Pr->SiS_CRT2Part2_1400x1050_1 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1400x1050_1;
+@@ -353,7 +423,7 @@ InitTo300Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_CRT2Part2_1400x1050_3 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1400x1050_3;
+    SiS_Pr->SiS_CRT2Part2_1600x1200_3 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1600x1200_3;
+ 
+-   /* TW: LCDResInfo will on 300 series be translated to 310/325 series definitions */
++   /* TW: LCDResInfo will on 300 series be translated to 315 series definitions */
+    SiS_Pr->SiS_Panel320x480   = Panel_320x480;
+    SiS_Pr->SiS_Panel640x480   = Panel_640x480;
+    SiS_Pr->SiS_Panel800x600   = Panel_800x600;
+@@ -362,13 +432,17 @@ InitTo300Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_Panel1280x960  = Panel_1280x960;
+    SiS_Pr->SiS_Panel1024x600  = Panel_1024x600;
+    SiS_Pr->SiS_Panel1152x768  = Panel_1152x768;
+-   SiS_Pr->SiS_Panel1600x1200 = 16;  		/* TW: Something illegal */
+-   SiS_Pr->SiS_Panel1400x1050 = 16;  		/* TW: Something illegal */
+-   SiS_Pr->SiS_Panel1152x864  = 16;   		/* TW: Something illegal */
+-   SiS_Pr->SiS_Panel1280x768  = 16;   		/* TW: Something illegal */
++   SiS_Pr->SiS_Panel1280x768  = Panel_1280x768;
++   SiS_Pr->SiS_Panel1600x1200 = 255;  		/* TW: Something illegal */
++   SiS_Pr->SiS_Panel1400x1050 = 255;  		/* TW: Something illegal */
++   SiS_Pr->SiS_Panel640x480_2 = 255;  		/* TW: Something illegal */
++   SiS_Pr->SiS_Panel640x480_3 = 255;  		/* TW: Something illegal */
++   SiS_Pr->SiS_Panel1152x864  = 255;   		/* TW: Something illegal */
+    SiS_Pr->SiS_PanelMax       = Panel_320x480;     /* TW: highest value */
+    SiS_Pr->SiS_PanelMinLVDS   = Panel_800x600;     /* TW: Lowest value LVDS */
+    SiS_Pr->SiS_PanelMin301    = Panel_1024x768;    /* TW: lowest value 301 */
++   SiS_Pr->SiS_PanelCustom    = Panel_Custom;
++   SiS_Pr->SiS_PanelBarco1366 = Panel_Barco1366;
+ }
+ #endif
+ 
+@@ -376,29 +450,33 @@ InitTo300Pointer(SiS_Private *SiS_Pr, PS
+ static void
+ InitTo310Pointer(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
++   InitCommonPointer(SiS_Pr, HwDeviceExtension);
++
+    SiS_Pr->SiS_SModeIDTable  = (SiS_StStruct *)SiS310_SModeIDTable;
+-   SiS_Pr->SiS_StandTable    = (SiS_StandTableStruct *)SiS310_StandTable;
+    SiS_Pr->SiS_EModeIDTable  = (SiS_ExtStruct *)SiS310_EModeIDTable;
+    SiS_Pr->SiS_RefIndex      = (SiS_Ext2Struct *)SiS310_RefIndex;
+    SiS_Pr->SiS_CRT1Table     = (SiS_CRT1TableStruct *)SiS310_CRT1Table;
+    /* TW: MCLK is different */
+-   if(HwDeviceExtension->jChipType == SIS_330) {
++#ifdef LINUXBIOS
++   if(HwDeviceExtension->jChipType == SIS_660) {
++      SiS_Pr->SiS_MCLKData_0 = (SiS_MCLKDataStruct *)SiS310_MCLKData_0_660;  /* 660 */
++   } else if(HwDeviceExtension->jChipType == SIS_330) {
++#endif
+       SiS_Pr->SiS_MCLKData_0 = (SiS_MCLKDataStruct *)SiS310_MCLKData_0_330;  /* 330 */
++#ifdef LINUXBIOS
+    } else if(HwDeviceExtension->jChipType > SIS_315PRO) {
+       SiS_Pr->SiS_MCLKData_0 = (SiS_MCLKDataStruct *)SiS310_MCLKData_0_650;  /* 550, 650, 740 */
+    } else {
+       SiS_Pr->SiS_MCLKData_0 = (SiS_MCLKDataStruct *)SiS310_MCLKData_0_315;  /* 315 */
+    }
++#endif
+    SiS_Pr->SiS_MCLKData_1    = (SiS_MCLKDataStruct *)SiS310_MCLKData_1;
++#ifdef LINUXBIOS
+    SiS_Pr->SiS_ECLKData      = (SiS_ECLKDataStruct *)SiS310_ECLKData;
++#endif
+    SiS_Pr->SiS_VCLKData      = (SiS_VCLKDataStruct *)SiS310_VCLKData;
+    SiS_Pr->SiS_VBVCLKData    = (SiS_VBVCLKDataStruct *)SiS310_VBVCLKData;
+    SiS_Pr->SiS_ScreenOffset  = SiS310_ScreenOffset;
+-   SiS_Pr->SiS_StResInfo     = (SiS_StResInfoStruct *)SiS310_StResInfo;
+-   SiS_Pr->SiS_ModeResInfo   = (SiS_ModeResInfoStruct *)SiS310_ModeResInfo;
+-
+-   SiS_Pr->pSiS_OutputSelect = &SiS310_OutputSelect;
+-   SiS_Pr->pSiS_SoftSetting  = &SiS310_SoftSetting;
+ 
+    SiS_Pr->SiS_SR15  = SiS310_SR15;
+ 
+@@ -427,16 +505,6 @@ InitTo310Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->pSiS_YCSenseData2    = &SiS310_YCSenseData2;
+ #endif
+ 
+-   SiS_Pr->SiS_NTSCPhase    = SiS310_NTSCPhase;
+-   SiS_Pr->SiS_PALPhase     = SiS310_PALPhase;
+-   SiS_Pr->SiS_NTSCPhase2   = SiS310_NTSCPhase2;
+-   SiS_Pr->SiS_PALPhase2    = SiS310_PALPhase2;
+-   SiS_Pr->SiS_PALMPhase    = SiS310_PALMPhase;
+-   SiS_Pr->SiS_PALNPhase    = SiS310_PALNPhase;
+-   SiS_Pr->SiS_PALMPhase2   = SiS310_PALMPhase2;
+-   SiS_Pr->SiS_PALNPhase2   = SiS310_PALNPhase2;
+-   SiS_Pr->SiS_SpecialPhase = SiS310_SpecialPhase;
+-
+    SiS_Pr->SiS_StLCD1024x768Data    = (SiS_LCDDataStruct *)SiS310_StLCD1024x768Data;
+    SiS_Pr->SiS_ExtLCD1024x768Data   = (SiS_LCDDataStruct *)SiS310_ExtLCD1024x768Data;
+    SiS_Pr->SiS_St2LCD1024x768Data   = (SiS_LCDDataStruct *)SiS310_St2LCD1024x768Data;
+@@ -445,62 +513,10 @@ InitTo310Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_St2LCD1280x1024Data  = (SiS_LCDDataStruct *)SiS310_St2LCD1280x1024Data;
+    SiS_Pr->SiS_NoScaleData1024x768  = (SiS_LCDDataStruct *)SiS310_NoScaleData1024x768;
+    SiS_Pr->SiS_NoScaleData1280x1024 = (SiS_LCDDataStruct *)SiS310_NoScaleData1280x1024;
+-   SiS_Pr->SiS_LCD1280x960Data      = (SiS_LCDDataStruct *)SiS310_LCD1280x960Data;
+-   SiS_Pr->SiS_ExtLCD1400x1050Data  = (SiS_LCDDataStruct *)SiS310_ExtLCD1400x1050Data;
+-   SiS_Pr->SiS_ExtLCD1600x1200Data  = (SiS_LCDDataStruct *)SiS310_ExtLCD1600x1200Data;
+-   SiS_Pr->SiS_StLCD1400x1050Data   = (SiS_LCDDataStruct *)SiS310_StLCD1400x1050Data;
+-   SiS_Pr->SiS_StLCD1600x1200Data   = (SiS_LCDDataStruct *)SiS310_StLCD1600x1200Data;
+-   SiS_Pr->SiS_NoScaleData1400x1050 = (SiS_LCDDataStruct *)SiS310_NoScaleData1400x1050;
+-   SiS_Pr->SiS_NoScaleData1600x1200 = (SiS_LCDDataStruct *)SiS310_NoScaleData1600x1200;
+-
+-   SiS_Pr->SiS_StPALData   = (SiS_TVDataStruct *)SiS310_StPALData;
+-   SiS_Pr->SiS_ExtPALData  = (SiS_TVDataStruct *)SiS310_ExtPALData;
+-   SiS_Pr->SiS_StNTSCData  = (SiS_TVDataStruct *)SiS310_StNTSCData;
+-   SiS_Pr->SiS_ExtNTSCData = (SiS_TVDataStruct *)SiS310_ExtNTSCData;
+-/* SiS_Pr->SiS_St1HiTVData = (SiS_TVDataStruct *)SiS310_St1HiTVData;  */
+-   SiS_Pr->SiS_St2HiTVData = (SiS_TVDataStruct *)SiS310_St2HiTVData;
+-   SiS_Pr->SiS_ExtHiTVData = (SiS_TVDataStruct *)SiS310_ExtHiTVData;
+-
+-   SiS_Pr->SiS_NTSCTiming     = SiS310_NTSCTiming;
+-   SiS_Pr->SiS_PALTiming      = SiS310_PALTiming;
+-   SiS_Pr->SiS_HiTVSt1Timing  = SiS310_HiTVSt1Timing;
+-   SiS_Pr->SiS_HiTVSt2Timing  = SiS310_HiTVSt2Timing;
+-   SiS_Pr->SiS_HiTVTextTiming = SiS310_HiTVTextTiming;
+-   SiS_Pr->SiS_HiTVExtTiming  = SiS310_HiTVExtTiming;
+-   SiS_Pr->SiS_HiTVGroup3Data = SiS310_HiTVGroup3Data;
+-   SiS_Pr->SiS_HiTVGroup3Simu = SiS310_HiTVGroup3Simu;
+-   SiS_Pr->SiS_HiTVGroup3Text = SiS310_HiTVGroup3Text;
+ 
+-   SiS_Pr->SiS_PanelDelayTbl = (SiS_PanelDelayTblStruct *)SiS310_PanelDelayTbl;
++   SiS_Pr->SiS_PanelDelayTbl     = (SiS_PanelDelayTblStruct *)SiS310_PanelDelayTbl;
+    SiS_Pr->SiS_PanelDelayTblLVDS = (SiS_PanelDelayTblStruct *)SiS310_PanelDelayTblLVDS;
+ 
+-   SiS_Pr->SiS_LVDS800x600Data_1   = (SiS_LVDSDataStruct *)SiS310_LVDS800x600Data_1;
+-   SiS_Pr->SiS_LVDS800x600Data_2   = (SiS_LVDSDataStruct *)SiS310_LVDS800x600Data_2;
+-   SiS_Pr->SiS_LVDS1024x768Data_1  = (SiS_LVDSDataStruct *)SiS310_LVDS1024x768Data_1;
+-   SiS_Pr->SiS_LVDS1024x768Data_2  = (SiS_LVDSDataStruct *)SiS310_LVDS1024x768Data_2;
+-   SiS_Pr->SiS_LVDS1280x1024Data_1 = (SiS_LVDSDataStruct *)SiS310_LVDS1280x1024Data_1;
+-   SiS_Pr->SiS_LVDS1280x1024Data_2 = (SiS_LVDSDataStruct *)SiS310_LVDS1280x1024Data_2;
+-   SiS_Pr->SiS_LVDS1280x960Data_1  = (SiS_LVDSDataStruct *)SiS310_LVDS1280x960Data_1;
+-   SiS_Pr->SiS_LVDS1280x960Data_2  = (SiS_LVDSDataStruct *)SiS310_LVDS1280x960Data_2;
+-   SiS_Pr->SiS_LVDS1400x1050Data_1 = (SiS_LVDSDataStruct *)SiS310_LVDS1400x1050Data_1;
+-   SiS_Pr->SiS_LVDS1400x1050Data_2 = (SiS_LVDSDataStruct *)SiS310_LVDS1400x1050Data_2;
+-   SiS_Pr->SiS_LVDS1600x1200Data_1 = (SiS_LVDSDataStruct *)SiS310_LVDS1600x1200Data_1;
+-   SiS_Pr->SiS_LVDS1600x1200Data_2 = (SiS_LVDSDataStruct *)SiS310_LVDS1600x1200Data_2;
+-   SiS_Pr->SiS_LVDS1280x768Data_1  = (SiS_LVDSDataStruct *)SiS310_LVDS1280x768Data_1;
+-   SiS_Pr->SiS_LVDS1280x768Data_2  = (SiS_LVDSDataStruct *)SiS310_LVDS1280x768Data_2;
+-   SiS_Pr->SiS_LVDS1024x600Data_1  = (SiS_LVDSDataStruct *)SiS310_LVDS1024x600Data_1;
+-   SiS_Pr->SiS_LVDS1024x600Data_2  = (SiS_LVDSDataStruct *)SiS310_LVDS1024x600Data_2;
+-   SiS_Pr->SiS_LVDS1152x768Data_1  = (SiS_LVDSDataStruct *)SiS310_LVDS1152x768Data_1;
+-   SiS_Pr->SiS_LVDS1152x768Data_2  = (SiS_LVDSDataStruct *)SiS310_LVDS1152x768Data_2;
+-   SiS_Pr->SiS_LVDSXXXxXXXData_1   = (SiS_LVDSDataStruct *)SiS310_LVDSXXXxXXXData_1;
+-   SiS_Pr->SiS_LVDS320x480Data_1   = (SiS_LVDSDataStruct *)SiS310_LVDS320x480Data_1;
+-   SiS_Pr->SiS_LVDS640x480Data_1   = (SiS_LVDSDataStruct *)SiS310_LVDS640x480Data_1;
+-   SiS_Pr->SiS_LCDA1400x1050Data_1  = (SiS_LVDSDataStruct *)SiS310_LCDA1400x1050Data_1;
+-   SiS_Pr->SiS_LCDA1400x1050Data_2  = (SiS_LVDSDataStruct *)SiS310_LCDA1400x1050Data_2;
+-   SiS_Pr->SiS_LCDA1600x1200Data_1  = (SiS_LVDSDataStruct *)SiS310_LCDA1600x1200Data_1;
+-   SiS_Pr->SiS_LCDA1600x1200Data_2  = (SiS_LVDSDataStruct *)SiS310_LCDA1600x1200Data_2;
+-   SiS_Pr->SiS_CHTVUNTSCData = (SiS_LVDSDataStruct *)SiS310_CHTVUNTSCData;
+-   SiS_Pr->SiS_CHTVONTSCData = (SiS_LVDSDataStruct *)SiS310_CHTVONTSCData;
+    SiS_Pr->SiS_CHTVUPALData  = (SiS_LVDSDataStruct *)SiS310_CHTVUPALData;
+    SiS_Pr->SiS_CHTVOPALData  = (SiS_LVDSDataStruct *)SiS310_CHTVOPALData;
+    SiS_Pr->SiS_CHTVUPALMData = (SiS_LVDSDataStruct *)SiS310_CHTVUPALMData;
+@@ -508,6 +524,7 @@ InitTo310Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_CHTVUPALNData = (SiS_LVDSDataStruct *)SiS310_CHTVUPALNData;
+    SiS_Pr->SiS_CHTVOPALNData = (SiS_LVDSDataStruct *)SiS310_CHTVOPALNData;
+    SiS_Pr->SiS_CHTVSOPALData = (SiS_LVDSDataStruct *)SiS310_CHTVSOPALData;
++
+    SiS_Pr->SiS_PanelType00_1 = (SiS_LVDSDesStruct *)SiS310_PanelType00_1;
+    SiS_Pr->SiS_PanelType01_1 = (SiS_LVDSDesStruct *)SiS310_PanelType01_1;
+    SiS_Pr->SiS_PanelType02_1 = (SiS_LVDSDesStruct *)SiS310_PanelType02_1;
+@@ -540,19 +557,7 @@ InitTo310Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_PanelType0d_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0d_2;
+    SiS_Pr->SiS_PanelType0e_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0e_2;
+    SiS_Pr->SiS_PanelType0f_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0f_2;
+-   SiS_Pr->SiS_PanelTypeNS_1 = (SiS_LVDSDesStruct *)SiS310_PanelTypeNS_1;
+-   SiS_Pr->SiS_PanelTypeNS_2 = (SiS_LVDSDesStruct *)SiS310_PanelTypeNS_2;
+-
+-   SiS_Pr->LVDS1024x768Des_1  = (SiS_LVDSDesStruct *)SiS310_PanelType1076_1;
+-   SiS_Pr->LVDS1280x1024Des_1 = (SiS_LVDSDesStruct *)SiS310_PanelType1210_1;
+-   SiS_Pr->LVDS1400x1050Des_1 = (SiS_LVDSDesStruct *)SiS310_PanelType1296_1 ;
+-   SiS_Pr->LVDS1600x1200Des_1 = (SiS_LVDSDesStruct *)SiS310_PanelType1600_1 ;
+-   SiS_Pr->LVDS1024x768Des_2  = (SiS_LVDSDesStruct *)SiS310_PanelType1076_2;
+-   SiS_Pr->LVDS1280x1024Des_2 = (SiS_LVDSDesStruct *)SiS310_PanelType1210_2;
+-   SiS_Pr->LVDS1400x1050Des_2 = (SiS_LVDSDesStruct *)SiS310_PanelType1296_2;
+-   SiS_Pr->LVDS1600x1200Des_2 = (SiS_LVDSDesStruct *)SiS310_PanelType1600_2 ;
+ 
+-   /* TW: New from 650/301LV BIOS */
+    SiS_Pr->SiS_CRT2Part2_1024x768_1  = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1024x768_1;
+    SiS_Pr->SiS_CRT2Part2_1280x1024_1 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1280x1024_1;
+    SiS_Pr->SiS_CRT2Part2_1400x1050_1 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1400x1050_1;
+@@ -566,51 +571,32 @@ InitTo310Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_CRT2Part2_1400x1050_3 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1400x1050_3;
+    SiS_Pr->SiS_CRT2Part2_1600x1200_3 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1600x1200_3;
+ 
+-   SiS_Pr->SiS_CHTVUNTSCDesData = (SiS_LVDSDesStruct *)SiS310_CHTVUNTSCDesData;
+-   SiS_Pr->SiS_CHTVONTSCDesData = (SiS_LVDSDesStruct *)SiS310_CHTVONTSCDesData;
+-   SiS_Pr->SiS_CHTVUPALDesData  = (SiS_LVDSDesStruct *)SiS310_CHTVUPALDesData;
+-   SiS_Pr->SiS_CHTVOPALDesData  = (SiS_LVDSDesStruct *)SiS310_CHTVOPALDesData;
+-
+    SiS_Pr->SiS_LVDSCRT1800x600_1     = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_1;
+    SiS_Pr->SiS_LVDSCRT11024x768_1    = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_1;
+    SiS_Pr->SiS_LVDSCRT11280x1024_1   = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_1;
+    SiS_Pr->SiS_LVDSCRT11400x1050_1   = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_1;
+-   SiS_Pr->SiS_LVDSCRT11280x768_1    = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x768_1;
+-   SiS_Pr->SiS_LVDSCRT11024x600_1    = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x600_1;
+-   SiS_Pr->SiS_LVDSCRT11152x768_1    = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11152x768_1;
+    SiS_Pr->SiS_LVDSCRT11600x1200_1   = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_1;
+    SiS_Pr->SiS_LVDSCRT1800x600_1_H   = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_1_H;
+    SiS_Pr->SiS_LVDSCRT11024x768_1_H  = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_1_H;
+    SiS_Pr->SiS_LVDSCRT11280x1024_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_1_H;
+    SiS_Pr->SiS_LVDSCRT11400x1050_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_1_H;
+-   SiS_Pr->SiS_LVDSCRT11280x768_1_H  = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x768_1_H;
+-   SiS_Pr->SiS_LVDSCRT11024x600_1_H  = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x600_1_H;
+-   SiS_Pr->SiS_LVDSCRT11152x768_1_H  = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11152x768_1_H;
+    SiS_Pr->SiS_LVDSCRT11600x1200_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_1_H;
+    SiS_Pr->SiS_LVDSCRT1800x600_2     = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_2;
+    SiS_Pr->SiS_LVDSCRT11024x768_2    = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_2;
+    SiS_Pr->SiS_LVDSCRT11280x1024_2   = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_2;
+    SiS_Pr->SiS_LVDSCRT11400x1050_2   = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_2;
+-   SiS_Pr->SiS_LVDSCRT11280x768_2    = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x768_2;
+-   SiS_Pr->SiS_LVDSCRT11024x600_2    = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x600_2;
+-   SiS_Pr->SiS_LVDSCRT11152x768_2    = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11152x768_2;
+    SiS_Pr->SiS_LVDSCRT11600x1200_2   = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_2;
+    SiS_Pr->SiS_LVDSCRT1800x600_2_H   = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_2_H;
+    SiS_Pr->SiS_LVDSCRT11024x768_2_H  = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_2_H;
+    SiS_Pr->SiS_LVDSCRT11280x1024_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_2_H;
+    SiS_Pr->SiS_LVDSCRT11400x1050_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_2_H;
+-   SiS_Pr->SiS_LVDSCRT11280x768_2_H  = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x768_2_H;
+-   SiS_Pr->SiS_LVDSCRT11024x600_2_H  = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x600_2_H;
+-   SiS_Pr->SiS_LVDSCRT11152x768_2_H  = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11152x768_2_H;
+    SiS_Pr->SiS_LVDSCRT11600x1200_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_2_H;
+-   SiS_Pr->SiS_LVDSCRT1XXXxXXX_1     = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1XXXxXXX_1;
+-   SiS_Pr->SiS_LVDSCRT1XXXxXXX_1_H   = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1XXXxXXX_1_H;
+-   SiS_Pr->SiS_LVDSCRT1320x480_1     = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1320x480_1;
+-   SiS_Pr->SiS_CHTVCRT1UNTSC = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1UNTSC;
+-   SiS_Pr->SiS_CHTVCRT1ONTSC = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1ONTSC;
+-   SiS_Pr->SiS_CHTVCRT1UPAL  = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1UPAL;
+-   SiS_Pr->SiS_CHTVCRT1OPAL  = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1OPAL;
+-   SiS_Pr->SiS_CHTVCRT1SOPAL = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1SOPAL;
++   SiS_Pr->SiS_CHTVCRT1UNTSC         = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1UNTSC;
++   SiS_Pr->SiS_CHTVCRT1ONTSC         = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1ONTSC;
++   SiS_Pr->SiS_CHTVCRT1UPAL          = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1UPAL;
++   SiS_Pr->SiS_CHTVCRT1OPAL          = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1OPAL;
++   SiS_Pr->SiS_CHTVCRT1SOPAL         = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1SOPAL;
++
+    SiS_Pr->SiS_CHTVReg_UNTSC = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_UNTSC;
+    SiS_Pr->SiS_CHTVReg_ONTSC = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_ONTSC;
+    SiS_Pr->SiS_CHTVReg_UPAL  = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_UPAL;
+@@ -620,6 +606,7 @@ InitTo310Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_CHTVReg_UPALN = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_UPALN;
+    SiS_Pr->SiS_CHTVReg_OPALN = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_OPALN;
+    SiS_Pr->SiS_CHTVReg_SOPAL = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_SOPAL;
++
+    SiS_Pr->SiS_LCDACRT1800x600_1     = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT1800x600_1;
+    SiS_Pr->SiS_LCDACRT11024x768_1    = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11024x768_1;
+    SiS_Pr->SiS_LCDACRT11280x1024_1   = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11280x1024_1;
+@@ -640,6 +627,7 @@ InitTo310Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_LCDACRT11280x1024_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11280x1024_2_H;
+    SiS_Pr->SiS_LCDACRT11400x1050_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11400x1050_2_H;
+    SiS_Pr->SiS_LCDACRT11600x1200_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11600x1200_2_H;
++
+    SiS_Pr->SiS_CHTVVCLKUNTSC = SiS310_CHTVVCLKUNTSC;
+    SiS_Pr->SiS_CHTVVCLKONTSC = SiS310_CHTVVCLKONTSC;
+    SiS_Pr->SiS_CHTVVCLKUPAL  = SiS310_CHTVVCLKUPAL;
+@@ -662,9 +650,13 @@ InitTo310Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_Panel1152x864  = Panel_1152x864;
+    SiS_Pr->SiS_Panel1280x768  = Panel_1280x768;
+    SiS_Pr->SiS_Panel1024x600  = Panel_1024x600;
++   SiS_Pr->SiS_Panel640x480_2 = Panel_640x480_2;
++   SiS_Pr->SiS_Panel640x480_3 = Panel_640x480_3;
+    SiS_Pr->SiS_PanelMax       = Panel_320x480;    /* TW: highest value */
+    SiS_Pr->SiS_PanelMinLVDS   = Panel_800x600;    /* TW: lowest value LVDS/LCDA */
+    SiS_Pr->SiS_PanelMin301    = Panel_1024x768;   /* TW: lowest value 301 */
++   SiS_Pr->SiS_PanelCustom    = Panel_Custom;
++   SiS_Pr->SiS_PanelBarco1366 = 255;
+ }
+ #endif
+ 
+@@ -727,7 +719,8 @@ SiSInit(SiS_Private *SiS_Pr, PSIS_HW_DEV
+       (HwDeviceExtension->jChipType == SIS_550) ||
+       (HwDeviceExtension->jChipType == SIS_650) ||
+       (HwDeviceExtension->jChipType == SIS_740) ||
+-      (HwDeviceExtension->jChipType == SIS_330))
++      (HwDeviceExtension->jChipType == SIS_330) ||
++      (HwDeviceExtension->jChipType == SIS_660))
+      InitTo310Pointer(SiS_Pr, HwDeviceExtension);
+ #endif
+ 
+@@ -896,7 +889,8 @@ SiSInit(SiS_Private *SiS_Pr, PSIS_HW_DEV
+       (HwDeviceExtension->jChipType == SIS_550) ||
+       (HwDeviceExtension->jChipType == SIS_650) ||
+       (HwDeviceExtension->jChipType == SIS_740) ||
+-      (HwDeviceExtension->jChipType == SIS_330)) {
++      (HwDeviceExtension->jChipType == SIS_330) ||
++      (HwDeviceExtension->jChipType == SIS_660)) {
+    	for(i=0x12; i<=0x1B; i++) SiS_SetReg1(SiS_Pr->SiS_P3c4,i,0);
+    	for(i=0x79; i<=0x7C; i++) SiS_SetReg1(SiS_Pr->SiS_P3d4,i,0);
+    }
+@@ -953,14 +947,15 @@ SiSInit(SiS_Private *SiS_Pr, PSIS_HW_DEV
+    if((HwDeviceExtension->jChipType == SIS_315H)   ||
+       (HwDeviceExtension->jChipType == SIS_315)    ||
+       (HwDeviceExtension->jChipType == SIS_315PRO) ||
+-      (HwDeviceExtension->jChipType == SIS_330) ) {
++      (HwDeviceExtension->jChipType == SIS_330)) {
+       	if((*SiS_Pr->pSiS_SoftSetting & SoftDRAMType) == 0) {
+           	temp = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x3A) & 0x03;
+         }
+    }
+    if((HwDeviceExtension->jChipType == SIS_550) ||
+       (HwDeviceExtension->jChipType == SIS_740) ||
+-      (HwDeviceExtension->jChipType == SIS_650)) {
++      (HwDeviceExtension->jChipType == SIS_650) ||
++      (HwDeviceExtension->jChipType == SIS_660)) {
+         if((*SiS_Pr->pSiS_SoftSetting & SoftDRAMType) == 0) {
+           	temp = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x07;
+         }
+@@ -977,7 +972,7 @@ SiSInit(SiS_Private *SiS_Pr, PSIS_HW_DEV
+    if((HwDeviceExtension->jChipType != SIS_540) &&
+       (HwDeviceExtension->jChipType != SIS_630) &&
+       (HwDeviceExtension->jChipType != SIS_730)){
+-     	for(i=0x15;i<0x1C;i++) {
++     	for(i=0x15; i<0x1C; i++) {
+        	    SiS_SetReg1(SiS_Pr->SiS_P3c4,i,SiS_Pr->SiS_SR15[i-0x15][SiS_Pr->SiS_RAMType]);
+      	}
+    }
+@@ -1023,7 +1018,8 @@ SiSInit(SiS_Private *SiS_Pr, PSIS_HW_DEV
+       (HwDeviceExtension->jChipType == SIS_550) ||
+       (HwDeviceExtension->jChipType == SIS_650) ||
+       (HwDeviceExtension->jChipType == SIS_740) ||
+-      (HwDeviceExtension->jChipType == SIS_330))
++      (HwDeviceExtension->jChipType == SIS_330) ||
++      (HwDeviceExtension->jChipType == SIS_660))
+      	SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2E,0x08);    /* use VB */
+ #endif
+ 
+@@ -1180,7 +1176,8 @@ SiS_Set_LVDS_TRUMPION(SiS_Private *SiS_P
+ #ifdef SIS315H
+   if((HwDeviceExtension->jChipType == SIS_650) ||
+      (HwDeviceExtension->jChipType == SIS_740) ||
+-     (HwDeviceExtension->jChipType == SIS_330)) {
++     (HwDeviceExtension->jChipType == SIS_330) ||
++     (HwDeviceExtension->jChipType == SIS_660)) {
+ #if 0 /* TW: This is not required */
+         /* TW: Read POWER_ON_TRAP and copy to CR37 */
+     	temp = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1A);
+@@ -1299,7 +1296,7 @@ SiS_ChkBUSWidth_300(SiS_Private *SiS_Pr,
+ #endif
+ /* ===============  SiS 300 dram sizing end    =============== */
+ 
+-/* ============  SiS 310/325 dram sizing begin  ============== */
++/* ============  SiS 315 dram sizing begin  ============== */
+ #ifdef SIS315H
+ 
+ /* TW: Moved Get310DRAMType further down */
+@@ -1893,8 +1890,7 @@ SiS_Get310DRAMType(SiS_Private *SiS_Pr, 
+    if(*SiS_Pr->pSiS_SoftSetting & SoftDRAMType) {
+      data = *SiS_Pr->pSiS_SoftSetting & 0x03;
+    } else {
+-     if((HwDeviceExtension->jChipType > SIS_315PRO) &&
+-        (HwDeviceExtension->jChipType < SIS_330)) {
++     if(IS_SIS550650740660) {
+         data = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x07;
+      } else {	/* TW: 315, 330 */
+         data = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x3a) & 0x03;
+@@ -1934,13 +1930,17 @@ void SiSRegInit(SiS_Private *SiS_Pr, USH
+    SiS_Pr->SiS_P3c7 = BaseAddr + 0x17;
+    SiS_Pr->SiS_P3c8 = BaseAddr + 0x18;
+    SiS_Pr->SiS_P3c9 = BaseAddr + 0x19;
+-   SiS_Pr->SiS_P3da = BaseAddr + 0x2A;
+-   SiS_Pr->SiS_Part1Port = BaseAddr + SIS_CRT2_PORT_04;   /* Digital video interface registers (LCD) */
+-   SiS_Pr->SiS_Part2Port = BaseAddr + SIS_CRT2_PORT_10;   /* 301 TV Encoder registers */
+-   SiS_Pr->SiS_Part3Port = BaseAddr + SIS_CRT2_PORT_12;   /* 301 Macrovision registers */
+-   SiS_Pr->SiS_Part4Port = BaseAddr + SIS_CRT2_PORT_14;   /* 301 VGA2 (and LCD) registers */
+-   SiS_Pr->SiS_Part5Port = BaseAddr + SIS_CRT2_PORT_14+2; /* 301 palette address port registers */
+-   SiS_Pr->SiS_DDC_Port = BaseAddr + 0x14;                /* DDC Port ( = P3C4, SR11/0A) */
++   SiS_Pr->SiS_P3cb = BaseAddr + 0x1b;
++   SiS_Pr->SiS_P3cd = BaseAddr + 0x1d;
++   SiS_Pr->SiS_P3da = BaseAddr + 0x2a;
++   SiS_Pr->SiS_Part1Port = BaseAddr + SIS_CRT2_PORT_04;     /* Digital video interface registers (LCD) */
++   SiS_Pr->SiS_Part2Port = BaseAddr + SIS_CRT2_PORT_10;     /* 301 TV Encoder registers */
++   SiS_Pr->SiS_Part3Port = BaseAddr + SIS_CRT2_PORT_12;     /* 301 Macrovision registers */
++   SiS_Pr->SiS_Part4Port = BaseAddr + SIS_CRT2_PORT_14;     /* 301 VGA2 (and LCD) registers */
++   SiS_Pr->SiS_Part5Port = BaseAddr + SIS_CRT2_PORT_14 + 2; /* 301 palette address port registers */
++   SiS_Pr->SiS_DDC_Port = BaseAddr + 0x14;                  /* DDC Port ( = P3C4, SR11/0A) */
++   SiS_Pr->SiS_VidCapt = BaseAddr + SIS_VIDEO_CAPTURE;
++   SiS_Pr->SiS_VidPlay = BaseAddr + SIS_VIDEO_PLAYBACK;
+ }
+ 
+ void
+@@ -1965,7 +1965,8 @@ SiSInitPCIetc(SiS_Private *SiS_Pr, PSIS_
+       (HwDeviceExtension->jChipType == SIS_550) ||
+       (HwDeviceExtension->jChipType == SIS_650) ||
+       (HwDeviceExtension->jChipType == SIS_740) ||
+-      (HwDeviceExtension->jChipType == SIS_330)) {
++      (HwDeviceExtension->jChipType == SIS_330) ||
++      (HwDeviceExtension->jChipType == SIS_660)) {
+       /* TW: This seems to be done the same way on these chipsets */
+       SiS_SetReg1(SiS_Pr->SiS_P3c4,0x20,0xa1);
+       SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x1E,0xFF,0x5A);
+@@ -1987,10 +1988,14 @@ SiSSetLVDSetc(SiS_Private *SiS_Pr, PSIS_
+ 
+    SiS_Pr->SiS_ChrontelInit = 0;
+ 
+-   if((ModeNo == 0x5a) || (ModeNo == 0x5b)) {
+-   	SiS_Pr->SiS_IF_DEF_DSTN = 1;   /* for 550 dstn */
+-   	SiS_Pr->SiS_IF_DEF_FSTN = 1;   /* for fstn */
++#if 0
++   if(HwDeviceExtension->jChipType >= SIS_315H) {
++      if((ModeNo == 0x5a) || (ModeNo == 0x5b)) {
++   	 SiS_Pr->SiS_IF_DEF_DSTN = 1;   /* for 550 dstn */
++   	 SiS_Pr->SiS_IF_DEF_FSTN = 1;   /* for fstn */
++      }
+    }
++#endif
+ 
+ #ifdef SIS300
+    if((HwDeviceExtension->jChipType == SIS_540) ||
+@@ -2015,11 +2020,14 @@ SiSSetLVDSetc(SiS_Private *SiS_Pr, PSIS_
+    if((HwDeviceExtension->jChipType == SIS_550) ||
+       (HwDeviceExtension->jChipType == SIS_650) ||
+       (HwDeviceExtension->jChipType == SIS_740) ||
+-      (HwDeviceExtension->jChipType == SIS_330))
++      (HwDeviceExtension->jChipType == SIS_330) ||
++      (HwDeviceExtension->jChipType == SIS_660))
+     {
+-        /* TW: CR37 is different on 310/325 series */
++        /* TW: CR37 is different on 315 series */
++#if 0
+         if(SiS_Pr->SiS_IF_DEF_FSTN)                       /* fstn: set CR37=0x04 */
+              SiS_SetReg1(SiS_Pr->SiS_P3d4,0x37,0x04);      /* (fake LVDS bridge) */
++#endif
+ 
+ 	temp=SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37);
+       	temp = (temp & 0x0E) >> 1;
+@@ -2044,7 +2052,8 @@ SiSInitPtr(SiS_Private *SiS_Pr, PSIS_HW_
+       (HwDeviceExtension->jChipType == SIS_550) ||
+       (HwDeviceExtension->jChipType == SIS_650) ||
+       (HwDeviceExtension->jChipType == SIS_740) ||
+-      (HwDeviceExtension->jChipType == SIS_330))
++      (HwDeviceExtension->jChipType == SIS_330) ||
++      (HwDeviceExtension->jChipType == SIS_660))
+      InitTo310Pointer(SiS_Pr, HwDeviceExtension);
+ #endif
+ 
+@@ -2073,14 +2082,21 @@ SiSDetermineROMUsage(SiS_Private *SiS_Pr
+ 	      SiS_Pr->SiS_UseROM = TRUE;
+ 	 else SiS_Pr->SiS_UseROM = FALSE;
+      } else if(HwDeviceExtension->jChipType < SIS_315H) {
++#if 0
+         /* TW: Rest of 300 series: We don't use the ROM image if
+ 	 *     the BIOS version < 2.0.0 as such old BIOSes don't
+ 	 *     have the needed data at the expected locations.
+ 	 */
+         if(ROMAddr[0x06] < '2')  SiS_Pr->SiS_UseROM = FALSE;
+ 	else                     SiS_Pr->SiS_UseROM = TRUE;
++#else
++	/* Sony's VAIO BIOS 1.09 follows the standard, so perhaps
++	 * the others do as well
++	 */
++	SiS_Pr->SiS_UseROM = TRUE;
++#endif
+      } else {
+-        /* TW: 310/325/330 series stick to the standard */
++        /* TW: 315/330 series stick to the standard */
+ 	SiS_Pr->SiS_UseROM = TRUE;
+      }
+    } else SiS_Pr->SiS_UseROM = FALSE;
+@@ -2104,24 +2120,27 @@ SiSBIOSSetMode(SiS_Private *SiS_Pr, PSIS
+    SiS_Pr->UseCustomMode = FALSE;
+ 
+    if((IsCustom) && (SiS_CheckBuildCustomMode(pScrn, mode, pSiS->VBFlags))) {
+-   
+-         xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting custom mode %dx%d\n", 
+-	 	SiS_Pr->CHDisplay, SiS_Pr->CVDisplay);
+-		
++
++         xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting custom mode %dx%d\n",
++	 	SiS_Pr->CHDisplay,
++		(mode->Flags & V_INTERLACE ? SiS_Pr->CVDisplay * 2 :
++		   (mode->Flags & V_DBLSCAN ? SiS_Pr->CVDisplay / 2 :
++		      SiS_Pr->CVDisplay)));
++
+ 	 return(SiSSetMode(SiS_Pr, HwDeviceExtension, pScrn, ModeNo, TRUE));
+-   
++
+    }
+-   
+-   ModeNo = SiS_CalcModeIndex(pScrn, mode);
++
++   ModeNo = SiS_CalcModeIndex(pScrn, mode, pSiS->HaveCustomModes);
+    if(!ModeNo) return FALSE;
+ 
+-   xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting mode 0x%x\n", ModeNo);
++   xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting standard mode 0x%x\n", ModeNo);
+ 
+    return(SiSSetMode(SiS_Pr, HwDeviceExtension, pScrn, ModeNo, TRUE));   
+ }
+ 
+ #ifdef SISDUALHEAD
+-/* TW: Set CRT1 mode (used for dual head) */
++/* TW: Set CRT1 mode (used for dual head and MergedFB) */
+ BOOLEAN
+ SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, ScrnInfoPtr pScrn,
+                DisplayModePtr mode, BOOLEAN IsCustom)
+@@ -2134,31 +2153,37 @@ SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, 
+    SISEntPtr pSiSEnt = pSiS->entityPrivate;
+    unsigned char backupreg=0;
+    BOOLEAN backupcustom;
+-
+    UShort  ModeNo=0;
+    
+    SiS_Pr->UseCustomMode = FALSE;
+-   
++
+    if((IsCustom) && (SiS_CheckBuildCustomMode(pScrn, mode, pSiS->VBFlags))) {
+-   
++
++         USHORT temptemp = SiS_Pr->CVDisplay;
++
++         if(SiS_Pr->CModeFlag & DoubleScanMode)     temptemp >>= 1;
++         else if(SiS_Pr->CInfoFlag & InterlaceMode) temptemp <<= 1;
++
+          xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
+-	 	"Setting custom mode %dx%d in CRT1\n", 
+-	 	SiS_Pr->CHDisplay, SiS_Pr->CVDisplay);
++	 	"Setting custom mode %dx%d on CRT1\n",
++	 	SiS_Pr->CHDisplay, temptemp);
+ 	 ModeNo = 0xfe;
+-	 
++
+    } else {
+ 
+-         ModeNo = SiS_CalcModeIndex(pScrn, mode);
++         ModeNo = SiS_CalcModeIndex(pScrn, mode, pSiS->HaveCustomModes);
+          if(!ModeNo) return FALSE;
+ 
+          xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
+-	 	"Setting mode 0x%x on CRT1\n", ModeNo);
++	 	"Setting standard mode 0x%x on CRT1\n", ModeNo);
+    }
+ 
+    SiSInitPtr(SiS_Pr, HwDeviceExtension);
+ 
+    SiSRegInit(SiS_Pr, BaseAddr);
+ 
++   SiS_GetSysFlags(SiS_Pr, HwDeviceExtension);
++
+    SiS_Pr->SiS_VGAINFO = SiS_GetSetBIOSScratch(pScrn, 0x489, 0xff);
+ 
+    SiSInitPCIetc(SiS_Pr, HwDeviceExtension);
+@@ -2167,7 +2192,7 @@ SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, 
+ 
+    SiSDetermineROMUsage(SiS_Pr, HwDeviceExtension, ROMAddr);
+ 
+-   /* TW: We don't clear the buffer under X */
++   /* We don't clear the buffer under X */
+    SiS_Pr->SiS_flag_clearbuffer = 0;
+ 
+    /* 1.Openkey */
+@@ -2175,8 +2200,8 @@ SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, 
+ 
+    SiS_UnLockCRT2(SiS_Pr, HwDeviceExtension, BaseAddr);
+ 
++   /* 2.Get ModeID Table  */
+    if(!SiS_Pr->UseCustomMode) {
+-      /* 2.Get ModeID Table  */
+       temp = SiS_SearchModeID(SiS_Pr, ROMAddr,&ModeNo,&ModeIdIndex);
+       if(temp == 0)  return(0);
+    } else {
+@@ -2201,53 +2226,65 @@ SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, 
+    SiS_GetLCDResInfo(SiS_Pr, ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension);
+ 
+    if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+-         if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x08)  {
++      if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x08)  {
++         if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+             if(ModeNo != 0x10)  SiS_Pr->SiS_SetFlag |= SetDOSMode;
++         } else if((IS_SIS651) && (SiS_Pr->SiS_VBType & VB_NoLCD)) {
++            SiS_Pr->SiS_SetFlag |= SetDOSMode;
+          }
+       }
+ 
+-      /* TW: New from 650/LV 1.10.6x */
+       if(IS_SIS650) {
+-          if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-	      SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x51,0x1f);
+-	      SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x56,0xe7);
+-	  }
++         if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++	    SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x51,0x1f);
++	    if(IS_SIS651) SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x51,0x20);
++	    SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x56,0xe7);
++	 }
+       }
+    }
+ 
+-   /* TW: Set mode on CRT1 */
++   /* Set mode on CRT1 */
+    SiS_SetCRT1Group(SiS_Pr, ROMAddr,HwDeviceExtension,ModeNo,ModeIdIndex,BaseAddr);
+ 
+-   pSiSEnt->CRT1ModeNo = ModeNo;
+-   pSiSEnt->CRT1DMode = mode;
+-
+-   /* TW: SetPitch: Adapt to virtual size & position */
++   /* SetPitch: Adapt to virtual size & position */
+    SiS_SetPitchCRT1(SiS_Pr, pScrn, BaseAddr);
+ 
++   if(pSiS->DualHeadMode) {
++      pSiSEnt->CRT1ModeNo = ModeNo;
++      pSiSEnt->CRT1DMode = mode;
++   }
++
++   if(SiS_Pr->UseCustomMode) {
++      SiS_Pr->CRT1UsesCustomMode = TRUE;
++      SiS_Pr->CSRClock_CRT1 = SiS_Pr->CSRClock;
++      SiS_Pr->CModeFlag_CRT1 = SiS_Pr->CModeFlag;
++   } else {
++      SiS_Pr->CRT1UsesCustomMode = FALSE;
++   }
++
+    /* We have to reset CRT2 if changing mode on CRT1 */
+-   if(pSiSEnt->CRT2ModeNo != -1) {
+-        xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
+-				"(Re-)Setting mode 0x%x on CRT2\n",
+-				pSiSEnt->CRT2ModeNo);
+-	backupcustom = SiS_Pr->UseCustomMode;
+-	if(SiS_Pr->UseCustomMode) {
+-	   SiS_Pr->CRT1UsesCustomMode = TRUE;
+-	} else {
+-	   SiS_Pr->CRT1UsesCustomMode = FALSE;
+-	}
+-	SiSBIOSSetModeCRT2(SiS_Pr, HwDeviceExtension, pSiSEnt->pScrn_1,
+-				pSiSEnt->CRT2DMode);
+-	SiS_Pr->UseCustomMode = backupcustom;
+-	SiS_Pr->CRT1UsesCustomMode = FALSE;
++   if(pSiS->DualHeadMode) {
++      if(pSiSEnt->CRT2ModeNo != -1) {
++         xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
++				"(Re-)Setting mode for CRT2\n");
++	 backupcustom = SiS_Pr->UseCustomMode;
++	 SiSBIOSSetModeCRT2(SiS_Pr, HwDeviceExtension, pSiSEnt->pScrn_1,
++			    pSiSEnt->CRT2DMode, pSiSEnt->CRT2IsCustom);
++	 SiS_Pr->UseCustomMode = backupcustom;
++      }
+    }
+-   
++
++   /* Warning: From here, the custom mode entries in SiS_Pr are
++    * possibly overwritten
++    */
++
+    SiS_HandleCRT1(SiS_Pr);
+ 
++   SiS_StrangeStuff(SiS_Pr, HwDeviceExtension);
++
+    SiS_DisplayOn(SiS_Pr);
+    SiS_SetReg3(SiS_Pr->SiS_P3c6,0xFF);
+ 
+-   /* TW: New from 650/LV 1.10.6x and 1.10.7w, 630/301B 2.06.50 */
+    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+       if(HwDeviceExtension->jChipType >= SIS_315H) {
+ 	 SiS_SetReg1(SiS_Pr->SiS_P3d4,0x38,backupreg);
+@@ -2266,7 +2303,7 @@ SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, 
+ /* TW: Set CRT2 mode (used for dual head) */
+ BOOLEAN
+ SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, ScrnInfoPtr pScrn,
+-               DisplayModePtr mode)
++               DisplayModePtr mode, BOOLEAN IsCustom)
+ {
+    ULONG   temp;
+    USHORT  ModeIdIndex;
+@@ -2276,16 +2313,52 @@ SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, 
+    SISPtr  pSiS     = SISPTR(pScrn);
+    SISEntPtr pSiSEnt = pSiS->entityPrivate;
+    unsigned char tempr1, tempr2, backupreg=0;
+-   
++
+    SiS_Pr->UseCustomMode = FALSE;
+-   
+-   ModeNo = SiS_CalcModeIndex(pScrn, mode);
+-   if(!ModeNo) return FALSE;
++
++   /* Remember: Custom modes for CRT2 are ONLY supported
++    * 		-) on 315/330 series,
++    *           -) on the 301 and 30xB, and
++    *           -) if CRT2 is LCD or VGA
++    */
++
++   if((IsCustom) && (SiS_CheckBuildCustomMode(pScrn, mode, pSiS->VBFlags))) {
++
++	 ModeNo = 0xfe;
++
++   } else {
++
++         BOOLEAN havecustommodes = pSiS->HaveCustomModes;
++
++#ifdef SISMERGED
++	 if(pSiS->MergedFB) havecustommodes = pSiS->HaveCustomModes2;
++#endif
++
++         ModeNo = SiS_CalcModeIndex(pScrn, mode, havecustommodes);
++         if(!ModeNo) return FALSE;
++
++   }
++
++   /* Save mode info so we can set it from within SetMode for CRT1 */
++   if(pSiS->DualHeadMode) {
++      pSiSEnt->CRT2ModeNo = ModeNo;
++      pSiSEnt->CRT2DMode = mode;
++      pSiSEnt->CRT2IsCustom = IsCustom;
++
++      /* We can't set CRT2 mode before CRT1 mode is set */
++      if(pSiSEnt->CRT1ModeNo == -1) {
++    	 xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
++		"Setting CRT2 mode delayed until after setting CRT1 mode\n");
++   	 return TRUE;
++      }
++   }
+ 
+    SiSInitPtr(SiS_Pr, HwDeviceExtension);
+ 
+    SiSRegInit(SiS_Pr, BaseAddr);
+ 
++   SiS_GetSysFlags(SiS_Pr, HwDeviceExtension);
++
+    SiS_Pr->SiS_VGAINFO = SiS_GetSetBIOSScratch(pScrn, 0x489, 0xff);
+ 
+    SiSInitPCIetc(SiS_Pr, HwDeviceExtension);
+@@ -2294,22 +2367,26 @@ SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, 
+ 
+    SiSDetermineROMUsage(SiS_Pr, HwDeviceExtension, ROMAddr);
+ 
+-   /* TW: We don't clear the buffer under X */
++   /* We don't clear the buffer under X */
+    SiS_Pr->SiS_flag_clearbuffer=0;
+ 
+-   /* TW: Save ModeNo so we can set it from within SetMode for CRT1 */
+-   pSiSEnt->CRT2ModeNo = ModeNo;
+-   pSiSEnt->CRT2DMode = mode;
+-
+-   /* TW: We can't set CRT2 mode before CRT1 mode is set */
+-   if(pSiSEnt->CRT1ModeNo == -1) {
+-   	xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
+-		"Setting CRT2 mode delayed until after setting CRT1 mode\n");
+-   	return TRUE;
+-   }
++   if(SiS_Pr->UseCustomMode) {
++
++      USHORT temptemp = SiS_Pr->CVDisplay;
++
++      if(SiS_Pr->CModeFlag & DoubleScanMode)     temptemp >>= 1;
++      else if(SiS_Pr->CInfoFlag & InterlaceMode) temptemp <<= 1;
++
++      xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
++	  "Setting custom mode %dx%d on CRT2\n",
++	  SiS_Pr->CHDisplay, temptemp);
++
++   } else {
+ 
+-   xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
+-   		"Setting mode 0x%x on CRT2\n", ModeNo);
++      xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
++   	  "Setting standard mode 0x%x on CRT2\n", ModeNo);
++
++   }
+ 
+    /* 1.Openkey */
+    SiS_SetReg1(SiS_Pr->SiS_P3c4,0x05,0x86);
+@@ -2317,10 +2394,14 @@ SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, 
+    SiS_UnLockCRT2(SiS_Pr, HwDeviceExtension, BaseAddr);
+ 
+    /* 2.Get ModeID */
+-   temp = SiS_SearchModeID(SiS_Pr, ROMAddr,&ModeNo,&ModeIdIndex);
+-   if(temp == 0)  return(0);
++   if(!SiS_Pr->UseCustomMode) {
++      temp = SiS_SearchModeID(SiS_Pr, ROMAddr,&ModeNo,&ModeIdIndex);
++      if(temp == 0)  return(0);
++   } else {
++      ModeIdIndex = 0;
++   }
+ 
+-   /* TW: Determine VBType (301,301B,301LV,302B,302LV) */
++   /* Determine VBType (301,301B,301LV,302B,302LV) */
+    SiS_GetVBType(SiS_Pr, BaseAddr,HwDeviceExtension);
+ 
+    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+@@ -2343,15 +2424,22 @@ SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, 
+       }
+    }
+ 
+-   /* TW: Get VB information (connectors, connected devices) */
+-   SiS_GetVBInfo(SiS_Pr, BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension,1);
++   /* Get VB information (connectors, connected devices) */
++   if(!SiS_Pr->UseCustomMode) {
++      SiS_GetVBInfo(SiS_Pr, BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension,1);
++   } else {
++      /* If this is a custom mode, we don't check the modeflag for CRT2Mode */
++      SiS_GetVBInfo(SiS_Pr, BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension,0);
++   }
+    SiS_SetHiVision(SiS_Pr, BaseAddr,HwDeviceExtension);
+    SiS_GetLCDResInfo(SiS_Pr, ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension);
+ 
+    if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+-         if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x08)  {
++      if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x08)  {
++         if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+             if(ModeNo != 0x10)  SiS_Pr->SiS_SetFlag |= SetDOSMode;
++         } else if((IS_SIS651) && (SiS_Pr->SiS_VBType & VB_NoLCD)) {
++            SiS_Pr->SiS_SetFlag |= SetDOSMode;
+          }
+       }
+    }
+@@ -2364,17 +2452,19 @@ SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, 
+      case VB_CHIP_302:
+      case VB_CHIP_302B:
+      case VB_CHIP_302LV:
+-        SiS_SetCRT2Group301(SiS_Pr, BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
++        SiS_SetCRT2Group(SiS_Pr, BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
+         break;
+      case VB_CHIP_UNKNOWN:
+-        if (SiS_Pr->SiS_IF_DEF_LVDS     == 1 ||
+-	    SiS_Pr->SiS_IF_DEF_CH70xx   != 0 ||
+-	    SiS_Pr->SiS_IF_DEF_TRUMPION != 0) {
+-             	SiS_SetCRT2Group301(SiS_Pr,BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
++        if(SiS_Pr->SiS_IF_DEF_LVDS     == 1 ||
++	   SiS_Pr->SiS_IF_DEF_CH70xx   != 0 ||
++	   SiS_Pr->SiS_IF_DEF_TRUMPION != 0) {
++           SiS_SetCRT2Group(SiS_Pr,BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
+   	}
+         break;
+    }
+ 
++   SiS_StrangeStuff(SiS_Pr, HwDeviceExtension);
++
+    SiS_DisplayOn(SiS_Pr);
+    SiS_SetReg3(SiS_Pr->SiS_P3c6,0xFF);
+ 
+@@ -2386,7 +2476,6 @@ SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, 
+       }
+    }
+ 
+-   /* TW: New from 650/LV 1.10.6x and 1.10.7w, 630 2.06.50 */
+    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+       if(HwDeviceExtension->jChipType >= SIS_315H) {
+ 	 if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+@@ -2412,7 +2501,7 @@ SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, 
+       }
+    }
+ 
+-   /* TW: SetPitch: Adapt to virtual size & position */
++   /* SetPitch: Adapt to virtual size & position */
+    SiS_SetPitchCRT2(SiS_Pr, pScrn, BaseAddr);
+ 
+    return TRUE;
+@@ -2448,6 +2537,8 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+ 
+    SiSRegInit(SiS_Pr, BaseAddr);
+ 
++   SiS_GetSysFlags(SiS_Pr, HwDeviceExtension);
++
+ #ifdef LINUX_XF86
+    if(pScrn) SiS_Pr->SiS_VGAINFO = SiS_GetSetBIOSScratch(pScrn, 0x489, 0xff);
+    else
+@@ -2458,7 +2549,7 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+ #ifdef TWDEBUG
+    xf86DrvMsg(0, X_INFO, "VGAInfo 0x%02x\n", SiS_Pr->SiS_VGAINFO);
+ #endif
+-#endif	 	 
++#endif
+ 
+    SiSInitPCIetc(SiS_Pr, HwDeviceExtension);
+ 
+@@ -2472,7 +2563,7 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+    }      
+ 
+ #ifdef LINUX_XF86
+-   /* TW: We never clear the buffer in X */
++   /* We never clear the buffer in X */
+    ModeNo |= 0x8000;
+ #endif
+ 
+@@ -2501,10 +2592,10 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+       
+    }
+     
+-   /* TW: Determine VBType (301,301B,301LV,302B,302LV) */
++   /* Determine VBType (301,301B,301LV,302B,302LV) */
+    SiS_GetVBType(SiS_Pr,BaseAddr,HwDeviceExtension);
+ 
+-   /* TW: Init/restore some VB registers */
++   /* Init/restore some VB registers */
+    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+        if(HwDeviceExtension->jChipType >= SIS_315H) {
+          SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension,BaseAddr);
+@@ -2525,8 +2616,12 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+        }
+    }
+    
+-   /* TW: Get VB information (connectors, connected devices) */
+-   SiS_GetVBInfo(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension,1);
++   /* Get VB information (connectors, connected devices) */
++   if(SiS_Pr->UseCustomMode) {
++      SiS_GetVBInfo(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension,0);
++   } else {
++      SiS_GetVBInfo(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension,1);
++   }
+    SiS_SetHiVision(SiS_Pr,BaseAddr,HwDeviceExtension);
+    SiS_GetLCDResInfo(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension);
+ 
+@@ -2535,22 +2630,32 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+    if(!temp) return(0);
+ 
+    if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+-         if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x08)  {
++      if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x08)  {
++         if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+             if(ModeNo != 0x10)  SiS_Pr->SiS_SetFlag |= SetDOSMode;
++         } else if((IS_SIS651) && (SiS_Pr->SiS_VBType & VB_NoLCD)) {
++            SiS_Pr->SiS_SetFlag |= SetDOSMode;
+          }
+       }
+ 
+-      /* TW: New from 650/LV 1.10.6x; not in any BIOS for other chipsets */
+       if(IS_SIS650) {
+-          if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-	      SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x51,0x1f);
+-	      SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x56,0xe7);
+-	  }
++         if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++	    SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x51,0x1f);
++	    if(IS_SIS651) SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x51,0x20);
++	    SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x56,0xe7);
++	 }
+       }
+    }
+ 
+-   /* TW: Set mode on CRT1 */
++   if(SiS_Pr->UseCustomMode) {
++      SiS_Pr->CRT1UsesCustomMode = TRUE;
++      SiS_Pr->CSRClock_CRT1 = SiS_Pr->CSRClock;
++      SiS_Pr->CModeFlag_CRT1 = SiS_Pr->CModeFlag;
++   } else {
++      SiS_Pr->CRT1UsesCustomMode = FALSE;
++   }
++
++   /* Set mode on CRT1 */
+    if(SiS_Pr->SiS_VBInfo & (SetSimuScanMode | SetCRT2ToLCDA)) {
+    	SiS_SetCRT1Group(SiS_Pr,ROMAddr,HwDeviceExtension,ModeNo,ModeIdIndex,BaseAddr);
+    } else {
+@@ -2559,7 +2664,7 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+      }
+    }
+ 
+-   /* TW: Set mode on CRT2 */
++   /* Set mode on CRT2 */
+    if(SiS_Pr->SiS_VBInfo & (SetSimuScanMode | SwitchToCRT2 | SetCRT2ToLCDA)) {
+      switch (HwDeviceExtension->ujVBChipID) {
+      case VB_CHIP_301:
+@@ -2568,18 +2673,20 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+      case VB_CHIP_302:
+      case VB_CHIP_302B:
+      case VB_CHIP_302LV:
+-        SiS_SetCRT2Group301(SiS_Pr,BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
++        SiS_SetCRT2Group(SiS_Pr,BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
+         break;
+      case VB_CHIP_UNKNOWN:
+ 	if(SiS_Pr->SiS_IF_DEF_LVDS     == 1 ||
+ 	   SiS_Pr->SiS_IF_DEF_CH70xx   != 0 ||
+ 	   SiS_Pr->SiS_IF_DEF_TRUMPION != 0)
+-             	SiS_SetCRT2Group301(SiS_Pr,BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
++           SiS_SetCRT2Group(SiS_Pr,BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
+         break;
+      }
+    }
+    
+    SiS_HandleCRT1(SiS_Pr);
++
++   SiS_StrangeStuff(SiS_Pr, HwDeviceExtension);
+    
+    SiS_DisplayOn(SiS_Pr);
+    SiS_SetReg3(SiS_Pr->SiS_P3c6,0xFF);
+@@ -2592,7 +2699,6 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+       }
+    }
+ 
+-   /* TW: New from 650/LV 1.10.6x and 1.10.7w */
+    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+       if(HwDeviceExtension->jChipType >= SIS_315H) {
+ 	 if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+@@ -2627,7 +2733,7 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+ 
+ #ifdef LINUX_XF86
+    if(pScrn) {
+-      /* TW: SetPitch: Adapt to virtual size & position */
++      /* SetPitch: Adapt to virtual size & position */
+       if((ModeNo > 0x13) && (dosetpitch)) {
+          SiS_SetPitch(SiS_Pr, pScrn, BaseAddr);
+       }
+@@ -2637,7 +2743,7 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+    }
+ #endif
+ 
+-#ifndef LINUX_XF86  /* TW: We never lock registers in XF86 */
++#ifndef LINUX_XF86  /* We never lock registers in XF86 */
+    if(KeepLockReg == 0xA1) SiS_SetReg1(SiS_Pr->SiS_P3c4,0x05,0x86);
+    else SiS_SetReg1(SiS_Pr->SiS_P3c4,0x05,0x00);
+ #endif
+@@ -2646,10 +2752,15 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+ }
+ 
+ void
+-SiS_SetEnableDstn(SiS_Private *SiS_Pr)	/* TW: Called from sis_main.c */
++SiS_SetEnableDstn(SiS_Private *SiS_Pr, int enable)
++{
++   SiS_Pr->SiS_IF_DEF_DSTN = enable ? 1 : 0;
++}
++
++void
++SiS_SetEnableFstn(SiS_Private *SiS_Pr, int enable)
+ {
+-   /* For 550 dstn */
+-   SiS_Pr->SiS_IF_DEF_DSTN = 1;
++   SiS_Pr->SiS_IF_DEF_FSTN = enable ? 1 : 0;
+ }
+ 
+ void
+@@ -2663,13 +2774,73 @@ SiS_HandleCRT1(SiS_Private *SiS_Pr)
+   SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x63,0xbf);
+ 
+ #if 0
+-  if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x15) & 0x01))
+-     SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x63,0x40);
++  if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x15) & 0x01)) {
++     if((SiS_GetReg1(SiS_Pr->SiS_P3c4,0x15) & 0x0a) ||
++        (SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16) & 0x01)) {
++        SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x63,0x40);
++     }
+   }
+ #endif
+ }
+ 
+ void
++SiS_GetSysFlags(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
++{
++   unsigned char cr5f, temp1, temp2;
++
++   /* You should use the macros, not these flags directly */
++
++   SiS_Pr->SiS_SysFlags = 0;
++   if(HwDeviceExtension->jChipType == SIS_650) {
++      cr5f = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5f) & 0xf0;
++      SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x5c,0x07);
++      temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5c) & 0xf8;
++      SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x5c,0xf8);
++      temp2 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5c) & 0xf8;
++      if((!temp1) || (temp2)) {
++         switch(cr5f) {
++	    case 0x80:
++	    case 0x90:
++	    case 0xc0:
++	       SiS_Pr->SiS_SysFlags |= SF_IsM650;  break;
++	    case 0xa0:
++	    case 0xb0:
++	    case 0xe0:
++	       SiS_Pr->SiS_SysFlags |= SF_Is651;   break;
++	 }
++      } else {
++         switch(cr5f) {
++	    case 0x90:
++	       temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5c) & 0xf8;
++	       switch(temp1) {
++	          case 0x00: SiS_Pr->SiS_SysFlags |= SF_IsM652; break;
++		  case 0x40: SiS_Pr->SiS_SysFlags |= SF_IsM653; break;
++		  default:   SiS_Pr->SiS_SysFlags |= SF_IsM650; break;
++	       }
++	       break;
++	    case 0xb0:
++	       SiS_Pr->SiS_SysFlags |= SF_Is652;  break;
++	    default:
++	       SiS_Pr->SiS_SysFlags |= SF_IsM650; break;
++	 }
++      }
++   }
++}
++
++void
++SiS_StrangeStuff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
++{
++   if((IS_SIS651) || (IS_SISM650)) {
++      SiS_SetReg1(SiS_Pr->SiS_VidCapt, 0x3f, 0x00);   /* Fiddle with capture regs */
++      SiS_SetReg1(SiS_Pr->SiS_VidCapt, 0x00, 0x00);
++      SiS_SetReg1(SiS_Pr->SiS_VidPlay, 0x00, 0x86);   /* (BIOS does NOT unlock) */
++      SiS_SetRegAND(SiS_Pr->SiS_VidPlay, 0x30, 0xfe); /* Fiddle with video regs */
++      SiS_SetRegAND(SiS_Pr->SiS_VidPlay, 0x3f, 0xef);
++   }
++   /* !!! This does not support modes < 0x13 !!! */
++}
++
++void
+ SiS_SetCRT1Group(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+                  USHORT ModeNo,USHORT ModeIdIndex,USHORT BaseAddr)
+ {
+@@ -2683,6 +2854,9 @@ SiS_SetCRT1Group(SiS_Private *SiS_Pr, UC
+     }
+   }
+ 
++  /* 550, 651 */
++  SiS_WhatTheHellIsThis(SiS_Pr,HwDeviceExtension,BaseAddr);
++
+   SiS_SetSeqRegs(SiS_Pr,ROMAddr,StandTableIndex);
+   SiS_SetMiscRegs(SiS_Pr,ROMAddr,StandTableIndex);
+   SiS_SetCRTCRegs(SiS_Pr,ROMAddr,HwDeviceExtension,StandTableIndex);
+@@ -2759,15 +2933,20 @@ void
+ SiS_SetPitch(SiS_Private *SiS_Pr, ScrnInfoPtr pScrn, UShort BaseAddr)
+ {
+    SISPtr pSiS = SISPTR(pScrn);
++   BOOLEAN isslavemode = FALSE;
++
++   if( (pSiS->VBFlags & VB_VIDEOBRIDGE) &&
++       ( ((pSiS->VGAEngine == SIS_300_VGA) && (SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0xa0) == 0x20) ||
++         ((pSiS->VGAEngine == SIS_315_VGA) && (SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x50) == 0x10) ) ) {
++      isslavemode = TRUE;
++   }
+ 
+-   /* TW: We need to set pitch for CRT1 if bridge is in SlaveMode, too */
+-   if( (pSiS->VBFlags & DISPTYPE_DISP1) ||
+-       ( (pSiS->VBFlags & VB_VIDEOBRIDGE) &&
+-         ( ((pSiS->VGAEngine == SIS_300_VGA) && (SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0xa0) == 0x20) ||
+-           ((pSiS->VGAEngine == SIS_315_VGA) && (SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x50) == 0x10) ) ) ) {
++   /* We need to set pitch for CRT1 if bridge is in slave mode, too */
++   if( (pSiS->VBFlags & DISPTYPE_DISP1) || (isslavemode) ) {
+    	SiS_SetPitchCRT1(SiS_Pr, pScrn, BaseAddr);
+    }
+-   if (pSiS->VBFlags & DISPTYPE_DISP2) {
++   /* We must not set the pitch for CRT2 if bridge is in slave mode */
++   if( (pSiS->VBFlags & DISPTYPE_DISP2) && (!isslavemode) ) {
+    	SiS_SetPitchCRT2(SiS_Pr, pScrn, BaseAddr);
+    }
+ }
+@@ -2790,7 +2969,7 @@ SiS_SetPitchCRT2(SiS_Private *SiS_Pr, Sc
+     SISPtr pSiS = SISPTR(pScrn);
+     ULong  HDisplay,temp;
+ 
+-    HDisplay = pSiS->scrnPitch / 8;
++    HDisplay = pSiS->scrnPitch2 / 8;
+ 
+     /* Unlock CRT2 */
+     if (pSiS->VGAEngine == SIS_315_VGA)
+@@ -2880,7 +3059,6 @@ SiS_SearchModeID(SiS_Private *SiS_Pr, UC
+    return TRUE;
+ }
+ 
+-/* For SiS 300 oem util: Search VBModeID */
+ BOOLEAN
+ SiS_SearchVBModeID(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT *ModeNo)
+ {
+@@ -2946,6 +3124,81 @@ SiS_GetModePtr(SiS_Private *SiS_Pr, UCHA
+    return index;
+ }
+ 
++static void
++SiS_WhatIsThis1a(SiS_Private *SiS_Pr, USHORT somevalue)
++{
++   USHORT temp, tempbl, tempbh;
++
++   tempbl = tempbh = somevalue;
++   temp = SiS_GetReg2(SiS_Pr->SiS_P3cb);
++   temp &= 0xf0;
++   tempbl >>= 4;
++   temp |= tempbl;
++   SiS_SetReg3(SiS_Pr->SiS_P3cb, temp);
++   temp = SiS_GetReg2(SiS_Pr->SiS_P3cd);
++   temp &= 0xf0;
++   tempbh &= 0x0f;
++   temp |= tempbh;
++   SiS_SetReg3(SiS_Pr->SiS_P3cd, temp);
++}
++
++static void
++SiS_WhatIsThis1b(SiS_Private *SiS_Pr, USHORT somevalue)
++{
++   USHORT temp, tempbl, tempbh;
++
++   tempbl = tempbh = somevalue;
++   temp = SiS_GetReg2(SiS_Pr->SiS_P3cb);
++   temp &= 0x0f;
++   tempbl &= 0xf0;
++   temp |= tempbl;
++   SiS_SetReg3(SiS_Pr->SiS_P3cb, temp);
++   temp = SiS_GetReg2(SiS_Pr->SiS_P3cd);
++   temp &= 0x0f;
++   tempbh <<= 4;
++   temp |= tempbh;
++   SiS_SetReg3(SiS_Pr->SiS_P3cd, temp);
++}
++
++static void
++SiS_WhatIsThis2b(SiS_Private *SiS_Pr, USHORT somevalue)
++{
++   SiS_WhatIsThis1a(SiS_Pr, somevalue);
++   SiS_WhatIsThis1b(SiS_Pr, somevalue);
++}
++
++static void
++SiS_WhatIsThis1(SiS_Private *SiS_Pr)
++{
++   SiS_WhatIsThis2b(SiS_Pr, 0);
++}
++
++static void
++SiS_WhatIsThis2a(SiS_Private *SiS_Pr, USHORT somevalue)
++{
++   USHORT temp = somevalue >> 8;
++
++   temp &= 0x07;
++   temp |= (temp << 4);
++   SiS_SetReg1(SiS_Pr->SiS_P3c4,0x1d,temp);
++   SiS_WhatIsThis2b(SiS_Pr, somevalue);
++}
++
++static void
++SiS_WhatIsThis2(SiS_Private *SiS_Pr)
++{
++   SiS_WhatIsThis2a(SiS_Pr, 0);
++}
++
++void
++SiS_WhatTheHellIsThis(SiS_Private *SiS_Pr,PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
++{
++   if(IS_SIS65x) {
++      SiS_WhatIsThis1(SiS_Pr);
++      SiS_WhatIsThis2(SiS_Pr);
++   }
++}
++
+ void
+ SiS_SetSeqRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT StandTableIndex)
+ {
+@@ -3027,7 +3280,7 @@ SiS_SetCRTCRegs(SiS_Private *SiS_Pr, UCH
+       (HwDeviceExtension->jChipRevision >= 0x30) ) {       	   /* for 630S0 */
+     if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+       if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
+-        SiS_SetReg1(SiS_Pr->SiS_P3d4,0x18,0xFE);
++         SiS_SetReg1(SiS_Pr->SiS_P3d4,0x18,0xFE);
+       }
+     }
+   }
+@@ -3065,7 +3318,7 @@ SiS_SetATTRegs(SiS_Private *SiS_Pr, UCHA
+       }
+       if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+          if(HwDeviceExtension->jChipType >= SIS_315H) {
+-	    if(IS_SIS650740 || IS_SIS550) {  
++	    if(IS_SIS550650740660) {
+ 	       /* 315, 330 don't do this */
+ 	       if(SiS_Pr->SiS_VBType & VB_SIS301B302B) { 
+ 	          if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) ARdata=0;
+@@ -3148,7 +3401,7 @@ SiS_SetCRT1CRTC(SiS_Private *SiS_Pr, UCH
+   USHORT tempah,i,modeflag,j;
+ #ifdef SIS315H
+   USHORT temp;
+-  USHORT ResInfo,DisplayType;
++  USHORT ResIndex,DisplayType;
+   const SiS_LCDACRT1DataStruct *LCDACRT1Ptr = NULL;
+ #endif
+ 
+@@ -3171,7 +3424,7 @@ SiS_SetCRT1CRTC(SiS_Private *SiS_Pr, UCH
+      /* LCDA */
+ 
+      temp = SiS_GetLCDACRT1Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+-                       RefreshRateTableIndex,&ResInfo,&DisplayType);
++                       RefreshRateTableIndex,&ResIndex,&DisplayType);
+ 
+      switch(DisplayType) {
+       case Panel_800x600       : LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT1800x600_1;      break;
+@@ -3197,30 +3450,30 @@ SiS_SetCRT1CRTC(SiS_Private *SiS_Pr, UCH
+       default:                   LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11024x768_1;     break;
+      }
+ 
+-     tempah = (LCDACRT1Ptr+ResInfo)->CR[0];
++     tempah = (LCDACRT1Ptr+ResIndex)->CR[0];
+      SiS_SetReg1(SiS_Pr->SiS_P3d4,0x00,tempah);
+      for(i=0x01,j=1;i<=0x07;i++,j++){
+-       tempah = (LCDACRT1Ptr+ResInfo)->CR[j];
++       tempah = (LCDACRT1Ptr+ResIndex)->CR[j];
+        SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
+      }
+      for(i=0x10,j=8;i<=0x12;i++,j++){
+-       tempah = (LCDACRT1Ptr+ResInfo)->CR[j];
++       tempah = (LCDACRT1Ptr+ResIndex)->CR[j];
+        SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
+      }
+      for(i=0x15,j=11;i<=0x16;i++,j++){
+-       tempah =(LCDACRT1Ptr+ResInfo)->CR[j];
++       tempah =(LCDACRT1Ptr+ResIndex)->CR[j];
+        SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
+      }
+      for(i=0x0A,j=13;i<=0x0C;i++,j++){
+-       tempah = (LCDACRT1Ptr+ResInfo)->CR[j];
++       tempah = (LCDACRT1Ptr+ResIndex)->CR[j];
+        SiS_SetReg1(SiS_Pr->SiS_P3c4,i,tempah);
+      }
+ 
+-     tempah = (LCDACRT1Ptr+ResInfo)->CR[16];
++     tempah = (LCDACRT1Ptr+ResIndex)->CR[16];
+      tempah &= 0x0E0;
+      SiS_SetReg1(SiS_Pr->SiS_P3c4,0x0E,tempah);
+ 
+-     tempah = (LCDACRT1Ptr+ResInfo)->CR[16];
++     tempah = (LCDACRT1Ptr+ResIndex)->CR[16];
+      tempah &= 0x01;
+      tempah <<= 5;
+      if(modeflag & DoubleScanMode)  tempah |= 0x080;
+@@ -3301,7 +3554,7 @@ SiS_SetCRT1CRTC(SiS_Private *SiS_Pr, UCH
+ 
+ BOOLEAN
+ SiS_GetLCDACRT1Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+-		   USHORT RefreshRateTableIndex,USHORT *ResInfo,
++		   USHORT RefreshRateTableIndex,USHORT *ResIndex,
+ 		   USHORT *DisplayType)
+  {
+   USHORT tempbx=0,modeflag=0;
+@@ -3320,7 +3573,7 @@ SiS_GetLCDACRT1Ptr(SiS_Private *SiS_Pr, 
+   if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 32;
+   if(modeflag & HalfDCLK)                 tempbx += 16;
+ 
+-  *ResInfo = CRT2CRTC & 0x3F;
++  *ResIndex = CRT2CRTC & 0x3F;
+   *DisplayType = tempbx;
+ 
+   return 1;
+@@ -3490,11 +3743,11 @@ SiS_SetCRT1ModeRegs(SiS_Private *SiS_Pr,
+ 
+   data2 = 0;
+   if(ModeNo > 0x13) {
+-    if(SiS_Pr->SiS_ModeType > 0x02) {
+-       data2 |= 0x02;
+-       data3 = (SiS_Pr->SiS_ModeType - ModeVGA) << 2;
+-       data2 |= data3;
+-    }
++     if(SiS_Pr->SiS_ModeType > 0x02) {
++        data2 |= 0x02;
++        data3 = (SiS_Pr->SiS_ModeType - ModeVGA) << 2;
++        data2 |= data3;
++     }
+   }
+ #ifdef TWDEBUG
+   xf86DrvMsg(0, X_INFO, "Debug: Mode infoflag = %x, Chiptype %d\n", 
+@@ -3517,7 +3770,8 @@ SiS_SetCRT1ModeRegs(SiS_Private *SiS_Pr,
+   if(HwDeviceExtension->jChipType != SIS_300) {
+      data = 0x0000;
+      if(infoflag & InterlaceMode) {
+-        if(xres == 1024) data = 0x0035;
++        if(xres <= 800)  data = 0x0020;
++        else if(xres <= 1024) data = 0x0035;
+         else data = 0x0048;
+      }
+      data2 = data & 0x00FF;
+@@ -3549,6 +3803,7 @@ SiS_SetCRT1ModeRegs(SiS_Private *SiS_Pr,
+      } else {
+         SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x0F,0xB7);
+      }
++     /* 651 BIOS does something for mode 0x12 here */
+   }
+ 
+   if(HwDeviceExtension->jChipType != SIS_300) {
+@@ -3679,7 +3934,7 @@ SiS_SetVCLKState(SiS_Private *SiS_Pr, UC
+     if(VCLK >= 150) data2 |= 0x08;       	/* VCLK > 150 */
+     SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x32,0xF7,data2);
+ 
+-  } else { 						/* 310/325 series */
++  } else { 						/* 315 series */
+ 
+     data = 0;
+     if(VCLK >= 166) data |= 0x0c;         	/* TW: Was 200; is 166 in 650, 315 and 330 BIOSes */
+@@ -3688,12 +3943,6 @@ SiS_SetVCLKState(SiS_Private *SiS_Pr, UC
+     if(VCLK >= 166) {				/* TW: Was 200, is 166 in 650, 315 and 330 BIOSes */
+        SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1f,0xe7);
+     }
+-#if 0 /* Not done in 315 and 650/301LV/LVDS BIOSes: */
+-    data = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1F);	  	/* DAC pedestal */
+-    data &= 0xE7;
+-    if(VCLK<200) data |= 0x10;
+-    SiS_SetReg1(SiS_Pr->SiS_P3c4,0x1F,data);	  	/* DAC pedestal */
+-#endif
+   }
+ 
+   data2 = 0x03;
+@@ -3918,7 +4167,8 @@ GetDRAMSize(SiS_Private *SiS_Pr, PSIS_HW
+ 
+   } else if((HwDeviceExtension->jChipType == SIS_550) ||
+             (HwDeviceExtension->jChipType == SIS_740) ||
+-            (HwDeviceExtension->jChipType == SIS_650)) {
++            (HwDeviceExtension->jChipType == SIS_650) ||
++	    (HwDeviceExtension->jChipType == SIS_660)) {
+ 
+   	counter = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14) & 0x3F;
+       	counter++;
+@@ -4728,7 +4978,7 @@ SiS_GetSenseStatus(SiS_Private *SiS_Pr, 
+           SiS_Pr->SiS_SetFlag = 0x00;
+           SiS_Pr->SiS_ModeType = ModeVGA;
+           SiS_Pr->SiS_VBInfo = SetCRT2ToRAMDAC |LoadDACFlag |SetInSlaveMode;
+-          SiS_SetCRT2Group301(SiS_Pr, BaseAddr,ROMAddr,SenseModeNo,HwDeviceExtension);
++          SiS_SetCRT2Group(SiS_Pr, BaseAddr,ROMAddr,SenseModeNo,HwDeviceExtension);
+           for(i=0;i<20;i++) {
+             SiS_LongWait(SiS_Pr);
+           }
+@@ -4766,7 +5016,7 @@ SiS_GetSenseStatus(SiS_Private *SiS_Pr, 
+ #ifdef SIS315H
+ 	   if(HwDeviceExtension->jChipType >= SIS_315H) {
+ 	        OutputSelect = ROMAddr[0xf3];
+-		if(HwDeviceExtension->jChipType == SIS_330) {
++		if(HwDeviceExtension->jChipType >= SIS_330) {
+ 		     OutputSelect = ROMAddr[0x11b];
+ 		}
+ 	   }
+@@ -4814,7 +5064,7 @@ SiS_GetSenseStatus(SiS_Private *SiS_Pr, 
+       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x00,P2reg0);
+       if(!(P2reg0 & 0x20)) {
+         SiS_Pr->SiS_VBInfo = DisableCRT2Display;
+-        SiS_SetCRT2Group301(SiS_Pr,BaseAddr,ROMAddr,SenseModeNo,HwDeviceExtension);
++        SiS_SetCRT2Group(SiS_Pr,BaseAddr,ROMAddr,SenseModeNo,HwDeviceExtension);
+       }
+     }
+   }
+@@ -4884,111 +5134,6 @@ SiS_SenseCHTV(SiS_Private *SiS_Pr)
+ }
+ #endif /* LINUXBIOS */
+ 
+-/*  ================ for TC only =================  */
+-
+-#ifdef TC
+-
+-int
+-INT1AReturnCode(union REGS regs)
+-{
+-  if (regs.x.cflag)
+-  {
+-    /*printf("Error to find pci device!\n"); */
+-    return 1;
+-  }
+-
+-  switch(regs.h.ah)
+-  {
+-    case 0: return 0;
+-            break;
+-    case 0x81: printf("Function not support\n");
+-               break;
+-    case 0x83: printf("bad vendor id\n");
+-               break;
+-    case 0x86: printf("device not found\n");
+-               break;
+-    case 0x87: printf("bad register number\n");
+-               break;
+-    case 0x88: printf("set failed\n");
+-               break;
+-    case 0x89: printf("buffer too small");
+-               break;
+-  }
+-  return 1;
+-}
+-
+-unsigned
+-FindPCIIOBase(unsigned index,unsigned deviceid)
+-{
+-  union REGS regs;
+-
+-  regs.h.ah = 0xb1;  /*PCI_FUNCTION_ID */
+-  regs.h.al = 0x02;  /*FIND_PCI_DEVICE */
+-  regs.x.cx = deviceid;
+-  regs.x.dx = 0x1039;
+-  regs.x.si = index;  /* find n-th device */
+-
+-  int86(0x1A, &regs, &regs);
+-
+-  if (INT1AReturnCode(regs)!=0)
+-    return 0;
+-
+-  /* regs.h.bh *//* bus number */
+-  /* regs.h.bl *//* device number */
+-  regs.h.ah = 0xb1;  /*PCI_FUNCTION_ID */
+-  regs.h.al = 0x09;  /*READ_CONFIG_WORD */
+-  regs.x.cx = deviceid;
+-  regs.x.dx = 0x1039;
+-  regs.x.di = 0x18;  /* register number */
+-  int86(0x1A, &regs, &regs);
+-
+-  if (INT1AReturnCode(regs)!=0)
+-    return 0;
+-  return regs.x.cx;
+-}
+-
+-
+-void
+-main(int argc, char *argv[])
+-{
+-  SIS_HW_DEVICE_INFO  HwDeviceExtension;
+-  USHORT temp;
+-  USHORT ModeNo;
+-
+-  /*HwDeviceExtension.pjVirtualRomBase =(PUCHAR) MK_FP(0xC000,0); */
+-  /*HwDeviceExtension.pjVideoMemoryAddress = (PUCHAR)MK_FP(0xA000,0);*/
+-
+-#ifdef SIS300  
+-  HwDeviceExtension.ulIOAddress = (FindPCIIOBase(0,0x6300)&0xFF80) + 0x30;
+-  HwDeviceExtension.jChipType = SIS_630;
+-#endif
+-
+-#ifdef SIS315H  
+-//  HwDeviceExtension.ulIOAddress = (FindPCIIOBase(0,0x5315)&0xFF80) + 0x30;
+-//  HwDeviceExtension.jChipType = SIS_550;
+-  HwDeviceExtension.ulIOAddress = (FindPCIIOBase(0,0x325)&0xFF80) + 0x30;
+-  HwDeviceExtension.jChipType = SIS_315H;
+-#endif
+-
+-  HwDeviceExtension.ujVBChipID = VB_CHIP_301;
+-  strcpy(HwDeviceExtension.szVBIOSVer,"0.84");
+-  HwDeviceExtension.bSkipDramSizing = FALSE;
+-  HwDeviceExtension.ulVideoMemorySize = 0;
+-  if(argc==2) {
+-    ModeNo=atoi(argv[1]);
+-  }
+-  else {
+-    ModeNo=0x2e;
+-    /*ModeNo=0x37; */ /* 1024x768x 4bpp */
+-    /*ModeNo=0x38; *//* 1024x768x 8bpp */
+-    /*ModeNo=0x4A; *//* 1024x768x 16bpp */
+-    /*ModeNo=0x47;*/ /* 800x600x 16bpp */
+-  }
+- /* SiSInit(SiS_Pr, &HwDeviceExtension);*/
+-  SiSSetMode(SiS_Pr, &HwDeviceExtension, ModeNo);
+-}
+-#endif /* TC END */
+-
+ /* ================ XFREE86 ================= */
+ 
+ /* Helper functions */
+@@ -5000,44 +5145,78 @@ SiS_CheckBuildCustomMode(ScrnInfoPtr pSc
+    SISPtr pSiS = SISPTR(pScrn);
+    int    out_n, out_dn, out_div, out_sbit, out_scale;
+    int    depth = pSiS->CurrentLayout.bitsPerPixel;
+-   
+-#ifdef SISDUALHEAD
+-   if( ((!pSiS->DualHeadMode) && (VBFlags & DISPTYPE_DISP2)) ||
+-       ((pSiS->DualHeadMode) && (!pSiS->SecondHead)) ) return 0;
+-#else      
+-   if(VBFlags & DISPTYPE_DISP2) return 0; 
+-#endif   
++   unsigned int vclk[5];
++
++#define Midx         0
++#define Nidx         1
++#define VLDidx       2
++#define Pidx         3
++#define PSNidx       4
++
++   pSiS->SiS_Pr->CModeFlag = 0;
+    
+    pSiS->SiS_Pr->CDClock = mode->Clock;
+-   
++
+    pSiS->SiS_Pr->CHDisplay = mode->HDisplay;
+    pSiS->SiS_Pr->CHSyncStart = mode->HSyncStart;
+    pSiS->SiS_Pr->CHSyncEnd = mode->HSyncEnd;
+    pSiS->SiS_Pr->CHTotal = mode->HTotal;
+-   pSiS->SiS_Pr->CHBlankStart = pSiS->SiS_Pr->CHDisplay;
+-   pSiS->SiS_Pr->CHBlankEnd = pSiS->SiS_Pr->CHTotal;
+-   
++
+    pSiS->SiS_Pr->CVDisplay = mode->VDisplay;
+    pSiS->SiS_Pr->CVSyncStart = mode->VSyncStart;
+    pSiS->SiS_Pr->CVSyncEnd = mode->VSyncEnd;
+    pSiS->SiS_Pr->CVTotal = mode->VTotal;
++
++   pSiS->SiS_Pr->CFlags = mode->Flags;
++
++   if(pSiS->SiS_Pr->CFlags & V_INTERLACE) {
++         pSiS->SiS_Pr->CVDisplay >>= 1;
++	 pSiS->SiS_Pr->CVSyncStart >>= 1;
++	 pSiS->SiS_Pr->CVSyncEnd >>= 1;
++	 pSiS->SiS_Pr->CVTotal >>= 1;
++   }
++   if(pSiS->SiS_Pr->CFlags & V_DBLSCAN) {
++         /* pSiS->SiS_Pr->CDClock <<= 1; */
++	 pSiS->SiS_Pr->CVDisplay <<= 1;
++	 pSiS->SiS_Pr->CVSyncStart <<= 1;
++	 pSiS->SiS_Pr->CVSyncEnd <<= 1;
++	 pSiS->SiS_Pr->CVTotal <<= 1;
++   }
++
++   pSiS->SiS_Pr->CHBlankStart = pSiS->SiS_Pr->CHDisplay;
++   pSiS->SiS_Pr->CHBlankEnd = pSiS->SiS_Pr->CHTotal;
+    pSiS->SiS_Pr->CVBlankStart = pSiS->SiS_Pr->CVSyncStart - 1;
+    pSiS->SiS_Pr->CVBlankEnd = pSiS->SiS_Pr->CVTotal;
+-   
+-   pSiS->SiS_Pr->CFlags = mode->Flags;
+ 
+-   SiS_compute_vclk(pSiS->SiS_Pr->CDClock, &out_n, &out_dn, &out_div, &out_sbit, &out_scale);
+-   
++   if(SiS_compute_vclk(pSiS->SiS_Pr->CDClock, &out_n, &out_dn, &out_div, &out_sbit, &out_scale)) {
++      pSiS->SiS_Pr->CSR2B = (out_div == 2) ? 0x80 : 0x00;
++      pSiS->SiS_Pr->CSR2B |= ((out_n - 1) & 0x7f);
++      pSiS->SiS_Pr->CSR2C = (out_dn - 1) & 0x1f;
++      pSiS->SiS_Pr->CSR2C |= (((out_scale - 1) & 3) << 5);
++      pSiS->SiS_Pr->CSR2C |= ((out_sbit & 0x01) << 7);
++#ifdef TWDEBUG
++      xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Clock %d: n %d dn %d div %d sb %d sc %d\n",
++        	pSiS->SiS_Pr->CDClock, out_n, out_dn, out_div, out_sbit, out_scale);
++#endif
++   } else {
++      SiSCalcClock(pScrn, pSiS->SiS_Pr->CDClock, 2, vclk);
++      pSiS->SiS_Pr->CSR2B = (vclk[VLDidx] == 2) ? 0x80 : 0x00;
++      pSiS->SiS_Pr->CSR2B |= (vclk[Midx] - 1) & 0x7f;
++      pSiS->SiS_Pr->CSR2C = (vclk[Nidx] - 1) & 0x1f;
++      if(vclk[Pidx] <= 4) {
++         /* postscale 1,2,3,4 */
++         pSiS->SiS_Pr->CSR2C |= ((vclk[Pidx] - 1) & 3) << 5;
++      } else {
++         /* postscale 6,8 */
++         pSiS->SiS_Pr->CSR2C |= (((vclk[Pidx] / 2) - 1) & 3) << 5;
++	 pSiS->SiS_Pr->CSR2C |= 0x80;
++      }
+ #ifdef TWDEBUG
+-   xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Clock %d: n %d dn %d div %d sb %d sc %d\n",
+-      	pSiS->SiS_Pr->CDClock, out_n, out_dn, out_div, out_sbit, out_scale);
+-#endif	
+-
+-   pSiS->SiS_Pr->CSR2B = (out_div == 2) ? 0x80 : 0x00;
+-   pSiS->SiS_Pr->CSR2B |= ((out_n - 1) & 0x7f);
+-   pSiS->SiS_Pr->CSR2C = (out_dn - 1) & 0x1f;
+-   pSiS->SiS_Pr->CSR2C |= (((out_scale - 1) & 3) << 5);
+-   pSiS->SiS_Pr->CSR2C |= ((out_sbit & 0x01) << 7);
++      xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Clock %d: n %d dn %d div %d sc %d\n",
++        	pSiS->SiS_Pr->CDClock, vclk[Midx], vclk[Nidx], vclk[VLDidx], vclk[Pidx]);
++#endif
++   }
++
+    pSiS->SiS_Pr->CSRClock = (pSiS->SiS_Pr->CDClock / 1000) + 1;
+ 
+    pSiS->SiS_Pr->CCRT1CRTC[0]  =  ((pSiS->SiS_Pr->CHTotal >> 3) - 5) & 0xff;
+@@ -5045,9 +5224,9 @@ SiS_CheckBuildCustomMode(ScrnInfoPtr pSc
+    pSiS->SiS_Pr->CCRT1CRTC[2]  =  (pSiS->SiS_Pr->CHBlankStart >> 3) - 1;
+    pSiS->SiS_Pr->CCRT1CRTC[3]  =  (((pSiS->SiS_Pr->CHBlankEnd >> 3) - 1) & 0x1F) | 0x80;
+    pSiS->SiS_Pr->CCRT1CRTC[4]  =  (pSiS->SiS_Pr->CHSyncStart >> 3) + 3;
+-   pSiS->SiS_Pr->CCRT1CRTC[5]  =  ((((pSiS->SiS_Pr->CHBlankEnd >> 3) - 1) & 0x20) << 2) | 
++   pSiS->SiS_Pr->CCRT1CRTC[5]  =  ((((pSiS->SiS_Pr->CHBlankEnd >> 3) - 1) & 0x20) << 2) |
+        				  (((pSiS->SiS_Pr->CHSyncEnd >> 3) + 3) & 0x1F);
+-   
++
+    pSiS->SiS_Pr->CCRT1CRTC[6]  =  (pSiS->SiS_Pr->CVTotal - 2) & 0xFF;
+    pSiS->SiS_Pr->CCRT1CRTC[7]  =  (((pSiS->SiS_Pr->CVTotal - 2) & 0x100) >> 8)
+  	 			| (((pSiS->SiS_Pr->CVDisplay - 1) & 0x100) >> 7)
+@@ -5057,50 +5236,50 @@ SiS_CheckBuildCustomMode(ScrnInfoPtr pSc
+ 	 			| (((pSiS->SiS_Pr->CVTotal - 2) & 0x200)   >> 4)
+ 	 			| (((pSiS->SiS_Pr->CVDisplay - 1) & 0x200) >> 3)
+ 	 			| ((pSiS->SiS_Pr->CVSyncStart & 0x200) >> 2);
+-    
++
+    pSiS->SiS_Pr->CCRT1CRTC[16] = ((((pSiS->SiS_Pr->CVBlankStart - 1) & 0x200) >> 4) >> 5); 	/* cr9 */
+-    
+-#if 0    
++
++#if 0
+    if (mode->VScan >= 32)
+ 	regp->CRTC[9] |= 0x1F;
+    else if (mode->VScan > 1)
+ 	regp->CRTC[9] |= mode->VScan - 1;
+-#endif	
++#endif
+ 
+-   pSiS->SiS_Pr->CCRT1CRTC[8] =  (pSiS->SiS_Pr->CVSyncStart - 1) & 0xFF;	/* cr10 */
+-   pSiS->SiS_Pr->CCRT1CRTC[9] =  ((pSiS->SiS_Pr->CVSyncEnd - 1) & 0x0F) | 0x80;	/* cr11 */
+-   pSiS->SiS_Pr->CCRT1CRTC[10] = (pSiS->SiS_Pr->CVDisplay - 1) & 0xFF;		/* cr12 */
+-   pSiS->SiS_Pr->CCRT1CRTC[11] = (pSiS->SiS_Pr->CVBlankStart - 1) & 0xFF;	/* cr15 */
+-   pSiS->SiS_Pr->CCRT1CRTC[12] = (pSiS->SiS_Pr->CVBlankEnd - 1) & 0xFF;		/* cr16 */
+-   
+-   pSiS->SiS_Pr->CCRT1CRTC[13] = 
++   pSiS->SiS_Pr->CCRT1CRTC[8] =  (pSiS->SiS_Pr->CVSyncStart     ) & 0xFF;		/* cr10 */
++   pSiS->SiS_Pr->CCRT1CRTC[9] =  ((pSiS->SiS_Pr->CVSyncEnd      ) & 0x0F) | 0x80;	/* cr11 */
++   pSiS->SiS_Pr->CCRT1CRTC[10] = (pSiS->SiS_Pr->CVDisplay    - 1) & 0xFF;		/* cr12 */
++   pSiS->SiS_Pr->CCRT1CRTC[11] = (pSiS->SiS_Pr->CVBlankStart - 1) & 0xFF;		/* cr15 */
++   pSiS->SiS_Pr->CCRT1CRTC[12] = (pSiS->SiS_Pr->CVBlankEnd   - 1) & 0xFF;		/* cr16 */
++
++   pSiS->SiS_Pr->CCRT1CRTC[13] =
+                         GETBITSTR((pSiS->SiS_Pr->CVTotal     -2), 10:10, 0:0) |
+                         GETBITSTR((pSiS->SiS_Pr->CVDisplay   -1), 10:10, 1:1) |
+                         GETBITSTR((pSiS->SiS_Pr->CVBlankStart-1), 10:10, 2:2) |
+                         GETBITSTR((pSiS->SiS_Pr->CVSyncStart   ), 10:10, 3:3) |
+                         GETBITSTR((pSiS->SiS_Pr->CVBlankEnd  -1),   8:8, 4:4) |
+-                        GETBITSTR((pSiS->SiS_Pr->CVSyncEnd   -1),   4:4, 5:5) ;  
++                        GETBITSTR((pSiS->SiS_Pr->CVSyncEnd     ),   4:4, 5:5) ;
+ 
+-   pSiS->SiS_Pr->CCRT1CRTC[14] = 
++   pSiS->SiS_Pr->CCRT1CRTC[14] =
+                         GETBITSTR((pSiS->SiS_Pr->CHTotal      >> 3) - 5, 9:8, 1:0) |
+                         GETBITSTR((pSiS->SiS_Pr->CHDisplay    >> 3) - 1, 9:8, 3:2) |
+                         GETBITSTR((pSiS->SiS_Pr->CHBlankStart >> 3) - 1, 9:8, 5:4) |
+                         GETBITSTR((pSiS->SiS_Pr->CHSyncStart  >> 3) + 3, 9:8, 7:6) ;
+ 
+-        
++
+    pSiS->SiS_Pr->CCRT1CRTC[15] =
+                         GETBITSTR((pSiS->SiS_Pr->CHBlankEnd >> 3) - 1, 7:6, 1:0) |
+-                        GETBITSTR((pSiS->SiS_Pr->CHSyncEnd  >> 3) + 3, 5:5, 2:2) ; 
+-			
++                        GETBITSTR((pSiS->SiS_Pr->CHSyncEnd  >> 3) + 3, 5:5, 2:2) ;
++
+    switch(depth) {
+-   case 8: 			
+-      	pSiS->SiS_Pr->CModeFlag = 0x223b;
++   case 8:
++      	pSiS->SiS_Pr->CModeFlag |= 0x223b;
+ 	break;
+-   case 16: 			
+-      	pSiS->SiS_Pr->CModeFlag = 0x227d;
++   case 16:
++      	pSiS->SiS_Pr->CModeFlag |= 0x227d;
+ 	break;
+-   case 32: 			
+-      	pSiS->SiS_Pr->CModeFlag = 0x22ff;
++   case 32:
++      	pSiS->SiS_Pr->CModeFlag |= 0x22ff;
+ 	break;		
+    default: 
+    	return 0;	
+@@ -5114,9 +5293,9 @@ SiS_CheckBuildCustomMode(ScrnInfoPtr pSc
+ 	pSiS->SiS_Pr->CModeFlag |= LineCompareOff;
+    if(pSiS->SiS_Pr->CFlags & V_CLKDIV2)
+         pSiS->SiS_Pr->CModeFlag |= HalfDCLK;
+-   
++
+    pSiS->SiS_Pr->CInfoFlag = 0x0007;
+-   if(pSiS->SiS_Pr->CFlags & V_NHSYNC) 
++   if(pSiS->SiS_Pr->CFlags & V_NHSYNC)
+    	pSiS->SiS_Pr->CInfoFlag |= 0x4000;
+    if(pSiS->SiS_Pr->CFlags & V_NVSYNC) 
+    	pSiS->SiS_Pr->CInfoFlag |= 0x8000;
+@@ -5152,13 +5331,13 @@ SiS_CheckBuildCustomMode(ScrnInfoPtr pSc
+    	pSiS->SiS_Pr->CSR2B,
+ 	pSiS->SiS_Pr->CSR2C,
+ 	pSiS->SiS_Pr->CSRClock);
+-#endif   	
++#endif
+    return 1;
+ }
+ 
+ /* TW: Build a list of supported modes */
+ DisplayModePtr
+-SiSBuildBuiltInModeList(ScrnInfoPtr pScrn)
++SiSBuildBuiltInModeList(ScrnInfoPtr pScrn, BOOLEAN includelcdmodes, BOOLEAN isfordvi)
+ {
+    SISPtr         pSiS = SISPTR(pScrn);
+    unsigned short VRE, VBE, VRS, VBS, VDE, VT;
+@@ -5166,11 +5345,16 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
+    unsigned char  sr_data, cr_data, cr_data2, cr_data3;
+    unsigned char  sr2b, sr2c;
+    float          num, denum, postscalar, divider;
+-   int            A, B, C, D, E, F, temp, i, j, index, vclkindex;
+-   DisplayModePtr new = NULL, current = NULL, first = NULL, backup = NULL;
++   int            A, B, C, D, E, F, temp, i, j, k, l, index, vclkindex;
++   DisplayModePtr new = NULL, current = NULL, first = NULL;
++   BOOLEAN        done = FALSE;
++#if 0
++   DisplayModePtr backup = NULL;
++#endif
+ 
+    pSiS->backupmodelist = NULL;
+-   
++   pSiS->AddedPlasmaModes = FALSE;
++
+    /* Initialize our pointers */
+    if(pSiS->VGAEngine == SIS_300_VGA) {
+ #ifdef SIS300
+@@ -5194,15 +5378,20 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
+       if(pSiS->VGAEngine == SIS_300_VGA) index &= 0x3F;
+ #endif      
+ 
+-      if(((pSiS->SiS_Pr->SiS_RefIndex[i].XRes < 512) && (!pSiS->DSTN)) ||
+-      	 ((pSiS->DSTN) &&
+-	  (pSiS->SiS_Pr->SiS_RefIndex[i].XRes < 512) &&
+-	  (pSiS->SiS_Pr->SiS_RefIndex[i].XRes != 320) &&
+-	  (pSiS->SiS_Pr->SiS_RefIndex[i].YRes != 480)))  {
++      /* 0x5a (320x240) is a pure FTSN mode, not DSTN! */
++      if((!pSiS->FSTN) &&
++	 (pSiS->SiS_Pr->SiS_RefIndex[i].ModeID == 0x5a))  {
+            i++;
+       	   continue;
+       }
+-      
++      if((pSiS->FSTN) &&
++         (pSiS->SiS_Pr->SiS_RefIndex[i].XRes == 320) &&
++	 (pSiS->SiS_Pr->SiS_RefIndex[i].YRes == 240) &&
++	 (pSiS->SiS_Pr->SiS_RefIndex[i].ModeID != 0x5a)) {
++	   i++;
++	   continue;
++      }
++
+       if(!(new = xalloc(sizeof(DisplayModeRec)))) return first;
+       memset(new, 0, sizeof(DisplayModeRec));
+       if(!(new->name = xalloc(10))) {
+@@ -5216,13 +5405,13 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
+       }
+ 
+       current = new;
+-      
++
+       sprintf(current->name, "%dx%d", pSiS->SiS_Pr->SiS_RefIndex[i].XRes,
+                                       pSiS->SiS_Pr->SiS_RefIndex[i].YRes);
+ 
+       current->status = MODE_OK;
+ 
+-      current->type = M_T_DEFAULT; 
++      current->type = M_T_DEFAULT;
+ 
+       vclkindex = pSiS->SiS_Pr->SiS_RefIndex[i].Ext_CRTVCLK;
+       if(pSiS->VGAEngine == SIS_300_VGA) vclkindex &= 0x3F;
+@@ -5235,7 +5424,7 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
+               ( (((sr2c >> 5) & 0x03) == 0x02) ? 6.0 : 8.0) : (((sr2c >> 5) & 0x03) + 1.0);
+       num = (sr2b & 0x7f) + 1.0;
+       denum = (sr2c & 0x1f) + 1.0;
+-      
++
+ #ifdef TWDEBUG
+       xf86DrvMsg(0, X_INFO, "------------\n");
+       xf86DrvMsg(0, X_INFO, "sr2b: %x sr2c %x div %f ps %f num %f denum %f\n",
+@@ -5303,10 +5492,29 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
+ 
+       D = B - F - C;
+ 
+-      current->HDisplay   = (E * 8);
+-      current->HSyncStart = (E * 8) + (F * 8);
+-      current->HSyncEnd   = (E * 8) + (F * 8) + (C * 8);
+-      current->HTotal     = (E * 8) + (F * 8) + (C * 8) + (D * 8);
++      if((pSiS->SiS_Pr->SiS_RefIndex[i].XRes == 320) &&
++	 ((pSiS->SiS_Pr->SiS_RefIndex[i].YRes == 200) ||
++	  (pSiS->SiS_Pr->SiS_RefIndex[i].YRes == 240))) {
++
++	 /* Terrible hack, but correct CRTC data for
++	  * these modes only produces a black screen...
++	  * (HRE is 0, leading into a too large C and
++	  * a negative D. The CRT controller does not
++	  * seem to like correcting HRE to 50
++	  */
++	 current->HDisplay   = 320;
++         current->HSyncStart = 328;
++         current->HSyncEnd   = 376;
++         current->HTotal     = 400;
++
++      } else {
++
++         current->HDisplay   = (E * 8);
++         current->HSyncStart = (E * 8) + (F * 8);
++         current->HSyncEnd   = (E * 8) + (F * 8) + (C * 8);
++         current->HTotal     = (E * 8) + (F * 8) + (C * 8) + (D * 8);
++
++      }
+ 
+ #ifdef TWDEBUG
+       xf86DrvMsg(0, X_INFO,
+@@ -5430,7 +5638,7 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
+ 	 current->VSyncStart <<= 1;
+ 	 current->VSyncEnd <<= 1;
+ 	 current->VTotal <<= 1;
+-	 current->VTotal |= 1; 
++	 current->VTotal |= 1;
+       }
+       if(current->Flags & V_DBLSCAN) {
+          current->Clock >>= 1;
+@@ -5440,6 +5648,7 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
+ 	 current->VTotal >>= 1;
+       }
+ 
++#if 0
+       if((backup = xalloc(sizeof(DisplayModeRec)))) {
+          if(!pSiS->backupmodelist) pSiS->backupmodelist = backup;
+ 	 else {
+@@ -5458,6 +5667,7 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
+ 	 backup->Flags = current->Flags;
+ 	 backup->Clock = current->Clock;
+       }
++#endif
+ 
+ #ifdef TWDEBUG
+       xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+@@ -5470,6 +5680,187 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
+       i++;
+    }
+ 
++   /* Add non-standard LCD modes for panel's detailed timings */
++
++   if(!includelcdmodes) return first;
++
++   xf86DrvMsg(0, X_INFO, "Checking database for vendor %x, product %x\n",
++      pSiS->SiS_Pr->CP_Vendor, pSiS->SiS_Pr->CP_Product);
++
++   i = 0;
++   while((!done) && (SiS_PlasmaTable[i].vendor) && (pSiS->SiS_Pr->CP_Vendor)) {
++
++     if(SiS_PlasmaTable[i].vendor == pSiS->SiS_Pr->CP_Vendor) {
++
++        for(j=0; j<SiS_PlasmaTable[i].productnum; j++) {
++
++	    if(SiS_PlasmaTable[i].product[j] == pSiS->SiS_Pr->CP_Product) {
++
++	       xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
++	       	  "Identified %s panel, adding specific modes\n",
++		  SiS_PlasmaTable[i].plasmaname);
++
++	       for(k=0; k<SiS_PlasmaTable[i].modenum; k++) {
++
++	          if(isfordvi) {
++		     if(!(SiS_PlasmaTable[i].plasmamodes[k] & 0x80)) continue;
++		  } else {
++		     if(!(SiS_PlasmaTable[i].plasmamodes[k] & 0x40)) continue;
++		  }
++
++	          if(!(new = xalloc(sizeof(DisplayModeRec)))) return first;
++
++                  memset(new, 0, sizeof(DisplayModeRec));
++                  if(!(new->name = xalloc(10))) {
++      		     xfree(new);
++		     return first;
++                  }
++                  if(!first) first = new;
++                  if(current) {
++                     current->next = new;
++	             new->prev = current;
++                  }
++
++                  current = new;
++
++		  pSiS->AddedPlasmaModes = TRUE;
++
++		  l = SiS_PlasmaTable[i].plasmamodes[k] & 0x3f;
++
++	          sprintf(current->name, "%dx%d", SiS_PlasmaMode[l].HDisplay,
++                                                  SiS_PlasmaMode[l].VDisplay);
++
++                  current->status = MODE_OK;
++
++                  current->type = M_T_BUILTIN;
++
++		  current->Clock = SiS_PlasmaMode[l].clock;
++            	  current->SynthClock = current->Clock;
++
++                  current->HDisplay   = SiS_PlasmaMode[l].HDisplay;
++                  current->HSyncStart = current->HDisplay + SiS_PlasmaMode[l].HFrontPorch;
++                  current->HSyncEnd   = current->HSyncStart + SiS_PlasmaMode[l].HSyncWidth;
++                  current->HTotal     = SiS_PlasmaMode[l].HTotal;
++
++		  current->VDisplay   = SiS_PlasmaMode[l].VDisplay;
++                  current->VSyncStart = current->VDisplay + SiS_PlasmaMode[l].VFrontPorch;
++                  current->VSyncEnd   = current->VSyncStart + SiS_PlasmaMode[l].VSyncWidth;
++                  current->VTotal     = SiS_PlasmaMode[l].VTotal;
++
++                  current->CrtcHDisplay = current->HDisplay;
++                  current->CrtcHBlankStart = current->HSyncStart;
++                  current->CrtcHSyncStart = current->HSyncStart;
++                  current->CrtcHSyncEnd = current->HSyncEnd;
++                  current->CrtcHBlankEnd = current->HSyncEnd;
++                  current->CrtcHTotal = current->HTotal;
++
++                  current->CrtcVDisplay = current->VDisplay;
++                  current->CrtcVBlankStart = current->VSyncStart;
++                  current->CrtcVSyncStart = current->VSyncStart;
++                  current->CrtcVSyncEnd = current->VSyncEnd;
++                  current->CrtcVBlankEnd = current->VSyncEnd;
++                  current->CrtcVTotal = current->VTotal;
++
++                  if(SiS_PlasmaMode[l].SyncFlags & SIS_PL_HSYNCP)
++                     current->Flags |= V_PHSYNC;
++                  else
++                     current->Flags |= V_NHSYNC;
++
++                  if(SiS_PlasmaMode[l].SyncFlags & SIS_PL_VSYNCP)
++                     current->Flags |= V_PVSYNC;
++                  else
++                     current->Flags |= V_NVSYNC;
++
++		  if(current->HDisplay > pSiS->LCDwidth)
++		     pSiS->LCDwidth = pSiS->SiS_Pr->CP_MaxX = current->HDisplay;
++	          if(current->VDisplay > pSiS->LCDheight)
++		     pSiS->LCDheight = pSiS->SiS_Pr->CP_MaxY = current->VDisplay;
++
++               }
++	       done = TRUE;
++	       break;
++	    }
++	}
++     }
++
++     i++;
++
++   }
++
++   if(pSiS->SiS_Pr->CP_HaveCustomData) {
++
++      for(i=0; i<7; i++) {
++
++         if(pSiS->SiS_Pr->CP_DataValid[i]) {
++
++            if(!(new = xalloc(sizeof(DisplayModeRec)))) return first;
++
++            memset(new, 0, sizeof(DisplayModeRec));
++            if(!(new->name = xalloc(10))) {
++      		xfree(new);
++		return first;
++            }
++            if(!first) first = new;
++            if(current) {
++               current->next = new;
++	       new->prev = current;
++            }
++
++            current = new;
++
++            sprintf(current->name, "%dx%d", pSiS->SiS_Pr->CP_HDisplay[i],
++                                            pSiS->SiS_Pr->CP_VDisplay[i]);
++
++            current->status = MODE_OK;
++
++            current->type = M_T_BUILTIN;
++
++            current->Clock = pSiS->SiS_Pr->CP_Clock[i];
++            current->SynthClock = current->Clock;
++
++            current->HDisplay   = pSiS->SiS_Pr->CP_HDisplay[i];
++            current->HSyncStart = pSiS->SiS_Pr->CP_HSyncStart[i];
++            current->HSyncEnd   = pSiS->SiS_Pr->CP_HSyncEnd[i];
++            current->HTotal     = pSiS->SiS_Pr->CP_HTotal[i];
++
++            current->VDisplay   = pSiS->SiS_Pr->CP_VDisplay[i];
++            current->VSyncStart = pSiS->SiS_Pr->CP_VSyncStart[i];
++            current->VSyncEnd   = pSiS->SiS_Pr->CP_VSyncEnd[i];
++            current->VTotal     = pSiS->SiS_Pr->CP_VTotal[i];
++
++            current->CrtcHDisplay = current->HDisplay;
++            current->CrtcHBlankStart = pSiS->SiS_Pr->CP_HBlankStart[i];
++            current->CrtcHSyncStart = current->HSyncStart;
++            current->CrtcHSyncEnd = current->HSyncEnd;
++            current->CrtcHBlankEnd = pSiS->SiS_Pr->CP_HBlankEnd[i];
++            current->CrtcHTotal = current->HTotal;
++
++            current->CrtcVDisplay = current->VDisplay;
++            current->CrtcVBlankStart = pSiS->SiS_Pr->CP_VBlankStart[i];
++            current->CrtcVSyncStart = current->VSyncStart;
++            current->CrtcVSyncEnd = current->VSyncEnd;
++            current->CrtcVBlankEnd = pSiS->SiS_Pr->CP_VBlankEnd[i];
++            current->CrtcVTotal = current->VTotal;
++
++	    if(pSiS->SiS_Pr->CP_SyncValid[i]) {
++               if(pSiS->SiS_Pr->CP_HSync_P[i])
++                  current->Flags |= V_PHSYNC;
++               else
++                  current->Flags |= V_NHSYNC;
++
++               if(pSiS->SiS_Pr->CP_VSync_P[i])
++                  current->Flags |= V_PVSYNC;
++               else
++                  current->Flags |= V_NVSYNC;
++	    } else {
++	       /* No sync data? Use positive sync... */
++	       current->Flags |= V_PHSYNC;
++	       current->Flags |= V_PVSYNC;
++	    }
++         }
++      }
++   }
++
+    return first;
+ 
+ }
+@@ -5486,25 +5877,25 @@ sisfb_mode_rate_to_dclock(SiS_Private *S
+     UCHAR  *ROMAddr  = HwDeviceExtension->pjVirtualRomBase;
+     ULONG  temp = 0;
+     int    Clock;
+-    
++
+     if(HwDeviceExtension->jChipType < SIS_315H) {
+ #ifdef SIS300
+        InitTo300Pointer(SiS_Pr, HwDeviceExtension);
+ #else
+-       return 65;
++       return 65 * 1000 * 1000;
+ #endif
+     } else {
+ #ifdef SIS315H
+        InitTo310Pointer(SiS_Pr, HwDeviceExtension);
+ #else
+-       return 65;
++       return 65 * 1000 * 1000;
+ #endif
+     }
+-    
++
+     temp = SiS_SearchModeID(SiS_Pr, ROMAddr, &ModeNo, &ModeIdIndex);
+     if(!temp) {
+     	printk(KERN_ERR "Could not find mode %x\n", ModeNo);
+-    	return 65;
++    	return 65 * 1000 * 1000;
+     }
+     
+     RefreshRateTableIndex = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].REFindex;
+@@ -5518,6 +5909,56 @@ sisfb_mode_rate_to_dclock(SiS_Private *S
+     return(Clock);
+ }
+ 
++BOOLEAN
++sisfb_gettotalfrommode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
++		       unsigned char modeno, int *htotal, int *vtotal, unsigned char rateindex)
++{
++    USHORT ModeNo = modeno;
++    USHORT ModeIdIndex = 0, CRT1Index = 0;
++    USHORT RefreshRateTableIndex = 0;
++    UCHAR  *ROMAddr  = HwDeviceExtension->pjVirtualRomBase;
++    ULONG  temp = 0;
++    unsigned char  sr_data, cr_data, cr_data2;
++
++    if(HwDeviceExtension->jChipType < SIS_315H) {
++#ifdef SIS300
++       InitTo300Pointer(SiS_Pr, HwDeviceExtension);
++#else
++       return FALSE;
++#endif
++    } else {
++#ifdef SIS315H
++       InitTo310Pointer(SiS_Pr, HwDeviceExtension);
++#else
++       return FALSE;
++#endif
++    }
++
++    temp = SiS_SearchModeID(SiS_Pr, ROMAddr, &ModeNo, &ModeIdIndex);
++    if(!temp) return FALSE;
++
++    RefreshRateTableIndex = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].REFindex;
++    RefreshRateTableIndex += (rateindex - 1);
++    CRT1Index = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
++
++    sr_data = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[14];
++    cr_data = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[0];
++    *htotal = (((cr_data & 0xff) | ((unsigned short) (sr_data & 0x03) << 8)) + 5) * 8;
++
++    sr_data = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[13];
++    cr_data = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[6];
++    cr_data2 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[7];
++    *vtotal = ((cr_data & 0xFF) |
++               ((unsigned short)(cr_data2 & 0x01) <<  8) |
++	       ((unsigned short)(cr_data2 & 0x20) <<  4) |
++	       ((unsigned short)(sr_data  & 0x01) << 10)) + 2;
++
++    if(SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag & InterlaceMode)
++       *vtotal *= 2;
++
++    return TRUE;
++}
++
+ int
+ sisfb_mode_rate_to_ddata(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ 			 unsigned char modeno, unsigned char rateindex,
+@@ -5606,17 +6047,32 @@ sisfb_mode_rate_to_ddata(SiS_Private *Si
+     C = (temp > 0) ? temp : (temp + 64);
+ 
+     D = B - F - C;
+-    
+-    *left_margin = D * 8;
+-    *right_margin = F * 8;
+-    *hsync_len = C * 8;
++
++    if((SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].XRes == 320) &&
++       ((SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].YRes == 200) ||
++	(SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].YRes == 240))) {
++
++	 /* Terrible hack, but the correct CRTC data for
++	  * these modes only produces a black screen...
++	  */
++       *left_margin = (400 - 376);
++       *right_margin = (328 - 320);
++       *hsync_len = (376 - 328);
++
++    } else {
++
++       *left_margin = D * 8;
++       *right_margin = F * 8;
++       *hsync_len = C * 8;
++
++    }
+ 
+     sr_data = SiS_Pr->SiS_CRT1Table[index].CR[13];
+ 
+     cr_data = SiS_Pr->SiS_CRT1Table[index].CR[6];
+-    
++
+     cr_data2 = SiS_Pr->SiS_CRT1Table[index].CR[7];
+-    
++
+     /* Vertical total */
+     VT = (cr_data & 0xFF) |
+          ((unsigned short) (cr_data2 & 0x01) << 8) |
+@@ -5699,19 +6155,19 @@ sisfb_mode_rate_to_ddata(SiS_Private *Si
+ 	  j++;
+       }
+     }       
+-       
+-#if 0  /* That's bullshit, only the resolution needs to be shifted */    
++
+     if((*vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) {
++#if 0  /* Do this? */
+        *upper_margin <<= 1;
+        *lower_margin <<= 1;
+        *vsync_len <<= 1;
++#endif
+     } else if((*vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) {
+        *upper_margin >>= 1;
+        *lower_margin >>= 1;
+        *vsync_len >>= 1;
+-    }  
+-#endif
+-          
++    }
++
+     return 1;       
+ }			  
+ 
+--- linux-2.6.0-test1/drivers/video/sis/initdef.h	2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/video/sis/initdef.h	2003-07-19 17:04:55.000000000 -0700
+@@ -1,5 +1,29 @@
+ /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/initdef.h,v 1.4 2000/12/02 01:16:17 dawes Exp $ */
+-
++/*
++ * Global definitions for init.c and init301.c
++ *
++ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of the copyright holder not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  The copyright holder makes no representations
++ * about the suitability of this software for any purpose.  It is provided
++ * "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
++ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++ * PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Author: 	Thomas Winischhofer <thomas@winischhofer.net>
++ */
+ 
+ #ifndef _INITDEF_
+ #define _INITDEF_
+@@ -22,12 +46,18 @@
+ #define VB_SIS301B302B          (VB_SIS301B|VB_SIS302B)
+ #define VB_SIS301LV302LV        (VB_SIS301LV|VB_SIS302LV)
+ 
+-#define IS_SIS650740            ((HwDeviceExtension->jChipType >= SIS_650) && (HwDeviceExtension->jChipType < SIS_330))
+-
+ #define IS_SIS650		(HwDeviceExtension->jChipType == SIS_650)
+ #define IS_SIS740		(HwDeviceExtension->jChipType == SIS_740)
+ #define IS_SIS330		(HwDeviceExtension->jChipType == SIS_330)
+ #define IS_SIS550		(HwDeviceExtension->jChipType == SIS_550)
++#define IS_SIS651	        (SiS_Pr->SiS_SysFlags & (SF_Is651 | SF_Is652))
++#define IS_SISM650	        (SiS_Pr->SiS_SysFlags & (SF_IsM650 | SF_IsM652 | SF_IsM653))
++#define IS_SIS65x               (IS_SIS651 || IS_SISM650)
++#define IS_SIS660		(HwDeviceExtension->jChipType == SIS_660)
++#define IS_SIS650660            (IS_SIS650 || IS_SIS660)
++#define IS_SIS650740            ((HwDeviceExtension->jChipType >= SIS_650) && (HwDeviceExtension->jChipType < SIS_330))
++#define IS_SIS650740660         (IS_SIS650 || IS_SIS660 || IS_SIS740)
++#define IS_SIS550650740660      (IS_SIS550 || IS_SIS650 || IS_SIS660 || IS_SIS740)
+ 
+ #define CRT1Len                 17
+ #define LVDSCRT1Len             15
+@@ -63,7 +93,7 @@
+ #define SupportTV               0x0008
+ #define SupportHiVisionTV       0x0010
+ #define SupportLCD              0x0020
+-#define SupportRAMDAC2          0x0040  
++#define SupportRAMDAC2          0x0040
+ #define NoSupportTV             0x0070
+ #define NoSupportHiVisionTV     0x0060
+ #define NoSupportLCD            0x0058
+@@ -105,6 +135,24 @@
+ #define HotKeySwitch            0x8000  /* TW: ? */
+ #define SetCRT2ToLCDA           0x8000
+ 
++/* SetFlag */
++#define ProgrammingCRT2         0x01
++#define TVSimuMode              0x02
++#define RPLLDIV2XO              0x04
++#define LCDVESATiming           0x08
++#define EnableLVDSDDA           0x10
++#define SetDispDevSwitchFlag    0x20
++#define CheckWinDos             0x40
++#define SetDOSMode              0x80
++
++/* SysFlags */
++#define SF_Is651                0x0001
++#define SF_IsM650               0x0002
++#define SF_Is652		0x0004
++#define SF_IsM652		0x0008
++#define SF_IsM653		0x0010
++#define SF_Is660		0x8000
++
+ #define PanelRGB18Bit           0x0100
+ #define PanelRGB24Bit           0x0000
+ 
+@@ -112,7 +160,7 @@
+ #define TVOverScanShift         4
+ #define ClearBufferFlag         0x20
+ 
+-/* CR32 (Newer 630, and 310/325 series)
++/* CR32 (Newer 630, and 315 series)
+ 
+    [0]   VB connected with CVBS
+    [1]   VB connected with SVHS
+@@ -134,7 +182,7 @@
+ 	    011   LVDS + Tumpion Zurac
+ 	    100   LVDS + Chrontel 7005
+ 	    110   Chrontel 7005
+-	  310/325 series
++	  315 series
+ 	    001   SiS30x (never seen)
+ 	    010   LVDS
+ 	    011   LVDS + Chrontel 7019
+@@ -163,14 +211,15 @@
+ #define LCDSyncBit            0x00e0
+ #define LCDSyncShift               6
+ 
+-/* CR38 (310/325 series) */
++/* CR38 (315 series) */
+ #define EnableDualEdge 		0x01   
+ #define SetToLCDA		0x02   /* LCD channel A (302B/LV and 650+LVDS only) */
+ #define EnableSiSHiVision       0x04   /* HiVision (HDTV) on SiS bridge */
+ #define EnableLVDSScart         0x04   /* Scart on Ch7019 (unofficial definition - TW) */
+ #define EnableLVDSHiVision      0x08   /* YPbPr color format (480i HDTV); only on 650/Ch7019 systems */
+-#define SiSHiVision1            0x10   /* See SetHiVision() */
+-#define SiSHiVision2            0x20
++#define EnableHiVision750       0x08   /* Enable 750P HiVision mode (30xLV only) */
++#define EnableHiVision525       0x10   /* Enable 525P HiVision mode (30xLV only) */
++#define SiSHiVision2            0x20   /* ? - |  --- mask 0x38 combinations have different meaning! */
+ #define EnablePALM              0x40   /* 1 = Set PALM */
+ #define EnablePALN              0x80   /* 1 = Set PALN */
+ 
+@@ -184,7 +233,7 @@
+ #define Enable302LV_DualLink    0x04   /* 30xNEW (302LV) only; set by mode switching function */
+ 
+ 
+-/* CR79 (310/325 series only)
++/* CR79 (315 series only)
+    [3-0] Notify driver
+          0001 Mode Switch event (set by BIOS)
+ 	 0010 Epansion On/Off event
+@@ -202,16 +251,6 @@
+    [7]   TV UnderScan/OverScan (set by BIOS)
+ */
+ 
+-/* SetFlag */
+-#define ProgrammingCRT2         0x01
+-#define TVSimuMode              0x02
+-#define RPLLDIV2XO              0x04
+-#define LCDVESATiming           0x08
+-#define EnableLVDSDDA           0x10
+-#define SetDispDevSwitchFlag    0x20
+-#define CheckWinDos             0x40
+-#define SetDOSMode              0x80
+-
+ /* LCDResInfo */
+ #define Panel300_800x600        0x01	/* CR36 */
+ #define Panel300_1024x768       0x02
+@@ -220,7 +259,10 @@
+ #define Panel300_640x480        0x05
+ #define Panel300_1024x600       0x06
+ #define Panel300_1152x768       0x07
+-#define Panel300_320x480        0x08 	/* fstn - TW: This is fake, can be any */
++#define Panel300_1280x768       0x0a
++#define Panel300_320x480        0x0e 	/* fstn - TW: This is fake, can be any */
++#define Panel300_Custom		0x0f
++#define Panel300_Barco1366      0x10
+ 
+ #define Panel310_800x600        0x01
+ #define Panel310_1024x768       0x02
+@@ -231,9 +273,12 @@
+ #define Panel310_1280x960       0x07
+ #define Panel310_1152x768       0x08	/* LVDS only */
+ #define Panel310_1400x1050      0x09
+-#define Panel310_1280x768       0x0a    /* LVDS only */
++#define Panel310_1280x768       0x0a
+ #define Panel310_1600x1200      0x0b
+-#define Panel310_320x480        0x0c    /* fstn - TW: This is fake, can be any */
++#define Panel310_640x480_2      0x0c
++#define Panel310_640x480_3      0x0d
++#define Panel310_320x480        0x0e    /* fstn - TW: This is fake, can be any */
++#define Panel310_Custom		0x0f
+ 
+ #define Panel_800x600           0x01	/* Unified values */
+ #define Panel_1024x768          0x02
+@@ -246,7 +291,42 @@
+ #define Panel_1400x1050         0x09
+ #define Panel_1280x768          0x0a    /* LVDS only */
+ #define Panel_1600x1200         0x0b
+-#define Panel_320x480           0x0c    /* fstn - TW: This is fake, can be any */
++#define Panel_640x480_2		0x0c
++#define Panel_640x480_3		0x0d
++#define Panel_320x480           0x0e    /* fstn - TW: This is fake, can be any */
++#define Panel_Custom		0x0f
++#define Panel_Barco1366         0x10
++
++/* Index in ModeResInfo table */
++#define SIS_RI_320x200 0
++#define SIS_RI_320x240 1
++#define SIS_RI_320x400 2
++#define SIS_RI_400x300 3
++#define SIS_RI_512x384 4
++#define SIS_RI_640x400 5
++#define SIS_RI_640x480 6
++#define SIS_RI_800x600 7
++#define SIS_RI_1024x768 8
++#define SIS_RI_1280x1024 9
++#define SIS_RI_1600x1200 10
++#define SIS_RI_1920x1440 11
++#define SIS_RI_2048x1536 12
++#define SIS_RI_720x480 13
++#define SIS_RI_720x576 14
++#define SIS_RI_1280x960 15
++#define SIS_RI_800x480 16
++#define SIS_RI_1024x576 17
++#define SIS_RI_1280x720 18
++#define SIS_RI_856x480 19
++#define SIS_RI_1280x768 20
++#define SIS_RI_1400x1050 21
++#define SIS_RI_1152x864 22
++#define SIS_RI_848x480 23
++#define SIS_RI_1360x768 24
++#define SIS_RI_1024x600 25
++#define SIS_RI_1152x768 26
++#define SIS_RI_768x576 27
++#define SIS_RI_1360x1024 28
+ 
+ #define ExtChipType             0x0e
+ #define ExtChip301              0x02
+@@ -278,15 +358,32 @@
+ #define VCLKStartFreq           25
+ #define SoftDramType            0x80
+ 
+-#define VCLK40                  0x04   /* Index in VCLKData array */
+-#define VCLK65                  0x09   /* Index in VCLKData array */
+-#define VCLK108_2               0x14   /* Index in VCLKData array */
+-#define TVVCLKDIV2              0x21   /* Indices in (VB)VCLKData arrays */
+-#define TVVCLK                  0x22
+-#define HiTVVCLKDIV2            0x23
+-#define HiTVVCLK                0x24
+-#define HiTVSimuVCLK            0x25
+-#define HiTVTextVCLK            0x26
++/* Indices in (VB)VCLKData tables */
++
++#define VCLK28                  0x00   /* Index in VCLKData table (300 and 315) */
++#define VCLK40                  0x04   /* Index in VCLKData table (300 and 315) */
++#define VCLK65_300              0x09   /* Index in VCLKData table (300) */
++#define VCLK108_2_300           0x14   /* Index in VCLKData table (300) */
++#define VCLK81_300		0x3f   /* Index in VCLKData table (300) */
++#define VCLK108_3_300           0x42   /* Index in VCLKData table (300) */
++#define VCLK100_300             0x43   /* Index in VCLKData table (300) */
++#define VCLK65_315              0x0b   /* Index in (VB)VCLKData table (315) */
++#define VCLK108_2_315           0x19   /* Index in (VB)VCLKData table (315) */
++#define VCLK81_315		0x5b   /* Index in (VB)VCLKData table (315) */
++#define VCLK162_315             0x21   /* Index in (VB)VCLKData table (315) */
++#define VCLK108_3_315           0x45   /* Index in VBVCLKData table (315) */
++#define VCLK100_315             0x46   /* Index in VBVCLKData table (315) */
++
++#define TVCLKBASE_300		0x21   /* Indices on TV clocks in VCLKData table (300) */
++#define TVCLKBASE_315	        0x3a   /* Indices on TV clocks in (VB)VCLKData table (315) */
++#define TVVCLKDIV2              0x00   /* Index relative to TVCLKBASE */
++#define TVVCLK                  0x01   /* Index relative to TVCLKBASE */
++#define HiTVVCLKDIV2            0x02   /* Index relative to TVCLKBASE */
++#define HiTVVCLK                0x03   /* Index relative to TVCLKBASE */
++#define HiTVSimuVCLK            0x04   /* Index relative to TVCLKBASE */
++#define HiTVTextVCLK            0x05   /* Index relative to TVCLKBASE */
++
++/* ------------------------------ */
+ 
+ #define LoadDACFlag             0x1000
+ #define AfterLockCRT2           0x4000
+@@ -306,6 +403,8 @@
+ #define HotPlugFunction         0x08
+ #define StStructSize            0x06
+ 
++#define SIS_VIDEO_CAPTURE       0x00 - 0x30
++#define SIS_VIDEO_PLAYBACK      0x02 - 0x30
+ #define SIS_CRT2_PORT_04        0x04 - 0x30
+ #define SIS_CRT2_PORT_10        0x10 - 0x30
+ #define SIS_CRT2_PORT_12        0x12 - 0x30
+@@ -393,7 +492,7 @@
+ 
+ /*
+   =============================================================
+-   			for 310/325 series
++   			  for 315 series
+   =============================================================
+ */
+ #define SoftDRAMType        0x80
+--- linux-2.6.0-test1/drivers/video/sis/init.h	2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/video/sis/init.h	2003-07-19 17:04:55.000000000 -0700
+@@ -1,19 +1,39 @@
++/* $XFree86$ */
++/*
++ * Data and prototypes for init.c
++ *
++ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of the copyright holder not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  The copyright holder makes no representations
++ * about the suitability of this software for any purpose.  It is provided
++ * "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
++ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++ * PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Author: 	Thomas Winischhofer <thomas@winischhofer.net>
++ */
++
+ #ifndef _INIT_
+ #define _INIT_
+ 
+ #include "osdef.h"
++
+ #include "initdef.h"
+ #include "vgatypes.h"
+ #include "vstruct.h"
+ 
+-#ifdef TC
+-#include <stdio.h>
+-#include <string.h>
+-#include <conio.h>
+-#include <dos.h>
+-#include <stdlib.h>
+-#endif
+-
+ #ifdef LINUX_XF86
+ #include "xf86.h"
+ #include "xf86Pci.h"
+@@ -24,6 +44,9 @@
+ #endif
+ 
+ #ifdef LINUX_KERNEL
++#ifdef SIS_CP
++#undef SIS_CP
++#endif
+ #include <linux/config.h>
+ #include <linux/version.h>
+ #include <linux/types.h>
+@@ -36,19 +59,6 @@
+ #endif
+ #endif
+ 
+-#ifdef WIN2000
+-#include <stdio.h>
+-#include <string.h>
+-#include <miniport.h>
+-#include "dderror.h"
+-#include "devioctl.h"
+-#include "miniport.h"
+-#include "ntddvdeo.h"
+-#include "video.h"
+-#include "sisv.h"
+-#include "tools.h"
+-#endif
+-
+ const USHORT SiS_DRAMType[17][5]={
+ 	{0x0C,0x0A,0x02,0x40,0x39},
+ 	{0x0D,0x0A,0x01,0x40,0x48},
+@@ -144,6 +154,2175 @@ const USHORT SiS_VGA_DAC[] =
+ 	0x0B,0x0C,0x0D,0x0F,0x10
+ };
+ 
++static const SiS_StResInfoStruct SiS_StResInfo[]=
++{
++	{ 640,400},
++	{ 640,350},
++	{ 720,400},
++	{ 720,350},
++	{ 640,480}
++};
++
++static const SiS_ModeResInfoStruct SiS_ModeResInfo[] =
++{
++	{  320, 200, 8, 8},   /* 0x00 */
++	{  320, 240, 8, 8},   /* 0x01 */
++	{  320, 400, 8, 8},   /* 0x02 */
++	{  400, 300, 8, 8},   /* 0x03 */
++	{  512, 384, 8, 8},   /* 0x04 */
++	{  640, 400, 8,16},   /* 0x05 */
++	{  640, 480, 8,16},   /* 0x06 */
++	{  800, 600, 8,16},   /* 0x07 */
++	{ 1024, 768, 8,16},   /* 0x08 */
++	{ 1280,1024, 8,16},   /* 0x09 */
++	{ 1600,1200, 8,16},   /* 0x0a */
++	{ 1920,1440, 8,16},   /* 0x0b */
++	{ 2048,1536, 8,16},   /* 0x0c */
++	{  720, 480, 8,16},   /* 0x0d */
++	{  720, 576, 8,16},   /* 0x0e */
++	{ 1280, 960, 8,16},   /* 0x0f */
++	{  800, 480, 8,16},   /* 0x10 */
++	{ 1024, 576, 8,16},   /* 0x11 */
++	{ 1280, 720, 8,16},   /* 0x12 */
++	{  856, 480, 8,16},   /* 0x13 */
++	{ 1280, 768, 8,16},   /* 0x14 */
++	{ 1400,1050, 8,16},   /* 0x15 */
++	{ 1152, 864, 8,16},   /* 0x16 */
++	{  848, 480, 8,16},   /* 0x17 */
++	{ 1360, 768, 8,16},   /* 0x18 */
++	{ 1024, 600, 8,16},   /* 0x19 */
++	{ 1152, 768, 8,16},   /* 0x1a */
++	{  768, 576, 8,16},   /* 0x1b */
++	{ 1360,1024, 8,16}    /* 0x1c */
++};
++
++static SiS_StandTableStruct SiS_StandTable[]=
++{
++/* 0x00: MD_0_200 */
++ {
++  0x28,0x18,0x08,0x0800,
++  {0x09,0x03,0x00,0x02},
++  0x63,
++  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
++   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x14,0x1f,0x96,0xb9,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
++   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
++   0x08,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x01: MD_1_200 */
++ {
++  0x28,0x18,0x08,0x0800,
++  {0x09,0x03,0x00,0x02},
++  0x63,
++  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
++   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x14,0x1f,0x96,0xb9,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
++   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
++   0x08,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x02: MD_2_200 */
++ {
++  0x50,0x18,0x08,0x1000,
++  {0x01,0x03,0x00,0x02},
++  0x63,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
++   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
++   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
++   0x08,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x03: MD_3_200 - mode 0x03 - 0 */
++ {
++  0x50,0x18,0x08,0x1000,
++  {0x01,0x03,0x00,0x02},
++  0x63,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
++   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
++   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
++   0x08,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x04: MD_4 */
++ {
++  0x28,0x18,0x08,0x4000,
++  {0x09,0x03,0x00,0x02},
++  0x63,
++  {0x2d,0x27,0x28,0x90,0x2c,0x80,0xbf,0x1f,   /* 0x2c is 2b for 300 */
++   0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x14,0x00,0x96,0xb9,0xa2,
++   0xff},
++  {0x00,0x13,0x15,0x17,0x02,0x04,0x06,0x07,
++   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
++   0x01,0x00,0x03,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x30,0x0f,0x00,
++   0xff}
++ },
++/* 0x05: MD_5 */
++ {
++  0x28,0x18,0x08,0x4000,
++  {0x09,0x03,0x00,0x02},
++  0x63,
++  {0x2d,0x27,0x28,0x90,0x2c,0x80,0xbf,0x1f,   /* 0x2c is 2b for 300 */
++   0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x14,0x00,0x96,0xb9,0xa2,
++   0xff},
++  {0x00,0x13,0x15,0x17,0x02,0x04,0x06,0x07,
++   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
++   0x01,0x00,0x03,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x30,0x0f,0x00,
++   0xff}
++ },
++/* 0x06: MD_6 */
++ {
++  0x50,0x18,0x08,0x4000,
++  {0x01,0x01,0x00,0x06},
++  0x63,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,   /* 55,81 is 54,80 for 300 */
++   0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x28,0x00,0x96,0xb9,0xc2,
++   0xff},
++  {0x00,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
++   0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
++   0x01,0x00,0x01,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,
++   0xff}
++ },
++/* 0x07: MD_7 */
++ {
++  0x50,0x18,0x0e,0x1000,
++  {0x00,0x03,0x00,0x03},
++  0xa6,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
++   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
++   0x83,0x85,0x5d,0x28,0x0d,0x63,0xba,0xa3,
++   0xff},
++  {0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
++   0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
++   0x0e,0x00,0x0f,0x08},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0a,0x00,
++   0xff}
++ },
++/* 0x08: MDA_DAC */
++ {
++  0x00,0x00,0x00,0x0000,
++  {0x00,0x00,0x00,0x15},
++  0x15,
++  {0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
++   0x15,0x15,0x15,0x15,0x15,0x15,0x3f,0x3f,
++   0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x00,0x00,
++   0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x15,
++   0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
++   0x15,0x15,0x15,0x15},
++  {0x15,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
++   0x3f}
++ },
++/* 0x09: CGA_DAC */
++ {
++  0x00,0x10,0x04,0x0114,
++  {0x11,0x09,0x15,0x00},
++  0x10,
++  {0x04,0x14,0x01,0x11,0x09,0x15,0x2a,0x3a,
++   0x2e,0x3e,0x2b,0x3b,0x2f,0x3f,0x2a,0x3a,
++   0x2e,0x3e,0x2b,0x3b,0x2f,0x3f,0x00,0x10,
++   0x04},
++  {0x14,0x01,0x11,0x09,0x15,0x00,0x10,0x04,
++   0x14,0x01,0x11,0x09,0x15,0x2a,0x3a,0x2e,
++   0x3e,0x2b,0x3b,0x2f},
++  {0x3f,0x2a,0x3a,0x2e,0x3e,0x2b,0x3b,0x2f,
++   0x3f}
++ },
++/* 0x0a: EGA_DAC */
++ {
++  0x00,0x10,0x04,0x0114,
++  {0x11,0x05,0x15,0x20},
++  0x30,
++  {0x24,0x34,0x21,0x31,0x25,0x35,0x08,0x18,
++   0x0c,0x1c,0x09,0x19,0x0d,0x1d,0x28,0x38,
++   0x2c,0x3c,0x29,0x39,0x2d,0x3d,0x02,0x12,
++   0x06},
++  {0x16,0x03,0x13,0x07,0x17,0x22,0x32,0x26,
++   0x36,0x23,0x33,0x27,0x37,0x0a,0x1a,0x0e,
++   0x1e,0x0b,0x1b,0x0f},
++  {0x1f,0x2a,0x3a,0x2e,0x3e,0x2b,0x3b,0x2f,
++   0x3f}
++ },
++/* 0x0b: VGA_DAC */
++ {
++  0x00,0x10,0x04,0x0114,
++  {0x11,0x09,0x15,0x2a},
++  0x3a,
++  {0x2e,0x3e,0x2b,0x3b,0x2f,0x3f,0x00,0x05,
++   0x08,0x0b,0x0e,0x11,0x14,0x18,0x1c,0x20,
++   0x24,0x28,0x2d,0x32,0x38,0x3f,0x00,0x10,
++   0x1f},
++  {0x2f,0x3f,0x1f,0x27,0x2f,0x37,0x3f,0x2d,
++   0x31,0x36,0x3a,0x3f,0x00,0x07,0x0e,0x15,
++   0x1c,0x0e,0x11,0x15},
++  {0x18,0x1c,0x14,0x16,0x18,0x1a,0x1c,0x00,
++   0x04}
++ },
++/* 0x0c */
++ {
++  0x08,0x0c,0x10,0x0a08,
++  {0x0c,0x0e,0x10,0x0b},
++  0x0c,
++  {0x0d,0x0f,0x10,0x10,0x01,0x08,0x00,0x00,
++   0x00,0x00,0x01,0x00,0x02,0x02,0x01,0x00,
++   0x04,0x04,0x01,0x00,0x05,0x02,0x05,0x00,
++   0x06},
++  {0x01,0x06,0x05,0x06,0x00,0x08,0x01,0x08,
++   0x00,0x07,0x02,0x07,0x06,0x07,0x00,0x00,
++   0x00,0x00,0x00,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x00}
++ },
++/* 0x0d: MD_D */
++ {
++  0x28,0x18,0x08,0x2000,
++  {0x09,0x0f,0x00,0x06},
++  0x63,
++  {0x2d,0x27,0x28,0x90,0x2c,0x80,0xbf,0x1f,     /* 2c is 2b for 300 */
++   0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x14,0x00,0x96,0xb9,0xe3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
++   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
++   0x01,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
++   0xff}
++ },
++/* 0x0e: MD_E */
++ {
++  0x50,0x18,0x08,0x4000,
++  {0x01,0x0f,0x00,0x06},
++  0x63,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,     /* 55,81 is 54,80 for 300 */
++   0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x28,0x00,0x96,0xb9,0xe3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
++   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
++   0x01,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
++   0xff}
++ },
++/* 0x0f: ExtVGATable - modes > 0x13 */
++ {
++  0x00,0x00,0x00,0x0000,
++  {0x01,0x0f,0x00,0x0e},
++  0x23,
++  {0x5f,0x4f,0x50,0x82,0x54,0x80,0x0b,0x3e,
++   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
++   0xea,0x8c,0xdf,0x28,0x40,0xe7,0x04,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
++   0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
++   0x01,0x00,0x00,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0f,
++   0xff}
++ },
++/* 0x10: ROM_SAVEPTR - totally different for 300 */
++ {
++  0x9f,0x3b,0x00,0x00c0,
++  {0x00,0x00,0x00,0x00},
++  0x00,
++  {0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x3f,
++   0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x00,0x00,0x1a,0x00,0xac,0x3e,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}
++ },
++/* 0x11: MD_F */
++ {
++  0x50,0x18,0x0e,0x8000,
++  {0x01,0x0f,0x00,0x06},
++  0xa2,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,    /* 55,81 is 54,80 on 300 */
++   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x82,0x84,0x5d,0x28,0x0f,0x63,0xba,0xe3,    /* 82,84 is 83,85 on 300 */
++   0xff},
++  {0x00,0x08,0x00,0x00,0x18,0x18,0x00,0x00,
++   0x00,0x08,0x00,0x00,0x00,0x18,0x00,0x00,
++   0x0b,0x00,0x05,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,
++   0xff}
++ },
++/* 0x12: MD_10 */
++ {
++  0x50,0x18,0x0e,0x8000,
++  {0x01,0x0f,0x00,0x06},
++  0xa3,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,    /* 55,81 is 54,80 on 300 */
++   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x82,0x84,0x5d,0x28,0x0f,0x63,0xba,0xe3,    /* 82,84 is 83,85 on 300 */
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
++   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
++   0x01,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
++   0xff}
++ },
++/* 0x13: MD_0_350 */
++ {
++  0x28,0x18,0x0e,0x0800,
++  {0x09,0x03,0x00,0x02},
++  0xa3,
++  {0x2d,0x27,0x28,0x90,0x2b,0xb1,0xbf,0x1f,    /* b1 is a0 on 300 */
++   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
++   0x83,0x85,0x5d,0x14,0x1f,0x63,0xba,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
++   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
++   0x08,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x14: MD_1_350 */
++ {
++  0x28,0x18,0x0e,0x0800,
++  {0x09,0x03,0x00,0x02},
++  0xa3,
++  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
++   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
++   0x83,0x85,0x5d,0x14,0x1f,0x63,0xba,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
++   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
++   0x08,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x15: MD_2_350 */
++ {
++  0x50,0x18,0x0e,0x1000,
++  {0x01,0x03,0x00,0x02},
++  0xa3,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
++   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
++   0x83,0x85,0x5d,0x28,0x1f,0x63,0xba,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
++   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
++   0x08,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x16: MD_3_350 - mode 0x03 - 1 */
++ {
++  0x50,0x18,0x0e,0x1000,
++  {0x01,0x03,0x00,0x02},
++  0xa3,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
++   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
++   0x83,0x85,0x5d,0x28,0x1f,0x63,0xba,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
++   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
++   0x08,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x17: MD_0_1_400 */
++ {
++  0x28,0x18,0x10,0x0800,
++  {0x08,0x03,0x00,0x02},
++  0x67,
++  {0x2d,0x27,0x28,0x90,0x2b,0xb1,0xbf,0x1f,    /* b1 is a0 on 300 */
++   0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x14,0x1f,0x96,0xb9,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
++   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
++   0x0c,0x00,0x0f,0x08},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x18: MD_2_3_400 - mode 0x03 - 2 */
++ {
++  0x50,0x18,0x10,0x1000,
++  {0x00,0x03,0x00,0x02},
++  0x67,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
++   0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
++   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
++   0x0c,0x00,0x0f,0x08},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x19: MD_7_400 */
++ {
++  0x50,0x18,0x10,0x1000,
++  {0x00,0x03,0x00,0x02},
++  0x66,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
++   0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x28,0x0f,0x96,0xb9,0xa3,
++   0xff},
++  {0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
++   0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
++   0x0e,0x00,0x0f,0x08},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0a,0x00,
++   0xff}
++ },
++/* 0x1a: MD_11 */
++ {
++  0x50,0x1d,0x10,0xa000,
++  {0x01,0x0f,0x00,0x06},
++  0xe3,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0x0b,0x3e,    /* 55,81 is 54,80 on 300 */
++   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
++   0xe9,0x8b,0xdf,0x28,0x00,0xe7,0x04,0xc3,    /* e9,8b is ea,8c on 300 */
++   0xff},
++  {0x00,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
++   0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
++   0x01,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01,
++   0xff}
++ },
++/* 0x1b: ExtEGATable - Modes <= 0x02 */
++ {
++  0x50,0x1d,0x10,0xa000,
++  {0x01,0x0f,0x00,0x06},
++  0xe3,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0x0b,0x3e,    /* 55,81 is 54,80 on 300 */
++   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
++   0xe9,0x8b,0xdf,0x28,0x00,0xe7,0x04,0xe3,    /* e9,8b is ea,8c on 300 */
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
++   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
++   0x01,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
++   0xff}
++ },
++/* 0x1c: MD_13 */
++ {
++  0x28,0x18,0x08,0x2000,
++  {0x01,0x0f,0x00,0x0e},
++  0x63,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,    /* 55,81 is 54,80 on 300 */
++   0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x28,0x40,0x96,0xb9,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
++   0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
++   0x41,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0f,
++   0xff}
++ }
++};
++
++static const UCHAR SiS_NTSCTiming[] = {
++	0x17,0x1d,0x03,0x09,0x05,0x06,0x0c,0x0c,
++	0x94,0x49,0x01,0x0a,0x06,0x0d,0x04,0x0a,
++	0x06,0x14,0x0d,0x04,0x0a,0x00,0x85,0x1b,
++	0x0c,0x50,0x00,0x97,0x00,0xda,0x4a,0x17,
++	0x7d,0x05,0x4b,0x00,0x00,0xe2,0x00,0x02,
++	0x03,0x0a,0x65,0x9d,0x08,0x92,0x8f,0x40,
++	0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x50,
++	0x00,0x40,0x44,0x00,0xdb,0x02,0x3b,0x00
++};
++
++static const UCHAR SiS_PALTiming[] = {
++	0x19,0x52,0x35,0x6e,0x04,0x38,0x3d,0x70,
++	0x94,0x49,0x01,0x12,0x06,0x3e,0x35,0x6d,
++	0x06,0x14,0x3e,0x35,0x6d,0x00,0x45,0x2b,
++	0x70,0x50,0x00,0x9b,0x00,0xd9,0x5d,0x17,
++	0x7d,0x05,0x45,0x00,0x00,0xe8,0x00,0x02,
++	0x0d,0x00,0x68,0xb0,0x0b,0x92,0x8f,0x40,
++	0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x63,
++	0x00,0x40,0x3e,0x00,0xe1,0x02,0x28,0x00
++};
++
++static const UCHAR SiS_HiTVExtTiming[] = {
++        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x64,
++	0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
++	0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
++	0x64,0x90,0x33,0x8c,0x18,0x36,0x3e,0x13,
++	0x2a,0xde,0x2a,0x44,0x40,0x2a,0x44,0x40,
++	0x8e,0x8e,0x82,0x07,0x0b,0x92,0x0f,0x40,
++	0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x3d,
++	0x63,0x4f,0x27,0x00,0xfc,0xff,0x6a,0x00
++};
++
++static const UCHAR SiS_HiTVSt1Timing[] = {
++        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x65,
++	0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
++	0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
++	0x65,0x90,0x7b,0xa8,0x03,0xf0,0x87,0x03,
++	0x11,0x15,0x11,0xcf,0x10,0x11,0xcf,0x10,
++	0x35,0x35,0x3b,0x69,0x1d,0x92,0x0f,0x40,
++	0x60,0x80,0x14,0x90,0x8c,0x60,0x04,0x86,
++	0xaf,0x5d,0x0e,0x00,0xfc,0xff,0x2d,0x00
++};
++
++static const UCHAR SiS_HiTVSt2Timing[] = {
++        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x64,
++	0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
++	0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
++	0x64,0x90,0x33,0x8c,0x18,0x36,0x3e,0x13,
++	0x2a,0xde,0x2a,0x44,0x40,0x2a,0x44,0x40,
++	0x8e,0x8e,0x82,0x07,0x0b,0x92,0x0f,0x40,
++	0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x3d,
++	0x63,0x4f,0x27,0x00,0xfc,0xff,0x6a,0x00
++};
++
++static const UCHAR SiS_HiTVTextTiming[] = {
++        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x65,
++	0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
++	0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
++	0x65,0x90,0xe7,0xbc,0x03,0x0c,0x97,0x03,
++	0x14,0x78,0x14,0x08,0x20,0x14,0x08,0x20,
++	0xc8,0xc8,0x3b,0xd2,0x26,0x92,0x0f,0x40,
++        0x60,0x80,0x14,0x90,0x8c,0x60,0x04,0x96,
++	0x72,0x5c,0x11,0x00,0xfc,0xff,0x32,0x00
++};
++
++static const UCHAR SiS_HiTVGroup3Data[] = {
++        0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0x5f,
++	0x05,0x21,0xb2,0xb2,0x55,0x77,0x2a,0xa6,
++	0x25,0x2f,0x47,0xfa,0xc8,0xff,0x8e,0x20,
++	0x8c,0x6e,0x60,0x2e,0x58,0x48,0x72,0x44,
++	0x56,0x36,0x4f,0x6e,0x3f,0x80,0x00,0x80,
++	0x4f,0x7f,0x03,0xa8,0x7d,0x20,0x1a,0xa9,
++	0x14,0x05,0x03,0x7e,0x64,0x31,0x14,0x75,
++	0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
++};
++
++static const UCHAR SiS_HiTVGroup3Simu[] = {
++        0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0x95,
++	0xdb,0x20,0xb8,0xb8,0x55,0x47,0x2a,0xa6,
++	0x25,0x2f,0x47,0xfa,0xc8,0xff,0x8e,0x20,
++	0x8c,0x6e,0x60,0x15,0x26,0xd3,0xe4,0x11,
++	0x56,0x36,0x4f,0x6e,0x3f,0x80,0x00,0x80,
++	0x67,0x36,0x01,0x47,0x0e,0x10,0xbe,0xb4,
++	0x01,0x05,0x03,0x7e,0x65,0x31,0x14,0x75,
++	0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
++};
++
++static const UCHAR SiS_HiTVGroup3Text[] = {
++        0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0xa7,
++	0xf5,0x20,0xce,0xce,0x55,0x47,0x2a,0xa6,
++	0x25,0x2f,0x47,0xfa,0xc8,0xff,0x8e,0x20,
++	0x8c,0x6e,0x60,0x18,0x2c,0x0c,0x20,0x22,
++	0x56,0x36,0x4f,0x6e,0x3f,0x80,0x00,0x80,
++	0x93,0x3c,0x01,0x50,0x2f,0x10,0xf4,0xca,
++	0x01,0x05,0x03,0x7e,0x65,0x31,0x14,0x75,
++	0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
++};
++
++static const UCHAR SiS_NTSCPhase[]    = {0x21,0xed,0xba,0x08};  /* Was {0x21,0xed,0x8a,0x08}; */
++static const UCHAR SiS_PALPhase[]     = {0x2a,0x05,0xe3,0x00};  /* Was {0x2a,0x05,0xd3,0x00};  */
++static const UCHAR SiS_PALMPhase[]    = {0x21,0xE4,0x2E,0x9B};
++static const UCHAR SiS_PALNPhase[]    = {0x21,0xF4,0x3E,0xBA};
++static const UCHAR SiS_NTSCPhase2[]   = {0x21,0xF0,0x7B,0xD6};
++static const UCHAR SiS_PALPhase2[]    = {0x2a,0x09,0x86,0xe9};
++static const UCHAR SiS_PALMPhase2[]   = {0x21,0xE6,0xEF,0xA4};
++static const UCHAR SiS_PALNPhase2[]   = {0x21,0xF6,0x94,0x46};
++static const UCHAR SiS_SpecialPhase[] = {0x1e,0x8c,0x5c,0x7a};
++
++static const SiS_TVDataStruct  SiS_StPALData[]=
++{
++ {    1,   1, 864, 525,1270, 400, 100,   0, 760,0xf4,0xff,0x1c,0x22},
++ {    1,   1, 864, 525,1270, 350, 100,   0, 760,0xf4,0xff,0x1c,0x22},
++ {    1,   1, 864, 525,1270, 400,   0,   0, 720,0xf1,0x04,0x1f,0x18},
++ {    1,   1, 864, 525,1270, 350,   0,   0, 720,0xf4,0x0b,0x1c,0x0a},
++ {    1,   1, 864, 525,1270, 480,  50,   0, 760,0xf4,0xff,0x1c,0x22},
++ {    1,   1, 864, 525,1270, 600,  50,   0,   0,0xf4,0xff,0x1c,0x22}
++};
++
++static const SiS_TVDataStruct  SiS_ExtPALData[] =
++{
++ {   27,  10, 848, 448,1270, 530,  50,   0,  50,0xf4,0xff,0x1c,0x22},  /* 640x400, 320x200 */
++ {  108,  35, 848, 398,1270, 530,  50,   0,  50,0xf4,0xff,0x1c,0x22},
++ {   12,   5, 954, 448,1270, 530,  50,   0,  50,0xf1,0x04,0x1f,0x18},
++ {    9,   4, 960, 463,1644, 438,  50,   0,  50,0xf4,0x0b,0x1c,0x0a},
++ {    9,   4, 848, 528,1270, 530,   0,   0,  50,0xf5,0xfb,0x1b,0x2a},  /* 640x480, 320x240 */
++ {   36,  25,1060, 648,1316, 530, 438,   0, 438,0xeb,0x05,0x25,0x16},  /* 800x600, 400x300 */
++ {    3,   2,1080, 619,1270, 540, 438,   0, 438,0xf3,0x00,0x1d,0x20},  /* 720x576 */
++ {    1,   1,1170, 821,1270, 520, 686,   0, 686,0xF3,0x00,0x1D,0x20}   /* 1024x768 */
++};
++
++static const SiS_TVDataStruct  SiS_StNTSCData[]=
++{
++ {    1,   1, 858, 525,1270, 400,  50,   0, 760,0xf1,0x04,0x1f,0x18},
++ {    1,   1, 858, 525,1270, 350,  50,   0, 640,0xf1,0x04,0x1f,0x18},
++ {    1,   1, 858, 525,1270, 400,   0,   0, 720,0xf1,0x04,0x1f,0x18},
++ {    1,   1, 858, 525,1270, 350,   0,   0, 720,0xf4,0x0b,0x1c,0x0a},
++ {    1,   1, 858, 525,1270, 480,   0,   0, 760,0xf1,0x04,0x1f,0x18}
++};
++
++static const SiS_TVDataStruct  SiS_ExtNTSCData[]=
++{
++ {  143,  65, 858, 443,1270, 440, 171,   0, 171,0xf1,0x04,0x1f,0x18},    /* 640x400, 320x200 */
++ {   88,  35, 858, 393,1270, 440, 171,   0, 171,0xf1,0x04,0x1f,0x18},
++ {  143,  70, 924, 443,1270, 440,  92,   0,  92,0xf1,0x04,0x1f,0x18},
++ {  143,  70, 924, 393,1270, 440,  92,   0,  92,0xf4,0x0b,0x1c,0x0a},
++ {  143,  76, 836, 523,1270, 440, 224,   0,   0,0xf1,0x05,0x1f,0x16},    /* 640x480, 320x240 */
++ {  143, 120,1056, 643,1270, 440,   0, 128,   0,0xf4,0x10,0x1c,0x00},    /* 800x600, 400x300  */
++ {  143,  76, 836, 523,1270, 440,   0, 128,   0,0xee,0x0c,0x22,0x08},    /* 720x480 - BETTER (from 300 series) */
++/*{   2,   1, 858, 503,1270, 480,   0, 128,   0,0xee,0x0c,0x22,0x08},*/  /* 720x480  (old, from 650) */
++ {    1,   1,1100, 811,1412, 440,   0, 128,   0,0xee,0x0c,0x22,0x08}     /* 1024x768 CORRECTED */
++/*{  65,  64,1056, 791,1270, 480, 638,   0,   0,0xEE,0x0C,0x22,0x08} */  /* 1024x768 */
++#if 0  /* 300 series was: */
++ {  143,  65, 858, 443,1270, 440, 171,   0, 171,0xf1,0x04,0x1f,0x18},
++ {   88,  35, 858, 393,1270, 440, 171,   0, 171,0xf1,0x04,0x1f,0x18},
++ {  143,  70, 924, 443,1270, 440,  92,   0,  92,0xf1,0x04,0x1f,0x18},
++ {  143,  70, 924, 393,1270, 440,  92,   0,  92,0xf4,0x0b,0x1c,0x0a},
++ {  143,  76, 836, 523,1270, 440, 224,   0,   0,0xf1,0x05,0x1f,0x16},
++ {  143, 120,1056, 643,1270, 440,   0, 128,   0,0xf4,0x10,0x1c,0x00},
++ {  143,  76, 836, 523,1270, 440,   0, 128,   0,0xee,0x0c,0x22,0x08},
++ {   65,  64,1056, 791,1270, 480, 638,   0,   0,0xf1,0x04,0x1f,0x18}
++#endif
++};
++
++
++static const SiS_TVDataStruct  SiS_St2HiTVData[]=
++{
++ {    3,   1, 0x348,0x1e3,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
++ {    1,   1, 0x37c,0x233,0x2b2,0x2bc, 	  0,  0, 0, 0x00,0x00,0x00,0x00},
++ {    3,   1, 0x348,0x1e3,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
++ {    1,   1, 0x3e8,0x233,0x311,0x2bc,    0,  0, 0, 0x00,0x00,0x00,0x00},
++ {    5,   2, 0x348,0x233,0x670,0x3c0,0x08d,128, 0, 0x00,0x00,0x00,0x00},
++ {    8,   5, 0x41a,0x2ab,0x670,0x3c0,0x17c,128, 0, 0x00,0x00,0x00,0x00}
++};
++
++static const SiS_TVDataStruct  SiS_ExtHiTVData[]=
++{
++ {    6,   1, 0x348,0x233,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
++ {    3,   1, 0x3c0,0x233,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
++ {    3,   1, 0x348,0x1e3,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
++ {    3,   1, 0x3c0,0x233,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
++ {    5,   1, 0x348,0x233,0x670,0x3c0,0x166,128, 0, 0x00,0x00,0x00,0x00},  /* 640x480   */
++ {   16,   5, 0x41a,0x2ab,0x670,0x3c0,0x143,128, 0, 0x00,0x00,0x00,0x00},  /* 800x600   */
++ {   25,  12, 0x4ec,0x353,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},  /* 1024x768  */
++ {    5,   4, 0x627,0x464,0x670,0x3c0,0x128,  0, 0, 0x00,0x00,0x00,0x00},  /* 1280x1024 */
++ {    4,   1, 0x41a,0x233,0x670,0x3c0,0x143,128, 0, 0x00,0x00,0x00,0x00},  /* 800x480   */
++ {    5,   2, 0x578,0x293,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},  /* 1024x576  */
++ {    8,   5, 0x6d6,0x323,0x670,0x3c0,0x128,  0, 0, 0x00,0x00,0x00,0x00}   /* 1280x720  */
++};
++
++static const UCHAR SiS_OutputSelect = 0x40;
++
++static const UCHAR SiS_SoftSetting  = 0x30;   /* RAM setting */
++
++static const SiS_LCDDataStruct  SiS_LCD1280x960Data[] =
++{
++	{    9,   2, 800, 500,1800,1000},
++	{    9,   2, 800, 500,1800,1000},
++	{    4,   1, 900, 500,1800,1000},
++	{    4,   1, 900, 500,1800,1000},
++	{    9,   2, 800, 500,1800,1000},
++	{   30,  11,1056, 625,1800,1000},
++	{    5,   3,1350, 800,1800,1000},
++	{    1,   1,1576,1050,1576,1050},
++	{    1,   1,1800,1000,1800,1000}
++};
++
++static const SiS_LCDDataStruct  SiS_StLCD1280x768Data[] =
++{
++	{ 211,  100, 2100,  408, 1688,  802 }, /* These values are *wrong* */
++	{ 211,   64, 1536,  358, 1688,  802 }, /* (which is why they aren't used yet) */
++	{ 211,  100, 2100,  408, 1688,  802 },
++	{ 211,   64, 1536,  358, 1688,  802 },
++	{ 211,   48,  840,  488, 1688,  802 },
++	{ 211,   72, 1008,  609, 1688,  802 },
++	{ 211,  128, 1400,  776, 1688,  802 },
++	{ 211,  205, 1680, 1041, 1688,  802 },
++	{ 1,      1, 1688,  802, 1688,  802 }  /* That's the only one that *might* be correct */
++};
++
++static const SiS_LCDDataStruct  SiS_ExtLCD1280x768Data[] =
++{
++	{ 211,  100, 2100,  408, 1688,  802 }, /* These values are *wrong* */
++	{ 211,   64, 1536,  358, 1688,  802 }, /* (which is why they aren't used yet) */
++	{ 211,  100, 2100,  408, 1688,  802 },
++	{ 211,   64, 1536,  358, 1688,  802 },
++	{ 211,   48,  840,  488, 1688,  802 },
++	{ 211,   72, 1008,  609, 1688,  802 },
++	{ 211,  128, 1400,  776, 1688,  802 },
++	{ 211,  205, 1680, 1041, 1688,  802 },
++	{ 1,      1, 1688,  802, 1688,  802 }  /* That's the only one that *might* be correct */
++};
++
++static const SiS_LCDDataStruct  SiS_NoScaleData1280x768[] =
++{  /* All values guessed */
++        { 1, 1, 1688,  802, 1688,  802},
++	{ 1, 1, 1688,  802, 1688,  802},
++	{ 1, 1, 1688,  802, 1688,  802},
++	{ 1, 1, 1688,  802, 1688,  802},
++	{ 1, 1, 1688,  802, 1688,  802},
++	{ 1, 1, 1688,  802, 1688,  802},
++	{ 1, 1, 1688,  802, 1688,  802},
++	{ 1, 1, 1688,  802, 1688,  802},
++	{ 1, 1, 1688,  802, 1688,  802}
++};
++
++static const SiS_LCDDataStruct  SiS_StLCD1400x1050Data[] =
++{
++	{ 211,  100, 2100,  408, 1688, 1066 },
++	{ 211,   64, 1536,  358, 1688, 1066 },
++	{ 211,  100, 2100,  408, 1688, 1066 },
++	{ 211,   64, 1536,  358, 1688, 1066 },
++	{ 211,   48,  840,  488, 1688, 1066 },
++	{ 211,   72, 1008,  609, 1688, 1066 },
++	{ 211,  128, 1400,  776, 1688, 1066 },
++	{ 211,  205, 1680, 1041, 1688, 1066 },
++	{   1,    1, 1688, 1066, 1688, 1066 }
++};
++
++static const SiS_LCDDataStruct  SiS_ExtLCD1400x1050Data[] =
++{
++	{ 211,  100, 2100,  408, 1688, 1066 },
++	{ 211,   64, 1536,  358, 1688, 1066 },
++	{ 211,  100, 2100,  408, 1688, 1066 },
++	{ 211,   64, 1536,  358, 1688, 1066 },
++	{ 211,   48,  840,  488, 1688, 1066 },
++	{ 211,   72, 1008,  609, 1688, 1066 },
++	{ 211,  128, 1400,  776, 1688, 1066 },
++	{ 211,  205, 1680, 1041, 1688, 1066 },
++	{   1,    1, 1688, 1066, 1688, 1066 }
++};
++
++static const SiS_LCDDataStruct  SiS_NoScaleData1400x1050[] =
++{
++	{ 1, 1, 1688, 1066, 1688, 1066 },
++	{ 1, 1, 1688, 1066, 1688, 1066 },
++	{ 1, 1, 1688, 1066, 1688, 1066 },
++	{ 1, 1, 1688, 1066, 1688, 1066 },
++	{ 1, 1, 1688, 1066, 1688, 1066 },
++	{ 1, 1, 1688, 1066, 1688, 1066 },
++	{ 1, 1, 1688, 1066, 1688, 1066 },
++	{ 1, 1, 1688, 1066, 1688, 1066 },
++	{ 1, 1, 1688, 1066, 1688, 1066 }
++};
++
++static const SiS_LCDDataStruct  SiS_StLCD1600x1200Data[] =
++{  /* TODO */
++	{    0,   0,   0,   0,   0,   0}
++};
++
++static const SiS_LCDDataStruct  SiS_ExtLCD1600x1200Data[] =
++{  /* TODO */
++	{    0,   0,   0,   0,   0,   0}
++};
++
++static const SiS_LCDDataStruct  SiS_NoScaleData1600x1200[] =
++{  /* TODO - values guessed */
++        {1,  1, 2048, 1250, 2048, 1250},
++	{1,  1, 2048, 1250, 2048, 1250},
++	{1,  1, 2048, 1250, 2048, 1250},
++	{1,  1, 2048, 1250, 2048, 1250},
++	{1,  1, 2048, 1250, 2048, 1250},
++	{1,  1, 2048, 1250, 2048, 1250},
++	{1,  1, 2048, 1250, 2048, 1250},
++	{1,  1, 2048, 1250, 2048, 1250},
++	{1,  1, 2048, 1250, 2048, 1250},
++	{1,  1, 2048, 1250, 2048, 1250}
++};
++
++static const SiS_LCDDataStruct  SiS_NoScaleData[] =
++{
++	{ 1, 1, 800, 449, 800, 449 },
++	{ 1, 1, 800, 449, 800, 449 },
++	{ 1, 1, 900, 449, 900, 449 },
++	{ 1, 1, 900, 449, 900, 449 },
++	{ 1, 1, 800, 525, 800, 525 },
++	{ 1, 1,1056, 628,1056, 628 },
++	{ 1, 1,1344, 806,1344, 806 },
++	{ 1, 1,1688,1066,1688,1066 },
++        { 1, 1,1688, 802,1688, 802 },  /* 1280x768: 802 was 806 in both cases */
++        { 1, 1,2048,1250,2048,1250 },  /* 1600x1200 (guessed) */
++	{ 1, 1,1800,1000,1800,1000 }   /* 1280x960 */
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS320x480Data_1[]=
++{
++	{ 848, 433, 400, 525},
++	{ 848, 389, 400, 525},
++	{ 848, 433, 400, 525},
++	{ 848, 389, 400, 525},
++	{ 848, 518, 400, 525},
++	{1056, 628, 400, 525},
++	{ 400, 525, 400, 525},
++	{ 800, 449,1000, 644},
++	{ 800, 525,1000, 635}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS800x600Data_1[]=
++{
++	{ 848, 433,1060, 629},
++	{ 848, 389,1060, 629},
++	{ 848, 433,1060, 629},
++	{ 848, 389,1060, 629},
++	{ 848, 518,1060, 629},
++	{1056, 628,1056, 628},
++	{1056, 628,1056, 628},
++	{ 800, 449,1000, 644},
++	{ 800, 525,1000, 635}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS800x600Data_2[]=
++{
++	{1056, 628,1056, 628},
++	{1056, 628,1056, 628},
++	{1056, 628,1056, 628},
++	{1056, 628,1056, 628},
++	{1056, 628,1056, 628},
++	{1056, 628,1056, 628},
++	{1056, 628,1056, 628},
++	{ 800, 449,1000, 644},
++	{ 800, 525,1000, 635}
++};
++
++
++
++static const SiS_LVDSDataStruct  SiS_LVDS1280x1024Data_1[]=
++{
++	{1048, 442,1688,1066},
++	{1048, 392,1688,1066},
++	{1048, 442,1688,1066},
++	{1048, 392,1688,1066},
++	{1048, 522,1688,1066},
++	{1208, 642,1688,1066},
++	{1432, 810,1688,1066},
++	{1688,1066,1688,1066}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1280x1024Data_2[]=
++{
++	{1688,1066,1688,1066},
++	{1688,1066,1688,1066},
++	{1688,1066,1688,1066},
++	{1688,1066,1688,1066},
++	{1688,1066,1688,1066},
++	{1688,1066,1688,1066},
++	{1688,1066,1688,1066},
++	{1688,1066,1688,1066}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1024x768Data_1[]=
++{
++	{ 840, 438,1344, 806},
++	{ 840, 409,1344, 806},
++	{ 840, 438,1344, 806},
++	{ 840, 409,1344, 806},
++	{ 840, 518,1344, 806},   /* 640x480 */
++	{1050, 638,1344, 806},   /* 800x600 */
++	{1344, 806,1344, 806},   /* 1024x768 */
++	{ 800, 449,1280, 801},
++	{ 800, 525,1280, 813}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1024x768Data_2[]=
++{
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{ 800, 449,1280, 801},
++	{ 800, 525,1280, 813}
++};
++
++/* Custom data for Barco iQ R300 */
++static const SiS_LVDSDataStruct  SiS_LVDSBARCO1366Data_1[]=
++{
++	{ 832, 438,1331, 806},
++	{ 832, 388,1331, 806},
++	{ 832, 438,1331, 806},
++	{ 832, 388,1331, 806},
++	{ 832, 518,1331, 806},
++	{1050, 638,1344, 806},
++	{1344, 806,1344, 806},
++	{1688,1066,1688,1066},
++	{1688,1066,1688,1066}   /* 1360x1024 */
++};
++
++/* Custom data for Barco iQ R300 */
++static const SiS_LVDSDataStruct  SiS_LVDSBARCO1366Data_2[]=
++{
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1688,1066,1688,1066},
++	{1688,1066,1688,1066}   /* 1360x1024 */
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDSBARCO1024Data_1[]=
++{
++	{ 832, 438,1331, 806},
++	{ 832, 409,1331, 806},
++	{ 832, 438,1331, 806},
++	{ 832, 409,1331, 806},
++	{ 832, 518,1331, 806},   /* 640x480 */
++	{1050, 638,1344, 806},   /* 800x600 */
++	{1344, 806,1344, 806},   /* 1024x768 */
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDSBARCO1024Data_2[]=
++{
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1400x1050Data_1[]=
++{
++        { 928, 416, 1688,1066},
++	{ 928, 366, 1688,1066},
++	{ 928, 416, 1688,1066},
++	{ 928, 366, 1688,1066},
++	{ 928, 496, 1688,1066},
++	{1088, 616, 1688,1066},
++	{1312, 784, 1688,1066},
++	{1568,1040, 1688,1066},
++	{1688,1066, 1688,1066}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1400x1050Data_2[]=
++{
++        {1688,1066, 1688,1066},
++	{1688,1066, 1688,1066},
++	{1688,1066, 1688,1066},
++	{1688,1066, 1688,1066},
++	{1688,1066, 1688,1066},
++	{1688,1066, 1688,1066},
++	{1688,1066, 1688,1066},
++	{1688,1066, 1688,1066},
++	{1688,1066, 1688,1066},
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1600x1200Data_1[]=
++{
++        {1088, 450, 2048,1250},
++	{1088, 400, 2048,1250},
++	{1088, 450, 2048,1250},
++	{1088, 400, 2048,1250},
++	{1088, 530, 2048,1250},
++	{1248, 650, 2048,1250},
++	{1472, 818, 2048,1250},
++	{1728,1066, 2048,1250},
++	{1848,1066, 2048,1250},
++	{2048,1250, 2048,1250}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1600x1200Data_2[]=
++{
++        {2048,1250, 2048,1250},
++	{2048,1250, 2048,1250},
++	{2048,1250, 2048,1250},
++	{2048,1250, 2048,1250},
++	{2048,1250, 2048,1250},
++	{2048,1250, 2048,1250},
++	{2048,1250, 2048,1250},
++	{2048,1250, 2048,1250},
++	{2048,1250, 2048,1250},
++	{2048,1250, 2048,1250}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1280x768Data_1[]=
++{
++	{ 768, 438, 1408, 806},
++	{ 768, 388, 1408, 806},
++	{ 768, 438, 1408, 806},
++	{ 768, 388, 1408, 806},
++	{ 768, 518, 1408, 806},
++	{ 928, 638, 1408, 806},
++	{1152, 806, 1408, 806},
++	{1408, 806, 1408, 806},
++	{1408, 806, 1408, 806}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1280x768Data_2[]=
++{
++	{1408, 806, 1408, 806},
++	{1408, 806, 1408, 806},
++	{1408, 806, 1408, 806},
++	{1408, 806, 1408, 806},
++	{1408, 806, 1408, 806},
++	{1408, 806, 1408, 806},
++	{1408, 806, 1408, 806},
++	{1408, 806, 1408, 806},
++	{1408, 806, 1408, 806}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1024x600Data_1[] =
++{
++	{840, 604,1344, 800},
++	{840, 560,1344, 800},
++	{840, 604,1344, 800},
++	{840, 560,1344, 800},
++	{840, 689,1344, 800},
++	{1050, 800,1344, 800},
++	{1344, 800,1344, 800},
++	{800, 449,1280, 789},
++	{800, 525,1280, 785}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1024x600Data_2[] =
++{
++	{1344, 800,1344, 800},
++	{1344, 800,1344, 800},
++	{1344, 800,1344, 800},
++	{1344, 800,1344, 800},
++	{1344, 800,1344, 800},
++	{1344, 800,1344, 800},
++	{1344, 800,1344, 800},
++	{ 800, 449,1280, 801},
++	{ 800, 525,1280, 813}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1152x768Data_1[] =
++{
++	{ 840, 438,1344, 806},
++	{ 840, 409,1344, 806},
++	{ 840, 438,1344, 806},
++	{ 840, 409,1344, 806},
++	{ 840, 518,1344, 806},
++	{1050, 638,1344, 806},
++	{1344, 806,1344, 806},
++	{ 800, 449,1280, 801},
++	{ 800, 525,1280, 813}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1152x768Data_2[] =
++{
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{ 800, 449,1280, 801},
++	{ 800, 525,1280, 813}
++};
++
++/* TW: Pass 1:1 data */
++static const SiS_LVDSDataStruct  SiS_LVDSXXXxXXXData_1[]=
++{
++        { 800, 449,  800, 449},
++	{ 800, 449,  800, 449},
++	{ 900, 449,  900, 449},
++	{ 900, 449,  900, 449},
++	{ 800, 525,  800, 525},  /*  640x480   */
++	{1056, 628, 1056, 628},  /*  800x600   */
++	{1344, 806, 1344, 806},  /* 1024x768   */
++	{1344,1066, 1344,1066},  /* 1280x1024  */  /* INSERTED ! */
++ 	{1688, 806, 1688, 806},  /* 1280x768   */
++	/* No other panels ! */
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS640x480Data_1[]=
++{
++	{ 800, 445, 800, 525},   /* 800, 449, 800, 449 */
++	{ 800, 395, 800, 525},
++	{ 800, 445, 800, 525},
++	{ 800, 395, 800, 525},
++	{ 800, 525, 800, 525},
++	{ 800, 525, 800, 525},   /* pseudo */
++	{ 800, 525, 800, 525}    /* pseudo */
++};
++
++/* FSTN 320x240 */
++static const SiS_LVDSDataStruct  SiS_LVDS640x480Data_2[]=
++{
++	{ 800, 445, 800, 525},
++	{ 800, 395, 800, 525},
++	{ 800, 445, 800, 525},
++	{ 800, 395, 800, 525},
++	{ 800, 525, 800, 525},
++        { 800, 525, 800, 525},   /* pseudo */
++	{ 800, 525, 800, 525}    /* pseudo */
++};
++
++
++static const SiS_LVDSDataStruct  SiS_LVDS1280x960Data_1[]=
++{
++	{ 840, 438,1344, 806},
++	{ 840, 409,1344, 806},
++	{ 840, 438,1344, 806},
++	{ 840, 409,1344, 806},
++	{ 840, 518,1344, 806},
++	{1050, 638,1344, 806},
++	{1344, 806,1344, 806},
++	{ 800, 449,1280, 801},
++	{ 800, 525,1280, 813}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1280x960Data_2[]=
++{
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{ 800, 449,1280, 801},
++	{ 800, 525,1280, 813}
++};
++
++/* LCDA */
++
++static const SiS_LVDSDataStruct  SiS_LCDA1400x1050Data_1[]=
++{	/* TW: Might be temporary (invalid) data */
++        { 928, 416, 1688,1066},
++	{ 928, 366, 1688,1066},
++	{1008, 416, 1688,1066},
++	{1008, 366, 1688,1066},
++	{1200, 530, 1688,1066},
++	{1088, 616, 1688,1066},
++	{1312, 784, 1688,1066},
++	{1568,1040, 1688,1066},
++	{1688,1066, 1688,1066}
++};
++
++static const SiS_LVDSDataStruct  SiS_LCDA1400x1050Data_2[]=
++{	/* TW: Temporary data. Not valid */
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{ 800, 449,1280, 801},
++	{ 800, 525,1280, 813}
++};
++
++static const SiS_LVDSDataStruct  SiS_LCDA1600x1200Data_1[]=
++{	/* TW: Temporary data. Not valid */
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{1344, 806,1344, 806},
++	{ 800, 449,1280, 801},
++	{ 800, 525,1280, 813}
++};
++
++static const SiS_LVDSDataStruct  SiS_LCDA1600x1200Data_2[]=
++{	/* TW: Temporary data. Not valid */
++	{0, 0, 0, 0},
++	{0, 0, 0, 0},
++	{0, 0, 0, 0},
++	{0, 0, 0, 0},
++	{0, 0, 0, 0},
++	{0, 0, 0, 0},
++	{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 const SiS_LVDSDataStruct  SiS_CHTVUNTSCData[]=
++{
++	{ 840, 600, 840, 600},
++	{ 840, 600, 840, 600},
++	{ 840, 600, 840, 600},
++	{ 840, 600, 840, 600},
++	{ 784, 600, 784, 600},
++	{1064, 750,1064, 750},
++        {1160, 945,1160, 945}
++};
++
++static const SiS_LVDSDataStruct  SiS_CHTVONTSCData[]=
++{
++	{ 840, 525, 840, 525},
++	{ 840, 525, 840, 525},
++	{ 840, 525, 840, 525},
++	{ 840, 525, 840, 525},
++	{ 784, 525, 784, 525},
++	{1040, 700,1040, 700},
++        {1160, 840,1160, 840}
++};
++
++static const SiS_LVDSDesStruct SiS_PanelType1076_1[]=
++{  /* 1024x768 */
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0}
++};
++
++static const SiS_LVDSDesStruct SiS_PanelType1076_2[]=
++{  /* 1024x768 */
++	{ 1184, 622 },
++	{ 1184, 597 },
++	{ 1184, 622 },
++	{ 1184, 597 },
++	{ 1152, 622 },
++	{ 1232, 722 },
++	{    0, 0   },
++	{    0, 794 },
++	{    0, 0   }
++};
++
++static const SiS_LVDSDesStruct SiS_PanelType1210_1[]=
++{  /* 1280x1024 */
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0}
++};
++
++static const SiS_LVDSDesStruct SiS_PanelType1210_2[]=
++{  /* 1280x1024 */
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0}
++};
++
++static const SiS_LVDSDesStruct SiS_PanelType1296_1[]=
++{  /* 1400x1050 */
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0}
++};
++
++static const SiS_LVDSDesStruct SiS_PanelType1296_2[]=
++{  /* 1400x1050 - looks heavily invalid */
++	{ 808 , 740},
++	{ 0   , 715},
++	{ 632 , 740},
++	{ 632 , 715},
++	{ 1307, 780},
++	{ 1387,1157},
++	{ 1499, 924},
++	{ 1627,1052},
++	{ 0 , 0}
++};
++
++static const SiS_LVDSDesStruct SiS_PanelType1600_1[]=
++{  /* 1600x1200 */
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0}
++};
++
++static const SiS_LVDSDesStruct SiS_PanelType1600_2[]=
++{  /* 1600x1200 - BIOS looks heavily invalid, not copied */
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0}
++};
++
++static const SiS_LVDSDesStruct  SiS_PanelTypeNS_1[]=
++{
++	{ 8,   0},
++	{ 8,   0},
++	{ 8,   0},
++	{ 8,   0},
++	{ 8,   0},
++	{ 0,   0},
++	{ 0,   0},
++	{ 0,   0},
++	{ 0, 806},
++	{ 0, 0 }
++};
++
++static const SiS_LVDSDesStruct  SiS_PanelTypeNS_2[] =
++{
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0},
++	{ 0 , 0}
++};
++
++static const SiS_LVDSDesStruct  SiS_CHTVUNTSCDesData[]=
++{
++	{ 0,   0},
++	{ 0,   0},
++	{ 0,   0},
++	{ 0,   0},
++	{ 0,   0},
++	{ 0,   0},
++	{ 0,   0}
++};
++
++static const SiS_LVDSDesStruct  SiS_CHTVONTSCDesData[]=
++{
++	{ 0,   0},
++	{ 0,   0},
++	{ 0,   0},
++	{ 0,   0},
++	{ 0,   0},
++	{ 0,   0},
++	{ 0,   0}
++};
++
++static const SiS_LVDSDesStruct  SiS_CHTVUPALDesData[]=
++{
++	{256,   0},
++	{256,   0},
++	{256,   0},
++	{256,   0},
++	{ 0,   0},
++	{ 0,   0},
++	{ 0,   0}
++};
++
++static const SiS_LVDSDesStruct  SiS_CHTVOPALDesData[]=
++{
++	{256,   0},
++	{256,   0},
++	{256,   0},
++	{256,   0},
++	{ 0,   0},
++	{ 0,   0},
++	{ 0,   0}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT1320x480_1[] =
++{
++ {{0x65,0x4f,0x89,0x56,0x83,0xaa,0x1f,
++   0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
++   0x00 }},
++ {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
++   0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
++   0x00 }},
++ {{0x65,0x4f,0x89,0x54,0x9f,0xc4,0x1f,
++   0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
++   0x00 }},
++ {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
++   0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
++   0x00 }},
++ {{0x65,0x4f,0x89,0x56,0x83,0x04,0x3e,
++   0xe0,0x85,0xdf,0xfb,0x10,0x00,0x05,
++   0x00 }},
++ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
++   0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
++   0x01 }},
++ {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
++   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
++   0x00 }}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11024x600_1[] =
++{
++        {{0x64,0x4f,0x88,0x54,0x9f,0x5a,0x3e,
++	  0xe8,0x8f,0x8f,0x5b,0x00,0x00,0x01,
++	  0x00}},
++        {{0x64,0x4f,0x88,0x54,0x9f,0x2e,0x3e,
++	  0xb9,0x80,0x5d,0x2f,0x00,0x00,0x01,
++	  0x00}},
++        {{0x64,0x4f,0x88,0x54,0x9f,0x5a,0x3e,
++	  0xe8,0x8f,0x8f,0x5b,0x00,0x00,0x01,
++	  0x00}},
++        {{0x64,0x4f,0x88,0x54,0x9f,0x2e,0x3e,
++	  0xb9,0x80,0x5d,0x2f,0x00,0x00,0x01,
++	  0x00}},
++        {{0x64,0x4f,0x88,0x54,0x9f,0xaf,0xba,
++	  0x3b,0x82,0xdf,0xb0,0x00,0x00,0x01,
++	  0x00}},
++        {{0x7e,0x63,0x82,0x68,0x15,0x1e,0xf1,
++	  0xae,0x85,0x57,0x1f,0x30,0x00,0x26,
++	  0x01}},
++        {{0xa3,0x7f,0x87,0x86,0x97,0x1e,0xf1,
++	  0xae,0x85,0x57,0x1f,0x30,0x00,0x02,
++	  0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11024x600_1_H[] =
++{
++        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
++	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
++	  0x00}},
++        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
++	  0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
++          0x00}},
++        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
++	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
++	  0x00}},
++        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
++	  0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
++	  0x00}},
++        {{0x2f,0x27,0x93,0x2b,0x90,0x04,0x3e,
++	  0xe2,0x89,0xdf,0x05,0x00,0x00,0x44,
++	  0x00}},
++        {{0x3c,0x31,0x80,0x35,0x1c,0x7c,0xf0,
++	  0x5a,0x8f,0x57,0x7d,0x20,0x00,0x55,
++	  0x01}},
++        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
++	  0x02,0x88,0xff,0x25,0x10,0x00,0x01,
++	  0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11024x600_2[] =
++{
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
++	  0x00}},
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++	  0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
++	  0x00}},
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
++	  0x00}},
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++          0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
++	  0x00}},
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++	  0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
++	  0x00}},
++        {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
++	  0xae,0x84,0x57,0x25,0x30,0x00,0x02,
++	  0x01}},
++        {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
++	  0x02,0x88,0xff,0x25,0x10,0x00,0x02,
++	  0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11024x600_2_H[] =
++{
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
++	  0x00}},
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++	  0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
++	  0x00}},
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
++	  0x00}},
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++	  0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
++	  0x00}},
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++	  0x72,0x88,0xdf,0x25,0x30,0x00,0x01,
++	  0x00}},
++        {{0x4f,0x31,0x93,0x3e,0x06,0x24,0xf1,
++	  0xae,0x84,0x57,0x25,0x30,0x00,0x01,
++	  0x01}},
++        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
++	  0x02,0x88,0xff,0x25,0x10,0x00,0x01,
++	  0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11152x768_1[] =
++{
++        {{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
++	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
++	  0x00}},
++        {{0x64,0x4f,0x88,0x54,0x9f,0x97,0x1f,
++	  0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
++	  0x00}},
++        {{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
++	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
++	  0x00}},
++        {{0x64,0x4f,0x88,0x54,0x9f,0x97,0x1f,
++	  0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
++	  0x00}},
++        {{0x64,0x4f,0x88,0x54,0x9f,0x04,0x3e,
++	  0xe2,0x89,0xdf,0x05,0x00,0x00,0x01,
++	  0x00}},
++        {{0x7e,0x63,0x82,0x68,0x15,0x7c,0xf0,
++	  0x5a,0x8f,0x57,0x7d,0x20,0x00,0x26,
++	  0x01}},
++        {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
++	  0x02,0x88,0xff,0x25,0x10,0x00,0x02,
++	  0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11152x768_1_H[] =
++{
++        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
++	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
++	  0x00}},
++        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
++	  0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
++	  0x00}},
++        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
++	  0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
++	  0x00}},
++        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
++	  0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
++	  0x00}},
++        {{0x2f,0x27,0x93,0x2b,0x90,0x04,0x3e,
++	  0xe2,0x89,0xdf,0x05,0x00,0x00,0x44,
++	  0x00}},
++        {{0x3c,0x31,0x80,0x35,0x1c,0x7c,0xf0,
++	  0x5a,0x8f,0x57,0x7d,0x20,0x00,0x55,
++	  0x01}},
++        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
++	  0x02,0x88,0xff,0x25,0x10,0x00,0x01,
++	  0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11152x768_2[] =
++{
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
++	  0x00}},
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++	  0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
++	  0x00}},
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
++	  0x00}},
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++	  0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
++	  0x00}},
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++	  0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
++	  0x00}},
++        {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
++	  0xae,0x84,0x57,0x25,0x30,0x00,0x02,
++	  0x01}},
++        {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
++	  0x02,0x88,0xff,0x25,0x10,0x00,0x02,
++	  0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11152x768_2_H[] =
++{
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
++	  0x00}},
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++	  0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
++	  0x00}},
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++	  0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
++	  0x00}},
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++	  0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
++	  0x00}},
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++	  0x72,0x88,0xdf,0x25,0x30,0x00,0x01,
++	  0x00}},
++        {{0x4f,0x31,0x93,0x3e,0x06,0x24,0xf1,
++	  0xae,0x84,0x57,0x25,0x30,0x00,0x01,
++	  0x01}},
++        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
++	  0x02,0x88,0xff,0x25,0x10,0x00,0x01,
++	  0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11280x768_1[] =
++{
++ {{0x5b,0x4f,0x9f,0x55,0x19,0xb4,0x1f,
++   0x9c,0x8e,0x8f,0xb5,0x10,0x00,0x01,
++   0x00}},
++ {{0x5b,0x4f,0x9f,0x55,0x19,0x82,0x1f,
++   0x6a,0x8c,0x5d,0x83,0x30,0x00,0x01,
++   0x00}},
++ {{0x5b,0x4f,0x9f,0x55,0x19,0xb4,0x1f,
++   0x9c,0x8e,0x8f,0xb5,0x10,0x00,0x01,
++   0x00}},
++ {{0x5b,0x4f,0x9f,0x55,0x19,0x82,0x1f,
++   0x6a,0x8c,0x5d,0x83,0x30,0x00,0x01,
++   0x00}},
++ {{0x5b,0x4f,0x9f,0x55,0x19,0x04,0x3e,
++   0xec,0x8e,0xdf,0x05,0x20,0x00,0x01,
++   0x00}},
++ {{0x6f,0x63,0x93,0x69,0x8d,0x7c,0xf0,
++   0x64,0x86,0x57,0x7d,0x20,0x00,0x05,
++   0x01}},
++ {{0x8b,0x7f,0x8f,0x85,0x09,0x24,0xf5,
++   0x0c,0x8e,0xff,0x25,0x30,0x00,0x02,
++   0x01}},
++ {{0xab,0x9f,0x8f,0xa5,0x89,0x24,0xf5,
++   0x0c,0x8e,0xff,0x25,0x30,0x00,0x06,
++   0x01}},
++ {{0xab,0x9f,0x8f,0xa5,0x89,0x24,0xf5,
++   0x0c,0x8e,0xff,0x25,0x30,0x00,0x06,
++   0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11280x768_1_H[] =
++{
++ {{0x47,0x27,0x8b,0x2c,0x1a,0x9e,0x1f,
++   0x93,0x86,0x8f,0x9f,0x30,0x00,0x05,
++   0x00}},
++ {{0x47,0x27,0x8b,0x2c,0x1a,0x6c,0x1f,
++   0x60,0x84,0x5d,0x6d,0x10,0x00,0x05,
++   0x00}},
++ {{0x47,0x27,0x8b,0x30,0x1e,0x9e,0x1f,
++   0x92,0x86,0x8f,0x9f,0x30,0x00,0x05,
++   0x00}},
++ {{0x47,0x27,0x8b,0x2c,0x1a,0x6c,0x1f,
++   0x60,0x84,0x5d,0x6d,0x10,0x00,0x05,
++   0x00}},
++ {{0x47,0x27,0x8b,0x2c,0x1a,0xee,0x1f,
++   0xe2,0x86,0xdf,0xef,0x10,0x00,0x05,
++   0x00}},
++ {{0x51,0x31,0x95,0x36,0x04,0x66,0xf0,
++   0x5a,0x8e,0x57,0x67,0x20,0x00,0x01,
++   0x01}},
++ {{0x5f,0x3f,0x83,0x44,0x92,0x0e,0xf5,
++   0x02,0x86,0xff,0x0f,0x10,0x00,0x01,
++   0x01}},
++ {{0x6f,0x4f,0x93,0x54,0x82,0x0e,0x5a,
++   0x02,0x86,0xff,0x0f,0x09,0x00,0x05,
++   0x01}},
++ {{0x6f,0x4f,0x93,0x54,0x82,0x0e,0x5a,
++   0x02,0x86,0xff,0x0f,0x09,0x00,0x05,
++   0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11280x768_2[] =
++{
++ {{0xab,0x60,0x9f,0x80,0x04,0x24,0xbb,
++   0x54,0x86,0xdb,0xda,0x00,0x00,0x02,
++   0x00}},
++ {{0xab,0x60,0x9f,0x80,0x04,0x24,0xbb,
++   0x3b,0x8d,0xc2,0xc1,0x00,0x00,0x02,
++   0x00}},
++ {{0xab,0x60,0x9f,0x80,0x04,0x24,0xbb,
++   0x54,0x86,0xdb,0xda,0x00,0x00,0x02,
++   0x00}},
++ {{0xab,0x60,0x9f,0x80,0x04,0x24,0xbb,
++   0x3b,0x8d,0xc2,0xc1,0x00,0x00,0x02,
++   0x00}},
++ {{0xab,0x60,0x9f,0x80,0x04,0x24,0xb3,
++   0x7c,0x8e,0x03,0x02,0x10,0x00,0x02,
++   0x01}},
++ {{0xab,0x63,0x8f,0x8a,0x8e,0x24,0xf1,
++   0xb6,0x88,0x57,0x25,0x10,0x00,0x02,
++   0x01}},
++ {{0xab,0x7f,0x8f,0x98,0x9c,0x24,0xf5,
++   0x0a,0x8c,0xff,0x25,0x30,0x00,0x02,
++   0x01}},
++ {{0xab,0x9f,0x8f,0xa8,0x8c,0x24,0xf5,
++   0x0a,0x8c,0xff,0x25,0x30,0x00,0x06,
++   0x01}},
++ {{0xab,0x9f,0x8f,0xa8,0x8c,0x24,0xf5,
++   0x0a,0x8c,0xff,0x25,0x30,0x00,0x06,
++   0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11280x768_2_H[] =
++{
++ {{0x83,0x38,0x97,0x58,0x9c,0x24,0xbb,
++   0x54,0x86,0xdb,0xda,0x00,0x00,0x01,
++   0x00}},
++ {{0x83,0x38,0x97,0x58,0x9c,0x24,0xbb,
++   0x3b,0x8d,0xc2,0xc1,0x00,0x00,0x01,
++   0x00}},
++ {{0x83,0x38,0x97,0x58,0x9c,0x24,0xbb,
++   0x54,0x86,0xdb,0xda,0x00,0x00,0x01,
++   0x00}},
++ {{0x83,0x38,0x97,0x58,0x9c,0x24,0xbb,
++   0x3b,0x8d,0xc2,0xc1,0x00,0x00,0x01,
++   0x00}},
++ {{0x83,0x38,0x97,0x58,0x9c,0x24,0xb3,
++   0x7c,0x8e,0x03,0x02,0x10,0x00,0x01,
++   0x01}},
++ {{0x79,0x31,0x9d,0x58,0x9c,0x24,0xf1,
++   0xb6,0x88,0x57,0x25,0x10,0x00,0x01,
++   0x01}},
++ {{0x6b,0x3f,0x8f,0x58,0x9c,0x24,0xf5,
++   0x0a,0x8c,0xff,0x25,0x30,0x00,0x01,
++   0x01}},
++ {{0xab,0x9f,0x8f,0xa8,0x8c,0x24,0xf5,
++   0x0a,0x8c,0xff,0x25,0x30,0x00,0x06,
++   0x01}},
++ {{0xab,0x9f,0x8f,0xa8,0x8c,0x24,0xf5,
++   0x0a,0x8c,0xff,0x25,0x30,0x00,0x06,
++   0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT1XXXxXXX_1[] =
++{
++ {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x05,
++   0x00}},
++ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
++   0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
++   0x01}},
++ {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
++   0x02,0x88,0xff,0x25,0x10,0x00,0x02,
++   0x01}},
++ {{0xce,0x9f,0x92,0xa8,0x14,0x28,0x5a,
++   0x00,0x84,0xff,0x29,0x09,0x00,0x07,
++   0x01}},
++ {{0xce,0x9f,0x92,0xa9,0x17,0x24,0xf5,
++   0x02,0x88,0xff,0x25,0x10,0x00,0x07,
++   0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT1XXXxXXX_1_H[] =
++{
++ {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
++   0x00}},
++ {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
++   0x00}},
++ {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
++   0x00}},
++ {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
++   0x00}},
++ {{0x38,0x27,0x9c,0x2c,0x80,0x0b,0x3e,
++   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
++   0x00}},
++ {{0x4d,0x31,0x91,0x3b,0x03,0x72,0xf0,
++   0x58,0x8c,0x57,0x73,0x20,0x00,0x01,
++   0x01}},
++ {{0x63,0x3f,0x87,0x4a,0x92,0x24,0xf5,
++   0x02,0x88,0xff,0x25,0x10,0x00,0x01,
++   0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT1640x480_1[] =
++{
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
++   0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
++   0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT1640x480_1_H[] =
++{
++ {{0x2d,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x00,0x00,0x00,
++   0x00}},
++ {{0x2d,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
++   0x83,0x85,0x63,0xba,0x00,0x00,0x00,
++   0x00}},
++ {{0x2d,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x00,0x00,0x00,
++   0x00}},
++ {{0x2d,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
++   0x83,0x85,0x63,0xba,0x00,0x00,0x00,
++   0x00}},
++ {{0x2d,0x28,0x90,0x2c,0x80,0x0b,0x3e,
++   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
++   0x00}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT1640x480_2[] =
++{
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
++   0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
++   0x01}},
++ {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
++   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
++   0x00}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT1640x480_2_H[] =
++{
++ {{0x65,0x4f,0x89,0x56,0x83,0xaa,0x1f,
++   0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
++   0x00}},
++ {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
++   0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
++   0x00}},
++ {{0x65,0x4f,0x89,0x54,0x9f,0xc4,0x1f,
++   0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
++   0x00}},
++ {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
++   0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
++   0x00}},
++ {{0x65,0x4f,0x89,0x56,0x83,0x04,0x3e,
++   0xe0,0x85,0xdf,0xfb,0x10,0x00,0x05,
++   0x00}},
++ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
++   0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
++   0x01}},
++ {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
++   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
++   0x00}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT1640x480_3[] =
++{
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
++   0x00}},
++ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
++   0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
++   0x01}},
++ {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
++   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
++   0x00}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT1640x480_3_H[] =
++{
++ {{0x65,0x4f,0x89,0x56,0x83,0xaa,0x1f,
++   0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
++   0x00}},
++ {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
++   0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
++   0x00}},
++ {{0x65,0x4f,0x89,0x54,0x9f,0xc4,0x1f,
++   0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
++   0x00}},
++ {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
++   0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
++   0x00}},
++ {{0x65,0x4f,0x89,0x56,0x83,0x04,0x3e,
++   0xe0,0x85,0xdf,0xfb,0x10,0x00,0x05,
++   0x00}},
++ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
++   0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
++   0x01}},
++ {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
++   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
++   0x00}}
++};
++
++#define SIS_PL_HSYNCP 0x01
++#define SIS_PL_HSYNCN 0x02
++#define SIS_PL_VSYNCP 0x04
++#define SIS_PL_VSYNCN 0x08
++#define SIS_PL_DVI    0x80
++
++typedef struct _SiS_PlasmaModes
++{
++  const char *name;
++  ULONG  clock;
++  USHORT HDisplay, HTotal, HFrontPorch, HSyncWidth;
++  USHORT VDisplay, VTotal, VFrontPorch, VSyncWidth;
++  UCHAR  SyncFlags;
++} SiS_PlasmaModes;
++
++
++typedef struct _SiS_PlasmaTables
++{
++   USHORT vendor;
++   UCHAR  productnum;
++   USHORT product[5];
++   const char *plasmaname;
++   UCHAR  modenum;
++   UCHAR  plasmamodes[20];  /* | 0x80 = DVI-capable, | 0x40 = analog */
++} SiS_PlasmaTables;
++
++static const SiS_PlasmaModes SiS_PlasmaMode[] = {
++   {  "640x400",		/* 00: IBM 400@70 */
++      25175,
++       640,  800, 17,  64,
++       400,  449, 13,   2,
++      SIS_PL_HSYNCN | SIS_PL_VSYNCN },
++   {  "640x480",		/* 01: VESA 480@72 */
++      31500,
++       640,  832, 24,  40,
++       480,  520,  9,   3,
++      SIS_PL_HSYNCN | SIS_PL_VSYNCN },
++   {  "800x600",		/* 02: VESA 600@72 */
++      50000,
++       800, 1040, 56, 120,
++       600,  666, 37,   6,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "864x480",		/* 03: Cereb wide 1 */
++      42526,
++       864, 1134, 22,  86,
++       480,  500,  1,   3,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCN },
++   {  "848x480",		/* 04: VESA wide (NEC1) */
++      33750,
++       848, 1088, 16, 112,
++       480,  517,  6,   8,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "1024x576",		/* 05: VESA wide (NEC2) */
++      47250,
++      1024, 1320, 16, 144,
++       576,  596,  2,   4,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "1280x720",		/* 06: VESA wide (NEC3) */
++      76500,
++      1280, 1696, 48, 176,
++       720,  750,  4,   8,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "1360x765",		/* 07: VESA wide (NEC4) */
++      85500,
++      1360, 1792, 64, 176,
++       765,  795,  4,   8,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "1024x600",		/* 08: CEREB wide 2 */
++      51200,
++      1024, 1352, 51, 164,
++       600,  628,  1,   4,
++      SIS_PL_HSYNCN | SIS_PL_VSYNCP },
++   {  "1024x768",		/* 09: VESA 768@75 */
++      78750,
++      1024, 1312,  16, 96,
++       768,  800,   1,  3,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "1152x864",		/* 10: VESA 1152x864@75 */
++      108000,
++      1152, 1600, 64, 128,
++       864,  900,  1,   3,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "1280x1024",		/* 11: VESA 1024@60 */
++      108000,
++      1280, 1688, 48, 112,
++      1024, 1066,  1,   3,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "1280x768",		/* 12: W_XGA */
++      81000,
++      1280, 1688, 48, 112,
++       768,  802,  3,   6,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCN },
++   {  "1280x768",		/* 13: I/O Data W_XGA@56Hz */
++      76064,
++      1280, 1688, 48, 112,
++       768,  802,  2,   3,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "1376x768",		/* 14: I/O Wide XGA */
++      87340,
++      1376, 1808, 32, 128,
++       768,  806,  3,   6,
++      SIS_PL_HSYNCN | SIS_PL_VSYNCP },
++   {  "1280x960",		/* 15: VESA 960@60 */
++      108000,
++      1280, 1800, 96, 112,
++       960, 1000,  1,   3,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "1400x1050",		/* 16: VESA 1050@60Hz */
++      108000,
++      1400, 1688, 48, 112,
++      1050, 1066,  1,   3,
++      SIS_PL_HSYNCN | SIS_PL_VSYNCN },
++   {  "1360x768",		/* 17: VESA wide (NEC4/2) */
++      85500,
++      1360, 1792, 64, 112,
++       765,  795,  3,   6,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "800x600",		/* 18: VESA 600@56 */
++      36000,
++       800, 1024, 24,   2,
++       600,  625,  1,   2,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP }
++};
++
++static const SiS_PlasmaTables SiS_PlasmaTable[] = {
++#if 0  /* Product IDs missing */
++   { 0x38a3, 4,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 42VP4/42VP4D/42VP4G/42VP4DG",
++     14,   /* All DVI, except 0, 7, 13; 3, 15, 16 unknown */
++     { 0|0x40, 1|0xc0, 2|0xc0, 3|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,12|0xc0,
++      13|0x40,14|0xc0,15|0xc0,16|0xc0, 0     , 0     , 0     , 0     , 0     , 0 }
++   },
++   { 0x38a3, 3,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 42PD1/50PD1/50PD2",
++     5,   /* DVI entirely unknown */
++     { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 9|0xc0, 0     , 0     , 0     , 0     , 0     ,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++   { 0x38a3, 1,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 42PD3",
++     10,   /* DVI entirely unknown */
++     { 0|0x40, 1|0xc0, 2|0xc0, 3|0xc0, 4|0xc0, 5|0xc0, 6|0xc0, 7|0x40, 8|0xc0, 9|0xc0,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++   { 0x38a3, 2,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 42VM3/61XM1",
++     11,  /* DVI entirely unknown */
++     { 0|0x40, 1|0xc0, 2|0xc0, 3|0xc0, 4|0xc0, 5|0xc0, 6|0xc0, 8|0xc0, 9|0xc0,11|0xc0,
++      17|0xc0, 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++   { 0x38a3, 2,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 42MP1/42MP2",
++     6,   /* DVI entirely unknown */
++     { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 9|0xc0,11|0xc0, 0     , 0     , 0     , 0     ,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++   { 0x38a3, 1,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 50MP1",
++     10,   /* DVI entirely unknown */
++     { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,13|0x40,14|0xc0,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++#endif
++   { 0x38a3, 4,
++     { 0xa482, 0xa483, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 42MP3/42MP4/50MP2/61MP1",
++     11,   /* All DVI except 0, 7, 13, 17 */
++     { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,13|0x40,14|0xc0,
++      17|0x40, 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++#if 0  /* Product IDs missing */
++   { 0x38a3, 1,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 3300W",
++     3,
++     { 0|0x40, 1|0xc0,18|0xc0, 0     , 0     , 0     , 0     , 0     , 0     , 0     ,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++   { 0x38a3, 1,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 4200W",
++     4,   /* DVI entirely unknown */
++     { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 0     , 0     , 0     , 0     , 0     , 0     ,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++   { 0x38a3, 1,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 4210W",
++     6,   /* DVI entirely unknown */
++     { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 9|0xc0,11|0xc0, 0     , 0     , 0     , 0     ,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++   { 0x38a3, 1,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 5000W",
++     7,   /* DVI entirely unknown */
++     { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,11|0xc0, 0     , 0     , 0     ,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++#endif
++   { 0x412f, 1,
++     { 0x000c, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "Pioneer 503CMX",
++     6,   /* DVI unknown */
++     { 1|0xc0, 2|0xc0, 9|0xc0,11|0xc0,12|0xc0,15|0xc0, 0     , 0     , 0     , 0     ,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++   { 0x34a9, 1,
++     { 0xa00e, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "Panasonic TH-42",
++     5,   /* No DVI output */
++     { 1|0x40, 2|0x40, 4|0x40, 9|0x40,15|0x40, 0     , 0     , 0     , 0     , 0     ,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++   { 0x0000 }
++};
++
+ void     SiS_SetReg1(USHORT, USHORT, USHORT);
+ void     SiS_SetReg2(SiS_Private *, USHORT, USHORT, USHORT);
+ void     SiS_SetReg3(USHORT, USHORT);
+@@ -158,6 +2337,7 @@ void     SiS_SetMemoryClock(SiS_Private 
+ void     SiS_SetDRAMModeRegister(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ BOOLEAN  SiS_SearchVBModeID(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT *ModeNo);
+ void     SiS_IsLowResolution(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex);
++void     SiS_GetSysFlags(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ 
+ #ifdef SIS300
+ void     SiS_SetDRAMSize_300(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+@@ -192,12 +2372,15 @@ void     SiS_VerifyMclk(SiS_Private *SiS
+ 
+ void     SiS_HandleCRT1(SiS_Private *SiS_Pr);
+ void     SiS_Handle301B_1400x1050(SiS_Private *SiS_Pr, USHORT ModeNo);
+-void     SiS_SetEnableDstn(SiS_Private *SiS_Pr);
++void     SiS_SetEnableDstn(SiS_Private *SiS_Pr, int enable);
++void     SiS_SetEnableFstn(SiS_Private *SiS_Pr, int enable);
+ void     SiS_Delay15us(SiS_Private *SiS_Pr);
+ BOOLEAN  SiS_SearchModeID(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT *ModeNo,USHORT *ModeIdIndex);
+ BOOLEAN  SiS_CheckMemorySize(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+                              USHORT ModeNo,USHORT ModeIdIndex);
+ UCHAR    SiS_GetModePtr(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT ModeNo,USHORT ModeIdIndex);
++void     SiS_WhatTheHellIsThis(SiS_Private *SiS_Pr,PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr);
++void     SiS_StrangeStuff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ void     SiS_SetSeqRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT StandTableIndex);
+ void     SiS_SetMiscRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT StandTableIndex);
+ void     SiS_SetCRTCRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+@@ -267,19 +2450,19 @@ void    	SiS_SetPitchCRT1(SiS_Private *S
+ void    	SiS_SetPitchCRT2(SiS_Private *SiS_Pr, ScrnInfoPtr pScrn, UShort BaseAddr);
+ extern int      SiS_compute_vclk(int Clock, int *out_n, int *out_dn, int *out_div,
+ 	     	 		    int *out_sbit, int *out_scale);
++extern void 	SiSCalcClock(ScrnInfoPtr pScrn, int clock, int max_VLD, unsigned int *vclk);
++
+ extern unsigned char SiS_GetSetBIOSScratch(ScrnInfoPtr pScrn, USHORT offset, unsigned char value);
+ extern unsigned char SiS_GetSetModeID(ScrnInfoPtr pScrn, unsigned char id);
+-extern USHORT 	     SiS_CalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode);
++extern USHORT 	     SiS_CalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN hcm);
+ #endif
+ 
+ extern USHORT    SiS_GetOffset(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                        USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ extern USHORT    SiS_GetColorDepth(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex);
+ extern void      SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+-extern BOOLEAN   SiS_SetCRT2Group301(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+-                                     PSIS_HW_DEVICE_INFO HwDeviceExtension);
+-extern void      SiS_PresetScratchregister(SiS_Private *SiS_Pr, USHORT SiS_P3d4,
+-                                           PSIS_HW_DEVICE_INFO HwDeviceExtension);
++extern BOOLEAN   SiS_SetCRT2Group(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
++                                  PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ extern void      SiS_UnLockCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr);
+ extern void      SiS_LockCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr);
+ extern BOOLEAN   SiS_BridgeIsOn(SiS_Private *SiS_Pr, USHORT BaseAddr);
+@@ -321,10 +2504,12 @@ int    sisfb_mode_rate_to_dclock(SiS_Pri
+ 			      unsigned char modeno, unsigned char rateindex);
+ int    sisfb_mode_rate_to_ddata(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ 			 unsigned char modeno, unsigned char rateindex,
+-			 ULONG *left_margin, ULONG *right_margin, 
++			 ULONG *left_margin, ULONG *right_margin,
+ 			 ULONG *upper_margin, ULONG *lower_margin,
+ 			 ULONG *hsync_len, ULONG *vsync_len,
+ 			 ULONG *sync, ULONG *vmode);
++BOOLEAN sisfb_gettotalfrommode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
++		       unsigned char modeno, int *htotal, int *vtotal, unsigned char rateindex);
+ #endif
+ 
+ #endif
+--- linux-2.6.0-test1/drivers/video/sis/oem300.h	2003-06-14 12:18:05.000000000 -0700
++++ 25/drivers/video/sis/oem300.h	2003-07-19 17:04:55.000000000 -0700
+@@ -1,5 +1,30 @@
+-
+-/* OEM Data for 300 series */
++/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/oem300.h.c,v 1.0 2001/11/30 12:12:01 eich Exp $ */
++/*
++ * OEM Data for 300 series
++ *
++ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of the copyright holder not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  The copyright holder makes no representations
++ * about the suitability of this software for any purpose.  It is provided
++ * "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
++ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++ * PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Author: 	Thomas Winischhofer <thomas@winischhofer.net>
++ *
++ */
+ 
+ const UCHAR SiS300_OEMTVDelay301[8][4] =
+ {
+@@ -680,325 +705,147 @@ const UCHAR SiS300_Filter2[10][9][7] =
+     }
+ };
+ 
+-const UCHAR SiS300_LCDHData[24][11][5] = {
++/* Custom data for Barco iQ Pro R300 */
++const UCHAR barco_p1[2][9][7][3] = {
+     {
+-        {0x67,0x91,0x84,0x5e,0x00},
+-	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x65,0xef,0x83,0x5c,0x00},
+-	{0x65,0xef,0x83,0x5c,0x00},
+-	{0x8a,0x14,0x00,0x80,0x00},
+-	{0x8a,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-        {0x4e,0x18,0x90,0x38,0x00},
+-	{0x4e,0x18,0x90,0x38,0x00},
+-	{0x8e,0x18,0x28,0x78,0x00},
+-	{0x8e,0x18,0x28,0x78,0x00},
+-	{0x8e,0x18,0x28,0x78,0x00},
+-	{0x4e,0x18,0x90,0x38,0x00},
+-	{0x4e,0x18,0x90,0x38,0x00},
+-	{0x67,0x11,0x9a,0x56,0x00},
+-        {0x67,0x11,0x9a,0x56,0x00},
+-	{0x8a,0x14,0x00,0x80,0x00},
+-	{0x8a,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-        {0x67,0x91,0x84,0x5e,0x00},
+-	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x65,0xef,0x83,0x5c,0x00},
+-	{0x65,0xef,0x83,0x5c,0x00},
+-	{0x8a,0x14,0x00,0x80,0x00},
+-	{0x8a,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x4e,0x18,0x90,0x38,0x00},
+-	{0x4e,0x18,0x90,0x38,0x00},
+-	{0x8e,0x18,0x28,0x78,0x00},
+-	{0x8e,0x18,0x28,0x78,0x00},
+-	{0x8e,0x18,0x28,0x78,0x00},
+-	{0x4e,0x18,0x90,0x38,0x00},
+-	{0x4e,0x18,0x90,0x38,0x00},
+-	{0x67,0x11,0x9a,0x56,0x00},
+-	{0x67,0x11,0x9a,0x56,0x00},
+-	{0x8a,0x14,0x00,0x80,0x00},
+-	{0x8a,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x67,0x91,0x84,0x5e,0x00},
+-	{0x65,0xef,0x83,0x5c,0x00},
+-	{0x65,0xef,0x83,0x5c,0x00},
+-	{0x8a,0x14,0x00,0x80,0x00},
+-	{0x8a,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-        {0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-    	{0x67,0x91,0x84,0x5E,0x00},
+-    	{0x67,0x91,0x84,0x5E,0x00},
+-    	{0x67,0x91,0x84,0x5E,0x00},
+-    	{0x67,0x91,0x84,0x5E,0x00},
+-    	{0x65,0xEF,0x83,0x5C,0x00},
+-    	{0x65,0xEF,0x83,0x5C,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x65,0xEF,0x83,0x5C,0x00},
+-	{0x65,0xEF,0x83,0x5C,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x65,0xEF,0x83,0x5C,0x00},
+-	{0x65,0xEF,0x83,0x5C,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x65,0xEF,0x83,0x5C,0x00},
+-	{0x65,0xEF,0x83,0x5C,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x65,0xEF,0x83,0x5C,0x00},
+-	{0x65,0xEF,0x83,0x5C,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x65,0xEF,0x83,0x5C,0x00},
+-	{0x65,0xEF,0x83,0x5C,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x65,0xEF,0x83,0x5C,0x00},
+-	{0x65,0xEF,0x83,0x5C,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x65,0xEF,0x83,0x5C,0x00},
+-	{0x65,0xEF,0x83,0x5C,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x67,0x91,0x84,0x5E,0x00},
+-	{0x65,0xEF,0x83,0x5C,0x00},
+-	{0x65,0xEF,0x83,0x5C,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-    	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x8E,0x18,0x28,0x78,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x4E,0x18,0x90,0x38,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x67,0x11,0x9A,0x56,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00},
+-	{0x8A,0x14,0x00,0x80,0x00}
++	{  { 0x16, 0xcf, 0x00 },
++	   { 0x18, 0x00, 0x00 },
++	   { 0x1a, 0xe7, 0x00 },
++	   { 0x1b, 0x26, 0x00 },
++	   { 0x1c, 0xff, 0x00 },
++	   { 0x1d, 0x1c, 0x00 },
++	   { 0x1e, 0x19, 0x00 }
++	},
++	{
++	   { 0x16, 0xcf, 0x00 },
++	   { 0x18, 0x00, 0x00 },
++	   { 0x1a, 0xe7, 0x00 },
++	   { 0x1b, 0x1e, 0x00 },
++	   { 0x1c, 0xff, 0x00 },
++	   { 0x1d, 0x1c, 0x00 },
++	   { 0x1e, 0x16, 0x00 }
++	},
++	{
++	   { 0x16, 0xcf, 0x00 },
++	   { 0x1a, 0xe7, 0x00 },
++	   { 0x1b, 0x26, 0x00 },
++	   { 0x1c, 0xff, 0x00 },
++	   { 0x1d, 0x1c, 0x00 },
++	   { 0x1e, 0x19, 0x00 },
++	   {    0,    0,    0 }
++	},
++	{
++	   {    0,    0,    0 }
++	},
++	{
++	   { 0x16, 0xcf, 0x00 },
++	   { 0x1a, 0xe7, 0x00 },
++	   { 0x1b, 0x26, 0x00 },
++	   { 0x1c, 0xff, 0x00 },
++	   { 0x1d, 0x1c, 0x00 },
++	   { 0x1e, 0x1e, 0x00 },
++	   {    0,    0,    0 }
++	},
++	{
++	   { 0x16, 0xd1, 0x00 },
++	   { 0x18, 0x00, 0x00 },
++	   { 0x1a, 0xe7, 0x00 },
++	   { 0x1b, 0x11, 0x00 },
++	   { 0x1c, 0xff, 0x00 },
++	   { 0x1d, 0x1c, 0x00 },
++	   { 0x1e, 0x26, 0x00 }
++	},
++	{
++	   { 0x16, 0xd1, 0x00 },
++	   { 0x1a, 0xe7, 0x00 },
++	   { 0x1b, 0x26, 0x00 },
++	   { 0x1c, 0xff, 0x00 },
++	   { 0x1d, 0x1c, 0x00 },
++	   { 0x1e, 0x30, 0x00 },
++	   {    0,    0,    0 }
++	},
++	{
++	   { 0x16, 0x00, 0x00 },
++	   { 0x17, 0xa0, 0x00 },
++	   { 0x1a, 0xa0, 0x00 },
++	   { 0x1b, 0x2a, 0x00 },
++	   { 0x1c, 0xff, 0x00 },
++	   { 0x1d, 0x1c, 0x00 },
++	   {    0,    0,    0 }
++	},
++	{
++	   { 0x16, 0x00, 0x00 },
++	   { 0x17, 0xaa, 0x00 },
++	   { 0x1a, 0xa0, 0x00 },
++	   { 0x1b, 0x2a, 0x00 },
++	   { 0x1c, 0xff, 0x00 },
++	   { 0x1d, 0x1c, 0x00 },
++	   {    0,    0,    0 }
++	}
++    },
++    {
++	{
++	   { 0x16, 0xcf, 0x00 },
++	   { 0x18, 0x00, 0x00 },
++	   { 0x1a, 0xe7, 0x00 },
++	   { 0x1b, 0x26, 0x00 },
++	   { 0x1c, 0xff, 0x00 },
++	   { 0x1d, 0x1c, 0x00 },
++	   { 0x1e, 0x19, 0x00 }
++	},
++	{
++	   {    0,    0,    0 }
++	},
++	{
++	   { 0x16, 0xcf, 0x00 },
++	   { 0x18, 0x00, 0x00 },
++	   { 0x1a, 0xe7, 0x00 },
++	   { 0x1b, 0x26, 0x00 },
++	   { 0x1c, 0xff, 0x00 },
++	   { 0x1d, 0x1c, 0x00 },
++	   { 0x1e, 0x19, 0x00 },
++	},
++	{
++	   {    0,    0,    0 }
++	},
++	{
++	   { 0x16, 0xcf, 0x00 },
++	   { 0x18, 0x00, 0x00 },
++	   { 0x1a, 0xe7, 0x00 },
++	   { 0x1b, 0x26, 0x00 },
++	   { 0x1c, 0xff, 0x00 },
++	   { 0x1d, 0x1c, 0x00 },
++	   { 0x1e, 0x1e, 0x00 }
++	},
++	{
++	   { 0x16, 0xd1, 0x00 },
++	   { 0x18, 0x00, 0x00 },
++	   { 0x1a, 0xe6, 0x00 },
++	   { 0x1b, 0x11, 0x00 },
++	   { 0x1c, 0xff, 0x00 },
++	   { 0x1d, 0x1c, 0x00 },
++	   { 0x1e, 0x26, 0x00 }
++	},
++	{
++	   { 0x18, 0x00, 0x00 },
++	   { 0x1a, 0xe0, 0x00 },
++	   { 0x1b, 0x26, 0x00 },
++	   { 0x1c, 0xff, 0x00 },
++	   { 0x1d, 0x1c, 0x00 },
++	   { 0x1e, 0x30, 0x00 },
++	   {    0,    0,    0 }
++	},
++	{
++	   {    0,    0,    0 }
++	},
++	{
++	   {    0,    0,    0 }
++	}
+     }
+ };
+ 
+-#if 0
+-const UCHAR SiS300_LCDVData[24][11][6] = {
+-    {
+-        {
+-    },
+-};
+-#endif
++
++
++
++
++
+--- linux-2.6.0-test1/drivers/video/sis/oem310.h	2003-06-14 12:17:55.000000000 -0700
++++ 25/drivers/video/sis/oem310.h	2003-07-19 17:04:55.000000000 -0700
+@@ -1,5 +1,30 @@
+-
+-/* OEM Data for 310/325/330 series */
++/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/oem300.h.c,v 1.0 2001/11/30 12:12:01 eich Exp $ */
++/*
++ * OEM Data for 315/330 series
++ *
++ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of the copyright holder not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  The copyright holder makes no representations
++ * about the suitability of this software for any purpose.  It is provided
++ * "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
++ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++ * PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Author: 	Thomas Winischhofer <thomas@winischhofer.net>
++ *
++ */
+ 
+ const UCHAR SiS310_LCDDelayCompensation_301[] =	    	/* 301 */
+ {
+@@ -100,7 +125,7 @@ const UCHAR SiS310_LCDDelayCompensation_
+ 
+ const UCHAR SiS310_LCDDelayCompensation_651301LV[] =	  /* M650/651 301LV */
+ {
+-                 0x33,0x33,0x33,    /*   800x600 (guessed) */
++                 0x33,0x33,0x33,    /*   800x600 (guessed) - new: PanelType, not PanelRes ! */
+ 		 0x33,0x33,0x33,    /*  1024x768 */
+ 		 0x33,0x33,0x33,    /* 1280x1024 */
+ 		 0x33,0x33,0x33,    /*   640x480 (unknown) */
+--- linux-2.6.0-test1/drivers/video/sis/osdef.h	2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/video/sis/osdef.h	2003-07-19 17:04:55.000000000 -0700
+@@ -1,79 +1,43 @@
+-/* #define WINCE_HEADER */
+-/* #define WIN2000 */
+-/* #define TC */
++
++/* OS depending defines */
++
++/* The choices are: */
++
+ #define LINUX_KERNEL	   /* Kernel framebuffer */
+ /* #define LINUX_XF86 */   /* XFree86 */
+ 
+ /**********************************************************************/
+-#ifdef LINUX_KERNEL
+-	#include <linux/config.h>
+-	#include <linux/version.h>
+-	#ifdef CONFIG_FB_SIS_300
+- 		#define SIS300
+-	#endif
+-
+-	#ifdef CONFIG_FB_SIS_315
+-		#define SIS315H
+-	#endif
+-	#if 1
+-		#define SISFBACCEL	/* Include 2D acceleration */
+-	#endif
+-	#if 1
+-		#define SISFB_PAN	/* Include Y-Panning code */
+-	#endif
+-#else
+-/*	#define SIS300*/
+-	#define SIS315H
+-#endif
+-#ifdef LINUX_XF86
+-	#define SIS300
+-	/* #define SIS315H */ /* TW: done above */
+-#endif
++#ifdef LINUX_KERNEL  /* -------------------------- */
++#include <linux/config.h>
++#include <linux/version.h>
+ 
+-/**********************************************************************/
+-#ifdef TC
+-#endif
+-#ifdef WIN2000
+-#endif
+-#ifdef WINCE_HEADER
+-#endif
+-#ifdef LINUX_XF86
++#ifdef CONFIG_FB_SIS_300
++#define SIS300
+ #endif
+-#ifdef LINUX_KERNEL
+-#endif
+-/**********************************************************************/
+-#ifdef TC
+-#define SiS_SetMemory(MemoryAddress,MemorySize,value) memset(MemoryAddress, value, MemorySize);
+-#endif
+-#ifdef WIN2000
+-#define SiS_SetMemory(MemoryAddress,MemorySize,value) MemFill((PVOID) MemoryAddress,(ULONG) MemorySize,(UCHAR) value);
++
++#ifdef CONFIG_FB_SIS_315
++#define SIS315H
+ #endif
+-#ifdef WINCE_HEADER
+-#define SiS_SetMemory(MemoryAddress,MemorySize,value) memset(MemoryAddress, value, MemorySize);
++
++#if 1
++#define SISFBACCEL	/* Include 2D acceleration */
+ #endif
+-#ifdef LINUX_XF86
+-#define SiS_SetMemory(MemoryAddress,MemorySize,value) memset(MemoryAddress, value, MemorySize)
++
+ #endif
+-#ifdef LINUX_KERNEL
+-#define SiS_SetMemory(MemoryAddress,MemorySize,value) memset(MemoryAddress, value, MemorySize)
++
++#ifdef LINUX_XF86 /* ----------------------------- */
++#define SIS300
++#define SIS315H
+ #endif
+-/**********************************************************************/
+ 
+ /**********************************************************************/
+-
+-#ifdef TC
+-#define SiS_MemoryCopy(Destination,Soruce,Length) memmove(Destination, Soruce, Length);
+-#endif
+-#ifdef WIN2000
+-#define SiS_MemoryCopy(Destination,Soruce,Length)  /*VideoPortMoveMemory((PUCHAR)Destination , Soruce,length);*/
+-#endif
+-#ifdef WINCE_HEADER
+-#define SiS_MemoryCopy(Destination,Soruce,Length) memmove(Destination, Soruce, Length);
+-#endif
+ #ifdef LINUX_XF86
++#define SiS_SetMemory(MemoryAddress,MemorySize,value) memset(MemoryAddress, value, MemorySize)
+ #define SiS_MemoryCopy(Destination,Soruce,Length) memcpy(Destination,Soruce,Length)
+ #endif
++
+ #ifdef LINUX_KERNEL
++#define SiS_SetMemory(MemoryAddress,MemorySize,value) memset(MemoryAddress, value, MemorySize)
+ #define SiS_MemoryCopy(Destination,Soruce,Length) memcpy(Destination,Soruce,Length)
+ #endif
+ 
+@@ -104,19 +68,6 @@
+ #endif /* InPortLong */
+ 
+ /**********************************************************************/
+-/*  TC                                                                */
+-/**********************************************************************/
+-
+-#ifdef TC
+-#define OutPortByte(p,v) outp((unsigned short)(p),(unsigned char)(v))
+-#define OutPortWord(p,v) outp((unsigned short)(p),(unsigned short)(v))
+-#define OutPortLong(p,v) outp((unsigned short)(p),(unsigned long)(v))
+-#define InPortByte(p)    inp((unsigned short)(p))
+-#define InPortWord(p)    inp((unsigned short)(p))
+-#define InPortLong(p)    ((inp((unsigned short)(p+2))<<16) | inp((unsigned short)(p)))
+-#endif
+-
+-/**********************************************************************/
+ /*  LINUX XF86                                                        */
+ /**********************************************************************/
+ 
+@@ -142,29 +93,4 @@
+ #define InPortLong(p)    inl((u16)(p))
+ #endif
+ 
+-/**********************************************************************/
+-/*  WIN 2000                                                          */
+-/**********************************************************************/
+-
+-#ifdef WIN2000
+-#define OutPortByte(p,v) VideoPortWritePortUchar ((PUCHAR) (p), (UCHAR) (v))
+-#define OutPortWord(p,v) VideoPortWritePortUshort((PUSHORT) (p), (USHORT) (v))
+-#define OutPortLong(p,v) VideoPortWritePortUlong ((PULONG) (p), (ULONG) (v))
+-#define InPortByte(p)    VideoPortReadPortUchar  ((PUCHAR) (p))
+-#define InPortWord(p)    VideoPortReadPortUshort ((PUSHORT) (p))
+-#define InPortLong(p)    VideoPortReadPortUlong  ((PULONG) (p))
+-#endif
+ 
+-
+-/**********************************************************************/
+-/*  WIN CE                                                            */
+-/**********************************************************************/
+-
+-#ifdef WINCE_HEADER
+-#define OutPortByte(p,v) WRITE_PORT_UCHAR ((PUCHAR) (p), (UCHAR) (v))
+-#define OutPortWord(p,v) WRITE_PORT_USHORT((PUSHORT) (p), (USHORT) (v))
+-#define OutPortLong(p,v) WRITE_PORT_ULONG ((PULONG) (p), (ULONG) (v))
+-#define InPortByte(p)    READ_PORT_UCHAR  ((PUCHAR) (p))
+-#define InPortWord(p)    READ_PORT_USHORT ((PUSHORT) (p))
+-#define InPortLong(p)    READ_PORT_ULONG  ((PULONG) (p))
+-#endif
+--- linux-2.6.0-test1/drivers/video/sis/sis_accel.c	2003-06-14 12:18:52.000000000 -0700
++++ 25/drivers/video/sis/sis_accel.c	2003-07-19 17:04:55.000000000 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * SiS 300/630/730/540/315/550/650/740 frame buffer driver
++ * SiS 300/630/730/540/315/550/650/740/330/660 frame buffer driver
+  * for Linux kernels 2.4.x and 2.5.x
+  *
+  * 2D acceleration part
+@@ -211,7 +211,7 @@ SiS300SubsequentSolidFillRect(int x, int
+ 	SiS300DoCMD
+ }
+ 
+-/* 310/325 series ------------------------------------------------ */
++/* 315 series ---------------------------------------------------- */
+ 
+ static void
+ SiS310SetupForScreenToScreenCopy(int xdir, int ydir, int rop,
+@@ -230,7 +230,7 @@ SiS310SetupForScreenToScreenCopy(int xdi
+ 		/* SiSSetupCMDFlag(BITBLT | SRCVIDEO) */
+ 	}
+ 	SiS310SetupCMDFlag(ivideo.SiS310_AccelDepth)
+-	/* TW: The 310/325 series is smart enough to know the direction */
++	/* TW: The 315 series is smart enough to know the direction */
+ }
+ 
+ static void
+@@ -328,11 +328,13 @@ void sisfb_syncaccel(void)
+     }
+ }
+ 
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,34)  /* --- KERNEL 2.5.34 and later --- */
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)  /* --------------- 2.5 --------------- */
+ 
+ int fbcon_sis_sync(struct fb_info *info)
+ {
+-   if(!sisfb_accel) return 0;
++   if(!ivideo.accel)
++   	return 0;
++   
+    CRITFLAGS
+    if(sisvga_engine == SIS_300_VGA) {
+       SiS300Sync();
+@@ -352,7 +354,7 @@ void fbcon_sis_fillrect(struct fb_info *
+    if(!rect->width || !rect->height)
+    	return;
+ 
+-   if(!sisfb_accel) {
++   if(!ivideo.accel) {
+ 	cfb_fillrect(info, rect);
+ 	return;
+    }
+@@ -388,7 +390,7 @@ void fbcon_sis_copyarea(struct fb_info *
+    CRITFLAGS
+ 
+    TWDEBUG("Inside sis_copyarea");
+-   if(!sisfb_accel) {
++   if(!ivideo.accel) {
+    	cfb_copyarea(info, area);
+ 	return;
+    }
+@@ -418,7 +420,7 @@ void fbcon_sis_copyarea(struct fb_info *
+ 
+ #endif
+ 
+-#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,33)  /* ------ KERNEL <2.5.34 ------ */
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)  /* -------------- 2.4 --------------- */
+ 
+ void fbcon_sis_bmove(struct display *p, int srcy, int srcx,
+ 			    int dsty, int dstx, int height, int width)
+@@ -591,38 +593,38 @@ void fbcon_sis_revc(struct display *p, i
+ 
+ #ifdef FBCON_HAS_CFB8
+ struct display_switch fbcon_sis8 = {
+-	setup:			fbcon_cfb8_setup,
+-	bmove:			fbcon_sis_bmove,
+-	clear:			fbcon_sis_clear8,
+-	putc:			fbcon_cfb8_putc,
+-	putcs:			fbcon_cfb8_putcs,
+-	revc:			fbcon_cfb8_revc,
+-	clear_margins:		fbcon_cfb8_clear_margins,
+-	fontwidthmask:		FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
++	.setup			= fbcon_cfb8_setup,
++	.bmove			= fbcon_sis_bmove,
++	.clear			= fbcon_sis_clear8,
++	.putc			= fbcon_cfb8_putc,
++	.putcs			= fbcon_cfb8_putcs,
++	.revc			= fbcon_cfb8_revc,
++	.clear_margins		= fbcon_cfb8_clear_margins,
++	.fontwidthmask		= FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
+ };
+ #endif
+ #ifdef FBCON_HAS_CFB16
+ struct display_switch fbcon_sis16 = {
+-	setup:			fbcon_cfb16_setup,
+-	bmove:			fbcon_sis_bmove,
+-	clear:			fbcon_sis_clear16,
+-	putc:			fbcon_cfb16_putc,
+-	putcs:			fbcon_cfb16_putcs,
+-	revc:			fbcon_sis_revc,
+-	clear_margins:		fbcon_cfb16_clear_margins,
+-	fontwidthmask:		FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
++	.setup			= fbcon_cfb16_setup,
++	.bmove			= fbcon_sis_bmove,
++	.clear			= fbcon_sis_clear16,
++	.putc			= fbcon_cfb16_putc,
++	.putcs			= fbcon_cfb16_putcs,
++	.revc			= fbcon_sis_revc,
++	.clear_margins		= fbcon_cfb16_clear_margins,
++	.fontwidthmask		= FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
+ };
+ #endif
+ #ifdef FBCON_HAS_CFB32
+ struct display_switch fbcon_sis32 = {
+-	setup:			fbcon_cfb32_setup,
+-	bmove:			fbcon_sis_bmove,
+-	clear:			fbcon_sis_clear32,
+-	putc:			fbcon_cfb32_putc,
+-	putcs:			fbcon_cfb32_putcs,
+-	revc:			fbcon_sis_revc,
+-	clear_margins:		fbcon_cfb32_clear_margins,
+-	fontwidthmask:		FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
++	.setup			= fbcon_cfb32_setup,
++	.bmove			= fbcon_sis_bmove,
++	.clear			= fbcon_sis_clear32,
++	.putc			= fbcon_cfb32_putc,
++	.putcs			= fbcon_cfb32_putcs,
++	.revc			= fbcon_sis_revc,
++	.clear_margins		= fbcon_cfb32_clear_margins,
++	.fontwidthmask		= FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
+ };
+ #endif
+ 
+--- linux-2.6.0-test1/drivers/video/sis/sis_accel.h	2003-06-14 12:18:08.000000000 -0700
++++ 25/drivers/video/sis/sis_accel.h	2003-07-19 17:04:55.000000000 -0700
+@@ -47,7 +47,7 @@
+ #define TRAPAZOID_FILL          0x00000005  /* Fill trapezoid */
+ #define TRANSPARENT_BITBLT      0x00000006  /* Transparent Blit */
+ 
+-/* Additional engine commands for 310/325 */
++/* Additional engine commands for 315 */
+ #define ALPHA_BLEND		0x00000007  /* Alpha blend ? */
+ #define A3D_FUNCTION		0x00000008  /* 3D command ? */
+ #define	CLEAR_Z_BUFFER		0x00000009  /* ? */
+@@ -90,11 +90,11 @@
+ #define NO_RESET_COUNTER        0x00400000
+ #define NO_LAST_PIXEL           0x00200000
+ 
+-/* Subfunctions for Color/Enhanced Color Expansion (310/325 only) */
++/* Subfunctions for Color/Enhanced Color Expansion (315 only) */
+ #define COLOR_TO_MONO		0x00100000
+ #define AA_TEXT			0x00200000
+ 
+-/* Some general registers for 310/325 series */
++/* Some general registers for 315 series */
+ #define SRC_ADDR		0x8200
+ #define SRC_PITCH		0x8204
+ #define AGP_BASE		0x8206 /* color-depth dependent value */
+@@ -326,7 +326,7 @@ int     CmdQueLen;
+ 
+ 
+ 
+-/* ----------- SiS 310/325 series --------------- */
++/* -------------- SiS 315 series --------------- */
+ 
+ /* Q_STATUS:
+    bit 31 = 1: All engines idle and all queues empty
+@@ -342,7 +342,7 @@ int     CmdQueLen;
+    bits 7:0:   2D counter 1
+ 
+    Where is the command queue length (current amount of commands the queue
+-   can accept) on the 310/325 series? (The current implementation is taken
++   can accept) on the 315 series? (The current implementation is taken
+    from 300 series and certainly wrong...)
+ */
+ 
+--- linux-2.6.0-test1/drivers/video/sis/sis_main.c	2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/video/sis/sis_main.c	2003-07-19 17:04:55.000000000 -0700
+@@ -1,25 +1,18 @@
+ /*
+- * SiS 300/630/730/540/315/550/650/740 frame buffer device
++ * SiS 300/630/730/540/315/550/650/740/330/660 frame buffer device
+  * for Linux kernels 2.4.x and 2.5.x
+  *
+- * Partly based on the VBE 2.0 compliant graphic boards framebuffer driver,
+- * which is (c) 1998 Gerd Knorr <kraxel@goldbach.in-berlin.de>
++ * (C) 1999 Silicon Integrated Systems, Inc.
++ * (C) 2001-2003 Thomas Winischhofer, Vienna, Austria.
+  *
+  * Authors:   	SiS (www.sis.com.tw)
+- *		(Various others)
+- *		Thomas Winischhofer <thomas@winischhofer.net>:
+- *			- SiS Xabre (330) support
+- *			- many fixes and enhancements for all chipset series,
+- *			- extended bridge handling, TV output for Chrontel 7005
+- *                      - 650/LVDS support (for LCD panels up to 1600x1200)
+- *                      - 650/740/Chrontel 7019 support
+- *                      - 30xB/30xLV LCD, TV and VGA2 support
+- *			- memory queue handling enhancements,
+- *                      - 2D acceleration and y-panning,
+- *                      - portation to 2.5 API
+- *			- etc.
+- *			(see http://www.winischhofer.net/
+- *			for more information and updates)
++ *		Thomas Winischhofer <thomas@winischhofer.net>
++ *
++ * See http://www.winischhofer.net/ for more information and updates
++ *
++ * Originally based on the VBE 2.0 compliant graphic boards framebuffer driver,
++ * which is (c) 1998 Gerd Knorr <kraxel@goldbach.in-berlin.de>
++ *
+  */
+ 
+ #include <linux/config.h>
+@@ -43,6 +36,7 @@
+ #include <linux/fs.h>
+ #include <linux/agp_backend.h>
+ #include <linux/types.h>
++#include <asm/uaccess.h>
+ 
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+ #include <linux/spinlock.h>
+@@ -79,6 +73,12 @@
+ #endif
+ #endif
+ 
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,69)
++#error "This version of sisfb requires at least 2.5.69"
++#endif
++#endif
++
+ /* -------------------- Macro definitions ---------------------------- */
+ 
+ #undef SISFBDEBUG 	/* TW: no debugging */
+@@ -178,9 +178,12 @@ BOOLEAN sisfb_query_north_bridge_space(P
+ 		case SIS_650:
+ 			nbridge_id = PCI_DEVICE_ID_SI_650;
+ 			break;
+-		case SIS_740:			
++		case SIS_740:
+ 			nbridge_id = PCI_DEVICE_ID_SI_740;
+ 			break;
++		case SIS_660:
++			nbridge_id = PCI_DEVICE_ID_SI_660;
++			break;
+ 		default:
+ 			nbridge_id = 0;
+ 			break;
+@@ -207,64 +210,288 @@ BOOLEAN sisfb_query_north_bridge_space(P
+ 
+ /* ------------------ Internal helper routines ----------------- */
+ 
+-static void sisfb_search_mode(const char *name)
++static BOOLEAN sisfb_verify_rate(struct sisfb_monitor *monitor, int mode_idx, int rate_idx, int rate)
+ {
+-	int i = 0, j = 0;
++	int htotal, vtotal;
++	unsigned int dclock, hsync;
+ 
+-	if(name == NULL) {
+-	   printk(KERN_ERR "sisfb: Internal error, using default mode.\n");
+-	   sisfb_mode_idx = DEFAULT_MODE;
+-	   return;
++	if(!monitor->datavalid) return TRUE;
++
++	if(mode_idx < 0) return FALSE;
++
++	if(rate < (monitor->vmin - 1)) return FALSE;
++	if(rate > (monitor->vmax + 1)) return FALSE;
++
++	if(sisfb_gettotalfrommode(&SiS_Pr, &sishw_ext, sisbios_mode[mode_idx].mode_no,
++	                          &htotal, &vtotal, rate_idx)) {
++		dclock = (htotal * vtotal * rate) / 1000;
++		if(dclock > (monitor->dclockmax + 1000)) return FALSE;
++		hsync = dclock / htotal;
++		if(hsync < (monitor->hmin - 1)) return FALSE;
++		if(hsync > (monitor->hmax + 1)) return FALSE;
++        } else {
++	  	return FALSE;
+ 	}
+-		
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)		
+-        if (!strcmp(name, sisbios_mode[MODE_INDEX_NONE].name)) {
+-	   printk(KERN_ERR "sisfb: Mode 'none' not supported anymore. Using default.\n");
+-	   sisfb_mode_idx = DEFAULT_MODE;
+-	   return;
++	return TRUE;
++};
++
++static BOOLEAN sisfb_interpret_edid(struct sisfb_monitor *monitor, unsigned char *buffer)
++{
++	int i, j, xres, yres, refresh, index;
++	u32 emodes;
++
++	if(buffer[0] != 0x00 || buffer[1] != 0xff ||
++	   buffer[2] != 0xff || buffer[3] != 0xff ||
++	   buffer[4] != 0xff || buffer[5] != 0xff ||
++	   buffer[6] != 0xff || buffer[7] != 0x00) {
++	   printk(KERN_INFO "sisfb: Bad EDID header\n");
++	   return FALSE;
+ 	}
+-#endif		
+ 
+-	while(sisbios_mode[i].mode_no != 0) {
+-		if (!strcmp(name, sisbios_mode[i].name)) {
+-			sisfb_mode_idx = i;
+-			j = 1;
+-			break;
+-		}
+-		i++;
++	if(buffer[0x12] != 0x01) {
++	   printk(KERN_INFO "sisfb: EDID version %d not supported\n",
++	   	buffer[0x12]);
++	   return FALSE;
++	}
++
++	monitor->feature = buffer[0x18];
++
++	if(!buffer[0x14] & 0x80) {
++	   if(!(buffer[0x14] & 0x08)) {
++	      printk(KERN_INFO "sisfb: WARNING: Monitor does not support separate syncs\n");
++	   }
++	}
++
++	if(buffer[0x13] >= 0x01) {
++	   /* EDID V1 rev 1 and 2: Search for monitor descriptor
++	    * to extract ranges
++	    */
++	    j = 0x36;
++	    for(i=0; i<4; i++) {
++	       if(buffer[j]     == 0x00 && buffer[j + 1] == 0x00 &&
++	          buffer[j + 2] == 0x00 && buffer[j + 3] == 0xfd &&
++		  buffer[j + 4] == 0x00) {
++		  monitor->hmin = buffer[j + 7];
++		  monitor->hmax = buffer[j + 8];
++		  monitor->vmin = buffer[j + 5];
++		  monitor->vmax = buffer[j + 6];
++		  monitor->dclockmax = buffer[j + 9] * 10 * 1000;
++		  monitor->datavalid = TRUE;
++		  break;
++	       }
++	       j += 18;
++	    }
++	}
++
++	if(!monitor->datavalid) {
++	   /* Otherwise: Get a range from the list of supported
++	    * Estabished Timings. This is not entirely accurate,
++	    * because fixed frequency monitors are not supported
++	    * that way.
++	    */
++	   monitor->hmin = 65535; monitor->hmax = 0;
++	   monitor->vmin = 65535; monitor->vmax = 0;
++	   monitor->dclockmax = 0;
++	   emodes = buffer[0x23] | (buffer[0x24] << 8) | (buffer[0x25] << 16);
++	   for(i = 0; i < 13; i++) {
++	      if(emodes & sisfb_ddcsmodes[i].mask) {
++	         if(monitor->hmin > sisfb_ddcsmodes[i].h) monitor->hmin = sisfb_ddcsmodes[i].h;
++		 if(monitor->hmax < sisfb_ddcsmodes[i].h) monitor->hmax = sisfb_ddcsmodes[i].h + 1;
++		 if(monitor->vmin > sisfb_ddcsmodes[i].v) monitor->vmin = sisfb_ddcsmodes[i].v;
++		 if(monitor->vmax < sisfb_ddcsmodes[i].v) monitor->vmax = sisfb_ddcsmodes[i].v;
++		 if(monitor->dclockmax < sisfb_ddcsmodes[i].d) monitor->dclockmax = sisfb_ddcsmodes[i].d;
++	      }
++	   }
++	   index = 0x26;
++	   for(i = 0; i < 8; i++) {
++	      xres = (buffer[index] + 31) * 8;
++	      switch(buffer[index + 1] & 0xc0) {
++	         case 0xc0: yres = (xres * 9) / 16; break;
++	         case 0x80: yres = (xres * 4) /  5; break;
++	         case 0x40: yres = (xres * 3) /  4; break;
++	         default:   yres = xres;	    break;
++	      }
++	      refresh = (buffer[index + 1] & 0x3f) + 60;
++	      if((xres >= 640) && (yres >= 480)) {
++                 for(j = 0; j < 8; j++) {
++	            if((xres == sisfb_ddcfmodes[j].x) &&
++	               (yres == sisfb_ddcfmodes[j].y) &&
++		       (refresh == sisfb_ddcfmodes[j].v)) {
++		      if(monitor->hmin > sisfb_ddcfmodes[j].h) monitor->hmin = sisfb_ddcfmodes[j].h;
++		      if(monitor->hmax < sisfb_ddcfmodes[j].h) monitor->hmax = sisfb_ddcfmodes[j].h + 1;
++		      if(monitor->vmin > sisfb_ddcsmodes[j].v) monitor->vmin = sisfb_ddcsmodes[j].v;
++		      if(monitor->vmax < sisfb_ddcsmodes[j].v) monitor->vmax = sisfb_ddcsmodes[j].v;
++		      if(monitor->dclockmax < sisfb_ddcsmodes[j].d) monitor->dclockmax = sisfb_ddcsmodes[i].d;
++	            }
++	         }
++	      }
++	      index += 2;
++           }
++	   if((monitor->hmin <= monitor->hmax) && (monitor->vmin <= monitor->vmax)) {
++	      monitor->datavalid = TRUE;
++	   }
++	}
++
++ 	return(monitor->datavalid);
++}
++
++static void sisfb_handle_ddc(struct sisfb_monitor *monitor, int crtno)
++{
++	USHORT        temp, i, realcrtno = crtno;
++   	unsigned char buffer[256];
++
++	monitor->datavalid = FALSE;
++
++	if(crtno) {
++       	   if(ivideo.vbflags & CRT2_LCD)      realcrtno = 1;
++      	   else if(ivideo.vbflags & CRT2_VGA) realcrtno = 2;
++      	   else return;
++   	}
++
++	if((sisfb_crt1off) && (!crtno)) return;
++
++    	temp = SiS_HandleDDC(&SiS_Pr, ivideo.vbflags, sisvga_engine, realcrtno, 0, &buffer[0]);
++   	if((!temp) || (temp == 0xffff)) {
++      	   printk(KERN_INFO "sisfb: CRT%d DDC probing failed\n", crtno + 1);
++	   return;
++   	} else {
++      	   printk(KERN_INFO "sisfb: CRT%d DDC supported\n", crtno + 1);
++      	   printk(KERN_INFO "sisfb: CRT%d DDC level: %s%s%s%s\n",
++	   	crtno + 1,
++	   	(temp & 0x1a) ? "" : "[none of the supported]",
++	   	(temp & 0x02) ? "2 " : "",
++	   	(temp & 0x08) ? "D&P" : "",
++           	(temp & 0x10) ? "FPDI-2" : "");
++      	   if(temp & 0x02) {
++	      i = 3;  /* Number of retrys */
++	      do {
++	    	 temp = SiS_HandleDDC(&SiS_Pr, ivideo.vbflags, sisvga_engine,
++				     realcrtno, 1, &buffer[0]);
++	      } while((temp) && i--);
++              if(!temp) {
++	    	 if(sisfb_interpret_edid(monitor, &buffer[0])) {
++		    printk(KERN_INFO "sisfb: Monitor range H %d-%dKHz, V %d-%dHz, Max. dotclock %dMHz\n",
++		    	monitor->hmin, monitor->hmax, monitor->vmin, monitor->vmax,
++			monitor->dclockmax / 1000);
++		 } else {
++	       	    printk(KERN_INFO "sisfb: CRT%d DDC EDID corrupt\n", crtno + 1);
++	    	 }
++	      } else {
++            	 printk(KERN_INFO "sisfb: CRT%d DDC reading failed\n", crtno + 1);
++	      }
++	   } else {
++	      printk(KERN_INFO "sisfb: VESA D&P and FPDI-2 not supported yet\n");
++	   }
+ 	}
+-	if(!j) printk(KERN_INFO "sisfb: Invalid mode '%s'\n", name);
+ }
+ 
+-static void sisfb_search_vesamode(unsigned int vesamode)
++static void sisfb_search_vesamode(unsigned int vesamode, BOOLEAN quiet)
+ {
+ 	int i = 0, j = 0;
+ 
+ 	if(vesamode == 0) {
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)	
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+ 		sisfb_mode_idx = MODE_INDEX_NONE;
+ #else
+-		printk(KERN_ERR "sisfb: Mode 'none' not supported anymore. Using default.\n");
++		if(!quiet)
++		   printk(KERN_ERR "sisfb: Mode 'none' not supported anymore. Using default.\n");
+ 		sisfb_mode_idx = DEFAULT_MODE;
+-#endif		
++#endif
+ 		return;
+ 	}
+ 
+ 	vesamode &= 0x1dff;  /* Clean VESA mode number from other flags */
+ 
++	while(sisbios_mode[i++].mode_no != 0) {
++		if( (sisbios_mode[i-1].vesa_mode_no_1 == vesamode) ||
++		    (sisbios_mode[i-1].vesa_mode_no_2 == vesamode) ) {
++		    if(sisfb_fstn) {
++		       if(sisbios_mode[i-1].mode_no == 0x50 ||
++		          sisbios_mode[i-1].mode_no == 0x56 ||
++		          sisbios_mode[i-1].mode_no == 0x53) continue;
++	            } else {
++		       if(sisbios_mode[i-1].mode_no == 0x5a ||
++		          sisbios_mode[i-1].mode_no == 0x5b) continue;
++		    }
++		    sisfb_mode_idx = i - 1;
++		    j = 1;
++		    break;
++		}
++	}
++	if((!j) && !quiet) printk(KERN_ERR "sisfb: Invalid VESA mode 0x%x'\n", vesamode);
++}
++
++static void sisfb_search_mode(char *name, BOOLEAN quiet)
++{
++	int i = 0;
++	unsigned int j = 0, xres = 0, yres = 0, depth = 0, rate = 0;
++	char strbuf[16], strbuf1[20];
++	char *nameptr = name;
++
++	if(name == NULL) {
++	   if(!quiet)
++	      printk(KERN_ERR "sisfb: Internal error, using default mode.\n");
++	   sisfb_mode_idx = DEFAULT_MODE;
++	   return;
++	}
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
++        if (!strcmp(name, sisbios_mode[MODE_INDEX_NONE].name)) {
++	   if(!quiet)
++	      printk(KERN_ERR "sisfb: Mode 'none' not supported anymore. Using default.\n");
++	   sisfb_mode_idx = DEFAULT_MODE;
++	   return;
++	}
++#endif
++	if(strlen(name) <= 19) {
++	   strcpy(strbuf1, name);
++	   for(i=0; i<strlen(strbuf1); i++) {
++	      if(strbuf1[i] < '0' || strbuf1[i] > '9') strbuf1[i] = ' ';
++	   }
++
++	   /* This does some fuzzy mode naming detection */
++	   if(sscanf(strbuf1, "%u %u %u %u", &xres, &yres, &depth, &rate) == 4) {
++	      if((rate <= 32) || (depth > 32)) {
++	         j = rate; rate = depth; depth = j;
++	      }
++	      sprintf(strbuf, "%ux%ux%u", xres, yres, depth);
++	      nameptr = strbuf;
++	      ivideo.refresh_rate = sisfb_parm_rate = rate;
++	   } else if(sscanf(strbuf1, "%u %u %u", &xres, &yres, &depth) == 3) {
++	      sprintf(strbuf, "%ux%ux%u", xres, yres, depth);
++	      nameptr = strbuf;
++	   } else {
++	      xres = 0;
++	      if((sscanf(strbuf1, "%u %u", &xres, &yres) == 2) && (xres != 0)) {
++	         sprintf(strbuf, "%ux%ux8", xres, yres);
++	         nameptr = strbuf;
++	      } else {
++	         sisfb_search_vesamode(simple_strtoul(name, NULL, 0), quiet);
++	         return;
++	      }
++	   }
++	}
++
++	i = 0; j = 0;
+ 	while(sisbios_mode[i].mode_no != 0) {
+-		if( (sisbios_mode[i].vesa_mode_no_1 == vesamode) ||
+-		    (sisbios_mode[i].vesa_mode_no_2 == vesamode) ) {
+-			sisfb_mode_idx = i;
+-			j = 1;
+-			break;
++		if(!strcmp(nameptr, sisbios_mode[i++].name)) {
++		   if(sisfb_fstn) {
++		      if(sisbios_mode[i-1].mode_no == 0x50 ||
++		         sisbios_mode[i-1].mode_no == 0x56 ||
++		         sisbios_mode[i-1].mode_no == 0x53) continue;
++	           } else {
++		      if(sisbios_mode[i-1].mode_no == 0x5a ||
++		         sisbios_mode[i-1].mode_no == 0x5b) continue;
++		   }
++		   sisfb_mode_idx = i - 1;
++		   j = 1;
++		   break;
+ 		}
+-		i++;
+ 	}
+-	if(!j) printk(KERN_INFO "sisfb: Invalid VESA mode 0x%x'\n", vesamode);
++	if((!j) && !quiet) printk(KERN_ERR "sisfb: Invalid mode '%s'\n", nameptr);
+ }
+ 
+-static int sisfb_validate_mode(int myindex)
++static int sisfb_validate_mode(int myindex, unsigned long vbflags)
+ {
+    u16 xres, yres;
+ 
+@@ -283,8 +510,8 @@ static int sisfb_validate_mode(int myind
+    }
+ #endif
+ 
+-   switch (ivideo.disp_state & DISPTYPE_DISP2) {
+-     case DISPTYPE_LCD:
++   switch (vbflags & VB_DISPTYPE_DISP2) {
++     case CRT2_LCD:
+ 	switch (sishw_ext.ulCRT2LCDType) {
+ 	case LCD_640x480:
+ 		xres =  640; yres =  480;  break;
+@@ -306,24 +533,49 @@ static int sisfb_validate_mode(int myind
+ 		xres = 1400; yres = 1050;  break;		
+ 	case LCD_1600x1200:
+ 		xres = 1600; yres = 1200;  break;
+-	case LCD_320x480:				/* TW: FSTN */
++	case LCD_320x480:				/* FSTN (old) */
+ 		xres =  320; yres =  480;  break;
++	case LCD_640x480_2:				/* FSTN (new) */
++	case LCD_640x480_3:
++		xres =  640; yres =  480;  break;
+ 	default:
+ 	        xres =    0; yres =    0;  break;
+ 	}
++	if(SiS_Pr.SiS_CustomT == CUT_BARCO1366) {
++	   	xres = 1360; yres = 1024;
++	}
+ 	if(sisbios_mode[myindex].xres > xres) {
+ 	        return(-1);
+ 	}
+         if(sisbios_mode[myindex].yres > yres) {
+ 	        return(-1);
+ 	}
+-	if((sishw_ext.usExternalChip == 0x01) ||   /* LVDS */
+-           (sishw_ext.usExternalChip == 0x05) ||   /* LVDS+Chrontel */
+-	   (sishw_ext.Is301BDH)) {		   /* 301B-DH */
++	if(vbflags & (VB_LVDS | VB_30xBDH)) {
+ 	   switch (sisbios_mode[myindex].xres) {
++	   	case 320:
++			if((sisbios_mode[myindex].yres != 200) &&
++	           	   (sisbios_mode[myindex].yres != 240))
++		          	return(-1);
++			if((sisbios_mode[myindex].yres == 240) ||
++			   (sisbios_mode[myindex].yres == 480)) {
++			   	if(!sisfb_fstn) {
++				   if(sisbios_mode[myindex].mode_no == 0x5a ||
++				      sisbios_mode[myindex].mode_no == 0x5b)
++					return(-1);
++			        } else {
++				   if(sisbios_mode[myindex].mode_no == 0x50 ||
++				      sisbios_mode[myindex].mode_no == 0x56 ||
++				      sisbios_mode[myindex].mode_no == 0x53)
++					return(-1);
++				}
++			}
++			break;
++		case 400:
++	       		if(sisbios_mode[myindex].yres != 300) return(-1);
++	       		break;
+ 	   	case 512:
+-	       		if(sisbios_mode[myindex].yres != 512) return -1;
+-			if(sishw_ext.ulCRT2LCDType == LCD_1024x600) return -1;
++	       		if(sisbios_mode[myindex].yres != 384) return(-1);
++			if(sishw_ext.ulCRT2LCDType == LCD_1024x600) return(-1);
+ 	       		break;
+ 	   	case 640:
+ 		       	if((sisbios_mode[myindex].yres != 400) &&
+@@ -331,115 +583,130 @@ static int sisfb_validate_mode(int myind
+ 		          	return -1;
+ 	       		break;
+ 	   	case 800:
+-		       	if(sisbios_mode[myindex].yres != 600) return -1;
++		       	if(sisbios_mode[myindex].yres != 600) return(-1);
+ 	       		break;
+ 	   	case 1024:
+ 		       	if((sisbios_mode[myindex].yres != 600) &&
+ 	           	   (sisbios_mode[myindex].yres != 768))
+-		          	return -1;
++		          	return(-1);
+ 			if((sisbios_mode[myindex].yres == 600) &&
+ 			   (sishw_ext.ulCRT2LCDType != LCD_1024x600))
+-			   	return -1;
++			   	return(-1);
+ 			break;
+ 		case 1152:
+-			if((sisbios_mode[myindex].yres) != 768) return -1;
+-			if(sishw_ext.ulCRT2LCDType != LCD_1152x768) return -1;
++			if((sisbios_mode[myindex].yres) != 768) return(-1);
++			if(sishw_ext.ulCRT2LCDType != LCD_1152x768) return(-1);
+ 			break;
+ 	   	case 1280:
+ 		   	if((sisbios_mode[myindex].yres != 768) &&
+ 	           	   (sisbios_mode[myindex].yres != 1024))
+-		          	return -1;
++		          	return(-1);
+ 			if((sisbios_mode[myindex].yres == 768) &&
+ 			   (sishw_ext.ulCRT2LCDType != LCD_1280x768))
+-			   	return -1;				
++			   	return(-1);
++			break;
++		case 1360:
++			if(SiS_Pr.SiS_CustomT != CUT_BARCO1366) return(-1);
++			if(sisbios_mode[myindex].yres != 1024) return(-1);
+ 			break;
+ 	   	case 1400:
+-		   	if(sisbios_mode[myindex].yres != 1050) return -1;
++		   	if(sisbios_mode[myindex].yres != 1050) return(-1);
+ 			break;
+ 	   	case 1600:
+-		   	if(sisbios_mode[myindex].yres != 1200) return -1;
++		   	if(sisbios_mode[myindex].yres != 1200) return(-1);
+ 			break;
+ 	   	default:
+-		        return -1;		
++		        return(-1);
+ 	   }
+ 	} else {
+ 	   switch (sisbios_mode[myindex].xres) {
++	   	case 320:
++			if((sisbios_mode[myindex].yres != 200) &&
++	           	   (sisbios_mode[myindex].yres != 240))
++		          	return -1;
++			break;
++		case 400:
++	       		if(sisbios_mode[myindex].yres != 300) return(-1);
++	       		break;
+ 	   	case 512:
+-	       		if(sisbios_mode[myindex].yres != 512) return -1;
++	       		if(sisbios_mode[myindex].yres != 384) return(-1);
+ 	       		break;
+ 	   	case 640:
+ 		       	if((sisbios_mode[myindex].yres != 400) &&
+ 	           	   (sisbios_mode[myindex].yres != 480))
+-		          	return -1;
++		          	return(-1);
+ 	       		break;
+ 	   	case 800:
+-		       	if(sisbios_mode[myindex].yres != 600) return -1;
++		       	if(sisbios_mode[myindex].yres != 600) return(-1);
+ 	       		break;
+ 	   	case 1024:
+-		       	if(sisbios_mode[myindex].yres != 768) return -1;
++		       	if(sisbios_mode[myindex].yres != 768) return(-1);
+ 			break;
+ 	   	case 1280:
+ 		   	if((sisbios_mode[myindex].yres != 960) &&
++			   (sisbios_mode[myindex].yres != 768) &&
+ 	           	   (sisbios_mode[myindex].yres != 1024))
+-		          	return -1;
+-			if(sisbios_mode[myindex].yres == 960) {
+-			    if(sishw_ext.ulCRT2LCDType == LCD_1400x1050) 
+-			   	return -1;
++		          	return(-1);
++			if((sisbios_mode[myindex].yres == 768) ||
++			   (sisbios_mode[myindex].yres == 960)) {
++			    	if(sishw_ext.ulCRT2LCDType == LCD_1400x1050)
++			   		return(-1);
++			}
++			if(sisbios_mode[myindex].yres == 768) {
++			    	if(sishw_ext.ulCRT2LCDType == LCD_1280x960)
++			   		return(-1);
+ 			}
+ 			break;
+ 	   	case 1400:
+-		   	if(sisbios_mode[myindex].yres != 1050) return -1;
++		   	if(sisbios_mode[myindex].yres != 1050) return(-1);
+ 			break;
+ 	   	case 1600:
+-		   	if(sisbios_mode[myindex].yres != 1200) return -1;
++		   	if(sisbios_mode[myindex].yres != 1200) return(-1);
+ 			break;
+ 	   	default:
+-		        return -1;		
++		        return(-1);
+ 	   }
+ 	}
+ 	break;
+-     case DISPTYPE_TV:
++     case CRT2_TV:
+ 	switch (sisbios_mode[myindex].xres) {
+ 	case 512:
++		if(vbflags & VB_CHRONTEL) return(-1);
++		if((vbflags & VB_SISBRIDGE) && (vbflags & TV_NTSC))
++		   	return(-1);
++		/* fall through */
+ 	case 640:
+ 	case 800:
+ 		break;
+ 	case 720:
+-		if (ivideo.TV_type == TVMODE_NTSC) {
++		if(vbflags & VB_CHRONTEL) return -1;
++		if(vbflags & TV_NTSC) {
+ 			if (sisbios_mode[myindex].yres != 480) {
+ 				return(-1);
+ 			}
+-		} else if (ivideo.TV_type == TVMODE_PAL) {
++		} else if(vbflags & TV_PAL) {
+ 			if (sisbios_mode[myindex].yres != 576) {
+ 				return(-1);
+ 			}
+ 		}
+-		/* TW: LVDS/CHRONTEL does not support 720 */
+-		if (ivideo.hasVB == HASVB_LVDS_CHRONTEL ||
+-					ivideo.hasVB == HASVB_CHRONTEL) {
+-				return(-1);
+-		}
+ 		break;
+ 	case 1024:
+-		if (ivideo.TV_type == TVMODE_NTSC) {
+-			if(sisbios_mode[myindex].bpp == 32) {
+-			       return(-1);
+-			}
+-		}
+-		/* TW: LVDS/CHRONTEL only supports < 800 (1024 on 650/Ch7019)*/
+-		if (ivideo.hasVB == HASVB_LVDS_CHRONTEL ||
+-					ivideo.hasVB == HASVB_CHRONTEL) {
+-		    if(ivideo.chip < SIS_315H) {
++		if(vbflags & VB_301) return(-1);
++		if(vbflags & VB_CHRONTEL) {
++		    	if(ivideo.chip < SIS_315H) {
+ 				return(-1);
+-		    }
++		    	}
+ 		}
+ 		break;
+ 	default:
+ 		return(-1);
+ 	}
+ 	break;
+-     case DISPTYPE_CRT2:	
+-        if(sisbios_mode[myindex].xres > 1280) return -1;
++     case CRT2_VGA:	
++        if(sisbios_mode[myindex].xres > 1600) return(-1);
++	if(!(vbflags & (VB_301B|VB_302B))) {
++	   if(sisbios_mode[myindex].xres > 1400) return(-1);
++	}
+ 	break;	
+      }
+      return(myindex);
+@@ -456,12 +723,17 @@ static void sisfb_search_crt2type(const 
+ 		if (!strcmp(name, sis_crt2type[i].name)) {
+ 			sisfb_crt2type = sis_crt2type[i].type_no;
+ 			sisfb_tvplug = sis_crt2type[i].tvplug_no;
++			sisfb_dstn = (sis_crt2type[i].flags & FL_550_DSTN) ? 1 : 0;
++			sisfb_fstn = (sis_crt2type[i].flags & FL_550_FSTN) ? 1 : 0;
+ 			break;
+ 		}
+ 		i++;
+ 	}
+ 	if(sisfb_crt2type < 0)
+-		printk(KERN_INFO "sisfb: Invalid CRT2 type: %s\n", name);
++		printk(KERN_ERR "sisfb: Invalid CRT2 type: %s\n", name);
++        if(ivideo.chip != SIS_550) {
++	   sisfb_dstn = sisfb_fstn = 0;
++	}
+ }
+ 
+ static void sisfb_search_queuemode(const char *name)
+@@ -479,16 +751,16 @@ static void sisfb_search_queuemode(const
+ 		i++;
+ 	}
+ 	if (sisfb_queuemode < 0)
+-		printk(KERN_INFO "sisfb: Invalid queuemode type: %s\n", name);
++		printk(KERN_ERR "sisfb: Invalid queuemode type: %s\n", name);
+ }
+ 
+-static u8 sisfb_search_refresh_rate(unsigned int rate)
++static u8 sisfb_search_refresh_rate(unsigned int rate, int mode_idx)
+ {
+ 	u16 xres, yres;
+ 	int i = 0;
+ 
+-	xres = sisbios_mode[sisfb_mode_idx].xres;
+-	yres = sisbios_mode[sisfb_mode_idx].yres;
++	xres = sisbios_mode[mode_idx].xres;
++	yres = sisbios_mode[mode_idx].yres;
+ 
+ 	sisfb_rate_idx = 0;
+ 	while ((sisfb_vrate[i].idx != 0) && (sisfb_vrate[i].xres <= xres)) {
+@@ -537,7 +809,7 @@ static void sisfb_search_tvstd(const cha
+ 
+ 	while (sis_tvtype[i].type_no != -1) {
+ 		if (!strcmp(name, sis_tvtype[i].name)) {
+-			sisfb_tvmode = sis_tvtype[i].type_no;
++			ivideo.vbflags |= sis_tvtype[i].type_no;
+ 			break;
+ 		}
+ 		i++;
+@@ -546,13 +818,13 @@ static void sisfb_search_tvstd(const cha
+ 
+ static BOOLEAN sisfb_bridgeisslave(void)
+ {
+-   unsigned char usScratchP1_00;
++   unsigned char P1_00;
+ 
+-   if(ivideo.hasVB == HASVB_NONE) return FALSE;
++   if(!(ivideo.vbflags & VB_VIDEOBRIDGE)) return FALSE;
+ 
+-   inSISIDXREG(SISPART1,0x00,usScratchP1_00);
+-   if( ((sisvga_engine == SIS_300_VGA) && (usScratchP1_00 & 0xa0) == 0x20) ||
+-       ((sisvga_engine == SIS_315_VGA) && (usScratchP1_00 & 0x50) == 0x10) ) {
++   inSISIDXREG(SISPART1,0x00,P1_00);
++   if( ((sisvga_engine == SIS_300_VGA) && (P1_00 & 0xa0) == 0x20) ||
++       ((sisvga_engine == SIS_315_VGA) && (P1_00 & 0x50) == 0x10) ) {
+ 	   return TRUE;
+    } else {
+            return FALSE;
+@@ -597,7 +869,7 @@ static BOOLEAN sisfbcheckvretracecrt2(vo
+ 
+ static BOOLEAN sisfb_CheckVBRetrace(void) 
+ {
+-   if(ivideo.disp_state & DISPTYPE_DISP2) {
++   if(ivideo.currentvbflags & VB_DISPTYPE_DISP2) {
+       if(sisfb_bridgeisslave()) {
+          return(sisfbcheckvretracecrt1());
+       } else {
+@@ -607,60 +879,195 @@ static BOOLEAN sisfb_CheckVBRetrace(void
+    return(sisfbcheckvretracecrt1());
+ }
+ 
++static int sisfb_myblank(int blank)
++{
++   u8 sr01, sr11, sr1f, cr63=0, p2_0, p1_13;
++   BOOLEAN backlight = TRUE;
++
++   switch(blank) {
++   case 0:	/* on */
++      sr01  = 0x00;
++      sr11  = 0x00;
++      sr1f  = 0x00;
++      cr63  = 0x00;
++      p2_0  = 0x20;
++      p1_13 = 0x00;
++      backlight = TRUE;
++      break;
++   case 1:	/* blank */
++      sr01  = 0x20;
++      sr11  = 0x00;
++      sr1f  = 0x00;
++      cr63  = 0x00;
++      p2_0  = 0x20;
++      p1_13 = 0x00;
++      backlight = TRUE;
++      break;
++   case 2:	/* no vsync */
++      sr01  = 0x20;
++      sr11  = 0x08;
++      sr1f  = 0x80;
++      cr63  = 0x40;
++      p2_0  = 0x40;
++      p1_13 = 0x80;
++      backlight = FALSE;
++      break;
++   case 3:	/* no hsync */
++      sr01  = 0x20;
++      sr11  = 0x08;
++      sr1f  = 0x40;
++      cr63  = 0x40;
++      p2_0  = 0x80;
++      p1_13 = 0x40;
++      backlight = FALSE;
++      break;
++   case 4:	/* off */
++      sr01  = 0x20;
++      sr11  = 0x08;
++      sr1f  = 0xc0;
++      cr63  = 0x40;
++      p2_0  = 0xc0;
++      p1_13 = 0xc0;
++      backlight = FALSE;
++      break;
++   default:
++      return 1;
++   }
++
++   if(ivideo.currentvbflags & VB_DISPTYPE_CRT1) {
++
++      setSISIDXREG(SISSR, 0x01, ~0x20, sr01);
++
++      if( (!sisfb_thismonitor.datavalid) ||
++          ((sisfb_thismonitor.datavalid) &&
++           (sisfb_thismonitor.feature & 0xe0))) {
++
++	 if(sisvga_engine == SIS_315_VGA) {
++	    setSISIDXREG(SISCR, 0x63, 0xbf, cr63);
++	 }
++
++	 setSISIDXREG(SISSR, 0x1f, 0x3f, sr1f);
++      }
++
++   }
++
++   if(ivideo.currentvbflags & CRT2_LCD) {
++
++      if(ivideo.vbflags & (VB_301LV|VB_302LV)) {
++	 if(backlight) {
++	    SiS_SiS30xBLOn(&SiS_Pr, &sishw_ext);
++	 } else {
++	    SiS_SiS30xBLOff(&SiS_Pr, &sishw_ext);
++	 }
++      } else if(sisvga_engine == SIS_315_VGA) {
++	 if(ivideo.vbflags & VB_CHRONTEL) {
++	    if(backlight) {
++	       SiS_Chrontel701xBLOn(&SiS_Pr,&sishw_ext);
++	    } else {
++	       SiS_Chrontel701xBLOff(&SiS_Pr);
++	    }
++	 }
++      }
++
++      if(((sisvga_engine == SIS_300_VGA) &&
++          (ivideo.vbflags & (VB_301|VB_30xBDH|VB_LVDS))) ||
++         ((sisvga_engine == SIS_315_VGA) &&
++          ((ivideo.vbflags & (VB_LVDS | VB_CHRONTEL)) == VB_LVDS))) {
++          setSISIDXREG(SISSR, 0x11, ~0x0c, sr11);
++      }
++
++      if(sisvga_engine == SIS_300_VGA) {
++         if((ivideo.vbflags & (VB_301B|VB_302B)) &&
++            (!(ivideo.vbflags & VB_30xBDH))) {
++	    setSISIDXREG(SISPART1, 0x13, 0x3f, p1_13);
++	 }
++      } else if(sisvga_engine == SIS_315_VGA) {
++         if((ivideo.vbflags & (VB_301B|VB_302B)) &&
++            (!(ivideo.vbflags & VB_30xBDH))) {
++	    setSISIDXREG(SISPART2, 0x00, 0x1f, p2_0);
++	 }
++      }
++
++   } else if(ivideo.currentvbflags & CRT2_VGA) {
++
++      if(ivideo.vbflags & (VB_301B|VB_302B)) {
++         setSISIDXREG(SISPART2, 0x00, 0x1f, p2_0);
++      }
++
++   }
++
++   return(0);
++}
++
+ /* ----------- FBDev related routines for all series ----------- */
+ 
++static void sisfb_set_vparms(void)
++{
++   switch(ivideo.video_bpp) {
++   case 8:
++       	ivideo.DstColor = 0x0000;
++	ivideo.SiS310_AccelDepth = 0x00000000;
++	ivideo.video_cmap_len = 256;
++       	break;
++   case 16:
++       	ivideo.DstColor = 0x8000;
++       	ivideo.SiS310_AccelDepth = 0x00010000;
++	ivideo.video_cmap_len = 16;
++       	break;
++   case 32:
++       	ivideo.DstColor = 0xC000;
++	ivideo.SiS310_AccelDepth = 0x00020000;
++	ivideo.video_cmap_len = 16;
++       	break;
++   default:
++ 	ivideo.video_cmap_len = 16;
++	printk(KERN_ERR "sisfb: Unsupported depth %d", ivideo.video_bpp);
++	ivideo.accel = 0;
++	break;
++   }
++}
++
+ static int sisfb_do_set_var(struct fb_var_screeninfo *var, int isactive,
+ 		      struct fb_info *info)
+ {
+-	unsigned int htotal =
+-		var->left_margin + var->xres + var->right_margin +
+-		var->hsync_len;
+-	unsigned int vtotal = 0; 
++	unsigned int htotal = 0, vtotal = 0; 
+ 	double drate = 0, hrate = 0;
+ 	int found_mode = 0;
+ 	int old_mode;
+-	unsigned char reg;
++	u32 pixclock;
+ 
+-	TWDEBUG("Inside do_set_var");
+-	
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)	
+-	inSISIDXREG(SISCR,0x34,reg);
+-	if(reg & 0x80) {
+-	   printk(KERN_INFO "sisfb: Cannot change display mode, X server is active\n");
+-	   return -EBUSY;
+-	}
+-#endif	
++	htotal = var->left_margin + var->xres + var->right_margin + var->hsync_len;
++
++	vtotal = var->upper_margin + var->lower_margin + var->vsync_len;
++
++	pixclock = var->pixclock;
+ 
+ 	if((var->vmode & FB_VMODE_MASK) == FB_VMODE_NONINTERLACED) {
+-		vtotal = var->upper_margin + var->yres + var->lower_margin +
+-		         var->vsync_len;
++		vtotal += var->yres;
+ 		vtotal <<= 1;
+ 	} else if((var->vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) {
+-		vtotal = var->upper_margin + var->yres + var->lower_margin +
+-		         var->vsync_len;
++		vtotal += var->yres;
+ 		vtotal <<= 2;
+ 	} else if((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) {
+-		vtotal = var->upper_margin + (var->yres/2) + var->lower_margin +
+-		         var->vsync_len; 
+-	} else 	vtotal = var->upper_margin + var->yres + var->lower_margin +
+-		         var->vsync_len;
++		vtotal += var->yres;
++		vtotal <<= 1;
++	} else 	vtotal += var->yres;
+ 
+ 	if(!(htotal) || !(vtotal)) {
+ 		DPRINTK("sisfb: Invalid 'var' information\n");
+ 		return -EINVAL;
+ 	}
+ 
+-	if(var->pixclock && htotal && vtotal) {
+-	   drate = 1E12 / var->pixclock;
++	if(pixclock && htotal && vtotal) {
++	   drate = 1E12 / pixclock;
+ 	   hrate = drate / htotal;
+ 	   ivideo.refresh_rate = (unsigned int) (hrate / vtotal * 2 + 0.5);
+ 	} else ivideo.refresh_rate = 60;
+ 
+-	/* TW: Calculation wrong for 1024x600 - force it to 60Hz */
+-	if((var->xres == 1024) && (var->yres == 600)) ivideo.refresh_rate = 60;
+-
++#if 0
+ 	printk(KERN_DEBUG "sisfb: Change mode to %dx%dx%d-%dHz\n",
+ 		var->xres,var->yres,var->bits_per_pixel,ivideo.refresh_rate);
++#endif		
+ 
+ 	old_mode = sisfb_mode_idx;
+ 	sisfb_mode_idx = 0;
+@@ -678,7 +1085,7 @@ static int sisfb_do_set_var(struct fb_va
+ 	}
+ 
+ 	if(found_mode)
+-		sisfb_mode_idx = sisfb_validate_mode(sisfb_mode_idx);
++		sisfb_mode_idx = sisfb_validate_mode(sisfb_mode_idx, ivideo.currentvbflags);
+ 	else
+ 		sisfb_mode_idx = -1;
+ 
+@@ -689,12 +1096,21 @@ static int sisfb_do_set_var(struct fb_va
+ 		return -EINVAL;
+ 	}
+ 
+-	if(sisfb_search_refresh_rate(ivideo.refresh_rate) == 0) {
++	if(sisfb_search_refresh_rate(ivideo.refresh_rate, sisfb_mode_idx) == 0) {
+ 		sisfb_rate_idx = sisbios_mode[sisfb_mode_idx].rate_idx;
+ 		ivideo.refresh_rate = 60;
+ 	}
+ 
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++	if(sisfb_thismonitor.datavalid) {
++	   if(!sisfb_verify_rate(&sisfb_thismonitor, sisfb_mode_idx,
++	                         sisfb_rate_idx, ivideo.refresh_rate)) {
++	      printk(KERN_INFO "sisfb: WARNING: Refresh rate exceeds monitor specs!\n");
++	   }
++	}
++#endif
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+ 	if(((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) && isactive) {
+ #else
+ 	if(isactive) {
+@@ -707,15 +1123,7 @@ static int sisfb_do_set_var(struct fb_va
+ 		}
+ 
+ 		outSISIDXREG(SISSR, IND_SIS_PASSWORD, SIS_PASSWORD);
+-
+-		sisfb_post_setmode();
+-
+-		DPRINTK("sisfb: Set new mode: %dx%dx%d-%d \n",
+-			sisbios_mode[sisfb_mode_idx].xres,
+-			sisbios_mode[sisfb_mode_idx].yres,
+-			sisbios_mode[sisfb_mode_idx].bpp,
+-			ivideo.refresh_rate);
+-
++		
+ 		ivideo.video_bpp = sisbios_mode[sisfb_mode_idx].bpp;
+ 		ivideo.video_vwidth = ivideo.video_width = sisbios_mode[sisfb_mode_idx].xres;
+ 		ivideo.video_vheight = ivideo.video_height = sisbios_mode[sisfb_mode_idx].yres;
+@@ -725,54 +1133,39 @@ static int sisfb_do_set_var(struct fb_va
+ 		if(sisfb_accel) {
+ 		   ivideo.accel = (var->accel_flags & FB_ACCELF_TEXT) ? -1 : 0;
+ 		}
+-		switch(ivideo.video_bpp) {
+-        	case 8:
+-            		ivideo.DstColor = 0x0000;
+-	    		ivideo.SiS310_AccelDepth = 0x00000000;
+-			ivideo.video_cmap_len = 256;
+-            		break;
+-        	case 16:
+-            		ivideo.DstColor = 0x8000;
+-            		ivideo.SiS310_AccelDepth = 0x00010000;
+-			ivideo.video_cmap_len = 16;
+-            		break;
+-        	case 32:
+-            		ivideo.DstColor = 0xC000;
+-	    		ivideo.SiS310_AccelDepth = 0x00020000;
+-			ivideo.video_cmap_len = 16;
+-            		break;
+-		default:
+-			ivideo.video_cmap_len = 16;
+-		        printk(KERN_ERR "sisfb: Unsupported depth %d", ivideo.video_bpp);
+-			ivideo.accel = 0;
+-			break;
+-    		}
++
++		sisfb_set_vparms();
++		
++		ivideo.current_width = ivideo.video_width;
++		ivideo.current_height = ivideo.video_height;
++		ivideo.current_bpp = ivideo.video_bpp;
++		ivideo.current_htotal = htotal;
++		ivideo.current_vtotal = vtotal;
++		ivideo.current_pixclock = var->pixclock;
++		ivideo.current_refresh_rate = ivideo.refresh_rate;
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
++                sisfb_lastrates[sisfb_mode_no] = ivideo.refresh_rate;
++#endif
++		
++		sisfb_post_setmode();
+ 
+ 	}
+-	TWDEBUG("End of do_set_var");
+ 	return 0;
+ }
+ 
+-#ifdef SISFB_PAN
+ static int sisfb_pan_var(struct fb_var_screeninfo *var)
+ {
+ 	unsigned int base;
+ 
+-	TWDEBUG("Inside pan_var");
+-	
+ 	if (var->xoffset > (var->xres_virtual - var->xres)) {
+-	        printk(KERN_INFO "Pan: xo: %d xv %d xr %d\n",
+-			var->xoffset, var->xres_virtual, var->xres);
+ 		return -EINVAL;
+ 	}
+ 	if(var->yoffset > (var->yres_virtual - var->yres)) {
+-		printk(KERN_INFO "Pan: yo: %d yv %d yr %d\n",
+-			var->yoffset, var->yres_virtual, var->yres);
+ 		return -EINVAL;
+-	}
+-
+-        base = var->yoffset * var->xres_virtual + var->xoffset;
+-
++	}	
++		
++	base = var->yoffset * var->xres_virtual + var->xoffset;
++		
+         /* calculate base bpp dep. */
+         switch(var->bits_per_pixel) {
+         case 16:
+@@ -794,7 +1187,7 @@ static int sisfb_pan_var(struct fb_var_s
+ 	if(sisvga_engine == SIS_315_VGA) {
+ 		setSISIDXREG(SISSR, 0x37, 0xFE, (base >> 24) & 0x01);
+ 	}
+-        if(ivideo.disp_state & DISPTYPE_DISP2) {
++        if(ivideo.currentvbflags & VB_DISPTYPE_DISP2) {
+ 		orSISIDXREG(SISPART1, sisfb_CRT2_write_enable, 0x01);
+         	outSISIDXREG(SISPART1, 0x06, (base & 0xFF));
+         	outSISIDXREG(SISPART1, 0x05, ((base >> 8) & 0xFF));
+@@ -803,10 +1196,8 @@ static int sisfb_pan_var(struct fb_var_s
+ 			setSISIDXREG(SISPART1, 0x02, 0x7F, ((base >> 24) & 0x01) << 7);
+ 		}
+         }
+-	TWDEBUG("End of pan_var");
+ 	return 0;
+ }
+-#endif
+ 
+ static void sisfb_bpp_to_var(struct fb_var_screeninfo *var)
+ {
+@@ -843,22 +1234,24 @@ static void sisfb_bpp_to_var(struct fb_v
+ 
+ void sis_dispinfo(struct ap_data *rec)
+ {
+-	rec->minfo.bpp    = ivideo.video_bpp;
+-	rec->minfo.xres   = ivideo.video_width;
+-	rec->minfo.yres   = ivideo.video_height;
+-	rec->minfo.v_xres = ivideo.video_vwidth;
+-	rec->minfo.v_yres = ivideo.video_vheight;
+-	rec->minfo.org_x  = ivideo.org_x;
+-	rec->minfo.org_y  = ivideo.org_y;
+-	rec->minfo.vrate  = ivideo.refresh_rate;
+-	rec->iobase       = ivideo.vga_base - 0x30;
+-	rec->mem_size     = ivideo.video_size;
+-	rec->disp_state   = ivideo.disp_state; 
+-	rec->version      = (VER_MAJOR << 24) | (VER_MINOR << 16) | VER_LEVEL; 
+-	rec->hasVB        = ivideo.hasVB; 
+-	rec->TV_type      = ivideo.TV_type; 
+-	rec->TV_plug      = ivideo.TV_plug; 
+-	rec->chip         = ivideo.chip;
++	rec->minfo.bpp      = ivideo.video_bpp;
++	rec->minfo.xres     = ivideo.video_width;
++	rec->minfo.yres     = ivideo.video_height;
++	rec->minfo.v_xres   = ivideo.video_vwidth;
++	rec->minfo.v_yres   = ivideo.video_vheight;
++	rec->minfo.org_x    = ivideo.org_x;
++	rec->minfo.org_y    = ivideo.org_y;
++	rec->minfo.vrate    = ivideo.refresh_rate;
++	rec->iobase         = ivideo.vga_base - 0x30;
++	rec->mem_size       = ivideo.video_size;
++	rec->disp_state     = ivideo.disp_state; 
++	rec->version        = (VER_MAJOR << 24) | (VER_MINOR << 16) | VER_LEVEL; 
++	rec->hasVB          = ivideo.hasVB;
++	rec->TV_type        = ivideo.TV_type; 
++	rec->TV_plug        = ivideo.TV_plug; 
++	rec->chip           = ivideo.chip;
++	rec->vbflags	    = ivideo.vbflags;
++	rec->currentvbflags = ivideo.currentvbflags;
+ }
+ 
+ /* ------------ FBDev related routines for 2.4 series ----------- */
+@@ -873,7 +1266,6 @@ static void sisfb_crtc_to_var(struct fb_
+ 	int A, B, C, D, E, F, temp;
+ 	double hrate, drate;
+ 
+-	TWDEBUG("Inside crtc_to_var");
+ 	inSISIDXREG(SISSR, IND_SIS_COLOR_MODE, sr_data);
+ 
+ 	if (sr_data & SIS_INTERLACED_MODE)
+@@ -921,6 +1313,8 @@ static void sisfb_crtc_to_var(struct fb_
+ 
+ 	inSISIDXREG(SISCR, 0x09, cr_data3);
+ 
++	if(cr_data3 & 0x80) var->vmode = FB_VMODE_DOUBLE;
++
+ 	VBS = (cr_data & 0xff) | ((u16) (cr_data2 & 0x08) << 5) |
+ 	      ((u16) (cr_data3 & 0x20) << 4) | ((u16) (sr_data & 0x04) << 8);
+ 
+@@ -939,26 +1333,22 @@ static void sisfb_crtc_to_var(struct fb_
+ 	D = B - F - C;
+ 
+         var->yres = E;
+-#ifndef SISFB_PAN
+-	var->yres_virtual = E;
+-#endif
+-	/* TW: We have to report the physical dimension to the console! */
++	var->upper_margin = D;
++	var->lower_margin = F;
++	var->vsync_len = C;
++
+ 	if ((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) {
+ 		var->yres <<= 1;
+-#ifndef SISFB_PAN
+-		var->yres_virtual <<= 1;
+-#endif
++		var->upper_margin <<= 1;
++		var->lower_margin <<= 1;
++		var->vsync_len <<= 1;
+ 	} else if ((var->vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) {
+ 		var->yres >>= 1;
+-#ifndef SISFB_PAN
+-		var->yres_virtual >>= 1;
+-#endif
++		var->upper_margin >>= 1;
++		var->lower_margin >>= 1;
++		var->vsync_len >>= 1;
+ 	}
+ 
+-	var->upper_margin = D;
+-	var->lower_margin = F;
+-	var->vsync_len = C;
+-
+ 	inSISIDXREG(SISSR, 0x0b, sr_data);
+ 
+ 	inSISIDXREG(SISCR, 0x00, cr_data);
+@@ -999,10 +1389,20 @@ static void sisfb_crtc_to_var(struct fb_
+ 	D = B - F - C;
+ 
+ 	var->xres = var->xres_virtual = E * 8;
+-	var->left_margin = D * 8;
+-	var->right_margin = F * 8;
+-	var->hsync_len = C * 8;
+ 
++	if((var->xres == 320) &&
++	   (var->yres == 200 || var->yres == 240)) {
++		/* Terrible hack, but the correct CRTC data for
++	  	 * these modes only produces a black screen...
++	  	 */
++       		var->left_margin = (400 - 376);
++       		var->right_margin = (328 - 320);
++       		var->hsync_len = (376 - 328);
++	} else {
++	   	var->left_margin = D * 8;
++	   	var->right_margin = F * 8;
++	   	var->hsync_len = C * 8;
++	}
+ 	var->activate = FB_ACTIVATE_NOW;
+ 
+ 	var->sync = 0;
+@@ -1022,21 +1422,21 @@ static void sisfb_crtc_to_var(struct fb_
+ 	VT <<= 1;
+ 	HT = (HT + 5) * 8;
+ 
++	if ((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) {
++		VT <<= 1;
++	}
+ 	hrate = (double) ivideo.refresh_rate * (double) VT / 2;
+ 	drate = hrate * HT;
+ 	var->pixclock = (u32) (1E12 / drate);
+ 
+-#ifdef SISFB_PAN
+ 	if(sisfb_ypan) {
+ 	    var->yres_virtual = ivideo.heapstart / (var->xres * (var->bits_per_pixel >> 3));
+ 	    if(var->yres_virtual <= var->yres) {
+ 	        var->yres_virtual = var->yres;
+ 	    }
+ 	} else
+-#endif
+-	   var->yres_virtual = var->yres;
++	    var->yres_virtual = var->yres;
+ 
+-        TWDEBUG("end of crtc_to_var");
+ }
+ 
+ static int sis_getcolreg(unsigned regno, unsigned *red, unsigned *green, unsigned *blue,
+@@ -1069,7 +1469,7 @@ static int sisfb_setcolreg(unsigned regn
+ 		outSISREG(SISDACD, (red >> 10));
+ 		outSISREG(SISDACD, (green >> 10));
+ 		outSISREG(SISDACD, (blue >> 10));
+-		if (ivideo.disp_state & DISPTYPE_DISP2) {
++		if (ivideo.currentvbflags & VB_DISPTYPE_DISP2) {
+ 		        outSISREG(SISDAC2A, regno);
+ 			outSISREG(SISDAC2D, (red >> 8));
+ 			outSISREG(SISDAC2D, (green >> 8));
+@@ -1118,7 +1518,7 @@ static void sisfb_set_disp(int con, stru
+ 	display->ywrapstep = fix.ywrapstep;
+ 	display->line_length = fix.line_length;
+ 	display->next_line = fix.line_length;
+-	display->can_soft_blank = 0;
++	display->can_soft_blank = 1;
+ 	display->inverse = sisfb_inverse;
+ 	display->var = *var;
+ 
+@@ -1162,17 +1562,12 @@ static void sisfb_set_disp(int con, stru
+ 	display->dispsw = &sisfb_sw;
+ 	restore_flags(flags);
+ 
+-#ifdef SISFB_PAN
+-        if((ivideo.accel) && (sisfb_ypan)) {
+-  	    /* display->scrollmode = SCROLL_YPAN; - not defined */
++        if(sisfb_ypan) {
++  	    /* display->scrollmode = 0;  */
+ 	} else {
+ 	    display->scrollmode = SCROLL_YREDRAW;
+ 	    sisfb_sw.bmove = fbcon_redraw_bmove;
+ 	}
+-#else
+-	display->scrollmode = SCROLL_YREDRAW;
+-	sisfb_sw.bmove = fbcon_redraw_bmove;
+-#endif
+ }
+ 
+ static void sisfb_do_install_cmap(int con, struct fb_info *info)
+@@ -1191,17 +1586,16 @@ static void sisfb_do_install_cmap(int co
+ static int sisfb_get_var(struct fb_var_screeninfo *var, int con,
+ 			 struct fb_info *info)
+ {
+-	TWDEBUG("inside get_var");
+ 	if(con == -1)
+ 		memcpy(var, &default_var, sizeof(struct fb_var_screeninfo));
+ 	else
+ 		*var = fb_display[con].var;
+ 
+- 	/* For FSTN, DSTN */
+-	if (var->xres == 320 && var->yres == 480)
++	if(sisfb_fstn) {
++	   if (var->xres == 320 && var->yres == 480)
+ 		var->yres = 240;
+-		
+-	TWDEBUG("end of get_var");
++        }
++
+ 	return 0;
+ }
+ 
+@@ -1211,8 +1605,6 @@ static int sisfb_set_var(struct fb_var_s
+ 	int err;
+ 	unsigned int cols, rows;
+ 
+-	TWDEBUG("inside set_var");
+-
+ 	fb_display[con].var.activate = FB_ACTIVATE_NOW;
+         if(sisfb_do_set_var(var, con == currcon, info)) {
+ 		sisfb_crtc_to_var(var);
+@@ -1233,16 +1625,17 @@ static int sisfb_set_var(struct fb_var_s
+ 
+ 	cols = sisbios_mode[sisfb_mode_idx].cols;
+ 	rows = sisbios_mode[sisfb_mode_idx].rows;
+-	vc_resize_con(rows, cols, fb_display[con].conp->vc_num);
++#if 0
++	/* Why was this called here? */
++ 	vc_resize_con(rows, cols, fb_display[con].conp->vc_num); 
++#endif	
+ 
+-	TWDEBUG("end of set_var");
+ 	return 0;
+ }
+ 
+ static int sisfb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+ 			  struct fb_info *info)
+ {
+-	TWDEBUG("inside get_cmap");
+         if (con == currcon)
+ 		return fb_get_cmap(cmap, kspc, sis_getcolreg, info);
+ 
+@@ -1251,7 +1644,6 @@ static int sisfb_get_cmap(struct fb_cmap
+ 	else
+ 		fb_copy_cmap(fb_default_cmap(ivideo.video_cmap_len), cmap, kspc ? 0 : 2);
+ 
+-	TWDEBUG("end of get_cmap");
+ 	return 0;
+ }
+ 
+@@ -1260,7 +1652,6 @@ static int sisfb_set_cmap(struct fb_cmap
+ {
+ 	int err;
+ 
+-	TWDEBUG("inside set_cmap");
+ 	if (!fb_display[con].cmap.len) {
+ 		err = fb_alloc_cmap(&fb_display[con].cmap, ivideo.video_cmap_len, 0);
+ 		if (err)
+@@ -1272,17 +1663,15 @@ static int sisfb_set_cmap(struct fb_cmap
+ 
+ 	else
+ 		fb_copy_cmap(cmap, &fb_display[con].cmap, kspc ? 0 : 1);
+-	TWDEBUG("end of set_cmap");
++
+ 	return 0;
+ }
+ 
+-#ifdef SISFB_PAN
+ static int sisfb_pan_display(struct fb_var_screeninfo *var, int con,
+ 			     struct fb_info* info)
+ {
+ 	int err;
+-	
+-	TWDEBUG("inside pan_display");
++
+ 	if (var->vmode & FB_VMODE_YWRAP) {
+ 		if (var->yoffset < 0 || var->yoffset >= fb_display[con].var.yres_virtual || var->xoffset)
+ 			return -EINVAL;
+@@ -1303,10 +1692,8 @@ static int sisfb_pan_display(struct fb_v
+ 	else
+ 		fb_display[con].var.vmode &= ~FB_VMODE_YWRAP;
+ 
+-	TWDEBUG("end of pan_display");
+ 	return 0;
+ }
+-#endif
+ 
+ static int sisfb_mmap(struct fb_info *info, struct file *file,
+ 		      struct vm_area_struct *vma)
+@@ -1316,7 +1703,6 @@ static int sisfb_mmap(struct fb_info *in
+ 	unsigned long off;
+ 	u32 len, mmio_off;
+ 
+-	TWDEBUG("inside mmap");
+ 	if(vma->vm_pgoff > (~0UL >> PAGE_SHIFT))  return -EINVAL;
+ 
+ 	off = vma->vm_pgoff << PAGE_SHIFT;
+@@ -1355,7 +1741,6 @@ static int sisfb_mmap(struct fb_info *in
+ 				vma->vm_page_prot))
+ 		return -EAGAIN;
+ 
+-        TWDEBUG("end of mmap");
+ 	return 0;
+ }
+ 
+@@ -1368,7 +1753,6 @@ static void sis_get_glyph(struct fb_info
+ 	u8 *gbuf = gly->gmask;
+ 	int size;
+ 
+-	TWDEBUG("Inside get_glyph");
+ 	gly->fontheight = fontheight(p);
+ 	gly->fontwidth = fontwidth(p);
+ 	widthb = (fontwidth(p) + 7) / 8;
+@@ -1382,16 +1766,11 @@ static void sis_get_glyph(struct fb_info
+ 	size = fontheight(p) * widthb;
+ 	memcpy(gbuf, cdat, size);
+ 	gly->ngmask = size;
+-	TWDEBUG("End of get_glyph");
+ }
+ 
+ static int sisfb_update_var(int con, struct fb_info *info)
+ {
+-#ifdef SISFB_PAN
+         return(sisfb_pan_var(&fb_display[con].var));
+-#else
+-	return 0;
+-#endif	
+ }
+ 
+ static int sisfb_switch(int con, struct fb_info *info)
+@@ -1428,157 +1807,37 @@ static int sisfb_switch(int con, struct 
+ 
+ static void sisfb_blank(int blank, struct fb_info *info)
+ {
+-	u8 reg;
++	sisfb_myblank(blank);
++}
++#endif
+ 
+-	inSISIDXREG(SISCR, 0x17, reg);
++/* ------------ FBDev related routines for 2.5 series ----------- */
+ 
+-	if(blank > 0)
+-		reg &= 0x7f;
+-	else
+-		reg |= 0x80;
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+ 
+-        outSISIDXREG(SISCR, 0x17, reg);		
+-	outSISIDXREG(SISSR, 0x00, 0x01);    /* Synchronous Reset */
+-	outSISIDXREG(SISSR, 0x00, 0x03);    /* End Reset */
+-	printk(KERN_DEBUG "sisfb_blank() called (%d)\n", blank);
++static int sisfb_open(struct fb_info *info, int user)
++{
++    return 0;
+ }
+ 
++static int sisfb_release(struct fb_info *info, int user)
++{
++    return 0;
++}
+ 
+-static int sisfb_ioctl(struct inode *inode, struct file *file,
+-		       unsigned int cmd, unsigned long arg, int con,
+-		       struct fb_info *info)
++static int sisfb_get_cmap_len(const struct fb_var_screeninfo *var)
+ {
+-	TWDEBUG("inside ioctl");
+-	switch (cmd) {
+-	   case FBIO_ALLOC:
+-		if (!capable(CAP_SYS_RAWIO))
+-			return -EPERM;
+-		sis_malloc((struct sis_memreq *) arg);
+-		break;
+-	   case FBIO_FREE:
+-		if (!capable(CAP_SYS_RAWIO))
+-			return -EPERM;
+-		sis_free(*(unsigned long *) arg);
++	int rc = 16;		
++
++	switch(var->bits_per_pixel) {
++	case 8:
++		rc = 256;	
+ 		break;
+-	   case FBIOGET_GLYPH:
+-                sis_get_glyph(info,(SIS_GLYINFO *) arg);
+-		break;	
+-	   case FBIOGET_HWCINFO:
+-		{
+-			unsigned long *hwc_offset = (unsigned long *) arg;
+-
+-			if (sisfb_caps & HW_CURSOR_CAP)
+-				*hwc_offset = sisfb_hwcursor_vbase -
+-				    (unsigned long) ivideo.video_vbase;
+-			else
+-				*hwc_offset = 0;
+-
+-			break;
+-		}
+-	   case FBIOPUT_MODEINFO:
+-		{
+-			struct mode_info *x = (struct mode_info *)arg;
+-
+-			ivideo.video_bpp        = x->bpp;
+-			ivideo.video_width      = x->xres;
+-			ivideo.video_height     = x->yres;
+-			ivideo.video_vwidth     = x->v_xres;
+-			ivideo.video_vheight    = x->v_yres;
+-			ivideo.org_x            = x->org_x;
+-			ivideo.org_y            = x->org_y;
+-			ivideo.refresh_rate     = x->vrate;
+-			ivideo.video_linelength = ivideo.video_vwidth * (ivideo.video_bpp >> 3);
+-			switch(ivideo.video_bpp) {
+-        		case 8:
+-            			ivideo.DstColor = 0x0000;
+-	    			ivideo.SiS310_AccelDepth = 0x00000000;
+-				ivideo.video_cmap_len = 256;
+-            			break;
+-        		case 16:
+-            			ivideo.DstColor = 0x8000;
+-            			ivideo.SiS310_AccelDepth = 0x00010000;
+-				ivideo.video_cmap_len = 16;
+-            			break;
+-        		case 32:
+-            			ivideo.DstColor = 0xC000;
+-	    			ivideo.SiS310_AccelDepth = 0x00020000;
+-				ivideo.video_cmap_len = 16;
+-            			break;
+-			default:
+-				ivideo.video_cmap_len = 16;
+-		       	 	printk(KERN_ERR "sisfb: Unsupported depth %d", ivideo.video_bpp);
+-				ivideo.accel = 0;
+-				break;
+-    			}
+-
+-			break;
+-		}
+-	   case FBIOGET_DISPINFO:
+-		sis_dispinfo((struct ap_data *)arg);
+-		break;
+-	   case SISFB_GET_INFO:  /* TW: New for communication with X driver */
+-	        {
+-			sisfb_info *x = (sisfb_info *)arg;
+-
+-			x->sisfb_id = SISFB_ID;
+-			x->sisfb_version = VER_MAJOR;
+-			x->sisfb_revision = VER_MINOR;
+-			x->sisfb_patchlevel = VER_LEVEL;
+-			x->chip_id = ivideo.chip_id;
+-			x->memory = ivideo.video_size / 1024;
+-			x->heapstart = ivideo.heapstart / 1024;
+-			x->fbvidmode = sisfb_mode_no;
+-			x->sisfb_caps = sisfb_caps;
+-			x->sisfb_tqlen = 512; /* yet unused */
+-			x->sisfb_pcibus = ivideo.pcibus;
+-			x->sisfb_pcislot = ivideo.pcislot;
+-			x->sisfb_pcifunc = ivideo.pcifunc;
+-			x->sisfb_lcdpdc = sisfb_detectedpdc;
+-			x->sisfb_lcda = sisfb_detectedlcda;
+-	                break;
+-		}
+-	   case SISFB_GET_VBRSTATUS:
+-	        {
+-			unsigned long *vbrstatus = (unsigned long *) arg;
+-			if(sisfb_CheckVBRetrace()) *vbrstatus = 1;
+-			else		           *vbrstatus = 0;
+-		}
+-	   default:
+-		return -EINVAL;
+-	}
+-	TWDEBUG("end of ioctl");
+-	return 0;
+-
+-}
+-#endif
+-
+-/* ------------ FBDev related routines for 2.5 series ----------- */
+-
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+-
+-static int sisfb_open(struct fb_info *info, int user)
+-{
+-    return 0;
+-}
+-
+-static int sisfb_release(struct fb_info *info, int user)
+-{
+-    return 0;
+-}
+-
+-static int sisfb_get_cmap_len(const struct fb_var_screeninfo *var)
+-{
+-	int rc = 16;		
+-
+-	switch(var->bits_per_pixel) {
+-	case 8:
+-		rc = 256;	
+-		break;
+-	case 16:
+-		rc = 16;	
+-		break;		
+-	case 32:
+-		rc = 16;
++	case 16:
++		rc = 16;	
++		break;		
++	case 32:
++		rc = 16;
+ 		break;	
+ 	}
+ 	return rc;
+@@ -1596,7 +1855,7 @@ static int sisfb_setcolreg(unsigned regn
+ 		outSISREG(SISDACD, (red >> 10));
+ 		outSISREG(SISDACD, (green >> 10));
+ 		outSISREG(SISDACD, (blue >> 10));
+-		if (ivideo.disp_state & DISPTYPE_DISP2) {
++		if (ivideo.currentvbflags & VB_DISPTYPE_DISP2) {
+ 		        outSISREG(SISDAC2A, regno);
+ 			outSISREG(SISDAC2D, (red >> 8));
+ 			outSISREG(SISDAC2D, (green >> 8));
+@@ -1622,63 +1881,52 @@ static int sisfb_set_par(struct fb_info 
+ {
+ 	int err;
+ 
+-	TWDEBUG("inside set_par");
+         if((err = sisfb_do_set_var(&info->var, 1, info)))
+ 		return err;
+ 
+ 	sisfb_get_fix(&info->fix, info->currcon, info);
+ 
+-	TWDEBUG("end of set_par");
+ 	return 0;
+ }
+ 
+ static int sisfb_check_var(struct fb_var_screeninfo *var,
+                            struct fb_info *info)
+ {
+-	unsigned int htotal =
+-		var->left_margin + var->xres + var->right_margin +
+-		var->hsync_len;
+-	unsigned int vtotal = 0;
++	unsigned int htotal = 0, vtotal = 0, myrateindex = 0;
+ 	double drate = 0, hrate = 0;
+ 	int found_mode = 0;
+ 	int refresh_rate, search_idx;
++	BOOLEAN recalc_clock = FALSE;
++	u32 pixclock;
++
++	htotal = var->left_margin + var->xres + var->right_margin + var->hsync_len;
+ 
+-	TWDEBUG("Inside check_var");
++	vtotal = var->upper_margin + var->lower_margin + var->vsync_len;
++
++	pixclock = var->pixclock;
+ 
+ 	if((var->vmode & FB_VMODE_MASK) == FB_VMODE_NONINTERLACED) {
+-		vtotal = var->upper_margin + var->yres + var->lower_margin +
+-		         var->vsync_len;   
++		vtotal += var->yres;
+ 		vtotal <<= 1;
+ 	} else if((var->vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) {
+-		vtotal = var->upper_margin + var->yres + var->lower_margin +
+-		         var->vsync_len;   
++		vtotal += var->yres;
+ 		vtotal <<= 2;
+ 	} else if((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) {
+-		vtotal = var->upper_margin + (var->yres/2) + var->lower_margin +
+-		         var->vsync_len;   
+-	} else 	vtotal = var->upper_margin + var->yres + var->lower_margin +
+-		         var->vsync_len;
++		vtotal += var->yres;
++		vtotal <<= 1;
++	} else 	vtotal += var->yres;
+ 
+ 	if(!(htotal) || !(vtotal)) {
+ 		SISFAIL("sisfb: no valid timing data");
+ 	}
+ 
+-	if((var->pixclock) && (htotal)) {
+-	   drate = 1E12 / var->pixclock;
+-	   hrate = drate / htotal;
+-	   refresh_rate = (unsigned int) (hrate / vtotal * 2 + 0.5);
+-	} else refresh_rate = 60;
+-
+-	/* TW: Calculation wrong for 1024x600 - force it to 60Hz */
+-	if((var->xres == 1024) && (var->yres == 600)) refresh_rate = 60;
+-
+ 	search_idx = 0;
+ 	while( (sisbios_mode[search_idx].mode_no != 0) &&
+ 	       (sisbios_mode[search_idx].xres <= var->xres) ) {
+ 		if( (sisbios_mode[search_idx].xres == var->xres) &&
+ 		    (sisbios_mode[search_idx].yres == var->yres) &&
+ 		    (sisbios_mode[search_idx].bpp == var->bits_per_pixel)) {
+-		        if(sisfb_validate_mode(search_idx) > 0) {
++		        if(sisfb_validate_mode(search_idx, ivideo.currentvbflags) > 0) {
+ 			   found_mode = 1;
+ 			   break;
+ 			}
+@@ -1687,38 +1935,95 @@ static int sisfb_check_var(struct fb_var
+ 	}
+ 
+ 	if(!found_mode) {
+-	
+-		printk(KERN_ERR "sisfb: %dx%dx%d is no valid mode\n", 
+-			var->xres, var->yres, var->bits_per_pixel);
+-			
++
+                 search_idx = 0;
+ 		while(sisbios_mode[search_idx].mode_no != 0) {
+-		       
+ 		   if( (var->xres <= sisbios_mode[search_idx].xres) &&
+-		       (var->yres <= sisbios_mode[search_idx].yres) && 
++		       (var->yres <= sisbios_mode[search_idx].yres) &&
+ 		       (var->bits_per_pixel == sisbios_mode[search_idx].bpp) ) {
+-		          if(sisfb_validate_mode(search_idx) > 0) {
++		          if(sisfb_validate_mode(search_idx, ivideo.currentvbflags) > 0) {
+ 			     found_mode = 1;
+ 			     break;
+ 			  }
+ 		   }
+ 		   search_idx++;
+-	        }			
++	        }
+ 		if(found_mode) {
++			printk(KERN_DEBUG "sisfb: Adapted from %dx%dx%d to %dx%dx%d\n",
++		   		var->xres, var->yres, var->bits_per_pixel,
++				sisbios_mode[search_idx].xres,
++				sisbios_mode[search_idx].yres,
++				var->bits_per_pixel);
+ 			var->xres = sisbios_mode[search_idx].xres;
+ 		      	var->yres = sisbios_mode[search_idx].yres;
+-		      	printk(KERN_DEBUG "sisfb: Adapted to mode %dx%dx%d\n",
+-		   		var->xres, var->yres, var->bits_per_pixel);
+-		   
++
++
+ 		} else {
+-		   	printk(KERN_ERR "sisfb: Failed to find similar mode to %dx%dx%d\n", 
++		   	printk(KERN_ERR "sisfb: Failed to find supported mode near %dx%dx%d\n",
+ 				var->xres, var->yres, var->bits_per_pixel);
+ 		   	return -EINVAL;
+ 		}
+ 	}
+ 
+-	/* TW: TODO: Check the refresh rate */		
+-	
++	if( ((ivideo.vbflags & VB_LVDS) ||			/* Slave modes on LVDS and 301B-DH */
++	     ((ivideo.vbflags & VB_30xBDH) && (ivideo.currentvbflags & CRT2_LCD))) &&
++	    (var->bits_per_pixel == 8) ) {
++	    	refresh_rate = 60;
++		recalc_clock = TRUE;
++	} else if( (ivideo.current_htotal == htotal) &&		/* x=x & y=y & c=c -> assume depth change */
++	    	   (ivideo.current_vtotal == vtotal) &&
++	    	   (ivideo.current_pixclock == pixclock) ) {
++		drate = 1E12 / pixclock;
++	   	hrate = drate / htotal;
++	   	refresh_rate = (unsigned int) (hrate / vtotal * 2 + 0.5);
++	} else if( ( (ivideo.current_htotal != htotal) ||	/* x!=x | y!=y & c=c -> invalid pixclock */
++	    	     (ivideo.current_vtotal != vtotal) ) &&
++	    	   (ivideo.current_pixclock == var->pixclock) ) {
++		if(sisfb_lastrates[sisbios_mode[search_idx].mode_no]) {
++			refresh_rate = sisfb_lastrates[sisbios_mode[search_idx].mode_no];
++		} else if(sisfb_parm_rate != -1) {
++			refresh_rate = sisfb_parm_rate;
++		} else {
++			refresh_rate = 60;
++		}
++		recalc_clock = TRUE;
++	} else if((pixclock) && (htotal) && (vtotal)) {
++	   	drate = 1E12 / pixclock;
++	   	hrate = drate / htotal;
++	   	refresh_rate = (unsigned int) (hrate / vtotal * 2 + 0.5);
++	} else if(ivideo.current_refresh_rate) {
++		refresh_rate = ivideo.current_refresh_rate;
++		recalc_clock = TRUE;
++	} else {
++		refresh_rate = 60;
++		recalc_clock = TRUE;
++	}
++
++	myrateindex = sisfb_search_refresh_rate(refresh_rate, search_idx);
++
++	/* Eventually recalculate timing and clock */
++	if(recalc_clock) {
++	   if(!myrateindex) myrateindex = sisbios_mode[search_idx].rate_idx;
++	   var->pixclock = (u32) (1E12 / sisfb_mode_rate_to_dclock(&SiS_Pr, &sishw_ext,
++						sisbios_mode[search_idx].mode_no, myrateindex));
++	   sisfb_mode_rate_to_ddata(&SiS_Pr, &sishw_ext,
++		 			sisbios_mode[search_idx].mode_no, myrateindex,
++		 			&var->left_margin, &var->right_margin,
++		 			&var->upper_margin, &var->lower_margin,
++		 			&var->hsync_len, &var->vsync_len,
++		 			&var->sync, &var->vmode);
++	   if((var->vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) {
++		var->pixclock <<= 1;
++	   }
++	}
++
++	if(sisfb_thismonitor.datavalid) {
++	   if(!sisfb_verify_rate(&sisfb_thismonitor, search_idx,
++	                         myrateindex, refresh_rate)) {
++	      printk(KERN_INFO "sisfb: WARNING: Refresh rate exceeds monitor specs!\n");
++	   }
++	}
++
+ 	/* Adapt RGB settings */
+ 	sisfb_bpp_to_var(var);	
+ 	
+@@ -1731,18 +2036,20 @@ static int sisfb_check_var(struct fb_var
+ 	/* Horiz-panning not supported */
+ 	if(var->xres != var->xres_virtual)
+ 		var->xres_virtual = var->xres;
+-
+-	if(!sisfb_ypan) {
+-		if(var->yres != var->yres_virtual)
+-			var->yres_virtual = var->yres;
+-	} else {
++	
++	if(sisfb_ypan) {
+ 	   /* TW: Now patch yres_virtual if we use panning */
+ 	   /* *** May I do this? *** */
+ 	   var->yres_virtual = ivideo.heapstart / (var->xres * (var->bits_per_pixel >> 3));
+-	    if(var->yres_virtual <= var->yres) {
++	   if(var->yres_virtual <= var->yres) {
+ 	    	/* TW: Paranoia check */
+ 	        var->yres_virtual = var->yres;
+-	    }
++	   }
++	} else {
++	   if(var->yres != var->yres_virtual)
++		var->yres_virtual = var->yres;
++	   var->xoffset = 0;
++	   var->yoffset = 0;
+ 	}
+ 	
+ 	/* Truncate offsets to maximum if too high */
+@@ -1757,28 +2064,25 @@ static int sisfb_check_var(struct fb_var
+ 	    var->green.msb_right =
+ 	    var->blue.msb_right =
+ 	    var->transp.offset = var->transp.length = var->transp.msb_right = 0;		
+-		
+-	TWDEBUG("end of check_var");
++
+ 	return 0;
+ }
+ 
+-#ifdef SISFB_PAN
+ static int sisfb_pan_display(struct fb_var_screeninfo *var,
+ 			     struct fb_info* info)
+ {
+ 	int err;
+-	
+-	TWDEBUG("inside pan_display");
+-	
++
+ 	if (var->xoffset > (var->xres_virtual - var->xres))
+ 		return -EINVAL;
+ 	if (var->yoffset > (var->yres_virtual - var->yres))
+ 		return -EINVAL;
+ 
+ 	if (var->vmode & FB_VMODE_YWRAP) {
+-		if (var->yoffset < 0
+-		    || var->yoffset >= info->var.yres_virtual
+-		    || var->xoffset) return -EINVAL;
++		if (var->yoffset < 0 ||
++		    var->yoffset >= info->var.yres_virtual ||
++		    var->xoffset)
++		    	return -EINVAL;
+ 	} else {
+ 		if (var->xoffset + info->var.xres > info->var.xres_virtual ||
+ 		    var->yoffset + info->var.yres > info->var.yres_virtual)
+@@ -1794,10 +2098,8 @@ static int sisfb_pan_display(struct fb_v
+ 	else
+ 		info->var.vmode &= ~FB_VMODE_YWRAP;
+ 
+-	TWDEBUG("end of pan_display");
+ 	return 0;
+ }
+-#endif
+ 
+ static int sisfb_mmap(struct fb_info *info, struct file *file,
+ 		      struct vm_area_struct *vma)
+@@ -1806,7 +2108,6 @@ static int sisfb_mmap(struct fb_info *in
+ 	unsigned long off;
+ 	u32 len, mmio_off;
+ 
+-	TWDEBUG("inside mmap");
+ 	if(vma->vm_pgoff > (~0UL >> PAGE_SHIFT))  return -EINVAL;
+ 
+ 	off = vma->vm_pgoff << PAGE_SHIFT;
+@@ -1844,139 +2145,141 @@ static int sisfb_mmap(struct fb_info *in
+ 				vma->vm_page_prot))
+ 		return -EAGAIN;
+ 
+-        TWDEBUG("end of mmap");
+ 	return 0;
+ }
+ 
+ static int sisfb_blank(int blank, struct fb_info *info)
+ {
+-	u8 reg;
++	return(sisfb_myblank(blank));
++}
+ 
+-	inSISIDXREG(SISCR, 0x17, reg);
++#endif
+ 
+-	if(blank > 0)
+-		reg &= 0x7f;
+-	else
+-		reg |= 0x80;
++/* ----------- FBDev related routines for all series ---------- */
+ 
+-        outSISIDXREG(SISCR, 0x17, reg);		
+-	outSISIDXREG(SISSR, 0x00, 0x01);    /* Synchronous Reset */
+-	outSISIDXREG(SISSR, 0x00, 0x03);    /* End Reset */
+-        return(0);
+-}
+ 
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+ static int sisfb_ioctl(struct inode *inode, struct file *file,
+-		       unsigned int cmd, unsigned long arg, 
++		       unsigned int cmd, unsigned long arg,
+ 		       struct fb_info *info)
++#else
++static int sisfb_ioctl(struct inode *inode, struct file *file,
++		       unsigned int cmd, unsigned long arg, int con,
++		       struct fb_info *info)
++#endif
+ {
+-	TWDEBUG("inside ioctl");
++	struct sis_memreq sismemreq;
++	struct ap_data sisapdata;
++	unsigned long sismembase = 0;
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++	SIS_GLYINFO sisglyinfo;
++#endif
++
+ 	switch (cmd) {
+ 	   case FBIO_ALLOC:
+-		if (!capable(CAP_SYS_RAWIO))
++		if(!capable(CAP_SYS_RAWIO))
+ 			return -EPERM;
+-		sis_malloc((struct sis_memreq *) arg);
++		if(copy_from_user(&sismemreq, (void *)arg, sizeof(sismemreq)))
++		   	return -EFAULT;
++        	sis_malloc(&sismemreq);
++		if(copy_to_user((void *)arg, &sismemreq, sizeof(sismemreq))) {
++			sis_free(sismemreq.offset);
++		    	return -EFAULT;
++		}
+ 		break;
+ 	   case FBIO_FREE:
+-		if (!capable(CAP_SYS_RAWIO))
++		if(!capable(CAP_SYS_RAWIO))
+ 			return -EPERM;
+-		sis_free(*(unsigned long *) arg);
++		if(get_user(sismembase, (unsigned long *) arg))
++			return -EFAULT;
++		sis_free(sismembase);
+ 		break;
+-	   case FBIOGET_HWCINFO:
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++	   case FBIOGET_GLYPH:
++	        if(copy_from_user(&sisglyinfo, (void *)arg, sizeof(sisglyinfo)))
++			return -EFAULT;
++                sis_get_glyph(info, &sisglyinfo);
++		break;
++	   case FBIOPUT_MODEINFO:
+ 		{
+-			unsigned long *hwc_offset = (unsigned long *) arg;
++			struct mode_info x;
+ 
+-			if (sisfb_caps & HW_CURSOR_CAP)
+-				*hwc_offset = sisfb_hwcursor_vbase -
+-				    (unsigned long) ivideo.video_vbase;
+-			else
+-				*hwc_offset = 0;
++			if(copy_from_user(&x, (void *)arg, sizeof(x)))
++				return -EFAULT;
+ 
++			ivideo.video_bpp        = x.bpp;
++			ivideo.video_width      = x.xres;
++			ivideo.video_height     = x.yres;
++			ivideo.video_vwidth     = x.v_xres;
++			ivideo.video_vheight    = x.v_yres;
++			ivideo.org_x            = x.org_x;
++			ivideo.org_y            = x.org_y;
++			ivideo.refresh_rate     = x.vrate;
++			ivideo.video_linelength = ivideo.video_vwidth * (ivideo.video_bpp >> 3);
++			sisfb_set_vparms();
+ 			break;
+ 		}
+-	   case FBIOPUT_MODEINFO:
++#endif
++	   case FBIOGET_HWCINFO:
+ 		{
+-			struct mode_info *x = (struct mode_info *)arg;
++			unsigned long myhwcoffset = 0;
+ 
+-			ivideo.video_bpp        = x->bpp;
+-			ivideo.video_width      = x->xres;
+-			ivideo.video_height     = x->yres;
+-			ivideo.video_vwidth     = x->v_xres;
+-			ivideo.video_vheight    = x->v_yres;
+-			ivideo.org_x            = x->org_x;
+-			ivideo.org_y            = x->org_y;
+-			ivideo.refresh_rate     = x->vrate;
+-			ivideo.video_linelength = ivideo.video_vwidth * (ivideo.video_bpp >> 3);
+-			switch(ivideo.video_bpp) {
+-        		case 8:
+-            			ivideo.DstColor = 0x0000;
+-	    			ivideo.SiS310_AccelDepth = 0x00000000;
+-				ivideo.video_cmap_len = 256;
+-            			break;
+-        		case 16:
+-            			ivideo.DstColor = 0x8000;
+-            			ivideo.SiS310_AccelDepth = 0x00010000;
+-				ivideo.video_cmap_len = 16;
+-            			break;
+-        		case 32:
+-            			ivideo.DstColor = 0xC000;
+-	    			ivideo.SiS310_AccelDepth = 0x00020000;
+-				ivideo.video_cmap_len = 16;
+-            			break;
+-			default:
+-				ivideo.video_cmap_len = 16;
+-		       	 	printk(KERN_ERR "sisfb: Unsupported accel depth %d", ivideo.video_bpp);
+-				ivideo.accel = 0;
+-				break;
+-    			}
++			if(sisfb_caps & HW_CURSOR_CAP)
++				myhwcoffset = sisfb_hwcursor_vbase -
++				    (unsigned long) ivideo.video_vbase;
++
++			return put_user(myhwcoffset, (unsigned long *)arg);
+ 
+ 			break;
+ 		}
+ 	   case FBIOGET_DISPINFO:
+-		sis_dispinfo((struct ap_data *)arg);
++	   	sis_dispinfo(&sisapdata);
++		if(copy_to_user((void *)arg, &sisapdata, sizeof(sisapdata)))
++			return -EFAULT;
+ 		break;
+-	   case SISFB_GET_INFO:  /* TW: New for communication with X driver */
++	   case SISFB_GET_INFO:  /* New for communication with X driver */
+ 	        {
+-			sisfb_info *x = (sisfb_info *)arg;
++			sisfb_info x;
+ 
+-			x->sisfb_id = SISFB_ID;
+-			x->sisfb_version = VER_MAJOR;
+-			x->sisfb_revision = VER_MINOR;
+-			x->sisfb_patchlevel = VER_LEVEL;
+-			x->chip_id = ivideo.chip_id;
+-			x->memory = ivideo.video_size / 1024;
+-			x->heapstart = ivideo.heapstart / 1024;
+-			x->fbvidmode = sisfb_mode_no;
+-			x->sisfb_caps = sisfb_caps;
+-			x->sisfb_tqlen = 512; /* yet unused */
+-			x->sisfb_pcibus = ivideo.pcibus;
+-			x->sisfb_pcislot = ivideo.pcislot;
+-			x->sisfb_pcifunc = ivideo.pcifunc;
+-			x->sisfb_lcdpdc = sisfb_detectedpdc;
+-			x->sisfb_lcda = sisfb_detectedlcda;
++			x.sisfb_id = SISFB_ID;
++			x.sisfb_version = VER_MAJOR;
++			x.sisfb_revision = VER_MINOR;
++			x.sisfb_patchlevel = VER_LEVEL;
++			x.chip_id = ivideo.chip_id;
++			x.memory = ivideo.video_size / 1024;
++			x.heapstart = ivideo.heapstart / 1024;
++			x.fbvidmode = sisfb_mode_no;
++			x.sisfb_caps = sisfb_caps;
++			x.sisfb_tqlen = 512; /* yet unused */
++			x.sisfb_pcibus = ivideo.pcibus;
++			x.sisfb_pcislot = ivideo.pcislot;
++			x.sisfb_pcifunc = ivideo.pcifunc;
++			x.sisfb_lcdpdc = sisfb_detectedpdc;
++			x.sisfb_lcda = sisfb_detectedlcda;
++			x.sisfb_vbflags = ivideo.vbflags;
++			x.sisfb_currentvbflags = ivideo.currentvbflags;
++			if(copy_to_user((void *)arg, &x, sizeof(x)))
++				return -EFAULT;
+ 	                break;
+ 		}
+ 	   case SISFB_GET_VBRSTATUS:
+ 	        {
+-			unsigned long *vbrstatus = (unsigned long *) arg;
+-			if(sisfb_CheckVBRetrace()) *vbrstatus = 1;
+-			else		           *vbrstatus = 0;
++			if(sisfb_CheckVBRetrace())
++				return put_user(1UL, (unsigned long *) arg);
++			else
++				return put_user(0UL, (unsigned long *) arg);
++			break;
+ 		}
+ 	   default:
+ 		return -EINVAL;
+ 	}
+-	TWDEBUG("end of ioctl");
+ 	return 0;
+-
+ }
+ 
+-#endif
+-
+-/* ----------- FBDev related routines for all series ---------- */
+ 
+ static int sisfb_get_fix(struct fb_fix_screeninfo *fix, int con,
+ 			 struct fb_info *info)
+ {
+-	TWDEBUG("inside get_fix");
+ 	memset(fix, 0, sizeof(struct fb_fix_screeninfo));
+ 
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)	
+@@ -1987,45 +2290,47 @@ static int sisfb_get_fix(struct fb_fix_s
+ 
+ 	fix->smem_start = ivideo.video_base;
+ 
+-        /* TW */
+         if((!sisfb_mem) || (sisfb_mem > (ivideo.video_size/1024))) {
+-	    if (ivideo.video_size > 0x1000000) {
+-	        fix->smem_len = 0xc00000;
+-	    } else if (ivideo.video_size > 0x800000)
+-		fix->smem_len = 0x800000;
+-	    else
+-		fix->smem_len = 0x400000;
++	    if(sisvga_engine == SIS_300_VGA) {
++	       if(ivideo.video_size > 0x1000000) {
++	          	fix->smem_len = 0xc00000;
++	       } else if(ivideo.video_size > 0x800000)
++		  	fix->smem_len = 0x800000;
++	       else
++		  	fix->smem_len = 0x400000;
++            } else {
++	       	fix->smem_len = ivideo.video_size - 0x100000;
++	    }
+         } else
+ 		fix->smem_len = sisfb_mem * 1024;
+ 
+-	fix->type        = video_type;
++	fix->type        = FB_TYPE_PACKED_PIXELS;
+ 	fix->type_aux    = 0;
+ 	if(ivideo.video_bpp == 8)
+ 		fix->visual = FB_VISUAL_PSEUDOCOLOR;
+ 	else
+ 		fix->visual = FB_VISUAL_TRUECOLOR;
+ 	fix->xpanstep    = 0;
+-#ifdef SISFB_PAN
++
+         if(sisfb_ypan) 	 fix->ypanstep = 1;
+-#endif
++
+ 	fix->ywrapstep   = 0;
+ 	fix->line_length = ivideo.video_linelength;
+ 	fix->mmio_start  = ivideo.mmio_base;
+ 	fix->mmio_len    = sisfb_mmio_size;
+ 	if(sisvga_engine == SIS_300_VGA) 
+ 	   fix->accel    = FB_ACCEL_SIS_GLAMOUR;
+-	else if(ivideo.chip == SIS_330)
++	else if((ivideo.chip == SIS_330) || (ivideo.chip == SIS_660))
+ 	   fix->accel    = FB_ACCEL_SIS_XABRE;
+-	else 
++	else
+ 	   fix->accel    = FB_ACCEL_SIS_GLAMOUR_2;
+-	
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)		
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+ 	fix->reserved[0] = ivideo.video_size & 0xFFFF;
+ 	fix->reserved[1] = (ivideo.video_size >> 16) & 0xFFFF;
+ 	fix->reserved[2] = sisfb_caps;
+-#endif	
++#endif
+ 
+-	TWDEBUG("end of get_fix");
+ 	return 0;
+ }
+ 
+@@ -2033,17 +2338,15 @@ static int sisfb_get_fix(struct fb_fix_s
+ 
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+ static struct fb_ops sisfb_ops = {
+-	owner:		THIS_MODULE,
+-	fb_get_fix:	sisfb_get_fix,
+-	fb_get_var:	sisfb_get_var,
+-	fb_set_var:	sisfb_set_var,
+-	fb_get_cmap:	sisfb_get_cmap,
+-	fb_set_cmap:	sisfb_set_cmap,
+-#ifdef SISFB_PAN
+-        fb_pan_display:	sisfb_pan_display,
+-#endif
+-	fb_ioctl:	sisfb_ioctl,
+-	fb_mmap:	sisfb_mmap,
++	.owner		= THIS_MODULE,
++	.fb_get_fix	= sisfb_get_fix,
++	.fb_get_var	= sisfb_get_var,
++	.fb_set_var	= sisfb_set_var,
++	.fb_get_cmap	= sisfb_get_cmap,
++	.fb_set_cmap	= sisfb_set_cmap,
++        .fb_pan_display = sisfb_pan_display,
++	.fb_ioctl	= sisfb_ioctl,
++	.fb_mmap	= sisfb_mmap,
+ };
+ #endif
+ 
+@@ -2056,9 +2359,7 @@ static struct fb_ops sisfb_ops = {
+ 	.fb_check_var = sisfb_check_var,
+ 	.fb_set_par   = sisfb_set_par,
+ 	.fb_setcolreg = sisfb_setcolreg,
+-#ifdef SISFB_PAN
+         .fb_pan_display = sisfb_pan_display,
+-#endif	
+         .fb_blank     = sisfb_blank,
+ 	.fb_fillrect  = fbcon_sis_fillrect,
+ 	.fb_copyarea  = fbcon_sis_copyarea,
+@@ -2106,12 +2407,12 @@ static int sisfb_get_dram_size_300(void)
+ 	} else {		/* 540, 630, 730 */
+ 
+ 		pdev = pci_find_device(PCI_VENDOR_ID_SI, nbridge_id, pdev);
+-		if (pdev) {
++		if (pdev) { 
+ 			pci_read_config_byte(pdev, IND_BRI_DRAM_STATUS, &pci_data);
+ 			pci_data = (pci_data & BRI_DRAM_SIZE_MASK) >> 4;
+ 			ivideo.video_size = (unsigned int)(1 << (pci_data+21));
+ 			pdev_valid = 1;
+-
++	
+ 			reg = SIS_DATA_BUS_64 << 6;
+ 			switch (pci_data) {
+ 			   case BRI_DRAM_SIZE_2MB:
+@@ -2134,174 +2435,13 @@ static int sisfb_get_dram_size_300(void)
+ 				break;
+ 			}
+ 			outSISIDXREG(SISSR, IND_SIS_DRAM_SIZE, reg);
+-		}
++		}   
+ 	
+ 		if (!pdev_valid)  return -1;
+ 	}
+ 	return 0;
+ }
+ 
+-static void sisfb_detect_VB_connect_300()
+-{
+-	u8 sr16, sr17, cr32, temp;
+-
+-	ivideo.TV_plug = ivideo.TV_type = 0;
+-
+-        switch(ivideo.hasVB) {
+-	  case HASVB_LVDS_CHRONTEL:
+-	  case HASVB_CHRONTEL:
+-	     SiS_SenseCh();
+-	     break;
+-	  case HASVB_301:
+-	  case HASVB_302:
+-	     SiS_Sense30x();
+-	     break;
+-	}
+-
+-	inSISIDXREG(SISSR, IND_SIS_SCRATCH_REG_17, sr17);
+-        inSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR32, cr32);
+-
+-	if ((sr17 & 0x0F) && (ivideo.chip != SIS_300)) {
+-
+-		if ((sr17 & 0x01) && !sisfb_crt1off)
+-			sisfb_crt1off = 0;
+-		else {
+-			if (sr17 & 0x0E)
+-				sisfb_crt1off = 1;
+-			else
+-				sisfb_crt1off = 0;
+-		}
+-
+-		if (sisfb_crt2type != -1)
+-			/* TW: override detected CRT2 type */
+-			ivideo.disp_state = sisfb_crt2type;
+-                else if (sr17 & 0x04)
+-			ivideo.disp_state = DISPTYPE_TV;			
+-		else if (sr17 & 0x02)
+-			ivideo.disp_state = DISPTYPE_LCD;			
+-		else if (sr17 & 0x08 )
+-			ivideo.disp_state = DISPTYPE_CRT2;
+-		else
+-			ivideo.disp_state = 0;
+-
+-		if(sisfb_tvplug != -1)
+-			/* PR/TW: override detected TV type */
+-			ivideo.TV_plug = sisfb_tvplug;
+-		else if (sr17 & 0x20)
+-			ivideo.TV_plug = TVPLUG_SVIDEO;
+-		else if (sr17 & 0x10)
+-			ivideo.TV_plug = TVPLUG_COMPOSITE;
+-
+-		inSISIDXREG(SISSR, IND_SIS_SCRATCH_REG_16, sr16);
+-		if (sr16 & 0x20)
+-			ivideo.TV_type = TVMODE_PAL;
+-		else
+-			ivideo.TV_type = TVMODE_NTSC;
+-
+-	} else {
+-
+-		if ((cr32 & SIS_CRT1) && !sisfb_crt1off)
+-			sisfb_crt1off = 0;
+-		else {
+-			if (cr32 & 0x5F)
+-				sisfb_crt1off = 1;
+-			else
+-				sisfb_crt1off = 0;
+-		}
+-
+-		if (sisfb_crt2type != -1)
+-			/* TW: override detected CRT2 type */
+-			ivideo.disp_state = sisfb_crt2type;
+-		else if (cr32 & SIS_VB_TV)
+-			ivideo.disp_state = DISPTYPE_TV;
+-		else if (cr32 & SIS_VB_LCD)
+-			ivideo.disp_state = DISPTYPE_LCD;
+-		else if (cr32 & SIS_VB_CRT2)
+-			ivideo.disp_state = DISPTYPE_CRT2;
+-		else
+-			ivideo.disp_state = 0;
+-
+-		/* TW: Detect TV plug & type */
+-		if(sisfb_tvplug != -1)
+-			/* PR/TW: override with option */
+-		        ivideo.TV_plug = sisfb_tvplug;
+-		else if (cr32 & SIS_VB_HIVISION) {
+-			ivideo.TV_type = TVMODE_HIVISION;
+-			ivideo.TV_plug = TVPLUG_SVIDEO;
+-		}
+-		else if (cr32 & SIS_VB_SVIDEO)
+-			ivideo.TV_plug = TVPLUG_SVIDEO;
+-		else if (cr32 & SIS_VB_COMPOSITE)
+-			ivideo.TV_plug = TVPLUG_COMPOSITE;
+-		else if (cr32 & SIS_VB_SCART)
+-			ivideo.TV_plug = TVPLUG_SCART;
+-
+-		if (ivideo.TV_type == 0) {
+-		        inSISIDXREG(SISSR, IND_SIS_POWER_ON_TRAP, temp);
+-			if (temp & 0x01)
+-				ivideo.TV_type = TVMODE_PAL;
+-			else
+-				ivideo.TV_type = TVMODE_NTSC;
+-		}
+-
+-	}
+-
+-	/* TW: Copy forceCRT1 option to CRT1off if option is given */
+-    	if (sisfb_forcecrt1 != -1) {
+-    		if(sisfb_forcecrt1) sisfb_crt1off = 0;
+-		else                sisfb_crt1off = 1;
+-    	}
+-}
+-
+-static void sisfb_get_VB_type_300(void)
+-{
+-	u8 reg;
+-
+-	if(ivideo.chip != SIS_300) {
+-		if(!sisfb_has_VB_300()) {
+-		        inSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR37, reg);
+-			switch ((reg & SIS_EXTERNAL_CHIP_MASK) >> 1) {
+-			   case SIS_EXTERNAL_CHIP_LVDS:
+-				ivideo.hasVB = HASVB_LVDS;
+-				break;
+-			   case SIS_EXTERNAL_CHIP_TRUMPION:
+-				ivideo.hasVB = HASVB_TRUMPION;
+-				break;
+-			   case SIS_EXTERNAL_CHIP_LVDS_CHRONTEL:
+-				ivideo.hasVB = HASVB_LVDS_CHRONTEL;
+-				break;
+-			   case SIS_EXTERNAL_CHIP_CHRONTEL:
+-				ivideo.hasVB = HASVB_CHRONTEL;
+-				break;
+-			   default:
+-				break;
+-			}
+-		}
+-	} else {
+-		sisfb_has_VB_300();
+-	}
+-}
+-
+-static int sisfb_has_VB_300(void)
+-{
+-	u8 vb_chipid;
+-
+-	inSISIDXREG(SISPART4, 0x00, vb_chipid);
+-	switch (vb_chipid) {
+-	   case 0x01:
+-		ivideo.hasVB = HASVB_301;
+-		break;
+-	   case 0x02:
+-		ivideo.hasVB = HASVB_302;
+-		break;
+-	   default:
+-		ivideo.hasVB = HASVB_NONE;
+-		return FALSE;
+-	}
+-	return TRUE;
+-
+-}
+-
+ #endif  /* CONFIG_FB_SIS_300 */
+ 
+ 
+@@ -2314,14 +2454,18 @@ static int sisfb_get_dram_size_315(void)
+ 	u8  pci_data;
+ 	u8  reg = 0;
+ 
+-	if (ivideo.chip == SIS_550 || ivideo.chip == SIS_650 || ivideo.chip == SIS_740) {
++	if (ivideo.chip == SIS_550 ||
++	    ivideo.chip == SIS_650 ||
++	    ivideo.chip == SIS_740 ||
++	    ivideo.chip == SIS_660) {
+ 
+ #ifdef LINUXBIOS
+ 
+ 		while ((pdev = pci_find_device(PCI_VENDOR_ID_SI, PCI_ANY_ID, pdev)) != NULL) {
+ 			if ((pdev->device == PCI_DEVICE_ID_SI_550) ||
+-			     (pdev->device == PCI_DEVICE_ID_SI_650) ||
+-			     (pdev->device == PCI_DEVICE_ID_SI_740)) {
++			    (pdev->device == PCI_DEVICE_ID_SI_650) ||
++			     (pdev->device == PCI_DEVICE_ID_SI_740) ||
++			     (pdev->device == PCI_DEVICE_ID_SI_660)) {
+ 				pci_read_config_byte(pdev, IND_BRI_DRAM_STATUS,
+ 				                     &pci_data);
+ 				pci_data = (pci_data & BRI_DRAM_SIZE_MASK) >> 4;
+@@ -2425,7 +2569,7 @@ static int sisfb_get_dram_size_315(void)
+ #endif
+ 		return 0;
+ 
+-	} else {	/* 315 */
++	} else {	/* 315, 330 */
+ 
+ 	        inSISIDXREG(SISSR, IND_SIS_DRAM_SIZE, reg);
+ 		switch ((reg & SIS315_DRAM_SIZE_MASK) >> 4) {
+@@ -2470,7 +2614,7 @@ static int sisfb_get_dram_size_315(void)
+ 		      case SIS315_DUAL_CHANNEL_1_RANK:
+ 			   ivideo.video_size <<= 1;
+ 			   break;
+-		      case SIS315_ASYM_DDR:		/* TW: DDR asymentric */
++		      case SIS315_ASYM_DDR:		/* TW: DDR asymetric */
+ 			   ivideo.video_size += (ivideo.video_size/2);
+ 			   break;
+ 		   }
+@@ -2483,128 +2627,242 @@ static int sisfb_get_dram_size_315(void)
+ 	
+ }
+ 
+-static void sisfb_detect_VB_connect_315(void)
++#endif   /* CONFIG_FB_SIS_315 */
++
++
++/* -------------- video bridge detection --------------- */
++
++static void sisfb_detect_VB_connect()
+ {
+-	u8 cr32, temp=0;
++	u8 sr16, sr17, cr32, temp;
+ 
+-	ivideo.TV_plug = ivideo.TV_type = 0;
++	if(sisvga_engine == SIS_300_VGA) {
++	
++		inSISIDXREG(SISSR, IND_SIS_SCRATCH_REG_17, sr17); 
++	      
++		if ((sr17 & 0x0F) && (ivideo.chip != SIS_300)) {
++	
++			/* Old BIOSes store the detected CRT2 type in SR17
++		 	 * instead of CR32. However, since our detection
++			 * routines store their results to CR32, we now copy
++			 * the remaining bits (for LCD and VGA) to CR32 for
++			 * unified usage.
++			 * SR17[0] CRT1    [1] LCD     [2] TV    [3] VGA2
++			 *     [4] AVIDEO  [5] SVIDEO
++			 */
+ 
+-        switch(ivideo.hasVB) {
+-	  case HASVB_LVDS_CHRONTEL:
+-	  case HASVB_CHRONTEL:
+-	     SiS_SenseCh();
+-	     break;
+-	  case HASVB_301:
+-	  case HASVB_302:
+-	     SiS_Sense30x();
+-	     break;
+-	}
++#if 0
++			if (sr17 & 0x01) orSISIDXREG(SISCR, 0x32, SIS_CRT1);
++			else		 andSISIDXREG(SISCR, 0x32, ~SIS_CRT1);
++
++			if (sr17 & 0x02) orSISIDXREG(SISCR, 0x32, SIS_VB_LCD);
++			else		 andSISIDXREG(SISCR, 0x32, ~SIS_VB_LCD);
++
++			/* no HiVision and no DVI connector here */
++			andSISIDXREG(SISCR, 0x32, ~0xc0);
++#endif
++		
++			/* PAL/NTSC is stored on SR16 on such machines */
++			if (!(ivideo.vbflags & (TV_PAL | TV_NTSC))) {
++		   		inSISIDXREG(SISSR, IND_SIS_SCRATCH_REG_16, sr16);
++				if (sr16 & 0x20)
++					ivideo.vbflags |= TV_PAL;
++				else
++					ivideo.vbflags |= TV_NTSC;
++			}
+ 
++		} 
++		
++	}
++	
+ 	inSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR32, cr32);
+ 
+-	if ((cr32 & SIS_CRT1) && !sisfb_crt1off)
++	if (cr32 & SIS_CRT1)
+ 		sisfb_crt1off = 0;
+ 	else {
+-		if (cr32 & 0x5F)   
++		if (cr32 & 0x5F)
+ 			sisfb_crt1off = 1;
+ 		else
+ 			sisfb_crt1off = 0;
+ 	}
+ 
+-	if (sisfb_crt2type != -1)
+-		/* TW: Override with option */
+-		ivideo.disp_state = sisfb_crt2type;
+-	else if (cr32 & SIS_VB_TV)
+-		ivideo.disp_state = DISPTYPE_TV;		
+-	else if (cr32 & SIS_VB_LCD)
+-		ivideo.disp_state = DISPTYPE_LCD;		
+-	else if (cr32 & SIS_VB_CRT2)
+-		ivideo.disp_state = DISPTYPE_CRT2;
+-	else
+-		ivideo.disp_state = 0;
++	ivideo.vbflags &= ~(CRT2_TV | CRT2_LCD | CRT2_VGA);
+ 
++	if (cr32 & SIS_VB_TV)
++		ivideo.vbflags |= CRT2_TV;
++	if (cr32 & SIS_VB_LCD)
++		ivideo.vbflags |= CRT2_LCD;
++	if (cr32 & SIS_VB_CRT2)
++		ivideo.vbflags |= CRT2_VGA;
++		
++	/* TW: Detect/set TV plug & type */
+ 	if(sisfb_tvplug != -1)
+-		/* PR/TW: Override with option */
+-	        ivideo.TV_plug = sisfb_tvplug;
+-	else if (cr32 & SIS_VB_HIVISION) {
+-		ivideo.TV_type = TVMODE_HIVISION;
+-		ivideo.TV_plug = TVPLUG_SVIDEO;
+-	}
++	        ivideo.vbflags |= sisfb_tvplug;
++	if (cr32 & SIS_VB_HIVISION) 
++		ivideo.vbflags |= (TV_HIVISION | TV_SVIDEO);
+ 	else if (cr32 & SIS_VB_SVIDEO)
+-		ivideo.TV_plug = TVPLUG_SVIDEO;
++		ivideo.vbflags |= TV_SVIDEO;
+ 	else if (cr32 & SIS_VB_COMPOSITE)
+-		ivideo.TV_plug = TVPLUG_COMPOSITE;
++		ivideo.vbflags |= TV_AVIDEO;
+ 	else if (cr32 & SIS_VB_SCART)
+-		ivideo.TV_plug = TVPLUG_SCART;
+-
+-	if(ivideo.TV_type == 0) {
+-	    /* TW: PAL/NTSC changed for 650 */
+-	    if((ivideo.chip <= SIS_315PRO) || (ivideo.chip >= SIS_330)) {
+-
+-                inSISIDXREG(SISCR, 0x38, temp);
+-		if(temp & 0x10)
+-			ivideo.TV_type = TVMODE_PAL;
+-		else
+-			ivideo.TV_type = TVMODE_NTSC;
++		ivideo.vbflags |= TV_SCART;
++		
++	if (!(ivideo.vbflags & (TV_PAL | TV_NTSC))) {
++		if(sisvga_engine == SIS_300_VGA) {
++	        	inSISIDXREG(SISSR, IND_SIS_POWER_ON_TRAP, temp);
++			if (temp & 0x01)
++				ivideo.vbflags |= TV_PAL;
++			else
++				ivideo.vbflags |= TV_NTSC;
++		} else if((ivideo.chip <= SIS_315PRO) || (ivideo.chip == SIS_330)) {
+ 
+-	    } else {
++                	inSISIDXREG(SISCR, 0x38, temp);
++			if(temp & 0x10)
++				ivideo.vbflags |= TV_PAL;
++			else
++				ivideo.vbflags |= TV_NTSC;
++		
++	    	} else {
+ 
+-	        inSISIDXREG(SISCR, 0x79, temp);
+-		if(temp & 0x20)
+-			ivideo.TV_type = TVMODE_PAL;
+-		else
+-			ivideo.TV_type = TVMODE_NTSC;
+-	    }
++	        	inSISIDXREG(SISCR, 0x79, temp);
++			if(temp & 0x20)
++				ivideo.vbflags |= TV_PAL;
++			else
++				ivideo.vbflags |= TV_NTSC;
++	    	}
+ 	}
+ 
+ 	/* TW: Copy forceCRT1 option to CRT1off if option is given */
+     	if (sisfb_forcecrt1 != -1) {
+-    		if (sisfb_forcecrt1) sisfb_crt1off = 0;
+-		else   	             sisfb_crt1off = 1;
++    		if(sisfb_forcecrt1) sisfb_crt1off = 0;
++		else                sisfb_crt1off = 1;
+     	}
+-}
+-
+-static void sisfb_get_VB_type_315(void)
+-{
+-	u8 reg;
+ 
+-	if (!sisfb_has_VB_315()) {
+-	        inSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR37, reg);
+-		switch ((reg & SIS_EXTERNAL_CHIP_MASK) >> 1) {
+-	 	   case SIS310_EXTERNAL_CHIP_LVDS:
+-			ivideo.hasVB = HASVB_LVDS;
+-			break;
+-		   case SIS310_EXTERNAL_CHIP_LVDS_CHRONTEL:
+-			ivideo.hasVB = HASVB_LVDS_CHRONTEL;
+-			break;
+-		   default:
+-			break;
+-		}
+-	}
+ }
+ 
+-
+-static int sisfb_has_VB_315(void)
++static void sisfb_get_VB_type(void)
+ {
+ 	u8 vb_chipid;
++	u8 reg;
++	char stdstr[]    = "sisfb: Detected";
++	char bridgestr[] = "video bridge";
++	char lvdsstr[]   = "LVDS transmitter";
++  	char chrstr[]    = "Chrontel TV encoder";
++	
++	ivideo.hasVB = HASVB_NONE;
++	sishw_ext.ujVBChipID = VB_CHIP_UNKNOWN;
++	sishw_ext.Is301BDH = FALSE;
++	sishw_ext.usExternalChip = 0;
+ 
+ 	inSISIDXREG(SISPART4, 0x00, vb_chipid);
+ 	switch (vb_chipid) {
+ 	   case 0x01:
+ 		ivideo.hasVB = HASVB_301;
++		inSISIDXREG(SISPART4, 0x01, reg);
++		if(reg < 0xb0) { 
++			ivideo.vbflags |= VB_301;
++			sishw_ext.ujVBChipID = VB_CHIP_301;
++			printk(KERN_INFO "%s SiS301 %s\n", stdstr, bridgestr);
++		} else if(reg < 0xd0) {
++		 	ivideo.vbflags |= VB_301B;
++			sishw_ext.ujVBChipID = VB_CHIP_301B;
++			printk(KERN_INFO "%s SiS301B %s\n", stdstr, bridgestr);
++		} else if(reg < 0xe0) {
++			ivideo.vbflags |= VB_301LV;
++			sishw_ext.ujVBChipID = VB_CHIP_301LV;
++			printk(KERN_INFO "%s SiS301LV %s\n", stdstr, bridgestr);
++		} else if(reg <= 0xe1) {
++			ivideo.vbflags |= VB_302LV;
++			sishw_ext.ujVBChipID = VB_CHIP_302LV;
++			printk(KERN_INFO "%s SiS302LV %s\n", stdstr, bridgestr);
++		}
+ 		break;
+ 	   case 0x02:
+ 		ivideo.hasVB = HASVB_302;
++		inSISIDXREG(SISPART4, 0x01, reg);
++		if(reg < 0xd0) {
++			ivideo.vbflags |= VB_302B;
++			sishw_ext.ujVBChipID = VB_CHIP_302B;
++			printk(KERN_INFO "%s SiS302B %s\n", stdstr, bridgestr);
++		} else if(reg < 0xe0) {
++		 	ivideo.vbflags |= VB_301LV;
++			sishw_ext.ujVBChipID = VB_CHIP_301LV;
++			printk(KERN_INFO "%s SiS301LV %s\n", stdstr, bridgestr);
++		} else if(reg <= 0xe1) {
++			ivideo.vbflags |= VB_302LV;
++			sishw_ext.ujVBChipID = VB_CHIP_302LV;
++			printk(KERN_INFO "%s SiS302LV %s\n", stdstr, bridgestr);
++		}
+ 		break;
+-	   default:
+-		ivideo.hasVB = HASVB_NONE;
+-		return FALSE;
+ 	}
+-	return TRUE;
++	
++	if(ivideo.vbflags & (VB_301B | VB_302B)) {
++		inSISIDXREG(SISPART4,0x23,reg);
++		if(!(reg & 0x02)) {
++			sishw_ext.Is301BDH = TRUE;
++			ivideo.vbflags |= VB_30xBDH;
++			printk(KERN_INFO "This %s does not support LCD output\n", bridgestr);
++		}
++	}
++	
++	if((!(ivideo.vbflags & VB_VIDEOBRIDGE)) && (ivideo.chip != SIS_300)) {
++		inSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR37, reg);
++		reg &= SIS_EXTERNAL_CHIP_MASK;
++		reg >>= 1;
++		if(sisvga_engine == SIS_300_VGA) {
++			switch (reg) {
++			   case SIS_EXTERNAL_CHIP_LVDS:
++				ivideo.hasVB = HASVB_LVDS;
++				ivideo.vbflags |= VB_LVDS;
++				sishw_ext.usExternalChip = 0x01;
++				printk(KERN_INFO "%s %s\n", stdstr, lvdsstr);
++				break;
++			   case SIS_EXTERNAL_CHIP_TRUMPION:
++				ivideo.hasVB = HASVB_TRUMPION;
++				ivideo.vbflags |= VB_TRUMPION;
++				sishw_ext.usExternalChip = 0x02;
++				printk(KERN_INFO "%s Trumpion LCD scaler\n", stdstr);
++				break;	   
++			   case SIS_EXTERNAL_CHIP_CHRONTEL:
++				ivideo.hasVB = HASVB_CHRONTEL;
++				ivideo.vbflags |= VB_CHRONTEL;
++				sishw_ext.usExternalChip = 0x04;
++				printk(KERN_INFO "%s %s\n", stdstr, chrstr);
++				break;
++			   case SIS_EXTERNAL_CHIP_LVDS_CHRONTEL:
++				ivideo.hasVB = HASVB_LVDS_CHRONTEL;
++				ivideo.vbflags |= (VB_LVDS | VB_CHRONTEL);
++				sishw_ext.usExternalChip = 0x05;
++				printk(KERN_INFO "%s %s and %s\n", stdstr, lvdsstr, chrstr);
++				break;
++			}
++		} else {
++			switch (reg) {
++	 	   	   case SIS310_EXTERNAL_CHIP_LVDS:
++				ivideo.hasVB = HASVB_LVDS;
++				ivideo.vbflags |= VB_LVDS;
++				sishw_ext.usExternalChip = 0x01;
++				printk(KERN_INFO "%s %s\n", stdstr, lvdsstr);
++				break;
++		   	   case SIS310_EXTERNAL_CHIP_LVDS_CHRONTEL:
++				ivideo.hasVB = HASVB_LVDS_CHRONTEL;
++				ivideo.vbflags |= (VB_LVDS | VB_CHRONTEL);
++				sishw_ext.usExternalChip = 0x05;
++				printk(KERN_INFO "%s %s and %s\n", stdstr, lvdsstr, chrstr);
++				break;
++			}
++		}
++	
++	}
++	
++	if(ivideo.vbflags & VB_SISBRIDGE) {
++		SiS_Sense30x();
++	} else if(ivideo.vbflags & VB_CHRONTEL) {
++		SiS_SenseCh();
++	}
++	
+ }
+ 
+-#endif   /* CONFIG_FB_SIS_315 */
+-
+ /* ------------------ Sensing routines ------------------ */
+ 
+ /* TW: Determine and detect attached devices on SiS30x */
+@@ -2621,34 +2879,39 @@ SISDoSense(int tempbl, int tempbh, int t
+     inSISIDXREG(SISPART4,0x03,temp);
+     temp ^= 0x0e;
+     temp &= tempch;
+-    return(temp);
++    return((temp == tempch));
+ }
+ 
+ void
+ SiS_Sense30x(void)
+ {
+-  u8 backupP4_0d;
++  u8 backupP4_0d,backupP2_00;
+   u8 testsvhs_tempbl, testsvhs_tempbh;
+   u8 testsvhs_tempcl, testsvhs_tempch;
+   u8 testcvbs_tempbl, testcvbs_tempbh;
+   u8 testcvbs_tempcl, testcvbs_tempch;
+   u8 testvga2_tempbl, testvga2_tempbh;
+   u8 testvga2_tempcl, testvga2_tempch;
+-  int myflag, result;
++  int myflag, result, haveresult, i, j;
++  char stdstr[] = "sisfb: Detected";
++  char tvstr[]  = "TV connected to";
+ 
+   inSISIDXREG(SISPART4,0x0d,backupP4_0d);
+   outSISIDXREG(SISPART4,0x0d,(backupP4_0d | 0x04));
+ 
++  inSISIDXREG(SISPART2,0x00,backupP2_00);
++  outSISIDXREG(SISPART2,0x00,(backupP2_00 | 0x1c));
++
+   if(sisvga_engine == SIS_300_VGA) {
+ 
+-  	testvga2_tempbh = 0x00; testvga2_tempbl = 0xd1;
+-        testsvhs_tempbh = 0x00; testsvhs_tempbl = 0xb9;
+-	testcvbs_tempbh = 0x00; testcvbs_tempbl = 0xb3;
+-	if((sishw_ext.ujVBChipID != VB_CHIP_301) &&
+-	   (sishw_ext.ujVBChipID != VB_CHIP_302) ) {
+-	   testvga2_tempbh = 0x01; testvga2_tempbl = 0x90;
+-	   testsvhs_tempbh = 0x01; testsvhs_tempbl = 0x6b;
+-	   testcvbs_tempbh = 0x01; testcvbs_tempbl = 0x74;
++	if(ivideo.vbflags & (VB_301B|VB_302B|VB_301LV|VB_302LV)) {
++	   	testvga2_tempbh = 0x01; testvga2_tempbl = 0x90;
++	   	testsvhs_tempbh = 0x01; testsvhs_tempbl = 0x6b;
++	   	testcvbs_tempbh = 0x01; testcvbs_tempbl = 0x74;
++	} else {
++		testvga2_tempbh = 0x00; testvga2_tempbl = 0xd1;
++        	testsvhs_tempbh = 0x00; testsvhs_tempbl = 0xb9;
++		testcvbs_tempbh = 0x00; testcvbs_tempbl = 0xb3;
+ 	}
+ 	inSISIDXREG(SISPART4,0x01,myflag);
+ 	if(myflag & 0x04) {
+@@ -2657,35 +2920,36 @@ SiS_Sense30x(void)
+ 	   testcvbs_tempbh = 0x00; testcvbs_tempbl = 0xee;
+ 	}
+ 	testvga2_tempch = 0x0e;	testvga2_tempcl = 0x08;
+-	testsvhs_tempch = 0x06;	testsvhs_tempcl = 0x04;
++	testsvhs_tempch = 0x04;	testsvhs_tempcl = 0x04;
+ 	testcvbs_tempch = 0x08; testcvbs_tempcl = 0x04;
++	if(ivideo.vbflags & (VB_301LV|VB_302LV)) {
++	   	testvga2_tempbh = 0x00; testvga2_tempbl = 0x00;
++	   	testvga2_tempch = 0x00; testvga2_tempcl = 0x00;
++	 }
+ 	if(ivideo.chip == SIS_300) {
+ 	   inSISIDXREG(SISSR,0x3b,myflag);
+ 	   if(!(myflag & 0x01)) {
+-	      testvga2_tempbh = 0x00; testvga2_tempbl = 0x00;
+-	      testvga2_tempch = 0x00; testvga2_tempcl = 0x00;
++	      	testvga2_tempbh = 0x00; testvga2_tempbl = 0x00;
++	      	testvga2_tempch = 0x00; testvga2_tempcl = 0x00;
+ 	   }
+ 	}
+ 
+   } else {
+ 
+-	testvga2_tempbh = 0x00; testvga2_tempbl = 0xd1;
+-        testsvhs_tempbh = 0x00; testsvhs_tempbl = 0xb9;
+-	testcvbs_tempbh = 0x00; testcvbs_tempbl = 0xb3;
+-	if((sishw_ext.ujVBChipID != VB_CHIP_301) &&
+-	   (sishw_ext.ujVBChipID != VB_CHIP_302)) {
+-	      testvga2_tempbh = 0x01; testvga2_tempbl = 0x90;
+-	      testsvhs_tempbh = 0x01; testsvhs_tempbl = 0x6b;
+-	      testcvbs_tempbh = 0x01; testcvbs_tempbl = 0x74;
+-	      if(sishw_ext.ujVBChipID == VB_CHIP_301LV ||
+-	         sishw_ext.ujVBChipID == VB_CHIP_302LV) {
+-	         testvga2_tempbh = 0x00; testvga2_tempbl = 0x00;
+-	         testsvhs_tempbh = 0x02; testsvhs_tempbl = 0x00;
+-	         testcvbs_tempbh = 0x01; testcvbs_tempbl = 0x00;
+-	      }
++	if(ivideo.vbflags & (VB_301B|VB_302B)) {
++		testvga2_tempbh = 0x01; testvga2_tempbl = 0x90;
++		testsvhs_tempbh = 0x01; testsvhs_tempbl = 0x6b;
++		testcvbs_tempbh = 0x01; testcvbs_tempbl = 0x74;
++	} else if(ivideo.vbflags & (VB_301LV|VB_302LV)) {
++	      	testvga2_tempbh = 0x00; testvga2_tempbl = 0x00;
++	      	testsvhs_tempbh = 0x02; testsvhs_tempbl = 0x00;
++	      	testcvbs_tempbh = 0x01; testcvbs_tempbl = 0x00;
++	} else {
++		testvga2_tempbh = 0x00; testvga2_tempbl = 0xd1;
++        	testsvhs_tempbh = 0x00; testsvhs_tempbl = 0xb9;
++		testcvbs_tempbh = 0x00; testcvbs_tempbl = 0xb3;
+ 	}
+-	if(sishw_ext.ujVBChipID != VB_CHIP_301LV &&
+-	   sishw_ext.ujVBChipID != VB_CHIP_302LV) {
++	if(ivideo.vbflags & (VB_301|VB_301B|VB_302B)) {
+ 	   inSISIDXREG(SISPART4,0x01,myflag);
+ 	   if(myflag & 0x04) {
+ 	      testvga2_tempbh = 0x00; testvga2_tempbl = 0xfd;
+@@ -2693,49 +2957,78 @@ SiS_Sense30x(void)
+ 	      testcvbs_tempbh = 0x00; testcvbs_tempbl = 0xee;
+ 	   }
+ 	}
+-	if((sishw_ext.ujVBChipID == VB_CHIP_301LV) ||
+-	   (sishw_ext.ujVBChipID == VB_CHIP_302LV) ) {
++	if(ivideo.vbflags & (VB_301LV|VB_302LV)) {
+ 	   testvga2_tempbh = 0x00; testvga2_tempbl = 0x00;
+ 	   testvga2_tempch = 0x00; testvga2_tempcl = 0x00;
+ 	   testsvhs_tempch = 0x04; testsvhs_tempcl = 0x08;
+ 	   testcvbs_tempch = 0x08; testcvbs_tempcl = 0x08;
+ 	} else {
+ 	   testvga2_tempch = 0x0e; testvga2_tempcl = 0x08;
+-	   testsvhs_tempch = 0x06; testsvhs_tempcl = 0x04;
++	   testsvhs_tempch = 0x04; testsvhs_tempcl = 0x04;
+ 	   testcvbs_tempch = 0x08; testcvbs_tempcl = 0x04;
+ 	}
+     } 
+ 
+     if(testvga2_tempch || testvga2_tempcl || testvga2_tempbh || testvga2_tempbl) {
+-        result = SISDoSense(testvga2_tempbl, testvga2_tempbh,
+-                            testvga2_tempcl, testvga2_tempch);
+- 	if(result) {
+-        	printk(KERN_INFO "sisfb: Detected secondary VGA connection\n");
+-		orSISIDXREG(SISCR, 0x32, 0x10);
+-	}
++       haveresult = 0;
++       for(j = 0; j < 10; j++) {
++          result = 0;
++          for(i = 0; i < 3; i++) {
++             if(SISDoSense(testvga2_tempbl, testvga2_tempbh,
++                           testvga2_tempcl, testvga2_tempch))
++	        result++;
++          }
++	  if((result == 0) || (result >= 2)) break;
++       }
++       if(result) {
++          printk(KERN_INFO "%s secondary VGA connection\n", stdstr);
++	  orSISIDXREG(SISCR, 0x32, 0x10);
++       } else {
++	  andSISIDXREG(SISCR, 0x32, ~0x10);
++       }
++    }
++
++    haveresult = 0;
++    for(j = 0; j < 10; j++) {
++       result = 0;
++       for(i = 0; i < 3; i++) {
++          if(SISDoSense(testsvhs_tempbl, testsvhs_tempbh,
++                        testsvhs_tempcl, testsvhs_tempch))
++	        result++;
++       }
++       if((result == 0) || (result >= 2)) break;
+     }
+-    
+-    result = SISDoSense(testsvhs_tempbl, testsvhs_tempbh,
+-                        testsvhs_tempcl, testsvhs_tempch);
+     if(result) {
+-        printk(KERN_INFO "sisfb: Detected TV connected to SVHS output\n");
+-        /* TW: So we can be sure that there IS a SVHS output */
+-	ivideo.TV_plug = TVPLUG_SVIDEO;
++        printk(KERN_INFO "%s %s SVIDEO output\n", stdstr, tvstr);
++	ivideo.vbflags |= TV_SVIDEO;
+ 	orSISIDXREG(SISCR, 0x32, 0x02);
++	andSISIDXREG(SISCR, 0x32, ~0x05);
+     }
+ 
+     if(!result) {
+-        result = SISDoSense(testcvbs_tempbl, testcvbs_tempbh,
+-	                    testcvbs_tempcl, testcvbs_tempch);
++
++	haveresult = 0;
++       	for(j = 0; j < 10; j++) {
++           result = 0;
++           for(i = 0; i < 3; i++) {
++              if(SISDoSense(testcvbs_tempbl, testcvbs_tempbh,
++	                    testcvbs_tempcl, testcvbs_tempch))
++	        result++;
++           }
++           if((result == 0) || (result >= 2)) break;
++        }
+ 	if(result) {
+-	    printk(KERN_INFO "sisfb: Detected TV connected to CVBS output\n");
+-	    /* TW: So we can be sure that there IS a CVBS output */
+-	    ivideo.TV_plug = TVPLUG_COMPOSITE;
++	    printk(KERN_INFO "%s %s COMPOSITE output\n", stdstr, tvstr);
++	    ivideo.vbflags |= TV_AVIDEO;
+ 	    orSISIDXREG(SISCR, 0x32, 0x01);
++	    andSISIDXREG(SISCR, 0x32, ~0x06);
++	} else {
++	    andSISIDXREG(SISCR, 0x32, ~0x07);
+ 	}
+     }
+     SISDoSense(0, 0, 0, 0);
+ 
++    outSISIDXREG(SISPART2,0x00,backupP2_00);
+     outSISIDXREG(SISPART4,0x0d,backupP4_0d);
+ }
+ 
+@@ -2744,51 +3037,84 @@ void
+ SiS_SenseCh(void)
+ {
+ 
+-   u8 temp1;
+-#ifdef CONFIG_FB_SIS_315
+-   u8 temp2;
++   u8 temp1, temp2;
++#ifdef CONFIG_FB_SIS_300
++   unsigned char test[3];
++   int i;
+ #endif
++   char stdstr[] = "sisfb: Chrontel: Detected TV connected to";
+ 
+    if(ivideo.chip < SIS_315H) {
+ 
+ #ifdef CONFIG_FB_SIS_300
+-       SiS_Pr.SiS_IF_DEF_CH70xx = 1;		/* TW: Chrontel 7005 */
++       SiS_Pr.SiS_IF_DEF_CH70xx = 1;		/* Chrontel 700x */
++       SiS_SetChrontelGPIO(&SiS_Pr, 0x9c);	/* Set general purpose IO for Chrontel communication */
++       SiS_DDC2Delay(&SiS_Pr, 1000);
+        temp1 = SiS_GetCH700x(&SiS_Pr, 0x25);
+-       if ((temp1 >= 50) && (temp1 <= 100)) {
+-	   /* TW: Read power status */
++       /* TW: See Chrontel TB31 for explanation */
++       temp2 = SiS_GetCH700x(&SiS_Pr, 0x0e);
++       if(((temp2 & 0x07) == 0x01) || (temp2 & 0x04)) {
++	  SiS_SetCH700x(&SiS_Pr, 0x0b0e);
++	  SiS_DDC2Delay(&SiS_Pr, 300);
++       }
++       temp2 = SiS_GetCH700x(&SiS_Pr, 0x25);
++       if(temp2 != temp1) temp1 = temp2;
++
++       if((temp1 >= 0x22) && (temp1 <= 0x50)) {
++	   /* Read power status */
+ 	   temp1 = SiS_GetCH700x(&SiS_Pr, 0x0e);
+ 	   if((temp1 & 0x03) != 0x03) {
+-     	        /* TW: Power all outputs */
+-		SiS_SetCH70xxANDOR(&SiS_Pr, 0x030E,0xF8);
++     	        /* Power all outputs */
++		SiS_SetCH700x(&SiS_Pr, 0x0B0E);
++		SiS_DDC2Delay(&SiS_Pr, 300);
+ 	   }
+-	   /* TW: Sense connected TV devices */
+-	   SiS_SetCH700x(&SiS_Pr, 0x0110);
+-	   SiS_SetCH700x(&SiS_Pr, 0x0010);
+-	   temp1 = SiS_GetCH700x(&SiS_Pr, 0x10);
+-	   if(!(temp1 & 0x08)) {
+-		printk(KERN_INFO
+-		   "sisfb: Chrontel: Detected TV connected to SVHS output\n");
+-		/* TW: So we can be sure that there IS a SVHS output */
+-		ivideo.TV_plug = TVPLUG_SVIDEO;
++	   /* Sense connected TV devices */
++	   for(i = 0; i < 3; i++) {
++	       SiS_SetCH700x(&SiS_Pr, 0x0110);
++	       SiS_DDC2Delay(&SiS_Pr, 0x96);
++	       SiS_SetCH700x(&SiS_Pr, 0x0010);
++	       SiS_DDC2Delay(&SiS_Pr, 0x96);
++	       temp1 = SiS_GetCH700x(&SiS_Pr, 0x10);
++	       if(!(temp1 & 0x08))       test[i] = 0x02;
++	       else if(!(temp1 & 0x02))  test[i] = 0x01;
++	       else                      test[i] = 0;
++	       SiS_DDC2Delay(&SiS_Pr, 0x96);
++	   }
++
++	   if(test[0] == test[1])      temp1 = test[0];
++	   else if(test[0] == test[2]) temp1 = test[0];
++	   else if(test[1] == test[2]) temp1 = test[1];
++	   else {
++	   	printk(KERN_INFO
++			"sisfb: TV detection unreliable - test results varied\n");
++		temp1 = test[2];
++	   }
++	   if(temp1 == 0x02) {
++		printk(KERN_INFO "%s SVIDEO output\n", stdstr);
++		ivideo.vbflags |= TV_SVIDEO;
+ 		orSISIDXREG(SISCR, 0x32, 0x02);
+-	   } else if (!(temp1 & 0x02)) {
+-		printk(KERN_INFO
+-		   "sisfb: Chrontel: Detected TV connected to CVBS output\n");
+-		/* TW: So we can be sure that there IS a CVBS output */
+-		ivideo.TV_plug = TVPLUG_COMPOSITE;
++		andSISIDXREG(SISCR, 0x32, ~0x05);
++	   } else if (temp1 == 0x01) {
++		printk(KERN_INFO "%s CVBS output\n", stdstr);
++		ivideo.vbflags |= TV_AVIDEO;
+ 		orSISIDXREG(SISCR, 0x32, 0x01);
++		andSISIDXREG(SISCR, 0x32, ~0x06);
+ 	   } else {
+  		SiS_SetCH70xxANDOR(&SiS_Pr, 0x010E,0xF8);
++		andSISIDXREG(SISCR, 0x32, ~0x07);
+ 	   }
+        } else if(temp1 == 0) {
+ 	  SiS_SetCH70xxANDOR(&SiS_Pr, 0x010E,0xF8);
++	  andSISIDXREG(SISCR, 0x32, ~0x07);
+        }
++       /* Set general purpose IO for Chrontel communication */
++       SiS_SetChrontelGPIO(&SiS_Pr, 0x00);
+ #endif
+ 
+    } else {
+ 
+ #ifdef CONFIG_FB_SIS_315
+-	SiS_Pr.SiS_IF_DEF_CH70xx = 2;		/* TW: Chrontel 7019 */
++	SiS_Pr.SiS_IF_DEF_CH70xx = 2;		/* Chrontel 7019 */
+         temp1 = SiS_GetCH701x(&SiS_Pr, 0x49);
+ 	SiS_SetCH701x(&SiS_Pr, 0x2049);
+ 	SiS_DDC2Delay(&SiS_Pr, 0x96);
+@@ -2808,22 +3134,24 @@ SiS_SenseCh(void)
+ 	if( (temp1 & 0x01) && (temp1 & 0x02) ) temp1 = 0x04;
+ 	switch(temp1) {
+ 	case 0x01:
+-	     printk(KERN_INFO
+-		"sisfb: Chrontel: Detected TV connected to CVBS output\n");
+-	     ivideo.TV_plug = TVPLUG_COMPOSITE;
++	     printk(KERN_INFO "%s CVBS output\n", stdstr);
++	     ivideo.vbflags |= TV_AVIDEO;
+ 	     orSISIDXREG(SISCR, 0x32, 0x01);
++	     andSISIDXREG(SISCR, 0x32, ~0x06);
+              break;
+ 	case 0x02:
+-	     printk(KERN_INFO
+-		"sisfb: Chrontel: Detected TV connected to SVHS output\n");
+-	     ivideo.TV_plug = TVPLUG_SVIDEO;
++	     printk(KERN_INFO "%s SVIDEO output\n", stdstr);
++	     ivideo.vbflags |= TV_SVIDEO;
+ 	     orSISIDXREG(SISCR, 0x32, 0x02);
++	     andSISIDXREG(SISCR, 0x32, ~0x05);
+              break;
+ 	case 0x04:
+-	     /* TW: This should not happen */
+-	     printk(KERN_INFO
+-		"sisfb: Chrontel: Detected TV connected to SCART output\n");
++	     printk(KERN_INFO "%s SCART output\n", stdstr);
++	     orSISIDXREG(SISCR, 0x32, 0x04);
++	     andSISIDXREG(SISCR, 0x32, ~0x03);		
+              break;
++	default:
++	     andSISIDXREG(SISCR, 0x32, ~0x07);
+ 	}
+ #endif
+ 
+@@ -2860,14 +3188,20 @@ static int sisfb_heap_init(void)
+  *     in XF86Config-4.
+  *     The heap start can also be specified by parameter "mem" when starting the sisfb
+  *     driver. sisfb mem=1024 lets heap starts at 1MB, etc.
++ *     On the 315 series, the default is a 1MB heap since DRI is not supported
++ *     there.
+  */
+      if ((!sisfb_mem) || (sisfb_mem > (ivideo.video_size/1024))) {
+-        if (ivideo.video_size > 0x1000000) {
++        if(sisvga_engine == SIS_300_VGA) {
++           if (ivideo.video_size > 0x1000000) {
+ 	        ivideo.heapstart = 0xc00000;
+-	} else if (ivideo.video_size > 0x800000) {
++	   } else if (ivideo.video_size > 0x800000) {
+ 	        ivideo.heapstart = 0x800000;
+-	} else {
++	   } else {
+ 		ivideo.heapstart = 0x400000;
++	   }
++	} else {
++	   ivideo.heapstart = ivideo.video_size - 0x100000;
+ 	}
+      } else {
+            ivideo.heapstart = sisfb_mem * 1024;
+@@ -2883,7 +3217,7 @@ static int sisfb_heap_init(void)
+ #ifdef CONFIG_FB_SIS_315
+      if (sisvga_engine == SIS_315_VGA) {
+         /* TW: Now initialize the 310 series' command queue mode.
+-	 * On 310/325, there are three queue modes available which
++	 * On 315, there are three queue modes available which
+ 	 * are chosen by setting bits 7:5 in SR26:
+ 	 * 1. MMIO queue mode (bit 5, 0x20). The hardware will keep
+ 	 *    track of the queue, the FIFO, command parsing and so
+@@ -3333,7 +3667,6 @@ void sis_malloc(struct sis_memreq *req)
+ 		req->offset = poh->offset;
+ 		req->size = poh->size;
+ 	}
+-
+ }
+ 
+ void sis_free(unsigned long base)
+@@ -3352,35 +3685,70 @@ void sis_free(unsigned long base)
+ 
+ static void sisfb_pre_setmode(void)
+ {
+-	u8 cr30 = 0, cr31 = 0;
++	u8 cr30 = 0, cr31 = 0, cr33 = 0;
++	
++	ivideo.currentvbflags &= (VB_VIDEOBRIDGE | VB_DISPTYPE_DISP2);
+ 
+ 	inSISIDXREG(SISCR, 0x31, cr31);
+ 	cr31 &= ~0x60;
++	cr31 |= 0x04;
++	
++	cr33 = sisfb_rate_idx & 0x0F;
+ 
+-	switch (ivideo.disp_state & DISPTYPE_DISP2) {
+-	   case DISPTYPE_CRT2:
+-		cr30 = (SIS_VB_OUTPUT_CRT2 | SIS_SIMULTANEOUS_VIEW_ENABLE);
+-		cr31 |= SIS_DRIVER_MODE;
+-		break;
+-	   case DISPTYPE_LCD:
+-		cr30  = (SIS_VB_OUTPUT_LCD | SIS_SIMULTANEOUS_VIEW_ENABLE);
+-		cr31 |= SIS_DRIVER_MODE;
+-		break;
+-	   case DISPTYPE_TV:
+-		if (ivideo.TV_type == TVMODE_HIVISION)
++	SiS_SetEnableDstn(&SiS_Pr, FALSE);
++	SiS_SetEnableFstn(&SiS_Pr, FALSE);
++
++	switch (ivideo.currentvbflags & VB_DISPTYPE_DISP2) {
++	   case CRT2_TV:
++		ivideo.disp_state = DISPTYPE_TV;
++		if (ivideo.vbflags & TV_HIVISION) {
+ 			cr30 = (SIS_VB_OUTPUT_HIVISION | SIS_SIMULTANEOUS_VIEW_ENABLE);
+-		else if (ivideo.TV_plug == TVPLUG_SVIDEO)
++			ivideo.currentvbflags |= (TV_HIVISION | TV_SVIDEO);
++			ivideo.TV_type = TVMODE_HIVISION;
++			ivideo.TV_plug = TVPLUG_SVIDEO;
++		} else if (ivideo.vbflags & TV_SVIDEO) {
+ 			cr30 = (SIS_VB_OUTPUT_SVIDEO | SIS_SIMULTANEOUS_VIEW_ENABLE);
+-		else if (ivideo.TV_plug == TVPLUG_COMPOSITE)
++			ivideo.currentvbflags |= TV_SVIDEO;
++			ivideo.TV_plug = TVPLUG_SVIDEO;
++		} else if (ivideo.vbflags & TV_AVIDEO) {
+ 			cr30 = (SIS_VB_OUTPUT_COMPOSITE | SIS_SIMULTANEOUS_VIEW_ENABLE);
+-		else if (ivideo.TV_plug == TVPLUG_SCART)
++			ivideo.currentvbflags |= TV_AVIDEO;
++			ivideo.TV_plug = TVPLUG_COMPOSITE;
++		} else if (ivideo.vbflags & TV_SCART) {
+ 			cr30 = (SIS_VB_OUTPUT_SCART | SIS_SIMULTANEOUS_VIEW_ENABLE);
++			ivideo.currentvbflags |= TV_SCART;
++			ivideo.TV_plug = TVPLUG_SCART;
++		}
+ 		cr31 |= SIS_DRIVER_MODE;
+ 
+-	        if (sisfb_tvmode == 1 || ivideo.TV_type == TVMODE_PAL)
+-			cr31 |= 0x01;
+-                else
+-                        cr31 &= ~0x01;
++		if(!(ivideo.vbflags & TV_HIVISION)) {
++	        	if (ivideo.vbflags & TV_PAL) {
++		 		cr31 |= 0x01;
++				ivideo.currentvbflags |= TV_PAL;
++				ivideo.TV_type = TVMODE_PAL;
++                	} else {
++		       		cr31 &= ~0x01;
++				ivideo.currentvbflags |= TV_NTSC;
++				ivideo.TV_type = TVMODE_NTSC;
++			}
++		}
++		break;
++	   case CRT2_LCD:
++		ivideo.disp_state = DISPTYPE_LCD;
++		cr30  = (SIS_VB_OUTPUT_LCD | SIS_SIMULTANEOUS_VIEW_ENABLE);
++		cr31 |= SIS_DRIVER_MODE;
++		SiS_SetEnableDstn(&SiS_Pr, sisfb_dstn);
++	        SiS_SetEnableFstn(&SiS_Pr, sisfb_fstn);
++		break;		
++	   case CRT2_VGA:
++		ivideo.disp_state = DISPTYPE_CRT2;
++		cr30 = (SIS_VB_OUTPUT_CRT2 | SIS_SIMULTANEOUS_VIEW_ENABLE);
++		cr31 |= SIS_DRIVER_MODE;
++		if(sisfb_nocrt2rate) {
++			cr33 |= (sisbios_mode[sisfb_mode_idx].rate_idx << 4);
++		} else {
++			cr33 |= ((sisfb_rate_idx & 0x0F) << 4);
++		}
+ 		break;
+ 	   default:	/* disable CRT2 */
+ 		cr30 = 0x00;
+@@ -3389,8 +3757,7 @@ static void sisfb_pre_setmode(void)
+ 
+ 	outSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR30, cr30);
+ 	outSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR31, cr31);
+-
+-        outSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR33, (sisfb_rate_idx & 0x0F));
++	outSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR33, cr33);
+ 
+ 	if(ivideo.accel) sisfb_syncaccel();
+ 
+@@ -3400,67 +3767,89 @@ static void sisfb_pre_setmode(void)
+ static void sisfb_post_setmode(void)
+ {
+ 	u8 reg;
++	BOOLEAN crt1isoff = FALSE;
++#ifdef CONFIG_FB_SIS_315
++	u8 reg1;
++#endif
++#ifdef CONFIG_FB_SIS_300
+ 	BOOLEAN doit = TRUE;
+-#if 0	/* TW: Wrong: Is not in MMIO space, but in RAM */
+-	/* Backup mode number to MMIO space */
+-	if(ivideo.mmio_vbase) {
+-	  *(volatile u8 *)(((u8*)ivideo.mmio_vbase) + 0x449) = (unsigned char)sisfb_mode_no;
+-	}
+-#endif	
+-
+-	if (ivideo.video_bpp == 8) {
+-		/* TW: We can't switch off CRT1 on LVDS/Chrontel in 8bpp Modes */
+-		if ((ivideo.hasVB == HASVB_LVDS) || (ivideo.hasVB == HASVB_LVDS_CHRONTEL)) {
+-			doit = FALSE;
+-		}
+-		/* TW: We can't switch off CRT1 on 301B-DH in 8bpp Modes if using LCD */
+-		if ( (sishw_ext.Is301BDH) && (ivideo.disp_state & DISPTYPE_LCD) ) {
+-	        	doit = FALSE;
+-	        }
+-	}
+-
++#endif
+ 	/* TW: We can't switch off CRT1 if bridge is in slave mode */
+-	if(ivideo.hasVB != HASVB_NONE) {
+-		inSISIDXREG(SISPART1, 0x00, reg);
++	if(ivideo.vbflags & VB_VIDEOBRIDGE) {
++#ifdef CONFIG_FB_SIS_300
+ 		if(sisvga_engine == SIS_300_VGA) {
++			inSISIDXREG(SISPART1, 0x00, reg);
+ 			if((reg & 0xa0) == 0x20) {
+ 				doit = FALSE;
+ 			}
+ 		}
+-		if(sisvga_engine == SIS_315_VGA) {
+-			if((reg & 0x50) == 0x10) {
+-				doit = FALSE;
+-			}
+-		}
++#endif
+ 	} else sisfb_crt1off = 0;
+ 
+-	inSISIDXREG(SISCR, 0x17, reg);
+-	if((sisfb_crt1off) && (doit))
+-		reg &= ~0x80;
+-	else 	      
+-		reg |= 0x80;
+-	outSISIDXREG(SISCR, 0x17, reg);
++	if(sisvga_engine == SIS_300_VGA) {
+ 
+-        andSISIDXREG(SISSR, IND_SIS_RAMDAC_CONTROL, ~0x04);
++#ifdef CONFIG_FB_SIS_300
++	   if((sisfb_crt1off) && (doit)) {
++	        crt1isoff = TRUE;
++		reg = 0x00;
++	   } else {
++	        crt1isoff = FALSE;
++		reg = 0x80;
++	   }
++	   setSISIDXREG(SISCR, 0x17, 0x7f, reg);
++#endif
+ 
+-	if((ivideo.disp_state & DISPTYPE_TV) && (ivideo.hasVB == HASVB_301)) {
++	} else {
++
++#ifdef CONFIG_FB_SIS_315
++	   if(sisfb_crt1off) {
++	        crt1isoff = TRUE;
++		reg  = 0x40;
++		reg1 = 0xc0;
++	   } else {
++	        crt1isoff = FALSE;
++		reg  = 0x00;
++		reg1 = 0x00;
++
++	   }
++	   setSISIDXREG(SISCR, 0x63, ~0x40, reg);
++	   setSISIDXREG(SISSR, 0x1f, ~0xc0, reg1);
++#endif
++
++	}
++
++	if(crt1isoff) {
++	   ivideo.currentvbflags &= ~VB_DISPTYPE_CRT1;
++	   ivideo.currentvbflags |= VB_SINGLE_MODE;
++	   ivideo.disp_state |= DISPMODE_SINGLE;
++	} else {
++	   ivideo.currentvbflags |= VB_DISPTYPE_CRT1;
++	   ivideo.disp_state |= DISPTYPE_CRT1;
++	   if(ivideo.currentvbflags & VB_DISPTYPE_CRT2) {
++	  	ivideo.currentvbflags |= VB_MIRROR_MODE;
++		ivideo.disp_state |= DISPMODE_MIRROR;
++	   } else {
++	 	ivideo.currentvbflags |= VB_SINGLE_MODE;
++		ivideo.disp_state |= DISPMODE_SINGLE;
++	   }
++	}
+ 
+-	   inSISIDXREG(SISPART4, 0x01, reg);
++        andSISIDXREG(SISSR, IND_SIS_RAMDAC_CONTROL, ~0x04);
+ 
+-	   if(reg < 0xB0) {        	/* Set filter for SiS301 */
++	if((ivideo.currentvbflags & CRT2_TV) && (ivideo.vbflags & VB_301)) {  /* Set filter for SiS301 */
+ 
+ 		switch (ivideo.video_width) {
+ 		   case 320:
+-			filter_tb = (ivideo.TV_type == TVMODE_NTSC) ? 4 : 12;
++			filter_tb = (ivideo.vbflags & TV_NTSC) ? 4 : 12;
+ 			break;
+ 		   case 640:
+-			filter_tb = (ivideo.TV_type == TVMODE_NTSC) ? 5 : 13;
++			filter_tb = (ivideo.vbflags & TV_NTSC) ? 5 : 13;
+ 			break;
+ 		   case 720:
+-			filter_tb = (ivideo.TV_type == TVMODE_NTSC) ? 6 : 14;
++			filter_tb = (ivideo.vbflags & TV_NTSC) ? 6 : 14;
+ 			break;
+ 		   case 800:
+-			filter_tb = (ivideo.TV_type == TVMODE_NTSC) ? 7 : 15;
++			filter_tb = (ivideo.vbflags & TV_NTSC) ? 7 : 15;
+ 			break;
+ 		   default:
+ 			filter = -1;
+@@ -3469,15 +3858,15 @@ static void sisfb_post_setmode(void)
+ 
+ 		orSISIDXREG(SISPART1, sisfb_CRT2_write_enable, 0x01);
+ 
+-		if(ivideo.TV_type == TVMODE_NTSC) {
++		if(ivideo.vbflags & TV_NTSC) {
+ 
+ 		        andSISIDXREG(SISPART2, 0x3a, 0x1f);
+ 
+-			if (ivideo.TV_plug == TVPLUG_SVIDEO) {
++			if (ivideo.vbflags & TV_SVIDEO) {
+ 
+ 			        andSISIDXREG(SISPART2, 0x30, 0xdf);
+ 
+-			} else if (ivideo.TV_plug == TVPLUG_COMPOSITE) {
++			} else if (ivideo.vbflags & TV_AVIDEO) {
+ 
+ 			        orSISIDXREG(SISPART2, 0x30, 0x20);
+ 
+@@ -3503,15 +3892,15 @@ static void sisfb_post_setmode(void)
+ 				}
+ 			}
+ 
+-		} else if(ivideo.TV_type == TVMODE_PAL) {
++		} else if(ivideo.vbflags & TV_PAL) {
+ 
+ 			andSISIDXREG(SISPART2, 0x3A, 0x1F);
+ 
+-			if (ivideo.TV_plug == TVPLUG_SVIDEO) {
++			if (ivideo.vbflags & TV_SVIDEO) {
+ 
+ 			        andSISIDXREG(SISPART2, 0x30, 0xDF);
+ 
+-			} else if (ivideo.TV_plug == TVPLUG_COMPOSITE) {
++			} else if (ivideo.vbflags & TV_AVIDEO) {
+ 
+ 			        orSISIDXREG(SISPART2, 0x30, 0x20);
+ 
+@@ -3539,7 +3928,7 @@ static void sisfb_post_setmode(void)
+ 		}
+ 
+ 		if ((filter >= 0) && (filter <=7)) {
+-			DPRINTK("FilterTable[%d]-%d: %02x %02x %02x %02x\n", filter_tb, filter, 
++			DPRINTK("FilterTable[%d]-%d: %02x %02x %02x %02x\n", filter_tb, filter,
+ 				sis_TV_filter[filter_tb].filter[filter][0],
+ 				sis_TV_filter[filter_tb].filter[filter][1],
+ 				sis_TV_filter[filter_tb].filter[filter][2],
+@@ -3550,8 +3939,6 @@ static void sisfb_post_setmode(void)
+ 			outSISIDXREG(SISPART2, 0x37, (sis_TV_filter[filter_tb].filter[filter][2]));
+ 			outSISIDXREG(SISPART2, 0x38, (sis_TV_filter[filter_tb].filter[filter][3]));
+ 		}
+-
+-	     }
+ 	  
+ 	}
+ 
+@@ -3578,24 +3965,22 @@ int sisfb_setup(char *options)
+ 		if (!*this_opt)	continue;
+ 
+ 		if (!strncmp(this_opt, "mode:", 5)) {
+-			sisfb_search_mode(this_opt + 5);
++			sisfb_search_mode(this_opt + 5, FALSE);
+ 		} else if (!strncmp(this_opt, "vesa:", 5)) {
+-			sisfb_search_vesamode(simple_strtoul(this_opt + 5, NULL, 0));
++			sisfb_search_vesamode(simple_strtoul(this_opt + 5, NULL, 0), FALSE);
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)			
+ 		} else if (!strcmp(this_opt, "inverse")) {
+ 			sisfb_inverse = 1;
+ 			/* fb_invert_cmaps(); */
+ 		} else if (!strncmp(this_opt, "font:", 5)) {
+ 			strcpy(sis_fb_info.fontname, this_opt + 5);
+-#endif			
+-		} else if (!strncmp(this_opt, "mode:", 5)) {
+-			sisfb_search_mode(this_opt + 5);
+-		} else if (!strncmp(this_opt, "vesa:", 5)) {
+-			sisfb_search_vesamode(simple_strtoul(this_opt + 5, NULL, 0));
++#endif
+ 		} else if (!strncmp(this_opt, "vrate:", 6)) {
+ 			ivideo.refresh_rate = simple_strtoul(this_opt + 6, NULL, 0);
++			sisfb_parm_rate = ivideo.refresh_rate;
+ 		} else if (!strncmp(this_opt, "rate:", 5)) {
+ 			ivideo.refresh_rate = simple_strtoul(this_opt + 5, NULL, 0);
++			sisfb_parm_rate = ivideo.refresh_rate;
+ 		} else if (!strncmp(this_opt, "off", 3)) {
+ 			sisfb_off = 1;
+ 		} else if (!strncmp(this_opt, "crt1off", 7)) {
+@@ -3612,10 +3997,6 @@ int sisfb_setup(char *options)
+ 			sisfb_search_tvstd(this_opt + 7);
+                 } else if (!strncmp(this_opt, "mem:",4)) {
+ 		        sisfb_mem = simple_strtoul(this_opt + 4, NULL, 0);
+-                } else if (!strncmp(this_opt, "dstn", 4)) {
+-			enable_dstn = 1;
+-			/* TW: DSTN overrules forcecrt2type */
+-			sisfb_crt2type = DISPTYPE_LCD;
+ 		} else if (!strncmp(this_opt, "queuemode:", 10)) {
+ 			sisfb_search_queuemode(this_opt + 10);
+ 		} else if (!strncmp(this_opt, "pdc:", 4)) {
+@@ -3632,17 +4013,18 @@ int sisfb_setup(char *options)
+ 			sisfb_userom = (int)simple_strtoul(this_opt + 7, NULL, 0);
+ 		} else if (!strncmp(this_opt, "useoem:", 7)) {
+ 			sisfb_useoem = (int)simple_strtoul(this_opt + 7, NULL, 0);
++		} else if (!strncmp(this_opt, "nocrt2rate", 10)) {
++			sisfb_nocrt2rate = 1;			
++		} else if(this_opt[0] >= '0' && this_opt[0] <= '9') {
++			sisfb_search_mode(this_opt, TRUE);
+ 		} else {
+ 			printk(KERN_INFO "sisfb: Invalid option %s\n", this_opt);
+ 		}
+ 
+ 		/* TW: Acceleration only with MMIO mode */
+ 		if((sisfb_queuemode != -1) && (sisfb_queuemode != MMIO_CMD)) {
+-			sisfb_ypan = 0;
+ 			sisfb_accel = 0;
+ 		}
+-		/* TW: Panning only with acceleration */
+-		if(sisfb_accel == 0) sisfb_ypan = 0;
+ 
+ 	}
+ 	return 0;
+@@ -3661,14 +4043,14 @@ static char *sis_find_rom(void)
+         char *sis_sig_300[4] = {
+           "300", "540", "630", "730"
+         };
+-        char *sis_sig_310[7] = {
+-          "315", "315", "315", "5315", "6325", "6325", "Xabre"
++        char *sis_sig_310[8] = {
++          "315", "315", "315", "5315", "6325", "6325", "Xabre", "6330"
+         };
+ 	ushort sis_nums_300[4] = {
+ 	  SIS_300, SIS_540, SIS_630, SIS_730
+ 	};
+-	unsigned short sis_nums_310[7] = {
+-	  SIS_315PRO, SIS_315H, SIS_315, SIS_550, SIS_650, SIS_740, SIS_330
++	unsigned short sis_nums_310[8] = {
++	  SIS_315PRO, SIS_315H, SIS_315, SIS_550, SIS_650, SIS_740, SIS_330, SIS_660
+ 	};
+ 
+         for(segstart=0x000c0000; segstart<0x000f0000; segstart+=0x00001000) {
+@@ -3705,7 +4087,7 @@ static char *sis_find_rom(void)
+                     }
+                 }
+ 		if(stage != 4) {
+-                   for(i = 0;(i < 7) && (stage != 4); i++) {
++                   for(i = 0;(i < 8) && (stage != 4); i++) {
+                       if(strncmp(sis_sig_310[i], rom, strlen(sis_sig_310[i])) == 0) {
+ 		          if(sis_nums_310[i] == ivideo.chip) {
+                              stage = 4;
+@@ -3735,7 +4117,7 @@ int __init sisfb_init(void)
+ 	int pdev_valid = 0;
+ 	u32 reg32;
+ 	u16 reg16;
+-	u8  reg, reg1;
++	u8  reg;
+ 
+ 	/* outb(0x77, 0x80); */  /* What is this? */
+ 
+@@ -3751,12 +4133,14 @@ int __init sisfb_init(void)
+ 	if (sisfb_off)
+ 		return -ENXIO;
+ 
+-	if (enable_dstn)
+-		SiS_SetEnableDstn(&SiS_Pr);
+-		
+ 	sisfb_registered = 0;
++	sisfb_thismonitor.datavalid = FALSE;
+ 
+ 	memset(&sis_fb_info, 0, sizeof(sis_fb_info));
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
++        memset(&sisfb_lastrates[0], 0, 128);
++#endif
+ 	
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)	
+ 	memset(&sis_disp, 0, sizeof(sis_disp));
+@@ -3877,6 +4261,12 @@ int __init sisfb_init(void)
+ 		sisfb_hwcursor_size = HW_CURSOR_AREA_SIZE_315 * 2;
+ 		sisfb_CRT2_write_enable = IND_SIS_CRT2_WRITE_ENABLE_315;
+ 		break;
++	   case PCI_DEVICE_ID_SI_660_VGA:
++		ivideo.chip = SIS_660;
++		sisvga_engine = SIS_315_VGA;
++		sisfb_hwcursor_size = HW_CURSOR_AREA_SIZE_315 * 2;
++		sisfb_CRT2_write_enable = IND_SIS_CRT2_WRITE_ENABLE_315;
++		break;
+ #endif
+            default:
+ 	        return -ENODEV;
+@@ -3902,30 +4292,34 @@ int __init sisfb_init(void)
+ 	SiS_Pr.SiS_Backup70xx = 0xff;
+         SiS_Pr.SiS_CHOverScan = -1;
+         SiS_Pr.SiS_ChSW = FALSE;
++	SiS_Pr.SiS_CustomT = CUT_NONE;
+ 	SiS_Pr.SiS_UseLCDA = FALSE;
+ 	SiS_Pr.UsePanelScaler = -1;
+ 	SiSRegInit(&SiS_Pr, (USHORT)sishw_ext.ulIOAddress);
+ 
+ #ifdef CONFIG_FB_SIS_300
+-	/* TW: Find PCI systems for Chrontel/ISA bridge manipulation */
++	/* TW: Find PCI systems for Chrontel/GPIO communication setup */
+ 	if(ivideo.chip == SIS_630) {
+-	  int i=0;
+-          do {
+-	    if(mychswtable[i].subsysVendor == ivideo.subsysvendor &&
+-	       mychswtable[i].subsysCard   == ivideo.subsysdevice) {
+-		SiS_Pr.SiS_ChSW = TRUE;
+-            }
+-            i++;
+-          } while(mychswtable[i].subsysVendor != 0);
++	   int i=0;
++           do {
++	      if(mychswtable[i].subsysVendor == ivideo.subsysvendor &&
++	         mychswtable[i].subsysCard   == ivideo.subsysdevice) {
++		 SiS_Pr.SiS_ChSW = TRUE;
++		 printk(KERN_DEBUG "sisfb: Identified [%s %s] requiring Chrontel/GPIO setup\n",
++		        mychswtable[i].vendorName, mychswtable[i].cardName);
++		 break;
++              }
++              i++;
++           } while(mychswtable[i].subsysVendor != 0);
+ 	}
+ #endif
+ 
+         outSISIDXREG(SISSR, IND_SIS_PASSWORD, SIS_PASSWORD);
+ 
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)		
+-#ifdef MODULE	
++#ifdef MODULE
+ 	inSISIDXREG(SISCR,0x34,reg);
+-	if(reg & 0x80) {
++	if((reg & 0x80) && (reg != 0xff)) {
+ 	   if((sisbios_mode[sisfb_mode_idx].mode_no) != 0xFF) {
+ 	      printk(KERN_INFO "sisfb: Cannot initialize display mode, X server is active\n");
+ 	      return -EBUSY;
+@@ -3938,7 +4332,7 @@ int __init sisfb_init(void)
+ 
+ #ifdef CONFIG_FB_SIS_300
+ 	if (sisvga_engine == SIS_300_VGA) {
+-	        outSISIDXREG(SISSR, 0x28, 0x37);
++	        outSISIDXREG(SISSR, 0x28, 0x37);	/* Reset memory clock */
+ 
+                 outSISIDXREG(SISSR, 0x29, 0x61);
+ 
+@@ -3946,7 +4340,8 @@ int __init sisfb_init(void)
+ 	}
+ #endif
+ #ifdef CONFIG_FB_SIS_315
+-	if (ivideo.chip == SIS_550 || ivideo.chip == SIS_650 || ivideo.chip == SIS_740) {
++	if (ivideo.chip == SIS_550 || ivideo.chip == SIS_650 ||
++	    ivideo.chip == SIS_740 || ivideo.chip == SIS_660) {
+ 	        outSISIDXREG(SISSR, 0x28, 0x5a);
+ 
+                 outSISIDXREG(SISSR, 0x29, 0x64);
+@@ -3967,6 +4362,7 @@ int __init sisfb_init(void)
+ 		   case SIS_550:
+ 		   case SIS_650:
+ 		   case SIS_740:
++		   case SIS_660:
+ 			sishw_ext.bIntegratedMMEnabled = TRUE;
+ 			break;
+ 		   default:
+@@ -4006,13 +4402,45 @@ int __init sisfb_init(void)
+ 	sishw_ext.pQueryNorthBridgeSpace = &sisfb_query_north_bridge_space;
+ 	strcpy(sishw_ext.szVBIOSVer, "0.84");
+ 
+-	/* TW: Mode numbers for 1280x960 are different for 300 and 310/325 series */
++        /* Find systems for special custom timing */
++	if(sishw_ext.UseROM) {
++	   int i=0,j;
++	   unsigned char *biosver = sishw_ext.pjVirtualRomBase + 0x06;
++           unsigned char *biosdate = sishw_ext.pjVirtualRomBase + 0x2c;
++	   BOOLEAN footprint;
++           do {
++	      if( (mycustomttable[i].chipID == ivideo.chip) &&
++	          (!strncmp(mycustomttable[i].biosversion, biosver, strlen(mycustomttable[i].biosversion))) &&
++	          (!strncmp(mycustomttable[i].biosdate, biosdate, strlen(mycustomttable[i].biosdate))) ) {
++		 footprint = TRUE;
++	         for(j=0; j<5; j++) {
++	           if(mycustomttable[i].biosFootprintAddr[j]) {
++	              if(sishw_ext.pjVirtualRomBase[mycustomttable[i].biosFootprintAddr[j]] !=
++		      		mycustomttable[i].biosFootprintData[j])
++		         footprint = FALSE;
++		   }
++	         }
++	         if(footprint) {
++	 	    SiS_Pr.SiS_CustomT = mycustomttable[i].SpecialID;
++		    printk(KERN_DEBUG "sisfb: Identified [%s %s] for non-standard timing\n",
++		        mycustomttable[i].vendorName,
++			mycustomttable[i].cardName);
++	            break;
++                 }
++	      }
++              i++;
++           } while(mycustomttable[i].chipID);
++	}
++
++#ifdef CONFIG_FB_SIS_300
++	/* TW: Mode numbers for 1280x768 are different for 300 and 315 series */
+ 	if(sisvga_engine == SIS_300_VGA) {
+-		sisbios_mode[MODEINDEX_1280x960].mode_no = 0x6e;
+-		sisbios_mode[MODEINDEX_1280x960+1].mode_no = 0x6f;
+-		sisbios_mode[MODEINDEX_1280x960+2].mode_no = 0x7b;
+-		sisbios_mode[MODEINDEX_1280x960+3].mode_no = 0x7b;
++		sisbios_mode[MODEINDEX_1280x768].mode_no = 0x55;
++		sisbios_mode[MODEINDEX_1280x768+1].mode_no = 0x5a;
++		sisbios_mode[MODEINDEX_1280x768+2].mode_no = 0x5b;
++		sisbios_mode[MODEINDEX_1280x768+3].mode_no = 0x5b;
+ 	}
++#endif
+ 
+ 	sishw_ext.pSR = vmalloc(sizeof(SIS_DSReg) * SR_BUFFER_SIZE);
+ 	if (sishw_ext.pSR == NULL) {
+@@ -4167,121 +4595,54 @@ int __init sisfb_init(void)
+ 	}
+ 
+ 	ivideo.mtrr = (unsigned int) 0;
++	
++	ivideo.vbflags = 0;
+ 
+ 	if((sisfb_mode_idx < 0) || ((sisbios_mode[sisfb_mode_idx].mode_no) != 0xFF)) { 
+-
+-#ifdef CONFIG_FB_SIS_300
+-		if (sisvga_engine == SIS_300_VGA) {
+-			sisfb_get_VB_type_300();
+-		}
+-#endif
+-
+-#ifdef CONFIG_FB_SIS_315
+-		if (sisvga_engine == SIS_315_VGA) {
+-			sisfb_get_VB_type_315();
+-		}
+-#endif
+-
++	
+ 		sishw_ext.ujVBChipID = VB_CHIP_UNKNOWN;
+ 		sishw_ext.Is301BDH = FALSE;
+ 		sishw_ext.usExternalChip = 0;
+-
+-		switch (ivideo.hasVB) {
+-
+-		case HASVB_301:
+-		        inSISIDXREG(SISPART4, 0x01, reg);
+-			if (reg >= 0xE0) {
+-				sishw_ext.ujVBChipID = VB_CHIP_302LV;
+-				printk(KERN_INFO "sisfb: SiS302LV bridge detected (revision 0x%02x)\n",reg);
+-	  		} else if (reg >= 0xD0) {
+-				sishw_ext.ujVBChipID = VB_CHIP_301LV;
+-				printk(KERN_INFO "sisfb: SiS301LV bridge detected (revision 0x%02x)\n",reg);
+-	  		} else if (reg >= 0xB0) {
+-				sishw_ext.ujVBChipID = VB_CHIP_301B;
+-				inSISIDXREG(SISPART4,0x23,reg1);
+-				if(!(reg1 & 0x02)) sishw_ext.Is301BDH = TRUE;
+-				printk(KERN_INFO "sisfb: SiS301B%s bridge detected (revision 0x%02x)\n",
+-					(sishw_ext.Is301BDH ? "-DH" : ""), reg);
+-			} else {
+-				sishw_ext.ujVBChipID = VB_CHIP_301;
+-				printk(KERN_INFO "sisfb: SiS301 bridge detected\n");
+-			}
+-			break;
+-		case HASVB_302:
+-		        inSISIDXREG(SISPART4, 0x01, reg);
+-			if (reg >= 0xE0) {
+-				sishw_ext.ujVBChipID = VB_CHIP_302LV;
+-				printk(KERN_INFO "sisfb: SiS302LV bridge detected (revision 0x%02x)\n",reg);
+-	  		} else if (reg >= 0xD0) {
+-				sishw_ext.ujVBChipID = VB_CHIP_301LV;
+-				printk(KERN_INFO "sisfb: SiS302LV bridge detected (revision 0x%02x)\n",reg);
+-	  		} else if (reg >= 0xB0) {
+-				inSISIDXREG(SISPART4,0x23,reg1);
+-				if(!(reg1 & 0x02)) sishw_ext.Is301BDH = TRUE;
+-			        sishw_ext.ujVBChipID = VB_CHIP_302B;
+-				printk(KERN_INFO "sisfb: SiS302B%s bridge detected (revision 0x%02x)\n",
+-					(sishw_ext.Is301BDH ? "-DH" : ""), reg);
+-			} else {
+-			        sishw_ext.ujVBChipID = VB_CHIP_302;
+-				printk(KERN_INFO "sisfb: SiS302 bridge detected\n");
+-			}
+-			break;
+-		case HASVB_LVDS:
+-			sishw_ext.usExternalChip = 0x1;
+-			printk(KERN_INFO "sisfb: LVDS transmitter detected\n");
+-			break;
+-		case HASVB_TRUMPION:
+-			sishw_ext.usExternalChip = 0x2;
+-			printk(KERN_INFO "sisfb: Trumpion Zurac LVDS scaler detected\n");
+-			break;
+-		case HASVB_CHRONTEL:
+-			sishw_ext.usExternalChip = 0x4;
+-			printk(KERN_INFO "sisfb: Chrontel TV encoder detected\n");
+-			break;
+-		case HASVB_LVDS_CHRONTEL:
+-			sishw_ext.usExternalChip = 0x5;
+-			printk(KERN_INFO "sisfb: LVDS transmitter and Chrontel TV encoder detected\n");
+-			break;
+-		default:
+-			printk(KERN_INFO "sisfb: No or unknown bridge type detected\n");
+-			break;
+-		}
+-
+-		if (ivideo.hasVB != HASVB_NONE) {
+-#ifdef CONFIG_FB_SIS_300
+-		      if (sisvga_engine == SIS_300_VGA) {
+-				sisfb_detect_VB_connect_300();
+-                      }
+-#endif
+-#ifdef CONFIG_FB_SIS_315
+-		      if (sisvga_engine == SIS_315_VGA) {
+-				sisfb_detect_VB_connect_315();
+-                      }
+-#endif
++	
++		sisfb_get_VB_type();
++		
++		if(ivideo.vbflags & VB_VIDEOBRIDGE) {
++			sisfb_detect_VB_connect();
+ 		}
+-
+-		if (ivideo.disp_state & DISPTYPE_DISP2) {
+-			if (sisfb_crt1off)
+-				ivideo.disp_state |= DISPMODE_SINGLE;
+-			else
+-				ivideo.disp_state |= (DISPMODE_MIRROR | DISPTYPE_CRT1);
+-		} else {
+-			ivideo.disp_state = DISPMODE_SINGLE | DISPTYPE_CRT1;
++		
++		ivideo.currentvbflags = ivideo.vbflags & VB_VIDEOBRIDGE;
++		
++		if(ivideo.vbflags & VB_VIDEOBRIDGE) {
++		   if(sisfb_crt2type != -1) {
++		      if((sisfb_crt2type == CRT2_LCD) && (ivideo.vbflags & CRT2_LCD)) {
++		         ivideo.currentvbflags |= CRT2_LCD;
++		      } else if(sisfb_crt2type != CRT2_LCD) {
++		         ivideo.currentvbflags |= sisfb_crt2type;
++		      }
++		   } else {
++		      /* Chrontel 700x TV detection often unreliable, therefore use a
++		       * different default order on such machines
++		       */
++		      if((sisvga_engine == SIS_300_VGA) && (ivideo.vbflags & VB_CHRONTEL)) {
++		         if(ivideo.vbflags & CRT2_LCD)      ivideo.currentvbflags |= CRT2_LCD;
++		         else if(ivideo.vbflags & CRT2_TV)  ivideo.currentvbflags |= CRT2_TV;
++		         else if(ivideo.vbflags & CRT2_VGA) ivideo.currentvbflags |= CRT2_VGA;
++		      } else {
++		         if(ivideo.vbflags & CRT2_TV)       ivideo.currentvbflags |= CRT2_TV;
++		         else if(ivideo.vbflags & CRT2_LCD) ivideo.currentvbflags |= CRT2_LCD;
++		         else if(ivideo.vbflags & CRT2_VGA) ivideo.currentvbflags |= CRT2_VGA;
++		      }
++		   }
+ 		}
+ 
+-		if (ivideo.disp_state & DISPTYPE_LCD) {
+-		    if (!enable_dstn) {
+-		        inSISIDXREG(SISCR, IND_SIS_LCD_PANEL, reg);
+-			reg &= 0x0f;
+-			if (sisvga_engine == SIS_300_VGA) {
+-			    sishw_ext.ulCRT2LCDType = sis300paneltype[reg];
+-			} else {
+-			    sishw_ext.ulCRT2LCDType = sis310paneltype[reg];
+-			}
+-		    } else {
+-		        /* TW: FSTN/DSTN */
+-			sishw_ext.ulCRT2LCDType = LCD_320x480;
+-		    }
++		if(ivideo.vbflags & CRT2_LCD) {
++		   inSISIDXREG(SISCR, IND_SIS_LCD_PANEL, reg);
++		   reg &= 0x0f;
++		   if(sisvga_engine == SIS_300_VGA) {
++		      sishw_ext.ulCRT2LCDType = sis300paneltype[reg];
++		   } else {
++		      sishw_ext.ulCRT2LCDType = sis310paneltype[reg];
++		   }
+ 		}
+ 		
+ 		sisfb_detectedpdc = 0;
+@@ -4289,9 +4650,7 @@ int __init sisfb_init(void)
+ #ifdef CONFIG_FB_SIS_300
+                 /* TW: Save the current PanelDelayCompensation if the LCD is currently used */
+ 		if(sisvga_engine == SIS_300_VGA) {
+-	          if((sishw_ext.usExternalChip == 0x01) ||   /* LVDS */
+-		     (sishw_ext.usExternalChip == 0x05) ||   /* LVDS+Chrontel */
+-		     (sishw_ext.Is301BDH)) {		     /* 301B-DH */
++	          if(ivideo.vbflags & (VB_LVDS | VB_30xBDH)) {
+ 		       int tmp;
+ 		       inSISIDXREG(SISCR,0x30,tmp);
+ 		       if(tmp & 0x20) {
+@@ -4320,54 +4679,57 @@ int __init sisfb_init(void)
+ #ifdef CONFIG_FB_SIS_315
+                 /* TW: Try to find about LCDA */
+ 		if(sisvga_engine == SIS_315_VGA) {
+-	          if((sishw_ext.ujVBChipID == VB_CHIP_302B) ||
+-		     (sishw_ext.ujVBChipID == VB_CHIP_301LV) ||
+-		     (sishw_ext.ujVBChipID == VB_CHIP_302LV)) {
+-		       int tmp;
+-		       inSISIDXREG(SISCR,0x34,tmp);
+-		       if(tmp <= 0x13) {	
+-		          /* Currently on LCDA? (Some BIOSes leave CR38) */
+-		          inSISIDXREG(SISCR,0x38,tmp);
+-			  if((tmp & 0x03) == 0x03) {
+-			     SiS_Pr.SiS_UseLCDA = TRUE;
+-			  } else {
+-			     /* Currently on LCDA? (Some newer BIOSes set D0 in CR35) */
+-			     inSISIDXREG(SISCR,0x35,tmp);
+-			     if(tmp & 0x01) {
+-			        SiS_Pr.SiS_UseLCDA = TRUE;
+-			     } else {
+-			        /* Currently on LCD? If so, we can find out 
+-				   by peeking the mode register 
+-				 */
+-			        inSISIDXREG(SISCR,0x30,tmp);
+-			        if(tmp & 0x20) {
+-			           inSISIDXREG(SISPART1,0x13,tmp);
+-				   if(tmp & 0x04) {
+-				      SiS_Pr.SiS_UseLCDA = TRUE;
+-				   }
+-			        }
+-			     }
+-			  }
+-		       } 
+-		       if(SiS_Pr.SiS_UseLCDA) {
+-		          sisfb_detectedlcda = 0x03;
+-		          printk(KERN_INFO
+-			         "sisfb: Bridge uses LCDA for low resolution and text modes\n");
+-		       }
++		   if(ivideo.vbflags & (VB_302B | VB_301LV | VB_302LV)) {
++		      int tmp;
++		      inSISIDXREG(SISCR,0x34,tmp);
++		      if((tmp <= 0x13) || (tmp == 0xff)) {
++		         /* Currently on LCDA? (Some BIOSes leave CR38) */
++		         inSISIDXREG(SISCR,0x38,tmp);
++			 if((tmp & 0x03) == 0x03)  SiS_Pr.SiS_UseLCDA = TRUE;
++			 else {
++			    /* Currently on LCDA? (Some newer BIOSes set D0 in CR35) */
++			    inSISIDXREG(SISCR,0x35,tmp);
++			    if(tmp & 0x01) SiS_Pr.SiS_UseLCDA = TRUE;
++			    else {
++			       /* Currently on LCD? If so, we can find out
++			        * by peeking the mode register
++				*/
++			       inSISIDXREG(SISCR,0x30,tmp);
++			       if(tmp & 0x20) {
++			          inSISIDXREG(SISPART1,0x13,tmp);
++				  if(tmp & 0x04) SiS_Pr.SiS_UseLCDA = TRUE;
++			       }
++			    }
++			 }
++		      }
++		      if(SiS_Pr.SiS_UseLCDA) {
++		         sisfb_detectedlcda = 0x03;
++		         printk(KERN_INFO
++			        "sisfb: Bridge uses LCDA for low resolution and text modes\n");
++		      }
+ 	          }
+ 		}
+ #endif
+ #endif
+ 
++		if (!sisfb_crt1off) {
++		   	sisfb_handle_ddc(&sisfb_thismonitor, 0);
++		} else {
++		   	if ((ivideo.vbflags & (VB_301|VB_301B|VB_302B)) &&
++		      	    (ivideo.vbflags & (CRT2_VGA | CRT2_LCD))) {
++		      		sisfb_handle_ddc(&sisfb_thismonitor, 1);
++		   	}
++		}
++
+ 		if (sisfb_mode_idx >= 0)
+-			sisfb_mode_idx = sisfb_validate_mode(sisfb_mode_idx);
++			sisfb_mode_idx = sisfb_validate_mode(sisfb_mode_idx, ivideo.currentvbflags);
+ 
+ 		if (sisfb_mode_idx < 0) {
+-			switch (ivideo.disp_state & DISPTYPE_DISP2) {
+-			   case DISPTYPE_LCD:
++			switch (ivideo.currentvbflags & VB_DISPTYPE_DISP2) {
++			   case CRT2_LCD:
+ 				sisfb_mode_idx = DEFAULT_LCDMODE;
+ 				break;
+-			   case DISPTYPE_TV:
++			   case CRT2_TV:
+ 				sisfb_mode_idx = DEFAULT_TVMODE;
+ 				break;
+ 			   default:
+@@ -4379,39 +4741,27 @@ int __init sisfb_init(void)
+ 		sisfb_mode_no = sisbios_mode[sisfb_mode_idx].mode_no;
+ 
+ 		if (ivideo.refresh_rate != 0)
+-			sisfb_search_refresh_rate(ivideo.refresh_rate);
++			sisfb_search_refresh_rate(ivideo.refresh_rate, sisfb_mode_idx);
+ 
+ 		if (sisfb_rate_idx == 0) {
+ 			sisfb_rate_idx = sisbios_mode[sisfb_mode_idx].rate_idx;
+ 			ivideo.refresh_rate = 60;
+ 		}
+ 
++		if (sisfb_thismonitor.datavalid) {
++			if(!sisfb_verify_rate(&sisfb_thismonitor, sisfb_mode_idx,
++			                      sisfb_rate_idx, ivideo.refresh_rate)) {
++				printk(KERN_INFO "sisfb: WARNING: Refresh rate exceeds monitor specs!\n");
++			}
++		}
++
+ 		ivideo.video_bpp = sisbios_mode[sisfb_mode_idx].bpp;
+ 		ivideo.video_vwidth = ivideo.video_width = sisbios_mode[sisfb_mode_idx].xres;
+ 		ivideo.video_vheight = ivideo.video_height = sisbios_mode[sisfb_mode_idx].yres;
+ 		ivideo.org_x = ivideo.org_y = 0;
+ 		ivideo.video_linelength = ivideo.video_width * (ivideo.video_bpp >> 3);
+-		switch(ivideo.video_bpp) {
+-        	case 8:
+-            		ivideo.DstColor = 0x0000;
+-	    		ivideo.SiS310_AccelDepth = 0x00000000;
+-			ivideo.video_cmap_len = 256;
+-            		break;
+-        	case 16:
+-            		ivideo.DstColor = 0x8000;
+-            		ivideo.SiS310_AccelDepth = 0x00010000;
+-			ivideo.video_cmap_len = 16;
+-            		break;
+-        	case 32:
+-            		ivideo.DstColor = 0xC000;
+-	    		ivideo.SiS310_AccelDepth = 0x00020000;
+-			ivideo.video_cmap_len = 16;
+-            		break;
+-		default:
+-			ivideo.video_cmap_len = 16;
+-		        printk(KERN_INFO "sisfb: Unsupported depth %d", ivideo.video_bpp);
+-			break;
+-    		}
++		
++		sisfb_set_vparms();
+ 		
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)	
+ 
+@@ -4424,23 +4774,45 @@ int __init sisfb_init(void)
+ 		sisfb_pre_setmode();
+ 
+ 		if (SiSSetMode(&SiS_Pr, &sishw_ext, sisfb_mode_no) == 0) {
+-			printk(KERN_ERR "sisfb: Setting mode[0x%x] failed, using default mode\n", 
++			printk(KERN_ERR "sisfb: Fatal error: Setting mode[0x%x] failed\n",
+ 				sisfb_mode_no);
+-			return -1;
++			vfree(sishw_ext.pSR);
++			vfree(sishw_ext.pCR);
++			release_mem_region(ivideo.video_base, ivideo.video_size);
++			release_mem_region(ivideo.mmio_base, sisfb_mmio_size);
++			return -EINVAL;
+ 		}
+ 
+ 		outSISIDXREG(SISSR, IND_SIS_PASSWORD, SIS_PASSWORD);
+ 
+ 		sisfb_post_setmode();
++		
++		ivideo.accel = 0;
++		if(sisfb_accel) {
++		   ivideo.accel = -1;
++		   default_var.accel_flags |= FB_ACCELF_TEXT;
++		   sisfb_initaccel();
++		}
+ 
+ 		sisfb_crtc_to_var(&default_var);
+ 		
++		sis_fb_info.node = -1;
++		sis_fb_info.flags = FBINFO_FLAG_DEFAULT;
++		sis_fb_info.blank = &sisfb_blank;
++		sis_fb_info.fbops = &sisfb_ops;
++		sis_fb_info.switch_con = &sisfb_switch;
++		sis_fb_info.updatevar = &sisfb_update_var;
++		sis_fb_info.changevar = NULL;
++		sis_fb_info.disp = &sis_disp;
++			
++		sisfb_set_disp(-1, &default_var, &sis_fb_info);
++		
+ #else		/* --------- For 2.5: Setup a somewhat sane default var ------------ */
+ 
+ 		printk(KERN_INFO "sisfb: Default mode is %dx%dx%d (%dHz)\n",
+ 	       		ivideo.video_width, ivideo.video_height, ivideo.video_bpp,
+ 			ivideo.refresh_rate);
+-			
++
+ 		default_var.xres = default_var.xres_virtual = ivideo.video_width;
+ 		default_var.yres = default_var.yres_virtual = ivideo.video_height;
+ 		default_var.bits_per_pixel = ivideo.video_bpp;
+@@ -4457,50 +4829,26 @@ int __init sisfb_init(void)
+ 			 &default_var.upper_margin, &default_var.lower_margin,
+ 			 &default_var.hsync_len, &default_var.vsync_len,
+ 			 &default_var.sync, &default_var.vmode)) {
+-			 
+-		   if((default_var.vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) {
+-		      default_var.yres <<= 1;
+-		      default_var.yres_virtual <<= 1;
+-		   } else if((default_var.vmode	& FB_VMODE_MASK) == FB_VMODE_DOUBLE) {
+-		      default_var.pixclock >>= 1;
+-		      default_var.yres >>= 1;
+-		      default_var.yres_virtual >>= 1;
+-		   }
+-		   
++			if((default_var.vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) {
++				default_var.pixclock <<= 1;
++	   		}
+ 	        }
+-#ifdef SISFB_PAN
+-		if(sisfb_ypan) {
+-	    		default_var.yres_virtual = 
+-				ivideo.heapstart / (default_var.xres * (default_var.bits_per_pixel >> 3));
+-	    		if(default_var.yres_virtual <= default_var.yres) {
+-	        		default_var.yres_virtual = default_var.yres;
+-	    		}
+-		} 
+-#endif
+ 		
+-#endif
+-
+ 		ivideo.accel = 0;
+ 		if(sisfb_accel) {
+ 		   ivideo.accel = -1;
+ 		   default_var.accel_flags |= FB_ACCELF_TEXT;
+ 		   sisfb_initaccel();
+ 		}
++		
++		if(sisfb_ypan) {
++	    		default_var.yres_virtual = 
++				ivideo.heapstart / (default_var.xres * (default_var.bits_per_pixel >> 3));
++	    		if(default_var.yres_virtual <= default_var.yres) {
++	        		default_var.yres_virtual = default_var.yres;
++	    		}
++		} 
+ 
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)		/* ---- 2.4 series init ---- */
+-		sis_fb_info.node = -1;
+-		sis_fb_info.flags = FBINFO_FLAG_DEFAULT;
+-		sis_fb_info.blank = &sisfb_blank;
+-		sis_fb_info.fbops = &sisfb_ops;
+-		sis_fb_info.switch_con = &sisfb_switch;
+-		sis_fb_info.updatevar = &sisfb_update_var;
+-		sis_fb_info.changevar = NULL;
+-		sis_fb_info.disp = &sis_disp;
+-			
+-		sisfb_set_disp(-1, &default_var, &sis_fb_info);
+-#endif
+-
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)		/* ---- 2.5 series init ---- */
+ 		sis_fb_info.flags = FBINFO_FLAG_DEFAULT;
+ 		sis_fb_info.var = default_var;
+ 		sis_fb_info.fix = sisfb_fix;
+@@ -4513,6 +4861,8 @@ int __init sisfb_init(void)
+ 		fb_alloc_cmap(&sis_fb_info.cmap, 256 , 0);
+ #endif
+ 
++		printk(KERN_INFO "sisfb: Initial vbflags 0x%lx\n", ivideo.vbflags);
++
+ #ifdef CONFIG_MTRR
+ 		ivideo.mtrr = mtrr_add((unsigned int) ivideo.video_base,
+ 				(unsigned int) ivideo.video_size,
+@@ -4526,11 +4876,17 @@ int __init sisfb_init(void)
+ 		vc_resize_con(1, 1, 0);
+ #endif
+ 
+-		TWDEBUG("Before calling register_framebuffer");
+-		
+-		if(register_framebuffer(&sis_fb_info) < 0)
++		if(register_framebuffer(&sis_fb_info) < 0) {
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
++			vfree(sishw_ext.pSR);
++			vfree(sishw_ext.pCR);
++			release_mem_region(ivideo.video_base, ivideo.video_size);
++			release_mem_region(ivideo.mmio_base, sisfb_mmio_size);
++#endif
++			printk(KERN_ERR "sisfb: Fatal error: Failed to register framebuffer\n");
+ 			return -EINVAL;
+-			
++		}
++
+ 		sisfb_registered = 1;			
+ 
+ 		printk(KERN_INFO "sisfb: Installed SISFB_GET_INFO ioctl (%x)\n", SISFB_GET_INFO);
+@@ -4547,9 +4903,11 @@ int __init sisfb_init(void)
+ 
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+ 		printk(KERN_INFO "fb%d: %s frame buffer device, Version %d.%d.%02d\n",
+-	       		sis_fb_info.node, myid, VER_MAJOR, VER_MINOR, VER_LEVEL);			     
++	       		sis_fb_info.node, myid, VER_MAJOR, VER_MINOR, VER_LEVEL);
+ #endif
+ 
++		printk(KERN_INFO "sisfb: (C) 2001-2003 Thomas Winischhofer. All rights reserved.\n");
++
+ 	}	/* TW: if mode = "none" */
+ 	return 0;
+ }
+@@ -4562,7 +4920,6 @@ static int          vesa = -1;
+ static unsigned int rate = 0;
+ static unsigned int crt1off = 1;
+ static unsigned int mem = 0;
+-static unsigned int dstn = 0;
+ static char         *forcecrt2type = NULL;
+ static int          forcecrt1 = -1;
+ static char         *queuemode = NULL;
+@@ -4575,25 +4932,31 @@ static int          inverse = 0;
+ static int          userom = 1;
+ static int          useoem = -1;
+ static char         *tvstandard = NULL;
++static int	    nocrt2rate = 0;
+ 
+-MODULE_DESCRIPTION("SiS 300/540/630/730/315/550/650/740/330 framebuffer driver");
++MODULE_DESCRIPTION("SiS 300/540/630/730/315/550/650/740/330/660 framebuffer driver");
+ MODULE_LICENSE("GPL");
+-MODULE_AUTHOR("SiS; Thomas Winischhofer <thomas@winischhofer.net>; Various others");
++MODULE_AUTHOR("Thomas Winischhofer <thomas@winischhofer.net>; SiS; Various others");
+ 
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+ MODULE_PARM(mode, "s");
+ MODULE_PARM_DESC(mode,
+        "\nSelects the desired display mode in the format [X]x[Y]x[Depth], eg.\n"
+-         "800x600x16 (default: none if sisfb is a module; this leaves the\n"
+-	 "console untouched and the driver will only do the video memory\n"
+-	 "management for eg. DRM/DRI; 800x600x8 if sisfb is in the kernel)");
++         "1024x768x16. Other formats supported include XxY-Depth and\n"
++	 "XxY-Depth@Rate. If the parameter is only one (decimal or hexadecimal)\n"
++	 "number, it will be interpreted as a VESA mode number. (default: none if\n"
++	 "sisfb is a module; this leaves the console untouched and the driver will\n"
++	 "only do the video memory management for eg. DRM/DRI; 800x600x8 if sisfb\n"
++	 "is in the kernel)");
+ #endif
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)	 
+ MODULE_PARM(mode, "s");
+ MODULE_PARM_DESC(mode,
+-       "\nSelects the desired default display mode in the format [X]x[Y]x[Depth],\n"
+-         "eg. 1024x768x16 (default: 800x600x8)");
+-#endif	 
++       "\nSelects the desired default display mode in the format XxYxDepth,\n"
++         "eg. 1024x768x16. Other formats supported include XxY-Depth and\n"
++	 "XxY-Depth@Rate. If the parameter is only one (decimal or hexadecimal)\n"
++	 "number, it will be interpreted as a VESA mode number. (default: 800x600x8)");
++#endif
+ 
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+ MODULE_PARM(vesa, "i");
+@@ -4603,17 +4966,18 @@ MODULE_PARM_DESC(vesa,
+ 	 "and the driver will only do the video memory management for eg. DRM/DRI;\n"
+ 	 "0x0103 if sisfb is in the kernel)");
+ #endif
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)	 
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+ MODULE_PARM(vesa, "i");
+ MODULE_PARM_DESC(vesa,
+        "\nSelects the desired default display mode by VESA defined mode number, eg.\n"
+          "0x117 (default: 0x0103)");
+-#endif	 
++#endif
+ 
+ MODULE_PARM(rate, "i");
+ MODULE_PARM_DESC(rate,
+ 	"\nSelects the desired vertical refresh rate for CRT1 (external VGA) in Hz.\n"
+-	"(default: 60)");
++	  "If the mode is specified in the format XxY-Depth@Rate, this parameter\n"
++	  "will be ignored (default: 60)");
+ 
+ MODULE_PARM(crt1off,   "i");
+ MODULE_PARM_DESC(crt1off,
+@@ -4624,14 +4988,9 @@ MODULE_PARM_DESC(filter,
+ 	"\nSelects TV flicker filter type (only for systems with a SiS301 video bridge).\n"
+ 	  "(Possible values 0-7, default: [no filter])");
+ 
+-MODULE_PARM(dstn,   "i");
+-MODULE_PARM_DESC(dstn,
+-	"\nSelects DSTN/FSTN display mode for SiS550. This sets CRT2 type to LCD and\n"
+-	  "overrides forcecrt2type setting. (1=ON, 0=OFF) (default: 0)");
+-
+ MODULE_PARM(queuemode,   "s");
+ MODULE_PARM_DESC(queuemode,
+-	"\nSelects the queue mode on 315/550/650/740/330. Possible choices are AGP, VRAM or\n"
++	"\nSelects the queue mode on 315/550/650/740/330/660. Possible choices are AGP, VRAM,\n"
+   	  "MMIO. AGP is only available if the kernel has AGP support. The queue mode is\n"
+ 	  "important to programs using the 2D/3D accelerator of the SiS chip. The modes\n"
+ 	  "require a totally different way of programming the engines. If any mode than\n"
+@@ -4673,56 +5032,61 @@ MODULE_PARM_DESC(pdc,
+ MODULE_PARM(noaccel, "i");
+ MODULE_PARM_DESC(noaccel,
+         "\nIf set to anything other than 0, 2D acceleration and y-panning will be\n"
+-	"disabled. (default: 0)");
++	  "disabled. (default: 0)");
+ 
+ MODULE_PARM(noypan, "i");
+ MODULE_PARM_DESC(noypan,
+         "\nIf set to anything other than 0, y-panning will be disabled and scrolling\n"
+-	"will be performed by redrawing the screen. This required 2D acceleration, so\n"
+-	"if the option noaccel is set, y-panning will be disabled. (default: 0)");
++ 	  "will be performed by redrawing the screen. This required 2D acceleration, so\n"
++	  "if the option noaccel is set, y-panning will be disabled. (default: 0)");
+ 
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)	
+ MODULE_PARM(inverse, "i");
+ MODULE_PARM_DESC(inverse,
+         "\nSetting this to anything but 0 should invert the display colors, but this\n"
+-	"does not seem to work. (default: 0)");
++	  "does not seem to work. (default: 0)");
+ #endif	
+ 
+ MODULE_PARM(userom, "i");
+ MODULE_PARM_DESC(userom,
+         "\nSetting this to 0 keeps sisfb from using the video BIOS data which is needed\n"
+-	"for some LCD and TV setup. (default: 1)");
++	  "for some LCD and TV setup. (default: 1)");
+ 
+ MODULE_PARM(useoem, "i");
+ MODULE_PARM_DESC(useoem,
+         "\nSetting this to 0 keeps sisfb from using its internel OEM data for some LCD\n"
+-	"panels and TV connector types. (default: auto)");
++	  "panels and TV connector types. (default: auto)");
+ 
+ MODULE_PARM(tvstandard, "s");
+ MODULE_PARM_DESC(tvstandard,
+ 	"\nThis allows overriding the BIOS default for the TV standard. Valid choices are\n"
+-	"pal and ntsc. (default: auto)");
++	  "pal and ntsc. (default: auto)");
+ 
++MODULE_PARM(nocrt2rate, "i");
++MODULE_PARM_DESC(nocrt2rate,
++	"\nSetting this to 1 will force the driver to use the default refresh rate for\n"
++	  "CRT2 if CRT2 type is VGA. (default: 0, use same rate as crt1)");
++	
+ int init_module(void)
+ {
+ 	int err;
+-	
++
++	ivideo.refresh_rate = sisfb_parm_rate = rate;
++
+ 	if(mode)
+-		sisfb_search_mode(mode);
++		sisfb_search_mode(mode, FALSE);
+ 	else if(vesa != -1)
+-		sisfb_search_vesamode(vesa);
+-	else  
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)	
++		sisfb_search_vesamode(vesa, FALSE);
++	else
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+ 		/* For 2.4, set mode=none if no mode is given  */
+ 		sisfb_mode_idx = MODE_INDEX_NONE;
+ #endif
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+-		/* For 2.5, we don't need this "mode=none" stuff anymore */	
++		/* For 2.5, we don't need this "mode=none" stuff anymore */
+ 		sisfb_mode_idx = DEFAULT_MODE;
+ #endif
+ 
+-	ivideo.refresh_rate = rate;
+-
+ 	if(forcecrt2type)
+ 		sisfb_search_crt2type(forcecrt2type);
+ 
+@@ -4745,9 +5109,6 @@ int init_module(void)
+ 
+ 	if(noypan == 1)       sisfb_ypan = 0;
+ 	else if(noypan == 0)  sisfb_ypan = 1;
+-
+-	/* TW: Panning only with acceleration */
+-	if(sisfb_accel == 0)  sisfb_ypan = 0;
+ 	
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+ 	if(inverse)           sisfb_inverse = 1;
+@@ -4759,17 +5120,11 @@ int init_module(void)
+ 
+ 	sisfb_useoem = useoem;
+ 
+-	enable_dstn = dstn;
+-
+-	/* TW: DSTN overrules forcecrt2type */
+-	if (enable_dstn)      sisfb_crt2type = DISPTYPE_LCD;
+-
+ 	if (queuemode)        sisfb_search_queuemode(queuemode);
+ 	
+ 	/* TW: If other queuemode than MMIO, disable 2D accel and ypan */
+ 	if((sisfb_queuemode != -1) && (sisfb_queuemode != MMIO_CMD)) {
+ 	        sisfb_accel = 0;
+-		sisfb_ypan = 0;
+ 	}
+ 
+         if(pdc) {
+@@ -4777,6 +5132,8 @@ int init_module(void)
+ 	        sisfb_pdc = pdc & 0x3c;
+ 	   }
+ 	}
++	
++	sisfb_nocrt2rate = nocrt2rate;
+ 
+ 	if((err = sisfb_init()) < 0) return err;
+ 
+@@ -4788,7 +5145,7 @@ void cleanup_module(void)
+ 	/* TW: Release mem regions */
+ 	release_mem_region(ivideo.video_base, ivideo.video_size);
+ 	release_mem_region(ivideo.mmio_base, sisfb_mmio_size);
+-	
++
+ #ifdef CONFIG_MTRR
+ 	/* TW: Release MTRR region */
+ 	if(ivideo.mtrr) {
+@@ -4802,11 +5159,17 @@ void cleanup_module(void)
+ 	if(sisfb_registered) {
+ 		unregister_framebuffer(&sis_fb_info);
+ 	}
+-	
++
+ 	if(sishw_ext.pSR) vfree(sishw_ext.pSR);
+ 	if(sishw_ext.pCR) vfree(sishw_ext.pCR);
+ 	
+-	/* TODO: Restore the initial mode */
++	/* TODO: Restore the initial mode 
++	 * This sounds easy but is as good as impossible
++	 * on many machines with SiS chip and video bridge
++	 * since text modes are always set up differently
++	 * from machine to machine. Depends on the type
++	 * of integration between chipset and bridge.
++	 */
+ 	
+ 	printk(KERN_INFO "sisfb: Module unloaded\n");
+ }
+--- linux-2.6.0-test1/drivers/video/sis/sis_main.h	2003-06-14 12:18:04.000000000 -0700
++++ 25/drivers/video/sis/sis_main.h	2003-07-19 17:04:55.000000000 -0700
+@@ -1,8 +1,6 @@
+ #ifndef _SISFB_MAIN
+ #define _SISFB_MAIN
+ 
+-/* Comments and changes marked with "TW" by Thomas Winischhofer <thomas@winischhofer.net> */
+-
+ #include "vstruct.h"
+ 
+ /* ------------------- Constant Definitions ------------------------- */
+@@ -14,11 +12,11 @@
+ 
+ #define VER_MAJOR                 1
+ #define VER_MINOR                 6
+-#define VER_LEVEL                 1
++#define VER_LEVEL                 11
+ 
+ #include "sis.h"
+ 
+-/* TW: To be included in pci_ids.h */
++/* To be included in pci_ids.h */
+ #ifndef PCI_DEVICE_ID_SI_650_VGA
+ #define PCI_DEVICE_ID_SI_650_VGA  0x6325
+ #endif
+@@ -31,6 +29,12 @@
+ #ifndef PCI_DEVICE_ID_SI_330
+ #define PCI_DEVICE_ID_SI_330      0x0330
+ #endif
++#ifndef PCI_DEVICE_ID_SI_660
++#define PCI_DEVICE_ID_SI_660      0x0660
++#endif
++#ifndef PCI_DEVICE_ID_SI_660_VGA
++#define PCI_DEVICE_ID_SI_660_VGA  0x6330
++#endif
+ 
+ /* To be included in fb.h */
+ #ifndef FB_ACCEL_SIS_GLAMOUR_2
+@@ -59,7 +63,6 @@
+ #define COMMAND_QUEUE_THRESHOLD   0x1F
+ #endif
+ 
+-/* TW */
+ #define HW_CURSOR_AREA_SIZE_315   0x4000  /* 16K */
+ #define HW_CURSOR_AREA_SIZE_300   0x1000  /* 4K */
+ 
+@@ -283,45 +286,43 @@
+ /* Fbcon variables */
+ static struct fb_info sis_fb_info;
+ 
+-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,
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)	
+-	.reserved	= {0, 0, 0, 0, 0, 0}
+-#endif	
++	.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}
++#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,
++	.xpanstep	= 0,
+ 	.ypanstep	= 1,
+ };
+ static char myid[20];
+@@ -347,26 +348,24 @@ static union {
+ } sis_fbcon_cmap;
+ 
+ static int sisfb_inverse = 0;
++static int currcon = 0;
+ #endif
+ 
+-/* display status */
++/* global flags */
+ static int sisfb_off = 0;
+ static int sisfb_crt1off = 0;
+ static int sisfb_forcecrt1 = -1;
+ static int sisvga_enabled = 0;
+ static int sisfb_userom = 1;
+ static int sisfb_useoem = -1;
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+-static int currcon = 0;
+-#endif
+-
+-/* global flags */
+-static int sisfb_registered;
+-static int sisfb_tvmode = 0;
++static int sisfb_parm_rate = -1;
++static int sisfb_registered = 0;
+ static int sisfb_mem = 0;
+ static int sisfb_pdc = 0;
+-static int enable_dstn = 0;
+ static int sisfb_ypan = -1;
++static int sisfb_nocrt2rate = 0;
++static int sisfb_dstn = 0;
++static int sisfb_fstn = 0;
+ 
+ VGA_ENGINE sisvga_engine = UNKNOWN_VGA;
+ int 	   sisfb_accel = -1;
+@@ -375,22 +374,22 @@ int 	   sisfb_accel = -1;
+ static int sisfb_hwcursor_size = 0;
+ static int sisfb_CRT2_write_enable = 0;
+ 
+-int sisfb_crt2type  = -1;	/* TW: CRT2 type (for overriding autodetection) */
+-int sisfb_tvplug    = -1;	/* PR: Tv plug type (for overriding autodetection) */
++int sisfb_crt2type  = -1;	/* CRT2 type (for overriding autodetection) */
++int sisfb_tvplug    = -1;	/* Tv plug type (for overriding autodetection) */
+ 
+-int sisfb_queuemode = -1; 	/* TW: Use MMIO queue mode by default (310/325 series only) */
++int sisfb_queuemode = -1; 	/* Use MMIO queue mode by default (315 series only) */
+ 
+ unsigned char sisfb_detectedpdc = 0;
+ 
+ unsigned char sisfb_detectedlcda = 0xff;
+ 
+-/* data for sis components */
++/* data for sis hardware ("par") */
+ struct video_info ivideo;
+ 
+-/* TW: For ioctl SISFB_GET_INFO */
++/* For ioctl SISFB_GET_INFO */
+ sisfb_info sisfbinfo;
+ 
+-/* TW: Hardware extension; contains data on hardware */
++/* Hardware extension; contains data on hardware */
+ HW_DEVICE_EXTENSION sishw_ext = {
+ 	NULL, NULL, FALSE, NULL, NULL,
+ 	0, 0, 0, 0, 0, 0, 0, 0, 0,
+@@ -399,10 +398,10 @@ HW_DEVICE_EXTENSION sishw_ext = {
+ 	0
+ };
+ 
+-/* TW: SiS private structure */
++/* SiS private structure */
+ SiS_Private  SiS_Pr;
+ 
+-/* card parameters */
++/* Card parameters */
+ static unsigned long sisfb_mmio_size = 0;
+ static u8            sisfb_caps = 0;
+ 
+@@ -412,7 +411,7 @@ typedef enum _SIS_CMDTYPE {
+ 	VM_CMD_QUEUE,
+ } SIS_CMDTYPE;
+ 
+-/* Supported SiS Chips list */
++/* List of supported chips */
+ static struct board {
+ 	u16 vendor, device;
+ 	const char *name;
+@@ -426,14 +425,15 @@ static struct board {
+ 	{PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_550_VGA, "SIS 550 VGA"},
+ 	{PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_650_VGA, "SIS 650/M650/651/740 VGA"},
+ 	{PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_330,     "SIS 330"},
++	{PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_660_VGA, "SIS 660 VGA"},
+ 	{0, 0, NULL}
+ };
+ 
+ #define MD_SIS300 1
+ #define MD_SIS315 2
+ 
+-/* mode table */
+-/* NOT const - will be patched for 1280x960 mode number chaos reasons */
++/* Mode table */
++/* NOT const - will be patched for 1280x768 mode number chaos reasons */
+ struct _sisbios_mode {
+ 	char name[15];
+ 	u8 mode_no;
+@@ -447,14 +447,33 @@ struct _sisbios_mode {
+ 	u16 rows;
+ 	u8  chipset;
+ } sisbios_mode[] = {
+-#define MODE_INDEX_NONE           0  /* TW: index for mode=none */
+-	{"none",         0xFF, 0x0000, 0x0000,    0,    0,  0, 0,   0,  0, MD_SIS300|MD_SIS315},  /* TW: for mode "none" */
+-	{"320x240x16",   0x56, 0x0000, 0x0000,  320,  240, 16, 1,  40, 15,           MD_SIS315},
+-	{"320x480x8",    0x5A, 0x0000, 0x0000,  320,  480,  8, 1,  40, 30,           MD_SIS315},  /* TW: FSTN */
+-	{"320x480x16",   0x5B, 0x0000, 0x0000,  320,  480, 16, 1,  40, 30,           MD_SIS315},  /* TW: FSTN */
+-	{"640x480x8",    0x2E, 0x0101, 0x0101,  640,  480,  8, 1,  80, 30, MD_SIS300|MD_SIS315},
++#define MODE_INDEX_NONE           0  /* index for mode=none */
++	{"none",         0xff, 0x0000, 0x0000,    0,    0,  0, 0,   0,  0, MD_SIS300|MD_SIS315},
++	{"320x200x8",    0x59, 0x0138, 0x0000,  320,  200,  8, 1,  40, 12, MD_SIS300|MD_SIS315},
++	{"320x200x16",   0x41, 0x010e, 0x0000,  320,  200, 16, 1,  40, 12, MD_SIS300|MD_SIS315},
++	{"320x200x24",   0x4f, 0x0000, 0x0000,  320,  200, 32, 1,  40, 12, MD_SIS300|MD_SIS315},  /* TW: That's for people who mix up color- and fb depth */
++	{"320x200x32",   0x4f, 0x0000, 0x0000,  320,  200, 32, 1,  40, 12, MD_SIS300|MD_SIS315},
++	{"320x240x8",    0x50, 0x0132, 0x0000,  320,  240,  8, 1,  40, 15, MD_SIS300|MD_SIS315},
++	{"320x240x16",   0x56, 0x0135, 0x0000,  320,  240, 16, 1,  40, 15, MD_SIS300|MD_SIS315},
++	{"320x240x24",   0x53, 0x0000, 0x0000,  320,  240, 32, 1,  40, 15, MD_SIS300|MD_SIS315},
++	{"320x240x32",   0x53, 0x0000, 0x0000,  320,  240, 32, 1,  40, 15, MD_SIS300|MD_SIS315},
++	{"320x240x8",    0x5a, 0x0132, 0x0000,  320,  480,  8, 1,  40, 30,           MD_SIS315},  /* TW: FSTN */
++	{"320x240x16",   0x5b, 0x0135, 0x0000,  320,  480, 16, 1,  40, 30,           MD_SIS315},  /* TW: FSTN */
++	{"400x300x8",    0x51, 0x0133, 0x0000,  400,  300,  8, 1,  50, 18, MD_SIS300|MD_SIS315},
++	{"400x300x16",   0x57, 0x0136, 0x0000,  400,  300, 16, 1,  50, 18, MD_SIS300|MD_SIS315},
++	{"400x300x24",   0x54, 0x0000, 0x0000,  400,  300, 32, 1,  50, 18, MD_SIS300|MD_SIS315},
++	{"400x300x32",   0x54, 0x0000, 0x0000,  400,  300, 32, 1,  50, 18, MD_SIS300|MD_SIS315},
++	{"512x384x8",    0x52, 0x0000, 0x0000,  512,  384,  8, 1,  64, 24, MD_SIS300|MD_SIS315},
++	{"512x384x16",   0x58, 0x0000, 0x0000,  512,  384, 16, 1,  64, 24, MD_SIS300|MD_SIS315},
++	{"512x384x24",   0x5c, 0x0000, 0x0000,  512,  384, 32, 1,  64, 24, MD_SIS300|MD_SIS315},
++	{"512x384x32",   0x5c, 0x0000, 0x0000,  512,  384, 32, 1,  64, 24, MD_SIS300|MD_SIS315},
++	{"640x400x8",    0x2f, 0x0000, 0x0000,  640,  400,  8, 1,  80, 25, MD_SIS300|MD_SIS315},
++	{"640x400x16",   0x5d, 0x0000, 0x0000,  640,  400, 16, 1,  80, 25, MD_SIS300|MD_SIS315},
++	{"640x400x24",   0x5e, 0x0000, 0x0000,  640,  400, 32, 1,  80, 25, MD_SIS300|MD_SIS315},
++	{"640x400x32",   0x5e, 0x0000, 0x0000,  640,  400, 32, 1,  80, 25, MD_SIS300|MD_SIS315},
++	{"640x480x8",    0x2e, 0x0101, 0x0101,  640,  480,  8, 1,  80, 30, MD_SIS300|MD_SIS315},
+ 	{"640x480x16",   0x44, 0x0111, 0x0111,  640,  480, 16, 1,  80, 30, MD_SIS300|MD_SIS315},
+-	{"640x480x24",   0x62, 0x013a, 0x0112,  640,  480, 32, 1,  80, 30, MD_SIS300|MD_SIS315},  /* TW: That's for people who mix up color- and fb depth */
++	{"640x480x24",   0x62, 0x013a, 0x0112,  640,  480, 32, 1,  80, 30, MD_SIS300|MD_SIS315},
+ 	{"640x480x32",   0x62, 0x013a, 0x0112,  640,  480, 32, 1,  80, 30, MD_SIS300|MD_SIS315},
+ 	{"720x480x8",    0x31, 0x0000, 0x0000,  720,  480,  8, 1,  90, 30, MD_SIS300|MD_SIS315},
+ 	{"720x480x16",   0x33, 0x0000, 0x0000,  720,  480, 16, 1,  90, 30, MD_SIS300|MD_SIS315},
+@@ -468,59 +487,79 @@ struct _sisbios_mode {
+ 	{"800x480x16",   0x7a, 0x0000, 0x0000,  800,  480, 16, 1, 100, 30, MD_SIS300|MD_SIS315},
+ 	{"800x480x24",   0x76, 0x0000, 0x0000,  800,  480, 32, 1, 100, 30, MD_SIS300|MD_SIS315},
+ 	{"800x480x32",   0x76, 0x0000, 0x0000,  800,  480, 32, 1, 100, 30, MD_SIS300|MD_SIS315},
+-#define DEFAULT_MODE              20 /* TW: index for 800x600x8 */
+-#define DEFAULT_LCDMODE           20 /* TW: index for 800x600x8 */
+-#define DEFAULT_TVMODE            20 /* TW: index for 800x600x8 */
++#define DEFAULT_MODE              39 /* index for 800x600x8 */
++#define DEFAULT_LCDMODE           39 /* index for 800x600x8 */
++#define DEFAULT_TVMODE            39 /* index for 800x600x8 */
+ 	{"800x600x8",    0x30, 0x0103, 0x0103,  800,  600,  8, 2, 100, 37, MD_SIS300|MD_SIS315},
+ 	{"800x600x16",   0x47, 0x0114, 0x0114,  800,  600, 16, 2, 100, 37, MD_SIS300|MD_SIS315},
+ 	{"800x600x24",   0x63, 0x013b, 0x0115,  800,  600, 32, 2, 100, 37, MD_SIS300|MD_SIS315},
+ 	{"800x600x32",   0x63, 0x013b, 0x0115,  800,  600, 32, 2, 100, 37, MD_SIS300|MD_SIS315},
++	{"848x480x8",    0x39, 0x0000, 0x0000,  848,  480,  8, 2, 106, 30, MD_SIS300|MD_SIS315},
++	{"848x480x16",   0x3b, 0x0000, 0x0000,  848,  480, 16, 2, 106, 30, MD_SIS300|MD_SIS315},
++	{"848x480x24",   0x3e, 0x0000, 0x0000,  848,  480, 32, 2, 106, 30, MD_SIS300|MD_SIS315},
++	{"848x480x32",   0x3e, 0x0000, 0x0000,  848,  480, 32, 2, 106, 30, MD_SIS300|MD_SIS315},
++	{"856x480x8",    0x3f, 0x0000, 0x0000,  856,  480,  8, 2, 107, 30, MD_SIS300|MD_SIS315},
++	{"856x480x16",   0x42, 0x0000, 0x0000,  856,  480, 16, 2, 107, 30, MD_SIS300|MD_SIS315},
++	{"856x480x24",   0x45, 0x0000, 0x0000,  856,  480, 32, 2, 107, 30, MD_SIS300|MD_SIS315},
++	{"856x480x32",   0x45, 0x0000, 0x0000,  856,  480, 32, 2, 107, 30, MD_SIS300|MD_SIS315},
+ 	{"1024x576x8",   0x71, 0x0000, 0x0000, 1024,  576,  8, 1, 128, 36, MD_SIS300|MD_SIS315},
+ 	{"1024x576x16",  0x74, 0x0000, 0x0000, 1024,  576, 16, 1, 128, 36, MD_SIS300|MD_SIS315},
+ 	{"1024x576x24",  0x77, 0x0000, 0x0000, 1024,  576, 32, 1, 128, 36, MD_SIS300|MD_SIS315},
+ 	{"1024x576x32",  0x77, 0x0000, 0x0000, 1024,  576, 32, 1, 128, 36, MD_SIS300|MD_SIS315},
+-	{"1024x600x8",   0x20, 0x0000, 0x0000, 1024,  600,  8, 1, 128, 37, MD_SIS300          },  /* TW: 300 series only */
++	{"1024x600x8",   0x20, 0x0000, 0x0000, 1024,  600,  8, 1, 128, 37, MD_SIS300          },
+ 	{"1024x600x16",  0x21, 0x0000, 0x0000, 1024,  600, 16, 1, 128, 37, MD_SIS300          },
+ 	{"1024x600x24",  0x22, 0x0000, 0x0000, 1024,  600, 32, 1, 128, 37, MD_SIS300          },
+ 	{"1024x600x32",  0x22, 0x0000, 0x0000, 1024,  600, 32, 1, 128, 37, MD_SIS300          },
+ 	{"1024x768x8",   0x38, 0x0105, 0x0105, 1024,  768,  8, 2, 128, 48, MD_SIS300|MD_SIS315},
+-	{"1024x768x16",  0x4A, 0x0117, 0x0117, 1024,  768, 16, 2, 128, 48, MD_SIS300|MD_SIS315},
++	{"1024x768x16",  0x4a, 0x0117, 0x0117, 1024,  768, 16, 2, 128, 48, MD_SIS300|MD_SIS315},
+ 	{"1024x768x24",  0x64, 0x013c, 0x0118, 1024,  768, 32, 2, 128, 48, MD_SIS300|MD_SIS315},
+ 	{"1024x768x32",  0x64, 0x013c, 0x0118, 1024,  768, 32, 2, 128, 48, MD_SIS300|MD_SIS315},
+-	{"1152x768x8",   0x23, 0x0000, 0x0000, 1152,  768,  8, 1, 144, 48, MD_SIS300          },  /* TW: 300 series only */
++	{"1152x768x8",   0x23, 0x0000, 0x0000, 1152,  768,  8, 1, 144, 48, MD_SIS300          },
+ 	{"1152x768x16",  0x24, 0x0000, 0x0000, 1152,  768, 16, 1, 144, 48, MD_SIS300          },
+ 	{"1152x768x24",  0x25, 0x0000, 0x0000, 1152,  768, 32, 1, 144, 48, MD_SIS300          },
+ 	{"1152x768x32",  0x25, 0x0000, 0x0000, 1152,  768, 32, 1, 144, 48, MD_SIS300          },
++	{"1152x864x8",   0x29, 0x0000, 0x0000, 1152,  864,  8, 1, 144, 54, MD_SIS300|MD_SIS315},
++	{"1152x864x16",  0x2a, 0x0000, 0x0000, 1152,  864, 16, 1, 144, 54, MD_SIS300|MD_SIS315},
++	{"1152x864x24",  0x2b, 0x0000, 0x0000, 1152,  864, 32, 1, 144, 54, MD_SIS300|MD_SIS315},
++	{"1152x864x32",  0x2b, 0x0000, 0x0000, 1152,  864, 32, 1, 144, 54, MD_SIS300|MD_SIS315},
+ 	{"1280x720x8",   0x79, 0x0000, 0x0000, 1280,  720,  8, 1, 160, 45, MD_SIS300|MD_SIS315},
+ 	{"1280x720x16",  0x75, 0x0000, 0x0000, 1280,  720, 16, 1, 160, 45, MD_SIS300|MD_SIS315},
+ 	{"1280x720x24",  0x78, 0x0000, 0x0000, 1280,  720, 32, 1, 160, 45, MD_SIS300|MD_SIS315},
+ 	{"1280x720x32",  0x78, 0x0000, 0x0000, 1280,  720, 32, 1, 160, 45, MD_SIS300|MD_SIS315},
+-	{"1280x768x8",   0x23, 0x0000, 0x0000, 1280,  768,  8, 1, 160, 48,           MD_SIS315},  /* TW: 310/325 series only */
+-	{"1280x768x16",  0x24, 0x0000, 0x0000, 1280,  768, 16, 1, 160, 48,           MD_SIS315},
+-	{"1280x768x24",  0x25, 0x0000, 0x0000, 1280,  768, 32, 1, 160, 48,           MD_SIS315},
+-	{"1280x768x32",  0x25, 0x0000, 0x0000, 1280,  768, 32, 1, 160, 48,           MD_SIS315},
+-#define MODEINDEX_1280x960 48
+-	{"1280x960x8",   0x7C, 0x0000, 0x0000, 1280,  960,  8, 1, 160, 60, MD_SIS300|MD_SIS315},  /* TW: Modenumbers being patched */
+-	{"1280x960x16",  0x7D, 0x0000, 0x0000, 1280,  960, 16, 1, 160, 60, MD_SIS300|MD_SIS315},
+-	{"1280x960x24",  0x7E, 0x0000, 0x0000, 1280,  960, 32, 1, 160, 60, MD_SIS300|MD_SIS315},
+-	{"1280x960x32",  0x7E, 0x0000, 0x0000, 1280,  960, 32, 1, 160, 60, MD_SIS300|MD_SIS315},
+-	{"1280x1024x8",  0x3A, 0x0107, 0x0107, 1280, 1024,  8, 2, 160, 64, MD_SIS300|MD_SIS315},
+-	{"1280x1024x16", 0x4D, 0x011a, 0x011a, 1280, 1024, 16, 2, 160, 64, MD_SIS300|MD_SIS315},
++#define MODEINDEX_1280x768 75
++	{"1280x768x8",   0x23, 0x0000, 0x0000, 1280,  768,  8, 1, 160, 48, MD_SIS300|MD_SIS315},
++	{"1280x768x16",  0x24, 0x0000, 0x0000, 1280,  768, 16, 1, 160, 48, MD_SIS300|MD_SIS315},
++	{"1280x768x24",  0x25, 0x0000, 0x0000, 1280,  768, 32, 1, 160, 48, MD_SIS300|MD_SIS315},
++	{"1280x768x32",  0x25, 0x0000, 0x0000, 1280,  768, 32, 1, 160, 48, MD_SIS300|MD_SIS315},
++	{"1280x960x8",   0x7c, 0x0000, 0x0000, 1280,  960,  8, 1, 160, 60, MD_SIS300|MD_SIS315}, 
++	{"1280x960x16",  0x7d, 0x0000, 0x0000, 1280,  960, 16, 1, 160, 60, MD_SIS300|MD_SIS315},
++	{"1280x960x24",  0x7e, 0x0000, 0x0000, 1280,  960, 32, 1, 160, 60, MD_SIS300|MD_SIS315},
++	{"1280x960x32",  0x7e, 0x0000, 0x0000, 1280,  960, 32, 1, 160, 60, MD_SIS300|MD_SIS315},
++	{"1280x1024x8",  0x3a, 0x0107, 0x0107, 1280, 1024,  8, 2, 160, 64, MD_SIS300|MD_SIS315},
++	{"1280x1024x16", 0x4d, 0x011a, 0x011a, 1280, 1024, 16, 2, 160, 64, MD_SIS300|MD_SIS315},
+ 	{"1280x1024x24", 0x65, 0x013d, 0x011b, 1280, 1024, 32, 2, 160, 64, MD_SIS300|MD_SIS315},
+ 	{"1280x1024x32", 0x65, 0x013d, 0x011b, 1280, 1024, 32, 2, 160, 64, MD_SIS300|MD_SIS315},
+-	{"1400x1050x8",  0x26, 0x0000, 0x0000, 1400, 1050,  8, 1, 175, 65,           MD_SIS315},  /* TW: 310/325 series only */
++	{"1360x768x8",   0x48, 0x0000, 0x0000, 1360,  768,  8, 1, 170, 48, MD_SIS300|MD_SIS315},
++	{"1360x768x16",  0x4b, 0x0000, 0x0000, 1360,  768, 16, 1, 170, 48, MD_SIS300|MD_SIS315},
++	{"1360x768x24",  0x4e, 0x0000, 0x0000, 1360,  768, 32, 1, 170, 48, MD_SIS300|MD_SIS315},
++	{"1360x768x32",  0x4e, 0x0000, 0x0000, 1360,  768, 32, 1, 170, 48, MD_SIS300|MD_SIS315},
++	{"1360x1024x8",  0x67, 0x0000, 0x0000, 1360, 1024,  8, 1, 170, 64, MD_SIS300          },
++	{"1360x1024x16", 0x6f, 0x0000, 0x0000, 1360, 1024, 16, 1, 170, 64, MD_SIS300          },
++	{"1360x1024x24", 0x72, 0x0000, 0x0000, 1360, 1024, 32, 1, 170, 64, MD_SIS300          },
++	{"1360x1024x32", 0x72, 0x0000, 0x0000, 1360, 1024, 32, 1, 170, 64, MD_SIS300          },
++	{"1400x1050x8",  0x26, 0x0000, 0x0000, 1400, 1050,  8, 1, 175, 65,           MD_SIS315},
+ 	{"1400x1050x16", 0x27, 0x0000, 0x0000, 1400, 1050, 16, 1, 175, 65,           MD_SIS315},
+ 	{"1400x1050x24", 0x28, 0x0000, 0x0000, 1400, 1050, 32, 1, 175, 65,           MD_SIS315},
+ 	{"1400x1050x32", 0x28, 0x0000, 0x0000, 1400, 1050, 32, 1, 175, 65,           MD_SIS315},
+-	{"1600x1200x8",  0x3C, 0x0130, 0x011c, 1600, 1200,  8, 1, 200, 75, MD_SIS300|MD_SIS315},
+-	{"1600x1200x16", 0x3D, 0x0131, 0x011e, 1600, 1200, 16, 1, 200, 75, MD_SIS300|MD_SIS315},
++	{"1600x1200x8",  0x3c, 0x0130, 0x011c, 1600, 1200,  8, 1, 200, 75, MD_SIS300|MD_SIS315},
++	{"1600x1200x16", 0x3d, 0x0131, 0x011e, 1600, 1200, 16, 1, 200, 75, MD_SIS300|MD_SIS315},
+ 	{"1600x1200x24", 0x66, 0x013e, 0x011f, 1600, 1200, 32, 1, 200, 75, MD_SIS300|MD_SIS315},
+ 	{"1600x1200x32", 0x66, 0x013e, 0x011f, 1600, 1200, 32, 1, 200, 75, MD_SIS300|MD_SIS315},
+ 	{"1920x1440x8",  0x68, 0x013f, 0x0000, 1920, 1440,  8, 1, 240, 75, MD_SIS300|MD_SIS315},
+ 	{"1920x1440x16", 0x69, 0x0140, 0x0000, 1920, 1440, 16, 1, 240, 75, MD_SIS300|MD_SIS315},
+-	{"1920x1440x24", 0x6B, 0x0141, 0x0000, 1920, 1440, 32, 1, 240, 75, MD_SIS300|MD_SIS315},
+-	{"1920x1440x32", 0x6B, 0x0141, 0x0000, 1920, 1440, 32, 1, 240, 75, MD_SIS300|MD_SIS315},
+-	{"2048x1536x8",  0x6c, 0x0000, 0x0000, 2048, 1536,  8, 1, 256, 96,           MD_SIS315},  /* TW: 310/325 series only */
++	{"1920x1440x24", 0x6b, 0x0141, 0x0000, 1920, 1440, 32, 1, 240, 75, MD_SIS300|MD_SIS315},
++	{"1920x1440x32", 0x6b, 0x0141, 0x0000, 1920, 1440, 32, 1, 240, 75, MD_SIS300|MD_SIS315},
++	{"2048x1536x8",  0x6c, 0x0000, 0x0000, 2048, 1536,  8, 1, 256, 96,           MD_SIS315},
+ 	{"2048x1536x16", 0x6d, 0x0000, 0x0000, 2048, 1536, 16, 1, 256, 96,           MD_SIS315},
+ 	{"2048x1536x24", 0x6e, 0x0000, 0x0000, 2048, 1536, 32, 1, 256, 96,           MD_SIS315},
+ 	{"2048x1536x32", 0x6e, 0x0000, 0x0000, 2048, 1536, 32, 1, 256, 96,           MD_SIS315},
+@@ -538,37 +577,45 @@ u8  sisfb_rate_idx = 0;
+ 
+ /* TW: CR36 evaluation */
+ const USHORT sis300paneltype[] =
+-    { LCD_UNKNOWN,   LCD_800x600,  LCD_1024x768,  LCD_1280x1024,
+-      LCD_1280x960,  LCD_640x480,  LCD_1024x600,  LCD_1152x768,
+-      LCD_320x480,   LCD_1024x768, LCD_1024x768,  LCD_1024x768,
+-      LCD_1024x768,  LCD_1024x768, LCD_1024x768,  LCD_1024x768 };
++    { LCD_UNKNOWN,   LCD_800x600,   LCD_1024x768,  LCD_1280x1024,
++      LCD_1280x960,  LCD_640x480,   LCD_1024x600,  LCD_1152x768,
++      LCD_1024x768,   LCD_1024x768,  LCD_1024x768,  LCD_1024x768,
++      LCD_1024x768,  LCD_1024x768,  LCD_320x480,   LCD_1024x768 };
+ 
+ const USHORT sis310paneltype[] =
+-    { LCD_UNKNOWN,   LCD_800x600,  LCD_1024x768,  LCD_1280x1024,
+-      LCD_640x480,   LCD_1024x600, LCD_1152x864,  LCD_1280x960,
+-      LCD_1152x768,  LCD_1400x1050,LCD_1280x768,  LCD_1600x1200,
+-      LCD_320x480,   LCD_1024x768, LCD_1024x768,  LCD_1024x768 };
++    { LCD_UNKNOWN,   LCD_800x600,   LCD_1024x768,  LCD_1280x1024,
++      LCD_640x480,   LCD_1024x600,  LCD_1152x864,  LCD_1280x960,
++      LCD_1152x768,  LCD_1400x1050, LCD_1280x768,  LCD_1600x1200,
++      LCD_640x480_2, LCD_640x480_3, LCD_320x480,   LCD_1024x768 };
++
++#define FL_550_DSTN 0x01
++#define FL_550_FSTN 0x02
+ 
+ static const struct _sis_crt2type {
+ 	char name[10];
+ 	int type_no;
+ 	int tvplug_no;
++	unsigned short flags;
+ } sis_crt2type[] = {
+-	{"NONE", 	0, 		-1},
+-	{"LCD",  	DISPTYPE_LCD, 	-1},
+-	{"TV",   	DISPTYPE_TV, 	-1},
+-	{"VGA",  	DISPTYPE_CRT2, 	-1},
+-	{"SVIDEO", 	DISPTYPE_TV, 	TVPLUG_SVIDEO},
+-	{"COMPOSITE", 	DISPTYPE_TV, 	TVPLUG_COMPOSITE},
+-	{"SCART", 	DISPTYPE_TV, 	TVPLUG_SCART},
+-	{"none", 	0, 		-1},
+-	{"lcd",  	DISPTYPE_LCD, 	-1},
+-	{"tv",   	DISPTYPE_TV, 	-1},
+-	{"vga",  	DISPTYPE_CRT2, 	-1},
+-	{"svideo", 	DISPTYPE_TV, 	TVPLUG_SVIDEO},
+-	{"composite", 	DISPTYPE_TV, 	TVPLUG_COMPOSITE},
+-	{"scart", 	DISPTYPE_TV, 	TVPLUG_SCART},
+-	{"\0",  	-1, 		-1}
++	{"NONE", 	0, 		-1,        0},
++	{"LCD",  	CRT2_LCD, 	-1,        0},
++	{"TV",   	CRT2_TV, 	-1,        0},
++	{"VGA",  	CRT2_VGA, 	-1,        0},
++	{"SVIDEO", 	CRT2_TV, 	TV_SVIDEO, 0},
++	{"COMPOSITE", 	CRT2_TV, 	TV_AVIDEO, 0},
++	{"SCART", 	CRT2_TV, 	TV_SCART,  0},
++	{"none", 	0, 		-1,        0},
++	{"lcd",  	CRT2_LCD, 	-1,        0},
++	{"tv",   	CRT2_TV, 	-1,        0},
++	{"vga",  	CRT2_VGA, 	-1,        0},
++	{"svideo", 	CRT2_TV, 	TV_SVIDEO, 0},
++	{"composite", 	CRT2_TV, 	TV_AVIDEO, 0},
++	{"scart", 	CRT2_TV, 	TV_SCART,  0},
++	{"DSTN",        CRT2_LCD,       -1,        FL_550_DSTN},
++	{"dstn",        CRT2_LCD,       -1,        FL_550_DSTN},
++	{"FSTN",        CRT2_LCD,       -1,        FL_550_FSTN},
++	{"fstn",        CRT2_LCD,       -1,        FL_550_FSTN},
++	{"\0",  	-1, 		-1,        0}
+ };
+ 
+ /* Queue mode selection for 310 series */
+@@ -590,10 +637,10 @@ static const struct _sis_tvtype {
+ 	char name[6];
+ 	int type_no;
+ } sis_tvtype[] = {
+-	{"PAL",  	1},
+-	{"NTSC", 	2},
+-	{"pal", 	1},
+-	{"ntsc",  	2},
++	{"PAL",  	TV_PAL},
++	{"NTSC", 	TV_NTSC},
++	{"pal", 	TV_PAL},
++	{"ntsc",  	TV_NTSC},
+ 	{"\0",   	-1}
+ };
+ 
+@@ -602,33 +649,102 @@ static const struct _sis_vrate {
+ 	u16 xres;
+ 	u16 yres;
+ 	u16 refresh;
++	BOOLEAN SiS730valid32bpp;
+ } sisfb_vrate[] = {
+-	{1,  640,  480, 60}, {2,  640,  480,  72}, {3, 640,   480,  75}, {4,  640, 480,  85},
+-	{5,  640,  480,100}, {6,  640,  480, 120}, {7, 640,   480, 160}, {8,  640, 480, 200},
+-	{1,  720,  480, 60},
+-	{1,  720,  576, 58},
+-	{1,  800,  480, 60}, {2,  800,  480,  75}, {3, 800,   480,  85},
+-	{1,  800,  600, 56}, {2,  800,  600,  60}, {3, 800,   600,  72}, {4,  800, 600,  75},
+-	{5,  800,  600, 85}, {6,  800,  600, 100}, {7, 800,   600, 120}, {8,  800, 600, 160},
+-	{1, 1024,  768, 43}, {2, 1024,  768,  60}, {3, 1024,  768,  70}, {4, 1024, 768,  75},
+-	{5, 1024,  768, 85}, {6, 1024,  768, 100}, {7, 1024,  768, 120},
+-	{1, 1024,  576, 60}, {2, 1024,  576,  75}, {3, 1024,  576,  85},
+-	{1, 1024,  600, 60},
+-	{1, 1152,  768, 60},
+-	{1, 1280,  720, 60}, {2, 1280,  720,  75}, {3, 1280,  720,  85},
+-	{1, 1280,  768, 60},
+-	{1, 1280, 1024, 43}, {2, 1280, 1024,  60}, {3, 1280, 1024,  75}, {4, 1280, 1024,  85},
+-	{1, 1280,  960, 70},
+-	{1, 1400, 1050, 60},
+-	{1, 1600, 1200, 60}, {2, 1600, 1200,  65}, {3, 1600, 1200,  70}, {4, 1600, 1200,  75},
+-	{5, 1600, 1200, 85}, {6, 1600, 1200, 100}, {7, 1600, 1200, 120},
+-	{1, 1920, 1440, 60}, {2, 1920, 1440,  65}, {3, 1920, 1440,  70}, {4, 1920, 1440,  75},
+-	{5, 1920, 1440, 85}, {6, 1920, 1440, 100},
+-	{1, 2048, 1536, 60}, {2, 2048, 1536,  65}, {3, 2048, 1536,  70}, {4, 2048, 1536,  75},
+-	{5, 2048, 1536, 85},
+-	{0, 0, 0, 0}
++	{1,  320,  200,  70,  TRUE},
++	{1,  320,  240,  60,  TRUE},
++	{1,  320,  480,  60,  TRUE},
++	{1,  400,  300,  60,  TRUE},
++	{1,  512,  384,  60,  TRUE},
++	{1,  640,  400,  72,  TRUE},
++	{1,  640,  480,  60,  TRUE}, {2,  640,  480,  72,  TRUE}, {3,  640,  480,  75,  TRUE},
++	{4,  640,  480,  85,  TRUE}, {5,  640,  480, 100,  TRUE}, {6,  640,  480, 120,  TRUE},
++	{7,  640,  480, 160,  TRUE}, {8,  640,  480, 200,  TRUE},
++	{1,  720,  480,  60,  TRUE},
++	{1,  720,  576,  58,  TRUE},
++	{1,  800,  480,  60,  TRUE}, {2,  800,  480,  75,  TRUE}, {3,  800,  480,  85,  TRUE},
++	{1,  800,  600,  56,  TRUE}, {2,  800,  600,  60,  TRUE}, {3,  800,  600,  72,  TRUE},
++	{4,  800,  600,  75,  TRUE}, {5,  800,  600,  85,  TRUE}, {6,  800,  600, 105,  TRUE},
++	{7,  800,  600, 120,  TRUE}, {8,  800,  600, 160,  TRUE},
++	{1,  848,  480,  39,  TRUE}, {2,  848,  480,  60,  TRUE},
++	{1,  856,  480,  39,  TRUE}, {2,  856,  480,  60,  TRUE},
++	{1, 1024,  576,  60,  TRUE}, {2, 1024,  576,  75,  TRUE}, {3, 1024,  576,  85,  TRUE},
++	{1, 1024,  600,  60,  TRUE},
++	{1, 1024,  768,  43,  TRUE}, {2, 1024,  768,  60,  TRUE}, {3, 1024,  768,  70, FALSE},
++	{4, 1024,  768,  75, FALSE}, {5, 1024,  768,  85,  TRUE}, {6, 1024,  768, 100,  TRUE},
++	{7, 1024,  768, 120,  TRUE},
++	{1, 1152,  768,  60,  TRUE},
++	{1, 1152,  864,  75,  TRUE}, {2, 1152,  864,  84,  TRUE},
++	{1, 1280,  720,  60,  TRUE}, {2, 1280,  720,  75,  TRUE}, {3, 1280,  720,  85,  TRUE},
++	{1, 1280,  768,  60,  TRUE},
++	{1, 1280,  960,  60,  TRUE}, {2, 1280,  960,  85,  TRUE},
++	{1, 1280, 1024,  43,  TRUE}, {2, 1280, 1024,  60,  TRUE}, {3, 1280, 1024,  75,  TRUE},
++	{4, 1280, 1024,  85,  TRUE},
++	{1, 1360,  768,  60,  TRUE},
++	{1, 1360, 1024,  59,  TRUE},
++	{1, 1400, 1050,  60,  TRUE}, {2, 1400, 1050,  75,  TRUE},
++	{1, 1600, 1200,  60,  TRUE}, {2, 1600, 1200,  65,  TRUE}, {3, 1600, 1200,  70,  TRUE},
++	{4, 1600, 1200,  75,  TRUE}, {5, 1600, 1200,  85,  TRUE}, {6, 1600, 1200, 100,  TRUE},
++	{7, 1600, 1200, 120,  TRUE},
++	{1, 1920, 1440,  60,  TRUE}, {2, 1920, 1440,  65,  TRUE}, {3, 1920, 1440,  70,  TRUE},
++	{4, 1920, 1440,  75,  TRUE}, {5, 1920, 1440,  85,  TRUE}, {6, 1920, 1440, 100,  TRUE},
++	{1, 2048, 1536,  60,  TRUE}, {2, 2048, 1536,  65,  TRUE}, {3, 2048, 1536,  70,  TRUE},
++	{4, 2048, 1536,  75,  TRUE}, {5, 2048, 1536,  85,  TRUE},
++	{0,    0,    0,   0, FALSE}
++};
++
++static struct sisfb_monitor {
++	u16 hmin;
++	u16 hmax;
++	u16 vmin;
++	u16 vmax;
++	u32 dclockmax;
++	u8  feature;
++	BOOLEAN datavalid;
++} sisfb_thismonitor;
++
++static const struct _sisfbddcsmodes {
++	u32 mask;
++	u16 h;
++	u16 v;
++	u32 d;
++} sisfb_ddcsmodes[] = {
++	{ 0x10000, 67, 75, 108000},
++	{ 0x08000, 48, 72,  50000},
++	{ 0x04000, 46, 75,  49500},
++	{ 0x01000, 35, 43,  44900},
++	{ 0x00800, 48, 60,  65000},
++	{ 0x00400, 56, 70,  75000},
++	{ 0x00200, 60, 75,  78800},
++	{ 0x00100, 80, 75, 135000},
++	{ 0x00020, 31, 60,  25200},
++	{ 0x00008, 38, 72,  31500},
++	{ 0x00004, 37, 75,  31500},
++	{ 0x00002, 35, 56,  36000},
++	{ 0x00001, 38, 60,  40000}
++};
++
++static const struct _sisfbddcfmodes {
++	u16 x;
++	u16 y;
++	u16 v;
++	u16 h;
++	u32 d;
++} sisfb_ddcfmodes[] = {
++       { 1280, 1024, 85, 92, 157500},
++       { 1600, 1200, 60, 75, 162000},
++       { 1600, 1200, 65, 82, 175500},
++       { 1600, 1200, 70, 88, 189000},
++       { 1600, 1200, 75, 94, 202500},
++       { 1600, 1200, 85, 107,229500},
++       { 1920, 1440, 60, 90, 234000},
++       { 1920, 1440, 75, 113,297000}
+ };
+ 
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
++static u8 sisfb_lastrates[128];
++#endif
++
+ static const struct _chswtable {
+     int subsysVendor;
+     int subsysCard;
+@@ -636,9 +752,38 @@ static const struct _chswtable {
+     char *cardName;
+ } mychswtable[] = {
+         { 0x1631, 0x1002, "Mitachi", "0x1002" },
++	{ 0x1071, 0x7521, "Mitac"  , "7521P"  },
+ 	{ 0,      0,      ""       , ""       }
+ };
+ 
++static const struct _customttable {
++    unsigned short chipID;
++    char *biosversion;
++    char *biosdate;
++    unsigned short biosFootprintAddr[5];
++    unsigned char biosFootprintData[5];
++    char *vendorName;
++    char *cardName;
++    unsigned long SpecialID;
++    char *optionName;
++} mycustomttable[] = {
++        { SIS_630, "2.00.07", "09/27/2002-13:38:25",
++	  { 0x220, 0x227, 0x228, 0x229, 0x22a },
++	  {  0x01,  0xe3,  0x9a,  0x6a,  0x00 },
++	  "Barco", "iQ R200L/300/400", CUT_BARCO1366, "BARCO1366"
++	},
++	{ SIS_630, "2.00.07", "09/27/2002-13:38:25",
++	  { 0x220, 0x227, 0x228, 0x229, 0x22a },
++	  {  0x00,  0x5a,  0x64,  0x41,  0x00 },
++	  "Barco", "iQ G200L/300/400/500", CUT_BARCO1024, "BARCO1024"
++	},
++	{ 0, "", "",
++	  { 0, 0, 0, 0 },
++	  { 0, 0, 0, 0 },
++	  "", "", CUT_NONE, ""
++	}
++};
++
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+ /* Offscreen layout */
+ typedef struct _SIS_GLYINFO {
+@@ -677,7 +822,6 @@ static unsigned long sisfb_heap_end;
+ static unsigned long sisfb_heap_size;
+ static SIS_HEAP      sisfb_heap;
+ 
+-// Eden Chen
+ static const struct _sis_TV_filter {
+ 	u8 filter[9][4];
+ } sis_TV_filter[] = {
+@@ -829,9 +973,8 @@ static const struct _sis_TV_filter {
+ 
+ static int           filter = -1;
+ static unsigned char filter_tb;
+-//~Eden Chen
+ 
+-/* ---------------------- Routine prototypes ------------------------- */
++/* ---------------------- Prototypes ------------------------- */
+ 
+ /* Interface used by the world */
+ #ifndef MODULE
+@@ -894,10 +1037,6 @@ extern void     fbcon_sis_fillrect(struc
+                                    const struct fb_fillrect *rect);
+ extern void     fbcon_sis_copyarea(struct fb_info *info, 
+                                    const struct fb_copyarea *area);
+-#if 0				   
+-extern void     cfb_imageblit(struct fb_info *info, 
+-                              const struct fb_image *image);
+-#endif			      
+ extern int      fbcon_sis_sync(struct fb_info *info);
+ static int      sisfb_ioctl(struct inode *inode, 
+ 	 		    struct file *file,
+@@ -912,7 +1051,7 @@ extern int      sisfb_mode_rate_to_ddata
+ 			 unsigned int *left_margin, unsigned int *right_margin, 
+ 			 unsigned int *upper_margin, unsigned int *lower_margin,
+ 			 unsigned int *hsync_len, unsigned int *vsync_len,
+-			 unsigned int *sync, unsigned int *vmode);			      		    			      
++			 unsigned int *sync, unsigned int *vmode);
+ #endif
+ 			
+ static int      sisfb_get_fix(struct fb_fix_screeninfo *fix, int con,
+@@ -923,9 +1062,9 @@ extern int      sisfb_initaccel(void);
+ extern void     sisfb_syncaccel(void);
+ 
+ /* Internal general routines */
+-static void     sisfb_search_mode(const char *name);
+-static int      sisfb_validate_mode(int modeindex);
+-static u8       sisfb_search_refresh_rate(unsigned int rate);
++static void     sisfb_search_mode(char *name, BOOLEAN quiet);
++static int      sisfb_validate_mode(int modeindex, unsigned long vbflags);
++static u8       sisfb_search_refresh_rate(unsigned int rate, int index);
+ static int      sisfb_setcolreg(unsigned regno, unsigned red, unsigned green,
+ 			unsigned blue, unsigned transp,
+ 			struct fb_info *fb_info);
+@@ -939,6 +1078,12 @@ static BOOLEAN  sisfb_CheckVBRetrace(voi
+ static BOOLEAN  sisfbcheckvretracecrt2(void);
+ static BOOLEAN  sisfbcheckvretracecrt1(void);
+ static BOOLEAN  sisfb_bridgeisslave(void);
++static void     sisfb_detect_VB_connect(void);
++static void     sisfb_get_VB_type(void);
++
++static void     sisfb_handle_ddc(struct sisfb_monitor *monitor, int crtno);
++static BOOLEAN  sisfb_interpret_edid(struct sisfb_monitor *monitor, unsigned char *buffer);
++
+ 
+ /* SiS-specific Export functions */
+ void            sis_dispinfo(struct ap_data *rec);
+@@ -952,15 +1097,9 @@ u32             sisfb_get_reg3(u16 port)
+ /* Chipset-dependent internal routines */
+ #ifdef CONFIG_FB_SIS_300
+ static int      sisfb_get_dram_size_300(void);
+-static void     sisfb_detect_VB_connect_300(void);
+-static void     sisfb_get_VB_type_300(void);
+-static int      sisfb_has_VB_300(void);
+ #endif
+ #ifdef CONFIG_FB_SIS_315
+ static int      sisfb_get_dram_size_315(void);
+-static void     sisfb_detect_VB_connect_315(void);
+-static void     sisfb_get_VB_type_315(void);
+-static int      sisfb_has_VB_315(void);
+ #endif
+ 
+ /* Internal heap routines */
+@@ -978,23 +1117,33 @@ BOOLEAN         sisfb_query_VGA_config_s
+ BOOLEAN         sisfb_query_north_bridge_space(PSIS_HW_DEVICE_INFO psishw_ext,
+ 	         	unsigned long offset, unsigned long set, unsigned long *value);
+ 
+-
+ /* Routines from init.c/init301.c */
+ extern void 	SiSRegInit(SiS_Private *SiS_Pr, USHORT BaseAddr);
+ extern BOOLEAN  SiSInit(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ extern BOOLEAN  SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo);
+-extern void     SiS_SetEnableDstn(SiS_Private *SiS_Pr);
++extern void     SiS_SetEnableDstn(SiS_Private *SiS_Pr, int enable);
++extern void     SiS_SetEnableFstn(SiS_Private *SiS_Pr, int enable);
+ extern void     SiS_LongWait(SiS_Private *SiS_Pr);
+ 
+-/* TW: Chrontel TV functions */
++extern BOOLEAN  sisfb_gettotalfrommode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
++		       unsigned char modeno, int *htotal, int *vtotal, unsigned char rateindex);
++
++/* Chrontel TV functions */
+ extern USHORT 	SiS_GetCH700x(SiS_Private *SiS_Pr, USHORT tempbx);
+ extern void 	SiS_SetCH700x(SiS_Private *SiS_Pr, USHORT tempbx);
+ extern USHORT 	SiS_GetCH701x(SiS_Private *SiS_Pr, USHORT tempbx);
+ extern void 	SiS_SetCH701x(SiS_Private *SiS_Pr, USHORT tempbx);
+ extern void     SiS_SetCH70xxANDOR(SiS_Private *SiS_Pr, USHORT tempax,USHORT tempbh);
+ extern void     SiS_DDC2Delay(SiS_Private *SiS_Pr, USHORT delaytime);
+-
+-/* TW: Sensing routines */
++extern void     SiS_SetChrontelGPIO(SiS_Private *SiS_Pr, USHORT myvbinfo);
++extern USHORT   SiS_HandleDDC(SiS_Private *SiS_Pr, unsigned long VBFlags, int VGAEngine,
++		              USHORT adaptnum, USHORT DDCdatatype, unsigned char *buffer);
++extern void SiS_Chrontel701xBLOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
++extern void SiS_Chrontel701xBLOff(SiS_Private *SiS_Pr);
++extern void SiS_SiS30xBLOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
++extern void SiS_SiS30xBLOff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
++			      
++/* Sensing routines */
+ void            SiS_Sense30x(void);
+ int             SISDoSense(int tempbl, int tempbh, int tempcl, int tempch);
+ void            SiS_SenseCh(void);			
+--- linux-2.6.0-test1/drivers/video/sis/vgatypes.h	2003-06-14 12:17:55.000000000 -0700
++++ 25/drivers/video/sis/vgatypes.h	2003-07-19 17:04:55.000000000 -0700
+@@ -1,3 +1,30 @@
++/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/vgatypes.h,v 1.0 2001/06/15 21:23:00 dawes Exp $ */
++/*
++ * General type definitions for universal mode switching modules
++ *
++ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of the copyright holder not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  The copyright holder makes no representations
++ * about the suitability of this software for any purpose.  It is provided
++ * "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
++ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++ * PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Author: 	Thomas Winischhofer <thomas@winischhofer.net>
++ *
++ */
+ #ifndef _VGATYPES_
+ #define _VGATYPES_
+ 
+@@ -5,7 +32,7 @@
+ #include "xf86Pci.h"
+ #endif
+ 
+-#ifdef LINUX_KERNEL  /* TW: We don't want the X driver to depend on kernel source */
++#ifdef LINUX_KERNEL  /* We don't want the X driver to depend on kernel source */
+ #include <linux/ioctl.h>
+ #endif
+ 
+@@ -72,18 +99,15 @@ typedef void VOID;
+ typedef UCHAR BOOLEAN;
+ #endif
+ 
+-#ifndef WINCE_HEADER
+ #ifndef bool
+ typedef UCHAR bool;
+ #endif
+-#endif /*WINCE_HEADER*/
+ 
+ #ifndef VBIOS_VER_MAX_LENGTH
+ #define VBIOS_VER_MAX_LENGTH         4
+ #endif
+ 
+ #ifndef LINUX_KERNEL   /* For kernel, this is defined in sisfb.h */
+-#ifndef WIN2000
+ #ifndef SIS_CHIP_TYPE
+ typedef enum _SIS_CHIP_TYPE {
+     SIS_VGALegacy = 0,
+@@ -101,19 +125,18 @@ typedef enum _SIS_CHIP_TYPE {
+     SIS_550,
+     SIS_650,
+     SIS_740,
+-    SIS_330, 
++    SIS_330,
++    SIS_660,
+     MAX_SIS_CHIP
+ } SIS_CHIP_TYPE;
+ #endif
+ #endif
+-#endif
+ 
+-#ifndef WIN2000
+ #ifndef SIS_VB_CHIP_TYPE
+ typedef enum _SIS_VB_CHIP_TYPE {
+     VB_CHIP_Legacy = 0,
+     VB_CHIP_301,
+-    VB_CHIP_301B,      
++    VB_CHIP_301B,
+     VB_CHIP_301LV,
+     VB_CHIP_302,
+     VB_CHIP_302B,
+@@ -122,9 +145,7 @@ typedef enum _SIS_VB_CHIP_TYPE {
+     MAX_VB_CHIP
+ } SIS_VB_CHIP_TYPE;
+ #endif
+-#endif
+ 
+-#ifndef WIN2000
+ #ifndef SIS_LCD_TYPE
+ typedef enum _SIS_LCD_TYPE {
+     LCD_INVALID = 0,
+@@ -136,18 +157,19 @@ typedef enum _SIS_LCD_TYPE {
+     LCD_1600x1200,
+     LCD_1920x1440,
+     LCD_2048x1536,
+-    LCD_320x480,       /* TW: FSTN */
++    LCD_320x480,       /* FSTN, DSTN */
+     LCD_1400x1050,
+     LCD_1152x864,
+     LCD_1152x768,
+     LCD_1280x768,
+     LCD_1024x600,
++    LCD_640x480_2,     /* FSTN, DSTN */
++    LCD_640x480_3,     /* FSTN, DSTN */
++    LCD_CUSTOM,
+     LCD_UNKNOWN
+ } SIS_LCD_TYPE;
+ #endif
+-#endif
+ 
+-#ifndef WIN2000 /* mark by Paul, Move definition to sisv.h*/
+ #ifndef PSIS_DSReg
+ typedef struct _SIS_DSReg
+ {
+@@ -162,7 +184,6 @@ typedef struct _SIS_HW_DEVICE_INFO  SIS_
+ 
+ typedef BOOLEAN (*PSIS_QUERYSPACE)   (PSIS_HW_DEVICE_INFO, ULONG, ULONG, ULONG *);
+ 
+-
+ struct _SIS_HW_DEVICE_INFO
+ {
+     PVOID  pDevice;              /* The pointer to the physical device data structure
+@@ -173,7 +194,7 @@ struct _SIS_HW_DEVICE_INFO
+                                  /* Note:ROM image file is the file of VBIOS ROM */
+ 
+     BOOLEAN UseROM;		 /* TW: Use the ROM image if provided */
+- 
++
+     UCHAR  *pjCustomizedROMImage;/* base virtual address of ROM image file. */
+                                  /* wincE:ROM image file is the file for OEM */
+                                  /*       customized table */
+@@ -195,7 +216,7 @@ struct _SIS_HW_DEVICE_INFO
+                                  /* defined in the data structure type */
+                                  /* "SIS_VB_CHIP_TYPE" */
+ 
+-    USHORT usExternalChip;       /* NO VB or other video bridge(not  */
++    USHORT usExternalChip;       /* NO VB or other video bridge (other than  */
+                                  /* SiS video bridge) */
+                                  /* if ujVBChipID = VB_CHIP_UNKNOWN, */
+                                  /* then bit0=1 : LVDS,bit1=1 : trumpion, */
+@@ -207,7 +228,7 @@ struct _SIS_HW_DEVICE_INFO
+                                  /*             011:Trumpion LVDS Scaling Chip */
+                                  /*             100:LVDS(LCD-out)+Chrontel 7005 */
+                                  /*             101:Single Chrontel 7005 */
+-				 /* TW: This has changed on 310/325 series! */
++				 /* TW: This has changed on 315 series! */
+ 
+     ULONG  ulCRT2LCDType;        /* defined in the data structure type */
+                                  /* "SIS_LCD_TYPE" */
+@@ -244,7 +265,6 @@ struct _SIS_HW_DEVICE_INFO
+ #endif
+ };
+ #endif
+-#endif 
+ 
+ 
+ /* TW: Addtional IOCTL for communication sisfb <> X driver        */
+@@ -288,8 +308,6 @@ struct _SISFB_INFO {
+ };
+ #endif
+ 
+-#ifndef WIN2000
+-#ifndef WINCE_HEADER
+ #ifndef BUS_DATA_TYPE
+ typedef enum _BUS_DATA_TYPE {
+     ConfigurationSpaceUndefined = -1,
+@@ -307,7 +325,6 @@ typedef enum _BUS_DATA_TYPE {
+     MaximumBusDataType
+ } BUS_DATA_TYPE, *PBUS_DATA_TYPE;
+ #endif
+-#endif /* WINCE_HEADER */
+ 
+ #ifndef PCI_TYPE0_ADDRESSES
+ #define PCI_TYPE0_ADDRESSES             6
+@@ -317,7 +334,6 @@ typedef enum _BUS_DATA_TYPE {
+ #define PCI_TYPE1_ADDRESSES             2
+ #endif
+ 
+-#ifndef WINCE_HEADER
+ #ifndef PCI_COMMON_CONFIG
+ typedef struct _PCI_COMMON_CONFIG {
+     USHORT  VendorID;                   /* (ro)                 */
+@@ -355,7 +371,6 @@ typedef struct _PCI_COMMON_CONFIG {
+ 
+ } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
+ #endif
+-#endif /* WINCE_HEADER */
+ 
+ #ifndef FIELD_OFFSET
+ #define FIELD_OFFSET(type, field)    ((LONG)&(((type *)0)->field))
+@@ -364,6 +379,6 @@ typedef struct _PCI_COMMON_CONFIG {
+ #ifndef PCI_COMMON_HDR_LENGTH
+ #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET (PCI_COMMON_CONFIG, DeviceSpecific))
+ #endif
+-#endif
+ 
+ #endif
++
+--- linux-2.6.0-test1/drivers/video/sis/vstruct.h	2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/video/sis/vstruct.h	2003-07-19 17:04:55.000000000 -0700
+@@ -1,3 +1,32 @@
++/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/vstruct.h,v 1.0 2001/06/15 21:23:00 dawes Exp $ */
++/*
++ * General structure definitions for universal mode switching modules
++ *
++ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of the copyright holder not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  The copyright holder makes no representations
++ * about the suitability of this software for any purpose.  It is provided
++ * "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
++ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++ * PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Author: 	Thomas Winischhofer <thomas@winischhofer.net>
++ *              ?
++ *
++ */
++ 
+ #ifdef _INIT_
+ #define EXTERN
+ #else
+@@ -58,7 +87,6 @@ typedef struct _SiS_LVDSCRT1DataStruct
+ 	UCHAR  CR[15];
+ } SiS_LVDSCRT1DataStruct;
+ 
+-/*add for LCDA*/
+ typedef struct _SiS_LCDACRT1DataStruct
+ {
+ 	UCHAR  CR[17];
+@@ -111,9 +139,7 @@ typedef struct _SiS_ExtStruct
+ 	UCHAR  Ext_ModeID;
+ 	USHORT Ext_ModeFlag;
+ 	USHORT Ext_ModeInfo;
+-	USHORT Ext_Point;
+ 	USHORT Ext_VESAID;
+-	UCHAR  Ext_VESAMEMSize;
+ 	UCHAR  Ext_RESINFO;
+ 	UCHAR  VB_ExtTVFlickerIndex;
+ 	UCHAR  VB_ExtTVEdgeIndex;
+@@ -130,7 +156,6 @@ typedef struct _SiS_Ext2Struct
+ 	UCHAR  ModeID;
+ 	USHORT XRes;
+ 	USHORT YRes;
+-	USHORT ROM_OFFSET;
+ } SiS_Ext2Struct;
+ 
+ typedef struct _SiS_Part2PortTblStruct
+@@ -183,6 +208,12 @@ typedef struct _SiS_ModeResInfoStruct
+ 
+ typedef UCHAR DRAM4Type[4];
+ 
++/* Defines for SiS_Customt */
++#define CUT_NONE       0
++#define CUT_FORCENONE  1
++#define CUT_BARCO1366  2
++#define CUT_BARCO1024  3
++
+ typedef struct _SiS_Private
+ {
+ #ifdef LINUX_KERNEL
+@@ -198,25 +229,34 @@ typedef struct _SiS_Private
+ 	USHORT SiS_P3c7;
+ 	USHORT SiS_P3c8;
+ 	USHORT SiS_P3c9;
++	USHORT SiS_P3cb;
++	USHORT SiS_P3cd;
+ 	USHORT SiS_P3da;
+ 	USHORT SiS_Part1Port;
+ 	USHORT SiS_Part2Port;
+ 	USHORT SiS_Part3Port;
+ 	USHORT SiS_Part4Port;
+ 	USHORT SiS_Part5Port;
++	USHORT SiS_VidCapt;
++	USHORT SiS_VidPlay;
+ 	USHORT SiS_IF_DEF_LVDS;
+ 	USHORT SiS_IF_DEF_TRUMPION;
+ 	USHORT SiS_IF_DEF_DSTN;
+ 	USHORT SiS_IF_DEF_FSTN;
+ 	USHORT SiS_IF_DEF_CH70xx;
+ 	USHORT SiS_IF_DEF_HiVision;
++	USHORT SiS_SysFlags;
+ 	UCHAR  SiS_VGAINFO;
++#ifndef LINUX_KERNEL
++        USHORT SiS_CP1, SiS_CP2, SiS_CP3, SiS_CP4;
++#endif
+ 	BOOLEAN SiS_UseROM;
+ 	int    SiS_CHOverScan;
+ 	BOOLEAN SiS_CHSOverScan;
+ 	BOOLEAN SiS_ChSW;
+ 	BOOLEAN SiS_UseLCDA;
+ 	int    SiS_UseOEM;
++	ULONG  SiS_CustomT;
+ 	USHORT SiS_Backup70xx;
+ 	USHORT SiS_CRT1Mode;
+ 	USHORT SiS_flag_clearbuffer;
+@@ -270,15 +310,18 @@ typedef struct _SiS_Private
+ 	USHORT SiS_Panel1280x768;
+ 	USHORT SiS_Panel1024x600;
+ 	USHORT SiS_Panel640x480;
++	USHORT SiS_Panel640x480_2;
++	USHORT SiS_Panel640x480_3;
+ 	USHORT SiS_Panel1152x864;
++	USHORT SiS_PanelCustom;
++	USHORT SiS_PanelBarco1366;
+ 	USHORT SiS_PanelMax;
+ 	USHORT SiS_PanelMinLVDS;
+ 	USHORT SiS_PanelMin301;
+ 	USHORT SiS_ChrontelInit;
+ 	
+-	/* Pointers: */
+ 	const SiS_StStruct          *SiS_SModeIDTable;
+-	const SiS_StandTableStruct  *SiS_StandTable;
++	SiS_StandTableStruct        *SiS_StandTable;
+ 	const SiS_ExtStruct         *SiS_EModeIDTable;
+ 	const SiS_Ext2Struct        *SiS_RefIndex;
+ 	const SiS_VBModeStruct      *SiS_VBModeIDTable;
+@@ -316,7 +359,7 @@ typedef struct _SiS_Private
+ 	const USHORT *pSiS_RGBSenseData;
+ 	const USHORT *pSiS_VideoSenseData;
+ 	const USHORT *pSiS_YCSenseData;
+-	const USHORT *pSiS_RGBSenseData2; /*301b*/
++	const USHORT *pSiS_RGBSenseData2;
+ 	const USHORT *pSiS_VideoSenseData2;
+ 	const USHORT *pSiS_YCSenseData2;
+ #endif
+@@ -340,15 +383,18 @@ typedef struct _SiS_Private
+ 	const SiS_LCDDataStruct  *SiS_LCD1280x960Data;
+ 	const SiS_LCDDataStruct  *SiS_NoScaleData1400x1050;
+ 	const SiS_LCDDataStruct  *SiS_NoScaleData1600x1200;
++	const SiS_LCDDataStruct  *SiS_NoScaleData1280x768;
+ 	const SiS_LCDDataStruct  *SiS_StLCD1400x1050Data;
+ 	const SiS_LCDDataStruct  *SiS_StLCD1600x1200Data;
++	const SiS_LCDDataStruct  *SiS_StLCD1280x768Data;
+ 	const SiS_LCDDataStruct  *SiS_ExtLCD1400x1050Data;
+ 	const SiS_LCDDataStruct  *SiS_ExtLCD1600x1200Data;
++	const SiS_LCDDataStruct  *SiS_ExtLCD1280x768Data;
++	const SiS_LCDDataStruct  *SiS_NoScaleData;
+ 	const SiS_TVDataStruct   *SiS_StPALData;
+ 	const SiS_TVDataStruct   *SiS_ExtPALData;
+ 	const SiS_TVDataStruct   *SiS_StNTSCData;
+ 	const SiS_TVDataStruct   *SiS_ExtNTSCData;
+-/*	const SiS_TVDataStruct   *SiS_St1HiTVData;  */
+ 	const SiS_TVDataStruct   *SiS_St2HiTVData;
+ 	const SiS_TVDataStruct   *SiS_ExtHiTVData;
+ 	const UCHAR *SiS_NTSCTiming;
+@@ -381,12 +427,17 @@ typedef struct _SiS_Private
+ 	const SiS_LVDSDataStruct  *SiS_LVDS1152x768Data_1;
+ 	const SiS_LVDSDataStruct  *SiS_LVDS1152x768Data_2;
+ 	const SiS_LVDSDataStruct  *SiS_LVDS640x480Data_1;
++	const SiS_LVDSDataStruct  *SiS_LVDS640x480Data_2;
+ 	const SiS_LVDSDataStruct  *SiS_LVDS320x480Data_1;
+ 	const SiS_LVDSDataStruct  *SiS_LCDA1400x1050Data_1;
+ 	const SiS_LVDSDataStruct  *SiS_LCDA1400x1050Data_2;
+ 	const SiS_LVDSDataStruct  *SiS_LCDA1600x1200Data_1;
+ 	const SiS_LVDSDataStruct  *SiS_LCDA1600x1200Data_2;
+ 	const SiS_LVDSDataStruct  *SiS_LVDSXXXxXXXData_1;
++	const SiS_LVDSDataStruct  *SiS_LVDSBARCO1366Data_1;
++	const SiS_LVDSDataStruct  *SiS_LVDSBARCO1366Data_2;
++	const SiS_LVDSDataStruct  *SiS_LVDSBARCO1024Data_1;
++	const SiS_LVDSDataStruct  *SiS_LVDSBARCO1024Data_2;
+ 	const SiS_LVDSDataStruct  *SiS_CHTVUNTSCData;
+ 	const SiS_LVDSDataStruct  *SiS_CHTVONTSCData;
+ 	const SiS_LVDSDataStruct  *SiS_CHTVUPALData;
+@@ -478,6 +529,12 @@ typedef struct _SiS_Private
+ 	const SiS_LVDSCRT1DataStruct  *SiS_LVDSCRT11600x1200_2_H;
+ 	const SiS_LVDSCRT1DataStruct  *SiS_LVDSCRT1XXXxXXX_1;
+ 	const SiS_LVDSCRT1DataStruct  *SiS_LVDSCRT1XXXxXXX_1_H;
++	const SiS_LVDSCRT1DataStruct  *SiS_LVDSCRT1640x480_1;
++	const SiS_LVDSCRT1DataStruct  *SiS_LVDSCRT1640x480_1_H;
++	const SiS_LVDSCRT1DataStruct  *SiS_LVDSCRT1640x480_2;
++	const SiS_LVDSCRT1DataStruct  *SiS_LVDSCRT1640x480_2_H;
++	const SiS_LVDSCRT1DataStruct  *SiS_LVDSCRT1640x480_3;
++	const SiS_LVDSCRT1DataStruct  *SiS_LVDSCRT1640x480_3_H;
+ 	const SiS_LVDSCRT1DataStruct  *SiS_CHTVCRT1UNTSC;
+ 	const SiS_LVDSCRT1DataStruct  *SiS_CHTVCRT1ONTSC;
+ 	const SiS_LVDSCRT1DataStruct  *SiS_CHTVCRT1UPAL;
+@@ -507,7 +564,6 @@ typedef struct _SiS_Private
+ 	const SiS_LCDACRT1DataStruct  *SiS_LCDACRT11400x1050_2_H;
+ 	const SiS_LCDACRT1DataStruct  *SiS_LCDACRT11600x1200_2_H;
+ 
+-	/* TW: New for 650/301LV */
+ 	const SiS_Part2PortTblStruct *SiS_CRT2Part2_1024x768_1;
+ 	const SiS_Part2PortTblStruct *SiS_CRT2Part2_1280x1024_1;
+ 	const SiS_Part2PortTblStruct *SiS_CRT2Part2_1400x1050_1;
+@@ -539,6 +595,9 @@ typedef struct _SiS_Private
+ 	const UCHAR *SiS_CHTVVCLKUPALN;
+ 	const UCHAR *SiS_CHTVVCLKOPALN;
+ 	const UCHAR *SiS_CHTVVCLKSOPAL;
++
++	USHORT  PanelXRes;
++	USHORT  PanelYRes;
+ 	
+ 	BOOLEAN UseCustomMode;
+ 	BOOLEAN CRT1UsesCustomMode;
+@@ -560,8 +619,11 @@ typedef struct _SiS_Private
+ 	UCHAR   CSR2B;
+ 	UCHAR   CSR2C;
+ 	USHORT  CSRClock;
++	USHORT  CSRClock_CRT1;
+ 	USHORT  CModeFlag;
++	USHORT  CModeFlag_CRT1;
+ 	USHORT  CInfoFlag;
++
+ 	BOOLEAN SiS_CHPALM;
+ 	BOOLEAN SiS_CHPALN;
+ 	
+@@ -578,7 +640,21 @@ typedef struct _SiS_Private
+ 	UCHAR Backup_1c;
+ 	UCHAR Backup_1d;
+ 	
+-	int    UsePanelScaler;
++	int     UsePanelScaler;
++
++	USHORT  CP_Vendor, CP_Product;
++	BOOLEAN CP_HaveCustomData;
++	int     CP_PreferredX, CP_PreferredY;
++	int	CP_MaxX, CP_MaxY, CP_MaxClock;
++	int     CP_HDisplay[7], CP_VDisplay[7];	/* For Custom LCD panel dimensions */
++    	int     CP_HTotal[7], CP_VTotal[7];
++    	int     CP_HSyncStart[7], CP_VSyncStart[7];
++    	int     CP_HSyncEnd[7], CP_VSyncEnd[7];
++	int     CP_HBlankStart[7], CP_VBlankStart[7];
++	int     CP_HBlankEnd[7], CP_VBlankEnd[7];
++    	int     CP_Clock[7];
++	BOOLEAN CP_DataValid[7];
++	BOOLEAN CP_HSync_P[7], CP_VSync_P[7], CP_SyncValid[7];
+ } SiS_Private;
+ 
+ #endif
+--- linux-2.6.0-test1/drivers/video/skeletonfb.c	2003-06-14 12:17:59.000000000 -0700
++++ 25/drivers/video/skeletonfb.c	2003-07-19 17:04:55.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  * linux/drivers/video/skeletonfb.c -- Skeleton for a frame buffer device
+  *
+- *  Modified to new api Jan 2001 by James Simmons (jsimmons@transvirtual.com)
++ *  Modified to new api Jan 2001 by James Simmons (jsimmons@infradead.org)
+  *
+  *  Created 28 Dec 1997 by Geert Uytterhoeven
+  *
+@@ -469,15 +469,71 @@ void xxxfb_imageblit(struct fb_info *p, 
+ int xxxfb_cursor(struct fb_info *info, struct fb_cursor *cursor)
+ {
+ /*
+- *      @set: 	Which fields we are altering in struct fb_cursor 
++ *      @set: 	 Which fields we are altering in struct fb_cursor 
+  *	@enable: Disable or enable the cursor 
+- *      @rop: 	The bit operation we want to do. 
+- *      @mask:  This is the cursor mask bitmap. 
+- *      @dest:  A image of the area we are going to display the cursor.
+- *		Used internally by the driver.	 
+- *      @hot:	The hot spot. 
+- *	@image:	The actual data for the cursor image.
++ *      @rop: 	 The bit operation we want to do. 
++ *      @hot:	 The hot spot. 
++ *	@image:	 The actual data for the cursor image.
++ *      @mask:   This is the cursor mask bitmap. 
+  */
++
++   /* Disable hardware cursor. We don't want to display the cursor 
++      while changing it. Note we use the enable and rop fields in
++      struct fb_cursor that is apart of struct fb_info. Not the 
++      cursor data passed in from userland. */	
++
++   if (cursor->set & FB_CUR_SETHOT) {
++	info->cursor.hot = cursor->hot;
++   	/* Set the hardware cursor's hot spot  */	   	 	
++   }
++	
++   if (cursor->set & FB_CUR_SETPOS) {
++	info->cursor.image.dx = cursor->image.dx;
++	info->cursor.image.dy = cursor->image.dy;
++   	/* Set the hardware cursor's position */
++   }
++
++   if (cursor->set & FB_CUR_SETSIZE) {
++	info->cursor.image.height = cursor->image.height;
++	info->cursor.image.width = cursor->image.width;
++   	/* Set the hardware cursor's size */	
++   }
++  
++   if (cursor->set & FB_CUR_SETCMAP) {
++	if (cursor->image.depth == 1) {
++		info->cursor.image.fg_color = cursor->image.fg_color;
++		info->cursor.image.bg_color = cursor->image.bg_color;
++	} else {
++		if (cursor->image.cmap.len)
++			fb_copy_cmap(&cursor->image.cmap, &info->cursor.image.cmap, 0);
++	}
++	info->curosr.image.depth = cursor->image.depth;
++
++   	/* Set the hardware cursor's color map */
++   }
++
++   /* 
++    * Set the cursor shape. The two pieces needed to create
++    * the final image is mask and image.data. The mask is 
++    * combined with image.data according to the rop field.
++    */
++   if (cursor->set & FB_CUR_SETSHAPE) {
++ 	switch (info->cursor.rop) {
++	case ROP_XOR:
++		/* ... */
++		break;
++	case ROP_COPY:
++	default:
++		/* ... */
++		break;
++   	}
++	/* ... */
++   }
++   
++   if (info->cursor.enable) {
++	/* Now we turn the hardware cursor on */
++   }
++   return 0;						
+ }
+ 
+ /**
+--- linux-2.6.0-test1/drivers/video/softcursor.c	2003-06-14 12:18:22.000000000 -0700
++++ 25/drivers/video/softcursor.c	2003-07-19 17:04:55.000000000 -0700
+@@ -21,9 +21,14 @@ int soft_cursor(struct fb_info *info, st
+ {
+ 	unsigned int scan_align = info->pixmap.scan_align - 1;
+ 	unsigned int buf_align = info->pixmap.buf_align - 1;
+-	unsigned int i, size, dsize, s_pitch, d_pitch;
+-	u8 *dst, src[64];
+-
++	u8 *dst = (u8 *) info->cursor.image.data;
++	unsigned int i, size, pitch;
++		
++	pitch = ((info->cursor.image.width + 7) >> 3) + scan_align;
++	pitch &= ~scan_align;
++	size = pitch * info->cursor.image.height + buf_align;
++	size &= ~buf_align;
++	
+ 	if (cursor->set & FB_CUR_SETSIZE) {
+ 		info->cursor.image.height = cursor->image.height;
+ 		info->cursor.image.width = cursor->image.width;
+@@ -48,34 +53,27 @@ int soft_cursor(struct fb_info *info, st
+ 		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) {
++	if (cursor->set & FB_CUR_SETSHAPE) {
+ 		switch (info->cursor.rop) {
+ 		case ROP_XOR:
+-			for (i = 0; i < dsize; i++)
+-				src[i] = cursor->image.data[i] ^ info->cursor.mask[i]; 
++			for (i = 0; i < size; i++)
++				dst[i] ^= info->cursor.mask[i]; 
+ 			break;
+ 		case ROP_COPY:
+ 		default:
+-			for (i = 0; i < dsize; i++)
+-				src[i] = cursor->image.data[i] & info->cursor.mask[i];
++			for (i = 0; i < size; i++)
++				dst[i] &= info->cursor.mask[i];
+ 			break;
+ 		}
+-	} 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();
++	if (!info->cursor.enable) {
++		for (i = 0; i < size; i++)
++			dst[i] ^= info->cursor.mask[i]; 
++	}
++		
++	if (info->cursor.image.data)
++		info->fbops->fb_imageblit(info, &info->cursor.image);
+ 	return 0;
+ }
+ 
+--- linux-2.6.0-test1/drivers/video/valkyriefb.c	2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/video/valkyriefb.c	2003-07-19 17:04:55.000000000 -0700
+@@ -51,7 +51,6 @@
+ #include <linux/delay.h>
+ #include <linux/interrupt.h>
+ #include <linux/fb.h>
+-#include <linux/selection.h>
+ #include <linux/init.h>
+ #include <linux/pci.h>
+ #include <linux/nvram.h>
+@@ -66,15 +65,9 @@
+ #endif
+ #include <asm/pgtable.h>
+ 
+-#include <video/fbcon.h>
+-#include <video/fbcon-cfb8.h>
+-#include <video/fbcon-cfb16.h>
+-#include <video/macmodes.h>
+-
++#include "macmodes.h"
+ #include "valkyriefb.h"
+ 
+-static int can_soft_blank = 1;
+-
+ #ifdef CONFIG_MAC
+ /* We don't yet have functions to read the PRAM... perhaps we can
+    adapt them from the PPC code? */
+@@ -84,27 +77,17 @@ static int default_cmode = CMODE_8;
+ static int default_vmode = VMODE_NVRAM;
+ static int default_cmode = CMODE_NVRAM;
+ #endif
+-static char fontname[40] __initdata = { 0 };
+-
+-static int switching = 0;
+ 
+ struct fb_par_valkyrie {
+ 	int	vmode, cmode;
+ 	int	xres, yres;
+ 	int	vxres, vyres;
+-	int	xoffset, yoffset;
++	struct valkyrie_regvals *init;
+ };
+ 
+ struct fb_info_valkyrie {
+-	struct fb_info			info;
+-	struct fb_fix_screeninfo	fix;
+-	struct fb_var_screeninfo	var;
+-	struct display			disp;
+-	struct fb_par_valkyrie		par;
+-	struct {
+-	    __u8 red, green, blue;
+-	}			palette[256];
+-	
++	struct fb_info		info;
++	struct fb_par_valkyrie	par;
+ 	struct cmap_regs	*cmap_regs;
+ 	unsigned long		cmap_regs_phys;
+ 	
+@@ -116,9 +99,8 @@ struct fb_info_valkyrie {
+ 	
+ 	int			sense;
+ 	unsigned long		total_vram;
+-#ifdef FBCON_HAS_CFB16
+-	u16 fbcon_cfb16_cmap[16];
+-#endif
++
++	u32			pseudo_palette[16];
+ };
+ 
+ /*
+@@ -127,10 +109,9 @@ struct fb_info_valkyrie {
+ int valkyriefb_init(void);
+ int valkyriefb_setup(char*);
+ 
+-static int valkyrie_set_var(struct fb_var_screeninfo *var, int con,
+-			 struct fb_info *info);
+-static int valkyrie_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+-			  struct fb_info *info);
++static int valkyriefb_check_var(struct fb_var_screeninfo *var,
++				struct fb_info *info);
++static int valkyriefb_set_par(struct fb_info *info);
+ static int valkyriefb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
+ 			     u_int transp, struct fb_info *info);
+ static int valkyriefb_blank(int blank_mode, struct fb_info *info);
+@@ -138,136 +119,69 @@ static int valkyriefb_blank(int blank_mo
+ static int read_valkyrie_sense(struct fb_info_valkyrie *p);
+ static inline int valkyrie_vram_reqd(int video_mode, int color_mode);
+ static void set_valkyrie_clock(unsigned char *params);
+-static void valkyrie_set_par(const struct fb_par_valkyrie *p, struct fb_info_valkyrie *info);
+ static inline int valkyrie_par_to_var(struct fb_par_valkyrie *par, struct fb_var_screeninfo *var);
+ static int valkyrie_var_to_par(struct fb_var_screeninfo *var,
+ 	struct fb_par_valkyrie *par, const struct fb_info *fb_info);
+ 
+ static void valkyrie_init_info(struct fb_info *info, struct fb_info_valkyrie *p);
+-static void valkyrie_par_to_display(struct fb_par_valkyrie *par,
+-  struct display *disp, struct fb_fix_screeninfo *fix, struct fb_info_valkyrie *p);
+-static void valkyrie_init_display(struct display *disp);
+-static void valkyrie_par_to_fix(struct fb_par_valkyrie *par, struct fb_fix_screeninfo *fix,
+-	struct fb_info_valkyrie *p);
++static void valkyrie_par_to_fix(struct fb_par_valkyrie *par, struct fb_fix_screeninfo *fix);
+ static void valkyrie_init_fix(struct fb_fix_screeninfo *fix, struct fb_info_valkyrie *p);
+ 
+ static struct fb_ops valkyriefb_ops = {
+ 	.owner =	THIS_MODULE,
+-	.fb_set_var =	valkyrie_set_var,
+-	.fb_get_cmap =	valkyrie_get_cmap,
+-	.fb_set_cmap =	gen_set_cmap,
++	.fb_check_var =	valkyriefb_check_var,
++	.fb_set_par =	valkyriefb_set_par,
+ 	.fb_setcolreg =	valkyriefb_setcolreg,
+ 	.fb_blank =	valkyriefb_blank,
++	.fb_fillrect	= cfb_fillrect,
++	.fb_copyarea	= cfb_copyarea,
++	.fb_imageblit	= cfb_imageblit,
++	.fb_cursor	= soft_cursor,
+ };
+ 
+-static int valkyriefb_getcolreg(u_int regno, u_int *red, u_int *green,
+-			     u_int *blue, u_int *transp, struct fb_info *info);
+-
+-/* Sets everything according to var */
+-static int valkyrie_set_var(struct fb_var_screeninfo *var, int con,
+-			 struct fb_info *info)
++/* Sets the video mode according to info->var */
++static int valkyriefb_set_par(struct fb_info *info)
+ {
+ 	struct fb_info_valkyrie *p = (struct fb_info_valkyrie *) info;
+-	struct display *disp;
+-	struct fb_par_valkyrie par;
+-	int depthchange, err;
++	volatile struct valkyrie_regs *valkyrie_regs = p->valkyrie_regs;
++	struct fb_par_valkyrie *par = info->par;
++	struct valkyrie_regvals	*init;
++	int err;
+ 
+-	disp = (con >= 0) ? &fb_display[con] : &p->disp;
+-	if ((err = valkyrie_var_to_par(var, &par, info))) {
+-		 /* printk (KERN_ERR "Error in valkyrie_set_var, calling valkyrie_var_to_par: %d.\n", err); */
++	if ((err = valkyrie_var_to_par(&info->var, par, info)))
+ 		return err;
+-	}
+-	
+-	if ((var->activate & FB_ACTIVATE_MASK) != FB_ACTIVATE_NOW) {
+-		/* printk(KERN_ERR "Not activating, in valkyrie_set_var.\n"); */
+-		valkyrie_par_to_var(&par, var);
+-		return 0;
+-	}
+ 
+-	/*
+-	 * I know, we want to use fb_display[con], but grab certain info
+-	 * from p->var instead.
+-	 */
+-#define DIRTY(x) (p->var.x != var->x)
+-	depthchange = DIRTY(bits_per_pixel);
+-	/* adding "&& !DIRTY(pixclock)" corrects vmode-switching problems */
+-	if(!DIRTY(xres) && !DIRTY(yres) && !DIRTY(xres_virtual) &&
+-	   !DIRTY(yres_virtual) && !DIRTY(bits_per_pixel) && !DIRTY(pixclock)) {
+-	   	valkyrie_par_to_var(&par, var);
+-		p->var = disp->var = *var;
+-		return 0;
+-	}
++	valkyrie_par_to_fix(par, &info->fix);
+ 
+-	p->par = par;
+-	valkyrie_par_to_var(&par, var);
+-	p->var = *var;
+-	valkyrie_par_to_fix(&par, &p->fix, p);
+-	valkyrie_par_to_display(&par, disp, &p->fix, p);
+-	p->disp = *disp;
+-	
+-	if (info->changevar && !switching) {
+-		/* Don't want to do this if just switching consoles. */
+-		(*info->changevar)(con);
+-	}
+-	if (con == info->currcon)
+-		valkyrie_set_par(&par, p);
+-	if (depthchange)
+-		if ((err = fb_alloc_cmap(&disp->cmap, 0, 0)))
+-			return err;
+-	if (depthchange || switching)
+-		do_install_cmap(con, info);
+-	return 0;
+-}
++	/* Reset the valkyrie */
++	out_8(&valkyrie_regs->status.r, 0);
++	udelay(100);
+ 
+-static int valkyrie_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+-			  struct fb_info *info)
+-{
+-	if (con == info->currcon)	{
+-		/* current console? */
+-		return fb_get_cmap(cmap, kspc, valkyriefb_getcolreg, info);
+-	}
+-	if (fb_display[con].cmap.len) { /* non default colormap? */
+-		fb_copy_cmap(&fb_display[con].cmap, cmap, kspc? 0: 2);
+-	}
+-	else {
+-		int size = fb_display[con].var.bits_per_pixel == 16 ? 32 : 256;
+-		fb_copy_cmap(fb_default_cmap(size), cmap, kspc ? 0 : 2);
+-	}
+-	return 0;
+-}
++	/* Initialize display timing registers */
++	init = par->init;
++	out_8(&valkyrie_regs->mode.r, init->mode | 0x80);
++	out_8(&valkyrie_regs->depth.r, par->cmode + 3);
++	set_valkyrie_clock(init->clock_params);
++	udelay(100);
+ 
+-static int valkyriefb_switch(int con, struct fb_info *fb)
+-{
+-	struct fb_info_valkyrie *info = (struct fb_info_valkyrie *) fb;
+-	struct fb_par_valkyrie par;
++	/* Turn on display */
++	out_8(&valkyrie_regs->mode.r, init->mode);
+ 
+-	if (fb_display[fb->currcon].cmap.len)
+-		fb_get_cmap(&fb_display[fb->currcon].cmap, 1, valkyriefb_getcolreg,
+-			    fb);
+-	fb->currcon = con;
+-#if 1
+-	valkyrie_var_to_par(&fb_display[fb->currcon].var, &par, fb);
+-	valkyrie_set_par(&par, info);
+-	do_install_cmap(con, fb);
+-#else
+-	/* I see no reason not to do this.  Minus info->changevar(). */
+-	/* DOH.  This makes valkyrie_set_var compare, you guessed it, */
+-	/* fb_display[con].var (first param), and fb_display[con].var! */
+-	/* Perhaps I just fixed that... */
+-	switching = 1;
+-	valkyrie_set_var(&fb_display[con].var, con, info);
+-	switching = 0;
+-#endif
+ 	return 0;
+ }
+ 
+-static int valkyriefb_updatevar(int con, struct fb_info *info)
++static int
++valkyriefb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
+ {
++	int err;
++	struct fb_par_valkyrie par;
++
++	if ((err = valkyrie_var_to_par(var, &par, info)))
++		return err;
++	valkyrie_par_to_var(&par, var);
+ 	return 0;
+ }
+ 
+-static int valkyriefb_blank(int blank_mode, struct fb_info *info)
+-{
+ /*
+  *  Blank the screen if blank_mode != 0, else unblank. If blank_mode == NULL
+  *  then the caller blanks by setting the CLUT (Color Look Up Table) to all
+@@ -278,48 +192,34 @@ static int valkyriefb_blank(int blank_mo
+  *    blank_mode == 3: suspend hsync
+  *    blank_mode == 4: powerdown
+  */
+-	struct fb_info_valkyrie *p = (struct fb_info_valkyrie *) info;
+-	struct valkyrie_regvals	*init;
+-	unsigned char vmode;
+-
+-	if (p->disp.can_soft_blank
+-	 && ((vmode = p->par.vmode) > 0)
+-	 && (vmode <= VMODE_MAX)
+-	 && ((init = valkyrie_reg_init[vmode - 1]) != NULL)) {
+-		if (blank_mode)
+-			--blank_mode;
+-		switch (blank_mode) {
+-		default:	/* unblank */
+-			out_8(&p->valkyrie_regs->mode.r, init->mode);
+-			break;
+-		case VESA_VSYNC_SUSPEND:
+-		case VESA_HSYNC_SUSPEND:
+-			/*
+-			 * [kps] Value extracted from MacOS. I don't know
+-			 * whether this bit disables hsync or vsync, or
+-			 * whether the hardware can do the other as well.
+-			 */
+-			out_8(&p->valkyrie_regs->mode.r, init->mode | 0x40);
+-			break;
+-		case VESA_POWERDOWN:
+-			out_8(&p->valkyrie_regs->mode.r, 0x66);
+-			break;
+-		}
+-	}
+-	return 0;
+-}
+-
+-static int valkyriefb_getcolreg(u_int regno, u_int *red, u_int *green,
+-			     u_int *blue, u_int *transp, struct fb_info *info)
++static int valkyriefb_blank(int blank_mode, struct fb_info *info)
+ {
+ 	struct fb_info_valkyrie *p = (struct fb_info_valkyrie *) info;
++	struct fb_par_valkyrie *par = info->par;
++	struct valkyrie_regvals	*init = par->init;
+ 
+-	if (regno > 255)
++	if (init == NULL)
+ 		return 1;
+-	*red = (p->palette[regno].red<<8) | p->palette[regno].red;
+-	*green = (p->palette[regno].green<<8) | p->palette[regno].green;
+-	*blue = (p->palette[regno].blue<<8) | p->palette[regno].blue;
+ 
++	switch (blank_mode) {
++	case 0:			/* unblank */
++		out_8(&p->valkyrie_regs->mode.r, init->mode);
++		break;
++	case 1:
++		return 1;	/* get caller to set CLUT to all black */
++	case VESA_VSYNC_SUSPEND+1:
++	case VESA_HSYNC_SUSPEND+1:
++		/*
++		 * [kps] Value extracted from MacOS. I don't know
++		 * whether this bit disables hsync or vsync, or
++		 * whether the hardware can do the other as well.
++		 */
++		out_8(&p->valkyrie_regs->mode.r, init->mode | 0x40);
++		break;
++	case VESA_POWERDOWN+1:
++		out_8(&p->valkyrie_regs->mode.r, 0x66);
++		break;
++	}
+ 	return 0;
+ }
+ 
+@@ -328,16 +228,13 @@ static int valkyriefb_setcolreg(u_int re
+ {
+ 	struct fb_info_valkyrie *p = (struct fb_info_valkyrie *) info;
+ 	volatile struct cmap_regs *cmap_regs = p->cmap_regs;
+-
++	struct fb_par_valkyrie *par = info->par;
+ 
+ 	if (regno > 255)
+ 		return 1;
+ 	red >>= 8;
+ 	green >>= 8;
+ 	blue >>= 8;
+-	p->palette[regno].red = red;
+-	p->palette[regno].green = green;
+-	p->palette[regno].blue = blue;
+ 
+ 	/* tell clut which address to fill */
+ 	out_8(&p->cmap_regs->addr, regno);
+@@ -347,11 +244,9 @@ static int valkyriefb_setcolreg(u_int re
+ 	out_8(&cmap_regs->lut, green);
+ 	out_8(&cmap_regs->lut, blue);
+ 
+-	if (regno < 16) {
+-#ifdef FBCON_HAS_CFB16
+-		p->fbcon_cfb16_cmap[regno] = (regno << 10) | (regno << 5) | regno;
+-#endif
+-	}
++	if (regno < 16 && par->cmode == CMODE_16)
++		((u32 *)info->pseudo_palette)[regno] =
++			(regno << 10) | (regno << 5) | regno;
+ 
+ 	return 0;
+ }
+@@ -359,10 +254,11 @@ static int valkyriefb_setcolreg(u_int re
+ static int valkyrie_vram_reqd(int video_mode, int color_mode)
+ {
+ 	int pitch;
++	struct valkyrie_regvals *init = valkyrie_reg_init[video_mode-1];
+ 	
+-	if ((pitch = valkyrie_reg_init[video_mode-1]->pitch[color_mode]) == 0)
+-		pitch = 2 * valkyrie_reg_init[video_mode-1]->pitch[0];
+-	return valkyrie_reg_init[video_mode-1]->vres * pitch;
++	if ((pitch = init->pitch[color_mode]) == 0)
++		pitch = 2 * init->pitch[0];
++	return init->vres * pitch;
+ }
+ 
+ static void set_valkyrie_clock(unsigned char *params)
+@@ -380,14 +276,10 @@ static void set_valkyrie_clock(unsigned 
+ #endif
+ }
+ 
+-static void __init init_valkyrie(struct fb_info_valkyrie *p)
++static void __init valkyrie_choose_mode(struct fb_info_valkyrie *p)
+ {
+-	struct fb_par_valkyrie *par = &p->par;
+-	struct fb_var_screeninfo var;
+-	int j, k;
+-
+ 	p->sense = read_valkyrie_sense(p);
+-	printk(KERN_INFO "Monitor sense value = 0x%x, ", p->sense);
++	printk(KERN_INFO "Monitor sense value = 0x%x\n", p->sense);
+ 
+ 	/* Try to pick a video mode out of NVRAM if we have one. */
+ #ifndef CONFIG_MAC
+@@ -409,80 +301,22 @@ static void __init init_valkyrie(struct 
+ #endif
+ 
+ 	/*
+-	 * Reduce the pixel size if we don't have enough VRAM or bandwitdh.
++	 * Reduce the pixel size if we don't have enough VRAM or bandwidth.
+ 	 */
+-	if (default_cmode < CMODE_8
+-	 || default_cmode > CMODE_16
+-	 || valkyrie_reg_init[default_vmode-1]->pitch[default_cmode] == 0
+-	 || valkyrie_vram_reqd(default_vmode, default_cmode) > p->total_vram)
++	if (default_cmode < CMODE_8 || default_cmode > CMODE_16
++	    || valkyrie_reg_init[default_vmode-1]->pitch[default_cmode] == 0
++	    || valkyrie_vram_reqd(default_vmode, default_cmode) > p->total_vram)
+ 		default_cmode = CMODE_8;
+-	
+-	printk(KERN_INFO "using video mode %d and color mode %d.\n", default_vmode, default_cmode);
+ 
+-	mac_vmode_to_var(default_vmode, default_cmode, &var);
+-	if (valkyrie_var_to_par(&var, par, &p->info)) {
+-	    printk(KERN_ERR "valkyriefb: can't set default video mode\n");
+-	    return ;
+-	}
+-	
+-	valkyrie_init_fix(&p->fix, p);
+-	valkyrie_par_to_fix(&p->par, &p->fix, p);
+-	valkyrie_par_to_var(&p->par, &p->var);
+-	valkyrie_init_display(&p->disp);
+-	valkyrie_par_to_display(&p->par, &p->disp, &p->fix, p);
+-	valkyrie_init_info(&p->info, p);
+-
+-	/* Initialize colormap */
+-	for (j = 0; j < 16; j++) {
+-		k = color_table[j];
+-		p->palette[j].red = default_red[k];
+-		p->palette[j].green = default_grn[k];
+-		p->palette[j].blue = default_blu[k];
+-	}
+-	
+-	valkyrie_set_var (&var, -1, &p->info);
+-
+-	if (register_framebuffer(&p->info) < 0) {
+-		kfree(p);
+-		return;
+-	}
+-	
+-	printk(KERN_INFO "fb%d: valkyrie frame buffer device\n", p->info.node);	
+-}
+-
+-static void valkyrie_set_par(const struct fb_par_valkyrie *par,
+-			     struct fb_info_valkyrie *p)
+-{
+-	struct valkyrie_regvals	*init;
+-	volatile struct valkyrie_regs *valkyrie_regs = p->valkyrie_regs;
+-	int vmode, cmode;
+-	
+-	vmode = par->vmode;
+-	cmode = par->cmode;
+-	
+-	if (vmode <= 0
+-	 || vmode > VMODE_MAX
+-	 || (init = valkyrie_reg_init[vmode - 1]) == NULL)
+-		panic("valkyrie: display mode %d not supported", vmode);
+-
+-	/* Reset the valkyrie */
+-	out_8(&valkyrie_regs->status.r, 0);
+-	udelay(100);
+-
+-	/* Initialize display timing registers */
+-	out_8(&valkyrie_regs->mode.r, init->mode | 0x80);
+-	out_8(&valkyrie_regs->depth.r, cmode + 3);
+-	set_valkyrie_clock(init->clock_params);
+-	udelay(100);
+-
+-	/* Turn on display */
+-	out_8(&valkyrie_regs->mode.r, init->mode);
++	printk(KERN_INFO "using video mode %d and color mode %d.\n",
++	       default_vmode, default_cmode);
+ }
+ 
+ int __init valkyriefb_init(void)
+ {
+ 	struct fb_info_valkyrie	*p;
+ 	unsigned long frame_buffer_phys, cmap_regs_phys, flags;
++	int err;
+ 
+ #ifdef CONFIG_MAC
+ 	if (!MACH_IS_MAC)
+@@ -503,10 +337,11 @@ int __init valkyriefb_init(void)
+ 	if (dp == 0)
+ 		return 0;
+ 
+-	if(dp->n_addrs != 1) {
+-		printk(KERN_ERR "expecting 1 address for valkyrie (got %d)", dp->n_addrs);
++	if (dp->n_addrs != 1) {
++		printk(KERN_ERR "expecting 1 address for valkyrie (got %d)\n",
++		       dp->n_addrs);
+ 		return 0;
+-	}	
++	}
+ 
+ 	frame_buffer_phys = dp->addrs[0].address;
+ 	cmap_regs_phys = dp->addrs[0].address+0x304000;
+@@ -515,7 +350,7 @@ int __init valkyriefb_init(void)
+ 
+ 	p = kmalloc(sizeof(*p), GFP_ATOMIC);
+ 	if (p == 0)
+-		return 0;
++		return -ENOMEM;
+ 	memset(p, 0, sizeof(*p));
+ 
+ 	/* Map in frame buffer and registers */
+@@ -524,14 +359,42 @@ int __init valkyriefb_init(void)
+ 		return 0;
+ 	}
+ 	p->total_vram = 0x100000;
+-	p->frame_buffer_phys  = frame_buffer_phys;
++	p->frame_buffer_phys = frame_buffer_phys;
+ 	p->frame_buffer = __ioremap(frame_buffer_phys, p->total_vram, flags);
+ 	p->cmap_regs_phys = cmap_regs_phys;
+ 	p->cmap_regs = ioremap(p->cmap_regs_phys, 0x1000);
+ 	p->valkyrie_regs_phys = cmap_regs_phys+0x6000;
+ 	p->valkyrie_regs = ioremap(p->valkyrie_regs_phys, 0x1000);
+-	init_valkyrie(p);
++	err = -ENOMEM;
++	if (p->frame_buffer == NULL || p->cmap_regs == NULL
++	    || p->valkyrie_regs == NULL) {
++		printk(KERN_ERR "valkyriefb: couldn't map resources\n");
++		goto out_free;
++	}
++
++	valkyrie_choose_mode(p);
++	mac_vmode_to_var(default_vmode, default_cmode, &p->info.var);
++	valkyrie_init_info(&p->info, p);
++	valkyrie_init_fix(&p->info.fix, p);
++	if (valkyriefb_set_par(&p->info))
++		/* "can't happen" */
++		printk(KERN_ERR "valkyriefb: can't set default video mode\n");
++
++	if ((err = register_framebuffer(&p->info)) != 0)
++		goto out_free;
++
++	printk(KERN_INFO "fb%d: valkyrie frame buffer device\n", p->info.node);
+ 	return 0;
++
++ out_free:
++	if (p->frame_buffer)
++		iounmap(p->frame_buffer);
++	if (p->cmap_regs)
++		iounmap(p->cmap_regs);
++	if (p->valkyrie_regs)
++		iounmap(p->valkyrie_regs);
++	kfree(p);
++	return err;
+ }
+ 
+ /*
+@@ -541,22 +404,22 @@ static int read_valkyrie_sense(struct fb
+ {
+ 	int sense, in;
+ 
+-    out_8(&p->valkyrie_regs->msense.r, 0);   /* release all lines */
+-    __delay(20000);
+-    sense = ((in = in_8(&p->valkyrie_regs->msense.r)) & 0x70) << 4;
+-    /* drive each sense line low in turn and collect the other 2 */
+-    out_8(&p->valkyrie_regs->msense.r, 4);   /* drive A low */
+-    __delay(20000);
+-    sense |= ((in = in_8(&p->valkyrie_regs->msense.r)) & 0x30);
+-    out_8(&p->valkyrie_regs->msense.r, 2);   /* drive B low */
+-    __delay(20000);
+-    sense |= ((in = in_8(&p->valkyrie_regs->msense.r)) & 0x40) >> 3;
++	out_8(&p->valkyrie_regs->msense.r, 0);   /* release all lines */
++	__delay(20000);
++	sense = ((in = in_8(&p->valkyrie_regs->msense.r)) & 0x70) << 4;
++	/* drive each sense line low in turn and collect the other 2 */
++	out_8(&p->valkyrie_regs->msense.r, 4);   /* drive A low */
++	__delay(20000);
++	sense |= ((in = in_8(&p->valkyrie_regs->msense.r)) & 0x30);
++	out_8(&p->valkyrie_regs->msense.r, 2);   /* drive B low */
++	__delay(20000);
++	sense |= ((in = in_8(&p->valkyrie_regs->msense.r)) & 0x40) >> 3;
+ 	sense |= (in & 0x10) >> 2;
+-    out_8(&p->valkyrie_regs->msense.r, 1);   /* drive C low */
+-    __delay(20000);
+-    sense |= ((in = in_8(&p->valkyrie_regs->msense.r)) & 0x60) >> 5;
++	out_8(&p->valkyrie_regs->msense.r, 1);   /* drive C low */
++	__delay(20000);
++	sense |= ((in = in_8(&p->valkyrie_regs->msense.r)) & 0x60) >> 5;
+ 
+-    out_8(&p->valkyrie_regs->msense.r, 7);
++	out_8(&p->valkyrie_regs->msense.r, 7);
+ 
+ 	return sense;
+ }
+@@ -565,8 +428,6 @@ static int read_valkyrie_sense(struct fb
+  * This routine takes a user-supplied var,
+  * and picks the best vmode/cmode from it.
+  */
+-static int valkyrie_var_to_par(struct fb_var_screeninfo *var,
+-	struct fb_par_valkyrie *par, const struct fb_info *fb_info)
+ 
+ /* [bkn] I did a major overhaul of this function.
+  *
+@@ -589,55 +450,56 @@ static int valkyrie_var_to_par(struct fb
+  * good start...
+  */
+ 
++static int valkyrie_var_to_par(struct fb_var_screeninfo *var,
++	struct fb_par_valkyrie *par, const struct fb_info *fb_info)
+ {
+-	int bpp = var->bits_per_pixel;
++	int vmode, cmode;
+ 	struct valkyrie_regvals *init;
+ 	struct fb_info_valkyrie *p = (struct fb_info_valkyrie *) fb_info;
+ 
+-
+-	if(mac_var_to_vmode(var, &par->vmode, &par->cmode) != 0) {
+-		printk(KERN_ERR "valkyrie_var_to_par: %dx%dx%d unsuccessful.\n",var->xres,var->yres,var->bits_per_pixel);
++	if (mac_var_to_vmode(var, &vmode, &cmode) != 0) {
++		printk(KERN_ERR "valkyriefb: can't do %dx%dx%d.\n",
++		       var->xres, var->yres, var->bits_per_pixel);
+ 		return -EINVAL;
+ 	}
+ 
+ 	/* Check if we know about the wanted video mode */
+-	if(!valkyrie_reg_init[par->vmode-1]) {
+-		printk(KERN_ERR "valkyrie_var_to_par: vmode %d not valid.\n", par->vmode);
++	if (vmode < 1 || vmode > VMODE_MAX || !valkyrie_reg_init[vmode-1]) {
++		printk(KERN_ERR "valkyriefb: vmode %d not valid.\n", vmode);
+ 		return -EINVAL;
+ 	}
+-
+-	par->xres = var->xres;
+-	par->yres = var->yres;
+-	par->xoffset = 0;
+-	par->yoffset = 0;
+-	par->vxres = par->xres;
+-	par->vyres = par->yres;
+ 	
+-	if (var->xres_virtual > var->xres || var->yres_virtual > var->yres
+-		|| var->xoffset != 0 || var->yoffset != 0) {
++	if (cmode != CMODE_8 && cmode != CMODE_16) {
++		printk(KERN_ERR "valkyriefb: cmode %d not valid.\n", cmode);
+ 		return -EINVAL;
+ 	}
+ 
+-	if (bpp <= 8)
+-		par->cmode = CMODE_8;
+-	else if (bpp <= 16)
+-		par->cmode = CMODE_16;
+-	else {
+-		printk(KERN_ERR "valkyrie_var_to_par: cmode %d not supported.\n", par->cmode);
++	if (var->xres_virtual > var->xres || var->yres_virtual > var->yres
++	    || var->xoffset != 0 || var->yoffset != 0) {
+ 		return -EINVAL;
+ 	}
+ 
+-	init = valkyrie_reg_init[par->vmode-1];
+-	if (init->pitch[par->cmode] == 0) {
+-		printk(KERN_ERR "valkyrie_var_to_par: vmode %d does not support cmode %d.\n", par->vmode, par->cmode);
++	init = valkyrie_reg_init[vmode-1];
++	if (init->pitch[cmode] == 0) {
++		printk(KERN_ERR "valkyriefb: vmode %d does not support "
++		       "cmode %d.\n", vmode, cmode);
+ 		return -EINVAL;
+ 	}
+ 
+-	if (valkyrie_vram_reqd(par->vmode, par->cmode) > p->total_vram) {
+-		printk(KERN_ERR "valkyrie_var_to_par: not enough ram for vmode %d, cmode %d.\n", par->vmode, par->cmode);
++	if (valkyrie_vram_reqd(vmode, cmode) > p->total_vram) {
++		printk(KERN_ERR "valkyriefb: not enough ram for vmode %d, "
++		       "cmode %d.\n", vmode, cmode);
+ 		return -EINVAL;
+ 	}
+ 
++	par->vmode = vmode;
++	par->cmode = cmode;
++	par->init = init;
++	par->xres = var->xres;
++	par->yres = var->yres;
++	par->vxres = par->xres;
++	par->vyres = par->yres;
++
+ 	return 0;
+ }
+ 
+@@ -653,7 +515,9 @@ static void valkyrie_init_fix(struct fb_
+ 	fix->mmio_start = p->valkyrie_regs_phys;
+ 	fix->mmio_len = sizeof(struct valkyrie_regs);
+ 	fix->type = FB_TYPE_PACKED_PIXELS;
+-	
++	fix->smem_start = p->frame_buffer_phys + 0x1000;
++	fix->smem_len = p->total_vram;
++
+ 	fix->type_aux = 0;
+ 	fix->ywrapstep = 0;
+ 	fix->ypanstep = 0;
+@@ -663,67 +527,23 @@ static void valkyrie_init_fix(struct fb_
+ 
+ /* Fix must already be inited above */
+ static void valkyrie_par_to_fix(struct fb_par_valkyrie *par,
+-	struct fb_fix_screeninfo *fix,
+-	struct fb_info_valkyrie *p)
++	struct fb_fix_screeninfo *fix)
+ {
+-	fix->smem_start = p->frame_buffer_phys + 0x1000;
+-#if 1
+ 	fix->smem_len = valkyrie_vram_reqd(par->vmode, par->cmode);
+-#else
+-	fix->smem_len = p->total_vram;
+-#endif
+ 	fix->visual = (par->cmode == CMODE_8) ?
+ 		FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
+ 	fix->line_length = par->vxres << par->cmode;
+ 		/* ywrapstep, xpanstep, ypanstep */
+ }
+ 
+-static void valkyrie_init_display(struct display *disp)
+-{
+-	memset(disp, 0, sizeof(*disp));
+-	disp->can_soft_blank = can_soft_blank;
+-	disp->scrollmode = SCROLL_YREDRAW;
+-}
+-
+-static void valkyrie_par_to_display(struct fb_par_valkyrie *par,
+-  struct display *disp, struct fb_fix_screeninfo *fix, struct fb_info_valkyrie *p)
+-{
+-	disp->var = p->var;
+-
+-	if(disp->scrollmode != SCROLL_YREDRAW) {
+-		printk(KERN_ERR "Scroll mode not YREDRAW in valkyrie_par_to_display\n");
+-		disp->scrollmode = SCROLL_YREDRAW;
+-	}
+-	switch (par->cmode) {
+-#ifdef FBCON_HAS_CFB8
+-                case CMODE_8:
+-                        disp->dispsw = &fbcon_cfb8;
+-                        break;
+-#endif
+-#ifdef FBCON_HAS_CFB16
+-                case CMODE_16:
+-                        disp->dispsw = &fbcon_cfb16;
+-                        disp->dispsw_data = p->fbcon_cfb16_cmap;
+-                        break;
+-#endif
+-                default:
+-                        disp->dispsw = &fbcon_dummy;
+-                        break;
+-        }
+-}
+-
+ static void __init valkyrie_init_info(struct fb_info *info, struct fb_info_valkyrie *p)
+ {
+-	strcpy(info->modename, p->fix.id);
+ 	info->fbops = &valkyriefb_ops;
+ 	info->screen_base = (char *) p->frame_buffer + 0x1000;
+-	info->disp = &p->disp;
+-	info->currcon = -1;
+-	strcpy(info->fontname, fontname);
+-	info->changevar = NULL;
+-	info->switch_con = &valkyriefb_switch;
+-	info->updatevar = &valkyriefb_updatevar;
+ 	info->flags = FBINFO_FLAG_DEFAULT;
++	info->pseudo_palette = p->pseudo_palette;
++	fb_alloc_cmap(&info->cmap, 256, 0);
++	info->par = &p->par;
+ }
+ 
+ 
+@@ -738,41 +558,23 @@ int __init valkyriefb_setup(char *option
+ 		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;
+-		}
+-		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)
++			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) {
+-			 case 8:
+-			    default_cmode = CMODE_8;
+-			    break;
+-			 case 15:
+-			 case 16:
+-			    default_cmode = CMODE_16;
+-			    break;
++			case 8:
++				default_cmode = CMODE_8;
++				break;
++			case 15:
++			case 16:
++				default_cmode = CMODE_16;
++				break;
+ 			}
+ 		}
+-		/* XXX - remove these options once blanking has been tested */
+-		else if (!strncmp(this_opt, "noblank", 7)) {
+-			can_soft_blank = 0;
+-		}
+-		else if (!strncmp(this_opt, "blank", 5)) {
+-			can_soft_blank = 1;
+-		}
+ 	}
+ 	return 0;
+ }
+--- linux-2.6.0-test1/drivers/video/vesafb.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/video/vesafb.c	2003-07-19 17:03:50.000000000 -0700
+@@ -51,7 +51,7 @@ static struct fb_info fb_info;
+ static u32 pseudo_palette[17];
+ 
+ static int             inverse   = 0;
+-static int             mtrr      = 0;
++static int             mtrr      = 1;
+ 
+ static int             pmi_setpal = 0;	/* pmi for palette changes ??? */
+ static int             ypan       = 0;  /* 0..nothing, 1..ypan, 2..ywrap */
+@@ -208,6 +208,8 @@ int __init vesafb_setup(char *options)
+ 			pmi_setpal=1;
+ 		else if (! strcmp(this_opt, "mtrr"))
+ 			mtrr=1;
++		else if (! strcmp(this_opt, "nomtrr"))
++			mtrr=0;
+ 	}
+ 	return 0;
+ }
+@@ -231,6 +233,12 @@ int __init vesafb_init(void)
+ 	vesafb_fix.visual   = (vesafb_defined.bits_per_pixel == 8) ?
+ 		FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR;
+ 
++	/* limit framebuffer size to 16 MB.  Otherwise we'll eat tons of
++	 * kernel address space for nothing if the gfx card has alot of
++	 * memory (>= 128 MB isn't uncommon these days ...) */
++	if (vesafb_fix.smem_len > 16 * 1024 * 1024)
++		vesafb_fix.smem_len = 16 * 1024 * 1024;
++
+ #ifndef __i386__
+ 	screen_info.vesapm_seg = 0;
+ #endif
+--- linux-2.6.0-test1/fs/aio.c	2003-07-13 21:44:34.000000000 -0700
++++ 25/fs/aio.c	2003-07-19 17:07:03.000000000 -0700
+@@ -28,6 +28,8 @@
+ #include <linux/module.h>
+ #include <linux/highmem.h>
+ #include <linux/workqueue.h>
++#include <linux/writeback.h>
++#include <linux/pagemap.h>
+ 
+ #include <asm/kmap_types.h>
+ #include <asm/uaccess.h>
+@@ -39,6 +41,9 @@
+ #define dprintk(x...)	do { ; } while (0)
+ #endif
+ 
++long aio_run = 0; /* for testing only */
++long aio_wakeups = 0; /* for testing only */
++
+ /*------ sysctl variables----*/
+ atomic_t aio_nr = ATOMIC_INIT(0);	/* current system wide number of aio requests */
+ unsigned aio_max_nr = 0x10000;	/* system wide maximum number of aio requests */
+@@ -48,6 +53,7 @@ static kmem_cache_t	*kiocb_cachep;
+ static kmem_cache_t	*kioctx_cachep;
+ 
+ static struct workqueue_struct *aio_wq;
++static struct workqueue_struct *aio_fput_wq;
+ 
+ /* Used for rare fput completion. */
+ static void aio_fput_routine(void *);
+@@ -75,6 +81,7 @@ static int __init aio_setup(void)
+ 		panic("unable to create kioctx cache");
+ 
+ 	aio_wq = create_workqueue("aio");
++	aio_fput_wq = create_workqueue("aio_fput");
+ 
+ 	pr_debug("aio_setup: sizeof(struct page) = %d\n", (int)sizeof(struct page));
+ 
+@@ -281,6 +288,7 @@ static void aio_cancel_all(struct kioctx
+ 		struct kiocb *iocb = list_kiocb(pos);
+ 		list_del_init(&iocb->ki_list);
+ 		cancel = iocb->ki_cancel;
++		kiocbSetCancelled(iocb);
+ 		if (cancel) {
+ 			iocb->ki_users++;
+ 			spin_unlock_irq(&ctx->ctx_lock);
+@@ -341,6 +349,11 @@ void exit_aio(struct mm_struct *mm)
+ 		aio_cancel_all(ctx);
+ 
+ 		wait_for_all_aios(ctx);
++		/*
++		 * this is an overkill, but ensures we don't leave
++		 * the ctx on the aio_wq
++		 */
++		flush_workqueue(aio_wq);
+ 
+ 		if (1 != atomic_read(&ctx->users))
+ 			printk(KERN_DEBUG
+@@ -395,6 +408,7 @@ static struct kiocb *__aio_get_req(struc
+ 	req->ki_cancel = NULL;
+ 	req->ki_retry = NULL;
+ 	req->ki_user_obj = NULL;
++	INIT_LIST_HEAD(&req->ki_run_list);
+ 
+ 	/* Check if the completion queue has enough free space to
+ 	 * accept an event from this io.
+@@ -494,7 +508,7 @@ static int __aio_put_req(struct kioctx *
+ 		spin_lock(&fput_lock);
+ 		list_add(&req->ki_list, &fput_head);
+ 		spin_unlock(&fput_lock);
+-		queue_work(aio_wq, &fput_work);
++		queue_work(aio_fput_wq, &fput_work);
+ 	} else
+ 		really_put_req(ctx, req);
+ 	return 1;
+@@ -536,65 +550,302 @@ struct kioctx *lookup_ioctx(unsigned lon
+ 	return ioctx;
+ }
+ 
++/*
++ * use_mm
++ * 	Makes the calling kernel thread take on the specified
++ * 	mm context.
++ * 	Called by the retry thread execute retries within the
++ * 	iocb issuer's mm context, so that copy_from/to_user
++ * 	operations work seamlessly for aio.
++ * 	(Note: this routine is intended to be called only
++ * 	from a kernel thread context)
++ */
+ static void use_mm(struct mm_struct *mm)
+ {
+-	struct mm_struct *active_mm = current->active_mm;
++	struct mm_struct *active_mm;
++	struct task_struct *tsk = current;
++
++	task_lock(tsk);
++	active_mm = tsk->active_mm;
+ 	atomic_inc(&mm->mm_count);
+-	current->mm = mm;
+-	if (mm != active_mm) {
+-		current->active_mm = mm;
+-		activate_mm(active_mm, mm);
+-	}
++	tsk->mm = mm;
++	tsk->active_mm = mm;
++	activate_mm(active_mm, mm);
++	task_unlock(tsk);
++
+ 	mmdrop(active_mm);
+ }
+ 
+-static void unuse_mm(struct mm_struct *mm)
++/*
++ * unuse_mm
++ * 	Reverses the effect of use_mm, i.e. releases the
++ * 	specified mm context which was earlier taken on
++ * 	by the calling kernel thread
++ * 	(Note: this routine is intended to be called only
++ * 	from a kernel thread context)
++ *
++ * Comments: Called with ctx->ctx_lock held. This nests
++ * task_lock instead ctx_lock.
++ */
++void unuse_mm(struct mm_struct *mm)
+ {
+-	current->mm = NULL;
++	struct task_struct *tsk = current;
++
++	task_lock(tsk);
++	tsk->mm = NULL;
+ 	/* active_mm is still 'mm' */
+-	enter_lazy_tlb(mm, current);
++	enter_lazy_tlb(mm, tsk);
++	task_unlock(tsk);
+ }
+ 
+-/* Run on kevent's context.  FIXME: needs to be per-cpu and warn if an
+- * operation blocks.
++/*
++ * Queue up a kiocb to be retried. Assumes that the kiocb
++ * has already been marked as kicked, and places it on
++ * the retry run list for the corresponding ioctx, if it
++ * isn't already queued. Returns 1 if it actually queued
++ * the kiocb (to tell the caller to activate the work
++ * queue to process it), or 0, if it found that it was
++ * already queued.
++ *
++ * Should be called with the spin lock iocb->ki_ctx->ctx_lock
++ * held
+  */
+-static void aio_kick_handler(void *data)
++static inline int __queue_kicked_iocb(struct kiocb *iocb)
+ {
+-	struct kioctx *ctx = data;
++	struct kioctx	*ctx = iocb->ki_ctx;
+ 
+-	use_mm(ctx->mm);
++	if (list_empty(&iocb->ki_run_list)) {
++		list_add_tail(&iocb->ki_run_list,
++			&ctx->run_list);
++		iocb->ki_queued++;
++		return 1;
++	}
++	return 0;
++}
+ 
+-	spin_lock_irq(&ctx->ctx_lock);
+-	while (!list_empty(&ctx->run_list)) {
+-		struct kiocb *iocb;
+-		long ret;
++/* aio_run_iocb
++ * 	 This is the core aio execution routine. It is
++ * 	 invoked both for initial i/o submission and
++ * 	 subsequent retries via the aio_kick_handler.
++ *       Expects to be invoked with iocb->ki_ctx->lock
++ *       already held. The lock is released and reaquired
++ *       as needed during processing.
++ *
++ * Calls the iocb retry method (already setup for the
++ * iocb on initial submission) for operation specific
++ * handling, but takes care of most of common retry
++ * execution details for a given iocb. The retry method
++ * needs to be non-blocking as far as possible, to avoid
++ * holding up other iocbs waiting to be serviced by the
++ * retry kernel thread.
++ *
++ * The trickier parts in this code have to do with
++ * ensuring that only one retry instance is in progress
++ * for a given iocb at any time. Providing that guarantee
++ * simplifies the coding of individual aio operations as
++ * it avoids various potential races.
++ */
++static ssize_t aio_run_iocb(struct kiocb *iocb)
++{
++	struct kioctx	*ctx = iocb->ki_ctx;
++	ssize_t (*retry)(struct kiocb *);
++	ssize_t ret;
+ 
+-		iocb = list_entry(ctx->run_list.next, struct kiocb,
+-				  ki_run_list);
+-		list_del(&iocb->ki_run_list);
+-		iocb->ki_users ++;
+-		spin_unlock_irq(&ctx->ctx_lock);
++	if (iocb->ki_retried++ > 1024*1024) {
++		printk("Maximal retry count.  Bytes done %Zd\n",
++			iocb->ki_nbytes - iocb->ki_left);
++		return -EAGAIN;
++	}
++
++	if (!(iocb->ki_retried & 0xff)) {
++		pr_debug("%ld retry: %d of %d (kick %ld, Q %ld run %ld, wake %ld)\n",
++			iocb->ki_retried,
++			iocb->ki_nbytes - iocb->ki_left, iocb->ki_nbytes,
++			iocb->ki_kicked, iocb->ki_queued, aio_run, aio_wakeups);
++	}
++
++	if (!(retry = iocb->ki_retry)) {
++		printk("aio_run_iocb: iocb->ki_retry = NULL\n");
++		return 0;
++	}
++
++	/*
++	 * We don't want the next retry iteration for this
++	 * operation to start until this one has returned and
++	 * updated the iocb state. However, wait_queue functions
++	 * can trigger a kick_iocb from interrupt context in the
++	 * meantime, indicating that data is available for the next
++	 * iteration. We want to remember that and enable the
++	 * next retry iteration _after_ we are through with
++	 * this one.
++	 *
++	 * So, in order to be able to register a "kick", but
++	 * prevent it from being queued now, we clear the kick
++	 * flag, but make the kick code *think* that the iocb is
++	 * still on the run list until we are actually done.
++	 * When we are done with this iteration, we check if
++	 * the iocb was kicked in the meantime and if so, queue
++	 * it up afresh.
++	 */
++
++	kiocbClearKicked(iocb);
++
++	/*
++	 * This is so that aio_complete knows it doesn't need to
++	 * pull the iocb off the run list (We can't just call
++	 * INIT_LIST_HEAD because we don't want a kick_iocb to
++	 * queue this on the run list yet)
++	 */
++	iocb->ki_run_list.next = iocb->ki_run_list.prev = NULL;
++	iocb->ki_retry = NULL;
++	spin_unlock_irq(&ctx->ctx_lock);
++
++	/* Quit retrying if the i/o has been cancelled */
++	if (kiocbIsCancelled(iocb)) {
++		ret = -EINTR;
++		aio_complete(iocb, ret, 0);
++		/* must not access the iocb after this */
++		goto out;
++	}
++
++	/*
++	 * Now we are all set to call the retry method in async
++	 * context. By setting this thread's io_wait context
++	 * to point to the wait queue entry inside the currently
++	 * running iocb for the duration of the retry, we ensure
++	 * that async notification wakeups are queued by the
++	 * operation instead of blocking waits, and when notified,
++	 * cause the iocb to be kicked for continuation (through
++	 * the aio_wake_function callback).
++	 */
++	BUG_ON(current->io_wait != NULL);
++	current->io_wait = &iocb->ki_wait;
++	ret = retry(iocb);
++	current->io_wait = NULL;
+ 
+-		kiocbClearKicked(iocb);
+-		ret = iocb->ki_retry(iocb);
++	if (-EIOCBRETRY != ret) {
+ 		if (-EIOCBQUEUED != ret) {
++			BUG_ON(!list_empty(&iocb->ki_wait.task_list));
+ 			aio_complete(iocb, ret, 0);
+-			iocb = NULL;
++			/* must not access the iocb after this */
+ 		}
++	} else {
++		/*
++		 * Issue an additional retry to avoid waiting forever if
++		 * no waits were queued (e.g. in case of a short read).
++		 */
++		if (list_empty(&iocb->ki_wait.task_list))
++			kiocbSetKicked(iocb);
++	}
++out:
++	spin_lock_irq(&ctx->ctx_lock);
+ 
+-		spin_lock_irq(&ctx->ctx_lock);
+-		if (NULL != iocb)
+-			__aio_put_req(ctx, iocb);
++	if (-EIOCBRETRY == ret) {
++		/*
++		 * OK, now that we are done with this iteration
++		 * and know that there is more left to go,
++		 * this is where we let go so that a subsequent
++		 * "kick" can start the next iteration
++		 */
++		iocb->ki_retry = retry;
++		/* will make __queue_kicked_iocb succeed from here on */
++		INIT_LIST_HEAD(&iocb->ki_run_list);
++		/* we must queue the next iteration ourselves, if it
++		 * has already been kicked */
++		if (kiocbIsKicked(iocb)) {
++			__queue_kicked_iocb(iocb);
++		}
+ 	}
++	return ret;
++}
++
++/*
++ * __aio_run_iocbs:
++ * 	Process all pending retries queued on the ioctx
++ * 	run list.
++ * Assumes it is operating within the aio issuer's mm
++ * context. Expects to be called with ctx->ctx_lock held
++ */
++static void __aio_run_iocbs(struct kioctx *ctx)
++{
++	struct kiocb *iocb;
++	ssize_t ret;
++	int count = 0;
++
++	while (!list_empty(&ctx->run_list)) {
++		iocb = list_entry(ctx->run_list.next, struct kiocb,
++			ki_run_list);
++		list_del(&iocb->ki_run_list);
++		ret = aio_run_iocb(iocb);
++		count++;
++	}
++	aio_run++;
++}
++
++/*
++ * aio_run_iocbs:
++ * 	Process all pending retries queued on the ioctx
++ * 	run list.
++ * Assumes it is operating within the aio issuer's mm
++ * context.
++ */
++static inline void aio_run_iocbs(struct kioctx *ctx)
++{
++	spin_lock_irq(&ctx->ctx_lock);
++	__aio_run_iocbs(ctx);
+ 	spin_unlock_irq(&ctx->ctx_lock);
++}
+ 
++/*
++ * aio_kick_handler:
++ * 	Work queue handler triggered to process pending
++ * 	retries on an ioctx. Takes on the aio issuer's
++ * 	mm context before running the iocbs.
++ * Run on aiod's context.
++ */
++static void aio_kick_handler(void *data)
++{
++	struct kioctx *ctx = data;
++
++	use_mm(ctx->mm);
++	spin_lock_irq(&ctx->ctx_lock);
++	__aio_run_iocbs(ctx);
+ 	unuse_mm(ctx->mm);
++	spin_unlock_irq(&ctx->ctx_lock);
+ }
+ 
+-void kick_iocb(struct kiocb *iocb)
++
++/*
++ * Called by kick_iocb to queue the kiocb for retry
++ * and if required activate the aio work queue to process
++ * it
++ */
++void queue_kicked_iocb(struct kiocb *iocb)
+ {
+ 	struct kioctx	*ctx = iocb->ki_ctx;
++	unsigned long flags;
++	int run = 0;
++
++	WARN_ON((!list_empty(&iocb->ki_wait.task_list)));
++
++	spin_lock_irqsave(&ctx->ctx_lock, flags);
++	run = __queue_kicked_iocb(iocb);
++	spin_unlock_irqrestore(&ctx->ctx_lock, flags);
++	if (run) {
++		queue_work(aio_wq, &ctx->wq);
++		aio_wakeups++;
++	}
++}
+ 
++/*
++ * kick_iocb:
++ * 	Called typically from a wait queue callback context
++ * 	(aio_wake_function) to trigger a retry of the iocb.
++ * 	The retry is usually executed by aio workqueue
++ * 	threads (See aio_kick_handler).
++ */
++void kick_iocb(struct kiocb *iocb)
++{
+ 	/* sync iocbs are easy: they can only ever be executing from a 
+ 	 * single context. */
+ 	if (is_sync_kiocb(iocb)) {
+@@ -603,12 +854,10 @@ void kick_iocb(struct kiocb *iocb)
+ 		return;
+ 	}
+ 
++	iocb->ki_kicked++;
++	/* If its already kicked we shouldn't queue it again */
+ 	if (!kiocbTryKick(iocb)) {
+-		unsigned long flags;
+-		spin_lock_irqsave(&ctx->ctx_lock, flags);
+-		list_add_tail(&iocb->ki_run_list, &ctx->run_list);
+-		spin_unlock_irqrestore(&ctx->ctx_lock, flags);
+-		schedule_work(&ctx->wq);
++		queue_kicked_iocb(iocb);
+ 	}
+ }
+ 
+@@ -661,6 +910,9 @@ int aio_complete(struct kiocb *iocb, lon
+ 	 */
+ 	spin_lock_irqsave(&ctx->ctx_lock, flags);
+ 
++	if (iocb->ki_run_list.prev && !list_empty(&iocb->ki_run_list))
++		list_del_init(&iocb->ki_run_list);
++
+ 	ring = kmap_atomic(info->ring_pages[0], KM_IRQ1);
+ 
+ 	tail = info->tail;
+@@ -689,6 +941,11 @@ int aio_complete(struct kiocb *iocb, lon
+ 
+ 	pr_debug("added to ring %p at [%lu]\n", iocb, tail);
+ 
++	pr_debug("%ld retries: %d of %d (kicked %ld, Q %ld run %ld wake %ld)\n",
++		iocb->ki_retried,
++		iocb->ki_nbytes - iocb->ki_left, iocb->ki_nbytes,
++		iocb->ki_kicked, iocb->ki_queued, aio_run, aio_wakeups);
++
+ 	/* everything turned out well, dispose of the aiocb. */
+ 	ret = __aio_put_req(ctx, iocb);
+ 
+@@ -803,6 +1060,7 @@ static int read_events(struct kioctx *ct
+ 	int			i = 0;
+ 	struct io_event		ent;
+ 	struct timeout		to;
++	int 			event_loop = 0; /* testing only */
+ 
+ 	/* needed to zero any padding within an entry (there shouldn't be 
+ 	 * any, but C is fun!
+@@ -852,7 +1110,6 @@ static int read_events(struct kioctx *ct
+ 		add_wait_queue_exclusive(&ctx->wait, &wait);
+ 		do {
+ 			set_task_state(tsk, TASK_INTERRUPTIBLE);
+-
+ 			ret = aio_read_evt(ctx, &ent);
+ 			if (ret)
+ 				break;
+@@ -862,6 +1119,7 @@ static int read_events(struct kioctx *ct
+ 			if (to.timed_out)	/* Only check after read evt */
+ 				break;
+ 			schedule();
++			event_loop++;
+ 			if (signal_pending(tsk)) {
+ 				ret = -EINTR;
+ 				break;
+@@ -889,6 +1147,9 @@ static int read_events(struct kioctx *ct
+ 	if (timeout)
+ 		clear_timeout(&to);
+ out:
++	pr_debug("event loop executed %d times\n", event_loop);
++	pr_debug("aio_run %ld\n", aio_run);
++	pr_debug("aio_wakeups %ld\n", aio_wakeups);
+ 	return i ? i : ret;
+ }
+ 
+@@ -918,6 +1179,11 @@ static void io_destroy(struct kioctx *io
+ 
+ 	aio_cancel_all(ioctx);
+ 	wait_for_all_aios(ioctx);
++	/*
++	 * this is an overkill, but ensures we don't leave
++	 * the ctx on the aio_wq
++	 */
++	flush_workqueue(aio_wq);
+ 	put_ioctx(ioctx);	/* once for the lookup */
+ }
+ 
+@@ -980,13 +1246,191 @@ asmlinkage long sys_io_destroy(aio_conte
+ 	return -EINVAL;
+ }
+ 
++/*
++ * Retry method for aio_read (also used for first time submit)
++ * Responsible for updating iocb state as retries progress
++ */
++static ssize_t aio_pread(struct kiocb *iocb)
++{
++	struct file *file = iocb->ki_filp;
++	ssize_t ret = 0;
++
++	ret = file->f_op->aio_read(iocb, iocb->ki_buf,
++		iocb->ki_left, iocb->ki_pos);
++
++	/*
++	 * Can't just depend on iocb->ki_left to determine
++	 * whether we are done. This may have been a short read.
++	 */
++	if (ret > 0) {
++		iocb->ki_buf += ret;
++		iocb->ki_left -= ret;
++
++		ret = -EIOCBRETRY;
++	}
++
++	/* This means we must have transferred all that we could */
++	/* No need to retry anymore */
++	if ((ret == 0) || (iocb->ki_left == 0))
++		ret = iocb->ki_nbytes - iocb->ki_left;
++
++	return ret;
++}
++
++/*
++ * Retry method for aio_write (also used for first time submit)
++ * Responsible for updating iocb state as retries progress
++ */
++static ssize_t aio_pwrite(struct kiocb *iocb)
++{
++	struct file *file = iocb->ki_filp;
++	struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
++	struct inode *inode = mapping->host;
++	ssize_t ret = 0;
++
++	ret = file->f_op->aio_write(iocb, iocb->ki_buf,
++				iocb->ki_left, iocb->ki_pos);
++
++	/*
++	 * Even if iocb->ki_left = 0, we may need to wait
++	 * for a balance_dirty_pages to complete
++	 */
++	if (ret > 0) {
++		iocb->ki_buf += iocb->ki_buf ? ret : 0;
++		iocb->ki_left -= ret;
++
++		ret = -EIOCBRETRY;
++	}
++
++	/* This means we must have transferred all that we could */
++	/* No need to retry anymore unless we need to osync data */
++	if (ret == 0) {
++		ret = iocb->ki_nbytes - iocb->ki_left;
++		if (!iocb->ki_buf)
++			return ret;
++
++		/* Set things up for potential O_SYNC */
++		if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
++			iocb->ki_buf = NULL;
++			iocb->ki_pos -= ret; /* back up fpos */
++			iocb->ki_left = ret; /* sync what we have written out */
++			iocb->ki_nbytes = ret;
++			ret = -EIOCBRETRY;
++		}
++	}
++
++	return ret;
++}
++
++static ssize_t aio_fdsync(struct kiocb *iocb)
++{
++	struct file *file = iocb->ki_filp;
++	ssize_t ret = -EINVAL;
++
++	if (file->f_op->aio_fsync)
++		ret = file->f_op->aio_fsync(iocb, 1);
++	return ret;
++}
++
++static ssize_t aio_fsync(struct kiocb *iocb)
++{
++	struct file *file = iocb->ki_filp;
++	ssize_t ret = -EINVAL;
++
++	if (file->f_op->aio_fsync)
++		ret = file->f_op->aio_fsync(iocb, 0);
++	return ret;
++}
++
++/*
++ * aio_setup_iocb:
++ *	Performs the initial checks and aio retry method
++ *	setup for the kiocb at the time of io submission.
++ */
++ssize_t aio_setup_iocb(struct kiocb *kiocb)
++{
++	struct file *file = kiocb->ki_filp;
++	ssize_t ret = 0;
++
++	switch (kiocb->ki_opcode) {
++	case IOCB_CMD_PREAD:
++		ret = -EBADF;
++		if (unlikely(!(file->f_mode & FMODE_READ)))
++			break;
++		ret = -EFAULT;
++		if (unlikely(!access_ok(VERIFY_WRITE, kiocb->ki_buf,
++			kiocb->ki_left)))
++			break;
++		ret = -EINVAL;
++		if (file->f_op->aio_read)
++			kiocb->ki_retry = aio_pread;
++		break;
++	case IOCB_CMD_PWRITE:
++		ret = -EBADF;
++		if (unlikely(!(file->f_mode & FMODE_WRITE)))
++			break;
++		ret = -EFAULT;
++		if (unlikely(!access_ok(VERIFY_READ, kiocb->ki_buf,
++			kiocb->ki_left)))
++			break;
++		ret = -EINVAL;
++		if (file->f_op->aio_write)
++			kiocb->ki_retry = aio_pwrite;
++		break;
++	case IOCB_CMD_FDSYNC:
++		ret = -EINVAL;
++		if (file->f_op->aio_fsync)
++			kiocb->ki_retry = aio_fdsync;
++		break;
++	case IOCB_CMD_FSYNC:
++		ret = -EINVAL;
++		if (file->f_op->aio_fsync)
++			kiocb->ki_retry = aio_fsync;
++		break;
++	default:
++		dprintk("EINVAL: io_submit: no operation provided\n");
++		ret = -EINVAL;
++	}
++
++	if (!kiocb->ki_retry)
++		return ret;
++
++	return 0;
++}
++
++/*
++ * aio_wake_function:
++ * 	wait queue callback function for aio notification,
++ * 	Simply triggers a retry of the operation via kick_iocb.
++ *
++ * 	This callback is specified in the wait queue entry in
++ *	a kiocb	(current->io_wait points to this wait queue
++ *	entry when an aio operation executes; it is used
++ * 	instead of a synchronous wait when an i/o blocking
++ *	condition is encountered during aio).
++ *
++ * Note:
++ * This routine is executed with the wait queue lock held.
++ * Since kick_iocb acquires iocb->ctx->ctx_lock, it nests
++ * the ioctx lock inside the wait queue lock. This is safe
++ * because this callback isn't used for wait queues which
++ * are nested inside ioctx lock (i.e. ctx->wait)
++ */
++int aio_wake_function(wait_queue_t *wait, unsigned mode, int sync)
++{
++	struct kiocb *iocb = container_of(wait, struct kiocb, ki_wait);
++
++	list_del_init(&wait->task_list);
++	kick_iocb(iocb);
++	return 1;
++}
++
+ int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
+ 			 struct iocb *iocb)
+ {
+ 	struct kiocb *req;
+ 	struct file *file;
+ 	ssize_t ret;
+-	char *buf;
+ 
+ 	/* enforce forwards compatibility on users */
+ 	if (unlikely(iocb->aio_reserved1 || iocb->aio_reserved2 ||
+@@ -1027,51 +1471,31 @@ int io_submit_one(struct kioctx *ctx, st
+ 	req->ki_user_data = iocb->aio_data;
+ 	req->ki_pos = iocb->aio_offset;
+ 
+-	buf = (char *)(unsigned long)iocb->aio_buf;
++	req->ki_buf = (char *)(unsigned long)iocb->aio_buf;
++	req->ki_left = req->ki_nbytes = iocb->aio_nbytes;
++	req->ki_opcode = iocb->aio_lio_opcode;
++	init_waitqueue_func_entry(&req->ki_wait, aio_wake_function);
++	INIT_LIST_HEAD(&req->ki_wait.task_list);
++	req->ki_run_list.next = req->ki_run_list.prev = NULL;
++	req->ki_retry = NULL;
++	req->ki_retried = 0;
++	req->ki_kicked = 0;
++	req->ki_queued = 0;
++	aio_run = 0;
++	aio_wakeups = 0;
+ 
+-	switch (iocb->aio_lio_opcode) {
+-	case IOCB_CMD_PREAD:
+-		ret = -EBADF;
+-		if (unlikely(!(file->f_mode & FMODE_READ)))
+-			goto out_put_req;
+-		ret = -EFAULT;
+-		if (unlikely(!access_ok(VERIFY_WRITE, buf, iocb->aio_nbytes)))
+-			goto out_put_req;
+-		ret = -EINVAL;
+-		if (file->f_op->aio_read)
+-			ret = file->f_op->aio_read(req, buf,
+-					iocb->aio_nbytes, req->ki_pos);
+-		break;
+-	case IOCB_CMD_PWRITE:
+-		ret = -EBADF;
+-		if (unlikely(!(file->f_mode & FMODE_WRITE)))
+-			goto out_put_req;
+-		ret = -EFAULT;
+-		if (unlikely(!access_ok(VERIFY_READ, buf, iocb->aio_nbytes)))
+-			goto out_put_req;
+-		ret = -EINVAL;
+-		if (file->f_op->aio_write)
+-			ret = file->f_op->aio_write(req, buf,
+-					iocb->aio_nbytes, req->ki_pos);
+-		break;
+-	case IOCB_CMD_FDSYNC:
+-		ret = -EINVAL;
+-		if (file->f_op->aio_fsync)
+-			ret = file->f_op->aio_fsync(req, 1);
+-		break;
+-	case IOCB_CMD_FSYNC:
+-		ret = -EINVAL;
+-		if (file->f_op->aio_fsync)
+-			ret = file->f_op->aio_fsync(req, 0);
+-		break;
+-	default:
+-		dprintk("EINVAL: io_submit: no operation provided\n");
+-		ret = -EINVAL;
+-	}
++	ret = aio_setup_iocb(req);
++
++	if (ret)
++		goto out_put_req;
++
++	spin_lock_irq(&ctx->ctx_lock);
++	ret = aio_run_iocb(req);
++	spin_unlock_irq(&ctx->ctx_lock);
++
++	if (-EIOCBRETRY == ret)
++		queue_work(aio_wq, &ctx->wq);
+ 
+-	if (likely(-EIOCBQUEUED == ret))
+-		return 0;
+-	aio_complete(req, ret, 0);
+ 	return 0;
+ 
+ out_put_req:
+--- linux-2.6.0-test1/fs/binfmt_elf.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/binfmt_elf.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1158,7 +1158,7 @@ static int elf_dump_thread_status(long s
+ 	t->num_notes++;
+ 	sz += notesize(&t->notes[0]);
+ 
+-	if ((t->prstatus.pr_fpvalid = elf_core_copy_task_fpregs(p, &t->fpu))) {
++	if ((t->prstatus.pr_fpvalid = elf_core_copy_task_fpregs(p, NULL, &t->fpu))) {
+ 		fill_note(&t->notes[1], "CORE", NT_PRFPREG, sizeof(t->fpu), &(t->fpu));
+ 		t->num_notes++;
+ 		sz += notesize(&t->notes[1]);
+@@ -1286,7 +1286,7 @@ static int elf_core_dump(long signr, str
+ 	fill_note(notes +2, "CORE", NT_TASKSTRUCT, sizeof(*current), current);
+   
+   	/* Try to dump the FPU. */
+-	if ((prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, fpu)))
++	if ((prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs, fpu)))
+ 		fill_note(notes +3, "CORE", NT_PRFPREG, sizeof(*fpu), fpu);
+ 	else
+ 		--numnote;
+--- linux-2.6.0-test1/fs/bio.c	2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/bio.c	2003-07-19 17:03:50.000000000 -0700
+@@ -18,7 +18,7 @@
+ #include <linux/mm.h>
+ #include <linux/swap.h>
+ #include <linux/bio.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/slab.h>
+ #include <linux/init.h>
+ #include <linux/kernel.h>
+--- linux-2.6.0-test1/fs/buffer.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/buffer.c	2003-07-19 17:06:53.000000000 -0700
+@@ -91,6 +91,7 @@ void wake_up_buffer(struct buffer_head *
+ {
+ 	wait_queue_head_t *wq = bh_waitq_head(bh);
+ 
++	smp_mb();
+ 	if (waitqueue_active(wq))
+ 		wake_up_all(wq);
+ }
+@@ -115,27 +116,50 @@ void unlock_buffer(struct buffer_head *b
+ }
+ 
+ /*
+- * Block until a buffer comes unlocked.  This doesn't stop it
++ * Wait until a buffer comes unlocked.  This doesn't stop it
+  * from becoming locked again - you have to lock it yourself
+  * if you want to preserve its state.
++ * If the wait queue parameter specifies an async i/o callback,
++ * then instead of blocking, we just queue up the callback
++ * on the wait queue for async notification when the buffer gets
++ * unlocked.
++ * A NULL wait queue parameter defaults to synchronous behaviour
+  */
+-void __wait_on_buffer(struct buffer_head * bh)
++int __wait_on_buffer_wq(struct buffer_head * bh, wait_queue_t *wait)
+ {
+ 	wait_queue_head_t *wqh = bh_waitq_head(bh);
+-	DEFINE_WAIT(wait);
++	DEFINE_WAIT(local_wait);
++
++	if (!wait)
++		wait = &local_wait;
+ 
+ 	if (atomic_read(&bh->b_count) == 0 &&
+ 			(!bh->b_page || !PageLocked(bh->b_page)))
+ 		buffer_error();
+ 
+ 	do {
+-		prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
++		prepare_to_wait(wqh, wait, TASK_UNINTERRUPTIBLE);
+ 		if (buffer_locked(bh)) {
+ 			blk_run_queues();
++			if (!is_sync_wait(wait)) {
++				/*
++				 * if we've queued an async wait queue
++				 * callback do not block; just tell the
++				 * caller to return and retry later when
++				 * the callback is notified
++				 */
++				return -EIOCBRETRY;
++			}
+ 			io_schedule();
+ 		}
+ 	} while (buffer_locked(bh));
+-	finish_wait(wqh, &wait);
++	finish_wait(wqh, wait);
++	return 0;
++}
++
++void __wait_on_buffer(struct buffer_head * bh)
++{
++	__wait_on_buffer_wq(bh, NULL);
+ }
+ 
+ static void
+@@ -414,6 +438,9 @@ __find_get_block_slow(struct block_devic
+ 		bh = bh->b_this_page;
+ 	} while (bh != head);
+ 	buffer_error();
++	printk("block=%llu, b_blocknr=%llu\n",
++		(unsigned long long)block, (unsigned long long)bh->b_blocknr);
++	printk("b_state=0x%08lx, b_size=%u\n", bh->b_state, bh->b_size);
+ out_unlock:
+ 	spin_unlock(&bd_mapping->private_lock);
+ 	page_cache_release(page);
+@@ -1274,9 +1301,12 @@ void __bforget(struct buffer_head *bh)
+ 	__brelse(bh);
+ }
+ 
+-static struct buffer_head *__bread_slow(struct buffer_head *bh)
++static struct buffer_head *__bread_slow_wq(struct buffer_head *bh,
++		wait_queue_t *wait)
+ {
+-	lock_buffer(bh);
++	if (-EIOCBRETRY == lock_buffer_wq(bh, wait))
++		return ERR_PTR(-EIOCBRETRY);
++
+ 	if (buffer_uptodate(bh)) {
+ 		unlock_buffer(bh);
+ 		return bh;
+@@ -1286,7 +1316,8 @@ static struct buffer_head *__bread_slow(
+ 		get_bh(bh);
+ 		bh->b_end_io = end_buffer_io_sync;
+ 		submit_bh(READ, bh);
+-		wait_on_buffer(bh);
++		if (-EIOCBRETRY == wait_on_buffer_wq(bh, wait))
++			return ERR_PTR(-EIOCBRETRY);
+ 		if (buffer_uptodate(bh))
+ 			return bh;
+ 	}
+@@ -1294,6 +1325,11 @@ static struct buffer_head *__bread_slow(
+ 	return NULL;
+ }
+ 
++static inline struct buffer_head *__bread_slow(struct buffer_head *bh)
++{
++	return __bread_slow_wq(bh, NULL);
++}
++
+ /*
+  * Per-cpu buffer LRU implementation.  To reduce the cost of __find_get_block().
+  * The bhs[] array is sorted - newest buffer is at bhs[0].  Buffers have their
+@@ -1481,6 +1517,18 @@ __bread(struct block_device *bdev, secto
+ }
+ EXPORT_SYMBOL(__bread);
+ 
++struct buffer_head *
++__bread_wq(struct block_device *bdev, sector_t block, int size,
++	wait_queue_t *wait)
++{
++	struct buffer_head *bh = __getblk(bdev, block, size);
++
++	if (!buffer_uptodate(bh))
++		bh = __bread_slow_wq(bh, wait);
++	return bh;
++}
++EXPORT_SYMBOL(__bread_wq);
++
+ /*
+  * invalidate_bh_lrus() is called rarely - at unmount.  Because it is only for
+  * unmount it only needs to ensure that all buffers from the target device are
+@@ -1958,8 +2006,9 @@ static int __block_prepare_write(struct 
+ 	/*
+ 	 * If we issued read requests - let them complete.
+ 	 */
+-	while(wait_bh > wait) {
+-		wait_on_buffer(*--wait_bh);
++	while (wait_bh > wait) {
++		if ((err = wait_on_buffer_wq(*--wait_bh, current->io_wait)))
++			return err;
+ 		if (!buffer_uptodate(*wait_bh))
+ 			return -EIO;
+ 	}
+--- linux-2.6.0-test1/fs/cifs/CHANGES	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/cifs/CHANGES	2003-07-19 17:03:50.000000000 -0700
+@@ -1,3 +1,12 @@
++Version 0.83
++------------
++Fix oops when mounting to long server names caused by inverted parms to kmalloc.
++Fix MultiuserMount (/proc/fs/cifs configuration setting) so that when enabled
++we will choose a cifs user session (smb uid) that better matches the local
++uid if a) the mount uid does not match the current uid and b) we have another
++session to the same server (ip address) for a different mount which
++matches the current local uid.
++
+ Version 0.82
+ ------------
+ Add support for mknod of block or character devices.  Fix oplock
+--- linux-2.6.0-test1/fs/cifs/cifsfs.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/cifs/cifsfs.c	2003-07-19 17:03:50.000000000 -0700
+@@ -230,7 +230,7 @@ cifs_show_options(struct seq_file *s, st
+ 	if (cifs_sb) {
+ 		if (cifs_sb->tcon) {
+ 			seq_printf(s, ",unc=%s", cifs_sb->tcon->treeName);
+-			if (cifs_sb->tcon->ses->userName)
++			if ((cifs_sb->tcon->ses) && (cifs_sb->tcon->ses->userName))
+ 				seq_printf(s, ",username=%s",
+ 					   cifs_sb->tcon->ses->userName);
+ 			if(cifs_sb->tcon->ses->domainName)
+--- linux-2.6.0-test1/fs/cifs/cifsglob.h	2003-07-10 18:50:31.000000000 -0700
++++ 25/fs/cifs/cifsglob.h	2003-07-19 17:03:50.000000000 -0700
+@@ -155,7 +155,8 @@ struct cifsSesInfo {
+ 	char *serverOS;		/* name of operating system underlying the server */
+ 	char *serverNOS;	/* name of network operating system that the server is running */
+ 	char *serverDomain;	/* security realm of server */
+-	int Suid;		/* needed for user level security */
++	int Suid;		/* remote smb uid  */
++	uid_t linux_uid;        /* local Linux uid */
+ 	int capabilities;
+ 	char serverName[SERVER_NAME_LEN_WITH_NULL * 2];	/* BB make bigger for tcp names - will ipv6 and sctp addresses fit here?? */
+ 	char userName[MAX_USERNAME_SIZE + 1];
+--- linux-2.6.0-test1/fs/cifs/connect.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/cifs/connect.c	2003-07-19 17:03:50.000000000 -0700
+@@ -405,7 +405,7 @@ parse_mount_options(char *options, const
+ 				return 1;	/* needs_arg; */
+ 			}
+ 			if ((temp_len = strnlen(value, 300)) < 300) {
+-				vol->UNC = kmalloc(GFP_KERNEL, temp_len);
++				vol->UNC = kmalloc(temp_len+1,GFP_KERNEL);
+ 				strcpy(vol->UNC,value);
+ 				if (strncmp(vol->UNC, "//", 2) == 0) {
+ 					vol->UNC[0] = '\\';
+@@ -482,7 +482,7 @@ parse_mount_options(char *options, const
+ 			return 1;
+ 		}
+ 		if ((temp_len = strnlen(devname, 300)) < 300) {
+-			vol->UNC = kmalloc(GFP_KERNEL, temp_len);
++			vol->UNC = kmalloc(temp_len+1,GFP_KERNEL);
+ 			strcpy(vol->UNC,devname);
+ 			if (strncmp(vol->UNC, "//", 2) == 0) {
+ 				vol->UNC[0] = '\\';
+@@ -860,7 +860,7 @@ cifs_mount(struct super_block *sb, struc
+ 		FreeXid(xid);
+ 		return -EINVAL;
+ 	}
+-	/* BB add support to use the multiuser_mount flag BB */
++
+ 	existingCifsSes =
+ 	    find_tcp_session(sin_server.sin_addr.s_addr,
+ 			     volume_info.username, &srvTcp);
+@@ -926,6 +926,7 @@ cifs_mount(struct super_block *sb, struc
+ 			if (volume_info.domainname)
+ 				strncpy(pSesInfo->domainName,
+ 					volume_info.domainname,MAX_USERNAME_SIZE);
++			pSesInfo->linux_uid = volume_info.linux_uid;
+ 
+ 			rc = setup_session(xid,pSesInfo, cifs_sb->local_nls);
+ 			if(!rc)
+--- linux-2.6.0-test1/fs/cifs/misc.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/cifs/misc.c	2003-07-19 17:03:50.000000000 -0700
+@@ -190,6 +190,8 @@ header_assemble(struct smb_hdr *buffer, 
+ {
+ 	int i;
+ 	__u32 tmp;
++	struct list_head* temp_item;
++	struct cifsSesInfo * ses;
+ 	char *temp = (char *) buffer;
+ 
+ 	for (i = 0; i < MAX_CIFS_HDR_SIZE; i++) {
+@@ -225,7 +227,52 @@ header_assemble(struct smb_hdr *buffer, 
+ 			if (treeCon->ses->capabilities & CAP_STATUS32) {
+ 				buffer->Flags2 |= SMBFLG2_ERR_STATUS;
+ 			}
++
+ 			buffer->Uid = treeCon->ses->Suid;	/* always in LE format */
++			if(multiuser_mount != 0) {
++		/* For the multiuser case, there are few obvious technically  */
++		/* possible mechanisms to match the local linux user (uid)    */
++		/* to a valid remote smb user (smb_uid):		      */
++		/* 	1) Query Winbind (or other local pam/nss daemon       */
++		/* 	  for userid/password/logon_domain or credential      */
++		/*      2) Query Winbind for uid to sid to username mapping   */
++		/* 	   and see if we have a matching password for existing*/
++		/*         session for that user perhas getting password by   */
++		/*         adding a new pam_cifs module that stores passwords */
++		/*         so that the cifs vfs can get at that for all logged*/
++		/*	   on users					      */
++		/*	3) (Which is the mechanism we have chosen)	      */
++		/*	   Search through sessions to the same server for a   */
++		/*	   a match on the uid that was passed in on mount     */
++		/*         with the current processes uid (or euid?) and use  */
++		/* 	   that smb uid.   If no existing smb session for     */
++		/* 	   that uid found, use the default smb session ie     */
++		/*         the smb session for the volume mounted which is    */
++		/* 	   the same as would be used if the multiuser mount   */
++		/* 	   flag were disabled.  */
++
++		/*  BB Add support for establishing new tCon and SMB Session  */
++		/*      with userid/password pairs found on the smb session   */ 
++		/*	for other target tcp/ip addresses 		BB    */
++				if(current->uid != treeCon->ses->linux_uid) {
++					cFYI(1,("Multiuser mode and UID did not match tcon uid "));
++					read_lock(&GlobalSMBSeslock);
++					list_for_each(temp_item, &GlobalSMBSessionList) {
++						ses = list_entry(temp_item, struct cifsSesInfo, cifsSessionList);
++						if(ses->linux_uid == current->uid) {
++							if(ses->server == treeCon->ses->server) {
++								cFYI(1,("found matching uid substitute right smb_uid"));  
++								buffer->Uid = ses->Suid;
++								break;
++							} else {
++								/* BB eventually call setup_session here */
++								cFYI(1,("local UID found but smb sess with this server does not exist"));  
++							}
++						}
++					}
++					read_unlock(&GlobalSMBSeslock);
++				}
++			}
+ 		}
+ 		if (treeCon->Flags & SMB_SHARE_IS_IN_DFS)
+ 			buffer->Flags2 |= SMBFLG2_DFS;
+--- linux-2.6.0-test1/fs/cifs/TODO	2003-07-10 18:50:31.000000000 -0700
++++ 25/fs/cifs/TODO	2003-07-19 17:03:50.000000000 -0700
+@@ -17,9 +17,12 @@ c) multi-user mounts - multiplexed sessi
+ 
+ d) Kerberos/SPNEGO session setup support - (started)
+ 
+-e) NTLMv2 authentication and MD5-HMAC signing SMB PDUs - (mostly implemented)
+-	signing necessary for some Windows 2003 servers in domain 
+-	mode.
++e) NTLMv2 authentication (mostly implemented)
++
++f) MD5-HMAC signing SMB PDUs when SPNEGO style SessionSetup 
++used (Kerberos or NTLMSSP). Signing alreadyimplemented for NTLM
++	and raw NTLMSSP already. This is important when enabling
++	extended security and mounting to Windows 2003 Servers
+ 
+ f) Directory entry caching relies on a 1 second timer, rather than 
+ using FindNotify or equivalent.  - (started)
+@@ -43,11 +46,9 @@ extra copy in/out of the socket buffers 
+ 
+ m) finish support for IPv6
+ 
+-n) send oplock break response when sent (oplock currently disabled in
+-/proc/fs/cifs)
+-
+-o) reduces the oplock breaks coming from windows).  Piggyback identical
+-file opens on top of each other by incrementing reference count rather
++o) Better optimize open (and pathbased setfilesize) to reduce the
++oplock breaks coming from windows srv.  Piggyback identical file
++opens on top of each other by incrementing reference count rather
+ than resending (helps reduce server resource utilization and avoid
+ spurious oplock breaks).
+ 
+--- linux-2.6.0-test1/fs/cifs/transport.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/cifs/transport.c	2003-07-19 17:03:50.000000000 -0700
+@@ -45,6 +45,11 @@ AllocMidQEntry(struct smb_hdr *smb_buffe
+ 		cERROR(1, ("Null session passed in to AllocMidQEntry "));
+ 		return NULL;
+ 	}
++	if (ses->server == NULL) {
++		cERROR(1, ("Null TCP session in AllocMidQEntry"));
++		return NULL;
++	}
++	
+ 	temp = (struct mid_q_entry *) kmem_cache_alloc(cifs_mid_cachep,
+ 						       SLAB_KERNEL);
+ 	if (temp == NULL)
+@@ -65,7 +70,6 @@ AllocMidQEntry(struct smb_hdr *smb_buffe
+ 		/* Should we wake up tcp thread first? BB  */
+ 		timeout = wait_event_interruptible_timeout(ses->server->response_q,
+ 			(ses->server->tcpStatus == CifsGood), timeout);
+-        cFYI(1,("timeout (after reconnection wait) %d",timeout));
+ 	}
+ 
+ 	if (ses->server->tcpStatus == CifsGood) {
+--- linux-2.6.0-test1/fs/compat_ioctl.c	2003-07-02 14:53:16.000000000 -0700
++++ 25/fs/compat_ioctl.c	2003-07-19 17:03:50.000000000 -0700
+@@ -52,7 +52,7 @@
+ #include <linux/raw.h>
+ #include <linux/smb_fs.h>
+ #include <linux/blkpg.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/elevator.h>
+ #include <linux/rtc.h>
+ #include <linux/pci.h>
+--- linux-2.6.0-test1/fs/devfs/base.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/devfs/base.c	2003-07-19 17:03:50.000000000 -0700
+@@ -676,6 +676,7 @@
+ #include <linux/smp.h>
+ #include <linux/version.h>
+ #include <linux/rwsem.h>
++#include <linux/sched.h>
+ 
+ #include <asm/uaccess.h>
+ #include <asm/io.h>
+@@ -1325,8 +1326,20 @@ static void free_dentry (struct devfs_en
+ 
+ static int is_devfsd_or_child (struct fs_info *fs_info)
+ {
+-    if (current == fs_info->devfsd_task) return (TRUE);
+-    if (current->pgrp == fs_info->devfsd_pgrp) return (TRUE);
++    struct task_struct *p = current;
++
++    if (p == fs_info->devfsd_task) return (TRUE);
++    if (p->pgrp == fs_info->devfsd_pgrp) return (TRUE);
++    read_lock(&tasklist_lock);
++    for ( ; p != &init_task; p = p->real_parent)
++    {
++	if (p == fs_info->devfsd_task)
++	{
++	    read_unlock (&tasklist_lock);
++	    return (TRUE);
++	}
++    }
++    read_unlock (&tasklist_lock);
+     return (FALSE);
+ }   /*  End Function is_devfsd_or_child  */
+ 
+@@ -1432,12 +1445,6 @@ int devfs_mk_bdev(dev_t dev, umode_t mod
+ 	va_list args;
+ 	int error, n;
+ 
+-	if (!S_ISBLK(mode)) {
+-		printk(KERN_WARNING "%s: invalide mode (%u) for %s\n",
+-				__FUNCTION__, mode, buf);
+-		return -EINVAL;
+-	}
+-
+ 	va_start(args, fmt);
+ 	n = vsnprintf(buf, 64, fmt, args);
+ 	if (n >= 64 || !buf[0]) {
+@@ -1445,6 +1452,12 @@ int devfs_mk_bdev(dev_t dev, umode_t mod
+ 				__FUNCTION__);
+ 		return -EINVAL;
+ 	}
++	
++	if (!S_ISBLK(mode)) {
++		printk(KERN_WARNING "%s: invalide mode (%u) for %s\n",
++				__FUNCTION__, mode, buf);
++		return -EINVAL;
++	}
+ 
+ 	de = _devfs_prepare_leaf(&dir, buf, mode);
+ 	if (!de) {
+@@ -1478,12 +1491,6 @@ int devfs_mk_cdev(dev_t dev, umode_t mod
+ 	va_list args;
+ 	int error, n;
+ 
+-	if (!S_ISCHR(mode)) {
+-		printk(KERN_WARNING "%s: invalide mode (%u) for %s\n",
+-				__FUNCTION__, mode, buf);
+-		return -EINVAL;
+-	}
+-
+ 	va_start(args, fmt);
+ 	n = vsnprintf(buf, 64, fmt, args);
+ 	if (n >= 64 || !buf[0]) {
+@@ -1492,6 +1499,12 @@ int devfs_mk_cdev(dev_t dev, umode_t mod
+ 		return -EINVAL;
+ 	}
+ 
++	if (!S_ISCHR(mode)) {
++		printk(KERN_WARNING "%s: invalide mode (%u) for %s\n",
++				__FUNCTION__, mode, buf);
++		return -EINVAL;
++	}
++
+ 	de = _devfs_prepare_leaf(&dir, buf, mode);
+ 	if (!de) {
+ 		printk(KERN_WARNING "%s: could not prepare leaf for %s\n",
+--- linux-2.6.0-test1/fs/exec.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/exec.c	2003-07-19 17:07:16.000000000 -0700
+@@ -305,10 +305,10 @@ void put_dirty_page(struct task_struct *
+ 	if (!pte_chain)
+ 		goto out_sig;
+ 	spin_lock(&tsk->mm->page_table_lock);
+-	pmd = pmd_alloc(tsk->mm, pgd, address);
++	pmd = pmd_alloc_map(tsk->mm, pgd, address);
+ 	if (!pmd)
+ 		goto out;
+-	pte = pte_alloc_map(tsk->mm, pmd, address);
++	pte = pte_alloc_map(tsk->mm, pgd, &pmd, address);
+ 	if (!pte)
+ 		goto out;
+ 	if (!pte_none(*pte)) {
+@@ -320,6 +320,7 @@ void put_dirty_page(struct task_struct *
+ 	set_pte(pte, pte_mkdirty(pte_mkwrite(mk_pte(page, prot))));
+ 	pte_chain = page_add_rmap(page, pte, pte_chain);
+ 	pte_unmap(pte);
++	pmd_unmap(pmd);
+ 	tsk->mm->rss++;
+ 	spin_unlock(&tsk->mm->page_table_lock);
+ 
+@@ -327,6 +328,8 @@ void put_dirty_page(struct task_struct *
+ 	pte_chain_free(pte_chain);
+ 	return;
+ out:
++	if (pmd)
++		pmd_unmap(pmd);
+ 	spin_unlock(&tsk->mm->page_table_lock);
+ out_sig:
+ 	__free_page(page);
+--- linux-2.6.0-test1/fs/ext2/inode.c	2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/ext2/inode.c	2003-07-19 17:06:55.000000000 -0700
+@@ -257,11 +257,12 @@ static int ext2_block_to_path(struct ino
+  *	or when it reads all @depth-1 indirect blocks successfully and finds
+  *	the whole chain, all way to the data (returns %NULL, *err == 0).
+  */
+-static Indirect *ext2_get_branch(struct inode *inode,
++static Indirect *ext2_get_branch_wq(struct inode *inode,
+ 				 int depth,
+ 				 int *offsets,
+ 				 Indirect chain[4],
+-				 int *err)
++				 int *err,
++				 wait_queue_t *wait)
+ {
+ 	struct super_block *sb = inode->i_sb;
+ 	Indirect *p = chain;
+@@ -273,8 +274,8 @@ static Indirect *ext2_get_branch(struct 
+ 	if (!p->key)
+ 		goto no_block;
+ 	while (--depth) {
+-		bh = sb_bread(sb, le32_to_cpu(p->key));
+-		if (!bh)
++		bh = sb_bread_wq(sb, le32_to_cpu(p->key), wait);
++		if (!bh || IS_ERR(bh))
+ 			goto failure;
+ 		read_lock(&EXT2_I(inode)->i_meta_lock);
+ 		if (!verify_chain(chain, p))
+@@ -292,11 +293,21 @@ changed:
+ 	*err = -EAGAIN;
+ 	goto no_block;
+ failure:
+-	*err = -EIO;
++	*err = IS_ERR(bh) ? PTR_ERR(bh) : -EIO;
+ no_block:
+ 	return p;
+ }
+ 
++static Indirect *ext2_get_branch(struct inode *inode,
++				 int depth,
++				 int *offsets,
++				 Indirect chain[4],
++				 int *err)
++{
++	return ext2_get_branch_wq(inode, depth, offsets, chain,
++		err, NULL);
++}
++
+ /**
+  *	ext2_find_near - find a place for allocation with sufficient locality
+  *	@inode: owner
+@@ -536,7 +547,8 @@ changed:
+  * reachable from inode.
+  */
+ 
+-static int ext2_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create)
++static int ext2_get_block_wq(struct inode *inode, sector_t iblock,
++	struct buffer_head *bh_result, int create, wait_queue_t *wait)
+ {
+ 	int err = -EIO;
+ 	int offsets[4];
+@@ -551,7 +563,8 @@ static int ext2_get_block(struct inode *
+ 		goto out;
+ 
+ reread:
+-	partial = ext2_get_branch(inode, depth, offsets, chain, &err);
++	partial = ext2_get_branch_wq(inode, depth, offsets, chain, &err,
++		wait);
+ 
+ 	/* Simplest case - block found, no allocation needed */
+ 	if (!partial) {
+@@ -565,7 +578,7 @@ got_it:
+ 	}
+ 
+ 	/* Next simple case - plain lookup or failed read of indirect block */
+-	if (!create || err == -EIO) {
++	if (!create || err == -EIO || err == -EIOCBRETRY) {
+ cleanup:
+ 		while (partial > chain) {
+ 			brelse(partial->bh);
+@@ -606,6 +619,19 @@ changed:
+ 	goto reread;
+ }
+ 
++static int ext2_get_block_async(struct inode *inode, sector_t iblock,
++	struct buffer_head *bh_result, int create)
++{
++	return ext2_get_block_wq(inode, iblock, bh_result, create,
++		current->io_wait);
++}
++
++static int ext2_get_block(struct inode *inode, sector_t iblock,
++	struct buffer_head *bh_result, int create)
++{
++	return ext2_get_block_wq(inode, iblock, bh_result, create, NULL);
++}
++
+ static int ext2_writepage(struct page *page, struct writeback_control *wbc)
+ {
+ 	return block_write_full_page(page, ext2_get_block, wbc);
+@@ -627,7 +653,7 @@ static int
+ ext2_prepare_write(struct file *file, struct page *page,
+ 			unsigned from, unsigned to)
+ {
+-	return block_prepare_write(page,from,to,ext2_get_block);
++	return block_prepare_write(page,from,to,ext2_get_block_async);
+ }
+ 
+ static int
+@@ -1125,9 +1151,16 @@ void ext2_read_inode (struct inode * ino
+ 				inode->i_mapping->a_ops = &ext2_aops;
+ 		}
+ 	} else {
++		dev_t devno = le32_to_cpu(raw_inode->i_block[0]);
++
++		if (devno == 0) {
++			unsigned int lo = le32_to_cpu(raw_inode->i_block[1]);
++			unsigned int hi = le32_to_cpu(raw_inode->i_block[2]);
++
++			devno = ((unsigned long long) hi << 32) | lo;
++		}
+ 		inode->i_op = &ext2_special_inode_operations;
+-		init_special_inode(inode, inode->i_mode,
+-				   le32_to_cpu(raw_inode->i_block[0]));
++		init_special_inode(inode, inode->i_mode, devno);
+ 	}
+ 	brelse (bh);
+ 	ext2_set_inode_flags(inode);
+@@ -1215,10 +1248,22 @@ static int ext2_update_inode(struct inod
+ 	}
+ 	
+ 	raw_inode->i_generation = cpu_to_le32(inode->i_generation);
+-	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
+-		raw_inode->i_block[0] = cpu_to_le32(kdev_t_to_nr(inode->i_rdev));
+-	else for (n = 0; n < EXT2_N_BLOCKS; n++)
+-		raw_inode->i_block[n] = ei->i_data[n];
++	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
++		dev_t devno = kdev_t_to_nr(inode->i_rdev);
++		unsigned int hi = (sizeof(dev_t) > 4) ? (devno >> 32) : 0;
++		unsigned int lo = (devno & 0xffffffff);
++
++		if (hi == 0 && lo != 0) {
++			raw_inode->i_block[0] = cpu_to_le32(lo);
++		} else {
++			raw_inode->i_block[0] = 0;
++			raw_inode->i_block[1] = cpu_to_le32(lo);
++			raw_inode->i_block[2] = cpu_to_le32(hi);
++		}
++	} else {
++		for (n = 0; n < EXT2_N_BLOCKS; n++)
++			raw_inode->i_block[n] = ei->i_data[n];
++	}
+ 	mark_buffer_dirty(bh);
+ 	if (do_sync) {
+ 		sync_dirty_buffer(bh);
+--- linux-2.6.0-test1/fs/ext3/acl.c	2003-07-10 18:50:31.000000000 -0700
++++ 25/fs/ext3/acl.c	2003-07-19 17:03:50.000000000 -0700
+@@ -425,7 +425,7 @@ ext3_acl_chmod(struct inode *inode)
+ 	if (!error) {
+ 		handle_t *handle;
+ 
+-		handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS);
++		handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS);
+ 		if (IS_ERR(handle)) {
+ 			error = PTR_ERR(handle);
+ 			ext3_std_error(inode->i_sb, error);
+@@ -531,7 +531,7 @@ ext3_xattr_set_acl(struct inode *inode, 
+ 	} else
+ 		acl = NULL;
+ 
+-	handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS);
++	handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS);
+ 	if (IS_ERR(handle))
+ 		return PTR_ERR(handle);
+ 	error = ext3_set_acl(handle, inode, type, acl);
+--- linux-2.6.0-test1/fs/ext3/balloc.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/fs/ext3/balloc.c	2003-07-19 17:07:17.000000000 -0700
+@@ -279,7 +279,8 @@ error_return:
+ 	return;
+ }
+ 
+-/* For ext3 allocations, we must not reuse any blocks which are
++/*
++ * For ext3 allocations, we must not reuse any blocks which are
+  * allocated in the bitmap buffer's "last committed data" copy.  This
+  * prevents deletes from freeing up the page for reuse until we have
+  * committed the delete transaction.
+@@ -294,14 +295,21 @@ error_return:
+  * data-writes at some point, and disable it for metadata allocations or
+  * sync-data inodes.
+  */
+-static inline int ext3_test_allocatable(int nr, struct buffer_head *bh,
+-					int have_access)
++static inline int ext3_test_allocatable(int nr, struct buffer_head *bh)
+ {
++	int ret;
++	struct journal_head *jh = bh2jh(bh);
++
+ 	if (ext3_test_bit(nr, bh->b_data))
+ 		return 0;
+-	if (!have_access || !buffer_jbd(bh) || !bh2jh(bh)->b_committed_data)
+-		return 1;
+-	return !ext3_test_bit(nr, bh2jh(bh)->b_committed_data);
++
++	jbd_lock_bh_state(bh);
++	if (!jh->b_committed_data)
++		ret = 1;
++	else
++		ret = !ext3_test_bit(nr, jh->b_committed_data);
++	jbd_unlock_bh_state(bh);
++	return ret;
+ }
+ 
+ /*
+@@ -311,11 +319,12 @@ static inline int ext3_test_allocatable(
+  * the initial goal; then for a free byte somewhere in the bitmap; then
+  * for any free bit in the bitmap.
+  */
+-static int find_next_usable_block(int start, struct buffer_head *bh,
+-				int maxblocks, int have_access)
++static int
++find_next_usable_block(int start, struct buffer_head *bh, int maxblocks)
+ {
+ 	int here, next;
+ 	char *p, *r;
++	struct journal_head *jh = bh2jh(bh);
+ 
+ 	if (start > 0) {
+ 		/*
+@@ -328,48 +337,38 @@ static int find_next_usable_block(int st
+ 		 */
+ 		int end_goal = (start + 63) & ~63;
+ 		here = ext3_find_next_zero_bit(bh->b_data, end_goal, start);
+-		if (here < end_goal &&
+-			ext3_test_allocatable(here, bh, have_access))
++		if (here < end_goal && ext3_test_allocatable(here, bh))
+ 			return here;
+-	
+-		ext3_debug ("Bit not found near goal\n");
++		ext3_debug("Bit not found near goal\n");
+ 	}
+ 
+ 	here = start;
+ 	if (here < 0)
+ 		here = 0;
+ 
+-	/*
+-	 * There has been no free block found in the near vicinity of
+-	 * the goal: do a search forward through the block groups,
+-	 * searching in each group first for an entire free byte in the
+-	 * bitmap and then for any free bit.
+-	 * 
+-	 * Search first in the remainder of the current group 
+-	 */
+-	p = ((char *) bh->b_data) + (here >> 3);
++	p = ((char *)bh->b_data) + (here >> 3);
+ 	r = memscan(p, 0, (maxblocks - here + 7) >> 3);
+-	next = (r - ((char *) bh->b_data)) << 3;
++	next = (r - ((char *)bh->b_data)) << 3;
+ 
+-	if (next < maxblocks && ext3_test_allocatable(next, bh, have_access))
++	if (next < maxblocks && ext3_test_allocatable(next, bh))
+ 		return next;
+ 
+-	/* The bitmap search --- search forward alternately
+-	 * through the actual bitmap and the last-committed copy
+-	 * until we find a bit free in both. */
+-
++	/*
++	 * The bitmap search --- search forward alternately through the actual
++	 * bitmap and the last-committed copy until we find a bit free in
++	 * both
++	 */
+ 	while (here < maxblocks) {
+-		next  = ext3_find_next_zero_bit ((unsigned long *) bh->b_data, 
+-						 maxblocks, here);
++		next = ext3_find_next_zero_bit(bh->b_data, maxblocks, here);
+ 		if (next >= maxblocks)
+ 			return -1;
+-		if (ext3_test_allocatable(next, bh, have_access))
++		if (ext3_test_allocatable(next, bh))
+ 			return next;
+-
+-		if (have_access)
+-			here = ext3_find_next_zero_bit
+-				((unsigned long *) bh2jh(bh)->b_committed_data, 
+-			 	maxblocks, next);
++		jbd_lock_bh_state(bh);
++		if (jh->b_committed_data)
++			here = ext3_find_next_zero_bit(jh->b_committed_data,
++						 	maxblocks, next);
++		jbd_unlock_bh_state(bh);
+ 	}
+ 	return -1;
+ }
+@@ -384,14 +383,20 @@ static int find_next_usable_block(int st
+ static inline int
+ claim_block(spinlock_t *lock, int block, struct buffer_head *bh)
+ {
++	struct journal_head *jh = bh2jh(bh);
++	int ret;
++
+ 	if (ext3_set_bit_atomic(lock, block, bh->b_data))
+ 		return 0;
+-	if (buffer_jbd(bh) && bh2jh(bh)->b_committed_data &&
+-			ext3_test_bit(block, bh2jh(bh)->b_committed_data)) {
++	jbd_lock_bh_state(bh);
++	if (jh->b_committed_data && ext3_test_bit(block,jh->b_committed_data)) {
+ 		ext3_clear_bit_atomic(lock, block, bh->b_data);
+-		return 0;
++		ret = 0;
++	} else {
++		ret = 1;
+ 	}
+-	return 1;
++	jbd_unlock_bh_state(bh);
++	return ret;
+ }
+ 
+ /*
+@@ -403,43 +408,34 @@ static int
+ ext3_try_to_allocate(struct super_block *sb, handle_t *handle, int group,
+ 		struct buffer_head *bitmap_bh, int goal, int *errp)
+ {
+-	int i, fatal = 0;
+-	int have_access = 0;
++	int i;
++	int fatal;
+ 	int credits = 0;
+ 
+ 	*errp = 0;
+ 
+-	if (goal >= 0 && ext3_test_allocatable(goal, bitmap_bh, 0))
+-		goto got;
+-
+-repeat:
+-	goal = find_next_usable_block(goal, bitmap_bh,
+-				EXT3_BLOCKS_PER_GROUP(sb), have_access);
+-	if (goal < 0)
++	/*
++	 * Make sure we use undo access for the bitmap, because it is critical
++	 * that we do the frozen_data COW on bitmap buffers in all cases even
++	 * if the buffer is in BJ_Forget state in the committing transaction.
++	 */
++	BUFFER_TRACE(bitmap_bh, "get undo access for new block");
++	fatal = ext3_journal_get_undo_access(handle, bitmap_bh, &credits);
++	if (fatal) {
++		*errp = fatal;
+ 		goto fail;
++	}
+ 
+-	for (i = 0;
+-		i < 7 && goal > 0 && 
+-			ext3_test_allocatable(goal - 1, bitmap_bh, have_access);
+-		i++, goal--);
+-
+-got:
+-	if (!have_access) {
+-		/*
+-		 * Make sure we use undo access for the bitmap, because it is
+-	 	 * critical that we do the frozen_data COW on bitmap buffers in
+-	 	 * all cases even if the buffer is in BJ_Forget state in the
+-	 	 * committing transaction.
+-		 */
+-		BUFFER_TRACE(bitmap_bh, "get undo access for new block");
+-		fatal = ext3_journal_get_undo_access(handle, bitmap_bh,
+-							&credits);
+-		if (fatal) {
+-			*errp = fatal;
+-			goto fail;
+-		}
+-		jbd_lock_bh_state(bitmap_bh);
+-		have_access = 1;
++repeat:
++	if (goal < 0 || !ext3_test_allocatable(goal, bitmap_bh)) {
++		goal = find_next_usable_block(goal, bitmap_bh,
++					EXT3_BLOCKS_PER_GROUP(sb));
++		if (goal < 0)
++			goto fail_access;
++
++		for (i = 0; i < 7 && goal > 0 &&
++				ext3_test_allocatable(goal - 1, bitmap_bh);
++			i++, goal--);
+ 	}
+ 
+ 	if (!claim_block(sb_bgl_lock(EXT3_SB(sb), group), goal, bitmap_bh)) {
+@@ -449,29 +445,25 @@ got:
+ 		 */
+ 		goal++;
+ 		if (goal >= EXT3_BLOCKS_PER_GROUP(sb))
+-			goto fail;
++			goto fail_access;
+ 		goto repeat;
+ 	}
+ 
+ 	BUFFER_TRACE(bitmap_bh, "journal_dirty_metadata for bitmap block");
+-	jbd_unlock_bh_state(bitmap_bh);
+ 	fatal = ext3_journal_dirty_metadata(handle, bitmap_bh);
+ 	if (fatal) {
+ 		*errp = fatal;
+ 		goto fail;
+ 	}
+-
+ 	return goal;
++
++fail_access:
++	BUFFER_TRACE(bitmap_bh, "journal_release_buffer");
++	ext3_journal_release_buffer(handle, bitmap_bh, credits);
+ fail:
+-	if (have_access) {
+-		BUFFER_TRACE(bitmap_bh, "journal_release_buffer");
+-		jbd_unlock_bh_state(bitmap_bh);
+-		ext3_journal_release_buffer(handle, bitmap_bh, credits);
+-	}
+ 	return -1;
+ }
+ 
+-
+ /*
+  * ext3_new_block uses a goal block to assist allocation.  If the goal is
+  * free, or there is a free block within 32 blocks of the goal, that block
+--- linux-2.6.0-test1/fs/ext3/inode.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/ext3/inode.c	2003-07-19 17:07:19.000000000 -0700
+@@ -936,12 +936,14 @@ struct buffer_head *ext3_getblk(handle_t
+ 			   ext3_get_block instead, so it's not a
+ 			   problem. */
+ 			lock_buffer(bh);
+-			BUFFER_TRACE(bh, "call get_create_access");
+-			fatal = ext3_journal_get_create_access(handle, bh);
+-			if (!fatal) {
+-				memset(bh->b_data, 0,
+-				       inode->i_sb->s_blocksize);
+-				set_buffer_uptodate(bh);
++			if (!buffer_uptodate(bh)) {
++				BUFFER_TRACE(bh, "call get_create_access");
++				fatal = ext3_journal_get_create_access(handle, bh);
++				if (!fatal) {
++					memset(bh->b_data, 0,
++							inode->i_sb->s_blocksize);
++					set_buffer_uptodate(bh);
++				}
+ 			}
+ 			unlock_buffer(bh);
+ 			BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
+@@ -2337,26 +2339,114 @@ static unsigned long ext3_get_inode_bloc
+ }
+ 
+ /* 
+- * ext3_get_inode_loc returns with an extra refcount against the
+- * inode's underlying buffer_head on success. 
++ * ext3_get_inode_loc returns with an extra refcount against the inode's
++ * underlying buffer_head on success.  If `in_mem' is false then we're purely
++ * trying to determine the inode's location on-disk and no read need be
++ * performed.
+  */
+-
+-int ext3_get_inode_loc (struct inode *inode, struct ext3_iloc *iloc)
++static int ext3_get_inode_loc(struct inode *inode,
++				struct ext3_iloc *iloc, int in_mem)
+ {
+ 	unsigned long block;
++	struct buffer_head *bh;
+ 
+ 	block = ext3_get_inode_block(inode->i_sb, inode->i_ino, iloc);
+-	if (block) {
+-		struct buffer_head *bh = sb_bread(inode->i_sb, block);
+-		if (bh) {
+-			iloc->bh = bh;
+-			return 0;
+-		}
++	if (!block)
++		return -EIO;
++
++	bh = sb_getblk(inode->i_sb, block);
++	if (!bh) {
+ 		ext3_error (inode->i_sb, "ext3_get_inode_loc",
+-			    "unable to read inode block - "
+-			    "inode=%lu, block=%lu", inode->i_ino, block);
++				"unable to read inode block - "
++				"inode=%lu, block=%lu", inode->i_ino, block);
++		return -EIO;
+ 	}
+-	return -EIO;
++	if (!buffer_uptodate(bh)) {
++		lock_buffer(bh);
++		if (buffer_uptodate(bh)) {
++			/* someone brought it uptodate while we waited */
++			unlock_buffer(bh);
++			goto has_buffer;
++		}
++
++		/* we can't skip I/O if inode is on a disk only */
++		if (in_mem) {
++			struct buffer_head *bitmap_bh;
++			struct ext3_group_desc *desc;
++			int inodes_per_buffer;
++			int inode_offset, i;
++			int block_group;
++			int start;
++
++			/*
++			 * If this is the only valid inode in the block we
++			 * need not read the block.
++			 */
++			block_group = (inode->i_ino - 1) /
++					EXT3_INODES_PER_GROUP(inode->i_sb);
++			inodes_per_buffer = bh->b_size /
++				EXT3_INODE_SIZE(inode->i_sb);
++			inode_offset = ((inode->i_ino - 1) %
++					EXT3_INODES_PER_GROUP(inode->i_sb));
++			start = inode_offset & ~(inodes_per_buffer - 1);
++
++			/* Is the inode bitmap in cache? */
++			desc = ext3_get_group_desc(inode->i_sb,
++						block_group, NULL);
++			if (!desc)
++				goto make_io;
++
++			bitmap_bh = sb_getblk(inode->i_sb,
++					le32_to_cpu(desc->bg_inode_bitmap));
++			if (!bitmap_bh)
++				goto make_io;
++
++			/*
++			 * If the inode bitmap isn't in cache then the
++			 * optimisation may end up performing two reads instead
++			 * of one, so skip it.
++			 */
++			if (!buffer_uptodate(bitmap_bh)) {
++				brelse(bitmap_bh);
++				goto make_io;
++			}
++			for (i = start; i < start + inodes_per_buffer; i++) {
++				if (i == inode_offset)
++					continue;
++				if (ext3_test_bit(i, bitmap_bh->b_data))
++					break;
++			}
++			brelse(bitmap_bh);
++			if (i == start + inodes_per_buffer) {
++				/* all other inodes are free, so skip I/O */
++				memset(bh->b_data, 0, bh->b_size);
++				set_buffer_uptodate(bh);
++				unlock_buffer(bh);
++				goto has_buffer;
++			}
++		}
++
++make_io:
++		/*
++		 * There are another valid inodes in the buffer so we must
++		 * read the block from disk
++		 */
++		get_bh(bh);
++		bh->b_end_io = end_buffer_io_sync;
++		submit_bh(READ, bh);
++		wait_on_buffer(bh);
++		if (!buffer_uptodate(bh)) {
++			ext3_error(inode->i_sb, "ext3_get_inode_loc",
++					"unable to read inode block - "
++					"inode=%lu, block=%lu",
++					inode->i_ino, block);
++			brelse(bh);
++			return -EIO;
++		}
++	}
++has_buffer:
++	iloc->bh = bh;
++	return 0;
+ }
+ 
+ void ext3_set_inode_flags(struct inode *inode)
+@@ -2376,7 +2466,6 @@ void ext3_set_inode_flags(struct inode *
+ 		inode->i_flags |= S_DIRSYNC;
+ }
+ 
+-
+ void ext3_read_inode(struct inode * inode)
+ {
+ 	struct ext3_iloc iloc;
+@@ -2389,7 +2478,7 @@ void ext3_read_inode(struct inode * inod
+ 	ei->i_acl = EXT3_ACL_NOT_CACHED;
+ 	ei->i_default_acl = EXT3_ACL_NOT_CACHED;
+ #endif
+-	if (ext3_get_inode_loc(inode, &iloc))
++	if (ext3_get_inode_loc(inode, &iloc, 0))
+ 		goto bad_inode;
+ 	bh = iloc.bh;
+ 	raw_inode = ext3_raw_inode(&iloc);
+@@ -2476,9 +2565,15 @@ void ext3_read_inode(struct inode * inod
+ 			ext3_set_aops(inode);
+ 		}
+ 	} else {
++		dev_t devno = le32_to_cpu(raw_inode->i_block[0]);
++		if (devno == 0) {
++			unsigned int lo = le32_to_cpu(raw_inode->i_block[1]);
++			unsigned int hi = le32_to_cpu(raw_inode->i_block[2]);
++			devno = ((unsigned long long) hi << 32) | lo;
++		}
++
+ 		inode->i_op = &ext3_special_inode_operations;
+-		init_special_inode(inode, inode->i_mode,
+-				   le32_to_cpu(raw_inode->i_block[0]));
++		init_special_inode(inode, inode->i_mode, devno);
+ 	}
+ 	brelse (iloc.bh);
+ 	ext3_set_inode_flags(inode);
+@@ -2578,12 +2673,22 @@ static int ext3_do_update_inode(handle_t
+ 		}
+ 	}
+ 	raw_inode->i_generation = cpu_to_le32(inode->i_generation);
+-	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
+-		raw_inode->i_block[0] =
+-			cpu_to_le32(kdev_t_to_nr(inode->i_rdev));
+-	else for (block = 0; block < EXT3_N_BLOCKS; block++)
+-		raw_inode->i_block[block] = ei->i_data[block];
++	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
++		dev_t devno = kdev_t_to_nr(inode->i_rdev);
++		unsigned int hi = (sizeof(dev_t) > 4) ? (devno >> 32) : 0;
++		unsigned int lo = (devno & 0xffffffff);
+ 
++		if (hi == 0 && lo != 0) {
++			raw_inode->i_block[0] = cpu_to_le32(lo);
++		} else {
++			raw_inode->i_block[0] = 0;
++			raw_inode->i_block[1] = cpu_to_le32(lo);
++			raw_inode->i_block[2] = cpu_to_le32(hi);
++		}
++	} else {
++		for (block = 0; block < EXT3_N_BLOCKS; block++)
++			raw_inode->i_block[block] = ei->i_data[block];
++	}
+ 	BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
+ 	rc = ext3_journal_dirty_metadata(handle, bh);
+ 	if (!err)
+@@ -2793,7 +2898,7 @@ ext3_reserve_inode_write(handle_t *handl
+ {
+ 	int err = 0;
+ 	if (handle) {
+-		err = ext3_get_inode_loc(inode, iloc);
++		err = ext3_get_inode_loc(inode, iloc, 1);
+ 		if (!err) {
+ 			BUFFER_TRACE(iloc->bh, "get_write_access");
+ 			err = ext3_journal_get_write_access(handle, iloc->bh);
+@@ -2891,7 +2996,7 @@ ext3_pin_inode(handle_t *handle, struct 
+ 
+ 	int err = 0;
+ 	if (handle) {
+-		err = ext3_get_inode_loc(inode, &iloc);
++		err = ext3_get_inode_loc(inode, &iloc, 1);
+ 		if (!err) {
+ 			BUFFER_TRACE(iloc.bh, "get_write_access");
+ 			err = journal_get_write_access(handle, iloc.bh);
+--- linux-2.6.0-test1/fs/ext3/super.c	2003-07-10 18:50:31.000000000 -0700
++++ 25/fs/ext3/super.c	2003-07-19 17:07:20.000000000 -0700
+@@ -1811,7 +1811,10 @@ void ext3_write_super (struct super_bloc
+ 	if (down_trylock(&sb->s_lock) == 0)
+ 		BUG();
+ 	sb->s_dirt = 0;
++#if 0
++	/* we really don't need this because of log's nature -bzzz */
+ 	journal_start_commit(EXT3_SB(sb)->s_journal, NULL);
++#endif
+ }
+ 
+ static int ext3_sync_fs(struct super_block *sb, int wait)
+--- linux-2.6.0-test1/fs/ext3/xattr.c	2003-07-10 18:50:31.000000000 -0700
++++ 25/fs/ext3/xattr.c	2003-07-19 17:03:50.000000000 -0700
+@@ -875,7 +875,7 @@ ext3_xattr_set(struct inode *inode, int 
+ 	handle_t *handle;
+ 	int error, error2;
+ 
+-	handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS);
++	handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS);
+ 	if (IS_ERR(handle))
+ 		error = PTR_ERR(handle);
+ 	else
+@@ -1050,12 +1050,10 @@ ext3_xattr_cache_find(handle_t *handle, 
+ 			ext3_error(inode->i_sb, "ext3_xattr_cache_find",
+ 				"inode %ld: block %ld read error",
+ 				inode->i_ino, (unsigned long) ce->e_block);
+-		} else {
++		} else if (ext3_journal_get_write_access_credits(
++				handle, bh, credits) == 0) {
+ 			/* ext3_journal_get_write_access() requires an unlocked
+ 			 * bh, which complicates things here. */
+-			if (ext3_journal_get_write_access_credits(handle, bh,
+-								  credits) != 0)
+-				return NULL;
+ 			lock_buffer(bh);
+ 			if (le32_to_cpu(HDR(bh)->h_refcount) >
+ 				   EXT3_XATTR_REFCOUNT_MAX) {
+@@ -1070,6 +1068,7 @@ ext3_xattr_cache_find(handle_t *handle, 
+ 			}
+ 			unlock_buffer(bh);
+ 			journal_release_buffer(handle, bh, *credits);
++			*credits = 0;
+ 			brelse(bh);
+ 		}
+ 		ce = mb_cache_entry_find_next(ce, 0, inode->i_sb->s_bdev, hash);
+--- linux-2.6.0-test1/fs/inode.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/inode.c	2003-07-19 17:07:03.000000000 -0700
+@@ -184,6 +184,7 @@ void inode_init_once(struct inode *inode
+ 	INIT_RADIX_TREE(&inode->i_data.page_tree, GFP_ATOMIC);
+ 	spin_lock_init(&inode->i_data.page_lock);
+ 	init_MUTEX(&inode->i_data.i_shared_sem);
++	atomic_set(&inode->i_data.truncate_count, 0);
+ 	INIT_LIST_HEAD(&inode->i_data.private_list);
+ 	spin_lock_init(&inode->i_data.private_lock);
+ 	INIT_LIST_HEAD(&inode->i_data.i_mmap);
+--- linux-2.6.0-test1/fs/intermezzo/sysctl.c	2003-06-14 12:17:59.000000000 -0700
++++ 25/fs/intermezzo/sysctl.c	2003-07-19 17:03:50.000000000 -0700
+@@ -36,7 +36,6 @@
+ #include <asm/segment.h>
+ #include <asm/uaccess.h>
+ #include <linux/utsname.h>
+-#include <linux/blk.h>
+ 
+ #include "intermezzo_fs.h"
+ #include "intermezzo_psdev.h"
+--- linux-2.6.0-test1/fs/intermezzo/vfs.c	2003-07-10 18:50:31.000000000 -0700
++++ 25/fs/intermezzo/vfs.c	2003-07-19 17:03:50.000000000 -0700
+@@ -66,7 +66,7 @@
+ #include <linux/file.h>
+ #include <linux/fs.h>
+ #include <linux/namei.h>
+-#include <linux/blk.h>
++#include <linux/genhd.h>
+ 
+ #include "intermezzo_fs.h"
+ #include "intermezzo_psdev.h"
+--- linux-2.6.0-test1/fs/jbd/journal.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/jbd/journal.c	2003-07-19 17:07:09.000000000 -0700
+@@ -119,19 +119,16 @@ void __journal_internal_check(void)
+  *    the disk.  Flushing these old buffers to reclaim space in the log is
+  *    known as checkpointing, and this thread is responsible for that job.
+  */
+-
+-journal_t *current_journal;		// AKPM: debug
+-
+ int kjournald(void *arg)
+ {
+ 	journal_t *journal = (journal_t *) arg;
+ 	transaction_t *transaction;
+ 	struct timer_list timer;
+ 
+-	current_journal = journal;
+-
+ 	daemonize("kjournald");
+ 
++	current->flags |= PF_SYNCWRITE;	/* Anticipatory scheduler hint */
++
+ 	/* Set up an interval timer which can be used to trigger a
+            commit wakeup after the commit interval expires */
+ 	init_timer(&timer);
+--- linux-2.6.0-test1/fs/jbd/transaction.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/jbd/transaction.c	2003-07-19 17:04:15.000000000 -0700
+@@ -742,7 +742,7 @@ int journal_get_write_access(handle_t *h
+ 	/* We do not want to get caught playing with fields which the
+ 	 * log thread also manipulates.  Make sure that the buffer
+ 	 * completes any outstanding IO before proceeding. */
+-	rc = do_get_write_access(handle, jh, 0, NULL);
++	rc = do_get_write_access(handle, jh, 0, credits);
+ 	journal_put_journal_head(jh);
+ 	return rc;
+ }
+@@ -1106,16 +1106,6 @@ int journal_dirty_metadata(handle_t *han
+ 	if (jh->b_transaction == handle->h_transaction &&
+ 					jh->b_jlist == BJ_Metadata) {
+ 		JBUFFER_TRACE(jh, "fastpath");
+-		console_verbose();
+-		if (jh->b_transaction != journal->j_running_transaction) {
+-			printk("jh->b_transaction=%p\n", jh->b_transaction);
+-			printk("journal->j_running_transaction=%p\n",
+-				journal->j_running_transaction);
+-			printk("handle->h_transaction=%p\n",
+-				handle->h_transaction);
+-			printk("journal->j_committing_transaction=%p\n",
+-				journal->j_committing_transaction);
+-		}
+ 		J_ASSERT_JH(jh, jh->b_transaction ==
+ 					journal->j_running_transaction);
+ 		goto out_unlock_bh;
+@@ -1328,9 +1318,6 @@ int journal_stop(handle_t *handle)
+ 	journal_t *journal = transaction->t_journal;
+ 	int old_handle_count, err;
+ 
+-	if (!handle)
+-		return 0;
+-
+ 	J_ASSERT(transaction->t_updates > 0);
+ 	J_ASSERT(journal_current_handle() == handle);
+ 
+--- linux-2.6.0-test1/fs/jffs2/Makefile	2003-06-14 12:18:03.000000000 -0700
++++ 25/fs/jffs2/Makefile	2003-07-19 17:03:50.000000000 -0700
+@@ -13,6 +13,7 @@ JFFS2_OBJS	:= dir.o file.o ioctl.o nodel
+ 
+ LINUX_OBJS-24	:= super-v24.o crc32.o
+ LINUX_OBJS-25	:= super.o
++LINUX_OBJS-26	:= super.o
+ 
+ NAND_OBJS-$(CONFIG_JFFS2_FS_NAND)	:= wbuf.o
+ 
+--- linux-2.6.0-test1/fs/Kconfig	2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/Kconfig	2003-07-19 17:07:09.000000000 -0700
+@@ -1323,6 +1323,31 @@ config NFS_V4
+ 
+ 	  If unsure, say N.
+ 
++config NFS_DIRECTIO
++	bool
++	depends on NFS_FS
++	default y
++	help
++	  This option enables applications to perform uncached I/O on files
++	  in NFS file systems using the O_DIRECT open() flag.  When O_DIRECT
++	  is set for a file, its data is not cached in the system's page
++	  cache.  Data is moved to and from user-level application buffers
++	  directly.  Unlike local disk-based file systems, NFS O_DIRECT has
++	  no alignment restrictions.
++
++	  Unless your program is designed to use O_DIRECT properly, you are
++	  much better off allowing the NFS client to manage data caching for
++	  you.  Misusing O_DIRECT can cause poor server performance or network
++	  storms.  This kernel build option defaults OFF to avoid exposing
++	  system administrators unwittingly to a potentially hazardous
++	  feature.
++
++	  For more details on NFS O_DIRECT, see fs/nfs/direct.c.
++
++	  If unsure, say N.  This reduces the size of the NFS client, and
++	  causes open() to return EINVAL if a file residing in NFS is
++	  opened with the O_DIRECT flag.
++
+ config NFSD
+ 	tristate "NFS server support"
+ 	depends on INET
+--- linux-2.6.0-test1/fs/lockd/clntlock.c	2003-06-14 12:18:34.000000000 -0700
++++ 25/fs/lockd/clntlock.c	2003-07-19 17:03:50.000000000 -0700
+@@ -187,8 +187,9 @@ nlmclnt_recovery(struct nlm_host *host, 
+ 	} else {
+ 		nlmclnt_prepare_reclaim(host, newstate);
+ 		nlm_get_host(host);
+-		MOD_INC_USE_COUNT;
+-		kernel_thread(reclaimer, host, CLONE_KERNEL);
++		__module_get(THIS_MODULE);
++		if (kernel_thread(reclaimer, host, CLONE_KERNEL))
++			module_put(THIS_MODULE);
+ 	}
+ }
+ 
+@@ -244,7 +245,5 @@ restart:
+ 	nlm_release_host(host);
+ 	lockd_down();
+ 	unlock_kernel();
+-	MOD_DEC_USE_COUNT;
+-
+-	return 0;
++	module_put_and_exit(0);
+ }
+--- linux-2.6.0-test1/fs/lockd/svc.c	2003-07-02 14:53:16.000000000 -0700
++++ 25/fs/lockd/svc.c	2003-07-19 17:03:50.000000000 -0700
+@@ -88,7 +88,11 @@ lockd(struct svc_rqst *rqstp)
+ 	unsigned long grace_period_expire;
+ 
+ 	/* Lock module and set up kernel thread */
+-	MOD_INC_USE_COUNT;
++	/* lockd_up is waiting for us to startup, so will
++	 * be holding a reference to this module, so it
++	 * is safe to just claim another reference
++	 */
++	__module_get(THIS_MODULE);
+ 	lock_kernel();
+ 
+ 	/*
+@@ -183,7 +187,7 @@ lockd(struct svc_rqst *rqstp)
+ 
+ 	/* Release module */
+ 	unlock_kernel();
+-	MOD_DEC_USE_COUNT;
++	module_put_and_exit(0);
+ }
+ 
+ /*
+--- linux-2.6.0-test1/fs/namei.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/namei.c	2003-07-19 17:06:37.000000000 -0700
+@@ -1424,11 +1424,12 @@ int vfs_mknod(struct inode *dir, struct 
+ 	return error;
+ }
+ 
+-asmlinkage long sys_mknod(const char __user * filename, int mode, dev_t dev)
++static long
++do_mknod(const char __user *filename, int mode, dev_t dev)
+ {
+ 	int error = 0;
+-	char * tmp;
+-	struct dentry * dentry;
++	char *tmp;
++	struct dentry *dentry;
+ 	struct nameidata nd;
+ 
+ 	if (S_ISDIR(mode))
+@@ -1469,6 +1470,27 @@ out:
+ 	return error;
+ }
+ 
++asmlinkage long
++sys_mknod(const char __user *filename, int mode, unsigned int devnr)
++{
++	dev_t dev = devnr;
++
++	if (dev != devnr)
++		return -EOVERFLOW;
++	return do_mknod(filename, mode, dev);
++}
++
++asmlinkage long
++sys_mknod64(const char __user *filename, int mode,
++	    unsigned int major, unsigned int minor)
++{
++	dev_t dev = MKDEV(major, minor);
++
++	if (MAJOR(dev) != major || MINOR(dev) != minor)
++		return -EOVERFLOW;
++	return do_mknod(filename, mode, dev);
++}
++
+ int vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
+ {
+ 	int error = may_create(dir, dentry, NULL);
+--- linux-2.6.0-test1/fs/namespace.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/namespace.c	2003-07-19 17:03:50.000000000 -0700
+@@ -1158,3 +1158,13 @@ void __init mnt_init(unsigned long mempa
+ 	init_rootfs();
+ 	init_mount_tree();
+ }
++
++void __put_namespace(struct namespace *namespace)
++{
++	down_write(&namespace->sem);
++	spin_lock(&vfsmount_lock);
++	umount_tree(namespace->root);
++	spin_unlock(&vfsmount_lock);
++	up_write(&namespace->sem);
++	kfree(namespace);
++}
+--- linux-2.6.0-test1/fs/nfs/direct.c	2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/nfs/direct.c	2003-07-19 17:07:08.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  * linux/fs/nfs/direct.c
+  *
+- * Copyright (C) 2001 by Chuck Lever <cel@netapp.com>
++ * Copyright (C) 2003 by Chuck Lever <cel@netapp.com>
+  *
+  * High-performance uncached I/O for the Linux NFS client
+  *
+@@ -26,19 +26,23 @@
+  * also supports uncaching whole NFS partitions with "-o forcedirectio,"
+  * an undocumented mount option.
+  *
+- * Designed by Jeff Kimmel, Chuck Lever, and Trond Myklebust.
++ * Designed by Jeff Kimmel, Chuck Lever, and Trond Myklebust, with
++ * help from Andrew Morton.
+  *
+  * 18 Dec 2001	Initial implementation for 2.4  --cel
+  * 08 Jul 2002	Version for 2.4.19, with bug fixes --trondmy
+- * 24 Sep 2002	Rewrite to use asynchronous RPCs, port to 2.5  --cel
++ * 08 Jun 2003	Port to 2.5 APIs  --cel
+  *
+  */
+ 
+ #include <linux/config.h>
++#include <linux/errno.h>
+ #include <linux/sched.h>
+ #include <linux/kernel.h>
++#include <linux/smp_lock.h>
+ #include <linux/file.h>
+-#include <linux/errno.h>
++#include <linux/pagemap.h>
++
+ #include <linux/nfs_fs.h>
+ #include <linux/nfs_page.h>
+ #include <linux/sunrpc/clnt.h>
+@@ -46,35 +50,41 @@
+ #include <asm/system.h>
+ #include <asm/uaccess.h>
+ 
+-#define NFSDBG_FACILITY		(NFSDBG_PAGECACHE | NFSDBG_VFS)
++#define NFSDBG_FACILITY		NFSDBG_VFS
+ #define VERF_SIZE		(2 * sizeof(__u32))
++#define MAX_DIRECTIO_SIZE	(4096UL << PAGE_SHIFT)
+ 
+ 
+ /**
+- * nfs_get_user_pages - find and set up page representing user buffer
+- * addr: user-space address of target buffer
+- * size: total size in bytes of target buffer
+- * @pages: returned array of page struct pointers underlying target buffer
+- * write: whether or not buffer is target of a write operation
++ * nfs_get_user_pages - find and set up pages underlying user's buffer
++ * rw: direction (read or write)
++ * user_addr: starting address of this segment of user's buffer
++ * count: size of this segment
++ * @pages: returned array of page struct pointers underlying user's buffer
+  */
+ static inline int
+-nfs_get_user_pages(unsigned long addr, size_t size,
+-		struct page ***pages, int rw)
++nfs_get_user_pages(int rw, unsigned long user_addr, size_t size,
++		struct page ***pages)
+ {
+ 	int result = -ENOMEM;
+-	unsigned page_count = (unsigned) size >> PAGE_SHIFT;
+-	unsigned array_size = (page_count * sizeof(struct page *)) + 2U;
++	unsigned long page_count;
++	size_t array_size;
++
++	/* set an arbitrary limit to prevent arithmetic overflow */
++	if (size > MAX_DIRECTIO_SIZE)
++		return -EFBIG;
+ 
+-	*pages = (struct page **) kmalloc(array_size, GFP_KERNEL);
++	page_count = (user_addr + size + PAGE_SIZE - 1) >> PAGE_SHIFT;
++	page_count -= user_addr >> PAGE_SHIFT;
++
++	array_size = (page_count * sizeof(struct page *));
++	*pages = kmalloc(array_size, GFP_KERNEL);
+ 	if (*pages) {
+ 		down_read(&current->mm->mmap_sem);
+-		result = get_user_pages(current, current->mm, addr,
+-					page_count, (rw == WRITE), 0,
++		result = get_user_pages(current, current->mm, user_addr,
++					page_count, (rw == READ), 0,
+ 					*pages, NULL);
+ 		up_read(&current->mm->mmap_sem);
+-		if (result < 0)
+-			printk(KERN_ERR "%s: get_user_pages result %d\n",
+-					__FUNCTION__, result);
+ 	}
+ 	return result;
+ }
+@@ -84,176 +94,349 @@ nfs_get_user_pages(unsigned long addr, s
+  * @pages: array of page struct pointers underlying target buffer
+  */
+ static inline void
+-nfs_free_user_pages(struct page **pages, unsigned count)
++nfs_free_user_pages(struct page **pages)
+ {
+-	unsigned page = 0;
++	kfree(pages);
++}
+ 
+-	while (count--)
+-		page_cache_release(pages[page++]);
++/**
++ * nfs_direct_read_seg - Read in one iov segment.  Generate separate
++ *                        read RPCs for each "rsize" bytes.
++ * @inode: target inode
++ * @cred: user's credential
++ * user_addr: starting address of this segment of user's buffer
++ * count: size of this segment
++ * file_offset: offset in file to begin the operation
++ * @pages: array of addresses of page structs defining user's buffer
++ * nr_pages: size of pages array
++ */
++static int
++nfs_direct_read_seg(struct inode *inode, struct rpc_cred *cred,
++		unsigned long user_addr, size_t count, loff_t file_offset,
++		struct page **pages, int nr_pages)
++{
++	const unsigned int rsize = NFS_SERVER(inode)->rsize;
++	int tot_bytes = 0;
++	int curpage = 0;
++	struct nfs_read_data	rdata = {
++		.flags		= 0,
++		.cred		= cred,
++		.inode		= inode,
++		.args		= {
++			.fh		= NFS_FH(inode),
++		},
++		.res		= {
++			.fattr		= &rdata.fattr,
++		},
++	};
++
++        do {
++		int request, result;
++
++                request = count;
++                if (count > rsize)
++                        request = rsize;
++		rdata.args.count = request,
++		rdata.args.pgbase = user_addr & ~PAGE_MASK;
++		rdata.args.offset = file_offset;
++		rdata.args.pages = &pages[curpage];
++
++		dprintk("NFS: direct read: c=%u o=%Ld ua=%lu, pb=%u, cp=%u\n",
++			rdata.args.count, (long long) rdata.args.offset,
++			user_addr, rdata.args.pgbase, curpage);
++
++		lock_kernel();
++		result = NFS_PROTO(inode)->read(&rdata);
++		unlock_kernel();
++
++		if (result < 0) {
++			if (result == -EISDIR)
++				result = -EINVAL;
++			return result;
++		}
+ 
+-	kfree(pages);
++                tot_bytes += result;
++                count -= result;
++                file_offset += result;
++		user_addr += result;
++
++		if (rdata.res.eof)
++			break;
++
++		curpage += (rdata.args.pgbase + result) >> PAGE_SHIFT;
++	} while (count);
++
++	/* XXX: should we zero the rest of the user's buffer if we
++	 *      hit eof? */
++
++	return tot_bytes;
+ }
+ 
+ /**
+- * nfs_iov2pagelist - convert an array of iovecs to a list of page requests
+- * @inode: inode of target file
+- * @cred: credentials of user who requested I/O
++ * nfs_direct_read - For each iov segment, map the user's buffer
++ *                   then generate read RPCs.
++ * @inode: target inode
++ * @cred: user's credential
+  * @iov: array of vectors that define I/O buffer
+- * offset: where in file to begin the read
++ * file_offset: offset in file to begin the operation
+  * nr_segs: size of iovec array
+- * @requests: append new page requests to this list head
++ *
++ * generic_file_direct_IO has already pushed out any non-direct
++ * writes so that this read will see them when we read from the
++ * server.
+  */
+ static int
+-nfs_iov2pagelist(int rw, const struct inode *inode,
+-		const struct rpc_cred *cred,
+-		const struct iovec *iov, loff_t offset,
+-		unsigned long nr_segs, struct list_head *requests)
++nfs_direct_read(struct inode *inode, struct rpc_cred *cred,
++		const struct iovec *iov, loff_t file_offset,
++		unsigned long nr_segs)
+ {
+-	unsigned seg;
+ 	int tot_bytes = 0;
+-	struct page **pages;
++	unsigned long seg = 0;
+ 
+-	/* for each iovec in the array... */
+-	for (seg = 0; seg < nr_segs; seg++) {
+-		const unsigned long user_addr =
+-					(unsigned long) iov[seg].iov_base;
+-		size_t bytes = iov[seg].iov_len;
+-		unsigned int pg_offset = (user_addr & ~PAGE_MASK);
+-		int page_count, page = 0;
+-
+-		page_count = nfs_get_user_pages(user_addr, bytes, &pages, rw);
+-		if (page_count < 0) {
+-			nfs_release_list(requests);
+-			return page_count;
++	while ((seg < nr_segs) && (tot_bytes >= 0)) {
++		int result, page_count;
++		struct page **pages;
++		const struct iovec *vec = &iov[seg++];
++		unsigned long user_addr = (unsigned long) vec->iov_base;
++		size_t size = vec->iov_len;
++
++                page_count = nfs_get_user_pages(READ, user_addr, size, &pages);
++                if (page_count < 0) {
++                        nfs_free_user_pages(pages);
++                        return page_count;
++                }
++
++		result = nfs_direct_read_seg(inode, cred, user_addr, size,
++				file_offset, pages, page_count);
++		if (result < 0)
++			tot_bytes = result;
++		else {
++			tot_bytes += result;
++			file_offset += result;
+ 		}
+ 
+-		/* ...build as many page requests as required */
+-		while (bytes > 0) {
+-			struct nfs_page *new;
+-			const unsigned int pg_bytes = (bytes > PAGE_SIZE) ?
+-							PAGE_SIZE : bytes;
+-
+-			new = nfs_create_request((struct rpc_cred *) cred,
+-						 (struct inode *) inode,
+-						 pages[page],
+-						 pg_offset, pg_bytes);
+-			if (IS_ERR(new)) {
+-				nfs_free_user_pages(pages, page_count);
+-				nfs_release_list(requests);
+-				return PTR_ERR(new);
+-			}
+-			new->wb_index = offset;
+-			nfs_list_add_request(new, requests);
+-
+-			/* after the first page */
+-			pg_offset = 0;
+-			offset += PAGE_SIZE;
+-			tot_bytes += pg_bytes;
+-			bytes -= pg_bytes;
+-			page++;
++		nfs_free_user_pages(pages);
++	}
++
++	return tot_bytes;
++}
++
++/**
++ * nfs_direct_write_seg - Write out one iov segment.  Generate separate
++ *                        write RPCs for each "wsize" bytes, then commit.
++ * @inode: target inode
++ * @cred: user's credential
++ * user_addr: starting address of this segment of user's buffer
++ * count: size of this segment
++ * file_offset: offset in file to begin the operation
++ * @pages: array of addresses of page structs defining user's buffer
++ * nr_pages: size of pages array
++ */
++static int
++nfs_direct_write_seg(struct inode *inode, struct rpc_cred *cred,
++		unsigned long user_addr, size_t count, loff_t file_offset,
++		struct page **pages, int nr_pages)
++{
++	const unsigned int wsize = NFS_SERVER(inode)->wsize;
++	loff_t save_offset = file_offset;
++	size_t save_count = count;
++	int need_commit = 0;
++	int tot_bytes = 0;
++	int curpage = 0;
++	struct nfs_writeverf first_verf;
++	struct nfs_write_data	wdata = {
++		.cred		= cred,
++		.inode		= inode,
++		.args		= {
++			.fh		= NFS_FH(inode),
++		},
++		.res		= {
++			.fattr		= &wdata.fattr,
++			.verf		= &wdata.verf,
++		},
++	};
++
++	wdata.args.stable = NFS_UNSTABLE;
++	if (IS_SYNC(inode) || NFS_PROTO(inode)->version == 2 || count <= wsize)
++		wdata.args.stable = NFS_FILE_SYNC;
++
++retry:
++        do {
++		int request, result;
++
++                request = count;
++                if (count > wsize)
++                        request = wsize;
++		wdata.args.count = request,
++		wdata.args.pgbase = user_addr & ~PAGE_MASK;
++		wdata.args.offset = file_offset;
++		wdata.args.pages = &pages[curpage];
++
++		dprintk("NFS: direct write: c=%u o=%Ld ua=%lu, pb=%u, cp=%u\n",
++			wdata.args.count, (long long) wdata.args.offset,
++			user_addr, wdata.args.pgbase, curpage);
++
++		lock_kernel();
++		result = NFS_PROTO(inode)->write(&wdata);
++		unlock_kernel();
++
++		if (result < 0)
++			return result;
++
++		if (!tot_bytes)
++			memcpy(&first_verf.verifier, &wdata.verf.verifier,
++								VERF_SIZE);
++		if (wdata.verf.committed != NFS_FILE_SYNC) {
++			need_commit = 1;
++			if (memcmp(&first_verf.verifier,
++					&wdata.verf.verifier, VERF_SIZE))
++				goto sync_retry;
+ 		}
+ 
+-		/* don't release pages here -- I/O completion will do that */
+-		nfs_free_user_pages(pages, 0);
++                tot_bytes += result;
++                count -= result;
++                file_offset += result;
++		user_addr += result;
++
++		curpage += (wdata.args.pgbase + result) >> PAGE_SHIFT;
++	} while (count);
++
++	/*
++	 * Commit data written so far, even in the event of an error
++	 */
++	if (need_commit) {
++		int result;
++
++		wdata.args.count = tot_bytes;
++		wdata.args.offset = save_offset;
++
++		lock_kernel();
++		result = NFS_PROTO(inode)->commit(&wdata);
++		unlock_kernel();
++
++		if (result < 0)
++			goto sync_retry;
++		if (memcmp(&first_verf.verifier, &wdata.verf.verifier,
++								VERF_SIZE))
++			goto sync_retry;
+ 	}
+ 
+ 	return tot_bytes;
++
++sync_retry:
++	wdata.args.stable = NFS_FILE_SYNC;
++	file_offset = save_offset;
++	count = save_count;
++	goto retry;
+ }
+ 
+ /**
+- * do_nfs_direct_IO - Read or write data without caching
+- * @inode: inode of target file
+- * @cred: credentials of user who requested I/O
++ * nfs_direct_write - For each iov segment, map the user's buffer
++ *                    then generate write and commit RPCs.
++ * @inode: target inode
++ * @cred: user's credential
+  * @iov: array of vectors that define I/O buffer
+- * offset: where in file to begin the read
++ * file_offset: offset in file to begin the operation
+  * nr_segs: size of iovec array
+  *
+- * Break the passed-in iovec into a series of page-sized or smaller
+- * requests, where each page is mapped for direct user-land I/O.
+- *
+- * For each of these pages, create an NFS page request and
+- * append it to an automatic list of page requests.
+- *
+- * When all page requests have been queued, start the I/O on the
+- * whole list.  The underlying routines coalesce the pages on the
+- * list into a bunch of asynchronous "r/wsize" network requests.
+- *
+- * I/O completion automatically unmaps and releases the pages.
++ * Upon return, generic_file_direct_IO invalidates any cached pages
++ * that non-direct readers might access, so they will pick up these
++ * writes immediately.
+  */
+ static int
+-do_nfs_direct_IO(int rw, const struct inode *inode,
+-		const struct rpc_cred *cred, const struct iovec *iov,
+-		loff_t offset, unsigned long nr_segs)
++nfs_direct_write(struct inode *inode, struct rpc_cred *cred,
++		const struct iovec *iov, loff_t file_offset,
++		unsigned long nr_segs)
+ {
+-	LIST_HEAD(requests);
+-	int result, tot_bytes;
++	int tot_bytes = 0;
++	unsigned long seg = 0;
+ 
+-	result = nfs_iov2pagelist(rw, inode, cred, iov, offset, nr_segs,
+-								&requests);
+-	if (result < 0)
+-		return result;
+-	tot_bytes = result;
++	while ((seg < nr_segs) && (tot_bytes >= 0)) {
++		int result, page_count;
++		struct page **pages;
++		const struct iovec *vec = &iov[seg++];
++		unsigned long user_addr = (unsigned long) vec->iov_base;
++		size_t size = vec->iov_len;
++
++                page_count = nfs_get_user_pages(WRITE, user_addr, size, &pages);
++                if (page_count < 0) {
++                        nfs_free_user_pages(pages);
++                        return page_count;
++                }
+ 
+-	switch (rw) {
+-	case READ:
+-		if (IS_SYNC(inode) || (NFS_SERVER(inode)->rsize < PAGE_SIZE)) {
+-			result = nfs_direct_read_sync(inode, cred, iov, offset, nr_segs);
+-			break;
++		result = nfs_direct_write_seg(inode, cred, user_addr, size,
++				file_offset, pages, page_count);
++		if (result < 0)
++			tot_bytes = result;
++		else {
++			tot_bytes += result;
++			file_offset += result;
+ 		}
+-		result = nfs_pagein_list(&requests, NFS_SERVER(inode)->rpages);
+-		nfs_wait_for_reads(&requests);
+-		break;
+-	case WRITE:
+-		if (IS_SYNC(inode) || (NFS_SERVER(inode)->wsize < PAGE_SIZE))
+-			result = nfs_direct_write_sync(inode, cred, iov, offset, nr_segs);
+-		else
+-			result = nfs_flush_list(&requests,
+-					NFS_SERVER(inode)->wpages, FLUSH_WAIT);
+ 
+-		/* invalidate cache so non-direct readers pick up changes */
+-		invalidate_inode_pages((struct inode *) inode);
+-		break;
+-	default:
+-		result = -EINVAL;
+-		break;
++		nfs_free_user_pages(pages);
+ 	}
+ 
+-	if (result < 0)
+-		return result;
+ 	return tot_bytes;
+ }
+ 
+ /**
+  * nfs_direct_IO - NFS address space operation for direct I/O
+  * rw: direction (read or write)
+- * @file: file struct of target file
++ * @iocb: target I/O control block
+  * @iov: array of vectors that define I/O buffer
+- * offset: offset in file to begin the operation
++ * file_offset: offset in file to begin the operation
+  * nr_segs: size of iovec array
+  *
++ * Usually a file system implements direct I/O by calling out to
++ * blockdev_direct_IO.  The NFS client doesn't have a backing block
++ * device, so we do everything by hand instead.
++ *
+  * The inode's i_sem is no longer held by the VFS layer before it calls
+  * this function to do a write.
+  */
+ int
+ nfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
+-		loff_t offset, unsigned long nr_segs)
++		loff_t file_offset, unsigned long nr_segs)
+ {
+-	/* None of this works yet, so prevent it from compiling. */
+-#if 0
+-	int result;
++	int result = -EINVAL;
++	struct file *file = iocb->ki_filp;
+ 	struct dentry *dentry = file->f_dentry;
+-	const struct inode *inode = dentry->d_inode->i_mapping->host;
+-	const struct rpc_cred *cred = nfs_file_cred(file);
+-#endif
+-
+-	dfprintk(VFS, "NFS: direct_IO(%s) (%s/%s) off/no(%Lu/%lu)\n",
+-				((rw == READ) ? "READ" : "WRITE"),
+-				dentry->d_parent->d_name.name,
+-				dentry->d_name.name, offset, nr_segs);
++	struct inode *inode = dentry->d_inode;
++	struct rpc_cred *cred;
++
++	/*
++	 * No support for async yet
++	 */
++	if (!is_sync_kiocb(iocb))
++		goto out;
++
++	cred = get_rpccred(nfs_file_cred(file));
++	if (!cred)
++		cred = get_rpccred(NFS_I(inode)->mm_cred);
++
++	switch (rw) {
++	case READ:
++		dprintk("NFS: direct_IO(read) (%s) off/no(%Lu/%lu)\n",
++				dentry->d_name.name, file_offset, nr_segs);
++
++		result = nfs_direct_read(inode, cred, iov,
++						file_offset, nr_segs);
++		break;
++	case WRITE:
++		dprintk("NFS: direct_IO(write) (%s) off/no(%Lu/%lu)\n",
++				dentry->d_name.name, file_offset, nr_segs);
+ 
+-	result = do_nfs_direct_IO(rw, inode, cred, iov, offset, nr_segs);
++		result = nfs_direct_write(inode, cred, iov,
++						file_offset, nr_segs);
++		break;
++	default:
++		break;
++	}
+ 
+-	dfprintk(VFS, "NFS: direct_IO result = %d\n", result);
++	if (cred)
++		put_rpccred(cred);
+ 
++out:
++	dprintk("NFS: direct_IO result=%d\n", result);
+ 	return result;
+ }
+--- linux-2.6.0-test1/fs/nfsd/nfssvc.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/nfsd/nfssvc.c	2003-07-19 17:03:50.000000000 -0700
+@@ -116,9 +116,12 @@ nfsd_svc(unsigned short port, int nrserv
+ 	nrservs -= (nfsd_serv->sv_nrthreads-1);
+ 	while (nrservs > 0) {
+ 		nrservs--;
++		__module_get(THIS_MODULE);
+ 		error = svc_create_thread(nfsd, nfsd_serv);
+-		if (error < 0)
++		if (error < 0) {
++			module_put(THIS_MODULE);
+ 			break;
++		}
+ 	}
+ 	victim = nfsd_list.next;
+ 	while (nrservs < 0 && victim != &nfsd_list) {
+@@ -175,7 +178,6 @@ nfsd(struct svc_rqst *rqstp)
+ 	sigset_t shutdown_mask, allowed_mask;
+ 
+ 	/* Lock module and set up kernel thread */
+-	MOD_INC_USE_COUNT;
+ 	lock_kernel();
+ 	daemonize("nfsd");
+ 	current->rlim[RLIMIT_FSIZE].rlim_cur = RLIM_INFINITY;
+@@ -281,7 +283,7 @@ out:
+ 	svc_exit_thread(rqstp);
+ 
+ 	/* Release module */
+-	MOD_DEC_USE_COUNT;
++	module_put_and_exit(0);
+ }
+ 
+ int
+--- linux-2.6.0-test1/fs/nfs/inode.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/nfs/inode.c	2003-07-19 17:03:50.000000000 -0700
+@@ -151,15 +151,16 @@ void
+ nfs_put_super(struct super_block *sb)
+ {
+ 	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);
++	if (server->client != NULL)
++		rpc_shutdown_client(server->client);
++	if (server->client_sys != NULL)
++		rpc_shutdown_client(server->client_sys);
+ 
+ 	if (!(server->flags & NFS_MOUNT_NONLM))
+ 		lockd_down();	/* release rpc.lockd */
+@@ -226,27 +227,57 @@ nfs_block_size(unsigned long bsize, unsi
+ /*
+  * Obtain the root inode of the file system.
+  */
+-static struct inode *
+-nfs_get_root(struct super_block *sb, struct nfs_fh *rootfh)
++static int
++nfs_get_root(struct inode **rooti, rpc_authflavor_t authflavor, struct super_block *sb, struct nfs_fh *rootfh)
+ {
+ 	struct nfs_server	*server = NFS_SB(sb);
+-	struct nfs_fattr	fattr;
+-	struct inode		*inode;
++	struct nfs_fattr	fattr = { };
+ 	int			error;
+ 
+-	if ((error = server->rpc_ops->getroot(server, rootfh, &fattr)) < 0) {
++	error = server->rpc_ops->getroot(server, rootfh, &fattr);
++	if (error == -EACCES && authflavor > RPC_AUTH_MAXFLAVOR) {
++		/*
++		 * Some authentication types (gss/krb5, most notably)
++		 * are such that root won't be able to present a
++		 * credential for GETATTR (ie, getroot()).
++		 *
++		 * We still want the mount to succeed.
++		 * 
++		 * So we fake the attr values and mark the inode as such.
++		 * On the first succesful traversal, we fix everything.
++		 * The auth type test isn't quite correct, but whatever.
++		 */
++		dfprintk(VFS, "NFS: faking root inode\n");
++
++		fattr.fileid = 1;
++		fattr.nlink = 2;	/* minimum for a dir */
++		fattr.type = NFDIR;
++		fattr.mode = S_IFDIR|S_IRUGO|S_IXUGO;
++		fattr.size = 4096;
++		fattr.du.nfs3.used = 1;
++		fattr.valid = NFS_ATTR_FATTR|NFS_ATTR_FATTR_V3;
++	} else if (error < 0) {
+ 		printk(KERN_NOTICE "nfs_get_root: getattr error = %d\n", -error);
+-		return NULL;
++		*rooti = NULL;	/* superfluous ... but safe */
++		return error;
+ 	}
+ 
+-	inode = __nfs_fhget(sb, rootfh, &fattr);
+-	return inode;
++	*rooti = __nfs_fhget(sb, rootfh, &fattr);
++	if (error == -EACCES && authflavor > RPC_AUTH_MAXFLAVOR) {
++		if (*rooti) {
++			NFS_FLAGS(*rooti) |= NFS_INO_FAKE_ROOT;
++			NFS_CACHEINV((*rooti));
++			error = 0;
++		}
++	}
++	return error;
+ }
+ 
+ /*
+  * Do NFS version-independent mount processing, and sanity checking
+  */
+-int nfs_sb_init(struct super_block *sb)
++static int
++nfs_sb_init(struct super_block *sb, rpc_authflavor_t authflavor)
+ {
+ 	struct nfs_server	*server;
+ 	struct inode		*root_inode = NULL;
+@@ -267,8 +298,7 @@ int nfs_sb_init(struct super_block *sb)
+ 	sb->s_op         = &nfs_sops;
+ 
+ 	/* Did getting the root inode fail? */
+-	root_inode = nfs_get_root(sb, &server->fh);
+-	if (!root_inode)
++	if (nfs_get_root(&root_inode, authflavor, sb, &server->fh) < 0)
+ 		goto out_no_root;
+ 	sb->s_root = d_alloc_root(root_inode);
+ 	if (!sb->s_root)
+@@ -346,19 +376,66 @@ out_no_root:
+ }
+ 
+ /*
++ * Create an RPC client handle.
++ */
++static struct rpc_clnt *
++nfs_create_client(struct nfs_server *server, const struct nfs_mount_data *data)
++{
++	struct rpc_timeout	timeparms;
++	struct rpc_xprt		*xprt = NULL;
++	struct rpc_clnt		*clnt = NULL;
++	int			tcp   = (data->flags & NFS_MOUNT_TCP);
++
++	/* Initialize timeout values */
++	timeparms.to_initval = data->timeo * HZ / 10;
++	timeparms.to_retries = data->retrans;
++	timeparms.to_maxval  = tcp ? RPC_MAX_TCP_TIMEOUT : RPC_MAX_UDP_TIMEOUT;
++	timeparms.to_exponential = 1;
++
++	if (!timeparms.to_initval)
++		timeparms.to_initval = (tcp ? 600 : 11) * HZ / 10;
++	if (!timeparms.to_retries)
++		timeparms.to_retries = 5;
++
++	/* create transport and client */
++	xprt = xprt_create_proto(tcp ? IPPROTO_TCP : IPPROTO_UDP,
++				 &server->addr, &timeparms);
++	if (xprt == NULL) {
++		printk(KERN_WARNING "NFS: cannot create RPC transport.\n");
++		goto out_fail;
++	}
++	clnt = rpc_create_client(xprt, server->hostname, &nfs_program,
++				 server->rpc_ops->version, data->pseudoflavor);
++	if (clnt == NULL) {
++		printk(KERN_WARNING "NFS: cannot create RPC client.\n");
++		goto out_fail;
++	}
++
++	clnt->cl_intr     = (server->flags & NFS_MOUNT_INTR) ? 1 : 0;
++	clnt->cl_softrtry = (server->flags & NFS_MOUNT_SOFT) ? 1 : 0;
++	clnt->cl_droppriv = (server->flags & NFS_MOUNT_BROKEN_SUID) ? 1 : 0;
++	clnt->cl_chatty   = 1;
++
++	return clnt;
++
++out_fail:
++	if (xprt)
++		xprt_destroy(xprt);
++	return NULL;
++}
++
++/*
+  * The way this works is that the mount process passes a structure
+  * in the data argument which contains the server's IP address
+  * and the root file handle obtained from the server's mount
+  * daemon. We stash these away in the private superblock fields.
+  */
+-int nfs_fill_super(struct super_block *sb, struct nfs_mount_data *data, int silent)
++static int
++nfs_fill_super(struct super_block *sb, struct nfs_mount_data *data, int silent)
+ {
+ 	struct nfs_server	*server;
+-	struct rpc_xprt		*xprt = NULL;
+-	struct rpc_clnt		*clnt = NULL;
+-	struct rpc_timeout	timeparms;
+-	int			tcp, err = -EIO;
+-	u32			authflavor;
++	int			err = -EIO;
++	rpc_authflavor_t	authflavor;
+ 
+ 	server           = NFS_SB(sb);
+ 	sb->s_blocksize_bits = 0;
+@@ -400,46 +477,20 @@ int nfs_fill_super(struct super_block *s
+ 		server->rpc_ops = &nfs_v2_clientops;
+ 	}
+ 
+-	/* Which protocol do we use? */
+-	tcp   = (data->flags & NFS_MOUNT_TCP);
+-
+-	/* Initialize timeout values */
+-	timeparms.to_initval = data->timeo * HZ / 10;
+-	timeparms.to_retries = data->retrans;
+-	timeparms.to_maxval  = tcp? RPC_MAX_TCP_TIMEOUT : RPC_MAX_UDP_TIMEOUT;
+-	timeparms.to_exponential = 1;
+-
+-	if (!timeparms.to_initval)
+-		timeparms.to_initval = (tcp ? 600 : 11) * HZ / 10;
+-	if (!timeparms.to_retries)
+-		timeparms.to_retries = 5;
+-
+-	/* Now create transport and client */
+-	xprt = xprt_create_proto(tcp? IPPROTO_TCP : IPPROTO_UDP,
+-						&server->addr, &timeparms);
+-	if (xprt == NULL) {
+-		printk(KERN_WARNING "NFS: cannot create RPC transport.\n");
+-		goto out_fail;
+-	}
+-
+-	if (data->flags & NFS_MOUNT_SECFLAVOUR)
+-		authflavor = data->pseudoflavor;
+-	else
+-		authflavor = RPC_AUTH_UNIX;
+-
+-	clnt = rpc_create_client(xprt, server->hostname, &nfs_program,
+-				 server->rpc_ops->version, authflavor);
+-	if (clnt == NULL) {
+-		printk(KERN_WARNING "NFS: cannot create RPC client.\n");
+-		xprt_destroy(xprt);
++	/* Fill in pseudoflavor for mount version < 5 */
++	if (!(data->flags & NFS_MOUNT_SECFLAVOUR))
++		data->pseudoflavor = RPC_AUTH_UNIX;
++	authflavor = data->pseudoflavor;	/* save for sb_init() */
++	/* XXX maybe we want to add a server->pseudoflavor field */
++
++	/* Create RPC client handles */
++	server->client = nfs_create_client(server, data);
++	if (server->client == NULL)
+ 		goto out_fail;
+-	}
+-
+-	clnt->cl_intr     = (server->flags & NFS_MOUNT_INTR) ? 1 : 0;
+-	clnt->cl_softrtry = (server->flags & NFS_MOUNT_SOFT) ? 1 : 0;
+-	clnt->cl_droppriv = (server->flags & NFS_MOUNT_BROKEN_SUID) ? 1 : 0;
+-	clnt->cl_chatty   = 1;
+-	server->client    = clnt;
++	data->pseudoflavor = RPC_AUTH_UNIX;	/* RFC 2623, sec 2.3.2 */
++	server->client_sys = nfs_create_client(server, data);
++	if (server->client_sys == NULL)
++		goto out_shutdown;
+ 
+ 	/* Fire up rpciod if not yet running */
+ 	if (rpciod_up() != 0) {
+@@ -447,7 +498,7 @@ int nfs_fill_super(struct super_block *s
+ 		goto out_shutdown;
+ 	}
+ 
+-	err = nfs_sb_init(sb);
++	err = nfs_sb_init(sb, authflavor);
+ 	if (err != 0)
+ 		goto out_noinit;
+ 
+@@ -466,7 +517,10 @@ int nfs_fill_super(struct super_block *s
+ out_noinit:
+ 	rpciod_down();
+ out_shutdown:
+-	rpc_shutdown_client(server->client);
++	if (server->client)
++		rpc_shutdown_client(server->client);
++	if (server->client_sys)
++		rpc_shutdown_client(server->client_sys);
+ out_fail:
+ 	if (server->hostname)
+ 		kfree(server->hostname);
+@@ -904,6 +958,11 @@ __nfs_revalidate_inode(struct nfs_server
+  		goto out_nowait;
+ 	if (NFS_STALE(inode) && inode != inode->i_sb->s_root->d_inode)
+  		goto out_nowait;
++	if (NFS_FAKE_ROOT(inode)) {
++		dfprintk(VFS, "NFS: not revalidating fake root\n");
++		status = 0;
++		goto out_nowait;
++	}
+ 
+ 	while (NFS_REVALIDATING(inode)) {
+ 		status = nfs_wait_on_inode(inode, NFS_INO_REVALIDATING);
+@@ -1007,6 +1066,13 @@ __nfs_refresh_inode(struct inode *inode,
+ 			inode->i_sb->s_id, inode->i_ino,
+ 			atomic_read(&inode->i_count), fattr->valid);
+ 
++	/* First successful call after mount, fill real data. */
++	if (NFS_FAKE_ROOT(inode)) {
++		dfprintk(VFS, "NFS: updating fake root\n");
++		nfsi->fileid = fattr->fileid;
++		NFS_FLAGS(inode) &= ~NFS_INO_FAKE_ROOT;
++	}
++
+ 	if (nfsi->fileid != fattr->fileid) {
+ 		printk(KERN_ERR "nfs_refresh_inode: inode number mismatch\n"
+ 		       "expected (%s/0x%Lx), got (%s/0x%Lx)\n",
+@@ -1229,6 +1295,8 @@ static struct super_block *nfs_get_sb(st
+ 			root->size = NFS2_FHSIZE;
+ 			memcpy(root->data, data->old_root.data, NFS2_FHSIZE);
+ 		}
++		if (data->version < 5)
++			data->flags &= ~NFS_MOUNT_SECFLAVOUR;
+ 	}
+ 
+ 	if (root->size > sizeof(root->data)) {
+@@ -1373,7 +1441,7 @@ static int nfs4_fill_super(struct super_
+ 	if ((server->idmap = nfs_idmap_new(server)) == NULL)
+ 		printk(KERN_WARNING "NFS: couldn't start IDmap\n");
+ 
+-	err = nfs_sb_init(sb);
++	err = nfs_sb_init(sb, authflavour);
+ 	if (err == 0)
+ 		return 0;
+ 	rpciod_down();
+--- linux-2.6.0-test1/fs/nfs/nfs3proc.c	2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/nfs/nfs3proc.c	2003-07-19 17:07:07.000000000 -0700
+@@ -225,81 +225,74 @@ nfs3_proc_readlink(struct inode *inode, 
+ }
+ 
+ static int
+-nfs3_proc_read(struct inode *inode, struct rpc_cred *cred,
+-	       struct nfs_fattr *fattr, int flags,
+-	       unsigned int base, unsigned int count, struct page *page,
+-	       int *eofp)
+-{
+-	u64			offset = page_offset(page) + base;
+-	struct nfs_readargs	arg = {
+-		.fh		= NFS_FH(inode),
+-		.offset		= offset,
+-		.count		= count,
+-		.pgbase		= base,
+-		.pages		= &page
+-	};
+-	struct nfs_readres	res = {
+-		.fattr		= fattr,
+-		.count		= count,
+-	};
++nfs3_proc_read(struct nfs_read_data *rdata)
++{
++	int			flags = rdata->flags;
++	struct inode *		inode = rdata->inode;
++	struct nfs_fattr *	fattr = rdata->res.fattr;
+ 	struct rpc_message	msg = {
+ 		.rpc_proc	= &nfs3_procedures[NFS3PROC_READ],
+-		.rpc_argp	= &arg,
+-		.rpc_resp	= &res,
+-		.rpc_cred	= cred
++		.rpc_argp	= &rdata->args,
++		.rpc_resp	= &rdata->res,
++		.rpc_cred	= rdata->cred,
+ 	};
+ 	int			status;
+ 
+-	dprintk("NFS call  read %d @ %Ld\n", count, (long long)offset);
++	dprintk("NFS call  read %d @ %Ld\n", rdata->args.count,
++			(long long) rdata->args.offset);
+ 	fattr->valid = 0;
+ 	status = rpc_call_sync(NFS_CLIENT(inode), &msg, flags);
+ 	if (status >= 0)
+ 		nfs_refresh_inode(inode, fattr);
+ 	dprintk("NFS reply read: %d\n", status);
+-	*eofp = res.eof;
+ 	return status;
+ }
+ 
+ static int
+-nfs3_proc_write(struct inode *inode, struct rpc_cred *cred,
+-		struct nfs_fattr *fattr, int flags,
+-		unsigned int base, unsigned int count,
+-		struct page *page, struct nfs_writeverf *verf)
++nfs3_proc_write(struct nfs_write_data *wdata)
+ {
+-	u64			offset = page_offset(page) + base;
+-	struct nfs_writeargs	arg = {
+-		.fh		= NFS_FH(inode),
+-		.offset		= offset,
+-		.count		= count,
+-		.stable		= NFS_FILE_SYNC,
+-		.pgbase		= base,
+-		.pages		= &page
+-	};
+-	struct nfs_writeres	res = {
+-		.fattr		= fattr,
+-		.verf		= verf,
+-	};
++	int			rpcflags = wdata->flags;
++	struct inode *		inode = wdata->inode;
++	struct nfs_fattr *	fattr = wdata->res.fattr;
+ 	struct rpc_message	msg = {
+ 		.rpc_proc	= &nfs3_procedures[NFS3PROC_WRITE],
+-		.rpc_argp	= &arg,
+-		.rpc_resp	= &res,
+-		.rpc_cred	= cred
++		.rpc_argp	= &wdata->args,
++		.rpc_resp	= &wdata->res,
++		.rpc_cred	= wdata->cred,
+ 	};
+-	int			status, rpcflags = 0;
++	int			status;
+ 
+-	dprintk("NFS call  write %d @ %Ld\n", count, (long long)offset);
++	dprintk("NFS call  write %d @ %Ld\n", wdata->args.count,
++			(long long) wdata->args.offset);
+ 	fattr->valid = 0;
+-	if (flags & NFS_RW_SWAP)
+-		rpcflags |= NFS_RPC_SWAPFLAGS;
+-	arg.stable = (flags & NFS_RW_SYNC) ? NFS_FILE_SYNC : NFS_UNSTABLE;
+-
+ 	status = rpc_call_sync(NFS_CLIENT(inode), &msg, rpcflags);
+-
+ 	if (status >= 0)
+ 		nfs3_write_refresh_inode(inode, fattr);
++	dprintk("NFS reply write: %d\n", status);
++	return status < 0? status : wdata->res.count;
++}
+ 
+-	dprintk("NFS reply read: %d\n", status);
+-	return status < 0? status : res.count;
++static int
++nfs3_proc_commit(struct nfs_write_data *cdata)
++{
++	struct inode *		inode = cdata->inode;
++	struct nfs_fattr *	fattr = cdata->res.fattr;
++	struct rpc_message	msg = {
++		.rpc_proc	= &nfs3_procedures[NFS3PROC_COMMIT],
++		.rpc_argp	= &cdata->args,
++		.rpc_resp	= &cdata->res,
++		.rpc_cred	= cdata->cred,
++	};
++	int			status;
++
++	dprintk("NFS call  commit %d @ %Ld\n", cdata->args.count,
++			(long long) cdata->args.offset);
++	fattr->valid = 0;
++	status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
++	if (status >= 0)
++		nfs3_write_refresh_inode(inode, fattr);
++	dprintk("NFS reply commit: %d\n", status);
++	return status;
+ }
+ 
+ /*
+@@ -681,7 +674,7 @@ nfs3_proc_fsinfo(struct nfs_server *serv
+ 
+ 	dprintk("NFS call  fsinfo\n");
+ 	info->fattr->valid = 0;
+-	status = rpc_call(server->client, NFS3PROC_FSINFO, fhandle, info, 0);
++	status = rpc_call(server->client_sys, NFS3PROC_FSINFO, fhandle, info, 0);
+ 	dprintk("NFS reply fsinfo: %d\n", status);
+ 	return status;
+ }
+@@ -862,6 +855,7 @@ struct nfs_rpc_ops	nfs_v3_clientops = {
+ 	.readlink	= nfs3_proc_readlink,
+ 	.read		= nfs3_proc_read,
+ 	.write		= nfs3_proc_write,
++	.commit		= nfs3_proc_commit,
+ 	.create		= nfs3_proc_create,
+ 	.remove		= nfs3_proc_remove,
+ 	.unlink_setup	= nfs3_proc_unlink_setup,
+--- linux-2.6.0-test1/fs/nfs/nfs3xdr.c	2003-06-14 12:18:51.000000000 -0700
++++ 25/fs/nfs/nfs3xdr.c	2003-07-19 17:03:50.000000000 -0700
+@@ -124,8 +124,6 @@ xdr_decode_fhandle(u32 *p, struct nfs_fh
+ 
+ /*
+  * Encode/decode time.
+- * Since the VFS doesn't care for fractional times, we ignore the
+- * nanosecond field.
+  */
+ static inline u32 *
+ xdr_encode_time3(u32 *p, struct timespec *timep)
+--- linux-2.6.0-test1/fs/nfs/nfs4proc.c	2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/nfs/nfs4proc.c	2003-07-19 17:07:07.000000000 -0700
+@@ -1012,45 +1012,36 @@ nfs4_proc_readlink(struct inode *inode, 
+ }
+ 
+ static int
+-nfs4_proc_read(struct inode *inode, struct rpc_cred *cred,
+-	       struct nfs_fattr *fattr, int flags,
+-	       unsigned int base, unsigned int count,
+-	       struct page *page, int *eofp)
++nfs4_proc_read(struct nfs_read_data *rdata)
+ {
++	int flags = rdata->flags;
++	struct inode *inode = rdata->inode;
++	struct nfs_fattr *fattr = rdata->res.fattr;
++	nfs4_stateid *stateid = &rdata->args.stateid;
+ 	struct nfs_server *server = NFS_SERVER(inode);
+ 	struct nfs4_shareowner	*sp;
+-	uint64_t offset = page_offset(page) + base;
+-	struct nfs_readargs arg = {
+-		.fh		= NFS_FH(inode),
+-		.offset		= offset,
+-		.count		= count,
+-		.pgbase		= base,
+-		.pages		= &page,
+-	};
+-	struct nfs_readres res = {
+-		.fattr		= fattr,
+-		.count		= count,
+-	};
+ 	struct rpc_message msg = {
+ 		.rpc_proc	= &nfs4_procedures[NFSPROC4_CLNT_READ],
+-		.rpc_argp	= &arg,
+-		.rpc_resp	= &res,
+-		.rpc_cred	= cred,
++		.rpc_argp	= &rdata->args,
++		.rpc_resp	= &rdata->res,
++		.rpc_cred	= rdata->cred,
+ 	};
+ 	unsigned long timestamp = jiffies;
+ 	int status;
+ 
+-	dprintk("NFS call  read %d @ %Ld\n", count, (long long)offset);
++	dprintk("NFS call  read %d @ %Ld\n", rdata->args.count,
++			(long long) rdata->args.offset);
++
+ 	/*
+-	* Try first to use O_RDONLY, then O_RDWR stateid.
+-	*/
++	 * 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));
++		memcpy(stateid, sp->so_stateid, sizeof(nfs4_stateid));
+ 	else
+-		memcpy(arg.stateid, zero_stateid, sizeof(nfs4_stateid));
++		memcpy(stateid, zero_stateid, sizeof(nfs4_stateid));
+ 
+ 	fattr->valid = 0;
+ 	status = rpc_call_sync(server->client, &msg, flags);
+@@ -1061,56 +1052,82 @@ nfs4_proc_read(struct inode *inode, stru
+ 			nfs_zap_caches(inode);
+ 	}
+ 	dprintk("NFS reply read: %d\n", status);
+-	*eofp = res.eof;
+ 	return status;
+ }
+ 
+ static int
+-nfs4_proc_write(struct inode *inode, struct rpc_cred *cred,
+-		struct nfs_fattr *fattr, int flags,
+-		unsigned int base, unsigned int count,
+-		struct page *page, struct nfs_writeverf *verf)
++nfs4_proc_write(struct nfs_write_data *wdata)
+ {
++	int rpcflags = wdata->flags;
++	struct inode *inode = wdata->inode;
++	struct nfs_fattr *fattr = wdata->res.fattr;
++	nfs4_stateid *stateid = &wdata->args.stateid;
+ 	struct nfs_server *server = NFS_SERVER(inode);
+-	struct nfs4_shareowner	*sp;
+-	uint64_t offset = page_offset(page) + base;
+-	struct nfs_writeargs arg = {
+-		.fh		= NFS_FH(inode),
+-		.offset		= offset,
+-		.count		= count,
+-		.stable		= (flags & NFS_RW_SYNC) ? NFS_FILE_SYNC : NFS_UNSTABLE,
+-		.pgbase		= base,
+-		.pages		= &page,
+-	};
+-	struct nfs_writeres res = {
+-		.fattr		= fattr,
+-		.count		= count,
+-		.verf		= verf,
+-	};
++	struct nfs4_shareowner *sp;
+ 	struct rpc_message msg = {
+ 		.rpc_proc	= &nfs4_procedures[NFSPROC4_CLNT_WRITE],
+-		.rpc_argp	= &arg,
+-		.rpc_resp	= &res,
+-		.rpc_cred	= cred,
++		.rpc_argp	= &wdata->args,
++		.rpc_resp	= &wdata->res,
++		.rpc_cred	= wdata->cred,
++	};
++	int status;
++
++	dprintk("NFS call  write %d @ %Ld\n", wdata->args.count,
++			(long long) wdata->args.offset);
++
++	/*
++	 * Try first to use O_WRONLY, then O_RDWR stateid.
++	 */
++	sp = nfs4_get_inode_share(inode, O_WRONLY);
++	if (!sp)
++		sp = nfs4_get_inode_share(inode, O_RDWR);
++
++	if (sp)
++		memcpy(stateid, sp->so_stateid, sizeof(nfs4_stateid));
++	else
++		memcpy(stateid, zero_stateid, sizeof(nfs4_stateid));
++
++	fattr->valid = 0;
++	status = rpc_call_sync(server->client, &msg, rpcflags);
++	dprintk("NFS reply write: %d\n", status);
++	return status;
++}
++
++static int
++nfs4_proc_commit(struct nfs_write_data *cdata)
++{
++	struct inode *inode = cdata->inode;
++	struct nfs_fattr *fattr = cdata->res.fattr;
++	nfs4_stateid *stateid = &cdata->args.stateid;
++	struct nfs_server *server = NFS_SERVER(inode);
++	struct nfs4_shareowner *sp;
++	struct rpc_message msg = {
++		.rpc_proc	= &nfs4_procedures[NFSPROC4_CLNT_COMMIT],
++		.rpc_argp	= &cdata->args,
++		.rpc_resp	= &cdata->res,
++		.rpc_cred	= cdata->cred,
+ 	};
+-	int			rpcflags = (flags & NFS_RW_SWAP) ? NFS_RPC_SWAPFLAGS : 0;
++	int status;
+ 
+-	dprintk("NFS call  write %d @ %Ld\n", count, (long long)offset);
++	dprintk("NFS call  commit %d @ %Ld\n", cdata->args.count,
++			(long long) cdata->args.offset);
+ 
+ 	/*
+-	* Try first to use O_WRONLY, then O_RDWR stateid.
+-	*/
++	 * 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));
++		memcpy(stateid, sp->so_stateid, sizeof(nfs4_stateid));
+ 	else
+-		memcpy(arg.stateid, zero_stateid, sizeof(nfs4_stateid));
++		memcpy(stateid, zero_stateid, sizeof(nfs4_stateid));
+ 
+ 	fattr->valid = 0;
+-	return rpc_call_sync(server->client, &msg, rpcflags);
++	status = rpc_call_sync(server->client, &msg, 0);
++	dprintk("NFS reply commit: %d\n", status);
++	return status;
+ }
+ 
+ /*
+@@ -1752,7 +1769,7 @@ struct nfs_rpc_ops	nfs_v4_clientops = {
+ 	.readlink	= nfs4_proc_readlink,
+ 	.read		= nfs4_proc_read,
+ 	.write		= nfs4_proc_write,
+-	.commit		= NULL,
++	.commit		= nfs4_proc_commit,
+ 	.create		= nfs4_proc_create,
+ 	.remove		= nfs4_proc_remove,
+ 	.unlink_setup	= nfs4_proc_unlink_setup,
+--- linux-2.6.0-test1/fs/nfs/pagelist.c	2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/nfs/pagelist.c	2003-07-19 17:07:05.000000000 -0700
+@@ -154,26 +154,6 @@ nfs_release_request(struct nfs_page *req
+ }
+ 
+ /**
+- * nfs_release_list - cleanly dispose of an unattached list of page requests
+- * @list: list of doomed page requests
+- */
+-void
+-nfs_release_list(struct list_head *list)
+-{
+-	while (!list_empty(list)) {
+-		struct nfs_page *req = nfs_list_entry(list);
+-
+-		nfs_list_remove_request(req);
+-
+-		page_cache_release(req->wb_page);
+-
+-		/* Release struct file or cached credential */
+-		nfs_clear_request(req);
+-		nfs_page_free(req);
+-	}
+-}
+-
+-/**
+  * nfs_list_add_request - Insert a request into a sorted list
+  * @req: request
+  * @head: head of list into which to insert the request.
+@@ -222,37 +202,6 @@ nfs_wait_on_request(struct nfs_page *req
+ }
+ 
+ /**
+- * nfs_wait_for_reads - wait for outstanding requests to complete
+- * @head: list of page requests to wait for
+- */
+-int
+-nfs_wait_for_reads(struct list_head *head)
+-{
+-	struct list_head *p = head->next;
+-	unsigned int res = 0;
+-
+-	while (p != head) {
+-		struct nfs_page *req = nfs_list_entry(p);
+-		int error;
+-
+-		if (!NFS_WBACK_BUSY(req))
+-			continue;
+-
+-		req->wb_count++;
+-		error = nfs_wait_on_request(req);
+-		if (error < 0)
+-			return error;
+-		nfs_list_remove_request(req);
+-		nfs_clear_request(req);
+-		nfs_page_free(req);
+-
+-		p = head->next;
+-		res++;
+-	}
+-	return res;
+-}
+-
+-/**
+  * nfs_coalesce_requests - Split coalesced requests out from a list.
+  * @head: source list
+  * @dst: destination list
+--- linux-2.6.0-test1/fs/nfs/proc.c	2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/nfs/proc.c	2003-07-19 17:07:07.000000000 -0700
+@@ -149,82 +149,62 @@ nfs_proc_readlink(struct inode *inode, s
+ }
+ 
+ static int
+-nfs_proc_read(struct inode *inode, struct rpc_cred *cred,
+-	      struct nfs_fattr *fattr, int flags,
+-	      unsigned int base, unsigned int count, struct page *page,
+-	      int *eofp)
+-{
+-	u64			offset = page_offset(page) + base;
+-	struct nfs_readargs	arg = {
+-		.fh		= NFS_FH(inode),
+-		.offset		= offset,
+-		.count		= count,
+-		.pgbase		= base,
+-		.pages		= &page
+-	};
+-	struct nfs_readres	res = {
+-		.fattr		= fattr,
+-		.count		= count
+-	};
++nfs_proc_read(struct nfs_read_data *rdata)
++{
++	int			flags = rdata->flags;
++	struct inode *		inode = rdata->inode;
++	struct nfs_fattr *	fattr = rdata->res.fattr;
+ 	struct rpc_message	msg = {
+ 		.rpc_proc	= &nfs_procedures[NFSPROC_READ],
+-		.rpc_argp	= &arg,
+-		.rpc_resp	= &res,
+-		.rpc_cred	= cred
++		.rpc_argp	= &rdata->args,
++		.rpc_resp	= &rdata->res,
++		.rpc_cred	= rdata->cred,
+ 	};
+ 	int			status;
+ 
+-	dprintk("NFS call  read %d @ %Ld\n", count, (long long)offset);
++	dprintk("NFS call  read %d @ %Ld\n", rdata->args.count,
++			(long long) rdata->args.offset);
+ 	fattr->valid = 0;
+ 	status = rpc_call_sync(NFS_CLIENT(inode), &msg, flags);
+-
+-	if (status >= 0)
++	if (status >= 0) {
+ 		nfs_refresh_inode(inode, fattr);
++		/* NFSv2 reads don't return an eof flag, so we make
++		 * up a value here.  XDR has already set eof to 0. */
++		if (status < rdata->args.count)
++			rdata->res.eof = 1;
++	}
+ 	dprintk("NFS reply read: %d\n", status);
+-	*eofp = res.eof;
+ 	return status;
+ }
+ 
+ static int
+-nfs_proc_write(struct inode *inode, struct rpc_cred *cred,
+-	       struct nfs_fattr *fattr, int how,
+-	       unsigned int base, unsigned int count,
+-	       struct page *page, struct nfs_writeverf *verf)
++nfs_proc_write(struct nfs_write_data *wdata)
+ {
+-	u64			offset = page_offset(page) + base;
+-	struct nfs_writeargs	arg = {
+-		.fh		= NFS_FH(inode),
+-		.offset		= offset,
+-		.count		= count,
+-		.stable		= NFS_FILE_SYNC,
+-		.pgbase		= base,
+-		.pages		= &page
+-	};
+-	struct nfs_writeres     res = {
+-		.fattr		= fattr,
+-		.verf		= verf,
+-		.count		= count
+-	};
++	int			flags = wdata->flags;
++	struct inode *		inode = wdata->inode;
++	struct nfs_fattr *	fattr = wdata->res.fattr;
+ 	struct rpc_message	msg = {
+ 		.rpc_proc	= &nfs_procedures[NFSPROC_WRITE],
+-		.rpc_argp	= &arg,
+-		.rpc_resp	= &res,
+-		.rpc_cred	= cred
++		.rpc_argp	= &wdata->args,
++		.rpc_resp	= &wdata->res,
++		.rpc_cred	= wdata->cred
+ 	};
+-	int			status, flags = 0;
++	int			status;
+ 
+-	dprintk("NFS call  write %d @ %Ld\n", count, (long long)offset);
++	dprintk("NFS call  write %d @ %Ld\n", wdata->args.count,
++			(long long) wdata->args.offset);
+ 	fattr->valid = 0;
+-	if (how & NFS_RW_SWAP)
+-		flags |= NFS_RPC_SWAPFLAGS;
+ 	status = rpc_call_sync(NFS_CLIENT(inode), &msg, flags);
+-
+-	if (status >= 0)
++	if (status >= 0) {
+ 		nfs_write_refresh_inode(inode, fattr);
+-
++		/* NFSv2 writes don't return a byte count or write
++		 * verifier, so we make up values here.  Note that
++		 * v2 writes are always NFS_FILE_SYNC writes. */
++		wdata->res.count = wdata->args.count;
++		wdata->verf.committed = NFS_FILE_SYNC;
++	}
+ 	dprintk("NFS reply write: %d\n", status);
+-	verf->committed = NFS_FILE_SYNC;      /* NFSv2 always syncs data */
+-	return status < 0? status : count;
++	return status < 0? status : wdata->res.count;
+ }
+ 
+ static int
+--- linux-2.6.0-test1/fs/nfs/read.c	2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/nfs/read.c	2003-07-19 17:07:06.000000000 -0700
+@@ -69,19 +69,28 @@ void nfs_readdata_release(struct rpc_tas
+ static int
+ nfs_readpage_sync(struct file *file, struct inode *inode, struct page *page)
+ {
+-	struct rpc_cred	*cred = NULL;
+-	struct nfs_fattr fattr;
+-	unsigned int	offset = 0;
+ 	unsigned int	rsize = NFS_SERVER(inode)->rsize;
+ 	unsigned int	count = PAGE_CACHE_SIZE;
+ 	int		result;
+-	int		flags = IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0;
+-	int		eof;
++	struct nfs_read_data	rdata = {
++		.flags		= (IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0),
++		.cred		= NULL,
++		.inode		= inode,
++		.args		= {
++			.fh		= NFS_FH(inode),
++			.pages		= &page,
++			.pgbase		= 0UL,
++			.count		= rsize,
++		},
++		.res		= {
++			.fattr		= &rdata.fattr,
++		}
++	};
+ 
+ 	dprintk("NFS: nfs_readpage_sync(%p)\n", page);
+ 
+ 	if (file)
+-		cred = nfs_file_cred(file);
++		rdata.cred = nfs_file_cred(file);
+ 
+ 	/*
+ 	 * This works now because the socket layer never tries to DMA
+@@ -89,17 +98,19 @@ nfs_readpage_sync(struct file *file, str
+ 	 */
+ 	do {
+ 		if (count < rsize)
+-			rsize = count;
++			rdata.args.count = count;
++		rdata.res.count = rdata.args.count;
++		rdata.args.offset = page_offset(page) + rdata.args.pgbase;
+ 
+ 		dprintk("NFS: nfs_proc_read(%s, (%s/%Ld), %Lu, %u)\n",
+ 			NFS_SERVER(inode)->hostname,
+ 			inode->i_sb->s_id,
+ 			(long long)NFS_FILEID(inode),
+-			(unsigned long long)offset, rsize);
++			(unsigned long long)rdata.args.pgbase,
++			rdata.args.count);
+ 
+ 		lock_kernel();
+-		result = NFS_PROTO(inode)->read(inode, cred, &fattr, flags,
+-						offset, rsize, page, &eof);
++		result = NFS_PROTO(inode)->read(&rdata);
+ 		unlock_kernel();
+ 
+ 		/*
+@@ -111,14 +122,15 @@ nfs_readpage_sync(struct file *file, str
+ 				result = -EINVAL;
+ 			goto io_error;
+ 		}
+-		count  -= result;
+-		offset += result;
+-		if (result < rsize)	/* NFSv2ism */
++		count -= result;
++		rdata.args.pgbase += result;
++
++		if (rdata.res.eof)
+ 			break;
+ 	} while (count);
+ 
+ 	if (count)
+-		memclear_highpage_flush(page, offset, count);
++		memclear_highpage_flush(page, rdata.args.pgbase, count);
+ 	SetPageUptodate(page);
+ 	if (PageError(page))
+ 		ClearPageError(page);
+--- linux-2.6.0-test1/fs/nfs/write.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/nfs/write.c	2003-07-19 17:07:07.000000000 -0700
+@@ -132,66 +132,73 @@ static int
+ nfs_writepage_sync(struct file *file, struct inode *inode, struct page *page,
+ 		   unsigned int offset, unsigned int count)
+ {
+-	struct rpc_cred	*cred = NULL;
+-	loff_t		base;
+ 	unsigned int	wsize = NFS_SERVER(inode)->wsize;
+-	int		result, refresh = 0, written = 0, flags;
+-	u8		*buffer;
+-	struct nfs_fattr fattr;
+-	struct nfs_writeverf verf;
+-
++	int		result, written = 0;
++	int		swapfile = IS_SWAPFILE(inode);
++	struct nfs_write_data	wdata = {
++		.flags		= swapfile ? NFS_RPC_SWAPFLAGS : 0,
++		.cred		= NULL,
++		.inode		= inode,
++		.args		= {
++			.fh		= NFS_FH(inode),
++			.pages		= &page,
++			.stable		= NFS_FILE_SYNC,
++			.pgbase		= offset,
++			.count		= wsize,
++		},
++		.res		= {
++			.fattr		= &wdata.fattr,
++			.verf		= &wdata.verf,
++		},
++	};
+ 
+ 	if (file)
+-		cred = get_rpccred(nfs_file_cred(file));
+-	if (!cred)
+-		cred = get_rpccred(NFS_I(inode)->mm_cred);
++		wdata.cred = get_rpccred(nfs_file_cred(file));
++	if (!wdata.cred)
++		wdata.cred = get_rpccred(NFS_I(inode)->mm_cred);
+ 
+ 	dprintk("NFS:      nfs_writepage_sync(%s/%Ld %d@%Ld)\n",
+ 		inode->i_sb->s_id,
+ 		(long long)NFS_FILEID(inode),
+ 		count, (long long)(page_offset(page) + offset));
+ 
+-	base = page_offset(page) + offset;
+-
+-	flags = ((IS_SWAPFILE(inode)) ? NFS_RW_SWAP : 0) | NFS_RW_SYNC;
+-
+ 	do {
+-		if (count < wsize && !IS_SWAPFILE(inode))
+-			wsize = count;
++		if (count < wsize && !swapfile)
++			wdata.args.count = count;
++		wdata.args.offset = page_offset(page) + wdata.args.pgbase;
+ 
+-		result = NFS_PROTO(inode)->write(inode, cred, &fattr, flags,
+-						 offset, wsize, page, &verf);
++		result = NFS_PROTO(inode)->write(&wdata);
+ 
+ 		if (result < 0) {
+ 			/* Must mark the page invalid after I/O error */
+ 			ClearPageUptodate(page);
+ 			goto io_error;
+ 		}
+-		if (result != wsize)
+-			printk("NFS: short write, wsize=%u, result=%d\n",
+-			wsize, result);
+-		refresh = 1;
+-		buffer  += wsize;
+-		base    += wsize;
+-	        offset  += wsize;
+-		written += wsize;
+-		count   -= wsize;
++		if (result < wdata.args.count)
++			printk(KERN_WARNING "NFS: short write, count=%u, result=%d\n",
++					wdata.args.count, result);
++
++		wdata.args.offset += result;
++	        wdata.args.pgbase += result;
++		written += result;
++		count -= result;
++
+ 		/*
+ 		 * If we've extended the file, update the inode
+ 		 * now so we don't invalidate the cache.
+ 		 */
+-		if (base > i_size_read(inode))
+-			i_size_write(inode, base);
++		if (wdata.args.offset > i_size_read(inode))
++			i_size_write(inode, wdata.args.offset);
+ 	} while (count);
+ 
+ 	if (PageError(page))
+ 		ClearPageError(page);
+ 
+ io_error:
+-	if (cred)
+-		put_rpccred(cred);
++	if (wdata.cred)
++		put_rpccred(wdata.cred);
+ 
+-	return written? written : result;
++	return written ? written : result;
+ }
+ 
+ static int
+--- linux-2.6.0-test1/fs/partitions/check.c	2003-06-22 12:04:44.000000000 -0700
++++ 25/fs/partitions/check.c	2003-07-19 17:03:50.000000000 -0700
+@@ -16,7 +16,6 @@
+ #include <linux/init.h>
+ #include <linux/module.h>
+ #include <linux/fs.h>
+-#include <linux/blk.h>
+ #include <linux/kmod.h>
+ #include <linux/ctype.h>
+ #include <linux/devfs_fs_kernel.h>
+@@ -348,6 +347,9 @@ void register_disk(struct gendisk *disk)
+ 		return;
+ 	}
+ 
++	/* always add handle for the whole disk */
++	devfs_add_partitioned(disk);
++
+ 	/* No such device (e.g., media were just removed) */
+ 	if (!get_capacity(disk))
+ 		return;
+@@ -356,7 +358,6 @@ void register_disk(struct gendisk *disk)
+ 	if (blkdev_get(bdev, FMODE_READ, 0, BDEV_RAW) < 0)
+ 		return;
+ 	state = check_partition(disk, bdev);
+-	devfs_add_partitioned(disk);
+ 	if (state) {
+ 		for (j = 1; j < state->limit; j++) {
+ 			sector_t size = state->parts[j].size;
+--- linux-2.6.0-test1/fs/partitions/efi.h	2003-06-14 12:18:28.000000000 -0700
++++ 25/fs/partitions/efi.h	2003-07-19 17:03:50.000000000 -0700
+@@ -32,7 +32,6 @@
+ #include <linux/kernel.h>
+ #include <linux/major.h>
+ #include <linux/string.h>
+-#include <linux/blk.h>
+ #include <linux/efi.h>
+ 
+ #define MSDOS_MBR_SIGNATURE 0xaa55
+--- linux-2.6.0-test1/fs/partitions/nec98.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/fs/partitions/nec98.c	2003-07-19 17:03:50.000000000 -0700
+@@ -8,7 +8,6 @@
+ #include <linux/fs.h>
+ #include <linux/genhd.h>
+ #include <linux/kernel.h>
+-#include <linux/blk.h>
+ #include <linux/hdreg.h>
+ 
+ #include "check.h"
+--- linux-2.6.0-test1/fs/proc/array.c	2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/proc/array.c	2003-07-19 17:06:42.000000000 -0700
+@@ -300,7 +300,7 @@ int proc_pid_stat(struct task_struct *ta
+ 	task_lock(task);
+ 	mm = task->mm;
+ 	if(mm)
+-		atomic_inc(&mm->mm_users);
++		mm = mmgrab(mm);
+ 	if (task->tty) {
+ 		tty_pgrp = task->tty->pgrp;
+ 		tty_nr = task->tty->device;
+--- linux-2.6.0-test1/fs/proc/proc_misc.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/fs/proc/proc_misc.c	2003-07-19 17:06:40.000000000 -0700
+@@ -274,6 +274,18 @@ static struct file_operations proc_cpuin
+ 	.release	= seq_release,
+ };
+ 
++extern struct seq_operations rcu_op;
++static int rcu_open(struct inode *inode, struct file *file)
++{
++	return seq_open(file, &rcu_op);
++}
++static struct file_operations proc_rcu_operations = {
++	.open		= rcu_open,
++	.read		= seq_read,
++	.llseek		= seq_lseek,
++	.release	= seq_release,
++};
++
+ extern struct seq_operations vmstat_op;
+ static int vmstat_open(struct inode *inode, struct file *file)
+ {
+@@ -388,10 +400,8 @@ static int kstat_read_proc(char *page, c
+ 		system += kstat_cpu(i).cpustat.system;
+ 		idle += kstat_cpu(i).cpustat.idle;
+ 		iowait += kstat_cpu(i).cpustat.iowait;
+-#if !defined(CONFIG_ARCH_S390)
+ 		for (j = 0 ; j < NR_IRQS ; j++)
+ 			sum += kstat_cpu(i).irqs[j];
+-#endif
+ 	}
+ 
+ 	len = sprintf(page, "cpu  %u %u %u %u %u\n",
+@@ -412,7 +422,7 @@ static int kstat_read_proc(char *page, c
+ 	}
+ 	len += sprintf(page + len, "intr %u", sum);
+ 
+-#if !defined(CONFIG_ARCH_S390) && !defined(CONFIG_PPC64) && !defined(CONFIG_ALPHA)
++#if !defined(CONFIG_PPC64) && !defined(CONFIG_ALPHA)
+ 	for (i = 0 ; i < NR_IRQS ; i++)
+ 		len += sprintf(page + len, " %u", kstat_irqs(i));
+ #endif
+@@ -440,7 +450,6 @@ static int devices_read_proc(char *page,
+ 	return proc_calc_metrics(page, start, off, count, eof, len);
+ }
+ 
+-#if !defined(CONFIG_ARCH_S390)
+ extern int show_interrupts(struct seq_file *p, void *v);
+ static int interrupts_open(struct inode *inode, struct file *file)
+ {
+@@ -466,7 +475,6 @@ static struct file_operations proc_inter
+ 	.llseek		= seq_lseek,
+ 	.release	= single_release,
+ };
+-#endif
+ 
+ static int filesystems_read_proc(char *page, char **start, off_t off,
+ 				 int count, int *eof, void *data)
+@@ -536,7 +544,8 @@ static ssize_t read_profile(struct file 
+ 		buf++; p++; count--; read++;
+ 	}
+ 	pnt = (char *)prof_buffer + p - sizeof(unsigned int);
+-	copy_to_user(buf,(void *)pnt,count);
++	if (copy_to_user(buf,(void *)pnt,count))
++		return -EFAULT;
+ 	read += count;
+ 	*ppos += read;
+ 	return read;
+@@ -606,6 +615,36 @@ static void create_seq_entry(char *name,
+ 		entry->proc_fops = f;
+ }
+ 
++#ifdef CONFIG_LOCKMETER
++extern ssize_t get_lockmeter_info(char *, size_t, loff_t *);
++extern ssize_t put_lockmeter_info(const char *, size_t);
++extern int get_lockmeter_info_size(void);
++
++/*
++ * This function accesses lock metering information.
++ */
++static ssize_t read_lockmeter(struct file *file, char *buf,
++			      size_t count, loff_t *ppos)
++{
++	return get_lockmeter_info(buf, count, ppos);
++}
++
++/*
++ * Writing to /proc/lockmeter resets the counters
++ */
++static ssize_t write_lockmeter(struct file * file, const char * buf,
++			       size_t count, loff_t *ppos)
++{
++	return put_lockmeter_info(buf, count);
++}
++
++static struct file_operations proc_lockmeter_operations = {
++	NULL,           /* lseek */
++	read:		read_lockmeter,
++	write:		write_lockmeter,
++};
++#endif  /* CONFIG_LOCKMETER */
++
+ void __init proc_misc_init(void)
+ {
+ 	struct proc_dir_entry *entry;
+@@ -644,10 +683,9 @@ void __init proc_misc_init(void)
+ 	if (entry)
+ 		entry->proc_fops = &proc_kmsg_operations;
+ 	create_seq_entry("cpuinfo", 0, &proc_cpuinfo_operations);
++	create_seq_entry("rcu", 0, &proc_rcu_operations);
+ 	create_seq_entry("partitions", 0, &proc_partitions_operations);
+-#if !defined(CONFIG_ARCH_S390)
+ 	create_seq_entry("interrupts", 0, &proc_interrupts_operations);
+-#endif
+ 	create_seq_entry("slabinfo",S_IWUSR|S_IRUGO,&proc_slabinfo_operations);
+ 	create_seq_entry("buddyinfo",S_IRUGO, &fragmentation_file_operations);
+ 	create_seq_entry("vmstat",S_IRUGO, &proc_vmstat_file_operations);
+@@ -673,6 +711,13 @@ void __init proc_misc_init(void)
+ 	if (entry)
+ 		entry->proc_fops = &proc_sysrq_trigger_operations;
+ #endif
++#ifdef CONFIG_LOCKMETER
++	entry = create_proc_entry("lockmeter", S_IWUSR | S_IRUGO, NULL);
++	if (entry) {
++		entry->proc_fops = &proc_lockmeter_operations;
++		entry->size = get_lockmeter_info_size();
++	}
++#endif
+ #ifdef CONFIG_PPC32
+ 	{
+ 		extern struct file_operations ppc_htab_operations;
+--- linux-2.6.0-test1/fs/stat.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/stat.c	2003-07-19 17:06:16.000000000 -0700
+@@ -123,6 +123,7 @@ static int cp_old_stat(struct kstat *sta
+ 	SET_OLDSTAT_UID(tmp, stat->uid);
+ 	SET_OLDSTAT_GID(tmp, stat->gid);
+ 	tmp.st_rdev = stat->rdev;
++	tmp.__pad_16bit = 0;  /* don't leak kernel stack data! */
+ #if BITS_PER_LONG == 32
+ 	if (stat->size > MAX_NON_LFS)
+ 		return -EOVERFLOW;
+--- linux-2.6.0-test1/fs/umsdos/ioctl.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/fs/umsdos/ioctl.c	2003-07-19 17:03:50.000000000 -0700
+@@ -4,6 +4,10 @@
+  *  Written 1993 by Jacques Gelinas
+  *
+  *  Extended MS-DOS ioctl directory handling functions
++ *
++ *  Changes:
++ *  11/07/2003      Daniele Bellucci <bellucda@tiscali.it>
++ *                  - audit copy_to_user/put_user in umsdos_ioctl_fill.
+  */
+ 
+ #include <asm/uaccess.h>
+@@ -36,11 +40,12 @@ static int umsdos_ioctl_fill (
+ 	struct UMSDOS_DIR_ONCE *d = (struct UMSDOS_DIR_ONCE *) buf;
+ 
+ 	if (d->count == 0) {
+-		copy_to_user (d->ent->d_name, name, name_len);
+-		put_user ('\0', d->ent->d_name + name_len);
+-		put_user (name_len, &d->ent->d_reclen);
+-		put_user (ino, &d->ent->d_ino);
+-		put_user (offset, &d->ent->d_off);
++		if (copy_to_user (d->ent->d_name, name, name_len) ||
++		    put_user ('\0', d->ent->d_name + name_len) ||
++		    put_user (name_len, &d->ent->d_reclen) ||
++		    put_user (ino, &d->ent->d_ino) ||
++		    put_user (offset, &d->ent->d_off))
++			return -EFAULT;
+ 		d->count = 1;
+ 		ret = 0;
+ 	}
+--- linux-2.6.0-test1/fs/vfat/namei.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/fs/vfat/namei.c	2003-07-19 17:03:50.000000000 -0700
+@@ -375,7 +375,7 @@ shortname_info_to_lcase(struct shortname
+ }
+ 
+ static inline int to_shortname_char(struct nls_table *nls,
+-				    char *buf, int buf_size, wchar_t *src,
++				    unsigned char *buf, int buf_size, wchar_t *src,
+ 				    struct shortname_info *info)
+ {
+ 	int len;
+--- linux-2.6.0-test1/include/acpi/acconfig.h	2003-06-22 12:04:44.000000000 -0700
++++ 25/include/acpi/acconfig.h	2003-07-19 17:03:50.000000000 -0700
+@@ -64,7 +64,7 @@
+ 
+ /* Version string */
+ 
+-#define ACPI_CA_VERSION                 0x20030619
++#define ACPI_CA_VERSION                 0x20030714
+ 
+ /* Maximum objects in the various object caches */
+ 
+--- linux-2.6.0-test1/include/acpi/platform/acenv.h	2003-06-14 12:18:03.000000000 -0700
++++ 25/include/acpi/platform/acenv.h	2003-07-19 17:03:50.000000000 -0700
+@@ -134,6 +134,9 @@
+ #elif defined(__FreeBSD__)
+ #include "acfreebsd.h"
+ 
++#elif defined(__NetBSD__)
++#include "acnetbsd.h"
++
+ #elif defined(MODESTO)
+ #include "acmodesto.h"
+ 
+@@ -187,13 +190,14 @@
+ #define DEBUGGER_SINGLE_THREADED    0
+ #define DEBUGGER_MULTI_THREADED     1
+ 
++#ifndef DEBUGGER_THREADING
+ #ifdef ACPI_APPLICATION
+ #define DEBUGGER_THREADING          DEBUGGER_SINGLE_THREADED
+ 
+ #else
+ #define DEBUGGER_THREADING          DEBUGGER_MULTI_THREADED
+ #endif
+-
++#endif /* !DEBUGGER_THREADING */
+ 
+ /******************************************************************************
+  *
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-alpha/lockmeter.h	2003-07-19 17:06:40.000000000 -0700
+@@ -0,0 +1,90 @@
++/*
++ *  Written by John Hawkes (hawkes@sgi.com)
++ *  Based on klstat.h by Jack Steiner (steiner@sgi.com)
++ *
++ *  Modified by Peter Rival (frival@zk3.dec.com)
++ */
++
++#ifndef _ALPHA_LOCKMETER_H
++#define _ALPHA_LOCKMETER_H
++
++#include <asm/hwrpb.h>
++#define CPU_CYCLE_FREQUENCY	hwrpb->cycle_freq
++
++#define get_cycles64()		get_cycles()
++
++#define THIS_CPU_NUMBER		smp_processor_id()
++
++#include <linux/version.h>
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
++#define local_irq_save(x) \
++	__save_and_cli(x)
++#define local_irq_restore(x) \
++	__restore_flags(x)
++#endif	/* Linux version 2.2.x */
++
++#define SPINLOCK_MAGIC_INIT /**/
++
++/*
++ * Macros to cache and retrieve an index value inside of a lock
++ * these macros assume that there are less than 65536 simultaneous
++ * (read mode) holders of a rwlock.
++ * We also assume that the hash table has less than 32767 entries.
++ * the high order bit is used for write locking a rw_lock
++ * Note: although these defines and macros are the same as what is being used
++ *       in include/asm-i386/lockmeter.h, they are present here to easily
++ *	 allow an alternate Alpha implementation.
++ */
++/*
++ * instrumented spinlock structure -- never used to allocate storage
++ * only used in macros below to overlay a spinlock_t
++ */
++typedef struct inst_spinlock_s {
++	/* remember, Alpha is little endian */
++	unsigned short lock;
++	unsigned short index;
++} inst_spinlock_t;
++#define PUT_INDEX(lock_ptr,indexv)	((inst_spinlock_t *)(lock_ptr))->index = indexv
++#define GET_INDEX(lock_ptr)		((inst_spinlock_t *)(lock_ptr))->index
++
++/*
++ * macros to cache and retrieve an index value in a read/write lock
++ * as well as the cpu where a reader busy period started
++ * we use the 2nd word (the debug word) for this, so require the
++ * debug word to be present
++ */
++/*
++ * instrumented rwlock structure -- never used to allocate storage
++ * only used in macros below to overlay a rwlock_t
++ */
++typedef struct inst_rwlock_s {
++	volatile int lock;
++	unsigned short index;
++	unsigned short cpu;
++} inst_rwlock_t;
++#define PUT_RWINDEX(rwlock_ptr,indexv)	((inst_rwlock_t *)(rwlock_ptr))->index = indexv
++#define GET_RWINDEX(rwlock_ptr)		((inst_rwlock_t *)(rwlock_ptr))->index
++#define PUT_RW_CPU(rwlock_ptr,cpuv)	((inst_rwlock_t *)(rwlock_ptr))->cpu = cpuv
++#define GET_RW_CPU(rwlock_ptr)		((inst_rwlock_t *)(rwlock_ptr))->cpu
++
++/*
++ * return true if rwlock is write locked
++ * (note that other lock attempts can cause the lock value to be negative)
++ */
++#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) (((inst_rwlock_t *)rwlock_ptr)->lock & 1)
++#define IABS(x) ((x) > 0 ? (x) : -(x))
++
++#define RWLOCK_READERS(rwlock_ptr)	rwlock_readers(rwlock_ptr)
++extern inline int rwlock_readers(rwlock_t *rwlock_ptr)
++{
++	int tmp = (int) ((inst_rwlock_t *)rwlock_ptr)->lock;
++	/* readers subtract 2, so we have to:		*/
++	/* 	- andnot off a possible writer (bit 0)	*/
++	/*	- get the absolute value		*/
++	/*	- divide by 2 (right shift by one)	*/
++	/* to find the number of readers		*/
++	if (tmp == 0) return(0);
++	else return(IABS(tmp & ~1)>>1);
++}
++
++#endif /* _ALPHA_LOCKMETER_H */
+--- linux-2.6.0-test1/include/asm-alpha/pgalloc.h	2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-alpha/pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -24,9 +24,9 @@ pmd_populate_kernel(struct mm_struct *mm
+ }
+ 
+ static inline void
+-pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd)
++pgd_populate(struct mm_struct *mm, pgd_t *pgd, struct page *pmd)
+ {
+-	pgd_set(pgd, pmd);
++	pgd_set(pgd, page_address(pmd));
+ }
+ 
+ extern pgd_t *pgd_alloc(struct mm_struct *mm);
+@@ -37,19 +37,29 @@ pgd_free(pgd_t *pgd)
+ 	free_page((unsigned long)pgd);
+ }
+ 
+-static inline pmd_t *
++static inline struct page *
+ pmd_alloc_one(struct mm_struct *mm, unsigned long address)
+ {
+-	pmd_t *ret = (pmd_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT);
+-	if (ret)
+-		clear_page(ret);
+-	return ret;
++	struct page *page = alloc_page(GFP_KERNEL|__GFP_REPEAT);
++	if (page)
++		clear_highpage(page);
++	return page;
++}
++
++static inline pmd_t *
++pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
++{
++	struct page *page = pmd_alloc_one(mm, addr);
++	if (page)
++		return page_address(page);
++	else
++		return NULL;
+ }
+ 
+ static inline void
+-pmd_free(pmd_t *pmd)
++pmd_free(struct page *pmd)
+ {
+-	free_page((unsigned long)pmd);
++	__free_page(pmd);
+ }
+ 
+ extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr);
+--- linux-2.6.0-test1/include/asm-alpha/pgtable.h	2003-06-14 12:18:06.000000000 -0700
++++ 25/include/asm-alpha/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -229,9 +229,11 @@ pmd_page_kernel(pmd_t pmd)
+ #define pmd_page(pmd)	(mem_map + ((pmd_val(pmd) & _PFN_MASK) >> 32))
+ #endif
+ 
+-extern inline unsigned long pgd_page(pgd_t pgd)
++extern inline unsigned long __pgd_page(pgd_t pgd)
+ { return PAGE_OFFSET + ((pgd_val(pgd) & _PFN_MASK) >> (32-PAGE_SHIFT)); }
+ 
++#define pgd_page(pgd)	virt_to_page(__pgd_page(pgd))
++
+ extern inline int pte_none(pte_t pte)		{ return !pte_val(pte); }
+ extern inline int pte_present(pte_t pte)	{ return pte_val(pte) & _PAGE_VALID; }
+ extern inline void pte_clear(pte_t *ptep)	{ pte_val(*ptep) = 0; }
+@@ -280,9 +282,15 @@ extern inline pte_t pte_mkyoung(pte_t pt
+ /* Find an entry in the second-level page table.. */
+ extern inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address)
+ {
+-	return (pmd_t *) pgd_page(*dir) + ((address >> PMD_SHIFT) & (PTRS_PER_PAGE - 1));
++	return (pmd_t *)__pgd_page(*dir) + ((address >> PMD_SHIFT) & (PTRS_PER_PAGE - 1));
+ }
+ 
++#define pmd_offset_kernel(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)					do { } while (0)
++#define pmd_unmap_nested(pmd)				do { } while (0)
++
+ /* Find an entry in the third-level page table.. */
+ extern inline pte_t * pte_offset_kernel(pmd_t * dir, unsigned long address)
+ {
+--- linux-2.6.0-test1/include/asm-alpha/posix_types.h	2003-06-14 12:18:25.000000000 -0700
++++ 25/include/asm-alpha/posix_types.h	2003-07-19 17:06:39.000000000 -0700
+@@ -7,7 +7,9 @@
+  * assume GCC is being used.
+  */
+ 
+-typedef unsigned int	__kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long	__kernel_dev_t;
++#endif
+ typedef unsigned int	__kernel_ino_t;
+ typedef unsigned int	__kernel_mode_t;
+ typedef unsigned int	__kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-alpha/smp.h	2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-alpha/smp.h	2003-07-19 17:04:07.000000000 -0700
+@@ -3,6 +3,7 @@
+ 
+ #include <linux/config.h>
+ #include <linux/threads.h>
++#include <linux/cpumask.h>
+ #include <linux/bitops.h>
+ #include <asm/pal.h>
+ 
+@@ -44,27 +45,12 @@ extern struct cpuinfo_alpha cpu_data[NR_
+ #define hard_smp_processor_id()	__hard_smp_processor_id()
+ #define smp_processor_id()	(current_thread_info()->cpu)
+ 
+-extern unsigned long cpu_present_mask;
+-extern volatile unsigned long cpu_online_map;
++extern cpumask_t cpu_present_mask;
++extern cpumask_t long cpu_online_map;
+ extern int smp_num_cpus;
+ 
+-#define cpu_possible(cpu)	(cpu_present_mask & (1UL << (cpu)))
+-#define cpu_online(cpu)		(cpu_online_map & (1UL << (cpu)))
+-
+-static inline 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;
+-}
++#define cpu_possible(cpu)	cpu_isset(cpu, cpu_present_mask)
++#define cpu_online(cpu)		cpu_isset(cpu, cpu_online_map)
+ 
+ extern int smp_call_function_on_cpu(void (*func) (void *info), void *info,int retry, int wait, unsigned long cpu);
+ 
+--- linux-2.6.0-test1/include/asm-alpha/spinlock.h	2003-06-26 22:07:25.000000000 -0700
++++ 25/include/asm-alpha/spinlock.h	2003-07-19 17:06:40.000000000 -0700
+@@ -6,6 +6,10 @@
+ #include <linux/kernel.h>
+ #include <asm/current.h>
+ 
++#ifdef CONFIG_LOCKMETER
++#undef DEBUG_SPINLOCK
++#undef DEBUG_RWLOCK
++#endif
+ 
+ /*
+  * Simple spin lock operations.  There are two variants, one clears IRQ's
+@@ -95,9 +99,18 @@ static inline int _raw_spin_trylock(spin
+ 
+ typedef struct {
+ 	volatile int write_lock:1, read_counter:31;
++#ifdef CONFIG_LOCKMETER
++	/* required for LOCKMETER since all bits in lock are used */
++	/* need this storage for CPU and lock INDEX ............. */
++	unsigned magic;
++#endif
+ } /*__attribute__((aligned(32)))*/ rwlock_t;
+ 
++#ifdef CONFIG_LOCKMETER
++#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0, 0 }
++#else
+ #define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0 }
++#endif
+ 
+ #define rwlock_init(x)	do { *(x) = RW_LOCK_UNLOCKED; } while(0)
+ #define rwlock_is_locked(x)	(*(volatile int *)(x) != 0)
+@@ -169,4 +182,41 @@ static inline void _raw_read_unlock(rwlo
+ 	: "m" (*lock) : "memory");
+ }
+ 
++#ifdef CONFIG_LOCKMETER
++static inline int _raw_write_trylock(rwlock_t *lock)
++{
++	long temp,result;
++
++	__asm__ __volatile__(
++	"	ldl_l %1,%0\n"
++	"	mov $31,%2\n"
++	"	bne %1,1f\n"
++	"	or $31,1,%2\n"
++	"	stl_c %2,%0\n"
++	"1:	mb\n"
++	: "=m" (*(volatile int *)lock), "=&r" (temp), "=&r" (result)
++	: "m" (*(volatile int *)lock)
++	);
++
++	return (result);
++}
++
++static inline int _raw_read_trylock(rwlock_t *lock)
++{
++	unsigned long temp,result;
++
++	__asm__ __volatile__(
++	"	ldl_l %1,%0\n"
++	"	mov $31,%2\n"
++	"	blbs %1,1f\n"
++	"	subl %1,2,%2\n"
++	"	stl_c %2,%0\n"
++	"1:	mb\n"
++	: "=m" (*(volatile int *)lock), "=&r" (temp), "=&r" (result)
++	: "m" (*(volatile int *)lock)
++	);
++	return (result);
++}
++#endif /* CONFIG_LOCKMETER */
++
+ #endif /* _ALPHA_SPINLOCK_H */
+--- linux-2.6.0-test1/include/asm-arm26/pgalloc.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-arm26/pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -55,7 +55,8 @@ pmd_populate_kernel(struct mm_struct *mm
+  * is thrown away. It just cant be zero. -IM
+  */
+ 
+-#define pmd_alloc_one(mm,addr)		({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm,addr)		((struct page *)2); BUG()
++#define pmd_alloc_one_kernel(mm,addr)	((pmd_t *)2); BUG()
+ #define pmd_free(pmd)			do { } while (0)
+ #define pgd_populate(mm,pmd,pte)	BUG()
+ 
+--- linux-2.6.0-test1/include/asm-arm26/pgtable.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-arm26/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -99,7 +99,7 @@ extern struct page *empty_zero_page;
+  * on arm26 we have no 2nd level page table. we simulate this by removing the
+  * PMD.
+  *
+- * pgd_none is 0 to prevernt pmd_alloc() calling __pmd_alloc(). This causes it
++ * pgd_none is 0 to prevernt pmd_alloc_map() calling __pmd_alloc(). This causes it
+  * to return pmd_offset(pgd,addr) which is a pointer to the pgd (IOW, a no-op).
+  *
+  * however, to work this way, whilst we are allocating 32 pgds, containing 32
+@@ -134,7 +134,7 @@ extern struct page *empty_zero_page;
+ 
+ #define _PMD_PRESENT     (0x01)
+ 
+-/* These definitions allow us to optimise out stuff like pmd_alloc() */
++/* These definitions allow us to optimise out stuff like pmd_alloc_map() */
+ #define pgd_none(pgd)		(0) 
+ #define pgd_bad(pgd)		(0)
+ #define pgd_present(pgd)	(1)
+@@ -189,6 +189,12 @@ extern struct page *empty_zero_page;
+ #define pte_unmap(pte)                  do { } while (0)
+ #define pte_unmap_nested(pte)           do { } while (0)
+ 
++#define pmd_offset_kernel(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)	pmd_offset(pgd, addr)
++#define pmd_unmap(pgd, addr)			do { } while (0)
++#define pmd_unmap_nested(pgd, addr)		do { } while (0)
++
+ 
+ #define _PAGE_PRESENT   0x01
+ #define _PAGE_READONLY  0x02
+--- linux-2.6.0-test1/include/asm-arm26/posix_types.h	2003-06-14 12:18:24.000000000 -0700
++++ 25/include/asm-arm26/posix_types.h	2003-07-19 17:06:39.000000000 -0700
+@@ -19,7 +19,9 @@
+  * assume GCC is being used.
+  */
+ 
+-typedef unsigned short		__kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long	__kernel_dev_t;
++#endif
+ typedef unsigned long		__kernel_ino_t;
+ typedef unsigned short		__kernel_mode_t;
+ typedef unsigned short		__kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-arm/pgalloc.h	2003-06-14 12:18:34.000000000 -0700
++++ 25/include/asm-arm/pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -16,7 +16,8 @@
+ /*
+  * Since we have only two-level page tables, these are trivial
+  */
+-#define pmd_alloc_one(mm,addr)		({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm,addr)		({ BUG(); ((struct page *)2); })
++#define pmd_alloc_one_kernel(mm,addr)	({ BUG(); ((pmd_t *)2); })
+ #define pmd_free(pmd)			do { } while (0)
+ #define pgd_populate(mm,pmd,pte)	BUG()
+ 
+--- linux-2.6.0-test1/include/asm-arm/pgtable.h	2003-06-14 12:18:04.000000000 -0700
++++ 25/include/asm-arm/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -125,6 +125,11 @@ extern struct page *empty_zero_page;
+ 
+ /* Find an entry in the second-level page table.. */
+ #define pmd_offset(dir, addr)	((pmd_t *)(dir))
++#define pmd_offset_kernel(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)	pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)				do { } while (0)
++#define pmd_unmap_nested(pmd)			do { } while (0)
+ 
+ /* Find an entry in the third-level page table.. */
+ #define __pte_index(addr)	(((addr) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
+--- linux-2.6.0-test1/include/asm-arm/posix_types.h	2003-06-14 12:17:57.000000000 -0700
++++ 25/include/asm-arm/posix_types.h	2003-07-19 17:06:39.000000000 -0700
+@@ -19,7 +19,9 @@
+  * assume GCC is being used.
+  */
+ 
+-typedef unsigned short		__kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long	__kernel_dev_t;
++#endif
+ typedef unsigned long		__kernel_ino_t;
+ typedef unsigned short		__kernel_mode_t;
+ typedef unsigned short		__kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-cris/pgalloc.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-cris/pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -57,7 +57,8 @@ extern inline void pte_free(struct page 
+  * the pgd will always be present..
+  */
+ 
+-#define pmd_alloc_one(mm, addr)    ({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm, addr)         ({ BUG(); ((struct page *)2); })
++#define pmd_alloc_one_kernel(mm, addr)  ({ 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()
+--- linux-2.6.0-test1/include/asm-cris/pgtable.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-cris/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -339,4 +339,10 @@ extern inline void update_mmu_cache(stru
+ 
+ typedef pte_t *pte_addr_t;
+ 
++#define pmd_offset_kernel(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)					do { } while (0)
++#define pmd_unmap_nested(pmd)				do { } while (0)
++
+ #endif /* _CRIS_PGTABLE_H */
+--- linux-2.6.0-test1/include/asm-cris/posix_types.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-cris/posix_types.h	2003-07-19 17:06:39.000000000 -0700
+@@ -14,7 +14,9 @@
+  * assume GCC is being used.
+  */
+ 
+-typedef unsigned short	__kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long	__kernel_dev_t;
++#endif
+ typedef unsigned long	__kernel_ino_t;
+ typedef unsigned short	__kernel_mode_t;
+ typedef unsigned short	__kernel_nlink_t;
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-generic/cpumask_array.h	2003-07-19 17:04:07.000000000 -0700
+@@ -0,0 +1,41 @@
++#ifndef __ASM_GENERIC_CPUMASK_ARRAY_H
++#define __ASM_GENERIC_CPUMASK_ARRAY_H
++
++#define CPU_ARRAY_SIZE		BITS_TO_LONGS(NR_CPUS)
++
++#define cpu_set(cpu, map)		set_bit(cpu, (map).mask)
++#define cpu_clear(cpu, map)		clear_bit(cpu, (map).mask)
++#define cpu_isset(cpu, map)		test_bit(cpu, (map).mask)
++#define cpu_test_and_set(cpu, map)	test_and_set_bit(cpu, (map).mask)
++
++#define cpus_and(dst,src1,src2)	bitmap_and((dst).mask,(src1).mask, (src2).mask, NR_CPUS)
++#define cpus_or(dst,src1,src2)	bitmap_or((dst).mask, (src1).mask, (src2).mask, NR_CPUS)
++#define cpus_clear(map)		bitmap_clear((map).mask, NR_CPUS)
++#define cpus_complement(map)	bitmap_complement((map).mask, NR_CPUS)
++#define cpus_equal(map1, map2)	bitmap_equal((map1).mask, (map2).mask, NR_CPUS)
++#define cpus_empty(map)		bitmap_empty(map.mask, NR_CPUS)
++#define cpus_weight(map)		bitmap_weight((map).mask, NR_CPUS)
++#define cpus_shift_right(d, s, n)	bitmap_shift_right((d).mask, (s).mask, n, NR_CPUS)
++#define cpus_shift_left(d, s, n)	bitmap_shift_left((d).mask, (s).mask, n, NR_CPUS)
++#define first_cpu(map)		find_first_bit((map).mask, NR_CPUS)
++#define next_cpu(cpu, map)	find_next_bit((map).mask, NR_CPUS, cpu)
++
++/* only ever use this for things that are _never_ used on large boxen */
++#define cpus_coerce(map)	((map).mask[0])
++#define cpus_promote(map)	({ cpumask_t __cpu_mask = CPU_MASK_NONE;\
++					__cpu_mask.mask[0] = map;	\
++					__cpu_mask;			\
++				})
++#define cpumask_of_cpu(cpu)	({ cpumask_t __cpu_mask = CPU_MASK_NONE;\
++					cpu_set(cpu, __cpu_mask);	\
++					__cpu_mask;			\
++				})
++#define any_online_cpu(map)	find_first_bit((map).mask, NR_CPUS)
++
++/*
++ * um, these need to be usable as static initializers
++ */
++#define CPU_MASK_ALL	{ {[0 ... CPU_ARRAY_SIZE-1] = ~0UL} }
++#define CPU_MASK_NONE	{ {[0 ... CPU_ARRAY_SIZE-1] =  0UL} }
++
++#endif /* __ASM_GENERIC_CPUMASK_ARRAY_H */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-generic/cpumask_const_reference.h	2003-07-19 17:04:07.000000000 -0700
+@@ -0,0 +1,29 @@
++#ifndef __ASM_GENERIC_CPUMASK_CONST_REFERENCE_H
++#define __ASM_GENERIC_CPUMASK_CONST_REFERENCE_H
++
++struct cpumask_ref {
++	const cpumask_t *val;
++};
++
++typedef const struct cpumask_ref cpumask_const_t;
++
++#define mk_cpumask_const(map)		((cpumask_const_t){ &(map) })
++#define cpu_isset_const(cpu, map)	cpu_isset(cpu, *(map).val)
++
++#define cpus_and_const(dst,src1,src2)	cpus_and(dst,*(src1).val,*(src2).val)
++#define cpus_or_const(dst,src1,src2)	cpus_or(dst,*(src1).val,*(src2).val)
++
++#define cpus_equal_const(map1, map2)	cpus_equal(*(map1).val, *(map2).val)
++
++#define cpus_copy_const(map1, map2)	bitmap_copy((map1).mask, (map2).val->mask, NR_CPUS)
++
++#define cpus_empty_const(map)		cpus_empty(*(map).val)
++#define cpus_weight_const(map)		cpus_weight(*(map).val)
++#define first_cpu_const(map)		first_cpu(*(map).val)
++#define next_cpu_const(cpu, map)	next_cpu(cpu, *(map).val)
++
++/* only ever use this for things that are _never_ used on large boxen */
++#define cpus_coerce_const(map)		cpus_coerce(*(map).val)
++#define any_online_cpu_const(map)	any_online_cpu(*(map).val)
++
++#endif /* __ASM_GENERIC_CPUMASK_CONST_REFERENCE_H */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-generic/cpumask_const_value.h	2003-07-19 17:04:07.000000000 -0700
+@@ -0,0 +1,21 @@
++#ifndef __ASM_GENERIC_CPUMASK_CONST_VALUE_H
++#define __ASM_GENERIC_CPUMASK_CONST_VALUE_H
++
++typedef const cpumask_t cpumask_const_t;
++
++#define mk_cpumask_const(map)		((cpumask_const_t)(map))
++#define cpu_isset_const(cpu, map)	cpu_isset(cpu, map)
++#define cpus_and_const(dst,src1,src2)	cpus_and(dst, src1, src2)
++#define cpus_or_const(dst,src1,src2)	cpus_or(dst, src1, src2)
++#define cpus_equal_const(map1, map2)	cpus_equal(map1, map2)
++#define cpus_empty_const(map)		cpus_empty(map)
++#define cpus_copy_const(map1, map2)	do { map1 = (cpumask_t)map2; } while (0)
++#define cpus_weight_const(map)		cpus_weight(map)
++#define first_cpu_const(map)		first_cpu(map)
++#define next_cpu_const(cpu, map)	next_cpu(cpu, map)
++
++/* only ever use this for things that are _never_ used on large boxen */
++#define cpus_coerce_const(map)		cpus_coerce(map)
++#define any_online_cpu_const(map)	any_online_cpu(map)
++
++#endif /* __ASM_GENERIC_CPUMASK_CONST_VALUE_H */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-generic/cpumask_up.h	2003-07-19 17:04:07.000000000 -0700
+@@ -0,0 +1,60 @@
++#ifndef __ASM_GENERIC_CPUMASK_UP_H
++#define __ASM_GENERIC_CPUMASK_UP_H
++
++#define CPU_ARRAY_SIZE		BITS_TO_LONGS(NR_CPUS)
++
++#define cpus_coerce(map)	((map).mask[0])
++
++#define cpu_set(cpu, map)		do { cpus_coerce(map) = 1UL; } while (0)
++#define cpu_clear(cpu, map)		do { cpus_coerce(map) = 0UL; } while (0)
++#define cpu_isset(cpu, map)		(cpus_coerce(map) != 0UL)
++#define cpu_test_and_set(cpu, map)	test_and_set_bit(0, (map).mask)
++
++#define cpus_and(dst, src1, src2)					\
++	do {								\
++		if (cpus_coerce(src1) && cpus_coerce(src2))		\
++			cpus_coerce(dst) = 1UL;				\
++		else							\
++			cpus_coerce(dst) = 0UL;				\
++	} while (0)
++
++#define cpus_or(dst, src1, src2)					\
++	do {								\
++		if (cpus_coerce(src1) || cpus_coerce(src2))		\
++			cpus_coerce(dst) = 1UL;				\
++		else							\
++			cpus_coerce(dst) = 0UL;				\
++	} while (0)
++
++#define cpus_clear(map)			do { cpus_coerce(map) = 0UL; } while (0)
++
++#define cpus_complement(map)						\
++	do {								\
++		cpus_coerce(map) = !cpus_coerce(map);			\
++	} while (0)
++
++#define cpus_equal(map1, map2)		(cpus_coerce(map1) == cpus_coerce(map2))
++#define cpus_empty(map)			(cpus_coerce(map) == 0UL)
++#define cpus_weight(map)		(cpus_coerce(map) ? 1UL : 0UL)
++#define cpus_shift_right(d, s, n)	do { cpus_coerce(d) = 0UL; } while (0)
++#define cpus_shift_left(d, s, n)	do { cpus_coerce(d) = 0UL; } while (0)
++#define first_cpu(map)			(cpus_coerce(map) ? 0 : 1)
++#define next_cpu(cpu, map)		1
++
++/* only ever use this for things that are _never_ used on large boxen */
++#define cpus_promote(map)						\
++	({								\
++		cpumask_t __tmp__;					\
++		cpus_coerce(__tmp__) = map;				\
++		__tmp__;						\
++	})
++#define cpumask_of_cpu(cpu)		cpus_promote(1)
++#define any_online_cpu(map)		(cpus_coerce(map) ? 0 : 1)
++
++/*
++ * um, these need to be usable as static initializers
++ */
++#define CPU_MASK_ALL	{ {[0 ... CPU_ARRAY_SIZE-1] =  1UL} }
++#define CPU_MASK_NONE	{ {[0 ... CPU_ARRAY_SIZE-1] =  0UL} }
++
++#endif /* __ASM_GENERIC_CPUMASK_UP_H */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-generic/local.h	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,118 @@
++#ifndef _ASM_GENERIC_LOCAL_H
++#define _ASM_GENERIC_LOCAL_H
++
++#include <linux/config.h>
++#include <linux/percpu.h>
++#include <asm/types.h>
++#include <asm/hardirq.h>
++
++/* An unsigned long type for operations which are atomic for a single
++ * CPU.  Usually used in combination with per-cpu variables. */
++
++#if BITS_PER_LONG == 32 && !defined(CONFIG_SPARC32)
++/* Implement in terms of atomics. */
++
++/* Don't use typedef: don't want them to be mixed with atomic_t's. */
++typedef struct
++{
++	atomic_t a;
++} local_t;
++
++#define LOCAL_INIT(i)	{ ATOMIC_INIT(i) }
++
++#define local_read(l)	((unsigned long)atomic_read(&(l)->a))
++#define local_set(l,i)	atomic_set((&(l)->a),(i))
++#define local_inc(l)	atomic_inc(&(l)->a)
++#define local_dec(l)	atomic_dec(&(l)->a)
++#define local_add(i,l)	atomic_add((i),(&(l)->a))
++#define local_sub(i,l)	atomic_sub((i),(&(l)->a))
++
++/* Non-atomic variants, ie. preemption disabled and won't be touched
++ * in interrupt, etc.  Some archs can optimize this case well. */
++#define __local_inc(l)		local_set((l), local_read(l) + 1)
++#define __local_dec(l)		local_set((l), local_read(l) - 1)
++#define __local_add(i,l)	local_set((l), local_read(l) + (i))
++#define __local_sub(i,l)	local_set((l), local_read(l) - (i))
++
++#else /* ... can't use atomics. */
++/* Implement in terms of three variables.
++   Another option would be to use local_irq_save/restore. */
++
++typedef struct
++{
++	/* 0 = in hardirq, 1 = in softirq, 2 = usermode. */
++	unsigned long v[3];
++} local_t;
++
++#define _LOCAL_VAR(l)	((l)->v[!in_interrupt() + !in_irq()])
++
++#define LOCAL_INIT(i)	{ { (i), 0, 0 } }
++
++static inline unsigned long local_read(local_t *l)
++{
++	return l->v[0] + l->v[1] + l->v[2];
++}
++
++static inline void local_set(local_t *l, unsigned long v)
++{
++	l->v[0] = v;
++	l->v[1] = l->v[2] = 0;
++}
++
++static inline void local_inc(local_t *l)
++{
++	preempt_disable();
++	_LOCAL_VAR(l)++;
++	preempt_enable();
++}
++
++static inline void local_dec(local_t *l)
++{
++	preempt_disable();
++	_LOCAL_VAR(l)--;
++	preempt_enable();
++}
++
++static inline void local_add(unsigned long v, local_t *l)
++{
++	preempt_disable();
++	_LOCAL_VAR(l) += v;
++	preempt_enable();
++}
++
++static inline void local_sub(unsigned long v, local_t *l)
++{
++	preempt_disable();
++	_LOCAL_VAR(l) -= v;
++	preempt_enable();
++}
++
++/* Non-atomic variants, ie. preemption disabled and won't be touched
++ * in interrupt, etc.  Some archs can optimize this case well. */
++#define __local_inc(l)		((l)->v[0]++)
++#define __local_dec(l)		((l)->v[0]--)
++#define __local_add(i,l)	((l)->v[0] += (i))
++#define __local_sub(i,l)	((l)->v[0] -= (i))
++
++#endif /* Non-atomic implementation */
++
++/* Use these for per-cpu local_t variables: on some archs they are
++ * much more efficient than these naive implementations.  Note they take
++ * a variable (eg. mystruct.foo), not an address.
++ */
++#define cpu_local_read(v)	local_read(&__get_cpu_var(v))
++#define cpu_local_set(v, i)	local_set(&__get_cpu_var(v), (i))
++#define cpu_local_inc(v)	local_inc(&__get_cpu_var(v))
++#define cpu_local_dec(v)	local_dec(&__get_cpu_var(v))
++#define cpu_local_add(i, v)	local_add((i), &__get_cpu_var(v))
++#define cpu_local_sub(i, v)	local_sub((i), &__get_cpu_var(v))
++
++/* Non-atomic increments, ie. preemption disabled and won't be touched
++ * in interrupt, etc.  Some archs can optimize this case well.
++ */
++#define __cpu_local_inc(v)	__local_inc(&__get_cpu_var(v))
++#define __cpu_local_dec(v)	__local_dec(&__get_cpu_var(v))
++#define __cpu_local_add(i, v)	__local_add((i), &__get_cpu_var(v))
++#define __cpu_local_sub(i, v)	__local_sub((i), &__get_cpu_var(v))
++
++#endif /* _ASM_GENERIC_LOCAL_H */
+--- linux-2.6.0-test1/include/asm-generic/percpu.h	2003-06-14 12:18:04.000000000 -0700
++++ 25/include/asm-generic/percpu.h	2003-07-19 17:03:50.000000000 -0700
+@@ -9,33 +9,34 @@ extern unsigned long __per_cpu_offset[NR
+ 
+ /* Separate out the type, so (int[3], foo) works. */
+ #define DEFINE_PER_CPU(type, name) \
+-    __attribute__((__section__(".data.percpu"))) __typeof__(type) name##__per_cpu
++    __attribute__((__section__(".data.percpu"))) __typeof__(type) per_cpu__##name
+ 
+ /* var is in discarded region: offset to particular copy we want */
+-#define per_cpu(var, cpu) (*RELOC_HIDE(&var##__per_cpu, __per_cpu_offset[cpu]))
++#define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset[cpu]))
+ #define __get_cpu_var(var) per_cpu(var, smp_processor_id())
+ 
+-static inline void percpu_modcopy(void *pcpudst, const void *src,
+-				  unsigned long size)
+-{
+-	unsigned int i;
+-	for (i = 0; i < NR_CPUS; i++)
+-		if (cpu_possible(i))
+-			memcpy(pcpudst + __per_cpu_offset[i], src, size);
+-}
++/* A macro to avoid #include hell... */
++#define percpu_modcopy(pcpudst, src, size)			\
++do {								\
++	unsigned int __i;					\
++	for (__i = 0; __i < NR_CPUS; __i++)			\
++		if (cpu_possible(__i))				\
++			memcpy((pcpudst)+__per_cpu_offset[__i],	\
++			       (src), (size));			\
++} while (0)
+ #else /* ! SMP */
+ 
+ #define DEFINE_PER_CPU(type, name) \
+-    __typeof__(type) name##__per_cpu
++    __typeof__(type) per_cpu__##name
+ 
+-#define per_cpu(var, cpu)			((void)cpu, var##__per_cpu)
+-#define __get_cpu_var(var)			var##__per_cpu
++#define per_cpu(var, cpu)			((void)cpu, per_cpu__##var)
++#define __get_cpu_var(var)			per_cpu__##var
+ 
+ #endif	/* SMP */
+ 
+-#define DECLARE_PER_CPU(type, name) extern __typeof__(type) name##__per_cpu
++#define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name
+ 
+-#define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(var##__per_cpu)
+-#define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(var##__per_cpu)
++#define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var)
++#define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(per_cpu__##var)
+ 
+ #endif /* _ASM_GENERIC_PERCPU_H_ */
+--- linux-2.6.0-test1/include/asm-generic/sections.h	2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-generic/sections.h	2003-07-19 17:03:50.000000000 -0700
+@@ -3,9 +3,10 @@
+ 
+ /* References to section boundaries */
+ 
+-extern char _text, _etext;
+-extern char _data, _edata;
+-extern char __bss_start;
+-extern char __init_begin, __init_end;
++extern char _text[], _stext[], _etext[];
++extern char _data[], _sdata[], _edata[];
++extern char __bss_start[];
++extern char __init_begin[], __init_end[];
++extern char _sinittext[], _einittext[];
+ 
+ #endif /* _ASM_GENERIC_SECTIONS_H_ */
+--- linux-2.6.0-test1/include/asm-h8300/pgtable.h	2003-06-14 12:18:08.000000000 -0700
++++ 25/include/asm-h8300/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -15,6 +15,11 @@ typedef pte_t *pte_addr_t;
+ #define pgd_clear(pgdp)
+ #define kern_addr_valid(addr)	(1)
+ #define	pmd_offset(a, b)	((void *)0)
++#define pmd_offset_kernel(a,b)		pmd_offset(a,b)
++#define pmd_offset_map(a,b)		pmd_offset(a,b)
++#define pmd_offset_map_nested(a,b)	pmd_offset(a,b)
++#define pmd_unmap(pmd)			do { } while (0)
++#define pmd_unmap_nested(pmd)		do { } while (0)
+ 
+ #define PAGE_NONE		__pgprot(0)    /* these mean nothing to NO_MM */
+ #define PAGE_SHARED		__pgprot(0)    /* these mean nothing to NO_MM */
+--- linux-2.6.0-test1/include/asm-h8300/posix_types.h	2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-h8300/posix_types.h	2003-07-19 17:06:39.000000000 -0700
+@@ -7,7 +7,9 @@
+  * assume GCC is being used.
+  */
+ 
+-typedef unsigned short	__kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long	__kernel_dev_t;
++#endif
+ typedef unsigned long	__kernel_ino_t;
+ typedef unsigned short	__kernel_mode_t;
+ typedef unsigned short	__kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-i386/atomic.h	2003-06-14 12:18:04.000000000 -0700
++++ 25/include/asm-i386/atomic.h	2003-07-19 17:04:07.000000000 -0700
+@@ -193,7 +193,7 @@ __asm__ __volatile__(LOCK "andl %0,%1" \
+ 
+ #define atomic_set_mask(mask, addr) \
+ __asm__ __volatile__(LOCK "orl %0,%1" \
+-: : "r" (mask),"m" (*addr) : "memory")
++: : "r" (mask),"m" (*(addr)) : "memory")
+ 
+ /* Atomic operations are already serializing on x86 */
+ #define smp_mb__before_atomic_dec()	barrier()
+--- linux-2.6.0-test1/include/asm-i386/bitops.h	2003-06-14 12:18:24.000000000 -0700
++++ 25/include/asm-i386/bitops.h	2003-07-19 17:04:07.000000000 -0700
+@@ -270,7 +270,7 @@ static __inline__ int variable_test_bit(
+  * Returns the bit-number of the first zero bit, not the number of the byte
+  * containing a bit.
+  */
+-static __inline__ int find_first_zero_bit(unsigned long * addr, unsigned size)
++static __inline__ int find_first_zero_bit(const unsigned long *addr, unsigned size)
+ {
+ 	int d0, d1, d2;
+ 	int res;
+@@ -302,7 +302,7 @@ static __inline__ int find_first_zero_bi
+  * Returns the bit-number of the first set bit, not the number of the byte
+  * containing a bit.
+  */
+-static __inline__ int find_first_bit(unsigned long * addr, unsigned size)
++static __inline__ int find_first_bit(const unsigned long *addr, unsigned size)
+ {
+ 	int d0, d1;
+ 	int res;
+@@ -328,7 +328,7 @@ static __inline__ int find_first_bit(uns
+  * @offset: The bitnumber to start searching at
+  * @size: The maximum size to search
+  */
+-static __inline__ int find_next_zero_bit(unsigned long * addr, int size, int offset)
++static __inline__ int find_next_zero_bit(const unsigned long *addr, int size, int offset)
+ {
+ 	unsigned long * p = ((unsigned long *) addr) + (offset >> 5);
+ 	int set = 0, bit = offset & 31, res;
+@@ -361,9 +361,9 @@ static __inline__ int find_next_zero_bit
+  * @offset: The bitnumber to start searching at
+  * @size: The maximum size to search
+  */
+-static __inline__ int find_next_bit(unsigned long *addr, int size, int offset)
++static __inline__ int find_next_bit(const unsigned long *addr, int size, int offset)
+ {
+-	unsigned long * p = addr + (offset >> 5);
++	const unsigned long *p = addr + (offset >> 5);
+ 	int set = 0, bit = offset & 31, res;
+ 
+ 	if (bit) {
+@@ -430,7 +430,7 @@ static __inline__ unsigned long __ffs(un
+  * unlikely to be set. It's guaranteed that at least one of the 140
+  * bits is cleared.
+  */
+-static inline int sched_find_first_bit(unsigned long *b)
++static inline int sched_find_first_bit(const unsigned long *b)
+ {
+ 	if (unlikely(b[0]))
+ 		return __ffs(b[0]);
+--- linux-2.6.0-test1/include/asm-i386/bugs.h	2003-06-26 22:07:25.000000000 -0700
++++ 25/include/asm-i386/bugs.h	2003-07-19 17:04:02.000000000 -0700
+@@ -1,11 +1,11 @@
+ /*
+  *  include/asm-i386/bugs.h
+  *
+- *  Copyright (C) 1994  Linus Torvalds
++ *  Copyright (C) 1994	Linus Torvalds
+  *
+  *  Cyrix stuff, June 1998 by:
+  *	- Rafael R. Reilova (moved everything from head.S),
+- *        <rreilova@ececs.uc.edu>
++ *	  <rreilova@ececs.uc.edu>
+  *	- Channing Corn (tests & fixes),
+  *	- Andrew D. Balsa (code cleanup).
+  *
+@@ -25,7 +25,20 @@
+ #include <asm/processor.h>
+ #include <asm/i387.h>
+ #include <asm/msr.h>
+-
++#ifdef CONFIG_KGDB
++/*
++ * Provied the command line "gdb" initial break
++ */
++int __init kgdb_initial_break(char * str)
++{
++	if (*str == '\0'){
++		breakpoint();
++		return 1;
++	}
++	return 0;
++}
++__setup("gdb",kgdb_initial_break);
++#endif
+ static int __init no_halt(char *s)
+ {
+ 	boot_cpu_data.hlt_works_ok = 0;
+@@ -140,7 +153,7 @@ static void __init check_popad(void)
+ 	  : "ecx", "edi" );
+ 	/* If this fails, it means that any user program may lock the CPU hard. Too bad. */
+ 	if (res != 12345678) printk( "Buggy.\n" );
+-		        else printk( "OK.\n" );
++			else printk( "OK.\n" );
+ #endif
+ }
+ 
+--- linux-2.6.0-test1/include/asm-i386/genapic.h	2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-i386/genapic.h	2003-07-19 17:04:07.000000000 -0700
+@@ -1,13 +1,13 @@
+ #ifndef _ASM_GENAPIC_H
+ #define _ASM_GENAPIC_H 1
+ 
+-/* 
++/*
+  * Generic APIC driver interface.
+- *  
+- * An straight forward mapping of the APIC related parts of the 
++ *
++ * An straight forward mapping of the APIC related parts of the
+  * x86 subarchitecture interface to a dynamic object.
+- *	
+- * This is used by the "generic" x86 subarchitecture. 
++ *
++ * This is used by the "generic" x86 subarchitecture.
+  *
+  * Copyright 2003 Andi Kleen, SuSE Labs.
+  */
+@@ -22,23 +22,23 @@ struct genapic { 
+ 	int (*probe)(void); 
+ 
+ 	int (*apic_id_registered)(void);
+-	unsigned long (*target_cpus)(void); 
++	cpumask_t (*target_cpus)(void);
+ 	int int_delivery_mode;
+ 	int int_dest_mode; 
+ 	int apic_broadcast_id; 
+ 	int esr_disable;
+-	unsigned long (*check_apicid_used)(unsigned long bitmap, int apicid); 
++	unsigned long (*check_apicid_used)(physid_mask_t bitmap, int apicid);
+ 	unsigned long (*check_apicid_present)(int apicid); 
+ 	int no_balance_irq;
+ 	void (*init_apic_ldr)(void);
+-	unsigned long (*ioapic_phys_id_map)(unsigned long map); 
++	physid_mask_t (*ioapic_phys_id_map)(physid_mask_t map);
+ 
+ 	void (*clustered_apic_check)(void);
+ 	int (*multi_timer_check)(int apic, int irq);
+ 	int (*apicid_to_node)(int logical_apicid); 
+ 	int (*cpu_to_logical_apicid)(int cpu);
+ 	int (*cpu_present_to_apicid)(int mps_cpu);
+-	unsigned long (*apicid_to_cpu_present)(int phys_apicid); 
++	physid_mask_t (*apicid_to_cpu_present)(int phys_apicid);
+ 	int (*mpc_apic_id)(struct mpc_config_processor *m, 
+ 			   struct mpc_config_translation *t); 
+ 	void (*setup_portio_remap)(void); 
+@@ -59,11 +59,11 @@ struct genapic { 
+ 	int (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id);
+ 
+ 	unsigned (*get_apic_id)(unsigned long x);
+-	unsigned long apic_id_mask; 
+-	unsigned int (*cpu_mask_to_apicid)(unsigned long cpumask);
++	unsigned long apic_id_mask;
++	unsigned int (*cpu_mask_to_apicid)(cpumask_const_t cpumask);
+ 	
+ 	/* ipi */
+-	void (*send_IPI_mask)(int mask, int vector);
++	void (*send_IPI_mask)(cpumask_t mask, int vector);
+ 	void (*send_IPI_allbutself)(int vector);
+ 	void (*send_IPI_all)(int vector);
+ }; 
+--- linux-2.6.0-test1/include/asm-i386/highmem.h	2003-06-14 12:17:57.000000000 -0700
++++ 25/include/asm-i386/highmem.h	2003-07-19 17:07:16.000000000 -0700
+@@ -22,6 +22,7 @@
+ 
+ #include <linux/config.h>
+ #include <linux/interrupt.h>
++#include <linux/threads.h>
+ #include <asm/kmap_types.h>
+ #include <asm/tlbflush.h>
+ 
+@@ -39,7 +40,11 @@ extern void kmap_init(void);
+  * easily, subsequent pte tables have to be allocated in one physical
+  * chunk of RAM.
+  */
+-#define PKMAP_BASE (0xff800000UL)
++#if NR_CPUS <= 32
++#define PKMAP_BASE (0xff400000UL)
++#else
++#define PKMAP_BASE (0xfe800000UL)
++#endif
+ #ifdef CONFIG_X86_PAE
+ #define LAST_PKMAP 512
+ #else
+--- linux-2.6.0-test1/include/asm-i386/hw_irq.h	2003-06-14 12:18:51.000000000 -0700
++++ 25/include/asm-i386/hw_irq.h	2003-07-19 17:04:07.000000000 -0700
+@@ -16,6 +16,7 @@
+ #include <linux/profile.h>
+ #include <asm/atomic.h>
+ #include <asm/irq.h>
++#include <asm/sections.h>
+ 
+ /*
+  * Various low-level irq details needed by irq.c, process.c,
+@@ -30,41 +31,39 @@ extern int irq_vector[NR_IRQS];
+ extern void (*interrupt[NR_IRQS])(void);
+ 
+ #ifdef CONFIG_SMP
+-extern asmlinkage void reschedule_interrupt(void);
+-extern asmlinkage void invalidate_interrupt(void);
+-extern asmlinkage void call_function_interrupt(void);
++asmlinkage void reschedule_interrupt(void);
++asmlinkage void invalidate_interrupt(void);
++asmlinkage void call_function_interrupt(void);
+ #endif
+ 
+ #ifdef CONFIG_X86_LOCAL_APIC
+-extern asmlinkage void apic_timer_interrupt(void);
+-extern asmlinkage void error_interrupt(void);
+-extern asmlinkage void spurious_interrupt(void);
+-extern asmlinkage void thermal_interrupt(struct pt_regs);
++asmlinkage void apic_timer_interrupt(void);
++asmlinkage void error_interrupt(void);
++asmlinkage void spurious_interrupt(void);
++asmlinkage void thermal_interrupt(struct pt_regs);
+ #endif
+ 
+-extern void mask_irq(unsigned int irq);
+-extern void unmask_irq(unsigned int irq);
+-extern void disable_8259A_irq(unsigned int irq);
+-extern void enable_8259A_irq(unsigned int irq);
+-extern int i8259A_irq_pending(unsigned int irq);
+-extern void make_8259A_irq(unsigned int irq);
+-extern void init_8259A(int aeoi);
+-extern void FASTCALL(send_IPI_self(int vector));
+-extern void init_VISWS_APIC_irqs(void);
+-extern void setup_IO_APIC(void);
+-extern void disable_IO_APIC(void);
+-extern void print_IO_APIC(void);
+-extern int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn);
+-extern void send_IPI(int dest, int vector);
+-extern void setup_ioapic_dest(unsigned long mask);
++void mask_irq(unsigned int irq);
++void unmask_irq(unsigned int irq);
++void disable_8259A_irq(unsigned int irq);
++void enable_8259A_irq(unsigned int irq);
++int i8259A_irq_pending(unsigned int irq);
++void make_8259A_irq(unsigned int irq);
++void init_8259A(int aeoi);
++void FASTCALL(send_IPI_self(int vector));
++void init_VISWS_APIC_irqs(void);
++void setup_IO_APIC(void);
++void disable_IO_APIC(void);
++void print_IO_APIC(void);
++int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn);
++void send_IPI(int dest, int vector);
++void setup_ioapic_dest(cpumask_t mask);
+ 
+ extern unsigned long io_apic_irqs;
+ 
+ extern atomic_t irq_err_count;
+ extern atomic_t irq_mis_count;
+ 
+-extern char _stext, _etext;
+-
+ #define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs))
+ 
+ /*
+@@ -95,7 +94,7 @@ static inline void x86_do_profile(struct
+ 	if (!((1<<smp_processor_id()) & prof_cpu_mask))
+ 		return;
+ 
+-	eip -= (unsigned long) &_stext;
++	eip -= (unsigned long)_stext;
+ 	eip >>= prof_shift;
+ 	/*
+ 	 * Don't ignore out-of-bounds EIP values silently,
+@@ -107,7 +106,7 @@ static inline void x86_do_profile(struct
+ 	atomic_inc((atomic_t *)&prof_buffer[eip]);
+ }
+  
+-#if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_SMP)
++#if defined(CONFIG_X86_IO_APIC)
+ static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i)
+ {
+ 	if (IO_APIC_IRQ(i))
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-i386/kgdb.h	2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,59 @@
++#ifndef __KGDB
++#define __KGDB
++
++/*
++ * This file should not include ANY others.  This makes it usable
++ * most anywhere without the fear of include order or inclusion.
++ * Make it so!
++ *
++ * This file may be included all the time.  It is only active if 
++ * CONFIG_KGDB is defined, otherwise it stubs out all the macros
++ * and entry points.
++ */
++#if defined(CONFIG_KGDB) && !defined(__ASSEMBLY__)
++
++extern void breakpoint(void);
++#define INIT_KGDB_INTS kgdb_enable_ints()
++
++#ifndef BREAKPOINT
++#define BREAKPOINT   asm("   int $3")
++#endif
++/*
++ * GDB debug stub (or any debug stub) can point the 'linux_debug_hook'
++ * pointer to its routine and it will be entered as the first thing
++ * when a trap occurs.
++ *
++ * Return values are, at present, undefined.
++ *
++ * The debug hook routine does not necessarily return to its caller.
++ * It has the register image and thus may choose to resume execution
++ * anywhere it pleases. 
++ */
++struct pt_regs;
++
++extern int kgdb_handle_exception(int trapno,
++				 int signo, int err_code, struct pt_regs *regs);
++extern int in_kgdb(struct pt_regs *regs);
++
++#ifdef CONFIG_KGDB_TS
++void kgdb_tstamp(int line, char *source, int data0, int data1);
++/*
++ * This is the time stamp function.  The macro adds the source info and
++ * does a cast on the data to allow most any 32-bit value.
++ */
++
++#define kgdb_ts(data0,data1) kgdb_tstamp(__LINE__,__FILE__,(int)data0,(int)data1)
++#else
++#define kgdb_ts(data0,data1)
++#endif
++#else				/* CONFIG_KGDB  && ! __ASSEMBLY__ ,stubs follow... */
++#ifndef BREAKPOINT
++#define BREAKPOINT
++#endif
++#define kgdb_ts(data0,data1)
++#define in_kgdb
++#define kgdb_handle_exception
++#define breakpoint
++#define INIT_KGDB_INTS
++#endif
++#endif				/* __KGDB */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-i386/kgdb_local.h	2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,102 @@
++#ifndef __KGDB_LOCAL
++#define ___KGDB_LOCAL
++#include <linux/config.h>
++#include <linux/types.h>
++#include <linux/serial.h>
++#include <linux/serialP.h>
++#include <linux/spinlock.h>
++#include <asm/processor.h>
++#include <asm/msr.h>
++#include <asm/kgdb.h>
++
++#define PORT 0x3f8
++#ifdef CONFIG_KGDB_PORT
++#undef PORT
++#define PORT CONFIG_KGDB_PORT
++#endif
++#define IRQ 4
++#ifdef CONFIG_KGDB_IRQ
++#undef IRQ
++#define IRQ CONFIG_KGDB_IRQ
++#endif
++#define SB_CLOCK 1843200
++#define SB_BASE (SB_CLOCK/16)
++#define SB_BAUD9600 SB_BASE/9600
++#define SB_BAUD192  SB_BASE/19200
++#define SB_BAUD384  SB_BASE/38400
++#define SB_BAUD576  SB_BASE/57600
++#define SB_BAUD1152 SB_BASE/115200
++#ifdef CONFIG_KGDB_9600BAUD
++#define SB_BAUD SB_BAUD9600
++#endif
++#ifdef CONFIG_KGDB_19200BAUD
++#define SB_BAUD SB_BAUD192
++#endif
++#ifdef CONFIG_KGDB_38400BAUD
++#define SB_BAUD SB_BAUD384
++#endif
++#ifdef CONFIG_KGDB_57600BAUD
++#define SB_BAUD SB_BAUD576
++#endif
++#ifdef CONFIG_KGDB_115200BAUD
++#define SB_BAUD SB_BAUD1152
++#endif
++#ifndef SB_BAUD
++#define SB_BAUD SB_BAUD1152	/* Start with this if not given */
++#endif
++
++#ifndef CONFIG_X86_TSC
++#undef rdtsc
++#define rdtsc(a,b) if (a++ > 10000){a = 0; b++;}
++#undef rdtscll
++#define rdtscll(s) s++
++#endif
++
++#ifdef _raw_read_unlock		/* must use a name that is "define"ed, not an inline */
++#undef spin_lock
++#undef spin_trylock
++#undef spin_unlock
++#define spin_lock	 _raw_spin_lock
++#define spin_trylock	 _raw_spin_trylock
++#define spin_unlock	 _raw_spin_unlock
++#else
++#endif
++#undef spin_unlock_wait
++#define spin_unlock_wait(x)  do { cpu_relax(); barrier();} \
++                                     while(spin_is_locked(x))
++
++#define SB_IER 1
++#define SB_MCR UART_MCR_OUT2 | UART_MCR_DTR | UART_MCR_RTS
++
++#define FLAGS 0
++#define SB_STATE { \
++     magic: SSTATE_MAGIC, \
++     baud_base: SB_BASE,  \
++     port:      PORT,     \
++     irq:       IRQ,      \
++     flags:     FLAGS,    \
++     custom_divisor:SB_BAUD}
++#define SB_INFO  { \
++      magic: SERIAL_MAGIC, \
++      port:  PORT,0,FLAGS, \
++      state: &state,       \
++      tty:   (struct tty_struct *)&state, \
++      IER:   SB_IER,       \
++      MCR:   SB_MCR}
++extern void putDebugChar(int);
++/* RTAI support needs us to really stop/start interrupts */
++
++#define kgdb_sti() __asm__ __volatile__("sti": : :"memory")
++#define kgdb_cli() __asm__ __volatile__("cli": : :"memory")
++#define kgdb_local_save_flags(x) __asm__ __volatile__(\
++                                   "pushfl ; popl %0":"=g" (x): /* no input */)
++#define kgdb_local_irq_restore(x) __asm__ __volatile__(\
++                                   "pushl %0 ; popfl": \
++                                     /* no output */ :"g" (x):"memory", "cc")
++#define kgdb_local_irq_save(x) kgdb_local_save_flags(x); kgdb_cli()
++
++#ifdef CONFIG_SERIAL
++extern void shutdown_for_kgdb(struct async_struct *info);
++#endif
++#define INIT_KDEBUG putDebugChar("+");
++#endif				/* __KGDB_LOCAL */
+--- linux-2.6.0-test1/include/asm-i386/kmap_types.h	2003-06-14 12:18:28.000000000 -0700
++++ 25/include/asm-i386/kmap_types.h	2003-07-19 17:07:16.000000000 -0700
+@@ -17,14 +17,16 @@ D(3)	KM_USER0,
+ D(4)	KM_USER1,
+ D(5)	KM_BIO_SRC_IRQ,
+ D(6)	KM_BIO_DST_IRQ,
+-D(7)	KM_PTE0,
+-D(8)	KM_PTE1,
+-D(9)	KM_PTE2,
+-D(10)	KM_IRQ0,
+-D(11)	KM_IRQ1,
+-D(12)	KM_SOFTIRQ0,
+-D(13)	KM_SOFTIRQ1,
+-D(14)	KM_TYPE_NR
++D(7)	KM_PMD0,
++D(8)	KM_PMD1,
++D(9)	KM_PTE0,
++D(10)	KM_PTE1,
++D(11)	KM_PTE2,
++D(12)	KM_IRQ0,
++D(13)	KM_IRQ1,
++D(14)	KM_SOFTIRQ0,
++D(15)	KM_SOFTIRQ1,
++D(16)	KM_TYPE_NR
+ };
+ 
+ #undef D
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-i386/local.h	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,70 @@
++#ifndef _ARCH_I386_LOCAL_H
++#define _ARCH_I386_LOCAL_H
++
++#include <linux/percpu.h>
++
++typedef struct
++{
++	volatile unsigned long counter;
++} local_t;
++
++#define LOCAL_INIT(i)	{ (i) }
++
++#define local_read(v)	((v)->counter)
++#define local_set(v,i)	(((v)->counter) = (i))
++
++static __inline__ void local_inc(local_t *v)
++{
++	__asm__ __volatile__(
++		"incl %0"
++		:"=m" (v->counter)
++		:"m" (v->counter));
++}
++
++static __inline__ void local_dec(local_t *v)
++{
++	__asm__ __volatile__(
++		"decl %0"
++		:"=m" (v->counter)
++		:"m" (v->counter));
++}
++
++static __inline__ void local_add(unsigned long i, local_t *v)
++{
++	__asm__ __volatile__(
++		"addl %1,%0"
++		:"=m" (v->counter)
++		:"ir" (i), "m" (v->counter));
++}
++
++static __inline__ void local_sub(unsigned long i, local_t *v)
++{
++	__asm__ __volatile__(
++		"subl %1,%0"
++		:"=m" (v->counter)
++		:"ir" (i), "m" (v->counter));
++}
++
++/* On x86, these are no better than the atomic variants. */
++#define __local_inc(l)		local_inc(l)
++#define __local_dec(l)		local_dec(l)
++#define __local_add(i,l)	local_add((i),(l))
++#define __local_sub(i,l)	local_sub((i),(l))
++
++/* Use these for per-cpu local_t variables: on some archs they are
++ * much more efficient than these naive implementations.  Note they take
++ * a variable, not an address.
++ */
++#define cpu_local_read(v)	local_read(&__get_cpu_var(v))
++#define cpu_local_set(v, i)	local_set(&__get_cpu_var(v), (i))
++#define cpu_local_inc(v)	local_inc(&__get_cpu_var(v))
++#define cpu_local_dec(v)	local_dec(&__get_cpu_var(v))
++#define cpu_local_add(i, v)	local_add((i), &__get_cpu_var(v))
++#define cpu_local_sub(i, v)	local_sub((i), &__get_cpu_var(v))
++
++#define __cpu_local_inc(v)	cpu_local_inc(v)
++#define __cpu_local_dec(v)	cpu_local_dec(v)
++#define __cpu_local_add(i, v)	cpu_local_add((i), (v))
++#define __cpu_local_sub(i, v)	cpu_local_sub((i), (v))
++
++#endif /* _ARCH_I386_LOCAL_H */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-i386/lockmeter.h	2003-07-19 17:06:40.000000000 -0700
+@@ -0,0 +1,127 @@
++/*
++ *  Copyright (C) 1999,2000 Silicon Graphics, Inc.
++ *
++ *  Written by John Hawkes (hawkes@sgi.com)
++ *  Based on klstat.h by Jack Steiner (steiner@sgi.com)
++ *
++ *  Modified by Ray Bryant (raybry@us.ibm.com)
++ *  Changes Copyright (C) 2000 IBM, Inc.
++ *  Added save of index in spinlock_t to improve efficiency
++ *  of "hold" time reporting for spinlocks.
++ *  Added support for hold time statistics for read and write
++ *  locks.
++ *  Moved machine dependent code here from include/lockmeter.h.
++ *
++ */
++
++#ifndef _I386_LOCKMETER_H
++#define _I386_LOCKMETER_H
++
++#include <asm/spinlock.h>
++#include <asm/rwlock.h>
++
++#include <linux/version.h>
++
++#ifdef __KERNEL__
++extern unsigned long cpu_khz;
++#define CPU_CYCLE_FREQUENCY	(cpu_khz * 1000)
++#else
++#define CPU_CYCLE_FREQUENCY	450000000
++#endif
++
++#define THIS_CPU_NUMBER		smp_processor_id()
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
++#define local_irq_save(x) \
++    __asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x): /* no input */ :"memory")
++
++#define local_irq_restore(x) \
++    __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory")
++#endif	/* Linux version 2.2.x */
++
++/*
++ * macros to cache and retrieve an index value inside of a spin lock
++ * these macros assume that there are less than 65536 simultaneous
++ * (read mode) holders of a rwlock.  Not normally a problem!!
++ * we also assume that the hash table has less than 65535 entries.
++ */
++/*
++ * instrumented spinlock structure -- never used to allocate storage
++ * only used in macros below to overlay a spinlock_t
++ */
++typedef struct inst_spinlock_s {
++	/* remember, Intel is little endian */
++	unsigned short lock;
++	unsigned short index;
++} inst_spinlock_t;
++#define PUT_INDEX(lock_ptr,indexv) ((inst_spinlock_t *)(lock_ptr))->index = indexv
++#define GET_INDEX(lock_ptr)        ((inst_spinlock_t *)(lock_ptr))->index
++
++/*
++ * macros to cache and retrieve an index value in a read/write lock
++ * as well as the cpu where a reader busy period started
++ * we use the 2nd word (the debug word) for this, so require the
++ * debug word to be present
++ */
++/*
++ * instrumented rwlock structure -- never used to allocate storage
++ * only used in macros below to overlay a rwlock_t
++ */
++typedef struct inst_rwlock_s {
++	volatile int lock;
++	unsigned short index;
++	unsigned short cpu;
++} inst_rwlock_t;
++#define PUT_RWINDEX(rwlock_ptr,indexv) ((inst_rwlock_t *)(rwlock_ptr))->index = indexv
++#define GET_RWINDEX(rwlock_ptr)        ((inst_rwlock_t *)(rwlock_ptr))->index
++#define PUT_RW_CPU(rwlock_ptr,cpuv)    ((inst_rwlock_t *)(rwlock_ptr))->cpu = cpuv
++#define GET_RW_CPU(rwlock_ptr)         ((inst_rwlock_t *)(rwlock_ptr))->cpu
++
++/*
++ * return the number of readers for a rwlock_t
++ */
++#define RWLOCK_READERS(rwlock_ptr)   rwlock_readers(rwlock_ptr)
++
++extern inline int rwlock_readers(rwlock_t *rwlock_ptr)
++{
++	int tmp = (int) rwlock_ptr->lock;
++	/* read and write lock attempts may cause the lock value to temporarily */
++	/* be negative.  Until it is >= 0 we know nothing (i. e. can't tell if  */
++	/* is -1 because it was write locked and somebody tried to read lock it */
++	/* or if it is -1 because it was read locked and somebody tried to write*/
++	/* lock it. ........................................................... */
++	do {
++		tmp = (int) rwlock_ptr->lock;
++	} while (tmp < 0);
++	if (tmp == 0) return(0);
++	else return(RW_LOCK_BIAS-tmp);
++}
++
++/*
++ * return true if rwlock is write locked
++ * (note that other lock attempts can cause the lock value to be negative)
++ */
++#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) ((rwlock_ptr)->lock <= 0)
++#define IABS(x) ((x) > 0 ? (x) : -(x))
++#define RWLOCK_IS_READ_LOCKED(rwlock_ptr)  ((IABS((rwlock_ptr)->lock) % RW_LOCK_BIAS) != 0)
++
++/* this is a lot of typing just to get gcc to emit "rdtsc" */
++static inline long long get_cycles64 (void)
++{
++#ifndef CONFIG_X86_TSC
++	#error this code requires CONFIG_X86_TSC
++#else
++	union longlong_u {
++		long long intlong;
++		struct intint_s {
++			uint32_t eax;
++			uint32_t edx;
++		} intint;
++	} longlong;
++
++	rdtsc(longlong.intint.eax,longlong.intint.edx);
++	return longlong.intlong;
++#endif
++}
++
++#endif /* _I386_LOCKMETER_H */
+--- linux-2.6.0-test1/include/asm-i386/mach-bigsmp/mach_apic.h	2003-06-16 22:32:21.000000000 -0700
++++ 25/include/asm-i386/mach-bigsmp/mach_apic.h	2003-07-19 17:04:07.000000000 -0700
+@@ -20,7 +20,7 @@ static inline int apic_id_registered(voi
+ }
+ 
+ #define APIC_DFR_VALUE	(APIC_DFR_CLUSTER)
+-static inline unsigned long target_cpus(void)
++static inline cpumask_t target_cpus(void)
+ { 
+ 	return cpu_online_map;
+ }
+@@ -29,14 +29,15 @@ static inline unsigned long target_cpus(
+ #define INT_DELIVERY_MODE dest_LowestPrio
+ #define INT_DEST_MODE 1     /* logical delivery broadcast to all procs */
+ 
+-#define APIC_BROADCAST_ID     (0x0f)
+-static inline unsigned long check_apicid_used(unsigned long bitmap, int apicid) 
+-{ 
++#define APIC_BROADCAST_ID     (0xff)
++static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
++{
+ 	return 0;
+-} 
++}
++
+ static inline unsigned long check_apicid_present(int bit) 
+ {
+-	return (phys_cpu_present_map & (1 << bit));
++	return physid_isset(bit, phys_cpu_present_map);
+ }
+ 
+ #define apicid_cluster(apicid) (apicid & 0xF0)
+@@ -88,9 +89,9 @@ static inline int cpu_present_to_apicid(
+ 	return (int) bios_cpu_apicid[mps_cpu];
+ }
+ 
+-static inline unsigned long apicid_to_cpu_present(int phys_apicid)
++static inline physid_mask_t apicid_to_cpu_present(int phys_apicid)
+ {
+-	return (1ul << phys_apicid);
++	return physid_mask_of_physid(phys_apicid);
+ }
+ 
+ extern volatile u8 cpu_2_logical_apicid[];
+@@ -108,13 +109,13 @@ static inline int mpc_apic_id(struct mpc
+ 	        (m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
+ 	        (m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
+ 	        m->mpc_apicver);
+-	return (m->mpc_apicid);
++	return m->mpc_apicid;
+ }
+ 
+-static inline ulong ioapic_phys_id_map(ulong phys_map)
++static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map)
+ {
+ 	/* For clustered we don't have a good way to do this yet - hack */
+-	return (0x0F);
++	return physids_promote(0xFUL);
+ }
+ 
+ #define WAKE_SECONDARY_VIA_INIT
+@@ -132,25 +133,25 @@ static inline int check_phys_apicid_pres
+ 	return (1);
+ }
+ 
+-static inline unsigned int cpu_mask_to_apicid (unsigned long cpumask)
++static inline unsigned int cpu_mask_to_apicid(cpumask_const_t cpumask)
+ {
+ 	int num_bits_set;
+ 	int cpus_found = 0;
+ 	int cpu;
+ 	int apicid;	
+ 
+-	num_bits_set = hweight32(cpumask); 
++	num_bits_set = cpus_weight_const(cpumask);
+ 	/* Return id to all */
+-	if (num_bits_set == 32)
++	if (num_bits_set == NR_CPUS)
+ 		return (int) 0xFF;
+ 	/* 
+ 	 * The cpus in the mask must all be on the apic cluster.  If are not 
+ 	 * on the same apicid cluster return default value of TARGET_CPUS. 
+ 	 */
+-	cpu = ffs(cpumask)-1;
++	cpu = first_cpu_const(cpumask);
+ 	apicid = cpu_to_logical_apicid(cpu);
+ 	while (cpus_found < num_bits_set) {
+-		if (cpumask & (1 << cpu)) {
++		if (cpu_isset_const(cpu, cpumask)) {
+ 			int new_apicid = cpu_to_logical_apicid(cpu);
+ 			if (apicid_cluster(apicid) != 
+ 					apicid_cluster(new_apicid)){
+--- linux-2.6.0-test1/include/asm-i386/mach-bigsmp/mach_ipi.h	2003-06-14 12:18:08.000000000 -0700
++++ 25/include/asm-i386/mach-bigsmp/mach_ipi.h	2003-07-19 17:04:07.000000000 -0700
+@@ -1,18 +1,19 @@
+ #ifndef __ASM_MACH_IPI_H
+ #define __ASM_MACH_IPI_H
+ 
+-inline void send_IPI_mask_sequence(int mask, int vector);
++inline void send_IPI_mask_sequence(cpumask_t mask, int vector);
+ 
+-static inline void send_IPI_mask(int mask, int vector)
++static inline void send_IPI_mask(cpumask_t mask, int vector)
+ {
+ 	send_IPI_mask_sequence(mask, vector);
+ }
+ 
+ static inline void send_IPI_allbutself(int vector)
+ {
+-	unsigned long mask = cpu_online_map & ~(1 << smp_processor_id());
++	cpumask_t mask = cpu_online_map;
++	cpu_clear(smp_processor_id(), mask);
+ 
+-	if (mask)
++	if (!cpus_empty(mask))
+ 		send_IPI_mask(mask, vector);
+ }
+ 
+--- linux-2.6.0-test1/include/asm-i386/mach-default/mach_apic.h	2003-06-16 22:32:21.000000000 -0700
++++ 25/include/asm-i386/mach-default/mach_apic.h	2003-07-19 17:04:07.000000000 -0700
+@@ -5,12 +5,12 @@
+ 
+ #define APIC_DFR_VALUE	(APIC_DFR_FLAT)
+ 
+-static inline unsigned long target_cpus(void)
++static inline cpumask_t target_cpus(void)
+ { 
+ #ifdef CONFIG_SMP
+ 	return cpu_online_map;
+ #else
+-	return 1; 
++	return cpumask_of_cpu(0);
+ #endif
+ } 
+ #define TARGET_CPUS (target_cpus())
+@@ -21,16 +21,20 @@ static inline unsigned long target_cpus(
+ #define INT_DELIVERY_MODE dest_LowestPrio
+ #define INT_DEST_MODE 1     /* logical delivery broadcast to all procs */
+ 
++/*
++ * this isn't really broadcast, just a (potentially inaccurate) upper
++ * bound for valid physical APIC id's
++ */
+ #define APIC_BROADCAST_ID      0x0F
+ 
+-static inline unsigned long check_apicid_used(unsigned long bitmap, int apicid) 
+-{ 
+-	return (bitmap & (1UL << apicid)); 
+-} 
++static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
++{
++	return physid_isset(apicid, bitmap);
++}
+ 
+-static inline unsigned long check_apicid_present(int bit) 
++static inline unsigned long check_apicid_present(int bit)
+ {
+-	return (phys_cpu_present_map & (1UL << bit));
++	return physid_isset(bit, phys_cpu_present_map);
+ }
+ 
+ /*
+@@ -50,7 +54,7 @@ static inline void init_apic_ldr(void)
+ 	apic_write_around(APIC_LDR, val);
+ }
+ 
+-static inline unsigned long ioapic_phys_id_map(unsigned long phys_map)
++static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map)
+ {
+ 	return phys_map;
+ }
+@@ -82,9 +86,9 @@ static inline int cpu_present_to_apicid(
+ 	return  mps_cpu;
+ }
+ 
+-static inline unsigned long apicid_to_cpu_present(int phys_apicid)
++static inline physid_mask_t apicid_to_cpu_present(int phys_apicid)
+ {
+-	return (1ul << phys_apicid);
++	return physid_mask_of_physid(phys_apicid);
+ }
+ 
+ static inline int mpc_apic_id(struct mpc_config_processor *m, 
+@@ -104,18 +108,17 @@ static inline void setup_portio_remap(vo
+ 
+ static inline int check_phys_apicid_present(int boot_cpu_physical_apicid)
+ {
+-	return test_bit(boot_cpu_physical_apicid, &phys_cpu_present_map);
++	return physid_isset(boot_cpu_physical_apicid, phys_cpu_present_map);
+ }
+ 
+ static inline int apic_id_registered(void)
+ {
+-	return (test_bit(GET_APIC_ID(apic_read(APIC_ID)), 
+-						&phys_cpu_present_map));
++	return physid_isset(GET_APIC_ID(apic_read(APIC_ID)), phys_cpu_present_map);
+ }
+ 
+-static inline unsigned int cpu_mask_to_apicid (unsigned long cpumask)
++static inline unsigned int cpu_mask_to_apicid(cpumask_const_t cpumask)
+ {
+-	return cpumask;
++	return cpus_coerce_const(cpumask);
+ }
+ 
+ static inline void enable_apic_mode(void)
+--- linux-2.6.0-test1/include/asm-i386/mach-default/mach_ipi.h	2003-06-14 12:18:33.000000000 -0700
++++ 25/include/asm-i386/mach-default/mach_ipi.h	2003-07-19 17:04:07.000000000 -0700
+@@ -1,10 +1,10 @@
+ #ifndef __ASM_MACH_IPI_H
+ #define __ASM_MACH_IPI_H
+ 
+-inline void send_IPI_mask_bitmask(int mask, int vector);
++inline void send_IPI_mask_bitmask(cpumask_t mask, int vector);
+ inline void __send_IPI_shortcut(unsigned int shortcut, int vector);
+ 
+-static inline void send_IPI_mask(int mask, int vector)
++static inline void send_IPI_mask(cpumask_t mask, int vector)
+ {
+ 	send_IPI_mask_bitmask(mask, vector);
+ }
+--- linux-2.6.0-test1/include/asm-i386/mach-es7000/mach_apic.h	2003-06-16 22:32:21.000000000 -0700
++++ 25/include/asm-i386/mach-es7000/mach_apic.h	2003-07-19 17:04:07.000000000 -0700
+@@ -11,12 +11,12 @@ static inline int apic_id_registered(voi
+ 	        return (1);
+ }
+ 
+-static inline unsigned long target_cpus(void)
++static inline cpumask_t target_cpus(void)
+ { 
+ #if defined CONFIG_ES7000_CLUSTERED_APIC
+-	return (0xff);
++	return CPU_MASK_ALL;
+ #else
+-	return (bios_cpu_apicid[smp_processor_id()]);
++	return cpumask_of_cpu(bios_cpu_apicid[smp_processor_id()]);
+ #endif
+ }
+ #define TARGET_CPUS	(target_cpus())
+@@ -40,13 +40,13 @@ static inline unsigned long target_cpus(
+ 
+ #define APIC_BROADCAST_ID	(0xff)
+ 
+-static inline unsigned long check_apicid_used(unsigned long bitmap, int apicid) 
++static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
+ { 
+ 	return 0;
+ } 
+ static inline unsigned long check_apicid_present(int bit) 
+ {
+-	return (phys_cpu_present_map & (1 << bit));
++	return physid_isset(bit, phys_cpu_present_map);
+ }
+ 
+ #define apicid_cluster(apicid) (apicid & 0xF0)
+@@ -88,7 +88,7 @@ static inline void clustered_apic_check(
+ 	int apic = bios_cpu_apicid[smp_processor_id()];
+ 	printk("Enabling APIC mode:  %s.  Using %d I/O APICs, target cpus %lx\n",
+ 		(apic_version[apic] == 0x14) ? 
+-		"Physical Cluster" : "Logical Cluster", nr_ioapics, TARGET_CPUS);
++		"Physical Cluster" : "Logical Cluster", nr_ioapics, cpus_coerce(TARGET_CPUS));
+ }
+ 
+ static inline int multi_timer_check(int apic, int irq)
+@@ -110,10 +110,13 @@ static inline int cpu_present_to_apicid(
+ 		return (int) bios_cpu_apicid[mps_cpu];
+ }
+ 
+-static inline unsigned long apicid_to_cpu_present(int phys_apicid)
++static inline physid_mask_t apicid_to_cpu_present(int phys_apicid)
+ {
+-	static int cpu = 0;
+-	return (1ul << cpu++);
++	static int id = 0;
++	physid_mask_t mask;
++	mask = physid_mask_of_physid(id);
++	++id;
++	return mask;
+ }
+ 
+ extern volatile u8 cpu_2_logical_apicid[];
+@@ -123,7 +126,7 @@ static inline int cpu_to_logical_apicid(
+        return (int)cpu_2_logical_apicid[cpu];
+ }
+ 
+-static inline int mpc_apic_id(struct mpc_config_processor *m, int quad)
++static inline int mpc_apic_id(struct mpc_config_processor *m, struct mpc_config_translation *unused)
+ {
+ 	printk("Processor #%d %ld:%ld APIC version %d\n",
+ 	        m->mpc_apicid,
+@@ -133,10 +136,10 @@ static inline int mpc_apic_id(struct mpc
+ 	return (m->mpc_apicid);
+ }
+ 
+-static inline ulong ioapic_phys_id_map(ulong phys_map)
++static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map)
+ {
+ 	/* For clustered we don't have a good way to do this yet - hack */
+-	return (0xff);
++	return physids_promote(0xff);
+ }
+ 
+ 
+@@ -151,32 +154,30 @@ static inline int check_phys_apicid_pres
+ 	return (1);
+ }
+ 
+-static inline unsigned int cpu_mask_to_apicid (unsigned long cpumask)
++static inline unsigned int cpu_mask_to_apicid(cpumask_const_t cpumask)
+ {
+ 	int num_bits_set;
+ 	int cpus_found = 0;
+ 	int cpu;
+ 	int apicid;	
+ 
+-	if (cpumask == TARGET_CPUS)
+-		return cpumask;
+-	num_bits_set = hweight32(cpumask); 
++	num_bits_set = cpus_weight_const(cpumask);
+ 	/* Return id to all */
+-	if (num_bits_set == 32)
+-		return TARGET_CPUS;
++	if (num_bits_set == NR_CPUS)
++		return 0xFF;
+ 	/* 
+ 	 * The cpus in the mask must all be on the apic cluster.  If are not 
+ 	 * on the same apicid cluster return default value of TARGET_CPUS. 
+ 	 */
+-	cpu = ffs(cpumask)-1;
++	cpu = first_cpu_const(cpumask);
+ 	apicid = cpu_to_logical_apicid(cpu);
+ 	while (cpus_found < num_bits_set) {
+-		if (cpumask & (1 << cpu)) {
++		if (cpu_isset_const(cpu, cpumask)) {
+ 			int new_apicid = cpu_to_logical_apicid(cpu);
+ 			if (apicid_cluster(apicid) != 
+ 					apicid_cluster(new_apicid)){
+ 				printk ("%s: Not a valid mask!\n",__FUNCTION__);
+-				return TARGET_CPUS;
++				return 0xFF;
+ 			}
+ 			apicid = new_apicid;
+ 			cpus_found++;
+--- linux-2.6.0-test1/include/asm-i386/mach-es7000/mach_ipi.h	2003-06-16 22:32:21.000000000 -0700
++++ 25/include/asm-i386/mach-es7000/mach_ipi.h	2003-07-19 17:04:07.000000000 -0700
+@@ -1,18 +1,19 @@
+ #ifndef __ASM_MACH_IPI_H
+ #define __ASM_MACH_IPI_H
+ 
+-static inline void send_IPI_mask_sequence(int mask, int vector);
++static inline void send_IPI_mask_sequence(cpumask_t mask, int vector);
+ 
+-static inline void send_IPI_mask(int mask, int vector)
++static inline void send_IPI_mask(cpumask_t mask, int vector)
+ {
+ 	send_IPI_mask_sequence(mask, vector);
+ }
+ 
+ static inline void send_IPI_allbutself(int vector)
+ {
+-	unsigned long mask = cpu_online_map & ~(1 << smp_processor_id());
+-
+-	if (mask)
++	cpumask_t mask = cpumask_of_cpu(smp_processor_id());
++	cpus_complement(mask);
++	cpus_and(mask, mask, cpu_online_map);
++	if (!cpus_empty(mask))
+ 		send_IPI_mask(mask, vector);
+ }
+ 
+--- linux-2.6.0-test1/include/asm-i386/mach-numaq/mach_apic.h	2003-06-16 22:32:21.000000000 -0700
++++ 25/include/asm-i386/mach-numaq/mach_apic.h	2003-07-19 17:04:07.000000000 -0700
+@@ -6,7 +6,13 @@
+ 
+ #define APIC_DFR_VALUE	(APIC_DFR_CLUSTER)
+ 
+-#define TARGET_CPUS (~0UL)
++static inline cpumask_t target_cpus(void)
++{
++	cpumask_t tmp = CPU_MASK_ALL;
++	return tmp;
++}
++
++#define TARGET_CPUS (target_cpus())
+ 
+ #define NO_BALANCE_IRQ (1)
+ #define esr_disable (1)
+@@ -15,13 +21,13 @@
+ #define INT_DEST_MODE 0     /* physical delivery on LOCAL quad */
+  
+ #define APIC_BROADCAST_ID      0x0F
+-#define check_apicid_used(bitmap, apicid) ((bitmap) & (1 << (apicid)))
+-#define check_apicid_present(bit) (phys_cpu_present_map & (1 << bit))
++#define check_apicid_used(bitmap, apicid) physid_isset(apicid, bitmap)
++#define check_apicid_present(bit) physid_isset(bit, phys_cpu_present_map)
+ #define apicid_cluster(apicid) (apicid & 0xF0)
+ 
+ static inline int apic_id_registered(void)
+ {
+-	return (1);
++	return 1;
+ }
+ 
+ static inline void init_apic_ldr(void)
+@@ -41,13 +47,13 @@ static inline void clustered_apic_check(
+  */
+ static inline int multi_timer_check(int apic, int irq)
+ {
+-	return (apic != 0 && irq == 0);
++	return apic != 0 && irq == 0;
+ }
+ 
+-static inline ulong ioapic_phys_id_map(ulong phys_map)
++static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map)
+ {
+ 	/* We don't have a good way to do this yet - hack */
+-	return 0xf;
++	return physids_promote(0xFUL);
+ }
+ 
+ /* Mapping from cpu number to logical apicid */
+@@ -59,22 +65,25 @@ static inline int cpu_to_logical_apicid(
+ 
+ static inline int cpu_present_to_apicid(int mps_cpu)
+ {
+-	return ( ((mps_cpu/4)*16) + (1<<(mps_cpu%4)) );
++	return ((mps_cpu >> 2) << 4) | (1 << (mps_cpu & 0x3));
+ }
+ 
+ static inline int generate_logical_apicid(int quad, int phys_apicid)
+ {
+-	return ( (quad << 4) + (phys_apicid ? phys_apicid << 1 : 1) );
++	return (quad << 4) + (phys_apicid ? phys_apicid << 1 : 1);
+ }
+ 
+ static inline int apicid_to_node(int logical_apicid) 
+ {
+-	return (logical_apicid >> 4);
++	return logical_apicid >> 4;
+ }
+ 
+-static inline unsigned long apicid_to_cpu_present(int logical_apicid)
++static inline physid_mask_t apicid_to_cpu_present(int logical_apicid)
+ {
+-	return ( (logical_apicid&0xf) << (4*apicid_to_node(logical_apicid)) );
++	int node = apicid_to_node(logical_apicid);
++	int cpu = __ffs(logical_apicid & 0xf);
++
++	return physid_mask_of_physid(cpu + 4*node);
+ }
+ 
+ static inline int mpc_apic_id(struct mpc_config_processor *m, 
+@@ -115,7 +124,7 @@ static inline void enable_apic_mode(void
+  * We use physical apicids here, not logical, so just return the default
+  * physical broadcast to stop people from breaking us
+  */
+-static inline unsigned int cpu_mask_to_apicid (unsigned long cpumask)
++static inline unsigned int cpu_mask_to_apicid(cpumask_const_t cpumask)
+ {
+ 	return (int) 0xF;
+ }
+--- linux-2.6.0-test1/include/asm-i386/mach-numaq/mach_ipi.h	2003-06-14 12:18:29.000000000 -0700
++++ 25/include/asm-i386/mach-numaq/mach_ipi.h	2003-07-19 17:04:07.000000000 -0700
+@@ -1,18 +1,19 @@
+ #ifndef __ASM_MACH_IPI_H
+ #define __ASM_MACH_IPI_H
+ 
+-static inline void send_IPI_mask_sequence(int mask, int vector);
++static inline void send_IPI_mask_sequence(cpumask_t, int vector);
+ 
+-static inline void send_IPI_mask(int mask, int vector)
++static inline void send_IPI_mask(cpumask_t mask, int vector)
+ {
+ 	send_IPI_mask_sequence(mask, vector);
+ }
+ 
+ static inline void send_IPI_allbutself(int vector)
+ {
+-	unsigned long mask = cpu_online_map & ~(1 << smp_processor_id());
++	cpumask_t mask = cpu_online_map;
++	cpu_clear(smp_processor_id(), mask);
+ 
+-	if (mask)
++	if (!cpus_empty(mask))
+ 		send_IPI_mask(mask, vector);
+ }
+ 
+--- linux-2.6.0-test1/include/asm-i386/mach-summit/mach_apic.h	2003-06-16 22:32:21.000000000 -0700
++++ 25/include/asm-i386/mach-summit/mach_apic.h	2003-07-19 17:04:07.000000000 -0700
+@@ -18,17 +18,18 @@ static inline unsigned long xapic_phys_t
+ 
+ #define APIC_DFR_VALUE	(APIC_DFR_CLUSTER)
+ 
+-static inline unsigned long target_cpus(void)
++static inline cpumask_t target_cpus(void)
+ {
+-	return (~0UL);
++	cpumask_t tmp = CPU_MASK_ALL;
++	return tmp;
+ } 
+ #define TARGET_CPUS	(target_cpus())
+ 
+ #define INT_DELIVERY_MODE (dest_Fixed)
+ #define INT_DEST_MODE 1     /* logical delivery broadcast to all procs */
+ 
+-#define APIC_BROADCAST_ID     (0x0F)
+-static inline unsigned long check_apicid_used(unsigned long bitmap, int apicid) 
++#define APIC_BROADCAST_ID     (0xFF)
++static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
+ {
+ 	return 0;
+ } 
+@@ -72,7 +73,7 @@ static inline void clustered_apic_check(
+ 
+ static inline int apicid_to_node(int logical_apicid)
+ {
+-	return (logical_apicid >> 5);          /* 2 clusterids per CEC */
++	return logical_apicid >> 5;          /* 2 clusterids per CEC */
+ }
+ 
+ /* Mapping from cpu number to logical apicid */
+@@ -87,15 +88,15 @@ static inline int cpu_present_to_apicid(
+ 	return (int) bios_cpu_apicid[mps_cpu];
+ }
+ 
+-static inline ulong ioapic_phys_id_map(ulong phys_map)
++static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_id_map)
+ {
+ 	/* For clustered we don't have a good way to do this yet - hack */
+-	return 0x0F;
++	return physids_promote(0x0F);
+ }
+ 
+-static inline unsigned long apicid_to_cpu_present(int apicid)
++static inline physid_mask_t apicid_to_cpu_present(int apicid)
+ {
+-	return 1;
++	return physid_mask_of_physid(0);
+ }
+ 
+ static inline int mpc_apic_id(struct mpc_config_processor *m, 
+@@ -122,25 +123,25 @@ static inline void enable_apic_mode(void
+ {
+ }
+ 
+-static inline unsigned int cpu_mask_to_apicid (unsigned long cpumask)
++static inline unsigned int cpu_mask_to_apicid(cpumask_const_t cpumask)
+ {
+ 	int num_bits_set;
+ 	int cpus_found = 0;
+ 	int cpu;
+ 	int apicid;	
+ 
+-	num_bits_set = hweight32(cpumask); 
++	num_bits_set = cpus_weight_const(cpumask);
+ 	/* Return id to all */
+-	if (num_bits_set == 32)
++	if (num_bits_set == NR_CPUS)
+ 		return (int) 0xFF;
+ 	/* 
+ 	 * The cpus in the mask must all be on the apic cluster.  If are not 
+ 	 * on the same apicid cluster return default value of TARGET_CPUS. 
+ 	 */
+-	cpu = ffs(cpumask)-1;
++	cpu = first_cpu_const(cpumask);
+ 	apicid = cpu_to_logical_apicid(cpu);
+ 	while (cpus_found < num_bits_set) {
+-		if (cpumask & (1 << cpu)) {
++		if (cpu_isset_const(cpu, cpumask)) {
+ 			int new_apicid = cpu_to_logical_apicid(cpu);
+ 			if (apicid_cluster(apicid) != 
+ 					apicid_cluster(new_apicid)){
+--- linux-2.6.0-test1/include/asm-i386/mach-summit/mach_ipi.h	2003-06-14 12:17:59.000000000 -0700
++++ 25/include/asm-i386/mach-summit/mach_ipi.h	2003-07-19 17:04:07.000000000 -0700
+@@ -1,18 +1,19 @@
+ #ifndef __ASM_MACH_IPI_H
+ #define __ASM_MACH_IPI_H
+ 
+-inline void send_IPI_mask_sequence(int mask, int vector);
++inline void send_IPI_mask_sequence(cpumask_t mask, int vector);
+ 
+-static inline void send_IPI_mask(int mask, int vector)
++static inline void send_IPI_mask(cpumask_t mask, int vector)
+ {
+ 	send_IPI_mask_sequence(mask, vector);
+ }
+ 
+ static inline void send_IPI_allbutself(int vector)
+ {
+-	unsigned long mask = cpu_online_map & ~(1 << smp_processor_id());
++	cpumask_t mask = cpu_online_map;
++	cpu_clear(smp_processor_id(), mask);
+ 
+-	if (mask)
++	if (!cpus_empty(mask))
+ 		send_IPI_mask(mask, vector);
+ }
+ 
+--- linux-2.6.0-test1/include/asm-i386/mach-visws/mach_apic.h	2003-06-16 22:32:21.000000000 -0700
++++ 25/include/asm-i386/mach-visws/mach_apic.h	2003-07-19 17:04:07.000000000 -0700
+@@ -12,17 +12,16 @@
+ #ifdef CONFIG_SMP
+  #define TARGET_CPUS cpu_online_map
+ #else
+- #define TARGET_CPUS 0x01
++ #define TARGET_CPUS cpumask_of_cpu(0)
+ #endif
+ 
+ #define APIC_BROADCAST_ID      0x0F
+-#define check_apicid_used(bitmap, apicid) (bitmap & (1 << apicid))
+-#define check_apicid_present(bit) (phys_cpu_present_map & (1 << bit))
++#define check_apicid_used(bitmap, apicid)	physid_isset(apicid, bitmap)
++#define check_apicid_present(bit)		physid_isset(bit, phys_cpu_present_map)
+ 
+ static inline int apic_id_registered(void)
+ {
+-	return (test_bit(GET_APIC_ID(apic_read(APIC_ID)), 
+-						&phys_cpu_present_map));
++	return physid_isset(GET_APIC_ID(apic_read(APIC_ID)), phys_cpu_present_map);
+ }
+ 
+ /*
+@@ -61,9 +60,9 @@ static inline int cpu_present_to_apicid(
+ 	return mps_cpu;
+ }
+ 
+-static inline unsigned long apicid_to_cpu_present(int apicid)
++static inline physid_mask_t apicid_to_cpu_present(int apicid)
+ {
+-	return (1ul << apicid);
++	return physid_mask_of_physid(apicid);
+ }
+ 
+ #define WAKE_SECONDARY_VIA_INIT
+@@ -78,11 +77,11 @@ static inline void enable_apic_mode(void
+ 
+ static inline int check_phys_apicid_present(int boot_cpu_physical_apicid)
+ {
+-	return test_bit(boot_cpu_physical_apicid, &phys_cpu_present_map);
++	return physid_isset(boot_cpu_physical_apicid, phys_cpu_present_map);
+ }
+ 
+-static inline unsigned int cpu_mask_to_apicid (unsigned long cpumask)
++static inline unsigned int cpu_mask_to_apicid(cpumask_const_t cpumask)
+ {
+-	return cpumask;
++	return cpus_coerce_const(cpumask);
+ }
+ #endif /* __ASM_MACH_APIC_H */
+--- linux-2.6.0-test1/include/asm-i386/mmu_context.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-i386/mmu_context.h	2003-07-19 17:04:07.000000000 -0700
+@@ -31,12 +31,12 @@ static inline void switch_mm(struct mm_s
+ 
+ 	if (likely(prev != next)) {
+ 		/* stop flush ipis for the previous mm */
+-		clear_bit(cpu, &prev->cpu_vm_mask);
++		cpu_clear(cpu, prev->cpu_vm_mask);
+ #ifdef CONFIG_SMP
+ 		cpu_tlbstate[cpu].state = TLBSTATE_OK;
+ 		cpu_tlbstate[cpu].active_mm = next;
+ #endif
+-		set_bit(cpu, &next->cpu_vm_mask);
++		cpu_set(cpu, next->cpu_vm_mask);
+ 
+ 		/* Re-load page tables */
+ 		load_cr3(next->pgd);
+@@ -52,7 +52,7 @@ static inline void switch_mm(struct mm_s
+ 		cpu_tlbstate[cpu].state = TLBSTATE_OK;
+ 		BUG_ON(cpu_tlbstate[cpu].active_mm != next);
+ 
+-		if (!test_and_set_bit(cpu, &next->cpu_vm_mask)) {
++		if (!cpu_test_and_set(cpu, next->cpu_vm_mask)) {
+ 			/* We were in lazy tlb mode and leave_mm disabled 
+ 			 * tlb flush IPI delivery. We must reload %cr3.
+ 			 */
+--- linux-2.6.0-test1/include/asm-i386/mpspec.h	2003-06-16 22:32:21.000000000 -0700
++++ 25/include/asm-i386/mpspec.h	2003-07-19 17:04:07.000000000 -0700
+@@ -1,6 +1,7 @@
+ #ifndef __ASM_MPSPEC_H
+ #define __ASM_MPSPEC_H
+ 
++#include <linux/cpumask.h>
+ #include <asm/mpspec_def.h>
+ #include <mach_mpspec.h>
+ 
+@@ -11,7 +12,6 @@ extern int quad_local_to_mp_bus_id [NR_C
+ extern int mp_bus_id_to_pci_bus [MAX_MP_BUSSES];
+ 
+ extern unsigned int boot_cpu_physical_apicid;
+-extern unsigned long phys_cpu_present_map;
+ extern int smp_found_config;
+ extern void find_smp_config (void);
+ extern void get_smp_config (void);
+@@ -41,5 +41,49 @@ extern void mp_config_ioapic_for_sci(int
+ extern void mp_parse_prt (void);
+ #endif /*CONFIG_ACPI_BOOT*/
+ 
++#define PHYSID_ARRAY_SIZE	BITS_TO_LONGS(MAX_APICS)
++
++struct physid_mask
++{
++	unsigned long mask[PHYSID_ARRAY_SIZE];
++};
++
++typedef struct physid_mask physid_mask_t;
++
++#define physid_set(physid, map)			set_bit(physid, (map).mask)
++#define physid_clear(physid, map)		clear_bit(physid, (map).mask)
++#define physid_isset(physid, map)		test_bit(physid, (map).mask)
++#define physid_test_and_set(physid, map)	test_and_set_bit(physid, (map).mask)
++
++#define physids_and(dst, src1, src2)		bitmap_and((dst).mask, (src1).mask, (src2).mask, MAX_APICS)
++#define physids_or(dst, src1, src2)		bitmap_or((dst).mask, (src1).mask, (src2).mask, MAX_APICS)
++#define physids_clear(map)			bitmap_clear((map).mask, MAX_APICS)
++#define physids_complement(map)			bitmap_complement((map).mask, MAX_APICS)
++#define physids_empty(map)			bitmap_empty((map).mask, MAX_APICS)
++#define physids_equal(map1, map2)		bitmap_equal((map1).mask, (map2).mask, MAX_APICS)
++#define physids_weight(map)			bitmap_weight((map).mask, MAX_APICS)
++#define physids_shift_right(d, s, n)		bitmap_shift_right((d).mask, (s).mask, n, MAX_APICS)
++#define physids_shift_left(d, s, n)		bitmap_shift_left((d).mask, (s).mask, n, MAX_APICS)
++#define physids_coerce(map)			((map).mask[0])
++
++#define physids_promote(physids)						\
++	({									\
++		physid_mask_t __physid_mask = PHYSID_MASK_NONE;			\
++		__physid_mask.mask[0] = physids;				\
++		__physid_mask;							\
++	})
++
++#define physid_mask_of_physid(physid)						\
++	({									\
++		physid_mask_t __physid_mask = PHYSID_MASK_NONE;			\
++		physid_set(physid, __physid_mask);				\
++		__physid_mask;							\
++	})
++
++#define PHYSID_MASK_ALL		{ {[0 ... PHYSID_ARRAY_SIZE-1] = ~0UL} }
++#define PHYSID_MASK_NONE	{ {[0 ... PHYSID_ARRAY_SIZE-1] = 0UL} }
++
++extern physid_mask_t phys_cpu_present_map;
++
+ #endif
+ 
+--- linux-2.6.0-test1/include/asm-i386/numaq.h	2003-06-14 12:18:22.000000000 -0700
++++ 25/include/asm-i386/numaq.h	2003-07-19 17:04:07.000000000 -0700
+@@ -28,7 +28,7 @@
+ 
+ #ifdef CONFIG_X86_NUMAQ
+ 
+-#define MAX_NUMNODES		8
++#define MAX_NUMNODES		16
+ extern void get_memcfg_numaq(void);
+ #define get_memcfg_numa() get_memcfg_numaq()
+ 
+@@ -159,7 +159,7 @@ struct sys_cfg_data {
+ 
+ static inline unsigned long *get_zholes_size(int nid)
+ {
+-	return 0;
++	return NULL;
+ }
+ #endif /* CONFIG_X86_NUMAQ */
+ #endif /* NUMAQ_H */
+--- linux-2.6.0-test1/include/asm-i386/pgalloc.h	2003-06-14 12:17:57.000000000 -0700
++++ 25/include/asm-i386/pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -45,7 +45,8 @@ static inline void pte_free(struct page 
+  * (In the PAE case we free the pmds as part of the pgd.)
+  */
+ 
+-#define pmd_alloc_one(mm, addr)		({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm, addr)		({ BUG(); ((struct page *)2); })
++#define pmd_alloc_one_kernel(mm, addr)	({ 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()
+--- linux-2.6.0-test1/include/asm-i386/pgtable-2level.h	2003-06-14 12:18:22.000000000 -0700
++++ 25/include/asm-i386/pgtable-2level.h	2003-07-19 17:07:16.000000000 -0700
+@@ -48,13 +48,15 @@ static inline int pgd_present(pgd_t pgd)
+ #define set_pmd(pmdptr, pmdval) (*(pmdptr) = pmdval)
+ #define set_pgd(pgdptr, pgdval) (*(pgdptr) = pgdval)
+ 
+-#define pgd_page(pgd) \
+-((unsigned long) __va(pgd_val(pgd) & PAGE_MASK))
++#define pgd_page(pgd)		pfn_to_page(pgd_val(pgd) >> PAGE_SHIFT)
++
++#define pmd_offset_map(pgd, addr)		({ (pmd_t *)(pgd); })
++#define pmd_offset_map_nested(pgd, addr)	pmd_offset_map(pgd, addr)
++#define pmd_offset_kernel(pgd, addr)		pmd_offset_map(pgd, addr)
++
++#define pmd_unmap(pmd)				do { } while (0)
++#define pmd_unmap_nested(pmd)			do { } while (0)
+ 
+-static inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address)
+-{
+-	return (pmd_t *) dir;
+-}
+ #define ptep_get_and_clear(xp)	__pte(xchg(&(xp)->pte_low, 0))
+ #define pte_same(a, b)		((a).pte_low == (b).pte_low)
+ #define pte_page(x)		pfn_to_page(pte_pfn(x))
+--- linux-2.6.0-test1/include/asm-i386/pgtable-3level.h	2003-06-26 22:07:25.000000000 -0700
++++ 25/include/asm-i386/pgtable-3level.h	2003-07-19 17:07:16.000000000 -0700
+@@ -64,12 +64,32 @@ static inline void set_pte(pte_t *ptep, 
+  */
+ static inline void pgd_clear (pgd_t * pgd) { }
+ 
+-#define pgd_page(pgd) \
+-((unsigned long) __va(pgd_val(pgd) & PAGE_MASK))
++static inline unsigned long pgd_pfn(pgd_t pgd)
++{
++	return pgd_val(pgd) >> PAGE_SHIFT;
++}
++
++#define pgd_page(pgd)		pfn_to_page(pgd_pfn(pgd))
++
++#define pmd_offset_kernel(pgd, addr)					\
++	((pmd_t *)__va(pgd_val(*(pgd)) & PAGE_MASK) + pmd_index(addr))
+ 
+ /* Find an entry in the second-level page table.. */
+-#define pmd_offset(dir, address) ((pmd_t *) pgd_page(*(dir)) + \
+-			pmd_index(address))
++#ifdef CONFIG_HIGHPMD
++#define __pmd_offset(pgd, addr, type)					\
++	((pmd_t *)kmap_atomic(pgd_page(*(pgd)), type) + pmd_index(addr))
++#define __pmd_unmap(pmd, type)		kunmap_atomic(pmd, type)
++#else
++#define __pmd_offset(pgd, addr, type)					\
++	((pmd_t *)__va(pgd_val(*(pgd)) & PAGE_MASK) + pmd_index(addr))
++#define __pmd_unmap(pmd, type)		do { } while (0)
++#endif
++
++#define pmd_offset_map(pgd, addr)		__pmd_offset(pgd, addr, KM_PMD0)
++#define pmd_offset_map_nested(pgd, addr)	__pmd_offset(pgd, addr, KM_PMD1)
++
++#define pmd_unmap(pmd)				__pmd_unmap(pmd, KM_PMD0);
++#define pmd_unmap_nested(pmd)			__pmd_unmap(pmd, KM_PMD1);
+ 
+ static inline pte_t ptep_get_and_clear(pte_t *ptep)
+ {
+@@ -123,6 +143,4 @@ static inline pmd_t pfn_pmd(unsigned lon
+ #define pgoff_to_pte(off) ((pte_t) { _PAGE_FILE, (off) })
+ #define PTE_FILE_MAX_BITS       32
+ 
+-extern struct kmem_cache_s *pae_pgd_cachep;
+-
+ #endif /* _I386_PGTABLE_3LEVEL_H */
+--- linux-2.6.0-test1/include/asm-i386/pgtable.h	2003-06-26 22:07:25.000000000 -0700
++++ 25/include/asm-i386/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -21,15 +21,25 @@
+ #include <asm/bitops.h>
+ #endif
+ 
+-extern pgd_t swapper_pg_dir[1024];
+-extern void paging_init(void);
++#include <linux/slab.h>
++#include <linux/list.h>
++#include <linux/spinlock.h>
+ 
+ /*
+  * ZERO_PAGE is a global shared page that is always zero: used
+  * for zero-mapped memory areas etc..
+  */
+-extern unsigned long empty_zero_page[1024];
+ #define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
++extern unsigned long empty_zero_page[1024];
++extern pgd_t swapper_pg_dir[1024];
++extern kmem_cache_t *pgd_cache;
++extern spinlock_t pgd_lock;
++extern struct list_head pgd_list;
++
++void pgd_ctor(void *, kmem_cache_t *, unsigned long);
++void pgd_dtor(void *, kmem_cache_t *, unsigned long);
++void pgtable_cache_init(void);
++void paging_init(void);
+ 
+ #endif /* !__ASSEMBLY__ */
+ 
+@@ -41,20 +51,8 @@ extern unsigned long empty_zero_page[102
+ #ifndef __ASSEMBLY__
+ #ifdef CONFIG_X86_PAE
+ # include <asm/pgtable-3level.h>
+-
+-/*
+- * Need to initialise the X86 PAE caches
+- */
+-extern void pgtable_cache_init(void);
+-
+ #else
+ # include <asm/pgtable-2level.h>
+-
+-/*
+- * No page table caches to initialise
+- */
+-#define pgtable_cache_init()	do { } while (0)
+-
+ #endif
+ #endif
+ 
+--- linux-2.6.0-test1/include/asm-i386/posix_types.h	2003-06-26 22:07:25.000000000 -0700
++++ 25/include/asm-i386/posix_types.h	2003-07-19 17:06:39.000000000 -0700
+@@ -7,7 +7,9 @@
+  * assume GCC is being used.
+  */
+ 
+-typedef unsigned short	__kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long	__kernel_dev_t;
++#endif
+ typedef unsigned long	__kernel_ino_t;
+ typedef unsigned short	__kernel_mode_t;
+ typedef unsigned short	__kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-i386/rwlock.h	2003-06-26 22:07:25.000000000 -0700
++++ 25/include/asm-i386/rwlock.h	2003-07-19 17:04:49.000000000 -0700
+@@ -20,28 +20,52 @@
+ #define RW_LOCK_BIAS		 0x01000000
+ #define RW_LOCK_BIAS_STR	"0x01000000"
+ 
+-#define __build_read_lock_ptr(rw, helper)   \
+-	asm volatile(LOCK "subl $1,(%0)\n\t" \
+-		     "js 2f\n" \
+-		     "1:\n" \
+-		     LOCK_SECTION_START("") \
+-		     "2:\tcall " helper "\n\t" \
+-		     "jmp 1b\n" \
+-		     LOCK_SECTION_END \
+-		     ::"a" (rw) : "memory")
+-
+-#define __build_read_lock_const(rw, helper)   \
+-	asm volatile(LOCK "subl $1,%0\n\t" \
+-		     "js 2f\n" \
+-		     "1:\n" \
+-		     LOCK_SECTION_START("") \
+-		     "2:\tpushl %%eax\n\t" \
+-		     "leal %0,%%eax\n\t" \
+-		     "call " helper "\n\t" \
+-		     "popl %%eax\n\t" \
+-		     "jmp 1b\n" \
+-		     LOCK_SECTION_END \
+-		     :"=m" (*(volatile int *)rw) : : "memory")
++#ifdef CONFIG_SPINLINE
++
++	#define __build_read_lock_ptr(rw, helper)   \
++		asm volatile(LOCK "subl $1,(%0)\n\t" \
++			     "jns 1f\n\t" \
++			     "call " helper "\n\t" \
++			     "1:\t" \
++			     ::"a" (rw) : "memory")
++
++	#define __build_read_lock_const(rw, helper)   \
++		asm volatile(LOCK "subl $1,%0\n\t" \
++			     "jns 1f\n\t" \
++			     "pushl %%eax\n\t" \
++			     "leal %0,%%eax\n\t" \
++			     "call " helper "\n\t" \
++			     "popl %%eax\n\t" \
++			     "1:\t" \
++			     :"=m" (*(volatile int *)rw) : : "memory")
++
++#else /* !CONFIG_SPINLINE */
++
++	#define __build_read_lock_ptr(rw, helper)   \
++		asm volatile(LOCK "subl $1,(%0)\n\t" \
++			     "js 2f\n" \
++			     "1:\n" \
++			     LOCK_SECTION_START("") \
++			     "2:\tcall " helper "\n\t" \
++			     "jmp 1b\n" \
++			     LOCK_SECTION_END \
++			     ::"a" (rw) : "memory")
++
++	#define __build_read_lock_const(rw, helper)   \
++		asm volatile(LOCK "subl $1,%0\n\t" \
++			     "js 2f\n" \
++			     "1:\n" \
++			     LOCK_SECTION_START("") \
++			     "2:\tpushl %%eax\n\t" \
++			     "leal %0,%%eax\n\t" \
++			     "call " helper "\n\t" \
++			     "popl %%eax\n\t" \
++			     "jmp 1b\n" \
++			     LOCK_SECTION_END \
++			     :"=m" (*(volatile int *)rw) : : "memory")
++
++#endif /* CONFIG_SPINLINE */
++
+ 
+ #define __build_read_lock(rw, helper)	do { \
+ 						if (__builtin_constant_p(rw)) \
+@@ -50,28 +74,51 @@
+ 							__build_read_lock_ptr(rw, helper); \
+ 					} while (0)
+ 
+-#define __build_write_lock_ptr(rw, helper) \
+-	asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \
+-		     "jnz 2f\n" \
+-		     "1:\n" \
+-		     LOCK_SECTION_START("") \
+-		     "2:\tcall " helper "\n\t" \
+-		     "jmp 1b\n" \
+-		     LOCK_SECTION_END \
+-		     ::"a" (rw) : "memory")
+-
+-#define __build_write_lock_const(rw, helper) \
+-	asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",%0\n\t" \
+-		     "jnz 2f\n" \
+-		     "1:\n" \
+-		     LOCK_SECTION_START("") \
+-		     "2:\tpushl %%eax\n\t" \
+-		     "leal %0,%%eax\n\t" \
+-		     "call " helper "\n\t" \
+-		     "popl %%eax\n\t" \
+-		     "jmp 1b\n" \
+-		     LOCK_SECTION_END \
+-		     :"=m" (*(volatile int *)rw) : : "memory")
++#ifdef CONFIG_SPINLINE
++
++	#define __build_write_lock_ptr(rw, helper) \
++		asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \
++			     "jz 1f\n\t" \
++			     "call " helper "\n\t" \
++			     "1:\n" \
++			     ::"a" (rw) : "memory")
++
++	#define __build_write_lock_const(rw, helper) \
++		asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",%0\n\t" \
++			     "jz 1f\n\t" \
++			     "pushl %%eax\n\t" \
++			     "leal %0,%%eax\n\t" \
++			     "call " helper "\n\t" \
++			     "popl %%eax\n\t" \
++			     "1:\n" \
++			     :"=m" (*(volatile int *)rw) : : "memory")
++
++#else /* !CONFIG_SPINLINE */
++
++	#define __build_write_lock_ptr(rw, helper) \
++		asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \
++			     "jnz 2f\n" \
++			     "1:\n" \
++			     LOCK_SECTION_START("") \
++			     "2:\tcall " helper "\n\t" \
++			     "jmp 1b\n" \
++			     LOCK_SECTION_END \
++			     ::"a" (rw) : "memory")
++
++	#define __build_write_lock_const(rw, helper) \
++		asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",%0\n\t" \
++			     "jnz 2f\n" \
++			     "1:\n" \
++			     LOCK_SECTION_START("") \
++			     "2:\tpushl %%eax\n\t" \
++			     "leal %0,%%eax\n\t" \
++			     "call " helper "\n\t" \
++			     "popl %%eax\n\t" \
++			     "jmp 1b\n" \
++			     LOCK_SECTION_END \
++			     :"=m" (*(volatile int *)rw) : : "memory")
++
++#endif /* CONFIG_SPINLINE */
+ 
+ #define __build_write_lock(rw, helper)	do { \
+ 						if (__builtin_constant_p(rw)) \
+--- linux-2.6.0-test1/include/asm-i386/smp.h	2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-i386/smp.h	2003-07-19 17:04:07.000000000 -0700
+@@ -8,6 +8,7 @@
+ #include <linux/config.h>
+ #include <linux/kernel.h>
+ #include <linux/threads.h>
++#include <linux/cpumask.h>
+ #endif
+ 
+ #ifdef CONFIG_X86_LOCAL_APIC
+@@ -31,9 +32,7 @@
+  */
+  
+ extern void smp_alloc_memory(void);
+-extern unsigned long phys_cpu_present_map;
+-extern unsigned long cpu_online_map;
+-extern volatile unsigned long smp_invalidate_needed;
++extern physid_mask_t phys_cpu_present_map;
+ extern int pic_mode;
+ extern int smp_num_siblings;
+ extern int cpu_sibling_map[];
+@@ -54,37 +53,19 @@ extern void zap_low_mappings (void);
+  */
+ #define smp_processor_id() (current_thread_info()->cpu)
+ 
+-extern volatile unsigned long cpu_callout_map;
++extern cpumask_t cpu_callout_map;
+ 
+-#define cpu_possible(cpu) (cpu_callout_map & (1<<(cpu)))
+-#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
+-
+-#define for_each_cpu(cpu, mask) \
+-	for(mask = cpu_online_map; \
+-	    cpu = __ffs(mask), mask != 0; \
+-	    mask &= ~(1<<cpu))
+-
+-extern inline unsigned int num_online_cpus(void)
+-{
+-	return hweight32(cpu_online_map);
+-}
++#define cpu_possible(cpu) cpu_isset(cpu, cpu_callout_map)
+ 
+ /* We don't mark CPUs online until __cpu_up(), so we need another measure */
+ static inline int num_booting_cpus(void)
+ {
+-	return hweight32(cpu_callout_map);
++	return cpus_weight(cpu_callout_map);
+ }
+ 
+ extern void map_cpu_to_logical_apicid(void);
+ extern void unmap_cpu_to_logical_apicid(int cpu);
+ 
+-extern inline unsigned int any_online_cpu(unsigned int mask)
+-{
+-	if (mask & cpu_online_map)
+-		return __ffs(mask & cpu_online_map);
+-
+-	return NR_CPUS;
+-}
+ #ifdef CONFIG_X86_LOCAL_APIC
+ 
+ #ifdef APIC_DEFINITION
+--- linux-2.6.0-test1/include/asm-i386/spinlock.h	2003-06-26 22:07:25.000000000 -0700
++++ 25/include/asm-i386/spinlock.h	2003-07-19 17:06:40.000000000 -0700
+@@ -43,18 +43,35 @@ typedef struct {
+ #define spin_is_locked(x)	(*(volatile signed char *)(&(x)->lock) <= 0)
+ #define spin_unlock_wait(x)	do { barrier(); } while(spin_is_locked(x))
+ 
+-#define spin_lock_string \
+-	"\n1:\t" \
+-	"lock ; decb %0\n\t" \
+-	"js 2f\n" \
+-	LOCK_SECTION_START("") \
+-	"2:\t" \
+-	"rep;nop\n\t" \
+-	"cmpb $0,%0\n\t" \
+-	"jle 2b\n\t" \
+-	"jmp 1b\n" \
+-	LOCK_SECTION_END
++#ifdef CONFIG_SPINLINE
+ 
++	#define spin_lock_string \
++		"\n1:\t" \
++		"lock ; decb %0\n\t" \
++		"js 2f\n" \
++		"jmp 3f\n" \
++		"2:\t" \
++		"rep;nop\n\t" \
++		"cmpb $0,%0\n\t" \
++		"jle 2b\n\t" \
++		"jmp 1b\n" \
++		"3:\t"
++
++#else /* !CONFIG_SPINLINE */
++
++	#define spin_lock_string \
++		"\n1:\t" \
++		"lock ; decb %0\n\t" \
++		"js 2f\n" \
++		LOCK_SECTION_START("") \
++		"2:\t" \
++		"rep;nop\n\t" \
++		"cmpb $0,%0\n\t" \
++		"jle 2b\n\t" \
++		"jmp 1b\n" \
++		LOCK_SECTION_END
++
++#endif /* CONFIG_SPINLINE */
+ /*
+  * This works. Despite all the confusion.
+  * (except on PPro SMP or if we are using OOSTORE)
+@@ -138,6 +155,11 @@ here:
+  */
+ typedef struct {
+ 	volatile unsigned int lock;
++#ifdef CONFIG_LOCKMETER
++	/* required for LOCKMETER since all bits in lock are used */
++	/* and we need this storage for CPU and lock INDEX        */
++	unsigned lockmeter_magic;
++#endif
+ #ifdef CONFIG_DEBUG_SPINLOCK
+ 	unsigned magic;
+ #endif
+@@ -145,11 +167,19 @@ typedef struct {
+ 
+ #define RWLOCK_MAGIC	0xdeaf1eed
+ 
++#ifdef CONFIG_LOCKMETER
++#ifdef CONFIG_DEBUG_SPINLOCK
++#define RWLOCK_MAGIC_INIT	, 0, RWLOCK_MAGIC
++#else
++#define RWLOCK_MAGIC_INIT	, 0
++#endif
++#else /* !CONFIG_LOCKMETER */
+ #ifdef CONFIG_DEBUG_SPINLOCK
+ #define RWLOCK_MAGIC_INIT	, RWLOCK_MAGIC
+ #else
+ #define RWLOCK_MAGIC_INIT	/* */
+ #endif
++#endif /* !CONFIG_LOCKMETER */
+ 
+ #define RW_LOCK_UNLOCKED (rwlock_t) { RW_LOCK_BIAS RWLOCK_MAGIC_INIT }
+ 
+@@ -196,4 +226,58 @@ static inline int _raw_write_trylock(rwl
+ 	return 0;
+ }
+ 
++#ifdef CONFIG_LOCKMETER
++static inline int _raw_read_trylock(rwlock_t *lock)
++{
++/* FIXME -- replace with assembler */
++	atomic_t *count = (atomic_t *)lock;
++	atomic_dec(count);
++	if (count->counter > 0)
++		return 1;
++	atomic_inc(count);
++	return 0;
++}
++#endif
++
++#if defined(CONFIG_LOCKMETER) && defined(CONFIG_HAVE_DEC_LOCK)
++extern void _metered_spin_lock  (spinlock_t *lock);
++extern void _metered_spin_unlock(spinlock_t *lock);
++
++/*
++ *  Matches what is in arch/i386/lib/dec_and_lock.c, except this one is
++ *  "static inline" so that the spin_lock(), if actually invoked, is charged
++ *  against the real caller, not against the catch-all atomic_dec_and_lock
++ */
++static inline int atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
++{
++	int counter;
++	int newcount;
++
++repeat:
++	counter = atomic_read(atomic);
++	newcount = counter-1;
++
++	if (!newcount)
++		goto slow_path;
++
++	asm volatile("lock; cmpxchgl %1,%2"
++		:"=a" (newcount)
++		:"r" (newcount), "m" (atomic->counter), "0" (counter));
++
++	/* If the above failed, "eax" will have changed */
++	if (newcount != counter)
++		goto repeat;
++	return 0;
++
++slow_path:
++	_metered_spin_lock(lock);
++	if (atomic_dec_and_test(atomic))
++		return 1;
++	_metered_spin_unlock(lock);
++	return 0;
++}
++
++#define ATOMIC_DEC_AND_LOCK
++#endif
++
+ #endif /* __ASM_SPINLOCK_H */
+--- linux-2.6.0-test1/include/asm-i386/stat.h	2003-06-14 12:17:57.000000000 -0700
++++ 25/include/asm-i386/stat.h	2003-07-19 17:06:16.000000000 -0700
+@@ -9,6 +9,7 @@ struct __old_kernel_stat {
+ 	unsigned short st_uid;
+ 	unsigned short st_gid;
+ 	unsigned short st_rdev;
++	unsigned short __pad_16bit;
+ 	unsigned long  st_size;
+ 	unsigned long  st_atime;
+ 	unsigned long  st_mtime;
+--- linux-2.6.0-test1/include/asm-i386/thread_info.h	2003-06-14 12:17:58.000000000 -0700
++++ 25/include/asm-i386/thread_info.h	2003-07-19 17:03:50.000000000 -0700
+@@ -87,8 +87,8 @@ static inline struct thread_info *curren
+ 
+ /* thread information allocation */
+ #define THREAD_SIZE (2*PAGE_SIZE)
+-#define alloc_thread_info(tsk) ((struct thread_info *) __get_free_pages(GFP_KERNEL,1))
+-#define free_thread_info(ti) free_pages((unsigned long) (ti), 1)
++#define alloc_thread_info(task) ((struct thread_info *)kmalloc(THREAD_SIZE, GFP_KERNEL))
++#define free_thread_info(info)	kfree(info)
+ #define get_thread_info(ti) get_task_struct((ti)->task)
+ #define put_thread_info(ti) put_task_struct((ti)->task)
+ 
+--- linux-2.6.0-test1/include/asm-i386/topology.h	2003-06-14 12:17:59.000000000 -0700
++++ 25/include/asm-i386/topology.h	2003-07-19 17:04:07.000000000 -0700
+@@ -31,9 +31,11 @@
+ 
+ #include <asm/mpspec.h>
+ 
++#include <linux/cpumask.h>
++
+ /* Mappings between logical cpu number and node number */
+-extern volatile unsigned long node_2_cpu_mask[];
+-extern volatile int cpu_2_node[];
++extern cpumask_t node_2_cpu_mask[];
++extern int cpu_2_node[];
+ 
+ /* Returns the number of the node containing CPU 'cpu' */
+ static inline int cpu_to_node(int cpu)
+@@ -49,7 +51,7 @@ static inline int cpu_to_node(int cpu)
+ #define parent_node(node) (node)
+ 
+ /* Returns a bitmask of CPUs on Node 'node'. */
+-static inline unsigned long node_to_cpumask(int node)
++static inline cpumask_t node_to_cpumask(int node)
+ {
+ 	return node_2_cpu_mask[node];
+ }
+@@ -57,14 +59,15 @@ static inline unsigned long node_to_cpum
+ /* Returns the number of the first CPU on Node 'node'. */
+ static inline int node_to_first_cpu(int node)
+ { 
+-	return __ffs(node_to_cpumask(node));
++	cpumask_t mask = node_to_cpumask(node);
++	return first_cpu(mask);
+ }
+ 
+ /* Returns the number of the first MemBlk on Node 'node' */
+ #define node_to_memblk(node) (node)
+ 
+ /* Returns the number of the node containing PCI bus 'bus' */
+-static inline unsigned long pcibus_to_cpumask(int bus)
++static inline cpumask_t pcibus_to_cpumask(int bus)
+ {
+ 	return node_to_cpumask(mp_bus_id_to_node[bus]);
+ }
+--- linux-2.6.0-test1/include/asm-i386/unistd.h	2003-07-13 21:44:35.000000000 -0700
++++ 25/include/asm-i386/unistd.h	2003-07-19 17:06:37.000000000 -0700
+@@ -277,8 +277,9 @@
+ #define __NR_fstatfs64		269
+ #define __NR_tgkill		270
+ #define __NR_utimes		271
++#define __NR_mknod64		272
+ 
+-#define NR_syscalls 272
++#define NR_syscalls 273
+ 
+ /* user-visible error numbers are in the range -1 - -124: see <asm-i386/errno.h> */
+ 
+--- linux-2.6.0-test1/include/asm-ia64/atomic.h	2003-06-14 12:17:59.000000000 -0700
++++ 25/include/asm-ia64/atomic.h	2003-07-19 17:03:50.000000000 -0700
+@@ -9,7 +9,7 @@
+  * "int" types were carefully placed so as to ensure proper operation
+  * of the macros.
+  *
+- * Copyright (C) 1998, 1999, 2002 Hewlett-Packard Co
++ * Copyright (C) 1998, 1999, 2002-2003 Hewlett-Packard Co
+  *	David Mosberger-Tang <davidm@hpl.hp.com>
+  */
+ #include <linux/types.h>
+@@ -21,11 +21,16 @@
+  * memory accesses are ordered.
+  */
+ typedef struct { volatile __s32 counter; } atomic_t;
++typedef struct { volatile __s64 counter; } atomic64_t;
+ 
+ #define ATOMIC_INIT(i)		((atomic_t) { (i) })
++#define ATOMIC64_INIT(i)	((atomic64_t) { (i) })
+ 
+ #define atomic_read(v)		((v)->counter)
++#define atomic64_read(v)	((v)->counter)
++
+ #define atomic_set(v,i)		(((v)->counter) = (i))
++#define atomic64_set(v,i)	(((v)->counter) = (i))
+ 
+ static __inline__ int
+ ia64_atomic_add (int i, atomic_t *v)
+@@ -37,7 +42,21 @@ ia64_atomic_add (int i, atomic_t *v)
+ 		CMPXCHG_BUGCHECK(v);
+ 		old = atomic_read(v);
+ 		new = old + i;
+-	} while (ia64_cmpxchg("acq", v, old, old + i, sizeof(atomic_t)) != old);
++	} while (ia64_cmpxchg("acq", v, old, new, sizeof(atomic_t)) != old);
++	return new;
++}
++
++static __inline__ int
++ia64_atomic64_add (int i, atomic64_t *v)
++{
++	__s64 old, new;
++	CMPXCHG_BUGCHECK_DECL
++
++	do {
++		CMPXCHG_BUGCHECK(v);
++		old = atomic_read(v);
++		new = old + i;
++	} while (ia64_cmpxchg("acq", v, old, new, sizeof(atomic_t)) != old);
+ 	return new;
+ }
+ 
+@@ -55,6 +74,20 @@ ia64_atomic_sub (int i, atomic_t *v)
+ 	return new;
+ }
+ 
++static __inline__ int
++ia64_atomic64_sub (int i, atomic64_t *v)
++{
++	__s64 old, new;
++	CMPXCHG_BUGCHECK_DECL
++
++	do {
++		CMPXCHG_BUGCHECK(v);
++		old = atomic_read(v);
++		new = old - i;
++	} while (ia64_cmpxchg("acq", v, old, new, sizeof(atomic_t)) != old);
++	return new;
++}
++
+ #define atomic_add_return(i,v)						\
+ ({									\
+ 	int __ia64_aar_i = (i);						\
+@@ -67,6 +100,18 @@ ia64_atomic_sub (int i, atomic_t *v)
+ 		: ia64_atomic_add(__ia64_aar_i, v);			\
+ })
+ 
++#define atomic64_add_return(i,v)					\
++({									\
++	long __ia64_aar_i = (i);					\
++	(__builtin_constant_p(i)					\
++	 && (   (__ia64_aar_i ==  1) || (__ia64_aar_i ==   4)		\
++	     || (__ia64_aar_i ==  8) || (__ia64_aar_i ==  16)		\
++	     || (__ia64_aar_i == -1) || (__ia64_aar_i ==  -4)		\
++	     || (__ia64_aar_i == -8) || (__ia64_aar_i == -16)))		\
++		? ia64_fetch_and_add(__ia64_aar_i, &(v)->counter)	\
++		: ia64_atomic64_add(__ia64_aar_i, v);			\
++})
++
+ /*
+  * Atomically add I to V and return TRUE if the resulting value is
+  * negative.
+@@ -77,6 +122,12 @@ atomic_add_negative (int i, atomic_t *v)
+ 	return atomic_add_return(i, v) < 0;
+ }
+ 
++static __inline__ int
++atomic64_add_negative (int i, atomic64_t *v)
++{
++	return atomic64_add_return(i, v) < 0;
++}
++
+ #define atomic_sub_return(i,v)						\
+ ({									\
+ 	int __ia64_asr_i = (i);						\
+@@ -89,18 +140,40 @@ atomic_add_negative (int i, atomic_t *v)
+ 		: ia64_atomic_sub(__ia64_asr_i, v);			\
+ })
+ 
++#define atomic64_sub_return(i,v)					\
++({									\
++	long __ia64_asr_i = (i);					\
++	(__builtin_constant_p(i)					\
++	 && (   (__ia64_asr_i ==   1) || (__ia64_asr_i ==   4)		\
++	     || (__ia64_asr_i ==   8) || (__ia64_asr_i ==  16)		\
++	     || (__ia64_asr_i ==  -1) || (__ia64_asr_i ==  -4)		\
++	     || (__ia64_asr_i ==  -8) || (__ia64_asr_i == -16)))	\
++		? ia64_fetch_and_add(-__ia64_asr_i, &(v)->counter)	\
++		: ia64_atomic64_sub(__ia64_asr_i, v);			\
++})
++
+ #define atomic_dec_return(v)		atomic_sub_return(1, (v))
+ #define atomic_inc_return(v)		atomic_add_return(1, (v))
++#define atomic64_dec_return(v)		atomic64_sub_return(1, (v))
++#define atomic64_inc_return(v)		atomic64_add_return(1, (v))
+ 
+ #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)
+ #define atomic_inc_and_test(v)		(atomic_add_return(1, (v)) != 0)
++#define atomic64_sub_and_test(i,v)	(atomic64_sub_return((i), (v)) == 0)
++#define atomic64_dec_and_test(v)	(atomic64_sub_return(1, (v)) == 0)
++#define atomic64_inc_and_test(v)	(atomic64_add_return(1, (v)) != 0)
+ 
+ #define atomic_add(i,v)			atomic_add_return((i), (v))
+ #define atomic_sub(i,v)			atomic_sub_return((i), (v))
+ #define atomic_inc(v)			atomic_add(1, (v))
+ #define atomic_dec(v)			atomic_sub(1, (v))
+ 
++#define atomic64_add(i,v)		atomic64_add_return((i), (v))
++#define atomic64_sub(i,v)		atomic64_sub_return((i), (v))
++#define atomic64_inc(v)			atomic64_add(1, (v))
++#define atomic64_dec(v)			atomic64_sub(1, (v))
++
+ /* Atomic operations are already serializing */
+ #define smp_mb__before_atomic_dec()	barrier()
+ #define smp_mb__after_atomic_dec()	barrier()
+--- linux-2.6.0-test1/include/asm-ia64/bitops.h	2003-06-14 12:18:33.000000000 -0700
++++ 25/include/asm-ia64/bitops.h	2003-07-19 17:04:07.000000000 -0700
+@@ -409,7 +409,7 @@ found_middle:
+  * Find next bit in a bitmap reasonably efficiently..
+  */
+ static inline int
+-find_next_bit (void *addr, unsigned long size, unsigned long offset)
++find_next_bit(const void *addr, unsigned long size, unsigned long offset)
+ {
+ 	unsigned long *p = ((unsigned long *) addr) + (offset >> 6);
+ 	unsigned long result = offset & ~63UL;
+--- linux-2.6.0-test1/include/asm-ia64/elf.h	2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-ia64/elf.h	2003-07-19 17:03:50.000000000 -0700
+@@ -199,11 +199,11 @@ extern int dump_task_fpu (struct task_st
+ 
+ #define GATE_EHDR	((const struct elfhdr *) GATE_ADDR)
+ 
+-#define ARCH_DLINFO							\
+-do {									\
+-	extern char __kernel_syscall_via_epc[];				\
+-	NEW_AUX_ENT(AT_SYSINFO, __kernel_syscall_via_epc);		\
+-	NEW_AUX_ENT(AT_SYSINFO_EHDR, (unsigned long) GATE_EHDR);	\
++#define ARCH_DLINFO								\
++do {										\
++	extern char __kernel_syscall_via_epc[];					\
++	NEW_AUX_ENT(AT_SYSINFO, (unsigned long) __kernel_syscall_via_epc);	\
++	NEW_AUX_ENT(AT_SYSINFO_EHDR, (unsigned long) GATE_EHDR);		\
+ } while (0)
+ 
+ /*
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-ia64/local.h	2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,50 @@
++#ifndef _ASM_IA64_LOCAL_H
++#define _ASM_IA64_LOCAL_H
++
++/*
++ * Copyright (C) 2003 Hewlett-Packard Co
++ *	David Mosberger-Tang <davidm@hpl.hp.com>
++ */
++
++#include <linux/percpu.h>
++
++typedef struct {
++	atomic64_t val;
++} local_t;
++
++#define LOCAL_INIT(i)	((local_t) { { (i) } })
++#define local_read(l)	atomic64_read(&(l)->val)
++#define local_set(l, i)	atomic64_set(&(l)->val, i)
++#define local_inc(l)	atomic64_inc(&(l)->val)
++#define local_dec(l)	atomic64_dec(&(l)->val)
++#define local_add(l)	atomic64_add(&(l)->val)
++#define local_sub(l)	atomic64_sub(&(l)->val)
++
++/* Non-atomic variants, i.e., preemption disabled and won't be touched in interrupt, etc.  */
++
++#define __local_inc(l)		(++(l)->val.counter)
++#define __local_dec(l)		(--(l)->val.counter)
++#define __local_add(i,l)	((l)->val.counter += (i))
++#define __local_sub(i,l)	((l)->val.counter -= (i))
++
++/*
++ * Use these for per-cpu local_t variables.  Note they take a variable (eg. mystruct.foo),
++ * not an address.
++ */
++#define cpu_local_read(v)	local_read(&__ia64_per_cpu_var(v))
++#define cpu_local_set(v, i)	local_set(&__ia64_per_cpu_var(v), (i))
++#define cpu_local_inc(v)	local_inc(&__ia64_per_cpu_var(v))
++#define cpu_local_dec(v)	local_dec(&__ia64_per_cpu_var(v))
++#define cpu_local_add(i, v)	local_add((i), &__ia64_per_cpu_var(v))
++#define cpu_local_sub(i, v)	local_sub((i), &__ia64_per_cpu_var(v))
++
++/*
++ * Non-atomic increments, i.e., preemption disabled and won't be touched in interrupt,
++ * etc.
++ */
++#define __cpu_local_inc(v)	__local_inc(&__ia64_per_cpu_var(v))
++#define __cpu_local_dec(v)	__local_dec(&__ia64_per_cpu_var(v))
++#define __cpu_local_add(i, v)	__local_add((i), &__ia64_per_cpu_var(v))
++#define __cpu_local_sub(i, v)	__local_sub((i), &__ia64_per_cpu_var(v))
++
++#endif /* _ASM_IA64_LOCAL_H */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-ia64/lockmeter.h	2003-07-19 17:06:40.000000000 -0700
+@@ -0,0 +1,72 @@
++/*
++ *  Copyright (C) 1999,2000 Silicon Graphics, Inc.
++ *
++ *  Written by John Hawkes (hawkes@sgi.com)
++ *  Based on klstat.h by Jack Steiner (steiner@sgi.com)
++ */
++
++#ifndef _IA64_LOCKMETER_H
++#define _IA64_LOCKMETER_H
++
++#ifdef local_cpu_data
++#define CPU_CYCLE_FREQUENCY	local_cpu_data->itc_freq
++#else
++#define CPU_CYCLE_FREQUENCY	my_cpu_data.itc_freq
++#endif
++#define get_cycles64()		get_cycles()
++
++#define THIS_CPU_NUMBER		smp_processor_id()
++
++/*
++ * macros to cache and retrieve an index value inside of a lock
++ * these macros assume that there are less than 65536 simultaneous
++ * (read mode) holders of a rwlock.
++ * we also assume that the hash table has less than 32767 entries.
++ */
++/*
++ * instrumented spinlock structure -- never used to allocate storage
++ * only used in macros below to overlay a spinlock_t
++ */
++typedef struct inst_spinlock_s {
++	/* remember, Intel is little endian */
++	volatile unsigned short lock;
++	volatile unsigned short index;
++} inst_spinlock_t;
++#define PUT_INDEX(lock_ptr,indexv) ((inst_spinlock_t *)(lock_ptr))->index = indexv
++#define GET_INDEX(lock_ptr)        ((inst_spinlock_t *)(lock_ptr))->index
++
++/*
++ * macros to cache and retrieve an index value in a read/write lock
++ * as well as the cpu where a reader busy period started
++ * we use the 2nd word (the debug word) for this, so require the
++ * debug word to be present
++ */
++/*
++ * instrumented rwlock structure -- never used to allocate storage
++ * only used in macros below to overlay a rwlock_t
++ */
++typedef struct inst_rwlock_s {
++	volatile int read_counter:31;
++	volatile int write_lock:1;
++	volatile unsigned short index;
++	volatile unsigned short cpu;
++} inst_rwlock_t;
++#define PUT_RWINDEX(rwlock_ptr,indexv) ((inst_rwlock_t *)(rwlock_ptr))->index = indexv
++#define GET_RWINDEX(rwlock_ptr)        ((inst_rwlock_t *)(rwlock_ptr))->index
++#define PUT_RW_CPU(rwlock_ptr,cpuv)    ((inst_rwlock_t *)(rwlock_ptr))->cpu = cpuv
++#define GET_RW_CPU(rwlock_ptr)         ((inst_rwlock_t *)(rwlock_ptr))->cpu
++
++/*
++ * return the number of readers for a rwlock_t
++ */
++#define RWLOCK_READERS(rwlock_ptr)	((rwlock_ptr)->read_counter)
++
++/*
++ * return true if rwlock is write locked
++ * (note that other lock attempts can cause the lock value to be negative)
++ */
++#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) ((rwlock_ptr)->write_lock)
++#define RWLOCK_IS_READ_LOCKED(rwlock_ptr)  ((rwlock_ptr)->read_counter)
++
++#endif /* _IA64_LOCKMETER_H */
++
+--- linux-2.6.0-test1/include/asm-ia64/mmu_context.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-ia64/mmu_context.h	2003-07-19 17:03:50.000000000 -0700
+@@ -86,9 +86,9 @@ delayed_tlb_flush (void)
+ {
+ 	extern void local_flush_tlb_all (void);
+ 
+-	if (unlikely(__get_cpu_var(ia64_need_tlb_flush))) {
++	if (unlikely(__ia64_per_cpu_var(ia64_need_tlb_flush))) {
+ 		local_flush_tlb_all();
+-		__get_cpu_var(ia64_need_tlb_flush) = 0;
++		__ia64_per_cpu_var(ia64_need_tlb_flush) = 0;
+ 	}
+ }
+ 
+--- linux-2.6.0-test1/include/asm-ia64/percpu.h	2003-06-14 12:18:29.000000000 -0700
++++ 25/include/asm-ia64/percpu.h	2003-07-19 17:03:50.000000000 -0700
+@@ -1,43 +1,73 @@
+ #ifndef _ASM_IA64_PERCPU_H
+ #define _ASM_IA64_PERCPU_H
+ 
+-#include <linux/config.h>
+-#include <linux/compiler.h>
+-
+ /*
+  * Copyright (C) 2002-2003 Hewlett-Packard Co
+  *	David Mosberger-Tang <davidm@hpl.hp.com>
+  */
++
+ #define PERCPU_ENOUGH_ROOM PERCPU_PAGE_SIZE
+ 
+ #ifdef __ASSEMBLY__
+-
+-#define THIS_CPU(var)	(var##__per_cpu)  /* use this to mark accesses to per-CPU variables... */
+-
++# define THIS_CPU(var)	(per_cpu__##var)  /* use this to mark accesses to per-CPU variables... */
+ #else /* !__ASSEMBLY__ */
+ 
++#include <linux/config.h>
++
+ #include <linux/threads.h>
+ 
+-extern unsigned long __per_cpu_offset[NR_CPUS];
++#ifdef HAVE_MODEL_SMALL_ATTRIBUTE
++# define __SMALL_ADDR_AREA	__attribute__((__model__ (__small__)))
++#else
++# define __SMALL_ADDR_AREA
++#endif
+ 
+-#define DEFINE_PER_CPU(type, name) \
+-    __attribute__((__section__(".data.percpu"))) __typeof__(type) name##__per_cpu
+-#define DECLARE_PER_CPU(type, name) extern __typeof__(type) name##__per_cpu
++#define DECLARE_PER_CPU(type, name)				\
++	extern __SMALL_ADDR_AREA __typeof__(type) per_cpu__##name
+ 
+-#define __get_cpu_var(var)	(var##__per_cpu)
++/* Separate out the type, so (int[3], foo) works. */
++#define DEFINE_PER_CPU(type, name)				\
++	__attribute__((__section__(".data.percpu")))		\
++	__SMALL_ADDR_AREA __typeof__(type) per_cpu__##name
++
++/*
++ * Pretty much a literal copy of asm-generic/percpu.h, except that percpu_modcopy() is an
++ * external routine, to avoid include-hell.
++ */
+ #ifdef CONFIG_SMP
+-# define per_cpu(var, cpu)	(*RELOC_HIDE(&var##__per_cpu, __per_cpu_offset[cpu]))
++
++extern unsigned long __per_cpu_offset[NR_CPUS];
++
++/* Equal to __per_cpu_offset[smp_processor_id()], but faster to access: */
++DECLARE_PER_CPU(unsigned long, local_per_cpu_offset);
++
++#define per_cpu(var, cpu)  (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset[cpu]))
++#define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __ia64_per_cpu_var(local_per_cpu_offset)))
+ 
+ extern void percpu_modcopy(void *pcpudst, const void *src, unsigned long size);
+-#else
+-# define per_cpu(var, cpu)	((void)cpu, __get_cpu_var(var))
+-#endif
+ 
+-#define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(var##__per_cpu)
+-#define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(var##__per_cpu)
++#else /* ! SMP */
++
++#define per_cpu(var, cpu)			((void)cpu, per_cpu__##var)
++#define __get_cpu_var(var)			per_cpu__##var
++
++#endif	/* SMP */
++
++#define EXPORT_PER_CPU_SYMBOL(var)		EXPORT_SYMBOL(per_cpu__##var)
++#define EXPORT_PER_CPU_SYMBOL_GPL(var)		EXPORT_SYMBOL_GPL(per_cpu__##var)
++
++/* ia64-specific part: */
+ 
+ extern void setup_per_cpu_areas (void);
+ 
++/*
++ * Be extremely careful when taking the address of this variable!  Due to virtual
++ * remapping, it is different from the canonical address returned by __get_cpu_var(var)!
++ * On the positive side, using __ia64_per_cpu_var() instead of __get_cpu_var() is slightly
++ * more efficient.
++ */
++#define __ia64_per_cpu_var(var)	(per_cpu__##var)
++
+ #endif /* !__ASSEMBLY__ */
+ 
+ #endif /* _ASM_IA64_PERCPU_H */
+--- linux-2.6.0-test1/include/asm-ia64/pgalloc.h	2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-ia64/pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -71,9 +71,9 @@ pgd_free (pgd_t *pgd)
+ }
+ 
+ static inline void
+-pgd_populate (struct mm_struct *mm, pgd_t *pgd_entry, pmd_t *pmd)
++pgd_populate (struct mm_struct *mm, pgd_t *pgd_entry, struct page *pmd)
+ {
+-	pgd_val(*pgd_entry) = __pa(pmd);
++	pgd_val(*pgd_entry) = __pa(page_address(pmd));
+ }
+ 
+ 
+@@ -90,8 +90,8 @@ pmd_alloc_one_fast (struct mm_struct *mm
+ 	return (pmd_t *)ret;
+ }
+ 
+-static inline pmd_t*
+-pmd_alloc_one (struct mm_struct *mm, unsigned long addr)
++static inline pmd_t *
++pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
+ {
+ 	pmd_t *pmd = (pmd_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT);
+ 
+@@ -100,9 +100,16 @@ pmd_alloc_one (struct mm_struct *mm, uns
+ 	return pmd;
+ }
+ 
++static inline struct page *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
++{
++	pmd_t *pmd = pmd_alloc_one_kernel(mm, addr);
++	return pmd ? virt_to_page(pmd) : NULL;
++}
++
+ static inline void
+-pmd_free (pmd_t *pmd)
++pmd_free(struct page *page)
+ {
++	pmd_t *pmd = page_address(page);
+ 	*(unsigned long *)pmd = (unsigned long) pmd_quicklist;
+ 	pmd_quicklist = (unsigned long *) pmd;
+ 	++pgtable_cache_size;
+--- linux-2.6.0-test1/include/asm-ia64/pgtable.h	2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-ia64/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -257,7 +257,8 @@ ia64_phys_addr_valid (unsigned long addr
+ #define pgd_bad(pgd)			(!ia64_phys_addr_valid(pgd_val(pgd)))
+ #define pgd_present(pgd)		(pgd_val(pgd) != 0UL)
+ #define pgd_clear(pgdp)			(pgd_val(*(pgdp)) = 0UL)
+-#define pgd_page(pgd)			((unsigned long) __va(pgd_val(pgd) & _PFN_MASK))
++#define __pgd_page(pgd)			((unsigned long)__va(pgd_val(pgd) & _PFN_MASK))
++#define pgd_page(pgd)			virt_to_page(__pgd_page(pgd))
+ 
+ /*
+  * The following have defined behavior only work if pte_present() is true.
+@@ -326,7 +327,13 @@ pgd_offset (struct mm_struct *mm, unsign
+ 
+ /* Find an entry in the second-level page table.. */
+ #define pmd_offset(dir,addr) \
+-	((pmd_t *) pgd_page(*(dir)) + (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)))
++	((pmd_t *)__pgd_page(*(dir)) + (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)))
++
++#define pmd_offset_kernel(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)	pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)				do { } while (0)
++#define pmd_unmap_nested(pmd)			do { } while (0)
+ 
+ /*
+  * Find an entry in the third-level page table.  This looks more complicated than it
+--- linux-2.6.0-test1/include/asm-ia64/posix_types.h	2003-06-14 12:18:06.000000000 -0700
++++ 25/include/asm-ia64/posix_types.h	2003-07-19 17:06:39.000000000 -0700
+@@ -10,7 +10,9 @@
+  *	David Mosberger-Tang <davidm@hpl.hp.com>
+  */
+ 
+-typedef unsigned int	__kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long	__kernel_dev_t;
++#endif
+ typedef unsigned int	__kernel_ino_t;
+ typedef unsigned int	__kernel_mode_t;
+ typedef unsigned int	__kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-ia64/processor.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-ia64/processor.h	2003-07-19 17:03:50.000000000 -0700
+@@ -191,10 +191,12 @@ struct cpuinfo_ia64 {
+ DECLARE_PER_CPU(struct cpuinfo_ia64, cpu_info);
+ 
+ /*
+- * The "local" data pointer.  It points to the per-CPU data of the currently executing
++ * The "local" data variable.  It refers to the per-CPU data of the currently executing
+  * CPU, much like "current" points to the per-task data of the currently executing task.
++ * Do not use the address of local_cpu_data, since it will be different from
++ * cpu_data(smp_processor_id())!
+  */
+-#define local_cpu_data		(&__get_cpu_var(cpu_info))
++#define local_cpu_data		(&__ia64_per_cpu_var(cpu_info))
+ #define cpu_data(cpu)		(&per_cpu(cpu_info, cpu))
+ 
+ extern void identify_cpu (struct cpuinfo_ia64 *);
+--- linux-2.6.0-test1/include/asm-ia64/smp.h	2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-ia64/smp.h	2003-07-19 17:04:07.000000000 -0700
+@@ -16,6 +16,7 @@
+ #include <linux/init.h>
+ #include <linux/threads.h>
+ #include <linux/kernel.h>
++#include <linux/cpumask.h>
+ 
+ #include <asm/bitops.h>
+ #include <asm/io.h>
+@@ -37,8 +38,8 @@ extern struct smp_boot_data {
+ 
+ extern char no_int_routing __initdata;
+ 
+-extern unsigned long phys_cpu_present_map;
+-extern volatile unsigned long cpu_online_map;
++extern cpumask_t phys_cpu_present_map;
++extern cpumask_t cpu_online_map;
+ extern unsigned long ipi_base_addr;
+ extern unsigned char smp_int_redirect;
+ 
+@@ -47,22 +48,7 @@ extern volatile int ia64_cpu_to_sapicid[
+ 
+ extern unsigned long ap_wakeup_vector;
+ 
+-#define cpu_possible(cpu)	(phys_cpu_present_map & (1UL << (cpu)))
+-#define cpu_online(cpu)		(cpu_online_map & (1UL << (cpu)))
+-
+-static inline unsigned int
+-num_online_cpus (void)
+-{
+-	return hweight64(cpu_online_map);
+-}
+-
+-static inline unsigned int
+-any_online_cpu (unsigned int mask)
+-{
+-	if (mask & cpu_online_map)
+-		return __ffs(mask & cpu_online_map);
+-	return NR_CPUS;
+-}
++#define cpu_possible(cpu)	cpu_isset(cpu, phys_cpu_present_map)
+ 
+ /*
+  * Function to map hard smp processor id to logical id.  Slow, so don't use this in
+--- linux-2.6.0-test1/include/asm-ia64/spinlock.h	2003-06-26 22:07:25.000000000 -0700
++++ 25/include/asm-ia64/spinlock.h	2003-07-19 17:06:40.000000000 -0700
+@@ -120,8 +120,18 @@ _raw_spin_lock (spinlock_t *lock)
+ typedef struct {
+ 	volatile int read_counter	: 31;
+ 	volatile int write_lock		:  1;
++#ifdef CONFIG_LOCKMETER
++	/* required for LOCKMETER since all bits in lock are used */
++	/* and we need this storage for CPU and lock INDEX        */
++	unsigned lockmeter_magic;
++#endif
+ } rwlock_t;
++
++#ifdef CONFIG_LOCKMETER
++#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0, 0 }
++#else
+ #define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0 }
++#endif
+ 
+ #define rwlock_init(x)		do { *(x) = RW_LOCK_UNLOCKED; } while(0)
+ #define rwlock_is_locked(x)	(*(volatile int *) (x) != 0)
+@@ -137,6 +147,48 @@ do {											\
+ 	}										\
+ } while (0)
+ 
++#ifdef CONFIG_LOCKMETER
++/*
++ * HACK: This works, but still have a timing window that affects performance:
++ * we see that no one owns the Write lock, then someone * else grabs for Write
++ * lock before we do a read_lock().
++ * This means that on rare occasions our read_lock() will stall and spin-wait
++ * until we acquire for Read, instead of simply returning a trylock failure.
++ */
++static inline int _raw_read_trylock(rwlock_t *rw)
++{
++	if (rw->write_lock) {
++		return 0;
++	} else {
++		_raw_read_lock(rw);
++		return 1;
++	}
++}
++
++static inline int _raw_write_trylock(rwlock_t *rw)
++{
++	if (!(rw->write_lock)) {
++	    /* isn't currently write-locked... that looks promising... */
++	    if (test_and_set_bit(31, rw) == 0) {
++		/* now it is write-locked by me... */
++		if (rw->read_counter) {
++		    /* really read-locked, so release write-lock and fail */
++		    clear_bit(31, rw);
++		} else {
++		    /* we've the the write-lock, no read-lockers... success! */
++		    barrier();
++		    return 1;
++		}
++
++	    }
++	}
++
++	/* falls through ... fails to write-lock */
++	barrier();
++	return 0;
++}
++#endif
++
+ #define _raw_read_unlock(rw)					\
+ do {								\
+ 	rwlock_t *__read_lock_ptr = (rw);			\
+@@ -181,4 +233,25 @@ do {										\
+ 	clear_bit(31, (x));								\
+ })
+ 
++#ifdef CONFIG_LOCKMETER
++extern void _metered_spin_lock  (spinlock_t *lock);
++extern void _metered_spin_unlock(spinlock_t *lock);
++
++/*
++ *  Use a less efficient, and inline, atomic_dec_and_lock() if lockmetering
++ *  so we can see the callerPC of who is actually doing the spin_lock().
++ *  Otherwise, all we see is the generic rollup of all locks done by
++ *  atomic_dec_and_lock().
++ */
++static inline int atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
++{
++	_metered_spin_lock(lock);
++	if (atomic_dec_and_test(atomic))
++		return 1;
++	_metered_spin_unlock(lock);
++	return 0;
++}
++#define ATOMIC_DEC_AND_LOCK
++#endif
++
+ #endif /*  _ASM_IA64_SPINLOCK_H */
+--- linux-2.6.0-test1/include/asm-ia64/system.h	2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-ia64/system.h	2003-07-19 17:03:50.000000000 -0700
+@@ -20,9 +20,9 @@
+ #include <asm/percpu.h>
+ 
+ /* 0xa000000000000000 - 0xa000000000000000+PERCPU_PAGE_SIZE remain unmapped */
+-#define PERCPU_ADDR		(0xa000000000000000 + PERCPU_PAGE_SIZE)
+-#define GATE_ADDR		(0xa000000000000000 + 2*PERCPU_PAGE_SIZE)
++#define GATE_ADDR		(0xa000000000000000 + PERCPU_PAGE_SIZE)
+ #define KERNEL_START		 0xa000000100000000
++#define PERCPU_ADDR		(-PERCPU_PAGE_SIZE)
+ 
+ #ifndef __ASSEMBLY__
+ 
+--- linux-2.6.0-test1/include/asm-ia64/tlb.h	2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-ia64/tlb.h	2003-07-19 17:03:50.000000000 -0700
+@@ -126,7 +126,7 @@ ia64_tlb_flush_mmu (struct mmu_gather *t
+ static inline struct mmu_gather *
+ tlb_gather_mmu (struct mm_struct *mm, unsigned int full_mm_flush)
+ {
+-	struct mmu_gather *tlb = &per_cpu(mmu_gathers, smp_processor_id());
++	struct mmu_gather *tlb = &__get_cpu_var(mmu_gathers);
+ 
+ 	tlb->mm = mm;
+ 	/*
+--- linux-2.6.0-test1/include/asm-m68k/motorola_pgalloc.h	2003-06-14 12:18:52.000000000 -0700
++++ 25/include/asm-m68k/motorola_pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -63,19 +63,28 @@ static inline void __pte_free_tlb(struct
+ }
+ 
+ 
+-static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
++static inline pmd_t *pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
+ {
+ 	return get_pointer_table();
+ }
+ 
+-static inline int pmd_free(pmd_t *pmd)
++static inline struct page *pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
+ {
+-	return free_pointer_table(pmd);
++	pmd_t *pmd = pmd_alloc_one_kernel(mm, addr);
++	if (pmd)
++		return virt_to_page(pmd);
++	else
++		return NULL;
+ }
+ 
+-static inline int __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd)
++static inline int pmd_free(struct page *pmd)
+ {
+-	return free_pointer_table(pmd);
++	return free_pointer_table(page_address(pmd));
++}
++
++static inline int __pmd_free_tlb(struct mmu_gather *tlb, struct page *pmd)
++{
++	return free_pointer_table(page_address(pmd));
+ }
+ 
+ 
+@@ -100,9 +109,9 @@ static inline void pmd_populate(struct m
+ 	pmd_set(pmd, page_address(page));
+ }
+ 
+-static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd)
++static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, struct page *pmd)
+ {
+-	pgd_set(pgd, pmd);
++	pgd_set(pgd, page_address(pmd));
+ }
+ 
+ #endif /* _MOTOROLA_PGALLOC_H */
+--- linux-2.6.0-test1/include/asm-m68k/motorola_pgtable.h	2003-06-14 12:18:24.000000000 -0700
++++ 25/include/asm-m68k/motorola_pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -115,6 +115,7 @@ extern inline void pgd_set(pgd_t * pgdp,
+ #define __pte_page(pte) ((unsigned long)__va(pte_val(pte) & PAGE_MASK))
+ #define __pmd_page(pmd) ((unsigned long)__va(pmd_val(pmd) & _TABLE_MASK))
+ #define __pgd_page(pgd) ((unsigned long)__va(pgd_val(pgd) & _TABLE_MASK))
++#define pgd_page(pgd)	virt_to_page(__pgd_page(pgd))
+ 
+ 
+ #define pte_none(pte)		(!pte_val(pte))
+@@ -203,6 +204,12 @@ extern inline pmd_t * pmd_offset(pgd_t *
+ 	return (pmd_t *)__pgd_page(*dir) + ((address >> PMD_SHIFT) & (PTRS_PER_PMD-1));
+ }
+ 
++#define pmd_offset_kernel(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)					do { } while (0)
++#define pmd_unmap_nested(pmd)				do { } while (0)
++
+ /* Find an entry in the third-level page table.. */ 
+ extern inline pte_t * pte_offset_kernel(pmd_t * pmdp, unsigned long address)
+ {
+--- linux-2.6.0-test1/include/asm-m68knommu/pgtable.h	2003-06-14 12:18:23.000000000 -0700
++++ 25/include/asm-m68knommu/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -21,7 +21,12 @@ typedef pte_t *pte_addr_t;
+ #define pgd_bad(pgd)		(0)
+ #define pgd_clear(pgdp)
+ #define kern_addr_valid(addr)	(1)
+-#define	pmd_offset(a, b)	((void *)0)
++#define	pmd_offset(a, b)		((void *)0)
++#define	pmd_offset_kernel(a, b)		pmd_offset(a, b)
++#define	pmd_offset_map(a, b)		pmd_offset(a, b)
++#define	pmd_offset_map_nested(a, b)	pmd_offset(a, b)
++#define pmd_unmap(pmd)			do { } while (0)
++#define pmd_unmap_nested(pmd)		do { } while (0)
+ 
+ #define PAGE_NONE	__pgprot(0)
+ #define PAGE_SHARED	__pgprot(0)
+--- linux-2.6.0-test1/include/asm-m68k/posix_types.h	2003-06-14 12:17:58.000000000 -0700
++++ 25/include/asm-m68k/posix_types.h	2003-07-19 17:06:39.000000000 -0700
+@@ -7,7 +7,9 @@
+  * assume GCC is being used.
+  */
+ 
+-typedef unsigned short	__kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long	__kernel_dev_t;
++#endif
+ typedef unsigned long	__kernel_ino_t;
+ typedef unsigned short	__kernel_mode_t;
+ typedef unsigned short	__kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-m68k/sun3_pgalloc.h	2003-06-14 12:18:08.000000000 -0700
++++ 25/include/asm-m68k/sun3_pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -18,7 +18,8 @@
+ 
+ extern const char bad_pmd_string[];
+ 
+-#define pmd_alloc_one(mm,address)       ({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm,address)		({ BUG(); ((struct page *)2); })
++#define pmd_alloc_one_kernel(mm,address)	({ BUG(); ((pmd_t *)2); })
+ 
+ 
+ static inline void pte_free_kernel(pte_t * pte)
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-mips64/lockmeter.h	2003-07-19 17:06:40.000000000 -0700
+@@ -0,0 +1,120 @@
++/*
++ *  Copyright (C) 1999,2000 Silicon Graphics, Inc.
++ *
++ *  Written by John Hawkes (hawkes@sgi.com)
++ *  Based on klstat.h by Jack Steiner (steiner@sgi.com)
++ */
++
++#ifndef _ASM_LOCKMETER_H
++#define _ASM_LOCKMETER_H
++
++#include <linux/time.h>
++
++#define SPINLOCK_MAGIC_INIT	/* */
++
++#define CPU_CYCLE_FREQUENCY	get_cpu_cycle_frequency()
++
++#define THIS_CPU_NUMBER		smp_processor_id()
++
++static uint32_t cpu_cycle_frequency = 0;
++
++static uint32_t get_cpu_cycle_frequency(void)
++{
++    /* a total hack, slow and invasive, but ... it works */
++    int sec;
++    uint32_t start_cycles;
++    struct timeval tv;
++
++    if (cpu_cycle_frequency == 0) {	/* uninitialized */
++	do_gettimeofday(&tv);
++	sec = tv.tv_sec;	/* set up to catch the tv_sec rollover */
++	while (sec == tv.tv_sec) { do_gettimeofday(&tv); }
++	sec = tv.tv_sec;	/* rolled over to a new sec value */
++	start_cycles = get_cycles();
++	while (sec == tv.tv_sec) { do_gettimeofday(&tv); }
++	cpu_cycle_frequency = get_cycles() - start_cycles;
++    }
++
++    return cpu_cycle_frequency;
++}
++
++extern struct timeval xtime;
++extern long do_gettimeoffset(void);
++
++static uint64_t get_cycles64(void)
++{
++    static uint64_t last_get_cycles64 = 0;
++    uint64_t ret;
++    unsigned long sec;
++    unsigned long usec, usec_offset;
++
++again:
++    sec  = xtime.tv_sec;
++    usec = xtime.tv_usec;
++    usec_offset = do_gettimeoffset();
++    if ((xtime.tv_sec != sec)  ||
++	(xtime.tv_usec != usec)||
++	(usec_offset >= 20000))
++	goto again;
++
++    ret =  ((uint64_t)sec * cpu_cycle_frequency)
++	+ ( ((uint64_t)(usec + usec_offset) * cpu_cycle_frequency) / 1000000 );
++
++    /* XXX why does time go backwards?  do_gettimeoffset?  general time adj? */
++    if (ret <= last_get_cycles64)
++	ret  = last_get_cycles64+1;
++    last_get_cycles64 = ret;
++
++    return ret;
++}
++
++/*
++ * macros to cache and retrieve an index value inside of a lock
++ * these macros assume that there are less than 65536 simultaneous
++ * (read mode) holders of a rwlock.
++ * we also assume that the hash table has less than 32767 entries.
++ * the high order bit is used for write locking a rw_lock
++ */
++#define INDEX_MASK   0x7FFF0000
++#define READERS_MASK 0x0000FFFF
++#define INDEX_SHIFT 16
++#define PUT_INDEX(lockp,index)   \
++        lockp->lock = (((lockp->lock) & ~INDEX_MASK) | (index) << INDEX_SHIFT)
++#define GET_INDEX(lockp) \
++        (((lockp->lock) & INDEX_MASK) >> INDEX_SHIFT)
++
++/*
++ * macros to cache and retrieve an index value in a read/write lock
++ * as well as the cpu where a reader busy period started
++ * we use the 2nd word (the debug word) for this, so require the
++ * debug word to be present
++ */
++/*
++ * instrumented rwlock structure -- never used to allocate storage
++ * only used in macros below to overlay a rwlock_t
++ */
++typedef struct inst_rwlock_s {
++	volatile int lock;
++	unsigned short index;
++	unsigned short cpu;
++} inst_rwlock_t;
++#define PUT_RWINDEX(rwlock_ptr,indexv) ((inst_rwlock_t *)(rwlock_ptr))->index = indexv
++#define GET_RWINDEX(rwlock_ptr)        ((inst_rwlock_t *)(rwlock_ptr))->index
++#define PUT_RW_CPU(rwlock_ptr,cpuv)    ((inst_rwlock_t *)(rwlock_ptr))->cpu = cpuv
++#define GET_RW_CPU(rwlock_ptr)         ((inst_rwlock_t *)(rwlock_ptr))->cpu
++
++/*
++ * return the number of readers for a rwlock_t
++ */
++#define RWLOCK_READERS(rwlock_ptr)   rwlock_readers(rwlock_ptr)
++
++extern inline int rwlock_readers(rwlock_t *rwlock_ptr)
++{
++	int tmp = (int) rwlock_ptr->lock;
++	return (tmp >= 0) ? tmp : 0;
++}
++
++#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) ((rwlock_ptr)->lock < 0)
++#define RWLOCK_IS_READ_LOCKED(rwlock_ptr)  ((rwlock_ptr)->lock > 0)
++
++#endif /* _ASM_LOCKMETER_H */
+--- linux-2.6.0-test1/include/asm-mips64/pgalloc.h	2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-mips64/pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -28,7 +28,7 @@ static inline void pmd_populate(struct m
+ 	set_pmd(pmd, __pmd((PAGE_OFFSET + page_to_pfn(pte)) << PAGE_SHIFT));
+ }
+ 
+-#define pgd_populate(mm, pgd, pmd)		set_pgd(pgd, __pgd(pmd))
++#define pgd_populate(mm, pgd, pmd)		set_pgd(pgd, __pgd(page_address(pmd)))
+ 
+ static inline pgd_t *pgd_alloc(struct mm_struct *mm)
+ {
+@@ -88,7 +88,7 @@ static inline void pte_free(struct page 
+ #define __pte_free_tlb(tlb,pte)		tlb_remove_page((tlb),(pte))
+ #define __pmd_free_tlb(tlb,x)		do { } while (0)
+ 
+-static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
++static inline pmd_t *pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
+ {
+ 	pmd_t *pmd;
+ 
+@@ -98,9 +98,18 @@ static inline pmd_t *pmd_alloc_one(struc
+ 	return pmd;
+ }
+ 
+-static inline void pmd_free(pmd_t *pmd)
++static inline struct page *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
+ {
+-	free_pages((unsigned long)pmd, PMD_ORDER);
++	pmd_t *pmd = pmd_alloc_one_kernel(mm, addr);
++	if (pmd)
++		return virt_to_page(pmd);
++	else
++		return NULL;
++}
++
++static inline void pmd_free(struct page *pmd)
++{
++	__free_pages(pmd, PMD_ORDER);
+ }
+ 
+ extern pte_t kptbl[(PAGE_SIZE << PGD_ORDER)/sizeof(pte_t)];
+--- linux-2.6.0-test1/include/asm-mips64/pgtable.h	2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-mips64/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -155,11 +155,13 @@ extern pmd_t empty_bad_pmd_table[2*PAGE_
+ #define pmd_page(pmd)		(pfn_to_page(pmd_phys(pmd) >> PAGE_SHIFT))
+ #define pmd_page_kernel(pmd)	pmd_val(pmd)
+ 
+-static inline unsigned long pgd_page(pgd_t pgd)
++static inline unsigned long __pgd_page(pgd_t pgd)
+ {
+ 	return pgd_val(pgd);
+ }
+ 
++#define pgd_page(pgd)		virt_to_page(__pgd_page(pgd))
++
+ static inline int pte_none(pte_t pte)
+ {
+ 	return !(pte_val(pte) & ~_PAGE_GLOBAL);
+@@ -397,10 +399,16 @@ static inline pte_t pte_modify(pte_t pte
+ /* Find an entry in the second-level page table.. */
+ static inline pmd_t *pmd_offset(pgd_t * dir, unsigned long address)
+ {
+-	return (pmd_t *) pgd_page(*dir) +
++	return (pmd_t *)__pgd_page(*dir) +
+ 	       ((address >> PMD_SHIFT) & (PTRS_PER_PMD - 1));
+ }
+ 
++#define pmd_offset_kernel(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)					do { } while(0)
++#define pmd_unmap_nested(pmd)				do { } while(0)
++
+ /* Find an entry in the third-level page table.. */
+ #define __pte_offset(address)						\
+ 	(((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
+--- linux-2.6.0-test1/include/asm-mips64/posix_types.h	2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-mips64/posix_types.h	2003-07-19 17:06:39.000000000 -0700
+@@ -15,7 +15,9 @@
+  * assume GCC is being used.
+  */
+ 
+-typedef unsigned int	__kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long	__kernel_dev_t;
++#endif
+ typedef unsigned long	__kernel_ino_t;
+ typedef unsigned int	__kernel_mode_t;
+ typedef unsigned int	__kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-mips64/smp.h	2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-mips64/smp.h	2003-07-19 17:04:07.000000000 -0700
+@@ -17,6 +17,7 @@
+ 
+ #include <linux/bitops.h>
+ #include <linux/threads.h>
++#include <linux/cpumask.h>
+ #include <asm/atomic.h>
+ 
+ #define smp_processor_id()	(current_thread_info()->cpu)
+@@ -45,56 +46,17 @@ extern struct call_data_struct *call_dat
+ #define SMP_RESCHEDULE_YOURSELF	0x1	/* XXX braindead */
+ #define SMP_CALL_FUNCTION	0x2
+ 
+-#if (NR_CPUS <= _MIPS_SZLONG)
+-
+-typedef unsigned long   cpumask_t;
+-
+-#define CPUMASK_CLRALL(p)	(p) = 0
+-#define CPUMASK_SETB(p, bit)	(p) |= 1UL << (bit)
+-#define CPUMASK_CLRB(p, bit)	(p) &= ~(1UL << (bit))
+-#define CPUMASK_TSTB(p, bit)	((p) & (1UL << (bit)))
+-
+-#elif (NR_CPUS <= 128)
+-
+-/*
+- * The foll should work till 128 cpus.
+- */
+-#define CPUMASK_SIZE		(NR_CPUS/_MIPS_SZLONG)
+-#define CPUMASK_INDEX(bit)	((bit) >> 6)
+-#define CPUMASK_SHFT(bit)	((bit) & 0x3f)
+-
+-typedef struct {
+-	unsigned long	_bits[CPUMASK_SIZE];
+-} cpumask_t;
+-
+-#define	CPUMASK_CLRALL(p)	(p)._bits[0] = 0, (p)._bits[1] = 0
+-#define CPUMASK_SETB(p, bit)	(p)._bits[CPUMASK_INDEX(bit)] |= \
+-					(1UL << CPUMASK_SHFT(bit))
+-#define CPUMASK_CLRB(p, bit)	(p)._bits[CPUMASK_INDEX(bit)] &= \
+-					~(1UL << CPUMASK_SHFT(bit))
+-#define CPUMASK_TSTB(p, bit)	((p)._bits[CPUMASK_INDEX(bit)] & \
+-					(1UL << CPUMASK_SHFT(bit)))
+-
+-#else
+-#error cpumask macros only defined for 128p kernels
+-#endif
+-
+ extern cpumask_t phys_cpu_present_map;
+ extern cpumask_t cpu_online_map;
+ 
+-#define cpu_possible(cpu) (phys_cpu_present_map & (1<<(cpu)))
+-#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
+-
+-extern inline unsigned int num_online_cpus(void)
+-{
+-	return hweight32(cpu_online_map);
+-}
++#define cpu_possible(cpu) cpu_isset(cpu, phys_cpu_present_map)
++#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
+ 
+-extern volatile unsigned long cpu_callout_map;
++extern cpumask_t cpu_callout_map;
+ /* We don't mark CPUs online until __cpu_up(), so we need another measure */
+ static inline int num_booting_cpus(void)
+ {
+-	return hweight32(cpu_callout_map);
++	return cpus_weight(cpu_callout_map);
+ }
+ 
+ #endif /* CONFIG_SMP */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-mips/lockmeter.h	2003-07-19 17:06:40.000000000 -0700
+@@ -0,0 +1,126 @@
++/*
++ *  Copyright (C) 1999,2000 Silicon Graphics, Inc.
++ *
++ *  Written by John Hawkes (hawkes@sgi.com)
++ *  Based on klstat.h by Jack Steiner (steiner@sgi.com)
++ *  Ported to mips32 for Asita Technologies
++ *   by D.J. Barrow ( dj.barrow@asitatechnologies.com )
++ */
++#ifndef _ASM_LOCKMETER_H
++#define _ASM_LOCKMETER_H
++
++/* do_gettimeoffset is a function pointer on mips */
++/* & it is not included by <linux/time.h> */
++#include <asm/time.h>
++#include <linux/time.h>
++#include <asm/div64.h>
++
++#define SPINLOCK_MAGIC_INIT	/* */
++
++#define CPU_CYCLE_FREQUENCY	get_cpu_cycle_frequency()
++
++#define THIS_CPU_NUMBER		smp_processor_id()
++
++static uint32_t cpu_cycle_frequency = 0;
++
++static uint32_t get_cpu_cycle_frequency(void)
++{
++    /* a total hack, slow and invasive, but ... it works */
++    int sec;
++    uint32_t start_cycles;
++    struct timeval tv;
++
++    if (cpu_cycle_frequency == 0) {	/* uninitialized */
++	do_gettimeofday(&tv);
++	sec = tv.tv_sec;	/* set up to catch the tv_sec rollover */
++	while (sec == tv.tv_sec) { do_gettimeofday(&tv); }
++	sec = tv.tv_sec;	/* rolled over to a new sec value */
++	start_cycles = get_cycles();
++	while (sec == tv.tv_sec) { do_gettimeofday(&tv); }
++	cpu_cycle_frequency = get_cycles() - start_cycles;
++    }
++
++    return cpu_cycle_frequency;
++}
++
++extern struct timeval xtime;
++
++static uint64_t get_cycles64(void)
++{
++    static uint64_t last_get_cycles64 = 0;
++    uint64_t ret;
++    unsigned long sec;
++    unsigned long usec, usec_offset;
++
++again:
++    sec  = xtime.tv_sec;
++    usec = xtime.tv_usec;
++    usec_offset = do_gettimeoffset();
++    if ((xtime.tv_sec != sec)  ||
++	(xtime.tv_usec != usec)||
++	(usec_offset >= 20000))
++	goto again;
++
++    ret = ((uint64_t)(usec + usec_offset) * cpu_cycle_frequency);
++    /* We can't do a normal 64 bit division on mips without libgcc.a */
++    do_div(ret,1000000);
++    ret +=  ((uint64_t)sec * cpu_cycle_frequency);
++
++    /* XXX why does time go backwards?  do_gettimeoffset?  general time adj? */
++    if (ret <= last_get_cycles64)
++	ret  = last_get_cycles64+1;
++    last_get_cycles64 = ret;
++
++    return ret;
++}
++
++/*
++ * macros to cache and retrieve an index value inside of a lock
++ * these macros assume that there are less than 65536 simultaneous
++ * (read mode) holders of a rwlock.
++ * we also assume that the hash table has less than 32767 entries.
++ * the high order bit is used for write locking a rw_lock
++ */
++#define INDEX_MASK   0x7FFF0000
++#define READERS_MASK 0x0000FFFF
++#define INDEX_SHIFT 16
++#define PUT_INDEX(lockp,index)   \
++        lockp->lock = (((lockp->lock) & ~INDEX_MASK) | (index) << INDEX_SHIFT)
++#define GET_INDEX(lockp) \
++        (((lockp->lock) & INDEX_MASK) >> INDEX_SHIFT)
++
++/*
++ * macros to cache and retrieve an index value in a read/write lock
++ * as well as the cpu where a reader busy period started
++ * we use the 2nd word (the debug word) for this, so require the
++ * debug word to be present
++ */
++/*
++ * instrumented rwlock structure -- never used to allocate storage
++ * only used in macros below to overlay a rwlock_t
++ */
++typedef struct inst_rwlock_s {
++	volatile int lock;
++	unsigned short index;
++	unsigned short cpu;
++} inst_rwlock_t;
++#define PUT_RWINDEX(rwlock_ptr,indexv) ((inst_rwlock_t *)(rwlock_ptr))->index = indexv
++#define GET_RWINDEX(rwlock_ptr)        ((inst_rwlock_t *)(rwlock_ptr))->index
++#define PUT_RW_CPU(rwlock_ptr,cpuv)    ((inst_rwlock_t *)(rwlock_ptr))->cpu = cpuv
++#define GET_RW_CPU(rwlock_ptr)         ((inst_rwlock_t *)(rwlock_ptr))->cpu
++
++/*
++ * return the number of readers for a rwlock_t
++ */
++#define RWLOCK_READERS(rwlock_ptr)   rwlock_readers(rwlock_ptr)
++
++extern inline int rwlock_readers(rwlock_t *rwlock_ptr)
++{
++	int tmp = (int) rwlock_ptr->lock;
++	return (tmp >= 0) ? tmp : 0;
++}
++
++#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) ((rwlock_ptr)->lock < 0)
++#define RWLOCK_IS_READ_LOCKED(rwlock_ptr)  ((rwlock_ptr)->lock > 0)
++
++#endif /* _ASM_LOCKMETER_H */
+--- linux-2.6.0-test1/include/asm-mips/pgalloc.h	2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-mips/pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -96,7 +96,8 @@ static inline void pte_free(struct page 
+  * allocating and freeing a pmd is trivial: the 1-entry pmd is
+  * inside the pgd, so has no extra memory associated with it.
+  */
+-#define pmd_alloc_one(mm, addr)		({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm, addr)		({ BUG(); ((struct page *)2); })
++#define pmd_alloc_one_kernel(mm, addr)	({ BUG(); ((pmd_t *)2); })
+ #define pmd_free(x)			do { } while (0)
+ #define __pmd_free_tlb(tlb,x)		do { } while (0)
+ 
+--- linux-2.6.0-test1/include/asm-mips/pgtable.h	2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-mips/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -374,6 +374,12 @@ static inline pmd_t *pmd_offset(pgd_t *d
+ 	return (pmd_t *) dir;
+ }
+ 
++#define pmd_offset_kernel(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)					do { } while (0)
++#define pmd_unmap_nested(pmd)				do { } while (0)
++
+ /* Find an entry in the third-level page table.. */
+ #define __pte_offset(address)						\
+ 	(((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
+--- linux-2.6.0-test1/include/asm-mips/posix_types.h	2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-mips/posix_types.h	2003-07-19 17:06:39.000000000 -0700
+@@ -14,7 +14,9 @@
+  * assume GCC is being used.
+  */
+ 
+-typedef unsigned int	__kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long	__kernel_dev_t;
++#endif
+ typedef unsigned long	__kernel_ino_t;
+ typedef unsigned int	__kernel_mode_t;
+ typedef unsigned long	__kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-mips/smp.h	2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-mips/smp.h	2003-07-19 17:04:07.000000000 -0700
+@@ -17,6 +17,7 @@
+ 
+ #include <linux/bitops.h>
+ #include <linux/threads.h>
++#include <linux/cpumask.h>
+ #include <asm/atomic.h>
+ 
+ #define smp_processor_id()	(current_thread_info()->cpu)
+@@ -45,56 +46,17 @@ extern struct call_data_struct *call_dat
+ #define SMP_RESCHEDULE_YOURSELF	0x1	/* XXX braindead */
+ #define SMP_CALL_FUNCTION	0x2
+ 
+-#if (NR_CPUS <= _MIPS_SZLONG)
+-
+-typedef unsigned long   cpumask_t;
+-
+-#define CPUMASK_CLRALL(p)	(p) = 0
+-#define CPUMASK_SETB(p, bit)	(p) |= 1UL << (bit)
+-#define CPUMASK_CLRB(p, bit)	(p) &= ~(1UL << (bit))
+-#define CPUMASK_TSTB(p, bit)	((p) & (1UL << (bit)))
+-
+-#elif (NR_CPUS <= 128)
+-
+-/*
+- * The foll should work till 128 cpus.
+- */
+-#define CPUMASK_SIZE		(NR_CPUS/_MIPS_SZLONG)
+-#define CPUMASK_INDEX(bit)	((bit) >> 6)
+-#define CPUMASK_SHFT(bit)	((bit) & 0x3f)
+-
+-typedef struct {
+-	unsigned long	_bits[CPUMASK_SIZE];
+-} cpumask_t;
+-
+-#define	CPUMASK_CLRALL(p)	(p)._bits[0] = 0, (p)._bits[1] = 0
+-#define CPUMASK_SETB(p, bit)	(p)._bits[CPUMASK_INDEX(bit)] |= \
+-					(1UL << CPUMASK_SHFT(bit))
+-#define CPUMASK_CLRB(p, bit)	(p)._bits[CPUMASK_INDEX(bit)] &= \
+-					~(1UL << CPUMASK_SHFT(bit))
+-#define CPUMASK_TSTB(p, bit)	((p)._bits[CPUMASK_INDEX(bit)] & \
+-					(1UL << CPUMASK_SHFT(bit)))
+-
+-#else
+-#error cpumask macros only defined for 128p kernels
+-#endif
+-
+ extern cpumask_t phys_cpu_present_map;
+ extern cpumask_t cpu_online_map;
+ 
+-#define cpu_possible(cpu) (phys_cpu_present_map & (1<<(cpu)))
+-#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
+-
+-extern inline unsigned int num_online_cpus(void)
+-{
+-	return hweight32(cpu_online_map);
+-}
++#define cpu_possible(cpu) cpu_isset(cpu, phys_cpu_present_map)
++#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
+ 
+-extern volatile unsigned long cpu_callout_map;
++extern cpumask_t cpu_callout_map;
+ /* We don't mark CPUs online until __cpu_up(), so we need another measure */
+ static inline int num_booting_cpus(void)
+ {
+-	return hweight32(cpu_callout_map);
++	return cpus_weight(cpu_callout_map);
+ }
+ 
+ #endif /* CONFIG_SMP */
+--- linux-2.6.0-test1/include/asm-mips/spinlock.h	2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-mips/spinlock.h	2003-07-19 17:06:40.000000000 -0700
+@@ -91,9 +91,18 @@ static inline unsigned int _raw_spin_try
+ 
+ typedef struct {
+ 	volatile unsigned int lock;
++#ifdef CONFIG_LOCKMETER
++	/* required for LOCKMETER since all bits in lock are used */
++	/* and we need this storage for CPU and lock INDEX        */
++	unsigned lockmeter_magic;
++#endif
+ } rwlock_t;
+ 
++#ifdef CONFIG_LOCKMETER
++#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0 }
++#else
+ #define RW_LOCK_UNLOCKED (rwlock_t) { 0 }
++#endif
+ 
+ #define rwlock_init(x)  do { *(x) = RW_LOCK_UNLOCKED; } while(0)
+ 
+--- linux-2.6.0-test1/include/asm-parisc/pgalloc.h	2003-06-14 12:18:35.000000000 -0700
++++ 25/include/asm-parisc/pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -28,12 +28,12 @@ static inline void pgd_free(pgd_t *pgd)
+ 
+ /* Three Level Page Table Support for pmd's */
+ 
+-static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd)
++static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, struct page *pmd)
+ {
+-	pgd_val(*pgd) = _PAGE_TABLE + __pa((unsigned long)pmd);
++	pgd_val(*pgd) = _PAGE_TABLE + __pa(page_address(pmd));
+ }
+ 
+-static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
++static inline pmd_t *pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
+ {
+ 	pmd_t *pmd = (pmd_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT);
+ 	if (pmd)
+@@ -41,9 +41,18 @@ static inline pmd_t *pmd_alloc_one(struc
+ 	return pmd;
+ }
+ 
+-static inline void pmd_free(pmd_t *pmd)
++static inline struct page *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
+ {
+-	free_page((unsigned long)pmd);
++	pmd_t *pmd = pmd_alloc_one_kernel(mm, addr);
++	if (pmd)
++		return virt_to_page(pmd);
++	else
++		return NULL;
++}
++
++static inline void pmd_free(struct page *pmd)
++{
++	__free_page(pmd);
+ }
+ 
+ #else
+@@ -55,7 +64,8 @@ static inline void pmd_free(pmd_t *pmd)
+  * inside the pgd, so has no extra memory associated with it.
+  */
+ 
+-#define pmd_alloc_one(mm, addr)		({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm, addr)		({ BUG(); ((struct page *)2); })
++#define pmd_alloc_one_kernel(mm, addr)	pmd_alloc_one(mm, addr)
+ #define pmd_free(x)			do { } while (0)
+ #define pgd_populate(mm, pmd, pte)	BUG()
+ 
+--- linux-2.6.0-test1/include/asm-parisc/pgtable.h	2003-07-13 21:44:35.000000000 -0700
++++ 25/include/asm-parisc/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -242,7 +242,8 @@ extern unsigned long *empty_zero_page;
+ 
+ 
+ #ifdef __LP64__
+-#define pgd_page(pgd) ((unsigned long) __va(pgd_val(pgd) & PAGE_MASK))
++#define __pgd_page(pgd) ((unsigned long) __va(pgd_val(pgd) & PAGE_MASK))
++#define pgd_page(pgd)	virt_to_page(__pgd_page(pgd))
+ 
+ /* For 64 bit we have three level tables */
+ 
+@@ -339,11 +340,17 @@ extern inline pte_t pte_modify(pte_t pte
+ 
+ #ifdef __LP64__
+ #define pmd_offset(dir,address) \
+-((pmd_t *) pgd_page(*(dir)) + (((address)>>PMD_SHIFT) & (PTRS_PER_PMD-1)))
++((pmd_t *)__pgd_page(*(dir)) + (((address)>>PMD_SHIFT) & (PTRS_PER_PMD-1)))
+ #else
+ #define pmd_offset(dir,addr) ((pmd_t *) dir)
+ #endif
+ 
++#define pmd_offset_kernel(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)	pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)				do { } while (0)
++#define pmd_unmap_nested(pmd)			do { } while (0)
++
+ /* 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) \
+--- linux-2.6.0-test1/include/asm-parisc/posix_types.h	2003-06-14 12:18:30.000000000 -0700
++++ 25/include/asm-parisc/posix_types.h	2003-07-19 17:06:39.000000000 -0700
+@@ -6,7 +6,9 @@
+  * be a little careful about namespace pollution etc.  Also, we cannot
+  * assume GCC is being used.
+  */
+-typedef unsigned int		__kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long	__kernel_dev_t;
++#endif
+ typedef unsigned long		__kernel_ino_t;
+ typedef unsigned short		__kernel_mode_t;
+ typedef unsigned short		__kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-parisc/smp.h	2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-parisc/smp.h	2003-07-19 17:04:07.000000000 -0700
+@@ -14,9 +14,10 @@
+ #ifndef ASSEMBLY
+ #include <linux/bitops.h>
+ #include <linux/threads.h>	/* for NR_CPUS */
++#include <linux/cpumask.h>
+ typedef unsigned long address_t;
+ 
+-extern volatile unsigned long cpu_online_map;
++extern cpumask_t cpu_online_map;
+ 
+ 
+ /*
+@@ -51,22 +52,10 @@ extern void smp_send_reschedule(int cpu)
+ extern unsigned long cpu_present_mask;
+ 
+ #define smp_processor_id()	(current_thread_info()->cpu)
+-#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
++#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
+ 
+-#define cpu_possible(cpu)       (cpu_present_mask & (1<<(cpu)))
++#define cpu_possible(cpu)       cpu_isset(cpu, cpu_present_mask)
+ 
+-extern inline unsigned int num_online_cpus(void)
+-{
+-	return hweight32(cpu_online_map);
+-}
+-
+-extern inline unsigned int any_online_cpu(unsigned int mask)
+-{
+-	if (mask & cpu_online_map)
+-		return __ffs(mask & cpu_online_map);
+-
+-	return NR_CPUS;
+-}
+ #endif /* CONFIG_SMP */
+ 
+ #define NO_PROC_ID		0xFF		/* No processor magic marker */
+--- linux-2.6.0-test1/include/asm-ppc64/mmu_context.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-ppc64/mmu_context.h	2003-07-19 17:04:07.000000000 -0700
+@@ -143,7 +143,7 @@ switch_mm(struct mm_struct *prev, struct
+ 	  struct task_struct *tsk)
+ {
+ 	flush_stab(tsk, next);
+-	set_bit(smp_processor_id(), &next->cpu_vm_mask);
++	cpu_set(smp_processor_id(), next->cpu_vm_mask);
+ }
+ 
+ #define deactivate_mm(tsk,mm)	do { } while (0)
+--- linux-2.6.0-test1/include/asm-ppc64/pgalloc.h	2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-ppc64/pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -26,10 +26,10 @@ pgd_free(pgd_t *pgd)
+ 	free_page((unsigned long)pgd);
+ }
+ 
+-#define pgd_populate(MM, PGD, PMD)	pgd_set(PGD, PMD)
++#define pgd_populate(MM, PGD, PMD)	pgd_set(PGD, page_address(PMD))
+ 
+ static inline pmd_t *
+-pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
++pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
+ {
+ 	pmd_t *pmd;
+ 
+@@ -39,10 +39,19 @@ pmd_alloc_one(struct mm_struct *mm, unsi
+ 	return pmd;
+ }
+ 
++static inline struct page *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
++{
++	pmd_t *pmd = pmd_alloc_one_kernel(mm, addr);
++	if (pmd)
++		return virt_to_page(pmd);
++	else
++		return NULL;
++}
++
+ static inline void
+-pmd_free(pmd_t *pmd)
++pmd_free(struct page *pmd)
+ {
+-	free_page((unsigned long)pmd);
++	__free_page(pmd);
+ }
+ 
+ #define __pmd_free_tlb(tlb, pmd)	pmd_free(pmd)
+--- linux-2.6.0-test1/include/asm-ppc64/pgtable.h	2003-06-14 12:18:34.000000000 -0700
++++ 25/include/asm-ppc64/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -190,7 +190,8 @@ extern unsigned long empty_zero_page[PAG
+ #define pgd_bad(pgd)		((pgd_val(pgd)) == 0)
+ #define pgd_present(pgd)	(pgd_val(pgd) != 0UL)
+ #define pgd_clear(pgdp)		(pgd_val(*(pgdp)) = 0UL)
+-#define pgd_page(pgd)		(__bpn_to_ba(pgd_val(pgd))) 
++#define __pgd_page(pgd)		(__bpn_to_ba(pgd_val(pgd)))
++#define pgd_page(pgd)		virt_to_page(__pgd_page(pgd))
+ 
+ /* 
+  * Find an entry in a page-table-directory.  We combine the address region 
+@@ -203,12 +204,18 @@ extern unsigned long empty_zero_page[PAG
+ 
+ /* Find an entry in the second-level page table.. */
+ #define pmd_offset(dir,addr) \
+-  ((pmd_t *) pgd_page(*(dir)) + (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)))
++  ((pmd_t *)__pgd_page(*(dir)) + (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)))
+ 
+ /* Find an entry in the third-level page table.. */
+ #define pte_offset_kernel(dir,addr) \
+   ((pte_t *) pmd_page_kernel(*(dir)) + (((addr) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)))
+ 
++#define pmd_offset_kernel(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)	pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)				do { } while (0)
++#define pmd_unmap_nested(pmd)			do { } while (0)
++
+ #define pte_offset_map(dir,addr)	pte_offset_kernel((dir), (addr))
+ #define pte_offset_map_nested(dir,addr)	pte_offset_kernel((dir), (addr))
+ #define pte_unmap(pte)			do { } while(0)
+--- linux-2.6.0-test1/include/asm-ppc64/semaphore.h	2003-06-26 22:07:26.000000000 -0700
++++ 25/include/asm-ppc64/semaphore.h	2003-07-19 17:04:51.000000000 -0700
+@@ -22,6 +22,7 @@ struct semaphore {
+ 	 * sleeping on `wait'.
+ 	 */
+ 	atomic_t count;
++	int sleepers;
+ 	wait_queue_head_t wait;
+ #ifdef WAITQUEUE_DEBUG
+ 	long __magic;
+@@ -37,6 +38,7 @@ struct semaphore {
+ 
+ #define __SEMAPHORE_INITIALIZER(name, count) \
+ 	{ ATOMIC_INIT(count), \
++	  0, \
+ 	  __WAIT_QUEUE_HEAD_INITIALIZER((name).wait) \
+ 	  __SEM_DEBUG_INIT(name) }
+ 
+@@ -52,6 +54,7 @@ struct semaphore {
+ static inline void sema_init (struct semaphore *sem, int val)
+ {
+ 	atomic_set(&sem->count, val);
++	sem->sleepers = 0;
+ 	init_waitqueue_head(&sem->wait);
+ #ifdef WAITQUEUE_DEBUG
+ 	sem->__magic = (long)&sem->__magic;
+--- linux-2.6.0-test1/include/asm-ppc64/smp.h	2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-ppc64/smp.h	2003-07-19 17:04:07.000000000 -0700
+@@ -19,6 +19,7 @@
+ 
+ #include <linux/config.h>
+ #include <linux/threads.h>
++#include <linux/cpumask.h>
+ #include <linux/kernel.h>
+ 
+ #ifdef CONFIG_SMP
+@@ -27,31 +28,13 @@
+ 
+ #include <asm/paca.h>
+ 
+-extern unsigned long cpu_online_map;
+-
+ extern void smp_message_pass(int target, int msg, unsigned long data, int wait);
+ extern void smp_send_tlb_invalidate(int);
+ extern void smp_send_xmon_break(int cpu);
+ struct pt_regs;
+ extern void smp_message_recv(int, struct pt_regs *);
+ 
+-#define cpu_online(cpu)	test_bit((cpu), &cpu_online_map)
+-
+ #define cpu_possible(cpu)	paca[cpu].active
+-
+-static inline unsigned int num_online_cpus(void)
+-{
+-	return hweight64(cpu_online_map);
+-}
+-
+-static inline unsigned int any_online_cpu(unsigned int mask)
+-{
+-	if (mask & cpu_online_map)
+-		return __ffs(mask & cpu_online_map);
+-
+-	return NR_CPUS;
+-}
+-
+ #define smp_processor_id() (get_paca()->xPacaIndex)
+ 
+ /* Since OpenPIC has only 4 IPIs, we use slightly different message numbers.
+--- linux-2.6.0-test1/include/asm-ppc64/tlb.h	2003-06-14 12:18:07.000000000 -0700
++++ 25/include/asm-ppc64/tlb.h	2003-07-19 17:04:07.000000000 -0700
+@@ -49,6 +49,7 @@ static inline void __tlb_remove_tlb_entr
+ 	struct ppc64_tlb_batch *batch = &ppc64_tlb_batch[cpu];
+ 	unsigned long i = batch->index;
+ 	pte_t pte;
++	cpumask_t local_cpumask = cpumask_of_cpu(cpu);
+ 
+ 	if (pte_val(*ptep) & _PAGE_HASHPTE) {
+ 		pte = __pte(pte_update(ptep, _PAGE_HPTEFLAGS, 0));
+@@ -61,7 +62,7 @@ static inline void __tlb_remove_tlb_entr
+ 			if (i == PPC64_TLB_BATCH_NR) {
+ 				int local = 0;
+ 
+-				if (tlb->mm->cpu_vm_mask == (1UL << cpu))
++				if (cpus_equal(tlb->mm->cpu_vm_mask, local_cpumask))
+ 					local = 1;
+ 
+ 				flush_hash_range(tlb->mm->context, i, local);
+@@ -78,8 +79,9 @@ static inline void tlb_flush(struct mmu_
+ 	int cpu = smp_processor_id();
+ 	struct ppc64_tlb_batch *batch = &ppc64_tlb_batch[cpu];
+ 	int local = 0;
++	cpumask_t local_cpumask = cpumask_of_cpu(smp_processor_id());
+ 
+-	if (tlb->mm->cpu_vm_mask == (1UL << smp_processor_id()))
++	if (cpus_equal(tlb->mm->cpu_vm_mask, local_cpumask))
+ 		local = 1;
+ 
+ 	flush_hash_range(tlb->mm->context, batch->index, local);
+--- linux-2.6.0-test1/include/asm-ppc/hardirq.h	2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-ppc/hardirq.h	2003-07-19 17:03:50.000000000 -0700
+@@ -14,8 +14,6 @@
+  */
+ typedef struct {
+ 	unsigned long __softirq_pending;	/* set_bit is used on this */
+-	unsigned int __syscall_count;
+-	struct task_struct * __ksoftirqd_task;
+ 	unsigned int __last_jiffy_stamp;
+ } ____cacheline_aligned irq_cpustat_t;
+ 
+--- linux-2.6.0-test1/include/asm-ppc/ipc.h	2003-06-14 12:18:52.000000000 -0700
++++ 25/include/asm-ppc/ipc.h	2003-07-19 17:03:50.000000000 -0700
+@@ -14,6 +14,7 @@ struct ipc_kludge {
+ #define SEMOP		 1
+ #define SEMGET		 2
+ #define SEMCTL		 3
++#define SEMTIMEDOP	 4
+ #define MSGSND		11
+ #define MSGRCV		12
+ #define MSGGET		13
+--- linux-2.6.0-test1/include/asm-ppc/pci.h	2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-ppc/pci.h	2003-07-19 17:03:50.000000000 -0700
+@@ -53,18 +53,12 @@ extern unsigned long phys_to_bus(unsigne
+ extern unsigned long pci_phys_to_bus(unsigned long pa, int busnr);
+ extern unsigned long pci_bus_to_phys(unsigned int ba, int busnr);
+     
+-/* Dynamic DMA Mapping stuff, stolen from i386
+- * 	++ajoshi
++/*
++ * Dynamic DMA Mapping stuff
++ * Originally stolen from i386 by ajoshi and updated by paulus
++ * Non-consistent cache support by Dan Malek
+  */
+ 
+-#include <linux/types.h>
+-#include <linux/slab.h>
+-#include <linux/string.h>
+-#include <asm/scatterlist.h>
+-#include <asm/io.h>
+-
+-struct pci_dev;
+-
+ /* The PCI address space does equal the physical memory
+  * address space.  The networking and block device layers use
+  * this boolean for bounce buffer decisions.
+@@ -101,8 +95,7 @@ extern void pci_free_consistent(struct p
+ static inline dma_addr_t pci_map_single(struct pci_dev *hwdev, void *ptr,
+ 					size_t size, int direction)
+ {
+-	if (direction == PCI_DMA_NONE)
+-		BUG();
++	BUG_ON(direction == PCI_DMA_NONE);
+ 
+ 	consistent_sync(ptr, size, direction);
+ 
+@@ -130,10 +123,11 @@ static inline void pci_unmap_single(stru
+  * to pci_map_single, but takes a struct page instead of a virtual address
+  */
+ static inline dma_addr_t pci_map_page(struct pci_dev *hwdev, struct page *page,
+-				      unsigned long offset, size_t size, int direction)
++				      unsigned long offset, size_t size,
++				      int direction)
+ {
+-	if (direction == PCI_DMA_NONE)
+-		BUG();
++	BUG_ON(direction == PCI_DMA_NONE);
++	consistent_sync_page(page, offset, size, direction);
+ 	return (page - mem_map) * PAGE_SIZE + PCI_DRAM_OFFSET + offset;
+ }
+ 
+@@ -171,10 +165,11 @@ static inline int pci_map_sg(struct pci_
+ 	/*
+ 	 * temporary 2.4 hack
+ 	 */
+-	for (i = 0; i < nents; i++) {
+-		if (!sg[i].page)
+-			BUG();
+-		sg[i].dma_address = page_to_bus(sg[i].page) + sg[i].offset;
++	for (i = 0; i < nents; i++, sg++) {
++		BUG_ON(!sg->page);
++		consistent_sync_page(sg->page, sg->offset,
++				     sg->length, direction);
++		sg->dma_address = page_to_bus(sg->page) + sg->offset;
+ 	}
+ 
+ 	return nents;
+@@ -187,8 +182,7 @@ static inline int pci_map_sg(struct pci_
+ static inline void pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg,
+ 				int nents, int direction)
+ {
+-	if (direction == PCI_DMA_NONE)
+-		BUG();
++	BUG_ON(direction == PCI_DMA_NONE);
+ 	/* nothing to do */
+ }
+ 
+@@ -205,8 +199,7 @@ static inline void pci_dma_sync_single(s
+ 				       dma_addr_t dma_handle,
+ 				       size_t size, int direction)
+ {
+-	if (direction == PCI_DMA_NONE)
+-		BUG();
++	BUG_ON(direction == PCI_DMA_NONE);
+ 
+ 	consistent_sync(bus_to_virt(dma_handle), size, direction);
+ }
+@@ -221,9 +214,13 @@ static inline void pci_dma_sync_sg(struc
+ 				   struct scatterlist *sg,
+ 				   int nelems, int direction)
+ {
+-	if (direction == PCI_DMA_NONE)
+-		BUG();
+-	/* nothing to do */
++	int i;
++
++	BUG_ON(direction == PCI_DMA_NONE);
++
++	for (i = 0; i < nelems; i++, sg++)
++		consistent_sync_page(sg->page, sg->offset,
++				     sg->length, direction);
+ }
+ 
+ /* Return whether the given PCI device DMA address mask can
+--- linux-2.6.0-test1/include/asm-ppc/pgalloc.h	2003-06-14 12:17:55.000000000 -0700
++++ 25/include/asm-ppc/pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -15,7 +15,8 @@ extern void pgd_free(pgd_t *pgd);
+  * We don't have any real pmd's, and this code never triggers because
+  * the pgd will always be present..
+  */
+-#define pmd_alloc_one(mm,address)       ({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm,address)       ({ BUG(); ((struct page *)2); })
++#define pmd_alloc_one_kernel(mm,addr)   ({ 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()
+--- linux-2.6.0-test1/include/asm-ppc/pgtable.h	2003-06-14 12:18:01.000000000 -0700
++++ 25/include/asm-ppc/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -370,8 +370,9 @@ static inline int pgd_bad(pgd_t pgd)		{ 
+ static inline int pgd_present(pgd_t pgd)	{ return 1; }
+ #define pgd_clear(xp)				do { } while (0)
+ 
+-#define pgd_page(pgd) \
++#define __pgd_page(pgd) \
+ 	((unsigned long) __va(pgd_val(pgd) & PAGE_MASK))
++#define pgd_page(pgd)	virt_to_page(__pgd_page(pgd))
+ 
+ /*
+  * The following only work if pte_present() is true.
+@@ -503,6 +504,12 @@ static inline pmd_t * pmd_offset(pgd_t *
+ 	return (pmd_t *) dir;
+ }
+ 
++#define pmd_offset_kernel(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)					do { } while (0)
++#define pmd_unmap_nested(pmd)				do { } while (0)
++
+ /* Find an entry in the third-level page table.. */
+ #define pte_index(address)		\
+ 	(((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
+--- linux-2.6.0-test1/include/asm-ppc/posix_types.h	2003-06-14 12:18:08.000000000 -0700
++++ 25/include/asm-ppc/posix_types.h	2003-07-19 17:06:39.000000000 -0700
+@@ -7,7 +7,9 @@
+  * assume GCC is being used.
+  */
+ 
+-typedef unsigned int	__kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long	__kernel_dev_t;
++#endif
+ typedef unsigned long	__kernel_ino_t;
+ typedef unsigned int	__kernel_mode_t;
+ typedef unsigned short	__kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-ppc/processor.h	2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-ppc/processor.h	2003-07-19 17:03:50.000000000 -0700
+@@ -705,6 +705,7 @@ struct thread_struct {
+ 	.ksp = INIT_SP, \
+ 	.fs = KERNEL_DS, \
+ 	.pgdir = swapper_pg_dir, \
++	.fpexc_mode = MSR_FE0 | MSR_FE1, \
+ }
+ 
+ /*
+--- linux-2.6.0-test1/include/asm-ppc/smp.h	2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-ppc/smp.h	2003-07-19 17:04:07.000000000 -0700
+@@ -14,6 +14,7 @@
+ #include <linux/kernel.h>
+ #include <linux/bitops.h>
+ #include <linux/errno.h>
++#include <linux/cpumask.h>
+ 
+ #ifdef CONFIG_SMP
+ 
+@@ -28,8 +29,8 @@ struct cpuinfo_PPC {
+ };
+ 
+ extern struct cpuinfo_PPC cpu_data[];
+-extern unsigned long cpu_online_map;
+-extern unsigned long cpu_possible_map;
++extern cpumask_t cpu_online_map;
++extern cpumask_t cpu_possible_map;
+ extern unsigned long smp_proc_in_lock[];
+ extern volatile unsigned long cpu_callin_map[];
+ extern int smp_tb_synchronized;
+@@ -45,21 +46,8 @@ extern void smp_local_timer_interrupt(st
+ 
+ #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 hweight32(cpu_online_map);
+-}
+-
+-extern inline unsigned int any_online_cpu(unsigned int mask)
+-{
+-	if (mask & cpu_online_map)
+-		return __ffs(mask & cpu_online_map);
+-
+-	return NR_CPUS;
+-}
++#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
++#define cpu_possible(cpu) cpu_isset(cpu, cpu_possible_map)
+ 
+ extern int __cpu_up(unsigned int cpu);
+ 
+--- linux-2.6.0-test1/include/asm-ppc/uaccess.h	2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-ppc/uaccess.h	2003-07-19 17:03:51.000000000 -0700
+@@ -16,10 +16,13 @@
+  * get_fs() == KERNEL_DS, checking is bypassed.
+  *
+  * For historical reasons, these macros are grossly misnamed.
++ *
++ * The fs/ds values are now the highest legal address in the "segment".
++ * This simplifies the checking in the routines below.
+  */
+ 
+-#define KERNEL_DS	((mm_segment_t) { 0 })
+-#define USER_DS		((mm_segment_t) { 1 })
++#define KERNEL_DS	((mm_segment_t) { ~0UL })
++#define USER_DS		((mm_segment_t) { TASK_SIZE - 1 })
+ 
+ #define get_ds()	(KERNEL_DS)
+ #define get_fs()	(current->thread.fs)
+@@ -27,14 +30,15 @@
+ 
+ #define segment_eq(a,b)	((a).seg == (b).seg)
+ 
+-#define __kernel_ok (segment_eq(get_fs(), KERNEL_DS))
+-#define __user_ok(addr,size) (((size) <= TASK_SIZE)&&((addr) <= TASK_SIZE-(size)))
+-#define __access_ok(addr,size) (__kernel_ok || __user_ok((addr),(size)))
+-#define access_ok(type,addr,size) __access_ok((unsigned long)(addr),(size))
++#define __access_ok(addr,size)						    \
++	((addr) <= current->thread.fs.seg				    \
++	 && ((size) == 0 || (size) - 1 <= current->thread.fs.seg - (addr)))
++
++#define access_ok(type, addr, size) __access_ok((unsigned long)(addr),(size))
+ 
+ extern inline int verify_area(int type, const void __user * addr, unsigned long size)
+ {
+-	return access_ok(type,addr,size) ? 0 : -EFAULT;
++	return access_ok(type, addr, size) ? 0 : -EFAULT;
+ }
+ 
+ 
+@@ -303,7 +307,7 @@ extern int __strnlen_user(const char __u
+  */
+ extern __inline__ int strnlen_user(const char __user *str, long len)
+ {
+-	unsigned long top = __kernel_ok? ~0UL: TASK_SIZE - 1;
++	unsigned long top = current->thread.fs.seg;
+ 
+ 	if ((unsigned long)str > top)
+ 		return 0;
+--- linux-2.6.0-test1/include/asm-ppc/unistd.h	2003-06-16 22:32:21.000000000 -0700
++++ 25/include/asm-ppc/unistd.h	2003-07-19 17:03:51.000000000 -0700
+@@ -253,177 +253,112 @@
+ #define __NR_clock_gettime	246
+ #define __NR_clock_getres	247
+ #define __NR_clock_nanosleep	248
++#define __NR_swapcontext	249
++#define __NR_tgkill		250
++#define __NR_utimes		251
++#define __NR_statfs64		252
++#define __NR_fstatfs64		253
+ 
+-#define __NR_syscalls		249
++#define __NR_syscalls		254
+ 
+ #define __NR(n)	#n
+ 
+-#define __syscall_return(type) \
+-	return (__sc_err & 0x10000000 ? errno = __sc_ret, __sc_ret = -1 : 0), \
+-	       (type) __sc_ret
+-
+-#define __syscall_clobbers \
+-	"r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
++/* On powerpc a system call basically clobbers the same registers like a
++ * function call, with the exception of LR (which is needed for the
++ * "sc; bnslr" sequence) and CR (where only CR0.SO is clobbered to signal
++ * an error return status).
++ */
+ 
+-#define _syscall0(type,name)						\
+-type name(void)								\
+-{									\
++#define __syscall_nr(nr, type, name, args...)				\
+ 	unsigned long __sc_ret, __sc_err;				\
+ 	{								\
+-		register unsigned long __sc_0 __asm__ ("r0");		\
+-		register unsigned long __sc_3 __asm__ ("r3");		\
+-									\
+-		__sc_0 = __NR_##name;					\
+-		__asm__ __volatile__					\
+-			("sc           \n\t"				\
+-			 "mfcr %1      "				\
+-			: "=&r" (__sc_3), "=&r" (__sc_0)		\
+-			: "0"   (__sc_3), "1"   (__sc_0)		\
+-			: __syscall_clobbers);				\
++		register unsigned long __sc_0  __asm__ ("r0");		\
++		register unsigned long __sc_3  __asm__ ("r3");		\
++		register unsigned long __sc_4  __asm__ ("r4");		\
++		register unsigned long __sc_5  __asm__ ("r5");		\
++		register unsigned long __sc_6  __asm__ ("r6");		\
++		register unsigned long __sc_7  __asm__ ("r7");		\
++									\
++		__sc_loadargs_##nr(name, args);				\
++		__asm__ __volatile__					\
++			("sc           \n\t"				\
++			 "mfcr %0      "				\
++			: "=&r" (__sc_0),				\
++			  "=&r" (__sc_3),  "=&r" (__sc_4),		\
++			  "=&r" (__sc_5),  "=&r" (__sc_6),		\
++			  "=&r" (__sc_7)				\
++			: __sc_asm_input_##nr				\
++			: "cr0", "ctr", "memory",			\
++			  "r8", "r9", "r10","r11", "r12");		\
+ 		__sc_ret = __sc_3;					\
+ 		__sc_err = __sc_0;					\
+ 	}								\
+-	__syscall_return (type);					\
++	if (__sc_err & 0x10000000)					\
++	{								\
++		errno = __sc_ret;					\
++		__sc_ret = -1;						\
++	}								\
++	return (type) __sc_ret
++
++#define __sc_loadargs_0(name, dummy...)					\
++	__sc_0 = __NR_##name
++#define __sc_loadargs_1(name, arg1)					\
++	__sc_loadargs_0(name);						\
++	__sc_3 = (unsigned long) (arg1)
++#define __sc_loadargs_2(name, arg1, arg2)				\
++	__sc_loadargs_1(name, arg1);					\
++	__sc_4 = (unsigned long) (arg2)
++#define __sc_loadargs_3(name, arg1, arg2, arg3)				\
++	__sc_loadargs_2(name, arg1, arg2);				\
++	__sc_5 = (unsigned long) (arg3)
++#define __sc_loadargs_4(name, arg1, arg2, arg3, arg4)			\
++	__sc_loadargs_3(name, arg1, arg2, arg3);			\
++	__sc_6 = (unsigned long) (arg4)
++#define __sc_loadargs_5(name, arg1, arg2, arg3, arg4, arg5)		\
++	__sc_loadargs_4(name, arg1, arg2, arg3, arg4);			\
++	__sc_7 = (unsigned long) (arg5)
++
++#define __sc_asm_input_0 "0" (__sc_0)
++#define __sc_asm_input_1 __sc_asm_input_0, "1" (__sc_3)
++#define __sc_asm_input_2 __sc_asm_input_1, "2" (__sc_4)
++#define __sc_asm_input_3 __sc_asm_input_2, "3" (__sc_5)
++#define __sc_asm_input_4 __sc_asm_input_3, "4" (__sc_6)
++#define __sc_asm_input_5 __sc_asm_input_4, "5" (__sc_7)
++
++#define _syscall0(type,name)						\
++type name(void)								\
++{									\
++	__syscall_nr(0, type, name);					\
+ }
+ 
+ #define _syscall1(type,name,type1,arg1)					\
+ type name(type1 arg1)							\
+ {									\
+-	unsigned long __sc_ret, __sc_err;				\
+-	{								\
+-		register unsigned long __sc_0 __asm__ ("r0");		\
+-		register unsigned long __sc_3 __asm__ ("r3");		\
+-									\
+-		__sc_3 = (unsigned long) (arg1);			\
+-		__sc_0 = __NR_##name;					\
+-		__asm__ __volatile__					\
+-			("sc           \n\t"				\
+-			 "mfcr %1      "				\
+-			: "=&r" (__sc_3), "=&r" (__sc_0)		\
+-			: "0"   (__sc_3), "1"   (__sc_0)		\
+-			: __syscall_clobbers);				\
+-		__sc_ret = __sc_3;					\
+-		__sc_err = __sc_0;					\
+-	}								\
+-	__syscall_return (type);					\
++	__syscall_nr(1, type, name, arg1);				\
+ }
+ 
+ #define _syscall2(type,name,type1,arg1,type2,arg2)			\
+ type name(type1 arg1, type2 arg2)					\
+ {									\
+-	unsigned long __sc_ret, __sc_err;				\
+-	{								\
+-		register unsigned long __sc_0 __asm__ ("r0");		\
+-		register unsigned long __sc_3 __asm__ ("r3");		\
+-		register unsigned long __sc_4 __asm__ ("r4");		\
+-									\
+-		__sc_3 = (unsigned long) (arg1);			\
+-		__sc_4 = (unsigned long) (arg2);			\
+-		__sc_0 = __NR_##name;					\
+-		__asm__ __volatile__					\
+-			("sc           \n\t"				\
+-			 "mfcr %1      "				\
+-			: "=&r" (__sc_3), "=&r" (__sc_0)		\
+-			: "0"   (__sc_3), "1"   (__sc_0),		\
+-			  "r"   (__sc_4)				\
+-			: __syscall_clobbers);				\
+-		__sc_ret = __sc_3;					\
+-		__sc_err = __sc_0;					\
+-	}								\
+-	__syscall_return (type);					\
++	__syscall_nr(2, type, name, arg1, arg2);			\
+ }
+ 
+ #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)		\
+ type name(type1 arg1, type2 arg2, type3 arg3)				\
+ {									\
+-	unsigned long __sc_ret, __sc_err;				\
+-	{								\
+-		register unsigned long __sc_0 __asm__ ("r0");		\
+-		register unsigned long __sc_3 __asm__ ("r3");		\
+-		register unsigned long __sc_4 __asm__ ("r4");		\
+-		register unsigned long __sc_5 __asm__ ("r5");		\
+-									\
+-		__sc_3 = (unsigned long) (arg1);			\
+-		__sc_4 = (unsigned long) (arg2);			\
+-		__sc_5 = (unsigned long) (arg3);			\
+-		__sc_0 = __NR_##name;					\
+-		__asm__ __volatile__					\
+-			("sc           \n\t"				\
+-			 "mfcr %1      "				\
+-			: "=&r" (__sc_3), "=&r" (__sc_0)		\
+-			: "0"   (__sc_3), "1"   (__sc_0),		\
+-			  "r"   (__sc_4),				\
+-			  "r"   (__sc_5)				\
+-			: __syscall_clobbers);				\
+-		__sc_ret = __sc_3;					\
+-		__sc_err = __sc_0;					\
+-	}								\
+-	__syscall_return (type);					\
++	__syscall_nr(3, type, name, arg1, arg2, arg3);			\
+ }
+ 
+ #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
+ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4)		\
+ {									\
+-	unsigned long __sc_ret, __sc_err;				\
+-	{								\
+-		register unsigned long __sc_0 __asm__ ("r0");		\
+-		register unsigned long __sc_3 __asm__ ("r3");		\
+-		register unsigned long __sc_4 __asm__ ("r4");		\
+-		register unsigned long __sc_5 __asm__ ("r5");		\
+-		register unsigned long __sc_6 __asm__ ("r6");		\
+-									\
+-		__sc_3 = (unsigned long) (arg1);			\
+-		__sc_4 = (unsigned long) (arg2);			\
+-		__sc_5 = (unsigned long) (arg3);			\
+-		__sc_6 = (unsigned long) (arg4);			\
+-		__sc_0 = __NR_##name;					\
+-		__asm__ __volatile__					\
+-			("sc           \n\t"				\
+-			 "mfcr %1      "				\
+-			: "=&r" (__sc_3), "=&r" (__sc_0)		\
+-			: "0"   (__sc_3), "1"   (__sc_0),		\
+-			  "r"   (__sc_4),				\
+-			  "r"   (__sc_5),				\
+-			  "r"   (__sc_6)				\
+-			: __syscall_clobbers);				\
+-		__sc_ret = __sc_3;					\
+-		__sc_err = __sc_0;					\
+-	}								\
+-	__syscall_return (type);					\
++	__syscall_nr(4, type, name, arg1, arg2, arg3, arg4);		\
+ }
+ 
+ #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
+ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5)	\
+ {									\
+-	unsigned long __sc_ret, __sc_err;				\
+-	{								\
+-		register unsigned long __sc_0 __asm__ ("r0");		\
+-		register unsigned long __sc_3 __asm__ ("r3");		\
+-		register unsigned long __sc_4 __asm__ ("r4");		\
+-		register unsigned long __sc_5 __asm__ ("r5");		\
+-		register unsigned long __sc_6 __asm__ ("r6");		\
+-		register unsigned long __sc_7 __asm__ ("r7");		\
+-									\
+-		__sc_3 = (unsigned long) (arg1);			\
+-		__sc_4 = (unsigned long) (arg2);			\
+-		__sc_5 = (unsigned long) (arg3);			\
+-		__sc_6 = (unsigned long) (arg4);			\
+-		__sc_7 = (unsigned long) (arg5);			\
+-		__sc_0 = __NR_##name;					\
+-		__asm__ __volatile__					\
+-			("sc           \n\t"				\
+-			 "mfcr %1      "				\
+-			: "=&r" (__sc_3), "=&r" (__sc_0)		\
+-			: "0"   (__sc_3), "1"   (__sc_0),		\
+-			  "r"   (__sc_4),				\
+-			  "r"   (__sc_5),				\
+-			  "r"   (__sc_6),				\
+-			  "r"   (__sc_7)				\
+-			: __syscall_clobbers);				\
+-		__sc_ret = __sc_3;					\
+-		__sc_err = __sc_0;					\
+-	}								\
+-	__syscall_return (type);					\
++	__syscall_nr(5, type, name, arg1, arg2, arg3, arg4, arg5);	\
+ }
+ 
+ #ifdef __KERNEL__
+--- linux-2.6.0-test1/include/asm-s390/bitops.h	2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-s390/bitops.h	2003-07-19 17:04:07.000000000 -0700
+@@ -505,7 +505,7 @@ static inline int __test_bit(unsigned lo
+ 	unsigned char ch;
+ 
+ 	addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3);
+-	ch = *(unsigned char *) addr;
++	ch = *(volatile unsigned char *) addr;
+ 	return (ch >> (nr & 7)) & 1;
+ }
+ 
+--- linux-2.6.0-test1/include/asm-s390/dma.h	2003-06-14 12:18:33.000000000 -0700
++++ 25/include/asm-s390/dma.h	2003-07-19 17:03:51.000000000 -0700
+@@ -2,8 +2,6 @@
+  *  include/asm-s390/dma.h
+  *
+  *  S390 version
+- *
+- *  This file exists so that an #include <dma.h> doesn't break anything.
+  */
+ 
+ #ifndef _ASM_DMA_H
+--- linux-2.6.0-test1/include/asm-s390/dma-mapping.h	2003-06-14 12:18:52.000000000 -0700
++++ 25/include/asm-s390/dma-mapping.h	2003-07-19 17:03:51.000000000 -0700
+@@ -1 +1,11 @@
+-#include <asm-generic/dma-mapping.h>
++/*
++ *  include/asm-s390/dma-mapping.h
++ *
++ *  S390 version
++ *
++ *  This file exists so that #include <dma-mapping.h> doesn't break anything.
++ */
++
++#ifndef _ASM_DMA_MAPPING_H
++#define _ASM_DMA_MAPPING_H
++#endif /* _ASM_DMA_MAPPING_H */
+--- linux-2.6.0-test1/include/asm-s390/irq.h	2003-06-14 12:18:30.000000000 -0700
++++ 25/include/asm-s390/irq.h	2003-07-19 17:03:51.000000000 -0700
+@@ -8,16 +8,13 @@
+  * 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).
++ * of interrupt classes (2).
++ * Only external and i/o interrupts make much sense here (CH).
+  */
+ 
+ enum interruption_class {
+ 	EXTERNAL_INTERRUPT,
+ 	IO_INTERRUPT,
+-	MACHINE_CHECK_INTERRUPT,
+-	PROGRAM_INTERRUPT,
+-	RESTART_INTERRUPT,
+-	SUPERVISOR_CALL,
+ 
+ 	NR_IRQS,
+ };
+--- linux-2.6.0-test1/include/asm-s390/mmu_context.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-s390/mmu_context.h	2003-07-19 17:04:07.000000000 -0700
+@@ -42,7 +42,7 @@ static inline void switch_mm(struct mm_s
+                              : : "m" (pgd) );
+ #endif /* __s390x__ */
+         }
+-	set_bit(smp_processor_id(), &next->cpu_vm_mask);
++	cpu_set(smp_processor_id(), next->cpu_vm_mask);
+ }
+ 
+ #define deactivate_mm(tsk,mm)	do { } while (0)
+--- linux-2.6.0-test1/include/asm-s390/pgalloc.h	2003-06-14 12:18:24.000000000 -0700
++++ 25/include/asm-s390/pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -61,12 +61,13 @@ static inline void pgd_free(pgd_t *pgd)
+  * 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_alloc_one(mm,address)       ({ BUG(); ((struct page *)2); })
++#define pmd_alloc_one_kernel(mm,addr)   ({ 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)
++static inline pmd_t * pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long vmaddr)
+ {
+ 	pmd_t *pmd;
+         int i;
+@@ -79,16 +80,25 @@ static inline pmd_t * pmd_alloc_one(stru
+ 	return pmd;
+ }
+ 
+-static inline void pmd_free (pmd_t *pmd)
++static inline struct page *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
+ {
+-	free_pages((unsigned long) pmd, 2);
++	pmd_t *pmd = pmd_alloc_one_kernel(mm, addr);
++	if (pmd)
++		return virt_to_page(pmd);
++	else
++		return NULL;
++}
++
++static inline void pmd_free(struct page *pmd)
++{
++	__free_pages(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)
++static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, struct page *pmd)
+ {
+-	pgd_val(*pgd) = _PGD_ENTRY | __pa(pmd);
++	pgd_val(*pgd) = _PGD_ENTRY | __pa(page_address(pmd));
+ }
+ 
+ #endif /* __s390x__ */
+--- linux-2.6.0-test1/include/asm-s390/pgtable.h	2003-06-14 12:18:30.000000000 -0700
++++ 25/include/asm-s390/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -613,6 +613,7 @@ static inline pte_t mk_pte_phys(unsigned
+ /* 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))
++#define pgd_page(pgd)	virt_to_page(pgd_page_kernel(pgd))
+ 
+ /* to find an entry in a kernel page-table-directory */
+ #define pgd_offset_k(address) pgd_offset(&init_mm, address)
+@@ -634,6 +635,12 @@ extern inline pmd_t * pmd_offset(pgd_t *
+ 
+ #endif /* __s390x__ */
+ 
++#define pmd_offset_kernel(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)					do { } while (0)
++#define pmd_unmap_nested(pmd)				do { } while (0)
++
+ /* 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) \
+--- linux-2.6.0-test1/include/asm-s390/posix_types.h	2003-06-14 12:17:55.000000000 -0700
++++ 25/include/asm-s390/posix_types.h	2003-07-19 17:06:39.000000000 -0700
+@@ -34,7 +34,9 @@ typedef long long       __kernel_loff_t;
+ 
+ #ifndef __s390x__
+ 
+-typedef unsigned short  __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long	__kernel_dev_t;
++#endif
+ typedef unsigned long   __kernel_ino_t;
+ typedef unsigned short  __kernel_mode_t;
+ typedef unsigned short  __kernel_nlink_t;
+@@ -51,7 +53,9 @@ typedef unsigned short	__kernel_old_dev_
+ 
+ #else /* __s390x__ */
+ 
+-typedef unsigned int    __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long	__kernel_dev_t;
++#endif
+ typedef unsigned int    __kernel_ino_t;
+ typedef unsigned int    __kernel_mode_t;
+ typedef unsigned int    __kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-s390/siginfo.h	2003-06-14 12:18:33.000000000 -0700
++++ 25/include/asm-s390/siginfo.h	2003-07-19 17:03:51.000000000 -0700
+@@ -10,6 +10,9 @@
+ #define _S390_SIGINFO_H
+ 
+ #define HAVE_ARCH_SI_CODES
++#ifdef __s390x__
++#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
++#endif
+ 
+ #include <asm-generic/siginfo.h>
+ 
+--- linux-2.6.0-test1/include/asm-s390/smp.h	2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-s390/smp.h	2003-07-19 17:04:07.000000000 -0700
+@@ -11,6 +11,7 @@
+ 
+ #include <linux/config.h>
+ #include <linux/threads.h>
++#include <linux/cpumask.h>
+ #include <linux/bitops.h>
+ 
+ #if defined(__KERNEL__) && defined(CONFIG_SMP) && !defined(__ASSEMBLY__)
+@@ -28,8 +29,8 @@ typedef struct
+ 	__u16      cpu;
+ } sigp_info;
+ 
+-extern volatile unsigned long cpu_online_map;
+-extern volatile unsigned long cpu_possible_map;
++extern cpumask_t cpu_online_map;
++extern cpumask_t cpu_possible_map;
+ 
+ #define NO_PROC_ID		0xFF		/* No processor magic marker */
+ 
+@@ -47,25 +48,8 @@ extern volatile unsigned long cpu_possib
+ 
+ #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)
+-{
+-#ifndef __s390x__
+-	return hweight32(cpu_online_map);
+-#else /* __s390x__ */
+-	return hweight64(cpu_online_map);
+-#endif /* __s390x__ */
+-}
+-
+-extern inline unsigned int any_online_cpu(unsigned int mask)
+-{
+-	if (mask & cpu_online_map)
+-		return __ffs(mask & cpu_online_map);
+-
+-	return NR_CPUS;
+-}
++#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
++#define cpu_possible(cpu) cpu_isset(cpu, cpu_possible_map)
+ 
+ extern __inline__ __u16 hard_smp_processor_id(void)
+ {
+--- linux-2.6.0-test1/include/asm-s390/tlbflush.h	2003-06-14 12:18:49.000000000 -0700
++++ 25/include/asm-s390/tlbflush.h	2003-07-19 17:04:07.000000000 -0700
+@@ -98,13 +98,15 @@ static inline void global_flush_tlb(void
+ 
+ static inline void __flush_tlb_mm(struct mm_struct * mm)
+ {
++	cpumask_t local_cpumask;
+ 	preempt_disable();
+-	if (mm->cpu_vm_mask != (1UL << smp_processor_id())) {
++	local_cpumask = cpumask_of_cpu(smp_processor_id());
++	if (cpus_equal(mm->cpu_vm_mask, local_cpumask)) {
+ 		/* 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();
++			mm->cpu_vm_mask = local_cpumask;
+ 		global_flush_tlb();
+ 	} else
+ 		local_flush_tlb();
+--- linux-2.6.0-test1/include/asm-sh/pgalloc.h	2003-07-02 14:53:18.000000000 -0700
++++ 25/include/asm-sh/pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -94,7 +94,8 @@ static inline void pte_free(struct page 
+  * inside the pgd, so has no extra memory associated with it.
+  */
+ 
+-#define pmd_alloc_one(mm, addr)		({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one_kernel(mm, addr)	({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm, addr)		({ BUG(); ((struct page *)2); })
+ #define pmd_free(x)			do { } while (0)
+ #define __pmd_free_tlb(tlb,x)		do { } while (0)
+ #define pgd_populate(mm, pmd, pte)	BUG()
+--- linux-2.6.0-test1/include/asm-sh/pgtable-2level.h	2003-07-02 14:53:18.000000000 -0700
++++ 25/include/asm-sh/pgtable-2level.h	2003-07-19 17:07:16.000000000 -0700
+@@ -48,14 +48,21 @@ static inline void pgd_clear (pgd_t * pg
+ #define set_pmd(pmdptr, pmdval) (*(pmdptr) = pmdval)
+ #define set_pgd(pgdptr, pgdval) (*(pgdptr) = pgdval)
+ 
+-#define pgd_page(pgd) \
++#define __pgd_page(pgd) \
+ ((unsigned long) __va(pgd_val(pgd) & PAGE_MASK))
++#define pgd_page(pgd)	virt_to_page(__pgd_page(pgd))
+ 
+ static inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address)
+ {
+ 	return (pmd_t *) dir;
+ }
+ 
++#define pmd_offset_kernel(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)	pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)				do { } while (0)
++#define pmd_unmap_nested(pmd)			do { } while (0)
++
+ #define pte_pfn(x)		((unsigned long)(((x).pte >> PAGE_SHIFT)))
+ #define pfn_pte(pfn, prot)	__pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
+ #define pfn_pmd(pfn, prot)	__pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
+--- linux-2.6.0-test1/include/asm-sh/posix_types.h	2003-07-02 14:53:18.000000000 -0700
++++ 25/include/asm-sh/posix_types.h	2003-07-19 17:06:39.000000000 -0700
+@@ -7,7 +7,9 @@
+  * assume GCC is being used.
+  */
+ 
+-typedef unsigned short	__kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long	__kernel_dev_t;
++#endif
+ typedef unsigned long	__kernel_ino_t;
+ typedef unsigned short	__kernel_mode_t;
+ typedef unsigned short	__kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-sparc64/atomic.h	2003-06-14 12:18:34.000000000 -0700
++++ 25/include/asm-sparc64/atomic.h	2003-07-19 17:03:51.000000000 -0700
+@@ -9,25 +9,46 @@
+ #define __ARCH_SPARC64_ATOMIC__
+ 
+ typedef struct { volatile int counter; } atomic_t;
+-#define ATOMIC_INIT(i)	{ (i) }
++typedef struct { volatile long counter; } atomic64_t;
++
++#define ATOMIC_INIT(i)		{ (i) }
++#define ATOMIC64_INIT(i)	{ (i) }
+ 
+ #define atomic_read(v)		((v)->counter)
++#define atomic64_read(v)	((v)->counter)
++
+ #define atomic_set(v, i)	(((v)->counter) = i)
++#define atomic64_set(v, i)	(((v)->counter) = i)
+ 
+ extern int __atomic_add(int, atomic_t *);
++extern int __atomic64_add(int, atomic64_t *);
++
+ extern int __atomic_sub(int, atomic_t *);
++extern int __atomic64_sub(int, atomic64_t *);
+ 
+ #define atomic_add(i, v) ((void)__atomic_add(i, v))
++#define atomic64_add(i, v) ((void)__atomic64_add(i, v))
++
+ #define atomic_sub(i, v) ((void)__atomic_sub(i, v))
++#define atomic64_sub(i, v) ((void)__atomic64_sub(i, v))
+ 
+ #define atomic_dec_return(v) __atomic_sub(1, v)
++#define atomic64_dec_return(v) __atomic64_sub(1, v)
++
+ #define atomic_inc_return(v) __atomic_add(1, v)
++#define atomic64_inc_return(v) __atomic64_add(1, v)
+ 
+ #define atomic_sub_and_test(i, v) (__atomic_sub(i, v) == 0)
++#define atomic64_sub_and_test(i, v) (__atomic64_sub(i, v) == 0)
++
+ #define atomic_dec_and_test(v) (__atomic_sub(1, v) == 0)
++#define atomic64_dec_and_test(v) (__atomic64_sub(1, v) == 0)
+ 
+ #define atomic_inc(v) ((void)__atomic_add(1, v))
++#define atomic64_inc(v) ((void)__atomic64_add(1, v))
++
+ #define atomic_dec(v) ((void)__atomic_sub(1, v))
++#define atomic64_dec(v) ((void)__atomic64_sub(1, v))
+ 
+ /* Atomic operations are already serializing */
+ #define smp_mb__before_atomic_dec()	barrier()
+--- linux-2.6.0-test1/include/asm-sparc64/bitops.h	2003-06-14 12:17:58.000000000 -0700
++++ 25/include/asm-sparc64/bitops.h	2003-07-19 17:04:07.000000000 -0700
+@@ -156,6 +156,14 @@ static __inline__ int ffs(int x)
+ 
+ #ifdef ULTRA_HAS_POPULATION_COUNT
+ 
++static __inline__ unsigned int hweight64(unsigned long w)
++{
++	unsigned int res;
++
++	__asm__ ("popc %1,%0" : "=r" (res) : "r" (w));
++	return res;
++}
++
+ static __inline__ unsigned int hweight32(unsigned int w)
+ {
+ 	unsigned int res;
+@@ -182,6 +190,7 @@ static __inline__ unsigned int hweight8(
+ 
+ #else
+ 
++#define hweight64(x) generic_hweight64(x)
+ #define hweight32(x) generic_hweight32(x)
+ #define hweight16(x) generic_hweight16(x)
+ #define hweight8(x) generic_hweight8(x)
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-sparc64/local.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,40 @@
++#ifndef _ARCH_SPARC64_LOCAL_H
++#define _ARCH_SPARC64_LOCAL_H
++
++#include <linux/percpu.h>
++#include <asm/atomic.h>
++
++typedef atomic64_t local_t;
++
++#define LOCAL_INIT(i)	ATOMIC64_INIT(i)
++#define local_read(v)	atomic64_read(v)
++#define local_set(v,i)	atomic64_set(v,i)
++
++#define local_inc(v)	atomic64_inc(v)
++#define local_dec(v)	atomic64_inc(v)
++#define local_add(i, v)	atomic64_add(i, v)
++#define local_sub(i, v)	atomic64_sub(i, v)
++
++#define __local_inc(v)		((v)->counter++)
++#define __local_dec(v)		((v)->counter++)
++#define __local_add(i,v)	((v)->counter+=(i))
++#define __local_sub(i,v)	((v)->counter-=(i))
++
++/* Use these for per-cpu local_t variables: on some archs they are
++ * much more efficient than these naive implementations.  Note they take
++ * a variable, not an address.
++ */
++#define cpu_local_read(v)	local_read(&__get_cpu_var(v))
++#define cpu_local_set(v, i)	local_set(&__get_cpu_var(v), (i))
++
++#define cpu_local_inc(v)	local_inc(&__get_cpu_var(v))
++#define cpu_local_dec(v)	local_dec(&__get_cpu_var(v))
++#define cpu_local_add(i, v)	local_add((i), &__get_cpu_var(v))
++#define cpu_local_sub(i, v)	local_sub((i), &__get_cpu_var(v))
++
++#define __cpu_local_inc(v)	__local_inc(&__get_cpu_var(v))
++#define __cpu_local_dec(v)	__local_dec(&__get_cpu_var(v))
++#define __cpu_local_add(i, v)	__local_add((i), &__get_cpu_var(v))
++#define __cpu_local_sub(i, v)	__local_sub((i), &__get_cpu_var(v))
++
++#endif /* _ARCH_SPARC64_LOCAL_H */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-sparc64/lockmeter.h	2003-07-19 17:06:40.000000000 -0700
+@@ -0,0 +1,47 @@
++/*
++ * Copyright (C) 2000 Anton Blanchard (anton@linuxcare.com)
++ */
++
++#ifndef _SPARC64_LOCKMETER_H
++#define _SPARC64_LOCKMETER_H
++
++#include <asm/spinlock.h>
++
++#include <linux/version.h>
++
++extern unsigned long cpu_hz;
++#define CPU_CYCLE_FREQUENCY	cpu_hz
++
++#define THIS_CPU_NUMBER		__cpu_number_map[smp_processor_id()]
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
++#define local_irq_save(x)	__save_and_cli(x)
++#define local_irq_restore(x)	__restore_flags(x)
++#endif /* Linux version 2.2.x */
++
++#define PUT_INDEX(lock_ptr,indexv)	(lock_ptr)->index = (indexv)
++#define GET_INDEX(lock_ptr)		(lock_ptr)->index
++
++#define PUT_RWINDEX(rwlock_ptr,indexv) (rwlock_ptr)->index = (indexv)
++#define GET_RWINDEX(rwlock_ptr)        (rwlock_ptr)->index
++#define PUT_RW_CPU(rwlock_ptr,cpuv)    (rwlock_ptr)->cpu = (cpuv)
++#define GET_RW_CPU(rwlock_ptr)         (rwlock_ptr)->cpu
++
++#define RWLOCK_READERS(rwlock_ptr)	rwlock_readers(rwlock_ptr)
++
++extern inline int rwlock_readers(rwlock_t *rwlock_ptr)
++{
++	signed int tmp = rwlock_ptr->lock;
++
++	if (tmp > 0)
++		return tmp;
++	else
++		return 0;
++}
++
++#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr)	((signed int)((rwlock_ptr)->lock) < 0)
++#define RWLOCK_IS_READ_LOCKED(rwlock_ptr)	((signed int)((rwlock_ptr)->lock) > 0)
++
++#define get_cycles64()	get_cycles()
++
++#endif /* _SPARC64_LOCKMETER_H */
+--- linux-2.6.0-test1/include/asm-sparc64/mmu_context.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-sparc64/mmu_context.h	2003-07-19 17:04:07.000000000 -0700
+@@ -125,7 +125,7 @@ static inline void switch_mm(struct mm_s
+ 	}
+ 
+ 	{
+-		unsigned long vm_mask = (1UL << smp_processor_id());
++		int cpu = smp_processor_id();
+ 
+ 		/* Even if (mm == old_mm) we _must_ check
+ 		 * the cpu_vm_mask.  If we do not we could
+@@ -133,8 +133,8 @@ static inline void switch_mm(struct mm_s
+ 		 * smp_flush_tlb_{page,range,mm} on sparc64
+ 		 * and lazy tlb switches work. -DaveM
+ 		 */
+-		if (!ctx_valid || !(mm->cpu_vm_mask & vm_mask)) {
+-			mm->cpu_vm_mask |= vm_mask;
++		if (!ctx_valid || !cpu_isset(cpu, mm->cpu_vm_mask)) {
++			cpu_set(cpu, mm->cpu_vm_mask);
+ 			__flush_tlb_mm(CTX_HWBITS(mm->context), SECONDARY_CONTEXT);
+ 		}
+ 	}
+@@ -148,14 +148,14 @@ extern void __flush_tlb_mm(unsigned long
+ /* Activate a new MM instance for the current task. */
+ static inline void activate_mm(struct mm_struct *active_mm, struct mm_struct *mm)
+ {
+-	unsigned long vm_mask;
++	int cpu;
+ 
+ 	spin_lock(&mm->page_table_lock);
+ 	if (!CTX_VALID(mm->context))
+ 		get_new_mmu_context(mm);
+-	vm_mask = (1UL << smp_processor_id());
+-	if (!(mm->cpu_vm_mask & vm_mask))
+-		mm->cpu_vm_mask |= vm_mask;
++	cpu = smp_processor_id();
++	if (!cpu_isset(cpu, mm->cpu_vm_mask))
++		cpu_set(cpu, mm->cpu_vm_mask);
+ 	spin_unlock(&mm->page_table_lock);
+ 
+ 	load_secondary_context(mm);
+--- linux-2.6.0-test1/include/asm-sparc64/pgalloc.h	2003-06-14 12:18:34.000000000 -0700
++++ 25/include/asm-sparc64/pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -132,7 +132,7 @@ static __inline__ void free_pgd_slow(pgd
+ #define DCACHE_COLOR(address)		0
+ #endif
+ 
+-#define pgd_populate(MM, PGD, PMD)	pgd_set(PGD, PMD)
++#define pgd_populate(MM, PGD, PMD)	pgd_set(PGD, page_address(PMD))
+ 
+ static __inline__ pmd_t *pmd_alloc_one_fast(struct mm_struct *mm, unsigned long address)
+ {
+@@ -153,7 +153,7 @@ static __inline__ pmd_t *pmd_alloc_one_f
+ 	return (pmd_t *)ret;
+ }
+ 
+-static __inline__ pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
++static __inline__ pmd_t *pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
+ {
+ 	pmd_t *pmd;
+ 
+@@ -166,6 +166,15 @@ static __inline__ pmd_t *pmd_alloc_one(s
+ 	return pmd;
+ }
+ 
++static inline struct page *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
++{
++	pmd_t *pmd = pmd_alloc_one_kernel(mm, addr);
++	if (pmd)
++		return virt_to_page(pmd);
++	else
++		return NULL;
++}
++
+ static __inline__ void free_pmd_fast(pmd_t *pmd)
+ {
+ 	unsigned long color = DCACHE_COLOR((unsigned long)pmd);
+@@ -222,7 +231,7 @@ static __inline__ void free_pte_slow(pte
+ 
+ #define pte_free_kernel(pte)	free_pte_fast(pte)
+ #define pte_free(pte)		free_pte_fast(page_address(pte))
+-#define pmd_free(pmd)		free_pmd_fast(pmd)
++#define pmd_free(pmd)		free_pmd_fast(page_address(pmd))
+ #define pgd_free(pgd)		free_pgd_fast(pgd)
+ #define pgd_alloc(mm)		get_pgd_fast()
+ 
+--- linux-2.6.0-test1/include/asm-sparc64/pgtable.h	2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-sparc64/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -228,7 +228,8 @@ static inline pte_t pte_modify(pte_t ori
+ 	(pgd_val(*(pgdp)) = (__pa((unsigned long) (pmdp)) >> 11UL))
+ #define __pmd_page(pmd)			((unsigned long) __va((pmd_val(pmd)<<11UL)))
+ #define pmd_page(pmd) 			virt_to_page((void *)__pmd_page(pmd))
+-#define pgd_page(pgd)			((unsigned long) __va((pgd_val(pgd)<<11UL)))
++#define __pgd_page(pgd)			((unsigned long) __va((pgd_val(pgd)<<11UL)))
++#define pgd_page(pgd)			virt_to_page(__pgd_page(pgd))
+ #define pte_none(pte) 			(!pte_val(pte))
+ #define pte_present(pte)		(pte_val(pte) & _PAGE_PRESENT)
+ #define pte_clear(pte)			(pte_val(*(pte)) = 0UL)
+@@ -270,8 +271,13 @@ static inline pte_t pte_modify(pte_t ori
+ #define pgd_offset_k(address) pgd_offset(&init_mm, address)
+ 
+ /* Find an entry in the second-level page table.. */
+-#define pmd_offset(dir, address)	((pmd_t *) pgd_page(*(dir)) + \
++#define pmd_offset(dir, address)	((pmd_t *)__pgd_page(*(dir)) + \
+ 					((address >> PMD_SHIFT) & (REAL_PTRS_PER_PMD-1)))
++#define pmd_offset_kernel(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)					do { } while (0)
++#define pmd_unmap_nested(pmd)				do { } while (0)
+ 
+ /* Find an entry in the third-level page table.. */
+ #define pte_index(dir, address)	((pte_t *) __pmd_page(*(dir)) + \
+--- linux-2.6.0-test1/include/asm-sparc64/posix_types.h	2003-06-14 12:18:32.000000000 -0700
++++ 25/include/asm-sparc64/posix_types.h	2003-07-19 17:06:39.000000000 -0700
+@@ -16,7 +16,9 @@ typedef int                    __kernel_
+ typedef int                    __kernel_ipc_pid_t;
+ typedef unsigned int           __kernel_uid_t;
+ typedef unsigned int           __kernel_gid_t;
+-typedef unsigned int           __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long	__kernel_dev_t;
++#endif
+ typedef unsigned long          __kernel_ino_t;
+ typedef unsigned int           __kernel_mode_t;
+ typedef unsigned short         __kernel_umode_t;
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-sparc64/sections.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,7 @@
++#ifndef _SPARC64_SECTIONS_H
++#define _SPARC64_SECTIONS_H
++
++/* nothing to see, move along */
++#include <asm-generic/sections.h>
++
++#endif
+--- linux-2.6.0-test1/include/asm-sparc64/smp.h	2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-sparc64/smp.h	2003-07-19 17:04:07.000000000 -0700
+@@ -14,6 +14,7 @@
+ 
+ #ifndef __ASSEMBLY__
+ 
++#include <linux/cpumask.h>
+ #include <linux/cache.h>
+ 
+ /* PROM provided per-processor information we need
+@@ -68,25 +69,14 @@ extern cpuinfo_sparc cpu_data[NR_CPUS];
+ 
+ extern unsigned char boot_cpu_id;
+ 
+-extern unsigned long phys_cpu_present_map;
+-#define cpu_possible(cpu)	(phys_cpu_present_map & (1UL << (cpu)))
++extern cpumask_t phys_cpu_present_map;
++#define cpu_possible(cpu)	cpu_isset(cpu, phys_cpu_present_map)
+ 
+-extern unsigned long cpu_online_map;
+-#define cpu_online(cpu)		(cpu_online_map & (1UL << (cpu)))
+-
+-extern atomic_t sparc64_num_cpus_online;
+-#define num_online_cpus()	(atomic_read(&sparc64_num_cpus_online))
++#define cpu_online(cpu)		cpu_isset(cpu, cpu_online_map)
+ 
+ extern atomic_t sparc64_num_cpus_possible;
+ #define num_possible_cpus()	(atomic_read(&sparc64_num_cpus_possible))
+ 
+-static inline unsigned int any_online_cpu(unsigned long mask)
+-{
+-	if ((mask &= cpu_online_map) != 0UL)
+-		return __ffs(mask);
+-	return NR_CPUS;
+-}
+-
+ /*
+  *	General functions that each host system must provide.
+  */
+--- linux-2.6.0-test1/include/asm-sparc64/spinlock.h	2003-06-26 22:07:26.000000000 -0700
++++ 25/include/asm-sparc64/spinlock.h	2003-07-19 17:06:40.000000000 -0700
+@@ -30,15 +30,23 @@
+ 
+ #ifndef CONFIG_DEBUG_SPINLOCK
+ 
+-typedef unsigned char spinlock_t;
+-#define SPIN_LOCK_UNLOCKED	0
++typedef struct {
++	unsigned char lock;
++	unsigned int  index;
++} spinlock_t;
+ 
+-#define spin_lock_init(lock)	(*((unsigned char *)(lock)) = 0)
+-#define spin_is_locked(lock)	(*((volatile unsigned char *)(lock)) != 0)
++#ifdef CONFIG_LOCKMETER
++#define SPIN_LOCK_UNLOCKED	(spinlock_t) {0, 0}
++#else
++#define SPIN_LOCK_UNLOCKED	(spinlock_t) { 0 }
++#endif
+ 
+-#define spin_unlock_wait(lock)	\
++#define spin_lock_init(__lock)	do { *(__lock) = SPIN_LOCK_UNLOCKED; } while(0)
++#define spin_is_locked(__lock)	(*((volatile unsigned char *)(&((__lock)->lock))) != 0)
++
++#define spin_unlock_wait(__lock)	\
+ do {	membar("#LoadLoad");	\
+-} while(*((volatile unsigned char *)lock))
++} while(*((volatile unsigned char *)(&(((spinlock_t *)__lock)->lock))))
+ 
+ static __inline__ void _raw_spin_lock(spinlock_t *lock)
+ {
+@@ -109,8 +117,20 @@ extern int _spin_trylock (spinlock_t *lo
+ 
+ #ifndef CONFIG_DEBUG_SPINLOCK
+ 
+-typedef unsigned int rwlock_t;
+-#define RW_LOCK_UNLOCKED	0
++#ifdef CONFIG_LOCKMETER
++typedef struct {
++	unsigned int lock;
++	unsigned int index;
++	unsigned int cpu;
++} rwlock_t;
++#define RW_LOCK_UNLOCKED       (rwlock_t) { 0, 0, 0xff }
++#else
++typedef struct {
++	unsigned int lock;
++} rwlock_t;
++#define RW_LOCK_UNLOCKED        (rwlock_t) { 0 }
++#endif
++
+ #define rwlock_init(lp) do { *(lp) = RW_LOCK_UNLOCKED; } while(0)
+ #define rwlock_is_locked(x) (*(x) != RW_LOCK_UNLOCKED)
+ 
+--- linux-2.6.0-test1/include/asm-sparc/pgalloc.h	2003-06-14 12:17:57.000000000 -0700
++++ 25/include/asm-sparc/pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -38,15 +38,24 @@ BTFIXUPDEF_CALL(void, free_pgd_fast, pgd
+ 
+ BTFIXUPDEF_CALL(void, pgd_set, pgd_t *, pmd_t *)
+ #define pgd_set(pgdp,pmdp) BTFIXUP_CALL(pgd_set)(pgdp,pmdp)
+-#define pgd_populate(MM, PGD, PMD)      pgd_set(PGD, PMD)
++#define pgd_populate(MM, PGD, PMD)      pgd_set(PGD, page_address(PMD))
+ 
+-BTFIXUPDEF_CALL(pmd_t *, pmd_alloc_one, struct mm_struct *, unsigned long)
+-#define pmd_alloc_one(mm, address)	BTFIXUP_CALL(pmd_alloc_one)(mm, address)
++BTFIXUPDEF_CALL(pmd_t *, __pmd_alloc_one, struct mm_struct *, unsigned long)
++#define pmd_alloc_one_kernel(mm, address) BTFIXUP_CALL(__pmd_alloc_one)(mm, address)
++
++static inline struct page *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
++{
++	pmd_t *pmd = pmd_alloc_one_kernel(mm, addr);
++	if (pmd)
++		return virt_to_page(pmd);
++	else
++		return NULL;
++}
+ 
+ BTFIXUPDEF_CALL(void, free_pmd_fast, pmd_t *)
+ #define free_pmd_fast(pmd)	BTFIXUP_CALL(free_pmd_fast)(pmd)
+ 
+-#define pmd_free(pmd)           free_pmd_fast(pmd)
++#define pmd_free(pmd)           free_pmd_fast(page_address(pmd))
+ #define __pmd_free_tlb(tlb, pmd) pmd_free(pmd)
+ 
+ BTFIXUPDEF_CALL(void, pmd_populate, pmd_t *, struct page *)
+--- linux-2.6.0-test1/include/asm-sparc/pgtable.h	2003-06-14 12:18:22.000000000 -0700
++++ 25/include/asm-sparc/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -202,10 +202,11 @@ extern unsigned long empty_zero_page;
+ /*
+  */
+ BTFIXUPDEF_CALL_CONST(struct page *, pmd_page, pmd_t)
+-BTFIXUPDEF_CALL_CONST(unsigned long, pgd_page, pgd_t)
++BTFIXUPDEF_CALL_CONST(unsigned long, __pgd_page, pgd_t)
+ 
+ #define pmd_page(pmd) BTFIXUP_CALL(pmd_page)(pmd)
+-#define pgd_page(pgd) BTFIXUP_CALL(pgd_page)(pgd)
++#define __pgd_page(pgd) BTFIXUP_CALL(__pgd_page)(pgd)
++#define pgd_page(pgd)	virt_to_page(__pgd_page(pgd))
+ 
+ BTFIXUPDEF_SETHI(none_mask)
+ BTFIXUPDEF_CALL_CONST(int, pte_present, pte_t)
+@@ -352,6 +353,11 @@ extern __inline__ pte_t pte_modify(pte_t
+ /* Find an entry in the second-level page table.. */
+ BTFIXUPDEF_CALL(pmd_t *, pmd_offset, pgd_t *, unsigned long)
+ #define pmd_offset(dir,addr) BTFIXUP_CALL(pmd_offset)(dir,addr)
++#define pmd_offset_kernel(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)					do { } while (0)
++#define pmd_unmap_nested(pmd)				do { } while (0)
+ 
+ /* Find an entry in the third-level page table.. */ 
+ BTFIXUPDEF_CALL(pte_t *, pte_offset_kernel, pmd_t *, unsigned long)
+--- linux-2.6.0-test1/include/asm-sparc/posix_types.h	2003-06-14 12:18:06.000000000 -0700
++++ 25/include/asm-sparc/posix_types.h	2003-07-19 17:06:39.000000000 -0700
+@@ -17,7 +17,9 @@ typedef int                    __kernel_
+ typedef unsigned short         __kernel_ipc_pid_t;
+ typedef unsigned short         __kernel_uid_t;
+ typedef unsigned short         __kernel_gid_t;
+-typedef unsigned short         __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long	__kernel_dev_t;
++#endif
+ typedef unsigned long          __kernel_ino_t;
+ typedef unsigned short         __kernel_mode_t;
+ typedef unsigned short         __kernel_umode_t;
+--- linux-2.6.0-test1/include/asm-sparc/smp.h	2003-06-14 12:18:04.000000000 -0700
++++ 25/include/asm-sparc/smp.h	2003-07-19 17:04:07.000000000 -0700
+@@ -8,6 +8,7 @@
+ 
+ #include <linux/config.h>
+ #include <linux/threads.h>
++#include <linux/cpumask.h>
+ #include <asm/head.h>
+ #include <asm/btfixup.h>
+ 
+--- linux-2.6.0-test1/include/asm-um/pgalloc.h	2003-06-14 12:18:30.000000000 -0700
++++ 25/include/asm-um/pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -42,7 +42,8 @@ static inline void pte_free(struct page 
+  * inside the pgd, so has no extra memory associated with it.
+  */
+ 
+-#define pmd_alloc_one(mm, addr)		({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm, addr)		({ BUG(); ((struct page *)2); })
++#define pmd_alloc_one_kernel(mm, addr)	({ 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()
+--- linux-2.6.0-test1/include/asm-um/pgtable.h	2003-06-14 12:18:52.000000000 -0700
++++ 25/include/asm-um/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -374,6 +374,12 @@ static inline pmd_t * pmd_offset(pgd_t *
+ 	return (pmd_t *) dir;
+ }
+ 
++#define pmd_offset_kernel(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_unmap(pgd, addr)				do { } while (0)
++#define pmd_unmap_nested(pgd, addr)			do { } while (0)
++
+ /* Find an entry in the third-level page table.. */ 
+ #define pte_index(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
+ #define pte_offset_kernel(dir, address) \
+--- linux-2.6.0-test1/include/asm-um/smp.h	2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-um/smp.h	2003-07-19 17:04:07.000000000 -0700
+@@ -1,13 +1,14 @@
+ #ifndef __UM_SMP_H
+ #define __UM_SMP_H
+ 
+-extern unsigned long cpu_online_map;
+-
+ #ifdef CONFIG_SMP
+ 
+ #include "linux/config.h"
+ #include "linux/bitops.h"
+ #include "asm/current.h"
++#include "linux/cpumask.h"
++
++extern cpumask_t cpu_online_map;
+ 
+ #define smp_processor_id() (current->thread_info->cpu)
+ #define cpu_logical_map(n) (n)
+@@ -16,16 +17,11 @@ extern unsigned long cpu_online_map;
+ extern int hard_smp_processor_id(void);
+ #define NO_PROC_ID -1
+ 
+-#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
++#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
+ 
+ extern int ncpus;
+ #define cpu_possible(cpu) (cpu < ncpus)
+ 
+-extern inline unsigned int num_online_cpus(void)
+-{
+-	return(hweight32(cpu_online_map));
+-}
+-
+ extern inline void smp_cpus_done(unsigned int maxcpus)
+ {
+ }
+--- linux-2.6.0-test1/include/asm-v850/anna.h	2003-06-14 12:18:06.000000000 -0700
++++ 25/include/asm-v850/anna.h	2003-07-19 17:03:51.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * include/asm-v850/anna.h -- Anna V850E2 evaluation cpu chip/board
+  *
+- *  Copyright (C) 2001,2002  NEC Corporation
+- *  Copyright (C) 2001,2002  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
+@@ -14,8 +14,9 @@
+ #ifndef __V850_ANNA_H__
+ #define __V850_ANNA_H__
+ 
++#include <asm/v850e2.h>		/* Based on V850E2 core.  */
++
+ 
+-#define CPU_ARCH 	"v850e2"
+ #define CPU_MODEL	"v850e2/anna"
+ #define CPU_MODEL_LONG	"NEC V850E2/Anna"
+ #define PLATFORM	"anna"
+@@ -48,30 +49,6 @@
+ 
+ 
+ /* Anna specific control registers.  */
+-#define ANNA_CSC_ADDR(n)		(0xFFFFF060 + (n) * 2)
+-#define ANNA_CSC(n)			(*(volatile u16 *)ANNA_CSC_ADDR(n))
+-#define ANNA_BPC_ADDR			0xFFFFF064
+-#define ANNA_BPC			(*(volatile u16 *)ANNA_BPC_ADDR)
+-#define ANNA_BSC_ADDR			0xFFFFF066
+-#define ANNA_BSC			(*(volatile u16 *)ANNA_BSC_ADDR)
+-#define ANNA_BEC_ADDR			0xFFFFF068
+-#define ANNA_BEC			(*(volatile u16 *)ANNA_BEC_ADDR)
+-#define ANNA_BHC_ADDR			0xFFFFF06A
+-#define ANNA_BHC			(*(volatile u16 *)ANNA_BHC_ADDR)
+-#define ANNA_BCT_ADDR(n)		(0xFFFFF480 + (n) * 2)
+-#define ANNA_BCT(n)			(*(volatile u16 *)ANNA_BCT_ADDR(n))
+-#define ANNA_DWC_ADDR(n)		(0xFFFFF484 + (n) * 2)
+-#define ANNA_DWC(n)			(*(volatile u16 *)ANNA_DWC_ADDR(n))
+-#define ANNA_BCC_ADDR			0xFFFFF488
+-#define ANNA_BCC			(*(volatile u16 *)ANNA_BCC_ADDR)
+-#define ANNA_ASC_ADDR			0xFFFFF48A
+-#define ANNA_ASC			(*(volatile u16 *)ANNA_ASC_ADDR)
+-#define ANNA_LBS_ADDR			0xFFFFF48E
+-#define ANNA_LBS			(*(volatile u16 *)ANNA_LBS_ADDR)
+-#define ANNA_SCR3_ADDR			0xFFFFF4AC
+-#define ANNA_SCR3			(*(volatile u16 *)ANNA_SCR3_ADDR)
+-#define ANNA_RFS3_ADDR			0xFFFFF4AE
+-#define ANNA_RFS3			(*(volatile u16 *)ANNA_RFS3_ADDR)
+ #define ANNA_ILBEN_ADDR			0xFFFFF7F2
+ #define ANNA_ILBEN			(*(volatile u16 *)ANNA_ILBEN_ADDR)
+ 
+@@ -85,9 +62,6 @@
+ #define ANNA_PORT_PM(n)			(*(volatile u8 *)ANNA_PORT_PM_ADDR(n))
+ 
+ 
+-/* NB85E-style interrupt system.  */
+-#include <asm/nb85e_intc.h>
+-
+ /* Hardware-specific interrupt numbers (in the kernel IRQ namespace).  */
+ #define IRQ_INTP(n)	(n)	/* Pnnn (pin) interrupts 0-15 */
+ #define IRQ_INTP_NUM	16
+@@ -116,12 +90,15 @@ extern void anna_init_irqs (void);
+ 
+ 
+ /* Anna UART details (basically the same as the V850E/MA1, but 2 channels).  */
+-#define NB85E_UART_NUM_CHANNELS		2
+-#define NB85E_UART_BASE_FREQ		(SYS_CLOCK_FREQ / 2)
+-#define NB85E_UART_CHIP_NAME 		"V850E2/NA85E2A"
++#define V850E_UART_NUM_CHANNELS		2
++#define V850E_UART_BASE_FREQ		(SYS_CLOCK_FREQ / 2)
++#define V850E_UART_CHIP_NAME 		"V850E2/NA85E2A"
++
++/* This is the UART channel that's actually connected on the board.  */
++#define V850E_UART_CONSOLE_CHANNEL	1
+ 
+ /* This is a function that gets called before configuring the UART.  */
+-#define NB85E_UART_PRE_CONFIGURE	anna_uart_pre_configure
++#define V850E_UART_PRE_CONFIGURE	anna_uart_pre_configure
+ #ifndef __ASSEMBLY__
+ extern void anna_uart_pre_configure (unsigned chan,
+ 				     unsigned cflags, unsigned baud);
+@@ -130,9 +107,9 @@ extern void anna_uart_pre_configure (uns
+ /* This board supports RTS/CTS for the on-chip UART, but only for channel 1. */
+ 
+ /* CTS for UART channel 1 is pin P37 (bit 7 of port 3).  */
+-#define NB85E_UART_CTS(chan)	((chan) == 1 ? !(ANNA_PORT_IO(3) & 0x80) : 1)
++#define V850E_UART_CTS(chan)	((chan) == 1 ? !(ANNA_PORT_IO(3) & 0x80) : 1)
+ /* RTS for UART channel 1 is pin P07 (bit 7 of port 0).  */
+-#define NB85E_UART_SET_RTS(chan, val)					      \
++#define V850E_UART_SET_RTS(chan, val)					      \
+    do {									      \
+ 	   if (chan == 1) {						      \
+ 		   unsigned old = ANNA_PORT_IO(0); 			      \
+@@ -145,16 +122,16 @@ extern void anna_uart_pre_configure (uns
+ 
+ 
+ /* Timer C details.  */
+-#define NB85E_TIMER_C_BASE_ADDR		0xFFFFF600
++#define V850E_TIMER_C_BASE_ADDR		0xFFFFF600
+ 
+ /* Timer D details (the Anna actually has 5 of these; should change later). */
+-#define NB85E_TIMER_D_BASE_ADDR		0xFFFFF540
+-#define NB85E_TIMER_D_TMD_BASE_ADDR 	(NB85E_TIMER_D_BASE_ADDR + 0x0)
+-#define NB85E_TIMER_D_CMD_BASE_ADDR 	(NB85E_TIMER_D_BASE_ADDR + 0x2)
+-#define NB85E_TIMER_D_TMCD_BASE_ADDR 	(NB85E_TIMER_D_BASE_ADDR + 0x4)
++#define V850E_TIMER_D_BASE_ADDR		0xFFFFF540
++#define V850E_TIMER_D_TMD_BASE_ADDR 	(V850E_TIMER_D_BASE_ADDR + 0x0)
++#define V850E_TIMER_D_CMD_BASE_ADDR 	(V850E_TIMER_D_BASE_ADDR + 0x2)
++#define V850E_TIMER_D_TMCD_BASE_ADDR 	(V850E_TIMER_D_BASE_ADDR + 0x4)
+ 
+-#define NB85E_TIMER_D_BASE_FREQ		SYS_CLOCK_FREQ
+-#define NB85E_TIMER_D_TMCD_CS_MIN	1 /* min 2^1 divider */
++#define V850E_TIMER_D_BASE_FREQ		SYS_CLOCK_FREQ
++#define V850E_TIMER_D_TMCD_CS_MIN	1 /* min 2^1 divider */
+ 
+ 
+ /* For <asm/param.h> */
+--- linux-2.6.0-test1/include/asm-v850/as85ep1.h	2003-06-14 12:18:30.000000000 -0700
++++ 25/include/asm-v850/as85ep1.h	2003-07-19 17:03:51.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * include/asm-v850/as85ep1.h -- AS85EP1 evaluation CPU chip/board
+  *
+- *  Copyright (C) 2001,2002  NEC Corporation
+- *  Copyright (C) 2001,2002  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
+@@ -14,8 +14,9 @@
+ #ifndef __V850_AS85EP1_H__
+ #define __V850_AS85EP1_H__
+ 
++#include <asm/v850e.h>
++
+ 
+-#define CPU_ARCH 	"v850e"
+ #define CPU_MODEL	"as85ep1"
+ #define CPU_MODEL_LONG	"NEC V850E/AS85EP1"
+ #define PLATFORM	"AS85EP1"
+@@ -86,9 +87,6 @@
+ #define AS85EP1_PORT_PMC(n)	(*(volatile u8 *)AS85EP1_PORT_PMC_ADDR(n))
+ 
+ 
+-/* NB85E-style interrupt system.  */
+-#include <asm/nb85e_intc.h>
+-
+ /* Hardware-specific interrupt numbers (in the kernel IRQ namespace).  */
+ #define IRQ_INTCCC(n)	(0x0C + (n))
+ #define IRQ_INTCCC_NUM	8
+@@ -110,12 +108,12 @@ extern void as85ep1_init_irqs (void);
+ 
+ 
+ /* AS85EP1 UART details (basically the same as the V850E/MA1, but 2 channels).  */
+-#define NB85E_UART_NUM_CHANNELS		2
+-#define NB85E_UART_BASE_FREQ		(SYS_CLOCK_FREQ / 4)
+-#define NB85E_UART_CHIP_NAME 		"V850E/NA85E"
++#define V850E_UART_NUM_CHANNELS		2
++#define V850E_UART_BASE_FREQ		(SYS_CLOCK_FREQ / 4)
++#define V850E_UART_CHIP_NAME 		"V850E/NA85E"
+ 
+ /* This is a function that gets called before configuring the UART.  */
+-#define NB85E_UART_PRE_CONFIGURE	as85ep1_uart_pre_configure
++#define V850E_UART_PRE_CONFIGURE	as85ep1_uart_pre_configure
+ #ifndef __ASSEMBLY__
+ extern void as85ep1_uart_pre_configure (unsigned chan,
+ 					unsigned cflags, unsigned baud);
+@@ -124,9 +122,9 @@ extern void as85ep1_uart_pre_configure (
+ /* This board supports RTS/CTS for the on-chip UART, but only for channel 1. */
+ 
+ /* CTS for UART channel 1 is pin P54 (bit 4 of port 5).  */
+-#define NB85E_UART_CTS(chan)   ((chan) == 1 ? !(AS85EP1_PORT_IO(5) & 0x10) : 1)
++#define V850E_UART_CTS(chan)   ((chan) == 1 ? !(AS85EP1_PORT_IO(5) & 0x10) : 1)
+ /* RTS for UART channel 1 is pin P53 (bit 3 of port 5).  */
+-#define NB85E_UART_SET_RTS(chan, val)					      \
++#define V850E_UART_SET_RTS(chan, val)					      \
+    do {									      \
+ 	   if (chan == 1) {						      \
+ 		   unsigned old = AS85EP1_PORT_IO(5); 			      \
+@@ -139,16 +137,16 @@ extern void as85ep1_uart_pre_configure (
+ 
+ 
+ /* Timer C details.  */
+-#define NB85E_TIMER_C_BASE_ADDR		0xFFFFF600
++#define V850E_TIMER_C_BASE_ADDR		0xFFFFF600
+ 
+ /* Timer D details (the AS85EP1 actually has 5 of these; should change later). */
+-#define NB85E_TIMER_D_BASE_ADDR		0xFFFFF540
+-#define NB85E_TIMER_D_TMD_BASE_ADDR 	(NB85E_TIMER_D_BASE_ADDR + 0x0)
+-#define NB85E_TIMER_D_CMD_BASE_ADDR 	(NB85E_TIMER_D_BASE_ADDR + 0x2)
+-#define NB85E_TIMER_D_TMCD_BASE_ADDR 	(NB85E_TIMER_D_BASE_ADDR + 0x4)
++#define V850E_TIMER_D_BASE_ADDR		0xFFFFF540
++#define V850E_TIMER_D_TMD_BASE_ADDR 	(V850E_TIMER_D_BASE_ADDR + 0x0)
++#define V850E_TIMER_D_CMD_BASE_ADDR 	(V850E_TIMER_D_BASE_ADDR + 0x2)
++#define V850E_TIMER_D_TMCD_BASE_ADDR 	(V850E_TIMER_D_BASE_ADDR + 0x4)
+ 
+-#define NB85E_TIMER_D_BASE_FREQ		SYS_CLOCK_FREQ
+-#define NB85E_TIMER_D_TMCD_CS_MIN	2 /* min 2^2 divider */
++#define V850E_TIMER_D_BASE_FREQ		SYS_CLOCK_FREQ
++#define V850E_TIMER_D_TMCD_CS_MIN	2 /* min 2^2 divider */
+ 
+ 
+ /* For <asm/param.h> */
+--- linux-2.6.0-test1/include/asm-v850/asm.h	2003-06-14 12:18:08.000000000 -0700
++++ 25/include/asm-v850/asm.h	2003-07-19 17:03:51.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  * include/asm-v850/asm.h -- Macros for writing assembly code
+  *
+- *  Copyright (C) 2001,02,03  NEC Corporation
++ *  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
+--- linux-2.6.0-test1/include/asm-v850/cacheflush.h	2003-06-14 12:18:07.000000000 -0700
++++ 25/include/asm-v850/cacheflush.h	2003-07-19 17:03:51.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * include/asm-v850/cacheflush.h
+  *
+- *  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
+@@ -21,21 +21,40 @@
+ #include <asm/machdep.h>
+ 
+ 
+-#ifndef flush_cache_all
+-/* If there's no flush_cache_all macro defined by <asm/machdep.h>, then
+-   this processor has no cache, so just define these as nops.  */
+-
++/* The following are all used by the kernel in ways that only affect
++   systems with MMUs, so we don't need them.  */
+ #define flush_cache_all()			((void)0)
+ #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_dcache_page(page)			((void)0)
++
++#ifdef CONFIG_NO_CACHE
++
++/* Some systems have no cache at all, in which case we don't need these
++   either.  */
+ #define flush_icache()				((void)0)
+ #define flush_icache_range(start, end)		((void)0)
+ #define flush_icache_page(vma,pg)		((void)0)
+ #define flush_icache_user_range(vma,pg,adr,len)	((void)0)
+ #define flush_cache_sigtramp(vaddr)		((void)0)
+ 
+-#endif /* !flush_cache_all */
++#else /* !CONFIG_NO_CACHE */
++
++struct page;
++struct mm_struct;
++struct vm_area_struct;
++
++/* Otherwise, somebody had better define them.  */
++extern void flush_icache (void);
++extern void flush_icache_range (unsigned long start, unsigned long end);
++extern void flush_icache_page (struct vm_area_struct *vma, struct page *page);
++extern void flush_icache_user_range (struct vm_area_struct *vma,
++				     struct page *page,
++				     unsigned long adr, int len);
++extern void flush_cache_sigtramp (unsigned long addr);
++
++#endif /* CONFIG_NO_CACHE */
++
+ 
+ #endif /* __V850_CACHEFLUSH_H__ */
+--- linux-2.6.0-test1/include/asm-v850/entry.h	2003-06-14 12:18:52.000000000 -0700
++++ 25/include/asm-v850/entry.h	2003-07-19 17:03:51.000000000 -0700
+@@ -65,10 +65,10 @@
+ #define RESET_GUARD_ACTIVE	0xFAB4BEEF
+ #endif /* CONFIG_RESET_GUARD */
+ 
+-#ifdef CONFIG_V850E_MA1_HIGHRES_TIMER
++#ifdef CONFIG_V850E_HIGHRES_TIMER
+ #define HIGHRES_TIMER_SLOW_TICKS_ADDR (KERNEL_VAR_SPACE_ADDR + 32)
+ #define HIGHRES_TIMER_SLOW_TICKS     KERNEL_VAR (HIGHRES_TIMER_SLOW_TICKS_ADDR)
+-#endif /* CONFIG_V850E_MA1_HIGHRES_TIMER */
++#endif /* CONFIG_V850E_HIGHRES_TIMER */
+ 
+ #ifndef __ASSEMBLY__
+ 
+--- linux-2.6.0-test1/include/asm-v850/fpga85e2c.h	2003-06-14 12:18:22.000000000 -0700
++++ 25/include/asm-v850/fpga85e2c.h	2003-07-19 17:03:51.000000000 -0700
+@@ -2,8 +2,8 @@
+  * include/asm-v850/fpga85e2c.h -- Machine-dependent defs for
+  *	FPGA implementation of V850E2/NA85E2C
+  *
+- *  Copyright (C) 2002  NEC Corporation
+- *  Copyright (C) 2002  Miles Bader <miles@gnu.org>
++ *  Copyright (C) 2002,03  NEC Electronics Corporation
++ *  Copyright (C) 2002,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,11 +15,10 @@
+ #ifndef __V850_FPGA85E2C_H__
+ #define __V850_FPGA85E2C_H__
+ 
+-
++#include <asm/v850e2.h>
+ #include <asm/clinkage.h>
+ 
+ 
+-#define CPU_ARCH 	"v850e2"
+ #define CPU_MODEL	"v850e2/fpga85e2c"
+ #define CPU_MODEL_LONG	"NEC V850E2/NA85E2C"
+ #define PLATFORM	"fpga85e2c"
+@@ -42,27 +41,6 @@
+ #define CSDEV_ADDR(n)		(0xFFE80110 + 2*(n))
+ #define CSDEV(n)		(*(volatile unsigned char *)CSDEV_ADDR (n))
+ 
+-/* The BSC register controls bus-sizing.  Each memory area CSn uses a pair
+-   of bits N*2 and N*2+1, where 00 means an 8-bit bus size, 01 16-bit, and
+-   10 32-bit.  */
+-#define BSC_ADDR		0xFFFFF066
+-#define BSC			(*(volatile unsigned short *)BSC_ADDR)
+-
+-#define DWC_ADDR(n)		(0xFFFFF484 + 2*(n))
+-#define DWC(n)			(*(volatile unsigned short *)DWC_ADDR (n))
+-
+-#define ASC_ADDR		0xFFFFF48A
+-#define ASC			(*(volatile unsigned short *)ASC_ADDR)
+-
+-#define BTSC_ADDR		0xFFFFF070
+-#define BTSC			(*(volatile unsigned short *)BTSC_ADDR)
+-
+-#define BHC_ADDR		0xFFFFF06A
+-#define BHC			(*(volatile unsigned short *)BHC_ADDR)
+-
+-
+-/* NB85E-style interrupt system.  */
+-#include <asm/nb85e_intc.h>
+ 
+ /* Timer interrupts 0-3, interrupt at intervals from CLK/4096 to CLK/16384.  */
+ #define IRQ_RPU(n)		(60 + (n))
+--- linux-2.6.0-test1/include/asm-v850/highres_timer.h	2003-06-14 12:18:34.000000000 -0700
++++ 25/include/asm-v850/highres_timer.h	2003-07-19 17:03:51.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * include/asm-v850/highres_timer.h -- High resolution timing routines
+  *
+- *  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
+@@ -25,7 +25,7 @@
+    counter overflows).  */
+ #define HIGHRES_TIMER_SLOW_TICK_RATE	25
+ 
+-/* Which timer in the nb85e `Timer D' we use.  */
++/* Which timer in the V850E `Timer D' we use.  */
+ #define HIGHRES_TIMER_TIMER_D_UNIT	3
+ 
+ 
+--- linux-2.6.0-test1/include/asm-v850/ma1.h	2003-06-14 12:18:24.000000000 -0700
++++ 25/include/asm-v850/ma1.h	2003-07-19 17:03:51.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * include/asm-v850/ma1.h -- V850E/MA1 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
+@@ -40,12 +40,11 @@
+ #define IRQ_INTST(n)	(0x27 + (n)*4) /* UART 0-2 transmission completion */
+ #define IRQ_INTST_NUM	3
+ 
+-/* For <asm/irq.h> */
+ #define NUM_CPU_IRQS	0x30
+ 
+ 
+ /* The MA1 has a UART with 3 channels.  */
+-#define NB85E_UART_NUM_CHANNELS	3
++#define V850E_UART_NUM_CHANNELS	3
+ 
+ 
+ #endif /* __V850_MA1_H__ */
+--- linux-2.6.0-test1/include/asm-v850/machdep.h	2003-06-14 12:18:07.000000000 -0700
++++ 25/include/asm-v850/machdep.h	2003-07-19 17:03:51.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * include/asm-v850/machdep.h -- Machine-dependent definitions
+  *
+- *  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
+@@ -20,6 +20,9 @@
+ #ifdef CONFIG_V850E_MA1
+ #include <asm/ma1.h>
+ #endif
++#ifdef CONFIG_V850E_ME2
++#include <asm/me2.h>
++#endif
+ #ifdef CONFIG_V850E_TEG
+ #include <asm/teg.h>
+ #endif
+@@ -36,6 +39,9 @@
+ #ifdef CONFIG_RTE_CB_MA1
+ #include <asm/rte_ma1_cb.h>
+ #endif
++#ifdef CONFIG_RTE_CB_ME2
++#include <asm/rte_me2_cb.h>
++#endif
+ #ifdef CONFIG_RTE_CB_NB85E
+ #include <asm/rte_nb85e_cb.h>
+ #endif
+@@ -45,6 +51,9 @@
+ #ifdef CONFIG_V850E2_SIM85E2C
+ #include <asm/sim85e2c.h>
+ #endif
++#ifdef CONFIG_V850E2_SIM85E2S
++#include <asm/sim85e2s.h>
++#endif
+ #ifdef CONFIG_V850E2_FPGA85E2C
+ #include <asm/fpga85e2c.h>
+ #endif
+--- linux-2.6.0-test1/include/asm-v850/ma.h	2003-06-14 12:17:58.000000000 -0700
++++ 25/include/asm-v850/ma.h	2003-07-19 17:03:51.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * include/asm-v850/ma.h -- V850E/MA series of cpu chips
+  *
+- *  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
+@@ -14,9 +14,8 @@
+ #ifndef __V850_MA_H__
+ #define __V850_MA_H__
+ 
+-
+-/* The MA series uses the NB85E cpu core.  */
+-#include <asm/nb85e.h>
++/* The MA series uses the V850E cpu core.  */
++#include <asm/v850e.h>
+ 
+ 
+ /* For <asm/entry.h> */
+@@ -28,10 +27,10 @@
+ 
+ 
+ /* MA series UART details.  */
+-#define NB85E_UART_BASE_FREQ		CPU_CLOCK_FREQ
++#define V850E_UART_BASE_FREQ		CPU_CLOCK_FREQ
+ 
+ /* This is a function that gets called before configuring the UART.  */
+-#define NB85E_UART_PRE_CONFIGURE	ma_uart_pre_configure
++#define V850E_UART_PRE_CONFIGURE	ma_uart_pre_configure
+ #ifndef __ASSEMBLY__
+ extern void ma_uart_pre_configure (unsigned chan,
+ 				   unsigned cflags, unsigned baud);
+@@ -39,16 +38,16 @@ extern void ma_uart_pre_configure (unsig
+ 
+ 
+ /* MA series timer C details.  */
+-#define NB85E_TIMER_C_BASE_ADDR		0xFFFFF600
++#define V850E_TIMER_C_BASE_ADDR		0xFFFFF600
+ 
+ 
+ /* MA series timer D details.  */
+-#define NB85E_TIMER_D_BASE_ADDR		0xFFFFF540
+-#define NB85E_TIMER_D_TMD_BASE_ADDR 	(NB85E_TIMER_D_BASE_ADDR + 0x0)
+-#define NB85E_TIMER_D_CMD_BASE_ADDR 	(NB85E_TIMER_D_BASE_ADDR + 0x2)
+-#define NB85E_TIMER_D_TMCD_BASE_ADDR 	(NB85E_TIMER_D_BASE_ADDR + 0x4)
++#define V850E_TIMER_D_BASE_ADDR		0xFFFFF540
++#define V850E_TIMER_D_TMD_BASE_ADDR 	(V850E_TIMER_D_BASE_ADDR + 0x0)
++#define V850E_TIMER_D_CMD_BASE_ADDR 	(V850E_TIMER_D_BASE_ADDR + 0x2)
++#define V850E_TIMER_D_TMCD_BASE_ADDR 	(V850E_TIMER_D_BASE_ADDR + 0x4)
+ 
+-#define NB85E_TIMER_D_BASE_FREQ		CPU_CLOCK_FREQ
++#define V850E_TIMER_D_BASE_FREQ		CPU_CLOCK_FREQ
+ 
+ 
+ /* Port 0 */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/me2.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,182 @@
++/*
++ * include/asm-v850/me2.h -- V850E/ME2 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>
++ */
++
++#ifndef __V850_ME2_H__
++#define __V850_ME2_H__
++
++#include <asm/v850e.h>
++#include <asm/v850e_cache.h>
++
++
++#define CPU_MODEL	"v850e/me2"
++#define CPU_MODEL_LONG	"NEC V850E/ME2"
++
++
++/* Hardware-specific interrupt numbers (in the kernel IRQ namespace).  */
++#define IRQ_INTP(n)       (n) /* Pnnn (pin) interrupts */
++#define IRQ_INTP_NUM      31
++#define IRQ_INTCMD(n)     (0x31 + (n)) /* interval timer interrupts 0-3 */
++#define IRQ_INTCMD_NUM    4
++#define IRQ_INTDMA(n)     (0x41 + (n)) /* DMA interrupts 0-3 */
++#define IRQ_INTDMA_NUM    4
++#define IRQ_INTUBTIRE(n)  (0x49 + (n)*5)/* UARTB 0-1 reception error */
++#define IRQ_INTUBTIRE_NUM 2
++#define IRQ_INTUBTIR(n)   (0x4a + (n)*5) /* UARTB 0-1 reception complete */
++#define IRQ_INTUBTIR_NUM  2
++#define IRQ_INTUBTIT(n)   (0x4b + (n)*5) /* UARTB 0-1 transmission complete */
++#define IRQ_INTUBTIT_NUM  2
++#define IRQ_INTUBTIF(n)   (0x4c + (n)*5) /* UARTB 0-1 FIFO trans. complete */
++#define IRQ_INTUBTIF_NUM  2
++#define IRQ_INTUBTITO(n)  (0x4d + (n)*5) /* UARTB 0-1 reception timeout */
++#define IRQ_INTUBTITO_NUM 2
++
++/* For <asm/irq.h> */
++#define NUM_CPU_IRQS		0x59 /* V850E/ME2 */
++
++
++/* 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.  */
++#define R0_RAM_ADDR			0xFFFFB000 /* V850E/ME2 */
++
++
++/* V850E/ME2 UARTB details.*/
++#define V850E_UART_NUM_CHANNELS		2
++#define V850E_UARTB_BASE_FREQ		(CPU_CLOCK_FREQ / 4)
++
++/* This is a function that gets called before configuring the UART.  */
++#define V850E_UART_PRE_CONFIGURE	me2_uart_pre_configure
++#ifndef __ASSEMBLY__
++extern void me2_uart_pre_configure (unsigned chan,
++				    unsigned cflags, unsigned baud);
++#endif /* __ASSEMBLY__ */
++
++
++/* V850E/ME2 timer C details.  */
++#define V850E_TIMER_C_BASE_ADDR		0xFFFFF600
++
++
++/* V850E/ME2 timer D details.  */
++#define V850E_TIMER_D_BASE_ADDR		0xFFFFF540
++#define V850E_TIMER_D_TMD_BASE_ADDR	(V850E_TIMER_D_BASE_ADDR + 0x0)
++#define V850E_TIMER_D_CMD_BASE_ADDR 	(V850E_TIMER_D_BASE_ADDR + 0x2)
++#define V850E_TIMER_D_TMCD_BASE_ADDR	(V850E_TIMER_D_BASE_ADDR + 0x4)
++
++#define V850E_TIMER_D_BASE_FREQ		(CPU_CLOCK_FREQ / 2)
++
++
++/* Select iRAM mode.  */
++#define ME2_IRAMM_ADDR			0xFFFFF80A
++#define ME2_IRAMM			(*(volatile u8*)ME2_IRAMM_ADDR)
++
++
++/* Interrupt edge-detection configuration.  INTF(n) and INTR(n) are only
++   valid for n == 1, 2, or 5.  */
++#define ME2_INTF_ADDR(n)		(0xFFFFFC00 + (n) * 0x2)
++#define ME2_INTF(n)			(*(volatile u8*)ME2_INTF_ADDR(n))
++#define ME2_INTR_ADDR(n)		(0xFFFFFC20 + (n) * 0x2)
++#define ME2_INTR(n)			(*(volatile u8*)ME2_INTR_ADDR(n))
++#define ME2_INTFAL_ADDR			0xFFFFFC10
++#define ME2_INTFAL			(*(volatile u8*)ME2_INTFAL_ADDR)
++#define ME2_INTRAL_ADDR			0xFFFFFC30
++#define ME2_INTRAL			(*(volatile u8*)ME2_INTRAL_ADDR)
++#define ME2_INTFDH_ADDR			0xFFFFFC16
++#define ME2_INTFDH			(*(volatile u16*)ME2_INTFDH_ADDR)
++#define ME2_INTRDH_ADDR			0xFFFFFC36
++#define ME2_INTRDH			(*(volatile u16*)ME2_INTRDH_ADDR)
++#define ME2_SESC_ADDR(n)		(0xFFFFF609 + (n) * 0x10)
++#define ME2_SESC(n)			(*(volatile u8*)ME2_SESC_ADDR(n))
++#define ME2_SESA10_ADDR			0xFFFFF5AD
++#define ME2_SESA10			(*(volatile u8*)ME2_SESA10_ADDR)
++#define ME2_SESA11_ADDR			0xFFFFF5DD
++#define ME2_SESA11			(*(volatile u8*)ME2_SESA11_ADDR)
++
++
++/* Port 1 */
++/* Direct I/O.  Bits 0-3 are pins P10-P13.  */
++#define ME2_PORT1_IO_ADDR		0xFFFFF402
++#define ME2_PORT1_IO			(*(volatile u8 *)ME2_PORT1_IO_ADDR)
++/* Port mode (for direct I/O, 0 = output, 1 = input).  */
++#define ME2_PORT1_PM_ADDR		0xFFFFF422
++#define ME2_PORT1_PM			(*(volatile u8 *)ME2_PORT1_PM_ADDR)
++/* Port mode control (0 = direct I/O mode, 1 = alternative I/O mode).  */
++#define ME2_PORT1_PMC_ADDR		0xFFFFF442
++#define ME2_PORT1_PMC			(*(volatile u8 *)ME2_PORT1_PMC_ADDR)
++/* Port function control (for serial interfaces, 0 = CSI30, 1 = UARTB0 ).  */
++#define ME2_PORT1_PFC_ADDR		0xFFFFF462
++#define ME2_PORT1_PFC			(*(volatile u8 *)ME2_PORT1_PFC_ADDR)
++
++/* Port 2 */
++/* Direct I/O.  Bits 0-3 are pins P20-P25.  */
++#define ME2_PORT2_IO_ADDR		0xFFFFF404
++#define ME2_PORT2_IO			(*(volatile u8 *)ME2_PORT2_IO_ADDR)
++/* Port mode (for direct I/O, 0 = output, 1 = input).  */
++#define ME2_PORT2_PM_ADDR		0xFFFFF424
++#define ME2_PORT2_PM			(*(volatile u8 *)ME2_PORT2_PM_ADDR)
++/* Port mode control (0 = direct I/O mode, 1 = alternative I/O mode).  */
++#define ME2_PORT2_PMC_ADDR		0xFFFFF444
++#define ME2_PORT2_PMC			(*(volatile u8 *)ME2_PORT2_PMC_ADDR)
++/* Port function control (for serial interfaces, 0 = INTP2x, 1 = UARTB1 ).  */
++#define ME2_PORT2_PFC_ADDR		0xFFFFF464
++#define ME2_PORT2_PFC			(*(volatile u8 *)ME2_PORT2_PFC_ADDR)
++
++/* Port 5 */
++/* Direct I/O.  Bits 0-5 are pins P50-P55.  */
++#define ME2_PORT5_IO_ADDR		0xFFFFF40A
++#define ME2_PORT5_IO			(*(volatile u8 *)ME2_PORT5_IO_ADDR)
++/* Port mode (for direct I/O, 0 = output, 1 = input).  */
++#define ME2_PORT5_PM_ADDR		0xFFFFF42A
++#define ME2_PORT5_PM			(*(volatile u8 *)ME2_PORT5_PM_ADDR)
++/* Port mode control (0 = direct I/O mode, 1 = alternative I/O mode).  */
++#define ME2_PORT5_PMC_ADDR		0xFFFFF44A
++#define ME2_PORT5_PMC			(*(volatile u8 *)ME2_PORT5_PMC_ADDR)
++/* Port function control ().  */
++#define ME2_PORT5_PFC_ADDR		0xFFFFF46A
++#define ME2_PORT5_PFC			(*(volatile u8 *)ME2_PORT5_PFC_ADDR)
++
++/* Port 6 */
++/* Direct I/O.  Bits 5-7 are pins P65-P67.  */
++#define ME2_PORT6_IO_ADDR		0xFFFFF40C
++#define ME2_PORT6_IO			(*(volatile u8 *)ME2_PORT6_IO_ADDR)
++/* Port mode (for direct I/O, 0 = output, 1 = input).  */
++#define ME2_PORT6_PM_ADDR		0xFFFFF42C
++#define ME2_PORT6_PM			(*(volatile u8 *)ME2_PORT6_PM_ADDR)
++/* Port mode control (0 = direct I/O mode, 1 = alternative I/O mode).  */
++#define ME2_PORT6_PMC_ADDR		0xFFFFF44C
++#define ME2_PORT6_PMC			(*(volatile u8 *)ME2_PORT6_PMC_ADDR)
++/* Port function control ().  */
++#define ME2_PORT6_PFC_ADDR		0xFFFFF46C
++#define ME2_PORT6_PFC			(*(volatile u8 *)ME2_PORT6_PFC_ADDR)
++
++/* Port 7 */
++/* Direct I/O.  Bits 2-7 are pins P72-P77.  */
++#define ME2_PORT7_IO_ADDR		0xFFFFF40E
++#define ME2_PORT7_IO			(*(volatile u8 *)ME2_PORT7_IO_ADDR)
++/* Port mode (for direct I/O, 0 = output, 1 = input).  */
++#define ME2_PORT7_PM_ADDR		0xFFFFF42E
++#define ME2_PORT7_PM			(*(volatile u8 *)ME2_PORT7_PM_ADDR)
++/* Port mode control (0 = direct I/O mode, 1 = alternative I/O mode).  */
++#define ME2_PORT7_PMC_ADDR		0xFFFFF44E
++#define ME2_PORT7_PMC			(*(volatile u8 *)ME2_PORT7_PMC_ADDR)
++/* Port function control ().  */
++#define ME2_PORT7_PFC_ADDR		0xFFFFF46E
++#define ME2_PORT7_PFC			(*(volatile u8 *)ME2_PORT7_PFC_ADDR)
++
++
++#ifndef __ASSEMBLY__
++/* Initialize V850E/ME2 chip interrupts.  */
++extern void me2_init_irqs (void);
++#endif /* !__ASSEMBLY__ */
++
++
++#endif /* __V850_ME2_H__ */
+--- linux-2.6.0-test1/include/asm-v850/nb85e_cache.h	2003-06-14 12:18:21.000000000 -0700
++++ /dev/null	2002-08-30 16:31:37.000000000 -0700
+@@ -1,78 +0,0 @@
+-/*
+- * include/asm-v850/nb85e_cache_cache.h -- Cache control for NB85E_CACHE212 and
+- * 	NB85E_CACHE213 cache memories
+- *
+- *  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
+- * archive for more details.
+- *
+- * Written by Miles Bader <miles@gnu.org>
+- */
+-
+-#ifndef __V850_NB85E_CACHE_H__
+-#define __V850_NB85E_CACHE_H__
+-
+-#include <asm/types.h>
+-
+-
+-/* Cache control registers.  */
+-#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
+-
+-/* For <asm/cache.h> */
+-#define L1_CACHE_BYTES				NB85E_CACHE_LINE_SIZE
+-
+-
+-#if defined(__KERNEL__) && !defined(__ASSEMBLY__)
+-
+-/* Set caching params via the BHC and DCC registers.  */
+-void nb85e_cache_enable (u16 bhc, u16 dcc);
+-
+-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
+-
+-#endif /* __KERNEL__ && !__ASSEMBLY__ */
+-
+-#endif /* __V850_NB85E_CACHE_H__ */
+--- linux-2.6.0-test1/include/asm-v850/nb85e.h	2003-06-14 12:18:21.000000000 -0700
++++ /dev/null	2002-08-30 16:31:37.000000000 -0700
+@@ -1,21 +0,0 @@
+-/*
+- * include/asm-v850/nb85e.h -- NB85E cpu core
+- *
+- *  Copyright (C) 2001,02  NEC Corporation
+- *  Copyright (C) 2001,02  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>
+- */
+-
+-#ifndef __V850_NB85E_H__
+-#define __V850_NB85E_H__
+-
+-#include <asm/nb85e_intc.h>
+-
+-#define CPU_ARCH "v850e"
+-
+-#endif /* __V850_NB85E_H__ */
+--- linux-2.6.0-test1/include/asm-v850/nb85e_intc.h	2003-06-14 12:18:29.000000000 -0700
++++ /dev/null	2002-08-30 16:31:37.000000000 -0700
+@@ -1,133 +0,0 @@
+-/*
+- * include/asm-v850/nb85e_intc.h -- NB85E cpu core interrupt controller (INTC)
+- *
+- *  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>
+- */
+-
+-#ifndef __V850_NB85E_INTC_H__
+-#define __V850_NB85E_INTC_H__
+-
+-
+-/* There are 4 16-bit `Interrupt Mask Registers' located contiguously
+-   starting from this base.  Each interrupt uses a single bit to
+-   indicated enabled/disabled status.  */
+-#define NB85E_INTC_IMR_BASE_ADDR  0xFFFFF100
+-#define NB85E_INTC_IMR_ADDR(irq)  (NB85E_INTC_IMR_BASE_ADDR + ((irq) >> 3))
+-#define NB85E_INTC_IMR_BIT(irq)	  ((irq) & 0x7)
+-
+-/* Each maskable interrupt has a single-byte control register at this
+-   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)	  (*(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.  */
+-#define NB85E_INTC_IC_MK_BIT	  6
+-#define NB85E_INTC_IC_MK	  (1 << NB85E_INTC_IC_MK_BIT)
+-/* 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__
+-
+-/* Enable interrupt handling for interrupt IRQ.  */
+-static inline void nb85e_intc_enable_irq (unsigned irq)
+-{
+-	__asm__ __volatile__ ("clr1 %0, [%1]"
+-			      :: "r" (NB85E_INTC_IMR_BIT (irq)),
+-			         "r" (NB85E_INTC_IMR_ADDR (irq))
+-			      : "memory");
+-}
+-
+-/* Disable interrupt handling for interrupt IRQ.  Note that any
+-   interrupts received while disabled will be delivered once the
+-   interrupt is enabled again, unless they are explicitly cleared using
+-   `nb85e_intc_clear_pending_irq'.  */
+-static inline void nb85e_intc_disable_irq (unsigned irq)
+-{
+-	__asm__ __volatile__ ("set1 %0, [%1]"
+-			      :: "r" (NB85E_INTC_IMR_BIT (irq)),
+-			         "r" (NB85E_INTC_IMR_ADDR (irq))
+-			      : "memory");
+-}
+-
+-/* Return true if interrupt handling for interrupt IRQ is enabled.  */
+-static inline int nb85e_intc_irq_enabled (unsigned irq)
+-{
+-	int rval;
+-	__asm__ __volatile__ ("tst1 %1, [%2]; setf z, %0"
+-			      : "=r" (rval)
+-			      : "r" (NB85E_INTC_IMR_BIT (irq)),
+-			        "r" (NB85E_INTC_IMR_ADDR (irq)));
+-	return rval;
+-}
+-
+-/* Disable irqs from 0 until LIMIT.  LIMIT must be a multiple of 8.  */
+-static inline void _nb85e_intc_disable_irqs (unsigned limit)
+-{
+-	unsigned long addr;
+-	for (addr = NB85E_INTC_IMR_BASE_ADDR; limit >= 8; addr++, limit -= 8)
+-		*(char *)addr = 0xFF;
+-}
+-
+-/* Disable all irqs.  This is purposely a macro, because NUM_MACH_IRQS
+-   will be only be defined later.  */
+-#define nb85e_intc_disable_irqs()   _nb85e_intc_disable_irqs (NUM_MACH_IRQS)
+-
+-/* Clear any pending interrupts for IRQ.  */
+-static inline void nb85e_intc_clear_pending_irq (unsigned irq)
+-{
+-	__asm__ __volatile__ ("clr1 %0, 0[%1]"
+-			      :: "i" (NB85E_INTC_IC_IF_BIT),
+-			         "r" (NB85E_INTC_IC_ADDR (irq))
+-			      : "memory");
+-}
+-
+-/* Return true if interrupt IRQ is pending (but disabled).  */
+-static inline int nb85e_intc_irq_pending (unsigned irq)
+-{
+-	int rval;
+-	__asm__ __volatile__ ("tst1 %1, 0[%2]; setf nz, %0"
+-			      : "=r" (rval)
+-			      : "i" (NB85E_INTC_IC_IF_BIT),
+-			        "r" (NB85E_INTC_IC_ADDR (irq)));
+-	return rval;
+-}
+-
+-
+-struct nb85e_intc_irq_init {
+-	const char *name;	/* name of interrupt type */
+-
+-	/* Range of kernel irq numbers for this type:
+-	   BASE, BASE+INTERVAL, ..., BASE+INTERVAL*NUM  */
+-	unsigned base, num, interval;
+-
+-	unsigned priority;	/* interrupt priority to assign */
+-};
+-struct hw_interrupt_type;	/* fwd decl */
+-
+-/* Initialize HW_IRQ_TYPES for INTC-controlled irqs described in array
+-   INITS (which is terminated by an entry with the name field == 0).  */
+-extern void nb85e_intc_init_irq_types (struct nb85e_intc_irq_init *inits,
+-				       struct hw_interrupt_type *hw_irq_types);
+-
+-
+-#endif /* !__ASSEMBLY__ */
+-
+-
+-#endif /* __V850_NB85E_INTC_H__ */
+--- linux-2.6.0-test1/include/asm-v850/nb85e_timer_c.h	2003-06-14 12:17:58.000000000 -0700
++++ /dev/null	2002-08-30 16:31:37.000000000 -0700
+@@ -1,48 +0,0 @@
+-/*
+- * include/asm-v850/nb85e_timer_c.h -- `Timer C' component often used
+- *	with the NB85E cpu core
+- *
+- *  Copyright (C) 2001  NEC Corporation
+- *  Copyright (C) 2001  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>
+- */
+-
+-/* NOTE: this include file currently contains only enough to allow us to
+-   use timer C as an interrupt pass-through.  */
+-
+-#ifndef __V850_NB85E_TIMER_C_H__
+-#define __V850_NB85E_TIMER_C_H__
+-
+-#include <asm/types.h>
+-#include <asm/machdep.h>	/* Pick up chip-specific defs.  */
+-
+-
+-/* Timer C (16-bit interval timers).  */
+-
+-/* Control register 0 for timer C.  */
+-#define NB85E_TIMER_C_TMCC0_ADDR(n) (NB85E_TIMER_C_BASE_ADDR + 0x6 + 0x10 *(n))
+-#define NB85E_TIMER_C_TMCC0(n)	  (*(volatile u8 *)NB85E_TIMER_C_TMCC0_ADDR(n))
+-#define NB85E_TIMER_C_TMCC0_CAE	  0x01 /* clock action enable */
+-#define NB85E_TIMER_C_TMCC0_CE	  0x02 /* count enable */
+-/* ... */
+-
+-/* Control register 1 for timer C.  */
+-#define NB85E_TIMER_C_TMCC1_ADDR(n) (NB85E_TIMER_C_BASE_ADDR + 0x8 + 0x10 *(n))
+-#define NB85E_TIMER_C_TMCC1(n)	  (*(volatile u8 *)NB85E_TIMER_C_TMCC1_ADDR(n))
+-#define NB85E_TIMER_C_TMCC1_CMS0  0x01 /* capture/compare mode select (ccc0) */
+-#define NB85E_TIMER_C_TMCC1_CMS1  0x02 /* capture/compare mode select (ccc1) */
+-/* ... */
+-
+-/* Interrupt edge-sensitivity control for timer C.  */
+-#define NB85E_TIMER_C_SESC_ADDR(n) (NB85E_TIMER_C_BASE_ADDR + 0x9 + 0x10 *(n))
+-#define NB85E_TIMER_C_SESC(n)	  (*(volatile u8 *)NB85E_TIMER_C_SESC_ADDR(n))
+-
+-/* ...etc... */
+-
+-
+-#endif /* __V850_NB85E_TIMER_C_H__  */
+--- linux-2.6.0-test1/include/asm-v850/nb85e_timer_d.h	2003-06-14 12:18:06.000000000 -0700
++++ /dev/null	2002-08-30 16:31:37.000000000 -0700
+@@ -1,62 +0,0 @@
+-/*
+- * include/asm-v850/nb85e_timer_d.h -- `Timer D' component often used
+- *	with the NB85E cpu core
+- *
+- *  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>
+- */
+-
+-#ifndef __V850_NB85E_TIMER_D_H__
+-#define __V850_NB85E_TIMER_D_H__
+-
+-#include <asm/types.h>
+-#include <asm/machdep.h>	/* Pick up chip-specific defs.  */
+-
+-
+-/* Timer D (16-bit interval timers).  */
+-
+-/* Count registers for timer D.  */
+-#define NB85E_TIMER_D_TMD_ADDR(n) (NB85E_TIMER_D_TMD_BASE_ADDR + 0x10 * (n))
+-#define NB85E_TIMER_D_TMD(n)	  (*(volatile u16 *)NB85E_TIMER_D_TMD_ADDR(n))
+-
+-/* 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)	  (*(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))
+-#define NB85E_TIMER_D_TMCD(n)	   (*(volatile u8 *)NB85E_TIMER_D_TMCD_ADDR(n))
+-/* Control bits for timer D.  */
+-#define NB85E_TIMER_D_TMCD_CE  	   0x2 /* count enable */
+-#define NB85E_TIMER_D_TMCD_CAE	   0x1 /* clock action enable */
+-/* Clock divider setting (log2).  */
+-#define NB85E_TIMER_D_TMCD_CS(divlog2) (((divlog2) - NB85E_TIMER_D_TMCD_CS_MIN) << 4)
+-/* Minimum clock divider setting (log2).  */
+-#ifndef NB85E_TIMER_D_TMCD_CS_MIN /* Can be overridden by mach-specific hdrs */
+-#define NB85E_TIMER_D_TMCD_CS_MIN  2 /* Default is correct for the v850e/ma1 */
+-#endif
+-/* Maximum clock divider setting (log2).  */
+-#define NB85E_TIMER_D_TMCD_CS_MAX  (NB85E_TIMER_D_TMCD_CS_MIN + 7)
+-
+-/* Return the clock-divider (log2) of timer D unit N.  */
+-#define NB85E_TIMER_D_DIVLOG2(n) \
+-  (((NB85E_TIMER_D_TMCD(n) >> 4) & 0x7) + NB85E_TIMER_D_TMCD_CS_MIN)
+-
+-
+-#ifndef __ASSEMBLY__
+-
+-/* Start interval timer TIMER (0-3).  The timer will issue the
+-   corresponding INTCMD interrupt RATE times per second.  This function
+-   does not enable the interrupt.  */
+-extern void nb85e_timer_d_configure (unsigned timer, unsigned rate);
+-
+-#endif /* !__ASSEMBLY__ */
+-
+-
+-#endif /* __V850_NB85E_TIMER_D_H__  */
+--- linux-2.6.0-test1/include/asm-v850/nb85e_uart.h	2003-06-14 12:18:50.000000000 -0700
++++ /dev/null	2002-08-30 16:31:37.000000000 -0700
+@@ -1,144 +0,0 @@
+-/*
+- * include/asm-v850/nb85e_uart.h -- On-chip UART often used with the
+- *	NB85E cpu core
+- *
+- *  Copyright (C) 2001,02  NEC Corporation
+- *  Copyright (C) 2001,02  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>
+- */
+-
+-/* There's not actually a single UART implementation used by nb85e
+-   derivatives, but rather a series of implementations that are all
+-   `close' to one another.  This file attempts to capture some
+-   commonality between them.  */
+-
+-#ifndef __V850_NB85E_UART_H__
+-#define __V850_NB85E_UART_H__
+-
+-#include <asm/types.h>
+-#include <asm/machdep.h>	/* Pick up chip-specific defs.  */
+-
+-
+-/* The base address of the UART control registers for channel N.
+-   The default is the address used on the V850E/MA1.  */
+-#ifndef NB85E_UART_BASE_ADDR
+-#define NB85E_UART_BASE_ADDR(n)		(0xFFFFFA00 + 0x10 * (n))
+-#endif 
+-
+-/* Addresses of specific UART control registers for channel N.
+-   The defaults are the addresses used on the V850E/MA1; if a platform
+-   wants to redefine any of these, it must redefine them all.  */
+-#ifndef NB85E_UART_ASIM_ADDR
+-#define NB85E_UART_ASIM_ADDR(n)		(NB85E_UART_BASE_ADDR(n) + 0x0)
+-#define NB85E_UART_RXB_ADDR(n)		(NB85E_UART_BASE_ADDR(n) + 0x2)
+-#define NB85E_UART_ASIS_ADDR(n)		(NB85E_UART_BASE_ADDR(n) + 0x3)
+-#define NB85E_UART_TXB_ADDR(n)		(NB85E_UART_BASE_ADDR(n) + 0x4)
+-#define NB85E_UART_ASIF_ADDR(n)		(NB85E_UART_BASE_ADDR(n) + 0x5)
+-#define NB85E_UART_CKSR_ADDR(n)		(NB85E_UART_BASE_ADDR(n) + 0x6)
+-#define NB85E_UART_BRGC_ADDR(n)		(NB85E_UART_BASE_ADDR(n) + 0x7)
+-#endif
+-
+-#ifndef NB85E_UART_CKSR_MAX_FREQ
+-#define NB85E_UART_CKSR_MAX_FREQ (25*1000*1000)
+-#endif
+-
+-/* UART config registers.  */
+-#define NB85E_UART_ASIM(n)	(*(volatile u8 *)NB85E_UART_ASIM_ADDR(n))
+-/* Control bits for config registers.  */
+-#define NB85E_UART_ASIM_CAE	0x80 /* clock enable */
+-#define NB85E_UART_ASIM_TXE	0x40 /* transmit enable */
+-#define NB85E_UART_ASIM_RXE	0x20 /* receive enable */
+-#define NB85E_UART_ASIM_PS_MASK	0x18 /* mask covering parity-select bits */
+-#define NB85E_UART_ASIM_PS_NONE	0x00 /* no parity */
+-#define NB85E_UART_ASIM_PS_ZERO	0x08 /* zero parity */
+-#define NB85E_UART_ASIM_PS_ODD	0x10 /* odd parity */
+-#define NB85E_UART_ASIM_PS_EVEN	0x18 /* even parity */
+-#define NB85E_UART_ASIM_CL_8	0x04 /* char len is 8 bits (otherwise, 7) */
+-#define NB85E_UART_ASIM_SL_2	0x02 /* 2 stop bits (otherwise, 1) */
+-#define NB85E_UART_ASIM_ISRM	0x01 /* generate INTSR interrupt on errors
+-					(otherwise, generate INTSER) */
+-
+-/* UART serial interface status registers.  */
+-#define NB85E_UART_ASIS(n)	(*(volatile u8 *)NB85E_UART_ASIS_ADDR(n))
+-/* Control bits for status registers.  */
+-#define NB85E_UART_ASIS_PE	0x04 /* parity error */
+-#define NB85E_UART_ASIS_FE	0x02 /* framing error */
+-#define NB85E_UART_ASIS_OVE	0x01 /* overrun error */
+-
+-/* UART serial interface transmission status registers.  */
+-#define NB85E_UART_ASIF(n)	(*(volatile u8 *)NB85E_UART_ASIF_ADDR(n))
+-#define NB85E_UART_ASIF_TXBF	0x02 /* transmit buffer flag (data in TXB) */
+-#define NB85E_UART_ASIF_TXSF	0x01 /* transmit shift flag (sending data) */
+-
+-/* UART receive buffer register.  */
+-#define NB85E_UART_RXB(n)	(*(volatile u8 *)NB85E_UART_RXB_ADDR(n))
+-
+-/* UART transmit buffer register.  */
+-#define NB85E_UART_TXB(n)	(*(volatile u8 *)NB85E_UART_TXB_ADDR(n))
+-
+-/* UART baud-rate generator control registers.  */
+-#define NB85E_UART_CKSR(n)	(*(volatile u8 *)NB85E_UART_CKSR_ADDR(n))
+-#define NB85E_UART_CKSR_MAX	11
+-#define NB85E_UART_BRGC(n)	(*(volatile u8 *)NB85E_UART_BRGC_ADDR(n))
+-
+-
+-/* This UART doesn't implement RTS/CTS by default, but some platforms
+-   implement them externally, so check to see if <asm/machdep.h> defined
+-   anything.  */
+-#ifdef NB85E_UART_CTS
+-#define nb85e_uart_cts(n)	NB85E_UART_CTS(n)
+-#else
+-#define nb85e_uart_cts(n)	(1)
+-#endif
+-
+-/* Do the same for RTS.  */
+-#ifdef NB85E_UART_SET_RTS
+-#define nb85e_uart_set_rts(n,v)	NB85E_UART_SET_RTS(n,v)
+-#else
+-#define nb85e_uart_set_rts(n,v)	((void)0)
+-#endif
+-
+-/* Return true if all characters awaiting transmission on uart channel N
+-   have been transmitted.  */
+-#define nb85e_uart_xmit_done(n)						      \
+-   (! (NB85E_UART_ASIF(n) & NB85E_UART_ASIF_TXBF))
+-/* Wait for this to be true.  */
+-#define nb85e_uart_wait_for_xmit_done(n)				      \
+-   do { } while (! nb85e_uart_xmit_done (n))
+-
+-/* Return true if uart channel N is ready to transmit a character.  */
+-#define nb85e_uart_xmit_ok(n)						      \
+-   (nb85e_uart_xmit_done(n) && nb85e_uart_cts(n))
+-/* Wait for this to be true.  */
+-#define nb85e_uart_wait_for_xmit_ok(n)					      \
+-   do { } while (! nb85e_uart_xmit_ok (n))
+-
+-/* Write character CH to uart channel N.  */
+-#define nb85e_uart_putc(n, ch)	(NB85E_UART_TXB(n) = (ch))
+-
+-
+-#define NB85E_UART_MINOR_BASE	64
+-
+-
+-#ifndef __ASSEMBLY__
+-
+-/* Setup a console using channel 0 of the builtin uart.  */
+-extern void nb85e_uart_cons_init (unsigned chan);
+-
+-/* Configure and turn on uart channel CHAN, using the termios `control
+-   modes' bits in CFLAGS, and a baud-rate of BAUD.  */
+-void nb85e_uart_configure (unsigned chan, unsigned cflags, unsigned baud);
+-
+-/* If the macro NB85E_UART_PRE_CONFIGURE is defined (presumably by a
+-   <asm/machdep.h>), it is called from nb85e_uart_pre_configure before
+-   anything else is done, with interrupts disabled.  */
+-
+-#endif /* !__ASSEMBLY__ */
+-
+-
+-#endif /* __V850_NB85E_UART_H__ */
+--- linux-2.6.0-test1/include/asm-v850/nb85e_utils.h	2003-06-14 12:18:20.000000000 -0700
++++ /dev/null	2002-08-30 16:31:37.000000000 -0700
+@@ -1,35 +0,0 @@
+-/*
+- * include/asm-v850/nb85e_utils.h -- Utility functions associated with
+- *	the NB85E cpu core
+- *
+- *  Copyright (C) 2001  NEC Corporation
+- *  Copyright (C) 2001  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>
+- */
+-
+-#ifndef __V850_NB85E_UTILS_H__
+-#define __V850_NB85E_UTILS_H__
+-
+-/* Calculate counter clock-divider and count values to attain the
+-   desired frequency RATE from the base frequency BASE_FREQ.  The
+-   counter is expected to have a clock-divider, which can divide the
+-   system cpu clock by a power of two value from MIN_DIVLOG2 to
+-   MAX_DIV_LOG2, and a word-size of COUNTER_SIZE bits (the counter
+-   counts up and resets whenever it's equal to the compare register,
+-   generating an interrupt or whatever when it does so).  The returned
+-   values are: *DIVLOG2 -- log2 of the desired clock divider and *COUNT
+-   -- the counter compare value to use.  Returns true if it was possible
+-   to find a reasonable value, otherwise false (and the other return
+-   values will be set to be as good as possible).  */
+-extern int calc_counter_params (unsigned long base_freq,
+-				unsigned long rate,
+-				unsigned min_divlog2, unsigned max_divlog2,
+-				unsigned counter_size,
+-				unsigned *divlog2, unsigned *count);
+-
+-#endif /* __V850_NB85E_UTILS_H__ */
+--- linux-2.6.0-test1/include/asm-v850/pgtable.h	2003-06-14 12:18:25.000000000 -0700
++++ 25/include/asm-v850/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -13,6 +13,11 @@ typedef pte_t *pte_addr_t;
+ #define pgd_clear(pgdp)		((void)0)
+ 
+ #define	pmd_offset(a, b)	((void *)0)
++#define pmd_offset_kernel(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)	pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)				do { } while (0)
++#define pmd_unmap_nested(pmd)			do { } while (0)
+ 
+ #define kern_addr_valid(addr)	(1)
+ 
+--- linux-2.6.0-test1/include/asm-v850/posix_types.h	2003-06-14 12:18:52.000000000 -0700
++++ 25/include/asm-v850/posix_types.h	2003-07-19 17:06:39.000000000 -0700
+@@ -14,7 +14,9 @@
+ #ifndef __V850_POSIX_TYPES_H__
+ #define __V850_POSIX_TYPES_H__
+ 
+-typedef unsigned int	__kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long	__kernel_dev_t;
++#endif
+ typedef unsigned long	__kernel_ino_t;
+ typedef unsigned long long __kernel_ino64_t;
+ typedef unsigned int	__kernel_mode_t;
+--- linux-2.6.0-test1/include/asm-v850/processor.h	2003-06-14 12:18:04.000000000 -0700
++++ 25/include/asm-v850/processor.h	2003-07-19 17:03:51.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  * include/asm-v850/processor.h
+  *
+- *  Copyright (C) 2001,02,03  NEC Corporation
++ *  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
+--- linux-2.6.0-test1/include/asm-v850/ptrace.h	2003-06-14 12:18:51.000000000 -0700
++++ 25/include/asm-v850/ptrace.h	2003-07-19 17:03:51.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  * include/asm-v850/ptrace.h -- Access to CPU registers
+  *
+- *  Copyright (C) 2001,02,03  NEC Corporation
++ *  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
+--- linux-2.6.0-test1/include/asm-v850/rte_cb.h	2003-06-14 12:18:08.000000000 -0700
++++ 25/include/asm-v850/rte_cb.h	2003-07-19 17:03:51.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  * include/asm-v850/rte_cb.h -- Midas labs RTE-CB series of evaluation boards
+  *
+- *  Copyright (C) 2001,02,03  NEC Corporation
++ *  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
+@@ -20,42 +20,54 @@
+ #define MB_A_SRAM_SIZE		0x00200000 /* 2MB */
+ 
+ 
++#ifdef CONFIG_RTE_GBUS_INT
+ /* GBUS interrupt support.  */
+-#define GBUS_INT_BASE_IRQ	NUM_CPU_IRQS
+-#define GBUS_INT_BASE_ADDR	(GCS2_ADDR + 0x00006000)
+-#include <asm/gbus_int.h>
+ 
+-/* We define NUM_MACH_IRQS to include extra interrupts from the GBUS.  */
+-#define NUM_MACH_IRQS		(NUM_CPU_IRQS + IRQ_GBUS_INT_NUM)
++# include <asm/gbus_int.h>
++
++# define GBUS_INT_BASE_IRQ	NUM_RTE_CB_IRQS
++# define GBUS_INT_BASE_ADDR	(GCS2_ADDR + 0x00006000)
+ 
+ /* Some specific interrupts.  */
+-#define IRQ_MB_A_LAN		IRQ_GBUS_INT(10)
+-#define IRQ_MB_A_PCI1(n)	(IRQ_GBUS_INT(16) + (n))
+-#define IRQ_MB_A_PCI1_NUM	4
+-#define IRQ_MB_A_PCI2(n)	(IRQ_GBUS_INT(20) + (n))
+-#define IRQ_MB_A_PCI2_NUM	4
+-#define IRQ_MB_A_EXT(n)		(IRQ_GBUS_INT(24) + (n))
+-#define IRQ_MB_A_EXT_NUM	4
+-#define IRQ_MB_A_USB_OC(n)	(IRQ_GBUS_INT(28) + (n))
+-#define IRQ_MB_A_USB_OC_NUM	2
+-#define IRQ_MB_A_PCMCIA_OC	IRQ_GBUS_INT(30)
++# define IRQ_MB_A_LAN		IRQ_GBUS_INT(10)
++# define IRQ_MB_A_PCI1(n)	(IRQ_GBUS_INT(16) + (n))
++# define IRQ_MB_A_PCI1_NUM	4
++# define IRQ_MB_A_PCI2(n)	(IRQ_GBUS_INT(20) + (n))
++# define IRQ_MB_A_PCI2_NUM	4
++# define IRQ_MB_A_EXT(n)	(IRQ_GBUS_INT(24) + (n))
++# define IRQ_MB_A_EXT_NUM	4
++# define IRQ_MB_A_USB_OC(n)	(IRQ_GBUS_INT(28) + (n))
++# define IRQ_MB_A_USB_OC_NUM	2
++# define IRQ_MB_A_PCMCIA_OC	IRQ_GBUS_INT(30)
++
++/* We define NUM_MACH_IRQS to include extra interrupts from the GBUS.  */
++# define NUM_MACH_IRQS		(NUM_RTE_CB_IRQS + IRQ_GBUS_INT_NUM)
+ 
++#else /* !CONFIG_RTE_GBUS_INT */
+ 
++# define NUM_MACH_IRQS		NUM_RTE_CB_IRQS
++
++#endif /* CONFIG_RTE_GBUS_INT */
++
++
++#ifdef CONFIG_RTE_MB_A_PCI
+ /* Mother-A PCI bus support.  */
+-#include <asm/rte_mb_a_pci.h>
++
++# include <asm/rte_mb_a_pci.h>
+ 
+ /* These are the base addresses used for allocating device address
+    space.  512K of the motherboard SRAM is in the same space, so we have
+    to be careful not to let it be allocated.  */
+-#define PCIBIOS_MIN_MEM		(MB_A_PCI_MEM_ADDR + 0x80000)
+-#define PCIBIOS_MIN_IO		MB_A_PCI_IO_ADDR
++# define PCIBIOS_MIN_MEM	(MB_A_PCI_MEM_ADDR + 0x80000)
++# define PCIBIOS_MIN_IO		MB_A_PCI_IO_ADDR
+ 
+ /* As we don't really support PCI DMA to cpu memory, and use bounce-buffers
+    instead, perversely enough, this becomes always true! */
+-#define pci_dma_supported(dev, mask)		1
+-#define pci_dac_dma_supported(dev, mask)	0
+-#define pcibios_assign_all_busses()		1
++# define pci_dma_supported(dev, mask)		1
++# define pci_dac_dma_supported(dev, mask)	0
++# define pcibios_assign_all_busses()		1
+ 
++#endif /* CONFIG_RTE_MB_A_PCI */
+ 
+ 
+ /* For <asm/param.h> */
+--- linux-2.6.0-test1/include/asm-v850/rte_ma1_cb.h	2003-06-14 12:17:59.000000000 -0700
++++ 25/include/asm-v850/rte_ma1_cb.h	2003-07-19 17:03:51.000000000 -0700
+@@ -17,25 +17,6 @@
+ #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
+-   pins on the CPU.  These are shared among the GBUS interrupts.  */
+-#define IRQ_GINT(n)		IRQ_INTP(n)
+-#define IRQ_GINT_NUM		4
+-
+-
+ #define PLATFORM		"rte-v850e/ma1-cb"
+ #define PLATFORM_LONG		"Midas lab RTE-V850E/MA1-CB"
+ 
+@@ -53,10 +34,32 @@
+ #define SDRAM_SIZE		0x02000000 /* 32MB */
+ 
+ 
++/* 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 */
++
++
+ /* For <asm/page.h> */
+ #define PAGE_OFFSET 		SRAM_ADDR
+ 
+ 
++/* The GBUS GINT0 - GINT3 interrupts are connected to the INTP000 - INTP011
++   pins on the CPU.  These are shared among the GBUS interrupts.  */
++#define IRQ_GINT(n)		IRQ_INTP(n)
++#define IRQ_GINT_NUM		4
++
++/* Used by <asm/rte_cb.h> to derive NUM_MACH_IRQS.  */
++#define NUM_RTE_CB_IRQS		NUM_CPU_IRQS
++
++
+ #ifdef CONFIG_ROM_KERNEL
+ /* Kernel is in ROM, starting at address 0.  */
+ 
+@@ -98,8 +101,8 @@
+ 
+ /* Override the basic MA uart pre-initialization so that we can
+    initialize extra stuff.  */
+-#undef NB85E_UART_PRE_CONFIGURE	/* should be defined by <asm/ma.h> */
+-#define NB85E_UART_PRE_CONFIGURE	rte_ma1_cb_uart_pre_configure
++#undef V850E_UART_PRE_CONFIGURE	/* should be defined by <asm/ma.h> */
++#define V850E_UART_PRE_CONFIGURE	rte_ma1_cb_uart_pre_configure
+ #ifndef __ASSEMBLY__
+ extern void rte_ma1_cb_uart_pre_configure (unsigned chan,
+ 					   unsigned cflags, unsigned baud);
+@@ -108,9 +111,9 @@ extern void rte_ma1_cb_uart_pre_configur
+ /* This board supports RTS/CTS for the on-chip UART, but only for channel 0. */
+ 
+ /* CTS for UART channel 0 is pin P43 (bit 3 of port 4).  */
+-#define NB85E_UART_CTS(chan)	((chan) == 0 ? !(MA_PORT4_IO & 0x8) : 1)
++#define V850E_UART_CTS(chan)	((chan) == 0 ? !(MA_PORT4_IO & 0x8) : 1)
+ /* RTS for UART channel 0 is pin P42 (bit 2 of port 4).  */
+-#define NB85E_UART_SET_RTS(chan, val)					      \
++#define V850E_UART_SET_RTS(chan, val)					      \
+    do {									      \
+ 	   if (chan == 0) {						      \
+ 		   unsigned old = MA_PORT4_IO; 				      \
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/rte_me2_cb.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,202 @@
++/*
++ * include/asm-v850/rte_me2_cb.h -- Midas labs RTE-V850E/ME2-CB board
++ *
++ *  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
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#ifndef __V850_RTE_ME2_CB_H__
++#define __V850_RTE_ME2_CB_H__
++
++#include <asm/rte_cb.h>		/* Common defs for Midas RTE-CB boards.  */
++
++
++#define PLATFORM		"rte-v850e/me2-cb"
++#define PLATFORM_LONG		"Midas lab RTE-V850E/ME2-CB"
++
++#define CPU_CLOCK_FREQ		150000000 /* 150MHz */
++#define FIXED_BOGOMIPS		50
++
++/* 32MB of onbard SDRAM.  */
++#define SDRAM_ADDR		0x00800000
++#define SDRAM_SIZE		0x02000000 /* 32MB */
++
++
++/* CPU addresses of GBUS memory spaces.  */
++#define GCS0_ADDR		0x04000000 /* GCS0 - Common SRAM (2MB) */
++#define GCS0_SIZE		0x00800000 /*   8MB */
++#define GCS1_ADDR		0x04800000 /* GCS1 - Flash ROM (8MB) */
++#define GCS1_SIZE		0x00800000 /*   8MB */
++#define GCS2_ADDR		0x07000000 /* GCS2 - I/O registers */
++#define GCS2_SIZE		0x00800000 /*   8MB */
++#define GCS5_ADDR		0x08000000 /* GCS5 - PCI bus space */
++#define GCS5_SIZE		0x02000000 /*   32MB */
++#define GCS6_ADDR		0x07800000 /* GCS6 - PCI control registers */
++#define GCS6_SIZE		0x00800000 /*   8MB */
++
++
++/* For <asm/page.h> */
++#define PAGE_OFFSET 		SDRAM_ADDR
++
++
++#ifdef CONFIG_ROM_KERNEL
++/* Kernel is in ROM, starting at address 0.  */
++
++#define INTV_BASE		0
++#define ROOT_FS_IMAGE_RW	0
++
++#else /* !CONFIG_ROM_KERNEL */
++/* Using RAM-kernel.  Assume some sort of boot-loader got us loaded at
++   address 0.  */
++
++#define INTV_BASE		0
++#define ROOT_FS_IMAGE_RW	1
++
++#endif /* CONFIG_ROM_KERNEL */
++
++
++/* Some misc. on-board devices.  */
++
++/* Seven-segment LED display (four digits).  */
++#define LED_ADDR(n)		(0x0FE02000 + (n))
++#define LED(n)			(*(volatile unsigned char *)LED_ADDR(n))
++#define LED_NUM_DIGITS		4
++
++
++/* On-board PIC.  */
++
++#define CB_PIC_BASE_ADDR 	0x0FE04000
++
++#define CB_PIC_INT0M_ADDR 	(CB_PIC_BASE_ADDR + 0x00)
++#define CB_PIC_INT0M      	(*(volatile u16 *)CB_PIC_INT0M_ADDR)
++#define CB_PIC_INT1M_ADDR 	(CB_PIC_BASE_ADDR + 0x10)
++#define CB_PIC_INT1M      	(*(volatile u16 *)CB_PIC_INT1M_ADDR)
++#define CB_PIC_INTR_ADDR  	(CB_PIC_BASE_ADDR + 0x20)
++#define CB_PIC_INTR       	(*(volatile u16 *)CB_PIC_INTR_ADDR)
++#define CB_PIC_INTEN_ADDR 	(CB_PIC_BASE_ADDR + 0x30)
++#define CB_PIC_INTEN      	(*(volatile u16 *)CB_PIC_INTEN_ADDR)
++
++#define CB_PIC_INT0EN        	0x0001
++#define CB_PIC_INT1EN        	0x0002
++#define CB_PIC_INT0SEL       	0x0080
++
++/* The PIC interrupts themselves.  */
++#define CB_PIC_BASE_IRQ		NUM_CPU_IRQS
++#define IRQ_CB_PIC_NUM		10
++
++/* Some specific CB_PIC interrupts. */
++#define IRQ_CB_EXTTM0		(CB_PIC_BASE_IRQ + 0)
++#define IRQ_CB_EXTSIO		(CB_PIC_BASE_IRQ + 1)
++#define IRQ_CB_TOVER		(CB_PIC_BASE_IRQ + 2)
++#define IRQ_CB_GINT0		(CB_PIC_BASE_IRQ + 3)
++#define IRQ_CB_USB		(CB_PIC_BASE_IRQ + 4)
++#define IRQ_CB_LANC		(CB_PIC_BASE_IRQ + 5)
++#define IRQ_CB_USB_VBUS_ON	(CB_PIC_BASE_IRQ + 6)
++#define IRQ_CB_USB_VBUS_OFF	(CB_PIC_BASE_IRQ + 7)
++#define IRQ_CB_EXTTM1		(CB_PIC_BASE_IRQ + 8)
++#define IRQ_CB_EXTTM2		(CB_PIC_BASE_IRQ + 9)
++
++/* The GBUS GINT1 - GINT3 (note, not GINT0!) interrupts are connected to
++   the INTP65 - INTP67 pins on the CPU.  These are shared among the GBUS
++   interrupts.  */
++#define IRQ_GINT(n)		IRQ_INTP((n) + 9)  /* 0 is unused! */
++#define IRQ_GINT_NUM		4		   /* 0 is unused! */
++
++/* The shared interrupt line from the PIC is connected to CPU pin INTP23.  */
++#define IRQ_CB_PIC		IRQ_INTP(4) /* P23 */
++
++/* Used by <asm/rte_cb.h> to derive NUM_MACH_IRQS.  */
++#define NUM_RTE_CB_IRQS		(NUM_CPU_IRQS + IRQ_CB_PIC_NUM)
++
++
++#ifndef __ASSEMBLY__
++struct cb_pic_irq_init {
++	const char *name;	/* name of interrupt type */
++
++	/* Range of kernel irq numbers for this type:
++	   BASE, BASE+INTERVAL, ..., BASE+INTERVAL*NUM  */
++	unsigned base, num, interval;
++
++	unsigned priority;	/* interrupt priority to assign */
++};
++struct hw_interrupt_type;	/* fwd decl */
++
++/* Enable interrupt handling for interrupt IRQ.  */
++extern void cb_pic_enable_irq (unsigned irq);
++/* Disable interrupt handling for interrupt IRQ.  Note that any interrupts
++   received while disabled will be delivered once the interrupt is enabled
++   again, unless they are explicitly cleared using `cb_pic_clear_pending_irq'.  */
++extern void cb_pic_disable_irq (unsigned irq);
++/* Initialize HW_IRQ_TYPES for PIC irqs described in array INITS (which is
++   terminated by an entry with the name field == 0).  */
++extern void cb_pic_init_irq_types (struct cb_pic_irq_init *inits,
++				   struct hw_interrupt_type *hw_irq_types);
++/* Initialize PIC interrupts.  */
++extern void cb_pic_init_irqs (void);
++#endif /* __ASSEMBLY__ */
++
++
++/* TL16C550C on board UART see also asm/serial.h */
++#define CB_UART_BASE    	0x0FE08000
++#define CB_UART_REG_GAP 	0x10
++#define CB_UART_CLOCK   	0x16000000
++
++/* CompactFlash setting see also asm/ide.h, asm/hdreg.h.  */
++#define CB_CF_BASE     		0x0FE0C000
++#define CB_CF_CCR_ADDR 		(CB_CF_BASE+0x200)
++#define CB_CF_CCR      		(*(volatile u8 *)CB_CF_CCR_ADDR)
++#define CB_CF_REG0_ADDR		(CB_CF_BASE+0x1000)
++#define CB_CF_REG0     		(*(volatile u16 *)CB_CF_REG0_ADDR)
++#define CB_CF_STS0_ADDR		(CB_CF_BASE+0x1004)
++#define CB_CF_STS0     		(*(volatile u16 *)CB_CF_STS0_ADDR)
++#define CB_PCATA_BASE  		(CB_CF_BASE+0x800)
++#define CB_IDE_BASE    		(CB_CF_BASE+0x9F0)
++#define CB_IDE_CTRL    		(CB_CF_BASE+0xBF6)
++#define CB_IDE_REG_OFFS		0x1
++
++
++/* SMSC LAN91C111 setting */
++#if defined(CONFIG_SMC91111)
++#define CB_LANC_BASE 		0x0FE10300
++#define CONFIG_SMC16BITONLY
++#define ETH0_ADDR 		CB_LANC_BASE
++#define ETH0_IRQ 		IRQ_CB_LANC
++#endif /* CONFIG_SMC16BITONLY */
++
++
++#undef V850E_UART_PRE_CONFIGURE
++#define V850E_UART_PRE_CONFIGURE	rte_me2_cb_uart_pre_configure
++#ifndef __ASSEMBLY__
++extern void rte_me2_cb_uart_pre_configure (unsigned chan,
++					   unsigned cflags, unsigned baud);
++#endif /* __ASSEMBLY__ */
++
++/* This board supports RTS/CTS for the on-chip UART, but only for channel 0. */
++
++/* CTS for UART channel 0 is pin P22 (bit 2 of port 2).  */
++#define V850E_UART_CTS(chan)	((chan) == 0 ? !(ME2_PORT2_IO & 0x4) : 1)
++/* RTS for UART channel 0 is pin P21 (bit 1 of port 2).  */
++#define V850E_UART_SET_RTS(chan, val)					      \
++   do {									      \
++	   if (chan == 0) {						      \
++		   unsigned old = ME2_PORT2_IO; 			      \
++		   if (val)						      \
++			   ME2_PORT2_IO = old & ~0x2;			      \
++		   else							      \
++			   ME2_PORT2_IO = old | 0x2;			      \
++	   }								      \
++   } while (0)
++
++
++#ifndef __ASSEMBLY__
++extern void rte_me2_cb_init_irqs (void);
++#endif /* !__ASSEMBLY__ */
++
++
++#endif /* __V850_RTE_ME2_CB_H__ */
+--- linux-2.6.0-test1/include/asm-v850/rte_nb85e_cb.h	2003-06-14 12:18:30.000000000 -0700
++++ 25/include/asm-v850/rte_nb85e_cb.h	2003-07-19 17:03:51.000000000 -0700
+@@ -17,6 +17,21 @@
+ #include <asm/rte_cb.h>		/* Common defs for Midas RTE-CB boards.  */
+ 
+ 
++#define PLATFORM		"rte-v850e/nb85e-cb"
++#define PLATFORM_LONG		"Midas lab RTE-V850E/NB85E-CB"
++
++#define CPU_CLOCK_FREQ		50000000 /* 50MHz */
++
++/* 1MB of onboard SRAM.  Note that the monitor ROM uses parts of this
++   for its own purposes, so care must be taken.  */
++#define SRAM_ADDR		0x03C00000
++#define SRAM_SIZE		0x00100000 /* 1MB */
++
++/* 16MB of onbard SDRAM.  */
++#define SDRAM_ADDR		0x01000000
++#define SDRAM_SIZE		0x01000000 /* 16MB */
++
++
+ /* CPU addresses of GBUS memory spaces.  */
+ #define GCS0_ADDR		0x00400000 /* GCS0 - Common SRAM (2MB) */
+ #define GCS0_SIZE		0x00400000 /*   4MB */
+@@ -39,20 +54,8 @@
+ #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"
+-
+-#define CPU_CLOCK_FREQ	50000000 /* 50MHz */
+-
+-/* 1MB of onboard SRAM.  Note that the monitor ROM uses parts of this
+-   for its own purposes, so care must be taken.  */
+-#define SRAM_ADDR	0x03C00000
+-#define SRAM_SIZE	0x00100000 /* 1MB */
+-
+-/* 16MB of onbard SDRAM.  */
+-#define SDRAM_ADDR	0x01000000
+-#define SDRAM_SIZE	0x01000000 /* 16MB */
++/* Used by <asm/rte_cb.h> to derive NUM_MACH_IRQS.  */
++#define NUM_RTE_CB_IRQS		NUM_CPU_IRQS
+ 
+ 
+ #ifdef CONFIG_ROM_KERNEL
+@@ -86,8 +89,8 @@
+ 
+ /* 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
++#undef V850E_UART_PRE_CONFIGURE	/* should be defined by <asm/teg.h> */
++#define V850E_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);
+@@ -96,9 +99,9 @@ extern void rte_nb85e_cb_uart_pre_config
+ /* This board supports RTS/CTS for the on-chip UART. */
+ 
+ /* CTS is pin P00.  */
+-#define NB85E_UART_CTS(chan)	(! (TEG_PORT0_IO & 0x1))
++#define V850E_UART_CTS(chan)	(! (TEG_PORT0_IO & 0x1))
+ /* RTS is pin P02.  */
+-#define NB85E_UART_SET_RTS(chan, val)					      \
++#define V850E_UART_SET_RTS(chan, val)					      \
+    do {									      \
+ 	   unsigned old = TEG_PORT0_IO;					      \
+ 	   TEG_PORT0_IO = val ? (old & ~0x4) : (old | 0x4);		      \
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/serial.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,58 @@
++/*
++ * 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 by Ralf Baechle
++ * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
++ */ 
++#include <linux/config.h>
++
++#ifdef CONFIG_RTE_CB_ME2
++
++#include <asm/rte_me2_cb.h>
++
++#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST)
++
++#define irq_cannonicalize(x) (x)
++#define BASE_BAUD	250000	/* (16MHz / (16 * 38400)) * 9600 */
++#define RS_TABLE_SIZE	1
++#define SERIAL_PORT_DFNS \
++   { 0, BASE_BAUD, CB_UART_BASE, IRQ_CB_EXTSIO, STD_COM_FLAGS },
++
++/* Redefine UART register offsets.  */
++#undef UART_RX
++#undef UART_TX
++#undef UART_DLL
++#undef UART_TRG
++#undef UART_DLM
++#undef UART_IER
++#undef UART_FCTR
++#undef UART_IIR
++#undef UART_FCR
++#undef UART_EFR
++#undef UART_LCR
++#undef UART_MCR
++#undef UART_LSR
++#undef UART_MSR
++#undef UART_SCR
++#undef UART_EMSR
++
++#define UART_RX		(0 * CB_UART_REG_GAP)
++#define UART_TX		(0 * CB_UART_REG_GAP)
++#define UART_DLL	(0 * CB_UART_REG_GAP)
++#define UART_TRG	(0 * CB_UART_REG_GAP)
++#define UART_DLM	(1 * CB_UART_REG_GAP)
++#define UART_IER	(1 * CB_UART_REG_GAP)
++#define UART_FCTR	(1 * CB_UART_REG_GAP)
++#define UART_IIR	(2 * CB_UART_REG_GAP)
++#define UART_FCR	(2 * CB_UART_REG_GAP)
++#define UART_EFR	(2 * CB_UART_REG_GAP)
++#define UART_LCR	(3 * CB_UART_REG_GAP)
++#define UART_MCR	(4 * CB_UART_REG_GAP)
++#define UART_LSR	(5 * CB_UART_REG_GAP)
++#define UART_MSR	(6 * CB_UART_REG_GAP)
++#define UART_SCR	(7 * CB_UART_REG_GAP)
++#define UART_EMSR	(7 * CB_UART_REG_GAP)
++
++#endif /* CONFIG_RTE_CB_ME2 */
+--- linux-2.6.0-test1/include/asm-v850/sim85e2c.h	2003-06-14 12:18:01.000000000 -0700
++++ 25/include/asm-v850/sim85e2c.h	2003-07-19 17:03:51.000000000 -0700
+@@ -15,78 +15,12 @@
+ #ifndef __V850_SIM85E2C_H__
+ #define __V850_SIM85E2C_H__
+ 
++/* Use generic sim85e2 settings, other than the various names.  */
++#include <asm/sim85e2.h>
+ 
+-#define CPU_ARCH 	"v850e2"
+ #define CPU_MODEL	"v850e2"
+ #define CPU_MODEL_LONG	"NEC V850E2"
+ #define PLATFORM	"sim85e2c"
+ #define PLATFORM_LONG	"SIM85E2C V850E2 simulator"
+ 
+-
+-/* Various memory areas supported by the simulator.
+-   These should match the corresponding definitions in the linker script.  */
+-
+-/* `instruction RAM'; instruction fetches are much faster from IRAM than
+-   from DRAM.  */
+-#define IRAM_ADDR		0
+-#define IRAM_SIZE		0x00100000 /* 1MB */
+-/* `data RAM', below and contiguous with the I/O space.
+-   Data fetches are much faster from DRAM than from IRAM.  */
+-#define DRAM_ADDR		0xfff00000
+-#define DRAM_SIZE		0x000ff000 /* 1020KB */
+-/* `external ram'.  Unlike the above RAM areas, this memory is cached,
+-   so both instruction and data fetches should be (mostly) fast --
+-   however, currently only write-through caching is supported, so writes
+-   to ERAM will be slow.  */
+-#define ERAM_ADDR		0x00100000
+-#define ERAM_SIZE		0x07f00000 /* 127MB (max) */
+-
+-
+-/* CPU core control registers; these should be expanded and moved into
+-   separate header files when we support some other processors based on
+-   the same E2 core.  */
+-/* Bus Transaction Control Register */
+-#define NA85E2C_CACHE_BTSC_ADDR	0xfffff070
+-#define NA85E2C_CACHE_BTSC 	(*(volatile unsigned short *)NA85E2C_CACHE_BTSC_ADDR)
+-#define NA85E2C_CACHE_BTSC_ICM	0x1 /* icache enable */
+-#define NA85E2C_CACHE_BTSC_DCM0	0x4 /* dcache enable, bit 0 */
+-#define NA85E2C_CACHE_BTSC_DCM1	0x8 /* dcache enable, bit 1 */
+-/* Cache Configuration Register */
+-#define NA85E2C_BUSM_BHC_ADDR	0xfffff06a
+-#define NA85E2C_BUSM_BHC	(*(volatile unsigned short *)NA85E2C_BUSM_BHC_ADDR)
+-
+-/* Simulator specific control registers.  */
+-/* NOTHAL controls whether the simulator will stop at a `halt' insn.  */
+-#define NOTHAL_ADDR		0xffffff22
+-#define NOTHAL			(*(volatile unsigned char *)NOTHAL_ADDR)
+-/* The simulator will stop N cycles after N is written to SIMFIN.  */
+-#define SIMFIN_ADDR		0xffffff24
+-#define SIMFIN			(*(volatile unsigned short *)SIMFIN_ADDR)
+-
+-
+-/* The simulator has an nb85e-style interrupt system.  */
+-#include <asm/nb85e_intc.h>
+-
+-/* For <asm/irq.h> */
+-#define NUM_CPU_IRQS		64
+-
+-
+-/* For <asm/page.h> */
+-#define PAGE_OFFSET		DRAM_ADDR
+-
+-
+-/* For <asm/entry.h> */
+-/* `R0 RAM', used for a few miscellaneous variables that must be accessible
+-   using a load instruction relative to R0.  The sim85e2c simulator
+-   actually puts 1020K of RAM from FFF00000 to FFFFF000, so we arbitarily
+-   choose a small portion at the end of that.  */
+-#define R0_RAM_ADDR		0xFFFFE000
+-
+-
+-/* For <asm/param.h> */
+-#ifndef HZ
+-#define HZ			24	/* Minimum supported frequency.  */
+-#endif
+-
+-
+ #endif /* __V850_SIM85E2C_H__ */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/sim85e2.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,79 @@
++/*
++ * include/asm-v850/sim85e2.h -- Machine-dependent defs for
++ *	V850E2 RTL simulator
++ *
++ *  Copyright (C) 2002,03  NEC Electronics Corporation
++ *  Copyright (C) 2002,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>
++ */
++
++#ifndef __V850_SIM85E2_H__
++#define __V850_SIM85E2_H__
++
++
++#include <asm/v850e2.h>		/* Based on V850E2 core.  */
++
++
++/* Various memory areas supported by the simulator.
++   These should match the corresponding definitions in the linker script.  */
++
++/* `instruction RAM'; instruction fetches are much faster from IRAM than
++   from DRAM.  */
++#define IRAM_ADDR		0
++#define IRAM_SIZE		0x00100000 /* 1MB */
++/* `data RAM', below and contiguous with the I/O space.
++   Data fetches are much faster from DRAM than from IRAM.  */
++#define DRAM_ADDR		0xfff00000
++#define DRAM_SIZE		0x000ff000 /* 1020KB */
++/* `external ram'.  Unlike the above RAM areas, this memory is cached,
++   so both instruction and data fetches should be (mostly) fast --
++   however, currently only write-through caching is supported, so writes
++   to ERAM will be slow.  */
++#define ERAM_ADDR		0x00100000
++#define ERAM_SIZE		0x07f00000 /* 127MB (max) */
++/* Dynamic RAM; uses memory controller.  */
++#define SDRAM_ADDR		0x10000000
++#if 0
++#define SDRAM_SIZE		0x01000000 /* 16MB */
++#else
++#define SDRAM_SIZE		0x00200000 /* Only use 2MB for testing */
++#endif
++
++
++/* Simulator specific control registers.  */
++/* NOTHAL controls whether the simulator will stop at a `halt' insn.  */
++#define SIM85E2_NOTHAL_ADDR	0xffffff22
++#define SIM85E2_NOTHAL		(*(volatile u8 *)SIM85E2_NOTHAL_ADDR)
++/* The simulator will stop N cycles after N is written to SIMFIN.  */
++#define SIM85E2_SIMFIN_ADDR	0xffffff24
++#define SIM85E2_SIMFIN		(*(volatile u16 *)SIM85E2_SIMFIN_ADDR)
++
++
++/* For <asm/irq.h> */
++#define NUM_CPU_IRQS		64
++
++
++/* For <asm/page.h> */
++#define PAGE_OFFSET		SDRAM_ADDR
++
++
++/* For <asm/entry.h> */
++/* `R0 RAM', used for a few miscellaneous variables that must be accessible
++   using a load instruction relative to R0.  The sim85e2 simulator
++   actually puts 1020K of RAM from FFF00000 to FFFFF000, so we arbitarily
++   choose a small portion at the end of that.  */
++#define R0_RAM_ADDR		0xFFFFE000
++
++
++/* For <asm/param.h> */
++#ifndef HZ
++#define HZ			24	/* Minimum supported frequency.  */
++#endif
++
++
++#endif /* __V850_SIM85E2_H__ */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/sim85e2s.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,28 @@
++/*
++ * include/asm-v850/sim85e2s.h -- Machine-dependent defs for
++ *	V850E2 RTL simulator
++ *
++ *  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>
++ */
++
++#ifndef __V850_SIM85E2S_H__
++#define __V850_SIM85E2S_H__
++
++#include <asm/sim85e2.h>	/* Use generic sim85e2 settings.  */
++#if 0
++#include <asm/v850e2_cache.h>	/* + cache */
++#endif
++
++#define CPU_MODEL	"v850e2"
++#define CPU_MODEL_LONG	"NEC V850E2"
++#define PLATFORM	"sim85e2s"
++#define PLATFORM_LONG	"SIM85E2S V850E2 simulator"
++
++#endif /* __V850_SIM85E2S_H__ */
+--- linux-2.6.0-test1/include/asm-v850/stat.h	2003-06-14 12:18:26.000000000 -0700
++++ 25/include/asm-v850/stat.h	2003-07-19 17:03:51.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  * include/asm-v850/stat.h -- v850 stat structure
+  *
+- *  Copyright (C) 2001,02,03  NEC Corporation
++ *  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
+--- linux-2.6.0-test1/include/asm-v850/system.h	2003-06-14 12:18:29.000000000 -0700
++++ 25/include/asm-v850/system.h	2003-07-19 17:03:51.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  * include/asm-v850/system.h -- Low-level interrupt/thread ops
+  *
+- *  Copyright (C) 2001,02,03  NEC Corporation
++ *  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
+--- linux-2.6.0-test1/include/asm-v850/teg.h	2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-v850/teg.h	2003-07-19 17:03:51.000000000 -0700
+@@ -15,9 +15,9 @@
+ #define __V850_TEG_H__
+ 
+ 
+-/* The TEG uses the NB85E cpu core.  */
+-#include <asm/nb85e.h>
+-#include <asm/nb85e_cache.h>
++/* The TEG uses the V850E cpu core.  */
++#include <asm/v850e.h>
++#include <asm/v850e_cache.h>
+ 
+ 
+ #define CPU_MODEL	"v850e/nb85e-teg"
+@@ -51,18 +51,18 @@
+ 
+ 
+ /* TEG UART details.  */
+-#define NB85E_UART_BASE_ADDR(n)		(0xFFFFF600 + 0x10 * (n))
+-#define NB85E_UART_ASIM_ADDR(n)		(NB85E_UART_BASE_ADDR(n) + 0x0)
+-#define NB85E_UART_ASIS_ADDR(n)		(NB85E_UART_BASE_ADDR(n) + 0x2)
+-#define NB85E_UART_ASIF_ADDR(n)		(NB85E_UART_BASE_ADDR(n) + 0x4)
+-#define NB85E_UART_CKSR_ADDR(n)		(NB85E_UART_BASE_ADDR(n) + 0x6)
+-#define NB85E_UART_BRGC_ADDR(n)		(NB85E_UART_BASE_ADDR(n) + 0x8)
+-#define NB85E_UART_TXB_ADDR(n)		(NB85E_UART_BASE_ADDR(n) + 0xA)
+-#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
++#define V850E_UART_BASE_ADDR(n)		(0xFFFFF600 + 0x10 * (n))
++#define V850E_UART_ASIM_ADDR(n)		(V850E_UART_BASE_ADDR(n) + 0x0)
++#define V850E_UART_ASIS_ADDR(n)		(V850E_UART_BASE_ADDR(n) + 0x2)
++#define V850E_UART_ASIF_ADDR(n)		(V850E_UART_BASE_ADDR(n) + 0x4)
++#define V850E_UART_CKSR_ADDR(n)		(V850E_UART_BASE_ADDR(n) + 0x6)
++#define V850E_UART_BRGC_ADDR(n)		(V850E_UART_BASE_ADDR(n) + 0x8)
++#define V850E_UART_TXB_ADDR(n)		(V850E_UART_BASE_ADDR(n) + 0xA)
++#define V850E_UART_RXB_ADDR(n)		(V850E_UART_BASE_ADDR(n) + 0xC)
++#define V850E_UART_NUM_CHANNELS		1
++#define V850E_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
++#define V850E_UART_PRE_CONFIGURE	teg_uart_pre_configure
+ #ifndef __ASSEMBLY__
+ extern void teg_uart_pre_configure (unsigned chan,
+ 				    unsigned cflags, unsigned baud);
+@@ -70,15 +70,15 @@ extern void teg_uart_pre_configure (unsi
+ 
+ 
+ /* The TEG RTPU.  */
+-#define NB85E_RTPU_BASE_ADDR		0xFFFFF210
++#define V850E_RTPU_BASE_ADDR		0xFFFFF210
+ 
+ 
+ /* 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
++#define V850E_TIMER_D_BASE_ADDR		0xFFFFF210
++#define V850E_TIMER_D_TMCD_BASE_ADDR 	(V850E_TIMER_D_BASE_ADDR + 0x0)
++#define V850E_TIMER_D_TMD_BASE_ADDR 	(V850E_TIMER_D_BASE_ADDR + 0x4)
++#define V850E_TIMER_D_CMD_BASE_ADDR 	(V850E_TIMER_D_BASE_ADDR + 0x8)
++#define V850E_TIMER_D_BASE_FREQ		CPU_CLOCK_FREQ
+ 
+ 
+ /* `Interrupt Source Select' control register.  */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e2_cache.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,74 @@
++/*
++ * include/asm-v850/v850e2_cache_cache.h -- Cache control for V850E2
++ * 	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>
++ */
++
++#ifndef __V850_V850E2_CACHE_H__
++#define __V850_V850E2_CACHE_H__
++
++#include <asm/types.h>
++
++
++/* Cache control registers.  */
++
++/* Bus Transaction Control */
++#define V850E2_CACHE_BTSC_ADDR	0xFFFFF070
++#define V850E2_CACHE_BTSC 	(*(volatile u16 *)V850E2_CACHE_BTSC_ADDR)
++#define V850E2_CACHE_BTSC_ICM	0x0001 /* icache enable */
++#define V850E2_CACHE_BTSC_DCM0	0x0004 /* dcache enable, bit 0 */
++#define V850E2_CACHE_BTSC_DCM1	0x0008 /* dcache enable, bit 1 */
++#define V850E2_CACHE_BTSC_DCM_WT		      /* write-through */ \
++			V850E2_CACHE_BTSC_DCM0
++#ifdef CONFIG_V850E2_V850E2S
++# define V850E2_CACHE_BTSC_DCM_WB_NO_ALLOC    /* write-back, non-alloc */ \
++			V850E2_CACHE_BTSC_DCM1	
++# define V850E2_CACHE_BTSC_DCM_WB_ALLOC	      /* write-back, non-alloc */ \
++			(V850E2_CACHE_BTSC_DCM1 | V850E2_CACHE_BTSC_DCM0)
++# define V850E2_CACHE_BTSC_ISEQ	0x0010 /* icache `address sequence mode' */
++# define V850E2_CACHE_BTSC_DSEQ	0x0020 /* dcache `address sequence mode' */
++# define V850E2_CACHE_BTSC_IRFC	0x0030
++# define V850E2_CACHE_BTSC_ILCD	0x4000
++# define V850E2_CACHE_BTSC_VABE	0x8000
++#endif /* CONFIG_V850E2_V850E2S */
++
++/* Cache operation start address register (low-bits).  */
++#define V850E2_CACHE_CADL_ADDR	0xFFFFF074
++#define V850E2_CACHE_CADL 	(*(volatile u16 *)V850E2_CACHE_CADL_ADDR)
++/* Cache operation start address register (high-bits).  */
++#define V850E2_CACHE_CADH_ADDR	0xFFFFF076
++#define V850E2_CACHE_CADH 	(*(volatile u16 *)V850E2_CACHE_CADH_ADDR)
++/* Cache operation count register.  */
++#define V850E2_CACHE_CCNT_ADDR	0xFFFFF078
++#define V850E2_CACHE_CCNT 	(*(volatile u16 *)V850E2_CACHE_CCNT_ADDR)
++/* Cache operation specification register.  */
++#define V850E2_CACHE_COPR_ADDR	0xFFFFF07A
++#define V850E2_CACHE_COPR 	(*(volatile u16 *)V850E2_CACHE_COPR_ADDR)
++#define V850E2_CACHE_COPR_STRT	0x0001 /* start cache operation */
++#define V850E2_CACHE_COPR_LBSL	0x0100 /* 0 = icache, 1 = dcache */
++#define V850E2_CACHE_COPR_WSLE	0x0200 /* operate on cache way */
++#define V850E2_CACHE_COPR_WSL(way) ((way) * 0x0400) /* way select */
++#define V850E2_CACHE_COPR_CFC(op)  ((op)  * 0x1000) /* cache function code */
++
++
++/* Size of a cache line in bytes.  */
++#define V850E2_CACHE_LINE_SIZE_BITS	4
++#define V850E2_CACHE_LINE_SIZE		(1 << V850E2_CACHE_LINE_SIZE_BITS)
++
++/* The size of each cache `way' in lines.  */
++#define V850E2_CACHE_WAY_SIZE		256
++
++
++/* For <asm/cache.h> */
++#define L1_CACHE_BYTES			V850E2_CACHE_LINE_SIZE
++
++
++#endif /* __V850_V850E2_CACHE_H__ */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e2.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,69 @@
++/*
++ * include/asm-v850/v850e2.h -- Machine-dependent defs for V850E2 CPUs
++ *
++ *  Copyright (C) 2002,03  NEC Electronics Corporation
++ *  Copyright (C) 2002,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>
++ */
++
++#ifndef __V850_V850E2_H__
++#define __V850_V850E2_H__
++
++#include <asm/v850e_intc.h>	/* v850e-style interrupt system.  */
++
++
++#define CPU_ARCH "v850e2"
++
++
++/* Control registers.  */
++
++/* Chip area select control */ 
++#define V850E2_CSC_ADDR(n)	(0xFFFFF060 + (n) * 2)
++#define V850E2_CSC(n)		(*(volatile u16 *)V850E2_CSC_ADDR(n))
++/* I/O area select control */
++#define V850E2_BPC_ADDR		0xFFFFF064
++#define V850E2_BPC		(*(volatile u16 *)V850E2_BPC_ADDR)
++/* Bus size configuration */
++#define V850E2_BSC_ADDR		0xFFFFF066
++#define V850E2_BSC		(*(volatile u16 *)V850E2_BSC_ADDR)
++/* Endian configuration */
++#define V850E2_BEC_ADDR		0xFFFFF068
++#define V850E2_BEC		(*(volatile u16 *)V850E2_BEC_ADDR)
++/* Cache configuration */
++#define V850E2_BHC_ADDR		0xFFFFF06A
++#define V850E2_BHC		(*(volatile u16 *)V850E2_BHC_ADDR)
++/* NPB strobe-wait configuration */
++#define V850E2_VSWC_ADDR	0xFFFFF06E
++#define V850E2_VSWC		(*(volatile u16 *)V850E2_VSWC_ADDR)
++/* Bus cycle type */
++#define V850E2_BCT_ADDR(n)	(0xFFFFF480 + (n) * 2)
++#define V850E2_BCT(n)		(*(volatile u16 *)V850E2_BCT_ADDR(n))
++/* Data wait control */
++#define V850E2_DWC_ADDR(n)	(0xFFFFF484 + (n) * 2)
++#define V850E2_DWC(n)		(*(volatile u16 *)V850E2_DWC_ADDR(n))
++/* Bus cycle control */
++#define V850E2_BCC_ADDR		0xFFFFF488
++#define V850E2_BCC		(*(volatile u16 *)V850E2_BCC_ADDR)
++/* Address wait control */
++#define V850E2_ASC_ADDR		0xFFFFF48A
++#define V850E2_ASC		(*(volatile u16 *)V850E2_ASC_ADDR)
++/* Local bus sizing control */
++#define V850E2_LBS_ADDR		0xFFFFF48E
++#define V850E2_LBS		(*(volatile u16 *)V850E2_LBS_ADDR)
++/* Line buffer control */
++#define V850E2_LBC_ADDR(n)	(0xFFFFF490 + (n) * 2)
++#define V850E2_LBC(n)		(*(volatile u16 *)V850E2_LBC_ADDR(n))
++/* SDRAM configuration */
++#define V850E2_SCR_ADDR(n)	(0xFFFFF4A0 + (n) * 4)
++#define V850E2_SCR(n)		(*(volatile u16 *)V850E2_SCR_ADDR(n))
++/* SDRAM refresh cycle control */
++#define V850E2_RFS_ADDR(n)	(0xFFFFF4A2 + (n) * 4)
++#define V850E2_RFS(n)		(*(volatile u16 *)V850E2_RFS_ADDR(n))
++
++
++#endif /* __V850_V850E2_H__ */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e_cache.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,48 @@
++/*
++ * include/asm-v850/v850e_cache.h -- Cache control for V850E cache memories
++ *
++ *  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
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++/* This file implements cache control for the rather simple cache used on
++   some V850E CPUs, specifically the NB85E/TEG CPU-core and the V850E/ME2
++   CPU.  V850E2 processors have their own (better) cache
++   implementation.  */
++
++#ifndef __V850_V850E_CACHE_H__
++#define __V850_V850E_CACHE_H__
++
++#include <asm/types.h>
++
++
++/* Cache control registers.  */
++#define V850E_CACHE_BHC_ADDR	0xFFFFF06A
++#define V850E_CACHE_BHC		(*(volatile u16 *)V850E_CACHE_BHC_ADDR)
++#define V850E_CACHE_ICC_ADDR	0xFFFFF070
++#define V850E_CACHE_ICC		(*(volatile u16 *)V850E_CACHE_ICC_ADDR)
++#define V850E_CACHE_ISI_ADDR	0xFFFFF072
++#define V850E_CACHE_ISI		(*(volatile u16 *)V850E_CACHE_ISI_ADDR)
++#define V850E_CACHE_DCC_ADDR	0xFFFFF078
++#define V850E_CACHE_DCC		(*(volatile u16 *)V850E_CACHE_DCC_ADDR)
++
++/* Size of a cache line in bytes.  */
++#define V850E_CACHE_LINE_SIZE	16
++
++/* For <asm/cache.h> */
++#define L1_CACHE_BYTES		V850E_CACHE_LINE_SIZE
++
++
++#if defined(__KERNEL__) && !defined(__ASSEMBLY__)
++/* Set caching params via the BHC, ICC, and DCC registers.  */
++void v850e_cache_enable (u16 bhc, u16 icc, u16 dcc);
++#endif /* __KERNEL__ && !__ASSEMBLY__ */
++
++
++#endif /* __V850_V850E_CACHE_H__ */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,21 @@
++/*
++ * include/asm-v850/v850e.h -- V850E CPU
++ *
++ *  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>
++ */
++
++#ifndef __V850_V850E_H__
++#define __V850_V850E_H__
++
++#include <asm/v850e_intc.h>
++
++#define CPU_ARCH "v850e"
++
++#endif /* __V850_V850E_H__ */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e_intc.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,133 @@
++/*
++ * include/asm-v850/v850e_intc.h -- V850E CPU interrupt controller (INTC)
++ *
++ *  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>
++ */
++
++#ifndef __V850_V850E_INTC_H__
++#define __V850_V850E_INTC_H__
++
++
++/* There are 4 16-bit `Interrupt Mask Registers' located contiguously
++   starting from this base.  Each interrupt uses a single bit to
++   indicated enabled/disabled status.  */
++#define V850E_INTC_IMR_BASE_ADDR  0xFFFFF100
++#define V850E_INTC_IMR_ADDR(irq)  (V850E_INTC_IMR_BASE_ADDR + ((irq) >> 3))
++#define V850E_INTC_IMR_BIT(irq)	  ((irq) & 0x7)
++
++/* Each maskable interrupt has a single-byte control register at this
++   address.  */
++#define V850E_INTC_IC_BASE_ADDR	  0xFFFFF110
++#define V850E_INTC_IC_ADDR(irq)	  (V850E_INTC_IC_BASE_ADDR + ((irq) << 1))
++#define V850E_INTC_IC(irq)	  (*(volatile u8 *)V850E_INTC_IC_ADDR(irq))
++/* Encode priority PR for storing in an interrupt control register.  */
++#define V850E_INTC_IC_PR(pr)	  (pr)
++/* Interrupt disable bit in an interrupt control register.  */
++#define V850E_INTC_IC_MK_BIT	  6
++#define V850E_INTC_IC_MK	  (1 << V850E_INTC_IC_MK_BIT)
++/* Interrupt pending flag in an interrupt control register.  */
++#define V850E_INTC_IC_IF_BIT	  7
++#define V850E_INTC_IC_IF	  (1 << V850E_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 V850E_INTC_ISPR_ADDR	  0xFFFFF1FA
++#define V850E_INTC_ISPR		  (*(volatile u8 *)V850E_INTC_ISPR_ADDR)
++
++
++#ifndef __ASSEMBLY__
++
++/* Enable interrupt handling for interrupt IRQ.  */
++static inline void v850e_intc_enable_irq (unsigned irq)
++{
++	__asm__ __volatile__ ("clr1 %0, [%1]"
++			      :: "r" (V850E_INTC_IMR_BIT (irq)),
++			         "r" (V850E_INTC_IMR_ADDR (irq))
++			      : "memory");
++}
++
++/* Disable interrupt handling for interrupt IRQ.  Note that any
++   interrupts received while disabled will be delivered once the
++   interrupt is enabled again, unless they are explicitly cleared using
++   `v850e_intc_clear_pending_irq'.  */
++static inline void v850e_intc_disable_irq (unsigned irq)
++{
++	__asm__ __volatile__ ("set1 %0, [%1]"
++			      :: "r" (V850E_INTC_IMR_BIT (irq)),
++			         "r" (V850E_INTC_IMR_ADDR (irq))
++			      : "memory");
++}
++
++/* Return true if interrupt handling for interrupt IRQ is enabled.  */
++static inline int v850e_intc_irq_enabled (unsigned irq)
++{
++	int rval;
++	__asm__ __volatile__ ("tst1 %1, [%2]; setf z, %0"
++			      : "=r" (rval)
++			      : "r" (V850E_INTC_IMR_BIT (irq)),
++			        "r" (V850E_INTC_IMR_ADDR (irq)));
++	return rval;
++}
++
++/* Disable irqs from 0 until LIMIT.  LIMIT must be a multiple of 8.  */
++static inline void _v850e_intc_disable_irqs (unsigned limit)
++{
++	unsigned long addr;
++	for (addr = V850E_INTC_IMR_BASE_ADDR; limit >= 8; addr++, limit -= 8)
++		*(char *)addr = 0xFF;
++}
++
++/* Disable all irqs.  This is purposely a macro, because NUM_MACH_IRQS
++   will be only be defined later.  */
++#define v850e_intc_disable_irqs()   _v850e_intc_disable_irqs (NUM_MACH_IRQS)
++
++/* Clear any pending interrupts for IRQ.  */
++static inline void v850e_intc_clear_pending_irq (unsigned irq)
++{
++	__asm__ __volatile__ ("clr1 %0, 0[%1]"
++			      :: "i" (V850E_INTC_IC_IF_BIT),
++			         "r" (V850E_INTC_IC_ADDR (irq))
++			      : "memory");
++}
++
++/* Return true if interrupt IRQ is pending (but disabled).  */
++static inline int v850e_intc_irq_pending (unsigned irq)
++{
++	int rval;
++	__asm__ __volatile__ ("tst1 %1, 0[%2]; setf nz, %0"
++			      : "=r" (rval)
++			      : "i" (V850E_INTC_IC_IF_BIT),
++			        "r" (V850E_INTC_IC_ADDR (irq)));
++	return rval;
++}
++
++
++struct v850e_intc_irq_init {
++	const char *name;	/* name of interrupt type */
++
++	/* Range of kernel irq numbers for this type:
++	   BASE, BASE+INTERVAL, ..., BASE+INTERVAL*NUM  */
++	unsigned base, num, interval;
++
++	unsigned priority;	/* interrupt priority to assign */
++};
++struct hw_interrupt_type;	/* fwd decl */
++
++/* Initialize HW_IRQ_TYPES for INTC-controlled irqs described in array
++   INITS (which is terminated by an entry with the name field == 0).  */
++extern void v850e_intc_init_irq_types (struct v850e_intc_irq_init *inits,
++				       struct hw_interrupt_type *hw_irq_types);
++
++
++#endif /* !__ASSEMBLY__ */
++
++
++#endif /* __V850_V850E_INTC_H__ */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e_timer_c.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,48 @@
++/*
++ * include/asm-v850/v850e_timer_c.h -- `Timer C' component often used
++ *	with the V850E cpu core
++ *
++ *  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
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++/* NOTE: this include file currently contains only enough to allow us to
++   use timer C as an interrupt pass-through.  */
++
++#ifndef __V850_V850E_TIMER_C_H__
++#define __V850_V850E_TIMER_C_H__
++
++#include <asm/types.h>
++#include <asm/machdep.h>	/* Pick up chip-specific defs.  */
++
++
++/* Timer C (16-bit interval timers).  */
++
++/* Control register 0 for timer C.  */
++#define V850E_TIMER_C_TMCC0_ADDR(n) (V850E_TIMER_C_BASE_ADDR + 0x6 + 0x10 *(n))
++#define V850E_TIMER_C_TMCC0(n)	  (*(volatile u8 *)V850E_TIMER_C_TMCC0_ADDR(n))
++#define V850E_TIMER_C_TMCC0_CAE	  0x01 /* clock action enable */
++#define V850E_TIMER_C_TMCC0_CE	  0x02 /* count enable */
++/* ... */
++
++/* Control register 1 for timer C.  */
++#define V850E_TIMER_C_TMCC1_ADDR(n) (V850E_TIMER_C_BASE_ADDR + 0x8 + 0x10 *(n))
++#define V850E_TIMER_C_TMCC1(n)	  (*(volatile u8 *)V850E_TIMER_C_TMCC1_ADDR(n))
++#define V850E_TIMER_C_TMCC1_CMS0  0x01 /* capture/compare mode select (ccc0) */
++#define V850E_TIMER_C_TMCC1_CMS1  0x02 /* capture/compare mode select (ccc1) */
++/* ... */
++
++/* Interrupt edge-sensitivity control for timer C.  */
++#define V850E_TIMER_C_SESC_ADDR(n) (V850E_TIMER_C_BASE_ADDR + 0x9 + 0x10 *(n))
++#define V850E_TIMER_C_SESC(n)	  (*(volatile u8 *)V850E_TIMER_C_SESC_ADDR(n))
++
++/* ...etc... */
++
++
++#endif /* __V850_V850E_TIMER_C_H__  */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e_timer_d.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,62 @@
++/*
++ * include/asm-v850/v850e_timer_d.h -- `Timer D' component often used
++ *	with the V850E cpu core
++ *
++ *  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>
++ */
++
++#ifndef __V850_V850E_TIMER_D_H__
++#define __V850_V850E_TIMER_D_H__
++
++#include <asm/types.h>
++#include <asm/machdep.h>	/* Pick up chip-specific defs.  */
++
++
++/* Timer D (16-bit interval timers).  */
++
++/* Count registers for timer D.  */
++#define V850E_TIMER_D_TMD_ADDR(n) (V850E_TIMER_D_TMD_BASE_ADDR + 0x10 * (n))
++#define V850E_TIMER_D_TMD(n)	  (*(volatile u16 *)V850E_TIMER_D_TMD_ADDR(n))
++
++/* Count compare registers for timer D.  */
++#define V850E_TIMER_D_CMD_ADDR(n) (V850E_TIMER_D_CMD_BASE_ADDR + 0x10 * (n))
++#define V850E_TIMER_D_CMD(n)	  (*(volatile u16 *)V850E_TIMER_D_CMD_ADDR(n))
++
++/* Control registers for timer D.  */
++#define V850E_TIMER_D_TMCD_ADDR(n) (V850E_TIMER_D_TMCD_BASE_ADDR + 0x10 * (n))
++#define V850E_TIMER_D_TMCD(n)	   (*(volatile u8 *)V850E_TIMER_D_TMCD_ADDR(n))
++/* Control bits for timer D.  */
++#define V850E_TIMER_D_TMCD_CE  	   0x2 /* count enable */
++#define V850E_TIMER_D_TMCD_CAE	   0x1 /* clock action enable */
++/* Clock divider setting (log2).  */
++#define V850E_TIMER_D_TMCD_CS(divlog2) (((divlog2) - V850E_TIMER_D_TMCD_CS_MIN) << 4)
++/* Minimum clock divider setting (log2).  */
++#ifndef V850E_TIMER_D_TMCD_CS_MIN /* Can be overridden by mach-specific hdrs */
++#define V850E_TIMER_D_TMCD_CS_MIN  2 /* Default is correct for the v850e/ma1 */
++#endif
++/* Maximum clock divider setting (log2).  */
++#define V850E_TIMER_D_TMCD_CS_MAX  (V850E_TIMER_D_TMCD_CS_MIN + 7)
++
++/* Return the clock-divider (log2) of timer D unit N.  */
++#define V850E_TIMER_D_DIVLOG2(n) \
++  (((V850E_TIMER_D_TMCD(n) >> 4) & 0x7) + V850E_TIMER_D_TMCD_CS_MIN)
++
++
++#ifndef __ASSEMBLY__
++
++/* Start interval timer TIMER (0-3).  The timer will issue the
++   corresponding INTCMD interrupt RATE times per second.  This function
++   does not enable the interrupt.  */
++extern void v850e_timer_d_configure (unsigned timer, unsigned rate);
++
++#endif /* !__ASSEMBLY__ */
++
++
++#endif /* __V850_V850E_TIMER_D_H__  */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e_uarta.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,278 @@
++/*
++ * include/asm-v850/v850e_uarta.h -- original V850E on-chip UART
++ *
++ *  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>
++ */
++
++/* This is the original V850E UART implementation is called just `UART' in
++   the docs, but we name this header file <asm/v850e_uarta.h> because the
++   name <asm/v850e_uart.h> is used for the common driver that handles both
++   `UART' and `UARTB' implementations.  */
++
++#ifndef __V850_V850E_UARTA_H__
++#define __V850_V850E_UARTA_H__
++
++
++/* Raw hardware interface.  */
++
++/* The base address of the UART control registers for channel N.
++   The default is the address used on the V850E/MA1.  */
++#ifndef V850E_UART_BASE_ADDR
++#define V850E_UART_BASE_ADDR(n)		(0xFFFFFA00 + 0x10 * (n))
++#endif 
++
++/* Addresses of specific UART control registers for channel N.
++   The defaults are the addresses used on the V850E/MA1; if a platform
++   wants to redefine any of these, it must redefine them all.  */
++#ifndef V850E_UART_ASIM_ADDR
++#define V850E_UART_ASIM_ADDR(n)		(V850E_UART_BASE_ADDR(n) + 0x0)
++#define V850E_UART_RXB_ADDR(n)		(V850E_UART_BASE_ADDR(n) + 0x2)
++#define V850E_UART_ASIS_ADDR(n)		(V850E_UART_BASE_ADDR(n) + 0x3)
++#define V850E_UART_TXB_ADDR(n)		(V850E_UART_BASE_ADDR(n) + 0x4)
++#define V850E_UART_ASIF_ADDR(n)		(V850E_UART_BASE_ADDR(n) + 0x5)
++#define V850E_UART_CKSR_ADDR(n)		(V850E_UART_BASE_ADDR(n) + 0x6)
++#define V850E_UART_BRGC_ADDR(n)		(V850E_UART_BASE_ADDR(n) + 0x7)
++#endif
++
++/* UART config registers.  */
++#define V850E_UART_ASIM(n)	(*(volatile u8 *)V850E_UART_ASIM_ADDR(n))
++/* Control bits for config registers.  */
++#define V850E_UART_ASIM_CAE	0x80 /* clock enable */
++#define V850E_UART_ASIM_TXE	0x40 /* transmit enable */
++#define V850E_UART_ASIM_RXE	0x20 /* receive enable */
++#define V850E_UART_ASIM_PS_MASK	0x18 /* mask covering parity-select bits */
++#define V850E_UART_ASIM_PS_NONE	0x00 /* no parity */
++#define V850E_UART_ASIM_PS_ZERO	0x08 /* zero parity */
++#define V850E_UART_ASIM_PS_ODD	0x10 /* odd parity */
++#define V850E_UART_ASIM_PS_EVEN	0x18 /* even parity */
++#define V850E_UART_ASIM_CL_8	0x04 /* char len is 8 bits (otherwise, 7) */
++#define V850E_UART_ASIM_SL_2	0x02 /* 2 stop bits (otherwise, 1) */
++#define V850E_UART_ASIM_ISRM	0x01 /* generate INTSR interrupt on errors
++					(otherwise, generate INTSER) */
++
++/* UART serial interface status registers.  */
++#define V850E_UART_ASIS(n)	(*(volatile u8 *)V850E_UART_ASIS_ADDR(n))
++/* Control bits for status registers.  */
++#define V850E_UART_ASIS_PE	0x04 /* parity error */
++#define V850E_UART_ASIS_FE	0x02 /* framing error */
++#define V850E_UART_ASIS_OVE	0x01 /* overrun error */
++
++/* UART serial interface transmission status registers.  */
++#define V850E_UART_ASIF(n)	(*(volatile u8 *)V850E_UART_ASIF_ADDR(n))
++#define V850E_UART_ASIF_TXBF	0x02 /* transmit buffer flag (data in TXB) */
++#define V850E_UART_ASIF_TXSF	0x01 /* transmit shift flag (sending data) */
++
++/* UART receive buffer register.  */
++#define V850E_UART_RXB(n)	(*(volatile u8 *)V850E_UART_RXB_ADDR(n))
++
++/* UART transmit buffer register.  */
++#define V850E_UART_TXB(n)	(*(volatile u8 *)V850E_UART_TXB_ADDR(n))
++
++/* UART baud-rate generator control registers.  */
++#define V850E_UART_CKSR(n)	(*(volatile u8 *)V850E_UART_CKSR_ADDR(n))
++#define V850E_UART_CKSR_MAX	11
++#define V850E_UART_BRGC(n)	(*(volatile u8 *)V850E_UART_BRGC_ADDR(n))
++#define V850E_UART_BRGC_MIN	8
++
++
++#ifndef V850E_UART_CKSR_MAX_FREQ
++#define V850E_UART_CKSR_MAX_FREQ (25*1000*1000)
++#endif
++
++/* Calculate the minimum value for CKSR on this processor.  */
++static inline unsigned v850e_uart_cksr_min (void)
++{
++	int min = 0;
++	unsigned freq = V850E_UART_BASE_FREQ;
++	while (freq > V850E_UART_CKSR_MAX_FREQ) {
++		freq >>= 1;
++		min++;
++	}
++	return min;
++}
++
++
++/* Slightly abstract interface used by driver.  */
++
++
++/* Interrupts used by the UART.  */
++
++/* Received when the most recently transmitted character has been sent.  */
++#define V850E_UART_TX_IRQ(chan)		IRQ_INTST (chan)
++/* Received when a new character has been received.  */
++#define V850E_UART_RX_IRQ(chan)		IRQ_INTSR (chan)
++
++
++/* UART clock generator interface.  */
++
++/* This type encapsulates a particular uart frequency.  */
++typedef struct {
++	unsigned clk_divlog2;
++	unsigned brgen_count;
++} v850e_uart_speed_t;
++
++/* Calculate a uart speed from BAUD for this uart.  */
++static inline v850e_uart_speed_t v850e_uart_calc_speed (unsigned baud)
++{
++	v850e_uart_speed_t speed;
++
++	/* Calculate the log2 clock divider and baud-rate counter values
++	   (note that the UART divides the resulting clock by 2, so
++	   multiply BAUD by 2 here to compensate).  */
++	calc_counter_params (V850E_UART_BASE_FREQ, baud * 2,
++			     v850e_uart_cksr_min(),
++			     V850E_UART_CKSR_MAX, 8/*bits*/,
++			     &speed.clk_divlog2, &speed.brgen_count);
++
++	return speed;
++}
++
++/* Return the current speed of uart channel CHAN.  */
++static inline v850e_uart_speed_t v850e_uart_speed (unsigned chan)
++{
++	v850e_uart_speed_t speed;
++	speed.clk_divlog2 = V850E_UART_CKSR (chan);
++	speed.brgen_count = V850E_UART_BRGC (chan);
++	return speed;
++}
++
++/* Set the current speed of uart channel CHAN.  */
++static inline void v850e_uart_set_speed(unsigned chan,v850e_uart_speed_t speed)
++{
++	V850E_UART_CKSR (chan) = speed.clk_divlog2;
++	V850E_UART_BRGC (chan) = speed.brgen_count;
++}
++
++static inline int
++v850e_uart_speed_eq (v850e_uart_speed_t speed1, v850e_uart_speed_t speed2)
++{
++	return speed1.clk_divlog2 == speed2.clk_divlog2
++		&& speed1.brgen_count == speed2.brgen_count;
++}
++
++/* Minimum baud rate possible.  */
++#define v850e_uart_min_baud() \
++   ((V850E_UART_BASE_FREQ >> V850E_UART_CKSR_MAX) / (2 * 255) + 1)
++
++/* Maximum baud rate possible.  The error is quite high at max, though.  */
++#define v850e_uart_max_baud() \
++   ((V850E_UART_BASE_FREQ >> v850e_uart_cksr_min()) / (2 *V850E_UART_BRGC_MIN))
++
++/* The `maximum' clock rate the uart can used, which is wanted (though not
++   really used in any useful way) by the serial framework.  */
++#define v850e_uart_max_clock() \
++   ((V850E_UART_BASE_FREQ >> v850e_uart_cksr_min()) / 2)
++
++
++/* UART configuration interface.  */
++
++/* Type of the uart config register; must be a scalar.  */
++typedef u16 v850e_uart_config_t;
++
++/* The uart hardware config register for channel CHAN.  */
++#define V850E_UART_CONFIG(chan)		V850E_UART_ASIM (chan)
++
++/* This config bit set if the uart is enabled.  */
++#define V850E_UART_CONFIG_ENABLED	V850E_UART_ASIM_CAE
++/* If the uart _isn't_ enabled, store this value to it to do so.  */
++#define V850E_UART_CONFIG_INIT		V850E_UART_ASIM_CAE
++/* Store this config value to disable the uart channel completely.  */
++#define V850E_UART_CONFIG_FINI		0
++
++/* Setting/clearing these bits enable/disable TX/RX, respectively (but
++   otherwise generally leave things running).  */
++#define V850E_UART_CONFIG_RX_ENABLE	V850E_UART_ASIM_RXE
++#define V850E_UART_CONFIG_TX_ENABLE	V850E_UART_ASIM_TXE
++
++/* These masks define which config bits affect TX/RX modes, respectively.  */
++#define V850E_UART_CONFIG_RX_BITS \
++  (V850E_UART_ASIM_PS_MASK | V850E_UART_ASIM_CL_8 | V850E_UART_ASIM_ISRM)
++#define V850E_UART_CONFIG_TX_BITS \
++  (V850E_UART_ASIM_PS_MASK | V850E_UART_ASIM_CL_8 | V850E_UART_ASIM_SL_2)
++
++static inline v850e_uart_config_t v850e_uart_calc_config (unsigned cflags)
++{
++	v850e_uart_config_t config = 0;
++
++	/* Figure out new configuration of control register.  */
++	if (cflags & CSTOPB)
++		/* Number of stop bits, 1 or 2.  */
++		config |= V850E_UART_ASIM_SL_2;
++	if ((cflags & CSIZE) == CS8)
++		/* Number of data bits, 7 or 8.  */
++		config |= V850E_UART_ASIM_CL_8;
++	if (! (cflags & PARENB))
++		/* No parity check/generation.  */
++		config |= V850E_UART_ASIM_PS_NONE;
++	else if (cflags & PARODD)
++		/* Odd parity check/generation.  */
++		config |= V850E_UART_ASIM_PS_ODD;
++	else
++		/* Even parity check/generation.  */
++		config |= V850E_UART_ASIM_PS_EVEN;
++	if (cflags & CREAD)
++		/* Reading enabled.  */
++		config |= V850E_UART_ASIM_RXE;
++
++	config |= V850E_UART_ASIM_CAE;
++	config |= V850E_UART_ASIM_TXE; /* Writing is always enabled.  */
++	config |= V850E_UART_ASIM_ISRM; /* Errors generate a read-irq.  */
++
++	return config;
++}
++
++/* This should delay as long as necessary for a recently written config
++   setting to settle, before we turn the uart back on.  */
++static inline void
++v850e_uart_config_delay (v850e_uart_config_t config, v850e_uart_speed_t speed)
++{
++	/* The UART may not be reset properly unless we wait at least 2
++	   `basic-clocks' until turning on the TXE/RXE bits again.
++	   A `basic clock' is the clock used by the baud-rate generator,
++	   i.e., the cpu clock divided by the 2^new_clk_divlog2.
++	   The loop takes 2 insns, so loop CYCLES / 2 times.  */
++	register unsigned count = 1 << speed.clk_divlog2;
++	while (--count != 0)
++		/* nothing */;
++}
++
++
++/* RX/TX interface.  */
++
++/* Return true if all characters awaiting transmission on uart channel N
++   have been transmitted.  */
++#define v850e_uart_xmit_done(n)						      \
++   (! (V850E_UART_ASIF(n) & V850E_UART_ASIF_TXBF))
++/* Wait for this to be true.  */
++#define v850e_uart_wait_for_xmit_done(n)				      \
++   do { } while (! v850e_uart_xmit_done (n))
++
++/* Return true if uart channel N is ready to transmit a character.  */
++#define v850e_uart_xmit_ok(n)						      \
++   (v850e_uart_xmit_done(n) && v850e_uart_cts(n))
++/* Wait for this to be true.  */
++#define v850e_uart_wait_for_xmit_ok(n)					      \
++   do { } while (! v850e_uart_xmit_ok (n))
++
++/* Write character CH to uart channel CHAN.  */
++#define v850e_uart_putc(chan, ch)	(V850E_UART_TXB(chan) = (ch))
++
++/* Return latest character read on channel CHAN.  */
++#define v850e_uart_getc(chan)		V850E_UART_RXB (chan)
++
++/* Return bit-mask of uart error status.  */
++#define v850e_uart_err(chan)		V850E_UART_ASIS (chan)
++/* Various error bits set in the error result.  */
++#define V850E_UART_ERR_OVERRUN		V850E_UART_ASIS_OVE
++#define V850E_UART_ERR_FRAME		V850E_UART_ASIS_FE
++#define V850E_UART_ERR_PARITY		V850E_UART_ASIS_PE
++
++
++#endif /* __V850_V850E_UARTA_H__ */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e_uartb.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,262 @@
++/*
++ * include/asm-v850/v850e_uartb.h -- V850E on-chip `UARTB' UART
++ *
++ *  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>
++ */
++
++/* The V850E UARTB is basically a superset of the original V850E UART, but
++   even where it's the same, the names and details have changed a bit.
++   It's similar enough to use the same driver (v850e_uart.c), but the
++   details have been abstracted slightly to do so.  */
++
++#ifndef __V850_V850E_UARTB_H__
++#define __V850_V850E_UARTB_H__
++
++
++/* Raw hardware interface.  */
++
++#define V850E_UARTB_BASE_ADDR(n)	(0xFFFFFA00 + 0x10 * (n))
++
++/* Addresses of specific UART control registers for channel N.  */
++#define V850E_UARTB_CTL0_ADDR(n)	(V850E_UARTB_BASE_ADDR(n) + 0x0)
++#define V850E_UARTB_CTL2_ADDR(n)	(V850E_UARTB_BASE_ADDR(n) + 0x2)
++#define V850E_UARTB_STR_ADDR(n)		(V850E_UARTB_BASE_ADDR(n) + 0x4)
++#define V850E_UARTB_RX_ADDR(n)		(V850E_UARTB_BASE_ADDR(n) + 0x6)
++#define V850E_UARTB_RXAP_ADDR(n)	(V850E_UARTB_BASE_ADDR(n) + 0x6)
++#define V850E_UARTB_TX_ADDR(n)		(V850E_UARTB_BASE_ADDR(n) + 0x8)
++#define V850E_UARTB_FIC0_ADDR(n)	(V850E_UARTB_BASE_ADDR(n) + 0xA)
++#define V850E_UARTB_FIC1_ADDR(n)	(V850E_UARTB_BASE_ADDR(n) + 0xB)
++#define V850E_UARTB_FIC2_ADDR(n)	(V850E_UARTB_BASE_ADDR(n) + 0xC)
++#define V850E_UARTB_FIS0_ADDR(n)	(V850E_UARTB_BASE_ADDR(n) + 0xE)
++#define V850E_UARTB_FIS1_ADDR(n)	(V850E_UARTB_BASE_ADDR(n) + 0xF)
++
++/* UARTB control register 0 (general config).  */
++#define V850E_UARTB_CTL0(n)	(*(volatile u8 *)V850E_UARTB_CTL0_ADDR(n))
++/* Control bits for config registers.  */
++#define V850E_UARTB_CTL0_PWR		0x80	/* clock enable */
++#define V850E_UARTB_CTL0_TXE		0x40	/* transmit enable */
++#define V850E_UARTB_CTL0_RXE		0x20	/* receive enable */
++#define V850E_UARTB_CTL0_DIR		0x10	/*  */
++#define V850E_UARTB_CTL0_PS1		0x08	/* parity */
++#define V850E_UARTB_CTL0_PS0		0x04	/* parity */
++#define V850E_UARTB_CTL0_CL		0x02	/* char len 1:8bit, 0:7bit */
++#define V850E_UARTB_CTL0_SL		0x01	/* stop bit 1:2bit, 0:1bit */
++#define V850E_UARTB_CTL0_PS_MASK	0x0C	/* mask covering parity bits */
++#define V850E_UARTB_CTL0_PS_NONE	0x00	/* no parity */
++#define V850E_UARTB_CTL0_PS_ZERO	0x04	/* zero parity */
++#define V850E_UARTB_CTL0_PS_ODD		0x08	/* odd parity */
++#define V850E_UARTB_CTL0_PS_EVEN	0x0C	/* even parity */
++#define V850E_UARTB_CTL0_CL_8		0x02	/* char len 1:8bit, 0:7bit */
++#define V850E_UARTB_CTL0_SL_2		0x01	/* stop bit 1:2bit, 0:1bit */
++
++/* UARTB control register 2 (clock divider).  */
++#define V850E_UARTB_CTL2(n)	(*(volatile u16 *)V850E_UARTB_CTL2_ADDR(n))
++#define V850E_UARTB_CTL2_MIN	4
++#define V850E_UARTB_CTL2_MAX	0xFFFF
++
++/* UARTB serial interface status register.  */
++#define V850E_UARTB_STR(n)	(*(volatile u8 *)V850E_UARTB_STR_ADDR(n))
++/* Control bits for status registers.  */
++#define V850E_UARTB_STR_TSF	0x80	/* UBTX or FIFO exist data  */
++#define V850E_UARTB_STR_OVF	0x08	/* overflow error */
++#define V850E_UARTB_STR_PE	0x04	/* parity error */
++#define V850E_UARTB_STR_FE	0x02	/* framing error */
++#define V850E_UARTB_STR_OVE	0x01	/* overrun error */
++
++/* UARTB receive data register.  */
++#define V850E_UARTB_RX(n)	(*(volatile u8 *)V850E_UARTB_RX_ADDR(n))
++#define V850E_UARTB_RXAP(n)	(*(volatile u16 *)V850E_UARTB_RXAP_ADDR(n))
++/* Control bits for status registers.  */
++#define V850E_UARTB_RXAP_PEF	0x0200 /* parity error */
++#define V850E_UARTB_RXAP_FEF	0x0100 /* framing error */
++
++/* UARTB transmit data register.  */
++#define V850E_UARTB_TX(n)	(*(volatile u8 *)V850E_UARTB_TX_ADDR(n))
++
++/* UARTB FIFO control register 0.  */
++#define V850E_UARTB_FIC0(n)	(*(volatile u8 *)V850E_UARTB_FIC0_ADDR(n))
++
++/* UARTB FIFO control register 1.  */
++#define V850E_UARTB_FIC1(n)	(*(volatile u8 *)V850E_UARTB_FIC1_ADDR(n))
++
++/* UARTB FIFO control register 2.  */
++#define V850E_UARTB_FIC2(n)	(*(volatile u16 *)V850E_UARTB_FIC2_ADDR(n))
++
++/* UARTB FIFO status register 0.  */
++#define V850E_UARTB_FIS0(n)	(*(volatile u8 *)V850E_UARTB_FIS0_ADDR(n))
++
++/* UARTB FIFO status register 1.  */
++#define V850E_UARTB_FIS1(n)	(*(volatile u8 *)V850E_UARTB_FIS1_ADDR(n))
++
++
++/* Slightly abstract interface used by driver.  */
++
++
++/* Interrupts used by the UART.  */
++
++/* Received when the most recently transmitted character has been sent.  */
++#define V850E_UART_TX_IRQ(chan)		IRQ_INTUBTIT (chan)
++/* Received when a new character has been received.  */
++#define V850E_UART_RX_IRQ(chan)		IRQ_INTUBTIR (chan)
++
++/* Use by serial driver for information purposes.  */
++#define V850E_UART_BASE_ADDR(chan)	V850E_UARTB_BASE_ADDR(chan)
++
++
++/* UART clock generator interface.  */
++
++/* This type encapsulates a particular uart frequency.  */
++typedef u16 v850e_uart_speed_t;
++
++/* Calculate a uart speed from BAUD for this uart.  */
++static inline v850e_uart_speed_t v850e_uart_calc_speed (unsigned baud)
++{
++	v850e_uart_speed_t speed;
++
++	/*
++	 * V850E/ME2 UARTB baud rate is determined by the value of UBCTL2
++	 * fx = V850E_UARTB_BASE_FREQ = CPU_CLOCK_FREQ/4
++	 * baud = fx / 2*speed   [ speed >= 4 ]
++	 */
++	speed = V850E_UARTB_CTL2_MIN;
++	while (((V850E_UARTB_BASE_FREQ / 2) / speed ) > baud)
++		speed++;
++
++	return speed;
++}
++
++/* Return the current speed of uart channel CHAN.  */
++#define v850e_uart_speed(chan)		    V850E_UARTB_CTL2 (chan)
++
++/* Set the current speed of uart channel CHAN.  */
++#define v850e_uart_set_speed(chan, speed)   (V850E_UARTB_CTL2 (chan) = (speed))
++
++/* Return true if SPEED1 and SPEED2 are the same.  */
++#define v850e_uart_speed_eq(speed1, speed2) ((speed1) == (speed2))
++
++/* Minimum baud rate possible.  */
++#define v850e_uart_min_baud() \
++   ((V850E_UARTB_BASE_FREQ / 2) / V850E_UARTB_CTL2_MAX)
++
++/* Maximum baud rate possible.  The error is quite high at max, though.  */
++#define v850e_uart_max_baud() \
++   ((V850E_UARTB_BASE_FREQ / 2) / V850E_UARTB_CTL2_MIN)
++
++/* The `maximum' clock rate the uart can used, which is wanted (though not
++   really used in any useful way) by the serial framework.  */
++#define v850e_uart_max_clock() \
++   (V850E_UARTB_BASE_FREQ / 2)
++
++
++/* UART configuration interface.  */
++
++/* Type of the uart config register; must be a scalar.  */
++typedef u16 v850e_uart_config_t;
++
++/* The uart hardware config register for channel CHAN.  */
++#define V850E_UART_CONFIG(chan)		V850E_UARTB_CTL0 (chan)
++
++/* This config bit set if the uart is enabled.  */
++#define V850E_UART_CONFIG_ENABLED	V850E_UARTB_CTL0_PWR
++/* If the uart _isn't_ enabled, store this value to it to do so.  */
++#define V850E_UART_CONFIG_INIT		V850E_UARTB_CTL0_PWR
++/* Store this config value to disable the uart channel completely.  */
++#define V850E_UART_CONFIG_FINI		0
++
++/* Setting/clearing these bits enable/disable TX/RX, respectively (but
++   otherwise generally leave things running).  */
++#define V850E_UART_CONFIG_RX_ENABLE	V850E_UARTB_CTL0_RXE
++#define V850E_UART_CONFIG_TX_ENABLE	V850E_UARTB_CTL0_TXE
++
++/* These masks define which config bits affect TX/RX modes, respectively.  */
++#define V850E_UART_CONFIG_RX_BITS \
++  (V850E_UARTB_CTL0_PS_MASK | V850E_UARTB_CTL0_CL_8)
++#define V850E_UART_CONFIG_TX_BITS \
++  (V850E_UARTB_CTL0_PS_MASK | V850E_UARTB_CTL0_CL_8 | V850E_UARTB_CTL0_SL_2)
++
++static inline v850e_uart_config_t v850e_uart_calc_config (unsigned cflags)
++{
++	v850e_uart_config_t config = 0;
++
++	/* Figure out new configuration of control register.  */
++	if (cflags & CSTOPB)
++		/* Number of stop bits, 1 or 2.  */
++		config |= V850E_UARTB_CTL0_SL_2;
++	if ((cflags & CSIZE) == CS8)
++		/* Number of data bits, 7 or 8.  */
++		config |= V850E_UARTB_CTL0_CL_8;
++	if (! (cflags & PARENB))
++		/* No parity check/generation.  */
++		config |= V850E_UARTB_CTL0_PS_NONE;
++	else if (cflags & PARODD)
++		/* Odd parity check/generation.  */
++		config |= V850E_UARTB_CTL0_PS_ODD;
++	else
++		/* Even parity check/generation.  */
++		config |= V850E_UARTB_CTL0_PS_EVEN;
++	if (cflags & CREAD)
++		/* Reading enabled.  */
++		config |= V850E_UARTB_CTL0_RXE;
++
++	config |= V850E_UARTB_CTL0_PWR;
++	config |= V850E_UARTB_CTL0_TXE; /* Writing is always enabled.  */
++	config |= V850E_UARTB_CTL0_DIR; /* LSB first.  */
++
++	return config;
++}
++
++/* This should delay as long as necessary for a recently written config
++   setting to settle, before we turn the uart back on.  */
++static inline void
++v850e_uart_config_delay (v850e_uart_config_t config, v850e_uart_speed_t speed)
++{
++	/* The UART may not be reset properly unless we wait at least 2
++	   `basic-clocks' until turning on the TXE/RXE bits again.
++	   A `basic clock' is the clock used by the baud-rate generator,
++	   i.e., the cpu clock divided by the 2^new_clk_divlog2.
++	   The loop takes 2 insns, so loop CYCLES / 2 times.  */
++	register unsigned count = 1 << speed;
++	while (--count != 0)
++		/* nothing */;
++}
++
++
++/* RX/TX interface.  */
++
++/* Return true if all characters awaiting transmission on uart channel N
++   have been transmitted.  */
++#define v850e_uart_xmit_done(n)						      \
++   (! (V850E_UARTB_STR(n) & V850E_UARTB_STR_TSF))
++/* Wait for this to be true.  */
++#define v850e_uart_wait_for_xmit_done(n)				      \
++   do { } while (! v850e_uart_xmit_done (n))
++
++/* Return true if uart channel N is ready to transmit a character.  */
++#define v850e_uart_xmit_ok(n)						      \
++   (v850e_uart_xmit_done(n) && v850e_uart_cts(n))
++/* Wait for this to be true.  */
++#define v850e_uart_wait_for_xmit_ok(n)					      \
++   do { } while (! v850e_uart_xmit_ok (n))
++
++/* Write character CH to uart channel CHAN.  */
++#define v850e_uart_putc(chan, ch)	(V850E_UARTB_TX(chan) = (ch))
++
++/* Return latest character read on channel CHAN.  */
++#define v850e_uart_getc(chan)		V850E_UARTB_RX (chan)
++
++/* Return bit-mask of uart error status.  */
++#define v850e_uart_err(chan)		V850E_UARTB_STR (chan)
++/* Various error bits set in the error result.  */
++#define V850E_UART_ERR_OVERRUN		V850E_UARTB_STR_OVE
++#define V850E_UART_ERR_FRAME		V850E_UARTB_STR_FE
++#define V850E_UART_ERR_PARITY		V850E_UARTB_STR_PE
++
++
++#endif /* __V850_V850E_UARTB_H__ */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e_uart.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,77 @@
++/*
++ * include/asm-v850/v850e_uart.h -- common V850E on-chip UART driver
++ *
++ *  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>
++ */
++
++/* There's not actually a single UART implementation used by V850E CPUs,
++   but rather a series of implementations that are all `close' to one
++   another.  This file corresponds to the single driver which handles all
++   of them.  */
++
++#ifndef __V850_V850E_UART_H__
++#define __V850_V850E_UART_H__
++
++#include <linux/config.h>
++#include <linux/termios.h>
++
++#include <asm/v850e_utils.h>
++#include <asm/types.h>
++#include <asm/machdep.h>	/* Pick up chip-specific defs.  */
++
++
++/* Include model-specific definitions.  */
++#ifdef CONFIG_V850E_UART
++# ifdef CONFIG_V850E_UARTB
++#  include <asm-v850/v850e_uartb.h>
++# else
++#  include <asm-v850/v850e_uarta.h> /* original V850E UART */
++# endif
++#endif
++
++
++/* Optional capabilities some hardware provides.  */
++
++/* This UART doesn't implement RTS/CTS by default, but some platforms
++   implement them externally, so check to see if <asm/machdep.h> defined
++   anything.  */
++#ifdef V850E_UART_CTS
++#define v850e_uart_cts(n)		V850E_UART_CTS(n)
++#else
++#define v850e_uart_cts(n)		(1)
++#endif
++
++/* Do the same for RTS.  */
++#ifdef V850E_UART_SET_RTS
++#define v850e_uart_set_rts(n,v)		V850E_UART_SET_RTS(n,v)
++#else
++#define v850e_uart_set_rts(n,v)		((void)0)
++#endif
++
++
++/* This is the serial channel to use for the boot console (if desired).  */
++#ifndef V850E_UART_CONSOLE_CHANNEL
++# define V850E_UART_CONSOLE_CHANNEL 0
++#endif
++
++
++#ifndef __ASSEMBLY__
++
++/* Setup a console using channel 0 of the builtin uart.  */
++extern void v850e_uart_cons_init (unsigned chan);
++
++/* Configure and turn on uart channel CHAN, using the termios `control
++   modes' bits in CFLAGS, and a baud-rate of BAUD.  */
++void v850e_uart_configure (unsigned chan, unsigned cflags, unsigned baud);
++
++#endif /* !__ASSEMBLY__ */
++
++
++#endif /* __V850_V850E_UART_H__ */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e_utils.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,35 @@
++/*
++ * include/asm-v850/v850e_utils.h -- Utility functions associated with
++ *	V850E CPUs
++ *
++ *  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
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#ifndef __V850_V850E_UTILS_H__
++#define __V850_V850E_UTILS_H__
++
++/* Calculate counter clock-divider and count values to attain the
++   desired frequency RATE from the base frequency BASE_FREQ.  The
++   counter is expected to have a clock-divider, which can divide the
++   system cpu clock by a power of two value from MIN_DIVLOG2 to
++   MAX_DIV_LOG2, and a word-size of COUNTER_SIZE bits (the counter
++   counts up and resets whenever it's equal to the compare register,
++   generating an interrupt or whatever when it does so).  The returned
++   values are: *DIVLOG2 -- log2 of the desired clock divider and *COUNT
++   -- the counter compare value to use.  Returns true if it was possible
++   to find a reasonable value, otherwise false (and the other return
++   values will be set to be as good as possible).  */
++extern int calc_counter_params (unsigned long base_freq,
++				unsigned long rate,
++				unsigned min_divlog2, unsigned max_divlog2,
++				unsigned counter_size,
++				unsigned *divlog2, unsigned *count);
++
++#endif /* __V850_V850E_UTILS_H__ */
+--- linux-2.6.0-test1/include/asm-x86_64/bitops.h	2003-06-14 12:18:08.000000000 -0700
++++ 25/include/asm-x86_64/bitops.h	2003-07-19 17:04:07.000000000 -0700
+@@ -477,6 +477,7 @@ static __inline__ int ffs(int x)
+  * The Hamming Weight of a number is the total number of bits set in it.
+  */
+ 
++#define hweight64(x) generic_hweight64(x)
+ #define hweight32(x) generic_hweight32(x)
+ #define hweight16(x) generic_hweight16(x)
+ #define hweight8(x) generic_hweight8(x)
+--- linux-2.6.0-test1/include/asm-x86_64/mpspec.h	2003-06-14 12:18:09.000000000 -0700
++++ 25/include/asm-x86_64/mpspec.h	2003-07-19 17:04:07.000000000 -0700
+@@ -171,7 +171,7 @@ extern int quad_local_to_mp_bus_id [NR_C
+ extern int mp_bus_id_to_pci_bus [MAX_MP_BUSSES];
+ 
+ extern unsigned int boot_cpu_physical_apicid;
+-extern unsigned long phys_cpu_present_map;
++extern cpumask_t phys_cpu_present_map;
+ extern int smp_found_config;
+ extern void find_smp_config (void);
+ extern void get_smp_config (void);
+--- linux-2.6.0-test1/include/asm-x86_64/pgalloc.h	2003-06-14 12:18:22.000000000 -0700
++++ 25/include/asm-x86_64/pgalloc.h	2003-07-19 17:07:16.000000000 -0700
+@@ -10,7 +10,7 @@
+ #define pmd_populate_kernel(mm, pmd, pte) \
+ 		set_pmd(pmd, __pmd(_PAGE_TABLE | __pa(pte)))
+ #define pgd_populate(mm, pgd, pmd) \
+-		set_pgd(pgd, __pgd(_PAGE_TABLE | __pa(pmd)))
++		set_pgd(pgd, __pgd(_PAGE_TABLE | __pa(page_address(pmd))))
+ 
+ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *pte)
+ {
+@@ -22,18 +22,25 @@ extern __inline__ pmd_t *get_pmd(void)
+ 	return (pmd_t *)get_zeroed_page(GFP_KERNEL);
+ }
+ 
+-extern __inline__ void pmd_free(pmd_t *pmd)
++extern __inline__ void pmd_free(struct page *pmd)
+ {
+-	if ((unsigned long)pmd & (PAGE_SIZE-1)) 
+-		BUG(); 
+-	free_page((unsigned long)pmd);
++	__free_page(pmd);
+ }
+ 
+-static inline pmd_t *pmd_alloc_one (struct mm_struct *mm, unsigned long addr)
++static inline pmd_t *pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
+ {
+ 	return (pmd_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT);
+ }
+ 
++static inline struct page *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
++{
++	pmd_t *pmd = pmd_alloc_one_kernel(mm, addr);
++	if (pmd)
++		return virt_to_page(pmd);
++	else
++		return NULL;
++}
++
+ static inline pgd_t *pgd_alloc (struct mm_struct *mm)
+ {
+ 	return (pgd_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT);
+--- linux-2.6.0-test1/include/asm-x86_64/pgtable.h	2003-07-02 14:53:18.000000000 -0700
++++ 25/include/asm-x86_64/pgtable.h	2003-07-19 17:07:16.000000000 -0700
+@@ -98,8 +98,9 @@ static inline void set_pml4(pml4_t *dst,
+ 	pml4_val(*dst) = pml4_val(val); 
+ }
+ 
+-#define pgd_page(pgd) \
++#define __pgd_page(pgd) \
+ ((unsigned long) __va(pgd_val(pgd) & PHYSICAL_PAGE_MASK))
++#define pgd_page(pgd)		virt_to_page(__pgd_page(pgd))
+ 
+ #define ptep_get_and_clear(xp)	__pte(xchg(&(xp)->pte, 0))
+ #define pte_same(a, b)		((a).pte == (b).pte)
+@@ -332,8 +333,13 @@ static inline pgd_t *current_pgd_offset_
+ #define pmd_page(pmd)		(pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
+ 
+ #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
+-#define pmd_offset(dir, address) ((pmd_t *) pgd_page(*(dir)) + \
++#define pmd_offset(dir, address) ((pmd_t *)__pgd_page(*(dir)) + \
+ 			pmd_index(address))
++#define pmd_offset_kernel(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)			pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)		pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)					do { } while (0)
++#define pmd_unmap_nested(pmd)				do { } while (0)
+ #define pmd_none(x)	(!pmd_val(x))
+ #define pmd_present(x)	(pmd_val(x) & _PAGE_PRESENT)
+ #define pmd_clear(xp)	do { set_pmd(xp, __pmd(0)); } while (0)
+--- linux-2.6.0-test1/include/asm-x86_64/posix_types.h	2003-06-14 12:18:48.000000000 -0700
++++ 25/include/asm-x86_64/posix_types.h	2003-07-19 17:06:39.000000000 -0700
+@@ -7,7 +7,9 @@
+  * assume GCC is being used.
+  */
+ 
++#ifdef __GNUC__
+ typedef unsigned long	__kernel_dev_t;
++#endif
+ typedef unsigned long	__kernel_ino_t;
+ typedef unsigned int	__kernel_mode_t;
+ typedef unsigned long	__kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-x86_64/smp.h	2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-x86_64/smp.h	2003-07-19 17:04:07.000000000 -0700
+@@ -7,6 +7,7 @@
+ #ifndef __ASSEMBLY__
+ #include <linux/config.h>
+ #include <linux/threads.h>
++#include <linux/cpumask.h>
+ #include <linux/bitops.h>
+ extern int disable_apic;
+ #endif
+@@ -35,8 +36,8 @@ struct pt_regs;
+  */
+  
+ extern void smp_alloc_memory(void);
+-extern unsigned long phys_cpu_present_map;
+-extern unsigned long cpu_online_map;
++extern cpumask_t phys_cpu_present_map;
++extern cpumask_t cpu_online_map;
+ extern volatile unsigned long smp_invalidate_needed;
+ extern int pic_mode;
+ extern void smp_flush_tlb(void);
+@@ -56,35 +57,17 @@ void smp_stop_cpu(void);
+  * compresses data structures.
+  */
+ 
+-extern volatile unsigned long cpu_callout_map;
++extern cpumask_t cpu_callout_map;
+ 
+-#define cpu_possible(cpu) (cpu_callout_map & (1<<(cpu)))
+-#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
+-
+-#define for_each_cpu(cpu, mask) \
+-	for(mask = cpu_online_map; \
+-	    cpu = __ffs(mask), mask != 0; \
+-	    mask &= ~(1UL<<cpu))
+-
+-extern inline unsigned int any_online_cpu(unsigned int mask)
+-{
+-	if (mask & cpu_online_map)
+-		return __ffs(mask & cpu_online_map);
+-
+-	return NR_CPUS; 
+-} 
+-
+-extern inline unsigned int num_online_cpus(void)
+-{ 
+-	return hweight32(cpu_online_map);
+-} 
++#define cpu_possible(cpu) cpu_isset(cpu, cpu_callout_map)
++#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
+ 
+ static inline int num_booting_cpus(void)
+ {
+-	return hweight32(cpu_callout_map);
++	return cpus_weight(cpu_callout_map);
+ }
+ 
+-extern volatile unsigned long cpu_callout_map;
++extern cpumask_t cpu_callout_map;
+ 
+ #define smp_processor_id() read_pda(cpunumber)
+ 
+@@ -104,7 +87,7 @@ extern inline int safe_smp_processor_id(
+ 		return hard_smp_processor_id();
+ } 
+ 
+-#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
++#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
+ #endif /* !ASSEMBLY */
+ 
+ #define NO_PROC_ID		0xFF		/* No processor magic marker */
+@@ -117,7 +100,6 @@ extern inline int safe_smp_processor_id(
+ #ifndef CONFIG_SMP
+ #define stack_smp_processor_id() 0
+ #define safe_smp_processor_id() 0
+-#define for_each_cpu(x) (x)=0;
+ #define cpu_logical_map(x) (x)
+ #else
+ #include <asm/thread_info.h>
+--- linux-2.6.0-test1/include/asm-x86_64/topology.h	2003-06-14 12:18:25.000000000 -0700
++++ 25/include/asm-x86_64/topology.h	2003-07-19 17:04:07.000000000 -0700
+@@ -8,13 +8,13 @@
+ /* Map the K8 CPU local memory controllers to a simple 1:1 CPU:NODE topology */
+ 
+ extern int fake_node;
+-extern unsigned long cpu_online_map;
++extern cpumask_t cpu_online_map;
+ 
+ #define cpu_to_node(cpu)		(fake_node ? 0 : (cpu))
+ #define memblk_to_node(memblk) 	(fake_node ? 0 : (memblk))
+ #define parent_node(node)		(node)
+ #define node_to_first_cpu(node) 	(fake_node ? 0 : (node))
+-#define node_to_cpu_mask(node)	(fake_node ? cpu_online_map : (1UL << (node)))
++#define node_to_cpu_mask(node)	(fake_node ? cpu_online_map : cpumask_of_cpu(node))
+ #define node_to_memblk(node)		(node)
+ 
+ #define NODE_BALANCE_RATE 30	/* CHECKME */ 
+--- linux-2.6.0-test1/include/linux/aio.h	2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/aio.h	2003-07-19 17:07:03.000000000 -0700
+@@ -54,7 +54,7 @@ struct kiocb {
+ 	struct file		*ki_filp;
+ 	struct kioctx		*ki_ctx;	/* may be NULL for sync ops */
+ 	int			(*ki_cancel)(struct kiocb *, struct io_event *);
+-	long			(*ki_retry)(struct kiocb *);
++	ssize_t			(*ki_retry)(struct kiocb *);
+ 
+ 	struct list_head	ki_list;	/* the aio core uses this
+ 						 * for cancellation */
+@@ -63,6 +63,16 @@ struct kiocb {
+ 	__u64			ki_user_data;	/* user's data for completion */
+ 	loff_t			ki_pos;
+ 
++	/* State that we remember to be able to restart/retry  */
++	unsigned short		ki_opcode;
++	size_t			ki_nbytes; 	/* copy of iocb->aio_nbytes */
++	char 			*ki_buf;	/* remaining iocb->aio_buf */
++	size_t			ki_left; 	/* remaining bytes */
++	wait_queue_t		ki_wait;
++	long			ki_retried; 	/* just for testing */
++	long			ki_kicked; 	/* just for testing */
++	long			ki_queued; 	/* just for testing */
++
+ 	char			private[KIOCB_PRIVATE_SIZE];
+ };
+ 
+@@ -77,6 +87,8 @@ struct kiocb {
+ 		(x)->ki_ctx = &tsk->active_mm->default_kioctx;	\
+ 		(x)->ki_cancel = NULL;			\
+ 		(x)->ki_user_obj = tsk;			\
++		(x)->ki_user_data = 0;			\
++		init_wait((&(x)->ki_wait));		\
+ 	} while (0)
+ 
+ #define AIO_RING_MAGIC			0xa10a10a1
+@@ -159,6 +171,17 @@ int FASTCALL(io_submit_one(struct kioctx
+ #define get_ioctx(kioctx)	do { if (unlikely(atomic_read(&(kioctx)->users) <= 0)) BUG(); atomic_inc(&(kioctx)->users); } while (0)
+ #define put_ioctx(kioctx)	do { if (unlikely(atomic_dec_and_test(&(kioctx)->users))) __put_ioctx(kioctx); else if (unlikely(atomic_read(&(kioctx)->users) < 0)) BUG(); } while (0)
+ 
++#define in_aio() !is_sync_wait(current->io_wait)
++/* may be used for debugging */
++#define warn_if_async()	if (in_aio()) {\
++	printk(KERN_ERR "%s(%s:%d) called in async context!\n", \
++	__FUNCTION__, __FILE__, __LINE__); \
++	dump_stack(); \
++	}
++
++#define io_wait_to_kiocb(wait) container_of(wait, struct kiocb, ki_wait)
++#define is_retried_kiocb(iocb) ((iocb)->ki_retried > 1)
++
+ #include <linux/aio_abi.h>
+ 
+ static inline struct kiocb *list_kiocb(struct list_head *h)
+--- linux-2.6.0-test1/include/linux/atmdev.h	2003-07-02 14:53:18.000000000 -0700
++++ 25/include/linux/atmdev.h	2003-07-19 17:03:51.000000000 -0700
+@@ -252,6 +252,7 @@ enum {
+ 	ATM_VF_SESSION,		/* VCC is p2mp session control descriptor */
+ 	ATM_VF_HASSAP,		/* SAP has been set */
+ 	ATM_VF_CLOSE,		/* asynchronous close - treat like VF_RELEASED*/
++	ATM_VF_WAITING,		/* waiting for reply from sigd */
+ };
+ 
+ 
+@@ -291,14 +292,11 @@ struct atm_vcc {
+ 	void		*dev_data;	/* per-device data */
+ 	void		*proto_data;	/* per-protocol data */
+ 	struct k_atm_aal_stats *stats;	/* pointer to AAL stats group */
+-	wait_queue_head_t sleep;	/* if socket is busy */
+ 	struct sock	*sk;		/* socket backpointer */
+ 	/* SVC part --- may move later ------------------------------------- */
+ 	short		itf;		/* interface number */
+ 	struct sockaddr_atmsvc local;
+ 	struct sockaddr_atmsvc remote;
+-	void (*callback)(struct atm_vcc *vcc);
+-	int		reply;		/* also used by ATMTCP */
+ 	/* Multipoint part ------------------------------------------------- */
+ 	struct atm_vcc	*session;	/* session VCC descriptor */
+ 	/* Other stuff ----------------------------------------------------- */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/linux/bitmap.h	2003-07-19 17:04:13.000000000 -0700
+@@ -0,0 +1,159 @@
++#ifndef __LINUX_BITMAP_H
++#define __LINUX_BITMAP_H
++
++#ifndef __ASSEMBLY__
++
++#include <linux/config.h>
++#include <linux/compiler.h>
++#include <linux/types.h>
++#include <linux/kernel.h>
++#include <linux/bitops.h>
++#include <linux/string.h>
++
++static inline int bitmap_empty(const unsigned long *bitmap, int bits)
++{
++	int k, lim = bits/BITS_PER_LONG;
++	for (k = 0; k < lim; ++k)
++		if (bitmap[k])
++			return 0;
++
++	if (bits % BITS_PER_LONG)
++		if (bitmap[k] & ((1UL << (bits % BITS_PER_LONG)) - 1))
++			return 0;
++
++	return 1;
++}
++
++static inline int bitmap_full(const unsigned long *bitmap, int bits)
++{
++	int k, lim = bits/BITS_PER_LONG;
++	for (k = 0; k < lim; ++k)
++		if (~bitmap[k])
++			return 0;
++
++	if (bits % BITS_PER_LONG)
++		if (~bitmap[k] & ((1UL << (bits % BITS_PER_LONG)) - 1))
++			return 0;
++
++	return 1;
++}
++
++static inline int bitmap_equal(const unsigned long *bitmap1,
++				unsigned long *bitmap2, int bits)
++{
++	int k, lim = bits/BITS_PER_LONG;;
++	for (k = 0; k < lim; ++k)
++		if (bitmap1[k] != bitmap2[k])
++			return 0;
++
++	if (bits % BITS_PER_LONG)
++		if ((bitmap1[k] ^ bitmap2[k]) &
++				((1UL << (bits % BITS_PER_LONG)) - 1))
++			return 0;
++
++	return 1;
++}
++
++static inline void bitmap_complement(unsigned long *bitmap, int bits)
++{
++	int k;
++
++	for (k = 0; k < BITS_TO_LONGS(bits); ++k)
++		bitmap[k] = ~bitmap[k];
++}
++
++static inline void bitmap_clear(unsigned long *bitmap, int bits)
++{
++	CLEAR_BITMAP((unsigned long *)bitmap, bits);
++}
++
++static inline void bitmap_fill(unsigned long *bitmap, int bits)
++{
++	memset(bitmap, 0xff, BITS_TO_LONGS(bits)*sizeof(unsigned long));
++}
++
++static inline void bitmap_copy(unsigned long *dst,
++			const unsigned long *src, int bits)
++{
++	memcpy(dst, src, BITS_TO_LONGS(bits)*sizeof(unsigned long));
++}
++
++static inline void bitmap_shift_right(unsigned long *dst,
++				const unsigned long *src, int shift, int bits)
++{
++	int k;
++	DECLARE_BITMAP(__shr_tmp, bits);
++
++	bitmap_clear(__shr_tmp, bits);
++	for (k = 0; k < bits - shift; ++k)
++		if (test_bit(k + shift, src))
++			set_bit(k, __shr_tmp);
++	bitmap_copy(dst, __shr_tmp, bits);
++}
++
++static inline void bitmap_shift_left(unsigned long *dst,
++				const unsigned long *src, int shift, int bits)
++{
++	int k;
++	DECLARE_BITMAP(__shl_tmp, bits);
++
++	bitmap_clear(__shl_tmp, bits);
++	for (k = bits; k >= shift; --k)
++		if (test_bit(k - shift, src))
++			set_bit(k, __shl_tmp);
++	bitmap_copy(dst, __shl_tmp, bits);
++}
++
++static inline void bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
++				const unsigned long *bitmap2, int bits)
++{
++	int k;
++	int nr = BITS_TO_LONGS(bits);
++
++	for (k = 0; k < nr; k++)
++		dst[k] = bitmap1[k] & bitmap2[k];
++}
++
++static inline void bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
++				const unsigned long *bitmap2, int bits)
++{
++	int k;
++	int nr = BITS_TO_LONGS(bits);
++
++	for (k = 0; k < nr; k++)
++		dst[k] = bitmap1[k] | bitmap2[k];
++}
++
++#if BITS_PER_LONG == 32
++static inline int bitmap_weight(const unsigned long *bitmap, int bits)
++{
++	int k, w = 0, lim = bits/BITS_PER_LONG;
++
++	for (k = 0; k < lim; k++)
++		w += hweight32(bitmap[k]);
++
++	if (bits % BITS_PER_LONG)
++		w += hweight32(bitmap[k] &
++				((1UL << (bits % BITS_PER_LONG)) - 1));
++
++	return w;
++}
++#else
++static inline int bitmap_weight(const unsigned long *bitmap, int bits)
++{
++	int k, w = 0, lim = bits/BITS_PER_LONG;
++
++	for (k = 0; k < lim; k++)
++		w += hweight64(bitmap[k]);
++
++	if (bits % BITS_PER_LONG)
++		w += hweight64(bitmap[k] &
++				((1UL << (bits % BITS_PER_LONG)) - 1));
++
++	return w;
++}
++#endif
++
++#endif /* __ASSEMBLY__ */
++
++#endif /* __LINUX_BITMAP_H */
+--- linux-2.6.0-test1/include/linux/blkdev.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/blkdev.h	2003-07-19 17:06:49.000000000 -0700
+@@ -44,9 +44,9 @@ struct as_io_context {
+ 	unsigned long ttime_samples;
+ 	unsigned long ttime_mean;
+ 	/* Layout pattern */
+-	long seek_samples;
++	unsigned int seek_samples;
+ 	sector_t last_request_pos;
+-	sector_t seek_total;
++	u64 seek_total;
+ 	sector_t seek_mean;
+ };
+ 
+@@ -491,6 +491,7 @@ extern void __blk_attempt_remerge(reques
+ extern struct request *blk_get_request(request_queue_t *, int, int);
+ extern void blk_put_request(struct request *);
+ extern void blk_insert_request(request_queue_t *, struct request *, int, void *);
++extern void blk_requeue_request(request_queue_t *, struct request *);
+ extern void blk_plug_device(request_queue_t *);
+ extern int blk_remove_plug(request_queue_t *);
+ extern void blk_recount_segments(request_queue_t *, struct bio *);
+@@ -549,6 +550,7 @@ extern void blk_queue_max_phys_segments(
+ extern void blk_queue_max_hw_segments(request_queue_t *, unsigned short);
+ extern void blk_queue_max_segment_size(request_queue_t *, unsigned int);
+ extern void blk_queue_hardsect_size(request_queue_t *, unsigned short);
++extern void blk_queue_stack_limits(request_queue_t *t, request_queue_t *b);
+ extern void blk_queue_segment_boundary(request_queue_t *, unsigned long);
+ extern void blk_queue_prep_rq(request_queue_t *, prep_rq_fn *pfn);
+ extern void blk_queue_merge_bvec(request_queue_t *, merge_bvec_fn *);
+@@ -574,6 +576,7 @@ extern void blk_queue_free_tags(request_
+ extern int blk_queue_resize_tags(request_queue_t *, int);
+ extern void blk_queue_invalidate_tags(request_queue_t *);
+ extern void blk_congestion_wait(int rw, long timeout);
++extern int blk_congestion_wait_wq(int rw, long timeout, wait_queue_t *wait);
+ 
+ extern void blk_rq_bio_prep(request_queue_t *, struct request *, struct bio *);
+ extern void blk_rq_prep_restart(struct request *);
+--- linux-2.6.0-test1/include/linux/blk.h	2003-06-14 12:18:30.000000000 -0700
++++ 25/include/linux/blk.h	2003-07-19 17:03:51.000000000 -0700
+@@ -1,2 +1,2 @@
+-/* this file is obsolete, please use <linux/blkdev.h> instead */
++#warning this file is obsolete, please use <linux/blkdev.h> instead
+ #include <linux/blkdev.h>
+--- linux-2.6.0-test1/include/linux/buffer_head.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/buffer_head.h	2003-07-19 17:07:00.000000000 -0700
+@@ -158,6 +158,7 @@ void mark_buffer_async_write(struct buff
+ void invalidate_bdev(struct block_device *, int);
+ int sync_blockdev(struct block_device *bdev);
+ void __wait_on_buffer(struct buffer_head *);
++int __wait_on_buffer_wq(struct buffer_head *, wait_queue_t *wait);
+ wait_queue_head_t *bh_waitq_head(struct buffer_head *bh);
+ void wake_up_buffer(struct buffer_head *bh);
+ int fsync_bdev(struct block_device *);
+@@ -169,6 +170,8 @@ void __brelse(struct buffer_head *);
+ void __bforget(struct buffer_head *);
+ void __breadahead(struct block_device *, sector_t block, int size);
+ struct buffer_head *__bread(struct block_device *, sector_t block, int size);
++struct buffer_head *__bread_wq(struct block_device *, sector_t block,
++	int size, wait_queue_t *wait);
+ struct buffer_head *alloc_buffer_head(int gfp_flags);
+ void free_buffer_head(struct buffer_head * bh);
+ void FASTCALL(unlock_buffer(struct buffer_head *bh));
+@@ -203,11 +206,6 @@ int nobh_prepare_write(struct page*, uns
+ int nobh_commit_write(struct file *, struct page *, unsigned, unsigned);
+ int nobh_truncate_page(struct address_space *, loff_t);
+ 
+-#define OSYNC_METADATA	(1<<0)
+-#define OSYNC_DATA	(1<<1)
+-#define OSYNC_INODE	(1<<2)
+-int generic_osync_inode(struct inode *, int);
+-
+ 
+ /*
+  * inline definitions
+@@ -226,13 +224,13 @@ static inline void put_bh(struct buffer_
+ 
+ static inline void brelse(struct buffer_head *bh)
+ {
+-	if (bh)
++	if (bh && !IS_ERR(bh))
+ 		__brelse(bh);
+ }
+ 
+ static inline void bforget(struct buffer_head *bh)
+ {
+-	if (bh)
++	if (bh && !IS_ERR(bh))
+ 		__bforget(bh);
+ }
+ 
+@@ -249,7 +247,12 @@ sb_breadahead(struct super_block *sb, se
+ }
+ 
+ static inline struct buffer_head *
+-sb_getblk(struct super_block *sb, sector_t block)
++sb_bread_wq(struct super_block *sb, sector_t block, wait_queue_t *wait)
++{
++	return __bread_wq(sb->s_bdev, block, sb->s_blocksize, wait);
++}
++
++static inline struct buffer_head *sb_getblk(struct super_block *sb, sector_t block)
+ {
+ 	return __getblk(sb->s_bdev, block, sb->s_blocksize);
+ }
+@@ -273,16 +276,34 @@ map_bh(struct buffer_head *bh, struct su
+  * __wait_on_buffer() just to trip a debug check.  Because debug code in inline
+  * functions is bloaty.
+  */
+-static inline void wait_on_buffer(struct buffer_head *bh)
++
++static inline int wait_on_buffer_wq(struct buffer_head *bh, wait_queue_t *wait)
+ {
+ 	if (buffer_locked(bh) || atomic_read(&bh->b_count) == 0)
+-		__wait_on_buffer(bh);
++		return __wait_on_buffer_wq(bh, wait);
++
++	return 0;
++}
++
++static inline void wait_on_buffer(struct buffer_head *bh)
++{
++	wait_on_buffer_wq(bh, NULL);
++}
++
++static inline int lock_buffer_wq(struct buffer_head *bh, wait_queue_t *wait)
++{
++	while (test_set_buffer_locked(bh)) {
++		int ret = __wait_on_buffer_wq(bh, wait);
++		if (ret)
++			return ret;
++	}
++
++	return 0;
+ }
+ 
+ static inline void lock_buffer(struct buffer_head *bh)
+ {
+-	while (test_set_buffer_locked(bh))
+-		__wait_on_buffer(bh);
++	lock_buffer_wq(bh, NULL);
+ }
+ 
+ #endif /* _LINUX_BUFFER_HEAD_H */
+--- linux-2.6.0-test1/include/linux/compiler.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/compiler.h	2003-07-19 17:04:50.000000000 -0700
+@@ -78,6 +78,6 @@
+    shouldn't recognize the original var, and make assumptions about it */
+ #define RELOC_HIDE(ptr, off)					\
+   ({ unsigned long __ptr;					\
+-    __asm__ ("" : "=g"(__ptr) : "0"(ptr));		\
++    __asm__ ("" : "=r"(__ptr) : "0"(ptr));		\
+     (typeof(ptr)) (__ptr + (off)); })
+ #endif /* __LINUX_COMPILER_H */
+--- linux-2.6.0-test1/include/linux/config.h	2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/config.h	2003-07-19 17:04:53.000000000 -0700
+@@ -2,5 +2,8 @@
+ #define _LINUX_CONFIG_H
+ 
+ #include <linux/autoconf.h>
++#if defined(__i386__) && !defined(IN_BOOTLOADER)
++#include <asm/kgdb.h>
++#endif
+ 
+ #endif
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/linux/cpumask.h	2003-07-19 17:04:07.000000000 -0700
+@@ -0,0 +1,62 @@
++#ifndef __LINUX_CPUMASK_H
++#define __LINUX_CPUMASK_H
++
++#include <linux/config.h>
++#include <linux/kernel.h>
++#include <linux/threads.h>
++#include <linux/types.h>
++#include <linux/bitmap.h>
++
++#define CPU_ARRAY_SIZE		BITS_TO_LONGS(NR_CPUS)
++
++struct cpumask
++{
++	unsigned long mask[CPU_ARRAY_SIZE];
++};
++
++typedef struct cpumask cpumask_t;
++
++#ifdef CONFIG_SMP
++#include <asm-generic/cpumask_array.h>
++#else
++#include <asm-generic/cpumask_up.h>
++#endif
++
++#if NR_CPUS <= 4*BITS_PER_LONG
++#include <asm-generic/cpumask_const_value.h>
++#else
++#include <asm-generic/cpumask_const_reference.h>
++#endif
++
++
++#ifdef CONFIG_SMP
++
++extern cpumask_t cpu_online_map;
++
++#define num_online_cpus()		cpus_weight(cpu_online_map)
++#define cpu_online(cpu)			cpu_isset(cpu, cpu_online_map)
++#else
++#define	cpu_online_map			cpumask_of_cpu(0)
++#define num_online_cpus()		1
++#define cpu_online(cpu)			({ BUG_ON((cpu) != 0); 1; })
++#endif
++
++static inline int next_online_cpu(int cpu, cpumask_t map)
++{
++	do
++		cpu = next_cpu_const(cpu, map);
++	while (cpu < NR_CPUS && !cpu_online(cpu));
++	return cpu;
++}
++
++#define for_each_cpu(cpu, map)						\
++	for (cpu = first_cpu_const(map);				\
++		cpu < NR_CPUS;						\
++		cpu = next_cpu_const(cpu,map))
++
++#define for_each_online_cpu(cpu, map)					\
++	for (cpu = first_cpu_const(map);				\
++		cpu < NR_CPUS;						\
++		cpu = next_online_cpu(cpu,map))
++
++#endif /* __LINUX_CPUMASK_H */
+--- linux-2.6.0-test1/include/linux/dm-ioctl.h	2003-06-14 12:17:56.000000000 -0700
++++ 25/include/linux/dm-ioctl.h	2003-07-19 17:03:51.000000000 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (C) 2001 Sistina Software (UK) Limited.
++ * Copyright (C) 2003 Sistina Software (UK) Limited.
+  *
+  * This file is released under the LGPL.
+  */
+@@ -7,143 +7,12 @@
+ #ifndef _LINUX_DM_IOCTL_H
+ #define _LINUX_DM_IOCTL_H
+ 
+-#include <linux/types.h>
++#include <linux/config.h>
+ 
+-#define DM_DIR "mapper"	/* Slashes not supported */
+-#define DM_MAX_TYPE_NAME 16
+-#define DM_NAME_LEN 128
+-#define DM_UUID_LEN 129
++#ifdef CONFIG_DM_IOCTL_V4
++#include "dm-ioctl-v4.h"
++#else
++#include "dm-ioctl-v1.h"
++#endif
+ 
+-/*
+- * Implements a traditional ioctl interface to the device mapper.
+- */
+-
+-/*
+- * All ioctl arguments consist of a single chunk of memory, with
+- * this structure at the start.  If a uuid is specified any
+- * lookup (eg. for a DM_INFO) will be done on that, *not* the
+- * name.
+- */
+-struct dm_ioctl {
+-	/*
+-	 * The version number is made up of three parts:
+-	 * major - no backward or forward compatibility,
+-	 * minor - only backwards compatible,
+-	 * patch - both backwards and forwards compatible.
+-	 *
+-	 * All clients of the ioctl interface should fill in the
+-	 * version number of the interface that they were
+-	 * compiled with.
+-	 *
+-	 * All recognised ioctl commands (ie. those that don't
+-	 * return -ENOTTY) fill out this field, even if the
+-	 * command failed.
+-	 */
+-	uint32_t version[3];	/* in/out */
+-	uint32_t data_size;	/* total size of data passed in
+-				 * including this struct */
+-
+-	uint32_t data_start;	/* offset to start of data
+-				 * relative to start of this struct */
+-
+-	uint32_t target_count;	/* in/out */
+-	uint32_t open_count;	/* out */
+-	uint32_t flags;		/* in/out */
+-
+-	__kernel_dev_t dev;	/* in/out */
+-
+-	char name[DM_NAME_LEN];	/* device name */
+-	char uuid[DM_UUID_LEN];	/* unique identifier for
+-				 * the block device */
+-};
+-
+-/*
+- * Used to specify tables.  These structures appear after the
+- * dm_ioctl.
+- */
+-struct dm_target_spec {
+-	int32_t status;		/* used when reading from kernel only */
+-	uint64_t sector_start;
+-	uint32_t length;
+-
+-	/*
+-	 * Offset in bytes (from the start of this struct) to
+-	 * next target_spec.
+-	 */
+-	uint32_t next;
+-
+-	char target_type[DM_MAX_TYPE_NAME];
+-
+-	/*
+-	 * Parameter string starts immediately after this object.
+-	 * Be careful to add padding after string to ensure correct
+-	 * alignment of subsequent dm_target_spec.
+-	 */
+-};
+-
+-/*
+- * Used to retrieve the target dependencies.
+- */
+-struct dm_target_deps {
+-	uint32_t count;
+-
+-	__kernel_dev_t dev[0];	/* out */
+-};
+-
+-/*
+- * If you change this make sure you make the corresponding change
+- * to dm-ioctl.c:lookup_ioctl()
+- */
+-enum {
+-	/* Top level cmds */
+-	DM_VERSION_CMD = 0,
+-	DM_REMOVE_ALL_CMD,
+-
+-	/* device level cmds */
+-	DM_DEV_CREATE_CMD,
+-	DM_DEV_REMOVE_CMD,
+-	DM_DEV_RELOAD_CMD,
+-	DM_DEV_RENAME_CMD,
+-	DM_DEV_SUSPEND_CMD,
+-	DM_DEV_DEPS_CMD,
+-	DM_DEV_STATUS_CMD,
+-
+-	/* target level cmds */
+-	DM_TARGET_STATUS_CMD,
+-	DM_TARGET_WAIT_CMD
+-};
+-
+-#define DM_IOCTL 0xfd
+-
+-#define DM_VERSION       _IOWR(DM_IOCTL, DM_VERSION_CMD, struct dm_ioctl)
+-#define DM_REMOVE_ALL    _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, struct dm_ioctl)
+-
+-#define DM_DEV_CREATE    _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, struct dm_ioctl)
+-#define DM_DEV_REMOVE    _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, struct dm_ioctl)
+-#define DM_DEV_RELOAD    _IOWR(DM_IOCTL, DM_DEV_RELOAD_CMD, struct dm_ioctl)
+-#define DM_DEV_SUSPEND   _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, struct dm_ioctl)
+-#define DM_DEV_RENAME    _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, struct dm_ioctl)
+-#define DM_DEV_DEPS      _IOWR(DM_IOCTL, DM_DEV_DEPS_CMD, struct dm_ioctl)
+-#define DM_DEV_STATUS    _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, struct dm_ioctl)
+-
+-#define DM_TARGET_STATUS _IOWR(DM_IOCTL, DM_TARGET_STATUS_CMD, struct dm_ioctl)
+-#define DM_TARGET_WAIT   _IOWR(DM_IOCTL, DM_TARGET_WAIT_CMD, struct dm_ioctl)
+-
+-#define DM_VERSION_MAJOR	1
+-#define DM_VERSION_MINOR	0
+-#define DM_VERSION_PATCHLEVEL	6
+-#define DM_VERSION_EXTRA	"-ioctl (2002-10-15)"
+-
+-/* Status bits */
+-#define DM_READONLY_FLAG	0x00000001
+-#define DM_SUSPEND_FLAG		0x00000002
+-#define DM_EXISTS_FLAG		0x00000004
+-#define DM_PERSISTENT_DEV_FLAG	0x00000008
+-
+-/*
+- * Flag passed into ioctl STATUS command to get table information
+- * rather than current status.
+- */
+-#define DM_STATUS_TABLE_FLAG	0x00000010
+-
+-#endif				/* _LINUX_DM_IOCTL_H */
++#endif
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/linux/dm-ioctl-v1.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,149 @@
++/*
++ * Copyright (C) 2001 Sistina Software (UK) Limited.
++ *
++ * This file is released under the LGPL.
++ */
++
++#ifndef _LINUX_DM_IOCTL_V1_H
++#define _LINUX_DM_IOCTL_V1_H
++
++#include <linux/types.h>
++
++#define DM_DIR "mapper"	/* Slashes not supported */
++#define DM_MAX_TYPE_NAME 16
++#define DM_NAME_LEN 128
++#define DM_UUID_LEN 129
++
++/*
++ * Implements a traditional ioctl interface to the device mapper.
++ */
++
++/*
++ * All ioctl arguments consist of a single chunk of memory, with
++ * this structure at the start.  If a uuid is specified any
++ * lookup (eg. for a DM_INFO) will be done on that, *not* the
++ * name.
++ */
++struct dm_ioctl {
++	/*
++	 * The version number is made up of three parts:
++	 * major - no backward or forward compatibility,
++	 * minor - only backwards compatible,
++	 * patch - both backwards and forwards compatible.
++	 *
++	 * All clients of the ioctl interface should fill in the
++	 * version number of the interface that they were
++	 * compiled with.
++	 *
++	 * All recognised ioctl commands (ie. those that don't
++	 * return -ENOTTY) fill out this field, even if the
++	 * command failed.
++	 */
++	uint32_t version[3];	/* in/out */
++	uint32_t data_size;	/* total size of data passed in
++				 * including this struct */
++
++	uint32_t data_start;	/* offset to start of data
++				 * relative to start of this struct */
++
++	uint32_t target_count;	/* in/out */
++	uint32_t open_count;	/* out */
++	uint32_t flags;		/* in/out */
++
++	__kernel_dev_t dev;	/* in/out */
++
++	char name[DM_NAME_LEN];	/* device name */
++	char uuid[DM_UUID_LEN];	/* unique identifier for
++				 * the block device */
++};
++
++/*
++ * Used to specify tables.  These structures appear after the
++ * dm_ioctl.
++ */
++struct dm_target_spec {
++	int32_t status;		/* used when reading from kernel only */
++	uint64_t sector_start;
++	uint32_t length;
++
++	/*
++	 * Offset in bytes (from the start of this struct) to
++	 * next target_spec.
++	 */
++	uint32_t next;
++
++	char target_type[DM_MAX_TYPE_NAME];
++
++	/*
++	 * Parameter string starts immediately after this object.
++	 * Be careful to add padding after string to ensure correct
++	 * alignment of subsequent dm_target_spec.
++	 */
++};
++
++/*
++ * Used to retrieve the target dependencies.
++ */
++struct dm_target_deps {
++	uint32_t count;
++
++	__kernel_dev_t dev[0];	/* out */
++};
++
++/*
++ * If you change this make sure you make the corresponding change
++ * to dm-ioctl.c:lookup_ioctl()
++ */
++enum {
++	/* Top level cmds */
++	DM_VERSION_CMD = 0,
++	DM_REMOVE_ALL_CMD,
++
++	/* device level cmds */
++	DM_DEV_CREATE_CMD,
++	DM_DEV_REMOVE_CMD,
++	DM_DEV_RELOAD_CMD,
++	DM_DEV_RENAME_CMD,
++	DM_DEV_SUSPEND_CMD,
++	DM_DEV_DEPS_CMD,
++	DM_DEV_STATUS_CMD,
++
++	/* target level cmds */
++	DM_TARGET_STATUS_CMD,
++	DM_TARGET_WAIT_CMD
++};
++
++#define DM_IOCTL 0xfd
++
++#define DM_VERSION       _IOWR(DM_IOCTL, DM_VERSION_CMD, struct dm_ioctl)
++#define DM_REMOVE_ALL    _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, struct dm_ioctl)
++
++#define DM_DEV_CREATE    _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, struct dm_ioctl)
++#define DM_DEV_REMOVE    _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, struct dm_ioctl)
++#define DM_DEV_RELOAD    _IOWR(DM_IOCTL, DM_DEV_RELOAD_CMD, struct dm_ioctl)
++#define DM_DEV_SUSPEND   _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, struct dm_ioctl)
++#define DM_DEV_RENAME    _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, struct dm_ioctl)
++#define DM_DEV_DEPS      _IOWR(DM_IOCTL, DM_DEV_DEPS_CMD, struct dm_ioctl)
++#define DM_DEV_STATUS    _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, struct dm_ioctl)
++
++#define DM_TARGET_STATUS _IOWR(DM_IOCTL, DM_TARGET_STATUS_CMD, struct dm_ioctl)
++#define DM_TARGET_WAIT   _IOWR(DM_IOCTL, DM_TARGET_WAIT_CMD, struct dm_ioctl)
++
++#define DM_VERSION_MAJOR	1
++#define DM_VERSION_MINOR	0
++#define DM_VERSION_PATCHLEVEL	6
++#define DM_VERSION_EXTRA	"-ioctl (2002-10-15)"
++
++/* Status bits */
++#define DM_READONLY_FLAG	0x00000001
++#define DM_SUSPEND_FLAG		0x00000002
++#define DM_EXISTS_FLAG		0x00000004
++#define DM_PERSISTENT_DEV_FLAG	0x00000008
++
++/*
++ * Flag passed into ioctl STATUS command to get table information
++ * rather than current status.
++ */
++#define DM_STATUS_TABLE_FLAG	0x00000010
++
++#endif				/* _LINUX_DM_IOCTL_H */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/linux/dm-ioctl-v4.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,237 @@
++/*
++ * Copyright (C) 2001 - 2003 Sistina Software (UK) Limited.
++ *
++ * This file is released under the LGPL.
++ */
++
++#ifndef _LINUX_DM_IOCTL_V4_H
++#define _LINUX_DM_IOCTL_V4_H
++
++#include <linux/types.h>
++
++#define DM_DIR "mapper"		/* Slashes not supported */
++#define DM_MAX_TYPE_NAME 16
++#define DM_NAME_LEN 128
++#define DM_UUID_LEN 129
++
++/*
++ * A traditional ioctl interface for the device mapper.
++ *
++ * Each device can have two tables associated with it, an
++ * 'active' table which is the one currently used by io passing
++ * through the device, and an 'inactive' one which is a table
++ * that is being prepared as a replacement for the 'active' one.
++ *
++ * DM_VERSION:
++ * Just get the version information for the ioctl interface.
++ *
++ * DM_REMOVE_ALL:
++ * Remove all dm devices, destroy all tables.  Only really used
++ * for debug.
++ *
++ * DM_LIST_DEVICES:
++ * Get a list of all the dm device names.
++ *
++ * DM_DEV_CREATE:
++ * Create a new device, neither the 'active' or 'inactive' table
++ * slots will be filled.  The device will be in suspended state
++ * after creation, however any io to the device will get errored
++ * since it will be out-of-bounds.
++ *
++ * DM_DEV_REMOVE:
++ * Remove a device, destroy any tables.
++ *
++ * DM_DEV_RENAME:
++ * Rename a device.
++ *
++ * DM_SUSPEND:
++ * This performs both suspend and resume, depending which flag is
++ * passed in.
++ * Suspend: This command will not return until all pending io to
++ * the device has completed.  Further io will be deferred until
++ * the device is resumed.
++ * Resume: It is no longer an error to issue this command on an
++ * unsuspended device.  If a table is present in the 'inactive'
++ * slot, it will be moved to the active slot, then the old table
++ * from the active slot will be _destroyed_.  Finally the device
++ * is resumed.
++ *
++ * DM_DEV_STATUS:
++ * Retrieves the status for the table in the 'active' slot.
++ *
++ * DM_DEV_WAIT:
++ * Wait for a significant event to occur to the device.  This
++ * could either be caused by an event triggered by one of the
++ * targets of the table in the 'active' slot, or a table change.
++ *
++ * DM_TABLE_LOAD:
++ * Load a table into the 'inactive' slot for the device.  The
++ * device does _not_ need to be suspended prior to this command.
++ *
++ * DM_TABLE_CLEAR:
++ * Destroy any table in the 'inactive' slot (ie. abort).
++ *
++ * DM_TABLE_DEPS:
++ * Return a set of device dependencies for the 'active' table.
++ *
++ * DM_TABLE_STATUS:
++ * Return the targets status for the 'active' table.
++ */
++
++/*
++ * All ioctl arguments consist of a single chunk of memory, with
++ * this structure at the start.  If a uuid is specified any
++ * lookup (eg. for a DM_INFO) will be done on that, *not* the
++ * name.
++ */
++struct dm_ioctl {
++	/*
++	 * The version number is made up of three parts:
++	 * major - no backward or forward compatibility,
++	 * minor - only backwards compatible,
++	 * patch - both backwards and forwards compatible.
++	 *
++	 * All clients of the ioctl interface should fill in the
++	 * version number of the interface that they were
++	 * compiled with.
++	 *
++	 * All recognised ioctl commands (ie. those that don't
++	 * return -ENOTTY) fill out this field, even if the
++	 * command failed.
++	 */
++	uint32_t version[3];	/* in/out */
++	uint32_t data_size;	/* total size of data passed in
++				 * including this struct */
++
++	uint32_t data_start;	/* offset to start of data
++				 * relative to start of this struct */
++
++	uint32_t target_count;	/* in/out */
++	int32_t open_count;	/* out */
++	uint32_t flags;		/* in/out */
++	uint32_t event_nr;      	/* in/out */
++	uint32_t padding;
++
++	uint64_t dev;		/* in/out */
++
++	char name[DM_NAME_LEN];	/* device name */
++	char uuid[DM_UUID_LEN];	/* unique identifier for
++				 * the block device */
++};
++
++/*
++ * Used to specify tables.  These structures appear after the
++ * dm_ioctl.
++ */
++struct dm_target_spec {
++	uint64_t sector_start;
++	uint64_t length;
++	int32_t status;		/* used when reading from kernel only */
++
++	/*
++	 * Offset in bytes (from the start of this struct) to
++	 * next target_spec.
++	 */
++	uint32_t next;
++
++	char target_type[DM_MAX_TYPE_NAME];
++
++	/*
++	 * Parameter string starts immediately after this object.
++	 * Be careful to add padding after string to ensure correct
++	 * alignment of subsequent dm_target_spec.
++	 */
++};
++
++/*
++ * Used to retrieve the target dependencies.
++ */
++struct dm_target_deps {
++	uint32_t count;	/* Array size */
++	uint32_t padding;	/* unused */
++	uint64_t dev[0];	/* out */
++};
++
++/*
++ * Used to get a list of all dm devices.
++ */
++struct dm_name_list {
++	uint64_t dev;
++	uint32_t next;		/* offset to the next record from
++				   the _start_ of this */
++	char name[0];
++};
++
++/*
++ * If you change this make sure you make the corresponding change
++ * to dm-ioctl.c:lookup_ioctl()
++ */
++enum {
++	/* Top level cmds */
++	DM_VERSION_CMD = 0,
++	DM_REMOVE_ALL_CMD,
++	DM_LIST_DEVICES_CMD,
++
++	/* device level cmds */
++	DM_DEV_CREATE_CMD,
++	DM_DEV_REMOVE_CMD,
++	DM_DEV_RENAME_CMD,
++	DM_DEV_SUSPEND_CMD,
++	DM_DEV_STATUS_CMD,
++	DM_DEV_WAIT_CMD,
++
++	/* Table level cmds */
++	DM_TABLE_LOAD_CMD,
++	DM_TABLE_CLEAR_CMD,
++	DM_TABLE_DEPS_CMD,
++	DM_TABLE_STATUS_CMD,
++};
++
++#define DM_IOCTL 0xfd
++
++#define DM_VERSION       _IOWR(DM_IOCTL, DM_VERSION_CMD, struct dm_ioctl)
++#define DM_REMOVE_ALL    _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, struct dm_ioctl)
++#define DM_LIST_DEVICES  _IOWR(DM_IOCTL, DM_LIST_DEVICES_CMD, struct dm_ioctl)
++
++#define DM_DEV_CREATE    _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, struct dm_ioctl)
++#define DM_DEV_REMOVE    _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, struct dm_ioctl)
++#define DM_DEV_RENAME    _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, struct dm_ioctl)
++#define DM_DEV_SUSPEND   _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, struct dm_ioctl)
++#define DM_DEV_STATUS    _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, struct dm_ioctl)
++#define DM_DEV_WAIT      _IOWR(DM_IOCTL, DM_DEV_WAIT_CMD, struct dm_ioctl)
++
++#define DM_TABLE_LOAD    _IOWR(DM_IOCTL, DM_TABLE_LOAD_CMD, struct dm_ioctl)
++#define DM_TABLE_CLEAR   _IOWR(DM_IOCTL, DM_TABLE_CLEAR_CMD, struct dm_ioctl)
++#define DM_TABLE_DEPS    _IOWR(DM_IOCTL, DM_TABLE_DEPS_CMD, struct dm_ioctl)
++#define DM_TABLE_STATUS  _IOWR(DM_IOCTL, DM_TABLE_STATUS_CMD, struct dm_ioctl)
++
++#define DM_VERSION_MAJOR	4
++#define DM_VERSION_MINOR	0
++#define DM_VERSION_PATCHLEVEL	0
++#define DM_VERSION_EXTRA	"-ioctl (2003-06-04)"
++
++/* Status bits */
++#define DM_READONLY_FLAG	(1 << 0) /* In/Out */
++#define DM_SUSPEND_FLAG		(1 << 1) /* In/Out */
++#define DM_PERSISTENT_DEV_FLAG	(1 << 3) /* In */
++
++/*
++ * Flag passed into ioctl STATUS command to get table information
++ * rather than current status.
++ */
++#define DM_STATUS_TABLE_FLAG	(1 << 4) /* In */
++
++/*
++ * Flags that indicate whether a table is present in either of
++ * the two table slots that a device has.
++ */
++#define DM_ACTIVE_PRESENT_FLAG   (1 << 5) /* Out */
++#define DM_INACTIVE_PRESENT_FLAG (1 << 6) /* Out */
++
++/*
++ * Indicates that the buffer passed in wasn't big enough for the
++ * results.
++ */
++#define DM_BUFFER_FULL_FLAG	(1 << 8) /* Out */
++
++#endif				/* _LINUX_DM_IOCTL_H */
+--- linux-2.6.0-test1/include/linux/elevator.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/elevator.h	2003-07-19 17:03:51.000000000 -0700
+@@ -13,6 +13,7 @@ typedef struct request *(elevator_next_r
+ typedef void (elevator_add_req_fn) (request_queue_t *, struct request *, struct list_head *);
+ typedef int (elevator_queue_empty_fn) (request_queue_t *);
+ typedef void (elevator_remove_req_fn) (request_queue_t *, struct request *);
++typedef void (elevator_requeue_req_fn) (request_queue_t *, struct request *);
+ typedef struct request *(elevator_request_list_fn) (request_queue_t *, struct request *);
+ typedef struct list_head *(elevator_get_sort_head_fn) (request_queue_t *, struct request *);
+ typedef void (elevator_completed_req_fn) (request_queue_t *, struct request *);
+@@ -33,6 +34,7 @@ struct elevator_s
+ 	elevator_next_req_fn *elevator_next_req_fn;
+ 	elevator_add_req_fn *elevator_add_req_fn;
+ 	elevator_remove_req_fn *elevator_remove_req_fn;
++	elevator_requeue_req_fn *elevator_requeue_req_fn;
+ 
+ 	elevator_queue_empty_fn *elevator_queue_empty_fn;
+ 	elevator_completed_req_fn *elevator_completed_req_fn;
+@@ -64,6 +66,7 @@ extern void elv_merge_requests(request_q
+ 			       struct request *);
+ extern void elv_merged_request(request_queue_t *, struct request *);
+ extern void elv_remove_request(request_queue_t *, struct request *);
++extern void elv_requeue_request(request_queue_t *, struct request *);
+ extern int elv_queue_empty(request_queue_t *);
+ extern struct request *elv_next_request(struct request_queue *q);
+ extern struct request *elv_former_request(request_queue_t *, struct request *);
+--- linux-2.6.0-test1/include/linux/elfcore.h	2003-06-14 12:18:51.000000000 -0700
++++ 25/include/linux/elfcore.h	2003-07-19 17:03:51.000000000 -0700
+@@ -107,12 +107,12 @@ static inline int elf_core_copy_task_reg
+ 
+ extern int dump_fpu (struct pt_regs *, elf_fpregset_t *);
+ 
+-static inline int elf_core_copy_task_fpregs(struct task_struct *t, elf_fpregset_t *fpu)
++static inline int elf_core_copy_task_fpregs(struct task_struct *t, struct pt_regs *regs, elf_fpregset_t *fpu)
+ {
+ #ifdef ELF_CORE_COPY_FPREGS
+ 	return ELF_CORE_COPY_FPREGS(t, fpu);
+ #else
+-	return dump_fpu(NULL, fpu);
++	return dump_fpu(regs, fpu);
+ #endif
+ }
+ 
+--- linux-2.6.0-test1/include/linux/errno.h	2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/errno.h	2003-07-19 17:06:43.000000000 -0700
+@@ -22,6 +22,7 @@
+ #define EBADTYPE	527	/* Type not supported by server */
+ #define EJUKEBOX	528	/* Request initiated, but will not complete before timeout */
+ #define EIOCBQUEUED	529	/* iocb queued, will get completion event */
++#define EIOCBRETRY	530	/* iocb queued, will trigger a retry */
+ 
+ #endif
+ 
+--- linux-2.6.0-test1/include/linux/ext3_fs.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/ext3_fs.h	2003-07-19 17:07:18.000000000 -0700
+@@ -721,7 +721,6 @@ extern int ext3_forget(handle_t *, int, 
+ extern struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *);
+ extern struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *);
+ 
+-extern int  ext3_get_inode_loc (struct inode *, struct ext3_iloc *);
+ extern void ext3_read_inode (struct inode *);
+ extern void ext3_write_inode (struct inode *, int);
+ extern int  ext3_setattr (struct dentry *, struct iattr *);
+--- linux-2.6.0-test1/include/linux/ext3_jbd.h	2003-06-22 12:04:45.000000000 -0700
++++ 25/include/linux/ext3_jbd.h	2003-07-19 17:03:51.000000000 -0700
+@@ -30,10 +30,11 @@
+ 
+ #define EXT3_SINGLEDATA_TRANS_BLOCKS	8U
+ 
+-/* Extended attributes may touch two data buffers, two bitmap buffers,
+- * and two group and summaries. */
++/* Extended attribute operations touch at most two data buffers,
++ * two bitmap buffers, and two group summaries, in addition to the inode
++ * and the superblock, which are already accounted for. */
+ 
+-#define EXT3_XATTR_TRANS_BLOCKS		8
++#define EXT3_XATTR_TRANS_BLOCKS		6U
+ 
+ /* Define the minimum size for a transaction which modifies data.  This
+  * needs to take into account the fact that we may end up modifying two
+--- linux-2.6.0-test1/include/linux/fb.h	2003-06-14 12:18:06.000000000 -0700
++++ 25/include/linux/fb.h	2003-07-19 17:04:55.000000000 -0700
+@@ -2,7 +2,6 @@
+ #define _LINUX_FB_H
+ 
+ #include <linux/tty.h>
+-#include <linux/workqueue.h>
+ #include <asm/types.h>
+ #include <asm/io.h>
+ 
+@@ -326,28 +325,38 @@ struct fb_cursor {
+ 	struct fb_image	image;	/* Cursor image */
+ };
+ 
++#ifdef __KERNEL__
++
++#include <linux/fs.h>
++#include <linux/init.h>
++#include <linux/workqueue.h>
++#include <linux/devfs_fs_kernel.h>
++
++/*
++ * The purpose of this structure is to translate data
++ * from the hardwre independent format of fbdev to what 
++ * format the hardware needs.
++ */ 
++
+ #define FB_PIXMAP_DEFAULT 1     /* used internally by fbcon */
+ #define FB_PIXMAP_SYSTEM  2     /* memory is in system RAM  */
+ #define FB_PIXMAP_IO      4     /* memory is iomapped       */
+ #define FB_PIXMAP_SYNC    256   /* set if GPU can DMA       */
+ 
+ struct fb_pixmap {
+-        __u8  *addr;                      /* pointer to memory             */  
+-	__u32 size;                       /* size of buffer in bytes       */
+-	__u32 offset;                     /* current offset to buffer      */
+-	__u32 buf_align;                  /* byte alignment of each bitmap */
+-	__u32 scan_align;                 /* alignment per scanline        */
+-	__u32 flags;                      /* see FB_PIXMAP_*               */
+-					  /* access methods                */
+-	void (*outbuf)(u8 *dst, u8 *addr, unsigned int size); 
+-	u8   (*inbuf) (u8 *addr);
+-	spinlock_t lock;                  /* spinlock                      */
++	u8  *addr;		/* pointer to memory 			*/
++	u32 size;		/* size of buffer in bytes 		*/
++	u32 offset;		/* current offset to buffer 		*/
++	u32 buf_align;		/* byte alignment of each bitmap 	*/
++	u32 scan_align;		/* alignment per scanline 		*/
++	u32 access_align;	/* alignment per read/write		*/
++	u32 flags;		/* see FB_PIXMAP_* 			*/
++	spinlock_t lock;	/* spinlock 				*/
+ 	atomic_t count;
++	/* access methods */
++	void (*outbuf)(u8 *addr, u8 *dst, unsigned int size); 
++	u8   (*inbuf) (u8 *addr);
+ };
+-#ifdef __KERNEL__
+-
+-#include <linux/fs.h>
+-#include <linux/init.h>
+ 
+ struct fb_info;
+ struct vm_area_struct;
+@@ -396,24 +405,24 @@ struct fb_ops {
+ };
+ 
+ struct fb_info {
+-   int node;
+-   int flags;
+-   int open;                            /* Has this been open already ? */
++	int node;
++	int flags;
+ #define FBINFO_FLAG_MODULE	1	/* Low-level driver is a module */
+-   struct fb_var_screeninfo var;        /* Current var */
+-   struct fb_fix_screeninfo fix;        /* Current fix */
+-   struct fb_monspecs monspecs;         /* Current Monitor specs */
+-   struct fb_cursor cursor;		/* Current cursor */	
+-   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 */
+-   int currcon;				/* Current VC. */	
+-   void *pseudo_palette;                /* Fake palette of 16 colors */ 
+-   /* From here on everything is device dependent */
+-   void *par;	
++	struct fb_var_screeninfo var;	/* Current var */
++	struct fb_fix_screeninfo fix;	/* Current fix */
++	struct fb_monspecs monspecs;	/* Current Monitor specs */
++	struct fb_cursor cursor;	/* Current cursor */	
++	struct work_struct queue;	/* Framebuffer event queue */
++	struct fb_pixmap pixmap;	/* Image HW mapper */
++	struct fb_pixmap sprite;	/* Cursor HW mapper */
++	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 */
++	void *pseudo_palette;		/* Fake palette of 16 colors */ 
++	int currcon;			/* Current VC. */	
++	/* From here on everything is device dependent */
++	void *par;	
+ };
+ 
+ #ifdef MODULE
+@@ -481,12 +490,12 @@ extern int register_framebuffer(struct f
+ extern int unregister_framebuffer(struct fb_info *fb_info);
+ extern int fb_prepare_logo(struct fb_info *fb_info);
+ extern int fb_show_logo(struct fb_info *fb_info);
+-extern u32 fb_get_buffer_offset(struct fb_info *info, u32 size);
+-extern 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,
++extern char* fb_get_buffer_offset(struct fb_info *info, struct fb_pixmap *buf, u32 size);
++extern void move_buf_unaligned(struct fb_info *info, struct fb_pixmap *buf, u8 *dst, u8 *src,
++				u32 d_pitch, u32 height, u32 mask, u32 shift_high, u32 shift_low,
+ 				u32 mod, u32 idx);
+-extern void move_buf_aligned(struct fb_info *info, u8 *dst, u8 *src, u32 d_pitch,
+-			     u32 s_pitch, u32 height);
++extern void move_buf_aligned(struct fb_info *info, struct fb_pixmap *buf, u8 *dst, u8 *src, 
++			     u32 d_pitch, u32 s_pitch, u32 height);
+ extern struct fb_info *registered_fb[FB_MAX];
+ extern int num_registered_fb;
+ 
+--- linux-2.6.0-test1/include/linux/fs.h	2003-07-13 21:44:35.000000000 -0700
++++ 25/include/linux/fs.h	2003-07-19 17:07:03.000000000 -0700
+@@ -323,6 +323,7 @@ struct address_space {
+ 	struct list_head	i_mmap;		/* list of private mappings */
+ 	struct list_head	i_mmap_shared;	/* list of shared mappings */
+ 	struct semaphore	i_shared_sem;	/* protect both above lists */
++	atomic_t		truncate_count;	/* Cover race condition with truncate */
+ 	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 */
+@@ -729,6 +730,11 @@ extern int vfs_rename(struct inode *, st
+ #define DT_SOCK		12
+ #define DT_WHT		14
+ 
++#define OSYNC_METADATA	(1<<0)
++#define OSYNC_DATA	(1<<1)
++#define OSYNC_INODE	(1<<2)
++int generic_osync_inode(struct inode *, int);
++
+ /*
+  * This is the "filldir" function type, used by readdir() to let
+  * the kernel specify what kind of dirent layout it wants to have.
+--- linux-2.6.0-test1/include/linux/hfs_sysdep.h	2003-06-14 12:17:58.000000000 -0700
++++ 25/include/linux/hfs_sysdep.h	2003-07-19 17:03:51.000000000 -0700
+@@ -28,9 +28,6 @@
+ 
+ extern struct timezone sys_tz;
+ 
+-#undef offsetof
+-#define offsetof(TYPE, MEMB) ((size_t) &((TYPE *)0)->MEMB)
+-
+ /* Typedefs for integer types by size and signedness */
+ typedef __u8            hfs_u8;
+ typedef __u16           hfs_u16;
+--- linux-2.6.0-test1/include/linux/ide.h	2003-07-02 14:53:18.000000000 -0700
++++ 25/include/linux/ide.h	2003-07-19 17:03:51.000000000 -0700
+@@ -1288,12 +1288,6 @@ extern ide_devices_t   *idescsi;
+ #endif
+ extern int noautodma;
+ 
+-/*
+- * We need blk.h, but we replace its end_request by our own version.
+- */
+-#define IDE_DRIVER		/* Toggle some magic bits in blk.h */
+-#include <linux/blk.h>
+-
+ extern int ide_end_request (ide_drive_t *drive, int uptodate, int nrsecs);
+ 
+ /*
+--- linux-2.6.0-test1/include/linux/init_task.h	2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/init_task.h	2003-07-19 17:06:43.000000000 -0700
+@@ -70,7 +70,7 @@
+ 	.prio		= MAX_PRIO-20,					\
+ 	.static_prio	= MAX_PRIO-20,					\
+ 	.policy		= SCHED_NORMAL,					\
+-	.cpus_allowed	= ~0UL,						\
++	.cpus_allowed	= CPU_MASK_ALL,					\
+ 	.mm		= NULL,						\
+ 	.active_mm	= &init_mm,					\
+ 	.run_list	= LIST_HEAD_INIT(tsk.run_list),			\
+@@ -108,6 +108,7 @@
+ 	.proc_lock	= SPIN_LOCK_UNLOCKED,				\
+ 	.switch_lock	= SPIN_LOCK_UNLOCKED,				\
+ 	.journal_info	= NULL,						\
++	.io_wait	= NULL,						\
+ }
+ 
+ 
+--- linux-2.6.0-test1/include/linux/irq.h	2003-06-14 12:18:08.000000000 -0700
++++ 25/include/linux/irq.h	2003-07-19 17:04:07.000000000 -0700
+@@ -15,6 +15,7 @@
+ 
+ #include <linux/cache.h>
+ #include <linux/spinlock.h>
++#include <linux/cpumask.h>
+ 
+ #include <asm/irq.h>
+ #include <asm/ptrace.h>
+@@ -44,7 +45,7 @@ struct hw_interrupt_type {
+ 	void (*disable)(unsigned int irq);
+ 	void (*ack)(unsigned int irq);
+ 	void (*end)(unsigned int irq);
+-	void (*set_affinity)(unsigned int irq, unsigned long mask);
++	void (*set_affinity)(unsigned int irq, cpumask_t dest);
+ };
+ 
+ typedef struct hw_interrupt_type  hw_irq_controller;
+--- linux-2.6.0-test1/include/linux/kdev_t.h	2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/kdev_t.h	2003-07-19 17:06:39.000000000 -0700
+@@ -1,82 +1,14 @@
+ #ifndef _LINUX_KDEV_T_H
+ #define _LINUX_KDEV_T_H
+ #ifdef __KERNEL__
+-/*
+-As a preparation for the introduction of larger device numbers,
+-we introduce a type kdev_t to hold them. No information about
+-this type is known outside of this include file.
+-
+-Objects of type kdev_t designate a device. Outside of the kernel
+-the corresponding things are objects of type dev_t - usually an
+-integral type with the device major and minor in the high and low
+-bits, respectively. Conversion is done by
+-
+-extern kdev_t to_kdev_t(int);
+-
+-It is up to the various file systems to decide how objects of type
+-dev_t are stored on disk.
+-The only other point of contact between kernel and outside world
+-are the system calls stat and mknod, new versions of which will
+-eventually have to be used in libc.
+-
+-[Unfortunately, the floppy control ioctls fail to hide the internal
+-kernel structures, and the fd_device field of a struct floppy_drive_struct
+-is user-visible. So, it remains a dev_t for the moment, with some ugly
+-conversions in floppy.c.]
+-
+-Inside the kernel, we aim for a kdev_t type that is a pointer
+-to a structure with information about the device (like major,
+-minor, size, blocksize, sectorsize, name, read-only flag,
+-struct file_operations etc.).
+-
+-However, for the time being we let kdev_t be almost the same as dev_t:
+-
+-typedef struct { unsigned short major, minor; } kdev_t;
+-
+-Admissible operations on an object of type kdev_t:
+-- passing it along
+-- comparing it for equality with another such object
+-- storing it in inode->i_rdev or tty->device
+-- using its bit pattern as argument in a hash function
+-- finding its major and minor
+-- complaining about it
+-
+-An object of type kdev_t is created only by the function MKDEV(),
+-with the single exception of the constant 0 (no device).
+-
+-Right now the other information mentioned above is usually found
+-in static arrays indexed by major or major,minor.
+-
+-An obstacle to immediately using
+-    typedef struct { ... (* lots of information *) } *kdev_t
+-is the case of mknod used to create a block device that the
+-kernel doesn't know about at present (but first learns about
+-when some module is inserted).
+-
+-aeb - 950811
+-*/
+ 
++#include <linux/types.h>       /* for dev_t */
+ 
+-/*
+- * NOTE NOTE NOTE!
+- *
+- * The kernel-internal "kdev_t" will eventually have
+- * 20 bits for minor numbers, and 12 bits for majors.
+- *
+- * HOWEVER, the external representation is still 8+8
+- * bits, and there is no way to generate the extended
+- * "kdev_t" format yet. Which is just as well, since
+- * we still use "minor" as an index into various
+- * static arrays, and they are sized for a 8-bit index.
+- */
+ typedef struct {
+-	unsigned short value;
++	unsigned long long value;
+ } kdev_t;
+ 
+-#define KDEV_MINOR_BITS		8
+-#define KDEV_MAJOR_BITS		8
+-
+-#define __mkdev(major,minor)	(((major) << KDEV_MINOR_BITS) + (minor))
++#define __mkdev(major, minor)	(((unsigned long long)(major) << 32) + (minor))
+ 
+ #define mk_kdev(major, minor)	((kdev_t) { __mkdev(major,minor) } )
+ 
+@@ -85,12 +17,12 @@ typedef struct {
+  * internal equality comparisons and for things
+  * like NFS filehandle conversion.
+  */
+-static inline unsigned int kdev_val(kdev_t dev)
++static inline unsigned long long kdev_val(kdev_t dev)
+ {
+ 	return dev.value;
+ }
+ 
+-static inline kdev_t val_to_kdev(unsigned int val)
++static inline kdev_t val_to_kdev(unsigned long long val)
+ {
+ 	kdev_t dev;
+ 	dev.value = val;
+@@ -107,37 +39,85 @@ static inline int kdev_same(kdev_t dev1,
+ 
+ #define kdev_none(d1)	(!kdev_val(d1))
+ 
+-/* Mask off the high bits for now.. */
+-#define minor(dev)	((dev).value & 0xff)
+-#define major(dev)	(((dev).value >> KDEV_MINOR_BITS) & 0xff)
++#define minor(dev)	(unsigned int)((dev).value & 0xffffffff)
++#define major(dev)	(unsigned int)((dev).value >> 32)
+ 
+ /* These are for user-level "dev_t" */
+-#define MINORBITS	8
+-#define MINORMASK	((1U << MINORBITS) - 1)
++/* Going back and forth between dev and (ma,mi) is one-to-one
++   provided ma is nonzero or ma is zero and mi is 8-bit only.
++   Never use major 0 together with a minor larger than 255. */
++#if 0
++/* readable versions */
++static inline unsigned int
++MAJOR(dev_t dev) {
++        return (dev & ~0xffffffffULL) ? (dev >> 32) :
++                (dev & ~0xffff) ? (dev >> 16) : (dev >> 8);
++}
+ 
+-#define MAJOR(dev)	((unsigned int) ((dev) >> MINORBITS))
+-#define MINOR(dev)	((unsigned int) ((dev) & MINORMASK))
+-#define MKDEV(ma,mi)	(((ma) << MINORBITS) | (mi))
++static inline unsigned int
++MINOR(dev_t dev) {
++        return (dev & ~0xffffffffULL) ? (dev & 0xffffffff) :
++                (dev & ~0xffff) ? (dev & 0xffff) : (dev & 0xff);
++}
++
++static inline dev_t
++MKDEV(unsigned int major, unsigned int minor) {
++        unsigned int both = (major | minor);
++        return ((both & ~0xffff) ? (((dev_t) major) << 32) :
++                (both & ~0xff) ? (((dev_t) major) << 16) :
++                (((dev_t) major) << 8) ) | minor;
++}
++#else
++/* ugly macro versions */
++#define MAJOR(dev) ((unsigned int)({ dev_t __dev = dev; \
++   (__dev & ~0xffffffffULL) ? (__dev >> 32) : \
++   (__dev & ~0xffff) ? (__dev >> 16) : (__dev >> 8); }))
++#define MINOR(dev) ((unsigned int)({ dev_t __dev = dev; \
++   (__dev & ~0xffffffffULL) ? (__dev & 0xffffffff) : \
++   (__dev & ~0xffff) ? (__dev & 0xffff) : (__dev & 0xff); }))
++#define constant_MKDEV(ma, mi) \
++   ((((ma)|(mi)) & ~0xffff) ? ((ma) << 32) | (mi) : \
++    (((ma)|(mi)) & ~0xff) ? ((ma) << 16) | (mi) : ((ma) << 8) | (mi))
++#define MKDEV(major, minor) ({ \
++   unsigned int __ma = major, __mi = minor, __both = (__ma | __mi); \
++   ((sizeof(dev_t) > 4 && (__both & ~0xffff)) ? (((dev_t) __ma) << 32) : \
++    (__both & ~0xff) ? (((dev_t) __ma) << 16) : (((dev_t) __ma) << 8) \
++   ) | __mi; })
++#endif
+ 
+ /*
+  * Conversion functions
+  */
+ 
+-static inline int kdev_t_to_nr(kdev_t dev)
++static inline dev_t kdev_t_to_nr(kdev_t dev)
+ {
+-	return MKDEV(major(dev), minor(dev));
++	unsigned int ma = major(dev);
++	unsigned int mi = minor(dev);
++	return MKDEV(ma, mi);
+ }
+ 
+-static inline kdev_t to_kdev_t(int dev)
++static inline kdev_t to_kdev_t(dev_t dev)
+ {
+-	return mk_kdev(MAJOR(dev),MINOR(dev));
++	unsigned int ma = MAJOR(dev);
++	unsigned int mi = MINOR(dev);
++	return mk_kdev(ma, mi);
+ }
+ 
++#define print_dev_t(buffer, dev)					\
++	sprintf((buffer), "%u:%u\n", MAJOR(dev), MINOR(dev))
++
++#define format_dev_t(buffer, dev)					\
++	({								\
++		sprintf(buffer, "%u:%u", MAJOR(dev), MINOR(dev));	\
++		buffer;							\
++	})
++
+ #else /* __KERNEL__ */
+ 
+ /*
+ Some programs want their definitions of MAJOR and MINOR and MKDEV
+ from the kernel sources. These must be the externally visible ones.
++Of course such programs should be updated.
+ */
+ #define MAJOR(dev)	((dev)>>8)
+ #define MINOR(dev)	((dev) & 0xff)
+--- linux-2.6.0-test1/include/linux/kernel_stat.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/kernel_stat.h	2003-07-19 17:03:51.000000000 -0700
+@@ -23,9 +23,7 @@ struct cpu_usage_stat {
+ 
+ struct kernel_stat {
+ 	struct cpu_usage_stat	cpustat;
+-#if !defined(CONFIG_ARCH_S390)
+ 	unsigned int irqs[NR_IRQS];
+-#endif
+ };
+ 
+ DECLARE_PER_CPU(struct kernel_stat, kstat);
+@@ -36,7 +34,6 @@ DECLARE_PER_CPU(struct kernel_stat, ksta
+ 
+ extern unsigned long nr_context_switches(void);
+ 
+-#if !defined(CONFIG_ARCH_S390)
+ /*
+  * Number of interrupts per specific IRQ source, since bootup
+  */
+@@ -50,6 +47,5 @@ static inline int kstat_irqs(int irq)
+ 
+ 	return sum;
+ }
+-#endif
+ 
+ #endif /* _LINUX_KERNEL_STAT_H */
+--- linux-2.6.0-test1/include/linux/linux_logo.h	2003-06-14 12:18:05.000000000 -0700
++++ 25/include/linux/linux_logo.h	2003-07-19 17:04:55.000000000 -0700
+@@ -16,13 +16,11 @@
+ 
+ #include <linux/init.h>
+ 
+-
+ #define LINUX_LOGO_MONO		1	/* monochrome black/white */
+ #define LINUX_LOGO_VGA16	2	/* 16 colors VGA text palette */
+ #define LINUX_LOGO_CLUT224	3	/* 224 colors */
+ #define LINUX_LOGO_GRAY256	4	/* 256 levels grayscale */
+ 
+-
+ struct linux_logo {
+ 	int type;			/* one of LINUX_LOGO_* */
+ 	unsigned int width;
+@@ -32,6 +30,6 @@ struct linux_logo {
+ 	const unsigned char *data;
+ };
+ 
+-extern const struct linux_logo *fb_find_logo(int depth);
++extern const struct linux_logo *find_logo(int depth);
+ 
+ #endif /* _LINUX_LINUX_LOGO_H */
+--- linux-2.6.0-test1/include/linux/list.h	2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/list.h	2003-07-19 17:06:35.000000000 -0700
+@@ -142,8 +142,11 @@ static inline void __list_del(struct lis
+  * Note: list_empty on entry does not return true after this, the entry is
+  * in an undefined state.
+  */
++#include <linux/kernel.h>	/* BUG_ON */
+ static inline void list_del(struct list_head *entry)
+ {
++	BUG_ON(entry->prev->next != entry);
++	BUG_ON(entry->next->prev != entry);
+ 	__list_del(entry->prev, entry->next);
+ 	entry->next = LIST_POISON1;
+ 	entry->prev = LIST_POISON2;
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/linux/lockmeter.h	2003-07-19 17:06:40.000000000 -0700
+@@ -0,0 +1,320 @@
++/*
++ *  Copyright (C) 1999-2002 Silicon Graphics, Inc.
++ *
++ *  Written by John Hawkes (hawkes@sgi.com)
++ *  Based on klstat.h by Jack Steiner (steiner@sgi.com)
++ *
++ *  Modified by Ray Bryant (raybry@us.ibm.com) Feb-Apr 2000
++ *  Changes Copyright (C) 2000 IBM, Inc.
++ *  Added save of index in spinlock_t to improve efficiency
++ *  of "hold" time reporting for spinlocks
++ *  Added support for hold time statistics for read and write
++ *  locks.
++ *  Moved machine dependent code to include/asm/lockmeter.h.
++ *
++ */
++
++#ifndef _LINUX_LOCKMETER_H
++#define _LINUX_LOCKMETER_H
++
++
++/*---------------------------------------------------
++ *	architecture-independent lockmeter.h
++ *-------------------------------------------------*/
++
++/*
++ * raybry -- version 2: added efficient hold time statistics
++ *           requires lstat recompile, so flagged as new version
++ * raybry -- version 3: added global reader lock data
++ * hawkes -- version 4: removed some unnecessary fields to simplify mips64 port
++ */
++#define LSTAT_VERSION	5
++
++int	lstat_update(void*, void*, int);
++int	lstat_update_time(void*, void*, int, uint32_t);
++
++/*
++ * Currently, the mips64 and sparc64 kernels talk to a 32-bit lockstat, so we
++ * need to force compatibility in the inter-communication data structure.
++ */
++
++#if defined(CONFIG_MIPS32_COMPAT)
++#define TIME_T		uint32_t
++#elif defined(CONFIG_SPARC32_COMPAT)
++#define TIME_T		uint64_t
++#else
++#define TIME_T		time_t
++#endif
++
++#if defined(__KERNEL__) || (!defined(CONFIG_MIPS32_COMPAT) && !defined(CONFIG_SPARC32_COMPAT)) || (_MIPS_SZLONG==32)
++#define POINTER		void *
++#else
++#define	POINTER		int64_t
++#endif
++
++/*
++ * Values for the "action" parameter passed to lstat_update.
++ *	ZZZ - do we want a try-success status here???
++ */
++#define LSTAT_ACT_NO_WAIT	0
++#define LSTAT_ACT_SPIN		1
++#define LSTAT_ACT_REJECT	2
++#define LSTAT_ACT_WW_SPIN       3
++#define LSTAT_ACT_SLEPT		4 /* UNUSED */
++
++#define LSTAT_ACT_MAX_VALUES	4 /* NOTE: Increase to 5 if use ACT_SLEPT */
++
++/*
++ * Special values for the low 2 bits of an RA passed to
++ * lstat_update.
++ */
++/* we use these values to figure out what kind of lock data */
++/* is stored in the statistics table entry at index ....... */
++#define LSTAT_RA_SPIN           0  /* spin lock data */
++#define LSTAT_RA_READ           1  /* read lock statistics */
++#define LSTAT_RA_SEMA		2  /* RESERVED */
++#define LSTAT_RA_WRITE          3  /* write lock statistics*/
++
++#define LSTAT_RA(n)	\
++	((void*)( ((unsigned long)__builtin_return_address(0) & ~3) | n) )
++
++/*
++ * Constants used for lock addresses in the lstat_directory
++ * to indicate special values of the lock address.
++ */
++#define	LSTAT_MULTI_LOCK_ADDRESS	NULL
++
++/*
++ * Maximum size of the lockstats tables. Increase this value
++ * if its not big enough. (Nothing bad happens if its not
++ * big enough although some locks will not be monitored.)
++ * We record overflows of this quantity in lstat_control.dir_overflows
++ *
++ * Note:  The max value here must fit into the field set
++ * and obtained by the macro's PUT_INDEX() and GET_INDEX().
++ * This value depends on how many bits are available in the
++ * lock word in the particular machine implementation we are on.
++ */
++#define LSTAT_MAX_STAT_INDEX		2000
++
++/*
++ * Size and mask for the hash table into the directory.
++ */
++#define LSTAT_HASH_TABLE_SIZE		4096		/* must be 2**N */
++#define LSTAT_HASH_TABLE_MASK		(LSTAT_HASH_TABLE_SIZE-1)
++
++#define DIRHASH(ra)      ((unsigned long)(ra)>>2 & LSTAT_HASH_TABLE_MASK)
++
++/*
++ *	This defines an entry in the lockstat directory. It contains
++ *	information about a lock being monitored.
++ *	A directory entry only contains the lock identification -
++ *	counts on usage of the lock are kept elsewhere in a per-cpu
++ *	data structure to minimize cache line pinging.
++ */
++typedef struct {
++	POINTER	caller_ra;		  /* RA of code that set lock */
++	POINTER	lock_ptr;		  /* lock address */
++	ushort	next_stat_index;  /* Used to link multiple locks that have the same hash table value */
++} lstat_directory_entry_t;
++
++/*
++ *	A multi-dimensioned array used to contain counts for lock accesses.
++ *	The array is 3-dimensional:
++ *		- CPU number. Keep from thrashing cache lines between CPUs
++ *		- Directory entry index. Identifies the lock
++ *		- Action. Indicates what kind of contention occurred on an
++ *		  access to the lock.
++ *
++ *	The index of an entry in the directory is the same as the 2nd index
++ *	of the entry in the counts array.
++ */
++/*
++ *  This table contains data for spin_locks, write locks, and read locks
++ *  Not all data is used for all cases.  In particular, the hold time
++ *  information is not stored here for read locks since that is a global
++ *  (e. g. cannot be separated out by return address) quantity.
++ *  See the lstat_read_lock_counts_t structure for the global read lock
++ *  hold time.
++ */
++typedef struct {
++	uint64_t    cum_wait_ticks;	/* sum of wait times               */
++	                                /* for write locks, sum of time a  */
++					/* writer is waiting for a reader  */
++	int64_t	    cum_hold_ticks;	/* cumulative sum of holds         */
++	                                /* not used for read mode locks    */
++					/* must be signed. ............... */
++	uint32_t    max_wait_ticks;	/* max waiting time                */
++	uint32_t    max_hold_ticks;	/* max holding time                */
++	uint64_t    cum_wait_ww_ticks;  /* sum times writer waits on writer*/
++	uint32_t    max_wait_ww_ticks;  /* max wait time writer vs writer  */
++	                                /* prev 2 only used for write locks*/
++	uint32_t    acquire_time;       /* time lock acquired this CPU     */
++	uint32_t    count[LSTAT_ACT_MAX_VALUES];
++} lstat_lock_counts_t;
++
++typedef lstat_lock_counts_t	lstat_cpu_counts_t[LSTAT_MAX_STAT_INDEX];
++
++/*
++ * User request to:
++ *	- turn statistic collection on/off, or to reset
++ */
++#define LSTAT_OFF	 0
++#define LSTAT_ON	 1
++#define LSTAT_RESET      2
++#define LSTAT_RELEASE    3
++
++#define LSTAT_MAX_READ_LOCK_INDEX 1000
++typedef struct {
++	POINTER	    lock_ptr;            /* address of lock for output stats */
++	uint32_t    read_lock_count;
++	int64_t     cum_hold_ticks;       /* sum of read lock hold times over */
++	                                  /* all callers. ....................*/
++	uint32_t    write_index;          /* last write lock hash table index */
++	uint32_t    busy_periods;         /* count of busy periods ended this */
++	uint64_t    start_busy;           /* time this busy period started. ..*/
++	uint64_t    busy_ticks;           /* sum of busy periods this lock. ..*/
++	uint64_t    max_busy;             /* longest busy period for this lock*/
++	uint32_t    max_readers;          /* maximum number of readers ...... */
++#ifdef USER_MODE_TESTING
++	rwlock_t    entry_lock;           /* lock for this read lock entry... */
++	                                  /* avoid having more than one rdr at*/
++	                                  /* needed for user space testing... */
++	                                  /* not needed for kernel 'cause it  */
++					  /* is non-preemptive. ............. */
++#endif
++} lstat_read_lock_counts_t;
++typedef lstat_read_lock_counts_t	lstat_read_lock_cpu_counts_t[LSTAT_MAX_READ_LOCK_INDEX];
++
++#if defined(__KERNEL__) || defined(USER_MODE_TESTING)
++
++#ifndef USER_MODE_TESTING
++#include <asm/lockmeter.h>
++#else
++#include "asm_newlockmeter.h"
++#endif
++
++/*
++ * Size and mask for the hash table into the directory.
++ */
++#define LSTAT_HASH_TABLE_SIZE		4096		/* must be 2**N */
++#define LSTAT_HASH_TABLE_MASK		(LSTAT_HASH_TABLE_SIZE-1)
++
++#define DIRHASH(ra)      ((unsigned long)(ra)>>2 & LSTAT_HASH_TABLE_MASK)
++
++/*
++ * This version eliminates the per processor lock stack.  What we do is to
++ * store the index of the lock hash structure in unused bits in the lock
++ * itself.  Then on unlock we can find the statistics record without doing
++ * any additional hash or lock stack lookup.  This works for spin_locks.
++ * Hold time reporting is now basically as cheap as wait time reporting
++ * so we ignore the difference between LSTAT_ON_HOLD and LSTAT_ON_WAIT
++ * as in version 1.1.* of lockmeter.
++ *
++ * For rw_locks, we store the index of a global reader stats structure in
++ * the lock and the writer index is stored in the latter structure.
++ * For read mode locks we hash at the time of the lock to find an entry
++ * in the directory for reader wait time and the like.
++ * At unlock time for read mode locks, we update just the global structure
++ * so we don't need to know the reader directory index value at unlock time.
++ *
++ */
++
++/*
++ * Protocol to change lstat_control.state
++ *   This is complicated because we don't want the cum_hold_time for
++ * a rw_lock to be decremented in _read_lock_ without making sure it
++ * is incremented in _read_lock_ and vice versa.  So here is the
++ * way we change the state of lstat_control.state:
++ * I.  To Turn Statistics On
++ *     After allocating storage, set lstat_control.state non-zero.
++ * This works because we don't start updating statistics for in use
++ * locks until the reader lock count goes to zero.
++ * II. To Turn Statistics Off:
++ * (0)  Disable interrupts on this CPU
++ * (1)  Seize the lstat_control.directory_lock
++ * (2)  Obtain the current value of lstat_control.next_free_read_lock_index
++ * (3)  Store a zero in lstat_control.state.
++ * (4)  Release the lstat_control.directory_lock
++ * (5)  For each lock in the read lock list up to the saved value
++ *      (well, -1) of the next_free_read_lock_index, do the following:
++ *      (a)  Check validity of the stored lock address
++ *           by making sure that the word at the saved addr
++ *           has an index that matches this entry.  If not
++ *           valid, then skip this entry.
++ *      (b)  If there is a write lock already set on this lock,
++ *           skip to (d) below.
++ *      (c)  Set a non-metered write lock on the lock
++ *      (d)  set the cached INDEX in the lock to zero
++ *      (e)  Release the non-metered write lock.
++ * (6)  Re-enable interrupts
++ *
++ * These rules ensure that a read lock will not have its statistics
++ * partially updated even though the global lock recording state has
++ * changed.  See put_lockmeter_info() for implementation.
++ *
++ * The reason for (b) is that there may be write locks set on the
++ * syscall path to put_lockmeter_info() from user space.  If we do
++ * not do this check, then we can deadlock.  A similar problem would
++ * occur if the lock was read locked by the current CPU.  At the
++ * moment this does not appear to happen.
++ */
++
++/*
++ * Main control structure for lockstat. Used to turn statistics on/off
++ * and to maintain directory info.
++ */
++typedef struct {
++	int				state;
++	spinlock_t		control_lock;		/* used to serialize turning statistics on/off   */
++	spinlock_t		directory_lock;		/* for serialize adding entries to directory     */
++	volatile int	next_free_dir_index;/* next free entry in the directory */
++	/* FIXME not all of these fields are used / needed .............. */
++                /* the following fields represent data since     */
++		/* first "lstat on" or most recent "lstat reset" */
++	TIME_T      first_started_time;     /* time when measurement first enabled */
++	TIME_T      started_time;           /* time when measurement last started  */
++	TIME_T      ending_time;            /* time when measurement last disabled */
++	uint64_t    started_cycles64;       /* cycles when measurement last started          */
++	uint64_t    ending_cycles64;        /* cycles when measurement last disabled         */
++	uint64_t    enabled_cycles64;       /* total cycles with measurement enabled         */
++	int         intervals;              /* number of measurement intervals recorded      */
++	                                    /* i. e. number of times did lstat on;lstat off  */
++	lstat_directory_entry_t	*dir;		/* directory */
++	int         dir_overflow;           /* count of times ran out of space in directory  */
++	int         rwlock_overflow;        /* count of times we couldn't allocate a rw block*/
++	ushort		*hashtab;		 	    /* hash table for quick dir scans */
++	lstat_cpu_counts_t	*counts[NR_CPUS];	 /* Array of pointers to per-cpu stats */
++    int         next_free_read_lock_index;   /* next rwlock reader (global) stats block  */
++    lstat_read_lock_cpu_counts_t *read_lock_counts[NR_CPUS]; /* per cpu read lock stats  */
++} lstat_control_t;
++
++#endif	/* defined(__KERNEL__) || defined(USER_MODE_TESTING) */
++
++typedef struct {
++	short		lstat_version;		/* version of the data */
++	short		state;			/* the current state is returned */
++	int		maxcpus;		/* Number of cpus present */
++	int		next_free_dir_index;	/* index of the next free directory entry */
++	TIME_T          first_started_time;	/* when measurement enabled for first time */
++	TIME_T          started_time;		/* time in secs since 1969 when stats last turned on  */
++	TIME_T		ending_time;		/* time in secs since 1969 when stats last turned off */
++	uint32_t	cycleval;		/* cycles per second */
++#ifdef notyet
++	void		*kernel_magic_addr;	/* address of kernel_magic */
++	void		*kernel_end_addr;	/* contents of kernel magic (points to "end") */
++#endif
++	int              next_free_read_lock_index; /* index of next (global) read lock stats struct */
++	uint64_t         started_cycles64;	/* cycles when measurement last started        */
++	uint64_t         ending_cycles64;	/* cycles when stats last turned off           */
++	uint64_t         enabled_cycles64;	/* total cycles with measurement enabled       */
++	int              intervals;		/* number of measurement intervals recorded      */
++						/* i.e. number of times we did lstat on;lstat off*/
++	int              dir_overflow;		/* number of times we wanted more space in directory */
++	int              rwlock_overflow;	/* # of times we wanted more space in read_locks_count */
++	struct new_utsname   uts;		/* info about machine where stats are measured */
++						/* -T option of lockstat allows data to be     */
++						/* moved to another machine. ................. */
++} lstat_user_request_t;
++
++#endif /* _LINUX_LOCKMETER_H */
+--- linux-2.6.0-test1/include/linux/loop.h	2003-07-13 21:44:35.000000000 -0700
++++ 25/include/linux/loop.h	2003-07-19 17:03:51.000000000 -0700
+@@ -15,7 +15,7 @@
+ 
+ #ifdef __KERNEL__
+ #include <linux/bio.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/spinlock.h>
+ 
+ /* Possible states of device */
+--- linux-2.6.0-test1/include/linux/mm.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/mm.h	2003-07-19 17:07:16.000000000 -0700
+@@ -421,10 +421,14 @@ int copy_page_range(struct mm_struct *ds
+ int zeromap_page_range(struct vm_area_struct *vma, unsigned long from,
+ 			unsigned long size, pgprot_t prot);
+ 
++extern void invalidate_mmap_range(struct address_space *mapping,
++				  loff_t const holebegin,
++				  loff_t const holelen);
+ extern int vmtruncate(struct inode * inode, loff_t offset);
+ extern pmd_t *FASTCALL(__pmd_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address));
++pmd_t *FASTCALL(__pmd_alloc_kernel(struct mm_struct *mm, pgd_t *pmd, unsigned long address));
+ extern pte_t *FASTCALL(pte_alloc_kernel(struct mm_struct *mm, pmd_t *pmd, unsigned long address));
+-extern pte_t *FASTCALL(pte_alloc_map(struct mm_struct *mm, pmd_t *pmd, unsigned long address));
++pte_t *FASTCALL(pte_alloc_map(struct mm_struct *mm, pgd_t *pgd, pmd_t **pmd, unsigned long address));
+ extern int install_page(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, struct page *page, pgprot_t prot);
+ extern int handle_mm_fault(struct mm_struct *mm,struct vm_area_struct *vma, unsigned long address, int write_access);
+ extern int make_pages_present(unsigned long addr, unsigned long end);
+@@ -485,12 +489,11 @@ static inline int set_page_dirty(struct 
+  * inlining and the symmetry break with pte_alloc_map() that does all
+  * of this out-of-line.
+  */
+-static inline pmd_t *pmd_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
+-{
+-	if (pgd_none(*pgd))
+-		return __pmd_alloc(mm, pgd, address);
+-	return pmd_offset(pgd, address);
+-}
++#define pmd_alloc_map(mm, pgd, addr)				\
++	(pgd_none(*(pgd))? __pmd_alloc(mm,pgd,addr): pmd_offset_map(pgd,addr))
++
++#define pmd_alloc_kernel(mm, pgd, addr)				\
++	(pgd_none(*(pgd))? __pmd_alloc_kernel(mm,pgd,addr): pmd_offset_kernel(pgd,addr))
+ 
+ extern void free_area_init(unsigned long * zones_size);
+ extern void free_area_init_node(int nid, pg_data_t *pgdat, struct page *pmap,
+--- linux-2.6.0-test1/include/linux/module.h	2003-07-02 14:53:18.000000000 -0700
++++ 25/include/linux/module.h	2003-07-19 17:03:51.000000000 -0700
+@@ -16,6 +16,7 @@
+ #include <linux/kmod.h>
+ #include <linux/elf.h>
+ #include <linux/stringify.h>
++#include <asm/local.h>
+ 
+ #include <asm/module.h>
+ 
+@@ -171,7 +172,7 @@ void *__symbol_get_gpl(const char *symbo
+ 
+ struct module_ref
+ {
+-	atomic_t count;
++	local_t count;
+ } ____cacheline_aligned;
+ 
+ enum module_state
+@@ -276,19 +277,17 @@ struct module *module_get_kallsym(unsign
+ 				  char *type,
+ 				  char namebuf[128]);
+ int is_exported(const char *name, const struct module *mod);
+-#ifdef CONFIG_MODULE_UNLOAD
+ 
++extern void __module_put_and_exit(struct module *mod, long code)
++	__attribute__((noreturn));
++#define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code);
++
++#ifdef CONFIG_MODULE_UNLOAD
+ unsigned int module_refcount(struct module *mod);
+ void __symbol_put(const char *symbol);
+ #define symbol_put(x) __symbol_put(MODULE_SYMBOL_PREFIX #x)
+ void symbol_put_addr(void *addr);
+ 
+-/* We only need protection against local interrupts. */
+-#ifndef __HAVE_ARCH_LOCAL_INC
+-#define local_inc(x) atomic_inc(x)
+-#define local_dec(x) atomic_dec(x)
+-#endif
+-
+ /* Sometimes we know we already have a refcount, and it's easier not
+    to handle the error case (which only happens with rmmod --wait). */
+ static inline void __module_get(struct module *module)
+@@ -445,6 +444,8 @@ static inline int unregister_module_noti
+ 	return 0;
+ }
+ 
++#define module_put_and_exit(code) do_exit(code)
++
+ #endif /* CONFIG_MODULES */
+ 
+ #ifdef MODULE
+--- linux-2.6.0-test1/include/linux/namespace.h	2003-06-14 12:18:22.000000000 -0700
++++ 25/include/linux/namespace.h	2003-07-19 17:03:51.000000000 -0700
+@@ -2,7 +2,7 @@
+ #define _NAMESPACE_H_
+ #ifdef __KERNEL__
+ 
+-#include <linux/dcache.h>
++#include <linux/mount.h>
+ #include <linux/sched.h>
+ 
+ struct namespace {
+@@ -14,17 +14,12 @@ struct namespace {
+ 
+ extern void umount_tree(struct vfsmount *);
+ extern int copy_namespace(int, struct task_struct *);
++void __put_namespace(struct namespace *namespace);
+ 
+ static inline void put_namespace(struct namespace *namespace)
+ {
+-	if (atomic_dec_and_test(&namespace->count)) {
+-		down_write(&namespace->sem);
+-		spin_lock(&dcache_lock);
+-		umount_tree(namespace->root);
+-		spin_unlock(&dcache_lock);
+-		up_write(&namespace->sem);
+-		kfree(namespace);
+-	}
++	if (atomic_dec_and_test(&namespace->count))
++		__put_namespace(namespace);
+ }
+ 
+ static inline void exit_namespace(struct task_struct *p)
+--- linux-2.6.0-test1/include/linux/netdevice.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/netdevice.h	2003-07-19 17:03:51.000000000 -0700
+@@ -29,6 +29,7 @@
+ #include <linux/if_ether.h>
+ #include <linux/if_packet.h>
+ #include <linux/device.h>
++#include <linux/percpu.h>
+ 
+ #include <asm/atomic.h>
+ #include <asm/cache.h>
+@@ -544,10 +545,9 @@ struct softnet_data
+ 	struct sk_buff		*completion_queue;
+ 
+ 	struct net_device	backlog_dev;	/* Sorry. 8) */
+-} ____cacheline_aligned;
+-
++};
+ 
+-extern struct softnet_data softnet_data[NR_CPUS];
++DECLARE_PER_CPU(struct softnet_data,softnet_data);
+ 
+ #define HAVE_NETIF_QUEUE
+ 
+@@ -555,12 +555,12 @@ static inline void __netif_schedule(stru
+ {
+ 	if (!test_and_set_bit(__LINK_STATE_SCHED, &dev->state)) {
+ 		unsigned long flags;
+-		int cpu;
++		struct softnet_data *sd;
+ 
+ 		local_irq_save(flags);
+-		cpu = smp_processor_id();
+-		dev->next_sched = softnet_data[cpu].output_queue;
+-		softnet_data[cpu].output_queue = dev;
++		sd = &__get_cpu_var(softnet_data);
++		dev->next_sched = sd->output_queue;
++		sd->output_queue = dev;
+ 		raise_softirq_irqoff(NET_TX_SOFTIRQ);
+ 		local_irq_restore(flags);
+ 	}
+@@ -605,13 +605,13 @@ static inline int netif_running(const st
+ static inline void dev_kfree_skb_irq(struct sk_buff *skb)
+ {
+ 	if (atomic_dec_and_test(&skb->users)) {
+-		int cpu;
++		struct softnet_data *sd;
+ 		unsigned long flags;
+ 
+ 		local_irq_save(flags);
+-		cpu = smp_processor_id();
+-		skb->next = softnet_data[cpu].completion_queue;
+-		softnet_data[cpu].completion_queue = skb;
++		sd = &__get_cpu_var(softnet_data);
++		skb->next = sd->completion_queue;
++		sd->completion_queue = skb;
+ 		raise_softirq_irqoff(NET_TX_SOFTIRQ);
+ 		local_irq_restore(flags);
+ 	}
+@@ -769,12 +769,10 @@ static inline int netif_rx_schedule_prep
+ static inline void __netif_rx_schedule(struct net_device *dev)
+ {
+ 	unsigned long flags;
+-	int cpu;
+ 
+ 	local_irq_save(flags);
+-	cpu = smp_processor_id();
+ 	dev_hold(dev);
+-	list_add_tail(&dev->poll_list, &softnet_data[cpu].poll_list);
++	list_add_tail(&dev->poll_list, &__get_cpu_var(softnet_data).poll_list);
+ 	if (dev->quota < 0)
+ 		dev->quota += dev->weight;
+ 	else
+@@ -798,13 +796,11 @@ static inline int netif_rx_reschedule(st
+ {
+ 	if (netif_rx_schedule_prep(dev)) {
+ 		unsigned long flags;
+-		int cpu;
+ 
+ 		dev->quota += undo;
+ 
+ 		local_irq_save(flags);
+-		cpu = smp_processor_id();
+-		list_add_tail(&dev->poll_list, &softnet_data[cpu].poll_list);
++		list_add_tail(&dev->poll_list, &__get_cpu_var(softnet_data).poll_list);
+ 		__raise_softirq_irqoff(NET_RX_SOFTIRQ);
+ 		local_irq_restore(flags);
+ 		return 1;
+--- linux-2.6.0-test1/include/linux/nfs_fs.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/nfs_fs.h	2003-07-19 17:07:05.000000000 -0700
+@@ -172,6 +172,7 @@ struct nfs_inode {
+ #define NFS_INO_ADVISE_RDPLUS   0x0002          /* advise readdirplus */
+ #define NFS_INO_REVALIDATING	0x0004		/* revalidating attrs */
+ #define NFS_INO_FLUSH		0x0008		/* inode is due for flushing */
++#define NFS_INO_FAKE_ROOT	0x0080		/* root inode placeholder */
+ 
+ static inline struct nfs_inode *NFS_I(struct inode *inode)
+ {
+@@ -207,6 +208,7 @@ do { \
+ #define NFS_FLAGS(inode)		(NFS_I(inode)->flags)
+ #define NFS_REVALIDATING(inode)		(NFS_FLAGS(inode) & NFS_INO_REVALIDATING)
+ #define NFS_STALE(inode)		(NFS_FLAGS(inode) & NFS_INO_STALE)
++#define NFS_FAKE_ROOT(inode)		(NFS_FLAGS(inode) & NFS_INO_FAKE_ROOT)
+ 
+ #define NFS_FILEID(inode)		(NFS_I(inode)->fileid)
+ 
+@@ -269,7 +271,7 @@ nfs_file_cred(struct file *file)
+ /*
+  * linux/fs/nfs/direct.c
+  */
+-extern int nfs_direct_IO(int, struct file *, const struct iovec *, loff_t,
++extern int nfs_direct_IO(int, struct kiocb *, const struct iovec *, loff_t,
+ 			unsigned long);
+ 
+ /*
+--- linux-2.6.0-test1/include/linux/nfs_fs_sb.h	2003-06-14 12:18:52.000000000 -0700
++++ 25/include/linux/nfs_fs_sb.h	2003-07-19 17:03:51.000000000 -0700
+@@ -9,6 +9,7 @@
+  */
+ struct nfs_server {
+ 	struct rpc_clnt *	client;		/* RPC client handle */
++	struct rpc_clnt *	client_sys;	/* 2nd handle for FSINFO */
+ 	struct nfs_rpc_ops *	rpc_ops;	/* NFS protocol vector */
+ 	struct backing_dev_info	backing_dev_info;
+ 	int			flags;		/* various flags */
+--- linux-2.6.0-test1/include/linux/nfs_mount.h	2003-06-14 12:17:56.000000000 -0700
++++ 25/include/linux/nfs_mount.h	2003-07-19 17:03:51.000000000 -0700
+@@ -20,7 +20,7 @@
+  * mount-to-kernel version compatibility.  Some of these aren't used yet
+  * but here they are anyway.
+  */
+-#define NFS_MOUNT_VERSION	4
++#define NFS_MOUNT_VERSION	5
+ 
+ struct nfs_mount_data {
+ 	int		version;		/* 1 */
+@@ -40,7 +40,7 @@ struct nfs_mount_data {
+ 	int		namlen;			/* 2 */
+ 	unsigned int	bsize;			/* 3 */
+ 	struct nfs3_fh	root;			/* 4 */
+-	int		pseudoflavor;		/* 4 */
++	int		pseudoflavor;		/* 5 */
+ };
+ 
+ /* bits in the flags field */
+@@ -57,7 +57,7 @@ struct nfs_mount_data {
+ #define NFS_MOUNT_NONLM		0x0200	/* 3 */
+ #define NFS_MOUNT_BROKEN_SUID	0x0400	/* 4 */
+ #define NFS_MOUNT_STRICTLOCK	0x1000	/* reserved for NFSv4 */
+-#define NFS_MOUNT_SECFLAVOUR	0x2000	/* reserved */
++#define NFS_MOUNT_SECFLAVOUR	0x2000	/* 5 */
+ #define NFS_MOUNT_FLAGMASK	0xFFFF
+ 
+ #endif
+--- linux-2.6.0-test1/include/linux/nfs_page.h	2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/nfs_page.h	2003-07-19 17:07:05.000000000 -0700
+@@ -46,7 +46,6 @@ extern	struct nfs_page *nfs_create_reque
+ 					    unsigned int, unsigned int);
+ extern	void nfs_clear_request(struct nfs_page *req);
+ extern	void nfs_release_request(struct nfs_page *req);
+-extern	void nfs_release_list(struct list_head *list);
+ 
+ 
+ extern	void nfs_list_add_request(struct nfs_page *, struct list_head *);
+@@ -56,7 +55,6 @@ extern	int nfs_scan_list(struct list_hea
+ extern	int nfs_coalesce_requests(struct list_head *, struct list_head *,
+ 				  unsigned int);
+ extern  int nfs_wait_on_request(struct nfs_page *);
+-extern	int nfs_wait_for_reads(struct list_head *);
+ 
+ extern	spinlock_t nfs_wreq_lock;
+ 
+--- linux-2.6.0-test1/include/linux/nfs_xdr.h	2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/nfs_xdr.h	2003-07-19 17:07:07.000000000 -0700
+@@ -591,6 +591,7 @@ struct nfs4_compound {
+ #endif /* CONFIG_NFS_V4 */
+ 
+ struct nfs_read_data {
++	int			flags;
+ 	struct rpc_task		task;
+ 	struct inode		*inode;
+ 	struct rpc_cred		*cred;
+@@ -605,6 +606,7 @@ struct nfs_read_data {
+ };
+ 
+ struct nfs_write_data {
++	int			flags;
+ 	struct rpc_task		task;
+ 	struct inode		*inode;
+ 	struct rpc_cred		*cred;
+@@ -634,16 +636,9 @@ struct nfs_rpc_ops {
+ 			    struct nfs_fh *, struct nfs_fattr *);
+ 	int	(*access)  (struct inode *, struct rpc_cred *, int);
+ 	int	(*readlink)(struct inode *, struct page *);
+-	int	(*read)    (struct inode *, struct rpc_cred *,
+-			    struct nfs_fattr *,
+-			    int, unsigned int, unsigned int,
+-			    struct page *, int *eofp);
+-	int	(*write)   (struct inode *, struct rpc_cred *,
+-			    struct nfs_fattr *,
+-			    int, unsigned int, unsigned int,
+-			    struct page *, struct nfs_writeverf *verfp);
+-	int	(*commit)  (struct inode *, struct nfs_fattr *,
+-			    unsigned long, unsigned int);
++	int	(*read)    (struct nfs_read_data *);
++	int	(*write)   (struct nfs_write_data *);
++	int	(*commit)  (struct nfs_write_data *);
+ 	int	(*create)  (struct inode *, struct qstr *, struct iattr *,
+ 			    int, struct nfs_fh *, struct nfs_fattr *);
+ 	int	(*remove)  (struct inode *, struct qstr *);
+--- linux-2.6.0-test1/include/linux/node.h	2003-06-14 12:18:34.000000000 -0700
++++ 25/include/linux/node.h	2003-07-19 17:04:07.000000000 -0700
+@@ -20,9 +20,10 @@
+ #define _LINUX_NODE_H_
+ 
+ #include <linux/sysdev.h>
++#include <linux/cpumask.h>
+ 
+ struct node {
+-	unsigned long cpumap;	/* Bitmap of CPUs on the Node */
++	cpumask_t cpumap;	/* Bitmap of CPUs on the Node */
+ 	struct sys_device	sysdev;
+ };
+ 
+--- linux-2.6.0-test1/include/linux/pagemap.h	2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/pagemap.h	2003-07-19 17:07:00.000000000 -0700
+@@ -130,17 +130,27 @@ static inline void ___add_to_page_cache(
+ extern void FASTCALL(__lock_page(struct page *page));
+ extern void FASTCALL(unlock_page(struct page *page));
+ 
+-static inline void lock_page(struct page *page)
++
++extern int FASTCALL(__lock_page_wq(struct page *page, wait_queue_t *wait));
++static inline int lock_page_wq(struct page *page, wait_queue_t *wait)
+ {
+ 	if (TestSetPageLocked(page))
+-		__lock_page(page);
++		return __lock_page_wq(page, wait);
++	else
++		return 0;
++}
++
++static inline void lock_page(struct page *page)
++{
++	lock_page_wq(page, NULL);
+ }
+ 	
+ /*
+  * This is exported only for wait_on_page_locked/wait_on_page_writeback.
+  * Never use this directly!
+  */
+-extern void FASTCALL(wait_on_page_bit(struct page *page, int bit_nr));
++extern int FASTCALL(wait_on_page_bit_wq(struct page *page, int bit_nr,
++	wait_queue_t *wait));
+ 
+ /* 
+  * Wait for a page to be unlocked.
+@@ -149,19 +159,33 @@ extern void FASTCALL(wait_on_page_bit(st
+  * ie with increased "page->count" so that the page won't
+  * go away during the wait..
+  */
+-static inline void wait_on_page_locked(struct page *page)
++static inline int wait_on_page_locked_wq(struct page *page, wait_queue_t *wait)
+ {
+ 	if (PageLocked(page))
+-		wait_on_page_bit(page, PG_locked);
++		return wait_on_page_bit_wq(page, PG_locked, wait);
++	return 0;
++}
++
++static inline void wait_on_page_locked(struct page *page)
++{
++	wait_on_page_locked_wq(page, NULL);
+ }
+ 
+ /* 
+  * Wait for a page to complete writeback
+  */
+-static inline void wait_on_page_writeback(struct page *page)
++
++static inline int wait_on_page_writeback_wq(struct page *page,
++						wait_queue_t *wait)
+ {
+ 	if (PageWriteback(page))
+-		wait_on_page_bit(page, PG_writeback);
++		return wait_on_page_bit_wq(page, PG_writeback, wait);
++	return 0;
++}
++
++static inline void wait_on_page_writeback(struct page *page)
++{
++	wait_on_page_writeback_wq(page, NULL);
+ }
+ 
+ extern void end_page_writeback(struct page *page);
+--- linux-2.6.0-test1/include/linux/pci.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/pci.h	2003-07-19 17:03:51.000000000 -0700
+@@ -715,7 +715,6 @@ static inline int pci_dac_set_dma_mask(s
+ static inline int pci_assign_resource(struct pci_dev *dev, int i) { return -EBUSY;}
+ static inline int pci_register_driver(struct pci_driver *drv) { return 0;}
+ static inline void pci_unregister_driver(struct pci_driver *drv) { }
+-static inline int scsi_to_pci_dma_dir(unsigned char scsi_dir) { return scsi_dir; }
+ static inline int pci_find_capability (struct pci_dev *dev, int cap) {return 0; }
+ static inline const struct pci_device_id *pci_match_device(const struct pci_device_id *ids, const struct pci_dev *dev) { return NULL; }
+ 
+--- linux-2.6.0-test1/include/linux/raid/md_k.h	2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/raid/md_k.h	2003-07-19 17:06:39.000000000 -0700
+@@ -64,11 +64,7 @@ static inline int level_to_pers (int lev
+ typedef struct mddev_s mddev_t;
+ typedef struct mdk_rdev_s mdk_rdev_t;
+ 
+-#if (MINORBITS != 8)
+-#error MD does not handle bigger kdev yet
+-#endif
+-
+-#define MAX_MD_DEVS  (1<<MINORBITS)	/* Max number of md dev */
++#define MAX_MD_DEVS  256	/* Max number of md dev */
+ 
+ /*
+  * options passed in raidrun:
+--- linux-2.6.0-test1/include/linux/rcupdate.h	2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/rcupdate.h	2003-07-19 17:04:56.000000000 -0700
+@@ -40,6 +40,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/threads.h>
+ #include <linux/percpu.h>
++#include <linux/cpumask.h>
+ 
+ /**
+  * struct rcu_head - callback structure for use with RCU
+@@ -67,7 +68,7 @@ struct rcu_ctrlblk {
+ 	spinlock_t	mutex;		/* Guard this struct                  */
+ 	long		curbatch;	/* Current batch number.	      */
+ 	long		maxbatch;	/* Max requested batch number.        */
+-	unsigned long	rcu_cpu_mask; 	/* CPUs that need to switch in order  */
++	cpumask_t	rcu_cpu_mask; 	/* CPUs that need to switch in order  */
+ 					/* for current batch to proceed.      */
+ };
+ 
+@@ -95,6 +96,8 @@ struct rcu_data {
+         long  	       	batch;           /* Batch # for current RCU batch */
+         struct list_head  nxtlist;
+         struct list_head  curlist;
++ 	long		nr_rcureqs;
++ 	long		nr_rcupdates;
+ };
+ 
+ DECLARE_PER_CPU(struct rcu_data, rcu_data);
+@@ -105,6 +108,8 @@ extern struct rcu_ctrlblk rcu_ctrlblk;
+ #define RCU_batch(cpu) 		(per_cpu(rcu_data, (cpu)).batch)
+ #define RCU_nxtlist(cpu) 	(per_cpu(rcu_data, (cpu)).nxtlist)
+ #define RCU_curlist(cpu) 	(per_cpu(rcu_data, (cpu)).curlist)
++#define RCU_nr_rcureqs(cpu) 	(per_cpu(rcu_data, (cpu)).nr_rcureqs)
++#define RCU_nr_rcupdates(cpu) 	(per_cpu(rcu_data, (cpu)).nr_rcupdates)
+ 
+ #define RCU_QSCTR_INVALID	0
+ 
+@@ -114,7 +119,7 @@ static inline int rcu_pending(int cpu) 
+ 	     rcu_batch_before(RCU_batch(cpu), rcu_ctrlblk.curbatch)) ||
+ 	    (list_empty(&RCU_curlist(cpu)) &&
+ 			 !list_empty(&RCU_nxtlist(cpu))) ||
+-	    test_bit(cpu, &rcu_ctrlblk.rcu_cpu_mask))
++	    cpu_isset(cpu, rcu_ctrlblk.rcu_cpu_mask))
+ 		return 1;
+ 	else
+ 		return 0;
+--- linux-2.6.0-test1/include/linux/root_dev.h	2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/root_dev.h	2003-07-19 17:06:39.000000000 -0700
+@@ -1,18 +1,16 @@
+ #ifndef _ROOT_DEV_H_
+ #define _ROOT_DEV_H_
+ 
+-enum {
+-	Root_NFS = MKDEV(UNNAMED_MAJOR, 255),
+-	Root_RAM0 = MKDEV(RAMDISK_MAJOR, 0),
+-	Root_RAM1 = MKDEV(RAMDISK_MAJOR, 1),
+-	Root_FD0 = MKDEV(FLOPPY_MAJOR, 0),
+-	Root_HDA1 = MKDEV(IDE0_MAJOR, 1),
+-	Root_HDA2 = MKDEV(IDE0_MAJOR, 2),
+-	Root_SDA1 = MKDEV(SCSI_DISK0_MAJOR, 1),
+-	Root_SDA2 = MKDEV(SCSI_DISK0_MAJOR, 2),
+-	Root_HDC1 = MKDEV(IDE1_MAJOR, 1),
+-	Root_SR0 = MKDEV(SCSI_CDROM_MAJOR, 0),
+-};
++#define	Root_NFS	MKDEV(UNNAMED_MAJOR, 255)
++#define	Root_RAM0	MKDEV(RAMDISK_MAJOR, 0)
++#define	Root_RAM1	MKDEV(RAMDISK_MAJOR, 1)
++#define	Root_FD0	MKDEV(FLOPPY_MAJOR, 0)
++#define	Root_HDA1	MKDEV(IDE0_MAJOR, 1)
++#define	Root_HDA2	MKDEV(IDE0_MAJOR, 2)
++#define	Root_SDA1	MKDEV(SCSI_DISK0_MAJOR, 1)
++#define	Root_SDA2	MKDEV(SCSI_DISK0_MAJOR, 2)
++#define	Root_HDC1	MKDEV(IDE1_MAJOR, 1)
++#define	Root_SR0	MKDEV(SCSI_CDROM_MAJOR, 0)
+ 
+ extern dev_t ROOT_DEV;
+ 
+--- linux-2.6.0-test1/include/linux/sched.h	2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/sched.h	2003-07-19 17:07:10.000000000 -0700
+@@ -12,6 +12,7 @@
+ #include <linux/jiffies.h>
+ #include <linux/rbtree.h>
+ #include <linux/thread_info.h>
++#include <linux/cpumask.h>
+ 
+ #include <asm/system.h>
+ #include <asm/semaphore.h>
+@@ -52,6 +53,7 @@ struct exec_domain;
+ #define CLONE_DETACHED		0x00400000	/* parent wants no child-exit signal */
+ #define CLONE_UNTRACED		0x00800000	/* set if the tracing process can't force CLONE_PTRACE on this clone */
+ #define CLONE_CHILD_SETTID	0x01000000	/* set the TID in the child */
++#define CLONE_STOPPED		0x02000000	/* Start in stopped state */
+ 
+ /*
+  * List of flags we want to share for kernel threads,
+@@ -149,6 +151,7 @@ extern void init_idle(task_t *idle, int 
+ 
+ extern void show_state(void);
+ extern void show_regs(struct pt_regs *);
++extern void show_trace_task(task_t *tsk);
+ 
+ /*
+  * TASK is a pointer to the task whose backtrace we want to see (or NULL for current
+@@ -202,7 +205,7 @@ struct mm_struct {
+ 	unsigned long arg_start, arg_end, env_start, env_end;
+ 	unsigned long rss, total_vm, locked_vm;
+ 	unsigned long def_flags;
+-	unsigned long cpu_vm_mask;
++	cpumask_t cpu_vm_mask;
+ 	unsigned long swap_address;
+ 
+ 	unsigned dumpable:1;
+@@ -338,10 +341,11 @@ struct task_struct {
+ 	prio_array_t *array;
+ 
+ 	unsigned long sleep_avg;
++	unsigned long avg_start;
+ 	unsigned long last_run;
+ 
+ 	unsigned long policy;
+-	unsigned long cpus_allowed;
++	cpumask_t cpus_allowed;
+ 	unsigned int time_slice, first_time_slice;
+ 
+ 	struct list_head tasks;
+@@ -456,12 +460,24 @@ struct task_struct {
+ 
+ 	unsigned long ptrace_message;
+ 	siginfo_t *last_siginfo; /* For ptrace use.  */
++	long debug;
++/*
++ * current io wait handle: wait queue entry to use for io waits
++ * If this thread is processing aio, this points at the waitqueue
++ * inside the currently handled kiocb. It may be NULL (i.e. default
++ * to a stack based synchronous wait) if its doing sync IO.
++ */
++	wait_queue_t *io_wait;
+ };
+ 
+ extern void __put_task_struct(struct task_struct *tsk);
+ #define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while(0)
+-#define put_task_struct(tsk) \
+-do { if (atomic_dec_and_test(&(tsk)->usage)) __put_task_struct(tsk); } while(0)
++#define put_task_struct(tsk)					\
++	do {							\
++		BUG_ON((tsk)->debug == 0x6b6b6b6b);		\
++		if (atomic_dec_and_test(&(tsk)->usage))		\
++			__put_task_struct(tsk);			\
++	} while (0)
+ 
+ /*
+  * Per process flags
+@@ -488,9 +504,9 @@ do { if (atomic_dec_and_test(&(tsk)->usa
+ #define PF_SYNCWRITE	0x00200000	/* I am doing a sync write */
+ 
+ #ifdef CONFIG_SMP
+-extern int set_cpus_allowed(task_t *p, unsigned long new_mask);
++extern int set_cpus_allowed(task_t *p, cpumask_t new_mask);
+ #else
+-static inline int set_cpus_allowed(task_t *p, unsigned long new_mask)
++static inline int set_cpus_allowed(task_t *p, cpumask_t new_mask)
+ {
+ 	return 0;
+ }
+@@ -636,6 +652,8 @@ static inline void mmdrop(struct mm_stru
+ 
+ /* mmput gets rid of the mappings and all user-space */
+ extern void mmput(struct mm_struct *);
++/* Grab a reference to the mm if its not already going away */
++extern struct mm_struct *mmgrab(struct mm_struct *);
+ /* Remove the current tasks stale references to the old mm_struct */
+ extern void mm_release(struct task_struct *, struct mm_struct *);
+ 
+@@ -743,7 +761,7 @@ static inline struct mm_struct * get_tas
+ 	task_lock(task);
+ 	mm = task->mm;
+ 	if (mm)
+-		atomic_inc(&mm->mm_users);
++		mm = mmgrab(mm);
+ 	task_unlock(task);
+ 
+ 	return mm;
+--- linux-2.6.0-test1/include/linux/serial_core.h	2003-06-14 12:17:58.000000000 -0700
++++ 25/include/linux/serial_core.h	2003-07-19 17:03:51.000000000 -0700
+@@ -57,7 +57,7 @@
+ #define PORT_SUNSAB	39
+ 
+ /* NEC v850.  */
+-#define PORT_NB85E_UART	40
++#define PORT_V850E_UART	40
+ 
+ /* NEC PC-9800 */
+ #define PORT_8251_PC98	41
+--- linux-2.6.0-test1/include/linux/smp.h	2003-06-14 12:18:22.000000000 -0700
++++ 25/include/linux/smp.h	2003-07-19 17:04:07.000000000 -0700
+@@ -102,9 +102,6 @@ void smp_prepare_boot_cpu(void);
+ #define smp_call_function(func,info,retry,wait)	({ 0; })
+ #define on_each_cpu(func,info,retry,wait)	({ func(info); 0; })
+ static inline void smp_send_reschedule(int cpu) { }
+-#define cpu_online_map				1
+-#define cpu_online(cpu)				({ BUG_ON((cpu) != 0); 1; })
+-#define num_online_cpus()			1
+ #define num_booting_cpus()			1
+ #define cpu_possible(cpu)			({ BUG_ON((cpu) != 0); 1; })
+ #define smp_prepare_boot_cpu()			do {} while (0)
+--- linux-2.6.0-test1/include/linux/spinlock.h	2003-07-02 14:53:18.000000000 -0700
++++ 25/include/linux/spinlock.h	2003-07-19 17:06:40.000000000 -0700
+@@ -184,6 +184,17 @@ typedef struct {
+ 
+ #endif /* !SMP */
+ 
++#ifdef CONFIG_LOCKMETER
++extern void _metered_spin_lock   (spinlock_t *lock);
++extern void _metered_spin_unlock (spinlock_t *lock);
++extern int  _metered_spin_trylock(spinlock_t *lock);
++extern void _metered_read_lock    (rwlock_t *lock);
++extern void _metered_read_unlock  (rwlock_t *lock);
++extern void _metered_write_lock   (rwlock_t *lock);
++extern void _metered_write_unlock (rwlock_t *lock);
++extern int  _metered_write_trylock(rwlock_t *lock);
++#endif
++
+ /*
+  * Define the various spin_lock and rw_lock methods.  Note we define these
+  * regardless of whether CONFIG_SMP or CONFIG_PREEMPT are set. The various
+@@ -389,6 +400,141 @@ do { \
+ 				_raw_spin_trylock(lock) ? 1 : \
+ 				({preempt_enable(); local_bh_enable(); 0;});})
+ 
++#ifdef CONFIG_LOCKMETER
++#undef spin_lock
++#undef spin_trylock
++#undef spin_unlock
++#undef spin_lock_irqsave
++#undef spin_lock_irq
++#undef spin_lock_bh
++#undef read_lock
++#undef read_unlock
++#undef write_lock
++#undef write_unlock
++#undef write_trylock
++#undef spin_unlock_bh
++#undef read_lock_irqsave
++#undef read_lock_irq
++#undef read_lock_bh
++#undef read_unlock_bh
++#undef write_lock_irqsave
++#undef write_lock_irq
++#undef write_lock_bh
++#undef write_unlock_bh
++
++#define spin_lock(lock) \
++do { \
++	preempt_disable(); \
++	_metered_spin_lock(lock); \
++} while(0)
++
++#define spin_trylock(lock)     ({preempt_disable(); _metered_spin_trylock(lock) ? \
++				1 : ({preempt_enable(); 0;});})
++#define spin_unlock(lock) \
++do { \
++	_metered_spin_unlock(lock); \
++	preempt_enable(); \
++} while (0)
++
++#define spin_lock_irqsave(lock, flags) \
++do { \
++	local_irq_save(flags); \
++	preempt_disable(); \
++	_metered_spin_lock(lock); \
++} while (0)
++
++#define spin_lock_irq(lock) \
++do { \
++	local_irq_disable(); \
++	preempt_disable(); \
++	_metered_spin_lock(lock); \
++} while (0)
++
++#define spin_lock_bh(lock) \
++do { \
++	local_bh_disable(); \
++	preempt_disable(); \
++	_metered_spin_lock(lock); \
++} while (0)
++
++#define spin_unlock_bh(lock) \
++do { \
++	_metered_spin_unlock(lock); \
++	preempt_enable(); \
++	local_bh_enable(); \
++} while (0)
++
++
++#define read_lock(lock)                ({preempt_disable(); _metered_read_lock(lock);})
++#define read_unlock(lock)      ({_metered_read_unlock(lock); preempt_enable();})
++#define write_lock(lock)       ({preempt_disable(); _metered_write_lock(lock);})
++#define write_unlock(lock)     ({_metered_write_unlock(lock); preempt_enable();})
++#define write_trylock(lock)    ({preempt_disable();_metered_write_trylock(lock) ? \
++				1 : ({preempt_enable(); 0;});})
++#define spin_unlock_no_resched(lock) \
++do { \
++	_metered_spin_unlock(lock); \
++	preempt_enable_no_resched(); \
++} while (0)
++
++#define read_lock_irqsave(lock, flags) \
++do { \
++	local_irq_save(flags); \
++	preempt_disable(); \
++	_metered_read_lock(lock); \
++} while (0)
++
++#define read_lock_irq(lock) \
++do { \
++	local_irq_disable(); \
++	preempt_disable(); \
++	_metered_read_lock(lock); \
++} while (0)
++
++#define read_lock_bh(lock) \
++do { \
++	local_bh_disable(); \
++	preempt_disable(); \
++	_metered_read_lock(lock); \
++} while (0)
++
++#define read_unlock_bh(lock) \
++do { \
++	_metered_read_unlock(lock); \
++	preempt_enable(); \
++	local_bh_enable(); \
++} while (0)
++
++#define write_lock_irqsave(lock, flags) \
++do { \
++	local_irq_save(flags); \
++	preempt_disable(); \
++	_metered_write_lock(lock); \
++} while (0)
++
++#define write_lock_irq(lock) \
++do { \
++	local_irq_disable(); \
++	preempt_disable(); \
++	_metered_write_lock(lock); \
++} while (0)
++
++#define write_lock_bh(lock) \
++do { \
++	local_bh_disable(); \
++	preempt_disable(); \
++	_metered_write_lock(lock); \
++} while (0)
++
++#define write_unlock_bh(lock) \
++do { \
++	_metered_write_unlock(lock); \
++	preempt_enable(); \
++	local_bh_enable(); \
++} while (0)
++
++#endif /* !CONFIG_LOCKMETER */
++
+ /* "lock on reference count zero" */
+ #ifndef ATOMIC_DEC_AND_LOCK
+ #include <asm/atomic.h>
+--- linux-2.6.0-test1/include/linux/times.h	2003-06-14 12:17:57.000000000 -0700
++++ 25/include/linux/times.h	2003-07-19 17:03:51.000000000 -0700
+@@ -11,6 +11,26 @@
+ # define jiffies_to_clock_t(x) ((clock_t) jiffies_64_to_clock_t((u64) x))
+ #endif
+ 
++static inline unsigned long clock_t_to_jiffies(unsigned long x)
++{
++#if (HZ % USER_HZ)==0
++	if (x >= ~0UL / (HZ / USER_HZ))
++		return ~0UL;
++	return x * (HZ / USER_HZ);
++#else
++	u64 jif;
++
++	/* Don't worry about loss of precision here .. */
++	if (x >= ~0UL / HZ * USER_HZ)
++		return ~0UL;
++
++	/* .. but do try to contain it here */
++	jif = x * (u64) HZ;
++	do_div(jif, USER_HZ);
++	return jif;
++#endif
++}
++
+ static inline u64 jiffies_64_to_clock_t(u64 x)
+ {
+ #if (HZ % USER_HZ)==0
+--- linux-2.6.0-test1/include/linux/topology.h	2003-06-14 12:18:25.000000000 -0700
++++ 25/include/linux/topology.h	2003-07-19 17:04:07.000000000 -0700
+@@ -27,6 +27,7 @@
+ #ifndef _LINUX_TOPOLOGY_H
+ #define _LINUX_TOPOLOGY_H
+ 
++#include <linux/cpumask.h>
+ #include <linux/bitops.h>
+ #include <linux/mmzone.h>
+ #include <linux/smp.h>
+@@ -34,7 +35,12 @@
+ #include <asm/topology.h>
+ 
+ #ifndef nr_cpus_node
+-#define nr_cpus_node(node)	(hweight_long(node_to_cpumask(node)))
++#define nr_cpus_node(node)							\
++	({									\
++		cpumask_t __tmp__;						\
++		__tmp__ = node_to_cpumask(node);				\
++		cpus_weight(__tmp__);						\
++	})
+ #endif
+ 
+ static inline int __next_node_with_cpus(int node)
+--- linux-2.6.0-test1/include/linux/tty.h	2003-06-14 12:18:21.000000000 -0700
++++ 25/include/linux/tty.h	2003-07-19 17:03:51.000000000 -0700
+@@ -57,40 +57,40 @@
+  */
+ 
+ struct screen_info {
+-	unsigned char  orig_x;			/* 0x00 */
+-	unsigned char  orig_y;			/* 0x01 */
+-	unsigned short dontuse1;		/* 0x02 -- EXT_MEM_K sits here */
+-	unsigned short orig_video_page;		/* 0x04 */
+-	unsigned char  orig_video_mode;		/* 0x06 */
+-	unsigned char  orig_video_cols;		/* 0x07 */
+-	unsigned short unused2;			/* 0x08 */
+-	unsigned short orig_video_ega_bx;	/* 0x0a */
+-	unsigned short unused3;			/* 0x0c */
+-	unsigned char  orig_video_lines;	/* 0x0e */
+-	unsigned char  orig_video_isVGA;	/* 0x0f */
+-	unsigned short orig_video_points;	/* 0x10 */
++	u8  orig_x;		/* 0x00 */
++	u8  orig_y;		/* 0x01 */
++	u16 dontuse1;		/* 0x02 -- EXT_MEM_K sits here */
++	u16 orig_video_page;	/* 0x04 */
++	u8  orig_video_mode;	/* 0x06 */
++	u8  orig_video_cols;	/* 0x07 */
++	u16 unused2;		/* 0x08 */
++	u16 orig_video_ega_bx;	/* 0x0a */
++	u16 unused3;		/* 0x0c */
++	u8  orig_video_lines;	/* 0x0e */
++	u8  orig_video_isVGA;	/* 0x0f */
++	u16 orig_video_points;	/* 0x10 */
+ 
+ 	/* VESA graphic mode -- linear frame buffer */
+-	unsigned short lfb_width;		/* 0x12 */
+-	unsigned short lfb_height;		/* 0x14 */
+-	unsigned short lfb_depth;		/* 0x16 */
+-	unsigned long  lfb_base;		/* 0x18 */
+-	unsigned long  lfb_size;		/* 0x1c */
+-	unsigned short dontuse2, dontuse3;	/* 0x20 -- CL_MAGIC and CL_OFFSET here */
+-	unsigned short lfb_linelength;		/* 0x24 */
+-	unsigned char  red_size;		/* 0x26 */
+-	unsigned char  red_pos;			/* 0x27 */
+-	unsigned char  green_size;		/* 0x28 */
+-	unsigned char  green_pos;		/* 0x29 */
+-	unsigned char  blue_size;		/* 0x2a */
+-	unsigned char  blue_pos;		/* 0x2b */
+-	unsigned char  rsvd_size;		/* 0x2c */
+-	unsigned char  rsvd_pos;		/* 0x2d */
+-	unsigned short vesapm_seg;		/* 0x2e */
+-	unsigned short vesapm_off;		/* 0x30 */
+-	unsigned short pages;			/* 0x32 */
+-	unsigned short vesa_attributes;		/* 0x34 */
+-						/* 0x36 -- 0x3f reserved for future expansion */
++	u16 lfb_width;		/* 0x12 */
++	u16 lfb_height;		/* 0x14 */
++	u16 lfb_depth;		/* 0x16 */
++	u32 lfb_base;		/* 0x18 */
++	u32 lfb_size;		/* 0x1c */
++	u16 dontuse2, dontuse3;	/* 0x20 -- CL_MAGIC and CL_OFFSET here */
++	u16 lfb_linelength;	/* 0x24 */
++	u8  red_size;		/* 0x26 */
++	u8  red_pos;		/* 0x27 */
++	u8  green_size;		/* 0x28 */
++	u8  green_pos;		/* 0x29 */
++	u8  blue_size;		/* 0x2a */
++	u8  blue_pos;		/* 0x2b */
++	u8  rsvd_size;		/* 0x2c */
++	u8  rsvd_pos;		/* 0x2d */
++	u16 vesapm_seg;		/* 0x2e */
++	u16 vesapm_off;		/* 0x30 */
++	u16 pages;		/* 0x32 */
++	u16 vesa_attributes;	/* 0x34 */
++				/* 0x36 -- 0x3f reserved for future expansion */
+ };
+ 
+ extern struct screen_info screen_info;
+--- linux-2.6.0-test1/include/linux/usb.h	2003-07-02 14:53:18.000000000 -0700
++++ 25/include/linux/usb.h	2003-07-19 17:03:51.000000000 -0700
+@@ -80,7 +80,8 @@ struct usb_host_interface {
+  * @act_altsetting: index of current altsetting.  this number is always
+  *	less than num_altsetting.  after the device is configured, each
+  *	interface uses its default setting of zero.
+- * @max_altsetting:
++ * @max_altsetting: the max number of altsettings for this interface.
++ * @driver: the USB driver that is bound to this interface.
+  * @minor: the minor number assigned to this interface, if this
+  *	interface is bound to a driver that uses the USB major number.
+  *	If this interface does not use the USB major, this field should
+@@ -409,7 +410,11 @@ static inline int usb_make_path (struct 
+  *	do (or don't) show up otherwise in the filesystem.
+  * @id_table: USB drivers use ID table to support hotplugging.
+  *	Export this with MODULE_DEVICE_TABLE(usb,...).  This must be set
+- *	or your driver's probe function will never get called. 
++ *	or your driver's probe function will never get called.
++ * @driver: the driver model core driver structure.
++ * @serialize: a semaphore used to serialize access to this driver.  Used
++ * 	in the probe and disconnect functions.  Only the USB core should use
++ * 	this lock.
+  *
+  * USB drivers must provide a name, probe() and disconnect() methods,
+  * and an id_table.  Other driver fields are optional.
+@@ -575,6 +580,8 @@ typedef void (*usb_complete_t)(struct ur
+  *	it likes with the URB, including resubmitting or freeing it.
+  * @iso_frame_desc: Used to provide arrays of ISO transfer buffers and to 
+  *	collect the transfer status for each buffer.
++ * @timeout: If set to zero, the urb will never timeout.  Otherwise this is
++ *	the time in jiffies that this urb will timeout in.
+  *
+  * This structure identifies USB transfer requests.  URBs must be allocated by
+  * calling usb_alloc_urb() and freed with a call to usb_free_urb().
+@@ -677,10 +684,14 @@ typedef void (*usb_complete_t)(struct ur
+  */
+ struct urb
+ {
++	/* private, usb core and host controller only fields in the urb */
+ 	spinlock_t lock;		/* lock for the URB */
+ 	atomic_t count;			/* reference count of the URB */
+ 	void *hcpriv;			/* private data for host controller */
+ 	struct list_head urb_list;	/* list pointer to all active urbs */
++	int bandwidth;			/* bandwidth for INT/ISO request */
++
++	/* public, documented fields in the urb that can be used by drivers */
+ 	struct usb_device *dev; 	/* (in) pointer to associated device */
+ 	unsigned int pipe;		/* (in) pipe information */
+ 	int status;			/* (return) non-ISO status */
+@@ -689,7 +700,6 @@ struct urb
+ 	dma_addr_t transfer_dma;	/* (in) dma addr for transfer_buffer */
+ 	int transfer_buffer_length;	/* (in) data buffer length */
+ 	int actual_length;		/* (return) actual transfer length */
+-	int bandwidth;			/* bandwidth for INT/ISO request */
+ 	unsigned char *setup_packet;	/* (in) setup packet (control only) */
+ 	dma_addr_t setup_dma;		/* (in) dma addr for setup_packet */
+ 	int start_frame;		/* (modify) start frame (INT/ISO) */
+@@ -891,8 +901,10 @@ struct usb_sg_request {
+ 	int			status;
+ 	size_t			bytes;
+ 
+-	// members not documented above are private to usbcore,
+-	// and are not provided for driver access!
++	/* 
++	 * members below are private to usbcore,
++	 * and are not provided for driver access!
++	 */
+ 	spinlock_t		lock;
+ 
+ 	struct usb_device	*dev;
+--- linux-2.6.0-test1/include/linux/wait.h	2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/wait.h	2003-07-19 17:06:43.000000000 -0700
+@@ -80,6 +80,15 @@ static inline int waitqueue_active(wait_
+ 	return !list_empty(&q->task_list);
+ }
+ 
++/*
++ * Used to distinguish between sync and async io wait context:
++ * sync i/o typically specifies a NULL wait queue entry or a wait
++ * queue entry bound to a task (current task) to wake up.
++ * aio specifies a wait queue entry with an async notification
++ * callback routine, not associated with any task.
++ */
++#define is_sync_wait(wait)	(!(wait) || ((wait)->task))
++
+ extern void FASTCALL(add_wait_queue(wait_queue_head_t *q, wait_queue_t * wait));
+ extern void FASTCALL(add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t * wait));
+ extern void FASTCALL(remove_wait_queue(wait_queue_head_t *q, wait_queue_t * wait));
+--- linux-2.6.0-test1/include/linux/writeback.h	2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/writeback.h	2003-07-19 17:06:57.000000000 -0700
+@@ -84,10 +84,12 @@ int dirty_writeback_centisecs_handler(st
+ 					  void *, size_t *);
+ 
+ void page_writeback_init(void);
+-void balance_dirty_pages(struct address_space *mapping);
+-void balance_dirty_pages_ratelimited(struct address_space *mapping);
++int balance_dirty_pages(struct address_space *mapping);
++int balance_dirty_pages_ratelimited(struct address_space *mapping);
+ int pdflush_operation(void (*fn)(unsigned long), unsigned long arg0);
+ int do_writepages(struct address_space *mapping, struct writeback_control *wbc);
++ssize_t sync_page_range(struct inode *inode, struct address_space *mapping,
++			loff_t pos, size_t count);
+ 
+ /* pdflush.c */
+ extern int nr_pdflush_threads;	/* Global so it can be exported to sysctl
+--- linux-2.6.0-test1/include/media/saa7146.h	2003-07-02 14:53:18.000000000 -0700
++++ 25/include/media/saa7146.h	2003-07-19 17:03:51.000000000 -0700
+@@ -89,8 +89,6 @@ struct saa7146_extension
+ #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;
+@@ -134,6 +132,7 @@ struct saa7146_dev
+ 	/* extension handling */
+ 	struct saa7146_extension	*ext;		/* indicates if handled by extension */
+ 	void				*ext_priv;	/* pointer for extension private use (most likely some private data) */
++	struct saa7146_ext_vv		*ext_vv_data;
+ 
+ 	/* per device video/vbi informations (if available) */
+ 	struct saa7146_vv	*vv_data;
+--- linux-2.6.0-test1/include/media/saa7146_vv.h	2003-07-02 14:53:18.000000000 -0700
++++ 25/include/media/saa7146_vv.h	2003-07-19 17:03:51.000000000 -0700
+@@ -10,12 +10,10 @@
+ #define BUFFER_TIMEOUT     (HZ/2)  /* 0.5 seconds */
+ 
+ #define WRITE_RPS0(x) do { \
+-	static int count = 0;	\
+ 	dev->d_rps0.cpu_addr[ count++ ] = cpu_to_le32(x); \
+ 	} while (0);
+ 
+ #define WRITE_RPS1(x) do { \
+-	static int count = 0;	\
+ 	dev->d_rps1.cpu_addr[ count++ ] = cpu_to_le32(x); \
+ 	} while (0);
+ 
+@@ -41,13 +39,13 @@ struct saa7146_standard
+ 	char          *name;
+ 	v4l2_std_id   id;
+ 
+-	int v_offset;
+-	int v_field;
+-	int v_calc;
++	int v_offset;	/* number of lines of vertical offset before processing */
++	int v_field;	/* number of lines in a field for HPS to process */
++	int v_calc;	/* number of vertical active lines */
+ 	
+-	int h_offset;
+-	int h_pixels;
+-	int h_calc;
++	int h_offset;	/* horizontal offset of processing window */
++	int h_pixels;	/* number of horizontal pixels to process */
++	int h_calc;	/* number of horizontal active pixels */
+ 	
+ 	int v_max_out;
+ 	int h_max_out;
+@@ -122,6 +120,7 @@ struct saa7146_vv
+ 	/* video capture */
+ 	struct saa7146_dmaqueue		video_q;
+ 	struct saa7146_fh		*streaming;
++	enum v4l2_field			last_field;
+ 
+ 	/* common: fixme? shouldn't this be in saa7146_fh?
+ 	   (this leads to a more complicated question: shall the driver
+@@ -166,7 +165,7 @@ struct saa7146_ext_vv
+ 	int (*std_callback)(struct saa7146_dev*, struct saa7146_standard *);
+ 		
+ 	struct saa7146_extension_ioctls *ioctls;
+-	int (*ioctl)(struct saa7146_dev*, unsigned int cmd, void *arg);
++	int (*ioctl)(struct saa7146_fh*, unsigned int cmd, void *arg);
+ };
+ 
+ struct saa7146_use_ops  {
+@@ -188,7 +187,7 @@ int saa7146_buffer_queue(struct saa7146_
+ 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_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv);
+ int saa7146_vv_release(struct saa7146_dev* dev);
+ 
+ 
+@@ -201,6 +200,8 @@ void saa7146_set_gpio(struct saa7146_dev
+ 
+ /* from saa7146_video.c */
+ extern struct saa7146_use_ops saa7146_video_uops;
++int saa7146_start_preview(struct saa7146_fh *fh);
++int saa7146_stop_preview(struct saa7146_fh *fh);
+ 
+ /* from saa7146_vbi.c */
+ extern struct saa7146_use_ops saa7146_vbi_uops;
+@@ -215,35 +216,6 @@ extern struct saa7146_use_ops saa7146_vb
+ #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)
+ 
+--- linux-2.6.0-test1/include/net/ip_vs.h	2003-07-13 21:44:35.000000000 -0700
++++ 25/include/net/ip_vs.h	2003-07-19 17:03:51.000000000 -0700
+@@ -887,7 +887,6 @@ extern int sysctl_ip_vs_cache_bypass;
+ extern int sysctl_ip_vs_expire_nodest_conn;
+ extern int sysctl_ip_vs_sync_threshold[2];
+ extern int sysctl_ip_vs_nat_icmp_send;
+-extern atomic_t ip_vs_dropentry;
+ extern struct ip_vs_stats ip_vs_stats;
+ 
+ extern struct ip_vs_service *
+@@ -902,7 +901,6 @@ extern struct ip_vs_dest *
+ ip_vs_lookup_real_service(__u16 protocol, __u32 daddr, __u16 dport);
+ extern int ip_vs_use_count_inc(void);
+ extern void ip_vs_use_count_dec(void);
+-extern void update_defense_level(void);
+ extern int ip_vs_control_init(void);
+ extern void ip_vs_control_cleanup(void);
+ 
+--- linux-2.6.0-test1/include/pcmcia/ss.h	2003-07-13 21:44:35.000000000 -0700
++++ 25/include/pcmcia/ss.h	2003-07-19 17:03:51.000000000 -0700
+@@ -51,6 +51,7 @@
+ #define SS_3VCARD	0x1000
+ #define SS_XVCARD	0x2000
+ #define SS_PENDING	0x4000
++#define SS_ZVCARD	0x8000
+ 
+ /* InquireSocket capabilities */
+ #define SS_CAP_PAGE_REGS	0x0001
+@@ -209,6 +210,10 @@ struct pcmcia_socket {
+ 	/* socket operations */
+ 	struct pccard_operations *	ops;
+ 
++	/* Zoom video behaviour is so chip specific its not worth adding
++	   this to _ops */
++	void 				(*zoom_video)(struct pcmcia_socket *, int);
++                           
+ 	/* state thread */
+ 	struct semaphore		skt_sem;	/* protects socket h/w state */
+ 
+--- linux-2.6.0-test1/include/scsi/scsi_device.h	2003-07-02 14:53:18.000000000 -0700
++++ 25/include/scsi/scsi_device.h	2003-07-19 17:03:51.000000000 -0700
+@@ -11,8 +11,6 @@ struct scsi_mode_data;
+ 
+ 
+ struct scsi_device {
+-	struct class_device	sdev_classdev;
+-
+ 	struct list_head    siblings;   /* list of all devices on this host */
+ 	struct list_head    same_target_siblings; /* just the devices sharing same target id */
+ 	struct Scsi_Host *host;
+@@ -86,10 +84,11 @@ struct scsi_device {
+ 	unsigned int max_device_blocked; /* what device_blocked counts down from  */
+ #define SCSI_DEFAULT_DEVICE_BLOCKED	3
+ 
+-	struct device sdev_driverfs_dev;
++	struct device		sdev_gendev;
++	struct class_device	sdev_classdev;
+ };
+ #define	to_scsi_device(d)	\
+-	container_of(d, struct scsi_device, sdev_driverfs_dev)
++	container_of(d, struct scsi_device, sdev_gendev)
+ 
+ extern struct scsi_device *scsi_add_device(struct Scsi_Host *,
+ 		uint, uint, uint);
+--- linux-2.6.0-test1/include/scsi/scsi_host.h	2003-06-22 12:04:45.000000000 -0700
++++ 25/include/scsi/scsi_host.h	2003-07-19 17:03:51.000000000 -0700
+@@ -329,12 +329,12 @@ struct scsi_host_template {
+ #define SCSI_DEFAULT_HOST_BLOCKED	7
+ 
+ 	/*
+-	 * Pointer to the sysfs class properties for this host
++	 * Pointer to the sysfs class properties for this host, NULL terminated.
+ 	 */
+ 	struct class_device_attribute **shost_attrs;
+ 
+ 	/*
+-	 * Pointer to the SCSI device properties for this host
++	 * Pointer to the SCSI device properties for this host, NULL terminated.
+ 	 */
+ 	struct device_attribute **sdev_attrs;
+ 
+@@ -442,12 +442,6 @@ struct Scsi_Host {
+ 	 */
+ 	unsigned int max_host_blocked;
+ 
+-	/* 
+-	 * Support for sysfs
+-	 */
+-	struct device host_gendev;
+-	struct class_device class_dev;
+-
+ 	/* legacy crap */
+ 	unsigned long base;
+ 	unsigned long io_port;
+@@ -455,6 +449,9 @@ struct Scsi_Host {
+ 	unsigned char dma_channel;
+ 	unsigned int  irq;
+ 
++	/* ldm bits */
++	struct device		shost_gendev;
++	struct class_device	shost_classdev;
+ 
+ 	/*
+ 	 * List of hosts per template.
+@@ -474,12 +471,13 @@ struct Scsi_Host {
+ 		__attribute__ ((aligned (sizeof(unsigned long))));
+ };
+ #define		dev_to_shost(d)		\
+-	container_of(d, struct Scsi_Host, host_gendev)
++	container_of(d, struct Scsi_Host, shost_gendev)
+ #define		class_to_shost(d)	\
+-	container_of(d, struct Scsi_Host, class_dev)
++	container_of(d, struct Scsi_Host, shost_classdev)
+ 
+ extern struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *, int);
+ extern int scsi_add_host(struct Scsi_Host *, struct device *);
++extern void scsi_scan_host(struct Scsi_Host *);
+ extern int scsi_remove_host(struct Scsi_Host *);
+ extern void scsi_host_get(struct Scsi_Host *);
+ extern void scsi_host_put(struct Scsi_Host *t);
+@@ -495,16 +493,14 @@ static inline void scsi_assign_lock(stru
+ static inline void scsi_set_device(struct Scsi_Host *shost,
+                                    struct device *dev)
+ {
+-        shost->host_gendev.parent = dev;
++        shost->shost_gendev.parent = dev;
+ }
+ 
+ static inline struct device *scsi_get_device(struct Scsi_Host *shost)
+ {
+-        return shost->host_gendev.parent;
++        return shost->shost_gendev.parent;
+ }
+ 
+-extern void scsi_sysfs_release_attributes(struct scsi_host_template *);
+-
+ extern void scsi_unblock_requests(struct Scsi_Host *);
+ extern void scsi_block_requests(struct Scsi_Host *);
+ 
+--- linux-2.6.0-test1/include/scsi/scsi_request.h	2003-07-02 14:53:18.000000000 -0700
++++ 25/include/scsi/scsi_request.h	2003-07-19 17:03:51.000000000 -0700
+@@ -56,7 +56,7 @@ extern void scsi_do_req(struct scsi_requ
+ 			int timeout, int retries);
+ 
+ struct scsi_mode_data {
+-	__u16	length;
++	__u32	length;
+ 	__u16	block_descriptor_length;
+ 	__u8	medium_type;
+ 	__u8	device_specific;
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/include/video/epson1355.h	2003-07-19 17:04:55.000000000 -0700
+@@ -0,0 +1,64 @@
++/*
++ * include/video/epson13xx.h -- Epson 13xx frame buffer
++ *
++ * Copyright (C) Hewlett-Packard Company.  All rights reserved.
++ *
++ * Written by Christopher Hoover <ch@hpl.hp.com>
++ *
++ */
++
++#ifndef _EPSON13XX_H_
++#define _EPSON13XX_H_
++
++#define REG_REVISION_CODE              0x00
++#define REG_MEMORY_CONFIG              0x01
++#define REG_PANEL_TYPE                 0x02
++#define REG_MOD_RATE                   0x03
++#define REG_HORZ_DISP_WIDTH            0x04
++#define REG_HORZ_NONDISP_PERIOD        0x05
++#define REG_HRTC_START_POSITION        0x06
++#define REG_HRTC_PULSE_WIDTH           0x07
++#define REG_VERT_DISP_HEIGHT0          0x08
++#define REG_VERT_DISP_HEIGHT1          0x09
++#define REG_VERT_NONDISP_PERIOD        0x0A
++#define REG_VRTC_START_POSITION        0x0B
++#define REG_VRTC_PULSE_WIDTH           0x0C
++#define REG_DISPLAY_MODE               0x0D
++#define REG_SCRN1_LINE_COMPARE0        0x0E
++#define REG_SCRN1_LINE_COMPARE1        0x0F
++#define REG_SCRN1_DISP_START_ADDR0     0x10
++#define REG_SCRN1_DISP_START_ADDR1     0x11
++#define REG_SCRN1_DISP_START_ADDR2     0x12
++#define REG_SCRN2_DISP_START_ADDR0     0x13
++#define REG_SCRN2_DISP_START_ADDR1     0x14
++#define REG_SCRN2_DISP_START_ADDR2     0x15
++#define REG_MEM_ADDR_OFFSET0           0x16
++#define REG_MEM_ADDR_OFFSET1           0x17
++#define REG_PIXEL_PANNING              0x18
++#define REG_CLOCK_CONFIG               0x19
++#define REG_POWER_SAVE_CONFIG          0x1A
++#define REG_MISC                       0x1B
++#define REG_MD_CONFIG_READBACK0        0x1C
++#define REG_MD_CONFIG_READBACK1        0x1D
++#define REG_GPIO_CONFIG0               0x1E
++#define REG_GPIO_CONFIG1               0x1F
++#define REG_GPIO_CONTROL0              0x20
++#define REG_GPIO_CONTROL1              0x21
++#define REG_PERF_ENHANCEMENT0          0x22
++#define REG_PERF_ENHANCEMENT1          0x23
++#define REG_LUT_ADDR                   0x24
++#define REG_RESERVED_1                 0x25
++#define REG_LUT_DATA                   0x26
++#define REG_INK_CURSOR_CONTROL         0x27
++#define REG_CURSOR_X_POSITION0         0x28
++#define REG_CURSOR_X_POSITION1         0x29
++#define REG_CURSOR_Y_POSITION0         0x2A
++#define REG_CURSOR_Y_POSITION1         0x2B
++#define REG_INK_CURSOR_COLOR0_0        0x2C
++#define REG_INK_CURSOR_COLOR0_1        0x2D
++#define REG_INK_CURSOR_COLOR1_0        0x2E
++#define REG_INK_CURSOR_COLOR1_1        0x2F
++#define REG_INK_CURSOR_START_ADDR      0x30
++#define REG_ALTERNATE_FRM              0x31
++
++#endif
+--- linux-2.6.0-test1/include/video/neomagic.h	2003-06-14 12:18:07.000000000 -0700
++++ 25/include/video/neomagic.h	2003-07-19 17:04:55.000000000 -0700
+@@ -75,45 +75,45 @@
+ 
+ 
+ struct xtimings {
+-  unsigned int pixclock;
+-  unsigned int HDisplay;
+-  unsigned int HSyncStart;
+-  unsigned int HSyncEnd;
+-  unsigned int HTotal;
+-  unsigned int VDisplay;
+-  unsigned int VSyncStart;
+-  unsigned int VSyncEnd;
+-  unsigned int VTotal;
+-  unsigned int sync;
+-  int	       dblscan;
+-  int	       interlaced;
++	unsigned int pixclock;
++	unsigned int HDisplay;
++	unsigned int HSyncStart;
++	unsigned int HSyncEnd;
++	unsigned int HTotal;
++	unsigned int VDisplay;
++	unsigned int VSyncStart;
++	unsigned int VSyncEnd;
++	unsigned int VTotal;
++	unsigned int sync;
++	int dblscan;
++	int interlaced;
+ };
+ 
+ 
+ /* --------------------------------------------------------------------- */
+ 
+ typedef volatile struct {
+-  __u32 bltStat;
+-  __u32 bltCntl;
+-  __u32 xpColor;
+-  __u32 fgColor;
+-  __u32 bgColor;
+-  __u32 pitch;
+-  __u32 clipLT;
+-  __u32 clipRB;
+-  __u32 srcBitOffset;
+-  __u32 srcStart;
+-  __u32 reserved0;
+-  __u32 dstStart;
+-  __u32 xyExt;
+-
+-  __u32 reserved1[19];
+-
+-  __u32 pageCntl;
+-  __u32 pageBase;
+-  __u32 postBase;
+-  __u32 postPtr;
+-  __u32 dataPtr;
++	__u32 bltStat;
++	__u32 bltCntl;
++	__u32 xpColor;
++	__u32 fgColor;
++	__u32 bgColor;
++	__u32 pitch;
++	__u32 clipLT;
++	__u32 clipRB;
++	__u32 srcBitOffset;
++	__u32 srcStart;
++	__u32 reserved0;
++	__u32 dstStart;
++	__u32 xyExt;
++
++	__u32 reserved1[19];
++
++	__u32 pageCntl;
++	__u32 pageBase;
++	__u32 postBase;
++	__u32 postPtr;
++	__u32 dataPtr;
+ } Neo2200;
+ 
+ #define NR_PALETTE	256
+@@ -124,142 +124,65 @@ typedef volatile struct {
+ #define NEO_EXT_GR_MAX 0xC7
+ 
+ struct neofb_par {
+-  
+-  unsigned char MiscOutReg;     /* Misc */
+-  unsigned char CRTC[25];       /* Crtc Controller */
+-  unsigned char Sequencer[5];   /* Video Sequencer */
+-  unsigned char Graphics[9];    /* Video Graphics */
+-  unsigned char Attribute[21];  /* Video Atribute */
+-
+-  unsigned char GeneralLockReg;
+-  unsigned char ExtCRTDispAddr;
+-  unsigned char ExtCRTOffset;
+-  unsigned char SysIfaceCntl1;
+-  unsigned char SysIfaceCntl2;
+-  unsigned char ExtColorModeSelect;
+-  unsigned char biosMode;
+-
+-  unsigned char PanelDispCntlReg1;
+-  unsigned char PanelDispCntlReg2;
+-  unsigned char PanelDispCntlReg3;
+-  unsigned char PanelVertCenterReg1;
+-  unsigned char PanelVertCenterReg2;
+-  unsigned char PanelVertCenterReg3;
+-  unsigned char PanelVertCenterReg4;
+-  unsigned char PanelVertCenterReg5;
+-  unsigned char PanelHorizCenterReg1;
+-  unsigned char PanelHorizCenterReg2;
+-  unsigned char PanelHorizCenterReg3;
+-  unsigned char PanelHorizCenterReg4;
+-  unsigned char PanelHorizCenterReg5;
+-
+-  int           ProgramVCLK;
+-  unsigned char VCLK3NumeratorLow;
+-  unsigned char VCLK3NumeratorHigh;
+-  unsigned char VCLK3Denominator;
+-  unsigned char VerticalExt;
++	struct vgastate state;
++	unsigned char MiscOutReg;	/* Misc */
++	unsigned char CRTC[25];		/* Crtc Controller */
++	unsigned char Sequencer[5];	/* Video Sequencer */
++	unsigned char Graphics[9];	/* Video Graphics */
++	unsigned char Attribute[21];	/* Video Atribute */
++
++	unsigned char GeneralLockReg;
++	unsigned char ExtCRTDispAddr;
++	unsigned char ExtCRTOffset;
++	unsigned char SysIfaceCntl1;
++	unsigned char SysIfaceCntl2;
++	unsigned char ExtColorModeSelect;
++	unsigned char biosMode;
++
++	unsigned char PanelDispCntlReg1;
++	unsigned char PanelDispCntlReg2;
++	unsigned char PanelDispCntlReg3;
++	unsigned char PanelVertCenterReg1;
++	unsigned char PanelVertCenterReg2;
++	unsigned char PanelVertCenterReg3;
++	unsigned char PanelVertCenterReg4;
++	unsigned char PanelVertCenterReg5;
++	unsigned char PanelHorizCenterReg1;
++	unsigned char PanelHorizCenterReg2;
++	unsigned char PanelHorizCenterReg3;
++	unsigned char PanelHorizCenterReg4;
++	unsigned char PanelHorizCenterReg5;
++
++	int ProgramVCLK;
++	unsigned char VCLK3NumeratorLow;
++	unsigned char VCLK3NumeratorHigh;
++	unsigned char VCLK3Denominator;
++	unsigned char VerticalExt;
+ 
+ #ifdef CONFIG_MTRR
+-  int    mtrr;
++	int mtrr;
+ #endif
+-  u8    *mmio_vbase;
++	u8 *mmio_vbase;
+ 
+-  Neo2200 *neo2200;
++	Neo2200 *neo2200;
+ 
+-  /* Panels size */
+-  int NeoPanelWidth;
+-  int NeoPanelHeight;
++	/* Panels size */
++	int NeoPanelWidth;
++	int NeoPanelHeight;
+ 
+-  int maxClock;
++	int maxClock;
+ 
+-  int pci_burst;
+-  int lcd_stretch;
+-  int internal_display;
+-  int external_display;
+-  int libretto;
++	int pci_burst;
++	int lcd_stretch;
++	int internal_display;
++	int external_display;
++	int libretto;
+ };
+ 
+ typedef struct {
+-    int x_res;
+-    int y_res;
+-    int mode;
++	int x_res;
++	int y_res;
++	int mode;
+ } biosMode;
+ 
+-/* vga IO functions */
+-static inline u8 VGArCR (u8 index)
+-{
+-  outb (index, 0x3d4);
+-  return inb (0x3d5);
+-}
+-
+-static inline void VGAwCR (u8 index, u8 val)
+-{
+-  outb (index, 0x3d4);
+-  outb (val, 0x3d5);
+-}
+-
+-static inline u8 VGArGR (u8 index)
+-{
+-  outb (index, 0x3ce);
+-  return inb (0x3cf);
+-}
+-
+-static inline void VGAwGR (u8 index, u8 val)
+-{
+-  outb (index, 0x3ce);
+-  outb (val, 0x3cf);
+-}
+-
+-static inline u8 VGArSEQ (u8 index)
+-{
+-  outb (index, 0x3c4);
+-  return inb (0x3c5);
+-}
+-
+-static inline void VGAwSEQ (u8 index, u8 val)
+-{
+-  outb (index, 0x3c4);
+-  outb (val, 0x3c5);
+-}
+-
+-
+-static int paletteEnabled = 0;
+-
+-static inline void VGAenablePalette (void)
+-{
+-  u8 tmp;
+-
+-  tmp = inb (0x3da);
+-  outb (0x00, 0x3c0);
+-  paletteEnabled = 1;
+-}
+-
+-static inline void VGAdisablePalette (void)
+-{
+-  u8 tmp;
+-
+-  tmp = inb (0x3da);
+-  outb (0x20, 0x3c0);
+-  paletteEnabled = 0;
+-}
+-
+-static inline void VGAwATTR (u8 index, u8 value)
+-{
+-  u8 tmp;
+-
+-  if (paletteEnabled)
+-    index &= ~0x20;
+-  else
+-    index |= 0x20;
+-
+-  tmp = inb (0x3da);
+-  outb (index, 0x3c0);
+-  outb (value, 0x3c0);
+-}
+-
+-static inline void VGAwMISC (u8 value)
+-{
+-  outb (value, 0x3c2);
+-}
+ #endif
+-
+--- linux-2.6.0-test1/include/video/sisfb.h	2003-06-14 12:18:08.000000000 -0700
++++ 25/include/video/sisfb.h	2003-07-19 17:04:55.000000000 -0700
+@@ -6,6 +6,53 @@
+ #include <asm/ioctl.h>
+ #include <asm/types.h>
+ 
++/* TW: vbflags */
++#define CRT2_DEFAULT            0x00000001
++#define CRT2_LCD                0x00000002  /* TW: Never change the order of the CRT2_XXX entries */
++#define CRT2_TV                 0x00000004  /*     (see SISCycleCRT2Type())                       */
++#define CRT2_VGA                0x00000008
++#define CRT2_ENABLE		(CRT2_LCD | CRT2_TV | CRT2_VGA)
++#define VB_DISPTYPE_DISP2	CRT2_ENABLE
++#define VB_DISPTYPE_CRT2	CRT2_ENABLE
++#define TV_NTSC                 0x00000010
++#define TV_PAL                  0x00000020
++#define TV_HIVISION             0x00000040
++#define TV_HIVISION_LV          0x00000080
++#define TV_TYPE                 (TV_NTSC | TV_PAL | TV_HIVISION | TV_HIVISION_LV)
++#define TV_AVIDEO               0x00000100
++#define TV_SVIDEO               0x00000200
++#define TV_SCART                0x00000400
++#define TV_INTERFACE            (TV_AVIDEO | TV_SVIDEO | TV_SCART | TV_CHSCART | TV_CHHDTV)
++#define VB_USELCDA		0x00000800
++#define TV_PALM                 0x00001000
++#define TV_PALN                 0x00002000
++#define TV_CHSCART              0x00008000
++#define TV_CHHDTV               0x00010000
++#define VGA2_CONNECTED          0x00040000
++#define VB_DISPTYPE_CRT1	0x00080000  	/* CRT1 connected and used */
++#define VBDISPTYPE_DISP1	VB_DISPTYPE_CRT1
++#define VB_301                  0x00100000	/* Video bridge type */
++#define VB_301B                 0x00200000
++#define VB_302B                 0x00400000
++#define VB_30xBDH		0x00800000      /* 30xB DH version (w/o LCD support) */
++#define VB_LVDS                 0x01000000
++#define VB_CHRONTEL             0x02000000
++#define VB_301LV                0x04000000  	
++#define VB_302LV                0x08000000  	
++#define VB_TRUMPION		0x10000000     
++#define VB_VIDEOBRIDGE		(VB_301|VB_301B|VB_302B|VB_301LV|VB_302LV| \
++				 VB_LVDS|VB_CHRONTEL|VB_TRUMPION)
++#define VB_SISBRIDGE            (VB_301|VB_301B|VB_302B|VB_301LV|VB_302LV)
++#define VB_SINGLE_MODE          0x20000000   	 /* CRT1 or CRT2; determined by VB_DISPTYPE_CRTx */
++#define VB_DISPMODE_SINGLE	VB_SINGLE_MODE 	 
++#define VB_MIRROR_MODE		0x40000000   	 /* CRT1 + CRT2 identical (mirror mode) */
++#define VB_DISPMODE_MIRROR	VB_MIRROR_MODE   
++#define VB_DUALVIEW_MODE	0x80000000   	 /* CRT1 + CRT2 independent (dual head mode) */
++#define VB_DISPMODE_DUAL	VB_DUALVIEW_MODE 
++#define VB_DISPLAY_MODE         (VB_SINGLE_MODE | VB_MIRROR_MODE | VB_DUALVIEW_MODE) 
++
++
++/* entries for disp_state - deprecated as of 1.6.02 */
+ #define DISPTYPE_CRT1       0x00000008L
+ #define DISPTYPE_CRT2       0x00000004L
+ #define DISPTYPE_LCD        0x00000002L
+@@ -16,6 +63,7 @@
+ #define DISPMODE_MIRROR	    0x00000010L
+ #define DISPMODE_DUALVIEW   0x00000040L
+ 
++/* Deprecated as of 1.6.02 - use vbflags instead */
+ #define HASVB_NONE      	0x00
+ #define HASVB_301       	0x01
+ #define HASVB_LVDS      	0x02
+@@ -39,6 +87,7 @@ typedef enum _SIS_CHIP_TYPE {
+ 	SIS_650,
+ 	SIS_740,
+ 	SIS_330,
++	SIS_660,
+ 	MAX_SIS_CHIP
+ } SIS_CHIP_TYPE;
+ 
+@@ -83,13 +132,15 @@ struct ap_data {
+ 	struct mode_info minfo;
+ 	unsigned long iobase;
+ 	unsigned int  mem_size;
+-	unsigned long disp_state;    	
++	unsigned long disp_state;  /* deprecated */  	
+ 	SIS_CHIP_TYPE chip;
+ 	unsigned char hasVB;
+-	SIS_TV_TYPE TV_type;
+-	SIS_TV_PLUG TV_plug;
++	SIS_TV_TYPE TV_type;	   /* deprecated */
++	SIS_TV_PLUG TV_plug;	   /* deprecated */
+ 	unsigned long version;
+-	char reserved[256];
++	unsigned long vbflags;	   /* replaces deprecated entries above */
++	unsigned long currentvbflags;
++	char reserved[248];
+ };
+ 
+ struct video_info {
+@@ -114,10 +165,10 @@ struct video_info {
+ 	int    video_linelength;
+ 	unsigned int refresh_rate;
+ 
+-	unsigned long disp_state;
+-	unsigned char hasVB;
+-	unsigned char TV_type;
+-	unsigned char TV_plug;
++	unsigned long disp_state;		/* DEPRECATED */
++	unsigned char hasVB;			/* DEPRECATED */
++	unsigned char TV_type;			/* DEPRECATED */
++	unsigned char TV_plug;			/* DEPRECATED */
+ 
+ 	SIS_CHIP_TYPE chip;
+ 	unsigned char revision_id;
+@@ -136,8 +187,19 @@ struct video_info {
+ 
+ 	unsigned short subsysvendor;
+ 	unsigned short subsysdevice;
++	
++	unsigned long  vbflags;			/* Replacing deprecated stuff from above */
++	unsigned long  currentvbflags;
++	
++	int    current_bpp;
++	int    current_width;
++	int    current_height;
++	int    current_htotal;
++	int    current_vtotal;
++	__u32  current_pixclock;
++	int    current_refresh_rate;
+ 
+-	char reserved[236];
++	char reserved[200];
+ };
+ 
+ 
+@@ -177,8 +239,11 @@ struct _SISFB_INFO {
+ 	unsigned char sisfb_lcdpdc;	/* PanelDelayCompensation */
+ 	
+ 	unsigned char sisfb_lcda;	/* Detected status of LCDA for low res/text modes */
++	
++	unsigned long sisfb_vbflags;
++	unsigned long sisfb_currentvbflags;
+ 
+-	char reserved[235]; 		/* for future use */
++	char reserved[227]; 		/* for future use */
+ };
+ 
+ #ifdef __KERNEL__
+--- linux-2.6.0-test1/init/do_mounts.h	2003-06-14 12:18:24.000000000 -0700
++++ 25/init/do_mounts.h	2003-07-19 17:03:51.000000000 -0700
+@@ -6,7 +6,7 @@
+ #include <linux/unistd.h>
+ #include <linux/slab.h>
+ #include <linux/mount.h>
+-#include <linux/blk.h>
++#include <linux/major.h>
+ #include <linux/root_dev.h>
+ 
+ asmlinkage long sys_unlink(const char *name);
+--- linux-2.6.0-test1/init/do_mounts_initrd.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/init/do_mounts_initrd.c	2003-07-19 17:03:51.000000000 -0700
+@@ -5,6 +5,7 @@
+ #include <linux/ext2_fs.h>
+ #include <linux/romfs_fs.h>
+ #include <linux/initrd.h>
++#include <linux/sched.h>
+ 
+ #include "do_mounts.h"
+ 
+--- linux-2.6.0-test1/init/do_mounts_rd.c	2003-06-14 12:18:28.000000000 -0700
++++ 25/init/do_mounts_rd.c	2003-07-19 17:03:51.000000000 -0700
+@@ -5,6 +5,7 @@
+ #include <linux/ext2_fs.h>
+ #include <linux/romfs_fs.h>
+ #include <linux/initrd.h>
++#include <linux/string.h>
+ 
+ #include "do_mounts.h"
+ 
+--- linux-2.6.0-test1/init/main.c	2003-06-26 22:07:26.000000000 -0700
++++ 25/init/main.c	2003-07-19 17:03:51.000000000 -0700
+@@ -23,7 +23,6 @@
+ #include <linux/ioport.h>
+ #include <linux/init.h>
+ #include <linux/smp_lock.h>
+-#include <linux/blk.h>
+ #include <linux/initrd.h>
+ #include <linux/hdreg.h>
+ #include <linux/bootmem.h>
+--- linux-2.6.0-test1/kernel/compat.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/kernel/compat.c	2003-07-19 17:03:51.000000000 -0700
+@@ -425,9 +425,11 @@ asmlinkage int compat_sys_sched_getaffin
+ 				    &kernel_mask);
+ 	set_fs(old_fs);
+ 
+-	if (ret > 0)
++	if (ret > 0) {
++		ret = sizeof(compat_ulong_t);
+ 		if (put_user(kernel_mask, user_mask_ptr))
+ 			return -EFAULT;
++	}
+ 
+ 	return ret;
+ }
+--- linux-2.6.0-test1/kernel/extable.c	2003-06-14 12:18:06.000000000 -0700
++++ 25/kernel/extable.c	2003-07-19 17:03:51.000000000 -0700
+@@ -17,10 +17,10 @@
+ */
+ #include <linux/module.h>
+ #include <asm/uaccess.h>
++#include <asm/sections.h>
+ 
+ extern const struct exception_table_entry __start___ex_table[];
+ extern const struct exception_table_entry __stop___ex_table[];
+-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)
+--- linux-2.6.0-test1/kernel/fork.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/kernel/fork.c	2003-07-19 17:06:43.000000000 -0700
+@@ -53,13 +53,6 @@ DEFINE_PER_CPU(unsigned long, process_co
+ 
+ rwlock_t tasklist_lock __cacheline_aligned = RW_LOCK_UNLOCKED;  /* outer */
+ 
+-/*
+- * A per-CPU task cache - this relies on the fact that
+- * the very last portion of sys_exit() is executed with
+- * preemption turned off.
+- */
+-static task_t *task_cache[NR_CPUS] __cacheline_aligned;
+-
+ int nr_processes(void)
+ {
+ 	int cpu;
+@@ -80,26 +73,8 @@ static kmem_cache_t *task_struct_cachep;
+ 
+ static void free_task(struct task_struct *tsk)
+ {
+-	/*
+-	 * The task cache is effectively disabled right now.
+-	 * Do we want it? The slab cache already has per-cpu
+-	 * stuff, but the thread info (usually a order-1 page
+-	 * allocation) doesn't.
+-	 */
+-	if (tsk != current) {
+-		free_thread_info(tsk->thread_info);
+-		free_task_struct(tsk);
+-	} else {
+-		int cpu = get_cpu();
+-
+-		tsk = task_cache[cpu];
+-		if (tsk) {
+-			free_thread_info(tsk->thread_info);
+-			free_task_struct(tsk);
+-		}
+-		task_cache[cpu] = current;
+-		put_cpu();
+-	}
++	free_thread_info(tsk->thread_info);
++	free_task_struct(tsk);
+ }
+ 
+ void __put_task_struct(struct task_struct *tsk)
+@@ -146,7 +121,12 @@ void prepare_to_wait(wait_queue_head_t *
+ {
+ 	unsigned long flags;
+ 
+-	__set_current_state(state);
++	/*
++	 * don't alter the task state if this is just going to
++	 * queue an async wait queue callback
++	 */
++	if (is_sync_wait(wait))
++		__set_current_state(state);
+ 	wait->flags &= ~WQ_FLAG_EXCLUSIVE;
+ 	spin_lock_irqsave(&q->lock, flags);
+ 	if (list_empty(&wait->task_list))
+@@ -159,7 +139,12 @@ prepare_to_wait_exclusive(wait_queue_hea
+ {
+ 	unsigned long flags;
+ 
+-	__set_current_state(state);
++	/*
++	 * don't alter the task state if this is just going to
++	 * queue an async wait queue callback
++	 */
++	if (is_sync_wait(wait))
++		__set_current_state(state);
+ 	wait->flags |= WQ_FLAG_EXCLUSIVE;
+ 	spin_lock_irqsave(&q->lock, flags);
+ 	if (list_empty(&wait->task_list))
+@@ -220,25 +205,18 @@ static struct task_struct *dup_task_stru
+ {
+ 	struct task_struct *tsk;
+ 	struct thread_info *ti;
+-	int cpu = get_cpu();
+ 
+ 	prepare_to_copy(orig);
+ 
+-	tsk = task_cache[cpu];
+-	task_cache[cpu] = NULL;
+-	put_cpu();
+-	if (!tsk) {
+-		tsk = alloc_task_struct();
+-		if (!tsk)
+-			return NULL;
+-
+-		ti = alloc_thread_info(tsk);
+-		if (!ti) {
+-			free_task_struct(tsk);
+-			return NULL;
+-		}
+-	} else
+-		ti = tsk->thread_info;
++	tsk = alloc_task_struct();
++	if (!tsk)
++		return NULL;
++
++	ti = alloc_thread_info(tsk);
++	if (!ti) {
++		free_task_struct(tsk);
++		return NULL;
++	}
+ 
+ 	*ti = *orig->thread_info;
+ 	*tsk = *orig;
+@@ -265,7 +243,7 @@ static inline int dup_mmap(struct mm_str
+ 	mm->free_area_cache = TASK_UNMAPPED_BASE;
+ 	mm->map_count = 0;
+ 	mm->rss = 0;
+-	mm->cpu_vm_mask = 0;
++	cpus_clear(mm->cpu_vm_mask);
+ 	pprev = &mm->mmap;
+ 
+ 	/*
+@@ -430,6 +408,23 @@ void mmput(struct mm_struct *mm)
+ 	}
+ }
+ 
++/*
++ * Checks if the use count of an mm is non-zero and if so
++ * returns a reference to it after bumping up the use count.
++ * If the use count is zero, it means this mm is going away,
++ * so return NULL.
++ */
++struct mm_struct *mmgrab(struct mm_struct *mm)
++{
++	spin_lock(&mmlist_lock);
++	if (!atomic_read(&mm->mm_users))
++		mm = NULL;
++	else
++		atomic_inc(&mm->mm_users);
++	spin_unlock(&mmlist_lock);
++	return mm;
++}
++
+ /* Please note the differences between mmput and mm_release.
+  * mmput is called whenever we stop holding onto a mm_struct,
+  * error success whatever.
+@@ -791,8 +786,10 @@ struct task_struct *copy_process(unsigne
+ 		goto fork_out;
+ 
+ 	retval = -EAGAIN;
+-	if (atomic_read(&p->user->processes) >= p->rlim[RLIMIT_NPROC].rlim_cur) {
+-		if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE))
++	if (atomic_read(&p->user->processes) >=
++			p->rlim[RLIMIT_NPROC].rlim_cur) {
++		if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE) &&
++				p->user != &root_user)
+ 			goto bad_fork_free;
+ 	}
+ 
+@@ -866,6 +863,7 @@ struct task_struct *copy_process(unsigne
+ 	p->start_time = get_jiffies_64();
+ 	p->security = NULL;
+ 	p->io_context = NULL;
++	p->io_wait = NULL;
+ 
+ 	retval = -ENOMEM;
+ 	if ((retval = security_task_alloc(p)))
+@@ -1106,7 +1104,7 @@ long do_fork(unsigned long clone_flags,
+ 			init_completion(&vfork);
+ 		}
+ 
+-		if (p->ptrace & PT_PTRACED) {
++		if ((p->ptrace & PT_PTRACED) || (clone_flags & CLONE_STOPPED)) {
+ 			/*
+ 			 * We'll start up with an immediate SIGSTOP.
+ 			 */
+@@ -1114,7 +1112,9 @@ long do_fork(unsigned long clone_flags,
+ 			set_tsk_thread_flag(p, TIF_SIGPENDING);
+ 		}
+ 
+-		wake_up_forked_process(p);		/* do this last */
++		p->state = TASK_STOPPED;
++		if (!(clone_flags & CLONE_STOPPED))
++			wake_up_forked_process(p);	/* do this last */
+ 		++total_forks;
+ 
+ 		if (unlikely (trace)) {
+--- linux-2.6.0-test1/kernel/ksyms.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/kernel/ksyms.c	2003-07-19 17:06:51.000000000 -0700
+@@ -120,12 +120,14 @@ EXPORT_SYMBOL(mem_map);
+ EXPORT_SYMBOL(max_mapnr);
+ #endif
+ EXPORT_SYMBOL(high_memory);
++EXPORT_SYMBOL_GPL(invalidate_mmap_range);
+ EXPORT_SYMBOL(vmtruncate);
+ EXPORT_SYMBOL(find_vma);
+ EXPORT_SYMBOL(get_unmapped_area);
+ EXPORT_SYMBOL(init_mm);
+ EXPORT_SYMBOL(blk_queue_bounce);
+ EXPORT_SYMBOL(blk_congestion_wait);
++EXPORT_SYMBOL(blk_congestion_wait_wq);
+ #ifdef CONFIG_HIGHMEM
+ EXPORT_SYMBOL(kmap_high);
+ EXPORT_SYMBOL(kunmap_high);
+@@ -219,6 +221,7 @@ EXPORT_SYMBOL(sync_dirty_buffer);
+ EXPORT_SYMBOL(submit_bh);
+ EXPORT_SYMBOL(unlock_buffer);
+ EXPORT_SYMBOL(__wait_on_buffer);
++EXPORT_SYMBOL(__wait_on_buffer_wq);
+ EXPORT_SYMBOL(blockdev_direct_IO);
+ EXPORT_SYMBOL(block_write_full_page);
+ EXPORT_SYMBOL(block_read_full_page);
+@@ -605,6 +608,19 @@ EXPORT_SYMBOL(next_thread);
+ EXPORT_SYMBOL(__per_cpu_offset);
+ #endif
+ 
++EXPORT_SYMBOL(set_fs_pwd);
++EXPORT_SYMBOL(set_fs_root);
++
++#if defined(CONFIG_LOCKMETER)
++EXPORT_SYMBOL(_metered_spin_lock);
++EXPORT_SYMBOL(_metered_spin_unlock);
++EXPORT_SYMBOL(_metered_spin_trylock);
++EXPORT_SYMBOL(_metered_read_lock);
++EXPORT_SYMBOL(_metered_read_unlock);
++EXPORT_SYMBOL(_metered_write_lock);
++EXPORT_SYMBOL(_metered_write_unlock);
++#endif
++
+ /* debug */
+ EXPORT_SYMBOL(dump_stack);
+ EXPORT_SYMBOL(ptrace_notify);
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/kernel/lockmeter.c	2003-07-19 17:06:40.000000000 -0700
+@@ -0,0 +1,1169 @@
++/*
++ *  Copyright (C) 1999,2000 Silicon Graphics, Inc.
++ *
++ *  Written by John Hawkes (hawkes@sgi.com)
++ *  Based on klstat.c by Jack Steiner (steiner@sgi.com)
++ *
++ *  Modified by Ray Bryant (raybry@us.ibm.com)
++ *  Changes Copyright (C) 2000 IBM, Inc.
++ *  Added save of index in spinlock_t to improve efficiency
++ *  of "hold" time reporting for spinlocks
++ *  Added support for hold time statistics for read and write
++ *  locks.
++ */
++
++#include <linux/config.h>
++#include <linux/types.h>
++#include <linux/errno.h>
++#include <linux/slab.h>
++#include <linux/sched.h>
++#include <linux/smp.h>
++#include <linux/threads.h>
++#include <linux/version.h>
++#include <linux/vmalloc.h>
++#include <linux/spinlock.h>
++#include <linux/utsname.h>
++#include <asm/system.h>
++#include <asm/uaccess.h>
++
++#include <linux/lockmeter.h>
++
++#define ASSERT(cond)
++#define bzero(loc,size)		memset(loc,0,size)
++
++/*<---------------------------------------------------*/
++/*              lockmeter.c                           */
++/*>---------------------------------------------------*/
++
++static lstat_control_t lstat_control __cacheline_aligned =
++	{ LSTAT_OFF, SPIN_LOCK_UNLOCKED, SPIN_LOCK_UNLOCKED,
++	  19 * 0, NR_CPUS * 0, 0, NR_CPUS * 0 };
++
++static ushort lstat_make_dir_entry(void *, void *);
++
++/*
++ * lstat_lookup
++ *
++ * Given a RA, locate the directory entry for the lock.
++ */
++static ushort
++lstat_lookup(void *lock_ptr, void *caller_ra)
++{
++	ushort index;
++	lstat_directory_entry_t *dirp;
++
++	dirp = lstat_control.dir;
++
++	index = lstat_control.hashtab[DIRHASH(caller_ra)];
++	while (dirp[index].caller_ra != caller_ra) {
++		if (index == 0) {
++			return lstat_make_dir_entry(lock_ptr, caller_ra);
++		}
++		index = dirp[index].next_stat_index;
++	}
++
++	if (dirp[index].lock_ptr != NULL && dirp[index].lock_ptr != lock_ptr) {
++		dirp[index].lock_ptr = NULL;
++	}
++
++	return index;
++}
++
++/*
++ * lstat_make_dir_entry
++ * Called to add a new lock to the lock directory.
++ */
++static ushort
++lstat_make_dir_entry(void *lock_ptr, void *caller_ra)
++{
++	lstat_directory_entry_t *dirp;
++	ushort index, hindex;
++	unsigned long flags;
++
++	/* lock the table without recursively reentering this metering code */
++	local_irq_save(flags);
++	_raw_spin_lock(&lstat_control.directory_lock);
++
++	hindex = DIRHASH(caller_ra);
++	index = lstat_control.hashtab[hindex];
++	dirp = lstat_control.dir;
++	while (index && dirp[index].caller_ra != caller_ra)
++		index = dirp[index].next_stat_index;
++
++	if (index == 0) {
++		if (lstat_control.next_free_dir_index < LSTAT_MAX_STAT_INDEX) {
++			index = lstat_control.next_free_dir_index++;
++			lstat_control.dir[index].caller_ra = caller_ra;
++			lstat_control.dir[index].lock_ptr = lock_ptr;
++			lstat_control.dir[index].next_stat_index =
++				lstat_control.hashtab[hindex];
++			lstat_control.hashtab[hindex] = index;
++		} else {
++			lstat_control.dir_overflow++;
++		}
++	}
++	_raw_spin_unlock(&lstat_control.directory_lock);
++	local_irq_restore(flags);
++	return index;
++}
++
++int
++lstat_update(void *lock_ptr, void *caller_ra, int action)
++{
++	int index;
++	int cpu;
++
++	ASSERT(action < LSTAT_ACT_MAX_VALUES);
++
++	if (lstat_control.state == LSTAT_OFF)
++		return 0;
++
++	index = lstat_lookup(lock_ptr, caller_ra);
++	cpu = THIS_CPU_NUMBER;
++	(*lstat_control.counts[cpu])[index].count[action]++;
++	(*lstat_control.counts[cpu])[index].acquire_time = get_cycles();
++
++	return index;
++}
++
++int
++lstat_update_time(void *lock_ptr, void *caller_ra, int action, uint32_t ticks)
++{
++	ushort index;
++	int cpu;
++
++	ASSERT(action < LSTAT_ACT_MAX_VALUES);
++
++	if (lstat_control.state == LSTAT_OFF)
++		return 0;
++
++	index = lstat_lookup(lock_ptr, caller_ra);
++	cpu = THIS_CPU_NUMBER;
++	(*lstat_control.counts[cpu])[index].count[action]++;
++	(*lstat_control.counts[cpu])[index].cum_wait_ticks += (uint64_t) ticks;
++	if ((*lstat_control.counts[cpu])[index].max_wait_ticks < ticks)
++		(*lstat_control.counts[cpu])[index].max_wait_ticks = ticks;
++
++	(*lstat_control.counts[cpu])[index].acquire_time = get_cycles();
++
++	return index;
++}
++
++void
++_metered_spin_lock(spinlock_t * lock_ptr)
++{
++	if (lstat_control.state == LSTAT_OFF) {
++		_raw_spin_lock(lock_ptr);	/* do the real lock */
++		PUT_INDEX(lock_ptr, 0);	/* clean index in case lockmetering  */
++		/* gets turned on before unlock */
++	} else {
++		void *this_pc = LSTAT_RA(LSTAT_RA_SPIN);
++		int index;
++
++		if (_raw_spin_trylock(lock_ptr)) {
++			index = lstat_update(lock_ptr, this_pc,
++						LSTAT_ACT_NO_WAIT);
++		} else {
++			uint32_t start_cycles = get_cycles();
++			_raw_spin_lock(lock_ptr);	/* do the real lock */
++			index = lstat_update_time(lock_ptr, this_pc,
++				LSTAT_ACT_SPIN, get_cycles() - start_cycles);
++		}
++		/* save the index in the lock itself for use in spin unlock */
++		PUT_INDEX(lock_ptr, index);
++	}
++}
++
++int
++_metered_spin_trylock(spinlock_t * lock_ptr)
++{
++	if (lstat_control.state == LSTAT_OFF) {
++		return _raw_spin_trylock(lock_ptr);
++	} else {
++		int retval;
++		void *this_pc = LSTAT_RA(LSTAT_RA_SPIN);
++
++		if ((retval = _raw_spin_trylock(lock_ptr))) {
++			int index = lstat_update(lock_ptr, this_pc,
++						LSTAT_ACT_NO_WAIT);
++			/*
++			 * save the index in the lock itself for use in spin
++			 * unlock
++			 */
++			PUT_INDEX(lock_ptr, index);
++		} else {
++			lstat_update(lock_ptr, this_pc, LSTAT_ACT_REJECT);
++		}
++
++		return retval;
++	}
++}
++
++void
++_metered_spin_unlock(spinlock_t * lock_ptr)
++{
++	int index = -1;
++
++	if (lstat_control.state != LSTAT_OFF) {
++		index = GET_INDEX(lock_ptr);
++		/*
++		 * If statistics were turned off when we set the lock,
++		 * then the index can be zero.  If that is the case,
++		 * then collect no stats on this call.
++		 */
++		if (index > 0) {
++			uint32_t hold_time;
++			int cpu = THIS_CPU_NUMBER;
++			hold_time = get_cycles() -
++			 (*lstat_control.counts[cpu])[index].acquire_time;
++			(*lstat_control.counts[cpu])[index].cum_hold_ticks +=
++				(uint64_t) hold_time;
++			if ((*lstat_control.counts[cpu])[index].max_hold_ticks <
++			    hold_time)
++				(*lstat_control.counts[cpu])[index].
++				    max_hold_ticks = hold_time;
++		}
++	}
++
++	/* make sure we don't have a stale index value saved */
++	PUT_INDEX(lock_ptr, 0);
++	_raw_spin_unlock(lock_ptr);	/* do the real unlock */
++}
++
++/*
++ * allocate the next global read lock structure and store its index
++ * in the rwlock at "lock_ptr".
++ */
++uint32_t
++alloc_rwlock_struct(rwlock_t * rwlock_ptr)
++{
++	int index;
++	unsigned long flags;
++	int cpu = THIS_CPU_NUMBER;
++
++	/* If we've already overflowed, then do a quick exit */
++	if (lstat_control.next_free_read_lock_index >
++			LSTAT_MAX_READ_LOCK_INDEX) {
++		lstat_control.rwlock_overflow++;
++		return 0;
++	}
++
++	local_irq_save(flags);
++	_raw_spin_lock(&lstat_control.directory_lock);
++
++	/* It is possible this changed while we were waiting for the directory_lock */
++	if (lstat_control.state == LSTAT_OFF) {
++		index = 0;
++		goto unlock;
++	}
++
++	/* It is possible someone else got here first and set the index */
++	if ((index = GET_RWINDEX(rwlock_ptr)) == 0) {
++		/*
++		 * we can't turn on read stats for this lock while there are
++		 * readers (this would mess up the running hold time sum at
++		 * unlock time)
++		 */
++		if (RWLOCK_READERS(rwlock_ptr) != 0) {
++			index = 0;
++			goto unlock;
++		}
++
++		/*
++		 * if stats are turned on after being off, we may need to
++		 * return an old index from when the statistics were on last
++		 * time.
++		 */
++		for (index = 1; index < lstat_control.next_free_read_lock_index;
++				index++)
++			if ((*lstat_control.read_lock_counts[cpu])[index].
++					lock_ptr == rwlock_ptr)
++				goto put_index_and_unlock;
++
++		/* allocate the next global read lock structure */
++		if (lstat_control.next_free_read_lock_index >=
++		    LSTAT_MAX_READ_LOCK_INDEX) {
++			lstat_control.rwlock_overflow++;
++			index = 0;
++			goto unlock;
++		}
++		index = lstat_control.next_free_read_lock_index++;
++
++		/*
++		 * initialize the global read stats data structure for each
++		 * cpu
++		 */
++		for (cpu = 0; cpu < num_online_cpus(); cpu++) {
++			(*lstat_control.read_lock_counts[cpu])[index].lock_ptr =
++				rwlock_ptr;
++		}
++put_index_and_unlock:
++		/* store the index for the read lock structure into the lock */
++		PUT_RWINDEX(rwlock_ptr, index);
++	}
++
++unlock:
++	_raw_spin_unlock(&lstat_control.directory_lock);
++	local_irq_restore(flags);
++	return index;
++}
++
++void
++_metered_read_lock(rwlock_t * rwlock_ptr)
++{
++	void *this_pc;
++	uint32_t start_cycles;
++	int index;
++	int cpu;
++	unsigned long flags;
++	int readers_before, readers_after;
++	uint64_t cycles64;
++
++	if (lstat_control.state == LSTAT_OFF) {
++		_raw_read_lock(rwlock_ptr);
++		/* clean index in case lockmetering turns on before an unlock */
++		PUT_RWINDEX(rwlock_ptr, 0);
++		return;
++	}
++
++	this_pc = LSTAT_RA(LSTAT_RA_READ);
++	cpu = THIS_CPU_NUMBER;
++	index = GET_RWINDEX(rwlock_ptr);
++
++	/* allocate the global stats entry for this lock, if needed */
++	if (index == 0)
++		index = alloc_rwlock_struct(rwlock_ptr);
++
++	readers_before = RWLOCK_READERS(rwlock_ptr);
++	if (_raw_read_trylock(rwlock_ptr)) {
++		/*
++		 * We have decremented the lock to count a new reader,
++		 * and have confirmed that no writer has it locked.
++		 */
++		/* update statistics if enabled */
++		if (index > 0) {
++			local_irq_save(flags);
++			lstat_update((void *) rwlock_ptr, this_pc,
++					LSTAT_ACT_NO_WAIT);
++			/* preserve value of TSC so cum_hold_ticks and start_busy use same value */
++			cycles64 = get_cycles64();
++			(*lstat_control.read_lock_counts[cpu])[index].
++				cum_hold_ticks -= cycles64;
++
++			/* record time and cpu of start of busy period */
++			/* this is not perfect (some race conditions are possible) */
++			if (readers_before == 0) {
++				(*lstat_control.read_lock_counts[cpu])[index].
++					start_busy = cycles64;
++				PUT_RW_CPU(rwlock_ptr, cpu);
++			}
++			readers_after = RWLOCK_READERS(rwlock_ptr);
++			if (readers_after >
++				(*lstat_control.read_lock_counts[cpu])[index].
++					max_readers)
++				(*lstat_control.read_lock_counts[cpu])[index].
++					max_readers = readers_after;
++			local_irq_restore(flags);
++		}
++
++		return;
++	}
++	/* If we get here, then we could not quickly grab the read lock */
++
++	start_cycles = get_cycles();	/* start counting the wait time */
++
++	/* Now spin until read_lock is successful */
++	_raw_read_lock(rwlock_ptr);
++
++	lstat_update_time((void *) rwlock_ptr, this_pc, LSTAT_ACT_SPIN,
++			  get_cycles() - start_cycles);
++
++	/* update statistics if they are enabled for this lock */
++	if (index > 0) {
++		local_irq_save(flags);
++		cycles64 = get_cycles64();
++		(*lstat_control.read_lock_counts[cpu])[index].cum_hold_ticks -=
++				cycles64;
++
++		/* this is not perfect (some race conditions are possible) */
++		if (readers_before == 0) {
++			(*lstat_control.read_lock_counts[cpu])[index].
++				start_busy = cycles64;
++			PUT_RW_CPU(rwlock_ptr, cpu);
++		}
++		readers_after = RWLOCK_READERS(rwlock_ptr);
++		if (readers_after >
++		    (*lstat_control.read_lock_counts[cpu])[index].max_readers)
++			(*lstat_control.read_lock_counts[cpu])[index].
++				max_readers = readers_after;
++		local_irq_restore(flags);
++	}
++}
++
++void
++_metered_read_unlock(rwlock_t * rwlock_ptr)
++{
++	int index;
++	int cpu;
++	unsigned long flags;
++	uint64_t busy_length;
++	uint64_t cycles64;
++
++	if (lstat_control.state == LSTAT_OFF) {
++		_raw_read_unlock(rwlock_ptr);
++		return;
++	}
++
++	index = GET_RWINDEX(rwlock_ptr);
++	cpu = THIS_CPU_NUMBER;
++
++	if (index > 0) {
++		local_irq_save(flags);
++		/*
++		 * preserve value of TSC so cum_hold_ticks and busy_ticks are
++		 * consistent.
++		 */
++		cycles64 = get_cycles64();
++		(*lstat_control.read_lock_counts[cpu])[index].cum_hold_ticks +=
++			cycles64;
++		(*lstat_control.read_lock_counts[cpu])[index].read_lock_count++;
++
++		/*
++		 * once again, this is not perfect (some race conditions are
++		 * possible)
++		 */
++		if (RWLOCK_READERS(rwlock_ptr) == 1) {
++			int cpu1 = GET_RW_CPU(rwlock_ptr);
++			uint64_t last_start_busy =
++				(*lstat_control.read_lock_counts[cpu1])[index].
++					start_busy;
++			(*lstat_control.read_lock_counts[cpu])[index].
++				busy_periods++;
++			if (cycles64 > last_start_busy) {
++				busy_length = cycles64 - last_start_busy;
++				(*lstat_control.read_lock_counts[cpu])[index].
++					busy_ticks += busy_length;
++				if (busy_length >
++					(*lstat_control.
++						read_lock_counts[cpu])[index].
++							max_busy)
++					(*lstat_control.
++					 read_lock_counts[cpu])[index].
++						max_busy = busy_length;
++			}
++		}
++		local_irq_restore(flags);
++	}
++	_raw_read_unlock(rwlock_ptr);
++}
++
++void
++_metered_write_lock(rwlock_t * rwlock_ptr)
++{
++	uint32_t start_cycles;
++	void *this_pc;
++	uint32_t spin_ticks = 0; /* in anticipation of a potential wait */
++	int index;
++	int write_index = 0;
++	int cpu;
++	enum {
++		writer_writer_conflict,
++		writer_reader_conflict
++	} why_wait = writer_writer_conflict;
++
++	if (lstat_control.state == LSTAT_OFF) {
++		_raw_write_lock(rwlock_ptr);
++		/* clean index in case lockmetering turns on before an unlock */
++		PUT_RWINDEX(rwlock_ptr, 0);
++		return;
++	}
++
++	this_pc = LSTAT_RA(LSTAT_RA_WRITE);
++	cpu = THIS_CPU_NUMBER;
++	index = GET_RWINDEX(rwlock_ptr);
++
++	/* allocate the global stats entry for this lock, if needed */
++	if (index == 0) {
++		index = alloc_rwlock_struct(rwlock_ptr);
++	}
++
++	if (_raw_write_trylock(rwlock_ptr)) {
++		/* We acquired the lock on the first try */
++		write_index = lstat_update((void *) rwlock_ptr, this_pc,
++					LSTAT_ACT_NO_WAIT);
++		/* save the write_index for use in unlock if stats enabled */
++		if (index > 0)
++			(*lstat_control.read_lock_counts[cpu])[index].
++				write_index = write_index;
++		return;
++	}
++
++	/* If we get here, then we could not quickly grab the write lock */
++	start_cycles = get_cycles();	/* start counting the wait time */
++
++	why_wait = RWLOCK_READERS(rwlock_ptr) ?
++			writer_reader_conflict : writer_writer_conflict;
++
++	/* Now set the lock and wait for conflicts to disappear */
++	_raw_write_lock(rwlock_ptr);
++
++	spin_ticks = get_cycles() - start_cycles;
++
++	/* update stats -- if enabled */
++	if (index > 0 && spin_ticks) {
++		if (why_wait == writer_reader_conflict) {
++			/* waited due to a reader holding the lock */
++			write_index = lstat_update_time((void *)rwlock_ptr,
++					this_pc, LSTAT_ACT_SPIN, spin_ticks);
++		} else {
++			/*
++			 * waited due to another writer holding the lock
++			 */
++			write_index = lstat_update_time((void *)rwlock_ptr,
++				this_pc, LSTAT_ACT_WW_SPIN, spin_ticks);
++			(*lstat_control.counts[cpu])[write_index].
++				cum_wait_ww_ticks += spin_ticks;
++			if (spin_ticks >
++				(*lstat_control.counts[cpu])[write_index].
++					max_wait_ww_ticks) {
++				(*lstat_control.counts[cpu])[write_index].
++					max_wait_ww_ticks = spin_ticks;
++			}
++		}
++
++		/* save the directory index for use on write_unlock */
++		(*lstat_control.read_lock_counts[cpu])[index].
++			write_index = write_index;
++	}
++}
++
++void
++_metered_write_unlock(rwlock_t * rwlock_ptr)
++{
++	int index;
++	int cpu;
++	int write_index;
++	uint32_t hold_time;
++
++	if (lstat_control.state == LSTAT_OFF) {
++		_raw_write_unlock(rwlock_ptr);
++		return;
++	}
++
++	cpu = THIS_CPU_NUMBER;
++	index = GET_RWINDEX(rwlock_ptr);
++
++	/* update statistics if stats enabled for this lock */
++	if (index > 0) {
++		write_index =
++		    (*lstat_control.read_lock_counts[cpu])[index].write_index;
++
++		hold_time = get_cycles() -
++			(*lstat_control.counts[cpu])[write_index].acquire_time;
++		(*lstat_control.counts[cpu])[write_index].cum_hold_ticks +=
++			(uint64_t) hold_time;
++		if ((*lstat_control.counts[cpu])[write_index].max_hold_ticks <
++				hold_time)
++			(*lstat_control.counts[cpu])[write_index].
++				max_hold_ticks = hold_time;
++	}
++	_raw_write_unlock(rwlock_ptr);
++}
++
++int
++_metered_write_trylock(rwlock_t * rwlock_ptr)
++{
++	int retval;
++	void *this_pc = LSTAT_RA(LSTAT_RA_WRITE);
++
++	if ((retval = _raw_write_trylock(rwlock_ptr))) {
++		lstat_update(rwlock_ptr, this_pc, LSTAT_ACT_NO_WAIT);
++	} else {
++		lstat_update(rwlock_ptr, this_pc, LSTAT_ACT_REJECT);
++	}
++
++	return retval;
++}
++
++static void
++init_control_space(void)
++{
++	/* Set all control space pointers to null and indices to "empty" */
++	int cpu;
++
++	/*
++	 * Access CPU_CYCLE_FREQUENCY at the outset, which in some
++	 * architectures may trigger a runtime calculation that uses a
++	 * spinlock.  Let's do this before lockmetering is turned on.
++	 */
++	if (CPU_CYCLE_FREQUENCY == 0)
++		BUG();
++
++	lstat_control.hashtab = NULL;
++	lstat_control.dir = NULL;
++	for (cpu = 0; cpu < NR_CPUS; cpu++) {
++		lstat_control.counts[cpu] = NULL;
++		lstat_control.read_lock_counts[cpu] = NULL;
++	}
++}
++
++static int
++reset_lstat_data(void)
++{
++	int cpu, flags;
++
++	flags = 0;
++	lstat_control.next_free_dir_index = 1;	/* 0 is for overflows */
++	lstat_control.next_free_read_lock_index = 1;
++	lstat_control.dir_overflow = 0;
++	lstat_control.rwlock_overflow = 0;
++
++	lstat_control.started_cycles64 = 0;
++	lstat_control.ending_cycles64 = 0;
++	lstat_control.enabled_cycles64 = 0;
++	lstat_control.first_started_time = 0;
++	lstat_control.started_time = 0;
++	lstat_control.ending_time = 0;
++	lstat_control.intervals = 0;
++
++	/*
++	 * paranoia -- in case someone does a "lockstat reset" before
++	 * "lockstat on"
++	 */
++	if (lstat_control.hashtab) {
++		bzero(lstat_control.hashtab,
++			LSTAT_HASH_TABLE_SIZE * sizeof (short));
++		bzero(lstat_control.dir, LSTAT_MAX_STAT_INDEX *
++				sizeof (lstat_directory_entry_t));
++
++		for (cpu = 0; cpu < num_online_cpus(); cpu++) {
++			bzero(lstat_control.counts[cpu],
++				sizeof (lstat_cpu_counts_t));
++			bzero(lstat_control.read_lock_counts[cpu],
++				sizeof (lstat_read_lock_cpu_counts_t));
++		}
++	}
++#ifdef NOTDEF
++	_raw_spin_unlock(&lstat_control.directory_lock);
++	local_irq_restore(flags);
++#endif
++	return 1;
++}
++
++static void
++release_control_space(void)
++{
++	/*
++	 * Called when either (1) allocation of kmem
++	 * or (2) when user writes LSTAT_RELEASE to /pro/lockmeter.
++	 * Assume that all pointers have been initialized to zero,
++	 * i.e., nonzero pointers are valid addresses.
++	 */
++	int cpu;
++
++	if (lstat_control.hashtab) {
++		kfree(lstat_control.hashtab);
++		lstat_control.hashtab = NULL;
++	}
++
++	if (lstat_control.dir) {
++		vfree(lstat_control.dir);
++		lstat_control.dir = NULL;
++	}
++
++	for (cpu = 0; cpu < NR_CPUS; cpu++) {
++		if (lstat_control.counts[cpu]) {
++			vfree(lstat_control.counts[cpu]);
++			lstat_control.counts[cpu] = NULL;
++		}
++		if (lstat_control.read_lock_counts[cpu]) {
++			kfree(lstat_control.read_lock_counts[cpu]);
++			lstat_control.read_lock_counts[cpu] = NULL;
++		}
++	}
++}
++
++int
++get_lockmeter_info_size(void)
++{
++	return sizeof (lstat_user_request_t)
++		+ num_online_cpus() * sizeof (lstat_cpu_counts_t)
++		+ num_online_cpus() * sizeof (lstat_read_lock_cpu_counts_t)
++		+ (LSTAT_MAX_STAT_INDEX * sizeof (lstat_directory_entry_t));
++}
++
++ssize_t
++get_lockmeter_info(char *buffer, size_t max_len, loff_t * last_index)
++{
++	lstat_user_request_t req;
++	struct timeval tv;
++	ssize_t next_ret_bcount;
++	ssize_t actual_ret_bcount = 0;
++	int cpu;
++
++	*last_index = 0;	/* a one-shot read */
++
++	req.lstat_version = LSTAT_VERSION;
++	req.state = lstat_control.state;
++	req.maxcpus = num_online_cpus();
++	req.cycleval = CPU_CYCLE_FREQUENCY;
++#ifdef notyet
++	req.kernel_magic_addr = (void *) &_etext;
++	req.kernel_end_addr = (void *) &_etext;
++#endif
++	req.uts = system_utsname;
++	req.intervals = lstat_control.intervals;
++
++	req.first_started_time = lstat_control.first_started_time;
++	req.started_time = lstat_control.started_time;
++	req.started_cycles64 = lstat_control.started_cycles64;
++
++	req.next_free_dir_index = lstat_control.next_free_dir_index;
++	req.next_free_read_lock_index = lstat_control.next_free_read_lock_index;
++	req.dir_overflow = lstat_control.dir_overflow;
++	req.rwlock_overflow = lstat_control.rwlock_overflow;
++
++	if (lstat_control.state == LSTAT_OFF) {
++		if (req.intervals == 0) {
++			/* mesasurement is off and no valid data present */
++			next_ret_bcount = sizeof (lstat_user_request_t);
++			req.enabled_cycles64 = 0;
++
++			if ((actual_ret_bcount + next_ret_bcount) > max_len)
++				return actual_ret_bcount;
++
++			copy_to_user(buffer, (void *) &req, next_ret_bcount);
++			actual_ret_bcount += next_ret_bcount;
++			return actual_ret_bcount;
++		} else {
++			/*
++			 * measurement is off but valid data present
++			 * fetch time info from lstat_control
++			 */
++			req.ending_time = lstat_control.ending_time;
++			req.ending_cycles64 = lstat_control.ending_cycles64;
++			req.enabled_cycles64 = lstat_control.enabled_cycles64;
++		}
++	} else {
++		/*
++		 * this must be a read while data active--use current time,
++		 * etc
++		 */
++		do_gettimeofday(&tv);
++		req.ending_time = tv.tv_sec;
++		req.ending_cycles64 = get_cycles64();
++		req.enabled_cycles64 = req.ending_cycles64 -
++			req.started_cycles64 + lstat_control.enabled_cycles64;
++	}
++
++	next_ret_bcount = sizeof (lstat_user_request_t);
++	if ((actual_ret_bcount + next_ret_bcount) > max_len)
++		return actual_ret_bcount;
++
++	copy_to_user(buffer, (void *) &req, next_ret_bcount);
++	actual_ret_bcount += next_ret_bcount;
++
++	if (!lstat_control.counts[0])	/* not initialized? */
++		return actual_ret_bcount;
++
++	next_ret_bcount = sizeof (lstat_cpu_counts_t);
++	for (cpu = 0; cpu < num_online_cpus(); cpu++) {
++		if ((actual_ret_bcount + next_ret_bcount) > max_len)
++			return actual_ret_bcount;	/* leave early */
++		copy_to_user(buffer + actual_ret_bcount,
++				lstat_control.counts[cpu], next_ret_bcount);
++		actual_ret_bcount += next_ret_bcount;
++	}
++
++	next_ret_bcount = LSTAT_MAX_STAT_INDEX *
++			sizeof (lstat_directory_entry_t);
++	if (((actual_ret_bcount + next_ret_bcount) > max_len)
++			|| !lstat_control.dir)
++		return actual_ret_bcount;	/* leave early */
++
++	copy_to_user(buffer + actual_ret_bcount, lstat_control.dir,
++			next_ret_bcount);
++	actual_ret_bcount += next_ret_bcount;
++
++	next_ret_bcount = sizeof (lstat_read_lock_cpu_counts_t);
++	for (cpu = 0; cpu < num_online_cpus(); cpu++) {
++		if (actual_ret_bcount + next_ret_bcount > max_len)
++			return actual_ret_bcount;
++		copy_to_user(buffer + actual_ret_bcount,
++				lstat_control.read_lock_counts[cpu],
++				next_ret_bcount);
++		actual_ret_bcount += next_ret_bcount;
++	}
++
++	return actual_ret_bcount;
++}
++
++/*
++ *  Writing to the /proc lockmeter node enables or disables metering.
++ *  based upon the first byte of the "written" data.
++ *  The following values are defined:
++ *  LSTAT_ON: 1st call: allocates storage, intializes and turns on measurement
++ *            subsequent calls just turn on measurement
++ *  LSTAT_OFF: turns off measurement
++ *  LSTAT_RESET: resets statistics
++ *  LSTAT_RELEASE: releases statistics storage
++ *
++ *  This allows one to accumulate statistics over several lockstat runs:
++ *
++ *  lockstat on
++ *  lockstat off
++ *  ...repeat above as desired...
++ *  lockstat get
++ *  ...now start a new set of measurements...
++ *  lockstat reset
++ *  lockstat on
++ *  ...
++ *
++ */
++ssize_t
++put_lockmeter_info(const char *buffer, size_t len)
++{
++	int error = 0;
++	int dirsize, countsize, read_lock_countsize, hashsize;
++	int cpu;
++	char put_char;
++	int i, read_lock_blocks;
++	unsigned long flags;
++	rwlock_t *lock_ptr;
++	struct timeval tv;
++
++	if (len <= 0)
++		return -EINVAL;
++
++	_raw_spin_lock(&lstat_control.control_lock);
++
++	get_user(put_char, buffer);
++	switch (put_char) {
++
++	case LSTAT_OFF:
++		if (lstat_control.state != LSTAT_OFF) {
++			/*
++			 * To avoid seeing read lock hold times in an
++			 * inconsisent state, we have to follow this protocol
++			 * to turn off statistics
++			 */
++			local_irq_save(flags);
++			/*
++			 * getting this lock will stop any read lock block
++			 * allocations
++			 */
++			_raw_spin_lock(&lstat_control.directory_lock);
++			/*
++			 * keep any more read lock blocks from being
++			 * allocated
++			 */
++			lstat_control.state = LSTAT_OFF;
++			/* record how may read lock blocks there are */
++			read_lock_blocks =
++				lstat_control.next_free_read_lock_index;
++			_raw_spin_unlock(&lstat_control.directory_lock);
++			/* now go through the list of read locks */
++			cpu = THIS_CPU_NUMBER;
++			for (i = 1; i < read_lock_blocks; i++) {
++				lock_ptr =
++				    (*lstat_control.read_lock_counts[cpu])[i].
++				    lock_ptr;
++				/* is this saved lock address still valid? */
++				if (GET_RWINDEX(lock_ptr) == i) {
++					/*
++					 * lock address appears to still be
++					 * valid because we only hold one lock
++					 * at a time, this can't cause a
++					 * deadlock unless this is a lock held
++					 * as part of the current system call
++					 * path. At the moment there
++					 * are no READ mode locks held to get
++					 * here from user space, so we solve
++					 * this by skipping locks held in
++					 * write mode.
++					 */
++					if (RWLOCK_IS_WRITE_LOCKED(lock_ptr)) {
++						PUT_RWINDEX(lock_ptr, 0);
++						continue;
++					}
++					/*
++					 * now we know there are no read
++					 * holders of this lock! stop
++					 * statistics collection for this
++					 * lock
++					 */
++					_raw_write_lock(lock_ptr);
++					PUT_RWINDEX(lock_ptr, 0);
++					_raw_write_unlock(lock_ptr);
++				}
++				/*
++				 * it may still be possible for the hold time
++				 * sum to be negative e.g. if a lock is
++				 * reallocated while "busy" we will have to fix
++				 * this up in the data reduction program.
++				 */
++			}
++			local_irq_restore(flags);
++			lstat_control.intervals++;
++			lstat_control.ending_cycles64 = get_cycles64();
++			lstat_control.enabled_cycles64 +=
++				lstat_control.ending_cycles64 -
++				lstat_control.started_cycles64;
++			do_gettimeofday(&tv);
++			lstat_control.ending_time = tv.tv_sec;
++			/*
++			 * don't deallocate the structures -- we may do a
++			 * lockstat on to add to the data that is already
++			 * there. Use LSTAT_RELEASE to release storage
++			 */
++		} else {
++			error = -EBUSY;	/* already OFF */
++		}
++		break;
++
++	case LSTAT_ON:
++		if (lstat_control.state == LSTAT_OFF) {
++#ifdef DEBUG_LOCKMETER
++			printk("put_lockmeter_info(cpu=%d): LSTAT_ON\n",
++				THIS_CPU_NUMBER);
++#endif
++			lstat_control.next_free_dir_index = 1;	/* 0 is for overflows */
++
++			dirsize = LSTAT_MAX_STAT_INDEX *
++					sizeof (lstat_directory_entry_t);
++			hashsize =
++				(1 + LSTAT_HASH_TABLE_SIZE) * sizeof (ushort);
++			countsize = sizeof (lstat_cpu_counts_t);
++			read_lock_countsize =
++				sizeof (lstat_read_lock_cpu_counts_t);
++#ifdef DEBUG_LOCKMETER
++			printk(" dirsize:%d", dirsize);
++			printk(" hashsize:%d", hashsize);
++			printk(" countsize:%d", countsize);
++			printk(" read_lock_countsize:%d\n",
++				read_lock_countsize);
++#endif
++#ifdef DEBUG_LOCKMETER
++			{
++				int secs;
++				unsigned long cycles;
++				uint64_t cycles64;
++
++				do_gettimeofday(&tv);
++				secs = tv.tv_sec;
++				do {
++					do_gettimeofday(&tv);
++				} while (secs == tv.tv_sec);
++				cycles = get_cycles();
++				cycles64 = get_cycles64();
++				secs = tv.tv_sec;
++				do {
++					do_gettimeofday(&tv);
++				} while (secs == tv.tv_sec);
++				cycles = get_cycles() - cycles;
++				cycles64 = get_cycles64() - cycles;
++				printk("lockmeter: cycleFrequency:%d "
++					"cycles:%d cycles64:%d\n",
++					CPU_CYCLE_FREQUENCY, cycles, cycles64);
++			}
++#endif
++
++			/*
++			 * if this is the first call, allocate storage and
++			 * initialize
++			 */
++			if (!lstat_control.hashtab) {
++
++				spin_lock_init(&lstat_control.directory_lock);
++
++				/* guarantee all pointers at zero */
++				init_control_space();
++
++				lstat_control.hashtab =
++				    kmalloc(hashsize, GFP_KERNEL);
++				if (!lstat_control.hashtab) {
++					error = -ENOSPC;
++#ifdef DEBUG_LOCKMETER
++					printk("!!error kmalloc of hashtab\n");
++#endif
++				}
++				lstat_control.dir = vmalloc(dirsize);
++				if (!lstat_control.dir) {
++					error = -ENOSPC;
++#ifdef DEBUG_LOCKMETER
++					printk("!!error kmalloc of dir\n");
++#endif
++				}
++
++				for (cpu = 0; cpu < num_online_cpus(); cpu++) {
++					lstat_control.counts[cpu] =
++						vmalloc(countsize);
++					if (!lstat_control.counts[cpu]) {
++						error = -ENOSPC;
++#ifdef DEBUG_LOCKMETER
++						printk("!!error vmalloc of "
++							"counts[%d]\n", cpu);
++#endif
++					}
++					lstat_control.read_lock_counts[cpu] =
++						(lstat_read_lock_cpu_counts_t *)
++						kmalloc(read_lock_countsize,
++							GFP_KERNEL);
++					if (!lstat_control.
++							read_lock_counts[cpu]) {
++						error = -ENOSPC;
++#ifdef DEBUG_LOCKMETER
++						printk("!!error kmalloc of "
++						  "read_lock_counts[%d]\n",
++							cpu);
++#endif
++					}
++				}
++			}
++
++			if (error) {
++				/*
++				 * One or more kmalloc failures -- free
++				 * everything
++				 */
++				release_control_space();
++			} else {
++
++				if (!reset_lstat_data()) {
++					error = -EINVAL;
++					break;
++				};
++
++				/*
++				 * record starting and ending times and the
++				 * like
++				 */
++				if (lstat_control.intervals == 0) {
++					do_gettimeofday(&tv);
++					lstat_control.first_started_time =
++						tv.tv_sec;
++				}
++				lstat_control.started_cycles64 = get_cycles64();
++				do_gettimeofday(&tv);
++				lstat_control.started_time = tv.tv_sec;
++
++				lstat_control.state = LSTAT_ON;
++			}
++		} else {
++			error = -EBUSY;	/* already ON */
++		}
++		break;
++
++	case LSTAT_RESET:
++		if (lstat_control.state == LSTAT_OFF) {
++			if (!reset_lstat_data())
++				error = -EINVAL;
++		} else {
++			error = -EBUSY;	/* still on; can't reset */
++		}
++		break;
++
++	case LSTAT_RELEASE:
++		if (lstat_control.state == LSTAT_OFF) {
++			release_control_space();
++			lstat_control.intervals = 0;
++			lstat_control.enabled_cycles64 = 0;
++		} else {
++			error = -EBUSY;
++		}
++		break;
++
++	default:
++		error = -EINVAL;
++	}			/* switch */
++
++	_raw_spin_unlock(&lstat_control.control_lock);
++	return error ? error : len;
++}
++
++#ifdef USER_MODE_TESTING
++/* following used for user mode testing */
++void
++lockmeter_init()
++{
++	int dirsize, hashsize, countsize, read_lock_countsize, cpu;
++
++	printf("lstat_control is at %x size=%d\n", &lstat_control,
++		sizeof (lstat_control));
++	printf("sizeof(spinlock_t)=%d\n", sizeof (spinlock_t));
++	lstat_control.state = LSTAT_ON;
++
++	lstat_control.directory_lock = SPIN_LOCK_UNLOCKED;
++	lstat_control.next_free_dir_index = 1;	/* 0 is for overflows */
++	lstat_control.next_free_read_lock_index = 1;
++
++	dirsize = LSTAT_MAX_STAT_INDEX * sizeof (lstat_directory_entry_t);
++	hashsize = (1 + LSTAT_HASH_TABLE_SIZE) * sizeof (ushort);
++	countsize = sizeof (lstat_cpu_counts_t);
++	read_lock_countsize = sizeof (lstat_read_lock_cpu_counts_t);
++
++	lstat_control.hashtab = (ushort *) malloc(hashsize);
++
++	if (lstat_control.hashtab == 0) {
++		printf("malloc failure for at line %d in lockmeter.c\n",
++			__LINE__);
++		exit(0);
++	}
++
++	lstat_control.dir = (lstat_directory_entry_t *) malloc(dirsize);
++
++	if (lstat_control.dir == 0) {
++		printf("malloc failure for at line %d in lockmeter.c\n", cpu,
++			__LINE__);
++		exit(0);
++	}
++
++	for (cpu = 0; cpu < num_online_cpus(); cpu++) {
++		int j, k;
++		j = (int) (lstat_control.counts[cpu] =
++			   (lstat_cpu_counts_t *) malloc(countsize));
++		k = (int) (lstat_control.read_lock_counts[cpu] =
++			   (lstat_read_lock_cpu_counts_t *)
++			   malloc(read_lock_countsize));
++		if (j * k == 0) {
++			printf("malloc failure for cpu=%d at line %d in "
++				"lockmeter.c\n", cpu, __LINE__);
++			exit(0);
++		}
++	}
++
++	memset(lstat_control.hashtab, 0, hashsize);
++	memset(lstat_control.dir, 0, dirsize);
++
++	for (cpu = 0; cpu < num_online_cpus(); cpu++) {
++		memset(lstat_control.counts[cpu], 0, countsize);
++		memset(lstat_control.read_lock_counts[cpu], 0,
++			read_lock_countsize);
++	}
++}
++
++asm("
++.align	4
++.globl	__write_lock_failed
++__write_lock_failed:
++	" LOCK "addl	$" RW_LOCK_BIAS_STR ",(%eax)
++1:	cmpl	$" RW_LOCK_BIAS_STR ",(%eax)
++	jne	1b
++
++	" LOCK "subl	$" RW_LOCK_BIAS_STR ",(%eax)
++	jnz	__write_lock_failed
++	ret
++
++
++.align	4
++.globl	__read_lock_failed
++__read_lock_failed:
++	lock ; incl	(%eax)
++1:	cmpl	$1,(%eax)
++	js	1b
++
++	lock ; decl	(%eax)
++	js	__read_lock_failed
++	ret
++");
++#endif
+--- linux-2.6.0-test1/kernel/Makefile	2003-06-26 22:07:26.000000000 -0700
++++ 25/kernel/Makefile	2003-07-19 17:06:40.000000000 -0700
+@@ -11,6 +11,7 @@ obj-y     = sched.o fork.o exec_domain.o
+ obj-$(CONFIG_FUTEX) += futex.o
+ obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o
+ obj-$(CONFIG_SMP) += cpu.o
++obj-$(CONFIG_LOCKMETER) += lockmeter.o
+ obj-$(CONFIG_UID16) += uid16.o
+ obj-$(CONFIG_MODULES) += ksyms.o module.o
+ obj-$(CONFIG_KALLSYMS) += kallsyms.o
+--- linux-2.6.0-test1/kernel/module.c	2003-07-02 14:53:18.000000000 -0700
++++ 25/kernel/module.c	2003-07-19 17:04:07.000000000 -0700
+@@ -98,6 +98,17 @@ int init_module(void)
+ }
+ EXPORT_SYMBOL(init_module);
+ 
++/* A thread that wants to hold a reference to a module only while it
++ * is running can call ths to safely exit.
++ * nfsd and lockd use this.
++ */
++void __module_put_and_exit(struct module *mod, long code)
++{
++	module_put(mod);
++	do_exit(code);
++}
++EXPORT_SYMBOL(__module_put_and_exit);
++	
+ /* Find a module section: 0 means not found. */
+ static unsigned int find_sec(Elf_Ehdr *hdr,
+ 			     Elf_Shdr *sechdrs,
+@@ -374,9 +385,9 @@ static void module_unload_init(struct mo
+ 
+ 	INIT_LIST_HEAD(&mod->modules_which_use_me);
+ 	for (i = 0; i < NR_CPUS; i++)
+-		atomic_set(&mod->ref[i].count, 0);
++		local_set(&mod->ref[i].count, 0);
+ 	/* Hold reference count during initialization. */
+-	atomic_set(&mod->ref[smp_processor_id()].count, 1);
++	local_set(&mod->ref[smp_processor_id()].count, 1);
+ 	/* Backwards compatibility macros put refcount during init. */
+ 	mod->waiter = current;
+ }
+@@ -471,7 +482,7 @@ static int stopref(void *cpu)
+ 	struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
+ 	setscheduler(current->pid, SCHED_FIFO, &param);
+ #endif
+-	set_cpus_allowed(current, 1UL << (unsigned long)cpu);
++	set_cpus_allowed(current, cpumask_of_cpu((int)(long)cpu));
+ 
+ 	/* Ack: we are alive */
+ 	atomic_inc(&stopref_thread_ack);
+@@ -524,7 +535,7 @@ static void stopref_set_state(enum stopr
+ static int stop_refcounts(void)
+ {
+ 	unsigned int i, cpu;
+-	unsigned long old_allowed;
++	cpumask_t old_allowed;
+ 	int ret = 0;
+ 
+ 	/* One thread per cpu.  We'll do our own. */
+@@ -532,7 +543,7 @@ static int stop_refcounts(void)
+ 
+ 	/* FIXME: racy with set_cpus_allowed. */
+ 	old_allowed = current->cpus_allowed;
+-	set_cpus_allowed(current, 1UL << (unsigned long)cpu);
++	set_cpus_allowed(current, cpumask_of_cpu(cpu));
+ 
+ 	atomic_set(&stopref_thread_ack, 0);
+ 	stopref_num_threads = 0;
+@@ -599,7 +610,7 @@ unsigned int module_refcount(struct modu
+ 	unsigned int i, total = 0;
+ 
+ 	for (i = 0; i < NR_CPUS; i++)
+-		total += atomic_read(&mod->ref[i].count);
++		total += local_read(&mod->ref[i].count);
+ 	return total;
+ }
+ EXPORT_SYMBOL(module_refcount);
+@@ -610,7 +621,10 @@ static void free_module(struct module *m
+ #ifdef CONFIG_MODULE_FORCE_UNLOAD
+ static inline int try_force(unsigned int flags)
+ {
+-	return (flags & O_TRUNC);
++	int ret = (flags & O_TRUNC);
++	if (ret)
++		tainted |= TAINT_FORCED_MODULE;
++	return ret;
+ }
+ #else
+ static inline int try_force(unsigned int flags)
+--- linux-2.6.0-test1/kernel/printk.c	2003-07-02 14:53:18.000000000 -0700
++++ 25/kernel/printk.c	2003-07-19 17:07:04.000000000 -0700
+@@ -399,9 +399,13 @@ asmlinkage int printk(const char *fmt, .
+ 	char *p;
+ 	static char printk_buf[1024];
+ 	static int log_level_unknown = 1;
++	static int printk_cpu = -1;
+ 
+-	if (oops_in_progress) {
+-		/* If a crash is occurring, make sure we can't deadlock */
++	if (oops_in_progress && printk_cpu == smp_processor_id()) {
++		/*
++		 * If a crash is occurring during printk() on this CPU, make
++		 * sure we can't deadlock
++		 */
+ 		spin_lock_init(&logbuf_lock);
+ 		/* And make sure that we print immediately */
+ 		init_MUTEX(&console_sem);
+@@ -409,6 +413,7 @@ asmlinkage int printk(const char *fmt, .
+ 
+ 	/* This stops the holder of console_sem just where we want him */
+ 	spin_lock_irqsave(&logbuf_lock, flags);
++	printk_cpu = smp_processor_id();
+ 
+ 	/* Emit the output into the temporary buffer */
+ 	va_start(args, fmt);
+--- linux-2.6.0-test1/kernel/profile.c	2003-06-14 12:18:34.000000000 -0700
++++ 25/kernel/profile.c	2003-07-19 17:03:51.000000000 -0700
+@@ -8,8 +8,7 @@
+ #include <linux/bootmem.h>
+ #include <linux/notifier.h>
+ #include <linux/mm.h>
+-
+-extern char _stext, _etext;
++#include <asm/sections.h>
+ 
+ unsigned int * prof_buffer;
+ unsigned long prof_len;
+@@ -36,7 +35,7 @@ void __init profile_init(void)
+ 		return;
+  
+ 	/* only text is profiled */
+-	prof_len = (unsigned long) &_etext - (unsigned long) &_stext;
++	prof_len = _etext - _stext;
+ 	prof_len >>= prof_shift;
+ 		
+ 	size = prof_len * sizeof(unsigned int) + PAGE_SIZE - 1;
+--- linux-2.6.0-test1/kernel/rcupdate.c	2003-06-26 22:07:26.000000000 -0700
++++ 25/kernel/rcupdate.c	2003-07-19 17:04:56.000000000 -0700
+@@ -41,6 +41,7 @@
+ #include <linux/module.h>
+ #include <linux/completion.h>
+ #include <linux/percpu.h>
++#include <linux/seq_file.h>
+ #include <linux/notifier.h>
+ #include <linux/rcupdate.h>
+ #include <linux/cpu.h>
+@@ -48,7 +49,7 @@
+ /* Definition for rcupdate control block. */
+ struct rcu_ctrlblk rcu_ctrlblk = 
+ 	{ .mutex = SPIN_LOCK_UNLOCKED, .curbatch = 1, 
+-	  .maxbatch = 1, .rcu_cpu_mask = 0 };
++	  .maxbatch = 1, .rcu_cpu_mask = CPU_MASK_NONE };
+ DEFINE_PER_CPU(struct rcu_data, rcu_data) = { 0L };
+ 
+ /* Fake initialization required by compiler */
+@@ -76,6 +77,7 @@ void call_rcu(struct rcu_head *head, voi
+ 	local_irq_save(flags);
+ 	cpu = smp_processor_id();
+ 	list_add_tail(&head->list, &RCU_nxtlist(cpu));
++	RCU_nr_rcureqs(cpu)++;
+ 	local_irq_restore(flags);
+ }
+ 
+@@ -83,7 +85,7 @@ void call_rcu(struct rcu_head *head, voi
+  * Invoke the completed RCU callbacks. They are expected to be in
+  * a per-cpu list.
+  */
+-static void rcu_do_batch(struct list_head *list)
++static void rcu_do_batch(int cpu, struct list_head *list)
+ {
+ 	struct list_head *entry;
+ 	struct rcu_head *head;
+@@ -93,6 +95,7 @@ static void rcu_do_batch(struct list_hea
+ 		list_del(entry);
+ 		head = list_entry(entry, struct rcu_head, list);
+ 		head->func(head->arg);
++		RCU_nr_rcupdates(cpu)++;
+ 	}
+ }
+ 
+@@ -107,7 +110,7 @@ static void rcu_start_batch(long newbatc
+ 		rcu_ctrlblk.maxbatch = newbatch;
+ 	}
+ 	if (rcu_batch_before(rcu_ctrlblk.maxbatch, rcu_ctrlblk.curbatch) ||
+-	    (rcu_ctrlblk.rcu_cpu_mask != 0)) {
++	    !cpus_empty(rcu_ctrlblk.rcu_cpu_mask)) {
+ 		return;
+ 	}
+ 	rcu_ctrlblk.rcu_cpu_mask = cpu_online_map;
+@@ -122,7 +125,7 @@ static void rcu_check_quiescent_state(vo
+ {
+ 	int cpu = smp_processor_id();
+ 
+-	if (!test_bit(cpu, &rcu_ctrlblk.rcu_cpu_mask))
++	if (!cpu_isset(cpu, rcu_ctrlblk.rcu_cpu_mask))
+ 		return;
+ 
+ 	/* 
+@@ -138,12 +141,12 @@ static void rcu_check_quiescent_state(vo
+ 		return;
+ 
+ 	spin_lock(&rcu_ctrlblk.mutex);
+-	if (!test_bit(cpu, &rcu_ctrlblk.rcu_cpu_mask))
++	if (!cpu_isset(cpu, rcu_ctrlblk.rcu_cpu_mask))
+ 		goto out_unlock;
+ 
+-	clear_bit(cpu, &rcu_ctrlblk.rcu_cpu_mask);
++	cpu_clear(cpu, rcu_ctrlblk.rcu_cpu_mask);
+ 	RCU_last_qsctr(cpu) = RCU_QSCTR_INVALID;
+-	if (rcu_ctrlblk.rcu_cpu_mask != 0)
++	if (!cpus_empty(rcu_ctrlblk.rcu_cpu_mask))
+ 		goto out_unlock;
+ 
+ 	rcu_ctrlblk.curbatch++;
+@@ -186,7 +189,7 @@ static void rcu_process_callbacks(unsign
+ 	}
+ 	rcu_check_quiescent_state();
+ 	if (!list_empty(&list))
+-		rcu_do_batch(&list);
++		rcu_do_batch(cpu, &list);
+ }
+ 
+ void rcu_check_callbacks(int cpu, int user)
+@@ -265,3 +268,44 @@ void synchronize_kernel(void)
+ 
+ EXPORT_SYMBOL(call_rcu);
+ EXPORT_SYMBOL(synchronize_kernel);
++
++#ifdef	CONFIG_PROC_FS
++
++static void *rcu_start(struct seq_file *m, loff_t *pos)
++{
++	static int cpu;
++	cpu = *pos;
++	return *pos < NR_CPUS ? &cpu : NULL;
++}
++
++static void *rcu_next(struct seq_file *m, void *v, loff_t *pos)
++{
++	++*pos;
++	return rcu_start(m, pos);
++}
++
++static void rcu_stop(struct seq_file *m, void *v)
++{
++}
++
++static int show_rcu(struct seq_file *m, void *v)
++{
++	int cpu = *(int *)v;
++
++	if (!cpu_online(cpu))
++		return 0;
++	seq_printf(m, "CPU : %d\n", cpu);
++	seq_printf(m, "RCU requests : %ld\n", RCU_nr_rcureqs(cpu));
++	seq_printf(m, "RCU updates : %ld\n\n", RCU_nr_rcupdates(cpu));
++	return 0;
++}
++
++struct seq_operations rcu_op = {
++	.start	= rcu_start,
++	.next	= rcu_next,
++	.stop	= rcu_stop,
++	.show	= show_rcu,
++};
++
++#endif
++
+--- linux-2.6.0-test1/kernel/sched.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/kernel/sched.c	2003-07-19 17:07:14.000000000 -0700
+@@ -68,14 +68,16 @@
+  */
+ #define MIN_TIMESLICE		( 10 * HZ / 1000)
+ #define MAX_TIMESLICE		(200 * HZ / 1000)
+-#define CHILD_PENALTY		50
++#define CHILD_PENALTY		95
+ #define PARENT_PENALTY		100
+ #define EXIT_WEIGHT		3
+ #define PRIO_BONUS_RATIO	25
+ #define INTERACTIVE_DELTA	2
++#define MIN_SLEEP_AVG		(HZ)
+ #define MAX_SLEEP_AVG		(10*HZ)
+ #define STARVATION_LIMIT	(10*HZ)
+ #define NODE_THRESHOLD		125
++#define MAX_BONUS		(MAX_USER_PRIO * PRIO_BONUS_RATIO / 100)
+ 
+ /*
+  * If a task is 'interactive' then we reinsert it in the active
+@@ -176,7 +178,7 @@ struct runqueue {
+ static DEFINE_PER_CPU(struct runqueue, runqueues);
+ 
+ #define cpu_rq(cpu)		(&per_cpu(runqueues, (cpu)))
+-#define this_rq()		(&__get_cpu_var(runqueues))
++#define this_rq()		(cpu_rq(smp_processor_id())) /* not __get_cpu_var(runqueues)! */
+ #define task_rq(p)		cpu_rq(task_cpu(p))
+ #define cpu_curr(cpu)		(cpu_rq(cpu)->curr)
+ #define rt_task(p)		((p)->prio < MAX_RT_PRIO)
+@@ -297,6 +299,26 @@ static inline void enqueue_task(struct t
+ 	array->nr_active++;
+ 	p->array = array;
+ }
++/*
++ * normalise_sleep converts a task's sleep_avg to
++ * an appropriate proportion of MIN_SLEEP_AVG.
++ */
++static inline void normalise_sleep(task_t *p)
++{
++	unsigned long old_avg_time = jiffies - p->avg_start;
++
++	if (unlikely(old_avg_time < MIN_SLEEP_AVG))
++		return;
++
++	if (p->sleep_avg > MAX_SLEEP_AVG)
++		p->sleep_avg = MAX_SLEEP_AVG;
++
++	if (old_avg_time > MAX_SLEEP_AVG)
++		old_avg_time = MAX_SLEEP_AVG;
++
++	p->sleep_avg = p->sleep_avg * MIN_SLEEP_AVG / old_avg_time;
++	p->avg_start = jiffies - MIN_SLEEP_AVG;
++}
+ 
+ /*
+  * effective_prio - return the priority that is based on the static
+@@ -315,11 +337,28 @@ static inline void enqueue_task(struct t
+ static int effective_prio(task_t *p)
+ {
+ 	int bonus, prio;
++	unsigned long sleep_period;
+ 
+ 	if (rt_task(p))
+ 		return p->prio;
+ 
+-	bonus = MAX_USER_PRIO*PRIO_BONUS_RATIO*p->sleep_avg/MAX_SLEEP_AVG/100 -
++	sleep_period = jiffies - p->avg_start;
++
++	if (unlikely(!sleep_period))
++		return p->static_prio;
++
++	if (sleep_period > MAX_SLEEP_AVG)
++		sleep_period = MAX_SLEEP_AVG;
++
++	if (p->sleep_avg > sleep_period)
++		sleep_period = p->sleep_avg;
++
++	/*
++	 * The bonus is determined according to the accumulated
++	 * sleep avg over the duration the task has been running
++	 * until it reaches MAX_SLEEP_AVG. -ck
++	 */
++	bonus = MAX_USER_PRIO*PRIO_BONUS_RATIO*p->sleep_avg/sleep_period/100 -
+ 			MAX_USER_PRIO*PRIO_BONUS_RATIO/100/2;
+ 
+ 	prio = p->static_prio - bonus;
+@@ -350,31 +389,47 @@ static inline void activate_task(task_t 
+ 	long sleep_time = jiffies - p->last_run - 1;
+ 
+ 	if (sleep_time > 0) {
+-		int sleep_avg;
+-
+ 		/*
+-		 * This code gives a bonus to interactive tasks.
+-		 *
+-		 * The boost works by updating the 'average sleep time'
+-		 * value here, based on ->last_run. The more time a task
+-		 * spends sleeping, the higher the average gets - and the
+-		 * higher the priority boost gets as well.
++		 * User tasks that sleep a long time are categorised as idle and
++		 * will get just under interactive status with a small runtime
++		 * to allow them to become interactive or non-interactive rapidly
+ 		 */
+-		sleep_avg = p->sleep_avg + sleep_time;
++		if (sleep_time > MIN_SLEEP_AVG && p->mm){
++			p->avg_start = jiffies - MIN_SLEEP_AVG;
++			p->sleep_avg = MIN_SLEEP_AVG * (MAX_BONUS - INTERACTIVE_DELTA - 2) /
++				MAX_BONUS;
++		} else {
++			unsigned long runtime = jiffies - p->avg_start;
+ 
+-		/*
+-		 * 'Overflow' bonus ticks go to the waker as well, so the
+-		 * ticks are not lost. This has the effect of further
+-		 * boosting tasks that are related to maximum-interactive
+-		 * tasks.
+-		 */
+-		if (sleep_avg > MAX_SLEEP_AVG)
+-			sleep_avg = MAX_SLEEP_AVG;
+-		if (p->sleep_avg != sleep_avg) {
+-			p->sleep_avg = sleep_avg;
+-			p->prio = effective_prio(p);
++			if (runtime > MAX_SLEEP_AVG)
++				runtime = MAX_SLEEP_AVG;
++
++			/*
++			 * This code gives a bonus to interactive tasks.
++			 *
++			 * The boost works by updating the 'average sleep time'
++			 * value here, based on ->last_run. The more time a task
++			 * spends sleeping, the higher the average gets - and the
++			 * higher the priority boost gets as well.
++			 */
++			p->sleep_avg += sleep_time;
++
++			/*
++			 * Processes that sleep get pushed to a higher priority
++			 * each time they sleep
++			 */
++			p->sleep_avg = (p->sleep_avg * MAX_BONUS / runtime + 1) * runtime / MAX_BONUS;
++
++			if (p->sleep_avg > MAX_SLEEP_AVG)
++				p->sleep_avg = MAX_SLEEP_AVG;
++		}
++
++		if (unlikely(p->avg_start > jiffies)){
++			p->avg_start = jiffies;
++			p->sleep_avg = 0;
+ 		}
+ 	}
++	p->prio = effective_prio(p);
+ 	__activate_task(p, rq);
+ }
+ 
+@@ -489,7 +544,7 @@ repeat_lock_task:
+ 			 */
+ 			if (unlikely(sync && !task_running(rq, p) &&
+ 				(task_cpu(p) != smp_processor_id()) &&
+-				(p->cpus_allowed & (1UL << smp_processor_id())))) {
++				cpu_isset(smp_processor_id(), p->cpus_allowed))) {
+ 
+ 				set_task_cpu(p, smp_processor_id());
+ 				task_rq_unlock(rq, &flags);
+@@ -551,6 +606,7 @@ void wake_up_forked_process(task_t * p)
+ 	 * from forking tasks that are max-interactive.
+ 	 */
+ 	current->sleep_avg = current->sleep_avg * PARENT_PENALTY / 100;
++	normalise_sleep(p);
+ 	p->sleep_avg = p->sleep_avg * CHILD_PENALTY / 100;
+ 	p->prio = effective_prio(p);
+ 	set_task_cpu(p, smp_processor_id());
+@@ -591,6 +647,8 @@ void sched_exit(task_t * p)
+ 	 * If the child was a (relative-) CPU hog then decrease
+ 	 * the sleep_avg of the parent as well.
+ 	 */
++	normalise_sleep(p);
++	normalise_sleep(p->parent);
+ 	if (p->sleep_avg < p->parent->sleep_avg)
+ 		p->parent->sleep_avg = (p->parent->sleep_avg * EXIT_WEIGHT +
+ 			p->sleep_avg) / (EXIT_WEIGHT + 1);
+@@ -758,13 +816,13 @@ static inline void double_rq_unlock(runq
+  */
+ static void sched_migrate_task(task_t *p, int dest_cpu)
+ {
+-	unsigned long old_mask;
++	cpumask_t old_mask;
+ 
+ 	old_mask = p->cpus_allowed;
+-	if (!(old_mask & (1UL << dest_cpu)))
++	if (!cpu_isset(dest_cpu, old_mask))
+ 		return;
+ 	/* force the process onto the specified CPU */
+-	set_cpus_allowed(p, 1UL << dest_cpu);
++	set_cpus_allowed(p, cpumask_of_cpu(dest_cpu));
+ 
+ 	/* restore the cpus allowed mask */
+ 	set_cpus_allowed(p, old_mask);
+@@ -777,7 +835,7 @@ static void sched_migrate_task(task_t *p
+ static int sched_best_cpu(struct task_struct *p)
+ {
+ 	int i, minload, load, best_cpu, node = 0;
+-	unsigned long cpumask;
++	cpumask_t cpumask;
+ 
+ 	best_cpu = task_cpu(p);
+ 	if (cpu_rq(best_cpu)->nr_running <= 2)
+@@ -801,7 +859,7 @@ static int sched_best_cpu(struct task_st
+ 	minload = 10000000;
+ 	cpumask = node_to_cpumask(node);
+ 	for (i = 0; i < NR_CPUS; ++i) {
+-		if (!(cpumask & (1UL << i)))
++		if (!cpu_isset(i, cpumask))
+ 			continue;
+ 		if (cpu_rq(i)->nr_running < minload) {
+ 			best_cpu = i;
+@@ -888,7 +946,7 @@ static inline unsigned int double_lock_b
+ /*
+  * find_busiest_queue - find the busiest runqueue among the cpus in cpumask.
+  */
+-static inline runqueue_t *find_busiest_queue(runqueue_t *this_rq, int this_cpu, int idle, int *imbalance, unsigned long cpumask)
++static inline runqueue_t *find_busiest_queue(runqueue_t *this_rq, int this_cpu, int idle, int *imbalance, cpumask_t cpumask)
+ {
+ 	int nr_running, load, max_load, i;
+ 	runqueue_t *busiest, *rq_src;
+@@ -923,7 +981,7 @@ static inline runqueue_t *find_busiest_q
+ 	busiest = NULL;
+ 	max_load = 1;
+ 	for (i = 0; i < NR_CPUS; i++) {
+-		if (!((1UL << i) & cpumask))
++		if (!cpu_isset(i, cpumask))
+ 			continue;
+ 
+ 		rq_src = cpu_rq(i);
+@@ -942,10 +1000,10 @@ static inline runqueue_t *find_busiest_q
+ 	if (likely(!busiest))
+ 		goto out;
+ 
+-	*imbalance = (max_load - nr_running) / 2;
++	*imbalance = max_load - nr_running;
+ 
+ 	/* It needs an at least ~25% imbalance to trigger balancing. */
+-	if (!idle && (*imbalance < (max_load + 3)/4)) {
++	if (!idle && ((*imbalance)*4 < max_load)) {
+ 		busiest = NULL;
+ 		goto out;
+ 	}
+@@ -955,7 +1013,7 @@ static inline runqueue_t *find_busiest_q
+ 	 * Make sure nothing changed since we checked the
+ 	 * runqueue length.
+ 	 */
+-	if (busiest->nr_running <= nr_running + 1) {
++	if (busiest->nr_running <= nr_running) {
+ 		spin_unlock(&busiest->lock);
+ 		busiest = NULL;
+ 	}
+@@ -995,7 +1053,7 @@ static inline void pull_task(runqueue_t 
+  * We call this with the current runqueue locked,
+  * irqs disabled.
+  */
+-static void load_balance(runqueue_t *this_rq, int idle, unsigned long cpumask)
++static void load_balance(runqueue_t *this_rq, int idle, cpumask_t cpumask)
+ {
+ 	int imbalance, idx, this_cpu = smp_processor_id();
+ 	runqueue_t *busiest;
+@@ -1008,6 +1066,12 @@ static void load_balance(runqueue_t *thi
+ 		goto out;
+ 
+ 	/*
++	 * We only want to steal a number of tasks equal to 1/2 the imbalance,
++	 * otherwise we'll just shift the imbalance to the new queue:
++	 */
++	imbalance /= 2;
++
++	/*
+ 	 * We first consider expired tasks. Those will likely not be
+ 	 * executed in the near future, and they are most likely to
+ 	 * be cache-cold, thus switching CPUs has the least effect
+@@ -1049,7 +1113,7 @@ skip_queue:
+ #define CAN_MIGRATE_TASK(p,rq,this_cpu)					\
+ 	((!idle || (jiffies - (p)->last_run > cache_decay_ticks)) &&	\
+ 		!task_running(rq, p) &&					\
+-			((p)->cpus_allowed & (1UL << (this_cpu))))
++			cpu_isset(this_cpu, (p)->cpus_allowed))
+ 
+ 	curr = curr->prev;
+ 
+@@ -1092,10 +1156,10 @@ out:
+ static void balance_node(runqueue_t *this_rq, int idle, int this_cpu)
+ {
+ 	int node = find_busiest_node(cpu_to_node(this_cpu));
+-	unsigned long cpumask, this_cpumask = 1UL << this_cpu;
+ 
+ 	if (node >= 0) {
+-		cpumask = node_to_cpumask(node) | this_cpumask;
++		cpumask_t cpumask = node_to_cpumask(node);
++		cpu_set(this_cpu, cpumask);
+ 		spin_lock(&this_rq->lock);
+ 		load_balance(this_rq, idle, cpumask);
+ 		spin_unlock(&this_rq->lock);
+@@ -1207,11 +1271,7 @@ void scheduler_tick(int user_ticks, int 
+ 	spin_lock(&rq->lock);
+ 	/*
+ 	 * The task was running during this tick - update the
+-	 * time slice counter and the sleep average. Note: we
+-	 * do not update a thread's priority until it either
+-	 * goes to sleep or uses up its timeslice. This makes
+-	 * it possible for interactive tasks to use up their
+-	 * timeslices at their highest priority levels.
++	 * time slice counter and the sleep average.
+ 	 */
+ 	if (p->sleep_avg)
+ 		p->sleep_avg--;
+@@ -1244,6 +1304,17 @@ void scheduler_tick(int user_ticks, int 
+ 			enqueue_task(p, rq->expired);
+ 		} else
+ 			enqueue_task(p, rq->active);
++	} else if (p->mm && !((task_timeslice(p) - p->time_slice) %
++		 (MIN_TIMESLICE * (MAX_BONUS + 1 - p->sleep_avg * MAX_BONUS / MAX_SLEEP_AVG)))){
++		/*
++		 * Running user tasks get requeued with their remaining timeslice
++		 * after a period proportional to how cpu intensive they are to
++		 * minimise the duration one interactive task can starve another
++		 */
++		dequeue_task(p, rq->active);
++		set_tsk_need_resched(p);
++		p->prio = effective_prio(p);
++		enqueue_task(p, rq->active);
+ 	}
+ out_unlock:
+ 	spin_unlock(&rq->lock);
+@@ -1606,6 +1677,13 @@ out_unlock:
+ 	task_rq_unlock(rq, &flags);
+ }
+ 
++#if defined( CONFIG_KGDB) 
++struct task_struct * kgdb_get_idle(int this_cpu)
++{
++        return cpu_rq(this_cpu)->idle;
++}
++#endif
++
+ #ifndef __alpha__
+ 
+ /*
+@@ -1898,7 +1976,7 @@ out_unlock:
+ asmlinkage long sys_sched_setaffinity(pid_t pid, unsigned int len,
+ 				      unsigned long __user *user_mask_ptr)
+ {
+-	unsigned long new_mask;
++	cpumask_t new_mask;
+ 	int retval;
+ 	task_t *p;
+ 
+@@ -1946,7 +2024,7 @@ asmlinkage long sys_sched_getaffinity(pi
+ 				      unsigned long __user *user_mask_ptr)
+ {
+ 	unsigned int real_len;
+-	unsigned long mask;
++	cpumask_t mask;
+ 	int retval;
+ 	task_t *p;
+ 
+@@ -1962,7 +2040,7 @@ asmlinkage long sys_sched_getaffinity(pi
+ 		goto out_unlock;
+ 
+ 	retval = 0;
+-	mask = p->cpus_allowed & cpu_online_map;
++	cpus_and(mask, p->cpus_allowed, cpu_online_map);
+ 
+ out_unlock:
+ 	read_unlock(&tasklist_lock);
+@@ -2080,7 +2158,7 @@ asmlinkage long sys_sched_get_priority_m
+ }
+ 
+ /**
+- * sys_sched_get_priority_mix - return minimum RT priority.
++ * sys_sched_get_priority_min - return minimum RT priority.
+  * @policy: scheduling class.
+  *
+  * this syscall returns the minimum rt_priority that can be used
+@@ -2159,17 +2237,16 @@ static inline struct task_struct *younge
+ 
+ static void show_task(task_t * p)
+ {
+-	unsigned long free = 0;
+ 	task_t *relative;
+-	int state;
+-	static const char * stat_nam[] = { "R", "S", "D", "T", "Z", "W" };
++	unsigned state;
++	static const char *stat_nam[] = { "R", "S", "D", "T", "Z", "W" };
+ 
+ 	printk("%-13.13s ", p->comm);
+ 	state = p->state ? __ffs(p->state) + 1 : 0;
+-	if (((unsigned) state) < sizeof(stat_nam)/sizeof(char *))
++	if (state < ARRAY_SIZE(stat_nam))
+ 		printk(stat_nam[state]);
+ 	else
+-		printk(" ");
++		printk("?");
+ #if (BITS_PER_LONG == 32)
+ 	if (p == current)
+ 		printk(" current  ");
+@@ -2181,13 +2258,7 @@ static void show_task(task_t * p)
+ 	else
+ 		printk(" %016lx ", thread_saved_pc(p));
+ #endif
+-	{
+-		unsigned long * n = (unsigned long *) (p->thread_info+1);
+-		while (!*n)
+-			n++;
+-		free = (unsigned long) n - (unsigned long)(p+1);
+-	}
+-	printk("%5lu %5d %6d ", free, p->pid, p->parent->pid);
++	printk("%5d %6d ", p->pid, p->parent->pid);
+ 	if ((relative = eldest_child(p)))
+ 		printk("%5d ", relative->pid);
+ 	else
+@@ -2214,12 +2285,12 @@ void show_state(void)
+ 
+ #if (BITS_PER_LONG == 32)
+ 	printk("\n"
+-	       "                         free                        sibling\n");
+-	printk("  task             PC    stack   pid father child younger older\n");
++	       "                                               sibling\n");
++	printk("  task             PC      pid father child younger older\n");
+ #else
+ 	printk("\n"
+-	       "                                 free                        sibling\n");
+-	printk("  task                 PC        stack   pid father child younger older\n");
++	       "                                                       sibling\n");
++	printk("  task                 PC          pid father child younger older\n");
+ #endif
+ 	read_lock(&tasklist_lock);
+ 	do_each_thread(g, p) {
+@@ -2292,7 +2363,7 @@ typedef struct {
+  * task must not exit() & deallocate itself prematurely.  The
+  * call is not atomic; no spinlocks may be held.
+  */
+-int set_cpus_allowed(task_t *p, unsigned long new_mask)
++int set_cpus_allowed(task_t *p, cpumask_t new_mask)
+ {
+ 	unsigned long flags;
+ 	migration_req_t req;
+@@ -2307,7 +2378,7 @@ int set_cpus_allowed(task_t *p, unsigned
+ 	 * Can the task run on the task's current CPU? If not then
+ 	 * migrate the thread off to a proper CPU.
+ 	 */
+-	if (new_mask & (1UL << task_cpu(p))) {
++	if (cpu_isset(task_cpu(p), new_mask)) {
+ 		task_rq_unlock(rq, &flags);
+ 		return 0;
+ 	}
+@@ -2377,7 +2448,7 @@ static int migration_thread(void * data)
+ 	 * migration thread on this CPU, guaranteed (we're started
+ 	 * serially).
+ 	 */
+-	set_cpus_allowed(current, 1UL << cpu);
++	set_cpus_allowed(current, cpumask_of_cpu(cpu));
+ 
+ 	ret = setscheduler(0, SCHED_FIFO, &param);
+ 
+@@ -2541,7 +2612,7 @@ void __might_sleep(char *file, int line)
+ 		if (time_before(jiffies, prev_jiffy + HZ))
+ 			return;
+ 		prev_jiffy = jiffies;
+-		printk(KERN_ERR "Debug: sleeping function called from illegal"
++		printk(KERN_ERR "Debug: sleeping function called from invalid"
+ 				" context at %s:%d\n", file, line);
+ 		dump_stack();
+ 	}
+--- linux-2.6.0-test1/kernel/softirq.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/kernel/softirq.c	2003-07-19 17:04:53.000000000 -0700
+@@ -59,11 +59,22 @@ static inline void wakeup_softirqd(void)
+ 		wake_up_process(tsk);
+ }
+ 
++/*
++ * We restart softirq processing MAX_SOFTIRQ_RESTART times,
++ * and we fall back to softirqd after that.
++ *
++ * This number has been established via experimentation.
++ * The two things to balance is latency against fairness -
++ * we want to handle softirqs as soon as possible, but they
++ * should not be able to lock up the box.
++ */
++#define MAX_SOFTIRQ_RESTART 10
++
+ asmlinkage void do_softirq(void)
+ {
++	int max_restart = MAX_SOFTIRQ_RESTART;
+ 	__u32 pending;
+ 	unsigned long flags;
+-	__u32 mask;
+ 
+ 	if (in_interrupt())
+ 		return;
+@@ -75,7 +86,6 @@ asmlinkage void do_softirq(void)
+ 	if (pending) {
+ 		struct softirq_action *h;
+ 
+-		mask = ~pending;
+ 		local_bh_disable();
+ restart:
+ 		/* Reset the pending bitmask before enabling irqs */
+@@ -95,10 +105,8 @@ restart:
+ 		local_irq_disable();
+ 
+ 		pending = local_softirq_pending();
+-		if (pending & mask) {
+-			mask &= ~pending;
++		if (pending && --max_restart)
+ 			goto restart;
+-		}
+ 		if (pending)
+ 			wakeup_softirqd();
+ 		__local_bh_enable();
+@@ -322,9 +330,8 @@ static int ksoftirqd(void * __bind_cpu)
+ 	current->flags |= PF_IOTHREAD;
+ 
+ 	/* Migrate to the right CPU */
+-	set_cpus_allowed(current, 1UL << cpu);
+-	if (smp_processor_id() != cpu)
+-		BUG();
++	set_cpus_allowed(current, cpumask_of_cpu(cpu));
++	BUG_ON(smp_processor_id() != cpu);
+ 
+ 	__set_current_state(TASK_INTERRUPTIBLE);
+ 	mb();
+--- linux-2.6.0-test1/kernel/suspend.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/kernel/suspend.c	2003-07-19 17:03:51.000000000 -0700
+@@ -52,7 +52,6 @@
+ #include <linux/genhd.h>
+ #include <linux/kernel.h>
+ #include <linux/major.h>
+-#include <linux/blk.h>
+ #include <linux/swap.h>
+ #include <linux/pm.h>
+ #include <linux/device.h>
+--- linux-2.6.0-test1/kernel/sys.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/kernel/sys.c	2003-07-19 17:03:51.000000000 -0700
+@@ -601,6 +601,14 @@ static int set_user(uid_t new_ruid, int 
+ 	new_user = alloc_uid(new_ruid);
+ 	if (!new_user)
+ 		return -EAGAIN;
++
++	if (atomic_read(&new_user->processes) >=
++				current->rlim[RLIMIT_NPROC].rlim_cur &&
++			new_user != &root_user) {
++		free_uid(new_user);
++		return -EAGAIN;
++	}
++
+ 	switch_uid(new_user);
+ 
+ 	if(dumpclear)
+@@ -1159,6 +1167,7 @@ asmlinkage long sys_newuname(struct new_
+ asmlinkage long sys_sethostname(char __user *name, int len)
+ {
+ 	int errno;
++	char tmp[__NEW_UTS_LEN];
+ 
+ 	if (!capable(CAP_SYS_ADMIN))
+ 		return -EPERM;
+@@ -1166,7 +1175,8 @@ asmlinkage long sys_sethostname(char __u
+ 		return -EINVAL;
+ 	down_write(&uts_sem);
+ 	errno = -EFAULT;
+-	if (!copy_from_user(system_utsname.nodename, name, len)) {
++	if (!copy_from_user(tmp, name, len)) {
++		memcpy(system_utsname.nodename, tmp, len);
+ 		system_utsname.nodename[len] = 0;
+ 		errno = 0;
+ 	}
+@@ -1198,6 +1208,7 @@ asmlinkage long sys_gethostname(char __u
+ asmlinkage long sys_setdomainname(char __user *name, int len)
+ {
+ 	int errno;
++	char tmp[__NEW_UTS_LEN];
+ 
+ 	if (!capable(CAP_SYS_ADMIN))
+ 		return -EPERM;
+@@ -1206,9 +1217,10 @@ asmlinkage long sys_setdomainname(char _
+ 
+ 	down_write(&uts_sem);
+ 	errno = -EFAULT;
+-	if (!copy_from_user(system_utsname.domainname, name, len)) {
+-		errno = 0;
++	if (!copy_from_user(tmp, name, len)) {
++		memcpy(system_utsname.domainname, tmp, len);
+ 		system_utsname.domainname[len] = 0;
++		errno = 0;
+ 	}
+ 	up_write(&uts_sem);
+ 	return errno;
+--- linux-2.6.0-test1/kernel/time.c	2003-06-16 22:32:21.000000000 -0700
++++ 25/kernel/time.c	2003-07-19 17:03:51.000000000 -0700
+@@ -66,7 +66,7 @@ asmlinkage long sys_time(int * tloc)
+  * architectures that need it).
+  */
+  
+-asmlinkage long sys_stime(int * tptr)
++asmlinkage long sys_stime(time_t *tptr)
+ {
+ 	struct timespec tv;
+ 
+@@ -160,22 +160,25 @@ int do_sys_settimeofday(struct timespec 
+ 	return 0;
+ }
+ 
+-asmlinkage long sys_settimeofday(struct timeval __user *tv, struct timezone __user *tz)
++asmlinkage long sys_settimeofday(struct timeval __user *tv,
++				struct timezone __user *tz)
+ {
+-	struct timespec	new_tv;
++	struct timeval user_tv;
++	struct timespec	new_ts;
+ 	struct timezone new_tz;
+ 
+ 	if (tv) {
+-		if (copy_from_user(&new_tv, tv, sizeof(*tv)))
++		if (copy_from_user(&user_tv, tv, sizeof(*tv)))
+ 			return -EFAULT;
+-		new_tv.tv_nsec *= NSEC_PER_USEC;
++		new_ts.tv_sec = user_tv.tv_sec;
++		new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC;
+ 	}
+ 	if (tz) {
+ 		if (copy_from_user(&new_tz, tz, sizeof(*tz)))
+ 			return -EFAULT;
+ 	}
+ 
+-	return do_sys_settimeofday(tv ? &new_tv : NULL, tz ? &new_tz : NULL);
++	return do_sys_settimeofday(tv ? &new_ts : NULL, tz ? &new_tz : NULL);
+ }
+ 
+ long pps_offset;		/* pps time offset (us) */
+--- linux-2.6.0-test1/kernel/timer.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/kernel/timer.c	2003-07-19 17:04:53.000000000 -0700
+@@ -160,7 +160,7 @@ static void internal_add_timer(tvec_base
+  */
+ void add_timer(struct timer_list *timer)
+ {
+-	tvec_base_t *base = &get_cpu_var(tvec_bases);
++	tvec_base_t *base = &per_cpu(tvec_bases, get_cpu());
+   	unsigned long flags;
+   
+   	BUG_ON(timer_pending(timer) || !timer->function);
+@@ -171,7 +171,7 @@ void add_timer(struct timer_list *timer)
+ 	internal_add_timer(base, timer);
+ 	timer->base = base;
+ 	spin_unlock_irqrestore(&base->lock, flags);
+-	put_cpu_var(tvec_bases);
++	put_cpu();
+ }
+ 
+ /***
+@@ -234,7 +234,7 @@ int mod_timer(struct timer_list *timer, 
+ 		return 1;
+ 
+ 	spin_lock_irqsave(&timer->lock, flags);
+-	new_base = &__get_cpu_var(tvec_bases);
++	new_base = &per_cpu(tvec_bases, smp_processor_id());
+ repeat:
+ 	old_base = timer->base;
+ 
+@@ -792,7 +792,7 @@ seqlock_t xtime_lock __cacheline_aligned
+  */
+ static void run_timer_softirq(struct softirq_action *h)
+ {
+-	tvec_base_t *base = &__get_cpu_var(tvec_bases);
++	tvec_base_t *base = &per_cpu(tvec_bases, smp_processor_id());
+ 
+ 	if (time_after_eq(jiffies, base->timer_jiffies))
+ 		__run_timers(base);
+--- linux-2.6.0-test1/kernel/workqueue.c	2003-07-02 14:53:18.000000000 -0700
++++ 25/kernel/workqueue.c	2003-07-19 17:04:07.000000000 -0700
+@@ -176,7 +176,7 @@ static int worker_thread(void *__startup
+ 	cwq->thread = current;
+ 
+ 	set_user_nice(current, -10);
+-	set_cpus_allowed(current, 1UL << cpu);
++	set_cpus_allowed(current, cpumask_of_cpu(cpu));
+ 
+ 	complete(&startup->done);
+ 
+--- linux-2.6.0-test1/MAINTAINERS	2003-07-13 21:44:34.000000000 -0700
++++ 25/MAINTAINERS	2003-07-19 17:04:55.000000000 -0700
+@@ -657,6 +657,11 @@ L:	emu10k1-devel@lists.sourceforge.net
+ W:	http://sourceforge.net/projects/emu10k1/
+ S:	Maintained
+ 
++EPSON 1355 FRAMEBUFFER DRIVER
++P:	Christopher Hoover
++M:	ch@murgatroid.com, ch@hpl.hp.com
++S:	Maintained
++
+ ETHEREXPRESS-16 NETWORK DRIVER
+ P:	Philip Blundell
+ M:	Philip.Blundell@pobox.com
+@@ -973,7 +978,7 @@ M:	scott.feldman@intel.com
+ S:	Supported
+ 
+ INTERMEZZO FILE SYSTEM
+-P:	Chen Yang
++P:	Cluster File Systems	
+ M:	intermezzo-devel@lists.sf.net
+ W:	http://www.inter-mezzo.org/
+ L:	intermezzo-discuss@lists.sourceforge.net
+@@ -1076,6 +1081,12 @@ L:	kbuild-devel@lists.sourceforge.net
+ W:	http://kbuild.sourceforge.net
+ S:	Maintained 
+ 
++KGDB FOR I386 PLATFORM
++P:	George Anzinger
++M:	george@mvista.com
++L:	linux-net@vger.kernel.org
++S:	Supported
++
+ KERNEL NFSD
+ P:	Neil Brown
+ M:	neilb@cse.unsw.edu.au
+--- linux-2.6.0-test1/Makefile	2003-07-13 21:44:34.000000000 -0700
++++ 25/Makefile	2003-07-19 17:03:58.000000000 -0700
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 0
+-EXTRAVERSION = -test1
++EXTRAVERSION = -test1-mm2
+ 
+ # *DOCUMENTATION*
+ # To see a list of typical targets execute "make help"
+@@ -781,7 +781,8 @@ rpm:	clean spec
+ 	tar -cvz $(RCS_TAR_IGNORE) -f $(KERNELPATH).tar.gz $(KERNELPATH)/. ; \
+ 	rm $(KERNELPATH) ; \
+ 	cd $(TOPDIR) ; \
+-	$(CONFIG_SHELL) $(srctree)/scripts/mkversion > .version ; \
++	$(CONFIG_SHELL) $(srctree)/scripts/mkversion > .tmp_version ; \
++	mv -f .tmp_version .version; \
+ 	$(RPM) -ta $(TOPDIR)/../$(KERNELPATH).tar.gz ; \
+ 	rm $(TOPDIR)/../$(KERNELPATH).tar.gz
+ 
+--- linux-2.6.0-test1/mm/bootmem.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/mm/bootmem.c	2003-07-19 17:03:51.000000000 -0700
+@@ -183,7 +183,7 @@ 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;
++		i = ALIGN(i, incr);
+ 		if (test_bit(i, bdata->node_bootmem_map))
+ 			continue;
+ 		for (j = i + 1; j < i + areasize; ++j) {
+@@ -195,7 +195,7 @@ restart_scan:
+ 		start = i;
+ 		goto found;
+ 	fail_block:
+-		;
++		i = ALIGN(j, incr);
+ 	}
+ 
+ 	if (preferred > offset) {
+--- linux-2.6.0-test1/mm/filemap.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/mm/filemap.c	2003-07-19 17:07:03.000000000 -0700
+@@ -265,21 +265,42 @@ static wait_queue_head_t *page_waitqueue
+ 	return &zone->wait_table[hash_ptr(page, zone->wait_table_bits)];
+ }
+ 
+-void wait_on_page_bit(struct page *page, int bit_nr)
++/*
++ * wait for the specified page bit to be cleared
++ * this could be a synchronous wait or could just queue an async
++ * notification callback depending on the wait queue entry parameter
++ *
++ * A NULL wait queue parameter defaults to sync behaviour
++ */
++int wait_on_page_bit_wq(struct page *page, int bit_nr, wait_queue_t *wait)
+ {
+ 	wait_queue_head_t *waitqueue = page_waitqueue(page);
+-	DEFINE_WAIT(wait);
++	DEFINE_WAIT(local_wait);
++
++	if (!wait)
++		wait = &local_wait; /* default to a sync wait entry */
+ 
+ 	do {
+-		prepare_to_wait(waitqueue, &wait, TASK_UNINTERRUPTIBLE);
++		prepare_to_wait(waitqueue, wait, TASK_UNINTERRUPTIBLE);
+ 		if (test_bit(bit_nr, &page->flags)) {
+ 			sync_page(page);
++			if (!is_sync_wait(wait)) {
++				/*
++				 * if we've queued an async wait queue
++				 * callback do not block; just tell the
++				 * caller to return and retry later when
++				 * the callback is notified
++				 */
++				return -EIOCBRETRY;
++			}
+ 			io_schedule();
+ 		}
+ 	} while (test_bit(bit_nr, &page->flags));
+-	finish_wait(waitqueue, &wait);
++	finish_wait(waitqueue, wait);
++
++	return 0;
+ }
+-EXPORT_SYMBOL(wait_on_page_bit);
++EXPORT_SYMBOL(wait_on_page_bit_wq);
+ 
+ /**
+  * unlock_page() - unlock a locked page
+@@ -289,7 +310,9 @@ EXPORT_SYMBOL(wait_on_page_bit);
+  * Unlocks the page and wakes up sleepers in ___wait_on_page_locked().
+  * Also wakes sleepers in wait_on_page_writeback() because the wakeup
+  * mechananism between PageLocked pages and PageWriteback pages is shared.
+- * But that's OK - sleepers in wait_on_page_writeback() just go back to sleep.
++ * But that's OK - sleepers in wait_on_page_writeback() just go back to sleep,
++ * or in case the wakeup notifies async wait queue entries, as in the case
++ * of aio, retries would be triggered and may re-queue their callbacks.
+  *
+  * The first mb is necessary to safely close the critical section opened by the
+  * TestSetPageLocked(), the second mb is necessary to enforce ordering between
+@@ -326,26 +349,51 @@ void end_page_writeback(struct page *pag
+ EXPORT_SYMBOL(end_page_writeback);
+ 
+ /*
+- * Get a lock on the page, assuming we need to sleep to get it.
++ * Get a lock on the page, assuming we need to either sleep to get it
++ * or to queue an async notification callback to try again when its
++ * available.
++ *
++ * A NULL wait queue parameter defaults to sync behaviour. Otherwise
++ * it specifies the wait queue entry to be used for async notification
++ * or waiting.
+  *
+  * Ugly: running sync_page() in state TASK_UNINTERRUPTIBLE is scary.  If some
+  * random driver's requestfn sets TASK_RUNNING, we could busywait.  However
+  * chances are that on the second loop, the block layer's plug list is empty,
+  * so sync_page() will then return in state TASK_UNINTERRUPTIBLE.
+  */
+-void __lock_page(struct page *page)
++int __lock_page_wq(struct page *page, wait_queue_t *wait)
+ {
+ 	wait_queue_head_t *wqh = page_waitqueue(page);
+-	DEFINE_WAIT(wait);
++	DEFINE_WAIT(local_wait);
++
++	if (!wait)
++		wait = &local_wait;
+ 
+ 	while (TestSetPageLocked(page)) {
+-		prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
++		prepare_to_wait(wqh, wait, TASK_UNINTERRUPTIBLE);
+ 		if (PageLocked(page)) {
+ 			sync_page(page);
++			if (!is_sync_wait(wait)) {
++				/*
++				 * if we've queued an async wait queue
++				 * callback do not block; just tell the
++				 * caller to return and retry later when
++				 * the callback is notified
++				 */
++				return -EIOCBRETRY;
++			}
+ 			io_schedule();
+ 		}
+ 	}
+-	finish_wait(wqh, &wait);
++	finish_wait(wqh, wait);
++	return 0;
++}
++EXPORT_SYMBOL(__lock_page_wq);
++
++void __lock_page(struct page *page)
++{
++	__lock_page_wq(page, NULL);
+ }
+ EXPORT_SYMBOL(__lock_page);
+ 
+@@ -395,8 +443,8 @@ struct page *find_trylock_page(struct ad
+  *
+  * Returns zero if the page was not present. find_lock_page() may sleep.
+  */
+-struct page *find_lock_page(struct address_space *mapping,
+-				unsigned long offset)
++struct page *find_lock_page_wq(struct address_space *mapping,
++				unsigned long offset, wait_queue_t *wait)
+ {
+ 	struct page *page;
+ 
+@@ -407,7 +455,10 @@ repeat:
+ 		page_cache_get(page);
+ 		if (TestSetPageLocked(page)) {
+ 			spin_unlock(&mapping->page_lock);
+-			lock_page(page);
++			if (-EIOCBRETRY == lock_page_wq(page, wait)) {
++				page_cache_release(page);
++				return ERR_PTR(-EIOCBRETRY);
++			}
+ 			spin_lock(&mapping->page_lock);
+ 
+ 			/* Has the page been truncated while we slept? */
+@@ -422,6 +473,12 @@ repeat:
+ 	return page;
+ }
+ 
++struct page *find_lock_page(struct address_space *mapping,
++				unsigned long offset)
++{
++	return find_lock_page_wq(mapping, offset, NULL);
++}
++
+ /**
+  * find_or_create_page - locate or add a pagecache page
+  *
+@@ -544,21 +601,39 @@ void do_generic_mapping_read(struct addr
+ 			     read_actor_t actor)
+ {
+ 	struct inode *inode = mapping->host;
+-	unsigned long index, offset;
++	unsigned long index, offset, last, end_index;
+ 	struct page *cached_page;
++	loff_t isize = i_size_read(inode);
+ 	int error;
+ 
+ 	cached_page = NULL;
+ 	index = *ppos >> PAGE_CACHE_SHIFT;
+ 	offset = *ppos & ~PAGE_CACHE_MASK;
+ 
++	last = (*ppos + desc->count) >> PAGE_CACHE_SHIFT;
++	end_index = isize >> PAGE_CACHE_SHIFT;
++	if (last > end_index)
++		last = end_index;
++
++	/* Don't repeat the readahead if we are executing aio retries */
++	if (in_aio()) {
++		if (is_retried_kiocb(io_wait_to_kiocb(current->io_wait)))
++			goto done_readahead;
++	}
++
++	/*
++	 * Let the readahead logic know upfront about all
++	 * the pages we'll need to satisfy this request
++	 */
++	for (; index < last; index++)
++		page_cache_readahead(mapping, ra, filp, index);
++	index = *ppos >> PAGE_CACHE_SHIFT;
++
++done_readahead:
+ 	for (;;) {
+ 		struct page *page;
+-		unsigned long end_index, nr, ret;
+-		loff_t isize = i_size_read(inode);
++		unsigned long nr, ret;
+ 
+-		end_index = isize >> PAGE_CACHE_SHIFT;
+-			
+ 		if (index > end_index)
+ 			break;
+ 		nr = PAGE_CACHE_SIZE;
+@@ -569,7 +644,6 @@ void do_generic_mapping_read(struct addr
+ 		}
+ 
+ 		cond_resched();
+-		page_cache_readahead(mapping, ra, filp, index);
+ 
+ 		nr = nr - offset;
+ find_page:
+@@ -619,7 +693,12 @@ page_not_up_to_date:
+ 			goto page_ok;
+ 
+ 		/* Get exclusive access to the page ... */
+-		lock_page(page);
++
++		if (lock_page_wq(page, current->io_wait)) {
++			pr_debug("queued lock page \n");
++			error = -EIOCBRETRY;
++			goto sync_error;
++		}
+ 
+ 		/* Did it get unhashed before we got the lock? */
+ 		if (!page->mapping) {
+@@ -641,13 +720,23 @@ readpage:
+ 		if (!error) {
+ 			if (PageUptodate(page))
+ 				goto page_ok;
+-			wait_on_page_locked(page);
++			if (wait_on_page_locked_wq(page, current->io_wait)) {
++				pr_debug("queued wait_on_page \n");
++				error = -EIOCBRETRY;
++				goto sync_error;
++			}
++
+ 			if (PageUptodate(page))
+ 				goto page_ok;
+ 			error = -EIO;
+ 		}
+ 
+-		/* UHHUH! A synchronous read error occurred. Report it */
++sync_error:
++		/* We don't have uptodate data in the page yet */
++		/* Could be due to an error or because we need to
++		 * retry when we get an async i/o notification.
++		 * Report the reason.
++		 */
+ 		desc->error = error;
+ 		page_cache_release(page);
+ 		break;
+@@ -1385,7 +1474,9 @@ __grab_cache_page(struct address_space *
+ 	int err;
+ 	struct page *page;
+ repeat:
+-	page = find_lock_page(mapping, index);
++	page = find_lock_page_wq(mapping, index, current->io_wait);
++	if (IS_ERR(page))
++		return page;
+ 	if (!page) {
+ 		if (!*cached_page) {
+ 			*cached_page = page_cache_alloc(mapping);
+@@ -1672,7 +1763,6 @@ generic_file_aio_write_nolock(struct kio
+ 	if (err)
+ 		goto out;
+ 
+-
+ 	if (count == 0)
+ 		goto out;
+ 
+@@ -1726,6 +1816,10 @@ generic_file_aio_write_nolock(struct kio
+ 		fault_in_pages_readable(buf, bytes);
+ 
+ 		page = __grab_cache_page(mapping,index,&cached_page,&lru_pvec);
++		if (IS_ERR(page)) {
++			status = PTR_ERR(page);
++			break;
++		}
+ 		if (!page) {
+ 			status = -ENOMEM;
+ 			break;
+@@ -1776,7 +1870,11 @@ generic_file_aio_write_nolock(struct kio
+ 		page_cache_release(page);
+ 		if (status < 0)
+ 			break;
+-		balance_dirty_pages_ratelimited(mapping);
++		status = balance_dirty_pages_ratelimited(mapping);
++		if (status < 0) {
++			pr_debug("async balance_dirty_pages\n");
++			break;
++		}
+ 		cond_resched();
+ 	} while (count);
+ 	*ppos = pos;
+@@ -1787,12 +1885,14 @@ generic_file_aio_write_nolock(struct kio
+ 	/*
+ 	 * For now, when the user asks for O_SYNC, we'll actually give O_DSYNC
+ 	 */
+-	if (status >= 0) {
+-		if ((file->f_flags & O_SYNC) || IS_SYNC(inode))
+-			status = generic_osync_inode(inode,
+-					OSYNC_METADATA|OSYNC_DATA);
++	if (likely(status >= 0)) {
++		if (unlikely((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
++			if (!a_ops->writepage)
++				status = generic_osync_inode(inode,
++						OSYNC_METADATA|OSYNC_DATA);
++		}
+ 	}
+-	
++
+ out_status:	
+ 	err = written ? written : status;
+ out:
+@@ -1819,18 +1919,43 @@ ssize_t generic_file_aio_write(struct ki
+ 			       size_t count, loff_t pos)
+ {
+ 	struct file *file = iocb->ki_filp;
+-	struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
+-	ssize_t err;
+-	struct iovec local_iov = { .iov_base = (void __user *)buf, .iov_len = count };
++	struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
++	struct inode *inode = mapping->host;
++	ssize_t ret;
++	struct iovec local_iov = { .iov_base = (void __user *)buf,
++					.iov_len = count };
+ 
+ 	BUG_ON(iocb->ki_pos != pos);
+ 
++	if (!buf && !is_sync_kiocb(iocb)) {
++		/* nothing to transfer, may just need to sync data */
++		ret = count;
++		goto osync;
++	}
++
+ 	down(&inode->i_sem);
+-	err = generic_file_aio_write_nolock(iocb, &local_iov, 1, 
++	ret = generic_file_aio_write_nolock(iocb, &local_iov, 1,
+ 						&iocb->ki_pos);
+ 	up(&inode->i_sem);
+ 
+-	return err;
++	/*
++	 * Avoid doing a sync in parts for aio - its more efficient to
++	 * call in again after all the data has been copied
++	 */
++	if (!is_sync_kiocb(iocb))
++		return ret;
++
++osync:
++	if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
++		ssize_t err;
++
++		err = sync_page_range(inode, mapping, pos, ret);
++		if (err < 0)
++			ret = err;
++		else
++			iocb->ki_pos = pos + err;
++	}
++	return ret;
+ }
+ EXPORT_SYMBOL(generic_file_aio_write);
+ EXPORT_SYMBOL(generic_file_aio_write_nolock);
+@@ -1838,15 +1963,24 @@ EXPORT_SYMBOL(generic_file_aio_write_nol
+ ssize_t generic_file_write(struct file *file, const char __user *buf,
+ 			   size_t count, loff_t *ppos)
+ {
+-	struct inode	*inode = file->f_dentry->d_inode->i_mapping->host;
+-	ssize_t		err;
+-	struct iovec local_iov = { .iov_base = (void __user *)buf, .iov_len = count };
++	struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
++	struct inode *inode = mapping->host;
++	ssize_t	ret;
++	struct iovec local_iov = { .iov_base = (void __user *)buf,
++					.iov_len = count };
+ 
+ 	down(&inode->i_sem);
+-	err = generic_file_write_nolock(file, &local_iov, 1, ppos);
++	ret = generic_file_write_nolock(file, &local_iov, 1, ppos);
+ 	up(&inode->i_sem);
+ 
+-	return err;
++	if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
++		ssize_t err;
++
++		err = sync_page_range(inode, mapping, *ppos - ret, ret);
++		if (err < 0)
++			ret = err;
++	}
++	return ret;
+ }
+ 
+ ssize_t generic_file_readv(struct file *filp, const struct iovec *iov,
+@@ -1863,7 +1997,7 @@ ssize_t generic_file_readv(struct file *
+ }
+ 
+ ssize_t generic_file_writev(struct file *file, const struct iovec *iov,
+-			unsigned long nr_segs, loff_t * ppos) 
++			unsigned long nr_segs, loff_t *ppos)
+ {
+ 	struct inode *inode = file->f_dentry->d_inode;
+ 	ssize_t ret;
+@@ -1871,6 +2005,15 @@ ssize_t generic_file_writev(struct file 
+ 	down(&inode->i_sem);
+ 	ret = generic_file_write_nolock(file, iov, nr_segs, ppos);
+ 	up(&inode->i_sem);
++
++	if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
++		ssize_t err;
++
++		err = sync_page_range(inode, inode->i_mapping,
++					*ppos - ret, ret);
++		if (err < 0)
++			ret = err;
++	}
+ 	return ret;
+ }
+ 
+--- linux-2.6.0-test1/mm/fremap.c	2003-06-14 12:17:56.000000000 -0700
++++ 25/mm/fremap.c	2003-07-19 17:07:16.000000000 -0700
+@@ -67,11 +67,11 @@ int install_page(struct mm_struct *mm, s
+ 	pgd = pgd_offset(mm, addr);
+ 	spin_lock(&mm->page_table_lock);
+ 
+-	pmd = pmd_alloc(mm, pgd, addr);
++	pmd = pmd_alloc_map(mm, pgd, addr);
+ 	if (!pmd)
+ 		goto err_unlock;
+ 
+-	pte = pte_alloc_map(mm, pmd, addr);
++	pte = pte_alloc_map(mm, pgd, &pmd, addr);
+ 	if (!pte)
+ 		goto err_unlock;
+ 
+@@ -82,6 +82,7 @@ int install_page(struct mm_struct *mm, s
+ 	set_pte(pte, mk_pte(page, prot));
+ 	pte_chain = page_add_rmap(page, pte, pte_chain);
+ 	pte_unmap(pte);
++	pmd_unmap(pmd);
+ 	if (flush)
+ 		flush_tlb_page(vma, addr);
+ 	update_mmu_cache(vma, addr, *pte);
+--- linux-2.6.0-test1/mm/memory.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/mm/memory.c	2003-07-19 17:07:16.000000000 -0700
+@@ -104,6 +104,7 @@ static inline void free_one_pgd(struct m
+ {
+ 	int j;
+ 	pmd_t * pmd;
++	struct page *page;
+ 
+ 	if (pgd_none(*dir))
+ 		return;
+@@ -112,11 +113,13 @@ static inline void free_one_pgd(struct m
+ 		pgd_clear(dir);
+ 		return;
+ 	}
+-	pmd = pmd_offset(dir, 0);
++	page = pgd_page(*dir);
++	pmd = pmd_offset_map(dir, 0);
+ 	pgd_clear(dir);
+ 	for (j = 0; j < PTRS_PER_PMD ; j++)
+ 		free_one_pmd(tlb, pmd+j);
+-	pmd_free_tlb(tlb, pmd);
++	pmd_unmap(pmd);
++	pmd_free_tlb(tlb, page);
+ }
+ 
+ /*
+@@ -136,30 +139,38 @@ void clear_page_tables(struct mmu_gather
+ 	} while (--nr);
+ }
+ 
+-pte_t * pte_alloc_map(struct mm_struct *mm, pmd_t *pmd, unsigned long address)
++/*
++ * error return happens with pmd unmapped
++ */
++pte_t *pte_alloc_map(struct mm_struct *mm, pgd_t *pgd, pmd_t **pmd, unsigned long addr)
+ {
+-	if (!pmd_present(*pmd)) {
++	if (!pmd_present(**pmd)) {
+ 		struct page *new;
+ 
++		pmd_unmap(*pmd);
+ 		spin_unlock(&mm->page_table_lock);
+-		new = pte_alloc_one(mm, address);
++		new = pte_alloc_one(mm, addr);
+ 		spin_lock(&mm->page_table_lock);
+-		if (!new)
++		if (!new) {
++			*pmd = NULL;
+ 			return NULL;
++		}
++
++		*pmd = pmd_offset_map(pgd, addr);
+ 
+ 		/*
+ 		 * Because we dropped the lock, we should re-check the
+ 		 * entry, as somebody else could have populated it..
+ 		 */
+-		if (pmd_present(*pmd)) {
++		if (pmd_present(**pmd)) {
+ 			pte_free(new);
+ 			goto out;
+ 		}
+-		pgtable_add_rmap(new, mm, address);
+-		pmd_populate(mm, pmd, new);
++		pgtable_add_rmap(new, mm, addr);
++		pmd_populate(mm, *pmd, new);
+ 	}
+ out:
+-	return pte_offset_map(pmd, address);
++	return pte_offset_map(*pmd, addr);
+ }
+ 
+ pte_t * pte_alloc_kernel(struct mm_struct *mm, pmd_t *pmd, unsigned long address)
+@@ -199,7 +210,7 @@ out:
+  *         variable count and make things faster. -jj
+  *
+  * dst->page_table_lock is held on entry and exit,
+- * but may be dropped within pmd_alloc() and pte_alloc_map().
++ * but may be dropped within pmd_alloc_map() and pte_alloc_map().
+  */
+ int copy_page_range(struct mm_struct *dst, struct mm_struct *src,
+ 			struct vm_area_struct *vma)
+@@ -244,11 +255,10 @@ skip_copy_pmd_range:	address = (address 
+ 			continue;
+ 		}
+ 
+-		src_pmd = pmd_offset(src_pgd, address);
+-		dst_pmd = pmd_alloc(dst, dst_pgd, address);
++		dst_pmd = pmd_alloc_map(dst, dst_pgd, address);
+ 		if (!dst_pmd)
+ 			goto nomem;
+-
++		src_pmd = pmd_offset_map_nested(src_pgd, address);
+ 		do {
+ 			pte_t * src_pte, * dst_pte;
+ 		
+@@ -261,15 +271,20 @@ skip_copy_pmd_range:	address = (address 
+ 				pmd_clear(src_pmd);
+ skip_copy_pte_range:
+ 				address = (address + PMD_SIZE) & PMD_MASK;
+-				if (address >= end)
++				if (address >= end) {
++					pmd_unmap(dst_pmd);
++					pmd_unmap_nested(src_pmd);
+ 					goto out;
++				}
+ 				goto cont_copy_pmd_range;
+ 			}
+ 
+-			dst_pte = pte_alloc_map(dst, dst_pmd, address);
++			pmd_unmap_nested(src_pmd);
++			dst_pte = pte_alloc_map(dst, dst_pgd, &dst_pmd, address);
+ 			if (!dst_pte)
+ 				goto nomem;
+ 			spin_lock(&src->page_table_lock);	
++			src_pmd = pmd_offset_map_nested(src_pgd, address);
+ 			src_pte = pte_offset_map_nested(src_pmd, address);
+ 			do {
+ 				pte_t pte = *src_pte;
+@@ -336,6 +351,8 @@ skip_copy_pte_range:
+ 				 */
+ 				pte_unmap_nested(src_pte);
+ 				pte_unmap(dst_pte);
++				pmd_unmap_nested(src_pmd);
++				pmd_unmap(dst_pmd);
+ 				spin_unlock(&src->page_table_lock);	
+ 				spin_unlock(&dst->page_table_lock);	
+ 				pte_chain = pte_chain_alloc(GFP_KERNEL);
+@@ -343,12 +360,16 @@ skip_copy_pte_range:
+ 				if (!pte_chain)
+ 					goto nomem;
+ 				spin_lock(&src->page_table_lock);
++				dst_pmd = pmd_offset_map(dst_pgd, address);
++				src_pmd = pmd_offset_map_nested(src_pgd, address);
+ 				dst_pte = pte_offset_map(dst_pmd, address);
+ 				src_pte = pte_offset_map_nested(src_pmd,
+ 								address);
+ cont_copy_pte_range_noset:
+ 				address += PAGE_SIZE;
+ 				if (address >= end) {
++					pmd_unmap(dst_pmd);
++					pmd_unmap_nested(src_pmd);
+ 					pte_unmap_nested(src_pte);
+ 					pte_unmap(dst_pte);
+ 					goto out_unlock;
+@@ -364,6 +385,8 @@ cont_copy_pmd_range:
+ 			src_pmd++;
+ 			dst_pmd++;
+ 		} while ((unsigned long)src_pmd & PMD_TABLE_MASK);
++		pmd_unmap_nested(src_pmd-1);
++		pmd_unmap(dst_pmd-1);
+ 	}
+ out_unlock:
+ 	spin_unlock(&src->page_table_lock);
+@@ -439,7 +462,7 @@ zap_pmd_range(struct mmu_gather *tlb, pg
+ 		pgd_clear(dir);
+ 		return;
+ 	}
+-	pmd = pmd_offset(dir, address);
++	pmd = pmd_offset_map(dir, address);
+ 	end = address + size;
+ 	if (end > ((address + PGDIR_SIZE) & PGDIR_MASK))
+ 		end = ((address + PGDIR_SIZE) & PGDIR_MASK);
+@@ -448,6 +471,7 @@ zap_pmd_range(struct mmu_gather *tlb, pg
+ 		address = (address + PMD_SIZE) & PMD_MASK; 
+ 		pmd++;
+ 	} while (address < end);
++	pmd_unmap(pmd - 1);
+ }
+ 
+ void unmap_page_range(struct mmu_gather *tlb, struct vm_area_struct *vma,
+@@ -629,20 +653,27 @@ follow_page(struct mm_struct *mm, unsign
+ 	if (pgd_none(*pgd) || pgd_bad(*pgd))
+ 		goto out;
+ 
+-	pmd = pmd_offset(pgd, address);
++	pmd = pmd_offset_map(pgd, address);
+ 	if (pmd_none(*pmd))
+-		goto out;
+-	if (pmd_huge(*pmd))
+-		return follow_huge_pmd(mm, address, pmd, write);
+-	if (pmd_bad(*pmd))
+-		goto out;
++		goto out_unmap;
++	if (pmd_bad(*pmd)) {
++		pmd_ERROR(*pmd);
++		pmd_clear(pmd);
++		goto out_unmap;
++	}
++	if (pmd_huge(*pmd)) {
++		struct page *page = follow_huge_pmd(mm, address, pmd, write);
++		pmd_unmap(pmd);
++		return page;
++	}
+ 
+ 	ptep = pte_offset_map(pmd, address);
+ 	if (!ptep)
+-		goto out;
++		goto out_unmap;
+ 
+ 	pte = *ptep;
+ 	pte_unmap(ptep);
++	pmd_unmap(pmd);
+ 	if (pte_present(pte)) {
+ 		if (!write || (pte_write(pte) && pte_dirty(pte))) {
+ 			pfn = pte_pfn(pte);
+@@ -653,6 +684,9 @@ follow_page(struct mm_struct *mm, unsign
+ 
+ out:
+ 	return NULL;
++out_unmap:
++	pmd_unmap(pmd);
++	goto out;
+ }
+ 
+ /* 
+@@ -711,7 +745,7 @@ int get_user_pages(struct task_struct *t
+ 			pgd = pgd_offset_k(pg);
+ 			if (!pgd)
+ 				return i ? : -EFAULT;
+-			pmd = pmd_offset(pgd, pg);
++			pmd = pmd_offset_kernel(pgd, pg);
+ 			if (!pmd)
+ 				return i ? : -EFAULT;
+ 			pte = pte_offset_kernel(pmd, pg);
+@@ -803,8 +837,8 @@ static void zeromap_pte_range(pte_t * pt
+ 	} while (address && (address < end));
+ }
+ 
+-static inline int zeromap_pmd_range(struct mm_struct *mm, pmd_t * pmd, unsigned long address,
+-                                    unsigned long size, pgprot_t prot)
++static inline int zeromap_pmd_range(struct mm_struct *mm, pgd_t *pgd, pmd_t **pmd,
++			unsigned long address, unsigned long size, pgprot_t prot)
+ {
+ 	unsigned long end;
+ 
+@@ -813,13 +847,13 @@ static inline int zeromap_pmd_range(stru
+ 	if (end > PGDIR_SIZE)
+ 		end = PGDIR_SIZE;
+ 	do {
+-		pte_t * pte = pte_alloc_map(mm, pmd, address);
++		pte_t *pte = pte_alloc_map(mm, pgd, pmd, address);
+ 		if (!pte)
+ 			return -ENOMEM;
+ 		zeromap_pte_range(pte, address, end - address, prot);
+ 		pte_unmap(pte);
+ 		address = (address + PMD_SIZE) & PMD_MASK;
+-		pmd++;
++		(*pmd)++;
+ 	} while (address && (address < end));
+ 	return 0;
+ }
+@@ -839,13 +873,14 @@ int zeromap_page_range(struct vm_area_st
+ 
+ 	spin_lock(&mm->page_table_lock);
+ 	do {
+-		pmd_t *pmd = pmd_alloc(mm, dir, address);
++		pmd_t *pmd = pmd_alloc_map(mm, dir, address);
+ 		error = -ENOMEM;
+ 		if (!pmd)
+ 			break;
+-		error = zeromap_pmd_range(mm, pmd, address, end - address, prot);
++		error = zeromap_pmd_range(mm, dir, &pmd, address, end - address, prot);
+ 		if (error)
+ 			break;
++		pmd_unmap(pmd - 1);
+ 		address = (address + PGDIR_SIZE) & PGDIR_MASK;
+ 		dir++;
+ 	} while (address && (address < end));
+@@ -880,8 +915,9 @@ static inline void remap_pte_range(pte_t
+ 	} while (address && (address < end));
+ }
+ 
+-static inline int remap_pmd_range(struct mm_struct *mm, pmd_t * pmd, unsigned long address, unsigned long size,
+-	unsigned long phys_addr, pgprot_t prot)
++static inline int remap_pmd_range(struct mm_struct *mm, pgd_t *pgd, pmd_t **pmd,
++				unsigned long address, unsigned long size,
++				unsigned long phys_addr, pgprot_t prot)
+ {
+ 	unsigned long base, end;
+ 
+@@ -892,13 +928,13 @@ static inline int remap_pmd_range(struct
+ 		end = PGDIR_SIZE;
+ 	phys_addr -= address;
+ 	do {
+-		pte_t * pte = pte_alloc_map(mm, pmd, base + address);
++		pte_t *pte = pte_alloc_map(mm, pgd, pmd, base + address);
+ 		if (!pte)
+ 			return -ENOMEM;
+ 		remap_pte_range(pte, base + address, end - address, address + phys_addr, prot);
+ 		pte_unmap(pte);
+ 		address = (address + PMD_SIZE) & PMD_MASK;
+-		pmd++;
++		(*pmd)++;
+ 	} while (address && (address < end));
+ 	return 0;
+ }
+@@ -920,13 +956,14 @@ int remap_page_range(struct vm_area_stru
+ 
+ 	spin_lock(&mm->page_table_lock);
+ 	do {
+-		pmd_t *pmd = pmd_alloc(mm, dir, from);
++		pmd_t *pmd = pmd_alloc_map(mm, dir, from);
+ 		error = -ENOMEM;
+ 		if (!pmd)
+ 			break;
+-		error = remap_pmd_range(mm, pmd, from, end - from, phys_addr + from, prot);
++		error = remap_pmd_range(mm, dir, &pmd, from, end - from, phys_addr + from, prot);
+ 		if (error)
+ 			break;
++		pmd_unmap(pmd - 1);
+ 		from = (from + PGDIR_SIZE) & PGDIR_MASK;
+ 		dir++;
+ 	} while (from && (from < end));
+@@ -996,6 +1033,7 @@ static int do_wp_page(struct mm_struct *
+ 		 * data, but for the moment just pretend this is OOM.
+ 		 */
+ 		pte_unmap(page_table);
++		pmd_unmap(pmd);
+ 		printk(KERN_ERR "do_wp_page: bogus page at address %08lx\n",
+ 				address);
+ 		goto oom;
+@@ -1010,11 +1048,13 @@ static int do_wp_page(struct mm_struct *
+ 			establish_pte(vma, address, page_table,
+ 				pte_mkyoung(pte_mkdirty(pte_mkwrite(pte))));
+ 			pte_unmap(page_table);
++			pmd_unmap(pmd);
+ 			ret = VM_FAULT_MINOR;
+ 			goto out;
+ 		}
+ 	}
+ 	pte_unmap(page_table);
++	pmd_unmap(pmd);
+ 
+ 	/*
+ 	 * Ok, we need to copy. Oh, well..
+@@ -1034,6 +1074,7 @@ static int do_wp_page(struct mm_struct *
+ 	 * Re-check the pte - we dropped the lock
+ 	 */
+ 	spin_lock(&mm->page_table_lock);
++	pmd = pmd_offset_map(pgd_offset(mm, address), address);
+ 	page_table = pte_offset_map(pmd, address);
+ 	if (pte_same(*page_table, pte)) {
+ 		if (PageReserved(old_page))
+@@ -1047,6 +1088,7 @@ static int do_wp_page(struct mm_struct *
+ 		new_page = old_page;
+ 	}
+ 	pte_unmap(page_table);
++	pmd_unmap(pmd);
+ 	page_cache_release(new_page);
+ 	page_cache_release(old_page);
+ 	ret = VM_FAULT_MINOR;
+@@ -1062,35 +1104,77 @@ out:
+ 	return ret;
+ }
+ 
+-static void vmtruncate_list(struct list_head *head, unsigned long pgoff)
++/*
++ * Helper function for invalidate_mmap_range().
++ * Both hba and hlen are page numbers in PAGE_SIZE units.
++ * An hlen of zero blows away the entire portion file after hba.
++ */
++static void
++invalidate_mmap_range_list(struct list_head *head,
++			   unsigned long const hba,
++			   unsigned long const hlen)
+ {
+-	unsigned long start, end, len, diff;
+-	struct vm_area_struct *vma;
+ 	struct list_head *curr;
+-
++	unsigned long hea;	/* last page of hole. */
++	unsigned long vba;
++	unsigned long vea;	/* last page of corresponding uva hole. */
++	struct vm_area_struct *vp;
++	unsigned long zba;
++	unsigned long zea;
++
++	hea = hba + hlen - 1;	/* avoid overflow. */
++	if (hea < hba)
++		hea = ULONG_MAX;
+ 	list_for_each(curr, head) {
+-		vma = list_entry(curr, struct vm_area_struct, shared);
+-		start = vma->vm_start;
+-		end = vma->vm_end;
+-		len = end - start;
+-
+-		/* mapping wholly truncated? */
+-		if (vma->vm_pgoff >= pgoff) {
+-			zap_page_range(vma, start, len);
+-			continue;
+-		}
++		vp = list_entry(curr, struct vm_area_struct, shared);
++		vba = vp->vm_pgoff;
++		vea = vba + ((vp->vm_end - vp->vm_start) >> PAGE_SHIFT) - 1;
++		if (hea < vba || vea < hba)
++		    	continue;	/* Mapping disjoint from hole. */
++		zba = (hba <= vba) ? vba : hba;
++		zea = (vea <= hea) ? vea : hea;
++		zap_page_range(vp,
++			       ((zba - vba) << PAGE_SHIFT) + vp->vm_start,
++			       (zea - zba + 1) << PAGE_SHIFT);
++	}
++}
+ 
+-		/* mapping wholly unaffected? */
+-		len = len >> PAGE_SHIFT;
+-		diff = pgoff - vma->vm_pgoff;
+-		if (diff >= len)
+-			continue;
++/**
++ * invalidate_mmap_range - invalidate the portion of all mmaps
++ * in the specified address_space corresponding to the specified
++ * page range in the underlying file.
++ * @address_space: the address space containing mmaps to be invalidated.
++ * @holebegin: byte in first page to invalidate, relative to the start of
++ * the underlying file.  This will be rounded down to a PAGE_SIZE
++ * boundary.  Note that this is different from vmtruncate(), which
++ * must keep the partial page.  In contrast, we must get rid of
++ * partial pages.
++ * @holelen: size of prospective hole in bytes.  This will be rounded
++ * up to a PAGE_SIZE boundary.  A holelen of zero truncates to the
++ * end of the file.
++ */
++void invalidate_mmap_range(struct address_space *mapping,
++		      loff_t const holebegin, loff_t const holelen)
++{
++	unsigned long hba = holebegin >> PAGE_SHIFT;
++	unsigned long hlen = (holelen + PAGE_SIZE - 1) >> PAGE_SHIFT;
++
++	/* Check for overflow. */
++	if (sizeof(holelen) > sizeof(hlen)) {
++		long long holeend =
++			(holebegin + holelen + PAGE_SIZE - 1) >> PAGE_SHIFT;
+ 
+-		/* Ok, partially affected.. */
+-		start += diff << PAGE_SHIFT;
+-		len = (len - diff) << PAGE_SHIFT;
+-		zap_page_range(vma, start, len);
++		if (holeend & ~(long long)ULONG_MAX)
++			hlen = ULONG_MAX - hba + 1;
+ 	}
++	down(&mapping->i_shared_sem);
++	/* Protect against page fault */
++	atomic_inc(&mapping->truncate_count);
++	if (unlikely(!list_empty(&mapping->i_mmap)))
++		invalidate_mmap_range_list(&mapping->i_mmap, hba, hlen);
++	if (unlikely(!list_empty(&mapping->i_mmap_shared)))
++		invalidate_mmap_range_list(&mapping->i_mmap_shared, hba, hlen);
++	up(&mapping->i_shared_sem);
+ }
+ 
+ /*
+@@ -1103,20 +1187,13 @@ static void vmtruncate_list(struct list_
+  */
+ int vmtruncate(struct inode * inode, loff_t offset)
+ {
+-	unsigned long pgoff;
+ 	struct address_space *mapping = inode->i_mapping;
+ 	unsigned long limit;
+ 
+ 	if (inode->i_size < offset)
+ 		goto do_expand;
+ 	i_size_write(inode, offset);
+-	pgoff = (offset + PAGE_SIZE - 1) >> PAGE_SHIFT;
+-	down(&mapping->i_shared_sem);
+-	if (unlikely(!list_empty(&mapping->i_mmap)))
+-		vmtruncate_list(&mapping->i_mmap, pgoff);
+-	if (unlikely(!list_empty(&mapping->i_mmap_shared)))
+-		vmtruncate_list(&mapping->i_mmap_shared, pgoff);
+-	up(&mapping->i_shared_sem);
++	invalidate_mmap_range(mapping, offset + PAGE_SIZE - 1, 0);
+ 	truncate_inode_pages(mapping, offset);
+ 	goto out_truncate;
+ 
+@@ -1180,6 +1257,7 @@ static int do_swap_page(struct mm_struct
+ 	struct pte_chain *pte_chain = NULL;
+ 
+ 	pte_unmap(page_table);
++	pmd_unmap(pmd);
+ 	spin_unlock(&mm->page_table_lock);
+ 	page = lookup_swap_cache(entry);
+ 	if (!page) {
+@@ -1191,12 +1269,14 @@ static int do_swap_page(struct mm_struct
+ 			 * we released the page table lock.
+ 			 */
+ 			spin_lock(&mm->page_table_lock);
++			pmd = pmd_offset_map(pgd_offset(mm, address), address);
+ 			page_table = pte_offset_map(pmd, address);
+ 			if (pte_same(*page_table, orig_pte))
+ 				ret = VM_FAULT_OOM;
+ 			else
+ 				ret = VM_FAULT_MINOR;
+ 			pte_unmap(page_table);
++			pmd_unmap(pmd);
+ 			spin_unlock(&mm->page_table_lock);
+ 			goto out;
+ 		}
+@@ -1219,9 +1299,11 @@ static int do_swap_page(struct mm_struct
+ 	 * released the page table lock.
+ 	 */
+ 	spin_lock(&mm->page_table_lock);
++	pmd = pmd_offset_map(pgd_offset(mm, address), address);
+ 	page_table = pte_offset_map(pmd, address);
+ 	if (!pte_same(*page_table, orig_pte)) {
+ 		pte_unmap(page_table);
++		pmd_unmap(pmd);
+ 		spin_unlock(&mm->page_table_lock);
+ 		unlock_page(page);
+ 		page_cache_release(page);
+@@ -1247,6 +1329,7 @@ static int do_swap_page(struct mm_struct
+ 
+ 	/* No need to invalidate - it was non-present before */
+ 	update_mmu_cache(vma, address, pte);
++	pmd_unmap(pmd);
+ 	pte_unmap(page_table);
+ 	spin_unlock(&mm->page_table_lock);
+ out:
+@@ -1272,11 +1355,13 @@ do_anonymous_page(struct mm_struct *mm, 
+ 	pte_chain = pte_chain_alloc(GFP_ATOMIC);
+ 	if (!pte_chain) {
+ 		pte_unmap(page_table);
++		pmd_unmap(pmd);
+ 		spin_unlock(&mm->page_table_lock);
+ 		pte_chain = pte_chain_alloc(GFP_KERNEL);
+ 		if (!pte_chain)
+ 			goto no_mem;
+ 		spin_lock(&mm->page_table_lock);
++		pmd = pmd_offset_map(pgd_offset(mm, addr), addr);
+ 		page_table = pte_offset_map(pmd, addr);
+ 	}
+ 		
+@@ -1287,6 +1372,7 @@ do_anonymous_page(struct mm_struct *mm, 
+ 	if (write_access) {
+ 		/* Allocate our own private page. */
+ 		pte_unmap(page_table);
++		pmd_unmap(pmd);
+ 		spin_unlock(&mm->page_table_lock);
+ 
+ 		page = alloc_page(GFP_HIGHUSER);
+@@ -1295,9 +1381,11 @@ do_anonymous_page(struct mm_struct *mm, 
+ 		clear_user_highpage(page, addr);
+ 
+ 		spin_lock(&mm->page_table_lock);
++		pmd = pmd_offset_map(pgd_offset(mm, addr), addr);
+ 		page_table = pte_offset_map(pmd, addr);
+ 
+ 		if (!pte_none(*page_table)) {
++			pmd_unmap(pmd);
+ 			pte_unmap(page_table);
+ 			page_cache_release(page);
+ 			spin_unlock(&mm->page_table_lock);
+@@ -1313,6 +1401,7 @@ do_anonymous_page(struct mm_struct *mm, 
+ 	set_pte(page_table, entry);
+ 	/* ignores ZERO_PAGE */
+ 	pte_chain = page_add_rmap(page, page_table, pte_chain);
++	pmd_unmap(pmd);
+ 	pte_unmap(page_table);
+ 
+ 	/* No need to invalidate - it was non-present before */
+@@ -1345,16 +1434,22 @@ do_no_page(struct mm_struct *mm, struct 
+ 	unsigned long address, int write_access, pte_t *page_table, pmd_t *pmd)
+ {
+ 	struct page * new_page;
++	struct address_space *mapping;
+ 	pte_t entry;
+ 	struct pte_chain *pte_chain;
++	int sequence;
+ 	int ret;
+ 
+ 	if (!vma->vm_ops || !vma->vm_ops->nopage)
+ 		return do_anonymous_page(mm, vma, page_table,
+ 					pmd, write_access, address);
+ 	pte_unmap(page_table);
+-	spin_unlock(&mm->page_table_lock);
++	pmd_unmap(pmd);
+ 
++	mapping = vma->vm_file->f_dentry->d_inode->i_mapping;
++	sequence = atomic_read(&mapping->truncate_count);
++	spin_unlock(&mm->page_table_lock);
++retry:
+ 	new_page = vma->vm_ops->nopage(vma, address & PAGE_MASK, 0);
+ 
+ 	/* no page was available -- either SIGBUS or OOM */
+@@ -1383,6 +1478,18 @@ do_no_page(struct mm_struct *mm, struct 
+ 	}
+ 
+ 	spin_lock(&mm->page_table_lock);
++	/*
++	 * For a file-backed vma, someone could have truncated or otherwise
++	 * invalidated this page.  If invalidate_mmap_range got called,
++	 * retry getting the page.
++	 */
++	if (unlikely(sequence != atomic_read(&mapping->truncate_count))) {
++		sequence = atomic_read(&mapping->truncate_count);
++		spin_unlock(&mm->page_table_lock);
++		page_cache_release(new_page);
++		goto retry;
++	}
++	pmd = pmd_offset_map(pgd_offset(mm, address), address);
+ 	page_table = pte_offset_map(pmd, address);
+ 
+ 	/*
+@@ -1405,9 +1512,11 @@ do_no_page(struct mm_struct *mm, struct 
+ 		set_pte(page_table, entry);
+ 		pte_chain = page_add_rmap(new_page, page_table, pte_chain);
+ 		pte_unmap(page_table);
++		pmd_unmap(pmd);
+ 	} else {
+ 		/* One of our sibling threads was faster, back out. */
+ 		pte_unmap(page_table);
++		pmd_unmap(pmd);
+ 		page_cache_release(new_page);
+ 		spin_unlock(&mm->page_table_lock);
+ 		ret = VM_FAULT_MINOR;
+@@ -1451,6 +1560,7 @@ static int do_file_page(struct mm_struct
+ 	pgoff = pte_to_pgoff(*pte);
+ 
+ 	pte_unmap(pte);
++	pmd_unmap(pmd);
+ 	spin_unlock(&mm->page_table_lock);
+ 
+ 	err = vma->vm_ops->populate(vma, address & PAGE_MASK, PAGE_SIZE, vma->vm_page_prot, pgoff, 0);
+@@ -1511,6 +1621,7 @@ static inline int handle_pte_fault(struc
+ 	entry = pte_mkyoung(entry);
+ 	establish_pte(vma, address, pte, entry);
+ 	pte_unmap(pte);
++	pmd_unmap(pmd);
+ 	spin_unlock(&mm->page_table_lock);
+ 	return VM_FAULT_MINOR;
+ }
+@@ -1537,10 +1648,10 @@ int handle_mm_fault(struct mm_struct *mm
+ 	 * and the SMP-safe atomic PTE updates.
+ 	 */
+ 	spin_lock(&mm->page_table_lock);
+-	pmd = pmd_alloc(mm, pgd, address);
++	pmd = pmd_alloc_map(mm, pgd, address);
+ 
+ 	if (pmd) {
+-		pte_t * pte = pte_alloc_map(mm, pmd, address);
++		pte_t *pte = pte_alloc_map(mm, pgd, &pmd, address);
+ 		if (pte)
+ 			return handle_pte_fault(mm, vma, address, write_access, pte, pmd);
+ 	}
+@@ -1559,10 +1670,33 @@ int handle_mm_fault(struct mm_struct *mm
+  */
+ pmd_t *__pmd_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
+ {
++	struct page *page;
++
++	spin_unlock(&mm->page_table_lock);
++	page = pmd_alloc_one(mm, address);
++	spin_lock(&mm->page_table_lock);
++	if (!page)
++		return NULL;
++
++	/*
++	 * Because we dropped the lock, we should re-check the
++	 * entry, as somebody else could have populated it..
++	 */
++	if (pgd_present(*pgd)) {
++		pmd_free(page);
++		goto out;
++	}
++	pgd_populate(mm, pgd, page);
++out:
++	return pmd_offset_map(pgd, address);
++}
++
++pmd_t *__pmd_alloc_kernel(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
++{
+ 	pmd_t *new;
+ 
+ 	spin_unlock(&mm->page_table_lock);
+-	new = pmd_alloc_one(mm, address);
++	new = pmd_alloc_one_kernel(mm, address);
+ 	spin_lock(&mm->page_table_lock);
+ 	if (!new)
+ 		return NULL;
+@@ -1572,12 +1706,12 @@ pmd_t *__pmd_alloc(struct mm_struct *mm,
+ 	 * entry, as somebody else could have populated it..
+ 	 */
+ 	if (pgd_present(*pgd)) {
+-		pmd_free(new);
++		pmd_free(virt_to_page(new));
+ 		goto out;
+ 	}
+-	pgd_populate(mm, pgd, new);
++	pgd_populate(mm, pgd, virt_to_page(new));
+ out:
+-	return pmd_offset(pgd, address);
++	return pmd_offset_kernel(pgd, address);
+ }
+ 
+ int make_pages_present(unsigned long addr, unsigned long end)
+@@ -1609,7 +1743,7 @@ struct page * vmalloc_to_page(void * vma
+ 	pte_t *ptep, pte;
+   
+ 	if (!pgd_none(*pgd)) {
+-		pmd = pmd_offset(pgd, addr);
++		pmd = pmd_offset_map(pgd, addr);
+ 		if (!pmd_none(*pmd)) {
+ 			preempt_disable();
+ 			ptep = pte_offset_map(pmd, addr);
+@@ -1619,6 +1753,7 @@ struct page * vmalloc_to_page(void * vma
+ 			pte_unmap(ptep);
+ 			preempt_enable();
+ 		}
++		pmd_unmap(pmd);
+ 	}
+ 	return page;
+ }
+--- linux-2.6.0-test1/mm/mprotect.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/mm/mprotect.c	2003-07-19 17:07:16.000000000 -0700
+@@ -73,7 +73,7 @@ change_pmd_range(pgd_t *pgd, unsigned lo
+ 		pgd_clear(pgd);
+ 		return;
+ 	}
+-	pmd = pmd_offset(pgd, address);
++	pmd = pmd_offset_map(pgd, address);
+ 	address &= ~PGDIR_MASK;
+ 	end = address + size;
+ 	if (end > PGDIR_SIZE)
+@@ -83,6 +83,7 @@ change_pmd_range(pgd_t *pgd, unsigned lo
+ 		address = (address + PMD_SIZE) & PMD_MASK;
+ 		pmd++;
+ 	} while (address && (address < end));
++	pmd_unmap(pmd - 1);
+ }
+ 
+ static void
+--- linux-2.6.0-test1/mm/mremap.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/mm/mremap.c	2003-07-19 17:07:16.000000000 -0700
+@@ -38,7 +38,7 @@ static pte_t *get_one_pte_map_nested(str
+ 		goto end;
+ 	}
+ 
+-	pmd = pmd_offset(pgd, addr);
++	pmd = pmd_offset_map_nested(pgd, addr);
+ 	if (pmd_none(*pmd))
+ 		goto end;
+ 	if (pmd_bad(*pmd)) {
+@@ -53,6 +53,7 @@ static pte_t *get_one_pte_map_nested(str
+ 		pte = NULL;
+ 	}
+ end:
++	pmd_unmap_nested(pmd);
+ 	return pte;
+ }
+ 
+@@ -61,12 +62,15 @@ static inline int page_table_present(str
+ {
+ 	pgd_t *pgd;
+ 	pmd_t *pmd;
++	int ret;
+ 
+ 	pgd = pgd_offset(mm, addr);
+ 	if (pgd_none(*pgd))
+ 		return 0;
+-	pmd = pmd_offset(pgd, addr);
+-	return pmd_present(*pmd);
++	pmd = pmd_offset_map(pgd, addr);
++	ret = pmd_present(*pmd);
++	pmd_unmap(pmd);
++	return ret != 0;
+ }
+ #else
+ #define page_table_present(mm, addr)	(1)
+@@ -74,12 +78,15 @@ static inline int page_table_present(str
+ 
+ static inline pte_t *alloc_one_pte_map(struct mm_struct *mm, unsigned long addr)
+ {
++	pgd_t *pgd;
+ 	pmd_t *pmd;
+ 	pte_t *pte = NULL;
+ 
+-	pmd = pmd_alloc(mm, pgd_offset(mm, addr), addr);
++	pgd = pgd_offset(mm, addr);
++	pmd = pmd_alloc_map(mm, pgd, addr);
+ 	if (pmd)
+-		pte = pte_alloc_map(mm, pmd, addr);
++		pte = pte_alloc_map(mm, pgd, &pmd, addr);
++	pmd_unmap(pmd);
+ 	return pte;
+ }
+ 
+--- linux-2.6.0-test1/mm/msync.c	2003-06-14 12:18:07.000000000 -0700
++++ 25/mm/msync.c	2003-07-19 17:07:16.000000000 -0700
+@@ -82,7 +82,7 @@ static inline int filemap_sync_pmd_range
+ 		pgd_clear(pgd);
+ 		return 0;
+ 	}
+-	pmd = pmd_offset(pgd, address);
++	pmd = pmd_offset_map(pgd, address);
+ 	if ((address & PGDIR_MASK) != (end & PGDIR_MASK))
+ 		end = (address & PGDIR_MASK) + PGDIR_SIZE;
+ 	error = 0;
+@@ -91,6 +91,7 @@ static inline int filemap_sync_pmd_range
+ 		address = (address + PMD_SIZE) & PMD_MASK;
+ 		pmd++;
+ 	} while (address && (address < end));
++	pmd_unmap(pmd - 1);
+ 	return error;
+ }
+ 
+--- linux-2.6.0-test1/mm/page-writeback.c	2003-07-02 14:53:18.000000000 -0700
++++ 25/mm/page-writeback.c	2003-07-19 17:06:58.000000000 -0700
+@@ -28,6 +28,7 @@
+ #include <linux/smp.h>
+ #include <linux/sysctl.h>
+ #include <linux/cpu.h>
++#include <linux/pagevec.h>
+ 
+ /*
+  * The maximum number of pages to writeout in a single bdflush/kupdate
+@@ -144,7 +145,7 @@ get_dirty_limits(struct page_state *ps, 
+  * If we're over `background_thresh' then pdflush is woken to perform some
+  * writeout.
+  */
+-void balance_dirty_pages(struct address_space *mapping)
++int balance_dirty_pages(struct address_space *mapping)
+ {
+ 	struct page_state ps;
+ 	long nr_reclaimable;
+@@ -161,6 +162,7 @@ void balance_dirty_pages(struct address_
+ 			.sync_mode	= WB_SYNC_NONE,
+ 			.older_than_this = NULL,
+ 			.nr_to_write	= write_chunk,
++			.nonblocking	= !is_sync_wait(current->io_wait)
+ 		};
+ 
+ 		get_dirty_limits(&ps, &background_thresh, &dirty_thresh);
+@@ -187,7 +189,11 @@ void balance_dirty_pages(struct address_
+ 			if (pages_written >= write_chunk)
+ 				break;		/* We've done our duty */
+ 		}
+-		blk_congestion_wait(WRITE, HZ/10);
++		if (-EIOCBRETRY == blk_congestion_wait_wq(WRITE, HZ/10,
++			current->io_wait)) {
++			pr_debug("async blk congestion wait\n");
++			return -EIOCBRETRY;
++		}
+ 	}
+ 
+ 	if (nr_reclaimable + ps.nr_writeback <= dirty_thresh)
+@@ -195,6 +201,8 @@ void balance_dirty_pages(struct address_
+ 
+ 	if (!writeback_in_progress(bdi) && nr_reclaimable > background_thresh)
+ 		pdflush_operation(background_writeout, 0);
++
++	return 0;
+ }
+ 
+ /**
+@@ -210,7 +218,7 @@ void balance_dirty_pages(struct address_
+  * decrease the ratelimiting by a lot, to prevent individual processes from
+  * overshooting the limit by (ratelimit_pages) each.
+  */
+-void balance_dirty_pages_ratelimited(struct address_space *mapping)
++int balance_dirty_pages_ratelimited(struct address_space *mapping)
+ {
+ 	static DEFINE_PER_CPU(int, ratelimits) = 0;
+ 	long ratelimit;
+@@ -222,10 +230,10 @@ void balance_dirty_pages_ratelimited(str
+ 	if (get_cpu_var(ratelimits)++ >= ratelimit) {
+ 		__get_cpu_var(ratelimits) = 0;
+ 		put_cpu_var(ratelimits);
+-		balance_dirty_pages(mapping);
+-		return;
++		return balance_dirty_pages(mapping);
+ 	}
+ 	put_cpu_var(ratelimits);
++	return 0;
+ }
+ 
+ /*
+@@ -560,3 +568,107 @@ int test_clear_page_dirty(struct page *p
+ 	return 0;
+ }
+ EXPORT_SYMBOL(test_clear_page_dirty);
++
++
++static ssize_t operate_on_page_range(struct address_space *mapping,
++		loff_t pos, size_t count, int (*operator)(struct page *))
++{
++	pgoff_t first = pos >> PAGE_CACHE_SHIFT;
++	pgoff_t last = (pos + count - 1) >> PAGE_CACHE_SHIFT;	/* inclusive */
++	pgoff_t next = first;
++	struct pagevec pvec;
++	ssize_t ret = 0, bytes = 0;
++	int i;
++
++	if (count == 0)
++		return 0;
++
++	pagevec_init(&pvec, 0);
++	while (pagevec_lookup(&pvec, mapping, next,
++				min((pgoff_t)PAGEVEC_SIZE, last - next + 1))) {
++		for (i = 0; i < pagevec_count(&pvec); i++) {
++			struct page *page = pvec.pages[i];
++
++			lock_page(page);	/* stabilise ->index */
++			if (!page->mapping) {	/* truncated */
++				unlock_page(page);
++				next++;
++				continue;
++			}
++			next = page->index + 1;
++			ret = (*operator)(page);
++			if (ret == -EIOCBRETRY)
++				break;
++			if (PageError(page)) {
++				if (!ret)
++					ret = -EIO;
++			}
++			if (next > last)
++				break;
++		}
++		pagevec_release(&pvec);
++		if ((next > last) || (ret == -EIOCBRETRY))
++			break;
++	}
++	bytes = (next << PAGE_CACHE_SHIFT) - pos;
++	if (bytes > count)
++		bytes = count;
++	return (bytes && (!ret || (ret == -EIOCBRETRY))) ? bytes : ret;
++}
++
++static int page_waiter(struct page *page)
++{
++	unlock_page(page);
++	return wait_on_page_writeback_wq(page, current->io_wait);
++}
++
++static size_t
++wait_on_page_range(struct address_space *mapping, loff_t pos, size_t count)
++{
++	return operate_on_page_range(mapping, pos, count, page_waiter);
++}
++
++static int page_writer(struct page *page)
++{
++	struct writeback_control wbc = {
++		.sync_mode	= WB_SYNC_ALL,
++		.nr_to_write	= 1,
++	};
++
++	wait_on_page_writeback(page);
++	return page->mapping->a_ops->writepage(page, &wbc);
++}
++
++static ssize_t
++write_out_page_range(struct address_space *mapping, loff_t pos, size_t count)
++{
++	return operate_on_page_range(mapping, pos, count, page_writer);
++}
++
++/*
++ * Write and wait upon all the pages in the passed range.  This is a "data
++ * integrity" operation.  It waits upon in-flight writeout before starting and
++ * waiting upon new writeout.  If there was an IO error, return it.
++ *
++ * We need to re-take i_sem during the generic_osync_inode list walk because
++ * it is otherwise livelockable.
++ */
++ssize_t sync_page_range(struct inode *inode, struct address_space *mapping,
++			loff_t pos, size_t count)
++{
++	int ret;
++
++	if (!mapping->a_ops->writepage)
++		return 0;
++	if (mapping->backing_dev_info->memory_backed)
++		return 0;
++	ret = write_out_page_range(mapping, pos, count);
++	if (ret >= 0) {
++		down(&inode->i_sem);
++		ret = generic_osync_inode(inode, OSYNC_METADATA);
++		up(&inode->i_sem);
++	}
++	if (ret >= 0)
++		ret = wait_on_page_range(mapping, pos, count);
++	return ret;
++}
+--- linux-2.6.0-test1/mm/slab.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/mm/slab.c	2003-07-19 17:07:16.000000000 -0700
+@@ -1628,7 +1628,13 @@ static inline void *cache_free_debugchec
+ 	kfree_debugcheck(objp);
+ 	page = virt_to_page(objp);
+ 
+-	BUG_ON(GET_PAGE_CACHE(page) != cachep);
++	if (GET_PAGE_CACHE(page) != cachep) {
++		printk(KERN_ERR "mismatch in kmem_cache_free: expected cache %p, got %p\n",
++				GET_PAGE_CACHE(page),cachep);
++		printk(KERN_ERR "%p is %s.\n", cachep, cachep->name);
++		printk(KERN_ERR "%p is %s.\n", GET_PAGE_CACHE(page), GET_PAGE_CACHE(page)->name);
++		WARN_ON(1);
++	}
+ 	slabp = GET_PAGE_SLAB(page);
+ 
+ 	if (cachep->flags & SLAB_STORE_USER) {
+@@ -2482,11 +2488,11 @@ static void *s_start(struct seq_file *m,
+ 		seq_puts(m, "slabinfo - version: 2.0\n");
+ #endif
+ 		seq_puts(m, "# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab>");
+-		seq_puts(m, " : tunables <batchcount> <limit <sharedfactor>");
++		seq_puts(m, " : tunables <batchcount> <limit> <sharedfactor>");
+ 		seq_puts(m, " : slabdata <active_slabs> <num_slabs> <sharedavail>");
+ #if STATS
+ 		seq_puts(m, " : globalstat <listallocs> <maxobjs> <grown> <reaped> <error> <maxfreeable> <freelimit>");
+-		seq_puts(m, " : cpustat <allochit <allocmiss <freehit <freemiss>");
++		seq_puts(m, " : cpustat <allochit> <allocmiss> <freehit <freemiss>");
+ #endif
+ 		seq_putc(m, '\n');
+ 	}
+@@ -2717,7 +2723,7 @@ void ptrinfo(unsigned long addr)
+ 			printk("No pgd.\n");
+ 			break;
+ 		}
+-		pmd = pmd_offset(pgd, addr);
++		pmd = pmd_offset_kernel(pgd, addr);
+ 		if (pmd_none(*pmd)) {
+ 			printk("No pmd.\n");
+ 			break;
+--- linux-2.6.0-test1/mm/swapfile.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/mm/swapfile.c	2003-07-19 17:07:16.000000000 -0700
+@@ -448,7 +448,7 @@ static int unuse_pgd(struct vm_area_stru
+ 		pgd_clear(dir);
+ 		return 0;
+ 	}
+-	pmd = pmd_offset(dir, address);
++	pmd = pmd_offset_map(dir, address);
+ 	offset = address & PGDIR_MASK;
+ 	address &= ~PGDIR_MASK;
+ 	end = address + size;
+@@ -463,6 +463,7 @@ static int unuse_pgd(struct vm_area_stru
+ 		address = (address + PMD_SIZE) & PMD_MASK;
+ 		pmd++;
+ 	} while (address && (address < end));
++	pmd_unmap(pmd - 1);
+ 	return 0;
+ }
+ 
+--- linux-2.6.0-test1/mm/swap_state.c	2003-06-26 22:07:26.000000000 -0700
++++ 25/mm/swap_state.c	2003-07-19 17:07:03.000000000 -0700
+@@ -35,6 +35,7 @@ struct address_space swapper_space = {
+ 	.i_mmap		= LIST_HEAD_INIT(swapper_space.i_mmap),
+ 	.i_mmap_shared	= LIST_HEAD_INIT(swapper_space.i_mmap_shared),
+ 	.i_shared_sem	= __MUTEX_INITIALIZER(swapper_space.i_shared_sem),
++	.truncate_count  = ATOMIC_INIT(0),
+ 	.private_lock	= SPIN_LOCK_UNLOCKED,
+ 	.private_list	= LIST_HEAD_INIT(swapper_space.private_list),
+ };
+--- linux-2.6.0-test1/mm/vmalloc.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/mm/vmalloc.c	2003-07-19 17:07:16.000000000 -0700
+@@ -70,7 +70,7 @@ static void unmap_area_pmd(pgd_t *dir, u
+ 		return;
+ 	}
+ 
+-	pmd = pmd_offset(dir, address);
++	pmd = pmd_offset_kernel(dir, address);
+ 	address &= ~PGDIR_MASK;
+ 	end = address + size;
+ 	if (end > PGDIR_SIZE)
+@@ -159,7 +159,7 @@ int map_vm_area(struct vm_struct *area, 
+ 	dir = pgd_offset_k(address);
+ 	spin_lock(&init_mm.page_table_lock);
+ 	do {
+-		pmd_t *pmd = pmd_alloc(&init_mm, dir, address);
++		pmd_t *pmd = pmd_alloc_kernel(&init_mm, dir, address);
+ 		if (!pmd) {
+ 			err = -ENOMEM;
+ 			break;
+--- linux-2.6.0-test1/mm/vmscan.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/mm/vmscan.c	2003-07-19 17:06:15.000000000 -0700
+@@ -921,7 +921,7 @@ static int balance_pgdat(pg_data_t *pgda
+ 			if (i < ZONE_HIGHMEM) {
+ 				reclaim_state->reclaimed_slab = 0;
+ 				shrink_slab(max_scan + nr_mapped, GFP_KERNEL);
+-				to_free += reclaim_state->reclaimed_slab;
++				to_free -= reclaim_state->reclaimed_slab;
+ 			}
+ 			if (zone->all_unreclaimable)
+ 				continue;
+@@ -930,7 +930,8 @@ static int balance_pgdat(pg_data_t *pgda
+ 		}
+ 		if (all_zones_ok)
+ 			break;
+-		blk_congestion_wait(WRITE, HZ/10);
++		if (to_free)
++			blk_congestion_wait(WRITE, HZ/10);
+ 	}
+ 	return nr_pages - to_free;
+ }
+@@ -956,11 +957,11 @@ int kswapd(void *p)
+ 	struct reclaim_state reclaim_state = {
+ 		.reclaimed_slab = 0,
+ 	};
+-	unsigned long cpumask;
++	cpumask_t cpumask;
+ 
+ 	daemonize("kswapd%d", pgdat->node_id);
+ 	cpumask = node_to_cpumask(pgdat->node_id);
+-	if (cpumask)
++	if (!cpus_empty(cpumask))
+ 		set_cpus_allowed(tsk, cpumask);
+ 	current->reclaim_state = &reclaim_state;
+ 
+--- linux-2.6.0-test1/net/atm/br2684.c	2003-06-14 12:18:08.000000000 -0700
++++ 25/net/atm/br2684.c	2003-07-19 17:03:51.000000000 -0700
+@@ -16,9 +16,12 @@ Author: Marcell GAL, 2000, XDSL Ltd, Hun
+ #include <linux/ip.h>
+ #include <asm/uaccess.h>
+ #include <net/arp.h>
++#include <linux/atm.h>
++#include <linux/atmdev.h>
+ 
+ #include <linux/atmbr2684.h>
+ 
++#include "common.h"
+ #include "ipcommon.h"
+ 
+ /*
+@@ -768,8 +771,6 @@ static struct file_operations br2684_pro
+ 
+ extern struct proc_dir_entry *atm_proc_root;	/* from proc.c */
+ 
+-extern int (*br2684_ioctl_hook)(struct atm_vcc *, unsigned int, unsigned long);
+-
+ /* the following avoids some spurious warnings from the compiler */
+ #define UNUSED __attribute__((unused))
+ 
+@@ -779,14 +780,14 @@ static int __init UNUSED br2684_init(voi
+ 	if ((p = create_proc_entry("br2684", 0, atm_proc_root)) == NULL)
+ 		return -ENOMEM;
+ 	p->proc_fops = &br2684_proc_operations;
+-	br2684_ioctl_hook = br2684_ioctl;
++	br2684_ioctl_set(br2684_ioctl);
+ 	return 0;
+ }
+ 
+ static void __exit UNUSED br2684_exit(void)
+ {
+ 	struct br2684_dev *brdev;
+-	br2684_ioctl_hook = NULL;
++	br2684_ioctl_set(NULL);
+ 	remove_proc_entry("br2684", atm_proc_root);
+ 	while (!list_empty(&br2684_devs)) {
+ 		brdev = list_entry_brdev(br2684_devs.next);
+--- linux-2.6.0-test1/net/atm/clip.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/net/atm/clip.c	2003-07-19 17:03:51.000000000 -0700
+@@ -67,7 +67,7 @@ static int to_atmarpd(enum atmarp_ctrl_t
+ 	ctrl->ip = ip;
+ 	atm_force_charge(atmarpd,skb->truesize);
+ 	skb_queue_tail(&atmarpd->sk->sk_receive_queue, skb);
+-	wake_up(&atmarpd->sleep);
++	atmarpd->sk->sk_data_ready(atmarpd->sk, skb->len);
+ 	return 0;
+ }
+ 
+--- linux-2.6.0-test1/net/atm/common.c	2003-07-02 14:53:18.000000000 -0700
++++ 25/net/atm/common.c	2003-07-19 17:03:51.000000000 -0700
+@@ -129,14 +129,34 @@ EXPORT_SYMBOL(atm_clip_ops_set);
+ #endif
+ 
+ #if defined(CONFIG_PPPOATM) || defined(CONFIG_PPPOATM_MODULE)
+-int (*pppoatm_ioctl_hook)(struct atm_vcc *, unsigned int, unsigned long);
+-EXPORT_SYMBOL(pppoatm_ioctl_hook);
++static DECLARE_MUTEX(pppoatm_ioctl_mutex);
++
++static int (*pppoatm_ioctl_hook)(struct atm_vcc *, unsigned int, unsigned long);
++
++void pppoatm_ioctl_set(int (*hook)(struct atm_vcc *, unsigned int, unsigned long))
++{
++	down(&pppoatm_ioctl_mutex);
++	pppoatm_ioctl_hook = hook;
++	up(&pppoatm_ioctl_mutex);
++}
++#ifdef CONFIG_PPPOATM_MODULE
++EXPORT_SYMBOL(pppoatm_ioctl_set);
++#endif
+ #endif
+ 
+ #if defined(CONFIG_ATM_BR2684) || defined(CONFIG_ATM_BR2684_MODULE)
+-int (*br2684_ioctl_hook)(struct atm_vcc *, unsigned int, unsigned long);
++static DECLARE_MUTEX(br2684_ioctl_mutex);
++
++static int (*br2684_ioctl_hook)(struct atm_vcc *, unsigned int, unsigned long);
++
++void br2684_ioctl_set(int (*hook)(struct atm_vcc *, unsigned int, unsigned long))
++{
++	down(&br2684_ioctl_mutex);
++	br2684_ioctl_hook = hook;
++	up(&br2684_ioctl_mutex);
++}
+ #ifdef CONFIG_ATM_BR2684_MODULE
+-EXPORT_SYMBOL(br2684_ioctl_hook);
++EXPORT_SYMBOL(br2684_ioctl_set);
+ #endif
+ #endif
+ 
+@@ -215,6 +235,37 @@ static void vcc_sock_destruct(struct soc
+ 
+ 	kfree(sk->sk_protinfo);
+ }
++
++static void vcc_def_wakeup(struct sock *sk)
++{
++	read_lock(&sk->sk_callback_lock);
++	if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
++		wake_up(sk->sk_sleep);
++	read_unlock(&sk->sk_callback_lock);
++}
++
++static inline int vcc_writable(struct sock *sk)
++{
++	struct atm_vcc *vcc = atm_sk(sk);
++
++	return (vcc->qos.txtp.max_sdu +
++	        atomic_read(&sk->sk_wmem_alloc)) <= sk->sk_sndbuf;
++}
++
++static void vcc_write_space(struct sock *sk)
++{       
++	read_lock(&sk->sk_callback_lock);
++
++	if (vcc_writable(sk)) {
++		if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
++			wake_up_interruptible(sk->sk_sleep);
++
++		sk_wake_async(sk, 2, POLL_OUT);
++	}
++
++	read_unlock(&sk->sk_callback_lock);
++}
++
+  
+ int vcc_create(struct socket *sock, int protocol, int family)
+ {
+@@ -227,7 +278,9 @@ int vcc_create(struct socket *sock, int 
+ 	sk = sk_alloc(family, GFP_KERNEL, 1, NULL);
+ 	if (!sk)
+ 		return -ENOMEM;
+-	sock_init_data(NULL, sk);
++	sock_init_data(sock, sk);
++	sk->sk_state_change = vcc_def_wakeup;
++	sk->sk_write_space = vcc_write_space;
+ 
+ 	vcc = atm_sk(sk) = kmalloc(sizeof(*vcc), GFP_KERNEL);
+ 	if (!vcc) {
+@@ -238,7 +291,6 @@ int vcc_create(struct socket *sock, int 
+ 	memset(vcc, 0, sizeof(*vcc));
+ 	vcc->sk = sk;
+ 	vcc->dev = NULL;
+-	vcc->callback = NULL;
+ 	memset(&vcc->local,0,sizeof(struct sockaddr_atmsvc));
+ 	memset(&vcc->remote,0,sizeof(struct sockaddr_atmsvc));
+ 	vcc->qos.txtp.max_sdu = 1 << 16; /* for meta VCs */
+@@ -249,8 +301,6 @@ int vcc_create(struct socket *sock, int 
+ 	vcc->push_oam = NULL;
+ 	vcc->vpi = vcc->vci = 0; /* no VCI/VPI yet */
+ 	vcc->atm_options = vcc->aal_options = 0;
+-	init_waitqueue_head(&vcc->sleep);
+-	sk->sk_sleep = &vcc->sleep;
+ 	sk->sk_destruct = vcc_sock_destruct;
+ 	sock->sk = sk;
+ 	return 0;
+@@ -300,9 +350,9 @@ int vcc_release(struct socket *sock)
+ void vcc_release_async(struct atm_vcc *vcc, int reply)
+ {
+ 	set_bit(ATM_VF_CLOSE, &vcc->flags);
+-	vcc->reply = reply;
+ 	vcc->sk->sk_err = -reply;
+-	wake_up(&vcc->sleep);
++	clear_bit(ATM_VF_WAITING, &vcc->flags);
++	vcc->sk->sk_state_change(vcc->sk);
+ }
+ 
+ 
+@@ -475,7 +525,7 @@ int vcc_recvmsg(struct kiocb *iocb, stru
+ 	vcc = ATM_SD(sock);
+ 	if (test_bit(ATM_VF_RELEASED,&vcc->flags) ||
+ 	    test_bit(ATM_VF_CLOSE,&vcc->flags))
+-		return vcc->reply;
++		return -sk->sk_err;
+ 	if (!test_bit(ATM_VF_READY, &vcc->flags))
+ 		return 0;
+ 
+@@ -532,7 +582,7 @@ int vcc_sendmsg(struct kiocb *iocb, stru
+ 	vcc = ATM_SD(sock);
+ 	if (test_bit(ATM_VF_RELEASED, &vcc->flags) ||
+ 	    test_bit(ATM_VF_CLOSE, &vcc->flags)) {
+-		error = vcc->reply;
++		error = -sk->sk_err;
+ 		goto out;
+ 	}
+ 	if (!test_bit(ATM_VF_READY, &vcc->flags)) {
+@@ -549,7 +599,7 @@ int vcc_sendmsg(struct kiocb *iocb, stru
+ 	}
+ 	/* verify_area is done by net/socket.c */
+ 	eff = (size+3) & ~3; /* align to word boundary */
+-	prepare_to_wait(&vcc->sleep, &wait, TASK_INTERRUPTIBLE);
++	prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+ 	error = 0;
+ 	while (!(skb = alloc_tx(vcc,eff))) {
+ 		if (m->msg_flags & MSG_DONTWAIT) {
+@@ -563,16 +613,16 @@ int vcc_sendmsg(struct kiocb *iocb, stru
+ 		}
+ 		if (test_bit(ATM_VF_RELEASED,&vcc->flags) ||
+ 		    test_bit(ATM_VF_CLOSE,&vcc->flags)) {
+-			error = vcc->reply;
++			error = -sk->sk_err;
+ 			break;
+ 		}
+ 		if (!test_bit(ATM_VF_READY,&vcc->flags)) {
+ 			error = -EPIPE;
+ 			break;
+ 		}
+-		prepare_to_wait(&vcc->sleep, &wait, TASK_INTERRUPTIBLE);
++		prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+ 	}
+-	finish_wait(&vcc->sleep, &wait);
++	finish_wait(sk->sk_sleep, &wait);
+ 	if (error)
+ 		goto out;
+ 	skb->dev = NULL; /* for paths shared with net_device interfaces */
+@@ -591,29 +641,38 @@ out:
+ }
+ 
+ 
+-unsigned int atm_poll(struct file *file,struct socket *sock,poll_table *wait)
++unsigned int vcc_poll(struct file *file, struct socket *sock, poll_table *wait)
+ {
++	struct sock *sk = sock->sk;
+ 	struct atm_vcc *vcc;
+ 	unsigned int mask;
+ 
+-	vcc = ATM_SD(sock);
+-	poll_wait(file,&vcc->sleep,wait);
++	poll_wait(file, sk->sk_sleep, wait);
+ 	mask = 0;
+-	if (skb_peek(&vcc->sk->sk_receive_queue))
+-		mask |= POLLIN | POLLRDNORM;
+-	if (test_bit(ATM_VF_RELEASED,&vcc->flags) ||
+-	    test_bit(ATM_VF_CLOSE,&vcc->flags))
++
++	vcc = ATM_SD(sock);
++
++	/* exceptional events */
++	if (sk->sk_err)
++		mask = POLLERR;
++
++	if (test_bit(ATM_VF_RELEASED, &vcc->flags) ||
++	    test_bit(ATM_VF_CLOSE, &vcc->flags))
+ 		mask |= POLLHUP;
+-	if (sock->state != SS_CONNECTING) {
+-		if (vcc->qos.txtp.traffic_class != ATM_NONE &&
+-		    vcc->qos.txtp.max_sdu +
+-		    atomic_read(&vcc->sk->sk_wmem_alloc) <= vcc->sk->sk_sndbuf)
+-			mask |= POLLOUT | POLLWRNORM;
+-	}
+-	else if (vcc->reply != WAITING) {
+-			mask |= POLLOUT | POLLWRNORM;
+-			if (vcc->reply) mask |= POLLERR;
+-		}
++
++	/* readable? */
++	if (!skb_queue_empty(&sk->sk_receive_queue))
++		mask |= POLLIN | POLLRDNORM;
++
++	/* writable? */
++	if (sock->state == SS_CONNECTING &&
++	    test_bit(ATM_VF_WAITING, &vcc->flags))
++		return mask;
++
++	if (vcc->qos.txtp.traffic_class != ATM_NONE &&
++	    vcc_writable(vcc->sk))
++		mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
++
+ 	return mask;
+ }
+ 
+@@ -859,19 +918,22 @@ int vcc_ioctl(struct socket *sock, unsig
+ 		default:
+ 			break;
+ 	}
++	error = -ENOIOCTLCMD;
+ #if defined(CONFIG_PPPOATM) || defined(CONFIG_PPPOATM_MODULE)
+-	if (pppoatm_ioctl_hook) {
++	down(&pppoatm_ioctl_mutex);
++	if (pppoatm_ioctl_hook)
+ 		error = pppoatm_ioctl_hook(vcc, cmd, arg);
+-		if (error != -ENOIOCTLCMD)
+-			goto done;
+-	}
++	up(&pppoatm_ioctl_mutex);
++	if (error != -ENOIOCTLCMD)
++		goto done;
+ #endif
+ #if defined(CONFIG_ATM_BR2684) || defined(CONFIG_ATM_BR2684_MODULE)
+-	if (br2684_ioctl_hook) {
++	down(&br2684_ioctl_mutex);
++	if (br2684_ioctl_hook)
+ 		error = br2684_ioctl_hook(vcc, cmd, arg);
+-		if (error != -ENOIOCTLCMD)
+-			goto done;
+-	}
++	up(&br2684_ioctl_mutex);
++	if (error != -ENOIOCTLCMD)
++		goto done;
+ #endif
+ 
+ 	error = atm_dev_ioctl(cmd, arg);
+--- linux-2.6.0-test1/net/atm/common.h	2003-07-02 14:53:18.000000000 -0700
++++ 25/net/atm/common.h	2003-07-19 17:03:51.000000000 -0700
+@@ -17,7 +17,7 @@ int vcc_recvmsg(struct kiocb *iocb, stru
+ 		int size, int flags);
+ int vcc_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,
+ 		int total_len);
+-unsigned int atm_poll(struct file *file,struct socket *sock,poll_table *wait);
++unsigned int vcc_poll(struct file *file, struct socket *sock, poll_table *wait);
+ int vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
+ int vcc_setsockopt(struct socket *sock, int level, int optname, char *optval,
+ 		   int optlen);
+@@ -26,6 +26,9 @@ int vcc_getsockopt(struct socket *sock, 
+ 
+ void atm_shutdown_dev(struct atm_dev *dev);
+ 
++void pppoatm_ioctl_set(int (*hook)(struct atm_vcc *, unsigned int, unsigned long));
++void br2684_ioctl_set(int (*hook)(struct atm_vcc *, unsigned int, unsigned long));
++
+ int atmpvc_init(void);
+ void atmpvc_exit(void);
+ int atmsvc_init(void);
+--- linux-2.6.0-test1/net/atm/lec.c	2003-07-02 14:53:18.000000000 -0700
++++ 25/net/atm/lec.c	2003-07-19 17:03:51.000000000 -0700
+@@ -134,7 +134,7 @@ static void lec_handle_bridge(struct sk_
+                 priv = (struct lec_priv *)dev->priv;
+                 atm_force_charge(priv->lecd, skb2->truesize);
+                 skb_queue_tail(&priv->lecd->sk->sk_receive_queue, skb2);
+-                wake_up(&priv->lecd->sleep);
++                priv->lecd->sk->sk_data_ready(priv->lecd->sk, skb2->len);
+         }
+ 
+         return;
+@@ -513,7 +513,7 @@ lec_atm_send(struct atm_vcc *vcc, struct
+                         memcpy(skb2->data, mesg, sizeof(struct atmlec_msg));
+                         atm_force_charge(priv->lecd, skb2->truesize);
+                         skb_queue_tail(&priv->lecd->sk->sk_receive_queue, skb2);
+-                        wake_up(&priv->lecd->sleep);
++                        priv->lecd->sk->sk_data_ready(priv->lecd->sk, skb2->len);
+                 }
+                 if (f != NULL) br_fdb_put_hook(f);
+ #endif /* defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) */
+@@ -598,13 +598,13 @@ send_to_lecd(struct lec_priv *priv, atml
+ 
+         atm_force_charge(priv->lecd, skb->truesize);
+ 	skb_queue_tail(&priv->lecd->sk->sk_receive_queue, skb);
+-        wake_up(&priv->lecd->sleep);
++        priv->lecd->sk->sk_data_ready(priv->lecd->sk, skb->len);
+ 
+         if (data != NULL) {
+                 DPRINTK("lec: about to send %d bytes of data\n", data->len);
+                 atm_force_charge(priv->lecd, data->truesize);
+                 skb_queue_tail(&priv->lecd->sk->sk_receive_queue, data);
+-                wake_up(&priv->lecd->sleep);
++                priv->lecd->sk->sk_data_ready(priv->lecd->sk, skb->len);
+         }
+ 
+         return 0;
+@@ -686,7 +686,7 @@ lec_push(struct atm_vcc *vcc, struct sk_
+         if (memcmp(skb->data, lec_ctrl_magic, 4) ==0) { /* Control frame, to daemon*/
+                 DPRINTK("%s: To daemon\n",dev->name);
+                 skb_queue_tail(&vcc->sk->sk_receive_queue, skb);
+-                wake_up(&vcc->sleep);
++                vcc->sk->sk_data_ready(vcc->sk, skb->len);
+         } else { /* Data frame, queue to protocol handlers */
+                 unsigned char *dst;
+ 
+--- linux-2.6.0-test1/net/atm/mpc.c	2003-07-02 14:53:18.000000000 -0700
++++ 25/net/atm/mpc.c	2003-07-19 17:03:51.000000000 -0700
+@@ -669,7 +669,7 @@ static void mpc_push(struct atm_vcc *vcc
+ 		dprintk("mpoa: (%s) mpc_push: control packet arrived\n", dev->name);
+ 		/* Pass control packets to daemon */
+ 		skb_queue_tail(&vcc->sk->sk_receive_queue, skb);
+-		wake_up(&vcc->sleep);
++		vcc->sk->sk_data_ready(vcc->sk, skb->len);
+ 		return;
+ 	}
+ 
+@@ -947,7 +947,7 @@ int msg_to_mpoad(struct k_message *mesg,
+ 	memcpy(skb->data, mesg, sizeof(struct k_message));
+ 	atm_force_charge(mpc->mpoad_vcc, skb->truesize);
+ 	skb_queue_tail(&mpc->mpoad_vcc->sk->sk_receive_queue, skb);
+-	wake_up(&mpc->mpoad_vcc->sleep);
++	mpc->mpoad_vcc->sk->sk_data_ready(mpc->mpoad_vcc->sk, skb->len);
+ 
+ 	return 0;
+ }
+@@ -1226,7 +1226,7 @@ static void purge_egress_shortcut(struct
+ 
+ 	atm_force_charge(vcc, skb->truesize);
+ 	skb_queue_tail(&vcc->sk->sk_receive_queue, skb);
+-	wake_up(&vcc->sleep);
++	vcc->sk->sk_data_ready(vcc->sk, skb->len);
+ 	dprintk("mpoa: purge_egress_shortcut: exiting:\n");
+ 
+ 	return;
+--- linux-2.6.0-test1/net/atm/pppoatm.c	2003-06-14 12:18:24.000000000 -0700
++++ 25/net/atm/pppoatm.c	2003-07-19 17:03:51.000000000 -0700
+@@ -44,6 +44,8 @@
+ #include <linux/ppp_channel.h>
+ #include <linux/atmppp.h>
+ 
++#include "common.h"
++
+ #if 0
+ #define DPRINTK(format, args...) \
+ 	printk(KERN_DEBUG "pppoatm: " format, ##args)
+@@ -344,17 +346,15 @@ static int pppoatm_ioctl(struct atm_vcc 
+ /* the following avoids some spurious warnings from the compiler */
+ #define UNUSED __attribute__((unused))
+ 
+-extern int (*pppoatm_ioctl_hook)(struct atm_vcc *, unsigned int, unsigned long);
+-
+ static int __init UNUSED pppoatm_init(void)
+ {
+-	pppoatm_ioctl_hook = pppoatm_ioctl;
++	pppoatm_ioctl_set(pppoatm_ioctl);
+ 	return 0;
+ }
+ 
+ static void __exit UNUSED pppoatm_exit(void)
+ {
+-	pppoatm_ioctl_hook = NULL;
++	pppoatm_ioctl_set(NULL);
+ }
+ 
+ module_init(pppoatm_init);
+--- linux-2.6.0-test1/net/atm/proc.c	2003-07-02 14:53:18.000000000 -0700
++++ 25/net/atm/proc.c	2003-07-19 17:03:51.000000000 -0700
+@@ -224,7 +224,7 @@ static void vc_info(struct atm_vcc *vcc,
+ 			here += sprintf(here, "%3d", vcc->sk->sk_family);
+ 	}
+ 	here += sprintf(here," %04lx  %5d %7d/%7d %7d/%7d\n",vcc->flags,
+-	    vcc->reply,
++	    vcc->sk->sk_err,
+ 	    atomic_read(&vcc->sk->sk_wmem_alloc), vcc->sk->sk_sndbuf,
+ 	    atomic_read(&vcc->sk->sk_rmem_alloc), vcc->sk->sk_rcvbuf);
+ }
+--- linux-2.6.0-test1/net/atm/pvc.c	2003-07-02 14:53:18.000000000 -0700
++++ 25/net/atm/pvc.c	2003-07-19 17:03:51.000000000 -0700
+@@ -111,7 +111,7 @@ static struct proto_ops pvc_proto_ops = 
+ 	.socketpair =	sock_no_socketpair,
+ 	.accept =	sock_no_accept,
+ 	.getname =	pvc_getname,
+-	.poll =		atm_poll,
++	.poll =		vcc_poll,
+ 	.ioctl =	vcc_ioctl,
+ 	.listen =	sock_no_listen,
+ 	.shutdown =	pvc_shutdown,
+--- linux-2.6.0-test1/net/atm/raw.c	2003-06-14 12:18:34.000000000 -0700
++++ 25/net/atm/raw.c	2003-07-19 17:03:51.000000000 -0700
+@@ -29,7 +29,7 @@ void atm_push_raw(struct atm_vcc *vcc,st
+ {
+ 	if (skb) {
+ 		skb_queue_tail(&vcc->sk->sk_receive_queue, skb);
+-		wake_up(&vcc->sleep);
++		vcc->sk->sk_data_ready(vcc->sk, skb->len);
+ 	}
+ }
+ 
+@@ -40,7 +40,7 @@ static void atm_pop_raw(struct atm_vcc *
+ 		skb->truesize);
+ 	atomic_sub(skb->truesize, &vcc->sk->sk_wmem_alloc);
+ 	dev_kfree_skb_any(skb);
+-	wake_up(&vcc->sleep);
++	vcc->sk->sk_write_space(vcc->sk);
+ }
+ 
+ 
+--- linux-2.6.0-test1/net/atm/signaling.c	2003-07-02 14:53:18.000000000 -0700
++++ 25/net/atm/signaling.c	2003-07-19 17:03:51.000000000 -0700
+@@ -61,7 +61,7 @@ static void sigd_put_skb(struct sk_buff 
+ #endif
+ 	atm_force_charge(sigd,skb->truesize);
+ 	skb_queue_tail(&sigd->sk->sk_receive_queue,skb);
+-	wake_up(&sigd->sleep);
++	sigd->sk->sk_data_ready(sigd->sk, skb->len);
+ }
+ 
+ 
+@@ -103,7 +103,8 @@ static int sigd_send(struct atm_vcc *vcc
+ 	vcc = *(struct atm_vcc **) &msg->vcc;
+ 	switch (msg->type) {
+ 		case as_okay:
+-			vcc->reply = msg->reply;
++			vcc->sk->sk_err = -msg->reply;
++			clear_bit(ATM_VF_WAITING, &vcc->flags);
+ 			if (!*vcc->local.sas_addr.prv &&
+ 			    !*vcc->local.sas_addr.pub) {
+ 				vcc->local.sas_family = AF_ATMSVC;
+@@ -123,8 +124,8 @@ static int sigd_send(struct atm_vcc *vcc
+ 		case as_error:
+ 			clear_bit(ATM_VF_REGIS,&vcc->flags);
+ 			clear_bit(ATM_VF_READY,&vcc->flags);
+-			vcc->reply = msg->reply;
+ 			vcc->sk->sk_err = -msg->reply;
++			clear_bit(ATM_VF_WAITING, &vcc->flags);
+ 			break;
+ 		case as_indicate:
+ 			vcc = *(struct atm_vcc **) &msg->listen_vcc;
+@@ -137,19 +138,16 @@ static int sigd_send(struct atm_vcc *vcc
+ 			}
+ 			vcc->sk->sk_ack_backlog++;
+ 			skb_queue_tail(&vcc->sk->sk_receive_queue, skb);
+-			if (vcc->callback) {
+-				DPRINTK("waking vcc->sleep 0x%p\n",
+-				    &vcc->sleep);
+-				vcc->callback(vcc);
+-			}
++			DPRINTK("waking vcc->sk->sk_sleep 0x%p\n", vcc->sk->sk_sleep);
++			vcc->sk->sk_state_change(vcc->sk);
+ as_indicate_complete:
+ 			release_sock(vcc->sk);
+ 			return 0;
+ 		case as_close:
+ 			set_bit(ATM_VF_RELEASED,&vcc->flags);
+ 			clear_bit(ATM_VF_READY,&vcc->flags);
+-			vcc->reply = msg->reply;
+ 			vcc->sk->sk_err = -msg->reply;
++			clear_bit(ATM_VF_WAITING, &vcc->flags);
+ 			break;
+ 		case as_modify:
+ 			modify_qos(vcc,msg);
+@@ -159,7 +157,7 @@ as_indicate_complete:
+ 			    (int) msg->type);
+ 			return -EINVAL;
+ 	}
+-	if (vcc->callback) vcc->callback(vcc);
++	vcc->sk->sk_state_change(vcc->sk);
+ 	dev_kfree_skb(skb);
+ 	return 0;
+ }
+@@ -205,9 +203,9 @@ static void purge_vcc(struct atm_vcc *vc
+ 	if (vcc->sk->sk_family == PF_ATMSVC &&
+ 	    !test_bit(ATM_VF_META,&vcc->flags)) {
+ 		set_bit(ATM_VF_RELEASED,&vcc->flags);
+-		vcc->reply = -EUNATCH;
+ 		vcc->sk->sk_err = EUNATCH;
+-		wake_up(&vcc->sleep);
++		clear_bit(ATM_VF_WAITING, &vcc->flags);
++		vcc->sk->sk_state_change(vcc->sk);
+ 	}
+ }
+ 
+--- linux-2.6.0-test1/net/atm/signaling.h	2003-06-14 12:17:56.000000000 -0700
++++ 25/net/atm/signaling.h	2003-07-19 17:03:51.000000000 -0700
+@@ -11,9 +11,6 @@
+ #include <linux/atmsvc.h>
+ 
+ 
+-#define WAITING 1 /* for reply: 0: no error, < 0: error, ... */
+-
+-
+ extern struct atm_vcc *sigd; /* needed in svc_release */
+ 
+ 
+--- linux-2.6.0-test1/net/atm/svc.c	2003-07-02 14:53:18.000000000 -0700
++++ 25/net/atm/svc.c	2003-07-19 17:03:51.000000000 -0700
+@@ -43,14 +43,6 @@ static int svc_create(struct socket *soc
+  */
+ 
+ 
+-void svc_callback(struct atm_vcc *vcc)
+-{
+-	wake_up(&vcc->sleep);
+-}
+-
+-
+-
+-
+ static int svc_shutdown(struct socket *sock,int how)
+ {
+ 	return 0;
+@@ -64,13 +56,13 @@ static void svc_disconnect(struct atm_vc
+ 
+ 	DPRINTK("svc_disconnect %p\n",vcc);
+ 	if (test_bit(ATM_VF_REGIS,&vcc->flags)) {
+-		prepare_to_wait(&vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++		prepare_to_wait(vcc->sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+ 		sigd_enq(vcc,as_close,NULL,NULL,NULL);
+ 		while (!test_bit(ATM_VF_RELEASED,&vcc->flags) && sigd) {
+ 			schedule();
+-			prepare_to_wait(&vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++			prepare_to_wait(vcc->sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+ 		}
+-		finish_wait(&vcc->sleep, &wait);
++		finish_wait(vcc->sk->sk_sleep, &wait);
+ 	}
+ 	/* beware - socket is still in use by atmsigd until the last
+ 	   as_indicate has been answered */
+@@ -145,22 +137,22 @@ static int svc_bind(struct socket *sock,
+ 		goto out;
+ 	}
+ 	vcc->local = *addr;
+-	vcc->reply = WAITING;
+-	prepare_to_wait(&vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++	set_bit(ATM_VF_WAITING, &vcc->flags);
++	prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+ 	sigd_enq(vcc,as_bind,NULL,NULL,&vcc->local);
+-	while (vcc->reply == WAITING && sigd) {
++	while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
+ 		schedule();
+-		prepare_to_wait(&vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++		prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+ 	}
+-	finish_wait(&vcc->sleep, &wait);
++	finish_wait(sk->sk_sleep, &wait);
+ 	clear_bit(ATM_VF_REGIS,&vcc->flags); /* doesn't count */
+ 	if (!sigd) {
+ 		error = -EUNATCH;
+ 		goto out;
+ 	}
+-        if (!vcc->reply)
++        if (!sk->sk_err)
+ 		set_bit(ATM_VF_BOUND,&vcc->flags);
+-	error = vcc->reply;
++	error = -sk->sk_err;
+ out:
+ 	release_sock(sk);
+ 	return error;
+@@ -191,13 +183,13 @@ static int svc_connect(struct socket *so
+ 		error = -EISCONN;
+ 		goto out;
+ 	case SS_CONNECTING:
+-		if (vcc->reply == WAITING) {
++		if (test_bit(ATM_VF_WAITING, &vcc->flags)) {
+ 			error = -EALREADY;
+ 			goto out;
+ 		}
+ 		sock->state = SS_UNCONNECTED;
+-		if (vcc->reply) {
+-			error = vcc->reply;
++		if (sk->sk_err) {
++			error = -sk->sk_err;
+ 			goto out;
+ 		}
+ 		break;
+@@ -226,20 +218,20 @@ static int svc_connect(struct socket *so
+ 			goto out;
+ 		}
+ 		vcc->remote = *addr;
+-		vcc->reply = WAITING;
+-		prepare_to_wait(&vcc->sleep, &wait, TASK_INTERRUPTIBLE);
++		set_bit(ATM_VF_WAITING, &vcc->flags);
++		prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+ 		sigd_enq(vcc,as_connect,NULL,NULL,&vcc->remote);
+ 		if (flags & O_NONBLOCK) {
+-			finish_wait(&vcc->sleep, &wait);
++			finish_wait(sk->sk_sleep, &wait);
+ 			sock->state = SS_CONNECTING;
+ 			error = -EINPROGRESS;
+ 			goto out;
+ 		}
+ 		error = 0;
+-		while (vcc->reply == WAITING && sigd) {
++		while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
+ 			schedule();
+ 			if (!signal_pending(current)) {
+-				prepare_to_wait(&vcc->sleep, &wait, TASK_INTERRUPTIBLE);
++				prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+ 				continue;
+ 			}
+ 			DPRINTK("*ABORT*\n");
+@@ -256,14 +248,14 @@ static int svc_connect(struct socket *so
+ 			 *   Kernel <--close--- Demon
+ 			 */
+ 			sigd_enq(vcc,as_close,NULL,NULL,NULL);
+-			while (vcc->reply == WAITING && sigd) {
+-				prepare_to_wait(&vcc->sleep, &wait, TASK_INTERRUPTIBLE);
++			while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
++				prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+ 				schedule();
+ 			}
+-			if (!vcc->reply)
++			if (!sk->sk_err)
+ 				while (!test_bit(ATM_VF_RELEASED,&vcc->flags)
+ 				    && sigd) {
+-					prepare_to_wait(&vcc->sleep, &wait, TASK_INTERRUPTIBLE);
++					prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+ 					schedule();
+ 				}
+ 			clear_bit(ATM_VF_REGIS,&vcc->flags);
+@@ -273,15 +265,15 @@ static int svc_connect(struct socket *so
+ 			error = -EINTR;
+ 			break;
+ 		}
+-		finish_wait(&vcc->sleep, &wait);
++		finish_wait(sk->sk_sleep, &wait);
+ 		if (error)
+ 			goto out;
+ 		if (!sigd) {
+ 			error = -EUNATCH;
+ 			goto out;
+ 		}
+-		if (vcc->reply) {
+-			error = vcc->reply;
++		if (sk->sk_err) {
++			error = -sk->sk_err;
+ 			goto out;
+ 		}
+ 	}
+@@ -319,14 +311,14 @@ static int svc_listen(struct socket *soc
+ 		error = -EINVAL;
+ 		goto out;
+ 	}
+-	vcc->reply = WAITING;
+-	prepare_to_wait(&vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++	set_bit(ATM_VF_WAITING, &vcc->flags);
++	prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+ 	sigd_enq(vcc,as_listen,NULL,NULL,&vcc->local);
+-	while (vcc->reply == WAITING && sigd) {
++	while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
+ 		schedule();
+-		prepare_to_wait(&vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++		prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+ 	}
+-	finish_wait(&vcc->sleep, &wait);
++	finish_wait(sk->sk_sleep, &wait);
+ 	if (!sigd) {
+ 		error = -EUNATCH;
+ 		goto out;
+@@ -334,7 +326,7 @@ static int svc_listen(struct socket *soc
+ 	set_bit(ATM_VF_LISTEN,&vcc->flags);
+ 	vcc->sk->sk_max_ack_backlog = backlog > 0 ? backlog :
+ 						    ATM_BACKLOG_DEFAULT;
+-	error = vcc->reply;
++	error = -sk->sk_err;
+ out:
+ 	release_sock(sk);
+ 	return error;
+@@ -362,12 +354,12 @@ static int svc_accept(struct socket *soc
+ 	while (1) {
+ 		DEFINE_WAIT(wait);
+ 
+-		prepare_to_wait(&old_vcc->sleep, &wait, TASK_INTERRUPTIBLE);
++		prepare_to_wait(old_vcc->sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+ 		while (!(skb = skb_dequeue(&old_vcc->sk->sk_receive_queue)) &&
+ 		       sigd) {
+ 			if (test_bit(ATM_VF_RELEASED,&old_vcc->flags)) break;
+ 			if (test_bit(ATM_VF_CLOSE,&old_vcc->flags)) {
+-				error = old_vcc->reply;
++				error = -sk->sk_err;
+ 				break;
+ 			}
+ 			if (flags & O_NONBLOCK) {
+@@ -381,9 +373,9 @@ static int svc_accept(struct socket *soc
+ 				error = -ERESTARTSYS;
+ 				break;
+ 			}
+-			prepare_to_wait(&old_vcc->sleep, &wait, TASK_INTERRUPTIBLE);
++			prepare_to_wait(old_vcc->sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+ 		}
+-		finish_wait(&old_vcc->sleep, &wait);
++		finish_wait(old_vcc->sk->sk_sleep, &wait);
+ 		if (error)
+ 			goto out;
+ 		if (!skb) {
+@@ -407,23 +399,24 @@ static int svc_accept(struct socket *soc
+ 			goto out;
+ 		}
+ 		/* wait should be short, so we ignore the non-blocking flag */
+-		new_vcc->reply = WAITING;
+-		prepare_to_wait(&new_vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++		set_bit(ATM_VF_WAITING, &new_vcc->flags);
++		prepare_to_wait(new_vcc->sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+ 		sigd_enq(new_vcc,as_accept,old_vcc,NULL,NULL);
+-		while (new_vcc->reply == WAITING && sigd) {
++		while (test_bit(ATM_VF_WAITING, &new_vcc->flags) && sigd) {
+ 			release_sock(sk);
+ 			schedule();
+ 			lock_sock(sk);
+-			prepare_to_wait(&new_vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++			prepare_to_wait(new_vcc->sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+ 		}
+-		finish_wait(&new_vcc->sleep, &wait);
++		finish_wait(new_vcc->sk->sk_sleep, &wait);
+ 		if (!sigd) {
+ 			error = -EUNATCH;
+ 			goto out;
+ 		}
+-		if (!new_vcc->reply) break;
+-		if (new_vcc->reply != -ERESTARTSYS) {
+-			error = new_vcc->reply;
++		if (!new_vcc->sk->sk_err)
++			break;
++		if (new_vcc->sk->sk_err != ERESTARTSYS) {
++			error = -new_vcc->sk->sk_err;
+ 			goto out;
+ 		}
+ 	}
+@@ -451,17 +444,17 @@ int svc_change_qos(struct atm_vcc *vcc,s
+ {
+ 	DEFINE_WAIT(wait);
+ 
+-	vcc->reply = WAITING;
+-	prepare_to_wait(&vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++	set_bit(ATM_VF_WAITING, &vcc->flags);
++	prepare_to_wait(vcc->sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+ 	sigd_enq2(vcc,as_modify,NULL,NULL,&vcc->local,qos,0);
+-	while (vcc->reply == WAITING && !test_bit(ATM_VF_RELEASED,&vcc->flags)
+-	    && sigd) {
++	while (test_bit(ATM_VF_WAITING, &vcc->flags) &&
++	       !test_bit(ATM_VF_RELEASED, &vcc->flags) && sigd) {
+ 		schedule();
+-		prepare_to_wait(&vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++		prepare_to_wait(vcc->sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+ 	}
+-	finish_wait(&vcc->sleep, &wait);
++	finish_wait(vcc->sk->sk_sleep, &wait);
+ 	if (!sigd) return -EUNATCH;
+-	return vcc->reply;
++	return -vcc->sk->sk_err;
+ }
+ 
+ 
+@@ -527,7 +520,7 @@ static struct proto_ops svc_proto_ops = 
+ 	.socketpair =	sock_no_socketpair,
+ 	.accept =	svc_accept,
+ 	.getname =	svc_getname,
+-	.poll =		atm_poll,
++	.poll =		vcc_poll,
+ 	.ioctl =	vcc_ioctl,
+ 	.listen =	svc_listen,
+ 	.shutdown =	svc_shutdown,
+@@ -547,7 +540,6 @@ static int svc_create(struct socket *soc
+ 	sock->ops = &svc_proto_ops;
+ 	error = vcc_create(sock, protocol, AF_ATMSVC);
+ 	if (error) return error;
+-	ATM_SD(sock)->callback = svc_callback;
+ 	ATM_SD(sock)->local.sas_family = AF_ATMSVC;
+ 	ATM_SD(sock)->remote.sas_family = AF_ATMSVC;
+ 	return 0;
+--- linux-2.6.0-test1/net/core/dev.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/net/core/dev.c	2003-07-19 17:03:51.000000000 -0700
+@@ -178,7 +178,7 @@ static struct notifier_block *netdev_cha
+  *	Device drivers call our routines to queue packets here. We empty the
+  *	queue in the local softnet handler.
+  */
+-struct softnet_data softnet_data[NR_CPUS] __cacheline_aligned;
++DEFINE_PER_CPU(struct softnet_data, softnet_data) = { 0, };
+ 
+ #ifdef CONFIG_NET_FASTROUTE
+ int netdev_fastroute;
+@@ -1280,34 +1280,35 @@ static void get_sample_stats(int cpu)
+ 	unsigned long rd;
+ 	int rq;
+ #endif
+-	int blog = softnet_data[cpu].input_pkt_queue.qlen;
+-	int avg_blog = softnet_data[cpu].avg_blog;
++	struct softnet_data *sd = &per_cpu(softnet_data, cpu);
++	int blog = sd->input_pkt_queue.qlen;
++	int avg_blog = sd->avg_blog;
+ 
+ 	avg_blog = (avg_blog >> 1) + (blog >> 1);
+ 
+ 	if (avg_blog > mod_cong) {
+ 		/* Above moderate congestion levels. */
+-		softnet_data[cpu].cng_level = NET_RX_CN_HIGH;
++		sd->cng_level = NET_RX_CN_HIGH;
+ #ifdef RAND_LIE
+ 		rd = net_random();
+ 		rq = rd % netdev_max_backlog;
+ 		if (rq < avg_blog) /* unlucky bastard */
+-			softnet_data[cpu].cng_level = NET_RX_DROP;
++			sd->cng_level = NET_RX_DROP;
+ #endif
+ 	} else if (avg_blog > lo_cong) {
+-		softnet_data[cpu].cng_level = NET_RX_CN_MOD;
++		sd->cng_level = NET_RX_CN_MOD;
+ #ifdef RAND_LIE
+ 		rd = net_random();
+ 		rq = rd % netdev_max_backlog;
+ 			if (rq < avg_blog) /* unlucky bastard */
+-				softnet_data[cpu].cng_level = NET_RX_CN_HIGH;
++				sd->cng_level = NET_RX_CN_HIGH;
+ #endif
+ 	} else if (avg_blog > no_cong)
+-		softnet_data[cpu].cng_level = NET_RX_CN_LOW;
++		sd->cng_level = NET_RX_CN_LOW;
+ 	else  /* no congestion */
+-		softnet_data[cpu].cng_level = NET_RX_SUCCESS;
++		sd->cng_level = NET_RX_SUCCESS;
+ 
+-	softnet_data[cpu].avg_blog = avg_blog;
++	sd->avg_blog = avg_blog;
+ }
+ 
+ #ifdef OFFLINE_SAMPLE
+@@ -1357,7 +1358,7 @@ int netif_rx(struct sk_buff *skb)
+ 	 */
+ 	local_irq_save(flags);
+ 	this_cpu = smp_processor_id();
+-	queue = &softnet_data[this_cpu];
++	queue = &__get_cpu_var(softnet_data);
+ 
+ 	netdev_rx_stat[this_cpu].total++;
+ 	if (queue->input_pkt_queue.qlen <= netdev_max_backlog) {
+@@ -1445,14 +1446,14 @@ static __inline__ void skb_bond(struct s
+ 
+ static void net_tx_action(struct softirq_action *h)
+ {
+-	int cpu = smp_processor_id();
++	struct softnet_data *sd = &__get_cpu_var(softnet_data);
+ 
+-	if (softnet_data[cpu].completion_queue) {
++	if (sd->completion_queue) {
+ 		struct sk_buff *clist;
+ 
+ 		local_irq_disable();
+-		clist = softnet_data[cpu].completion_queue;
+-		softnet_data[cpu].completion_queue = NULL;
++		clist = sd->completion_queue;
++		sd->completion_queue = NULL;
+ 		local_irq_enable();
+ 
+ 		while (clist) {
+@@ -1464,12 +1465,12 @@ static void net_tx_action(struct softirq
+ 		}
+ 	}
+ 
+-	if (softnet_data[cpu].output_queue) {
++	if (sd->output_queue) {
+ 		struct net_device *head;
+ 
+ 		local_irq_disable();
+-		head = softnet_data[cpu].output_queue;
+-		softnet_data[cpu].output_queue = NULL;
++		head = sd->output_queue;
++		sd->output_queue = NULL;
+ 		local_irq_enable();
+ 
+ 		while (head) {
+@@ -1611,8 +1612,7 @@ static int process_backlog(struct net_de
+ {
+ 	int work = 0;
+ 	int quota = min(backlog_dev->quota, *budget);
+-	int this_cpu = smp_processor_id();
+-	struct softnet_data *queue = &softnet_data[this_cpu];
++	struct softnet_data *queue = &__get_cpu_var(softnet_data);
+ 	unsigned long start_time = jiffies;
+ 
+ 	for (;;) {
+@@ -1673,7 +1673,7 @@ job_done:
+ static void net_rx_action(struct softirq_action *h)
+ {
+ 	int this_cpu = smp_processor_id();
+-	struct softnet_data *queue = &softnet_data[this_cpu];
++	struct softnet_data *queue = &__get_cpu_var(softnet_data);
+ 	unsigned long start_time = jiffies;
+ 	int budget = netdev_max_backlog;
+ 
+@@ -2979,7 +2979,7 @@ static int __init net_dev_init(void)
+ 	for (i = 0; i < NR_CPUS; i++) {
+ 		struct softnet_data *queue;
+ 
+-		queue = &softnet_data[i];
++		queue = &per_cpu(softnet_data, i);
+ 		skb_queue_head_init(&queue->input_pkt_queue);
+ 		queue->throttle = 0;
+ 		queue->cng_level = 0;
+--- linux-2.6.0-test1/net/ipv4/ip_gre.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/net/ipv4/ip_gre.c	2003-07-19 17:03:51.000000000 -0700
+@@ -816,6 +816,7 @@ static int ipgre_tunnel_xmit(struct sk_b
+ 			skb_set_owner_w(new_skb, skb->sk);
+ 		dev_kfree_skb(skb);
+ 		skb = new_skb;
++		old_iph = skb->nh.iph;
+ 	}
+ 
+ 	skb->nh.raw = skb_push(skb, gre_hlen);
+--- linux-2.6.0-test1/net/ipv4/ipip.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/net/ipv4/ipip.c	2003-07-19 17:03:51.000000000 -0700
+@@ -616,6 +616,7 @@ static int ipip_tunnel_xmit(struct sk_bu
+ 			skb_set_owner_w(new_skb, skb->sk);
+ 		dev_kfree_skb(skb);
+ 		skb = new_skb;
++		old_iph = skb->nh.iph;
+ 	}
+ 
+ 	skb->nh.raw = skb_push(skb, sizeof(struct iphdr));
+--- linux-2.6.0-test1/net/ipv4/ipvs/ip_vs_conn.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/net/ipv4/ipvs/ip_vs_conn.c	2003-07-19 17:03:51.000000000 -0700
+@@ -507,9 +507,6 @@ static void ip_vs_conn_expire(unsigned l
+ 	 *	refcnt==1 implies I'm the only one referrer
+ 	 */
+ 	if (likely(atomic_read(&cp->refcnt) == 1)) {
+-		/* make sure that there is no timer on it now */
+-		del_timer_sync(&cp->timer);
+-
+ 		/* does anybody control me? */
+ 		if (cp->control)
+ 			ip_vs_control_del(cp);
+@@ -517,7 +514,6 @@ static void ip_vs_conn_expire(unsigned l
+ 		if (unlikely(cp->app != NULL))
+ 			ip_vs_unbind_app(cp);
+ 		ip_vs_unbind_dest(cp);
+-		//ip_vs_timeout_detach(cp);
+ 		if (cp->flags & IP_VS_CONN_F_NO_CPORT)
+ 			atomic_dec(&ip_vs_conn_no_cport_cnt);
+ 		atomic_dec(&ip_vs_conn_count);
+--- linux-2.6.0-test1/net/ipv4/ipvs/ip_vs_ctl.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/net/ipv4/ipvs/ip_vs_ctl.c	2003-07-19 17:03:51.000000000 -0700
+@@ -93,7 +93,7 @@ int ip_vs_get_debug_level(void)
+ /*
+  *	update_defense_level is called from timer bh and from sysctl.
+  */
+-void update_defense_level(void)
++static void update_defense_level(void)
+ {
+ 	struct sysinfo i;
+ 	static int old_secure_tcp = 0;
+@@ -210,6 +210,22 @@ void update_defense_level(void)
+ }
+ 
+ 
++/*
++ *	Timer for checking the defense
++ */
++static struct timer_list defense_timer;
++#define DEFENSE_TIMER_PERIOD	1*HZ
++
++static void defense_timer_handler(unsigned long data)
++{
++	update_defense_level();
++	if (atomic_read(&ip_vs_dropentry))
++		ip_vs_random_dropentry();
++
++	mod_timer(&defense_timer, jiffies + DEFENSE_TIMER_PERIOD);
++}
++
++
+ int
+ ip_vs_use_count_inc(void)
+ {
+@@ -2187,6 +2203,12 @@ int ip_vs_control_init(void)
+ 	ip_vs_stats.lock = SPIN_LOCK_UNLOCKED;
+ 	ip_vs_new_estimator(&ip_vs_stats);
+ 
++	/* Hook the defense timer */
++	init_timer(&defense_timer);
++	defense_timer.function = defense_timer_handler;
++	defense_timer.expires = jiffies + DEFENSE_TIMER_PERIOD;
++	add_timer(&defense_timer);
++
+ 	LeaveFunction(2);
+ 	return 0;
+ }
+@@ -2196,6 +2218,7 @@ void ip_vs_control_cleanup(void)
+ {
+ 	EnterFunction(2);
+ 	ip_vs_trash_cleanup();
++	del_timer_sync(&defense_timer);
+ 	ip_vs_kill_estimator(&ip_vs_stats);
+ 	unregister_sysctl_table(ipv4_vs_table.sysctl_header);
+ 	proc_net_remove("ip_vs_stats");
+--- linux-2.6.0-test1/net/ipv4/ipvs/ip_vs_xmit.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/net/ipv4/ipvs/ip_vs_xmit.c	2003-07-19 17:03:51.000000000 -0700
+@@ -78,7 +78,6 @@ __ip_vs_get_out_rt(struct ip_vs_conn *cp
+ 						.daddr = dest->addr,
+ 						.saddr = 0,
+ 						.tos = rtos, } },
+-				.proto = cp->protocol,
+ 			};
+ 
+ 			if (ip_route_output_key(&rt, &fl)) {
+@@ -102,7 +101,6 @@ __ip_vs_get_out_rt(struct ip_vs_conn *cp
+ 					.daddr = dest->addr,
+ 					.saddr = 0,
+ 					.tos = rtos, } },
+-			.proto = cp->protocol,
+ 		};
+ 
+ 		if (ip_route_output_key(&rt, &fl)) {
+--- linux-2.6.0-test1/net/ipv4/ipvs/Kconfig	2003-07-13 21:44:35.000000000 -0700
++++ 25/net/ipv4/ipvs/Kconfig	2003-07-19 17:03:51.000000000 -0700
+@@ -147,7 +147,7 @@ config	IP_VS_WLC
+ 	  unsure, say N.
+ 
+ config	IP_VS_LBLC
+-	tristate "locality-based least-connection with replication scheduling"
++	tristate "locality-based least-connection scheduling"
+         depends on IP_VS
+ 	---help---
+ 	  The locality-based least-connection scheduling algorithm is for
+@@ -163,7 +163,7 @@ config	IP_VS_LBLC
+ 	  unsure, say N.
+ 
+ config  IP_VS_LBLCR
+-	tristate "locality-based least-connection with replication schedulin"
++	tristate "locality-based least-connection with replication scheduling"
+         depends on IP_VS
+ 	---help---
+ 	  The locality-based least-connection with replication scheduling
+--- linux-2.6.0-test1/net/ipv4/tcp_input.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/net/ipv4/tcp_input.c	2003-07-19 17:03:51.000000000 -0700
+@@ -2373,7 +2373,7 @@ static void tcp_fin(struct sk_buff *skb,
+ 	tcp_schedule_ack(tp);
+ 
+ 	sk->sk_shutdown |= RCV_SHUTDOWN;
+-	sock_reset_flag(sk, SOCK_DONE);
++	sock_set_flag(sk, SOCK_DONE);
+ 
+ 	switch (sk->sk_state) {
+ 		case TCP_SYN_RECV:
+--- linux-2.6.0-test1/net/ipv6/addrconf.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/net/ipv6/addrconf.c	2003-07-19 17:03:51.000000000 -0700
+@@ -368,7 +368,8 @@ static struct inet6_dev * ipv6_add_dev(s
+ 				dev, dev->name);
+ 			ndev->cnf.use_tempaddr = -1;
+ 		} else {
+-			__ipv6_regen_rndid(ndev);
++			in6_dev_hold(ndev);
++			ipv6_regen_rndid((unsigned long) ndev);
+ 		}
+ #endif
+ 
+@@ -1122,9 +1123,6 @@ static int __ipv6_regen_rndid(struct ine
+ 	sg[1].offset = ((long) eui64 & ~PAGE_MASK);
+ 	sg[1].length = 8;
+ 
+-	if (!del_timer(&idev->regen_timer))
+-		in6_dev_hold(idev);
+-
+ 	dev = idev->dev;
+ 
+ 	if (ipv6_generate_eui64(eui64, dev)) {
+@@ -1137,7 +1135,6 @@ regen:
+ 	spin_lock(&md5_tfm_lock);
+ 	if (unlikely(md5_tfm == NULL)) {
+ 		spin_unlock(&md5_tfm_lock);
+-		in6_dev_put(idev);
+ 		return -1;
+ 	}
+ 	crypto_digest_init(md5_tfm);
+@@ -1170,33 +1167,41 @@ regen:
+ 		if ((idev->rndid[2]|idev->rndid[3]|idev->rndid[4]|idev->rndid[5]|idev->rndid[6]|idev->rndid[7]) == 0x00)
+ 			goto regen;
+ 	}
+-	
+-	idev->regen_timer.expires = jiffies +
+-					idev->cnf.temp_prefered_lft * HZ - 
+-					idev->cnf.regen_max_retry * idev->cnf.dad_transmits * idev->nd_parms->retrans_time - desync_factor;
+-	if (time_before(idev->regen_timer.expires, jiffies)) {
+-		idev->regen_timer.expires = 0;
+-		printk(KERN_WARNING
+-			"__ipv6_regen_rndid(): too short regeneration interval; timer disabled for %s.\n",
+-			idev->dev->name);
+-		in6_dev_put(idev);
+-		return -1;
+-	}
+ 
+-	add_timer(&idev->regen_timer);
+ 	return 0;
+ }
+ 
+ static void ipv6_regen_rndid(unsigned long data)
+ {
+ 	struct inet6_dev *idev = (struct inet6_dev *) data;
++	unsigned long expires;
+ 
+ 	read_lock_bh(&addrconf_lock);
+ 	write_lock_bh(&idev->lock);
+-	if (!idev->dead)
+-		__ipv6_regen_rndid(idev);
++
++	if (idev->dead)
++		goto out;
++
++	if (__ipv6_regen_rndid(idev) < 0)
++		goto out;
++	
++	expires = jiffies +
++		idev->cnf.temp_prefered_lft * HZ - 
++		idev->cnf.regen_max_retry * idev->cnf.dad_transmits * idev->nd_parms->retrans_time - desync_factor;
++	if (time_before(expires, jiffies)) {
++		printk(KERN_WARNING
++			"ipv6_regen_rndid(): too short regeneration interval; timer disabled for %s.\n",
++			idev->dev->name);
++		goto out;
++	}
++
++	if (!mod_timer(&idev->regen_timer, expires))
++		in6_dev_hold(idev);
++
++out:
+ 	write_unlock_bh(&idev->lock);
+ 	read_unlock_bh(&addrconf_lock);
++	in6_dev_put(idev);
+ }
+ 
+ static int __ipv6_try_regen_rndid(struct inet6_dev *idev, struct in6_addr *tmpaddr) {
+@@ -1928,6 +1933,27 @@ static int addrconf_ifdown(struct net_de
+ 	/* Step 3: clear address list */
+ 
+ 	write_lock_bh(&idev->lock);
++#ifdef CONFIG_IPV6_PRIVACY
++	if (how == 1 && del_timer(&idev->regen_timer))
++		in6_dev_put(idev);
++
++	/* clear tempaddr list */
++	while ((ifa = idev->tempaddr_list) != NULL) {
++		idev->tempaddr_list = ifa->tmp_next;
++		ifa->tmp_next = NULL;
++		ifa->dead = 1;
++		write_unlock_bh(&idev->lock);
++		spin_lock_bh(&ifa->lock);
++
++		if (ifa->ifpub) {
++			in6_ifa_put(ifa->ifpub);
++			ifa->ifpub = NULL;
++		}
++		spin_unlock_bh(&ifa->lock);
++		in6_ifa_put(ifa);
++		write_lock_bh(&idev->lock);
++	}
++#endif
+ 	while ((ifa = idev->addr_list) != NULL) {
+ 		idev->addr_list = ifa->if_next;
+ 		ifa->if_next = NULL;
+--- linux-2.6.0-test1/net/ipv6/ah6.c	2003-06-16 22:32:21.000000000 -0700
++++ 25/net/ipv6/ah6.c	2003-07-19 17:03:51.000000000 -0700
+@@ -19,7 +19,7 @@
+  *
+  *	Mitsuru KANDA @USAGI       : IPv6 Support 
+  * 	Kazunori MIYAZAWA @USAGI   :
+- * 	Kunihiro Ishiguro          :
++ * 	Kunihiro Ishiguro <kunihiro@ipinfusion.com>
+  * 	
+  * 	This file is derived from net/ipv4/ah.c.
+  */
+--- linux-2.6.0-test1/net/ipv6/esp6.c	2003-06-14 12:18:24.000000000 -0700
++++ 25/net/ipv6/esp6.c	2003-07-19 17:03:51.000000000 -0700
+@@ -19,7 +19,7 @@
+  *
+  *	Mitsuru KANDA @USAGI       : IPv6 Support 
+  * 	Kazunori MIYAZAWA @USAGI   :
+- * 	Kunihiro Ishiguro          :
++ * 	Kunihiro Ishiguro <kunihiro@ipinfusion.com>
+  * 	
+  * 	This file is derived from net/ipv4/esp.c
+  */
+--- linux-2.6.0-test1/net/ipv6/route.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/net/ipv6/route.c	2003-07-19 17:03:51.000000000 -0700
+@@ -567,6 +567,11 @@ struct dst_entry *ndisc_dst_alloc(struct
+ 	if (unlikely(rt == NULL))
+ 		goto out;
+ 
++	if (dev)
++		dev_hold(dev);
++	if (neigh)
++		neigh_hold(neigh);
++
+ 	rt->rt6i_dev	  = dev;
+ 	rt->rt6i_nexthop  = neigh;
+ 	rt->rt6i_expires  = 0;
+--- linux-2.6.0-test1/net/ipv6/sit.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/net/ipv6/sit.c	2003-07-19 17:03:51.000000000 -0700
+@@ -550,6 +550,7 @@ static int ipip6_tunnel_xmit(struct sk_b
+ 			skb_set_owner_w(new_skb, skb->sk);
+ 		dev_kfree_skb(skb);
+ 		skb = new_skb;
++		iph6 = skb->nh.ipv6h;
+ 	}
+ 
+ 	skb->nh.raw = skb_push(skb, sizeof(struct iphdr));
+--- linux-2.6.0-test1/net/ipv6/tcp_ipv6.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/net/ipv6/tcp_ipv6.c	2003-07-19 17:03:51.000000000 -0700
+@@ -579,7 +579,7 @@ static int tcp_v6_connect(struct sock *s
+ 
+ 	addr_type = ipv6_addr_type(&usin->sin6_addr);
+ 
+-	if(addr_type & IPV6_ADDR_MULTICAST)
++	if (addr_type & (IPV6_ADDR_ANYCAST | IPV6_ADDR_MULTICAST))
+ 		return -ENETUNREACH;
+ 
+ 	if (addr_type&IPV6_ADDR_LINKLOCAL) {
+@@ -967,12 +967,14 @@ static void tcp_v6_send_reset(struct sk_
+ 	struct tcphdr *th = skb->h.th, *t1; 
+ 	struct sk_buff *buff;
+ 	struct flowi fl;
++	int daddr_type;
+ 
+ 	if (th->rst)
+ 		return;
+ 
+-	if (ipv6_addr_is_multicast(&skb->nh.ipv6h->daddr))
+-		return; 
++	daddr_type = ipv6_addr_type(&skb->nh.ipv6h->daddr);
++	if (daddr_type & (IPV6_ADDR_ANYCAST | IPV6_ADDR_MULTICAST))
++		return;
+ 
+ 	/*
+ 	 * We need to grab some memory, and put together an RST,
+@@ -1171,13 +1173,14 @@ static int tcp_v6_conn_request(struct so
+ 	struct tcp_opt tmptp, *tp = tcp_sk(sk);
+ 	struct open_request *req = NULL;
+ 	__u32 isn = TCP_SKB_CB(skb)->when;
++	int daddr_type;
+ 
+ 	if (skb->protocol == htons(ETH_P_IP))
+ 		return tcp_v4_conn_request(sk, skb);
+ 
+-	/* FIXME: do the same check for anycast */
+-	if (ipv6_addr_is_multicast(&skb->nh.ipv6h->daddr))
+-		goto drop; 
++	daddr_type = ipv6_addr_type(&skb->nh.ipv6h->daddr);
++	if (daddr_type & (IPV6_ADDR_ANYCAST | IPV6_ADDR_MULTICAST))
++		goto drop;
+ 
+ 	/*
+ 	 *	There are no SYN attacks on IPv6, yet...	
+--- linux-2.6.0-test1/net/ipv6/xfrm6_input.c	2003-07-02 14:53:18.000000000 -0700
++++ 25/net/ipv6/xfrm6_input.c	2003-07-19 17:03:51.000000000 -0700
+@@ -4,7 +4,7 @@
+  * Authors:
+  *	Mitsuru KANDA @USAGI
+  * 	Kazunori MIYAZAWA @USAGI
+- * 	Kunihiro Ishiguro
++ * 	Kunihiro Ishiguro <kunihiro@ipinfusion.com>
+  *	YOSHIFUJI Hideaki @USAGI
+  *		IPv6 support
+  */
+--- linux-2.6.0-test1/net/ipv6/xfrm6_policy.c	2003-06-22 12:04:45.000000000 -0700
++++ 25/net/ipv6/xfrm6_policy.c	2003-07-19 17:03:51.000000000 -0700
+@@ -4,7 +4,7 @@
+  * Authors:
+  *	Mitsuru KANDA @USAGI
+  * 	Kazunori MIYAZAWA @USAGI
+- * 	Kunihiro Ishiguro
++ * 	Kunihiro Ishiguro <kunihiro@ipinfusion.com>
+  * 		IPv6 support
+  * 	YOSHIFUJI Hideaki
+  * 		Split up af-specific portion
+--- linux-2.6.0-test1/net/ipv6/xfrm6_state.c	2003-06-14 12:18:08.000000000 -0700
++++ 25/net/ipv6/xfrm6_state.c	2003-07-19 17:03:51.000000000 -0700
+@@ -4,7 +4,7 @@
+  * Authors:
+  *	Mitsuru KANDA @USAGI
+  * 	Kazunori MIYAZAWA @USAGI
+- * 	Kunihiro Ishiguro
++ * 	Kunihiro Ishiguro <kunihiro@ipinfusion.com>
+  * 		IPv6 support
+  * 	YOSHIFUJI Hideaki @USAGI
+  * 		Split up af-specific portion
+--- linux-2.6.0-test1/net/netsyms.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/net/netsyms.c	2003-07-19 17:03:51.000000000 -0700
+@@ -685,7 +685,7 @@ EXPORT_SYMBOL(ip_route_me_harder);
+ 
+ EXPORT_SYMBOL(register_gifconf);
+ 
+-EXPORT_SYMBOL(softnet_data);
++EXPORT_PER_CPU_SYMBOL(softnet_data);
+ 
+ #ifdef CONFIG_NET_RADIO
+ #include <net/iw_handler.h>		/* Wireless Extensions driver API */
+--- linux-2.6.0-test1/net/sunrpc/auth_gss/auth_gss.c	2003-06-14 12:18:09.000000000 -0700
++++ 25/net/sunrpc/auth_gss/auth_gss.c	2003-07-19 17:03:51.000000000 -0700
+@@ -235,7 +235,7 @@ gss_parse_init_downcall(struct gss_api_m
+ 		goto err;
+ 	}
+ 	ctx->gc_proc = RPC_GSS_PROC_DATA;
+-	ctx->gc_seq = 0;
++	ctx->gc_seq = 1;	/* NetApp 6.4R1 doesn't accept seq. no. 0 */
+ 	spin_lock_init(&ctx->gc_seq_lock);
+ 	atomic_set(&ctx->count,1);
+ 
+--- linux-2.6.0-test1/net/sunrpc/clnt.c	2003-06-14 12:18:07.000000000 -0700
++++ 25/net/sunrpc/clnt.c	2003-07-19 17:07:18.000000000 -0700
+@@ -385,7 +385,8 @@ rpc_setbufsize(struct rpc_clnt *clnt, un
+ 	xprt->rcvsize = 0;
+ 	if (rcvsize)
+ 		xprt->rcvsize = rcvsize + RPC_SLACK_SPACE;
+-	xprt_sock_setbufsize(xprt);
++	if (xprt_connected(xprt))
++		xprt_sock_setbufsize(xprt);
+ }
+ 
+ /*
+@@ -743,14 +744,14 @@ call_timeout(struct rpc_task *task)
+ 
+ 	dprintk("RPC: %4d call_timeout (major)\n", task->tk_pid);
+ 	if (clnt->cl_softrtry) {
+-		if (clnt->cl_chatty && !task->tk_exit)
++		if (clnt->cl_chatty)
+ 			printk(KERN_NOTICE "%s: server %s not responding, timed out\n",
+ 				clnt->cl_protname, clnt->cl_server);
+ 		rpc_exit(task, -EIO);
+ 		return;
+ 	}
+ 
+-	if (clnt->cl_chatty && !(task->tk_flags & RPC_CALL_MAJORSEEN) && rpc_ntimeo(&clnt->cl_rtt) > 7) {
++	if (clnt->cl_chatty && !(task->tk_flags & RPC_CALL_MAJORSEEN)) {
+ 		task->tk_flags |= RPC_CALL_MAJORSEEN;
+ 		printk(KERN_NOTICE "%s: server %s not responding, still trying\n",
+ 			clnt->cl_protname, clnt->cl_server);
+--- linux-2.6.0-test1/net/sunrpc/xprt.c	2003-06-14 12:18:25.000000000 -0700
++++ 25/net/sunrpc/xprt.c	2003-07-19 17:07:18.000000000 -0700
+@@ -436,6 +436,7 @@ xprt_connect(struct rpc_task *task)
+ 		goto out_write;
+ 	}
+ 	xprt_bind_socket(xprt, sock);
++	xprt_sock_setbufsize(xprt);
+ 
+ 	if (!xprt->stream)
+ 		goto out_write;
+@@ -1041,21 +1042,6 @@ out:
+ }
+ 
+ /*
+- * Exponential backoff for UDP retries
+- */
+-static inline int
+-xprt_expbackoff(struct rpc_task *task, struct rpc_rqst *req)
+-{
+-	int backoff;
+-
+-	req->rq_ntimeo++;
+-	backoff = min(rpc_ntimeo(&task->tk_client->cl_rtt), XPRT_MAX_BACKOFF);
+-	if (req->rq_ntimeo < (1 << backoff))
+-		return 1;
+-	return 0;
+-}
+-
+-/*
+  * RPC receive timeout handler.
+  */
+ static void
+@@ -1068,14 +1054,7 @@ xprt_timer(struct rpc_task *task)
+ 	if (req->rq_received)
+ 		goto out;
+ 
+-	if (!xprt->nocong) {
+-		if (xprt_expbackoff(task, req)) {
+-			rpc_add_timer(task, xprt_timer);
+-			goto out_unlock;
+-		}
+-		rpc_inc_timeo(&task->tk_client->cl_rtt);
+-		xprt_adjust_cwnd(req->rq_xprt, -ETIMEDOUT);
+-	}
++	xprt_adjust_cwnd(req->rq_xprt, -ETIMEDOUT);
+ 	req->rq_nresend++;
+ 
+ 	dprintk("RPC: %4d xprt_timer (%s request)\n",
+@@ -1085,7 +1064,6 @@ xprt_timer(struct rpc_task *task)
+ out:
+ 	task->tk_timeout = 0;
+ 	rpc_wake_up_task(task);
+-out_unlock:
+ 	spin_unlock(&xprt->sock_lock);
+ }
+ 
+@@ -1221,16 +1199,17 @@ xprt_transmit(struct rpc_task *task)
+ 	return;
+  out_receive:
+ 	dprintk("RPC: %4d xmit complete\n", task->tk_pid);
++	spin_lock_bh(&xprt->sock_lock);
+ 	/* Set the task's receive timeout value */
+ 	if (!xprt->nocong) {
+ 		task->tk_timeout = rpc_calc_rto(&clnt->cl_rtt,
+ 				task->tk_msg.rpc_proc->p_timer);
+-		req->rq_ntimeo = 0;
++		task->tk_timeout <<= clnt->cl_timeout.to_retries
++			- req->rq_timeout.to_retries;
+ 		if (task->tk_timeout > req->rq_timeout.to_maxval)
+ 			task->tk_timeout = req->rq_timeout.to_maxval;
+ 	} else
+ 		task->tk_timeout = req->rq_timeout.to_current;
+-	spin_lock_bh(&xprt->sock_lock);
+ 	/* Don't race with disconnect */
+ 	if (!xprt_connected(xprt))
+ 		task->tk_status = -ENOTCONN;
+--- linux-2.6.0-test1/net/wanrouter/wanmain.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/net/wanrouter/wanmain.c	2003-07-19 17:03:51.000000000 -0700
+@@ -668,7 +668,7 @@ static int wanrouter_device_stat(struct 
+ static int wanrouter_device_new_if(struct wan_device *wandev,
+ 				   wanif_conf_t *u_conf)
+ {
+-	wanif_conf_t conf;
++	wanif_conf_t *cnf;
+ 	struct net_device *dev = NULL;
+ #ifdef CONFIG_WANPIPE_MULTPPP
+ 	struct ppp_device *pppdev=NULL;
+@@ -678,38 +678,47 @@ static int wanrouter_device_new_if(struc
+ 	if ((wandev->state == WAN_UNCONFIGURED) || (wandev->new_if == NULL))
+ 		return -ENODEV;
+ 
+-	if (copy_from_user(&conf, u_conf, sizeof(wanif_conf_t)))
+-		return -EFAULT;
+-
+-	if (conf.magic != ROUTER_MAGIC)
+-		return -EINVAL;
++	cnf = kmalloc(sizeof(wanif_conf_t), GFP_KERNEL);
++	if (!cnf)
++		return -ENOBUFS;
++
++	err = -EFAULT;
++	if (copy_from_user(cnf, u_conf, sizeof(wanif_conf_t)))
++		goto out;
++
++	err = -EINVAL;
++	if (cnf->magic != ROUTER_MAGIC)
++		goto out;
+ 
+-	if (conf.config_id == WANCONFIG_MPPP) {
++	if (cnf->config_id == WANCONFIG_MPPP) {
+ #ifdef CONFIG_WANPIPE_MULTPPP
+ 		pppdev = kmalloc(sizeof(struct ppp_device), GFP_KERNEL);
++		err = -ENOBUFS;
+ 		if (pppdev == NULL)
+-			return -ENOBUFS;
++			goto out;
+ 		memset(pppdev, 0, sizeof(struct ppp_device));
+ 		pppdev->dev = kmalloc(sizeof(struct net_device), GFP_KERNEL);
+ 		if (pppdev->dev == NULL) {
+ 			kfree(pppdev);
+-			return -ENOBUFS;
++			err = -ENOBUFS;
++			goto out;
+ 		}
+ 		memset(pppdev->dev, 0, sizeof(struct net_device));
+-		err = wandev->new_if(wandev,
+-				     (struct net_device *)pppdev, &conf);
++		err = wandev->new_if(wandev, (struct net_device *)pppdev, cnf);
+ 		dev = pppdev->dev;
+ #else
+ 		printk(KERN_INFO "%s: Wanpipe Mulit-Port PPP support has not been compiled in!\n",
+ 				wandev->name);
+-		return -EPROTONOSUPPORT;
++		err = -EPROTONOSUPPORT;
++		goto out;
+ #endif
+ 	} else {
+ 		dev = kmalloc(sizeof(struct net_device), GFP_KERNEL);
++		err = -ENOBUFS;
+ 		if (dev == NULL)
+-			return -ENOBUFS;
++			goto out;
+ 		memset(dev, 0, sizeof(struct net_device));
+-		err = wandev->new_if(wandev, dev, &conf);
++		err = wandev->new_if(wandev, dev, cnf);
+ 	}
+ 
+ 	if (!err) {
+@@ -748,7 +757,8 @@ static int wanrouter_device_new_if(struc
+ 				++wandev->ndev;
+ 
+ 				unlock_adapter_irq(&wandev->lock, &smp_flags);
+-				return 0;	/* done !!! */
++				err = 0;	/* done !!! */
++				goto out;
+ 			}
+ 		}
+ 		if (wandev->del_if)
+@@ -761,18 +771,19 @@ static int wanrouter_device_new_if(struc
+ 		dev->priv = NULL;
+ 	}
+ 
+-
+ #ifdef CONFIG_WANPIPE_MULTPPP
+-	if (conf.config_id == WANCONFIG_MPPP)
++	if (cnf->config_id == WANCONFIG_MPPP)
+ 		kfree(pppdev);
+ 	else
+ 		kfree(dev);
+ #else
+ 	/* Sync PPP is disabled */
+-	if (conf.config_id != WANCONFIG_MPPP)
++	if (cnf->config_id != WANCONFIG_MPPP)
+ 		kfree(dev);
+ #endif
+ 
++out:
++	kfree(cnf);
+ 	return err;
+ }
+ 
+--- linux-2.6.0-test1/net/xfrm/xfrm_policy.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/net/xfrm/xfrm_policy.c	2003-07-19 17:03:51.000000000 -0700
+@@ -4,7 +4,7 @@
+  * Changes:
+  *	Mitsuru KANDA @USAGI
+  * 	Kazunori MIYAZAWA @USAGI
+- * 	Kunihiro Ishiguro
++ * 	Kunihiro Ishiguro <kunihiro@ipinfusion.com>
+  * 		IPv6 support
+  * 	Kazunori MIYAZAWA @USAGI
+  * 	YOSHIFUJI Hideaki
+--- linux-2.6.0-test1/net/xfrm/xfrm_state.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/net/xfrm/xfrm_state.c	2003-07-19 17:03:51.000000000 -0700
+@@ -4,7 +4,7 @@
+  * Changes:
+  *	Mitsuru KANDA @USAGI
+  * 	Kazunori MIYAZAWA @USAGI
+- * 	Kunihiro Ishiguro
++ * 	Kunihiro Ishiguro <kunihiro@ipinfusion.com>
+  * 		IPv6 support
+  * 	YOSHIFUJI Hideaki @USAGI
+  * 		Split up af-specific functions
+--- linux-2.6.0-test1/net/xfrm/xfrm_user.c	2003-07-10 18:50:32.000000000 -0700
++++ 25/net/xfrm/xfrm_user.c	2003-07-19 17:03:51.000000000 -0700
+@@ -5,7 +5,7 @@
+  * Changes:
+  *	Mitsuru KANDA @USAGI
+  * 	Kazunori MIYAZAWA @USAGI
+- * 	Kunihiro Ishiguro
++ * 	Kunihiro Ishiguro <kunihiro@ipinfusion.com>
+  * 		IPv6 support
+  * 	
+  */
+--- linux-2.6.0-test1/scripts/ver_linux	2003-07-10 18:50:32.000000000 -0700
++++ 25/scripts/ver_linux	2003-07-19 17:03:51.000000000 -0700
+@@ -54,11 +54,14 @@ pppd --version 2>&1| grep version | awk 
+ isdnctrl 2>&1 | grep version | awk \
+ 'NR==1{print "isdn4k-utils          ", $NF}'
+ 
++showmount --version 2>&1 | grep nfs-utils | awk \
++'NR==1{print "nfs-utils             ", $NF}'
++
+ ls -l `ldd /bin/sh | awk '/libc/{print $3}'` | sed \
+ -e 's/\.so$//' | awk -F'[.-]'   '{print "Linux C Library        " \
+ $(NF-2)"."$(NF-1)"."$NF}'
+ 
+-ldd -v > /dev/null 2>&1 && ldd -v || ldd --version |head -1 | awk \
++ldd -v > /dev/null 2>&1 && ldd -v || ldd --version |head -n 1 | awk \
+ 'NR==1{print "Dynamic linker (ldd)  ", $NF}'
+ 
+ ls -l /usr/lib/lib{g,stdc}++.so  2>/dev/null | awk -F. \
+--- linux-2.6.0-test1/security/Kconfig	2003-06-14 12:18:25.000000000 -0700
++++ 25/security/Kconfig	2003-07-19 17:04:47.000000000 -0700
+@@ -44,5 +44,7 @@ config SECURITY_ROOTPLUG
+ 	  
+ 	  If you are unsure how to answer this question, answer N.
+ 
++source security/selinux/Kconfig
++
+ endmenu
+ 
+--- linux-2.6.0-test1/security/Makefile	2003-06-14 12:18:28.000000000 -0700
++++ 25/security/Makefile	2003-07-19 17:04:47.000000000 -0700
+@@ -2,6 +2,8 @@
+ # Makefile for the kernel security code
+ #
+ 
++subdir-$(CONFIG_SECURITY_SELINUX)	+= selinux
++
+ # if we don't select a security model, use the default capabilities
+ ifneq ($(CONFIG_SECURITY),y)
+ obj-y		+= capability.o
+@@ -9,5 +11,9 @@ endif
+ 
+ # Object file lists
+ obj-$(CONFIG_SECURITY)			+= security.o dummy.o
++# Must precede capability.o in order to stack properly.
++ifeq ($(CONFIG_SECURITY_SELINUX),y)
++	obj-$(CONFIG_SECURITY_SELINUX)	+= selinux/built-in.o
++endif
+ obj-$(CONFIG_SECURITY_CAPABILITIES)	+= capability.o
+ obj-$(CONFIG_SECURITY_ROOTPLUG)		+= root_plug.o
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/avc.c	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,1115 @@
++/*
++ * Implementation of the kernel access vector cache (AVC).
++ *
++ * Authors:  Stephen Smalley, <sds@epoch.ncsc.mil>
++ *           James Morris <jmorris@redhat.com>
++ *
++ * Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.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.
++ */
++#include <linux/types.h>
++#include <linux/stddef.h>
++#include <linux/kernel.h>
++#include <linux/slab.h>
++#include <linux/fs.h>
++#include <linux/dcache.h>
++#include <linux/skbuff.h>
++#include <net/sock.h>
++#include <linux/un.h>
++#include <net/af_unix.h>
++#include <linux/ip.h>
++#include <linux/udp.h>
++#include <linux/tcp.h>
++#include "avc.h"
++#include "avc_ss.h"
++#include "class_to_string.h"
++#include "common_perm_to_string.h"
++#include "av_inherit.h"
++#include "av_perm_to_string.h"
++#include "objsec.h"
++
++#define AVC_CACHE_SLOTS		512
++#define AVC_CACHE_MAXNODES	410
++
++struct avc_entry {
++	u32			ssid;
++	u32			tsid;
++	u16			tclass;
++	struct av_decision	avd;
++	int			used;	/* used recently */
++};
++
++struct avc_node {
++	struct avc_entry	ae;
++	struct avc_node		*next;
++};
++
++struct avc_cache {
++	struct avc_node	*slots[AVC_CACHE_SLOTS];
++	u32		lru_hint;	/* LRU hint for reclaim scan */
++	u32		active_nodes;
++	u32		latest_notif;	/* latest revocation notification */
++};
++
++struct avc_callback_node {
++	int (*callback) (u32 event, u32 ssid, u32 tsid,
++	                 u16 tclass, u32 perms,
++	                 u32 *out_retained);
++	u32 events;
++	u32 ssid;
++	u32 tsid;
++	u16 tclass;
++	u32 perms;
++	struct avc_callback_node *next;
++};
++
++static spinlock_t avc_lock = SPIN_LOCK_UNLOCKED;
++static spinlock_t avc_log_lock = SPIN_LOCK_UNLOCKED;
++static struct avc_node *avc_node_freelist = NULL;
++static struct avc_cache avc_cache;
++static char *avc_audit_buffer = NULL;
++static unsigned avc_cache_stats[AVC_NSTATS];
++static struct avc_callback_node *avc_callbacks = NULL;
++static unsigned int avc_log_level = 4; /* default:  KERN_WARNING */
++static char avc_level_string[4] = "< >";
++
++static inline int avc_hash(u32 ssid, u32 tsid, u16 tclass)
++{
++	return (ssid ^ (tsid<<2) ^ (tclass<<4)) & (AVC_CACHE_SLOTS - 1);
++}
++
++/**
++ * avc_dump_av - Display an access vector in human-readable form.
++ * @tclass: target security class
++ * @av: access vector
++ */
++void avc_dump_av(u16 tclass, u32 av)
++{
++	char **common_pts = 0;
++	u32 common_base = 0;
++	int i, i2, perm;
++
++	if (av == 0) {
++		printk(" null");
++		return;
++	}
++
++	for (i = 0; i < ARRAY_SIZE(av_inherit); i++) {
++		if (av_inherit[i].tclass == tclass) {
++			common_pts = av_inherit[i].common_pts;
++			common_base = av_inherit[i].common_base;
++			break;
++		}
++	}
++
++	printk(" {");
++	i = 0;
++	perm = 1;
++	while (perm < common_base) {
++		if (perm & av)
++			printk(" %s", common_pts[i]);
++		i++;
++		perm <<= 1;
++	}
++
++	while (i < sizeof(av) * 8) {
++		if (perm & av) {
++			for (i2 = 0; i2 < ARRAY_SIZE(av_perm_to_string); i2++) {
++				if ((av_perm_to_string[i2].tclass == tclass) &&
++				    (av_perm_to_string[i2].value == perm))
++					break;
++			}
++			if (i2 < ARRAY_SIZE(av_perm_to_string))
++				printk(" %s", av_perm_to_string[i2].name);
++		}
++		i++;
++		perm <<= 1;
++	}
++
++	printk(" }");
++}
++
++/**
++ * avc_dump_query - Display a SID pair and a class in human-readable form.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ */
++void avc_dump_query(u32 ssid, u32 tsid, u16 tclass)
++{
++	int rc;
++	char *scontext;
++	u32 scontext_len;
++
++ 	rc = security_sid_to_context(ssid, &scontext, &scontext_len);
++	if (rc)
++		printk("ssid=%d", ssid);
++	else {
++		printk("scontext=%s", scontext);
++		kfree(scontext);
++	}
++
++	rc = security_sid_to_context(tsid, &scontext, &scontext_len);
++	if (rc)
++		printk(" tsid=%d", tsid);
++	else {
++		printk(" tcontext=%s", scontext);
++		kfree(scontext);
++	}
++	printk(" tclass=%s", class_to_string[tclass]);
++}
++
++/**
++ * avc_init - Initialize the AVC.
++ *
++ * Initialize the access vector cache.
++ */
++void avc_init(void)
++{
++	struct avc_node	*new;
++	int i;
++
++	for (i = 0; i < AVC_NSTATS; i++)
++		avc_cache_stats[i] = 0;
++
++	for (i = 0; i < AVC_CACHE_SLOTS; i++)
++		avc_cache.slots[i] = 0;
++	avc_cache.lru_hint = 0;
++	avc_cache.active_nodes = 0;
++	avc_cache.latest_notif = 0;
++
++	for (i = 0; i < AVC_CACHE_MAXNODES; i++) {
++		new = kmalloc(sizeof(*new), GFP_ATOMIC);
++		if (!new) {
++			printk(KERN_WARNING "avc:  only able to allocate "
++			       "%d entries\n", i);
++			break;
++		}
++		memset(new, 0, sizeof(*new));
++		new->next = avc_node_freelist;
++		avc_node_freelist = new;
++	}
++
++	avc_audit_buffer = (char *)__get_free_page(GFP_ATOMIC);
++	if (!avc_audit_buffer)
++		panic("AVC:  unable to allocate audit buffer\n");
++
++	avc_level_string[1] = '0' + avc_log_level;
++}
++
++#if 0
++static void avc_hash_eval(char *tag)
++{
++	int i, chain_len, max_chain_len, slots_used;
++	struct avc_node *node;
++	unsigned long flags;
++
++	spin_lock_irqsave(&avc_lock,flags);
++
++	slots_used = 0;
++	max_chain_len = 0;
++	for (i = 0; i < AVC_CACHE_SLOTS; i++) {
++		node = avc_cache.slots[i];
++		if (node) {
++			slots_used++;
++			chain_len = 0;
++			while (node) {
++				chain_len++;
++				node = node->next;
++			}
++			if (chain_len > max_chain_len)
++				max_chain_len = chain_len;
++		}
++	}
++
++	spin_unlock_irqrestore(&avc_lock,flags);
++
++	printk(KERN_INFO "\n");
++	printk(KERN_INFO "%s avc:  %d entries and %d/%d buckets used, longest "
++	       "chain length %d\n", tag, avc_cache.active_nodes, slots_used,
++	       AVC_CACHE_SLOTS, max_chain_len);
++}
++#else
++static inline void avc_hash_eval(char *tag)
++{ }
++#endif
++
++static inline struct avc_node *avc_reclaim_node(void)
++{
++	struct avc_node *prev, *cur;
++	int hvalue, try;
++
++	hvalue = avc_cache.lru_hint;
++	for (try = 0; try < 2; try++) {
++		do {
++			prev = NULL;
++			cur = avc_cache.slots[hvalue];
++			while (cur) {
++				if (!cur->ae.used)
++					goto found;
++
++				cur->ae.used = 0;
++
++				prev = cur;
++				cur = cur->next;
++			}
++			hvalue = (hvalue + 1) & (AVC_CACHE_SLOTS - 1);
++		} while (hvalue != avc_cache.lru_hint);
++	}
++
++	panic("avc_reclaim_node");
++
++found:
++	avc_cache.lru_hint = hvalue;
++
++	if (prev == NULL)
++		avc_cache.slots[hvalue] = cur->next;
++	else
++		prev->next = cur->next;
++
++	return cur;
++}
++
++static inline struct avc_node *avc_claim_node(u32 ssid,
++                                              u32 tsid, u16 tclass)
++{
++	struct avc_node *new;
++	int hvalue;
++
++	hvalue = avc_hash(ssid, tsid, tclass);
++	if (avc_node_freelist) {
++		new = avc_node_freelist;
++		avc_node_freelist = avc_node_freelist->next;
++		avc_cache.active_nodes++;
++	} else {
++		new = avc_reclaim_node();
++		if (!new)
++			goto out;
++	}
++
++	new->ae.used = 1;
++	new->ae.ssid = ssid;
++	new->ae.tsid = tsid;
++	new->ae.tclass = tclass;
++	new->next = avc_cache.slots[hvalue];
++	avc_cache.slots[hvalue] = new;
++
++out:
++	return new;
++}
++
++static inline struct avc_node *avc_search_node(u32 ssid, u32 tsid,
++                                               u16 tclass, int *probes)
++{
++	struct avc_node *cur;
++	int hvalue;
++	int tprobes = 1;
++
++	hvalue = avc_hash(ssid, tsid, tclass);
++	cur = avc_cache.slots[hvalue];
++	while (cur != NULL &&
++	       (ssid != cur->ae.ssid ||
++		tclass != cur->ae.tclass ||
++		tsid != cur->ae.tsid)) {
++		tprobes++;
++		cur = cur->next;
++	}
++
++	if (cur == NULL) {
++		/* cache miss */
++		goto out;
++	}
++
++	/* cache hit */
++	if (probes)
++		*probes = tprobes;
++
++	cur->ae.used = 1;
++
++out:
++	return cur;
++}
++
++/**
++ * avc_lookup - Look up an AVC entry.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ * @requested: requested permissions, interpreted based on @tclass
++ * @aeref:  AVC entry reference
++ *
++ * Look up an AVC entry that is valid for the
++ * @requested permissions between the SID pair
++ * (@ssid, @tsid), interpreting the permissions
++ * based on @tclass.  If a valid AVC entry exists,
++ * then this function updates @aeref to refer to the
++ * entry and returns %0. Otherwise, this function
++ * returns -%ENOENT.
++ */
++int avc_lookup(u32 ssid, u32 tsid, u16 tclass,
++               u32 requested, struct avc_entry_ref *aeref)
++{
++	struct avc_node *node;
++	int probes, rc = 0;
++
++	avc_cache_stats_incr(AVC_CAV_LOOKUPS);
++	node = avc_search_node(ssid, tsid, tclass,&probes);
++
++	if (node && ((node->ae.avd.decided & requested) == requested)) {
++		avc_cache_stats_incr(AVC_CAV_HITS);
++		avc_cache_stats_add(AVC_CAV_PROBES,probes);
++		aeref->ae = &node->ae;
++		goto out;
++	}
++
++	avc_cache_stats_incr(AVC_CAV_MISSES);
++	rc = -ENOENT;
++out:
++	return rc;
++}
++
++/**
++ * avc_insert - Insert an AVC entry.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ * @ae: AVC entry
++ * @aeref:  AVC entry reference
++ *
++ * Insert an AVC entry for the SID pair
++ * (@ssid, @tsid) and class @tclass.
++ * The access vectors and the sequence number are
++ * normally provided by the security server in
++ * response to a security_compute_av() call.  If the
++ * sequence number @ae->avd.seqno is not less than the latest
++ * revocation notification, then the function copies
++ * the access vectors into a cache entry, updates
++ * @aeref to refer to the entry, and returns %0.
++ * Otherwise, this function returns -%EAGAIN.
++ */
++int avc_insert(u32 ssid, u32 tsid, u16 tclass,
++               struct avc_entry *ae, struct avc_entry_ref *aeref)
++{
++	struct avc_node *node;
++	int rc = 0;
++
++	if (ae->avd.seqno < avc_cache.latest_notif) {
++		printk(KERN_WARNING "avc:  seqno %d < latest_notif %d\n",
++		       ae->avd.seqno, avc_cache.latest_notif);
++		rc = -EAGAIN;
++		goto out;
++	}
++
++	node = avc_claim_node(ssid, tsid, tclass);
++	if (!node) {
++		rc = -ENOMEM;
++		goto out;
++	}
++
++	node->ae.avd.allowed = ae->avd.allowed;
++	node->ae.avd.decided = ae->avd.decided;
++	node->ae.avd.auditallow = ae->avd.auditallow;
++	node->ae.avd.auditdeny = ae->avd.auditdeny;
++	node->ae.avd.seqno = ae->avd.seqno;
++	aeref->ae = &node->ae;
++out:
++	return rc;
++}
++
++static inline void avc_print_ipv4_addr(u32 addr, u16 port, char *name1, char *name2)
++{
++	if (addr)
++		printk(" %s=%d.%d.%d.%d", name1, NIPQUAD(addr));
++	if (port)
++		printk(" %s=%d", name2, ntohs(port));
++}
++
++/*
++ * Copied from net/core/utils.c:net_ratelimit and modified for
++ * use by the AVC audit facility.
++ */
++#define AVC_MSG_COST	5*HZ
++#define AVC_MSG_BURST	10*5*HZ
++
++/*
++ * This enforces a rate limit: not more than one kernel message
++ * every 5secs to make a denial-of-service attack impossible.
++ */
++static int avc_ratelimit(void)
++{
++	static spinlock_t ratelimit_lock = SPIN_LOCK_UNLOCKED;
++	static unsigned long toks = 10*5*HZ;
++	static unsigned long last_msg;
++	static int missed, rc = 0;
++	unsigned long flags;
++	unsigned long now = jiffies;
++
++	spin_lock_irqsave(&ratelimit_lock, flags);
++	toks += now - last_msg;
++	last_msg = now;
++	if (toks > AVC_MSG_BURST)
++		toks = AVC_MSG_BURST;
++	if (toks >= AVC_MSG_COST) {
++		int lost = missed;
++		missed = 0;
++		toks -= AVC_MSG_COST;
++		spin_unlock_irqrestore(&ratelimit_lock, flags);
++		if (lost)
++			printk(KERN_WARNING "AVC: %d messages suppressed.\n",
++			       lost);
++		rc = 1;
++		goto out;
++	}
++	missed++;
++	spin_unlock_irqrestore(&ratelimit_lock, flags);
++out:
++	return rc;
++}
++
++static inline int check_avc_ratelimit(void)
++{
++	if (selinux_enforcing)
++		return avc_ratelimit();
++	else {
++		/* If permissive, then never suppress messages. */
++		return 1;
++	}
++}
++
++/**
++ * avc_audit - Audit the granting or denial of permissions.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ * @requested: requested permissions
++ * @avd: access vector decisions
++ * @result: result from avc_has_perm_noaudit
++ * @a:  auxiliary audit data
++ *
++ * Audit the granting or denial of permissions in accordance
++ * with the policy.  This function is typically called by
++ * avc_has_perm() after a permission check, but can also be
++ * called directly by callers who use avc_has_perm_noaudit()
++ * in order to separate the permission check from the auditing.
++ * For example, this separation is useful when the permission check must
++ * be performed under a lock, to allow the lock to be released
++ * before calling the auditing code.
++ */
++void avc_audit(u32 ssid, u32 tsid,
++               u16 tclass, u32 requested,
++               struct av_decision *avd, int result, struct avc_audit_data *a)
++{
++	struct task_struct *tsk = current;
++	struct inode *inode = NULL;
++	char *p;
++	u32 denied, audited;
++
++	denied = requested & ~avd->allowed;
++	if (denied) {
++		audited = denied;
++		if (!(audited & avd->auditdeny))
++			return;
++	} else if (result) {
++		audited = denied = requested;
++        } else {
++		audited = requested;
++		if (!(audited & avd->auditallow))
++			return;
++	}
++
++	if (!check_avc_ratelimit())
++		return;
++
++	/* prevent overlapping printks */
++	spin_lock_irq(&avc_log_lock);
++
++	printk("%s\n", avc_level_string);
++	printk("%savc:  %s ", avc_level_string, denied ? "denied" : "granted");
++	avc_dump_av(tclass,audited);
++	printk(" for ");
++	if (a && a->tsk)
++		tsk = a->tsk;
++	if (tsk && tsk->pid) {
++		struct mm_struct *mm;
++		struct vm_area_struct *vma;
++		printk(" pid=%d", tsk->pid);
++		if (tsk == current)
++			mm = current->mm;
++		else
++			mm = get_task_mm(tsk);
++		if (mm) {
++			if (down_read_trylock(&mm->mmap_sem)) {
++				vma = mm->mmap;
++				while (vma) {
++					if ((vma->vm_flags & VM_EXECUTABLE) &&
++					    vma->vm_file) {
++						p = d_path(vma->vm_file->f_dentry,
++							   vma->vm_file->f_vfsmnt,
++							   avc_audit_buffer,
++							   PAGE_SIZE);
++						printk(" exe=%s", p);
++						break;
++					}
++					vma = vma->vm_next;
++				}
++				up_read(&mm->mmap_sem);
++			}
++			if (tsk != current)
++				mmput(mm);
++		} else {
++			printk(" comm=%s", tsk->comm);
++		}
++	}
++	if (a) {
++		switch (a->type) {
++		case AVC_AUDIT_DATA_IPC:
++			printk(" key=%d", a->u.ipc_id);
++			break;
++		case AVC_AUDIT_DATA_CAP:
++			printk(" capability=%d", a->u.cap);
++			break;
++		case AVC_AUDIT_DATA_FS:
++			if (a->u.fs.dentry) {
++				if (a->u.fs.mnt) {
++					p = d_path(a->u.fs.dentry,
++						   a->u.fs.mnt,
++						   avc_audit_buffer,
++						   PAGE_SIZE);
++					if (p)
++						printk(" path=%s", p);
++				}
++				inode = a->u.fs.dentry->d_inode;
++			} else if (a->u.fs.inode) {
++				inode = a->u.fs.inode;
++			}
++			if (inode)
++				printk(" dev=%s ino=%ld",
++				       inode->i_sb->s_id, inode->i_ino);
++			break;
++		case AVC_AUDIT_DATA_NET:
++			if (a->u.net.sk) {
++				struct sock *sk = a->u.net.sk;
++				struct unix_sock *u;
++				struct inet_opt *inet;
++
++				switch (sk->sk_family) {
++				case AF_INET:
++					inet = inet_sk(sk);
++					avc_print_ipv4_addr(inet->rcv_saddr,
++					                    inet->sport,
++					                    "laddr", "lport");
++					avc_print_ipv4_addr(inet->daddr,
++					                    inet->dport,
++					                    "faddr", "fport");
++					break;
++				case AF_UNIX:
++					u = unix_sk(sk);
++					if (u->dentry) {
++						p = d_path(u->dentry,
++							   u->mnt,
++							   avc_audit_buffer,
++							   PAGE_SIZE);
++						printk(" path=%s", p);
++					} else if (u->addr) {
++						p = avc_audit_buffer;
++						memcpy(p,
++						       u->addr->name->sun_path,
++						       u->addr->len-sizeof(short));
++						if (*p == 0) {
++							*p = '@';
++							p += u->addr->len-sizeof(short);
++							*p = 0;
++						}
++						printk(" path=%s",
++						       avc_audit_buffer);
++					}
++					break;
++				}
++			}
++			if (a->u.net.daddr) {
++				printk(" daddr=%d.%d.%d.%d",
++				       NIPQUAD(a->u.net.daddr));
++				if (a->u.net.port)
++					printk(" dest=%d", a->u.net.port);
++			} else if (a->u.net.port)
++				printk(" port=%d", a->u.net.port);
++			if (a->u.net.skb) {
++				struct sk_buff *skb = a->u.net.skb;
++
++				if ((skb->protocol == htons(ETH_P_IP)) &&
++				     skb->nh.iph) {
++					u16 source = 0, dest = 0;
++					u8  protocol = skb->nh.iph->protocol;
++
++
++					if (protocol == IPPROTO_TCP &&
++					    skb->h.th) {
++						source = skb->h.th->source;
++						dest = skb->h.th->dest;
++					}
++					if (protocol == IPPROTO_UDP &&
++					    skb->h.uh) {
++						source = skb->h.uh->source;
++						dest = skb->h.uh->dest;
++					}
++
++					avc_print_ipv4_addr(skb->nh.iph->saddr,
++					                    source,
++					                    "saddr", "source");
++					avc_print_ipv4_addr(skb->nh.iph->daddr,
++					                    dest,
++					                    "daddr", "dest");
++				}
++			}
++			if (a->u.net.netif)
++				printk(" netif=%s", a->u.net.netif);
++			break;
++		}
++	}
++	printk(" ");
++	avc_dump_query(ssid, tsid, tclass);
++	printk("\n");
++
++	spin_unlock_irq(&avc_log_lock);
++}
++
++/**
++ * avc_add_callback - Register a callback for security events.
++ * @callback: callback function
++ * @events: security events
++ * @ssid: source security identifier or %SECSID_WILD
++ * @tsid: target security identifier or %SECSID_WILD
++ * @tclass: target security class
++ * @perms: permissions
++ *
++ * Register a callback function for events in the set @events
++ * related to the SID pair (@ssid, @tsid) and
++ * and the permissions @perms, interpreting
++ * @perms based on @tclass.  Returns %0 on success or
++ * -%ENOMEM if insufficient memory exists to add the callback.
++ */
++int avc_add_callback(int (*callback)(u32 event, u32 ssid, u32 tsid,
++                                     u16 tclass, u32 perms,
++                                     u32 *out_retained),
++                     u32 events, u32 ssid, u32 tsid,
++                     u16 tclass, u32 perms)
++{
++	struct avc_callback_node *c;
++	int rc = 0;
++
++	c = kmalloc(sizeof(*c), GFP_ATOMIC);
++	if (!c) {
++		rc = -ENOMEM;
++		goto out;
++	}
++
++	c->callback = callback;
++	c->events = events;
++	c->ssid = ssid;
++	c->tsid = tsid;
++	c->perms = perms;
++	c->next = avc_callbacks;
++	avc_callbacks = c;
++out:
++	return rc;
++}
++
++static inline int avc_sidcmp(u32 x, u32 y)
++{
++	return (x == y || x == SECSID_WILD || y == SECSID_WILD);
++}
++
++static inline void avc_update_node(u32 event, struct avc_node *node, u32 perms)
++{
++	switch (event) {
++	case AVC_CALLBACK_GRANT:
++		node->ae.avd.allowed |= perms;
++		break;
++	case AVC_CALLBACK_TRY_REVOKE:
++	case AVC_CALLBACK_REVOKE:
++		node->ae.avd.allowed &= ~perms;
++		break;
++	case AVC_CALLBACK_AUDITALLOW_ENABLE:
++		node->ae.avd.auditallow |= perms;
++		break;
++	case AVC_CALLBACK_AUDITALLOW_DISABLE:
++		node->ae.avd.auditallow &= ~perms;
++		break;
++	case AVC_CALLBACK_AUDITDENY_ENABLE:
++		node->ae.avd.auditdeny |= perms;
++		break;
++	case AVC_CALLBACK_AUDITDENY_DISABLE:
++		node->ae.avd.auditdeny &= ~perms;
++		break;
++	}
++}
++
++static int avc_update_cache(u32 event, u32 ssid, u32 tsid,
++                            u16 tclass, u32 perms)
++{
++	struct avc_node *node;
++	int i;
++	unsigned long flags;
++
++	spin_lock_irqsave(&avc_lock,flags);
++
++	if (ssid == SECSID_WILD || tsid == SECSID_WILD) {
++		/* apply to all matching nodes */
++		for (i = 0; i < AVC_CACHE_SLOTS; i++) {
++			for (node = avc_cache.slots[i]; node;
++			     node = node->next) {
++				if (avc_sidcmp(ssid, node->ae.ssid) &&
++				    avc_sidcmp(tsid, node->ae.tsid) &&
++				    tclass == node->ae.tclass) {
++					avc_update_node(event,node,perms);
++				}
++			}
++		}
++	} else {
++		/* apply to one node */
++		node = avc_search_node(ssid, tsid, tclass, 0);
++		if (node) {
++			avc_update_node(event,node,perms);
++		}
++	}
++
++	spin_unlock_irqrestore(&avc_lock,flags);
++
++	return 0;
++}
++
++static int avc_control(u32 event, u32 ssid, u32 tsid,
++                       u16 tclass, u32 perms,
++                       u32 seqno, u32 *out_retained)
++{
++	struct avc_callback_node *c;
++	u32 tretained = 0, cretained = 0;
++	int rc = 0;
++	unsigned long flags;
++
++	/*
++	 * try_revoke only removes permissions from the cache
++	 * state if they are not retained by the object manager.
++	 * Hence, try_revoke must wait until after the callbacks have
++	 * been invoked to update the cache state.
++	 */
++	if (event != AVC_CALLBACK_TRY_REVOKE)
++		avc_update_cache(event,ssid,tsid,tclass,perms);
++
++	for (c = avc_callbacks; c; c = c->next)
++	{
++		if ((c->events & event) &&
++		    avc_sidcmp(c->ssid, ssid) &&
++		    avc_sidcmp(c->tsid, tsid) &&
++		    c->tclass == tclass &&
++		    (c->perms & perms)) {
++			cretained = 0;
++			rc = c->callback(event, ssid, tsid, tclass,
++					 (c->perms & perms),
++					 &cretained);
++			if (rc)
++				goto out;
++			tretained |= cretained;
++		}
++	}
++
++	if (event == AVC_CALLBACK_TRY_REVOKE) {
++		/* revoke any unretained permissions */
++		perms &= ~tretained;
++		avc_update_cache(event,ssid,tsid,tclass,perms);
++		*out_retained = tretained;
++	}
++
++	spin_lock_irqsave(&avc_lock,flags);
++	if (seqno > avc_cache.latest_notif)
++		avc_cache.latest_notif = seqno;
++	spin_unlock_irqrestore(&avc_lock,flags);
++
++out:
++	return rc;
++}
++
++/**
++ * avc_ss_grant - Grant previously denied permissions.
++ * @ssid: source security identifier or %SECSID_WILD
++ * @tsid: target security identifier or %SECSID_WILD
++ * @tclass: target security class
++ * @perms: permissions to grant
++ * @seqno: policy sequence number
++ */
++int avc_ss_grant(u32 ssid, u32 tsid, u16 tclass,
++                 u32 perms, u32 seqno)
++{
++	return avc_control(AVC_CALLBACK_GRANT,
++			   ssid, tsid, tclass, perms, seqno, 0);
++}
++
++/**
++ * avc_ss_try_revoke - Try to revoke previously granted permissions.
++ * @ssid: source security identifier or %SECSID_WILD
++ * @tsid: target security identifier or %SECSID_WILD
++ * @tclass: target security class
++ * @perms: permissions to grant
++ * @seqno: policy sequence number
++ * @out_retained: subset of @perms that are retained
++ *
++ * Try to revoke previously granted permissions, but
++ * only if they are not retained as migrated permissions.
++ * Return the subset of permissions that are retained via @out_retained.
++ */
++int avc_ss_try_revoke(u32 ssid, u32 tsid, u16 tclass,
++                      u32 perms, u32 seqno, u32 *out_retained)
++{
++	return avc_control(AVC_CALLBACK_TRY_REVOKE,
++			   ssid, tsid, tclass, perms, seqno, out_retained);
++}
++
++/**
++ * avc_ss_revoke - Revoke previously granted permissions.
++ * @ssid: source security identifier or %SECSID_WILD
++ * @tsid: target security identifier or %SECSID_WILD
++ * @tclass: target security class
++ * @perms: permissions to grant
++ * @seqno: policy sequence number
++ *
++ * Revoke previously granted permissions, even if
++ * they are retained as migrated permissions.
++ */
++int avc_ss_revoke(u32 ssid, u32 tsid, u16 tclass,
++                  u32 perms, u32 seqno)
++{
++	return avc_control(AVC_CALLBACK_REVOKE,
++			   ssid, tsid, tclass, perms, seqno, 0);
++}
++
++/**
++ * avc_ss_reset - Flush the cache and revalidate migrated permissions.
++ * @seqno: policy sequence number
++ */
++int avc_ss_reset(u32 seqno)
++{
++	struct avc_callback_node *c;
++	int i, rc = 0;
++	struct avc_node *node, *tmp;
++	unsigned long flags;
++
++	avc_hash_eval("reset");
++
++	spin_lock_irqsave(&avc_lock,flags);
++
++	for (i = 0; i < AVC_CACHE_SLOTS; i++) {
++		node = avc_cache.slots[i];
++		while (node) {
++			tmp = node;
++			node = node->next;
++			tmp->ae.ssid = tmp->ae.tsid = SECSID_NULL;
++			tmp->ae.tclass = SECCLASS_NULL;
++			tmp->ae.avd.allowed = tmp->ae.avd.decided = 0;
++			tmp->ae.avd.auditallow = tmp->ae.avd.auditdeny = 0;
++			tmp->ae.used = 0;
++			tmp->next = avc_node_freelist;
++			avc_node_freelist = tmp;
++			avc_cache.active_nodes--;
++		}
++		avc_cache.slots[i] = 0;
++	}
++	avc_cache.lru_hint = 0;
++
++	spin_unlock_irqrestore(&avc_lock,flags);
++
++	for (i = 0; i < AVC_NSTATS; i++)
++		avc_cache_stats[i] = 0;
++
++	for (c = avc_callbacks; c; c = c->next) {
++		if (c->events & AVC_CALLBACK_RESET) {
++			rc = c->callback(AVC_CALLBACK_RESET,
++					 0, 0, 0, 0, 0);
++			if (rc)
++				goto out;
++		}
++	}
++
++	spin_lock_irqsave(&avc_lock,flags);
++	if (seqno > avc_cache.latest_notif)
++		avc_cache.latest_notif = seqno;
++	spin_unlock_irqrestore(&avc_lock,flags);
++out:
++	return rc;
++}
++
++/**
++ * avc_ss_set_auditallow - Enable or disable auditing of granted permissions.
++ * @ssid: source security identifier or %SECSID_WILD
++ * @tsid: target security identifier or %SECSID_WILD
++ * @tclass: target security class
++ * @perms: permissions to grant
++ * @seqno: policy sequence number
++ * @enable: enable flag.
++ */
++int avc_ss_set_auditallow(u32 ssid, u32 tsid, u16 tclass,
++                          u32 perms, u32 seqno, u32 enable)
++{
++	if (enable)
++		return avc_control(AVC_CALLBACK_AUDITALLOW_ENABLE,
++				   ssid, tsid, tclass, perms, seqno, 0);
++	else
++		return avc_control(AVC_CALLBACK_AUDITALLOW_DISABLE,
++				   ssid, tsid, tclass, perms, seqno, 0);
++}
++
++/**
++ * avc_ss_set_auditdeny - Enable or disable auditing of denied permissions.
++ * @ssid: source security identifier or %SECSID_WILD
++ * @tsid: target security identifier or %SECSID_WILD
++ * @tclass: target security class
++ * @perms: permissions to grant
++ * @seqno: policy sequence number
++ * @enable: enable flag.
++ */
++int avc_ss_set_auditdeny(u32 ssid, u32 tsid, u16 tclass,
++                         u32 perms, u32 seqno, u32 enable)
++{
++	if (enable)
++		return avc_control(AVC_CALLBACK_AUDITDENY_ENABLE,
++				   ssid, tsid, tclass, perms, seqno, 0);
++	else
++		return avc_control(AVC_CALLBACK_AUDITDENY_DISABLE,
++				   ssid, tsid, tclass, perms, seqno, 0);
++}
++
++/**
++ * avc_has_perm_noaudit - Check permissions but perform no auditing.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ * @requested: requested permissions, interpreted based on @tclass
++ * @aeref:  AVC entry reference
++ * @avd: access vector decisions
++ *
++ * Check the AVC to determine whether the @requested permissions are granted
++ * for the SID pair (@ssid, @tsid), interpreting the permissions
++ * based on @tclass, and call the security server on a cache miss to obtain
++ * a new decision and add it to the cache.  Update @aeref to refer to an AVC
++ * entry with the resulting decisions, and return a copy of the decisions
++ * in @avd.  Return %0 if all @requested permissions are granted,
++ * -%EACCES if any permissions are denied, or another -errno upon
++ * other errors.  This function is typically called by avc_has_perm(),
++ * but may also be called directly to separate permission checking from
++ * auditing, e.g. in cases where a lock must be held for the check but
++ * should be released for the auditing.
++ */
++int avc_has_perm_noaudit(u32 ssid, u32 tsid,
++                         u16 tclass, u32 requested,
++                         struct avc_entry_ref *aeref, struct av_decision *avd)
++{
++	struct avc_entry *ae;
++	int rc = 0;
++	unsigned long flags;
++	struct avc_entry entry;
++	u32 denied;
++	struct avc_entry_ref ref;
++
++	if (!aeref) {
++		avc_entry_ref_init(&ref);
++		aeref = &ref;
++	}
++
++	spin_lock_irqsave(&avc_lock, flags);
++	avc_cache_stats_incr(AVC_ENTRY_LOOKUPS);
++	ae = aeref->ae;
++	if (ae) {
++		if (ae->ssid == ssid &&
++		    ae->tsid == tsid &&
++		    ae->tclass == tclass &&
++		    ((ae->avd.decided & requested) == requested)) {
++			avc_cache_stats_incr(AVC_ENTRY_HITS);
++			ae->used = 1;
++		} else {
++			avc_cache_stats_incr(AVC_ENTRY_DISCARDS);
++			ae = 0;
++		}
++	}
++
++	if (!ae) {
++		avc_cache_stats_incr(AVC_ENTRY_MISSES);
++		rc = avc_lookup(ssid, tsid, tclass, requested, aeref);
++		if (rc) {
++			spin_unlock_irqrestore(&avc_lock,flags);
++			rc = security_compute_av(ssid,tsid,tclass,requested,&entry.avd);
++			if (rc)
++				goto out;
++			spin_lock_irqsave(&avc_lock, flags);
++			rc = avc_insert(ssid,tsid,tclass,&entry,aeref);
++			if (rc) {
++				spin_unlock_irqrestore(&avc_lock,flags);
++				goto out;
++			}
++		}
++		ae = aeref->ae;
++	}
++
++	if (avd)
++		memcpy(avd, &ae->avd, sizeof(*avd));
++
++	denied = requested & ~(ae->avd.allowed);
++
++	if (!requested || denied) {
++		if (selinux_enforcing) {
++			spin_unlock_irqrestore(&avc_lock,flags);
++			rc = -EACCES;
++			goto out;
++		} else {
++			ae->avd.allowed |= requested;
++			spin_unlock_irqrestore(&avc_lock,flags);
++			goto out;
++		}
++	}
++
++	spin_unlock_irqrestore(&avc_lock,flags);
++out:
++	return rc;
++}
++
++/**
++ * avc_has_perm - Check permissions and perform any appropriate auditing.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ * @requested: requested permissions, interpreted based on @tclass
++ * @aeref:  AVC entry reference
++ * @auditdata: auxiliary audit data
++ *
++ * Check the AVC to determine whether the @requested permissions are granted
++ * for the SID pair (@ssid, @tsid), interpreting the permissions
++ * based on @tclass, and call the security server on a cache miss to obtain
++ * a new decision and add it to the cache.  Update @aeref to refer to an AVC
++ * entry with the resulting decisions.  Audit the granting or denial of
++ * permissions in accordance with the policy.  Return %0 if all @requested
++ * permissions are granted, -%EACCES if any permissions are denied, or
++ * another -errno upon other errors.
++ */
++int avc_has_perm(u32 ssid, u32 tsid, u16 tclass,
++                 u32 requested, struct avc_entry_ref *aeref,
++                 struct avc_audit_data *auditdata)
++{
++	struct av_decision avd;
++	int rc;
++
++	rc = avc_has_perm_noaudit(ssid, tsid, tclass, requested, aeref, &avd);
++	avc_audit(ssid, tsid, tclass, requested, &avd, rc, auditdata);
++	return rc;
++}
++
++static int __init avc_log_level_setup(char *str)
++{
++	avc_log_level = simple_strtol(str, NULL, 0);
++	if (avc_log_level > 7)
++		avc_log_level = 7;
++	return 1;
++}
++
++__setup("avc_log_level=", avc_log_level_setup);
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/hooks.c	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,3405 @@
++/*
++ *  NSA Security-Enhanced Linux (SELinux) security module
++ *
++ *  This file contains the SELinux hook function implementations.
++ *
++ *  Authors:  Stephen Smalley, <sds@epoch.ncsc.mil>
++ *            Chris Vance, <cvance@nai.com>
++ *            Wayne Salamon, <wsalamon@nai.com>
++ *            James Morris <jmorris@redhat.com>
++ *
++ *  Copyright (C) 2001,2002 Networks Associates Technology, Inc.
++ *  Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.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.
++ */
++
++#define XATTR_SECURITY_PREFIX "security."
++#define XATTR_SELINUX_SUFFIX "selinux"
++#define XATTR_NAME_SELINUX XATTR_SECURITY_PREFIX XATTR_SELINUX_SUFFIX
++
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/ptrace.h>
++#include <linux/errno.h>
++#include <linux/sched.h>
++#include <linux/security.h>
++#include <linux/xattr.h>
++#include <linux/capability.h>
++#include <linux/unistd.h>
++#include <linux/mm.h>
++#include <linux/mman.h>
++#include <linux/slab.h>
++#include <linux/pagemap.h>
++#include <linux/swap.h>
++#include <linux/smp_lock.h>
++#include <linux/spinlock.h>
++#include <linux/file.h>
++#include <linux/namei.h>
++#include <linux/mount.h>
++#include <linux/ext2_fs.h>
++#include <linux/proc_fs.h>
++#include <linux/kd.h>
++#include <net/icmp.h>
++#include <net/ip.h>		/* for sysctl_local_port_range[] */
++#include <net/tcp.h>		/* struct or_callable used in sock_rcv_skb */
++#include <asm/uaccess.h>
++#include <asm/semaphore.h>
++#include <asm/ioctls.h>
++#include <linux/bitops.h>
++#include <linux/interrupt.h>
++#include <linux/netdevice.h>	/* for network interface checks */
++#include <linux/netlink.h>
++#include <linux/tcp.h>
++#include <linux/quota.h>
++#include <linux/un.h>		/* for Unix socket types */
++#include <net/af_unix.h>	/* for Unix socket types */
++
++#include "avc.h"
++#include "objsec.h"
++
++#ifdef CONFIG_SECURITY_SELINUX_DEVELOP
++int selinux_enforcing = 0;
++
++static int __init enforcing_setup(char *str)
++{
++	selinux_enforcing = simple_strtol(str,NULL,0);
++	return 1;
++}
++__setup("enforcing=", enforcing_setup);
++#endif
++
++/* Original (dummy) security module. */
++static struct security_operations *original_ops = NULL;
++
++/* Minimal support for a secondary security module,
++   just to allow the use of the dummy or capability modules.
++   The owlsm module can alternatively be used as a secondary
++   module as long as CONFIG_OWLSM_FD is not enabled. */
++static struct security_operations *secondary_ops = NULL;
++
++/* Lists of inode and superblock security structures initialized
++   before the policy was loaded. */
++static LIST_HEAD(inode_security_head);
++static spinlock_t inode_security_lock = SPIN_LOCK_UNLOCKED;
++
++static LIST_HEAD(superblock_security_head);
++static spinlock_t sb_security_lock = SPIN_LOCK_UNLOCKED;
++
++/* Allocate and free functions for each kind of security blob. */
++
++static int task_alloc_security(struct task_struct *task)
++{
++	struct task_security_struct *tsec;
++
++	tsec = kmalloc(sizeof(struct task_security_struct), GFP_KERNEL);
++	if (!tsec)
++		return -ENOMEM;
++
++	memset(tsec, 0, sizeof(struct task_security_struct));
++	tsec->magic = SELINUX_MAGIC;
++	tsec->task = task;
++	tsec->osid = tsec->sid = SECINITSID_UNLABELED;
++	task->security = tsec;
++
++	return 0;
++}
++
++static void task_free_security(struct task_struct *task)
++{
++	struct task_security_struct *tsec = task->security;
++
++	if (!tsec || tsec->magic != SELINUX_MAGIC)
++		return;
++
++	task->security = NULL;
++	kfree(tsec);
++}
++
++static int inode_alloc_security(struct inode *inode)
++{
++	struct task_security_struct *tsec = current->security;
++	struct inode_security_struct *isec;
++
++	isec = kmalloc(sizeof(struct inode_security_struct), GFP_KERNEL);
++	if (!isec)
++		return -ENOMEM;
++
++	memset(isec, 0, sizeof(struct inode_security_struct));
++	init_MUTEX(&isec->sem);
++	INIT_LIST_HEAD(&isec->list);
++	isec->magic = SELINUX_MAGIC;
++	isec->inode = inode;
++	isec->sid = SECINITSID_UNLABELED;
++	isec->sclass = SECCLASS_FILE;
++	if (tsec && tsec->magic == SELINUX_MAGIC)
++		isec->task_sid = tsec->sid;
++	else
++		isec->task_sid = SECINITSID_UNLABELED;
++	inode->i_security = isec;
++
++	return 0;
++}
++
++static void inode_free_security(struct inode *inode)
++{
++	struct inode_security_struct *isec = inode->i_security;
++
++	if (!isec || isec->magic != SELINUX_MAGIC)
++		return;
++
++	spin_lock(&inode_security_lock);
++	if (!list_empty(&isec->list))
++		list_del_init(&isec->list);
++	spin_unlock(&inode_security_lock);
++
++	inode->i_security = NULL;
++	kfree(isec);
++}
++
++static int file_alloc_security(struct file *file)
++{
++	struct task_security_struct *tsec = current->security;
++	struct file_security_struct *fsec;
++
++	fsec = kmalloc(sizeof(struct file_security_struct), GFP_ATOMIC);
++	if (!fsec)
++		return -ENOMEM;
++
++	memset(fsec, 0, sizeof(struct file_security_struct));
++	fsec->magic = SELINUX_MAGIC;
++	fsec->file = file;
++	if (tsec && tsec->magic == SELINUX_MAGIC) {
++		fsec->sid = tsec->sid;
++		fsec->fown_sid = tsec->sid;
++	} else {
++		fsec->sid = SECINITSID_UNLABELED;
++		fsec->fown_sid = SECINITSID_UNLABELED;
++	}
++	file->f_security = fsec;
++
++	return 0;
++}
++
++static void file_free_security(struct file *file)
++{
++	struct file_security_struct *fsec = file->f_security;
++
++	if (!fsec || fsec->magic != SELINUX_MAGIC)
++		return;
++
++	file->f_security = NULL;
++	kfree(fsec);
++}
++
++static int superblock_alloc_security(struct super_block *sb)
++{
++	struct superblock_security_struct *sbsec;
++
++	sbsec = kmalloc(sizeof(struct superblock_security_struct), GFP_KERNEL);
++	if (!sbsec)
++		return -ENOMEM;
++
++	memset(sbsec, 0, sizeof(struct superblock_security_struct));
++	init_MUTEX(&sbsec->sem);
++	INIT_LIST_HEAD(&sbsec->list);
++	sbsec->magic = SELINUX_MAGIC;
++	sbsec->sb = sb;
++	sbsec->sid = SECINITSID_UNLABELED;
++	sb->s_security = sbsec;
++
++	return 0;
++}
++
++static void superblock_free_security(struct super_block *sb)
++{
++	struct superblock_security_struct *sbsec = sb->s_security;
++
++	if (!sbsec || sbsec->magic != SELINUX_MAGIC)
++		return;
++
++	spin_lock(&sb_security_lock);
++	if (!list_empty(&sbsec->list))
++		list_del_init(&sbsec->list);
++	spin_unlock(&sb_security_lock);
++
++	sb->s_security = NULL;
++	kfree(sbsec);
++}
++
++/* The security server must be initialized before
++   any labeling or access decisions can be provided. */
++extern int ss_initialized;
++
++/* The file system's label must be initialized prior to use. */
++
++static char *labeling_behaviors[5] = {
++	"uses xattr",
++	"uses transition SIDs",
++	"uses task SIDs",
++	"uses genfs_contexts",
++	"not configured for labeling"
++};
++
++static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry);
++
++static inline int inode_doinit(struct inode *inode)
++{
++	return inode_doinit_with_dentry(inode, NULL);
++}
++
++static int superblock_doinit(struct super_block *sb)
++{
++	struct superblock_security_struct *sbsec = sb->s_security;
++	struct dentry *root = sb->s_root;
++	struct inode *inode = root->d_inode;
++	int rc = 0;
++
++	down(&sbsec->sem);
++	if (sbsec->initialized)
++		goto out;
++
++	if (!ss_initialized) {
++		/* Defer initialization until selinux_complete_init,
++		   after the initial policy is loaded and the security
++		   server is ready to handle calls. */
++		spin_lock(&sb_security_lock);
++		if (list_empty(&sbsec->list))
++			list_add(&sbsec->list, &superblock_security_head);
++		spin_unlock(&sb_security_lock);
++		goto out;
++	}
++
++	/* Determine the labeling behavior to use for this filesystem type. */
++	rc = security_fs_use(sb->s_type->name, &sbsec->behavior, &sbsec->sid);
++	if (rc) {
++		printk(KERN_WARNING "%s:  security_fs_use(%s) returned %d\n",
++		       __FUNCTION__, sb->s_type->name, rc);
++		goto out;
++	}
++
++	if (sbsec->behavior == SECURITY_FS_USE_XATTR) {
++		/* Make sure that the xattr handler exists and that no
++		   error other than -ENODATA is returned by getxattr on
++		   the root directory.  -ENODATA is ok, as this may be
++		   the first boot of the SELinux kernel before we have
++		   assigned xattr values to the filesystem. */
++		if (!inode->i_op->getxattr) {
++			printk(KERN_WARNING "SELinux: (dev %s, type %s) has no "
++			       "xattr support\n", sb->s_id, sb->s_type->name);
++			rc = -EOPNOTSUPP;
++			goto out;
++		}
++		rc = inode->i_op->getxattr(root, XATTR_NAME_SELINUX, NULL, 0);
++		if (rc < 0 && rc != -ENODATA) {
++			if (rc == -EOPNOTSUPP)
++				printk(KERN_WARNING "SELinux: (dev %s, type "
++				       "%s) has no security xattr handler\n",
++				       sb->s_id, sb->s_type->name);
++			else
++				printk(KERN_WARNING "SELinux: (dev %s, type "
++				       "%s) getxattr errno %d\n", sb->s_id,
++				       sb->s_type->name, -rc);
++			goto out;
++		}
++	}
++
++	if (strcmp(sb->s_type->name, "proc") == 0)
++		sbsec->proc = 1;
++
++	sbsec->initialized = 1;
++
++	printk(KERN_INFO "SELinux: initialized (dev %s, type %s), %s\n",
++	       sb->s_id, sb->s_type->name,
++	       labeling_behaviors[sbsec->behavior-1]);
++
++	/* Initialize the root inode. */
++	rc = inode_doinit_with_dentry(sb->s_root->d_inode, sb->s_root);
++out:
++	up(&sbsec->sem);
++	return rc;
++}
++
++static inline u16 inode_mode_to_security_class(umode_t mode)
++{
++	switch (mode & S_IFMT) {
++	case S_IFSOCK:
++		return SECCLASS_SOCK_FILE;
++	case S_IFLNK:
++		return SECCLASS_LNK_FILE;
++	case S_IFREG:
++		return SECCLASS_FILE;
++	case S_IFBLK:
++		return SECCLASS_BLK_FILE;
++	case S_IFDIR:
++		return SECCLASS_DIR;
++	case S_IFCHR:
++		return SECCLASS_CHR_FILE;
++	case S_IFIFO:
++		return SECCLASS_FIFO_FILE;
++
++	}
++
++	return SECCLASS_FILE;
++}
++
++static inline u16 socket_type_to_security_class(int family, int type)
++{
++	switch (family) {
++	case PF_UNIX:
++		switch (type) {
++		case SOCK_STREAM:
++			return SECCLASS_UNIX_STREAM_SOCKET;
++		case SOCK_DGRAM:
++			return SECCLASS_UNIX_DGRAM_SOCKET;
++		}
++	case PF_INET:
++	case PF_INET6:
++		switch (type) {
++		case SOCK_STREAM:
++			return SECCLASS_TCP_SOCKET;
++		case SOCK_DGRAM:
++			return SECCLASS_UDP_SOCKET;
++		case SOCK_RAW:
++			return SECCLASS_RAWIP_SOCKET;
++		}
++	case PF_NETLINK:
++		return SECCLASS_NETLINK_SOCKET;
++	case PF_PACKET:
++		return SECCLASS_PACKET_SOCKET;
++	case PF_KEY:
++		return SECCLASS_KEY_SOCKET;
++	}
++
++	return SECCLASS_SOCKET;
++}
++
++#ifdef CONFIG_PROC_FS
++static int selinux_proc_get_sid(struct proc_dir_entry *de,
++				u16 tclass,
++				u32 *sid)
++{
++	int buflen, rc;
++	char *buffer, *path, *end;
++
++	buffer = (char*)__get_free_page(GFP_KERNEL);
++	if (!buffer)
++		return -ENOMEM;
++
++	buflen = PAGE_SIZE;
++	end = buffer+buflen;
++	*--end = '\0';
++	buflen--;
++	path = end-1;
++	*path = '/';
++	while (de && de != de->parent) {
++		buflen -= de->namelen + 1;
++		if (buflen < 0)
++			break;
++		end -= de->namelen;
++		memcpy(end, de->name, de->namelen);
++		*--end = '/';
++		path = end;
++		de = de->parent;
++	}
++	rc = security_genfs_sid("proc", path, tclass, sid);
++	free_page((unsigned long)buffer);
++	return rc;
++}
++#else
++static int selinux_proc_get_sid(struct proc_dir_entry *de,
++				u16 tclass,
++				u32 *sid)
++{
++	return -EINVAL;
++}
++#endif
++
++/* The inode's security attributes must be initialized before first use. */
++static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry)
++{
++	struct superblock_security_struct *sbsec = NULL;
++	struct inode_security_struct *isec = inode->i_security;
++	u32 sid;
++	struct dentry *dentry;
++#define INITCONTEXTLEN 255
++	char *context = NULL;
++	unsigned len = 0;
++	int rc = 0;
++	int hold_sem = 0;
++
++	if (isec->initialized)
++		goto out;
++
++	down(&isec->sem);
++	hold_sem = 1;
++	if (isec->initialized)
++		goto out;
++
++	sbsec = inode->i_sb->s_security;
++	if (!sbsec || !sbsec->initialized) {
++		/* Defer initialization until selinux_complete_init,
++		   after the initial policy is loaded and the security
++		   server is ready to handle calls. */
++		spin_lock(&inode_security_lock);
++		if (list_empty(&isec->list))
++			list_add(&isec->list, &inode_security_head);
++		spin_unlock(&inode_security_lock);
++		goto out;
++	}
++
++	switch (sbsec->behavior) {
++	case SECURITY_FS_USE_XATTR:
++		if (!inode->i_op->getxattr) {
++			isec->sid = SECINITSID_FILE;
++			break;
++		}
++
++		/* Need a dentry, since the xattr API requires one.
++		   Life would be simpler if we could just pass the inode. */
++		if (opt_dentry) {
++			/* Called from d_instantiate or d_splice_alias. */
++			dentry = dget(opt_dentry);
++		} else {
++			/* Called from selinux_complete_init, try to find a dentry. */
++			dentry = d_find_alias(inode);
++		}
++		if (!dentry) {
++			printk(KERN_WARNING "%s:  no dentry for dev=%s "
++			       "ino=%ld\n", __FUNCTION__, inode->i_sb->s_id,
++			       inode->i_ino);
++			goto out;
++		}
++
++		len = INITCONTEXTLEN;
++		context = kmalloc(len, GFP_KERNEL);
++		if (!context) {
++			rc = -ENOMEM;
++			dput(dentry);
++			goto out;
++		}
++		rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX,
++					   context, len);
++		if (rc == -ERANGE) {
++			/* Need a larger buffer.  Query for the right size. */
++			rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX,
++						   NULL, 0);
++			if (rc < 0) {
++				dput(dentry);
++				goto out;
++			}
++			kfree(context);
++			len = rc;
++			context = kmalloc(len, GFP_KERNEL);
++			if (!context) {
++				rc = -ENOMEM;
++				dput(dentry);
++				goto out;
++			}
++			rc = inode->i_op->getxattr(dentry,
++						   XATTR_NAME_SELINUX,
++						   context, len);
++		}
++		dput(dentry);
++		if (rc < 0) {
++			if (rc != -ENODATA) {
++				printk(KERN_WARNING "%s:  getxattr returned "
++				       "%d for dev=%s ino=%ld\n", __FUNCTION__,
++				       -rc, inode->i_sb->s_id, inode->i_ino);
++				kfree(context);
++				goto out;
++			}
++			/* Map ENODATA to the default file SID */
++			sid = SECINITSID_FILE;
++			rc = 0;
++		} else {
++			rc = security_context_to_sid(context, rc, &sid);
++			if (rc) {
++				printk(KERN_WARNING "%s:  context_to_sid(%s) "
++				       "returned %d for dev=%s ino=%ld\n",
++				       __FUNCTION__, context, -rc,
++				       inode->i_sb->s_id, inode->i_ino);
++				kfree(context);
++				goto out;
++			}
++		}
++		kfree(context);
++		isec->sid = sid;
++		break;
++	case SECURITY_FS_USE_TASK:
++		isec->sid = isec->task_sid;
++		break;
++	case SECURITY_FS_USE_TRANS:
++		/* Default to the fs SID. */
++		isec->sid = sbsec->sid;
++
++		/* Try to obtain a transition SID. */
++		isec->sclass = inode_mode_to_security_class(inode->i_mode);
++		rc = security_transition_sid(isec->task_sid,
++					     sbsec->sid,
++					     isec->sclass,
++					     &sid);
++		if (rc)
++			goto out;
++		isec->sid = sid;
++		break;
++	default:
++		/* Default to the fs SID. */
++		isec->sid = sbsec->sid;
++
++		if (sbsec->proc) {
++			struct proc_inode *proci = PROC_I(inode);
++			if (proci->pde) {
++				isec->sclass = inode_mode_to_security_class(inode->i_mode);
++				rc = selinux_proc_get_sid(proci->pde,
++							  isec->sclass,
++							  &sid);
++				if (rc)
++					goto out;
++				isec->sid = sid;
++			}
++		}
++		break;
++	}
++
++	isec->initialized = 1;
++
++out:
++	if (inode->i_sock) {
++		struct socket *sock = SOCKET_I(inode);
++		if (sock->sk) {
++			isec->sclass = socket_type_to_security_class(sock->sk->sk_family,
++			                                             sock->sk->sk_type);
++		} else {
++			isec->sclass = SECCLASS_SOCKET;
++		}
++	} else {
++		isec->sclass = inode_mode_to_security_class(inode->i_mode);
++	}
++
++	if (hold_sem)
++		up(&isec->sem);
++	return rc;
++}
++
++/* Convert a Linux signal to an access vector. */
++static inline u32 signal_to_av(int sig)
++{
++	u32 perm = 0;
++
++	switch (sig) {
++	case SIGCHLD:
++		/* Commonly granted from child to parent. */
++		perm = PROCESS__SIGCHLD;
++		break;
++	case SIGKILL:
++		/* Cannot be caught or ignored */
++		perm = PROCESS__SIGKILL;
++		break;
++	case SIGSTOP:
++		/* Cannot be caught or ignored */
++		perm = PROCESS__SIGSTOP;
++		break;
++	default:
++		/* All other signals. */
++		perm = PROCESS__SIGNAL;
++		break;
++	}
++
++	return perm;
++}
++
++/* Check permission betweeen a pair of tasks, e.g. signal checks,
++   fork check, ptrace check, etc. */
++int task_has_perm(struct task_struct *tsk1,
++		  struct task_struct *tsk2,
++		  u32 perms)
++{
++	struct task_security_struct *tsec1, *tsec2;
++
++	tsec1 = tsk1->security;
++	tsec2 = tsk2->security;
++	return avc_has_perm(tsec1->sid, tsec2->sid,
++			    SECCLASS_PROCESS, perms, &tsec2->avcr, NULL);
++}
++
++/* Check whether a task is allowed to use a capability. */
++int task_has_capability(struct task_struct *tsk,
++			int cap)
++{
++	struct task_security_struct *tsec;
++	struct avc_audit_data ad;
++
++	tsec = tsk->security;
++
++	AVC_AUDIT_DATA_INIT(&ad,CAP);
++	ad.tsk = tsk;
++	ad.u.cap = cap;
++
++	return avc_has_perm(tsec->sid, tsec->sid,
++			    SECCLASS_CAPABILITY, CAP_TO_MASK(cap), NULL, &ad);
++}
++
++/* Check whether a task is allowed to use a system operation. */
++int task_has_system(struct task_struct *tsk,
++		    u32 perms)
++{
++	struct task_security_struct *tsec;
++
++	tsec = tsk->security;
++
++	return avc_has_perm(tsec->sid, SECINITSID_KERNEL,
++			    SECCLASS_SYSTEM, perms, NULL, NULL);
++}
++
++/* Check whether a task has a particular permission to an inode.
++   The 'aeref' parameter is optional and allows other AVC
++   entry references to be passed (e.g. the one in the struct file).
++   The 'adp' parameter is optional and allows other audit
++   data to be passed (e.g. the dentry). */
++int inode_has_perm(struct task_struct *tsk,
++		   struct inode *inode,
++		   u32 perms,
++		   struct avc_entry_ref *aeref,
++		   struct avc_audit_data *adp)
++{
++	struct task_security_struct *tsec;
++	struct inode_security_struct *isec;
++	struct avc_audit_data ad;
++
++	tsec = tsk->security;
++	isec = inode->i_security;
++
++	if (!adp) {
++		adp = &ad;
++		AVC_AUDIT_DATA_INIT(&ad, FS);
++		ad.u.fs.inode = inode;
++	}
++
++	return avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++			    perms, aeref ? aeref : &isec->avcr, adp);
++}
++
++/* Same as inode_has_perm, but pass explicit audit data containing
++   the dentry to help the auditing code to more easily generate the
++   pathname if needed. */
++static inline int dentry_has_perm(struct task_struct *tsk,
++				  struct vfsmount *mnt,
++				  struct dentry *dentry,
++				  u32 av)
++{
++	struct inode *inode = dentry->d_inode;
++	struct avc_audit_data ad;
++	AVC_AUDIT_DATA_INIT(&ad,FS);
++	ad.u.fs.mnt = mnt;
++	ad.u.fs.dentry = dentry;
++	return inode_has_perm(tsk, inode, av, NULL, &ad);
++}
++
++/* Check whether a task can use an open file descriptor to
++   access an inode in a given way.  Check access to the
++   descriptor itself, and then use dentry_has_perm to
++   check a particular permission to the file.
++   Access to the descriptor is implicitly granted if it
++   has the same SID as the process.  If av is zero, then
++   access to the file is not checked, e.g. for cases
++   where only the descriptor is affected like seek. */
++static inline int file_has_perm(struct task_struct *tsk,
++				struct file *file,
++				u32 av)
++{
++	struct task_security_struct *tsec = tsk->security;
++	struct file_security_struct *fsec = file->f_security;
++	struct vfsmount *mnt = file->f_vfsmnt;
++	struct dentry *dentry = file->f_dentry;
++	struct inode *inode = dentry->d_inode;
++	struct avc_audit_data ad;
++	int rc;
++
++	AVC_AUDIT_DATA_INIT(&ad, FS);
++	ad.u.fs.mnt = mnt;
++	ad.u.fs.dentry = dentry;
++
++	if (tsec->sid != fsec->sid) {
++		rc = avc_has_perm(tsec->sid, fsec->sid,
++				  SECCLASS_FD,
++				  FD__USE,
++				  &fsec->avcr, &ad);
++		if (rc)
++			return rc;
++	}
++
++	/* av is zero if only checking access to the descriptor. */
++	if (av)
++		return inode_has_perm(tsk, inode, av, &fsec->inode_avcr, &ad);
++
++	return 0;
++}
++
++/* Check whether a task can create a file. */
++static int may_create(struct inode *dir,
++		      struct dentry *dentry,
++		      u16 tclass)
++{
++	struct task_security_struct *tsec;
++	struct inode_security_struct *dsec;
++	struct superblock_security_struct *sbsec;
++	u32 newsid;
++	struct avc_audit_data ad;
++	int rc;
++
++	tsec = current->security;
++	dsec = dir->i_security;
++
++	AVC_AUDIT_DATA_INIT(&ad, FS);
++	ad.u.fs.dentry = dentry;
++
++	rc = avc_has_perm(tsec->sid, dsec->sid, SECCLASS_DIR,
++			  DIR__ADD_NAME | DIR__SEARCH,
++			  &dsec->avcr, &ad);
++	if (rc)
++		return rc;
++
++	if (tsec->create_sid) {
++		newsid = tsec->create_sid;
++	} else {
++		rc = security_transition_sid(tsec->sid, dsec->sid, tclass,
++					     &newsid);
++		if (rc)
++			return rc;
++	}
++
++	rc = avc_has_perm(tsec->sid, newsid, tclass, FILE__CREATE, NULL, &ad);
++	if (rc)
++		return rc;
++
++	sbsec = dir->i_sb->s_security;
++
++	return avc_has_perm(newsid, sbsec->sid,
++			    SECCLASS_FILESYSTEM,
++			    FILESYSTEM__ASSOCIATE, NULL, &ad);
++}
++
++#define MAY_LINK   0
++#define MAY_UNLINK 1
++#define MAY_RMDIR  2
++
++/* Check whether a task can link, unlink, or rmdir a file/directory. */
++static int may_link(struct inode *dir,
++		    struct dentry *dentry,
++		    int kind)
++
++{
++	struct task_security_struct *tsec;
++	struct inode_security_struct *dsec, *isec;
++	struct avc_audit_data ad;
++	u32 av;
++	int rc;
++
++	tsec = current->security;
++	dsec = dir->i_security;
++	isec = dentry->d_inode->i_security;
++
++	AVC_AUDIT_DATA_INIT(&ad, FS);
++	ad.u.fs.dentry = dentry;
++
++	av = DIR__SEARCH;
++	av |= (kind ? DIR__REMOVE_NAME : DIR__ADD_NAME);
++	rc = avc_has_perm(tsec->sid, dsec->sid, SECCLASS_DIR,
++			  av, &dsec->avcr, &ad);
++	if (rc)
++		return rc;
++
++	switch (kind) {
++	case MAY_LINK:
++		av = FILE__LINK;
++		break;
++	case MAY_UNLINK:
++		av = FILE__UNLINK;
++		break;
++	case MAY_RMDIR:
++		av = DIR__RMDIR;
++		break;
++	default:
++		printk(KERN_WARNING "may_link:  unrecognized kind %d\n", kind);
++		return 0;
++	}
++
++	rc = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++			  av, &isec->avcr, &ad);
++	return rc;
++}
++
++static inline int may_rename(struct inode *old_dir,
++			     struct dentry *old_dentry,
++			     struct inode *new_dir,
++			     struct dentry *new_dentry)
++{
++	struct task_security_struct *tsec;
++	struct inode_security_struct *old_dsec, *new_dsec, *old_isec, *new_isec;
++	struct avc_audit_data ad;
++	u32 av;
++	int old_is_dir, new_is_dir;
++	int rc;
++
++	tsec = current->security;
++	old_dsec = old_dir->i_security;
++	old_isec = old_dentry->d_inode->i_security;
++	old_is_dir = S_ISDIR(old_dentry->d_inode->i_mode);
++	new_dsec = new_dir->i_security;
++
++	AVC_AUDIT_DATA_INIT(&ad, FS);
++
++	ad.u.fs.dentry = old_dentry;
++	rc = avc_has_perm(tsec->sid, old_dsec->sid, SECCLASS_DIR,
++			  DIR__REMOVE_NAME | DIR__SEARCH,
++			  &old_dsec->avcr, &ad);
++	if (rc)
++		return rc;
++	rc = avc_has_perm(tsec->sid, old_isec->sid,
++			  old_isec->sclass,
++			  FILE__RENAME,
++			  &old_isec->avcr, &ad);
++	if (rc)
++		return rc;
++	if (old_is_dir && new_dir != old_dir) {
++		rc = avc_has_perm(tsec->sid, old_isec->sid,
++				  old_isec->sclass,
++				  DIR__REPARENT,
++				  &old_isec->avcr, &ad);
++		if (rc)
++			return rc;
++	}
++
++	ad.u.fs.dentry = new_dentry;
++	av = DIR__ADD_NAME | DIR__SEARCH;
++	if (new_dentry->d_inode)
++		av |= DIR__REMOVE_NAME;
++	rc = avc_has_perm(tsec->sid, new_dsec->sid, SECCLASS_DIR,
++			  av,&new_dsec->avcr, &ad);
++	if (rc)
++		return rc;
++	if (new_dentry->d_inode) {
++		new_isec = new_dentry->d_inode->i_security;
++		new_is_dir = S_ISDIR(new_dentry->d_inode->i_mode);
++		rc = avc_has_perm(tsec->sid, new_isec->sid,
++				  new_isec->sclass,
++				  (new_is_dir ? DIR__RMDIR : FILE__UNLINK),
++				  &new_isec->avcr, &ad);
++		if (rc)
++			return rc;
++	}
++
++	return 0;
++}
++
++/* Check whether a task can perform a filesystem operation. */
++int superblock_has_perm(struct task_struct *tsk,
++			struct super_block *sb,
++			u32 perms,
++			struct avc_audit_data *ad)
++{
++	struct task_security_struct *tsec;
++	struct superblock_security_struct *sbsec;
++
++	tsec = tsk->security;
++	sbsec = sb->s_security;
++	return avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
++			    perms, NULL, ad);
++}
++
++/* Convert a Linux mode and permission mask to an access vector. */
++static inline u32 file_mask_to_av(int mode, int mask)
++{
++	u32 av = 0;
++
++	if ((mode & S_IFMT) != S_IFDIR) {
++		if (mask & MAY_EXEC)
++			av |= FILE__EXECUTE;
++		if (mask & MAY_READ)
++			av |= FILE__READ;
++
++		if (mask & MAY_APPEND)
++			av |= FILE__APPEND;
++		else if (mask & MAY_WRITE)
++			av |= FILE__WRITE;
++
++	} else {
++		if (mask & MAY_EXEC)
++			av |= DIR__SEARCH;
++		if (mask & MAY_WRITE)
++			av |= DIR__WRITE;
++		if (mask & MAY_READ)
++			av |= DIR__READ;
++	}
++
++	return av;
++}
++
++/* Convert a Linux file to an access vector. */
++static inline u32 file_to_av(struct file *file)
++{
++	u32 av = 0;
++
++	if (file->f_mode & FMODE_READ)
++		av |= FILE__READ;
++	if (file->f_mode & FMODE_WRITE) {
++		if (file->f_flags & O_APPEND)
++			av |= FILE__APPEND;
++		else
++			av |= FILE__WRITE;
++	}
++
++	return av;
++}
++
++/* Set an inode's SID to a specified value. */
++int inode_security_set_sid(struct inode *inode, u32 sid)
++{
++	struct inode_security_struct *isec = inode->i_security;
++
++	down(&isec->sem);
++	isec->sclass = inode_mode_to_security_class(inode->i_mode);
++	isec->sid = sid;
++	isec->initialized = 1;
++	up(&isec->sem);
++	return 0;
++}
++
++/* Set the security attributes on a newly created file. */
++static int post_create(struct inode *dir,
++		       struct dentry *dentry)
++{
++
++	struct task_security_struct *tsec;
++	struct inode *inode;
++	struct inode_security_struct *dsec;
++	struct superblock_security_struct *sbsec;
++	u32 newsid;
++	char *context;
++	unsigned int len;
++	int rc;
++
++	tsec = current->security;
++	dsec = dir->i_security;
++
++	inode = dentry->d_inode;
++	if (!inode) {
++		/* Some file system types (e.g. NFS) may not instantiate
++		   a dentry for all create operations (e.g. symlink),
++		   so we have to check to see if the inode is non-NULL. */
++		printk(KERN_WARNING "post_create:  no inode, dir (dev=%s, "
++		       "ino=%ld)\n", dir->i_sb->s_id, dir->i_ino);
++		return 0;
++	}
++
++	if (tsec->create_sid) {
++		newsid = tsec->create_sid;
++	} else {
++		rc = security_transition_sid(tsec->sid, dsec->sid,
++					     inode_mode_to_security_class(inode->i_mode),
++					     &newsid);
++		if (rc) {
++			printk(KERN_WARNING "post_create:  "
++			       "security_transition_sid failed, rc=%d (dev=%s "
++			       "ino=%ld)\n",
++			       -rc, inode->i_sb->s_id, inode->i_ino);
++			return rc;
++		}
++	}
++
++	rc = inode_security_set_sid(inode, newsid);
++	if (rc) {
++		printk(KERN_WARNING "post_create:  inode_security_set_sid "
++		       "failed, rc=%d (dev=%s ino=%ld)\n",
++		       -rc, inode->i_sb->s_id, inode->i_ino);
++		return rc;
++	}
++
++	sbsec = dir->i_sb->s_security;
++	if (!sbsec)
++		return 0;
++
++	if (sbsec->behavior == SECURITY_FS_USE_XATTR &&
++	    inode->i_op->setxattr) {
++		/* Use extended attributes. */
++		rc = security_sid_to_context(newsid, &context, &len);
++		if (rc) {
++			printk(KERN_WARNING "post_create:  sid_to_context "
++			       "failed, rc=%d (dev=%s ino=%ld)\n",
++			       -rc, inode->i_sb->s_id, inode->i_ino);
++			return rc;
++		}
++		down(&inode->i_sem);
++		rc = inode->i_op->setxattr(dentry,
++					   XATTR_NAME_SELINUX,
++					   context, len, 0);
++		up(&inode->i_sem);
++		kfree(context);
++		if (rc < 0) {
++			printk(KERN_WARNING "post_create:  setxattr failed, "
++			       "rc=%d (dev=%s ino=%ld)\n",
++			       -rc, inode->i_sb->s_id, inode->i_ino);
++			return rc;
++		}
++	}
++
++	return 0;
++}
++
++
++/* Hook functions begin here. */
++
++static int selinux_ptrace(struct task_struct *parent, struct task_struct *child)
++{
++	int rc;
++
++	rc = secondary_ops->ptrace(parent,child);
++	if (rc)
++		return rc;
++
++	return task_has_perm(parent, child, PROCESS__PTRACE);
++}
++
++static int selinux_capget(struct task_struct *target, kernel_cap_t *effective,
++                          kernel_cap_t *inheritable, kernel_cap_t *permitted)
++{
++	int error;
++
++	error = task_has_perm(current, target, PROCESS__GETCAP);
++	if (error)
++		return error;
++
++	return secondary_ops->capget(target, effective, inheritable, permitted);
++}
++
++static int selinux_capset_check(struct task_struct *target, kernel_cap_t *effective,
++                                kernel_cap_t *inheritable, kernel_cap_t *permitted)
++{
++	int error;
++
++	error = task_has_perm(current, target, PROCESS__SETCAP);
++	if (error)
++		return error;
++
++	return secondary_ops->capset_check(target, effective, inheritable, permitted);
++}
++
++static void selinux_capset_set(struct task_struct *target, kernel_cap_t *effective,
++                               kernel_cap_t *inheritable, kernel_cap_t *permitted)
++{
++	int error;
++
++	error = task_has_perm(current, target, PROCESS__SETCAP);
++	if (error)
++		return;
++
++	return secondary_ops->capset_set(target, effective, inheritable, permitted);
++}
++
++static int selinux_capable(struct task_struct *tsk, int cap)
++{
++	int rc;
++
++	rc = secondary_ops->capable(tsk, cap);
++	if (rc)
++		return rc;
++
++	return task_has_capability(tsk,cap);
++}
++
++static int selinux_sysctl(ctl_table *table, int op)
++{
++	int error = 0;
++	u32 av;
++	struct task_security_struct *tsec;
++	u32 tsid;
++	int rc;
++
++	tsec = current->security;
++
++	rc = selinux_proc_get_sid(table->de, (op == 001) ?
++	                          SECCLASS_DIR : SECCLASS_FILE, &tsid);
++	if (rc) {
++		/* Default to the well-defined sysctl SID. */
++		tsid = SECINITSID_SYSCTL;
++	}
++
++	/* The op values are "defined" in sysctl.c, thereby creating
++	 * a bad coupling between this module and sysctl.c */
++	if(op == 001) {
++		error = avc_has_perm(tsec->sid, tsid,
++				     SECCLASS_DIR, DIR__SEARCH, NULL, NULL);
++	} else {
++		av = 0;
++		if (op & 004)
++			av |= FILE__READ;
++		if (op & 002)
++			av |= FILE__WRITE;
++		if (av)
++			error = avc_has_perm(tsec->sid, tsid,
++					     SECCLASS_FILE, av, NULL, NULL);
++        }
++
++	return error;
++}
++
++static int selinux_quotactl(int cmds, int type, int id, struct super_block *sb)
++{
++	int rc = 0;
++
++	if (!sb)
++		return 0;
++
++	switch (cmds) {
++		case Q_SYNC:
++		case Q_QUOTAON:
++		case Q_QUOTAOFF:
++	        case Q_SETINFO:
++		case Q_SETQUOTA:
++			rc = superblock_has_perm(current,
++						 sb,
++						 FILESYSTEM__QUOTAMOD, NULL);
++			break;
++	        case Q_GETFMT:
++	        case Q_GETINFO:
++		case Q_GETQUOTA:
++			rc = superblock_has_perm(current,
++						 sb,
++						 FILESYSTEM__QUOTAGET, NULL);
++			break;
++		default:
++			rc = 0;  /* let the kernel handle invalid cmds */
++			break;
++	}
++	return rc;
++}
++
++static int selinux_quota_on(struct file *f)
++{
++	return file_has_perm(current, f, FILE__QUOTAON);;
++}
++
++static int selinux_syslog(int type)
++{
++	int rc;
++
++	rc = secondary_ops->syslog(type);
++	if (rc)
++		return rc;
++
++	switch (type) {
++		case 3:         /* Read last kernel messages */
++			rc = task_has_system(current, SYSTEM__SYSLOG_READ);
++			break;
++		case 6:         /* Disable logging to console */
++		case 7:         /* Enable logging to console */
++		case 8:		/* Set level of messages printed to console */
++			rc = task_has_system(current, SYSTEM__SYSLOG_CONSOLE);
++			break;
++		case 0:         /* Close log */
++		case 1:         /* Open log */
++		case 2:         /* Read from log */
++		case 4:         /* Read/clear last kernel messages */
++		case 5:         /* Clear ring buffer */
++		default:
++			rc = task_has_system(current, SYSTEM__SYSLOG_MOD);
++			break;
++	}
++	return rc;
++}
++
++/*
++ * Check that a process has enough memory to allocate a new virtual
++ * mapping. 0 means there is enough memory for the allocation to
++ * succeed and -ENOMEM implies there is not.
++ *
++ * We currently support three overcommit policies, which are set via the
++ * vm.overcommit_memory sysctl.  See Documentation/vm/overcommit-acounting
++ *
++ * Strict overcommit modes added 2002 Feb 26 by Alan Cox.
++ * Additional code 2002 Jul 20 by Robert Love.
++ */
++static int selinux_vm_enough_memory(long pages)
++{
++	unsigned long free, allowed;
++	int rc;
++	struct task_security_struct *tsec = current->security;
++
++	vm_acct_memory(pages);
++
++        /*
++	 * Sometimes we want to use more memory than we have
++	 */
++	if (sysctl_overcommit_memory == 1)
++		return 0;
++
++	if (sysctl_overcommit_memory == 0) {
++		free = get_page_cache_size();
++		free += nr_free_pages();
++		free += nr_swap_pages;
++
++		/*
++		 * Any slabs which are created with the
++		 * SLAB_RECLAIM_ACCOUNT flag claim to have contents
++		 * which are reclaimable, under pressure.  The dentry
++		 * cache and most inode caches should fall into this
++		 */
++		free += atomic_read(&slab_reclaim_pages);
++
++		/*
++		 * Leave the last 3% for privileged processes.
++		 * Don't audit the check, as it is applied to all processes
++		 * that allocate mappings.
++		 */
++		rc = secondary_ops->capable(current, CAP_SYS_ADMIN);
++		if (!rc) {
++			rc = avc_has_perm_noaudit(tsec->sid, tsec->sid,
++						  SECCLASS_CAPABILITY,
++						  CAP_TO_MASK(CAP_SYS_ADMIN),
++						  NULL, NULL);
++		}
++		if (rc)
++			free -= free / 32;
++
++		if (free > pages)
++			return 0;
++		vm_unacct_memory(pages);
++		return -ENOMEM;
++	}
++
++	allowed = totalram_pages * sysctl_overcommit_ratio / 100;
++	allowed += total_swap_pages;
++
++	if (atomic_read(&vm_committed_space) < allowed)
++		return 0;
++
++	vm_unacct_memory(pages);
++
++	return -ENOMEM;
++}
++
++static int selinux_netlink_send(struct sk_buff *skb)
++{
++	if (capable(CAP_NET_ADMIN))
++		cap_raise (NETLINK_CB (skb).eff_cap, CAP_NET_ADMIN);
++	else
++		NETLINK_CB(skb).eff_cap = 0;
++	return 0;
++}
++
++static int selinux_netlink_recv(struct sk_buff *skb)
++{
++	if (!cap_raised(NETLINK_CB(skb).eff_cap, CAP_NET_ADMIN))
++		return -EPERM;
++	return 0;
++}
++
++/* binprm security operations */
++
++static int selinux_bprm_alloc_security(struct linux_binprm *bprm)
++{
++	int rc;
++
++	/* Make sure that the secondary module doesn't use the
++	   bprm->security field, since we do not yet support chaining
++	   of multiple security structures on the field.  Neither
++	   the dummy nor the capability module use the field.  The owlsm
++	   module uses the field if CONFIG_OWLSM_FD is enabled. */
++	rc = secondary_ops->bprm_alloc_security(bprm);
++	if (rc)
++		return rc;
++	if (bprm->security) {
++		printk(KERN_WARNING "%s: no support yet for chaining on the "
++		       "security field by secondary modules.\n", __FUNCTION__);
++		/* Release the secondary module's security object. */
++		secondary_ops->bprm_free_security(bprm);
++		/* Unregister the secondary module to prevent problems
++		   with subsequent binprm hooks. This will revert to the
++		   original (dummy) module for the secondary operations. */
++		rc = security_ops->unregister_security("unknown", secondary_ops);
++		if (rc)
++			return rc;
++		printk(KERN_WARNING "%s: Unregistered the secondary security "
++		       "module.\n", __FUNCTION__);
++	}
++	bprm->security = NULL;
++	return 0;
++}
++
++static int selinux_bprm_set_security(struct linux_binprm *bprm)
++{
++	struct task_security_struct *tsec;
++	struct inode *inode = bprm->file->f_dentry->d_inode;
++	struct inode_security_struct *isec;
++	u32 newsid;
++	struct avc_audit_data ad;
++	int rc;
++
++	rc = secondary_ops->bprm_set_security(bprm);
++	if (rc)
++		return rc;
++
++	if (bprm->sh_bang || bprm->security)
++		/* The security field should already be set properly. */
++		return 0;
++
++	tsec = current->security;
++	isec = inode->i_security;
++
++	/* Default to the current task SID. */
++	bprm->security = (void *)tsec->sid;
++
++	/* Reset create SID on execve. */
++	tsec->create_sid = 0;
++
++	if (tsec->exec_sid) {
++		newsid = tsec->exec_sid;
++		/* Reset exec SID on execve. */
++		tsec->exec_sid = 0;
++	} else {
++		/* Check for a default transition on this program. */
++		rc = security_transition_sid(tsec->sid, isec->sid,
++		                             SECCLASS_PROCESS, &newsid);
++		if (rc)
++			return rc;
++	}
++
++	AVC_AUDIT_DATA_INIT(&ad, FS);
++	ad.u.fs.mnt = bprm->file->f_vfsmnt;
++	ad.u.fs.dentry = bprm->file->f_dentry;
++
++	if (bprm->file->f_vfsmnt->mnt_flags & MNT_NOSUID)
++		newsid = tsec->sid;
++
++        if (tsec->sid == newsid) {
++		rc = avc_has_perm(tsec->sid, isec->sid,
++				  SECCLASS_FILE, FILE__EXECUTE_NO_TRANS,
++				  &isec->avcr, &ad);
++		if (rc)
++			return rc;
++	} else {
++		/* Check permissions for the transition. */
++		rc = avc_has_perm(tsec->sid, newsid,
++				  SECCLASS_PROCESS, PROCESS__TRANSITION,
++				  NULL,
++				  &ad);
++		if (rc)
++			return rc;
++
++		rc = avc_has_perm(newsid, isec->sid,
++				  SECCLASS_FILE, FILE__ENTRYPOINT,
++				  &isec->avcr, &ad);
++		if (rc)
++			return rc;
++
++		/* Set the security field to the new SID. */
++		bprm->security = (void*) newsid;
++	}
++
++	return 0;
++}
++
++static int selinux_bprm_check_security (struct linux_binprm *bprm)
++{
++	return 0;
++}
++
++
++static int selinux_bprm_secureexec (struct linux_binprm *bprm)
++{
++	struct task_security_struct *tsec = current->security;
++	int atsecure = 0;
++
++	if (tsec->osid != tsec->sid) {
++		/* Enable secure mode for SIDs transitions unless
++		   the noatsecure permission is granted between
++		   the two SIDs, i.e. ahp returns 0. */
++		atsecure = avc_has_perm(tsec->osid, tsec->sid,
++					 SECCLASS_PROCESS,
++					 PROCESS__NOATSECURE, NULL, NULL);
++	}
++
++	/* Note that we must include the legacy uid/gid test below
++	   to retain it, as the new userland will simply use the
++	   value passed by AT_SECURE to decide whether to enable
++	   secure mode. */
++	return ( atsecure || current->euid != current->uid ||
++		current->egid != current->gid);
++}
++
++static void selinux_bprm_free_security(struct linux_binprm *bprm)
++{
++	/* Nothing to do - not dynamically allocated. */
++	return;
++}
++
++/* Derived from fs/exec.c:flush_old_files. */
++static inline void flush_unauthorized_files(struct files_struct * files)
++{
++	struct avc_audit_data ad;
++	struct file *file;
++	long j = -1;
++
++	AVC_AUDIT_DATA_INIT(&ad,FS);
++
++	spin_lock(&files->file_lock);
++	for (;;) {
++		unsigned long set, i;
++
++		j++;
++		i = j * __NFDBITS;
++		if (i >= files->max_fds || i >= files->max_fdset)
++			break;
++		set = files->open_fds->fds_bits[j];
++		if (!set)
++			continue;
++		spin_unlock(&files->file_lock);
++		for ( ; set ; i++,set >>= 1) {
++			if (set & 1) {
++				file = fget(i);
++				if (!file)
++					continue;
++				if (file_has_perm(current,
++						  file,
++						  file_to_av(file)))
++					sys_close(i);
++				fput(file);
++			}
++		}
++		spin_lock(&files->file_lock);
++
++	}
++	spin_unlock(&files->file_lock);
++}
++
++static void selinux_bprm_compute_creds(struct linux_binprm *bprm)
++{
++	struct task_security_struct *tsec, *psec;
++	u32 sid;
++	struct av_decision avd;
++	int rc;
++
++	secondary_ops->bprm_compute_creds(bprm);
++
++	tsec = current->security;
++
++	sid = (u32)bprm->security;
++	if (!sid)
++		sid = tsec->sid;
++
++	tsec->osid = tsec->sid;
++	if (tsec->sid != sid) {
++		/* Check for shared state.  If not ok, leave SID
++		   unchanged and kill. */
++		if ((atomic_read(&current->fs->count) > 1 ||
++		     atomic_read(&current->files->count) > 1 ||
++		     atomic_read(&current->sighand->count) > 1)) {
++			rc = avc_has_perm(tsec->sid, sid,
++					  SECCLASS_PROCESS, PROCESS__SHARE,
++					  NULL, NULL);
++			if (rc) {
++				force_sig_specific(SIGKILL, current);
++				return;
++			}
++		}
++
++		/* Check for ptracing, and update the task SID if ok.
++		   Otherwise, leave SID unchanged and kill. */
++		task_lock(current);
++		if (current->ptrace & PT_PTRACED) {
++			psec = current->parent->security;
++			rc = avc_has_perm_noaudit(psec->sid, sid,
++					  SECCLASS_PROCESS, PROCESS__PTRACE,
++					  NULL, &avd);
++			if (!rc)
++				tsec->sid = sid;
++			task_unlock(current);
++			avc_audit(psec->sid, sid, SECCLASS_PROCESS,
++				  PROCESS__PTRACE, &avd, rc, NULL);
++			if (rc) {
++				force_sig_specific(SIGKILL, current);
++				return;
++			}
++		} else {
++			tsec->sid = sid;
++			task_unlock(current);
++		}
++
++		/* Close files for which the new task SID is not authorized. */
++		flush_unauthorized_files(current->files);
++
++		/* Wake up the parent if it is waiting so that it can
++		   recheck wait permission to the new task SID. */
++		wake_up_interruptible(&current->parent->wait_chldexit);
++	}
++}
++
++/* superblock security operations */
++
++static int selinux_sb_alloc_security(struct super_block *sb)
++{
++	return superblock_alloc_security(sb);
++}
++
++static void selinux_sb_free_security(struct super_block *sb)
++{
++	superblock_free_security(sb);
++}
++
++static int selinux_sb_kern_mount(struct super_block *sb)
++{
++	struct avc_audit_data ad;
++	int rc;
++
++	rc = superblock_doinit(sb);
++	if (rc)
++		return rc;
++
++	AVC_AUDIT_DATA_INIT(&ad,FS);
++	ad.u.fs.dentry = sb->s_root;
++	return superblock_has_perm(current, sb, FILESYSTEM__MOUNT, &ad);
++}
++
++static int selinux_sb_statfs(struct super_block *sb)
++{
++	struct avc_audit_data ad;
++
++	AVC_AUDIT_DATA_INIT(&ad,FS);
++	ad.u.fs.dentry = sb->s_root;
++	return superblock_has_perm(current, sb, FILESYSTEM__GETATTR, &ad);
++}
++
++static int selinux_mount(char * dev_name,
++                         struct nameidata *nd,
++                         char * type,
++                         unsigned long flags,
++                         void * data)
++{
++	if (flags & MS_REMOUNT)
++		return superblock_has_perm(current, nd->mnt->mnt_sb,
++		                           FILESYSTEM__REMOUNT, NULL);
++	else
++		return dentry_has_perm(current, nd->mnt, nd->dentry,
++		                       FILE__MOUNTON);
++}
++
++static int selinux_umount(struct vfsmount *mnt, int flags)
++{
++	return superblock_has_perm(current,mnt->mnt_sb,
++	                           FILESYSTEM__UNMOUNT,NULL);
++}
++
++/* inode security operations */
++
++static int selinux_inode_alloc_security(struct inode *inode)
++{
++	return inode_alloc_security(inode);
++}
++
++static void selinux_inode_free_security(struct inode *inode)
++{
++	inode_free_security(inode);
++}
++
++static int selinux_inode_create(struct inode *dir, struct dentry *dentry, int mask)
++{
++	return may_create(dir, dentry, SECCLASS_FILE);
++}
++
++static void selinux_inode_post_create(struct inode *dir, struct dentry *dentry, int mask)
++{
++	post_create(dir, dentry);
++}
++
++static int selinux_inode_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
++{
++	int rc;
++
++	rc = secondary_ops->inode_link(old_dentry,dir,new_dentry);
++	if (rc)
++		return rc;
++	return may_link(dir, old_dentry, MAY_LINK);
++}
++
++static void selinux_inode_post_link(struct dentry *old_dentry, struct inode *inode, struct dentry *new_dentry)
++{
++	return;
++}
++
++static int selinux_inode_unlink(struct inode *dir, struct dentry *dentry)
++{
++	return may_link(dir, dentry, MAY_UNLINK);
++}
++
++static int selinux_inode_symlink(struct inode *dir, struct dentry *dentry, const char *name)
++{
++	return may_create(dir, dentry, SECCLASS_LNK_FILE);
++}
++
++static void selinux_inode_post_symlink(struct inode *dir, struct dentry *dentry, const char *name)
++{
++	post_create(dir, dentry);
++}
++
++static int selinux_inode_mkdir(struct inode *dir, struct dentry *dentry, int mask)
++{
++	return may_create(dir, dentry, SECCLASS_DIR);
++}
++
++static void selinux_inode_post_mkdir(struct inode *dir, struct dentry *dentry, int mask)
++{
++	post_create(dir, dentry);
++}
++
++static int selinux_inode_rmdir(struct inode *dir, struct dentry *dentry)
++{
++	return may_link(dir, dentry, MAY_RMDIR);
++}
++
++static int selinux_inode_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
++{
++	return may_create(dir, dentry, inode_mode_to_security_class(mode));
++}
++
++static void selinux_inode_post_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
++{
++	post_create(dir, dentry);
++}
++
++static int selinux_inode_rename(struct inode *old_inode, struct dentry *old_dentry,
++                                struct inode *new_inode, struct dentry *new_dentry)
++{
++	return may_rename(old_inode, old_dentry, new_inode, new_dentry);
++}
++
++static void selinux_inode_post_rename(struct inode *old_inode, struct dentry *old_dentry,
++                                      struct inode *new_inode, struct dentry *new_dentry)
++{
++	return;
++}
++
++static int selinux_inode_readlink(struct dentry *dentry)
++{
++	return dentry_has_perm(current, NULL, dentry, FILE__READ);
++}
++
++static int selinux_inode_follow_link(struct dentry *dentry, struct nameidata *nameidata)
++{
++	int rc;
++
++	rc = secondary_ops->inode_follow_link(dentry,nameidata);
++	if (rc)
++		return rc;
++	return dentry_has_perm(current, NULL, dentry, FILE__READ);
++}
++
++static int selinux_inode_permission(struct inode *inode, int mask)
++{
++	if (!mask) {
++		/* No permission to check.  Existence test. */
++		return 0;
++	}
++
++	return inode_has_perm(current, inode,
++			       file_mask_to_av(inode->i_mode, mask), NULL, NULL);
++}
++
++static int selinux_inode_setattr(struct dentry *dentry, struct iattr *iattr)
++{
++	if (iattr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID |
++			       ATTR_ATIME_SET | ATTR_MTIME_SET))
++		return dentry_has_perm(current, NULL, dentry, FILE__SETATTR);
++
++	return dentry_has_perm(current, NULL, dentry, FILE__WRITE);
++}
++
++static int selinux_inode_getattr(struct vfsmount *mnt, struct dentry *dentry)
++{
++	return dentry_has_perm(current, mnt, dentry, FILE__GETATTR);
++}
++
++static int selinux_inode_setxattr(struct dentry *dentry, char *name, void *value, size_t size, int flags)
++{
++	struct task_security_struct *tsec = current->security;
++	struct inode *inode = dentry->d_inode;
++	struct inode_security_struct *isec = inode->i_security;
++	struct superblock_security_struct *sbsec;
++	struct avc_audit_data ad;
++	u32 newsid;
++	int rc = 0;
++
++	if (strcmp(name, XATTR_NAME_SELINUX)) {
++		if (!strncmp(name, XATTR_SECURITY_PREFIX,
++			     sizeof XATTR_SECURITY_PREFIX - 1) &&
++		    !capable(CAP_SYS_ADMIN)) {
++			/* A different attribute in the security namespace.
++			   Restrict to administrator. */
++			return -EPERM;
++		}
++
++		/* Not an attribute we recognize, so just check the
++		   ordinary setattr permission. */
++		return dentry_has_perm(current, NULL, dentry, FILE__SETATTR);
++	}
++
++	AVC_AUDIT_DATA_INIT(&ad,FS);
++	ad.u.fs.dentry = dentry;
++
++	rc = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++			  FILE__RELABELFROM,
++			  &isec->avcr, &ad);
++	if (rc)
++		return rc;
++
++	rc = security_context_to_sid(value, size, &newsid);
++	if (rc)
++		return rc;
++
++	rc = avc_has_perm(tsec->sid, newsid, isec->sclass,
++			  FILE__RELABELTO, NULL, &ad);
++	if (rc)
++		return rc;
++
++	sbsec = inode->i_sb->s_security;
++	if (!sbsec)
++		return 0;
++
++	return avc_has_perm(newsid,
++			    sbsec->sid,
++			    SECCLASS_FILESYSTEM,
++			    FILESYSTEM__ASSOCIATE,
++			    NULL,
++			    &ad);
++}
++
++static void selinux_inode_post_setxattr(struct dentry *dentry, char *name,
++                                        void *value, size_t size, int flags)
++{
++	struct inode *inode = dentry->d_inode;
++	struct inode_security_struct *isec = inode->i_security;
++	u32 newsid;
++	int rc;
++
++	if (strcmp(name, XATTR_NAME_SELINUX)) {
++		/* Not an attribute we recognize, so nothing to do. */
++		return;
++	}
++
++	rc = security_context_to_sid(value, size, &newsid);
++	if (rc) {
++		printk(KERN_WARNING "%s:  unable to obtain SID for context "
++		       "%s, rc=%d\n", __FUNCTION__, (char*)value, -rc);
++		return;
++	}
++
++	isec->sid = newsid;
++	return;
++}
++
++static int selinux_inode_getxattr (struct dentry *dentry, char *name)
++{
++	return dentry_has_perm(current, NULL, dentry, FILE__GETATTR);
++}
++
++static int selinux_inode_listxattr (struct dentry *dentry)
++{
++	return dentry_has_perm(current, NULL, dentry, FILE__GETATTR);
++}
++
++static int selinux_inode_removexattr (struct dentry *dentry, char *name)
++{
++	if (strcmp(name, XATTR_NAME_SELINUX)) {
++		if (!strncmp(name, XATTR_SECURITY_PREFIX,
++			     sizeof XATTR_SECURITY_PREFIX - 1) &&
++		    !capable(CAP_SYS_ADMIN)) {
++			/* A different attribute in the security namespace.
++			   Restrict to administrator. */
++			return -EPERM;
++		}
++
++		/* Not an attribute we recognize, so just check the
++		   ordinary setattr permission. Might want a separate
++		   permission for removexattr. */
++		return dentry_has_perm(current, NULL, dentry, FILE__SETATTR);
++	}
++
++	/* No one is allowed to remove a SELinux security label.
++	   You can change the label, but all data must be labeled. */
++	return -EACCES;
++}
++
++static int selinux_inode_getsecurity(struct dentry *dentry, const char *name, void *buffer, size_t size)
++{
++	struct inode *inode = dentry->d_inode;
++	struct inode_security_struct *isec = inode->i_security;
++	char *context;
++	unsigned len;
++	int rc;
++
++	/* Permission check handled by selinux_inode_getxattr hook.*/
++
++	if (strcmp(name, XATTR_SELINUX_SUFFIX))
++		return -EOPNOTSUPP;
++
++	rc = security_sid_to_context(isec->sid, &context, &len);
++	if (rc)
++		return rc;
++
++	if (!buffer || !size) {
++		kfree(context);
++		return len;
++	}
++	if (size < len) {
++		kfree(context);
++		return -ERANGE;
++	}
++	memcpy(buffer, context, len);
++	kfree(context);
++	return len;
++}
++
++static int selinux_inode_setsecurity(struct dentry *dentry, const char *name,
++                                     const void *value, size_t size, int flags)
++{
++	struct inode *inode = dentry->d_inode;
++	struct inode_security_struct *isec = inode->i_security;
++	u32 newsid;
++	int rc;
++
++	if (strcmp(name, XATTR_SELINUX_SUFFIX))
++		return -EOPNOTSUPP;
++
++	if (!value || !size)
++		return -EACCES;
++
++	rc = security_context_to_sid((void*)value, size, &newsid);
++	if (rc)
++		return rc;
++
++	isec->sid = newsid;
++	return 0;
++}
++
++static int selinux_inode_listsecurity(struct dentry *dentry, char *buffer)
++{
++	const int len = sizeof(XATTR_NAME_SELINUX);
++	if (buffer)
++		memcpy(buffer, XATTR_NAME_SELINUX, len);
++	return len;
++}
++
++/* file security operations */
++
++static int selinux_file_permission(struct file *file, int mask)
++{
++	struct inode *inode = file->f_dentry->d_inode;
++
++	if (!mask) {
++		/* No permission to check.  Existence test. */
++		return 0;
++	}
++
++	/* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */
++	if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE))
++		mask |= MAY_APPEND;
++
++	return file_has_perm(current, file,
++			     file_mask_to_av(inode->i_mode, mask));
++}
++
++static int selinux_file_alloc_security(struct file *file)
++{
++	return file_alloc_security(file);
++}
++
++static void selinux_file_free_security(struct file *file)
++{
++	file_free_security(file);
++}
++
++static int selinux_file_ioctl(struct file *file, unsigned int cmd,
++			      unsigned long arg)
++{
++	int error = 0;
++
++	switch (cmd) {
++		case FIONREAD:
++		/* fall through */
++		case FIBMAP:
++		/* fall through */
++		case FIGETBSZ:
++		/* fall through */
++		case EXT2_IOC_GETFLAGS:
++		/* fall through */
++		case EXT2_IOC_GETVERSION:
++			error = file_has_perm(current, file, FILE__GETATTR);
++			break;
++
++		case EXT2_IOC_SETFLAGS:
++		/* fall through */
++		case EXT2_IOC_SETVERSION:
++			error = file_has_perm(current, file, FILE__SETATTR);
++			break;
++
++		/* sys_ioctl() checks */
++		case FIONBIO:
++		/* fall through */
++		case FIOASYNC:
++			error = file_has_perm(current, file, 0);
++			break;
++
++	        case KDSKBENT:
++	        case KDSKBSENT:
++		  	if (!capable(CAP_SYS_TTY_CONFIG))
++				error = -EPERM;
++			break;
++
++		/* default case assumes that the command will go
++		 * to the file's ioctl() function.
++		 */
++		default:
++			error = file_has_perm(current, file, FILE__IOCTL);
++
++	}
++	return error;
++}
++
++static int selinux_file_mmap(struct file *file, unsigned long prot, unsigned long flags)
++{
++	u32 av;
++
++	if (file) {
++		/* read access is always possible with a mapping */
++		av = FILE__READ;
++
++		/* write access only matters if the mapping is shared */
++		if ((flags & MAP_TYPE) == MAP_SHARED && (prot & PROT_WRITE))
++			av |= FILE__WRITE;
++
++		if (prot & PROT_EXEC)
++			av |= FILE__EXECUTE;
++
++		return file_has_perm(current, file, av);
++	}
++	return 0;
++}
++
++static int selinux_file_mprotect(struct vm_area_struct *vma,
++				 unsigned long prot)
++{
++	return selinux_file_mmap(vma->vm_file, prot, vma->vm_flags);
++}
++
++static int selinux_file_lock(struct file *file, unsigned int cmd)
++{
++	return file_has_perm(current, file, FILE__LOCK);
++}
++
++static int selinux_file_fcntl(struct file *file, unsigned int cmd,
++			      unsigned long arg)
++{
++	int err = 0;
++
++	switch (cmd) {
++	        case F_SETFL:
++			if (!file->f_dentry || !file->f_dentry->d_inode) {
++				err = -EINVAL;
++				break;
++			}
++
++			if ((file->f_flags & O_APPEND) && !(arg & O_APPEND)) {
++				err = file_has_perm(current, file,FILE__WRITE);
++				break;
++			}
++			/* fall through */
++	        case F_SETOWN:
++	        case F_SETSIG:
++	        case F_GETFL:
++	        case F_GETOWN:
++	        case F_GETSIG:
++			/* Just check FD__USE permission */
++			err = file_has_perm(current, file, 0);
++			break;
++		case F_GETLK:
++		case F_SETLK:
++	        case F_SETLKW:
++	        case F_GETLK64:
++		case F_SETLK64:
++	        case F_SETLKW64:
++			if (!file->f_dentry || !file->f_dentry->d_inode) {
++				err = -EINVAL;
++				break;
++			}
++			err = file_has_perm(current, file, FILE__LOCK);
++			break;
++	}
++
++	return err;
++}
++
++static int selinux_file_set_fowner(struct file *file)
++{
++	struct task_security_struct *tsec;
++	struct file_security_struct *fsec;
++
++	tsec = current->security;
++	fsec = file->f_security;
++	fsec->fown_sid = tsec->sid;
++
++	return 0;
++}
++
++static int selinux_file_send_sigiotask(struct task_struct *tsk,
++				       struct fown_struct *fown,
++				       int fd, int reason)
++{
++        struct file *file;
++	u32 perm;
++	struct task_security_struct *tsec;
++	struct file_security_struct *fsec;
++
++	/* struct fown_struct is never outside the context of a struct file */
++        file = (struct file *)((long)fown - offsetof(struct file,f_owner));
++
++	tsec = tsk->security;
++	fsec = file->f_security;
++
++	if (!fown->signum)
++		perm = signal_to_av(SIGIO); /* as per send_sigio_to_task */
++	else
++		perm = signal_to_av(fown->signum);
++
++	return avc_has_perm(fsec->fown_sid, tsec->sid,
++			    SECCLASS_PROCESS, perm, NULL, NULL);
++}
++
++static int selinux_file_receive(struct file *file)
++{
++	return file_has_perm(current, file, file_to_av(file));
++}
++
++/* task security operations */
++
++static int selinux_task_create(unsigned long clone_flags)
++{
++	return task_has_perm(current, current, PROCESS__FORK);
++}
++
++static int selinux_task_alloc_security(struct task_struct *tsk)
++{
++	struct task_security_struct *tsec1, *tsec2;
++	int rc;
++
++	tsec1 = current->security;
++
++	rc = task_alloc_security(tsk);
++	if (rc)
++		return rc;
++	tsec2 = tsk->security;
++
++	tsec2->osid = tsec1->osid;
++	tsec2->sid = tsec1->sid;
++
++	/* Retain the exec and create SIDs across fork */
++	tsec2->exec_sid = tsec1->exec_sid;
++	tsec2->create_sid = tsec1->create_sid;
++
++	return 0;
++}
++
++static void selinux_task_free_security(struct task_struct *tsk)
++{
++	task_free_security(tsk);
++}
++
++static int selinux_task_setuid(uid_t id0, uid_t id1, uid_t id2, int flags)
++{
++	/* Since setuid only affects the current process, and
++	   since the SELinux controls are not based on the Linux
++	   identity attributes, SELinux does not need to control
++	   this operation.  However, SELinux does control the use
++	   of the CAP_SETUID and CAP_SETGID capabilities using the
++	   capable hook. */
++	return 0;
++}
++
++static int selinux_task_post_setuid(uid_t id0, uid_t id1, uid_t id2, int flags)
++{
++	return secondary_ops->task_post_setuid(id0,id1,id2,flags);
++}
++
++static int selinux_task_setgid(gid_t id0, gid_t id1, gid_t id2, int flags)
++{
++	/* See the comment for setuid above. */
++	return 0;
++}
++
++static int selinux_task_setpgid(struct task_struct *p, pid_t pgid)
++{
++	return task_has_perm(current, p, PROCESS__SETPGID);
++}
++
++static int selinux_task_getpgid(struct task_struct *p)
++{
++	return task_has_perm(current, p, PROCESS__GETPGID);
++}
++
++static int selinux_task_getsid(struct task_struct *p)
++{
++	return task_has_perm(current, p, PROCESS__GETSESSION);
++}
++
++static int selinux_task_setgroups(int gidsetsize, gid_t *grouplist)
++{
++	/* See the comment for setuid above. */
++	return 0;
++}
++
++static int selinux_task_setnice(struct task_struct *p, int nice)
++{
++	return task_has_perm(current,p, PROCESS__SETSCHED);
++}
++
++static int selinux_task_setrlimit(unsigned int resource, struct rlimit *new_rlim)
++{
++	/* SELinux does not currently provide a process
++	   resource limit policy based on security contexts.
++	   It does control the use of the CAP_SYS_RESOURCE capability
++	   using the capable hook. */
++	return 0;
++}
++
++static int selinux_task_setscheduler(struct task_struct *p, int policy, struct sched_param *lp)
++{
++	struct task_security_struct *tsec1, *tsec2;
++
++	tsec1 = current->security;
++	tsec2 = p->security;
++
++	/* No auditing from the setscheduler hook, since the runqueue lock
++	   is held and the system will deadlock if we try to log an audit
++	   message. */
++	return avc_has_perm_noaudit(tsec1->sid, tsec2->sid,
++				    SECCLASS_PROCESS, PROCESS__SETSCHED,
++				    &tsec2->avcr, NULL);
++}
++
++static int selinux_task_getscheduler(struct task_struct *p)
++{
++	return task_has_perm(current, p, PROCESS__GETSCHED);
++}
++
++static int selinux_task_kill(struct task_struct *p, struct siginfo *info, int sig)
++{
++	u32 perm;
++
++	if (info && ((unsigned long)info == 1 ||
++	             (unsigned long)info == 2 || SI_FROMKERNEL(info)))
++		return 0;
++
++	if (!sig)
++		perm = PROCESS__SIGNULL; /* null signal; existence test */
++	else
++		perm = signal_to_av(sig);
++
++	return task_has_perm(current, p, perm);
++}
++
++static int selinux_task_prctl(int option,
++			      unsigned long arg2,
++			      unsigned long arg3,
++			      unsigned long arg4,
++			      unsigned long arg5)
++{
++	/* The current prctl operations do not appear to require
++	   any SELinux controls since they merely observe or modify
++	   the state of the current process. */
++	return 0;
++}
++
++static int selinux_task_wait(struct task_struct *p)
++{
++	u32 perm;
++
++	perm = signal_to_av(p->exit_signal);
++
++	return task_has_perm(p, current, perm);
++}
++
++static void selinux_task_reparent_to_init(struct task_struct *p)
++{
++  	struct task_security_struct *tsec;
++
++	secondary_ops->task_reparent_to_init(p);
++
++	tsec = p->security;
++	tsec->osid = tsec->sid;
++	tsec->sid = SECINITSID_KERNEL;
++	return;
++}
++
++static void selinux_task_to_inode(struct task_struct *p,
++				  struct inode *inode)
++{
++	struct task_security_struct *tsec = p->security;
++	struct inode_security_struct *isec = inode->i_security;
++
++	isec->sid = tsec->sid;
++	isec->initialized = 1;
++	return;
++}
++
++#ifdef CONFIG_SECURITY_NETWORK
++
++/* socket security operations */
++static int socket_has_perm(struct task_struct *task, struct socket *sock,
++			   u32 perms)
++{
++	struct inode_security_struct *isec;
++	struct task_security_struct *tsec;
++	struct avc_audit_data ad;
++	int err;
++
++	tsec = task->security;
++	isec = SOCK_INODE(sock)->i_security;
++
++	AVC_AUDIT_DATA_INIT(&ad,NET);
++	ad.u.net.sk = sock->sk;
++	err = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++			   perms, &isec->avcr, &ad);
++
++	return err;
++}
++
++static int selinux_socket_create(int family, int type, int protocol)
++{
++	int err;
++	struct task_security_struct *tsec;
++
++	tsec = current->security;
++
++	err = avc_has_perm(tsec->sid, tsec->sid,
++			   socket_type_to_security_class(family, type),
++			   SOCKET__CREATE, NULL, NULL);
++
++	return err;
++}
++
++static void selinux_socket_post_create(struct socket *sock, int family, int type, int protocol)
++{
++	int err;
++	struct inode_security_struct *isec;
++	struct task_security_struct *tsec;
++
++	err = inode_doinit(SOCK_INODE(sock));
++	if (err < 0)
++		return;
++	isec = SOCK_INODE(sock)->i_security;
++
++	tsec = current->security;
++	isec->sclass = socket_type_to_security_class(family, type);
++	isec->sid = tsec->sid;
++
++	return;
++}
++
++/* Range of port numbers used to automatically bind.
++   Need to determine whether we should perform a name_bind
++   permission check between the socket and the port number. */
++#define ip_local_port_range_0 sysctl_local_port_range[0]
++#define ip_local_port_range_1 sysctl_local_port_range[1]
++
++static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
++{
++	int err;
++
++	err = socket_has_perm(current, sock, SOCKET__BIND);
++	if (err)
++		return err;
++
++	/*
++	 * If PF_INET, check name_bind permission for the port.
++	 */
++	if (sock->sk->sk_family == PF_INET) {
++		struct inode_security_struct *isec;
++		struct task_security_struct *tsec;
++		struct avc_audit_data ad;
++		struct sockaddr_in *addr = (struct sockaddr_in *)address;
++		unsigned short snum = ntohs(addr->sin_port);
++		struct sock *sk = sock->sk;
++		u32 sid;
++
++		tsec = current->security;
++		isec = SOCK_INODE(sock)->i_security;
++
++		if (snum&&(snum < max(PROT_SOCK,ip_local_port_range_0) ||
++			   snum > ip_local_port_range_1)) {
++			err = security_port_sid(sk->sk_family, sk->sk_type,
++						sk->sk_protocol, snum, &sid);
++			if (err)
++				return err;
++			AVC_AUDIT_DATA_INIT(&ad,NET);
++			ad.u.net.port = snum;
++			err = avc_has_perm(isec->sid, sid,
++					   isec->sclass,
++					   SOCKET__NAME_BIND, NULL, &ad);
++			if (err)
++				return err;
++		}
++	}
++
++	return 0;
++}
++
++static int selinux_socket_connect(struct socket *sock, struct sockaddr *address, int addrlen)
++{
++	int err;
++	struct sock *sk = sock->sk;
++	struct avc_audit_data ad;
++	struct task_security_struct *tsec;
++	struct inode_security_struct *isec;
++
++	isec = SOCK_INODE(sock)->i_security;
++
++	tsec = current->security;
++
++	AVC_AUDIT_DATA_INIT(&ad, NET);
++	ad.u.net.sk = sk;
++	err = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++			   SOCKET__CONNECT, &isec->avcr, &ad);
++	if (err)
++		return err;
++
++	return 0;
++}
++
++static int selinux_socket_listen(struct socket *sock, int backlog)
++{
++	int err;
++	struct task_security_struct *tsec;
++	struct inode_security_struct *isec;
++	struct avc_audit_data ad;
++
++	tsec = current->security;
++
++	isec = SOCK_INODE(sock)->i_security;
++
++	AVC_AUDIT_DATA_INIT(&ad, NET);
++	ad.u.net.sk = sock->sk;
++
++	err = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++			   SOCKET__LISTEN, &isec->avcr, &ad);
++	if (err)
++		return err;
++
++	return 0;
++}
++
++static int selinux_socket_accept(struct socket *sock, struct socket *newsock)
++{
++	int err;
++	struct task_security_struct *tsec;
++	struct inode_security_struct *isec;
++	struct inode_security_struct *newisec;
++	struct avc_audit_data ad;
++
++	tsec = current->security;
++
++	isec = SOCK_INODE(sock)->i_security;
++
++	AVC_AUDIT_DATA_INIT(&ad, NET);
++	ad.u.net.sk = sock->sk;
++
++	err = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++			   SOCKET__ACCEPT, &isec->avcr, &ad);
++	if (err)
++		return err;
++
++	err = inode_doinit(SOCK_INODE(newsock));
++	if (err < 0)
++		return err;
++	newisec = SOCK_INODE(newsock)->i_security;
++
++	newisec->sclass = isec->sclass;
++	newisec->sid = isec->sid;
++
++	return 0;
++}
++
++static int selinux_socket_sendmsg(struct socket *sock, struct msghdr *msg,
++ 				  int size)
++{
++	struct task_security_struct *tsec;
++	struct inode_security_struct *isec;
++	struct avc_audit_data ad;
++	struct sock *sk;
++	int err;
++
++	isec = SOCK_INODE(sock)->i_security;
++
++	tsec = current->security;
++
++	sk = sock->sk;
++
++	AVC_AUDIT_DATA_INIT(&ad, NET);
++	ad.u.net.sk = sk;
++	err = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++			   SOCKET__WRITE, &isec->avcr, &ad);
++	if (err)
++		return err;
++
++	return 0;
++}
++
++static int selinux_socket_recvmsg(struct socket *sock, struct msghdr *msg,
++				  int size, int flags)
++{
++	struct inode_security_struct *isec;
++	struct task_security_struct *tsec;
++	struct avc_audit_data ad;
++	int err;
++
++	isec = SOCK_INODE(sock)->i_security;
++	tsec = current->security;
++
++	AVC_AUDIT_DATA_INIT(&ad,NET);
++	ad.u.net.sk = sock->sk;
++	err = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++			   SOCKET__READ, &isec->avcr, &ad);
++	if (err)
++		return err;
++
++	return 0;
++}
++
++static int selinux_socket_getsockname(struct socket *sock)
++{
++	struct inode_security_struct *isec;
++	struct task_security_struct *tsec;
++	struct avc_audit_data ad;
++	int err;
++
++	tsec = current->security;
++	isec = SOCK_INODE(sock)->i_security;
++
++	AVC_AUDIT_DATA_INIT(&ad,NET);
++	ad.u.net.sk = sock->sk;
++	err = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++			   SOCKET__GETATTR, &isec->avcr, &ad);
++	if (err)
++		return err;
++
++	return 0;
++}
++
++static int selinux_socket_getpeername(struct socket *sock)
++{
++	struct inode_security_struct *isec;
++	struct task_security_struct *tsec;
++	struct avc_audit_data ad;
++	int err;
++
++	tsec = current->security;
++	isec = SOCK_INODE(sock)->i_security;
++
++	AVC_AUDIT_DATA_INIT(&ad,NET);
++	ad.u.net.sk = sock->sk;
++	err = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++			   SOCKET__GETATTR, &isec->avcr, &ad);
++	if (err)
++		return err;
++
++	return 0;
++}
++
++static int selinux_socket_setsockopt(struct socket *sock,int level,int optname)
++{
++	return socket_has_perm(current, sock, SOCKET__SETOPT);
++}
++
++static int selinux_socket_getsockopt(struct socket *sock, int level,
++				     int optname)
++{
++	return socket_has_perm(current, sock, SOCKET__GETOPT);
++}
++
++static int selinux_socket_shutdown(struct socket *sock, int how)
++{
++	return socket_has_perm(current, sock, SOCKET__SHUTDOWN);
++}
++
++static int selinux_socket_unix_stream_connect(struct socket *sock,
++					      struct socket *other,
++					      struct sock *newsk)
++{
++	struct inode_security_struct *isec;
++	struct inode_security_struct *other_isec;
++	struct avc_audit_data ad;
++	int err;
++
++	isec = SOCK_INODE(sock)->i_security;
++	other_isec = SOCK_INODE(other)->i_security;
++
++	AVC_AUDIT_DATA_INIT(&ad,NET);
++	ad.u.net.sk = other->sk;
++
++	err = avc_has_perm(isec->sid, other_isec->sid,
++			   isec->sclass,
++			   UNIX_STREAM_SOCKET__CONNECTTO,
++			   &other_isec->avcr, &ad);
++	if (err)
++		return err;
++
++	return 0;
++}
++
++static int selinux_socket_unix_may_send(struct socket *sock,
++					struct socket *other)
++{
++	struct inode_security_struct *isec;
++	struct inode_security_struct *other_isec;
++	struct avc_audit_data ad;
++	int err;
++
++	isec = SOCK_INODE(sock)->i_security;
++	other_isec = SOCK_INODE(other)->i_security;
++
++	AVC_AUDIT_DATA_INIT(&ad,NET);
++	ad.u.net.sk = other->sk;
++
++	err = avc_has_perm(isec->sid, other_isec->sid,
++			   isec->sclass,
++			   SOCKET__SENDTO,
++			   &other_isec->avcr, &ad);
++	if (err)
++		return err;
++
++	return 0;
++}
++
++#endif
++
++static int ipc_alloc_security(struct task_struct *task,
++			      struct kern_ipc_perm *perm,
++			      u16 sclass)
++{
++	struct task_security_struct *tsec = task->security;
++	struct ipc_security_struct *isec;
++
++	isec = kmalloc(sizeof(struct ipc_security_struct), GFP_KERNEL);
++	if (!isec)
++		return -ENOMEM;
++
++	memset(isec, 0, sizeof(struct ipc_security_struct));
++	isec->magic = SELINUX_MAGIC;
++	isec->sclass = sclass;
++	isec->ipc_perm = perm;
++	if (tsec) {
++		isec->sid = tsec->sid;
++	} else {
++		isec->sid = SECINITSID_UNLABELED;
++	}
++	perm->security = isec;
++
++	return 0;
++}
++
++static void ipc_free_security(struct kern_ipc_perm *perm)
++{
++	struct ipc_security_struct *isec = perm->security;
++	if (!isec || isec->magic != SELINUX_MAGIC)
++		return;
++
++	perm->security = NULL;
++	kfree(isec);
++}
++
++static int msg_msg_alloc_security(struct msg_msg *msg)
++{
++	struct msg_security_struct *msec;
++
++	msec = kmalloc(sizeof(struct msg_security_struct), GFP_KERNEL);
++	if (!msec)
++		return -ENOMEM;
++
++	memset(msec, 0, sizeof(struct msg_security_struct));
++	msec->magic = SELINUX_MAGIC;
++	msec->msg = msg;
++	msec->sid = SECINITSID_UNLABELED;
++	msg->security = msec;
++
++	return 0;
++}
++
++static void msg_msg_free_security(struct msg_msg *msg)
++{
++	struct msg_security_struct *msec = msg->security;
++	if (!msec || msec->magic != SELINUX_MAGIC)
++		return;
++
++	msg->security = NULL;
++	kfree(msec);
++}
++
++static int ipc_has_perm(struct kern_ipc_perm *ipc_perms,
++			u16 sclass, u32 perms)
++{
++	struct task_security_struct *tsec;
++	struct ipc_security_struct *isec;
++	struct avc_audit_data ad;
++
++	tsec = current->security;
++	isec = ipc_perms->security;
++
++	AVC_AUDIT_DATA_INIT(&ad, IPC);
++	ad.u.ipc_id = ipc_perms->key;
++
++	return avc_has_perm(tsec->sid, isec->sid, sclass,
++			    perms, &isec->avcr, &ad);
++}
++
++static int selinux_msg_msg_alloc_security(struct msg_msg *msg)
++{
++	return msg_msg_alloc_security(msg);
++}
++
++static void selinux_msg_msg_free_security(struct msg_msg *msg)
++{
++	return msg_msg_free_security(msg);
++}
++
++/* message queue security operations */
++static int selinux_msg_queue_alloc_security(struct msg_queue *msq)
++{
++	struct task_security_struct *tsec;
++	struct ipc_security_struct *isec;
++	struct avc_audit_data ad;
++	int rc;
++
++	rc = ipc_alloc_security(current, &msq->q_perm, SECCLASS_MSGQ);
++	if (rc)
++		return rc;
++
++	tsec = current->security;
++	isec = msq->q_perm.security;
++
++	AVC_AUDIT_DATA_INIT(&ad, IPC);
++ 	ad.u.ipc_id = msq->q_perm.key;
++
++	rc = avc_has_perm(tsec->sid, isec->sid, SECCLASS_MSGQ,
++			  MSGQ__CREATE, &isec->avcr, &ad);
++	if (rc) {
++		ipc_free_security(&msq->q_perm);
++		return rc;
++	}
++	return 0;
++}
++
++static void selinux_msg_queue_free_security(struct msg_queue *msq)
++{
++	ipc_free_security(&msq->q_perm);
++}
++
++static int selinux_msg_queue_associate(struct msg_queue *msq, int msqflg)
++{
++	struct task_security_struct *tsec;
++	struct ipc_security_struct *isec;
++	struct avc_audit_data ad;
++
++	tsec = current->security;
++	isec = msq->q_perm.security;
++
++	AVC_AUDIT_DATA_INIT(&ad, IPC);
++	ad.u.ipc_id = msq->q_perm.key;
++
++	return avc_has_perm(tsec->sid, isec->sid, SECCLASS_MSGQ,
++			    MSGQ__ASSOCIATE, &isec->avcr, &ad);
++}
++
++static int selinux_msg_queue_msgctl(struct msg_queue *msq, int cmd)
++{
++	int err;
++	int perms;
++
++	switch(cmd) {
++	case IPC_INFO:
++	case MSG_INFO:
++		/* No specific object, just general system-wide information. */
++		return task_has_system(current, SYSTEM__IPC_INFO);
++	case IPC_STAT:
++	case MSG_STAT:
++		perms = MSGQ__GETATTR | MSGQ__ASSOCIATE;
++		break;
++	case IPC_SET:
++		perms = MSGQ__SETATTR;
++		break;
++	case IPC_RMID:
++		perms = MSGQ__DESTROY;
++		break;
++	default:
++		return 0;
++	}
++
++	err = ipc_has_perm(&msq->q_perm, SECCLASS_MSGQ, perms);
++	return err;
++}
++
++static int selinux_msg_queue_msgsnd(struct msg_queue *msq, struct msg_msg *msg, int msqflg)
++{
++	struct task_security_struct *tsec;
++	struct ipc_security_struct *isec;
++	struct msg_security_struct *msec;
++	struct avc_audit_data ad;
++	int rc;
++
++	tsec = current->security;
++	isec = msq->q_perm.security;
++	msec = msg->security;
++
++	/*
++	 * First time through, need to assign label to the message
++	 */
++	if (msec->sid == SECINITSID_UNLABELED) {
++		/*
++		 * Compute new sid based on current process and
++		 * message queue this message will be stored in
++		 */
++		rc = security_transition_sid(tsec->sid,
++					     isec->sid,
++					     SECCLASS_MSG,
++					     &msec->sid);
++		if (rc)
++			return rc;
++	}
++
++	AVC_AUDIT_DATA_INIT(&ad, IPC);
++	ad.u.ipc_id = msq->q_perm.key;
++
++	/* Can this process write to the queue? */
++	rc = avc_has_perm(tsec->sid, isec->sid, SECCLASS_MSGQ,
++			  MSGQ__WRITE, &isec->avcr, &ad);
++	if (!rc)
++		/* Can this process send the message */
++		rc = avc_has_perm(tsec->sid, msec->sid,
++				  SECCLASS_MSG, MSG__SEND,
++				  &msec->avcr, &ad);
++	if (!rc)
++		/* Can the message be put in the queue? */
++		rc = avc_has_perm(msec->sid, isec->sid,
++				  SECCLASS_MSGQ, MSGQ__ENQUEUE,
++				  &isec->avcr, &ad);
++
++	return rc;
++}
++
++static int selinux_msg_queue_msgrcv(struct msg_queue *msq, struct msg_msg *msg,
++				    struct task_struct *target,
++				    long type, int mode)
++{
++	struct task_security_struct *tsec;
++	struct ipc_security_struct *isec;
++	struct msg_security_struct *msec;
++	struct avc_audit_data ad;
++	int rc;
++
++	tsec = target->security;
++	isec = msq->q_perm.security;
++	msec = msg->security;
++
++	AVC_AUDIT_DATA_INIT(&ad, IPC);
++ 	ad.u.ipc_id = msq->q_perm.key;
++
++	rc = avc_has_perm(tsec->sid, isec->sid,
++			  SECCLASS_MSGQ, MSGQ__READ,
++			  &isec->avcr, &ad);
++	if (!rc)
++		rc = avc_has_perm(tsec->sid, msec->sid,
++				  SECCLASS_MSG, MSG__RECEIVE,
++				  &msec->avcr, &ad);
++	return rc;
++}
++
++/* Shared Memory security operations */
++static int selinux_shm_alloc_security(struct shmid_kernel *shp)
++{
++	struct task_security_struct *tsec;
++	struct ipc_security_struct *isec;
++	struct avc_audit_data ad;
++	int rc;
++
++	rc = ipc_alloc_security(current, &shp->shm_perm, SECCLASS_SHM);
++	if (rc)
++		return rc;
++
++	tsec = current->security;
++	isec = shp->shm_perm.security;
++
++	AVC_AUDIT_DATA_INIT(&ad, IPC);
++ 	ad.u.ipc_id = shp->shm_perm.key;
++
++	rc = avc_has_perm(tsec->sid, isec->sid, SECCLASS_SHM,
++			  SHM__CREATE, &isec->avcr, &ad);
++	if (rc) {
++		ipc_free_security(&shp->shm_perm);
++		return rc;
++	}
++	return 0;
++}
++
++static void selinux_shm_free_security(struct shmid_kernel *shp)
++{
++	ipc_free_security(&shp->shm_perm);
++}
++
++static int selinux_shm_associate(struct shmid_kernel *shp, int shmflg)
++{
++	struct task_security_struct *tsec;
++	struct ipc_security_struct *isec;
++	struct avc_audit_data ad;
++
++	tsec = current->security;
++	isec = shp->shm_perm.security;
++
++	AVC_AUDIT_DATA_INIT(&ad, IPC);
++	ad.u.ipc_id = shp->shm_perm.key;
++
++	return avc_has_perm(tsec->sid, isec->sid, SECCLASS_SHM,
++			    SHM__ASSOCIATE, &isec->avcr, &ad);
++}
++
++/* Note, at this point, shp is locked down */
++static int selinux_shm_shmctl(struct shmid_kernel *shp, int cmd)
++{
++	int perms;
++	int err;
++
++	switch(cmd) {
++	case IPC_INFO:
++	case SHM_INFO:
++		/* No specific object, just general system-wide information. */
++		return task_has_system(current, SYSTEM__IPC_INFO);
++	case IPC_STAT:
++	case SHM_STAT:
++		perms = SHM__GETATTR | SHM__ASSOCIATE;
++		break;
++	case IPC_SET:
++		perms = SHM__SETATTR;
++		break;
++	case SHM_LOCK:
++	case SHM_UNLOCK:
++		perms = SHM__LOCK;
++		break;
++	case IPC_RMID:
++		perms = SHM__DESTROY;
++		break;
++	default:
++		return 0;
++	}
++
++	err = ipc_has_perm(&shp->shm_perm, SECCLASS_SHM, perms);
++	return err;
++}
++
++static int selinux_shm_shmat(struct shmid_kernel *shp,
++			     char *shmaddr, int shmflg)
++{
++	u32 perms;
++
++	if (shmflg & SHM_RDONLY)
++		perms = SHM__READ;
++	else
++		perms = SHM__READ | SHM__WRITE;
++
++	return ipc_has_perm(&shp->shm_perm, SECCLASS_SHM, perms);
++}
++
++/* Semaphore security operations */
++static int selinux_sem_alloc_security(struct sem_array *sma)
++{
++	struct task_security_struct *tsec;
++	struct ipc_security_struct *isec;
++	struct avc_audit_data ad;
++	int rc;
++
++	rc = ipc_alloc_security(current, &sma->sem_perm, SECCLASS_SEM);
++	if (rc)
++		return rc;
++
++	tsec = current->security;
++	isec = sma->sem_perm.security;
++
++	AVC_AUDIT_DATA_INIT(&ad, IPC);
++ 	ad.u.ipc_id = sma->sem_perm.key;
++
++	rc = avc_has_perm(tsec->sid, isec->sid, SECCLASS_SEM,
++			  SEM__CREATE, &isec->avcr, &ad);
++	if (rc) {
++		ipc_free_security(&sma->sem_perm);
++		return rc;
++	}
++	return 0;
++}
++
++static void selinux_sem_free_security(struct sem_array *sma)
++{
++	ipc_free_security(&sma->sem_perm);
++}
++
++static int selinux_sem_associate(struct sem_array *sma, int semflg)
++{
++	struct task_security_struct *tsec;
++	struct ipc_security_struct *isec;
++	struct avc_audit_data ad;
++
++	tsec = current->security;
++	isec = sma->sem_perm.security;
++
++	AVC_AUDIT_DATA_INIT(&ad, IPC);
++	ad.u.ipc_id = sma->sem_perm.key;
++
++	return avc_has_perm(tsec->sid, isec->sid, SECCLASS_SEM,
++			    SEM__ASSOCIATE, &isec->avcr, &ad);
++}
++
++/* Note, at this point, sma is locked down */
++static int selinux_sem_semctl(struct sem_array *sma, int cmd)
++{
++	int err;
++	u32 perms;
++
++	switch(cmd) {
++	case IPC_INFO:
++	case SEM_INFO:
++		/* No specific object, just general system-wide information. */
++		return task_has_system(current, SYSTEM__IPC_INFO);
++	case GETPID:
++	case GETNCNT:
++	case GETZCNT:
++		perms = SEM__GETATTR;
++		break;
++	case GETVAL:
++	case GETALL:
++		perms = SEM__READ;
++		break;
++	case SETVAL:
++	case SETALL:
++		perms = SEM__WRITE;
++		break;
++	case IPC_RMID:
++		perms = SEM__DESTROY;
++		break;
++	case IPC_SET:
++		perms = SEM__SETATTR;
++		break;
++	case IPC_STAT:
++	case SEM_STAT:
++		perms = SEM__GETATTR | SEM__ASSOCIATE;
++		break;
++	default:
++		return 0;
++	}
++
++	err = ipc_has_perm(&sma->sem_perm, SECCLASS_SEM, perms);
++	return err;
++}
++
++static int selinux_sem_semop(struct sem_array *sma,
++			     struct sembuf *sops, unsigned nsops, int alter)
++{
++	u32 perms;
++
++	if (alter)
++		perms = SEM__READ | SEM__WRITE;
++	else
++		perms = SEM__READ;
++
++	return ipc_has_perm(&sma->sem_perm, SECCLASS_SEM, perms);
++}
++
++static int selinux_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
++{
++	struct ipc_security_struct *isec = ipcp->security;
++	u16 sclass = SECCLASS_IPC;
++	u32 av = 0;
++
++	if (isec && isec->magic == SELINUX_MAGIC)
++		sclass = isec->sclass;
++
++	av = 0;
++	if (flag & S_IRUGO)
++		av |= IPC__UNIX_READ;
++	if (flag & S_IWUGO)
++		av |= IPC__UNIX_WRITE;
++
++	if (av == 0)
++		return 0;
++
++	return ipc_has_perm(ipcp, sclass, av);
++}
++
++/* module stacking operations */
++int selinux_register_security (const char *name, struct security_operations *ops)
++{
++	if (secondary_ops != original_ops) {
++		printk(KERN_INFO "%s:  There is already a secondary security "
++		       "module registered.\n", __FUNCTION__);
++		return -EINVAL;
++ 	}
++
++	secondary_ops = ops;
++
++	printk(KERN_INFO "%s:  Registering secondary module %s\n",
++	       __FUNCTION__,
++	       name);
++
++	return 0;
++}
++
++int selinux_unregister_security (const char *name, struct security_operations *ops)
++{
++	if (ops != secondary_ops) {
++		printk (KERN_INFO "%s:  trying to unregister a security module "
++		        "that is not registered.\n", __FUNCTION__);
++		return -EINVAL;
++	}
++
++	secondary_ops = original_ops;
++
++	return 0;
++}
++
++static void selinux_d_instantiate (struct dentry *dentry, struct inode *inode)
++{
++	if (inode)
++		inode_doinit_with_dentry(inode, dentry);
++}
++
++static int selinux_getprocattr(struct task_struct *p,
++			       char *name, void *value, size_t size)
++{
++	struct task_security_struct *tsec;
++	u32 sid;
++	char *context;
++	size_t len;
++	int error;
++
++	if (current != p) {
++		error = task_has_perm(current, p, PROCESS__GETATTR);
++		if (error)
++			return error;
++	}
++
++	if (!size)
++		return -ERANGE;
++
++	tsec = p->security;
++
++	if (!strcmp(name, "current"))
++		sid = tsec->sid;
++	else if (!strcmp(name, "prev"))
++		sid = tsec->osid;
++	else if (!strcmp(name, "exec"))
++		sid = tsec->exec_sid;
++	else if (!strcmp(name, "fscreate"))
++		sid = tsec->create_sid;
++	else
++		return -EINVAL;
++
++	if (!sid)
++		return 0;
++
++	error = security_sid_to_context(sid, &context, &len);
++	if (error)
++		return error;
++	if (len > size) {
++		kfree(context);
++		return -ERANGE;
++	}
++	memcpy(value, context, len);
++	kfree(context);
++	return len;
++}
++
++static int selinux_setprocattr(struct task_struct *p,
++			       char *name, void *value, size_t size)
++{
++	struct task_security_struct *tsec;
++	u32 sid = 0;
++	int error;
++
++	if (current != p || !strcmp(name, "current")) {
++		/* SELinux only allows a process to change its own
++		   security attributes, and it only allows the process
++		   current SID to change via exec. */
++		return -EACCES;
++	}
++
++	/*
++	 * Basic control over ability to set these attributes at all.
++	 * current == p, but we'll pass them separately in case the
++	 * above restriction is ever removed.
++	 */
++	if (!strcmp(name, "exec"))
++		error = task_has_perm(current, p, PROCESS__SETEXEC);
++	else if (!strcmp(name, "fscreate"))
++		error = task_has_perm(current, p, PROCESS__SETFSCREATE);
++	else
++		error = -EINVAL;
++	if (error)
++		return error;
++
++	/* Obtain a SID for the context, if one was specified. */
++	if (size) {
++		int error;
++		error = security_context_to_sid(value, size, &sid);
++		if (error)
++			return error;
++	}
++
++	/* Permission checking based on the specified context is
++	   performed during the actual operation (execve,
++	   open/mkdir/...), when we know the full context of the
++	   operation.  See selinux_bprm_set_security for the execve
++	   checks and may_create for the file creation checks. The
++	   operation will then fail if the context is not permitted. */
++	tsec = p->security;
++	if (!strcmp(name, "exec"))
++		tsec->exec_sid = sid;
++	else if (!strcmp(name, "fscreate"))
++		tsec->create_sid = sid;
++	else
++		return -EINVAL;
++
++	return size;
++}
++
++struct security_operations selinux_ops = {
++	.ptrace =			selinux_ptrace,
++	.capget =			selinux_capget,
++	.capset_check =			selinux_capset_check,
++	.capset_set =			selinux_capset_set,
++	.sysctl =			selinux_sysctl,
++	.capable =			selinux_capable,
++	.quotactl =			selinux_quotactl,
++	.quota_on =			selinux_quota_on,
++	.syslog =			selinux_syslog,
++	.vm_enough_memory =		selinux_vm_enough_memory,
++
++	.netlink_send =			selinux_netlink_send,
++        .netlink_recv =			selinux_netlink_recv,
++
++	.bprm_alloc_security =		selinux_bprm_alloc_security,
++	.bprm_free_security =		selinux_bprm_free_security,
++	.bprm_compute_creds =		selinux_bprm_compute_creds,
++	.bprm_set_security =		selinux_bprm_set_security,
++	.bprm_check_security =		selinux_bprm_check_security,
++	.bprm_secureexec =		selinux_bprm_secureexec,
++
++	.sb_alloc_security =		selinux_sb_alloc_security,
++	.sb_free_security =		selinux_sb_free_security,
++	.sb_kern_mount =	        selinux_sb_kern_mount,
++	.sb_statfs =			selinux_sb_statfs,
++	.sb_mount =			selinux_mount,
++	.sb_umount =			selinux_umount,
++
++	.inode_alloc_security =		selinux_inode_alloc_security,
++	.inode_free_security =		selinux_inode_free_security,
++	.inode_create =			selinux_inode_create,
++	.inode_post_create =		selinux_inode_post_create,
++	.inode_link =			selinux_inode_link,
++	.inode_post_link =		selinux_inode_post_link,
++	.inode_unlink =			selinux_inode_unlink,
++	.inode_symlink =		selinux_inode_symlink,
++	.inode_post_symlink =		selinux_inode_post_symlink,
++	.inode_mkdir =			selinux_inode_mkdir,
++	.inode_post_mkdir =		selinux_inode_post_mkdir,
++	.inode_rmdir =			selinux_inode_rmdir,
++	.inode_mknod =			selinux_inode_mknod,
++	.inode_post_mknod =		selinux_inode_post_mknod,
++	.inode_rename =			selinux_inode_rename,
++	.inode_post_rename =		selinux_inode_post_rename,
++	.inode_readlink =		selinux_inode_readlink,
++	.inode_follow_link =		selinux_inode_follow_link,
++	.inode_permission =		selinux_inode_permission,
++	.inode_setattr =		selinux_inode_setattr,
++	.inode_getattr =		selinux_inode_getattr,
++	.inode_setxattr =		selinux_inode_setxattr,
++	.inode_post_setxattr =		selinux_inode_post_setxattr,
++	.inode_getxattr =		selinux_inode_getxattr,
++	.inode_listxattr =		selinux_inode_listxattr,
++	.inode_removexattr =		selinux_inode_removexattr,
++	.inode_getsecurity =            selinux_inode_getsecurity,
++	.inode_setsecurity =            selinux_inode_setsecurity,
++	.inode_listsecurity =           selinux_inode_listsecurity,
++
++	.file_permission =		selinux_file_permission,
++	.file_alloc_security =		selinux_file_alloc_security,
++	.file_free_security =		selinux_file_free_security,
++	.file_ioctl =			selinux_file_ioctl,
++	.file_mmap =			selinux_file_mmap,
++	.file_mprotect =		selinux_file_mprotect,
++	.file_lock =			selinux_file_lock,
++	.file_fcntl =			selinux_file_fcntl,
++	.file_set_fowner =		selinux_file_set_fowner,
++	.file_send_sigiotask =		selinux_file_send_sigiotask,
++	.file_receive =			selinux_file_receive,
++
++	.task_create =			selinux_task_create,
++	.task_alloc_security =		selinux_task_alloc_security,
++	.task_free_security =		selinux_task_free_security,
++	.task_setuid =			selinux_task_setuid,
++	.task_post_setuid =		selinux_task_post_setuid,
++	.task_setgid =			selinux_task_setgid,
++	.task_setpgid =			selinux_task_setpgid,
++	.task_getpgid =			selinux_task_getpgid,
++	.task_getsid =		        selinux_task_getsid,
++	.task_setgroups =		selinux_task_setgroups,
++	.task_setnice =			selinux_task_setnice,
++	.task_setrlimit =		selinux_task_setrlimit,
++	.task_setscheduler =		selinux_task_setscheduler,
++	.task_getscheduler =		selinux_task_getscheduler,
++	.task_kill =			selinux_task_kill,
++	.task_wait =			selinux_task_wait,
++	.task_prctl =			selinux_task_prctl,
++	.task_reparent_to_init =	selinux_task_reparent_to_init,
++	.task_to_inode =                selinux_task_to_inode,
++
++	.ipc_permission =		selinux_ipc_permission,
++
++	.msg_msg_alloc_security =	selinux_msg_msg_alloc_security,
++	.msg_msg_free_security =	selinux_msg_msg_free_security,
++
++	.msg_queue_alloc_security =	selinux_msg_queue_alloc_security,
++	.msg_queue_free_security =	selinux_msg_queue_free_security,
++	.msg_queue_associate =		selinux_msg_queue_associate,
++	.msg_queue_msgctl =		selinux_msg_queue_msgctl,
++	.msg_queue_msgsnd =		selinux_msg_queue_msgsnd,
++	.msg_queue_msgrcv =		selinux_msg_queue_msgrcv,
++
++	.shm_alloc_security =		selinux_shm_alloc_security,
++	.shm_free_security =		selinux_shm_free_security,
++	.shm_associate =		selinux_shm_associate,
++	.shm_shmctl =			selinux_shm_shmctl,
++	.shm_shmat =			selinux_shm_shmat,
++
++	.sem_alloc_security = 		selinux_sem_alloc_security,
++	.sem_free_security =  		selinux_sem_free_security,
++	.sem_associate =		selinux_sem_associate,
++	.sem_semctl =			selinux_sem_semctl,
++	.sem_semop =			selinux_sem_semop,
++
++	.register_security =		selinux_register_security,
++	.unregister_security =		selinux_unregister_security,
++
++	.d_instantiate =                selinux_d_instantiate,
++
++	.getprocattr =                  selinux_getprocattr,
++	.setprocattr =                  selinux_setprocattr,
++
++#ifdef CONFIG_SECURITY_NETWORK
++        .unix_stream_connect =		selinux_socket_unix_stream_connect,
++	.unix_may_send =		selinux_socket_unix_may_send,
++
++	.socket_create =		selinux_socket_create,
++	.socket_post_create =		selinux_socket_post_create,
++	.socket_bind =			selinux_socket_bind,
++	.socket_connect =		selinux_socket_connect,
++	.socket_listen =		selinux_socket_listen,
++	.socket_accept =		selinux_socket_accept,
++	.socket_sendmsg =		selinux_socket_sendmsg,
++	.socket_recvmsg =		selinux_socket_recvmsg,
++	.socket_getsockname =		selinux_socket_getsockname,
++	.socket_getpeername =		selinux_socket_getpeername,
++	.socket_getsockopt =		selinux_socket_getsockopt,
++	.socket_setsockopt =		selinux_socket_setsockopt,
++	.socket_shutdown =		selinux_socket_shutdown,
++#endif
++};
++
++__init int selinux_init(void)
++{
++	struct task_security_struct *tsec;
++
++	printk(KERN_INFO "SELinux:  Initializing.\n");
++
++	/* Set the security state for the initial task. */
++	if (task_alloc_security(current))
++		panic("SELinux:  Failed to initialize initial task.\n");
++	tsec = current->security;
++	tsec->osid = tsec->sid = SECINITSID_KERNEL;
++
++	avc_init();
++
++	original_ops = secondary_ops = security_ops;
++	if (!secondary_ops)
++		panic ("SELinux: No initial security operations\n");
++	if (register_security (&selinux_ops))
++		panic("SELinux: Unable to register with kernel.\n");
++
++	if (selinux_enforcing) {
++		printk(KERN_INFO "SELinux:  Starting in enforcing mode\n");
++	} else {
++		printk(KERN_INFO "SELinux:  Starting in permissive mode\n");
++	}
++	return 0;
++}
++
++void selinux_complete_init(void)
++{
++	printk(KERN_INFO "SELinux:  Completing initialization.\n");
++
++	/* Set up any superblocks initialized prior to the policy load. */
++	printk(KERN_INFO "SELinux:  Setting up existing superblocks.\n");
++	spin_lock(&sb_security_lock);
++next_sb:
++	if (!list_empty(&superblock_security_head)) {
++		struct superblock_security_struct *sbsec =
++				list_entry(superblock_security_head.next,
++				           struct superblock_security_struct,
++				           list);
++		struct super_block *sb = sbsec->sb;
++		spin_lock(&sb_lock);
++		sb->s_count++;
++		spin_unlock(&sb_lock);
++		spin_unlock(&sb_security_lock);
++		down_read(&sb->s_umount);
++		if (sb->s_root)
++			superblock_doinit(sb);
++		drop_super(sb);
++		spin_lock(&sb_security_lock);
++		list_del_init(&sbsec->list);
++		goto next_sb;
++	}
++	spin_unlock(&sb_security_lock);
++
++	/* Set up any inodes initialized prior to the policy load. */
++	printk(KERN_INFO "SELinux:  Setting up existing inodes.\n");
++	spin_lock(&inode_security_lock);
++next_inode:
++	if (!list_empty(&inode_security_head)) {
++		struct inode_security_struct *isec =
++				list_entry(inode_security_head.next,
++				           struct inode_security_struct, list);
++		struct inode *inode = isec->inode;
++		spin_unlock(&inode_security_lock);
++		inode = igrab(inode);
++		if (inode) {
++			inode_doinit(inode);
++			iput(inode);
++		}
++		spin_lock(&inode_security_lock);
++		list_del_init(&isec->list);
++		goto next_inode;
++	}
++	spin_unlock(&inode_security_lock);
++}
++
++/* SELinux requires early initialization in order to label
++   all processes and objects when they are created. */
++security_initcall(selinux_init);
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/avc.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,159 @@
++/*
++ * Access vector cache interface for object managers.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SELINUX_AVC_H_
++#define _SELINUX_AVC_H_
++
++#include <linux/stddef.h>
++#include <linux/errno.h>
++#include <linux/kernel.h>
++#include <linux/kdev_t.h>
++#include <linux/spinlock.h>
++#include <asm/system.h>
++#include "flask.h"
++#include "av_permissions.h"
++#include "security.h"
++
++#ifdef CONFIG_SECURITY_SELINUX_DEVELOP
++extern int selinux_enforcing;
++#else
++#define selinux_enforcing 1
++#endif
++
++/*
++ * An entry in the AVC.
++ */
++struct avc_entry;
++
++/*
++ * A reference to an AVC entry.
++ */
++struct avc_entry_ref {
++	struct avc_entry *ae;
++};
++
++/* Initialize an AVC entry reference before first use. */
++static inline void avc_entry_ref_init(struct avc_entry_ref *h)
++{
++	h->ae = NULL;
++}
++
++struct task_struct;
++struct vfsmount;
++struct dentry;
++struct inode;
++struct sock;
++struct sk_buff;
++
++/* Auxiliary data to use in generating the audit record. */
++struct avc_audit_data {
++	char    type;
++#define AVC_AUDIT_DATA_FS   1
++#define AVC_AUDIT_DATA_NET  2
++#define AVC_AUDIT_DATA_CAP  3
++#define AVC_AUDIT_DATA_IPC  4
++	struct task_struct *tsk;
++	union 	{
++		struct {
++			struct vfsmount *mnt;
++			struct dentry *dentry;
++			struct inode *inode;
++		} fs;
++		struct {
++			char *netif;
++			struct sk_buff *skb;
++			struct sock *sk;
++			u16 port;
++			u32 daddr;
++		} net;
++		int cap;
++		int ipc_id;
++	} u;
++};
++
++/* Initialize an AVC audit data structure. */
++#define AVC_AUDIT_DATA_INIT(_d,_t) \
++        { memset((_d), 0, sizeof(struct avc_audit_data)); (_d)->type = AVC_AUDIT_DATA_##_t; }
++
++/*
++ * AVC statistics
++ */
++#define AVC_ENTRY_LOOKUPS        0
++#define AVC_ENTRY_HITS	         1
++#define AVC_ENTRY_MISSES         2
++#define AVC_ENTRY_DISCARDS       3
++#define AVC_CAV_LOOKUPS          4
++#define AVC_CAV_HITS             5
++#define AVC_CAV_PROBES           6
++#define AVC_CAV_MISSES           7
++#define AVC_NSTATS               8
++extern unsigned avc_cache_stats[AVC_NSTATS];
++
++#ifdef AVC_CACHE_STATS
++static inline void avc_cache_stats_incr(int type)
++{
++	avc_cache_stats[type]++;
++}
++
++static inline void avc_cache_stats_add(int type, unsigned val)
++{
++	avc_cache_stats[type] += val;
++}
++#else
++static inline void avc_cache_stats_incr(int type)
++{ }
++
++static inline void avc_cache_stats_add(int type, unsigned val)
++{ }
++#endif
++
++/*
++ * AVC display support
++ */
++void avc_dump_av(u16 tclass, u32 av);
++void avc_dump_query(u32 ssid, u32 tsid, u16 tclass);
++void avc_dump_cache(char *tag);
++
++/*
++ * AVC operations
++ */
++
++void avc_init(void);
++
++int avc_lookup(u32 ssid, u32 tsid, u16 tclass,
++               u32 requested, struct avc_entry_ref *aeref);
++
++int avc_insert(u32 ssid, u32 tsid, u16 tclass,
++               struct avc_entry *ae, struct avc_entry_ref *out_aeref);
++
++void avc_audit(u32 ssid, u32 tsid,
++               u16 tclass, u32 requested,
++               struct av_decision *avd, int result, struct avc_audit_data *auditdata);
++
++int avc_has_perm_noaudit(u32 ssid, u32 tsid,
++                         u16 tclass, u32 requested,
++                         struct avc_entry_ref *aeref, struct av_decision *avd);
++
++int avc_has_perm(u32 ssid, u32 tsid,
++                 u16 tclass, u32 requested,
++                 struct avc_entry_ref *aeref, struct avc_audit_data *auditdata);
++
++#define AVC_CALLBACK_GRANT		1
++#define AVC_CALLBACK_TRY_REVOKE		2
++#define AVC_CALLBACK_REVOKE		4
++#define AVC_CALLBACK_RESET		8
++#define AVC_CALLBACK_AUDITALLOW_ENABLE	16
++#define AVC_CALLBACK_AUDITALLOW_DISABLE	32
++#define AVC_CALLBACK_AUDITDENY_ENABLE	64
++#define AVC_CALLBACK_AUDITDENY_DISABLE	128
++
++int avc_add_callback(int (*callback)(u32 event, u32 ssid, u32 tsid,
++                                     u16 tclass, u32 perms,
++				     u32 *out_retained),
++		     u32 events, u32 ssid, u32 tsid,
++		     u16 tclass, u32 perms);
++
++#endif /* _SELINUX_AVC_H_ */
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/avc_ss.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,27 @@
++/*
++ * Access vector cache interface for the security server.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SELINUX_AVC_SS_H_
++#define _SELINUX_AVC_SS_H_
++
++#include "flask.h"
++
++int avc_ss_grant(u32 ssid, u32 tsid, u16 tclass, u32 perms, u32 seqno);
++
++int avc_ss_try_revoke(u32 ssid, u32 tsid, u16 tclass, u32 perms, u32 seqno,
++		      u32 *out_retained);
++
++int avc_ss_revoke(u32 ssid, u32 tsid, u16 tclass, u32 perms, u32 seqno);
++
++int avc_ss_reset(u32 seqno);
++
++int avc_ss_set_auditallow(u32 ssid, u32 tsid, u16 tclass, u32 perms,
++			  u32 seqno, u32 enable);
++
++int avc_ss_set_auditdeny(u32 ssid, u32 tsid, u16 tclass, u32 perms,
++			 u32 seqno, u32 enable);
++
++#endif /* _SELINUX_AVC_SS_H_ */
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/av_inherit.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,35 @@
++/* This file is automatically generated.  Do not edit. */
++/* FLASK */
++
++struct av_inherit
++{
++    u16 tclass;
++    char **common_pts;
++    u32 common_base;
++};
++
++static struct av_inherit av_inherit[] = {
++   { SECCLASS_DIR, common_file_perm_to_string, 0x00020000UL },
++   { SECCLASS_FILE, common_file_perm_to_string, 0x00020000UL },
++   { SECCLASS_LNK_FILE, common_file_perm_to_string, 0x00020000UL },
++   { SECCLASS_CHR_FILE, common_file_perm_to_string, 0x00020000UL },
++   { SECCLASS_BLK_FILE, common_file_perm_to_string, 0x00020000UL },
++   { SECCLASS_SOCK_FILE, common_file_perm_to_string, 0x00020000UL },
++   { SECCLASS_FIFO_FILE, common_file_perm_to_string, 0x00020000UL },
++   { SECCLASS_SOCKET, common_socket_perm_to_string, 0x00400000UL },
++   { SECCLASS_TCP_SOCKET, common_socket_perm_to_string, 0x00400000UL },
++   { SECCLASS_UDP_SOCKET, common_socket_perm_to_string, 0x00400000UL },
++   { SECCLASS_RAWIP_SOCKET, common_socket_perm_to_string, 0x00400000UL },
++   { SECCLASS_NETLINK_SOCKET, common_socket_perm_to_string, 0x00400000UL },
++   { SECCLASS_PACKET_SOCKET, common_socket_perm_to_string, 0x00400000UL },
++   { SECCLASS_KEY_SOCKET, common_socket_perm_to_string, 0x00400000UL },
++   { SECCLASS_UNIX_STREAM_SOCKET, common_socket_perm_to_string, 0x00400000UL },
++   { SECCLASS_UNIX_DGRAM_SOCKET, common_socket_perm_to_string, 0x00400000UL },
++   { SECCLASS_IPC, common_ipc_perm_to_string, 0x00000200UL },
++   { SECCLASS_SEM, common_ipc_perm_to_string, 0x00000200UL },
++   { SECCLASS_MSGQ, common_ipc_perm_to_string, 0x00000200UL },
++   { SECCLASS_SHM, common_ipc_perm_to_string, 0x00000200UL },
++};
++
++
++/* FLASK */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/av_permissions.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,550 @@
++/* This file is automatically generated.  Do not edit. */
++/* FLASK */
++
++#define COMMON_FILE__IOCTL                               0x00000001UL
++#define COMMON_FILE__READ                                0x00000002UL
++#define COMMON_FILE__WRITE                               0x00000004UL
++#define COMMON_FILE__CREATE                              0x00000008UL
++#define COMMON_FILE__GETATTR                             0x00000010UL
++#define COMMON_FILE__SETATTR                             0x00000020UL
++#define COMMON_FILE__LOCK                                0x00000040UL
++#define COMMON_FILE__RELABELFROM                         0x00000080UL
++#define COMMON_FILE__RELABELTO                           0x00000100UL
++#define COMMON_FILE__APPEND                              0x00000200UL
++#define COMMON_FILE__UNLINK                              0x00000400UL
++#define COMMON_FILE__LINK                                0x00000800UL
++#define COMMON_FILE__RENAME                              0x00001000UL
++#define COMMON_FILE__EXECUTE                             0x00002000UL
++#define COMMON_FILE__SWAPON                              0x00004000UL
++#define COMMON_FILE__QUOTAON                             0x00008000UL
++#define COMMON_FILE__MOUNTON                             0x00010000UL
++
++#define COMMON_SOCKET__IOCTL                             0x00000001UL
++#define COMMON_SOCKET__READ                              0x00000002UL
++#define COMMON_SOCKET__WRITE                             0x00000004UL
++#define COMMON_SOCKET__CREATE                            0x00000008UL
++#define COMMON_SOCKET__GETATTR                           0x00000010UL
++#define COMMON_SOCKET__SETATTR                           0x00000020UL
++#define COMMON_SOCKET__LOCK                              0x00000040UL
++#define COMMON_SOCKET__RELABELFROM                       0x00000080UL
++#define COMMON_SOCKET__RELABELTO                         0x00000100UL
++#define COMMON_SOCKET__APPEND                            0x00000200UL
++#define COMMON_SOCKET__BIND                              0x00000400UL
++#define COMMON_SOCKET__CONNECT                           0x00000800UL
++#define COMMON_SOCKET__LISTEN                            0x00001000UL
++#define COMMON_SOCKET__ACCEPT                            0x00002000UL
++#define COMMON_SOCKET__GETOPT                            0x00004000UL
++#define COMMON_SOCKET__SETOPT                            0x00008000UL
++#define COMMON_SOCKET__SHUTDOWN                          0x00010000UL
++#define COMMON_SOCKET__RECVFROM                          0x00020000UL
++#define COMMON_SOCKET__SENDTO                            0x00040000UL
++#define COMMON_SOCKET__RECV_MSG                          0x00080000UL
++#define COMMON_SOCKET__SEND_MSG                          0x00100000UL
++#define COMMON_SOCKET__NAME_BIND                         0x00200000UL
++
++#define COMMON_IPC__CREATE                               0x00000001UL
++#define COMMON_IPC__DESTROY                              0x00000002UL
++#define COMMON_IPC__GETATTR                              0x00000004UL
++#define COMMON_IPC__SETATTR                              0x00000008UL
++#define COMMON_IPC__READ                                 0x00000010UL
++#define COMMON_IPC__WRITE                                0x00000020UL
++#define COMMON_IPC__ASSOCIATE                            0x00000040UL
++#define COMMON_IPC__UNIX_READ                            0x00000080UL
++#define COMMON_IPC__UNIX_WRITE                           0x00000100UL
++
++#define FILESYSTEM__MOUNT                         0x00000001UL
++#define FILESYSTEM__REMOUNT                       0x00000002UL
++#define FILESYSTEM__UNMOUNT                       0x00000004UL
++#define FILESYSTEM__GETATTR                       0x00000008UL
++#define FILESYSTEM__RELABELFROM                   0x00000010UL
++#define FILESYSTEM__RELABELTO                     0x00000020UL
++#define FILESYSTEM__TRANSITION                    0x00000040UL
++#define FILESYSTEM__ASSOCIATE                     0x00000080UL
++#define FILESYSTEM__QUOTAMOD                      0x00000100UL
++#define FILESYSTEM__QUOTAGET                      0x00000200UL
++
++#define DIR__EXECUTE                              0x00002000UL
++#define DIR__UNLINK                               0x00000400UL
++#define DIR__SETATTR                              0x00000020UL
++#define DIR__QUOTAON                              0x00008000UL
++#define DIR__RELABELFROM                          0x00000080UL
++#define DIR__LINK                                 0x00000800UL
++#define DIR__WRITE                                0x00000004UL
++#define DIR__IOCTL                                0x00000001UL
++#define DIR__RELABELTO                            0x00000100UL
++#define DIR__READ                                 0x00000002UL
++#define DIR__RENAME                               0x00001000UL
++#define DIR__APPEND                               0x00000200UL
++#define DIR__LOCK                                 0x00000040UL
++#define DIR__SWAPON                               0x00004000UL
++#define DIR__GETATTR                              0x00000010UL
++#define DIR__MOUNTON                              0x00010000UL
++#define DIR__CREATE                               0x00000008UL
++
++#define DIR__ADD_NAME                             0x00020000UL
++#define DIR__REMOVE_NAME                          0x00040000UL
++#define DIR__REPARENT                             0x00080000UL
++#define DIR__SEARCH                               0x00100000UL
++#define DIR__RMDIR                                0x00200000UL
++
++#define FILE__EXECUTE                             0x00002000UL
++#define FILE__UNLINK                              0x00000400UL
++#define FILE__SETATTR                             0x00000020UL
++#define FILE__QUOTAON                             0x00008000UL
++#define FILE__RELABELFROM                         0x00000080UL
++#define FILE__LINK                                0x00000800UL
++#define FILE__WRITE                               0x00000004UL
++#define FILE__IOCTL                               0x00000001UL
++#define FILE__RELABELTO                           0x00000100UL
++#define FILE__READ                                0x00000002UL
++#define FILE__RENAME                              0x00001000UL
++#define FILE__APPEND                              0x00000200UL
++#define FILE__LOCK                                0x00000040UL
++#define FILE__SWAPON                              0x00004000UL
++#define FILE__GETATTR                             0x00000010UL
++#define FILE__MOUNTON                             0x00010000UL
++#define FILE__CREATE                              0x00000008UL
++
++#define FILE__EXECUTE_NO_TRANS                    0x00020000UL
++#define FILE__ENTRYPOINT                          0x00040000UL
++
++#define LNK_FILE__EXECUTE                         0x00002000UL
++#define LNK_FILE__UNLINK                          0x00000400UL
++#define LNK_FILE__SETATTR                         0x00000020UL
++#define LNK_FILE__QUOTAON                         0x00008000UL
++#define LNK_FILE__RELABELFROM                     0x00000080UL
++#define LNK_FILE__LINK                            0x00000800UL
++#define LNK_FILE__WRITE                           0x00000004UL
++#define LNK_FILE__IOCTL                           0x00000001UL
++#define LNK_FILE__RELABELTO                       0x00000100UL
++#define LNK_FILE__READ                            0x00000002UL
++#define LNK_FILE__RENAME                          0x00001000UL
++#define LNK_FILE__APPEND                          0x00000200UL
++#define LNK_FILE__LOCK                            0x00000040UL
++#define LNK_FILE__SWAPON                          0x00004000UL
++#define LNK_FILE__GETATTR                         0x00000010UL
++#define LNK_FILE__MOUNTON                         0x00010000UL
++#define LNK_FILE__CREATE                          0x00000008UL
++
++#define CHR_FILE__EXECUTE                         0x00002000UL
++#define CHR_FILE__UNLINK                          0x00000400UL
++#define CHR_FILE__SETATTR                         0x00000020UL
++#define CHR_FILE__QUOTAON                         0x00008000UL
++#define CHR_FILE__RELABELFROM                     0x00000080UL
++#define CHR_FILE__LINK                            0x00000800UL
++#define CHR_FILE__WRITE                           0x00000004UL
++#define CHR_FILE__IOCTL                           0x00000001UL
++#define CHR_FILE__RELABELTO                       0x00000100UL
++#define CHR_FILE__READ                            0x00000002UL
++#define CHR_FILE__RENAME                          0x00001000UL
++#define CHR_FILE__APPEND                          0x00000200UL
++#define CHR_FILE__LOCK                            0x00000040UL
++#define CHR_FILE__SWAPON                          0x00004000UL
++#define CHR_FILE__GETATTR                         0x00000010UL
++#define CHR_FILE__MOUNTON                         0x00010000UL
++#define CHR_FILE__CREATE                          0x00000008UL
++
++#define BLK_FILE__EXECUTE                         0x00002000UL
++#define BLK_FILE__UNLINK                          0x00000400UL
++#define BLK_FILE__SETATTR                         0x00000020UL
++#define BLK_FILE__QUOTAON                         0x00008000UL
++#define BLK_FILE__RELABELFROM                     0x00000080UL
++#define BLK_FILE__LINK                            0x00000800UL
++#define BLK_FILE__WRITE                           0x00000004UL
++#define BLK_FILE__IOCTL                           0x00000001UL
++#define BLK_FILE__RELABELTO                       0x00000100UL
++#define BLK_FILE__READ                            0x00000002UL
++#define BLK_FILE__RENAME                          0x00001000UL
++#define BLK_FILE__APPEND                          0x00000200UL
++#define BLK_FILE__LOCK                            0x00000040UL
++#define BLK_FILE__SWAPON                          0x00004000UL
++#define BLK_FILE__GETATTR                         0x00000010UL
++#define BLK_FILE__MOUNTON                         0x00010000UL
++#define BLK_FILE__CREATE                          0x00000008UL
++
++#define SOCK_FILE__EXECUTE                        0x00002000UL
++#define SOCK_FILE__UNLINK                         0x00000400UL
++#define SOCK_FILE__SETATTR                        0x00000020UL
++#define SOCK_FILE__QUOTAON                        0x00008000UL
++#define SOCK_FILE__RELABELFROM                    0x00000080UL
++#define SOCK_FILE__LINK                           0x00000800UL
++#define SOCK_FILE__WRITE                          0x00000004UL
++#define SOCK_FILE__IOCTL                          0x00000001UL
++#define SOCK_FILE__RELABELTO                      0x00000100UL
++#define SOCK_FILE__READ                           0x00000002UL
++#define SOCK_FILE__RENAME                         0x00001000UL
++#define SOCK_FILE__APPEND                         0x00000200UL
++#define SOCK_FILE__LOCK                           0x00000040UL
++#define SOCK_FILE__SWAPON                         0x00004000UL
++#define SOCK_FILE__GETATTR                        0x00000010UL
++#define SOCK_FILE__MOUNTON                        0x00010000UL
++#define SOCK_FILE__CREATE                         0x00000008UL
++
++#define FIFO_FILE__EXECUTE                        0x00002000UL
++#define FIFO_FILE__UNLINK                         0x00000400UL
++#define FIFO_FILE__SETATTR                        0x00000020UL
++#define FIFO_FILE__QUOTAON                        0x00008000UL
++#define FIFO_FILE__RELABELFROM                    0x00000080UL
++#define FIFO_FILE__LINK                           0x00000800UL
++#define FIFO_FILE__WRITE                          0x00000004UL
++#define FIFO_FILE__IOCTL                          0x00000001UL
++#define FIFO_FILE__RELABELTO                      0x00000100UL
++#define FIFO_FILE__READ                           0x00000002UL
++#define FIFO_FILE__RENAME                         0x00001000UL
++#define FIFO_FILE__APPEND                         0x00000200UL
++#define FIFO_FILE__LOCK                           0x00000040UL
++#define FIFO_FILE__SWAPON                         0x00004000UL
++#define FIFO_FILE__GETATTR                        0x00000010UL
++#define FIFO_FILE__MOUNTON                        0x00010000UL
++#define FIFO_FILE__CREATE                         0x00000008UL
++
++#define FD__USE                                   0x00000001UL
++
++#define SOCKET__RELABELTO                         0x00000100UL
++#define SOCKET__RECV_MSG                          0x00080000UL
++#define SOCKET__RELABELFROM                       0x00000080UL
++#define SOCKET__SETOPT                            0x00008000UL
++#define SOCKET__APPEND                            0x00000200UL
++#define SOCKET__SETATTR                           0x00000020UL
++#define SOCKET__SENDTO                            0x00040000UL
++#define SOCKET__GETOPT                            0x00004000UL
++#define SOCKET__READ                              0x00000002UL
++#define SOCKET__SHUTDOWN                          0x00010000UL
++#define SOCKET__LISTEN                            0x00001000UL
++#define SOCKET__BIND                              0x00000400UL
++#define SOCKET__WRITE                             0x00000004UL
++#define SOCKET__ACCEPT                            0x00002000UL
++#define SOCKET__CONNECT                           0x00000800UL
++#define SOCKET__LOCK                              0x00000040UL
++#define SOCKET__IOCTL                             0x00000001UL
++#define SOCKET__CREATE                            0x00000008UL
++#define SOCKET__NAME_BIND                         0x00200000UL
++#define SOCKET__SEND_MSG                          0x00100000UL
++#define SOCKET__RECVFROM                          0x00020000UL
++#define SOCKET__GETATTR                           0x00000010UL
++
++#define TCP_SOCKET__RELABELTO                     0x00000100UL
++#define TCP_SOCKET__RECV_MSG                      0x00080000UL
++#define TCP_SOCKET__RELABELFROM                   0x00000080UL
++#define TCP_SOCKET__SETOPT                        0x00008000UL
++#define TCP_SOCKET__APPEND                        0x00000200UL
++#define TCP_SOCKET__SETATTR                       0x00000020UL
++#define TCP_SOCKET__SENDTO                        0x00040000UL
++#define TCP_SOCKET__GETOPT                        0x00004000UL
++#define TCP_SOCKET__READ                          0x00000002UL
++#define TCP_SOCKET__SHUTDOWN                      0x00010000UL
++#define TCP_SOCKET__LISTEN                        0x00001000UL
++#define TCP_SOCKET__BIND                          0x00000400UL
++#define TCP_SOCKET__WRITE                         0x00000004UL
++#define TCP_SOCKET__ACCEPT                        0x00002000UL
++#define TCP_SOCKET__CONNECT                       0x00000800UL
++#define TCP_SOCKET__LOCK                          0x00000040UL
++#define TCP_SOCKET__IOCTL                         0x00000001UL
++#define TCP_SOCKET__CREATE                        0x00000008UL
++#define TCP_SOCKET__NAME_BIND                     0x00200000UL
++#define TCP_SOCKET__SEND_MSG                      0x00100000UL
++#define TCP_SOCKET__RECVFROM                      0x00020000UL
++#define TCP_SOCKET__GETATTR                       0x00000010UL
++
++#define TCP_SOCKET__CONNECTTO                     0x00400000UL
++#define TCP_SOCKET__NEWCONN                       0x00800000UL
++#define TCP_SOCKET__ACCEPTFROM                    0x01000000UL
++
++#define UDP_SOCKET__RELABELTO                     0x00000100UL
++#define UDP_SOCKET__RECV_MSG                      0x00080000UL
++#define UDP_SOCKET__RELABELFROM                   0x00000080UL
++#define UDP_SOCKET__SETOPT                        0x00008000UL
++#define UDP_SOCKET__APPEND                        0x00000200UL
++#define UDP_SOCKET__SETATTR                       0x00000020UL
++#define UDP_SOCKET__SENDTO                        0x00040000UL
++#define UDP_SOCKET__GETOPT                        0x00004000UL
++#define UDP_SOCKET__READ                          0x00000002UL
++#define UDP_SOCKET__SHUTDOWN                      0x00010000UL
++#define UDP_SOCKET__LISTEN                        0x00001000UL
++#define UDP_SOCKET__BIND                          0x00000400UL
++#define UDP_SOCKET__WRITE                         0x00000004UL
++#define UDP_SOCKET__ACCEPT                        0x00002000UL
++#define UDP_SOCKET__CONNECT                       0x00000800UL
++#define UDP_SOCKET__LOCK                          0x00000040UL
++#define UDP_SOCKET__IOCTL                         0x00000001UL
++#define UDP_SOCKET__CREATE                        0x00000008UL
++#define UDP_SOCKET__NAME_BIND                     0x00200000UL
++#define UDP_SOCKET__SEND_MSG                      0x00100000UL
++#define UDP_SOCKET__RECVFROM                      0x00020000UL
++#define UDP_SOCKET__GETATTR                       0x00000010UL
++
++#define RAWIP_SOCKET__RELABELTO                   0x00000100UL
++#define RAWIP_SOCKET__RECV_MSG                    0x00080000UL
++#define RAWIP_SOCKET__RELABELFROM                 0x00000080UL
++#define RAWIP_SOCKET__SETOPT                      0x00008000UL
++#define RAWIP_SOCKET__APPEND                      0x00000200UL
++#define RAWIP_SOCKET__SETATTR                     0x00000020UL
++#define RAWIP_SOCKET__SENDTO                      0x00040000UL
++#define RAWIP_SOCKET__GETOPT                      0x00004000UL
++#define RAWIP_SOCKET__READ                        0x00000002UL
++#define RAWIP_SOCKET__SHUTDOWN                    0x00010000UL
++#define RAWIP_SOCKET__LISTEN                      0x00001000UL
++#define RAWIP_SOCKET__BIND                        0x00000400UL
++#define RAWIP_SOCKET__WRITE                       0x00000004UL
++#define RAWIP_SOCKET__ACCEPT                      0x00002000UL
++#define RAWIP_SOCKET__CONNECT                     0x00000800UL
++#define RAWIP_SOCKET__LOCK                        0x00000040UL
++#define RAWIP_SOCKET__IOCTL                       0x00000001UL
++#define RAWIP_SOCKET__CREATE                      0x00000008UL
++#define RAWIP_SOCKET__NAME_BIND                   0x00200000UL
++#define RAWIP_SOCKET__SEND_MSG                    0x00100000UL
++#define RAWIP_SOCKET__RECVFROM                    0x00020000UL
++#define RAWIP_SOCKET__GETATTR                     0x00000010UL
++
++#define NODE__TCP_RECV                            0x00000001UL
++#define NODE__TCP_SEND                            0x00000002UL
++#define NODE__UDP_RECV                            0x00000004UL
++#define NODE__UDP_SEND                            0x00000008UL
++#define NODE__RAWIP_RECV                          0x00000010UL
++#define NODE__RAWIP_SEND                          0x00000020UL
++#define NODE__ENFORCE_DEST                        0x00000040UL
++
++#define NETIF__TCP_RECV                           0x00000001UL
++#define NETIF__TCP_SEND                           0x00000002UL
++#define NETIF__UDP_RECV                           0x00000004UL
++#define NETIF__UDP_SEND                           0x00000008UL
++#define NETIF__RAWIP_RECV                         0x00000010UL
++#define NETIF__RAWIP_SEND                         0x00000020UL
++
++#define NETLINK_SOCKET__RELABELTO                 0x00000100UL
++#define NETLINK_SOCKET__RECV_MSG                  0x00080000UL
++#define NETLINK_SOCKET__RELABELFROM               0x00000080UL
++#define NETLINK_SOCKET__SETOPT                    0x00008000UL
++#define NETLINK_SOCKET__APPEND                    0x00000200UL
++#define NETLINK_SOCKET__SETATTR                   0x00000020UL
++#define NETLINK_SOCKET__SENDTO                    0x00040000UL
++#define NETLINK_SOCKET__GETOPT                    0x00004000UL
++#define NETLINK_SOCKET__READ                      0x00000002UL
++#define NETLINK_SOCKET__SHUTDOWN                  0x00010000UL
++#define NETLINK_SOCKET__LISTEN                    0x00001000UL
++#define NETLINK_SOCKET__BIND                      0x00000400UL
++#define NETLINK_SOCKET__WRITE                     0x00000004UL
++#define NETLINK_SOCKET__ACCEPT                    0x00002000UL
++#define NETLINK_SOCKET__CONNECT                   0x00000800UL
++#define NETLINK_SOCKET__LOCK                      0x00000040UL
++#define NETLINK_SOCKET__IOCTL                     0x00000001UL
++#define NETLINK_SOCKET__CREATE                    0x00000008UL
++#define NETLINK_SOCKET__NAME_BIND                 0x00200000UL
++#define NETLINK_SOCKET__SEND_MSG                  0x00100000UL
++#define NETLINK_SOCKET__RECVFROM                  0x00020000UL
++#define NETLINK_SOCKET__GETATTR                   0x00000010UL
++
++#define PACKET_SOCKET__RELABELTO                  0x00000100UL
++#define PACKET_SOCKET__RECV_MSG                   0x00080000UL
++#define PACKET_SOCKET__RELABELFROM                0x00000080UL
++#define PACKET_SOCKET__SETOPT                     0x00008000UL
++#define PACKET_SOCKET__APPEND                     0x00000200UL
++#define PACKET_SOCKET__SETATTR                    0x00000020UL
++#define PACKET_SOCKET__SENDTO                     0x00040000UL
++#define PACKET_SOCKET__GETOPT                     0x00004000UL
++#define PACKET_SOCKET__READ                       0x00000002UL
++#define PACKET_SOCKET__SHUTDOWN                   0x00010000UL
++#define PACKET_SOCKET__LISTEN                     0x00001000UL
++#define PACKET_SOCKET__BIND                       0x00000400UL
++#define PACKET_SOCKET__WRITE                      0x00000004UL
++#define PACKET_SOCKET__ACCEPT                     0x00002000UL
++#define PACKET_SOCKET__CONNECT                    0x00000800UL
++#define PACKET_SOCKET__LOCK                       0x00000040UL
++#define PACKET_SOCKET__IOCTL                      0x00000001UL
++#define PACKET_SOCKET__CREATE                     0x00000008UL
++#define PACKET_SOCKET__NAME_BIND                  0x00200000UL
++#define PACKET_SOCKET__SEND_MSG                   0x00100000UL
++#define PACKET_SOCKET__RECVFROM                   0x00020000UL
++#define PACKET_SOCKET__GETATTR                    0x00000010UL
++
++#define KEY_SOCKET__RELABELTO                     0x00000100UL
++#define KEY_SOCKET__RECV_MSG                      0x00080000UL
++#define KEY_SOCKET__RELABELFROM                   0x00000080UL
++#define KEY_SOCKET__SETOPT                        0x00008000UL
++#define KEY_SOCKET__APPEND                        0x00000200UL
++#define KEY_SOCKET__SETATTR                       0x00000020UL
++#define KEY_SOCKET__SENDTO                        0x00040000UL
++#define KEY_SOCKET__GETOPT                        0x00004000UL
++#define KEY_SOCKET__READ                          0x00000002UL
++#define KEY_SOCKET__SHUTDOWN                      0x00010000UL
++#define KEY_SOCKET__LISTEN                        0x00001000UL
++#define KEY_SOCKET__BIND                          0x00000400UL
++#define KEY_SOCKET__WRITE                         0x00000004UL
++#define KEY_SOCKET__ACCEPT                        0x00002000UL
++#define KEY_SOCKET__CONNECT                       0x00000800UL
++#define KEY_SOCKET__LOCK                          0x00000040UL
++#define KEY_SOCKET__IOCTL                         0x00000001UL
++#define KEY_SOCKET__CREATE                        0x00000008UL
++#define KEY_SOCKET__NAME_BIND                     0x00200000UL
++#define KEY_SOCKET__SEND_MSG                      0x00100000UL
++#define KEY_SOCKET__RECVFROM                      0x00020000UL
++#define KEY_SOCKET__GETATTR                       0x00000010UL
++
++#define UNIX_STREAM_SOCKET__RELABELTO             0x00000100UL
++#define UNIX_STREAM_SOCKET__RECV_MSG              0x00080000UL
++#define UNIX_STREAM_SOCKET__RELABELFROM           0x00000080UL
++#define UNIX_STREAM_SOCKET__SETOPT                0x00008000UL
++#define UNIX_STREAM_SOCKET__APPEND                0x00000200UL
++#define UNIX_STREAM_SOCKET__SETATTR               0x00000020UL
++#define UNIX_STREAM_SOCKET__SENDTO                0x00040000UL
++#define UNIX_STREAM_SOCKET__GETOPT                0x00004000UL
++#define UNIX_STREAM_SOCKET__READ                  0x00000002UL
++#define UNIX_STREAM_SOCKET__SHUTDOWN              0x00010000UL
++#define UNIX_STREAM_SOCKET__LISTEN                0x00001000UL
++#define UNIX_STREAM_SOCKET__BIND                  0x00000400UL
++#define UNIX_STREAM_SOCKET__WRITE                 0x00000004UL
++#define UNIX_STREAM_SOCKET__ACCEPT                0x00002000UL
++#define UNIX_STREAM_SOCKET__CONNECT               0x00000800UL
++#define UNIX_STREAM_SOCKET__LOCK                  0x00000040UL
++#define UNIX_STREAM_SOCKET__IOCTL                 0x00000001UL
++#define UNIX_STREAM_SOCKET__CREATE                0x00000008UL
++#define UNIX_STREAM_SOCKET__NAME_BIND             0x00200000UL
++#define UNIX_STREAM_SOCKET__SEND_MSG              0x00100000UL
++#define UNIX_STREAM_SOCKET__RECVFROM              0x00020000UL
++#define UNIX_STREAM_SOCKET__GETATTR               0x00000010UL
++
++#define UNIX_STREAM_SOCKET__CONNECTTO             0x00400000UL
++#define UNIX_STREAM_SOCKET__NEWCONN               0x00800000UL
++#define UNIX_STREAM_SOCKET__ACCEPTFROM            0x01000000UL
++
++#define UNIX_DGRAM_SOCKET__RELABELTO              0x00000100UL
++#define UNIX_DGRAM_SOCKET__RECV_MSG               0x00080000UL
++#define UNIX_DGRAM_SOCKET__RELABELFROM            0x00000080UL
++#define UNIX_DGRAM_SOCKET__SETOPT                 0x00008000UL
++#define UNIX_DGRAM_SOCKET__APPEND                 0x00000200UL
++#define UNIX_DGRAM_SOCKET__SETATTR                0x00000020UL
++#define UNIX_DGRAM_SOCKET__SENDTO                 0x00040000UL
++#define UNIX_DGRAM_SOCKET__GETOPT                 0x00004000UL
++#define UNIX_DGRAM_SOCKET__READ                   0x00000002UL
++#define UNIX_DGRAM_SOCKET__SHUTDOWN               0x00010000UL
++#define UNIX_DGRAM_SOCKET__LISTEN                 0x00001000UL
++#define UNIX_DGRAM_SOCKET__BIND                   0x00000400UL
++#define UNIX_DGRAM_SOCKET__WRITE                  0x00000004UL
++#define UNIX_DGRAM_SOCKET__ACCEPT                 0x00002000UL
++#define UNIX_DGRAM_SOCKET__CONNECT                0x00000800UL
++#define UNIX_DGRAM_SOCKET__LOCK                   0x00000040UL
++#define UNIX_DGRAM_SOCKET__IOCTL                  0x00000001UL
++#define UNIX_DGRAM_SOCKET__CREATE                 0x00000008UL
++#define UNIX_DGRAM_SOCKET__NAME_BIND              0x00200000UL
++#define UNIX_DGRAM_SOCKET__SEND_MSG               0x00100000UL
++#define UNIX_DGRAM_SOCKET__RECVFROM               0x00020000UL
++#define UNIX_DGRAM_SOCKET__GETATTR                0x00000010UL
++
++#define PROCESS__FORK                             0x00000001UL
++#define PROCESS__TRANSITION                       0x00000002UL
++#define PROCESS__SIGCHLD                          0x00000004UL
++#define PROCESS__SIGKILL                          0x00000008UL
++#define PROCESS__SIGSTOP                          0x00000010UL
++#define PROCESS__SIGNULL                          0x00000020UL
++#define PROCESS__SIGNAL                           0x00000040UL
++#define PROCESS__PTRACE                           0x00000080UL
++#define PROCESS__GETSCHED                         0x00000100UL
++#define PROCESS__SETSCHED                         0x00000200UL
++#define PROCESS__GETSESSION                       0x00000400UL
++#define PROCESS__GETPGID                          0x00000800UL
++#define PROCESS__SETPGID                          0x00001000UL
++#define PROCESS__GETCAP                           0x00002000UL
++#define PROCESS__SETCAP                           0x00004000UL
++#define PROCESS__SHARE                            0x00008000UL
++#define PROCESS__GETATTR                          0x00010000UL
++#define PROCESS__SETEXEC                          0x00020000UL
++#define PROCESS__SETFSCREATE                      0x00040000UL
++#define PROCESS__NOATSECURE                       0x00080000UL
++
++#define IPC__SETATTR                              0x00000008UL
++#define IPC__READ                                 0x00000010UL
++#define IPC__ASSOCIATE                            0x00000040UL
++#define IPC__DESTROY                              0x00000002UL
++#define IPC__UNIX_WRITE                           0x00000100UL
++#define IPC__CREATE                               0x00000001UL
++#define IPC__UNIX_READ                            0x00000080UL
++#define IPC__GETATTR                              0x00000004UL
++#define IPC__WRITE                                0x00000020UL
++
++#define SEM__SETATTR                              0x00000008UL
++#define SEM__READ                                 0x00000010UL
++#define SEM__ASSOCIATE                            0x00000040UL
++#define SEM__DESTROY                              0x00000002UL
++#define SEM__UNIX_WRITE                           0x00000100UL
++#define SEM__CREATE                               0x00000001UL
++#define SEM__UNIX_READ                            0x00000080UL
++#define SEM__GETATTR                              0x00000004UL
++#define SEM__WRITE                                0x00000020UL
++
++#define MSGQ__SETATTR                             0x00000008UL
++#define MSGQ__READ                                0x00000010UL
++#define MSGQ__ASSOCIATE                           0x00000040UL
++#define MSGQ__DESTROY                             0x00000002UL
++#define MSGQ__UNIX_WRITE                          0x00000100UL
++#define MSGQ__CREATE                              0x00000001UL
++#define MSGQ__UNIX_READ                           0x00000080UL
++#define MSGQ__GETATTR                             0x00000004UL
++#define MSGQ__WRITE                               0x00000020UL
++
++#define MSGQ__ENQUEUE                             0x00000200UL
++
++#define MSG__SEND                                 0x00000001UL
++#define MSG__RECEIVE                              0x00000002UL
++
++#define SHM__SETATTR                              0x00000008UL
++#define SHM__READ                                 0x00000010UL
++#define SHM__ASSOCIATE                            0x00000040UL
++#define SHM__DESTROY                              0x00000002UL
++#define SHM__UNIX_WRITE                           0x00000100UL
++#define SHM__CREATE                               0x00000001UL
++#define SHM__UNIX_READ                            0x00000080UL
++#define SHM__GETATTR                              0x00000004UL
++#define SHM__WRITE                                0x00000020UL
++
++#define SHM__LOCK                                 0x00000200UL
++
++#define SECURITY__COMPUTE_AV                      0x00000001UL
++#define SECURITY__COMPUTE_CREATE                  0x00000002UL
++#define SECURITY__COMPUTE_MEMBER                  0x00000004UL
++#define SECURITY__CHECK_CONTEXT                   0x00000008UL
++#define SECURITY__LOAD_POLICY                     0x00000010UL
++#define SECURITY__COMPUTE_RELABEL                 0x00000020UL
++#define SECURITY__COMPUTE_USER                    0x00000040UL
++#define SECURITY__SETENFORCE                      0x00000080UL
++
++#define SYSTEM__IPC_INFO                          0x00000001UL
++#define SYSTEM__SYSLOG_READ                       0x00000002UL
++#define SYSTEM__SYSLOG_MOD                        0x00000004UL
++#define SYSTEM__SYSLOG_CONSOLE                    0x00000008UL
++
++#define CAPABILITY__CHOWN                         0x00000001UL
++#define CAPABILITY__DAC_OVERRIDE                  0x00000002UL
++#define CAPABILITY__DAC_READ_SEARCH               0x00000004UL
++#define CAPABILITY__FOWNER                        0x00000008UL
++#define CAPABILITY__FSETID                        0x00000010UL
++#define CAPABILITY__KILL                          0x00000020UL
++#define CAPABILITY__SETGID                        0x00000040UL
++#define CAPABILITY__SETUID                        0x00000080UL
++#define CAPABILITY__SETPCAP                       0x00000100UL
++#define CAPABILITY__LINUX_IMMUTABLE               0x00000200UL
++#define CAPABILITY__NET_BIND_SERVICE              0x00000400UL
++#define CAPABILITY__NET_BROADCAST                 0x00000800UL
++#define CAPABILITY__NET_ADMIN                     0x00001000UL
++#define CAPABILITY__NET_RAW                       0x00002000UL
++#define CAPABILITY__IPC_LOCK                      0x00004000UL
++#define CAPABILITY__IPC_OWNER                     0x00008000UL
++#define CAPABILITY__SYS_MODULE                    0x00010000UL
++#define CAPABILITY__SYS_RAWIO                     0x00020000UL
++#define CAPABILITY__SYS_CHROOT                    0x00040000UL
++#define CAPABILITY__SYS_PTRACE                    0x00080000UL
++#define CAPABILITY__SYS_PACCT                     0x00100000UL
++#define CAPABILITY__SYS_ADMIN                     0x00200000UL
++#define CAPABILITY__SYS_BOOT                      0x00400000UL
++#define CAPABILITY__SYS_NICE                      0x00800000UL
++#define CAPABILITY__SYS_RESOURCE                  0x01000000UL
++#define CAPABILITY__SYS_TIME                      0x02000000UL
++#define CAPABILITY__SYS_TTY_CONFIG                0x04000000UL
++#define CAPABILITY__MKNOD                         0x08000000UL
++#define CAPABILITY__LEASE                         0x10000000UL
++
++#define PASSWD__PASSWD                            0x00000001UL
++#define PASSWD__CHFN                              0x00000002UL
++#define PASSWD__CHSH                              0x00000004UL
++
++
++/* FLASK */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/av_perm_to_string.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,120 @@
++/* This file is automatically generated.  Do not edit. */
++/* FLASK */
++
++struct av_perm_to_string
++{
++    u16 tclass;
++    u32 value;
++    char *name;
++};
++
++static struct av_perm_to_string av_perm_to_string[] = {
++   { SECCLASS_FILESYSTEM, FILESYSTEM__MOUNT, "mount" },
++   { SECCLASS_FILESYSTEM, FILESYSTEM__REMOUNT, "remount" },
++   { SECCLASS_FILESYSTEM, FILESYSTEM__UNMOUNT, "unmount" },
++   { SECCLASS_FILESYSTEM, FILESYSTEM__GETATTR, "getattr" },
++   { SECCLASS_FILESYSTEM, FILESYSTEM__RELABELFROM, "relabelfrom" },
++   { SECCLASS_FILESYSTEM, FILESYSTEM__RELABELTO, "relabelto" },
++   { SECCLASS_FILESYSTEM, FILESYSTEM__TRANSITION, "transition" },
++   { SECCLASS_FILESYSTEM, FILESYSTEM__ASSOCIATE, "associate" },
++   { SECCLASS_FILESYSTEM, FILESYSTEM__QUOTAMOD, "quotamod" },
++   { SECCLASS_FILESYSTEM, FILESYSTEM__QUOTAGET, "quotaget" },
++   { SECCLASS_DIR, DIR__ADD_NAME, "add_name" },
++   { SECCLASS_DIR, DIR__REMOVE_NAME, "remove_name" },
++   { SECCLASS_DIR, DIR__REPARENT, "reparent" },
++   { SECCLASS_DIR, DIR__SEARCH, "search" },
++   { SECCLASS_DIR, DIR__RMDIR, "rmdir" },
++   { SECCLASS_FILE, FILE__EXECUTE_NO_TRANS, "execute_no_trans" },
++   { SECCLASS_FILE, FILE__ENTRYPOINT, "entrypoint" },
++   { SECCLASS_FD, FD__USE, "use" },
++   { SECCLASS_TCP_SOCKET, TCP_SOCKET__CONNECTTO, "connectto" },
++   { SECCLASS_TCP_SOCKET, TCP_SOCKET__NEWCONN, "newconn" },
++   { SECCLASS_TCP_SOCKET, TCP_SOCKET__ACCEPTFROM, "acceptfrom" },
++   { SECCLASS_NODE, NODE__TCP_RECV, "tcp_recv" },
++   { SECCLASS_NODE, NODE__TCP_SEND, "tcp_send" },
++   { SECCLASS_NODE, NODE__UDP_RECV, "udp_recv" },
++   { SECCLASS_NODE, NODE__UDP_SEND, "udp_send" },
++   { SECCLASS_NODE, NODE__RAWIP_RECV, "rawip_recv" },
++   { SECCLASS_NODE, NODE__RAWIP_SEND, "rawip_send" },
++   { SECCLASS_NODE, NODE__ENFORCE_DEST, "enforce_dest" },
++   { SECCLASS_NETIF, NETIF__TCP_RECV, "tcp_recv" },
++   { SECCLASS_NETIF, NETIF__TCP_SEND, "tcp_send" },
++   { SECCLASS_NETIF, NETIF__UDP_RECV, "udp_recv" },
++   { SECCLASS_NETIF, NETIF__UDP_SEND, "udp_send" },
++   { SECCLASS_NETIF, NETIF__RAWIP_RECV, "rawip_recv" },
++   { SECCLASS_NETIF, NETIF__RAWIP_SEND, "rawip_send" },
++   { SECCLASS_UNIX_STREAM_SOCKET, UNIX_STREAM_SOCKET__CONNECTTO, "connectto" },
++   { SECCLASS_UNIX_STREAM_SOCKET, UNIX_STREAM_SOCKET__NEWCONN, "newconn" },
++   { SECCLASS_UNIX_STREAM_SOCKET, UNIX_STREAM_SOCKET__ACCEPTFROM, "acceptfrom" },
++   { SECCLASS_PROCESS, PROCESS__FORK, "fork" },
++   { SECCLASS_PROCESS, PROCESS__TRANSITION, "transition" },
++   { SECCLASS_PROCESS, PROCESS__SIGCHLD, "sigchld" },
++   { SECCLASS_PROCESS, PROCESS__SIGKILL, "sigkill" },
++   { SECCLASS_PROCESS, PROCESS__SIGSTOP, "sigstop" },
++   { SECCLASS_PROCESS, PROCESS__SIGNULL, "signull" },
++   { SECCLASS_PROCESS, PROCESS__SIGNAL, "signal" },
++   { SECCLASS_PROCESS, PROCESS__PTRACE, "ptrace" },
++   { SECCLASS_PROCESS, PROCESS__GETSCHED, "getsched" },
++   { SECCLASS_PROCESS, PROCESS__SETSCHED, "setsched" },
++   { SECCLASS_PROCESS, PROCESS__GETSESSION, "getsession" },
++   { SECCLASS_PROCESS, PROCESS__GETPGID, "getpgid" },
++   { SECCLASS_PROCESS, PROCESS__SETPGID, "setpgid" },
++   { SECCLASS_PROCESS, PROCESS__GETCAP, "getcap" },
++   { SECCLASS_PROCESS, PROCESS__SETCAP, "setcap" },
++   { SECCLASS_PROCESS, PROCESS__SHARE, "share" },
++   { SECCLASS_PROCESS, PROCESS__GETATTR, "getattr" },
++   { SECCLASS_PROCESS, PROCESS__SETEXEC, "setexec" },
++   { SECCLASS_PROCESS, PROCESS__SETFSCREATE, "setfscreate" },
++   { SECCLASS_PROCESS, PROCESS__NOATSECURE, "noatsecure" },
++   { SECCLASS_MSGQ, MSGQ__ENQUEUE, "enqueue" },
++   { SECCLASS_MSG, MSG__SEND, "send" },
++   { SECCLASS_MSG, MSG__RECEIVE, "receive" },
++   { SECCLASS_SHM, SHM__LOCK, "lock" },
++   { SECCLASS_SECURITY, SECURITY__COMPUTE_AV, "compute_av" },
++   { SECCLASS_SECURITY, SECURITY__COMPUTE_CREATE, "compute_create" },
++   { SECCLASS_SECURITY, SECURITY__COMPUTE_MEMBER, "compute_member" },
++   { SECCLASS_SECURITY, SECURITY__CHECK_CONTEXT, "check_context" },
++   { SECCLASS_SECURITY, SECURITY__LOAD_POLICY, "load_policy" },
++   { SECCLASS_SECURITY, SECURITY__COMPUTE_RELABEL, "compute_relabel" },
++   { SECCLASS_SECURITY, SECURITY__COMPUTE_USER, "compute_user" },
++   { SECCLASS_SECURITY, SECURITY__SETENFORCE, "setenforce" },
++   { SECCLASS_SYSTEM, SYSTEM__IPC_INFO, "ipc_info" },
++   { SECCLASS_SYSTEM, SYSTEM__SYSLOG_READ, "syslog_read" },
++   { SECCLASS_SYSTEM, SYSTEM__SYSLOG_MOD, "syslog_mod" },
++   { SECCLASS_SYSTEM, SYSTEM__SYSLOG_CONSOLE, "syslog_console" },
++   { SECCLASS_CAPABILITY, CAPABILITY__CHOWN, "chown" },
++   { SECCLASS_CAPABILITY, CAPABILITY__DAC_OVERRIDE, "dac_override" },
++   { SECCLASS_CAPABILITY, CAPABILITY__DAC_READ_SEARCH, "dac_read_search" },
++   { SECCLASS_CAPABILITY, CAPABILITY__FOWNER, "fowner" },
++   { SECCLASS_CAPABILITY, CAPABILITY__FSETID, "fsetid" },
++   { SECCLASS_CAPABILITY, CAPABILITY__KILL, "kill" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SETGID, "setgid" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SETUID, "setuid" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SETPCAP, "setpcap" },
++   { SECCLASS_CAPABILITY, CAPABILITY__LINUX_IMMUTABLE, "linux_immutable" },
++   { SECCLASS_CAPABILITY, CAPABILITY__NET_BIND_SERVICE, "net_bind_service" },
++   { SECCLASS_CAPABILITY, CAPABILITY__NET_BROADCAST, "net_broadcast" },
++   { SECCLASS_CAPABILITY, CAPABILITY__NET_ADMIN, "net_admin" },
++   { SECCLASS_CAPABILITY, CAPABILITY__NET_RAW, "net_raw" },
++   { SECCLASS_CAPABILITY, CAPABILITY__IPC_LOCK, "ipc_lock" },
++   { SECCLASS_CAPABILITY, CAPABILITY__IPC_OWNER, "ipc_owner" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_MODULE, "sys_module" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_RAWIO, "sys_rawio" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_CHROOT, "sys_chroot" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_PTRACE, "sys_ptrace" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_PACCT, "sys_pacct" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_ADMIN, "sys_admin" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_BOOT, "sys_boot" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_NICE, "sys_nice" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_RESOURCE, "sys_resource" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_TIME, "sys_time" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_TTY_CONFIG, "sys_tty_config" },
++   { SECCLASS_CAPABILITY, CAPABILITY__MKNOD, "mknod" },
++   { SECCLASS_CAPABILITY, CAPABILITY__LEASE, "lease" },
++   { SECCLASS_PASSWD, PASSWD__PASSWD, "passwd" },
++   { SECCLASS_PASSWD, PASSWD__CHFN, "chfn" },
++   { SECCLASS_PASSWD, PASSWD__CHSH, "chsh" },
++};
++
++
++/* FLASK */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/class_to_string.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,39 @@
++/* This file is automatically generated.  Do not edit. */
++/*
++ * Security object class definitions
++ */
++static char *class_to_string[] =
++{
++    "null",
++    "security",
++    "process",
++    "system",
++    "capability",
++    "filesystem",
++    "file",
++    "dir",
++    "fd",
++    "lnk_file",
++    "chr_file",
++    "blk_file",
++    "sock_file",
++    "fifo_file",
++    "socket",
++    "tcp_socket",
++    "udp_socket",
++    "rawip_socket",
++    "node",
++    "netif",
++    "netlink_socket",
++    "packet_socket",
++    "key_socket",
++    "unix_stream_socket",
++    "unix_dgram_socket",
++    "sem",
++    "msg",
++    "msgq",
++    "shm",
++    "ipc",
++    "passwd",
++};
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/common_perm_to_string.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,65 @@
++/* This file is automatically generated.  Do not edit. */
++/* FLASK */
++
++static char *common_file_perm_to_string[] =
++{
++    "ioctl",
++    "read",
++    "write",
++    "create",
++    "getattr",
++    "setattr",
++    "lock",
++    "relabelfrom",
++    "relabelto",
++    "append",
++    "unlink",
++    "link",
++    "rename",
++    "execute",
++    "swapon",
++    "quotaon",
++    "mounton",
++};
++
++static char *common_socket_perm_to_string[] =
++{
++    "ioctl",
++    "read",
++    "write",
++    "create",
++    "getattr",
++    "setattr",
++    "lock",
++    "relabelfrom",
++    "relabelto",
++    "append",
++    "bind",
++    "connect",
++    "listen",
++    "accept",
++    "getopt",
++    "setopt",
++    "shutdown",
++    "recvfrom",
++    "sendto",
++    "recv_msg",
++    "send_msg",
++    "name_bind",
++};
++
++static char *common_ipc_perm_to_string[] =
++{
++    "create",
++    "destroy",
++    "getattr",
++    "setattr",
++    "read",
++    "write",
++    "associate",
++    "unix_read",
++    "unix_write",
++};
++
++
++/* FLASK */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/flask.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,71 @@
++/* This file is automatically generated.  Do not edit. */
++#ifndef _SELINUX_FLASK_H_
++#define _SELINUX_FLASK_H_
++
++/*
++ * Security object class definitions
++ */
++#define SECCLASS_SECURITY                                1
++#define SECCLASS_PROCESS                                 2
++#define SECCLASS_SYSTEM                                  3
++#define SECCLASS_CAPABILITY                              4
++#define SECCLASS_FILESYSTEM                              5
++#define SECCLASS_FILE                                    6
++#define SECCLASS_DIR                                     7
++#define SECCLASS_FD                                      8
++#define SECCLASS_LNK_FILE                                9
++#define SECCLASS_CHR_FILE                                10
++#define SECCLASS_BLK_FILE                                11
++#define SECCLASS_SOCK_FILE                               12
++#define SECCLASS_FIFO_FILE                               13
++#define SECCLASS_SOCKET                                  14
++#define SECCLASS_TCP_SOCKET                              15
++#define SECCLASS_UDP_SOCKET                              16
++#define SECCLASS_RAWIP_SOCKET                            17
++#define SECCLASS_NODE                                    18
++#define SECCLASS_NETIF                                   19
++#define SECCLASS_NETLINK_SOCKET                          20
++#define SECCLASS_PACKET_SOCKET                           21
++#define SECCLASS_KEY_SOCKET                              22
++#define SECCLASS_UNIX_STREAM_SOCKET                      23
++#define SECCLASS_UNIX_DGRAM_SOCKET                       24
++#define SECCLASS_SEM                                     25
++#define SECCLASS_MSG                                     26
++#define SECCLASS_MSGQ                                    27
++#define SECCLASS_SHM                                     28
++#define SECCLASS_IPC                                     29
++#define SECCLASS_PASSWD                                  30
++
++/*
++ * Security identifier indices for initial entities
++ */
++#define SECINITSID_KERNEL                               1
++#define SECINITSID_SECURITY                             2
++#define SECINITSID_UNLABELED                            3
++#define SECINITSID_FS                                   4
++#define SECINITSID_FILE                                 5
++#define SECINITSID_FILE_LABELS                          6
++#define SECINITSID_INIT                                 7
++#define SECINITSID_ANY_SOCKET                           8
++#define SECINITSID_PORT                                 9
++#define SECINITSID_NETIF                                10
++#define SECINITSID_NETMSG                               11
++#define SECINITSID_NODE                                 12
++#define SECINITSID_IGMP_PACKET                          13
++#define SECINITSID_ICMP_SOCKET                          14
++#define SECINITSID_TCP_SOCKET                           15
++#define SECINITSID_SYSCTL_MODPROBE                      16
++#define SECINITSID_SYSCTL                               17
++#define SECINITSID_SYSCTL_FS                            18
++#define SECINITSID_SYSCTL_KERNEL                        19
++#define SECINITSID_SYSCTL_NET                           20
++#define SECINITSID_SYSCTL_NET_UNIX                      21
++#define SECINITSID_SYSCTL_VM                            22
++#define SECINITSID_SYSCTL_DEV                           23
++#define SECINITSID_KMOD                                 24
++#define SECINITSID_POLICY                               25
++#define SECINITSID_SCMP_PACKET                          26
++
++#define SECINITSID_NUM                                  26
++
++#endif
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/initial_sid_to_string.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,32 @@
++/* This file is automatically generated.  Do not edit. */
++static char *initial_sid_to_string[] =
++{
++    "null",
++    "kernel",
++    "security",
++    "unlabeled",
++    "fs",
++    "file",
++    "file_labels",
++    "init",
++    "any_socket",
++    "port",
++    "netif",
++    "netmsg",
++    "node",
++    "igmp_packet",
++    "icmp_socket",
++    "tcp_socket",
++    "sysctl_modprobe",
++    "sysctl",
++    "sysctl_fs",
++    "sysctl_kernel",
++    "sysctl_net",
++    "sysctl_net_unix",
++    "sysctl_vm",
++    "sysctl_dev",
++    "kmod",
++    "policy",
++    "scmp_packet",
++};
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/objsec.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,88 @@
++/*
++ *  NSA Security-Enhanced Linux (SELinux) security module
++ *
++ *  This file contains the SELinux security data structures for kernel objects.
++ *
++ *  Author(s):  Stephen Smalley, <sds@epoch.ncsc.mil>
++ *              Chris Vance, <cvance@nai.com>
++ *              Wayne Salamon, <wsalamon@nai.com>
++ *              James Morris <jmorris@redhat.com>
++ *
++ *  Copyright (C) 2001,2002 Networks Associates Technology, Inc.
++ *  Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.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 _SELINUX_OBJSEC_H_
++#define _SELINUX_OBJSEC_H_
++
++#include <linux/list.h>
++#include <linux/sched.h>
++#include <linux/fs.h>
++#include <linux/in.h>
++#include "flask.h"
++#include "avc.h"
++
++struct task_security_struct {
++        unsigned long magic;           /* magic number for this module */
++	struct task_struct *task;      /* back pointer to task object */
++	u32 osid;            /* SID prior to last execve */
++	u32 sid;             /* current SID */
++	u32 exec_sid;        /* exec SID */
++	u32 create_sid;      /* fscreate SID */
++        struct avc_entry_ref avcr;     /* reference to process permissions */
++};
++
++struct inode_security_struct {
++	unsigned long magic;           /* magic number for this module */
++        struct inode *inode;           /* back pointer to inode object */
++	struct list_head list;         /* list of inode_security_struct */
++	u32 task_sid;        /* SID of creating task */
++	u32 sid;             /* SID of this object */
++	u16 sclass;       /* security class of this object */
++	struct avc_entry_ref avcr;     /* reference to object permissions */
++	unsigned char initialized;     /* initialization flag */
++	struct semaphore sem;
++	unsigned char inherit;         /* inherit SID from parent entry */
++};
++
++struct file_security_struct {
++	unsigned long magic;            /* magic number for this module */
++	struct file *file;              /* back pointer to file object */
++	u32 sid;              /* SID of open file description */
++	u32 fown_sid;         /* SID of file owner (for SIGIO) */
++	struct avc_entry_ref avcr;	/* reference to fd permissions */
++	struct avc_entry_ref inode_avcr;     /* reference to object permissions */
++};
++
++struct superblock_security_struct {
++	unsigned long magic;            /* magic number for this module */
++	struct super_block *sb;         /* back pointer to sb object */
++	struct list_head list;          /* list of superblock_security_struct */
++	u32 sid;              /* SID of file system */
++	unsigned int behavior;          /* labeling behavior */
++	unsigned char initialized;      /* initialization flag */
++	unsigned char proc;             /* proc fs */
++	struct semaphore sem;
++};
++
++struct msg_security_struct {
++        unsigned long magic;		/* magic number for this module */
++	struct msg_msg *msg;		/* back pointer */
++	u32 sid;              /* SID of message */
++        struct avc_entry_ref avcr;	/* reference to permissions */
++};
++
++struct ipc_security_struct {
++        unsigned long magic;		/* magic number for this module */
++	struct kern_ipc_perm *ipc_perm; /* back pointer */
++	u16 sclass;	/* security class of this object */
++	u32 sid;              /* SID of IPC resource */
++        struct avc_entry_ref avcr;	/* reference to permissions */
++};
++
++extern int inode_security_set_sid(struct inode *inode, u32 sid);
++
++#endif /* _SELINUX_OBJSEC_H_ */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/security.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,70 @@
++/*
++ * Security server interface.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SELINUX_SECURITY_H_
++#define _SELINUX_SECURITY_H_
++
++#include "flask.h"
++
++#define SECSID_NULL			0x00000000 /* unspecified SID */
++#define SECSID_WILD			0xffffffff /* wildcard SID */
++#define SECCLASS_NULL			0x0000 /* no class */
++
++#define SELINUX_MAGIC 0xf97cff8c
++
++int security_load_policy(void * data, size_t len);
++
++struct av_decision {
++	u32 allowed;
++	u32 decided;
++	u32 auditallow;
++	u32 auditdeny;
++	u32 seqno;
++};
++
++int security_compute_av(u32 ssid, u32 tsid,
++	u16 tclass, u32 requested,
++	struct av_decision *avd);
++
++int security_transition_sid(u32 ssid, u32 tsid,
++	u16 tclass, u32 *out_sid);
++
++int security_member_sid(u32 ssid, u32 tsid,
++	u16 tclass, u32 *out_sid);
++
++int security_change_sid(u32 ssid, u32 tsid,
++	u16 tclass, u32 *out_sid);
++
++int security_sid_to_context(u32 sid, char **scontext,
++	u32 *scontext_len);
++
++int security_context_to_sid(char *scontext, u32 scontext_len,
++	u32 *out_sid);
++
++int security_get_user_sids(u32 callsid, char *username,
++			   u32 **sids, u32 *nel);
++
++int security_port_sid(u16 domain, u16 type, u8 protocol, u16 port,
++	u32 *out_sid);
++
++int security_netif_sid(char *name, u32 *if_sid,
++	u32 *msg_sid);
++
++int security_node_sid(u16 domain, void *addr, u32 addrlen,
++	u32 *out_sid);
++
++#define SECURITY_FS_USE_XATTR 1 /* use xattr */
++#define SECURITY_FS_USE_TRANS 2 /* use transition SIDs, e.g. devpts/tmpfs */
++#define SECURITY_FS_USE_TASK  3 /* use task SIDs, e.g. pipefs/sockfs */
++#define SECURITY_FS_USE_GENFS 4 /* use the genfs support */
++#define SECURITY_FS_USE_NONE  5 /* no labeling support */
++int security_fs_use(const char *fstype, unsigned int *behavior,
++	u32 *sid);
++
++int security_genfs_sid(const char *fstype, char *name, u16 sclass,
++	u32 *sid);
++
++#endif /* _SELINUX_SECURITY_H_ */
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/Kconfig	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,34 @@
++config SECURITY_SELINUX
++	bool "NSA SELinux Support"
++	depends on SECURITY
++	default n
++	help
++	  This enables NSA Security-Enhanced Linux (SELinux).
++	  You will also need a policy configuration and a labeled filesystem.
++	  You can obtain the policy compiler (checkpolicy), the utility for
++	  labeling filesystems (setfiles), and an example policy configuration
++	  from http://www.nsa.gov/selinux.
++	  If you are unsure how to answer this question, answer N.
++
++config SECURITY_SELINUX_DEVELOP
++	bool "NSA SELinux Development Support"
++	depends on SECURITY_SELINUX
++	default y
++	help
++	  This enables the development support option of NSA SELinux,
++	  which is useful for experimenting with SELinux and developing
++	  policies.  If unsure, say Y.  With this option enabled, the
++	  kernel will start in permissive mode (log everything, deny nothing)
++	  unless you specify enforcing=1 on the kernel command line.  You
++	  can interactively toggle the kernel between enforcing mode and
++	  permissive mode (if permitted by the policy) via /selinux/enforce.
++
++config SECURITY_SELINUX_MLS
++	bool "NSA SELinux MLS policy (EXPERIMENTAL)"
++	depends on SECURITY_SELINUX && EXPERIMENTAL
++	default n
++	help
++	  This enables the NSA SELinux Multi-Level Security (MLS) policy in
++	  addition to the default RBAC/TE policy.  This policy is
++	  experimental and has not been configured for use.  Unless you
++	  specifically want to experiment with MLS, say N.
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/Makefile	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,10 @@
++#
++# Makefile for building the SELinux module as part of the kernel tree.
++#
++
++obj-$(CONFIG_SECURITY_SELINUX) := selinux.o ss/
++
++selinux-objs := avc.o hooks.o selinuxfs.o
++
++EXTRA_CFLAGS += -Isecurity/selinux/include
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/selinuxfs.c	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,593 @@
++#include <linux/config.h>
++#include <linux/kernel.h>
++#include <linux/slab.h>
++#include <linux/vmalloc.h>
++#include <linux/fs.h>
++#include <linux/init.h>
++#include <linux/string.h>
++#include <linux/security.h>
++#include <asm/uaccess.h>
++
++/* selinuxfs pseudo filesystem for exporting the security policy API.
++   Based on the proc code and the fs/nfsd/nfsctl.c code. */
++
++#include "flask.h"
++#include "avc.h"
++#include "avc_ss.h"
++#include "security.h"
++#include "objsec.h"
++
++/* Check whether a task is allowed to use a security operation. */
++int task_has_security(struct task_struct *tsk,
++		      u32 perms)
++{
++	struct task_security_struct *tsec;
++
++	tsec = tsk->security;
++
++	return avc_has_perm(tsec->sid, SECINITSID_SECURITY,
++			    SECCLASS_SECURITY, perms, NULL, NULL);
++}
++
++enum sel_inos {
++	SEL_ROOT_INO = 2,
++	SEL_LOAD,	/* load policy */
++	SEL_ENFORCE,	/* get or set enforcing status */
++	SEL_CONTEXT,	/* validate context */
++	SEL_ACCESS,	/* compute access decision */
++	SEL_CREATE,	/* compute create labeling decision */
++	SEL_RELABEL,	/* compute relabeling decision */
++	SEL_USER	/* compute reachable user contexts */
++};
++
++static ssize_t sel_read_enforce(struct file *filp, char *buf,
++				size_t count, loff_t *ppos)
++{
++	char *page;
++	ssize_t length;
++	ssize_t end;
++
++	if (count < 0 || count > PAGE_SIZE)
++		return -EINVAL;
++	if (!(page = (char*)__get_free_page(GFP_KERNEL)))
++		return -ENOMEM;
++	memset(page, 0, PAGE_SIZE);
++
++	length = snprintf(page, PAGE_SIZE, "%d", selinux_enforcing);
++	if (length < 0) {
++		free_page((unsigned long)page);
++		return length;
++	}
++
++	if (*ppos >= length) {
++		free_page((unsigned long)page);
++		return 0;
++	}
++	if (count + *ppos > length)
++		count = length - *ppos;
++	end = count + *ppos;
++	if (copy_to_user(buf, (char *) page + *ppos, count)) {
++		count = -EFAULT;
++		goto out;
++	}
++	*ppos = end;
++out:
++	free_page((unsigned long)page);
++	return count;
++}
++
++#ifdef CONFIG_SECURITY_SELINUX_DEVELOP
++static ssize_t sel_write_enforce(struct file * file, const char * buf,
++				 size_t count, loff_t *ppos)
++
++{
++	char *page;
++	ssize_t length;
++	int new_value;
++
++	if (count < 0 || count >= PAGE_SIZE)
++		return -ENOMEM;
++	if (*ppos != 0) {
++		/* No partial writes. */
++		return -EINVAL;
++	}
++	page = (char*)__get_free_page(GFP_KERNEL);
++	if (!page)
++		return -ENOMEM;
++	memset(page, 0, PAGE_SIZE);
++	length = -EFAULT;
++	if (copy_from_user(page, buf, count))
++		goto out;
++
++	length = -EINVAL;
++	if (sscanf(page, "%d", &new_value) != 1)
++		goto out;
++
++	if (new_value != selinux_enforcing) {
++		length = task_has_security(current, SECURITY__SETENFORCE);
++		if (length)
++			goto out;
++		selinux_enforcing = new_value;
++		if (selinux_enforcing)
++			avc_ss_reset(0);
++	}
++	length = count;
++out:
++	free_page((unsigned long) page);
++	return length;
++}
++#else
++#define sel_write_enforce NULL
++#endif
++
++static struct file_operations sel_enforce_ops = {
++	.read		= sel_read_enforce,
++	.write		= sel_write_enforce,
++};
++
++static ssize_t sel_write_load(struct file * file, const char * buf,
++			      size_t count, loff_t *ppos)
++
++{
++	ssize_t length;
++	void *data;
++
++	length = task_has_security(current, SECURITY__LOAD_POLICY);
++	if (length)
++		return length;
++
++	if (*ppos != 0) {
++		/* No partial writes. */
++		return -EINVAL;
++	}
++
++	if ((count < 0) || (count > 64 * 1024 * 1024) || (data = vmalloc(count)) == NULL)
++		return -ENOMEM;
++
++	length = -EFAULT;
++	if (copy_from_user(data, buf, count) != 0)
++		goto out;
++
++	length = security_load_policy(data, count);
++	if (length)
++		goto out;
++
++	length = count;
++out:
++	vfree(data);
++	return length;
++}
++
++static struct file_operations sel_load_ops = {
++	.write		= sel_write_load,
++};
++
++
++static ssize_t sel_write_context(struct file * file, const char * buf,
++				 size_t count, loff_t *ppos)
++
++{
++	char *page;
++	u32 sid;
++	ssize_t length;
++
++	length = task_has_security(current, SECURITY__CHECK_CONTEXT);
++	if (length)
++		return length;
++
++	if (count < 0 || count >= PAGE_SIZE)
++		return -ENOMEM;
++	if (*ppos != 0) {
++		/* No partial writes. */
++		return -EINVAL;
++	}
++	page = (char*)__get_free_page(GFP_KERNEL);
++	if (!page)
++		return -ENOMEM;
++	memset(page, 0, PAGE_SIZE);
++	length = -EFAULT;
++	if (copy_from_user(page, buf, count))
++		goto out;
++
++	length = security_context_to_sid(page, count, &sid);
++	if (length < 0)
++		goto out;
++
++	length = count;
++out:
++	free_page((unsigned long) page);
++	return length;
++}
++
++static struct file_operations sel_context_ops = {
++	.write		= sel_write_context,
++};
++
++
++/*
++ * Remaining nodes use transaction based IO methods like nfsd/nfsctl.c
++ */
++static ssize_t sel_write_access(struct file * file, char *buf, size_t size);
++static ssize_t sel_write_create(struct file * file, char *buf, size_t size);
++static ssize_t sel_write_relabel(struct file * file, char *buf, size_t size);
++static ssize_t sel_write_user(struct file * file, char *buf, size_t size);
++
++static ssize_t (*write_op[])(struct file *, char *, size_t) = {
++	[SEL_ACCESS] = sel_write_access,
++	[SEL_CREATE] = sel_write_create,
++	[SEL_RELABEL] = sel_write_relabel,
++	[SEL_USER] = sel_write_user,
++};
++
++/* an argresp is stored in an allocated page and holds the
++ * size of the argument or response, along with its content
++ */
++struct argresp {
++	ssize_t size;
++	char data[0];
++};
++
++#define PAYLOAD_SIZE (PAGE_SIZE - sizeof(struct argresp))
++
++/*
++ * transaction based IO methods.
++ * The file expects a single write which triggers the transaction, and then
++ * possibly a read which collects the result - which is stored in a
++ * file-local buffer.
++ */
++static ssize_t TA_write(struct file *file, const char *buf, size_t size, loff_t *pos)
++{
++	ino_t ino =  file->f_dentry->d_inode->i_ino;
++	struct argresp *ar;
++	ssize_t rv = 0;
++
++	if (ino >= sizeof(write_op)/sizeof(write_op[0]) || !write_op[ino])
++		return -EINVAL;
++	if (file->private_data)
++		return -EINVAL; /* only one write allowed per open */
++	if (size > PAYLOAD_SIZE - 1) /* allow one byte for null terminator */
++		return -EFBIG;
++
++	ar = kmalloc(PAGE_SIZE, GFP_KERNEL);
++	if (!ar)
++		return -ENOMEM;
++	memset(ar, 0, PAGE_SIZE); /* clear buffer, particularly last byte */
++	ar->size = 0;
++	down(&file->f_dentry->d_inode->i_sem);
++	if (file->private_data)
++		rv = -EINVAL;
++	else
++		file->private_data = ar;
++	up(&file->f_dentry->d_inode->i_sem);
++	if (rv) {
++		kfree(ar);
++		return rv;
++	}
++	if (copy_from_user(ar->data, buf, size))
++		return -EFAULT;
++
++	rv =  write_op[ino](file, ar->data, size);
++	if (rv>0) {
++		ar->size = rv;
++		rv = size;
++	}
++	return rv;
++}
++
++static ssize_t TA_read(struct file *file, char *buf, size_t size, loff_t *pos)
++{
++	struct argresp *ar;
++	ssize_t rv = 0;
++
++	if (file->private_data == NULL)
++		rv = TA_write(file, buf, 0, pos);
++	if (rv < 0)
++		return rv;
++
++	ar = file->private_data;
++	if (!ar)
++		return 0;
++	if (*pos >= ar->size)
++		return 0;
++	if (*pos + size > ar->size)
++		size = ar->size - *pos;
++	if (copy_to_user(buf, ar->data + *pos, size))
++		return -EFAULT;
++	*pos += size;
++	return size;
++}
++
++static int TA_open(struct inode *inode, struct file *file)
++{
++	file->private_data = NULL;
++	return 0;
++}
++
++static int TA_release(struct inode *inode, struct file *file)
++{
++	void *p = file->private_data;
++	file->private_data = NULL;
++	kfree(p);
++	return 0;
++}
++
++static struct file_operations transaction_ops = {
++	.write		= TA_write,
++	.read		= TA_read,
++	.open		= TA_open,
++	.release	= TA_release,
++};
++
++/*
++ * payload - write methods
++ * If the method has a response, the response should be put in buf,
++ * and the length returned.  Otherwise return 0 or and -error.
++ */
++
++static ssize_t sel_write_access(struct file * file, char *buf, size_t size)
++{
++	char *scon, *tcon;
++	u32 ssid, tsid;
++	u16 tclass;
++	u32 req;
++	struct av_decision avd;
++	ssize_t length;
++
++	length = task_has_security(current, SECURITY__COMPUTE_AV);
++	if (length)
++		return length;
++
++	length = -ENOMEM;
++	scon = kmalloc(size+1, GFP_KERNEL);
++	if (!scon)
++		return length;
++	memset(scon, 0, size+1);
++
++	tcon = kmalloc(size+1, GFP_KERNEL);
++	if (!tcon)
++		goto out;
++	memset(tcon, 0, size+1);
++
++	length = -EINVAL;
++	if (sscanf(buf, "%s %s %hu %x", scon, tcon, &tclass, &req) != 4)
++		goto out2;
++
++	length = security_context_to_sid(scon, strlen(scon)+1, &ssid);
++	if (length < 0)
++		goto out2;
++	length = security_context_to_sid(tcon, strlen(tcon)+1, &tsid);
++	if (length < 0)
++		goto out2;
++
++	length = security_compute_av(ssid, tsid, tclass, req, &avd);
++	if (length < 0)
++		goto out2;
++
++	length = snprintf(buf, PAYLOAD_SIZE, "%x %x %x %x %u",
++			  avd.allowed, avd.decided,
++			  avd.auditallow, avd.auditdeny,
++			  avd.seqno);
++out2:
++	kfree(tcon);
++out:
++	kfree(scon);
++	return length;
++}
++
++static ssize_t sel_write_create(struct file * file, char *buf, size_t size)
++{
++	char *scon, *tcon;
++	u32 ssid, tsid, newsid;
++	u16 tclass;
++	ssize_t length;
++	char *newcon;
++	u32 len;
++
++	length = task_has_security(current, SECURITY__COMPUTE_CREATE);
++	if (length)
++		return length;
++
++	length = -ENOMEM;
++	scon = kmalloc(size+1, GFP_KERNEL);
++	if (!scon)
++		return length;
++	memset(scon, 0, size+1);
++
++	tcon = kmalloc(size+1, GFP_KERNEL);
++	if (!tcon)
++		goto out;
++	memset(tcon, 0, size+1);
++
++	length = -EINVAL;
++	if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3)
++		goto out2;
++
++	length = security_context_to_sid(scon, strlen(scon)+1, &ssid);
++	if (length < 0)
++		goto out2;
++	length = security_context_to_sid(tcon, strlen(tcon)+1, &tsid);
++	if (length < 0)
++		goto out2;
++
++	length = security_transition_sid(ssid, tsid, tclass, &newsid);
++	if (length < 0)
++		goto out2;
++
++	length = security_sid_to_context(newsid, &newcon, &len);
++	if (length < 0)
++		goto out2;
++
++	if (len > PAYLOAD_SIZE) {
++		printk(KERN_ERR "%s:  context size (%u) exceeds payload "
++		       "max\n", __FUNCTION__, len);
++		length = -ERANGE;
++		goto out3;
++	}
++
++	memcpy(buf, newcon, len);
++	length = len;
++out3:
++	kfree(newcon);
++out2:
++	kfree(tcon);
++out:
++	kfree(scon);
++	return length;
++}
++
++static ssize_t sel_write_relabel(struct file * file, char *buf, size_t size)
++{
++	char *scon, *tcon;
++	u32 ssid, tsid, newsid;
++	u16 tclass;
++	ssize_t length;
++	char *newcon;
++	u32 len;
++
++	length = task_has_security(current, SECURITY__COMPUTE_RELABEL);
++	if (length)
++		return length;
++
++	length = -ENOMEM;
++	scon = kmalloc(size+1, GFP_KERNEL);
++	if (!scon)
++		return length;
++	memset(scon, 0, size+1);
++
++	tcon = kmalloc(size+1, GFP_KERNEL);
++	if (!tcon)
++		goto out;
++	memset(tcon, 0, size+1);
++
++	length = -EINVAL;
++	if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3)
++		goto out2;
++
++	length = security_context_to_sid(scon, strlen(scon)+1, &ssid);
++	if (length < 0)
++		goto out2;
++	length = security_context_to_sid(tcon, strlen(tcon)+1, &tsid);
++	if (length < 0)
++		goto out2;
++
++	length = security_change_sid(ssid, tsid, tclass, &newsid);
++	if (length < 0)
++		goto out2;
++
++	length = security_sid_to_context(newsid, &newcon, &len);
++	if (length < 0)
++		goto out2;
++
++	if (len > PAYLOAD_SIZE) {
++		length = -ERANGE;
++		goto out3;
++	}
++
++	memcpy(buf, newcon, len);
++	length = len;
++out3:
++	kfree(newcon);
++out2:
++	kfree(tcon);
++out:
++	kfree(scon);
++	return length;
++}
++
++static ssize_t sel_write_user(struct file * file, char *buf, size_t size)
++{
++	char *con, *user, *ptr;
++	u32 sid, *sids;
++	ssize_t length;
++	char *newcon;
++	int i, rc;
++	u32 len, nsids;
++
++	length = task_has_security(current, SECURITY__COMPUTE_USER);
++	if (length)
++		return length;
++
++	length = -ENOMEM;
++	con = kmalloc(size+1, GFP_KERNEL);
++	if (!con)
++		return length;
++	memset(con, 0, size+1);
++
++	user = kmalloc(size+1, GFP_KERNEL);
++	if (!user)
++		goto out;
++	memset(user, 0, size+1);
++
++	length = -EINVAL;
++	if (sscanf(buf, "%s %s", con, user) != 2)
++		goto out2;
++
++	length = security_context_to_sid(con, strlen(con)+1, &sid);
++	if (length < 0)
++		goto out2;
++
++	length = security_get_user_sids(sid, user, &sids, &nsids);
++	if (length < 0)
++		goto out2;
++
++	length = sprintf(buf, "%u", nsids) + 1;
++	ptr = buf + length;
++	for (i = 0; i < nsids; i++) {
++		rc = security_sid_to_context(sids[i], &newcon, &len);
++		if (rc) {
++			length = rc;
++			goto out3;
++		}
++		if ((length + len) >= PAYLOAD_SIZE) {
++			kfree(newcon);
++			length = -ERANGE;
++			goto out3;
++		}
++		memcpy(ptr, newcon, len);
++		kfree(newcon);
++		ptr += len;
++		length += len;
++	}
++out3:
++	kfree(sids);
++out2:
++	kfree(user);
++out:
++	kfree(con);
++	return length;
++}
++
++
++static int sel_fill_super(struct super_block * sb, void * data, int silent)
++{
++	static struct tree_descr selinux_files[] = {
++		[SEL_LOAD] = {"load", &sel_load_ops, S_IRUSR|S_IWUSR},
++		[SEL_ENFORCE] = {"enforce", &sel_enforce_ops, S_IRUSR|S_IWUSR},
++		[SEL_CONTEXT] = {"context", &sel_context_ops, S_IRUGO|S_IWUGO},
++		[SEL_ACCESS] = {"access", &transaction_ops, S_IRUGO|S_IWUGO},
++		[SEL_CREATE] = {"create", &transaction_ops, S_IRUGO|S_IWUGO},
++		[SEL_RELABEL] = {"relabel", &transaction_ops, S_IRUGO|S_IWUGO},
++		[SEL_USER] = {"user", &transaction_ops, S_IRUGO|S_IWUGO},
++		/* last one */ {""}
++	};
++	return simple_fill_super(sb, SELINUX_MAGIC, selinux_files);
++}
++
++static struct super_block *sel_get_sb(struct file_system_type *fs_type,
++				      int flags, const char *dev_name, void *data)
++{
++	return get_sb_single(fs_type, flags, data, sel_fill_super);
++}
++
++static struct file_system_type sel_fs_type = {
++	.name		= "selinuxfs",
++	.get_sb		= sel_get_sb,
++	.kill_sb	= kill_litter_super,
++};
++
++static int __init init_sel_fs(void)
++{
++	return register_filesystem(&sel_fs_type);
++}
++
++__initcall(init_sel_fs);
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/avtab.c	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,264 @@
++/*
++ * Implementation of the access vector table type.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#include "avtab.h"
++#include "policydb.h"
++
++#define AVTAB_HASH(keyp) \
++((keyp->target_class + \
++ (keyp->target_type << 2) + \
++ (keyp->source_type << 9)) & \
++ AVTAB_HASH_MASK)
++
++int avtab_insert(struct avtab *h, struct avtab_key *key, struct avtab_datum *datum)
++{
++	int hvalue;
++	struct avtab_node *prev, *cur, *newnode;
++
++	if (!h)
++		return -EINVAL;
++
++	hvalue = AVTAB_HASH(key);
++	for (prev = NULL, cur = h->htable[hvalue];
++	     cur;
++	     prev = cur, cur = cur->next) {
++		if (key->source_type == cur->key.source_type &&
++		    key->target_type == cur->key.target_type &&
++		    key->target_class == cur->key.target_class &&
++		    (datum->specified & cur->datum.specified))
++			return -EEXIST;
++		if (key->source_type < cur->key.source_type)
++			break;
++		if (key->source_type == cur->key.source_type &&
++		    key->target_type < cur->key.target_type)
++			break;
++		if (key->source_type == cur->key.source_type &&
++		    key->target_type == cur->key.target_type &&
++		    key->target_class < cur->key.target_class)
++			break;
++	}
++
++	newnode = kmalloc(sizeof(*newnode), GFP_KERNEL);
++	if (newnode == NULL)
++		return -ENOMEM;
++	memset(newnode, 0, sizeof(*newnode));
++	newnode->key = *key;
++	newnode->datum = *datum;
++	if (prev) {
++		newnode->next = prev->next;
++		prev->next = newnode;
++	} else {
++		newnode->next = h->htable[hvalue];
++		h->htable[hvalue] = newnode;
++	}
++
++	h->nel++;
++	return 0;
++}
++
++
++struct avtab_datum *avtab_search(struct avtab *h, struct avtab_key *key, int specified)
++{
++	int hvalue;
++	struct avtab_node *cur;
++
++	if (!h)
++		return NULL;
++
++	hvalue = AVTAB_HASH(key);
++	for (cur = h->htable[hvalue]; cur; cur = cur->next) {
++		if (key->source_type == cur->key.source_type &&
++		    key->target_type == cur->key.target_type &&
++		    key->target_class == cur->key.target_class &&
++		    (specified & cur->datum.specified))
++			return &cur->datum;
++
++		if (key->source_type < cur->key.source_type)
++			break;
++		if (key->source_type == cur->key.source_type &&
++		    key->target_type < cur->key.target_type)
++			break;
++		if (key->source_type == cur->key.source_type &&
++		    key->target_type == cur->key.target_type &&
++		    key->target_class < cur->key.target_class)
++			break;
++	}
++
++	return NULL;
++}
++
++void avtab_destroy(struct avtab *h)
++{
++	int i;
++	struct avtab_node *cur, *temp;
++
++	if (!h)
++		return;
++
++	for (i = 0; i < AVTAB_SIZE; i++) {
++		cur = h->htable[i];
++		while (cur != NULL) {
++			temp = cur;
++			cur = cur->next;
++			kfree(temp);
++		}
++		h->htable[i] = NULL;
++	}
++	kfree(h->htable);
++}
++
++
++int avtab_map(struct avtab *h,
++	      int (*apply) (struct avtab_key *k,
++			    struct avtab_datum *d,
++			    void *args),
++	      void *args)
++{
++	int i, ret;
++	struct avtab_node *cur;
++
++	if (!h)
++		return 0;
++
++	for (i = 0; i < AVTAB_SIZE; i++) {
++		cur = h->htable[i];
++		while (cur != NULL) {
++			ret = apply(&cur->key, &cur->datum, args);
++			if (ret)
++				return ret;
++			cur = cur->next;
++		}
++	}
++	return 0;
++}
++
++int avtab_init(struct avtab *h)
++{
++	int i;
++
++	h->htable = kmalloc(sizeof(*(h->htable)) * AVTAB_SIZE, GFP_KERNEL);
++	if (!h->htable)
++		return -ENOMEM;
++	for (i = 0; i < AVTAB_SIZE; i++)
++		h->htable[i] = NULL;
++	h->nel = 0;
++	return 0;
++}
++
++void avtab_hash_eval(struct avtab *h, char *tag)
++{
++	int i, chain_len, slots_used, max_chain_len;
++	struct avtab_node *cur;
++
++	slots_used = 0;
++	max_chain_len = 0;
++	for (i = 0; i < AVTAB_SIZE; i++) {
++		cur = h->htable[i];
++		if (cur) {
++			slots_used++;
++			chain_len = 0;
++			while (cur) {
++				chain_len++;
++				cur = cur->next;
++			}
++
++			if (chain_len > max_chain_len)
++				max_chain_len = chain_len;
++		}
++	}
++
++	printk(KERN_INFO "%s:  %d entries and %d/%d buckets used, longest "
++	       "chain length %d\n", tag, h->nel, slots_used, AVTAB_SIZE,
++	       max_chain_len);
++}
++
++int avtab_read(struct avtab *a, void *fp, u32 config)
++{
++	int i, rc = -EINVAL;
++	struct avtab_key avkey;
++	struct avtab_datum avdatum;
++	u32 *buf;
++	u32 nel, items, items2;
++
++
++	buf = next_entry(fp, sizeof(u32));
++	if (!buf) {
++		printk(KERN_ERR "security: avtab: truncated table\n");
++		goto bad;
++	}
++	nel = le32_to_cpu(buf[0]);
++	if (!nel) {
++		printk(KERN_ERR "security: avtab: table is empty\n");
++		goto bad;
++	}
++	for (i = 0; i < nel; i++) {
++		memset(&avkey, 0, sizeof(avkey));
++		memset(&avdatum, 0, sizeof(avdatum));
++
++		buf = next_entry(fp, sizeof(u32));
++		if (!buf) {
++			printk(KERN_ERR "security: avtab: truncated entry\n");
++			goto bad;
++		}
++		items2 = le32_to_cpu(buf[0]);
++		buf = next_entry(fp, sizeof(u32)*items2);
++		if (!buf) {
++			printk(KERN_ERR "security: avtab: truncated entry\n");
++			goto bad;
++		}
++		items = 0;
++		avkey.source_type = le32_to_cpu(buf[items++]);
++		avkey.target_type = le32_to_cpu(buf[items++]);
++		avkey.target_class = le32_to_cpu(buf[items++]);
++		avdatum.specified = le32_to_cpu(buf[items++]);
++		if (!(avdatum.specified & (AVTAB_AV | AVTAB_TYPE))) {
++			printk(KERN_ERR "security: avtab: null entry\n");
++			goto bad;
++		}
++		if ((avdatum.specified & AVTAB_AV) &&
++		    (avdatum.specified & AVTAB_TYPE)) {
++			printk(KERN_ERR "security: avtab: entry has both "
++			       "access vectors and types\n");
++			goto bad;
++		}
++		if (avdatum.specified & AVTAB_AV) {
++			if (avdatum.specified & AVTAB_ALLOWED)
++				avtab_allowed(&avdatum) = le32_to_cpu(buf[items++]);
++			if (avdatum.specified & AVTAB_AUDITDENY)
++				avtab_auditdeny(&avdatum) = le32_to_cpu(buf[items++]);
++			if (avdatum.specified & AVTAB_AUDITALLOW)
++				avtab_auditallow(&avdatum) = le32_to_cpu(buf[items++]);
++		} else {
++			if (avdatum.specified & AVTAB_TRANSITION)
++				avtab_transition(&avdatum) = le32_to_cpu(buf[items++]);
++			if (avdatum.specified & AVTAB_CHANGE)
++				avtab_change(&avdatum) = le32_to_cpu(buf[items++]);
++			if (avdatum.specified & AVTAB_MEMBER)
++				avtab_member(&avdatum) = le32_to_cpu(buf[items++]);
++		}
++		if (items != items2) {
++			printk(KERN_ERR "security: avtab: entry only had %d "
++			       "items, expected %d\n", items2, items);
++			goto bad;
++		}
++		rc = avtab_insert(a, &avkey, &avdatum);
++		if (rc) {
++			if (rc == -ENOMEM)
++				printk(KERN_ERR "security: avtab: out of memory\n");
++			if (rc == -EEXIST)
++				printk(KERN_ERR "security: avtab: duplicate entry\n");
++			goto bad;
++		}
++	}
++
++	rc = 0;
++out:
++	return rc;
++
++bad:
++	avtab_destroy(a);
++	goto out;
++}
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/avtab.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,68 @@
++/*
++ * An access vector table (avtab) is a hash table
++ * of access vectors and transition types indexed
++ * by a type pair and a class.  An access vector
++ * table is used to represent the type enforcement
++ * tables.
++ *
++ *  Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_AVTAB_H_
++#define _SS_AVTAB_H_
++
++struct avtab_key {
++	u32 source_type;	/* source type */
++	u32 target_type;	/* target type */
++	u32 target_class;	/* target object class */
++};
++
++struct avtab_datum {
++#define AVTAB_ALLOWED     1
++#define AVTAB_AUDITALLOW  2
++#define AVTAB_AUDITDENY   4
++#define AVTAB_AV         (AVTAB_ALLOWED | AVTAB_AUDITALLOW | AVTAB_AUDITDENY)
++#define AVTAB_TRANSITION 16
++#define AVTAB_MEMBER     32
++#define AVTAB_CHANGE     64
++#define AVTAB_TYPE       (AVTAB_TRANSITION | AVTAB_MEMBER | AVTAB_CHANGE)
++	u32 specified;	/* what fields are specified */
++	u32 data[3];	/* access vectors or types */
++#define avtab_allowed(x) (x)->data[0]
++#define avtab_auditdeny(x) (x)->data[1]
++#define avtab_auditallow(x) (x)->data[2]
++#define avtab_transition(x) (x)->data[0]
++#define avtab_change(x) (x)->data[1]
++#define avtab_member(x) (x)->data[2]
++};
++
++struct avtab_node {
++	struct avtab_key key;
++	struct avtab_datum datum;
++	struct avtab_node *next;
++};
++
++struct avtab {
++	struct avtab_node **htable;
++	u32 nel;	/* number of elements */
++};
++
++int avtab_init(struct avtab *);
++int avtab_insert(struct avtab *h, struct avtab_key *k, struct avtab_datum *d);
++struct avtab_datum *avtab_search(struct avtab *h, struct avtab_key *k, int specified);
++void avtab_destroy(struct avtab *h);
++int avtab_map(struct avtab *h,
++	      int (*apply) (struct avtab_key *k,
++			    struct avtab_datum *d,
++			    void *args),
++	      void *args);
++void avtab_hash_eval(struct avtab *h, char *tag);
++int avtab_read(struct avtab *a, void *fp, u32 config);
++
++#define AVTAB_HASH_BITS 15
++#define AVTAB_HASH_BUCKETS (1 << AVTAB_HASH_BITS)
++#define AVTAB_HASH_MASK (AVTAB_HASH_BUCKETS-1)
++
++#define AVTAB_SIZE AVTAB_HASH_BUCKETS
++
++#endif	/* _SS_AVTAB_H_ */
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/constraint.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,54 @@
++/*
++ * A constraint is a condition that must be satisfied in
++ * order for one or more permissions to be granted.
++ * Constraints are used to impose additional restrictions
++ * beyond the type-based rules in `te' or the role-based
++ * transition rules in `rbac'.  Constraints are typically
++ * used to prevent a process from transitioning to a new user
++ * identity or role unless it is in a privileged type.
++ * Constraints are likewise typically used to prevent a
++ * process from labeling an object with a different user
++ * identity.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_CONSTRAINT_H_
++#define _SS_CONSTRAINT_H_
++
++#include "ebitmap.h"
++
++#define CEXPR_MAXDEPTH 5
++
++struct constraint_expr {
++#define CEXPR_NOT		1 /* not expr */
++#define CEXPR_AND		2 /* expr and expr */
++#define CEXPR_OR		3 /* expr or expr */
++#define CEXPR_ATTR		4 /* attr op attr */
++#define CEXPR_NAMES		5 /* attr op names */
++	u32 expr_type;		/* expression type */
++
++#define CEXPR_USER 1		/* user */
++#define CEXPR_ROLE 2		/* role */
++#define CEXPR_TYPE 4		/* type */
++#define CEXPR_TARGET 8		/* target if set, source otherwise */
++	u32 attr;		/* attribute */
++
++#define CEXPR_EQ     1		/* == or eq */
++#define CEXPR_NEQ    2		/* != */
++#define CEXPR_DOM    3		/* dom */
++#define CEXPR_DOMBY  4		/* domby  */
++#define CEXPR_INCOMP 5		/* incomp */
++	u32 op;			/* operator */
++
++	struct ebitmap names;	/* names */
++
++	struct constraint_expr *next;   /* next expression */
++};
++
++struct constraint_node {
++	u32 permissions;	/* constrained permissions */
++	struct constraint_expr *expr;	/* constraint on permissions */
++	struct constraint_node *next;	/* next constraint */
++};
++
++#endif	/* _SS_CONSTRAINT_H_ */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/context.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,117 @@
++/*
++ * A security context is a set of security attributes
++ * associated with each subject and object controlled
++ * by the security policy.  Security contexts are
++  * externally represented as variable-length strings
++ * that can be interpreted by a user or application
++ * with an understanding of the security policy.
++ * Internally, the security server uses a simple
++ * structure.  This structure is private to the
++ * security server and can be changed without affecting
++ * clients of the security server.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_CONTEXT_H_
++#define _SS_CONTEXT_H_
++
++#include "ebitmap.h"
++#include "mls_types.h"
++
++/*
++ * A security context consists of an authenticated user
++ * identity, a role, a type and a MLS range.
++ */
++struct context {
++	u32 user;
++	u32 role;
++	u32 type;
++#ifdef CONFIG_SECURITY_SELINUX_MLS
++	struct mls_range range;
++#endif
++};
++
++#ifdef CONFIG_SECURITY_SELINUX_MLS
++
++static inline void mls_context_init(struct context *c)
++{
++	memset(&c->range, 0, sizeof(c->range));
++}
++
++static inline int mls_context_cpy(struct context *dst, struct context *src)
++{
++	int rc;
++
++	dst->range.level[0].sens = src->range.level[0].sens;
++	rc = ebitmap_cpy(&dst->range.level[0].cat, &src->range.level[0].cat);
++	if (rc)
++		goto out;
++
++	dst->range.level[1].sens = src->range.level[1].sens;
++	rc = ebitmap_cpy(&dst->range.level[1].cat, &src->range.level[1].cat);
++	if (rc)
++		ebitmap_destroy(&dst->range.level[0].cat);
++out:
++	return rc;
++}
++
++static inline int mls_context_cmp(struct context *c1, struct context *c2)
++{
++	return ((c1->range.level[0].sens == c2->range.level[0].sens) &&
++		ebitmap_cmp(&c1->range.level[0].cat,&c2->range.level[0].cat) &&
++		(c1->range.level[1].sens == c2->range.level[1].sens) &&
++		ebitmap_cmp(&c1->range.level[1].cat,&c2->range.level[1].cat));
++}
++
++static inline void mls_context_destroy(struct context *c)
++{
++	ebitmap_destroy(&c->range.level[0].cat);
++	ebitmap_destroy(&c->range.level[1].cat);
++	mls_context_init(c);
++}
++
++#else
++
++static inline void mls_context_init(struct context *c)
++{ }
++
++static inline int mls_context_cpy(struct context *dst, struct context *src)
++{ return 0; }
++
++static inline int mls_context_cmp(struct context *c1, struct context *c2)
++{ return 1; }
++
++static inline void mls_context_destroy(struct context *c)
++{ }
++
++#endif
++
++static inline void context_init(struct context *c)
++{
++	memset(c, 0, sizeof(*c));
++}
++
++static inline int context_cpy(struct context *dst, struct context *src)
++{
++	dst->user = src->user;
++	dst->role = src->role;
++	dst->type = src->type;
++	return mls_context_cpy(dst, src);
++}
++
++static inline void context_destroy(struct context *c)
++{
++	c->user = c->role = c->type = 0;
++	mls_context_destroy(c);
++}
++
++static inline int context_cmp(struct context *c1, struct context *c2)
++{
++	return ((c1->user == c2->user) &&
++		(c1->role == c2->role) &&
++		(c1->type == c2->type) &&
++		mls_context_cmp(c1, c2));
++}
++
++#endif	/* _SS_CONTEXT_H_ */
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/ebitmap.c	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,332 @@
++/*
++ * Implementation of the extensible bitmap type.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#include "ebitmap.h"
++#include "policydb.h"
++
++int ebitmap_or(struct ebitmap *dst, struct ebitmap *e1, struct ebitmap *e2)
++{
++	struct ebitmap_node *n1, *n2, *new, *prev;
++
++	ebitmap_init(dst);
++
++	n1 = e1->node;
++	n2 = e2->node;
++	prev = 0;
++	while (n1 || n2) {
++		new = kmalloc(sizeof(*new), GFP_ATOMIC);
++		if (!new) {
++			ebitmap_destroy(dst);
++			return -ENOMEM;
++		}
++		memset(new, 0, sizeof(*new));
++		if (n1 && n2 && n1->startbit == n2->startbit) {
++			new->startbit = n1->startbit;
++			new->map = n1->map | n2->map;
++			n1 = n1->next;
++			n2 = n2->next;
++		} else if (!n2 || (n1 && n1->startbit < n2->startbit)) {
++			new->startbit = n1->startbit;
++			new->map = n1->map;
++			n1 = n1->next;
++		} else {
++			new->startbit = n2->startbit;
++			new->map = n2->map;
++			n2 = n2->next;
++		}
++
++		new->next = 0;
++		if (prev)
++			prev->next = new;
++		else
++			dst->node = new;
++		prev = new;
++	}
++
++	dst->highbit = (e1->highbit > e2->highbit) ? e1->highbit : e2->highbit;
++	return 0;
++}
++
++int ebitmap_cmp(struct ebitmap *e1, struct ebitmap *e2)
++{
++	struct ebitmap_node *n1, *n2;
++
++	if (e1->highbit != e2->highbit)
++		return 0;
++
++	n1 = e1->node;
++	n2 = e2->node;
++	while (n1 && n2 &&
++	       (n1->startbit == n2->startbit) &&
++	       (n1->map == n2->map)) {
++		n1 = n1->next;
++		n2 = n2->next;
++	}
++
++	if (n1 || n2)
++		return 0;
++
++	return 1;
++}
++
++int ebitmap_cpy(struct ebitmap *dst, struct ebitmap *src)
++{
++	struct ebitmap_node *n, *new, *prev;
++
++	ebitmap_init(dst);
++	n = src->node;
++	prev = 0;
++	while (n) {
++		new = kmalloc(sizeof(*new), GFP_ATOMIC);
++		if (!new) {
++			ebitmap_destroy(dst);
++			return -ENOMEM;
++		}
++		memset(new, 0, sizeof(*new));
++		new->startbit = n->startbit;
++		new->map = n->map;
++		new->next = 0;
++		if (prev)
++			prev->next = new;
++		else
++			dst->node = new;
++		prev = new;
++		n = n->next;
++	}
++
++	dst->highbit = src->highbit;
++	return 0;
++}
++
++int ebitmap_contains(struct ebitmap *e1, struct ebitmap *e2)
++{
++	struct ebitmap_node *n1, *n2;
++
++	if (e1->highbit < e2->highbit)
++		return 0;
++
++	n1 = e1->node;
++	n2 = e2->node;
++	while (n1 && n2 && (n1->startbit <= n2->startbit)) {
++		if (n1->startbit < n2->startbit) {
++			n1 = n1->next;
++			continue;
++		}
++		if ((n1->map & n2->map) != n2->map)
++			return 0;
++
++		n1 = n1->next;
++		n2 = n2->next;
++	}
++
++	if (n2)
++		return 0;
++
++	return 1;
++}
++
++int ebitmap_get_bit(struct ebitmap *e, unsigned long bit)
++{
++	struct ebitmap_node *n;
++
++	if (e->highbit < bit)
++		return 0;
++
++	n = e->node;
++	while (n && (n->startbit <= bit)) {
++		if ((n->startbit + MAPSIZE) > bit) {
++			if (n->map & (MAPBIT << (bit - n->startbit)))
++				return 1;
++			else
++				return 0;
++		}
++		n = n->next;
++	}
++
++	return 0;
++}
++
++int ebitmap_set_bit(struct ebitmap *e, unsigned long bit, int value)
++{
++	struct ebitmap_node *n, *prev, *new;
++
++	prev = 0;
++	n = e->node;
++	while (n && n->startbit <= bit) {
++		if ((n->startbit + MAPSIZE) > bit) {
++			if (value) {
++				n->map |= (MAPBIT << (bit - n->startbit));
++			} else {
++				n->map &= ~(MAPBIT << (bit - n->startbit));
++				if (!n->map) {
++					/* drop this node from the bitmap */
++
++					if (!n->next) {
++						/*
++						 * this was the highest map
++						 * within the bitmap
++						 */
++						if (prev)
++							e->highbit = prev->startbit + MAPSIZE;
++						else
++							e->highbit = 0;
++					}
++					if (prev)
++						prev->next = n->next;
++					else
++						e->node = n->next;
++
++					kfree(n);
++				}
++			}
++			return 0;
++		}
++		prev = n;
++		n = n->next;
++	}
++
++	if (!value)
++		return 0;
++
++	new = kmalloc(sizeof(*new), GFP_ATOMIC);
++	if (!new)
++		return -ENOMEM;
++	memset(new, 0, sizeof(*new));
++
++	new->startbit = bit & ~(MAPSIZE - 1);
++	new->map = (MAPBIT << (bit - new->startbit));
++
++	if (!n)
++		/* this node will be the highest map within the bitmap */
++		e->highbit = new->startbit + MAPSIZE;
++
++	if (prev) {
++		new->next = prev->next;
++		prev->next = new;
++	} else {
++		new->next = e->node;
++		e->node = new;
++	}
++
++	return 0;
++}
++
++void ebitmap_destroy(struct ebitmap *e)
++{
++	struct ebitmap_node *n, *temp;
++
++	if (!e)
++		return;
++
++	n = e->node;
++	while (n) {
++		temp = n;
++		n = n->next;
++		kfree(temp);
++	}
++
++	e->highbit = 0;
++	e->node = 0;
++	return;
++}
++
++int ebitmap_read(struct ebitmap *e, void *fp)
++{
++	int rc = -EINVAL;
++	struct ebitmap_node *n, *l;
++	u32 *buf, mapsize, count, i;
++	u64 map;
++
++	ebitmap_init(e);
++
++	buf = next_entry(fp, sizeof(u32)*3);
++	if (!buf)
++		goto out;
++
++	mapsize = le32_to_cpu(buf[0]);
++	e->highbit = le32_to_cpu(buf[1]);
++	count = le32_to_cpu(buf[2]);
++
++	if (mapsize != MAPSIZE) {
++		printk(KERN_ERR "security: ebitmap: map size %d does not "
++		       "match my size %d (high bit was %d)\n", mapsize,
++		       MAPSIZE, e->highbit);
++		goto out;
++	}
++	if (!e->highbit) {
++		e->node = NULL;
++		goto ok;
++	}
++	if (e->highbit & (MAPSIZE - 1)) {
++		printk(KERN_ERR "security: ebitmap: high bit (%d) is not a "
++		       "multiple of the map size (%d)\n", e->highbit, MAPSIZE);
++		goto bad;
++	}
++	l = NULL;
++	for (i = 0; i < count; i++) {
++		buf = next_entry(fp, sizeof(u32));
++		if (!buf) {
++			printk(KERN_ERR "security: ebitmap: truncated map\n");
++			goto bad;
++		}
++		n = kmalloc(sizeof(*n), GFP_KERNEL);
++		if (!n) {
++			printk(KERN_ERR "security: ebitmap: out of memory\n");
++			rc = -ENOMEM;
++			goto bad;
++		}
++		memset(n, 0, sizeof(*n));
++
++		n->startbit = le32_to_cpu(buf[0]);
++
++		if (n->startbit & (MAPSIZE - 1)) {
++			printk(KERN_ERR "security: ebitmap start bit (%d) is "
++			       "not a multiple of the map size (%d)\n",
++			       n->startbit, MAPSIZE);
++			goto bad_free;
++		}
++		if (n->startbit > (e->highbit - MAPSIZE)) {
++			printk(KERN_ERR "security: ebitmap start bit (%d) is "
++			       "beyond the end of the bitmap (%d)\n",
++			       n->startbit, (e->highbit - MAPSIZE));
++			goto bad_free;
++		}
++		buf = next_entry(fp, sizeof(u64));
++		if (!buf) {
++			printk(KERN_ERR "security: ebitmap: truncated map\n");
++			goto bad_free;
++		}
++		memcpy(&map, buf, sizeof(u64));
++		n->map = le64_to_cpu(map);
++
++		if (!n->map) {
++			printk(KERN_ERR "security: ebitmap: null map in "
++			       "ebitmap (startbit %d)\n", n->startbit);
++			goto bad_free;
++		}
++		if (l) {
++			if (n->startbit <= l->startbit) {
++				printk(KERN_ERR "security: ebitmap: start "
++				       "bit %d comes after start bit %d\n",
++				       n->startbit, l->startbit);
++				goto bad_free;
++			}
++			l->next = n;
++		} else
++			e->node = n;
++
++		l = n;
++	}
++
++ok:
++	rc = 0;
++out:
++	return rc;
++bad_free:
++	kfree(n);
++bad:
++	ebitmap_destroy(e);
++	goto out;
++}
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/ebitmap.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,49 @@
++/*
++ * An extensible bitmap is a bitmap that supports an
++ * arbitrary number of bits.  Extensible bitmaps are
++ * used to represent sets of values, such as types,
++ * roles, categories, and classes.
++ *
++ * Each extensible bitmap is implemented as a linked
++ * list of bitmap nodes, where each bitmap node has
++ * an explicitly specified starting bit position within
++ * the total bitmap.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_EBITMAP_H_
++#define _SS_EBITMAP_H_
++
++#define MAPTYPE u64			/* portion of bitmap in each node */
++#define MAPSIZE (sizeof(MAPTYPE) * 8)	/* number of bits in node bitmap */
++#define MAPBIT  1ULL			/* a bit in the node bitmap */
++
++struct ebitmap_node {
++	u32 startbit;		/* starting position in the total bitmap */
++	MAPTYPE map;		/* this node's portion of the bitmap */
++	struct ebitmap_node *next;
++};
++
++struct ebitmap {
++	struct ebitmap_node *node;	/* first node in the bitmap */
++	u32 highbit;	/* highest position in the total bitmap */
++};
++
++#define ebitmap_length(e) ((e)->highbit)
++#define ebitmap_startbit(e) ((e)->node ? (e)->node->startbit : 0)
++
++static inline void ebitmap_init(struct ebitmap *e)
++{
++	memset(e, 0, sizeof(*e));
++}
++
++int ebitmap_cmp(struct ebitmap *e1, struct ebitmap *e2);
++int ebitmap_or(struct ebitmap *dst, struct ebitmap *e1, struct ebitmap *e2);
++int ebitmap_cpy(struct ebitmap *dst, struct ebitmap *src);
++int ebitmap_contains(struct ebitmap *e1, struct ebitmap *e2);
++int ebitmap_get_bit(struct ebitmap *e, unsigned long bit);
++int ebitmap_set_bit(struct ebitmap *e, unsigned long bit, int value);
++void ebitmap_destroy(struct ebitmap *e);
++int ebitmap_read(struct ebitmap *e, void *fp);
++
++#endif	/* _SS_EBITMAP_H_ */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/global.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,17 @@
++#ifndef _SS_GLOBAL_H_
++#define _SS_GLOBAL_H_
++
++#include <linux/kernel.h>
++#include <linux/slab.h>
++#include <linux/string.h>
++#include <linux/ctype.h>
++#include <linux/in.h>
++#include <linux/spinlock.h>
++#include <asm/semaphore.h>
++
++#include "flask.h"
++#include "avc.h"
++#include "avc_ss.h"
++#include "security.h"
++
++#endif /* _SS_GLOBAL_H_ */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/hashtab.c	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,277 @@
++/*
++ * Implementation of the hash table type.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#include "hashtab.h"
++
++struct hashtab *hashtab_create(u32 (*hash_value)(struct hashtab *h, void *key),
++                               int (*keycmp)(struct hashtab *h, void *key1, void *key2),
++                               u32 size)
++{
++	struct hashtab *p;
++	u32 i;
++
++	p = kmalloc(sizeof(*p), GFP_KERNEL);
++	if (p == NULL)
++		return p;
++
++	memset(p, 0, sizeof(*p));
++	p->size = size;
++	p->nel = 0;
++	p->hash_value = hash_value;
++	p->keycmp = keycmp;
++	p->htable = kmalloc(sizeof(*(p->htable)) * size, GFP_KERNEL);
++	if (p->htable == NULL) {
++		kfree(p);
++		return NULL;
++	}
++
++	for (i = 0; i < size; i++)
++		p->htable[i] = NULL;
++
++	return p;
++}
++
++int hashtab_insert(struct hashtab *h, void *key, void *datum)
++{
++	u32 hvalue;
++	struct hashtab_node *prev, *cur, *newnode;
++
++	if (!h || h->nel == HASHTAB_MAX_NODES)
++		return -EINVAL;
++
++	hvalue = h->hash_value(h, key);
++	prev = NULL;
++	cur = h->htable[hvalue];
++	while (cur && h->keycmp(h, key, cur->key) > 0) {
++		prev = cur;
++		cur = cur->next;
++	}
++
++	if (cur && (h->keycmp(h, key, cur->key) == 0))
++		return -EEXIST;
++
++	newnode = kmalloc(sizeof(*newnode), GFP_KERNEL);
++	if (newnode == NULL)
++		return -ENOMEM;
++	memset(newnode, 0, sizeof(*newnode));
++	newnode->key = key;
++	newnode->datum = datum;
++	if (prev) {
++		newnode->next = prev->next;
++		prev->next = newnode;
++	} else {
++		newnode->next = h->htable[hvalue];
++		h->htable[hvalue] = newnode;
++	}
++
++	h->nel++;
++	return 0;
++}
++
++int hashtab_remove(struct hashtab *h, void *key,
++		   void (*destroy)(void *k, void *d, void *args),
++		   void *args)
++{
++	u32 hvalue;
++	struct hashtab_node *cur, *last;
++
++	if (!h)
++		return -EINVAL;
++
++	hvalue = h->hash_value(h, key);
++	last = NULL;
++	cur = h->htable[hvalue];
++	while (cur != NULL && h->keycmp(h, key, cur->key) > 0) {
++		last = cur;
++		cur = cur->next;
++	}
++
++	if (cur == NULL || (h->keycmp(h, key, cur->key) != 0))
++		return -ENOENT;
++
++	if (last == NULL)
++		h->htable[hvalue] = cur->next;
++	else
++		last->next = cur->next;
++
++	if (destroy)
++		destroy(cur->key, cur->datum, args);
++	kfree(cur);
++	h->nel--;
++	return 0;
++}
++
++int hashtab_replace(struct hashtab *h, void *key, void *datum,
++		    void (*destroy)(void *k, void *d, void *args),
++		    void *args)
++{
++	u32 hvalue;
++	struct hashtab_node *prev, *cur, *newnode;
++
++	if (!h)
++		return -EINVAL;
++
++	hvalue = h->hash_value(h, key);
++	prev = NULL;
++	cur = h->htable[hvalue];
++	while (cur != NULL && h->keycmp(h, key, cur->key) > 0) {
++		prev = cur;
++		cur = cur->next;
++	}
++
++	if (cur && (h->keycmp(h, key, cur->key) == 0)) {
++		if (destroy)
++			destroy(cur->key, cur->datum, args);
++		cur->key = key;
++		cur->datum = datum;
++	} else {
++		newnode = kmalloc(sizeof(*newnode), GFP_KERNEL);
++		if (newnode == NULL)
++			return -ENOMEM;
++		memset(newnode, 0, sizeof(*newnode));
++		newnode->key = key;
++		newnode->datum = datum;
++		if (prev) {
++			newnode->next = prev->next;
++			prev->next = newnode;
++		} else {
++			newnode->next = h->htable[hvalue];
++			h->htable[hvalue] = newnode;
++		}
++	}
++
++	return 0;
++}
++
++void *hashtab_search(struct hashtab *h, void *key)
++{
++	u32 hvalue;
++	struct hashtab_node *cur;
++
++	if (!h)
++		return NULL;
++
++	hvalue = h->hash_value(h, key);
++	cur = h->htable[hvalue];
++	while (cur != NULL && h->keycmp(h, key, cur->key) > 0)
++		cur = cur->next;
++
++	if (cur == NULL || (h->keycmp(h, key, cur->key) != 0))
++		return NULL;
++
++	return cur->datum;
++}
++
++void hashtab_destroy(struct hashtab *h)
++{
++	u32 i;
++	struct hashtab_node *cur, *temp;
++
++	if (!h)
++		return;
++
++	for (i = 0; i < h->size; i++) {
++		cur = h->htable[i];
++		while (cur != NULL) {
++			temp = cur;
++			cur = cur->next;
++			kfree(temp);
++		}
++		h->htable[i] = NULL;
++	}
++
++	kfree(h->htable);
++	h->htable = NULL;
++
++	kfree(h);
++}
++
++int hashtab_map(struct hashtab *h,
++		int (*apply)(void *k, void *d, void *args),
++		void *args)
++{
++	u32 i;
++	int ret;
++	struct hashtab_node *cur;
++
++	if (!h)
++		return 0;
++
++	for (i = 0; i < h->size; i++) {
++		cur = h->htable[i];
++		while (cur != NULL) {
++			ret = apply(cur->key, cur->datum, args);
++			if (ret)
++				return ret;
++			cur = cur->next;
++		}
++	}
++	return 0;
++}
++
++
++void hashtab_map_remove_on_error(struct hashtab *h,
++                                 int (*apply)(void *k, void *d, void *args),
++                                 void (*destroy)(void *k, void *d, void *args),
++                                 void *args)
++{
++	u32 i;
++	int ret;
++	struct hashtab_node *last, *cur, *temp;
++
++	if (!h)
++		return;
++
++	for (i = 0; i < h->size; i++) {
++		last = NULL;
++		cur = h->htable[i];
++		while (cur != NULL) {
++			ret = apply(cur->key, cur->datum, args);
++			if (ret) {
++				if (last)
++					last->next = cur->next;
++				else
++					h->htable[i] = cur->next;
++
++				temp = cur;
++				cur = cur->next;
++				if (destroy)
++					destroy(temp->key, temp->datum, args);
++				kfree(temp);
++				h->nel--;
++			} else {
++				last = cur;
++				cur = cur->next;
++			}
++		}
++	}
++	return;
++}
++
++void hashtab_stat(struct hashtab *h, struct hashtab_info *info)
++{
++	u32 i, chain_len, slots_used, max_chain_len;
++	struct hashtab_node *cur;
++
++	slots_used = 0;
++	max_chain_len = 0;
++	for (slots_used = max_chain_len = i = 0; i < h->size; i++) {
++		cur = h->htable[i];
++		if (cur) {
++			slots_used++;
++			chain_len = 0;
++			while (cur) {
++				chain_len++;
++				cur = cur->next;
++			}
++
++			if (chain_len > max_chain_len)
++				max_chain_len = chain_len;
++		}
++	}
++
++	info->slots_used = slots_used;
++	info->max_chain_len = max_chain_len;
++}
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/hashtab.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,125 @@
++/*
++ * A hash table (hashtab) maintains associations between
++ * key values and datum values.  The type of the key values
++ * and the type of the datum values is arbitrary.  The
++ * functions for hash computation and key comparison are
++ * provided by the creator of the table.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_HASHTAB_H_
++#define _SS_HASHTAB_H_
++
++#define HASHTAB_MAX_NODES	0xffffffff
++
++struct hashtab_node {
++	void *key;
++	void *datum;
++	struct hashtab_node *next;
++};
++
++struct hashtab {
++	struct hashtab_node **htable;	/* hash table */
++	u32 size;			/* number of slots in hash table */
++	u32 nel;			/* number of elements in hash table */
++	u32 (*hash_value)(struct hashtab *h, void *key);
++					/* hash function */
++	int (*keycmp)(struct hashtab *h, void *key1, void *key2);
++					/* key comparison function */
++};
++
++struct hashtab_info {
++	u32 slots_used;
++	u32 max_chain_len;
++};
++
++/*
++ * Creates a new hash table with the specified characteristics.
++ *
++ * Returns NULL if insufficent space is available or
++ * the new hash table otherwise.
++ */
++struct hashtab *hashtab_create(u32 (*hash_value)(struct hashtab *h, void *key),
++                               int (*keycmp)(struct hashtab *h, void *key1, void *key2),
++                               u32 size);
++
++/*
++ * Inserts the specified (key, datum) pair into the specified hash table.
++ *
++ * Returns -ENOMEM on memory allocation error,
++ * -EEXIST if there is already an entry with the same key,
++ * -EINVAL for general errors or
++ * 0 otherwise.
++ */
++int hashtab_insert(struct hashtab *h, void *k, void *d);
++
++/*
++ * Removes the entry with the specified key from the hash table.
++ * Applies the specified destroy function to (key,datum,args) for
++ * the entry.
++ *
++ * Returns -ENOENT if no entry has the specified key,
++ * -EINVAL for general errors or
++ *0 otherwise.
++ */
++int hashtab_remove(struct hashtab *h, void *k,
++		   void (*destroy)(void *k, void *d, void *args),
++		   void *args);
++
++/*
++ * Insert or replace the specified (key, datum) pair in the specified
++ * hash table.  If an entry for the specified key already exists,
++ * then the specified destroy function is applied to (key,datum,args)
++ * for the entry prior to replacing the entry's contents.
++ *
++ * Returns -ENOMEM if insufficient space is available,
++ * -EINVAL for general errors or
++ * 0 otherwise.
++ */
++int hashtab_replace(struct hashtab *h, void *k, void *d,
++		    void (*destroy)(void *k, void *d, void *args),
++		    void *args);
++
++/*
++ * Searches for the entry with the specified key in the hash table.
++ *
++ * Returns NULL if no entry has the specified key or
++ * the datum of the entry otherwise.
++ */
++void *hashtab_search(struct hashtab *h, void *k);
++
++/*
++ * Destroys the specified hash table.
++ */
++void hashtab_destroy(struct hashtab *h);
++
++/*
++ * Applies the specified apply function to (key,datum,args)
++ * for each entry in the specified hash table.
++ *
++ * The order in which the function is applied to the entries
++ * is dependent upon the internal structure of the hash table.
++ *
++ * If apply returns a non-zero status, then hashtab_map will cease
++ * iterating through the hash table and will propagate the error
++ * return to its caller.
++ */
++int hashtab_map(struct hashtab *h,
++		int (*apply)(void *k, void *d, void *args),
++		void *args);
++
++/*
++ * Same as hashtab_map, except that if apply returns a non-zero status,
++ * then the (key,datum) pair will be removed from the hashtab and the
++ * destroy function will be applied to (key,datum,args).
++ */
++void hashtab_map_remove_on_error(struct hashtab *h,
++                                 int (*apply)(void *k, void *d, void *args),
++                                 void (*destroy)(void *k, void *d, void *args),
++                                 void *args);
++
++
++/* Fill info with some hash table statistics */
++void hashtab_stat(struct hashtab *h, struct hashtab_info *info);
++
++#endif	/* _SS_HASHTAB_H */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/Makefile	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,14 @@
++#
++# Makefile for building the SELinux security server as part of the kernel tree.
++#
++
++EXTRA_CFLAGS += -Isecurity/selinux/include -include security/selinux/ss/global.h
++
++obj-y := ss.o
++
++ss-objs := ebitmap.o hashtab.o symtab.o sidtab.o avtab.o policydb.o services.o
++
++ifeq ($(CONFIG_SECURITY_SELINUX_MLS),y)
++ss-objs += mls.o
++endif
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/mls.c	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,741 @@
++/*
++ * Implementation of the multi-level security (MLS) policy.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#include "mls.h"
++#include "policydb.h"
++#include "services.h"
++
++/*
++ * Remove any permissions from `allowed' that are
++ * denied by the MLS policy.
++ */
++void mls_compute_av(struct context *scontext,
++		    struct context *tcontext,
++		    struct class_datum *tclass,
++		    u32 *allowed)
++{
++	unsigned int rel[2];
++	int l;
++
++	for (l = 0; l < 2; l++)
++		rel[l] = mls_level_relation(scontext->range.level[l],
++					    tcontext->range.level[l]);
++
++	if (rel[1] != MLS_RELATION_EQ) {
++		if (rel[1] != MLS_RELATION_DOM &&
++		    !ebitmap_get_bit(&policydb.trustedreaders, scontext->type - 1) &&
++		    !ebitmap_get_bit(&policydb.trustedobjects, tcontext->type - 1)) {
++			/* read(s,t) = (s.high >= t.high) = False */
++			*allowed = (*allowed) & ~(tclass->mlsperms.read);
++		}
++		if (rel[1] != MLS_RELATION_DOMBY &&
++		    !ebitmap_get_bit(&policydb.trustedreaders, tcontext->type - 1) &&
++		    !ebitmap_get_bit(&policydb.trustedobjects, scontext->type - 1)) {
++			/* readby(s,t) = read(t,s) = False */
++			*allowed = (*allowed) & ~(tclass->mlsperms.readby);
++		}
++	}
++	if (((rel[0] != MLS_RELATION_DOMBY && rel[0] != MLS_RELATION_EQ) ||
++	    ((!mls_level_eq(tcontext->range.level[0],
++			    tcontext->range.level[1])) &&
++	     (rel[1] != MLS_RELATION_DOM && rel[1] != MLS_RELATION_EQ))) &&
++	    !ebitmap_get_bit(&policydb.trustedwriters, scontext->type - 1) &&
++	    !ebitmap_get_bit(&policydb.trustedobjects, tcontext->type - 1)) {
++		/*
++		 * write(s,t) = ((s.low <= t.low = t.high) or (s.low
++		 * <= t.low <= t.high <= s.high)) = False
++		 */
++		*allowed = (*allowed) & ~(tclass->mlsperms.write);
++	}
++
++	if (((rel[0] != MLS_RELATION_DOM && rel[0] != MLS_RELATION_EQ) ||
++	    ((!mls_level_eq(scontext->range.level[0],
++			    scontext->range.level[1])) &&
++	     (rel[1] != MLS_RELATION_DOMBY && rel[1] != MLS_RELATION_EQ))) &&
++	    !ebitmap_get_bit(&policydb.trustedwriters, tcontext->type - 1) &&
++	    !ebitmap_get_bit(&policydb.trustedobjects, scontext->type - 1)) {
++		/* writeby(s,t) = write(t,s) = False */
++		*allowed = (*allowed) & ~(tclass->mlsperms.writeby);
++	}
++}
++
++/*
++ * Return the length in bytes for the MLS fields of the
++ * security context string representation of `context'.
++ */
++int mls_compute_context_len(struct context * context)
++{
++	int i, l, len;
++
++
++	len = 0;
++	for (l = 0; l < 2; l++) {
++		len += strlen(policydb.p_sens_val_to_name[context->range.level[l].sens - 1]) + 1;
++
++		for (i = 1; i <= ebitmap_length(&context->range.level[l].cat); i++)
++			if (ebitmap_get_bit(&context->range.level[l].cat, i - 1))
++				len += strlen(policydb.p_cat_val_to_name[i - 1]) + 1;
++
++		if (mls_level_relation(context->range.level[0], context->range.level[1])
++				== MLS_RELATION_EQ)
++			break;
++	}
++
++	return len;
++}
++
++/*
++ * Write the security context string representation of
++ * the MLS fields of `context' into the string `*scontext'.
++ * Update `*scontext' to point to the end of the MLS fields.
++ */
++int mls_sid_to_context(struct context *context,
++		       char **scontext)
++{
++	char *scontextp;
++	int i, l;
++
++	scontextp = *scontext;
++
++	for (l = 0; l < 2; l++) {
++		strcpy(scontextp,
++		       policydb.p_sens_val_to_name[context->range.level[l].sens - 1]);
++		scontextp += strlen(policydb.p_sens_val_to_name[context->range.level[l].sens - 1]);
++		*scontextp = ':';
++		scontextp++;
++		for (i = 1; i <= ebitmap_length(&context->range.level[l].cat); i++)
++			if (ebitmap_get_bit(&context->range.level[l].cat, i - 1)) {
++				strcpy(scontextp, policydb.p_cat_val_to_name[i - 1]);
++				scontextp += strlen(policydb.p_cat_val_to_name[i - 1]);
++				*scontextp = ',';
++				scontextp++;
++			}
++		if (mls_level_relation(context->range.level[0], context->range.level[1])
++				!= MLS_RELATION_EQ) {
++			scontextp--;
++			sprintf(scontextp, "-");
++			scontextp++;
++
++		} else {
++			break;
++		}
++	}
++
++	*scontext = scontextp;
++	return 0;
++}
++
++/*
++ * Return 1 if the MLS fields in the security context
++ * structure `c' are valid.  Return 0 otherwise.
++ */
++int mls_context_isvalid(struct policydb *p, struct context *c)
++{
++	unsigned int relation;
++	struct level_datum *levdatum;
++	struct user_datum *usrdatum;
++	struct mls_range_list *rnode;
++	int i, l;
++
++	/*
++	 * MLS range validity checks: high must dominate low, low level must
++	 * be valid (category set <-> sensitivity check), and high level must
++	 * be valid (category set <-> sensitivity check)
++	 */
++	relation = mls_level_relation(c->range.level[1],
++				      c->range.level[0]);
++	if (!(relation & (MLS_RELATION_DOM | MLS_RELATION_EQ)))
++		/* High does not dominate low. */
++		return 0;
++
++	for (l = 0; l < 2; l++) {
++		if (!c->range.level[l].sens || c->range.level[l].sens > p->p_levels.nprim)
++			return 0;
++		levdatum = hashtab_search(p->p_levels.table,
++			p->p_sens_val_to_name[c->range.level[l].sens - 1]);
++		if (!levdatum)
++			return 0;
++
++		for (i = 1; i <= ebitmap_length(&c->range.level[l].cat); i++) {
++			if (ebitmap_get_bit(&c->range.level[l].cat, i - 1)) {
++				if (i > p->p_cats.nprim)
++					return 0;
++				if (!ebitmap_get_bit(&levdatum->level->cat, i - 1))
++					/*
++					 * Category may not be associated with
++					 * sensitivity in low level.
++					 */
++					return 0;
++			}
++		}
++	}
++
++	if (c->role == OBJECT_R_VAL)
++		return 1;
++
++	/*
++	 * User must be authorized for the MLS range.
++	 */
++	if (!c->user || c->user > p->p_users.nprim)
++		return 0;
++	usrdatum = p->user_val_to_struct[c->user - 1];
++	for (rnode = usrdatum->ranges; rnode; rnode = rnode->next) {
++		if (mls_range_contains(rnode->range, c->range))
++			break;
++	}
++	if (!rnode)
++		/* user may not be associated with range */
++		return 0;
++
++	return 1;
++}
++
++
++/*
++ * Set the MLS fields in the security context structure
++ * `context' based on the string representation in
++ * the string `*scontext'.  Update `*scontext' to
++ * point to the end of the string representation of
++ * the MLS fields.
++ *
++ * This function modifies the string in place, inserting
++ * NULL characters to terminate the MLS fields.
++ */
++int mls_context_to_sid(char oldc,
++		       char **scontext,
++		       struct context *context)
++{
++
++	char delim;
++	char *scontextp, *p;
++	struct level_datum *levdatum;
++	struct cat_datum *catdatum;
++	int l, rc = -EINVAL;
++
++	if (!oldc) {
++		/* No MLS component to the security context.  Try
++		   to use a default 'unclassified' value. */
++		levdatum = hashtab_search(policydb.p_levels.table,
++		                          "unclassified");
++		if (!levdatum)
++			goto out;
++		context->range.level[0].sens = levdatum->level->sens;
++		context->range.level[1].sens = context->range.level[0].sens;
++		rc = 0;
++		goto out;
++	}
++
++	/* Extract low sensitivity. */
++	scontextp = p = *scontext;
++	while (*p && *p != ':' && *p != '-')
++		p++;
++
++	delim = *p;
++	if (delim != 0)
++		*p++ = 0;
++
++	for (l = 0; l < 2; l++) {
++		levdatum = hashtab_search(policydb.p_levels.table, scontextp);
++		if (!levdatum)
++			goto out;
++
++		context->range.level[l].sens = levdatum->level->sens;
++
++		if (delim == ':') {
++			/* Extract low category set. */
++			while (1) {
++				scontextp = p;
++				while (*p && *p != ',' && *p != '-')
++					p++;
++				delim = *p;
++				if (delim != 0)
++					*p++ = 0;
++
++				catdatum = hashtab_search(policydb.p_cats.table,
++				                          scontextp);
++				if (!catdatum)
++					goto out;
++
++				rc = ebitmap_set_bit(&context->range.level[l].cat,
++				                     catdatum->value - 1, 1);
++				if (rc)
++					goto out;
++				if (delim != ',')
++					break;
++			}
++		}
++		if (delim == '-') {
++			/* Extract high sensitivity. */
++			scontextp = p;
++			while (*p && *p != ':')
++				p++;
++
++			delim = *p;
++			if (delim != 0)
++				*p++ = 0;
++		} else
++			break;
++	}
++
++	if (l == 0) {
++		context->range.level[1].sens = context->range.level[0].sens;
++		rc = ebitmap_cpy(&context->range.level[1].cat,
++				 &context->range.level[0].cat);
++		if (rc)
++			goto out;
++	}
++	*scontext = p;
++	rc = 0;
++out:
++	return rc;
++}
++
++/*
++ * Copies the MLS range from `src' into `dst'.
++ */
++static inline int mls_copy_context(struct context *dst,
++				   struct context *src)
++{
++	int l, rc = 0;
++
++	/* Copy the MLS range from the source context */
++	for (l = 0; l < 2; l++) {
++
++		dst->range.level[l].sens = src->range.level[l].sens;
++		rc = ebitmap_cpy(&dst->range.level[l].cat,
++				 &src->range.level[l].cat);
++		if (rc)
++			break;
++	}
++
++	return rc;
++}
++
++/*
++ * Convert the MLS fields in the security context
++ * structure `c' from the values specified in the
++ * policy `oldp' to the values specified in the policy `newp'.
++ */
++int mls_convert_context(struct policydb *oldp,
++			struct policydb *newp,
++			struct context *c)
++{
++	struct level_datum *levdatum;
++	struct cat_datum *catdatum;
++	struct ebitmap bitmap;
++	int l, i;
++
++	for (l = 0; l < 2; l++) {
++		levdatum = hashtab_search(newp->p_levels.table,
++			oldp->p_sens_val_to_name[c->range.level[l].sens - 1]);
++
++		if (!levdatum)
++			return -EINVAL;
++		c->range.level[l].sens = levdatum->level->sens;
++
++		ebitmap_init(&bitmap);
++		for (i = 1; i <= ebitmap_length(&c->range.level[l].cat); i++) {
++			if (ebitmap_get_bit(&c->range.level[l].cat, i - 1)) {
++				int rc;
++
++				catdatum = hashtab_search(newp->p_cats.table,
++				         	oldp->p_cat_val_to_name[i - 1]);
++				if (!catdatum)
++					return -EINVAL;
++				rc = ebitmap_set_bit(&bitmap, catdatum->value - 1, 1);
++				if (rc)
++					return rc;
++			}
++		}
++		ebitmap_destroy(&c->range.level[l].cat);
++		c->range.level[l].cat = bitmap;
++	}
++
++	return 0;
++}
++
++int mls_compute_sid(struct context *scontext,
++		    struct context *tcontext,
++		    u16 tclass,
++		    u32 specified,
++		    struct context *newcontext)
++{
++	switch (specified) {
++	case AVTAB_TRANSITION:
++	case AVTAB_CHANGE:
++		/* Use the process MLS attributes. */
++		return mls_copy_context(newcontext, scontext);
++	case AVTAB_MEMBER:
++		/* Only polyinstantiate the MLS attributes if
++		   the type is being polyinstantiated */
++		if (newcontext->type != tcontext->type) {
++			/* Use the process MLS attributes. */
++			return mls_copy_context(newcontext, scontext);
++		} else {
++			/* Use the related object MLS attributes. */
++			return mls_copy_context(newcontext, tcontext);
++		}
++	default:
++		return -EINVAL;
++	}
++	return -EINVAL;
++}
++
++void mls_user_destroy(struct user_datum *usrdatum)
++{
++	struct mls_range_list *rnode, *rtmp;
++	rnode = usrdatum->ranges;
++	while (rnode) {
++		rtmp = rnode;
++		rnode = rnode->next;
++		ebitmap_destroy(&rtmp->range.level[0].cat);
++		ebitmap_destroy(&rtmp->range.level[1].cat);
++		kfree(rtmp);
++	}
++}
++
++int mls_read_perm(struct perm_datum *perdatum, void *fp)
++{
++	u32 *buf;
++
++	buf = next_entry(fp, sizeof(u32));
++	if (!buf)
++		return -EINVAL;
++	perdatum->base_perms = le32_to_cpu(buf[0]);
++	return 0;
++}
++
++/*
++ * Read a MLS level structure from a policydb binary
++ * representation file.
++ */
++struct mls_level *mls_read_level(void *fp)
++{
++	struct mls_level *l;
++	u32 *buf;
++
++	l = kmalloc(sizeof(*l), GFP_ATOMIC);
++	if (!l) {
++		printk(KERN_ERR "security: mls: out of memory\n");
++		return NULL;
++	}
++	memset(l, 0, sizeof(*l));
++
++	buf = next_entry(fp, sizeof(u32));
++	if (!buf) {
++		printk(KERN_ERR "security: mls: truncated level\n");
++		goto bad;
++	}
++	l->sens = cpu_to_le32(buf[0]);
++
++	if (ebitmap_read(&l->cat, fp)) {
++		printk(KERN_ERR "security: mls:  error reading level "
++		       "categories\n");
++		goto bad;
++	}
++	return l;
++
++bad:
++	kfree(l);
++	return NULL;
++}
++
++
++/*
++ * Read a MLS range structure from a policydb binary
++ * representation file.
++ */
++static int mls_read_range_helper(struct mls_range *r, void *fp)
++{
++	u32 *buf;
++	int items, rc = -EINVAL;
++
++	buf = next_entry(fp, sizeof(u32));
++	if (!buf)
++		goto out;
++
++	items = le32_to_cpu(buf[0]);
++	buf = next_entry(fp, sizeof(u32) * items);
++	if (!buf) {
++		printk(KERN_ERR "security: mls:  truncated range\n");
++		goto out;
++	}
++	r->level[0].sens = le32_to_cpu(buf[0]);
++	if (items > 1) {
++		r->level[1].sens = le32_to_cpu(buf[1]);
++	} else {
++		r->level[1].sens = r->level[0].sens;
++	}
++
++	rc = ebitmap_read(&r->level[0].cat, fp);
++	if (rc) {
++		printk(KERN_ERR "security: mls:  error reading low "
++		       "categories\n");
++		goto out;
++	}
++	if (items > 1) {
++		rc = ebitmap_read(&r->level[1].cat, fp);
++		if (rc) {
++			printk(KERN_ERR "security: mls:  error reading high "
++			       "categories\n");
++			goto bad_high;
++		}
++	} else {
++		rc = ebitmap_cpy(&r->level[1].cat, &r->level[0].cat);
++		if (rc) {
++			printk(KERN_ERR "security: mls:  out of memory\n");
++			goto bad_high;
++		}
++	}
++
++	rc = 0;
++out:
++	return rc;
++bad_high:
++	ebitmap_destroy(&r->level[0].cat);
++	goto out;
++}
++
++int mls_read_range(struct context *c, void *fp)
++{
++	return mls_read_range_helper(&c->range, fp);
++}
++
++
++/*
++ * Read a MLS perms structure from a policydb binary
++ * representation file.
++ */
++int mls_read_class(struct class_datum *cladatum, void *fp)
++{
++	struct mls_perms *p = &cladatum->mlsperms;
++	u32 *buf;
++
++	buf = next_entry(fp, sizeof(u32)*4);
++	if (!buf) {
++		printk(KERN_ERR "security: mls:  truncated mls permissions\n");
++		return -EINVAL;
++	}
++	p->read = le32_to_cpu(buf[0]);
++	p->readby = le32_to_cpu(buf[1]);
++	p->write = le32_to_cpu(buf[2]);
++	p->writeby = le32_to_cpu(buf[3]);
++	return 0;
++}
++
++int mls_read_user(struct user_datum *usrdatum, void *fp)
++{
++	struct mls_range_list *r, *l;
++	int rc = 0;
++	u32 nel, i;
++	u32 *buf;
++
++	buf = next_entry(fp, sizeof(u32));
++	if (!buf) {
++		rc = -EINVAL;
++		goto out;
++	}
++	nel = le32_to_cpu(buf[0]);
++	l = NULL;
++	for (i = 0; i < nel; i++) {
++		r = kmalloc(sizeof(*r), GFP_ATOMIC);
++		if (!r) {
++			rc = -ENOMEM;
++			goto out;
++		}
++		memset(r, 0, sizeof(*r));
++
++		rc = mls_read_range_helper(&r->range, fp);
++		if (rc)
++			goto out;
++
++		if (l)
++			l->next = r;
++		else
++			usrdatum->ranges = r;
++		l = r;
++	}
++out:
++	return rc;
++}
++
++int mls_read_nlevels(struct policydb *p, void *fp)
++{
++	u32 *buf;
++
++	buf = next_entry(fp, sizeof(u32));
++	if (!buf)
++		return -EINVAL;
++	p->nlevels = le32_to_cpu(buf[0]);
++	return 0;
++}
++
++int mls_read_trusted(struct policydb *p, void *fp)
++{
++	int rc = 0;
++
++	rc = ebitmap_read(&p->trustedreaders, fp);
++	if (rc)
++		goto out;
++	rc = ebitmap_read(&p->trustedwriters, fp);
++	if (rc)
++		goto out;
++	rc = ebitmap_read(&p->trustedobjects, fp);
++out:
++	return rc;
++}
++
++int sens_index(void *key, void *datum, void *datap)
++{
++	struct policydb *p;
++	struct level_datum *levdatum;
++
++
++	levdatum = datum;
++	p = datap;
++
++	if (!levdatum->isalias)
++		p->p_sens_val_to_name[levdatum->level->sens - 1] = key;
++
++	return 0;
++}
++
++int cat_index(void *key, void *datum, void *datap)
++{
++	struct policydb *p;
++	struct cat_datum *catdatum;
++
++
++	catdatum = datum;
++	p = datap;
++
++
++	if (!catdatum->isalias)
++		p->p_cat_val_to_name[catdatum->value - 1] = key;
++
++	return 0;
++}
++
++int sens_destroy(void *key, void *datum, void *p)
++{
++	struct level_datum *levdatum;
++
++	kfree(key);
++	levdatum = datum;
++	if (!levdatum->isalias) {
++		ebitmap_destroy(&levdatum->level->cat);
++		kfree(levdatum->level);
++	}
++	kfree(datum);
++	return 0;
++}
++
++int cat_destroy(void *key, void *datum, void *p)
++{
++	kfree(key);
++	kfree(datum);
++	return 0;
++}
++
++int sens_read(struct policydb *p, struct hashtab *h, void *fp)
++{
++	char *key = 0;
++	struct level_datum *levdatum;
++	int rc;
++	u32 *buf, len;
++
++	levdatum = kmalloc(sizeof(*levdatum), GFP_ATOMIC);
++	if (!levdatum) {
++		rc = -ENOMEM;
++		goto out;
++	}
++	memset(levdatum, 0, sizeof(*levdatum));
++
++	buf = next_entry(fp, sizeof(u32)*2);
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++
++	len = le32_to_cpu(buf[0]);
++	levdatum->isalias = le32_to_cpu(buf[1]);
++
++	buf = next_entry(fp, len);
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++	key = kmalloc(len + 1,GFP_ATOMIC);
++	if (!key) {
++		rc = -ENOMEM;
++		goto bad;
++	}
++	memcpy(key, buf, len);
++	key[len] = 0;
++
++	levdatum->level = mls_read_level(fp);
++	if (!levdatum->level) {
++		rc = -EINVAL;
++		goto bad;
++	}
++
++	rc = hashtab_insert(h, key, levdatum);
++	if (rc)
++		goto bad;
++out:
++	return rc;
++bad:
++	sens_destroy(key, levdatum, NULL);
++	goto out;
++}
++
++
++int cat_read(struct policydb *p, struct hashtab *h, void *fp)
++{
++	char *key = 0;
++	struct cat_datum *catdatum;
++	int rc;
++	u32 *buf, len;
++
++	catdatum = kmalloc(sizeof(*catdatum), GFP_ATOMIC);
++	if (!catdatum) {
++		rc = -ENOMEM;
++		goto out;
++	}
++	memset(catdatum, 0, sizeof(*catdatum));
++
++	buf = next_entry(fp, sizeof(u32)*3);
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++
++	len = le32_to_cpu(buf[0]);
++	catdatum->value = le32_to_cpu(buf[1]);
++	catdatum->isalias = le32_to_cpu(buf[2]);
++
++	buf = next_entry(fp, len);
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++	key = kmalloc(len + 1,GFP_ATOMIC);
++	if (!key) {
++		rc = -ENOMEM;
++		goto bad;
++	}
++	memcpy(key, buf, len);
++	key[len] = 0;
++
++	rc = hashtab_insert(h, key, catdatum);
++	if (rc)
++		goto bad;
++out:
++	return rc;
++
++bad:
++	cat_destroy(key, catdatum, NULL);
++	goto out;
++}
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/mls.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,99 @@
++/*
++ * Multi-level security (MLS) policy operations.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_MLS_H_
++#define _SS_MLS_H_
++
++#include "context.h"
++#include "policydb.h"
++
++#ifdef CONFIG_SECURITY_SELINUX_MLS
++
++void mls_compute_av(struct context *scontext,
++		    struct context *tcontext,
++		    struct class_datum *tclass,
++		    u32 *allowed);
++
++int mls_compute_context_len(struct context *context);
++int mls_sid_to_context(struct context *context, char **scontext);
++int mls_context_isvalid(struct policydb *p, struct context *c);
++
++int mls_context_to_sid(char oldc,
++	               char **scontext,
++		       struct context *context);
++
++int mls_convert_context(struct policydb *oldp,
++			struct policydb *newp,
++			struct context *context);
++
++int mls_compute_sid(struct context *scontext,
++		    struct context *tcontext,
++		    u16 tclass,
++		    u32 specified,
++		    struct context *newcontext);
++
++int sens_index(void *key, void *datum, void *datap);
++int cat_index(void *key, void *datum, void *datap);
++int sens_destroy(void *key, void *datum, void *p);
++int cat_destroy(void *key, void *datum, void *p);
++int sens_read(struct policydb *p, struct hashtab *h, void *fp);
++int cat_read(struct policydb *p, struct hashtab *h, void *fp);
++
++#define mls_for_user_ranges(user, usercon) { \
++struct mls_range_list *__ranges; \
++for (__ranges = user->ranges; __ranges; __ranges = __ranges->next) { \
++usercon.range = __ranges->range;
++
++#define mls_end_user_ranges } }
++
++#define mls_symtab_names , "levels", "categories"
++#define mls_symtab_sizes , 16, 16
++#define mls_index_f ,sens_index, cat_index
++#define mls_destroy_f ,sens_destroy, cat_destroy
++#define mls_read_f ,sens_read, cat_read
++#define mls_write_f ,sens_write, cat_write
++#define mls_policydb_index_others(p) printk(", %d levels", p->nlevels);
++
++#define mls_set_config(config) config |= POLICYDB_CONFIG_MLS
++
++void mls_user_destroy(struct user_datum *usrdatum);
++int mls_read_range(struct context *c, void *fp);
++int mls_read_perm(struct perm_datum *perdatum, void *fp);
++int mls_read_class(struct class_datum *cladatum,  void *fp);
++int mls_read_user(struct user_datum *usrdatum, void *fp);
++int mls_read_nlevels(struct policydb *p, void *fp);
++int mls_read_trusted(struct policydb *p, void *fp);
++
++#else
++
++#define	mls_compute_av(scontext, tcontext, tclass_datum, allowed)
++#define mls_compute_context_len(context) 0
++#define	mls_sid_to_context(context, scontextpp)
++#define mls_context_isvalid(p, c) 1
++#define	mls_context_to_sid(oldc, context_str, context) 0
++#define mls_convert_context(oldp, newp, c) 0
++#define mls_compute_sid(scontext, tcontext, tclass, specified, newcontextp) 0
++#define mls_for_user_ranges(user, usercon)
++#define mls_end_user_ranges
++#define mls_symtab_names
++#define mls_symtab_sizes
++#define mls_index_f
++#define mls_destroy_f
++#define mls_read_f
++#define mls_write_f
++#define mls_policydb_index_others(p)
++#define mls_set_config(config)
++#define mls_user_destroy(usrdatum)
++#define mls_read_range(c, fp) 0
++#define mls_read_perm(p, fp) 0
++#define mls_read_class(c, fp) 0
++#define mls_read_user(u, fp) 0
++#define mls_read_nlevels(p, fp) 0
++#define mls_read_trusted(p, fp) 0
++
++#endif
++
++#endif	/* _SS_MLS_H */
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/mls_types.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,58 @@
++/*
++ * Type definitions for the multi-level security (MLS) policy.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_MLS_TYPES_H_
++#define _SS_MLS_TYPES_H_
++
++struct mls_level {
++	u32 sens;		/* sensitivity */
++	struct ebitmap cat;	/* category set */
++};
++
++struct mls_range {
++	struct mls_level level[2]; /* low == level[0], high == level[1] */
++};
++
++struct mls_range_list {
++	struct mls_range range;
++	struct mls_range_list *next;
++};
++
++#define MLS_RELATION_DOM	1 /* source dominates */
++#define MLS_RELATION_DOMBY	2 /* target dominates */
++#define MLS_RELATION_EQ		4 /* source and target are equivalent */
++#define MLS_RELATION_INCOMP	8 /* source and target are incomparable */
++
++#define mls_level_eq(l1,l2) \
++(((l1).sens == (l2).sens) && ebitmap_cmp(&(l1).cat,&(l2).cat))
++
++#define mls_level_relation(l1,l2) ( \
++(((l1).sens == (l2).sens) && ebitmap_cmp(&(l1).cat,&(l2).cat)) ? \
++				    MLS_RELATION_EQ : \
++(((l1).sens >= (l2).sens) && ebitmap_contains(&(l1).cat, &(l2).cat)) ? \
++				    MLS_RELATION_DOM : \
++(((l2).sens >= (l1).sens) && ebitmap_contains(&(l2).cat, &(l1).cat)) ? \
++				    MLS_RELATION_DOMBY : \
++				    MLS_RELATION_INCOMP )
++
++#define mls_range_contains(r1,r2) \
++((mls_level_relation((r1).level[0], (r2).level[0]) & \
++	  (MLS_RELATION_EQ | MLS_RELATION_DOMBY)) && \
++	 (mls_level_relation((r1).level[1], (r2).level[1]) & \
++	  (MLS_RELATION_EQ | MLS_RELATION_DOM)))
++
++/*
++ * Every access vector permission is mapped to a set of MLS base
++ * permissions, based on the flow properties of the corresponding
++ * operation.
++ */
++struct mls_perms {
++	u32 read;     /* permissions that map to `read' */
++	u32 readby;   /* permissions that map to `readby' */
++	u32 write;    /* permissions that map to `write' */
++	u32 writeby;  /* permissions that map to `writeby' */
++};
++
++#endif	/* _SS_MLS_TYPES_H_ */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/policydb.c	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,1429 @@
++/*
++ * Implementation of the policy database.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#include "policydb.h"
++#include "mls.h"
++
++#define _DEBUG_HASHES
++
++#ifdef DEBUG_HASHES
++static char *symtab_name[SYM_NUM] = {
++	"common prefixes",
++	"classes",
++	"roles",
++	"types",
++	"users"
++	mls_symtab_names
++};
++#endif
++
++static unsigned int symtab_sizes[SYM_NUM] = {
++	2,
++	32,
++	16,
++	512,
++	128
++	mls_symtab_sizes
++};
++
++/*
++ * Initialize the role table.
++ */
++int roles_init(struct policydb *p)
++{
++	char *key = 0;
++	int rc;
++	struct role_datum *role;
++
++	role = kmalloc(sizeof(*role), GFP_KERNEL);
++	if (!role) {
++		rc = -ENOMEM;
++		goto out;
++	}
++	memset(role, 0, sizeof(*role));
++	role->value = ++p->p_roles.nprim;
++	if (role->value != OBJECT_R_VAL) {
++		rc = -EINVAL;
++		goto out_free_role;
++	}
++	key = kmalloc(strlen(OBJECT_R)+1,GFP_KERNEL);
++	if (!key) {
++		rc = -ENOMEM;
++		goto out_free_role;
++	}
++	strcpy(key, OBJECT_R);
++	rc = hashtab_insert(p->p_roles.table, key, role);
++	if (rc)
++		goto out_free_key;
++out:
++	return rc;
++
++out_free_key:
++	kfree(key);
++out_free_role:
++	kfree(role);
++	goto out;
++}
++
++/*
++ * Initialize a policy database structure.
++ */
++int policydb_init(struct policydb *p)
++{
++	int i, rc;
++
++	memset(p, 0, sizeof(*p));
++
++	for (i = 0; i < SYM_NUM; i++) {
++		rc = symtab_init(&p->symtab[i], symtab_sizes[i]);
++		if (rc)
++			goto out_free_symtab;
++	}
++
++	rc = avtab_init(&p->te_avtab);
++	if (rc)
++		goto out_free_symtab;
++
++	rc = roles_init(p);
++	if (rc)
++		goto out_free_avtab;
++
++out:
++	return rc;
++
++out_free_avtab:
++	avtab_destroy(&p->te_avtab);
++
++out_free_symtab:
++	for (i = 0; i < SYM_NUM; i++)
++		hashtab_destroy(p->symtab[i].table);
++	goto out;
++}
++
++/*
++ * The following *_index functions are used to
++ * define the val_to_name and val_to_struct arrays
++ * in a policy database structure.  The val_to_name
++ * arrays are used when converting security context
++ * structures into string representations.  The
++ * val_to_struct arrays are used when the attributes
++ * of a class, role, or user are needed.
++ */
++
++static int common_index(void *key, void *datum, void *datap)
++{
++	struct policydb *p;
++	struct common_datum *comdatum;
++
++	comdatum = datum;
++	p = datap;
++	p->p_common_val_to_name[comdatum->value - 1] = key;
++	return 0;
++}
++
++static int class_index(void *key, void *datum, void *datap)
++{
++	struct policydb *p;
++	struct class_datum *cladatum;
++
++	cladatum = datum;
++	p = datap;
++	p->p_class_val_to_name[cladatum->value - 1] = key;
++	p->class_val_to_struct[cladatum->value - 1] = cladatum;
++	return 0;
++}
++
++static int role_index(void *key, void *datum, void *datap)
++{
++	struct policydb *p;
++	struct role_datum *role;
++
++	role = datum;
++	p = datap;
++	p->p_role_val_to_name[role->value - 1] = key;
++	p->role_val_to_struct[role->value - 1] = role;
++	return 0;
++}
++
++static int type_index(void *key, void *datum, void *datap)
++{
++	struct policydb *p;
++	struct type_datum *typdatum;
++
++	typdatum = datum;
++	p = datap;
++
++	if (typdatum->primary)
++		p->p_type_val_to_name[typdatum->value - 1] = key;
++
++	return 0;
++}
++
++static int user_index(void *key, void *datum, void *datap)
++{
++	struct policydb *p;
++	struct user_datum *usrdatum;
++
++	usrdatum = datum;
++	p = datap;
++	p->p_user_val_to_name[usrdatum->value - 1] = key;
++	p->user_val_to_struct[usrdatum->value - 1] = usrdatum;
++	return 0;
++}
++
++static int (*index_f[SYM_NUM]) (void *key, void *datum, void *datap) =
++{
++	common_index,
++	class_index,
++	role_index,
++	type_index,
++	user_index
++	mls_index_f
++};
++
++/*
++ * Define the common val_to_name array and the class
++ * val_to_name and val_to_struct arrays in a policy
++ * database structure.
++ *
++ * Caller must clean up upon failure.
++ */
++int policydb_index_classes(struct policydb *p)
++{
++	int rc;
++
++	p->p_common_val_to_name =
++		kmalloc(p->p_commons.nprim * sizeof(char *), GFP_KERNEL);
++	if (!p->p_common_val_to_name) {
++		rc = -ENOMEM;
++		goto out;
++	}
++
++	rc = hashtab_map(p->p_commons.table, common_index, p);
++	if (rc)
++		goto out;
++
++	p->class_val_to_struct =
++		kmalloc(p->p_classes.nprim * sizeof(*(p->class_val_to_struct)), GFP_KERNEL);
++	if (!p->class_val_to_struct) {
++		rc = -ENOMEM;
++		goto out;
++	}
++
++	p->p_class_val_to_name =
++		kmalloc(p->p_classes.nprim * sizeof(char *), GFP_KERNEL);
++	if (!p->p_class_val_to_name) {
++		rc = -ENOMEM;
++		goto out;
++	}
++
++	rc = hashtab_map(p->p_classes.table, class_index, p);
++out:
++	return rc;
++}
++
++#ifdef DEBUG_HASHES
++static void symtab_hash_eval(struct symtab *s)
++{
++	int i;
++
++	for (i = 0; i < SYM_NUM; i++) {
++		struct hashtab *h = s[i].table;
++		struct hashtab_info info;
++
++		hashtab_stat(h, &info);
++		printk(KERN_INFO "%s:  %d entries and %d/%d buckets used, "
++		       "longest chain length %d\n", symtab_name[i], h->nel,
++		       info.slots_used, h->size, info.max_chain_len);
++	}
++}
++#endif
++
++/*
++ * Define the other val_to_name and val_to_struct arrays
++ * in a policy database structure.
++ *
++ * Caller must clean up on failure.
++ */
++int policydb_index_others(struct policydb *p)
++{
++	int i, rc = 0;
++
++	printk(KERN_INFO "security:  %d users, %d roles, %d types",
++	       p->p_users.nprim, p->p_roles.nprim, p->p_types.nprim);
++	mls_policydb_index_others(p);
++	printk("\n");
++
++	printk(KERN_INFO "security:  %d classes, %d rules\n",
++	       p->p_classes.nprim, p->te_avtab.nel);
++
++#ifdef DEBUG_HASHES
++	avtab_hash_eval(&p->te_avtab, "rules");
++	symtab_hash_eval(p->symtab);
++#endif
++
++	p->role_val_to_struct =
++		kmalloc(p->p_roles.nprim * sizeof(*(p->role_val_to_struct)),
++		        GFP_KERNEL);
++	if (!p->role_val_to_struct) {
++		rc = -ENOMEM;
++		goto out;
++	}
++
++	p->user_val_to_struct =
++		kmalloc(p->p_users.nprim * sizeof(*(p->user_val_to_struct)),
++		        GFP_KERNEL);
++	if (!p->user_val_to_struct) {
++		rc = -ENOMEM;
++		goto out;
++	}
++
++	for (i = SYM_ROLES; i < SYM_NUM; i++) {
++		p->sym_val_to_name[i] =
++			kmalloc(p->symtab[i].nprim * sizeof(char *), GFP_KERNEL);
++		if (!p->sym_val_to_name[i]) {
++			rc = -ENOMEM;
++			goto out;
++		}
++		rc = hashtab_map(p->symtab[i].table, index_f[i], p);
++		if (rc)
++			goto out;
++	}
++
++out:
++	return rc;
++}
++
++/*
++ * The following *_destroy functions are used to
++ * free any memory allocated for each kind of
++ * symbol data in the policy database.
++ */
++
++static int perm_destroy(void *key, void *datum, void *p)
++{
++	kfree(key);
++	kfree(datum);
++	return 0;
++}
++
++static int common_destroy(void *key, void *datum, void *p)
++{
++	struct common_datum *comdatum;
++
++	kfree(key);
++	comdatum = datum;
++	hashtab_map(comdatum->permissions.table, perm_destroy, 0);
++	hashtab_destroy(comdatum->permissions.table);
++	kfree(datum);
++	return 0;
++}
++
++static int class_destroy(void *key, void *datum, void *p)
++{
++	struct class_datum *cladatum;
++	struct constraint_node *constraint, *ctemp;
++	struct constraint_expr *e, *etmp;
++
++	kfree(key);
++	cladatum = datum;
++	hashtab_map(cladatum->permissions.table, perm_destroy, 0);
++	hashtab_destroy(cladatum->permissions.table);
++	constraint = cladatum->constraints;
++	while (constraint) {
++		e = constraint->expr;
++		while (e) {
++			ebitmap_destroy(&e->names);
++			etmp = e;
++			e = e->next;
++			kfree(etmp);
++		}
++		ctemp = constraint;
++		constraint = constraint->next;
++		kfree(ctemp);
++	}
++	kfree(cladatum->comkey);
++	kfree(datum);
++	return 0;
++}
++
++static int role_destroy(void *key, void *datum, void *p)
++{
++	struct role_datum *role;
++
++	kfree(key);
++	role = datum;
++	ebitmap_destroy(&role->dominates);
++	ebitmap_destroy(&role->types);
++	kfree(datum);
++	return 0;
++}
++
++static int type_destroy(void *key, void *datum, void *p)
++{
++	kfree(key);
++	kfree(datum);
++	return 0;
++}
++
++static int user_destroy(void *key, void *datum, void *p)
++{
++	struct user_datum *usrdatum;
++
++	kfree(key);
++	usrdatum = datum;
++	ebitmap_destroy(&usrdatum->roles);
++	mls_user_destroy(usrdatum);
++	kfree(datum);
++	return 0;
++}
++
++static int (*destroy_f[SYM_NUM]) (void *key, void *datum, void *datap) =
++{
++	common_destroy,
++	class_destroy,
++	role_destroy,
++	type_destroy,
++	user_destroy
++	mls_destroy_f
++};
++
++/*
++ * Free any memory allocated by a policy database structure.
++ */
++void policydb_destroy(struct policydb *p)
++{
++	struct ocontext *c, *ctmp;
++	struct genfs *g, *gtmp;
++	int i;
++
++	for (i = 0; i < SYM_NUM; i++) {
++		hashtab_map(p->symtab[i].table, destroy_f[i], 0);
++		hashtab_destroy(p->symtab[i].table);
++	}
++
++	for (i = 0; i < SYM_NUM; i++) {
++		if (p->sym_val_to_name[i])
++			kfree(p->sym_val_to_name[i]);
++	}
++
++	if (p->class_val_to_struct)
++		kfree(p->class_val_to_struct);
++	if (p->role_val_to_struct)
++		kfree(p->role_val_to_struct);
++	if (p->user_val_to_struct)
++		kfree(p->user_val_to_struct);
++
++	avtab_destroy(&p->te_avtab);
++
++	for (i = 0; i < OCON_NUM; i++) {
++		c = p->ocontexts[i];
++		while (c) {
++			ctmp = c;
++			c = c->next;
++			context_destroy(&ctmp->context[0]);
++			context_destroy(&ctmp->context[1]);
++			if (i == OCON_ISID || i == OCON_FS ||
++			    i == OCON_NETIF || i == OCON_FSUSE)
++				kfree(ctmp->u.name);
++			kfree(ctmp);
++		}
++	}
++
++	g = p->genfs;
++	while (g) {
++		kfree(g->fstype);
++		c = g->head;
++		while (c) {
++			ctmp = c;
++			c = c->next;
++			context_destroy(&ctmp->context[0]);
++			kfree(ctmp->u.name);
++			kfree(ctmp);
++		}
++		gtmp = g;
++		g = g->next;
++		kfree(gtmp);
++	}
++
++	return;
++}
++
++/*
++ * Load the initial SIDs specified in a policy database
++ * structure into a SID table.
++ */
++int policydb_load_isids(struct policydb *p, struct sidtab *s)
++{
++	struct ocontext *head, *c;
++	int rc;
++
++	rc = sidtab_init(s);
++	if (rc) {
++		printk(KERN_ERR "security:  out of memory on SID table init\n");
++		goto out;
++	}
++
++	head = p->ocontexts[OCON_ISID];
++	for (c = head; c; c = c->next) {
++		if (!c->context[0].user) {
++			printk(KERN_ERR "security:  SID %s was never "
++			       "defined.\n", c->u.name);
++			rc = -EINVAL;
++			goto out;
++		}
++		if (sidtab_insert(s, c->sid[0], &c->context[0])) {
++			printk(KERN_ERR "security:  unable to load initial "
++			       "SID %s.\n", c->u.name);
++			rc = -EINVAL;
++			goto out;
++		}
++	}
++out:
++	return rc;
++}
++
++/*
++ * Return 1 if the fields in the security context
++ * structure `c' are valid.  Return 0 otherwise.
++ */
++int policydb_context_isvalid(struct policydb *p, struct context *c)
++{
++	struct role_datum *role;
++	struct user_datum *usrdatum;
++
++	/*
++	 * Role must be authorized for the type.
++	 */
++	if (!c->role || c->role > p->p_roles.nprim)
++		return 0;
++
++	if (c->role != OBJECT_R_VAL) {
++		role = p->role_val_to_struct[c->role - 1];
++		if (!ebitmap_get_bit(&role->types,
++				     c->type - 1))
++			/* role may not be associated with type */
++			return 0;
++
++		/*
++		 * User must be authorized for the role.
++		 */
++		if (!c->user || c->user > p->p_users.nprim)
++			return 0;
++		usrdatum = p->user_val_to_struct[c->user - 1];
++		if (!usrdatum)
++			return 0;
++
++		if (!ebitmap_get_bit(&usrdatum->roles,
++				     c->role - 1))
++			/* user may not be associated with role */
++			return 0;
++	}
++
++	if (!mls_context_isvalid(p, c))
++		return 0;
++
++	return 1;
++}
++
++/*
++ * Read and validate a security context structure
++ * from a policydb binary representation file.
++ */
++static int context_read_and_validate(struct context *c,
++				     struct policydb *p,
++				     void *fp)
++{
++	u32 *buf;
++	int rc = 0;
++
++	buf = next_entry(fp, sizeof(u32)*3);
++	if (!buf) {
++		printk(KERN_ERR "security: context truncated\n");
++		rc = -EINVAL;
++		goto out;
++	}
++	c->user = le32_to_cpu(buf[0]);
++	c->role = le32_to_cpu(buf[1]);
++	c->type = le32_to_cpu(buf[2]);
++	if (mls_read_range(c, fp)) {
++		printk(KERN_ERR "security: error reading MLS range of "
++		       "context\n");
++		rc = -EINVAL;
++		goto out;
++	}
++
++	if (!policydb_context_isvalid(p, c)) {
++		printk(KERN_ERR "security:  invalid security context\n");
++		context_destroy(c);
++		rc = -EINVAL;
++	}
++out:
++	return rc;
++}
++
++/*
++ * The following *_read functions are used to
++ * read the symbol data from a policy database
++ * binary representation file.
++ */
++
++static int perm_read(struct policydb *p, struct hashtab *h, void *fp)
++{
++	char *key = 0;
++	struct perm_datum *perdatum;
++	int rc;
++	u32 *buf, len;
++
++	perdatum = kmalloc(sizeof(*perdatum), GFP_KERNEL);
++	if (!perdatum) {
++		rc = -ENOMEM;
++		goto out;
++	}
++	memset(perdatum, 0, sizeof(*perdatum));
++
++	buf = next_entry(fp, sizeof(u32)*2);
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++
++	len = le32_to_cpu(buf[0]);
++	perdatum->value = le32_to_cpu(buf[1]);
++	rc = mls_read_perm(perdatum, fp);
++	if (rc)
++		goto bad;
++
++	buf = next_entry(fp, len);
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++	key = kmalloc(len + 1,GFP_KERNEL);
++	if (!key) {
++		rc = -ENOMEM;
++		goto bad;
++	}
++	memcpy(key, buf, len);
++	key[len] = 0;
++
++	rc = hashtab_insert(h, key, perdatum);
++	if (rc)
++		goto bad;
++out:
++	return rc;
++bad:
++	perm_destroy(key, perdatum, NULL);
++	goto out;
++}
++
++static int common_read(struct policydb *p, struct hashtab *h, void *fp)
++{
++	char *key = 0;
++	struct common_datum *comdatum;
++	u32 *buf, len, nel;
++	int i, rc;
++
++	comdatum = kmalloc(sizeof(*comdatum), GFP_KERNEL);
++	if (!comdatum) {
++		rc = -ENOMEM;
++		goto out;
++	}
++	memset(comdatum, 0, sizeof(*comdatum));
++
++	buf = next_entry(fp, sizeof(u32)*4);
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++
++	len = le32_to_cpu(buf[0]);
++	comdatum->value = le32_to_cpu(buf[1]);
++
++	rc = symtab_init(&comdatum->permissions, PERM_SYMTAB_SIZE);
++	if (rc)
++		goto bad;
++	comdatum->permissions.nprim = le32_to_cpu(buf[2]);
++	nel = le32_to_cpu(buf[3]);
++
++	buf = next_entry(fp, len);
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++	key = kmalloc(len + 1,GFP_KERNEL);
++	if (!key) {
++		rc = -ENOMEM;
++		goto bad;
++	}
++	memcpy(key, buf, len);
++	key[len] = 0;
++
++	for (i = 0; i < nel; i++) {
++		rc = perm_read(p, comdatum->permissions.table, fp);
++		if (rc)
++			goto bad;
++	}
++
++	rc = hashtab_insert(h, key, comdatum);
++	if (rc)
++		goto bad;
++out:
++	return rc;
++bad:
++	common_destroy(key, comdatum, NULL);
++	goto out;
++}
++
++static int class_read(struct policydb *p, struct hashtab *h, void *fp)
++{
++	char *key = 0;
++	struct class_datum *cladatum;
++	struct constraint_node *c, *lc;
++	struct constraint_expr *e, *le;
++	u32 *buf, len, len2, ncons, nexpr, nel;
++	int i, j, depth, rc;
++
++	cladatum = kmalloc(sizeof(*cladatum), GFP_KERNEL);
++	if (!cladatum) {
++		rc = -ENOMEM;
++		goto bad;
++	}
++	memset(cladatum, 0, sizeof(*cladatum));
++
++	buf = next_entry(fp, sizeof(u32)*6);
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++
++	len = le32_to_cpu(buf[0]);
++	len2 = le32_to_cpu(buf[1]);
++	cladatum->value = le32_to_cpu(buf[2]);
++
++	rc = symtab_init(&cladatum->permissions, PERM_SYMTAB_SIZE);
++	if (rc)
++		goto bad;
++	cladatum->permissions.nprim = le32_to_cpu(buf[3]);
++	nel = le32_to_cpu(buf[4]);
++
++	ncons = le32_to_cpu(buf[5]);
++
++	buf = next_entry(fp, len);
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++	key = kmalloc(len + 1,GFP_KERNEL);
++	if (!key) {
++		rc = -ENOMEM;
++		goto bad;
++	}
++	memcpy(key, buf, len);
++	key[len] = 0;
++
++	if (len2) {
++		cladatum->comkey = kmalloc(len2 + 1,GFP_KERNEL);
++		if (!cladatum->comkey) {
++			rc = -ENOMEM;
++			goto bad;
++		}
++		buf = next_entry(fp, len2);
++		if (!buf) {
++			rc = -EINVAL;
++			goto bad;
++		}
++		memcpy(cladatum->comkey, buf, len2);
++		cladatum->comkey[len2] = 0;
++
++		cladatum->comdatum = hashtab_search(p->p_commons.table,
++						    cladatum->comkey);
++		if (!cladatum->comdatum) {
++			printk(KERN_ERR "security:  unknown common %s\n",
++			       cladatum->comkey);
++			rc = -EINVAL;
++			goto bad;
++		}
++	}
++	for (i = 0; i < nel; i++) {
++		rc = perm_read(p, cladatum->permissions.table, fp);
++		if (rc)
++			goto bad;
++	}
++
++	lc = NULL;
++	rc = -EINVAL;
++	for (i = 0; i < ncons; i++) {
++		c = kmalloc(sizeof(*c), GFP_KERNEL);
++		if (!c) {
++			rc = -ENOMEM;
++			goto bad;
++		}
++		memset(c, 0, sizeof(*c));
++		buf = next_entry(fp, sizeof(u32)*2);
++		if (!buf)
++			goto bad;
++		c->permissions = le32_to_cpu(buf[0]);
++		nexpr = le32_to_cpu(buf[1]);
++		le = NULL;
++		depth = -1;
++		for (j = 0; j < nexpr; j++) {
++			e = kmalloc(sizeof(*e), GFP_KERNEL);
++			if (!e) {
++				rc = -ENOMEM;
++				goto bad;
++			}
++			memset(e, 0, sizeof(*e));
++			buf = next_entry(fp, sizeof(u32)*3);
++			if (!buf) {
++				kfree(e);
++				goto bad;
++			}
++			e->expr_type = le32_to_cpu(buf[0]);
++			e->attr = le32_to_cpu(buf[1]);
++			e->op = le32_to_cpu(buf[2]);
++
++			switch (e->expr_type) {
++			case CEXPR_NOT:
++				if (depth < 0) {
++					kfree(e);
++					goto bad;
++				}
++				break;
++			case CEXPR_AND:
++			case CEXPR_OR:
++				if (depth < 1) {
++					kfree(e);
++					goto bad;
++				}
++				depth--;
++				break;
++			case CEXPR_ATTR:
++				if (depth == (CEXPR_MAXDEPTH-1)) {
++					kfree(e);
++					goto bad;
++				}
++				depth++;
++				break;
++			case CEXPR_NAMES:
++				if (depth == (CEXPR_MAXDEPTH-1)) {
++					kfree(e);
++					goto bad;
++				}
++				depth++;
++				if (ebitmap_read(&e->names, fp)) {
++					kfree(e);
++					goto bad;
++				}
++				break;
++			default:
++				kfree(e);
++				goto bad;
++				break;
++			}
++			if (le) {
++				le->next = e;
++			} else {
++				c->expr = e;
++			}
++			le = e;
++		}
++		if (depth != 0)
++			goto bad;
++		if (lc) {
++			lc->next = c;
++		} else {
++			cladatum->constraints = c;
++		}
++		lc = c;
++	}
++
++	rc = mls_read_class(cladatum, fp);
++	if (rc)
++		goto bad;
++
++	rc = hashtab_insert(h, key, cladatum);
++	if (rc)
++		goto bad;
++out:
++	return rc;
++bad:
++	class_destroy(key, cladatum, NULL);
++	goto out;
++}
++
++static int role_read(struct policydb *p, struct hashtab *h, void *fp)
++{
++	char *key = 0;
++	struct role_datum *role;
++	int rc;
++	u32 *buf, len;
++
++	role = kmalloc(sizeof(*role), GFP_KERNEL);
++	if (!role) {
++		rc = -ENOMEM;
++		goto out;
++	}
++	memset(role, 0, sizeof(*role));
++
++	buf = next_entry(fp, sizeof(u32)*2);
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++
++	len = le32_to_cpu(buf[0]);
++	role->value = le32_to_cpu(buf[1]);
++
++	buf = next_entry(fp, len);
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++	key = kmalloc(len + 1,GFP_KERNEL);
++	if (!key) {
++		rc = -ENOMEM;
++		goto bad;
++	}
++	memcpy(key, buf, len);
++	key[len] = 0;
++
++	rc = ebitmap_read(&role->dominates, fp);
++	if (rc)
++		goto bad;
++
++	rc = ebitmap_read(&role->types, fp);
++	if (rc)
++		goto bad;
++
++	if (strcmp(key, OBJECT_R) == 0) {
++		if (role->value != OBJECT_R_VAL) {
++			printk(KERN_ERR "Role %s has wrong value %d\n",
++			       OBJECT_R, role->value);
++			rc = -EINVAL;
++			goto bad;
++		}
++		rc = 0;
++		goto bad;
++	}
++
++	rc = hashtab_insert(h, key, role);
++	if (rc)
++		goto bad;
++out:
++	return rc;
++bad:
++	role_destroy(key, role, NULL);
++	goto out;
++}
++
++static int type_read(struct policydb *p, struct hashtab *h, void *fp)
++{
++	char *key = 0;
++	struct type_datum *typdatum;
++	int rc;
++	u32 *buf, len;
++
++	typdatum = kmalloc(sizeof(*typdatum),GFP_KERNEL);
++	if (!typdatum) {
++		rc = -ENOMEM;
++		return rc;
++	}
++	memset(typdatum, 0, sizeof(*typdatum));
++
++	buf = next_entry(fp, sizeof(u32)*3);
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++
++	len = le32_to_cpu(buf[0]);
++	typdatum->value = le32_to_cpu(buf[1]);
++	typdatum->primary = le32_to_cpu(buf[2]);
++
++	buf = next_entry(fp, len);
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++	key = kmalloc(len + 1,GFP_KERNEL);
++	if (!key) {
++		rc = -ENOMEM;
++		goto bad;
++	}
++	memcpy(key, buf, len);
++	key[len] = 0;
++
++	rc = hashtab_insert(h, key, typdatum);
++	if (rc)
++		goto bad;
++out:
++	return rc;
++bad:
++	type_destroy(key, typdatum, NULL);
++	goto out;
++}
++
++static int user_read(struct policydb *p, struct hashtab *h, void *fp)
++{
++	char *key = 0;
++	struct user_datum *usrdatum;
++	int rc;
++	u32 *buf, len;
++
++
++	usrdatum = kmalloc(sizeof(*usrdatum), GFP_KERNEL);
++	if (!usrdatum) {
++		rc = -ENOMEM;
++		goto out;
++	}
++	memset(usrdatum, 0, sizeof(*usrdatum));
++
++	buf = next_entry(fp, sizeof(u32)*2);
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++
++	len = le32_to_cpu(buf[0]);
++	usrdatum->value = le32_to_cpu(buf[1]);
++
++	buf = next_entry(fp, len);
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++	key = kmalloc(len + 1,GFP_KERNEL);
++	if (!key) {
++		rc = -ENOMEM;
++		goto bad;
++	}
++	memcpy(key, buf, len);
++	key[len] = 0;
++
++	rc = ebitmap_read(&usrdatum->roles, fp);
++	if (rc)
++		goto bad;
++
++	rc = mls_read_user(usrdatum, fp);
++	if (rc)
++		goto bad;
++
++	rc = hashtab_insert(h, key, usrdatum);
++	if (rc)
++		goto bad;
++out:
++	return rc;
++bad:
++	user_destroy(key, usrdatum, NULL);
++	goto out;
++}
++
++static int (*read_f[SYM_NUM]) (struct policydb *p, struct hashtab *h, void *fp) =
++{
++	common_read,
++	class_read,
++	role_read,
++	type_read,
++	user_read
++	mls_read_f
++};
++
++#define mls_config(x) \
++       ((x) & POLICYDB_CONFIG_MLS) ? "mls" : "no_mls"
++
++/*
++ * Read the configuration data from a policy database binary
++ * representation file into a policy database structure.
++ */
++int policydb_read(struct policydb *p, void *fp)
++{
++	struct role_allow *ra, *lra;
++	struct role_trans *tr, *ltr;
++	struct ocontext *l, *c, *newc;
++	struct genfs *genfs_p, *genfs, *newgenfs;
++	int i, j, rc;
++	u32 *buf, len, len2, config, nprim, nel, nel2;
++	char *policydb_str;
++
++	config = 0;
++	mls_set_config(config);
++
++	rc = policydb_init(p);
++	if (rc)
++		goto out;
++
++	rc = -EINVAL;
++	/* Read the magic number and string length. */
++	buf = next_entry(fp, sizeof(u32)* 2);
++	if (!buf)
++		goto bad;
++
++	for (i = 0; i < 2; i++)
++		buf[i] = le32_to_cpu(buf[i]);
++
++	if (buf[0] != POLICYDB_MAGIC) {
++		printk(KERN_ERR "security:  policydb magic number 0x%x does "
++		       "not match expected magic number 0x%x\n",
++		       buf[0], POLICYDB_MAGIC);
++		goto bad;
++	}
++
++	len = buf[1];
++	if (len != strlen(POLICYDB_STRING)) {
++		printk(KERN_ERR "security:  policydb string length %d does not "
++		       "match expected length %d\n",
++		       len, strlen(POLICYDB_STRING));
++		goto bad;
++	}
++	buf = next_entry(fp, len);
++	if (!buf) {
++		printk(KERN_ERR "security:  truncated policydb string identifier\n");
++		goto bad;
++	}
++	policydb_str = kmalloc(len + 1,GFP_KERNEL);
++	if (!policydb_str) {
++		printk(KERN_ERR "security:  unable to allocate memory for policydb "
++		       "string of length %d\n", len);
++		rc = -ENOMEM;
++		goto bad;
++	}
++	memcpy(policydb_str, buf, len);
++	policydb_str[len] = 0;
++	if (strcmp(policydb_str, POLICYDB_STRING)) {
++		printk(KERN_ERR "security:  policydb string %s does not match "
++		       "my string %s\n", policydb_str, POLICYDB_STRING);
++		kfree(policydb_str);
++		goto bad;
++	}
++	/* Done with policydb_str. */
++	kfree(policydb_str);
++	policydb_str = NULL;
++
++	/* Read the version, config, and table sizes. */
++	buf = next_entry(fp, sizeof(u32)*4);
++	if (!buf)
++		goto bad;
++	for (i = 0; i < 4; i++)
++		buf[i] = le32_to_cpu(buf[i]);
++
++	if (buf[0] != POLICYDB_VERSION) {
++		printk(KERN_ERR "security:  policydb version %d does not match "
++		       "my version %d\n", buf[0], POLICYDB_VERSION);
++		goto bad;
++	}
++	if (buf[1] != config) {
++		printk(KERN_ERR "security:  policydb configuration (%s) does "
++		       "not match my configuration (%s)\n",
++		       mls_config(buf[1]),
++		       mls_config(config));
++		goto bad;
++	}
++	if (buf[2] != SYM_NUM || buf[3] != OCON_NUM) {
++		printk(KERN_ERR "security:  policydb table sizes (%d,%d) do "
++		       "not match mine (%d,%d)\n",
++		       buf[2], buf[3], SYM_NUM, OCON_NUM);
++		goto bad;
++	}
++
++	rc = mls_read_nlevels(p, fp);
++	if (rc)
++		goto bad;
++
++	for (i = 0; i < SYM_NUM; i++) {
++		buf = next_entry(fp, sizeof(u32)*2);
++		if (!buf) {
++			rc = -EINVAL;
++			goto bad;
++		}
++		nprim = le32_to_cpu(buf[0]);
++		nel = le32_to_cpu(buf[1]);
++		for (j = 0; j < nel; j++) {
++			rc = read_f[i](p, p->symtab[i].table, fp);
++			if (rc)
++				goto bad;
++		}
++
++		p->symtab[i].nprim = nprim;
++	}
++
++	rc = avtab_read(&p->te_avtab, fp, config);
++	if (rc)
++		goto bad;
++
++	buf = next_entry(fp, sizeof(u32));
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++	nel = le32_to_cpu(buf[0]);
++	ltr = NULL;
++	for (i = 0; i < nel; i++) {
++		tr = kmalloc(sizeof(*tr), GFP_KERNEL);
++		if (!tr) {
++			rc = -ENOMEM;
++			goto bad;
++		}
++		memset(tr, 0, sizeof(*tr));
++		if (ltr) {
++			ltr->next = tr;
++		} else {
++			p->role_tr = tr;
++		}
++		buf = next_entry(fp, sizeof(u32)*3);
++		if (!buf) {
++			rc = -EINVAL;
++			goto bad;
++		}
++		tr->role = le32_to_cpu(buf[0]);
++		tr->type = le32_to_cpu(buf[1]);
++		tr->new_role = le32_to_cpu(buf[2]);
++		ltr = tr;
++	}
++
++	buf = next_entry(fp, sizeof(u32));
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++	nel = le32_to_cpu(buf[0]);
++	lra = NULL;
++	for (i = 0; i < nel; i++) {
++		ra = kmalloc(sizeof(*ra), GFP_KERNEL);
++		if (!ra) {
++			rc = -ENOMEM;
++			goto bad;
++		}
++		memset(ra, 0, sizeof(*ra));
++		if (lra) {
++			lra->next = ra;
++		} else {
++			p->role_allow = ra;
++		}
++		buf = next_entry(fp, sizeof(u32)*2);
++		if (!buf) {
++			rc = -EINVAL;
++			goto bad;
++		}
++		ra->role = le32_to_cpu(buf[0]);
++		ra->new_role = le32_to_cpu(buf[1]);
++		lra = ra;
++	}
++
++	rc = policydb_index_classes(p);
++	if (rc)
++		goto bad;
++
++	rc = policydb_index_others(p);
++	if (rc)
++		goto bad;
++
++	for (i = 0; i < OCON_NUM; i++) {
++		buf = next_entry(fp, sizeof(u32));
++		if (!buf) {
++			rc = -EINVAL;
++			goto bad;
++		}
++		nel = le32_to_cpu(buf[0]);
++		l = NULL;
++		for (j = 0; j < nel; j++) {
++			c = kmalloc(sizeof(*c), GFP_KERNEL);
++			if (!c) {
++				rc = -ENOMEM;
++				goto bad;
++			}
++			memset(c, 0, sizeof(*c));
++			if (l) {
++				l->next = c;
++			} else {
++				p->ocontexts[i] = c;
++			}
++			l = c;
++			rc = -EINVAL;
++			switch (i) {
++			case OCON_ISID:
++				buf = next_entry(fp, sizeof(u32));
++				if (!buf)
++					goto bad;
++				c->sid[0] = le32_to_cpu(buf[0]);
++				rc = context_read_and_validate(&c->context[0], p, fp);
++				if (rc)
++					goto bad;
++				break;
++			case OCON_FS:
++			case OCON_NETIF:
++				buf = next_entry(fp, sizeof(u32));
++				if (!buf)
++					goto bad;
++				len = le32_to_cpu(buf[0]);
++				buf = next_entry(fp, len);
++				if (!buf)
++					goto bad;
++				c->u.name = kmalloc(len + 1,GFP_KERNEL);
++				if (!c->u.name) {
++					rc = -ENOMEM;
++					goto bad;
++				}
++				memcpy(c->u.name, buf, len);
++				c->u.name[len] = 0;
++				rc = context_read_and_validate(&c->context[0], p, fp);
++				if (rc)
++					goto bad;
++				rc = context_read_and_validate(&c->context[1], p, fp);
++				if (rc)
++					goto bad;
++				break;
++			case OCON_PORT:
++				buf = next_entry(fp, sizeof(u32)*3);
++				if (!buf)
++					goto bad;
++				c->u.port.protocol = le32_to_cpu(buf[0]);
++				c->u.port.low_port = le32_to_cpu(buf[1]);
++				c->u.port.high_port = le32_to_cpu(buf[2]);
++				rc = context_read_and_validate(&c->context[0], p, fp);
++				if (rc)
++					goto bad;
++				break;
++			case OCON_NODE:
++				buf = next_entry(fp, sizeof(u32)* 2);
++				if (!buf)
++					goto bad;
++				c->u.node.addr = le32_to_cpu(buf[0]);
++				c->u.node.mask = le32_to_cpu(buf[1]);
++				rc = context_read_and_validate(&c->context[0], p, fp);
++				if (rc)
++					goto bad;
++				break;
++			case OCON_FSUSE:
++				buf = next_entry(fp, sizeof(u32)*2);
++				if (!buf)
++					goto bad;
++				c->v.behavior = le32_to_cpu(buf[0]);
++				len = le32_to_cpu(buf[1]);
++				buf = next_entry(fp, len);
++				if (!buf)
++					goto bad;
++				c->u.name = kmalloc(len + 1,GFP_KERNEL);
++				if (!c->u.name) {
++					rc = -ENOMEM;
++					goto bad;
++				}
++				memcpy(c->u.name, buf, len);
++				c->u.name[len] = 0;
++				rc = context_read_and_validate(&c->context[0], p, fp);
++				if (rc)
++					goto bad;
++				break;
++			}
++		}
++	}
++
++	buf = next_entry(fp, sizeof(u32));
++	if (!buf) {
++		rc = -EINVAL;
++		goto bad;
++	}
++	nel = le32_to_cpu(buf[0]);
++	genfs_p = NULL;
++	rc = -EINVAL;
++	for (i = 0; i < nel; i++) {
++		newgenfs = kmalloc(sizeof(*newgenfs), GFP_KERNEL);
++		if (!newgenfs) {
++			rc = -ENOMEM;
++			goto bad;
++		}
++		memset(newgenfs, 0, sizeof(*newgenfs));
++		buf = next_entry(fp, sizeof(u32));
++		if (!buf)
++			goto bad;
++		len = le32_to_cpu(buf[0]);
++		buf = next_entry(fp, len);
++		if (!buf)
++			goto bad;
++		newgenfs->fstype = kmalloc(len + 1,GFP_KERNEL);
++		if (!newgenfs->fstype) {
++			rc = -ENOMEM;
++			goto bad;
++		}
++		memcpy(newgenfs->fstype, buf, len);
++		newgenfs->fstype[len] = 0;
++		for (genfs_p = NULL, genfs = p->genfs; genfs;
++		     genfs_p = genfs, genfs = genfs->next) {
++			if (strcmp(newgenfs->fstype, genfs->fstype) == 0) {
++				printk(KERN_ERR "security:  dup genfs "
++				       "fstype %s\n", newgenfs->fstype);
++				goto bad;
++			}
++			if (strcmp(newgenfs->fstype, genfs->fstype) < 0)
++				break;
++		}
++		newgenfs->next = genfs;
++		if (genfs_p)
++			genfs_p->next = newgenfs;
++		else
++			p->genfs = newgenfs;
++		buf = next_entry(fp, sizeof(u32));
++		if (!buf)
++			goto bad;
++		nel2 = le32_to_cpu(buf[0]);
++		for (j = 0; j < nel2; j++) {
++			newc = kmalloc(sizeof(*newc), GFP_KERNEL);
++			if (!newc) {
++				rc = -ENOMEM;
++				goto bad;
++			}
++			memset(newc, 0, sizeof(*newc));
++			buf = next_entry(fp, sizeof(u32));
++			if (!buf)
++				goto bad;
++			len = le32_to_cpu(buf[0]);
++			buf = next_entry(fp, len);
++			if (!buf)
++				goto bad;
++			newc->u.name = kmalloc(len + 1,GFP_KERNEL);
++			if (!newc->u.name) {
++				rc = -ENOMEM;
++				goto bad;
++			}
++			memcpy(newc->u.name, buf, len);
++			newc->u.name[len] = 0;
++			buf = next_entry(fp, sizeof(u32));
++			if (!buf)
++				goto bad;
++			newc->v.sclass = le32_to_cpu(buf[0]);
++			if (context_read_and_validate(&newc->context[0], p, fp))
++				goto bad;
++			for (l = NULL, c = newgenfs->head; c;
++			     l = c, c = c->next) {
++				if (!strcmp(newc->u.name, c->u.name) &&
++				    (!c->v.sclass || !newc->v.sclass ||
++				     newc->v.sclass == c->v.sclass)) {
++					printk(KERN_ERR "security:  dup genfs "
++					       "entry (%s,%s)\n",
++					       newgenfs->fstype, c->u.name);
++					goto bad;
++				}
++				len = strlen(newc->u.name);
++				len2 = strlen(c->u.name);
++				if (len > len2)
++					break;
++			}
++			newc->next = c;
++			if (l)
++				l->next = newc;
++			else
++				newgenfs->head = newc;
++		}
++	}
++
++	rc = mls_read_trusted(p, fp);
++	if (rc)
++		goto bad;
++out:
++	return rc;
++bad:
++	policydb_destroy(p);
++	goto out;
++}
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/policydb.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,256 @@
++/*
++ * A policy database (policydb) specifies the
++ * configuration data for the security policy.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_POLICYDB_H_
++#define _SS_POLICYDB_H_
++
++#include "symtab.h"
++#include "avtab.h"
++#include "sidtab.h"
++#include "context.h"
++#include "constraint.h"
++
++/*
++ * A datum type is defined for each kind of symbol
++ * in the configuration data:  individual permissions,
++ * common prefixes for access vectors, classes,
++ * users, roles, types, sensitivities, categories, etc.
++ */
++
++/* Permission attributes */
++struct perm_datum {
++	u32 value;		/* permission bit + 1 */
++#ifdef CONFIG_SECURITY_SELINUX_MLS
++#define MLS_BASE_READ    1	/* MLS base permission `read' */
++#define MLS_BASE_WRITE   2	/* MLS base permission `write' */
++#define MLS_BASE_READBY  4	/* MLS base permission `readby' */
++#define MLS_BASE_WRITEBY 8	/* MLS base permission `writeby' */
++	u32 base_perms;		/* MLS base permission mask */
++#endif
++};
++
++/* Attributes of a common prefix for access vectors */
++struct common_datum {
++	u32 value;			/* internal common value */
++	struct symtab permissions;	/* common permissions */
++};
++
++/* Class attributes */
++struct class_datum {
++	u32 value;			/* class value */
++	char *comkey;			/* common name */
++	struct common_datum *comdatum;	/* common datum */
++	struct symtab permissions;	/* class-specific permission symbol table */
++	struct constraint_node *constraints;	/* constraints on class permissions */
++#ifdef CONFIG_SECURITY_SELINUX_MLS
++	struct mls_perms mlsperms;	/* MLS base permission masks */
++#endif
++};
++
++/* Role attributes */
++struct role_datum {
++	u32 value;			/* internal role value */
++	struct ebitmap dominates;	/* set of roles dominated by this role */
++	struct ebitmap types;		/* set of authorized types for role */
++};
++
++struct role_trans {
++	u32 role;		/* current role */
++	u32 type;		/* program executable type */
++	u32 new_role;		/* new role */
++	struct role_trans *next;
++};
++
++struct role_allow {
++	u32 role;		/* current role */
++	u32 new_role;		/* new role */
++	struct role_allow *next;
++};
++
++/* Type attributes */
++struct type_datum {
++	u32 value;		/* internal type value */
++	unsigned char primary;	/* primary name? */
++};
++
++/* User attributes */
++struct user_datum {
++	u32 value;			/* internal user value */
++	struct ebitmap roles;		/* set of authorized roles for user */
++#ifdef CONFIG_SECURITY_SELINUX_MLS
++	struct mls_range_list *ranges;	/* list of authorized MLS ranges for user */
++#endif
++};
++
++
++#ifdef CONFIG_SECURITY_SELINUX_MLS
++/* Sensitivity attributes */
++struct level_datum {
++	struct mls_level *level;	/* sensitivity and associated categories */
++	unsigned char isalias;	/* is this sensitivity an alias for another? */
++};
++
++/* Category attributes */
++struct cat_datum {
++	u32 value;		/* internal category bit + 1 */
++	unsigned char isalias;  /* is this category an alias for another? */
++};
++#endif
++
++
++/*
++ * The configuration data includes security contexts for
++ * initial SIDs, unlabeled file systems, TCP and UDP port numbers,
++ * network interfaces, and nodes.  This structure stores the
++ * relevant data for one such entry.  Entries of the same kind
++ * (e.g. all initial SIDs) are linked together into a list.
++ */
++struct ocontext {
++	union {
++		char *name;	/* name of initial SID, fs, netif, fstype, path */
++		struct {
++			u8 protocol;
++			u16 low_port;
++			u16 high_port;
++		} port;		/* TCP or UDP port information */
++		struct {
++			u32 addr;
++			u32 mask;
++		} node;		/* node information */
++	} u;
++	union {
++		u32 sclass;  /* security class for genfs */
++		u32 behavior;  /* labeling behavior for fs_use */
++	} v;
++	struct context context[2];	/* security context(s) */
++	u32 sid[2];	/* SID(s) */
++	struct ocontext *next;
++};
++
++struct genfs {
++	char *fstype;
++	struct ocontext *head;
++	struct genfs *next;
++};
++
++/* symbol table array indices */
++#define SYM_COMMONS 0
++#define SYM_CLASSES 1
++#define SYM_ROLES   2
++#define SYM_TYPES   3
++#define SYM_USERS   4
++#ifdef CONFIG_SECURITY_SELINUX_MLS
++#define SYM_LEVELS  5
++#define SYM_CATS    6
++#define SYM_NUM     7
++#else
++#define SYM_NUM     5
++#endif
++
++/* object context array indices */
++#define OCON_ISID  0	/* initial SIDs */
++#define OCON_FS    1	/* unlabeled file systems */
++#define OCON_PORT  2	/* TCP and UDP port numbers */
++#define OCON_NETIF 3	/* network interfaces */
++#define OCON_NODE  4	/* nodes */
++#define OCON_FSUSE 5	/* fs_use */
++#define OCON_NUM   6
++
++/* The policy database */
++struct policydb {
++	/* symbol tables */
++	struct symtab symtab[SYM_NUM];
++#define p_commons symtab[SYM_COMMONS]
++#define p_classes symtab[SYM_CLASSES]
++#define p_roles symtab[SYM_ROLES]
++#define p_types symtab[SYM_TYPES]
++#define p_users symtab[SYM_USERS]
++#define p_levels symtab[SYM_LEVELS]
++#define p_cats symtab[SYM_CATS]
++
++	/* symbol names indexed by (value - 1) */
++	char **sym_val_to_name[SYM_NUM];
++#define p_common_val_to_name sym_val_to_name[SYM_COMMONS]
++#define p_class_val_to_name sym_val_to_name[SYM_CLASSES]
++#define p_role_val_to_name sym_val_to_name[SYM_ROLES]
++#define p_type_val_to_name sym_val_to_name[SYM_TYPES]
++#define p_user_val_to_name sym_val_to_name[SYM_USERS]
++#define p_sens_val_to_name sym_val_to_name[SYM_LEVELS]
++#define p_cat_val_to_name sym_val_to_name[SYM_CATS]
++
++	/* class, role, and user attributes indexed by (value - 1) */
++	struct class_datum **class_val_to_struct;
++	struct role_datum **role_val_to_struct;
++	struct user_datum **user_val_to_struct;
++
++	/* type enforcement access vectors and transitions */
++	struct avtab te_avtab;
++
++	/* role transitions */
++	struct role_trans *role_tr;
++
++	/* role allows */
++	struct role_allow *role_allow;
++
++	/* security contexts of initial SIDs, unlabeled file systems,
++	   TCP or UDP port numbers, network interfaces and nodes */
++	struct ocontext *ocontexts[OCON_NUM];
++
++        /* security contexts for files in filesystems that cannot support
++	   a persistent label mapping or use another
++	   fixed labeling behavior. */
++  	struct genfs *genfs;
++
++#ifdef CONFIG_SECURITY_SELINUX_MLS
++	/* number of legitimate MLS levels */
++	u32 nlevels;
++
++	struct ebitmap trustedreaders;
++	struct ebitmap trustedwriters;
++	struct ebitmap trustedobjects;
++#endif
++};
++
++extern int policydb_init(struct policydb *p);
++extern int policydb_index_classes(struct policydb *p);
++extern int policydb_index_others(struct policydb *p);
++extern int constraint_expr_destroy(struct constraint_expr *expr);
++extern void policydb_destroy(struct policydb *p);
++extern int policydb_load_isids(struct policydb *p, struct sidtab *s);
++extern int policydb_context_isvalid(struct policydb *p, struct context *c);
++extern int policydb_read(struct policydb *p, void *fp);
++
++#define PERM_SYMTAB_SIZE 32
++
++#define POLICYDB_VERSION 15
++#define POLICYDB_CONFIG_MLS    1
++
++#define OBJECT_R "object_r"
++#define OBJECT_R_VAL 1
++
++#define POLICYDB_MAGIC SELINUX_MAGIC
++#define POLICYDB_STRING "SE Linux"
++
++struct policy_file {
++	char *data;
++	size_t len;
++};
++
++static inline void *next_entry(struct policy_file *fp, size_t bytes)
++{
++	void *buf;
++
++	if (bytes > fp->len)
++		return NULL;
++
++	buf = fp->data;
++	fp->data += bytes;
++	fp->len -= bytes;
++	return buf;
++}
++
++#endif	/* _SS_POLICYDB_H_ */
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/services.c	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,1413 @@
++/*
++ * Implementation of the security services.
++ *
++ * Authors : Stephen Smalley, <sds@epoch.ncsc.mil>
++ *           James Morris <jmorris@redhat.com>
++ *
++ *  Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.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.
++ */
++#include "context.h"
++#include "policydb.h"
++#include "sidtab.h"
++#include "services.h"
++#include "mls.h"
++
++static rwlock_t policy_rwlock = RW_LOCK_UNLOCKED;
++#define POLICY_RDLOCK read_lock(&policy_rwlock)
++#define POLICY_WRLOCK write_lock_irq(&policy_rwlock)
++#define POLICY_RDUNLOCK read_unlock(&policy_rwlock)
++#define POLICY_WRUNLOCK write_unlock_irq(&policy_rwlock)
++
++static DECLARE_MUTEX(load_sem);
++#define LOAD_LOCK down(&load_sem)
++#define LOAD_UNLOCK up(&load_sem)
++
++struct sidtab sidtab;
++struct policydb policydb;
++int ss_initialized = 0;
++
++/*
++ * The largest sequence number that has been used when
++ * providing an access decision to the access vector cache.
++ * The sequence number only changes when a policy change
++ * occurs.
++ */
++static u32 latest_granting = 0;
++
++/*
++ * Return the boolean value of a constraint expression
++ * when it is applied to the specified source and target
++ * security contexts.
++ */
++static int constraint_expr_eval(struct context *scontext,
++				struct context *tcontext,
++				struct constraint_expr *cexpr)
++{
++	u32 val1, val2;
++	struct context *c;
++	struct role_datum *r1, *r2;
++	struct constraint_expr *e;
++	int s[CEXPR_MAXDEPTH];
++	int sp = -1;
++
++	for (e = cexpr; e; e = e->next) {
++		switch (e->expr_type) {
++		case CEXPR_NOT:
++			BUG_ON(sp < 0);
++			s[sp] = !s[sp];
++			break;
++		case CEXPR_AND:
++			BUG_ON(sp < 1);
++			sp--;
++			s[sp] &= s[sp+1];
++			break;
++		case CEXPR_OR:
++			BUG_ON(sp < 1);
++			sp--;
++			s[sp] |= s[sp+1];
++			break;
++		case CEXPR_ATTR:
++			if (sp == (CEXPR_MAXDEPTH-1))
++				return 0;
++			switch (e->attr) {
++			case CEXPR_USER:
++				val1 = scontext->user;
++				val2 = tcontext->user;
++				break;
++			case CEXPR_TYPE:
++				val1 = scontext->type;
++				val2 = tcontext->type;
++				break;
++			case CEXPR_ROLE:
++				val1 = scontext->role;
++				val2 = tcontext->role;
++				r1 = policydb.role_val_to_struct[val1 - 1];
++				r2 = policydb.role_val_to_struct[val2 - 1];
++				switch (e->op) {
++				case CEXPR_DOM:
++					s[++sp] = ebitmap_get_bit(&r1->dominates,
++								  val2 - 1);
++					continue;
++				case CEXPR_DOMBY:
++					s[++sp] = ebitmap_get_bit(&r2->dominates,
++								  val1 - 1);
++					continue;
++				case CEXPR_INCOMP:
++					s[++sp] = ( !ebitmap_get_bit(&r1->dominates,
++								     val2 - 1) &&
++						    !ebitmap_get_bit(&r2->dominates,
++								     val1 - 1) );
++					continue;
++				default:
++					break;
++				}
++				break;
++			default:
++				BUG();
++				return 0;
++			}
++
++			switch (e->op) {
++			case CEXPR_EQ:
++				s[++sp] = (val1 == val2);
++				break;
++			case CEXPR_NEQ:
++				s[++sp] = (val1 != val2);
++				break;
++			default:
++				BUG();
++				return 0;
++			}
++			break;
++		case CEXPR_NAMES:
++			if (sp == (CEXPR_MAXDEPTH-1))
++				return 0;
++			c = scontext;
++			if (e->attr & CEXPR_TARGET)
++				c = tcontext;
++			if (e->attr & CEXPR_USER)
++				val1 = c->user;
++			else if (e->attr & CEXPR_ROLE)
++				val1 = c->role;
++			else if (e->attr & CEXPR_TYPE)
++				val1 = c->type;
++			else {
++				BUG();
++				return 0;
++			}
++
++			switch (e->op) {
++			case CEXPR_EQ:
++				s[++sp] = ebitmap_get_bit(&e->names, val1 - 1);
++				break;
++			case CEXPR_NEQ:
++				s[++sp] = !ebitmap_get_bit(&e->names, val1 - 1);
++				break;
++			default:
++				BUG();
++				return 0;
++			}
++			break;
++		default:
++			BUG();
++			return 0;
++		}
++	}
++
++	BUG_ON(sp != 0);
++	return s[0];
++}
++
++/*
++ * Compute access vectors based on a context structure pair for
++ * the permissions in a particular class.
++ */
++static int context_struct_compute_av(struct context *scontext,
++				     struct context *tcontext,
++				     u16 tclass,
++				     u32 requested,
++				     struct av_decision *avd)
++{
++	struct constraint_node *constraint;
++	struct role_allow *ra;
++	struct avtab_key avkey;
++	struct avtab_datum *avdatum;
++	struct class_datum *tclass_datum;
++
++	if (!tclass || tclass > policydb.p_classes.nprim) {
++		printk(KERN_ERR "security_compute_av:  unrecognized class %d\n",
++		       tclass);
++		return -EINVAL;
++	}
++	tclass_datum = policydb.class_val_to_struct[tclass - 1];
++
++	/*
++	 * Initialize the access vectors to the default values.
++	 */
++	avd->allowed = 0;
++	avd->decided = 0xffffffff;
++	avd->auditallow = 0;
++	avd->auditdeny = 0xffffffff;
++	avd->seqno = latest_granting;
++
++	/*
++	 * If a specific type enforcement rule was defined for
++	 * this permission check, then use it.
++	 */
++	avkey.source_type = scontext->type;
++	avkey.target_type = tcontext->type;
++	avkey.target_class = tclass;
++	avdatum = avtab_search(&policydb.te_avtab, &avkey, AVTAB_AV);
++	if (avdatum) {
++		if (avdatum->specified & AVTAB_ALLOWED)
++			avd->allowed = avtab_allowed(avdatum);
++		if (avdatum->specified & AVTAB_AUDITDENY)
++			avd->auditdeny = avtab_auditdeny(avdatum);
++		if (avdatum->specified & AVTAB_AUDITALLOW)
++			avd->auditallow = avtab_auditallow(avdatum);
++	}
++
++	/*
++	 * Remove any permissions prohibited by the MLS policy.
++	 */
++	mls_compute_av(scontext, tcontext, tclass_datum, &avd->allowed);
++
++	/*
++	 * Remove any permissions prohibited by a constraint.
++	 */
++	constraint = tclass_datum->constraints;
++	while (constraint) {
++		if ((constraint->permissions & (avd->allowed)) &&
++		    !constraint_expr_eval(scontext, tcontext,
++					  constraint->expr)) {
++			avd->allowed = (avd->allowed) & ~(constraint->permissions);
++		}
++		constraint = constraint->next;
++	}
++
++	/*
++	 * If checking process transition permission and the
++	 * role is changing, then check the (current_role, new_role)
++	 * pair.
++	 */
++	if (tclass == SECCLASS_PROCESS &&
++	    avd->allowed && PROCESS__TRANSITION &&
++	    scontext->role != tcontext->role) {
++		for (ra = policydb.role_allow; ra; ra = ra->next) {
++			if (scontext->role == ra->role &&
++			    tcontext->role == ra->new_role)
++				break;
++		}
++		if (!ra)
++			avd->allowed = (avd->allowed) & ~(PROCESS__TRANSITION);
++	}
++
++	return 0;
++}
++
++/**
++ * security_compute_av - Compute access vector decisions.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ * @requested: requested permissions
++ * @avd: access vector decisions
++ *
++ * Compute a set of access vector decisions based on the
++ * SID pair (@ssid, @tsid) for the permissions in @tclass.
++ * Return -%EINVAL if any of the parameters are invalid or %0
++ * if the access vector decisions were computed successfully.
++ */
++int security_compute_av(u32 ssid,
++			u32 tsid,
++			u16 tclass,
++			u32 requested,
++			struct av_decision *avd)
++{
++	struct context *scontext = 0, *tcontext = 0;
++	int rc = 0;
++
++	if (!ss_initialized) {
++		avd->allowed = requested;
++		avd->decided = requested;
++		avd->auditallow = 0;
++		avd->auditdeny = 0xffffffff;
++		avd->seqno = latest_granting;
++		return 0;
++	}
++
++	POLICY_RDLOCK;
++
++	scontext = sidtab_search(&sidtab, ssid);
++	if (!scontext) {
++		printk(KERN_ERR "security_compute_av:  unrecognized SID %d\n",
++		       ssid);
++		rc = -EINVAL;
++		goto out;
++	}
++	tcontext = sidtab_search(&sidtab, tsid);
++	if (!tcontext) {
++		printk(KERN_ERR "security_compute_av:  unrecognized SID %d\n",
++		       tsid);
++		rc = -EINVAL;
++		goto out;
++	}
++
++	rc = context_struct_compute_av(scontext, tcontext, tclass,
++				       requested, avd);
++out:
++	POLICY_RDUNLOCK;
++	return rc;
++}
++
++/*
++ * Write the security context string representation of
++ * the context structure `context' into a dynamically
++ * allocated string of the correct size.  Set `*scontext'
++ * to point to this string and set `*scontext_len' to
++ * the length of the string.
++ */
++int context_struct_to_string(struct context *context, char **scontext, u32 *scontext_len)
++{
++	char *scontextp;
++
++	*scontext = 0;
++	*scontext_len = 0;
++
++	/* Compute the size of the context. */
++	*scontext_len += strlen(policydb.p_user_val_to_name[context->user - 1]) + 1;
++	*scontext_len += strlen(policydb.p_role_val_to_name[context->role - 1]) + 1;
++	*scontext_len += strlen(policydb.p_type_val_to_name[context->type - 1]) + 1;
++	*scontext_len += mls_compute_context_len(context);
++
++	/* Allocate space for the context; caller must free this space. */
++	scontextp = kmalloc(*scontext_len+1,GFP_ATOMIC);
++	if (!scontextp) {
++		return -ENOMEM;
++	}
++	*scontext = scontextp;
++
++	/*
++	 * Copy the user name, role name and type name into the context.
++	 */
++	sprintf(scontextp, "%s:%s:%s:",
++		policydb.p_user_val_to_name[context->user - 1],
++		policydb.p_role_val_to_name[context->role - 1],
++		policydb.p_type_val_to_name[context->type - 1]);
++	scontextp += strlen(policydb.p_user_val_to_name[context->user - 1]) +
++	             1 + strlen(policydb.p_role_val_to_name[context->role - 1]) +
++	             1 + strlen(policydb.p_type_val_to_name[context->type - 1]) + 1;
++
++	mls_sid_to_context(context, &scontextp);
++
++	scontextp--;
++	*scontextp = 0;
++
++	return 0;
++}
++
++#include "initial_sid_to_string.h"
++
++/**
++ * security_sid_to_context - Obtain a context for a given SID.
++ * @sid: security identifier, SID
++ * @scontext: security context
++ * @scontext_len: length in bytes
++ *
++ * Write the string representation of the context associated with @sid
++ * into a dynamically allocated string of the correct size.  Set @scontext
++ * to point to this string and set @scontext_len to the length of the string.
++ */
++int security_sid_to_context(u32 sid, char **scontext, u32 *scontext_len)
++{
++	struct context *context;
++	int rc = 0;
++
++	if (!ss_initialized) {
++		if (sid <= SECINITSID_NUM) {
++			char *scontextp;
++
++			*scontext_len = strlen(initial_sid_to_string[sid]) + 1;
++			scontextp = kmalloc(*scontext_len,GFP_KERNEL);
++			strcpy(scontextp, initial_sid_to_string[sid]);
++			*scontext = scontextp;
++			goto out;
++		}
++		printk(KERN_ERR "security_sid_to_context:  called before initial "
++		       "load_policy on unknown SID %d\n", sid);
++		rc = -EINVAL;
++		goto out;
++	}
++	POLICY_RDLOCK;
++	context = sidtab_search(&sidtab, sid);
++	if (!context) {
++		printk(KERN_ERR "security_sid_to_context:  unrecognized SID "
++		       "%d\n", sid);
++		rc = -EINVAL;
++		goto out_unlock;
++	}
++	rc = context_struct_to_string(context, scontext, scontext_len);
++out_unlock:
++	POLICY_RDUNLOCK;
++out:
++	return rc;
++
++}
++
++/**
++ * security_context_to_sid - Obtain a SID for a given security context.
++ * @scontext: security context
++ * @scontext_len: length in bytes
++ * @sid: security identifier, SID
++ *
++ * Obtains a SID associated with the security context that
++ * has the string representation specified by @scontext.
++ * Returns -%EINVAL if the context is invalid, -%ENOMEM if insufficient
++ * memory is available, or 0 on success.
++ */
++int security_context_to_sid(char *scontext, u32 scontext_len, u32 *sid)
++{
++	char *scontext2;
++	struct context context;
++	struct role_datum *role;
++	struct type_datum *typdatum;
++	struct user_datum *usrdatum;
++	char *scontextp, *p, oldc;
++	int rc = 0;
++
++	if (!ss_initialized) {
++		int i;
++
++		for (i = 1; i < SECINITSID_NUM; i++) {
++			if (!strcmp(initial_sid_to_string[i], scontext)) {
++				*sid = i;
++				goto out;
++			}
++		}
++		printk(KERN_ERR "security_context_to_sid: called before "
++		       "initial load_policy on unknown context %s\n", scontext);
++		rc = -EINVAL;
++		goto out;
++	}
++	*sid = SECSID_NULL;
++
++	/* Copy the string so that we can modify the copy as we parse it.
++	   The string should already by null terminated, but we append a
++	   null suffix to the copy to avoid problems with the existing
++	   attr package, which doesn't view the null terminator as part
++	   of the attribute value. */
++	scontext2 = kmalloc(scontext_len+1,GFP_KERNEL);
++	if (!scontext2) {
++		rc = -ENOMEM;
++		goto out;
++	}
++	memcpy(scontext2, scontext, scontext_len);
++	scontext2[scontext_len] = 0;
++
++	context_init(&context);
++	*sid = SECSID_NULL;
++
++	POLICY_RDLOCK;
++
++	/* Parse the security context. */
++
++	rc = -EINVAL;
++	scontextp = (char *) scontext2;
++
++	/* Extract the user. */
++	p = scontextp;
++	while (*p && *p != ':')
++		p++;
++
++	if (*p == 0)
++		goto out_unlock;
++
++	*p++ = 0;
++
++	usrdatum = hashtab_search(policydb.p_users.table, scontextp);
++	if (!usrdatum)
++		goto out_unlock;
++
++	context.user = usrdatum->value;
++
++	/* Extract role. */
++	scontextp = p;
++	while (*p && *p != ':')
++		p++;
++
++	if (*p == 0)
++		goto out_unlock;
++
++	*p++ = 0;
++
++	role = hashtab_search(policydb.p_roles.table, scontextp);
++	if (!role)
++		goto out_unlock;
++	context.role = role->value;
++
++	/* Extract type. */
++	scontextp = p;
++	while (*p && *p != ':')
++		p++;
++	oldc = *p;
++	*p++ = 0;
++
++	typdatum = hashtab_search(policydb.p_types.table, scontextp);
++	if (!typdatum)
++		goto out_unlock;
++
++	context.type = typdatum->value;
++
++	rc = mls_context_to_sid(oldc, &p, &context);
++	if (rc)
++		goto out_unlock;
++
++	/* Check the validity of the new context. */
++	if (!policydb_context_isvalid(&policydb, &context)) {
++		rc = -EINVAL;
++		goto out_unlock;
++	}
++	/* Obtain the new sid. */
++	rc = sidtab_context_to_sid(&sidtab, &context, sid);
++out_unlock:
++	POLICY_RDUNLOCK;
++	context_destroy(&context);
++	kfree(scontext2);
++out:
++	return rc;
++}
++
++static inline int compute_sid_handle_invalid_context(
++	struct context *scontext,
++	struct context *tcontext,
++	u16 tclass,
++	struct context *newcontext)
++{
++	int rc = 0;
++
++	if (selinux_enforcing) {
++		rc = -EACCES;
++	} else {
++		char *s, *t, *n;
++		u32 slen, tlen, nlen;
++
++		context_struct_to_string(scontext, &s, &slen);
++		context_struct_to_string(tcontext, &t, &tlen);
++		context_struct_to_string(newcontext, &n, &nlen);
++		printk(KERN_ERR "security_compute_sid:  invalid context %s", n);
++		printk(" for scontext=%s", s);
++		printk(" tcontext=%s", t);
++		printk(" tclass=%s\n", policydb.p_class_val_to_name[tclass-1]);
++		kfree(s);
++		kfree(t);
++		kfree(n);
++	}
++	return rc;
++}
++
++static int security_compute_sid(u32 ssid,
++				u32 tsid,
++				u16 tclass,
++				u32 specified,
++				u32 *out_sid)
++{
++	struct context *scontext = 0, *tcontext = 0, newcontext;
++	struct role_trans *roletr = 0;
++	struct avtab_key avkey;
++	struct avtab_datum *avdatum;
++	unsigned int type_change = 0;
++	int rc = 0;
++
++	if (!ss_initialized) {
++		switch (tclass) {
++		case SECCLASS_PROCESS:
++			*out_sid = ssid;
++			break;
++		default:
++			*out_sid = tsid;
++			break;
++		}
++		goto out;
++	}
++
++	POLICY_RDLOCK;
++
++	scontext = sidtab_search(&sidtab, ssid);
++	if (!scontext) {
++		printk(KERN_ERR "security_compute_sid:  unrecognized SID %d\n",
++		       ssid);
++		rc = -EINVAL;
++		goto out_unlock;
++	}
++	tcontext = sidtab_search(&sidtab, tsid);
++	if (!tcontext) {
++		printk(KERN_ERR "security_compute_sid:  unrecognized SID %d\n",
++		       tsid);
++		rc = -EINVAL;
++		goto out_unlock;
++	}
++
++	context_init(&newcontext);
++
++	/* Set the user identity. */
++	switch (specified) {
++	case AVTAB_TRANSITION:
++	case AVTAB_CHANGE:
++		/* Use the process user identity. */
++		newcontext.user = scontext->user;
++		break;
++	case AVTAB_MEMBER:
++		/* Use the related object owner. */
++		newcontext.user = tcontext->user;
++		break;
++	}
++
++	/* Set the role and type to default values. */
++	switch (tclass) {
++	case SECCLASS_PROCESS:
++		/* Use the current role and type of process. */
++		newcontext.role = scontext->role;
++		newcontext.type = scontext->type;
++		break;
++	default:
++		/* Use the well-defined object role. */
++		newcontext.role = OBJECT_R_VAL;
++		/* Use the type of the related object. */
++		newcontext.type = tcontext->type;
++	}
++
++	/* Look for a type transition/member/change rule. */
++	avkey.source_type = scontext->type;
++	avkey.target_type = tcontext->type;
++	avkey.target_class = tclass;
++	avdatum = avtab_search(&policydb.te_avtab, &avkey, AVTAB_TYPE);
++	type_change = (avdatum && (avdatum->specified & specified));
++	if (type_change) {
++		/* Use the type from the type transition/member/change rule. */
++		switch (specified) {
++		case AVTAB_TRANSITION:
++			newcontext.type = avtab_transition(avdatum);
++			break;
++		case AVTAB_MEMBER:
++			newcontext.type = avtab_member(avdatum);
++			break;
++		case AVTAB_CHANGE:
++			newcontext.type = avtab_change(avdatum);
++			break;
++		}
++	}
++
++	/* Check for class-specific changes. */
++	switch (tclass) {
++	case SECCLASS_PROCESS:
++		if (specified & AVTAB_TRANSITION) {
++			/* Look for a role transition rule. */
++			for (roletr = policydb.role_tr; roletr;
++			     roletr = roletr->next) {
++				if (roletr->role == scontext->role &&
++				    roletr->type == tcontext->type) {
++					/* Use the role transition rule. */
++					newcontext.role = roletr->new_role;
++					break;
++				}
++			}
++		}
++
++		if (!type_change && !roletr) {
++			/* No change in process role or type. */
++			*out_sid = ssid;
++			goto out_unlock;
++
++		}
++		break;
++	default:
++		if (!type_change &&
++		    (newcontext.user == tcontext->user) &&
++		    mls_context_cmp(scontext, tcontext)) {
++                        /* No change in object type, owner,
++			   or MLS attributes. */
++			*out_sid = tsid;
++			goto out_unlock;
++		}
++		break;
++	}
++
++	/* Set the MLS attributes.
++	   This is done last because it may allocate memory. */
++	rc = mls_compute_sid(scontext, tcontext, tclass, specified, &newcontext);
++	if (rc)
++		goto out_unlock;
++
++	/* Check the validity of the context. */
++	if (!policydb_context_isvalid(&policydb, &newcontext)) {
++		rc = compute_sid_handle_invalid_context(scontext,
++							tcontext,
++							tclass,
++							&newcontext);
++		if (rc)
++			goto out_unlock;
++	}
++	/* Obtain the sid for the context. */
++	rc = sidtab_context_to_sid(&sidtab, &newcontext, out_sid);
++out_unlock:
++	POLICY_RDUNLOCK;
++	context_destroy(&newcontext);
++out:
++	return rc;
++}
++
++/**
++ * security_transition_sid - Compute the SID for a new subject/object.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ * @out_sid: security identifier for new subject/object
++ *
++ * Compute a SID to use for labeling a new subject or object in the
++ * class @tclass based on a SID pair (@ssid, @tsid).
++ * Return -%EINVAL if any of the parameters are invalid, -%ENOMEM
++ * if insufficient memory is available, or %0 if the new SID was
++ * computed successfully.
++ */
++int security_transition_sid(u32 ssid,
++			    u32 tsid,
++			    u16 tclass,
++			    u32 *out_sid)
++{
++	return security_compute_sid(ssid, tsid, tclass, AVTAB_TRANSITION, out_sid);
++}
++
++/**
++ * security_member_sid - Compute the SID for member selection.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ * @out_sid: security identifier for selected member
++ *
++ * Compute a SID to use when selecting a member of a polyinstantiated
++ * object of class @tclass based on a SID pair (@ssid, @tsid).
++ * Return -%EINVAL if any of the parameters are invalid, -%ENOMEM
++ * if insufficient memory is available, or %0 if the SID was
++ * computed successfully.
++ */
++int security_member_sid(u32 ssid,
++			u32 tsid,
++			u16 tclass,
++			u32 *out_sid)
++{
++	return security_compute_sid(ssid, tsid, tclass, AVTAB_MEMBER, out_sid);
++}
++
++/**
++ * security_change_sid - Compute the SID for object relabeling.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ * @out_sid: security identifier for selected member
++ *
++ * Compute a SID to use for relabeling an object of class @tclass
++ * based on a SID pair (@ssid, @tsid).
++ * Return -%EINVAL if any of the parameters are invalid, -%ENOMEM
++ * if insufficient memory is available, or %0 if the SID was
++ * computed successfully.
++ */
++int security_change_sid(u32 ssid,
++			u32 tsid,
++			u16 tclass,
++			u32 *out_sid)
++{
++	return security_compute_sid(ssid, tsid, tclass, AVTAB_CHANGE, out_sid);
++}
++
++/*
++ * Verify that each permission that is defined under the
++ * existing policy is still defined with the same value
++ * in the new policy.
++ */
++static int validate_perm(void *key, void *datum, void *p)
++{
++	struct hashtab *h;
++	struct perm_datum *perdatum, *perdatum2;
++	int rc = 0;
++
++
++	h = p;
++	perdatum = datum;
++
++	perdatum2 = hashtab_search(h, key);
++	if (!perdatum2) {
++		printk(KERN_ERR "security:  permission %s disappeared",
++		       (char *)key);
++		rc = -ENOENT;
++		goto out;
++	}
++	if (perdatum->value != perdatum2->value) {
++		printk(KERN_ERR "security:  the value of permission %s changed",
++		       (char *)key);
++		rc = -EINVAL;
++	}
++out:
++	return rc;
++}
++
++/*
++ * Verify that each class that is defined under the
++ * existing policy is still defined with the same
++ * attributes in the new policy.
++ */
++static int validate_class(void *key, void *datum, void *p)
++{
++	struct policydb *newp;
++	struct class_datum *cladatum, *cladatum2;
++	int rc;
++
++	newp = p;
++	cladatum = datum;
++
++	cladatum2 = hashtab_search(newp->p_classes.table, key);
++	if (!cladatum2) {
++		printk(KERN_ERR "security:  class %s disappeared\n",
++		       (char *)key);
++		rc = -ENOENT;
++		goto out;
++	}
++	if (cladatum->value != cladatum2->value) {
++		printk(KERN_ERR "security:  the value of class %s changed\n",
++		       (char *)key);
++		rc = -EINVAL;
++		goto out;
++	}
++	if ((cladatum->comdatum && !cladatum2->comdatum) ||
++	    (!cladatum->comdatum && cladatum2->comdatum)) {
++		printk(KERN_ERR "security:  the inherits clause for the access "
++		       "vector definition for class %s changed\n", (char *)key);
++		rc = -EINVAL;
++		goto out;
++	}
++	if (cladatum->comdatum) {
++		rc = hashtab_map(cladatum->comdatum->permissions.table, validate_perm,
++		                 cladatum2->comdatum->permissions.table);
++		if (rc) {
++			printk(" in the access vector definition for class "
++			       "%s\n", (char *)key);
++			goto out;
++		}
++	}
++	rc = hashtab_map(cladatum->permissions.table, validate_perm,
++	                 cladatum2->permissions.table);
++	if (rc)
++		printk(" in access vector definition for class %s\n",
++		       (char *)key);
++out:
++	return rc;
++}
++
++/* Clone the SID into the new SID table. */
++static int clone_sid(u32 sid,
++		     struct context *context,
++		     void *arg)
++{
++	struct sidtab *s = arg;
++
++	return sidtab_insert(s, sid, context);
++}
++
++static inline int convert_context_handle_invalid_context(struct context *context)
++{
++	int rc = 0;
++
++	if (selinux_enforcing) {
++		rc = -EINVAL;
++	} else {
++		char *s;
++		u32 len;
++
++		context_struct_to_string(context, &s, &len);
++		printk(KERN_ERR "security:  context %s is invalid\n", s);
++		kfree(s);
++	}
++	return rc;
++}
++
++struct convert_context_args {
++	struct policydb *oldp;
++	struct policydb *newp;
++};
++
++/*
++ * Convert the values in the security context
++ * structure `c' from the values specified
++ * in the policy `p->oldp' to the values specified
++ * in the policy `p->newp'.  Verify that the
++ * context is valid under the new policy.
++ */
++static int convert_context(u32 key,
++			   struct context *c,
++			   void *p)
++{
++	struct convert_context_args *args;
++	struct context oldc;
++	struct role_datum *role;
++	struct type_datum *typdatum;
++	struct user_datum *usrdatum;
++	char *s;
++	u32 len;
++	int rc = -EINVAL;
++
++	args = p;
++
++	rc = context_cpy(&oldc, c);
++	if (rc)
++		goto out;
++
++	/* Convert the user. */
++	usrdatum = hashtab_search(args->newp->p_users.table,
++	                          args->oldp->p_user_val_to_name[c->user - 1]);
++	if (!usrdatum) {
++		goto bad;
++	}
++	c->user = usrdatum->value;
++
++	/* Convert the role. */
++	role = hashtab_search(args->newp->p_roles.table,
++	                      args->oldp->p_role_val_to_name[c->role - 1]);
++	if (!role) {
++		goto bad;
++	}
++	c->role = role->value;
++
++	/* Convert the type. */
++	typdatum = hashtab_search(args->newp->p_types.table,
++	                          args->oldp->p_type_val_to_name[c->type - 1]);
++	if (!typdatum) {
++		goto bad;
++	}
++	c->type = typdatum->value;
++
++	rc = mls_convert_context(args->oldp, args->newp, c);
++	if (rc)
++		goto bad;
++
++	/* Check the validity of the new context. */
++	if (!policydb_context_isvalid(args->newp, c)) {
++		rc = convert_context_handle_invalid_context(&oldc);
++		if (rc)
++			goto bad;
++	}
++
++	context_destroy(&oldc);
++out:
++	return rc;
++bad:
++	context_struct_to_string(&oldc, &s, &len);
++	context_destroy(&oldc);
++	printk(KERN_ERR "security:  invalidating context %s\n", s);
++	kfree(s);
++	goto out;
++}
++
++extern void selinux_complete_init(void);
++
++/**
++ * security_load_policy - Load a security policy configuration.
++ * @data: binary policy data
++ * @len: length of data in bytes
++ *
++ * Load a new set of security policy configuration data,
++ * validate it and convert the SID table as necessary.
++ * This function will flush the access vector cache after
++ * loading the new policy.
++ */
++int security_load_policy(void *data, size_t len)
++{
++	struct policydb oldpolicydb, newpolicydb;
++	struct sidtab oldsidtab, newsidtab;
++	struct convert_context_args args;
++	u32 seqno;
++	int rc = 0;
++	struct policy_file file = { data, len }, *fp = &file;
++
++	LOAD_LOCK;
++
++	if (!ss_initialized) {
++		if (policydb_read(&policydb, fp)) {
++			LOAD_UNLOCK;
++			return -EINVAL;
++		}
++		if (policydb_load_isids(&policydb, &sidtab)) {
++			LOAD_UNLOCK;
++			policydb_destroy(&policydb);
++			return -EINVAL;
++		}
++		ss_initialized = 1;
++		LOAD_UNLOCK;
++		selinux_complete_init();
++		return 0;
++	}
++
++#if 0
++	sidtab_hash_eval(&sidtab, "sids");
++#endif
++
++	if (policydb_read(&newpolicydb, fp)) {
++		LOAD_UNLOCK;
++		return -EINVAL;
++	}
++
++	sidtab_init(&newsidtab);
++
++	/* Verify that the existing classes did not change. */
++	if (hashtab_map(policydb.p_classes.table, validate_class, &newpolicydb)) {
++		printk(KERN_ERR "security:  the definition of an existing "
++		       "class changed\n");
++		rc = -EINVAL;
++		goto err;
++	}
++
++	/* Clone the SID table. */
++	sidtab_shutdown(&sidtab);
++	if (sidtab_map(&sidtab, clone_sid, &newsidtab)) {
++		rc = -ENOMEM;
++		goto err;
++	}
++
++	/* Convert the internal representations of contexts
++	   in the new SID table and remove invalid SIDs. */
++	args.oldp = &policydb;
++	args.newp = &newpolicydb;
++	sidtab_map_remove_on_error(&newsidtab, convert_context, &args);
++
++	/* Save the old policydb and SID table to free later. */
++	memcpy(&oldpolicydb, &policydb, sizeof policydb);
++	sidtab_set(&oldsidtab, &sidtab);
++
++	/* Install the new policydb and SID table. */
++	POLICY_WRLOCK;
++	memcpy(&policydb, &newpolicydb, sizeof policydb);
++	sidtab_set(&sidtab, &newsidtab);
++	seqno = ++latest_granting;
++	POLICY_WRUNLOCK;
++	LOAD_UNLOCK;
++
++	/* Free the old policydb and SID table. */
++	policydb_destroy(&oldpolicydb);
++	sidtab_destroy(&oldsidtab);
++
++	avc_ss_reset(seqno);
++
++	return 0;
++
++err:
++	LOAD_UNLOCK;
++	sidtab_destroy(&newsidtab);
++	policydb_destroy(&newpolicydb);
++	return rc;
++
++}
++
++/**
++ * security_port_sid - Obtain the SID for a port.
++ * @domain: communication domain aka address family
++ * @type: socket type
++ * @protocol: protocol number
++ * @port: port number
++ * @out_sid: security identifier
++ */
++int security_port_sid(u16 domain,
++		      u16 type,
++		      u8 protocol,
++		      u16 port,
++		      u32 *out_sid)
++{
++	struct ocontext *c;
++	int rc = 0;
++
++	POLICY_RDLOCK;
++
++	c = policydb.ocontexts[OCON_PORT];
++	while (c) {
++		if (c->u.port.protocol == protocol &&
++		    c->u.port.low_port <= port &&
++		    c->u.port.high_port >= port)
++			break;
++		c = c->next;
++	}
++
++	if (c) {
++		if (!c->sid[0]) {
++			rc = sidtab_context_to_sid(&sidtab,
++						   &c->context[0],
++						   &c->sid[0]);
++			if (rc)
++				goto out;
++		}
++		*out_sid = c->sid[0];
++	} else {
++		*out_sid = SECINITSID_PORT;
++	}
++
++out:
++	POLICY_RDUNLOCK;
++	return rc;
++}
++
++/**
++ * security_netif_sid - Obtain the SID for a network interface.
++ * @name: interface name
++ * @if_sid: interface SID
++ * @msg_sid: default SID for received packets
++ */
++int security_netif_sid(char *name,
++		       u32 *if_sid,
++		       u32 *msg_sid)
++{
++	int rc = 0;
++	struct ocontext *c;
++
++	POLICY_RDLOCK;
++
++	c = policydb.ocontexts[OCON_NETIF];
++	while (c) {
++		if (strcmp(name, c->u.name) == 0)
++			break;
++		c = c->next;
++	}
++
++	if (c) {
++		if (!c->sid[0] || !c->sid[1]) {
++			rc = sidtab_context_to_sid(&sidtab,
++						  &c->context[0],
++						  &c->sid[0]);
++			if (rc)
++				goto out;
++			rc = sidtab_context_to_sid(&sidtab,
++						   &c->context[1],
++						   &c->sid[1]);
++			if (rc)
++				goto out;
++		}
++		*if_sid = c->sid[0];
++		*msg_sid = c->sid[1];
++	} else {
++		*if_sid = SECINITSID_NETIF;
++		*msg_sid = SECINITSID_NETMSG;
++	}
++
++out:
++	POLICY_RDUNLOCK;
++	return rc;
++}
++
++
++/**
++ * security_node_sid - Obtain the SID for a node (host).
++ * @domain: communication domain aka address family
++ * @addrp: address
++ * @addrlen: address length in bytes
++ * @out_sid: security identifier
++ */
++int security_node_sid(u16 domain,
++		      void *addrp,
++		      u32 addrlen,
++		      u32 *out_sid)
++{
++	int rc = 0;
++	u32 addr;
++	struct ocontext *c;
++
++	POLICY_RDLOCK;
++
++	if (domain != AF_INET || addrlen != sizeof(u32)) {
++		*out_sid = SECINITSID_NODE;
++		goto out;
++	}
++	addr = *((u32 *)addrp);
++
++	c = policydb.ocontexts[OCON_NODE];
++	while (c) {
++		if (c->u.node.addr == (addr & c->u.node.mask))
++			break;
++		c = c->next;
++	}
++
++	if (c) {
++		if (!c->sid[0]) {
++			rc = sidtab_context_to_sid(&sidtab,
++						   &c->context[0],
++						   &c->sid[0]);
++			if (rc)
++				goto out;
++		}
++		*out_sid = c->sid[0];
++	} else {
++		*out_sid = SECINITSID_NODE;
++	}
++
++out:
++	POLICY_RDUNLOCK;
++	return rc;
++}
++
++#define SIDS_NEL 25
++
++/**
++ * security_get_user_sids - Obtain reachable SIDs for a user.
++ * @fromsid: starting SID
++ * @username: username
++ * @sids: array of reachable SIDs for user
++ * @nel: number of elements in @sids
++ *
++ * Generate the set of SIDs for legal security contexts
++ * for a given user that can be reached by @fromsid.
++ * Set *@sids to point to a dynamically allocated
++ * array containing the set of SIDs.  Set *@nel to the
++ * number of elements in the array.
++ */
++
++int security_get_user_sids(u32 fromsid,
++	                   char *username,
++			   u32 **sids,
++			   u32 *nel)
++{
++	struct context *fromcon, usercon;
++	u32 *mysids, *mysids2, sid;
++	u32 mynel = 0, maxnel = SIDS_NEL;
++	struct user_datum *user;
++	struct role_datum *role;
++	struct av_decision avd;
++	int rc = 0, i, j;
++
++	if (!ss_initialized) {
++		*sids = NULL;
++		*nel = 0;
++		goto out;
++	}
++
++	POLICY_RDLOCK;
++
++	fromcon = sidtab_search(&sidtab, fromsid);
++	if (!fromcon) {
++		rc = -EINVAL;
++		goto out_unlock;
++	}
++
++	user = hashtab_search(policydb.p_users.table, username);
++	if (!user) {
++		rc = -EINVAL;
++		goto out_unlock;
++	}
++	usercon.user = user->value;
++
++	mysids = kmalloc(maxnel*sizeof(*mysids), GFP_ATOMIC);
++	if (!mysids) {
++		rc = -ENOMEM;
++		goto out_unlock;
++	}
++	memset(mysids, 0, maxnel*sizeof(*mysids));
++
++	for (i = ebitmap_startbit(&user->roles); i < ebitmap_length(&user->roles); i++) {
++		if (!ebitmap_get_bit(&user->roles, i))
++			continue;
++		role = policydb.role_val_to_struct[i];
++		usercon.role = i+1;
++		for (j = ebitmap_startbit(&role->types); j < ebitmap_length(&role->types); j++) {
++			if (!ebitmap_get_bit(&role->types, j))
++				continue;
++			usercon.type = j+1;
++			if (usercon.type == fromcon->type)
++				continue;
++			mls_for_user_ranges(user,usercon) {
++				rc = context_struct_compute_av(fromcon, &usercon,
++							       SECCLASS_PROCESS,
++							       PROCESS__TRANSITION,
++							       &avd);
++				if (rc ||  !(avd.allowed & PROCESS__TRANSITION))
++					continue;
++				rc = sidtab_context_to_sid(&sidtab, &usercon, &sid);
++				if (rc) {
++					kfree(mysids);
++					goto out_unlock;
++				}
++				if (mynel < maxnel) {
++					mysids[mynel++] = sid;
++				} else {
++					maxnel += SIDS_NEL;
++					mysids2 = kmalloc(maxnel*sizeof(*mysids2), GFP_ATOMIC);
++					if (!mysids2) {
++						rc = -ENOMEM;
++						kfree(mysids);
++						goto out_unlock;
++					}
++					memset(mysids2, 0, maxnel*sizeof(*mysids2));
++					memcpy(mysids2, mysids, mynel * sizeof(*mysids2));
++					kfree(mysids);
++					mysids = mysids2;
++					mysids[mynel++] = sid;
++				}
++			}
++			mls_end_user_ranges;
++		}
++	}
++
++	*sids = mysids;
++	*nel = mynel;
++
++out_unlock:
++	POLICY_RDUNLOCK;
++out:
++	return rc;
++}
++
++/**
++ * security_genfs_sid - Obtain a SID for a file in a filesystem
++ * @fstype: filesystem type
++ * @path: path from root of mount
++ * @sclass: file security class
++ * @sid: SID for path
++ *
++ * Obtain a SID to use for a file in a filesystem that
++ * cannot support xattr or use a fixed labeling behavior like
++ * transition SIDs or task SIDs.
++ */
++int security_genfs_sid(const char *fstype,
++	               char *path,
++		       u16 sclass,
++		       u32 *sid)
++{
++	int len;
++	struct genfs *genfs;
++	struct ocontext *c;
++	int rc = 0, cmp = 0;
++
++	POLICY_RDLOCK;
++
++	for (genfs = policydb.genfs; genfs; genfs = genfs->next) {
++		cmp = strcmp(fstype, genfs->fstype);
++		if (cmp <= 0)
++			break;
++	}
++
++	if (!genfs || cmp) {
++		*sid = SECINITSID_UNLABELED;
++		rc = -ENOENT;
++		goto out;
++	}
++
++	for (c = genfs->head; c; c = c->next) {
++		len = strlen(c->u.name);
++		if ((!c->v.sclass || sclass == c->v.sclass) &&
++		    (strncmp(c->u.name, path, len) == 0))
++			break;
++	}
++
++	if (!c) {
++		*sid = SECINITSID_UNLABELED;
++		rc = -ENOENT;
++		goto out;
++	}
++
++	if (!c->sid[0]) {
++		rc = sidtab_context_to_sid(&sidtab,
++					   &c->context[0],
++					   &c->sid[0]);
++		if (rc)
++			goto out;
++	}
++
++	*sid = c->sid[0];
++out:
++	POLICY_RDUNLOCK;
++	return rc;
++}
++
++/**
++ * security_fs_use - Determine how to handle labeling for a filesystem.
++ * @fstype: filesystem type
++ * @behavior: labeling behavior
++ * @sid: SID for filesystem (superblock)
++ */
++int security_fs_use(
++	const char *fstype,
++	unsigned int *behavior,
++	u32 *sid)
++{
++	int rc = 0;
++	struct ocontext *c;
++
++	POLICY_RDLOCK;
++
++	c = policydb.ocontexts[OCON_FSUSE];
++	while (c) {
++		if (strcmp(fstype, c->u.name) == 0)
++			break;
++		c = c->next;
++	}
++
++	if (c) {
++		*behavior = c->v.behavior;
++		if (!c->sid[0]) {
++			rc = sidtab_context_to_sid(&sidtab,
++						   &c->context[0],
++						   &c->sid[0]);
++			if (rc)
++				goto out;
++		}
++		*sid = c->sid[0];
++	} else {
++		rc = security_genfs_sid(fstype, "/", SECCLASS_DIR, sid);
++		if (rc) {
++			*behavior = SECURITY_FS_USE_NONE;
++			rc = 0;
++		} else {
++			*behavior = SECURITY_FS_USE_GENFS;
++		}
++	}
++
++out:
++	POLICY_RDUNLOCK;
++	return rc;
++}
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/services.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,21 @@
++/*
++ * Implementation of the security services.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_SERVICES_H_
++#define _SS_SERVICES_H_
++
++#include "policydb.h"
++#include "sidtab.h"
++
++/*
++ * The security server uses two global data structures
++ * when providing its services:  the SID table (sidtab)
++ * and the policy database (policydb).
++ */
++extern struct sidtab sidtab;
++extern struct policydb policydb;
++
++#endif	/* _SS_SERVICES_H_ */
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/sidtab.c	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,329 @@
++/*
++ * Implementation of the SID table type.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#include "sidtab.h"
++
++#define SIDTAB_HASH(sid) \
++(sid & SIDTAB_HASH_MASK)
++
++#define INIT_SIDTAB_LOCK(s) spin_lock_init(&s->lock)
++#define SIDTAB_LOCK(s) spin_lock_irq(&s->lock)
++#define SIDTAB_UNLOCK(s) spin_unlock_irq(&s->lock)
++
++int sidtab_init(struct sidtab *s)
++{
++	int i;
++
++	s->htable = kmalloc(sizeof(*(s->htable)) * SIDTAB_SIZE, GFP_ATOMIC);
++	if (!s->htable)
++		return -ENOMEM;
++	for (i = 0; i < SIDTAB_SIZE; i++)
++		s->htable[i] = NULL;
++	s->nel = 0;
++	s->next_sid = 1;
++	s->shutdown = 0;
++	INIT_SIDTAB_LOCK(s);
++	return 0;
++}
++
++int sidtab_insert(struct sidtab *s, u32 sid, struct context *context)
++{
++	int hvalue, rc = 0;
++	struct sidtab_node *prev, *cur, *newnode;
++
++	if (!s) {
++		rc = -ENOMEM;
++		goto out;
++	}
++
++	hvalue = SIDTAB_HASH(sid);
++	prev = NULL;
++	cur = s->htable[hvalue];
++	while (cur != NULL && sid > cur->sid) {
++		prev = cur;
++		cur = cur->next;
++	}
++
++	if (cur && sid == cur->sid) {
++		rc = -EEXIST;
++		goto out;
++	}
++
++	newnode = kmalloc(sizeof(*newnode), GFP_ATOMIC);
++	if (newnode == NULL) {
++		rc = -ENOMEM;
++		goto out;
++	}
++	newnode->sid = sid;
++	if (context_cpy(&newnode->context, context)) {
++		kfree(newnode);
++		rc = -ENOMEM;
++		goto out;
++	}
++
++	if (prev) {
++		newnode->next = prev->next;
++		wmb();
++		prev->next = newnode;
++	} else {
++		newnode->next = s->htable[hvalue];
++		wmb();
++		s->htable[hvalue] = newnode;
++	}
++
++	s->nel++;
++	if (sid >= s->next_sid)
++		s->next_sid = sid + 1;
++out:
++	return rc;
++}
++
++int sidtab_remove(struct sidtab *s, u32 sid)
++{
++	int hvalue, rc = 0;
++	struct sidtab_node *cur, *last;
++
++	if (!s) {
++		rc = -ENOENT;
++		goto out;
++	}
++
++	hvalue = SIDTAB_HASH(sid);
++	last = NULL;
++	cur = s->htable[hvalue];
++	while (cur != NULL && sid > cur->sid) {
++		last = cur;
++		cur = cur->next;
++	}
++
++	if (cur == NULL || sid != cur->sid) {
++		rc = -ENOENT;
++		goto out;
++	}
++
++	if (last == NULL)
++		s->htable[hvalue] = cur->next;
++	else
++		last->next = cur->next;
++
++	context_destroy(&cur->context);
++
++	kfree(cur);
++	s->nel--;
++out:
++	return rc;
++}
++
++struct context *sidtab_search(struct sidtab *s, u32 sid)
++{
++	int hvalue;
++	struct sidtab_node *cur;
++
++	if (!s)
++		return NULL;
++
++	hvalue = SIDTAB_HASH(sid);
++	cur = s->htable[hvalue];
++	while (cur != NULL && sid > cur->sid)
++		cur = cur->next;
++
++	if (cur == NULL || sid != cur->sid) {
++		/* Remap invalid SIDs to the unlabeled SID. */
++		sid = SECINITSID_UNLABELED;
++		hvalue = SIDTAB_HASH(sid);
++		cur = s->htable[hvalue];
++		while (cur != NULL && sid > cur->sid)
++			cur = cur->next;
++		if (!cur || sid != cur->sid)
++			return NULL;
++	}
++
++	return &cur->context;
++}
++
++int sidtab_map(struct sidtab *s,
++	       int (*apply) (u32 sid,
++			     struct context *context,
++			     void *args),
++	       void *args)
++{
++	int i, rc = 0;
++	struct sidtab_node *cur;
++
++	if (!s)
++		goto out;
++
++	for (i = 0; i < SIDTAB_SIZE; i++) {
++		cur = s->htable[i];
++		while (cur != NULL) {
++			rc = apply(cur->sid, &cur->context, args);
++			if (rc)
++				goto out;
++			cur = cur->next;
++		}
++	}
++out:
++	return rc;
++}
++
++void sidtab_map_remove_on_error(struct sidtab *s,
++				int (*apply) (u32 sid,
++					      struct context *context,
++					      void *args),
++				void *args)
++{
++	int i, ret;
++	struct sidtab_node *last, *cur, *temp;
++
++	if (!s)
++		return;
++
++	for (i = 0; i < SIDTAB_SIZE; i++) {
++		last = NULL;
++		cur = s->htable[i];
++		while (cur != NULL) {
++			ret = apply(cur->sid, &cur->context, args);
++			if (ret) {
++				if (last) {
++					last->next = cur->next;
++				} else {
++					s->htable[i] = cur->next;
++				}
++
++				temp = cur;
++				cur = cur->next;
++				context_destroy(&temp->context);
++				kfree(temp);
++				s->nel--;
++			} else {
++				last = cur;
++				cur = cur->next;
++			}
++		}
++	}
++
++	return;
++}
++
++static inline u32 sidtab_search_context(struct sidtab *s,
++						  struct context *context)
++{
++	int i;
++	struct sidtab_node *cur;
++
++	for (i = 0; i < SIDTAB_SIZE; i++) {
++		cur = s->htable[i];
++		while (cur != NULL) {
++			if (context_cmp(&cur->context, context))
++				return cur->sid;
++			cur = cur->next;
++		}
++	}
++	return 0;
++}
++
++int sidtab_context_to_sid(struct sidtab *s,
++			  struct context *context,
++			  u32 *out_sid)
++{
++	u32 sid;
++	int ret = 0;
++
++	*out_sid = SECSID_NULL;
++
++	sid = sidtab_search_context(s, context);
++	if (!sid) {
++		SIDTAB_LOCK(s);
++		/* Rescan now that we hold the lock. */
++		sid = sidtab_search_context(s, context);
++		if (sid)
++			goto unlock_out;
++		/* No SID exists for the context.  Allocate a new one. */
++		if (s->next_sid == UINT_MAX || s->shutdown) {
++			ret = -ENOMEM;
++			goto unlock_out;
++		}
++		sid = s->next_sid++;
++		ret = sidtab_insert(s, sid, context);
++		if (ret)
++			s->next_sid--;
++unlock_out:
++		SIDTAB_UNLOCK(s);
++	}
++
++	if (ret)
++		return ret;
++
++	*out_sid = sid;
++	return 0;
++}
++
++void sidtab_hash_eval(struct sidtab *h, char *tag)
++{
++	int i, chain_len, slots_used, max_chain_len;
++	struct sidtab_node *cur;
++
++	slots_used = 0;
++	max_chain_len = 0;
++	for (i = 0; i < SIDTAB_SIZE; i++) {
++		cur = h->htable[i];
++		if (cur) {
++			slots_used++;
++			chain_len = 0;
++			while (cur) {
++				chain_len++;
++				cur = cur->next;
++			}
++
++			if (chain_len > max_chain_len)
++				max_chain_len = chain_len;
++		}
++	}
++
++	printk(KERN_INFO "%s:  %d entries and %d/%d buckets used, longest "
++	       "chain length %d\n", tag, h->nel, slots_used, SIDTAB_SIZE,
++	       max_chain_len);
++}
++
++void sidtab_destroy(struct sidtab *s)
++{
++	int i;
++	struct sidtab_node *cur, *temp;
++
++	if (!s)
++		return;
++
++	for (i = 0; i < SIDTAB_SIZE; i++) {
++		cur = s->htable[i];
++		while (cur != NULL) {
++			temp = cur;
++			cur = cur->next;
++			context_destroy(&temp->context);
++			kfree(temp);
++		}
++		s->htable[i] = NULL;
++	}
++	kfree(s->htable);
++	s->htable = NULL;
++	s->nel = 0;
++	s->next_sid = 1;
++}
++
++void sidtab_set(struct sidtab *dst, struct sidtab *src)
++{
++	SIDTAB_LOCK(src);
++	dst->htable = src->htable;
++	dst->nel = src->nel;
++	dst->next_sid = src->next_sid;
++	dst->shutdown = 0;
++	SIDTAB_UNLOCK(src);
++}
++
++void sidtab_shutdown(struct sidtab *s)
++{
++	SIDTAB_LOCK(s);
++	s->shutdown = 1;
++	SIDTAB_UNLOCK(s);
++}
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/sidtab.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,59 @@
++/*
++ * A security identifier table (sidtab) is a hash table
++ * of security context structures indexed by SID value.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_SIDTAB_H_
++#define _SS_SIDTAB_H_
++
++#include "context.h"
++
++struct sidtab_node {
++	u32 sid;		/* security identifier */
++	struct context context;	/* security context structure */
++	struct sidtab_node *next;
++};
++
++#define SIDTAB_HASH_BITS 7
++#define SIDTAB_HASH_BUCKETS (1 << SIDTAB_HASH_BITS)
++#define SIDTAB_HASH_MASK (SIDTAB_HASH_BUCKETS-1)
++
++#define SIDTAB_SIZE SIDTAB_HASH_BUCKETS
++
++struct sidtab {
++	struct sidtab_node **htable;
++	unsigned int nel;	/* number of elements */
++	unsigned int next_sid;	/* next SID to allocate */
++	unsigned char shutdown;
++	spinlock_t lock;
++};
++
++int sidtab_init(struct sidtab *s);
++int sidtab_insert(struct sidtab *s, u32 sid, struct context *context);
++struct context *sidtab_search(struct sidtab *s, u32 sid);
++
++int sidtab_map(struct sidtab *s,
++	       int (*apply) (u32 sid,
++			     struct context *context,
++			     void *args),
++	       void *args);
++
++void sidtab_map_remove_on_error(struct sidtab *s,
++				int (*apply) (u32 sid,
++					      struct context *context,
++					      void *args),
++				void *args);
++
++int sidtab_context_to_sid(struct sidtab *s,
++			  struct context *context,
++			  u32 *sid);
++
++void sidtab_hash_eval(struct sidtab *h, char *tag);
++void sidtab_destroy(struct sidtab *s);
++void sidtab_set(struct sidtab *dst, struct sidtab *src);
++void sidtab_shutdown(struct sidtab *s);
++
++#endif	/* _SS_SIDTAB_H_ */
++
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/symtab.c	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,40 @@
++/*
++ * Implementation of the symbol table type.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#include "symtab.h"
++
++static unsigned int symhash(struct hashtab *h, void *key)
++{
++	char *p, *keyp;
++	unsigned int size;
++	unsigned int val;
++
++	val = 0;
++	keyp = key;
++	size = strlen(keyp);
++	for (p = keyp; (p - keyp) < size; p++)
++		val = (val << 4 | (val >> (8*sizeof(unsigned int)-4))) ^ (*p);
++	return val & (h->size - 1);
++}
++
++static int symcmp(struct hashtab *h, void *key1, void *key2)
++{
++	char *keyp1, *keyp2;
++
++	keyp1 = key1;
++	keyp2 = key2;
++	return strcmp(keyp1, keyp2);
++}
++
++
++int symtab_init(struct symtab *s, unsigned int size)
++{
++	s->table = hashtab_create(symhash, symcmp, size);
++	if (!s->table)
++		return -1;
++	s->nprim = 0;
++	return 0;
++}
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/symtab.h	2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,23 @@
++/*
++ * A symbol table (symtab) maintains associations between symbol
++ * strings and datum values.  The type of the datum values
++ * is arbitrary.  The symbol table type is implemented
++ * using the hash table type (hashtab).
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_SYMTAB_H_
++#define _SS_SYMTAB_H_
++
++#include "hashtab.h"
++
++struct symtab {
++	struct hashtab *table;	/* hash table (keyed on a string) */
++	u32 nprim;		/* number of primary names in table */
++};
++
++int symtab_init(struct symtab *s, unsigned int size);
++
++#endif	/* _SS_SYMTAB_H_ */
++
++
+--- linux-2.6.0-test1/sound/core/timer.c	2003-06-14 12:18:24.000000000 -0700
++++ 25/sound/core/timer.c	2003-07-19 17:06:14.000000000 -0700
+@@ -1688,10 +1688,11 @@ static ssize_t snd_timer_user_read(struc
+ 				break;
+ 			}
+ 		}
+-		spin_unlock_irq(&tu->qlock);
+ 		if (err < 0)
+ 			break;
+ 
++		spin_unlock_irq(&tu->qlock);
++
+ 		if (tu->tread) {
+ 			if (copy_to_user(buffer, &tu->tqueue[tu->qhead++], sizeof(snd_timer_tread_t))) {
+ 				err = -EFAULT;
+@@ -1712,6 +1713,7 @@ static ssize_t snd_timer_user_read(struc
+ 		spin_lock_irq(&tu->qlock);
+ 		tu->qused--;
+ 	}
++	spin_unlock_irq(&tu->qlock);
+ 	return result > 0 ? result : err;
+ }
+ 
+--- linux-2.6.0-test1/sound/isa/cmi8330.c	2003-06-14 12:17:58.000000000 -0700
++++ 25/sound/isa/cmi8330.c	2003-07-19 17:03:51.000000000 -0700
+@@ -293,7 +293,7 @@ static int __devinit snd_cmi8330_pnp(int
+ 				     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(*cfg), GFP_ATOMIC);
+ 	int err;
+ 
+ 	acard->cap = pnp_request_card_device(card, id->devs[0].id, NULL);
+--- linux-2.6.0-test1/sound/isa/es18xx.c	2003-06-14 12:18:08.000000000 -0700
++++ 25/sound/isa/es18xx.c	2003-07-19 17:03:51.000000000 -0700
+@@ -1966,7 +1966,7 @@ static int __devinit snd_audiodrive_pnp(
+ 					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(*cfg), GFP_ATOMIC);
+ 	int err;
+ 
+ 	if (!cfg)
+--- linux-2.6.0-test1/sound/oss/ac97_plugin_ad1980.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/ac97_plugin_ad1980.c	2003-07-19 17:03:51.000000000 -0700
+@@ -17,7 +17,7 @@
+    the provisions above, a recipient may use your version of this
+    file under either the OSL or the GPL.
+    
+-   Authors: 	Arjan van de Ven <arjanv@redhat.com>
++   Authors: 	Alan Cox <alan@redhat.com>
+ 
+    This is an example codec plugin. This one switches the connections
+    around to match the setups some vendors use with audio switched to
+--- linux-2.6.0-test1/sound/oss/ad1816.c	2003-06-14 12:18:33.000000000 -0700
++++ 25/sound/oss/ad1816.c	2003-07-19 17:03:51.000000000 -0700
+@@ -1,15 +1,15 @@
+ /*
+  *
+- * AD1816 lowlevel sound driver for Linux 2.2.0 and above
++ * AD1816 lowlevel sound driver for Linux 2.6.0 and above
+  *
+- * Copyright (C) 1998 by Thorsten Knabe <tek@rbg.informatik.tu-darmstadt.de>
++ * Copyright (C) 1998-2003 by Thorsten Knabe <linux@thorsten-knabe.de>
+  *
+  * Based on the CS4232/AD1848 driver Copyright (C) by Hannu Savolainen 1993-1996
+  *
+  *
+- * version: 1.3.1
+- * status: experimental
+- * date: 1999/4/18
++ * version: 1.5
++ * status: beta
++ * date: 2003/07/15
+  *
+  * Changes:
+  *	Oleg Drokin: Some cleanup of load/unload functions.	1998/11/24
+@@ -30,8 +30,17 @@
+  *	Christoph Hellwig: Added isapnp support			2000/03/15
+  *
+  *	Arnaldo Carvalho de Melo: get rid of check_region	2001/10/07
++ *      
++ *      Thorsten Knabe: Compiling with CONFIG_PNP enabled
++ *	works again. It is now possible to use more than one 
++ *	AD1816 sound card. Sample rate now may be changed during
++ *	playback/capture. printk() uses log levels everywhere.
++ *	SMP fixes. DMA handling fixes.
++ *	Other minor code cleanup.				2003/07/15
++ *
+  */
+ 
++
+ #include <linux/config.h>
+ #include <linux/module.h>
+ #include <linux/init.h>
+@@ -42,9 +51,6 @@
+ #include "sound_config.h"
+ 
+ #define DEBUGNOISE(x)
+-#define DEBUGINFO(x)
+-#define DEBUGLOG(x)
+-#define DEBUGWARN(x)
+ 
+ #define CHECK_FOR_POWER { int timeout=100; \
+   while (timeout > 0 && (inb(devc->base)&0x80)!= 0x80) {\
+@@ -63,21 +69,21 @@ typedef struct
+ 	int            dma_playback;
+         int            dma_capture;
+   
+-        int            speed;         /* open */
++	int            opened;         /* open */
++        int            speed;	
+ 	int            channels;
+ 	int            audio_format;
+-	unsigned char  format_bits;
+         int            audio_mode; 
+-	int            opened;
+   
+         int            recmask;        /* setup */
++	unsigned char  format_bits;
+ 	int            supported_devices;
+ 	int            supported_rec_devices;
+ 	unsigned short levels[SOUND_MIXER_NRDEVICES];
++					/* misc */
++	struct pnp_dev *pnpdev;	 /* configured via pnp */
+         int            dev_no;   /* this is the # in audio_devs and NOT 
+ 				    in ad1816_info */
+-	int            irq_ok;
+-	int            *osp;
+ 	spinlock_t	lock;  
+ } ad1816_info;
+ 
+@@ -85,12 +91,6 @@ static int nr_ad1816_devs;
+ static int ad1816_clockfreq = 33000;
+ static int options;
+ 
+-/* for backward mapping of irq to sound device */
+-
+-static volatile char irq2dev[17] = {-1, -1, -1, -1, -1, -1, -1, -1,
+-				    -1, -1, -1, -1, -1, -1, -1, -1, -1};
+-
+-
+ /* supported audio formats */
+ static int  ad_format_mask =
+ AFMT_U8 | AFMT_S16_LE | AFMT_S16_BE | AFMT_MU_LAW | AFMT_A_LAW;
+@@ -105,33 +105,22 @@ static ad1816_info dev_info[MAX_AUDIO_DE
+ 
+ static int ad_read (ad1816_info * devc, int reg)
+ {
+-	unsigned long   flags;
+ 	int result;
+ 	
+ 	CHECK_FOR_POWER;
+-
+-	spin_lock_irqsave(&devc->lock,flags); /* make register access atomic */
+ 	outb ((unsigned char) (reg & 0x3f), devc->base+0);
+ 	result = inb(devc->base+2);
+ 	result+= inb(devc->base+3)<<8;
+-	spin_unlock_irqrestore(&devc->lock,flags);
+-	
+ 	return (result);
+ }
+ 
+ 
+ static void ad_write (ad1816_info * devc, int reg, int data)
+ {
+-	unsigned long flags;
+-	
+ 	CHECK_FOR_POWER;
+-	
+-	spin_lock_irqsave(&devc->lock,flags); /* make register access atomic */
+ 	outb ((unsigned char) (reg & 0xff), devc->base+0);
+ 	outb ((unsigned char) (data & 0xff),devc->base+2);
+ 	outb ((unsigned char) ((data>>8)&0xff),devc->base+3);
+-	spin_unlock_irqrestore(&devc->lock,flags);
+-
+ }
+ 
+ /* ------------------------------------------------------------------- */
+@@ -144,7 +133,7 @@ static void ad1816_halt_input (int dev)
+ 	ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
+ 	unsigned char buffer;
+ 	
+-	DEBUGINFO (printk("ad1816: halt_input called\n"));
++	DEBUGNOISE(printk(KERN_DEBUG "ad1816: halt_input called\n"));
+ 	
+ 	spin_lock_irqsave(&devc->lock,flags); 
+ 	
+@@ -176,7 +165,7 @@ static void ad1816_halt_output (int dev)
+ 	
+ 	unsigned char buffer;
+ 
+-	DEBUGINFO (printk("ad1816: halt_output called!\n"));
++	DEBUGNOISE(printk(KERN_DEBUG "ad1816: halt_output called!\n"));
+ 
+ 	spin_lock_irqsave(&devc->lock,flags); 
+ 	/* Mute pcm output */
+@@ -210,7 +199,7 @@ static void ad1816_output_block (int dev
+ 	unsigned long cnt;
+ 	ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
+ 	
+-	DEBUGINFO(printk("ad1816: output_block called buf=%ld count=%d flags=%d\n",buf,count,intrflag));
++	DEBUGNOISE(printk(KERN_DEBUG "ad1816: output_block called buf=%ld count=%d flags=%d\n",buf,count,intrflag));
+   
+ 	cnt = count/4 - 1;
+   
+@@ -231,7 +220,7 @@ static void ad1816_start_input (int dev,
+ 	unsigned long  cnt;
+ 	ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
+ 	
+-	DEBUGINFO(printk("ad1816: start_input called buf=%ld count=%d flags=%d\n",buf,count,intrflag));
++	DEBUGNOISE(printk(KERN_DEBUG "ad1816: start_input called buf=%ld count=%d flags=%d\n",buf,count,intrflag));
+ 
+ 	cnt = count/4 - 1;
+ 
+@@ -239,7 +228,6 @@ static void ad1816_start_input (int dev,
+ 
+ 	/* set transfer count */
+ 	ad_write (devc, 10, cnt & 0xffff); 
+-
+ 	devc->audio_mode |= PCM_ENABLE_INPUT;
+ 	spin_unlock_irqrestore(&devc->lock,flags);
+ }
+@@ -251,33 +239,19 @@ static int ad1816_prepare_for_input (int
+ 	ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
+ 	unsigned char fmt_bits;
+ 	
+-	DEBUGINFO (printk ("ad1816: prepare_for_input called: bsize=%d bcount=%d\n",bsize,bcount));
++	DEBUGNOISE(printk(KERN_DEBUG "ad1816: prepare_for_input called: bsize=%d bcount=%d\n",bsize,bcount));
+ 
+ 	spin_lock_irqsave(&devc->lock,flags);
+-	
+ 	fmt_bits= (devc->format_bits&0x7)<<3;
+ 	
+ 	/* set mono/stereo mode */
+ 	if (devc->channels > 1) {
+ 		fmt_bits |=0x4;
+ 	}
+-
+ 	/* set Mono/Stereo in playback/capture register */
+ 	outb( (inb(devc->base+8) & ~0x3C)|fmt_bits, devc->base+8); 
+ 	outb( (inb(devc->base+9) & ~0x3C)|fmt_bits, devc->base+9);
+-  
+-	/* If compiled into kernel, AD1816_CLOCK is defined, so use it */
+-#ifdef AD1816_CLOCK 
+-	ad1816_clockfreq=AD1816_CLOCK;
+-#endif
+-
+-	/* capture/playback frequency correction for soundcards 
+-	   with clock chips != 33MHz (allowed range 5 - 100 kHz) */
+ 
+-	if (ad1816_clockfreq<5000 || ad1816_clockfreq>100000) {
+-		ad1816_clockfreq=33000;
+-	}
+-	
+ 	freq=((unsigned int)devc->speed*33000)/ad1816_clockfreq; 
+ 
+ 	/* write playback/capture speeds */
+@@ -297,7 +271,7 @@ static int ad1816_prepare_for_output (in
+ 	ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
+ 	unsigned char fmt_bits;
+ 
+-	DEBUGINFO (printk ("ad1816: prepare_for_output called: bsize=%d bcount=%d\n",bsize,bcount));
++	DEBUGNOISE(printk(KERN_DEBUG "ad1816: prepare_for_output called: bsize=%d bcount=%d\n",bsize,bcount));
+ 
+ 	spin_lock_irqsave(&devc->lock,flags);
+ 
+@@ -311,17 +285,6 @@ static int ad1816_prepare_for_output (in
+ 	outb( (inb(devc->base+8) & ~0x3C)|fmt_bits, devc->base+8); 
+ 	outb( (inb(devc->base+9) & ~0x3C)|fmt_bits, devc->base+9);
+   
+-#ifdef AD1816_CLOCK 
+-	ad1816_clockfreq=AD1816_CLOCK;
+-#endif
+-
+-	/* capture/playback frequency correction for soundcards 
+-	   with clock chips != 33MHz (allowed range 5 - 100 kHz)*/
+-
+-	if (ad1816_clockfreq<5000 || ad1816_clockfreq>100000) {
+-		ad1816_clockfreq=33000;
+-	}
+-  
+ 	freq=((unsigned int)devc->speed*33000)/ad1816_clockfreq; 
+ 	
+ 	/* write playback/capture speeds */
+@@ -340,7 +303,7 @@ static void ad1816_trigger (int dev, int
+ 	unsigned long flags;
+ 	ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
+ 
+-	DEBUGINFO (printk("ad1816: trigger called! (devc=%d,devc->base=%d\n", devc, devc->base));
++	DEBUGNOISE(printk(KERN_DEBUG "ad1816: trigger called! (devc=%d,devc->base=%d\n", devc, devc->base));
+ 
+ 	/* mode may have changed */
+ 
+@@ -388,10 +351,17 @@ static void ad1816_reset (int dev)
+ /* set playback speed */
+ static int ad1816_set_speed (int dev, int arg)
+ {
++	unsigned long flags;
++	unsigned int freq;
++	int ret;
++
+ 	ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
+ 	
++	spin_lock_irqsave(&devc->lock, flags);
+ 	if (arg == 0) {
+-		return devc->speed;
++		ret = devc->speed;
++		spin_unlock_irqrestore(&devc->lock, flags);
++		return ret;
+ 	}
+ 	/* range checking */
+ 	if (arg < 4000) {
+@@ -400,14 +370,23 @@ static int ad1816_set_speed (int dev, in
+ 	if (arg > 55000) {
+ 		arg = 55000;
+ 	}
+-
+ 	devc->speed = arg;
+-	return devc->speed;
++
++	/* change speed during playback */
++	freq=((unsigned int)devc->speed*33000)/ad1816_clockfreq; 
++	/* write playback/capture speeds */
++	ad_write (devc, 2, freq & 0xffff);	
++	ad_write (devc, 3, freq & 0xffff);	
++
++	ret = devc->speed;
++	spin_unlock_irqrestore(&devc->lock, flags);
++	return ret;
+ 
+ }
+ 
+ static unsigned int ad1816_set_bits (int dev, unsigned int arg)
+ {
++	unsigned long flags;
+ 	ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
+ 	
+ 	static struct format_tbl {
+@@ -428,10 +407,13 @@ static unsigned int ad1816_set_bits (int
+ 
+ 	int  i, n = sizeof (format2bits) / sizeof (struct format_tbl);
+ 
++	spin_lock_irqsave(&devc->lock, flags);
+ 	/* return current format */
+-	if (arg == 0)
+-		return devc->audio_format;
+-	
++	if (arg == 0) {
++	  	arg = devc->audio_format;
++		spin_unlock_irqrestore(&devc->lock, flags);
++		return arg;
++	}
+ 	devc->audio_format = arg;
+ 
+ 	/* search matching format bits */
+@@ -439,12 +421,15 @@ static unsigned int ad1816_set_bits (int
+ 		if (format2bits[i].format == arg) {
+ 			devc->format_bits = format2bits[i].bits;
+ 			devc->audio_format = arg;
++			spin_unlock_irqrestore(&devc->lock, flags);
+ 			return arg;
+ 		}
+ 
+ 	/* Still hanging here. Something must be terribly wrong */
+ 	devc->format_bits = 0;
+-	return devc->audio_format = AFMT_U8;
++	devc->audio_format = AFMT_U8;
++	spin_unlock_irqrestore(&devc->lock, flags);
++	return(AFMT_U8); 
+ }
+ 
+ static short ad1816_set_channels (int dev, short arg)
+@@ -486,9 +471,8 @@ static int ad1816_open (int dev, int mod
+ 	devc->speed = 8000;
+ 	devc->audio_format=AFMT_U8;
+ 	devc->channels=1;
+-
+-	ad1816_reset(devc->dev_no); /* halt all pending output */
+ 	spin_unlock_irqrestore(&devc->lock,flags);
++	ad1816_reset(devc->dev_no); /* halt all pending output */
+ 	return 0;
+ }
+ 
+@@ -497,17 +481,15 @@ static void ad1816_close (int dev) /* cl
+ 	unsigned long flags;
+ 	ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
+ 
+-	spin_lock_irqsave(&devc->lock,flags);
+-
+ 	/* halt all pending output */
+ 	ad1816_reset(devc->dev_no); 
+-	
++
++	spin_lock_irqsave(&devc->lock,flags);
+ 	devc->opened = 0;
+ 	devc->audio_mode = 0;
+ 	devc->speed = 8000;
+ 	devc->audio_format=AFMT_U8;
+ 	devc->format_bits = 0;
+-
+ 	spin_unlock_irqrestore(&devc->lock,flags);
+ }
+ 
+@@ -543,25 +525,13 @@ static struct audio_driver ad1816_audio_
+ static irqreturn_t ad1816_interrupt (int irq, void *dev_id, struct pt_regs *dummy)
+ {
+ 	unsigned char	status;
+-	ad1816_info	*devc;
+-	int		dev;
+-
++	ad1816_info	*devc = (ad1816_info *)dev_id;
+ 	
+ 	if (irq < 0 || irq > 15) {
+ 	        printk(KERN_WARNING "ad1816: Got bogus interrupt %d\n", irq);
+ 		return IRQ_NONE;
+ 	}
+ 
+-	dev = irq2dev[irq];
+-	
+-	if (dev < 0 || dev >= num_audiodevs) {
+-	        printk(KERN_WARNING "ad1816: IRQ2AD1816-mapping failed for "
+-				    "irq %d device %d\n", irq,dev);
+-		return IRQ_NONE;
+-	}
+-
+-	devc = (ad1816_info *) audio_devs[dev]->devc;
+-	
+ 	spin_lock(&devc->lock);
+ 
+ 	/* read interrupt register */
+@@ -569,18 +539,19 @@ static irqreturn_t ad1816_interrupt (int
+ 	/* Clear all interrupt  */
+ 	outb (~status, devc->base+1);	
+ 
+-	DEBUGNOISE (printk("ad1816: Got interrupt subclass %d\n",status));
+-	
+-	devc->irq_ok=1;
++	DEBUGNOISE(printk(KERN_DEBUG "ad1816: Got interrupt subclass %d\n",status));
+ 
+-	if (status == 0)
+-		DEBUGWARN(printk ("ad1816: interrupt: Got interrupt, but no reason?\n"));
++	if (status == 0) {
++		DEBUGNOISE(printk(KERN_DEBUG "ad1816: interrupt: Got interrupt, but no source.\n"));
++		spin_unlock(&devc->lock);
++		return IRQ_NONE;
++	}
+ 
+ 	if (devc->opened && (devc->audio_mode & PCM_ENABLE_INPUT) && (status&64))
+-		DMAbuf_inputintr (dev);
++		DMAbuf_inputintr (devc->dev_no);
+ 
+ 	if (devc->opened && (devc->audio_mode & PCM_ENABLE_OUTPUT) && (status & 128))
+-		DMAbuf_outputintr (dev, 1);
++		DMAbuf_outputintr (devc->dev_no, 1);
+ 
+ 	spin_unlock(&devc->lock);
+ 	return IRQ_HANDLED;
+@@ -671,9 +642,11 @@ static unsigned short default_mixer_leve
+ static int
+ ad1816_set_recmask (ad1816_info * devc, int mask)
+ {
++  	unsigned long 	flags;
+ 	unsigned char   recdev;
+ 	int             i, n;
+ 	
++	spin_lock_irqsave(&devc->lock, flags);
+ 	mask &= devc->supported_rec_devices;
+ 	
+ 	n = 0;
+@@ -733,6 +706,7 @@ ad1816_set_recmask (ad1816_info * devc, 
+ 		  (ad_read (devc, 20) & 0x8f8f) | recdev | (recdev<<8));
+ 
+ 	devc->recmask = mask;
++	spin_unlock_irqrestore(&devc->lock, flags);
+ 	return mask;
+ }
+ 
+@@ -760,7 +734,7 @@ change_bits (int *regval, int dev, int c
+ static int
+ ad1816_mixer_get (ad1816_info * devc, int dev)
+ {
+-	DEBUGINFO(printk("ad1816: mixer_get called!\n"));
++	DEBUGNOISE(printk(KERN_DEBUG "ad1816: mixer_get called!\n"));
+ 	
+ 	/* range check + supported mixer check */
+ 	if (dev < 0 || dev >= SOUND_MIXER_NRDEVICES )
+@@ -781,8 +755,9 @@ ad1816_mixer_set (ad1816_info * devc, in
+ 	int   regoffs;
+ 	int   val;
+ 	int   valmute;
++	unsigned long flags;
+ 
+-	DEBUGINFO(printk("ad1816: mixer_set called!\n"));
++	DEBUGNOISE(printk(KERN_DEBUG "ad1816: mixer_set called!\n"));
+ 	
+ 	if (dev < 0 || dev >= SOUND_MIXER_NRDEVICES )
+ 		return -(EINVAL);
+@@ -813,6 +788,7 @@ ad1816_mixer_set (ad1816_info * devc, in
+ 	/* sanity check */
+ 	if (mix_devices[dev][LEFT_CHN].nbits == 0)
+ 		return -(EINVAL);
++	spin_lock_irqsave(&devc->lock, flags);
+ 
+ 	/* keep precise volume internal */
+ 	devc->levels[dev] = retvol;
+@@ -840,8 +816,10 @@ ad1816_mixer_set (ad1816_info * devc, in
+ 	 */
+  
+ 	/* Was just a mono channel */
+-	if (mix_devices[dev][RIGHT_CHN].nbits == 0)
++	if (mix_devices[dev][RIGHT_CHN].nbits == 0) {
++		spin_unlock_irqrestore(&devc->lock, flags);
+ 		return retvol;		
++	}
+ 
+ 	regoffs = mix_devices[dev][RIGHT_CHN].regno;
+ 	val = ad_read (devc, regoffs);
+@@ -857,7 +835,7 @@ ad1816_mixer_set (ad1816_info * devc, in
+ 			valmute &= ~0x80;
+ 	}
+ 	ad_write (devc, regoffs, valmute); /* mute */
+-	
++	spin_unlock_irqrestore(&devc->lock, flags);
+        	return retvol;
+ }
+ 
+@@ -901,7 +879,7 @@ ad1816_mixer_ioctl (int dev, unsigned in
+ 	ad1816_info    *devc = mixer_devs[dev]->devc;
+ 	int val;
+   
+-	DEBUGINFO(printk("ad1816: mixer_ioctl called!\n"));
++	DEBUGNOISE(printk(KERN_DEBUG "ad1816: mixer_ioctl called!\n"));
+   
+ 	/* Mixer ioctl */
+ 	if (((cmd >> 8) & 0xff) == 'M') { 
+@@ -980,83 +958,91 @@ static struct mixer_operations ad1816_mi
+ 
+ /* ------------------------------------------------------------------- */
+ 
+-/* stuff for card recognition, init and unloading */
++/* stuff for card recognition, init and unloading PNP ...*/
+ 
+ 
+-/* replace with probe routine */
+-static int __init probe_ad1816 ( struct address_info *hw_config )
++/* check if AD1816 present at specified hw_config and register device with OS 
++ * return 1 if initialization was successful, 0 otherwise
++ */
++static int __init ad1816_init_card (struct address_info *hw_config, 
++	struct pnp_dev *pnp)
+ {
+-	ad1816_info    *devc = &dev_info[nr_ad1816_devs];
+-	int io_base=hw_config->io_base;
+-	int *osp=hw_config->osp;
++	ad1816_info    *devc = NULL;
+ 	int tmp;
++	int oss_devno = -1;
+ 
+-	printk(KERN_INFO "ad1816: AD1816 sounddriver "
+-			 "Copyright (C) 1998 by Thorsten Knabe\n");
+-	printk(KERN_INFO "ad1816: io=0x%x, irq=%d, dma=%d, dma2=%d, "
+-			 "clockfreq=%d, options=%d isadmabug=%d\n",
++	printk(KERN_INFO "ad1816: initializing card: io=0x%x, irq=%d, dma=%d, "
++			 "dma2=%d, clockfreq=%d, options=%d isadmabug=%d "
++			 "%s\n",
+ 	       hw_config->io_base,
+ 	       hw_config->irq,
+ 	       hw_config->dma,
+ 	       hw_config->dma2,
+ 	       ad1816_clockfreq,
+ 	       options,
+-	       isa_dma_bridge_buggy);
++	       isa_dma_bridge_buggy,
++	       pnp?"(PNP)":"");
+ 
+-	if (!request_region(io_base, 16, "AD1816 Sound")) {
+-		printk(KERN_WARNING "ad1816: I/O port 0x%03x not free\n",
+-				    io_base);
+-		goto err;
+-	}
+-
+-	DEBUGLOG(printk ("ad1816: detect(%x)\n", io_base));
+-	
++	/* ad1816_info structure remaining ? */
+ 	if (nr_ad1816_devs >= MAX_AUDIO_DEV) {
+-		printk(KERN_WARNING "ad1816: detect error - step 0\n");
+-		goto out_release_region;
++		printk(KERN_WARNING "ad1816: no more ad1816_info structures "
++			"left\n");
++		goto out;
+ 	}
+ 
+-	devc->base = io_base;
+-	devc->irq_ok = 0;
+-	devc->irq = 0;
++	devc = &dev_info[nr_ad1816_devs];
++	devc->base = hw_config->io_base;
++	devc->irq = hw_config->irq;
++	devc->dma_playback=hw_config->dma;
++	devc->dma_capture=hw_config->dma2;
+ 	devc->opened = 0;
+-	devc->osp = osp;
++	devc->pnpdev = pnp;
+ 	spin_lock_init(&devc->lock);
+ 
++	if (!request_region(devc->base, 16, "AD1816 Sound")) {
++		printk(KERN_WARNING "ad1816: I/O port 0x%03x not free\n",
++				    devc->base);
++		goto out;
++	}
++
++	printk(KERN_INFO "ad1816: Examining AD1816 at address 0x%03x.\n", 
++		devc->base);
++	
++
++	/* tests for ad1816 */
+ 	/* base+0: bit 1 must be set but not 255 */
+ 	tmp=inb(devc->base);
+ 	if ( (tmp&0x80)==0 || tmp==255 ) {
+-		DEBUGLOG (printk ("ad1816: Chip is not an AD1816 or chip is not active (Test 0)\n"));
++		printk (KERN_INFO "ad1816: Chip is not an AD1816 or chip "
++			"is not active (Test 0)\n");
+ 		goto out_release_region;
+ 	}
+ 
+-
+ 	/* writes to ireg 8 are copied to ireg 9 */
+ 	ad_write(devc,8,12345); 
+ 	if (ad_read(devc,9)!=12345) {
+-		DEBUGLOG (printk ("ad1816: Chip is not an AD1816 (Test 1)\n"));
++		printk(KERN_INFO "ad1816: Chip is not an AD1816 (Test 1)\n");
+ 		goto out_release_region;
+ 	}
+   
+ 	/* writes to ireg 8 are copied to ireg 9 */
+ 	ad_write(devc,8,54321); 
+ 	if (ad_read(devc,9)!=54321) {
+-		DEBUGLOG (printk ("ad1816: Chip is not an AD1816 (Test 2)\n"));
++		printk(KERN_INFO "ad1816: Chip is not an AD1816 (Test 2)\n");
+ 		goto out_release_region;
+ 	}
+ 
+-
+ 	/* writes to ireg 10 are copied to ireg 11 */
+ 	ad_write(devc,10,54321); 
+ 	if (ad_read(devc,11)!=54321) {
+-		DEBUGLOG (printk ("ad1816: Chip is not an AD1816 (Test 3)\n"));
++		printk (KERN_INFO "ad1816: Chip is not an AD1816 (Test 3)\n");
+ 		goto out_release_region;
+ 	}
+ 
+ 	/* writes to ireg 10 are copied to ireg 11 */
+ 	ad_write(devc,10,12345); 
+ 	if (ad_read(devc,11)!=12345) {
+-		DEBUGLOG (printk ("ad1816: Chip is not an AD1816 (Test 4)\n"));
++		printk (KERN_INFO "ad1816: Chip is not an AD1816 (Test 4)\n");
+ 		goto out_release_region;
+ 	}
+ 
+@@ -1064,35 +1050,12 @@ static int __init probe_ad1816 ( struct 
+ 	tmp=inb(devc->base+1);
+ 	outb(0xff,devc->base+1); 
+ 	if (inb(devc->base+1)!=tmp) {
+-		DEBUGLOG (printk ("ad1816: Chip is not an AD1816 (Test 5)\n"));
++		printk(KERN_INFO "ad1816: Chip is not an AD1816 (Test 5)\n");
+ 		goto out_release_region;
+ 	}
+-
+   
+-	DEBUGLOG (printk ("ad1816: detect() - Detected OK\n"));
+-	DEBUGLOG (printk ("ad1816: AD1816 Version: %d\n",ad_read(devc,45)));
+-
+-	/* detection was successful */
+-	return 1; 
+-out_release_region:
+-	release_region(io_base, 16);
+-	/* detection was NOT successful */
+-err:	return 0;
+-}
+-
+-
+-/* allocate resources from the kernel. If any allocation fails, free
+-   all allocated resources and exit attach.
+-  
+- */
+-
+-static void __init attach_ad1816 (struct address_info *hw_config)
+-{
+-	int             my_dev;
+-	char            dev_name[100];
+-	ad1816_info    *devc = &dev_info[nr_ad1816_devs];
+-
+-	devc->base = hw_config->io_base;	
++	printk(KERN_INFO "ad1816: AD1816 (version %d) successfully detected!\n",
++		ad_read(devc,45));
+ 
+ 	/* disable all interrupts */
+ 	ad_write(devc,1,0);     
+@@ -1101,62 +1064,54 @@ static void __init attach_ad1816 (struct
+ 	outb (0, devc->base+1);	
+ 
+ 	/* allocate irq */
+-	if (hw_config->irq < 0 || hw_config->irq > 15)
++	if (devc->irq < 0 || devc->irq > 15)
+ 		goto out_release_region;
+-	if (request_irq(hw_config->irq, ad1816_interrupt,0,
+-			"SoundPort", hw_config->osp) < 0)	{
++	if (request_irq(devc->irq, ad1816_interrupt,0,
++			"SoundPort", devc) < 0)	{
+ 	        printk(KERN_WARNING "ad1816: IRQ in use\n");
+ 		goto out_release_region;
+ 	}
+-	devc->irq=hw_config->irq;
+ 
+ 	/* DMA stuff */
+-	if (sound_alloc_dma (hw_config->dma, "Sound System")) {
++	if (sound_alloc_dma (devc->dma_playback, "Sound System")) {
+ 		printk(KERN_WARNING "ad1816: Can't allocate DMA%d\n",
+-				    hw_config->dma);
++				    devc->dma_playback);
+ 		goto out_free_irq;
+ 	}
+-	devc->dma_playback=hw_config->dma;
+ 	
+-	if ( hw_config->dma2 != -1 && hw_config->dma2 != hw_config->dma) {
+-		if (sound_alloc_dma(hw_config->dma2,
++	if ( devc->dma_capture >= 0 && 
++	  	devc->dma_capture != devc->dma_playback) {
++		if (sound_alloc_dma(devc->dma_capture,
+ 				    "Sound System (capture)")) {
+ 			printk(KERN_WARNING "ad1816: Can't allocate DMA%d\n",
+-					    hw_config->dma2);
++					    devc->dma_capture);
+ 			goto out_free_dma;
+ 		}
+-		devc->dma_capture=hw_config->dma2;
+ 		devc->audio_mode=DMA_AUTOMODE|DMA_DUPLEX;
+ 	} else {
+-	        devc->dma_capture=-1;
++	  	printk(KERN_WARNING "ad1816: Only one DMA channel "
++			"available/configured. No duplex operation possible\n");
+ 		devc->audio_mode=DMA_AUTOMODE;
+ 	}
+ 
+-	sprintf (dev_name,"AD1816 audio driver");
+-  
+-	conf_printf2 (dev_name,
+-		      devc->base, devc->irq, hw_config->dma, hw_config->dma2);
++	conf_printf2 ("AD1816 audio driver",
++		      devc->base, devc->irq, devc->dma_playback, 
++		      devc->dma_capture);
+ 
+ 	/* register device */
+-	if ((my_dev = sound_install_audiodrv (AUDIO_DRIVER_VERSION,
+-					      dev_name,
++	if ((oss_devno = sound_install_audiodrv (AUDIO_DRIVER_VERSION,
++					      "AD1816 audio driver",
+ 					      &ad1816_audio_driver,
+ 					      sizeof (struct audio_driver),
+ 					      devc->audio_mode,
+ 					      ad_format_mask,
+ 					      devc,
+-					      hw_config->dma, 
+-					      hw_config->dma2)) < 0) {
++					      devc->dma_playback, 
++					      devc->dma_capture)) < 0) {
+ 		printk(KERN_WARNING "ad1816: Can't install sound driver\n");
+ 		goto out_free_dma_2;
+ 	}
+ 
+-	/* fill rest of structure with reasonable default values */
+-	irq2dev[hw_config->irq] = devc->dev_no = my_dev;
+-	devc->opened = 0;
+-	devc->irq_ok = 0;
+-	devc->osp = hw_config->osp;  
+-	nr_ad1816_devs++;
+ 
+ 	ad_write(devc,32,0x80f0); /* sound system mode */
+ 	if (options&1) {
+@@ -1186,25 +1141,30 @@ static void __init attach_ad1816 (struct
+ 	ad1816_mixer_reset (devc); 
+   
+ 	/* register mixer */
+-	if ((audio_devs[my_dev]->mixer_dev=sound_install_mixer(
++	if ((audio_devs[oss_devno]->mixer_dev=sound_install_mixer(
+ 				       MIXER_DRIVER_VERSION,
+-				       dev_name,
++				       "AD1816 audio driver",
+ 				       &ad1816_mixer_operations,
+ 				       sizeof (struct mixer_operations),
+-				       devc)) >= 0) {
+-		audio_devs[my_dev]->min_fragment = 0;
++				       devc)) < 0) {
++	  	printk(KERN_WARNING "Can't install mixer\n");
+ 	}
+-out:	return;
++	/* make ad1816_info active */
++	nr_ad1816_devs++;
++	printk(KERN_INFO "ad1816: card successfully installed!\n");
++	return 1;
++	/* error handling */
+ out_free_dma_2:
+-	if (devc->dma_capture >= 0)
+-	        sound_free_dma(hw_config->dma2);
++	if (devc->dma_capture >= 0 && devc->dma_capture != devc->dma_playback)
++	        sound_free_dma(devc->dma_capture);
+ out_free_dma:
+-	sound_free_dma(hw_config->dma);
++	sound_free_dma(devc->dma_playback);
+ out_free_irq:
+-	free_irq(hw_config->irq,hw_config->osp);
++	free_irq(devc->irq, devc);
+ out_release_region:
+-	release_region(hw_config->io_base, 16);
+-	goto out;
++	release_region(devc->base, 16);
++out:
++	return 0;
+ }
+ 
+ static void __exit unload_card(ad1816_info *devc)
+@@ -1212,7 +1172,7 @@ static void __exit unload_card(ad1816_in
+ 	int  mixer, dev = 0;
+ 	
+ 	if (devc != NULL) {
+-		DEBUGLOG (printk("ad1816: Unloading card at base=%x\n",devc->base));
++		printk("ad1816: Unloading card at address 0x%03x\n",devc->base);
+ 		
+ 		dev = devc->dev_no;
+ 		mixer = audio_devs[dev]->mixer_dev;
+@@ -1221,45 +1181,41 @@ static void __exit unload_card(ad1816_in
+ 		if(mixer>=0) {
+ 			sound_unload_mixerdev(mixer);
+ 		}
++		/* unreg audiodev */
+ 		sound_unload_audiodev(dev);
+ 		
+ 		/* free dma channels */
+-		if (devc->dma_capture>=0) {
++		if (devc->dma_capture>=0 && 
++		  	devc->dma_capture != devc->dma_playback) {
+ 			sound_free_dma(devc->dma_capture);
+ 		}
+-
+-		/* card won't get added if resources could not be allocated
+-		   thus we need not ckeck if allocation was successful */
+ 		sound_free_dma (devc->dma_playback);
+-		free_irq(devc->irq, devc->osp);
++		/* free irq */
++		free_irq(devc->irq, devc);
++		/* free io */
+ 		release_region (devc->base, 16);
+-		
+-		DEBUGLOG (printk("ad1816: Unloading card at base=%x was successful\n",devc->base));
++#ifdef __ISAPNP__
++		if (devc->pnpdev) {
++		  	pnp_disable_dev(devc->pnpdev);
++			pnp_device_detach(devc->pnpdev);
++		}
++#endif
+ 		
+ 	} else
+ 		printk(KERN_WARNING "ad1816: no device/card specified\n");
+ }
+ 
+-static struct address_info cfg;
+-
+ static int __initdata io = -1;
+ static int __initdata irq = -1;
+ static int __initdata dma = -1;
+ static int __initdata dma2 = -1;
+ 
+ #ifdef __ISAPNP__
+-struct pci_dev	*ad1816_dev  = NULL;
+-
+-static int activated	= 1;
+-
++/* use isapnp for configuration */
+ static int isapnp	= 1;
+ static int isapnpjump	= 0;
+-
+ MODULE_PARM(isapnp, "i");
+ MODULE_PARM(isapnpjump, "i");
+-
+-#else
+-static int isapnp = 0;
+ #endif
+ 
+ MODULE_PARM(io,"i");
+@@ -1270,51 +1226,6 @@ MODULE_PARM(ad1816_clockfreq,"i");
+ MODULE_PARM(options,"i");
+ 
+ #ifdef __ISAPNP__
+-
+-static struct pci_dev *activate_dev(char *devname, char *resname, struct pci_dev *dev)
+-{
+-	int err;
+-	
+-	if(dev->active) {
+-		activated = 0;
+-		return(dev);
+-	}
+-
+-	if((err = dev->activate(dev)) < 0) {
+-		printk(KERN_ERR "ad1816: %s %s config failed (out of resources?)[%d]\n",
+-			devname, resname, err);
+-		dev->deactivate(dev);
+-		return(NULL);
+-	}
+-		
+-	return(dev);
+-}
+-
+-static struct pci_dev *ad1816_init_generic(struct pci_bus *bus, struct pci_dev *card,
+-	struct address_info *hw_config)
+-{
+-	if((ad1816_dev = isapnp_find_dev(bus, card->vendor, card->device, NULL))) {
+-		ad1816_dev->prepare(ad1816_dev);
+-		
+-		if((ad1816_dev = activate_dev("Analog Devices 1816(A)", "ad1816", ad1816_dev))) {
+-			hw_config->io_base	= ad1816_dev->resource[2].start;
+-			hw_config->irq		= ad1816_dev->irq_resource[0].start;
+-			hw_config->dma		= ad1816_dev->dma_resource[0].start;
+-			hw_config->dma2		= ad1816_dev->dma_resource[1].start;
+-		}
+-	}
+-	
+-	return(ad1816_dev);
+-}
+-
+-static struct ad1816_data {
+-	struct pci_dev * (*initfunc)(struct pci_bus*, struct pci_dev *, struct address_info *);
+-	char *name;
+-} ad1816_pnp_data[] __initdata = {
+-	{ &ad1816_init_generic, "Analog Devices 1815" },
+-	{ &ad1816_init_generic, "Analog Devices 1816A" }
+-};
+-
+ static struct {
+ 	unsigned short card_vendor, card_device;
+ 	unsigned short vendor;
+@@ -1323,107 +1234,101 @@ static struct {
+ } isapnp_ad1816_list[] __initdata = {
+ 	{	ISAPNP_ANY_ID, ISAPNP_ANY_ID,
+ 		ISAPNP_VENDOR('A','D','S'), ISAPNP_FUNCTION(0x7150), 
+-		&ad1816_pnp_data[0] },
++		0 },
+ 	{	ISAPNP_ANY_ID, ISAPNP_ANY_ID,
+ 		ISAPNP_VENDOR('A','D','S'), ISAPNP_FUNCTION(0x7180),
+-		&ad1816_pnp_data[1] },
++		0 },
+ 	{0}
+ };
+ 
+ MODULE_DEVICE_TABLE(isapnp, isapnp_ad1816_list);
+ 
+-static int __init ad1816_init_isapnp(struct address_info *hw_config,
+-	struct pci_bus *bus, struct pci_dev *card, int slot)
++
++void __init ad1816_config_pnp_card(struct pnp_card *card, unsigned short vendor,
++	unsigned short function)
+ {
+-	struct pci_dev *idev = NULL;
+-	
+-	/* You missed the init func? That's bad. */
+-	if(isapnp_ad1816_list[slot].data->initfunc) {
+-		char *busname = bus->name[0] ? bus->name : isapnp_ad1816_list[slot].data->name;
+-		
+-		printk(KERN_INFO "ad1816: %s detected\n", busname);
+-		
+-		/* Initialize this baby. */
+-		if((idev = isapnp_ad1816_list[slot].data->initfunc(bus, card, hw_config))) {
+-			/* We got it. */
+-
+-			printk(KERN_NOTICE "ad1816: ISAPnP reports '%s' at i/o %#x, irq %d, dma %d, %d\n",
+-				busname,
+-				hw_config->io_base, hw_config->irq, hw_config->dma,
+-				hw_config->dma2);
+-			return 1;
+-		} else
+-			printk(KERN_INFO "ad1816: Failed to initialize %s\n", busname);
+-	} else
+-		printk(KERN_ERR "ad1816: Bad entry in ad1816.c PnP table\n");
+-	
+-	return 0;
++	struct address_info cfg;
++  	struct pnp_dev *card_dev = pnp_find_dev(card, vendor, function, NULL);
++	if (!card_dev) return;
++	if (pnp_device_attach(card_dev) < 0) {
++	  	printk(KERN_WARNING "ad1816: Failed to attach PnP device\n");
++		return;
++	}
++	if (pnp_activate_dev(card_dev) < 0) {
++		printk(KERN_WARNING "ad1816: Failed to activate PnP device\n");
++		pnp_device_detach(card_dev);
++		return;
++	}
++	cfg.io_base = pnp_port_start(card_dev, 2);
++	cfg.irq = pnp_irq(card_dev, 0);
++	cfg.dma = pnp_irq(card_dev, 0);
++	cfg.dma2 = pnp_irq(card_dev, 1);
++	if (!ad1816_init_card(&cfg, card_dev)) {
++	  	pnp_disable_dev(card_dev);
++		pnp_device_detach(card_dev);
++	}
+ }
+ 
+-/*
+- * Actually this routine will detect and configure only the first card with successful
+- * initialization. isapnpjump could be used to jump to a specific entry.
+- * Please always add entries at the end of the array.
+- * Should this be fixed? - azummo
+- */
+-
+-int __init ad1816_probe_isapnp(struct address_info *hw_config)
++void __init ad1816_config_pnp_cards(void)
+ {
++	int nr_pnp_cfg;
+ 	int i;
+ 	
+ 	/* Count entries in isapnp_ad1816_list */
+-	for (i = 0; isapnp_ad1816_list[i].vendor != 0; i++)
+-		;
++	for (nr_pnp_cfg = 0; isapnp_ad1816_list[nr_pnp_cfg].card_vendor != 0; 
++		nr_pnp_cfg++);
+ 	/* Check and adjust isapnpjump */
+-	if( isapnpjump < 0 || isapnpjump > ( i - 1 ) ) {
+-		printk(KERN_ERR "ad1816: Valid range for isapnpjump is 0-%d. Adjusted to 0.\n", i-1);
++	if( isapnpjump < 0 || isapnpjump >= nr_pnp_cfg) {
++		printk(KERN_WARNING 
++			"ad1816: Valid range for isapnpjump is 0-%d. "
++			"Adjusted to 0.\n", nr_pnp_cfg-1);
+ 		isapnpjump = 0;
+ 	}
+-
+-	 for (i = isapnpjump; isapnp_ad1816_list[i].vendor != 0; i++) {
+-	 	struct pci_dev *card = NULL;
+-		
+-		while ((card = isapnp_find_dev(NULL, isapnp_ad1816_list[i].vendor,
+-		  isapnp_ad1816_list[i].function, card)))
+-			if(ad1816_init_isapnp(hw_config, card->bus, card, i))
+-				return 0;
++	for (i = isapnpjump; isapnp_ad1816_list[i].card_vendor != 0; i++) {
++	 	struct pnp_card *card = NULL;
++		/* iterate over all pnp cards */		
++		while ((card = pnp_find_card(isapnp_ad1816_list[i].card_vendor,
++		              	isapnp_ad1816_list[i].card_device, card))) 
++			ad1816_config_pnp_card(card, 
++				isapnp_ad1816_list[i].vendor,
++				isapnp_ad1816_list[i].function);
+ 	}
+-
+-	return -ENODEV;
+ }
+ #endif
+ 
++/* module initialization */
+ static int __init init_ad1816(void)
+ {
+-
+-#ifdef __ISAPNP__
+-	if(isapnp && (ad1816_probe_isapnp(&cfg) < 0) ) {
+-		printk(KERN_NOTICE "ad1816: No ISAPnP cards found, trying standard ones...\n");
+-		isapnp = 0;
+-	}
++	printk(KERN_INFO "ad1816: AD1816 sounddriver "
++			 "Copyright (C) 1998-2003 by Thorsten Knabe and "
++			 "others\n");
++#ifdef AD1816_CLOCK 
++	/* set ad1816_clockfreq if set during compilation */
++	ad1816_clockfreq=AD1816_CLOCK;
+ #endif
+-
+-	if( isapnp == 0) {
+-		cfg.io_base	= io;
+-		cfg.irq		= irq;
+-		cfg.dma		= dma;
+-		cfg.dma2	= dma2;
+-	}
+-
+-	if (cfg.io_base == -1 || cfg.irq == -1 || cfg.dma == -1 || cfg.dma2 == -1) {
+-		printk(KERN_INFO "ad1816: dma, dma2, irq and io must be set.\n");
+-		return -EINVAL;
++	if (ad1816_clockfreq<5000 || ad1816_clockfreq>100000) {
++		ad1816_clockfreq=33000;
+ 	}
+ 
+-	if (probe_ad1816(&cfg) == 0) {
+-		return -ENODEV;
++#ifdef __ISAPNP__
++	/* configure PnP cards */
++	if(isapnp) ad1816_config_pnp_cards();
++#endif
++	/* configure card by module params */
++	if (io != -1 && irq != -1 && dma != -1) {
++		struct address_info cfg;
++		cfg.io_base = io;
++		cfg.irq = irq;
++		cfg.dma = dma;
++		cfg.dma2 = dma2;
++		ad1816_init_card(&cfg, NULL);
+ 	}
+-
+-	attach_ad1816(&cfg);
+-
++	if (nr_ad1816_devs <= 0)
++	  	return -ENODEV;
+ 	return 0;
+ }
+ 
++/* module cleanup */
+ static void __exit cleanup_ad1816 (void)
+ {
+ 	int          i;
+@@ -1435,18 +1340,14 @@ static void __exit cleanup_ad1816 (void)
+ 		unload_card(devc);
+ 	}     
+ 	nr_ad1816_devs=0;
+-
+-#ifdef __ISAPNP__
+-	if(activated)
+-		if(ad1816_dev)
+-			ad1816_dev->deactivate(ad1816_dev);
+-#endif
++	printk(KERN_INFO "ad1816: driver unloaded!\n");
+ }
+ 
+ module_init(init_ad1816);
+ module_exit(cleanup_ad1816);
+ 
+ #ifndef MODULE
++/* kernel command line parameter evaluation */
+ static int __init setup_ad1816(char *str)
+ {
+ 	/* io, irq, dma, dma2 */
+@@ -1458,7 +1359,6 @@ static int __init setup_ad1816(char *str
+ 	irq	= ints[2];
+ 	dma	= ints[3];
+ 	dma2	= ints[4];
+-
+ 	return 1;
+ }
+ 
+--- linux-2.6.0-test1/sound/oss/ad1889.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/ad1889.c	2003-07-19 17:03:51.000000000 -0700
+@@ -245,7 +245,6 @@ static ad1889_dev_t *ad1889_alloc_dev(st
+ 		dmabuf->ready = 0;
+ 		dmabuf->rate = 44100;
+ 	}
+-out:
+ 	return dev;
+ 
+ err_free_dmabuf:
+--- linux-2.6.0-test1/sound/oss/btaudio.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/btaudio.c	2003-07-19 17:03:51.000000000 -0700
+@@ -328,8 +328,8 @@ static int btaudio_mixer_ioctl(struct in
+ 	if (cmd == SOUND_MIXER_INFO) {
+ 		mixer_info info;
+ 		memset(&info,0,sizeof(info));
+-                strncpy(info.id,"bt878",sizeof(info.id));
+-                strncpy(info.name,"Brooktree Bt878 audio",sizeof(info.name));
++                strlcpy(info.id,"bt878",sizeof(info.id));
++                strlcpy(info.name,"Brooktree Bt878 audio",sizeof(info.name));
+                 info.modify_counter = bta->mixcount;
+                 if (copy_to_user((void *)arg, &info, sizeof(info)))
+                         return -EFAULT;
+@@ -338,8 +338,8 @@ static int btaudio_mixer_ioctl(struct in
+ 	if (cmd == SOUND_OLD_MIXER_INFO) {
+ 		_old_mixer_info info;
+ 		memset(&info,0,sizeof(info));
+-                strncpy(info.id,"bt878",sizeof(info.id)-1);
+-                strncpy(info.name,"Brooktree Bt878 audio",sizeof(info.name));
++                strlcpy(info.id,"bt878",sizeof(info.id)-1);
++                strlcpy(info.name,"Brooktree Bt878 audio",sizeof(info.name));
+                 if (copy_to_user((void *)arg, &info, sizeof(info)))
+                         return -EFAULT;
+ 		return 0;
+--- linux-2.6.0-test1/sound/oss/dmasound/dmasound_core.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/dmasound/dmasound_core.c	2003-07-19 17:03:51.000000000 -0700
+@@ -1660,13 +1660,13 @@ static int __init dmasound_setup(char *s
+ #ifdef HAS_RECORD
+         case 5:
+                 if ((ints[5] < 0) || (ints[5] > MAX_CATCH_RADIUS))
+-                        printk("dmasound_setup: illegal catch radius, using default = %d\n", catchRadius);
++                        printk("dmasound_setup: invalid catch radius, using default = %d\n", catchRadius);
+                 else
+                         catchRadius = ints[5];
+                 /* fall through */
+         case 4:
+                 if (ints[4] < MIN_BUFFERS)
+-                        printk("dmasound_setup: illegal number of read buffers, using default = %d\n",
++                        printk("dmasound_setup: invalid number of read buffers, using default = %d\n",
+                                  numReadBufs);
+                 else
+                         numReadBufs = ints[4];
+@@ -1675,21 +1675,21 @@ static int __init dmasound_setup(char *s
+ 		if ((size = ints[3]) < 256)  /* check for small buffer specs */
+ 			size <<= 10 ;
+                 if (size < MIN_BUFSIZE || size > MAX_BUFSIZE)
+-                        printk("dmasound_setup: illegal read buffer size, using default = %d\n", readBufSize);
++                        printk("dmasound_setup: invalid read buffer size, using default = %d\n", readBufSize);
+                 else
+                         readBufSize = size;
+                 /* fall through */
+ #else
+ 	case 3:
+ 		if ((ints[3] < 0) || (ints[3] > MAX_CATCH_RADIUS))
+-			printk("dmasound_setup: illegal catch radius, using default = %d\n", catchRadius);
++			printk("dmasound_setup: invalid catch radius, using default = %d\n", catchRadius);
+ 		else
+ 			catchRadius = ints[3];
+ 		/* fall through */
+ #endif
+ 	case 2:
+ 		if (ints[1] < MIN_BUFFERS)
+-			printk("dmasound_setup: illegal number of buffers, using default = %d\n", numWriteBufs);
++			printk("dmasound_setup: invalid number of buffers, using default = %d\n", numWriteBufs);
+ 		else
+ 			numWriteBufs = ints[1];
+ 		/* fall through */
+@@ -1697,13 +1697,13 @@ static int __init dmasound_setup(char *s
+ 		if ((size = ints[2]) < 256) /* check for small buffer specs */
+ 			size <<= 10 ;
+                 if (size < MIN_BUFSIZE || size > MAX_BUFSIZE)
+-                        printk("dmasound_setup: illegal write buffer size, using default = %d\n", writeBufSize);
++                        printk("dmasound_setup: invalid write buffer size, using default = %d\n", writeBufSize);
+                 else
+                         writeBufSize = size;
+ 	case 0:
+ 		break;
+ 	default:
+-		printk("dmasound_setup: illegal number of arguments\n");
++		printk("dmasound_setup: invalid number of arguments\n");
+ 		return 0;
+ 	}
+ 	return 1;
+--- linux-2.6.0-test1/sound/oss/emu10k1/8010.h	2003-06-14 12:17:56.000000000 -0700
++++ 25/sound/oss/emu10k1/8010.h	2003-07-19 17:03:51.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  **********************************************************************
+  *     8010.h
+- *     Copyright 1999, 2000 Creative Labs, Inc.
++ *     Copyright 1999-2001 Creative Labs, Inc.
+  *
+  **********************************************************************
+  *
+@@ -11,6 +11,8 @@
+  *     November 2, 1999     Alan Cox	    Cleaned of 8bit chars, DOS
+  *					    line endings
+  *     December 8, 1999     Jon Taylor	    Added lots of new register info
++ *     May 16, 2001         Daniel Bertrand Added unofficial DBG register info
++ *     Oct-Nov 2001         D.B.            Added unofficial Audigy registers 
+  *
+  **********************************************************************
+  *
+@@ -39,6 +41,14 @@
+ 
+ #include <linux/types.h>
+ 
++// Driver version:
++#define MAJOR_VER 0
++#define MINOR_VER 20
++#define DRIVER_VERSION "0.20a"
++
++
++// Audigy specify registers are prefixed with 'A_'
++
+ /************************************************************************************************/
+ /* PCI function 0 registers, address = <val> + PCIBASE0						*/
+ /************************************************************************************************/
+@@ -57,6 +67,11 @@
+ #define IPR			0x08		/* Global interrupt pending register		*/
+ 						/* Clear pending interrupts by writing a 1 to	*/
+ 						/* the relevant bits and zero to the other bits	*/
++
++/* The next two interrupts are for the midi port on the Audigy Drive (A_MPU1)			*/
++#define A_IPR_MIDITRANSBUFEMPTY2	0x10000000	/* MIDI UART transmit buffer empty		*/
++#define A_IPR_MIDIRECVBUFEMPTY2	0x08000000	/* MIDI UART receive buffer empty		*/
++
+ #define IPR_SAMPLERATETRACKER	0x01000000	/* Sample rate tracker lock status change	*/
+ #define IPR_FXDSP		0x00800000	/* Enable FX DSP interrupts			*/
+ #define IPR_FORCEINT		0x00400000	/* Force Sound Blaster interrupt		*/
+@@ -81,6 +96,10 @@
+ 						/* IP is written with CL set, the bit in CLIPL	*/
+ 						/* or CLIPH corresponding to the CIN value 	*/
+ 						/* written will be cleared.			*/
++#define A_IPR_MIDITRANSBUFEMPTY1	IPR_MIDITRANSBUFEMPTY	/* MIDI UART transmit buffer empty		*/
++#define A_IPR_MIDIRECVBUFEMPTY1	IPR_MIDIRECVBUFEMPTY	/* MIDI UART receive buffer empty		*/
++
++
+ 
+ #define INTE			0x0c		/* Interrupt enable register			*/
+ #define INTE_VIRTUALSB_MASK	0xc0000000	/* Virtual Soundblaster I/O port capture	*/
+@@ -108,6 +127,11 @@
+ 						/* behavior and possibly random segfaults and	*/
+ 						/* lockups if enabled.				*/
+ 
++/* The next two interrupts are for the midi port on the Audigy Drive (A_MPU1)			*/
++#define A_INTE_MIDITXENABLE2	0x00020000	/* Enable MIDI transmit-buffer-empty interrupts	*/
++#define A_INTE_MIDIRXENABLE2	0x00010000	/* Enable MIDI receive-buffer-empty interrupts	*/
++
++
+ #define INTE_SAMPLERATETRACKER	0x00002000	/* Enable sample rate tracker interrupts	*/
+ 						/* NOTE: This bit must always be enabled       	*/
+ #define INTE_FXDSPENABLE	0x00001000	/* Enable FX DSP interrupts			*/
+@@ -124,6 +148,10 @@
+ #define INTE_MIDITXENABLE	0x00000002	/* Enable MIDI transmit-buffer-empty interrupts	*/
+ #define INTE_MIDIRXENABLE	0x00000001	/* Enable MIDI receive-buffer-empty interrupts	*/
+ 
++/* The next two interrupts are for the midi port on the Audigy (A_MPU2)	*/
++#define A_INTE_MIDITXENABLE1  	INTE_MIDITXENABLE
++#define A_INTE_MIDIRXENABLE1	INTE_MIDIRXENABLE
++
+ #define WC			0x10		/* Wall Clock register				*/
+ #define WC_SAMPLECOUNTER_MASK	0x03FFFFC0	/* Sample periods elapsed since reset		*/
+ #define WC_SAMPLECOUNTER	0x14060010
+@@ -186,6 +214,8 @@
+ 						/* Should be set to 1 when the EMU10K1 is	*/
+ 						/* completely initialized.			*/
+ 
++//For Audigy, MPU port move to 0x70-0x74 ptr register
++
+ #define MUDATA			0x18		/* MPU401 data register (8 bits)       		*/
+ 
+ #define MUCMD			0x19		/* MPU401 command register (8 bits)    		*/
+@@ -197,13 +227,16 @@
+ #define MUSTAT_IRDYN		0x80		/* 0 = MIDI data or command ACK			*/
+ #define MUSTAT_ORDYN		0x40		/* 0 = MUDATA can accept a command or data	*/
+ 
+-#define TIMER			0x1a		/* Timer terminal count register		*/
++#define A_IOCFG			0x18		/* GPIO on Audigy card (16bits)			*/
++#define A_GPINPUT_MASK		0xff00
++#define A_GPOUTPUT_MASK		0x00ff
++
++#define TIMER			0x1a		/* Timer terminal count register (16-bit)	*/
+ 						/* NOTE: After the rate is changed, a maximum	*/
+ 						/* of 1024 sample periods should be allowed	*/
+ 						/* before the new rate is guaranteed accurate.	*/
+-#define TIMER_RATE_MASK		0x000003ff	/* Timer interrupt rate in sample periods	*/
++#define TIMER_RATE_MASK		0x03ff		/* Timer interrupt rate in sample periods	*/
+ 						/* 0 == 1024 periods, [1..4] are not useful	*/
+-#define TIMER_RATE		0x0a00001a
+ 
+ #define AC97DATA		0x1c		/* AC97 register set data register (16 bit)	*/
+ 
+@@ -386,6 +419,8 @@
+ #define TREMFRQ 		0x1c		/* Tremolo amount and modulation LFO frequency register	*/
+ #define TREMFRQ_DEPTH		0x0000ff00	/* Tremolo depth					*/
+ 						/* Signed 2's complement, with +/- 12dB extremes	*/
++#define TREMFRQ_FREQUENCY	0x000000ff	/* Tremolo LFO frequency				*/
++						/* ??Hz steps, maximum of ?? Hz.			*/
+ 
+ #define FM2FRQ2 		0x1d		/* Vibrato amount and vibrato LFO frequency register	*/
+ #define FM2FRQ2_DEPTH		0x0000ff00	/* Vibrato LFO vibrato depth				*/
+@@ -426,7 +461,12 @@
+ #define ADCCR_LCHANENABLE	0x00000008	/* Enables left channel for writing to the host		*/
+ 						/* NOTE: To guarantee phase coherency, both channels	*/
+ 						/* must be disabled prior to enabling both channels.	*/
++#define A_ADCCR_RCHANENABLE	0x00000020
++#define A_ADCCR_LCHANENABLE	0x00000010
++
++#define A_ADCCR_SAMPLERATE_MASK 0x0000000F      /* Audigy sample rate convertor output rate		*/
+ #define ADCCR_SAMPLERATE_MASK	0x00000007	/* Sample rate convertor output rate			*/
++
+ #define ADCCR_SAMPLERATE_48	0x00000000	/* 48kHz sample rate					*/
+ #define ADCCR_SAMPLERATE_44	0x00000001	/* 44.1kHz sample rate					*/
+ #define ADCCR_SAMPLERATE_32	0x00000002	/* 32kHz sample rate					*/
+@@ -436,10 +476,16 @@
+ #define ADCCR_SAMPLERATE_11	0x00000006	/* 11.025kHz sample rate				*/
+ #define ADCCR_SAMPLERATE_8	0x00000007	/* 8kHz sample rate					*/
+ 
++#define A_ADCCR_SAMPLERATE_12	0x00000006	/* 12kHz sample rate					*/
++#define A_ADCCR_SAMPLERATE_11	0x00000007	/* 11.025kHz sample rate				*/
++#define A_ADCCR_SAMPLERATE_8	0x00000008	/* 8kHz sample rate					*/
++
+ #define FXWC			0x43		/* FX output write channels register			*/
+ 						/* When set, each bit enables the writing of the	*/
+-						/* corresponding FX output channel into host memory	*/
+-
++						/* corresponding FX output channel (internal registers  */
++						/* 0x20-0x3f) into host memory. This mode of recording	*/
++						/* is 16bit, 48KHz only. All 32	channels can be enabled */
++						/* simultaneously.					*/
+ #define TCBS			0x44		/* Tank cache buffer size register			*/
+ #define TCBS_MASK		0x00000007	/* Tank cache buffer size field				*/
+ #define TCBS_BUFFSIZE_16K	0x00000000
+@@ -519,6 +565,13 @@
+ 
+ #define REG53			0x53		/* DO NOT PROGRAM THIS REGISTER!!! MAY DESTROY CHIP */
+ 
++#define A_DBG			 0x53
++#define A_DBG_SINGLE_STEP	 0x00020000	/* Set to zero to start dsp */
++#define A_DBG_ZC		 0x40000000	/* zero tram counter */
++#define A_DBG_STEP_ADDR		 0x000003ff
++#define A_DBG_SATURATION_OCCURED 0x20000000
++#define A_DBG_SATURATION_ADDR	 0x0ffc0000
++
+ #define SPCS0			0x54		/* SPDIF output Channel Status 0 register	*/
+ 
+ #define SPCS1			0x55		/* SPDIF output Channel Status 1 register	*/
+@@ -582,10 +635,19 @@
+ #define SRCS_RATELOCKED		0x01000000	/* Sample rate locked				*/
+ #define SRCS_ESTSAMPLERATE	0x0007ffff	/* Do not modify this field.			*/
+ 
++
++/* Note that these values can vary +/- by a small amount                                        */
++#define SRCS_SPDIFRATE_44	0x0003acd9
++#define SRCS_SPDIFRATE_48	0x00040000
++#define SRCS_SPDIFRATE_96	0x00080000
++
+ #define MICIDX                  0x63            /* Microphone recording buffer index register   */
+ #define MICIDX_MASK             0x0000ffff      /* 16-bit value                                 */
+ #define MICIDX_IDX		0x10000063
+ 
++#define A_ADCIDX		0x63
++#define A_ADCIDX_IDX		0x10000063
++
+ #define ADCIDX			0x64		/* ADC recording buffer index register		*/
+ #define ADCIDX_MASK		0x0000ffff	/* 16 bit index field				*/
+ #define ADCIDX_IDX		0x10000064
+@@ -594,9 +656,50 @@
+ #define FXIDX_MASK		0x0000ffff	/* 16-bit value					*/
+ #define FXIDX_IDX		0x10000065
+ 
++/* This is the MPU port on the card (via the game port)						*/
++#define A_MUDATA1		0x70
++#define A_MUCMD1		0x71
++#define A_MUSTAT1		A_MUCMD1
++
++/* This is the MPU port on the Audigy Drive 							*/
++#define A_MUDATA2		0x72
++#define A_MUCMD2		0x73
++#define A_MUSTAT2		A_MUCMD2	
++
++/* The next two are the Audigy equivalent of FXWC						*/
++/* the Audigy can record any output (16bit, 48kHz, up to 64 channel simultaneously) 		*/
++/* Each bit selects a channel for recording */
++#define A_FXWC1			0x74            /* Selects 0x7f-0x60 for FX recording           */
++#define A_FXWC2			0x75		/* Selects 0x9f-0x80 for FX recording           */
++
++#define A_SPDIF_SAMPLERATE	0x76		/* Set the sample rate of SPDIF output		*/
++#define A_SPDIF_48000		0x00000080
++#define A_SPDIF_44100		0x00000000
++#define A_SPDIF_96000		0x00000040
++
++#define A_FXRT2			0x7c
++#define A_FXRT_CHANNELE		0x0000003f	/* Effects send bus number for channel's effects send E	*/
++#define A_FXRT_CHANNELF		0x00003f00	/* Effects send bus number for channel's effects send F	*/
++#define A_FXRT_CHANNELG		0x003f0000	/* Effects send bus number for channel's effects send G	*/
++#define A_FXRT_CHANNELH		0x3f000000	/* Effects send bus number for channel's effects send H	*/
++
++#define A_SENDAMOUNTS		0x7d
++#define A_FXSENDAMOUNT_E_MASK	0xff000000
++#define A_FXSENDAMOUNT_F_MASK	0x00ff0000
++#define A_FXSENDAMOUNT_G_MASK	0x0000ff00
++#define A_FXSENDAMOUNT_H_MASK	0x000000ff
++
++/* The send amounts for this one are the same as used with the emu10k1 */
++#define A_FXRT1			0x7e
++#define A_FXRT_CHANNELA		0x0000003f
++#define A_FXRT_CHANNELB		0x00003f00
++#define A_FXRT_CHANNELC		0x003f0000
++#define A_FXRT_CHANNELD		0x3f000000
++
++
+ /* Each FX general purpose register is 32 bits in length, all bits are used			*/
+ #define FXGPREGBASE		0x100		/* FX general purpose registers base       	*/
+-
++#define A_FXGPREGBASE		0x400		/* Audigy GPRs, 0x400 to 0x5ff			*/
+ /* Tank audio data is logarithmically compressed down to 16 bits before writing to TRAM and is	*/
+ /* decompressed back to 20 bits on a read.  There are a total of 160 locations, the last 32	*/
+ /* locations are for external TRAM. 								*/
+@@ -621,4 +724,14 @@
+ #define HIWORD_RESULT_MASK	0x000ffc00	/* Instruction result				*/
+ #define HIWORD_OPA_MASK		0x000003ff	/* Instruction operand A			*/
+ 
++
++/* Audigy Soundcard have a different instruction format */
++#define AUDIGY_CODEBASE		0x600
++#define A_LOWORD_OPY_MASK	0x000007ff		
++#define A_LOWORD_OPX_MASK	0x007ff000
++#define A_HIWORD_OPCODE_MASK	0x0f000000
++#define A_HIWORD_RESULT_MASK	0x007ff000
++#define A_HIWORD_OPA_MASK	0x000007ff
++
++
+ #endif /* _8010_H */
+--- linux-2.6.0-test1/sound/oss/emu10k1/audio.c	2003-06-14 12:17:57.000000000 -0700
++++ 25/sound/oss/emu10k1/audio.c	2003-07-19 17:03:51.000000000 -0700
+@@ -158,8 +158,8 @@ static ssize_t emu10k1_audio_write(struc
+ 		spin_unlock_irqrestore(&woinst->lock, flags);
+ 		return -ENXIO;
+ 	}
+-
+-	if (woinst->format.passthrough) {
++	// This is for emu10k1 revs less than 7, we need to go through tram
++	if (woinst->format.passthrough == 1) {
+ 		int r;
+ 		
+ 		woinst->buffer.ossfragshift = PT_BLOCKSIZE_LOG2;
+@@ -350,8 +350,9 @@ static int emu10k1_audio_ioctl(struct in
+ 
+ 	case SNDCTL_DSP_GETCAPS:
+ 		DPF(2, "SNDCTL_DSP_GETCAPS:\n");
+-		return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME | DSP_CAP_TRIGGER | DSP_CAP_MMAP | DSP_CAP_COPROC, (int *) arg);
+-
++		return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME |
++				DSP_CAP_TRIGGER | DSP_CAP_MMAP |
++				DSP_CAP_COPROC| DSP_CAP_MULTI, (int *) arg);
+ 	case SNDCTL_DSP_SPEED:
+ 		DPF(2, "SNDCTL_DSP_SPEED:\n");
+ 
+@@ -528,8 +529,8 @@ static int emu10k1_audio_ioctl(struct in
+ 		else if (file->f_mode & FMODE_WRITE) {
+ 			val = AFMT_S16_LE | AFMT_U8;
+ 			if (emu10k1_find_control_gpr(&wave_dev->card->mgr,
+-			    			     wave_dev->card->pt.patch_name, 
+-			    			     wave_dev->card->pt.enable_gpr_name) >= 0)
++						     wave_dev->card->pt.patch_name, 
++						     wave_dev->card->pt.enable_gpr_name) >= 0)
+ 				val |= AFMT_AC3;
+ 		}
+ 		return put_user(val, (int *) arg);
+@@ -789,7 +790,7 @@ static int emu10k1_audio_ioctl(struct in
+ 				cinfo.blocks = 0;
+ 			}
+ 
+-			if(wiinst->mmapped)
++			if (wiinst->mmapped)
+ 				wiinst->buffer.bytestocopy %= wiinst->buffer.fragment_size;
+ 
+ 			spin_unlock_irqrestore(&wiinst->lock, flags);
+@@ -811,15 +812,17 @@ static int emu10k1_audio_ioctl(struct in
+ 			spin_lock_irqsave(&woinst->lock, flags);
+ 
+ 			if (woinst->state & WAVE_STATE_OPEN || 
+-			    (woinst->format.passthrough && wave_dev->card->pt.state)) {
++			    ((woinst->format.passthrough == 1) && wave_dev->card->pt.state)) {
+ 				int num_fragments;
+-				if (woinst->format.passthrough) {
++
++				if (woinst->format.passthrough == 1) {
+ 					emu10k1_pt_waveout_update(wave_dev);
+ 					cinfo.bytes = woinst->total_played;
+ 				} else {
+ 					emu10k1_waveout_update(woinst);
+ 					cinfo.bytes = woinst->total_played;
+ 				}
++
+ 				cinfo.ptr = woinst->buffer.hw_pos;
+ 				num_fragments = cinfo.bytes / woinst->buffer.fragment_size;
+ 				cinfo.blocks = num_fragments - woinst->blocks;
+@@ -899,7 +902,7 @@ static int emu10k1_audio_ioctl(struct in
+ 
+ 		if (file->f_mode & FMODE_WRITE) {
+ 			/* digital pass-through fragment count and size are fixed values */
+-			if (woinst->state & WAVE_STATE_OPEN || woinst->format.passthrough)
++			if (woinst->state & WAVE_STATE_OPEN || (woinst->format.passthrough == 1))
+ 				return -EINVAL;	/* too late to change */
+ 
+ 			woinst->buffer.ossfragshift = val & 0xffff;
+@@ -936,19 +939,35 @@ static int emu10k1_audio_ioctl(struct in
+ 				kfree (buf);
+ 				return -EINVAL;
+ 			}
++
++			if (buf->command == CMD_WRITE) {
++				
+ #ifdef DBGEMU
+-			if ( (buf->offs < 0) || (buf->offs + buf->len > 0x800) || (buf->len > 1000)) {
++				if ((buf->offs < 0) || (buf->offs + buf->len > 0xe00) || (buf->len > 1000)) {
+ #else
+-			if ( ((buf->offs < 0x100 ) || (buf->offs + buf->len > 0x800) || (buf->len > 1000))
+-			     && !( ( buf->offs == DBG) && (buf->len ==1) )){
+-#endif	
+-				kfree(buf);
+-				return -EINVAL;
+-			}
++				if (((buf->offs < 0x100) || (buf->offs + buf->len > (wave_dev->card->is_audigy ? 0xe00 : 0x800)) || (buf->len > 1000)
++				) && !(
++					//any register allowed raw access to users goes here:
++					(buf->offs == DBG ||
++					  buf->offs == A_DBG)
++					&& (buf->len == 1))) {
++#endif		
++					kfree(buf);
++					return -EINVAL;
++				}
++			} else {
++				if ((buf->offs < 0) || (buf->offs + buf->len > 0xe00) || (buf->len > 1000)) {
++					kfree(buf);
++					return -EINVAL;
++				}
++			}			
++				
++			if (((unsigned)buf->flags) > 0x3f)
++				buf->flags = 0;
+ 
+ 			if (buf->command == CMD_READ) {
+ 				for (i = 0; i < buf->len; i++)
+-					((u32 *) buf->data)[i] = sblive_readptr(wave_dev->card, buf->offs + i, 0);
++					((u32 *) buf->data)[i] = sblive_readptr(wave_dev->card, buf->offs + i, buf->flags);
+ 
+ 				if (copy_to_user((copr_buffer *) arg, buf, sizeof(copr_buffer))) {
+ 					kfree(buf);
+@@ -956,7 +975,7 @@ static int emu10k1_audio_ioctl(struct in
+ 				}
+ 			} else {
+ 				for (i = 0; i < buf->len; i++)
+-					sblive_writeptr(wave_dev->card, buf->offs + i, 0, ((u32 *) buf->data)[i]);
++					sblive_writeptr(wave_dev->card, buf->offs + i, buf->flags, ((u32 *) buf->data)[i]);
+ 			}
+ 
+ 			kfree (buf);
+@@ -1244,8 +1263,9 @@ static int emu10k1_audio_release(struct 
+ 		struct woinst *woinst = wave_dev->woinst;
+ 
+ 		spin_lock_irqsave(&woinst->lock, flags);
+-
+-		if (woinst->format.passthrough && card->pt.state != PT_STATE_INACTIVE) {
++		if(woinst->format.passthrough==2)
++			card->pt.state=PT_STATE_PLAYING;
++		if (woinst->format.passthrough && card->pt.state != PT_STATE_INACTIVE){
+ 			spin_lock(&card->pt.lock);
+                         emu10k1_pt_stop(card);
+ 			spin_unlock(&card->pt.lock);
+--- linux-2.6.0-test1/sound/oss/emu10k1/cardmi.c	2003-06-14 12:18:22.000000000 -0700
++++ 25/sound/oss/emu10k1/cardmi.c	2003-07-19 17:03:51.000000000 -0700
+@@ -113,7 +113,7 @@ int emu10k1_mpuin_close(struct emu10k1_c
+ 	}
+ 
+ 	/* Disable RX interrupt */
+-	emu10k1_irq_disable(card, INTE_MIDIRXENABLE);
++	emu10k1_irq_disable(card, card->is_audigy ? A_INTE_MIDIRXENABLE : INTE_MIDIRXENABLE);
+ 
+ 	emu10k1_mpu_release(card);
+ 
+@@ -189,7 +189,7 @@ int emu10k1_mpuin_start(struct emu10k1_c
+ 		card_mpuin->qhead = 0;
+ 		card_mpuin->qtail = 0;
+ 
+-		emu10k1_irq_enable(card, INTE_MIDIRXENABLE);
++		emu10k1_irq_enable(card, card->is_audigy ? A_INTE_MIDIRXENABLE : INTE_MIDIRXENABLE);
+ 	}
+ 
+ 	return 0;
+@@ -207,7 +207,7 @@ int emu10k1_mpuin_stop(struct emu10k1_ca
+ 
+ 	DPF(2, "emu10k1_mpuin_stop()\n");
+ 
+-	emu10k1_irq_disable(card, INTE_MIDIRXENABLE);
++	emu10k1_irq_disable(card, card->is_audigy ? A_INTE_MIDIRXENABLE : INTE_MIDIRXENABLE);
+ 
+ 	card_mpuin->status &= ~FLAGS_MIDM_STARTED;	/* clear */
+ 
+@@ -246,7 +246,7 @@ int emu10k1_mpuin_reset(struct emu10k1_c
+ 
+ 	DPF(2, "emu10k1_mpuin_reset()\n");
+ 
+-	emu10k1_irq_disable(card, INTE_MIDIRXENABLE);
++	emu10k1_irq_disable(card, card->is_audigy ? A_INTE_MIDIRXENABLE : INTE_MIDIRXENABLE);
+ 
+ 	while (card_mpuin->firstmidiq) {
+ 		midiq = card_mpuin->firstmidiq;
+--- linux-2.6.0-test1/sound/oss/emu10k1/cardmo.c	2003-06-14 12:17:58.000000000 -0700
++++ 25/sound/oss/emu10k1/cardmo.c	2003-07-19 17:03:51.000000000 -0700
+@@ -72,7 +72,7 @@ int emu10k1_mpuout_close(struct emu10k1_
+ 
+ 	DPF(2, "emu10k1_mpuout_close()\n");
+ 
+-	emu10k1_irq_disable(card, INTE_MIDITXENABLE);
++	emu10k1_irq_disable(card, card->is_audigy ? A_INTE_MIDITXENABLE : INTE_MIDITXENABLE);
+ 
+ 	spin_lock_irqsave(&card_mpuout->lock, flags);
+ 
+@@ -142,7 +142,7 @@ int emu10k1_mpuout_add_buffer(struct emu
+ 
+ 	card_mpuout->intr = 0;
+ 
+-	emu10k1_irq_enable(card, INTE_MIDITXENABLE);
++	emu10k1_irq_enable(card, card->is_audigy ? A_INTE_MIDITXENABLE : INTE_MIDITXENABLE);
+ 
+ 	spin_unlock_irqrestore(&card_mpuout->lock, flags);
+ 
+@@ -206,7 +206,7 @@ void emu10k1_mpuout_bh(unsigned long ref
+ 
+ 	if ((card_mpuout->firstmidiq != NULL) || cByteSent) {
+ 		card_mpuout->intr = 0;
+-		emu10k1_irq_enable(card, INTE_MIDITXENABLE);
++		emu10k1_irq_enable(card, card->is_audigy ? A_INTE_MIDITXENABLE : INTE_MIDITXENABLE);
+ 	}
+ 
+ 	spin_unlock_irqrestore(&card_mpuout->lock, flags);
+@@ -221,7 +221,7 @@ int emu10k1_mpuout_irqhandler(struct emu
+ 	DPF(4, "emu10k1_mpuout_irqhandler\n");
+ 
+ 	card_mpuout->intr = 1;
+-	emu10k1_irq_disable(card, INTE_MIDITXENABLE);
++	emu10k1_irq_disable(card, card->is_audigy ? A_INTE_MIDITXENABLE : INTE_MIDITXENABLE);
+ 
+ 	tasklet_hi_schedule(&card_mpuout->tasklet);
+ 
+--- linux-2.6.0-test1/sound/oss/emu10k1/cardwo.c	2003-06-14 12:18:30.000000000 -0700
++++ 25/sound/oss/emu10k1/cardwo.c	2003-07-19 17:03:51.000000000 -0700
+@@ -85,25 +85,36 @@ static void query_format(struct emu10k1_
+ 		break;
+ 	}	
+ 	if (do_passthrough) {
+-		i = emu10k1_find_control_gpr(&card->mgr, card->pt.patch_name, card->pt.intr_gpr_name);
+-		j = emu10k1_find_control_gpr(&card->mgr, card->pt.patch_name, card->pt.enable_gpr_name);
+ 		/* currently only one waveout instance may use pass-through */
+-		if (i < 0 || j < 0 || woinst->state != WAVE_STATE_CLOSED || 
++		if (woinst->state != WAVE_STATE_CLOSED || 
+ 		    card->pt.state != PT_STATE_INACTIVE ||
+-		    (wave_fmt->samplingrate != 48000 && !is_ac3) ||
+ 		    (wave_fmt->samplingrate != 48000 && !is_ac3)) {
+ 			DPF(2, "unable to set pass-through mode\n");
+-		} else {
+-			wave_fmt->samplingrate = 48000;
+-			wave_fmt->channels = 2;
+-			wave_fmt->passthrough = 1;
+-			card->pt.intr_gpr = i;
+-			card->pt.enable_gpr = j;
+-			card->pt.state = PT_STATE_INACTIVE;
+-			card->pt.pos_gpr = emu10k1_find_control_gpr(&card->mgr, card->pt.patch_name, card->pt.pos_gpr_name);
+-			DPD(2, "is_ac3 is %d\n", is_ac3);
+-			card->pt.ac3data = is_ac3;
+-	                wave_fmt->bitsperchannel = 16;
++		} else if (USE_PT_METHOD1) {
++			i = emu10k1_find_control_gpr(&card->mgr, card->pt.patch_name, card->pt.intr_gpr_name);
++			j = emu10k1_find_control_gpr(&card->mgr, card->pt.patch_name, card->pt.enable_gpr_name);
++			if (i < 0 || j < 0)
++				DPF(2, "unable to set pass-through mode\n");
++			else {
++				wave_fmt->samplingrate = 48000;
++				wave_fmt->channels = 2;
++				card->pt.pos_gpr = emu10k1_find_control_gpr(&card->mgr, card->pt.patch_name,
++									    card->pt.pos_gpr_name);
++				wave_fmt->passthrough = 1;
++				card->pt.intr_gpr = i;
++				card->pt.enable_gpr = j;
++				card->pt.state = PT_STATE_INACTIVE;
++			
++				DPD(2, "is_ac3 is %d\n", is_ac3);
++				card->pt.ac3data = is_ac3;
++				wave_fmt->bitsperchannel = 16;
++			}
++		}else{
++			DPF(2, "Using Passthrough Method 2\n");
++			card->pt.enable_gpr = emu10k1_find_control_gpr(&card->mgr, card->pt.patch_name,
++								       card->pt.enable_gpr_name);
++			wave_fmt->passthrough = 2;
++			wave_fmt->bitsperchannel = 16;
+ 		}
+ 	}
+ 
+@@ -149,33 +160,37 @@ static int get_voice(struct emu10k1_card
+ 	voice->endloop = voice->startloop + woinst->buffer.size / woinst->format.bytespervoicesample;
+ 	voice->start = voice->startloop;
+ 
+-	if (voice->flags & VOICE_FLAGS_STEREO) {
+-		voice->params[0].send_a = card->waveout.send_a[1];
+-		voice->params[0].send_b = card->waveout.send_b[1];
+-		voice->params[0].send_c = card->waveout.send_c[1];
+-		voice->params[0].send_d = card->waveout.send_d[1];
+-
+-		if (woinst->device)
+-			voice->params[0].send_routing = 0x7654;
+-		else
+-			voice->params[0].send_routing = card->waveout.send_routing[1];
+-
+-		voice->params[0].volume_target = 0xffff;
+-		voice->params[0].initial_fc = 0xff;
+-		voice->params[0].initial_attn = 0x00;
+-		voice->params[0].byampl_env_sustain = 0x7f;
+-		voice->params[0].byampl_env_decay = 0x7f;
+-
+-		voice->params[1].send_a = card->waveout.send_a[2];
+-		voice->params[1].send_b = card->waveout.send_b[2];
+-		voice->params[1].send_c = card->waveout.send_c[2];
+-		voice->params[1].send_d = card->waveout.send_d[2];
+-
+-		if (woinst->device)
+-			voice->params[1].send_routing = 0x7654;
+-		else
+-			voice->params[1].send_routing = card->waveout.send_routing[2];
++	
++	voice->params[0].volume_target = 0xffff;
++	voice->params[0].initial_fc = 0xff;
++	voice->params[0].initial_attn = 0x00;
++	voice->params[0].byampl_env_sustain = 0x7f;
++	voice->params[0].byampl_env_decay = 0x7f;
+ 
++	
++	if (voice->flags & VOICE_FLAGS_STEREO) {
++		if (woinst->format.passthrough == 2) {
++			voice->params[0].send_routing  = voice->params[1].send_routing  = card->waveout.send_routing[ROUTE_PT];
++			voice->params[0].send_routing2 = voice->params[1].send_routing2 = card->waveout.send_routing2[ROUTE_PT];
++			voice->params[0].send_dcba = 0xff;
++			voice->params[1].send_dcba = 0xff00;
++			voice->params[0].send_hgfe = voice->params[1].send_hgfe=0;
++		} else {
++			voice->params[0].send_dcba = card->waveout.send_dcba[SEND_LEFT];
++			voice->params[0].send_hgfe = card->waveout.send_hgfe[SEND_LEFT];
++			voice->params[1].send_dcba = card->waveout.send_dcba[SEND_RIGHT];
++			voice->params[1].send_hgfe = card->waveout.send_hgfe[SEND_RIGHT];
++
++			if (woinst->device) {
++				// /dev/dps1
++				voice->params[0].send_routing  = voice->params[1].send_routing  = card->waveout.send_routing[ROUTE_PCM1];
++				voice->params[0].send_routing2 = voice->params[1].send_routing2 = card->waveout.send_routing2[ROUTE_PCM1];
++			} else {
++				voice->params[0].send_routing  = voice->params[1].send_routing  = card->waveout.send_routing[ROUTE_PCM];
++				voice->params[0].send_routing2 = voice->params[1].send_routing2 = card->waveout.send_routing2[ROUTE_PCM];
++			}
++		}
++		
+ 		voice->params[1].volume_target = 0xffff;
+ 		voice->params[1].initial_fc = 0xff;
+ 		voice->params[1].initial_attn = 0x00;
+@@ -183,30 +198,28 @@ static int get_voice(struct emu10k1_card
+ 		voice->params[1].byampl_env_decay = 0x7f;
+ 	} else {
+ 		if (woinst->num_voices > 1) {
+-			voice->params[0].send_a = 0xff;
+-			voice->params[0].send_b = 0;
+-			voice->params[0].send_c = 0;
+-			voice->params[0].send_d = 0;
+-
+-			voice->params[0].send_routing =
+-			 0xfff0 + card->mchannel_fx + voicenum;
++			// Multichannel pcm
++			voice->params[0].send_dcba=0xff;
++			voice->params[0].send_hgfe=0;
++			if (card->is_audigy) {
++				voice->params[0].send_routing = 0x3f3f3f00 + card->mchannel_fx + voicenum;
++				voice->params[0].send_routing2 = 0x3f3f3f3f;
++			} else {
++				voice->params[0].send_routing = 0xfff0 + card->mchannel_fx + voicenum;
++			}
++			
+ 		} else {
+-			voice->params[0].send_a = card->waveout.send_a[0];
+-			voice->params[0].send_b = card->waveout.send_b[0];
+-			voice->params[0].send_c = card->waveout.send_c[0];
+-			voice->params[0].send_d = card->waveout.send_d[0];
+-
+-			if (woinst->device)
+-				voice->params[0].send_routing = 0x7654;
+-			else
+-				voice->params[0].send_routing = card->waveout.send_routing[0];
+-		}	
+-
+-		voice->params[0].volume_target = 0xffff;
+-		voice->params[0].initial_fc = 0xff;
+-		voice->params[0].initial_attn = 0x00;
+-		voice->params[0].byampl_env_sustain = 0x7f;
+-		voice->params[0].byampl_env_decay = 0x7f;
++			voice->params[0].send_dcba = card->waveout.send_dcba[SEND_MONO];
++			voice->params[0].send_hgfe = card->waveout.send_hgfe[SEND_MONO];
++
++			if (woinst->device) {
++				voice->params[0].send_routing = card->waveout.send_routing[ROUTE_PCM1];
++				voice->params[0].send_routing2 = card->waveout.send_routing2[ROUTE_PCM1];
++			} else {
++				voice->params[0].send_routing = card->waveout.send_routing[ROUTE_PCM];
++				voice->params[0].send_routing2 = card->waveout.send_routing2[ROUTE_PCM];
++			}
++		}
+ 	}
+ 
+ 	DPD(2, "voice: startloop=%#x, endloop=%#x\n", voice->startloop, voice->endloop);
+@@ -280,9 +293,16 @@ void emu10k1_waveout_start(struct emu10k
+ {
+ 	struct emu10k1_card *card = wave_dev->card;
+ 	struct woinst *woinst = wave_dev->woinst;
++	struct pt_data *pt = &card->pt;
+ 
+ 	DPF(2, "emu10k1_waveout_start()\n");
+ 
++	if (woinst->format.passthrough == 2) {
++		emu10k1_pt_setup(wave_dev);
++		sblive_writeptr(card, (card->is_audigy ? A_GPR_BASE : GPR_BASE) + pt->enable_gpr, 0, 1);
++		pt->state = PT_STATE_PLAYING;
++	}
++
+ 	/* Actual start */
+ 	emu10k1_voices_start(woinst->voice, woinst->num_voices, woinst->total_played);
+ 
+--- linux-2.6.0-test1/sound/oss/emu10k1/efxmgr.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/emu10k1/efxmgr.c	2003-07-19 17:03:51.000000000 -0700
+@@ -80,15 +80,20 @@ void emu10k1_set_control_gpr(struct emu1
+ 	if (addr < 0 || addr >= NUM_GPRS)
+ 		return;
+ 
+-	if (flag)
+-		val += sblive_readptr(card, GPR_BASE + addr, 0);
+-
+-	if (val > mgr->gpr[addr].max)
+-		val = mgr->gpr[addr].max;
+-	else if (val < mgr->gpr[addr].min)
+-		val = mgr->gpr[addr].min;
+-
+-	sblive_writeptr(card, GPR_BASE + addr, 0, val);
++	//fixme: once patch manager is up, remember to fix this for the audigy
++	if (card->is_audigy) {
++		sblive_writeptr(card, A_GPR_BASE + addr, 0, val);
++	} else {
++		if (flag)
++			val += sblive_readptr(card, GPR_BASE + addr, 0);
++		if (val > mgr->gpr[addr].max)
++			val = mgr->gpr[addr].max;
++		else if (val < mgr->gpr[addr].min)
++			val = mgr->gpr[addr].min;
++		sblive_writeptr(card, GPR_BASE + addr, 0, val);
++	}
++	
++	
+ }
+ 
+ //TODO: make this configurable:
+--- linux-2.6.0-test1/sound/oss/emu10k1/efxmgr.h	2003-06-14 12:18:35.000000000 -0700
++++ 25/sound/oss/emu10k1/efxmgr.h	2003-07-19 17:03:51.000000000 -0700
+@@ -32,16 +32,30 @@
+ #ifndef _EFXMGR_H
+ #define _EFXMGR_H
+ 
+-#define WRITE_EFX(a, b, c) sblive_writeptr((a), MICROCODEBASE + (b), 0, (c))
++struct emu_efx_info_t{
++	int opcode_shift;
++	int high_operand_shift;
++	int instruction_start;
++	int gpr_base;
++	int output_base;
++};
++
++
++#define WRITE_EFX(a, b, c) sblive_writeptr((a), emu_efx_info[card->is_audigy].instruction_start + (b), 0, (c))
+ 
+ #define OP(op, z, w, x, y) \
+-	do { WRITE_EFX(card, (pc) * 2, ((x) << 10) | (y)); \
+-	WRITE_EFX(card, (pc) * 2 + 1, ((op) << 20) | ((z) << 10) | (w)); \
++	do { WRITE_EFX(card, (pc) * 2, ((x) << emu_efx_info[card->is_audigy].high_operand_shift) | (y)); \
++	WRITE_EFX(card, (pc) * 2 + 1, ((op) << emu_efx_info[card->is_audigy].opcode_shift ) | ((z) << emu_efx_info[card->is_audigy].high_operand_shift) | (w)); \
+ 	++pc; } while (0)
+ 
+ #define NUM_INPUTS 0x20
+ #define NUM_OUTPUTS 0x20
+ #define NUM_GPRS 0x100
++
++#define A_NUM_INPUTS 0x60
++#define A_NUM_OUTPUTS 0x60  //fixme: this may or may not be true
++#define A_NUM_GPRS 0x200
++
+ #define GPR_NAME_SIZE   32
+ #define PATCH_NAME_SIZE 32
+ 
+@@ -98,6 +112,9 @@ enum {
+ #define GPR_BASE 0x100
+ #define OUTPUT_BASE 0x20
+ 
++#define A_GPR_BASE 0x400
++#define A_OUTPUT_BASE 0x60
++
+ #define MAX_PATCHES_PAGES 32
+ 
+ struct patch_manager {
+--- linux-2.6.0-test1/sound/oss/emu10k1/hwaccess.c	2003-06-14 12:18:06.000000000 -0700
++++ 25/sound/oss/emu10k1/hwaccess.c	2003-07-19 17:03:51.000000000 -0700
+@@ -160,6 +160,24 @@ void emu10k1_writefn0(struct emu10k1_car
+ 	return;
+ }
+ 
++void emu10k1_writefn0_2(struct emu10k1_card *card, u32 reg, u32 data, int size)
++{
++	unsigned long flags;
++
++	spin_lock_irqsave(&card->lock, flags);
++
++	if (size == 32)
++		outl(data, card->iobase + (reg & 0x1F));
++	else if (size == 16)
++		outw(data, card->iobase + (reg & 0x1F));
++	else
++		outb(data, card->iobase + (reg & 0x1F));
++
++	spin_unlock_irqrestore(&card->lock, flags);
++
++	return;
++}
++
+ u32 emu10k1_readfn0(struct emu10k1_card * card, u32 reg)
+ {
+ 	u32 val;
+@@ -200,12 +218,13 @@ void emu10k1_timer_set(struct emu10k1_ca
+ * write/read Emu10k1 pointer-offset register set, accessed through      *
+ *  the PTR and DATA registers                                           *
+ *************************************************************************/
++#define A_PTR_ADDRESS_MASK 0x0fff0000
+ void sblive_writeptr(struct emu10k1_card *card, u32 reg, u32 channel, u32 data)
+ {
+ 	u32 regptr;
+ 	unsigned long flags;
+ 
+-	regptr = ((reg << 16) & PTR_ADDRESS_MASK) | (channel & PTR_CHANNELNUM_MASK);
++	regptr = ((reg << 16) & A_PTR_ADDRESS_MASK) | (channel & PTR_CHANNELNUM_MASK);
+ 
+ 	if (reg & 0xff000000) {
+ 		u32 mask;
+@@ -242,7 +261,7 @@ void sblive_writeptr_tag(struct emu10k1_
+ 	spin_lock_irqsave(&card->lock, flags);
+ 	while ((reg = va_arg(args, u32)) != TAGLIST_END) {
+ 		u32 data = va_arg(args, u32);
+-		u32 regptr = (((reg << 16) & PTR_ADDRESS_MASK)
++		u32 regptr = (((reg << 16) & A_PTR_ADDRESS_MASK)
+ 			      | (channel & PTR_CHANNELNUM_MASK));
+ 		outl(regptr, card->iobase + PTR);
+ 		if (reg & 0xff000000) {
+@@ -267,7 +286,7 @@ u32 sblive_readptr(struct emu10k1_card *
+ 	u32 regptr, val;
+ 	unsigned long flags;
+ 
+-	regptr = ((reg << 16) & PTR_ADDRESS_MASK) | (channel & PTR_CHANNELNUM_MASK);
++	regptr = ((reg << 16) & A_PTR_ADDRESS_MASK) | (channel & PTR_CHANNELNUM_MASK);
+ 
+ 	if (reg & 0xff000000) {
+ 		u32 mask;
+@@ -389,7 +408,7 @@ void emu10k1_ac97_write(struct ac97_code
+ 
+ 	outb(reg, card->iobase + AC97ADDRESS);
+ 	outw(value, card->iobase + AC97DATA);
+-
++	outb( AC97_EXTENDED_ID, card->iobase + AC97ADDRESS); 
+ 	spin_unlock_irqrestore(&card->lock, flags);
+ }
+ 
+@@ -402,15 +421,23 @@ int emu10k1_mpu_write_data(struct emu10k
+ 	unsigned long flags;
+ 	int ret;
+ 
+-	spin_lock_irqsave(&card->lock, flags);
++	if (card->is_audigy) {
++		if ((sblive_readptr(card, A_MUSTAT,0) & MUSTAT_ORDYN) == 0) {
++			sblive_writeptr(card, A_MUDATA, 0, data);
++			ret = 0;
++		} else
++			ret = -1;
++	} else {
++		spin_lock_irqsave(&card->lock, flags);
+ 
+-	if ((inb(card->iobase + MUSTAT) & MUSTAT_ORDYN) == 0) {
+-		outb(data, card->iobase + MUDATA);
+-		ret = 0;
+-	} else
+-		ret = -1;
++		if ((inb(card->iobase + MUSTAT) & MUSTAT_ORDYN) == 0) {
++			outb(data, card->iobase + MUDATA);
++			ret = 0;
++		} else
++			ret = -1;
+ 
+-	spin_unlock_irqrestore(&card->lock, flags);
++		spin_unlock_irqrestore(&card->lock, flags);
++	}
+ 
+ 	return ret;
+ }
+@@ -420,15 +447,23 @@ int emu10k1_mpu_read_data(struct emu10k1
+ 	unsigned long flags;
+ 	int ret;
+ 
+-	spin_lock_irqsave(&card->lock, flags);
++	if (card->is_audigy) {
++		if ((sblive_readptr(card, A_MUSTAT,0) & MUSTAT_IRDYN) == 0) {
++			*data = sblive_readptr(card, A_MUDATA,0);
++			ret = 0;
++		} else
++			ret = -1;
++	} else {
++		spin_lock_irqsave(&card->lock, flags);
+ 
+-	if ((inb(card->iobase + MUSTAT) & MUSTAT_IRDYN) == 0) {
+-		*data = inb(card->iobase + MUDATA);
+-		ret = 0;
+-	} else
+-		ret = -1;
++		if ((inb(card->iobase + MUSTAT) & MUSTAT_IRDYN) == 0) {
++			*data = inb(card->iobase + MUDATA);
++			ret = 0;
++		} else
++			ret = -1;
+ 
+-	spin_unlock_irqrestore(&card->lock, flags);
++		spin_unlock_irqrestore(&card->lock, flags);
++	}
+ 
+ 	return ret;
+ }
+@@ -439,37 +474,54 @@ int emu10k1_mpu_reset(struct emu10k1_car
+ 	unsigned long flags;
+ 
+ 	DPF(2, "emu10k1_mpu_reset()\n");
++	if (card->is_audigy) {
++		if (card->mpuacqcount == 0) {
++			sblive_writeptr(card, A_MUCMD, 0, MUCMD_RESET);
++			sblive_wcwait(card, 8);
++			sblive_writeptr(card, A_MUCMD, 0, MUCMD_RESET);
++			sblive_wcwait(card, 8);
++			sblive_writeptr(card, A_MUCMD, 0, MUCMD_ENTERUARTMODE);
++			sblive_wcwait(card, 8);
++			status = sblive_readptr(card, A_MUDATA, 0);
++			if (status == 0xfe)
++				return 0;
++			else
++				return -1;
++		}
+ 
+-	if (card->mpuacqcount == 0) {
+-		spin_lock_irqsave(&card->lock, flags);
+-		outb(MUCMD_RESET, card->iobase + MUCMD);
+-		spin_unlock_irqrestore(&card->lock, flags);
++		return 0;
++	} else {
++		if (card->mpuacqcount == 0) {
++			spin_lock_irqsave(&card->lock, flags);
++			outb(MUCMD_RESET, card->iobase + MUCMD);
++			spin_unlock_irqrestore(&card->lock, flags);
+ 
+-		sblive_wcwait(card, 8);
++			sblive_wcwait(card, 8);
+ 
+-		spin_lock_irqsave(&card->lock, flags);
+-		outb(MUCMD_RESET, card->iobase + MUCMD);
+-		spin_unlock_irqrestore(&card->lock, flags);
++			spin_lock_irqsave(&card->lock, flags);
++			outb(MUCMD_RESET, card->iobase + MUCMD);
++			spin_unlock_irqrestore(&card->lock, flags);
+ 
+-		sblive_wcwait(card, 8);
++			sblive_wcwait(card, 8);
+ 
+-		spin_lock_irqsave(&card->lock, flags);
+-		outb(MUCMD_ENTERUARTMODE, card->iobase + MUCMD);
+-		spin_unlock_irqrestore(&card->lock, flags);
++			spin_lock_irqsave(&card->lock, flags);
++			outb(MUCMD_ENTERUARTMODE, card->iobase + MUCMD);
++			spin_unlock_irqrestore(&card->lock, flags);
+ 
+-		sblive_wcwait(card, 8);
++			sblive_wcwait(card, 8);
+ 
+-		spin_lock_irqsave(&card->lock, flags);
+-		status = inb(card->iobase + MUDATA);
+-		spin_unlock_irqrestore(&card->lock, flags);
++			spin_lock_irqsave(&card->lock, flags);
++			status = inb(card->iobase + MUDATA);
++			spin_unlock_irqrestore(&card->lock, flags);
+ 
+-		if (status == 0xfe)
+-			return 0;
+-		else
+-			return -1;
+-	}
++			if (status == 0xfe)
++				return 0;
++			else
++				return -1;
++		}
+ 
+-	return 0;
++		return 0;
++	}
+ }
+ 
+ int emu10k1_mpu_acquire(struct emu10k1_card *card)
+--- linux-2.6.0-test1/sound/oss/emu10k1/hwaccess.h	2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/emu10k1/hwaccess.h	2003-07-19 17:03:51.000000000 -0700
+@@ -79,13 +79,21 @@ struct memhandle
+ 
+ struct emu10k1_waveout
+ {
+-	u16 send_routing[3];
+-
+-	u8 send_a[3];
+-	u8 send_b[3];
+-	u8 send_c[3];
+-	u8 send_d[3];
++	u32 send_routing[3];
++	// audigy only:
++	u32 send_routing2[3];
++
++	u32 send_dcba[3];
++	// audigy only:
++	u32 send_hgfe[3];
+ };
++#define ROUTE_PCM 0
++#define ROUTE_PT 1
++#define ROUTE_PCM1 2
++
++#define SEND_MONO 0
++#define SEND_LEFT 1
++#define SEND_RIGHT 2
+ 
+ struct emu10k1_wavein
+ {
+@@ -129,7 +137,7 @@ struct mixer_private_ioctl {
+ #define CMD_AC97_BOOST		_IOW('D', 20, struct mixer_private_ioctl)
+ 
+ //up this number when breaking compatibility
+-#define PRIVATE3_VERSION 1
++#define PRIVATE3_VERSION 2
+ 
+ struct emu10k1_card 
+ {
+@@ -181,7 +189,7 @@ struct emu10k1_card 
+ 	u32	    has_toslink;	       // TOSLink detection
+ 
+ 	u8 chiprev;                    /* Chip revision                */
+-
++	u8 is_audigy;
+ 	u8 is_aps;
+ 
+ 	struct patch_manager mgr;
+@@ -211,6 +219,7 @@ extern struct list_head emu10k1_devs;
+ /* Hardware Abstraction Layer access functions */
+ 
+ void emu10k1_writefn0(struct emu10k1_card *, u32, u32);
++void emu10k1_writefn0_2(struct emu10k1_card *, u32, u32, int);
+ u32 emu10k1_readfn0(struct emu10k1_card *, u32);
+ 
+ void emu10k1_timer_set(struct emu10k1_card *, u16);
+--- linux-2.6.0-test1/sound/oss/emu10k1/irqmgr.h	2003-06-14 12:18:03.000000000 -0700
++++ 25/sound/oss/emu10k1/irqmgr.h	2003-07-19 17:03:51.000000000 -0700
+@@ -33,15 +33,15 @@
+ #define _IRQ_H
+ 
+ /* EMU Irq Types */
+-#define IRQTYPE_PCIBUSERROR         IPR_PCIERROR
+-#define IRQTYPE_MIXERBUTTON         (IPR_VOLINCR | IPR_VOLDECR | IPR_MUTE)
+-#define IRQTYPE_VOICE               (IPR_CHANNELLOOP | IPR_CHANNELNUMBERMASK)
+-#define IRQTYPE_RECORD              (IPR_ADCBUFFULL | IPR_ADCBUFHALFFULL | IPR_MICBUFFULL | IPR_MICBUFHALFFULL | IPR_EFXBUFFULL | IPR_EFXBUFHALFFULL)
+-#define IRQTYPE_MPUOUT              IPR_MIDITRANSBUFEMPTY
+-#define IRQTYPE_MPUIN               IPR_MIDIRECVBUFEMPTY
+-#define IRQTYPE_TIMER               IPR_INTERVALTIMER
+-#define IRQTYPE_SPDIF               (IPR_GPSPDIFSTATUSCHANGE | IPR_CDROMSTATUSCHANGE)
+-#define IRQTYPE_DSP                 IPR_FXDSP
++#define IRQTYPE_PCIBUSERROR	IPR_PCIERROR
++#define IRQTYPE_MIXERBUTTON	(IPR_VOLINCR | IPR_VOLDECR | IPR_MUTE)
++#define IRQTYPE_VOICE		(IPR_CHANNELLOOP | IPR_CHANNELNUMBERMASK)
++#define IRQTYPE_RECORD		(IPR_ADCBUFFULL | IPR_ADCBUFHALFFULL | IPR_MICBUFFULL | IPR_MICBUFHALFFULL | IPR_EFXBUFFULL | IPR_EFXBUFHALFFULL)
++#define IRQTYPE_MPUOUT		(IPR_MIDITRANSBUFEMPTY | A_IPR_MIDITRANSBUFEMPTY2) 
++#define IRQTYPE_MPUIN		(IPR_MIDIRECVBUFEMPTY | A_IPR_MIDIRECVBUFEMPTY2)
++#define IRQTYPE_TIMER		IPR_INTERVALTIMER
++#define IRQTYPE_SPDIF		(IPR_GPSPDIFSTATUSCHANGE | IPR_CDROMSTATUSCHANGE)
++#define IRQTYPE_DSP		IPR_FXDSP
+ 
+ void emu10k1_timer_irqhandler(struct emu10k1_card *);
+ void emu10k1_dsp_irqhandler(struct emu10k1_card *);
+--- linux-2.6.0-test1/sound/oss/emu10k1/main.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/emu10k1/main.c	2003-07-19 17:03:51.000000000 -0700
+@@ -78,10 +78,11 @@
+  *          Cleaned up poll() functions (audio and midi). Don't start input.
+  *	    Restrict DMA pages used to 512Mib range.
+  *	    New AC97_BOOST mixer ioctl.
+- *     0.19 Real fix for kernel with highmem support (cast dma_handle to u32).
++ *    0.19a Added Support for Audigy Cards
++ *	    Real fix for kernel with highmem support (cast dma_handle to u32).
+  *	    Fix recording buffering parameters calculation.
+  *	    Use unsigned long for variables in bit ops.
+- *     0.20 Fixed recording startup
++ *    0.20a Fixed recording startup
+  *	    Fixed timer rate setting (it's a 16-bit register)
+  *********************************************************************/
+ 
+@@ -114,7 +115,6 @@
+ #define SNDCARD_EMU10K1 46
+ #endif
+  
+-#define DRIVER_VERSION "0.20"
+ 
+ /* the emu10k1 _seems_ to only supports 29 bit (512MiB) bit bus master */
+ #define EMU10K1_DMA_MASK                0x1fffffff	/* DMA buffer mask for pci_alloc_consist */
+@@ -126,20 +126,27 @@
+ #ifndef PCI_DEVICE_ID_CREATIVE_EMU10K1
+ #define PCI_DEVICE_ID_CREATIVE_EMU10K1 0x0002
+ #endif
++#ifndef PCI_DEVICE_ID_CREATIVE_AUDIGY
++#define PCI_DEVICE_ID_CREATIVE_AUDIGY 0x0004
++#endif
+ 
+ #define EMU_APS_SUBID	0x40011102
+  
+ enum {
+ 	EMU10K1 = 0,
++	AUDIGY,
+ };
+ 
+ static char *card_names[] __devinitdata = {
+ 	"EMU10K1",
++	"Audigy",
+ };
+ 
+ static struct pci_device_id emu10k1_pci_tbl[] = {
+ 	{PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_EMU10K1,
+ 	 PCI_ANY_ID, PCI_ANY_ID, 0, 0, EMU10K1},
++	{PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_AUDIGY,
++	 PCI_ANY_ID, PCI_ANY_ID, 0, 0, AUDIGY},
+ 	{0,}
+ };
+ 
+@@ -161,6 +168,67 @@ extern irqreturn_t emu10k1_interrupt(int
+ 
+ static int __devinit emu10k1_audio_init(struct emu10k1_card *card)
+ {
++	/* Assign default playback voice parameters */
++	if (card->is_audigy)
++		card->mchannel_fx = 0;
++	else
++		card->mchannel_fx = 8;
++
++
++	if (card->is_audigy) {
++		/* mono voice */
++		card->waveout.send_dcba[SEND_MONO] = 0xffffffff;
++		card->waveout.send_hgfe[SEND_MONO] = 0x0000ffff;
++	
++		/* stereo voice */
++		/* left */
++		card->waveout.send_dcba[SEND_LEFT] = 0x00ff00ff;
++		card->waveout.send_hgfe[SEND_LEFT] = 0x00007f7f;	
++		/* right */
++		card->waveout.send_dcba[SEND_RIGHT] = 0xff00ff00;
++		card->waveout.send_hgfe[SEND_RIGHT] = 0x00007f7f;
++
++		card->waveout.send_routing[ROUTE_PCM] = 0x03020100; // Regular pcm
++		card->waveout.send_routing2[ROUTE_PCM] = 0x07060504;
++
++		card->waveout.send_routing[ROUTE_PT] = 0x3f3f3d3c; // Passthrough
++		card->waveout.send_routing2[ROUTE_PT] = 0x3f3f3f3f;
++		
++		card->waveout.send_routing[ROUTE_PCM1] = 0x03020100; // Spare
++		card->waveout.send_routing2[ROUTE_PCM1] = 0x07060404;
++		
++	} else {
++		/* mono voice */
++		card->waveout.send_dcba[SEND_MONO] = 0x0000ffff;
++	
++		/* stereo voice */
++		/* left */
++		card->waveout.send_dcba[SEND_LEFT] = 0x000000ff;
++		/* right */
++		card->waveout.send_dcba[SEND_RIGHT] = 0x0000ff00;
++
++		card->waveout.send_routing[ROUTE_PCM] = 0x3210; // pcm
++		card->waveout.send_routing[ROUTE_PT] = 0x3210; // passthrough
++		card->waveout.send_routing[ROUTE_PCM1] = 0x7654; // /dev/dsp1
++	}
++
++	/* Assign default recording parameters */
++	/* FIXME */
++	if (card->is_aps)
++		card->wavein.recsrc = WAVERECORD_FX;
++	else
++		card->wavein.recsrc = WAVERECORD_AC97;
++
++	card->wavein.fxwc = 0x0003;
++	return 0;
++}
++
++static void emu10k1_audio_cleanup(struct emu10k1_card *card)
++{
++}
++
++static int __devinit emu10k1_register_devices(struct emu10k1_card *card)
++{
+ 	card->audio_dev = register_sound_dsp(&emu10k1_audio_fops, -1);
+ 	if (card->audio_dev < 0) {
+ 		printk(KERN_ERR "emu10k1: cannot register first audio device!\n");
+@@ -173,56 +241,167 @@ static int __devinit emu10k1_audio_init(
+ 		goto err_dev1;
+ 	}
+ 
+-	/* Assign default playback voice parameters */
+-	card->mchannel_fx = 8;
+-	/* mono voice */
+-	card->waveout.send_a[0] = 0xff;
+-	card->waveout.send_b[0] = 0xff;
+-	card->waveout.send_c[0] = 0x00;
+-	card->waveout.send_d[0] = 0x00;
+-	card->waveout.send_routing[0] = 0x3210;
+-
+-	/* stereo voice */
+-	/* left */
+-	card->waveout.send_a[1] = 0xff;
+-	card->waveout.send_b[1] = 0x00;
+-	card->waveout.send_c[1] = 0x00;
+-	card->waveout.send_d[1] = 0x00;
+-	card->waveout.send_routing[1] = 0x3210;
+-
+-	/* right */
+-	card->waveout.send_a[2] = 0x00;
+-	card->waveout.send_b[2] = 0xff;
+-	card->waveout.send_c[2] = 0x00;
+-	card->waveout.send_d[2] = 0x00;
+-	card->waveout.send_routing[2] = 0x3210;
++	card->ac97->dev_mixer = register_sound_mixer(&emu10k1_mixer_fops, -1);
++	if (card->ac97->dev_mixer < 0) {
++		printk(KERN_ERR "emu10k1: cannot register mixer device\n");
++		goto err_mixer;
++        }
+ 
+-	/* Assign default recording parameters */
+-	/* FIXME */
+-	if (card->is_aps)
+-		card->wavein.recsrc = WAVERECORD_FX;
+-	else
+-		card->wavein.recsrc = WAVERECORD_AC97;
++	card->midi_dev = register_sound_midi(&emu10k1_midi_fops, -1);
++	if (card->midi_dev < 0) {
++                printk(KERN_ERR "emu10k1: cannot register midi device!\n");
++		goto err_midi;
++        }
+ 
+-	card->wavein.fxwc = 0x0003;
++#ifdef EMU10K1_SEQUENCER
++	card->seq_dev = sound_alloc_mididev();
++	if (card->seq_dev == -1)
++		printk(KERN_WARNING "emu10k1: unable to register sequencer device!");
++	else {
++		std_midi_synth.midi_dev = card->seq_dev;
++		midi_devs[card->seq_dev] = 
++			(struct midi_operations *)
++			kmalloc(sizeof(struct midi_operations), GFP_KERNEL);
++
++		if (midi_devs[card->seq_dev] == NULL) {
++			printk(KERN_ERR "emu10k1: unable to allocate memory!");
++			sound_unload_mididev(card->seq_dev);
++			card->seq_dev = -1;
++			/* return without error */
++		} else {
++			memcpy((char *)midi_devs[card->seq_dev], 
++				(char *)&emu10k1_midi_operations, 
++				sizeof(struct midi_operations));
++			midi_devs[card->seq_dev]->devc = card;
++			sequencer_init();
++			card->seq_mididev = NULL;
++		}
++	}
++#endif
+ 	return 0;
+ 
++err_midi:
++	unregister_sound_mixer(card->ac97->dev_mixer);
++err_mixer:
++	unregister_sound_dsp(card->audio_dev);
+ err_dev1:
+ 	unregister_sound_dsp(card->audio_dev);
+ err_dev:
+ 	return -ENODEV;
+ }
+ 
+-static void __devinit emu10k1_audio_cleanup(struct emu10k1_card *card)
++static void emu10k1_unregister_devices(struct emu10k1_card *card)
+ {
++#ifdef EMU10K1_SEQUENCER
++	if (card->seq_dev > -1) {
++		kfree(midi_devs[card->seq_dev]);
++		midi_devs[card->seq_dev] = NULL;
++		sound_unload_mididev(card->seq_dev);
++		card->seq_dev = -1;
++	}
++#endif
++
++	unregister_sound_midi(card->midi_dev);
++	unregister_sound_mixer(card->ac97->dev_mixer);
+ 	unregister_sound_dsp(card->audio_dev1);
+ 	unregister_sound_dsp(card->audio_dev);
+ }
+ 
+-static int __devinit emu10k1_mixer_init(struct emu10k1_card *card)
++int emu10k1_info_proc (char *page, char **start, off_t off,
++		    int count, int *eof, void *data)
++{
++	struct emu10k1_card *card = data;
++	int len = 0;
++	
++	if (card == NULL)
++		return -ENODEV;
++
++	len += sprintf (page + len, "Driver Version : %s\n", DRIVER_VERSION);
++	len += sprintf (page + len, "Card type      : %s\n", card->is_aps ? "Aps" : (card->is_audigy ? "Audigy" : "Emu10k1"));
++	len += sprintf (page + len, "Revision       : %d\n", card->chiprev);
++	len += sprintf (page + len, "Model          : %#06x\n", card->model);
++	len += sprintf (page + len, "IO             : %#06lx-%#06lx\n", card->iobase, card->iobase + card->length - 1);
++	len += sprintf (page + len, "IRQ            : %d\n\n", card->irq);
++	
++	len += sprintf (page + len, "Registered /dev Entries:\n");
++	len += sprintf (page + len, "/dev/dsp%d\n", card->audio_dev / 16);
++	len += sprintf (page + len, "/dev/dsp%d\n", card->audio_dev1 / 16);
++	len += sprintf (page + len, "/dev/mixer%d\n", card->ac97->dev_mixer / 16);
++	len += sprintf (page + len, "/dev/midi%d\n", card->midi_dev / 16);
++
++#ifdef EMU10K1_SEQUENCER
++	len += sprintf (page + len, "/dev/sequencer\n");
++#endif
++
++	return len;
++}
++
++static int __devinit emu10k1_proc_init(struct emu10k1_card *card)
++{
++	char s[48];
++
++	if (!proc_mkdir ("driver/emu10k1", 0)) {
++		printk(KERN_ERR "emu10k1: unable to create proc directory driver/emu10k1\n");
++		goto err_out;
++	}
++
++	sprintf(s, "driver/emu10k1/%s", card->pci_dev->slot_name);
++	if (!proc_mkdir (s, 0)) {
++		printk(KERN_ERR "emu10k1: unable to create proc directory %s\n", s);
++		goto err_emu10k1_proc;
++	}
++
++	sprintf(s, "driver/emu10k1/%s/info", card->pci_dev->slot_name);
++	if (!create_proc_read_entry (s, 0, 0, emu10k1_info_proc, card)) {
++		printk(KERN_ERR "emu10k1: unable to create proc entry %s\n", s);
++		goto err_dev_proc;
++	}
++
++	if (!card->is_aps) {
++		sprintf(s, "driver/emu10k1/%s/ac97", card->pci_dev->slot_name);
++		if (!create_proc_read_entry (s, 0, 0, ac97_read_proc, card->ac97)) {
++			printk(KERN_ERR "emu10k1: unable to create proc entry %s\n", s);
++			goto err_proc_ac97;
++		}
++	}
++
++	return 0;
++
++err_proc_ac97:
++	sprintf(s, "driver/emu10k1/%s/info", card->pci_dev->slot_name);
++	remove_proc_entry(s, NULL);
++
++err_dev_proc:
++	sprintf(s, "driver/emu10k1/%s", card->pci_dev->slot_name);
++	remove_proc_entry(s, NULL);
++
++err_emu10k1_proc:
++	remove_proc_entry("driver/emu10k1", NULL);
++
++err_out:
++	return -EIO;
++}
++
++static void emu10k1_proc_cleanup(struct emu10k1_card *card)
+ {
+-	char s[32];
++	char s[48];
+ 
++	if (!card->is_aps) {
++		sprintf(s, "driver/emu10k1/%s/ac97", card->pci_dev->slot_name);
++		remove_proc_entry(s, NULL);
++	}
++
++	sprintf(s, "driver/emu10k1/%s/info", card->pci_dev->slot_name);
++	remove_proc_entry(s, NULL);
++
++	sprintf(s, "driver/emu10k1/%s", card->pci_dev->slot_name);
++	remove_proc_entry(s, NULL);
++		
++	remove_proc_entry("driver/emu10k1", NULL);
++}
++
++static int __devinit emu10k1_mixer_init(struct emu10k1_card *card)
++{
+ 	struct ac97_codec *codec  = ac97_alloc_codec();
+ 	
+ 	if(codec == NULL)
+@@ -231,15 +410,6 @@ static int __devinit emu10k1_mixer_init(
+ 		return -EIO;
+ 	}
+ 	card->ac97 = codec;
+-	
+-#warning "Initialisation order race. Must register after usable"
+-
+-	card->ac97->dev_mixer = register_sound_mixer(&emu10k1_mixer_fops, -1);
+-	if (card->ac97->dev_mixer < 0) {
+-		printk(KERN_ERR "emu10k1: cannot register mixer device\n");
+-		goto err_codec;
+-        }
+-
+ 	card->ac97->private_data = card;
+ 
+ 	if (!card->is_aps) {
+@@ -261,23 +431,6 @@ static int __devinit emu10k1_mixer_init(
+ 		// Force 5bit:		    
+ 		//card->ac97->bit_resolution=5;
+ 
+-		if (!proc_mkdir ("driver/emu10k1", 0)) {
+-			printk(KERN_ERR "emu10k1: unable to create proc directory driver/emu10k1\n");
+-			goto err_out;
+-		}
+-
+-		sprintf(s, "driver/emu10k1/%s", card->pci_dev->slot_name);
+-		if (!proc_mkdir (s, 0)) {
+-			printk(KERN_ERR "emu10k1: unable to create proc directory %s\n", s);
+-			goto err_emu10k1_proc;
+-		}
+-	
+-		sprintf(s, "driver/emu10k1/%s/ac97", card->pci_dev->slot_name);
+-		if (!create_proc_read_entry (s, 0, 0, ac97_read_proc, card->ac97)) {
+-			printk(KERN_ERR "emu10k1: unable to create proc entry %s\n", s);
+-			goto err_ac97_proc;
+-		}
+-
+ 		/* these will store the original values and never be modified */
+ 		card->ac97_supported_mixers = card->ac97->supported_mixers;
+ 		card->ac97_stereo_mixers = card->ac97->stereo_mixers;
+@@ -285,34 +438,13 @@ static int __devinit emu10k1_mixer_init(
+ 
+ 	return 0;
+ 
+- err_ac97_proc:
+-	sprintf(s, "driver/emu10k1/%s", card->pci_dev->slot_name);
+-	remove_proc_entry(s, NULL);
+-
+- err_emu10k1_proc:
+-	remove_proc_entry("driver/emu10k1", NULL);
+  err_out:
+-	unregister_sound_mixer (card->ac97->dev_mixer);
+- err_codec:
+  	ac97_release_codec(card->ac97);
+ 	return -EIO;
+ }
+ 
+-static void __devinit emu10k1_mixer_cleanup(struct emu10k1_card *card)
++static void emu10k1_mixer_cleanup(struct emu10k1_card *card)
+ {
+-	char s[32];
+-
+-	if (!card->is_aps) {
+-		sprintf(s, "driver/emu10k1/%s/ac97", card->pci_dev->slot_name);
+-		remove_proc_entry(s, NULL);
+-
+-		sprintf(s, "driver/emu10k1/%s", card->pci_dev->slot_name);
+-		remove_proc_entry(s, NULL);
+-
+-		remove_proc_entry("driver/emu10k1", NULL);
+-	}
+-
+-	unregister_sound_mixer (card->ac97->dev_mixer);
+ 	ac97_release_codec(card->ac97);
+ }
+ 
+@@ -320,13 +452,6 @@ static int __devinit emu10k1_midi_init(s
+ {
+ 	int ret;
+ 
+-	card->midi_dev = register_sound_midi(&emu10k1_midi_fops, -1);
+-	if (card->midi_dev < 0) {
+-                printk(KERN_ERR "emu10k1: cannot register midi device!\n");
+-		return -ENODEV;
+-        }
+-
+-
+ 	card->mpuout = kmalloc(sizeof(struct emu10k1_mpuout), GFP_KERNEL);
+ 	if (card->mpuout == NULL) {
+ 		printk(KERN_WARNING "emu10k1: Unable to allocate emu10k1_mpuout: out of memory\n");
+@@ -366,31 +491,6 @@ static int __devinit emu10k1_midi_init(s
+ 		goto err_out3;
+ 	}
+ 
+-#ifdef EMU10K1_SEQUENCER
+-	card->seq_dev = sound_alloc_mididev();
+-	if (card->seq_dev == -1)
+-			printk(KERN_WARNING "emu10k1: unable to register sequencer device!");
+-	else {
+-			std_midi_synth.midi_dev = card->seq_dev;
+-			midi_devs[card->seq_dev] = 
+-					(struct midi_operations *)
+-					kmalloc(sizeof(struct midi_operations), GFP_KERNEL);
+-			
+-			if (midi_devs[card->seq_dev] == NULL) {
+-				printk(KERN_ERR "emu10k1: unable to allocate memory!");
+-				sound_unload_mididev(card->seq_dev);
+-				card->seq_dev = -1;
+-				return 0;
+-			} else {
+-				memcpy((char *)midi_devs[card->seq_dev], 
+-					(char *)&emu10k1_midi_operations, 
+-					sizeof(struct midi_operations));
+-				midi_devs[card->seq_dev]->devc = card;
+-				sequencer_init();
+-			}
+-	}
+-	card->seq_mididev = 0;
+-#endif
+ 	return 0;
+ 
+ err_out3:
+@@ -398,28 +498,16 @@ err_out3:
+ err_out2:
+ 	kfree(card->mpuout);
+ err_out1:
+-	unregister_sound_midi(card->midi_dev);
+ 	return ret;
+ }
+ 
+-static void __devinit emu10k1_midi_cleanup(struct emu10k1_card *card)
++static void emu10k1_midi_cleanup(struct emu10k1_card *card)
+ {
+ 	tasklet_kill(&card->mpuout->tasklet);
+ 	kfree(card->mpuout);
+ 
+ 	tasklet_kill(&card->mpuin->tasklet);
+ 	kfree(card->mpuin);
+-
+-#ifdef EMU10K1_SEQUENCER
+-	if (card->seq_dev > -1) {
+-		kfree(midi_devs[card->seq_dev]);
+-		midi_devs[card->seq_dev] = NULL;
+-		sound_unload_mididev(card->seq_dev);
+-		card->seq_dev = -1;
+-	}
+-#endif
+-
+-	unregister_sound_midi(card->midi_dev);
+ }
+ 
+ static void __devinit voice_init(struct emu10k1_card *card)
+@@ -450,7 +538,7 @@ static void __devinit addxmgr_init(struc
+ 	card->emupagetable[1] = MAXPAGES - 1;
+ }
+ 
+-static void __devinit fx_cleanup(struct patch_manager *mgr)
++static void fx_cleanup(struct patch_manager *mgr)
+ {
+ 	int i;
+ 	for(i = 0; i < mgr->current_pages; i++)
+@@ -465,24 +553,25 @@ static int __devinit fx_init(struct emu1
+ 	s32 left, right;
+ 	int i;
+ 	u32 pc = 0;
+-	u32 patch_n;
++	u32 patch_n=0;
++	struct emu_efx_info_t emu_efx_info[2]=
++		{{ 20, 10, 0x400, 0x100, 0x20 },
++		 { 24, 12, 0x600, 0x400, 0x60 },
++		}; 
++			
+ 
+ 	for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
+ 		mgr->ctrl_gpr[i][0] = -1;
+ 		mgr->ctrl_gpr[i][1] = -1;
+ 	}
+ 
+-	for (i = 0; i < 512; i++)
+-		OP(6, 0x40, 0x40, 0x40, 0x40);
+-
+-	for (i = 0; i < 256; i++)
+-		sblive_writeptr_tag(card, 0,
+-				    FXGPREGBASE + i, 0,
+-				    TANKMEMADDRREGBASE + i, 0,
+-				    TAGLIST_END);
+ 
+-	/* !! The number bellow must equal the number of patches, currently 11 !! */
+-	mgr->current_pages = (11 + PATCHES_PER_PAGE - 1) / PATCHES_PER_PAGE;
++	if (card->is_audigy)
++		mgr->current_pages = (2 + PATCHES_PER_PAGE - 1) / PATCHES_PER_PAGE;
++	else
++		/* !! The number below must equal the number of patches, currently 11 !! */
++		mgr->current_pages = (11 + PATCHES_PER_PAGE - 1) / PATCHES_PER_PAGE;
++	
+ 	for (i = 0; i < mgr->current_pages; i++) {
+ 		mgr->patch[i] = (void *)__get_free_page(GFP_KERNEL);
+ 		if (mgr->patch[i] == NULL) {
+@@ -493,215 +582,298 @@ static int __devinit fx_init(struct emu1
+ 		memset(mgr->patch[i], 0, PAGE_SIZE);
+ 	}
+ 
+-	pc = 0;
+-	patch_n = 0;
+-	//first free GPR = 0x11b
+-
+-	/* FX volume correction and Volume control*/
+-	INPUT_PATCH_START(patch, "Pcm L vol", 0x0, 0);
+-	GET_OUTPUT_GPR(patch, 0x100, 0x0);
+-	GET_CONTROL_GPR(patch, 0x106, "Vol", 0, 0x7fffffff);
+-	GET_DYNAMIC_GPR(patch, 0x112);
+-
+-	OP(4, 0x112, 0x40, PCM_IN_L, 0x44); //*4
+-	OP(0, 0x100, 0x040, 0x112, 0x106);  //*vol
+-	INPUT_PATCH_END(patch);
+-
+-
+-	INPUT_PATCH_START(patch, "Pcm R vol", 0x1, 0);
+-	GET_OUTPUT_GPR(patch, 0x101, 0x1);
+-	GET_CONTROL_GPR(patch, 0x107, "Vol", 0, 0x7fffffff);
+-	GET_DYNAMIC_GPR(patch, 0x112);
+-
+-	OP(4, 0x112, 0x40, PCM_IN_R, 0x44); 
+-	OP(0, 0x101, 0x040, 0x112, 0x107);
+-
+-	INPUT_PATCH_END(patch);
+-
+-
+-	// CD-Digital In Volume control
+-	INPUT_PATCH_START(patch, "CD-Digital Vol L", 0x12, 0);
+-	GET_OUTPUT_GPR(patch, 0x10c, 0x12);
+-	GET_CONTROL_GPR(patch, 0x10d, "Vol", 0, 0x7fffffff);
+-
+-	OP(0, 0x10c, 0x040, SPDIF_CD_L, 0x10d);
+-	INPUT_PATCH_END(patch);
+-
+-	INPUT_PATCH_START(patch, "CD-Digital Vol R", 0x13, 0);
+-	GET_OUTPUT_GPR(patch, 0x10e, 0x13);
+-	GET_CONTROL_GPR(patch, 0x10f, "Vol", 0, 0x7fffffff);
+-
+-	OP(0, 0x10e, 0x040, SPDIF_CD_R, 0x10f);
+-	INPUT_PATCH_END(patch);
+-
+-	//Volume Correction for Multi-channel Inputs
+-	INPUT_PATCH_START(patch, "Multi-Channel Gain", 0x08, 0);
+-	patch->input=patch->output=0x3F00;
+-
+-	GET_OUTPUT_GPR(patch, 0x113, MULTI_FRONT_L);
+-	GET_OUTPUT_GPR(patch, 0x114, MULTI_FRONT_R);
+-	GET_OUTPUT_GPR(patch, 0x115, MULTI_REAR_L);
+-	GET_OUTPUT_GPR(patch, 0x116, MULTI_REAR_R);
+-	GET_OUTPUT_GPR(patch, 0x117, MULTI_CENTER);
+-	GET_OUTPUT_GPR(patch, 0x118, MULTI_LFE);
+-
+-	OP(4, 0x113, 0x40, MULTI_FRONT_L, 0x44);
+-	OP(4, 0x114, 0x40, MULTI_FRONT_R, 0x44);
+-	OP(4, 0x115, 0x40, MULTI_REAR_L, 0x44);
+-	OP(4, 0x116, 0x40, MULTI_REAR_R, 0x44);
+-	OP(4, 0x117, 0x40, MULTI_CENTER, 0x44);
+-	OP(4, 0x118, 0x40, MULTI_LFE, 0x44);
+-	
+-	INPUT_PATCH_END(patch);
+-
+-
+-	//Routing patch start
+-	ROUTING_PATCH_START(rpatch, "Routing");
+-	GET_INPUT_GPR(rpatch, 0x100, 0x0);
+-	GET_INPUT_GPR(rpatch, 0x101, 0x1);
+-	GET_INPUT_GPR(rpatch, 0x10c, 0x12);
+-	GET_INPUT_GPR(rpatch, 0x10e, 0x13);
+-	GET_INPUT_GPR(rpatch, 0x113, MULTI_FRONT_L);
+-	GET_INPUT_GPR(rpatch, 0x114, MULTI_FRONT_R);
+-	GET_INPUT_GPR(rpatch, 0x115, MULTI_REAR_L);
+-	GET_INPUT_GPR(rpatch, 0x116, MULTI_REAR_R);
+-	GET_INPUT_GPR(rpatch, 0x117, MULTI_CENTER);
+-	GET_INPUT_GPR(rpatch, 0x118, MULTI_LFE);
+-
+-	GET_DYNAMIC_GPR(rpatch, 0x102);
+-	GET_DYNAMIC_GPR(rpatch, 0x103);
+-
+-	GET_OUTPUT_GPR(rpatch, 0x104, 0x8);
+-	GET_OUTPUT_GPR(rpatch, 0x105, 0x9);
+-	GET_OUTPUT_GPR(rpatch, 0x10a, 0x2);
+-	GET_OUTPUT_GPR(rpatch, 0x10b, 0x3);
+-
+-
+-	/* input buffer */
+-	OP(6, 0x102, AC97_IN_L, 0x40, 0x40);
+-	OP(6, 0x103, AC97_IN_R, 0x40, 0x40);
+-
+-
+-	/* Digital In + PCM + MULTI_FRONT-> AC97 out (front speakers)*/
+-	OP(6, AC97_FRONT_L, 0x100, 0x10c, 0x113);
+-
+-	CONNECT(MULTI_FRONT_L, AC97_FRONT_L);
+-	CONNECT(PCM_IN_L, AC97_FRONT_L);
+-	CONNECT(SPDIF_CD_L, AC97_FRONT_L);
+-
+-	OP(6, AC97_FRONT_R, 0x101, 0x10e, 0x114);
+-
+-	CONNECT(MULTI_FRONT_R, AC97_FRONT_R);
+-	CONNECT(PCM_IN_R, AC97_FRONT_R);
+-	CONNECT(SPDIF_CD_R, AC97_FRONT_R);
+-
+-	/* Digital In + PCM + AC97 In + PCM1 + MULTI_REAR --> Rear Channel */ 
+-	OP(6, 0x104, PCM1_IN_L, 0x100, 0x115);
+-	OP(6, 0x104, 0x104, 0x10c, 0x102);
+-
+-	CONNECT(MULTI_REAR_L, ANALOG_REAR_L);
+-	CONNECT(AC97_IN_L, ANALOG_REAR_L);
+-	CONNECT(PCM_IN_L, ANALOG_REAR_L);
+-	CONNECT(SPDIF_CD_L, ANALOG_REAR_L);
+-	CONNECT(PCM1_IN_L, ANALOG_REAR_L);
+-
+-	OP(6, 0x105, PCM1_IN_R, 0x101, 0x116);
+-	OP(6, 0x105, 0x105, 0x10e, 0x103);
+-
+-	CONNECT(MULTI_REAR_R, ANALOG_REAR_R);
+-	CONNECT(AC97_IN_R, ANALOG_REAR_R);
+-	CONNECT(PCM_IN_R, ANALOG_REAR_R);
+-	CONNECT(SPDIF_CD_R, ANALOG_REAR_R);
+-	CONNECT(PCM1_IN_R, ANALOG_REAR_R);
+-
+-	/* Digital In + PCM + AC97 In + MULTI_FRONT --> Digital out */
+-	OP(6, 0x10a, 0x100, 0x102, 0x10c);
+-	OP(6, 0x10a, 0x10a, 0x113, 0x40);
+-
+-	CONNECT(MULTI_FRONT_L, DIGITAL_OUT_L);
+-	CONNECT(PCM_IN_L, DIGITAL_OUT_L);
+-	CONNECT(AC97_IN_L, DIGITAL_OUT_L);
+-	CONNECT(SPDIF_CD_L, DIGITAL_OUT_L);
+-
+-	OP(6, 0x10b, 0x101, 0x103, 0x10e);
+-	OP(6, 0x10b, 0x10b, 0x114, 0x40);
+-
+-	CONNECT(MULTI_FRONT_R, DIGITAL_OUT_R);
+-	CONNECT(PCM_IN_R, DIGITAL_OUT_R);
+-	CONNECT(AC97_IN_R, DIGITAL_OUT_R);
+-	CONNECT(SPDIF_CD_R, DIGITAL_OUT_R);
+-
+-	/* AC97 In --> ADC Recording Buffer */
+-	OP(6, ADC_REC_L, 0x102, 0x40, 0x40);
+-
+-	CONNECT(AC97_IN_L, ADC_REC_L);
+-
+-	OP(6, ADC_REC_R, 0x103, 0x40, 0x40);
+-
+-	CONNECT(AC97_IN_R, ADC_REC_R);
++	if (card->is_audigy) {
++		for (i = 0; i < 1024; i++)
++			OP(0xf, 0x0c0, 0x0c0, 0x0cf, 0x0c0);
++
++		for (i = 0; i < 512 ; i++)
++			sblive_writeptr(card, A_GPR_BASE+i,0,0);
++
++		pc=0;
++
++		//Pcm input volume
++		OP(0, 0x402, 0x0c0, 0x406, 0x000);
++		OP(0, 0x403, 0x0c0, 0x407, 0x001);
++
++		//CD-Digital input Volume
++		OP(0, 0x404, 0x0c0, 0x40d, 0x42);
++		OP(0, 0x405, 0x0c0, 0x40f, 0x43);
++
++		// CD + PCM 
++		OP(6, 0x400, 0x0c0, 0x402, 0x404);
++		OP(6, 0x401, 0x0c0, 0x403, 0x405);
++		
++		// Front Output + Master Volume
++		OP(0, 0x68, 0x0c0, 0x408, 0x400);
++		OP(0, 0x69, 0x0c0, 0x409, 0x401);
++
++		// Add-in analog inputs for other speakers
++		OP(6, 0x400, 0x40, 0x400, 0xc0);
++		OP(6, 0x401, 0x41, 0x401, 0xc0);
++
++		// Digital Front + Master Volume
++		OP(0, 0x60, 0x0c0, 0x408, 0x400);
++		OP(0, 0x61, 0x0c0, 0x409, 0x401);
++
++		// Rear Output + Rear Volume
++		OP(0, 0x06e, 0x0c0, 0x419, 0x400);
++		OP(0, 0x06f, 0x0c0, 0x41a, 0x401);		
++
++		// Digital Rear Output + Rear Volume
++		OP(0, 0x066, 0x0c0, 0x419, 0x400);
++		OP(0, 0x067, 0x0c0, 0x41a, 0x401);		
++
++		// Audigy Drive, Headphone out
++		OP(6, 0x64, 0x0c0, 0x0c0, 0x400);
++		OP(6, 0x65, 0x0c0, 0x0c0, 0x401);
++
++		// ac97 Recording
++		OP(6, 0x76, 0x0c0, 0x0c0, 0x40);
++		OP(6, 0x77, 0x0c0, 0x0c0, 0x41);
++		
++		// Center = sub = Left/2 + Right/2
++		OP(0xe, 0x400, 0x401, 0xcd, 0x400);
++
++		// center/sub  Volume (master)
++		OP(0, 0x06a, 0x0c0, 0x408, 0x400);
++		OP(0, 0x06b, 0x0c0, 0x409, 0x400);
++
++		// Digital center/sub  Volume (master)
++		OP(0, 0x062, 0x0c0, 0x408, 0x400);
++		OP(0, 0x063, 0x0c0, 0x409, 0x400);
++
++		ROUTING_PATCH_START(rpatch, "Routing");
++		ROUTING_PATCH_END(rpatch);
++
++		/* delimiter patch */
++		patch = PATCH(mgr, patch_n);
++		patch->code_size = 0;
+ 
++	
++		sblive_writeptr(card, 0x53, 0, 0);
++	} else {
++		for (i = 0; i < 512 ; i++)
++			OP(6, 0x40, 0x40, 0x40, 0x40);
++
++		for (i = 0; i < 256; i++)
++			sblive_writeptr_tag(card, 0,
++					    FXGPREGBASE + i, 0,
++					    TANKMEMADDRREGBASE + i, 0,
++					    TAGLIST_END);
+ 
+-	/* fx12:Analog-Center */
+-	OP(6, ANALOG_CENTER, 0x117, 0x40, 0x40);
+-	CONNECT(MULTI_CENTER, ANALOG_CENTER);
++		
++		pc = 0;
+ 
+-	/* fx11:Analog-LFE */
+-	OP(6, ANALOG_LFE, 0x118, 0x40, 0x40);
+-	CONNECT(MULTI_LFE, ANALOG_LFE);
++		//first free GPR = 0x11b
++	
++		
++		/* FX volume correction and Volume control*/
++		INPUT_PATCH_START(patch, "Pcm L vol", 0x0, 0);
++		GET_OUTPUT_GPR(patch, 0x100, 0x0);
++		GET_CONTROL_GPR(patch, 0x106, "Vol", 0, 0x7fffffff);
++		GET_DYNAMIC_GPR(patch, 0x112);
++
++		OP(4, 0x112, 0x40, PCM_IN_L, 0x44); //*4	
++		OP(0, 0x100, 0x040, 0x112, 0x106);  //*vol	
++		INPUT_PATCH_END(patch);
++
++
++		INPUT_PATCH_START(patch, "Pcm R vol", 0x1, 0);
++		GET_OUTPUT_GPR(patch, 0x101, 0x1);
++		GET_CONTROL_GPR(patch, 0x107, "Vol", 0, 0x7fffffff);
++		GET_DYNAMIC_GPR(patch, 0x112);
++
++		OP(4, 0x112, 0x40, PCM_IN_R, 0x44); 
++		OP(0, 0x101, 0x040, 0x112, 0x107);
++
++		INPUT_PATCH_END(patch);
++
++
++		// CD-Digital In Volume control	
++		INPUT_PATCH_START(patch, "CD-Digital Vol L", 0x12, 0);
++		GET_OUTPUT_GPR(patch, 0x10c, 0x12);
++		GET_CONTROL_GPR(patch, 0x10d, "Vol", 0, 0x7fffffff);
++
++		OP(0, 0x10c, 0x040, SPDIF_CD_L, 0x10d);
++		INPUT_PATCH_END(patch);
++
++		INPUT_PATCH_START(patch, "CD-Digital Vol R", 0x13, 0);
++		GET_OUTPUT_GPR(patch, 0x10e, 0x13);
++		GET_CONTROL_GPR(patch, 0x10f, "Vol", 0, 0x7fffffff);
++
++		OP(0, 0x10e, 0x040, SPDIF_CD_R, 0x10f);
++		INPUT_PATCH_END(patch);
++
++		//Volume Correction for Multi-channel Inputs	
++		INPUT_PATCH_START(patch, "Multi-Channel Gain", 0x08, 0);
++		patch->input=patch->output=0x3F00;
++
++		GET_OUTPUT_GPR(patch, 0x113, MULTI_FRONT_L);
++		GET_OUTPUT_GPR(patch, 0x114, MULTI_FRONT_R);
++		GET_OUTPUT_GPR(patch, 0x115, MULTI_REAR_L);
++		GET_OUTPUT_GPR(patch, 0x116, MULTI_REAR_R);
++		GET_OUTPUT_GPR(patch, 0x117, MULTI_CENTER);
++		GET_OUTPUT_GPR(patch, 0x118, MULTI_LFE);
++
++		OP(4, 0x113, 0x40, MULTI_FRONT_L, 0x44);
++		OP(4, 0x114, 0x40, MULTI_FRONT_R, 0x44);
++		OP(4, 0x115, 0x40, MULTI_REAR_L, 0x44);
++		OP(4, 0x116, 0x40, MULTI_REAR_R, 0x44);
++		OP(4, 0x117, 0x40, MULTI_CENTER, 0x44);
++		OP(4, 0x118, 0x40, MULTI_LFE, 0x44);
++	
++		INPUT_PATCH_END(patch);
+ 
+-	/* fx12:Digital-Center */
+-	OP(6, DIGITAL_CENTER, 0x117, 0x40, 0x40);
+-	CONNECT(MULTI_CENTER, DIGITAL_CENTER);
+ 
+-	/* fx11:Analog-LFE */
+-	OP(6, DIGITAL_LFE, 0x118, 0x40, 0x40);
+-	CONNECT(MULTI_LFE, DIGITAL_LFE);
++		//Routing patch start	
++		ROUTING_PATCH_START(rpatch, "Routing");
++		GET_INPUT_GPR(rpatch, 0x100, 0x0);
++		GET_INPUT_GPR(rpatch, 0x101, 0x1);
++		GET_INPUT_GPR(rpatch, 0x10c, 0x12);
++		GET_INPUT_GPR(rpatch, 0x10e, 0x13);
++		GET_INPUT_GPR(rpatch, 0x113, MULTI_FRONT_L);
++		GET_INPUT_GPR(rpatch, 0x114, MULTI_FRONT_R);
++		GET_INPUT_GPR(rpatch, 0x115, MULTI_REAR_L);
++		GET_INPUT_GPR(rpatch, 0x116, MULTI_REAR_R);
++		GET_INPUT_GPR(rpatch, 0x117, MULTI_CENTER);
++		GET_INPUT_GPR(rpatch, 0x118, MULTI_LFE);
++
++		GET_DYNAMIC_GPR(rpatch, 0x102);
++		GET_DYNAMIC_GPR(rpatch, 0x103);
++
++		GET_OUTPUT_GPR(rpatch, 0x104, 0x8);
++		GET_OUTPUT_GPR(rpatch, 0x105, 0x9);
++		GET_OUTPUT_GPR(rpatch, 0x10a, 0x2);
++		GET_OUTPUT_GPR(rpatch, 0x10b, 0x3);
++		
++		
++		/* input buffer */
++		OP(6, 0x102, AC97_IN_L, 0x40, 0x40);
++		OP(6, 0x103, AC97_IN_R, 0x40, 0x40);
++
++
++		/* Digital In + PCM + MULTI_FRONT-> AC97 out (front speakers)*/
++		OP(6, AC97_FRONT_L, 0x100, 0x10c, 0x113);
++
++		CONNECT(MULTI_FRONT_L, AC97_FRONT_L);
++		CONNECT(PCM_IN_L, AC97_FRONT_L);
++		CONNECT(SPDIF_CD_L, AC97_FRONT_L);
++
++		OP(6, AC97_FRONT_R, 0x101, 0x10e, 0x114);
++
++		CONNECT(MULTI_FRONT_R, AC97_FRONT_R);
++		CONNECT(PCM_IN_R, AC97_FRONT_R);
++		CONNECT(SPDIF_CD_R, AC97_FRONT_R);
++
++		/* Digital In + PCM + AC97 In + PCM1 + MULTI_REAR --> Rear Channel */ 
++		OP(6, 0x104, PCM1_IN_L, 0x100, 0x115);
++		OP(6, 0x104, 0x104, 0x10c, 0x102);
++
++		CONNECT(MULTI_REAR_L, ANALOG_REAR_L);
++		CONNECT(AC97_IN_L, ANALOG_REAR_L);
++		CONNECT(PCM_IN_L, ANALOG_REAR_L);
++		CONNECT(SPDIF_CD_L, ANALOG_REAR_L);
++		CONNECT(PCM1_IN_L, ANALOG_REAR_L);
++
++		OP(6, 0x105, PCM1_IN_R, 0x101, 0x116);
++		OP(6, 0x105, 0x105, 0x10e, 0x103);
++
++		CONNECT(MULTI_REAR_R, ANALOG_REAR_R);
++		CONNECT(AC97_IN_R, ANALOG_REAR_R);
++		CONNECT(PCM_IN_R, ANALOG_REAR_R);
++		CONNECT(SPDIF_CD_R, ANALOG_REAR_R);
++		CONNECT(PCM1_IN_R, ANALOG_REAR_R);
++
++		/* Digital In + PCM + AC97 In + MULTI_FRONT --> Digital out */
++		OP(6, 0x10b, 0x100, 0x102, 0x10c);
++		OP(6, 0x10b, 0x10b, 0x113, 0x40);
++
++		CONNECT(MULTI_FRONT_L, DIGITAL_OUT_L);
++		CONNECT(PCM_IN_L, DIGITAL_OUT_L);
++		CONNECT(AC97_IN_L, DIGITAL_OUT_L);
++		CONNECT(SPDIF_CD_L, DIGITAL_OUT_L);
++
++		OP(6, 0x10a, 0x101, 0x103, 0x10e);
++		OP(6, 0x10b, 0x10b, 0x114, 0x40);
++
++		CONNECT(MULTI_FRONT_R, DIGITAL_OUT_R);
++		CONNECT(PCM_IN_R, DIGITAL_OUT_R);
++		CONNECT(AC97_IN_R, DIGITAL_OUT_R);
++		CONNECT(SPDIF_CD_R, DIGITAL_OUT_R);
++
++		/* AC97 In --> ADC Recording Buffer */
++		OP(6, ADC_REC_L, 0x102, 0x40, 0x40);
++
++		CONNECT(AC97_IN_L, ADC_REC_L);
++
++		OP(6, ADC_REC_R, 0x103, 0x40, 0x40);
++
++		CONNECT(AC97_IN_R, ADC_REC_R);
++
++
++		/* fx12:Analog-Center */
++		OP(6, ANALOG_CENTER, 0x117, 0x40, 0x40);
++		CONNECT(MULTI_CENTER, ANALOG_CENTER);
++
++		/* fx11:Analog-LFE */
++		OP(6, ANALOG_LFE, 0x118, 0x40, 0x40);
++		CONNECT(MULTI_LFE, ANALOG_LFE);
++
++		/* fx12:Digital-Center */
++		OP(6, DIGITAL_CENTER, 0x117, 0x40, 0x40);
++		CONNECT(MULTI_CENTER, DIGITAL_CENTER);
++		
++		/* fx11:Analog-LFE */
++		OP(6, DIGITAL_LFE, 0x118, 0x40, 0x40);
++		CONNECT(MULTI_LFE, DIGITAL_LFE);
+ 	
+-	ROUTING_PATCH_END(rpatch);
++		ROUTING_PATCH_END(rpatch);
+ 
+ 
+-	// Rear volume control
+-	OUTPUT_PATCH_START(patch, "Vol Rear L", 0x8, 0);
+-	GET_INPUT_GPR(patch, 0x104, 0x8);
+-	GET_CONTROL_GPR(patch, 0x119, "Vol", 0, 0x7fffffff);
++		// Rear volume control	
++		OUTPUT_PATCH_START(patch, "Vol Rear L", 0x8, 0);
++		GET_INPUT_GPR(patch, 0x104, 0x8);
++		GET_CONTROL_GPR(patch, 0x119, "Vol", 0, 0x7fffffff);
+ 
+-	OP(0, ANALOG_REAR_L, 0x040, 0x104, 0x119);
+-	OUTPUT_PATCH_END(patch);
++		OP(0, ANALOG_REAR_L, 0x040, 0x104, 0x119);
++		OUTPUT_PATCH_END(patch);
+ 
++		OUTPUT_PATCH_START(patch, "Vol Rear R", 0x9, 0);
++		GET_INPUT_GPR(patch, 0x105, 0x9);
++		GET_CONTROL_GPR(patch, 0x11a, "Vol", 0, 0x7fffffff);
+ 
+-	OUTPUT_PATCH_START(patch, "Vol Rear R", 0x9, 0);
+-	GET_INPUT_GPR(patch, 0x105, 0x9);
+-	GET_CONTROL_GPR(patch, 0x11a, "Vol", 0, 0x7fffffff);
++		OP(0, ANALOG_REAR_R, 0x040, 0x105, 0x11a);
++		OUTPUT_PATCH_END(patch);
+ 
+-	OP(0, ANALOG_REAR_R, 0x040, 0x105, 0x11a);
+-	OUTPUT_PATCH_END(patch);
+ 
++		//Master volume control on front-digital	
++		OUTPUT_PATCH_START(patch, "Vol Master L", 0x2, 1);
++		GET_INPUT_GPR(patch, 0x10a, 0x2);
++		GET_CONTROL_GPR(patch, 0x108, "Vol", 0, 0x7fffffff);
+ 
+-	//Master volume control on front-digital
+-	OUTPUT_PATCH_START(patch, "Vol Master L", 0x2, 1);
+-	GET_INPUT_GPR(patch, 0x10a, 0x2);
+-	GET_CONTROL_GPR(patch, 0x108, "Vol", 0, 0x7fffffff);
++		OP(0, DIGITAL_OUT_L, 0x040, 0x10a, 0x108);
++		OUTPUT_PATCH_END(patch);
+ 
+-	OP(0, DIGITAL_OUT_L, 0x040, 0x10a, 0x108);
+-	OUTPUT_PATCH_END(patch);
+ 
++		OUTPUT_PATCH_START(patch, "Vol Master R", 0x3, 1);
++		GET_INPUT_GPR(patch, 0x10b, 0x3);
++		GET_CONTROL_GPR(patch, 0x109, "Vol", 0, 0x7fffffff);
+ 
+-	OUTPUT_PATCH_START(patch, "Vol Master R", 0x3, 1);
+-	GET_INPUT_GPR(patch, 0x10b, 0x3);
+-	GET_CONTROL_GPR(patch, 0x109, "Vol", 0, 0x7fffffff);
++		OP(0, DIGITAL_OUT_R, 0x040, 0x10b, 0x109);
++		OUTPUT_PATCH_END(patch);
+ 
+-	OP(0, DIGITAL_OUT_R, 0x040, 0x10b, 0x109);
+-	OUTPUT_PATCH_END(patch);
+ 
++		/* delimiter patch */
++		patch = PATCH(mgr, patch_n);
++		patch->code_size = 0;
+ 
+-	/* delimiter patch */
+-	patch = PATCH(mgr, patch_n);
+-	patch->code_size = 0;
+-
+-	sblive_writeptr(card, DBG, 0, 0);
++	
++		sblive_writeptr(card, DBG, 0, 0);
++	}
+ 
+ 	mgr->lock = SPIN_LOCK_UNLOCKED;
+ 
++	// Set up Volume controls, try to keep this the same for both Audigy and Live
+ 
+ 	//Master volume
+ 	mgr->ctrl_gpr[SOUND_MIXER_VOLUME][0] = 8;
+@@ -749,8 +921,16 @@ static int __devinit fx_init(struct emu1
+ 	emu10k1_set_volume_gpr(card, 0xd, left, VOL_5BIT);
+ 	emu10k1_set_volume_gpr(card, 0xf, right, VOL_5BIT);
+ 
+-	//hard wire the ac97's pcm, we'll do that in dsp code instead.
+-	emu10k1_ac97_write(card->ac97, 0x18, 0x0);
++
++	//hard wire the ac97's pcm, pcm volume is done above using dsp code.
++	if (card->is_audigy)
++		//for Audigy, we mute it and use the philips 6 channel DAC instead
++		emu10k1_ac97_write(card->ac97, 0x18, 0x8000);
++	else
++		//For the Live we hardwire it to full volume
++		emu10k1_ac97_write(card->ac97, 0x18, 0x0);
++
++	//remove it from the ac97_codec's control
+ 	card->ac97_supported_mixers &= ~SOUND_MASK_PCM;
+ 	card->ac97_stereo_mixers &= ~SOUND_MASK_PCM;
+ 
+@@ -789,6 +969,13 @@ static int __devinit hw_init(struct emu1
+ 			    SOLEH, 0,
+ 			    TAGLIST_END);
+ 
++	if (card->is_audigy) {
++		sblive_writeptr_tag(card,0,
++				    0x5e,0xf00,
++				    0x5f,0x3,
++				    TAGLIST_END);
++	}
++
+ 	/* Init envelope engine */
+ 	for (nCh = 0; nCh < NUM_G; nCh++) {
+ 		sblive_writeptr_tag(card, nCh,
+@@ -824,6 +1011,21 @@ static int __devinit hw_init(struct emu1
+ 				    ENVVAL, 0,
+                                     TAGLIST_END);
+ 		sblive_writeptr(card, CPF, nCh, 0);
++		/*
++		  Audigy FXRT initialization
++		  reversed eng'd, may not be accurate.
++		 */
++		if (card->is_audigy) {
++			sblive_writeptr_tag(card,nCh,
++					    0x4c,0x0,
++					    0x4d,0x0,
++					    0x4e,0x0,
++					    0x4f,0x0,
++					    A_FXRT1, 0x3f3f3f3f,
++					    A_FXRT2, 0x3f3f3f3f,
++					    A_SENDAMOUNTS, 0,
++					    TAGLIST_END);
++		}
+ 	}
+ 	
+ 
+@@ -858,6 +1060,25 @@ static int __devinit hw_init(struct emu1
+ 
+ 			    TAGLIST_END);
+ 
++	if (card->is_audigy && (card->chiprev == 4)) {
++		/* Hacks for Alice3 to work independent of haP16V driver */
++		u32 tmp;
++
++		//Setup SRCMulti_I2S SamplingRate
++		tmp = sblive_readptr(card, A_SPDIF_SAMPLERATE, 0);
++		tmp &= 0xfffff1ff;
++		tmp |= (0x2<<9);
++		sblive_writeptr(card, A_SPDIF_SAMPLERATE, 0, tmp);
++
++		/* Setup SRCSel (Enable Spdif,I2S SRCMulti) */
++		emu10k1_writefn0(card, 0x20, 0x600000);
++		emu10k1_writefn0(card, 0x24, 0x14);
++
++		/* Setup SRCMulti Input Audio Enable */
++		emu10k1_writefn0(card, 0x20, 0x6E0000);
++		emu10k1_writefn0(card, 0x24, 0xFF00FF00);
++	}
++
+ 	ret = fx_init(card);		/* initialize effects engine */
+ 	if (ret < 0)
+ 		return ret;
+@@ -905,16 +1126,30 @@ static int __devinit hw_init(struct emu1
+ 	/* Lock Tank Memory = 1 */
+ 	/* Lock Sound Memory = 0 */
+ 	/* Auto Mute = 1 */
+-
+-	if (card->model == 0x20 || card->model == 0xc400 ||
+-	  (card->model == 0x21 && card->chiprev < 6))
+-	        emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE);
+-	else
+-		emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE | HCFG_JOYENABLE);
+-
++	if (card->is_audigy) {
++		if (card->chiprev == 4)
++			emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_AC3ENABLE_CDSPDIF | HCFG_AC3ENABLE_GPSPDIF | HCFG_AUTOMUTE | HCFG_JOYENABLE);
++		else
++			emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_AUTOMUTE | HCFG_JOYENABLE);
++	} else {
++		if (card->model == 0x20 || card->model == 0xc400 ||
++		 (card->model == 0x21 && card->chiprev < 6))
++	        	emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE);
++		else
++			emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE | HCFG_JOYENABLE);
++	}
+ 	/* Enable Vol_Ctrl irqs */
+ 	emu10k1_irq_enable(card, INTE_VOLINCRENABLE | INTE_VOLDECRENABLE | INTE_MUTEENABLE | INTE_FXDSPENABLE);
+ 
++	if (card->is_audigy && (card->chiprev == 4)) {
++		/* Unmute Analog now.  Set GPO6 to 1 for Apollo.
++		 * This has to be done after init ALice3 I2SOut beyond 48KHz.
++		 * So, sequence is important. */
++		u32 tmp = emu10k1_readfn0(card, A_IOCFG);
++		tmp |= 0x0040;
++		emu10k1_writefn0(card, A_IOCFG, tmp);
++	}
++	
+ 	/* FIXME: TOSLink detection */
+ 	card->has_toslink = 0;
+ 
+@@ -967,7 +1202,7 @@ static int __devinit emu10k1_init(struct
+ 	return 0;
+ }
+ 
+-static void __devinit emu10k1_cleanup(struct emu10k1_card *card)
++static void emu10k1_cleanup(struct emu10k1_card *card)
+ {
+ 	int ch;
+ 
+@@ -1012,6 +1247,8 @@ static void __devinit emu10k1_cleanup(st
+ 			    SOLEH, 0,
+ 			    TAGLIST_END);
+ 
++	if (card->is_audigy)
++		sblive_writeptr(card, 0, A_DBG,  A_DBG_SINGLE_STEP);
+ 
+ 	pci_free_consistent(card->pci_dev, card->virtualpagetable.size, card->virtualpagetable.addr, card->virtualpagetable.dma_handle);
+ 	pci_free_consistent(card->pci_dev, card->silentpage.size, card->silentpage.addr, card->silentpage.dma_handle);
+@@ -1074,6 +1311,9 @@ static int __devinit emu10k1_probe(struc
+ 		card_names[pci_id->driver_data], card->chiprev, card->model, card->iobase,
+ 		card->iobase + card->length - 1, card->irq);
+ 
++	if (pci_id->device == PCI_DEVICE_ID_CREATIVE_AUDIGY)
++		card->is_audigy = 1;
++
+ 	pci_read_config_dword(pci_dev, PCI_SUBSYSTEM_VENDOR_ID, &subsysvid);
+ 	card->is_aps = (subsysvid == EMU_APS_SUBID);
+ 
+@@ -1083,13 +1323,13 @@ static int __devinit emu10k1_probe(struc
+ 	init_waitqueue_head(&card->open_wait);
+ 
+ 	ret = emu10k1_audio_init(card);
+-	if(ret < 0) {
++	if (ret < 0) {
+                 printk(KERN_ERR "emu10k1: cannot initialize audio devices\n");
+                 goto err_audio;
+         }
+ 
+ 	ret = emu10k1_mixer_init(card);
+-	if(ret < 0) {
++	if (ret < 0) {
+ 		printk(KERN_ERR "emu10k1: cannot initialize AC97 codec\n");
+                 goto err_mixer;
+ 	}
+@@ -1109,10 +1349,28 @@ static int __devinit emu10k1_probe(struc
+ 	if (card->is_aps)
+ 		emu10k1_ecard_init(card);
+ 
++	ret = emu10k1_register_devices(card);
++	if (ret < 0)
++		goto err_register;
++
++	/* proc entries must be created after registering devices, as
++	 * emu10k1_info_proc prints card->audio_dev &co. */
++	ret = emu10k1_proc_init(card);
++	if (ret < 0) {
++		printk(KERN_ERR "emu10k1: cannot initialize proc directory\n");
++                goto err_proc;
++	}
++	
+ 	list_add(&card->list, &emu10k1_devs);
+ 
+ 	return 0;
+ 
++err_proc:
++	emu10k1_unregister_devices(card);
++
++err_register:
++	emu10k1_cleanup(card);
++	
+ err_emu10k1_init:
+ 	emu10k1_midi_cleanup(card);
+ 
+@@ -1141,9 +1399,11 @@ static void __devexit emu10k1_remove(str
+ 
+ 	list_del(&card->list);
+ 
++	emu10k1_unregister_devices(card);
+ 	emu10k1_cleanup(card);
+ 	emu10k1_midi_cleanup(card);
+ 	emu10k1_mixer_cleanup(card);
++	emu10k1_proc_cleanup(card);
+ 	emu10k1_audio_cleanup(card);	
+ 	free_irq(card->irq, card);
+ 	release_region(card->iobase, card->length);
+--- linux-2.6.0-test1/sound/oss/emu10k1/midi.h	2003-06-14 12:18:00.000000000 -0700
++++ 25/sound/oss/emu10k1/midi.h	2003-07-19 17:03:51.000000000 -0700
+@@ -52,4 +52,27 @@ struct emu10k1_mididevice
+ 	struct list_head mid_hdrs;
+ };
+ 
++/* uncomment next line to use midi port on Audigy drive */
++//#define USE_AUDIGY_DRIVE_MIDI
++
++#ifdef USE_AUDIGY_DRIVE_MIDI
++#define A_MUDATA	A_MUDATA2
++#define A_MUCMD		A_MUCMD2
++#define A_MUSTAT	A_MUCMD2
++#define A_IPR_MIDITRANSBUFEMPTY	A_IPR_MIDITRANSBUFEMPTY2
++#define A_IPR_MIDIRECVBUFEMPTY	A_IPR_MIDIRECVBUFEMPTY2
++#define A_INTE_MIDITXENABLE	A_INTE_MIDITXENABLE2
++#define A_INTE_MIDIRXENABLE	A_INTE_MIDIRXENABLE2
++#else
++#define A_MUDATA	A_MUDATA1
++#define A_MUCMD		A_MUCMD1
++#define A_MUSTAT	A_MUCMD1
++#define A_IPR_MIDITRANSBUFEMPTY	A_IPR_MIDITRANSBUFEMPTY1
++#define A_IPR_MIDIRECVBUFEMPTY	A_IPR_MIDIRECVBUFEMPTY1
++#define A_INTE_MIDITXENABLE	A_INTE_MIDITXENABLE1
++#define A_INTE_MIDIRXENABLE	A_INTE_MIDIRXENABLE1
++#endif
++
++
+ #endif /* _MIDI_H */
++
+--- linux-2.6.0-test1/sound/oss/emu10k1/mixer.c	2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/emu10k1/mixer.c	2003-07-19 17:03:51.000000000 -0700
+@@ -136,7 +136,7 @@ static void set_bass(struct emu10k1_card
+ 	r = (r * 40 + 50) / 100;
+ 
+ 	for (i = 0; i < 5; i++)
+-		sblive_writeptr(card, GPR_BASE + card->mgr.ctrl_gpr[SOUND_MIXER_BASS][0] + i, 0, bass_table[l][i]);
++		sblive_writeptr(card, (card->is_audigy ? A_GPR_BASE : GPR_BASE) + card->mgr.ctrl_gpr[SOUND_MIXER_BASS][0] + i, 0, bass_table[l][i]);
+ }
+ 
+ static void set_treble(struct emu10k1_card *card, int l, int r)
+@@ -147,7 +147,7 @@ static void set_treble(struct emu10k1_ca
+ 	r = (r * 40 + 50) / 100;
+ 
+ 	for (i = 0; i < 5; i++)
+-		sblive_writeptr(card, GPR_BASE + card->mgr.ctrl_gpr[SOUND_MIXER_TREBLE][0] + i , 0, treble_table[l][i]);
++		sblive_writeptr(card, (card->is_audigy ? A_GPR_BASE : GPR_BASE) + card->mgr.ctrl_gpr[SOUND_MIXER_TREBLE][0] + i , 0, treble_table[l][i]);
+ }
+ 
+ const char volume_params[SOUND_MIXER_NRDEVICES]= {
+@@ -206,22 +206,25 @@ static int emu10k1_private_mixer(struct 
+ 		switch (ctl->cmd) {
+ #ifdef DBGEMU
+ 		case CMD_WRITEFN0:
+-			emu10k1_writefn0(card, ctl->val[0], ctl->val[1]);
++			emu10k1_writefn0_2(card, ctl->val[0], ctl->val[1], ctl->val[2]);
+ 			break;
+-
++#endif
+ 		case CMD_WRITEPTR:
+-			if (ctl->val[1] >= 0x40 || ctl->val[0] > 0xff) {
++#ifdef DBGEMU
++			if (ctl->val[1] >= 0x40 || ctl->val[0] >= 0x1000) {
++#else
++			if (ctl->val[1] >= 0x40 || ctl->val[0] >= 0x1000 || ((ctl->val[0] < 0x100 ) &&
++		    //Any register allowed raw access goes here:
++				     (ctl->val[0] != A_SPDIF_SAMPLERATE) && (ctl->val[0] != A_DBG)
++			)
++				) {
++#endif
+ 				ret = -EINVAL;
+ 				break;
+ 			}
+-
+-			if ((ctl->val[0] & 0x7ff) > 0x3f)
+-				ctl->val[1] = 0x00;
+-
+ 			sblive_writeptr(card, ctl->val[0], ctl->val[1], ctl->val[2]);
+-
+ 			break;
+-#endif
++
+ 		case CMD_READFN0:
+ 			ctl->val[2] = emu10k1_readfn0(card, ctl->val[0]);
+ 
+@@ -286,16 +289,13 @@ static int emu10k1_private_mixer(struct 
+ 
+ 		case CMD_GETVOICEPARAM:
+ 			ctl->val[0] = card->waveout.send_routing[0];
+-			ctl->val[1] = card->waveout.send_a[0] | card->waveout.send_b[0] << 8 |
+-			    	      card->waveout.send_c[0] << 16 | card->waveout.send_d[0] << 24;
++			ctl->val[1] = card->waveout.send_dcba[0];
+ 
+ 			ctl->val[2] = card->waveout.send_routing[1];
+-			ctl->val[3] = card->waveout.send_a[1] | card->waveout.send_b[1] << 8 |
+-				      card->waveout.send_c[1] << 16 | card->waveout.send_d[1] << 24;
++			ctl->val[3] = card->waveout.send_dcba[1];
+ 
+ 			ctl->val[4] = card->waveout.send_routing[2];
+-			ctl->val[5] = card->waveout.send_a[2] | card->waveout.send_b[2] << 8 |
+-				     card->waveout.send_c[2] << 16 | card->waveout.send_d[2] << 24;
++			ctl->val[5] = card->waveout.send_dcba[2];
+ 
+ 			if (copy_to_user((void *) arg, ctl, sizeof(struct mixer_private_ioctl)))
+ 				ret = -EFAULT;
+@@ -303,23 +303,14 @@ static int emu10k1_private_mixer(struct 
+ 			break;
+ 
+ 		case CMD_SETVOICEPARAM:
+-			card->waveout.send_routing[0] = ctl->val[0] & 0xffff;
+-			card->waveout.send_a[0] = ctl->val[1] & 0xff;
+-			card->waveout.send_b[0] = (ctl->val[1] >> 8) & 0xff;
+-			card->waveout.send_c[0] = (ctl->val[1] >> 16) & 0xff;
+-			card->waveout.send_d[0] = (ctl->val[1] >> 24) & 0xff;
+-
+-			card->waveout.send_routing[1] = ctl->val[2] & 0xffff;
+-			card->waveout.send_a[1] = ctl->val[3] & 0xff;
+-			card->waveout.send_b[1] = (ctl->val[3] >> 8) & 0xff;
+-			card->waveout.send_c[1] = (ctl->val[3] >> 16) & 0xff;
+-			card->waveout.send_d[1] = (ctl->val[3] >> 24) & 0xff;
+-
+-			card->waveout.send_routing[2] = ctl->val[4] & 0xffff;
+-			card->waveout.send_a[2] = ctl->val[5] & 0xff;
+-			card->waveout.send_b[2] = (ctl->val[5] >> 8) & 0xff;
+-			card->waveout.send_c[2] = (ctl->val[5] >> 16) & 0xff;
+-			card->waveout.send_d[2] = (ctl->val[5] >> 24) & 0xff;
++			card->waveout.send_routing[0] = ctl->val[0];
++			card->waveout.send_dcba[0] = ctl->val[1];
++
++			card->waveout.send_routing[1] = ctl->val[2];
++			card->waveout.send_dcba[1] = ctl->val[3];
++
++			card->waveout.send_routing[2] = ctl->val[4];
++			card->waveout.send_dcba[2] = ctl->val[5];
+ 
+ 			break;
+ 		
+@@ -416,12 +407,16 @@ static int emu10k1_private_mixer(struct 
+ 			break;
+ 
+ 		case CMD_SETGPOUT:
+-			if (ctl->val[0] > 2 || ctl->val[1] > 1) {
++			if ( ((ctl->val[0] > 2) && (!card->is_audigy))
++			     || (ctl->val[0] > 15) || ctl->val[1] > 1) {
+ 				ret= -EINVAL;
+ 				break;
+ 			}
+ 
+-			emu10k1_writefn0(card, (1 << 24) | (((ctl->val[0]) + 10) << 16) | HCFG, ctl->val[1]);
++			if (card->is_audigy)
++				emu10k1_writefn0(card, (1 << 24) | ((ctl->val[0]) << 16) | A_IOCFG, ctl->val[1]);
++			else
++				emu10k1_writefn0(card, (1 << 24) | (((ctl->val[0]) + 10) << 16) | HCFG, ctl->val[1]);
+ 			break;
+ 
+ 		case CMD_GETGPR2OSS:
+@@ -493,13 +488,20 @@ static int emu10k1_private_mixer(struct 
+ 			break;
+ 
+ 		case CMD_PRIVATE3_VERSION:
+-			ctl->val[0]=PRIVATE3_VERSION;
++			ctl->val[0] = PRIVATE3_VERSION;	//private3 version
++			ctl->val[1] = MAJOR_VER;	//major driver version
++			ctl->val[2] = MINOR_VER;	//minor driver version
++			ctl->val[3] = card->is_audigy;	//1=card is audigy
++
++			if (card->is_audigy)
++				ctl->val[4]=emu10k1_readfn0(card, 0x18);
++
+ 			if (copy_to_user((void *) arg, ctl, sizeof(struct mixer_private_ioctl)))
+ 				ret = -EFAULT;
+ 			break;
+ 
+ 		case CMD_AC97_BOOST:
+-			if(ctl->val[0])
++			if (ctl->val[0])
+ 				emu10k1_ac97_write(card->ac97, 0x18, 0x0);	
+ 			else
+ 				emu10k1_ac97_write(card->ac97, 0x18, 0x0808);
+@@ -556,7 +558,7 @@ static int emu10k1_private_mixer(struct 
+ 
+ 				card->tankmem.size = size;
+ 
+-				sblive_writeptr_tag(card, 0, TCB, (u32) card->tankmem.dma_handle, TCBS, size_reg, TAGLIST_END);
++				sblive_writeptr_tag(card, 0, TCB, (u32) card->tankmem.dma_handle, TCBS,(u32) size_reg, TAGLIST_END);
+ 
+ 				emu10k1_writefn0(card, HCFG_LOCKTANKCACHE, 0);
+ 			}
+@@ -623,8 +625,13 @@ static int emu10k1_mixer_ioctl(struct in
+ 		if (cmd == SOUND_MIXER_INFO) {
+ 			mixer_info info;
+ 
+-			strncpy(info.id, card->ac97->name, sizeof(info.id));
+-			strncpy(info.name, "Creative SBLive - Emu10k1", sizeof(info.name));
++			strlcpy(info.id, card->ac97->name, sizeof(info.id));
++
++			if (card->is_audigy)
++				strlcpy(info.name, "Audigy - Emu10k1", sizeof(info.name));
++			else
++				strlcpy(info.name, "Creative SBLive - Emu10k1", sizeof(info.name));
++				
+ 			info.modify_counter = card->ac97->modcnt;
+ 
+ 			if (copy_to_user((void *)arg, &info, sizeof(info)))
+--- linux-2.6.0-test1/sound/oss/emu10k1/passthrough.c	2003-06-14 12:18:09.000000000 -0700
++++ 25/sound/oss/emu10k1/passthrough.c	2003-07-19 17:03:51.000000000 -0700
+@@ -109,7 +109,7 @@ static int pt_putblock(struct emu10k1_wa
+ 	return 0;
+ }
+ 
+-static int pt_setup(struct emu10k1_wavedevice *wave_dev)
++int emu10k1_pt_setup(struct emu10k1_wavedevice *wave_dev)
+ {
+ 	u32 bits;
+ 	struct emu10k1_card *card = wave_dev->card;
+@@ -155,7 +155,7 @@ ssize_t emu10k1_pt_write(struct file *fi
+ 		pt->prepend_size = 0;
+ 		if (pt->buf == NULL)
+ 			return -ENOMEM;
+-		pt_setup(wave_dev);
++		emu10k1_pt_setup(wave_dev);
+ 	}
+ 	if (pt->prepend_size) {
+ 		int needed = PT_BLOCKSIZE - pt->prepend_size;
+@@ -208,13 +208,14 @@ void emu10k1_pt_stop(struct emu10k1_card
+ 
+ 	if (pt->state != PT_STATE_INACTIVE) {
+ 		DPF(2, "digital pass-through stopped\n");
+-		sblive_writeptr(card, GPR_BASE + pt->enable_gpr, 0, 0);
++		sblive_writeptr(card, (card->is_audigy ? A_GPR_BASE : GPR_BASE) + pt->enable_gpr, 0, 0);
+ 		for (i = 0; i < 3; i++) {
+                         if (pt->spcs_to_use & (1 << i))
+ 				sblive_writeptr(card, SPCS0 + i, 0, pt->old_spcs[i]);
+ 		}
+ 		pt->state = PT_STATE_INACTIVE;
+-		kfree(pt->buf);
++		if(pt->buf)
++			kfree(pt->buf);
+ 	}
+ }
+ 
+--- linux-2.6.0-test1/sound/oss/emu10k1/passthrough.h	2003-06-14 12:18:21.000000000 -0700
++++ 25/sound/oss/emu10k1/passthrough.h	2003-07-19 17:03:51.000000000 -0700
+@@ -63,7 +63,36 @@ struct pt_data
+ 	spinlock_t lock;
+ };
+ 
++/*
++  Passthrough can be done in two methods:
++
++  Method 1 : tram
++     In original emu10k1, we couldn't bypass the sample rate converters. Even at 48kHz
++     (the internal sample rate of the emu10k1) the samples would get messed up.
++     To over come this, samples are copied into the tram and a special dsp patch copies
++     the samples out and generates interrupts when a block has finnished playing.
++
++  Method 2 : Interpolator bypass
++
++     Creative fixed the sample rate convert problem in emu10k1 rev 7 and higher
++     (including the emu10k2 (audigy)). This allows us to use the regular, and much simpler
++     playback method. 
++
++
++  In both methods, dsp code is used to mux audio and passthrough. This ensures that the spdif
++  doesn't receive audio and pasthrough data at the same time. The spdif flag SPCS_NOTAUDIODATA
++  is set to tell 
++
++ */
++
++// emu10k1 revs greater than or equal to 7 can use method2
++
++#define USE_PT_METHOD2  (card->is_audigy)
++#define USE_PT_METHOD1	!USE_PT_METHOD2
++
+ ssize_t emu10k1_pt_write(struct file *file, const char *buf, size_t count);
++
++int emu10k1_pt_setup(struct emu10k1_wavedevice *wave_dev);
+ void emu10k1_pt_stop(struct emu10k1_card *card);
+ void emu10k1_pt_waveout_update(struct emu10k1_wavedevice *wave_dev);
+ 
+--- linux-2.6.0-test1/sound/oss/emu10k1/recmgr.c	2003-06-14 12:18:52.000000000 -0700
++++ 25/sound/oss/emu10k1/recmgr.c	2003-07-19 17:03:51.000000000 -0700
+@@ -74,7 +74,7 @@ void emu10k1_set_record_src(struct emu10
+ 		DPF(2, "recording source: AC97\n");
+ 		buffer->sizereg = ADCBS;
+ 		buffer->addrreg = ADCBA;
+-		buffer->idxreg = ADCIDX_IDX;
++		buffer->idxreg = card->is_audigy ? A_ADCIDX_IDX : ADCIDX_IDX;
+ 
+ 		switch (wiinst->format.samplingrate) {
+ 		case 0xBB80:
+@@ -95,21 +95,27 @@ void emu10k1_set_record_src(struct emu10
+ 		case 0x3E80:
+ 			buffer->adcctl = ADCCR_SAMPLERATE_16;
+ 			break;
++		// FIXME: audigy supports 12kHz recording
++		/*
++		case ????:
++			buffer->adcctl = A_ADCCR_SAMPLERATE_12;
++			break;
++		*/
+ 		case 0x2B11:
+-			buffer->adcctl = ADCCR_SAMPLERATE_11;
++			buffer->adcctl = card->is_audigy ? A_ADCCR_SAMPLERATE_11 : ADCCR_SAMPLERATE_11;
+ 			break;
+ 		case 0x1F40:
+-			buffer->adcctl = ADCCR_SAMPLERATE_8;
++			buffer->adcctl = card->is_audigy ? A_ADCCR_SAMPLERATE_8 : ADCCR_SAMPLERATE_8;
+ 			break;
+ 		default:
+ 			BUG();
+ 			break;
+ 		}
+ 
+-		buffer->adcctl |= ADCCR_LCHANENABLE;
++		buffer->adcctl |= card->is_audigy ? A_ADCCR_LCHANENABLE : ADCCR_LCHANENABLE;
+ 
+ 		if (wiinst->format.channels == 2)
+-			buffer->adcctl |= ADCCR_RCHANENABLE;
++			buffer->adcctl |= card->is_audigy ? A_ADCCR_RCHANENABLE : ADCCR_RCHANENABLE;
+ 
+ 		break;
+ 
+--- linux-2.6.0-test1/sound/oss/emu10k1/voicemgr.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/sound/oss/emu10k1/voicemgr.c	2003-07-19 17:03:51.000000000 -0700
+@@ -32,6 +32,34 @@
+ #include "voicemgr.h"
+ #include "8010.h"
+ 
++#define PITCH_48000 0x00004000
++#define PITCH_96000 0x00008000
++#define PITCH_85000 0x00007155
++#define PITCH_80726 0x00006ba2
++#define PITCH_67882 0x00005a82
++#define PITCH_57081 0x00004c1c
++
++u32 emu10k1_select_interprom(struct emu10k1_card *card, struct emu_voice *voice)
++{
++	if(voice->pitch_target==PITCH_48000)
++		return CCCA_INTERPROM_0;
++	else if(voice->pitch_target<PITCH_48000)
++		return CCCA_INTERPROM_1;
++	else  if(voice->pitch_target>=PITCH_96000)
++		return CCCA_INTERPROM_0;
++	else  if(voice->pitch_target>=PITCH_85000)
++		return CCCA_INTERPROM_6;
++	else  if(voice->pitch_target>=PITCH_80726)
++		return CCCA_INTERPROM_5;
++	else  if(voice->pitch_target>=PITCH_67882)
++		return CCCA_INTERPROM_4;
++	else  if(voice->pitch_target>=PITCH_57081)
++		return CCCA_INTERPROM_3;
++	else  
++		return CCCA_INTERPROM_2;
++}
++
++
+ /**
+  * emu10k1_voice_alloc_buffer -
+  *
+@@ -216,17 +244,25 @@ void emu10k1_voice_playback_setup(struct
+ 	voice->start += start;
+ 
+ 	for (i = 0; i < (voice->flags & VOICE_FLAGS_STEREO ? 2 : 1); i++) {
+-		sblive_writeptr(card, FXRT, voice->num + i, voice->params[i].send_routing << 16);
++		if (card->is_audigy) {
++			sblive_writeptr(card, A_FXRT1, voice->num + i, voice->params[i].send_routing);
++			sblive_writeptr(card, A_FXRT2, voice->num + i, voice->params[i].send_routing2);
++			sblive_writeptr(card,  A_SENDAMOUNTS, voice->num + i, voice->params[i].send_hgfe);
++		} else {
++			sblive_writeptr(card, FXRT, voice->num + i, voice->params[i].send_routing << 16);
++		}
+ 
+ 		/* Stop CA */
+ 		/* Assumption that PT is already 0 so no harm overwriting */
+-		sblive_writeptr(card, PTRX, voice->num + i, (voice->params[i].send_a << 8) | voice->params[i].send_b);
++		sblive_writeptr(card, PTRX, voice->num + i, ((voice->params[i].send_dcba & 0xff) << 8)
++				| ((voice->params[i].send_dcba & 0xff00) >> 8));
+ 
+ 		sblive_writeptr_tag(card, voice->num + i,
+ 				/* CSL, ST, CA */
+-				    DSL, voice->endloop | (voice->params[i].send_d << 24),
+-				    PSST, voice->startloop | (voice->params[i].send_c << 24),
+-				    CCCA, (voice->start) | CCCA_INTERPROM_0 | ((voice->flags & VOICE_FLAGS_16BIT) ? 0 : CCCA_8BITSELECT),
++				    DSL, voice->endloop | (voice->params[i].send_dcba & 0xff000000),
++				    PSST, voice->startloop | ((voice->params[i].send_dcba & 0x00ff0000) << 8),
++				    CCCA, (voice->start) |  emu10k1_select_interprom(card,voice) |
++				        ((voice->flags & VOICE_FLAGS_16BIT) ? 0 : CCCA_8BITSELECT),
+ 				    /* Clear filter delay memory */
+ 				    Z1, 0,
+ 				    Z2, 0,
+--- linux-2.6.0-test1/sound/oss/emu10k1/voicemgr.h	2003-06-14 12:18:23.000000000 -0700
++++ 25/sound/oss/emu10k1/voicemgr.h	2003-07-19 17:03:51.000000000 -0700
+@@ -48,11 +48,13 @@ struct voice_param
+ 	/* FX bus amount send */
+ 
+ 	u32 send_routing;
++	// audigy only:
++	u32 send_routing2;
++
++	u32 send_dcba;
++	// audigy only:
++	u32 send_hgfe;
+ 
+-	u32 send_a;
+-	u32 send_b;
+-	u32 send_c;
+-	u32 send_d;
+ 
+ 	u32 initial_fc;
+ 	u32 fc_target;
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/sound/oss/hal2.c	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,1498 @@
++/*
++ *  Driver for HAL2 sound processors
++ *  Copyright (c) 2001, 2002 Ladislav Michl <ladis@psi.cz>
++ *  
++ *  Based on Ulf Carlsson's code.
++ *
++ *  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.
++ *
++ *  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.
++ *
++ *  Supported devices:
++ *  /dev/dsp    standard dsp device, (mostly) OSS compatible
++ *  /dev/mixer	standard mixer device, (mostly) OSS compatible
++ *
++ *  BUGS:
++ *  + Driver currently supports indigo mode only.
++ *  + Recording doesn't work. I guess that it is caused by PBUS channel
++ *    misconfiguration, but until I get relevant info I'm unable to fix it.
++ */
++
++#include <linux/module.h>
++#include <linux/sched.h>
++#include <linux/init.h>
++#include <linux/slab.h>
++#include <linux/poll.h>
++#include <linux/sound.h>
++#include <linux/soundcard.h>
++#include <asm/io.h>
++#include <asm/uaccess.h>
++#include <asm/sgi/sgint23.h>
++
++#include "hal2.h"
++
++#if 0
++#define DEBUG(args...)		printk(args)
++#else
++#define DEBUG(args...)
++#endif
++
++#if 0 
++#define DEBUG_MIX(args...)	printk(args)
++#else
++#define DEBUG_MIX(args...)
++#endif
++
++#define H2_INDIRECT_WAIT(regs)	while (regs->isr & H2_ISR_TSTATUS);
++
++#define H2_READ_ADDR(addr)	(addr | (1<<7))
++#define H2_WRITE_ADDR(addr)	(addr)
++
++static char *hal2str = "HAL2 audio";
++static int ibuffers = 32;
++static int obuffers = 32;
++
++/* I doubt anyone has a machine with two HAL2 cards. It's possible to
++ * have two HPC's, so it is probably possible to have two HAL2 cards.
++ * Try to deal with it, but note that it is not tested.
++ */
++#define MAXCARDS	2
++static hal2_card_t* hal2_card[MAXCARDS];
++
++static const struct {
++	unsigned char idx:4, avail:1;
++} mixtable[SOUND_MIXER_NRDEVICES] = {
++	[SOUND_MIXER_PCM] = { H2_MIX_OUTPUT_ATT, 1 },	/* voice */
++	[SOUND_MIXER_MIC] = { H2_MIX_INPUT_GAIN, 1 },	/* mic */
++};
++
++#define H2_SUPPORTED_FORMATS	(AFMT_S16_LE | AFMT_S16_BE)
++
++static inline void hal2_isr_write(hal2_card_t *hal2, u32 val)
++{
++	hal2->ctl_regs->isr = val;
++}
++
++static inline u32 hal2_isr_look(hal2_card_t *hal2)
++{
++	return hal2->ctl_regs->isr;
++}
++
++static inline u32 hal2_rev_look(hal2_card_t *hal2)
++{
++	return hal2->ctl_regs->rev;
++}
++
++#if 0
++static u16 hal2_i_look16(hal2_card_t *hal2, u32 addr)
++{
++	hal2_ctl_regs_t *regs = hal2->ctl_regs;
++
++	regs->iar = H2_READ_ADDR(addr);
++	H2_INDIRECT_WAIT(regs);
++	return (regs->idr0 & 0xffff);
++}
++#endif
++
++static u32 hal2_i_look32(hal2_card_t *hal2, u32 addr)
++{
++	u32 ret;
++	hal2_ctl_regs_t *regs = hal2->ctl_regs;
++
++	regs->iar = H2_READ_ADDR(addr);
++	H2_INDIRECT_WAIT(regs);
++	ret = regs->idr0 & 0xffff;
++	regs->iar = H2_READ_ADDR(addr | 0x1);
++	H2_INDIRECT_WAIT(regs);
++	ret |= (regs->idr0 & 0xffff) << 16;
++	return ret;
++}
++
++static void hal2_i_write16(hal2_card_t *hal2, u32 addr, u16 val)
++{
++	hal2_ctl_regs_t *regs = hal2->ctl_regs;
++
++	regs->idr0 = val;
++	regs->idr1 = 0;
++	regs->idr2 = 0;
++	regs->idr3 = 0;
++	regs->iar = H2_WRITE_ADDR(addr);
++	H2_INDIRECT_WAIT(regs);
++}
++
++static void hal2_i_write32(hal2_card_t *hal2, u32 addr, u32 val)
++{
++	hal2_ctl_regs_t *regs = hal2->ctl_regs;
++
++	regs->idr0 = val & 0xffff;
++	regs->idr1 = val >> 16;
++	regs->idr2 = 0;
++	regs->idr3 = 0;
++	regs->iar = H2_WRITE_ADDR(addr);
++	H2_INDIRECT_WAIT(regs);
++}
++
++static void hal2_i_setbit16(hal2_card_t *hal2, u32 addr, u16 bit)
++{
++	hal2_ctl_regs_t *regs = hal2->ctl_regs;
++
++	regs->iar = H2_READ_ADDR(addr);
++	H2_INDIRECT_WAIT(regs);
++	regs->idr0 = regs->idr0 | bit;
++	regs->idr1 = 0;
++	regs->idr2 = 0;
++	regs->idr3 = 0;
++	regs->iar = H2_WRITE_ADDR(addr);
++	H2_INDIRECT_WAIT(regs);
++}
++
++static void hal2_i_setbit32(hal2_card_t *hal2, u32 addr, u32 bit)
++{
++	u32 tmp;
++	hal2_ctl_regs_t *regs = hal2->ctl_regs;
++
++	regs->iar = H2_READ_ADDR(addr);
++	H2_INDIRECT_WAIT(regs);
++	tmp = regs->idr0 | (regs->idr1 << 16) | bit;
++	regs->idr0 = tmp & 0xffff;
++	regs->idr1 = tmp >> 16;
++	regs->idr2 = 0;
++	regs->idr3 = 0;
++	regs->iar = H2_WRITE_ADDR(addr);
++	H2_INDIRECT_WAIT(regs);
++}
++
++static void hal2_i_clearbit16(hal2_card_t *hal2, u32 addr, u16 bit)
++{
++	hal2_ctl_regs_t *regs = hal2->ctl_regs;
++
++	regs->iar = H2_READ_ADDR(addr);
++	H2_INDIRECT_WAIT(regs);
++	regs->idr0 = regs->idr0 & ~bit;
++	regs->idr1 = 0;
++	regs->idr2 = 0;
++	regs->idr3 = 0;
++	regs->iar = H2_WRITE_ADDR(addr);
++	H2_INDIRECT_WAIT(regs);
++}
++
++#if 0
++static void hal2_i_clearbit32(hal2_card_t *hal2, u32 addr, u32 bit)
++{
++	u32 tmp;
++	hal2_ctl_regs_t *regs = hal2->ctl_regs;
++
++	regs->iar = H2_READ_ADDR(addr);
++	H2_INDIRECT_WAIT(regs);
++	tmp = (regs->idr0 | (regs->idr1 << 16)) & ~bit;
++	regs->idr0 = tmp & 0xffff;
++	regs->idr1 = tmp >> 16;
++	regs->idr2 = 0;
++	regs->idr3 = 0;
++	regs->iar = H2_WRITE_ADDR(addr);
++	H2_INDIRECT_WAIT(regs);
++}
++#endif
++
++#ifdef HAL2_DEBUG
++static void hal2_dump_regs(hal2_card_t *hal2)
++{
++	printk("isr: %08hx ", hal2_isr_look(hal2));
++	printk("rev: %08hx\n", hal2_rev_look(hal2));
++	printk("relay: %04hx\n", hal2_i_look16(hal2, H2I_RELAY_C));
++	printk("port en: %04hx ", hal2_i_look16(hal2, H2I_DMA_PORT_EN));
++	printk("dma end: %04hx ", hal2_i_look16(hal2, H2I_DMA_END));
++	printk("dma drv: %04hx\n", hal2_i_look16(hal2, H2I_DMA_DRV));
++	printk("syn ctl: %04hx ", hal2_i_look16(hal2, H2I_SYNTH_C));
++	printk("aesrx ctl: %04hx ", hal2_i_look16(hal2, H2I_AESRX_C));
++	printk("aestx ctl: %04hx ", hal2_i_look16(hal2, H2I_AESTX_C));
++	printk("dac ctl1: %04hx ", hal2_i_look16(hal2, H2I_ADC_C1));
++	printk("dac ctl2: %08lx ", hal2_i_look32(hal2, H2I_ADC_C2));
++	printk("adc ctl1: %04hx ", hal2_i_look16(hal2, H2I_DAC_C1));
++	printk("adc ctl2: %08lx ", hal2_i_look32(hal2, H2I_DAC_C2));
++	printk("syn map: %04hx\n", hal2_i_look16(hal2, H2I_SYNTH_MAP_C));
++	printk("bres1 ctl1: %04hx ", hal2_i_look16(hal2, H2I_BRES1_C1));
++	printk("bres1 ctl2: %04lx ", hal2_i_look32(hal2, H2I_BRES1_C2));
++	printk("bres2 ctl1: %04hx ", hal2_i_look16(hal2, H2I_BRES2_C1));
++	printk("bres2 ctl2: %04lx ", hal2_i_look32(hal2, H2I_BRES2_C2));
++	printk("bres3 ctl1: %04hx ", hal2_i_look16(hal2, H2I_BRES3_C1));
++	printk("bres3 ctl2: %04lx\n", hal2_i_look32(hal2, H2I_BRES3_C2));
++}
++#endif
++
++static hal2_card_t* hal2_dsp_find_card(int minor)
++{
++	int i;
++
++	for (i = 0; i < MAXCARDS; i++)
++		if (hal2_card[i] != NULL && hal2_card[i]->dev_dsp == minor)
++			return hal2_card[i];
++	return NULL;
++}
++
++static hal2_card_t* hal2_mixer_find_card(int minor)
++{
++	int i;
++
++	for (i = 0; i < MAXCARDS; i++)
++		if (hal2_card[i] != NULL && hal2_card[i]->dev_mixer == minor)
++			return hal2_card[i];
++	return NULL;
++}
++
++
++static void hal2_dac_interrupt(hal2_codec_t *dac)
++{
++	int running;
++
++	spin_lock(&dac->lock);
++	
++	/* if tail buffer contains zero samples DMA stream was already
++	 * stopped */
++	running = dac->tail->info.cnt;
++	dac->tail->info.cnt = 0;
++	dac->tail->info.desc.cntinfo = HPCDMA_XIE | HPCDMA_EOX;
++	dma_cache_wback_inv((unsigned long) dac->tail,
++			    sizeof(struct hpc_dma_desc));
++	/* we just proccessed empty buffer, don't update tail pointer */
++	if (running)
++		dac->tail = dac->tail->info.next;
++
++	spin_unlock(&dac->lock);
++
++	wake_up(&dac->dma_wait);
++}
++
++static void hal2_adc_interrupt(hal2_codec_t *adc)
++{
++	int running;
++	
++	spin_lock(&adc->lock);
++
++	/* if head buffer contains nonzero samples DMA stream was already
++	 * stopped */
++	running = !adc->head->info.cnt;
++	adc->head->info.cnt = H2_BUFFER_SIZE;
++	adc->head->info.desc.cntinfo = HPCDMA_XIE | HPCDMA_EOX;
++	dma_cache_wback_inv((unsigned long) adc->head,
++			    sizeof(struct hpc_dma_desc));
++	/* we just proccessed empty buffer, don't update head pointer */
++	if (running) {
++		dma_cache_inv((unsigned long) adc->head->data, H2_BUFFER_SIZE);
++		adc->head = adc->head->info.next;
++	}
++
++	spin_unlock(&adc->lock);
++
++	wake_up(&adc->dma_wait);
++}
++
++static irqreturn_t hal2_interrupt(int irq, void *dev_id, struct pt_regs *regs)
++{
++	hal2_card_t *hal2 = (hal2_card_t*)dev_id;
++
++	/* decide what caused this interrupt */
++	if (hal2->dac.pbus.pbus->pbdma_ctrl & HPC3_PDMACTRL_INT)
++		hal2_dac_interrupt(&hal2->dac);
++	if (hal2->adc.pbus.pbus->pbdma_ctrl & HPC3_PDMACTRL_INT)
++		hal2_adc_interrupt(&hal2->adc);
++	return IRQ_HANDLED;
++}
++
++static int hal2_compute_rate(hal2_codec_t *codec, unsigned int rate)
++{
++	unsigned short inc;
++	
++	/* We default to 44.1 kHz and if it isn't possible to fall back to
++	 * 48.0 kHz with the needed adjustments of real_rate.
++	 */
++
++	DEBUG("rate: %d\n", rate);
++	
++	/* Refer to CS4216 data sheet */
++	if (rate < 4000)
++		rate = 4000;
++	if (rate > 50000)
++		rate = 50000;
++
++	/* Note: This is NOT the way they set up the bresenham clock generators
++	 * in the specification. I've tried to implement that method but it
++	 * doesn't work. It's probably another silly bug in the spec.
++	 *
++	 * I accidently discovered this method while I was testing and it seems
++	 * to work very well with all frequencies, and thee shall follow rule #1
++	 * of programming :-)
++	 */
++	
++	if (44100 % rate == 0) {
++		inc = 44100 / rate;
++		if (inc < 1) inc = 1;
++		codec->master = 44100;
++	} else {
++		inc = 48000 / rate;
++		if (inc < 1) inc = 1;
++		rate = 48000 / inc;
++		codec->master = 48000;
++	}
++	codec->inc = inc;
++	codec->mod = 1;
++	
++	DEBUG("real_rate: %d\n", rate);
++
++	return rate;
++}
++
++static void hal2_set_dac_rate(hal2_card_t *hal2)
++{
++	unsigned int master = hal2->dac.master;
++	int inc = hal2->dac.inc;
++	int mod = hal2->dac.mod;
++
++	DEBUG("master: %d inc: %d mod: %d\n", master, inc, mod);
++	
++	hal2_i_write16(hal2, H2I_BRES1_C1, (master == 44100) ? 1 : 0);
++	hal2_i_write32(hal2, H2I_BRES1_C2, ((0xffff & (mod - inc - 1)) << 16) | 1);
++}
++
++static void hal2_set_adc_rate(hal2_card_t *hal2)
++{
++	unsigned int master = hal2->adc.master;
++	int inc = hal2->adc.inc;
++	int mod = hal2->adc.mod;
++
++	DEBUG("master: %d inc: %d mod: %d\n", master, inc, mod);
++	
++	hal2_i_write16(hal2, H2I_BRES2_C1, (master == 44100) ? 1 : 0);
++	hal2_i_write32(hal2, H2I_BRES2_C2, ((0xffff & (mod - inc - 1)) << 16) | 1);
++}
++
++static void hal2_setup_dac(hal2_card_t *hal2)
++{
++	unsigned int fifobeg, fifoend, highwater, sample_size;
++	hal2_pbus_t *pbus = &hal2->dac.pbus;
++
++	DEBUG("hal2_setup_dac\n");
++	
++	/* Now we set up some PBUS information. The PBUS needs information about
++	 * what portion of the fifo it will use. If it's receiving or
++	 * transmitting, and finally whether the stream is little endian or big
++	 * endian. The information is written later, on the start call.
++	 */
++	sample_size = 2 * hal2->dac.voices;
++
++	/* Fifo should be set to hold exactly four samples. Highwater mark
++	 * should be set to two samples. */
++	highwater = (sample_size * 2) >> 1;	/* halfwords */
++	fifobeg = 0;				/* playback is first */
++	fifoend = (sample_size * 4) >> 3;	/* doublewords */
++	pbus->ctrl = HPC3_PDMACTRL_RT | HPC3_PDMACTRL_LD |
++		     (highwater << 8) | (fifobeg << 16) | (fifoend << 24);
++	/* We disable everything before we do anything at all */
++	pbus->pbus->pbdma_ctrl = HPC3_PDMACTRL_LD;
++	hal2_i_clearbit16(hal2, H2I_DMA_PORT_EN, H2I_DMA_PORT_EN_CODECTX);
++	hal2_i_clearbit16(hal2, H2I_DMA_DRV, (1 << pbus->pbusnr));
++	/* Setup the HAL2 for playback */
++	hal2_set_dac_rate(hal2);
++	/* We are using 1st Bresenham clock generator for playback */
++	hal2_i_write16(hal2, H2I_DAC_C1, (pbus->pbusnr << H2I_C1_DMA_SHIFT)
++			| (1 << H2I_C1_CLKID_SHIFT)
++			| (hal2->dac.voices << H2I_C1_DATAT_SHIFT));
++}
++
++static void hal2_setup_adc(hal2_card_t *hal2)
++{
++	unsigned int fifobeg, fifoend, highwater, sample_size;
++	hal2_pbus_t *pbus = &hal2->adc.pbus;
++
++	DEBUG("hal2_setup_adc\n");
++	
++	sample_size = 2 * hal2->adc.voices;
++
++	highwater = (sample_size * 2) >> 1;		/* halfwords */
++	fifobeg = (4 * 4) >> 3;				/* record is second */
++	fifoend = (4 * 4 + sample_size * 4) >> 3;	/* doublewords */
++	pbus->ctrl = HPC3_PDMACTRL_RT | HPC3_PDMACTRL_RCV | HPC3_PDMACTRL_LD | 
++		     (highwater << 8) | (fifobeg << 16) | (fifoend << 24);
++	pbus->pbus->pbdma_ctrl = HPC3_PDMACTRL_LD;
++	hal2_i_clearbit16(hal2, H2I_DMA_PORT_EN, H2I_DMA_PORT_EN_CODECR);
++	hal2_i_clearbit16(hal2, H2I_DMA_DRV, (1 << pbus->pbusnr));
++	/* Setup the HAL2 for record */
++	hal2_set_adc_rate(hal2);
++	/* We are using 2nd Bresenham clock generator for record */
++	hal2_i_write16(hal2, H2I_ADC_C1, (pbus->pbusnr << H2I_C1_DMA_SHIFT)
++			| (2 << H2I_C1_CLKID_SHIFT)
++			| (hal2->adc.voices << H2I_C1_DATAT_SHIFT));
++}
++
++static void hal2_start_dac(hal2_card_t *hal2)
++{
++	hal2_pbus_t *pbus = &hal2->dac.pbus;
++
++	DEBUG("hal2_start_dac\n");
++	
++	pbus->pbus->pbdma_dptr = PHYSADDR(hal2->dac.tail);
++	pbus->pbus->pbdma_ctrl = pbus->ctrl | HPC3_PDMACTRL_ACT;
++
++	/* set endianess */
++	if (hal2->dac.format & AFMT_S16_LE)
++		hal2_i_setbit16(hal2, H2I_DMA_END, H2I_DMA_END_CODECTX);
++	else
++		hal2_i_clearbit16(hal2, H2I_DMA_END, H2I_DMA_END_CODECTX);
++	/* set DMA bus */
++	hal2_i_setbit16(hal2, H2I_DMA_DRV, (1 << pbus->pbusnr));
++	/* enable DAC */
++	hal2_i_setbit16(hal2, H2I_DMA_PORT_EN, H2I_DMA_PORT_EN_CODECTX);
++}
++
++static void hal2_start_adc(hal2_card_t *hal2)
++{
++	hal2_pbus_t *pbus = &hal2->adc.pbus;
++
++	DEBUG("hal2_start_adc\n");
++	
++	pbus->pbus->pbdma_dptr = PHYSADDR(hal2->adc.head);
++	pbus->pbus->pbdma_ctrl = pbus->ctrl | HPC3_PDMACTRL_ACT;
++	
++	/* set endianess */
++	if (hal2->adc.format & AFMT_S16_LE)
++		hal2_i_setbit16(hal2, H2I_DMA_END, H2I_DMA_END_CODECR);
++	else
++		hal2_i_clearbit16(hal2, H2I_DMA_END, H2I_DMA_END_CODECR);
++	/* set DMA bus */
++	hal2_i_setbit16(hal2, H2I_DMA_DRV, (1 << pbus->pbusnr));
++	/* enable ADC */
++	hal2_i_setbit16(hal2, H2I_DMA_PORT_EN, H2I_DMA_PORT_EN_CODECR);
++}
++
++static inline void hal2_stop_dac(hal2_card_t *hal2)
++{
++	DEBUG("hal2_stop_dac\n");
++	
++	hal2->dac.pbus.pbus->pbdma_ctrl = HPC3_PDMACTRL_LD;
++	/* The HAL2 itself may remain enabled safely */
++}
++
++static inline void hal2_stop_adc(hal2_card_t *hal2)
++{
++	DEBUG("hal2_stop_adc\n");
++	
++	hal2->adc.pbus.pbus->pbdma_ctrl = HPC3_PDMACTRL_LD;
++}
++
++#define hal2_alloc_dac_dmabuf(hal2)	hal2_alloc_dmabuf(hal2, 1)
++#define hal2_alloc_adc_dmabuf(hal2)	hal2_alloc_dmabuf(hal2, 0)
++static int hal2_alloc_dmabuf(hal2_card_t *hal2, int is_dac)
++{
++	int buffers, cntinfo;
++	hal2_buf_t *buf, *prev;
++	hal2_codec_t *codec;
++
++	if (is_dac) {
++		codec = &hal2->dac;
++		buffers = obuffers;
++		cntinfo = HPCDMA_XIE | HPCDMA_EOX;
++	} else {
++		codec = &hal2->adc;
++		buffers = ibuffers;
++		cntinfo = HPCDMA_XIE | H2_BUFFER_SIZE;
++	}
++	
++	DEBUG("allocating %d DMA buffers.\n", buffers);
++	
++	buf = (hal2_buf_t*) get_zeroed_page(GFP_KERNEL);
++	if (!buf)
++		return -ENOMEM;
++	codec->head = buf;
++	codec->tail = buf;
++	
++	while (--buffers) {
++		buf->info.desc.pbuf = PHYSADDR(&buf->data);
++		buf->info.desc.cntinfo = cntinfo;
++		buf->info.cnt = 0;
++		prev = buf;
++		buf = (hal2_buf_t*) get_zeroed_page(GFP_KERNEL);
++		if (!buf) {
++			printk("HAL2: Not enough memory for DMA buffer.\n");
++			buf = codec->head;
++			while (buf) {
++				prev = buf;
++				free_page((unsigned long) buf);
++				buf = prev->info.next;
++			}
++			return -ENOMEM;
++		}
++		prev->info.next = buf;
++		prev->info.desc.pnext = PHYSADDR(buf);
++		/* The PBUS can prolly not read this stuff when it's in
++		 * the cache so we have to flush it back to main memory
++		 */
++		dma_cache_wback_inv((unsigned long) prev, PAGE_SIZE);
++	}
++	buf->info.desc.pbuf = PHYSADDR(&buf->data);
++	buf->info.desc.cntinfo = cntinfo;
++	buf->info.cnt = 0;
++	buf->info.next = codec->head;
++	buf->info.desc.pnext = PHYSADDR(codec->head);
++	dma_cache_wback_inv((unsigned long) buf, PAGE_SIZE);
++	
++	return 0;
++}
++
++#define hal2_free_dac_dmabuf(hal2)	hal2_free_dmabuf(hal2, 1)
++#define hal2_free_adc_dmabuf(hal2)	hal2_free_dmabuf(hal2, 0)
++static void hal2_free_dmabuf(hal2_card_t *hal2, int is_dac)
++{
++	hal2_buf_t *buf, *next;
++	hal2_codec_t *codec = (is_dac) ? &hal2->dac : &hal2->adc;
++
++	if (!codec->head)
++		return;
++	
++	buf = codec->head->info.next;
++	codec->head->info.next = NULL;
++	while (buf) {
++		next = buf->info.next;
++		free_page((unsigned long) buf);
++		buf = next;
++	}
++	codec->head = codec->tail = NULL;
++}
++
++/* 
++ * Add 'count' bytes to 'buffer' from DMA ring buffers. Return number of
++ * bytes added or -EFAULT if copy_from_user failed.
++ */
++static int hal2_get_buffer(hal2_card_t *hal2, char *buffer, int count)
++{
++	unsigned long flags;
++	int size, ret = 0;
++	hal2_codec_t *adc = &hal2->adc;
++	
++	spin_lock_irqsave(&adc->lock, flags);
++	
++	DEBUG("getting %d bytes ", count);
++
++	/* enable DMA stream if there are no data */
++	if (!(adc->pbus.pbus->pbdma_ctrl & HPC3_PDMACTRL_ISACT) &&
++	    adc->tail->info.cnt == 0)
++		hal2_start_adc(hal2);
++
++	DEBUG("... ");
++
++	while (adc->tail->info.cnt > 0 && count > 0) {
++		size = min(adc->tail->info.cnt, count);
++		spin_unlock_irqrestore(&adc->lock, flags);
++
++		if (copy_to_user(buffer, &adc->tail->data[H2_BUFFER_SIZE-size],
++				 size)) {
++			ret = -EFAULT;
++			goto out;
++		}
++
++		spin_lock_irqsave(&adc->lock, flags);
++		
++		adc->tail->info.cnt -= size;
++		/* buffer is empty, update tail pointer */
++		if (adc->tail->info.cnt == 0) {
++			adc->tail->info.desc.cntinfo = HPCDMA_XIE |
++						       H2_BUFFER_SIZE;
++			dma_cache_wback_inv((unsigned long) adc->tail,
++					    sizeof(struct hpc_dma_desc));
++			adc->tail = adc->tail->info.next;
++			/* enable DMA stream again if needed */
++			if (!(adc->pbus.pbus->pbdma_ctrl & HPC3_PDMACTRL_ISACT))
++				hal2_start_adc(hal2);
++
++		}
++		buffer += size;
++		ret += size;
++		count -= size;
++
++		DEBUG("(%d) ", size);
++	}
++	spin_unlock_irqrestore(&adc->lock, flags);
++out:	
++	DEBUG("\n");
++	
++	return ret;
++} 
++
++/* 
++ * Add 'count' bytes from 'buffer' to DMA ring buffers. Return number of
++ * bytes added or -EFAULT if copy_from_user failed.
++ */
++static int hal2_add_buffer(hal2_card_t *hal2, char *buffer, int count)
++{
++	unsigned long flags;
++	int size, ret = 0;
++	hal2_codec_t *dac = &hal2->dac;
++	
++	spin_lock_irqsave(&dac->lock, flags);
++	
++	DEBUG("adding %d bytes ", count);
++
++	while (dac->head->info.cnt == 0 && count > 0) {
++		size = min((int)H2_BUFFER_SIZE, count);
++		spin_unlock_irqrestore(&dac->lock, flags);
++		
++		if (copy_from_user(dac->head->data, buffer, size)) {
++			ret = -EFAULT;
++			goto out;
++		}
++		spin_lock_irqsave(&dac->lock, flags);
++
++		dac->head->info.desc.cntinfo = size | HPCDMA_XIE;
++		dac->head->info.cnt = size;
++		dma_cache_wback_inv((unsigned long) dac->head, 
++				    size + PAGE_SIZE - H2_BUFFER_SIZE);
++		buffer += size;
++		ret += size;
++		count -= size;
++		dac->head = dac->head->info.next;
++
++		DEBUG("(%d) ", size);
++	}
++	if (!(dac->pbus.pbus->pbdma_ctrl & HPC3_PDMACTRL_ISACT) && ret > 0)
++		hal2_start_dac(hal2);
++	
++	spin_unlock_irqrestore(&dac->lock, flags);
++out:	
++	DEBUG("\n");
++	
++	return ret;
++}
++
++#define hal2_reset_dac_pointer(hal2)	hal2_reset_pointer(hal2, 1)
++#define hal2_reset_adc_pointer(hal2)	hal2_reset_pointer(hal2, 0)
++static void hal2_reset_pointer(hal2_card_t *hal2, int is_dac)
++{
++	hal2_codec_t *codec = (is_dac) ? &hal2->dac : &hal2->adc;
++	
++	DEBUG("hal2_reset_pointer\n");
++
++	codec->tail = codec->head;
++	do {
++		codec->tail->info.desc.cntinfo = HPCDMA_XIE | (is_dac) ? 
++						 HPCDMA_EOX : H2_BUFFER_SIZE;
++		codec->tail->info.cnt = 0;
++		dma_cache_wback_inv((unsigned long) codec->tail, 
++				    sizeof(struct hpc_dma_desc));
++		codec->tail = codec->tail->info.next;
++	} while (codec->tail != codec->head);
++}
++
++static int hal2_sync_dac(hal2_card_t *hal2)
++{
++	DECLARE_WAITQUEUE(wait, current);
++	hal2_codec_t *dac = &hal2->dac;
++	int ret = 0;
++	signed long timeout = 1000 * H2_BUFFER_SIZE * 2 * dac->voices *
++			      HZ / dac->sample_rate / 900;
++
++	down(&dac->sem);
++	
++	while (dac->pbus.pbus->pbdma_ctrl & HPC3_PDMACTRL_ISACT) {
++		add_wait_queue(&dac->dma_wait, &wait);
++		set_current_state(TASK_INTERRUPTIBLE);
++		if (!schedule_timeout(timeout))
++			/* We may get bogus timeout when system is 
++			 * heavily loaded */
++			if (dac->tail->info.cnt) {
++				printk("HAL2: timeout...\n");
++				ret = -ETIME;
++			}
++		if (signal_pending(current))
++			ret = -ERESTARTSYS;
++		if (ret) {
++			hal2_stop_dac(hal2);
++			hal2_reset_dac_pointer(hal2);
++		}
++		remove_wait_queue(&dac->dma_wait, &wait);
++	}
++
++	up(&dac->sem);
++	
++	return ret;
++}
++
++static int hal2_write_mixer(hal2_card_t *hal2, int index, int vol)
++{
++	unsigned int l, r;
++
++	DEBUG_MIX("mixer %d write\n", index);
++	
++	if (index >= SOUND_MIXER_NRDEVICES || !mixtable[index].avail)
++		return -EINVAL;
++
++	r = (vol >> 8) & 0xff;
++	if (r > 100)
++		r = 100;
++	l = vol & 0xff;
++	if (l > 100)
++		l = 100;
++	
++	hal2->mixer.volume[mixtable[index].idx] = l | (r << 8);
++
++	switch (mixtable[index].idx) {
++	case H2_MIX_OUTPUT_ATT: {
++
++		DEBUG_MIX("output attenuator %d,%d\n", l, r);
++
++		if (r | l) {
++			unsigned int tmp = hal2_i_look32(hal2, H2I_DAC_C2); 
++		
++			tmp &= ~(H2I_C2_L_ATT_M | H2I_C2_R_ATT_M | H2I_C2_MUTE);
++
++			/* Attenuator has five bits */
++			l = (31 * (100 - l) / 99);
++			r = (31 * (100 - r) / 99);
++			
++			DEBUG_MIX("left: %d, right %d\n", l, r);
++
++			tmp |= (l << H2I_C2_L_ATT_SHIFT) & H2I_C2_L_ATT_M;
++			tmp |= (r << H2I_C2_R_ATT_SHIFT) & H2I_C2_R_ATT_M;
++			hal2_i_write32(hal2, H2I_DAC_C2, tmp);
++		} else 
++			hal2_i_setbit32(hal2, H2I_DAC_C2, H2I_C2_MUTE);
++	}
++	case H2_MIX_INPUT_GAIN: {
++		/* TODO */
++	}
++	}
++	return 0;
++}
++
++static void hal2_init_mixer(hal2_card_t *hal2)
++{
++	int i;
++
++	for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
++		hal2_write_mixer(hal2, i, 100 | (100 << 8));
++		
++}
++
++static int hal2_mixer_ioctl(hal2_card_t *hal2, unsigned int cmd, 
++			    unsigned long arg)
++{
++	int val;
++
++        if (cmd == SOUND_MIXER_INFO) {
++		mixer_info info;
++		
++		strncpy(info.id, hal2str, sizeof(info.id));
++		strncpy(info.name, hal2str, sizeof(info.name));
++		info.modify_counter = hal2->mixer.modcnt;
++		if (copy_to_user((void *)arg, &info, sizeof(info)))
++			return -EFAULT;
++		return 0;
++	}
++	if (cmd == SOUND_OLD_MIXER_INFO) {
++		_old_mixer_info info;
++		
++		strncpy(info.id, hal2str, sizeof(info.id));
++		strncpy(info.name, hal2str, sizeof(info.name));
++		if (copy_to_user((void *)arg, &info, sizeof(info)))
++			return -EFAULT;
++		return 0;
++	}
++	if (cmd == OSS_GETVERSION)
++		return put_user(SOUND_VERSION, (int *)arg);
++
++	if (_IOC_TYPE(cmd) != 'M' || _IOC_SIZE(cmd) != sizeof(int))
++                return -EINVAL;
++
++        if (_IOC_DIR(cmd) == _IOC_READ) {
++                switch (_IOC_NR(cmd)) {
++		/* Give the current record source */
++		case SOUND_MIXER_RECSRC:
++			val = 0;	/* FIXME */
++			break;
++		/* Give the supported mixers, all of them support stereo */
++                case SOUND_MIXER_DEVMASK:
++                case SOUND_MIXER_STEREODEVS: {
++			int i;
++			
++			for (val = i = 0; i < SOUND_MIXER_NRDEVICES; i++)
++				if (mixtable[i].avail)
++					val |= 1 << i;
++			break;
++			}
++		/* Arg contains a bit for each supported recording source */
++                case SOUND_MIXER_RECMASK:
++			val = 0;
++			break;
++                case SOUND_MIXER_CAPS:
++			val = 0;
++			break;
++		/* Read a specific mixer */
++		default: {
++			int i = _IOC_NR(cmd);
++			
++			if (i >= SOUND_MIXER_NRDEVICES || !mixtable[i].avail)
++				return -EINVAL;
++			val = hal2->mixer.volume[mixtable[i].idx];
++			break;
++			}
++		}
++		return put_user(val, (int *)arg);
++	}
++	
++        if (_IOC_DIR(cmd) != (_IOC_WRITE|_IOC_READ))
++		return -EINVAL;
++	
++	hal2->mixer.modcnt++;
++
++	if (get_user(val, (int *)arg))
++		return -EFAULT;
++
++	switch (_IOC_NR(cmd)) {
++	/* Arg contains a bit for each recording source */
++	case SOUND_MIXER_RECSRC:
++		return 0;	/* FIXME */
++	default:
++		return hal2_write_mixer(hal2, _IOC_NR(cmd), val);
++	}
++
++	return 0;
++}
++
++static int hal2_open_mixdev(struct inode *inode, struct file *file)
++{
++	hal2_card_t *hal2 = hal2_mixer_find_card(MINOR(inode->i_rdev));
++
++	if (hal2) {
++		file->private_data = hal2;
++		return 0;
++	}
++	return -ENODEV;
++}
++
++static int hal2_release_mixdev(struct inode *inode, struct file *file)
++{
++	return 0;
++}
++
++static int hal2_ioctl_mixdev(struct inode *inode, struct file *file,
++			     unsigned int cmd, unsigned long arg)
++{
++	return hal2_mixer_ioctl((hal2_card_t *)file->private_data, cmd, arg);
++}
++
++
++static int hal2_ioctl(struct inode *inode, struct file *file, 
++		      unsigned int cmd, unsigned long arg)
++{
++	int val;
++	hal2_card_t *hal2 = (hal2_card_t *) file->private_data;
++
++	switch (cmd) {
++	case OSS_GETVERSION:
++		return put_user(SOUND_VERSION, (int *)arg);
++		
++	case SNDCTL_DSP_SYNC:
++		if (file->f_mode & FMODE_WRITE)
++			return hal2_sync_dac(hal2);
++		return 0;
++		
++	case SNDCTL_DSP_SETDUPLEX:
++		return 0;
++
++	case SNDCTL_DSP_GETCAPS:
++		return put_user(DSP_CAP_DUPLEX | DSP_CAP_MULTI, (int *)arg);
++		
++	case SNDCTL_DSP_RESET:
++		if (file->f_mode & FMODE_READ) {
++			hal2_stop_adc(hal2);
++			hal2_reset_adc_pointer(hal2);
++		}
++		if (file->f_mode & FMODE_WRITE) {
++			hal2_stop_dac(hal2);
++			hal2_reset_dac_pointer(hal2);
++		}
++		return 0;
++
++ 	case SNDCTL_DSP_SPEED:
++		if (get_user(val, (int *)arg))
++			return -EFAULT;
++		if (file->f_mode & FMODE_READ) {
++			hal2_stop_adc(hal2);
++			val = hal2_compute_rate(&hal2->adc, val);
++			hal2->adc.sample_rate = val;
++			hal2_set_adc_rate(hal2);
++		}
++		if (file->f_mode & FMODE_WRITE) {
++			hal2_stop_dac(hal2);
++			val = hal2_compute_rate(&hal2->dac, val);
++			hal2->dac.sample_rate = val;
++			hal2_set_dac_rate(hal2);
++		}
++		return put_user(val, (int *)arg);
++		
++	case SNDCTL_DSP_STEREO:
++		if (get_user(val, (int *)arg))
++			return -EFAULT;
++		if (file->f_mode & FMODE_READ) {
++			hal2_stop_adc(hal2);
++			hal2->adc.voices = (val) ? 2 : 1;
++			hal2_setup_adc(hal2);
++		}
++		if (file->f_mode & FMODE_WRITE) {
++			hal2_stop_dac(hal2);
++			hal2->dac.voices = (val) ? 2 : 1;
++			hal2_setup_dac(hal2);
++                }
++		return 0;
++
++	case SNDCTL_DSP_CHANNELS:
++		if (get_user(val, (int *)arg))
++			return -EFAULT;
++		if (val != 0) {
++			if (file->f_mode & FMODE_READ) {
++				hal2_stop_adc(hal2);
++				hal2->adc.voices = (val == 1) ? 1 : 2;
++				hal2_setup_adc(hal2);
++			}
++			if (file->f_mode & FMODE_WRITE) {
++				hal2_stop_dac(hal2);
++				hal2->dac.voices = (val == 1) ? 1 : 2;
++				hal2_setup_dac(hal2);
++			}
++		}
++		val = -EINVAL;
++		if (file->f_mode & FMODE_READ)
++			val = hal2->adc.voices;
++		if (file->f_mode & FMODE_WRITE)
++			val = hal2->dac.voices;
++		return put_user(val, (int *)arg);
++		
++	case SNDCTL_DSP_GETFMTS: /* Returns a mask */
++                return put_user(H2_SUPPORTED_FORMATS, (int *)arg);
++		
++	case SNDCTL_DSP_SETFMT: /* Selects ONE fmt*/
++		if (get_user(val, (int *)arg))
++			return -EFAULT;
++		if (val != AFMT_QUERY) {
++			if (!(val & H2_SUPPORTED_FORMATS))
++				return -EINVAL;
++			if (file->f_mode & FMODE_READ) {
++				hal2_stop_adc(hal2);
++				hal2->adc.format = val;
++				hal2_setup_adc(hal2);
++			}
++			if (file->f_mode & FMODE_WRITE) {
++				hal2_stop_dac(hal2);
++				hal2->dac.format = val;
++				hal2_setup_dac(hal2);
++			}
++		} else {
++			val = -EINVAL;
++			if (file->f_mode & FMODE_READ)
++				val = hal2->adc.format;
++			if (file->f_mode & FMODE_WRITE)
++				val = hal2->dac.format;
++		}
++		return put_user(val, (int *)arg);
++		
++	case SNDCTL_DSP_POST:
++		return 0;
++
++	case SNDCTL_DSP_GETOSPACE: {
++		unsigned long flags;
++		audio_buf_info info;
++		hal2_buf_t *buf;
++		hal2_codec_t *dac = &hal2->dac;
++		
++		if (!(file->f_mode & FMODE_WRITE))
++			return -EINVAL;
++		
++		spin_lock_irqsave(&dac->lock, flags);
++		info.fragments = 0;
++		buf = dac->head;
++		while (buf->info.cnt == 0 && buf != dac->tail) {
++			info.fragments++;
++			buf = buf->info.next;
++		}
++		spin_unlock_irqrestore(&dac->lock, flags);
++		
++		info.fragstotal = obuffers;
++		info.fragsize = H2_BUFFER_SIZE;
++                info.bytes = info.fragsize * info.fragments;
++
++		return copy_to_user((void *)arg, &info, sizeof(info)) ? -EFAULT : 0;
++	}
++			   
++	case SNDCTL_DSP_GETISPACE: {
++		unsigned long flags;
++		audio_buf_info info;
++		hal2_buf_t *buf;
++		hal2_codec_t *adc = &hal2->adc;
++			
++		if (!(file->f_mode & FMODE_READ))
++			return -EINVAL;
++		
++		spin_lock_irqsave(&adc->lock, flags);
++		info.fragments = 0;
++		info.bytes = 0;
++		buf = adc->tail;
++		while (buf->info.cnt > 0 && buf != adc->head) {
++			info.fragments++;
++			info.bytes += buf->info.cnt;
++			buf = buf->info.next;
++		}
++		spin_unlock_irqrestore(&adc->lock, flags);
++
++		info.fragstotal = ibuffers;
++		info.fragsize = H2_BUFFER_SIZE;
++		
++		return copy_to_user((void *)arg, &info, sizeof(info)) ? -EFAULT : 0;
++	}
++
++	case SNDCTL_DSP_NONBLOCK:
++		file->f_flags |= O_NONBLOCK;
++		return 0;
++		
++	case SNDCTL_DSP_GETBLKSIZE:
++		return put_user(H2_BUFFER_SIZE, (int *)arg);
++	
++	case SNDCTL_DSP_SETFRAGMENT:
++		return 0;
++
++	case SOUND_PCM_READ_RATE:
++		val = -EINVAL;
++		if (file->f_mode & FMODE_READ)
++			val = hal2->adc.sample_rate;
++		if (file->f_mode & FMODE_WRITE)
++			val = hal2->dac.sample_rate;
++		return put_user(val, (int *)arg);
++
++	case SOUND_PCM_READ_CHANNELS:
++		val = -EINVAL;
++		if (file->f_mode & FMODE_READ)
++			val = hal2->adc.voices;
++		if (file->f_mode & FMODE_WRITE)
++			val = hal2->dac.voices;
++		return put_user(val, (int *)arg);
++
++	case SOUND_PCM_READ_BITS:
++		val = 16;
++		return put_user(val, (int *)arg);
++	}
++	
++	return hal2_mixer_ioctl(hal2, cmd, arg);
++}
++
++static ssize_t hal2_read(struct file *file, char *buffer,
++			 size_t count, loff_t *ppos)
++{
++	ssize_t err;
++	hal2_card_t *hal2 = (hal2_card_t *) file->private_data;
++	hal2_codec_t *adc = &hal2->adc;
++
++	if (count == 0)
++		return 0;
++	if (ppos != &file->f_pos)
++		return -ESPIPE;
++	
++	down(&adc->sem);
++	
++	if (file->f_flags & O_NONBLOCK) {
++		err = hal2_get_buffer(hal2, buffer, count);
++		err = err == 0 ? -EAGAIN : err;
++	} else {
++		do {
++			/* ~10% longer */
++			signed long timeout = 1000 * H2_BUFFER_SIZE *
++				2 * adc->voices * HZ / adc->sample_rate / 900;
++			DECLARE_WAITQUEUE(wait, current);
++			ssize_t cnt = 0;
++			
++			err = hal2_get_buffer(hal2, buffer, count);
++			if (err > 0) {
++				count -= err;
++				cnt += err;
++				buffer += err;
++				err = cnt;
++			}
++			if (count > 0 && err >= 0) {
++				add_wait_queue(&adc->dma_wait, &wait);
++				set_current_state(TASK_INTERRUPTIBLE);
++				/* Well, it is possible, that interrupt already
++				 * arrived. Hmm, shit happens, we have one more
++				 * buffer filled ;) */
++				if (!schedule_timeout(timeout))
++					/* We may get bogus timeout when system
++					 * is heavily loaded */
++					if (!adc->tail->info.cnt) {
++						printk("HAL2: timeout...\n");
++						hal2_stop_adc(hal2);
++						hal2_reset_adc_pointer(hal2);
++						err = -EAGAIN;
++					}
++				if (signal_pending(current))
++					err = -ERESTARTSYS;
++				remove_wait_queue(&adc->dma_wait, &wait);
++			}
++		} while (count > 0 && err >= 0);
++	
++	}
++	
++	up(&adc->sem);
++	
++	return err;
++}
++
++static ssize_t hal2_write(struct file *file, const char *buffer,
++			  size_t count, loff_t *ppos)
++{
++	ssize_t err;
++	char *buf = (char*) buffer;
++	hal2_card_t *hal2 = (hal2_card_t *) file->private_data;
++	hal2_codec_t *dac = &hal2->dac;
++
++	if (count == 0)
++		return 0;
++	if (ppos != &file->f_pos)
++		return -ESPIPE;
++
++	down(&dac->sem);
++
++	if (file->f_flags & O_NONBLOCK) {
++		err = hal2_add_buffer(hal2, buf, count);
++		err = err == 0 ? -EAGAIN : err;
++	} else {
++		do {
++			/* ~10% longer */
++			signed long timeout = 1000 * H2_BUFFER_SIZE *
++				2 * dac->voices * HZ / dac->sample_rate / 900;
++			DECLARE_WAITQUEUE(wait, current);
++			ssize_t cnt = 0;
++			
++			err = hal2_add_buffer(hal2, buf, count);
++			if (err > 0) {
++				count -= err;
++				cnt += err;
++				buf += err;
++				err = cnt;
++			}
++			if (count > 0 && err >= 0) {
++				add_wait_queue(&dac->dma_wait, &wait);
++				set_current_state(TASK_INTERRUPTIBLE);
++				/* Well, it is possible, that interrupt already
++				 * arrived. Hmm, shit happens, we have one more
++				 * buffer free ;) */
++				if (!schedule_timeout(timeout))
++					/* We may get bogus timeout when system
++					 * is heavily loaded */
++					if (dac->head->info.cnt) {
++						printk("HAL2: timeout...\n");
++						hal2_stop_dac(hal2);
++						hal2_reset_dac_pointer(hal2);
++						err = -EAGAIN;
++					}
++				if (signal_pending(current))
++					err = -ERESTARTSYS;
++				remove_wait_queue(&dac->dma_wait, &wait);
++			}
++		} while (count > 0 && err >= 0);
++	}
++	
++	up(&dac->sem);
++
++	return err;
++}
++
++static unsigned int hal2_poll(struct file *file, struct poll_table_struct *wait)
++{
++	unsigned long flags;
++	unsigned int mask = 0;
++	hal2_card_t *hal2 = (hal2_card_t *) file->private_data;
++
++	if (file->f_mode & FMODE_READ) {
++		hal2_codec_t *adc = &hal2->adc;
++		
++		poll_wait(file, &hal2->adc.dma_wait, wait);
++		spin_lock_irqsave(&adc->lock, flags);
++		if (adc->tail->info.cnt > 0)
++			mask |= POLLIN;
++		spin_unlock_irqrestore(&adc->lock, flags);
++	}
++	
++	if (file->f_mode & FMODE_WRITE) {
++		hal2_codec_t *dac = &hal2->dac;
++		
++		poll_wait(file, &dac->dma_wait, wait);
++		spin_lock_irqsave(&dac->lock, flags);
++		if (dac->head->info.cnt == 0)
++			mask |= POLLOUT;
++		spin_unlock_irqrestore(&dac->lock, flags);
++	}
++	
++	return mask;
++}
++
++static int hal2_open(struct inode *inode, struct file *file)
++{
++	int err;
++	hal2_card_t *hal2 = hal2_dsp_find_card(MINOR(inode->i_rdev));
++
++	DEBUG("opening audio device.\n");
++
++	if (!hal2) {
++		printk("HAL2: Whee?! Open door and go away!\n");
++		return -ENODEV;
++	}
++	file->private_data = hal2;
++
++	if (file->f_mode & FMODE_READ) {
++		if (hal2->adc.usecount)
++			return -EBUSY;
++		
++		/* OSS spec wanted us to use 8 bit, 8 kHz mono by default,
++		 * but HAL2 can't do 8bit audio */
++		hal2->adc.format = AFMT_S16_BE;
++		hal2->adc.voices = 1;
++		hal2->adc.sample_rate = hal2_compute_rate(&hal2->adc, 8000);
++		hal2_set_adc_rate(hal2);
++
++		/* alloc DMA buffers */
++		err = hal2_alloc_adc_dmabuf(hal2);
++		if (err)
++			return err;
++		hal2_setup_adc(hal2);
++
++		hal2->adc.usecount++;
++	}
++
++	if (file->f_mode & FMODE_WRITE) {
++		if (hal2->dac.usecount)
++			return -EBUSY;
++
++		hal2->dac.format = AFMT_S16_BE;
++		hal2->dac.voices = 1;
++		hal2->dac.sample_rate = hal2_compute_rate(&hal2->dac, 8000);
++		hal2_set_dac_rate(hal2);
++
++		/* alloc DMA buffers */
++		err = hal2_alloc_dac_dmabuf(hal2);
++		if (err)
++			return err;
++		hal2_setup_dac(hal2);
++		
++		hal2->dac.usecount++;
++	}
++	
++	return 0;
++}
++
++static int hal2_release(struct inode *inode, struct file *file)
++{
++	hal2_card_t *hal2 = (hal2_card_t *) file->private_data;
++
++	if (file->f_mode & FMODE_READ) {
++		hal2_stop_adc(hal2);
++		hal2_free_adc_dmabuf(hal2);
++		hal2->adc.usecount--;
++	}
++
++	if (file->f_mode & FMODE_WRITE) {
++		hal2_sync_dac(hal2);
++		hal2_free_dac_dmabuf(hal2);
++		hal2->dac.usecount--;
++	}
++
++	return 0;
++}
++
++static struct file_operations hal2_audio_fops = {
++	owner:		THIS_MODULE,
++	llseek:		no_llseek,
++	read:		hal2_read,
++	write:		hal2_write,
++	poll:		hal2_poll,
++	ioctl:		hal2_ioctl,
++	open:		hal2_open,
++	release:	hal2_release,
++};
++
++static struct file_operations hal2_mixer_fops = {
++	owner:		THIS_MODULE,
++	llseek:		no_llseek,
++	ioctl:		hal2_ioctl_mixdev,
++	open:		hal2_open_mixdev,
++	release:	hal2_release_mixdev,
++};
++
++static int hal2_request_irq(hal2_card_t *hal2, int irq)
++{
++	unsigned long flags;
++	int ret = 0;
++
++	save_and_cli(flags);
++	if (request_irq(irq, hal2_interrupt, SA_SHIRQ, hal2str, hal2)) {
++		printk(KERN_ERR "HAL2: Can't get irq %d\n", irq);
++		ret = -EAGAIN;
++	}
++	restore_flags(flags);
++	return ret;
++}
++
++static int hal2_alloc_resources(hal2_card_t *hal2, struct hpc3_regs *hpc3)
++{
++	hal2_pbus_t *pbus;
++
++	pbus = &hal2->dac.pbus;
++	pbus->pbusnr = 0;
++	pbus->pbus = &hpc3->pbdma[pbus->pbusnr];
++	/* The spec says that we should write 0x08248844 but that's WRONG. HAL2
++	 * does 8 bit DMA, not 16 bit even if it generates 16 bit audio. */
++	hpc3->pbus_dmacfgs[pbus->pbusnr][0] = 0x08208844;	/* Magic :-) */
++
++	pbus = &hal2->adc.pbus;
++	pbus->pbusnr = 1;
++	pbus->pbus = &hpc3->pbdma[pbus->pbusnr];
++	hpc3->pbus_dmacfgs[pbus->pbusnr][0] = 0x08208844;	/* Magic :-) */
++
++	return hal2_request_irq(hal2, SGI_HPCDMA_IRQ);
++}
++
++static void hal2_init_codec(hal2_codec_t *codec)
++{
++	init_waitqueue_head(&codec->dma_wait);
++	init_MUTEX(&codec->sem);
++	spin_lock_init(&codec->lock);
++}
++
++static void hal2_free_resources(hal2_card_t *hal2)
++{
++	free_irq(SGI_HPCDMA_IRQ, hal2);
++}
++
++static int hal2_detect(hal2_card_t *hal2)
++{
++	unsigned short board, major, minor;
++	unsigned short rev;
++
++	/* reset HAL2 */
++	hal2_isr_write(hal2, 0);
++
++	/* release reset */
++	hal2_isr_write(hal2, H2_ISR_GLOBAL_RESET_N | H2_ISR_CODEC_RESET_N);
++
++	hal2_i_write16(hal2, H2I_RELAY_C, H2I_RELAY_C_STATE); 
++
++	if ((rev = hal2_rev_look(hal2)) & H2_REV_AUDIO_PRESENT) {
++		DEBUG("HAL2: no device detected, rev: 0x%04hx\n", rev);
++		return -ENODEV;
++	}
++
++	board = (rev & H2_REV_BOARD_M) >> 12;
++	major = (rev & H2_REV_MAJOR_CHIP_M) >> 4;
++	minor = (rev & H2_REV_MINOR_CHIP_M);
++
++	printk("SGI HAL2 Processor revision %i.%i.%i detected\n",
++	       board, major, minor);
++
++	if (board != 4 || major != 1 || minor != 0) 
++		printk( "Other revision than 4.1.0 detected. "
++			"Your card is probably unsupported\n");
++
++	return 0;
++}
++
++static int hal2_init_card(hal2_card_t **phal2, struct hpc3_regs *hpc3,
++			  unsigned long hpc3_base)
++{
++	int ret = 0;
++	hal2_card_t *hal2;
++	
++	hal2 = (hal2_card_t *) kmalloc(sizeof(hal2_card_t), GFP_KERNEL);
++	if (!hal2)
++		return -ENOMEM;
++	memset(hal2, 0, sizeof(hal2_card_t));
++
++	hal2->ctl_regs = (hal2_ctl_regs_t *) KSEG1ADDR(hpc3_base + H2_CTL_PIO);
++	hal2->aes_regs = (hal2_aes_regs_t *) KSEG1ADDR(hpc3_base + H2_AES_PIO);
++	hal2->vol_regs = (hal2_vol_regs_t *) KSEG1ADDR(hpc3_base + H2_VOL_PIO);
++	hal2->syn_regs = (hal2_syn_regs_t *) KSEG1ADDR(hpc3_base + H2_SYN_PIO);
++
++	if (hal2_detect(hal2) < 0) {
++		printk("HAL2 audio processor not found\n");
++		ret = -ENODEV;
++		goto fail1;
++	}
++
++	hal2_init_codec(&hal2->dac);
++	hal2_init_codec(&hal2->adc);
++
++	ret = hal2_alloc_resources(hal2, hpc3);
++	if (ret)
++		goto fail1;
++	
++	hal2_init_mixer(hal2);
++
++	hal2->dev_dsp = register_sound_dsp(&hal2_audio_fops, -1);
++	if (hal2->dev_dsp < 0) {
++		ret = hal2->dev_dsp;
++		goto fail2;
++	}
++
++	hal2->dev_mixer = register_sound_mixer(&hal2_mixer_fops, -1);
++	if (hal2->dev_mixer < 0) {
++		ret = hal2->dev_mixer;
++		goto fail3;
++	}
++	
++	*phal2 = hal2;
++	return 0;
++fail3:
++	unregister_sound_dsp(hal2->dev_dsp);
++fail2:
++	hal2_free_resources(hal2);
++fail1:
++	kfree(hal2);
++	
++	return ret;
++}
++
++/* 
++ * We are assuming only one HAL2 card. If you ever meet machine with more than
++ * one, tell immediately about it to someone. Preferably to me. --ladis
++ */
++static int __init init_hal2(void)
++{
++	int i;
++
++	for (i = 0; i < MAXCARDS; i++)
++		hal2_card[i] = NULL;
++
++	return hal2_init_card(&hal2_card[0], hpc3c0, HPC3_CHIP0_PBASE);
++}
++
++static void __exit exit_hal2(void)
++{
++	int i;
++	
++	for (i = 0; i < MAXCARDS; i++)
++		if (hal2_card[i]) {
++			hal2_free_resources(hal2_card[i]);
++			unregister_sound_dsp(hal2_card[i]->dev_dsp);
++			unregister_sound_mixer(hal2_card[i]->dev_mixer);
++			kfree(hal2_card[i]);
++	}
++}
++
++module_init(init_hal2);
++module_exit(exit_hal2);
++
++MODULE_DESCRIPTION("OSS compatible driver for SGI HAL2 audio");
++MODULE_AUTHOR("Ladislav Michl");
++MODULE_LICENSE("GPL");
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/sound/oss/hal2.h	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,328 @@
++#ifndef __HAL2_H
++#define __HAL2_H
++
++/*
++ *  Driver for HAL2 sound processors
++ *  Copyright (c) 1999 Ulf Carlsson <ulfc@bun.falkenberg.se>
++ *  Copyright (c) 2001 Ladislav Michl <ladis@psi.cz>
++ *
++ *  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.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++#include <asm/addrspace.h>
++#include <asm/sgi/sgihpc.h>
++#include <linux/spinlock.h>
++#include <linux/types.h>
++
++#define H2_HAL2_BASE		0x58000
++#define H2_CTL_PIO		(H2_HAL2_BASE + 0 * 0x400)
++#define H2_AES_PIO		(H2_HAL2_BASE + 1 * 0x400)
++#define H2_VOL_PIO		(H2_HAL2_BASE + 2 * 0x400)
++#define H2_SYN_PIO		(H2_HAL2_BASE + 3 * 0x400)
++
++/* Indirect status register */
++
++#define H2_ISR_TSTATUS		0x01	/* RO: transaction status 1=busy */
++#define H2_ISR_USTATUS		0x02	/* RO: utime status bit 1=armed */
++#define H2_ISR_QUAD_MODE	0x04	/* codec mode 0=indigo 1=quad */
++#define H2_ISR_GLOBAL_RESET_N	0x08	/* chip global reset 0=reset */
++#define H2_ISR_CODEC_RESET_N	0x10	/* codec/synth reset 0=reset  */
++
++/* Revision register */
++
++#define H2_REV_AUDIO_PRESENT	0x8000	/* RO: audio present 0=present */
++#define H2_REV_BOARD_M		0x7000	/* RO: bits 14:12, board revision */
++#define H2_REV_MAJOR_CHIP_M	0x00F0	/* RO: bits 7:4, major chip revision */
++#define H2_REV_MINOR_CHIP_M	0x000F	/* RO: bits 3:0, minor chip revision */
++
++/* Indirect address register */
++
++/*
++ * Address of indirect internal register to be accessed. A write to this
++ * register initiates read or write access to the indirect registers in the
++ * HAL2. Note that there af four indirect data registers for write access to
++ * registers larger than 16 byte.
++ */
++
++#define H2_IAR_TYPE_M		0xF000	/* bits 15:12, type of functional */
++					/* block the register resides in */
++					/* 1=DMA Port */
++					/* 9=Global DMA Control */
++					/* 2=Bresenham */
++					/* 3=Unix Timer */
++#define H2_IAR_NUM_M		0x0F00	/* bits 11:8 instance of the */
++					/* blockin which the indirect */
++					/* register resides */
++					/* If IAR_TYPE_M=DMA Port: */
++					/* 1=Synth In */
++					/* 2=AES In */
++					/* 3=AES Out */
++					/* 4=DAC Out */
++					/* 5=ADC Out */
++					/* 6=Synth Control */
++					/* If IAR_TYPE_M=Global DMA Control: */
++					/* 1=Control */
++					/* If IAR_TYPE_M=Bresenham: */
++					/* 1=Bresenham Clock Gen 1 */
++					/* 2=Bresenham Clock Gen 2 */
++					/* 3=Bresenham Clock Gen 3 */
++					/* If IAR_TYPE_M=Unix Timer: */
++					/* 1=Unix Timer */
++#define H2_IAR_ACCESS_SELECT	0x0080	/* 1=read 0=write */
++#define H2_IAR_PARAM		0x000C	/* Parameter Select */
++#define H2_IAR_RB_INDEX_M	0x0003	/* Read Back Index */
++					/* 00:word0 */
++					/* 01:word1 */
++					/* 10:word2 */
++					/* 11:word3 */
++/*
++ * HAL2 internal addressing
++ *
++ * The HAL2 has "indirect registers" (idr) which are accessed by writing to the
++ * Indirect Data registers. Write the address to the Indirect Address register
++ * to transfer the data.
++ *
++ * We define the H2IR_* to the read address and H2IW_* to the write address and
++ * H2I_* to be fields in whatever register is referred to.
++ *
++ * When we write to indirect registers which are larger than one word (16 bit)
++ * we have to fill more than one indirect register before writing. When we read
++ * back however we have to read several times, each time with different Read
++ * Back Indexes (there are defs for doing this easily).
++ */
++
++/*
++ * Relay Control
++ */
++#define H2I_RELAY_C		0x9100
++#define H2I_RELAY_C_STATE	0x01		/* state of RELAY pin signal */
++
++/* DMA port enable */
++
++#define H2I_DMA_PORT_EN		0x9104
++#define H2I_DMA_PORT_EN_SY_IN	0x01		/* Synth_in DMA port */
++#define H2I_DMA_PORT_EN_AESRX	0x02		/* AES receiver DMA port */
++#define H2I_DMA_PORT_EN_AESTX	0x04		/* AES transmitter DMA port */
++#define H2I_DMA_PORT_EN_CODECTX	0x08		/* CODEC transmit DMA port */
++#define H2I_DMA_PORT_EN_CODECR	0x10		/* CODEC receive DMA port */
++
++#define H2I_DMA_END		0x9108 		/* global dma endian select */
++#define H2I_DMA_END_SY_IN	0x01		/* Synth_in DMA port */
++#define H2I_DMA_END_AESRX	0x02		/* AES receiver DMA port */
++#define H2I_DMA_END_AESTX	0x04		/* AES transmitter DMA port */
++#define H2I_DMA_END_CODECTX	0x08		/* CODEC transmit DMA port */
++#define H2I_DMA_END_CODECR	0x10		/* CODEC receive DMA port */
++						/* 0=b_end 1=l_end */
++
++#define H2I_DMA_DRV		0x910C  	/* global PBUS DMA enable */
++
++#define H2I_SYNTH_C		0x1104		/* Synth DMA control */
++
++#define H2I_AESRX_C		0x1204	 	/* AES RX dma control */
++
++#define H2I_C_TS_EN		0x20		/* Timestamp enable */
++#define H2I_C_TS_FRMT		0x40		/* Timestamp format */
++#define H2I_C_NAUDIO		0x80		/* Sign extend */
++
++/* AESRX CTL, 16 bit */
++
++#define H2I_AESTX_C		0x1304		/* AES TX DMA control */
++#define H2I_AESTX_C_CLKID_SHIFT	3		/* Bresenham Clock Gen 1-3 */
++#define H2I_AESTX_C_CLKID_M	0x18
++#define H2I_AESTX_C_DATAT_SHIFT	8		/* 1=mono 2=stereo (3=quad) */
++#define H2I_AESTX_C_DATAT_M	0x300
++
++/* CODEC registers */
++
++#define H2I_DAC_C1		0x1404 		/* DAC DMA control, 16 bit */
++#define H2I_DAC_C2		0x1408		/* DAC DMA control, 32 bit */
++#define H2I_ADC_C1		0x1504 		/* ADC DMA control, 16 bit */
++#define H2I_ADC_C2		0x1508		/* ADC DMA control, 32 bit */
++
++/* Bits in CTL1 register */
++
++#define H2I_C1_DMA_SHIFT	0		/* DMA channel */
++#define H2I_C1_DMA_M		0x7
++#define H2I_C1_CLKID_SHIFT	3		/* Bresenham Clock Gen 1-3 */
++#define H2I_C1_CLKID_M		0x18
++#define H2I_C1_DATAT_SHIFT	8		/* 1=mono 2=stereo (3=quad) */
++#define H2I_C1_DATAT_M		0x300
++
++/* Bits in CTL2 register */
++
++#define H2I_C2_R_GAIN_SHIFT	0		/* right a/d input gain */	
++#define H2I_C2_R_GAIN_M		0xf	
++#define H2I_C2_L_GAIN_SHIFT	4		/* left a/d input gain */
++#define H2I_C2_L_GAIN_M		0xf0
++#define H2I_C2_R_SEL		0x100		/* right input select */
++#define H2I_C2_L_SEL		0x200		/* left input select */
++#define H2I_C2_MUTE		0x400		/* mute */
++#define H2I_C2_DO1		0x00010000	/* digital output port bit 0 */
++#define H2I_C2_DO2		0x00020000	/* digital output port bit 1 */
++#define H2I_C2_R_ATT_SHIFT	18		/* right d/a output - */
++#define H2I_C2_R_ATT_M		0x007c0000	/* attenuation */
++#define H2I_C2_L_ATT_SHIFT	23		/* left d/a output - */
++#define H2I_C2_L_ATT_M		0x0f800000	/* attenuation */
++
++#define H2I_SYNTH_MAP_C		0x1104		/* synth dma handshake ctrl */
++
++/* Clock generator CTL 1, 16 bit */
++
++#define H2I_BRES1_C1		0x2104
++#define H2I_BRES2_C1		0x2204
++#define H2I_BRES3_C1		0x2304
++
++#define H2I_BRES_C1_SHIFT	0		/* 0=48.0 1=44.1 2=aes_rx */
++#define H2I_BRES_C1_M		0x03
++				
++/* Clock generator CTL 2, 32 bit */
++
++#define H2I_BRES1_C2		0x2108
++#define H2I_BRES2_C2		0x2208
++#define H2I_BRES3_C2		0x2308
++
++#define H2I_BRES_C2_INC_SHIFT	0		/* increment value */
++#define H2I_BRES_C2_INC_M	0xffff
++#define H2I_BRES_C2_MOD_SHIFT	16		/* modcontrol value */
++#define H2I_BRES_C2_MOD_M	0xffff0000	/* modctrl=0xffff&(modinc-1) */
++
++/* Unix timer, 64 bit */
++
++#define H2I_UTIME		0x3104
++#define H2I_UTIME_0_LD		0xffff		/* microseconds, LSB's */
++#define H2I_UTIME_1_LD0		0x0f		/* microseconds, MSB's */
++#define H2I_UTIME_1_LD1		0xf0		/* tenths of microseconds */
++#define H2I_UTIME_2_LD		0xffff		/* seconds, LSB's */
++#define H2I_UTIME_3_LD		0xffff		/* seconds, MSB's */
++
++typedef volatile u32 hal2_reg_t;
++
++typedef struct stru_hal2_ctl_regs hal2_ctl_regs_t;
++struct stru_hal2_ctl_regs {
++	hal2_reg_t _unused0[4];
++	hal2_reg_t isr;			/* 0x10 Status Register */
++	hal2_reg_t _unused1[3];
++	hal2_reg_t rev;			/* 0x20 Revision Register */
++	hal2_reg_t _unused2[3];
++	hal2_reg_t iar;			/* 0x30 Indirect Address Register */
++	hal2_reg_t _unused3[3];
++	hal2_reg_t idr0;		/* 0x40 Indirect Data Register 0 */
++	hal2_reg_t _unused4[3];
++	hal2_reg_t idr1;		/* 0x50 Indirect Data Register 1 */
++	hal2_reg_t _unused5[3];
++	hal2_reg_t idr2;		/* 0x60 Indirect Data Register 2 */
++	hal2_reg_t _unused6[3];
++	hal2_reg_t idr3;		/* 0x70 Indirect Data Register 3 */
++};
++
++typedef struct stru_hal2_aes_regs hal2_aes_regs_t;
++struct stru_hal2_aes_regs {
++	hal2_reg_t rx_stat[2];		/* Status registers */
++	hal2_reg_t rx_cr[2];		/* Control registers */
++	hal2_reg_t rx_ud[4];		/* User data window */
++	hal2_reg_t rx_st[24];		/* Channel status data */
++	
++	hal2_reg_t tx_stat[1];		/* Status register */
++	hal2_reg_t tx_cr[3];		/* Control registers */
++	hal2_reg_t tx_ud[4];		/* User data window */
++	hal2_reg_t tx_st[24];		/* Channel status data */
++};
++
++typedef struct stru_hal2_vol_regs hal2_vol_regs_t;
++struct stru_hal2_vol_regs {
++	hal2_reg_t right;		/* 0x00 Right volume */
++	hal2_reg_t left;		/* 0x04 Left volume */
++};
++
++typedef struct stru_hal2_syn_regs hal2_syn_regs_t;
++struct stru_hal2_syn_regs {
++	hal2_reg_t _unused0[2];
++	hal2_reg_t page;		/* DOC Page register */
++	hal2_reg_t regsel;		/* DOC Register selection */
++	hal2_reg_t dlow;		/* DOC Data low */
++	hal2_reg_t dhigh;		/* DOC Data high */
++	hal2_reg_t irq;			/* IRQ Status */
++	hal2_reg_t dram;		/* DRAM Access */
++};
++
++/* HAL2 specific structures */
++
++typedef struct stru_hal2_pbus hal2_pbus_t;
++struct stru_hal2_pbus {
++	struct hpc3_pbus_dmacregs *pbus;
++	int pbusnr;
++	unsigned int ctrl;		/* Current state of pbus->pbdma_ctrl */
++};
++
++typedef struct stru_hal2_binfo hal2_binfo_t;
++typedef struct stru_hal2_buffer hal2_buf_t;
++struct stru_hal2_binfo {
++	volatile struct hpc_dma_desc desc;
++	hal2_buf_t *next;		/* pointer to next buffer */
++	int cnt;			/* bytes in buffer */
++};
++#define H2_BUFFER_SIZE	(PAGE_SIZE - \
++		((sizeof(hal2_binfo_t) - 1) / 8 + 1) * 8)
++struct stru_hal2_buffer {
++	hal2_binfo_t info;
++	char data[H2_BUFFER_SIZE] __attribute__((aligned(8)));
++};
++
++typedef struct stru_hal2_codec hal2_codec_t;
++struct stru_hal2_codec {
++	hal2_buf_t *head;
++	hal2_buf_t *tail; 
++	hal2_pbus_t pbus;
++	unsigned int format;		/* Audio data format */
++	int voices;			/* mono/stereo */
++	unsigned int sample_rate;
++	unsigned int master;		/* Master frequency */
++	unsigned short mod;		/* MOD value */
++	unsigned short inc;		/* INC value */
++
++	wait_queue_head_t dma_wait;
++	spinlock_t lock;
++	struct semaphore sem;
++
++	int usecount;			/* recording and playback are 
++					 * independent */
++};
++
++#define H2_MIX_OUTPUT_ATT	0
++#define H2_MIX_INPUT_GAIN	1
++#define H2_MIXERS		2
++typedef struct stru_hal2_mixer hal2_mixer_t;
++struct stru_hal2_mixer {
++	int modcnt;
++	unsigned int volume[H2_MIXERS];
++};
++
++typedef struct stru_hal2_card hal2_card_t;
++struct stru_hal2_card {
++	int dev_dsp;			/* audio device */
++	int dev_mixer;			/* mixer device */
++	int dev_midi;			/* midi device */
++	
++	hal2_ctl_regs_t *ctl_regs;	/* HAL2 ctl registers */
++	hal2_aes_regs_t *aes_regs;	/* HAL2 vol registers */
++	hal2_vol_regs_t *vol_regs;	/* HAL2 aes registers */
++	hal2_syn_regs_t *syn_regs;	/* HAL2 syn registers */
++
++	hal2_codec_t dac;
++	hal2_codec_t adc;
++	hal2_mixer_t mixer;
++};
++
++#endif				/* __HAL2_H */
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/sound/oss/harmony.c	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,1307 @@
++/*
++ 	drivers/sound/harmony.c 
++
++	This is a sound driver for ASP's and Lasi's Harmony sound chip
++	and is unlikely to be used for anything other than on a HP PA-RISC.
++
++	Harmony is found in HP 712s, 715/new and many other GSC based machines.
++	On older 715 machines you'll find the technically identical chip 
++	called 'Vivace'. Both Harmony and Vicace are supported by this driver.
++
++	Copyright 2000 (c) Linuxcare Canada, Alex deVries <alex@linuxcare.com>
++	Copyright 2000-2002 (c) Helge Deller <deller@gmx.de>
++	Copyright 2001 (c) Matthieu Delahaye <delahaym@esiee.fr>
++	Copyright 2001 (c) Jean-Christophe Vaugeois <vaugeoij@esiee.fr>
++
++				
++TODO:
++	- fix SNDCTL_DSP_GETOSPACE and SNDCTL_DSP_GETISPACE ioctls to
++		return the real values
++	- add private ioctl for selecting line- or microphone input
++		(only one of them is available at the same time)
++	- add module parameters
++	- implement mmap functionality
++	- implement gain meter ?
++	- ...
++*/
++
++#include <linux/delay.h>
++#include <linux/errno.h>
++#include <linux/init.h>
++#include <linux/ioport.h>
++#include <linux/types.h>
++#include <linux/mm.h>
++#include <linux/pci.h>
++
++#include <asm/gsc.h>
++#include <asm/io.h>
++#include <asm/pgalloc.h>
++
++#include "sound_config.h"
++
++
++#define PFX "harmony: "
++#define HARMONY_VERSION "V0.9a"
++
++#undef DEBUG
++#ifdef DEBUG
++# define DPRINTK printk 
++#else
++# define DPRINTK(x,...)
++#endif
++
++
++#define MAX_BUFS 10		/* maximum number of rotating buffers */
++#define HARMONY_BUF_SIZE 4096	/* needs to be a multiple of PAGE_SIZE (4096)! */
++
++#define CNTL_C		0x80000000
++#define	CNTL_ST		0x00000020
++#define CNTL_44100	0x00000015	/* HARMONY_SR_44KHZ */
++#define CNTL_8000	0x00000008	/* HARMONY_SR_8KHZ */
++
++#define GAINCTL_HE	0x08000000
++#define GAINCTL_LE	0x04000000
++#define GAINCTL_SE	0x02000000
++
++#define DSTATUS_PN	0x00000200
++#define DSTATUS_RN	0x00000002
++
++#define DSTATUS_IE	0x80000000
++
++#define HARMONY_DF_16BIT_LINEAR	0
++#define HARMONY_DF_8BIT_ULAW	1
++#define HARMONY_DF_8BIT_ALAW	2
++
++#define HARMONY_SS_MONO		0
++#define HARMONY_SS_STEREO	1
++
++#define HARMONY_SR_8KHZ		0x08
++#define HARMONY_SR_16KHZ	0x09
++#define HARMONY_SR_27KHZ	0x0A
++#define HARMONY_SR_32KHZ	0x0B
++#define HARMONY_SR_48KHZ	0x0E
++#define HARMONY_SR_9KHZ		0x0F
++#define HARMONY_SR_5KHZ		0x10
++#define HARMONY_SR_11KHZ	0x11
++#define HARMONY_SR_18KHZ	0x12
++#define HARMONY_SR_22KHZ	0x13
++#define HARMONY_SR_37KHZ	0x14
++#define HARMONY_SR_44KHZ	0x15
++#define HARMONY_SR_33KHZ	0x16
++#define HARMONY_SR_6KHZ		0x17
++
++/*
++ * Some magics numbers used to auto-detect file formats
++ */
++
++#define HARMONY_MAGIC_8B_ULAW	1
++#define HARMONY_MAGIC_8B_ALAW	27
++#define HARMONY_MAGIC_16B_LINEAR 3
++#define HARMONY_MAGIC_MONO	1
++#define HARMONY_MAGIC_STEREO	2
++
++/*
++ * Channels Positions in mixer register
++ */
++
++#define GAIN_HE_SHIFT   27
++#define GAIN_HE_MASK    ( 1 << GAIN_HE_SHIFT) 
++#define GAIN_LE_SHIFT   26
++#define GAIN_LE_MASK    ( 1 << GAIN_LE_SHIFT) 
++#define GAIN_SE_SHIFT   25
++#define GAIN_SE_MASK    ( 1 << GAIN_SE_SHIFT) 
++#define GAIN_IS_SHIFT   24
++#define GAIN_IS_MASK    ( 1 << GAIN_IS_SHIFT) 
++#define GAIN_MA_SHIFT   20
++#define GAIN_MA_MASK    ( 0x0f << GAIN_MA_SHIFT) 
++#define GAIN_LI_SHIFT   16
++#define GAIN_LI_MASK    ( 0x0f << GAIN_LI_SHIFT) 
++#define GAIN_RI_SHIFT   12
++#define GAIN_RI_MASK    ( 0x0f << GAIN_RI_SHIFT) 
++#define GAIN_LO_SHIFT   6
++#define GAIN_LO_MASK    ( 0x3f << GAIN_LO_SHIFT) 
++#define GAIN_RO_SHIFT   0
++#define GAIN_RO_MASK    ( 0x3f << GAIN_RO_SHIFT) 
++
++
++#define MAX_OUTPUT_LEVEL (GAIN_RO_MASK >> GAIN_RO_SHIFT)
++#define MAX_INPUT_LEVEL  (GAIN_RI_MASK >> GAIN_RI_SHIFT)
++#define MAX_VOLUME_LEVEL (GAIN_MA_MASK >> GAIN_MA_SHIFT)
++
++/*
++ * Channels Mask in mixer register
++ */
++
++#define GAIN_TOTAL_SILENCE 0x00F00FFF
++#define GAIN_DEFAULT       0x0FF00000
++
++
++struct harmony_hpa {
++	u8	unused000;
++	u8	id;
++	u8	teleshare_id;
++	u8	unused003;
++	u32	reset;
++	u32	cntl;
++	u32	gainctl;
++	u32	pnxtadd;
++	u32	pcuradd;
++	u32	rnxtadd;
++	u32	rcuradd;
++	u32	dstatus;
++	u32	ov;
++	u32	pio;
++	u32	unused02c;
++	u32	unused030[3];
++	u32	diag;
++};
++
++struct harmony_dev {
++	int irq;
++	struct harmony_hpa *hpa;
++	u32 current_gain;
++	u8 data_format;		/* HARMONY_DF_xx_BIT_xxx */
++	u8 sample_rate;		/* HARMONY_SR_xx_KHZ */
++	u8 stereo_select;	/* HARMONY_SS_MONO or HARMONY_SS_STEREO */
++	int format_initialized;
++	u32 dac_rate;		/* 8000 ... 48000 (Hz) */
++	int suspended_playing;
++	int suspended_recording;
++	
++	int blocked_playing;
++	int blocked_recording;
++	
++	wait_queue_head_t wq_play, wq_record;
++	int first_filled_play;	/* first buffer containing data (next to play) */
++	int nb_filled_play; 
++	int play_offset;
++	int first_filled_record;
++	int nb_filled_record;
++		
++	int audio_open, mixer_open;
++	int dsp_unit, mixer_unit;
++
++	struct pci_dev *fake_pci_dev; /* The fake pci_dev needed for 
++					pci_* functions under ccio. */
++};
++
++
++static struct harmony_dev harmony;
++
++
++/*
++ * Dynamic sound buffer allocation and DMA memory
++ */
++
++struct harmony_buffer {
++	unsigned char *addr;
++	dma_addr_t dma_handle;
++	int dma_consistent;	/* Zero if pci_alloc_consistent() fails */
++	int len;
++};
++
++/*
++ * Harmony memory buffers
++ */
++
++static struct harmony_buffer played_buf, recorded_buf, silent, graveyard;
++
++
++#define CHECK_WBACK_INV_OFFSET(b,offset,len) \
++        do { if (!b.dma_consistent) \
++		dma_cache_wback_inv((unsigned long)b.addr+offset,len); \
++	} while (0) 
++
++	
++static int __init harmony_alloc_buffer(struct harmony_buffer *b, 
++		int buffer_count)
++{
++	b->len = buffer_count * HARMONY_BUF_SIZE;
++	b->addr = pci_alloc_consistent(harmony.fake_pci_dev, 
++			  b->len, &b->dma_handle);
++	if (b->addr && b->dma_handle) {
++		b->dma_consistent = 1;
++		DPRINTK(KERN_INFO PFX "consistent memory: 0x%lx, played_buf: 0x%lx\n",
++				(unsigned long)b->dma_handle, (unsigned long)b->addr);
++	} else {
++		b->dma_consistent = 0;
++		/* kmalloc()ed memory will HPMC on ccio machines ! */
++		b->addr = kmalloc(b->len, GFP_KERNEL);
++		if (!b->addr) {
++			printk(KERN_ERR PFX "couldn't allocate memory\n");
++			return -EBUSY;
++		}
++		b->dma_handle = __pa(b->addr);
++	}
++	return 0;
++}
++
++static void __exit harmony_free_buffer(struct harmony_buffer *b)
++{
++	if (!b->addr)
++		return;
++
++	if (b->dma_consistent)
++		pci_free_consistent(harmony.fake_pci_dev,
++				b->len, b->addr, b->dma_handle);
++	else
++		kfree(b->addr);
++
++	memset(b, 0, sizeof(*b));
++}
++
++
++
++/*
++ * Low-Level sound-chip programming
++ */
++
++static void __inline__ harmony_wait_CNTL(void)
++{
++	/* Wait until we're out of control mode */
++	while (gsc_readl(&harmony.hpa->cntl) & CNTL_C)
++		/* wait */ ;
++}
++
++
++static void harmony_update_control(void) 
++{
++	u32 default_cntl;
++	
++	/* Set CNTL */
++	default_cntl = (CNTL_C |  		/* The C bit */
++		(harmony.data_format << 6) |	/* Set the data format */
++		(harmony.stereo_select << 5) |	/* Stereo select */
++		(harmony.sample_rate));		/* Set sample rate */
++	harmony.format_initialized = 1;
++	
++	/* initialize CNTL */
++	gsc_writel(default_cntl, &harmony.hpa->cntl);
++}
++
++static void harmony_set_control(u8 data_format, u8 sample_rate, u8 stereo_select) 
++{
++	harmony.sample_rate = sample_rate;
++	harmony.data_format = data_format;
++	harmony.stereo_select = stereo_select;
++	harmony_update_control();
++}
++
++static void harmony_set_rate(u8 data_rate) 
++{
++	harmony.sample_rate = data_rate;
++	harmony_update_control();
++}
++
++static int harmony_detect_rate(int *freq)
++{
++	int newrate;
++	switch (*freq) {
++	case 8000:	newrate = HARMONY_SR_8KHZ;	break;
++	case 16000:	newrate = HARMONY_SR_16KHZ;	break; 
++	case 27428:	newrate = HARMONY_SR_27KHZ;	break; 
++	case 32000:	newrate = HARMONY_SR_32KHZ;	break; 
++	case 48000:	newrate = HARMONY_SR_48KHZ;	break; 
++	case 9600:	newrate = HARMONY_SR_9KHZ;	break; 
++	case 5125:	newrate = HARMONY_SR_5KHZ;	break; 
++	case 11025:	newrate = HARMONY_SR_11KHZ;	break; 
++	case 18900:	newrate = HARMONY_SR_18KHZ;	break; 
++	case 22050:	newrate = HARMONY_SR_22KHZ;	break; 
++	case 37800:	newrate = HARMONY_SR_37KHZ;	break; 
++	case 44100:	newrate = HARMONY_SR_44KHZ;	break; 
++	case 33075:	newrate = HARMONY_SR_33KHZ;	break; 
++	case 6615:	newrate = HARMONY_SR_6KHZ;	break; 
++	default:	newrate = HARMONY_SR_8KHZ; 
++			*freq = 8000;			break;
++	}
++	return newrate;
++}
++
++static void harmony_set_format(u8 data_format) 
++{
++	harmony.data_format = data_format;
++	harmony_update_control();
++}
++
++static void harmony_set_stereo(u8 stereo_select) 
++{
++	harmony.stereo_select = stereo_select;
++	harmony_update_control();
++}
++
++static void harmony_disable_interrupts(void) 
++{
++	harmony_wait_CNTL();
++	gsc_writel(0, &harmony.hpa->dstatus); 
++}
++
++static void harmony_enable_interrupts(void) 
++{
++	harmony_wait_CNTL();
++	gsc_writel(DSTATUS_IE, &harmony.hpa->dstatus); 
++}
++
++/*
++ * harmony_silence()
++ *
++ * This subroutine fills in a buffer starting at location start and
++ * silences for length bytes.  This references the current
++ * configuration of the audio format.
++ *
++ */
++
++static void harmony_silence(struct harmony_buffer *buffer, int start, int length) 
++{
++	u8 silence_char;
++
++	/* Despite what you hear, silence is different in
++	   different audio formats.  */
++	switch (harmony.data_format) {
++		case HARMONY_DF_8BIT_ULAW:	silence_char = 0x55; break;
++		case HARMONY_DF_8BIT_ALAW:	silence_char = 0xff; break;
++		case HARMONY_DF_16BIT_LINEAR:	/* fall through */
++		default:			silence_char = 0;
++	}
++
++	memset(buffer->addr+start, silence_char, length);
++}
++
++
++static int harmony_audio_open(struct inode *inode, struct file *file)
++{
++	if (harmony.audio_open) 
++		return -EBUSY;
++	
++	harmony.audio_open++;
++	harmony.suspended_playing = harmony.suspended_recording = 1;
++	harmony.blocked_playing   = harmony.blocked_recording   = 0;
++	harmony.first_filled_play = harmony.first_filled_record = 0;
++	harmony.nb_filled_play    = harmony.nb_filled_record    = 0;
++	harmony.play_offset = 0;
++	init_waitqueue_head(&harmony.wq_play);
++	init_waitqueue_head(&harmony.wq_record);
++	
++	/* Start off in a balanced mode. */
++	harmony_set_control(HARMONY_DF_8BIT_ULAW, HARMONY_SR_8KHZ, HARMONY_SS_MONO);
++	harmony_update_control();
++	harmony.format_initialized = 0;
++
++	/* Clear out all the buffers and flush to cache */
++	harmony_silence(&played_buf, 0, HARMONY_BUF_SIZE*MAX_BUFS);
++	CHECK_WBACK_INV_OFFSET(played_buf, 0, HARMONY_BUF_SIZE*MAX_BUFS);
++	
++	return 0;
++}
++
++/*
++ * Release (close) the audio device.
++ */
++
++static int harmony_audio_release(struct inode *inode, struct file *file)
++{
++	if (!harmony.audio_open) 
++		return -EBUSY;
++	
++	harmony.audio_open--;
++
++	return 0;
++}
++
++/*
++ * Read recorded data off the audio device.
++ */
++
++static ssize_t harmony_audio_read(struct file *file,
++                                char *buffer,
++                                size_t size_count,
++                                loff_t *ppos)
++{
++	int total_count = (int) size_count;
++	int count = 0;
++	int buf_to_read;
++
++	while (count<total_count) {
++		/* Wait until we're out of control mode */
++		harmony_wait_CNTL();
++		
++		/* Figure out which buffer to fill in */
++		if (harmony.nb_filled_record <= 2) {
++			harmony.blocked_recording = 1;
++		        if (harmony.suspended_recording) {
++				harmony.suspended_recording = 0;
++				harmony_enable_interrupts();
++			}
++							
++			interruptible_sleep_on(&harmony.wq_record);
++			harmony.blocked_recording = 0;
++		}
++		
++		if (harmony.nb_filled_record < 2)
++			return -EBUSY;
++		
++		buf_to_read = harmony.first_filled_record;
++
++		/* Copy the page to an aligned buffer */
++		if (copy_to_user(buffer+count, recorded_buf.addr +
++				 (HARMONY_BUF_SIZE*buf_to_read),
++				 HARMONY_BUF_SIZE)) {
++			count = -EFAULT;
++			break;
++		}
++		
++		harmony.nb_filled_record--;
++		harmony.first_filled_record++;
++		harmony.first_filled_record %= MAX_BUFS;
++				
++		count += HARMONY_BUF_SIZE;
++	}
++	return count;
++}
++
++
++
++
++/*
++ * Here is the place where we try to recognize file format.
++ * Sun/NeXT .au files begin with the string .snd
++ * At offset 12 is specified the encoding.
++ * At offset 16 is specified speed rate
++ * At Offset 20 is specified the numbers of voices
++ */
++
++#define four_bytes_to_u32(start) (file_header[start] << 24)|\
++                                  (file_header[start+1] << 16)|\
++                                  (file_header[start+2] << 8)|\
++                                  (file_header[start+3]);
++
++#define test_rate(tested,real_value,harmony_value) if ((tested)<=(real_value))\
++                                                    
++
++static int harmony_format_auto_detect(const char *buffer, int block_size)
++{
++	u8 file_header[24];
++	u32 start_string;
++	int ret = 0;
++	
++	if (block_size>24) {
++		if (copy_from_user(file_header, buffer, sizeof(file_header)))
++			ret = -EFAULT;
++			
++		start_string = four_bytes_to_u32(0);
++		
++		if ((file_header[4]==0) && (start_string==0x2E736E64)) {
++			u32 format;
++			u32 nb_voices;
++			u32 speed;
++			
++			format = four_bytes_to_u32(12);
++			nb_voices = four_bytes_to_u32(20);
++			speed = four_bytes_to_u32(16);
++			
++			switch (format) {
++			case HARMONY_MAGIC_8B_ULAW:
++				harmony.data_format = HARMONY_DF_8BIT_ULAW;
++				break;
++			case HARMONY_MAGIC_8B_ALAW:
++				harmony.data_format = HARMONY_DF_8BIT_ALAW;
++				break;
++			case HARMONY_MAGIC_16B_LINEAR:
++				harmony.data_format = HARMONY_DF_16BIT_LINEAR;
++				break;
++			default:
++				harmony_set_control(HARMONY_DF_16BIT_LINEAR,
++						HARMONY_SR_44KHZ, HARMONY_SS_STEREO);
++				goto out;
++			}
++			switch (nb_voices) {
++			case HARMONY_MAGIC_MONO:
++				harmony.stereo_select = HARMONY_SS_MONO;
++				break;
++			case HARMONY_MAGIC_STEREO:
++				harmony.stereo_select = HARMONY_SS_STEREO;
++				break;
++			default:
++				harmony.stereo_select = HARMONY_SS_MONO;
++				break;
++			}
++			harmony_set_rate(harmony_detect_rate(&speed));
++			harmony.dac_rate = speed;
++			goto out;
++		}
++	}
++	harmony_set_control(HARMONY_DF_8BIT_ULAW, HARMONY_SR_8KHZ, HARMONY_SS_MONO);
++out:
++	return ret;
++}
++#undef four_bytes_to_u32
++
++
++static ssize_t harmony_audio_write(struct file *file,
++                                 const char *buffer,
++                                 size_t size_count,
++                                 loff_t *ppos)
++{
++	int total_count = (int) size_count;
++	int count = 0;
++	int frame_size;
++	int buf_to_fill;
++
++	if (!harmony.format_initialized) {
++		if (harmony_format_auto_detect(buffer, total_count))
++			return -EFAULT;
++	}
++	
++	while (count<total_count) {
++		/* Wait until we're out of control mode */
++		harmony_wait_CNTL();
++
++		/* Figure out which buffer to fill in */
++		if (harmony.nb_filled_play+2 >= MAX_BUFS && !harmony.play_offset) {
++			harmony.blocked_playing = 1;
++			interruptible_sleep_on(&harmony.wq_play);
++			harmony.blocked_playing = 0;
++		}
++		if (harmony.nb_filled_play+2 >= MAX_BUFS && !harmony.play_offset)
++			return -EBUSY;
++		
++		
++		buf_to_fill = (harmony.first_filled_play+harmony.nb_filled_play); 
++		if (harmony.play_offset)
++			buf_to_fill--;
++		buf_to_fill %= MAX_BUFS;
++
++		/* Figure out the size of the frame */
++		if ((total_count-count) > HARMONY_BUF_SIZE - harmony.play_offset) {
++			frame_size = HARMONY_BUF_SIZE - harmony.play_offset;
++		} else {
++			frame_size = total_count - count;
++			/* Clear out the buffer, since there we'll only be 
++			   overlaying part of the old buffer with the new one */
++			harmony_silence(&played_buf, 
++				HARMONY_BUF_SIZE*buf_to_fill+frame_size+harmony.play_offset,
++				HARMONY_BUF_SIZE-frame_size-harmony.play_offset);
++		}
++
++		/* Copy the page to an aligned buffer */
++		if (copy_from_user(played_buf.addr +(HARMONY_BUF_SIZE*buf_to_fill) + harmony.play_offset, 
++				   buffer+count, frame_size))
++			return -EFAULT;
++		CHECK_WBACK_INV_OFFSET(played_buf, (HARMONY_BUF_SIZE*buf_to_fill + harmony.play_offset), 
++				frame_size);
++	
++		if (!harmony.play_offset)
++			harmony.nb_filled_play++;
++		
++		count += frame_size;
++		harmony.play_offset += frame_size;
++		harmony.play_offset %= HARMONY_BUF_SIZE;
++		if (harmony.suspended_playing && (harmony.nb_filled_play>=4))
++			harmony_enable_interrupts();
++	}
++	
++	return count;
++}
++
++static unsigned int harmony_audio_poll(struct file *file,
++                                     struct poll_table_struct *wait)
++{
++	unsigned int mask = 0;
++	
++	if (file->f_mode & FMODE_READ) {
++		if (!harmony.suspended_recording)
++			poll_wait(file, &harmony.wq_record, wait);
++		if (harmony.nb_filled_record)
++			mask |= POLLIN | POLLRDNORM;
++	}
++
++	if (file->f_mode & FMODE_WRITE) {
++		if (!harmony.suspended_playing)
++			poll_wait(file, &harmony.wq_play, wait);
++		if (harmony.nb_filled_play)
++			mask |= POLLOUT | POLLWRNORM;
++	}
++
++	return mask;
++}
++
++static int harmony_audio_ioctl(struct inode *inode,
++                                struct file *file,
++				unsigned int cmd,
++                                unsigned long arg)
++{
++	int ival, new_format;
++	int frag_size, frag_buf;
++	struct audio_buf_info info;
++	
++	switch (cmd) {
++	case OSS_GETVERSION:
++		return put_user(SOUND_VERSION, (int *) arg);
++
++	case SNDCTL_DSP_GETCAPS:
++		ival = DSP_CAP_DUPLEX;
++		return put_user(ival, (int *) arg);
++
++	case SNDCTL_DSP_GETFMTS:
++		ival = (AFMT_S16_BE | AFMT_MU_LAW | AFMT_A_LAW ); 
++		return put_user(ival, (int *) arg);
++	
++	case SNDCTL_DSP_SETFMT:
++		if (get_user(ival, (int *) arg)) 
++			return -EFAULT;
++		if (ival != AFMT_QUERY) {
++			switch (ival) {
++			case AFMT_MU_LAW:	new_format = HARMONY_DF_8BIT_ULAW; break;
++			case AFMT_A_LAW:	new_format = HARMONY_DF_8BIT_ALAW; break;
++			case AFMT_S16_LE:	/* fall through, but not really supported */
++			case AFMT_S16_BE:	new_format = HARMONY_DF_16BIT_LINEAR;
++						ival = AFMT_S16_BE;
++						break; 
++			default: {
++				DPRINTK(KERN_WARNING PFX 
++					"unsupported sound format 0x%04x requested.\n",
++					ival);
++				return -EINVAL;
++			}
++			}
++			harmony_set_format(new_format);
++		} else {
++			switch (harmony.data_format) {
++			case HARMONY_DF_8BIT_ULAW:	ival = AFMT_MU_LAW; break;
++			case HARMONY_DF_8BIT_ALAW:	ival = AFMT_A_LAW;  break;
++			case HARMONY_DF_16BIT_LINEAR:	ival = AFMT_U16_BE; break;
++			default: ival = 0;
++			}
++		}
++		return put_user(ival, (int *) arg);
++
++	case SOUND_PCM_READ_RATE:
++		ival = harmony.dac_rate;
++		return put_user(ival, (int *) arg);
++
++	case SNDCTL_DSP_SPEED:
++		if (get_user(ival, (int *) arg))
++			return -EFAULT;
++		harmony_set_rate(harmony_detect_rate(&ival));
++		harmony.dac_rate = ival;
++		return put_user(ival, (int*) arg);
++
++	case SNDCTL_DSP_STEREO:
++		if (get_user(ival, (int *) arg))
++			return -EFAULT;
++		if (ival != 0 && ival != 1)
++			return -EINVAL;
++		harmony_set_stereo(ival);
++		return put_user(ival, (int *) arg);
++
++	case SNDCTL_DSP_GETBLKSIZE:
++		ival = HARMONY_BUF_SIZE;
++		return put_user(ival, (int *) arg);
++		
++        case SNDCTL_DSP_NONBLOCK:
++                file->f_flags |= O_NONBLOCK;
++                return 0;
++
++        case SNDCTL_DSP_RESET:
++		if (!harmony.suspended_recording) {
++			/* TODO: stop_recording() */
++		}
++		return 0;
++
++	case SNDCTL_DSP_SETFRAGMENT:
++		if (get_user(ival, (int *)arg))
++			return -EFAULT;
++		frag_size = ival & 0xffff;
++		frag_buf = (ival>>16) & 0xffff;
++		/* TODO: We use hardcoded fragment sizes and numbers for now */
++		frag_size = 12;  /* 4096 == 2^12 */
++		frag_buf  = MAX_BUFS;
++		ival = (frag_buf << 16) + frag_size;
++		return put_user(ival, (int *) arg);
++		
++	case SNDCTL_DSP_GETOSPACE:
++		if (!(file->f_mode & FMODE_WRITE))
++			return -EINVAL;
++		info.fragstotal = MAX_BUFS;
++                info.fragments = MAX_BUFS - harmony.nb_filled_play;
++		info.fragsize = HARMONY_BUF_SIZE;
++                info.bytes = info.fragments * info.fragsize;
++		return copy_to_user((void *)arg, &info, sizeof(info));
++
++	case SNDCTL_DSP_GETISPACE:
++		if (!(file->f_mode & FMODE_READ))
++			return -EINVAL;
++		info.fragstotal = MAX_BUFS;
++                info.fragments = /*MAX_BUFS-*/ harmony.nb_filled_record;
++		info.fragsize = HARMONY_BUF_SIZE;
++                info.bytes = info.fragments * info.fragsize;
++		return copy_to_user((void *)arg, &info, sizeof(info));
++	
++	case SNDCTL_DSP_SYNC:
++		return 0;
++	}
++	
++	return -EINVAL;
++}
++
++
++/*
++ * harmony_interrupt()
++ *
++ * harmony interruption service routine
++ * 
++ */
++
++static irqreturn_t harmony_interrupt(int irq, void *dev, struct pt_regs *regs)
++{
++	u32 dstatus;
++	struct harmony_hpa *hpa;
++
++	/* Setup the hpa */
++	hpa = ((struct harmony_dev *)dev)->hpa;
++	harmony_wait_CNTL();
++
++	/* Read dstatus and pcuradd (the current address) */
++	dstatus = gsc_readl(&hpa->dstatus);
++	
++	/* Turn off interrupts */
++	harmony_disable_interrupts();
++	
++	/* Check if this is a request to get the next play buffer */
++	if (dstatus & DSTATUS_PN) {
++		if (!harmony.nb_filled_play) {
++			harmony.suspended_playing = 1;
++			gsc_writel((unsigned long)silent.dma_handle, &hpa->pnxtadd);
++						
++			if (!harmony.suspended_recording)
++				harmony_enable_interrupts();
++		} else {
++			harmony.suspended_playing = 0;
++			gsc_writel((unsigned long)played_buf.dma_handle + 
++					(HARMONY_BUF_SIZE*harmony.first_filled_play),
++					&hpa->pnxtadd);
++			harmony.first_filled_play++;
++			harmony.first_filled_play %= MAX_BUFS;
++			harmony.nb_filled_play--;
++			
++		       	harmony_enable_interrupts();
++		}
++		
++		if (harmony.blocked_playing)
++			wake_up_interruptible(&harmony.wq_play);
++	}
++	
++	/* Check if we're being asked to fill in a recording buffer */
++	if (dstatus & DSTATUS_RN) {
++		if((harmony.nb_filled_record+2>=MAX_BUFS) || harmony.suspended_recording)
++		{
++			harmony.nb_filled_record = 0;
++			harmony.first_filled_record = 0;
++			harmony.suspended_recording = 1;
++			gsc_writel((unsigned long)graveyard.dma_handle, &hpa->rnxtadd);
++			if (!harmony.suspended_playing)
++				harmony_enable_interrupts();
++		} else {
++			int buf_to_fill;
++			buf_to_fill = (harmony.first_filled_record+harmony.nb_filled_record) % MAX_BUFS;
++			CHECK_WBACK_INV_OFFSET(recorded_buf, HARMONY_BUF_SIZE*buf_to_fill, HARMONY_BUF_SIZE);
++			gsc_writel((unsigned long)recorded_buf.dma_handle +
++					HARMONY_BUF_SIZE*buf_to_fill,
++					&hpa->rnxtadd);
++			harmony.nb_filled_record++;
++			harmony_enable_interrupts();
++		}
++
++		if (harmony.blocked_recording && harmony.nb_filled_record>3)
++			wake_up_interruptible(&harmony.wq_record);
++	}
++	return IRQ_HANDLED;
++}
++
++/*
++ * Sound playing functions
++ */
++
++static struct file_operations harmony_audio_fops = {
++	owner:	THIS_MODULE,
++	llseek:	no_llseek,
++	read: 	harmony_audio_read,
++	write:	harmony_audio_write,
++	poll: 	harmony_audio_poll,
++	ioctl: 	harmony_audio_ioctl,
++	open: 	harmony_audio_open,
++	release:harmony_audio_release,
++};
++
++static int harmony_audio_init(void)
++{
++	/* Request that IRQ */
++	if (request_irq(harmony.irq, harmony_interrupt, 0 ,"harmony", &harmony)) {
++		printk(KERN_ERR PFX "Error requesting irq %d.\n", harmony.irq);
++		return -EFAULT;
++	}
++
++   	harmony.dsp_unit = register_sound_dsp(&harmony_audio_fops, -1);
++	if (harmony.dsp_unit < 0) {
++		printk(KERN_ERR PFX "Error registering dsp\n");
++		free_irq(harmony.irq, &harmony);
++		return -EFAULT;
++	}
++	
++	/* Clear the buffers so you don't end up with crap in the buffers. */ 
++	harmony_silence(&played_buf, 0, HARMONY_BUF_SIZE*MAX_BUFS);
++
++	/* Make sure this makes it to cache */
++	CHECK_WBACK_INV_OFFSET(played_buf, 0, HARMONY_BUF_SIZE*MAX_BUFS);
++
++	/* Clear out the silent buffer and flush to cache */
++	harmony_silence(&silent, 0, HARMONY_BUF_SIZE);
++	CHECK_WBACK_INV_OFFSET(silent, 0, HARMONY_BUF_SIZE);
++	
++	harmony.audio_open = 0;
++	
++	return 0;
++}
++
++
++/*
++ * mixer functions 
++ */
++
++static void harmony_mixer_set_gain(void)
++{
++	harmony_wait_CNTL();
++	gsc_writel(harmony.current_gain, &harmony.hpa->gainctl);
++}
++
++/* 
++ *  Read gain of selected channel.
++ *  The OSS rate is from 0 (silent) to 100 -> need some conversions
++ *
++ *  The harmony gain are attenuation for output and monitor gain.
++ *                   is amplifaction for input gain
++ */
++#define to_harmony_level(level,max) ((level)*max/100)
++#define to_oss_level(level,max) ((level)*100/max)
++
++static int harmony_mixer_get_level(int channel)
++{
++	int left_level;
++	int right_level;
++
++	switch (channel) {
++		case SOUND_MIXER_OGAIN:
++			left_level  = (harmony.current_gain & GAIN_LO_MASK) >> GAIN_LO_SHIFT;
++			right_level = (harmony.current_gain & GAIN_RO_MASK) >> GAIN_RO_SHIFT;
++			left_level  = to_oss_level(MAX_OUTPUT_LEVEL - left_level, MAX_OUTPUT_LEVEL);
++			right_level = to_oss_level(MAX_OUTPUT_LEVEL - right_level, MAX_OUTPUT_LEVEL);
++			return (right_level << 8)+left_level;
++			
++		case SOUND_MIXER_IGAIN:
++			left_level = (harmony.current_gain & GAIN_LI_MASK) >> GAIN_LI_SHIFT;
++			right_level= (harmony.current_gain & GAIN_RI_MASK) >> GAIN_RI_SHIFT;
++			left_level = to_oss_level(left_level, MAX_INPUT_LEVEL);
++			right_level= to_oss_level(right_level, MAX_INPUT_LEVEL);
++			return (right_level << 8)+left_level;
++			
++		case SOUND_MIXER_VOLUME:
++			left_level = (harmony.current_gain & GAIN_MA_MASK) >> GAIN_MA_SHIFT;
++			left_level = to_oss_level(MAX_VOLUME_LEVEL-left_level, MAX_VOLUME_LEVEL);
++			return left_level;
++	}
++	return -EINVAL;
++}
++
++
++
++/*
++ * Some conversions for the same reasons.
++ * We give back the new real value(s) due to
++ * the rescale.
++ */
++
++static int harmony_mixer_set_level(int channel, int value)
++{
++	int left_level;
++	int right_level;
++	int new_left_level;
++	int new_right_level;
++
++	right_level = (value & 0x0000ff00) >> 8;
++	left_level = value & 0x000000ff;
++  
++	switch (channel) {
++		case SOUND_MIXER_OGAIN:
++			right_level = to_harmony_level(100-right_level, MAX_OUTPUT_LEVEL);
++			left_level  = to_harmony_level(100-left_level, MAX_OUTPUT_LEVEL);
++			new_right_level = to_oss_level(MAX_OUTPUT_LEVEL - right_level, MAX_OUTPUT_LEVEL);
++			new_left_level  = to_oss_level(MAX_OUTPUT_LEVEL - left_level, MAX_OUTPUT_LEVEL);
++			harmony.current_gain = (harmony.current_gain & ~(GAIN_LO_MASK | GAIN_RO_MASK)) 
++					| (left_level << GAIN_LO_SHIFT) | (right_level << GAIN_RO_SHIFT);
++			harmony_mixer_set_gain();
++			return (new_right_level << 8) + new_left_level;
++			
++		case SOUND_MIXER_IGAIN:
++			right_level = to_harmony_level(right_level, MAX_INPUT_LEVEL);
++			left_level  = to_harmony_level(left_level, MAX_INPUT_LEVEL);
++			new_right_level = to_oss_level(right_level, MAX_INPUT_LEVEL);
++			new_left_level  = to_oss_level(left_level, MAX_INPUT_LEVEL);
++			harmony.current_gain = (harmony.current_gain & ~(GAIN_LI_MASK | GAIN_RI_MASK))
++					| (left_level << GAIN_LI_SHIFT) | (right_level << GAIN_RI_SHIFT);
++			harmony_mixer_set_gain();
++			return (new_right_level << 8) + new_left_level;
++	
++		case SOUND_MIXER_VOLUME:
++			left_level = to_harmony_level(100-left_level, MAX_VOLUME_LEVEL);
++			new_left_level = to_oss_level(MAX_VOLUME_LEVEL-left_level, MAX_VOLUME_LEVEL);
++			harmony.current_gain = (harmony.current_gain & ~GAIN_MA_MASK)| (left_level << GAIN_MA_SHIFT);
++			harmony_mixer_set_gain();
++			return new_left_level;
++	}
++
++	return -EINVAL;
++}
++
++#undef to_harmony_level
++#undef to_oss_level
++
++/* 
++ * Return the selected input device (mic or line)
++ */
++
++static int harmony_mixer_get_recmask(void) 
++{
++	int current_input_line;
++	
++	current_input_line = (harmony.current_gain & GAIN_IS_MASK) 
++				    >> GAIN_IS_SHIFT;
++	if (current_input_line) 
++		return SOUND_MASK_MIC;
++
++	return SOUND_MASK_LINE;
++}
++
++/*
++ * Set the input (only one at time, arbitrary priority to line in)
++ */
++
++static int harmony_mixer_set_recmask(int recmask)
++{
++	int new_input_line;
++	int new_input_mask;
++
++	if ((recmask & SOUND_MASK_LINE)) {
++		new_input_line = 0;
++		new_input_mask = SOUND_MASK_LINE;
++	} else  {
++		new_input_line = 1;
++		new_input_mask = SOUND_MASK_MIC;
++	}
++	harmony.current_gain = ((harmony.current_gain & ~GAIN_IS_MASK) | 
++				(new_input_line << GAIN_IS_SHIFT ));
++	harmony_mixer_set_gain();
++	return new_input_mask;
++}
++
++
++/* 
++ * give the active outlines
++ */
++
++static int harmony_mixer_get_outmask(void)
++{
++	int outmask = 0;
++	
++	if (harmony.current_gain & GAIN_HE_MASK) outmask |=SOUND_MASK_PHONEOUT;
++	if (harmony.current_gain & GAIN_LE_MASK) outmask |=SOUND_MASK_LINE;
++	if (harmony.current_gain & GAIN_SE_MASK) outmask |=SOUND_MASK_SPEAKER;
++	
++	return outmask;
++}
++
++
++static int harmony_mixer_set_outmask(int outmask)
++{
++	if (outmask & SOUND_MASK_PHONEOUT) 
++		harmony.current_gain |= GAIN_HE_MASK; 
++	else 
++		harmony.current_gain &= ~GAIN_HE_MASK;
++	
++	if (outmask & SOUND_MASK_LINE) 
++		harmony.current_gain |= GAIN_LE_MASK;
++	else 
++		harmony.current_gain &= ~GAIN_LE_MASK;
++	
++	if (outmask & SOUND_MASK_SPEAKER) 
++		harmony.current_gain |= GAIN_SE_MASK;
++	else 
++		harmony.current_gain &= ~GAIN_SE_MASK;
++	
++	harmony_mixer_set_gain();
++
++	return (outmask & (SOUND_MASK_PHONEOUT | SOUND_MASK_LINE | SOUND_MASK_SPEAKER));
++}
++
++/*
++ * This code is inspired from sb_mixer.c
++ */
++
++static int harmony_mixer_ioctl(struct inode * inode, struct file * file,
++		unsigned int cmd, unsigned long arg)
++{
++	int val;
++	int ret;
++
++	if (cmd == SOUND_MIXER_INFO) {
++		mixer_info info;
++		memset(&info, 0, sizeof(info));
++                strncpy(info.id, "harmony", sizeof(info.id)-1);
++                strncpy(info.name, "Harmony audio", sizeof(info.name)-1);
++                info.modify_counter = 1; /* ? */
++                if (copy_to_user((void *)arg, &info, sizeof(info)))
++                        return -EFAULT;
++		return 0;
++	}
++	
++	if (cmd == OSS_GETVERSION)
++		return put_user(SOUND_VERSION, (int *)arg);
++
++	/* read */
++	val = 0;
++	if (_SIOC_DIR(cmd) & _SIOC_WRITE)
++		if (get_user(val, (int *)arg))
++			return -EFAULT;
++
++	switch (cmd) {
++	case MIXER_READ(SOUND_MIXER_CAPS):
++		ret = SOUND_CAP_EXCL_INPUT;
++		break;
++	case MIXER_READ(SOUND_MIXER_STEREODEVS):
++		ret = SOUND_MASK_IGAIN | SOUND_MASK_OGAIN;
++		break;
++		
++	case MIXER_READ(SOUND_MIXER_RECMASK):
++		ret = SOUND_MASK_MIC | SOUND_MASK_LINE;
++		break;
++	case MIXER_READ(SOUND_MIXER_DEVMASK):
++		ret = SOUND_MASK_OGAIN | SOUND_MASK_IGAIN |
++			SOUND_MASK_VOLUME;
++		break;
++	case MIXER_READ(SOUND_MIXER_OUTMASK):
++		ret = SOUND_MASK_SPEAKER | SOUND_MASK_LINE |
++			SOUND_MASK_PHONEOUT;
++		break;
++		
++	case MIXER_WRITE(SOUND_MIXER_RECSRC):
++		ret = harmony_mixer_set_recmask(val);
++		break;
++	case MIXER_READ(SOUND_MIXER_RECSRC):
++		ret = harmony_mixer_get_recmask();
++		break;
++	      
++	case MIXER_WRITE(SOUND_MIXER_OUTSRC):
++		ret = harmony_mixer_set_outmask(val);
++		break;
++	case MIXER_READ(SOUND_MIXER_OUTSRC):
++		ret = harmony_mixer_get_outmask();
++		break;
++	
++	case MIXER_WRITE(SOUND_MIXER_OGAIN):
++	case MIXER_WRITE(SOUND_MIXER_IGAIN):
++	case MIXER_WRITE(SOUND_MIXER_VOLUME):
++		ret = harmony_mixer_set_level(cmd & 0xff, val);
++		break;
++
++	case MIXER_READ(SOUND_MIXER_OGAIN):
++	case MIXER_READ(SOUND_MIXER_IGAIN):
++	case MIXER_READ(SOUND_MIXER_VOLUME):
++		ret = harmony_mixer_get_level(cmd & 0xff);
++		break;
++
++	default:
++		return -EINVAL;
++	}
++
++	if (put_user(ret, (int *)arg))
++		return -EFAULT;
++	return 0;
++}
++
++
++static int harmony_mixer_open(struct inode *inode, struct file *file)
++{
++	if (harmony.mixer_open) 
++		return -EBUSY;
++	harmony.mixer_open++;
++	return 0;
++}
++
++static int harmony_mixer_release(struct inode *inode, struct file *file)
++{
++	if (!harmony.mixer_open) 
++		return -EBUSY;
++	harmony.mixer_open--;
++	return 0;
++}
++
++static struct file_operations harmony_mixer_fops = {
++	owner:		THIS_MODULE,
++	llseek:		no_llseek,
++	open:		harmony_mixer_open,
++	release:	harmony_mixer_release,
++	ioctl:		harmony_mixer_ioctl,
++};
++
++
++/*
++ * Mute all the output and reset Harmony.
++ */
++
++static void __init harmony_mixer_reset(void)
++{
++	harmony.current_gain = GAIN_TOTAL_SILENCE;
++	harmony_mixer_set_gain();
++	harmony_wait_CNTL();
++	gsc_writel(1, &harmony.hpa->reset);
++	mdelay(50);		/* wait 50 ms */
++	gsc_writel(0, &harmony.hpa->reset);
++	harmony.current_gain = GAIN_DEFAULT;
++	harmony_mixer_set_gain();
++}
++
++static int __init harmony_mixer_init(void)
++{
++	/* Register the device file operations */
++	harmony.mixer_unit = register_sound_mixer(&harmony_mixer_fops, -1);
++	if (harmony.mixer_unit < 0) {
++		printk(KERN_WARNING PFX "Error Registering Mixer Driver\n");
++		return -EFAULT;
++	}
++  
++	harmony_mixer_reset();
++	harmony.mixer_open = 0;
++	
++	return 0;
++}
++
++
++
++/* 
++ * This is the callback that's called by the inventory hardware code 
++ * if it finds a match to the registered driver. 
++ */
++static int __init
++harmony_driver_callback(struct parisc_device *dev)
++{
++	u8	id;
++	u8	rev;
++	u32	cntl;
++	int	ret;
++
++	if (harmony.hpa) {
++		/* We only support one Harmony at this time */
++		printk(KERN_ERR PFX "driver already registered\n");
++		return -EBUSY;
++	}
++
++	/* Set the HPA of harmony */
++	harmony.hpa = (struct harmony_hpa *)dev->hpa;
++
++	harmony.irq = dev->irq;
++	if (!harmony.irq) {
++		printk(KERN_ERR PFX "no irq found\n");
++		return -ENODEV;
++	}
++
++	/* Grab the ID and revision from the device */
++	id = gsc_readb(&harmony.hpa->id);
++	if ((id | 1) != 0x15) {
++		printk(KERN_WARNING PFX "wrong harmony id 0x%02x\n", id);
++		return -EBUSY;
++	}
++	cntl = gsc_readl(&harmony.hpa->cntl);
++	rev = (cntl>>20) & 0xff;
++
++	printk(KERN_INFO "Lasi Harmony Audio driver " HARMONY_VERSION ", "
++			"h/w id %i, rev. %i at 0x%lx, IRQ %i\n",
++			id, rev, dev->hpa, harmony.irq);
++	
++	/* Make sure the control bit isn't set, although I don't think it 
++	   ever is. */
++	if (cntl & CNTL_C) {
++		printk(KERN_WARNING PFX "CNTL busy\n");
++		harmony.hpa = 0;
++		return -EBUSY;
++	}
++
++	/* a fake pci_dev is needed for pci_* functions under ccio */
++	harmony.fake_pci_dev = ccio_get_fake(dev);
++	
++	/* Initialize the memory buffers */
++	if (harmony_alloc_buffer(&played_buf, MAX_BUFS) || 
++	    harmony_alloc_buffer(&recorded_buf, MAX_BUFS) ||
++	    harmony_alloc_buffer(&graveyard, 1) ||
++	    harmony_alloc_buffer(&silent, 1)) {
++		ret = -EBUSY;
++		goto out_err;
++	}
++
++	/* Initialize /dev/mixer and /dev/audio  */
++	if ((ret=harmony_mixer_init())) 
++		goto out_err;
++	if ((ret=harmony_audio_init())) 
++		goto out_err;
++
++	return 0;
++
++out_err:
++	harmony.hpa = 0;
++	harmony_free_buffer(&played_buf);
++	harmony_free_buffer(&recorded_buf);
++	harmony_free_buffer(&graveyard);
++	harmony_free_buffer(&silent);
++	return ret;
++}
++
++
++static struct parisc_device_id harmony_tbl[] = {
++ /* { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007A }, Bushmaster/Flounder */
++ { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007B }, /* 712/715 Audio */
++ { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007E }, /* Pace Audio */
++ { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007F }, /* Outfield / Coral II */
++ { 0, }
++};
++
++MODULE_DEVICE_TABLE(parisc, harmony_tbl);
++
++static struct parisc_driver harmony_driver = {
++	name:		"Lasi Harmony",
++	id_table:	harmony_tbl,
++	probe:		harmony_driver_callback,
++};
++
++static int __init init_harmony(void)
++{
++	return register_parisc_driver(&harmony_driver);
++}
++
++static void __exit cleanup_harmony(void)
++{
++	free_irq(harmony.irq, &harmony);
++	unregister_sound_mixer(harmony.mixer_unit);
++	unregister_sound_dsp(harmony.dsp_unit);
++	harmony_free_buffer(&played_buf);
++	harmony_free_buffer(&recorded_buf);
++	harmony_free_buffer(&graveyard);
++	harmony_free_buffer(&silent);
++	unregister_parisc_driver(&harmony_driver);
++}
++
++EXPORT_NO_SYMBOLS;
++
++MODULE_AUTHOR("Alex DeVries <alex@linuxcare.com>");
++MODULE_DESCRIPTION("Harmony sound driver");
++MODULE_LICENSE("GPL");
++
++module_init(init_harmony);
++module_exit(cleanup_harmony);
++
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25/sound/oss/kahlua.c	2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,227 @@
++/*
++ *	Initialisation code for Cyrix/NatSemi VSA1 softaudio
++ *
++ *	(C) Copyright 2003 Red Hat Inc <alan@redhat.com>
++ *
++ * XpressAudio(tm) is used on the Cyrix MediaGX (now NatSemi Geode) systems.
++ * The older version (VSA1) provides fairly good soundblaster emulation
++ * although there are a couple of bugs: large DMA buffers break record,
++ * and the MPU event handling seems suspect. VSA2 allows the native driver
++ * to control the AC97 audio engine directly and requires a different driver.
++ *
++ * Thanks to National Semiconductor for providing the needed information
++ * on the XpressAudio(tm) internals.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2, or (at your option) any
++ * later version.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * General Public License for more details.
++ *
++ * TO DO:
++ *	Investigate whether we can portably support Cognac (5520) in the
++ *	same manner.
++ */
++
++#include <linux/config.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/pci.h>
++
++#include "sound_config.h"
++
++#include "sb.h"
++
++/*
++ *	Read a soundblaster compatible mixer register.
++ *	In this case we are actually reading an SMI trap
++ *	not real hardware.
++ */
++
++static u8 __devinit mixer_read(unsigned long io, u8 reg)
++{
++	outb(reg, io + 4);
++	udelay(20);
++	reg = inb(io + 5);
++	udelay(20);
++	return reg;
++}
++
++static int __devinit probe_one(struct pci_dev *pdev, const struct pci_device_id *ent)
++{
++	struct address_info *hw_config;
++	unsigned long base;
++	void *mem;
++	unsigned long io;
++	u16 map;
++	u8 irq, dma8, dma16;
++	int oldquiet;
++	extern int sb_be_quiet;
++		
++	base = pci_resource_start(pdev, 0);
++	if(base == 0UL)
++		return 1;
++	
++	mem = ioremap(base, 128);
++	if(mem == 0UL)
++		return 1;
++	map = readw(mem + 0x18);	/* Read the SMI enables */
++	iounmap(mem);
++	
++	/* Map bits
++		0:1	* 0x20 + 0x200 = sb base
++		2	sb enable
++		3	adlib enable
++		5	MPU enable 0x330
++		6	MPU enable 0x300
++		
++	   The other bits may be used internally so must be masked */
++
++	io = 0x220 + 0x20 * (map & 3);	   
++	
++	if(map & (1<<2))
++		printk(KERN_INFO "kahlua: XpressAudio at 0x%lx\n", io);
++	else
++		return 1;
++		
++	if(map & (1<<5))
++		printk(KERN_INFO "kahlua: MPU at 0x300\n");
++	else if(map & (1<<6))
++		printk(KERN_INFO "kahlua: MPU at 0x330\n");
++	
++	irq = mixer_read(io, 0x80) & 0x0F;
++	dma8 = mixer_read(io, 0x81);
++
++	// printk("IRQ=%x MAP=%x DMA=%x\n", irq, map, dma8);
++	
++	if(dma8 & 0x20)
++		dma16 = 5;
++	else if(dma8 & 0x40)
++		dma16 = 6;
++	else if(dma8 & 0x80)
++		dma16 = 7;
++	else
++	{
++		printk(KERN_ERR "kahlua: No 16bit DMA enabled.\n");
++		return 1;
++	}
++		
++	if(dma8 & 0x01)
++		dma8 = 0;
++	else if(dma8 & 0x02)
++		dma8 = 1;
++	else if(dma8 & 0x08)
++		dma8 = 3;
++	else
++	{
++		printk(KERN_ERR "kahlua: No 8bit DMA enabled.\n");
++		return 1;
++	}
++	
++	if(irq & 1)
++		irq = 9;
++	else if(irq & 2)
++		irq = 5;
++	else if(irq & 4)
++		irq = 7;
++	else if(irq & 8)
++		irq = 10;
++	else
++	{
++		printk(KERN_ERR "kahlua: SB IRQ not set.\n");
++		return 1;
++	}
++	
++	printk(KERN_INFO "kahlua: XpressAudio on IRQ %d, DMA %d, %d\n",
++		irq, dma8, dma16);
++	
++	hw_config = kmalloc(sizeof(struct address_info), GFP_KERNEL);
++	if(hw_config == NULL)
++	{
++		printk(KERN_ERR "kahlua: out of memory.\n");
++		return 1;
++	}
++	memset(hw_config, 0, sizeof(*hw_config));
++	
++	pci_set_drvdata(pdev, hw_config);
++	
++	hw_config->io_base = io;
++	hw_config->irq = irq;
++	hw_config->dma = dma8;
++	hw_config->dma2 = dma16;
++	hw_config->name = "Cyrix XpressAudio";
++	hw_config->driver_use_1 = SB_NO_MIDI | SB_PCI_IRQ;
++	
++	if(sb_dsp_detect(hw_config, 0, 0, NULL)==0)
++	{
++		printk(KERN_ERR "kahlua: audio not responding.\n");
++		goto err_out_free;
++	}
++
++	oldquiet = sb_be_quiet;	
++	sb_be_quiet = 1;
++	if(sb_dsp_init(hw_config, THIS_MODULE))
++	{
++		sb_be_quiet = oldquiet;
++		goto err_out_free;
++	}
++	sb_be_quiet = oldquiet;
++	
++	return 0;
++
++err_out_free:
++	pci_set_drvdata(pdev, NULL);
++	kfree(hw_config);
++	return 1;
++}
++
++static void __devexit remove_one(struct pci_dev *pdev)
++{
++	struct address_info *hw_config = pci_get_drvdata(pdev);
++	sb_dsp_unload(hw_config, 0);
++	pci_set_drvdata(pdev, NULL);
++	kfree(hw_config);
++}
++
++MODULE_AUTHOR("Alan Cox");
++MODULE_DESCRIPTION("Kahlua VSA1 PCI Audio");
++MODULE_LICENSE("GPL");
++
++/*
++ *	5530 only. The 5510/5520 decode is different.
++ */
++
++static struct pci_device_id id_tbl[] __devinitdata = {
++	{ PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_AUDIO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
++	{ }
++};
++
++MODULE_DEVICE_TABLE(pci, id_tbl);
++
++static struct pci_driver kahlua_driver = {
++	name:		"kahlua",
++	id_table:	id_tbl,
++	probe:		probe_one,
++	remove:         __devexit_p(remove_one),
++};
++
++
++static int __init kahlua_init_module(void)
++{
++	printk(KERN_INFO "Cyrix Kahlua VSA1 XpressAudio support (c) Copyright 2003 Red Hat Inc\n");
++	return pci_module_init(&kahlua_driver);
++}
++
++static void __devexit kahlua_cleanup_module(void)
++{
++	return pci_unregister_driver(&kahlua_driver);
++}
++
++
++module_init(kahlua_init_module);
++module_exit(kahlua_cleanup_module);
++
+--- linux-2.6.0-test1/sound/oss/Kconfig	2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/Kconfig	2003-07-19 17:03:51.000000000 -0700
+@@ -233,6 +233,10 @@ config SOUND_ICH
+ 	  Support for integral audio in Intel's I/O Controller Hub (ICH)
+ 	  chipset, as used on the 810/820/840 motherboards.
+ 
++config SOUND_HARMONY
++	tristate "PA Harmony audio driver"
++	depends on GSC_LASI && SOUND
++
+ config SOUND_RME96XX
+ 	tristate "RME Hammerfall (RME96XX) support (EXPERIMENTAL)"
+ 	depends on SOUND_PRIME!=n && SOUND && PCI && EXPERIMENTAL
+@@ -260,6 +264,10 @@ config SOUND_VWSND
+ 	  <file:Documentation/sound/oss/vwsnd> for more info on this driver's
+ 	  capabilities.
+ 
++config SOUND_HAL2
++	tristate "SGI HAL2 sound (EXPERIMENTAL)"
++	depends on SGI_IP22 && SOUND && EXPERIMENTAL
++
+ config SOUND_VRC5477
+ 	tristate "NEC Vrc5477 AC97 sound"
+ 	depends on SOUND_PRIME!=n && DDB5477 && SOUND
+@@ -1126,3 +1134,23 @@ config SOUND_TVMIXER
+ 	  Support for audio mixer facilities on the BT848 TV frame-grabber
+ 	  card.
+ 
++config SOUND_KAHLUA
++	tristate "XpressAudio Sound Blaster emulation"
++	depends on SOUND_SB
++
++config SOUND_ALI5455
++	tristate "ALi5455 audio support"
++	depends on SOUND_PRIME!=n && PCI
++
++config SOUND_FORTE
++	tristate "ForteMedia FM801 driver"
++	depends on SOUND_PRIME!=n && PCI
++
++config SOUND_RME96XX
++	tristate "RME Hammerfall (RME96XX) support"
++	depends on SOUND_PRIME!=n && PCI
++
++config SOUND_AD1980
++	tristate "AD1980 front/back switch plugin"
++	depends on SOUND_PRIME!=n
++
+--- linux-2.6.0-test1/sound/oss/Makefile	2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/Makefile	2003-07-19 17:03:51.000000000 -0700
+@@ -10,6 +10,7 @@ obj-$(CONFIG_SOUND_CS4232)	+= cs4232.o a
+ 
+ # Please leave it as is, cause the link order is significant !
+ 
++obj-$(CONFIG_SOUND_HAL2)	+= hal2.o
+ obj-$(CONFIG_SOUND_AEDSP16)	+= aedsp16.o
+ obj-$(CONFIG_SOUND_PSS)		+= pss.o ad1848.o mpu401.o
+ obj-$(CONFIG_SOUND_TRIX)	+= trix.o ad1848.o sb_lib.o uart401.o
+@@ -21,6 +22,7 @@ obj-$(CONFIG_SOUND_MSS)		+= ad1848.o
+ obj-$(CONFIG_SOUND_OPL3SA2)	+= opl3sa2.o ad1848.o mpu401.o
+ obj-$(CONFIG_SOUND_PAS)		+= pas2.o sb.o sb_lib.o uart401.o
+ obj-$(CONFIG_SOUND_SB)		+= sb.o sb_lib.o uart401.o
++obj-$(CONFIG_SOUND_KAHLUA)	+= kahlua.o
+ obj-$(CONFIG_SOUND_WAVEFRONT)	+= wavefront.o
+ obj-$(CONFIG_SOUND_MAUI)	+= maui.o mpu401.o
+ obj-$(CONFIG_SOUND_MPU401)	+= mpu401.o
+@@ -60,10 +62,16 @@ obj-$(CONFIG_SOUND_FUSION)	+= cs46xx.o a
+ obj-$(CONFIG_SOUND_MAESTRO)	+= maestro.o
+ obj-$(CONFIG_SOUND_MAESTRO3)	+= maestro3.o ac97_codec.o
+ obj-$(CONFIG_SOUND_TRIDENT)	+= trident.o ac97_codec.o
++obj-$(CONFIG_SOUND_HARMONY)	+= harmony.o
+ obj-$(CONFIG_SOUND_EMU10K1)	+= ac97_codec.o
+ obj-$(CONFIG_SOUND_RME96XX)     += rme96xx.o
+ obj-$(CONFIG_SOUND_BT878)	+= btaudio.o
++obj-$(CONFIG_SOUND_ALI5455)	+= ali5455.o ac97_codec.o
+ obj-$(CONFIG_SOUND_IT8172)	+= ite8172.o ac97_codec.o
++obj-$(CONFIG_SOUND_FORTE)	+= forte.o
++
++obj-$(CONFIG_SOUND_AD1980)	+= ac97_plugin_ad1980.o
++obj-$(CONFIG_SOUND_WM97XX)	+= ac97_plugin_wm97xx.o
+ 
+ ifeq ($(CONFIG_MIDI_EMU10K1),y)
+   obj-$(CONFIG_SOUND_EMU10K1)	+= sound.o
+--- linux-2.6.0-test1/sound/pci/ice1712/ak4xxx.c	2003-06-14 12:17:55.000000000 -0700
++++ 25/sound/pci/ice1712/ak4xxx.c	2003-07-19 17:06:15.000000000 -0700
+@@ -116,8 +116,8 @@ static void snd_ice1712_akm4xxx_write(ak
+ /*
+  * initialize the akm4xxx_t record with the template
+  */
+-int __devinit snd_ice1712_akm4xxx_init(akm4xxx_t *ak, const akm4xxx_t *temp,
+-				       const struct snd_ak4xxx_private *_priv, ice1712_t *ice)
++int snd_ice1712_akm4xxx_init(akm4xxx_t *ak, const akm4xxx_t *temp,
++			     const struct snd_ak4xxx_private *_priv, ice1712_t *ice)
+ {
+ 	struct snd_ak4xxx_private *priv;
+ 
+@@ -139,7 +139,7 @@ int __devinit snd_ice1712_akm4xxx_init(a
+ 	return 0;
+ }
+ 
+-void __devexit snd_ice1712_akm4xxx_free(ice1712_t *ice)
++void snd_ice1712_akm4xxx_free(ice1712_t *ice)
+ {
+ 	unsigned int akidx;
+ 	if (ice->akm == NULL)
+@@ -155,7 +155,7 @@ void __devexit snd_ice1712_akm4xxx_free(
+ /*
+  * build AK4xxx controls
+  */
+-int __devinit snd_ice1712_akm4xxx_build_controls(ice1712_t *ice)
++int snd_ice1712_akm4xxx_build_controls(ice1712_t *ice)
+ {
+ 	unsigned int akidx;
+ 	int err;
+--- linux-2.6.0-test1/sound/pci/intel8x0.c	2003-06-14 12:18:23.000000000 -0700
++++ 25/sound/pci/intel8x0.c	2003-07-19 17:04:58.000000000 -0700
+@@ -2062,10 +2062,8 @@ static void __devinit intel8x0_measure_a
+ 
+ 	t = stop_time.tv_sec - start_time.tv_sec;
+ 	t *= 1000000;
+-	if (stop_time.tv_usec < start_time.tv_usec)
+-		t -= start_time.tv_usec - stop_time.tv_usec;
+-	else
+-		t += stop_time.tv_usec - start_time.tv_usec;
++	t += stop_time.tv_usec - start_time.tv_usec;
++	printk(KERN_INFO "%s: measured %lu usecs\n", __FUNCTION__, t);
+ 	if (t == 0) {
+ 		snd_printk(KERN_ERR "?? calculation error..\n");
+ 		return;
+--- linux-2.6.0-test1/usr/Makefile	2003-07-10 18:50:32.000000000 -0700
++++ 25/usr/Makefile	2003-07-19 17:03:51.000000000 -0700
+@@ -3,7 +3,7 @@ obj-y := initramfs_data.o
+ 
+ host-progs  := gen_init_cpio
+ 
+-clean-files := initramfs_data.cpio.gz
++clean-files := initramfs_data.cpio.gz initramfs_data.S
+ 
+ $(src)/initramfs_data.S: $(obj)/initramfs_data.cpio.gz
+ 	echo "	.section .init.ramfs,\"a\"" > $(src)/initramfs_data.S
diff --git a/lustre/kernel_patches/patches/dump_netdev.patch b/lustre/kernel_patches/patches/dump_netdev.patch
new file mode 100644
index 0000000000..cd8ec533b7
--- /dev/null
+++ b/lustre/kernel_patches/patches/dump_netdev.patch
@@ -0,0 +1,340 @@
+ drivers/net/3c59x.c            |   27 +++++++++++++++++++++++++++
+ drivers/net/e100/e100_main.c   |   19 +++++++++++++++++++
+ drivers/net/e1000/e1000_main.c |   13 +++++++++++++
+ drivers/net/eepro100.c         |   21 +++++++++++++++++++++
+ drivers/net/smc-ultra.c        |   11 +++++++++++
+ drivers/net/tlan.c             |   14 +++++++++++++-
+ drivers/net/tulip/tulip_core.c |   22 ++++++++++++++++++++++
+ include/linux/netdevice.h      |    3 +++
+ net/core/dev.c                 |   18 ++++++++++++++++--
+ 9 files changed, 145 insertions(+), 3 deletions(-)
+
+--- linux-2.6.0-test1/drivers/net/3c59x.c~dump_netdev	2003-07-22 01:14:04.000000000 -0600
++++ linux-2.6.0-test1-braam/drivers/net/3c59x.c	2003-07-22 01:15:10.000000000 -0600
+@@ -900,6 +900,7 @@ static void set_rx_mode(struct net_devic
+ static int vortex_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
+ static void vortex_tx_timeout(struct net_device *dev);
+ static void acpi_set_WOL(struct net_device *dev);
++static void vorboom_poll(struct net_device *dev);
+ 
+ /* This driver uses 'options' to pass the media type, full-duplex flag, etc. */
+ /* Option count limit only -- unlimited interfaces are supported. */
+@@ -1448,6 +1449,9 @@ static int __devinit vortex_probe1(struc
+ 	dev->set_multicast_list = set_rx_mode;
+ 	dev->tx_timeout = vortex_tx_timeout;
+ 	dev->watchdog_timeo = (watchdog * HZ) / 1000;
++#ifdef HAVE_POLL_CONTROLLER
++	dev->poll_controller = &vorboom_poll;
++#endif
+ 	if (pdev) {
+ 		vp->pm_state_valid = 1;
+  		pci_save_state(VORTEX_PCI(vp), vp->power_state);
+@@ -2438,6 +2442,29 @@ handler_exit:
+ 	return IRQ_HANDLED;
+ }
+ 
++#ifdef HAVE_POLL_CONTROLLER
++
++/*
++ * Polling 'interrupt' - used by things like netconsole to send skbs
++ * without having to re-enable interrupts. It's not called while
++ * the interrupt routine is executing.
++ */
++
++static void vorboom_poll (struct net_device *dev)
++{
++	struct vortex_private *vp = (struct vortex_private *)dev->priv;
++
++	disable_irq(dev->irq);
++	if (vp->full_bus_master_tx)
++		boomerang_interrupt(dev->irq, dev, 0);
++	else
++		vortex_interrupt(dev->irq, dev, 0);
++	enable_irq(dev->irq);
++}
++
++#endif
++
++
+ static int vortex_rx(struct net_device *dev)
+ {
+ 	struct vortex_private *vp = (struct vortex_private *)dev->priv;
+--- linux-2.6.0-test1/drivers/net/e100/e100_main.c~dump_netdev	2003-07-13 21:34:02.000000000 -0600
++++ linux-2.6.0-test1-braam/drivers/net/e100/e100_main.c	2003-07-22 01:14:38.000000000 -0600
+@@ -551,6 +551,22 @@ e100_trigger_SWI(struct e100_private *bd
+ 	readw(&(bdp->scb->scb_status));	/* flushes last write, read-safe */
+ }
+ 
++#ifdef HAVE_POLL_CONTROLLER
++
++/*
++ * Polling 'interrupt' - used by things like netconsole to send skbs
++ * without having to re-enable interrupts. It's not called while
++ * the interrupt routine is executing.
++ */
++static void
++e100_poll(struct net_device *dev)
++{
++	disable_irq(dev->irq);
++	e100intr(dev->irq, dev, NULL);
++	enable_irq(dev->irq);
++}
++#endif
++
+ static int __devinit
+ e100_found1(struct pci_dev *pcid, const struct pci_device_id *ent)
+ {
+@@ -569,6 +585,9 @@ e100_found1(struct pci_dev *pcid, const 
+ 
+ 	SET_MODULE_OWNER(dev);
+ 
++#ifdef HAVE_POLL_CONTROLLER
++	dev->poll_controller = &e100_poll;
++#endif
+ 	if (first_time) {
+ 		first_time = false;
+         	printk(KERN_NOTICE "%s - version %s\n",
+--- linux-2.6.0-test1/drivers/net/e1000/e1000_main.c~dump_netdev	2003-07-13 21:32:43.000000000 -0600
++++ linux-2.6.0-test1-braam/drivers/net/e1000/e1000_main.c	2003-07-22 01:14:38.000000000 -0600
+@@ -138,6 +138,7 @@ static void e1000_leave_82542_rst(struct
+ static inline void e1000_rx_checksum(struct e1000_adapter *adapter,
+                                      struct e1000_rx_desc *rx_desc,
+                                      struct sk_buff *skb);
++static void e1000_Poll(struct net_device *dev);
+ static void e1000_tx_timeout(struct net_device *dev);
+ static void e1000_tx_timeout_task(struct net_device *dev);
+ static void e1000_smartspeed(struct e1000_adapter *adapter);
+@@ -402,6 +403,9 @@ e1000_probe(struct pci_dev *pdev,
+ 
+ 	adapter->bd_number = cards_found;
+ 
++#ifdef HAVE_POLL_CONTROLLER
++	netdev->poll_controller = &e1000_Poll;
++#endif
+ 	/* setup the private structure */
+ 
+ 	if(e1000_sw_init(adapter))
+@@ -1700,6 +1704,15 @@ e1000_xmit_frame(struct sk_buff *skb, st
+ 	return 0;
+ }
+ 
++#ifdef HAVE_POLL_CONTROLLER
++static void e1000_Poll(struct net_device *dev)
++{
++	disable_irq(dev->irq);
++	e1000_intr(dev->irq, dev, NULL);
++	enable_irq(dev->irq);
++}
++#endif
++
+ /**
+  * e1000_tx_timeout - Respond to a Tx Hang
+  * @netdev: network interface device structure
+--- linux-2.6.0-test1/drivers/net/eepro100.c~dump_netdev	2003-07-13 21:35:52.000000000 -0600
++++ linux-2.6.0-test1-braam/drivers/net/eepro100.c	2003-07-22 01:14:38.000000000 -0600
+@@ -543,6 +543,7 @@ static void speedo_refill_rx_buffers(str
+ static int speedo_rx(struct net_device *dev);
+ static void speedo_tx_buffer_gc(struct net_device *dev);
+ static irqreturn_t speedo_interrupt(int irq, void *dev_instance, struct pt_regs *regs);
++static void poll_speedo (struct net_device *dev);
+ static int speedo_close(struct net_device *dev);
+ static struct net_device_stats *speedo_get_stats(struct net_device *dev);
+ static int speedo_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
+@@ -885,6 +886,9 @@ static int __devinit speedo_found1(struc
+ 	dev->get_stats = &speedo_get_stats;
+ 	dev->set_multicast_list = &set_rx_mode;
+ 	dev->do_ioctl = &speedo_ioctl;
++#ifdef HAVE_POLL_CONTROLLER
++	dev->poll_controller = &poll_speedo;
++#endif
+ 
+ 	if (register_netdevice(dev))
+ 		goto err_free_unlock;
+@@ -1675,6 +1679,23 @@ static irqreturn_t speedo_interrupt(int 
+ 	return IRQ_RETVAL(handled);
+ }
+ 
++#ifdef HAVE_POLL_CONTROLLER
++
++/*
++ * Polling 'interrupt' - used by things like netconsole to send skbs
++ * without having to re-enable interrupts. It's not called while
++ * the interrupt routine is executing.
++ */
++
++static void poll_speedo (struct net_device *dev)
++{
++	disable_irq(dev->irq);
++	speedo_interrupt (dev->irq, dev, NULL);
++	enable_irq(dev->irq);
++}
++
++#endif
++
+ static inline struct RxFD *speedo_rx_alloc(struct net_device *dev, int entry)
+ {
+ 	struct speedo_private *sp = (struct speedo_private *)dev->priv;
+--- linux-2.6.0-test1/drivers/net/smc-ultra.c~dump_netdev	2003-07-13 21:30:47.000000000 -0600
++++ linux-2.6.0-test1-braam/drivers/net/smc-ultra.c	2003-07-22 01:14:38.000000000 -0600
+@@ -122,6 +122,14 @@ MODULE_DEVICE_TABLE(isapnp, ultra_device
+ #define ULTRA_IO_EXTENT 32
+ #define EN0_ERWCNT		0x08	/* Early receive warning count. */
+ 
++
++static void ultra_poll(struct net_device *dev)
++{
++	disable_irq(dev->irq);
++	ei_interrupt(dev->irq, dev, NULL);
++	enable_irq(dev->irq);
++}
++
+ /*	Probe for the Ultra.  This looks like a 8013 with the station
+ 	address PROM at I/O ports <base>+8 to <base>+13, with a checksum
+ 	following.
+@@ -134,6 +142,9 @@ int __init ultra_probe(struct net_device
+ 
+ 	SET_MODULE_OWNER(dev);
+ 
++#ifdef HAVE_POLL_CONTROLLER
++	dev->poll_controller = &ultra_poll;
++#endif
+ 	if (base_addr > 0x1ff)		/* Check a single specified location. */
+ 		return ultra_probe1(dev, base_addr);
+ 	else if (base_addr != 0)	/* Don't probe at all. */
+--- linux-2.6.0-test1/drivers/net/tlan.c~dump_netdev	2003-07-13 21:30:42.000000000 -0600
++++ linux-2.6.0-test1-braam/drivers/net/tlan.c	2003-07-22 01:14:38.000000000 -0600
+@@ -345,6 +345,8 @@ static int	TLan_EeSendByte( u16, u8, int
+ static void	TLan_EeReceiveByte( u16, u8 *, int );
+ static int	TLan_EeReadByte( struct net_device *, u8, u8 * );
+ 
++static void	TLan_Poll(struct net_device *);
++
+ 
+ static void 
+ TLan_StoreSKB( struct tlan_list_tag *tag, struct sk_buff *skb)
+@@ -890,6 +892,9 @@ static int TLan_Init( struct net_device 
+ 	dev->get_stats = &TLan_GetStats;
+ 	dev->set_multicast_list = &TLan_SetMulticastList;
+ 	dev->do_ioctl = &TLan_ioctl;
++#ifdef HAVE_POLL_CONTROLLER
++	dev->poll_controller = &TLan_Poll;
++#endif
+ 	dev->tx_timeout = &TLan_tx_timeout;
+ 	dev->watchdog_timeo = TX_TIMEOUT;
+ 
+@@ -1173,7 +1178,14 @@ static irqreturn_t TLan_HandleInterrupt(
+ 	return IRQ_HANDLED;
+ } /* TLan_HandleInterrupts */
+ 
+-
++#ifdef HAVE_POLL_CONTROLLER
++static void TLan_Poll(struct net_device *dev)
++{
++	disable_irq(dev->irq);
++	TLan_HandleInterrupt(dev->irq, dev, NULL);
++	enable_irq(dev->irq);
++}
++#endif
+ 
+ 
+ 	/***************************************************************
+--- linux-2.6.0-test1/drivers/net/tulip/tulip_core.c~dump_netdev	2003-07-13 21:34:48.000000000 -0600
++++ linux-2.6.0-test1-braam/drivers/net/tulip/tulip_core.c	2003-07-22 01:14:38.000000000 -0600
+@@ -245,6 +245,7 @@ static void tulip_down(struct net_device
+ static struct net_device_stats *tulip_get_stats(struct net_device *dev);
+ static int private_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
+ static void set_rx_mode(struct net_device *dev);
++static void poll_tulip(struct net_device *dev);
+ 
+ 
+ 
+@@ -1630,6 +1631,9 @@ static int __devinit tulip_init_one (str
+ 	dev->get_stats = tulip_get_stats;
+ 	dev->do_ioctl = private_ioctl;
+ 	dev->set_multicast_list = set_rx_mode;
++#ifdef HAVE_POLL_CONTROLLER
++	dev->poll_controller = &poll_tulip;
++#endif
+ 
+ 	if (register_netdev(dev))
+ 		goto err_out_free_ring;
+@@ -1787,6 +1791,24 @@ static void __devexit tulip_remove_one (
+ }
+ 
+ 
++#ifdef HAVE_POLL_CONTROLLER
++
++/*
++ * Polling 'interrupt' - used by things like netconsole to send skbs
++ * without having to re-enable interrupts. It's not called while
++ * the interrupt routine is executing.
++ */
++
++static void poll_tulip (struct net_device *dev)
++{
++       disable_irq(dev->irq);
++       tulip_interrupt (dev->irq, dev, NULL);
++       enable_irq(dev->irq);
++}
++
++#endif
++
++
+ static struct pci_driver tulip_driver = {
+ 	.name		= DRV_NAME,
+ 	.id_table	= tulip_pci_tbl,
+--- linux-2.6.0-test1/include/linux/netdevice.h~dump_netdev	2003-07-22 01:14:05.000000000 -0600
++++ linux-2.6.0-test1-braam/include/linux/netdevice.h	2003-07-22 01:14:38.000000000 -0600
+@@ -446,6 +446,9 @@ struct net_device
+ 						     unsigned char *haddr);
+ 	int			(*neigh_setup)(struct net_device *dev, struct neigh_parms *);
+ 	int			(*accept_fastpath)(struct net_device *, struct dst_entry*);
++#define HAVE_POLL_CONTROLLER
++ 	void			(*poll_controller)(struct net_device *dev);
++	int			(*rx_hook)(struct sk_buff *skb);
+ 
+ 	/* bridge stuff */
+ 	struct net_bridge_port	*br_port;
+--- linux-2.6.0-test1/net/core/dev.c~dump_netdev	2003-07-22 01:14:05.000000000 -0600
++++ linux-2.6.0-test1-braam/net/core/dev.c	2003-07-22 01:14:38.000000000 -0600
+@@ -1349,8 +1349,6 @@ int netif_rx(struct sk_buff *skb)
+ 	struct softnet_data *queue;
+ 	unsigned long flags;
+ 
+-	if (!skb->stamp.tv_sec)
+-		do_gettimeofday(&skb->stamp);
+ 
+ 	/*
+ 	 * The code is rearranged so that the path is the most
+@@ -1360,6 +1358,13 @@ int netif_rx(struct sk_buff *skb)
+ 	this_cpu = smp_processor_id();
+ 	queue = &__get_cpu_var(softnet_data);
+ 
++	if (skb->dev->rx_hook)
++		goto rx_hook;
++rx_hook_continue:
++
++	if (!skb->stamp.tv_sec )
++		do_gettimeofday(&skb->stamp);
++
+ 	netdev_rx_stat[this_cpu].total++;
+ 	if (queue->input_pkt_queue.qlen <= netdev_max_backlog) {
+ 		if (queue->input_pkt_queue.qlen) {
+@@ -1402,6 +1407,15 @@ drop:
+ 
+ 	kfree_skb(skb);
+ 	return NET_RX_DROP;
++rx_hook:
++	{
++		int ret;
++
++		ret = skb->dev->rx_hook(skb);
++		if (ret == NET_RX_DROP)
++			goto drop;
++		goto rx_hook_continue;
++	}
+ }
+ 
+ /* Deliver skb to an old protocol, which is not threaded well
+
+_
diff --git a/lustre/kernel_patches/patches/ext3-2.4.18-fixes.patch b/lustre/kernel_patches/patches/ext3-2.4.18-fixes.patch
deleted file mode 100644
index 56e841edd4..0000000000
--- a/lustre/kernel_patches/patches/ext3-2.4.18-fixes.patch
+++ /dev/null
@@ -1,353 +0,0 @@
-diff -ru lum-2.4.18-um30/fs/ext3/balloc.c uml-2.4.18-12.5/fs/ext3/balloc.c
---- lum-2.4.18-um30/fs/ext3/balloc.c	Mon Feb 25 12:38:08 2002
-+++ uml-2.4.18-12.5/fs/ext3/balloc.c	Thu Sep 19 13:40:11 2002
-@@ -276,7 +276,8 @@
- 	}
- 	lock_super (sb);
- 	es = sb->u.ext3_sb.s_es;
--	if (block < le32_to_cpu(es->s_first_data_block) || 
-+	if (block < le32_to_cpu(es->s_first_data_block) ||
-+	    block + count < block ||
- 	    (block + count) > le32_to_cpu(es->s_blocks_count)) {
- 		ext3_error (sb, "ext3_free_blocks",
- 			    "Freeing blocks not in datazone - "
-@@ -309,17 +310,6 @@
- 	if (!gdp)
- 		goto error_return;
- 
--	if (in_range (le32_to_cpu(gdp->bg_block_bitmap), block, count) ||
--	    in_range (le32_to_cpu(gdp->bg_inode_bitmap), block, count) ||
--	    in_range (block, le32_to_cpu(gdp->bg_inode_table),
--		      sb->u.ext3_sb.s_itb_per_group) ||
--	    in_range (block + count - 1, le32_to_cpu(gdp->bg_inode_table),
--		      sb->u.ext3_sb.s_itb_per_group))
--		ext3_error (sb, "ext3_free_blocks",
--			    "Freeing blocks in system zones - "
--			    "Block = %lu, count = %lu",
--			    block, count);
--
- 	/*
- 	 * We are about to start releasing blocks in the bitmap,
- 	 * so we need undo access.
-@@ -345,14 +335,24 @@
- 	if (err)
- 		goto error_return;
- 
--	for (i = 0; i < count; i++) {
-+	for (i = 0; i < count; i++, block++) {
-+		if (block == le32_to_cpu(gdp->bg_block_bitmap) ||
-+		    block == le32_to_cpu(gdp->bg_inode_bitmap) ||
-+		    in_range(block, le32_to_cpu(gdp->bg_inode_table),
-+			     sb->u.ext2_sb.s_itb_per_group)) {
-+			ext3_error(sb, __FUNCTION__,
-+				   "Freeing block in system zone - block = %lu",
-+				   block);
-+			continue;
-+		}
-+
- 		/*
- 		 * An HJ special.  This is expensive...
- 		 */
- #ifdef CONFIG_JBD_DEBUG
- 		{
- 			struct buffer_head *debug_bh;
--			debug_bh = sb_get_hash_table(sb, block + i);
-+			debug_bh = sb_get_hash_table(sb, block);
- 			if (debug_bh) {
- 				BUFFER_TRACE(debug_bh, "Deleted!");
- 				if (!bh2jh(bitmap_bh)->b_committed_data)
-@@ -365,9 +365,8 @@
- #endif
- 		BUFFER_TRACE(bitmap_bh, "clear bit");
- 		if (!ext3_clear_bit (bit + i, bitmap_bh->b_data)) {
--			ext3_error (sb, __FUNCTION__,
--				      "bit already cleared for block %lu", 
--				      block + i);
-+			ext3_error(sb, __FUNCTION__,
-+				   "bit already cleared for block %lu", block);
- 			BUFFER_TRACE(bitmap_bh, "bit already cleared");
- 		} else {
- 			dquot_freed_blocks++;
-@@ -415,7 +417,6 @@
- 	if (!err) err = ret;
- 
- 	if (overflow && !err) {
--		block += count;
- 		count = overflow;
- 		goto do_more;
- 	}
-@@ -542,6 +543,7 @@
- 	int i, j, k, tmp, alloctmp;
- 	int bitmap_nr;
- 	int fatal = 0, err;
-+	int performed_allocation = 0;
- 	struct super_block * sb;
- 	struct ext3_group_desc * gdp;
- 	struct ext3_super_block * es;
-@@ -575,6 +577,7 @@
- 
- 	ext3_debug ("goal=%lu.\n", goal);
- 
-+repeat:
- 	/*
- 	 * First, test whether the goal block is free.
- 	 */
-@@ -644,8 +647,7 @@
- 	}
- 
- 	/* No space left on the device */
--	unlock_super (sb);
--	return 0;
-+	goto out;
- 
- search_back:
- 	/* 
-@@ -684,16 +686,28 @@
- 	if (tmp == le32_to_cpu(gdp->bg_block_bitmap) ||
- 	    tmp == le32_to_cpu(gdp->bg_inode_bitmap) ||
- 	    in_range (tmp, le32_to_cpu(gdp->bg_inode_table),
--		      sb->u.ext3_sb.s_itb_per_group))
--		ext3_error (sb, "ext3_new_block",
--			    "Allocating block in system zone - "
--			    "block = %u", tmp);
-+		      EXT3_SB(sb)->s_itb_per_group)) {
-+		ext3_error(sb, __FUNCTION__,
-+			   "Allocating block in system zone - block = %u", tmp);
-+
-+		/* Note: This will potentially use up one of the handle's
-+		 * buffer credits.  Normally we have way too many credits,
-+		 * so that is OK.  In _very_ rare cases it might not be OK.
-+		 * We will trigger an assertion if we run out of credits,
-+		 * and we will have to do a full fsck of the filesystem -
-+		 * better than randomly corrupting filesystem metadata.
-+		 */
-+		ext3_set_bit(j, bh->b_data);
-+		goto repeat;
-+	}
-+
- 
- 	/* The superblock lock should guard against anybody else beating
- 	 * us to this point! */
- 	J_ASSERT_BH(bh, !ext3_test_bit(j, bh->b_data));
- 	BUFFER_TRACE(bh, "setting bitmap bit");
- 	ext3_set_bit(j, bh->b_data);
-+	performed_allocation = 1;
- 
- #ifdef CONFIG_JBD_DEBUG
- 	{
-@@ -815,6 +829,11 @@
- 		ext3_std_error(sb, fatal);
- 	}
- 	unlock_super (sb);
-+	/*
-+	 * Undo the block allocation
-+	 */
-+	if (!performed_allocation)
-+		DQUOT_FREE_BLOCK(inode, 1);
- 	return 0;
- 	
- }
-diff -ru lum-2.4.18-um30/fs/ext3/file.c uml-2.4.18-12.5/fs/ext3/file.c
---- lum-2.4.18-um30/fs/ext3/file.c	Thu Nov 15 14:37:55 2001
-+++ uml-2.4.18-12.5/fs/ext3/file.c	Thu Sep 19 13:40:11 2002
-@@ -61,19 +61,52 @@
- static ssize_t
- ext3_file_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
- {
-+	int ret, err;
- 	struct inode *inode = file->f_dentry->d_inode;
- 
--	/*
--	 * Nasty: if the file is subject to synchronous writes then we need
--	 * to force generic_osync_inode() to call ext3_write_inode().
--	 * We do that by marking the inode dirty.  This adds much more
--	 * computational expense than we need, but we're going to sync
--	 * anyway.
--	 */
--	if (IS_SYNC(inode) || (file->f_flags & O_SYNC))
--		mark_inode_dirty(inode);
-+	ret = generic_file_write(file, buf, count, ppos);
- 
--	return generic_file_write(file, buf, count, ppos);
-+	/* Skip file flushing code if there was an error, or if nothing
-+	   was written. */
-+	if (ret <= 0)
-+		return ret;
-+	
-+	/* If the inode is IS_SYNC, or is O_SYNC and we are doing
-+           data-journaling, then we need to make sure that we force the
-+           transaction to disk to keep all metadata uptodate
-+           synchronously. */
-+
-+	if (file->f_flags & O_SYNC) {
-+		/* If we are non-data-journaled, then the dirty data has
-+                   already been flushed to backing store by
-+                   generic_osync_inode, and the inode has been flushed
-+                   too if there have been any modifications other than
-+                   mere timestamp updates.
-+		   
-+		   Open question --- do we care about flushing
-+		   timestamps too if the inode is IS_SYNC? */
-+		if (!ext3_should_journal_data(inode))
-+			return ret;
-+
-+		goto force_commit;
-+	}
-+
-+	/* So we know that there has been no forced data flush.  If the
-+           inode is marked IS_SYNC, we need to force one ourselves. */
-+	if (!IS_SYNC(inode))
-+		return ret;
-+	
-+	/* Open question #2 --- should we force data to disk here too?
-+           If we don't, the only impact is that data=writeback
-+           filesystems won't flush data to disk automatically on
-+           IS_SYNC, only metadata (but historically, that is what ext2
-+           has done.) */
-+	
-+force_commit:
-+	err = ext3_force_commit(inode->i_sb);
-+	if (err) 
-+		return err;
-+	return ret;
- }
- 
- struct file_operations ext3_file_operations = {
-diff -ru lum-2.4.18-um30/fs/ext3/fsync.c uml-2.4.18-12.5/fs/ext3/fsync.c
---- lum-2.4.18-um30/fs/ext3/fsync.c	Tue Nov 20 22:34:13 2001
-+++ uml-2.4.18-12.5/fs/ext3/fsync.c	Thu Sep 19 13:40:11 2002
-@@ -62,7 +62,12 @@
- 	 * we'll end up waiting on them in commit.
- 	 */
- 	ret = fsync_inode_buffers(inode);
--	ret |= fsync_inode_data_buffers(inode);
-+
-+	/* In writeback mode, we need to force out data buffers too.  In
-+	 * the other modes, ext3_force_commit takes care of forcing out
-+	 * just the right data blocks. */
-+	if (test_opt(inode->i_sb, DATA_FLAGS) == EXT3_MOUNT_WRITEBACK_DATA)
-+		ret |= fsync_inode_data_buffers(inode);
- 
- 	ext3_force_commit(inode->i_sb);
- 
-diff -ru lum-2.4.18-um30/fs/ext3/ialloc.c uml-2.4.18-12.5/fs/ext3/ialloc.c
---- lum-2.4.18-um30/fs/ext3/ialloc.c	Mon Feb 25 12:38:08 2002
-+++ uml-2.4.18-12.5/fs/ext3/ialloc.c	Thu Sep 19 13:40:11 2002
-@@ -392,7 +392,7 @@
- 
- 	err = -ENOSPC;
- 	if (!gdp)
--		goto fail;
-+		goto out;
- 
- 	err = -EIO;
- 	bitmap_nr = load_inode_bitmap (sb, i);
-@@ -523,9 +523,10 @@
- 	return inode;
- 
- fail:
-+	ext3_std_error(sb, err);
-+out:
- 	unlock_super(sb);
- 	iput(inode);
--	ext3_std_error(sb, err);
- 	return ERR_PTR(err);
- }
- 
-diff -ru lum-2.4.18-um30/fs/ext3/inode.c uml-2.4.18-12.5/fs/ext3/inode.c
---- lum-2.4.18-um30/fs/ext3/inode.c	Mon Feb 25 12:38:08 2002
-+++ uml-2.4.18-12.5/fs/ext3/inode.c	Thu Sep 19 13:40:11 2002
-@@ -412,6 +412,7 @@
- 	return NULL;
- 
- changed:
-+	brelse(bh);
- 	*err = -EAGAIN;
- 	goto no_block;
- failure:
-@@ -581,8 +582,6 @@
- 			
- 			parent = nr;
- 		}
--		if (IS_SYNC(inode))
--			handle->h_sync = 1;
- 	}
- 	if (n == num)
- 		return 0;
-@@ -1015,8 +1018,8 @@
- 			      unsigned from, unsigned to)
- {
- 	struct inode *inode = page->mapping->host;
--	handle_t *handle = ext3_journal_current_handle();
- 	int ret, needed_blocks = ext3_writepage_trans_blocks(inode);
-+	handle_t *handle;
- 
- 	lock_kernel();
- 	handle = ext3_journal_start(inode, needed_blocks);
-diff -ru lum-2.4.18-um30/fs/ext3/namei.c uml-2.4.18-12.5/fs/ext3/namei.c
---- lum-2.4.18-um30/fs/ext3/namei.c	Fri Nov  9 15:25:04 2001
-+++ uml-2.4.18-12.5/fs/ext3/namei.c	Thu Sep 19 13:40:11 2002
-@@ -354,8 +355,8 @@
- 			 */
- 			dir->i_mtime = dir->i_ctime = CURRENT_TIME;
- 			dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL;
--			ext3_mark_inode_dirty(handle, dir);
- 			dir->i_version = ++event;
-+			ext3_mark_inode_dirty(handle, dir);
- 			BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
- 			ext3_journal_dirty_metadata(handle, bh);
- 			brelse(bh);
-@@ -464,8 +465,8 @@
- 		inode->i_op = &ext3_file_inode_operations;
- 		inode->i_fop = &ext3_file_operations;
- 		inode->i_mapping->a_ops = &ext3_aops;
--		ext3_mark_inode_dirty(handle, inode);
- 		err = ext3_add_nondir(handle, dentry, inode);
-+		ext3_mark_inode_dirty(handle, inode);
- 	}
- 	ext3_journal_stop(handle, dir);
- 	return err;
-@@ -489,8 +490,8 @@
- 	err = PTR_ERR(inode);
- 	if (!IS_ERR(inode)) {
- 		init_special_inode(inode, mode, rdev);
--		ext3_mark_inode_dirty(handle, inode);
- 		err = ext3_add_nondir(handle, dentry, inode);
-+		ext3_mark_inode_dirty(handle, inode);
- 	}
- 	ext3_journal_stop(handle, dir);
- 	return err;
-@@ -933,8 +934,8 @@
- 		inode->i_size = l-1;
- 	}
- 	inode->u.ext3_i.i_disksize = inode->i_size;
--	ext3_mark_inode_dirty(handle, inode);
- 	err = ext3_add_nondir(handle, dentry, inode);
-+	ext3_mark_inode_dirty(handle, inode);
- out_stop:
- 	ext3_journal_stop(handle, dir);
- 	return err;
-@@ -970,8 +971,8 @@
- 	ext3_inc_count(handle, inode);
- 	atomic_inc(&inode->i_count);
- 
--	ext3_mark_inode_dirty(handle, inode);
- 	err = ext3_add_nondir(handle, dentry, inode);
-+	ext3_mark_inode_dirty(handle, inode);
- 	ext3_journal_stop(handle, dir);
- 	return err;
- }
-diff -ru lum-2.4.18-um30/fs/ext3/super.c uml-2.4.18-12.5/fs/ext3/super.c
---- lum-2.4.18-um30/fs/ext3/super.c	Fri Jul 12 17:59:37 2002
-+++ uml-2.4.18-12.5/fs/ext3/super.c	Thu Sep 19 13:40:11 2002
-@@ -1589,8 +1589,10 @@
- 		journal_t *journal = EXT3_SB(sb)->s_journal;
- 
- 		/* Now we set up the journal barrier. */
-+		unlock_super(sb);
- 		journal_lock_updates(journal);
- 		journal_flush(journal);
-+		lock_super(sb);
- 
- 		/* Journal blocked and flushed, clear needs_recovery flag. */
- 		EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER);
diff --git a/lustre/kernel_patches/patches/ext3-2.5-noread.patch b/lustre/kernel_patches/patches/ext3-2.5-noread.patch
deleted file mode 100644
index 1aa2578934..0000000000
--- a/lustre/kernel_patches/patches/ext3-2.5-noread.patch
+++ /dev/null
@@ -1,266 +0,0 @@
-===== fs/ext3/ialloc.c 1.26 vs edited =====
---- 1.26/fs/ext3/ialloc.c	Fri Feb 14 19:24:09 2003
-+++ edited/fs/ext3/ialloc.c	Sat Mar  8 01:20:55 2003
-@@ -195,6 +195,36 @@
- }
- 
- /*
-+ * @block_group: block group of inode
-+ * @offset: relative offset of inode within @block_group
-+ *
-+ * Check whether any of the inodes in this disk block are in use.
-+ *
-+ * Caller must be holding superblock lock (group/bitmap read lock in
-+ * future).
-+ */
-+int ext3_itable_block_used(struct super_block *sb, unsigned int block_group,
-+			   int offset)
-+{
-+	struct buffer_head *ibitmap = read_inode_bitmap(sb, block_group);
-+	int inodes_per_block;
-+	unsigned long inum, iend;
-+
-+	if (!ibitmap)
-+		return 1;
-+
-+	inodes_per_block = sb->s_blocksize / EXT3_SB(sb)->s_inode_size;
-+	inum = offset & ~(inodes_per_block - 1);
-+	iend = inum + inodes_per_block;
-+	for (; inum < iend; inum++) {
-+		if (inum != offset && ext3_test_bit(inum, ibitmap->b_data))
-+			return 1;
-+	}
-+
-+	return 0;
-+}
-+
-+/*
-  * There are two policies for allocating an inode.  If the new inode is
-  * a directory, then a forward search is made for a block group with both
-  * free space and a low directory-to-inode ratio; if that fails, then of
-@@ -422,8 +452,9 @@
- 	struct ext3_group_desc * gdp;
- 	struct ext3_super_block * es;
- 	struct ext3_inode_info *ei;
--	int err = 0;
-+	struct ext3_iloc iloc;
- 	struct inode *ret;
-+	int err = 0;
- 
- 	/* Cannot create files in a deleted directory */
- 	if (!dir || !dir->i_nlink)
-@@ -587,16 +618,23 @@
- 		goto fail2;
- 	}
- 	err = ext3_init_acl(handle, inode, dir);
-+	if (err)
-+		goto fail3;
-+
-+	err = ext3_get_inode_loc_new(inode, &iloc, 1);
-+	if (err)
-+		goto fail3;
-+
-+	BUFFER_TRACE(iloc->bh, "get_write_access");
-+	err = ext3_journal_get_write_access(handle, iloc.bh);
- 	if (err) {
--		DQUOT_FREE_INODE(inode);
--		goto fail2;
--  	}
--	err = ext3_mark_inode_dirty(handle, inode);
--	if (err) {
--		ext3_std_error(sb, err);
--		DQUOT_FREE_INODE(inode);
--		goto fail2;
--	}
-+		brelse(iloc.bh);
-+		iloc.bh = NULL;
-+		goto fail3;
-+	}
-+	err = ext3_mark_iloc_dirty(handle, inode, &iloc);
-+	if (err)
-+		goto fail3;
- 
- 	ext3_debug("allocating inode %lu\n", inode->i_ino);
- 	goto really_out;
-@@ -610,6 +648,9 @@
- 	brelse(bitmap_bh);
- 	return ret;
- 
-+fail3:
-+	ext3_std_error(sb, err);
-+	DQUOT_FREE_INODE(inode);
- fail2:
- 	inode->i_flags |= S_NOQUOTA;
- 	inode->i_nlink = 0;
-===== fs/ext3/inode.c 1.62 vs edited =====
---- 1.62/fs/ext3/inode.c	Fri Feb 14 19:24:09 2003
-+++ edited/fs/ext3/inode.c	Sat Mar  8 02:10:39 2003
-@@ -2144,69 +2144,118 @@
- 	unlock_kernel();
- }
- 
--/* 
-- * ext3_get_inode_loc returns with an extra refcount against the
-- * inode's underlying buffer_head on success. 
-- */
-+#define NUM_INODE_PREREAD 16
- 
--int ext3_get_inode_loc (struct inode *inode, struct ext3_iloc *iloc)
-+/*
-+ * ext3_get_inode_loc returns with an extra refcount against the inode's
-+ * underlying buffer_head on success.  If this is for a new inode allocation
-+ * (new is non-zero) then we may be able to optimize away the read if there
-+ * are no other in-use inodes in this inode table block.  If we need to do
-+ * a read, then read in a whole chunk of blocks to avoid blocking again soon
-+ * if we are doing lots of creates/updates.
-+ */
-+int ext3_get_inode_loc_new(struct inode *inode, struct ext3_iloc *iloc, int new)
- {
--	struct buffer_head *bh = 0;
-+	struct buffer_head *bh[NUM_INODE_PREREAD];
-+	struct super_block *sb = inode->i_sb;
-+	struct ext3_sb_info *sbi = EXT3_SB(sb);
-+	unsigned long ino = inode->i_ino;
- 	unsigned long block;
- 	unsigned long block_group;
- 	unsigned long group_desc;
- 	unsigned long desc;
- 	unsigned long offset;
- 	struct ext3_group_desc * gdp;
--		
--	if ((inode->i_ino != EXT3_ROOT_INO &&
--		inode->i_ino != EXT3_JOURNAL_INO &&
--		inode->i_ino < EXT3_FIRST_INO(inode->i_sb)) ||
--		inode->i_ino > le32_to_cpu(
--			EXT3_SB(inode->i_sb)->s_es->s_inodes_count)) {
--		ext3_error (inode->i_sb, "ext3_get_inode_loc",
--			    "bad inode number: %lu", inode->i_ino);
-+
-+	if ((ino != EXT3_ROOT_INO && ino != EXT3_JOURNAL_INO &&
-+	     ino < EXT3_FIRST_INO(sb)) ||
-+	    ino > le32_to_cpu(sbi->s_es->s_inodes_count)) {
-+		ext3_error(sb, "ext3_get_inode_loc", "bad inode number: %lu",
-+			   ino);
- 		goto bad_inode;
- 	}
--	block_group = (inode->i_ino - 1) / EXT3_INODES_PER_GROUP(inode->i_sb);
--	if (block_group >= EXT3_SB(inode->i_sb)->s_groups_count) {
--		ext3_error (inode->i_sb, "ext3_get_inode_loc",
--			    "group >= groups count");
-+	block_group = (ino - 1) / EXT3_INODES_PER_GROUP(sb);
-+	if (block_group >= EXT3_SB(sb)->s_groups_count) {
-+		ext3_error(sb, "ext3_get_inode_loc", "group >= groups count");
- 		goto bad_inode;
- 	}
--	group_desc = block_group >> EXT3_DESC_PER_BLOCK_BITS(inode->i_sb);
--	desc = block_group & (EXT3_DESC_PER_BLOCK(inode->i_sb) - 1);
--	bh = EXT3_SB(inode->i_sb)->s_group_desc[group_desc];
--	if (!bh) {
--		ext3_error (inode->i_sb, "ext3_get_inode_loc",
--			    "Descriptor not loaded");
-+	group_desc = block_group >> EXT3_DESC_PER_BLOCK_BITS(sb);
-+	desc = block_group & (EXT3_DESC_PER_BLOCK(sb) - 1);
-+	if (!sbi->s_group_desc[group_desc]) {
-+		ext3_error(sb, "ext3_get_inode_loc", "Descriptor not loaded");
- 		goto bad_inode;
- 	}
- 
--	gdp = (struct ext3_group_desc *) bh->b_data;
-+	gdp = (struct ext3_group_desc *)(sbi->s_group_desc[group_desc]->b_data);
- 	/*
- 	 * Figure out the offset within the block group inode table
- 	 */
--	offset = ((inode->i_ino - 1) % EXT3_INODES_PER_GROUP(inode->i_sb)) *
--		EXT3_INODE_SIZE(inode->i_sb);
-+	offset = ((ino - 1) % EXT3_INODES_PER_GROUP(sb));
- 	block = le32_to_cpu(gdp[desc].bg_inode_table) +
--		(offset >> EXT3_BLOCK_SIZE_BITS(inode->i_sb));
--	if (!(bh = sb_bread(inode->i_sb, block))) {
--		ext3_error (inode->i_sb, "ext3_get_inode_loc",
--			    "unable to read inode block - "
--			    "inode=%lu, block=%lu", inode->i_ino, block);
--		goto bad_inode;
-+		(offset * sbi->s_inode_size >> EXT3_BLOCK_SIZE_BITS(sb));
-+	bh[0] = sb_getblk(sb, block);
-+	if (buffer_uptodate(bh[0]))
-+		goto done;
-+
-+	/* If we don't really need to read this block, and it isn't already
-+	 * in memory, then we just zero it out.  Otherwise, we keep the
-+	 * current block contents (deleted inode data) for posterity.
-+	 */
-+	if (new && !ext3_itable_block_used(sb, block_group, offset)) {
-+		lock_buffer(bh[0]);
-+		memset(bh[0]->b_data, 0, bh[0]->b_size);
-+		set_buffer_uptodate(bh[0]);
-+		unlock_buffer(bh[0]);
-+	} else {
-+		unsigned long block_end, itable_end;
-+		int count = 1;
-+
-+		itable_end = le32_to_cpu(gdp[desc].bg_inode_table) +
-+			sbi->s_itb_per_group;
-+		block_end = block + NUM_INODE_PREREAD;
-+		if (block_end > itable_end)
-+			block_end = itable_end;
-+
-+		for (++block; block < block_end; block++) {
-+			bh[count] = sb_getblk(sb, block);
-+			if (count && (buffer_uptodate(bh[count]) ||
-+				      buffer_locked(bh[count]))) {
-+				__brelse(bh[count]);
-+			} else
-+				count++;
-+		}
-+
-+		ll_rw_block(READ, count, bh);
-+
-+		/* Release all but the block we actually need (bh[0]) */
-+		while (--count > 0)
-+			__brelse(bh[count]);
-+
-+		wait_on_buffer(bh[0]);
-+		if (!buffer_uptodate(bh[0])) {
-+			ext3_error(sb, __FUNCTION__,
-+				   "unable to read inode block - "
-+				   "inode=%lu, block=%llu", ino,
-+				   (unsigned long long)bh[0]->b_blocknr);
-+			goto bad_inode;
-+		}
- 	}
--	offset &= (EXT3_BLOCK_SIZE(inode->i_sb) - 1);
-+done:
-+	offset = (offset * sbi->s_inode_size) & (EXT3_BLOCK_SIZE(sb) - 1);
- 
--	iloc->bh = bh;
--	iloc->raw_inode = (struct ext3_inode *) (bh->b_data + offset);
-+	iloc->bh = bh[0];
-+	iloc->raw_inode = (struct ext3_inode *)(bh[0]->b_data + offset);
- 	iloc->block_group = block_group;
--	
-+
- 	return 0;
--	
-+
-  bad_inode:
- 	return -EIO;
-+}
-+
-+int ext3_get_inode_loc(struct inode *inode, struct ext3_iloc *iloc)
-+{
-+	return ext3_get_inode_loc_new(inode, iloc, 0);
- }
- 
- void ext3_read_inode(struct inode * inode)
-===== include/linux/ext3_fs.h 1.22 vs edited =====
---- 1.22/include/linux/ext3_fs.h	Tue Jan 14 00:56:29 2003
-+++ edited/include/linux/ext3_fs.h	Sat Mar  8 01:56:28 2003
-@@ -719,6 +719,8 @@
- extern struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *);
- extern struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *);
- 
-+extern int ext3_itable_block_used(struct super_block *, unsigned int, int);
-+extern int ext3_get_inode_loc_new(struct inode *, struct ext3_iloc *, int);
- extern int  ext3_get_inode_loc (struct inode *, struct ext3_iloc *);
- extern void ext3_read_inode (struct inode *);
- extern void ext3_write_inode (struct inode *, int);
diff --git a/lustre/kernel_patches/patches/ext3-2.5.63.patch b/lustre/kernel_patches/patches/ext3-2.5.63.patch
deleted file mode 100644
index fd28cd8501..0000000000
--- a/lustre/kernel_patches/patches/ext3-2.5.63.patch
+++ /dev/null
@@ -1,150 +0,0 @@
- fs/ext3/inode.c |   84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
- fs/ext3/super.c |    5 ++-
- fs/ext3/xattr.c |    5 +++
- fs/ext3/xattr.h |    2 -
- 4 files changed, 92 insertions(+), 4 deletions(-)
-
---- linux-2.5.63-nointent/fs/ext3/xattr.c~ext3-2.5.63	Fri Mar 21 18:47:19 2003
-+++ linux-2.5.63-nointent-root/fs/ext3/xattr.c	Fri Mar 21 18:47:19 2003
-@@ -1181,3 +1181,8 @@ exit_ext3_xattr(void)
- 	ext3_xattr_unregister(EXT3_XATTR_INDEX_USER,
- 			      &ext3_xattr_user_handler);
- }
-+
-+EXPORT_SYMBOL(ext3_xattr_get);
-+EXPORT_SYMBOL(ext3_xattr_set);
-+EXPORT_SYMBOL(ext3_xattr_set_handle);
-+
---- linux-2.5.63-nointent/fs/ext3/inode.c~ext3-2.5.63	Fri Mar 21 18:47:19 2003
-+++ linux-2.5.63-nointent-root/fs/ext3/inode.c	Fri Mar 21 18:47:19 2003
-@@ -1019,7 +1019,7 @@ struct buffer_head *ext3_bread(handle_t 
- 	*err = -EIO;
- 	return NULL;
- }
--
-+EXPORT_SYMBOL(ext3_bread);
- static int walk_page_buffers(	handle_t *handle,
- 				struct buffer_head *head,
- 				unsigned from,
-@@ -2870,3 +2870,85 @@ int ext3_change_inode_journal_flag(struc
-  * here, in ext3_aops_journal_start() to ensure that the forthcoming "see if we
-  * need to extend" test in ext3_prepare_write() succeeds.  
-  */
-+
-+/* for each block: 1 ind + 1 dind + 1 tind
-+ * for each block: 3 bitmap blocks
-+ * for each block: 3 group descriptor blocks
-+ * i inode block
-+ * 1 superblock
-+ * 2 * EXT3_SINGLEDATA_TRANS_BLOCKS for the quote files
-+ * ((1+1+1) * 3 * nblocks) + 1 + 1 + 2 * EXT3_SINGLEDATA_TRANS_BLOCKS
-+ *
-+ * XXX assuming:
-+ * (1) fs logic block size == page size
-+ * (2) ext3 in writeback mode
-+ */
-+static inline int ext3_san_write_trans_blocks(int nblocks)
-+{
-+	int ret;
-+	
-+	ret = (1 + 1 + 1) * 3 * nblocks + 1 + 1;
-+
-+#ifdef CONFIG_QUOTA
-+	ret += 2 * EXT3_SINGLEDATA_TRANS_BLOCKS;
-+#endif
-+
-+	return ret;
-+}
-+
-+/* Alloc blocks for an inode, while don't create any buffer/page
-+ * for data I/O; set the inode size if file is extended.
-+ *
-+ * @inode:    target inode
-+ * @blocks:   array of logic block number
-+ * @nblocks:  how many blocks need be alloced
-+ * @newsize:  new filesize we should set
-+ *
-+ * return:    0 success, otherwise failed
-+ *            (*blocks) contains physical block number alloced
-+ *
-+ * XXX this assume the fs block size == page size
-+ */
-+int ext3_prep_san_write(struct inode *inode, long *blocks,
-+			int nblocks, loff_t newsize)
-+{
-+	handle_t *handle;
-+	struct buffer_head bh_tmp;
-+	int needed_blocks;
-+	int i, ret = 0, ret2;
-+
-+	needed_blocks = ext3_san_write_trans_blocks(nblocks);
-+
-+	lock_kernel();
-+	handle = ext3_journal_start(inode, needed_blocks);
-+	if (IS_ERR(handle)) {
-+		unlock_kernel();
-+		return PTR_ERR(handle);
-+	}
-+	unlock_kernel();
-+
-+	/* alloc blocks one by one */
-+	for (i = 0; i < nblocks; i++) {
-+		ret = ext3_get_block_handle(handle, inode, blocks[i],
-+						&bh_tmp, 1, 1);
-+		if (ret)
-+			break;
-+
-+		blocks[i] = bh_tmp.b_blocknr;
-+	}
-+
-+	/* set inode size if needed */
-+	if (!ret && (newsize > inode->i_size)) {
-+		inode->i_size = newsize;
-+		ext3_mark_inode_dirty(handle, inode);
-+	}
-+
-+	lock_kernel();
-+	ret2 = ext3_journal_stop(handle, inode);
-+	unlock_kernel();
-+
-+	if (!ret)
-+		ret = ret2;
-+	return ret;
-+}
-+EXPORT_SYMBOL(ext3_prep_san_write);
---- linux-2.5.63-nointent/fs/ext3/super.c~ext3-2.5.63	Fri Mar 21 18:47:19 2003
-+++ linux-2.5.63-nointent-root/fs/ext3/super.c	Fri Mar 21 18:47:19 2003
-@@ -1492,10 +1492,10 @@ static journal_t *ext3_get_dev_journal(s
- 		printk(KERN_ERR "EXT3-fs: I/O error on journal device\n");
- 		goto out_journal;
- 	}
--	if (ntohl(journal->j_superblock->s_nr_users) != 1) {
-+	if (be32_to_cpu(journal->j_superblock->s_nr_users) != 1) {
- 		printk(KERN_ERR "EXT3-fs: External journal has more than one "
- 					"user (unsupported) - %d\n",
--			ntohl(journal->j_superblock->s_nr_users));
-+			be32_to_cpu(journal->j_superblock->s_nr_users));
- 		goto out_journal;
- 	}
- 	EXT3_SB(sb)->journal_bdev = bdev;
-@@ -1703,6 +1703,7 @@ int ext3_force_commit(struct super_block
- 	unlock_kernel();
- 	return ret;
- }
-+EXPORT_SYMBOL(ext3_force_commit);
- 
- /*
-  * Ext3 always journals updates to the superblock itself, so we don't
---- linux-2.5.63-nointent/fs/ext3/xattr.h~ext3-2.5.63	Fri Mar 21 18:47:19 2003
-+++ linux-2.5.63-nointent-root/fs/ext3/xattr.h	Fri Mar 21 18:47:19 2003
-@@ -5,7 +5,7 @@
- 
-   (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org>
- */
--
-+#include <linux/module.h>
- #include <linux/config.h>
- #include <linux/xattr.h>
- 
-
-_
diff --git a/lustre/kernel_patches/patches/ext3-error-export.patch b/lustre/kernel_patches/patches/ext3-error-export.patch
new file mode 100644
index 0000000000..c52fc18ffc
--- /dev/null
+++ b/lustre/kernel_patches/patches/ext3-error-export.patch
@@ -0,0 +1,16 @@
+ fs/ext3/ext3-exports.c |    5 +++++
+ 1 files changed, 5 insertions(+)
+
+--- linux/fs/ext3/ext3-exports.c~ext3-error-export	Mon Jul 14 19:30:50 2003
++++ linux-mmonroe/fs/ext3/ext3-exports.c	Mon Jul 14 19:32:37 2003
+@@ -21,3 +21,8 @@ EXPORT_SYMBOL(ext3_xattr_list);
+ EXPORT_SYMBOL(ext3_xattr_set);
+ EXPORT_SYMBOL(ext3_prep_san_write);
+ EXPORT_SYMBOL(ext3_map_inode_page);
++
++EXPORT_SYMBOL(ext3_abort);
++EXPORT_SYMBOL(ext3_decode_error);
++EXPORT_SYMBOL(__ext3_std_error);
++
+
+_
diff --git a/lustre/kernel_patches/patches/ext3-map_inode_page.patch b/lustre/kernel_patches/patches/ext3-map_inode_page.patch
new file mode 100644
index 0000000000..80f14de6a7
--- /dev/null
+++ b/lustre/kernel_patches/patches/ext3-map_inode_page.patch
@@ -0,0 +1,84 @@
+
+
+
+ fs/ext3/ext3-exports.c |    3 ++
+ fs/ext3/inode.c        |   55 +++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 58 insertions(+)
+
+--- linux-2.4.20-l18/fs/ext3/inode.c~ext3-map_inode_page	Tue Jul  8 20:07:23 2003
++++ linux-2.4.20-l18-phil/fs/ext3/inode.c	Wed Jul  9 03:56:41 2003
+@@ -2867,3 +2867,58 @@ int ext3_prep_san_write(struct inode *in
+ 		ret = ret2;
+ 	return ret;
+ }
++
++int ext3_map_inode_page(struct inode *inode, struct page *page,
++                        unsigned long *blocks, int *created, int create)
++{
++        unsigned int blocksize, blocks_per_page;
++        unsigned long iblock;
++        struct buffer_head dummy;
++        void *handle;
++        int i, rc = 0, failed = 0, needed_blocks;
++
++        blocksize = inode->i_sb->s_blocksize;
++        blocks_per_page = PAGE_SIZE >> inode->i_sb->s_blocksize_bits;
++        iblock = page->index >> (PAGE_SHIFT - inode->i_sb->s_blocksize_bits);
++
++        for (i = 0; i < blocks_per_page; i++, iblock++) {
++                blocks[i] = ext3_bmap(inode->i_mapping, iblock);
++                if (blocks[i] == 0) {
++                        failed++;
++                        created[i] = -1;
++                } else {
++                        created[i] = 0;
++                }
++        }
++
++        if (failed == 0 || create == 0)
++                return 0;
++
++        needed_blocks = ext3_writepage_trans_blocks(inode) * failed;
++        lock_kernel();
++        handle = ext3_journal_start(inode, needed_blocks);
++        unlock_kernel();
++        if (IS_ERR(handle))
++                return PTR_ERR(handle);
++
++        iblock = page->index >> (PAGE_SHIFT - inode->i_sb->s_blocksize_bits);
++        for (i = 0; i < blocks_per_page; i++, iblock++) {
++                if (blocks[i] != 0)
++                        continue;
++
++                rc = ext3_get_block_handle(handle, inode, iblock, &dummy, 1);
++                if (rc) {
++                        printk(KERN_INFO "ext3_map_inode_page: error reading "
++                               "block %ld\n", iblock);
++                        goto out;
++                }
++                blocks[i] = dummy.b_blocknr;
++                created[i] = 1;
++        }
++
++ out:
++	lock_kernel();
++	ext3_journal_stop(handle, inode);
++	unlock_kernel();
++        return rc;
++}
+--- linux-2.4.20-l18/fs/ext3/ext3-exports.c~ext3-map_inode_page	Tue Jul  8 20:07:10 2003
++++ linux-2.4.20-l18-phil/fs/ext3/ext3-exports.c	Tue Jul  8 20:09:02 2003
+@@ -9,6 +9,8 @@
+ 
+ int ext3_prep_san_write(struct inode *inode, long *blocks,
+ 	                int nblocks, loff_t newsize);
++int ext3_map_inode_page(struct inode *inode, struct page *page,
++                        unsigned long *block, int *created, int create);
+ 
+ EXPORT_SYMBOL(ext3_force_commit);
+ EXPORT_SYMBOL(ext3_bread);
+@@ -18,3 +20,4 @@ EXPORT_SYMBOL(ext3_xattr_get);
+ EXPORT_SYMBOL(ext3_xattr_list);
+ EXPORT_SYMBOL(ext3_xattr_set);
+ EXPORT_SYMBOL(ext3_prep_san_write);
++EXPORT_SYMBOL(ext3_map_inode_page);
diff --git a/lustre/kernel_patches/patches/ext3-map_inode_page_2.4.18.patch b/lustre/kernel_patches/patches/ext3-map_inode_page_2.4.18.patch
new file mode 100644
index 0000000000..8386ee30e0
--- /dev/null
+++ b/lustre/kernel_patches/patches/ext3-map_inode_page_2.4.18.patch
@@ -0,0 +1,86 @@
+
+
+
+ fs/ext3/ext3-exports.c |    3 ++
+ fs/ext3/inode.c        |   55 +++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 58 insertions(+)
+
+--- linux-2.4.18-p4smp/fs/ext3/inode.c~ext3-map_inode_page_2.4.18	2003-07-21 22:51:45.000000000 -0600
++++ linux-2.4.18-p4smp-braam/fs/ext3/inode.c	2003-07-21 22:51:47.000000000 -0600
+@@ -3003,3 +3003,58 @@ int ext3_prep_san_write(struct inode *in
+ 		ret = ret2;
+ 	return ret;
+ }
++
++int ext3_map_inode_page(struct inode *inode, struct page *page,
++                        unsigned long *blocks, int *created, int create)
++{
++        unsigned int blocksize, blocks_per_page;
++        unsigned long iblock;
++        struct buffer_head dummy;
++        void *handle;
++        int i, rc = 0, failed = 0, needed_blocks;
++
++        blocksize = inode->i_sb->s_blocksize;
++        blocks_per_page = PAGE_SIZE >> inode->i_sb->s_blocksize_bits;
++        iblock = page->index >> (PAGE_SHIFT - inode->i_sb->s_blocksize_bits);
++
++        for (i = 0; i < blocks_per_page; i++, iblock++) {
++                blocks[i] = ext3_bmap(inode->i_mapping, iblock);
++                if (blocks[i] == 0) {
++                        failed++;
++                        created[i] = -1;
++                } else {
++                        created[i] = 0;
++                }
++        }
++
++        if (failed == 0 || create == 0)
++                return 0;
++
++        needed_blocks = ext3_writepage_trans_blocks(inode) * failed;
++        lock_kernel();
++        handle = ext3_journal_start(inode, needed_blocks);
++        unlock_kernel();
++        if (IS_ERR(handle))
++                return PTR_ERR(handle);
++
++        iblock = page->index >> (PAGE_SHIFT - inode->i_sb->s_blocksize_bits);
++        for (i = 0; i < blocks_per_page; i++, iblock++) {
++                if (blocks[i] != 0)
++                        continue;
++
++                rc = ext3_get_block_handle(handle, inode, iblock, &dummy, 1);
++                if (rc) {
++                        printk(KERN_INFO "ext3_map_inode_page: error reading "
++                               "block %ld\n", iblock);
++                        goto out;
++                }
++                blocks[i] = dummy.b_blocknr;
++                created[i] = 1;
++        }
++
++ out:
++	lock_kernel();
++	ext3_journal_stop(handle, inode);
++	unlock_kernel();
++        return rc;
++}
+--- linux-2.4.18-p4smp/fs/ext3/ext3-exports.c~ext3-map_inode_page_2.4.18	2003-07-21 22:51:45.000000000 -0600
++++ linux-2.4.18-p4smp-braam/fs/ext3/ext3-exports.c	2003-07-21 22:51:47.000000000 -0600
+@@ -9,6 +9,8 @@
+ 
+ int ext3_prep_san_write(struct inode *inode, long *blocks,
+ 	                int nblocks, loff_t newsize);
++int ext3_map_inode_page(struct inode *inode, struct page *page,
++                        unsigned long *block, int *created, int create);
+ 
+ EXPORT_SYMBOL(ext3_force_commit);
+ EXPORT_SYMBOL(ext3_bread);
+@@ -18,3 +20,4 @@ EXPORT_SYMBOL(ext3_xattr_get);
+ EXPORT_SYMBOL(ext3_xattr_list);
+ EXPORT_SYMBOL(ext3_xattr_set);
+ EXPORT_SYMBOL(ext3_prep_san_write);
++EXPORT_SYMBOL(ext3_map_inode_page);
+
+_
diff --git a/lustre/kernel_patches/patches/ext3-noread-inode.patch b/lustre/kernel_patches/patches/ext3-noread-inode.patch
new file mode 100644
index 0000000000..a50d12b068
--- /dev/null
+++ b/lustre/kernel_patches/patches/ext3-noread-inode.patch
@@ -0,0 +1,177 @@
+
+ext3_get_inode_loc() read inode's block only if:
+  1) this inode has no copy in memory
+  2) inode's block has another valid inode(s)
+
+this optimization allows to avoid needless I/O in two cases:
+1) just allocated inode is first valid in the inode's block
+2) kernel wants to write inode, but buffer in which inode
+   belongs to gets freed by VM
+
+
+
+
+diff -puN fs/ext3/inode.c~ext3-noread-inode fs/ext3/inode.c
+--- linux-2.5.73/fs/ext3/inode.c~ext3-noread-inode	Thu Jul 10 12:03:52 2003
++++ linux-2.5.73-alexey/fs/ext3/inode.c	Thu Jul 10 15:52:59 2003
+@@ -2286,7 +2286,7 @@ out_stop:
+  * inode's underlying buffer_head on success. 
+  */
+ 
+-int ext3_get_inode_loc (struct inode *inode, struct ext3_iloc *iloc)
++int ext3_get_inode_loc (struct inode *inode, struct ext3_iloc *iloc, int in_mem)
+ {
+ 	struct buffer_head *bh = 0;
+ 	unsigned long block;
+@@ -2328,12 +2328,88 @@ int ext3_get_inode_loc (struct inode *in
+ 		EXT3_INODE_SIZE(inode->i_sb);
+ 	block = le32_to_cpu(gdp[desc].bg_inode_table) +
+ 		(offset >> EXT3_BLOCK_SIZE_BITS(inode->i_sb));
+-	if (!(bh = sb_bread(inode->i_sb, block))) {
++	if (!(bh = sb_getblk(inode->i_sb, block))) {
+ 		ext3_error (inode->i_sb, "ext3_get_inode_loc",
+ 			    "unable to read inode block - "
+ 			    "inode=%lu, block=%lu", inode->i_ino, block);
+ 		goto bad_inode;
+ 	}
++	if (!buffer_uptodate(bh)) {
++		lock_buffer(bh);
++		if (buffer_uptodate(bh)) {
++			/* someone has already initialized buffer */
++			unlock_buffer(bh);
++			goto has_buffer;
++		}
++
++		/* we can't skip I/O if inode is on a disk only */
++		if (in_mem) {
++			struct buffer_head *bitmap_bh; 
++			struct ext3_group_desc *desc;
++			int inodes_per_buffer;
++			int inode_offset, i;
++			int start;
++
++			/*
++			 * if this inode is only valid in buffer we need not I/O
++			 */
++			inodes_per_buffer = bh->b_size /
++				EXT3_INODE_SIZE(inode->i_sb);
++			inode_offset = ((inode->i_ino - 1) %
++					EXT3_INODES_PER_GROUP(inode->i_sb));
++			start = inode_offset & ~(inodes_per_buffer - 1);
++
++			/* check is inode bitmap is in cache? */
++			desc = ext3_get_group_desc(inode->i_sb, block_group, NULL);
++			if (!desc)
++				goto make_io;
++
++			bitmap_bh = sb_getblk(inode->i_sb, le32_to_cpu(desc->bg_inode_bitmap));
++			if (!bitmap_bh)
++				goto make_io;
++
++			/* 
++			 * if inode bitmap isn't in cache then we may end up by 2 reads
++			 * instead of 1 read before optimizing. skip it
++			 */
++			if (!buffer_uptodate(bitmap_bh)) {
++				brelse(bitmap_bh);
++				goto make_io;
++			}
++			for (i = start; i < start + inodes_per_buffer; i++) {
++				if (i == inode_offset)
++					continue;
++				if (ext3_test_bit(i, bitmap_bh->b_data))
++					break;
++			}
++			brelse(bitmap_bh);
++			if (i == start + inodes_per_buffer) {
++				/* all inodes (but our) are free. so, we skip I/O */
++				memset(bh->b_data, 0, bh->b_size);
++				set_buffer_uptodate(bh);
++				unlock_buffer(bh);
++				goto has_buffer;
++			}
++		}
++
++make_io:
++		/*
++		 * No, there are another valid inodes in the buffer
++		 * so, to preserve them we have to read buffer from
++		 * the disk
++		 */
++		get_bh(bh);
++		bh->b_end_io = end_buffer_io_sync;
++		submit_bh(READ, bh);
++		wait_on_buffer(bh);
++		if (!buffer_uptodate(bh)) {
++			ext3_error (inode->i_sb, "ext3_get_inode_loc",
++					"unable to read inode block - "
++					"inode=%lu, block=%lu", inode->i_ino, block);
++			goto bad_inode;
++		}
++	}
++  has_buffer:
+ 	offset &= (EXT3_BLOCK_SIZE(inode->i_sb) - 1);
+ 
+ 	iloc->bh = bh;
+@@ -2376,7 +2452,7 @@ void ext3_read_inode(struct inode * inod
+ endif
+ 	if (ext3_iopen_get_inode(inode))
+ 		return;
+-	if (ext3_get_inode_loc(inode, &iloc))
++	if (ext3_get_inode_loc(inode, &iloc, 0))
+ 		goto bad_inode;
+ 	bh = iloc.bh;
+ 	raw_inode = iloc.raw_inode;
+@@ -2781,7 +2857,7 @@ ext3_reserve_inode_write(handle_t *handl
+ {
+ 	int err = 0;
+ 	if (handle) {
+-		err = ext3_get_inode_loc(inode, iloc);
++		err = ext3_get_inode_loc(inode, iloc, 1);
+ 		if (!err) {
+ 			BUFFER_TRACE(iloc->bh, "get_write_access");
+ 			err = ext3_journal_get_write_access(handle, iloc->bh);
+@@ -2879,7 +2955,7 @@ ext3_pin_inode(handle_t *handle, struct 
+ 
+ 	int err = 0;
+ 	if (handle) {
+-		err = ext3_get_inode_loc(inode, &iloc);
++		err = ext3_get_inode_loc(inode, &iloc, 1);
+ 		if (!err) {
+ 			BUFFER_TRACE(iloc.bh, "get_write_access");
+ 			err = journal_get_write_access(handle, iloc.bh);
+diff -puN fs/ext3/ialloc.c~ext3-noread-inode fs/ext3/ialloc.c
+--- linux-2.5.73/fs/ext3/ialloc.c~ext3-noread-inode	Thu Jul 10 13:05:37 2003
++++ linux-2.5.73-alexey/fs/ext3/ialloc.c	Thu Jul 10 13:06:12 2003
+@@ -50,7 +50,7 @@
+  *
+  * Return buffer_head of bitmap on success or NULL.
+  */
+-static struct buffer_head *
++struct buffer_head *
+ read_inode_bitmap(struct super_block * sb, unsigned long block_group)
+ {
+ 	struct ext3_group_desc *desc;
+diff -puN include/linux/ext3_fs.h~ext3-noread-inode include/linux/ext3_fs.h
+--- linux-2.5.73/include/linux/ext3_fs.h~ext3-noread-inode	Thu Jul 10 13:41:59 2003
++++ linux-2.5.73-alexey/include/linux/ext3_fs.h	Thu Jul 10 14:40:13 2003
+@@ -717,6 +717,8 @@ extern unsigned long ext3_count_free_ino
+ extern unsigned long ext3_count_dirs (struct super_block *);
+ extern void ext3_check_inodes_bitmap (struct super_block *);
+ extern unsigned long ext3_count_free (struct buffer_head *, unsigned);
++extern struct buffer_head * read_inode_bitmap(struct super_block *, unsigned long);
++
+ 
+ 
+ /* inode.c */
+@@ -724,7 +726,7 @@ extern int ext3_forget(handle_t *, int, 
+ extern struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *);
+ extern struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *);
+ 
+-extern int  ext3_get_inode_loc (struct inode *, struct ext3_iloc *);
++extern int  ext3_get_inode_loc (struct inode *, struct ext3_iloc *, int);
+ extern void ext3_read_inode (struct inode *);
+ extern void ext3_write_inode (struct inode *, int);
+ extern int  ext3_setattr (struct dentry *, struct iattr *);
+
+_
diff --git a/lustre/kernel_patches/patches/extN-san.patch b/lustre/kernel_patches/patches/ext3-san-jdike-2.5.73.patch
similarity index 78%
rename from lustre/kernel_patches/patches/extN-san.patch
rename to lustre/kernel_patches/patches/ext3-san-jdike-2.5.73.patch
index d58fe8c570..afda0bd8c5 100644
--- a/lustre/kernel_patches/patches/extN-san.patch
+++ b/lustre/kernel_patches/patches/ext3-san-jdike-2.5.73.patch
@@ -2,12 +2,12 @@
  fs/ext3/super.c |    4 ++
  2 files changed, 85 insertions(+)
 
---- linux-2.4.18-18.8.0-l18/fs/ext3/inode.c~extN-san	Sun May 18 12:58:13 2003
-+++ linux-2.4.18-18.8.0-l18-phil/fs/ext3/inode.c	Sun May 18 13:24:49 2003
-@@ -2781,3 +2781,84 @@ int ext3_change_inode_journal_flag(struc
-  * here, in ext3_aops_journal_start() to ensure that the forthcoming "see if we
-  * need to extend" test in ext3_prepare_write() succeeds.  
-  */
+--- linux-2.5.73/fs/ext3/inode.c~ext3-san-jdike-2.5.73	2003-06-22 12:32:58.000000000 -0600
++++ linux-2.5.73-braam/fs/ext3/inode.c	2003-06-30 12:19:21.000000000 -0600
+@@ -2945,3 +2945,84 @@ int ext3_change_inode_journal_flag(struc
+ 
+ 	return err;
+ }
 +
 +/* for each block: 1 ind + 1 dind + 1 tind
 + * for each block: 3 bitmap blocks
@@ -68,7 +68,7 @@
 +	/* alloc blocks one by one */
 +	for (i = 0; i < nblocks; i++) {
 +		ret = ext3_get_block_handle(handle, inode, blocks[i],
-+						&bh_tmp, 1);
++						&bh_tmp, 1, 1);
 +		if (ret)
 +			break;
 +
@@ -82,18 +82,18 @@
 +	}
 +
 +	lock_kernel();
-+	ret2 = ext3_journal_stop(handle, inode);
++	ret2 = ext3_journal_stop(handle);
 +	unlock_kernel();
 +
 +	if (!ret)
 +		ret = ret2;
 +	return ret;
 +}
---- linux-2.4.18-18.8.0-l18/fs/ext3/super.c~extN-san	Sun May 18 13:24:35 2003
-+++ linux-2.4.18-18.8.0-l18-phil/fs/ext3/super.c	Sun May 18 13:24:55 2003
-@@ -1774,6 +1774,10 @@ static int __init init_ext3_fs(void)
- 
- EXPORT_SYMBOL(ext3_bread);
+--- linux-2.5.73/fs/ext3/super.c~ext3-san-jdike-2.5.73	2003-06-22 12:33:16.000000000 -0600
++++ linux-2.5.73-braam/fs/ext3/super.c	2003-06-30 12:16:36.000000000 -0600
+@@ -2080,6 +2080,10 @@ static void __exit exit_ext3_fs(void)
+ 	exit_ext3_xattr();
+ }
  
 +int ext3_prep_san_write(struct inode *inode, long *blocks,
 +                        int nblocks, loff_t newsize);
diff --git a/lustre/kernel_patches/patches/ext3-truncate_blocks-chaos.patch.patch b/lustre/kernel_patches/patches/ext3-truncate_blocks-chaos.patch.patch
deleted file mode 100644
index ce3928d869..0000000000
--- a/lustre/kernel_patches/patches/ext3-truncate_blocks-chaos.patch.patch
+++ /dev/null
@@ -1,92 +0,0 @@
---- ./fs/ext3/inode.c.orig	Wed Mar 12 02:44:06 2003
-+++ ./fs/ext3/inode.c	Wed Mar 12 11:55:20 2003
-@@ -99,7 +99,35 @@ int ext3_forget(handle_t *handle, int is
- 	return err;
- }
- 
--/* 
-+/*
-+ * Work out how many blocks we need to progress with the next chunk of a
-+ * truncate transaction.
-+ */
-+
-+static unsigned long blocks_for_truncate(struct inode *inode)
-+{
-+	unsigned long needed;
-+
-+	needed = inode->i_blocks >> (inode->i_sb->s_blocksize_bits - 9);
-+
-+	/* Give ourselves just enough room to cope with inodes in which
-+	 * i_blocks is corrupt: we've seen disk corruptions in the past
-+	 * which resulted in random data in an inode which looked enough
-+	 * like a regular file for ext3 to try to delete it.  Things
-+	 * will go a bit crazy if that happens, but at least we should
-+	 * try not to panic the whole kernel. */
-+	if (needed < 2)
-+		needed = 2;
-+
-+	/* But we need to bound the transaction so we don't overflow the
-+	 * journal. */
-+	if (needed > EXT3_MAX_TRANS_DATA)
-+		needed = EXT3_MAX_TRANS_DATA;
-+
-+	return EXT3_DATA_TRANS_BLOCKS + needed;
-+}
-+
-+/*
-  * Truncate transactions can be complex and absolutely huge.  So we need to
-  * be able to restart the transaction at a conventient checkpoint to make
-  * sure we don't overflow the journal.
-@@ -110,19 +138,14 @@ int ext3_forget(handle_t *handle, int is
-  * transaction in the top-level truncate loop. --sct 
-  */
- 
--static handle_t *start_transaction(struct inode *inode) 
-+static handle_t *start_transaction(struct inode *inode)
- {
--	long needed;
- 	handle_t *result;
--	
--	needed = inode->i_blocks;
--	if (needed > EXT3_MAX_TRANS_DATA) 
--		needed = EXT3_MAX_TRANS_DATA;
--	
--	result = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS + needed);
-+
-+	result = ext3_journal_start(inode, blocks_for_truncate(inode));
- 	if (!IS_ERR(result))
- 		return result;
--	
-+
- 	ext3_std_error(inode->i_sb, PTR_ERR(result));
- 	return result;
- }
-@@ -135,14 +158,9 @@ static handle_t *start_transaction(struc
-  */
- static int try_to_extend_transaction(handle_t *handle, struct inode *inode)
- {
--	long needed;
--	
- 	if (handle->h_buffer_credits > EXT3_RESERVE_TRANS_BLOCKS)
- 		return 0;
--	needed = inode->i_blocks;
--	if (needed > EXT3_MAX_TRANS_DATA) 
--		needed = EXT3_MAX_TRANS_DATA;
--	if (!ext3_journal_extend(handle, EXT3_RESERVE_TRANS_BLOCKS + needed))
-+	if (!ext3_journal_extend(handle, blocks_for_truncate(inode)))
- 		return 0;
- 	return 1;
- }
-@@ -154,11 +172,8 @@ static int try_to_extend_transaction(han
-  */
- static int ext3_journal_test_restart(handle_t *handle, struct inode *inode)
- {
--	long needed = inode->i_blocks;
--	if (needed > EXT3_MAX_TRANS_DATA) 
--		needed = EXT3_MAX_TRANS_DATA;
- 	jbd_debug(2, "restarting handle %p\n", handle);
--	return ext3_journal_restart(handle, EXT3_DATA_TRANS_BLOCKS + needed);
-+	return ext3_journal_restart(handle, blocks_for_truncate(inode));
- }
- 
- /*
diff --git a/lustre/kernel_patches/patches/ext3_delete_thread_2.4.20_chaos.patch b/lustre/kernel_patches/patches/ext3_delete_thread_2.4.20_chaos.patch
new file mode 100644
index 0000000000..ad873a9d4b
--- /dev/null
+++ b/lustre/kernel_patches/patches/ext3_delete_thread_2.4.20_chaos.patch
@@ -0,0 +1,477 @@
+ fs/ext3/file.c             |    4 
+ fs/ext3/inode.c            |  116 ++++++++++++++++++++++
+ fs/ext3/super.c            |  230 +++++++++++++++++++++++++++++++++++++++++++++
+ include/linux/ext3_fs.h    |    5 
+ include/linux/ext3_fs_sb.h |   10 +
+ 5 files changed, 365 insertions(+)
+
+--- kernel-2.4.20-6chaos_18_7/fs/ext3/super.c~ext3_delete_thread_2.4.20_chaos	2003-07-12 15:35:26.000000000 -0600
++++ kernel-2.4.20-6chaos_18_7-braam/fs/ext3/super.c	2003-07-12 15:36:19.000000000 -0600
+@@ -400,6 +400,220 @@ static void dump_orphan_list(struct supe
+ 	}
+ }
+ 
++#ifdef EXT3_DELETE_THREAD
++/*
++ * Delete inodes in a loop until there are no more to be deleted.
++ * Normally, we run in the background doing the deletes and sleeping again,
++ * and clients just add new inodes to be deleted onto the end of the list.
++ * If someone is concerned about free space (e.g. block allocation or similar)
++ * then they can sleep on s_delete_waiter_queue and be woken up when space
++ * has been freed.
++ */
++int ext3_delete_thread(void *data)
++{
++	struct super_block *sb = data;
++	struct ext3_sb_info *sbi = EXT3_SB(sb);
++	struct task_struct *tsk = current;
++
++	/* Almost like daemonize, but not quite */
++	exit_mm(current);
++	tsk->session = 1;
++	tsk->pgrp = 1;
++	tsk->tty = NULL;
++	exit_files(current);
++	reparent_to_init();
++
++	sprintf(tsk->comm, "kdelext3-%s", kdevname(sb->s_dev));
++	sigfillset(&tsk->blocked);
++
++	/*tsk->flags |= PF_KERNTHREAD;*/
++
++	INIT_LIST_HEAD(&sbi->s_delete_list);
++	wake_up(&sbi->s_delete_waiter_queue);
++	ext3_debug("delete thread on %s started\n", kdevname(sb->s_dev));
++
++	/* main loop */
++	for (;;) {
++		wait_event_interruptible(sbi->s_delete_thread_queue,
++					 !list_empty(&sbi->s_delete_list) ||
++					 !test_opt(sb, ASYNCDEL));
++		ext3_debug("%s woken up: %lu inodes, %lu blocks\n",
++			   tsk->comm,sbi->s_delete_inodes,sbi->s_delete_blocks);
++
++		spin_lock(&sbi->s_delete_lock);
++		if (list_empty(&sbi->s_delete_list)) {
++			clear_opt(sbi->s_mount_opt, ASYNCDEL);
++			memset(&sbi->s_delete_list, 0,
++			       sizeof(sbi->s_delete_list));
++			spin_unlock(&sbi->s_delete_lock);
++			ext3_debug("delete thread on %s exiting\n",
++				   kdevname(sb->s_dev));
++			wake_up(&sbi->s_delete_waiter_queue);
++			break;
++		}
++
++		while (!list_empty(&sbi->s_delete_list)) {
++			struct inode *inode=list_entry(sbi->s_delete_list.next,
++						       struct inode, i_dentry);
++			unsigned long blocks = inode->i_blocks >>
++							(inode->i_blkbits - 9);
++
++			list_del_init(&inode->i_dentry);
++			spin_unlock(&sbi->s_delete_lock);
++			ext3_debug("%s delete ino %lu blk %lu\n",
++				   tsk->comm, inode->i_ino, blocks);
++
++			iput(inode);
++
++			spin_lock(&sbi->s_delete_lock);
++			sbi->s_delete_blocks -= blocks;
++			sbi->s_delete_inodes--;
++		}
++		if (sbi->s_delete_blocks != 0 || sbi->s_delete_inodes != 0) {
++			ext3_warning(sb, __FUNCTION__,
++				     "%lu blocks, %lu inodes on list?\n",
++				     sbi->s_delete_blocks,sbi->s_delete_inodes);
++			sbi->s_delete_blocks = 0;
++			sbi->s_delete_inodes = 0;
++		}
++		spin_unlock(&sbi->s_delete_lock);
++		wake_up(&sbi->s_delete_waiter_queue);
++	}
++
++	return 0;
++}
++
++static void ext3_start_delete_thread(struct super_block *sb)
++{
++	struct ext3_sb_info *sbi = EXT3_SB(sb);
++	int rc;
++
++	spin_lock_init(&sbi->s_delete_lock);
++	init_waitqueue_head(&sbi->s_delete_thread_queue);
++	init_waitqueue_head(&sbi->s_delete_waiter_queue);
++
++	if (!test_opt(sb, ASYNCDEL))
++		return;
++
++	rc = kernel_thread(ext3_delete_thread, sb, CLONE_VM | CLONE_FILES);
++	if (rc < 0)
++		printk(KERN_ERR "EXT3-fs: cannot start delete thread: rc %d\n",
++		       rc);
++	else
++		wait_event(sbi->s_delete_waiter_queue, sbi->s_delete_list.next);
++}
++
++static void ext3_stop_delete_thread(struct ext3_sb_info *sbi)
++{
++	if (sbi->s_delete_list.next == 0)	/* thread never started */
++		return;
++
++	clear_opt(sbi->s_mount_opt, ASYNCDEL);
++	wake_up(&sbi->s_delete_thread_queue);
++	wait_event(sbi->s_delete_waiter_queue, list_empty(&sbi->s_delete_list));
++}
++
++/* Instead of playing games with the inode flags, destruction, etc we just
++ * create a new inode locally and put it on a list for the truncate thread.
++ * We need large parts of the inode struct in order to complete the
++ * truncate and unlink, so we may as well just have a real inode to do it.
++ *
++ * If we have any problem deferring the delete, just delete it right away.
++ * If we defer it, we also mark how many blocks it would free, so that we
++ * can keep the statfs data correct, and we know if we should sleep on the
++ * delete thread when we run out of space.
++ */
++static void ext3_delete_inode_thread(struct inode *old_inode)
++{
++	struct ext3_sb_info *sbi = EXT3_SB(old_inode->i_sb);
++	struct ext3_inode_info *nei, *oei = EXT3_I(old_inode);
++	struct inode *new_inode;
++	unsigned long blocks = old_inode->i_blocks >> (old_inode->i_blkbits-9);
++
++	if (is_bad_inode(old_inode)) {
++		clear_inode(old_inode);
++		return;
++	}
++
++	if (!test_opt(old_inode->i_sb, ASYNCDEL) || !sbi->s_delete_list.next)
++		goto out_delete;
++
++	/* We may want to delete the inode immediately and not defer it */
++	if (IS_SYNC(old_inode) || blocks <= EXT3_NDIR_BLOCKS)
++		goto out_delete;
++
++	/* We can't use the delete thread as-is during real orphan recovery,
++	 * as we add to the orphan list here, causing ext3_orphan_cleanup()
++	 * to loop endlessly.  It would be nice to do so, but needs work.
++	 */
++	if (oei->i_state & EXT3_STATE_DELETE ||
++	    sbi->s_mount_state & EXT3_ORPHAN_FS) {
++		ext3_debug("doing deferred inode %lu delete (%lu blocks)\n",
++			   old_inode->i_ino, blocks);
++		goto out_delete;
++	}
++
++	/* We can iget this inode again here, because our caller has unhashed
++	 * old_inode, so new_inode will be in a different inode struct.
++	 *
++	 * We need to ensure that the i_orphan pointers in the other inodes
++	 * point at the new inode copy instead of the old one so the orphan
++	 * list doesn't get corrupted when the old orphan inode is freed.
++	 */
++	down(&sbi->s_orphan_lock);
++
++	sbi->s_mount_state |= EXT3_ORPHAN_FS;
++	new_inode = iget(old_inode->i_sb, old_inode->i_ino);
++	sbi->s_mount_state &= ~EXT3_ORPHAN_FS;
++	if (is_bad_inode(new_inode)) {
++		printk(KERN_WARNING "read bad inode %lu\n", old_inode->i_ino);
++		iput(new_inode);
++		new_inode = NULL;
++	}
++	if (!new_inode) {
++		up(&sbi->s_orphan_lock);
++		ext3_debug("delete inode %lu directly (bad read)\n",
++			   old_inode->i_ino);
++		goto out_delete;
++	}
++	J_ASSERT(new_inode != old_inode);
++
++	J_ASSERT(!list_empty(&oei->i_orphan));
++
++	nei = EXT3_I(new_inode);
++	/* Ugh.  We need to insert new_inode into the same spot on the list
++	 * as old_inode was, to ensure the in-memory orphan list is still
++	 * in the same order as the on-disk orphan list (badness otherwise).
++	 */
++	nei->i_orphan = oei->i_orphan;
++	nei->i_orphan.next->prev = &nei->i_orphan;
++	nei->i_orphan.prev->next = &nei->i_orphan;
++	nei->i_state |= EXT3_STATE_DELETE;
++	up(&sbi->s_orphan_lock);
++
++	clear_inode(old_inode);
++
++	spin_lock(&sbi->s_delete_lock);
++	J_ASSERT(list_empty(&new_inode->i_dentry));
++	list_add_tail(&new_inode->i_dentry, &sbi->s_delete_list);
++	sbi->s_delete_blocks += blocks;
++	sbi->s_delete_inodes++;
++	spin_unlock(&sbi->s_delete_lock);
++
++	ext3_debug("delete inode %lu (%lu blocks) by thread\n",
++		   new_inode->i_ino, blocks);
++
++	wake_up(&sbi->s_delete_thread_queue);
++	return;
++
++out_delete:
++	ext3_delete_inode(old_inode);
++}
++#else
++#define ext3_start_delete_thread(sbi) do {} while(0)
++#define ext3_stop_delete_thread(sbi) do {} while(0)
++#endif /* EXT3_DELETE_THREAD */
++
+ void ext3_put_super (struct super_block * sb)
+ {
+ 	struct ext3_sb_info *sbi = EXT3_SB(sb);
+@@ -407,6 +621,7 @@ void ext3_put_super (struct super_block 
+ 	kdev_t j_dev = sbi->s_journal->j_dev;
+ 	int i;
+ 
++	ext3_stop_delete_thread(sbi);
+ 	ext3_xattr_put_super(sb);
+ 	journal_destroy(sbi->s_journal);
+ 	if (!(sb->s_flags & MS_RDONLY)) {
+@@ -455,7 +670,11 @@ static struct super_operations ext3_sops
+ 	write_inode:	ext3_write_inode,	/* BKL not held.  Don't need */
+ 	dirty_inode:	ext3_dirty_inode,	/* BKL not held.  We take it */
+ 	put_inode:	ext3_put_inode,		/* BKL not held.  Don't need */
++#ifdef EXT3_DELETE_THREAD
++	delete_inode:	ext3_delete_inode_thread,/* BKL not held. We take it */
++#else
+ 	delete_inode:	ext3_delete_inode,	/* BKL not held.  We take it */
++#endif
+ 	put_super:	ext3_put_super,		/* BKL held */
+ 	write_super:	ext3_write_super,	/* BKL held */
+ 	sync_fs:	ext3_sync_fs,
+@@ -524,6 +743,13 @@ static int parse_options (char * options
+ 			clear_opt (*mount_options, XATTR_USER);
+ 		else
+ #endif
++#ifdef EXT3_DELETE_THREAD
++		if (!strcmp(this_char, "asyncdel"))
++			set_opt(*mount_options, ASYNCDEL);
++		else if (!strcmp(this_char, "noasyncdel"))
++			clear_opt(*mount_options, ASYNCDEL);
++		else
++#endif
+ 		if (!strcmp (this_char, "bsddf"))
+ 			clear_opt (*mount_options, MINIX_DF);
+ 		else if (!strcmp (this_char, "nouid32")) {
+@@ -1223,6 +1449,7 @@ struct super_block * ext3_read_super (st
+ 	}
+ 
+ 	ext3_setup_super (sb, es, sb->s_flags & MS_RDONLY);
++	ext3_start_delete_thread(sb);
+ 	/*
+ 	 * akpm: core read_super() calls in here with the superblock locked.
+ 	 * That deadlocks, because orphan cleanup needs to lock the superblock
+@@ -1678,6 +1905,9 @@ int ext3_remount (struct super_block * s
+ 	if (!parse_options(data, &tmp, sbi, &tmp, 1))
+ 		return -EINVAL;
+ 
++	if (!test_opt(sb, ASYNCDEL) || (*flags & MS_RDONLY))
++		ext3_stop_delete_thread(sbi);
++
+ 	if (sbi->s_mount_opt & EXT3_MOUNT_ABORT)
+ 		ext3_abort(sb, __FUNCTION__, "Abort forced by user");
+ 
+--- kernel-2.4.20-6chaos_18_7/fs/ext3/inode.c~ext3_delete_thread_2.4.20_chaos	2003-07-12 15:34:44.000000000 -0600
++++ kernel-2.4.20-6chaos_18_7-braam/fs/ext3/inode.c	2003-07-12 15:36:19.000000000 -0600
+@@ -2017,6 +2017,122 @@ out_stop:
+ 	ext3_journal_stop(handle, inode);
+ }
+ 
++#ifdef EXT3_DELETE_THREAD
++/* Move blocks from to-be-truncated inode over to a new inode, and delete
++ * that one from the delete thread instead.  This avoids a lot of latency
++ * when truncating large files.
++ *
++ * If we have any problem deferring the truncate, just truncate it right away.
++ * If we defer it, we also mark how many blocks it would free, so that we
++ * can keep the statfs data correct, and we know if we should sleep on the
++ * delete thread when we run out of space.
++ *
++ * During normal filesystem usage, we are always called here with a
++ * transaction already started.  The only time ext3_truncate is called
++ * without a started transaction is from ext3_orphan_cleanup(), and we
++ * currently just do a direct truncate in that case.
++ */
++void ext3_truncate_thread(struct inode *old_inode)
++{
++	struct ext3_sb_info *sbi = EXT3_SB(old_inode->i_sb);
++	struct ext3_inode_info *nei, *oei = EXT3_I(old_inode);
++	struct inode *new_inode;
++	handle_t *handle;
++	unsigned long blocks = old_inode->i_blocks >> (old_inode->i_blkbits-9);
++
++	if (!test_opt(old_inode->i_sb, ASYNCDEL) || !sbi->s_delete_list.next)
++		goto out_truncate;
++
++	/* XXX This is a temporary limitation for code simplicity.
++	 *     We could truncate to arbitrary sizes at some later time.
++	 */
++	if (old_inode->i_size != 0)
++		goto out_truncate;
++
++	/* We may want to truncate the inode immediately and not defer it */
++	if (IS_SYNC(old_inode) || blocks <= EXT3_NDIR_BLOCKS ||
++	    old_inode->i_size > oei->i_disksize)
++		goto out_truncate;
++
++	/* We can't use the delete thread as-is during real orphan recovery,
++	 * as we add to the orphan list here, causing ext3_orphan_cleanup()
++	 * to loop endlessly.  It would be nice to do so, but needs work.
++	 */
++	if (oei->i_state & EXT3_STATE_DELETE ||
++	    sbi->s_mount_state & EXT3_ORPHAN_FS) {
++		ext3_debug("doing deferred inode %lu delete (%lu blocks)\n",
++			   old_inode->i_ino, blocks);
++		goto out_truncate;
++	}
++
++	ext3_discard_prealloc(old_inode);
++
++	/* old_inode   = 1
++	 * new_inode   = sb + GDT + ibitmap
++	 * orphan list = 1 inode/superblock for add, 2 inodes for del
++	 * quota files = 2 * EXT3_SINGLEDATA_TRANS_BLOCKS
++	 */
++	handle = ext3_journal_start(old_inode, 7);
++	if (IS_ERR(handle))
++		goto out_truncate;
++
++	new_inode = ext3_new_inode(handle, old_inode, old_inode->i_mode);
++	if (IS_ERR(new_inode)) {
++		ext3_debug("truncate inode %lu directly (no new inodes)\n",
++			   old_inode->i_ino);
++		goto out_journal;
++	}
++
++	if (ext3_orphan_add(handle, new_inode) < 0)
++		goto out_journal;
++
++	if (ext3_orphan_del(handle, old_inode) < 0) {
++		ext3_orphan_del(handle, new_inode);
++		iput(new_inode);
++		goto out_journal;
++	}
++
++	nei = EXT3_I(new_inode);
++
++	down_write(&oei->truncate_sem);
++	new_inode->i_size = old_inode->i_size;
++	new_inode->i_blocks = old_inode->i_blocks;
++	new_inode->i_uid = old_inode->i_uid;
++	new_inode->i_gid = old_inode->i_gid;
++	new_inode->i_nlink = 0;
++
++	/* FIXME when we do arbitrary truncates */
++	old_inode->i_blocks = oei->i_file_acl ? old_inode->i_blksize / 512 : 0;
++
++	memcpy(nei->i_data, oei->i_data, sizeof(nei->i_data));
++	memset(oei->i_data, 0, sizeof(oei->i_data));
++
++	nei->i_disksize = oei->i_disksize;
++	nei->i_state |= EXT3_STATE_DELETE;
++	up_write(&oei->truncate_sem);
++
++	ext3_journal_stop(handle, old_inode);
++
++	spin_lock(&sbi->s_delete_lock);
++	J_ASSERT(list_empty(&new_inode->i_dentry));
++	list_add_tail(&new_inode->i_dentry, &sbi->s_delete_list);
++	sbi->s_delete_blocks += blocks;
++	sbi->s_delete_inodes++;
++	spin_unlock(&sbi->s_delete_lock);
++
++	ext3_debug("delete inode %lu (%lu blocks) by thread\n",
++		   new_inode->i_ino, blocks);
++
++	wake_up(&sbi->s_delete_thread_queue);
++	return;
++
++out_journal:
++	ext3_journal_stop(handle, old_inode);
++out_truncate:
++	ext3_truncate(old_inode);
++}
++#endif /* EXT3_DELETE_THREAD */
++
+ /* 
+  * ext3_get_inode_loc returns with an extra refcount against the
+  * inode's underlying buffer_head on success. 
+--- kernel-2.4.20-6chaos_18_7/fs/ext3/file.c~ext3_delete_thread_2.4.20_chaos	2003-07-12 15:34:44.000000000 -0600
++++ kernel-2.4.20-6chaos_18_7-braam/fs/ext3/file.c	2003-07-12 15:36:19.000000000 -0600
+@@ -125,7 +125,11 @@ struct file_operations ext3_file_operati
+ };
+ 
+ struct inode_operations ext3_file_inode_operations = {
++#ifdef EXT3_DELETE_THREAD
++	truncate:	ext3_truncate_thread,	/* BKL held */
++#else
+ 	truncate:	ext3_truncate,		/* BKL held */
++#endif
+ 	setattr:	ext3_setattr,		/* BKL held */
+ 	setxattr:	ext3_setxattr,		/* BKL held */
+ 	getxattr:	ext3_getxattr,		/* BKL held */
+--- kernel-2.4.20-6chaos_18_7/include/linux/ext3_fs.h~ext3_delete_thread_2.4.20_chaos	2003-07-12 15:34:44.000000000 -0600
++++ kernel-2.4.20-6chaos_18_7-braam/include/linux/ext3_fs.h	2003-07-12 15:37:13.000000000 -0600
+@@ -193,6 +193,7 @@ struct ext3_group_desc
+  */
+ #define EXT3_STATE_JDATA		0x00000001 /* journaled data exists */
+ #define EXT3_STATE_NEW			0x00000002 /* inode is newly created */
++#define EXT3_STATE_DELETE		0x00000010 /* deferred delete inode */
+ 
+ /*
+  * ioctl commands
+@@ -320,6 +321,7 @@ struct ext3_inode {
+ #define EXT3_MOUNT_UPDATE_JOURNAL	0x1000	/* Update the journal format */
+ #define EXT3_MOUNT_NO_UID32		0x2000  /* Disable 32-bit UIDs */
+ #define EXT3_MOUNT_XATTR_USER		0x4000	/* Extended user attributes */
++#define EXT3_MOUNT_ASYNCDEL		0x20000 /* Delayed deletion */
+ 
+ /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */
+ #ifndef _LINUX_EXT2_FS_H
+@@ -695,6 +697,9 @@ extern void ext3_discard_prealloc (struc
+ extern void ext3_dirty_inode(struct inode *);
+ extern int ext3_change_inode_journal_flag(struct inode *, int);
+ extern void ext3_truncate (struct inode *);
++#ifdef EXT3_DELETE_THREAD
++extern void ext3_truncate_thread(struct inode *inode);
++#endif
+ extern void ext3_set_inode_flags(struct inode *);
+ 
+ /* ioctl.c */
+--- kernel-2.4.20-6chaos_18_7/include/linux/ext3_fs_sb.h~ext3_delete_thread_2.4.20_chaos	2003-07-12 15:35:26.000000000 -0600
++++ kernel-2.4.20-6chaos_18_7-braam/include/linux/ext3_fs_sb.h	2003-07-12 15:36:19.000000000 -0600
+@@ -29,6 +29,8 @@
+ 
+ #define EXT3_MAX_GROUP_LOADED	32
+ 
++#define EXT3_DELETE_THREAD
++
+ /*
+  * third extended-fs super-block data in memory
+  */
+@@ -76,6 +78,14 @@ struct ext3_sb_info {
+ 	struct timer_list turn_ro_timer;	/* For turning read-only (crash simulation) */
+ 	wait_queue_head_t ro_wait_queue;	/* For people waiting for the fs to go read-only */
+ #endif
++#ifdef EXT3_DELETE_THREAD
++	spinlock_t s_delete_lock;
++	struct list_head s_delete_list;
++	unsigned long s_delete_blocks;
++	unsigned long s_delete_inodes;
++	wait_queue_head_t s_delete_thread_queue;
++	wait_queue_head_t s_delete_waiter_queue;
++#endif
+ };
+ 
+ #endif	/* _LINUX_EXT3_FS_SB */
+
+_
diff --git a/lustre/kernel_patches/patches/extN-delete_thread.patch b/lustre/kernel_patches/patches/extN-delete_thread.patch
deleted file mode 100644
index 4248b5c3ff..0000000000
--- a/lustre/kernel_patches/patches/extN-delete_thread.patch
+++ /dev/null
@@ -1,278 +0,0 @@
- 0 files changed
-
---- linux-2.4.18-p4smp-61chaos/include/linux/ext3_fs.h~extN-delete_thread	2003-05-29 10:19:15.000000000 +0800
-+++ linux-2.4.18-p4smp-61chaos-root/include/linux/ext3_fs.h	2003-05-29 10:50:04.000000000 +0800
-@@ -190,6 +190,7 @@ struct ext3_group_desc
-  */
- #define EXT3_STATE_JDATA		0x00000001 /* journaled data exists */
- #define EXT3_STATE_NEW			0x00000002 /* inode is newly created */
-+#define EXT3_STATE_DELETE		0x00000010 /* deferred delete inode */
- 
- /*
-  * ioctl commands
---- linux-2.4.18-p4smp-61chaos/include/linux/ext3_fs_sb.h~extN-delete_thread	2003-05-29 10:19:15.000000000 +0800
-+++ linux-2.4.18-p4smp-61chaos-root/include/linux/ext3_fs_sb.h	2003-05-29 10:50:04.000000000 +0800
-@@ -29,6 +29,8 @@
- 
- #define EXT3_MAX_GROUP_LOADED	32
- 
-+#define EXT3_DELETE_THREAD
-+
- /*
-  * third extended-fs super-block data in memory
-  */
-@@ -74,6 +76,14 @@ struct ext3_sb_info {
- 	struct timer_list turn_ro_timer;	/* For turning read-only (crash simulation) */
- 	wait_queue_head_t ro_wait_queue;	/* For people waiting for the fs to go read-only */
- #endif
-+#ifdef EXT3_DELETE_THREAD
-+	spinlock_t s_delete_lock;
-+	struct list_head s_delete_list;
-+	unsigned long s_delete_blocks;
-+	unsigned long s_delete_inodes;
-+	wait_queue_head_t s_delete_thread_queue;
-+	wait_queue_head_t s_delete_waiter_queue;
-+#endif
- };
- 
- #endif	/* _LINUX_EXT3_FS_SB */
---- linux-2.4.18-p4smp-61chaos/fs/ext3/super.c~extN-delete_thread	2003-05-29 10:19:15.000000000 +0800
-+++ linux-2.4.18-p4smp-61chaos-root/fs/ext3/super.c	2003-05-29 10:50:04.000000000 +0800
-@@ -398,6 +398,207 @@ static void dump_orphan_list(struct supe
- 	}
- }
- 
-+#ifdef EXT3_DELETE_THREAD
-+/*
-+ * Delete inodes in a loop until there are no more to be deleted.
-+ * Normally, we run in the background doing the deletes and sleeping again,
-+ * and clients just add new inodes to be deleted onto the end of the list.
-+ * If someone is concerned about free space (e.g. block allocation or similar)
-+ * then they can sleep on s_delete_waiter_queue and be woken up when space
-+ * has been freed.
-+ */
-+int ext3_delete_thread(void *data)
-+{
-+	struct super_block *sb = data;
-+	struct ext3_sb_info *sbi = EXT3_SB(sb);
-+	struct task_struct *tsk = current;
-+
-+	/* Almost like daemonize, but not quite */
-+	exit_mm(current);
-+	tsk->session = 1;
-+	tsk->pgrp = 1;
-+	tsk->tty = NULL;
-+	exit_files(current);
-+	reparent_to_init();
-+
-+	sprintf(tsk->comm, "kdelext3-%s", kdevname(sb->s_dev));
-+	sigfillset(&tsk->blocked);
-+
-+	tsk->flags |= PF_KERNTHREAD;
-+
-+	INIT_LIST_HEAD(&sbi->s_delete_list);
-+	wake_up(&sbi->s_delete_waiter_queue);
-+	printk(KERN_INFO "EXT3-fs: delete thread on %s started\n",
-+	       kdevname(sb->s_dev));
-+
-+	/* main loop */
-+	for (;;) {
-+		sleep_on(&sbi->s_delete_thread_queue);
-+		printk(KERN_DEBUG "%s woken up: %lu inodes, %lu blocks\n",
-+		       tsk->comm, sbi->s_delete_inodes, sbi->s_delete_blocks);
-+
-+		spin_lock(&sbi->s_delete_lock);
-+		if (list_empty(&sbi->s_delete_list)) {
-+			memset(&sbi->s_delete_list, 0,
-+			       sizeof(sbi->s_delete_list));
-+			spin_unlock(&sbi->s_delete_lock);
-+			printk(KERN_DEBUG "ext3 delete thread on %s exiting\n",
-+			       kdevname(sb->s_dev));
-+			wake_up(&sbi->s_delete_waiter_queue);
-+			break;
-+		}
-+
-+		while (!list_empty(&sbi->s_delete_list)) {
-+			struct inode *inode=list_entry(sbi->s_delete_list.next,
-+						       struct inode, i_dentry);
-+			unsigned long blocks = inode->i_blocks >>
-+							(inode->i_blkbits - 9);
-+
-+			list_del_init(&inode->i_dentry);
-+			spin_unlock(&sbi->s_delete_lock);
-+			printk(KERN_DEBUG "%s delete ino %lu blk %lu\n",
-+				   tsk->comm, inode->i_ino, blocks);
-+
-+			iput(inode);
-+
-+			spin_lock(&sbi->s_delete_lock);
-+			sbi->s_delete_blocks -= blocks;
-+			sbi->s_delete_inodes--;
-+		}
-+		if (sbi->s_delete_blocks != 0 || sbi->s_delete_inodes != 0)
-+			printk(KERN_WARNING
-+			       "%lu blocks and %lu left on list?\n",
-+			       sbi->s_delete_blocks, sbi->s_delete_inodes);
-+		sbi->s_delete_blocks = 0;
-+		sbi->s_delete_inodes = 0;
-+		spin_unlock(&sbi->s_delete_lock);
-+		wake_up(&sbi->s_delete_waiter_queue);
-+	}
-+
-+	return 0;
-+}
-+
-+static void ext3_start_delete_thread(struct super_block *sb)
-+{
-+	struct ext3_sb_info *sbi = EXT3_SB(sb);
-+	int rc;
-+
-+	spin_lock_init(&sbi->s_delete_lock);
-+	memset(&sbi->s_delete_list, 0, sizeof(sbi->s_delete_list));
-+	init_waitqueue_head(&sbi->s_delete_thread_queue);
-+	init_waitqueue_head(&sbi->s_delete_waiter_queue);
-+	sbi->s_delete_blocks = 0;
-+	sbi->s_delete_inodes = 0;
-+	rc = kernel_thread(ext3_delete_thread, sb, CLONE_VM | CLONE_FILES);
-+	if (rc < 0)
-+		printk(KERN_ERR "EXT3-fs: cannot start delete thread: rc %d\n",
-+		       rc);
-+	else
-+		wait_event(sbi->s_delete_waiter_queue, sbi->s_delete_list.next);
-+}
-+
-+static void ext3_stop_delete_thread(struct ext3_sb_info *sbi)
-+{
-+	wake_up(&sbi->s_delete_thread_queue);
-+	wait_event(sbi->s_delete_waiter_queue, list_empty(&sbi->s_delete_list));
-+}
-+
-+/* Instead of playing games with the inode flags, destruction, etc we just
-+ * duplicate the inode data locally and put it on a list for the truncate
-+ * thread.  We need large parts of the inode struct in order to complete
-+ * the truncate and unlink, so we may as well just copy the whole thing.
-+ *
-+ * If we have any problem deferring the delete, just delete it right away.
-+ * If we defer it, we also mark how many blocks it would free, so that we
-+ * can keep the statfs data correct, and we know if we should sleep on the
-+ * truncate thread when we run out of space.
-+ *
-+ * One shouldn't consider this duplicate an "inode", as it isn't really
-+ * visible to the VFS, but rather a data struct that holds truncate data.
-+ *
-+ * In 2.5 this can be done much more cleanly by just registering a "drop"
-+ * method in the super_operations struct.
-+ */
-+static void ext3_delete_inode_thread(struct inode *old_inode)
-+{
-+	struct ext3_sb_info *sbi = EXT3_SB(old_inode->i_sb);
-+	struct inode *new_inode;
-+	unsigned long blocks = old_inode->i_blocks >> (old_inode->i_blkbits-9);
-+
-+	if (is_bad_inode(old_inode)) {
-+		clear_inode(old_inode);
-+		return;
-+	}
-+
-+	/* We may want to delete the inode immediately and not defer it */
-+	if (IS_SYNC(old_inode) || blocks <= EXT3_NDIR_BLOCKS ||
-+	    !sbi->s_delete_list.next) {
-+		ext3_delete_inode(old_inode);
-+		return;
-+	}
-+
-+	if (EXT3_I(old_inode)->i_state & EXT3_STATE_DELETE) {
-+		ext3_debug("doing deferred inode %lu delete (%lu blocks)\n",
-+			   old_inode->i_ino, blocks);
-+		ext3_delete_inode(old_inode);
-+		return;
-+	}
-+
-+	/* We can iget this inode again here, because our caller has unhashed
-+	 * old_inode, so new_inode will be in a different inode struct.
-+	 *
-+	 * We need to ensure that the i_orphan pointers in the other inodes
-+	 * point at the new inode copy instead of the old one so the orphan
-+	 * list doesn't get corrupted when the old orphan inode is freed.
-+	 */
-+	down(&sbi->s_orphan_lock);
-+
-+	EXT3_SB(old_inode->i_sb)->s_mount_state |= EXT3_ORPHAN_FS;
-+	new_inode = iget(old_inode->i_sb, old_inode->i_ino);
-+	EXT3_SB(old_inode->i_sb)->s_mount_state &= ~EXT3_ORPHAN_FS;
-+	if (is_bad_inode(new_inode)) {
-+		printk(KERN_WARNING "read bad inode %lu\n", old_inode->i_ino);
-+		iput(new_inode);
-+		new_inode = NULL;
-+	}
-+	if (!new_inode) {
-+		up(&sbi->s_orphan_lock);
-+		ext3_debug(KERN_DEBUG "delete inode %lu directly (bad read)\n",
-+			   old_inode->i_ino);
-+		ext3_delete_inode(old_inode);
-+		return;
-+	}
-+	J_ASSERT(new_inode != old_inode);
-+
-+	J_ASSERT(!list_empty(&EXT3_I(old_inode)->i_orphan));
-+	/* Ugh.  We need to insert new_inode into the same spot on the list
-+	 * as old_inode was, to ensure the in-memory orphan list is still
-+	 * the same as the on-disk orphan list.
-+	 */
-+	EXT3_I(new_inode)->i_orphan = EXT3_I(old_inode)->i_orphan;
-+	EXT3_I(new_inode)->i_orphan.next->prev = &EXT3_I(new_inode)->i_orphan;
-+	EXT3_I(new_inode)->i_orphan.prev->next = &EXT3_I(new_inode)->i_orphan;
-+	EXT3_I(new_inode)->i_state |= EXT3_STATE_DELETE;
-+	up(&sbi->s_orphan_lock);
-+
-+	clear_inode(old_inode);
-+
-+	printk(KERN_DEBUG "delete inode %lu (%lu blocks) by thread\n",
-+	       new_inode->i_ino, blocks);
-+	spin_lock(&sbi->s_delete_lock);
-+	J_ASSERT(list_empty(&new_inode->i_dentry));
-+	list_add_tail(&new_inode->i_dentry, &sbi->s_delete_list);
-+	sbi->s_delete_blocks += blocks;
-+	sbi->s_delete_inodes++;
-+	spin_unlock(&sbi->s_delete_lock);
-+
-+	wake_up(&sbi->s_delete_thread_queue);
-+}
-+#else
-+#define ext3_start_delete_thread(sbi) do {} while(0)
-+#define ext3_stop_delete_thread(sbi) do {} while(0)
-+#endif /* EXT3_DELETE_THREAD */
-+
- void ext3_put_super (struct super_block * sb)
- {
- 	struct ext3_sb_info *sbi = EXT3_SB(sb);
-@@ -405,6 +606,7 @@ void ext3_put_super (struct super_block 
- 	kdev_t j_dev = sbi->s_journal->j_dev;
- 	int i;
- 
-+	ext3_stop_delete_thread(sbi);
- 	ext3_xattr_put_super(sb);
- 	journal_destroy(sbi->s_journal);
- 	if (!(sb->s_flags & MS_RDONLY)) {
-@@ -453,7 +655,11 @@ static struct super_operations ext3_sops
- 	write_inode:	ext3_write_inode,	/* BKL not held.  Don't need */
- 	dirty_inode:	ext3_dirty_inode,	/* BKL not held.  We take it */
- 	put_inode:	ext3_put_inode,		/* BKL not held.  Don't need */
-+#ifdef EXT3_DELETE_THREAD
-+	delete_inode:	ext3_delete_inode_thread,/* BKL not held. We take it */
-+#else
- 	delete_inode:	ext3_delete_inode,	/* BKL not held.  We take it */
-+#endif
- 	put_super:	ext3_put_super,		/* BKL held */
- 	write_super:	ext3_write_super,	/* BKL held */
- 	sync_fs:	ext3_sync_fs,
-@@ -1209,6 +1415,7 @@ struct super_block * ext3_read_super (st
- 	}
- 
- 	ext3_setup_super (sb, es, sb->s_flags & MS_RDONLY);
-+	ext3_start_delete_thread(sb);
- 	/*
- 	 * akpm: core read_super() calls in here with the superblock locked.
- 	 * That deadlocks, because orphan cleanup needs to lock the superblock
-
-_
diff --git a/lustre/kernel_patches/patches/extN-iget-debug.patch b/lustre/kernel_patches/patches/extN-iget-debug.patch
deleted file mode 100644
index dbe90c867b..0000000000
--- a/lustre/kernel_patches/patches/extN-iget-debug.patch
+++ /dev/null
@@ -1,48 +0,0 @@
---- linux/fs/ext3/namei.c.orig	Thu Jan 30 01:15:13 2003
-+++ linux/fs/ext3/namei.c	Sat Feb  1 00:33:46 2003
-@@ -710,6 +710,24 @@
- 	return ret;
- }
- 
-+static int ext3_find_inode(struct inode *inode, unsigned long ino,
-+			   void *opaque)
-+{
-+	const char *name = NULL;
-+	int len = 0;
-+
-+	if (opaque) {
-+		struct dentry *dentry = opaque;
-+		name = dentry->d_name.name;
-+		len = dentry->d_name.len;
-+	}
-+	printk(KERN_INFO "finding inode %s:%lu (%p) count %d (%p = %*s)\n",
-+	       kdevname(inode->i_dev), ino, inode, atomic_read(&inode->i_count),
-+	       opaque, len, name ? name : "");
-+
-+	return 1;
-+}
-+
- static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry)
- {
- 	struct inode * inode;
-@@ -724,8 +742,8 @@
- 	if (bh) {
- 		unsigned long ino = le32_to_cpu(de->inode);
- 		brelse (bh);
--		inode = iget(dir->i_sb, ino);
-+		inode = iget4(dir->i_sb, ino, ext3_find_inode, dentry);
- 
- 		if (!inode)
- 			return ERR_PTR(-EACCES);
---- linux/fs/ext3/inode.c.orig	Thu Jan 30 01:15:13 2003
-+++ linux/fs/ext3/inode.c	Sat Feb  1 00:34:45 2003
-@@ -166,6 +166,9 @@
-  */
- void ext3_put_inode (struct inode * inode)
- {
-+	printk(KERN_INFO "putting inode %s:%lu (%p) count %d\n",
-+	       kdevname(inode->i_dev), inode->i_ino, inode,
-+	       atomic_read(&inode->i_count));
- 	ext3_discard_prealloc (inode);
- }
- 
diff --git a/lustre/kernel_patches/patches/gpl_header-chaos-2.4.20.patch b/lustre/kernel_patches/patches/gpl_header-chaos-2.4.20.patch
new file mode 100644
index 0000000000..95213baade
--- /dev/null
+++ b/lustre/kernel_patches/patches/gpl_header-chaos-2.4.20.patch
@@ -0,0 +1,11 @@
+--- kernel-2.4.20-6chaos_18_7/include/linux/module.h~gpl-header	Wed Jul 16 03:54:37 2003
++++ kernel-2.4.20-6chaos_18_7/include/linux/module.h	Wed Jul 16 03:55:45 2003
+@@ -288,7 +288,7 @@
+ "license=" license
+ 
+ #define GPL_HEADER() \
+-static const char cpyright="This software may be freely redistributed under the terms of the GNU General Public License.";
++static const char cpyright[]="This software may be freely redistributed under the terms of the GNU General Public License.";
+ 
+ /* Define the module variable, and usage macros.  */
+ extern struct module __this_module;
diff --git a/lustre/kernel_patches/patches/inode-protection-from-pdflush.patch b/lustre/kernel_patches/patches/inode-protection-from-pdflush.patch
new file mode 100644
index 0000000000..abfdc32c50
--- /dev/null
+++ b/lustre/kernel_patches/patches/inode-protection-from-pdflush.patch
@@ -0,0 +1,29 @@
+
+diff -puN fs/fs-writeback.c~inode-protection-from-pdflush fs/fs-writeback.c
+--- linux-2.5.73/fs/fs-writeback.c~inode-protection-from-pdflush	Mon Jul  7 01:10:17 2003
++++ linux-2.5.73-alexey/fs/fs-writeback.c	Mon Jul  7 01:10:17 2003
+@@ -198,6 +198,11 @@ static void
+ __writeback_single_inode(struct inode *inode,
+ 			struct writeback_control *wbc)
+ {
++	if (inode->i_flags & I_SKIP_PDFLUSH) {
++		list_move(&inode->i_list, &inode->i_sb->s_dirty);
++		return;
++	}
++
+ 	if ((wbc->sync_mode != WB_SYNC_ALL) && (inode->i_state & I_LOCK)) {
+ 		list_move(&inode->i_list, &inode->i_sb->s_dirty);
+ 		return;
+diff -puN include/linux/fs.h~inode-protection-from-pdflush include/linux/fs.h
+--- linux-2.5.73/include/linux/fs.h~inode-protection-from-pdflush	Mon Jul  7 01:22:16 2003
++++ linux-2.5.73-alexey/include/linux/fs.h	Mon Jul  7 01:23:18 2003
+@@ -816,6 +816,7 @@ struct super_operations {
+ #define I_FREEING		16
+ #define I_CLEAR			32
+ #define I_NEW			64
++#define I_SKIP_PDFLUSH		1024 /* inode will be out of pdflush's scope */
+ 
+ #define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES)
+ 
+
+_
diff --git a/lustre/kernel_patches/patches/invalidate_show_2.4.20_chaos.patch b/lustre/kernel_patches/patches/invalidate_show_2.4.20_chaos.patch
new file mode 100644
index 0000000000..7c98c45625
--- /dev/null
+++ b/lustre/kernel_patches/patches/invalidate_show_2.4.20_chaos.patch
@@ -0,0 +1,112 @@
+ fs/inode.c         |   21 ++++++++++++++-------
+ fs/smbfs/inode.c   |    2 +-
+ fs/super.c         |    4 ++--
+ include/linux/fs.h |    2 +-
+ 4 files changed, 18 insertions(+), 11 deletions(-)
+
+--- kernel-2.4.20-6chaos_18_7/fs/inode.c~invalidate_show_2.4.20_chaos	2003-05-15 21:14:25.000000000 -0600
++++ kernel-2.4.20-6chaos_18_7-braam/fs/inode.c	2003-07-12 15:33:08.000000000 -0600
+@@ -604,7 +604,8 @@ static void dispose_list(struct list_hea
+ /*
+  * Invalidate all inodes for a device.
+  */
+-static int invalidate_list(struct list_head *head, struct super_block * sb, struct list_head * dispose)
++static int invalidate_list(struct list_head *head, struct super_block * sb,
++			   struct list_head * dispose, int show)
+ {
+ 	struct list_head *next;
+ 	int busy = 0, count = 0;
+@@ -629,6 +630,11 @@ static int invalidate_list(struct list_h
+ 			count++;
+ 			continue;
+ 		}
++		if (show)
++			printk(KERN_ERR
++			       "inode busy: dev %s:%lu (%p) mode %o count %u\n",
++			       kdevname(sb->s_dev), inode->i_ino, inode,
++			       inode->i_mode, atomic_read(&inode->i_count));
+ 		busy = 1;
+ 	}
+ 	/* only unused inodes may be cached with i_count zero */
+@@ -647,22 +653,23 @@ static int invalidate_list(struct list_h
+ /**
+  *	invalidate_inodes	- discard the inodes on a device
+  *	@sb: superblock
++ *      @show: whether we should display any busy inodes found
+  *
+  *	Discard all of the inodes for a given superblock. If the discard
+  *	fails because there are busy inodes then a non zero value is returned.
+  *	If the discard is successful all the inodes have been discarded.
+  */
+  
+-int invalidate_inodes(struct super_block * sb)
++int invalidate_inodes(struct super_block * sb, int show)
+ {
+ 	int busy;
+ 	LIST_HEAD(throw_away);
+ 
+ 	spin_lock(&inode_lock);
+-	busy = invalidate_list(&inode_in_use, sb, &throw_away);
+-	busy |= invalidate_list(&inode_unused, sb, &throw_away);
+-	busy |= invalidate_list(&sb->s_dirty, sb, &throw_away);
+-	busy |= invalidate_list(&sb->s_locked_inodes, sb, &throw_away);
++	busy = invalidate_list(&inode_in_use, sb, &throw_away, show);
++	busy |= invalidate_list(&inode_unused, sb, &throw_away, show);
++	busy |= invalidate_list(&sb->s_dirty, sb, &throw_away, show);
++	busy |= invalidate_list(&sb->s_locked_inodes, sb, &throw_away, show);
+ 	spin_unlock(&inode_lock);
+ 
+ 	dispose_list(&throw_away);
+@@ -688,7 +695,7 @@ int invalidate_device(kdev_t dev, int do
+ 		 * hold).
+ 		 */
+ 		shrink_dcache_sb(sb);
+-		res = invalidate_inodes(sb);
++		res = invalidate_inodes(sb, 0);
+ 		drop_super(sb);
+ 	}
+ 	invalidate_buffers(dev);
+--- kernel-2.4.20-6chaos_18_7/fs/super.c~invalidate_show_2.4.20_chaos	2003-05-15 21:14:25.000000000 -0600
++++ kernel-2.4.20-6chaos_18_7-braam/fs/super.c	2003-07-12 15:31:35.000000000 -0600
+@@ -943,7 +943,7 @@ void kill_super(struct super_block *sb)
+ 	lock_super(sb);
+ 	lock_kernel();
+ 	sb->s_flags &= ~MS_ACTIVE;
+-	invalidate_inodes(sb);	/* bad name - it should be evict_inodes() */
++	invalidate_inodes(sb, 0);  /* bad name - it should be evict_inodes() */
+ 	if (sop) {
+ 		if (sop->write_super && sb->s_dirt)
+ 			sop->write_super(sb);
+@@ -952,7 +952,7 @@ void kill_super(struct super_block *sb)
+ 	}
+ 
+ 	/* Forget any remaining inodes */
+-	if (invalidate_inodes(sb)) {
++	if (invalidate_inodes(sb, 1)) {
+ 		printk(KERN_ERR "VFS: Busy inodes after unmount. "
+ 			"Self-destruct in 5 seconds.  Have a nice day...\n");
+ 	}
+--- kernel-2.4.20-6chaos_18_7/include/linux/fs.h~invalidate_show_2.4.20_chaos	2003-07-12 15:14:02.000000000 -0600
++++ kernel-2.4.20-6chaos_18_7-braam/include/linux/fs.h	2003-07-12 15:31:35.000000000 -0600
+@@ -1284,7 +1284,7 @@ static inline void mark_buffer_dirty_ino
+ extern void set_buffer_flushtime(struct buffer_head *);
+ extern void balance_dirty(void);
+ extern int check_disk_change(kdev_t);
+-extern int invalidate_inodes(struct super_block *);
++extern int invalidate_inodes(struct super_block *, int);
+ extern int invalidate_device(kdev_t, int);
+ extern void invalidate_inode_pages(struct inode *);
+ extern void invalidate_inode_pages2(struct address_space *);
+--- kernel-2.4.20-6chaos_18_7/fs/smbfs/inode.c~invalidate_show_2.4.20_chaos	2003-02-14 15:59:13.000000000 -0700
++++ kernel-2.4.20-6chaos_18_7-braam/fs/smbfs/inode.c	2003-07-12 15:31:35.000000000 -0600
+@@ -167,7 +167,7 @@ smb_invalidate_inodes(struct smb_sb_info
+ {
+ 	VERBOSE("\n");
+ 	shrink_dcache_sb(SB_of(server));
+-	invalidate_inodes(SB_of(server));
++	invalidate_inodes(SB_of(server), 0);
+ }
+ 
+ /*
+
+_
diff --git a/lustre/kernel_patches/patches/iopen-2.5.73.patch b/lustre/kernel_patches/patches/iopen-2.5.73.patch
new file mode 100644
index 0000000000..c9d422372b
--- /dev/null
+++ b/lustre/kernel_patches/patches/iopen-2.5.73.patch
@@ -0,0 +1,403 @@
+ Documentation/filesystems/ext2.txt |   16 ++
+ fs/ext3/Makefile                   |    2 
+ fs/ext3/inode.c                    |    3 
+ fs/ext3/iopen.c                    |  239 +++++++++++++++++++++++++++++++++++++
+ fs/ext3/iopen.h                    |   15 ++
+ fs/ext3/namei.c                    |   13 ++
+ fs/ext3/super.c                    |   11 +
+ include/linux/ext3_fs.h            |    2 
+ 8 files changed, 300 insertions(+), 1 deletion(-)
+
+--- linux-2.6.0-test1/Documentation/filesystems/ext2.txt~iopen-2.5.73	2003-07-13 21:31:56.000000000 -0600
++++ linux-2.6.0-test1-braam/Documentation/filesystems/ext2.txt	2003-07-22 01:15:46.000000000 -0600
+@@ -35,6 +35,22 @@ resgid=n			The group ID which may use th
+ 
+ sb=n				Use alternate superblock at this location.
+ 
++iopen				Makes an invisible pseudo-directory called 
++				__iopen__ available in the root directory
++				of the filesystem.  Allows open-by-inode-
++				number.  i.e., inode 3145 can be accessed
++				via /mntpt/__iopen__/3145
++
++iopen_nopriv			This option makes the iopen directory be
++				world-readable.  This may be safer since it
++				allows daemons to run as an unprivileged user,
++				however it significantly changes the security
++				model of a Unix filesystem, since previously
++				all files under a mode 700 directory were not
++				generally avilable even if the
++				permissions on the file itself is
++				world-readable.
++
+ grpquota,noquota,quota,usrquota	Quota options are silently ignored by ext2.
+ 
+ 
+--- linux-2.6.0-test1/fs/ext3/Makefile~iopen-2.5.73	2003-07-13 21:30:37.000000000 -0600
++++ linux-2.6.0-test1-braam/fs/ext3/Makefile	2003-07-22 01:15:46.000000000 -0600
+@@ -5,7 +5,7 @@
+ obj-$(CONFIG_EXT3_FS) += ext3.o
+ 
+ ext3-objs    := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \
+-		ioctl.o namei.o super.o symlink.o hash.o
++		iopen.o ioctl.o namei.o super.o symlink.o hash.o
+ 
+ ifeq ($(CONFIG_EXT3_FS_XATTR),y)
+ ext3-objs += xattr.o xattr_user.o xattr_trusted.o
+--- linux-2.6.0-test1/fs/ext3/inode.c~iopen-2.5.73	2003-07-22 01:15:25.000000000 -0600
++++ linux-2.6.0-test1-braam/fs/ext3/inode.c	2003-07-22 01:16:19.000000000 -0600
+@@ -37,6 +37,7 @@
+ #include <linux/mpage.h>
+ #include <linux/uio.h>
+ #include "xattr.h"
++#include "iopen.h"
+ #include "acl.h"
+ 
+ /*
+@@ -2478,6 +2479,8 @@ void ext3_read_inode(struct inode * inod
+ 	ei->i_acl = EXT3_ACL_NOT_CACHED;
+ 	ei->i_default_acl = EXT3_ACL_NOT_CACHED;
+ #endif
++	if (ext3_iopen_get_inode(inode))
++		return;
+ 	if (ext3_get_inode_loc(inode, &iloc, 0))
+ 		goto bad_inode;
+ 	bh = iloc.bh;
+--- /dev/null	2003-01-30 03:24:37.000000000 -0700
++++ linux-2.6.0-test1-braam/fs/ext3/iopen.c	2003-07-22 01:15:46.000000000 -0600
+@@ -0,0 +1,239 @@
++
++
++/*
++ * linux/fs/ext3/iopen.c
++ *
++ * Special support for open by inode number
++ *
++ * Copyright (C) 2001 by Theodore Ts'o (tytso@alum.mit.edu).
++ * 
++ * This file may be redistributed under the terms of the GNU General
++ * Public License.
++ */
++
++#include <linux/sched.h>
++#include <linux/fs.h>
++#include <linux/ext3_jbd.h>
++#include <linux/jbd.h>
++#include <linux/ext3_fs.h>
++#include <linux/smp_lock.h>
++#include "iopen.h"
++
++#ifndef assert
++#define assert(test) J_ASSERT(test)
++#endif
++
++#define IOPEN_NAME_LEN	32
++
++/*
++ * This implements looking up an inode by number.
++ */
++static struct dentry *iopen_lookup(struct inode * dir, struct dentry *dentry)
++{
++	struct inode * inode;
++	unsigned long ino;
++        struct list_head *lp;
++        struct dentry *alternate;
++	char buf[IOPEN_NAME_LEN];
++	
++	if (dentry->d_name.len >= IOPEN_NAME_LEN)
++		return ERR_PTR(-ENAMETOOLONG);
++
++	memcpy(buf, dentry->d_name.name, dentry->d_name.len);
++	buf[dentry->d_name.len] = 0;
++
++	if (strcmp(buf, ".") == 0)
++		ino = dir->i_ino;
++	else if (strcmp(buf, "..") == 0)
++		ino = EXT3_ROOT_INO;
++	else
++		ino = simple_strtoul(buf, 0, 0);
++
++	if ((ino != EXT3_ROOT_INO &&
++	     //ino != EXT3_ACL_IDX_INO &&
++	     //ino != EXT3_ACL_DATA_INO &&
++	     ino < EXT3_FIRST_INO(dir->i_sb)) ||
++	    ino > le32_to_cpu(EXT3_SB(dir->i_sb)->s_es->s_inodes_count))
++		return ERR_PTR(-ENOENT);
++
++	inode = iget(dir->i_sb, ino);
++	if (!inode)
++		return ERR_PTR(-EACCES);
++	if (is_bad_inode(inode)) {
++		iput(inode);
++		return ERR_PTR(-ENOENT);
++	}
++
++        /* preferrably return a connected dentry */
++        spin_lock(&dcache_lock);
++        list_for_each(lp, &inode->i_dentry) {
++                alternate = list_entry(lp, struct dentry, d_alias);
++                assert(!(alternate->d_flags & DCACHE_DISCONNECTED));
++        }
++
++        if (!list_empty(&inode->i_dentry)) {
++                alternate = list_entry(inode->i_dentry.next, 
++                                       struct dentry, d_alias);
++                dget_locked(alternate);
++                alternate->d_vfs_flags |= DCACHE_REFERENCED;
++                iput(inode);
++                spin_unlock(&dcache_lock);
++                return alternate;
++        }
++        dentry->d_flags |= DCACHE_DISCONNECTED;
++        spin_unlock(&dcache_lock);
++
++	d_add(dentry, inode);
++	return NULL;
++}
++
++#define do_switch(x,y) do { \
++	__typeof__ (x) __tmp = x; \
++	x = y; y = __tmp; } while (0)
++
++static inline void switch_names(struct dentry * dentry, struct dentry * target)
++{
++	const unsigned char *old_name, *new_name;
++
++	memcpy(dentry->d_iname, target->d_iname, DNAME_INLINE_LEN); 
++	old_name = target->d_name.name;
++	new_name = dentry->d_name.name;
++	if (old_name == target->d_iname)
++		old_name = dentry->d_iname;
++	if (new_name == dentry->d_iname)
++		new_name = target->d_iname;
++	target->d_name.name = new_name;
++	dentry->d_name.name = old_name;
++}
++
++
++struct dentry *iopen_connect_dentry(struct dentry *de, struct inode *inode)
++{
++        struct dentry *tmp, *goal = NULL;
++        struct list_head *lp;
++
++        /* preferrably return a connected dentry */
++        spin_lock(&dcache_lock);
++        /* verify this dentry is really new */
++        assert(!de->d_inode);
++        assert(list_empty(&de->d_subdirs));
++        assert(list_empty(&de->d_alias));
++
++
++        list_for_each(lp, &inode->i_dentry) {
++                tmp = list_entry(lp, struct dentry, d_alias);
++                if (tmp->d_flags & DCACHE_DISCONNECTED) {
++                        assert(tmp->d_alias.next == &inode->i_dentry);
++                        assert(tmp->d_alias.prev == &inode->i_dentry);
++                        goal = tmp;
++                        dget_locked(goal);
++                        break;
++                }
++        }
++
++        if (!goal) { 
++                spin_unlock(&dcache_lock);
++                return NULL; 
++        }
++
++        /* Move the goal to the de hash queue */
++        goal->d_flags &= ~DCACHE_DISCONNECTED;
++	hlist_add_before(&goal->d_hash, &de->d_hash);
++	hlist_del(&goal->d_hash);
++
++	list_del(&goal->d_child);
++	list_del(&de->d_child);
++
++	/* Switch the parents and the names.. */
++	switch_names(goal, de);
++	do_switch(goal->d_parent, de->d_parent);
++	do_switch(goal->d_name.len, de->d_name.len);
++	do_switch(goal->d_name.hash, de->d_name.hash);
++
++	/* And add them back to the (new) parent lists */
++	list_add(&goal->d_child, &goal->d_parent->d_subdirs);
++	list_add(&de->d_child, &de->d_parent->d_subdirs);
++
++        spin_unlock(&dcache_lock);
++        return goal;
++}
++
++/*
++ * These are the special structures for the iopen pseudo directory.
++ */
++
++static struct inode_operations iopen_inode_operations = {
++	lookup:		iopen_lookup,		/* BKL held */
++};
++
++static struct file_operations iopen_file_operations = {
++	read:		generic_read_dir,
++};
++
++static int match_dentry(struct dentry *dentry, const char *name)
++{
++	int	len;
++
++	len = strlen(name);
++	if (dentry->d_name.len != len)
++		return 0;
++	if (strncmp(dentry->d_name.name, name, len))
++		return 0;
++	return 1;
++}
++
++/*
++ * This function is spliced into ext3_lookup and returns 1 the file
++ * name is __iopen__ and dentry has been filled in appropriately.
++ */
++int ext3_check_for_iopen(struct inode * dir, struct dentry *dentry)
++{
++	struct inode * inode;
++
++	if (dir->i_ino != EXT3_ROOT_INO ||
++	    !test_opt(dir->i_sb, IOPEN) ||
++	    !match_dentry(dentry, "__iopen__"))
++		return 0;
++
++	inode = iget(dir->i_sb, EXT3_BAD_INO);
++
++	if (!inode) 
++		return 0;
++	d_add(dentry, inode);
++	return 1;
++}
++
++/*
++ * This function is spliced into read_inode; it returns 1 if inode
++ * number is the one for /__iopen__, in which case the inode is filled
++ * in appropriately.  Otherwise, this fuction returns 0.
++ */
++int ext3_iopen_get_inode(struct inode * inode)
++{
++	if (inode->i_ino != EXT3_BAD_INO)
++		return 0;
++
++	inode->i_mode = S_IFDIR | S_IRUSR | S_IXUSR;
++	if (test_opt(inode->i_sb, IOPEN_NOPRIV))
++		inode->i_mode |= 0777;
++	inode->i_uid = 0;
++	inode->i_gid = 0;
++	inode->i_nlink = 1;
++	inode->i_size = 4096;
++	inode->i_atime = CURRENT_TIME;
++	inode->i_ctime = CURRENT_TIME;
++	inode->i_mtime = CURRENT_TIME;
++	EXT3_I(inode)->i_dtime = 0;
++	inode->i_blksize = PAGE_SIZE;	/* This is the optimal IO size
++					 * (for stat), not the fs block
++					 * size */  
++	inode->i_blocks = 0;
++	inode->i_version = 1;
++	inode->i_generation = 0;
++
++	inode->i_op = &iopen_inode_operations;
++	inode->i_fop = &iopen_file_operations;
++	inode->i_mapping->a_ops = 0;
++
++	return 1;
++}
+--- /dev/null	2003-01-30 03:24:37.000000000 -0700
++++ linux-2.6.0-test1-braam/fs/ext3/iopen.h	2003-07-22 01:15:46.000000000 -0600
+@@ -0,0 +1,15 @@
++/*
++ * iopen.h
++ *
++ * Special support for opening files by inode number.
++ * 
++ * Copyright (C) 2001 by Theodore Ts'o (tytso@alum.mit.edu).
++ * 
++ * This file may be redistributed under the terms of the GNU General
++ * Public License.
++ */
++
++extern int ext3_check_for_iopen(struct inode * dir, struct dentry *dentry);
++extern int ext3_iopen_get_inode(struct inode * inode);
++
++
+--- linux-2.6.0-test1/fs/ext3/namei.c~iopen-2.5.73	2003-07-13 21:34:43.000000000 -0600
++++ linux-2.6.0-test1-braam/fs/ext3/namei.c	2003-07-22 01:17:20.000000000 -0600
+@@ -37,6 +37,7 @@
+ #include <linux/buffer_head.h>
+ #include <linux/smp_lock.h>
+ #include "xattr.h"
++#include "iopen.h"
+ #include "acl.h"
+ 
+ /*
+@@ -970,15 +971,21 @@ errout:
+ }
+ #endif
+ 
++struct dentry *iopen_connect_dentry(struct dentry *de, struct inode *inode);
++ 
+ static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry, struct nameidata *nd)
+ {
+ 	struct inode * inode;
+ 	struct ext3_dir_entry_2 * de;
+ 	struct buffer_head * bh;
++  	struct dentry *alternate = NULL;
+ 
+ 	if (dentry->d_name.len > EXT3_NAME_LEN)
+ 		return ERR_PTR(-ENAMETOOLONG);
+ 
++ 	if (ext3_check_for_iopen(dir, dentry))
++ 		return NULL;
++
+ 	bh = ext3_find_entry(dentry, &de);
+ 	inode = NULL;
+ 	if (bh) {
+@@ -991,6 +998,12 @@ static struct dentry *ext3_lookup(struct
+ 	}
+ 	if (inode)
+ 		return d_splice_alias(inode, dentry);
++
++	if (inode && (alternate = iopen_connect_dentry(dentry, inode))) {
++		iput(inode);
++		return alternate;
++	}
++
+ 	d_add(dentry, inode);
+ 	return NULL;
+ }
+--- linux-2.6.0-test1/fs/ext3/super.c~iopen-2.5.73	2003-07-22 01:15:25.000000000 -0600
++++ linux-2.6.0-test1-braam/fs/ext3/super.c	2003-07-22 01:15:46.000000000 -0600
+@@ -755,6 +755,17 @@ static int parse_options (char * options
+ 		         || !strcmp (this_char, "quota")
+ 		         || !strcmp (this_char, "usrquota"))
+ 			/* Don't do anything ;-) */ ;
++		else if (!strcmp (this_char, "iopen")) {
++			set_opt (sbi->s_mount_opt, IOPEN);
++			clear_opt (sbi->s_mount_opt, IOPEN_NOPRIV);
++		} else if (!strcmp (this_char, "noiopen")) {
++			clear_opt (sbi->s_mount_opt, IOPEN);
++			clear_opt (sbi->s_mount_opt, IOPEN_NOPRIV);
++		}
++		else if (!strcmp (this_char, "iopen_nopriv")) {
++			set_opt (sbi->s_mount_opt, IOPEN);
++			set_opt (sbi->s_mount_opt, IOPEN_NOPRIV);
++		}
+ 		else if (!strcmp (this_char, "journal")) {
+ 			/* @@@ FIXME */
+ 			/* Eventually we will want to be able to create
+--- linux-2.6.0-test1/include/linux/ext3_fs.h~iopen-2.5.73	2003-07-22 01:14:05.000000000 -0600
++++ linux-2.6.0-test1-braam/include/linux/ext3_fs.h	2003-07-22 01:15:46.000000000 -0600
+@@ -324,6 +324,8 @@ struct ext3_inode {
+ #define EXT3_MOUNT_NO_UID32		0x2000  /* Disable 32-bit UIDs */
+ #define EXT3_MOUNT_XATTR_USER		0x4000	/* Extended user attributes */
+ #define EXT3_MOUNT_POSIX_ACL		0x8000	/* POSIX Access Control Lists */
++#define EXT3_MOUNT_IOPEN	       0x10000  /* Allow access via iopen */
++#define EXT3_MOUNT_IOPEN_NOPRIV	       0x20000  /* Make iopen world-readable */
+ 
+ /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */
+ #ifndef _LINUX_EXT2_FS_H
+
+_
diff --git a/lustre/kernel_patches/patches/jbd-transno-cb.patch b/lustre/kernel_patches/patches/jbd-transno-cb.patch
deleted file mode 100644
index ceb086dba7..0000000000
--- a/lustre/kernel_patches/patches/jbd-transno-cb.patch
+++ /dev/null
@@ -1,240 +0,0 @@
-
-
-
- fs/jbd/commit.c      |   27 +++++++++++++++++++++---
- fs/jbd/journal.c     |    1 
- fs/jbd/transaction.c |   56 ++++++++++++++++++++++++++++++++++++++++-----------
- include/linux/jbd.h  |   20 ++++++++++++++++++
- 4 files changed, 90 insertions(+), 14 deletions(-)
-
---- linux-2.4.19/fs/jbd/commit.c~vanilla-2.4.19	Sun Jan 19 19:46:42 2003
-+++ linux-2.4.19-root/fs/jbd/commit.c	Sun Jan 19 19:46:42 2003
-@@ -475,7 +475,7 @@ start_journal_io:
-            transaction's t_log_list queue, and metadata buffers are on
-            the t_iobuf_list queue.
- 
--	   Wait for the transactions in reverse order.  That way we are
-+	   Wait for the buffers in reverse order.  That way we are
- 	   less likely to be woken up until all IOs have completed, and
- 	   so we incur less scheduling load.
- 	*/
-@@ -566,8 +566,10 @@ start_journal_io:
- 
- 	jbd_debug(3, "JBD: commit phase 6\n");
- 
--	if (is_journal_aborted(journal))
-+	if (is_journal_aborted(journal)) {
-+		unlock_journal(journal);
- 		goto skip_commit;
-+	}
- 
- 	/* Done it all: now write the commit record.  We should have
- 	 * cleaned up our previous buffers by now, so if we are in abort
-@@ -577,6 +579,7 @@ start_journal_io:
- 	descriptor = journal_get_descriptor_buffer(journal);
- 	if (!descriptor) {
- 		__journal_abort_hard(journal);
-+		unlock_journal(journal);
- 		goto skip_commit;
- 	}
- 	
-@@ -600,7 +603,6 @@ start_journal_io:
- 		put_bh(bh);		/* One for getblk() */
- 		journal_unlock_journal_head(descriptor);
- 	}
--	lock_journal(journal);
- 
- 	/* End of a transaction!  Finally, we can do checkpoint
-            processing: any buffers committed as a result of this
-@@ -609,6 +611,25 @@ start_journal_io:
- 
- skip_commit:
- 
-+	/* Call any callbacks that had been registered for handles in this
-+	 * transaction.  It is up to the callback to free any allocated
-+	 * memory.
-+	 */
-+	if (!list_empty(&commit_transaction->t_jcb)) {
-+		struct list_head *p, *n;
-+		int error = is_journal_aborted(journal);
-+
-+		list_for_each_safe(p, n, &commit_transaction->t_jcb) {
-+			struct journal_callback *jcb;
-+
-+			jcb = list_entry(p, struct journal_callback, jcb_list);
-+			list_del(p);
-+			jcb->jcb_func(jcb, error);
-+		}
-+	}
-+
-+	lock_journal(journal);
-+
- 	jbd_debug(3, "JBD: commit phase 7\n");
- 
- 	J_ASSERT(commit_transaction->t_sync_datalist == NULL);
---- linux-2.4.19/fs/jbd/journal.c~vanilla-2.4.19	Sun Jan 19 19:46:42 2003
-+++ linux-2.4.19-root/fs/jbd/journal.c	Sun Jan 19 19:46:42 2003
-@@ -58,6 +58,7 @@ EXPORT_SYMBOL(journal_sync_buffer);
- #endif
- EXPORT_SYMBOL(journal_flush);
- EXPORT_SYMBOL(journal_revoke);
-+EXPORT_SYMBOL(journal_callback_set);
- 
- EXPORT_SYMBOL(journal_init_dev);
- EXPORT_SYMBOL(journal_init_inode);
---- linux-2.4.19/fs/jbd/transaction.c~vanilla-2.4.19	Sun Jan 19 19:46:42 2003
-+++ linux-2.4.19-root/fs/jbd/transaction.c	Sun Jan 19 19:46:42 2003
-@@ -57,6 +57,7 @@ static transaction_t * get_transaction (
- 	transaction->t_state = T_RUNNING;
- 	transaction->t_tid = journal->j_transaction_sequence++;
- 	transaction->t_expires = jiffies + journal->j_commit_interval;
-+	INIT_LIST_HEAD(&transaction->t_jcb);
- 
- 	/* Set up the commit timer for the new transaction. */
- 	J_ASSERT (!journal->j_commit_timer_active);
-@@ -201,6 +202,20 @@ repeat_locked:
- 	return 0;
- }
- 
-+/* Allocate a new handle.  This should probably be in a slab... */
-+static handle_t *new_handle(int nblocks)
-+{
-+	handle_t *handle = jbd_kmalloc(sizeof (handle_t), GFP_NOFS);
-+	if (!handle)
-+		return NULL;
-+	memset(handle, 0, sizeof (handle_t));
-+	handle->h_buffer_credits = nblocks;
-+	handle->h_ref = 1;
-+	INIT_LIST_HEAD(&handle->h_jcb);
-+
-+	return handle;
-+}
-+
- /*
-  * Obtain a new handle.  
-  *
-@@ -227,14 +242,11 @@ handle_t *journal_start(journal_t *journ
- 		handle->h_ref++;
- 		return handle;
- 	}
--	
--	handle = jbd_kmalloc(sizeof (handle_t), GFP_NOFS);
-+
-+	handle = new_handle(nblocks);
- 	if (!handle)
- 		return ERR_PTR(-ENOMEM);
--	memset (handle, 0, sizeof (handle_t));
- 
--	handle->h_buffer_credits = nblocks;
--	handle->h_ref = 1;
- 	current->journal_info = handle;
- 
- 	err = start_this_handle(journal, handle);
-@@ -333,14 +345,11 @@ handle_t *journal_try_start(journal_t *j
- 	
- 	if (is_journal_aborted(journal))
- 		return ERR_PTR(-EIO);
--	
--	handle = jbd_kmalloc(sizeof (handle_t), GFP_NOFS);
-+
-+	handle = new_handle(nblocks);
- 	if (!handle)
- 		return ERR_PTR(-ENOMEM);
--	memset (handle, 0, sizeof (handle_t));
- 
--	handle->h_buffer_credits = nblocks;
--	handle->h_ref = 1;
- 	current->journal_info = handle;
- 
- 	err = try_start_this_handle(journal, handle);
-@@ -1328,6 +1337,28 @@ out:
- #endif
- 
- /*
-+ * Register a callback function for this handle.  The function will be
-+ * called when the transaction that this handle is part of has been
-+ * committed to disk with the original callback data struct and the
-+ * error status of the journal as parameters.  There is no guarantee of
-+ * ordering between handles within a single transaction, nor between
-+ * callbacks registered on the same handle.
-+ *
-+ * The caller is responsible for allocating the journal_callback struct.
-+ * This is to allow the caller to add as much extra data to the callback
-+ * as needed, but reduce the overhead of multiple allocations.  The caller
-+ * allocated struct must start with a struct journal_callback at offset 0,
-+ * and has the caller-specific data afterwards.
-+ */
-+void journal_callback_set(handle_t *handle,
-+			  void (*func)(struct journal_callback *jcb, int error),
-+			  struct journal_callback *jcb)
-+{
-+	list_add(&jcb->jcb_list, &handle->h_jcb);
-+	jcb->jcb_func = func;
-+}
-+
-+/*
-  * All done for a particular handle.
-  *
-  * There is not much action needed here.  We just return any remaining
-@@ -1393,7 +1424,10 @@ int journal_stop(handle_t *handle)
- 			wake_up(&journal->j_wait_transaction_locked);
- 	}
- 
--	/* 
-+	/* Move callbacks from the handle to the transaction. */
-+	list_splice(&handle->h_jcb, &transaction->t_jcb);
-+
-+	/*
- 	 * If the handle is marked SYNC, we need to set another commit
- 	 * going!  We also want to force a commit if the current
- 	 * transaction is occupying too much of the log, or if the
---- linux-2.4.19/include/linux/jbd.h~vanilla-2.4.19	Sun Jan 19 19:46:42 2003
-+++ linux-2.4.19-root/include/linux/jbd.h	Sun Jan 19 19:46:42 2003
-@@ -249,6 +249,13 @@ static inline struct journal_head *bh2jh
- 	return bh->b_private;
- }
- 
-+#define HAVE_JOURNAL_CALLBACK_STATUS
-+struct journal_callback {
-+	struct list_head jcb_list;
-+	void (*jcb_func)(struct journal_callback *jcb, int error);
-+	/* user data goes here */
-+};
-+
- struct jbd_revoke_table_s;
- 
- /* The handle_t type represents a single atomic update being performed
-@@ -279,6 +286,12 @@ struct handle_s 
- 	   operations */
- 	int			h_err;
- 
-+	/* List of application registered callbacks for this handle.
-+	 * The function(s) will be called after the transaction that
-+	 * this handle is part of has been committed to disk.
-+	 */
-+	struct list_head	h_jcb;
-+
- 	/* Flags */
- 	unsigned int	h_sync:		1;	/* sync-on-close */
- 	unsigned int	h_jdata:	1;	/* force data journaling */
-@@ -398,6 +411,10 @@ struct transaction_s 
- 
- 	/* How many handles used this transaction? */
- 	int t_handle_count;
-+
-+	/* List of registered callback functions for this transaction.
-+	 * Called when the transaction is committed. */
-+	struct list_head	t_jcb;
- };
- 
- 
-@@ -646,6 +663,9 @@ extern int	 journal_flushpage(journal_t 
- extern int	 journal_try_to_free_buffers(journal_t *, struct page *, int);
- extern int	 journal_stop(handle_t *);
- extern int	 journal_flush (journal_t *);
-+extern void	 journal_callback_set(handle_t *handle,
-+				      void (*fn)(struct journal_callback *,int),
-+				      struct journal_callback *jcb);
- 
- extern void	 journal_lock_updates (journal_t *);
- extern void	 journal_unlock_updates (journal_t *);
diff --git a/lustre/kernel_patches/patches/kexec-2.5.73-full.patch b/lustre/kernel_patches/patches/kexec-2.5.73-full.patch
new file mode 100644
index 0000000000..3f45a0678c
--- /dev/null
+++ b/lustre/kernel_patches/patches/kexec-2.5.73-full.patch
@@ -0,0 +1,1479 @@
+# This is a BitKeeper generated patch for the following project:
+# Project Name: Linux kernel tree
+# This patch format is intended for GNU patch command version 2.5 or higher.
+# This patch includes the following deltas:
+#	           ChangeSet	1.1376  -> 1.1380 
+#	arch/i386/kernel/smp.c	1.32    -> 1.33   
+#	        kernel/sys.c	1.47    -> 1.48   
+#	   arch/i386/Kconfig	1.62    -> 1.63   
+#	arch/i386/kernel/Makefile	1.44    -> 1.45   
+#	     kernel/Makefile	1.28    -> 1.29   
+#	arch/i386/kernel/entry.S	1.64    -> 1.65   
+#	arch/i386/kernel/reboot.c	1.8     -> 1.9    
+#	arch/i386/kernel/io_apic.c	1.71    -> 1.72   
+#	arch/i386/kernel/dmi_scan.c	1.36    -> 1.37   
+#	            fs/aio.c	1.32    -> 1.33   
+#	include/asm-i386/apicdef.h	1.8     -> 1.9    
+#	         MAINTAINERS	1.149   -> 1.150  
+#	include/asm-i386/unistd.h	1.26    -> 1.27   
+#	 arch/i386/defconfig	1.96    -> 1.97   
+#	arch/i386/kernel/i8259.c	1.25    -> 1.26   
+#	include/asm-i386/apic.h	1.13    -> 1.14   
+#	arch/i386/kernel/apic.c	1.42    -> 1.43   
+#	include/linux/reboot.h	1.4     -> 1.5    
+#	               (new)	        -> 1.1     include/linux/kexec.h
+#	               (new)	        -> 1.1     include/asm-i386/kexec.h
+#	               (new)	        -> 1.1     kernel/kexec.c 
+#	               (new)	        -> 1.1     arch/i386/kernel/relocate_kernel.S
+#	               (new)	        -> 1.1     arch/i386/kernel/machine_kexec.c
+#
+# The following is the BitKeeper ChangeSet Log
+# --------------------------------------------
+# 03/06/23	andyp@andyp.pdx.osdl.net	1.1377
+# kexec2-2.5.73-common.patch
+# --------------------------------------------
+# 03/06/23	andyp@andyp.pdx.osdl.net	1.1378
+# kexec2-2.5.73-x86.patch
+# --------------------------------------------
+# 03/06/23	andyp@andyp.pdx.osdl.net	1.1379
+# kexec2-2.5.73-syscall.patch
+# --------------------------------------------
+# 03/06/23	andyp@andyp.pdx.osdl.net	1.1380
+# kexec2-2.5.73-defconfig.patch
+# --------------------------------------------
+#
+diff -Nru a/MAINTAINERS b/MAINTAINERS
+--- a/MAINTAINERS	Mon Jun 23 12:22:26 2003
++++ b/MAINTAINERS	Mon Jun 23 12:22:26 2003
+@@ -1067,6 +1067,17 @@
+ W:	http://www.cse.unsw.edu.au/~neilb/patches/linux-devel/
+ S:	Maintained
+ 
++KEXEC
++P:	Eric Biederman
++M:	ebiederm@xmission.com
++M:	ebiederman@lnxi.com
++W:	http://www.xmission.com/~ebiederm/files/kexec/
++P:	Andy Pfiffer
++M:	andyp@osdl.org
++W:	http://www.osdl.org/archive/andyp/bloom/Code/Linux/Kexec/
++L:	linux-kernel@vger.kernel.org
++S:	Maintained
++
+ LANMEDIA WAN CARD DRIVER
+ P:	Andrew Stanley-Jones
+ M:	asj@lanmedia.com
+diff -Nru a/arch/i386/Kconfig b/arch/i386/Kconfig
+--- a/arch/i386/Kconfig	Mon Jun 23 12:22:26 2003
++++ b/arch/i386/Kconfig	Mon Jun 23 12:22:26 2003
+@@ -794,6 +794,23 @@
+ 	depends on ((X86_SUMMIT || X86_GENERICARCH) && NUMA)
+ 	default y
+ 
++config KEXEC
++	bool "kexec system call (EXPERIMENTAL)"
++	depends on EXPERIMENTAL
++	help
++	  kexec is a system call that implements the ability to  shutdown your
++	  current kernel, and to start another kernel.  It is like a reboot
++	  but it is indepedent of the system firmware.   And like a reboot
++	  you can start any kernel with it not just Linux.  
++	
++	  The name comes from the similiarity to the exec system call. 
++	
++	  It is on an going process to be certain the hardware in a machine
++	  is properly shutdown, so do not be surprised if this code does not
++	  initially work for you.  It may help to enable device hotplugging
++	  support.  As of this writing the exact hardware interface is
++	  strongly in flux, so no good recommendation can be made.
++
+ endmenu
+ 
+ 
+diff -Nru a/arch/i386/defconfig b/arch/i386/defconfig
+--- a/arch/i386/defconfig	Mon Jun 23 12:22:26 2003
++++ b/arch/i386/defconfig	Mon Jun 23 12:22:26 2003
+@@ -72,6 +72,7 @@
+ CONFIG_X86_LOCAL_APIC=y
+ CONFIG_X86_IO_APIC=y
+ CONFIG_NR_CPUS=32
++CONFIG_KEXEC=y
+ CONFIG_X86_MCE=y
+ # CONFIG_X86_MCE_NONFATAL is not set
+ CONFIG_X86_MCE_P4THERMAL=y
+diff -Nru a/arch/i386/kernel/Makefile b/arch/i386/kernel/Makefile
+--- a/arch/i386/kernel/Makefile	Mon Jun 23 12:22:26 2003
++++ b/arch/i386/kernel/Makefile	Mon Jun 23 12:22:26 2003
+@@ -24,6 +24,7 @@
+ obj-$(CONFIG_X86_MPPARSE)	+= mpparse.o
+ obj-$(CONFIG_X86_LOCAL_APIC)	+= apic.o nmi.o
+ obj-$(CONFIG_X86_IO_APIC)	+= io_apic.o
++obj-$(CONFIG_KEXEC)		+= machine_kexec.o relocate_kernel.o
+ obj-$(CONFIG_SOFTWARE_SUSPEND)	+= suspend.o suspend_asm.o
+ obj-$(CONFIG_X86_NUMAQ)		+= numaq.o
+ obj-$(CONFIG_X86_SUMMIT)	+= summit.o
+diff -Nru a/arch/i386/kernel/apic.c b/arch/i386/kernel/apic.c
+--- a/arch/i386/kernel/apic.c	Mon Jun 23 12:22:26 2003
++++ b/arch/i386/kernel/apic.c	Mon Jun 23 12:22:26 2003
+@@ -26,6 +26,7 @@
+ #include <linux/mc146818rtc.h>
+ #include <linux/kernel_stat.h>
+ #include <linux/sysdev.h>
++#include <linux/reboot.h>
+ 
+ #include <asm/atomic.h>
+ #include <asm/smp.h>
+@@ -175,6 +176,39 @@
+ 		outb(0x70, 0x22);
+ 		outb(0x00, 0x23);
+ 	}
++#ifdef 	CONFIG_KEXEC
++	else {
++		/* Go back to Virtual Wire compatibility mode */
++		unsigned long value;
++
++		/* For the spurious interrupt use vector F, and enable it */
++		value = apic_read(APIC_SPIV);
++		value &= ~APIC_VECTOR_MASK; 
++		value |= APIC_SPIV_APIC_ENABLED;
++		value |= 0xf;
++		apic_write_around(APIC_SPIV, value);
++
++		/* For LVT0 make it edge triggered, active high, external and enabled */
++		value = apic_read(APIC_LVT0);
++		value &= ~(APIC_MODE_MASK | APIC_SEND_PENDING | 
++			APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR | 
++			APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED );
++		value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
++		value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_EXINT);
++		apic_write_around(APIC_LVT0, value);
++		
++		/* For LVT1 make it edge triggered, active high, nmi and enabled */
++		value = apic_read(APIC_LVT1);
++		value &= ~(
++			APIC_MODE_MASK | APIC_SEND_PENDING | 
++			APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR | 
++			APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED);
++		value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
++		value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_NMI);
++		apic_write_around(APIC_LVT1, value);
++	}
++#endif	/* CONFIG_KEXEC */
++
+ }
+ 
+ void disable_local_APIC(void)
+@@ -1113,6 +1147,26 @@
+ 	printk (KERN_INFO "APIC error on CPU%d: %02lx(%02lx)\n",
+ 	        smp_processor_id(), v , v1);
+ 	irq_exit();
++}
++
++void stop_apics(void)
++{
++	/* By resetting the APIC's we disable the nmi watchdog */
++#if CONFIG_SMP
++	/*
++	 * Stop all CPUs and turn off local APICs and the IO-APIC, so
++	 * other OSs see a clean IRQ state.
++	 */
++	smp_send_stop();
++#else
++	disable_local_APIC();
++#endif
++#if defined(CONFIG_X86_IO_APIC)
++	if (smp_found_config) {
++		disable_IO_APIC();
++	}
++#endif
++	disconnect_bsp_APIC();
+ }
+ 
+ /*
+diff -Nru a/arch/i386/kernel/dmi_scan.c b/arch/i386/kernel/dmi_scan.c
+--- a/arch/i386/kernel/dmi_scan.c	Mon Jun 23 12:22:26 2003
++++ b/arch/i386/kernel/dmi_scan.c	Mon Jun 23 12:22:26 2003
+@@ -222,31 +222,6 @@
+ 	return 0;
+ }
+ 
+-/*
+- * Some machines require the "reboot=s"  commandline option, this quirk makes that automatic.
+- */
+-static __init int set_smp_reboot(struct dmi_blacklist *d)
+-{
+-#ifdef CONFIG_SMP
+-	extern int reboot_smp;
+-	if (reboot_smp == 0)
+-	{
+-		reboot_smp = 1;
+-		printk(KERN_INFO "%s series board detected. Selecting SMP-method for reboots.\n", d->ident);
+-	}
+-#endif
+-	return 0;
+-}
+-
+-/*
+- * Some machines require the "reboot=b,s"  commandline option, this quirk makes that automatic.
+- */
+-static __init int set_smp_bios_reboot(struct dmi_blacklist *d)
+-{
+-	set_smp_reboot(d);
+-	set_bios_reboot(d);
+-	return 0;
+-}
+ 
+ /*
+  * Some bioses have a broken protected mode poweroff and need to use realmode
+@@ -527,7 +502,7 @@
+ 			MATCH(DMI_BIOS_VERSION, "4.60 PGMA"),
+ 			MATCH(DMI_BIOS_DATE, "134526184"), NO_MATCH
+ 			} },
+-	{ set_smp_bios_reboot, "Dell PowerEdge 1300", {	/* Handle problems with rebooting on Dell 1300's */
++	{ set_bios_reboot, "Dell PowerEdge 1300", {	/* Handle problems with rebooting on Dell 1300's */
+ 			MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
+ 			MATCH(DMI_PRODUCT_NAME, "PowerEdge 1300/"),
+ 			NO_MATCH, NO_MATCH
+diff -Nru a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S
+--- a/arch/i386/kernel/entry.S	Mon Jun 23 12:22:26 2003
++++ b/arch/i386/kernel/entry.S	Mon Jun 23 12:22:26 2003
+@@ -876,5 +876,6 @@
+  	.long sys_clock_nanosleep
+ 	.long sys_statfs64
+ 	.long sys_fstatfs64	
++	.long sys_kexec_load		/* 270 */
+  
+ nr_syscalls=(.-sys_call_table)/4
+diff -Nru a/arch/i386/kernel/i8259.c b/arch/i386/kernel/i8259.c
+--- a/arch/i386/kernel/i8259.c	Mon Jun 23 12:22:26 2003
++++ b/arch/i386/kernel/i8259.c	Mon Jun 23 12:22:26 2003
+@@ -244,9 +244,21 @@
+ 	return 0;
+ }
+ 
++static int i8259A_shutdown(struct sys_device *dev)
++{
++	/* Put the i8259A into a quiescent state that
++	 * the kernel initialization code can get it
++	 * out of.
++	 */
++	outb(0xff, 0x21);	/* mask all of 8259A-1 */
++	outb(0xff, 0xA1);	/* mask all of 8259A-1 */
++	return 0;
++}
++
+ static struct sysdev_class i8259_sysdev_class = {
+ 	set_kset_name("i8259"),
+ 	.resume = i8259A_resume,
++	.shutdown = i8259A_shutdown,
+ };
+ 
+ static struct sys_device device_i8259A = {
+diff -Nru a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c
+--- a/arch/i386/kernel/io_apic.c	Mon Jun 23 12:22:26 2003
++++ b/arch/i386/kernel/io_apic.c	Mon Jun 23 12:22:26 2003
+@@ -1562,8 +1562,6 @@
+ 	 * Clear the IO-APIC before rebooting:
+ 	 */
+ 	clear_IO_APIC();
+-
+-	disconnect_bsp_APIC();
+ }
+ 
+ /*
+diff -Nru a/arch/i386/kernel/machine_kexec.c b/arch/i386/kernel/machine_kexec.c
+--- /dev/null	Wed Dec 31 16:00:00 1969
++++ b/arch/i386/kernel/machine_kexec.c	Mon Jun 23 12:22:26 2003
+@@ -0,0 +1,116 @@
++#include <linux/config.h>
++#include <linux/mm.h>
++#include <linux/kexec.h>
++#include <linux/delay.h>
++#include <asm/pgtable.h>
++#include <asm/pgalloc.h>
++#include <asm/tlbflush.h>
++#include <asm/mmu_context.h>
++#include <asm/io.h>
++#include <asm/apic.h>
++
++
++/*
++ * machine_kexec
++ * =======================
++ */
++
++
++static void set_idt(void *newidt, __u16 limit)
++{
++	unsigned char curidt[6];
++
++	/* ia32 supports unaliged loads & stores */
++	(*(__u16 *)(curidt)) = limit;
++	(*(__u32 *)(curidt +2)) = (unsigned long)(newidt);
++
++	__asm__ __volatile__ (
++		"lidt %0\n" 
++		: "=m" (curidt)
++		);
++};
++
++
++static void set_gdt(void *newgdt, __u16 limit)
++{
++	unsigned char curgdt[6];
++
++	/* ia32 supports unaliged loads & stores */
++	(*(__u16 *)(curgdt)) = limit;
++	(*(__u32 *)(curgdt +2)) = (unsigned long)(newgdt);
++
++	__asm__ __volatile__ (
++		"lgdt %0\n" 
++		: "=m" (curgdt)
++		);
++};
++
++static void load_segments(void)
++{
++#define __STR(X) #X
++#define STR(X) __STR(X)
++
++	__asm__ __volatile__ (
++		"\tljmp $"STR(__KERNEL_CS)",$1f\n"
++		"\t1:\n"
++		"\tmovl $"STR(__KERNEL_DS)",%eax\n"
++		"\tmovl %eax,%ds\n"
++		"\tmovl %eax,%es\n"
++		"\tmovl %eax,%fs\n"
++		"\tmovl %eax,%gs\n"
++		"\tmovl %eax,%ss\n"
++		);
++#undef STR
++#undef __STR
++}
++
++typedef void (*relocate_new_kernel_t)(
++	unsigned long indirection_page, unsigned long reboot_code_buffer,
++	unsigned long start_address);
++
++const extern unsigned char relocate_new_kernel[];
++extern void relocate_new_kernel_end(void);
++const extern unsigned int relocate_new_kernel_size;
++extern void use_mm(struct mm_struct *mm);
++
++void machine_kexec(struct kimage *image)
++{
++	unsigned long indirection_page;
++	unsigned long reboot_code_buffer;
++	relocate_new_kernel_t rnk;
++
++	/* switch to an mm where the reboot_code_buffer is identity mapped */
++	use_mm(&init_mm);
++	stop_apics();
++
++	/* Interrupts aren't acceptable while we reboot */
++	local_irq_disable();
++	reboot_code_buffer = page_to_pfn(image->reboot_code_pages) << PAGE_SHIFT;
++	indirection_page = image->head & PAGE_MASK;
++
++	/* copy it out */
++	memcpy((void *)reboot_code_buffer, relocate_new_kernel, relocate_new_kernel_size);
++
++	/* The segment registers are funny things, they are
++	 * automatically loaded from a table, in memory wherever you
++	 * set them to a specific selector, but this table is never
++	 * accessed again you set the segment to a different selector.
++	 *
++	 * The more common model is are caches where the behide
++	 * the scenes work is done, but is also dropped at arbitrary
++	 * times.
++	 *
++	 * I take advantage of this here by force loading the
++	 * segments, before I zap the gdt with an invalid value.
++	 */
++	load_segments();
++	/* The gdt & idt are now invalid.
++	 * If you want to load them you must set up your own idt & gdt.
++	 */
++	set_gdt(phys_to_virt(0),0);
++	set_idt(phys_to_virt(0),0);
++
++	/* now call it */
++	rnk = (relocate_new_kernel_t) reboot_code_buffer;
++	(*rnk)(indirection_page, reboot_code_buffer, image->start);
++}
+diff -Nru a/arch/i386/kernel/reboot.c b/arch/i386/kernel/reboot.c
+--- a/arch/i386/kernel/reboot.c	Mon Jun 23 12:22:26 2003
++++ b/arch/i386/kernel/reboot.c	Mon Jun 23 12:22:26 2003
+@@ -8,6 +8,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/mc146818rtc.h>
+ #include <asm/uaccess.h>
++#include <asm/apic.h>
+ #include "mach_reboot.h"
+ 
+ /*
+@@ -20,8 +21,7 @@
+ int reboot_thru_bios;
+ 
+ #ifdef CONFIG_SMP
+-int reboot_smp = 0;
+-static int reboot_cpu = -1;
++int reboot_cpu = -1;	  /* specifies the internal linux cpu id, not the apicid */
+ /* shamelessly grabbed from lib/vsprintf.c for readability */
+ #define is_digit(c)	((c) >= '0' && (c) <= '9')
+ #endif
+@@ -43,7 +43,6 @@
+ 			break;
+ #ifdef CONFIG_SMP
+ 		case 's': /* "smp" reboot by executing reset on BSP or other CPU*/
+-			reboot_smp = 1;
+ 			if (is_digit(*(str+1))) {
+ 				reboot_cpu = (int) (*(str+1) - '0');
+ 				if (is_digit(*(str+2))) 
+@@ -215,42 +214,7 @@
+ 
+ void machine_restart(char * __unused)
+ {
+-#ifdef CONFIG_SMP
+-	int cpuid;
+-	
+-	cpuid = GET_APIC_ID(apic_read(APIC_ID));
+-
+-	if (reboot_smp) {
+-
+-		/* check to see if reboot_cpu is valid 
+-		   if its not, default to the BSP */
+-		if ((reboot_cpu == -1) ||  
+-		      (reboot_cpu > (NR_CPUS -1))  || 
+-		      !(phys_cpu_present_map & (1<<cpuid))) 
+-			reboot_cpu = boot_cpu_physical_apicid;
+-
+-		reboot_smp = 0;  /* use this as a flag to only go through this once*/
+-		/* re-run this function on the other CPUs
+-		   it will fall though this section since we have 
+-		   cleared reboot_smp, and do the reboot if it is the
+-		   correct CPU, otherwise it halts. */
+-		if (reboot_cpu != cpuid)
+-			smp_call_function((void *)machine_restart , NULL, 1, 0);
+-	}
+-
+-	/* if reboot_cpu is still -1, then we want a tradional reboot, 
+-	   and if we are not running on the reboot_cpu,, halt */
+-	if ((reboot_cpu != -1) && (cpuid != reboot_cpu)) {
+-		for (;;)
+-		__asm__ __volatile__ ("hlt");
+-	}
+-	/*
+-	 * Stop all CPUs and turn off local APICs and the IO-APIC, so
+-	 * other OSs see a clean IRQ state.
+-	 */
+-	smp_send_stop();
+-	disable_IO_APIC();
+-#endif
++	stop_apics();
+ 
+ 	if(!reboot_thru_bios) {
+ 		/* rebooting needs to touch the page at absolute addr 0 */
+@@ -268,10 +232,12 @@
+ 
+ void machine_halt(void)
+ {
++	stop_apics();
+ }
+ 
+ void machine_power_off(void)
+ {
++	stop_apics();
+ 	if (pm_power_off)
+ 		pm_power_off();
+ }
+diff -Nru a/arch/i386/kernel/relocate_kernel.S b/arch/i386/kernel/relocate_kernel.S
+--- /dev/null	Wed Dec 31 16:00:00 1969
++++ b/arch/i386/kernel/relocate_kernel.S	Mon Jun 23 12:22:26 2003
+@@ -0,0 +1,107 @@
++#include <linux/config.h>
++#include <linux/linkage.h>
++
++	/* Must be relocatable PIC code callable as a C function, that once
++	 * it starts can not use the previous processes stack.
++	 *
++	 */
++	.globl relocate_new_kernel
++relocate_new_kernel:
++	/* read the arguments and say goodbye to the stack */
++	movl  4(%esp), %ebx /* indirection_page */
++	movl  8(%esp), %ebp /* reboot_code_buffer */
++	movl  12(%esp), %edx /* start address */
++
++	/* zero out flags, and disable interrupts */
++	pushl $0
++	popfl
++
++	/* set a new stack at the bottom of our page... */
++	lea   4096(%ebp), %esp
++
++	/* store the parameters back on the stack */
++	pushl   %edx /* store the start address */
++
++	/* Set cr0 to a known state:
++	 * 31 0 == Paging disabled
++	 * 18 0 == Alignment check disabled
++	 * 16 0 == Write protect disabled
++	 * 3  0 == No task switch
++	 * 2  0 == Don't do FP software emulation.
++	 * 0  1 == Proctected mode enabled
++	 */
++	movl	%cr0, %eax
++	andl	$~((1<<31)|(1<<18)|(1<<16)|(1<<3)|(1<<2)), %eax
++	orl	$(1<<0), %eax
++	movl	%eax, %cr0
++	
++	/* Set cr4 to a known state:
++	 * Setting everything to zero seems safe.
++	 */
++	movl	%cr4, %eax
++	andl	$0, %eax
++	movl	%eax, %cr4
++	
++	jmp 1f
++1:	
++
++	/* Flush the TLB (needed?) */
++	xorl	%eax, %eax
++	movl	%eax, %cr3
++
++	/* Do the copies */
++	cld
++0:	/* top, read another word for the indirection page */
++	movl    %ebx, %ecx
++	movl	(%ebx), %ecx
++	addl	$4, %ebx
++	testl	$0x1,   %ecx  /* is it a destination page */
++	jz	1f
++	movl	%ecx,	%edi
++	andl	$0xfffff000, %edi
++	jmp     0b
++1:
++	testl	$0x2,	%ecx  /* is it an indirection page */
++	jz	1f
++	movl	%ecx,	%ebx
++	andl	$0xfffff000, %ebx
++	jmp     0b
++1:
++	testl   $0x4,   %ecx /* is it the done indicator */
++	jz      1f
++	jmp     2f
++1:
++	testl   $0x8,   %ecx /* is it the source indicator */
++	jz      0b	     /* Ignore it otherwise */
++	movl    %ecx,   %esi /* For every source page do a copy */
++	andl    $0xfffff000, %esi
++
++	movl    $1024, %ecx
++	rep ; movsl
++	jmp     0b
++
++2:
++
++	/* To be certain of avoiding problems with self modifying code
++	 * I need to execute a serializing instruction here.
++	 * So I flush the TLB, it's handy, and not processor dependent.
++	 */
++	xorl	%eax, %eax
++	movl	%eax, %cr3
++	
++	/* set all of the registers to known values */
++	/* leave %esp alone */
++	
++	xorl	%eax, %eax
++	xorl	%ebx, %ebx
++	xorl    %ecx, %ecx
++	xorl    %edx, %edx
++	xorl    %esi, %esi
++	xorl    %edi, %edi
++	xorl    %ebp, %ebp
++	ret
++relocate_new_kernel_end:
++
++	.globl relocate_new_kernel_size
++relocate_new_kernel_size:	
++	.long relocate_new_kernel_end - relocate_new_kernel
+diff -Nru a/arch/i386/kernel/smp.c b/arch/i386/kernel/smp.c
+--- a/arch/i386/kernel/smp.c	Mon Jun 23 12:22:26 2003
++++ b/arch/i386/kernel/smp.c	Mon Jun 23 12:22:26 2003
+@@ -547,6 +547,30 @@
+ 
+ void smp_send_stop(void)
+ {
++ 	extern int reboot_cpu;
++	int reboot_cpu_id;
++
++ 	/* The boot cpu is always logical cpu 0 */
++	reboot_cpu_id = 0;
++
++	/* See if there has been give a command line override .
++	 */
++	if ((reboot_cpu != -1) && !(reboot_cpu >= NR_CPUS) && 
++		test_bit(reboot_cpu, &cpu_online_map)) {
++		reboot_cpu_id = reboot_cpu;
++	}
++	 
++	/* Make certain the the cpu I'm rebooting on is online */
++	if (!test_bit(reboot_cpu_id, &cpu_online_map)) {
++		reboot_cpu_id = smp_processor_id();
++	}
++
++	/* Make certain I only run on the appropriate processor */
++	set_cpus_allowed(current, 1 << reboot_cpu_id);
++
++	/* O.k. Now that I'm on the appropriate processor stop
++	 * all of the others.
++	 */
+ 	smp_call_function(stop_this_cpu, NULL, 1, 0);
+ 
+ 	local_irq_disable();
+diff -Nru a/fs/aio.c b/fs/aio.c
+--- a/fs/aio.c	Mon Jun 23 12:22:26 2003
++++ b/fs/aio.c	Mon Jun 23 12:22:26 2003
+@@ -536,7 +536,7 @@
+ 	return ioctx;
+ }
+ 
+-static void use_mm(struct mm_struct *mm)
++void use_mm(struct mm_struct *mm)
+ {
+ 	struct mm_struct *active_mm = current->active_mm;
+ 	atomic_inc(&mm->mm_count);
+diff -Nru a/include/asm-i386/apic.h b/include/asm-i386/apic.h
+--- a/include/asm-i386/apic.h	Mon Jun 23 12:22:26 2003
++++ b/include/asm-i386/apic.h	Mon Jun 23 12:22:26 2003
+@@ -97,6 +97,9 @@
+ #define NMI_LOCAL_APIC	2
+ #define NMI_INVALID	3
+ 
++extern void stop_apics(void);
++#else
++static inline void stop_apics(void) { }
+ #endif /* CONFIG_X86_LOCAL_APIC */
+ 
+ #endif /* __ASM_APIC_H */
+diff -Nru a/include/asm-i386/apicdef.h b/include/asm-i386/apicdef.h
+--- a/include/asm-i386/apicdef.h	Mon Jun 23 12:22:26 2003
++++ b/include/asm-i386/apicdef.h	Mon Jun 23 12:22:26 2003
+@@ -86,6 +86,7 @@
+ #define			APIC_LVT_REMOTE_IRR		(1<<14)
+ #define			APIC_INPUT_POLARITY		(1<<13)
+ #define			APIC_SEND_PENDING		(1<<12)
++#define			APIC_MODE_MASK			0x700
+ #define			GET_APIC_DELIVERY_MODE(x)	(((x)>>8)&0x7)
+ #define			SET_APIC_DELIVERY_MODE(x,y)	(((x)&~0x700)|((y)<<8))
+ #define				APIC_MODE_FIXED		0x0
+diff -Nru a/include/asm-i386/kexec.h b/include/asm-i386/kexec.h
+--- /dev/null	Wed Dec 31 16:00:00 1969
++++ b/include/asm-i386/kexec.h	Mon Jun 23 12:22:26 2003
+@@ -0,0 +1,23 @@
++#ifndef _I386_KEXEC_H
++#define _I386_KEXEC_H
++
++#include <asm/fixmap.h>
++
++/*
++ * KEXEC_SOURCE_MEMORY_LIMIT maximum page get_free_page can return.
++ * I.e. Maximum page that is mapped directly into kernel memory,
++ * and kmap is not required.
++ *
++ * Someone correct me if FIXADDR_START - PAGEOFFSET is not the correct
++ * calculation for the amount of memory directly mappable into the
++ * kernel memory space.
++ */
++
++/* Maximum physical address we can use pages from */
++#define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
++/* Maximum address we can reach in physical address mode */
++#define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
++
++#define KEXEC_REBOOT_CODE_SIZE	4096
++
++#endif /* _I386_KEXEC_H */
+diff -Nru a/include/asm-i386/unistd.h b/include/asm-i386/unistd.h
+--- a/include/asm-i386/unistd.h	Mon Jun 23 12:22:26 2003
++++ b/include/asm-i386/unistd.h	Mon Jun 23 12:22:26 2003
+@@ -275,8 +275,9 @@
+ #define __NR_clock_nanosleep	(__NR_timer_create+8)
+ #define __NR_statfs64		268
+ #define __NR_fstatfs64		269
++#define __NR_sys_kexec_load	270
+ 
+-#define NR_syscalls 270
++#define NR_syscalls 271
+ 
+ /* user-visible error numbers are in the range -1 - -124: see <asm-i386/errno.h> */
+ 
+diff -Nru a/include/linux/kexec.h b/include/linux/kexec.h
+--- /dev/null	Wed Dec 31 16:00:00 1969
++++ b/include/linux/kexec.h	Mon Jun 23 12:22:26 2003
+@@ -0,0 +1,54 @@
++#ifndef LINUX_KEXEC_H
++#define LINUX_KEXEC_H
++
++#if CONFIG_KEXEC
++#include <linux/types.h>
++#include <linux/list.h>
++#include <asm/kexec.h>
++
++/* 
++ * This structure is used to hold the arguments that are used when loading
++ * kernel binaries.
++ */
++
++typedef unsigned long kimage_entry_t;
++#define IND_DESTINATION  0x1
++#define IND_INDIRECTION  0x2
++#define IND_DONE         0x4
++#define IND_SOURCE       0x8
++
++#define KEXEC_SEGMENT_MAX 8
++struct kexec_segment {
++	void *buf;
++	size_t bufsz;
++	void *mem;
++	size_t memsz;
++};
++
++struct kimage {
++	kimage_entry_t head;
++	kimage_entry_t *entry;
++	kimage_entry_t *last_entry;
++
++	unsigned long destination;
++	unsigned long offset;
++
++	unsigned long start;
++	struct page *reboot_code_pages;
++
++	unsigned long nr_segments;
++	struct kexec_segment segment[KEXEC_SEGMENT_MAX+1];
++
++	struct list_head dest_pages;
++	struct list_head unuseable_pages;
++};
++
++
++/* kexec interface functions */
++extern void machine_kexec(struct kimage *image);
++extern asmlinkage long sys_kexec(unsigned long entry, long nr_segments, 
++	struct kexec_segment *segments);
++extern struct kimage *kexec_image;
++#endif
++#endif /* LINUX_KEXEC_H */
++
+diff -Nru a/include/linux/reboot.h b/include/linux/reboot.h
+--- a/include/linux/reboot.h	Mon Jun 23 12:22:26 2003
++++ b/include/linux/reboot.h	Mon Jun 23 12:22:26 2003
+@@ -22,6 +22,7 @@
+  * POWER_OFF   Stop OS and remove all power from system, if possible.
+  * RESTART2    Restart system using given command string.
+  * SW_SUSPEND  Suspend system using Software Suspend if compiled in
++ * KEXEC       Restart the system using a different kernel.
+  */
+ 
+ #define	LINUX_REBOOT_CMD_RESTART	0x01234567
+@@ -31,6 +32,7 @@
+ #define	LINUX_REBOOT_CMD_POWER_OFF	0x4321FEDC
+ #define	LINUX_REBOOT_CMD_RESTART2	0xA1B2C3D4
+ #define	LINUX_REBOOT_CMD_SW_SUSPEND	0xD000FCE2
++#define LINUX_REBOOT_CMD_KEXEC		0x45584543
+ 
+ 
+ #ifdef __KERNEL__
+diff -Nru a/kernel/Makefile b/kernel/Makefile
+--- a/kernel/Makefile	Mon Jun 23 12:22:26 2003
++++ b/kernel/Makefile	Mon Jun 23 12:22:26 2003
+@@ -18,6 +18,7 @@
+ obj-$(CONFIG_CPU_FREQ) += cpufreq.o
+ obj-$(CONFIG_BSD_PROCESS_ACCT) += acct.o
+ obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend.o
++obj-$(CONFIG_KEXEC) += kexec.o
+ obj-$(CONFIG_COMPAT) += compat.o
+ 
+ ifneq ($(CONFIG_IA64),y)
+diff -Nru a/kernel/kexec.c b/kernel/kexec.c
+--- /dev/null	Wed Dec 31 16:00:00 1969
++++ b/kernel/kexec.c	Mon Jun 23 12:22:26 2003
+@@ -0,0 +1,629 @@
++#include <linux/mm.h>
++#include <linux/file.h>
++#include <linux/slab.h>
++#include <linux/fs.h>
++#include <linux/version.h>
++#include <linux/compile.h>
++#include <linux/kexec.h>
++#include <linux/spinlock.h>
++#include <linux/list.h>
++#include <linux/highmem.h>
++#include <net/checksum.h>
++#include <asm/page.h>
++#include <asm/uaccess.h>
++#include <asm/io.h>
++#include <asm/system.h>
++
++/* When kexec transitions to the new kernel there is a one to one
++ * mapping between physical and virtual addresses.  On processors
++ * where you can disable the MMU this is trivial, and easy.  For
++ * others it is still a simple predictable page table to setup.
++ *
++ * In that environment kexec copies the new kernel to it's final
++ * resting place.  This means I can only support memory whose
++ * physical address can fit in an unsigned long.  In particular
++ * addresses where (pfn << PAGE_SHIFT) > ULONG_MAX cannot be handled.
++ * If the assembly stub has more restrictive requirements
++ * KEXEC_SOURCE_MEMORY_LIMIT and KEXEC_DEST_MEMORY_LIMIT can be
++ * defined more restrictively in <asm/kexec.h>.
++ *
++ * The code for the transition from the current kernel to the 
++ * the new kernel is placed in the reboot_code_buffer, whose size
++ * is given by KEXEC_REBOOT_CODE_SIZE.  In the best case only a single
++ * page of memory is necessary, but some architectures require more.
++ * Because this memory must be identity mapped in the transition from
++ * virtual to physical addresses it must live in the range
++ * 0 - TASK_SIZE, as only the user space mappings are arbitrarily
++ * modifyable.
++ *
++ * The assembly stub in the reboot code buffer is passed a linked list
++ * of descriptor pages detailing the source pages of the new kernel,
++ * and the destination addresses of those source pages.  As this data
++ * structure is not used in the context of the current OS, it must
++ * be self contained.
++ *
++ * The code has been made to work with highmem pages and will use a
++ * destination page in it's final resting place (if it happens 
++ * to allocate it).  The end product of this is that most of the
++ * physical address space, and most of ram can be used.
++ *
++ * Future directions include:
++ *  - allocating a page table with the reboot code buffer identity
++ *    mapped, to simplify machine_kexec and make kexec_on_panic, more
++ *    reliable.  
++ *  - allocating the pages for a page table for machines that cannot
++ *    disable their MMUs.  (Hammer, Alpha...)
++ */
++
++/* KIMAGE_NO_DEST is an impossible destination address..., for
++ * allocating pages whose destination address we do not care about.
++ */
++#define KIMAGE_NO_DEST (-1UL)
++
++static int kimage_is_destination_range(
++	struct kimage *image, unsigned long start, unsigned long end);
++static struct page *kimage_alloc_reboot_code_pages(struct kimage *image);
++static struct page *kimage_alloc_page(struct kimage *image, unsigned int gfp_mask, unsigned long dest);
++
++
++static int kimage_alloc(struct kimage **rimage, 
++	unsigned long nr_segments, struct kexec_segment *segments)
++{
++	int result;
++	struct kimage *image;
++	size_t segment_bytes;
++	struct page *reboot_pages;
++	unsigned long i;
++
++	/* Allocate a controlling structure */
++	result = -ENOMEM;
++	image = kmalloc(sizeof(*image), GFP_KERNEL);
++	if (!image) {
++		goto out;
++	}
++	memset(image, 0, sizeof(*image));
++	image->head = 0;
++	image->entry = &image->head;
++	image->last_entry = &image->head;
++
++	/* Initialize the list of destination pages */
++	INIT_LIST_HEAD(&image->dest_pages);
++
++	/* Initialize the list of unuseable pages */
++	INIT_LIST_HEAD(&image->unuseable_pages);
++
++	/* Read in the segments */
++	image->nr_segments = nr_segments;
++	segment_bytes = nr_segments * sizeof*segments;
++	result = copy_from_user(image->segment, segments, segment_bytes);
++	if (result) 
++		goto out;
++
++	/* Verify we have good destination addresses.  The caller is
++	 * responsible for making certain we don't attempt to load
++	 * the new image into invalid or reserved areas of RAM.  This
++	 * just verifies it is an address we can use. 
++	 */
++	result = -EADDRNOTAVAIL;
++	for(i = 0; i < nr_segments; i++) {
++		unsigned long mend;
++		mend = ((unsigned long)(image->segment[i].mem)) + 
++			image->segment[i].memsz;
++		if (mend >= KEXEC_DESTINATION_MEMORY_LIMIT)
++			goto out;
++	}
++
++	/* Find a location for the reboot code buffer, and add it
++	 * the vector of segments so that it's pages will also be
++	 * counted as destination pages.  
++	 */
++	result = -ENOMEM;
++	reboot_pages = kimage_alloc_reboot_code_pages(image);
++	if (!reboot_pages) {
++		printk(KERN_ERR "Could not allocate reboot_code_buffer\n");
++		goto out;
++	}
++	image->reboot_code_pages = reboot_pages;
++	image->segment[nr_segments].buf = 0;
++	image->segment[nr_segments].bufsz = 0;
++	image->segment[nr_segments].mem = (void *)(page_to_pfn(reboot_pages) << PAGE_SHIFT);
++	image->segment[nr_segments].memsz = KEXEC_REBOOT_CODE_SIZE;
++	image->nr_segments++;
++
++	result = 0;
++ out:
++	if (result == 0) {
++		*rimage = image;
++	} else {
++		kfree(image);
++	}
++	return result;
++}
++
++static int kimage_is_destination_range(
++	struct kimage *image, unsigned long start, unsigned long end)
++{
++	unsigned long i;
++	for(i = 0; i < image->nr_segments; i++) {
++		unsigned long mstart, mend;
++		mstart = (unsigned long)image->segment[i].mem;
++		mend   = mstart + image->segment[i].memsz;
++		if ((end > mstart) && (start < mend)) {
++			return 1;
++		}
++	}
++	return 0;
++}
++
++#ifdef CONFIG_MMU
++static int identity_map_pages(struct page *pages, int order)
++{
++	struct mm_struct *mm;
++	struct vm_area_struct *vma;
++	int error;
++	mm = &init_mm;
++	vma = 0;
++
++	down_write(&mm->mmap_sem);
++	error = -ENOMEM;
++	vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
++	if (!vma) {
++		goto out;
++	}
++
++	memset(vma, 0, sizeof(vma));
++	vma->vm_mm = mm;
++	vma->vm_start = page_to_pfn(pages) << PAGE_SHIFT;
++	vma->vm_end = vma->vm_start + (1 << (order + PAGE_SHIFT));
++	vma->vm_ops = 0;
++	vma->vm_flags = VM_SHARED \
++		| VM_READ | VM_WRITE | VM_EXEC \
++		| VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC \
++		| VM_DONTCOPY | VM_RESERVED;
++	vma->vm_page_prot = protection_map[vma->vm_flags & 0xf];
++	vma->vm_file = NULL;
++	vma->vm_private_data = NULL;
++	INIT_LIST_HEAD(&vma->shared);
++	insert_vm_struct(mm, vma);
++	
++	error = remap_page_range(vma, vma->vm_start, vma->vm_start,
++		vma->vm_end - vma->vm_start, vma->vm_page_prot);
++	if (error) {
++		goto out;
++	}
++
++	error = 0;
++ out:
++	if (error && vma) {
++		kmem_cache_free(vm_area_cachep, vma);
++		vma = 0;
++	}
++	up_write(&mm->mmap_sem);
++
++	return error;
++}
++#else
++#define identity_map_pages(pages, order) 0
++#endif
++
++struct page *kimage_alloc_reboot_code_pages(struct kimage *image)
++{
++	/* The reboot code buffer is special.  It is the only set of
++	 * pages that must be allocated in their final resting place,
++	 * and the only set of pages whose final resting place we can
++	 * pick. 
++	 *
++	 * At worst this runs in O(N) of the image size.
++	 */
++	struct list_head extra_pages, *pos, *next;
++	struct page *pages;
++	unsigned long addr;
++	int order, count;
++	order = get_order(KEXEC_REBOOT_CODE_SIZE);
++	count = 1 << order;
++	INIT_LIST_HEAD(&extra_pages);
++	do {
++		int i;
++		pages = alloc_pages(GFP_HIGHUSER, order);
++		if (!pages)
++			break;
++		for(i = 0; i < count; i++) {
++			SetPageReserved(pages +i);
++		}
++		addr = page_to_pfn(pages) << PAGE_SHIFT;
++		if ((page_to_pfn(pages) >= (TASK_SIZE >> PAGE_SHIFT)) ||
++			kimage_is_destination_range(image, addr, addr + KEXEC_REBOOT_CODE_SIZE)) {
++			list_add(&pages->list, &extra_pages);
++			pages = 0;
++		}
++	} while(!pages);
++	if (pages) {
++		int result;
++		result = identity_map_pages(pages, order);
++		if (result < 0) {
++			list_add(&pages->list, &extra_pages);
++			pages = 0;
++		}
++	}
++	/* If I could convert a multi page allocation into a buch of
++	 * single page allocations I could add these pages to
++	 * image->dest_pages.  For now it is simpler to just free the
++	 * pages again.
++	 */
++	list_for_each_safe(pos, next, &extra_pages) {
++		struct page *page;
++		int i;
++		page = list_entry(pos, struct page, list);
++		for(i = 0; i < count; i++) {
++			ClearPageReserved(pages +i);
++		}
++		list_del(&extra_pages);
++		__free_pages(page, order);
++	}
++	return pages;
++}
++
++static int kimage_add_entry(struct kimage *image, kimage_entry_t entry)
++{
++	if (image->offset != 0) {
++		image->entry++;
++	}
++	if (image->entry == image->last_entry) {
++		kimage_entry_t *ind_page;
++		struct page *page;
++		page = kimage_alloc_page(image, GFP_KERNEL, KIMAGE_NO_DEST);
++		if (!page) {
++			return -ENOMEM;
++		}
++		ind_page = page_address(page);
++		*image->entry = virt_to_phys(ind_page) | IND_INDIRECTION;
++		image->entry = ind_page;
++		image->last_entry = 
++			ind_page + ((PAGE_SIZE/sizeof(kimage_entry_t)) - 1);
++	}
++	*image->entry = entry;
++	image->entry++;
++	image->offset = 0;
++	return 0;
++}
++
++static int kimage_set_destination(
++	struct kimage *image, unsigned long destination) 
++{
++	int result;
++	destination &= PAGE_MASK;
++	result = kimage_add_entry(image, destination | IND_DESTINATION);
++	if (result == 0) {
++		image->destination = destination;
++	}
++	return result;
++}
++
++
++static int kimage_add_page(struct kimage *image, unsigned long page)
++{
++	int result;
++	page &= PAGE_MASK;
++	result = kimage_add_entry(image, page | IND_SOURCE);
++	if (result == 0) {
++		image->destination += PAGE_SIZE;
++	}
++	return result;
++}
++
++
++static void kimage_free_extra_pages(struct kimage *image)
++{
++	/* Walk through and free any extra destination pages I may have */
++	struct list_head *pos, *next;
++	list_for_each_safe(pos, next, &image->dest_pages) {
++		struct page *page;
++		page = list_entry(pos, struct page, list);
++		list_del(&page->list);
++		ClearPageReserved(page);
++		__free_page(page);
++	}
++	/* Walk through and free any unuseable pages I have cached */
++	list_for_each_safe(pos, next, &image->unuseable_pages) {
++		struct page *page;
++		page = list_entry(pos, struct page, list);
++		list_del(&page->list);
++		ClearPageReserved(page);
++		__free_page(page);
++	}
++
++}
++static int kimage_terminate(struct kimage *image)
++{
++	int result;
++	result = kimage_add_entry(image, IND_DONE);
++	if (result == 0) {
++		/* Point at the terminating element */
++		image->entry--;
++		kimage_free_extra_pages(image);
++	}
++	return result;
++}
++
++#define for_each_kimage_entry(image, ptr, entry) \
++	for (ptr = &image->head; (entry = *ptr) && !(entry & IND_DONE); \
++		ptr = (entry & IND_INDIRECTION)? \
++			phys_to_virt((entry & PAGE_MASK)): ptr +1)
++
++static void kimage_free(struct kimage *image)
++{
++	kimage_entry_t *ptr, entry;
++	kimage_entry_t ind = 0;
++	int i, count, order;
++	if (!image)
++		return;
++	kimage_free_extra_pages(image);
++	for_each_kimage_entry(image, ptr, entry) {
++		if (entry & IND_INDIRECTION) {
++			/* Free the previous indirection page */
++			if (ind & IND_INDIRECTION) {
++				free_page((unsigned long)phys_to_virt(ind & PAGE_MASK));
++			}
++			/* Save this indirection page until we are
++			 * done with it.
++			 */
++			ind = entry;
++		}
++		else if (entry & IND_SOURCE) {
++			free_page((unsigned long)phys_to_virt(entry & PAGE_MASK));
++		}
++	}
++	order = get_order(KEXEC_REBOOT_CODE_SIZE);
++	count = 1 << order;
++	do_munmap(&init_mm, 
++		page_to_pfn(image->reboot_code_pages) << PAGE_SHIFT, 
++		count << PAGE_SHIFT);
++	for(i = 0; i < count; i++) {
++		ClearPageReserved(image->reboot_code_pages + i);
++	}
++	__free_pages(image->reboot_code_pages, order);
++	kfree(image);
++}
++
++static kimage_entry_t *kimage_dst_used(struct kimage *image, unsigned long page)
++{
++	kimage_entry_t *ptr, entry;
++	unsigned long destination = 0;
++	for_each_kimage_entry(image, ptr, entry) {
++		if (entry & IND_DESTINATION) {
++			destination = entry & PAGE_MASK;
++		}
++		else if (entry & IND_SOURCE) {
++			if (page == destination) {
++				return ptr;
++			}
++			destination += PAGE_SIZE;
++		}
++	}
++	return 0;
++}
++
++static struct page *kimage_alloc_page(struct kimage *image, unsigned int gfp_mask, unsigned long destination)
++{
++	/* Here we implment safe guards to ensure that a source page
++	 * is not copied to it's destination page before the data on
++	 * the destination page is no longer useful.
++	 *
++	 * To do this we maintain the invariant that a source page is
++	 * either it's own destination page, or it is not a
++	 * destination page at all.  
++	 *
++	 * That is slightly stronger than required, but the proof
++	 * that no problems will not occur is trivial, and the
++	 * implemenation is simply to verify.
++	 *
++	 * When allocating all pages normally this algorithm will run
++	 * in O(N) time, but in the worst case it will run in O(N^2)
++	 * time.   If the runtime is a problem the data structures can
++	 * be fixed.
++	 */
++	struct page *page;
++	unsigned long addr;
++
++	/* Walk through the list of destination pages, and see if I
++	 * have a match.
++	 */
++	list_for_each_entry(page, &image->dest_pages, list) {
++		addr = page_to_pfn(page) << PAGE_SHIFT;
++		if (addr == destination) {
++			list_del(&page->list);
++			return page;
++		}
++	}
++	page = 0;
++	while(1) {
++		kimage_entry_t *old;
++		/* Allocate a page, if we run out of memory give up */
++		page = alloc_page(gfp_mask);
++		if (!page) {
++			return 0;
++		}
++		SetPageReserved(page);
++		/* If the page cannot be used file it away */
++		if (page_to_pfn(page) > (KEXEC_SOURCE_MEMORY_LIMIT >> PAGE_SHIFT)) {
++			list_add(&page->list, &image->unuseable_pages);
++			continue;
++		}
++		addr = page_to_pfn(page) << PAGE_SHIFT;
++
++		/* If it is the destination page we want use it */
++		if (addr == destination)
++			break;
++
++		/* If the page is not a destination page use it */
++		if (!kimage_is_destination_range(image, addr, addr + PAGE_SIZE))
++			break;
++
++		/* I know that the page is someones destination page.
++		 * See if there is already a source page for this
++		 * destination page.  And if so swap the source pages.
++		 */
++		old = kimage_dst_used(image, addr);
++		if (old) {
++			/* If so move it */
++			unsigned long old_addr;
++			struct page *old_page;
++			
++			old_addr = *old & PAGE_MASK;
++			old_page = pfn_to_page(old_addr >> PAGE_SHIFT);
++			copy_highpage(page, old_page);
++			*old = addr | (*old & ~PAGE_MASK);
++
++			/* The old page I have found cannot be a
++			 * destination page, so return it.
++			 */
++			addr = old_addr;
++			page = old_page;
++			break;
++		}
++		else {
++			/* Place the page on the destination list I
++			 * will use it later.
++			 */
++			list_add(&page->list, &image->dest_pages);
++		}
++	}
++	return page;
++}
++
++static int kimage_load_segment(struct kimage *image,
++	struct kexec_segment *segment)
++{	
++	unsigned long mstart;
++	int result;
++	unsigned long offset;
++	unsigned long offset_end;
++	unsigned char *buf;
++
++	result = 0;
++	buf = segment->buf;
++	mstart = (unsigned long)segment->mem;
++
++	offset_end = segment->memsz;
++
++	result = kimage_set_destination(image, mstart);
++	if (result < 0) {
++		goto out;
++	}
++	for(offset = 0;  offset < segment->memsz; offset += PAGE_SIZE) {
++		struct page *page;
++		char *ptr;
++		size_t size, leader;
++		page = kimage_alloc_page(image, GFP_HIGHUSER, mstart + offset);
++		if (page == 0) {
++			result  = -ENOMEM;
++			goto out;
++		}
++		result = kimage_add_page(image, page_to_pfn(page) << PAGE_SHIFT);
++		if (result < 0) {
++			goto out;
++		}
++		ptr = kmap(page);
++		if (segment->bufsz < offset) {
++			/* We are past the end zero the whole page */
++			memset(ptr, 0, PAGE_SIZE);
++			kunmap(page);
++			continue;
++		}
++		size = PAGE_SIZE;
++		leader = 0;
++		if ((offset == 0)) {
++			leader = mstart & ~PAGE_MASK;
++		}
++		if (leader) {
++			/* We are on the first page zero the unused portion */
++			memset(ptr, 0, leader);
++			size -= leader;
++			ptr += leader;
++		}
++		if (size > (segment->bufsz - offset)) {
++			size = segment->bufsz - offset;
++		}
++		if (size < (PAGE_SIZE - leader)) {
++			/* zero the trailing part of the page */
++			memset(ptr + size, 0, (PAGE_SIZE - leader) - size);
++		}
++		result = copy_from_user(ptr, buf + offset, size);
++		kunmap(page);
++		if (result) {
++			result = (result < 0)?result : -EIO;
++			goto out;
++		}
++	}
++ out:
++	return result;
++}
++
++/*
++ * Exec Kernel system call: for obvious reasons only root may call it.
++ * 
++ * This call breaks up into three pieces.  
++ * - A generic part which loads the new kernel from the current
++ *   address space, and very carefully places the data in the
++ *   allocated pages.
++ *
++ * - A generic part that interacts with the kernel and tells all of
++ *   the devices to shut down.  Preventing on-going dmas, and placing
++ *   the devices in a consistent state so a later kernel can
++ *   reinitialize them.
++ *
++ * - A machine specific part that includes the syscall number
++ *   and the copies the image to it's final destination.  And
++ *   jumps into the image at entry.
++ *
++ * kexec does not sync, or unmount filesystems so if you need
++ * that to happen you need to do that yourself.
++ */
++struct kimage *kexec_image = 0;
++
++asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, 
++	struct kexec_segment *segments, unsigned long flags)
++{
++	struct kimage *image;
++	int result;
++		
++	/* We only trust the superuser with rebooting the system. */
++	if (!capable(CAP_SYS_ADMIN))
++		return -EPERM;
++
++	/* In case we need just a little bit of special behavior for
++	 * reboot on panic 
++	 */
++	if (flags != 0)
++		return -EINVAL;
++
++	if (nr_segments > KEXEC_SEGMENT_MAX)
++		return -EINVAL;
++	image = 0;
++
++	result = 0;
++	if (nr_segments > 0) {
++		unsigned long i;
++		result = kimage_alloc(&image, nr_segments, segments);
++		if (result) {
++			goto out;
++		}
++		image->start = entry;
++		for(i = 0; i < nr_segments; i++) {
++			result = kimage_load_segment(image, &segments[i]);
++			if (result) {
++				goto out;
++			}
++		}
++		result = kimage_terminate(image);
++		if (result) {
++			goto out;
++		}
++	}
++
++	image = xchg(&kexec_image, image);
++
++ out:
++	kimage_free(image);
++	return result;
++}
+diff -Nru a/kernel/sys.c b/kernel/sys.c
+--- a/kernel/sys.c	Mon Jun 23 12:22:26 2003
++++ b/kernel/sys.c	Mon Jun 23 12:22:26 2003
+@@ -16,6 +16,7 @@
+ #include <linux/init.h>
+ #include <linux/highuid.h>
+ #include <linux/fs.h>
++#include <linux/kexec.h>
+ #include <linux/workqueue.h>
+ #include <linux/device.h>
+ #include <linux/times.h>
+@@ -207,6 +208,7 @@
+ cond_syscall(sys_lookup_dcookie)
+ cond_syscall(sys_swapon)
+ cond_syscall(sys_swapoff)
++cond_syscall(sys_kexec_load)
+ cond_syscall(sys_init_module)
+ cond_syscall(sys_delete_module)
+ cond_syscall(sys_socketpair)
+@@ -450,6 +452,27 @@
+ 		machine_restart(buffer);
+ 		break;
+ 
++#ifdef CONFIG_KEXEC
++	case LINUX_REBOOT_CMD_KEXEC:
++	{
++		struct kimage *image;
++		if (arg) {
++			unlock_kernel();
++			return -EINVAL;
++		}
++		image = xchg(&kexec_image, 0);
++		if (!image) {
++			unlock_kernel();
++			return -EINVAL;
++		}
++		notifier_call_chain(&reboot_notifier_list, SYS_RESTART, NULL);
++		system_running = 0;
++		device_shutdown();
++		printk(KERN_EMERG "Starting new kernel\n");
++		machine_kexec(image);
++		break;
++	}
++#endif
+ #ifdef CONFIG_SOFTWARE_SUSPEND
+ 	case LINUX_REBOOT_CMD_SW_SUSPEND:
+ 		if (!software_suspend_enabled) {
diff --git a/lustre/kernel_patches/patches/kexec-2.6.0-full.patch b/lustre/kernel_patches/patches/kexec-2.6.0-full.patch
new file mode 100644
index 0000000000..7e2ee63c29
--- /dev/null
+++ b/lustre/kernel_patches/patches/kexec-2.6.0-full.patch
@@ -0,0 +1,1428 @@
+ MAINTAINERS                        |   11 
+ arch/i386/Kconfig                  |   17 +
+ arch/i386/defconfig                |    1 
+ arch/i386/kernel/Makefile          |    1 
+ arch/i386/kernel/apic.c            |   54 +++
+ arch/i386/kernel/dmi_scan.c        |   27 -
+ arch/i386/kernel/entry.S           |    1 
+ arch/i386/kernel/i8259.c           |   12 
+ arch/i386/kernel/io_apic.c         |    2 
+ arch/i386/kernel/machine_kexec.c   |  116 ++++++
+ arch/i386/kernel/reboot.c          |   44 --
+ arch/i386/kernel/relocate_kernel.S |  107 ++++++
+ arch/i386/kernel/smp.c             |   24 +
+ include/asm-i386/apic.h            |    3 
+ include/asm-i386/apicdef.h         |    1 
+ include/asm-i386/kexec.h           |   23 +
+ include/asm-i386/unistd.h          |    5 
+ include/linux/kexec.h              |   54 +++
+ include/linux/reboot.h             |    2 
+ kernel/Makefile                    |    1 
+ kernel/kexec.c                     |  629 +++++++++++++++++++++++++++++++++++++
+ kernel/sys.c                       |   23 +
+ 22 files changed, 1089 insertions(+), 69 deletions(-)
+
+--- linux-2.6.0-test1/MAINTAINERS~kexec-2.6.0-full	2003-07-22 00:46:07.000000000 -0600
++++ linux-2.6.0-test1-braam/MAINTAINERS	2003-07-22 00:54:04.000000000 -0600
+@@ -1095,6 +1095,17 @@ W:	http://nfs.sourceforge.net/
+ W:	http://www.cse.unsw.edu.au/~neilb/patches/linux-devel/
+ S:	Maintained
+ 
++KEXEC
++P:	Eric Biederman
++M:	ebiederm@xmission.com
++M:	ebiederman@lnxi.com
++W:	http://www.xmission.com/~ebiederm/files/kexec/
++P:	Andy Pfiffer
++M:	andyp@osdl.org
++W:	http://www.osdl.org/archive/andyp/bloom/Code/Linux/Kexec/
++L:	linux-kernel@vger.kernel.org
++S:	Maintained
++
+ LANMEDIA WAN CARD DRIVER
+ P:	Andrew Stanley-Jones
+ M:	asj@lanmedia.com
+--- linux-2.6.0-test1/arch/i386/Kconfig~kexec-2.6.0-full	2003-07-22 00:52:14.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/Kconfig	2003-07-22 00:54:04.000000000 -0600
+@@ -804,6 +804,23 @@ config BOOT_IOREMAP
+ 	depends on ((X86_SUMMIT || X86_GENERICARCH) && NUMA)
+ 	default y
+ 
++config KEXEC
++	bool "kexec system call (EXPERIMENTAL)"
++	depends on EXPERIMENTAL
++	help
++	  kexec is a system call that implements the ability to  shutdown your
++	  current kernel, and to start another kernel.  It is like a reboot
++	  but it is indepedent of the system firmware.   And like a reboot
++	  you can start any kernel with it not just Linux.  
++	
++	  The name comes from the similiarity to the exec system call. 
++	
++	  It is on an going process to be certain the hardware in a machine
++	  is properly shutdown, so do not be surprised if this code does not
++	  initially work for you.  It may help to enable device hotplugging
++	  support.  As of this writing the exact hardware interface is
++	  strongly in flux, so no good recommendation can be made.
++
+ endmenu
+ 
+ 
+--- linux-2.6.0-test1/arch/i386/defconfig~kexec-2.6.0-full	2003-07-13 21:35:57.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/defconfig	2003-07-22 00:54:04.000000000 -0600
+@@ -72,6 +72,7 @@ CONFIG_SMP=y
+ CONFIG_X86_LOCAL_APIC=y
+ CONFIG_X86_IO_APIC=y
+ CONFIG_NR_CPUS=32
++CONFIG_KEXEC=y
+ CONFIG_X86_MCE=y
+ # CONFIG_X86_MCE_NONFATAL is not set
+ CONFIG_X86_MCE_P4THERMAL=y
+--- linux-2.6.0-test1/arch/i386/kernel/Makefile~kexec-2.6.0-full	2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/Makefile	2003-07-22 00:54:04.000000000 -0600
+@@ -25,6 +25,7 @@ obj-$(CONFIG_X86_TRAMPOLINE)	+= trampoli
+ obj-$(CONFIG_X86_MPPARSE)	+= mpparse.o
+ obj-$(CONFIG_X86_LOCAL_APIC)	+= apic.o nmi.o
+ obj-$(CONFIG_X86_IO_APIC)	+= io_apic.o
++obj-$(CONFIG_KEXEC)		+= machine_kexec.o relocate_kernel.o
+ obj-$(CONFIG_SOFTWARE_SUSPEND)	+= suspend.o suspend_asm.o
+ obj-$(CONFIG_X86_NUMAQ)		+= numaq.o
+ obj-$(CONFIG_X86_SUMMIT)	+= summit.o
+--- linux-2.6.0-test1/arch/i386/kernel/apic.c~kexec-2.6.0-full	2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/apic.c	2003-07-22 00:54:04.000000000 -0600
+@@ -26,6 +26,7 @@
+ #include <linux/mc146818rtc.h>
+ #include <linux/kernel_stat.h>
+ #include <linux/sysdev.h>
++#include <linux/reboot.h>
+ 
+ #include <asm/atomic.h>
+ #include <asm/smp.h>
+@@ -175,6 +176,39 @@ void disconnect_bsp_APIC(void)
+ 		outb(0x70, 0x22);
+ 		outb(0x00, 0x23);
+ 	}
++#ifdef 	CONFIG_KEXEC
++	else {
++		/* Go back to Virtual Wire compatibility mode */
++		unsigned long value;
++
++		/* For the spurious interrupt use vector F, and enable it */
++		value = apic_read(APIC_SPIV);
++		value &= ~APIC_VECTOR_MASK; 
++		value |= APIC_SPIV_APIC_ENABLED;
++		value |= 0xf;
++		apic_write_around(APIC_SPIV, value);
++
++		/* For LVT0 make it edge triggered, active high, external and enabled */
++		value = apic_read(APIC_LVT0);
++		value &= ~(APIC_MODE_MASK | APIC_SEND_PENDING | 
++			APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR | 
++			APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED );
++		value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
++		value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_EXINT);
++		apic_write_around(APIC_LVT0, value);
++		
++		/* For LVT1 make it edge triggered, active high, nmi and enabled */
++		value = apic_read(APIC_LVT1);
++		value &= ~(
++			APIC_MODE_MASK | APIC_SEND_PENDING | 
++			APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR | 
++			APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED);
++		value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
++		value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_NMI);
++		apic_write_around(APIC_LVT1, value);
++	}
++#endif	/* CONFIG_KEXEC */
++
+ }
+ 
+ void disable_local_APIC(void)
+@@ -1115,6 +1149,26 @@ asmlinkage void smp_error_interrupt(void
+ 	irq_exit();
+ }
+ 
++void stop_apics(void)
++{
++	/* By resetting the APIC's we disable the nmi watchdog */
++#if CONFIG_SMP
++	/*
++	 * Stop all CPUs and turn off local APICs and the IO-APIC, so
++	 * other OSs see a clean IRQ state.
++	 */
++	smp_send_stop();
++#else
++	disable_local_APIC();
++#endif
++#if defined(CONFIG_X86_IO_APIC)
++	if (smp_found_config) {
++		disable_IO_APIC();
++	}
++#endif
++	disconnect_bsp_APIC();
++}
++
+ /*
+  * This initializes the IO-APIC and APIC hardware if this is
+  * a UP kernel.
+--- linux-2.6.0-test1/arch/i386/kernel/dmi_scan.c~kexec-2.6.0-full	2003-07-13 21:32:44.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/dmi_scan.c	2003-07-22 00:54:04.000000000 -0600
+@@ -222,31 +222,6 @@ static __init int set_bios_reboot(struct
+ 	return 0;
+ }
+ 
+-/*
+- * Some machines require the "reboot=s"  commandline option, this quirk makes that automatic.
+- */
+-static __init int set_smp_reboot(struct dmi_blacklist *d)
+-{
+-#ifdef CONFIG_SMP
+-	extern int reboot_smp;
+-	if (reboot_smp == 0)
+-	{
+-		reboot_smp = 1;
+-		printk(KERN_INFO "%s series board detected. Selecting SMP-method for reboots.\n", d->ident);
+-	}
+-#endif
+-	return 0;
+-}
+-
+-/*
+- * Some machines require the "reboot=b,s"  commandline option, this quirk makes that automatic.
+- */
+-static __init int set_smp_bios_reboot(struct dmi_blacklist *d)
+-{
+-	set_smp_reboot(d);
+-	set_bios_reboot(d);
+-	return 0;
+-}
+ 
+ /*
+  * Some bioses have a broken protected mode poweroff and need to use realmode
+@@ -527,7 +502,7 @@ static __initdata struct dmi_blacklist d
+ 			MATCH(DMI_BIOS_VERSION, "4.60 PGMA"),
+ 			MATCH(DMI_BIOS_DATE, "134526184"), NO_MATCH
+ 			} },
+-	{ set_smp_bios_reboot, "Dell PowerEdge 1300", {	/* Handle problems with rebooting on Dell 1300's */
++	{ set_bios_reboot, "Dell PowerEdge 1300", {	/* Handle problems with rebooting on Dell 1300's */
+ 			MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
+ 			MATCH(DMI_PRODUCT_NAME, "PowerEdge 1300/"),
+ 			NO_MATCH, NO_MATCH
+--- linux-2.6.0-test1/arch/i386/kernel/entry.S~kexec-2.6.0-full	2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/entry.S	2003-07-22 00:54:27.000000000 -0600
+@@ -905,5 +905,6 @@ ENTRY(sys_call_table)
+ 	.long sys_tgkill	/* 270 */
+ 	.long sys_utimes
+ 	.long sys_mknod64
++        .long sys_kexec_load
+ 
+ nr_syscalls=(.-sys_call_table)/4
+--- linux-2.6.0-test1/arch/i386/kernel/i8259.c~kexec-2.6.0-full	2003-07-13 21:38:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/i8259.c	2003-07-22 00:54:04.000000000 -0600
+@@ -244,9 +244,21 @@ static int i8259A_resume(struct sys_devi
+ 	return 0;
+ }
+ 
++static int i8259A_shutdown(struct sys_device *dev)
++{
++	/* Put the i8259A into a quiescent state that
++	 * the kernel initialization code can get it
++	 * out of.
++	 */
++	outb(0xff, 0x21);	/* mask all of 8259A-1 */
++	outb(0xff, 0xA1);	/* mask all of 8259A-1 */
++	return 0;
++}
++
+ static struct sysdev_class i8259_sysdev_class = {
+ 	set_kset_name("i8259"),
+ 	.resume = i8259A_resume,
++	.shutdown = i8259A_shutdown,
+ };
+ 
+ static struct sys_device device_i8259A = {
+--- linux-2.6.0-test1/arch/i386/kernel/io_apic.c~kexec-2.6.0-full	2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/io_apic.c	2003-07-22 00:54:04.000000000 -0600
+@@ -1601,8 +1601,6 @@ void disable_IO_APIC(void)
+ 	 * Clear the IO-APIC before rebooting:
+ 	 */
+ 	clear_IO_APIC();
+-
+-	disconnect_bsp_APIC();
+ }
+ 
+ /*
+--- /dev/null	2003-01-30 03:24:37.000000000 -0700
++++ linux-2.6.0-test1-braam/arch/i386/kernel/machine_kexec.c	2003-07-22 00:54:04.000000000 -0600
+@@ -0,0 +1,116 @@
++#include <linux/config.h>
++#include <linux/mm.h>
++#include <linux/kexec.h>
++#include <linux/delay.h>
++#include <asm/pgtable.h>
++#include <asm/pgalloc.h>
++#include <asm/tlbflush.h>
++#include <asm/mmu_context.h>
++#include <asm/io.h>
++#include <asm/apic.h>
++
++
++/*
++ * machine_kexec
++ * =======================
++ */
++
++
++static void set_idt(void *newidt, __u16 limit)
++{
++	unsigned char curidt[6];
++
++	/* ia32 supports unaliged loads & stores */
++	(*(__u16 *)(curidt)) = limit;
++	(*(__u32 *)(curidt +2)) = (unsigned long)(newidt);
++
++	__asm__ __volatile__ (
++		"lidt %0\n" 
++		: "=m" (curidt)
++		);
++};
++
++
++static void set_gdt(void *newgdt, __u16 limit)
++{
++	unsigned char curgdt[6];
++
++	/* ia32 supports unaliged loads & stores */
++	(*(__u16 *)(curgdt)) = limit;
++	(*(__u32 *)(curgdt +2)) = (unsigned long)(newgdt);
++
++	__asm__ __volatile__ (
++		"lgdt %0\n" 
++		: "=m" (curgdt)
++		);
++};
++
++static void load_segments(void)
++{
++#define __STR(X) #X
++#define STR(X) __STR(X)
++
++	__asm__ __volatile__ (
++		"\tljmp $"STR(__KERNEL_CS)",$1f\n"
++		"\t1:\n"
++		"\tmovl $"STR(__KERNEL_DS)",%eax\n"
++		"\tmovl %eax,%ds\n"
++		"\tmovl %eax,%es\n"
++		"\tmovl %eax,%fs\n"
++		"\tmovl %eax,%gs\n"
++		"\tmovl %eax,%ss\n"
++		);
++#undef STR
++#undef __STR
++}
++
++typedef void (*relocate_new_kernel_t)(
++	unsigned long indirection_page, unsigned long reboot_code_buffer,
++	unsigned long start_address);
++
++const extern unsigned char relocate_new_kernel[];
++extern void relocate_new_kernel_end(void);
++const extern unsigned int relocate_new_kernel_size;
++extern void use_mm(struct mm_struct *mm);
++
++void machine_kexec(struct kimage *image)
++{
++	unsigned long indirection_page;
++	unsigned long reboot_code_buffer;
++	relocate_new_kernel_t rnk;
++
++	/* switch to an mm where the reboot_code_buffer is identity mapped */
++	use_mm(&init_mm);
++	stop_apics();
++
++	/* Interrupts aren't acceptable while we reboot */
++	local_irq_disable();
++	reboot_code_buffer = page_to_pfn(image->reboot_code_pages) << PAGE_SHIFT;
++	indirection_page = image->head & PAGE_MASK;
++
++	/* copy it out */
++	memcpy((void *)reboot_code_buffer, relocate_new_kernel, relocate_new_kernel_size);
++
++	/* The segment registers are funny things, they are
++	 * automatically loaded from a table, in memory wherever you
++	 * set them to a specific selector, but this table is never
++	 * accessed again you set the segment to a different selector.
++	 *
++	 * The more common model is are caches where the behide
++	 * the scenes work is done, but is also dropped at arbitrary
++	 * times.
++	 *
++	 * I take advantage of this here by force loading the
++	 * segments, before I zap the gdt with an invalid value.
++	 */
++	load_segments();
++	/* The gdt & idt are now invalid.
++	 * If you want to load them you must set up your own idt & gdt.
++	 */
++	set_gdt(phys_to_virt(0),0);
++	set_idt(phys_to_virt(0),0);
++
++	/* now call it */
++	rnk = (relocate_new_kernel_t) reboot_code_buffer;
++	(*rnk)(indirection_page, reboot_code_buffer, image->start);
++}
+--- linux-2.6.0-test1/arch/i386/kernel/reboot.c~kexec-2.6.0-full	2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/reboot.c	2003-07-22 00:55:22.000000000 -0600
+@@ -8,6 +8,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/mc146818rtc.h>
+ #include <asm/uaccess.h>
++#include <asm/apic.h>
+ #include "mach_reboot.h"
+ 
+ /*
+@@ -20,8 +21,7 @@ static int reboot_mode;
+ int reboot_thru_bios;
+ 
+ #ifdef CONFIG_SMP
+-int reboot_smp = 0;
+-static int reboot_cpu = -1;
++int reboot_cpu = -1;	  /* specifies the internal linux cpu id, not the apicid */
+ /* shamelessly grabbed from lib/vsprintf.c for readability */
+ #define is_digit(c)	((c) >= '0' && (c) <= '9')
+ #endif
+@@ -43,7 +43,6 @@ static int __init reboot_setup(char *str
+ 			break;
+ #ifdef CONFIG_SMP
+ 		case 's': /* "smp" reboot by executing reset on BSP or other CPU*/
+-			reboot_smp = 1;
+ 			if (is_digit(*(str+1))) {
+ 				reboot_cpu = (int) (*(str+1) - '0');
+ 				if (is_digit(*(str+2))) 
+@@ -215,42 +214,7 @@ void machine_real_restart(unsigned char 
+ 
+ void machine_restart(char * __unused)
+ {
+-#ifdef CONFIG_SMP
+-	int cpuid;
+-	
+-	cpuid = GET_APIC_ID(apic_read(APIC_ID));
+-
+-	if (reboot_smp) {
+-
+-		/* check to see if reboot_cpu is valid 
+-		   if its not, default to the BSP */
+-		if ((reboot_cpu == -1) ||  
+-		      (reboot_cpu > (NR_CPUS -1))  || 
+-		      !cpu_isset(cpuid, phys_cpu_present_map))
+-			reboot_cpu = boot_cpu_physical_apicid;
+-
+-		reboot_smp = 0;  /* use this as a flag to only go through this once*/
+-		/* re-run this function on the other CPUs
+-		   it will fall though this section since we have 
+-		   cleared reboot_smp, and do the reboot if it is the
+-		   correct CPU, otherwise it halts. */
+-		if (reboot_cpu != cpuid)
+-			smp_call_function((void *)machine_restart , NULL, 1, 0);
+-	}
+-
+-	/* if reboot_cpu is still -1, then we want a tradional reboot, 
+-	   and if we are not running on the reboot_cpu,, halt */
+-	if ((reboot_cpu != -1) && (cpuid != reboot_cpu)) {
+-		for (;;)
+-		__asm__ __volatile__ ("hlt");
+-	}
+-	/*
+-	 * Stop all CPUs and turn off local APICs and the IO-APIC, so
+-	 * other OSs see a clean IRQ state.
+-	 */
+-	smp_send_stop();
+-	disable_IO_APIC();
+-#endif
++        stop_apics();
+ 
+ 	if(!reboot_thru_bios) {
+ 		/* rebooting needs to touch the page at absolute addr 0 */
+@@ -268,10 +232,12 @@ void machine_restart(char * __unused)
+ 
+ void machine_halt(void)
+ {
++	stop_apics();
+ }
+ 
+ void machine_power_off(void)
+ {
++	stop_apics();
+ 	if (pm_power_off)
+ 		pm_power_off();
+ }
+--- /dev/null	2003-01-30 03:24:37.000000000 -0700
++++ linux-2.6.0-test1-braam/arch/i386/kernel/relocate_kernel.S	2003-07-22 00:54:04.000000000 -0600
+@@ -0,0 +1,107 @@
++#include <linux/config.h>
++#include <linux/linkage.h>
++
++	/* Must be relocatable PIC code callable as a C function, that once
++	 * it starts can not use the previous processes stack.
++	 *
++	 */
++	.globl relocate_new_kernel
++relocate_new_kernel:
++	/* read the arguments and say goodbye to the stack */
++	movl  4(%esp), %ebx /* indirection_page */
++	movl  8(%esp), %ebp /* reboot_code_buffer */
++	movl  12(%esp), %edx /* start address */
++
++	/* zero out flags, and disable interrupts */
++	pushl $0
++	popfl
++
++	/* set a new stack at the bottom of our page... */
++	lea   4096(%ebp), %esp
++
++	/* store the parameters back on the stack */
++	pushl   %edx /* store the start address */
++
++	/* Set cr0 to a known state:
++	 * 31 0 == Paging disabled
++	 * 18 0 == Alignment check disabled
++	 * 16 0 == Write protect disabled
++	 * 3  0 == No task switch
++	 * 2  0 == Don't do FP software emulation.
++	 * 0  1 == Proctected mode enabled
++	 */
++	movl	%cr0, %eax
++	andl	$~((1<<31)|(1<<18)|(1<<16)|(1<<3)|(1<<2)), %eax
++	orl	$(1<<0), %eax
++	movl	%eax, %cr0
++	
++	/* Set cr4 to a known state:
++	 * Setting everything to zero seems safe.
++	 */
++	movl	%cr4, %eax
++	andl	$0, %eax
++	movl	%eax, %cr4
++	
++	jmp 1f
++1:	
++
++	/* Flush the TLB (needed?) */
++	xorl	%eax, %eax
++	movl	%eax, %cr3
++
++	/* Do the copies */
++	cld
++0:	/* top, read another word for the indirection page */
++	movl    %ebx, %ecx
++	movl	(%ebx), %ecx
++	addl	$4, %ebx
++	testl	$0x1,   %ecx  /* is it a destination page */
++	jz	1f
++	movl	%ecx,	%edi
++	andl	$0xfffff000, %edi
++	jmp     0b
++1:
++	testl	$0x2,	%ecx  /* is it an indirection page */
++	jz	1f
++	movl	%ecx,	%ebx
++	andl	$0xfffff000, %ebx
++	jmp     0b
++1:
++	testl   $0x4,   %ecx /* is it the done indicator */
++	jz      1f
++	jmp     2f
++1:
++	testl   $0x8,   %ecx /* is it the source indicator */
++	jz      0b	     /* Ignore it otherwise */
++	movl    %ecx,   %esi /* For every source page do a copy */
++	andl    $0xfffff000, %esi
++
++	movl    $1024, %ecx
++	rep ; movsl
++	jmp     0b
++
++2:
++
++	/* To be certain of avoiding problems with self modifying code
++	 * I need to execute a serializing instruction here.
++	 * So I flush the TLB, it's handy, and not processor dependent.
++	 */
++	xorl	%eax, %eax
++	movl	%eax, %cr3
++	
++	/* set all of the registers to known values */
++	/* leave %esp alone */
++	
++	xorl	%eax, %eax
++	xorl	%ebx, %ebx
++	xorl    %ecx, %ecx
++	xorl    %edx, %edx
++	xorl    %esi, %esi
++	xorl    %edi, %edi
++	xorl    %ebp, %ebp
++	ret
++relocate_new_kernel_end:
++
++	.globl relocate_new_kernel_size
++relocate_new_kernel_size:	
++	.long relocate_new_kernel_end - relocate_new_kernel
+--- linux-2.6.0-test1/arch/i386/kernel/smp.c~kexec-2.6.0-full	2003-07-22 00:52:14.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/smp.c	2003-07-22 00:54:04.000000000 -0600
+@@ -587,6 +587,30 @@ void stop_this_cpu (void * dummy)
+ 
+ void smp_send_stop(void)
+ {
++ 	extern int reboot_cpu;
++	int reboot_cpu_id;
++
++ 	/* The boot cpu is always logical cpu 0 */
++	reboot_cpu_id = 0;
++
++	/* See if there has been give a command line override .
++	 */
++	if ((reboot_cpu != -1) && !(reboot_cpu >= NR_CPUS) && 
++		test_bit(reboot_cpu, &cpu_online_map)) {
++		reboot_cpu_id = reboot_cpu;
++	}
++	 
++	/* Make certain the the cpu I'm rebooting on is online */
++	if (!test_bit(reboot_cpu_id, &cpu_online_map)) {
++		reboot_cpu_id = smp_processor_id();
++	}
++
++	/* Make certain I only run on the appropriate processor */
++	set_cpus_allowed(current, 1 << reboot_cpu_id);
++
++	/* O.k. Now that I'm on the appropriate processor stop
++	 * all of the others.
++	 */
+ 	smp_call_function(stop_this_cpu, NULL, 1, 0);
+ 
+ 	local_irq_disable();
+--- linux-2.6.0-test1/include/asm-i386/apic.h~kexec-2.6.0-full	2003-07-13 21:38:53.000000000 -0600
++++ linux-2.6.0-test1-braam/include/asm-i386/apic.h	2003-07-22 00:54:04.000000000 -0600
+@@ -97,6 +97,9 @@ extern unsigned int nmi_watchdog;
+ #define NMI_LOCAL_APIC	2
+ #define NMI_INVALID	3
+ 
++extern void stop_apics(void);
++#else
++static inline void stop_apics(void) { }
+ #endif /* CONFIG_X86_LOCAL_APIC */
+ 
+ #endif /* __ASM_APIC_H */
+--- linux-2.6.0-test1/include/asm-i386/apicdef.h~kexec-2.6.0-full	2003-07-13 21:34:40.000000000 -0600
++++ linux-2.6.0-test1-braam/include/asm-i386/apicdef.h	2003-07-22 00:54:04.000000000 -0600
+@@ -86,6 +86,7 @@
+ #define			APIC_LVT_REMOTE_IRR		(1<<14)
+ #define			APIC_INPUT_POLARITY		(1<<13)
+ #define			APIC_SEND_PENDING		(1<<12)
++#define			APIC_MODE_MASK			0x700
+ #define			GET_APIC_DELIVERY_MODE(x)	(((x)>>8)&0x7)
+ #define			SET_APIC_DELIVERY_MODE(x,y)	(((x)&~0x700)|((y)<<8))
+ #define				APIC_MODE_FIXED		0x0
+--- /dev/null	2003-01-30 03:24:37.000000000 -0700
++++ linux-2.6.0-test1-braam/include/asm-i386/kexec.h	2003-07-22 00:54:04.000000000 -0600
+@@ -0,0 +1,23 @@
++#ifndef _I386_KEXEC_H
++#define _I386_KEXEC_H
++
++#include <asm/fixmap.h>
++
++/*
++ * KEXEC_SOURCE_MEMORY_LIMIT maximum page get_free_page can return.
++ * I.e. Maximum page that is mapped directly into kernel memory,
++ * and kmap is not required.
++ *
++ * Someone correct me if FIXADDR_START - PAGEOFFSET is not the correct
++ * calculation for the amount of memory directly mappable into the
++ * kernel memory space.
++ */
++
++/* Maximum physical address we can use pages from */
++#define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
++/* Maximum address we can reach in physical address mode */
++#define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
++
++#define KEXEC_REBOOT_CODE_SIZE	4096
++
++#endif /* _I386_KEXEC_H */
+--- linux-2.6.0-test1/include/asm-i386/unistd.h~kexec-2.6.0-full	2003-07-22 00:46:07.000000000 -0600
++++ linux-2.6.0-test1-braam/include/asm-i386/unistd.h	2003-07-22 00:55:57.000000000 -0600
+@@ -278,8 +278,9 @@
+ #define __NR_tgkill		270
+ #define __NR_utimes		271
+ #define __NR_mknod64		272
+-
+-#define NR_syscalls 273
++#define __NR_sys_kexec_load	273
++  
++#define NR_syscalls 274
+ 
+ /* user-visible error numbers are in the range -1 - -124: see <asm-i386/errno.h> */
+ 
+--- /dev/null	2003-01-30 03:24:37.000000000 -0700
++++ linux-2.6.0-test1-braam/include/linux/kexec.h	2003-07-22 00:54:04.000000000 -0600
+@@ -0,0 +1,54 @@
++#ifndef LINUX_KEXEC_H
++#define LINUX_KEXEC_H
++
++#if CONFIG_KEXEC
++#include <linux/types.h>
++#include <linux/list.h>
++#include <asm/kexec.h>
++
++/* 
++ * This structure is used to hold the arguments that are used when loading
++ * kernel binaries.
++ */
++
++typedef unsigned long kimage_entry_t;
++#define IND_DESTINATION  0x1
++#define IND_INDIRECTION  0x2
++#define IND_DONE         0x4
++#define IND_SOURCE       0x8
++
++#define KEXEC_SEGMENT_MAX 8
++struct kexec_segment {
++	void *buf;
++	size_t bufsz;
++	void *mem;
++	size_t memsz;
++};
++
++struct kimage {
++	kimage_entry_t head;
++	kimage_entry_t *entry;
++	kimage_entry_t *last_entry;
++
++	unsigned long destination;
++	unsigned long offset;
++
++	unsigned long start;
++	struct page *reboot_code_pages;
++
++	unsigned long nr_segments;
++	struct kexec_segment segment[KEXEC_SEGMENT_MAX+1];
++
++	struct list_head dest_pages;
++	struct list_head unuseable_pages;
++};
++
++
++/* kexec interface functions */
++extern void machine_kexec(struct kimage *image);
++extern asmlinkage long sys_kexec(unsigned long entry, long nr_segments, 
++	struct kexec_segment *segments);
++extern struct kimage *kexec_image;
++#endif
++#endif /* LINUX_KEXEC_H */
++
+--- linux-2.6.0-test1/include/linux/reboot.h~kexec-2.6.0-full	2003-07-13 21:39:35.000000000 -0600
++++ linux-2.6.0-test1-braam/include/linux/reboot.h	2003-07-22 00:54:04.000000000 -0600
+@@ -22,6 +22,7 @@
+  * POWER_OFF   Stop OS and remove all power from system, if possible.
+  * RESTART2    Restart system using given command string.
+  * SW_SUSPEND  Suspend system using Software Suspend if compiled in
++ * KEXEC       Restart the system using a different kernel.
+  */
+ 
+ #define	LINUX_REBOOT_CMD_RESTART	0x01234567
+@@ -31,6 +32,7 @@
+ #define	LINUX_REBOOT_CMD_POWER_OFF	0x4321FEDC
+ #define	LINUX_REBOOT_CMD_RESTART2	0xA1B2C3D4
+ #define	LINUX_REBOOT_CMD_SW_SUSPEND	0xD000FCE2
++#define LINUX_REBOOT_CMD_KEXEC		0x45584543
+ 
+ 
+ #ifdef __KERNEL__
+--- linux-2.6.0-test1/kernel/Makefile~kexec-2.6.0-full	2003-07-22 00:46:07.000000000 -0600
++++ linux-2.6.0-test1-braam/kernel/Makefile	2003-07-22 00:54:04.000000000 -0600
+@@ -19,6 +19,7 @@ obj-$(CONFIG_PM) += pm.o
+ obj-$(CONFIG_CPU_FREQ) += cpufreq.o
+ obj-$(CONFIG_BSD_PROCESS_ACCT) += acct.o
+ obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend.o
++obj-$(CONFIG_KEXEC) += kexec.o
+ obj-$(CONFIG_COMPAT) += compat.o
+ 
+ ifneq ($(CONFIG_IA64),y)
+--- /dev/null	2003-01-30 03:24:37.000000000 -0700
++++ linux-2.6.0-test1-braam/kernel/kexec.c	2003-07-22 00:54:04.000000000 -0600
+@@ -0,0 +1,629 @@
++#include <linux/mm.h>
++#include <linux/file.h>
++#include <linux/slab.h>
++#include <linux/fs.h>
++#include <linux/version.h>
++#include <linux/compile.h>
++#include <linux/kexec.h>
++#include <linux/spinlock.h>
++#include <linux/list.h>
++#include <linux/highmem.h>
++#include <net/checksum.h>
++#include <asm/page.h>
++#include <asm/uaccess.h>
++#include <asm/io.h>
++#include <asm/system.h>
++
++/* When kexec transitions to the new kernel there is a one to one
++ * mapping between physical and virtual addresses.  On processors
++ * where you can disable the MMU this is trivial, and easy.  For
++ * others it is still a simple predictable page table to setup.
++ *
++ * In that environment kexec copies the new kernel to it's final
++ * resting place.  This means I can only support memory whose
++ * physical address can fit in an unsigned long.  In particular
++ * addresses where (pfn << PAGE_SHIFT) > ULONG_MAX cannot be handled.
++ * If the assembly stub has more restrictive requirements
++ * KEXEC_SOURCE_MEMORY_LIMIT and KEXEC_DEST_MEMORY_LIMIT can be
++ * defined more restrictively in <asm/kexec.h>.
++ *
++ * The code for the transition from the current kernel to the 
++ * the new kernel is placed in the reboot_code_buffer, whose size
++ * is given by KEXEC_REBOOT_CODE_SIZE.  In the best case only a single
++ * page of memory is necessary, but some architectures require more.
++ * Because this memory must be identity mapped in the transition from
++ * virtual to physical addresses it must live in the range
++ * 0 - TASK_SIZE, as only the user space mappings are arbitrarily
++ * modifyable.
++ *
++ * The assembly stub in the reboot code buffer is passed a linked list
++ * of descriptor pages detailing the source pages of the new kernel,
++ * and the destination addresses of those source pages.  As this data
++ * structure is not used in the context of the current OS, it must
++ * be self contained.
++ *
++ * The code has been made to work with highmem pages and will use a
++ * destination page in it's final resting place (if it happens 
++ * to allocate it).  The end product of this is that most of the
++ * physical address space, and most of ram can be used.
++ *
++ * Future directions include:
++ *  - allocating a page table with the reboot code buffer identity
++ *    mapped, to simplify machine_kexec and make kexec_on_panic, more
++ *    reliable.  
++ *  - allocating the pages for a page table for machines that cannot
++ *    disable their MMUs.  (Hammer, Alpha...)
++ */
++
++/* KIMAGE_NO_DEST is an impossible destination address..., for
++ * allocating pages whose destination address we do not care about.
++ */
++#define KIMAGE_NO_DEST (-1UL)
++
++static int kimage_is_destination_range(
++	struct kimage *image, unsigned long start, unsigned long end);
++static struct page *kimage_alloc_reboot_code_pages(struct kimage *image);
++static struct page *kimage_alloc_page(struct kimage *image, unsigned int gfp_mask, unsigned long dest);
++
++
++static int kimage_alloc(struct kimage **rimage, 
++	unsigned long nr_segments, struct kexec_segment *segments)
++{
++	int result;
++	struct kimage *image;
++	size_t segment_bytes;
++	struct page *reboot_pages;
++	unsigned long i;
++
++	/* Allocate a controlling structure */
++	result = -ENOMEM;
++	image = kmalloc(sizeof(*image), GFP_KERNEL);
++	if (!image) {
++		goto out;
++	}
++	memset(image, 0, sizeof(*image));
++	image->head = 0;
++	image->entry = &image->head;
++	image->last_entry = &image->head;
++
++	/* Initialize the list of destination pages */
++	INIT_LIST_HEAD(&image->dest_pages);
++
++	/* Initialize the list of unuseable pages */
++	INIT_LIST_HEAD(&image->unuseable_pages);
++
++	/* Read in the segments */
++	image->nr_segments = nr_segments;
++	segment_bytes = nr_segments * sizeof*segments;
++	result = copy_from_user(image->segment, segments, segment_bytes);
++	if (result) 
++		goto out;
++
++	/* Verify we have good destination addresses.  The caller is
++	 * responsible for making certain we don't attempt to load
++	 * the new image into invalid or reserved areas of RAM.  This
++	 * just verifies it is an address we can use. 
++	 */
++	result = -EADDRNOTAVAIL;
++	for(i = 0; i < nr_segments; i++) {
++		unsigned long mend;
++		mend = ((unsigned long)(image->segment[i].mem)) + 
++			image->segment[i].memsz;
++		if (mend >= KEXEC_DESTINATION_MEMORY_LIMIT)
++			goto out;
++	}
++
++	/* Find a location for the reboot code buffer, and add it
++	 * the vector of segments so that it's pages will also be
++	 * counted as destination pages.  
++	 */
++	result = -ENOMEM;
++	reboot_pages = kimage_alloc_reboot_code_pages(image);
++	if (!reboot_pages) {
++		printk(KERN_ERR "Could not allocate reboot_code_buffer\n");
++		goto out;
++	}
++	image->reboot_code_pages = reboot_pages;
++	image->segment[nr_segments].buf = 0;
++	image->segment[nr_segments].bufsz = 0;
++	image->segment[nr_segments].mem = (void *)(page_to_pfn(reboot_pages) << PAGE_SHIFT);
++	image->segment[nr_segments].memsz = KEXEC_REBOOT_CODE_SIZE;
++	image->nr_segments++;
++
++	result = 0;
++ out:
++	if (result == 0) {
++		*rimage = image;
++	} else {
++		kfree(image);
++	}
++	return result;
++}
++
++static int kimage_is_destination_range(
++	struct kimage *image, unsigned long start, unsigned long end)
++{
++	unsigned long i;
++	for(i = 0; i < image->nr_segments; i++) {
++		unsigned long mstart, mend;
++		mstart = (unsigned long)image->segment[i].mem;
++		mend   = mstart + image->segment[i].memsz;
++		if ((end > mstart) && (start < mend)) {
++			return 1;
++		}
++	}
++	return 0;
++}
++
++#ifdef CONFIG_MMU
++static int identity_map_pages(struct page *pages, int order)
++{
++	struct mm_struct *mm;
++	struct vm_area_struct *vma;
++	int error;
++	mm = &init_mm;
++	vma = 0;
++
++	down_write(&mm->mmap_sem);
++	error = -ENOMEM;
++	vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
++	if (!vma) {
++		goto out;
++	}
++
++	memset(vma, 0, sizeof(vma));
++	vma->vm_mm = mm;
++	vma->vm_start = page_to_pfn(pages) << PAGE_SHIFT;
++	vma->vm_end = vma->vm_start + (1 << (order + PAGE_SHIFT));
++	vma->vm_ops = 0;
++	vma->vm_flags = VM_SHARED \
++		| VM_READ | VM_WRITE | VM_EXEC \
++		| VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC \
++		| VM_DONTCOPY | VM_RESERVED;
++	vma->vm_page_prot = protection_map[vma->vm_flags & 0xf];
++	vma->vm_file = NULL;
++	vma->vm_private_data = NULL;
++	INIT_LIST_HEAD(&vma->shared);
++	insert_vm_struct(mm, vma);
++	
++	error = remap_page_range(vma, vma->vm_start, vma->vm_start,
++		vma->vm_end - vma->vm_start, vma->vm_page_prot);
++	if (error) {
++		goto out;
++	}
++
++	error = 0;
++ out:
++	if (error && vma) {
++		kmem_cache_free(vm_area_cachep, vma);
++		vma = 0;
++	}
++	up_write(&mm->mmap_sem);
++
++	return error;
++}
++#else
++#define identity_map_pages(pages, order) 0
++#endif
++
++struct page *kimage_alloc_reboot_code_pages(struct kimage *image)
++{
++	/* The reboot code buffer is special.  It is the only set of
++	 * pages that must be allocated in their final resting place,
++	 * and the only set of pages whose final resting place we can
++	 * pick. 
++	 *
++	 * At worst this runs in O(N) of the image size.
++	 */
++	struct list_head extra_pages, *pos, *next;
++	struct page *pages;
++	unsigned long addr;
++	int order, count;
++	order = get_order(KEXEC_REBOOT_CODE_SIZE);
++	count = 1 << order;
++	INIT_LIST_HEAD(&extra_pages);
++	do {
++		int i;
++		pages = alloc_pages(GFP_HIGHUSER, order);
++		if (!pages)
++			break;
++		for(i = 0; i < count; i++) {
++			SetPageReserved(pages +i);
++		}
++		addr = page_to_pfn(pages) << PAGE_SHIFT;
++		if ((page_to_pfn(pages) >= (TASK_SIZE >> PAGE_SHIFT)) ||
++			kimage_is_destination_range(image, addr, addr + KEXEC_REBOOT_CODE_SIZE)) {
++			list_add(&pages->list, &extra_pages);
++			pages = 0;
++		}
++	} while(!pages);
++	if (pages) {
++		int result;
++		result = identity_map_pages(pages, order);
++		if (result < 0) {
++			list_add(&pages->list, &extra_pages);
++			pages = 0;
++		}
++	}
++	/* If I could convert a multi page allocation into a buch of
++	 * single page allocations I could add these pages to
++	 * image->dest_pages.  For now it is simpler to just free the
++	 * pages again.
++	 */
++	list_for_each_safe(pos, next, &extra_pages) {
++		struct page *page;
++		int i;
++		page = list_entry(pos, struct page, list);
++		for(i = 0; i < count; i++) {
++			ClearPageReserved(pages +i);
++		}
++		list_del(&extra_pages);
++		__free_pages(page, order);
++	}
++	return pages;
++}
++
++static int kimage_add_entry(struct kimage *image, kimage_entry_t entry)
++{
++	if (image->offset != 0) {
++		image->entry++;
++	}
++	if (image->entry == image->last_entry) {
++		kimage_entry_t *ind_page;
++		struct page *page;
++		page = kimage_alloc_page(image, GFP_KERNEL, KIMAGE_NO_DEST);
++		if (!page) {
++			return -ENOMEM;
++		}
++		ind_page = page_address(page);
++		*image->entry = virt_to_phys(ind_page) | IND_INDIRECTION;
++		image->entry = ind_page;
++		image->last_entry = 
++			ind_page + ((PAGE_SIZE/sizeof(kimage_entry_t)) - 1);
++	}
++	*image->entry = entry;
++	image->entry++;
++	image->offset = 0;
++	return 0;
++}
++
++static int kimage_set_destination(
++	struct kimage *image, unsigned long destination) 
++{
++	int result;
++	destination &= PAGE_MASK;
++	result = kimage_add_entry(image, destination | IND_DESTINATION);
++	if (result == 0) {
++		image->destination = destination;
++	}
++	return result;
++}
++
++
++static int kimage_add_page(struct kimage *image, unsigned long page)
++{
++	int result;
++	page &= PAGE_MASK;
++	result = kimage_add_entry(image, page | IND_SOURCE);
++	if (result == 0) {
++		image->destination += PAGE_SIZE;
++	}
++	return result;
++}
++
++
++static void kimage_free_extra_pages(struct kimage *image)
++{
++	/* Walk through and free any extra destination pages I may have */
++	struct list_head *pos, *next;
++	list_for_each_safe(pos, next, &image->dest_pages) {
++		struct page *page;
++		page = list_entry(pos, struct page, list);
++		list_del(&page->list);
++		ClearPageReserved(page);
++		__free_page(page);
++	}
++	/* Walk through and free any unuseable pages I have cached */
++	list_for_each_safe(pos, next, &image->unuseable_pages) {
++		struct page *page;
++		page = list_entry(pos, struct page, list);
++		list_del(&page->list);
++		ClearPageReserved(page);
++		__free_page(page);
++	}
++
++}
++static int kimage_terminate(struct kimage *image)
++{
++	int result;
++	result = kimage_add_entry(image, IND_DONE);
++	if (result == 0) {
++		/* Point at the terminating element */
++		image->entry--;
++		kimage_free_extra_pages(image);
++	}
++	return result;
++}
++
++#define for_each_kimage_entry(image, ptr, entry) \
++	for (ptr = &image->head; (entry = *ptr) && !(entry & IND_DONE); \
++		ptr = (entry & IND_INDIRECTION)? \
++			phys_to_virt((entry & PAGE_MASK)): ptr +1)
++
++static void kimage_free(struct kimage *image)
++{
++	kimage_entry_t *ptr, entry;
++	kimage_entry_t ind = 0;
++	int i, count, order;
++	if (!image)
++		return;
++	kimage_free_extra_pages(image);
++	for_each_kimage_entry(image, ptr, entry) {
++		if (entry & IND_INDIRECTION) {
++			/* Free the previous indirection page */
++			if (ind & IND_INDIRECTION) {
++				free_page((unsigned long)phys_to_virt(ind & PAGE_MASK));
++			}
++			/* Save this indirection page until we are
++			 * done with it.
++			 */
++			ind = entry;
++		}
++		else if (entry & IND_SOURCE) {
++			free_page((unsigned long)phys_to_virt(entry & PAGE_MASK));
++		}
++	}
++	order = get_order(KEXEC_REBOOT_CODE_SIZE);
++	count = 1 << order;
++	do_munmap(&init_mm, 
++		page_to_pfn(image->reboot_code_pages) << PAGE_SHIFT, 
++		count << PAGE_SHIFT);
++	for(i = 0; i < count; i++) {
++		ClearPageReserved(image->reboot_code_pages + i);
++	}
++	__free_pages(image->reboot_code_pages, order);
++	kfree(image);
++}
++
++static kimage_entry_t *kimage_dst_used(struct kimage *image, unsigned long page)
++{
++	kimage_entry_t *ptr, entry;
++	unsigned long destination = 0;
++	for_each_kimage_entry(image, ptr, entry) {
++		if (entry & IND_DESTINATION) {
++			destination = entry & PAGE_MASK;
++		}
++		else if (entry & IND_SOURCE) {
++			if (page == destination) {
++				return ptr;
++			}
++			destination += PAGE_SIZE;
++		}
++	}
++	return 0;
++}
++
++static struct page *kimage_alloc_page(struct kimage *image, unsigned int gfp_mask, unsigned long destination)
++{
++	/* Here we implment safe guards to ensure that a source page
++	 * is not copied to it's destination page before the data on
++	 * the destination page is no longer useful.
++	 *
++	 * To do this we maintain the invariant that a source page is
++	 * either it's own destination page, or it is not a
++	 * destination page at all.  
++	 *
++	 * That is slightly stronger than required, but the proof
++	 * that no problems will not occur is trivial, and the
++	 * implemenation is simply to verify.
++	 *
++	 * When allocating all pages normally this algorithm will run
++	 * in O(N) time, but in the worst case it will run in O(N^2)
++	 * time.   If the runtime is a problem the data structures can
++	 * be fixed.
++	 */
++	struct page *page;
++	unsigned long addr;
++
++	/* Walk through the list of destination pages, and see if I
++	 * have a match.
++	 */
++	list_for_each_entry(page, &image->dest_pages, list) {
++		addr = page_to_pfn(page) << PAGE_SHIFT;
++		if (addr == destination) {
++			list_del(&page->list);
++			return page;
++		}
++	}
++	page = 0;
++	while(1) {
++		kimage_entry_t *old;
++		/* Allocate a page, if we run out of memory give up */
++		page = alloc_page(gfp_mask);
++		if (!page) {
++			return 0;
++		}
++		SetPageReserved(page);
++		/* If the page cannot be used file it away */
++		if (page_to_pfn(page) > (KEXEC_SOURCE_MEMORY_LIMIT >> PAGE_SHIFT)) {
++			list_add(&page->list, &image->unuseable_pages);
++			continue;
++		}
++		addr = page_to_pfn(page) << PAGE_SHIFT;
++
++		/* If it is the destination page we want use it */
++		if (addr == destination)
++			break;
++
++		/* If the page is not a destination page use it */
++		if (!kimage_is_destination_range(image, addr, addr + PAGE_SIZE))
++			break;
++
++		/* I know that the page is someones destination page.
++		 * See if there is already a source page for this
++		 * destination page.  And if so swap the source pages.
++		 */
++		old = kimage_dst_used(image, addr);
++		if (old) {
++			/* If so move it */
++			unsigned long old_addr;
++			struct page *old_page;
++			
++			old_addr = *old & PAGE_MASK;
++			old_page = pfn_to_page(old_addr >> PAGE_SHIFT);
++			copy_highpage(page, old_page);
++			*old = addr | (*old & ~PAGE_MASK);
++
++			/* The old page I have found cannot be a
++			 * destination page, so return it.
++			 */
++			addr = old_addr;
++			page = old_page;
++			break;
++		}
++		else {
++			/* Place the page on the destination list I
++			 * will use it later.
++			 */
++			list_add(&page->list, &image->dest_pages);
++		}
++	}
++	return page;
++}
++
++static int kimage_load_segment(struct kimage *image,
++	struct kexec_segment *segment)
++{	
++	unsigned long mstart;
++	int result;
++	unsigned long offset;
++	unsigned long offset_end;
++	unsigned char *buf;
++
++	result = 0;
++	buf = segment->buf;
++	mstart = (unsigned long)segment->mem;
++
++	offset_end = segment->memsz;
++
++	result = kimage_set_destination(image, mstart);
++	if (result < 0) {
++		goto out;
++	}
++	for(offset = 0;  offset < segment->memsz; offset += PAGE_SIZE) {
++		struct page *page;
++		char *ptr;
++		size_t size, leader;
++		page = kimage_alloc_page(image, GFP_HIGHUSER, mstart + offset);
++		if (page == 0) {
++			result  = -ENOMEM;
++			goto out;
++		}
++		result = kimage_add_page(image, page_to_pfn(page) << PAGE_SHIFT);
++		if (result < 0) {
++			goto out;
++		}
++		ptr = kmap(page);
++		if (segment->bufsz < offset) {
++			/* We are past the end zero the whole page */
++			memset(ptr, 0, PAGE_SIZE);
++			kunmap(page);
++			continue;
++		}
++		size = PAGE_SIZE;
++		leader = 0;
++		if ((offset == 0)) {
++			leader = mstart & ~PAGE_MASK;
++		}
++		if (leader) {
++			/* We are on the first page zero the unused portion */
++			memset(ptr, 0, leader);
++			size -= leader;
++			ptr += leader;
++		}
++		if (size > (segment->bufsz - offset)) {
++			size = segment->bufsz - offset;
++		}
++		if (size < (PAGE_SIZE - leader)) {
++			/* zero the trailing part of the page */
++			memset(ptr + size, 0, (PAGE_SIZE - leader) - size);
++		}
++		result = copy_from_user(ptr, buf + offset, size);
++		kunmap(page);
++		if (result) {
++			result = (result < 0)?result : -EIO;
++			goto out;
++		}
++	}
++ out:
++	return result;
++}
++
++/*
++ * Exec Kernel system call: for obvious reasons only root may call it.
++ * 
++ * This call breaks up into three pieces.  
++ * - A generic part which loads the new kernel from the current
++ *   address space, and very carefully places the data in the
++ *   allocated pages.
++ *
++ * - A generic part that interacts with the kernel and tells all of
++ *   the devices to shut down.  Preventing on-going dmas, and placing
++ *   the devices in a consistent state so a later kernel can
++ *   reinitialize them.
++ *
++ * - A machine specific part that includes the syscall number
++ *   and the copies the image to it's final destination.  And
++ *   jumps into the image at entry.
++ *
++ * kexec does not sync, or unmount filesystems so if you need
++ * that to happen you need to do that yourself.
++ */
++struct kimage *kexec_image = 0;
++
++asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, 
++	struct kexec_segment *segments, unsigned long flags)
++{
++	struct kimage *image;
++	int result;
++		
++	/* We only trust the superuser with rebooting the system. */
++	if (!capable(CAP_SYS_ADMIN))
++		return -EPERM;
++
++	/* In case we need just a little bit of special behavior for
++	 * reboot on panic 
++	 */
++	if (flags != 0)
++		return -EINVAL;
++
++	if (nr_segments > KEXEC_SEGMENT_MAX)
++		return -EINVAL;
++	image = 0;
++
++	result = 0;
++	if (nr_segments > 0) {
++		unsigned long i;
++		result = kimage_alloc(&image, nr_segments, segments);
++		if (result) {
++			goto out;
++		}
++		image->start = entry;
++		for(i = 0; i < nr_segments; i++) {
++			result = kimage_load_segment(image, &segments[i]);
++			if (result) {
++				goto out;
++			}
++		}
++		result = kimage_terminate(image);
++		if (result) {
++			goto out;
++		}
++	}
++
++	image = xchg(&kexec_image, image);
++
++ out:
++	kimage_free(image);
++	return result;
++}
+--- linux-2.6.0-test1/kernel/sys.c~kexec-2.6.0-full	2003-07-22 00:46:07.000000000 -0600
++++ linux-2.6.0-test1-braam/kernel/sys.c	2003-07-22 00:54:04.000000000 -0600
+@@ -17,6 +17,7 @@
+ #include <linux/init.h>
+ #include <linux/highuid.h>
+ #include <linux/fs.h>
++#include <linux/kexec.h>
+ #include <linux/workqueue.h>
+ #include <linux/device.h>
+ #include <linux/times.h>
+@@ -208,6 +209,7 @@ cond_syscall(sys_acct)
+ cond_syscall(sys_lookup_dcookie)
+ cond_syscall(sys_swapon)
+ cond_syscall(sys_swapoff)
++cond_syscall(sys_kexec_load)
+ cond_syscall(sys_init_module)
+ cond_syscall(sys_delete_module)
+ cond_syscall(sys_socketpair)
+@@ -454,6 +456,27 @@ asmlinkage long sys_reboot(int magic1, i
+ 		machine_restart(buffer);
+ 		break;
+ 
++#ifdef CONFIG_KEXEC
++	case LINUX_REBOOT_CMD_KEXEC:
++	{
++		struct kimage *image;
++		if (arg) {
++			unlock_kernel();
++			return -EINVAL;
++		}
++		image = xchg(&kexec_image, 0);
++		if (!image) {
++			unlock_kernel();
++			return -EINVAL;
++		}
++		notifier_call_chain(&reboot_notifier_list, SYS_RESTART, NULL);
++		system_running = 0;
++		device_shutdown();
++		printk(KERN_EMERG "Starting new kernel\n");
++		machine_kexec(image);
++		break;
++	}
++#endif
+ #ifdef CONFIG_SOFTWARE_SUSPEND
+ 	case LINUX_REBOOT_CMD_SW_SUSPEND:
+ 		if (!software_suspend_enabled) {
+
+_
diff --git a/lustre/kernel_patches/patches/kgdb-ga-2.5.73.patch b/lustre/kernel_patches/patches/kgdb-ga-2.5.73.patch
new file mode 100644
index 0000000000..b3e0bbe45f
--- /dev/null
+++ b/lustre/kernel_patches/patches/kgdb-ga-2.5.73.patch
@@ -0,0 +1,5046 @@
+
+
+This kgdb will get called and will trap almost any kernel
+fault WITHOUT BEING ARMED.
+
+It is entered at boot time via "kgdb" in the boot string,
+not "gdb".  This entry occurs when the first setup on the
+boot string is called, not sometime later.  You will not
+find a "waiting for gdb" on your console, as the console has
+not yet been enabled at this time.  (Note, this early stuff
+is a bit fragile as the full trap table has yet to be
+loaded, something I might address, sometime...  So don't try
+to look at memory that can not be reached, for example. 
+Once the full trap table is loaded this restriction goes
+away.)
+
+If you hard code it, you can put a breakpoint() as the FIRST
+LINE OF C CODE.
+
+It does NOT use the serial driver, but if the serial driver
+is loaded, it tells it to release the port to avoid
+conflict.  
+
+The threads stuff is not configurable, does not require
+redirection of schedule() calls and does back track to the
+first non schedule() caller on the info threads command.  If
+you switch to the thread, however, it will show it in the
+switch code (as it should).
+
+It is MUCH more aggressive and paranoid about grabbing the
+other cpus on entry.  It issues a "send_nmi_all_but_self()"
+rather than depending on them to interrupt or hit an NMI
+sometime in the distant future.  If a cpu does not come to
+the party, it will continue without it so all is not lost.
+
+It does not have anything to do with IOCTL calls, but does
+do the control-C thing.
+
+There is a LOT of info in the patch which ends up in
+.../Documentation/i386/kgdb/*
+
+There is a nifty little thing call kgdb_ts() (kgdb time
+stamp) which is a function you can code calls to which puts
+some useful stuff in a circular buffer which can be examined
+with the supplied gdb macros.
+
+It also allows you do to do "p foobar(...)"  i.e. to call a
+function from gdb, just like gdb allows in program
+debugging.
+
+In an SMP system, you can choose to "hold" any given set of
+cpus.  It also defaults to holding other cpus on single step
+(this can be overridden).
+
+This said, you can imagine my consternation when I found it
+"lost it" on continues on 2.5.  I found and fixed this this
+early pm, a hold cpu on exit goof on my part.
+
+Oh, and a final point, the configure options are more
+extensive (the serial port is set up here, for example, (can
+not wait for a command line to do this)).  There is one to
+do system call exit tests.  This is VERY new and causes the
+kernel to hit a hard "int 3" if a system call attempts to
+exit with preempt count other than zero.  This is a fault,
+of course, but the current 2.5 is full of them so I don't
+recommend turning this on.
+
+
+
+
+ Documentation/i386/kgdb/andthen         |  100 +
+ Documentation/i386/kgdb/debug-nmi.txt   |   37 
+ Documentation/i386/kgdb/gdb-globals.txt |   71 +
+ Documentation/i386/kgdb/gdbinit         |   14 
+ Documentation/i386/kgdb/gdbinit-modules |  146 ++
+ Documentation/i386/kgdb/gdbinit.hw      |  117 +
+ Documentation/i386/kgdb/kgdb.txt        |  715 ++++++++++
+ Documentation/i386/kgdb/loadmodule.sh   |   78 +
+ MAINTAINERS                             |    6 
+ arch/i386/Kconfig                       |  180 ++
+ arch/i386/Makefile                      |    3 
+ arch/i386/kernel/Makefile               |    1 
+ arch/i386/kernel/entry.S                |   28 
+ arch/i386/kernel/kgdb_stub.c            | 2214 ++++++++++++++++++++++++++++++++
+ arch/i386/kernel/nmi.c                  |   25 
+ arch/i386/kernel/smp.c                  |   12 
+ arch/i386/kernel/traps.c                |   86 +
+ arch/i386/lib/Makefile                  |    1 
+ arch/i386/lib/kgdb_serial.c             |  485 +++++++
+ arch/i386/mm/fault.c                    |    6 
+ drivers/char/keyboard.c                 |    3 
+ drivers/char/sysrq.c                    |   15 
+ drivers/serial/8250.c                   |   42 
+ include/asm-i386/bugs.h                 |   21 
+ include/asm-i386/kgdb.h                 |   59 
+ include/asm-i386/kgdb_local.h           |  102 +
+ include/linux/config.h                  |    3 
+ kernel/sched.c                          |    7 
+ 28 files changed, 4565 insertions(+), 12 deletions(-)
+
+diff -puN arch/i386/Kconfig~kgdb-ga arch/i386/Kconfig
+--- 25/arch/i386/Kconfig~kgdb-ga	2003-06-25 23:14:17.000000000 -0700
++++ 25-akpm/arch/i386/Kconfig	2003-06-25 23:14:17.000000000 -0700
+@@ -1419,14 +1419,194 @@ config DEBUG_SPINLOCK_SLEEP
+ 	  If you say Y here, various routines which may sleep will become very
+ 	  noisy if they are called with a spinlock held.	
+ 
++config KGDB
++	bool "Include kgdb kernel debugger"
++	depends on DEBUG_KERNEL
++	help  
++	  If you say Y here, the system will be compiled with the debug
++	  option (-g) and a debugging stub will be included in the
++	  kernel.  This stub communicates with gdb on another (host)
++	  computer via a serial port.  The host computer should have
++	  access to the kernel binary file (vmlinux) and a serial port
++	  that is connected to the target machine.  Gdb can be made to
++	  configure the serial port or you can use stty and setserial to
++	  do this. See the 'target' command in gdb. This option also
++	  configures in the ability to request a breakpoint early in the
++	  boot process.  To request the breakpoint just include 'kgdb'
++	  as a boot option when booting the target machine.  The system
++	  will then break as soon as it looks at the boot options.  This
++	  option also installs a breakpoint in panic and sends any
++	  kernel faults to the debugger. For more information see the
++	  Documentation/i386/kgdb.txt file.
++
++choice
++	depends on KGDB
++    	prompt "Debug serial port BAUD" 
++	default KGDB_115200BAUD
++	help  
++	  Gdb and the kernel stub need to agree on the baud rate to be
++	  used.  Some systems (x86 family at this writing) allow this to
++	  be configured.
++
++config KGDB_9600BAUD
++	bool "9600"
++
++config KGDB_19200BAUD
++	bool "19200"
++
++config KGDB_38400BAUD
++	bool "38400"
++
++config KGDB_57600BAUD
++	bool "57600"
++
++config KGDB_115200BAUD
++	bool "115200"
++endchoice
++
++config KGDB_PORT
++	hex "hex I/O port address of the debug serial port"
++	depends on KGDB
++	default  3f8
++	help  
++	  Some systems (x86 family at this writing) allow the port
++	  address to be configured.  The number entered is assumed to be
++	  hex, don't put 0x in front of it.  The standard address are:
++	  COM1 3f8 , irq 4 and COM2 2f8 irq 3.  Setserial /dev/ttySx
++	  will tell you what you have.  It is good to test the serial
++	  connection with a live system before trying to debug.
++
++config KGDB_IRQ
++	int "IRQ of the debug serial port"
++	depends on KGDB
++	default 4
++	help  
++	  This is the irq for the debug port.  If everything is working
++	  correctly and the kernel has interrupts on a control C to the
++	  port should cause a break into the kernel debug stub.
++
++config DEBUG_INFO
++	bool
++	default y
++
++config KGDB_MORE
++	bool "Add any additional compile options"
++	depends on KGDB
++	default n
++	help  
++	  Saying yes here turns on the ability to enter additional
++	  compile options.
++
++
++config KGDB_OPTIONS
++	depends on KGDB_MORE
++	string "Additional compile arguments"
++	default "-O1"
++	help  
++	  This option allows you enter additional compile options for
++	  the whole kernel compile.  Each platform will have a default
++	  that seems right for it.  For example on PPC "-ggdb -O1", and
++	  for i386 "-O1".  Note that by configuring KGDB "-g" is already
++	  turned on.  In addition, on i386 platforms
++	  "-fomit-frame-pointer" is deleted from the standard compile
++	  options.
++
++config NO_KGDB_CPUS
++	int "Number of CPUs"
++	depends on KGDB && SMP
++	default NR_CPUS
++	help
++	  
++	  This option sets the number of cpus for kgdb ONLY.  It is used
++	  to prune some internal structures so they look "nice" when
++	  displayed with gdb.  This is to overcome possibly larger
++	  numbers that may have been entered above.  Enter the real
++	  number to get nice clean kgdb_info displays.
++
++config KGDB_TS
++	bool "Enable kgdb time stamp macros?"
++	depends on KGDB
++	default n
++	help	  
++	  Kgdb event macros allow you to instrument your code with calls
++	  to the kgdb event recording function.  The event log may be
++	  examined with gdb at a break point.  Turning on this
++	  capability also allows you to choose how many events to
++	  keep. Kgdb always keeps the lastest events.
++
++choice 
++	depends on KGDB_TS
++	prompt "Max number of time stamps to save?"
++	default KGDB_TS_128
++
++config KGDB_TS_64
++	bool "64"
++
++config KGDB_TS_128
++	bool "128"
++
++config KGDB_TS_256
++	bool "256"
++
++config KGDB_TS_512
++	bool "512"
++
++config KGDB_TS_1024
++	bool "1024"
++
++endchoice
++
++config STACK_OVERFLOW_TEST
++	bool "Turn on kernel stack overflow testing?"
++	depends on KGDB
++	default n
++	help  
++	  This option enables code in the front line interrupt handlers
++	  to check for kernel stack overflow on interrupts and system
++	  calls.  This is part of the kgdb code on x86 systems.
++
++config KGDB_CONSOLE
++	bool "Enable serial console thru kgdb port"
++	depends on KGDB
++	default n
++	help
++	  This option enables the command line "console=kgdb" option.
++	  When the system is booted with this option in the command line
++	  all kernel printk output is sent to gdb (as well as to other
++	  consoles).  For this to work gdb must be connected.  For this
++	  reason, this command line option will generate a breakpoint if
++	  gdb has not yet connected.  After the gdb continue command is
++	  given all pent up console output will be printed by gdb on the
++	  host machine.  Neither this option, nor KGDB require the
++	  serial driver to be configured.
++
++config KGDB_SYSRQ
++	bool "Turn on SysRq 'G' command to do a break?"
++	depends on KGDB
++	default y
++	help
++	  This option includes an option in the SysRq code that allows
++	  you to enter SysRq G which generates a breakpoint to the KGDB
++	  stub.  This will work if the keyboard is alive and can
++	  interrupt the system.  Because of constraints on when the
++	  serial port interrupt can be enabled, this code may allow you
++	  to interrupt the system before the serial port control C is
++	  available.  Just say yes here.
++
+ config FRAME_POINTER
+ 	bool "Compile the kernel with frame pointers"
++	default KGDB
+ 	help
+ 	  If you say Y here the resulting kernel image will be slightly larger
+ 	  and slower, but it will give very useful debugging information.
+ 	  If you don't debug the kernel, you can say N, but we may not be able
+ 	  to solve problems without frame pointers.
+ 
++config MAGIC_SYSRQ
++	bool
++	depends on KGDB_SYSRQ
++	default y
++
+ config X86_EXTRA_IRQS
+ 	bool
+ 	depends on X86_LOCAL_APIC || X86_VOYAGER
+diff -puN arch/i386/kernel/entry.S~kgdb-ga arch/i386/kernel/entry.S
+--- 25/arch/i386/kernel/entry.S~kgdb-ga	2003-06-25 23:14:17.000000000 -0700
++++ 25-akpm/arch/i386/kernel/entry.S	2003-06-25 23:14:17.000000000 -0700
+@@ -48,6 +48,18 @@
+ #include <asm/smp.h>
+ #include <asm/page.h>
+ #include "irq_vectors.h"
++        /* We do not recover from a stack overflow, but at least
++         * we know it happened and should be able to track it down.
++         */
++#ifdef CONFIG_STACK_OVERFLOW_TEST
++#define STACK_OVERFLOW_TEST \
++        testl $7680,%esp;    \
++        jnz   10f;            \
++        call  stack_overflow; \
++10:
++#else
++#define STACK_OVERFLOW_TEST
++#endif
+ 
+ EBX		= 0x00
+ ECX		= 0x04
+@@ -98,7 +110,8 @@ TSS_ESP0_OFFSET = (4 - 0x200)
+ 	pushl %ebx; \
+ 	movl $(__USER_DS), %edx; \
+ 	movl %edx, %ds; \
+-	movl %edx, %es;
++	movl %edx, %es; \
++        STACK_OVERFLOW_TEST
+ 
+ #define RESTORE_INT_REGS \
+ 	popl %ebx;	\
+@@ -298,6 +311,19 @@ syscall_exit:
+ 	testw $_TIF_ALLWORK_MASK, %cx	# current->work
+ 	jne syscall_exit_work
+ restore_all:
++#ifdef CONFIG_TRAP_BAD_SYSCALL_EXITS
++	movl EFLAGS(%esp), %eax		# mix EFLAGS and CS
++	movb CS(%esp), %al
++	testl $(VM_MASK | 3), %eax
++	jz resume_kernelX		# returning to kernel or vm86-space
++
++	cmpl $0,TI_PRE_COUNT(%ebx)	# non-zero preempt_count ?
++	jz resume_kernelX
++        
++        int $3
++        
++resume_kernelX:
++#endif
+ 	RESTORE_ALL
+ 
+ 	# perform work that needs to be done immediately before resumption
+diff -puN /dev/null arch/i386/kernel/kgdb_stub.c
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25-akpm/arch/i386/kernel/kgdb_stub.c	2003-06-25 23:14:17.000000000 -0700
+@@ -0,0 +1,2214 @@
++/*
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2, or (at your option) any
++ * later version.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
++ * General Public License for more details.
++ *
++ */
++
++/*
++ * Copyright (c) 2000 VERITAS Software Corporation.
++ * 
++ */
++/****************************************************************************
++ *  Header: remcom.c,v 1.34 91/03/09 12:29:49 glenne Exp $
++ *
++ *  Module name: remcom.c $
++ *  Revision: 1.34 $
++ *  Date: 91/03/09 12:29:49 $
++ *  Contributor:     Lake Stevens Instrument Division$
++ *
++ *  Description:     low level support for gdb debugger. $
++ *
++ *  Considerations:  only works on target hardware $
++ *
++ *  Written by:	     Glenn Engel $
++ *  Updated by:	     David Grothe <dave@gcom.com>
++ *  ModuleState:     Experimental $
++ *
++ *  NOTES:	     See Below $
++ *
++ *  Modified for 386 by Jim Kingdon, Cygnus Support.
++ *  Compatibility with 2.1.xx kernel by David Grothe <dave@gcom.com>
++ *
++ *  Changes to allow auto initilization.  All that is needed is that it
++ *  be linked with the kernel and a break point (int 3) be executed.
++ *  The header file <asm/kgdb.h> defines BREAKPOINT to allow one to do
++ *  this. It should also be possible, once the interrupt system is up, to
++ *  call putDebugChar("+").  Once this is done, the remote debugger should
++ *  get our attention by sending a ^C in a packet. George Anzinger 
++ *  <george@mvista.com>
++ *  Integrated into 2.2.5 kernel by Tigran Aivazian <tigran@sco.com>
++ *  Added thread support, support for multiple processors,
++ *	support for ia-32(x86) hardware debugging.
++ *	Amit S. Kale ( akale@veritas.com )
++ *
++ *
++ *  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 an int 3.
++ *
++ *************
++ *
++ *    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 KGDB_VERSION "<20030530.0126.22>"
++#include <linux/config.h>
++#include <linux/types.h>
++#include <asm/string.h>		/* for strcpy */
++#include <linux/kernel.h>
++#include <linux/sched.h>
++#include <asm/vm86.h>
++#include <asm/system.h>
++#include <asm/ptrace.h>		/* for linux pt_regs struct */
++#include <asm/kgdb_local.h>
++#include <linux/list.h>
++#include <asm/atomic.h>
++#include <asm/processor.h>
++#include <linux/irq.h>
++#include <asm/desc.h>
++
++/************************************************************************
++ *
++ * external low-level support routines
++ */
++typedef void (*Function) (void);	/* pointer to a function */
++
++/* Thread reference */
++typedef unsigned char threadref[8];
++
++extern void putDebugChar(int);	/* write a single character	 */
++extern int getDebugChar(void);	/* read and return a single char */
++
++/************************************************************************/
++/* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/
++/* at least NUMREGBYTES*2 are needed for register packets */
++/* Longer buffer is needed to list all threads */
++#define BUFMAX 1024
++
++char *kgdb_version = KGDB_VERSION;
++
++/*  debug >  0 prints ill-formed commands in valid packets & checksum errors */
++int debug_regs = 0;		/* set to non-zero to print registers */
++
++/* filled in by an external module */
++char *gdb_module_offsets;
++
++static const char hexchars[] = "0123456789abcdef";
++
++/* Number of bytes of registers.  */
++#define NUMREGBYTES 64
++/*
++ * Note that this register image is in a different order than
++ * the register image that Linux produces at interrupt time.
++ *
++ * Linux's register image is defined by struct pt_regs in ptrace.h.
++ * Just why GDB uses a different order is a historical mystery.
++ */
++enum regnames { _EAX,		/* 0 */
++	_ECX,			/* 1 */
++	_EDX,			/* 2 */
++	_EBX,			/* 3 */
++	_ESP,			/* 4 */
++	_EBP,			/* 5 */
++	_ESI,			/* 6 */
++	_EDI,			/* 7 */
++	_PC /* 8 also known as eip */ ,
++	_PS /* 9 also known as eflags */ ,
++	_CS,			/* 10 */
++	_SS,			/* 11 */
++	_DS,			/* 12 */
++	_ES,			/* 13 */
++	_FS,			/* 14 */
++	_GS			/* 15 */
++};
++
++/***************************  ASSEMBLY CODE MACROS *************************/
++/*
++ * Put the error code here just in case the user cares.	
++ * Likewise, the vector number here (since GDB only gets the signal
++ * number through the usual means, and that's not very specific). 
++ * The called_from is the return address so he can tell how we entered kgdb.
++ * This will allow him to seperate out the various possible entries. 
++ */
++#define REMOTE_DEBUG 0		/* set != to turn on printing (also available in info) */
++
++#define PID_MAX PID_MAX_DEFAULT
++
++#ifdef CONFIG_SMP
++void smp_send_nmi_allbutself(void);
++#define IF_SMP(x) x
++#undef MAX_NO_CPUS
++#ifndef CONFIG_NO_KGDB_CPUS
++#define CONFIG_NO_KGDB_CPUS 2
++#endif
++#if CONFIG_NO_KGDB_CPUS > NR_CPUS
++#define MAX_NO_CPUS NR_CPUS
++#else
++#define MAX_NO_CPUS CONFIG_NO_KGDB_CPUS
++#endif
++#define hold_init hold_on_sstep: 1,
++#define MAX_CPU_MASK (unsigned long)((1LL << MAX_NO_CPUS) - 1LL)
++#define NUM_CPUS num_online_cpus()
++extern volatile unsigned long cpu_callout_map;
++#else
++#define IF_SMP(x)
++#define hold_init
++#undef MAX_NO_CPUS
++#define MAX_NO_CPUS 1
++#define NUM_CPUS 1
++#endif
++#define NOCPU (struct task_struct *)0xbad1fbad
++/* *INDENT-OFF*	 */
++struct kgdb_info {
++	int used_malloc;
++	void *called_from;
++	long long entry_tsc;
++	int errcode;
++	int vector;
++	int print_debug_info;
++#ifdef CONFIG_SMP
++	int hold_on_sstep;
++	struct {
++		volatile struct task_struct *task;
++		int pid;
++		int hold;
++		struct pt_regs *regs;
++	} cpus_waiting[MAX_NO_CPUS];
++#endif
++} kgdb_info = {hold_init print_debug_info:REMOTE_DEBUG, vector:-1};
++
++/* *INDENT-ON*	*/
++
++#define used_m kgdb_info.used_malloc
++/*
++ * This is little area we set aside to contain the stack we 
++ * need to build to allow gdb to call functions.  We use one
++ * per cpu to avoid locking issues.  We will do all this work
++ * with interrupts off so that should take care of the protection
++ * issues.
++ */
++#define LOOKASIDE_SIZE 200	/* should be more than enough */
++#define MALLOC_MAX   200	/* Max malloc size */
++struct {
++	unsigned int esp;
++	int array[LOOKASIDE_SIZE];
++} fn_call_lookaside[MAX_NO_CPUS];
++
++static int trap_cpu;
++static unsigned int OLD_esp;
++
++#define END_OF_LOOKASIDE  &fn_call_lookaside[trap_cpu].array[LOOKASIDE_SIZE]
++#define IF_BIT 0x200
++#define TF_BIT 0x100
++
++#define MALLOC_ROUND 8-1
++
++static char malloc_array[MALLOC_MAX];
++IF_SMP(static void to_gdb(const char *mess));
++void *
++malloc(int size)
++{
++
++	if (size <= (MALLOC_MAX - used_m)) {
++		int old_used = used_m;
++		used_m += ((size + MALLOC_ROUND) & (~MALLOC_ROUND));
++		return &malloc_array[old_used];
++	} else {
++		return NULL;
++	}
++}
++
++/*
++ * Gdb calls functions by pushing agruments, including a return address 
++ * on the stack and the adjusting EIP to point to the function.	 The 
++ * whole assumption in GDB is that we are on a different stack than the
++ * one the "user" i.e. code that hit the break point, is on.  This, of
++ * course is not true in the kernel.  Thus various dodges are needed to
++ * do the call without directly messing with EIP (which we can not change
++ * as it is just a location and not a register.	 To adjust it would then
++ * require that we move every thing below EIP up or down as needed.  This
++ * will not work as we may well have stack relative pointer on the stack
++ * (such as the pointer to regs, for example).
++
++ * So here is what we do:
++ * We detect gdb attempting to store into the stack area and instead, store
++ * into the fn_call_lookaside.array at the same relative location as if it 
++ * were the area ESP pointed at.  We also trap ESP modifications
++ * and uses these to adjust fn_call_lookaside.esp.  On entry 
++ * fn_call_lookaside.esp will be set to point at the last entry in
++ * fn_call_lookaside.array.  This allows us to check if it has changed, and 
++ * if so, on exit, we add the registers we will use to do the move and a
++ * trap/ interrupt return exit sequence.  We then adjust the eflags in the
++ * regs array (remember we now have a copy in the fn_call_lookaside.array) to
++ * kill the interrupt bit, AND we change EIP to point at our set up stub.
++ * As part of the register set up we preset the registers to point at the
++ * begining and end of the fn_call_lookaside.array, so all the stub needs to
++ * do is move words from the array to the stack until ESP= the desired value
++ * then do the rti.  This will then transfer to the desired function with 
++ * all the correct registers.  Nifty huh?
++ */
++extern asmlinkage void fn_call_stub(void);
++extern asmlinkage void fn_rtn_stub(void);
++/*					   *INDENT-OFF*	 */
++__asm__("fn_rtn_stub:\n\t"
++	"movl %eax,%esp\n\t"
++	"fn_call_stub:\n\t"
++	"1:\n\t"
++	"addl $-4,%ebx\n\t"
++	"movl (%ebx), %eax\n\t"
++	"pushl %eax\n\t"
++	"cmpl %esp,%ecx\n\t"
++	"jne  1b\n\t"
++	"popl %eax\n\t" 
++	"popl %ebx\n\t" 
++	"popl %ecx\n\t" 
++	"iret \n\t");
++/*					     *INDENT-ON*  */
++#define gdb_i386vector	kgdb_info.vector
++#define gdb_i386errcode kgdb_info.errcode
++#define waiting_cpus	kgdb_info.cpus_waiting
++#define remote_debug	kgdb_info.print_debug_info
++#define hold_cpu(cpu)	kgdb_info.cpus_waiting[cpu].hold
++/* gdb locks */
++
++#ifdef CONFIG_SMP
++static int in_kgdb_called;
++static spinlock_t waitlocks[MAX_NO_CPUS] =
++    {[0 ... MAX_NO_CPUS - 1] = SPIN_LOCK_UNLOCKED };
++/*
++ * The following array has the thread pointer of each of the "other"
++ * cpus.  We make it global so it can be seen by gdb.
++ */
++volatile int in_kgdb_entry_log[MAX_NO_CPUS];
++volatile struct pt_regs *in_kgdb_here_log[MAX_NO_CPUS];
++/*
++static spinlock_t continuelocks[MAX_NO_CPUS];
++*/
++spinlock_t kgdb_spinlock = SPIN_LOCK_UNLOCKED;
++/* waiters on our spinlock plus us */
++static atomic_t spinlock_waiters = ATOMIC_INIT(1);
++static int spinlock_count = 0;
++static int spinlock_cpu = 0;
++/*
++ * Note we use nested spin locks to account for the case where a break
++ * point is encountered when calling a function by user direction from
++ * kgdb. Also there is the memory exception recursion to account for.
++ * Well, yes, but this lets other cpus thru too.  Lets add a
++ * cpu id to the lock.
++ */
++#define KGDB_SPIN_LOCK(x) if( spinlock_count == 0 || \
++			      spinlock_cpu != smp_processor_id()){\
++				      atomic_inc(&spinlock_waiters); \
++				      while (! spin_trylock(x)) {\
++					    in_kgdb(&regs);\
++				      }\
++				      atomic_dec(&spinlock_waiters); \
++				      spinlock_count = 1; \
++				      spinlock_cpu = smp_processor_id(); \
++			  }else{  \
++				      spinlock_count++; \
++			  }
++#define KGDB_SPIN_UNLOCK(x) if( --spinlock_count == 0) spin_unlock(x)
++extern volatile unsigned long cpu_callout_map;
++#else
++unsigned kgdb_spinlock = 0;
++#define KGDB_SPIN_LOCK(x) --*x
++#define KGDB_SPIN_UNLOCK(x) ++*x
++#endif
++
++int
++hex(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>	*/
++void
++getpacket(char *buffer)
++{
++	unsigned char checksum;
++	unsigned char xmitcsum;
++	int i;
++	int count;
++	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;
++		}
++		buffer[count] = 0;
++
++		if (ch == '#') {
++			xmitcsum = hex(getDebugChar() & 0x7f) << 4;
++			xmitcsum += hex(getDebugChar() & 0x7f);
++			if ((remote_debug) && (checksum != xmitcsum)) {
++				printk
++				    ("bad checksum.	My count = 0x%x, sent=0x%x. buf=%s\n",
++				     checksum, xmitcsum, buffer);
++			}
++
++			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);
++
++	if (remote_debug)
++		printk("R:%s\n", buffer);
++}
++
++/* send the packet in buffer.  */
++
++void
++putpacket(char *buffer)
++{
++	unsigned char checksum;
++	int count;
++	char ch;
++
++	/*  $<packet info>#<checksum>. */
++	do {
++		if (remote_debug)
++			printk("T:%s\n", buffer);
++		putDebugChar('$');
++		checksum = 0;
++		count = 0;
++
++		while ((ch = buffer[count])) {
++			putDebugChar(ch);
++			checksum += ch;
++			count += 1;
++		}
++
++		putDebugChar('#');
++		putDebugChar(hexchars[checksum >> 4]);
++		putDebugChar(hexchars[checksum % 16]);
++
++	} while ((getDebugChar() & 0x7f) != '+');
++
++}
++
++static char remcomInBuffer[BUFMAX];
++static char remcomOutBuffer[BUFMAX];
++static short error;
++
++void
++debug_error(char *format, char *parm)
++{
++	if (remote_debug)
++		printk(format, parm);
++}
++
++static void
++print_regs(struct pt_regs *regs)
++{
++	printk("EAX=%08lx ", regs->eax);
++	printk("EBX=%08lx ", regs->ebx);
++	printk("ECX=%08lx ", regs->ecx);
++	printk("EDX=%08lx ", regs->edx);
++	printk("\n");
++	printk("ESI=%08lx ", regs->esi);
++	printk("EDI=%08lx ", regs->edi);
++	printk("EBP=%08lx ", regs->ebp);
++	printk("ESP=%08lx ", (long) &regs->esp);
++	printk("\n");
++	printk(" DS=%08x ", regs->xds);
++	printk(" ES=%08x ", regs->xes);
++	printk(" SS=%08x ", __KERNEL_DS);
++	printk(" FL=%08lx ", regs->eflags);
++	printk("\n");
++	printk(" CS=%08x ", regs->xcs);
++	printk(" IP=%08lx ", regs->eip);
++#if 0
++	printk(" FS=%08x ", regs->fs);
++	printk(" GS=%08x ", regs->gs);
++#endif
++	printk("\n");
++
++}				/* print_regs */
++
++#define NEW_esp fn_call_lookaside[trap_cpu].esp
++
++static void
++regs_to_gdb_regs(int *gdb_regs, struct pt_regs *regs)
++{
++	gdb_regs[_EAX] = regs->eax;
++	gdb_regs[_EBX] = regs->ebx;
++	gdb_regs[_ECX] = regs->ecx;
++	gdb_regs[_EDX] = regs->edx;
++	gdb_regs[_ESI] = regs->esi;
++	gdb_regs[_EDI] = regs->edi;
++	gdb_regs[_EBP] = regs->ebp;
++	gdb_regs[_DS] = regs->xds;
++	gdb_regs[_ES] = regs->xes;
++	gdb_regs[_PS] = regs->eflags;
++	gdb_regs[_CS] = regs->xcs;
++	gdb_regs[_PC] = regs->eip;
++	/* Note, as we are a debugging the kernel, we will always 
++	 * trap in kernel code, this means no priviledge change,
++	 * and so the pt_regs structure is not completely valid.  In a non
++	 * privilege change trap, only EFLAGS, CS and EIP are put on the stack,
++	 * SS and ESP are not stacked, this means that the last 2 elements of
++	 * pt_regs is not valid (they would normally refer to the user stack)
++	 * also, using regs+1 is no good because you end up will a value that is 
++	 * 2 longs (8) too high.  This used to cause stepping over functions
++	 * to fail, so my fix is to use the address of regs->esp, which 
++	 * should point at the end of the stack frame.	Note I have ignored
++	 * completely exceptions that cause an error code to be stacked, such
++	 * as double fault.  Stuart Hughes, Zentropix.
++	 * original code: gdb_regs[_ESP] =  (int) (regs + 1) ; 
++
++	 * this is now done on entry and moved to OLD_esp (as well as NEW_esp).
++	 */
++	gdb_regs[_ESP] = NEW_esp;
++	gdb_regs[_SS] = __KERNEL_DS;
++	gdb_regs[_FS] = 0xFFFF;
++	gdb_regs[_GS] = 0xFFFF;
++}				/* regs_to_gdb_regs */
++
++static void
++gdb_regs_to_regs(int *gdb_regs, struct pt_regs *regs)
++{
++	regs->eax = gdb_regs[_EAX];
++	regs->ebx = gdb_regs[_EBX];
++	regs->ecx = gdb_regs[_ECX];
++	regs->edx = gdb_regs[_EDX];
++	regs->esi = gdb_regs[_ESI];
++	regs->edi = gdb_regs[_EDI];
++	regs->ebp = gdb_regs[_EBP];
++	regs->xds = gdb_regs[_DS];
++	regs->xes = gdb_regs[_ES];
++	regs->eflags = gdb_regs[_PS];
++	regs->xcs = gdb_regs[_CS];
++	regs->eip = gdb_regs[_PC];
++	NEW_esp = gdb_regs[_ESP];	/* keep the value */
++#if 0				/* can't change these */
++	regs->esp = gdb_regs[_ESP];
++	regs->xss = gdb_regs[_SS];
++	regs->fs = gdb_regs[_FS];
++	regs->gs = gdb_regs[_GS];
++#endif
++
++}				/* gdb_regs_to_regs */
++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)
++
++int thread_list = 0;
++
++void
++get_gdb_regs(struct task_struct *p, struct pt_regs *regs, int *gdb_regs)
++{
++	unsigned long stack_page;
++	int count = 0;
++	IF_SMP(int i);
++	if (!p || p == current) {
++		regs_to_gdb_regs(gdb_regs, regs);
++		return;
++	}
++#ifdef CONFIG_SMP
++	for (i = 0; i < MAX_NO_CPUS; i++) {
++		if (p == kgdb_info.cpus_waiting[i].task) {
++			regs_to_gdb_regs(gdb_regs,
++					 kgdb_info.cpus_waiting[i].regs);
++			gdb_regs[_ESP] =
++			    (int) &kgdb_info.cpus_waiting[i].regs->esp;
++
++			return;
++		}
++	}
++#endif
++	memset(gdb_regs, 0, NUMREGBYTES);
++	gdb_regs[_ESP] = p->thread.esp;
++	gdb_regs[_PC] = p->thread.eip;
++	gdb_regs[_EBP] = *(int *) gdb_regs[_ESP];
++	gdb_regs[_EDI] = *(int *) (gdb_regs[_ESP] + 4);
++	gdb_regs[_ESI] = *(int *) (gdb_regs[_ESP] + 8);
++
++/*
++ * This code is to give a more informative notion of where a process 
++ * is waiting.	It is used only when the user asks for a thread info
++ * list.  If he then switches to the thread, s/he will find the task
++ * is in schedule, but a back trace should show the same info we come
++ * up with.  This code was shamelessly purloined from process.c.  It was
++ * then enhanced to provide more registers than simply the program 
++ * counter.
++ */
++
++	if (!thread_list) {
++		return;
++	}
++
++	if (p->state == TASK_RUNNING)
++		return;
++	stack_page = (unsigned long) p->thread_info;
++	if (gdb_regs[_ESP] < stack_page || gdb_regs[_ESP] > 8188 + stack_page)
++		return;
++	/* include/asm-i386/system.h:switch_to() pushes ebp last. */
++	do {
++		if (gdb_regs[_EBP] < stack_page ||
++		    gdb_regs[_EBP] > 8184 + stack_page)
++			return;
++		gdb_regs[_PC] = *(unsigned long *) (gdb_regs[_EBP] + 4);
++		gdb_regs[_ESP] = gdb_regs[_EBP] + 8;
++		gdb_regs[_EBP] = *(unsigned long *) gdb_regs[_EBP];
++		if (gdb_regs[_PC] < first_sched || gdb_regs[_PC] >= last_sched)
++			return;
++	} while (count++ < 16);
++	return;
++}
++
++/* Indicate to caller of mem2hex or hex2mem that there has been an
++   error.  */
++static volatile int mem_err = 0;
++static volatile int mem_err_expected = 0;
++static volatile int mem_err_cnt = 0;
++static int garbage_loc = -1;
++
++int
++get_char(char *addr)
++{
++	return *addr;
++}
++
++void
++set_char(char *addr, int val, int may_fault)
++{
++	/*
++	 * This code traps references to the area mapped to the kernel
++	 * stack as given by the regs and, instead, stores to the
++	 * fn_call_lookaside[cpu].array
++	 */
++	if (may_fault &&
++	    (unsigned int) addr < OLD_esp &&
++	    ((unsigned int) addr > (OLD_esp - (unsigned int) LOOKASIDE_SIZE))) {
++		addr = (char *) END_OF_LOOKASIDE - ((char *) OLD_esp - addr);
++	}
++	*addr = val;
++}
++
++/* convert the memory pointed to by mem into hex, placing result in buf */
++/* return a pointer to the last char put in buf (null) */
++/* If MAY_FAULT is non-zero, then we should set mem_err in response to
++   a fault; if zero treat a fault like any other fault in the stub.  */
++char *
++mem2hex(char *mem, char *buf, int count, int may_fault)
++{
++	int i;
++	unsigned char ch;
++
++	if (may_fault) {
++		mem_err_expected = 1;
++		mem_err = 0;
++	}
++	for (i = 0; i < count; i++) {
++		/* printk("%lx = ", mem) ; */
++
++		ch = get_char(mem++);
++
++		/* printk("%02x\n", ch & 0xFF) ; */
++		if (may_fault && mem_err) {
++			if (remote_debug)
++				printk("Mem fault fetching from addr %lx\n",
++				       (long) (mem - 1));
++			*buf = 0;	/* truncate buffer */
++			return (buf);
++		}
++		*buf++ = hexchars[ch >> 4];
++		*buf++ = hexchars[ch % 16];
++	}
++	*buf = 0;
++	if (may_fault)
++		mem_err_expected = 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 */
++/* NOTE: We use the may fault flag to also indicate if the write is to
++ * the registers (0) or "other" memory (!=0) 
++ */
++char *
++hex2mem(char *buf, char *mem, int count, int may_fault)
++{
++	int i;
++	unsigned char ch;
++
++	if (may_fault) {
++		mem_err_expected = 1;
++		mem_err = 0;
++	}
++	for (i = 0; i < count; i++) {
++		ch = hex(*buf++) << 4;
++		ch = ch + hex(*buf++);
++		set_char(mem++, ch, may_fault);
++
++		if (may_fault && mem_err) {
++			if (remote_debug)
++				printk("Mem fault storing to addr %lx\n",
++				       (long) (mem - 1));
++			return (mem);
++		}
++	}
++	if (may_fault)
++		mem_err_expected = 0;
++	return (mem);
++}
++
++/**********************************************/
++/* WHILE WE FIND NICE HEX CHARS, BUILD AN INT */
++/* RETURN NUMBER OF CHARS PROCESSED	      */
++/**********************************************/
++int
++hexToInt(char **ptr, int *intValue)
++{
++	int numChars = 0;
++	int hexValue;
++
++	*intValue = 0;
++
++	while (**ptr) {
++		hexValue = hex(**ptr);
++		if (hexValue >= 0) {
++			*intValue = (*intValue << 4) | hexValue;
++			numChars++;
++		} else
++			break;
++
++		(*ptr)++;
++	}
++
++	return (numChars);
++}
++
++#define stubhex(h) hex(h)
++
++static int
++stub_unpack_int(char *buff, int fieldlength)
++{
++	int nibble;
++	int retval = 0;
++
++	while (fieldlength) {
++		nibble = stubhex(*buff++);
++		retval |= nibble;
++		fieldlength--;
++		if (fieldlength)
++			retval = retval << 4;
++	}
++	return retval;
++}
++
++static char *
++pack_hex_byte(char *pkt, int byte)
++{
++	*pkt++ = hexchars[(byte >> 4) & 0xf];
++	*pkt++ = hexchars[(byte & 0xf)];
++	return pkt;
++}
++
++#define BUF_THREAD_ID_SIZE 16
++
++static char *
++pack_threadid(char *pkt, threadref * id)
++{
++	char *limit;
++	unsigned char *altid;
++
++	altid = (unsigned char *) id;
++	limit = pkt + BUF_THREAD_ID_SIZE;
++	while (pkt < limit)
++		pkt = pack_hex_byte(pkt, *altid++);
++	return pkt;
++}
++
++static char *
++unpack_byte(char *buf, int *value)
++{
++	*value = stub_unpack_int(buf, 2);
++	return buf + 2;
++}
++
++static char *
++unpack_threadid(char *inbuf, threadref * id)
++{
++	char *altref;
++	char *limit = inbuf + BUF_THREAD_ID_SIZE;
++	int x, y;
++
++	altref = (char *) id;
++
++	while (inbuf < limit) {
++		x = stubhex(*inbuf++);
++		y = stubhex(*inbuf++);
++		*altref++ = (x << 4) | y;
++	}
++	return inbuf;
++}
++
++void
++int_to_threadref(threadref * id, int value)
++{
++	unsigned char *scan;
++
++	scan = (unsigned char *) id;
++	{
++		int i = 4;
++		while (i--)
++			*scan++ = 0;
++	}
++	*scan++ = (value >> 24) & 0xff;
++	*scan++ = (value >> 16) & 0xff;
++	*scan++ = (value >> 8) & 0xff;
++	*scan++ = (value & 0xff);
++}
++
++static int
++threadref_to_int(threadref * ref)
++{
++	int i, value = 0;
++	unsigned char *scan;
++
++	scan = (char *) ref;
++	scan += 4;
++	i = 4;
++	while (i-- > 0)
++		value = (value << 8) | ((*scan++) & 0xff);
++	return value;
++}
++
++#if 1				/* this is a hold over from 2.4 where O(1) was "sometimes" */
++extern struct task_struct *kgdb_get_idle(int cpu);
++#define idle_task(cpu) kgdb_get_idle(cpu)
++#else
++#define idle_task(cpu) init_tasks[cpu]
++#endif
++
++struct task_struct *
++getthread(int pid)
++{
++	struct task_struct *thread;
++	if (pid >= PID_MAX && pid <= (PID_MAX + MAX_NO_CPUS)) {
++
++		return idle_task(pid - PID_MAX);
++	} else {
++		/*
++		 * find_task_by_pid is relatively safe all the time
++		 * Other pid functions require lock downs which imply
++		 * that we may be interrupting them (as we get here
++		 * in the middle of most any lock down)
++		 */
++		thread = find_task_by_pid(pid);
++		if (thread) {
++			return thread;
++		}
++	}
++	return NULL;
++}
++/* *INDENT-OFF*	 */
++struct hw_breakpoint {
++	unsigned enabled;
++	unsigned type;
++	unsigned len;
++	unsigned addr;
++} breakinfo[4] = { {enabled:0}, 
++		   {enabled:0}, 
++		   {enabled:0}, 
++		   {enabled:0}};
++/* *INDENT-ON*	*/
++unsigned hw_breakpoint_status;
++void
++correct_hw_break(void)
++{
++	int breakno;
++	int correctit;
++	int breakbit;
++	unsigned dr7;
++
++	asm volatile ("movl %%db7, %0\n":"=r" (dr7)
++		      :);
++	/* *INDENT-OFF*	 */
++	do {
++		unsigned addr0, addr1, addr2, addr3;
++		asm volatile ("movl %%db0, %0\n"
++			      "movl %%db1, %1\n"
++			      "movl %%db2, %2\n"
++			      "movl %%db3, %3\n"
++			      :"=r" (addr0), "=r"(addr1),
++			      "=r"(addr2), "=r"(addr3)
++			      :);
++	} while (0);
++	/* *INDENT-ON*	*/
++	correctit = 0;
++	for (breakno = 0; breakno < 3; breakno++) {
++		breakbit = 2 << (breakno << 1);
++		if (!(dr7 & breakbit) && breakinfo[breakno].enabled) {
++			correctit = 1;
++			dr7 |= breakbit;
++			dr7 &= ~(0xf0000 << (breakno << 2));
++			dr7 |= (((breakinfo[breakno].len << 2) |
++				 breakinfo[breakno].type) << 16) <<
++			    (breakno << 2);
++			switch (breakno) {
++			case 0:
++				asm volatile ("movl %0, %%dr0\n"::"r"
++					      (breakinfo[breakno].addr));
++				break;
++
++			case 1:
++				asm volatile ("movl %0, %%dr1\n"::"r"
++					      (breakinfo[breakno].addr));
++				break;
++
++			case 2:
++				asm volatile ("movl %0, %%dr2\n"::"r"
++					      (breakinfo[breakno].addr));
++				break;
++
++			case 3:
++				asm volatile ("movl %0, %%dr3\n"::"r"
++					      (breakinfo[breakno].addr));
++				break;
++			}
++		} else if ((dr7 & breakbit) && !breakinfo[breakno].enabled) {
++			correctit = 1;
++			dr7 &= ~breakbit;
++			dr7 &= ~(0xf0000 << (breakno << 2));
++		}
++	}
++	if (correctit) {
++		asm volatile ("movl %0, %%db7\n"::"r" (dr7));
++	}
++}
++
++int
++remove_hw_break(unsigned breakno)
++{
++	if (!breakinfo[breakno].enabled) {
++		return -1;
++	}
++	breakinfo[breakno].enabled = 0;
++	return 0;
++}
++
++int
++set_hw_break(unsigned breakno, unsigned type, unsigned len, unsigned addr)
++{
++	if (breakinfo[breakno].enabled) {
++		return -1;
++	}
++	breakinfo[breakno].enabled = 1;
++	breakinfo[breakno].type = type;
++	breakinfo[breakno].len = len;
++	breakinfo[breakno].addr = addr;
++	return 0;
++}
++
++#ifdef CONFIG_SMP
++static int in_kgdb_console = 0;
++
++int
++in_kgdb(struct pt_regs *regs)
++{
++	unsigned flags;
++	int cpu = smp_processor_id();
++	in_kgdb_called = 1;
++	if (!spin_is_locked(&kgdb_spinlock)) {
++		if (in_kgdb_here_log[cpu] ||	/* we are holding this cpu */
++		    in_kgdb_console) {	/* or we are doing slow i/o */
++			return 1;
++		}
++		return 0;
++	}
++
++	/* As I see it the only reason not to let all cpus spin on
++	 * the same spin_lock is to allow selected ones to proceed.
++	 * This would be a good thing, so we leave it this way.
++	 * Maybe someday....  Done !
++
++	 * in_kgdb() is called from an NMI so we don't pretend
++	 * to have any resources, like printk() for example.  
++	 */
++
++	kgdb_local_irq_save(flags);	/* only local here, to avoid hanging */
++	/*
++	 * log arival of this cpu
++	 * The NMI keeps on ticking.  Protect against recurring more
++	 * than once, and ignor the cpu that has the kgdb lock
++	 */
++	in_kgdb_entry_log[cpu]++;
++	in_kgdb_here_log[cpu] = regs;
++	if (cpu == spinlock_cpu || waiting_cpus[cpu].task) {
++		goto exit_in_kgdb;
++	}
++	/*
++	 * For protection of the initilization of the spin locks by kgdb
++	 * it locks the kgdb spinlock before it gets the wait locks set
++	 * up.	We wait here for the wait lock to be taken.  If the
++	 * kgdb lock goes away first??	Well, it could be a slow exit
++	 * sequence where the wait lock is removed prior to the kgdb lock
++	 * so if kgdb gets unlocked, we just exit.
++	 */
++	while (spin_is_locked(&kgdb_spinlock) &&
++	       !spin_is_locked(waitlocks + cpu)) ;
++	if (!spin_is_locked(&kgdb_spinlock)) {
++		goto exit_in_kgdb;
++	}
++	waiting_cpus[cpu].task = current;
++	waiting_cpus[cpu].pid = (current->pid) ? : (PID_MAX + cpu);
++	waiting_cpus[cpu].regs = regs;
++
++	spin_unlock_wait(waitlocks + cpu);
++	/*
++	 * log departure of this cpu
++	 */
++	waiting_cpus[cpu].task = 0;
++	waiting_cpus[cpu].pid = 0;
++	waiting_cpus[cpu].regs = 0;
++	correct_hw_break();
++      exit_in_kgdb:
++	in_kgdb_here_log[cpu] = 0;
++	kgdb_local_irq_restore(flags);
++	return 1;
++	/*
++	   spin_unlock(continuelocks + smp_processor_id());
++	 */
++}
++
++void
++smp__in_kgdb(struct pt_regs regs)
++{
++	ack_APIC_irq();
++	in_kgdb(&regs);
++}
++#else
++int
++in_kgdb(struct pt_regs *regs)
++{
++	return (kgdb_spinlock);
++}
++#endif
++
++void
++printexceptioninfo(int exceptionNo, int errorcode, char *buffer)
++{
++	unsigned dr6;
++	int i;
++	switch (exceptionNo) {
++	case 1:		/* debug exception */
++		break;
++	case 3:		/* breakpoint */
++		sprintf(buffer, "Software breakpoint");
++		return;
++	default:
++		sprintf(buffer, "Details not available");
++		return;
++	}
++	asm volatile ("movl %%db6, %0\n":"=r" (dr6)
++		      :);
++	if (dr6 & 0x4000) {
++		sprintf(buffer, "Single step");
++		return;
++	}
++	for (i = 0; i < 4; ++i) {
++		if (dr6 & (1 << i)) {
++			sprintf(buffer, "Hardware breakpoint %d", i);
++			return;
++		}
++	}
++	sprintf(buffer, "Unknown trap");
++	return;
++}
++
++/*
++ * This function does all command procesing for interfacing to gdb.
++ *
++ * NOTE:  The INT nn instruction leaves the state of the interrupt
++ *	  enable flag UNCHANGED.  That means that when this routine
++ *	  is entered via a breakpoint (INT 3) instruction from code
++ *	  that has interrupts enabled, then interrupts will STILL BE
++ *	  enabled when this routine is entered.	 The first thing that
++ *	  we do here is disable interrupts so as to prevent recursive
++ *	  entries and bothersome serial interrupts while we are
++ *	  trying to run the serial port in polled mode.
++ *
++ * For kernel version 2.1.xx the kgdb_cli() actually gets a spin lock so
++ * it is always necessary to do a restore_flags before returning
++ * so as to let go of that lock.
++ */
++int
++kgdb_handle_exception(int exceptionVector,
++		      int signo, int err_code, struct pt_regs *linux_regs)
++{
++	struct task_struct *usethread = NULL;
++	struct task_struct *thread_list_start = 0, *thread = NULL;
++	int addr, length;
++	int breakno, breaktype;
++	char *ptr;
++	int newPC;
++	threadref thref;
++	int threadid;
++	int thread_min = PID_MAX + MAX_NO_CPUS;
++	int maxthreads;
++	int nothreads;
++	unsigned long flags;
++	int gdb_regs[NUMREGBYTES / 4];
++	int dr6;
++	IF_SMP(int entry_state = 0);	/* 0, ok, 1, no nmi, 2 sync failed */
++#define NO_NMI 1
++#define NO_SYNC 2
++#define	regs	(*linux_regs)
++#define NUMREGS NUMREGBYTES/4
++	/*
++	 * If the entry is not from the kernel then return to the Linux
++	 * trap handler and let it process the interrupt normally.
++	 */
++	if ((linux_regs->eflags & VM_MASK) || (3 & linux_regs->xcs)) {
++		printk("ignoring non-kernel exception\n");
++		print_regs(&regs);
++		return (0);
++	}
++
++	kgdb_local_irq_save(flags);
++
++	/* Get kgdb spinlock */
++
++	KGDB_SPIN_LOCK(&kgdb_spinlock);
++	rdtscll(kgdb_info.entry_tsc);
++	/*
++	 * We depend on this spinlock and the NMI watch dog to control the 
++	 * other cpus.	They will arrive at "in_kgdb()" as a result of the
++	 * NMI and will wait there for the following spin locks to be 
++	 * released.
++	 */
++#ifdef CONFIG_SMP
++
++	if (cpu_callout_map & ~MAX_CPU_MASK) {
++		printk("kgdb : too many cpus, possibly not mapped"
++		       " in contiguous space, change MAX_NO_CPUS"
++		       " in kgdb_stub and make new kernel.\n"
++		       " cpu_callout_map is %lx\n", cpu_callout_map);
++		goto exit_just_unlock;
++	}
++
++	if (spinlock_count == 1) {
++		int time, end_time, dum;
++		int i;
++		int cpu_logged_in[MAX_NO_CPUS] = {[0 ... MAX_NO_CPUS - 1] = (0)
++		};
++		if (remote_debug) {
++			printk("kgdb : cpu %d entry, syncing others\n",
++			       smp_processor_id());
++		}
++		for (i = 0; i < MAX_NO_CPUS; i++) {
++			/*
++			 * Use trylock as we may already hold the lock if
++			 * we are holding the cpu.  Net result is all
++			 * locked.
++			 */
++			spin_trylock(&waitlocks[i]);
++		}
++		for (i = 0; i < MAX_NO_CPUS; i++)
++			cpu_logged_in[i] = 0;
++		/*
++		 * Wait for their arrival.  We know the watch dog is active if 
++		 * in_kgdb() has ever been called, as it is always called on a 
++		 * watchdog tick.
++		 */
++		rdtsc(dum, time);
++		end_time = time + 2;	/* Note: we use the High order bits! */
++		i = 1;
++		if (num_online_cpus() > 1) {
++			int me_in_kgdb = in_kgdb_entry_log[smp_processor_id()];
++			smp_send_nmi_allbutself();
++			while (i < num_online_cpus() && time != end_time) {
++				int j;
++				for (j = 0; j < MAX_NO_CPUS; j++) {
++					if (waiting_cpus[j].task &&
++					    !cpu_logged_in[j]) {
++						i++;
++						cpu_logged_in[j] = 1;
++						if (remote_debug) {
++							printk
++							    ("kgdb : cpu %d arrived at kgdb\n",
++							     j);
++						}
++						break;
++					} else if (!waiting_cpus[j].task &&
++						   !cpu_online(j)) {
++						waiting_cpus[j].task = NOCPU;
++						cpu_logged_in[j] = 1;
++						waiting_cpus[j].hold = 1;
++						break;
++					}
++					if (!waiting_cpus[j].task &&
++					    in_kgdb_here_log[j]) {
++
++						int wait = 100000;
++						while (wait--) ;
++						if (!waiting_cpus[j].task &&
++						    in_kgdb_here_log[j]) {
++							printk
++							    ("kgdb : cpu %d stall"
++							     " in in_kgdb\n",
++							     j);
++							i++;
++							cpu_logged_in[j] = 1;
++							waiting_cpus[j].task =
++							    (struct task_struct
++							     *) 1;
++						}
++					}
++				}
++
++				if (in_kgdb_entry_log[smp_processor_id()] >
++				    (me_in_kgdb + 10)) {
++					break;
++				}
++
++				rdtsc(dum, time);
++			}
++			if (i < num_online_cpus()) {
++				printk
++				    ("kgdb : time out, proceeding without sync\n");
++#if 0
++				printk("kgdb : Waiting_cpus: 0 = %d, 1 = %d\n",
++				       waiting_cpus[0].task != 0,
++				       waiting_cpus[1].task != 0);
++				printk("kgdb : Cpu_logged in: 0 = %d, 1 = %d\n",
++				       cpu_logged_in[0], cpu_logged_in[1]);
++				printk
++				    ("kgdb : in_kgdb_here_log in: 0 = %d, 1 = %d\n",
++				     in_kgdb_here_log[0] != 0,
++				     in_kgdb_here_log[1] != 0);
++#endif
++				entry_state = NO_SYNC;
++			} else {
++#if 0
++				int ent =
++				    in_kgdb_entry_log[smp_processor_id()] -
++				    me_in_kgdb;
++				printk("kgdb : sync after %d entries\n", ent);
++#endif
++			}
++		} else {
++			if (remote_debug) {
++				printk
++				    ("kgdb : %d cpus, but watchdog not active\n"
++				     "proceeding without locking down other cpus\n",
++				     num_online_cpus());
++				entry_state = NO_NMI;
++			}
++		}
++	}
++#endif
++
++	if (remote_debug) {
++		unsigned long *lp = (unsigned long *) &linux_regs;
++
++		printk("handle_exception(exceptionVector=%d, "
++		       "signo=%d, err_code=%d, linux_regs=%p)\n",
++		       exceptionVector, signo, err_code, linux_regs);
++		if (debug_regs) {
++			print_regs(&regs);
++			printk("Stk: %8lx %8lx %8lx %8lx"
++			       "  %8lx %8lx %8lx %8lx\n",
++			       lp[0], lp[1], lp[2], lp[3],
++			       lp[4], lp[5], lp[6], lp[7]);
++			printk("     %8lx %8lx %8lx %8lx"
++			       "  %8lx %8lx %8lx %8lx\n",
++			       lp[8], lp[9], lp[10], lp[11],
++			       lp[12], lp[13], lp[14], lp[15]);
++			printk("     %8lx %8lx %8lx %8lx  "
++			       "%8lx %8lx %8lx %8lx\n",
++			       lp[16], lp[17], lp[18], lp[19],
++			       lp[20], lp[21], lp[22], lp[23]);
++			printk("     %8lx %8lx %8lx %8lx  "
++			       "%8lx %8lx %8lx %8lx\n",
++			       lp[24], lp[25], lp[26], lp[27],
++			       lp[28], lp[29], lp[30], lp[31]);
++		}
++	}
++
++	/* Disable hardware debugging while we are in kgdb */
++	/* Get the debug register status register */
++/*				       *INDENT-OFF*  */
++      __asm__("movl %0,%%db7"
++	      :	/* no output */
++	      :"r"(0));
++
++	asm volatile ("movl %%db6, %0\n"
++		      :"=r" (hw_breakpoint_status)
++		      :);
++
++/*				       *INDENT-ON*  */
++	switch (exceptionVector) {
++	case 0:		/* divide error */
++	case 1:		/* debug exception */
++	case 2:		/* NMI */
++	case 3:		/* breakpoint */
++	case 4:		/* overflow */
++	case 5:		/* bounds check */
++	case 6:		/* invalid opcode */
++	case 7:		/* device not available */
++	case 8:		/* double fault (errcode) */
++	case 10:		/* invalid TSS (errcode) */
++	case 12:		/* stack fault (errcode) */
++	case 16:		/* floating point error */
++	case 17:		/* alignment check (errcode) */
++	default:		/* any undocumented */
++		break;
++	case 11:		/* segment not present (errcode) */
++	case 13:		/* general protection (errcode) */
++	case 14:		/* page fault (special errcode) */
++	case 19:		/* cache flush denied */
++		if (mem_err_expected) {
++			/*
++			 * This fault occured because of the
++			 * get_char or set_char routines.  These
++			 * two routines use either eax of edx to
++			 * indirectly reference the location in
++			 * memory that they are working with.
++			 * For a page fault, when we return the
++			 * instruction will be retried, so we
++			 * have to make sure that these
++			 * registers point to valid memory. 
++			 */
++			mem_err = 1;	/* set mem error flag */
++			mem_err_expected = 0;
++			mem_err_cnt++;	/* helps in debugging */
++			/* make valid address */
++			regs.eax = (long) &garbage_loc;
++			/* make valid address */
++			regs.edx = (long) &garbage_loc;
++			if (remote_debug)
++				printk("Return after memory error: "
++				       "mem_err_cnt=%d\n", mem_err_cnt);
++			if (debug_regs)
++				print_regs(&regs);
++			goto exit_kgdb;
++		}
++		break;
++	}
++	if (remote_debug)
++		printk("kgdb : entered kgdb on cpu %d\n", smp_processor_id());
++
++	gdb_i386vector = exceptionVector;
++	gdb_i386errcode = err_code;
++	kgdb_info.called_from = __builtin_return_address(0);
++#ifdef CONFIG_SMP
++	/*
++	 * OK, we can now communicate, lets tell gdb about the sync.
++	 * but only if we had a problem.
++	 */
++	switch (entry_state) {
++	case NO_NMI:
++		to_gdb("NMI not active, other cpus not stopped\n");
++		break;
++	case NO_SYNC:
++		to_gdb("Some cpus not stopped, see 'kgdb_info' for details\n");
++	default:;
++	}
++
++#endif
++/*
++ * Set up the gdb function call area.
++ */
++	trap_cpu = smp_processor_id();
++	OLD_esp = NEW_esp = (int) (&linux_regs->esp);
++
++      IF_SMP(once_again:)
++	    /* reply to host that an exception has occurred */
++	    remcomOutBuffer[0] = 'S';
++	remcomOutBuffer[1] = hexchars[signo >> 4];
++	remcomOutBuffer[2] = hexchars[signo % 16];
++	remcomOutBuffer[3] = 0;
++
++	putpacket(remcomOutBuffer);
++
++	while (1 == 1) {
++		error = 0;
++		remcomOutBuffer[0] = 0;
++		getpacket(remcomInBuffer);
++		switch (remcomInBuffer[0]) {
++		case '?':
++			remcomOutBuffer[0] = 'S';
++			remcomOutBuffer[1] = hexchars[signo >> 4];
++			remcomOutBuffer[2] = hexchars[signo % 16];
++			remcomOutBuffer[3] = 0;
++			break;
++		case 'd':
++			remote_debug = !(remote_debug);	/* toggle debug flag */
++			printk("Remote debug %s\n",
++			       remote_debug ? "on" : "off");
++			break;
++		case 'g':	/* return the value of the CPU registers */
++			get_gdb_regs(usethread, &regs, gdb_regs);
++			mem2hex((char *) gdb_regs,
++				remcomOutBuffer, NUMREGBYTES, 0);
++			break;
++		case 'G':	/* set the value of the CPU registers - return OK */
++			hex2mem(&remcomInBuffer[1],
++				(char *) gdb_regs, NUMREGBYTES, 0);
++			if (!usethread || usethread == current) {
++				gdb_regs_to_regs(gdb_regs, &regs);
++				strcpy(remcomOutBuffer, "OK");
++			} else {
++				strcpy(remcomOutBuffer, "E00");
++			}
++			break;
++
++		case 'P':{	/* set the value of a single CPU register - 
++				   return OK */
++				/*
++				 * For some reason, gdb wants to talk about psudo
++				 * registers (greater than 15).	 These may have
++				 * meaning for ptrace, but for us it is safe to
++				 * ignor them.	We do this by dumping them into
++				 * _GS which we also ignor, but do have memory for.
++				 */
++				int regno;
++
++				ptr = &remcomInBuffer[1];
++				regs_to_gdb_regs(gdb_regs, &regs);
++				if ((!usethread || usethread == current) &&
++				    hexToInt(&ptr, &regno) &&
++				    *ptr++ == '=' && (regno >= 0)) {
++					regno =
++					    (regno >= NUMREGS ? _GS : regno);
++					hex2mem(ptr, (char *) &gdb_regs[regno],
++						4, 0);
++					gdb_regs_to_regs(gdb_regs, &regs);
++					strcpy(remcomOutBuffer, "OK");
++					break;
++				}
++				strcpy(remcomOutBuffer, "E01");
++				break;
++			}
++
++			/* mAA..AA,LLLL	 Read LLLL bytes at address AA..AA */
++		case 'm':
++			/* TRY TO READ %x,%x.  IF SUCCEED, SET PTR = 0 */
++			ptr = &remcomInBuffer[1];
++			if (hexToInt(&ptr, &addr) &&
++			    (*(ptr++) == ',') && (hexToInt(&ptr, &length))) {
++				ptr = 0;
++				/*
++				 * hex doubles the byte count
++				 */
++				if (length > (BUFMAX / 2))
++					length = BUFMAX / 2;
++				mem2hex((char *) addr,
++					remcomOutBuffer, length, 1);
++				if (mem_err) {
++					strcpy(remcomOutBuffer, "E03");
++					debug_error("memory fault\n", NULL);
++				}
++			}
++
++			if (ptr) {
++				strcpy(remcomOutBuffer, "E01");
++				debug_error
++				    ("malformed read memory command: %s\n",
++				     remcomInBuffer);
++			}
++			break;
++
++			/* MAA..AA,LLLL: 
++			   Write LLLL bytes at address AA.AA return OK */
++		case 'M':
++			/* TRY TO READ '%x,%x:'.  IF SUCCEED, SET PTR = 0 */
++			ptr = &remcomInBuffer[1];
++			if (hexToInt(&ptr, &addr) &&
++			    (*(ptr++) == ',') &&
++			    (hexToInt(&ptr, &length)) && (*(ptr++) == ':')) {
++				hex2mem(ptr, (char *) addr, length, 1);
++
++				if (mem_err) {
++					strcpy(remcomOutBuffer, "E03");
++					debug_error("memory fault\n", NULL);
++				} else {
++					strcpy(remcomOutBuffer, "OK");
++				}
++
++				ptr = 0;
++			}
++			if (ptr) {
++				strcpy(remcomOutBuffer, "E02");
++				debug_error
++				    ("malformed write memory command: %s\n",
++				     remcomInBuffer);
++			}
++			break;
++
++			/* cAA..AA  Continue at address AA..AA(optional) */
++			/* sAA..AA  Step one instruction from AA..AA(optional) */
++			/* D	    detach, reply OK and then continue */
++		case 'c':
++		case 's':
++		case 'D':
++
++			/* try to read optional parameter, 
++			   pc unchanged if no parm */
++			ptr = &remcomInBuffer[1];
++			if (hexToInt(&ptr, &addr)) {
++				if (remote_debug)
++					printk("Changing EIP to 0x%x\n", addr);
++
++				regs.eip = addr;
++			}
++
++			newPC = regs.eip;
++
++			/* clear the trace bit */
++			regs.eflags &= 0xfffffeff;
++
++			/* set the trace bit if we're stepping */
++			if (remcomInBuffer[0] == 's')
++				regs.eflags |= 0x100;
++
++			/* detach is a friendly version of continue. Note that
++			   debugging is still enabled (e.g hit control C)
++			   until the process that issued an ioctl TIOCGDB
++			   terminates
++			 */
++			if (remcomInBuffer[0] == 'D') {
++				strcpy(remcomOutBuffer, "OK");
++				putpacket(remcomOutBuffer);
++			}
++
++			if (remote_debug) {
++				printk("Resuming execution\n");
++				print_regs(&regs);
++			}
++			asm volatile ("movl %%db6, %0\n":"=r" (dr6)
++				      :);
++			if (!(dr6 & 0x4000)) {
++				for (breakno = 0; breakno < 4; ++breakno) {
++					if (dr6 & (1 << breakno) &&
++					    (breakinfo[breakno].type == 0)) {
++						/* Set restore flag */
++						regs.eflags |= 0x10000;
++						break;
++					}
++				}
++			}
++			correct_hw_break();
++			asm volatile ("movl %0, %%db6\n"::"r" (0));
++			goto exit_kgdb;
++
++			/* kill the program */
++		case 'k':	/* do nothing */
++			break;
++
++			/* query */
++		case 'q':
++			switch (remcomInBuffer[1]) {
++			case 'L':
++				/* List threads */
++				thread_list = 2;
++				thread_list_start = (usethread ? : current);
++				unpack_byte(remcomInBuffer + 3, &maxthreads);
++				unpack_threadid(remcomInBuffer + 5, &thref);
++				do {
++					int buf_thread_limit =
++					    (BUFMAX - 22) / BUF_THREAD_ID_SIZE;
++					if (maxthreads > buf_thread_limit) {
++						maxthreads = buf_thread_limit;
++					}
++				} while (0);
++				remcomOutBuffer[0] = 'q';
++				remcomOutBuffer[1] = 'M';
++				remcomOutBuffer[4] = '0';
++				pack_threadid(remcomOutBuffer + 5, &thref);
++
++				threadid = threadref_to_int(&thref);
++				for (nothreads = 0;
++				     nothreads < maxthreads &&
++				     threadid < PID_MAX + MAX_NO_CPUS;
++				     threadid++) {
++					thread = getthread(threadid);
++					if (thread) {
++						int_to_threadref(&thref,
++								 threadid);
++						pack_threadid(remcomOutBuffer +
++							      21 +
++							      nothreads * 16,
++							      &thref);
++						nothreads++;
++						if (thread_min > threadid)
++							thread_min = threadid;
++					}
++				}
++
++				if (threadid == PID_MAX + MAX_NO_CPUS) {
++					remcomOutBuffer[4] = '1';
++				}
++				pack_hex_byte(remcomOutBuffer + 2, nothreads);
++				remcomOutBuffer[21 + nothreads * 16] = '\0';
++				break;
++
++			case 'C':
++				/* Current thread id */
++				remcomOutBuffer[0] = 'Q';
++				remcomOutBuffer[1] = 'C';
++				threadid = current->pid;
++				if (!threadid) {
++					/*
++					 * idle thread
++					 */
++					for (threadid = PID_MAX;
++					     threadid < PID_MAX + MAX_NO_CPUS;
++					     threadid++) {
++						if (current ==
++						    idle_task(threadid -
++							      PID_MAX))
++							break;
++					}
++				}
++				int_to_threadref(&thref, threadid);
++				pack_threadid(remcomOutBuffer + 2, &thref);
++				remcomOutBuffer[18] = '\0';
++				break;
++
++			case 'E':
++				/* Print exception info */
++				printexceptioninfo(exceptionVector,
++						   err_code, remcomOutBuffer);
++				break;
++			}
++			break;
++
++			/* task related */
++		case 'H':
++			switch (remcomInBuffer[1]) {
++			case 'g':
++				ptr = &remcomInBuffer[2];
++				hexToInt(&ptr, &threadid);
++				thread = getthread(threadid);
++				if (!thread) {
++					remcomOutBuffer[0] = 'E';
++					remcomOutBuffer[1] = '\0';
++					break;
++				}
++				/*
++				 * Just in case I forget what this is all about,
++				 * the "thread info" command to gdb causes it
++				 * to ask for a thread list.  It then switches
++				 * to each thread and asks for the registers.
++				 * For this (and only this) usage, we want to
++				 * fudge the registers of tasks not on the run
++				 * list (i.e. waiting) to show the routine that
++				 * called schedule. Also, gdb, is a minimalist
++				 * in that if the current thread is the last
++				 * it will not re-read the info when done.
++				 * This means that in this case we must show
++				 * the real registers. So here is how we do it:
++				 * Each entry we keep track of the min
++				 * thread in the list (the last that gdb will)
++				 * get info for.  We also keep track of the
++				 * starting thread.
++				 * "thread_list" is cleared when switching back
++				 * to the min thread if it is was current, or
++				 * if it was not current, thread_list is set 
++				 * to 1.  When the switch to current comes,
++				 * if thread_list is 1, clear it, else do 
++				 * nothing.
++				 */
++				usethread = thread;
++				if ((thread_list == 1) &&
++				    (thread == thread_list_start)) {
++					thread_list = 0;
++				}
++				if (thread_list && (threadid == thread_min)) {
++					if (thread == thread_list_start) {
++						thread_list = 0;
++					} else {
++						thread_list = 1;
++					}
++				}
++				/* follow through */
++			case 'c':
++				remcomOutBuffer[0] = 'O';
++				remcomOutBuffer[1] = 'K';
++				remcomOutBuffer[2] = '\0';
++				break;
++			}
++			break;
++
++			/* Query thread status */
++		case 'T':
++			ptr = &remcomInBuffer[1];
++			hexToInt(&ptr, &threadid);
++			thread = getthread(threadid);
++			if (thread) {
++				remcomOutBuffer[0] = 'O';
++				remcomOutBuffer[1] = 'K';
++				remcomOutBuffer[2] = '\0';
++				if (thread_min > threadid)
++					thread_min = threadid;
++			} else {
++				remcomOutBuffer[0] = 'E';
++				remcomOutBuffer[1] = '\0';
++			}
++			break;
++
++		case 'Y':
++			ptr = &remcomInBuffer[1];
++			hexToInt(&ptr, &breakno);
++			ptr++;
++			hexToInt(&ptr, &breaktype);
++			ptr++;
++			hexToInt(&ptr, &length);
++			ptr++;
++			hexToInt(&ptr, &addr);
++			if (set_hw_break(breakno & 0x3,
++					 breaktype & 0x3,
++					 length & 0x3, addr) == 0) {
++				strcpy(remcomOutBuffer, "OK");
++			} else {
++				strcpy(remcomOutBuffer, "ERROR");
++			}
++			break;
++
++			/* Remove hardware breakpoint */
++		case 'y':
++			ptr = &remcomInBuffer[1];
++			hexToInt(&ptr, &breakno);
++			if (remove_hw_break(breakno & 0x3) == 0) {
++				strcpy(remcomOutBuffer, "OK");
++			} else {
++				strcpy(remcomOutBuffer, "ERROR");
++			}
++			break;
++
++		case 'r':	/* reboot */
++			strcpy(remcomOutBuffer, "OK");
++			putpacket(remcomOutBuffer);
++			/*to_gdb("Rebooting\n"); */
++			/* triplefault	 no return from here */
++			{
++				static long no_idt[2];
++				__asm__ __volatile__("lidt %0"::"m"(no_idt));
++				BREAKPOINT;
++			}
++
++		}		/* switch */
++
++		/* reply to the request */
++		putpacket(remcomOutBuffer);
++	}			/* while(1==1) */
++	/*
++	 *  reached by goto only.
++	 */
++      exit_kgdb:
++	/*
++	 * Here is where we set up to trap a gdb function call.	 NEW_esp
++	 * will be changed if we are trying to do this.	 We handle both
++	 * adding and subtracting, thus allowing gdb to put grung on 
++	 * the stack which it removes later.
++	 */
++	if (NEW_esp != OLD_esp) {
++		int *ptr = END_OF_LOOKASIDE;
++		if (NEW_esp < OLD_esp)
++			ptr -= (OLD_esp - NEW_esp) / sizeof (int);
++		*--ptr = linux_regs->eflags;
++		*--ptr = linux_regs->xcs;
++		*--ptr = linux_regs->eip;
++		*--ptr = linux_regs->ecx;
++		*--ptr = linux_regs->ebx;
++		*--ptr = linux_regs->eax;
++		linux_regs->ecx = NEW_esp - (sizeof (int) * 6);
++		linux_regs->ebx = (unsigned int) END_OF_LOOKASIDE;
++		if (NEW_esp < OLD_esp) {
++			linux_regs->eip = (unsigned int) fn_call_stub;
++		} else {
++			linux_regs->eip = (unsigned int) fn_rtn_stub;
++			linux_regs->eax = NEW_esp;
++		}
++		linux_regs->eflags &= ~(IF_BIT | TF_BIT);
++	}
++#ifdef CONFIG_SMP
++	/*
++	 * Release gdb wait locks 
++	 * Sanity check time.  Must have at least one cpu to run.  Also single
++	 * step must not be done if the current cpu is on hold.
++	 */
++	if (spinlock_count == 1) {
++		int ss_hold = (regs.eflags & 0x100) && kgdb_info.hold_on_sstep;
++		int cpu_avail = 0;
++		int i;
++
++		for (i = 0; i < MAX_NO_CPUS; i++) {
++			if (!cpu_online(i))
++				break;
++			if (!hold_cpu(i)) {
++				cpu_avail = 1;
++			}
++		}
++		/*
++		 * Early in the bring up there will be NO cpus on line...
++		 */
++		if (!cpu_avail && cpu_online_map) {
++			to_gdb("No cpus unblocked, see 'kgdb_info.hold_cpu'\n");
++			goto once_again;
++		}
++		if (hold_cpu(smp_processor_id()) && (regs.eflags & 0x100)) {
++			to_gdb
++			    ("Current cpu must be unblocked to single step\n");
++			goto once_again;
++		}
++		if (!(ss_hold)) {
++			int i;
++			for (i = 0; i < MAX_NO_CPUS; i++) {
++				if (!hold_cpu(i)) {
++					spin_unlock(&waitlocks[i]);
++				}
++			}
++		} else {
++			spin_unlock(&waitlocks[smp_processor_id()]);
++		}
++		/* Release kgdb spinlock */
++		KGDB_SPIN_UNLOCK(&kgdb_spinlock);
++		/*
++		 * If this cpu is on hold, this is where we
++		 * do it.  Note, the NMI will pull us out of here,
++		 * but will return as the above lock is not held.
++		 * We will stay here till another cpu releases the lock for us.
++		 */
++		spin_unlock_wait(waitlocks + smp_processor_id());
++		kgdb_local_irq_restore(flags);
++		return (0);
++	}
++      exit_just_unlock:
++#endif
++	/* Release kgdb spinlock */
++	KGDB_SPIN_UNLOCK(&kgdb_spinlock);
++	kgdb_local_irq_restore(flags);
++	return (0);
++}
++
++/* this function is used to set up exception handlers for tracing and
++ * breakpoints. 
++ * This function is not needed as the above line does all that is needed.
++ * We leave it for backward compatitability...
++ */
++void
++set_debug_traps(void)
++{
++	/*
++	 * linux_debug_hook is defined in traps.c.  We store a pointer
++	 * to our own exception handler into it.
++
++	 * But really folks, every hear of labeled common, an old Fortran
++	 * concept.  Lots of folks can reference it and it is define if 
++	 * anyone does.	 Only one can initialize it at link time.  We do 
++	 * this with the hook.	See the statement above.  No need for any
++	 * executable code and it is ready as soon as the kernel is
++	 * loaded.  Very desirable in kernel debugging.
++
++	 linux_debug_hook = handle_exception ;
++	 */
++
++	/* In case GDB is started before us, ack any packets (presumably
++	   "$?#xx") sitting there. 
++	   putDebugChar ('+');
++
++	   initialized = 1;
++	 */
++}
++
++/* 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. */
++/* But really, just use the BREAKPOINT macro.  We will handle the int stuff
++ */
++
++#ifdef later
++/*
++ * possibly we should not go thru the traps.c code at all?  Someday.
++ */
++void
++do_kgdb_int3(struct pt_regs *regs, long error_code)
++{
++	kgdb_handle_exception(3, 5, error_code, regs);
++	return;
++}
++#endif
++#undef regs
++#ifdef CONFIG_TRAP_BAD_SYSCALL_EXITS
++asmlinkage void
++bad_sys_call_exit(int stuff)
++{
++	struct pt_regs *regs = (struct pt_regs *) &stuff;
++	printk("Sys call %d return with %x preempt_count\n",
++	       (int) regs->orig_eax, preempt_count());
++}
++#endif
++#ifdef CONFIG_STACK_OVERFLOW_TEST
++#include <asm/kgdb.h>
++asmlinkage void
++stack_overflow(void)
++{
++#ifdef BREAKPOINT
++	BREAKPOINT;
++#else
++	printk("Kernel stack overflow, looping forever\n");
++#endif
++	while (1) {
++	}
++}
++#endif
++
++#if defined(CONFIG_SMP) || defined(CONFIG_KGDB_CONSOLE)
++char gdbconbuf[BUFMAX];
++
++static void
++kgdb_gdb_message(const char *s, unsigned count)
++{
++	int i;
++	int wcount;
++	char *bufptr;
++	/*
++	 * This takes care of NMI while spining out chars to gdb
++	 */
++	IF_SMP(in_kgdb_console = 1);
++	gdbconbuf[0] = 'O';
++	bufptr = gdbconbuf + 1;
++	while (count > 0) {
++		if ((count << 1) > (BUFMAX - 2)) {
++			wcount = (BUFMAX - 2) >> 1;
++		} else {
++			wcount = count;
++		}
++		count -= wcount;
++		for (i = 0; i < wcount; i++) {
++			bufptr = pack_hex_byte(bufptr, s[i]);
++		}
++		*bufptr = '\0';
++		s += wcount;
++
++		putpacket(gdbconbuf);
++
++	}
++	IF_SMP(in_kgdb_console = 0);
++}
++#endif
++#ifdef CONFIG_SMP
++static void
++to_gdb(const char *s)
++{
++	int count = 0;
++	while (s[count] && (count++ < BUFMAX)) ;
++	kgdb_gdb_message(s, count);
++}
++#endif
++#ifdef CONFIG_KGDB_CONSOLE
++#include <linux/console.h>
++#include <linux/init.h>
++#include <linux/fs.h>
++#include <asm/uaccess.h>
++#include <asm/semaphore.h>
++
++void
++kgdb_console_write(struct console *co, const char *s, unsigned count)
++{
++
++	if (gdb_i386vector == -1) {
++		/*
++		 * We have not yet talked to gdb.  What to do...
++		 * lets break, on continue we can do the write.
++		 * But first tell him whats up. Uh, well no can do,
++		 * as this IS the console.  Oh well...
++		 * We do need to wait or the messages will be lost.
++		 * Other option would be to tell the above code to
++		 * ignore this breakpoint and do an auto return, 
++		 * but that might confuse gdb.	Also this happens 
++		 * early enough in boot up that we don't have the traps
++		 * set up yet, so...
++		 */
++		breakpoint();
++	}
++	kgdb_gdb_message(s, count);
++}
++
++/*
++ * ------------------------------------------------------------
++ * Serial KGDB driver 
++ * ------------------------------------------------------------
++ */
++
++static struct console kgdbcons = {
++	name:"kgdb",
++	write:kgdb_console_write,
++#ifdef CONFIG_KGDB_USER_CONSOLE
++	device:kgdb_console_device,
++#endif
++	flags:CON_PRINTBUFFER | CON_ENABLED,
++	index:-1,
++};
++
++/*
++ * The trick here is that this file gets linked before printk.o
++ * That means we get to peer at the console info in the command
++ * line before it does.	 If we are up, we register, otherwise,
++ * do nothing.	By returning 0, we allow printk to look also.
++ */
++static int kgdb_console_enabled;
++
++int __init
++kgdb_console_init(char *str)
++{
++	if ((strncmp(str, "kgdb", 4) == 0) || (strncmp(str, "gdb", 3) == 0)) {
++		register_console(&kgdbcons);
++		kgdb_console_enabled = 1;
++	}
++	return 0;		/* let others look at the string */
++}
++
++__setup("console=", kgdb_console_init);
++
++#ifdef CONFIG_KGDB_USER_CONSOLE
++static kdev_t kgdb_console_device(struct console *c);
++/* This stuff sort of works, but it knocks out telnet devices  
++ * we are leaving it here in case we (or you) find time to figure it out
++ * better..
++ */
++
++/*
++ * We need a real char device as well for when the console is opened for user
++ * space activities.
++ */
++
++static int
++kgdb_consdev_open(struct inode *inode, struct file *file)
++{
++	return 0;
++}
++
++static ssize_t
++kgdb_consdev_write(struct file *file, const char *buf,
++		   size_t count, loff_t * ppos)
++{
++	int size, ret = 0;
++	static char kbuf[128];
++	static DECLARE_MUTEX(sem);
++
++	/* We are not reentrant... */
++	if (down_interruptible(&sem))
++		return -ERESTARTSYS;
++
++	while (count > 0) {
++		/* need to copy the data from user space */
++		size = count;
++		if (size > sizeof (kbuf))
++			size = sizeof (kbuf);
++		if (copy_from_user(kbuf, buf, size)) {
++			ret = -EFAULT;
++			break;;
++		}
++		kgdb_console_write(&kgdbcons, kbuf, size);
++		count -= size;
++		ret += size;
++		buf += size;
++	}
++
++	up(&sem);
++
++	return ret;
++}
++
++struct file_operations kgdb_consdev_fops = {
++	open:kgdb_consdev_open,
++	write:kgdb_consdev_write
++};
++static kdev_t
++kgdb_console_device(struct console *c)
++{
++	return MKDEV(TTYAUX_MAJOR, 1);
++}
++
++/*
++ * This routine gets called from the serial stub in the i386/lib 
++ * This is so it is done late in bring up (just before the console open).
++ */
++void
++kgdb_console_finit(void)
++{
++	if (kgdb_console_enabled) {
++		char *cptr = cdevname(MKDEV(TTYAUX_MAJOR, 1));
++		char *cp = cptr;
++		while (*cptr && *cptr != '(')
++			cptr++;
++		*cptr = 0;
++		unregister_chrdev(TTYAUX_MAJOR, cp);
++		register_chrdev(TTYAUX_MAJOR, "kgdb", &kgdb_consdev_fops);
++	}
++}
++#endif
++#endif
++#ifdef CONFIG_KGDB_TS
++#include <asm/msr.h>		/* time stamp code */
++#include <asm/hardirq.h>	/* in_interrupt */
++#ifdef CONFIG_KGDB_TS_64
++#define DATA_POINTS 64
++#endif
++#ifdef CONFIG_KGDB_TS_128
++#define DATA_POINTS 128
++#endif
++#ifdef CONFIG_KGDB_TS_256
++#define DATA_POINTS 256
++#endif
++#ifdef CONFIG_KGDB_TS_512
++#define DATA_POINTS 512
++#endif
++#ifdef CONFIG_KGDB_TS_1024
++#define DATA_POINTS 1024
++#endif
++#ifndef DATA_POINTS
++#define DATA_POINTS 128		/* must be a power of two */
++#endif
++#define INDEX_MASK (DATA_POINTS - 1)
++#if (INDEX_MASK & DATA_POINTS)
++#error "CONFIG_KGDB_TS_COUNT must be a power of 2"
++#endif
++struct kgdb_and_then_struct {
++#ifdef CONFIG_SMP
++	int on_cpu;
++#endif
++	struct task_struct *task;
++	long long at_time;
++	int from_ln;
++	char *in_src;
++	void *from;
++	int *with_shpf;
++	int data0;
++	int data1;
++};
++struct kgdb_and_then_struct2 {
++#ifdef CONFIG_SMP
++	int on_cpu;
++#endif
++	struct task_struct *task;
++	long long at_time;
++	int from_ln;
++	char *in_src;
++	void *from;
++	int *with_shpf;
++	struct task_struct *t1;
++	struct task_struct *t2;
++};
++struct kgdb_and_then_struct kgdb_data[DATA_POINTS];
++
++struct kgdb_and_then_struct *kgdb_and_then = &kgdb_data[0];
++int kgdb_and_then_count;
++
++void
++kgdb_tstamp(int line, char *source, int data0, int data1)
++{
++	static spinlock_t ts_spin = SPIN_LOCK_UNLOCKED;
++	int flags;
++	kgdb_local_irq_save(flags);
++	spin_lock(&ts_spin);
++	rdtscll(kgdb_and_then->at_time);
++#ifdef CONFIG_SMP
++	kgdb_and_then->on_cpu = smp_processor_id();
++#endif
++	kgdb_and_then->task = current;
++	kgdb_and_then->from_ln = line;
++	kgdb_and_then->in_src = source;
++	kgdb_and_then->from = __builtin_return_address(0);
++	kgdb_and_then->with_shpf = (int *) (((flags & IF_BIT) >> 9) |
++					    (preempt_count() << 8));
++	kgdb_and_then->data0 = data0;
++	kgdb_and_then->data1 = data1;
++	kgdb_and_then = &kgdb_data[++kgdb_and_then_count & INDEX_MASK];
++	spin_unlock(&ts_spin);
++	kgdb_local_irq_restore(flags);
++#ifdef CONFIG_PREEMPT
++
++#endif
++	return;
++}
++#endif
++typedef int gdb_debug_hook(int exceptionVector,
++			   int signo, int err_code, struct pt_regs *linux_regs);
++gdb_debug_hook *linux_debug_hook = &kgdb_handle_exception;	/* histerical reasons... */
+diff -puN arch/i386/kernel/Makefile~kgdb-ga arch/i386/kernel/Makefile
+--- 25/arch/i386/kernel/Makefile~kgdb-ga	2003-06-25 23:14:17.000000000 -0700
++++ 25-akpm/arch/i386/kernel/Makefile	2003-06-25 23:14:17.000000000 -0700
+@@ -14,6 +14,7 @@ obj-y				+= timers/
+ obj-$(CONFIG_ACPI)		+= acpi/
+ obj-$(CONFIG_X86_BIOS_REBOOT)	+= reboot.o
+ obj-$(CONFIG_MCA)		+= mca.o
++obj-$(CONFIG_KGDB)		+= kgdb_stub.o 
+ obj-$(CONFIG_X86_MSR)		+= msr.o
+ obj-$(CONFIG_X86_CPUID)		+= cpuid.o
+ obj-$(CONFIG_MICROCODE)		+= microcode.o
+diff -puN arch/i386/kernel/nmi.c~kgdb-ga arch/i386/kernel/nmi.c
+--- 25/arch/i386/kernel/nmi.c~kgdb-ga	2003-06-25 23:14:17.000000000 -0700
++++ 25-akpm/arch/i386/kernel/nmi.c	2003-06-25 23:14:17.000000000 -0700
+@@ -31,7 +31,17 @@
+ #include <asm/mpspec.h>
+ #include <asm/nmi.h>
+ 
++#ifdef CONFIG_KGDB
++#include <asm/kgdb.h>
++#ifdef CONFIG_SMP
++unsigned int nmi_watchdog = NMI_IO_APIC;
++#else
++unsigned int nmi_watchdog = NMI_LOCAL_APIC;
++#endif
++#else
+ unsigned int nmi_watchdog = NMI_NONE;
++#endif
++
+ static unsigned int nmi_hz = HZ;
+ unsigned int nmi_perfctr_msr;	/* the MSR to reset in NMI handler */
+ extern void show_registers(struct pt_regs *regs);
+@@ -398,6 +408,9 @@ void touch_nmi_watchdog (void)
+ 	for (i = 0; i < NR_CPUS; i++)
+ 		alert_counter[i] = 0;
+ }
++#ifdef CONFIG_KGDB
++int tune_watchdog = 5*HZ;
++#endif
+ 
+ void nmi_watchdog_tick (struct pt_regs * regs)
+ {
+@@ -411,12 +424,24 @@ void nmi_watchdog_tick (struct pt_regs *
+ 
+ 	sum = irq_stat[cpu].apic_timer_irqs;
+ 
++#ifdef CONFIG_KGDB
++ 	if (! in_kgdb(regs) && last_irq_sums[cpu] == sum ) {
++  
++#else
+ 	if (last_irq_sums[cpu] == sum) {
++#endif
+ 		/*
+ 		 * Ayiee, looks like this CPU is stuck ...
+ 		 * wait a few IRQs (5 seconds) before doing the oops ...
+ 		 */
+ 		alert_counter[cpu]++;
++#ifdef CONFIG_KGDB
++                if (alert_counter[cpu] == tune_watchdog) {                      
++                        kgdb_handle_exception(2, SIGPWR, 0, regs);
++                        last_irq_sums[cpu] = sum;
++                        alert_counter[cpu] = 0;
++                }
++#endif
+ 		if (alert_counter[cpu] == 5*nmi_hz) {
+ 			spin_lock(&nmi_print_lock);
+ 			/*
+diff -puN arch/i386/kernel/smp.c~kgdb-ga arch/i386/kernel/smp.c
+--- 25/arch/i386/kernel/smp.c~kgdb-ga	2003-06-25 23:14:17.000000000 -0700
++++ 25-akpm/arch/i386/kernel/smp.c	2003-06-25 23:14:17.000000000 -0700
+@@ -459,7 +459,17 @@ void smp_send_reschedule(int cpu)
+ {
+ 	send_IPI_mask(1 << cpu, RESCHEDULE_VECTOR);
+ }
+-
++#ifdef CONFIG_KGDB
++/*
++ * By using the NMI code instead of a vector we just sneak thru the 
++ * word generator coming out with just what we want.  AND it does
++ * not matter if clustered_apic_mode is set or not.
++ */
++void smp_send_nmi_allbutself(void)
++{
++	send_IPI_allbutself(APIC_DM_NMI);
++}
++#endif
+ /*
+  * Structure and data for smp_call_function(). This is designed to minimise
+  * static memory requirements. It also looks cleaner.
+diff -puN arch/i386/kernel/traps.c~kgdb-ga arch/i386/kernel/traps.c
+--- 25/arch/i386/kernel/traps.c~kgdb-ga	2003-06-25 23:14:17.000000000 -0700
++++ 25-akpm/arch/i386/kernel/traps.c	2003-06-25 23:14:17.000000000 -0700
+@@ -90,6 +90,42 @@ asmlinkage void alignment_check(void);
+ asmlinkage void spurious_interrupt_bug(void);
+ asmlinkage void machine_check(void);
+ 
++#ifdef CONFIG_KGDB
++extern void sysenter_entry(void);
++#include <asm/kgdb.h>
++#include <linux/init.h>
++extern void int3(void);
++extern void debug(void);
++void set_intr_gate(unsigned int n, void *addr);
++static void set_intr_usr_gate(unsigned int n, void *addr);
++/*
++ * Should be able to call this breakpoint() very early in
++ * bring up.  Just hard code the call where needed.
++ * The breakpoint() code is here because set_?_gate() functions
++ * are local (static) to trap.c.  They need be done only once,
++ * but it does not hurt to do them over.
++ */
++void breakpoint(void)
++{
++        set_intr_usr_gate(3,&int3); /* disable ints on trap */
++	set_intr_gate(1,&debug);
++	set_intr_gate(14,&page_fault);
++       
++        BREAKPOINT;
++}
++#define	CHK_REMOTE_DEBUG(trapnr,signr,error_code,regs,after)		\
++    {									\
++	if (!user_mode(regs)  ) \
++	{								\
++		kgdb_handle_exception(trapnr, signr, error_code, regs);	\
++		after;							\
++	} else if ((trapnr == 3) && (regs->eflags &0x200)) local_irq_enable(); \
++    }
++#else
++#define	CHK_REMOTE_DEBUG(trapnr,signr,error_code,regs,after)	
++#endif
++
++
+ static int kstack_depth_to_print = 24;
+ 
+ void show_trace(struct task_struct *task, unsigned long * stack)
+@@ -258,6 +294,15 @@ void die(const char * str, struct pt_reg
+ 	bust_spinlocks(1);
+ 	handle_BUG(regs);
+ 	printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
++#ifdef CONFIG_KGDB
++	/* This is about the only place we want to go to kgdb even if in 
++	 * user mode.  But we must go in via a trap so within kgdb we will
++	 * always be in kernel mode.
++	 */
++	if (user_mode(regs))
++		BREAKPOINT;
++#endif
++ 	CHK_REMOTE_DEBUG(0,SIGTRAP,err,regs,)
+ 	show_registers(regs);
+ 	bust_spinlocks(0);
+ 	spin_unlock_irq(&die_lock);
+@@ -327,6 +372,7 @@ static inline void do_trap(int trapnr, i
+ #define DO_ERROR(trapnr, signr, str, name) \
+ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
+ { \
++	CHK_REMOTE_DEBUG(trapnr,signr,error_code,regs,)\
+ 	do_trap(trapnr, signr, str, 0, regs, error_code, NULL); \
+ }
+ 
+@@ -344,7 +390,9 @@ asmlinkage void do_##name(struct pt_regs
+ #define DO_VM86_ERROR(trapnr, signr, str, name) \
+ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
+ { \
++	CHK_REMOTE_DEBUG(trapnr, signr, error_code,regs, return)\
+ 	do_trap(trapnr, signr, str, 1, regs, error_code, NULL); \
++	return; \
+ }
+ 
+ #define DO_VM86_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
+@@ -387,8 +435,10 @@ gp_in_vm86:
+ 	return;
+ 
+ gp_in_kernel:
+-	if (!fixup_exception(regs))
++	if (!fixup_exception(regs)){
++ 		CHK_REMOTE_DEBUG(13,SIGSEGV,error_code,regs,)
+ 		die("general protection fault", regs, error_code);
++	}
+ }
+ 
+ static void mem_parity_error(unsigned char reason, struct pt_regs * regs)
+@@ -550,8 +600,18 @@ asmlinkage void do_debug(struct pt_regs 
+ 		 * allowing programs to debug themselves without the ptrace()
+ 		 * interface.
+ 		 */
+-		if ((regs->xcs & 3) == 0)
++#ifdef CONFIG_KGDB
++		/*
++		 * I think this is the only "real" case of a TF in the kernel
++		 * that really belongs to user space.  Others are
++		 * "Ours all ours!"
++		 */
++		if (((regs->xcs & 3) == 0) && ((void *)regs->eip == sysenter_entry))
+ 			goto clear_TF_reenable;
++#else
++		if ((regs->xcs & 3) == 0)	
++			goto clear_TF_reenable;
++#endif
+ 		if ((tsk->ptrace & (PT_DTRACE|PT_PTRACED)) == PT_DTRACE)
+ 			goto clear_TF;
+ 	}
+@@ -563,6 +623,17 @@ asmlinkage void do_debug(struct pt_regs 
+ 	info.si_errno = 0;
+ 	info.si_code = TRAP_BRKPT;
+ 	
++#ifdef CONFIG_KGDB
++        /*
++	 * If this is a kernel mode trap, we need to reset db7 to allow us
++	 * to continue sanely ALSO skip the signal delivery 
++         */
++	if ((regs->xcs & 3) == 0)
++		goto clear_dr7;
++
++        /* if not kernel, allow ints but only if they were on */ 
++       if ( regs->eflags & 0x200) local_irq_enable(); 
++#endif
+ 	/* If this is a kernel mode trap, save the user PC on entry to 
+ 	 * the kernel, that's what the debugger can make sense of.
+ 	 */
+@@ -577,6 +648,7 @@ clear_dr7:
+ 	__asm__("movl %0,%%db7"
+ 		: /* no output */
+ 		: "r" (0));
++	CHK_REMOTE_DEBUG(1,SIGTRAP,error_code,regs,)
+ 	return;
+ 
+ debug_vm86:
+@@ -823,6 +895,12 @@ static void __init set_call_gate(void *a
+ {
+ 	_set_gate(a,12,3,addr,__KERNEL_CS);
+ }
++#ifdef CONFIG_KGDB
++void set_intr_usr_gate(unsigned int n, void *addr)
++{
++	_set_gate(idt_table+n,14,3,addr,__KERNEL_CS);
++}
++#endif
+ 
+ static void __init set_task_gate(unsigned int n, unsigned int gdt_entry)
+ {
+@@ -849,7 +927,11 @@ void __init trap_init(void)
+ 	set_trap_gate(0,&divide_error);
+ 	set_intr_gate(1,&debug);
+ 	set_intr_gate(2,&nmi);
++#ifndef CONFIG_KGDB
+ 	set_system_gate(3,&int3);	/* int3-5 can be called from all */
++#else
++	set_intr_usr_gate(3,&int3);	/* int3-5 can be called from all */
++#endif
+ 	set_system_gate(4,&overflow);
+ 	set_system_gate(5,&bounds);
+ 	set_trap_gate(6,&invalid_op);
+diff -puN /dev/null arch/i386/lib/kgdb_serial.c
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25-akpm/arch/i386/lib/kgdb_serial.c	2003-06-25 23:14:17.000000000 -0700
+@@ -0,0 +1,485 @@
++/*
++ * Serial interface GDB stub
++ *
++ * Written (hacked together) by David Grothe (dave@gcom.com)
++ * Modified to allow invokation early in boot see also
++ * kgdb.h for instructions by George Anzinger(george@mvista.com)
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/errno.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/timer.h>
++#include <linux/interrupt.h>
++#include <linux/tty.h>
++#include <linux/tty_flip.h>
++#include <linux/serial.h>
++#include <linux/serial_reg.h>
++#include <linux/config.h>
++#include <linux/major.h>
++#include <linux/string.h>
++#include <linux/fcntl.h>
++#include <linux/ptrace.h>
++#include <linux/ioport.h>
++#include <linux/mm.h>
++#include <linux/init.h>
++#include <linux/highmem.h>
++#include <asm/system.h>
++#include <asm/io.h>
++#include <asm/segment.h>
++#include <asm/bitops.h>
++#include <asm/system.h>
++#include <asm/kgdb_local.h>
++#ifdef CONFIG_KGDB_USER_CONSOLE
++extern void kgdb_console_finit(void);
++#endif
++#define PRNT_off
++#define TEST_EXISTANCE
++#ifdef PRNT
++#define dbprintk(s) printk s
++#else
++#define dbprintk(s)
++#endif
++#define TEST_INTERRUPT_off
++#ifdef TEST_INTERRUPT
++#define intprintk(s) printk s
++#else
++#define intprintk(s)
++#endif
++
++#define IRQ_T(info) ((info->flags & ASYNC_SHARE_IRQ) ? SA_SHIRQ : SA_INTERRUPT)
++
++#define	GDB_BUF_SIZE	512	/* power of 2, please */
++
++static char gdb_buf[GDB_BUF_SIZE];
++static int gdb_buf_in_inx;
++static atomic_t gdb_buf_in_cnt;
++static int gdb_buf_out_inx;
++
++struct async_struct *gdb_async_info;
++static int gdb_async_irq;
++
++#define outb_px(a,b) outb_p(b,a)
++
++static void program_uart(struct async_struct *info);
++static void write_char(struct async_struct *info, int chr);
++/*
++ * Get a byte from the hardware data buffer and return it
++ */
++static int
++read_data_bfr(struct async_struct *info)
++{
++	char it = inb_p(info->port + UART_LSR);
++
++	if (it & UART_LSR_DR)
++		return (inb_p(info->port + UART_RX));
++	/*
++	 * If we have a framing error assume somebody messed with
++	 * our uart.  Reprogram it and send '-' both ways...
++	 */
++	if (it & 0xc) {
++		program_uart(info);
++		write_char(info, '-');
++		return ('-');
++	}
++	return (-1);
++
++}				/* read_data_bfr */
++
++/*
++ * Get a char if available, return -1 if nothing available.
++ * Empty the receive buffer first, then look at the interface hardware.
++
++ * Locking here is a bit of a problem.	We MUST not lock out communication
++ * if we are trying to talk to gdb about a kgdb entry.	ON the other hand
++ * we can loose chars in the console pass thru if we don't lock.  It is also
++ * possible that we could hold the lock or be waiting for it when kgdb
++ * NEEDS to talk.  Since kgdb locks down the world, it does not need locks.
++ * We do, of course have possible issues with interrupting a uart operation,
++ * but we will just depend on the uart status to help keep that straight.
++
++ */
++static spinlock_t uart_interrupt_lock = SPIN_LOCK_UNLOCKED;
++#ifdef CONFIG_SMP
++extern spinlock_t kgdb_spinlock;
++#endif
++
++static int
++read_char(struct async_struct *info)
++{
++	int chr;
++	unsigned long flags;
++	local_irq_save(flags);
++#ifdef CONFIG_SMP
++	if (!spin_is_locked(&kgdb_spinlock)) {
++		spin_lock(&uart_interrupt_lock);
++	}
++#endif
++	if (atomic_read(&gdb_buf_in_cnt) != 0) {	/* intr routine has q'd chars */
++		chr = gdb_buf[gdb_buf_out_inx++];
++		gdb_buf_out_inx &= (GDB_BUF_SIZE - 1);
++		atomic_dec(&gdb_buf_in_cnt);
++	} else {
++		chr = read_data_bfr(info);
++	}
++#ifdef CONFIG_SMP
++	if (!spin_is_locked(&kgdb_spinlock)) {
++		spin_unlock(&uart_interrupt_lock);
++	}
++#endif
++	local_irq_restore(flags);
++	return (chr);
++}
++
++/*
++ * Wait until the interface can accept a char, then write it.
++ */
++static void
++write_char(struct async_struct *info, int chr)
++{
++	while (!(inb_p(info->port + UART_LSR) & UART_LSR_THRE)) ;
++
++	outb_p(chr, info->port + UART_TX);
++
++}				/* write_char */
++
++/*
++ * Mostly we don't need a spinlock, but since the console goes
++ * thru here with interrutps on, well, we need to catch those
++ * chars.
++ */
++/*
++ * This is the receiver interrupt routine for the GDB stub.
++ * It will receive a limited number of characters of input
++ * from the gdb  host machine and save them up in a buffer.
++ *
++ * When the gdb stub routine getDebugChar() is called it
++ * draws characters out of the buffer until it is empty and
++ * then reads directly from the serial port.
++ *
++ * We do not attempt to write chars from the interrupt routine
++ * since the stubs do all of that via putDebugChar() which
++ * writes one byte after waiting for the interface to become
++ * ready.
++ *
++ * The debug stubs like to run with interrupts disabled since,
++ * after all, they run as a consequence of a breakpoint in
++ * the kernel.
++ *
++ * Perhaps someone who knows more about the tty driver than I
++ * care to learn can make this work for any low level serial
++ * driver.
++ */
++static irqreturn_t
++gdb_interrupt(int irq, void *dev_id, struct pt_regs *regs)
++{
++	struct async_struct *info;
++	unsigned long flags;
++
++	info = gdb_async_info;
++	if (!info || !info->tty || irq != gdb_async_irq)
++		return IRQ_NONE;
++
++	local_irq_save(flags);
++	spin_lock(&uart_interrupt_lock);
++	do {
++		int chr = read_data_bfr(info);
++		intprintk(("Debug char on int: %x hex\n", chr));
++		if (chr < 0)
++			continue;
++
++		if (chr == 3) {	/* Ctrl-C means remote interrupt */
++			BREAKPOINT;
++			continue;
++		}
++
++		if (atomic_read(&gdb_buf_in_cnt) >= GDB_BUF_SIZE) {
++			/* buffer overflow tosses early char */
++			read_char(info);
++		}
++		gdb_buf[gdb_buf_in_inx++] = chr;
++		gdb_buf_in_inx &= (GDB_BUF_SIZE - 1);
++	} while (inb_p(info->port + UART_IIR) & UART_IIR_RDI);
++	spin_unlock(&uart_interrupt_lock);
++	local_irq_restore(flags);
++	return IRQ_HANDLED;
++}				/* gdb_interrupt */
++
++/*
++ * Just a NULL routine for testing.
++ */
++void
++gdb_null(void)
++{
++}				/* gdb_null */
++
++/* These structure are filled in with values defined in asm/kgdb_local.h
++ */
++static struct serial_state state = SB_STATE;
++static struct async_struct local_info = SB_INFO;
++static int ok_to_enable_ints = 0;
++static void kgdb_enable_ints_now(void);
++
++extern char *kgdb_version;
++/*
++ * Hook an IRQ for KGDB.
++ *
++ * This routine is called from putDebugChar, below.
++ */
++static int ints_disabled = 1;
++int
++gdb_hook_interrupt(struct async_struct *info, int verb)
++{
++	struct serial_state *state = info->state;
++	unsigned long flags;
++	int port;
++#ifdef TEST_EXISTANCE
++	int scratch, scratch2;
++#endif
++
++	/* The above fails if memory managment is not set up yet. 
++	 * Rather than fail the set up, just keep track of the fact
++	 * and pick up the interrupt thing later.
++	 */
++	gdb_async_info = info;
++	port = gdb_async_info->port;
++	gdb_async_irq = state->irq;
++	if (verb) {
++		printk("kgdb %s : port =%x, IRQ=%d, divisor =%d\n",
++		       kgdb_version,
++		       port,
++		       gdb_async_irq, gdb_async_info->state->custom_divisor);
++	}
++	local_irq_save(flags);
++#ifdef TEST_EXISTANCE
++	/* Existance test */
++	/* Should not need all this, but just in case.... */
++
++	scratch = inb_p(port + UART_IER);
++	outb_px(port + UART_IER, 0);
++	outb_px(0xff, 0x080);
++	scratch2 = inb_p(port + UART_IER);
++	outb_px(port + UART_IER, scratch);
++	if (scratch2) {
++		printk
++		    ("gdb_hook_interrupt: Could not clear IER, not a UART!\n");
++		local_irq_restore(flags);
++		return 1;	/* We failed; there's nothing here */
++	}
++	scratch2 = inb_p(port + UART_LCR);
++	outb_px(port + UART_LCR, 0xBF);	/* set up for StarTech test */
++	outb_px(port + UART_EFR, 0);	/* EFR is the same as FCR */
++	outb_px(port + UART_LCR, 0);
++	outb_px(port + UART_FCR, UART_FCR_ENABLE_FIFO);
++	scratch = inb_p(port + UART_IIR) >> 6;
++	if (scratch == 1) {
++		printk("gdb_hook_interrupt: Undefined UART type!"
++		       "  Not a UART! \n");
++		local_irq_restore(flags);
++		return 1;
++	} else {
++		dbprintk(("gdb_hook_interrupt: UART type "
++			  "is %d where 0=16450, 2=16550 3=16550A\n", scratch));
++	}
++	scratch = inb_p(port + UART_MCR);
++	outb_px(port + UART_MCR, UART_MCR_LOOP | scratch);
++	outb_px(port + UART_MCR, UART_MCR_LOOP | 0x0A);
++	scratch2 = inb_p(port + UART_MSR) & 0xF0;
++	outb_px(port + UART_MCR, scratch);
++	if (scratch2 != 0x90) {
++		printk("gdb_hook_interrupt: "
++		       "Loop back test failed! Not a UART!\n");
++		local_irq_restore(flags);
++		return scratch2 + 1000;	/* force 0 to fail */
++	}
++#endif				/* test existance */
++	program_uart(info);
++	local_irq_restore(flags);
++
++	return (0);
++
++}				/* gdb_hook_interrupt */
++
++static void
++program_uart(struct async_struct *info)
++{
++	int port = info->port;
++
++	(void) inb_p(port + UART_RX);
++	outb_px(port + UART_IER, 0);
++
++	(void) inb_p(port + UART_RX);	/* serial driver comments say */
++	(void) inb_p(port + UART_IIR);	/* this clears the interrupt regs */
++	(void) inb_p(port + UART_MSR);
++	outb_px(port + UART_LCR, UART_LCR_WLEN8 | UART_LCR_DLAB);
++	outb_px(port + UART_DLL, info->state->custom_divisor & 0xff);	/* LS */
++	outb_px(port + UART_DLM, info->state->custom_divisor >> 8);	/* MS  */
++	outb_px(port + UART_MCR, info->MCR);
++
++	outb_px(port + UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1 | UART_FCR_CLEAR_XMIT | UART_FCR_CLEAR_RCVR);	/* set fcr */
++	outb_px(port + UART_LCR, UART_LCR_WLEN8);	/* reset DLAB */
++	outb_px(port + UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1);	/* set fcr */
++	if (!ints_disabled) {
++		intprintk(("KGDB: Sending %d to port %x offset %d\n",
++			   gdb_async_info->IER,
++			   (int) gdb_async_info->port, UART_IER));
++		outb_px(gdb_async_info->port + UART_IER, gdb_async_info->IER);
++	}
++	return;
++}
++
++/*
++ * getDebugChar
++ *
++ * This is a GDB stub routine.	It waits for a character from the
++ * serial interface and then returns it.  If there is no serial
++ * interface connection then it returns a bogus value which will
++ * almost certainly cause the system to hang.  In the 
++ */
++int kgdb_in_isr = 0;
++int kgdb_in_lsr = 0;
++extern spinlock_t kgdb_spinlock;
++
++/* Caller takes needed protections */
++
++int
++getDebugChar(void)
++{
++	volatile int chr, dum, time, end_time;
++
++	dbprintk(("getDebugChar(port %x): ", gdb_async_info->port));
++
++	if (gdb_async_info == NULL) {
++		gdb_hook_interrupt(&local_info, 0);
++	}
++	/* 
++	 * This trick says if we wait a very long time and get
++	 * no char, return the -1 and let the upper level deal
++	 * with it.
++	 */
++	rdtsc(dum, time);
++	end_time = time + 2;
++	while (((chr = read_char(gdb_async_info)) == -1) &&
++	       (end_time - time) > 0) {
++		rdtsc(dum, time);
++	};
++	/*
++	 * This covers our butts if some other code messes with
++	 * our uart, hay, it happens :o)
++	 */
++	if (chr == -1)
++		program_uart(gdb_async_info);
++
++	dbprintk(("%c\n", chr > ' ' && chr < 0x7F ? chr : ' '));
++	return (chr);
++
++}				/* getDebugChar */
++
++static int count = 3;
++static spinlock_t one_at_atime = SPIN_LOCK_UNLOCKED;
++
++static int __init
++kgdb_enable_ints(void)
++{
++	if (gdb_async_info == NULL) {
++		gdb_hook_interrupt(&local_info, 1);
++	}
++	ok_to_enable_ints = 1;
++	kgdb_enable_ints_now();
++#ifdef CONFIG_KGDB_USER_CONSOLE
++	kgdb_console_finit();
++#endif
++	return 0;
++}
++
++#ifdef CONFIG_SERIAL_8250
++void shutdown_for_kgdb(struct async_struct *gdb_async_info);
++#endif
++
++#ifdef CONFIG_DISCONTIGMEM
++static inline int kgdb_mem_init_done(void)
++{
++	return highmem_start_page != NULL;
++}
++#else
++static inline int kgdb_mem_init_done(void)
++{
++	return max_mapnr != 0;
++}
++#endif
++
++static void
++kgdb_enable_ints_now(void)
++{
++	if (!spin_trylock(&one_at_atime))
++		return;
++	if (!ints_disabled)
++		goto exit;
++	if (kgdb_mem_init_done() &&
++			ints_disabled) {	/* don't try till mem init */
++#ifdef CONFIG_SERIAL_8250
++		/*
++		 * The ifdef here allows the system to be configured
++		 * without the serial driver.
++		 * Don't make it a module, however, it will steal the port
++		 */
++		shutdown_for_kgdb(gdb_async_info);
++#endif
++		ints_disabled = request_irq(gdb_async_info->state->irq,
++					    gdb_interrupt,
++					    IRQ_T(gdb_async_info),
++					    "KGDB-stub", NULL);
++		intprintk(("KGDB: request_irq returned %d\n", ints_disabled));
++	}
++	if (!ints_disabled) {
++		intprintk(("KGDB: Sending %d to port %x offset %d\n",
++			   gdb_async_info->IER,
++			   (int) gdb_async_info->port, UART_IER));
++		outb_px(gdb_async_info->port + UART_IER, gdb_async_info->IER);
++	}
++      exit:
++	spin_unlock(&one_at_atime);
++}
++
++/*
++ * putDebugChar
++ *
++ * This is a GDB stub routine.	It waits until the interface is ready
++ * to transmit a char and then sends it.  If there is no serial
++ * interface connection then it simply returns to its caller, having
++ * pretended to send the char.	Caller takes needed protections.
++ */
++void
++putDebugChar(int chr)
++{
++	dbprintk(("putDebugChar(port %x): chr=%02x '%c', ints_on=%d\n",
++		  gdb_async_info->port,
++		  chr,
++		  chr > ' ' && chr < 0x7F ? chr : ' ', ints_disabled ? 0 : 1));
++
++	if (gdb_async_info == NULL) {
++		gdb_hook_interrupt(&local_info, 0);
++	}
++
++	write_char(gdb_async_info, chr);	/* this routine will wait */
++	count = (chr == '#') ? 0 : count + 1;
++	if ((count == 2)) {	/* try to enable after */
++		if (ints_disabled & ok_to_enable_ints)
++			kgdb_enable_ints_now();	/* try to enable after */
++
++		/* We do this a lot because, well we really want to get these
++		 * interrupts.	The serial driver will clear these bits when it
++		 * initializes the chip.  Every thing else it does is ok, 
++		 * but this.
++		 */
++		if (!ints_disabled) {
++			outb_px(gdb_async_info->port + UART_IER,
++				gdb_async_info->IER);
++		}
++	}
++
++}				/* putDebugChar */
++
++module_init(kgdb_enable_ints);
+diff -puN arch/i386/lib/Makefile~kgdb-ga arch/i386/lib/Makefile
+--- 25/arch/i386/lib/Makefile~kgdb-ga	2003-06-25 23:14:17.000000000 -0700
++++ 25-akpm/arch/i386/lib/Makefile	2003-06-25 23:14:17.000000000 -0700
+@@ -9,4 +9,5 @@ lib-y = checksum.o delay.o \
+ 
+ lib-$(CONFIG_X86_USE_3DNOW) += mmx.o
+ lib-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o
++lib-$(CONFIG_KGDB) += kgdb_serial.o
+ lib-$(CONFIG_DEBUG_IOVIRT)  += iodebug.o
+diff -puN arch/i386/Makefile~kgdb-ga arch/i386/Makefile
+--- 25/arch/i386/Makefile~kgdb-ga	2003-06-25 23:14:17.000000000 -0700
++++ 25-akpm/arch/i386/Makefile	2003-06-25 23:14:17.000000000 -0700
+@@ -85,6 +85,9 @@ mcore-$(CONFIG_X86_ES7000)	:= mach-es700
+ # default subarch .h files
+ mflags-y += -Iinclude/asm-i386/mach-default
+ 
++mflags-$(CONFIG_KGDB) += -g
++mflags-$(CONFIG_KGDB_MORE) += $(shell echo $(CONFIG_KGDB_OPTIONS) | sed -e 's/"//g')
++
+ head-y := arch/i386/kernel/head.o arch/i386/kernel/init_task.o
+ 
+ libs-y 					+= arch/i386/lib/
+diff -puN arch/i386/mm/fault.c~kgdb-ga arch/i386/mm/fault.c
+--- 25/arch/i386/mm/fault.c~kgdb-ga	2003-06-25 23:14:17.000000000 -0700
++++ 25-akpm/arch/i386/mm/fault.c	2003-06-25 23:14:17.000000000 -0700
+@@ -236,6 +236,12 @@ no_context:
+  * Oops. The kernel tried to access some bad page. We'll have to
+  * terminate things with extreme prejudice.
+  */
++#ifdef CONFIG_KGDB
++        if (!user_mode(regs)){
++                kgdb_handle_exception(14,SIGBUS, error_code, regs);
++                return;
++        }
++#endif
+ 
+ 	bust_spinlocks(1);
+ 
+diff -puN /dev/null Documentation/i386/kgdb/andthen
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25-akpm/Documentation/i386/kgdb/andthen	2003-06-25 23:14:17.000000000 -0700
+@@ -0,0 +1,100 @@
++
++define	set_andthen
++	set var $thp=0
++	set var $thp=(struct kgdb_and_then_struct *)&kgdb_data[0]
++	set var $at_size = (sizeof kgdb_data)/(sizeof *$thp)
++	set var $at_oc=kgdb_and_then_count
++	set var $at_cc=$at_oc
++end
++
++define andthen_next
++	set var $at_cc=$arg0
++end
++
++define andthen
++	andthen_set_edge
++	if ($at_cc >= $at_oc)
++		printf "Outside window.  Window size is %d\n",($at_oc-$at_low)
++	else
++		printf "%d: ",$at_cc
++		output *($thp+($at_cc++ % $at_size ))
++		printf "\n"
++	end
++end
++define andthen_set_edge
++	set var $at_oc=kgdb_and_then_count
++	set var $at_low = $at_oc - $at_size
++	if ($at_low < 0 )
++		set var $at_low = 0
++	end
++	if (( $at_cc > $at_oc) || ($at_cc < $at_low))
++		printf "Count outside of window, setting count to "
++		if ($at_cc >= $at_oc)
++			set var $at_cc = $at_oc
++		else
++			set var $at_cc = $at_low
++		end
++		printf "%d\n",$at_cc
++	end
++end
++
++define beforethat
++	andthen_set_edge
++	if ($at_cc <= $at_low)
++		printf "Outside window.  Window size is %d\n",($at_oc-$at_low)
++	else
++		printf "%d: ",$at_cc-1
++		output *($thp+(--$at_cc % $at_size ))
++		printf "\n"
++	end
++end
++
++document andthen_next
++	andthen_next <count>
++	.	sets the number of the event to display next. If this event
++	.	is not in the event pool, either andthen or beforethat will
++	.	correct it to the nearest event pool edge.  The event pool
++	.	ends at the last event recorded and begins <number of events>
++	.	prior to that.  If beforethat is used next, it will display
++	.	event <count> -1.
++.
++	andthen commands are: set_andthen, andthen_next, andthen and beforethat
++end
++	
++			
++document andthen
++	andthen 
++.	displays the next event in the list.  <set_andthen> sets up to display
++.	the oldest saved event first. 
++.	<count> (optional) count of the event to display.
++.	note the number of events saved is specified at configure time.
++.	if events are saved between calls to andthen the index will change
++.	but the displayed event will be the next one (unless the event buffer
++.	is overrun).
++.
++.	andthen commands are: set_andthen, andthen_next, andthen and beforethat
++end
++
++document set_andthen
++	set_andthen
++.	sets up to use the <andthen> and <beforethat> commands. 
++.		if you have defined your own struct, use the above and
++.		then enter the following:
++.		p $thp=(struct kgdb_and_then_structX *)&kgdb_data[0]
++.		where <kgdb_and_then_structX> is the name of your structure.
++.
++.	andthen commands are: set_andthen, andthen_next, andthen and beforethat
++end
++
++document beforethat
++	beforethat 
++.	displays the next prior event in the list. <set_andthen> sets up to
++.	display the last occuring event first.
++.
++.	note the number of events saved is specified at configure time.
++.	if events are saved between calls to beforethat the index will change
++.	but the displayed event will be the next one (unless the event buffer
++.	is overrun).
++.
++.	andthen commands are: set_andthen, andthen_next, andthen and beforethat
++end
+diff -puN /dev/null Documentation/i386/kgdb/debug-nmi.txt
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25-akpm/Documentation/i386/kgdb/debug-nmi.txt	2003-06-25 23:14:17.000000000 -0700
+@@ -0,0 +1,37 @@
++Subject: Debugging with NMI
++Date: Mon, 12 Jul 1999 11:28:31 -0500
++From: David Grothe <dave@gcom.com>
++Organization: Gcom, Inc
++To: David Grothe <dave@gcom.com>
++
++Kernel hackers:
++
++Maybe this is old hat, but it is new to me --
++
++On an ISA bus machine, if you short out the A1 and B1 pins of an ISA
++slot you will generate an NMI to the CPU.  This interrupts even a
++machine that is hung in a loop with interrupts disabled.  Used in
++conjunction with kgdb <
++ftp://ftp.gcom.com/pub/linux/src/kgdb-2.3.35/kgdb-2.3.35.tgz > you can
++gain debugger control of a machine that is hung in the kernel!  Even
++without kgdb the kernel will print a stack trace so you can find out
++where it was hung.
++
++The A1/B1 pins are directly opposite one another and the farthest pins
++towards the bracket end of the ISA bus socket.  You can stick a paper
++clip or multi-meter probe between them to short them out.
++
++I had a spare ISA bus to PC104 bus adapter around.  The PC104 end of the
++board consists of two rows of wire wrap pins.  So I wired a push button
++between the A1/B1 pins and now have an ISA board that I can stick into
++any ISA bus slot for debugger entry.
++
++Microsoft has a circuit diagram of a PCI card at
++http://www.microsoft.com/hwdev/DEBUGGING/DMPSW.HTM.  If you want to
++build one you will have to mail them and ask for the PAL equations.
++Nobody makes one comercially.
++
++[THIS TIP COMES WITH NO WARRANTY WHATSOEVER.  It works for me, but if
++your machine catches fire, it is your problem, not mine.]
++
++-- Dave (the kgdb guy)
+diff -puN /dev/null Documentation/i386/kgdb/gdb-globals.txt
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25-akpm/Documentation/i386/kgdb/gdb-globals.txt	2003-06-25 23:14:17.000000000 -0700
+@@ -0,0 +1,71 @@
++Sender: akale@veritas.com
++Date: Fri, 23 Jun 2000 19:26:35 +0530
++From: "Amit S. Kale" <akale@veritas.com>
++Organization: Veritas Software (India)
++To: Dave Grothe <dave@gcom.com>, linux-kernel@vger.rutgers.edu
++CC: David Milburn <dmilburn@wirespeed.com>,
++        "Edouard G. Parmelan" <Edouard.Parmelan@quadratec.fr>,
++        ezannoni@cygnus.com, Keith Owens <kaos@ocs.com.au>
++Subject: Re: Module debugging using kgdb
++
++Dave Grothe wrote:
++> 
++> Amit:
++> 
++> There is a 2.4.0 version of kgdb on our ftp site:
++> ftp://ftp.gcom.com/pub/linux/src/kgdb.  I mirrored your version of gdb
++> and loadmodule.sh there.
++> 
++> Have a look at the README file and see if I go it right.  If not, send
++> me some corrections and I will update it.
++> 
++> Does your version of gdb solve the global variable problem?
++
++Yes. 
++Thanks to Elena Zanoni, gdb (developement version) can now calculate 
++correctly addresses  of dynamically loaded object files. I have not been 
++following gdb developement for sometime and am not sure when symbol
++address calculation fix is going to appear in a gdb stable version.
++
++Elena, any idea when the fix will make it to a prebuilt gdb from a
++redhat release?
++
++For the time being I have built a gdb developement version. It can be
++used for module debugging with loadmodule.sh script.
++
++The problem with calculating of module addresses with previous versions
++of gdb was as follows:
++gdb did not use base address of a section while calculating address of
++a symbol in the section in an object file loaded via 'add-symbol-file'. 
++It used address of .text segment instead. Due to this addresses of
++symbols in .data, .bss etc. (e.g. global variables) were calculated incorrectly.
++
++Above mentioned fix allow gdb to use base address of a segment while
++calculating address of a symbol in it. It adds a parameter '-s' to
++'add-symbol-file' command for specifying base address of a segment.
++
++loadmodule.sh script works as follows.
++
++1. Copy a module file to target machine.
++2. Load the module on the target machine using insmod with -m parameter.
++insmod produces a module load map which contains base addresses of all
++sections in the module and addresses of symbols in the module file.
++3. Find all sections and their base addresses in the module from 
++the module map.
++4. Generate a script that loads the module file. The script uses
++'add-symbol-file' and specifies address of text segment followed by
++addresses of all segments in the module.
++
++Here is an example gdb script produced by loadmodule.sh script.
++
++add-symbol-file foo 0xd082c060 -s .text.lock 0xd08cbfb5 
++-s .fixup 0xd08cfbdf -s .rodata 0xd08cfde0 -s __ex_table 0xd08e3b38 
++-s .data 0xd08e3d00 -s .bss 0xd08ec8c0 -s __ksymtab 0xd08ee838
++
++With this command gdb can calculate addresses of symbols in ANY segment
++in a module file.
++
++Regards.
++-- 
++Amit Kale
++Veritas Software ( http://www.veritas.com )
+diff -puN /dev/null Documentation/i386/kgdb/gdbinit
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25-akpm/Documentation/i386/kgdb/gdbinit	2003-06-25 23:14:17.000000000 -0700
+@@ -0,0 +1,14 @@
++shell echo -e "\003" >/dev/ttyS0
++set remotebaud 38400
++target remote /dev/ttyS0
++define si
++stepi
++printf "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n", $eax, $ebx, $ecx, $edx
++printf "ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n", $esi, $edi, $ebp, $esp
++x/i $eip
++end
++define ni
++nexti
++printf "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n", $eax, $ebx, $ecx, $edx
++printf "ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n", $esi, $edi, $ebp, $esp
++x/i $eip
+diff -puN /dev/null Documentation/i386/kgdb/gdbinit.hw
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25-akpm/Documentation/i386/kgdb/gdbinit.hw	2003-06-25 23:14:17.000000000 -0700
+@@ -0,0 +1,117 @@
++
++#Using ia-32 hardware breakpoints.
++#
++#4 hardware breakpoints are available in ia-32 processors. These breakpoints
++#do not need code modification. They are set using debug registers.
++#
++#Each hardware breakpoint can be of one of the
++#three types: execution, write, access.
++#1. An Execution breakpoint is triggered when code at the breakpoint address is
++#executed.
++#2. A write breakpoint ( aka watchpoints ) is triggered when memory location
++#at the breakpoint address is written.
++#3. An access breakpoint is triggered when memory location at the breakpoint
++#address is either read or written.
++#
++#As hardware breakpoints are available in limited number, use software
++#breakpoints ( br command in gdb ) instead of execution hardware breakpoints.
++#
++#Length of an access or a write breakpoint defines length of the datatype to
++#be watched. Length is 1 for char, 2 short , 3 int.
++#
++#For placing execution, write and access breakpoints, use commands
++#hwebrk, hwwbrk, hwabrk
++#To remove a breakpoint use hwrmbrk command.
++#
++#These commands take following types of arguments. For arguments associated
++#with each command, use help command.
++#1. breakpointno: 0 to 3
++#2. length: 1 to 3
++#3. address: Memory location in hex ( without 0x ) e.g c015e9bc
++#
++#Use the command exinfo to find which hardware breakpoint occured.
++
++#hwebrk breakpointno address
++define hwebrk
++	maintenance packet Y$arg0,0,0,$arg1
++end
++document hwebrk
++	hwebrk <breakpointno> <address>
++	Places a hardware execution breakpoint
++	<breakpointno> = 0 - 3
++	<address> = Hex digits without leading "0x".
++end
++
++#hwwbrk breakpointno length address
++define hwwbrk
++	maintenance packet Y$arg0,1,$arg1,$arg2
++end
++document hwwbrk
++	hwwbrk <breakpointno> <length> <address>
++	Places a hardware write breakpoint
++	<breakpointno> = 0 - 3
++	<length> = 1 (1 byte), 2 (2 byte), 3 (4 byte)
++	<address> = Hex digits without leading "0x".
++end
++
++#hwabrk breakpointno length address
++define hwabrk
++	maintenance packet Y$arg0,1,$arg1,$arg2
++end
++document hwabrk
++	hwabrk <breakpointno> <length> <address>
++	Places a hardware access breakpoint
++	<breakpointno> = 0 - 3
++	<length> = 1 (1 byte), 2 (2 byte), 3 (4 byte)
++	<address> = Hex digits without leading "0x".
++end
++
++#hwrmbrk breakpointno
++define hwrmbrk
++	maintenance packet y$arg0
++end
++document hwrmbrk
++	hwrmbrk <breakpointno>
++	<breakpointno> = 0 - 3
++	Removes a hardware breakpoint
++end
++
++define reboot
++        maintenance packet r
++end
++#exinfo 
++define exinfo
++	maintenance packet qE
++end
++document exinfo
++	exinfo 
++	Gives information about a breakpoint.
++end
++define get_th
++	p $th=(struct thread_info *)((int)$esp & ~8191)
++end
++document get_th
++	get_tu
++	Gets and prints the current thread_info pointer, Defines th to be it.
++end
++define get_cu
++	p $cu=(struct thread_info *)((int)$esp & ~8191)->task
++end
++document get_cu
++	get_cu
++	Gets and print the "current" value.  Defines $cu to be it.
++end
++define int_off
++	set var $flags=$eflags
++	set $eflags=$eflags&~0x200
++	end
++define int_on
++	set var $eflags|=$flags&0x200
++	end
++document int_off
++	saves the current interrupt state and clears the processor interrupt 
++	flag.  Use int_on to restore the saved flag.
++end
++document int_on
++	Restores the interrupt flag saved by int_off.
++end
+diff -puN /dev/null Documentation/i386/kgdb/gdbinit-modules
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25-akpm/Documentation/i386/kgdb/gdbinit-modules	2003-06-25 23:14:17.000000000 -0700
+@@ -0,0 +1,146 @@
++#
++# Usefull GDB user-command to debug Linux Kernel Modules with gdbstub.
++#
++# This don't work for Linux-2.0 or older.
++#
++# Author Edouard G. Parmelan <Edouard.Parmelan@quadratec.fr>
++#
++#
++# Fri Apr 30 20:33:29 CEST 1999
++#   First public release.
++#
++#   Major cleanup after experiment Linux-2.0 kernel without success.
++#   Symbols of a module are not in the correct order, I can't explain
++#   why :(
++#
++# Fri Mar 19 15:41:40 CET 1999
++#   Initial version.
++#
++# Thu Jan  6 16:29:03 CST 2000
++#   A little fixing by Dave Grothe <dave@gcom.com>
++#
++# Mon Jun 19 09:33:13 CDT 2000
++#   Alignment changes from Edouard Parmelan
++#
++# The basic idea is to find where insmod load the module and inform
++# GDB to load the symbol table of the module with the GDB command 
++# ``add-symbol-file <object> <address>''.
++#
++# The Linux kernel holds the list of all loaded modules in module_list,
++# this list end with &kernel_module (exactly with module->next == NULL,
++# but the last module is not a real module).
++#
++# Insmod allocates the struct module before the object file.  Since
++# Linux-2.1, this structure contain his size.  The real address of
++# the object file is then (char*)module + module->size_of_struct.
++#
++# You can use three user functions ``mod-list'', ``mod-print-symbols''
++# and ``add-module-symbols''.
++#
++# mod-list list all loaded modules with the format:
++#    <module-address> <module-name>
++#
++# As soon as you have found the address of your module, you can
++# print its exported symbols (mod-print-symbols) or inform GDB to add
++# symbols from your module file (mod-add-symbols).
++#
++# The argument that you give to mod-print-symbols or mod-add-symbols
++# is the <module-address> from the mod-list command.
++#
++# When using the mod-add-symbols command you must also give the full
++# pathname of the modules object code file.
++#
++# The command mod-add-lis is an example of how to make this easier.
++# You can edit this macro to contain the path name of your own
++# favorite module and then use it as a shorthand to load it.  You
++# still need the module-address, however.
++#
++# The internal function ``mod-validate'' set the GDB variable $mod
++# as a ``struct module*'' if the kernel known the module otherwise
++# $mod is set to NULL.  This ensure to not add symbols for a wrong
++# address.
++# 
++# Have a nice hacking day !
++#
++#
++define mod-list
++    set $mod = (struct module*)module_list
++    # the last module is the kernel, ignore it
++    while $mod != &kernel_module
++    	printf "%p\t%s\n", (long)$mod, ($mod)->name
++	set $mod = $mod->next
++    end
++end
++document mod-list
++List all modules in the form: <module-address> <module-name>
++Use the <module-address> as the argument for the other
++mod-commands: mod-print-symbols, mod-add-symbols.
++end
++
++define mod-validate
++    set $mod = (struct module*)module_list
++    while ($mod != $arg0) && ($mod != &kernel_module)
++    	set $mod = $mod->next
++    end
++    if $mod == &kernel_module
++	set $mod = 0
++    	printf "%p is not a module\n", $arg0
++    end
++end
++document mod-validate
++mod-validate <module-address>
++Internal user-command used to validate the module parameter.
++If <module> is a real loaded module, set $mod to it otherwise set $mod to 0.
++end
++
++
++define mod-print-symbols
++    mod-validate $arg0
++    if $mod != 0
++	set $i = 0
++	while $i < $mod->nsyms
++	    set $sym = $mod->syms[$i]
++	    printf "%p\t%s\n", $sym->value, $sym->name
++	    set $i = $i + 1
++	end
++    end
++end
++document mod-print-symbols
++mod-print-symbols <module-address>
++Print all exported symbols of the module.  see mod-list
++end
++
++
++define mod-add-symbols-align
++    mod-validate $arg0
++    if $mod != 0
++	set $mod_base = ($mod->size_of_struct + (long)$mod)
++	if ($arg2 != 0) && (($mod_base & ($arg2 - 1)) != 0)
++	    set $mod_base = ($mod_base | ($arg2 - 1)) + 1
++	end
++	add-symbol-file $arg1 $mod_base
++    end
++end
++document mod-add-symbols-align
++mod-add-symbols-align <module-address> <object file path name> <align>
++Load the symbols table of the module from the object file where
++first section aligment is <align>.
++To retreive alignment, use `objdump -h <object file path name>'.
++end
++
++define mod-add-symbols
++    mod-add-symbols-align $arg0 $arg1 sizeof(long)
++end
++document mod-add-symbols
++mod-add-symbols <module-address> <object file path name>
++Load the symbols table of the module from the object file.
++Default alignment is 4.  See mod-add-symbols-align.
++end
++
++define mod-add-lis
++    mod-add-symbols-align $arg0 /usr/src/LiS/streams.o 16
++end
++document mod-add-lis
++mod-add-lis <module-address>
++Does mod-add-symbols <module-address> /usr/src/LiS/streams.o
++end
+diff -puN /dev/null Documentation/i386/kgdb/kgdb.txt
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25-akpm/Documentation/i386/kgdb/kgdb.txt	2003-06-25 23:14:17.000000000 -0700
+@@ -0,0 +1,715 @@
++Last edit: <20030506.1615.42>
++This file has information specific to the i386 kgdb option.  Other
++platforms with the kgdb option may behave in a similar fashion.
++
++New features: 
++============
++20030505.1827.27
++We are starting to align with the sourceforge version, at least in 
++commands.  To this end, the boot command sting to start kgdb at
++boot time has been changed from "kgdb" to "gdb".
++
++Andrew Morton sent a couple of patchs which are now included as follows:
++1.) We now return a flag to the interrupt handler.
++2.) We no longer use smp_num_cpus (a conflict with the lock meter).
++3.) And from William Lee Irwin III <wli@holomorphy.com> code to make
++    sure high-mem is set up before we attempt to register our interrupt
++    handler.
++We now include asm/kgdb.h from config.h so you will most likely never
++have to include it.  It also 'NULLS' the kgdb macros you might have in
++your code when CONFIG_KGDB is not defined.  This allows you to just
++turn off CONFIG_KGDB to turn off all the kgdb_ts() calls and such.
++This include is conditioned on the machine being an x86 so as to not
++mess with other archs.
++
++20020801.1129.03
++This is currently the version for the 2.4.18 (and beyond?) kernel.
++
++We have several new "features" beginning with this version:
++ 
++1.) Kgdb now syncs the "other" cpus with a cross cpu NMI.  No more
++    waiting and it will pull that guy out of an irq off spin lock :)
++
++2.) We doctored up the code that tells where a task is waiting and
++    included it so that the "info thread" command will show a bit more
++    than "schedule()".  Try it...
++
++3.) Added the ability to call a function from gdb.  All the standard gdb
++    issues apply, i.e. if you hit a break point in the function you are
++    not allowed to call another (gdb limitation, not kgdb).  T0 help
++    this capability we added a memory allocation function.  Gdb does not
++    return this memory (it is used for stings you pass to that function
++    you are calling from gdb) so we fixed up a way to allow you to
++    manually return the memory (see below).
++
++4.) Kgdb time stamps (kgdb_ts()) are enhanced to expand what was the
++    interrupt flag to now also include the preemption count and the
++    "in_interrupt" info.  The flag is now called "with_pif" to indicate
++    the order, preempt_count, in_interrupt, flag.  The preempt_count is
++    shifted left by 4 bits so you can read the count in hex by dropping
++    the low order digit.  In_interrupt is in bit 1, and the flag is in
++    bit 0.
++
++5.) The command: "p kgdb_info" is now expanded and prints something
++    like:
++(gdb) p kgdb_info
++$2 = {used_malloc = 0, called_from = 0xc0107506, entry_tsc = 67468627259, 
++  errcode = 0, vector = 3, print_debug_info = 0, hold_on_sstep = 1, 
++  cpus_waiting = {{task = 0xc027a000, pid = 32768, hold = 0, 
++      regs = 0xc027bf84}, {task = 0x0, pid = 0, hold = 0, regs = 0x0}}}
++    
++    Things to note here: a.) used_malloc is the amount of memory that
++    has been malloc'ed to do calls from gdb.  You can reclaim this
++    memory like this: "p kgdb_info.used_malloc=0" Cool, huh?  b.)
++    cpus_waiting is now "sized" by the number of cpus you enter at
++    configure time in the kgdb configure section.  This is NOT used any
++    where else in the system, but it is "nice" here.  c.)  The tasks
++    "pid" is now in the structure.  This is the pid you will need to use
++    to decode to the thread id to get gdb to look at that thread.
++    Remember that the "info thread" command prints a list of threads
++    where in it numbers each thread with its reference number followed
++    by the threads pid.  Note that the per cpu idle threads actually
++    have pids of 0 (yes there is more than one pid 0 in an SMP system).
++    To avoid confusion, kgdb numbers these threads with numbers beyond
++    the MAX_PID.  That is why you see 32768 above.
++
++6.) A subtle change, we now provide the complete register set for tasks
++    that are active on the other cpus.  This allows better trace back on
++    those tasks.
++
++    And, lets mention what we could not fix.  Back-trace from all but the
++    thread that we trapped will, most likely, have a bogus entry in it.
++    The problem is that gdb does not recognize the entry code for
++    functions that use "current" near (at all?) the entry.  The compiler
++    is putting the "current" decode as the first two instructions of the
++    function where gdb expects to find %ebp changing code.  Back trace
++    also has trouble with interrupt frames.  I am talking with Daniel
++    Jacobowitz about some way to fix this, but don't hold your breath.
++
++20011220.0050.35
++Major enhancement with this version is the ability to hold one or more
++cpus in an SMP system while allowing the others to continue.  Also, by
++default only the current cpu is enabled on single step commands (please
++note that gdb issues single step commands at times other than when you
++use the si command).
++ 
++Another change is to collect some useful information in
++a global structure called "kgdb_info".  You should be able to just:
++
++p kgdb_info
++
++although I have seen cases where the first time this is done gdb just
++prints the first member but prints the whole structure if you then enter
++CR (carriage return or enter).  This also works:
++
++p *&kgdb_info
++
++Here is a sample:
++(gdb) p kgdb_info
++$4 = {called_from = 0xc010732c, entry_tsc = 32804123790856, errcode = 0, 
++  vector = 3, print_debug_info = 0}
++
++"Called_from" is the return address from the current entry into kgdb.  
++Sometimes it is useful to know why you are in kgdb, for example, was 
++it an NMI or a real break point?  The simple way to interrogate this 
++return address is:
++
++l *0xc010732c
++
++which will print the surrounding few lines of source code.
++
++"Entry_tsc" is the cpu TSC on entry to kgdb (useful to compare to the
++kgdb_ts entries).
++
++"errcode" and "vector" are other entry parameters which may be helpful on
++some traps.
++
++"print_debug_info" is the internal debugging kgdb print enable flag.  Yes,
++you can modify it.
++
++In SMP systems kgdb_info also includes the "cpus_waiting" structure and
++"hold_on_step": 
++
++(gdb) p kgdb_info
++$7 = {called_from = 0xc0112739, entry_tsc = 1034936624074, errcode = 0, 
++  vector = 2, print_debug_info = 0, hold_on_sstep = 1, cpus_waiting = {{
++      task = 0x0, hold = 0, regs = 0x0}, {task = 0xc71b8000, hold = 0, 
++      regs = 0xc71b9f70}, {task = 0x0, hold = 0, regs = 0x0}, {task = 0x0, 
++      hold = 0, regs = 0x0}, {task = 0x0, hold = 0, regs = 0x0}, {task = 0x0, 
++      hold = 0, regs = 0x0}, {task = 0x0, hold = 0, regs = 0x0}, {task = 0x0, 
++      hold = 0, regs = 0x0}}}
++
++"Cpus_waiting" has an entry for each cpu other than the current one that 
++has been stopped.  Each entry contains the task_struct address for that
++cpu, the address of the regs for that task and a hold flag.  All these
++have the proper typing so that, for example:
++
++p *kgdb_info.cpus_waiting[1].regs
++
++will print the registers for cpu 1.
++
++"Hold_on_sstep" is a new feature with this version and comes up set or
++true.  What is means is that whenever kgdb is asked to single step all
++other cpus are held (i.e. not allowed to execute).  The flag applies to
++all but the current cpu and, again, can be changed:
++
++p kgdb_info.hold_on_sstep=0
++
++restores the old behavior of letting all cpus run during single stepping.
++
++Likewise, each cpu has a "hold" flag, which if set, locks that cpu out
++of execution.  Note that this has some risk in cases where the cpus need
++to communicate with each other.  If kgdb finds no cpu available on exit,
++it will push a message thru gdb and stay in kgdb.  Note that it is legal
++to hold the current cpu as long as at least one cpu can execute.
++
++20010621.1117.09
++This version implements an event queue.  Events are signaled by calling
++a function in the kgdb stub and may be examined from gdb.  See EVENTS 
++below for details.  This version also tighten up the interrupt and SMP
++handling to not allow interrupts on the way to kgdb from a breakpoint 
++trap.  It is fine to allow these interrupts for user code, but not
++system debugging.
++
++Version
++=======
++
++This version of the kgdb package was developed and tested on
++kernel version 2.4.16.  It will not install on any earlier kernels.  
++It is possible that it will continue to work on later versions
++of 2.4 and then versions of 2.5 (I hope).
++
++
++Debugging Setup
++===============
++
++Designate one machine as the "development" machine.  This is the
++machine on which you run your compiles and which has your source
++code for the kernel.  Designate a second machine as the "target"
++machine.  This is the machine that will run your experimental
++kernel.
++
++The two machines will be connected together via a serial line out
++one or the other of the COM ports of the PC.  You will need a modem
++eliminator and the appropriate cables.
++
++Decide on which tty port you want the machines to communicate, then
++cable them up back-to-back using the null modem.  COM1 is /dev/ttyS0 and
++COM2 is /dev/ttyS1. You should test this connection with the two
++machines prior to trying to debug a kernel.  Once you have it working,
++on the TARGET machine, enter:
++
++setserial /dev/ttyS0 (or what ever tty you are using)
++
++and record the port and the irq addresses. 
++
++On the DEVELOPMENT machine you need to apply the patch for the kgdb
++hooks.  You have probably already done that if you are reading this
++file.
++
++On your DEVELOPMENT machine, go to your kernel source directory and do
++"make Xconfig" where X is one of "x", "menu", or "".  If you are
++configuring in the standard serial driver, it must not be a module.
++Either yes or no is ok, but making the serial driver a module means it
++will initialize after kgdb has set up the UART interrupt code and may
++cause a failure of the control C option discussed below.  The configure
++question for the serial driver is under the "Character devices" heading
++and is:
++
++"Standard/generic (8250/16550 and compatible UARTs) serial support"
++
++Go down to the kernel debugging menu item and open it up.  Enable the
++kernel kgdb stub code by selecting that item.  You can also choose to
++turn on the "-ggdb -O1" compile options.  The -ggdb causes the compiler
++to put more debug info (like local symbols) in the object file.  On the
++i386 -g and -ggdb are the same so this option just reduces to "O1".  The
++-O1 reduces the optimization level.  This may be helpful in some cases,
++be aware, however, that this may also mask the problem you are looking
++for.
++
++The baud rate.  Default is 115200.  What ever you choose be sure that
++the host machine is set to the same speed.  I recommend the default.
++
++The port.  This is the I/O address of the serial UART that you should
++have gotten using setserial as described above.  The standard com1 port
++(3f8) using irq 4 is default .  Com2 is 2f8 which by convention uses irq
++3.
++
++The port irq (see above).
++
++Stack overflow test.  This option makes a minor change in the trap,
++system call and interrupt code to detect stack overflow and transfer
++control to kgdb if it happens.  (Some platforms have this in the base
++line code, but the i386 does not.)
++
++You can also configure the system to recognize the boot option
++"console=kgdb" which if given will cause all console output during
++booting to be put thru gdb as well as other consoles.  This option
++requires that gdb and kgdb be connected prior to sending console output
++so, if they are not, a breakpoint is executed to force the connection.
++This will happen before any kernel output (it is going thru gdb, right),
++and will stall the boot until the connection is made.
++
++You can also configure in a patch to SysRq to enable the kGdb SysRq.
++This request generates a breakpoint.  Since the serial port irq line is
++set up after any serial drivers, it is possible that this command will
++work when the control C will not.
++
++Save and exit the Xconfig program.  Then do "make clean" , "make dep"
++and "make bzImage" (or whatever target you want to make).  This gets the
++kernel compiled with the "-g" option set -- necessary for debugging.
++
++You have just built the kernel on your DEVELOPMENT machine that you
++intend to run on your TARGET machine.
++
++To install this new kernel, use the following installation procedure.
++Remember, you are on the DEVELOPMENT machine patching the kernel source
++for the kernel that you intend to run on the TARGET machine.
++
++Copy this kernel to your target machine using your usual procedures.  I
++usually arrange to copy development:
++/usr/src/linux/arch/i386/boot/bzImage to /vmlinuz on the TARGET machine
++via a LAN based NFS access.  That is, I run the cp command on the target
++and copy from the development machine via the LAN.  Run Lilo (see "man
++lilo" for details on how to set this up) on the new kernel on the target
++machine so that it will boot!  Then boot the kernel on the target
++machine.
++
++On the DEVELOPMENT machine, create a file called .gdbinit in the
++directory /usr/src/linux.  An example .gdbinit file looks like this:
++
++shell echo -e "\003" >/dev/ttyS0
++set remotebaud 38400 (or what ever speed you have chosen)
++target remote /dev/ttyS0
++
++
++Change the "echo" and "target" definition so that it specifies the tty
++port that you intend to use.  Change the "remotebaud" definition to
++match the data rate that you are going to use for the com line.
++
++You are now ready to try it out.
++
++Boot your target machine with "kgdb" in the boot command i.e. something
++like:
++
++lilo> test kgdb
++
++or if you also want console output thru gdb:
++
++lilo> test kgdb console=kgdb
++
++You should see the lilo message saying it has loaded the kernel and then
++all output stops.  The kgdb stub is trying to connect with gdb.  Start
++gdb something like this:
++
++
++On your DEVELOPMENT machine, cd /usr/src/linux and enter "gdb vmlinux".
++When gdb gets the symbols loaded it will read your .gdbinit file and, if
++everything is working correctly, you should see gdb print out a few
++lines indicating that a breakpoint has been taken.  It will actually
++show a line of code in the target kernel inside the kgdb activation
++code.
++
++The gdb interaction should look something like this:
++
++    linux-dev:/usr/src/linux# gdb vmlinux
++    GDB is free software and you are welcome to distribute copies of it
++     under certain conditions; type "show copying" to see the conditions.
++    There is absolutely no warranty for GDB; type "show warranty" for details.
++    GDB 4.15.1 (i486-slackware-linux), 
++    Copyright 1995 Free Software Foundation, Inc...
++    breakpoint () at i386-stub.c:750
++    750     }
++    (gdb) 
++
++You can now use whatever gdb commands you like to set breakpoints.
++Enter "continue" to start your target machine executing again.  At this
++point the target system will run at full speed until it encounters
++your breakpoint or gets a segment violation in the kernel, or whatever.
++
++If you have the kgdb console enabled when you continue, gdb will print
++out all the console messages.
++
++The above example caused a breakpoint relatively early in the boot
++process.  For the i386 kgdb it is possible to code a break instruction
++as the first C-language point in init/main.c, i.e. as the first instruction
++in start_kernel().  This could be done as follows:
++
++#include <asm/kgdb.h>
++	 breakpoint();
++
++This breakpoint() is really a function that sets up the breakpoint and
++single-step hardware trap cells and then executes a breakpoint.  Any
++early hard coded breakpoint will need to use this function.  Once the
++trap cells are set up they need not be set again, but doing it again
++does not hurt anything, so you don't need to be concerned about which
++breakpoint is hit first.  Once the trap cells are set up (and the kernel
++sets them up in due course even if breakpoint() is never called) the
++macro:
++
++BREAKPOINT;
++
++will generate an inline breakpoint.  This may be more useful as it stops
++the processor at the instruction instead of in a function a step removed
++from the location of interest.  In either case <asm/kgdb.h> must be
++included to define both breakpoint() and BREAKPOINT.
++
++Triggering kgdbstub at other times
++==================================
++
++Often you don't need to enter the debugger until much later in the boot
++or even after the machine has been running for some time.  Once the
++kernel is booted and interrupts are on, you can force the system to
++enter the debugger by sending a control C to the debug port. This is
++what the first line of the recommended .gdbinit file does.  This allows
++you to start gdb any time after the system is up as well as when the
++system is already at a break point.  (In the case where the system is
++already at a break point the control C is not needed, however, it will
++be ignored by the target so no harm is done.  Also note the the echo
++command assumes that the port speed is already set.  This will be true
++once gdb has connected, but it is best to set the port speed before you
++run gdb.)
++
++Another simple way to do this is to put the following file in you ~/bin
++directory:
++
++#!/bin/bash
++echo  -e "\003"  > /dev/ttyS0 
++
++Here, the ttyS0 should be replaced with what ever port you are using.
++The "\003" is control-C.  Once you are connected with gdb, you can enter
++control-C at the command prompt.
++
++An alternative way to get control to the debugger is to enable the kGdb
++SysRq command.  Then you would enter Alt-SysRq-g (all three keys at the
++same time, but push them down in the order given).  To refresh your
++memory of the available SysRq commands try Alt-SysRq-=.  Actually any
++undefined command could replace the "=", but I like to KNOW that what I
++am pushing will never be defined.
++ 
++Debugging hints
++===============
++
++You can break into the target machine at any time from the development
++machine by typing ^C (see above paragraph).  If the target machine has
++interrupts enabled this will stop it in the kernel and enter the
++debugger.
++
++There is unfortunately no way of breaking into the kernel if it is
++in a loop with interrupts disabled, so if this happens to you then
++you need to place exploratory breakpoints or printk's into the kernel
++to find out where it is looping.  The exploratory breakpoints can be
++entered either thru gdb or hard coded into the source.  This is very
++handy if you do something like:
++
++if (<it hurts>) BREAKPOINT;
++
++
++There is a copy of an e-mail in the Documentation/i386/kgdb/ directory
++(debug-nmi.txt) which describes how to create an NMI on an ISA bus
++machine using a paper clip.  I have a sophisticated version of this made
++by wiring a push button switch into a PC104/ISA bus adapter card.  The
++adapter card nicely furnishes wire wrap pins for all the ISA bus
++signals.
++
++When you are done debugging the kernel on the target machine it is a
++good idea to leave it in a running state.  This makes reboots faster,
++bypassing the fsck.  So do a gdb "continue" as the last gdb command if
++this is possible.  To terminate gdb itself on the development machine
++and leave the target machine running, first clear all breakpoints and
++continue, then type ^Z to suspend gdb and then kill it with "kill %1" or
++something similar.
++
++If gdbstub Does Not Work
++========================
++
++If it doesn't work, you will have to troubleshoot it.  Do the easy
++things first like double checking your cabling and data rates.  You
++might try some non-kernel based programs to see if the back-to-back
++connection works properly.  Just something simple like cat /etc/hosts
++>/dev/ttyS0 on one machine and cat /dev/ttyS0 on the other will tell you
++if you can send data from one machine to the other.  Make sure it works
++in both directions.  There is no point in tearing out your hair in the
++kernel if the line doesn't work.
++
++All of the real action takes place in the file
++/usr/src/linux/arch/i386/kernel/kgdb_stub.c.  That is the code on the target
++machine that interacts with gdb on the development machine.  In gdb you can
++turn on a debug switch with the following command:
++
++	set remotedebug
++
++This will print out the protocol messages that gdb is exchanging with
++the target machine.
++
++Another place to look is /usr/src/arch/i386/lib/kgdb_serial.c This is
++the code that talks to the serial port on the target side.  There might
++be a problem there.  In particular there is a section of this code that
++tests the UART which will tell you what UART you have if you define
++"PRNT" (just remove "_off" from the #define PRNT_off).  To view this
++report you will need to boot the system without any beakpoints.  This
++allows the kernel to run to the point where it calls kgdb to set up
++interrupts.  At this time kgdb will test the UART and print out the type
++it finds.  (You need to wait so that the printks are actually being
++printed.  Early in the boot they are cached, waiting for the console to
++be enabled.  Also, if kgdb is entered thru a breakpoint it is possible
++to cause a dead lock by calling printk when the console is locked.  The
++stub, thus avoids doing printks from break points especially in the
++serial code.)  At this time, if the UART fails to do the expected thing,
++kgdb will print out (using printk) information on what failed.  (These
++messages will be buried in all the other boot up messages.  Look for
++lines that start with "gdb_hook_interrupt:".  You may want to use dmesg
++once the system is up to view the log.  If this fails or if you still
++don't connect, review your answers for the port address.  Use:
++
++setserial /dev/ttyS0 
++
++to get the current port and irq information.  This command will also
++tell you what the system found for the UART type. The stub recognizes
++the following UART types:
++
++16450, 16550, and 16550A
++
++If you are really desperate you can use printk debugging in the
++kgdbstub code in the target kernel until you get it working.  In particular,
++there is a global variable in /usr/src/linux/arch/i386/kernel/kgdb_stub.c
++named "remote_debug".  Compile your kernel with this set to 1, rather
++than 0 and the debug stub will print out lots of stuff as it does
++what it does.  Likewise there are debug printks in the kgdb_serial.c
++code that can be turned on with simple changes in the macro defines.
++
++
++Debugging Loadable Modules
++==========================
++
++This technique comes courtesy of Edouard Parmelan
++<Edouard.Parmelan@quadratec.fr>
++
++When you run gdb, enter the command
++
++source gdbinit-modules
++
++This will read in a file of gdb macros that was installed in your
++kernel source directory when kgdb was installed.  This file implements
++the following commands:
++
++mod-list
++    Lists the loaded modules in the form <module-address> <module-name>
++
++mod-print-symbols <module-address>
++    Prints all the symbols in the indicated module.
++
++mod-add-symbols <module-address> <object-file-path-name>
++    Loads the symbols from the object file and associates them
++    with the indicated module.
++
++After you have loaded the module that you want to debug, use the command
++mod-list to find the <module-address> of your module.  Then use that
++address in the mod-add-symbols command to load your module's symbols.
++From that point onward you can debug your module as if it were a part
++of the kernel.
++
++The file gdbinit-modules also contains a command named mod-add-lis as
++an example of how to construct a command of your own to load your
++favorite module.  The idea is to "can" the pathname of the module
++in the command so you don't have to type so much.
++
++Threads
++=======
++
++Each process in a target machine is seen as a gdb thread. gdb thread
++related commands (info threads, thread n) can be used.
++
++ia-32 hardware breakpoints
++==========================
++
++kgdb stub contains support for hardware breakpoints using debugging features
++of ia-32(x86) processors. These breakpoints do not need code modification.
++They use debugging registers. 4 hardware breakpoints are available in ia-32
++processors.
++
++Each hardware breakpoint can be of one of the following three types.
++
++1. Execution breakpoint - An Execution breakpoint is triggered when code
++	at the breakpoint address is executed.
++
++	As limited number of hardware breakpoints are available, it is
++	advisable to use software breakpoints ( break command ) instead
++	of execution hardware breakpoints, unless modification of code
++	is to be avoided.
++
++2. Write breakpoint - A write breakpoint is triggered when memory
++	location at the breakpoint address is written.
++
++	A write or can be placed for data of variable length. Length of
++	a write breakpoint indicates length of the datatype to be
++	watched. Length is 1 for 1 byte data , 2 for 2 byte data, 3 for
++	4 byte data.
++
++3. Access breakpoint - An access breakpoint is triggered when memory
++	location at the breakpoint address is either read or written.
++
++	Access breakpoints also have lengths similar to write breakpoints.
++
++IO breakpoints in ia-32 are not supported.
++
++Since gdb stub at present does not use the protocol used by gdb for hardware
++breakpoints, hardware breakpoints are accessed through gdb macros. gdb macros
++for hardware breakpoints are described below.
++
++hwebrk	- Places an execution breakpoint
++	hwebrk breakpointno address
++hwwbrk	- Places a write breakpoint
++	hwwbrk breakpointno length address
++hwabrk	- Places an access breakpoint
++	hwabrk breakpointno length address
++hwrmbrk	- Removes a breakpoint
++	hwrmbrk breakpointno
++exinfo	- Tells whether a software or hardware breakpoint has occurred.
++	Prints number of the hardware breakpoint if a hardware breakpoint has
++	occurred.
++
++Arguments required by these commands are as follows
++breakpointno	- 0 to 3
++length		- 1 to 3
++address		- Memory location in hex digits ( without 0x ) e.g c015e9bc
++
++SMP support
++==========
++
++When a breakpoint occurs or user issues a break ( Ctrl + C ) to gdb
++client, all the processors are forced to enter the debugger. Current
++thread corresponds to the thread running on the processor where
++breakpoint occurred.  Threads running on other processor(s) appear
++similar to other non running threads in the 'info threads' output.  With
++in the kgdb stub there is a structure "waiting_cpus" in which kgdb
++records the values of "current" and "regs" for each cpu other than the
++one that hit the breakpoint.  "current" is a pointer to the task
++structure for the task that cpu is running, while "regs" points to the
++saved registers for the task.  This structure can be examined with the
++gdb "p" command.
++
++ia-32 hardware debugging registers on all processors are set to same
++values.  Hence any hardware breakpoints may occur on any processor.
++
++gdb troubleshooting
++===================
++
++1. gdb hangs
++Kill it. restart gdb. Connect to target machine.
++
++2. gdb cannot connect to target machine (after killing a gdb and
++restarting another) If the target machine was not inside debugger when
++you killed gdb, gdb cannot connect because the target machine won't
++respond.  In this case echo "Ctrl+C"(ASCII 3) in the serial line.
++e.g. echo -e "\003" > /dev/ttyS1 This forces that target machine into
++debugger after which you can connect.
++
++3. gdb cannot connect even after echoing Ctrl+C into serial line
++Try changing serial line settings min to 1 and time to 0
++e.g. stty min 1 time 0 < /dev/ttyS1
++Try echoing again
++
++check serial line speed and set it to correct value if required
++e.g. stty ispeed 115200 ospeed 115200 < /dev/ttyS1
++
++EVENTS
++======
++
++Ever want to know the order of things happening?  Which cpu did what and
++when?  How did the spinlock get the way it is?  Then events are for
++you.  Events are defined by calls to an event collection interface and
++saved for later examination.  In this case, kgdb events are saved by a
++very fast bit of code in kgdb which is fully SMP and interrupt protected
++and they are examined by using gdb to display them.  Kgdb keeps only
++the last N events, where N must be a power of two and is defined at
++configure time.
++
++
++Events are signaled to kgdb by calling:
++
++kgdb_ts(data0,data1)
++
++For each call kgdb records each call in an array along with other info.
++Here is the array def:
++
++struct kgdb_and_then_struct {
++#ifdef CONFIG_SMP
++	int	on_cpu;
++#endif
++	long long at_time;
++	int  	from_ln;
++	char	* in_src;
++	void	*from;
++        int     with_if;
++	int	data0;
++	int	data1;
++};
++
++For SMP machines the cpu is recorded, for all machines the TSC is
++recorded (gets a time stamp) as well as the line number and source file
++the call was made from.  The address of the (from), the "if" (interrupt
++flag) and the two data items are also recorded.  The macro kgdb_ts casts
++the types to int, so you can put any 32-bit values here.  There is a
++configure option to select the number of events you want to keep.  A
++nice number might be 128, but you can keep up to 1024 if you want.  The
++number must be a power of two.  An "andthen" macro library is provided
++for gdb to help you look at these events.  It is also possible to define
++a different structure for the event storage and cast the data to this
++structure.  For example the following structure is defined in kgdb:
++
++struct kgdb_and_then_struct2 {
++#ifdef CONFIG_SMP
++	int	on_cpu;
++#endif
++	long long at_time;
++	int  	from_ln;
++	char	* in_src;
++	void	*from;
++        int     with_if;
++	struct task_struct *t1;
++	struct task_struct *t2;
++};
++
++If you use this for display, the data elements will be displayed as
++pointers to task_struct entries.  You may want to define your own
++structure to use in casting.  You should only change the last two items
++and you must keep the structure size the same.  Kgdb will handle these
++as 32-bit ints, but within that constraint you can define a structure to
++cast to any 32-bit quantity.  This need only be available to gdb and is
++only used for casting in the display code.
++
++Final Items
++===========
++
++I picked up this code from Amit S. Kale and enhanced it.
++
++If you make some really cool modification to this stuff, or if you 
++fix a bug, please let me know.
++
++George Anzinger
++<george@mvista.com>
++
++Amit S. Kale
++<akale@veritas.com>
++
++(First kgdb by David Grothe <dave@gcom.com>)
++
++(modified by Tigran Aivazian <tigran@sco.com>)
++    Putting gdbstub into the kernel config menu.
++
++(modified by Scott Foehner <sfoehner@engr.sgi.com>)
++    Hooks for entering gdbstub at boot time.
++
++(modified by Amit S. Kale <akale@veritas.com>)
++    Threads, ia-32 hw debugging, mp support, console support,
++    nmi watchdog handling.
++
++(modified by George Anzinger <george@mvista.com>)
++    Extended threads to include the idle threads.
++    Enhancements to allow breakpoint() at first C code.
++    Use of module_init() and __setup() to automate the configure.
++    Enhanced the cpu "collection" code to work in early bring up.
++    Added ability to call functions from gdb
++    Print info thread stuff without going back to schedule()
++    Now collect the "other" cpus with a IPI/ NMI.
+\ No newline at end of file
+diff -puN /dev/null Documentation/i386/kgdb/loadmodule.sh
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25-akpm/Documentation/i386/kgdb/loadmodule.sh	2003-06-25 23:14:17.000000000 -0700
+@@ -0,0 +1,78 @@
++#/bin/sh
++# This script loads a module on a target machine and generates a gdb script.
++# source generated gdb script to load the module file at appropriate addresses
++# in gdb.
++#
++# Usage: 
++# Loading the module on target machine and generating gdb script)
++#	[foo]$ loadmodule.sh <modulename>
++#
++# Loading the module file into gdb
++#	(gdb) source <gdbscriptpath>
++#
++# Modify following variables according to your setup. 
++#	TESTMACHINE - Name of the target machine
++#	GDBSCRIPTS - The directory where a gdb script will be generated
++#
++# Author: Amit S. Kale (akale@veritas.com).
++#
++# If you run into problems, please check files pointed to by following
++# variables.
++#	ERRFILE - /tmp/<modulename>.errs contains stderr output of insmod
++#	MAPFILE - /tmp/<modulename>.map contains stdout output of insmod
++#	GDBSCRIPT - $GDBSCRIPTS/load<modulename> gdb script.
++
++TESTMACHINE=foo
++GDBSCRIPTS=/home/bar
++
++if [ $# -lt 1 ] ; then {
++	echo Usage: $0 modulefile
++	exit
++} ; fi
++
++MODULEFILE=$1
++MODULEFILEBASENAME=`basename $1`
++
++if [ $MODULEFILE = $MODULEFILEBASENAME ] ; then {
++	MODULEFILE=`pwd`/$MODULEFILE
++} fi
++
++ERRFILE=/tmp/$MODULEFILEBASENAME.errs
++MAPFILE=/tmp/$MODULEFILEBASENAME.map
++GDBSCRIPT=$GDBSCRIPTS/load$MODULEFILEBASENAME
++
++function findaddr() {
++	local ADDR=0x$(echo "$SEGMENTS" | \
++		grep "$1" | sed 's/^[^ ]*[ ]*[^ ]*[ ]*//' | \
++		sed 's/[ ]*[^ ]*$//')
++	echo $ADDR
++}
++
++function checkerrs() {
++	if [ "`cat $ERRFILE`" != "" ] ; then {
++		cat $ERRFILE
++		exit
++	} fi
++}
++
++#load the module
++echo Copying $MODULEFILE to $TESTMACHINE
++rcp $MODULEFILE root@${TESTMACHINE}:
++
++echo Loading module $MODULEFILE
++rsh -l root $TESTMACHINE  /sbin/insmod -m ./`basename $MODULEFILE` \
++	> $MAPFILE 2> $ERRFILE
++checkerrs
++
++SEGMENTS=`head -n 11 $MAPFILE | tail -n 10`
++TEXTADDR=$(findaddr "\\.text[^.]")
++LOADSTRING="add-symbol-file $MODULEFILE $TEXTADDR"
++SEGADDRS=`echo "$SEGMENTS" | awk '//{
++	if ($1 != ".text" && $1 != ".this" &&
++	    $1 != ".kstrtab" && $1 != ".kmodtab") {
++		print " -s " $1 " 0x" $3 " "
++	}
++}'`
++LOADSTRING="$LOADSTRING $SEGADDRS"
++echo Generating script $GDBSCRIPT
++echo $LOADSTRING > $GDBSCRIPT
+diff -puN drivers/char/keyboard.c~kgdb-ga drivers/char/keyboard.c
+--- 25/drivers/char/keyboard.c~kgdb-ga	2003-06-25 23:14:17.000000000 -0700
++++ 25-akpm/drivers/char/keyboard.c	2003-06-25 23:14:17.000000000 -0700
+@@ -1055,6 +1055,9 @@ void kbd_keycode(unsigned int keycode, i
+ 	}
+ 	if (sysrq_down && down && !rep) {
+ 		handle_sysrq(kbd_sysrq_xlate[keycode], regs, tty);
++#ifdef CONFIG_KGDB_SYSRQ
++                sysrq_down = 0;        /* in case we miss the "up" event */
++#endif
+ 		return;
+ 	}
+ #endif
+diff -puN drivers/char/sysrq.c~kgdb-ga drivers/char/sysrq.c
+--- 25/drivers/char/sysrq.c~kgdb-ga	2003-06-25 23:14:17.000000000 -0700
++++ 25-akpm/drivers/char/sysrq.c	2003-06-25 23:14:17.000000000 -0700
+@@ -35,6 +35,19 @@
+ #include <linux/spinlock.h>
+ 
+ #include <asm/ptrace.h>
++#ifdef CONFIG_KGDB_SYSRQ
++
++#define  GDB_OP &kgdb_op
++static struct sysrq_key_op kgdb_op={
++	handler:	(void*)breakpoint,
++	help_msg:	"kGdb ",
++	action_msg:	"Debug breakpoint\n",
++};
++
++#else
++#define  GDB_OP NULL
++#endif
++
+ 
+ extern void reset_vc(unsigned int);
+ extern struct list_head super_blocks;
+@@ -240,7 +253,7 @@ static struct sysrq_key_op *sysrq_key_ta
+ /* d */	NULL,
+ /* e */	&sysrq_term_op,
+ /* f */	NULL,
+-/* g */	NULL,
++/* g */	GDB_OP,
+ /* h */	NULL,
+ /* i */	&sysrq_kill_op,
+ /* j */	NULL,
+diff -puN drivers/serial/8250.c~kgdb-ga drivers/serial/8250.c
+--- 25/drivers/serial/8250.c~kgdb-ga	2003-06-25 23:14:17.000000000 -0700
++++ 25-akpm/drivers/serial/8250.c	2003-06-25 23:14:17.000000000 -0700
+@@ -823,7 +823,7 @@ receive_chars(struct uart_8250_port *up,
+ 		if (unlikely(tty->flip.count >= TTY_FLIPBUF_SIZE)) {
+ 			tty->flip.work.func((void *)tty);
+ 			if (tty->flip.count >= TTY_FLIPBUF_SIZE)
+-				return; // if TTY_DONT_FLIP is set
++				return;	/* if TTY_DONT_FLIP is set */
+ 		}
+ 		ch = serial_inp(up, UART_RX);
+ 		*tty->flip.char_buf_ptr = ch;
+@@ -1183,13 +1183,20 @@ static void serial8250_break_ctl(struct 
+ 	serial_out(up, UART_LCR, up->lcr);
+ 	spin_unlock_irqrestore(&up->port.lock, flags);
+ }
++#ifdef CONFIG_KGDB
++static int kgdb_irq = -1;
++#endif
+ 
+ static int serial8250_startup(struct uart_port *port)
+ {
+ 	struct uart_8250_port *up = (struct uart_8250_port *)port;
+ 	unsigned long flags;
+ 	int retval;
+-
++#ifdef CONFIG_KGDB
++	if ( up->port.irq == kgdb_irq){
++		return -EBUSY;
++	}
++#endif
+ 	if (up->port.type == PORT_16C950) {
+ 		/* Wake up and initialize UART */
+ 		up->acr = 0;
+@@ -1853,6 +1860,11 @@ static void __init serial8250_register_p
+ 	for (i = 0; i < UART_NR; i++) {
+ 		struct uart_8250_port *up = &serial8250_ports[i];
+ 
++#ifdef CONFIG_KGDB
++		if(up->port.irq == kgdb_irq){
++			up->port.iobase = up->port.mapbase = 0;
++		}
++#endif
+ 		up->port.line = i;
+ 		up->port.ops = &serial8250_pops;
+ 		init_timer(&up->timer);
+@@ -2116,7 +2128,31 @@ void serial8250_resume_port(int line, u3
+ {
+ 	uart_resume_port(&serial8250_reg, &serial8250_ports[line].port, level);
+ }
+-
++#ifdef CONFIG_KGDB
++/*
++ * Find all the ports using the given irq and shut them down.
++ * Result should be that the irq will be released.
++ */
++void shutdown_for_kgdb(struct async_struct * info)
++{
++        int irq = info->state->irq;
++        struct uart_8250_port *up;
++	int ttyS;
++
++	kgdb_irq = irq;			/* save for later init */
++	for (ttyS = 0; ttyS < UART_NR; ttyS++){
++		up =  &serial8250_ports[ttyS];
++		if( up->port.irq == irq && (irq_lists + irq)->head){
++#ifdef CONFIG_DEBUG_SPINLOCK   /* ugly business... */
++			if(up->port.lock.magic != SPINLOCK_MAGIC){
++				spin_lock_init(&up->port.lock);
++			}
++#endif
++			serial8250_shutdown(&up->port);
++		}
++        }
++}
++#endif
+ static int __init serial8250_init(void)
+ {
+ 	int ret, i;
+diff -puN include/asm-i386/bugs.h~kgdb-ga include/asm-i386/bugs.h
+--- 25/include/asm-i386/bugs.h~kgdb-ga	2003-06-25 23:14:17.000000000 -0700
++++ 25-akpm/include/asm-i386/bugs.h	2003-06-25 23:14:17.000000000 -0700
+@@ -1,11 +1,11 @@
+ /*
+  *  include/asm-i386/bugs.h
+  *
+- *  Copyright (C) 1994  Linus Torvalds
++ *  Copyright (C) 1994	Linus Torvalds
+  *
+  *  Cyrix stuff, June 1998 by:
+  *	- Rafael R. Reilova (moved everything from head.S),
+- *        <rreilova@ececs.uc.edu>
++ *	  <rreilova@ececs.uc.edu>
+  *	- Channing Corn (tests & fixes),
+  *	- Andrew D. Balsa (code cleanup).
+  *
+@@ -25,7 +25,20 @@
+ #include <asm/processor.h>
+ #include <asm/i387.h>
+ #include <asm/msr.h>
+-
++#ifdef CONFIG_KGDB
++/*
++ * Provied the command line "gdb" initial break
++ */
++int __init kgdb_initial_break(char * str)
++{
++	if (*str == '\0'){
++		breakpoint();
++		return 1;
++	}
++	return 0;
++}
++__setup("gdb",kgdb_initial_break);
++#endif
+ static int __init no_halt(char *s)
+ {
+ 	boot_cpu_data.hlt_works_ok = 0;
+@@ -140,7 +153,7 @@ static void __init check_popad(void)
+ 	  : "ecx", "edi" );
+ 	/* If this fails, it means that any user program may lock the CPU hard. Too bad. */
+ 	if (res != 12345678) printk( "Buggy.\n" );
+-		        else printk( "OK.\n" );
++			else printk( "OK.\n" );
+ #endif
+ }
+ 
+diff -puN /dev/null include/asm-i386/kgdb.h
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25-akpm/include/asm-i386/kgdb.h	2003-06-25 23:14:17.000000000 -0700
+@@ -0,0 +1,59 @@
++#ifndef __KGDB
++#define __KGDB
++
++/*
++ * This file should not include ANY others.  This makes it usable
++ * most anywhere without the fear of include order or inclusion.
++ * Make it so!
++ *
++ * This file may be included all the time.  It is only active if 
++ * CONFIG_KGDB is defined, otherwise it stubs out all the macros
++ * and entry points.
++ */
++#if defined(CONFIG_KGDB) && !defined(__ASSEMBLY__)
++
++extern void breakpoint(void);
++#define INIT_KGDB_INTS kgdb_enable_ints()
++
++#ifndef BREAKPOINT
++#define BREAKPOINT   asm("   int $3")
++#endif
++/*
++ * GDB debug stub (or any debug stub) can point the 'linux_debug_hook'
++ * pointer to its routine and it will be entered as the first thing
++ * when a trap occurs.
++ *
++ * Return values are, at present, undefined.
++ *
++ * The debug hook routine does not necessarily return to its caller.
++ * It has the register image and thus may choose to resume execution
++ * anywhere it pleases. 
++ */
++struct pt_regs;
++
++extern int kgdb_handle_exception(int trapno,
++				 int signo, int err_code, struct pt_regs *regs);
++extern int in_kgdb(struct pt_regs *regs);
++
++#ifdef CONFIG_KGDB_TS
++void kgdb_tstamp(int line, char *source, int data0, int data1);
++/*
++ * This is the time stamp function.  The macro adds the source info and
++ * does a cast on the data to allow most any 32-bit value.
++ */
++
++#define kgdb_ts(data0,data1) kgdb_tstamp(__LINE__,__FILE__,(int)data0,(int)data1)
++#else
++#define kgdb_ts(data0,data1)
++#endif
++#else				/* CONFIG_KGDB  && ! __ASSEMBLY__ ,stubs follow... */
++#ifndef BREAKPOINT
++#define BREAKPOINT
++#endif
++#define kgdb_ts(data0,data1)
++#define in_kgdb
++#define kgdb_handle_exception
++#define breakpoint
++#define INIT_KGDB_INTS
++#endif
++#endif				/* __KGDB */
+diff -puN /dev/null include/asm-i386/kgdb_local.h
+--- /dev/null	2002-08-30 16:31:37.000000000 -0700
++++ 25-akpm/include/asm-i386/kgdb_local.h	2003-06-25 23:14:17.000000000 -0700
+@@ -0,0 +1,102 @@
++#ifndef __KGDB_LOCAL
++#define ___KGDB_LOCAL
++#include <linux/config.h>
++#include <linux/types.h>
++#include <linux/serial.h>
++#include <linux/serialP.h>
++#include <linux/spinlock.h>
++#include <asm/processor.h>
++#include <asm/msr.h>
++#include <asm/kgdb.h>
++
++#define PORT 0x3f8
++#ifdef CONFIG_KGDB_PORT
++#undef PORT
++#define PORT CONFIG_KGDB_PORT
++#endif
++#define IRQ 4
++#ifdef CONFIG_KGDB_IRQ
++#undef IRQ
++#define IRQ CONFIG_KGDB_IRQ
++#endif
++#define SB_CLOCK 1843200
++#define SB_BASE (SB_CLOCK/16)
++#define SB_BAUD9600 SB_BASE/9600
++#define SB_BAUD192  SB_BASE/19200
++#define SB_BAUD384  SB_BASE/38400
++#define SB_BAUD576  SB_BASE/57600
++#define SB_BAUD1152 SB_BASE/115200
++#ifdef CONFIG_KGDB_9600BAUD
++#define SB_BAUD SB_BAUD9600
++#endif
++#ifdef CONFIG_KGDB_19200BAUD
++#define SB_BAUD SB_BAUD192
++#endif
++#ifdef CONFIG_KGDB_38400BAUD
++#define SB_BAUD SB_BAUD384
++#endif
++#ifdef CONFIG_KGDB_57600BAUD
++#define SB_BAUD SB_BAUD576
++#endif
++#ifdef CONFIG_KGDB_115200BAUD
++#define SB_BAUD SB_BAUD1152
++#endif
++#ifndef SB_BAUD
++#define SB_BAUD SB_BAUD1152	/* Start with this if not given */
++#endif
++
++#ifndef CONFIG_X86_TSC
++#undef rdtsc
++#define rdtsc(a,b) if (a++ > 10000){a = 0; b++;}
++#undef rdtscll
++#define rdtscll(s) s++
++#endif
++
++#ifdef _raw_read_unlock		/* must use a name that is "define"ed, not an inline */
++#undef spin_lock
++#undef spin_trylock
++#undef spin_unlock
++#define spin_lock	 _raw_spin_lock
++#define spin_trylock	 _raw_spin_trylock
++#define spin_unlock	 _raw_spin_unlock
++#else
++#endif
++#undef spin_unlock_wait
++#define spin_unlock_wait(x)  do { cpu_relax(); barrier();} \
++                                     while(spin_is_locked(x))
++
++#define SB_IER 1
++#define SB_MCR UART_MCR_OUT2 | UART_MCR_DTR | UART_MCR_RTS
++
++#define FLAGS 0
++#define SB_STATE { \
++     magic: SSTATE_MAGIC, \
++     baud_base: SB_BASE,  \
++     port:      PORT,     \
++     irq:       IRQ,      \
++     flags:     FLAGS,    \
++     custom_divisor:SB_BAUD}
++#define SB_INFO  { \
++      magic: SERIAL_MAGIC, \
++      port:  PORT,0,FLAGS, \
++      state: &state,       \
++      tty:   (struct tty_struct *)&state, \
++      IER:   SB_IER,       \
++      MCR:   SB_MCR}
++extern void putDebugChar(int);
++/* RTAI support needs us to really stop/start interrupts */
++
++#define kgdb_sti() __asm__ __volatile__("sti": : :"memory")
++#define kgdb_cli() __asm__ __volatile__("cli": : :"memory")
++#define kgdb_local_save_flags(x) __asm__ __volatile__(\
++                                   "pushfl ; popl %0":"=g" (x): /* no input */)
++#define kgdb_local_irq_restore(x) __asm__ __volatile__(\
++                                   "pushl %0 ; popfl": \
++                                     /* no output */ :"g" (x):"memory", "cc")
++#define kgdb_local_irq_save(x) kgdb_local_save_flags(x); kgdb_cli()
++
++#ifdef CONFIG_SERIAL
++extern void shutdown_for_kgdb(struct async_struct *info);
++#endif
++#define INIT_KDEBUG putDebugChar("+");
++#endif				/* __KGDB_LOCAL */
+diff -puN include/linux/config.h~kgdb-ga include/linux/config.h
+--- 25/include/linux/config.h~kgdb-ga	2003-06-25 23:14:17.000000000 -0700
++++ 25-akpm/include/linux/config.h	2003-06-25 23:14:17.000000000 -0700
+@@ -2,5 +2,8 @@
+ #define _LINUX_CONFIG_H
+ 
+ #include <linux/autoconf.h>
++#ifdef CONFIG_X86
++#include <asm/kgdb.h>
++#endif
+ 
+ #endif
+diff -puN kernel/sched.c~kgdb-ga kernel/sched.c
+--- 25/kernel/sched.c~kgdb-ga	2003-06-25 23:14:17.000000000 -0700
++++ 25-akpm/kernel/sched.c	2003-06-25 23:14:17.000000000 -0700
+@@ -1604,6 +1604,13 @@ out_unlock:
+ 	task_rq_unlock(rq, &flags);
+ }
+ 
++#if defined( CONFIG_KGDB) 
++struct task_struct * kgdb_get_idle(int this_cpu)
++{
++        return runqueues[this_cpu].idle;
++}
++#endif
++
+ #ifndef __alpha__
+ 
+ /*
+diff -puN MAINTAINERS~kgdb-ga MAINTAINERS
+--- 25/MAINTAINERS~kgdb-ga	2003-06-25 23:14:17.000000000 -0700
++++ 25-akpm/MAINTAINERS	2003-06-25 23:14:17.000000000 -0700
+@@ -1059,6 +1059,12 @@ L:	kbuild-devel@lists.sourceforge.net
+ W:	http://kbuild.sourceforge.net
+ S:	Maintained 
+ 
++KGDB FOR I386 PLATFORM
++P:	George Anzinger
++M:	george@mvista.com
++L:	linux-net@vger.kernel.org
++S:	Supported
++
+ KERNEL NFSD
+ P:	Neil Brown
+ M:	neilb@cse.unsw.edu.au
+
+_
diff --git a/lustre/kernel_patches/patches/kgdb-ga-docco-fixes-2.5.73.patch b/lustre/kernel_patches/patches/kgdb-ga-docco-fixes-2.5.73.patch
new file mode 100644
index 0000000000..47d451c51d
--- /dev/null
+++ b/lustre/kernel_patches/patches/kgdb-ga-docco-fixes-2.5.73.patch
@@ -0,0 +1,347 @@
+
+From: "Randy.Dunlap" <rddunlap@osdl.org>
+
+Just some readability fixes.
+
+
+
+ Documentation/i386/kgdb/kgdb.txt |  135 +++++++++++++++++++--------------------
+ 1 files changed, 68 insertions(+), 67 deletions(-)
+
+diff -puN Documentation/i386/kgdb/kgdb.txt~kgdb-gs-docco-fixes Documentation/i386/kgdb/kgdb.txt
+--- 25/Documentation/i386/kgdb/kgdb.txt~kgdb-gs-docco-fixes	2003-06-26 17:32:25.000000000 -0700
++++ 25-akpm/Documentation/i386/kgdb/kgdb.txt	2003-06-26 17:32:25.000000000 -0700
+@@ -6,10 +6,10 @@ New features: 
+ ============
+ 20030505.1827.27
+ We are starting to align with the sourceforge version, at least in 
+-commands.  To this end, the boot command sting to start kgdb at
++commands.  To this end, the boot command string to start kgdb at
+ boot time has been changed from "kgdb" to "gdb".
+ 
+-Andrew Morton sent a couple of patchs which are now included as follows:
++Andrew Morton sent a couple of patches which are now included as follows:
+ 1.) We now return a flag to the interrupt handler.
+ 2.) We no longer use smp_num_cpus (a conflict with the lock meter).
+ 3.) And from William Lee Irwin III <wli@holomorphy.com> code to make
+@@ -27,18 +27,18 @@ This is currently the version for the 2.
+ 
+ We have several new "features" beginning with this version:
+  
+-1.) Kgdb now syncs the "other" cpus with a cross cpu NMI.  No more
+-    waiting and it will pull that guy out of an irq off spin lock :)
++1.) Kgdb now syncs the "other" CPUs with a cross-CPU NMI.  No more
++    waiting and it will pull that guy out of an IRQ off spin lock :)
+ 
+ 2.) We doctored up the code that tells where a task is waiting and
+     included it so that the "info thread" command will show a bit more
+     than "schedule()".  Try it...
+ 
+ 3.) Added the ability to call a function from gdb.  All the standard gdb
+-    issues apply, i.e. if you hit a break point in the function you are
+-    not allowed to call another (gdb limitation, not kgdb).  T0 help
++    issues apply, i.e. if you hit a breakpoint in the function, you are
++    not allowed to call another (gdb limitation, not kgdb).  To help
+     this capability we added a memory allocation function.  Gdb does not
+-    return this memory (it is used for stings you pass to that function
++    return this memory (it is used for strings that you pass to that function
+     you are calling from gdb) so we fixed up a way to allow you to
+     manually return the memory (see below).
+ 
+@@ -61,23 +61,23 @@ $2 = {used_malloc = 0, called_from = 0xc
+     Things to note here: a.) used_malloc is the amount of memory that
+     has been malloc'ed to do calls from gdb.  You can reclaim this
+     memory like this: "p kgdb_info.used_malloc=0" Cool, huh?  b.)
+-    cpus_waiting is now "sized" by the number of cpus you enter at
+-    configure time in the kgdb configure section.  This is NOT used any
+-    where else in the system, but it is "nice" here.  c.)  The tasks
++    cpus_waiting is now "sized" by the number of CPUs you enter at
++    configure time in the kgdb configure section.  This is NOT used
++    anywhere else in the system, but it is "nice" here.  c.)  The task's
+     "pid" is now in the structure.  This is the pid you will need to use
+     to decode to the thread id to get gdb to look at that thread.
+     Remember that the "info thread" command prints a list of threads
+-    where in it numbers each thread with its reference number followed
+-    by the threads pid.  Note that the per cpu idle threads actually
+-    have pids of 0 (yes there is more than one pid 0 in an SMP system).
++    wherein it numbers each thread with its reference number followed
++    by the thread's pid.  Note that the per-CPU idle threads actually
++    have pids of 0 (yes, there is more than one pid 0 in an SMP system).
+     To avoid confusion, kgdb numbers these threads with numbers beyond
+-    the MAX_PID.  That is why you see 32768 above.
++    the MAX_PID.  That is why you see 32768 and above.
+ 
+ 6.) A subtle change, we now provide the complete register set for tasks
+-    that are active on the other cpus.  This allows better trace back on
++    that are active on the other CPUs.  This allows better trace back on
+     those tasks.
+ 
+-    And, lets mention what we could not fix.  Back-trace from all but the
++    And, let's mention what we could not fix.  Back-trace from all but the
+     thread that we trapped will, most likely, have a bogus entry in it.
+     The problem is that gdb does not recognize the entry code for
+     functions that use "current" near (at all?) the entry.  The compiler
+@@ -88,9 +88,9 @@ $2 = {used_malloc = 0, called_from = 0xc
+ 
+ 20011220.0050.35
+ Major enhancement with this version is the ability to hold one or more
+-cpus in an SMP system while allowing the others to continue.  Also, by
+-default only the current cpu is enabled on single step commands (please
+-note that gdb issues single step commands at times other than when you
++CPUs in an SMP system while allowing the others to continue.  Also, by
++default only the current CPU is enabled on single-step commands (please
++note that gdb issues single-step commands at times other than when you
+ use the si command).
+  
+ Another change is to collect some useful information in
+@@ -111,14 +111,14 @@ $4 = {called_from = 0xc010732c, entry_ts
+ 
+ "Called_from" is the return address from the current entry into kgdb.  
+ Sometimes it is useful to know why you are in kgdb, for example, was 
+-it an NMI or a real break point?  The simple way to interrogate this 
++it an NMI or a real breakpoint?  The simple way to interrogate this
+ return address is:
+ 
+ l *0xc010732c
+ 
+ which will print the surrounding few lines of source code.
+ 
+-"Entry_tsc" is the cpu TSC on entry to kgdb (useful to compare to the
++"Entry_tsc" is the CPU TSC on entry to kgdb (useful to compare to the
+ kgdb_ts entries).
+ 
+ "errcode" and "vector" are other entry parameters which may be helpful on
+@@ -139,34 +139,34 @@ $7 = {called_from = 0xc0112739, entry_ts
+       hold = 0, regs = 0x0}, {task = 0x0, hold = 0, regs = 0x0}, {task = 0x0, 
+       hold = 0, regs = 0x0}}}
+ 
+-"Cpus_waiting" has an entry for each cpu other than the current one that 
++"Cpus_waiting" has an entry for each CPU other than the current one that
+ has been stopped.  Each entry contains the task_struct address for that
+-cpu, the address of the regs for that task and a hold flag.  All these
++CPU, the address of the regs for that task and a hold flag.  All these
+ have the proper typing so that, for example:
+ 
+ p *kgdb_info.cpus_waiting[1].regs
+ 
+-will print the registers for cpu 1.
++will print the registers for CPU 1.
+ 
+ "Hold_on_sstep" is a new feature with this version and comes up set or
+-true.  What is means is that whenever kgdb is asked to single step all
+-other cpus are held (i.e. not allowed to execute).  The flag applies to
+-all but the current cpu and, again, can be changed:
++true.  What this means is that whenever kgdb is asked to single-step all
++other CPUs are held (i.e. not allowed to execute).  The flag applies to
++all but the current CPU and, again, can be changed:
+ 
+ p kgdb_info.hold_on_sstep=0
+ 
+-restores the old behavior of letting all cpus run during single stepping.
++restores the old behavior of letting all CPUs run during single-stepping.
+ 
+-Likewise, each cpu has a "hold" flag, which if set, locks that cpu out
+-of execution.  Note that this has some risk in cases where the cpus need
+-to communicate with each other.  If kgdb finds no cpu available on exit,
++Likewise, each CPU has a "hold" flag, which if set, locks that CPU out
++of execution.  Note that this has some risk in cases where the CPUs need
++to communicate with each other.  If kgdb finds no CPU available on exit,
+ it will push a message thru gdb and stay in kgdb.  Note that it is legal
+-to hold the current cpu as long as at least one cpu can execute.
++to hold the current CPU as long as at least one CPU can execute.
+ 
+ 20010621.1117.09
+ This version implements an event queue.  Events are signaled by calling
+ a function in the kgdb stub and may be examined from gdb.  See EVENTS 
+-below for details.  This version also tighten up the interrupt and SMP
++below for details.  This version also tightens up the interrupt and SMP
+ handling to not allow interrupts on the way to kgdb from a breakpoint 
+ trap.  It is fine to allow these interrupts for user code, but not
+ system debugging.
+@@ -190,18 +190,18 @@ machine.  This is the machine that will 
+ kernel.
+ 
+ The two machines will be connected together via a serial line out
+-one or the other of the COM ports of the PC.  You will need a modem
+-eliminator and the appropriate cables.
++one or the other of the COM ports of the PC.  You will need the
++appropriate modem eliminator (null modem) cable(s) for this.
+ 
+ Decide on which tty port you want the machines to communicate, then
+-cable them up back-to-back using the null modem.  COM1 is /dev/ttyS0 and
+-COM2 is /dev/ttyS1. You should test this connection with the two
+-machines prior to trying to debug a kernel.  Once you have it working,
+-on the TARGET machine, enter:
++connect them up back-to-back using the null modem cable.  COM1 is
++/dev/ttyS0 and COM2 is /dev/ttyS1. You should test this connection
++with the two machines prior to trying to debug a kernel.  Once you
++have it working, on the TARGET machine, enter:
+ 
+ setserial /dev/ttyS0 (or what ever tty you are using)
+ 
+-and record the port and the irq addresses. 
++and record the port address and the IRQ number.
+ 
+ On the DEVELOPMENT machine you need to apply the patch for the kgdb
+ hooks.  You have probably already done that if you are reading this
+@@ -212,7 +212,7 @@ On your DEVELOPMENT machine, go to your 
+ configuring in the standard serial driver, it must not be a module.
+ Either yes or no is ok, but making the serial driver a module means it
+ will initialize after kgdb has set up the UART interrupt code and may
+-cause a failure of the control C option discussed below.  The configure
++cause a failure of the control-C option discussed below.  The configure
+ question for the serial driver is under the "Character devices" heading
+ and is:
+ 
+@@ -231,16 +231,16 @@ The baud rate.  Default is 115200.  What
+ the host machine is set to the same speed.  I recommend the default.
+ 
+ The port.  This is the I/O address of the serial UART that you should
+-have gotten using setserial as described above.  The standard com1 port
+-(3f8) using irq 4 is default .  Com2 is 2f8 which by convention uses irq
++have gotten using setserial as described above.  The standard COM1 port
++(3f8) using IRQ 4 is default.  COM2 is 2f8 which by convention uses IRQ
+ 3.
+ 
+-The port irq (see above).
++The port IRQ (see above).
+ 
+ Stack overflow test.  This option makes a minor change in the trap,
+ system call and interrupt code to detect stack overflow and transfer
+-control to kgdb if it happens.  (Some platforms have this in the base
+-line code, but the i386 does not.)
++control to kgdb if it happens.  (Some platforms have this in the
++baseline code, but the i386 does not.)
+ 
+ You can also configure the system to recognize the boot option
+ "console=kgdb" which if given will cause all console output during
+@@ -251,9 +251,9 @@ This will happen before any kernel outpu
+ and will stall the boot until the connection is made.
+ 
+ You can also configure in a patch to SysRq to enable the kGdb SysRq.
+-This request generates a breakpoint.  Since the serial port irq line is
++This request generates a breakpoint.  Since the serial port IRQ line is
+ set up after any serial drivers, it is possible that this command will
+-work when the control C will not.
++work when the control-C will not.
+ 
+ Save and exit the Xconfig program.  Then do "make clean" , "make dep"
+ and "make bzImage" (or whatever target you want to make).  This gets the
+@@ -360,11 +360,11 @@ Triggering kgdbstub at other times
+ Often you don't need to enter the debugger until much later in the boot
+ or even after the machine has been running for some time.  Once the
+ kernel is booted and interrupts are on, you can force the system to
+-enter the debugger by sending a control C to the debug port. This is
++enter the debugger by sending a control-C to the debug port. This is
+ what the first line of the recommended .gdbinit file does.  This allows
+ you to start gdb any time after the system is up as well as when the
+-system is already at a break point.  (In the case where the system is
+-already at a break point the control C is not needed, however, it will
++system is already at a breakpoint.  (In the case where the system is
++already at a breakpoint the control-C is not needed, however, it will
+ be ignored by the target so no harm is done.  Also note the the echo
+ command assumes that the port speed is already set.  This will be true
+ once gdb has connected, but it is best to set the port speed before you
+@@ -442,7 +442,7 @@ turn on a debug switch with the followin
+ This will print out the protocol messages that gdb is exchanging with
+ the target machine.
+ 
+-Another place to look is /usr/src/arch/i386/lib/kgdb_serial.c This is
++Another place to look is /usr/src/arch/i386/lib/kgdb_serial.c. This is
+ the code that talks to the serial port on the target side.  There might
+ be a problem there.  In particular there is a section of this code that
+ tests the UART which will tell you what UART you have if you define
+@@ -454,7 +454,7 @@ it finds.  (You need to wait so that the
+ printed.  Early in the boot they are cached, waiting for the console to
+ be enabled.  Also, if kgdb is entered thru a breakpoint it is possible
+ to cause a dead lock by calling printk when the console is locked.  The
+-stub, thus avoids doing printks from break points especially in the
++stub thus avoids doing printks from breakpoints, especially in the
+ serial code.)  At this time, if the UART fails to do the expected thing,
+ kgdb will print out (using printk) information on what failed.  (These
+ messages will be buried in all the other boot up messages.  Look for
+@@ -464,7 +464,7 @@ don't connect, review your answers for t
+ 
+ setserial /dev/ttyS0 
+ 
+-to get the current port and irq information.  This command will also
++to get the current port and IRQ information.  This command will also
+ tell you what the system found for the UART type. The stub recognizes
+ the following UART types:
+ 
+@@ -581,11 +581,11 @@ When a breakpoint occurs or user issues 
+ client, all the processors are forced to enter the debugger. Current
+ thread corresponds to the thread running on the processor where
+ breakpoint occurred.  Threads running on other processor(s) appear
+-similar to other non running threads in the 'info threads' output.  With
+-in the kgdb stub there is a structure "waiting_cpus" in which kgdb
+-records the values of "current" and "regs" for each cpu other than the
++similar to other non-running threads in the 'info threads' output.
++Within the kgdb stub there is a structure "waiting_cpus" in which kgdb
++records the values of "current" and "regs" for each CPU other than the
+ one that hit the breakpoint.  "current" is a pointer to the task
+-structure for the task that cpu is running, while "regs" points to the
++structure for the task that CPU is running, while "regs" points to the
+ saved registers for the task.  This structure can be examined with the
+ gdb "p" command.
+ 
+@@ -601,22 +601,23 @@ Kill it. restart gdb. Connect to target 
+ 2. gdb cannot connect to target machine (after killing a gdb and
+ restarting another) If the target machine was not inside debugger when
+ you killed gdb, gdb cannot connect because the target machine won't
+-respond.  In this case echo "Ctrl+C"(ASCII 3) in the serial line.
+-e.g. echo -e "\003" > /dev/ttyS1 This forces that target machine into
+-debugger after which you can connect.
++respond.  In this case echo "Ctrl+C"(ASCII 3) to the serial line.
++e.g. echo -e "\003" > /dev/ttyS1
++This forces that target machine into the debugger, after which you
++can connect.
+ 
+ 3. gdb cannot connect even after echoing Ctrl+C into serial line
+ Try changing serial line settings min to 1 and time to 0
+ e.g. stty min 1 time 0 < /dev/ttyS1
+ Try echoing again
+ 
+-check serial line speed and set it to correct value if required
++Check serial line speed and set it to correct value if required
+ e.g. stty ispeed 115200 ospeed 115200 < /dev/ttyS1
+ 
+ EVENTS
+ ======
+ 
+-Ever want to know the order of things happening?  Which cpu did what and
++Ever want to know the order of things happening?  Which CPU did what and
+ when?  How did the spinlock get the way it is?  Then events are for
+ you.  Events are defined by calls to an event collection interface and
+ saved for later examination.  In this case, kgdb events are saved by a
+@@ -631,7 +632,7 @@ Events are signaled to kgdb by calling:
+ kgdb_ts(data0,data1)
+ 
+ For each call kgdb records each call in an array along with other info.
+-Here is the array def:
++Here is the array definition:
+ 
+ struct kgdb_and_then_struct {
+ #ifdef CONFIG_SMP
+@@ -646,7 +647,7 @@ struct kgdb_and_then_struct {
+ 	int	data1;
+ };
+ 
+-For SMP machines the cpu is recorded, for all machines the TSC is
++For SMP machines the CPU is recorded, for all machines the TSC is
+ recorded (gets a time stamp) as well as the line number and source file
+ the call was made from.  The address of the (from), the "if" (interrupt
+ flag) and the two data items are also recorded.  The macro kgdb_ts casts
+@@ -709,7 +710,7 @@ Amit S. Kale
+     Extended threads to include the idle threads.
+     Enhancements to allow breakpoint() at first C code.
+     Use of module_init() and __setup() to automate the configure.
+-    Enhanced the cpu "collection" code to work in early bring up.
++    Enhanced the cpu "collection" code to work in early bring-up.
+     Added ability to call functions from gdb
+     Print info thread stuff without going back to schedule()
+-    Now collect the "other" cpus with a IPI/ NMI.
+\ No newline at end of file
++    Now collect the "other" cpus with an IPI/ NMI.
+
+_
diff --git a/lustre/kernel_patches/patches/kgdb-use-ggdb-2.5.73.patch b/lustre/kernel_patches/patches/kgdb-use-ggdb-2.5.73.patch
new file mode 100644
index 0000000000..da07bd96cb
--- /dev/null
+++ b/lustre/kernel_patches/patches/kgdb-use-ggdb-2.5.73.patch
@@ -0,0 +1,17 @@
+ arch/i386/Makefile |    2 +-
+ 1 files changed, 1 insertion(+), 1 deletion(-)
+
+diff -puN arch/i386/Makefile~kgdb-use-ggdb arch/i386/Makefile
+--- 25/arch/i386/Makefile~kgdb-use-ggdb	2003-06-14 22:54:41.000000000 -0700
++++ 25-akpm/arch/i386/Makefile	2003-06-14 22:54:41.000000000 -0700
+@@ -85,7 +85,7 @@ mcore-$(CONFIG_X86_ES7000)	:= mach-es700
+ # default subarch .h files
+ mflags-y += -Iinclude/asm-i386/mach-default
+ 
+-mflags-$(CONFIG_KGDB) += -g
++mflags-$(CONFIG_KGDB) += -ggdb
+ mflags-$(CONFIG_KGDB_MORE) += $(shell echo $(CONFIG_KGDB_OPTIONS) | sed -e 's/"//g')
+ 
+ head-y := arch/i386/kernel/head.o arch/i386/kernel/init_task.o
+
+_
diff --git a/lustre/kernel_patches/patches/lkcd-cvs-2.5.69.patch b/lustre/kernel_patches/patches/lkcd-cvs-2.5.69.patch
new file mode 100644
index 0000000000..ee9490955d
--- /dev/null
+++ b/lustre/kernel_patches/patches/lkcd-cvs-2.5.69.patch
@@ -0,0 +1,6418 @@
+--- linux-2.5.69/drivers/dump/Makefile.lkcdbase	Mon Jun  2 17:29:39 2003
++++ linux-2.5.69/drivers/dump/Makefile	Fri Apr 25 00:24:15 2003
+@@ -0,0 +1,14 @@
++#
++# Makefile for the dump device drivers.
++#
++
++dump-y					:= dump_setup.o dump_fmt.o dump_filters.o dump_scheme.o dump_execute.o
++dump-$(CONFIG_X86)			+= dump_i386.o
++dump-$(CONFIG_CRASH_DUMP_MEMDEV)	+= dump_memdev.o dump_overlay.o
++dump-objs				+= $(dump-y)
++
++obj-$(CONFIG_CRASH_DUMP)		+= dump.o
++obj-$(CONFIG_CRASH_DUMP_BLOCKDEV)	+= dump_blockdev.o
++obj-$(CONFIG_CRASH_DUMP_NETDEV)	+= dump_netdev.o
++obj-$(CONFIG_CRASH_DUMP_COMPRESS_RLE)	+= dump_rle.o
++obj-$(CONFIG_CRASH_DUMP_COMPRESS_GZIP)	+= dump_gzip.o
+--- linux-2.5.69/drivers/dump/dump_blockdev.c.lkcdbase	Mon Jun  2 17:29:49 2003
++++ linux-2.5.69/drivers/dump/dump_blockdev.c	Sun May 18 22:30:52 2003
+@@ -0,0 +1,461 @@
++/*
++ * Implements the dump driver interface for saving a dump to 
++ * a block device through the kernel's generic low level block i/o
++ * routines.
++ *
++ * Started: June 2002 - Mohamed Abbas <mohamed.abbas@intel.com>
++ * 	Moved original lkcd kiobuf dump i/o code from dump_base.c
++ * 	to use generic dump device interfaces
++ *
++ * Sept 2002 - Bharata B. Rao <bharata@in.ibm.com>
++ * 	Convert dump i/o to directly use bio instead of kiobuf for 2.5
++ *
++ * Oct 2002  - Suparna Bhattacharya <suparna@in.ibm.com>
++ * 	Rework to new dumpdev.h structures, implement open/close/
++ * 	silence, misc fixes (blocknr removal, bio_add_page usage)  
++ *
++ * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
++ * Copyright (C) 2001 - 2002 Matt D. Robinson.  All rights reserved.
++ * Copyright (C) 2002 International Business Machines Corp. 
++ *
++ * This code is released under version 2 of the GNU GPL.
++ */
++
++#include <linux/types.h>
++#include <linux/proc_fs.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/blkdev.h>
++#include <linux/bio.h>
++#include <asm/hardirq.h>
++#include <linux/dump.h>
++#include "dump_methods.h"
++
++extern void *dump_page_buf;
++
++/* The end_io callback for dump i/o completion */
++static int
++dump_bio_end_io(struct bio *bio, unsigned int bytes_done, int error)
++{
++	struct dump_blockdev *dump_bdev;
++
++	if (bio->bi_size) {
++		/* some bytes still left to transfer */
++		return 1; /* not complete */
++	}
++
++	dump_bdev = (struct dump_blockdev *)bio->bi_private;
++	if (error) {
++		printk("IO error while writing the dump, aborting\n");
++	}
++
++	dump_bdev->err = error;
++
++	/* no wakeup needed, since caller polls for completion */
++	return 0;
++}
++
++/* Check if the dump bio is already mapped to the specified buffer */
++static int
++dump_block_map_valid(struct dump_blockdev *dev, struct page *page, 
++	int len) 
++{
++	struct bio *bio = dev->bio;
++	unsigned long bsize = 0;
++
++	if (!bio->bi_vcnt)
++		return 0; /* first time, not mapped */
++
++
++	if ((bio_page(bio) != page) || (len > bio->bi_vcnt << PAGE_SHIFT))
++		return 0; /* buffer not mapped */
++
++	bsize = bdev_hardsect_size(bio->bi_bdev);
++	if ((len & (PAGE_SIZE - 1)) || (len & bsize))
++		return 0; /* alignment checks needed */
++
++	/* quick check to decide if we need to redo bio_add_page */
++	if (bdev_get_queue(bio->bi_bdev)->merge_bvec_fn)
++		return 0; /* device may have other restrictions */
++
++	return 1; /* already mapped */
++}
++
++/* 
++ * Set up the dump bio for i/o from the specified buffer 
++ * Return value indicates whether the full buffer could be mapped or not
++ */
++static int
++dump_block_map(struct dump_blockdev *dev, void *buf, int len)
++{
++	struct page *page = virt_to_page(buf);
++	struct bio *bio = dev->bio;
++	unsigned long bsize = 0;
++
++	bio->bi_bdev = dev->bdev;
++	bio->bi_sector = (dev->start_offset + dev->ddev.curr_offset) >> 9;
++	bio->bi_idx = 0; /* reset index to the beginning */
++
++	if (dump_block_map_valid(dev, page, len)) {
++		/* already mapped and usable rightaway */
++		bio->bi_size = len; /* reset size to the whole bio */
++	} else {
++		/* need to map the bio */
++		bio->bi_size = 0;
++		bio->bi_vcnt = 0;
++		bsize = bdev_hardsect_size(bio->bi_bdev);
++
++		/* first a few sanity checks */
++		if (len < bsize) {
++			printk("map: len less than hardsect size \n");
++			return -EINVAL;
++		}
++
++		if ((unsigned long)buf & bsize) {
++			printk("map: not aligned \n");
++			return -EINVAL;
++		}
++
++		/* assume contig. page aligned low mem buffer( no vmalloc) */
++		if ((page_address(page) != buf) || (len & (PAGE_SIZE - 1))) {
++			printk("map: invalid buffer alignment!\n");
++			return -EINVAL; 
++		}
++		/* finally we can go ahead and map it */
++		while (bio->bi_size < len)
++			if (bio_add_page(bio, page++, PAGE_SIZE, 0) == 0) {
++				break;
++			}
++
++		bio->bi_end_io = dump_bio_end_io;
++		bio->bi_private = dev;
++	}
++
++	if (bio->bi_size != len) {
++		printk("map: bio size = %d not enough for len = %d!\n",
++			bio->bi_size, len);
++		return -E2BIG;
++	}
++	return 0;
++}
++
++static void
++dump_free_bio(struct bio *bio)
++{
++	if (bio)
++		kfree(bio->bi_io_vec);
++	kfree(bio);
++}
++
++/*
++ * Prepares the dump device so we can take a dump later. 
++ * The caller is expected to have filled up the kdev_id field in the 
++ * block dump dev structure.
++ *
++ * At dump time when dump_block_write() is invoked it will be too 
++ * late to recover, so as far as possible make sure obvious errors 
++ * get caught right here and reported back to the caller.
++ */
++static int
++dump_block_open(struct dump_dev *dev, unsigned long arg)
++{
++	struct dump_blockdev *dump_bdev = DUMP_BDEV(dev);
++	struct block_device *bdev;
++	int retval = 0;
++	struct bio_vec *bvec;
++
++	/* make sure this is a valid block device */
++	if (!arg) {
++		retval = -EINVAL;
++		goto err;
++	}
++
++	/* get a corresponding block_dev struct for this */
++	bdev = bdget((dev_t)arg);
++	if (!bdev) {
++		retval = -ENODEV;
++		goto err;
++	}
++
++	/* get the block device opened */
++	if ((retval = blkdev_get(bdev, O_RDWR | O_LARGEFILE, 0, BDEV_RAW))) {
++		goto err1;
++	}
++
++	if ((dump_bdev->bio = kmalloc(sizeof(struct bio), GFP_KERNEL)) 
++		== NULL) {
++		printk("Cannot allocate bio\n");
++		retval = -ENOMEM;
++		goto err2;
++	}
++
++	bio_init(dump_bdev->bio);
++
++	if ((bvec = kmalloc(sizeof(struct bio_vec) * 
++		(DUMP_BUFFER_SIZE >> PAGE_SHIFT), GFP_KERNEL)) == NULL) {
++		retval = -ENOMEM;
++		goto err3;
++	}
++
++	/* assign the new dump dev structure */
++	dump_bdev->kdev_id = to_kdev_t((dev_t)arg);
++	dump_bdev->bdev = bdev;
++
++	/* make a note of the limit */
++	dump_bdev->limit = bdev->bd_inode->i_size;
++	
++	/* now make sure we can map the dump buffer */
++	dump_bdev->bio->bi_io_vec = bvec;
++	dump_bdev->bio->bi_max_vecs = DUMP_BUFFER_SIZE >> PAGE_SHIFT;
++
++	retval = dump_block_map(dump_bdev, dump_config.dumper->dump_buf, 
++		DUMP_BUFFER_SIZE);
++		
++	if (retval) {
++		printk("open: dump_block_map failed, ret %d\n", retval);
++		goto err3;
++	}
++
++	printk("Block device (%d,%d) successfully configured for dumping\n",
++	       major(dump_bdev->kdev_id),
++	       minor(dump_bdev->kdev_id));
++
++
++	/* after opening the block device, return */
++	return retval;
++
++err3:	dump_free_bio(dump_bdev->bio);
++	dump_bdev->bio = NULL;
++err2:	if (bdev) blkdev_put(bdev, BDEV_RAW);
++		goto err;
++err1:	if (bdev) bdput(bdev);
++	dump_bdev->bdev = NULL;
++err:	return retval;
++}
++
++/*
++ * Close the dump device and release associated resources
++ * Invoked when unconfiguring the dump device.
++ */
++static int
++dump_block_release(struct dump_dev *dev)
++{
++	struct dump_blockdev *dump_bdev = DUMP_BDEV(dev);
++
++	/* release earlier bdev if present */
++	if (dump_bdev->bdev) {
++		blkdev_put(dump_bdev->bdev, BDEV_RAW);
++		dump_bdev->bdev = NULL;
++	}
++
++	dump_free_bio(dump_bdev->bio);
++	dump_bdev->bio = NULL;
++
++	return 0;
++}
++
++
++/*
++ * Prepare the dump device for use (silence any ongoing activity
++ * and quiesce state) when the system crashes.
++ */
++static int
++dump_block_silence(struct dump_dev *dev)
++{
++	struct dump_blockdev *dump_bdev = DUMP_BDEV(dev);
++	struct request_queue *q = bdev_get_queue(dump_bdev->bdev);
++	int ret;
++
++	/* If we can't get request queue lock, refuse to take the dump */
++	if (!spin_trylock(q->queue_lock))
++		return -EBUSY;
++
++	ret = elv_queue_empty(q);
++	spin_unlock(q->queue_lock);
++
++	/* For now we assume we have the device to ourselves */
++	/* Just a quick sanity check */
++	if (!ret) {
++		/* i/o in flight - safer to quit */
++		return -EBUSY;
++	}
++
++	/* 
++	 * Move to a softer level of silencing where no spin_lock_irqs 
++	 * are held on other cpus
++	 */
++	dump_silence_level = DUMP_SOFT_SPIN_CPUS;	
++
++	__dump_irq_enable();
++
++	printk("Dumping to block device (%d,%d) on CPU %d ...\n",
++	       major(dump_bdev->kdev_id), minor(dump_bdev->kdev_id),
++	       smp_processor_id());
++	
++	return 0;
++}
++
++/*
++ * Invoked when dumping is done. This is the time to put things back 
++ * (i.e. undo the effects of dump_block_silence) so the device is 
++ * available for normal use.
++ */
++static int
++dump_block_resume(struct dump_dev *dev)
++{
++	__dump_irq_restore();
++	return 0;
++}
++
++
++/*
++ * Seek to the specified offset in the dump device.
++ * Makes sure this is a valid offset, otherwise returns an error.
++ */
++static int
++dump_block_seek(struct dump_dev *dev, loff_t off)
++{
++	struct dump_blockdev *dump_bdev = DUMP_BDEV(dev);
++	loff_t offset = off + dump_bdev->start_offset;
++	
++	if (offset & ( PAGE_SIZE - 1)) {
++		printk("seek: non-page aligned\n");
++		return -EINVAL;
++	}
++
++	if (offset & (bdev_hardsect_size(dump_bdev->bdev) - 1)) {
++		printk("seek: not sector aligned \n");
++		return -EINVAL;
++	}
++
++	if (offset > dump_bdev->limit) {
++		printk("seek: not enough space left on device!\n");
++		return -ENOSPC; 
++	}
++	dev->curr_offset = off;
++	return 0;
++}
++
++/*
++ * Write out a buffer after checking the device limitations, 
++ * sector sizes, etc. Assumes the buffer is in directly mapped 
++ * kernel address space (not vmalloc'ed).
++ *
++ * Returns: number of bytes written or -ERRNO. 
++ */
++static int
++dump_block_write(struct dump_dev *dev, void *buf, 
++	unsigned long len)
++{
++	struct dump_blockdev *dump_bdev = DUMP_BDEV(dev);
++	loff_t offset = dev->curr_offset + dump_bdev->start_offset;
++	int retval = -ENOSPC;
++
++	if (offset >= dump_bdev->limit) {
++		printk("write: not enough space left on device!\n");
++		goto out;
++	}
++
++	/* don't write more blocks than our max limit */
++	if (offset + len > dump_bdev->limit) 
++		len = dump_bdev->limit - offset;
++
++
++	retval = dump_block_map(dump_bdev, buf, len);
++	if (retval){
++		printk("write: dump_block_map failed! err %d\n", retval);
++		goto out;
++	}
++
++	/*
++	 * Write out the data to disk.
++	 * Assumes the entire buffer mapped to a single bio, which we can
++	 * submit and wait for io completion. In the future, may consider
++	 * increasing the dump buffer size and submitting multiple bio s 
++	 * for better throughput.
++	 */
++	dump_bdev->err = -EAGAIN;
++	submit_bio(WRITE, dump_bdev->bio);
++
++	dump_bdev->ddev.curr_offset += len;
++	retval = len;
++ out:
++	return retval;
++}
++
++/*
++ * Name: dump_block_ready()
++ * Func: check if the last dump i/o is over and ready for next request
++ */
++static int
++dump_block_ready(struct dump_dev *dev, void *buf)
++{
++	struct dump_blockdev *dump_bdev = DUMP_BDEV(dev);
++	request_queue_t *q = bdev_get_queue(dump_bdev->bio->bi_bdev);
++
++	/* check for io completion */
++	if (dump_bdev->err == -EAGAIN) {
++		q->unplug_fn(q);
++		return -EAGAIN;
++	}
++
++	if (dump_bdev->err) {
++		printk("dump i/o err\n");
++		return dump_bdev->err;
++	}
++
++	return 0;
++}
++
++
++struct dump_dev_ops dump_blockdev_ops = {
++	.open 		= dump_block_open,
++	.release	= dump_block_release,
++	.silence	= dump_block_silence,
++	.resume 	= dump_block_resume,
++	.seek		= dump_block_seek,
++	.write		= dump_block_write,
++	/* .read not implemented */
++	.ready		= dump_block_ready
++};
++
++static struct dump_blockdev default_dump_blockdev = {
++	.ddev = {.type_name = "blockdev", .ops = &dump_blockdev_ops, 
++			.curr_offset = 0},
++	/* 
++	 * leave enough room for the longest swap header possibly written 
++	 * written by mkswap (likely the largest page size supported by
++	 * the arch
++	 */
++	.start_offset 	= DUMP_HEADER_OFFSET,
++	.err 		= 0
++	/* assume the rest of the fields are zeroed by default */
++};	
++	
++struct dump_blockdev *dump_blockdev = &default_dump_blockdev;
++
++static int __init
++dump_blockdev_init(void)
++{
++	if (dump_register_device(&dump_blockdev->ddev) < 0) {
++		printk("block device driver registration failed\n");
++		return -1;
++	}
++		
++	printk("block device driver for LKCD registered\n");
++	return 0;
++}
++
++static void __exit
++dump_blockdev_cleanup(void)
++{
++	dump_unregister_device(&dump_blockdev->ddev);
++	printk("block device driver for LKCD unregistered\n");
++}
++
++MODULE_AUTHOR("LKCD Development Team <lkcd-devel@lists.sourceforge.net>");
++MODULE_DESCRIPTION("Block Dump Driver for Linux Kernel Crash Dump (LKCD)");
++MODULE_LICENSE("GPL");
++
++module_init(dump_blockdev_init);
++module_exit(dump_blockdev_cleanup);
+--- linux-2.5.69/drivers/dump/dump_execute.c.lkcdbase	Mon Jun  2 17:29:49 2003
++++ linux-2.5.69/drivers/dump/dump_execute.c	Fri Feb  7 06:47:58 2003
+@@ -0,0 +1,126 @@
++/*
++ * The file has the common/generic dump execution code 
++ *
++ * Started: Oct 2002 -  Suparna Bhattacharya <suparna@in.ibm.com>
++ * 	Split and rewrote high level dump execute code to make use 
++ * 	of dump method interfaces.
++ *
++ * Derived from original code in dump_base.c created by 
++ * 	Matt Robinson <yakker@sourceforge.net>)
++ * 	
++ * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
++ * Copyright (C) 2001 - 2002 Matt D. Robinson.  All rights reserved.
++ * Copyright (C) 2002 International Business Machines Corp. 
++ *
++ * Assumes dumper and dump config settings are in place
++ * (invokes corresponding dumper specific routines as applicable)
++ *
++ * This code is released under version 2 of the GNU GPL.
++ */
++#include <linux/kernel.h>
++#include <linux/notifier.h>
++#include <linux/dump.h>
++#include "dump_methods.h"
++
++struct notifier_block *dump_notifier_list; /* dump started/ended callback */
++
++/* Dump progress indicator */
++void 
++dump_speedo(int i)
++{
++	static const char twiddle[4] =  { '|', '\\', '-', '/' };
++	printk("%c\b", twiddle[i&3]);
++}
++
++/* Make the device ready and write out the header */
++int dump_begin(void)
++{
++	int err = 0;
++
++	/* dump_dev = dump_config.dumper->dev; */
++	dumper_reset();
++	if ((err = dump_dev_silence())) {
++		/* quiesce failed, can't risk continuing */
++		/* Todo/Future: switch to alternate dump scheme if possible */
++		printk("dump silence dev failed ! error %d\n", err);
++		return err;
++	}
++
++	pr_debug("Writing dump header\n");
++	if ((err = dump_update_header())) {
++		printk("dump update header failed ! error %d\n", err);
++		dump_dev_resume();
++		return err;
++	}
++
++	dump_config.dumper->curr_offset = DUMP_BUFFER_SIZE;
++
++	return 0;
++}
++
++/* 
++ * Write the dump terminator, a final header update and let go of 
++ * exclusive use of the device for dump.
++ */
++int dump_complete(void)
++{
++	int ret = 0;
++
++	if (dump_config.level != DUMP_LEVEL_HEADER) {
++		if ((ret = dump_update_end_marker())) {
++			printk("dump update end marker error %d\n", ret);
++		}
++		if ((ret = dump_update_header())) {
++			printk("dump update header error %d\n", ret);
++		}
++	}
++	ret = dump_dev_resume();
++
++	return ret;
++}
++
++/* Saves all dump data */
++int dump_execute_savedump(void)
++{
++	int ret = 0, err = 0;
++
++	if ((ret = dump_begin()))  {
++		return ret;
++	}
++
++	if (dump_config.level != DUMP_LEVEL_HEADER) { 
++		ret = dump_sequencer();
++	}
++	if ((err = dump_complete())) {
++		printk("Dump complete failed. Error %d\n", err);
++	}
++
++	return ret;
++}
++
++/* Does all the real work:  Capture and save state */
++int dump_generic_execute(const char *panic_str, const struct pt_regs *regs)
++{
++	int ret = 0;
++
++	if ((ret = dump_configure_header(panic_str, regs))) {
++		printk("dump config header failed ! error %d\n", ret);
++		return ret;	
++	}
++
++	/* tell interested parties that a dump is about to start */
++	notifier_call_chain(&dump_notifier_list, DUMP_BEGIN, 
++		&dump_config.dump_device);
++
++	if (dump_config.level != DUMP_LEVEL_NONE)
++		ret = dump_execute_savedump();
++
++	pr_debug("dumped %ld blocks of %d bytes each\n", 
++		dump_config.dumper->count, DUMP_BUFFER_SIZE);
++	
++	/* tell interested parties that a dump has completed */
++	notifier_call_chain(&dump_notifier_list, DUMP_END, 
++		&dump_config.dump_device);
++
++	return ret;
++}
+--- linux-2.5.69/drivers/dump/dump_filters.c.lkcdbase	Mon Jun  2 17:29:49 2003
++++ linux-2.5.69/drivers/dump/dump_filters.c	Mon Feb  3 05:06:28 2003
+@@ -0,0 +1,143 @@
++/*
++ * Default filters to select data to dump for various passes.
++ *
++ * Started: Oct 2002 -  Suparna Bhattacharya <suparna@in.ibm.com>
++ * 	Split and rewrote default dump selection logic to generic dump 
++ * 	method interfaces 
++ * Derived from a portion of dump_base.c created by 
++ * 	Matt Robinson <yakker@sourceforge.net>)
++ *
++ * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
++ * Copyright (C) 2001 - 2002 Matt D. Robinson.  All rights reserved.
++ * Copyright (C) 2002 International Business Machines Corp. 
++ *
++ * Used during single-stage dumping and during stage 1 of the 2-stage scheme
++ * (Stage 2 of the 2-stage scheme uses the fully transparent filters
++ * i.e. passthru filters in dump_overlay.c)
++ *
++ * Future: Custom selective dump may involve a different set of filters.
++ *
++ * This code is released under version 2 of the GNU GPL.
++ */
++
++#include <linux/kernel.h>
++#include <linux/bootmem.h>
++#include <linux/mm.h>
++#include <linux/slab.h>
++#include <linux/dump.h>
++#include "dump_methods.h"
++
++
++/* Copied from mm/bootmem.c - FIXME */
++/* return the number of _pages_ that will be allocated for the boot bitmap */
++unsigned long dump_calc_bootmap_pages (void)
++{
++	unsigned long mapsize;
++	unsigned long pages = num_physpages;
++
++	mapsize = (pages+7)/8;
++	mapsize = (mapsize + ~PAGE_MASK) & PAGE_MASK;
++	mapsize >>= PAGE_SHIFT;
++
++	return mapsize;
++}
++
++
++#define DUMP_PFN_SAFETY_MARGIN	1024  /* 4 MB */
++/* temporary */
++extern unsigned long min_low_pfn;
++
++
++int dump_low_page(struct page *p)
++{
++	return page_to_pfn(p) < min_low_pfn + dump_calc_bootmap_pages() 
++			+ 1 + DUMP_PFN_SAFETY_MARGIN;
++}
++
++static inline int kernel_page(struct page *p)
++{
++	/* FIXME: Need to exclude hugetlb pages. Clue: reserved but inuse */
++	return PageReserved(p) || (!PageLRU(p) && PageInuse(p));
++}
++
++static inline int user_page(struct page *p)
++{
++	return PageInuse(p) && (!PageReserved(p) && PageLRU(p));
++}
++
++static inline int unreferenced_page(struct page *p)
++{
++	return !PageInuse(p) && !PageReserved(p);
++}
++
++
++/* loc marks the beginning of a range of pages */
++int dump_filter_kernpages(int pass, unsigned long loc, unsigned long sz)
++{
++	struct page *page = (struct page *)loc;
++	/* if any of the pages is a kernel page, select this set */	
++	while (sz) {
++		if (dump_low_page(page) || kernel_page(page))
++			return 1;
++		sz -= PAGE_SIZE;
++		page++;
++	}	
++	return 0;
++}
++
++
++/* loc marks the beginning of a range of pages */
++int dump_filter_userpages(int pass, unsigned long loc, unsigned long sz)
++{
++	struct page *page = (struct page *)loc;
++	int ret = 0;
++	/* select if the set has any user page, and no kernel pages  */	
++	while (sz) {
++		if (user_page(page) && !dump_low_page(page)) {
++			ret = 1;
++		} else if (kernel_page(page) || dump_low_page(page)) {
++			return 0;
++		}
++		page++;
++		sz -= PAGE_SIZE;
++	}	
++	return ret;
++}
++
++
++
++/* loc marks the beginning of a range of pages */
++int dump_filter_unusedpages(int pass, unsigned long loc, unsigned long sz)
++{
++	struct page *page = (struct page *)loc;
++
++	/* select if the set does not have any used pages  */	
++	while (sz) {
++		if (!unreferenced_page(page) || dump_low_page(page)) {
++			return 0;
++		}
++		page++;
++		sz -= PAGE_SIZE;
++	}	
++	return 1;
++}
++
++/* dummy: last (non-existent) pass */
++int dump_filter_none(int pass, unsigned long loc, unsigned long sz)
++{
++	return 0;
++}
++
++/* TBD: resolve level bitmask ? */
++struct dump_data_filter dump_filter_table[] = {
++	{ .name = "kern", .selector = dump_filter_kernpages, 
++		.level_mask = DUMP_MASK_KERN},
++	{ .name = "user", .selector = dump_filter_userpages, 
++		.level_mask = DUMP_MASK_USED},
++	{ .name = "unused", .selector = dump_filter_unusedpages, 
++		.level_mask = DUMP_MASK_UNUSED},
++	{ .name = "none", .selector = dump_filter_none, 
++		.level_mask = DUMP_MASK_REST},
++	{ .name = "", .selector = NULL, .level_mask = 0}
++};
++
+--- linux-2.5.69/drivers/dump/dump_fmt.c.lkcdbase	Mon Jun  2 17:29:49 2003
++++ linux-2.5.69/drivers/dump/dump_fmt.c	Fri Feb  7 06:47:58 2003
+@@ -0,0 +1,395 @@
++/*
++ * Implements the routines which handle the format specific
++ * aspects of dump for the default dump format.
++ *
++ * Used in single stage dumping and stage 1 of soft-boot based dumping 
++ * Saves data in LKCD (lcrash) format 
++ *
++ * Previously a part of dump_base.c
++ *
++ * Started: Oct 2002 -  Suparna Bhattacharya <suparna@in.ibm.com>
++ *	Split off and reshuffled LKCD dump format code around generic
++ *	dump method interfaces.
++ *
++ * Derived from original code created by 
++ * 	Matt Robinson <yakker@sourceforge.net>)
++ *
++ * Contributions from SGI, IBM, HP, MCL, and others.
++ *
++ * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
++ * Copyright (C) 2000 - 2002 TurboLinux, Inc.  All rights reserved.
++ * Copyright (C) 2001 - 2002 Matt D. Robinson.  All rights reserved.
++ * Copyright (C) 2002 International Business Machines Corp. 
++ *
++ * This code is released under version 2 of the GNU GPL.
++ */
++
++#include <linux/types.h>
++#include <linux/kernel.h>
++#include <linux/time.h>
++#include <linux/sched.h>
++#include <linux/ptrace.h>
++#include <linux/utsname.h>
++#include <asm/dump.h>
++#include <linux/dump.h>
++#include "dump_methods.h"
++
++/*
++ * SYSTEM DUMP LAYOUT
++ * 
++ * System dumps are currently the combination of a dump header and a set
++ * of data pages which contain the system memory.  The layout of the dump
++ * (for full dumps) is as follows:
++ *
++ *             +-----------------------------+
++ *             |     generic dump header     |
++ *             +-----------------------------+
++ *             |   architecture dump header  |
++ *             +-----------------------------+
++ *             |         page header         |
++ *             +-----------------------------+
++ *             |          page data          |
++ *             +-----------------------------+
++ *             |         page header         |
++ *             +-----------------------------+
++ *             |          page data          |
++ *             +-----------------------------+
++ *             |              |              |
++ *             |              |              |
++ *             |              |              |
++ *             |              |              |
++ *             |              V              |
++ *             +-----------------------------+
++ *             |        PAGE_END header      |
++ *             +-----------------------------+
++ *
++ * There are two dump headers, the first which is architecture
++ * independent, and the other which is architecture dependent.  This
++ * allows different architectures to dump different data structures
++ * which are specific to their chipset, CPU, etc.
++ *
++ * After the dump headers come a succession of dump page headers along
++ * with dump pages.  The page header contains information about the page
++ * size, any flags associated with the page (whether it's compressed or
++ * not), and the address of the page.  After the page header is the page
++ * data, which is either compressed (or not).  Each page of data is
++ * dumped in succession, until the final dump header (PAGE_END) is
++ * placed at the end of the dump, assuming the dump device isn't out
++ * of space.
++ *
++ * This mechanism allows for multiple compression types, different
++ * types of data structures, different page ordering, etc., etc., etc.
++ * It's a very straightforward mechanism for dumping system memory.
++ */
++
++struct __dump_header dump_header;  /* the primary dump header              */
++struct __dump_header_asm dump_header_asm; /* the arch-specific dump header */
++
++/*
++ *  Set up common header fields (mainly the arch indep section) 
++ *  Per-cpu state is handled by lcrash_save_context
++ *  Returns the size of the header in bytes.
++ */
++static int lcrash_init_dump_header(const char *panic_str)
++{
++	struct timeval dh_time;
++	/* make sure the dump header isn't TOO big */
++	if ((sizeof(struct __dump_header) +
++		sizeof(struct __dump_header_asm)) > DUMP_BUFFER_SIZE) {
++			printk("lcrash_init_header(): combined "
++				"headers larger than DUMP_BUFFER_SIZE!\n");
++			return -E2BIG;
++	}
++
++	/* initialize the dump headers to zero */
++	memset(&dump_header, 0, sizeof(dump_header));
++	memset(&dump_header_asm, 0, sizeof(dump_header_asm));
++
++	/* configure dump header values */
++	dump_header.dh_magic_number = DUMP_MAGIC_NUMBER;
++	dump_header.dh_version = DUMP_VERSION_NUMBER;
++	dump_header.dh_memory_start = PAGE_OFFSET;
++	dump_header.dh_memory_end = DUMP_MAGIC_NUMBER;
++	dump_header.dh_header_size = sizeof(struct __dump_header);
++	dump_header.dh_page_size = PAGE_SIZE;
++	dump_header.dh_dump_level = dump_config.level;
++	dump_header.dh_current_task = (unsigned long) current;
++	dump_header.dh_dump_compress = dump_config.dumper->compress->
++		compress_type;
++	dump_header.dh_dump_flags = dump_config.flags;
++	dump_header.dh_dump_device = dump_config.dumper->dev->device_id; 
++
++#if DUMP_DEBUG >= 6
++	dump_header.dh_num_bytes = 0;
++#endif
++	dump_header.dh_num_dump_pages = 0;
++	do_gettimeofday(&dh_time);
++	dump_header.dh_time.tv_sec = dh_time.tv_sec;
++	dump_header.dh_time.tv_usec = dh_time.tv_usec;
++
++	memcpy((void *)&(dump_header.dh_utsname_sysname), 
++		(const void *)&(system_utsname.sysname), __NEW_UTS_LEN + 1);
++	memcpy((void *)&(dump_header.dh_utsname_nodename), 
++		(const void *)&(system_utsname.nodename), __NEW_UTS_LEN + 1);
++	memcpy((void *)&(dump_header.dh_utsname_release), 
++		(const void *)&(system_utsname.release), __NEW_UTS_LEN + 1);
++	memcpy((void *)&(dump_header.dh_utsname_version), 
++		(const void *)&(system_utsname.version), __NEW_UTS_LEN + 1);
++	memcpy((void *)&(dump_header.dh_utsname_machine), 
++		(const void *)&(system_utsname.machine), __NEW_UTS_LEN + 1);
++	memcpy((void *)&(dump_header.dh_utsname_domainname), 
++		(const void *)&(system_utsname.domainname), __NEW_UTS_LEN + 1);
++
++	if (panic_str) {
++		memcpy((void *)&(dump_header.dh_panic_string),
++			(const void *)panic_str, DUMP_PANIC_LEN);
++	}
++
++        dump_header_asm.dha_magic_number = DUMP_ASM_MAGIC_NUMBER;
++        dump_header_asm.dha_version = DUMP_ASM_VERSION_NUMBER;
++        dump_header_asm.dha_header_size = sizeof(dump_header_asm);
++
++	dump_header_asm.dha_smp_num_cpus = num_online_cpus();
++	pr_debug("smp_num_cpus in header %d\n", 
++		dump_header_asm.dha_smp_num_cpus);
++
++	dump_header_asm.dha_dumping_cpu = smp_processor_id();
++	
++	return sizeof(dump_header) + sizeof(dump_header_asm);
++}
++
++
++int dump_lcrash_configure_header(const char *panic_str, 
++	const struct pt_regs *regs)
++{
++	int retval = 0;
++
++	dump_config.dumper->header_len = lcrash_init_dump_header(panic_str);
++
++	/* capture register states for all processors */
++	dump_save_this_cpu(regs);
++	__dump_save_other_cpus(); /* side effect:silence cpus */
++
++	/* configure architecture-specific dump header values */
++	if ((retval = __dump_configure_header(regs))) 
++		return retval;
++
++	dump_config.dumper->header_dirty++;
++	return 0;
++}
++
++/* save register and task context */
++void dump_lcrash_save_context(int cpu, const struct pt_regs *regs, 
++	struct task_struct *tsk)
++{
++	dump_header_asm.dha_smp_current_task[cpu] = (uint32_t) tsk;
++
++	__dump_save_regs(&dump_header_asm.dha_smp_regs[cpu], regs);
++
++	/* take a snapshot of the stack */
++	/* doing this enables us to tolerate slight drifts on this cpu */
++	if (dump_header_asm.dha_stack[cpu]) {
++		memcpy((void *)dump_header_asm.dha_stack[cpu],
++				tsk->thread_info, THREAD_SIZE);
++	}
++	dump_header_asm.dha_stack_ptr[cpu] = (uint32_t)(tsk->thread_info);
++}
++
++/* write out the header */
++int dump_write_header(void)
++{
++	int retval = 0, size;
++	void *buf = dump_config.dumper->dump_buf;
++
++	/* accounts for DUMP_HEADER_OFFSET if applicable */
++	if ((retval = dump_dev_seek(0))) {
++		printk("Unable to seek to dump header offset: %d\n", 
++			retval);
++		return retval;
++	}
++
++	memcpy(buf, (void *)&dump_header, sizeof(dump_header));
++	size = sizeof(dump_header);
++	memcpy(buf + size, (void *)&dump_header_asm, sizeof(dump_header_asm));
++	size += sizeof(dump_header_asm);
++	size = PAGE_ALIGN(size);
++	retval = dump_ll_write(buf , size);
++
++	if (retval < size) 
++		return (retval >= 0) ? ENOSPC : retval;
++
++	return 0;
++}
++
++int dump_generic_update_header(void)
++{
++	int err = 0;
++
++	if (dump_config.dumper->header_dirty) {
++		if ((err = dump_write_header())) {
++			printk("dump write header failed !err %d\n", err);
++		} else {
++			dump_config.dumper->header_dirty = 0;
++		}
++	}
++
++	return err;
++}
++
++static inline int is_curr_stack_page(struct page *page, unsigned long size)
++{
++	unsigned long thread_addr = (unsigned long)current_thread_info();
++	unsigned long addr = (unsigned long)page_address(page);
++
++	return !PageHighMem(page) && (addr < thread_addr + THREAD_SIZE)
++		&& (addr + size > thread_addr);
++}
++
++static inline int is_dump_page(struct page *page, unsigned long size)
++{
++	unsigned long addr = (unsigned long)page_address(page);
++	unsigned long dump_buf = (unsigned long)dump_config.dumper->dump_buf;
++
++	return !PageHighMem(page) && (addr < dump_buf + DUMP_BUFFER_SIZE)
++		&& (addr + size > dump_buf);
++}
++
++int dump_allow_compress(struct page *page, unsigned long size)
++{
++	/*
++	 * Don't compress the page if any part of it overlaps
++	 * with the current stack or dump buffer (since the contents
++	 * in these could be changing while compression is going on)
++	 */
++	return !is_curr_stack_page(page, size) && !is_dump_page(page, size);
++}
++
++void lcrash_init_pageheader(struct __dump_page *dp, struct page *page, 
++	unsigned long sz)
++{
++	memset(dp, sizeof(struct __dump_page), 0);
++	dp->dp_flags = 0; 
++	dp->dp_size = 0;
++	if (sz > 0)
++		dp->dp_address = page_to_pfn(page) << PAGE_SHIFT;
++
++#if DUMP_DEBUG > 6
++	dp->dp_page_index = dump_header.dh_num_dump_pages;
++	dp->dp_byte_offset = dump_header.dh_num_bytes + DUMP_BUFFER_SIZE
++		+ DUMP_HEADER_OFFSET; /* ?? */
++#endif /* DUMP_DEBUG */
++}
++
++int dump_lcrash_add_data(unsigned long loc, unsigned long len)
++{
++	struct page *page = (struct page *)loc;
++	void *addr, *buf = dump_config.dumper->curr_buf;
++	struct __dump_page *dp = (struct __dump_page *)buf; 
++	int bytes, size;
++
++	if (buf > dump_config.dumper->dump_buf + DUMP_BUFFER_SIZE)
++		return -ENOMEM;
++
++	lcrash_init_pageheader(dp, page, len);
++	buf += sizeof(struct __dump_page);
++
++	while (len) {
++		addr = kmap_atomic(page, KM_DUMP);
++		size = bytes = (len > PAGE_SIZE) ? PAGE_SIZE : len;	
++		/* check for compression */
++		if (dump_allow_compress(page, bytes)) {
++			size = dump_compress_data((char *)addr, bytes, (char *)buf);
++		}
++		/* set the compressed flag if the page did compress */
++		if (size && (size < bytes)) {
++			dp->dp_flags |= DUMP_DH_COMPRESSED;
++		} else {
++			/* compression failed -- default to raw mode */
++			dp->dp_flags |= DUMP_DH_RAW;
++			memcpy(buf, addr, bytes);
++			size = bytes;
++		}
++		/* memset(buf, 'A', size); temporary: testing only !! */
++		kunmap_atomic(addr, KM_DUMP);
++		dp->dp_size += size;
++		buf += size;
++		len -= bytes;
++		page++;
++	}
++
++	/* now update the header */
++#if DUMP_DEBUG > 6
++	dump_header.dh_num_bytes += dp->dp_size + sizeof(*dp);
++#endif
++	dump_header.dh_num_dump_pages++;
++	dump_config.dumper->header_dirty++;
++
++	dump_config.dumper->curr_buf = buf;	
++
++	return len;
++}
++
++int dump_lcrash_update_end_marker(void)
++{
++	struct __dump_page *dp = 
++		(struct __dump_page *)dump_config.dumper->curr_buf;
++	unsigned long left;
++	int ret = 0;
++		
++	lcrash_init_pageheader(dp, NULL, 0);
++	dp->dp_flags |= DUMP_DH_END; /* tbd: truncation test ? */
++	
++	/* now update the header */
++#if DUMP_DEBUG > 6
++	dump_header.dh_num_bytes += sizeof(*dp);
++#endif
++	dump_config.dumper->curr_buf += sizeof(*dp);
++	left = dump_config.dumper->curr_buf - dump_config.dumper->dump_buf;
++
++	printk("\n");
++
++	while (left) {
++		if ((ret = dump_dev_seek(dump_config.dumper->curr_offset))) {
++			printk("Seek failed at offset 0x%llx\n", 
++			dump_config.dumper->curr_offset);
++			return ret;
++		}
++
++		if (DUMP_BUFFER_SIZE > left) 
++			memset(dump_config.dumper->curr_buf, 'm', 
++				DUMP_BUFFER_SIZE - left);
++
++		if ((ret = dump_ll_write(dump_config.dumper->dump_buf, 
++			DUMP_BUFFER_SIZE)) < DUMP_BUFFER_SIZE) {
++			return (ret < 0) ? ret : -ENOSPC;
++		}
++
++		dump_config.dumper->curr_offset += DUMP_BUFFER_SIZE;
++	
++		if (left > DUMP_BUFFER_SIZE) {
++			left -= DUMP_BUFFER_SIZE;
++			memcpy(dump_config.dumper->dump_buf, 
++			dump_config.dumper->dump_buf + DUMP_BUFFER_SIZE, left);
++			dump_config.dumper->curr_buf -= DUMP_BUFFER_SIZE;
++		} else {
++			left = 0;
++		}
++	}
++	return 0;
++}
++
++
++/* Default Formatter (lcrash) */
++struct dump_fmt_ops dump_fmt_lcrash_ops = {
++	.configure_header	= dump_lcrash_configure_header,
++	.update_header		= dump_generic_update_header,
++	.save_context		= dump_lcrash_save_context,
++	.add_data		= dump_lcrash_add_data,
++	.update_end_marker	= dump_lcrash_update_end_marker
++};
++
++struct dump_fmt dump_fmt_lcrash = {
++	.name	= "lcrash",
++	.ops	= &dump_fmt_lcrash_ops
++};
++
+--- linux-2.5.69/drivers/dump/dump_gzip.c.lkcdbase	Mon Jun  2 17:29:49 2003
++++ linux-2.5.69/drivers/dump/dump_gzip.c	Fri Dec 13 00:51:31 2002
+@@ -0,0 +1,118 @@
++/*
++ * GZIP Compression functions for kernel crash dumps.
++ *
++ * Created by: Matt Robinson (yakker@sourceforge.net)
++ * Copyright 2001 Matt D. Robinson.  All rights reserved.
++ *
++ * This code is released under version 2 of the GNU GPL.
++ */
++
++/* header files */
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/sched.h>
++#include <linux/fs.h>
++#include <linux/file.h>
++#include <linux/init.h>
++#include <linux/slab.h>
++#include <linux/dump.h>
++#include <linux/zlib.h>
++#include <linux/vmalloc.h>
++
++static void *deflate_workspace;
++
++/*
++ * Name: dump_compress_gzip()
++ * Func: Compress a DUMP_PAGE_SIZE page using gzip-style algorithms (the.
++ *       deflate functions similar to what's used in PPP).
++ */
++static u16
++dump_compress_gzip(const u8 *old, u16 oldsize, u8 *new, u16 newsize)
++{
++	/* error code and dump stream */
++	int err;
++	z_stream dump_stream;
++	
++	dump_stream.workspace = deflate_workspace;
++	
++	if ((err = zlib_deflateInit(&dump_stream, Z_BEST_COMPRESSION)) != Z_OK) {
++		/* fall back to RLE compression */
++		printk("dump_compress_gzip(): zlib_deflateInit() "
++			"failed (%d)!\n", err);
++		return 0;
++	}
++
++	/* use old (page of memory) and size (DUMP_PAGE_SIZE) as in-streams */
++	dump_stream.next_in = (u8 *) old;
++	dump_stream.avail_in = oldsize;
++
++	/* out streams are new (dpcpage) and new size (DUMP_DPC_PAGE_SIZE) */
++	dump_stream.next_out = new;
++	dump_stream.avail_out = newsize;
++
++	/* deflate the page -- check for error */
++	err = zlib_deflate(&dump_stream, Z_FINISH);
++	if (err != Z_STREAM_END) {
++		/* zero is return code here */
++		(void)zlib_deflateEnd(&dump_stream);
++		printk("dump_compress_gzip(): zlib_deflate() failed (%d)!\n",
++			err);
++		return 0;
++	}
++
++	/* let's end the deflated compression stream */
++	if ((err = zlib_deflateEnd(&dump_stream)) != Z_OK) {
++		printk("dump_compress_gzip(): zlib_deflateEnd() "
++			"failed (%d)!\n", err);
++	}
++
++	/* return the compressed byte total (if it's smaller) */
++	if (dump_stream.total_out >= oldsize) {
++		return oldsize;
++	}
++	return dump_stream.total_out;
++}
++
++/* setup the gzip compression functionality */
++static struct __dump_compress dump_gzip_compression = {
++	.compress_type = DUMP_COMPRESS_GZIP,
++	.compress_func = dump_compress_gzip,
++	.compress_name = "GZIP",
++};
++
++/*
++ * Name: dump_compress_gzip_init()
++ * Func: Initialize gzip as a compression mechanism.
++ */
++static int __init
++dump_compress_gzip_init(void)
++{
++	deflate_workspace = vmalloc(zlib_deflate_workspacesize());
++	if (!deflate_workspace) {
++		printk("dump_compress_gzip_init(): Failed to "
++			"alloc %d bytes for deflate workspace\n",
++			zlib_deflate_workspacesize());
++		return -ENOMEM;
++	}
++	dump_register_compression(&dump_gzip_compression);
++	return 0;
++}
++
++/*
++ * Name: dump_compress_gzip_cleanup()
++ * Func: Remove gzip as a compression mechanism.
++ */
++static void __exit
++dump_compress_gzip_cleanup(void)
++{
++	vfree(deflate_workspace);
++	dump_unregister_compression(DUMP_COMPRESS_GZIP);
++}
++
++/* module initialization */
++module_init(dump_compress_gzip_init);
++module_exit(dump_compress_gzip_cleanup);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("LKCD Development Team <lkcd-devel@lists.sourceforge.net>");
++MODULE_DESCRIPTION("Gzip compression module for crash dump driver");
+--- linux-2.5.69/drivers/dump/dump_i386.c.lkcdbase	Mon Jun  2 17:29:49 2003
++++ linux-2.5.69/drivers/dump/dump_i386.c	Wed Mar  5 02:49:22 2003
+@@ -0,0 +1,329 @@
++/*
++ * Architecture specific (i386) functions for Linux crash dumps.
++ *
++ * Created by: Matt Robinson (yakker@sgi.com)
++ *
++ * Copyright 1999 Silicon Graphics, Inc. All rights reserved.
++ *
++ * 2.3 kernel modifications by: Matt D. Robinson (yakker@turbolinux.com)
++ * Copyright 2000 TurboLinux, Inc.  All rights reserved.
++ * 
++ * This code is released under version 2 of the GNU GPL.
++ */
++
++/*
++ * The hooks for dumping the kernel virtual memory to disk are in this
++ * file.  Any time a modification is made to the virtual memory mechanism,
++ * these routines must be changed to use the new mechanisms.
++ */
++#include <linux/init.h>
++#include <linux/types.h>
++#include <linux/kernel.h>
++#include <linux/smp.h>
++#include <linux/fs.h>
++#include <linux/vmalloc.h>
++#include <linux/mm.h>
++#include <linux/dump.h>
++#include "dump_methods.h"
++#include <linux/irq.h>
++
++#include <asm/processor.h>
++#include <asm/e820.h>
++#include <asm/hardirq.h>
++#include <asm/nmi.h>
++
++static __s32 	     saved_irq_count;	/* saved preempt_count() flags */
++
++static int
++alloc_dha_stack(void)
++{
++	int i;
++	void *ptr;
++	
++	if (dump_header_asm.dha_stack[0])
++		return 0;
++
++	ptr = vmalloc(THREAD_SIZE * num_online_cpus());
++	if (!ptr) {
++		printk("vmalloc for dha_stacks failed\n");
++		return -ENOMEM;
++	}
++
++	for (i = 0; i < num_online_cpus(); i++) {
++		dump_header_asm.dha_stack[i] = (u32)((unsigned long)ptr +
++				(i * THREAD_SIZE));
++	}
++	return 0;
++}
++
++static int
++free_dha_stack(void) 
++{
++	if (dump_header_asm.dha_stack[0]) {
++		vfree((void *)dump_header_asm.dha_stack[0]);	
++		dump_header_asm.dha_stack[0] = 0;
++	}
++	return 0;
++}
++
++
++void 
++__dump_save_regs(struct pt_regs *dest_regs, const struct pt_regs *regs)
++{
++	*dest_regs = *regs;
++
++	/* In case of panic dumps, we collects regs on entry to panic.
++	 * so, we shouldn't 'fix' ssesp here again. But it is hard to
++	 * tell just looking at regs whether ssesp need fixing. We make
++	 * this decision by looking at xss in regs. If we have better
++	 * means to determine that ssesp are valid (by some flag which
++	 * tells that we are here due to panic dump), then we can use
++	 * that instead of this kludge.
++	 */
++	if (!user_mode(regs)) {
++		if ((0xffff & regs->xss) == __KERNEL_DS) 
++			/* already fixed up */
++			return;
++		dest_regs->esp = (unsigned long)&(regs->esp);
++		__asm__ __volatile__ ("movw %%ss, %%ax;"
++			:"=a"(dest_regs->xss));
++	}
++}
++
++
++#ifdef CONFIG_SMP
++extern unsigned long irq_affinity[];
++extern irq_desc_t irq_desc[];
++extern void dump_send_ipi(void);
++
++static int dump_expect_ipi[NR_CPUS];
++static atomic_t waiting_for_dump_ipi;
++static unsigned long saved_affinity[NR_IRQS];
++
++extern void stop_this_cpu(void *); /* exported by i386 kernel */
++
++static int
++dump_nmi_callback(struct pt_regs *regs, int cpu) 
++{
++	if (!dump_expect_ipi[cpu])
++		return 0;
++
++	dump_expect_ipi[cpu] = 0;
++	
++	dump_save_this_cpu(regs);
++	atomic_dec(&waiting_for_dump_ipi);
++
++ level_changed:
++	switch (dump_silence_level) {
++	case DUMP_HARD_SPIN_CPUS:	/* Spin until dump is complete */
++		while (dump_oncpu) {
++			barrier();    	/* paranoia */
++			if (dump_silence_level != DUMP_HARD_SPIN_CPUS)
++				goto level_changed;
++
++			cpu_relax();	/* kill time nicely */
++		}
++		break;
++
++	case DUMP_HALT_CPUS:		/* Execute halt */
++		stop_this_cpu(NULL);
++		break;
++		
++	case DUMP_SOFT_SPIN_CPUS:
++		/* Mark the task so it spins in schedule */
++		set_tsk_thread_flag(current, TIF_NEED_RESCHED);
++		break;
++	}
++
++	return 1;
++}
++
++/* save registers on other processors */
++void 
++__dump_save_other_cpus(void)
++{
++	int i, cpu = smp_processor_id();
++	int other_cpus = num_online_cpus()-1;
++	
++	if (other_cpus > 0) {
++		atomic_set(&waiting_for_dump_ipi, other_cpus);
++
++		for (i = 0; i < NR_CPUS; i++) {
++			dump_expect_ipi[i] = (i != cpu && cpu_online(i));
++		}
++
++		/* short circuit normal NMI handling temporarily */
++		set_nmi_callback(dump_nmi_callback);
++		wmb();
++
++		dump_send_ipi();
++		/* may be we dont need to wait for NMI to be processed. 
++		   just write out the header at the end of dumping, if
++		   this IPI is not processed until then, there probably
++		   is a problem and we just fail to capture state of 
++		   other cpus. */
++		while(atomic_read(&waiting_for_dump_ipi) > 0) {
++			cpu_relax();
++		}
++
++		unset_nmi_callback();
++	}
++}
++
++/*
++ * Routine to save the old irq affinities and change affinities of all irqs to
++ * the dumping cpu.
++ */
++static void 
++set_irq_affinity(void)
++{
++	int i;
++	int cpu = smp_processor_id();
++
++	memcpy(saved_affinity, irq_affinity, NR_IRQS * sizeof(unsigned long));
++	for (i = 0; i < NR_IRQS; i++) {
++		if (irq_desc[i].handler == NULL)
++			continue;
++		irq_affinity[i] = 1UL << cpu;
++		if (irq_desc[i].handler->set_affinity != NULL)
++			irq_desc[i].handler->set_affinity(i, irq_affinity[i]);
++	}
++}
++
++/*
++ * Restore old irq affinities.
++ */
++static void 
++reset_irq_affinity(void)
++{
++	int i;
++
++	memcpy(irq_affinity, saved_affinity, NR_IRQS * sizeof(unsigned long));
++	for (i = 0; i < NR_IRQS; i++) {
++		if (irq_desc[i].handler == NULL)
++			continue;
++		if (irq_desc[i].handler->set_affinity != NULL)
++			irq_desc[i].handler->set_affinity(i, saved_affinity[i]);
++	}
++}
++
++#else /* !CONFIG_SMP */
++#define set_irq_affinity()	do { } while (0)
++#define reset_irq_affinity()	do { } while (0)
++#define save_other_cpu_states() do { } while (0)
++#endif /* !CONFIG_SMP */
++
++/* 
++ * Kludge - dump from interrupt context is unreliable (Fixme)
++ *
++ * We do this so that softirqs initiated for dump i/o 
++ * get processed and we don't hang while waiting for i/o
++ * to complete or in any irq synchronization attempt.
++ *
++ * This is not quite legal of course, as it has the side 
++ * effect of making all interrupts & softirqs triggered 
++ * while dump is in progress complete before currently 
++ * pending softirqs and the currently executing interrupt 
++ * code. 
++ */
++static inline void
++irq_bh_save(void)
++{
++	saved_irq_count = irq_count();
++	preempt_count() &= ~(HARDIRQ_MASK|SOFTIRQ_MASK);
++}
++
++static inline void
++irq_bh_restore(void)
++{
++	preempt_count() |= saved_irq_count;
++}
++
++/*
++ * Name: __dump_irq_enable
++ * Func: Reset system so interrupts are enabled.
++ *	 This is used for dump methods that require interrupts
++ *	 Eventually, all methods will have interrupts disabled
++ *	 and this code can be removed.
++ *
++ *     Change irq affinities
++ *     Re-enable interrupts
++ */
++void 
++__dump_irq_enable(void)
++{
++	set_irq_affinity();
++	irq_bh_save();
++	local_irq_enable();
++}
++
++/*
++ * Name: __dump_irq_restore
++ * Func: Resume the system state in an architecture-specific way.
++
++ */
++void 
++__dump_irq_restore(void)
++{
++	local_irq_disable();
++	reset_irq_affinity();
++	irq_bh_restore();
++}
++
++/*
++ * Name: __dump_configure_header()
++ * Func: Meant to fill in arch specific header fields except per-cpu state
++ * already captured via __dump_save_context for all CPUs.
++ */
++int
++__dump_configure_header(const struct pt_regs *regs)
++{
++	return (0);
++}
++
++/*
++ * Name: __dump_init()
++ * Func: Initialize the dumping routine process.
++ */
++void
++__dump_init(uint64_t local_memory_start)
++{
++	return;
++}
++
++/*
++ * Name: __dump_open()
++ * Func: Open the dump device (architecture specific).
++ */
++void
++__dump_open(void)
++{
++	alloc_dha_stack();
++}
++
++/*
++ * Name: __dump_cleanup()
++ * Func: Free any architecture specific data structures. This is called
++ *       when the dump module is being removed.
++ */
++void
++__dump_cleanup(void)
++{
++	free_dha_stack();
++}
++
++extern int pfn_is_ram(unsigned long);
++
++/*
++ * Name: __dump_page_valid()
++ * Func: Check if page is valid to dump.
++ */ 
++int 
++__dump_page_valid(unsigned long index)
++{
++	if (!pfn_valid(index))
++		return 0;
++
++	return pfn_is_ram(index);
++}
++
+--- linux-2.5.69/drivers/dump/dump_memdev.c.lkcdbase	Mon Jun  2 17:29:49 2003
++++ linux-2.5.69/drivers/dump/dump_memdev.c	Tue Mar 25 21:34:35 2003
+@@ -0,0 +1,640 @@
++/*
++ * Implements the dump driver interface for saving a dump in available
++ * memory areas. The saved pages may be written out to persistent storage  
++ * after a soft reboot.
++ *
++ * Started: Oct 2002 -  Suparna Bhattacharya <suparna@in.ibm.com>
++ *
++ * Copyright (C) 2002 International Business Machines Corp. 
++ *
++ * This code is released under version 2 of the GNU GPL.
++ *
++ * The approach of tracking pages containing saved dump using map pages 
++ * allocated as needed has been derived from the Mission Critical Linux 
++ * mcore dump implementation. 
++ *
++ * Credits and a big thanks for letting the lkcd project make use of 
++ * the excellent piece of work and also helping with clarifications 
++ * and tips along the way are due to:
++ * 	Dave Winchell <winchell@mclx.com> (primary author of mcore)
++ * 	Jeff Moyer <moyer@mclx.com>
++ * 	Josh Huber <huber@mclx.com>
++ *
++ * For those familiar with the mcore code, the main differences worth
++ * noting here (besides the dump device abstraction) result from enabling 
++ * "high" memory pages (pages not permanently mapped in the kernel 
++ * address space) to be used for saving dump data (because of which a 
++ * simple virtual address based linked list cannot be used anymore for 
++ * managing free pages), an added level of indirection for faster 
++ * lookups during the post-boot stage, and the idea of pages being 
++ * made available as they get freed up while dump to memory progresses 
++ * rather than one time before starting the dump. The last point enables 
++ * a full memory snapshot to be saved starting with an initial set of 
++ * bootstrap pages given a good compression ratio. (See dump_overlay.c)
++ *
++ */
++
++/*
++ * -----------------MEMORY LAYOUT ------------------
++ * The memory space consists of a set of discontiguous pages, and
++ * discontiguous map pages as well, rooted in a chain of indirect
++ * map pages (also discontiguous). Except for the indirect maps 
++ * (which must be preallocated in advance), the rest of the pages 
++ * could be in high memory.
++ *
++ * root
++ *  |    ---------    --------        --------
++ *  -->  | .  . +|--->|  .  +|------->| . .  |       indirect 
++ *       --|--|---    ---|----        --|-|---	     maps
++ *         |  |          |     	        | |	
++ *    ------  ------   -------     ------ -------
++ *    | .  |  | .  |   | .  . |    | .  | |  . . |   maps 
++ *    --|---  --|---   --|--|--    --|--- ---|-|--
++ *     page    page    page page   page   page page  data
++ *                                                   pages
++ *
++ * Writes to the dump device happen sequentially in append mode.
++ * The main reason for the existence of the indirect map is
++ * to enable a quick way to lookup a specific logical offset in
++ * the saved data post-soft-boot, e.g. to writeout pages
++ * with more critical data first, even though such pages
++ * would have been compressed and copied last, being the lowest
++ * ranked candidates for reuse due to their criticality.
++ * (See dump_overlay.c)
++ */
++#include <linux/mm.h>
++#include <linux/highmem.h>
++#include <linux/bootmem.h>
++#include <linux/dump.h>
++#include "dump_methods.h"
++
++#define DUMP_MAP_SZ (PAGE_SIZE / sizeof(unsigned long)) /* direct map size */
++#define DUMP_IND_MAP_SZ	DUMP_MAP_SZ - 1  /* indirect map size */
++#define DUMP_NR_BOOTSTRAP	64  /* no of bootstrap pages */
++
++extern int dump_low_page(struct page *);
++
++/* check if the next entry crosses a page boundary */
++static inline int is_last_map_entry(unsigned long *map)
++{
++	unsigned long addr = (unsigned long)(map + 1);
++
++	return (!(addr & (PAGE_SIZE - 1)));
++}
++
++/* Todo: should have some validation checks */
++/* The last entry in the indirect map points to the next indirect map */
++/* Indirect maps are referred to directly by virtual address */
++static inline unsigned long *next_indirect_map(unsigned long *map)
++{
++	return (unsigned long *)map[DUMP_IND_MAP_SZ];
++}
++
++#ifdef CONFIG_CRASH_DUMP_SOFTBOOT
++/* Called during early bootup - fixme: make this __init */
++void dump_early_reserve_map(struct dump_memdev *dev)
++{
++	unsigned long *map1, *map2;
++	loff_t off = 0, last = dev->last_used_offset >> PAGE_SHIFT;
++	int i, j;
++	
++	printk("Reserve bootmap space holding previous dump of %lld pages\n",
++			last);
++	map1= (unsigned long *)dev->indirect_map_root;
++
++	while (map1 && (off < last)) {
++		reserve_bootmem(virt_to_phys((void *)map1), PAGE_SIZE);
++		for (i=0;  (i < DUMP_MAP_SZ - 1) && map1[i] && (off < last); 
++			i++, off += DUMP_MAP_SZ) {
++			pr_debug("indirect map[%d] = 0x%lx\n", i, map1[i]);
++			if (map1[i] >= max_low_pfn)
++				continue;
++			reserve_bootmem(map1[i] << PAGE_SHIFT, PAGE_SIZE);
++			map2 = pfn_to_kaddr(map1[i]);
++			for (j = 0 ; (j < DUMP_MAP_SZ) && map2[j] && 
++				(off + j < last); j++) {
++				pr_debug("\t map[%d][%d] = 0x%lx\n", i, j, 
++					map2[j]);
++				if (map2[j] < max_low_pfn) {
++					reserve_bootmem(map2[j] << PAGE_SHIFT,
++						PAGE_SIZE);
++				}
++			}
++		}
++		map1 = next_indirect_map(map1);
++	}
++	dev->nr_free = 0; /* these pages don't belong to this boot */
++}
++#endif
++
++/* mark dump pages so that they aren't used by this kernel */
++void dump_mark_map(struct dump_memdev *dev)
++{
++	unsigned long *map1, *map2;
++	loff_t off = 0, last = dev->last_used_offset >> PAGE_SHIFT;
++	struct page *page;
++	int i, j;
++	
++	printk("Dump: marking pages in use by previous dump\n");
++	map1= (unsigned long *)dev->indirect_map_root;
++
++	while (map1 && (off < last)) {
++		page = virt_to_page(map1);	
++		set_page_count(page, 1);
++		for (i=0;  (i < DUMP_MAP_SZ - 1) && map1[i] && (off < last); 
++			i++, off += DUMP_MAP_SZ) {
++			pr_debug("indirect map[%d] = 0x%lx\n", i, map1[i]);
++			page = pfn_to_page(map1[i]);
++			set_page_count(page, 1);
++			map2 = kmap_atomic(page, KM_DUMP);
++			for (j = 0 ; (j < DUMP_MAP_SZ) && map2[j] && 
++				(off + j < last); j++) {
++				pr_debug("\t map[%d][%d] = 0x%lx\n", i, j, 
++					map2[j]);
++				page = pfn_to_page(map2[j]);
++				set_page_count(page, 1);
++			}
++		}
++		map1 = next_indirect_map(map1);
++	}
++}
++	
++
++/* 
++ * Given a logical offset into the mem device lookup the 
++ * corresponding page 
++ * 	loc is specified in units of pages 
++ * Note: affects curr_map (even in the case where lookup fails)
++ */
++struct page *dump_mem_lookup(struct dump_memdev *dump_mdev, unsigned long loc)
++{
++	unsigned long *map;
++	unsigned long i, index = loc / DUMP_MAP_SZ;
++	struct page *page = NULL;
++	unsigned long curr_pfn, curr_map, *curr_map_ptr = NULL;
++
++	map = (unsigned long *)dump_mdev->indirect_map_root;
++	if (!map)
++		return NULL;
++
++	if (loc > dump_mdev->last_offset >> PAGE_SHIFT)
++		return NULL;
++
++	/* 
++	 * first locate the right indirect map 
++	 * in the chain of indirect maps 
++	 */
++	for (i = 0; i + DUMP_IND_MAP_SZ < index ; i += DUMP_IND_MAP_SZ) {
++		if (!(map = next_indirect_map(map)))
++			return NULL;
++	}
++	/* then the right direct map */
++	/* map entries are referred to by page index */
++	if ((curr_map = map[index - i])) {
++		page = pfn_to_page(curr_map);
++		/* update the current traversal index */
++		/* dump_mdev->curr_map = &map[index - i];*/
++		curr_map_ptr = &map[index - i];
++	}
++
++	if (page)
++		map = kmap_atomic(page, KM_DUMP);
++	else 
++		return NULL;
++
++	/* and finally the right entry therein */
++	/* data pages are referred to by page index */
++	i = index * DUMP_MAP_SZ;
++	if ((curr_pfn = map[loc - i])) {
++		page = pfn_to_page(curr_pfn);
++		dump_mdev->curr_map = curr_map_ptr;
++		dump_mdev->curr_map_offset = loc - i;
++		dump_mdev->ddev.curr_offset = loc << PAGE_SHIFT;
++	} else {
++		page = NULL;
++	}
++	kunmap_atomic(map, KM_DUMP);
++
++	return page;
++}
++			
++/* 
++ * Retrieves a pointer to the next page in the dump device 
++ * Used during the lookup pass post-soft-reboot 
++ */
++struct page *dump_mem_next_page(struct dump_memdev *dev)
++{
++	unsigned long i; 
++	unsigned long *map;	
++	struct page *page = NULL;
++
++	if (dev->ddev.curr_offset + PAGE_SIZE >= dev->last_offset) {
++		return NULL;
++	}
++
++	if ((i = (unsigned long)(++dev->curr_map_offset)) >= DUMP_MAP_SZ) {
++		/* move to next map */	
++		if (is_last_map_entry(++dev->curr_map)) {
++			/* move to the next indirect map page */
++			printk("dump_mem_next_page: go to next indirect map\n");
++			dev->curr_map = (unsigned long *)*dev->curr_map;
++			if (!dev->curr_map)
++				return NULL;
++		}
++		i = dev->curr_map_offset = 0;
++		pr_debug("dump_mem_next_page: next map 0x%lx, entry 0x%lx\n",
++				dev->curr_map, *dev->curr_map);
++
++	};
++	
++	if (*dev->curr_map) {
++		map = kmap_atomic(pfn_to_page(*dev->curr_map), KM_DUMP);
++		if (map[i])
++			page = pfn_to_page(map[i]);
++		kunmap_atomic(map, KM_DUMP);
++		dev->ddev.curr_offset += PAGE_SIZE;
++	};
++
++	return page;
++}
++
++/* Copied from dump_filters.c */
++static inline int kernel_page(struct page *p)
++{
++	/* FIXME: Need to exclude hugetlb pages. Clue: reserved but inuse */
++	return PageReserved(p) || (!PageLRU(p) && PageInuse(p));
++}
++
++static inline int user_page(struct page *p)
++{
++	return PageInuse(p) && (!PageReserved(p) && PageLRU(p));
++}
++
++int dump_reused_by_boot(struct page *page)
++{
++	/* Todo
++	 * Checks:
++	 * if PageReserved 
++	 * if < __end + bootmem_bootmap_pages for this boot + allowance 
++	 * if overwritten by initrd (how to check ?)
++	 * Also, add more checks in early boot code
++	 * e.g. bootmem bootmap alloc verify not overwriting dump, and if
++	 * so then realloc or move the dump pages out accordingly.
++	 */
++
++	/* Temporary proof of concept hack, avoid overwriting kern pages */
++
++	return (kernel_page(page) || dump_low_page(page) || user_page(page));
++}
++
++
++/* Uses the free page passed in to expand available space */
++int dump_mem_add_space(struct dump_memdev *dev, struct page *page)
++{
++	struct page *map_page;
++	unsigned long *map;	
++	unsigned long i; 
++
++	if (!dev->curr_map)
++		return -ENOMEM; /* must've exhausted indirect map */
++
++	if (!*dev->curr_map || dev->curr_map_offset >= DUMP_MAP_SZ) {
++		/* add map space */
++		*dev->curr_map = page_to_pfn(page);
++		dev->curr_map_offset = 0;
++		return 0;
++	}
++
++	/* add data space */
++	i = dev->curr_map_offset;
++	map_page = pfn_to_page(*dev->curr_map);
++	map = (unsigned long *)kmap_atomic(map_page, KM_DUMP);
++	map[i] = page_to_pfn(page);
++	kunmap_atomic(map, KM_DUMP);
++	dev->curr_map_offset = ++i;
++	dev->last_offset += PAGE_SIZE;
++	if (i >= DUMP_MAP_SZ) {
++		/* move to next map */
++		if (is_last_map_entry(++dev->curr_map)) {
++			/* move to the next indirect map page */
++			pr_debug("dump_mem_add_space: using next"
++			"indirect map\n");
++			dev->curr_map = (unsigned long *)*dev->curr_map;
++		}
++	}		
++	return 0;
++}
++
++
++/* Caution: making a dest page invalidates existing contents of the page */
++int dump_check_and_free_page(struct dump_memdev *dev, struct page *page)
++{
++	int err = 0;
++
++	/* 
++	 * the page can be used as a destination only if we are sure
++	 * it won't get overwritten by the soft-boot, and is not
++	 * critical for us right now.
++	 */
++	if (dump_reused_by_boot(page))
++		return 0;
++
++	if ((err = dump_mem_add_space(dev, page))) {
++		printk("Warning: Unable to extend memdev space. Err %d\n",
++		err);
++		return 0;
++	}
++
++	dev->nr_free++;
++	return 1;
++}
++
++
++/* Set up the initial maps and bootstrap space  */
++/* Must be called only after any previous dump is written out */
++int dump_mem_open(struct dump_dev *dev, unsigned long devid)
++{
++	struct dump_memdev *dump_mdev = DUMP_MDEV(dev);
++	unsigned long nr_maps, *map, *prev_map = &dump_mdev->indirect_map_root;
++	void *addr;
++	struct page *page;
++	unsigned long i = 0;
++	int err = 0;
++
++	/* Todo: sanity check for unwritten previous dump */
++
++	/* allocate pages for indirect map (non highmem area) */
++	nr_maps = num_physpages / DUMP_MAP_SZ; /* maps to cover entire mem */
++	for (i = 0; i < nr_maps; i += DUMP_IND_MAP_SZ) {
++		if (!(map = (unsigned long *)dump_alloc_mem(PAGE_SIZE))) {
++			printk("Unable to alloc indirect map %ld\n", 
++				i / DUMP_IND_MAP_SZ);
++			return -ENOMEM;
++		}
++		clear_page(map);
++		*prev_map = (unsigned long)map;
++		prev_map = &map[DUMP_IND_MAP_SZ];
++	};
++		
++	dump_mdev->curr_map = (unsigned long *)dump_mdev->indirect_map_root;
++	dump_mdev->curr_map_offset = 0;	
++
++	/* 
++	 * allocate a few bootstrap pages: at least 1 map and 1 data page
++	 * plus enough to save the dump header
++	 */
++	i = 0;
++	do {
++		if (!(addr = dump_alloc_mem(PAGE_SIZE))) {
++			printk("Unable to alloc bootstrap page %ld\n", i);
++			return -ENOMEM;
++		}
++
++		page = virt_to_page(addr);
++		if (dump_low_page(page)) {
++			dump_free_mem(addr);
++			continue;
++		}
++
++		if (dump_mem_add_space(dump_mdev, page)) {
++			printk("Warning: Unable to extend memdev "
++					"space. Err %d\n", err);
++			dump_free_mem(addr);
++			continue;
++		}
++		i++;
++	} while (i < DUMP_NR_BOOTSTRAP);
++
++	printk("dump memdev init: %ld maps, %ld bootstrap pgs, %ld free pgs\n",
++		nr_maps, i, dump_mdev->last_offset >> PAGE_SHIFT);
++	
++	dump_mdev->last_bs_offset = dump_mdev->last_offset;
++
++	return 0;
++}
++
++/* Releases all pre-alloc'd pages */
++int dump_mem_release(struct dump_dev *dev)
++{
++	struct dump_memdev *dump_mdev = DUMP_MDEV(dev);
++	struct page *page, *map_page;
++	unsigned long *map, *prev_map;
++	void *addr;
++	int i;
++
++	if (!dump_mdev->nr_free)
++		return 0;
++
++	pr_debug("dump_mem_release\n");
++	page = dump_mem_lookup(dump_mdev, 0);
++	for (i = 0; page && (i < DUMP_NR_BOOTSTRAP - 1); i++) {
++		if (PageHighMem(page))
++			break;
++		addr = page_address(page);
++		if (!addr) {
++			printk("page_address(%p) = NULL\n", page);
++			break;
++		}
++		pr_debug("Freeing page at 0x%lx\n", addr); 
++		dump_free_mem(addr);
++		if (dump_mdev->curr_map_offset >= DUMP_MAP_SZ - 1) {
++			map_page = pfn_to_page(*dump_mdev->curr_map);
++			if (PageHighMem(map_page))
++				break;
++			page = dump_mem_next_page(dump_mdev);
++			addr = page_address(map_page);
++			if (!addr) {
++				printk("page_address(%p) = NULL\n", 
++					map_page);
++				break;
++			}
++			pr_debug("Freeing map page at 0x%lx\n", addr);
++			dump_free_mem(addr);
++			i++;
++		} else {
++			page = dump_mem_next_page(dump_mdev);
++		}
++	}
++
++	/* now for the last used bootstrap page used as a map page */
++	if ((i < DUMP_NR_BOOTSTRAP) && (*dump_mdev->curr_map)) {
++		map_page = pfn_to_page(*dump_mdev->curr_map);
++		if ((map_page) && !PageHighMem(map_page)) {
++			addr = page_address(map_page);
++			if (!addr) {
++				printk("page_address(%p) = NULL\n", map_page);
++			} else {
++				pr_debug("Freeing map page at 0x%lx\n", addr);
++				dump_free_mem(addr);
++				i++;
++			}
++		}
++	}
++
++	printk("Freed %d bootstrap pages\n", i);
++
++	/* free the indirect maps */
++	map = (unsigned long *)dump_mdev->indirect_map_root;
++
++	i = 0;
++	while (map) {
++		prev_map = map;
++		map = next_indirect_map(map);
++		dump_free_mem(prev_map);
++		i++;
++	}
++
++	printk("Freed %d indirect map(s)\n", i);
++
++	/* Reset the indirect map */
++	dump_mdev->indirect_map_root = 0;
++	dump_mdev->curr_map = 0;
++
++	/* Reset the free list */
++	dump_mdev->nr_free = 0;
++
++	dump_mdev->last_offset = dump_mdev->ddev.curr_offset = 0;
++	dump_mdev->last_used_offset = 0;
++	dump_mdev->curr_map = NULL;
++	dump_mdev->curr_map_offset = 0;
++	return 0;
++}
++
++/*
++ * Long term:
++ * It is critical for this to be very strict. Cannot afford
++ * to have anything running and accessing memory while we overwrite 
++ * memory (potential risk of data corruption).
++ * If in doubt (e.g if a cpu is hung and not responding) just give
++ * up and refuse to proceed with this scheme.
++ *
++ * Note: I/O will only happen after soft-boot/switchover, so we can 
++ * safely disable interrupts and force stop other CPUs if this is
++ * going to be a disruptive dump, no matter what they
++ * are in the middle of.
++ */
++/* 
++ * ATM Most of this is already taken care of in the nmi handler 
++ * We may halt the cpus rightaway if we know this is going to be disruptive 
++ * For now, since we've limited ourselves to overwriting free pages we
++ * aren't doing much here. Eventually, we'd have to wait to make sure other
++ * cpus aren't using memory we could be overwriting
++ */
++int dump_mem_silence(struct dump_dev *dev)
++{
++	struct dump_memdev *dump_mdev = DUMP_MDEV(dev);
++
++	if (dump_mdev->last_offset > dump_mdev->last_bs_offset) {
++		/* prefer to run lkcd config & start with a clean slate */
++		return -EEXIST;
++	}
++	return 0;
++}
++
++extern int dump_overlay_resume(void);
++
++/* Trigger the next stage of dumping */
++int dump_mem_resume(struct dump_dev *dev)
++{
++	dump_overlay_resume(); 
++	return 0;
++}
++
++/* 
++ * Allocate mem dev pages as required and copy buffer contents into it.
++ * Fails if the no free pages are available
++ * Keeping it simple and limited for starters (can modify this over time)
++ *  Does not handle holes or a sparse layout
++ *  Data must be in multiples of PAGE_SIZE
++ */
++int dump_mem_write(struct dump_dev *dev, void *buf, unsigned long len)
++{
++	struct dump_memdev *dump_mdev = DUMP_MDEV(dev);
++	struct page *page;
++	unsigned long n = 0;
++	void *addr;
++	unsigned long *saved_curr_map, saved_map_offset;
++	int ret = 0;
++
++	pr_debug("dump_mem_write: offset 0x%llx, size %ld\n", 
++		dev->curr_offset, len);
++
++	if (dev->curr_offset + len > dump_mdev->last_offset)  {
++		printk("Out of space to write\n");
++		return -ENOSPC;
++	}
++	
++	if ((len & (PAGE_SIZE - 1)) || (dev->curr_offset & (PAGE_SIZE - 1)))
++		return -EINVAL; /* not aligned in units of page size */
++
++	saved_curr_map = dump_mdev->curr_map;
++	saved_map_offset = dump_mdev->curr_map_offset;
++	page = dump_mem_lookup(dump_mdev, dev->curr_offset >> PAGE_SHIFT);
++
++	for (n = len; (n > 0) && page; n -= PAGE_SIZE, buf += PAGE_SIZE ) {
++		addr = kmap_atomic(page, KM_DUMP);
++		/* memset(addr, 'x', PAGE_SIZE); */
++		memcpy(addr, buf, PAGE_SIZE);
++		kunmap_atomic(addr, KM_DUMP);
++		/* dev->curr_offset += PAGE_SIZE; */
++		page = dump_mem_next_page(dump_mdev);
++	}
++
++	dump_mdev->curr_map = saved_curr_map;
++	dump_mdev->curr_map_offset = saved_map_offset;
++
++	if (dump_mdev->last_used_offset < dev->curr_offset)
++		dump_mdev->last_used_offset = dev->curr_offset;
++
++	return (len - n) ? (len - n) : ret ;
++}
++
++/* dummy - always ready */
++int dump_mem_ready(struct dump_dev *dev, void *buf)
++{
++	return 0;
++}
++
++/* 
++ * Should check for availability of space to write upto the offset 
++ * affects only the curr_offset; last_offset untouched 
++ * Keep it simple: Only allow multiples of PAGE_SIZE for now 
++ */
++int dump_mem_seek(struct dump_dev *dev, loff_t offset)
++{
++	struct dump_memdev *dump_mdev = DUMP_MDEV(dev);
++
++	if (offset & (PAGE_SIZE - 1))
++		return -EINVAL; /* allow page size units only for now */
++	
++	/* Are we exceeding available space ? */
++	if (offset > dump_mdev->last_offset) {
++		printk("dump_mem_seek failed for offset 0x%llx\n",
++			offset);
++		return -ENOSPC;	
++	}
++
++	dump_mdev->ddev.curr_offset = offset;
++	return 0;
++}
++
++struct dump_dev_ops dump_memdev_ops = {
++	.open 		= dump_mem_open,
++	.release	= dump_mem_release,
++	.silence	= dump_mem_silence,
++	.resume 	= dump_mem_resume,
++	.seek		= dump_mem_seek,
++	.write		= dump_mem_write,
++	.read		= NULL, /* not implemented at the moment */
++	.ready		= dump_mem_ready
++};
++
++static struct dump_memdev default_dump_memdev = {
++	.ddev = {.type_name = "memdev", .ops = &dump_memdev_ops,
++        	 .device_id = 0x14}
++	/* assume the rest of the fields are zeroed by default */
++};	
++	
++/* may be overwritten if a previous dump exists */
++struct dump_memdev *dump_memdev = &default_dump_memdev;
++
+--- linux-2.5.69/drivers/dump/dump_netdev.c.lkcdbase	Mon Jun  2 17:29:49 2003
++++ linux-2.5.69/drivers/dump/dump_netdev.c	Tue May 20 03:04:07 2003
+@@ -0,0 +1,863 @@
++/*
++ * Implements the dump driver interface for saving a dump via network
++ * interface. 
++ *
++ * Some of this code has been taken/adapted from Ingo Molnar's netconsole
++ * code. LKCD team expresses its thanks to Ingo.
++ *
++ * Started: June 2002 - Mohamed Abbas <mohamed.abbas@intel.com>
++ * 	Adapted netconsole code to implement LKCD dump over the network.
++ *
++ * Nov 2002 - Bharata B. Rao <bharata@in.ibm.com>
++ * 	Innumerable code cleanups, simplification and some fixes.
++ *	Netdump configuration done by ioctl instead of using module parameters.
++ *
++ * Copyright (C) 2001  Ingo Molnar <mingo@redhat.com>
++ * Copyright (C) 2002 International Business Machines Corp. 
++ *
++ *  This code is released under version 2 of the GNU GPL.
++ */
++
++#include <net/tcp.h>
++#include <net/udp.h>
++#include <linux/delay.h>
++#include <linux/random.h>
++#include <linux/reboot.h>
++#include <linux/module.h>
++#include <linux/dump.h>
++#include <linux/dump_netdev.h>
++
++#include <asm/unaligned.h>
++
++static int startup_handshake;
++static int page_counter;
++static struct net_device *dump_ndev;
++static struct in_device *dump_in_dev;
++static u16 source_port, target_port;
++static u32 source_ip, target_ip;
++static unsigned char daddr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff} ;
++static spinlock_t dump_skb_lock = SPIN_LOCK_UNLOCKED;
++static int dump_nr_skbs;
++static struct sk_buff *dump_skb;
++static unsigned long flags_global;
++static int netdump_in_progress;
++static char device_name[IFNAMSIZ];
++
++/*
++ * security depends on the trusted path between the netconsole
++ * server and netconsole client, since none of the packets are
++ * encrypted. The random magic number protects the protocol
++ * against spoofing.
++ */
++static u64 dump_magic;
++
++#define MAX_UDP_CHUNK 1460
++#define MAX_PRINT_CHUNK (MAX_UDP_CHUNK-HEADER_LEN)
++
++/*
++ * We maintain a small pool of fully-sized skbs,
++ * to make sure the message gets out even in
++ * extreme OOM situations.
++ */
++#define DUMP_MAX_SKBS 32
++
++#define MAX_SKB_SIZE \
++		(MAX_UDP_CHUNK + sizeof(struct udphdr) + \
++				sizeof(struct iphdr) + sizeof(struct ethhdr))
++
++static void
++dump_refill_skbs(void)
++{
++	struct sk_buff *skb;
++	unsigned long flags;
++
++	spin_lock_irqsave(&dump_skb_lock, flags);
++	while (dump_nr_skbs < DUMP_MAX_SKBS) {
++		skb = alloc_skb(MAX_SKB_SIZE, GFP_ATOMIC);
++		if (!skb)
++			break;
++		if (dump_skb)
++			skb->next = dump_skb;
++		else
++			skb->next = NULL;
++		dump_skb = skb;
++		dump_nr_skbs++;
++	}
++	spin_unlock_irqrestore(&dump_skb_lock, flags);
++}
++
++static struct
++sk_buff * dump_get_skb(void)
++{
++	struct sk_buff *skb;
++	unsigned long flags;
++
++	spin_lock_irqsave(&dump_skb_lock, flags);
++	skb = dump_skb;
++	if (skb) {
++		dump_skb = skb->next;
++		skb->next = NULL;
++		dump_nr_skbs--;
++	}
++	spin_unlock_irqrestore(&dump_skb_lock, flags);
++        
++	return skb;
++}
++
++/*
++ * Zap completed output skbs.
++ */
++static void
++zap_completion_queue(void)
++{
++	int count;
++	unsigned long flags;
++	int cpu = smp_processor_id();
++
++        count=0;
++	if (softnet_data[cpu].completion_queue) {
++		struct sk_buff *clist;
++	
++		local_irq_save(flags);
++		clist = softnet_data[cpu].completion_queue;
++		softnet_data[cpu].completion_queue = NULL;
++		local_irq_restore(flags);
++
++		while (clist != NULL) {
++			struct sk_buff *skb = clist;
++			clist = clist->next;
++			__kfree_skb(skb);
++			count++;
++			if (count > 10000)
++				printk("Error in sk list\n");
++		}
++	}
++}
++
++static void
++dump_send_skb(struct net_device *dev, const char *msg, unsigned int msg_len,
++		reply_t *reply)
++{
++	int once = 1;
++	int total_len, eth_len, ip_len, udp_len, count = 0;
++	struct sk_buff *skb;
++	struct udphdr *udph;
++	struct iphdr *iph;
++	struct ethhdr *eth; 
++
++	udp_len = msg_len + HEADER_LEN + sizeof(*udph);
++	ip_len = eth_len = udp_len + sizeof(*iph);
++	total_len = eth_len + ETH_HLEN;
++
++repeat_loop:
++	zap_completion_queue();
++	if (dump_nr_skbs < DUMP_MAX_SKBS)
++		dump_refill_skbs();
++
++	skb = alloc_skb(total_len, GFP_ATOMIC);
++	if (!skb) {
++		skb = dump_get_skb();
++		if (!skb) {
++			count++;
++			if (once && (count == 1000000)) {
++				printk("possibly FATAL: out of netconsole "
++					"skbs!!! will keep retrying.\n");
++				once = 0;
++			}
++			dev->poll_controller(dev);
++			goto repeat_loop;
++		}
++	}
++
++	atomic_set(&skb->users, 1);
++	skb_reserve(skb, total_len - msg_len - HEADER_LEN);
++	skb->data[0] = NETCONSOLE_VERSION;
++
++	put_unaligned(htonl(reply->nr), (u32 *) (skb->data + 1));
++	put_unaligned(htonl(reply->code), (u32 *) (skb->data + 5));
++	put_unaligned(htonl(reply->info), (u32 *) (skb->data + 9));
++
++	memcpy(skb->data + HEADER_LEN, msg, msg_len);
++	skb->len += msg_len + HEADER_LEN;
++
++	udph = (struct udphdr *) skb_push(skb, sizeof(*udph));
++	udph->source = source_port;
++	udph->dest = target_port;
++	udph->len = htons(udp_len);
++	udph->check = 0;
++
++	iph = (struct iphdr *)skb_push(skb, sizeof(*iph));
++
++	iph->version  = 4;
++	iph->ihl      = 5;
++	iph->tos      = 0;
++	iph->tot_len  = htons(ip_len);
++	iph->id       = 0;
++	iph->frag_off = 0;
++	iph->ttl      = 64;
++	iph->protocol = IPPROTO_UDP;
++	iph->check    = 0;
++	iph->saddr    = source_ip;
++	iph->daddr    = target_ip;
++	iph->check    = ip_fast_csum((unsigned char *)iph, iph->ihl);
++
++	eth = (struct ethhdr *) skb_push(skb, ETH_HLEN);
++
++	eth->h_proto = htons(ETH_P_IP);
++	memcpy(eth->h_source, dev->dev_addr, dev->addr_len);
++	memcpy(eth->h_dest, daddr, dev->addr_len);
++
++	count=0;
++repeat_poll:
++	spin_lock(&dev->xmit_lock);
++	dev->xmit_lock_owner = smp_processor_id();
++
++	count++;
++
++
++	if (netif_queue_stopped(dev)) {
++		dev->xmit_lock_owner = -1;
++		spin_unlock(&dev->xmit_lock);
++
++		dev->poll_controller(dev);
++		zap_completion_queue();
++
++
++		goto repeat_poll;
++	}
++
++	dev->hard_start_xmit(skb, dev);
++
++	dev->xmit_lock_owner = -1;
++	spin_unlock(&dev->xmit_lock);
++}
++
++static unsigned short
++udp_check(struct udphdr *uh, int len, unsigned long saddr, unsigned long daddr,
++	       	unsigned long base)
++{
++	return csum_tcpudp_magic(saddr, daddr, len, IPPROTO_UDP, base);
++}
++
++static int
++udp_checksum_init(struct sk_buff *skb, struct udphdr *uh,
++			     unsigned short ulen, u32 saddr, u32 daddr)
++{
++	if (uh->check == 0) {
++		skb->ip_summed = CHECKSUM_UNNECESSARY;
++	} else if (skb->ip_summed == CHECKSUM_HW) {
++		skb->ip_summed = CHECKSUM_UNNECESSARY;
++		if (!udp_check(uh, ulen, saddr, daddr, skb->csum))
++			return 0;
++		skb->ip_summed = CHECKSUM_NONE;
++	}
++	if (skb->ip_summed != CHECKSUM_UNNECESSARY)
++		skb->csum = csum_tcpudp_nofold(saddr, daddr, ulen,
++				IPPROTO_UDP, 0);
++	/* Probably, we should checksum udp header (it should be in cache
++	 * in any case) and data in tiny packets (< rx copybreak).
++	 */
++	return 0;
++}
++
++static __inline__ int
++__udp_checksum_complete(struct sk_buff *skb)
++{
++	return (unsigned short)csum_fold(skb_checksum(skb, 0, skb->len,
++				skb->csum));
++}
++
++static __inline__
++int udp_checksum_complete(struct sk_buff *skb)
++{
++	return skb->ip_summed != CHECKSUM_UNNECESSARY &&
++		__udp_checksum_complete(skb);
++}
++
++int new_req = 0;
++static req_t req;
++
++static int
++dump_rx_hook(struct sk_buff *skb)
++{
++	int proto;
++	struct iphdr *iph;
++	struct udphdr *uh;
++	__u32 len, saddr, daddr, ulen;
++	req_t *__req;
++
++	/* 
++	 * First check if were are dumping or doing startup handshake, if
++	 * not quickly return.
++	 */
++	if (!netdump_in_progress)
++		return NET_RX_SUCCESS;
++
++	if (skb->dev->type != ARPHRD_ETHER)
++		goto out;
++
++	proto = ntohs(skb->mac.ethernet->h_proto);
++	if (proto != ETH_P_IP)
++		goto out;
++
++	if (skb->pkt_type == PACKET_OTHERHOST)
++		goto out;
++
++	if (skb_shared(skb))
++		goto out;
++
++	 /* IP header correctness testing: */
++	iph = (struct iphdr *)skb->data;
++	if (!pskb_may_pull(skb, sizeof(struct iphdr)))
++		goto out;
++
++	if (iph->ihl < 5 || iph->version != 4)
++		goto out;
++
++	if (!pskb_may_pull(skb, iph->ihl*4))
++		goto out;
++
++	if (ip_fast_csum((u8 *)iph, iph->ihl) != 0)
++		goto out;
++
++	len = ntohs(iph->tot_len);
++	if (skb->len < len || len < iph->ihl*4)
++		goto out;
++
++	saddr = iph->saddr;
++	daddr = iph->daddr;
++	if (iph->protocol != IPPROTO_UDP)
++		goto out;
++
++	if (source_ip != daddr)
++		goto out;
++
++	if (target_ip != saddr)
++		goto out;
++
++	len -= iph->ihl*4;
++	uh = (struct udphdr *)(((char *)iph) + iph->ihl*4);
++	ulen = ntohs(uh->len);
++
++	if (ulen != len || ulen < (sizeof(*uh) + sizeof(*__req)))
++		goto out;
++
++	if (udp_checksum_init(skb, uh, ulen, saddr, daddr) < 0)
++		goto out;
++
++	if (udp_checksum_complete(skb))
++		goto out;
++
++	if (source_port != uh->dest)
++		goto out;
++
++	if (target_port != uh->source)
++		goto out;
++
++	__req = (req_t *)(uh + 1);
++	if ((ntohl(__req->command) != COMM_GET_MAGIC) &&
++	    (ntohl(__req->command) != COMM_HELLO) &&
++	    (ntohl(__req->command) != COMM_START_WRITE_NETDUMP_ACK) &&
++	    (ntohl(__req->command) != COMM_START_NETDUMP_ACK) &&
++	    (memcmp(&__req->magic, &dump_magic, sizeof(dump_magic)) != 0))
++		goto out;
++
++	req.magic = ntohl(__req->magic);
++	req.command = ntohl(__req->command);
++	req.from = ntohl(__req->from);
++	req.to = ntohl(__req->to);
++	req.nr = ntohl(__req->nr);
++	new_req = 1;
++out:
++	return NET_RX_DROP;
++}
++
++static void
++dump_send_mem(struct net_device *dev, req_t *req, const char* buff, size_t len)
++{
++	int i;
++
++	int nr_chunks = len/1024;
++	reply_t reply;
++	
++	reply.nr = req->nr;
++	reply.info = 0;
++
++        if ( nr_chunks <= 0)
++		 nr_chunks = 1;
++	for (i = 0; i < nr_chunks; i++) {
++		unsigned int offset = i*1024;
++		reply.code = REPLY_MEM;
++		reply.info = offset;
++                dump_send_skb(dev, buff + offset, 1024, &reply);
++	}
++}
++
++/*
++ * This function waits for the client to acknowledge the receipt
++ * of the netdump startup reply, with the possibility of packets
++ * getting lost. We resend the startup packet if no ACK is received,
++ * after a 1 second delay.
++ *
++ * (The client can test the success of the handshake via the HELLO
++ * command, and send ACKs until we enter netdump mode.)
++ */
++static int
++dump_handshake(struct dump_dev *net_dev)
++{
++	char tmp[200];
++	reply_t reply;
++	int i, j;
++
++	if (startup_handshake) {
++		sprintf(tmp, "NETDUMP start, waiting for start-ACK.\n");
++		reply.code = REPLY_START_NETDUMP;
++		reply.nr = 0;
++		reply.info = 0;
++	} else {
++		sprintf(tmp, "NETDUMP start, waiting for start-ACK.\n");
++		reply.code = REPLY_START_WRITE_NETDUMP;
++		reply.nr = net_dev->curr_offset;
++		reply.info = net_dev->curr_offset;
++	}
++	
++	/* send 300 handshake packets before declaring failure */
++	for (i = 0; i < 300; i++) {
++		dump_send_skb(dump_ndev, tmp, strlen(tmp), &reply);
++
++		/* wait 1 sec */
++		for (j = 0; j < 10000; j++) {
++			udelay(100);
++			dump_ndev->poll_controller(dump_ndev);
++			zap_completion_queue();
++			if (new_req)
++				break;
++		}
++
++		/* 
++		 * if there is no new request, try sending the handshaking
++		 * packet again
++		 */
++		if (!new_req)
++			continue;
++
++		/* 
++		 * check if the new request is of the expected type,
++		 * if so, return, else try sending the handshaking
++		 * packet again
++		 */
++		if (startup_handshake) {
++			if (req.command == COMM_HELLO || req.command ==
++				COMM_START_NETDUMP_ACK) {
++				return 0;
++			} else {
++				new_req = 0;
++				continue;
++			}
++		} else {
++			if (req.command == COMM_SEND_MEM) {
++				return 0;
++			} else {
++				new_req = 0;
++				continue;
++			}
++		}
++	}
++	return -1;
++}
++
++static ssize_t
++do_netdump(struct dump_dev *net_dev, const char* buff, size_t len)
++{
++	reply_t reply;
++	char tmp[200];
++	ssize_t  ret = 0;
++	int repeatCounter, counter, total_loop;
++	
++	netdump_in_progress = 1;
++
++	if (dump_handshake(net_dev) < 0) {
++		printk("network dump failed due to handshake failure\n");
++		goto out;
++	}
++
++	/*
++	 * Ideally startup handshake should be done during dump configuration,
++	 * i.e., in dump_net_open(). This will be done when I figure out
++	 * the dependency between startup handshake, subsequent write and
++	 * various commands wrt to net-server.
++	 */
++	if (startup_handshake)
++		startup_handshake = 0;
++
++        counter = 0;
++	repeatCounter = 0;
++	total_loop = 0;
++	while (1) {
++                if (!new_req) {
++			dump_ndev->poll_controller(dump_ndev);
++			zap_completion_queue();
++		}
++		if (!new_req) {
++			repeatCounter++;
++
++			if (repeatCounter > 5) {
++				counter++;
++				if (counter > 10000) {
++					if (total_loop >= 100000) {
++						printk("Time OUT LEAVE NOW\n");
++						goto out;
++					} else {
++						total_loop++;
++						printk("Try number %d out of "
++							"10 before Time Out\n",
++							total_loop);
++					}
++				}
++				mdelay(1);
++				repeatCounter = 0;
++			}	
++			continue;
++		}
++		repeatCounter = 0;
++		counter = 0;
++		total_loop = 0;
++		new_req = 0;
++		switch (req.command) {
++		case COMM_NONE:
++			break;
++
++		case COMM_SEND_MEM:
++			dump_send_mem(dump_ndev, &req, buff, len);
++			break;
++
++		case COMM_EXIT:
++                case COMM_START_WRITE_NETDUMP_ACK:
++			ret = len;
++			goto out;
++
++		case COMM_HELLO:
++			sprintf(tmp, "Hello, this is netdump version "
++					"0.%02d\n", NETCONSOLE_VERSION);
++			reply.code = REPLY_HELLO;
++			reply.nr = req.nr;
++                        reply.info = net_dev->curr_offset;
++			dump_send_skb(dump_ndev, tmp, strlen(tmp), &reply);
++			break;
++
++		case COMM_GET_PAGE_SIZE:
++			sprintf(tmp, "PAGE_SIZE: %ld\n", PAGE_SIZE);
++			reply.code = REPLY_PAGE_SIZE;
++			reply.nr = req.nr;
++			reply.info = PAGE_SIZE;
++			dump_send_skb(dump_ndev, tmp, strlen(tmp), &reply);
++			break;
++
++		case COMM_GET_NR_PAGES:
++			reply.code = REPLY_NR_PAGES;
++			reply.nr = req.nr;
++			reply.info = num_physpages;
++                        reply.info = page_counter;
++			sprintf(tmp, "Number of pages: %ld\n", num_physpages);
++			dump_send_skb(dump_ndev, tmp, strlen(tmp), &reply);
++			break;
++
++		case COMM_GET_MAGIC:
++			reply.code = REPLY_MAGIC;
++			reply.nr = req.nr;
++			reply.info = NETCONSOLE_VERSION;
++			dump_send_skb(dump_ndev, (char *)&dump_magic,
++					sizeof(dump_magic), &reply);
++			break;
++
++		default:
++			reply.code = REPLY_ERROR;
++			reply.nr = req.nr;
++			reply.info = req.command;
++			sprintf(tmp, "Got unknown command code %d!\n",
++					req.command);
++			dump_send_skb(dump_ndev, tmp, strlen(tmp), &reply);
++			break;
++		}
++	}
++out:
++	netdump_in_progress = 0;
++	return ret;
++}
++
++static int
++dump_validate_config(void)
++{
++	source_ip = dump_in_dev->ifa_list->ifa_local;
++	if (!source_ip) {
++		printk("network device %s has no local address, "
++				"aborting.\n", device_name);
++		return -1;
++	}
++
++#define IP(x) ((unsigned char *)&source_ip)[x]
++	printk("Source %d.%d.%d.%d", IP(0), IP(1), IP(2), IP(3));
++#undef IP
++
++	if (!source_port) {
++		printk("source_port parameter not specified, aborting.\n");
++		return -1;
++	}
++	printk(":%i\n", source_port);
++	source_port = htons(source_port);
++
++	if (!target_ip) {
++		printk("target_ip parameter not specified, aborting.\n");
++		return -1;
++	}
++
++#define IP(x) ((unsigned char *)&target_ip)[x]
++	printk("Target %d.%d.%d.%d", IP(0), IP(1), IP(2), IP(3));
++#undef IP
++
++	if (!target_port) {
++		printk("target_port parameter not specified, aborting.\n");
++		return -1;
++	}
++	printk(":%i\n", target_port);
++	target_port = htons(target_port);
++
++	printk("Target Ethernet Address %02x:%02x:%02x:%02x:%02x:%02x",
++		daddr[0], daddr[1], daddr[2], daddr[3], daddr[4], daddr[5]);
++
++	if ((daddr[0] & daddr[1] & daddr[2] & daddr[3] & daddr[4] & 
++				daddr[5]) == 255)
++		printk("(Broadcast)");
++	printk("\n");
++	return 0;
++}
++
++/*
++ * Prepares the dump device so we can take a dump later. 
++ * Validates the netdump configuration parameters.
++ *
++ * TODO: Network connectivity check should be done here.
++ */
++static int
++dump_net_open(struct dump_dev *net_dev, unsigned long arg)
++{
++	int retval = 0;
++
++	/* get the interface name */
++	if (copy_from_user(device_name, (void *)arg, IFNAMSIZ))
++		return -EFAULT;
++
++	if (!(dump_ndev = dev_get_by_name(device_name))) {
++		printk("network device %s does not exist, aborting.\n",
++				device_name);
++		return -ENODEV;
++	}
++
++	if (!dump_ndev->poll_controller) {
++		printk("network device %s does not implement polling yet, "
++				"aborting.\n", device_name);
++		retval = -1; /* return proper error */
++		goto err1;
++	}
++
++	if (!(dump_in_dev = in_dev_get(dump_ndev))) {
++		printk("network device %s is not an IP protocol device, "
++				"aborting.\n", device_name);
++		retval = -EINVAL;
++		goto err1;
++	}
++
++	if ((retval = dump_validate_config()) < 0)
++		goto err2;
++
++	net_dev->curr_offset = 0;
++	printk("Network device %s successfully configured for dumping\n",
++			device_name);
++	return retval;
++err2:
++	in_dev_put(dump_in_dev);
++err1:
++	dev_put(dump_ndev);	
++	return retval;
++}
++
++/*
++ * Close the dump device and release associated resources
++ * Invoked when unconfiguring the dump device.
++ */
++static int
++dump_net_release(struct dump_dev *net_dev)
++{
++	if (dump_in_dev)
++		in_dev_put(dump_in_dev);
++	if (dump_ndev)
++		dev_put(dump_ndev);
++	return 0;
++}
++
++/*
++ * Prepare the dump device for use (silence any ongoing activity
++ * and quiesce state) when the system crashes.
++ */
++static int
++dump_net_silence(struct dump_dev *net_dev)
++{
++	local_irq_save(flags_global);
++	dump_ndev->rx_hook = dump_rx_hook;
++        startup_handshake = 1;
++	net_dev->curr_offset = 0;
++	printk("Dumping to network device %s on CPU %d ...\n", device_name,
++			smp_processor_id());
++	return 0;
++}
++
++/*
++ * Invoked when dumping is done. This is the time to put things back 
++ * (i.e. undo the effects of dump_block_silence) so the device is 
++ * available for normal use.
++ */
++static int
++dump_net_resume(struct dump_dev *net_dev)
++{
++	int indx;
++	reply_t reply;
++	char tmp[200];
++
++        if (!dump_ndev)
++		return (0);
++
++	sprintf(tmp, "NETDUMP end.\n");
++	for( indx = 0; indx < 6; indx++) {
++		reply.code = REPLY_END_NETDUMP;
++		reply.nr = 0;
++		reply.info = 0;
++		dump_send_skb(dump_ndev, tmp, strlen(tmp), &reply);
++	}
++	printk("NETDUMP END!\n");
++	local_irq_restore(flags_global);
++	dump_ndev->rx_hook = NULL;
++	startup_handshake = 0;
++	return 0;
++}
++
++/*
++ * Seek to the specified offset in the dump device.
++ * Makes sure this is a valid offset, otherwise returns an error.
++ */
++static  int
++dump_net_seek(struct dump_dev *net_dev, loff_t off)
++{
++	/*
++	 * For now using DUMP_HEADER_OFFSET as hard coded value,
++	 * See dump_block_seekin dump_blockdev.c to know how to
++	 * do this properly.
++	 */
++	net_dev->curr_offset = off + DUMP_HEADER_OFFSET;
++	return 0;
++}
++
++/*
++ *
++ */
++static int
++dump_net_write(struct dump_dev *net_dev, void *buf, unsigned long len)
++{
++	int cnt, i, off;
++	ssize_t ret;
++
++	cnt = len/ PAGE_SIZE;
++
++	for (i = 0; i < cnt; i++) {
++		off = i* PAGE_SIZE;
++		ret = do_netdump(net_dev, buf+off, PAGE_SIZE);
++		if (ret <= 0)
++			return -1;
++		net_dev->curr_offset = net_dev->curr_offset + PAGE_SIZE;
++	}
++	return len;
++}
++
++/*
++ * check if the last dump i/o is over and ready for next request
++ */
++static int
++dump_net_ready(struct dump_dev *net_dev, void *buf)
++{
++	return 0;
++}
++
++/*
++ * ioctl function used for configuring network dump
++ */
++static int
++dump_net_ioctl(struct dump_dev *net_dev, unsigned int cmd, unsigned long arg)
++{
++	switch (cmd) {
++	case DIOSTARGETIP:
++		target_ip = arg;
++		break;
++	case DIOSTARGETPORT:
++		target_port = (u16)arg;
++		break;
++	case DIOSSOURCEPORT:
++		source_port = (u16)arg;
++		break;
++	case DIOSETHADDR:
++		return copy_from_user(daddr, (void *)arg, 6);
++		break;
++	case DIOGTARGETIP:
++	case DIOGTARGETPORT:
++	case DIOGSOURCEPORT:
++	case DIOGETHADDR:
++		break;
++	default:
++		return -EINVAL;
++	}
++	return 0;
++}
++
++struct dump_dev_ops dump_netdev_ops = {
++	.open 		= dump_net_open,
++	.release	= dump_net_release,
++	.silence	= dump_net_silence,
++	.resume 	= dump_net_resume,
++	.seek		= dump_net_seek,
++	.write		= dump_net_write,
++	/* .read not implemented */
++	.ready		= dump_net_ready,
++	.ioctl		= dump_net_ioctl
++};
++
++static struct dump_dev default_dump_netdev = {
++	.type_name = "networkdev", 
++	.ops = &dump_netdev_ops, 
++	.curr_offset = 0
++};
++
++static int __init
++dump_netdev_init(void)
++{
++        default_dump_netdev.curr_offset = 0;
++
++	if (dump_register_device(&default_dump_netdev) < 0) {
++		printk("network dump device driver registration failed\n");
++		return -1;
++	}
++	printk("network device driver for LKCD registered\n");
++ 
++	get_random_bytes(&dump_magic, sizeof(dump_magic));
++	return 0;
++}
++
++static void __exit
++dump_netdev_cleanup(void)
++{
++	dump_unregister_device(&default_dump_netdev);
++}
++
++MODULE_AUTHOR("LKCD Development Team <lkcd-devel@lists.sourceforge.net>");
++MODULE_DESCRIPTION("Network Dump Driver for Linux Kernel Crash Dump (LKCD)");
++MODULE_LICENSE("GPL");
++
++module_init(dump_netdev_init);
++module_exit(dump_netdev_cleanup);
+--- linux-2.5.69/drivers/dump/dump_overlay.c.lkcdbase	Mon Jun  2 17:29:49 2003
++++ linux-2.5.69/drivers/dump/dump_overlay.c	Fri Feb  7 06:47:58 2003
+@@ -0,0 +1,848 @@
++/*
++ * Two-stage soft-boot based dump scheme methods (memory overlay
++ * with post soft-boot writeout)
++ *
++ * Started: Oct 2002 -  Suparna Bhattacharya <suparna@in.ibm.com>
++ *
++ * This approach of saving the dump in memory and writing it 
++ * out after a softboot without clearing memory is derived from the 
++ * Mission Critical Linux dump implementation. Credits and a big
++ * thanks for letting the lkcd project make use of the excellent 
++ * piece of work and also for helping with clarifications and 
++ * tips along the way are due to:
++ * 	Dave Winchell <winchell@mclx.com> (primary author of mcore)
++ * 	and also to
++ * 	Jeff Moyer <moyer@mclx.com>
++ * 	Josh Huber <huber@mclx.com>
++ * 
++ * For those familiar with the mcore implementation, the key 
++ * differences/extensions here are in allowing entire memory to be 
++ * saved (in compressed form) through a careful ordering scheme 
++ * on both the way down as well on the way up after boot, the latter
++ * for supporting the LKCD notion of passes in which most critical 
++ * data is the first to be saved to the dump device. Also the post 
++ * boot writeout happens from within the kernel rather than driven 
++ * from userspace.
++ *
++ * The sequence is orchestrated through the abstraction of "dumpers",
++ * one for the first stage which then sets up the dumper for the next 
++ * stage, providing for a smooth and flexible reuse of the singlestage 
++ * dump scheme methods and a handle to pass dump device configuration 
++ * information across the soft boot. 
++ *
++ * Copyright (C) 2002 International Business Machines Corp. 
++ *
++ * This code is released under version 2 of the GNU GPL.
++ */
++
++/*
++ * Disruptive dumping using the second kernel soft-boot option
++ * for issuing dump i/o operates in 2 stages:
++ * 
++ * (1) - Saves the (compressed & formatted) dump in memory using a 
++ *       carefully ordered overlay scheme designed to capture the 
++ *       entire physical memory or selective portions depending on 
++ *       dump config settings, 
++ *     - Registers the stage 2 dumper and 
++ *     - Issues a soft reboot w/o clearing memory. 
++ *
++ *     The overlay scheme starts with a small bootstrap free area
++ *     and follows a reverse ordering of passes wherein it 
++ *     compresses and saves data starting with the least critical 
++ *     areas first, thus freeing up the corresponding pages to 
++ *     serve as destination for subsequent data to be saved, and
++ *     so on. With a good compression ratio, this makes it feasible
++ *     to capture an entire physical memory dump without significantly
++ *     reducing memory available during regular operation.
++ *
++ * (2) Post soft-reboot, runs through the saved memory dump and
++ *     writes it out to disk, this time around, taking care to
++ *     save the more critical data first (i.e. pages which figure 
++ *     in early passes for a regular dump). Finally issues a 
++ *     clean reboot.
++ *     
++ *     Since the data was saved in memory after selection/filtering
++ *     and formatted as per the chosen output dump format, at this 
++ *     stage the filter and format actions are just dummy (or
++ *     passthrough) actions, except for influence on ordering of
++ *     passes.
++ */
++
++#include <linux/types.h>
++#include <linux/kernel.h>
++#include <linux/highmem.h>
++#include <linux/bootmem.h>
++#include <linux/dump.h>
++#include "dump_methods.h"
++
++extern struct list_head dumper_list_head;
++extern struct dump_memdev *dump_memdev;
++extern struct dumper dumper_stage2;
++struct dump_config_block *dump_saved_config = NULL;
++extern struct dump_blockdev *dump_blockdev;
++static struct dump_memdev *saved_dump_memdev = NULL;
++static struct dumper *saved_dumper = NULL;
++
++/* For testing 
++extern void dump_display_map(struct dump_memdev *);
++*/
++
++struct dumper *dumper_by_name(char *name)
++{
++#ifdef LATER
++	struct dumper *dumper;
++	list_for_each_entry(dumper, &dumper_list_head, dumper_list)
++		if (!strncmp(dumper->name, name, 32))
++			return dumper;
++
++	/* not found */
++	return NULL; 
++#endif
++	/* Temporary proof of concept */
++	if (!strncmp(dumper_stage2.name, name, 32))
++		return &dumper_stage2;
++	else
++		return NULL;
++}
++
++#ifdef CONFIG_CRASH_DUMP_SOFTBOOT
++extern void dump_early_reserve_map(struct dump_memdev *);
++
++void crashdump_reserve(void)
++{
++	extern unsigned long crashdump_addr;
++
++	if (crashdump_addr == 0xdeadbeef) 
++		return;
++
++	/* reserve dump config and saved dump pages */
++	dump_saved_config = (struct dump_config_block *)crashdump_addr;
++	/* magic verification */
++	if (dump_saved_config->magic != DUMP_MAGIC_LIVE) {
++		printk("Invalid dump magic. Ignoring dump\n");
++		dump_saved_config = NULL;
++		return;
++	}
++			
++	printk("Dump may be available from previous boot\n");
++
++	reserve_bootmem(virt_to_phys((void *)crashdump_addr), 
++		PAGE_ALIGN(sizeof(struct dump_config_block)));
++	dump_early_reserve_map(&dump_saved_config->memdev);
++
++}
++#endif
++
++/* 
++ * Loads the dump configuration from a memory block saved across soft-boot
++ * The ops vectors need fixing up as the corresp. routines may have 
++ * relocated in the new soft-booted kernel.
++ */
++int dump_load_config(struct dump_config_block *config)
++{
++	struct dumper *dumper;
++	struct dump_data_filter *filter_table, *filter;
++	struct dump_dev *dev;
++	int i;
++
++	if (config->magic != DUMP_MAGIC_LIVE)
++		return -ENOENT; /* not a valid config */
++
++	/* initialize generic config data */
++	memcpy(&dump_config, &config->config, sizeof(dump_config));
++
++	/* initialize dumper state */
++	if (!(dumper = dumper_by_name(config->dumper.name)))  {
++		printk("dumper name mismatch\n");
++		return -ENOENT; /* dumper mismatch */
++	}
++	
++	/* verify and fixup schema */
++	if (strncmp(dumper->scheme->name, config->scheme.name, 32)) {
++		printk("dumper scheme mismatch\n");
++		return -ENOENT; /* mismatch */
++	}
++	config->scheme.ops = dumper->scheme->ops;
++	config->dumper.scheme = &config->scheme;
++	
++	/* verify and fixup filter operations */
++	filter_table = dumper->filter;
++	for (i = 0, filter = config->filter_table; 
++		((i < MAX_PASSES) && filter_table[i].selector); 
++		i++, filter++) {
++		if (strncmp(filter_table[i].name, filter->name, 32)) {
++			printk("dump filter mismatch\n");
++			return -ENOENT; /* filter name mismatch */
++		}
++		filter->selector = filter_table[i].selector;
++	}
++	config->dumper.filter = config->filter_table;
++
++	/* fixup format */
++	if (strncmp(dumper->fmt->name, config->fmt.name, 32)) {
++		printk("dump format mismatch\n");
++		return -ENOENT; /* mismatch */
++	}
++	config->fmt.ops = dumper->fmt->ops;
++	config->dumper.fmt = &config->fmt;
++
++	/* fixup target device */
++	dev = (struct dump_dev *)(&config->dev[0]);
++	if (dumper->dev == NULL) {
++		pr_debug("Vanilla dumper - assume default\n");
++		if (dump_dev == NULL)
++			return -ENODEV;
++		dumper->dev = dump_dev;
++	}
++
++	if (strncmp(dumper->dev->type_name, dev->type_name, 32)) { 
++		printk("dump dev type mismatch %s instead of %s\n",
++				dev->type_name, dumper->dev->type_name);
++		return -ENOENT; /* mismatch */
++	}
++	dev->ops = dumper->dev->ops; 
++	config->dumper.dev = dev;
++	
++	/* fixup memory device containing saved dump pages */
++	/* assume statically init'ed dump_memdev */
++	config->memdev.ddev.ops = dump_memdev->ddev.ops; 
++	/* switch to memdev from prev boot */
++	saved_dump_memdev = dump_memdev; /* remember current */
++	dump_memdev = &config->memdev;
++
++	/* Make this the current primary dumper */
++	dump_config.dumper = &config->dumper;
++
++	return 0;
++}
++
++/* Saves the dump configuration in a memory block for use across a soft-boot */
++int dump_save_config(struct dump_config_block *config)
++{
++	printk("saving dump config settings\n");
++
++	/* dump config settings */
++	memcpy(&config->config, &dump_config, sizeof(dump_config));
++
++	/* dumper state */
++	memcpy(&config->dumper, dump_config.dumper, sizeof(struct dumper));
++	memcpy(&config->scheme, dump_config.dumper->scheme, 
++		sizeof(struct dump_scheme));
++	memcpy(&config->fmt, dump_config.dumper->fmt, sizeof(struct dump_fmt));
++	memcpy(&config->dev[0], dump_config.dumper->dev, 
++		sizeof(struct dump_anydev));
++	memcpy(&config->filter_table, dump_config.dumper->filter, 
++		sizeof(struct dump_data_filter)*MAX_PASSES);
++
++	/* handle to saved mem pages */
++	memcpy(&config->memdev, dump_memdev, sizeof(struct dump_memdev));
++
++	config->magic = DUMP_MAGIC_LIVE;
++	
++	return 0;
++}
++
++int dump_init_stage2(struct dump_config_block *saved_config)
++{
++	int err = 0;
++
++	pr_debug("dump_init_stage2\n");
++	/* Check if dump from previous boot exists */
++	if (saved_config) {
++		printk("loading dumper from previous boot \n");
++		/* load and configure dumper from previous boot */
++		if ((err = dump_load_config(saved_config)))
++			return err;
++
++		if (!dump_oncpu) {
++			if ((err = dump_configure(dump_config.dump_device))) {
++				printk("Stage 2 dump configure failed\n");
++				return err;
++			}
++		}
++
++		dumper_reset();
++		dump_dev = dump_config.dumper->dev;
++		/* write out the dump */
++		err = dump_generic_execute(NULL, NULL);
++		
++		dump_saved_config = NULL;
++
++		if (!dump_oncpu) {
++			dump_unconfigure(); 
++		}
++		
++		return err;
++
++	} else {
++		/* no dump to write out */
++		printk("no dumper from previous boot \n");
++		return 0;
++	}
++}
++
++extern void dump_mem_markpages(struct dump_memdev *);
++
++int dump_switchover_stage(void)
++{
++	int ret = 0;
++
++	/* trigger stage 2 rightaway - in real life would be after soft-boot */
++	/* dump_saved_config would be a boot param */
++	saved_dump_memdev = dump_memdev;
++	saved_dumper = dump_config.dumper;
++	ret = dump_init_stage2(dump_saved_config);
++	dump_memdev = saved_dump_memdev;
++	dump_config.dumper = saved_dumper;
++	return ret;
++}
++
++int dump_activate_softboot(void) 
++{
++	int err = 0;
++
++	/* temporary - switchover to writeout previously saved dump */
++	err = dump_switchover_stage(); /* non-disruptive case */
++	if (dump_oncpu) 
++		dump_config.dumper = &dumper_stage1; /* set things back */
++
++	return err;
++
++	dump_silence_level = DUMP_HALT_CPUS;
++	/* wait till we become the only cpu */
++	/* maybe by checking for online cpus ? */
++
++	/* now call into kexec */
++
++	/* TBD/Fixme: 
++	 * should we call reboot notifiers ? inappropriate for panic ?  
++	 * what about device_shutdown() ? 
++	 * is explicit bus master disabling needed or can we do that
++	 * through driverfs ? 
++	 */
++	return 0;
++}
++
++/* --- DUMP SCHEME ROUTINES  --- */
++
++static inline int dump_buf_pending(struct dumper *dumper)
++{
++	return (dumper->curr_buf - dumper->dump_buf);
++}
++
++/* Invoked during stage 1 of soft-reboot based dumping */
++int dump_overlay_sequencer(void)
++{
++	struct dump_data_filter *filter = dump_config.dumper->filter;
++	struct dump_data_filter *filter2 = dumper_stage2.filter;
++	int pass = 0, err = 0, save = 0;
++	int (*action)(unsigned long, unsigned long);
++
++	/* Make sure gzip compression is being used */
++	if (dump_config.dumper->compress->compress_type != DUMP_COMPRESS_GZIP) {
++		printk(" Please set GZIP compression \n");
++		return -EINVAL;
++	}
++
++	/* start filling in dump data right after the header */
++	dump_config.dumper->curr_offset = 
++		PAGE_ALIGN(dump_config.dumper->header_len);
++
++	/* Locate the last pass */
++	for (;filter->selector; filter++, pass++);
++	
++	/* 
++	 * Start from the end backwards: overlay involves a reverse 
++	 * ordering of passes, since less critical pages are more
++	 * likely to be reusable as scratch space once we are through
++	 * with them. 
++	 */
++	for (--pass, --filter; pass >= 0; pass--, filter--)
++	{
++		/* Assumes passes are exclusive (even across dumpers) */
++		/* Requires care when coding the selection functions */
++		if ((save = filter->level_mask & dump_config.level))
++			action = dump_save_data;
++		else
++			action = dump_skip_data;
++
++		/* Remember the offset where this pass started */
++		/* The second stage dumper would use this */
++		if (dump_buf_pending(dump_config.dumper) & (PAGE_SIZE - 1)) {
++			pr_debug("Starting pass %d with pending data\n", pass);
++			pr_debug("filling dummy data to page-align it\n");
++			dump_config.dumper->curr_buf = (void *)PAGE_ALIGN(
++				(unsigned long)dump_config.dumper->curr_buf);
++		}
++		
++		filter2[pass].start = dump_config.dumper->curr_offset
++			+ dump_buf_pending(dump_config.dumper);
++
++		err = dump_iterator(pass, action, filter);
++
++		filter2[pass].end = dump_config.dumper->curr_offset
++			+ dump_buf_pending(dump_config.dumper);
++
++		if (err < 0) {
++			printk("dump_overlay_seq: failure %d in pass %d\n", 
++				err, pass);
++			break;
++		}	
++		printk("\n %d overlay pages %s of %d each in pass %d\n", 
++		err, save ? "saved" : "skipped", DUMP_PAGE_SIZE, pass);
++	}
++
++	return err;
++}
++
++/* from dump_memdev.c */
++extern struct page *dump_mem_lookup(struct dump_memdev *dev, unsigned long loc);
++extern struct page *dump_mem_next_page(struct dump_memdev *dev);
++
++static inline struct page *dump_get_saved_page(loff_t loc)
++{
++	return (dump_mem_lookup(dump_memdev, loc >> PAGE_SHIFT));
++}
++
++static inline struct page *dump_next_saved_page(void)
++{
++	return (dump_mem_next_page(dump_memdev));
++}
++
++/* 
++ * Iterates over list of saved dump pages. Invoked during second stage of 
++ * soft boot dumping
++ *
++ * Observation: If additional selection is desired at this stage then
++ * a different iterator could be written which would advance 
++ * to the next page header everytime instead of blindly picking up
++ * the data. In such a case loc would be interpreted differently. 
++ * At this moment however a blind pass seems sufficient, cleaner and
++ * faster.
++ */
++int dump_saved_data_iterator(int pass, int (*action)(unsigned long, 
++	unsigned long), struct dump_data_filter *filter)
++{
++	loff_t loc = filter->start;
++	struct page *page;
++	unsigned long count = 0;
++	int err = 0;
++	unsigned long sz;
++
++	printk("pass %d, start off 0x%llx end offset 0x%llx\n", pass,
++			filter->start, filter->end);
++
++	/* loc will get treated as logical offset into stage 1 */
++	page = dump_get_saved_page(loc);
++			
++	for (; loc < filter->end; loc += PAGE_SIZE) {
++		dump_config.dumper->curr_loc = loc;
++		if (!page) {
++			printk("no more saved data for pass %d\n", pass);
++			break;
++		}
++		sz = (loc + PAGE_SIZE > filter->end) ? filter->end - loc :
++			PAGE_SIZE;
++
++		if (page && filter->selector(pass, (unsigned long)page, 
++			PAGE_SIZE))  {
++			pr_debug("mem offset 0x%llx\n", loc);
++			if ((err = action((unsigned long)page, sz))) 
++				break;
++			else
++				count++;
++			/* clear the contents of page */
++			/* fixme: consider using KM_DUMP instead */
++			clear_highpage(page);
++			
++		}
++		page = dump_next_saved_page();
++	}
++
++	return err ? err : count;
++}
++
++static inline int dump_overlay_pages_done(struct page *page, int nr)
++{
++	int ret=0;
++
++	for (; nr ; page++, nr--) {
++		if (dump_check_and_free_page(dump_memdev, page))
++			ret++;
++	}
++	return ret;
++}
++
++int dump_overlay_save_data(unsigned long loc, unsigned long len)
++{
++	int err = 0;
++	struct page *page = (struct page *)loc;
++	static unsigned long cnt = 0;
++
++	if ((err = dump_generic_save_data(loc, len)))
++		return err;
++
++	if (dump_overlay_pages_done(page, len >> PAGE_SHIFT)) {
++		cnt++;
++		if (!(cnt & 0x7f))
++			pr_debug("released page 0x%lx\n", page_to_pfn(page));
++	}
++	
++	return err;
++}
++
++
++int dump_overlay_skip_data(unsigned long loc, unsigned long len)
++{
++	struct page *page = (struct page *)loc;
++
++	dump_overlay_pages_done(page, len >> PAGE_SHIFT);
++	return 0;
++}
++
++int dump_overlay_resume(void)
++{
++	int err = 0;
++
++	/* 
++	 * switch to stage 2 dumper, save dump_config_block
++	 * and then trigger a soft-boot
++	 */
++	dumper_stage2.header_len = dump_config.dumper->header_len;
++	dump_config.dumper = &dumper_stage2;
++	if ((err = dump_save_config(dump_saved_config)))
++		return err;
++
++	dump_dev = dump_config.dumper->dev;
++
++	return err;
++	err = dump_switchover_stage();  /* plugs into soft boot mechanism */
++	dump_config.dumper = &dumper_stage1; /* set things back */
++	return err;
++}
++
++int dump_overlay_configure(unsigned long devid)
++{
++	struct dump_dev *dev;
++	struct dump_config_block *saved_config = dump_saved_config;
++	int err = 0;
++
++	/* If there is a previously saved dump, write it out first */
++	if (saved_config) {
++		printk("Processing old dump pending writeout\n");
++		err = dump_switchover_stage();
++		if (err) {
++			printk("failed to writeout saved dump\n");
++			return err;
++		}
++		dump_free_mem(saved_config); /* testing only: not after boot */
++	}
++
++	dev = dumper_stage2.dev = dump_config.dumper->dev;
++	/* From here on the intermediate dump target is memory-only */
++	dump_dev = dump_config.dumper->dev = &dump_memdev->ddev;
++	if ((err = dump_generic_configure(0))) {
++		printk("dump generic configure failed: err %d\n", err);
++		return err;
++	}
++	/* temporary */
++	dumper_stage2.dump_buf = dump_config.dumper->dump_buf;
++
++	/* Sanity check on the actual target dump device */
++	if (!dev || (err = dev->ops->open(dev, devid))) {
++		return err;
++	}
++	/* TBD: should we release the target if this is soft-boot only ? */
++
++	/* alloc a dump config block area to save across reboot */
++	if (!(dump_saved_config = dump_alloc_mem(sizeof(struct 
++		dump_config_block)))) {
++		printk("dump config block alloc failed\n");
++		/* undo configure */
++		dump_generic_unconfigure();
++		return -ENOMEM;
++	}
++	dump_config.dump_addr = (unsigned long)dump_saved_config;
++	printk("Dump config block of size %d set up at 0x%lx\n", 
++		sizeof(*dump_saved_config), (unsigned long)dump_saved_config);
++	return 0;
++}
++
++int dump_overlay_unconfigure(void)
++{
++	struct dump_dev *dev = dumper_stage2.dev;
++	int err = 0;
++
++	pr_debug("dump_overlay_unconfigure\n");
++	/* Close the secondary device */
++	dev->ops->release(dev); 
++	pr_debug("released secondary device\n");
++
++	err = dump_generic_unconfigure();
++	pr_debug("Unconfigured generic portions\n");
++	dump_free_mem(dump_saved_config);
++	dump_saved_config = NULL;
++	pr_debug("Freed saved config block\n");
++	dump_dev = dump_config.dumper->dev = dumper_stage2.dev;
++
++	printk("Unconfigured overlay dumper\n");
++	return err;
++}
++
++int dump_staged_unconfigure(void)
++{
++	int err = 0;
++	struct dump_config_block *saved_config = dump_saved_config;
++	struct dump_dev *dev;
++
++	pr_debug("dump_staged_unconfigure\n");
++	err = dump_generic_unconfigure();
++
++	/* now check if there is a saved dump waiting to be written out */
++	if (saved_config) {
++		printk("Processing saved dump pending writeout\n");
++		if ((err = dump_switchover_stage())) {
++			printk("Error in commiting saved dump at 0x%lx\n", 
++				(unsigned long)saved_config);
++			printk("Old dump may hog memory\n");
++		} else {
++			dump_free_mem(saved_config);
++			pr_debug("Freed saved config block\n");
++		}
++		dump_saved_config = NULL;
++	} else {
++		dev = &dump_memdev->ddev;
++		dev->ops->release(dev);
++	}
++	printk("Unconfigured second stage dumper\n");
++
++	return 0;
++}
++
++/* ----- PASSTHRU FILTER ROUTINE --------- */
++
++/* transparent - passes everything through */
++int dump_passthru_filter(int pass, unsigned long loc, unsigned long sz)
++{
++	return 1;
++}
++
++/* ----- PASSTRU FORMAT ROUTINES ---- */
++
++
++int dump_passthru_configure_header(const char *panic_str, const struct pt_regs *regs)
++{
++	dump_config.dumper->header_dirty++;
++	return 0;
++}
++
++/* Copies bytes of data from page(s) to the specified buffer */
++int dump_copy_pages(void *buf, struct page *page, unsigned long sz)
++{
++	unsigned long len = 0, bytes;
++	void *addr;
++
++	while (len < sz) {
++		addr = kmap_atomic(page, KM_DUMP);
++		bytes = (sz > len + PAGE_SIZE) ? PAGE_SIZE : sz - len;	
++		memcpy(buf, addr, bytes); 
++		kunmap_atomic(addr, KM_DUMP);
++		buf += bytes;
++		len += bytes;
++		page++;
++	}
++	/* memset(dump_config.dumper->curr_buf, 0x57, len); temporary */
++
++	return sz - len;
++}
++
++int dump_passthru_update_header(void)
++{
++	long len = dump_config.dumper->header_len;
++	struct page *page;
++	void *buf = dump_config.dumper->dump_buf;
++	int err = 0;
++
++	if (!dump_config.dumper->header_dirty)
++		return 0;
++
++	pr_debug("Copying header of size %ld bytes from memory\n", len);
++	if (len > DUMP_BUFFER_SIZE) 
++		return -E2BIG;
++
++	page = dump_mem_lookup(dump_memdev, 0);
++	for (; (len > 0) && page; buf += PAGE_SIZE, len -= PAGE_SIZE) {
++		if ((err = dump_copy_pages(buf, page, PAGE_SIZE)))
++			return err;
++		page = dump_mem_next_page(dump_memdev);
++	}
++	if (len > 0) {
++		printk("Incomplete header saved in mem\n");
++		return -ENOENT;
++	}
++
++	if ((err = dump_dev_seek(0))) {
++		printk("Unable to seek to dump header offset\n");
++		return err;
++	}
++	err = dump_ll_write(dump_config.dumper->dump_buf, 
++		buf - dump_config.dumper->dump_buf);
++	if (err < dump_config.dumper->header_len)
++		return (err < 0) ? err : -ENOSPC;
++
++	dump_config.dumper->header_dirty = 0;
++	return 0;
++}
++
++static loff_t next_dph_offset = 0;
++
++static int dph_valid(struct __dump_page *dph)
++{
++	if ((dph->dp_address & (PAGE_SIZE - 1)) || (dph->dp_flags 
++	      > DUMP_DH_COMPRESSED) || (!dph->dp_flags) ||
++		(dph->dp_size > PAGE_SIZE)) {
++	printk("dp->address = 0x%llx, dp->size = 0x%x, dp->flag = 0x%x\n",
++		dph->dp_address, dph->dp_size, dph->dp_flags);
++		return 0;
++	}
++	return 1;
++}
++
++int dump_verify_lcrash_data(void *buf, unsigned long sz)
++{
++	struct __dump_page *dph;
++
++	/* sanity check for page headers */
++	while (next_dph_offset + sizeof(*dph) < sz) {
++		dph = (struct __dump_page *)(buf + next_dph_offset);
++		if (!dph_valid(dph)) {
++			printk("Invalid page hdr at offset 0x%llx\n",
++				next_dph_offset);
++			return -EINVAL;
++		}
++		next_dph_offset += dph->dp_size + sizeof(*dph);
++	}
++
++	next_dph_offset -= sz;	
++	return 0;
++}
++
++/* 
++ * TBD/Later: Consider avoiding the copy by using a scatter/gather 
++ * vector representation for the dump buffer
++ */
++int dump_passthru_add_data(unsigned long loc, unsigned long sz)
++{
++	struct page *page = (struct page *)loc;
++	void *buf = dump_config.dumper->curr_buf;
++	int err = 0;
++
++	if ((err = dump_copy_pages(buf, page, sz))) {
++		printk("dump_copy_pages failed");
++		return err;
++	}
++
++	if ((err = dump_verify_lcrash_data(buf, sz))) {
++		printk("dump_verify_lcrash_data failed\n");
++		printk("Invalid data for pfn 0x%lx\n", page_to_pfn(page));
++		printk("Page flags 0x%lx\n", page->flags);
++		printk("Page count 0x%x\n", atomic_read(&page->count));
++		return err;
++	}
++
++	dump_config.dumper->curr_buf = buf + sz;
++
++	return 0;
++}
++
++
++/* Stage 1 dumper: Saves compressed dump in memory and soft-boots system */
++
++/* Scheme to overlay saved data in memory for writeout after a soft-boot */
++struct dump_scheme_ops dump_scheme_overlay_ops = {
++	.configure	= dump_overlay_configure,
++	.unconfigure	= dump_overlay_unconfigure,
++	.sequencer	= dump_overlay_sequencer,
++	.iterator	= dump_page_iterator,
++	.save_data	= dump_overlay_save_data,
++	.skip_data	= dump_overlay_skip_data,
++	.write_buffer	= dump_generic_write_buffer
++};
++
++struct dump_scheme dump_scheme_overlay = {
++	.name		= "overlay",
++	.ops		= &dump_scheme_overlay_ops
++};
++
++
++/* Stage 1 must use a good compression scheme - default to gzip */
++extern struct __dump_compress dump_gzip_compression;
++
++struct dumper dumper_stage1 = {
++	.name		= "stage1",
++	.scheme		= &dump_scheme_overlay,
++	.fmt		= &dump_fmt_lcrash,
++	.compress 	= &dump_none_compression, /* needs to be gzip */
++	.filter		= dump_filter_table,
++	.dev		= NULL,
++};		
++
++/* Stage 2 dumper: Activated after softboot to write out saved dump to device */
++
++/* Formatter that transfers data as is (transparent) w/o further conversion */
++struct dump_fmt_ops dump_fmt_passthru_ops = {
++	.configure_header	= dump_passthru_configure_header,
++	.update_header		= dump_passthru_update_header,
++	.save_context		= NULL, /* unused */
++	.add_data		= dump_passthru_add_data,
++	.update_end_marker	= dump_lcrash_update_end_marker
++};
++
++struct dump_fmt dump_fmt_passthru = {
++	.name	= "passthru",
++	.ops	= &dump_fmt_passthru_ops
++};
++
++/* Filter that simply passes along any data within the range (transparent)*/
++/* Note: The start and end ranges in the table are filled in at run-time */
++
++extern int dump_filter_none(int pass, unsigned long loc, unsigned long sz);
++
++struct dump_data_filter dump_passthru_filtertable[MAX_PASSES] = {
++{.name = "passkern", .selector = dump_passthru_filter, 
++	.level_mask = DUMP_MASK_KERN },
++{.name = "passuser", .selector = dump_passthru_filter, 
++	.level_mask = DUMP_MASK_USED },
++{.name = "passunused", .selector = dump_passthru_filter, 
++	.level_mask = DUMP_MASK_UNUSED },
++{.name = "none", .selector = dump_filter_none, 
++	.level_mask = DUMP_MASK_REST }
++};
++
++
++/* Scheme to handle data staged / preserved across a soft-boot */
++struct dump_scheme_ops dump_scheme_staged_ops = {
++	.configure	= dump_generic_configure,
++	.unconfigure	= dump_staged_unconfigure,
++	.sequencer	= dump_generic_sequencer,
++	.iterator	= dump_saved_data_iterator,
++	.save_data	= dump_generic_save_data,
++	.skip_data	= dump_generic_skip_data,
++	.write_buffer	= dump_generic_write_buffer
++};
++
++struct dump_scheme dump_scheme_staged = {
++	.name		= "staged",
++	.ops		= &dump_scheme_staged_ops
++};
++
++/* The stage 2 dumper comprising all these */
++struct dumper dumper_stage2 = {
++	.name		= "stage2",
++	.scheme		= &dump_scheme_staged,
++	.fmt		= &dump_fmt_passthru,
++	.compress 	= &dump_none_compression,
++	.filter		= dump_passthru_filtertable,
++	.dev		= NULL,
++};		
++
+--- linux-2.5.69/drivers/dump/dump_rle.c.lkcdbase	Mon Jun  2 17:29:49 2003
++++ linux-2.5.69/drivers/dump/dump_rle.c	Fri Dec 13 00:51:31 2002
+@@ -0,0 +1,175 @@
++/*
++ * RLE Compression functions for kernel crash dumps.
++ *
++ * Created by: Matt Robinson (yakker@sourceforge.net)
++ * Copyright 2001 Matt D. Robinson.  All rights reserved.
++ *
++ * This code is released under version 2 of the GNU GPL.
++ */
++
++/* header files */
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/sched.h>
++#include <linux/fs.h>
++#include <linux/file.h>
++#include <linux/init.h>
++#include <linux/dump.h>
++
++/*
++ * Name: dump_compress_rle()
++ * Func: Compress a DUMP_PAGE_SIZE (hardware) page down to something more
++ *       reasonable, if possible.  This is the same routine we use in IRIX.
++ */
++static u16
++dump_compress_rle(const u8 *old, u16 oldsize, u8 *new, u16 newsize)
++{
++	u16 ri, wi, count = 0;
++	u_char value = 0, cur_byte;
++
++	/*
++	 * If the block should happen to "compress" to larger than the
++	 * buffer size, allocate a larger one and change cur_buf_size.
++	 */
++
++	wi = ri = 0;
++
++	while (ri < oldsize) {
++		if (!ri) {
++			cur_byte = value = old[ri];
++			count = 0;
++		} else {
++			if (count == 255) {
++				if (wi + 3 > oldsize) {
++					return oldsize;
++				}
++				new[wi++] = 0;
++				new[wi++] = count;
++				new[wi++] = value;
++				value = cur_byte = old[ri];
++				count = 0;
++			} else { 
++				if ((cur_byte = old[ri]) == value) {
++					count++;
++				} else {
++					if (count > 1) {
++						if (wi + 3 > oldsize) {
++							return oldsize;
++						}
++						new[wi++] = 0;
++						new[wi++] = count;
++						new[wi++] = value;
++					} else if (count == 1) {
++						if (value == 0) {
++							if (wi + 3 > oldsize) {
++								return oldsize;
++							}
++							new[wi++] = 0;
++							new[wi++] = 1;
++							new[wi++] = 0;
++						} else {
++							if (wi + 2 > oldsize) {
++								return oldsize;
++							}
++							new[wi++] = value;
++							new[wi++] = value;
++						}
++					} else { /* count == 0 */
++						if (value == 0) {
++							if (wi + 2 > oldsize) {
++								return oldsize;
++							}
++							new[wi++] = value;
++							new[wi++] = value;
++						} else {
++							if (wi + 1 > oldsize) {
++								return oldsize;
++							}
++							new[wi++] = value;
++						}
++					} /* if count > 1 */
++
++					value = cur_byte;
++					count = 0;
++
++				} /* if byte == value */
++
++			} /* if count == 255 */
++
++		} /* if ri == 0 */
++		ri++;
++
++	}
++	if (count > 1) {
++		if (wi + 3 > oldsize) {
++			return oldsize;
++		}
++		new[wi++] = 0;
++		new[wi++] = count;
++		new[wi++] = value;
++	} else if (count == 1) {
++		if (value == 0) {
++			if (wi + 3 > oldsize)
++				return oldsize;
++			new[wi++] = 0;
++			new[wi++] = 1;
++			new[wi++] = 0;
++		} else {
++			if (wi + 2 > oldsize)
++				return oldsize;
++			new[wi++] = value;
++			new[wi++] = value;
++		}
++	} else { /* count == 0 */
++		if (value == 0) {
++			if (wi + 2 > oldsize)
++				return oldsize;
++			new[wi++] = value;
++			new[wi++] = value;
++		} else {
++			if (wi + 1 > oldsize)
++				return oldsize;
++			new[wi++] = value;
++		}
++	} /* if count > 1 */
++
++	value = cur_byte;
++	count = 0;
++	return wi;
++}
++
++/* setup the rle compression functionality */
++static struct __dump_compress dump_rle_compression = {
++	.compress_type = DUMP_COMPRESS_RLE,
++	.compress_func = dump_compress_rle,
++	.compress_name = "RLE",
++};
++
++/*
++ * Name: dump_compress_rle_init()
++ * Func: Initialize rle compression for dumping.
++ */
++static int __init
++dump_compress_rle_init(void)
++{
++	dump_register_compression(&dump_rle_compression);
++	return 0;
++}
++
++/*
++ * Name: dump_compress_rle_cleanup()
++ * Func: Remove rle compression for dumping.
++ */
++static void __exit
++dump_compress_rle_cleanup(void)
++{
++	dump_unregister_compression(DUMP_COMPRESS_RLE);
++}
++
++/* module initialization */
++module_init(dump_compress_rle_init);
++module_exit(dump_compress_rle_cleanup);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("LKCD Development Team <lkcd-devel@lists.sourceforge.net>");
++MODULE_DESCRIPTION("RLE compression module for crash dump driver");
+--- linux-2.5.69/drivers/dump/dump_scheme.c.lkcdbase	Mon Jun  2 17:29:49 2003
++++ linux-2.5.69/drivers/dump/dump_scheme.c	Fri Apr 25 00:24:15 2003
+@@ -0,0 +1,357 @@
++/* 
++ * Default single stage dump scheme methods
++ *
++ * Previously a part of dump_base.c
++ *
++ * Started: Oct 2002 -  Suparna Bhattacharya <suparna@in.ibm.com>
++ * 	Split and rewrote LKCD dump scheme to generic dump method 
++ * 	interfaces 
++ * Derived from original code created by
++ * 	Matt Robinson <yakker@sourceforge.net>)
++ *
++ * Contributions from SGI, IBM, HP, MCL, and others.
++ *
++ * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
++ * Copyright (C) 2001 - 2002 Matt D. Robinson.  All rights reserved.
++ * Copyright (C) 2002 International Business Machines Corp. 
++ *
++ * This code is released under version 2 of the GNU GPL.
++ */
++
++/*
++ * Implements the default dump scheme, i.e. single-stage gathering and 
++ * saving of dump data directly to the target device, which operates in
++ * a push mode, where the dumping system decides what data it saves
++ * taking into account pre-specified dump config options.
++ *
++ * Aside: The 2-stage dump scheme, where there is a soft-reset between
++ * the gathering and saving phases, also reuses some of these
++ * default routines (see dump_overlay.c) 
++ */ 
++#include <linux/types.h>
++#include <linux/kernel.h>
++#include <linux/mm.h>
++#include <linux/slab.h>
++#include <linux/delay.h>
++#include <linux/reboot.h>
++#include <linux/nmi.h>
++#include <linux/dump.h>
++#include "dump_methods.h"
++
++extern int panic_timeout;  /* time before reboot */
++
++extern void dump_speedo(int);
++
++/* Default sequencer used during single stage dumping */
++/* Also invoked during stage 2 of soft-boot based dumping */
++int dump_generic_sequencer(void)
++{
++	struct dump_data_filter *filter = dump_config.dumper->filter;
++	int pass = 0, err = 0, save = 0;
++	int (*action)(unsigned long, unsigned long);
++
++	/* 
++	 * We want to save the more critical data areas first in 
++	 * case we run out of space, encounter i/o failures, or get
++	 * interrupted otherwise and have to give up midway
++	 * So, run through the passes in increasing order 
++	 */
++	for (;filter->selector; filter++, pass++)
++	{
++		/* Assumes passes are exclusive (even across dumpers) */
++		/* Requires care when coding the selection functions */
++		if ((save = filter->level_mask & dump_config.level))
++			action = dump_save_data;
++		else
++			action = dump_skip_data;
++
++		if ((err = dump_iterator(pass, action, filter)) < 0)
++			break;
++
++		printk("\n %d dump pages %s of %d each in pass %d\n", 
++		err, save ? "saved" : "skipped", DUMP_PAGE_SIZE, pass);
++
++	}
++
++	return (err < 0) ? err : 0;
++}
++
++static inline struct page *dump_get_page(loff_t loc)
++{
++	unsigned long page_index = loc >> PAGE_SHIFT;
++
++	/* todo: complete this  to account for ia64/discontig mem */
++	/* todo: and to check for validity, ram page, no i/o mem etc */
++	/* need to use pfn/physaddr equiv of kern_addr_valid */
++	if (__dump_page_valid(page_index))
++		return pfn_to_page(page_index);
++	else
++		return NULL;
++
++}
++
++/* Default iterator: for singlestage and stage 1 of soft-boot dumping */
++/* Iterates over range of physical memory pages in DUMP_PAGE_SIZE increments */
++int dump_page_iterator(int pass, int (*action)(unsigned long, unsigned long), 
++	struct dump_data_filter *filter)
++{
++	/* Todo : fix unit, type */
++	loff_t loc;
++	int count = 0, err = 0;
++	struct page *page;
++
++	/* Todo: Add membanks code */
++	/* TBD: Check if we need to address DUMP_PAGE_SIZE < PAGE_SIZE */	
++	
++	for (loc = filter->start; loc < filter->end; loc += DUMP_PAGE_SIZE) {
++		dump_config.dumper->curr_loc = loc;
++		page = dump_get_page(loc);
++		if (page && filter->selector(pass, (unsigned long) page, 
++		DUMP_PAGE_SIZE)) {
++			if ((err = action((unsigned long)page, DUMP_PAGE_SIZE)))
++			{
++				printk("dump_page_iterator: err %d for loc "
++				"0x%llx, in pass %d\n", err, loc, pass);
++				break;
++			} else
++				count++;
++		}
++	}
++
++	return err ? err : count;
++}
++
++/* 
++ * Base function that saves the selected block of data in the dump 
++ * Action taken when iterator decides that data needs to be saved 
++ */
++int dump_generic_save_data(unsigned long loc, unsigned long sz)
++{
++	void *buf;
++	void *dump_buf = dump_config.dumper->dump_buf;
++	int left, bytes, ret;
++
++	if ((ret = dump_add_data(loc, sz))) {
++		return ret;
++	}
++	buf = dump_config.dumper->curr_buf;
++
++	/* If we've filled up the buffer write it out */
++	if ((left = buf - dump_buf) >= DUMP_BUFFER_SIZE) {
++		bytes = dump_write_buffer(dump_buf, DUMP_BUFFER_SIZE);
++		if (bytes < DUMP_BUFFER_SIZE) {
++			printk("dump_write_buffer failed %d\n", bytes);
++			return bytes ? -ENOSPC : bytes;
++		}
++
++		left -= bytes;
++		
++		/* -- A few chores to do from time to time -- */
++		dump_config.dumper->count++;
++
++		if (!(dump_config.dumper->count & 0x3f)) {
++			/* Update the header every one in a while */
++			memset((void *)dump_buf, 'b', DUMP_BUFFER_SIZE);
++			if ((ret = dump_update_header()) < 0) {
++				/* issue warning */
++				return ret;
++			}
++			printk(".");
++
++			touch_nmi_watchdog();
++		} else if (!(dump_config.dumper->count & 0x7)) {
++			/* Show progress so the user knows we aren't hung */
++			dump_speedo(dump_config.dumper->count >> 3); 
++		}
++		/* Todo: Touch/Refresh watchdog */
++
++		/* --- Done with periodic chores -- */
++
++		/* 
++		 * extra bit of copying to simplify verification  
++		 * in the second kernel boot based scheme
++		 */
++		memcpy(dump_buf - DUMP_PAGE_SIZE, dump_buf + 
++			DUMP_BUFFER_SIZE - DUMP_PAGE_SIZE, DUMP_PAGE_SIZE);
++
++		/* now adjust the leftover bits back to the top of the page */
++		/* this case would not arise during stage 2 (passthru) */
++		memset(dump_buf, 'z', DUMP_BUFFER_SIZE);
++		if (left) {
++			memcpy(dump_buf, dump_buf + DUMP_BUFFER_SIZE, left);
++		}
++		buf -= DUMP_BUFFER_SIZE;
++		dump_config.dumper->curr_buf = buf;
++	}
++				
++	return 0;
++}
++
++int dump_generic_skip_data(unsigned long loc, unsigned long sz)
++{
++	/* dummy by default */
++	return 0;
++}
++
++/* 
++ * Common low level routine to write a buffer to current dump device 
++ * Expects checks for space etc to have been taken care of by the caller 
++ * Operates serially at the moment for simplicity. 
++ * TBD/Todo: Consider batching for improved throughput
++ */
++int dump_ll_write(void *buf, unsigned long len)
++{
++	long transferred = 0, last_transfer = 0;
++	int ret = 0;
++
++	/* make sure device is ready */
++	while ((ret = dump_dev_ready(NULL)) == -EAGAIN);
++	if  (ret < 0) {
++		printk("dump_dev_ready failed !err %d\n", ret);
++		return ret;
++	}
++
++	while (len) {
++		if ((last_transfer = dump_dev_write(buf, len)) <= 0)  {
++			ret = last_transfer;
++			printk("dump_dev_write failed !err %d\n", 
++			ret);
++			break;
++		}
++		/* wait till complete */
++		while ((ret = dump_dev_ready(buf)) == -EAGAIN)
++			cpu_relax();
++
++		if  (ret < 0) {
++			printk("i/o failed !err %d\n", ret);
++			break;
++		}
++
++		len -= last_transfer;
++		buf += last_transfer;
++		transferred += last_transfer;
++	}
++	return (ret < 0) ? ret : transferred;
++}
++
++/* default writeout routine for single dump device */
++/* writes out the dump data ensuring enough space is left for the end marker */
++int dump_generic_write_buffer(void *buf, unsigned long len)
++{
++	long written = 0;
++	int err = 0;
++
++	/* check for space */
++	if ((err = dump_dev_seek(dump_config.dumper->curr_offset + len + 
++			2*DUMP_BUFFER_SIZE)) < 0) {
++		printk("dump_write_buffer: insuff space after offset 0x%llx\n",
++			dump_config.dumper->curr_offset);
++		return err;
++	}
++	/* alignment check would happen as a side effect of this */
++	if ((err = dump_dev_seek(dump_config.dumper->curr_offset)) < 0)
++		return err; 
++
++	written = dump_ll_write(buf, len);
++
++	/* all or none */
++
++	if (written < len)
++		written = written ? -ENOSPC : written;
++	else
++		dump_config.dumper->curr_offset += len;
++
++	return written;
++}
++
++int dump_generic_configure(unsigned long devid)
++{
++	struct dump_dev *dev = dump_config.dumper->dev;
++	struct dump_data_filter *filter;
++	void *buf;
++	int ret = 0;
++
++	/* Allocate the dump buffer and initialize dumper state */
++	/* Assume that we get aligned addresses */
++	if (!(buf = dump_alloc_mem(DUMP_BUFFER_SIZE + 3 * DUMP_PAGE_SIZE)))
++		return -ENOMEM;
++
++	if ((unsigned long)buf & (PAGE_SIZE - 1)) {
++		/* sanity check for page aligned address */
++		dump_free_mem(buf);
++		return -ENOMEM; /* fixme: better error code */
++	}
++
++	/* Initialize the rest of the fields */
++	dump_config.dumper->dump_buf = buf + DUMP_PAGE_SIZE;
++	dumper_reset();
++
++	/* Open the dump device */
++	if (!dev)
++		return -ENODEV;
++
++	if ((ret = dev->ops->open(dev, devid))) {
++	       return ret;
++	}
++
++	/* Initialise the memory ranges in the dump filter */
++	for (filter = dump_config.dumper->filter ;filter->selector; filter++) {
++		if (!filter->start && !filter->end) {
++			filter->start = 0;
++			filter->end = num_physpages << PAGE_SHIFT;
++		}
++	}
++
++	return 0;
++}
++
++int dump_generic_unconfigure(void)
++{
++	struct dump_dev *dev = dump_config.dumper->dev;
++	void *buf = dump_config.dumper->dump_buf;
++	int ret = 0;
++
++	pr_debug("Generic unconfigure\n");
++	/* Close the dump device */
++	if (dev && (ret = dev->ops->release(dev)))
++		return ret;
++
++	printk("Closed dump device\n");
++	
++	if (buf)
++		dump_free_mem((buf - DUMP_PAGE_SIZE));
++
++	dump_config.dumper->curr_buf = dump_config.dumper->dump_buf = NULL;
++	pr_debug("Released dump buffer\n");
++
++	return 0;
++}
++
++
++/* Set up the default dump scheme */
++
++struct dump_scheme_ops dump_scheme_singlestage_ops = {
++	.configure	= dump_generic_configure,
++	.unconfigure	= dump_generic_unconfigure,
++	.sequencer	= dump_generic_sequencer,
++	.iterator	= dump_page_iterator,
++	.save_data	= dump_generic_save_data,
++	.skip_data	= dump_generic_skip_data,
++	.write_buffer	= dump_generic_write_buffer,
++};
++
++struct dump_scheme dump_scheme_singlestage = {
++	.name		= "single-stage",
++	.ops		= &dump_scheme_singlestage_ops
++};
++
++/* The single stage dumper comprising all these */
++struct dumper dumper_singlestage = {
++	.name		= "single-stage",
++	.scheme		= &dump_scheme_singlestage,
++	.fmt		= &dump_fmt_lcrash,
++	.compress 	= &dump_none_compression,
++	.filter		= dump_filter_table,
++	.dev		= NULL,
++};		
++
+--- linux-2.5.69/drivers/dump/dump_setup.c.lkcdbase	Mon Jun  2 17:29:49 2003
++++ linux-2.5.69/drivers/dump/dump_setup.c	Tue Apr 29 03:37:19 2003
+@@ -0,0 +1,803 @@
++/*
++ * Standard kernel function entry points for Linux crash dumps.
++ *
++ * Created by: Matt Robinson (yakker@sourceforge.net)
++ * Contributions from SGI, IBM, HP, MCL, and others.
++ *
++ * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
++ * Copyright (C) 2000 - 2002 TurboLinux, Inc.  All rights reserved.
++ * Copyright (C) 2001 - 2002 Matt D. Robinson.  All rights reserved.
++ * Copyright (C) 2002 Free Software Foundation, Inc. All rights reserved.
++ *
++ * This code is released under version 2 of the GNU GPL.
++ */
++
++/*
++ * -----------------------------------------------------------------------
++ *
++ * DUMP HISTORY
++ *
++ * This dump code goes back to SGI's first attempts at dumping system
++ * memory on SGI systems running IRIX.  A few developers at SGI needed
++ * a way to take this system dump and analyze it, and created 'icrash',
++ * or IRIX Crash.  The mechanism (the dumps and 'icrash') were used
++ * by support people to generate crash reports when a system failure
++ * occurred.  This was vital for large system configurations that
++ * couldn't apply patch after patch after fix just to hope that the
++ * problems would go away.  So the system memory, along with the crash
++ * dump analyzer, allowed support people to quickly figure out what the
++ * problem was on the system with the crash dump.
++ *
++ * In comes Linux.  SGI started moving towards the open source community,
++ * and upon doing so, SGI wanted to take its support utilities into Linux
++ * with the hopes that they would end up the in kernel and user space to
++ * be used by SGI's customers buying SGI Linux systems.  One of the first
++ * few products to be open sourced by SGI was LKCD, or Linux Kernel Crash
++ * Dumps.  LKCD comprises of a patch to the kernel to enable system
++ * dumping, along with 'lcrash', or Linux Crash, to analyze the system
++ * memory dump.  A few additional system scripts and kernel modifications
++ * are also included to make the dump mechanism and dump data easier to
++ * process and use.
++ *
++ * As soon as LKCD was released into the open source community, a number
++ * of larger companies started to take advantage of it.  Today, there are
++ * many community members that contribute to LKCD, and it continues to
++ * flourish and grow as an open source project.
++ */
++
++/*
++ * DUMP TUNABLES
++ *
++ * This is the list of system tunables (via /proc) that are available
++ * for Linux systems.  All the read, write, etc., functions are listed
++ * here.  Currently, there are a few different tunables for dumps:
++ *
++ * dump_device (used to be dumpdev):
++ *     The device for dumping the memory pages out to.  This 
++ *     may be set to the primary swap partition for disruptive dumps,
++ *     and must be an unused partition for non-disruptive dumps.
++ *     Todo: In the case of network dumps, this may be interpreted 
++ *     as the IP address of the netdump server to connect to.
++ *
++ * dump_compress (used to be dump_compress_pages):
++ *     This is the flag which indicates which compression mechanism
++ *     to use.  This is a BITMASK, not an index (0,1,2,4,8,16,etc.).
++ *     This is the current set of values:
++ *
++ *     0: DUMP_COMPRESS_NONE -- Don't compress any pages.
++ *     1: DUMP_COMPRESS_RLE  -- This uses RLE compression.
++ *     2: DUMP_COMPRESS_GZIP -- This uses GZIP compression.
++ *
++ * dump_level:
++ *     The amount of effort the dump module should make to save
++ *     information for post crash analysis.  This value is now
++ *     a BITMASK value, not an index:
++ *
++ *     0:   Do nothing, no dumping. (DUMP_LEVEL_NONE)
++ *
++ *     1:   Print out the dump information to the dump header, and
++ *          write it out to the dump_device. (DUMP_LEVEL_HEADER)
++ *
++ *     2:   Write out the dump header and all kernel memory pages.
++ *          (DUMP_LEVEL_KERN)
++ *
++ *     4:   Write out the dump header and all kernel and user
++ *          memory pages.  (DUMP_LEVEL_USED)
++ *
++ *     8:   Write out the dump header and all conventional/cached 
++ *	    memory (RAM) pages in the system (kernel, user, free).  
++ *	    (DUMP_LEVEL_ALL_RAM)
++ *
++ *    16:   Write out everything, including non-conventional memory
++ *	    like firmware, proms, I/O registers, uncached memory.
++ *	    (DUMP_LEVEL_ALL)
++ *
++ *     The dump_level will default to 1.
++ *
++ * dump_flags:
++ *     These are the flags to use when talking about dumps.  There
++ *     are lots of possibilities.  This is a BITMASK value, not an index.
++ * 
++ * -----------------------------------------------------------------------
++ */
++
++#include <linux/kernel.h>
++#include <linux/delay.h>
++#include <linux/reboot.h>
++#include <linux/fs.h>
++#include <linux/dump.h>
++#include "dump_methods.h"
++#include <linux/proc_fs.h>
++#include <linux/module.h>
++#include <linux/utsname.h>
++#include <linux/highmem.h>
++#include <linux/major.h>
++#include <linux/sysrq.h>
++#include <linux/sysctl.h>
++#include <linux/nmi.h>
++
++#include <asm/hardirq.h>
++#include <asm/uaccess.h>
++
++/*
++ * -----------------------------------------------------------------------
++ *                         V A R I A B L E S
++ * -----------------------------------------------------------------------
++ */
++
++/* Dump tunables */
++struct dump_config dump_config = {
++	.level 		= 0,
++	.flags 		= 0,
++	.dump_device	= 0,
++	.dump_addr	= 0,
++	.dumper 	= NULL
++};
++
++
++/* Global variables used in dump.h */
++/* degree of system freeze when dumping */
++enum dump_silence_levels dump_silence_level = DUMP_HARD_SPIN_CPUS;	 
++
++/* Other global fields */
++extern struct __dump_header dump_header; 
++struct dump_dev *dump_dev = NULL;  /* Active dump device                   */
++static int dump_compress = 0;
++
++static u16 dump_compress_none(const u8 *old, u16 oldsize, u8 *new, u16 newsize);
++struct __dump_compress dump_none_compression = {
++	.compress_type	= DUMP_COMPRESS_NONE,
++	.compress_func	= dump_compress_none,
++	.compress_name  = "none",
++};
++
++/* our device operations and functions */
++static int dump_ioctl(struct inode *i, struct file *f,
++	unsigned int cmd, unsigned long arg);
++
++static struct file_operations dump_fops = {
++	.ioctl		=	dump_ioctl,
++};
++
++/* static variables							*/
++static int dump_okay = 0;		/* can we dump out to disk?	*/
++static spinlock_t dump_lock = SPIN_LOCK_UNLOCKED;
++
++/* used for dump compressors */
++static struct list_head dump_compress_list = LIST_HEAD_INIT(dump_compress_list);
++
++/* list of registered dump targets */
++static struct list_head dump_target_list = LIST_HEAD_INIT(dump_target_list);
++
++/* lkcd info structure -- this is used by lcrash for basic system data     */
++struct __lkcdinfo lkcdinfo = {
++	.ptrsz		= (sizeof(void *) * 8),
++#if defined(__LITTLE_ENDIAN) 
++	.byte_order	= __LITTLE_ENDIAN,
++#else
++	.byte_order	= __BIG_ENDIAN,
++#endif
++	.page_shift	= PAGE_SHIFT,
++	.page_size	= PAGE_SIZE,
++	.page_mask	= PAGE_MASK,
++	.page_offset	= PAGE_OFFSET,
++};
++
++/*
++ * -----------------------------------------------------------------------
++ *            / P R O C   T U N A B L E   F U N C T I O N S
++ * -----------------------------------------------------------------------
++ */
++
++static int proc_dump_device(ctl_table *ctl, int write, struct file *f,
++			    void *buffer, size_t *lenp);
++
++static int proc_doulonghex(ctl_table *ctl, int write, struct file *f,
++			    void *buffer, size_t *lenp);
++/*
++ * sysctl-tuning infrastructure.
++ */
++static ctl_table dump_table[] = {
++	{ .ctl_name = CTL_DUMP_LEVEL,
++	  .procname = DUMP_LEVEL_NAME, 
++	  .data = &dump_config.level, 	 
++	  .maxlen = sizeof(int),
++	  .mode = 0644,
++	  .proc_handler = proc_doulonghex, },
++
++	{ .ctl_name = CTL_DUMP_FLAGS,
++	  .procname = DUMP_FLAGS_NAME,
++	  .data = &dump_config.flags,	
++	  .maxlen = sizeof(int),
++	  .mode = 0644,
++	  .proc_handler = proc_doulonghex, },
++
++	{ .ctl_name = CTL_DUMP_COMPRESS,
++	  .procname = DUMP_COMPRESS_NAME,
++	  .data = &dump_compress, /* FIXME */
++	  .maxlen = sizeof(int),
++	  .mode = 0644,
++	  .proc_handler = proc_dointvec, },
++	  
++	{ .ctl_name = CTL_DUMP_DEVICE,
++	  .procname = DUMP_DEVICE_NAME,
++	  .mode = 0644,
++	  .data = &dump_config.dump_device, /* FIXME */
++	  .maxlen = sizeof(int),
++	  .proc_handler = proc_dump_device },
++
++#ifdef CONFIG_CRASH_DUMP_MEMDEV
++	{ .ctl_name = CTL_DUMP_ADDR,
++	  .procname = DUMP_ADDR_NAME,
++	  .mode = 0444,
++	  .data = &dump_config.dump_addr,
++	  .maxlen = sizeof(unsigned long),
++	  .proc_handler = proc_doulonghex },
++#endif
++
++	{ 0, }
++};
++
++static ctl_table dump_root[] = {
++	{ .ctl_name = KERN_DUMP,
++	  .procname = "dump",
++	  .mode = 0555, 
++	  .child = dump_table },
++	{ 0, }
++};
++
++static ctl_table kernel_root[] = {
++	{ .ctl_name = CTL_KERN,
++	  .procname = "kernel",
++	  .mode = 0555,
++	  .child = dump_root, },
++	{ 0, }
++};
++
++static struct ctl_table_header *sysctl_header;
++
++/*
++ * -----------------------------------------------------------------------
++ *              C O M P R E S S I O N   F U N C T I O N S
++ * -----------------------------------------------------------------------
++ */
++
++/*
++ * Name: dump_compress_none()
++ * Func: Don't do any compression, period.
++ */
++static u16
++dump_compress_none(const u8 *old, u16 oldsize, u8 *new, u16 newsize)
++{
++	/* just return the old size */
++	return oldsize;
++}
++
++
++/*
++ * Name: dump_execute()
++ * Func: Execute the dumping process.  This makes sure all the appropriate
++ *       fields are updated correctly, and calls dump_execute_memdump(),
++ *       which does the real work.
++ */
++void
++dump_execute(const char *panic_str, const struct pt_regs *regs)
++{
++	int state = -1;
++	unsigned long flags;
++
++	/* make sure we can dump */
++	if (!dump_okay) {
++		pr_info("LKCD not yet configured, can't take dump now\n");
++		return;
++	}
++
++	/* Exclude multiple dumps at the same time,
++	 * and disable interrupts,  some drivers may re-enable
++	 * interrupts in with silence()
++	 *
++	 * Try and acquire spin lock. If successful, leave preempt
++	 * and interrupts disabled.  See spin_lock_irqsave in spinlock.h
++	 */
++	local_irq_save(flags);
++	if (!spin_trylock(&dump_lock)) {
++		local_irq_restore(flags);
++		pr_info("LKCD dump already in progress\n");
++		return;
++	}
++
++	/* Bring system into the strictest level of quiescing for min drift 
++	 * dump drivers can soften this as required in dev->ops->silence() 
++	 */
++	dump_oncpu = smp_processor_id() + 1;
++	dump_silence_level = DUMP_HARD_SPIN_CPUS; 
++
++	state = dump_generic_execute(panic_str, regs);
++	
++	dump_oncpu = 0;
++	spin_unlock_irqrestore(&dump_lock, flags);
++
++	if (state < 0) {
++		printk("Dump Incomplete or failed!\n");
++	} else {
++		printk("Dump Complete; %d dump pages saved.\n", 
++		       dump_header.dh_num_dump_pages);
++	}
++}
++
++/*
++ * Name: dump_register_compression()
++ * Func: Register a dump compression mechanism.
++ */
++void
++dump_register_compression(struct __dump_compress *item)
++{
++	if (item)
++		list_add(&(item->list), &dump_compress_list);
++}
++
++/*
++ * Name: dump_unregister_compression()
++ * Func: Remove a dump compression mechanism, and re-assign the dump
++ *       compression pointer if necessary.
++ */
++void
++dump_unregister_compression(int compression_type)
++{
++	struct list_head *tmp;
++	struct __dump_compress *dc;
++
++	/* let's make sure our list is valid */
++	if (compression_type != DUMP_COMPRESS_NONE) {
++		list_for_each(tmp, &dump_compress_list) {
++			dc = list_entry(tmp, struct __dump_compress, list);
++			if (dc->compress_type == compression_type) {
++				list_del(&(dc->list));
++				break;
++			}
++		}
++	}
++}
++
++/*
++ * Name: dump_compress_init()
++ * Func: Initialize (or re-initialize) compression scheme.
++ */
++static int
++dump_compress_init(int compression_type)
++{
++	struct list_head *tmp;
++	struct __dump_compress *dc;
++
++	/* try to remove the compression item */
++	list_for_each(tmp, &dump_compress_list) {
++		dc = list_entry(tmp, struct __dump_compress, list);
++		if (dc->compress_type == compression_type) {
++			dump_config.dumper->compress = dc;
++			dump_compress = compression_type;
++ 			pr_debug("Dump Compress %s\n", dc->compress_name);
++			return 0;
++		}
++	}
++
++	/* 
++	 * nothing on the list -- return ENODATA to indicate an error 
++	 *
++	 * NB: 
++	 *	EAGAIN: reports "Resource temporarily unavailable" which
++	 *		isn't very enlightening.
++	 */
++	printk("compression_type:%d not found\n", compression_type);
++
++	return -ENODATA;
++}
++
++static int
++dumper_setup(unsigned long flags, unsigned long devid)
++{
++	int ret = 0;
++
++	/* unconfigure old dumper if it exists */
++	dump_okay = 0;
++	if (dump_config.dumper) {
++		pr_debug("Unconfiguring current dumper\n");
++		dump_unconfigure();
++	}
++	/* set up new dumper */
++	if (dump_config.flags & DUMP_FLAGS_SOFTBOOT) {
++		printk("Configuring softboot based dump \n");
++#ifdef CONFIG_CRASH_DUMP_MEMDEV
++		dump_config.dumper = &dumper_stage1; 
++#else
++		printk("Requires CONFIG_CRASHDUMP_MEMDEV. Can't proceed.\n");
++		return -1;
++#endif
++	} else {
++		dump_config.dumper = &dumper_singlestage;
++	}	
++	dump_config.dumper->dev = dump_dev;
++
++	ret = dump_configure(devid);
++	if (!ret) {
++		dump_okay = 1;
++		pr_debug("%s dumper set up for dev 0x%lx\n", 
++			dump_config.dumper->name, devid);
++ 		dump_config.dump_device = devid;
++	} else {
++		printk("%s dumper set up failed for dev 0x%lx\n", 
++		       dump_config.dumper->name, devid);
++ 		dump_config.dumper = NULL;
++	}
++	return ret;
++}
++
++static int
++dump_target_init(int target)
++{
++	char type[20];
++	struct list_head *tmp;
++	struct dump_dev *dev;
++	
++	switch (target) {
++		case DUMP_FLAGS_DISKDUMP:
++			strcpy(type, "blockdev"); break;
++		case DUMP_FLAGS_NETDUMP:
++			strcpy(type, "networkdev"); break;
++		default:
++			return -1;
++	}
++
++	/*
++	 * This is a bit stupid, generating strings from flag
++	 * and doing strcmp. This is done because 'struct dump_dev'
++	 * has string 'type_name' and not interger 'type'.
++	 */
++	list_for_each(tmp, &dump_target_list) {
++		dev = list_entry(tmp, struct dump_dev, list);
++		if (strcmp(type, dev->type_name) == 0) {
++			dump_dev = dev;
++			return 0;
++		}
++	}
++	return -1;
++}
++
++/*
++ * Name: dump_ioctl()
++ * Func: Allow all dump tunables through a standard ioctl() mechanism.
++ *       This is far better than before, where we'd go through /proc,
++ *       because now this will work for multiple OS and architectures.
++ */
++static int
++dump_ioctl(struct inode *i, struct file *f, unsigned int cmd, unsigned long arg)
++{
++	/* check capabilities */
++	if (!capable(CAP_SYS_ADMIN))
++		return -EPERM;
++
++	if (!dump_config.dumper && cmd == DIOSDUMPCOMPRESS)
++		/* dump device must be configured first */
++		return -ENODEV;
++
++	/*
++	 * This is the main mechanism for controlling get/set data
++	 * for various dump device parameters.  The real trick here
++	 * is setting the dump device (DIOSDUMPDEV).  That's what
++	 * triggers everything else.
++	 */
++	switch (cmd) {
++	case DIOSDUMPDEV:	/* set dump_device */
++		pr_debug("Configuring dump device\n"); 
++		if (!(f->f_flags & O_RDWR))
++			return -EPERM;
++
++		__dump_open();
++		return dumper_setup(dump_config.flags, arg);
++
++		
++	case DIOGDUMPDEV:	/* get dump_device */
++		return put_user((long)dump_config.dump_device, (long *)arg);
++
++	case DIOSDUMPLEVEL:	/* set dump_level */
++		if (!(f->f_flags & O_RDWR))
++			return -EPERM;
++
++		/* make sure we have a positive value */
++		if (arg < 0)
++			return -EINVAL;
++
++		/* Fixme: clean this up */
++		dump_config.level = 0;
++		switch ((int)arg) {
++			case DUMP_LEVEL_ALL:
++			case DUMP_LEVEL_ALL_RAM:
++				dump_config.level |= DUMP_MASK_UNUSED;
++			case DUMP_LEVEL_USED:
++				dump_config.level |= DUMP_MASK_USED;
++			case DUMP_LEVEL_KERN:
++				dump_config.level |= DUMP_MASK_KERN;
++			case DUMP_LEVEL_HEADER:
++				dump_config.level |= DUMP_MASK_HEADER;
++			case DUMP_LEVEL_NONE:
++				break;
++			default:
++				return (-EINVAL);
++			}
++		pr_debug("Dump Level 0x%lx\n", dump_config.level);
++		break;
++
++	case DIOGDUMPLEVEL:	/* get dump_level */
++		/* fixme: handle conversion */
++		return put_user((long)dump_config.level, (long *)arg);
++
++		
++	case DIOSDUMPFLAGS:	/* set dump_flags */
++		/* check flags */
++		if (!(f->f_flags & O_RDWR))
++			return -EPERM;
++
++		/* make sure we have a positive value */
++		if (arg < 0)
++			return -EINVAL;
++			
++		if (dump_target_init(arg & DUMP_FLAGS_TARGETMASK) < 0)
++			return -EINVAL; /* return proper error */
++
++		dump_config.flags = arg;
++		
++		pr_debug("Dump Flags 0x%lx\n", dump_config.flags);
++		break;
++		
++	case DIOGDUMPFLAGS:	/* get dump_flags */
++		return put_user((long)dump_config.flags, (long *)arg);
++
++	case DIOSDUMPCOMPRESS:	/* set the dump_compress status */
++		if (!(f->f_flags & O_RDWR))
++			return -EPERM;
++
++		return dump_compress_init((int)arg);
++
++	case DIOGDUMPCOMPRESS:	/* get the dump_compress status */
++		return put_user((long)(dump_config.dumper ? 
++			dump_config.dumper->compress->compress_type : 0), 
++			(long *)arg);
++			
++	default:
++		/* 
++		 * these are network dump specific ioctls, let the
++		 * module handle them.
++		 */
++		return dump_dev_ioctl(cmd, arg);
++	}
++	return 0;
++}
++
++/*
++ * Handle special cases for dump_device 
++ * changing dump device requires doing an opening the device
++ */
++static int 
++proc_dump_device(ctl_table *ctl, int write, struct file *f,
++		 void *buffer, size_t *lenp)
++{
++	int *valp = ctl->data;
++	int oval = *valp;
++	int ret = -EPERM;
++
++	/* same permission checks as ioctl */
++	if (capable(CAP_SYS_ADMIN)) {
++		ret = proc_doulonghex(ctl, write, f, buffer, lenp);
++		if (ret == 0 && write && *valp != oval) {
++			/* need to restore old value to close properly */
++			dump_config.dump_device = (dev_t) oval;
++			__dump_open();
++			ret = dumper_setup(dump_config.flags, (dev_t) *valp);
++		}
++	}
++
++	return ret;
++}
++
++/* All for the want of a proc_do_xxx routine which prints values in hex */
++static int 
++proc_doulonghex(ctl_table *ctl, int write, struct file *f,
++		 void *buffer, size_t *lenp)
++{
++#define TMPBUFLEN 20
++	unsigned long *i;
++	size_t len, left;
++	char buf[TMPBUFLEN];
++
++	if (!ctl->data || !ctl->maxlen || !*lenp || (f->f_pos)) {
++		*lenp = 0;
++		return 0;
++	}
++	
++	i = (unsigned long *) ctl->data;
++	left = *lenp;
++	
++	sprintf(buf, "0x%lx\n", (*i));
++	len = strlen(buf);
++	if (len > left)
++		len = left;
++	if(copy_to_user(buffer, buf, len))
++		return -EFAULT;
++	
++	left -= len;
++	*lenp -= left;
++	f->f_pos += *lenp;
++	return 0;
++}
++
++/*
++ * -----------------------------------------------------------------------
++ *                     I N I T   F U N C T I O N S
++ * -----------------------------------------------------------------------
++ */
++
++/*
++ * These register and unregister routines are exported for modules
++ * to register their dump drivers (like block, net etc)
++ */
++int
++dump_register_device(struct dump_dev *ddev)
++{
++	struct list_head *tmp;
++	struct dump_dev *dev;
++
++	list_for_each(tmp, &dump_target_list) {
++		dev = list_entry(tmp, struct dump_dev, list);
++		if (strcmp(ddev->type_name, dev->type_name) == 0) {
++			printk("Target type %s already registered\n",
++					dev->type_name);
++			return -1; /* return proper error */
++		}
++	}
++	list_add(&(ddev->list), &dump_target_list);
++	
++	return 0;
++}
++
++void
++dump_unregister_device(struct dump_dev *ddev)
++{
++	list_del(&(ddev->list));
++	if (ddev != dump_dev)
++		return;
++
++	dump_okay = 0;
++
++	if (dump_config.dumper)
++		dump_unconfigure();
++
++	dump_config.flags &= ~DUMP_FLAGS_TARGETMASK;
++	dump_okay = 0;
++	dump_dev = NULL;
++	dump_config.dumper = NULL;
++}
++
++static int panic_event(struct notifier_block *this, unsigned long event,
++		       void *ptr)
++{
++	struct pt_regs regs;
++
++	get_current_regs(&regs);
++	dump_execute((const char *)ptr, &regs);
++	return 0;
++}
++
++extern struct notifier_block *panic_notifier_list;
++static int panic_event(struct notifier_block *, unsigned long, void *);
++static struct notifier_block panic_block = {
++	.notifier_call = panic_event,
++};
++
++#ifdef CONFIG_MAGIC_SYSRQ
++/* Sysrq handler */
++static void sysrq_handle_crashdump(int key, struct pt_regs *pt_regs,
++		struct tty_struct *tty) {
++	dump_execute("sysrq", pt_regs);
++}
++
++static struct sysrq_key_op sysrq_crashdump_op = {
++	.handler	=	sysrq_handle_crashdump,
++	.help_msg	=	"Dump",
++	.action_msg	=	"Starting crash dump",
++};
++#endif
++
++static inline void
++dump_sysrq_register(void) 
++{
++#ifdef CONFIG_MAGIC_SYSRQ
++	__sysrq_lock_table();
++	__sysrq_put_key_op(DUMP_SYSRQ_KEY, &sysrq_crashdump_op);
++	__sysrq_unlock_table();
++#endif
++}
++
++static inline void
++dump_sysrq_unregister(void)
++{
++#ifdef CONFIG_MAGIC_SYSRQ
++	__sysrq_lock_table();
++	if (__sysrq_get_key_op(DUMP_SYSRQ_KEY) == &sysrq_crashdump_op)
++		__sysrq_put_key_op(DUMP_SYSRQ_KEY, NULL);
++	__sysrq_unlock_table();
++#endif
++}
++
++/*
++ * Name: dump_init()
++ * Func: Initialize the dump process.  This will set up any architecture
++ *       dependent code.  The big key is we need the memory offsets before
++ *       the page table is initialized, because the base memory offset
++ *       is changed after paging_init() is called.
++ */
++static int __init
++dump_init(void)
++{
++	struct sysinfo info;
++
++	/* try to create our dump device */
++	if (register_chrdev(CRASH_DUMP_MAJOR, "dump", &dump_fops)) {
++		printk("cannot register dump character device!\n");
++		return -EBUSY;
++	}
++
++	__dump_init((u64)PAGE_OFFSET);
++
++	/* set the dump_compression_list structure up */
++	dump_register_compression(&dump_none_compression);
++
++	/* grab the total memory size now (not if/when we crash) */
++	si_meminfo(&info);
++
++	/* set the memory size */
++	dump_header.dh_memory_size = (u64)info.totalram;
++
++	sysctl_header = register_sysctl_table(kernel_root, 0);
++	dump_sysrq_register();
++
++	notifier_chain_register(&panic_notifier_list, &panic_block);
++	dump_function_ptr = dump_execute;
++
++	pr_info("Crash dump driver initialized.\n");
++	return 0;
++}
++
++static void __exit
++dump_cleanup(void)
++{
++	dump_okay = 0;
++
++	if (dump_config.dumper)
++		dump_unconfigure();
++
++	/* arch-specific cleanup routine */
++	__dump_cleanup();
++
++	/* ignore errors while unregistering -- since can't do anything */
++	unregister_sysctl_table(sysctl_header);
++	unregister_chrdev(CRASH_DUMP_MAJOR, "dump");
++	dump_sysrq_unregister();
++	notifier_chain_unregister(&panic_notifier_list, &panic_block);
++	dump_function_ptr = NULL;
++}
++
++EXPORT_SYMBOL(dump_register_compression);
++EXPORT_SYMBOL(dump_unregister_compression);
++EXPORT_SYMBOL(dump_register_device);
++EXPORT_SYMBOL(dump_unregister_device);
++EXPORT_SYMBOL(dump_config);
++EXPORT_SYMBOL(dump_silence_level);
++
++EXPORT_SYMBOL(__dump_irq_enable);
++EXPORT_SYMBOL(__dump_irq_restore);
++
++MODULE_AUTHOR("Matt D. Robinson <yakker@sourceforge.net>");
++MODULE_DESCRIPTION("Linux Kernel Crash Dump (LKCD) driver");
++MODULE_LICENSE("GPL");
++
++module_init(dump_init);
++module_exit(dump_cleanup);
+--- linux-2.5.69/include/linux/dumpdev.h.lkcdbase	Mon Jun  2 17:28:52 2003
++++ linux-2.5.69/include/linux/dumpdev.h	Mon Jun  2 17:31:01 2003
+@@ -0,0 +1,161 @@
++/*
++ * Generic dump device interfaces for flexible system dump 
++ * (Enables variation of dump target types e.g disk, network, memory)
++ *
++ * These interfaces have evolved based on discussions on lkcd-devel. 
++ * Eventually the intent is to support primary and secondary or 
++ * alternate targets registered at the same time, with scope for 
++ * situation based failover or multiple dump devices used for parallel 
++ * dump i/o.
++ *
++ * Started: Oct 2002 - Suparna Bhattacharya (suparna@in.ibm.com)
++ *
++ * Copyright (C) 2001 - 2002 Matt D. Robinson.  All rights reserved.
++ * Copyright (C) 2002 International Business Machines Corp. 
++ *
++ * This code is released under version 2 of the GNU GPL.
++ */
++
++#ifndef _LINUX_DUMPDEV_H
++#define _LINUX_DUMPDEV_H
++
++#include <linux/kernel.h>
++#include <linux/wait.h>
++#include <linux/bio.h>
++
++/* Determined by the dump target (device) type */
++
++struct dump_dev;
++
++struct dump_dev_ops {
++	int (*open)(struct dump_dev *, unsigned long); /* configure */
++	int (*release)(struct dump_dev *); /* unconfigure */
++	int (*silence)(struct dump_dev *); /* when dump starts */
++	int (*resume)(struct dump_dev *); /* when dump is over */
++	int (*seek)(struct dump_dev *, loff_t);
++	/* trigger a write (async in nature typically) */
++	int (*write)(struct dump_dev *, void *, unsigned long);
++	/* not usually used during dump, but option available */
++	int (*read)(struct dump_dev *, void *, unsigned long);
++	/* use to poll for completion */
++	int (*ready)(struct dump_dev *, void *); 
++	int (*ioctl)(struct dump_dev *, unsigned int, unsigned long);
++};
++
++struct dump_dev {
++	char type_name[32]; /* block, net-poll etc */
++	unsigned long device_id; /* interpreted differently for various types */
++	struct dump_dev_ops *ops;
++	struct list_head list;
++	loff_t curr_offset;
++};
++
++/*
++ * dump_dev type variations: 
++ */
++
++/* block */
++struct dump_blockdev {
++	struct dump_dev ddev;
++	kdev_t kdev_id;
++	struct block_device *bdev;
++	struct bio *bio;
++	loff_t start_offset;
++	loff_t limit;
++	int err;
++};
++
++static inline struct dump_blockdev *DUMP_BDEV(struct dump_dev *dev)
++{
++	return container_of(dev, struct dump_blockdev, ddev);
++}
++
++
++/* mem  - for internal use by soft-boot based dumper */
++struct dump_memdev {
++	struct dump_dev ddev;
++	unsigned long indirect_map_root;
++	unsigned long nr_free;
++	struct page *curr_page;
++	unsigned long *curr_map;
++	unsigned long curr_map_offset;
++	unsigned long last_offset;
++	unsigned long last_used_offset;
++	unsigned long last_bs_offset;
++};	
++
++static inline struct dump_memdev *DUMP_MDEV(struct dump_dev *dev)
++{
++	return container_of(dev, struct dump_memdev, ddev);
++}
++
++/* Todo/future - meant for raw dedicated interfaces e.g. mini-ide driver */
++struct dump_rdev {
++	struct dump_dev ddev;
++	char name[32];
++	int (*reset)(struct dump_rdev *, unsigned int, 
++		unsigned long);
++	/* ... to do ... */
++};
++
++/* just to get the size right when saving config across a soft-reboot */
++struct dump_anydev {
++	union {
++		struct dump_blockdev bddev;
++		/* .. add other types here .. */
++	};
++};
++
++
++
++/* Dump device / target operation wrappers */
++/* These assume that dump_dev is initiatized to dump_config.dumper->dev */
++
++extern struct dump_dev *dump_dev;
++
++static inline int dump_dev_open(unsigned long arg)
++{
++	return dump_dev->ops->open(dump_dev, arg);
++}
++
++static inline int dump_dev_release(void)
++{
++	return dump_dev->ops->release(dump_dev);
++}
++
++static inline int dump_dev_silence(void)
++{
++	return dump_dev->ops->silence(dump_dev);
++}
++
++static inline int dump_dev_resume(void)
++{
++	return dump_dev->ops->resume(dump_dev);
++}
++
++static inline int dump_dev_seek(loff_t offset)
++{
++	return dump_dev->ops->seek(dump_dev, offset);
++}
++
++static inline int dump_dev_write(void *buf, unsigned long len)
++{
++	return dump_dev->ops->write(dump_dev, buf, len);
++}
++
++static inline int dump_dev_ready(void *buf)
++{
++	return dump_dev->ops->ready(dump_dev, buf);
++}
++
++static inline int dump_dev_ioctl(unsigned int cmd, unsigned long arg)
++{
++	if (!dump_dev->ops->ioctl)
++		return -EINVAL;
++	return dump_dev->ops->ioctl(dump_dev, cmd, arg);
++}
++
++extern int dump_register_device(struct dump_dev *);
++extern void dump_unregister_device(struct dump_dev *);
++
++#endif /*  _LINUX_DUMPDEV_H */
+--- linux-2.5.69/include/linux/dump.h.lkcdbase	Mon Jun  2 17:28:56 2003
++++ linux-2.5.69/include/linux/dump.h	Mon Jun  2 17:31:01 2003
+@@ -0,0 +1,376 @@
++/*
++ * Kernel header file for Linux crash dumps.
++ *
++ * Created by: Matt Robinson (yakker@sgi.com)
++ * Copyright 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
++ *
++ * vmdump.h to dump.h by: Matt D. Robinson (yakker@sourceforge.net)
++ * Copyright 2001 - 2002 Matt D. Robinson.  All rights reserved.
++ * Copyright (C) 2002 Free Software Foundation, Inc. All rights reserved.
++ *
++ * Most of this is the same old stuff from vmdump.h, except now we're
++ * actually a stand-alone driver plugged into the block layer interface,
++ * with the exception that we now allow for compression modes externally
++ * loaded (e.g., someone can come up with their own).
++ *
++ * This code is released under version 2 of the GNU GPL.
++ */
++
++/* This header file includes all structure definitions for crash dumps. */
++#ifndef _DUMP_H
++#define _DUMP_H
++
++#if defined(CONFIG_CRASH_DUMP) || defined (CONFIG_CRASH_DUMP_MODULE)
++
++#include <linux/list.h>
++#include <linux/notifier.h>
++#include <linux/dumpdev.h>
++
++/* 
++ * Predefine default DUMP_PAGE constants, asm header may override.
++ *
++ * On ia64 discontinuous memory systems it's possible for the memory
++ * banks to stop at 2**12 page alignments, the smallest possible page
++ * size. But the system page size, PAGE_SIZE, is in fact larger.
++ */
++#define DUMP_PAGE_SHIFT 	PAGE_SHIFT
++#define DUMP_PAGE_MASK		PAGE_MASK
++#define DUMP_PAGE_ALIGN(addr)	PAGE_ALIGN(addr)
++#define DUMP_HEADER_OFFSET	PAGE_SIZE
++
++/* keep DUMP_PAGE_SIZE constant to 4K = 1<<12
++ * it may be different from PAGE_SIZE then.
++ */
++#define DUMP_PAGE_SIZE		4096
++
++/* 
++ * Predefined default memcpy() to use when copying memory to the dump buffer.
++ *
++ * On ia64 there is a heads up function that can be called to let the prom
++ * machine check monitor know that the current activity is risky and it should
++ * ignore the fault (nofault). In this case the ia64 header will redefine this
++ * macro to __dump_memcpy() and use it's arch specific version.
++ */
++#define DUMP_memcpy		memcpy
++
++/* necessary header files */
++#include <asm/dump.h>			/* for architecture-specific header */
++
++/* 
++ * Size of the buffer that's used to hold:
++ *
++ *	1. the dump header (padded to fill the complete buffer)
++ *	2. the possibly compressed page headers and data
++ */
++#define DUMP_BUFFER_SIZE	(64 * 1024)  /* size of dump buffer         */
++#define DUMP_HEADER_SIZE	DUMP_BUFFER_SIZE
++
++/* standard header definitions */
++#define DUMP_MAGIC_NUMBER	0xa8190173618f23edULL  /* dump magic number */
++#define DUMP_MAGIC_LIVE		0xa8190173618f23cdULL  /* live magic number */
++#define DUMP_VERSION_NUMBER	0x8	/* dump version number              */
++#define DUMP_PANIC_LEN		0x100	/* dump panic string length         */
++
++/* dump levels - type specific stuff added later -- add as necessary */
++#define DUMP_LEVEL_NONE		0x0	/* no dumping at all -- just bail   */
++#define DUMP_LEVEL_HEADER	0x1	/* kernel dump header only          */
++#define DUMP_LEVEL_KERN		0x2	/* dump header and kernel pages     */
++#define DUMP_LEVEL_USED		0x4	/* dump header, kernel/user pages   */
++#define DUMP_LEVEL_ALL_RAM	0x8	/* dump header, all RAM pages       */
++#define DUMP_LEVEL_ALL		0x10	/* dump all memory RAM and firmware */
++
++
++/* dump compression options -- add as necessary */
++#define DUMP_COMPRESS_NONE	0x0	/* don't compress this dump         */
++#define DUMP_COMPRESS_RLE	0x1	/* use RLE compression              */
++#define DUMP_COMPRESS_GZIP	0x2	/* use GZIP compression             */
++
++/* dump flags - any dump-type specific flags -- add as necessary */
++#define DUMP_FLAGS_NONE		0x0	/* no flags are set for this dump   */
++#define DUMP_FLAGS_SOFTBOOT	0x2	/* 2 stage soft-boot based dump	    */
++
++#define DUMP_FLAGS_TARGETMASK	0xf0000000 /* handle special case targets   */
++#define DUMP_FLAGS_DISKDUMP	0x80000000 /* dump to local disk 	    */
++#define DUMP_FLAGS_NETDUMP	0x40000000 /* dump over the network         */
++
++/* dump header flags -- add as necessary */
++#define DUMP_DH_FLAGS_NONE	0x0	/* no flags set (error condition!)  */
++#define DUMP_DH_RAW		0x1	/* raw page (no compression)        */
++#define DUMP_DH_COMPRESSED	0x2	/* page is compressed               */
++#define DUMP_DH_END		0x4	/* end marker on a full dump        */
++#define DUMP_DH_TRUNCATED	0x8	/* dump is incomplete               */
++#define DUMP_DH_TEST_PATTERN	0x10	/* dump page is a test pattern      */
++#define DUMP_DH_NOT_USED	0x20	/* 1st bit not used in flags        */
++
++/* names for various dump parameters in /proc/kernel */
++#define DUMP_ROOT_NAME		"sys/dump"
++#define DUMP_DEVICE_NAME	"device"
++#define DUMP_COMPRESS_NAME	"compress"
++#define DUMP_LEVEL_NAME		"level"
++#define DUMP_FLAGS_NAME		"flags"
++#define DUMP_ADDR_NAME		"addr"
++
++#define DUMP_SYSRQ_KEY		'd'	/* key to use for MAGIC_SYSRQ key   */
++
++/* CTL_DUMP names: */
++enum
++{
++	CTL_DUMP_DEVICE=1,
++	CTL_DUMP_COMPRESS=3,
++	CTL_DUMP_LEVEL=3,
++	CTL_DUMP_FLAGS=4,
++	CTL_DUMP_ADDR=5,
++	CTL_DUMP_TEST=6,
++};
++
++
++/* page size for gzip compression -- buffered slightly beyond hardware PAGE_SIZE used by DUMP */
++#define DUMP_DPC_PAGE_SIZE	(DUMP_PAGE_SIZE + 512)
++
++/* dump ioctl() control options */
++#define DIOSDUMPDEV		1	/* set the dump device              */
++#define DIOGDUMPDEV		2	/* get the dump device              */
++#define DIOSDUMPLEVEL		3	/* set the dump level               */
++#define DIOGDUMPLEVEL		4	/* get the dump level               */
++#define DIOSDUMPFLAGS		5	/* set the dump flag parameters     */
++#define DIOGDUMPFLAGS		6	/* get the dump flag parameters     */
++#define DIOSDUMPCOMPRESS	7	/* set the dump compress level      */
++#define DIOGDUMPCOMPRESS	8	/* get the dump compress level      */
++
++/* these ioctls are used only by netdump module */
++#define DIOSTARGETIP		9	/* set the target m/c's ip	    */
++#define DIOGTARGETIP		10	/* get the target m/c's ip	    */
++#define DIOSTARGETPORT		11	/* set the target m/c's port	    */
++#define DIOGTARGETPORT		12	/* get the target m/c's port	    */
++#define DIOSSOURCEPORT		13	/* set the source m/c's port	    */
++#define DIOGSOURCEPORT		14	/* get the source m/c's port	    */
++#define DIOSETHADDR		15	/* set ethernet address		    */
++#define DIOGETHADDR		16	/* get ethernet address		    */
++
++/*
++ * Structure: __dump_header
++ *  Function: This is the header dumped at the top of every valid crash
++ *            dump.  
++ */
++struct __dump_header {
++	/* the dump magic number -- unique to verify dump is valid */
++	u64	dh_magic_number;
++
++	/* the version number of this dump */
++	u32	dh_version;
++
++	/* the size of this header (in case we can't read it) */
++	u32	dh_header_size;
++
++	/* the level of this dump (just a header?) */
++	u32	dh_dump_level;
++
++	/* 
++	 * We assume dump_page_size to be 4K in every case.
++	 * Store here the configurable system page size (4K, 8K, 16K, etc.) 
++	 */
++	u32	dh_page_size;
++
++	/* the size of all physical memory */
++	u64	dh_memory_size;
++
++	/* the start of physical memory */
++	u64	dh_memory_start;
++
++	/* the end of physical memory */
++	u64	dh_memory_end;
++
++	/* the number of hardware/physical pages in this dump specifically */
++	u32	dh_num_dump_pages;
++
++	/* the panic string, if available */
++	char	dh_panic_string[DUMP_PANIC_LEN];
++
++	/* timeval depends on architecture, two long values */
++	struct {
++		u64 tv_sec;
++		u64 tv_usec;
++	} dh_time; /* the time of the system crash */
++
++	/* the NEW utsname (uname) information -- in character form */
++	/* we do this so we don't have to include utsname.h         */
++	/* plus it helps us be more architecture independent        */
++	/* now maybe one day soon they'll make the [65] a #define!  */
++	char	dh_utsname_sysname[65];
++	char	dh_utsname_nodename[65];
++	char	dh_utsname_release[65];
++	char	dh_utsname_version[65];
++	char	dh_utsname_machine[65];
++	char	dh_utsname_domainname[65];
++
++	/* the address of current task (OLD = void *, NEW = u64) */
++	u64	dh_current_task;
++
++	/* what type of compression we're using in this dump (if any) */
++	u32	dh_dump_compress;
++
++	/* any additional flags */
++	u32	dh_dump_flags;
++
++	/* any additional flags */
++	u32	dh_dump_device;
++} __attribute__((packed));
++
++/*
++ * Structure: __dump_page
++ *  Function: To act as the header associated to each physical page of
++ *            memory saved in the system crash dump.  This allows for
++ *            easy reassembly of each crash dump page.  The address bits
++ *            are split to make things easier for 64-bit/32-bit system
++ *            conversions.
++ *
++ * dp_byte_offset and dp_page_index are landmarks that are helpful when
++ * looking at a hex dump of /dev/vmdump,
++ */
++struct __dump_page {
++	/* the address of this dump page */
++	u64	dp_address;
++
++	/* the size of this dump page */
++	u32	dp_size;
++
++	/* flags (currently DUMP_COMPRESSED, DUMP_RAW or DUMP_END) */
++	u32	dp_flags;
++} __attribute__((packed));
++
++/*
++ * Structure: __lkcdinfo
++ * Function:  This structure contains information needed for the lkcdutils
++ *            package (particularly lcrash) to determine what information is
++ *            associated to this kernel, specifically.
++ */
++struct __lkcdinfo {
++	int	arch;
++	int	ptrsz;
++	int	byte_order;
++	int	linux_release;
++	int	page_shift;
++	int	page_size;
++	u64	page_mask;
++	u64	page_offset;
++	int	stack_offset;
++};
++
++#ifdef __KERNEL__
++
++/*
++ * Structure: __dump_compress
++ *  Function: This is what an individual compression mechanism can use
++ *            to plug in their own compression techniques.  It's always
++ *            best to build these as individual modules so that people
++ *            can put in whatever they want.
++ */
++struct __dump_compress {
++	/* the list_head structure for list storage */
++	struct list_head list;
++
++	/* the type of compression to use (DUMP_COMPRESS_XXX) */
++	int compress_type;
++	const char *compress_name;
++
++	/* the compression function to call */
++	u16 (*compress_func)(const u8 *, u16, u8 *, u16);
++};
++
++/* functions for dump compression registration */
++extern void dump_register_compression(struct __dump_compress *);
++extern void dump_unregister_compression(int);
++
++/*
++ * Structure dump_mbank[]:
++ *
++ * For CONFIG_DISCONTIGMEM systems this array specifies the
++ * memory banks/chunks that need to be dumped after a panic.
++ *
++ * For classic systems it specifies a single set of pages from
++ * 0 to max_mapnr.
++ */
++struct __dump_mbank {
++	u64 	start;
++	u64 	end;
++	int	type;
++	int	pad1;
++	long	pad2;
++};
++
++#define DUMP_MBANK_TYPE_CONVENTIONAL_MEMORY		1
++#define DUMP_MBANK_TYPE_OTHER				2
++
++#define MAXCHUNKS 256
++extern int dump_mbanks;
++extern struct __dump_mbank dump_mbank[MAXCHUNKS];
++
++/* notification event codes */
++#define DUMP_BEGIN		0x0001	/* dump beginning */
++#define DUMP_END		0x0002	/* dump ending */
++
++/* Scheduler soft spin control.
++ *
++ * 0 - no dump in progress
++ * 1 - cpu0 is dumping, ...
++ */
++extern unsigned long dump_oncpu;
++extern void dump_execute(const char *, const struct pt_regs *);
++
++/*
++ *	Notifier list for kernel code which wants to be called
++ *	at kernel dump. 
++ */
++extern struct notifier_block *dump_notifier_list;
++static inline int register_dump_notifier(struct notifier_block *nb)
++{
++	return notifier_chain_register(&dump_notifier_list, nb);
++}
++static inline int unregister_dump_notifier(struct notifier_block * nb)
++{
++	return notifier_chain_unregister(&dump_notifier_list, nb);
++}
++
++extern void (*dump_function_ptr)(const char *, const struct pt_regs *);
++static inline void dump(char * str, struct pt_regs * regs)
++{
++	if (dump_function_ptr)
++		dump_function_ptr(str, regs);
++}
++
++/*
++ * Common Arch Specific Functions should be declared here.
++ * This allows the C compiler to detect discrepancies.
++ */
++extern void	__dump_open(void);
++extern void	__dump_cleanup(void);
++extern void	__dump_init(u64);
++extern void	__dump_save_regs(struct pt_regs *, const struct pt_regs *);
++extern int	__dump_configure_header(const struct pt_regs *);
++extern void	__dump_irq_enable(void);
++extern void	__dump_irq_restore(void);
++extern int	__dump_page_valid(unsigned long index);
++#ifdef CONFIG_SMP
++extern void 	__dump_save_other_cpus(void);
++#else
++#define 	__dump_save_other_cpus()
++#endif
++
++/* to track all used (compound + zero order) pages */
++#define PageInuse(p)   (PageCompound(p) || page_count(p))
++
++#endif /* __KERNEL__ */
++
++#else	/* !CONFIG_CRASH_DUMP */
++
++/* If not configured then make code disappear! */
++#define register_dump_watchdog(x) 	do { } while(0)
++#define unregister_dump_watchdog(x) 	do { } while(0)
++#define register_dump_notifier(x)	do { } while(0)
++#define unregister_dump_notifier(x)	do { } while(0)
++#define dump_in_progress() 		0
++#define dump(x, y)			do { } while(0)
++
++#endif	/* !CONFIG_CRASH_DUMP */
++
++#endif /* _DUMP_H */
+--- linux-2.5.69/include/linux/dump_netdev.h.lkcdbase	Mon Jun  2 17:29:01 2003
++++ linux-2.5.69/include/linux/dump_netdev.h	Mon Jun  2 17:31:01 2003
+@@ -0,0 +1,80 @@
++/*
++ *  linux/drivers/net/netconsole.h
++ *
++ *  Copyright (C) 2001  Ingo Molnar <mingo@redhat.com>
++ *
++ *  This file contains the implementation of an IRQ-safe, crash-safe
++ *  kernel console implementation that outputs kernel messages to the
++ *  network.
++ *
++ * Modification history:
++ *
++ * 2001-09-17    started by Ingo Molnar.
++ */
++
++/****************************************************************
++ *      This program is free software; you can redistribute it and/or modify
++ *      it under the terms of the GNU General Public License as published by
++ *      the Free Software Foundation; either version 2, or (at your option)
++ *      any later version.
++ *
++ *      This program is distributed in the hope that it will be useful,
++ *      but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *      GNU General Public License for more details.
++ *
++ *      You should have received a copy of the GNU General Public License
++ *      along with this program; if not, write to the Free Software
++ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ ****************************************************************/
++
++#define NETCONSOLE_VERSION 0x03
++
++enum netdump_commands {
++	COMM_NONE = 0,
++	COMM_SEND_MEM = 1,
++	COMM_EXIT = 2,
++	COMM_REBOOT = 3,
++	COMM_HELLO = 4,
++	COMM_GET_NR_PAGES = 5,
++	COMM_GET_PAGE_SIZE = 6,
++	COMM_START_NETDUMP_ACK = 7,
++	COMM_GET_REGS = 8,
++	COMM_GET_MAGIC = 9,
++	COMM_START_WRITE_NETDUMP_ACK = 10,
++};
++
++typedef struct netdump_req_s {
++	u64 magic;
++	u32 nr;
++	u32 command;
++	u32 from;
++	u32 to;
++} req_t;
++
++enum netdump_replies {
++	REPLY_NONE = 0,
++	REPLY_ERROR = 1,
++	REPLY_LOG = 2,
++	REPLY_MEM = 3,
++	REPLY_RESERVED = 4,
++	REPLY_HELLO = 5,
++	REPLY_NR_PAGES = 6,
++	REPLY_PAGE_SIZE = 7,
++	REPLY_START_NETDUMP = 8,
++	REPLY_END_NETDUMP = 9,
++	REPLY_REGS = 10,
++	REPLY_MAGIC = 11,
++	REPLY_START_WRITE_NETDUMP = 12,
++};
++
++typedef struct netdump_reply_s {
++	u32 nr;
++	u32 code;
++	u32 info;
++} reply_t;
++
++#define HEADER_LEN (1 + sizeof(reply_t))
++
++
+--- linux-2.5.69/include/asm-i386/dump.h.lkcdbase	Mon Jun  2 17:28:47 2003
++++ linux-2.5.69/include/asm-i386/dump.h	Mon Jun  2 17:31:10 2003
+@@ -0,0 +1,93 @@
++/*
++ * Kernel header file for Linux crash dumps.
++ *
++ * Created by: Matt Robinson (yakker@sgi.com)
++ *
++ * Copyright 1999 Silicon Graphics, Inc. All rights reserved.
++ *
++ * This code is released under version 2 of the GNU GPL.
++ */
++
++/* This header file holds the architecture specific crash dump header */
++#ifndef _ASM_DUMP_H
++#define _ASM_DUMP_H
++
++/* necessary header files */
++#include <asm/ptrace.h>
++#include <asm/page.h>
++#include <linux/threads.h>
++#include <linux/mm.h>
++
++/* definitions */
++#define DUMP_ASM_MAGIC_NUMBER	0xdeaddeadULL	/* magic number            */
++#define DUMP_ASM_VERSION_NUMBER	0x3	/* version number          */
++
++/* max number of cpus */
++#define DUMP_MAX_NUM_CPUS 32
++
++/*
++ * Structure: __dump_header_asm
++ *  Function: This is the header for architecture-specific stuff.  It
++ *            follows right after the dump header.
++ */
++struct __dump_header_asm {
++	/* the dump magic number -- unique to verify dump is valid */
++	u64		dha_magic_number;
++
++	/* the version number of this dump */
++	u32		dha_version;
++
++	/* the size of this header (in case we can't read it) */
++	u32		dha_header_size;
++
++	/* the esp for i386 systems */
++	u32		dha_esp;
++
++	/* the eip for i386 systems */
++	u32		dha_eip;
++
++	/* the dump registers */
++	struct pt_regs	dha_regs;
++
++	/* smp specific */
++	u32		dha_smp_num_cpus;
++	u32		dha_dumping_cpu;
++	struct pt_regs	dha_smp_regs[DUMP_MAX_NUM_CPUS];
++	u32		dha_smp_current_task[DUMP_MAX_NUM_CPUS];
++	u32		dha_stack[DUMP_MAX_NUM_CPUS];
++	u32		dha_stack_ptr[DUMP_MAX_NUM_CPUS];
++} __attribute__((packed));
++
++#ifdef __KERNEL__
++
++extern struct __dump_header_asm dump_header_asm;
++
++#ifdef CONFIG_SMP
++extern unsigned long irq_affinity[];
++extern int (*dump_ipi_function_ptr)(struct pt_regs *);
++extern void dump_send_ipi(void);
++#else
++#define dump_send_ipi() do { } while(0)
++#endif
++
++static inline void get_current_regs(struct pt_regs *regs)
++{
++	__asm__ __volatile__("movl %%ebx,%0" : "=m"(regs->ebx));
++	__asm__ __volatile__("movl %%ecx,%0" : "=m"(regs->ecx));
++	__asm__ __volatile__("movl %%edx,%0" : "=m"(regs->edx));
++	__asm__ __volatile__("movl %%esi,%0" : "=m"(regs->esi));
++	__asm__ __volatile__("movl %%edi,%0" : "=m"(regs->edi));
++	__asm__ __volatile__("movl %%ebp,%0" : "=m"(regs->ebp));
++	__asm__ __volatile__("movl %%eax,%0" : "=m"(regs->eax));
++	__asm__ __volatile__("movl %%esp,%0" : "=m"(regs->esp));
++	__asm__ __volatile__("movw %%ss, %%ax;" :"=a"(regs->xss));
++	__asm__ __volatile__("movw %%cs, %%ax;" :"=a"(regs->xcs));
++	__asm__ __volatile__("movw %%ds, %%ax;" :"=a"(regs->xds));
++	__asm__ __volatile__("movw %%es, %%ax;" :"=a"(regs->xes));
++	__asm__ __volatile__("pushfl; popl %0" :"=m"(regs->eflags));
++	regs->eip = (unsigned long)current_text_addr();
++}
++
++#endif /* __KERNEL__ */
++
++#endif /* _ASM_DUMP_H */
+--- linux-2.5.69/init/kerntypes.c.lkcdbase	Mon Jun  2 17:29:10 2003
++++ linux-2.5.69/init/kerntypes.c	Mon Jun  2 17:29:06 2003
+@@ -0,0 +1,31 @@
++/*
++ * kerntypes.c
++ *
++ * Copyright (C) 2000 Tom Morano (tjm@sgi.com) and
++ *                    Matt D. Robinson (yakker@alacritech.com)
++ *
++ * Dummy module that includes headers for all kernel types of interest. 
++ * The kernel type information is used by the lcrash utility when 
++ * analyzing system crash dumps or the live system. Using the type 
++ * information for the running system, rather than kernel header files,
++ * makes for a more flexible and robust analysis tool.
++ *
++ * This source code is released under version 2 of the GNU GPL.
++ */
++
++#include <linux/compile.h>
++#include <linux/module.h>
++#include <linux/mm.h>
++#include <linux/config.h>
++#include <linux/utsname.h>
++#include <linux/dump.h>
++
++#ifdef LINUX_COMPILE_VERSION_ID_TYPE
++/* Define version type for version validation of dump and kerntypes */
++LINUX_COMPILE_VERSION_ID_TYPE;
++#endif
++
++void
++kerntypes_dummy(void)
++{
++}
+--- linux-2.5.69/drivers/dump/dump_methods.h.lkcdbase	Mon Jun  2 17:56:12 2003
++++ linux-2.5.69/drivers/dump/dump_methods.h	Mon Jun  2 17:55:51 2003
+@@ -0,0 +1,348 @@
++/*
++ * Generic interfaces for flexible system dump 
++ *
++ * Started: Oct 2002 -  Suparna Bhattacharya (suparna@in.ibm.com)
++ *
++ * Copyright (C) 2002 International Business Machines Corp. 
++ *
++ * This code is released under version 2 of the GNU GPL.
++ */
++
++#ifndef _LINUX_DUMP_METHODS_H
++#define _LINUX_DUMP_METHODS_H
++
++/*
++ * Inspired by Matt Robinson's suggestion of introducing dump 
++ * methods as a way to enable different crash dump facilities to 
++ * coexist where each employs its own scheme or dumping policy.
++ *
++ * The code here creates a framework for flexible dump by defining 
++ * a set of methods and providing associated helpers that differentiate
++ * between the underlying mechanism (how to dump), overall scheme 
++ * (sequencing of stages and data dumped and associated quiescing), 
++ * output format (what the dump output looks like), target type 
++ * (where to save the dump; see dumpdev.h), and selection policy 
++ * (state/data to dump).
++ * 
++ * These sets of interfaces can be mixed and matched to build a 
++ * dumper suitable for a given situation, allowing for 
++ * flexibility as well appropriate degree of code reuse.
++ * For example all features and options of lkcd (including
++ * granular selective dumping in the near future) should be
++ * available even when say, the 2 stage soft-boot based mechanism 
++ * is used for taking disruptive dumps.
++ *
++ * Todo: Additionally modules or drivers may supply their own
++ * custom dumpers which extend dump with module specific
++ * information or hardware state, and can even tweak the
++ * mechanism when it comes to saving state relevant to
++ * them.
++ */
++
++#include <linux/sched.h>
++#include <linux/slab.h>
++#include <linux/highmem.h>
++#include <linux/dumpdev.h>
++
++#define MAX_PASSES 	6
++#define MAX_DEVS	4
++
++
++/* To customise selection of pages to be dumped in a given pass/group */
++struct dump_data_filter{
++	char name[32];
++	int (*selector)(int, unsigned long, unsigned long);
++	ulong level_mask; /* dump level(s) for which this filter applies */
++	loff_t start, end; /* location range applicable */
++};
++
++
++/* 
++ * Determined by the kind of dump mechanism and appropriate 
++ * overall scheme 
++ */ 
++struct dump_scheme_ops {
++	/* sets aside memory, inits data structures etc */
++	int (*configure)(unsigned long devid); 
++	/* releases  resources */
++	int (*unconfigure)(void); 
++
++	/* ordering of passes, invoking iterator */
++	int (*sequencer)(void); 
++        /* iterates over system data, selects and acts on data to dump */
++	int (*iterator)(int, int (*)(unsigned long, unsigned long), 
++		struct dump_data_filter *); 
++        /* action when data is selected for dump */
++	int (*save_data)(unsigned long, unsigned long); 
++        /* action when data is to be excluded from dump */
++	int (*skip_data)(unsigned long, unsigned long); 
++	/* policies for space, multiple dump devices etc */
++	int (*write_buffer)(void *, unsigned long); 
++};
++
++struct dump_scheme {
++	/* the name serves as an anchor to locate the scheme after reboot */
++	char name[32]; 
++	struct dump_scheme_ops *ops;
++	struct list_head list;
++};
++
++/* Quiescing/Silence levels (controls IPI callback behaviour) */
++extern enum dump_silence_levels {
++	DUMP_SOFT_SPIN_CPUS	= 1,
++	DUMP_HARD_SPIN_CPUS	= 2,
++	DUMP_HALT_CPUS		= 3,
++} dump_silence_level;
++
++/* determined by the dump (file) format */
++struct dump_fmt_ops {
++	/* build header */
++	int (*configure_header)(const char *, const struct pt_regs *); 
++	int (*update_header)(void); /* update header and write it out */
++	/* save curr context  */
++	void (*save_context)(int, const struct pt_regs *, 
++		struct task_struct *); 
++	/* typically called by the save_data action */
++	/* add formatted data to the dump buffer */
++	int (*add_data)(unsigned long, unsigned long); 
++	int (*update_end_marker)(void);
++};
++
++struct dump_fmt {
++	unsigned long magic; 
++	char name[32];  /* lcrash, crash, elf-core etc */
++	struct dump_fmt_ops *ops;
++	struct list_head list;
++};
++
++/* 
++ * Modules will be able add their own data capture schemes by 
++ * registering their own dumpers. Typically they would use the 
++ * primary dumper as a template and tune it with their routines.
++ * Still Todo.
++ */
++
++/* The combined dumper profile (mechanism, scheme, dev, fmt) */
++struct dumper {
++	char name[32]; /* singlestage, overlay (stg1), passthru(stg2), pull */
++	struct dump_scheme *scheme;
++	struct dump_fmt *fmt;
++	struct __dump_compress *compress;
++	struct dump_data_filter *filter;
++	struct dump_dev *dev; 
++	/* state valid only for active dumper(s) - per instance */
++	/* run time state/context */
++	int curr_pass;
++	unsigned long count;
++	loff_t curr_offset; /* current logical offset into dump device */
++	loff_t curr_loc; /* current memory location */
++	void *curr_buf; /* current position in the dump buffer */
++	void *dump_buf; /* starting addr of dump buffer */
++	int header_dirty; /* whether the header needs to be written out */
++	int header_len; 
++	struct list_head dumper_list; /* links to other dumpers */
++};	
++
++/* Starting point to get to the current configured state */
++struct dump_config {
++	ulong level;
++	ulong flags;
++	struct dumper *dumper;
++	unsigned long dump_device;
++	unsigned long dump_addr; /* relevant only for in-memory dumps */
++	struct list_head dump_dev_list;
++};	
++
++extern struct dump_config dump_config;
++
++/* Used to save the dump config across a reboot for 2-stage dumps: 
++ * 
++ * Note: The scheme, format, compression and device type should be 
++ * registered at bootup, for this config to be sharable across soft-boot. 
++ * The function addresses could have changed and become invalid, and
++ * need to be set up again.
++ */
++struct dump_config_block {
++	u64 magic; /* for a quick sanity check after reboot */
++	struct dump_memdev memdev; /* handle to dump stored in memory */
++	struct dump_config config;
++	struct dumper dumper;
++	struct dump_scheme scheme;
++	struct dump_fmt fmt;
++	struct __dump_compress compress;
++	struct dump_data_filter filter_table[MAX_PASSES];
++	struct dump_anydev dev[MAX_DEVS]; /* target dump device */
++};
++
++
++/* Wrappers that invoke the methods for the current (active) dumper */
++
++/* Scheme operations */
++
++static inline int dump_sequencer(void)
++{
++	return dump_config.dumper->scheme->ops->sequencer();
++}
++
++static inline int dump_iterator(int pass, int (*action)(unsigned long, 
++	unsigned long), struct dump_data_filter *filter)
++{
++	return dump_config.dumper->scheme->ops->iterator(pass, action, filter);
++}
++
++#define dump_save_data dump_config.dumper->scheme->ops->save_data
++#define dump_skip_data dump_config.dumper->scheme->ops->skip_data
++
++static inline int dump_write_buffer(void *buf, unsigned long len)
++{
++	return dump_config.dumper->scheme->ops->write_buffer(buf, len);
++}
++
++static inline int dump_configure(unsigned long devid)
++{
++	return dump_config.dumper->scheme->ops->configure(devid);
++}
++
++static inline int dump_unconfigure(void)
++{
++	return dump_config.dumper->scheme->ops->unconfigure();
++}
++
++/* Format operations */
++
++static inline int dump_configure_header(const char *panic_str, 
++	const struct pt_regs *regs)
++{
++	return dump_config.dumper->fmt->ops->configure_header(panic_str, regs);
++}
++
++static inline void dump_save_context(int cpu, const struct pt_regs *regs, 
++		struct task_struct *tsk)
++{
++	dump_config.dumper->fmt->ops->save_context(cpu, regs, tsk);
++}
++
++static inline int dump_save_this_cpu(const struct pt_regs *regs)
++{
++	int cpu = smp_processor_id();
++
++	dump_save_context(cpu, regs, current);
++	return 1;
++}
++
++static inline int dump_update_header(void)
++{
++	return dump_config.dumper->fmt->ops->update_header();
++}
++
++static inline int dump_update_end_marker(void)
++{
++	return dump_config.dumper->fmt->ops->update_end_marker();
++}
++
++static inline int dump_add_data(unsigned long loc, unsigned long sz)
++{
++	return dump_config.dumper->fmt->ops->add_data(loc, sz);
++}
++
++/* Compression operation */
++static inline int dump_compress_data(char *src, int slen, char *dst)
++{
++	return dump_config.dumper->compress->compress_func(src, slen, 
++		dst, DUMP_DPC_PAGE_SIZE);
++}
++
++
++/* Prototypes of some default implementations of dump methods */
++
++extern struct __dump_compress dump_none_compression;
++
++/* Default scheme methods (dump_scheme.c) */
++
++extern int dump_generic_sequencer(void);
++extern int dump_page_iterator(int pass, int (*action)(unsigned long, unsigned
++	long), struct dump_data_filter *filter);
++extern int dump_generic_save_data(unsigned long loc, unsigned long sz);
++extern int dump_generic_skip_data(unsigned long loc, unsigned long sz);
++extern int dump_generic_write_buffer(void *buf, unsigned long len);
++extern int dump_generic_configure(unsigned long);
++extern int dump_generic_unconfigure(void);
++
++/* Default scheme template */
++extern struct dump_scheme dump_scheme_singlestage;
++
++/* Default dump format methods */
++
++extern int dump_lcrash_configure_header(const char *panic_str, 
++	const struct pt_regs *regs);
++extern void dump_lcrash_save_context(int  cpu, const struct pt_regs *regs, 
++	struct task_struct *tsk);
++extern int dump_generic_update_header(void);
++extern int dump_lcrash_add_data(unsigned long loc, unsigned long sz);
++extern int dump_lcrash_update_end_marker(void);
++
++/* Default format (lcrash) template */
++extern struct dump_fmt dump_fmt_lcrash;
++
++/* Default dump selection filter table */
++
++/* 
++ * Entries listed in order of importance and correspond to passes
++ * The last entry (with a level_mask of zero) typically reflects data that 
++ * won't be dumped  -- this may for example be used to identify data 
++ * that will be skipped for certain so the corresponding memory areas can be 
++ * utilized as scratch space.
++ */   
++extern struct dump_data_filter dump_filter_table[];
++
++/* Some pre-defined dumpers */
++extern struct dumper dumper_singlestage;
++extern struct dumper dumper_stage1;
++extern struct dumper dumper_stage2;
++
++/* These are temporary */
++#define DUMP_MASK_HEADER	DUMP_LEVEL_HEADER
++#define DUMP_MASK_KERN		DUMP_LEVEL_KERN
++#define DUMP_MASK_USED		DUMP_LEVEL_USED
++#define DUMP_MASK_UNUSED	DUMP_LEVEL_ALL_RAM
++#define DUMP_MASK_REST		0 /* dummy for now */
++
++/* Helpers - move these to dump.h later ? */
++
++int dump_generic_execute(const char *panic_str, const struct pt_regs *regs);
++extern int dump_ll_write(void *buf, unsigned long len); 
++int dump_check_and_free_page(struct dump_memdev *dev, struct page *page);
++
++static inline void dumper_reset(void)
++{
++	dump_config.dumper->curr_buf = dump_config.dumper->dump_buf;
++	dump_config.dumper->curr_loc = 0;
++	dump_config.dumper->curr_offset = 0;
++	dump_config.dumper->count = 0;
++	dump_config.dumper->curr_pass = 0;
++}
++
++/* 
++ * May later be moulded to perform boot-time allocations so we can dump 
++ * earlier during bootup 
++ */
++static inline void *dump_alloc_mem(unsigned long size)
++{
++	return kmalloc(size, GFP_KERNEL);
++}
++
++static inline void dump_free_mem(void *buf)
++{
++	struct page *page;
++
++	/* ignore reserved pages (e.g. post soft boot stage) */
++	if (buf && (page = virt_to_page(buf))) {
++		if (PageReserved(page))
++			return;
++	}
++
++	kfree(buf);
++}
++
++
++#endif /*  _LINUX_DUMP_METHODS_H */
diff --git a/lustre/kernel_patches/patches/lkcd-kernel-changes-2.5.73.patch b/lustre/kernel_patches/patches/lkcd-kernel-changes-2.5.73.patch
new file mode 100644
index 0000000000..ebe09e893c
--- /dev/null
+++ b/lustre/kernel_patches/patches/lkcd-kernel-changes-2.5.73.patch
@@ -0,0 +1,608 @@
+
+
+
+ arch/i386/Kconfig                           |   50 ++++++++++++++++++++++++++++
+ arch/i386/boot/Makefile                     |    1 
+ arch/i386/kernel/i386_ksyms.c               |   19 ++++++++++
+ arch/i386/kernel/nmi.c                      |    2 +
+ arch/i386/kernel/setup.c                    |   10 +++++
+ arch/i386/kernel/smp.c                      |   16 +++++++-
+ arch/i386/kernel/traps.c                    |    2 +
+ arch/i386/mm/init.c                         |    6 +++
+ arch/s390/boot/Makefile                     |    2 -
+ arch/s390/boot/install.sh                   |   24 +++++++++----
+ drivers/Makefile                            |    1 
+ include/asm-i386/kmap_types.h               |    3 +
+ include/asm-i386/mach-default/irq_vectors.h |    1 
+ include/asm-i386/smp.h                      |    1 
+ include/linux/major.h                       |    2 +
+ include/linux/sysctl.h                      |    2 +
+ init/Makefile                               |    4 ++
+ init/main.c                                 |   10 +++++
+ init/version.c                              |    4 ++
+ kernel/ksyms.c                              |    8 ++++
+ kernel/panic.c                              |   17 +++++++++
+ kernel/sched.c                              |   22 ++++++++++++
+ lib/Kconfig                                 |   10 +++--
+ mm/page_alloc.c                             |    3 +
+ scripts/mkcompile_h                         |    4 +-
+ 25 files changed, 207 insertions(+), 17 deletions(-)
+
+--- linux-2.5.73/drivers/Makefile~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:33:08 2003
++++ linux-2.5.73-n9560/drivers/Makefile	Mon Jun 30 14:56:26 2003
+@@ -50,3 +50,4 @@ obj-$(CONFIG_ISDN_BOOL)		+= isdn/
+ obj-$(CONFIG_MCA)		+= mca/
+ obj-$(CONFIG_EISA)		+= eisa/
+ obj-$(CONFIG_CPU_FREQ)		+= cpufreq/
++obj-$(CONFIG_CRASH_DUMP)	+= dump/
+--- linux-2.5.73/include/linux/major.h~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:32:37 2003
++++ linux-2.5.73-n9560/include/linux/major.h	Mon Jun 30 14:56:26 2003
+@@ -157,6 +157,8 @@
+ 
+ #define OSST_MAJOR		206	/* OnStream-SCx0 SCSI tape */
+ 
++#define CRASH_DUMP_MAJOR	221	/* crash dump interface */
++
+ #define IBM_TTY3270_MAJOR	227
+ #define IBM_FS3270_MAJOR	228
+ 
+--- linux-2.5.73/include/linux/sysctl.h~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:32:55 2003
++++ linux-2.5.73-n9560/include/linux/sysctl.h	Mon Jun 30 14:56:26 2003
+@@ -130,6 +130,8 @@ enum
+ 	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 */
++
++	KERN_DUMP=60,		/* directory: dump parameters */
+ };
+ 
+ 
+--- linux-2.5.73/include/asm-i386/mach-default/irq_vectors.h~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:32:38 2003
++++ linux-2.5.73-n9560/include/asm-i386/mach-default/irq_vectors.h	Mon Jun 30 14:56:26 2003
+@@ -48,6 +48,7 @@
+ #define INVALIDATE_TLB_VECTOR	0xfd
+ #define RESCHEDULE_VECTOR	0xfc
+ #define CALL_FUNCTION_VECTOR	0xfb
++#define DUMP_VECTOR		0xfa
+ 
+ #define THERMAL_APIC_VECTOR	0xf0
+ /*
+--- linux-2.5.73/include/asm-i386/kmap_types.h~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:33:01 2003
++++ linux-2.5.73-n9560/include/asm-i386/kmap_types.h	Mon Jun 30 14:56:26 2003
+@@ -24,7 +24,8 @@ D(10)	KM_IRQ0,
+ D(11)	KM_IRQ1,
+ D(12)	KM_SOFTIRQ0,
+ D(13)	KM_SOFTIRQ1,
+-D(14)	KM_TYPE_NR
++D(14)	KM_TYPE_NR,
++D(15)	KM_DUMP
+ };
+ 
+ #undef D
+--- linux-2.5.73/include/asm-i386/smp.h~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:32:56 2003
++++ linux-2.5.73-n9560/include/asm-i386/smp.h	Mon Jun 30 14:56:26 2003
+@@ -39,6 +39,7 @@ extern int smp_num_siblings;
+ extern int cpu_sibling_map[];
+ 
+ extern void smp_flush_tlb(void);
++extern void dump_send_ipi(void);
+ extern void smp_message_irq(int cpl, void *dev_id, struct pt_regs *regs);
+ extern void smp_send_reschedule(int cpu);
+ extern void smp_invalidate_rcv(void);		/* Process an NMI */
+--- linux-2.5.73/arch/i386/kernel/i386_ksyms.c~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:33:35 2003
++++ linux-2.5.73-n9560/arch/i386/kernel/i386_ksyms.c	Mon Jun 30 14:56:26 2003
+@@ -16,6 +16,7 @@
+ #include <linux/tty.h>
+ #include <linux/highmem.h>
+ #include <linux/time.h>
++#include <linux/nmi.h>
+ 
+ #include <asm/semaphore.h>
+ #include <asm/processor.h>
+@@ -33,6 +34,7 @@
+ #include <asm/tlbflush.h>
+ #include <asm/nmi.h>
+ #include <asm/edd.h>
++#include <asm/e820.h>
+ 
+ extern void dump_thread(struct pt_regs *, struct user *);
+ extern spinlock_t rtc_lock;
+@@ -208,3 +210,20 @@ EXPORT_SYMBOL(kmap_atomic_to_page);
+ EXPORT_SYMBOL(edd);
+ EXPORT_SYMBOL(eddnr);
+ #endif
++
++#ifdef CONFIG_CRASH_DUMP_MODULE
++#ifdef CONFIG_SMP
++extern irq_desc_t irq_desc[NR_IRQS];
++extern unsigned long irq_affinity[NR_IRQS];
++extern void stop_this_cpu(void *);
++EXPORT_SYMBOL(irq_desc);
++EXPORT_SYMBOL(irq_affinity);
++EXPORT_SYMBOL(stop_this_cpu);
++EXPORT_SYMBOL(dump_send_ipi);
++#endif
++extern int pfn_is_ram(unsigned long);
++EXPORT_SYMBOL(pfn_is_ram);
++#ifdef ARCH_HAS_NMI_WATCHDOG
++EXPORT_SYMBOL(touch_nmi_watchdog);
++#endif
++#endif
+--- linux-2.5.73/arch/i386/kernel/nmi.c~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:32:55 2003
++++ linux-2.5.73-n9560/arch/i386/kernel/nmi.c	Mon Jun 30 14:56:26 2003
+@@ -24,6 +24,7 @@
+ #include <linux/kernel_stat.h>
+ #include <linux/module.h>
+ #include <linux/nmi.h>
++#include <linux/dump.h>
+ #include <linux/sysdev.h>
+ 
+ #include <asm/smp.h>
+@@ -426,6 +427,7 @@ void nmi_watchdog_tick (struct pt_regs *
+ 			bust_spinlocks(1);
+ 			printk("NMI Watchdog detected LOCKUP on CPU%d, eip %08lx, registers:\n", cpu, regs->eip);
+ 			show_registers(regs);
++			dump("NMI Watchdog detected LOCKUP", regs);
+ 			printk("console shuts up ...\n");
+ 			console_silent();
+ 			spin_unlock(&nmi_print_lock);
+--- linux-2.5.73/arch/i386/kernel/setup.c~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:32:44 2003
++++ linux-2.5.73-n9560/arch/i386/kernel/setup.c	Mon Jun 30 14:56:26 2003
+@@ -438,6 +438,7 @@ static void __init setup_memory_region(v
+ 	print_memory_map(who);
+ } /* setup_memory_region */
+ 
++unsigned long crashdump_addr = 0xdeadbeef;
+ 
+ static void __init parse_cmdline_early (char ** cmdline_p)
+ {
+@@ -531,6 +532,9 @@ static void __init parse_cmdline_early (
+ 		if (c == ' ' && !memcmp(from, "highmem=", 8))
+ 			highmem_pages = memparse(from+8, &from) >> PAGE_SHIFT;
+ 	
++		if (c == ' ' && !memcmp(from, "crashdump=", 10))
++			crashdump_addr = memparse(from+10, &from); 
++			
+ 		c = *(from++);
+ 		if (!c)
+ 			break;
+@@ -913,6 +917,8 @@ static int __init noreplacement_setup(ch
+ 
+ __setup("noreplacement", noreplacement_setup); 
+ 
++extern void crashdump_reserve(void);
++
+ void __init setup_arch(char **cmdline_p)
+ {
+ 	unsigned long max_low_pfn;
+@@ -977,6 +983,10 @@ void __init setup_arch(char **cmdline_p)
+ 	generic_apic_probe(*cmdline_p);
+ #endif	
+ 
++#ifdef CONFIG_CRASH_DUMP_SOFTBOOT
++	crashdump_reserve(); /* Preserve crash dump state from prev boot */
++#endif
++
+ #ifdef CONFIG_ACPI_BOOT
+ 	/*
+ 	 * Parse the ACPI tables for possible boot-time SMP configuration.
+--- linux-2.5.73/arch/i386/kernel/smp.c~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:32:32 2003
++++ linux-2.5.73-n9560/arch/i386/kernel/smp.c	Mon Jun 30 16:01:58 2003
+@@ -19,6 +19,7 @@
+ #include <linux/mc146818rtc.h>
+ #include <linux/cache.h>
+ #include <linux/interrupt.h>
++#include <linux/dump.h>
+ 
+ #include <asm/mtrr.h>
+ #include <asm/pgalloc.h>
+@@ -144,6 +145,13 @@ inline void __send_IPI_shortcut(unsigned
+ 	 */
+ 	cfg = __prepare_ICR(shortcut, vector);
+ 
++	if (vector == DUMP_VECTOR) {
++		/*
++		 * Setup DUMP IPI to be delivered as an NMI
++		 */
++		cfg = (cfg&~APIC_VECTOR_MASK)|APIC_DM_NMI;
++	}
++
+ 	/*
+ 	 * Send the IPI. The write to APIC_ICR fires this off.
+ 	 */
+@@ -450,6 +458,11 @@ void flush_tlb_all(void)
+ 	on_each_cpu(do_flush_tlb_all, 0, 1, 1);
+ }
+ 
++void dump_send_ipi(void)
++{
++	send_IPI_allbutself(DUMP_VECTOR);
++}
++
+ /*
+  * this function sends a 'reschedule' IPI to another CPU.
+  * it goes straight through and wastes no time serializing
+@@ -528,7 +541,7 @@ int smp_call_function (void (*func) (voi
+ 	return 0;
+ }
+ 
+-static void stop_this_cpu (void * dummy)
++void stop_this_cpu (void * dummy)
+ {
+ 	/*
+ 	 * Remove this CPU:
+@@ -589,4 +602,3 @@ asmlinkage void smp_call_function_interr
+ 		atomic_inc(&call_data->finished);
+ 	}
+ }
+-
+--- linux-2.5.73/arch/i386/kernel/traps.c~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:32:35 2003
++++ linux-2.5.73-n9560/arch/i386/kernel/traps.c	Mon Jun 30 14:56:26 2003
+@@ -25,6 +25,7 @@
+ #include <linux/highmem.h>
+ #include <linux/kallsyms.h>
+ #include <linux/ptrace.h>
++#include <linux/dump.h>
+ 
+ #ifdef CONFIG_EISA
+ #include <linux/ioport.h>
+@@ -258,6 +259,7 @@ void die(const char * str, struct pt_reg
+ 	handle_BUG(regs);
+ 	printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
+ 	show_registers(regs);
++	dump((char *)str, regs);
+ 	bust_spinlocks(0);
+ 	spin_unlock_irq(&die_lock);
+ 	if (in_interrupt())
+--- linux-2.5.73/arch/i386/mm/init.c~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:33:06 2003
++++ linux-2.5.73-n9560/arch/i386/mm/init.c	Mon Jun 30 14:56:26 2003
+@@ -189,6 +189,12 @@ static inline int page_is_ram(unsigned l
+ 	return 0;
+ }
+ 
++/* To enable modules to check if a page is in RAM */
++int pfn_is_ram(unsigned long pfn)
++{
++	return (page_is_ram(pfn));
++}
++
+ #ifdef CONFIG_HIGHMEM
+ pte_t *kmap_pte;
+ pgprot_t kmap_prot;
+--- linux-2.5.73/arch/i386/boot/Makefile~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:32:42 2003
++++ linux-2.5.73-n9560/arch/i386/boot/Makefile	Mon Jun 30 14:56:26 2003
+@@ -101,3 +101,4 @@ zlilo: $(BOOTIMAGE)
+ 
+ install: $(BOOTIMAGE)
+ 	sh $(src)/install.sh $(KERNELRELEASE) $(BOOTIMAGE) System.map "$(INSTALL_PATH)"
++	if [ -f init/kerntypes.o ]; then cp init/kerntypes.o $(INSTALL_PATH)/Kerntypes; fi
+--- linux-2.5.73/arch/i386/Kconfig~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:32:34 2003
++++ linux-2.5.73-n9560/arch/i386/Kconfig	Mon Jun 30 14:56:26 2003
+@@ -1347,6 +1347,56 @@ source "arch/i386/oprofile/Kconfig"
+ 
+ menu "Kernel hacking"
+ 
++config CRASH_DUMP
++	tristate "Crash dump support (EXPERIMENTAL)"
++	depends on EXPERIMENTAL
++	default n
++	---help---
++	  Say Y here to enable saving an image of system memory when a panic
++	  or other error occurs. Dumps can also be forced with the SysRq+d
++	  key if MAGIC_SYSRQ is enabled.
++
++config CRASH_DUMP_BLOCKDEV
++	tristate "Crash dump block device driver"
++	depends on CRASH_DUMP
++	help
++	  Say Y to allow saving crash dumps directly to a disk device.
++
++config CRASH_DUMP_NETDEV
++	tristate "Crash dump network device driver"
++	depends on CRASH_DUMP
++	help
++	  Say Y to allow saving crash dumps over a network device.
++
++config CRASH_DUMP_MEMDEV
++	bool "Crash dump staged memory driver"
++	depends on CRASH_DUMP
++	help
++	  Say Y to allow intermediate saving crash dumps in spare 
++	  memory pages which would then be written out to disk
++	  later.
++
++config CRASH_DUMP_SOFTBOOT
++	bool "Save crash dump across a soft reboot"
++	depends on CRASH_DUMP_MEMDEV
++	help
++	  Say Y to allow a crash dump to be preserved in memory
++	  pages across a soft reboot and written out to disk
++	  thereafter. For this to work, CRASH_DUMP must be 
++	  configured as part of the kernel (not as a module).
++
++config CRASH_DUMP_COMPRESS_RLE
++	tristate "Crash dump RLE compression"
++	depends on CRASH_DUMP
++	help
++	  Say Y to allow saving dumps with Run Length Encoding compression.
++
++config CRASH_DUMP_COMPRESS_GZIP
++	tristate "Crash dump GZIP compression"
++	depends on CRASH_DUMP
++	help
++	  Say Y to allow saving dumps with Gnu Zip compression.
++
+ config DEBUG_KERNEL
+ 	bool "Kernel debugging"
+ 	help
+--- linux-2.5.73/arch/s390/boot/Makefile~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:33:36 2003
++++ linux-2.5.73-n9560/arch/s390/boot/Makefile	Mon Jun 30 14:56:26 2003
+@@ -16,4 +16,4 @@ $(obj)/image: vmlinux FORCE
+ 
+ install: $(CONFIGURE) $(obj)/image
+ 	sh -x $(obj)/install.sh $(KERNELRELEASE) $(obj)/image \
+-	      System.map Kerntypes "$(INSTALL_PATH)"
++	      System.map init/kerntypes.o "$(INSTALL_PATH)"
+--- linux-2.5.73/arch/s390/boot/install.sh~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:32:57 2003
++++ linux-2.5.73-n9560/arch/s390/boot/install.sh	Mon Jun 30 14:56:26 2003
+@@ -16,7 +16,8 @@
+ #   $1 - kernel version
+ #   $2 - kernel image file
+ #   $3 - kernel map file
+-#   $4 - default install path (blank if root directory)
++#   $4 - kernel type file
++#   $5 - default install path (blank if root directory)
+ #
+ 
+ # User may have a custom install script
+@@ -26,13 +27,22 @@ if [ -x /sbin/installkernel ]; then exec
+ 
+ # Default install - same as make zlilo
+ 
+-if [ -f $4/vmlinuz ]; then
+-	mv $4/vmlinuz $4/vmlinuz.old
++if [ -f $5/vmlinuz ]; then
++	mv $5/vmlinuz $5/vmlinuz.old
+ fi
+ 
+-if [ -f $4/System.map ]; then
+-	mv $4/System.map $4/System.old
++if [ -f $5/System.map ]; then
++	mv $5/System.map $5/System.old
+ fi
+ 
+-cat $2 > $4/vmlinuz
+-cp $3 $4/System.map
++if [ -f $5/Kerntypes ]; then
++	mv $5/Kerntypes $5/Kerntypes.old
++fi
++
++cat $2 > $5/vmlinuz
++cp $3 $5/System.map
++
++# copy the kernel type file if it exists
++if [ -f $4 ]; then
++	cp $4 $5/Kerntypes
++fi
+--- linux-2.5.73/scripts/mkcompile_h~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:33:36 2003
++++ linux-2.5.73-n9560/scripts/mkcompile_h	Mon Jun 30 14:56:26 2003
+@@ -33,7 +33,7 @@ UTS_VERSION="$UTS_VERSION `LANG=C date`"
+ 
+ UTS_LEN=64
+ UTS_TRUNCATE="sed -e s/\(.\{1,$UTS_LEN\}\).*/\1/"
+-
++LINUX_COMPILE_VERSION_ID="__linux_compile_version_id__`hostname | tr -c '[0-9A-Za-z\n]' '__'`_`LANG=C date | tr -c '[0-9A-Za-z\n]' '_'`"
+ # Generate a temporary compile.h
+ 
+ ( echo /\* This file is auto generated, version $VERSION \*/
+@@ -55,6 +55,8 @@ UTS_TRUNCATE="sed -e s/\(.\{1,$UTS_LEN\}
+   fi
+ 
+   echo \#define LINUX_COMPILER \"`$CC -v 2>&1 | tail -1`\"
++  echo \#define LINUX_COMPILE_VERSION_ID $LINUX_COMPILE_VERSION_ID
++  echo \#define LINUX_COMPILE_VERSION_ID_TYPE typedef char* "$LINUX_COMPILE_VERSION_ID""_t"
+ ) > .tmpcompile
+ 
+ # Only replace the real compile.h if the new one is different,
+--- linux-2.5.73/kernel/ksyms.c~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:32:30 2003
++++ linux-2.5.73-n9560/kernel/ksyms.c	Mon Jun 30 14:56:26 2003
+@@ -59,6 +59,8 @@
+ #include <linux/backing-dev.h>
+ #include <linux/percpu_counter.h>
+ #include <asm/checksum.h>
++#include <linux/dump.h>
++#include <linux/bootmem.h>
+ 
+ #if defined(CONFIG_PROC_FS)
+ #include <linux/proc_fs.h>
+@@ -606,3 +608,9 @@ EXPORT_SYMBOL(ptrace_notify);
+ EXPORT_SYMBOL(console_printk);
+ 
+ EXPORT_SYMBOL(current_kernel_time);
++
++#ifdef CONFIG_CRASH_DUMP_MODULE
++EXPORT_SYMBOL(min_low_pfn);
++EXPORT_SYMBOL(dump_oncpu);
++EXPORT_SYMBOL(dump_function_ptr);
++#endif
+--- linux-2.5.73/kernel/panic.c~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:33:18 2003
++++ linux-2.5.73-n9560/kernel/panic.c	Mon Jun 30 14:56:26 2003
+@@ -16,12 +16,16 @@
+ #include <linux/init.h>
+ #include <linux/sysrq.h>
+ #include <linux/interrupt.h>
++#ifdef CONFIG_KEXEC
++#include <linux/kexec.h>
++#endif
+ 
+ asmlinkage void sys_sync(void);	/* it's really int */
+ 
+ int panic_timeout;
+ int panic_on_oops;
+ int tainted;
++void (*dump_function_ptr)(const char *, const struct pt_regs *) = 0;
+ 
+ struct notifier_block *panic_notifier_list;
+ 
+@@ -54,6 +58,7 @@ NORET_TYPE void panic(const char * fmt, 
+ 	va_start(args, fmt);
+ 	vsnprintf(buf, sizeof(buf), fmt, args);
+ 	va_end(args);
++
+ 	printk(KERN_EMERG "Kernel panic: %s\n",buf);
+ 	if (in_interrupt())
+ 		printk(KERN_EMERG "In interrupt handler - not syncing\n");
+@@ -76,6 +81,18 @@ NORET_TYPE void panic(const char * fmt, 
+ 		 * We can't use the "normal" timers since we just panicked..
+ 	 	 */
+ 		printk(KERN_EMERG "Rebooting in %d seconds..",panic_timeout);
++#ifdef CONFIG_KEXEC
++{
++		struct kimage *image;
++		image = xchg(&kexec_image, 0);
++		if (image) {
++			printk(KERN_EMERG "by starting a new kernel ..\n");
++			mdelay(panic_timeout*1000);
++			machine_kexec(image);
++		}
++}
++#endif
++
+ 		mdelay(panic_timeout*1000);
+ 		/*
+ 		 *	Should we run the reboot notifier. For the moment Im
+--- linux-2.5.73/kernel/sched.c~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:33:08 2003
++++ linux-2.5.73-n9560/kernel/sched.c	Mon Jun 30 14:56:26 2003
+@@ -40,6 +40,9 @@
+ #define cpu_to_node_mask(cpu) (cpu_online_map)
+ #endif
+ 
++/* used to soft spin in sched while dump is in progress */
++int dump_oncpu;
++
+ /*
+  * Convert user-nice values [ -20 ... 0 ... 19 ]
+  * to static priority [ MAX_RT_PRIO..MAX_PRIO-1 ],
+@@ -1249,6 +1252,15 @@ asmlinkage void schedule(void)
+ 	struct list_head *queue;
+ 	int idx;
+ 
++ 	/*
++	 * If crash dump is in progress, this other cpu's
++	 * need to wait until it completes.
++	 * NB: this code is optimized away for kernels without
++	 * dumping enabled.
++	 */
++	if (unlikely(dump_oncpu))
++		goto dump_scheduling_disabled;
++
+ 	/*
+ 	 * Test if we are atomic.  Since do_exit() needs to call into
+ 	 * schedule() atomically, we ignore that path for now.
+@@ -1336,6 +1348,16 @@ switch_tasks:
+ 	preempt_enable_no_resched();
+ 	if (test_thread_flag(TIF_NEED_RESCHED))
+ 		goto need_resched;
++
++	return;
++
++ dump_scheduling_disabled:
++	/* allow scheduling only if this is the dumping cpu */
++	if (dump_oncpu != smp_processor_id()+1) {
++		while (dump_oncpu)
++			cpu_relax();
++	}
++	return;
+ }
+ 
+ #ifdef CONFIG_PREEMPT
+--- linux-2.5.73/lib/Kconfig~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:32:56 2003
++++ linux-2.5.73-n9560/lib/Kconfig	Mon Jun 30 14:56:26 2003
+@@ -17,14 +17,16 @@ config CRC32
+ #
+ config ZLIB_INFLATE
+ 	tristate
+-	default y if CRAMFS=y || PPP_DEFLATE=y || JFFS2_FS=y || ZISOFS_FS=y || BINFMT_ZFLAT=y || CRYPTO_DEFLATE=y
+-	default m if CRAMFS=m || PPP_DEFLATE=m || JFFS2_FS=m || ZISOFS_FS=m || BINFMT_ZFLAT=m || CRYPTO_DEFLATE=m
++	default y if CRAMFS=y || PPP_DEFLATE=y || JFFS2_FS=y || ZISOFS_FS=y || BINFMT_ZFLAT=y || CRYPTO_DEFLATE=y || CRASH_DUMP_COMPRESS_GZIP=y
++	default m if CRAMFS=m || PPP_DEFLATE=m || JFFS2_FS=m || ZISOFS_FS=m || BINFMT_ZFLAT=m || CRYPTO_DEFLATE=m || CRASH_DUMP_COMPRESS_GZIP=m
+ 
+ config ZLIB_DEFLATE
+ 	tristate
+ 	default m if PPP_DEFLATE!=y && JFFS2_FS!=y && CRYPTO_DEFLATE!=y && \
+-		(PPP_DEFLATE=m || JFFS2_FS=m || CRYPTO_DEFLATE=m)
+-	default y if PPP_DEFLATE=y || JFFS2_FS=y || CRYPTO_DEFLATE=y
++		(PPP_DEFLATE=m || JFFS2_FS=m || CRYPTO_DEFLATE=m \
++			|| CRASH_DUMP_COMPRESS_GZIP=m )
++	default y if PPP_DEFLATE=y || JFFS2_FS=y || CRYPTO_DEFLATE=y \
++		|| CRASH_DUMP_COMPRESS_GZIP=y
+ 
+ endmenu
+ 
+--- linux-2.5.73/mm/page_alloc.c~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:32:32 2003
++++ linux-2.5.73-n9560/mm/page_alloc.c	Mon Jun 30 14:56:26 2003
+@@ -84,7 +84,8 @@ static void bad_page(const char *functio
+ 	page->mapping = NULL;
+ }
+ 
+-#ifndef CONFIG_HUGETLB_PAGE
++#if !defined(CONFIG_HUGETLB_PAGE) && !defined(CONFIG_CRASH_DUMP) \
++	&& !defined(CONFIG_CRASH_DUMP_MODULE)
+ #define prep_compound_page(page, order) do { } while (0)
+ #define destroy_compound_page(page, order) do { } while (0)
+ #else
+--- linux-2.5.73/init/Makefile~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:32:42 2003
++++ linux-2.5.73-n9560/init/Makefile	Mon Jun 30 14:56:26 2003
+@@ -9,6 +9,9 @@ mounts-$(CONFIG_BLK_DEV_RAM)	+= do_mount
+ mounts-$(CONFIG_BLK_DEV_INITRD)	+= do_mounts_initrd.o
+ mounts-$(CONFIG_BLK_DEV_MD)	+= do_mounts_md.o
+ 
++extra-$(CONFIG_CRASH_DUMP)	+= kerntypes.o
++CFLAGS_kerntypes.o		:= -gstabs
++
+ # files to be removed upon make clean
+ clean-files := ../include/linux/compile.h
+ 
+@@ -24,3 +27,4 @@ $(obj)/version.o: include/linux/compile.
+ include/linux/compile.h: FORCE
+ 	@echo '  CHK     $@'
+ 	@sh $(srctree)/scripts/mkcompile_h $@ "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CC) $(CFLAGS)"
++
+--- linux-2.5.73/init/main.c~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:32:35 2003
++++ linux-2.5.73-n9560/init/main.c	Mon Jun 30 14:56:26 2003
+@@ -101,6 +101,16 @@ extern void ipc_init(void);
+ int system_running = 0;
+ 
+ /*
++ * The kernel_magic value represents the address of _end, which allows
++ * namelist tools to "match" each other respectively.  That way a tool
++ * that looks at /dev/mem can verify that it is using the right System.map
++ * file -- if kernel_magic doesn't equal the namelist value of _end,
++ * something's wrong.
++ */
++extern unsigned long _end;
++unsigned long *kernel_magic = &_end;
++
++/*
+  * Boot command-line arguments
+  */
+ #define MAX_INIT_ARGS 8
+--- linux-2.5.73/init/version.c~lkcd-kernel-changes-2.5.73	Sun Jun 22 11:32:45 2003
++++ linux-2.5.73-n9560/init/version.c	Mon Jun 30 14:56:26 2003
+@@ -10,6 +10,7 @@
+ #include <linux/uts.h>
+ #include <linux/utsname.h>
+ #include <linux/version.h>
++#include <linux/stringify.h>
+ 
+ #define version(a) Version_ ## a
+ #define version_string(a) version(a)
+@@ -24,3 +25,6 @@ struct new_utsname system_utsname = {
+ const char *linux_banner = 
+ 	"Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@"
+ 	LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";
++
++const char *LINUX_COMPILE_VERSION_ID = __stringify(LINUX_COMPILE_VERSION_ID);
++LINUX_COMPILE_VERSION_ID_TYPE;
+
+_
diff --git a/lustre/kernel_patches/patches/lkcd-kernel-changes-2.6.0-test1.patch b/lustre/kernel_patches/patches/lkcd-kernel-changes-2.6.0-test1.patch
new file mode 100644
index 0000000000..6b09ba1d9e
--- /dev/null
+++ b/lustre/kernel_patches/patches/lkcd-kernel-changes-2.6.0-test1.patch
@@ -0,0 +1,588 @@
+ arch/i386/Kconfig                           |   50 ++++++++++++++++++++++++++++
+ arch/i386/boot/Makefile                     |    1 
+ arch/i386/kernel/i386_ksyms.c               |   19 ++++++++++
+ arch/i386/kernel/nmi.c                      |    2 +
+ arch/i386/kernel/setup.c                    |    6 +++
+ arch/i386/kernel/smp.c                      |   16 +++++++-
+ arch/i386/kernel/traps.c                    |    2 +
+ arch/i386/mm/init.c                         |    6 +++
+ arch/s390/boot/Makefile                     |    2 -
+ arch/s390/boot/install.sh                   |   24 +++++++++----
+ drivers/Makefile                            |    1 
+ include/asm-i386/kmap_types.h               |    5 +-
+ include/asm-i386/mach-default/irq_vectors.h |    1 
+ include/asm-i386/smp.h                      |    1 
+ include/linux/major.h                       |    2 +
+ init/Makefile                               |    4 ++
+ init/main.c                                 |   10 +++++
+ init/version.c                              |    4 ++
+ kernel/ksyms.c                              |    8 ++++
+ kernel/panic.c                              |   17 +++++++++
+ kernel/sched.c                              |   22 ++++++++++++
+ lib/Kconfig                                 |   10 +++--
+ mm/page_alloc.c                             |    3 +
+ scripts/mkcompile_h                         |    4 +-
+ 24 files changed, 202 insertions(+), 18 deletions(-)
+
+--- linux-2.6.0-test1/drivers/Makefile~lkcd-kernel-changes-2.6.0-test1	2003-07-13 21:37:15.000000000 -0600
++++ linux-2.6.0-test1-braam/drivers/Makefile	2003-07-22 00:52:14.000000000 -0600
+@@ -49,3 +49,4 @@ obj-$(CONFIG_ISDN_BOOL)		+= isdn/
+ obj-$(CONFIG_MCA)		+= mca/
+ obj-$(CONFIG_EISA)		+= eisa/
+ obj-$(CONFIG_CPU_FREQ)		+= cpufreq/
++obj-$(CONFIG_CRASH_DUMP)	+= dump/
+--- linux-2.6.0-test1/include/linux/major.h~lkcd-kernel-changes-2.6.0-test1	2003-07-13 21:31:58.000000000 -0600
++++ linux-2.6.0-test1-braam/include/linux/major.h	2003-07-22 00:52:14.000000000 -0600
+@@ -157,6 +157,8 @@
+ 
+ #define OSST_MAJOR		206	/* OnStream-SCx0 SCSI tape */
+ 
++#define CRASH_DUMP_MAJOR	221	/* crash dump interface */
++
+ #define IBM_TTY3270_MAJOR	227
+ #define IBM_FS3270_MAJOR	228
+ 
+--- linux-2.6.0-test1/include/asm-i386/mach-default/irq_vectors.h~lkcd-kernel-changes-2.6.0-test1	2003-07-13 21:31:59.000000000 -0600
++++ linux-2.6.0-test1-braam/include/asm-i386/mach-default/irq_vectors.h	2003-07-22 00:52:14.000000000 -0600
+@@ -48,6 +48,7 @@
+ #define INVALIDATE_TLB_VECTOR	0xfd
+ #define RESCHEDULE_VECTOR	0xfc
+ #define CALL_FUNCTION_VECTOR	0xfb
++#define DUMP_VECTOR		0xfa
+ 
+ #define THERMAL_APIC_VECTOR	0xf0
+ /*
+--- linux-2.6.0-test1/include/asm-i386/kmap_types.h~lkcd-kernel-changes-2.6.0-test1	2003-07-22 00:46:07.000000000 -0600
++++ linux-2.6.0-test1-braam/include/asm-i386/kmap_types.h	2003-07-22 00:53:23.000000000 -0600
+@@ -1,4 +1,4 @@
+-#ifndef _ASM_KMAP_TYPES_H
++22#ifndef _ASM_KMAP_TYPES_H
+ #define _ASM_KMAP_TYPES_H
+ 
+ #include <linux/config.h>
+@@ -26,7 +26,8 @@ D(12)	KM_IRQ0,
+ D(13)	KM_IRQ1,
+ D(14)	KM_SOFTIRQ0,
+ D(15)	KM_SOFTIRQ1,
+-D(16)	KM_TYPE_NR
++D(16)	KM_DUMP
++D(17)	KM_TYPE_NR
+ };
+ 
+ #undef D
+--- linux-2.6.0-test1/include/asm-i386/smp.h~lkcd-kernel-changes-2.6.0-test1	2003-07-22 00:46:07.000000000 -0600
++++ linux-2.6.0-test1-braam/include/asm-i386/smp.h	2003-07-22 00:52:14.000000000 -0600
+@@ -38,6 +38,7 @@ extern int smp_num_siblings;
+ extern int cpu_sibling_map[];
+ 
+ extern void smp_flush_tlb(void);
++extern void dump_send_ipi(void);
+ extern void smp_message_irq(int cpl, void *dev_id, struct pt_regs *regs);
+ extern void smp_send_reschedule(int cpu);
+ extern void smp_invalidate_rcv(void);		/* Process an NMI */
+--- linux-2.6.0-test1/arch/i386/kernel/i386_ksyms.c~lkcd-kernel-changes-2.6.0-test1	2003-07-13 21:39:21.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/i386_ksyms.c	2003-07-22 00:52:14.000000000 -0600
+@@ -16,6 +16,7 @@
+ #include <linux/tty.h>
+ #include <linux/highmem.h>
+ #include <linux/time.h>
++#include <linux/nmi.h>
+ 
+ #include <asm/semaphore.h>
+ #include <asm/processor.h>
+@@ -33,6 +34,7 @@
+ #include <asm/tlbflush.h>
+ #include <asm/nmi.h>
+ #include <asm/edd.h>
++#include <asm/e820.h>
+ 
+ extern void dump_thread(struct pt_regs *, struct user *);
+ extern spinlock_t rtc_lock;
+@@ -209,3 +211,20 @@ EXPORT_SYMBOL(kmap_atomic_to_page);
+ EXPORT_SYMBOL(edd);
+ EXPORT_SYMBOL(eddnr);
+ #endif
++
++#ifdef CONFIG_CRASH_DUMP_MODULE
++#ifdef CONFIG_SMP
++extern irq_desc_t irq_desc[NR_IRQS];
++extern unsigned long irq_affinity[NR_IRQS];
++extern void stop_this_cpu(void *);
++EXPORT_SYMBOL(irq_desc);
++EXPORT_SYMBOL(irq_affinity);
++EXPORT_SYMBOL(stop_this_cpu);
++EXPORT_SYMBOL(dump_send_ipi);
++#endif
++extern int pfn_is_ram(unsigned long);
++EXPORT_SYMBOL(pfn_is_ram);
++#ifdef ARCH_HAS_NMI_WATCHDOG
++EXPORT_SYMBOL(touch_nmi_watchdog);
++#endif
++#endif
+--- linux-2.6.0-test1/arch/i386/kernel/nmi.c~lkcd-kernel-changes-2.6.0-test1	2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/nmi.c	2003-07-22 00:52:14.000000000 -0600
+@@ -24,6 +24,7 @@
+ #include <linux/kernel_stat.h>
+ #include <linux/module.h>
+ #include <linux/nmi.h>
++#include <linux/dump.h>
+ #include <linux/sysdev.h>
+ 
+ #include <asm/smp.h>
+@@ -449,6 +450,7 @@ void nmi_watchdog_tick (struct pt_regs *
+ 			bust_spinlocks(1);
+ 			printk("NMI Watchdog detected LOCKUP on CPU%d, eip %08lx, registers:\n", cpu, regs->eip);
+ 			show_registers(regs);
++			dump("NMI Watchdog detected LOCKUP", regs);
+ 			printk("console shuts up ...\n");
+ 			console_silent();
+ 			spin_unlock(&nmi_print_lock);
+--- linux-2.6.0-test1/arch/i386/kernel/setup.c~lkcd-kernel-changes-2.6.0-test1	2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/setup.c	2003-07-22 00:52:14.000000000 -0600
+@@ -439,6 +439,7 @@ static void __init setup_memory_region(v
+ 	print_memory_map(who);
+ } /* setup_memory_region */
+ 
++unsigned long crashdump_addr = 0xdeadbeef;
+ 
+ static void __init parse_cmdline_early (char ** cmdline_p)
+ {
+@@ -532,6 +533,9 @@ static void __init parse_cmdline_early (
+ 		if (c == ' ' && !memcmp(from, "highmem=", 8))
+ 			highmem_pages = memparse(from+8, &from) >> PAGE_SHIFT;
+ 	
++		if (c == ' ' && !memcmp(from, "crashdump=", 10))
++			crashdump_addr = memparse(from+10, &from); 
++			
+ 		c = *(from++);
+ 		if (!c)
+ 			break;
+@@ -914,6 +918,8 @@ static int __init noreplacement_setup(ch
+ 
+ __setup("noreplacement", noreplacement_setup); 
+ 
++extern void crashdump_reserve(void);
++
+ void __init setup_arch(char **cmdline_p)
+ {
+ 	unsigned long max_low_pfn;
+--- linux-2.6.0-test1/arch/i386/kernel/smp.c~lkcd-kernel-changes-2.6.0-test1	2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/smp.c	2003-07-22 00:52:14.000000000 -0600
+@@ -19,6 +19,7 @@
+ #include <linux/mc146818rtc.h>
+ #include <linux/cache.h>
+ #include <linux/interrupt.h>
++#include <linux/dump.h>
+ 
+ #include <asm/mtrr.h>
+ #include <asm/pgalloc.h>
+@@ -144,6 +145,13 @@ inline void __send_IPI_shortcut(unsigned
+ 	 */
+ 	cfg = __prepare_ICR(shortcut, vector);
+ 
++	if (vector == DUMP_VECTOR) {
++		/*
++		 * Setup DUMP IPI to be delivered as an NMI
++		 */
++		cfg = (cfg&~APIC_VECTOR_MASK)|APIC_DM_NMI;
++	}
++
+ 	/*
+ 	 * Send the IPI. The write to APIC_ICR fires this off.
+ 	 */
+@@ -467,6 +475,11 @@ void flush_tlb_all(void)
+ 	on_each_cpu(do_flush_tlb_all, 0, 1, 1);
+ }
+ 
++void dump_send_ipi(void)
++{
++	send_IPI_allbutself(DUMP_VECTOR);
++}
++
+ /*
+  * this function sends a 'reschedule' IPI to another CPU.
+  * it goes straight through and wastes no time serializing
+@@ -555,7 +568,7 @@ int smp_call_function (void (*func) (voi
+ 	return 0;
+ }
+ 
+-static void stop_this_cpu (void * dummy)
++void stop_this_cpu (void * dummy)
+ {
+ 	/*
+ 	 * Remove this CPU:
+@@ -616,4 +629,3 @@ asmlinkage void smp_call_function_interr
+ 		atomic_inc(&call_data->finished);
+ 	}
+ }
+-
+--- linux-2.6.0-test1/arch/i386/kernel/traps.c~lkcd-kernel-changes-2.6.0-test1	2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/traps.c	2003-07-22 00:52:14.000000000 -0600
+@@ -25,6 +25,7 @@
+ #include <linux/highmem.h>
+ #include <linux/kallsyms.h>
+ #include <linux/ptrace.h>
++#include <linux/dump.h>
+ 
+ #ifdef CONFIG_EISA
+ #include <linux/ioport.h>
+@@ -322,6 +323,7 @@ void die(const char * str, struct pt_reg
+ #endif
+  	CHK_REMOTE_DEBUG(0,SIGTRAP,err,regs,)
+ 	show_registers(regs);
++	dump((char *)str, regs);
+ 	bust_spinlocks(0);
+ 	spin_unlock_irq(&die_lock);
+ 	if (in_interrupt())
+--- linux-2.6.0-test1/arch/i386/mm/init.c~lkcd-kernel-changes-2.6.0-test1	2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/mm/init.c	2003-07-22 00:52:14.000000000 -0600
+@@ -186,6 +186,12 @@ static inline int page_is_ram(unsigned l
+ 	return 0;
+ }
+ 
++/* To enable modules to check if a page is in RAM */
++int pfn_is_ram(unsigned long pfn)
++{
++	return (page_is_ram(pfn));
++}
++
+ #ifdef CONFIG_HIGHMEM
+ pte_t *kmap_pte;
+ pgprot_t kmap_prot;
+--- linux-2.6.0-test1/arch/i386/boot/Makefile~lkcd-kernel-changes-2.6.0-test1	2003-07-13 21:33:11.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/boot/Makefile	2003-07-22 00:52:14.000000000 -0600
+@@ -101,3 +101,4 @@ zlilo: $(BOOTIMAGE)
+ 
+ install: $(BOOTIMAGE)
+ 	sh $(src)/install.sh $(KERNELRELEASE) $(BOOTIMAGE) System.map "$(INSTALL_PATH)"
++	if [ -f init/kerntypes.o ]; then cp init/kerntypes.o $(INSTALL_PATH)/Kerntypes; fi
+--- linux-2.6.0-test1/arch/i386/Kconfig~lkcd-kernel-changes-2.6.0-test1	2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/Kconfig	2003-07-22 00:52:14.000000000 -0600
+@@ -1297,6 +1297,56 @@ source "arch/i386/oprofile/Kconfig"
+ 
+ menu "Kernel hacking"
+ 
++config CRASH_DUMP
++	tristate "Crash dump support (EXPERIMENTAL)"
++	depends on EXPERIMENTAL
++	default n
++	---help---
++	  Say Y here to enable saving an image of system memory when a panic
++	  or other error occurs. Dumps can also be forced with the SysRq+d
++	  key if MAGIC_SYSRQ is enabled.
++
++config CRASH_DUMP_BLOCKDEV
++	tristate "Crash dump block device driver"
++	depends on CRASH_DUMP
++	help
++	  Say Y to allow saving crash dumps directly to a disk device.
++
++config CRASH_DUMP_NETDEV
++	tristate "Crash dump network device driver"
++	depends on CRASH_DUMP
++	help
++	  Say Y to allow saving crash dumps over a network device.
++
++config CRASH_DUMP_MEMDEV
++	bool "Crash dump staged memory driver"
++	depends on CRASH_DUMP
++	help
++	  Say Y to allow intermediate saving crash dumps in spare 
++	  memory pages which would then be written out to disk
++	  later.
++
++config CRASH_DUMP_SOFTBOOT
++	bool "Save crash dump across a soft reboot"
++	depends on CRASH_DUMP_MEMDEV
++	help
++	  Say Y to allow a crash dump to be preserved in memory
++	  pages across a soft reboot and written out to disk
++	  thereafter. For this to work, CRASH_DUMP must be 
++	  configured as part of the kernel (not as a module).
++
++config CRASH_DUMP_COMPRESS_RLE
++	tristate "Crash dump RLE compression"
++	depends on CRASH_DUMP
++	help
++	  Say Y to allow saving dumps with Run Length Encoding compression.
++
++config CRASH_DUMP_COMPRESS_GZIP
++	tristate "Crash dump GZIP compression"
++	depends on CRASH_DUMP
++	help
++	  Say Y to allow saving dumps with Gnu Zip compression.
++
+ config DEBUG_KERNEL
+ 	bool "Kernel debugging"
+ 	help
+--- linux-2.6.0-test1/arch/s390/boot/Makefile~lkcd-kernel-changes-2.6.0-test1	2003-07-13 21:39:33.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/s390/boot/Makefile	2003-07-22 00:52:14.000000000 -0600
+@@ -16,4 +16,4 @@ $(obj)/image: vmlinux FORCE
+ 
+ install: $(CONFIGURE) $(obj)/image
+ 	sh -x $(obj)/install.sh $(KERNELRELEASE) $(obj)/image \
+-	      System.map Kerntypes "$(INSTALL_PATH)"
++	      System.map init/kerntypes.o "$(INSTALL_PATH)"
+--- linux-2.6.0-test1/arch/s390/boot/install.sh~lkcd-kernel-changes-2.6.0-test1	2003-07-13 21:35:17.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/s390/boot/install.sh	2003-07-22 00:52:14.000000000 -0600
+@@ -16,7 +16,8 @@
+ #   $1 - kernel version
+ #   $2 - kernel image file
+ #   $3 - kernel map file
+-#   $4 - default install path (blank if root directory)
++#   $4 - kernel type file
++#   $5 - default install path (blank if root directory)
+ #
+ 
+ # User may have a custom install script
+@@ -26,13 +27,22 @@ if [ -x /sbin/installkernel ]; then exec
+ 
+ # Default install - same as make zlilo
+ 
+-if [ -f $4/vmlinuz ]; then
+-	mv $4/vmlinuz $4/vmlinuz.old
++if [ -f $5/vmlinuz ]; then
++	mv $5/vmlinuz $5/vmlinuz.old
+ fi
+ 
+-if [ -f $4/System.map ]; then
+-	mv $4/System.map $4/System.old
++if [ -f $5/System.map ]; then
++	mv $5/System.map $5/System.old
+ fi
+ 
+-cat $2 > $4/vmlinuz
+-cp $3 $4/System.map
++if [ -f $5/Kerntypes ]; then
++	mv $5/Kerntypes $5/Kerntypes.old
++fi
++
++cat $2 > $5/vmlinuz
++cp $3 $5/System.map
++
++# copy the kernel type file if it exists
++if [ -f $4 ]; then
++	cp $4 $5/Kerntypes
++fi
+--- linux-2.6.0-test1/scripts/mkcompile_h~lkcd-kernel-changes-2.6.0-test1	2003-07-13 21:39:36.000000000 -0600
++++ linux-2.6.0-test1-braam/scripts/mkcompile_h	2003-07-22 00:52:14.000000000 -0600
+@@ -33,7 +33,7 @@ UTS_VERSION="$UTS_VERSION `LANG=C date`"
+ 
+ UTS_LEN=64
+ UTS_TRUNCATE="sed -e s/\(.\{1,$UTS_LEN\}\).*/\1/"
+-
++LINUX_COMPILE_VERSION_ID="__linux_compile_version_id__`hostname | tr -c '[0-9A-Za-z\n]' '__'`_`LANG=C date | tr -c '[0-9A-Za-z\n]' '_'`"
+ # Generate a temporary compile.h
+ 
+ ( echo /\* This file is auto generated, version $VERSION \*/
+@@ -55,6 +55,8 @@ UTS_TRUNCATE="sed -e s/\(.\{1,$UTS_LEN\}
+   fi
+ 
+   echo \#define LINUX_COMPILER \"`$CC -v 2>&1 | tail -1`\"
++  echo \#define LINUX_COMPILE_VERSION_ID $LINUX_COMPILE_VERSION_ID
++  echo \#define LINUX_COMPILE_VERSION_ID_TYPE typedef char* "$LINUX_COMPILE_VERSION_ID""_t"
+ ) > .tmpcompile
+ 
+ # Only replace the real compile.h if the new one is different,
+--- linux-2.6.0-test1/kernel/ksyms.c~lkcd-kernel-changes-2.6.0-test1	2003-07-22 00:46:07.000000000 -0600
++++ linux-2.6.0-test1-braam/kernel/ksyms.c	2003-07-22 00:52:14.000000000 -0600
+@@ -60,6 +60,8 @@
+ #include <linux/backing-dev.h>
+ #include <linux/percpu_counter.h>
+ #include <asm/checksum.h>
++#include <linux/dump.h>
++#include <linux/bootmem.h>
+ 
+ #if defined(CONFIG_PROC_FS)
+ #include <linux/proc_fs.h>
+@@ -627,3 +629,9 @@ EXPORT_SYMBOL(ptrace_notify);
+ EXPORT_SYMBOL(console_printk);
+ 
+ EXPORT_SYMBOL(current_kernel_time);
++
++#ifdef CONFIG_CRASH_DUMP_MODULE
++EXPORT_SYMBOL(min_low_pfn);
++EXPORT_SYMBOL(dump_oncpu);
++EXPORT_SYMBOL(dump_function_ptr);
++#endif
+--- linux-2.6.0-test1/kernel/panic.c~lkcd-kernel-changes-2.6.0-test1	2003-07-13 21:38:38.000000000 -0600
++++ linux-2.6.0-test1-braam/kernel/panic.c	2003-07-22 00:52:14.000000000 -0600
+@@ -16,12 +16,16 @@
+ #include <linux/init.h>
+ #include <linux/sysrq.h>
+ #include <linux/interrupt.h>
++#ifdef CONFIG_KEXEC
++#include <linux/kexec.h>
++#endif
+ 
+ asmlinkage void sys_sync(void);	/* it's really int */
+ 
+ int panic_timeout;
+ int panic_on_oops;
+ int tainted;
++void (*dump_function_ptr)(const char *, const struct pt_regs *) = 0;
+ 
+ struct notifier_block *panic_notifier_list;
+ 
+@@ -54,6 +58,7 @@ NORET_TYPE void panic(const char * fmt, 
+ 	va_start(args, fmt);
+ 	vsnprintf(buf, sizeof(buf), fmt, args);
+ 	va_end(args);
++
+ 	printk(KERN_EMERG "Kernel panic: %s\n",buf);
+ 	if (in_interrupt())
+ 		printk(KERN_EMERG "In interrupt handler - not syncing\n");
+@@ -76,6 +81,18 @@ NORET_TYPE void panic(const char * fmt, 
+ 		 * We can't use the "normal" timers since we just panicked..
+ 	 	 */
+ 		printk(KERN_EMERG "Rebooting in %d seconds..",panic_timeout);
++#ifdef CONFIG_KEXEC
++{
++		struct kimage *image;
++		image = xchg(&kexec_image, 0);
++		if (image) {
++			printk(KERN_EMERG "by starting a new kernel ..\n");
++			mdelay(panic_timeout*1000);
++			machine_kexec(image);
++		}
++}
++#endif
++
+ 		mdelay(panic_timeout*1000);
+ 		/*
+ 		 *	Should we run the reboot notifier. For the moment Im
+--- linux-2.6.0-test1/kernel/sched.c~lkcd-kernel-changes-2.6.0-test1	2003-07-22 00:46:07.000000000 -0600
++++ linux-2.6.0-test1-braam/kernel/sched.c	2003-07-22 00:52:14.000000000 -0600
+@@ -41,6 +41,9 @@
+ #define cpu_to_node_mask(cpu) (cpu_online_map)
+ #endif
+ 
++/* used to soft spin in sched while dump is in progress */
++int dump_oncpu;
++
+ /*
+  * Convert user-nice values [ -20 ... 0 ... 19 ]
+  * to static priority [ MAX_RT_PRIO..MAX_PRIO-1 ],
+@@ -1335,6 +1338,15 @@ asmlinkage void schedule(void)
+ 	struct list_head *queue;
+ 	int idx;
+ 
++ 	/*
++	 * If crash dump is in progress, this other cpu's
++	 * need to wait until it completes.
++	 * NB: this code is optimized away for kernels without
++	 * dumping enabled.
++	 */
++	if (unlikely(dump_oncpu))
++		goto dump_scheduling_disabled;
++
+ 	/*
+ 	 * Test if we are atomic.  Since do_exit() needs to call into
+ 	 * schedule() atomically, we ignore that path for now.
+@@ -1422,6 +1434,16 @@ switch_tasks:
+ 	preempt_enable_no_resched();
+ 	if (test_thread_flag(TIF_NEED_RESCHED))
+ 		goto need_resched;
++
++	return;
++
++ dump_scheduling_disabled:
++	/* allow scheduling only if this is the dumping cpu */
++	if (dump_oncpu != smp_processor_id()+1) {
++		while (dump_oncpu)
++			cpu_relax();
++	}
++	return;
+ }
+ 
+ #ifdef CONFIG_PREEMPT
+--- linux-2.6.0-test1/lib/Kconfig~lkcd-kernel-changes-2.6.0-test1	2003-07-13 21:34:43.000000000 -0600
++++ linux-2.6.0-test1-braam/lib/Kconfig	2003-07-22 00:52:14.000000000 -0600
+@@ -17,14 +17,16 @@ config CRC32
+ #
+ config ZLIB_INFLATE
+ 	tristate
+-	default y if CRAMFS=y || PPP_DEFLATE=y || JFFS2_FS=y || ZISOFS_FS=y || BINFMT_ZFLAT=y || CRYPTO_DEFLATE=y
+-	default m if CRAMFS=m || PPP_DEFLATE=m || JFFS2_FS=m || ZISOFS_FS=m || BINFMT_ZFLAT=m || CRYPTO_DEFLATE=m
++	default y if CRAMFS=y || PPP_DEFLATE=y || JFFS2_FS=y || ZISOFS_FS=y || BINFMT_ZFLAT=y || CRYPTO_DEFLATE=y || CRASH_DUMP_COMPRESS_GZIP=y
++	default m if CRAMFS=m || PPP_DEFLATE=m || JFFS2_FS=m || ZISOFS_FS=m || BINFMT_ZFLAT=m || CRYPTO_DEFLATE=m || CRASH_DUMP_COMPRESS_GZIP=m
+ 
+ config ZLIB_DEFLATE
+ 	tristate
+ 	default m if PPP_DEFLATE!=y && JFFS2_FS!=y && CRYPTO_DEFLATE!=y && \
+-		(PPP_DEFLATE=m || JFFS2_FS=m || CRYPTO_DEFLATE=m)
+-	default y if PPP_DEFLATE=y || JFFS2_FS=y || CRYPTO_DEFLATE=y
++		(PPP_DEFLATE=m || JFFS2_FS=m || CRYPTO_DEFLATE=m \
++			|| CRASH_DUMP_COMPRESS_GZIP=m )
++	default y if PPP_DEFLATE=y || JFFS2_FS=y || CRYPTO_DEFLATE=y \
++		|| CRASH_DUMP_COMPRESS_GZIP=y
+ 
+ endmenu
+ 
+--- linux-2.6.0-test1/mm/page_alloc.c~lkcd-kernel-changes-2.6.0-test1	2003-07-13 21:30:01.000000000 -0600
++++ linux-2.6.0-test1-braam/mm/page_alloc.c	2003-07-22 00:52:14.000000000 -0600
+@@ -89,7 +89,8 @@ static void bad_page(const char *functio
+ 	page->mapping = NULL;
+ }
+ 
+-#ifndef CONFIG_HUGETLB_PAGE
++#if !defined(CONFIG_HUGETLB_PAGE) && !defined(CONFIG_CRASH_DUMP) \
++	&& !defined(CONFIG_CRASH_DUMP_MODULE)
+ #define prep_compound_page(page, order) do { } while (0)
+ #define destroy_compound_page(page, order) do { } while (0)
+ #else
+--- linux-2.6.0-test1/init/Makefile~lkcd-kernel-changes-2.6.0-test1	2003-07-13 21:33:12.000000000 -0600
++++ linux-2.6.0-test1-braam/init/Makefile	2003-07-22 00:52:14.000000000 -0600
+@@ -9,6 +9,9 @@ mounts-$(CONFIG_BLK_DEV_RAM)	+= do_mount
+ mounts-$(CONFIG_BLK_DEV_INITRD)	+= do_mounts_initrd.o
+ mounts-$(CONFIG_BLK_DEV_MD)	+= do_mounts_md.o
+ 
++extra-$(CONFIG_CRASH_DUMP)	+= kerntypes.o
++CFLAGS_kerntypes.o		:= -gstabs
++
+ # files to be removed upon make clean
+ clean-files := ../include/linux/compile.h
+ 
+@@ -24,3 +27,4 @@ $(obj)/version.o: include/linux/compile.
+ include/linux/compile.h: FORCE
+ 	@echo '  CHK     $@'
+ 	@sh $(srctree)/scripts/mkcompile_h $@ "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CC) $(CFLAGS)"
++
+--- linux-2.6.0-test1/init/main.c~lkcd-kernel-changes-2.6.0-test1	2003-07-22 00:46:07.000000000 -0600
++++ linux-2.6.0-test1-braam/init/main.c	2003-07-22 00:52:14.000000000 -0600
+@@ -100,6 +100,16 @@ extern void ipc_init(void);
+ int system_running = 0;
+ 
+ /*
++ * The kernel_magic value represents the address of _end, which allows
++ * namelist tools to "match" each other respectively.  That way a tool
++ * that looks at /dev/mem can verify that it is using the right System.map
++ * file -- if kernel_magic doesn't equal the namelist value of _end,
++ * something's wrong.
++ */
++extern unsigned long _end;
++unsigned long *kernel_magic = &_end;
++
++/*
+  * Boot command-line arguments
+  */
+ #define MAX_INIT_ARGS 8
+--- linux-2.6.0-test1/init/version.c~lkcd-kernel-changes-2.6.0-test1	2003-07-13 21:34:03.000000000 -0600
++++ linux-2.6.0-test1-braam/init/version.c	2003-07-22 00:52:14.000000000 -0600
+@@ -10,6 +10,7 @@
+ #include <linux/uts.h>
+ #include <linux/utsname.h>
+ #include <linux/version.h>
++#include <linux/stringify.h>
+ 
+ #define version(a) Version_ ## a
+ #define version_string(a) version(a)
+@@ -28,3 +29,6 @@ struct new_utsname system_utsname = {
+ const char *linux_banner = 
+ 	"Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@"
+ 	LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";
++
++const char *LINUX_COMPILE_VERSION_ID = __stringify(LINUX_COMPILE_VERSION_ID);
++LINUX_COMPILE_VERSION_ID_TYPE;
+
+_
diff --git a/lustre/kernel_patches/patches/lustre-2.5.63.patch b/lustre/kernel_patches/patches/lustre-2.5.63.patch
deleted file mode 100644
index 40e6a90995..0000000000
--- a/lustre/kernel_patches/patches/lustre-2.5.63.patch
+++ /dev/null
@@ -1,862 +0,0 @@
- arch/um/kernel/mem.c   |   18 ++++++
- fs/dcache.c            |   12 +++-
- fs/namei.c             |  132 ++++++++++++++++++++++++++++++++++++++-----------
- fs/namespace.c         |    1 
- fs/nfsd/vfs.c          |    2 
- fs/open.c              |   39 ++++++++++++--
- fs/stat.c              |    2 
- fs/sysfs/inode.c       |    2 
- include/linux/dcache.h |   28 ++++++++++
- include/linux/fs.h     |   20 +++++++
- include/linux/namei.h  |    3 -
- include/linux/slab.h   |    1 
- kernel/ksyms.c         |    7 ++
- mm/slab.c              |    5 +
- net/unix/af_unix.c     |    2 
- 15 files changed, 231 insertions(+), 43 deletions(-)
-
---- linux-2.5.63-nointent/arch/um/kernel/mem.c~lustre-2.5.63	Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/arch/um/kernel/mem.c	Tue Mar 18 15:02:10 2003
-@@ -660,6 +660,22 @@ struct page *pte_mem_map(pte_t pte)
- 	return(phys_mem_map(pte_val(pte)));
- }
- 
-+struct page *check_get_page(unsigned long kaddr)
-+{
-+        struct page *page;
-+        struct mem_region *mr;
-+        unsigned long phys = __pa(kaddr);
-+	unsigned int n = phys_region_index(phys);
-+
-+	if(regions[n] == NULL) 
-+                return NULL; 
-+
-+        mr = regions[n];
-+        page = (struct page *) mr->mem_map;
-+	return page + ((phys_addr(phys)) >> PAGE_SHIFT);
-+}
-+
-+
- struct mem_region *page_region(struct page *page, int *index_out)
- {
- 	int i;
-@@ -747,7 +763,7 @@ extern unsigned long region_pa(void *vir
- 		   (addr <= region->start + region->len))
- 			return(mk_phys(addr - region->start, i));
- 	}
--	panic("region_pa : no region for virtual address");
-+	//panic("region_pa : no region for virtual address");
- 	return(0);
- }
- 
---- linux-2.5.63-nointent/fs/namei.c~lustre-2.5.63	Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/fs/namei.c	Mon Mar 24 17:08:18 2003
-@@ -101,6 +101,14 @@
-  * any extra contention...
-  */
- 
-+void intent_release(struct dentry *de, struct lookup_intent *it)
-+{
-+	if (it && de->d_op && de->d_op->d_intent_release)
-+		de->d_op->d_intent_release(de, it);
-+
-+}
-+
-+
- /* In order to reduce some races, while at the same time doing additional
-  * checking and hopefully speeding things up, we copy filenames to the
-  * kernel data space before using them..
-@@ -273,10 +281,18 @@ void path_release(struct nameidata *nd)
-  * Internal lookup() using the new generic dcache.
-  * SMP-safe
-  */
--static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags, struct lookup_intent *it)
- {
- 	struct dentry * dentry = d_lookup(parent, name);
- 	
-+	if (dentry && dentry->d_op && dentry->d_op->d_revalidate2) {
-+		if (!dentry->d_op->d_revalidate2(dentry, flags, it) &&
-+		    !d_invalidate(dentry)) {
-+			dput(dentry);
-+			dentry = NULL;
-+		}
-+		return dentry;
-+	} else
- 	if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
- 		if (!dentry->d_op->d_revalidate(dentry, flags) && !d_invalidate(dentry)) {
- 			dput(dentry);
-@@ -330,7 +346,7 @@ ok:
-  * make sure that nobody added the entry to the dcache in the meantime..
-  * SMP-safe
-  */
--static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags, struct lookup_intent *it)
- {
- 	struct dentry * result;
- 	struct inode *dir = parent->d_inode;
-@@ -348,7 +364,10 @@ static struct dentry * real_lookup(struc
- 		struct dentry * dentry = d_alloc(parent, name);
- 		result = ERR_PTR(-ENOMEM);
- 		if (dentry) {
--			result = dir->i_op->lookup(dir, dentry);
-+			if (dir->i_op->lookup2)
-+				result = dir->i_op->lookup2(dir, dentry, it);
-+			else
-+                                result = dir->i_op->lookup(dir, dentry);
- 			if (result)
- 				dput(dentry);
- 			else {
-@@ -370,6 +389,12 @@ static struct dentry * real_lookup(struc
- 			dput(result);
- 			result = ERR_PTR(-ENOENT);
- 		}
-+	} else if (result->d_op && result->d_op->d_revalidate2) {
-+		if (!result->d_op->d_revalidate2(result, flags, it) &&
-+		    !d_invalidate(result)) {
-+			dput(result);
-+			result = ERR_PTR(-ENOENT);
-+		}
- 	}
- 	return result;
- }
-@@ -402,6 +427,7 @@ static inline int do_follow_link(struct 
- 	current->link_count--;
- 	return err;
- loop:
-+	intent_release(dentry, &nd->it);
- 	path_release(nd);
- 	return err;
- }
-@@ -447,15 +473,26 @@ static int follow_mount(struct vfsmount 
- 	return res;
- }
- 
--static inline int __follow_down(struct vfsmount **mnt, struct dentry **dentry)
-+static inline int __follow_down(struct vfsmount **mnt, struct dentry **dentry,
-+                              struct lookup_intent *it)
- {
- 	struct vfsmount *mounted;
- 
- 	spin_lock(&dcache_lock);
- 	mounted = lookup_mnt(*mnt, *dentry);
- 	if (mounted) {
-+		int opc = 0, mode = 0;
- 		*mnt = mntget(mounted);
- 		spin_unlock(&dcache_lock);
-+		if (it) {
-+			opc = it->it_op;
-+			mode = it->it_mode;
-+		}
-+		intent_release(*dentry, it);
-+		if (it) {
-+			it->it_op = opc;
-+			it->it_mode = mode;
-+		}
- 		dput(*dentry);
- 		mntput(mounted->mnt_parent);
- 		*dentry = dget(mounted->mnt_root);
-@@ -467,7 +504,7 @@ static inline int __follow_down(struct v
- 
- int follow_down(struct vfsmount **mnt, struct dentry **dentry)
- {
--	return __follow_down(mnt,dentry);
-+	return __follow_down(mnt,dentry,NULL);
- }
-  
- static inline void follow_dotdot(struct vfsmount **mnt, struct dentry **dentry)
-@@ -531,7 +568,7 @@ done:
- 	return 0;
- 
- need_lookup:
--	dentry = real_lookup(nd->dentry, name, LOOKUP_CONTINUE);
-+	dentry = real_lookup(nd->dentry, name, LOOKUP_CONTINUE, &nd->it);
- 	if (IS_ERR(dentry))
- 		goto fail;
- 	goto done;
-@@ -665,7 +702,7 @@ int link_path_walk(const char * name, st
- 			nd->dentry = next.dentry;
- 		}
- 		err = -ENOTDIR; 
--		if (!inode->i_op->lookup)
-+		if (!inode->i_op->lookup && !inode->i_op->lookup2)
- 			break;
- 		continue;
- 		/* here ends the main loop */
-@@ -716,7 +753,8 @@ last_component:
- 			break;
- 		if (lookup_flags & LOOKUP_DIRECTORY) {
- 			err = -ENOTDIR; 
--			if (!inode->i_op || !inode->i_op->lookup)
-+			if (!inode->i_op || 
-+                            (!inode->i_op->lookup && !inode->i_op->lookup2))
- 				break;
- 		}
- 		goto return_base;
-@@ -735,6 +773,7 @@ out_dput:
- 		dput(next.dentry);
- 		break;
- 	}
-+	intent_release(nd->dentry, &nd->it);
- 	path_release(nd);
- return_err:
- 	return err;
-@@ -857,7 +896,8 @@ int path_lookup(const char *name, unsign
-  * needs parent already locked. Doesn't follow mounts.
-  * SMP-safe.
-  */
--struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
-+struct dentry * lookup_hash(struct qstr *name, struct dentry * base, 
-+                            struct lookup_intent *it)
- {
- 	struct dentry * dentry;
- 	struct inode *inode;
-@@ -880,13 +920,16 @@ struct dentry * lookup_hash(struct qstr 
- 			goto out;
- 	}
- 
--	dentry = cached_lookup(base, name, 0);
-+	dentry = cached_lookup(base, name, 0, it);
- 	if (!dentry) {
- 		struct dentry *new = d_alloc(base, name);
- 		dentry = ERR_PTR(-ENOMEM);
- 		if (!new)
- 			goto out;
--		dentry = inode->i_op->lookup(inode, new);
-+                if (inode->i_op->lookup2) 
-+                        dentry = inode->i_op->lookup2(inode, new, it);
-+                else 
-+                        dentry = inode->i_op->lookup(inode, new);
- 		if (!dentry) {
- 			dentry = new;
- 			security_inode_post_lookup(inode, dentry);
-@@ -898,7 +941,7 @@ out:
- }
- 
- /* SMP-safe */
--struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
-+struct dentry * lookup_one_len_it(const char * name, struct dentry * base, int len, struct lookup_intent *it)
- {
- 	unsigned long hash;
- 	struct qstr this;
-@@ -918,11 +961,16 @@ struct dentry * lookup_one_len(const cha
- 	}
- 	this.hash = end_name_hash(hash);
- 
--	return lookup_hash(&this, base);
-+	return lookup_hash(&this, base, it);
- access:
- 	return ERR_PTR(-EACCES);
- }
- 
-+struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
-+{
-+        return lookup_one_len_it(name, base, len, NULL);
-+}
-+
- /*
-  *	namei()
-  *
-@@ -1224,6 +1272,9 @@ int open_namei(const char * pathname, in
- 	/*
- 	 * Create - we need to know the parent.
- 	 */
-+	nd->it.it_mode = mode;
-+	nd->it.it_op |= IT_CREAT;
-+		
- 	error = path_lookup(pathname, LOOKUP_PARENT, nd);
- 	if (error)
- 		return error;
-@@ -1239,7 +1290,7 @@ int open_namei(const char * pathname, in
- 
- 	dir = nd->dentry;
- 	down(&dir->d_inode->i_sem);
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash(&nd->last, nd->dentry, &nd->it);
- 
- do_last:
- 	error = PTR_ERR(dentry);
-@@ -1247,7 +1298,8 @@ do_last:
- 		up(&dir->d_inode->i_sem);
- 		goto exit;
- 	}
--
-+        
-+	nd->it.it_mode = mode;
- 	/* Negative dentry, just create the file */
- 	if (!dentry->d_inode) {
- 		if (!IS_POSIXACL(dir->d_inode))
-@@ -1277,7 +1329,7 @@ do_last:
- 		error = -ELOOP;
- 		if (flag & O_NOFOLLOW)
- 			goto exit_dput;
--		while (__follow_down(&nd->mnt,&dentry) && d_mountpoint(dentry));
-+		while (__follow_down(&nd->mnt,&dentry,&nd->it) && d_mountpoint(dentry));
- 	}
- 	error = -ENOENT;
- 	if (!dentry->d_inode)
-@@ -1297,8 +1349,10 @@ ok:
- 	return 0;
- 
- exit_dput:
-+	intent_release(dentry, &nd->it);
- 	dput(dentry);
- exit:
-+	intent_release(nd->dentry, &nd->it);
- 	path_release(nd);
- 	return error;
- 
-@@ -1320,7 +1374,12 @@ do_link:
- 	if (error)
- 		goto exit_dput;
- 	UPDATE_ATIME(dentry->d_inode);
--	error = dentry->d_inode->i_op->follow_link(dentry, nd);
-+	if (dentry->d_inode->i_op->follow_link2)
-+		error = dentry->d_inode->i_op->follow_link2(dentry, nd, &nd->it);
-+	else
-+		error = dentry->d_inode->i_op->follow_link(dentry, nd);
-+        if (error)
-+		intent_release(dentry, &nd->it);
- 	dput(dentry);
- 	if (error)
- 		return error;
-@@ -1342,7 +1401,7 @@ do_link:
- 	}
- 	dir = nd->dentry;
- 	down(&dir->d_inode->i_sem);
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash(&nd->last, nd->dentry, &nd->it);
- 	putname(nd->last.name);
- 	goto do_last;
- }
-@@ -1356,7 +1415,7 @@ static struct dentry *lookup_create(stru
- 	dentry = ERR_PTR(-EEXIST);
- 	if (nd->last_type != LAST_NORM)
- 		goto fail;
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash(&nd->last, nd->dentry, &nd->it);
- 	if (IS_ERR(dentry))
- 		goto fail;
- 	if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
-@@ -1588,7 +1647,7 @@ asmlinkage long sys_rmdir(const char * p
- 			goto exit1;
- 	}
- 	down(&nd.dentry->d_inode->i_sem);
--	dentry = lookup_hash(&nd.last, nd.dentry);
-+	dentry = lookup_hash(&nd.last, nd.dentry, &nd.it);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		error = vfs_rmdir(nd.dentry->d_inode, dentry);
-@@ -1654,8 +1713,18 @@ asmlinkage long sys_unlink(const char * 
- 	error = -EISDIR;
- 	if (nd.last_type != LAST_NORM)
- 		goto exit1;
-+	if (nd.dentry->d_inode->i_op->unlink2) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->unlink2(nd.dentry->d_inode,
-+				nd.last.name,
-+				nd.last.len);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
- 	down(&nd.dentry->d_inode->i_sem);
--	dentry = lookup_hash(&nd.last, nd.dentry);
-+//	dentry = lookup_hash(&nd.last, nd.dentry, &nd.it);
-+	dentry = lookup_hash(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		/* Why not before? Because we want correct error value */
-@@ -1859,7 +1928,8 @@ exit:
-  *	   locking].
-  */
- int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+	       struct inode *new_dir, struct dentry *new_dentry,
-+	                          struct lookup_intent *it)
- {
- 	int error = 0;
- 	struct inode *target;
-@@ -1887,6 +1957,7 @@ int vfs_rename_dir(struct inode *old_dir
- 		error = -EBUSY;
- 	else 
- 		error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry);
-+	intent_release(new_dentry, it);
- 	if (target) {
- 		if (!error)
- 			target->i_flags |= S_DEAD;
-@@ -1904,7 +1975,8 @@ int vfs_rename_dir(struct inode *old_dir
- }
- 
- int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+	       struct inode *new_dir, struct dentry *new_dentry,
-+               struct lookup_intent *it)
- {
- 	struct inode *target;
- 	int error;
-@@ -1921,6 +1993,7 @@ int vfs_rename_other(struct inode *old_d
- 		error = -EBUSY;
- 	else
- 		error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry);
-+        intent_release(new_dentry, it);
- 	if (!error) {
- 		/* The following d_move() should become unconditional */
- 		if (!(old_dir->i_sb->s_type->fs_flags & FS_ODD_RENAME))
-@@ -1934,7 +2007,8 @@ int vfs_rename_other(struct inode *old_d
- }
- 
- int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+	       struct inode *new_dir, struct dentry *new_dentry, 
-+               struct lookup_intent *it)
- {
- 	int error;
- 	int is_dir = S_ISDIR(old_dentry->d_inode->i_mode);
-@@ -1960,9 +2034,9 @@ int vfs_rename(struct inode *old_dir, st
- 	DQUOT_INIT(new_dir);
- 
- 	if (is_dir)
--		error = vfs_rename_dir(old_dir,old_dentry,new_dir,new_dentry);
-+		error = vfs_rename_dir(old_dir,old_dentry,new_dir,new_dentry, it);
- 	else
--		error = vfs_rename_other(old_dir,old_dentry,new_dir,new_dentry);
-+		error = vfs_rename_other(old_dir,old_dentry,new_dir,new_dentry, it);
- 	if (!error) {
- 		if (old_dir == new_dir)
- 			inode_dir_notify(old_dir, DN_RENAME);
-@@ -2005,7 +2079,7 @@ static inline int do_rename(const char *
- 
- 	trap = lock_rename(new_dir, old_dir);
- 
--	old_dentry = lookup_hash(&oldnd.last, old_dir);
-+	old_dentry = lookup_hash(&oldnd.last, old_dir, &oldnd.it);
- 	error = PTR_ERR(old_dentry);
- 	if (IS_ERR(old_dentry))
- 		goto exit3;
-@@ -2025,7 +2099,7 @@ static inline int do_rename(const char *
- 	error = -EINVAL;
- 	if (old_dentry == trap)
- 		goto exit4;
--	new_dentry = lookup_hash(&newnd.last, new_dir);
-+	new_dentry = lookup_hash(&newnd.last, new_dir, &newnd.it);
- 	error = PTR_ERR(new_dentry);
- 	if (IS_ERR(new_dentry))
- 		goto exit4;
-@@ -2035,7 +2109,7 @@ static inline int do_rename(const char *
- 		goto exit5;
- 
- 	error = vfs_rename(old_dir->d_inode, old_dentry,
--				   new_dir->d_inode, new_dentry);
-+				   new_dir->d_inode, new_dentry, NULL);
- exit5:
- 	dput(new_dentry);
- exit4:
---- linux-2.5.63-nointent/fs/nfsd/vfs.c~lustre-2.5.63	Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/fs/nfsd/vfs.c	Tue Mar 18 15:02:10 2003
-@@ -1337,7 +1337,7 @@ nfsd_rename(struct svc_rqst *rqstp, stru
- 			err = nfserr_perm;
- 	} else
- #endif
--	err = vfs_rename(fdir, odentry, tdir, ndentry);
-+	err = vfs_rename(fdir, odentry, tdir, ndentry, NULL);
- 	if (!err && EX_ISSYNC(tfhp->fh_export)) {
- 		nfsd_sync_dir(tdentry);
- 		nfsd_sync_dir(fdentry);
---- linux-2.5.63-nointent/fs/sysfs/inode.c~lustre-2.5.63	Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/fs/sysfs/inode.c	Tue Mar 18 15:02:10 2003
-@@ -540,7 +540,7 @@ static struct dentry * get_dentry(struct
- 	qstr.name = name;
- 	qstr.len = strlen(name);
- 	qstr.hash = full_name_hash(name,qstr.len);
--	return lookup_hash(&qstr,parent);
-+	return lookup_hash(&qstr,parent,NULL);
- }
- 
- 
---- linux-2.5.63-nointent/include/linux/dcache.h~lustre-2.5.63	Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/include/linux/dcache.h	Tue Mar 18 15:02:10 2003
-@@ -12,6 +12,27 @@
- 
- struct vfsmount;
- 
-+#define IT_OPEN     (1)
-+#define IT_CREAT    (1<<1)
-+#define IT_READDIR  (1<<2)
-+#define IT_GETATTR  (1<<3)
-+#define IT_LOOKUP   (1<<4)
-+#define IT_UNLINK   (1<<5)
-+
-+
-+struct lookup_intent {
-+       int it_op;
-+       int it_mode;
-+       int it_flags;
-+       int it_disposition;
-+       int it_status;
-+       struct iattr *it_iattr;
-+       __u64 it_lock_handle[2];
-+       int it_lock_mode;
-+       void *it_data;
-+};
-+
-+
- /*
-  * linux/include/linux/dcache.h
-  *
-@@ -34,6 +55,8 @@ struct qstr {
- 	char name_str[0];
- };
- 
-+#include <linux/namei.h>
-+
- struct dentry_stat_t {
- 	int nr_dentry;
- 	int nr_unused;
-@@ -87,6 +110,7 @@ struct dentry {
- 	struct list_head d_subdirs;	/* our children */
- 	struct list_head d_alias;	/* inode alias list */
- 	int d_mounted;
-+        struct lookup_intent *d_it;
- 	struct qstr d_name;
- 	struct qstr * d_qstr;		/* quick str ptr used in lockless lookup and concurrent d_move */
- 	unsigned long d_time;		/* used by d_revalidate */
-@@ -107,6 +131,8 @@ struct dentry_operations {
- 	int (*d_delete)(struct dentry *);
- 	void (*d_release)(struct dentry *);
- 	void (*d_iput)(struct dentry *, struct inode *);
-+	int (*d_revalidate2)(struct dentry *, int, struct lookup_intent *);
-+	void (*d_intent_release)(struct  dentry *, struct lookup_intent *);
- };
- 
- /* the dentry parameter passed to d_hash and d_compare is the parent
-@@ -147,6 +173,8 @@ d_iput:		no		no		yes
- 
- #define DCACHE_REFERENCED	0x0008  /* Recently used, don't discard. */
- #define DCACHE_UNHASHED		0x0010	
-+#define DCACHE_LUSTRE_INVALID     0x0011  /* Lustre invalidated */
-+
- 
- extern spinlock_t dcache_lock;
- extern rwlock_t dparent_lock;
---- linux-2.5.63-nointent/include/linux/fs.h~lustre-2.5.63	Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/include/linux/fs.h	Tue Mar 18 15:02:10 2003
-@@ -234,6 +234,9 @@ typedef int (get_blocks_t)(struct inode 
- #define ATTR_ATTR_FLAG	1024
- #define ATTR_KILL_SUID	2048
- #define ATTR_KILL_SGID	4096
-+#define ATTR_RAW       	8192    /* file system, not vfs will massage attrs */
-+#define ATTR_FROM_OPEN 	16384    /* called from open path, ie O_TRUNC */
-+
- 
- /*
-  * This is the Inode Attributes structure, used for notify_change().  It
-@@ -642,7 +645,7 @@ extern int vfs_symlink(struct inode *, s
- extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
- extern int vfs_rmdir(struct inode *, struct dentry *);
- extern int vfs_unlink(struct inode *, struct dentry *);
--extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
-+extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *, struct lookup_intent *it);
- 
- /*
-  * File types
-@@ -728,19 +731,33 @@ struct file_operations {
- struct inode_operations {
- 	int (*create) (struct inode *,struct dentry *,int);
- 	struct dentry * (*lookup) (struct inode *,struct dentry *);
-+	struct dentry * (*lookup2) (struct inode *,struct dentry *, 
-+                                    struct lookup_intent *);
- 	int (*link) (struct dentry *,struct inode *,struct dentry *);
-+	int (*link2) (struct inode *,struct inode *, const char *, int);
- 	int (*unlink) (struct inode *,struct dentry *);
-+	int (*unlink2) (struct inode *, const char *, int);
- 	int (*symlink) (struct inode *,struct dentry *,const char *);
-+	int (*symlink2) (struct inode *, const char *, int, const char *);
- 	int (*mkdir) (struct inode *,struct dentry *,int);
-+	int (*mkdir2) (struct inode *, const char *, int,int);
- 	int (*rmdir) (struct inode *,struct dentry *);
-+	int (*rmdir2) (struct inode *, const char *, int);
- 	int (*mknod) (struct inode *,struct dentry *,int,dev_t);
-+	int (*mknod2) (struct inode *, const char *, int,int,int);
- 	int (*rename) (struct inode *, struct dentry *,
- 			struct inode *, struct dentry *);
-+	int (*rename2) (struct inode *, struct inode *,
-+			const char *oldname, int oldlen,
-+			const char *newname, int newlen);
- 	int (*readlink) (struct dentry *, char *,int);
- 	int (*follow_link) (struct dentry *, struct nameidata *);
-+	int (*follow_link2) (struct dentry *, struct nameidata *,
-+				struct lookup_intent *it);
- 	void (*truncate) (struct inode *);
- 	int (*permission) (struct inode *, int);
- 	int (*setattr) (struct dentry *, struct iattr *);
-+	int (*setattr_raw) (struct inode *, struct iattr *);
- 	int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);
- 	int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
- 	ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t,int);
-@@ -953,6 +970,7 @@ extern int register_filesystem(struct fi
- extern int unregister_filesystem(struct file_system_type *);
- extern struct vfsmount *kern_mount(struct file_system_type *);
- extern int may_umount(struct vfsmount *);
-+struct vfsmount *do_kern_mount(const char *type, int flags, char *name, void *data);
- extern long do_mount(char *, char *, char *, unsigned long, void *);
- 
- extern int vfs_statfs(struct super_block *, struct statfs *);
---- linux-2.5.63-nointent/include/linux/namei.h~lustre-2.5.63	Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/include/linux/namei.h	Tue Mar 18 15:02:10 2003
-@@ -11,6 +11,7 @@ struct nameidata {
- 	struct qstr	last;
- 	unsigned int	flags;
- 	int		last_type;
-+   struct lookup_intent it;
- };
- 
- /*
-@@ -44,7 +45,7 @@ extern int FASTCALL(link_path_walk(const
- extern void path_release(struct nameidata *);
- 
- extern struct dentry * lookup_one_len(const char *, struct dentry *, int);
--extern struct dentry * lookup_hash(struct qstr *, struct dentry *);
-+extern struct dentry * lookup_hash(struct qstr *, struct dentry *, struct lookup_intent *);
- 
- extern int follow_down(struct vfsmount **, struct dentry **);
- extern int follow_up(struct vfsmount **, struct dentry **);
---- linux-2.5.63-nointent/include/linux/slab.h~lustre-2.5.63	Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/include/linux/slab.h	Tue Mar 18 15:02:10 2003
-@@ -55,6 +55,7 @@ extern int kmem_cache_destroy(kmem_cache
- extern int kmem_cache_shrink(kmem_cache_t *);
- extern void *kmem_cache_alloc(kmem_cache_t *, int);
- extern void kmem_cache_free(kmem_cache_t *, void *);
-+extern int kmem_cache_validate(kmem_cache_t *cachep, void *objp);
- extern unsigned int kmem_cache_size(kmem_cache_t *);
- 
- extern void *kmalloc(size_t, int);
---- linux-2.5.63-nointent/kernel/ksyms.c~lustre-2.5.63	Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/kernel/ksyms.c	Tue Mar 18 15:02:10 2003
-@@ -377,6 +377,7 @@ EXPORT_SYMBOL(unregister_filesystem);
- EXPORT_SYMBOL(kern_mount);
- EXPORT_SYMBOL(__mntput);
- EXPORT_SYMBOL(may_umount);
-+EXPORT_SYMBOL(reparent_to_init);
- 
- /* executable format registration */
- EXPORT_SYMBOL(register_binfmt);
-@@ -407,6 +408,12 @@ EXPORT_SYMBOL(request_irq);
- EXPORT_SYMBOL(free_irq);
- EXPORT_SYMBOL(irq_stat);
- 
-+/* lustre */
-+EXPORT_SYMBOL(do_kern_mount);
-+EXPORT_SYMBOL(exit_files);
-+EXPORT_SYMBOL(kmem_cache_validate);
-+
-+
- /* waitqueue handling */
- EXPORT_SYMBOL(add_wait_queue);
- EXPORT_SYMBOL(add_wait_queue_exclusive);
---- linux-2.5.63-nointent/mm/slab.c~lustre-2.5.63	Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/mm/slab.c	Tue Mar 18 15:02:10 2003
-@@ -1792,6 +1792,11 @@ static inline void __cache_free (kmem_ca
- 	}
- }
- 
-+int kmem_cache_validate(kmem_cache_t *cachep, void *objp)
-+{
-+	return 1;
-+}
-+
- /**
-  * kmem_cache_alloc - Allocate an object
-  * @cachep: The cache to allocate from.
---- linux-2.5.63-nointent/net/unix/af_unix.c~lustre-2.5.63	Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/net/unix/af_unix.c	Tue Mar 18 15:02:10 2003
-@@ -720,7 +720,7 @@ static int unix_bind(struct socket *sock
- 		/*
- 		 * Do the final lookup.
- 		 */
--		dentry = lookup_hash(&nd.last, nd.dentry);
-+		dentry = lookup_hash(&nd.last, nd.dentry, NULL);
- 		err = PTR_ERR(dentry);
- 		if (IS_ERR(dentry))
- 			goto out_mknod_unlock;
---- linux-2.5.63-nointent/fs/dcache.c~lustre-2.5.63	Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/fs/dcache.c	Tue Mar 18 15:02:10 2003
-@@ -1111,15 +1111,21 @@ void d_delete(struct dentry * dentry)
-  * Adds a dentry to the hash according to its name.
-  */
-  
--void d_rehash(struct dentry * entry)
-+void __d_rehash(struct dentry * entry, int lock)
- {
- 	struct list_head *list = d_hash(entry->d_parent, entry->d_name.hash);
--	spin_lock(&dcache_lock);
-+	if (lock) spin_lock(&dcache_lock);
-  	if (!list_empty(&entry->d_hash) && !d_unhashed(entry)) BUG();
-  	entry->d_vfs_flags &= ~DCACHE_UNHASHED;
- 	entry->d_bucket = list;
-  	list_add_rcu(&entry->d_hash, list);
--	spin_unlock(&dcache_lock);
-+	if (lock) spin_unlock(&dcache_lock);
-+}
-+EXPORT_SYMBOL(__d_rehash);
-+
-+void d_rehash(struct dentry * entry)
-+{
-+	__d_rehash(entry, 1);
- }
- 
- #define do_switch(x,y) do { \
---- linux-2.5.63-nointent/fs/namespace.c~lustre-2.5.63	Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/fs/namespace.c	Tue Mar 18 15:02:10 2003
-@@ -925,6 +925,7 @@ void set_fs_pwd(struct fs_struct *fs, st
- 		mntput(old_pwdmnt);
- 	}
- }
-+EXPORT_SYMBOL(set_fs_pwd);
- 
- static void chroot_fs_refs(struct nameidata *old_nd, struct nameidata *new_nd)
- {
---- linux-2.5.63-nointent/fs/open.c~lustre-2.5.63	Thu Mar 20 12:43:39 2003
-+++ linux-2.5.63-nointent-root/fs/open.c	Mon Mar 24 16:25:47 2003
-@@ -97,7 +97,8 @@ static inline long do_sys_truncate(const
- 	struct nameidata nd;
- 	struct inode * inode;
- 	int error;
--
-+        struct lookup_intent it = { .it_op = IT_GETATTR };
-+	nd.it=it;
- 	error = -EINVAL;
- 	if (length < 0)	/* sorry, but loff_t says... */
- 		goto out;
-@@ -142,11 +143,13 @@ static inline long do_sys_truncate(const
- 	error = locks_verify_truncate(inode, NULL, length);
- 	if (!error) {
- 		DQUOT_INIT(inode);
-+		intent_release(nd.dentry, &nd.it);
- 		error = do_truncate(nd.dentry, length);
- 	}
- 	put_write_access(inode);
- 
- dput_and_out:
-+	intent_release(nd.dentry, &nd.it);
- 	path_release(&nd);
- out:
- 	return error;
-@@ -340,6 +343,8 @@ asmlinkage long sys_access(const char * 
- 	int old_fsuid, old_fsgid;
- 	kernel_cap_t old_cap;
- 	int res;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
-+	nd.it=it;	
- 
- 	if (mode & ~S_IRWXO)	/* where's F_OK, X_OK, W_OK, R_OK? */
- 		return -EINVAL;
-@@ -371,6 +376,8 @@ asmlinkage long sys_access(const char * 
- 		if(!res && (mode & S_IWOTH) && IS_RDONLY(nd.dentry->d_inode)
- 		   && !special_file(nd.dentry->d_inode->i_mode))
- 			res = -EROFS;
-+		                
-+		intent_release(nd.dentry, &nd.it);
- 		path_release(&nd);
- 	}
- 
-@@ -385,6 +392,8 @@ asmlinkage long sys_chdir(const char * f
- {
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
-+	nd.it=it;	
- 
- 	error = __user_walk(filename, LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &nd);
- 	if (error)
-@@ -397,6 +406,7 @@ asmlinkage long sys_chdir(const char * f
- 	set_fs_pwd(current->fs, nd.mnt, nd.dentry);
- 
- dput_and_out:
-+	intent_release(nd.dentry, &nd.it);
- 	path_release(&nd);
- out:
- 	return error;
-@@ -436,6 +446,8 @@ asmlinkage long sys_chroot(const char * 
- {
- 	struct nameidata nd;
- 	int error;
-+        struct lookup_intent it = { .it_op = IT_GETATTR };
-+	nd.it=it;
- 
- 	error = __user_walk(filename, LOOKUP_FOLLOW | LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
- 	if (error)
-@@ -508,6 +520,18 @@ asmlinkage long sys_chmod(const char * f
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto dput_and_out;
-+	
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		newattrs.ia_mode = mode;
-+		newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto dput_and_out;
-+	}
- 
- 	error = -EPERM;
- 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
-@@ -619,7 +643,10 @@ asmlinkage long sys_fchown(unsigned int 
- struct file *filp_open(const char * filename, int flags, int mode)
- {
- 	int namei_flags, error;
-+	struct file * temp_filp;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_OPEN, .it_flags = flags };
-+	nd.it=it;	
- 
- 	namei_flags = flags;
- 	if ((namei_flags+1) & O_ACCMODE)
-@@ -628,9 +655,11 @@ struct file *filp_open(const char * file
- 		namei_flags |= 2;
- 
- 	error = open_namei(filename, namei_flags, mode, &nd);
--	if (!error)
--		return dentry_open(nd.dentry, nd.mnt, flags);
--
-+	if (!error) {
-+		temp_filp = dentry_open(nd.dentry, nd.mnt, flags);
-+		intent_release(nd.dentry,&nd.it);
-+		return temp_filp;
-+	}	
- 	return ERR_PTR(error);
- }
- 
-@@ -675,7 +704,7 @@ struct file *dentry_open(struct dentry *
- 				goto cleanup_all;
- 		}
- 	}
--
-+        
- 	return f;
- 
- cleanup_all:
---- linux-2.5.63-nointent/fs/stat.c~lustre-2.5.63	Fri Mar 21 21:15:40 2003
-+++ linux-2.5.63-nointent-root/fs/stat.c	Fri Mar 21 21:16:53 2003
-@@ -65,6 +65,7 @@ int vfs_stat(char *name, struct kstat *s
- 	error = user_path_walk(name, &nd);
- 	if (!error) {
- 		error = vfs_getattr(nd.mnt, nd.dentry, stat);
-+		intent_release(nd.dentry, &nd.it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -80,6 +81,7 @@ int vfs_lstat(char *name, struct kstat *
- 	error = user_path_walk_link(name, &nd);
- 	if (!error) {
- 		error = vfs_getattr(nd.mnt, nd.dentry, stat);
-+		intent_release(nd.dentry, &nd.it);
- 		path_release(&nd);
- 	}
- 	return error;
-
-_
diff --git a/lustre/kernel_patches/patches/lustre_build.patch b/lustre/kernel_patches/patches/lustre_build.patch
new file mode 100644
index 0000000000..70f6a37d4b
--- /dev/null
+++ b/lustre/kernel_patches/patches/lustre_build.patch
@@ -0,0 +1,33 @@
+ fs/Kconfig  |    8 ++++++++
+ fs/Makefile |    1 +
+ 2 files changed, 9 insertions(+)
+
+--- linux-2.5.72/fs/Makefile~lustre_build	2003-06-16 22:20:05.000000000 -0600
++++ linux-2.5.72-braam/fs/Makefile	2003-06-22 10:11:57.000000000 -0600
+@@ -57,6 +57,7 @@ obj-$(CONFIG_RAMFS)		+= ramfs/
+ obj-$(CONFIG_HUGETLBFS)		+= hugetlbfs/
+ obj-$(CONFIG_CODA_FS)		+= coda/
+ obj-$(CONFIG_INTERMEZZO_FS)	+= intermezzo/
++obj-$(CONFIG_LUSTRE_FS)		+= lustre/
+ obj-$(CONFIG_MINIX_FS)		+= minix/
+ obj-$(CONFIG_FAT_FS)		+= fat/
+ obj-$(CONFIG_UMSDOS_FS)		+= umsdos/
+--- linux-2.5.72/fs/Kconfig~lustre_build	2003-06-16 22:20:05.000000000 -0600
++++ linux-2.5.72-braam/fs/Kconfig	2003-06-22 10:47:15.000000000 -0600
+@@ -1561,6 +1561,14 @@ config CODA_FS
+ 	  whenever you want), say M here and read
+ 	  <file:Documentation/modules.txt>.  The module will be called coda.
+ 
++config LUSTRE_FS
++	bool "Lustre: next generation clustering file system (EXPERIMENTAL)"
++	depends on INET && EXPERIMENTAL
++	help
++	  Lustre is a next generation storage architecture which includes a
++	  POSIX compliant cluster file system. For details see
++	  <http://www.lustre.org/>.
++
+ config INTERMEZZO_FS
+ 	tristate "InterMezzo file system support (replicating fs) (EXPERIMENTAL)"
+ 	depends on INET && EXPERIMENTAL
+
+_
diff --git a/lustre/kernel_patches/patches/netconsole_sysrq.patch b/lustre/kernel_patches/patches/netconsole_sysrq.patch
deleted file mode 100644
index b9954614c2..0000000000
--- a/lustre/kernel_patches/patches/netconsole_sysrq.patch
+++ /dev/null
@@ -1,41 +0,0 @@
- 0 files changed
-
---- linux-2.4.20-rh/drivers/net/netconsole.c~netconsole_sysrq	2003-04-11 14:04:57.000000000 +0800
-+++ linux-2.4.20-rh-root/drivers/net/netconsole.c	2003-07-01 11:10:26.000000000 +0800
-@@ -988,7 +988,15 @@ static void netconsole_netdump (struct p
- 			reply.info = 0;
- 			send_netdump_skb(dev, tmp, strlen(tmp), &reply);
- 			break;
--
-+		 case COMM_SYSRQ:
-+			Dprintk("got SYSRQ command.\n");
-+			printk("netdump: got SYSRQ command %d \n", req->from);
-+			handle_sysrq(req->from, regs, NULL, NULL);
-+			reply.code = REPLY_SYSRQ;
-+			reply.nr = req->nr;
-+			reply.info = req->from;
-+			send_netdump_skb(dev, tmp, strlen(tmp), &reply);
-+			break;
- 		default:
- 			reply.code = REPLY_ERROR;
- 			reply.nr = req->nr;
---- linux-2.4.20-rh/drivers/net/netconsole.h~netconsole_sysrq	2003-04-11 14:04:57.000000000 +0800
-+++ linux-2.4.20-rh-root/drivers/net/netconsole.h	2003-07-01 11:11:29.000000000 +0800
-@@ -42,6 +42,7 @@ enum netdump_commands {
- 	COMM_START_NETDUMP_ACK = 7,
- 	COMM_GET_REGS = 8,
- 	COMM_SHOW_STATE = 9,
-+	COMM_SYSRQ=10,
- };
- 
- #define NETDUMP_REQ_SIZE (8+4*4)
-@@ -69,6 +70,7 @@ enum netdump_replies {
- 	REPLY_REGS = 10,
- 	REPLY_MAGIC = 11,
- 	REPLY_SHOW_STATE = 12,
-+	REPLY_SYSRQ=13,
- };
- 
- typedef struct netdump_reply_s {
-
-_
diff --git a/lustre/kernel_patches/patches/qla2xxx-v8.00.00b1-2.5.73.patch b/lustre/kernel_patches/patches/qla2xxx-v8.00.00b1-2.5.73.patch
new file mode 100644
index 0000000000..88726a3175
--- /dev/null
+++ b/lustre/kernel_patches/patches/qla2xxx-v8.00.00b1-2.5.73.patch
@@ -0,0 +1,58389 @@
+ drivers/scsi/Kconfig                |    2 
+ drivers/scsi/Makefile               |    1 
+ drivers/scsi/qla2xxx/Kconfig        |   37 
+ drivers/scsi/qla2xxx/Makefile       |   56 
+ drivers/scsi/qla2xxx/README.qla2x00 |  744 ++++
+ drivers/scsi/qla2xxx/exioct.h       |  947 +++++
+ drivers/scsi/qla2xxx/exioctln.h     |  255 +
+ drivers/scsi/qla2xxx/inioct.h       |  129 
+ drivers/scsi/qla2xxx/ql2100tp_fw.c  | 4866 ++++++++++++++++++++++++++
+ drivers/scsi/qla2xxx/ql2200ip_fw.c  | 5884 ++++++++++++++++++++++++++++++++
+ drivers/scsi/qla2xxx/ql2300tpx_fw.c | 6494 +++++++++++++++++++++++++++++++++++
+ drivers/scsi/qla2xxx/qla_cfg.c      | 2780 +++++++++++++++
+ drivers/scsi/qla2xxx/qla_cfg.h      |  181 
+ drivers/scsi/qla2xxx/qla_cfgln.c    |  726 +++
+ drivers/scsi/qla2xxx/qla_dbg.c      | 1000 +++++
+ drivers/scsi/qla2xxx/qla_dbg.h      |  138 
+ drivers/scsi/qla2xxx/qla_def.h      | 2484 +++++++++++++
+ drivers/scsi/qla2xxx/qla_fo.c       | 1681 +++++++++
+ drivers/scsi/qla2xxx/qla_fo.cfg     |   31 
+ drivers/scsi/qla2xxx/qla_fo.h       |   75 
+ drivers/scsi/qla2xxx/qla_gbl.h      |  395 ++
+ drivers/scsi/qla2xxx/qla_inioct.c   |  495 ++
+ drivers/scsi/qla2xxx/qla_init.c     | 5945 ++++++++++++++++++++++++++++++++
+ drivers/scsi/qla2xxx/qla_inline.h   |  375 ++
+ drivers/scsi/qla2xxx/qla_iocb.c     | 1276 ++++++
+ drivers/scsi/qla2xxx/qla_ip.c       | 1769 +++++++++
+ drivers/scsi/qla2xxx/qla_ip.h       |  420 ++
+ drivers/scsi/qla2xxx/qla_isr.c      | 1474 ++++++++
+ drivers/scsi/qla2xxx/qla_listops.h  |  397 ++
+ drivers/scsi/qla2xxx/qla_mbx.c      | 2884 +++++++++++++++
+ drivers/scsi/qla2xxx/qla_os.c       | 5879 ++++++++++++++++++++++++++++++++
+ drivers/scsi/qla2xxx/qla_os.h       |  156 
+ drivers/scsi/qla2xxx/qla_settings.h |   80 
+ drivers/scsi/qla2xxx/qla_sup.c      |  560 +++
+ drivers/scsi/qla2xxx/qla_vendor.c   |  193 +
+ drivers/scsi/qla2xxx/qla_version.h  |   31 
+ drivers/scsi/qla2xxx/qla_xioct.c    | 6589 ++++++++++++++++++++++++++++++++++++
+ drivers/scsi/qla2xxx/qlfo.h         |  413 ++
+ drivers/scsi/qla2xxx/qlfolimits.h   |   92 
+ drivers/scsi/qla2xxx/qlfoln.h       |   76 
+ drivers/scsi/qla2xxx/release.txt    |   22 
+ drivers/scsi/qla2xxx/revision.notes |  167 
+ 42 files changed, 58199 insertions(+)
+
+--- linux-2.5.73/drivers/scsi/Makefile~qla2xxx-v8.00.00b1-2.5.73	Sun Jun 22 11:33:08 2003
++++ linux-2.5.73-n9560/drivers/scsi/Makefile	Thu Jul  3 15:34:28 2003
+@@ -73,6 +73,7 @@ obj-$(CONFIG_SCSI_QLOGIC_FAS)	+= qlogicf
+ obj-$(CONFIG_SCSI_QLOGIC_ISP)	+= qlogicisp.o 
+ obj-$(CONFIG_SCSI_QLOGIC_FC)	+= qlogicfc.o 
+ obj-$(CONFIG_SCSI_QLOGIC_1280)	+= qla1280.o 
++obj-$(CONFIG_SCSI_QLA2XXX)      += qla2xxx/
+ obj-$(CONFIG_SCSI_PAS16)	+= pas16.o
+ obj-$(CONFIG_SCSI_SEAGATE)	+= seagate.o
+ obj-$(CONFIG_SCSI_FD_8xx)	+= seagate.o
+--- linux-2.5.73/drivers/scsi/Kconfig~qla2xxx-v8.00.00b1-2.5.73	Sun Jun 22 11:33:16 2003
++++ linux-2.5.73-n9560/drivers/scsi/Kconfig	Thu Jul  3 15:34:28 2003
+@@ -1283,6 +1283,8 @@ config SCSI_QLOGIC_1280
+ 	  The module will be called qla1280. If you want to compile it as
+ 	  a module, say M here and read <file:Documentation/modules.txt>.
+ 
++source "drivers/scsi/qla2xxx/Kconfig"
++
+ config SCSI_QLOGICPTI
+ 	tristate "PTI Qlogic, ISP Driver"
+ 	depends on SBUS && SCSI
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/Kconfig	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,37 @@
++config SCSI_QLA2XXX
++	bool "QLogic QLA2XXX FC-SCSI support (v8)"
++	---help---
++	help here...
++
++config SCSI_QLA2XXX_QLA21XX
++	tristate "QLogic QLA21xx FC-SCSI support (v8)"
++	depends on SCSI_QLA2XXX
++	---help---
++	help here...
++
++	If you want to compile the driver as a module ( = code which can be
++	inserted in and removed from the running kernel whenever you want),
++	say M here and read <file:Documentation/modules.txt>.  The module
++	will be called qla2100.
++
++config SCSI_QLA2XXX_QLA22XX
++	tristate "QLogic QLA22xx FC-SCSI support (v8)"
++	depends on SCSI_QLA2XXX
++	---help---
++	help here...
++
++	If you want to compile the driver as a module ( = code which can be
++	inserted in and removed from the running kernel whenever you want),
++	say M here and read <file:Documentation/modules.txt>.  The module
++	will be called qla2200.
++
++config SCSI_QLA2XXX_QLA23XX
++	tristate "QLogic QLA23xx FC-SCSI support (v8)"
++	depends on SCSI_QLA2XXX
++	---help---
++	help here...
++
++	If you want to compile the driver as a module ( = code which can be
++	inserted in and removed from the running kernel whenever you want),
++	say M here and read <file:Documentation/modules.txt>.  The module
++	will be called qla2300.
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/Makefile	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,56 @@
++# Kernel makefile for 8.x series QLogic Fibre Channel driver.
++#
++EXTRA_CFLAGS += -Idrivers/scsi -I$(obj) -DUNIQUE_FW_NAME
++
++ISPTYPES := qla2100 qla2200 qla2300
++ISPDIRS := $(foreach dir, $(ISPTYPES), $(addsuffix /, $(addprefix .,$(dir))))
++
++ISP2100_FW := ql2100tp_fw.o
++ISP2200_FW := ql2200ip_fw.o
++ISP2300_FW := ql2300tpx_fw.o #ql2322tpx_fw.o
++
++COMMON_SRCS := qla_os.c qla_init.c qla_mbx.c qla_iocb.c qla_isr.c qla_xioct.c qla_inioct.c \
++		qla_dbg.c qla_sup.c qla_fo.c qla_cfg.c qla_cfgln.c qla_vendor.c
++COMMON_OBJS := $(foreach file, $(COMMON_SRCS), $(patsubst %.c, %.o, $(file)))
++
++ISP2100_DIR_SRCS := $(foreach file, $(COMMON_SRCS), $(addprefix .qla2100/,$(file)))
++ISP2100_DIR_OBJS := $(foreach file, $(COMMON_OBJS), $(addprefix .qla2100/,$(file)))
++ISP2200_DIR_SRCS := $(foreach file, $(COMMON_SRCS), $(addprefix .qla2200/,$(file)))
++ISP2200_DIR_OBJS := $(foreach file, $(COMMON_OBJS), $(addprefix .qla2200/,$(file)))
++ISP2300_DIR_SRCS := $(foreach file, $(COMMON_SRCS), $(addprefix .qla2300/,$(file)))
++ISP2300_DIR_OBJS := $(foreach file, $(COMMON_OBJS), $(addprefix .qla2300/,$(file)))
++
++PREPALL := $(shell for dir in $(ISPDIRS) ; \
++	do \
++		if [ ! -d $(obj)/$${dir} ] ; then \
++			mkdir $(obj)/$${dir} ; \
++		fi ; \
++	 	for link in $(foreach file, $(COMMON_OBJS), $(patsubst %.o, %.c, $(file))) ; \
++	 	do \
++			if [ ! -h $(obj)/$${dir}$${link} ] ; then \
++				ln -sf ../$${link} $(obj)/$${dir}$${link} ; \
++			fi ; \
++	 	done \
++	done)
++
++obj-$(CONFIG_SCSI_QLA2XXX_QLA21XX) += qla2100.o
++obj-$(CONFIG_SCSI_QLA2XXX_QLA22XX) += qla2200.o
++obj-$(CONFIG_SCSI_QLA2XXX_QLA23XX) += qla2300.o
++
++$(obj)/qla2100.o: $(PREPALL)
++$(obj)/qla2100.o: ISPTYPE := qla21xx
++$(obj)/qla2100.o: EXTRA_CFLAGS += -D$(ISPTYPE)
++
++$(obj)/qla2200.o: $(PREPALL)
++$(obj)/qla2200.o: ISPTYPE := qla22xx
++$(obj)/qla2200.o: EXTRA_CFLAGS += -D$(ISPTYPE)
++
++$(obj)/qla2300.o: $(PREPALL)
++$(obj)/qla2300.o: ISPTYPE := qla23xx
++$(obj)/qla2300.o: EXTRA_CFLAGS += -D$(ISPTYPE) -DTPX -DEXTENDED_IDS 
++
++qla2100-objs := $(ISP2100_DIR_OBJS) $(ISP2100_FW) 
++qla2200-objs := $(ISP2200_DIR_OBJS) $(ISP2200_FW) 
++qla2300-objs := $(ISP2300_DIR_OBJS) $(ISP2300_FW) 
++
++clean-files := $(ISP2100_DIR_SRCS) $(ISP2200_DIR_SRCS) $(ISP2300_DIR_SRCS)
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/README.qla2x00	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,744 @@
++                 QLogic Fibre Channel Driver
++     for Red Hat Linux 7.2, 7.3, and Advanced Server 2.1
++             and Suse Linux 7.3, and Enterprise 7
++
++Products supported: QLA22XX, QLA23XX
++
++09/10/2002
++
++Contents
++--------
++
++1. OS Support
++
++2. Supported Features
++
++3. Release History
++
++4. Saving the Driver Source to Diskette
++
++5. Installing the Driver
++
++   5.1  Building the driver from the Source
++   5.1.1. Building a Uni-Processor (UP) version of the driver
++   5.1.2. Building a Symmetric Multi-Processor(SMP) version of the
++          Driver
++   5.2  Load the Driver Manually using INSMOD or MODPROBE
++   5.3  Making a RAMDISK Image to Load the Driver
++
++6. Driver Parameters
++
++   6.1  System Parameters
++   6.1.1  Multiple LUN Support
++   6.2  NVRAM Parameters
++   6.3  Driver Command Line Parameters
++
++7. Limitations
++
++8. Additional Notes
++
++   8.1 Proc Filesystem Support
++   8.2 Co-existence of QLogic 4.x and 6.x Linux Drivers
++   8.3 Failover Support 
++   8.3.1 How to enable the  Failover support in the Driver
++   8.3.2 Using SANsurfer with QLA2XXX Driver the First Time
++   8.3.3 Configuration Changes Made via SANsurfer
++   8.4 Persistent Binding	
++
++9. Diskette Content
++
++10. Contacting QLogic
++
++
++**********************************************************************
++
++
++1. OS Support 
++-------------
++
++This driver works with Red Hat Linux 7.2, 7.3, and Advanced Server 
++2.1 and Suse Linux 7.3 and Enterprise 7. Earlier or later versions 
++of Linux may be supported but were not tested at the time of this 
++release. Refer to the SUPPORTED_KERNEL_VERSION.txt file for a list
++of kernel versions tested with this release.
++
++
++**********************************************************************
++
++
++2. Supported Features
++---------------------
++
++* FCAL - direct attach loop
++* Point-to-point
++* Fabric support
++* Initiator mode only
++* Fault recovery on down loops
++* Persistent binding 
++* Extended LUN support up to 255 LUNs
++* FC tape support
++* IPFC support
++* Non Failover and Failover capability
++
++
++**********************************************************************
++
++
++3. Release History
++------------------
++
++Please refer to Release Notes (release.txt).
++
++
++**********************************************************************
++
++
++4. Saving the Driver Source to Diskette
++---------------------------------------
++
++1. Download the failover or non-failover qla2x00src-vx.yy-*.tgz file 
++   from QLogic's website.
++
++   * Failover compressed file has suffix "fo" while non failover 
++     does not.		
++
++2. If prompted "What would you like to do with this file?" choose 
++   "Save this file to disk."
++3. Insert a blank diskette and download to the diskette directly.
++
++
++**********************************************************************
++
++
++5. Installing the Driver 
++------------------------
++
++NOTE: Refer to the file BUILD_KERNEL.txt for instructions on how 
++      to build a custom kernel with the QLogic Driver embedded.
++
++5.1  Building a Driver from the Source Code 
++-------------------------------------------
++
++From the source code, you can build a qla2200.o or qla2300.o for
++your UP or SMP system, and load the driver manually or automatically
++using a RAMDISK image during system boot time.
++
++
++5.1.1 Building a Uni-Processor (UP) Version of the Driver
++---------------------------------------------------------
++
++1. Extract the kernel-headers and kernel-sources RPM files from the 
++   first RedHat CD:
++
++       # cd /mnt/cdrom/RedHat/RPMS
++       # rpm -iv kernel-headers*.rpm (not required for Red Hat 7.3)
++       # rpm -iv kernel-source*.rpm
++
++2. Using the diskette you created in Section 4, copy the
++   qla2x00src-vx.yy-*.tgz file to /qla2x00. Follow these steps from
++   the "/" (root) directory:
++
++       # mkdir qla2x00
++       # cd qla2x00
++       # mount /mnt/floppy
++       # cp /mnt/floppy/*.tgz . (the period at the end is required)
++       # tar -xvzf *.tgz
++       # cd qlogic
++       # ./drvsetup (this will extract the source files in to the 
++                     current directory)
++
++3. Build the Driver qla2200.o and qla2300.o from the source code by
++   typing:
++
++       # make all
++
++   For SuSE Distribution:
++	
++       # make all OSVER=linux
++
++4. To load the driver manually, see section 5.2. To make a RAMDISK
++   image to load the driver during system boot time, see section 5.3.
++
++
++5.1.2. Building a Symmetric Multi-Processor (SMP) Version of the Driver
++-----------------------------------------------------------------------
++
++1. Extract the kernel-headers and kernel-source RPM files from the 
++   first RedHat CD:
++
++       # cd /mnt/cdrom/RedHat/RPMS
++       # rpm -iv kernel-headers*.rpm (not required for Red Hat 7.3)
++       # rpm -iv kernel-source*.rpm
++
++2. Using the diskette you created in Section 4, copy the
++   qla2x00src-vx.yy-*.tgz file to /qla2x00. Follow these steps from
++   the "/" (root) directory:
++
++       # mkdir qla2x00
++       # cd qla2x00
++       # mount /mnt/floppy
++       # cp /mnt/floppy/*.tgz . (the period at the end is required)
++       # tar -xvzf *.tgz
++       # cd qlogic
++       # ./drvsetup (this will extract the source files in to the
++                     current directory)
++
++3. Build the Driver qla2200.o and qla2300.o from the source code by
++   typing:
++
++       # make all SMP=1
++
++   For SuSE Distribution:
++	
++       # make all SMP=1 OSVER=linux
++
++4. To load the driver manually, see section 5.2. To make a RAMDISK 
++   image to load the driver during system boot time, see section 5.3.
++
++
++5.2  Load the Driver Manually using INSMOD or MODPROBE
++------------------------------------------------------
++
++Before loading the driver manually, first build the driver binary from
++the driver source files as described in sections 5.1.1 and 5.1.2.
++
++- To load the driver directly from the local build directory, type
++  the following:
++
++       # insmod qla2200.o
++               or
++       # insmod qla2300.o        
++
++- To load the driver using modprobe:
++
++       1. Build the driver qla2200.o and qla2300.o from the source
++          code by typing:
++
++          # make all install
++
++	  For SuSE Distribution:
++	
++       	  # make all OSVER=linux install
++
++       2. To ensure that the older driver binary included in the
++          original distribution does not interfere with the updated
++          version, please rename the old driver binary as follows:
++
++          # cd /lib/modules/<kernel_version>/kernel/drivers/addon/qla2200
++          # mv qla2200.o qla2200_rh.o
++          # mv qla2300.o qla2300_rh.o
++
++       3. Type the following to load the Driver:
++
++          # modprobe qla2200
++                  or
++          # modprobe qla2300
++
++
++5.3  Making a RAMDISK Image to Load the Driver
++----------------------------------------------
++
++1. Build the Driver binary files (see 5.1.1 and 5.1.2).
++
++2. Copy the files to:
++
++     /lib/modules/<kernel version>/kernel/drivers/scsi/
++
++
++NOTE:  To ensure that the older Driver binary included in the original
++       distribution does not interfere with the updated version, 
++       please rename the old Driver binary as follows:
++
++       # cd /lib/modules/<kernel_version>/kernel/drivers/addon/qla2200
++       # mv qla2200.o qla2200_rh.o
++       # mv qla2300.o qla2300_rh.o
++
++3. Add the following line to /etc/modules.conf.
++
++       alias scsi_hostadapter0 qla2200
++              or
++       alias scsi_hostadapter0 qla2300
++
++NOTE: Must add one entry for each HBA in the system. For example,
++      If two QLA2200 hbas are installed add the following:
++
++      alias scsi_hostadapter0 qla2200
++      alias scsi_hostadapter1 qla2200
++
++4. Type the following command:
++
++         # mkinitrd -f <ramdisk image file name> <kernel version>
++
++NOTE: This step will overwrite the original ramdisk image file if 
++      executed within the /boot directory. Specify a unique ramdisk
++      image name to preserve the original ramdisk image.
++
++       - Copy the file to /boot.
++
++   For SuSE Distribution:
++
++       - Type the following command:
++
++         # /sbin/mk_initrd
++
++       NOTE: By default, the RAMDISK images created are:
++
++         /boot/initrd
++         /boot/initrd.suse
++
++5. Configure the boot loader with the new RAMDISK image.  
++
++   For LILO:
++
++	Add "initrd=/boot/<ramdisk file name>" in 
++	/etc/lilo.conf under one of the kernel entries 
++	to use the RAMDISK image.
++  
++	Run "lilo" and reboot system. Select the kernel 
++	with the new RAMDISK image to come up.
++
++   For GRUB:
++
++	Add "initrd=/boot/<RAMDISK file name>" in 
++	/etc/grub.conf under one of the kernel entries 
++	to use the RAMDISK image.
++
++**********************************************************************
++
++
++6. Driver Parameters
++--------------------
++
++The Driver parameters are divided into System Parameters and NVRAM 
++Parameters sections.
++
++
++6.1  System Parameters
++----------------------
++
++6.1.1  Multiple LUN Support
++--------------------------
++
++Support for multiple LUNs can be configured in one of three ways. 
++Currently, the maximum number of LUNs that can be scanned for each
++device is 128.
++
++The kernel must be configured to have multiple LUN support enabled
++in order for non-zero LUNs to be configured and accessible.  Use
++"make menuconfig" (as described in step 6, section 5.1) to build a
++kernel which has the option under SCSI Support enabled to probe all
++LUNs on SCSI devices.
++
++
++NOTE:  If you have multiple adapters, set max_scsi_luns to the
++       largest number of LUNs supported by any one of these adapters.
++
++- To configure multiple LUN support during boot time, type the 
++following at the boot prompt:
++
++boot: linux max_scsi_luns=128
++
++- If the SCSI Mid-Layer is compiled as a module, add the following
++line to the /etc/modules.conf file to scan for multiple LUNs at
++each boot:
++
++options scsi_mod max_scsi_luns=128
++
++- If the SCSI Mid-Layer is not compiled as a module, the boot loader
++can be configured to scan for multiple LUNs each time the system
++boots.
++
++For LILO, perform the following steps:
++
++a) Add the following line to each of the kernel images listed in the
++   /etc/lilo.conf file:
++
++append="max_scsi_luns=128"
++
++b) Run "lilo" and reboot the system.
++
++For GRUB, perform the following steps:
++
++a) Append the max_scsi_luns parameters to each of the kernel images 
++listed in the /etc/grub.conf file. For example:
++
++kernel /vmlinux-2.4.7-10 ro root=/dev/hda2 max_scsi_luns=128
++
++b) Reboot the system.
++
++
++6.2  NVRAM Parameters
++---------------------
++
++The NVRAM features described below are hard-coded in the Driver. The 
++changes made for the particular NVRAM feature in the Fast!Util do not
++take effect unless otherwise noted.
++
++None.
++
++
++6.3  Driver Command Line Parameters
++-----------------------------------
++
++'verbose' and 'quiet' are the available command line options.
++
++ verbose - Verbose detail debug information
++
++ quiet   - Driver does not display:
++              Waiting for LIP to complete....
++              scsi%d: Topology - %s, Host Loop address 0x%x
++              scsi(%d): LIP occurred
++              scsi(%d): LIP reset occurred
++
++ Usage examples:
++
++           # insmod qla2200.o options = verbose
++           # insmod qla2300.o options = verbose
++           # insmod qla2200.o ql2xopts = quiet
++           # insmod qla2300.o ql2xopts = quiet
++
++
++**********************************************************************
++
++
++7. Limitations
++--------------
++
++	N/A
++ 
++
++**********************************************************************
++
++
++8. Additional Notes
++---------------------
++
++
++8.1  Proc Filesystem Support
++-----------------------------
++
++The /proc filesystem for the QLA2200 and QLA2300 driver can be found
++in the /proc/scsi/qla2200/ and /proc/scsi/qla2300/ directories. These 
++directories contain a file for each QLogic Fibre Channel adapter
++in the system. Each file will present information about the adapter
++and transfer statistics for each discovered LUN.
++
++
++8.2  Co-existence of QLogic 4.x and 6.x Linux Drivers
++-----------------------------------------------------
++
++The 4.x driver provides support for QLA2100, QLA2200, and QLA23xx.
++The 6.x driver supports the QLA2200 and QLA23xx only. To make the
++drivers "co-exist", perform the following:
++
++  Option 1.  4.x support for QLA2100
++             6.x support for QLA2200 and QLA23xx
++
++	 o Remove QLA2200/QLA2300/QLA2312 support from the 4.x series
++           driver:
++
++	 - Edit the qla2x00.c file
++
++	 - Look for the following line:
++
++		{"QLA2300 ", QLA2300_DEVICE_ID,           MAX_BUSES,
++
++	   OR
++
++		{"QLA2312 ", QLA2312_DEVICE_ID,           MAX_BUSES,
++
++	 - Above the found line, add this line:
++
++	 	 #if 0
++
++	 - The resulting lines should read as:
++
++	 	 #if 0
++	 	 {"QLA2300 ", QLA2300_DEVICE_ID,           MAX_BUSES,
++
++	   OR
++
++	 	 #if 0
++	 	 {"QLA2312 ", QLA2312_DEVICE_ID,           MAX_BUSES,
++
++	 - Look for the following line:
++
++	 	 {"QLA2100 ", QLA2100_DEVICE_ID,           MAX_BUSES,
++
++	 - Above the found line, add this line:
++
++	 	 #endif
++
++	 - The resulting lines should read as:
++
++	 	 #endif
++	 	 {"QLA2100 ", QLA2100_DEVICE_ID,           MAX_BUSES,
++
++  Option 2.  4.x support for QLA2100 and QLA2200
++             6.x support for QLA23xx
++
++         o Remove QLA2300/QLA2312 support from the 4.x series driver:
++
++	 - Edit the qla2x00.c file
++
++	 - Look for the following line:
++
++		{"QLA2300 ", QLA2300_DEVICE_ID,           MAX_BUSES,
++
++	   OR
++
++		{"QLA2312 ", QLA2312_DEVICE_ID,           MAX_BUSES,
++
++	 - Above the found line, add this line:
++
++	 	 #if 0
++
++	 - The resulting lines should read as:
++
++	 	 #if 0
++	 	 {"QLA2300 ", QLA2300_DEVICE_ID,           MAX_BUSES,
++
++	   OR
++
++	 	 #if 0
++	 	 {"QLA2312 ", QLA2312_DEVICE_ID,           MAX_BUSES,
++
++	 - Look for the following line:
++
++	 	 {"QLA2200 ", QLA2200_DEVICE_ID,           MAX_BUSES,
++
++	 - Above the found line, add this line:
++
++	 	 #endif
++
++	 - The resulting lines should read as:
++
++	 	 #endif
++	 	 {"QLA2200 ", QLA2200_DEVICE_ID,           MAX_BUSES,
++
++
++8.3 Failover Support
++---------------------
++
++8.3.1 How to enable the  Failover support in the Driver
++-------------------------------------------------------
++
++Failover support can be enabled in the QLA2XXX driver by enabling the
++macro MPIO_SUPPORT in qla_settings.h file ie
++
++#define MPIO_SUPPORT                    1
++
++Note: The failover distribution package, qla2x00src-vx.yy.zz-fo.tgz, 
++has the above macro enabled by default.
++
++
++8.3.2 Using SANsurfer with QLA2XXX Driver the First Time
++________________________________________________________
++
++1. To work with SANsurfer, the driver should always be built
++   with MPIO_SUPPORT set to 1 in qla_settings.h.
++
++2. Add the following parameter in modules.conf file:
++
++   options qla2200 ConfigRequired=1 ql2xopts=
++             or
++   options qla2300 ConfigRequired=1 ql2xopts=
++
++3. Now you can load the driver and SANsurfer.
++
++
++8.3.3 Configuration Changes Made via SANsurfer
++--------------------------------------------
++
++1. LUN Masking
++
++   For the new LUN masking configuration to take effect, the
++   driver must be reloaded.  The following is an example of
++   the sequence of actions to take:
++
++   - Load the driver:
++
++     modprobe <driver>
++
++   - Load the qlremote agent.
++
++   - Start the GUI and connect it to the destination system.
++
++   - Make LUN masking changes.
++
++   - Disconnect the host from GUI and stop qlremote agent.
++
++   - Unload the driver:
++
++     modprobe -r <driver>
++
++   - Reload the driver:
++
++     modprobe <driver>
++
++   - Load qlremote agent again.
++
++   - Start the GUI and connect it to the destination system.
++
++   Now you should see the updated LUN masking configuration.
++
++Please note that when using modprobe to load the driver, the
++length of the option line specified in /etc/modules.conf file
++has a limit of 2K characters. Any longer option line will cause
++a string overflow error from modprobe.
++
++
++8.4 Persistent Binding
++______________________
++
++
++The Persistent Binding information consists of some adapter parameter
++entries along with some target entries. However, the Linux entries 
++have been shorten to save space on the command line. Currently, there
++is no limit on the size of the command line when using modprobe. But,
++if you embedded the driver in the kernel you are using lilo that has 
++a string size limitation.
++
++Persistent Binding  can be specified in two ways. Manually or using
++SANsurfer. We recommend using SANsurfer for ease of use. Reference 
++section 8.3.3 for additonal information about SANsurfer. The 
++following is the procedure to manually add persistent binding 
++commands: 
++
++The driver displays the current configuration when the displayConfig
++command line option is specified. The persistent binding 
++configuration is found in /var/log/messages file. It prints the 
++configuration information in the format required by the driver.
++The best way to extract configuration messages is to use grep and 
++direct the output to a file. You need to remove the Linux timestamp at
++the beginning of each message and combine them together on single line.
++For example
++        #insmod qla2200 displayConfig=1
++        #grep "scsi-qla" /var/log/messages > /tmp/info.cfg
++
++The format of the persistent binding commands is as follows: 
++
++Device descriptions
++
++scsi-qla<#>-adapter-port=<adapter port name value>;
++The designated by qla<#>, where the <#> is the adapter instance number.
++
++The parameter specifies the FC port name to be used for the adapter.
++where <adapter port name value> is the FC port name value in hexa-
++    decimal format.  If this entry is not specified in the conf file,
++    the default value is the adapter's port name as saved in the NVRAM.
++Example:
++scsi-qla00-adapter-port=210000e08b01158d\;
++
++host adapter instance 0 has a portname of 210000e08b01158d
++
++scsi-qla<#1>-tgt-<#2>-di-<#3>-node=<device FC name>;
++This parameter associates the specified <device FC name> with the
++SCSI target ID value specified by <#2> and a device id value specified
++by <#3>. where <device FC name> type is the FC node name of the 
++device, and <#2> is the SCSI target ID to be assigned to the device 
++and <#3> is the device unique id.
++Where
++   <#1>   Specifies the adapter instance number   
++   <#2>   Specifies the SCSI ID of Target
++   <#3>   Specifies the path/device id	
++
++scsi-qla<#1>-tgt-<#2>-di-<#3>-port=<device FC name>;
++This parameter associates the specified <device FC name> with the
++SCSI target ID value specified by <#2> and a device id value specified
++by <#3>. where <device FC name> type is the FC port 
++Where
++   <#1>   Specifies the adapter instance number   
++   <#2>   Specifies the SCSI ID of Target
++   <#3>   Specifies the path/device id	(always 0 for non-failover)
++
++name of the device, and <#2> is the SCSI target ID to be assigned to 
++the device and <#3> is the device unique id.
++
++scsi-qla<#1>-tgt-<#2>-di-<#3>-disabled=<256 bit mask>;
++This parameter associates the specified <256 bit mask> with the
++SCSI target ID value specified by <#2> and a device id value specified
++by <#3>. 
++
++Where
++   <#1>   Specifies the adapter instance number   
++   <#2>   Specifies the SCSI ID of Target
++   <#3>   Specifies the path/device id	
++
++<256 bit mask>
++msb                                                            lsb
++ 000000000000000000000000000000000000000000000000000000000000000F
++
++the mask above will make the first four luns, 3, 2, 1, and 0 of a 
++given Target disabled on that target/path.
++
++This mask specification is heavily type checked to be a sequence of
++64 hex digits.
++
++**********************************************************************
++
++
++9. Diskette Content 
++--------------------
++
++The qla2x00src-vx.yy.zz-*.tgz files can be extracted into the 
++following files:
++
++       listops.h
++       Makefile.kernel
++       Config.in
++       makefile
++       qla_settings.h
++       qla_debug.h
++       ql2100_fw.h
++       ql2200_fw.h
++       ql2300_fw.h
++       ql2200ip_fw.h
++       ql2300ip_fw.h
++       qla2100.c
++       qla2200.c
++       qla2300.c
++       qla2x00.c
++       qla2x00.h
++       qla2x00_ioctl.c
++       qla_vendor.c
++       qla_cfg.c
++       qla_cfgln.c
++       qla_fo.c
++       qla_fo.cfg 
++       qla_inioct.c
++       qla_ip.c
++       qla_mbx.c
++       qla_mbx.h
++       exioctln.h
++       exioct.h
++       inioct.h
++       qla_cfg.h
++       qla_fo.h
++       qla_gbl.h
++       qla_ip.h
++       qlfo.h
++       qlfolimits.h
++       qlfoln.h
++       qla_version.h
++       revision.notes - Revision history
++       release.txt - Release notes
++       README.qla2x00 - This file
++
++
++**********************************************************************
++
++
++10. Contacting QLogic 
++---------------------
++
++Please visit QLogic's website (www.qlogic.com). On this site you will
++find product information, our latest drivers, and links for technical
++assistance if needed.
++
++
++======================================================================
++
++
++    Copyright (c) 2003 QLogic Corporation. All rights reserved 
++    worldwide. 
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/exioct.h	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,947 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++/*
++ * File Name: exioct.h
++ *
++ * San/Device Management Ioctl Header
++ * File is created to adhere to Solaris requirement using 8-space tabs.
++ *
++ * !!!!! PLEASE DO NOT REMOVE THE TABS !!!!!
++ * !!!!! PLEASE NO SINGLE LINE COMMENTS: // !!!!!
++ * !!!!! PLEASE NO MORE THAN 80 CHARS PER LINE !!!!!
++ *
++ * Revision History:
++ *
++ * Rev. 0	March 1, 2000
++ * YPL	- Created.
++ *
++ * Rev. 1	March 2, 2000
++ * RLU	- Updated with latest definitions.  Added more comments.
++ *
++ * Rev. 2	May 16, 2000		    
++ * SP	- Updated definitions and changed structures (March 27, 2000)
++ * SP   - Addded structures 
++ *
++ * Rev. 3	June 1, 2000		     
++ * THL	- Made major changes to include all changes talked in our meeting.
++ *
++ * Rev. 4	June 5, 2000
++ * RLU	- Added new definitions/structures for SDM_GET_AEN and SDM_REG_AEN 
++ *	  functions.
++ *	- Major definition/structure name changes as discussed in meetings.
++ *	- Deleted duplicated command code and structure definitions.
++ *
++ * Rev. 4.1	June 14, 2000
++ * WTR  - Moved Solaris specific defines to exioctso.h. This makes it
++ *	  possible for application developers to include only exioct.h
++ *	  in their Solaris application development.
++ *
++ * Rev. 4.2	June 15, 2000
++ * THL  - Changed UINT16 and UINT32 back to WORD and DWORD for NT; otherwise,
++ *	  NT will get a compilation error for redefining UINT16 and UINT32.
++ *	  Added RISC_CODE/FLASH_RAM macros.
++ *
++ * Rev. 4.3	June 22, 2000
++ * THL  - Changed SDM_FC_ADDR according to External Ioctls document.
++ *	  Added SDM_DEF_TYPE macros.
++ *
++ * Rev. 4.4	June 22, 2000
++ * THL  - Moved NT specific defines to exioctnt.h.
++ *
++ * Rev. 4.5     August 15, 2000
++ * SP   - Rolled back some changes made by Todd R.
++ *	  Kept new status code SDM_STATUS_NO_MEMORY
++ *	  Port types fabric and tape device 
++ *
++ * Rev. 4.7     Sep 6, 2000
++ * YPL  - Replace SDM_ with EXT_, _ISP with _CHIP.
++ *	  Add vendor specific statuses, device update, config defines.
++ *
++ * Rev. 5.0     Sep 13, 2000
++ * YPL  - Update version to 5, remove max defines, make port type bit.
++ *	  Change HBA_PORT_PROPERTY to have bus/target/lun defined as UINT16
++ *
++ * Rev. 5.1     Sep 22, 2000
++ * THL  - Add destination address for specify scsi address or FC address.
++ *	  Remove "not support" comment and add more macros.
++ *
++ * Rev. 5.2     Sep 27, 2000
++ * THL  - Add new macros and structure for add and swap target device.
++ *	  Create new data structure for get port database.
++ * TLE  - Merge changes needed for FailOver
++ *
++ * Rev. 5.3     Sep 29, 2000
++ * THL  - Add access mode for NVRAM.
++ * 
++ * Rev. 5.4     Oct 03, 2000
++ * THL  - Add EXT_SC_GET_FC_STATISTICS.
++ *
++ * Rev. 5.5	Oct 18, 2000
++ * THL  - Remove duplicated EXT_DEF_ADDR_MODE_32 and EXT_DEF_ADDR_MODE_16.
++ *	  Reformat new data structures and defines.
++ *
++ * Rev. 5.6	Oct 19, 2000
++ * RLU	- Changed file name from ExIoct.h to exioct.h.
++ *	- Added definition of EXT_RNID_DATA for API implementation.
++ *	- Reformat some lines to conform to the format agreed
++ *	  upon in IOCTL meeting (and mentioned at beginning of
++ *	  this file).
++ *
++ * Rev. 5.7 Oct 25, 2000
++ * BN   - Added LUN bitmask structure and macros
++ *
++ * Rev. 5.8 Oct 25, 2000
++ * BN   - Added EXT_CC_DRIVER_PROP define
++ * 
++ * Rev. 5.9 Oct 26, 2000
++ * BN   - Sync with UnixApi project
++ * 
++ * Rev. 5.10 Oct 30, 2000
++ * BN   - Remove not needed #define for EXT_CC_DRIVER_PROP
++ *	- Add EXT_ to IS_LUN_BIT_SET, SET_LUN_BIT, CLR_LUN_BIT
++ * 
++ * Rev. 5.11 Nov 1, 2000
++ * BN   - Increased [1] of EXT_DEVICEDATA to [EXT_MAX_TARGET]
++ * TLE  - Decreased [EXT_MAX_TARGET] of EXT_DEVICEDATA to [1]
++ * 
++ * Rev. 5.12	Nov 7, 2000
++ * RLU	- Deleted EXT_DEF_MAX_LUNS define and changed all references
++ *	  to it to use EXT_MAX_LUN.
++ *	- Changed the revision numbers for the last 2 revisions down
++ *	  to use 5.x.
++ * 
++ * Rev. 5.13	Nov 14, 2000
++ * WTR	- Fixed pointer referencing problem in the LUN_BIT_MASK macros.
++ *	  Updated comment at bit mask definition.
++ *
++ * Rev. 5.14	Dec 6, 2000
++ * THL	- Added Local and LoopID to discovered port/target property.
++ * 
++ * Rev. 5.15	Dec 24, 2000
++ * YPL	- Enhance port connection modes and driver attrib
++ * 
++ * Rev. 5.16	Dec 27, 2000
++ * TLE  - Add BufferHandle member to _EXT_ASYNC_EVENT data structure for
++ *	  SCTP support
++ * 
++ * Rev. 5.17	Jan 10, 2001
++ * YPL  - Add edtov, ratov & fabric name in port property
++ * 
++ * Rev. 5.18	Feb 28, 2001
++ * YPL  - Remove SCTP fields and add fabric parameter flags in port property
++ * 
++ * Rev. 5.19	Mar 08, 2001
++ * YPL  - Remove SCTP fields from hba port prop
++ * 
++ * Rev. 5.20	June 11, 2001
++ * YPL  - Change to reserved fields and add fabric name field in port property
++ * 
++ * Rev. 5.21	June 29, 2001
++ * YPL  - Merge in changes decided long time ago (use _DEF_ for defines) &
++ *	  reserved some EXT_CC for legacy ioctls, plus add RNID dataformat
++ *	  values definition
++ * 
++ * Rev. 5.21    Sep 18, 2001
++ * SP   - Added New return status codes
++ *
++ * Rev.	5.22	Oct 23, 2001
++ * SP	- Change reserve fields to add fields to EXT_HBA_PORT
++ *	  Added port speeds and FC4Types fields  and related definitions
++ *
++ * Rev.	5.23	Dec 04, 2001
++ * RL	- Added port speed value definition.
++ *
++ * Rev. 5.24	Jan 20, 2002
++ * JJ	- Added PCI device function bits field in EXT_CHIP structure.
++ *
++ * Rev. 5.25	Feb 04, 2002
++ * JJ	- Added 16 bytes CDB support.  Also added SenseLength field
++ *	  in SCSI_PASSTHRU structure.
++ *
++ * Rev. 5.26	Feb 12, 2002
++ * AV	- Changed type size used in SCSI_PASSTHRU structure definitions
++ *	  to re-enable gcc's automatic structure padding for backward
++ *	  compatibility.
++ *
++ * Rev. 5.27	Mar 01, 2002
++ * RL	- Added new SC value for SCSI3 command passthru.
++ *
++ * Rev. 5.28	Dec 09, 2002
++ * Sync up with NT version of exioct.h:
++ * TLE	- Modify EXT_RNID_REQ data structure for IBM SendRNID workaround
++ * YPL	- Add firmware state (online diagnostics)
++ * YPL	- Add ELS PS
++ * YPL	- Add els event, # of els buffers & size
++ */
++
++#ifndef	_EXIOCT_H
++#define	_EXIOCT_H
++
++/*
++ * NOTE: the following version defines must be updated each time the
++ *	 changes made may affect the backward compatibility of the
++ *	 input/output relations of the SDM IOCTL functions.
++ */
++#define	EXT_VERSION					5
++
++
++/*
++ * OS independent General definitions
++ */
++#define	EXT_DEF_SIGNATURE_SIZE				8
++#define	EXT_DEF_WWN_NAME_SIZE				8
++#define	EXT_DEF_WWP_NAME_SIZE				8
++#define	EXT_DEF_SERIAL_NUM_SIZE				4
++#define	EXT_DEF_PORTID_SIZE				4
++#define	EXT_DEF_PORTID_SIZE_ACTUAL			3
++#define	EXT_DEF_MAX_STR_SIZE				128
++#define	EXT_DEF_SCSI_PASSTHRU_CDB_LENGTH		16
++
++#define	EXT_DEF_ADDR_MODE_32				1
++#define	EXT_DEF_ADDR_MODE_64				2
++
++/*
++ * ***********************************************************************
++ * X OS type definitions
++ * ***********************************************************************
++ */
++#ifdef _MSC_VER						/* NT */
++
++#pragma pack(1)
++#include "ExIoctNT.h"
++
++#elif defined(linux)					/* Linux */
++
++#include "exioctln.h"
++
++#elif defined(sun) || defined(__sun)			/* Solaris */
++
++#include "exioctso.h"
++
++#endif
++
++/*
++ * ***********************************************************************
++ * OS dependent General configuration defines
++ * ***********************************************************************
++ */
++#define	EXT_DEF_MAX_HBA                 EXT_DEF_MAX_HBA_OS
++#define	EXT_DEF_MAX_BUS                 EXT_DEF_MAX_BUS_OS
++#define	EXT_DEF_MAX_TARGET              EXT_DEF_MAX_TARGET_OS
++#define	EXT_DEF_MAX_LUN                 EXT_DEF_MAX_LUN_OS
++
++/*
++ * ***********************************************************************
++ * Common header struct definitions for San/Device Mgmt
++ * ***********************************************************************
++ */
++typedef struct {
++	UINT64    Signature;			/* 8 chars string */
++	UINT16    AddrMode;			/* 2 */
++	UINT16    Version;			/* 2 */
++	UINT16    SubCode;			/* 2 */
++	UINT16    Instance;			/* 2 */
++	UINT32    Status;			/* 4 */
++	UINT32    DetailStatus;			/* 4 */
++	UINT32    Reserved1;			/* 4 */
++	UINT32    RequestLen;			/* 4 */
++	UINT32    ResponseLen;			/* 4 */
++	UINT64    RequestAdr;			/* 8 */
++	UINT64    ResponseAdr;			/* 8 */
++	UINT16    HbaSelect;			/* 2 */
++	UINT16    VendorSpecificStatus[11];	/* 22 */
++	UINT64    VendorSpecificData;		/* 8 chars string */
++} EXT_IOCTL, *PEXT_IOCTL;			/* 84 / 0x54 */
++
++/*
++ * Addressing mode used by the user application
++ */
++#define	EXT_ADDR_MODE			EXT_ADDR_MODE_OS
++
++/*
++ * Status.  These macros are being used for setting Status field in
++ * EXT_IOCTL structure.
++ */
++#define	EXT_STATUS_OK				0
++#define	EXT_STATUS_ERR				1
++#define	EXT_STATUS_BUSY				2
++#define	EXT_STATUS_PENDING			3
++#define	EXT_STATUS_SUSPENDED			4
++#define	EXT_STATUS_RETRY_PENDING		5
++#define	EXT_STATUS_INVALID_PARAM		6
++#define	EXT_STATUS_DATA_OVERRUN			7
++#define	EXT_STATUS_DATA_UNDERRUN		8
++#define	EXT_STATUS_DEV_NOT_FOUND		9
++#define	EXT_STATUS_COPY_ERR			10
++#define	EXT_STATUS_MAILBOX			11
++#define	EXT_STATUS_UNSUPPORTED_SUBCODE		12
++#define	EXT_STATUS_UNSUPPORTED_VERSION		13
++#define	EXT_STATUS_MS_NO_RESPONSE		14
++#define	EXT_STATUS_SCSI_STATUS			15
++#define	EXT_STATUS_BUFFER_TOO_SMALL		16
++#define	EXT_STATUS_NO_MEMORY			17
++#define	EXT_STATUS_UNKNOWN			18
++#define	EXT_STATUS_UNKNOWN_DSTATUS		19
++#define	EXT_STATUS_INVALID_REQUEST		20
++
++#define EXT_STATUS_DEVICE_NOT_READY		21
++#define EXT_STATUS_DEVICE_OFFLINE		22
++#define EXT_STATUS_HBA_NOT_READY		23
++#define EXT_STATUS_HBA_QUEUE_FULL		24
++
++/*
++ * Detail Status contains the SCSI bus status codes.
++ */
++
++#define	EXT_DSTATUS_GOOD			0x00
++#define	EXT_DSTATUS_CHECK_CONDITION		0x02
++#define	EXT_DSTATUS_CONDITION_MET		0x04
++#define	EXT_DSTATUS_BUSY			0x08
++#define	EXT_DSTATUS_INTERMEDIATE		0x10
++#define	EXT_DSTATUS_INTERMEDIATE_COND_MET	0x14
++#define	EXT_DSTATUS_RESERVATION_CONFLICT	0x18
++#define	EXT_DSTATUS_COMMAND_TERMINATED		0x22
++#define	EXT_DSTATUS_QUEUE_FULL			0x28
++
++/*
++ * Detail Status contains the needed Response buffer space(bytes)
++ * when Status = EXT_STATUS_BUFFER_TOO_SMALL
++ */
++
++
++/*
++ * Detail Status contains one of the following codes
++ * when Status = EXT_STATUS_INVALID_PARAM or
++ *             = EXT_STATUS_DEV_NOT_FOUND
++ */
++#define EXT_DSTATUS_NOADNL_INFO			0x00
++#define EXT_DSTATUS_HBA_INST			0x01
++#define EXT_DSTATUS_TARGET			0x02
++#define EXT_DSTATUS_LUN				0x03
++#define EXT_DSTATUS_REQUEST_LEN			0x04
++#define EXT_DSTATUS_PATH_INDEX			0x05
++
++/*
++ * Currently supported DeviceControl / ioctl command codes
++ */
++#define	EXT_CC_QUERY			EXT_CC_QUERY_OS
++#define	EXT_CC_SEND_FCCT_PASSTHRU	EXT_CC_SEND_FCCT_PASSTHRU_OS
++#define	EXT_CC_REG_AEN			EXT_CC_REG_AEN_OS
++#define	EXT_CC_GET_AEN			EXT_CC_GET_AEN_OS
++#define	EXT_CC_SEND_ELS_RNID		EXT_CC_SEND_ELS_RNID_OS
++#define	EXT_CC_SEND_SCSI_PASSTHRU	EXT_CC_SCSI_PASSTHRU_OS
++#define	EXT_CC_SEND_ELS_PASSTHRU	EXT_CC_SEND_ELS_PASSTHRU_OS
++
++/*
++ * HBA port operations
++ */
++#define	EXT_CC_GET_DATA			EXT_CC_GET_DATA_OS
++#define	EXT_CC_SET_DATA			EXT_CC_SET_DATA_OS
++
++
++/* Reserved command codes. */
++#define	EXT_CC_RESERVED0A		EXT_CC_RESERVED0A_OS    
++#define	EXT_CC_RESERVED0B		EXT_CC_RESERVED0B_OS    
++#define	EXT_CC_RESERVED0C		EXT_CC_RESERVED0C_OS    
++#define	EXT_CC_RESERVED0D		EXT_CC_RESERVED0D_OS    
++#define	EXT_CC_RESERVED0E		EXT_CC_RESERVED0E_OS    
++#define	EXT_CC_RESERVED0F		EXT_CC_RESERVED0F_OS    
++#define	EXT_CC_RESERVED0G		EXT_CC_RESERVED0G_OS    
++#define	EXT_CC_RESERVED0H		EXT_CC_RESERVED0H_OS    
++#define	EXT_CC_RESERVED0I		EXT_CC_RESERVED0I_OS
++#define	EXT_CC_RESERVED0J		EXT_CC_RESERVED0J_OS
++#define	EXT_CC_RESERVED0Z		EXT_CC_RESERVED0Z_OS
++
++
++/*
++ * ***********************************************************************
++ * EXT_IOCTL SubCode definition.
++ * These macros are being used for setting SubCode field in EXT_IOCTL
++ * structure.
++ * ***********************************************************************
++ */
++
++/*
++ * Query.
++ * Uses with EXT_QUERY as the ioctl code.
++ */
++#define	EXT_SC_QUERY_HBA_NODE		1
++#define	EXT_SC_QUERY_HBA_PORT		2
++#define	EXT_SC_QUERY_DISC_PORT		3
++#define	EXT_SC_QUERY_DISC_TGT		4
++#define	EXT_SC_QUERY_DISC_LUN		5	/* Currently Not Supported */
++#define	EXT_SC_QUERY_DRIVER		6
++#define	EXT_SC_QUERY_FW			7
++#define	EXT_SC_QUERY_CHIP		8
++
++/*
++ * Sub codes for Get Data.
++ * Use in combination with EXT_GET_DATA as the ioctl code
++ */
++/* 1 - 99 Common */
++#define	EXT_SC_GET_SCSI_ADDR		1	/* Currently Not Supported */
++#define	EXT_SC_GET_ERR_DETECTIONS	2	/* Currently Not Supported */
++#define	EXT_SC_GET_STATISTICS		3
++#define	EXT_SC_GET_BUS_MODE		4	/* Currently Not Supported */
++#define	EXT_SC_GET_DR_DUMP_BUF		5	/* Currently Not Supported */
++#define	EXT_SC_GET_RISC_CODE		6	/* Currently Not Supported */
++#define	EXT_SC_GET_FLASH_RAM		7	/* for backward compatible */
++
++/* 100 - 199 FC_INTF_TYPE */
++#define	EXT_SC_GET_LINK_STATUS		101	/* Currently Not Supported */
++#define	EXT_SC_GET_LOOP_ID		102	/* Currently Not Supported */
++#define	EXT_SC_GET_LUN_BITMASK		103
++#define	EXT_SC_GET_PORT_DATABASE	104	/* Currently Not Supported */
++#define	EXT_SC_GET_PORT_DATABASE_MEM	105	/* Currently Not Supported */
++#define	EXT_SC_GET_PORT_SUMMARY		106
++#define	EXT_SC_GET_POSITION_MAP		107
++#define	EXT_SC_GET_RETRY_CNT		108	/* Currently Not Supported */
++#define	EXT_SC_GET_RNID			109	
++#define	EXT_SC_GET_RTIN			110	/* Currently Not Supported */
++#define	EXT_SC_GET_FC_LUN_BITMASK	111
++#define	EXT_SC_GET_FC_STATISTICS	112	/* for backward compatible */
++
++/* 200 - 299 SCSI_INTF_TYPE */
++#define	EXT_SC_GET_SEL_TIMEOUT		201	/* Currently Not Supported */
++
++
++/* 
++ * Sub codes for Set Data.
++ * Use in combination with EXT_SET_DATA as the ioctl code
++ */
++/* 1 - 99 Common */
++#define	EXT_SC_RST_STATISTICS		3
++#define	EXT_SC_RESERVED_BC7		7
++
++/* 100 - 199 FC_INTF_TYPE */
++#define	EXT_SC_SET_LUN_BITMASK		103
++#define	EXT_SC_SET_RNID			109	
++#define	EXT_SC_SET_FC_LUN_BITMASK	111
++#define	EXT_SC_RESERVED_BC112	112
++#define	EXT_SC_RESERVED_BC113	113
++
++/* 200 - 299 SCSI_INTF_TYPE */
++
++/* SCSI passthrough */
++#define	EXT_SC_SEND_SCSI_PASSTHRU	0
++#define	EXT_SC_SEND_FC_SCSI_PASSTHRU	1
++#define	EXT_SC_SCSI3_PASSTHRU		2
++
++/* Read */
++
++/* Write */
++
++/* Reset */
++
++/* Request struct */
++
++
++/*
++ * Response struct
++ */
++typedef struct _EXT_HBA_NODE {
++	UINT8     WWNN         [EXT_DEF_WWN_NAME_SIZE];	/* 8 */
++	UINT8     Manufacturer [EXT_DEF_MAX_STR_SIZE];	/* 128; "QLOGIC" */
++	UINT8     Model        [EXT_DEF_MAX_STR_SIZE];	/* 128; "QLA2200" */
++	UINT8     SerialNum    [EXT_DEF_SERIAL_NUM_SIZE];/* 4;  123  */
++	UINT8     DriverVersion[EXT_DEF_MAX_STR_SIZE];	/* 128; "7.4.3" */
++	UINT8     FWVersion    [EXT_DEF_MAX_STR_SIZE];	/* 128; "2.1.6" */
++
++	/* The following field is currently not supported */
++	UINT8     OptRomVersion[EXT_DEF_MAX_STR_SIZE];	/* 128; "1.44" */
++
++	UINT16    PortCount;				/* 2; 1 */
++	UINT16    InterfaceType;			/* 2; FC/SCSI */
++
++	/* The following two fields are not yet supported */
++	UINT32    DriverAttr;				/* 4 */
++	UINT32    FWAttr;				/* 4 */
++
++	UINT32    Reserved[8];				/* 32 */
++} EXT_HBA_NODE, *PEXT_HBA_NODE;				/* 696 */
++
++/* HBA node query interface type */
++#define	EXT_DEF_FC_INTF_TYPE			1
++#define	EXT_DEF_SCSI_INTF_TYPE			2
++
++typedef struct _EXT_HBA_PORT {
++	UINT8     WWPN[EXT_DEF_WWN_NAME_SIZE];	/* 8 */
++	UINT8     Id  [EXT_DEF_PORTID_SIZE];	/* 4; 3 bytes valid Port Id. */
++	UINT16    Type;				/* 2; Port Type */
++	UINT16    State;			/* 2; Port State */
++	UINT16    Mode;				/* 2 */
++	UINT16    DiscPortCount;		/* 2 */
++	UINT16    DiscPortNameType;		/* 2; USE_NODE_NAME or */
++						/* USE_PORT_NAME */
++	UINT16    DiscTargetCount;		/* 2 */
++	UINT16    Bus;				/* 2 */
++	UINT16    Target;			/* 2 */
++	UINT16    Lun;				/* 2 */
++						/* 2 */
++	UINT8     PortSupportedFC4Types;
++	UINT8     PortActiveFC4Types;
++	UINT8     FabricName[EXT_DEF_WWN_NAME_SIZE];	/* 8 */
++
++						/* 2*/
++	UINT8     PortSupportedSpeed;
++	UINT8     PortSpeed;
++	UINT16    Unused;			/* 2 */
++	UINT32    Reserved[3];			/* 12 */
++} EXT_HBA_PORT, *PEXT_HBA_PORT;			/* 56 */
++
++/* port type */
++#define	EXT_DEF_INITIATOR_DEV		1
++#define	EXT_DEF_TARGET_DEV		2
++#define	EXT_DEF_TAPE_DEV		4
++#define	EXT_DEF_FABRIC_DEV		8
++
++
++/* HBA port state */
++#define	EXT_DEF_HBA_OK			0
++#define	EXT_DEF_HBA_SUSPENDED		1
++#define	EXT_DEF_HBA_LOOP_DOWN		2
++
++/* Connection mode */
++#define	EXT_DEF_UNKNOWN_MODE		0
++#define	EXT_DEF_P2P_MODE		1
++#define	EXT_DEF_LOOP_MODE		2
++#define	EXT_DEF_FL_MODE			3
++#define	EXT_DEF_N_MODE			4
++
++/* Valid name type for Disc. port/target */
++#define	EXT_DEF_USE_NODE_NAME		1
++#define	EXT_DEF_USE_PORT_NAME		2
++
++/* FC4 type values */
++#define EXT_DEF_FC4_TYPE_SCSI		0x1
++#define EXT_DEF_FC4_TYPE_IP		0x2
++#define EXT_DEF_FC4_TYPE_SCTP		0x4
++#define EXT_DEF_FC4_TYPE_VI		0x8
++
++/* Port Speed values */
++#define EXT_DEF_PORTSPEED_1GBIT		1
++#define EXT_DEF_PORTSPEED_2GBIT		2
++#define EXT_DEF_PORTSPEED_10GBIT	4
++
++typedef struct _EXT_DISC_PORT {
++	UINT8     WWNN[EXT_DEF_WWN_NAME_SIZE];	/* 8 */
++	UINT8     WWPN[EXT_DEF_WWN_NAME_SIZE];	/* 8 */
++	UINT8     Id  [EXT_DEF_PORTID_SIZE];
++					/* 4; last 3 bytes used. big endian */
++
++	/* The following fields currently are not supported */
++	UINT16    Type;				/* 2; Port Type */
++	UINT16    Status;			/* 2; Port Status */
++	UINT16    Bus;				/* 2; n/a for Solaris */
++
++	UINT16    TargetId;			/* 2 */
++	UINT8     Local;			/* 1; Local or Remote */
++	UINT8     ReservedByte[1];		/* 1 */
++	
++	UINT16    LoopID;			/* 2; Loop ID */
++	
++	UINT32    Reserved[7];			/* 28 */
++} EXT_DISC_PORT, *PEXT_DISC_PORT;		/* 60 */
++
++typedef struct _EXT_DISC_TARGET {
++	UINT8     WWNN[EXT_DEF_WWN_NAME_SIZE];	/* 8 */
++	UINT8     WWPN[EXT_DEF_WWN_NAME_SIZE];	/* 8 */
++	UINT8     Id  [EXT_DEF_PORTID_SIZE];
++					/* 4; last 3 bytes used. big endian */
++
++	/* The following fields currently are not supported */
++	UINT16    Type;				/* 2; Target Type */
++	UINT16    Status;			/* 2; Target Status*/
++	UINT16    Bus;				/* 2; n/a for Solaris */
++
++	UINT16    TargetId;			/* 2 */
++
++	/* The following field is currently not supported */
++	UINT16    LunCount;			/* 2; n/a for nt */
++
++	UINT8     Local;			/* 1; Local or Remote */
++	UINT8     ReservedByte[1];		/* 1 */
++	
++	UINT16    LoopID;			/* 2; Loop ID */
++	
++	UINT16    Reserved[13];			/* 26 */
++} EXT_DISC_TARGET, *PEXT_DISC_TARGET;		/* 60 */
++
++/* The following command is not supported */
++typedef struct _EXT_DISC_LUN {			/* n/a for nt */
++	UINT16    Id;				/* 2 */
++	UINT16    State;			/* 2 */
++	UINT16    IoCount;			/* 2 */
++	UINT16    Reserved[15];			/* 30 */
++} EXT_DISC_LUN, *PEXT_DISC_LUN;			/* 36 */
++
++
++/* SCSI address */
++typedef struct _EXT_SCSI_ADDR {
++	UINT16    Bus;				/* 2 */
++	UINT16    Target;			/* 2 */
++	UINT16    Lun;				/* 2 */
++	UINT16    Padding[5];			/* 10 */
++} EXT_SCSI_ADDR, *PEXT_SCSI_ADDR;		/* 16 */
++
++
++/* Fibre Channel address */
++typedef struct _EXT_FC_ADDR {
++	union {
++		UINT8    WWNN[EXT_DEF_WWN_NAME_SIZE];	/* 8 */
++		UINT8    WWPN[EXT_DEF_WWN_NAME_SIZE];	/* 8 */
++		UINT8    Id[EXT_DEF_PORTID_SIZE];	/* 4 */
++	} FcAddr;
++	UINT16    Type;					/* 2 */
++	UINT16    Padding[2];				/* 2 */
++} EXT_FC_ADDR, *PEXT_FC_ADDR;				/* 24 */
++
++#define	EXT_DEF_TYPE_WWNN                   1
++#define	EXT_DEF_TYPE_WWPN                   2
++#define	EXT_DEF_TYPE_PORTID                 3
++#define	EXT_DEF_TYPE_FABRIC                 4
++
++
++/* Destination address */
++typedef struct _EXT_DEST_ADDR {
++	union {
++		UINT8    WWNN[EXT_DEF_WWN_NAME_SIZE];	/* 8 */
++		UINT8    WWPN[EXT_DEF_WWN_NAME_SIZE];	/* 8 */
++		UINT8    Id[EXT_DEF_PORTID_SIZE];	/* 4 */
++		struct {
++			UINT16    Bus;			/* 2 */
++			UINT16    Target;		/* 2 */
++		} ScsiAddr;
++	} DestAddr;
++	UINT16    DestType;				/* 2 */
++	UINT16    Lun;					/* 2 */
++	UINT16    Padding[2];				/* 4 */
++} EXT_DEST_ADDR, *PEXT_DEST_ADDR;			/* 16 */
++
++
++#define	EXT_DEF_DESTTYPE_WWNN			1
++#define	EXT_DEF_DESTTYPE_WWPN			2
++#define	EXT_DEF_DESTTYPE_PORTID			3
++#define	EXT_DEF_DESTTYPE_FABRIC			4
++#define	EXT_DEF_DESTTYPE_SCSI			5
++
++/* Statistic */
++typedef struct _EXT_HBA_PORT_STAT {
++	UINT32    ControllerErrorCount;		/* 4 */
++	UINT32    DeviceErrorCount;		/* 4 */
++	UINT32    TotalIoCount;			/* 4 */
++	UINT32    TotalMBytes;			/* 4; MB of data processed */
++	UINT32    TotalLipResets;		/* 4; Total no. of LIP Reset */
++	UINT32    Reserved2;			/* 4 */
++	UINT32    TotalLinkFailures;		/* 4 */
++	UINT32    TotalLossOfSync;		/* 4 */
++	UINT32    TotalLossOfSignals;		/* 4 */
++	UINT32    PrimitiveSeqProtocolErrorCount;/* 4 */
++	UINT32    InvalidTransmissionWordCount;	/* 4 */
++	UINT32    InvalidCRCCount;		/* 4 */
++	UINT32    Reserved[16];			/* 64 */
++} EXT_HBA_PORT_STAT, *PEXT_HBA_PORT_STAT;	/* 112 */
++
++
++/* Driver property */
++typedef struct _EXT_DRIVER {
++	UINT8     Version[EXT_DEF_MAX_STR_SIZE];/* 128 */
++	UINT16    NumOfBus;			/* 2; Port Type */
++	UINT16    TargetsPerBus;		/* 2; Port Status */
++	UINT16    LunsPerTarget;		/* 2 */
++	UINT32    MaxTransferLen;		/* 4 */
++	UINT32    MaxDataSegments;		/* 4 */
++	UINT16    DmaBitAddresses;		/* 2 */
++	UINT16    IoMapType;			/* 2 */
++	UINT32    Attrib;			/* 4 */
++	UINT32    InternalFlags[4];		/* 16 */
++	UINT32    Reserved[8];			/* 32 */
++} EXT_DRIVER, *PEXT_DRIVER;			/* 198 */
++
++
++/* Firmware property */
++typedef struct _EXT_FW {
++	UINT8     Version[EXT_DEF_MAX_STR_SIZE];/* 128 */
++	UINT32    Attrib;			/* 4 */
++	UINT16    Reserved[33];			/* 66 */
++} EXT_FW, *PEXT_FW;				/* 198 */
++
++
++/* ISP/Chip property */
++typedef struct _EXT_CHIP {
++	UINT16    VendorId;			/* 2 */
++	UINT16    DeviceId;			/* 2 */
++	UINT16    SubVendorId;			/* 2 */
++	UINT16    SubSystemId;			/* 2 */
++	UINT16    PciBusNumber;			/* 2 */
++	UINT16    PciSlotNumber;		/* 2 */
++	UINT32    IoAddr;			/* 4 */
++	UINT32    IoAddrLen;			/* 4 */
++	UINT32    MemAddr;			/* 4 */
++	UINT32    MemAddrLen;			/* 4 */
++	UINT16    ChipType;			/* 2 */
++	UINT16    InterruptLevel;		/* 2 */
++	UINT16    OutMbx[8];			/* 16 */
++	UINT16    PciDevFunc;	                /* 2 */
++	UINT16    Reserved[15];			/* 30 */
++} EXT_CHIP, *PEXT_CHIP;				/* 80 */
++
++
++/* Request Buffer for RNID */
++typedef struct _EXT_RNID_REQ {
++	EXT_FC_ADDR Addr;			/* 14 */
++	UINT8     DataFormat;			/* 1 */
++	UINT8     Pad;				/* 1 */
++	UINT8     OptWWN[EXT_DEF_WWN_NAME_SIZE];	/* 8 */
++	UINT8     OptPortId[EXT_DEF_PORTID_SIZE];	/* 4 */
++	UINT32    Reserved[12];			/* 48 */
++	UINT8     Pad1[3];			/* 3 */
++} EXT_RNID_REQ, *PEXT_RNID_REQ;			/* 79 */
++
++#define EXT_DEF_RNID_DFORMAT_NONE		0
++#define EXT_DEF_RNID_DFORMAT_TOPO_DISC		0xDF
++
++/* Request Buffer for Set RNID */
++typedef struct _EXT_SET_RNID_REQ {
++	UINT8     IPVersion[2];
++	UINT8     UDPPortNumber[2];
++	UINT8     IPAddress[16];
++	UINT32    Reserved[16];
++} EXT_SET_RNID_REQ, *PEXT_SET_RNID_REQ;
++
++/* RNID definition and data struct */
++#define	SEND_RNID_RSP_SIZE  72
++
++typedef struct _RNID_DATA
++{
++	UINT8     WWN[16];			/* 16 */
++	UINT32    UnitType;			/* 4 */
++	UINT8     PortId[4];			/* 4 */
++	UINT32    NumOfAttachedNodes;		/* 4 */
++	UINT8     IPVersion[2];			/* 2 */
++	UINT8     UDPPortNumber[2];		/* 2 */
++	UINT8     IPAddress[16];		/* 16 */
++	UINT16    Reserved;			/* 2 */
++	UINT16    TopoDiscFlags;		/* 2 */
++} EXT_RNID_DATA, *PEXT_RNID_DATA;		/* 52 */
++
++
++/* SCSI pass-through */
++typedef struct _EXT_SCSI_PASSTHRU {
++	EXT_SCSI_ADDR   TargetAddr;
++	UINT8           Direction;
++	UINT8           CdbLength;
++	UINT8           Cdb[EXT_DEF_SCSI_PASSTHRU_CDB_LENGTH];
++        UINT32          Reserved[14];
++        UINT16          Reserved2;
++        UINT16          SenseLength;
++	UINT8           SenseData[256];
++} EXT_SCSI_PASSTHRU, *PEXT_SCSI_PASSTHRU;
++
++/* FC SCSI pass-through */
++typedef struct _EXT_FC_SCSI_PASSTHRU {
++	EXT_DEST_ADDR   FCScsiAddr;
++	UINT8           Direction;
++	UINT8           CdbLength;
++	UINT8           Cdb[EXT_DEF_SCSI_PASSTHRU_CDB_LENGTH];
++        UINT32          Reserved[14];
++        UINT16          Reserved2;
++        UINT16          SenseLength;
++	UINT8           SenseData[256];
++} EXT_FC_SCSI_PASSTHRU, *PEXT_FC_SCSI_PASSTHRU;
++
++/* SCSI pass-through direction */
++#define	EXT_DEF_SCSI_PASSTHRU_DATA_IN		1
++#define	EXT_DEF_SCSI_PASSTHRU_DATA_OUT		2
++
++
++/* EXT_REG_AEN Request struct */
++typedef struct _EXT_REG_AEN {
++	UINT32    Enable;	/* 4; non-0 to enable, 0 to disable. */
++	UINT32    Reserved;	/* 4 */
++} EXT_REG_AEN, *PEXT_REG_AEN;	/* 8 */
++
++/* EXT_GET_AEN Response struct */
++typedef struct _EXT_ASYNC_EVENT {
++	UINT32	AsyncEventCode;		/* 4 */
++	union {
++		struct {
++			UINT8   RSCNInfo[EXT_DEF_PORTID_SIZE_ACTUAL];/* 3, BE */
++			UINT8   AddrFormat;			/* 1 */
++			UINT32  Rsvd_1[2];			/* 8 */
++		} RSCN;
++
++		UINT32  Reserved[3];	/* 12 */
++	} Payload;
++} EXT_ASYNC_EVENT, *PEXT_ASYNC_EVENT;	/* 16 */
++
++
++/* Asynchronous Event Codes */
++#define	EXT_DEF_LIP_OCCURRED		0x8010
++#define	EXT_DEF_LINK_UP			0x8011
++#define	EXT_DEF_LINK_DOWN		0x8012
++#define	EXT_DEF_LIP_RESET		0x8013
++#define	EXT_DEF_RSCN			0x8015
++#define	EXT_DEF_DEVICE_UPDATE		0x8014
++#define	EXT_DEF_ELS          		0x8200
++
++/* Required # of entries in the queue buffer allocated. */
++#define	EXT_DEF_MAX_AEN_QUEUE		EXT_DEF_MAX_AEN_QUEUE_OS
++#define	EXT_DEF_MAX_ELS_BUFS		EXT_DEF_MAX_ELS_BUFS_OS
++#define	EXT_DEF_SIZE_ELS_BUF		EXT_DEF_SIZE_ELS_BUF_OS
++
++/* Device type to get for EXT_SC_GET_PORT_SUMMARY */
++#define	EXT_DEF_GET_KNOWN_DEVICE	0x1
++#define	EXT_DEF_GET_VISIBLE_DEVICE	0x2
++#define	EXT_DEF_GET_HIDDEN_DEVICE	0x4
++#define	EXT_DEF_GET_FABRIC_DEVICE	0x8
++#define	EXT_DEF_GET_LOOP_DEVICE		0x10
++
++/* Each entry in device database */
++typedef struct _EXT_DEVICEDATAENTRY
++{
++	UINT8		NodeWWN[8];	/* Node World Wide Name for device */
++	UINT8		PortWWN[8];	/* Port World Wide Name for device */
++	UINT8		PortID[3];	/* Current PortId for device */
++	UINT8		ControlFlags;	/* Control flag */
++	EXT_SCSI_ADDR	TargetAddress;	/* scsi address */
++	UINT32		DeviceFlags;	/* Flags for device */
++	UINT16		LoopID;		/* Loop ID */
++	UINT16		BaseLunNumber;  
++	UINT32		Reserved[32];
++} EXT_DEVICEDATAENTRY, *PEXT_DEVICEDATAENTRY;
++
++/* Device database information */
++typedef struct _EXT_DEVICEDATA
++{
++	UINT32	TotalDevices;          /* Set to total number of device. */
++	UINT32	ReturnListEntryCount;  /* Set to number of device entries */
++		                       /* returned in list. */
++
++	EXT_DEVICEDATAENTRY  EntryList[1]; /* Variable length */
++} EXT_DEVICEDATA, *PEXT_DEVICEDATA;
++
++
++/* Swap Target Device Data structure */
++typedef struct _EXT_SWAPTARGETDEVICE
++{
++	EXT_DEVICEDATAENTRY CurrentExistDevice;
++	EXT_DEVICEDATAENTRY NewDevice;
++} EXT_SWAPTARGETDEVICE, *PEXT_SWAPTARGETDEVICE;
++
++/* LUN BitMask structure definition, array of 8bit bytes,
++ * 1 bit per lun.  When bit == 1, the lun is masked.
++ * Most significant bit of mask[0] is lun 0.
++ * Least significant bit of mask[0] is lun 7.
++ */
++typedef struct _EXT_LUN_BIT_MASK {
++#if ((EXT_DEF_MAX_LUN & 0x7) == 0)
++	UINT8	mask[EXT_DEF_MAX_LUN >> 3];
++#else
++	UINT8	mask[(EXT_DEF_MAX_LUN + 8) >> 3 ];
++#endif
++} EXT_LUN_BIT_MASK, *PEXT_LUN_BIT_MASK;
++
++/*
++ * LUN mask bit manipulation macros
++ *
++ *   P = Pointer to an EXT_LUN_BIT_MASK union.
++ *   L = LUN number.
++ */
++#define EXT_IS_LUN_BIT_SET(P,L) \
++    (((P)->mask[L/8] & (0x80 >> (L%8)))?1:0)
++
++#define EXT_SET_LUN_BIT(P,L) \
++    ((P)->mask[L/8] |= (0x80 >> (L%8)))
++
++#define EXT_CLR_LUN_BIT(P,L) \
++    ((P)->mask[L/8] &= ~(0x80 >> (L%8)))
++
++#define	EXT_DEF_LUN_BITMASK_LIST_MIN_ENTRIES	1
++#define	EXT_DEF_LUN_BITMASK_LIST_MAX_ENTRIES	256
++
++#ifdef _WIN64
++#define	EXT_DEF_LUN_BITMASK_LIST_HEADER_SIZE	32
++#else
++#define	EXT_DEF_LUN_BITMASK_LIST_HEADER_SIZE \
++    offsetof(LUN_BITMASK_LIST_BUFFER, asBitmaskEntry)
++#endif
++
++#define	EXT_DEF_LUN_COUNT          2048
++#define	EXT_DEF_LUN_BITMASK_BYTES  (EXT_DEF_LUN_COUNT / 8)
++
++typedef struct _EXT_LUN_BITMASK_ENTRY
++{
++	UINT8	NodeName[EXT_DEF_WWN_NAME_SIZE];
++	UINT8	PortName[EXT_DEF_WWN_NAME_SIZE];
++
++	UINT32	Reserved2;
++	UINT32	Reserved3;
++	UINT32	Reserved4;
++	UINT32	Reserved5;     /* Pad to 32-byte header.*/
++
++	UINT8	Bitmask[EXT_DEF_LUN_BITMASK_BYTES];
++} EXT_LUN_BITMASK_ENTRY, *PEXT_LUN_BITMASK_ENTRY;
++
++/* Structure as it is stored in the config file.*/
++typedef struct _LUN_BITMASK_LIST
++{
++	UINT16	Version;       /* Should be LUN_BITMASK_REGISTRY_VERSION */
++	UINT16	EntryCount;    /* Count of variable entries following.*/
++	UINT32	Reserved1;
++	UINT32	Reserved2;
++	UINT32	Reserved3;
++	UINT32	Reserved4;
++	UINT32	Reserved5;
++	UINT32	Reserved6;
++	UINT32	Reserved7;     /* Pad to 32-byte header.*/
++
++	EXT_LUN_BITMASK_ENTRY BitmaskEntry[1]; /* Variable-length data.*/
++
++} EXT_LUN_BITMASK_LIST, *PEXT_LUN_BITMASK_LIST;
++
++
++#define	EXT_DEF_LUN_BITMASK_LIST_MIN_SIZE   \
++    (EXT_DEF_LUN_BITMASK_LIST_HEADER_SIZE + \
++    (sizeof(EXT_DEF_LUN_BITMASK_ENTRY) * EXT_DEF_LUN_BITMASK_LIST_MIN_ENTRIES))
++#define	EXT_DEF_LUN_BITMASK_LIST_MAX_SIZE   \
++    (EXT_DEF_LUN_BITMASK_LIST_HEADER_SIZE + \
++    (sizeof(EXT_DEF_LUN_BITMASK_ENTRY) * EXT_DEF_LUN_BITMASK_LIST_MAX_ENTRIES))
++
++/* Request Buffer for ELS PT*/
++#define EXT_DEF_WWPN_VALID  1
++#define EXT_DEF_WWNN_VALID  2
++#define EXT_DEF_PID_VALID   4
++typedef struct _EXT_ELS_PT_REQ {
++	UINT8     WWNN[EXT_DEF_WWN_NAME_SIZE];	/* 8 */
++	UINT8     WWPN[EXT_DEF_WWN_NAME_SIZE];	/* 8 */
++	UINT8     Id[EXT_DEF_PORTID_SIZE];  	/* 4 */
++	UINT16    ValidMask;			/* 2 */
++	UINT16    Lid;				/* 2 */
++	UINT16    Rxid;				/* 2 */
++	UINT16    AccRjt;			/* 2 */
++	UINT32    Reserved;			/* 4 */
++} EXT_ELS_PT_REQ, *PEXT_ELS_PT_REQ;		/* 32 */
++
++#ifdef _MSC_VER
++#pragma pack()
++#endif
++
++#endif /* _EXIOCT_H */
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/exioctln.h	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,255 @@
++/*****************************************************************************
++*                  QLOGIC LINUX SOFTWARE
++*
++* QLogic ISP2x00 device driver for Linux 2.5.x
++* Copyright (C) 2003 QLogic Corporation
++* (www.qlogic.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, 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.
++****************************************************************************/
++
++/*
++ * File Name: exioctln.h
++
++   Rev 14    February 25, 2003	RL
++             - Added EXT_CC_DRIVER_SPECIFIC ioctl command to return
++	       some driver specific data that can be used by API library
++	       to determine how to maintain backward compatibility
++	       of certain features.
++
++   Rev 13    January 31, 2003	RL
++             - Changed the value of EXT_DEF_USE_HBASELECT to avoid
++               conflicting with older implementation of FO API lib.
++
++   Rev 12    January 20, 2003	RL
++             - Added EXT_DEF_USE_HBASELECT definition for use by
++               the SETINSTANCE command.
++ 
++   Rev 11    December 10, 2002	RL
++             - Added EXT_CC_SEND_ELS_PASSTHRU_OS definition.
++ 
++   Rev 10    October 26, 2001	RL
++             - Corrected MAX_HBA, MAX_TARGET and MAX_LUN values to 255.
++ 
++   Rev 9     July 26, 2001	RL
++             - Added definition of signed types.
++ 
++   Rev 8     July 05, 2001	RL
++             - Redefined ioctl command values.
++ 
++   Rev 7     Nov 06, 2000   BN
++             - Added EXT_DEF_MAX_AEN_QUEUE_OS define
++             - Added define for handle_hba_t
++ 
++   Rev 6     Oct 25, 2000   BN
++             - Added EXT_CC_DRIVER_PROP_OS define
++ 
++   Rev 5     Oct 25, 2000   BN
++             - Redo the copyright header and add AEN details
++ 
++   Rev 4     Oct 23, 2000   BN
++             - Added definition for BOOLEAN
++ 
++   Rev 3     Oct 23, 2000   BN
++             - Added definitions for EXT_ADDR_MODE_OS
++               and also include of <linux/ioctl.h>
++ 
++   Rev 2     Oct 18, 2000   BN
++             - Enable API Exention support
++ 
++   Rev 1     Original version Sep 7, 2000   BN
++ 
++*/
++
++
++#ifndef _EXIOCT_LN_H_
++#define _EXIOCT_LN_H_
++
++#include <linux/ioctl.h>
++
++#ifdef APILIB
++#include <stdint.h>
++#endif
++
++
++#define	INT8	int8_t
++#define	INT16	int16_t
++#define	INT32	int32_t
++#define	UINT8	uint8_t
++#define	UINT16	uint16_t
++#define	UINT32	uint32_t
++#define	UINT64	void *
++#define BOOLEAN uint8_t
++
++typedef struct  track_instance {
++	int   handle;
++} track_instance_t;
++
++
++#if BITS_PER_LONG <= 32
++#define EXT_ADDR_MODE_OS  EXT_DEF_ADDR_MODE_32
++#else
++#define EXT_ADDR_MODE_OS  EXT_DEF_ADDR_MODE_64
++#endif
++
++
++#define QLMULTIPATH_MAGIC 'y'
++
++#define _QLBUILD   /* for exioct.h to enable include of qinsdmgt.h */
++
++
++
++#define	EXT_DEF_MAX_HBA_OS		255	/* 0 - 0xFE */
++#define	EXT_DEF_MAX_BUS_OS		1
++#define	EXT_DEF_MAX_TARGET_OS		255	/* 0 - 0xFE */
++#define	EXT_DEF_MAX_LUN_OS		255	/* 0 - 0xFE */
++
++#define EXT_DEF_MAX_AEN_QUEUE_OS        64
++
++#define EXT_DEF_FC_HEADER_LEN		24
++#define EXT_DEF_ELS_RJT_LENGTH		0x08	/* 8  */
++#define EXT_DEF_ELS_RPS_ACC_LENGTH	0x40	/* 64 */
++#define EXT_DEF_ELS_RLS_ACC_LENGTH	0x1C	/* 28 */
++
++#define EXT_DEF_USE_HBASELECT		0x02	/* bit 1: HbaSelect field now
++						 * used to specify destination
++						 * HBA of each command.
++						 * SetInstance cmd is now
++						 * issued only once during
++						 * API initialization.
++						 */
++
++
++/*****************/
++/* Command codes */
++/*****************/
++
++/*************************************************************/
++/* These are regular/external command codes, starting from 0 */
++/*************************************************************/
++#define EXT_CC_QUERY_OS					/* QUERY */	\
++    _IOWR(QLMULTIPATH_MAGIC, 0x00, sizeof(EXT_IOCTL))
++#define EXT_CC_SEND_FCCT_PASSTHRU_OS			/* FCCT_PASSTHRU */ \
++    _IOWR(QLMULTIPATH_MAGIC, 0x01, sizeof(EXT_IOCTL))
++#define	EXT_CC_REG_AEN_OS				/* REG_AEN */	\
++    _IOWR(QLMULTIPATH_MAGIC, 0x02, sizeof(EXT_IOCTL))
++#define	EXT_CC_GET_AEN_OS				/* GET_AEN */	\
++    _IOWR(QLMULTIPATH_MAGIC, 0x03, sizeof(EXT_IOCTL))
++#define	EXT_CC_SEND_ELS_RNID_OS				/* SEND_ELS_RNID */ \
++    _IOWR(QLMULTIPATH_MAGIC, 0x04, sizeof(EXT_IOCTL))
++#define	EXT_CC_SCSI_PASSTHRU_OS				/* SCSI_PASSTHRU */ \
++    _IOWR(QLMULTIPATH_MAGIC, 0x05, sizeof(EXT_IOCTL))
++
++#define EXT_CC_GET_DATA_OS				/* GET_DATA */	\
++    _IOWR(QLMULTIPATH_MAGIC, 0x06, sizeof(EXT_IOCTL))
++#define EXT_CC_SET_DATA_OS				/* SET_DATA */	\
++    _IOWR(QLMULTIPATH_MAGIC, 0x07, sizeof(EXT_IOCTL))
++
++/*****************************************/
++/* following are internal command codes. */
++/*****************************************/
++#define EXT_CC_RESERVED0A_OS						\
++    _IOWR(QLMULTIPATH_MAGIC, 0x08, sizeof(EXT_IOCTL))
++#define EXT_CC_RESERVED0B_OS						\
++    _IOWR(QLMULTIPATH_MAGIC, 0x09, sizeof(EXT_IOCTL))
++
++#define EXT_CC_RESERVED0C_OS						\
++    _IOWR(QLMULTIPATH_MAGIC, 0x0a, sizeof(EXT_IOCTL))
++#define EXT_CC_RESERVED0D_OS						\
++    _IOWR(QLMULTIPATH_MAGIC, 0x0b, sizeof(EXT_IOCTL))
++
++#define EXT_CC_RESERVED0E_OS						\
++    _IOWR(QLMULTIPATH_MAGIC, 0x0c, sizeof(EXT_IOCTL))
++#define EXT_CC_RESERVED0F_OS						\
++    _IOWR(QLMULTIPATH_MAGIC, 0x0d, sizeof(EXT_IOCTL))
++
++#define EXT_CC_RESERVED0G_OS						\
++    _IOWR(QLMULTIPATH_MAGIC, 0x0e, sizeof(EXT_IOCTL))
++#define EXT_CC_RESERVED0H_OS						\
++    _IOWR(QLMULTIPATH_MAGIC, 0x0f, sizeof(EXT_IOCTL))
++
++#define EXT_CC_RESERVED0I_OS						\
++    _IOWR(QLMULTIPATH_MAGIC, 0x10, sizeof(EXT_IOCTL))
++#define EXT_CC_RESERVED0J_OS						\
++    _IOWR(QLMULTIPATH_MAGIC, 0x11, sizeof(EXT_IOCTL))
++
++#define EXT_CC_RESERVED0Z_OS						\
++    _IOWR(QLMULTIPATH_MAGIC, 0x21, sizeof(EXT_IOCTL))
++
++/********************************************************/
++/* These are additional regular/external command codes. */
++/********************************************************/
++#define EXT_CC_SEND_ELS_PASSTHRU_OS					\
++    _IOWR(QLMULTIPATH_MAGIC, 0x30, sizeof(EXT_IOCTL))
++
++
++/********************************************************/
++/* Failover ioctl command codes range from 0xc0 to 0xdf */
++/********************************************************/
++
++
++/*******************************************************************/
++/* These are Linux driver implementation specific commands. Values */
++/* start from highest possible value and in decreasing order.      */
++/*******************************************************************/
++
++#define EXT_CC_STARTIOCTL				/* STARTIOCTL */ \
++    _IOWR(QLMULTIPATH_MAGIC, 0xff, sizeof(EXT_IOCTL))
++#define EXT_CC_SETINSTANCE				/* SETINSTANCE */ \
++    _IOWR(QLMULTIPATH_MAGIC, 0xfe, sizeof(EXT_IOCTL))
++#define	EXT_CC_WWPN_TO_SCSIADDR				/* WWPN_TO_SCSIADDR */ \
++    _IOWR(QLMULTIPATH_MAGIC, 0xfd, sizeof(EXT_IOCTL))
++#define	EXT_CC_DRIVER_SPECIFIC				/* DRIVER_SPECIFIC */ \
++    _IOWR(QLMULTIPATH_MAGIC, 0xfc, sizeof(EXT_IOCTL))
++
++
++/*
++ * Response struct definition
++ */
++typedef struct _EXT_LN_DRV_VERSION {
++	UINT8	Major;
++	UINT8	Minor;
++	UINT8	Patch;
++	UINT8	Beta;
++	UINT8	Reserved[4];
++} EXT_LN_DRV_VERSION;				/* 8 */
++
++typedef struct _EXT_LN_DRIVER_DATA {
++	EXT_LN_DRV_VERSION  	DrvVer;		/* 8 */
++	UINT32    Reserved[14];			/* 56 */
++} EXT_LN_DRIVER_DATA, *PEXT_LN_DRIVER_DATA;	/* 64 */
++
++
++
++
++
++
++/*
++ * Overrides for Emacs so that we almost 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: 2
++ * c-brace-imaginary-offset: 0
++ * c-brace-offset: -2
++ * c-argdecl-indent: 2
++ * c-label-offset: -2
++ * c-continued-statement-offset: 4
++ * c-continued-brace-offset: 0
++ * indent-tabs-mode: nil
++ * tab-width: 8
++ * End:
++ */
++
++#endif /* _EXIOCT_LN_H_ */
++
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/inioct.h	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,129 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++/*
++ * File Name: inioct.h
++ *
++ * San/Device Management Ioctl Header
++ * File is created to adhere to Solaris requirement using 8-space tabs.
++ *
++ * !!!!! PLEASE DO NOT REMOVE THE TABS !!!!!
++ * !!!!! PLEASE NO SINGLE LINE COMMENTS: // !!!!!
++ * !!!!! PLEASE NO MORE THAN 80 CHARS PER LINE !!!!!
++ *
++ *
++ * Revision History:
++ *
++ * Rev. 0	June 15, 2001
++ * YPL	- Created.
++ *
++ * Rev. 1	June 26, 2001
++ * YPL	- Change the loop back structure and delete cc that is not used.
++ *
++ * Rev. 2	June 29, 2001
++ * YPL	- Use new EXT_CC defines from exioct.h
++ *
++ * Rev. 3	July 12, 2001
++ * RL	- Added definitions for loopback mbx command completion codes.
++ *
++ * Rev. 4	July 12, 2001
++ * RL	- Added definitions for loopback mbx command completion codes.
++ *
++ * Rev. 5	October 9, 2002
++ * AV	- Added definition for Read Option ROM IOCTL.
++ *
++ */
++
++#ifndef	_INIOCT_H
++#define	_INIOCT_H
++
++/*
++ * ***********************************************************************
++ * X OS type definitions
++ * ***********************************************************************
++ */
++#ifdef _MSC_VER						/* NT */
++#pragma pack(1)
++#endif
++
++/*
++ * ***********************************************************************
++ * INT_IOCTL SubCode definition.
++ * These macros are being used for setting SubCode field in EXT_IOCTL
++ * structure.
++ * ***********************************************************************
++ */
++
++/*
++ * Currently supported DeviceControl / ioctl command codes
++ */
++#define	INT_CC_GET_PORT_STAT_FC		EXT_CC_RESERVED0A_OS
++#define	INT_CC_LOOPBACK			EXT_CC_RESERVED0B_OS
++#define	INT_CC_UPDATE_OPTION_ROM	EXT_CC_RESERVED0C_OS
++#define	INT_CC_ADD_TARGET_DEVICE	EXT_CC_RESERVED0D_OS
++#define	INT_CC_READ_NVRAM		EXT_CC_RESERVED0E_OS
++#define	INT_CC_UPDATE_NVRAM		EXT_CC_RESERVED0F_OS
++#define	INT_CC_SWAP_TARGET_DEVICE	EXT_CC_RESERVED0G_OS
++#define	INT_CC_READ_OPTION_ROM		EXT_CC_RESERVED0H_OS
++#define	INT_CC_LEGACY_LOOPBACK		EXT_CC_RESERVED0Z_OS
++
++
++
++/* NVRAM */
++#define	INT_SC_NVRAM_HARDWARE		0	/* Save */
++#define	INT_SC_NVRAM_DRIVER		1	/* Driver (Apply) */
++#define	INT_SC_NVRAM_ALL		2	/* NVRAM/Driver (Save+Apply) */
++
++/* Loopback */
++typedef struct _INT_LOOPBACK_REQ
++{
++        UINT16 Options;				/* 2   */
++        UINT32 TransferCount;			/* 4   */
++        UINT32 IterationCount;			/* 4   */
++        UINT64 BufferAddress;			/* 8  */
++        UINT32 BufferLength;			/* 4  */
++        UINT16 Reserved[9];			/* 18  */
++}
++INT_LOOPBACK_REQ, *PINT_LOOPBACK_REQ;		/* 408 */
++
++typedef struct _INT_LOOPBACK_RSP
++{
++        UINT64 BufferAddress;			/* 8  */
++        UINT32 BufferLength;			/* 4  */
++        UINT16 CompletionStatus;		/* 2   */
++        UINT16 CrcErrorCount;			/* 2   */
++        UINT16 DisparityErrorCount;		/* 2   */
++        UINT16 FrameLengthErrorCount;		/* 2   */
++        UINT32 IterationCountLastError;		/* 4   */
++        UINT16 Reserved[8];			/* 16  */
++}
++INT_LOOPBACK_RSP, *PINT_LOOPBACK_RSP;		/* 40  */
++
++/* definition for interpreting CompletionStatus values */
++#define	INT_DEF_LB_COMPLETE	0x4000
++#define	INT_DEF_LB_PARAM_ERR	0x4006
++#define	INT_DEF_LB_LOOP_DOWN	0x400b
++#define	INT_DEF_LB_CMD_ERROR	0x400c
++
++
++#ifdef _MSC_VER
++#pragma pack()
++#endif
++
++#endif /* _INIOCT_H */
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/ql2100tp_fw.c	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,4866 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ *************************************************************************/
++
++/************************************************************************
++ *									*
++ * 	 --- ISP2100 Fabric Initiator/Target Firmware ---               *
++ *                   with expanded LUN addressing                       *
++ *                   and FcTape (FCP-2) support                         *
++ *									*
++ *									*
++ ************************************************************************/
++/*
++ *	Firmware Version 1.19.24 (14:02 Jul 16, 2002)
++ */
++
++#ifdef UNIQUE_FW_NAME
++unsigned short fw2100tp_version = 1*1024+19;
++#else
++unsigned short risc_code_version = 1*1024+19;
++#endif
++
++#ifdef UNIQUE_FW_NAME
++unsigned char fw2100tp_version_str[] = {1,19,24};
++#else
++unsigned char firmware_version[] = {1,19,24};
++#endif
++
++#ifdef UNIQUE_FW_NAME
++#define fw2100tp_VERSION_STRING "1.19.24"
++#else
++#define FW_VERSION_STRING "1.19.24"
++#endif
++
++#ifdef UNIQUE_FW_NAME
++unsigned short fw2100tp_addr01 = 0x1000 ;
++#else
++unsigned short risc_code_addr01 = 0x1000 ;
++#endif
++
++#ifdef UNIQUE_FW_NAME
++unsigned short fw2100tp_code01[] = { 
++#else
++unsigned short risc_code01[] = { 
++#endif
++	0x0078, 0x102d, 0x0000, 0x95f1, 0x0000, 0x0001, 0x0013, 0x0018,
++	0x0017, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030,
++	0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241,
++	0x5449, 0x4f4e, 0x2049, 0x5350, 0x3231, 0x3030, 0x2046, 0x6972,
++	0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030,
++	0x312e, 0x3139, 0x2020, 0x2020, 0x2400, 0x2091, 0x2000, 0x20c1,
++	0x0021, 0x2039, 0xffff, 0x2019, 0xaaaa, 0x2760, 0x2069, 0x7fff,
++	0x20c1, 0x0020, 0x2c2c, 0x2d34, 0x2762, 0x236a, 0x2c24, 0x2d04,
++	0x266a, 0x2562, 0xa406, 0x00c0, 0x1052, 0x20c1, 0x0021, 0x2c2c,
++	0x2362, 0x2c04, 0x2562, 0xa306, 0x0040, 0x1052, 0x20c1, 0x0020,
++	0x2039, 0x8fff, 0x20a1, 0xad00, 0x2708, 0x810d, 0x810d, 0x810d,
++	0x810d, 0xa18c, 0x000f, 0x2001, 0x000a, 0xa112, 0xa00e, 0x21a8,
++	0x41a4, 0x3400, 0x8211, 0x00c0, 0x105f, 0x2708, 0x3400, 0xa102,
++	0x0040, 0x106f, 0x0048, 0x106f, 0x20a8, 0xa00e, 0x41a4, 0x20a1,
++	0xa5f1, 0x2009, 0x0000, 0x20a9, 0x070f, 0x41a4, 0x3400, 0x20c9,
++	0xaaff, 0x2059, 0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x25c7,
++	0x2051, 0xa600, 0x2a70, 0x7762, 0xa786, 0x8fff, 0x0040, 0x1092,
++	0x705f, 0xcd00, 0x705b, 0xccf1, 0x7067, 0x0200, 0x706b, 0x0200,
++	0x0078, 0x109a, 0x705b, 0xbd01, 0x7067, 0x0100, 0x706b, 0x0100,
++	0x705f, 0xbd00, 0x1078, 0x12df, 0x1078, 0x13ca, 0x1078, 0x1577,
++	0x1078, 0x1ce9, 0x1078, 0x42ec, 0x1078, 0x76bf, 0x1078, 0x1355,
++	0x1078, 0x2ac0, 0x1078, 0x4e93, 0x1078, 0x49a3, 0x1078, 0x594a,
++	0x1078, 0x2263, 0x1078, 0x5c43, 0x1078, 0x5485, 0x1078, 0x2162,
++	0x1078, 0x2240, 0x2091, 0x3009, 0x7823, 0x0000, 0x0090, 0x10cf,
++	0x7820, 0xa086, 0x0002, 0x00c0, 0x10cf, 0x7823, 0x4000, 0x0068,
++	0x10c7, 0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2a70,
++	0x7003, 0x0000, 0x2001, 0x017f, 0x2003, 0x0000, 0x2a70, 0x7000,
++	0xa08e, 0x0003, 0x00c0, 0x10ef, 0x1078, 0x365e, 0x1078, 0x2ae8,
++	0x1078, 0x4ee3, 0x1078, 0x4b66, 0x2009, 0x0100, 0x2104, 0xa082,
++	0x0002, 0x0048, 0x10f3, 0x1078, 0x5966, 0x0078, 0x10d6, 0x1079,
++	0x10f7, 0x0078, 0x10dc, 0x1078, 0x7197, 0x0078, 0x10eb, 0x1101,
++	0x1102, 0x11be, 0x10ff, 0x1246, 0x12dc, 0x12dd, 0x12de, 0x1078,
++	0x1332, 0x007c, 0x127e, 0x0f7e, 0x2091, 0x8000, 0x7000, 0xa086,
++	0x0001, 0x00c0, 0x1198, 0x1078, 0x3aec, 0x2079, 0x0100, 0x7844,
++	0xa005, 0x00c0, 0x1198, 0x2011, 0x41dc, 0x1078, 0x5a45, 0x1078,
++	0x1adf, 0x780f, 0x00ff, 0x7840, 0xa084, 0xfffb, 0x7842, 0x2011,
++	0x8010, 0x73c4, 0x1078, 0x361b, 0x2001, 0xffff, 0x1078, 0x5ae6,
++	0x723c, 0xc284, 0x723e, 0x2001, 0xa60c, 0x2014, 0xc2ac, 0x2202,
++	0x1078, 0x6f9f, 0x2011, 0x0004, 0x1078, 0x8d1b, 0x1078, 0x489e,
++	0x1078, 0x42d4, 0x0040, 0x1144, 0x7087, 0x0001, 0x70bf, 0x0000,
++	0x1078, 0x3c9e, 0x0078, 0x1198, 0x1078, 0x4967, 0x0040, 0x114d,
++	0x7a0c, 0xc2b4, 0x7a0e, 0x0078, 0x1159, 0x1078, 0x90a6, 0x70cc,
++	0xd09c, 0x00c0, 0x1159, 0x7098, 0xa005, 0x0040, 0x1159, 0x1078,
++	0x42b8, 0x70d7, 0x0000, 0x70d3, 0x0000, 0x72cc, 0x2079, 0xa652,
++	0x7804, 0xd0ac, 0x0040, 0x1165, 0xc295, 0x72ce, 0xa296, 0x0004,
++	0x0040, 0x1186, 0x2011, 0x0001, 0x1078, 0x8d1b, 0x7093, 0x0000,
++	0x7097, 0xffff, 0x7003, 0x0002, 0x0f7f, 0x1078, 0x2677, 0x2011,
++	0x0005, 0x1078, 0x70e0, 0x1078, 0x62d1, 0x0c7e, 0x2061, 0x0100,
++	0x60e3, 0x0008, 0x0c7f, 0x127f, 0x0078, 0x119a, 0x7093, 0x0000,
++	0x7097, 0xffff, 0x7003, 0x0002, 0x2011, 0x0005, 0x1078, 0x70e0,
++	0x1078, 0x62d1, 0x0c7e, 0x2061, 0x0100, 0x60e3, 0x0008, 0x0c7f,
++	0x0f7f, 0x127f, 0x007c, 0x0c7e, 0x20a9, 0x0082, 0x2009, 0x007e,
++	0x017e, 0x027e, 0x037e, 0x2110, 0x027e, 0x2019, 0x0029, 0x1078,
++	0x73d0, 0x027f, 0x1078, 0xa4f1, 0x037f, 0x027f, 0x017f, 0x1078,
++	0x298e, 0x8108, 0x00f0, 0x11a0, 0x0c7f, 0x706f, 0x0000, 0x7070,
++	0xa084, 0x00ff, 0x7072, 0x709b, 0x0000, 0x007c, 0x127e, 0x2091,
++	0x8000, 0x7000, 0xa086, 0x0002, 0x00c0, 0x1244, 0x7094, 0xa086,
++	0xffff, 0x0040, 0x11d1, 0x1078, 0x2677, 0x1078, 0x62d1, 0x0078,
++	0x1244, 0x70cc, 0xd09c, 0x0040, 0x11fd, 0xd084, 0x0040, 0x11fd,
++	0x0f7e, 0x2079, 0x0100, 0x790c, 0xc1b5, 0x790e, 0x0f7f, 0xd08c,
++	0x0040, 0x11fd, 0x70d0, 0xa086, 0xffff, 0x0040, 0x11f9, 0x1078,
++	0x27f7, 0x1078, 0x62d1, 0x70cc, 0xd094, 0x00c0, 0x1244, 0x2011,
++	0x0001, 0x2019, 0x0000, 0x1078, 0x282f, 0x1078, 0x62d1, 0x0078,
++	0x1244, 0x70d4, 0xa005, 0x00c0, 0x1244, 0x7090, 0xa005, 0x00c0,
++	0x1244, 0x1078, 0x4967, 0x00c0, 0x1244, 0x2001, 0xa653, 0x2004,
++	0xd0ac, 0x0040, 0x1227, 0x157e, 0x0c7e, 0x20a9, 0x007f, 0x2009,
++	0x0000, 0x017e, 0x1078, 0x45c4, 0x00c0, 0x121a, 0x6000, 0xd0ec,
++	0x00c0, 0x1222, 0x017f, 0x8108, 0x00f0, 0x1211, 0x0c7f, 0x157f,
++	0x0078, 0x1227, 0x017f, 0x0c7f, 0x157f, 0x0078, 0x1244, 0x7003,
++	0x0003, 0x7097, 0xffff, 0x2001, 0x0000, 0x1078, 0x24e8, 0x1078,
++	0x3699, 0x2001, 0xa8b2, 0x2004, 0xa086, 0x0005, 0x00c0, 0x123c,
++	0x2011, 0x0000, 0x1078, 0x70e0, 0x2011, 0x0000, 0x1078, 0x70ea,
++	0x1078, 0x62d1, 0x1078, 0x639b, 0x127f, 0x007c, 0x017e, 0x0f7e,
++	0x127e, 0x2091, 0x8000, 0x2079, 0x0100, 0x2009, 0x00f7, 0x1078,
++	0x42a1, 0x7940, 0xa18c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0040,
++	0x125b, 0x7827, 0x0040, 0xd19c, 0x0040, 0x1260, 0x7827, 0x0008,
++	0x007e, 0x037e, 0x157e, 0xa006, 0x1078, 0x5ae6, 0x7900, 0xa18a,
++	0x0003, 0x0050, 0x1289, 0x7954, 0xd1ac, 0x00c0, 0x1289, 0x2009,
++	0x00f8, 0x1078, 0x42a1, 0x7843, 0x0090, 0x7843, 0x0010, 0x20a9,
++	0x09c4, 0x7820, 0xd09c, 0x00c0, 0x1281, 0x7824, 0xd0ac, 0x00c0,
++	0x12ca, 0x00f0, 0x1279, 0x2001, 0x0001, 0x1078, 0x24e8, 0x0078,
++	0x12d5, 0x7853, 0x0000, 0x782f, 0x0020, 0x20a9, 0x0050, 0x00e0,
++	0x128f, 0x2091, 0x6000, 0x00f0, 0x128f, 0x7853, 0x0400, 0x782f,
++	0x0000, 0x2009, 0x00f8, 0x1078, 0x42a1, 0x20a9, 0x000e, 0x0005,
++	0x00f0, 0x129f, 0x7853, 0x1400, 0x7843, 0x0090, 0x7843, 0x0010,
++	0x2019, 0x61a8, 0x7854, 0x0005, 0x0005, 0xd08c, 0x0040, 0x12b4,
++	0x7824, 0xd0ac, 0x00c0, 0x12ca, 0x8319, 0x00c0, 0x12aa, 0x2009,
++	0xa632, 0x2104, 0x8000, 0x200a, 0xa084, 0xfff0, 0x0040, 0x12c4,
++	0x200b, 0x0000, 0x1078, 0x2588, 0x2001, 0x0001, 0x1078, 0x24e8,
++	0x0078, 0x12d3, 0x2001, 0xa632, 0x2003, 0x0000, 0x7828, 0xc09d,
++	0x782a, 0x7827, 0x0048, 0x7853, 0x0400, 0x157f, 0x037f, 0x007f,
++	0x127f, 0x0f7f, 0x017f, 0x007c, 0x007c, 0x007c, 0x007c, 0x2a70,
++	0x2061, 0xa8ad, 0x2063, 0x0001, 0x6007, 0x0013, 0x600b, 0x0018,
++	0x600f, 0x0017, 0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0048,
++	0x12f5, 0x7053, 0xffff, 0x0078, 0x12f7, 0x7053, 0x0000, 0x7057,
++	0xffff, 0x706f, 0x0000, 0x7073, 0x0000, 0x1078, 0x90a6, 0x2061,
++	0xa88d, 0x6003, 0x0909, 0x6007, 0x0000, 0x600b, 0x8800, 0x600f,
++	0x0200, 0x6013, 0x00ff, 0x6017, 0x0003, 0x601b, 0x0000, 0x601f,
++	0x07d0, 0x2061, 0xa895, 0x6003, 0x8000, 0x6007, 0x0000, 0x600b,
++	0x0000, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x0000, 0x601b,
++	0x0001, 0x601f, 0x0000, 0x2061, 0xa8a5, 0x6003, 0x514c, 0x6007,
++	0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, 0x2001, 0xa626, 0x2003,
++	0x0000, 0x007c, 0x2091, 0x8000, 0x0068, 0x1334, 0x007e, 0x017e,
++	0x2079, 0x0000, 0x7818, 0xd084, 0x00c0, 0x133a, 0x017f, 0x792e,
++	0x007f, 0x782a, 0x007f, 0x7826, 0x3900, 0x783a, 0x7823, 0x8002,
++	0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2079, 0xa600,
++	0x7803, 0x0005, 0x0078, 0x1352, 0x007c, 0x2071, 0xa600, 0x715c,
++	0x712e, 0x2021, 0x0001, 0xa190, 0x002d, 0xa298, 0x002d, 0x0048,
++	0x136b, 0x7060, 0xa302, 0x00c8, 0x136b, 0x220a, 0x2208, 0x2310,
++	0x8420, 0x0078, 0x135d, 0x200b, 0x0000, 0x74aa, 0x74ae, 0x007c,
++	0x0e7e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa600, 0x70ac, 0xa0ea,
++	0x0010, 0x00c8, 0x137e, 0xa06e, 0x0078, 0x1388, 0x8001, 0x70ae,
++	0x702c, 0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807, 0x0000,
++	0x127f, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa600, 0x127e, 0x2091,
++	0x8000, 0x70ac, 0x8001, 0x00c8, 0x1398, 0xa06e, 0x0078, 0x13a1,
++	0x70ae, 0x702c, 0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807,
++	0x0000, 0x127f, 0x0e7f, 0x007c, 0x0e7e, 0x127e, 0x2091, 0x8000,
++	0x2071, 0xa600, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70ac, 0x8000,
++	0x70ae, 0x127f, 0x0e7f, 0x007c, 0x8dff, 0x0040, 0x13c0, 0x6804,
++	0x6807, 0x0000, 0x007e, 0x1078, 0x13a4, 0x0d7f, 0x0078, 0x13b4,
++	0x007c, 0x0e7e, 0x2071, 0xa600, 0x70ac, 0xa08a, 0x0010, 0xa00d,
++	0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa8d6, 0x7007, 0x0000, 0x701b,
++	0x0000, 0x701f, 0x0000, 0x2071, 0x0000, 0x7010, 0xa085, 0x8004,
++	0x7012, 0x0e7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x0e7e, 0x2270,
++	0x700b, 0x0000, 0x2071, 0xa8d6, 0x7018, 0xa088, 0xa8df, 0x220a,
++	0x8000, 0xa084, 0x0007, 0x701a, 0x7004, 0xa005, 0x00c0, 0x13f6,
++	0x0f7e, 0x2079, 0x0010, 0x1078, 0x1408, 0x0f7f, 0x0e7f, 0x127f,
++	0x007c, 0x0e7e, 0x2071, 0xa8d6, 0x7004, 0xa005, 0x00c0, 0x1406,
++	0x0f7e, 0x2079, 0x0010, 0x1078, 0x1408, 0x0f7f, 0x0e7f, 0x007c,
++	0x7000, 0x0079, 0x140b, 0x140f, 0x1479, 0x1496, 0x1496, 0x7018,
++	0x711c, 0xa106, 0x00c0, 0x1417, 0x7007, 0x0000, 0x007c, 0x0d7e,
++	0xa180, 0xa8df, 0x2004, 0x700a, 0x2068, 0x8108, 0xa18c, 0x0007,
++	0x711e, 0x7803, 0x0026, 0x6824, 0x7832, 0x6828, 0x7836, 0x682c,
++	0x783a, 0x6830, 0x783e, 0x6810, 0x700e, 0x680c, 0x7016, 0x6804,
++	0x0d7f, 0xd084, 0x0040, 0x1439, 0x7007, 0x0001, 0x1078, 0x143e,
++	0x007c, 0x7007, 0x0002, 0x1078, 0x1454, 0x007c, 0x017e, 0x027e,
++	0x710c, 0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x1449, 0x2110,
++	0xa006, 0x700e, 0x7212, 0x8203, 0x7822, 0x7803, 0x0020, 0x7803,
++	0x0041, 0x027f, 0x017f, 0x007c, 0x017e, 0x027e, 0x137e, 0x147e,
++	0x157e, 0x7014, 0x2098, 0x20a1, 0x0014, 0x7803, 0x0026, 0x710c,
++	0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x1468, 0x2110, 0xa006,
++	0x700e, 0x22a8, 0x53a6, 0x8203, 0x7822, 0x7803, 0x0020, 0x3300,
++	0x7016, 0x7803, 0x0001, 0x157f, 0x147f, 0x137f, 0x027f, 0x017f,
++	0x007c, 0x137e, 0x147e, 0x157e, 0x2099, 0xa6fa, 0x20a1, 0x0018,
++	0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, 0x2091, 0x8000,
++	0x7803, 0x0041, 0x7007, 0x0003, 0x7000, 0xc084, 0x7002, 0x700b,
++	0xa6f5, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x137e, 0x147e,
++	0x157e, 0x2001, 0xa729, 0x209c, 0x20a1, 0x0014, 0x7803, 0x0026,
++	0x2001, 0xa72a, 0x20ac, 0x53a6, 0x2099, 0xa72b, 0x20a1, 0x0018,
++	0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, 0x2091, 0x8000,
++	0x7803, 0x0001, 0x7007, 0x0004, 0x7000, 0xc08c, 0x7002, 0x700b,
++	0xa726, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x017e, 0x0e7e,
++	0x2071, 0xa8d6, 0x0f7e, 0x2079, 0x0010, 0x7904, 0x7803, 0x0002,
++	0xd1fc, 0x0040, 0x14d0, 0xa18c, 0x0700, 0x7004, 0x1079, 0x14d4,
++	0x0f7f, 0x0e7f, 0x017f, 0x007c, 0x1408, 0x14dc, 0x1509, 0x1531,
++	0x1564, 0x14da, 0x0078, 0x14da, 0xa18c, 0x0700, 0x00c0, 0x1502,
++	0x137e, 0x147e, 0x157e, 0x7014, 0x20a0, 0x2099, 0x0014, 0x7803,
++	0x0040, 0x7010, 0x20a8, 0x53a5, 0x3400, 0x7016, 0x157f, 0x147f,
++	0x137f, 0x700c, 0xa005, 0x0040, 0x151e, 0x1078, 0x143e, 0x007c,
++	0x7008, 0xa080, 0x0002, 0x2003, 0x0100, 0x7007, 0x0000, 0x1078,
++	0x1408, 0x007c, 0x7008, 0xa080, 0x0002, 0x2003, 0x0200, 0x0078,
++	0x14fd, 0xa18c, 0x0700, 0x00c0, 0x1514, 0x700c, 0xa005, 0x0040,
++	0x151e, 0x1078, 0x1454, 0x007c, 0x7008, 0xa080, 0x0002, 0x2003,
++	0x0200, 0x7007, 0x0000, 0x1078, 0x1408, 0x007c, 0x0d7e, 0x7008,
++	0x2068, 0x7830, 0x6826, 0x7834, 0x682a, 0x7838, 0x682e, 0x783c,
++	0x6832, 0x680b, 0x0100, 0x0d7f, 0x7007, 0x0000, 0x1078, 0x1408,
++	0x007c, 0xa18c, 0x0700, 0x00c0, 0x155e, 0x137e, 0x147e, 0x157e,
++	0x2001, 0xa6f8, 0x2004, 0xa080, 0x000d, 0x20a0, 0x2099, 0x0014,
++	0x7803, 0x0040, 0x20a9, 0x0020, 0x53a5, 0x2001, 0xa6fa, 0x2004,
++	0xd0bc, 0x0040, 0x1554, 0x2001, 0xa703, 0x2004, 0xa080, 0x000d,
++	0x20a0, 0x20a9, 0x0020, 0x53a5, 0x157f, 0x147f, 0x137f, 0x7007,
++	0x0000, 0x1078, 0x4f8c, 0x1078, 0x1408, 0x007c, 0x2011, 0x8003,
++	0x1078, 0x361b, 0x0078, 0x1562, 0xa18c, 0x0700, 0x00c0, 0x1571,
++	0x2001, 0xa728, 0x2003, 0x0100, 0x7007, 0x0000, 0x1078, 0x1408,
++	0x007c, 0x2011, 0x8004, 0x1078, 0x361b, 0x0078, 0x1575, 0x127e,
++	0x2091, 0x2100, 0x2079, 0x0030, 0x2071, 0xa8e7, 0x7803, 0x0004,
++	0x7003, 0x0000, 0x700f, 0xa8ed, 0x7013, 0xa8ed, 0x780f, 0x0076,
++	0x7803, 0x0004, 0x127f, 0x007c, 0x6934, 0xa184, 0x0007, 0x0079,
++	0x1591, 0x1599, 0x15df, 0x1599, 0x1599, 0x1599, 0x15c4, 0x15a8,
++	0x159d, 0xa085, 0x0001, 0x0078, 0x15f9, 0x684c, 0xd0bc, 0x0040,
++	0x1599, 0x6860, 0x682e, 0x685c, 0x682a, 0x6858, 0x0078, 0x15e7,
++	0xa18c, 0x00ff, 0xa186, 0x001e, 0x00c0, 0x1599, 0x684c, 0xd0bc,
++	0x0040, 0x1599, 0x6860, 0x682e, 0x685c, 0x682a, 0x6804, 0x681a,
++	0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004,
++	0x6832, 0x6858, 0x0078, 0x15ef, 0xa18c, 0x00ff, 0xa186, 0x0015,
++	0x00c0, 0x1599, 0x684c, 0xd0ac, 0x0040, 0x1599, 0x6804, 0x681a,
++	0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004,
++	0x6832, 0xa006, 0x682e, 0x682a, 0x6858, 0x0078, 0x15ef, 0x684c,
++	0xd0ac, 0x0040, 0x1599, 0xa006, 0x682e, 0x682a, 0x6858, 0xa18c,
++	0x000f, 0xa188, 0x206a, 0x210c, 0x6932, 0x2d08, 0x691a, 0x6826,
++	0x684c, 0xc0dd, 0x684e, 0xa006, 0x680a, 0x697c, 0x6912, 0x6980,
++	0x6916, 0x007c, 0x20e1, 0x0007, 0x20e1, 0x2000, 0x2001, 0x020a,
++	0x2004, 0x82ff, 0x0040, 0x161c, 0xa280, 0x0004, 0x0d7e, 0x206c,
++	0x684c, 0xd0dc, 0x00c0, 0x1618, 0x1078, 0x158c, 0x0040, 0x1618,
++	0x0d7f, 0xa280, 0x0000, 0x2003, 0x0002, 0xa016, 0x0078, 0x161c,
++	0x6808, 0x8000, 0x680a, 0x0d7f, 0x127e, 0x047e, 0x037e, 0x027e,
++	0x2091, 0x2100, 0x027f, 0x037f, 0x047f, 0x7000, 0xa005, 0x00c0,
++	0x1630, 0x7206, 0x2001, 0x1651, 0x007e, 0x2260, 0x0078, 0x17e0,
++	0x710c, 0x220a, 0x8108, 0x230a, 0x8108, 0x240a, 0x8108, 0xa182,
++	0xa908, 0x0048, 0x163d, 0x2009, 0xa8ed, 0x710e, 0x7010, 0xa102,
++	0xa082, 0x0009, 0x0040, 0x1648, 0xa080, 0x001b, 0x00c0, 0x164b,
++	0x2009, 0x0138, 0x200a, 0x7000, 0xa005, 0x00c0, 0x1651, 0x1078,
++	0x17c1, 0x127f, 0x007c, 0x127e, 0x027e, 0x037e, 0x0c7e, 0x007e,
++	0x2091, 0x2100, 0x007f, 0x047f, 0x037f, 0x027f, 0x0d7e, 0x0c7e,
++	0x2460, 0x6110, 0x2168, 0x6a62, 0x6b5e, 0xa005, 0x0040, 0x16dd,
++	0x6808, 0xa005, 0x0040, 0x174a, 0x7000, 0xa005, 0x00c0, 0x1672,
++	0x0078, 0x16d2, 0x700c, 0x7110, 0xa106, 0x00c0, 0x1753, 0x7004,
++	0xa406, 0x00c0, 0x16d2, 0x2001, 0x0005, 0x2004, 0xd08c, 0x0040,
++	0x168f, 0x047e, 0x1078, 0x1913, 0x047f, 0x2460, 0x6010, 0xa080,
++	0x0002, 0x2004, 0xa005, 0x0040, 0x174a, 0x0078, 0x166c, 0x2001,
++	0x0207, 0x2004, 0xd09c, 0x00c0, 0x167b, 0x7804, 0xa084, 0x6000,
++	0x0040, 0x16a0, 0xa086, 0x6000, 0x0040, 0x16a0, 0x0078, 0x167b,
++	0x7100, 0xa186, 0x0002, 0x00c0, 0x16c0, 0x0e7e, 0x2b68, 0x6818,
++	0x2060, 0x1078, 0x203f, 0x2804, 0xac70, 0x6034, 0xd09c, 0x00c0,
++	0x16b5, 0x7108, 0x720c, 0x0078, 0x16b7, 0x7110, 0x7214, 0x6810,
++	0xa100, 0x6812, 0x6814, 0xa201, 0x6816, 0x0e7f, 0x0078, 0x16c4,
++	0xa186, 0x0001, 0x00c0, 0x16cc, 0x7820, 0x6910, 0xa100, 0x6812,
++	0x7824, 0x6914, 0xa101, 0x6816, 0x7803, 0x0004, 0x7003, 0x0000,
++	0x7004, 0x2060, 0x6100, 0xa18e, 0x0004, 0x00c0, 0x1753, 0x2009,
++	0x0048, 0x1078, 0x775c, 0x0078, 0x1753, 0x6808, 0xa005, 0x0040,
++	0x174a, 0x7000, 0xa005, 0x00c0, 0x16e7, 0x0078, 0x174a, 0x700c,
++	0x7110, 0xa106, 0x00c0, 0x16f0, 0x7004, 0xa406, 0x00c0, 0x174a,
++	0x2001, 0x0005, 0x2004, 0xd08c, 0x0040, 0x1704, 0x047e, 0x1078,
++	0x1913, 0x047f, 0x2460, 0x6010, 0xa080, 0x0002, 0x2004, 0xa005,
++	0x0040, 0x174a, 0x0078, 0x16e1, 0x2001, 0x0207, 0x2004, 0xd09c,
++	0x00c0, 0x16f0, 0x2001, 0x0005, 0x2004, 0xd08c, 0x00c0, 0x16f6,
++	0x7804, 0xa084, 0x6000, 0x0040, 0x171b, 0xa086, 0x6000, 0x0040,
++	0x171b, 0x0078, 0x16f0, 0x7007, 0x0000, 0xa016, 0x2218, 0x7000,
++	0xa08e, 0x0001, 0x0040, 0x173c, 0xa08e, 0x0002, 0x00c0, 0x174a,
++	0x0c7e, 0x0e7e, 0x6818, 0x2060, 0x1078, 0x203f, 0x2804, 0xac70,
++	0x6034, 0xd09c, 0x00c0, 0x1738, 0x7308, 0x720c, 0x0078, 0x173a,
++	0x7310, 0x7214, 0x0e7f, 0x0c7f, 0x7820, 0xa318, 0x7824, 0xa211,
++	0x6810, 0xa300, 0x6812, 0x6814, 0xa201, 0x6816, 0x7803, 0x0004,
++	0x7003, 0x0000, 0x6100, 0xa18e, 0x0004, 0x00c0, 0x1753, 0x2009,
++	0x0048, 0x1078, 0x775c, 0x0c7f, 0x0d7f, 0x127f, 0x007c, 0x0f7e,
++	0x0e7e, 0x027e, 0x037e, 0x047e, 0x057e, 0x2071, 0xa8e7, 0x7000,
++	0xa086, 0x0000, 0x0040, 0x17ba, 0x7004, 0xac06, 0x00c0, 0x17ab,
++	0x2079, 0x0030, 0x7000, 0xa086, 0x0003, 0x0040, 0x17ab, 0x7804,
++	0xd0fc, 0x00c0, 0x17a7, 0x20e1, 0x6000, 0x2011, 0x0032, 0x2001,
++	0x0208, 0x200c, 0x2001, 0x0209, 0x2004, 0xa106, 0x00c0, 0x176f,
++	0x8211, 0x00c0, 0x1777, 0x7804, 0xd0fc, 0x00c0, 0x17a7, 0x1078,
++	0x1b22, 0x027e, 0x057e, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0,
++	0x178d, 0x7803, 0x0002, 0x7803, 0x0009, 0x7003, 0x0003, 0x7007,
++	0x0000, 0x057f, 0x027f, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001,
++	0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0078, 0x17ab, 0x1078,
++	0x1913, 0x0078, 0x175f, 0x157e, 0x20a9, 0x0009, 0x2009, 0xa8ed,
++	0x2104, 0xac06, 0x00c0, 0x17b5, 0x200a, 0xa188, 0x0003, 0x00f0,
++	0x17b0, 0x157f, 0x057f, 0x047f, 0x037f, 0x027f, 0x0e7f, 0x0f7f,
++	0x007c, 0x700c, 0x7110, 0xa106, 0x00c0, 0x17c9, 0x7003, 0x0000,
++	0x007c, 0x2104, 0x7006, 0x2060, 0x8108, 0x211c, 0x8108, 0x2124,
++	0x8108, 0xa182, 0xa908, 0x0048, 0x17d7, 0x2009, 0xa8ed, 0x7112,
++	0x700c, 0xa106, 0x00c0, 0x17e0, 0x2001, 0x0138, 0x2003, 0x0008,
++	0x8cff, 0x00c0, 0x17e7, 0x1078, 0x1b4d, 0x0078, 0x1854, 0x6010,
++	0x2068, 0x2d58, 0x6828, 0xa406, 0x00c0, 0x17f2, 0x682c, 0xa306,
++	0x0040, 0x182f, 0x601c, 0xa086, 0x0008, 0x0040, 0x182f, 0x6024,
++	0xd0f4, 0x00c0, 0x181c, 0xd0d4, 0x0040, 0x1818, 0x6038, 0xa402,
++	0x6034, 0xa303, 0x0040, 0x1806, 0x00c8, 0x1818, 0x643a, 0x6336,
++	0x6c2a, 0x6b2e, 0x047e, 0x037e, 0x2400, 0x6c7c, 0xa402, 0x6812,
++	0x2300, 0x6b80, 0xa303, 0x6816, 0x037f, 0x047f, 0x0078, 0x181c,
++	0x1078, 0x9053, 0x0040, 0x17e3, 0x2001, 0xa674, 0x2004, 0xd0b4,
++	0x00c0, 0x182b, 0x6018, 0x2004, 0xd0bc, 0x00c0, 0x182b, 0x6817,
++	0x7fff, 0x6813, 0xffff, 0x1078, 0x208a, 0x00c0, 0x17e3, 0x0c7e,
++	0x7004, 0x2060, 0x6024, 0xc0d4, 0x6026, 0x0c7f, 0x684c, 0xd0f4,
++	0x0040, 0x1840, 0x6817, 0xffff, 0x6813, 0xffff, 0x0078, 0x17e3,
++	0x6824, 0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc,
++	0x000f, 0x2009, 0x0011, 0x1078, 0x1855, 0x0040, 0x1853, 0x2009,
++	0x0001, 0x1078, 0x1855, 0x2d58, 0x007c, 0x8aff, 0x0040, 0x18ec,
++	0xa03e, 0x2730, 0x6850, 0xd0fc, 0x00c0, 0x1877, 0xd0f4, 0x00c0,
++	0x1887, 0x0d7e, 0x2804, 0xac68, 0x2900, 0x0079, 0x1867, 0x18ce,
++	0x188e, 0x188e, 0x18ce, 0x18ce, 0x18c6, 0x18ce, 0x188e, 0x18ce,
++	0x1894, 0x1894, 0x18ce, 0x18ce, 0x18ce, 0x18bd, 0x1894, 0xc0fc,
++	0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0x0d7e, 0xd99c, 0x0040,
++	0x18d1, 0x2804, 0xac68, 0x6f08, 0x6e0c, 0x0078, 0x18d1, 0xc0f4,
++	0x6852, 0x6b6c, 0x6a70, 0x0d7e, 0x0078, 0x18d8, 0x6b08, 0x6a0c,
++	0x6d00, 0x6c04, 0x0078, 0x18d1, 0x7b0c, 0xd3bc, 0x0040, 0x18b5,
++	0x7004, 0x0e7e, 0x2070, 0x701c, 0x0e7f, 0xa086, 0x0008, 0x00c0,
++	0x18b5, 0x7b08, 0xa39c, 0x0fff, 0x2d20, 0x0d7f, 0x0d7e, 0x6a14,
++	0x82ff, 0x00c0, 0x18b0, 0x6810, 0xa302, 0x0048, 0x18b0, 0x6b10,
++	0x2011, 0x0000, 0x2468, 0x0078, 0x18b7, 0x6b10, 0x6a14, 0x6d00,
++	0x6c04, 0x6f08, 0x6e0c, 0x0078, 0x18d1, 0x0d7f, 0x0d7e, 0x6834,
++	0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x18ce, 0x0d7f, 0x1078,
++	0x2026, 0x00c0, 0x1855, 0xa00e, 0x0078, 0x18ec, 0x0d7f, 0x1078,
++	0x1332, 0x7b22, 0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902,
++	0x7000, 0x8000, 0x7002, 0x0d7f, 0x6828, 0xa300, 0x682a, 0x682c,
++	0xa201, 0x682e, 0x2300, 0x6b10, 0xa302, 0x6812, 0x2200, 0x6a14,
++	0xa203, 0x6816, 0x1078, 0x2026, 0x007c, 0x1078, 0x1332, 0x1078,
++	0x1c97, 0x7004, 0x2060, 0x0d7e, 0x6010, 0x2068, 0x7003, 0x0000,
++	0x1078, 0x1af4, 0x1078, 0x8d06, 0x0040, 0x190c, 0x6808, 0x8001,
++	0x680a, 0x697c, 0x6912, 0x6980, 0x6916, 0x682b, 0xffff, 0x682f,
++	0xffff, 0x6850, 0xc0bd, 0x6852, 0x0d7f, 0x1078, 0x8a01, 0x0078,
++	0x1adb, 0x1078, 0x1332, 0x127e, 0x2091, 0x2100, 0x007e, 0x017e,
++	0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700,
++	0x00c0, 0x18ef, 0xa184, 0x0003, 0xa086, 0x0003, 0x0040, 0x1911,
++	0x7000, 0x0079, 0x192b, 0x1933, 0x1935, 0x1a34, 0x1ab2, 0x1ac9,
++	0x1933, 0x1933, 0x1933, 0x1078, 0x1332, 0x8001, 0x7002, 0xa184,
++	0x0880, 0x00c0, 0x194a, 0x8aff, 0x0040, 0x19d4, 0x2009, 0x0001,
++	0x1078, 0x1855, 0x0040, 0x1adb, 0x2009, 0x0001, 0x1078, 0x1855,
++	0x0078, 0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc, 0x00c0,
++	0x19b2, 0x027e, 0x037e, 0x017e, 0x7808, 0xd0ec, 0x00c0, 0x1962,
++	0x7c20, 0x7d24, 0x7e30, 0x7f34, 0x7803, 0x0009, 0x7003, 0x0004,
++	0x0078, 0x1964, 0x1078, 0x1bd7, 0x017f, 0xd194, 0x0040, 0x196b,
++	0x8aff, 0x0040, 0x19a1, 0x6b28, 0x6a2c, 0x2400, 0x686e, 0xa31a,
++	0x2500, 0x6872, 0xa213, 0x6b2a, 0x6a2e, 0x0c7e, 0x7004, 0x2060,
++	0x6024, 0xd0f4, 0x00c0, 0x197e, 0x633a, 0x6236, 0x0c7f, 0x2400,
++	0x6910, 0xa100, 0x6812, 0x2500, 0x6914, 0xa101, 0x6816, 0x037f,
++	0x027f, 0x2600, 0x681e, 0x2700, 0x6822, 0x1078, 0x203f, 0x2a00,
++	0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x6850, 0xc0fd, 0x6852,
++	0x6808, 0x8001, 0x680a, 0x00c0, 0x19a7, 0x684c, 0xd0e4, 0x0040,
++	0x19a7, 0x7004, 0x2060, 0x2009, 0x0048, 0x1078, 0x775c, 0x7000,
++	0xa086, 0x0004, 0x0040, 0x1adb, 0x7003, 0x0000, 0x1078, 0x17c1,
++	0x0078, 0x1adb, 0x057e, 0x7d0c, 0xd5bc, 0x00c0, 0x19b9, 0x1078,
++	0xa57e, 0x057f, 0x1078, 0x1af4, 0x0f7e, 0x7004, 0x2078, 0x1078,
++	0x4963, 0x0040, 0x19c6, 0x7824, 0xc0f5, 0x7826, 0x0f7f, 0x682b,
++	0xffff, 0x682f, 0xffff, 0x6808, 0x8001, 0x680a, 0x697c, 0x6912,
++	0x6980, 0x6916, 0x0078, 0x1adb, 0x7004, 0x0c7e, 0x2060, 0x6024,
++	0x0c7f, 0xd0f4, 0x0040, 0x19e1, 0x6808, 0x8001, 0x680a, 0x0078,
++	0x19f5, 0x684c, 0xc0f5, 0x684e, 0x7814, 0xa005, 0x00c0, 0x19f9,
++	0x7003, 0x0000, 0x6808, 0x8001, 0x680a, 0x00c0, 0x19f5, 0x7004,
++	0x2060, 0x2009, 0x0048, 0x1078, 0x775c, 0x1078, 0x17c1, 0x0078,
++	0x1adb, 0x7814, 0x6910, 0xa102, 0x6812, 0x6914, 0xa183, 0x0000,
++	0x6816, 0x7814, 0x7908, 0xa18c, 0x0fff, 0xa192, 0x0841, 0x00c8,
++	0x18ef, 0xa188, 0x0007, 0x8114, 0x8214, 0x8214, 0xa10a, 0x8104,
++	0x8004, 0x8004, 0xa20a, 0x810b, 0x810b, 0x810b, 0x1078, 0x1b5e,
++	0x7803, 0x0004, 0x780f, 0xffff, 0x7803, 0x0001, 0x7804, 0xd0fc,
++	0x0040, 0x1a1e, 0x7803, 0x0002, 0x7803, 0x0004, 0x780f, 0x0076,
++	0x7004, 0x7007, 0x0000, 0x2060, 0x2009, 0x0048, 0x1078, 0x775c,
++	0x1078, 0x1b92, 0x0040, 0x19f5, 0x8001, 0x7002, 0xd194, 0x0040,
++	0x1a46, 0x7804, 0xd0fc, 0x00c0, 0x191b, 0x8aff, 0x0040, 0x1adb,
++	0x2009, 0x0001, 0x1078, 0x1855, 0x0078, 0x1adb, 0xa184, 0x0880,
++	0x00c0, 0x1a53, 0x8aff, 0x0040, 0x1adb, 0x2009, 0x0001, 0x1078,
++	0x1855, 0x0078, 0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc,
++	0x00c0, 0x1a93, 0x027e, 0x037e, 0x7808, 0xd0ec, 0x00c0, 0x1a66,
++	0x7803, 0x0009, 0x7003, 0x0004, 0x0078, 0x1a68, 0x1078, 0x1bd7,
++	0x6b28, 0x6a2c, 0x1078, 0x203f, 0x0d7e, 0x0f7e, 0x2d78, 0x2804,
++	0xac68, 0x6034, 0xd09c, 0x00c0, 0x1a83, 0x6808, 0x2008, 0xa31a,
++	0x680c, 0xa213, 0x7810, 0xa100, 0x7812, 0x690c, 0x7814, 0xa101,
++	0x7816, 0x0078, 0x1a8f, 0x6810, 0x2008, 0xa31a, 0x6814, 0xa213,
++	0x7810, 0xa100, 0x7812, 0x6914, 0x7814, 0xa101, 0x7816, 0x0f7f,
++	0x0d7f, 0x0078, 0x196d, 0x057e, 0x7d0c, 0x1078, 0xa57e, 0x057f,
++	0x1078, 0x1af4, 0x0f7e, 0x7004, 0x2078, 0x1078, 0x4963, 0x0040,
++	0x1aa4, 0x7824, 0xc0f5, 0x7826, 0x0f7f, 0x682b, 0xffff, 0x682f,
++	0xffff, 0x6808, 0x8001, 0x680a, 0x697c, 0x6912, 0x6980, 0x6916,
++	0x0078, 0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0xa00d,
++	0x0040, 0x1ac5, 0x6808, 0x8001, 0x680a, 0x00c0, 0x1ac5, 0x7004,
++	0x2060, 0x2009, 0x0048, 0x1078, 0x775c, 0x1078, 0x17c1, 0x0078,
++	0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x6010,
++	0xa005, 0x0040, 0x1ac5, 0x2068, 0x6808, 0x8000, 0x680a, 0x6c28,
++	0x6b2c, 0x1078, 0x17e0, 0x017f, 0x007f, 0x127f, 0x007c, 0x127e,
++	0x2091, 0x2100, 0x7000, 0xa086, 0x0003, 0x00c0, 0x1af2, 0x700c,
++	0x7110, 0xa106, 0x0040, 0x1af2, 0x20e1, 0x9028, 0x700f, 0xa8ed,
++	0x7013, 0xa8ed, 0x127f, 0x007c, 0x0c7e, 0x1078, 0x1b22, 0x20e1,
++	0x9028, 0x700c, 0x7110, 0xa106, 0x0040, 0x1b19, 0x2104, 0xa005,
++	0x0040, 0x1b08, 0x2060, 0x6010, 0x2060, 0x6008, 0x8001, 0x600a,
++	0xa188, 0x0003, 0xa182, 0xa908, 0x0048, 0x1b10, 0x2009, 0xa8ed,
++	0x7112, 0x700c, 0xa106, 0x00c0, 0x1af9, 0x2011, 0x0008, 0x0078,
++	0x1af9, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0138, 0x2202,
++	0x0c7f, 0x007c, 0x2001, 0x0138, 0x2014, 0x2003, 0x0000, 0x2021,
++	0xb015, 0x2001, 0x0141, 0x201c, 0xd3dc, 0x00c0, 0x1b3f, 0x2001,
++	0x0109, 0x201c, 0xa39c, 0x0048, 0x00c0, 0x1b3f, 0x2001, 0x0111,
++	0x201c, 0x83ff, 0x00c0, 0x1b3f, 0x8421, 0x00c0, 0x1b29, 0x007c,
++	0x2011, 0x0201, 0x2009, 0x003c, 0x2204, 0xa005, 0x00c0, 0x1b4c,
++	0x8109, 0x00c0, 0x1b44, 0x007c, 0x007c, 0x1078, 0x1b40, 0x0040,
++	0x1b55, 0x780c, 0xd0a4, 0x0040, 0x1b5b, 0x1078, 0x1af4, 0xa085,
++	0x0001, 0x0078, 0x1b5d, 0x1078, 0x1b92, 0x007c, 0x0e7e, 0x2071,
++	0x0200, 0x7808, 0xa084, 0xf000, 0xa10d, 0x1078, 0x1b22, 0x2019,
++	0x5000, 0x8319, 0x0040, 0x1b7c, 0x2001, 0xa908, 0x2004, 0xa086,
++	0x0000, 0x0040, 0x1b7c, 0x2001, 0x0021, 0xd0fc, 0x0040, 0x1b69,
++	0x1078, 0x1eaa, 0x0078, 0x1b67, 0x20e1, 0x7000, 0x7324, 0x7420,
++	0x7028, 0x7028, 0x7426, 0x7037, 0x0001, 0x810f, 0x712e, 0x702f,
++	0x0100, 0x7037, 0x0008, 0x7326, 0x7422, 0x2001, 0x0138, 0x2202,
++	0x0e7f, 0x007c, 0x027e, 0x2001, 0x015d, 0x2001, 0x0000, 0x7908,
++	0xa18c, 0x0fff, 0xa182, 0x0ffd, 0x0048, 0x1ba0, 0x2009, 0x0000,
++	0xa190, 0x0007, 0xa294, 0x1ff8, 0x8214, 0x8214, 0x8214, 0x2001,
++	0x020a, 0x82ff, 0x0040, 0x1bb5, 0x20e1, 0x6000, 0x200c, 0x200c,
++	0x200c, 0x200c, 0x8211, 0x00c0, 0x1bae, 0x20e1, 0x7000, 0x200c,
++	0x200c, 0x7003, 0x0000, 0x20e1, 0x6000, 0x2001, 0x0208, 0x200c,
++	0x2001, 0x0209, 0x2004, 0xa106, 0x0040, 0x1bd4, 0x1078, 0x1b40,
++	0x0040, 0x1bd2, 0x7908, 0xd1ec, 0x00c0, 0x1bd4, 0x790c, 0xd1a4,
++	0x0040, 0x1b97, 0x1078, 0x1af4, 0xa006, 0x027f, 0x007c, 0x7c20,
++	0x7d24, 0x7e30, 0x7f34, 0x700c, 0x7110, 0xa106, 0x0040, 0x1c69,
++	0x7004, 0x017e, 0x210c, 0xa106, 0x017f, 0x0040, 0x1c69, 0x0d7e,
++	0x0c7e, 0x216c, 0x2d00, 0xa005, 0x0040, 0x1c67, 0x681c, 0xa086,
++	0x0008, 0x0040, 0x1c67, 0x6824, 0xd0d4, 0x00c0, 0x1c67, 0x6810,
++	0x2068, 0x6850, 0xd0fc, 0x0040, 0x1c29, 0x8108, 0x2104, 0x6b2c,
++	0xa306, 0x00c0, 0x1c67, 0x8108, 0x2104, 0x6a28, 0xa206, 0x00c0,
++	0x1c67, 0x6850, 0xc0fc, 0xc0f5, 0x6852, 0x686c, 0x7822, 0x6870,
++	0x7826, 0x681c, 0x7832, 0x6820, 0x7836, 0x6818, 0x2060, 0x6034,
++	0xd09c, 0x0040, 0x1c24, 0x6830, 0x2004, 0xac68, 0x6808, 0x783a,
++	0x680c, 0x783e, 0x0078, 0x1c65, 0xa006, 0x783a, 0x783e, 0x0078,
++	0x1c65, 0x8108, 0x2104, 0xa005, 0x00c0, 0x1c67, 0x6b2c, 0xa306,
++	0x00c0, 0x1c67, 0x8108, 0x2104, 0xa005, 0x00c0, 0x1c67, 0x6a28,
++	0xa206, 0x00c0, 0x1c67, 0x6850, 0xc0f5, 0x6852, 0x6830, 0x2004,
++	0x6918, 0xa160, 0xa180, 0x000d, 0x2004, 0xd09c, 0x00c0, 0x1c57,
++	0x6008, 0x7822, 0x686e, 0x600c, 0x7826, 0x6872, 0x6000, 0x7832,
++	0x6004, 0x7836, 0xa006, 0x783a, 0x783e, 0x0078, 0x1c65, 0x6010,
++	0x7822, 0x686e, 0x6014, 0x7826, 0x6872, 0x6000, 0x7832, 0x6004,
++	0x7836, 0x6008, 0x783a, 0x600c, 0x783e, 0x7803, 0x0011, 0x0c7f,
++	0x0d7f, 0x007c, 0x0f7e, 0x0e7e, 0x017e, 0x027e, 0x2071, 0xa8e7,
++	0x2079, 0x0030, 0x2011, 0x0050, 0x7000, 0xa086, 0x0000, 0x0040,
++	0x1c92, 0x8211, 0x0040, 0x1c90, 0x2001, 0x0005, 0x2004, 0xd08c,
++	0x0040, 0x1c79, 0x7904, 0xa18c, 0x0780, 0x017e, 0x1078, 0x1913,
++	0x017f, 0x81ff, 0x00c0, 0x1c90, 0x2011, 0x0050, 0x0078, 0x1c74,
++	0xa085, 0x0001, 0x027f, 0x017f, 0x0e7f, 0x0f7f, 0x007c, 0x7803,
++	0x0004, 0x2009, 0x0064, 0x7804, 0xd0ac, 0x0040, 0x1ce8, 0x8109,
++	0x00c0, 0x1c9b, 0x2009, 0x0100, 0x210c, 0xa18a, 0x0003, 0x1048,
++	0x1332, 0x1078, 0x1fca, 0x0e7e, 0x0f7e, 0x2071, 0xa8d6, 0x2079,
++	0x0010, 0x7004, 0xa086, 0x0000, 0x0040, 0x1ce0, 0x7800, 0x007e,
++	0x7820, 0x007e, 0x7830, 0x007e, 0x7834, 0x007e, 0x7838, 0x007e,
++	0x783c, 0x007e, 0x7803, 0x0004, 0x7823, 0x0000, 0x0005, 0x0005,
++	0x2079, 0x0030, 0x7804, 0xd0ac, 0x10c0, 0x1332, 0x2079, 0x0010,
++	0x007f, 0x783e, 0x007f, 0x783a, 0x007f, 0x7836, 0x007f, 0x7832,
++	0x007f, 0x7822, 0x007f, 0x7802, 0x0f7f, 0x0e7f, 0x0078, 0x1ce6,
++	0x0f7f, 0x0e7f, 0x7804, 0xd0ac, 0x10c0, 0x1332, 0x1078, 0x639b,
++	0x007c, 0x0e7e, 0x2071, 0xa908, 0x7003, 0x0000, 0x0e7f, 0x007c,
++	0x0d7e, 0xa280, 0x0004, 0x206c, 0x694c, 0xd1dc, 0x00c0, 0x1d6b,
++	0x6934, 0xa184, 0x0007, 0x0079, 0x1cfd, 0x1d05, 0x1d56, 0x1d05,
++	0x1d05, 0x1d05, 0x1d3b, 0x1d18, 0x1d07, 0x1078, 0x1332, 0x684c,
++	0xd0b4, 0x0040, 0x1e79, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a,
++	0x6812, 0x687c, 0x680a, 0x6880, 0x680e, 0x6958, 0x0078, 0x1d5e,
++	0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x1d05, 0x684c,
++	0xd0b4, 0x0040, 0x1e79, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a,
++	0x6812, 0x687c, 0x680a, 0x6880, 0x680e, 0x6804, 0x681a, 0xa080,
++	0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, 0x6832,
++	0x6958, 0x0078, 0x1d67, 0xa18c, 0x00ff, 0xa186, 0x0015, 0x00c0,
++	0x1d6b, 0x684c, 0xd0b4, 0x0040, 0x1e79, 0x6804, 0x681a, 0xa080,
++	0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, 0x6832,
++	0x6958, 0xa006, 0x682e, 0x682a, 0x0078, 0x1d67, 0x684c, 0xd0b4,
++	0x0040, 0x18ed, 0x6958, 0xa006, 0x682e, 0x682a, 0x2d00, 0x681a,
++	0x6834, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, 0x6832, 0x6926,
++	0x684c, 0xc0dd, 0x684e, 0x0d7f, 0x007c, 0x0f7e, 0x2079, 0x0020,
++	0x7804, 0xd0fc, 0x10c0, 0x1eaa, 0x0e7e, 0x0d7e, 0x2071, 0xa908,
++	0x7000, 0xa005, 0x00c0, 0x1df0, 0x0c7e, 0x7206, 0xa280, 0x0004,
++	0x205c, 0x7004, 0x2068, 0x7803, 0x0004, 0x6818, 0x0d7e, 0x2068,
++	0x686c, 0x7812, 0x6890, 0x0f7e, 0x20e1, 0x9040, 0x2079, 0x0200,
++	0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x0f7f, 0x0d7f, 0x2b68,
++	0x6824, 0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc,
++	0x000f, 0x6908, 0x2001, 0x04fd, 0x2004, 0xa086, 0x0007, 0x0040,
++	0x1db2, 0xa184, 0x0007, 0x0040, 0x1db2, 0x017e, 0x2009, 0x0008,
++	0xa102, 0x017f, 0xa108, 0x791a, 0x7116, 0x701e, 0x680c, 0xa081,
++	0x0000, 0x781e, 0x701a, 0xa006, 0x700e, 0x7012, 0x7004, 0x692c,
++	0x6814, 0xa106, 0x00c0, 0x1dc9, 0x6928, 0x6810, 0xa106, 0x0040,
++	0x1dd6, 0x037e, 0x047e, 0x6b14, 0x6c10, 0x1078, 0x208a, 0x047f,
++	0x037f, 0x0040, 0x1dd6, 0x0c7f, 0x0078, 0x1df0, 0x8aff, 0x00c0,
++	0x1dde, 0x0c7f, 0xa085, 0x0001, 0x0078, 0x1df0, 0x127e, 0x2091,
++	0x8000, 0x2079, 0x0020, 0x2009, 0x0001, 0x1078, 0x1df4, 0x0040,
++	0x1ded, 0x2009, 0x0001, 0x1078, 0x1df4, 0x127f, 0x0c7f, 0xa006,
++	0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x077e, 0x067e, 0x057e, 0x047e,
++	0x037e, 0x027e, 0x8aff, 0x0040, 0x1e72, 0x700c, 0x7214, 0xa23a,
++	0x7010, 0x7218, 0xa203, 0x0048, 0x1e71, 0xa705, 0x0040, 0x1e71,
++	0xa03e, 0x2730, 0x6850, 0xd0fc, 0x00c0, 0x1e24, 0x0d7e, 0x2804,
++	0xac68, 0x2900, 0x0079, 0x1e14, 0x1e53, 0x1e34, 0x1e34, 0x1e53,
++	0x1e53, 0x1e4b, 0x1e53, 0x1e34, 0x1e53, 0x1e3a, 0x1e3a, 0x1e53,
++	0x1e53, 0x1e53, 0x1e42, 0x1e3a, 0xc0fc, 0x6852, 0x6b6c, 0x6a70,
++	0x6d1c, 0x6c20, 0xd99c, 0x0040, 0x1e57, 0x0d7e, 0x2804, 0xac68,
++	0x6f08, 0x6e0c, 0x0078, 0x1e56, 0x6b08, 0x6a0c, 0x6d00, 0x6c04,
++	0x0078, 0x1e56, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c,
++	0x0078, 0x1e56, 0x0d7f, 0x0d7e, 0x6834, 0xa084, 0x00ff, 0xa086,
++	0x001e, 0x00c0, 0x1e53, 0x0d7f, 0x1078, 0x2026, 0x00c0, 0x1dfa,
++	0xa00e, 0x0078, 0x1e72, 0x0d7f, 0x1078, 0x1332, 0x0d7f, 0x7b22,
++	0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000, 0x8000,
++	0x7002, 0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x700c,
++	0xa300, 0x700e, 0x7010, 0xa201, 0x7012, 0x1078, 0x2026, 0x0078,
++	0x1e72, 0xa006, 0x027f, 0x037f, 0x047f, 0x057f, 0x067f, 0x077f,
++	0x007c, 0x1078, 0x1332, 0x027e, 0x2001, 0x0105, 0x2003, 0x0010,
++	0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060,
++	0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x1e92, 0x6850,
++	0xc0bd, 0x6852, 0x0d7f, 0x0c7e, 0x1078, 0x8a01, 0x0c7f, 0x2001,
++	0xa8c0, 0x2004, 0xac06, 0x00c0, 0x1ea7, 0x20e1, 0x9040, 0x1078,
++	0x738a, 0x2011, 0x0000, 0x1078, 0x70ea, 0x1078, 0x639b, 0x027f,
++	0x0078, 0x1f76, 0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x0f7e,
++	0x0e7e, 0x0d7e, 0x0c7e, 0x2079, 0x0020, 0x2071, 0xa908, 0x2b68,
++	0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700, 0x00c0,
++	0x1e7b, 0x7000, 0x0079, 0x1ec4, 0x1f76, 0x1ec8, 0x1f43, 0x1f74,
++	0x8001, 0x7002, 0xd19c, 0x00c0, 0x1edc, 0x8aff, 0x0040, 0x1efb,
++	0x2009, 0x0001, 0x1078, 0x1df4, 0x0040, 0x1f76, 0x2009, 0x0001,
++	0x1078, 0x1df4, 0x0078, 0x1f76, 0x7803, 0x0004, 0xd194, 0x0040,
++	0x1eec, 0x6850, 0xc0fc, 0x6852, 0x8aff, 0x00c0, 0x1ef1, 0x684c,
++	0xc0f5, 0x684e, 0x0078, 0x1ef1, 0x1078, 0x203f, 0x6850, 0xc0fd,
++	0x6852, 0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003,
++	0x0000, 0x0078, 0x1f76, 0x711c, 0x81ff, 0x0040, 0x1f11, 0x7918,
++	0x7922, 0x7827, 0x0000, 0x7803, 0x0001, 0x7000, 0x8000, 0x7002,
++	0x700c, 0xa100, 0x700e, 0x7010, 0xa081, 0x0000, 0x7012, 0x0078,
++	0x1f76, 0x0f7e, 0x027e, 0x781c, 0x007e, 0x7818, 0x007e, 0x2079,
++	0x0100, 0x7a14, 0xa284, 0x0004, 0xa085, 0x0012, 0x7816, 0x037e,
++	0x2019, 0x1000, 0x8319, 0x1040, 0x1332, 0x7820, 0xd0bc, 0x00c0,
++	0x1f22, 0x037f, 0x79c8, 0x007f, 0xa102, 0x017f, 0x007e, 0x017e,
++	0x79c4, 0x007f, 0xa103, 0x78c6, 0x007f, 0x78ca, 0xa284, 0x0004,
++	0xa085, 0x0012, 0x7816, 0x027f, 0x0f7f, 0x7803, 0x0008, 0x7003,
++	0x0000, 0x0078, 0x1f76, 0x8001, 0x7002, 0xd194, 0x0040, 0x1f58,
++	0x7804, 0xd0fc, 0x00c0, 0x1eba, 0xd19c, 0x00c0, 0x1f72, 0x8aff,
++	0x0040, 0x1f76, 0x2009, 0x0001, 0x1078, 0x1df4, 0x0078, 0x1f76,
++	0x027e, 0x037e, 0x6b28, 0x6a2c, 0x1078, 0x203f, 0x0d7e, 0x2804,
++	0xac68, 0x6034, 0xd09c, 0x00c0, 0x1f6b, 0x6808, 0xa31a, 0x680c,
++	0xa213, 0x0078, 0x1f6f, 0x6810, 0xa31a, 0x6814, 0xa213, 0x0d7f,
++	0x0078, 0x1eec, 0x0078, 0x1eec, 0x1078, 0x1332, 0x0c7f, 0x0d7f,
++	0x0e7f, 0x0f7f, 0x017f, 0x007f, 0x127f, 0x007c, 0x0f7e, 0x0e7e,
++	0x2071, 0xa908, 0x7000, 0xa086, 0x0000, 0x0040, 0x1fc7, 0x2079,
++	0x0020, 0x017e, 0x2009, 0x0207, 0x210c, 0xd194, 0x0040, 0x1fa4,
++	0x2009, 0x020c, 0x210c, 0xa184, 0x0003, 0x0040, 0x1fa4, 0x1078,
++	0xa5d2, 0x2001, 0x0133, 0x2004, 0xa005, 0x1040, 0x1332, 0x20e1,
++	0x9040, 0x2001, 0x020c, 0x2102, 0x2009, 0x0206, 0x2104, 0x2009,
++	0x0203, 0x210c, 0xa106, 0x00c0, 0x1faf, 0x20e1, 0x9040, 0x7804,
++	0xd0fc, 0x0040, 0x1f8a, 0x1078, 0x1eaa, 0x7000, 0xa086, 0x0000,
++	0x00c0, 0x1f8a, 0x017f, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0,
++	0x1fbd, 0x20e1, 0x9040, 0x7803, 0x0002, 0x7003, 0x0000, 0x0e7f,
++	0x0f7f, 0x007c, 0x027e, 0x0c7e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2071,
++	0xa908, 0x2079, 0x0020, 0x7000, 0xa086, 0x0000, 0x0040, 0x2003,
++	0x7004, 0x2060, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x1fed,
++	0x6850, 0xc0b5, 0x6852, 0x680c, 0x7a1c, 0xa206, 0x00c0, 0x1fed,
++	0x6808, 0x7a18, 0xa206, 0x0040, 0x2009, 0x2001, 0x0105, 0x2003,
++	0x0010, 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004,
++	0x2060, 0x1078, 0x8a01, 0x20e1, 0x9040, 0x1078, 0x738a, 0x2011,
++	0x0000, 0x1078, 0x70ea, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x027f,
++	0x007c, 0x6810, 0x6a14, 0xa205, 0x00c0, 0x1fed, 0x684c, 0xc0dc,
++	0x684e, 0x2c10, 0x1078, 0x1cf0, 0x2001, 0x0105, 0x2003, 0x0010,
++	0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x2069, 0xa8b1,
++	0x6833, 0x0000, 0x683f, 0x0000, 0x0078, 0x2003, 0x8840, 0x2804,
++	0xa005, 0x00c0, 0x203a, 0x6004, 0xa005, 0x0040, 0x203c, 0x681a,
++	0x2060, 0x6034, 0xa084, 0x000f, 0xa080, 0x206a, 0x2044, 0x88ff,
++	0x1040, 0x1332, 0x8a51, 0x007c, 0x2051, 0x0000, 0x007c, 0x8a50,
++	0x8841, 0x2804, 0xa005, 0x00c0, 0x2059, 0x2c00, 0xad06, 0x0040,
++	0x204e, 0x6000, 0xa005, 0x00c0, 0x204e, 0x2d00, 0x2060, 0x681a,
++	0x6034, 0xa084, 0x000f, 0xa080, 0x207a, 0x2044, 0x88ff, 0x1040,
++	0x1332, 0x007c, 0x0000, 0x0011, 0x0015, 0x0019, 0x001d, 0x0021,
++	0x0025, 0x0029, 0x0000, 0x000f, 0x0015, 0x001b, 0x0021, 0x0027,
++	0x0000, 0x0000, 0x0000, 0x205f, 0x205b, 0x0000, 0x0000, 0x2069,
++	0x0000, 0x205f, 0x0000, 0x2066, 0x2063, 0x0000, 0x0000, 0x0000,
++	0x2069, 0x2066, 0x0000, 0x2061, 0x2061, 0x0000, 0x0000, 0x2069,
++	0x0000, 0x2061, 0x0000, 0x2067, 0x2067, 0x0000, 0x0000, 0x0000,
++	0x2069, 0x2067, 0x0a7e, 0x097e, 0x087e, 0x6b2e, 0x6c2a, 0x6858,
++	0xa055, 0x0040, 0x212d, 0x2d60, 0x6034, 0xa0cc, 0x000f, 0xa9c0,
++	0x206a, 0xa986, 0x0007, 0x0040, 0x20a5, 0xa986, 0x000e, 0x0040,
++	0x20a5, 0xa986, 0x000f, 0x00c0, 0x20a9, 0x605c, 0xa422, 0x6060,
++	0xa31a, 0x2804, 0xa045, 0x00c0, 0x20b7, 0x0050, 0x20b1, 0x0078,
++	0x212d, 0x6004, 0xa065, 0x0040, 0x212d, 0x0078, 0x2094, 0x2804,
++	0xa005, 0x0040, 0x20d5, 0xac68, 0xd99c, 0x00c0, 0x20c5, 0x6808,
++	0xa422, 0x680c, 0xa31b, 0x0078, 0x20c9, 0x6810, 0xa422, 0x6814,
++	0xa31b, 0x0048, 0x20f4, 0x2300, 0xa405, 0x0040, 0x20db, 0x8a51,
++	0x0040, 0x212d, 0x8840, 0x0078, 0x20b7, 0x6004, 0xa065, 0x0040,
++	0x212d, 0x0078, 0x2094, 0x8a51, 0x0040, 0x212d, 0x8840, 0x2804,
++	0xa005, 0x00c0, 0x20ee, 0x6004, 0xa065, 0x0040, 0x212d, 0x6034,
++	0xa0cc, 0x000f, 0xa9c0, 0x206a, 0x2804, 0x2040, 0x2b68, 0x6850,
++	0xc0fc, 0x6852, 0x0078, 0x2121, 0x8422, 0x8420, 0x831a, 0xa399,
++	0x0000, 0x0d7e, 0x2b68, 0x6c6e, 0x6b72, 0x0d7f, 0xd99c, 0x00c0,
++	0x210f, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x1048,
++	0x1332, 0x6800, 0xa420, 0x6804, 0xa319, 0x0078, 0x211b, 0x6910,
++	0x2400, 0xa122, 0x6914, 0x2300, 0xa11b, 0x1048, 0x1332, 0x6800,
++	0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e, 0x6b22, 0x6850, 0xc0fd,
++	0x6852, 0x2c00, 0x681a, 0x2800, 0x6832, 0x2a00, 0x6826, 0x007f,
++	0x007f, 0x007f, 0xa006, 0x0078, 0x2132, 0x087f, 0x097f, 0x0a7f,
++	0xa085, 0x0001, 0x007c, 0x2001, 0x0005, 0x2004, 0xa084, 0x0007,
++	0x0079, 0x213a, 0x2142, 0x2143, 0x2146, 0x2149, 0x214e, 0x2151,
++	0x2156, 0x215b, 0x007c, 0x1078, 0x1eaa, 0x007c, 0x1078, 0x1913,
++	0x007c, 0x1078, 0x1913, 0x1078, 0x1eaa, 0x007c, 0x1078, 0x14be,
++	0x007c, 0x1078, 0x1eaa, 0x1078, 0x14be, 0x007c, 0x1078, 0x1913,
++	0x1078, 0x14be, 0x007c, 0x1078, 0x1913, 0x1078, 0x1eaa, 0x1078,
++	0x14be, 0x007c, 0x127e, 0x2091, 0x2300, 0x2079, 0x0200, 0x2071,
++	0xab80, 0x2069, 0xa600, 0x2009, 0x0004, 0x7912, 0x7817, 0x0004,
++	0x1078, 0x251f, 0x781b, 0x0002, 0x20e1, 0x8700, 0x127f, 0x007c,
++	0x127e, 0x2091, 0x2300, 0x781c, 0xa084, 0x0007, 0x0079, 0x2180,
++	0x21a4, 0x2188, 0x218c, 0x2190, 0x2196, 0x219a, 0x219e, 0x21a2,
++	0x1078, 0x548e, 0x0078, 0x21a4, 0x1078, 0x54da, 0x0078, 0x21a4,
++	0x1078, 0x548e, 0x1078, 0x54da, 0x0078, 0x21a4, 0x1078, 0x21a6,
++	0x0078, 0x21a4, 0x1078, 0x21a6, 0x0078, 0x21a4, 0x1078, 0x21a6,
++	0x0078, 0x21a4, 0x1078, 0x21a6, 0x127f, 0x007c, 0x007e, 0x017e,
++	0x027e, 0x1078, 0xa5d2, 0x7930, 0xa184, 0x0003, 0x0040, 0x21c9,
++	0x2001, 0xa8c0, 0x2004, 0xa005, 0x0040, 0x21c5, 0x2001, 0x0133,
++	0x2004, 0xa005, 0x1040, 0x1332, 0x0c7e, 0x2001, 0xa8c0, 0x2064,
++	0x1078, 0x8a01, 0x0c7f, 0x0078, 0x21f2, 0x20e1, 0x9040, 0x0078,
++	0x21f2, 0xa184, 0x0030, 0x0040, 0x21da, 0x6a00, 0xa286, 0x0003,
++	0x00c0, 0x21d4, 0x0078, 0x21d6, 0x1078, 0x4224, 0x20e1, 0x9010,
++	0x0078, 0x21f2, 0xa184, 0x00c0, 0x0040, 0x21ec, 0x0e7e, 0x037e,
++	0x047e, 0x057e, 0x2071, 0xa8e7, 0x1078, 0x1af4, 0x057f, 0x047f,
++	0x037f, 0x0e7f, 0x0078, 0x21f2, 0xa184, 0x0300, 0x0040, 0x21f2,
++	0x20e1, 0x9020, 0x7932, 0x027f, 0x017f, 0x007f, 0x007c, 0x017e,
++	0x0e7e, 0x0f7e, 0x2071, 0xa600, 0x7128, 0x2001, 0xa890, 0x2102,
++	0x2001, 0xa898, 0x2102, 0xa182, 0x0211, 0x00c8, 0x220b, 0x2009,
++	0x0008, 0x0078, 0x2235, 0xa182, 0x0259, 0x00c8, 0x2213, 0x2009,
++	0x0007, 0x0078, 0x2235, 0xa182, 0x02c1, 0x00c8, 0x221b, 0x2009,
++	0x0006, 0x0078, 0x2235, 0xa182, 0x0349, 0x00c8, 0x2223, 0x2009,
++	0x0005, 0x0078, 0x2235, 0xa182, 0x0421, 0x00c8, 0x222b, 0x2009,
++	0x0004, 0x0078, 0x2235, 0xa182, 0x0581, 0x00c8, 0x2233, 0x2009,
++	0x0003, 0x0078, 0x2235, 0x2009, 0x0002, 0x2079, 0x0200, 0x7912,
++	0x7817, 0x0004, 0x1078, 0x251f, 0x0f7f, 0x0e7f, 0x017f, 0x007c,
++	0x127e, 0x2091, 0x2200, 0x2061, 0x0100, 0x2071, 0xa600, 0x6024,
++	0x6026, 0x6053, 0x0030, 0x6033, 0x00ef, 0x60e7, 0x0000, 0x60eb,
++	0x00ef, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f,
++	0x0080, 0x602f, 0x0000, 0x6007, 0x0eaf, 0x600f, 0x00ff, 0x602b,
++	0x002f, 0x127f, 0x007c, 0x2001, 0xa630, 0x2003, 0x0000, 0x2001,
++	0xa62f, 0x2003, 0x0001, 0x007c, 0x127e, 0x2091, 0x2200, 0x007e,
++	0x017e, 0x027e, 0x6124, 0xa184, 0x002c, 0x00c0, 0x227b, 0xa184,
++	0x0007, 0x0079, 0x2281, 0xa195, 0x0004, 0xa284, 0x0007, 0x0079,
++	0x2281, 0x22ad, 0x2289, 0x228d, 0x2291, 0x2297, 0x229b, 0x22a1,
++	0x22a7, 0x1078, 0x5c56, 0x0078, 0x22ad, 0x1078, 0x5d45, 0x0078,
++	0x22ad, 0x1078, 0x5d45, 0x1078, 0x5c56, 0x0078, 0x22ad, 0x1078,
++	0x22b2, 0x0078, 0x22ad, 0x1078, 0x5c56, 0x1078, 0x22b2, 0x0078,
++	0x22ad, 0x1078, 0x5d45, 0x1078, 0x22b2, 0x0078, 0x22ad, 0x1078,
++	0x5d45, 0x1078, 0x5c56, 0x1078, 0x22b2, 0x027f, 0x017f, 0x007f,
++	0x127f, 0x007c, 0x6124, 0xd1ac, 0x0040, 0x23ac, 0x017e, 0x047e,
++	0x0c7e, 0x644c, 0xa486, 0xf0f0, 0x00c0, 0x22c5, 0x2061, 0x0100,
++	0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74c6, 0xa48c, 0xff00,
++	0x7034, 0xd084, 0x0040, 0x22dd, 0xa186, 0xf800, 0x00c0, 0x22dd,
++	0x703c, 0xd084, 0x00c0, 0x22dd, 0xc085, 0x703e, 0x037e, 0x2418,
++	0x2011, 0x8016, 0x1078, 0x361b, 0x037f, 0xa196, 0xff00, 0x0040,
++	0x231f, 0x6030, 0xa084, 0x00ff, 0x810f, 0xa116, 0x0040, 0x231f,
++	0x7130, 0xd184, 0x00c0, 0x231f, 0x2011, 0xa653, 0x2214, 0xd2ec,
++	0x0040, 0x22fa, 0xc18d, 0x7132, 0x2011, 0xa653, 0x2214, 0xd2ac,
++	0x00c0, 0x231f, 0x6240, 0xa294, 0x0010, 0x0040, 0x2306, 0x6248,
++	0xa294, 0xff00, 0xa296, 0xff00, 0x0040, 0x231f, 0x7030, 0xd08c,
++	0x0040, 0x2371, 0x7034, 0xd08c, 0x00c0, 0x2316, 0x2001, 0xa60c,
++	0x200c, 0xd1ac, 0x00c0, 0x2371, 0xc1ad, 0x2102, 0x037e, 0x73c4,
++	0x2011, 0x8013, 0x1078, 0x361b, 0x037f, 0x0078, 0x2371, 0x7034,
++	0xd08c, 0x00c0, 0x232b, 0x2001, 0xa60c, 0x200c, 0xd1ac, 0x00c0,
++	0x2371, 0xc1ad, 0x2102, 0x037e, 0x73c4, 0x2011, 0x8013, 0x1078,
++	0x361b, 0x037f, 0x7130, 0xc185, 0x7132, 0x2011, 0xa653, 0x220c,
++	0xd1a4, 0x0040, 0x2355, 0x017e, 0x2009, 0x0001, 0x2011, 0x0100,
++	0x1078, 0x5bf1, 0x2019, 0x000e, 0x1078, 0xa195, 0xa484, 0x00ff,
++	0xa080, 0x29c0, 0x200c, 0xa18c, 0xff00, 0x810f, 0x8127, 0xa006,
++	0x2009, 0x000e, 0x1078, 0xa21d, 0x017f, 0xd1ac, 0x00c0, 0x2362,
++	0x017e, 0x2009, 0x0000, 0x2019, 0x0004, 0x1078, 0x284f, 0x017f,
++	0x0078, 0x2371, 0x157e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x1078,
++	0x45c4, 0x00c0, 0x236d, 0x1078, 0x42f8, 0x8108, 0x00f0, 0x2367,
++	0x157f, 0x0c7f, 0x047f, 0x0f7e, 0x2079, 0xa8c4, 0x783c, 0xa086,
++	0x0000, 0x0040, 0x2383, 0x6027, 0x0004, 0x783f, 0x0000, 0x2079,
++	0x0140, 0x7803, 0x0000, 0x0f7f, 0x2011, 0x0003, 0x1078, 0x70e0,
++	0x2011, 0x0002, 0x1078, 0x70ea, 0x1078, 0x6fc4, 0x037e, 0x2019,
++	0x0000, 0x1078, 0x7058, 0x037f, 0x60e3, 0x0000, 0x017f, 0x2001,
++	0xa600, 0x2014, 0xa296, 0x0004, 0x00c0, 0x23a4, 0xd19c, 0x00c0,
++	0x23ac, 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0xa622,
++	0x2003, 0x0000, 0x6027, 0x0020, 0xd194, 0x0040, 0x2490, 0x0f7e,
++	0x2079, 0xa8c4, 0x783c, 0xa086, 0x0001, 0x00c0, 0x23d0, 0x017e,
++	0x6027, 0x0004, 0x783f, 0x0000, 0x2079, 0x0140, 0x7803, 0x1000,
++	0x7803, 0x0000, 0x2079, 0xa8b1, 0x7807, 0x0000, 0x7833, 0x0000,
++	0x1078, 0x62d1, 0x1078, 0x639b, 0x017f, 0x0f7f, 0x0078, 0x2490,
++	0x0f7f, 0x017e, 0x3900, 0xa082, 0xa9e3, 0x00c8, 0x23db, 0x017e,
++	0x1078, 0x747a, 0x017f, 0x6220, 0xd2b4, 0x0040, 0x2446, 0x1078,
++	0x5acb, 0x1078, 0x6e0f, 0x6027, 0x0004, 0x0f7e, 0x2019, 0xa8ba,
++	0x2304, 0xa07d, 0x0040, 0x241c, 0x7804, 0xa086, 0x0032, 0x00c0,
++	0x241c, 0x0d7e, 0x0c7e, 0x0e7e, 0x2069, 0x0140, 0x618c, 0x6288,
++	0x7818, 0x608e, 0x7808, 0x608a, 0x6043, 0x0002, 0x2001, 0x0003,
++	0x8001, 0x00c0, 0x2400, 0x6043, 0x0000, 0x6803, 0x1000, 0x6803,
++	0x0000, 0x618e, 0x628a, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x7810,
++	0x2070, 0x7037, 0x0103, 0x2f60, 0x1078, 0x772d, 0x0e7f, 0x0c7f,
++	0x0d7f, 0x0f7f, 0x017f, 0x007c, 0x0f7f, 0x0d7e, 0x2069, 0x0140,
++	0x6804, 0xa084, 0x4000, 0x0040, 0x2429, 0x6803, 0x1000, 0x6803,
++	0x0000, 0x0d7f, 0x0c7e, 0x2061, 0xa8b1, 0x6028, 0xa09a, 0x00c8,
++	0x00c8, 0x2439, 0x8000, 0x602a, 0x0c7f, 0x1078, 0x6e01, 0x0078,
++	0x248f, 0x2019, 0xa8ba, 0x2304, 0xa065, 0x0040, 0x2443, 0x2009,
++	0x0027, 0x1078, 0x775c, 0x0c7f, 0x0078, 0x248f, 0xd2bc, 0x0040,
++	0x248f, 0x1078, 0x5ad8, 0x6017, 0x0010, 0x6027, 0x0004, 0x0d7e,
++	0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0040, 0x245b, 0x6803,
++	0x1000, 0x6803, 0x0000, 0x0d7f, 0x0c7e, 0x2061, 0xa8b1, 0x6044,
++	0xa09a, 0x00c8, 0x00c8, 0x247e, 0x8000, 0x6046, 0x603c, 0x0c7f,
++	0xa005, 0x0040, 0x248f, 0x2009, 0x07d0, 0x1078, 0x5ad0, 0xa080,
++	0x0007, 0x2004, 0xa086, 0x0006, 0x00c0, 0x247a, 0x6017, 0x0012,
++	0x0078, 0x248f, 0x6017, 0x0016, 0x0078, 0x248f, 0x037e, 0x2019,
++	0x0001, 0x1078, 0x7058, 0x037f, 0x2019, 0xa8c0, 0x2304, 0xa065,
++	0x0040, 0x248e, 0x2009, 0x004f, 0x1078, 0x775c, 0x0c7f, 0x017f,
++	0xd19c, 0x0040, 0x24e4, 0x7034, 0xd0ac, 0x00c0, 0x24c1, 0x017e,
++	0x157e, 0x6027, 0x0008, 0x602f, 0x0020, 0x20a9, 0x000a, 0x00f0,
++	0x249f, 0x602f, 0x0000, 0x6150, 0xa185, 0x1400, 0x6052, 0x20a9,
++	0x0320, 0x00e0, 0x24a9, 0x2091, 0x6000, 0x6020, 0xd09c, 0x00c0,
++	0x24b8, 0x157f, 0x6152, 0x017f, 0x6027, 0x0008, 0x0078, 0x24e4,
++	0x1078, 0x2577, 0x00f0, 0x24a9, 0x157f, 0x6152, 0x017f, 0x6027,
++	0x0008, 0x017e, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, 0x1078,
++	0x70e0, 0x2011, 0x0002, 0x1078, 0x70ea, 0x1078, 0x6fc4, 0x037e,
++	0x2019, 0x0000, 0x1078, 0x7058, 0x037f, 0x60e3, 0x0000, 0x1078,
++	0xa5ad, 0x1078, 0xa5cb, 0x2001, 0xa600, 0x2003, 0x0004, 0x6027,
++	0x0008, 0x1078, 0x1246, 0x017f, 0xa18c, 0xffd0, 0x6126, 0x007c,
++	0x007e, 0x017e, 0x027e, 0x0e7e, 0x0f7e, 0x127e, 0x2091, 0x8000,
++	0x2071, 0xa600, 0x71bc, 0x70be, 0xa116, 0x0040, 0x2518, 0x81ff,
++	0x0040, 0x2500, 0x2011, 0x8011, 0x1078, 0x361b, 0x0078, 0x2518,
++	0x2011, 0x8012, 0x1078, 0x361b, 0x2001, 0xa672, 0x2004, 0xd0fc,
++	0x00c0, 0x2518, 0x037e, 0x0c7e, 0x1078, 0x6f9f, 0x2061, 0x0100,
++	0x2019, 0x0028, 0x2009, 0x0000, 0x1078, 0x284f, 0x0c7f, 0x037f,
++	0x127f, 0x0f7f, 0x0e7f, 0x027f, 0x017f, 0x007f, 0x007c, 0x0c7e,
++	0x0f7e, 0x007e, 0x027e, 0x2061, 0x0100, 0xa190, 0x253b, 0x2204,
++	0x60f2, 0x2011, 0x2548, 0x6000, 0xa082, 0x0003, 0x00c8, 0x2534,
++	0x2001, 0x00ff, 0x0078, 0x2535, 0x2204, 0x60ee, 0x027f, 0x007f,
++	0x0f7f, 0x0c7f, 0x007c, 0x0840, 0x0840, 0x0840, 0x0580, 0x0420,
++	0x0348, 0x02c0, 0x0258, 0x0210, 0x01a8, 0x01a8, 0x01a8, 0x01a8,
++	0x0140, 0x00f8, 0x00d0, 0x00b0, 0x00a0, 0x2028, 0xa18c, 0x00ff,
++	0x2130, 0xa094, 0xff00, 0x00c0, 0x2558, 0x81ff, 0x0040, 0x255c,
++	0x1078, 0x5761, 0x0078, 0x2563, 0xa080, 0x29c0, 0x200c, 0xa18c,
++	0xff00, 0x810f, 0xa006, 0x007c, 0xa080, 0x29c0, 0x200c, 0xa18c,
++	0x00ff, 0x007c, 0x0c7e, 0x2061, 0xa600, 0x6030, 0x0040, 0x2573,
++	0xc09d, 0x0078, 0x2574, 0xc09c, 0x6032, 0x0c7f, 0x007c, 0x007e,
++	0x157e, 0x0f7e, 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd08c,
++	0x00c0, 0x2584, 0x00f0, 0x257e, 0x0f7f, 0x157f, 0x007f, 0x007c,
++	0x0c7e, 0x007e, 0x2061, 0x0100, 0x6030, 0x007e, 0x6048, 0x007e,
++	0x60e4, 0x007e, 0x60e8, 0x007e, 0x6050, 0x007e, 0x60f0, 0x007e,
++	0x60ec, 0x007e, 0x600c, 0x007e, 0x6004, 0x007e, 0x6028, 0x007e,
++	0x60e0, 0x007e, 0x602f, 0x0100, 0x602f, 0x0000, 0x0005, 0x0005,
++	0x0005, 0x0005, 0x602f, 0x0040, 0x602f, 0x0000, 0x007f, 0x60e2,
++	0x007f, 0x602a, 0x007f, 0x6006, 0x007f, 0x600e, 0x007f, 0x60ee,
++	0x007f, 0x60f2, 0x007f, 0x6052, 0x007f, 0x60ea, 0x007f, 0x60e6,
++	0x007f, 0x604a, 0x007f, 0x6032, 0x007f, 0x0c7f, 0x007c, 0x25e7,
++	0x25eb, 0x25ef, 0x25f5, 0x25fb, 0x2601, 0x2607, 0x260f, 0x2617,
++	0x261d, 0x2623, 0x262b, 0x2633, 0x263b, 0x2643, 0x264d, 0x2657,
++	0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657,
++	0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x107e,
++	0x007e, 0x0078, 0x2670, 0x107e, 0x007e, 0x0078, 0x2670, 0x107e,
++	0x007e, 0x1078, 0x226c, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078,
++	0x226c, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x0078,
++	0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x0078, 0x2670, 0x107e,
++	0x007e, 0x1078, 0x226c, 0x1078, 0x2133, 0x0078, 0x2670, 0x107e,
++	0x007e, 0x1078, 0x226c, 0x1078, 0x2133, 0x0078, 0x2670, 0x107e,
++	0x007e, 0x1078, 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078,
++	0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x226c, 0x1078,
++	0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x226c, 0x1078,
++	0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x1078,
++	0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x1078,
++	0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x226c, 0x1078,
++	0x2133, 0x1078, 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078,
++	0x226c, 0x1078, 0x2133, 0x1078, 0x2178, 0x0078, 0x2670, 0x0005,
++	0x0078, 0x2657, 0xb084, 0x003c, 0x8004, 0x8004, 0x0079, 0x2660,
++	0x2670, 0x25ed, 0x25f1, 0x25f7, 0x25fd, 0x2603, 0x2609, 0x2611,
++	0x2619, 0x261f, 0x2625, 0x262d, 0x2635, 0x263d, 0x2645, 0x264f,
++	0x0008, 0x265a, 0x007f, 0x107f, 0x2091, 0x8001, 0x007c, 0x0c7e,
++	0x027e, 0x047e, 0x2021, 0x0000, 0x1078, 0x4967, 0x00c0, 0x2772,
++	0x70cc, 0xd09c, 0x0040, 0x268e, 0xd084, 0x00c0, 0x268e, 0xd0bc,
++	0x00c0, 0x2772, 0x1078, 0x2776, 0x0078, 0x2772, 0xd0cc, 0x00c0,
++	0x2772, 0xd094, 0x0040, 0x2698, 0x7097, 0xffff, 0x0078, 0x2772,
++	0x2001, 0x010c, 0x203c, 0x7284, 0xd284, 0x0040, 0x2701, 0xd28c,
++	0x00c0, 0x2701, 0x037e, 0x7394, 0xa38e, 0xffff, 0x0040, 0x26ab,
++	0x83ff, 0x00c0, 0x26ad, 0x2019, 0x0001, 0x8314, 0xa2e0, 0xacc0,
++	0x2c04, 0xa38c, 0x0001, 0x0040, 0x26ba, 0xa084, 0xff00, 0x8007,
++	0x0078, 0x26bc, 0xa084, 0x00ff, 0xa70e, 0x0040, 0x26f6, 0xa08e,
++	0x0000, 0x0040, 0x26f6, 0xa08e, 0x00ff, 0x00c0, 0x26d3, 0x7230,
++	0xd284, 0x00c0, 0x26fc, 0x7284, 0xc28d, 0x7286, 0x7097, 0xffff,
++	0x037f, 0x0078, 0x2701, 0x2009, 0x0000, 0x1078, 0x254d, 0x1078,
++	0x455c, 0x00c0, 0x26f9, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006,
++	0x00c0, 0x26f0, 0x7030, 0xd08c, 0x0040, 0x26ea, 0x6000, 0xd0bc,
++	0x0040, 0x26f0, 0x1078, 0x278c, 0x0040, 0x26f9, 0x0078, 0x26f6,
++	0x1078, 0x28c4, 0x1078, 0x27b9, 0x0040, 0x26f9, 0x8318, 0x0078,
++	0x26ad, 0x7396, 0x0078, 0x26fe, 0x7097, 0xffff, 0x037f, 0x0078,
++	0x2772, 0xa780, 0x29c0, 0x203c, 0xa7bc, 0xff00, 0x873f, 0x2041,
++	0x007e, 0x7094, 0xa096, 0xffff, 0x00c0, 0x2713, 0x2009, 0x0000,
++	0x28a8, 0x0078, 0x271f, 0xa812, 0x0048, 0x271b, 0x2008, 0xa802,
++	0x20a8, 0x0078, 0x271f, 0x7097, 0xffff, 0x0078, 0x2772, 0x2700,
++	0x157e, 0x017e, 0xa106, 0x0040, 0x2766, 0xc484, 0x1078, 0x45c4,
++	0x0040, 0x2730, 0x1078, 0x455c, 0x00c0, 0x276f, 0x0078, 0x2731,
++	0xc485, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2740,
++	0x7030, 0xd08c, 0x0040, 0x275e, 0x6000, 0xd0bc, 0x00c0, 0x275e,
++	0x7284, 0xd28c, 0x0040, 0x2756, 0x6004, 0xa084, 0x00ff, 0xa082,
++	0x0006, 0x0048, 0x2766, 0xd484, 0x00c0, 0x2752, 0x1078, 0x457f,
++	0x0078, 0x2754, 0x1078, 0x298e, 0x0078, 0x2766, 0x1078, 0x28c4,
++	0x1078, 0x27b9, 0x0040, 0x276f, 0x0078, 0x2766, 0x1078, 0x2959,
++	0x0040, 0x2766, 0x1078, 0x278c, 0x0040, 0x276f, 0x017f, 0x8108,
++	0x157f, 0x00f0, 0x271f, 0x7097, 0xffff, 0x0078, 0x2772, 0x017f,
++	0x157f, 0x7196, 0x047f, 0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x017e,
++	0x7097, 0x0001, 0x2009, 0x007e, 0x1078, 0x455c, 0x00c0, 0x2789,
++	0x1078, 0x28c4, 0x1078, 0x27b9, 0x0040, 0x2789, 0x70cc, 0xc0bd,
++	0x70ce, 0x017f, 0x0c7f, 0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e,
++	0x2c68, 0x2001, 0xa657, 0x2004, 0xa084, 0x00ff, 0x6842, 0x1078,
++	0x76c7, 0x0040, 0x27b4, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001,
++	0x0000, 0x1078, 0x44ee, 0x2001, 0x0000, 0x1078, 0x4502, 0x127e,
++	0x2091, 0x8000, 0x7090, 0x8000, 0x7092, 0x127f, 0x2009, 0x0004,
++	0x1078, 0x775c, 0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f,
++	0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x2001, 0xa657,
++	0x2004, 0xa084, 0x00ff, 0x6842, 0x1078, 0x9187, 0x0040, 0x27f2,
++	0x2d00, 0x601a, 0x6800, 0xc0c4, 0x6802, 0x68a0, 0xa086, 0x007e,
++	0x0040, 0x27db, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0,
++	0x27db, 0x1078, 0x2880, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078,
++	0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x127e, 0x2091, 0x8000,
++	0x7090, 0x8000, 0x7092, 0x127f, 0x2009, 0x0002, 0x1078, 0x775c,
++	0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x0c7e,
++	0x027e, 0x2009, 0x0080, 0x1078, 0x455c, 0x00c0, 0x2805, 0x1078,
++	0x2808, 0x0040, 0x2805, 0x70d3, 0xffff, 0x027f, 0x0c7f, 0x007c,
++	0x017e, 0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x1078, 0x76c7, 0x0040,
++	0x282a, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078,
++	0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x127e, 0x2091, 0x8000,
++	0x70d4, 0x8000, 0x70d6, 0x127f, 0x2009, 0x0002, 0x1078, 0x775c,
++	0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x0c7e,
++	0x0d7e, 0x127e, 0x2091, 0x8000, 0x2009, 0x007f, 0x1078, 0x455c,
++	0x00c0, 0x284b, 0x2c68, 0x1078, 0x76c7, 0x0040, 0x284b, 0x2d00,
++	0x601a, 0x6312, 0x601f, 0x0001, 0x620a, 0x2009, 0x0022, 0x1078,
++	0x775c, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x0c7f, 0x007c, 0x0e7e,
++	0x0c7e, 0x067e, 0x037e, 0x027e, 0x1078, 0x5f0e, 0x1078, 0x5eae,
++	0x1078, 0x8068, 0x2130, 0x81ff, 0x0040, 0x2864, 0x20a9, 0x007e,
++	0x2009, 0x0000, 0x0078, 0x2868, 0x20a9, 0x007f, 0x2009, 0x0000,
++	0x017e, 0x1078, 0x45c4, 0x00c0, 0x2871, 0x1078, 0x47e9, 0x1078,
++	0x42f8, 0x017f, 0x8108, 0x00f0, 0x2868, 0x86ff, 0x00c0, 0x287a,
++	0x1078, 0x119b, 0x027f, 0x037f, 0x067f, 0x0c7f, 0x0e7f, 0x007c,
++	0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e, 0x6218, 0x2270, 0x72a0,
++	0x027e, 0x2019, 0x0029, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000,
++	0x1078, 0x5e0a, 0x2c08, 0x1078, 0x9f8b, 0x077f, 0x017f, 0x2e60,
++	0x1078, 0x47e9, 0x6210, 0x6314, 0x1078, 0x42f8, 0x6212, 0x6316,
++	0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x007e,
++	0x6018, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x00c0, 0x28ba, 0x2071,
++	0xa600, 0x7090, 0xa005, 0x0040, 0x28b7, 0x8001, 0x7092, 0x007f,
++	0x0e7f, 0x007c, 0x2071, 0xa600, 0x70d4, 0xa005, 0x0040, 0x28b7,
++	0x8001, 0x70d6, 0x0078, 0x28b7, 0x6000, 0xc08c, 0x6002, 0x007c,
++	0x0f7e, 0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e, 0x157e, 0x2178,
++	0x81ff, 0x00c0, 0x28d7, 0x20a9, 0x0001, 0x0078, 0x28f2, 0x2001,
++	0xa653, 0x2004, 0xd0c4, 0x0040, 0x28ee, 0xd0a4, 0x0040, 0x28ee,
++	0x047e, 0x6018, 0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427,
++	0xa006, 0x2009, 0x002d, 0x1078, 0xa21d, 0x047f, 0x20a9, 0x00ff,
++	0x2011, 0x0000, 0x027e, 0xa28e, 0x007e, 0x0040, 0x2936, 0xa28e,
++	0x007f, 0x0040, 0x2936, 0xa28e, 0x0080, 0x0040, 0x2936, 0xa288,
++	0xa735, 0x210c, 0x81ff, 0x0040, 0x2936, 0x8fff, 0x1040, 0x2942,
++	0x0c7e, 0x2160, 0x2001, 0x0001, 0x1078, 0x4972, 0x0c7f, 0x2019,
++	0x0029, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a,
++	0x0c7e, 0x027e, 0x2160, 0x6204, 0xa294, 0x00ff, 0xa286, 0x0006,
++	0x00c0, 0x2926, 0x6007, 0x0404, 0x0078, 0x292b, 0x2001, 0x0004,
++	0x8007, 0xa215, 0x6206, 0x027f, 0x0c7f, 0x017e, 0x2c08, 0x1078,
++	0x9f8b, 0x017f, 0x077f, 0x2160, 0x1078, 0x47e9, 0x027f, 0x8210,
++	0x00f0, 0x28f2, 0x157f, 0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f,
++	0x0f7f, 0x007c, 0x047e, 0x027e, 0x017e, 0x2001, 0xa653, 0x2004,
++	0xd0c4, 0x0040, 0x2955, 0xd0a4, 0x0040, 0x2955, 0xa006, 0x2220,
++	0x8427, 0x2009, 0x0029, 0x1078, 0xa21d, 0x017f, 0x027f, 0x047f,
++	0x007c, 0x017e, 0x027e, 0x037e, 0x0c7e, 0x7284, 0x82ff, 0x0040,
++	0x2987, 0xa290, 0xa653, 0x2214, 0xd2ac, 0x00c0, 0x2987, 0x2100,
++	0x1078, 0x2564, 0x81ff, 0x0040, 0x2989, 0x2019, 0x0001, 0x8314,
++	0xa2e0, 0xacc0, 0x2c04, 0xd384, 0x0040, 0x297b, 0xa084, 0xff00,
++	0x8007, 0x0078, 0x297d, 0xa084, 0x00ff, 0xa116, 0x0040, 0x2989,
++	0xa096, 0x00ff, 0x0040, 0x2987, 0x8318, 0x0078, 0x296f, 0xa085,
++	0x0001, 0x0c7f, 0x037f, 0x027f, 0x017f, 0x007c, 0x017e, 0x0c7e,
++	0x127e, 0x2091, 0x8000, 0x017e, 0x027e, 0x037e, 0x2110, 0x027e,
++	0x2019, 0x0029, 0x1078, 0x73d0, 0x027f, 0x1078, 0xa4f1, 0x037f,
++	0x027f, 0x017f, 0xa180, 0xa735, 0x2004, 0xa065, 0x0040, 0x29b7,
++	0x017e, 0x0c7e, 0x1078, 0x9187, 0x017f, 0x1040, 0x1332, 0x611a,
++	0x1078, 0x2880, 0x1078, 0x772d, 0x017f, 0x1078, 0x457f, 0x127f,
++	0x0c7f, 0x017f, 0x007c, 0x2001, 0xa633, 0x2004, 0xd0cc, 0x007c,
++	0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da,
++	0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce,
++	0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5,
++	0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3,
++	0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9,
++	0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b,
++	0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081,
++	0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073,
++	0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69,
++	0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056,
++	0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c,
++	0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c,
++	0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831,
++	0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026,
++	0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017,
++	0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000,
++	0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000,
++	0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300,
++	0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100,
++	0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00,
++	0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800,
++	0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000,
++	0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000,
++	0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500,
++	0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000,
++	0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000,
++	0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000,
++	0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000,
++	0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++	0x2071, 0xa682, 0x7003, 0x0002, 0xa006, 0x7012, 0x7016, 0x703a,
++	0x703e, 0x7033, 0xa692, 0x7037, 0xa692, 0x7007, 0x0001, 0x2061,
++	0xa6d2, 0x6003, 0x0002, 0x007c, 0x0090, 0x2ae7, 0x0068, 0x2ae7,
++	0x2071, 0xa682, 0x2b78, 0x7818, 0xd084, 0x00c0, 0x2ae7, 0x2a60,
++	0x7820, 0xa08e, 0x0069, 0x00c0, 0x2bd7, 0x0079, 0x2b6b, 0x007c,
++	0x2071, 0xa682, 0x7004, 0x0079, 0x2aed, 0x2af1, 0x2af2, 0x2afc,
++	0x2b0e, 0x007c, 0x0090, 0x2afb, 0x0068, 0x2afb, 0x2b78, 0x7818,
++	0xd084, 0x0040, 0x2b1a, 0x007c, 0x2b78, 0x2061, 0xa6d2, 0x6008,
++	0xa08e, 0x0100, 0x0040, 0x2b09, 0xa086, 0x0200, 0x0040, 0x2bcf,
++	0x007c, 0x7014, 0x2068, 0x2a60, 0x7018, 0x007a, 0x7010, 0x2068,
++	0x6834, 0xa086, 0x0103, 0x0040, 0x2b16, 0x007c, 0x2a60, 0x2b78,
++	0x7018, 0x007a, 0x2a60, 0x7820, 0xa08a, 0x0040, 0x00c8, 0x2b23,
++	0x61bc, 0x0079, 0x2b2b, 0x2100, 0xa08a, 0x003f, 0x00c8, 0x2bcb,
++	0x61bc, 0x0079, 0x2b6b, 0x2bad, 0x2bdf, 0x2be7, 0x2beb, 0x2bf3,
++	0x2bf9, 0x2bfd, 0x2c09, 0x2c0d, 0x2c17, 0x2c1b, 0x2bcb, 0x2bcb,
++	0x2bcb, 0x2c1f, 0x2bcb, 0x2c2f, 0x2c46, 0x2c5d, 0x2cdd, 0x2ce2,
++	0x2d0f, 0x2d69, 0x2d7a, 0x2d98, 0x2dd9, 0x2de3, 0x2df0, 0x2e03,
++	0x2e22, 0x2e2b, 0x2e68, 0x2e6e, 0x2bcb, 0x2e8a, 0x2bcb, 0x2bcb,
++	0x2bcb, 0x2bcb, 0x2bcb, 0x2e91, 0x2e9b, 0x2bcb, 0x2bcb, 0x2bcb,
++	0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2ea3, 0x2bcb, 0x2bcb,
++	0x2bcb, 0x2bcb, 0x2bcb, 0x2eb5, 0x2ece, 0x2bcb, 0x2bcb, 0x2bcb,
++	0x2bcb, 0x2bcb, 0x2bcb, 0x2ee0, 0x2f37, 0x2f95, 0x2fa9, 0x2bcb,
++	0x2bcb, 0x2bcb, 0x398e, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb,
++	0x2bcb, 0x2bcb, 0x2bcb, 0x2c17, 0x2c1b, 0x2fc0, 0x2bcb, 0x2fcd,
++	0x3a26, 0x3a83, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb,
++	0x2bcb, 0x2bcb, 0x2bcb, 0x301a, 0x314f, 0x316b, 0x3177, 0x31da,
++	0x3233, 0x323e, 0x327d, 0x328c, 0x329b, 0x329e, 0x2fd1, 0x32c2,
++	0x331e, 0x332b, 0x343c, 0x356f, 0x3599, 0x36a6, 0x2bcb, 0x36b6,
++	0x36f0, 0x37bf, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x3827, 0x3843,
++	0x38bd, 0x3977, 0x713c, 0x0078, 0x2bad, 0x2021, 0x4000, 0x1078,
++	0x35f5, 0x127e, 0x2091, 0x8000, 0x0068, 0x2bba, 0x7818, 0xd084,
++	0x0040, 0x2bbd, 0x127f, 0x0078, 0x2bb1, 0x7c22, 0x7926, 0x7a2a,
++	0x7b2e, 0x781b, 0x0001, 0x2091, 0x4080, 0x7007, 0x0001, 0x2091,
++	0x5000, 0x127f, 0x007c, 0x2021, 0x4001, 0x0078, 0x2baf, 0x2021,
++	0x4002, 0x0078, 0x2baf, 0x2021, 0x4003, 0x0078, 0x2baf, 0x2021,
++	0x4005, 0x0078, 0x2baf, 0x2021, 0x4006, 0x0078, 0x2baf, 0xa02e,
++	0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0078, 0x3604, 0x7823,
++	0x0004, 0x7824, 0x007a, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824,
++	0x7930, 0x0078, 0x3608, 0x7924, 0x7828, 0x2114, 0x200a, 0x0078,
++	0x2bad, 0x7924, 0x2114, 0x0078, 0x2bad, 0x2099, 0x0009, 0x20a1,
++	0x0009, 0x20a9, 0x0007, 0x53a3, 0x7924, 0x7a28, 0x7b2c, 0x0078,
++	0x2bad, 0x7824, 0x2060, 0x0078, 0x2c21, 0x2009, 0x0001, 0x2011,
++	0x0013, 0x2019, 0x0018, 0x783b, 0x0017, 0x0078, 0x2bad, 0x7d38,
++	0x7c3c, 0x0078, 0x2be1, 0x7d38, 0x7c3c, 0x0078, 0x2bed, 0x2061,
++	0x1000, 0x610c, 0xa006, 0x2c14, 0xa200, 0x8c60, 0x8109, 0x00c0,
++	0x2c23, 0x2010, 0xa005, 0x0040, 0x2bad, 0x0078, 0x2bd3, 0x2069,
++	0xa652, 0x7824, 0x7930, 0xa11a, 0x00c8, 0x2bdb, 0x8019, 0x0040,
++	0x2bdb, 0x684a, 0x6942, 0x782c, 0x6852, 0x7828, 0x6856, 0xa006,
++	0x685a, 0x685e, 0x1078, 0x4eae, 0x0078, 0x2bad, 0x2069, 0xa652,
++	0x7824, 0x7934, 0xa11a, 0x00c8, 0x2bdb, 0x8019, 0x0040, 0x2bdb,
++	0x684e, 0x6946, 0x782c, 0x6862, 0x7828, 0x6866, 0xa006, 0x686a,
++	0x686e, 0x1078, 0x4a3e, 0x0078, 0x2bad, 0xa02e, 0x2520, 0x81ff,
++	0x00c0, 0x2bd7, 0x7924, 0x7b28, 0x7a2c, 0x20a9, 0x0005, 0x20a1,
++	0xa689, 0x41a1, 0x1078, 0x35ba, 0x0040, 0x2bd7, 0x2009, 0x0020,
++	0x1078, 0x3604, 0x701b, 0x2c75, 0x007c, 0x6834, 0x2008, 0xa084,
++	0x00ff, 0xa096, 0x0011, 0x0040, 0x2c85, 0xa096, 0x0019, 0x0040,
++	0x2c85, 0xa096, 0x0015, 0x00c0, 0x2bd7, 0x810f, 0xa18c, 0x00ff,
++	0x0040, 0x2bd7, 0x710e, 0x700c, 0x8001, 0x0040, 0x2cb6, 0x700e,
++	0x1078, 0x35ba, 0x0040, 0x2bd7, 0x2009, 0x0020, 0x2061, 0xa6d2,
++	0x6224, 0x6328, 0x642c, 0x6530, 0xa290, 0x0040, 0xa399, 0x0000,
++	0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x1078, 0x3604, 0x701b, 0x2ca9,
++	0x007c, 0x6834, 0xa084, 0x00ff, 0xa096, 0x0002, 0x0040, 0x2cb4,
++	0xa096, 0x000a, 0x00c0, 0x2bd7, 0x0078, 0x2c8b, 0x7010, 0x2068,
++	0x6838, 0xc0fd, 0x683a, 0x1078, 0x4431, 0x00c0, 0x2cc4, 0x7007,
++	0x0003, 0x701b, 0x2cc6, 0x007c, 0x1078, 0x4b51, 0x127e, 0x2091,
++	0x8000, 0x20a9, 0x0005, 0x2099, 0xa689, 0x530a, 0x2100, 0xa210,
++	0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0xad80, 0x000d,
++	0x2009, 0x0020, 0x127f, 0x0078, 0x3608, 0x61a4, 0x7824, 0x60a6,
++	0x0078, 0x2bad, 0x2091, 0x8000, 0x7823, 0x4000, 0x7827, 0x4953,
++	0x782b, 0x5020, 0x782f, 0x2020, 0x2009, 0x017f, 0x2104, 0x7832,
++	0x3f00, 0x7836, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, 0x603c,
++	0x8007, 0xa205, 0x783a, 0x2009, 0x04fd, 0x2104, 0x783e, 0x781b,
++	0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2071, 0x0010, 0x20c1,
++	0x00f0, 0xa08a, 0x0003, 0x00c8, 0x0427, 0x0078, 0x0423, 0x81ff,
++	0x00c0, 0x2bd7, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x45c4,
++	0x00c0, 0x2bdb, 0x7e38, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0048,
++	0x2d23, 0x0078, 0x2bdb, 0x7c28, 0x7d2c, 0x1078, 0x47a4, 0xd28c,
++	0x00c0, 0x2d2e, 0x1078, 0x4736, 0x0078, 0x2d30, 0x1078, 0x4772,
++	0x00c0, 0x2d5a, 0x2061, 0xad00, 0x127e, 0x2091, 0x8000, 0x6000,
++	0xa086, 0x0000, 0x0040, 0x2d48, 0x6010, 0xa06d, 0x0040, 0x2d48,
++	0x683c, 0xa406, 0x00c0, 0x2d48, 0x6840, 0xa506, 0x0040, 0x2d53,
++	0x127f, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004, 0xac02, 0x00c8,
++	0x2bd7, 0x0078, 0x2d34, 0x1078, 0x8a01, 0x127f, 0x0040, 0x2bd7,
++	0x0078, 0x2bad, 0xa00e, 0x2001, 0x0005, 0x1078, 0x4b51, 0x127e,
++	0x2091, 0x8000, 0x1078, 0x8f85, 0x1078, 0x4a73, 0x127f, 0x0078,
++	0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2, 0x0040, 0x2bdb,
++	0x1078, 0x4673, 0x0040, 0x2bd7, 0x1078, 0x47b2, 0x0040, 0x2bd7,
++	0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040,
++	0x2bdb, 0x1078, 0x482f, 0x0040, 0x2bd7, 0x2019, 0x0005, 0x1078,
++	0x47d3, 0x0040, 0x2bd7, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x2bdb,
++	0x8003, 0x800b, 0x810b, 0xa108, 0x1078, 0x5a52, 0x0078, 0x2bad,
++	0x127e, 0x2091, 0x8000, 0x81ff, 0x0040, 0x2da2, 0x2009, 0x0001,
++	0x0078, 0x2dd3, 0x2029, 0x00ff, 0x6450, 0x2400, 0xa506, 0x0040,
++	0x2dcd, 0x2508, 0x1078, 0x45c4, 0x00c0, 0x2dcd, 0x1078, 0x482f,
++	0x00c0, 0x2db8, 0x2009, 0x0002, 0x62ac, 0x2518, 0x0078, 0x2dd3,
++	0x2019, 0x0004, 0x1078, 0x47d3, 0x00c0, 0x2dc2, 0x2009, 0x0006,
++	0x0078, 0x2dd3, 0x7824, 0xa08a, 0x1000, 0x00c8, 0x2dd6, 0x8003,
++	0x800b, 0x810b, 0xa108, 0x1078, 0x5a52, 0x8529, 0x00c8, 0x2da5,
++	0x127f, 0x0078, 0x2bad, 0x127f, 0x0078, 0x2bd7, 0x127f, 0x0078,
++	0x2bdb, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, 0x46e7, 0x1078,
++	0x47a4, 0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2,
++	0x0040, 0x2bdb, 0x1078, 0x46d6, 0x1078, 0x47a4, 0x0078, 0x2bad,
++	0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078,
++	0x4775, 0x0040, 0x2bd7, 0x1078, 0x4484, 0x1078, 0x472f, 0x1078,
++	0x47a4, 0x0078, 0x2bad, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078,
++	0x4673, 0x0040, 0x2bd7, 0x62a0, 0x2019, 0x0005, 0x0c7e, 0x1078,
++	0x47e9, 0x0c7f, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078,
++	0x5e0a, 0x2009, 0x0000, 0x1078, 0x9f8b, 0x077f, 0x1078, 0x47a4,
++	0x0078, 0x2bad, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, 0x47a4,
++	0x2208, 0x0078, 0x2bad, 0x157e, 0x0d7e, 0x0e7e, 0x2069, 0xa714,
++	0x6810, 0x6914, 0xa10a, 0x00c8, 0x2e37, 0x2009, 0x0000, 0x6816,
++	0x2011, 0x0000, 0x2019, 0x0000, 0x20a9, 0x00ff, 0x2069, 0xa735,
++	0x2d04, 0xa075, 0x0040, 0x2e4c, 0x704c, 0x1078, 0x2e56, 0xa210,
++	0x7080, 0x1078, 0x2e56, 0xa318, 0x8d68, 0x00f0, 0x2e40, 0x2300,
++	0xa218, 0x0e7f, 0x0d7f, 0x157f, 0x0078, 0x2bad, 0x0f7e, 0x017e,
++	0xa07d, 0x0040, 0x2e65, 0x2001, 0x0000, 0x8000, 0x2f0c, 0x81ff,
++	0x0040, 0x2e65, 0x2178, 0x0078, 0x2e5d, 0x017f, 0x0f7f, 0x007c,
++	0x2069, 0xa714, 0x6910, 0x62a8, 0x0078, 0x2bad, 0x81ff, 0x00c0,
++	0x2bd7, 0x6150, 0xa190, 0x29c0, 0x2214, 0xa294, 0x00ff, 0x6070,
++	0xa084, 0xff00, 0xa215, 0x636c, 0x67cc, 0xd79c, 0x0040, 0x2e84,
++	0x2031, 0x0001, 0x0078, 0x2e86, 0x2031, 0x0000, 0x7e3a, 0x7f3e,
++	0x0078, 0x2bad, 0x6140, 0x6244, 0x2019, 0xa8a2, 0x231c, 0x0078,
++	0x2bad, 0x127e, 0x2091, 0x8000, 0x6134, 0x6338, 0xa006, 0x2010,
++	0x127f, 0x0078, 0x2bad, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x6244,
++	0x6338, 0x0078, 0x2bad, 0x6140, 0x6244, 0x7824, 0x6042, 0x7b28,
++	0x6346, 0x2069, 0xa652, 0x831f, 0xa305, 0x6816, 0x782c, 0x2069,
++	0xa8a2, 0x2d1c, 0x206a, 0x0078, 0x2bad, 0x017e, 0x127e, 0x2091,
++	0x8000, 0x7824, 0x6036, 0xd094, 0x0040, 0x2ec8, 0x7828, 0xa085,
++	0x0001, 0x2009, 0xa8ab, 0x200a, 0x2001, 0xffff, 0x1078, 0x5ae6,
++	0x782c, 0x603a, 0x127f, 0x017f, 0x0078, 0x2bad, 0x1078, 0x35e4,
++	0x0040, 0x2bdb, 0x7828, 0xa00d, 0x0040, 0x2bdb, 0x782c, 0xa005,
++	0x0040, 0x2bdb, 0x6244, 0x6146, 0x6338, 0x603a, 0x0078, 0x2bad,
++	0x2001, 0xa600, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x0c7e,
++	0x2061, 0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff,
++	0x00c0, 0x2ef7, 0x6030, 0xa085, 0xff00, 0x0078, 0x2f06, 0xa182,
++	0x007f, 0x00c8, 0x2f30, 0xa188, 0x29c0, 0x210c, 0xa18c, 0x00ff,
++	0x6030, 0xa116, 0x0040, 0x2f30, 0x810f, 0xa105, 0x127e, 0x2091,
++	0x8000, 0x007e, 0x1078, 0x76c7, 0x007f, 0x0040, 0x2f2c, 0x601a,
++	0x600b, 0xbc09, 0x601f, 0x0001, 0x1078, 0x35ba, 0x0040, 0x2f33,
++	0x6837, 0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd,
++	0x683a, 0x701b, 0x2f8e, 0x2d00, 0x6012, 0x2009, 0x0032, 0x1078,
++	0x775c, 0x127f, 0x0c7f, 0x007c, 0x127f, 0x0c7f, 0x0078, 0x2bd7,
++	0x0c7f, 0x0078, 0x2bdb, 0x1078, 0x772d, 0x0078, 0x2f2c, 0x2001,
++	0xa600, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x0c7e, 0x2061,
++	0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff, 0x00c0,
++	0x2f4e, 0x6030, 0xa085, 0xff00, 0x0078, 0x2f5d, 0xa182, 0x007f,
++	0x00c8, 0x2f87, 0xa188, 0x29c0, 0x210c, 0xa18c, 0x00ff, 0x6030,
++	0xa116, 0x0040, 0x2f87, 0x810f, 0xa105, 0x127e, 0x2091, 0x8000,
++	0x007e, 0x1078, 0x76c7, 0x007f, 0x0040, 0x2f83, 0x601a, 0x600b,
++	0xbc05, 0x601f, 0x0001, 0x1078, 0x35ba, 0x0040, 0x2f8a, 0x6837,
++	0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a,
++	0x701b, 0x2f8e, 0x2d00, 0x6012, 0x2009, 0x0032, 0x1078, 0x775c,
++	0x127f, 0x0c7f, 0x007c, 0x127f, 0x0c7f, 0x0078, 0x2bd7, 0x0c7f,
++	0x0078, 0x2bdb, 0x1078, 0x772d, 0x0078, 0x2f83, 0x6830, 0xa086,
++	0x0100, 0x0040, 0x2bd7, 0x0078, 0x2bad, 0x2061, 0xa933, 0x127e,
++	0x2091, 0x8000, 0x6000, 0xd084, 0x0040, 0x2fa6, 0x6104, 0x6208,
++	0x2019, 0xa612, 0x231c, 0x127f, 0x0078, 0x2bad, 0x127f, 0x0078,
++	0x2bdb, 0x81ff, 0x00c0, 0x2bd7, 0x127e, 0x2091, 0x8000, 0x6248,
++	0x6064, 0xa202, 0x0048, 0x2fbd, 0xa085, 0x0001, 0x1078, 0x256a,
++	0x1078, 0x3c9e, 0x127f, 0x0078, 0x2bad, 0x127f, 0x0078, 0x2bdb,
++	0x127e, 0x2091, 0x8000, 0x20a9, 0x0012, 0x2001, 0xa640, 0x20a0,
++	0xa006, 0x40a4, 0x127f, 0x0078, 0x2bad, 0x7d38, 0x7c3c, 0x0078,
++	0x2c5f, 0x7824, 0xa09c, 0x00ff, 0xa39a, 0x0003, 0x00c8, 0x2bd7,
++	0x6250, 0xa084, 0xff00, 0x8007, 0xa206, 0x00c0, 0x2fe9, 0x2001,
++	0xa640, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078,
++	0x3608, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040, 0x2bdb,
++	0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2bd7, 0x0c7e,
++	0x1078, 0x35ba, 0x0c7f, 0x0040, 0x2bd7, 0x6837, 0x0000, 0x6838,
++	0xc0fd, 0x683a, 0x1078, 0x8e4a, 0x0040, 0x2bd7, 0x7007, 0x0003,
++	0x701b, 0x300b, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2bd7,
++	0xad80, 0x000e, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
++	0x0078, 0x3608, 0x1078, 0x35ba, 0x0040, 0x2bd7, 0x1078, 0x42dd,
++	0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3604,
++	0x701b, 0x302b, 0x007c, 0xade8, 0x000d, 0x6800, 0xa005, 0x0040,
++	0x2bdb, 0x6804, 0xd0ac, 0x0040, 0x3038, 0xd0a4, 0x0040, 0x2bdb,
++	0xd094, 0x0040, 0x3043, 0x0c7e, 0x2061, 0x0100, 0x6104, 0xa18c,
++	0xffdf, 0x6106, 0x0c7f, 0xd08c, 0x0040, 0x304e, 0x0c7e, 0x2061,
++	0x0100, 0x6104, 0xa18d, 0x0010, 0x6106, 0x0c7f, 0x2009, 0x0100,
++	0x210c, 0xa18a, 0x0002, 0x0048, 0x3063, 0xd084, 0x0040, 0x3063,
++	0x6a28, 0xa28a, 0x007f, 0x00c8, 0x2bdb, 0xa288, 0x29c0, 0x210c,
++	0xa18c, 0x00ff, 0x6156, 0xd0dc, 0x0040, 0x306c, 0x6828, 0xa08a,
++	0x007f, 0x00c8, 0x2bdb, 0x6052, 0x6808, 0xa08a, 0x0100, 0x0048,
++	0x2bdb, 0xa08a, 0x0841, 0x00c8, 0x2bdb, 0xa084, 0x0007, 0x00c0,
++	0x2bdb, 0x680c, 0xa005, 0x0040, 0x2bdb, 0x6810, 0xa005, 0x0040,
++	0x2bdb, 0x6848, 0x6940, 0xa10a, 0x00c8, 0x2bdb, 0x8001, 0x0040,
++	0x2bdb, 0x684c, 0x6944, 0xa10a, 0x00c8, 0x2bdb, 0x8001, 0x0040,
++	0x2bdb, 0x6804, 0xd0fc, 0x0040, 0x30c2, 0x1078, 0x35ba, 0x0040,
++	0x2bd7, 0x2009, 0x0014, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0xa290,
++	0x0038, 0xa399, 0x0000, 0x1078, 0x3604, 0x701b, 0x30a8, 0x007c,
++	0xade8, 0x000d, 0x20a9, 0x0014, 0x2d98, 0x2069, 0xa66e, 0x2da0,
++	0x53a3, 0x7010, 0xa0e8, 0x000d, 0x2001, 0xa672, 0x200c, 0xd1e4,
++	0x0040, 0x30c2, 0x0c7e, 0x2061, 0x0100, 0x6004, 0xa085, 0x0b00,
++	0x6006, 0x0c7f, 0x20a9, 0x001c, 0x2d98, 0x2069, 0xa652, 0x2da0,
++	0x53a3, 0x6814, 0xa08c, 0x00ff, 0x6142, 0x8007, 0xa084, 0x00ff,
++	0x6046, 0x1078, 0x4eae, 0x1078, 0x49ce, 0x1078, 0x4a3e, 0x6000,
++	0xa086, 0x0000, 0x00c0, 0x314d, 0x6808, 0x602a, 0x1078, 0x21f7,
++	0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f,
++	0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0040, 0x30fa,
++	0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f,
++	0x0078, 0x30fc, 0xa084, 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312,
++	0x1078, 0x5b19, 0x6904, 0xd1fc, 0x0040, 0x312f, 0x0c7e, 0x2009,
++	0x0000, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x0040, 0x312c, 0x0078,
++	0x3116, 0x839d, 0x00c8, 0x312c, 0x3508, 0x8109, 0x1078, 0x5480,
++	0x6878, 0x6016, 0x6874, 0x2008, 0xa084, 0xff00, 0x8007, 0x600a,
++	0xa184, 0x00ff, 0x6006, 0x8108, 0x00c0, 0x312a, 0x6003, 0x0003,
++	0x0078, 0x312c, 0x6003, 0x0001, 0x00f0, 0x3111, 0x0c7f, 0x0c7e,
++	0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x0c7f, 0x1078,
++	0x3819, 0x0040, 0x313d, 0x1078, 0x256a, 0x60c0, 0xa005, 0x0040,
++	0x3149, 0x6003, 0x0001, 0x2091, 0x301d, 0x1078, 0x4224, 0x0078,
++	0x314d, 0x6003, 0x0004, 0x2091, 0x301d, 0x0078, 0x2bad, 0x6000,
++	0xa086, 0x0000, 0x0040, 0x2bd7, 0x2069, 0xa652, 0x7830, 0x6842,
++	0x7834, 0x6846, 0x6804, 0xd0fc, 0x0040, 0x3162, 0x2009, 0x0030,
++	0x0078, 0x3164, 0x2009, 0x001c, 0x2d00, 0x7a2c, 0x7b28, 0x7c3c,
++	0x7d38, 0x0078, 0x3608, 0xa006, 0x1078, 0x256a, 0x81ff, 0x00c0,
++	0x2bd7, 0x1078, 0x42dd, 0x1078, 0x4224, 0x0078, 0x2bad, 0x81ff,
++	0x00c0, 0x2bd7, 0x6184, 0x81ff, 0x0040, 0x3191, 0x703f, 0x0000,
++	0x2001, 0xacc0, 0x2009, 0x0040, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
++	0x127e, 0x2091, 0x8000, 0x1078, 0x3608, 0x701b, 0x2baa, 0x127f,
++	0x007c, 0x703f, 0x0001, 0x0d7e, 0x2069, 0xacc0, 0x20a9, 0x0040,
++	0x20a1, 0xacc0, 0x2019, 0xffff, 0x43a4, 0x6550, 0xa588, 0x29c0,
++	0x210c, 0xa18c, 0x00ff, 0x216a, 0xa00e, 0x2011, 0x0002, 0x2100,
++	0xa506, 0x0040, 0x31c3, 0x1078, 0x45c4, 0x00c0, 0x31c3, 0x6014,
++	0x821c, 0x0048, 0x31bb, 0xa398, 0xacc0, 0xa085, 0xff00, 0x8007,
++	0x201a, 0x0078, 0x31c2, 0xa398, 0xacc0, 0x2324, 0xa4a4, 0xff00,
++	0xa405, 0x201a, 0x8210, 0x8108, 0xa182, 0x0080, 0x00c8, 0x31ca,
++	0x0078, 0x31a7, 0x8201, 0x8007, 0x2d0c, 0xa105, 0x206a, 0x0d7f,
++	0x20a9, 0x0040, 0x20a1, 0xacc0, 0x2099, 0xacc0, 0x1078, 0x4281,
++	0x0078, 0x3180, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x0c7e, 0x1078,
++	0x35ba, 0x0c7f, 0x00c0, 0x31e8, 0x2009, 0x0002, 0x0078, 0x2bd7,
++	0x2001, 0xa653, 0x2004, 0xd0b4, 0x0040, 0x320f, 0x6000, 0xd08c,
++	0x00c0, 0x320f, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0,
++	0x320f, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x1078, 0x8e9e,
++	0x00c0, 0x3206, 0x2009, 0x0003, 0x0078, 0x2bd7, 0x7007, 0x0003,
++	0x701b, 0x320b, 0x007c, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x20a9,
++	0x002b, 0x2c98, 0xade8, 0x0002, 0x2da0, 0x53a3, 0x20a9, 0x0004,
++	0xac80, 0x0006, 0x2098, 0xad80, 0x0006, 0x20a0, 0x1078, 0x4281,
++	0x20a9, 0x0004, 0xac80, 0x000a, 0x2098, 0xad80, 0x000a, 0x20a0,
++	0x1078, 0x4281, 0x2d00, 0x2009, 0x002b, 0x7a2c, 0x7b28, 0x7c3c,
++	0x7d38, 0x0078, 0x3608, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2,
++	0x0040, 0x2bdb, 0x1078, 0x47bd, 0x0078, 0x2bad, 0x81ff, 0x00c0,
++	0x2bd7, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x2bdb, 0x1078, 0x35e4,
++	0x0040, 0x2bdb, 0x1078, 0x482f, 0x0040, 0x2bd7, 0x2019, 0x0004,
++	0x1078, 0x47d3, 0x7924, 0x810f, 0x7a28, 0x1078, 0x3259, 0x0078,
++	0x2bad, 0xa186, 0x00ff, 0x0040, 0x3261, 0x1078, 0x3271, 0x0078,
++	0x3270, 0x2029, 0x007e, 0x2061, 0xa600, 0x6450, 0x2400, 0xa506,
++	0x0040, 0x326d, 0x2508, 0x1078, 0x3271, 0x8529, 0x00c8, 0x3266,
++	0x007c, 0x1078, 0x45c4, 0x00c0, 0x327c, 0x2200, 0x8003, 0x800b,
++	0x810b, 0xa108, 0x1078, 0x5a52, 0x007c, 0x81ff, 0x00c0, 0x2bd7,
++	0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, 0x4673, 0x0040, 0x2bd7,
++	0x1078, 0x47c8, 0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078,
++	0x35d2, 0x0040, 0x2bdb, 0x1078, 0x4673, 0x0040, 0x2bd7, 0x1078,
++	0x47b2, 0x0078, 0x2bad, 0x6100, 0x0078, 0x2bad, 0x1078, 0x35e4,
++	0x0040, 0x2bdb, 0x2001, 0xa600, 0x2004, 0xa086, 0x0003, 0x00c0,
++	0x2bd7, 0x0d7e, 0xace8, 0x000a, 0x7924, 0xd184, 0x0040, 0x32b2,
++	0xace8, 0x0006, 0x680c, 0x8007, 0x783e, 0x6808, 0x8007, 0x783a,
++	0x6b04, 0x831f, 0x6a00, 0x8217, 0x0d7f, 0x6100, 0xa18c, 0x0200,
++	0x0078, 0x2bad, 0xa006, 0x1078, 0x256a, 0x7824, 0xa084, 0x00ff,
++	0xa086, 0x00ff, 0x0040, 0x32cf, 0x81ff, 0x00c0, 0x2bd7, 0x1078,
++	0x42dd, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x2bdb, 0x7924, 0xa18c,
++	0xff00, 0x810f, 0xa186, 0x00ff, 0x0040, 0x32e5, 0xa182, 0x007f,
++	0x00c8, 0x2bdb, 0x2100, 0x1078, 0x2564, 0x027e, 0x0c7e, 0x127e,
++	0x2091, 0x8000, 0x2061, 0xa8c4, 0x601b, 0x0000, 0x601f, 0x0000,
++	0x2011, 0x0003, 0x1078, 0x70e0, 0x2011, 0x0002, 0x1078, 0x70ea,
++	0x1078, 0x6fc4, 0x037e, 0x2019, 0x0000, 0x1078, 0x7058, 0x037f,
++	0x2061, 0x0100, 0x6030, 0xa084, 0x00ff, 0x810f, 0xa105, 0x604a,
++	0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x002d, 0x2011, 0x4259,
++	0x1078, 0x5add, 0x7924, 0xa18c, 0xff00, 0x810f, 0x7a28, 0x1078,
++	0x3259, 0x127f, 0x0c7f, 0x027f, 0x0078, 0x2bad, 0x7924, 0xa18c,
++	0xff00, 0x810f, 0x0c7e, 0x1078, 0x455c, 0x2c08, 0x0c7f, 0x00c0,
++	0x2bdb, 0x0078, 0x2bad, 0x81ff, 0x0040, 0x3332, 0x2009, 0x0001,
++	0x0078, 0x2bd7, 0x60cc, 0xd09c, 0x00c0, 0x333a, 0x2009, 0x0005,
++	0x0078, 0x2bd7, 0x1078, 0x35ba, 0x00c0, 0x3342, 0x2009, 0x0002,
++	0x0078, 0x2bd7, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078,
++	0x3604, 0x701b, 0x334c, 0x007c, 0x2009, 0x0080, 0x1078, 0x45c4,
++	0x00c0, 0x3359, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0040,
++	0x335d, 0x2021, 0x400a, 0x0078, 0x2baf, 0x0d7e, 0xade8, 0x000d,
++	0x6900, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x6e18, 0x6820, 0xa0be,
++	0x0100, 0x0040, 0x33d0, 0xa0be, 0x0112, 0x0040, 0x33d0, 0xa0be,
++	0x0113, 0x0040, 0x33d0, 0xa0be, 0x0114, 0x0040, 0x33d0, 0xa0be,
++	0x0117, 0x0040, 0x33d0, 0xa0be, 0x011a, 0x0040, 0x33d0, 0xa0be,
++	0x0121, 0x0040, 0x33c6, 0xa0be, 0x0131, 0x0040, 0x33c6, 0xa0be,
++	0x0171, 0x0040, 0x33d0, 0xa0be, 0x0173, 0x0040, 0x33d0, 0xa0be,
++	0x01a1, 0x00c0, 0x3398, 0x6830, 0x8007, 0x6832, 0x0078, 0x33d6,
++	0xa0be, 0x0212, 0x0040, 0x33cc, 0xa0be, 0x0213, 0x0040, 0x33cc,
++	0xa0be, 0x0214, 0x0040, 0x33be, 0xa0be, 0x0217, 0x0040, 0x33b8,
++	0xa0be, 0x021a, 0x00c0, 0x33b1, 0x6838, 0x8007, 0x683a, 0x0078,
++	0x33d0, 0xa0be, 0x0300, 0x0040, 0x33d0, 0x0d7f, 0x0078, 0x2bdb,
++	0xad80, 0x0010, 0x20a9, 0x0007, 0x1078, 0x3418, 0xad80, 0x000e,
++	0x20a9, 0x0001, 0x1078, 0x3418, 0x0078, 0x33d0, 0xad80, 0x000c,
++	0x1078, 0x3426, 0x0078, 0x33d6, 0xad80, 0x000e, 0x1078, 0x3426,
++	0xad80, 0x000c, 0x20a9, 0x0001, 0x1078, 0x3418, 0x0c7e, 0x1078,
++	0x35ba, 0x0040, 0x3409, 0x6838, 0xc0fd, 0x683a, 0x6837, 0x0119,
++	0x6853, 0x0000, 0x684f, 0x0020, 0x685b, 0x0001, 0x810b, 0x697e,
++	0x6883, 0x0000, 0x6a86, 0x6b8a, 0x6c8e, 0x6d92, 0x6996, 0x689b,
++	0x0000, 0x0c7f, 0x0d7f, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a,
++	0x6823, 0x0000, 0x6804, 0x2068, 0x1078, 0x8e66, 0x00c0, 0x3404,
++	0x2009, 0x0003, 0x0078, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x340f,
++	0x007c, 0x0c7f, 0x0d7f, 0x2009, 0x0002, 0x0078, 0x2bd7, 0x6820,
++	0xa086, 0x8001, 0x00c0, 0x2bad, 0x2009, 0x0004, 0x0078, 0x2bd7,
++	0x017e, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x290a, 0x8108,
++	0x280a, 0x8108, 0x00f0, 0x341a, 0x017f, 0x007c, 0x017e, 0x0a7e,
++	0x0b7e, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x2054, 0x8000,
++	0x205c, 0x2b0a, 0x8108, 0x2a0a, 0x8108, 0x290a, 0x8108, 0x280a,
++	0x0b7f, 0x0a7f, 0x017f, 0x007c, 0x81ff, 0x0040, 0x3443, 0x2009,
++	0x0001, 0x0078, 0x2bd7, 0x60cc, 0xd09c, 0x00c0, 0x344b, 0x2009,
++	0x0005, 0x0078, 0x2bd7, 0x7924, 0x2140, 0xa18c, 0xff00, 0x810f,
++	0xa182, 0x0080, 0x0048, 0x2bdb, 0xa182, 0x00ff, 0x00c8, 0x2bdb,
++	0x7a2c, 0x7b28, 0x606c, 0xa306, 0x00c0, 0x3466, 0x6070, 0xa24e,
++	0x0040, 0x2bdb, 0xa9cc, 0xff00, 0x0040, 0x2bdb, 0x0c7e, 0x1078,
++	0x350f, 0x2c68, 0x0c7f, 0x0040, 0x349e, 0xa0c6, 0x4000, 0x00c0,
++	0x3484, 0x0c7e, 0x007e, 0x2d60, 0x2009, 0x0000, 0x1078, 0x489b,
++	0x00c0, 0x347b, 0xc185, 0x6000, 0xd0bc, 0x0040, 0x3480, 0xc18d,
++	0x007f, 0x0c7f, 0x0078, 0x349b, 0xa0c6, 0x4007, 0x00c0, 0x348b,
++	0x2408, 0x0078, 0x349b, 0xa0c6, 0x4008, 0x00c0, 0x3493, 0x2708,
++	0x2610, 0x0078, 0x349b, 0xa0c6, 0x4009, 0x00c0, 0x3499, 0x0078,
++	0x349b, 0x2001, 0x4006, 0x2020, 0x0078, 0x2baf, 0x2d00, 0x7022,
++	0x017e, 0x0b7e, 0x0c7e, 0x0e7e, 0x2c70, 0x1078, 0x76c7, 0x0040,
++	0x34e4, 0x2d00, 0x601a, 0x2001, 0xa657, 0x2004, 0xa084, 0x00ff,
++	0x6842, 0x2e58, 0x0e7f, 0x0e7e, 0x0c7e, 0x1078, 0x35ba, 0x0c7f,
++	0x2b70, 0x00c0, 0x34c5, 0x1078, 0x772d, 0x0e7f, 0x0c7f, 0x0b7f,
++	0x017f, 0x2009, 0x0002, 0x0078, 0x2bd7, 0x6837, 0x0000, 0x2d00,
++	0x6012, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x127e, 0x2091,
++	0x8000, 0x1078, 0x2880, 0x127f, 0x601f, 0x0001, 0x2001, 0x0000,
++	0x1078, 0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x2009, 0x0002,
++	0x1078, 0x775c, 0xa085, 0x0001, 0x0e7f, 0x0c7f, 0x0b7f, 0x017f,
++	0x00c0, 0x34ee, 0x2009, 0x0003, 0x0078, 0x2bd7, 0x7007, 0x0003,
++	0x701b, 0x34f3, 0x007c, 0x6830, 0xa086, 0x0100, 0x7020, 0x2060,
++	0x00c0, 0x3501, 0x2009, 0x0004, 0x6204, 0xa294, 0x00ff, 0x0078,
++	0x2bd7, 0x2009, 0x0000, 0x1078, 0x489b, 0x00c0, 0x3508, 0xc185,
++	0x6000, 0xd0bc, 0x0040, 0x350d, 0xc18d, 0x0078, 0x2bad, 0x0e7e,
++	0x0d7e, 0x2029, 0x0000, 0x2021, 0x0080, 0x20a9, 0x007f, 0x2071,
++	0xa7b5, 0x2e04, 0xa005, 0x00c0, 0x3524, 0x2100, 0xa406, 0x00c0,
++	0x3555, 0x2428, 0x0078, 0x3555, 0x2068, 0x6f10, 0x2700, 0xa306,
++	0x00c0, 0x3546, 0x6e14, 0x2600, 0xa206, 0x00c0, 0x3546, 0x2400,
++	0xa106, 0x00c0, 0x3542, 0x2d60, 0xd884, 0x0040, 0x356a, 0x6004,
++	0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x356a, 0x2001, 0x4000,
++	0x0078, 0x356b, 0x2001, 0x4007, 0x0078, 0x356b, 0x2400, 0xa106,
++	0x00c0, 0x3555, 0x6e14, 0x87ff, 0x00c0, 0x3551, 0x86ff, 0x0040,
++	0x3521, 0x2001, 0x4008, 0x0078, 0x356b, 0x8420, 0x8e70, 0x00f0,
++	0x3519, 0x85ff, 0x00c0, 0x3564, 0x2001, 0x4009, 0x0078, 0x356b,
++	0x2001, 0x0001, 0x0078, 0x356b, 0x1078, 0x455c, 0x00c0, 0x3560,
++	0x6312, 0x6216, 0xa006, 0xa005, 0x0d7f, 0x0e7f, 0x007c, 0x81ff,
++	0x00c0, 0x2bd7, 0x1078, 0x35ba, 0x0040, 0x2bd7, 0x6837, 0x0000,
++	0x6838, 0xc0fd, 0x683a, 0x7824, 0xa005, 0x0040, 0x2bdb, 0xa096,
++	0x00ff, 0x0040, 0x3587, 0xa092, 0x0004, 0x00c8, 0x2bdb, 0x2010,
++	0x2d18, 0x1078, 0x282f, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b,
++	0x3592, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2bd7, 0x0078,
++	0x2bad, 0x7924, 0xa18c, 0xff00, 0x810f, 0xa182, 0x0080, 0x0048,
++	0x2bdb, 0xa182, 0x00ff, 0x00c8, 0x2bdb, 0x127e, 0x2091, 0x8000,
++	0x1078, 0x8d4b, 0x00c0, 0x35b7, 0xa190, 0xa735, 0x2204, 0xa065,
++	0x0040, 0x35b7, 0x1078, 0x42f8, 0x127f, 0x0078, 0x2bad, 0x127f,
++	0x0078, 0x2bd7, 0x1078, 0x138b, 0x0040, 0x35d1, 0xa006, 0x6802,
++	0x7010, 0xa005, 0x00c0, 0x35c9, 0x2d00, 0x7012, 0x7016, 0x0078,
++	0x35cf, 0x7014, 0x6802, 0x2060, 0x2d00, 0x6006, 0x7016, 0xad80,
++	0x000d, 0x007c, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x45c4,
++	0x00c0, 0x35e1, 0x7e28, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0048,
++	0x35e2, 0xa066, 0x8cff, 0x007c, 0x7e24, 0x860f, 0xa18c, 0x00ff,
++	0x1078, 0x45c4, 0x00c0, 0x35f2, 0xa6b4, 0x00ff, 0xa682, 0x4000,
++	0x0048, 0x35f3, 0xa066, 0x8cff, 0x007c, 0x017e, 0x7110, 0x81ff,
++	0x0040, 0x3600, 0x2168, 0x6904, 0x1078, 0x13a4, 0x0078, 0x35f7,
++	0x7112, 0x7116, 0x017f, 0x007c, 0x2031, 0x0001, 0x0078, 0x360a,
++	0x2031, 0x0000, 0x2061, 0xa6d2, 0x6606, 0x6112, 0x600e, 0x6226,
++	0x632a, 0x642e, 0x6532, 0x2c10, 0x1078, 0x13db, 0x7007, 0x0002,
++	0x701b, 0x2bad, 0x007c, 0x0f7e, 0x127e, 0x2091, 0x8000, 0x2079,
++	0x0000, 0x2001, 0xa690, 0x2004, 0xa005, 0x00c0, 0x3636, 0x0068,
++	0x3636, 0x7818, 0xd084, 0x00c0, 0x3636, 0x7a22, 0x7b26, 0x7c2a,
++	0x781b, 0x0001, 0x2091, 0x4080, 0x0078, 0x365b, 0x017e, 0x0c7e,
++	0x0e7e, 0x2071, 0xa682, 0x7138, 0xa182, 0x0008, 0x0048, 0x3644,
++	0x7030, 0x2060, 0x0078, 0x3655, 0x7030, 0xa0e0, 0x0008, 0xac82,
++	0xa6d2, 0x0048, 0x364d, 0x2061, 0xa692, 0x2c00, 0x7032, 0x81ff,
++	0x00c0, 0x3653, 0x7036, 0x8108, 0x713a, 0x2262, 0x6306, 0x640a,
++	0x0e7f, 0x0c7f, 0x017f, 0x127f, 0x0f7f, 0x007c, 0x0e7e, 0x2071,
++	0xa682, 0x7038, 0xa005, 0x0040, 0x3697, 0x127e, 0x2091, 0x8000,
++	0x0068, 0x3696, 0x0f7e, 0x2079, 0x0000, 0x7818, 0xd084, 0x00c0,
++	0x3695, 0x0c7e, 0x7034, 0x2060, 0x2c04, 0x7822, 0x6004, 0x7826,
++	0x6008, 0x782a, 0x781b, 0x0001, 0x2091, 0x4080, 0x7038, 0x8001,
++	0x703a, 0xa005, 0x00c0, 0x368b, 0x7033, 0xa692, 0x7037, 0xa692,
++	0x0c7f, 0x0078, 0x3695, 0xac80, 0x0008, 0xa0fa, 0xa6d2, 0x0048,
++	0x3693, 0x2001, 0xa692, 0x7036, 0x0c7f, 0x0f7f, 0x127f, 0x0e7f,
++	0x007c, 0x027e, 0x2001, 0xa653, 0x2004, 0xd0c4, 0x0040, 0x36a4,
++	0x2011, 0x8014, 0x1078, 0x361b, 0x027f, 0x007c, 0x81ff, 0x00c0,
++	0x2bd7, 0x127e, 0x2091, 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac,
++	0x6032, 0x1078, 0x4224, 0x127f, 0x0078, 0x2bad, 0x81ff, 0x00c0,
++	0x2bd7, 0x6000, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x2001, 0xa653,
++	0x2004, 0xd0ac, 0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040, 0x2bdb,
++	0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x36d3, 0x7828,
++	0xa005, 0x0040, 0x2bad, 0x0c7e, 0x1078, 0x35ba, 0x0c7f, 0x0040,
++	0x2bd7, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a,
++	0x1078, 0x8f12, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x36e9,
++	0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2bd7, 0x0078, 0x2bad,
++	0x2001, 0xa600, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x7f24,
++	0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x35ba, 0x0040, 0x2bd7,
++	0x2009, 0x0000, 0x2031, 0x0000, 0x7023, 0x0000, 0x702f, 0x0000,
++	0xad80, 0x0005, 0x7026, 0x20a0, 0x1078, 0x45c4, 0x00c0, 0x376d,
++	0x6004, 0xa0c4, 0x00ff, 0xa8c6, 0x0006, 0x0040, 0x371d, 0xa0c4,
++	0xff00, 0xa8c6, 0x0600, 0x00c0, 0x376d, 0x2001, 0xa653, 0x2004,
++	0xd0ac, 0x00c0, 0x372a, 0x1078, 0x489b, 0x00c0, 0x372a, 0xd79c,
++	0x0040, 0x376d, 0xd794, 0x00c0, 0x3730, 0xd784, 0x0040, 0x373c,
++	0xac80, 0x0006, 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, 0x1078,
++	0x3426, 0xd794, 0x0040, 0x3745, 0xac80, 0x000a, 0x2098, 0x3400,
++	0x20a9, 0x0004, 0x53a3, 0x1078, 0x3426, 0x21a2, 0xd794, 0x0040,
++	0x3765, 0xac80, 0x0000, 0x2098, 0x94a0, 0x20a9, 0x0002, 0x53a3,
++	0xac80, 0x0003, 0x20a6, 0x94a0, 0xac80, 0x0004, 0x2098, 0x3400,
++	0x20a9, 0x0002, 0x53a3, 0x1078, 0x3418, 0xac80, 0x0026, 0x2098,
++	0x20a9, 0x0002, 0x53a3, 0x0078, 0x3766, 0x94a0, 0xd794, 0x0040,
++	0x376b, 0xa6b0, 0x000b, 0xa6b0, 0x0005, 0x8108, 0xd78c, 0x0040,
++	0x3777, 0xa186, 0x0100, 0x0040, 0x3788, 0x0078, 0x377b, 0xa186,
++	0x007e, 0x0040, 0x3788, 0xd794, 0x0040, 0x3782, 0xa686, 0x0020,
++	0x0078, 0x3784, 0xa686, 0x0028, 0x0040, 0x3791, 0x0078, 0x370c,
++	0x86ff, 0x00c0, 0x378f, 0x7120, 0x810b, 0x0078, 0x2bad, 0x702f,
++	0x0001, 0x711e, 0x7020, 0xa600, 0x7022, 0x772a, 0x2061, 0xa6d2,
++	0x6007, 0x0000, 0x6612, 0x7024, 0x600e, 0x6226, 0x632a, 0x642e,
++	0x6532, 0x2c10, 0x1078, 0x13db, 0x7007, 0x0002, 0x701b, 0x37a9,
++	0x007c, 0x702c, 0xa005, 0x00c0, 0x37bb, 0x711c, 0x7024, 0x20a0,
++	0x7728, 0x2031, 0x0000, 0x2061, 0xa6d2, 0x6224, 0x6328, 0x642c,
++	0x6530, 0x0078, 0x370c, 0x7120, 0x810b, 0x0078, 0x2bad, 0x2029,
++	0x007e, 0x7924, 0x7a28, 0x7b2c, 0x7c38, 0xa184, 0xff00, 0x8007,
++	0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, 0xa184,
++	0x00ff, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb,
++	0xa284, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502,
++	0x0048, 0x2bdb, 0xa284, 0x00ff, 0xa0e2, 0x0020, 0x0048, 0x2bdb,
++	0xa502, 0x0048, 0x2bdb, 0xa384, 0xff00, 0x8007, 0xa0e2, 0x0020,
++	0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, 0xa384, 0x00ff, 0xa0e2,
++	0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, 0xa484, 0xff00,
++	0x8007, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb,
++	0xa484, 0x00ff, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048,
++	0x2bdb, 0x2061, 0xa8a5, 0x6102, 0x6206, 0x630a, 0x640e, 0x0078,
++	0x2bad, 0x007e, 0x2001, 0xa653, 0x2004, 0xd0cc, 0x007f, 0x007c,
++	0x007e, 0x2001, 0xa672, 0x2004, 0xd0bc, 0x007f, 0x007c, 0x6164,
++	0x7a24, 0x6300, 0x82ff, 0x00c0, 0x3830, 0x7926, 0x0078, 0x2bad,
++	0x83ff, 0x00c0, 0x2bdb, 0x2001, 0xfff0, 0xa200, 0x00c8, 0x2bdb,
++	0x2019, 0xffff, 0x6068, 0xa302, 0xa200, 0x0048, 0x2bdb, 0x7926,
++	0x6266, 0x0078, 0x2bad, 0x2001, 0xa600, 0x2004, 0xa086, 0x0003,
++	0x00c0, 0x2bd7, 0x7c28, 0x7d24, 0x7e38, 0x7f2c, 0x1078, 0x35ba,
++	0x0040, 0x2bd7, 0x2009, 0x0000, 0x2019, 0x0000, 0x7023, 0x0000,
++	0x702f, 0x0000, 0xad80, 0x0003, 0x7026, 0x20a0, 0xa1e0, 0xa735,
++	0x2c64, 0x8cff, 0x0040, 0x387d, 0x6004, 0xa084, 0x00ff, 0xa086,
++	0x0006, 0x0040, 0x3872, 0x6004, 0xa084, 0xff00, 0xa086, 0x0600,
++	0x00c0, 0x387d, 0x6014, 0x20a2, 0x94a0, 0x6010, 0x8007, 0xa105,
++	0x8007, 0x20a2, 0x94a0, 0xa398, 0x0002, 0x8108, 0xa182, 0x00ff,
++	0x0040, 0x3888, 0xa386, 0x002a, 0x0040, 0x3891, 0x0078, 0x385e,
++	0x83ff, 0x00c0, 0x388f, 0x7120, 0x810c, 0x0078, 0x2bad, 0x702f,
++	0x0001, 0x711e, 0x7020, 0xa300, 0x7022, 0x2061, 0xa6d2, 0x6007,
++	0x0000, 0x6312, 0x7024, 0x600e, 0x6426, 0x652a, 0x662e, 0x6732,
++	0x2c10, 0x1078, 0x13db, 0x7007, 0x0002, 0x701b, 0x38a8, 0x007c,
++	0x702c, 0xa005, 0x00c0, 0x38b9, 0x711c, 0x7024, 0x20a0, 0x2019,
++	0x0000, 0x2061, 0xa6d2, 0x6424, 0x6528, 0x662c, 0x6730, 0x0078,
++	0x385e, 0x7120, 0x810c, 0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7,
++	0x60cc, 0xd09c, 0x0040, 0x2bd7, 0x1078, 0x35ba, 0x0040, 0x2bd7,
++	0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3604, 0x701b,
++	0x38d2, 0x007c, 0x0d7e, 0xade8, 0x000d, 0x6828, 0xa0be, 0x7000,
++	0x0040, 0x38e5, 0xa0be, 0x7100, 0x0040, 0x38e5, 0xa0be, 0x7200,
++	0x0040, 0x38e5, 0x0d7f, 0x0078, 0x2bdb, 0x6820, 0x6924, 0x1078,
++	0x254d, 0x00c0, 0x3910, 0x1078, 0x455c, 0x00c0, 0x3910, 0x7122,
++	0x6612, 0x6516, 0x6e18, 0x0c7e, 0x1078, 0x35ba, 0x0040, 0x3910,
++	0x1078, 0x35ba, 0x0040, 0x3910, 0x0c7f, 0x0d7f, 0x6837, 0x0000,
++	0x6838, 0xc0fd, 0x683a, 0x6823, 0x0000, 0x6804, 0x2068, 0x1078,
++	0x8e82, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x3913, 0x007c,
++	0x0d7f, 0x0078, 0x2bd7, 0x7120, 0x1078, 0x298e, 0x6820, 0xa086,
++	0x8001, 0x0040, 0x2bd7, 0x2d00, 0x701e, 0x6804, 0xa080, 0x0002,
++	0x007e, 0x20a9, 0x002a, 0x2098, 0x20a0, 0x1078, 0x4281, 0x007f,
++	0xade8, 0x000d, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x2061, 0xa6d2,
++	0x6007, 0x0000, 0x6e00, 0x6f28, 0xa7c6, 0x7000, 0x00c0, 0x393a,
++	0x0078, 0x393e, 0xa7c6, 0x7100, 0x00c0, 0x3946, 0xa6c2, 0x0004,
++	0x0048, 0x2bdb, 0x2009, 0x0004, 0x0078, 0x3608, 0xa7c6, 0x7200,
++	0x00c0, 0x2bdb, 0xa6c2, 0x0054, 0x0048, 0x2bdb, 0x600e, 0x6013,
++	0x002a, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x1078, 0x13db,
++	0x7007, 0x0002, 0x701b, 0x395d, 0x007c, 0x701c, 0x2068, 0x6804,
++	0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x007e, 0x20a9, 0x002a,
++	0x2098, 0x20a0, 0x1078, 0x4281, 0x007f, 0x2009, 0x002a, 0x2061,
++	0xa6d2, 0x6224, 0x6328, 0x642c, 0x6530, 0x0078, 0x3608, 0x81ff,
++	0x00c0, 0x2bd7, 0x792c, 0x2001, 0xa89d, 0x2102, 0x1078, 0x35d2,
++	0x0040, 0x2bdb, 0x1078, 0x4673, 0x0040, 0x2bd7, 0x127e, 0x2091,
++	0x8000, 0x1078, 0x47de, 0x127f, 0x0078, 0x2bad, 0x7824, 0xd08c,
++	0x00c0, 0x3995, 0xd084, 0x0040, 0x31da, 0x1078, 0x35e4, 0x0040,
++	0x2bdb, 0x0c7e, 0x1078, 0x35ba, 0x0c7f, 0x00c0, 0x39a3, 0x2009,
++	0x0002, 0x0078, 0x2bd7, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006,
++	0x0040, 0x39b0, 0xa08e, 0x0004, 0x0040, 0x39b0, 0xa08e, 0x0005,
++	0x00c0, 0x39dd, 0x7824, 0xd08c, 0x0040, 0x39bb, 0x6000, 0xc08c,
++	0x6002, 0x0078, 0x39c5, 0x2001, 0xa653, 0x2004, 0xd0b4, 0x0040,
++	0x320f, 0x6000, 0xd08c, 0x00c0, 0x320f, 0x6837, 0x0000, 0x6838,
++	0xc0fd, 0x683a, 0x1078, 0x8e9e, 0x00c0, 0x39d2, 0x2009, 0x0003,
++	0x0078, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x39d7, 0x007c, 0x1078,
++	0x35e4, 0x0040, 0x2bdb, 0x0078, 0x320f, 0x2009, 0xa62f, 0x210c,
++	0x81ff, 0x0040, 0x39e7, 0x2009, 0x0001, 0x0078, 0x2bd7, 0x2001,
++	0xa600, 0x2004, 0xa086, 0x0003, 0x0040, 0x39f2, 0x2009, 0x0007,
++	0x0078, 0x2bd7, 0x2001, 0xa653, 0x2004, 0xd0ac, 0x0040, 0x39fc,
++	0x2009, 0x0008, 0x0078, 0x2bd7, 0x609c, 0xd0a4, 0x00c0, 0x3a03,
++	0xd0ac, 0x00c0, 0x320f, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838,
++	0xc0fd, 0x683a, 0x1078, 0x8f12, 0x00c0, 0x3a12, 0x2009, 0x0003,
++	0x0078, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x3a17, 0x007c, 0x6830,
++	0xa086, 0x0100, 0x00c0, 0x3a20, 0x2009, 0x0004, 0x0078, 0x2bd7,
++	0x1078, 0x35e4, 0x0040, 0x2bdb, 0x0078, 0x39b2, 0x81ff, 0x2009,
++	0x0001, 0x00c0, 0x2bd7, 0x6000, 0xa086, 0x0003, 0x2009, 0x0007,
++	0x00c0, 0x2bd7, 0x2001, 0xa653, 0x2004, 0xd0ac, 0x2009, 0x0008,
++	0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x6004, 0xa084,
++	0x00ff, 0xa086, 0x0006, 0x2009, 0x0009, 0x00c0, 0x2bd7, 0x0c7e,
++	0x1078, 0x35ba, 0x0c7f, 0x2009, 0x0002, 0x0040, 0x2bd7, 0x6837,
++	0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x7928, 0xa194,
++	0xff00, 0xa18c, 0x00ff, 0xa006, 0x82ff, 0x00c0, 0x3a65, 0xc0ed,
++	0x6952, 0x792c, 0x6956, 0x0078, 0x3a6e, 0xa28e, 0x0100, 0x00c0,
++	0x2bdb, 0xc0e5, 0x6853, 0x0000, 0x6857, 0x0000, 0x683e, 0x1078,
++	0x90bd, 0x2009, 0x0003, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b,
++	0x3a7a, 0x007c, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004, 0x0040,
++	0x2bd7, 0x0078, 0x2bad, 0x81ff, 0x2009, 0x0001, 0x00c0, 0x2bd7,
++	0x6000, 0xa086, 0x0003, 0x2009, 0x0007, 0x00c0, 0x2bd7, 0x1078,
++	0x35e4, 0x0040, 0x2bdb, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006,
++	0x2009, 0x0009, 0x00c0, 0x2bd7, 0x0c7e, 0x1078, 0x35ba, 0x0c7f,
++	0x2009, 0x0002, 0x0040, 0x2bd7, 0xad80, 0x000f, 0x2009, 0x0008,
++	0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3604, 0x701b, 0x3ab1,
++	0x007c, 0x0d7e, 0xade8, 0x000f, 0x6800, 0xa086, 0x0500, 0x00c0,
++	0x3ac4, 0x6804, 0xa005, 0x00c0, 0x3ac4, 0x6808, 0xa084, 0xff00,
++	0x00c0, 0x3ac4, 0x0078, 0x3ac7, 0x0d7f, 0x00c0, 0x2bdb, 0x0d7f,
++	0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x0c7e,
++	0x1078, 0x35e4, 0x00c0, 0x3ad7, 0x0c7f, 0x0078, 0x2bdb, 0x1078,
++	0x9119, 0x2009, 0x0003, 0x0c7f, 0x0040, 0x2bd7, 0x7007, 0x0003,
++	0x701b, 0x3ae3, 0x007c, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004,
++	0x0040, 0x2bd7, 0x0078, 0x2bad, 0x127e, 0x0c7e, 0x0e7e, 0x2061,
++	0x0100, 0x2071, 0xa600, 0x6044, 0xd0a4, 0x00c0, 0x3b15, 0xd084,
++	0x0040, 0x3afe, 0x1078, 0x3c75, 0x0078, 0x3b11, 0xd08c, 0x0040,
++	0x3b05, 0x1078, 0x3b8c, 0x0078, 0x3b11, 0xd094, 0x0040, 0x3b0c,
++	0x1078, 0x3b60, 0x0078, 0x3b11, 0xd09c, 0x0040, 0x3b11, 0x1078,
++	0x3b1f, 0x0e7f, 0x0c7f, 0x127f, 0x007c, 0x017e, 0x6128, 0xd19c,
++	0x00c0, 0x3b1c, 0xc19d, 0x612a, 0x017f, 0x0078, 0x3b11, 0x624c,
++	0xa286, 0xf0f0, 0x00c0, 0x3b30, 0x6048, 0xa086, 0xf0f0, 0x0040,
++	0x3b30, 0x624a, 0x6043, 0x0090, 0x6043, 0x0010, 0x0078, 0x3b5f,
++	0xa294, 0xff00, 0xa296, 0xf700, 0x0040, 0x3b45, 0x7134, 0xd1a4,
++	0x00c0, 0x3b45, 0x6240, 0xa294, 0x0010, 0x0040, 0x3b45, 0x2009,
++	0x00f7, 0x1078, 0x42a1, 0x0078, 0x3b5f, 0x6043, 0x0040, 0x6043,
++	0x0000, 0x7077, 0x0000, 0x708f, 0x0001, 0x70b3, 0x0000, 0x70cf,
++	0x0000, 0x2009, 0xacc0, 0x200b, 0x0000, 0x7087, 0x0000, 0x707b,
++	0x000f, 0x2009, 0x000f, 0x2011, 0x41d5, 0x1078, 0x5add, 0x007c,
++	0x157e, 0x7078, 0xa005, 0x00c0, 0x3b8a, 0x2011, 0x41d5, 0x1078,
++	0x5a45, 0x6040, 0xa094, 0x0010, 0xa285, 0x0020, 0x6042, 0x20a9,
++	0x00c8, 0x6044, 0xd08c, 0x00c0, 0x3b83, 0x00f0, 0x3b71, 0x6242,
++	0x708b, 0x0000, 0x6040, 0xa094, 0x0010, 0xa285, 0x0080, 0x6042,
++	0x6242, 0x0078, 0x3b8a, 0x6242, 0x708b, 0x0000, 0x707f, 0x0000,
++	0x0078, 0x3b8a, 0x157f, 0x007c, 0x707c, 0xa08a, 0x0003, 0x00c8,
++	0x3b95, 0x1079, 0x3b98, 0x0078, 0x3b97, 0x1078, 0x1332, 0x007c,
++	0x3b9b, 0x3bea, 0x3c74, 0x0f7e, 0x707f, 0x0001, 0x20e1, 0xa000,
++	0x20e1, 0x8700, 0x1078, 0x21f7, 0x20e1, 0x9080, 0x20e1, 0x4000,
++	0x2079, 0xab00, 0x207b, 0x2200, 0x7807, 0x00ef, 0x780b, 0x0000,
++	0x780f, 0x00ef, 0x7813, 0x0138, 0x7817, 0x0000, 0x781b, 0x0000,
++	0x781f, 0x0000, 0x7823, 0xffff, 0x7827, 0xffff, 0x782b, 0x0000,
++	0x782f, 0x0000, 0x2079, 0xab0c, 0x207b, 0x1101, 0x7807, 0x0000,
++	0x2099, 0xa605, 0x20a1, 0xab0e, 0x20a9, 0x0004, 0x53a3, 0x2079,
++	0xab12, 0x207b, 0x0000, 0x7807, 0x0000, 0x2099, 0xab00, 0x20a1,
++	0x020b, 0x20a9, 0x0014, 0x53a6, 0x60c3, 0x000c, 0x600f, 0x0000,
++	0x1078, 0x420b, 0x0f7f, 0x7083, 0x0000, 0x6043, 0x0008, 0x6043,
++	0x0000, 0x007c, 0x0d7e, 0x7080, 0x7083, 0x0000, 0xa025, 0x0040,
++	0x3c5e, 0x6020, 0xd0b4, 0x00c0, 0x3c5c, 0x718c, 0x81ff, 0x0040,
++	0x3c4b, 0xa486, 0x000c, 0x00c0, 0x3c56, 0xa480, 0x0018, 0x8004,
++	0x20a8, 0x2011, 0xab80, 0x2019, 0xab00, 0x220c, 0x2304, 0xa106,
++	0x00c0, 0x3c22, 0x8210, 0x8318, 0x00f0, 0x3c05, 0x6043, 0x0004,
++	0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0006, 0x707f, 0x0002,
++	0x708b, 0x0002, 0x2009, 0x07d0, 0x2011, 0x41dc, 0x1078, 0x5add,
++	0x0078, 0x3c5c, 0x2069, 0xab80, 0x6930, 0xa18e, 0x1101, 0x00c0,
++	0x3c56, 0x6834, 0xa005, 0x00c0, 0x3c56, 0x6900, 0xa18c, 0x00ff,
++	0x00c0, 0x3c36, 0x6804, 0xa005, 0x0040, 0x3c4b, 0x2011, 0xab8e,
++	0x2019, 0xa605, 0x20a9, 0x0004, 0x220c, 0x2304, 0xa102, 0x0048,
++	0x3c49, 0x00c0, 0x3c56, 0x8210, 0x8318, 0x00f0, 0x3c3c, 0x0078,
++	0x3c56, 0x708f, 0x0000, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099,
++	0xab80, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x6043, 0x0008,
++	0x6043, 0x0000, 0x0078, 0x3c5e, 0x0d7f, 0x007c, 0x6020, 0xd0b4,
++	0x00c0, 0x3c5c, 0x60c3, 0x000c, 0x2011, 0xa8bb, 0x2013, 0x0000,
++	0x7083, 0x0000, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575,
++	0x1078, 0x6e06, 0x0078, 0x3c5c, 0x007c, 0x7088, 0xa08a, 0x001d,
++	0x00c8, 0x3c7e, 0x1079, 0x3c81, 0x0078, 0x3c80, 0x1078, 0x1332,
++	0x007c, 0x3cab, 0x3cba, 0x3ce9, 0x3d02, 0x3d2e, 0x3d5a, 0x3d86,
++	0x3dbc, 0x3de8, 0x3e10, 0x3e53, 0x3e7d, 0x3e9f, 0x3eb5, 0x3edb,
++	0x3eee, 0x3ef7, 0x3f2b, 0x3f57, 0x3f83, 0x3faf, 0x3fe5, 0x4030,
++	0x405f, 0x4081, 0x40c3, 0x40e9, 0x4102, 0x4103, 0x0c7e, 0x2061,
++	0xa600, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0xa084, 0xfff9,
++	0x6006, 0x0c7f, 0x007c, 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043,
++	0x0002, 0x708b, 0x0001, 0x2009, 0x07d0, 0x2011, 0x41dc, 0x1078,
++	0x5add, 0x007c, 0x0f7e, 0x7080, 0xa086, 0x0014, 0x00c0, 0x3ce7,
++	0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x3ce7, 0x2079, 0xab80,
++	0x7a30, 0xa296, 0x1102, 0x00c0, 0x3ce5, 0x7834, 0xa005, 0x00c0,
++	0x3ce5, 0x7a38, 0xd2fc, 0x0040, 0x3cdb, 0x70b0, 0xa005, 0x00c0,
++	0x3cdb, 0x70b3, 0x0001, 0x2011, 0x41dc, 0x1078, 0x5a45, 0x708b,
++	0x0010, 0x1078, 0x3ef7, 0x0078, 0x3ce7, 0x1078, 0x4224, 0x0f7f,
++	0x007c, 0x708b, 0x0003, 0x6043, 0x0004, 0x2011, 0x41dc, 0x1078,
++	0x5a45, 0x1078, 0x4289, 0x20a3, 0x1102, 0x20a3, 0x0000, 0x20a9,
++	0x000a, 0x20a3, 0x0000, 0x00f0, 0x3cf9, 0x60c3, 0x0014, 0x1078,
++	0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3d2c, 0x2011,
++	0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3d2a, 0x2079,
++	0xab80, 0x7a30, 0xa296, 0x1102, 0x00c0, 0x3d2a, 0x7834, 0xa005,
++	0x00c0, 0x3d2a, 0x7a38, 0xd2fc, 0x0040, 0x3d24, 0x70b0, 0xa005,
++	0x00c0, 0x3d24, 0x70b3, 0x0001, 0x708b, 0x0004, 0x1078, 0x3d2e,
++	0x0078, 0x3d2c, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b, 0x0005,
++	0x1078, 0x4289, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, 0x2011,
++	0xab8e, 0x1078, 0x42d4, 0x00c0, 0x3d4c, 0x7074, 0xa005, 0x00c0,
++	0x3d4c, 0x7150, 0xa186, 0xffff, 0x0040, 0x3d4c, 0x1078, 0x419d,
++	0x0040, 0x3d4c, 0x1078, 0x42b8, 0x20a9, 0x0008, 0x2298, 0x26a0,
++	0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
++	0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3d84, 0x2011,
++	0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3d82, 0x2079,
++	0xab80, 0x7a30, 0xa296, 0x1103, 0x00c0, 0x3d82, 0x7834, 0xa005,
++	0x00c0, 0x3d82, 0x7a38, 0xd2fc, 0x0040, 0x3d7c, 0x70b0, 0xa005,
++	0x00c0, 0x3d7c, 0x70b3, 0x0001, 0x708b, 0x0006, 0x1078, 0x3d86,
++	0x0078, 0x3d84, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b, 0x0007,
++	0x1078, 0x4289, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011,
++	0xab8e, 0x1078, 0x42d4, 0x00c0, 0x3dae, 0x7074, 0xa005, 0x00c0,
++	0x3dae, 0x7154, 0xa186, 0xffff, 0x0040, 0x3dae, 0xa180, 0x29c0,
++	0x200c, 0xa18c, 0xff00, 0x810f, 0x1078, 0x419d, 0x0040, 0x3dae,
++	0x1078, 0x3820, 0x0040, 0x3dae, 0x1078, 0x256a, 0x20a9, 0x0008,
++	0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
++	0x0014, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040,
++	0x3de6, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0,
++	0x3de4, 0x2079, 0xab80, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x3de4,
++	0x7834, 0xa005, 0x00c0, 0x3de4, 0x7a38, 0xd2fc, 0x0040, 0x3dde,
++	0x70b0, 0xa005, 0x00c0, 0x3dde, 0x70b3, 0x0001, 0x708b, 0x0008,
++	0x1078, 0x3de8, 0x0078, 0x3de6, 0x1078, 0x4224, 0x0f7f, 0x007c,
++	0x708b, 0x0009, 0x1078, 0x4289, 0x20a3, 0x1105, 0x20a3, 0x0100,
++	0x3430, 0x1078, 0x42d4, 0x00c0, 0x3e01, 0x7074, 0xa005, 0x00c0,
++	0x3e01, 0x1078, 0x4104, 0x00c0, 0x3e0b, 0xa085, 0x0001, 0x1078,
++	0x256a, 0x20a9, 0x0008, 0x2099, 0xab8e, 0x26a0, 0x53a6, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x420b, 0x007c,
++	0x0f7e, 0x7080, 0xa005, 0x0040, 0x3e51, 0x2011, 0x41dc, 0x1078,
++	0x5a45, 0xa086, 0x0014, 0x00c0, 0x3e4f, 0x2079, 0xab80, 0x7a30,
++	0xa296, 0x1105, 0x00c0, 0x3e4f, 0x7834, 0x2011, 0x0100, 0xa21e,
++	0x00c0, 0x3e3a, 0x7a38, 0xd2fc, 0x0040, 0x3e34, 0x70b0, 0xa005,
++	0x00c0, 0x3e34, 0x70b3, 0x0001, 0x708b, 0x000a, 0x1078, 0x3e53,
++	0x0078, 0x3e51, 0xa005, 0x00c0, 0x3e4f, 0x7a38, 0xd2fc, 0x0040,
++	0x3e47, 0x70b0, 0xa005, 0x00c0, 0x3e47, 0x70b3, 0x0001, 0x7087,
++	0x0000, 0x708b, 0x000e, 0x1078, 0x3edb, 0x0078, 0x3e51, 0x1078,
++	0x4224, 0x0f7f, 0x007c, 0x708b, 0x000b, 0x2011, 0xab0e, 0x22a0,
++	0x20a9, 0x0040, 0x2019, 0xffff, 0x43a4, 0x20a9, 0x0002, 0x2009,
++	0x0000, 0x41a4, 0x1078, 0x4289, 0x20a3, 0x1106, 0x20a3, 0x0000,
++	0x1078, 0x42d4, 0x0040, 0x3e70, 0x2013, 0x0000, 0x0078, 0x3e74,
++	0x6030, 0xa085, 0x0100, 0x2012, 0x2298, 0x20a9, 0x0042, 0x53a6,
++	0x60c3, 0x0084, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005,
++	0x0040, 0x3e9d, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0084,
++	0x00c0, 0x3e9b, 0x2079, 0xab80, 0x7a30, 0xa296, 0x1106, 0x00c0,
++	0x3e9b, 0x7834, 0xa005, 0x00c0, 0x3e9b, 0x708b, 0x000c, 0x1078,
++	0x3e9f, 0x0078, 0x3e9d, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b,
++	0x000d, 0x1078, 0x4289, 0x20a3, 0x1107, 0x20a3, 0x0000, 0x2099,
++	0xab8e, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x0084, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005,
++	0x0040, 0x3ed9, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0084,
++	0x00c0, 0x3ed7, 0x2079, 0xab80, 0x7a30, 0xa296, 0x1107, 0x00c0,
++	0x3ed7, 0x7834, 0xa005, 0x00c0, 0x3ed7, 0x7087, 0x0001, 0x1078,
++	0x427b, 0x708b, 0x000e, 0x1078, 0x3edb, 0x0078, 0x3ed9, 0x1078,
++	0x4224, 0x0f7f, 0x007c, 0x708b, 0x000f, 0x7083, 0x0000, 0x608b,
++	0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009,
++	0x07d0, 0x2011, 0x41dc, 0x1078, 0x5a38, 0x007c, 0x7080, 0xa005,
++	0x0040, 0x3ef6, 0x2011, 0x41dc, 0x1078, 0x5a45, 0x007c, 0x708b,
++	0x0011, 0x1078, 0x42d4, 0x00c0, 0x3f14, 0x716c, 0x81ff, 0x0040,
++	0x3f14, 0x2009, 0x0000, 0x7070, 0xa084, 0x00ff, 0x1078, 0x254d,
++	0xa186, 0x007e, 0x0040, 0x3f14, 0xa186, 0x0080, 0x0040, 0x3f14,
++	0x2011, 0xab8e, 0x1078, 0x419d, 0x20e1, 0x9080, 0x20e1, 0x4000,
++	0x2099, 0xab80, 0x20a1, 0x020b, 0x7480, 0xa480, 0x0018, 0xa080,
++	0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0014,
++	0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3f55,
++	0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3f53,
++	0x2079, 0xab80, 0x7a30, 0xa296, 0x1103, 0x00c0, 0x3f53, 0x7834,
++	0xa005, 0x00c0, 0x3f53, 0x7a38, 0xd2fc, 0x0040, 0x3f4d, 0x70b0,
++	0xa005, 0x00c0, 0x3f4d, 0x70b3, 0x0001, 0x708b, 0x0012, 0x1078,
++	0x3f57, 0x0078, 0x3f55, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b,
++	0x0013, 0x1078, 0x4295, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430,
++	0x2011, 0xab8e, 0x1078, 0x42d4, 0x00c0, 0x3f75, 0x7074, 0xa005,
++	0x00c0, 0x3f75, 0x7150, 0xa186, 0xffff, 0x0040, 0x3f75, 0x1078,
++	0x419d, 0x0040, 0x3f75, 0x1078, 0x42b8, 0x20a9, 0x0008, 0x2298,
++	0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014,
++	0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3fad,
++	0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3fab,
++	0x2079, 0xab80, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x3fab, 0x7834,
++	0xa005, 0x00c0, 0x3fab, 0x7a38, 0xd2fc, 0x0040, 0x3fa5, 0x70b0,
++	0xa005, 0x00c0, 0x3fa5, 0x70b3, 0x0001, 0x708b, 0x0014, 0x1078,
++	0x3faf, 0x0078, 0x3fad, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b,
++	0x0015, 0x1078, 0x4295, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430,
++	0x2011, 0xab8e, 0x1078, 0x42d4, 0x00c0, 0x3fd7, 0x7074, 0xa005,
++	0x00c0, 0x3fd7, 0x7154, 0xa186, 0xffff, 0x0040, 0x3fd7, 0xa180,
++	0x29c0, 0x200c, 0xa18c, 0xff00, 0x810f, 0x1078, 0x419d, 0x0040,
++	0x3fd7, 0x1078, 0x3820, 0x0040, 0x3fd7, 0x1078, 0x256a, 0x20a9,
++	0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x0014, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005,
++	0x0040, 0x402e, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014,
++	0x00c0, 0x402c, 0x2079, 0xab80, 0x7a30, 0xa296, 0x1105, 0x00c0,
++	0x402c, 0x7834, 0x2011, 0x0100, 0xa21e, 0x00c0, 0x400b, 0x7a38,
++	0xd2fc, 0x0040, 0x4009, 0x70b0, 0xa005, 0x00c0, 0x4009, 0x70b3,
++	0x0001, 0x0078, 0x401a, 0xa005, 0x00c0, 0x402c, 0x7a38, 0xd2fc,
++	0x0040, 0x4018, 0x70b0, 0xa005, 0x00c0, 0x4018, 0x70b3, 0x0001,
++	0x7087, 0x0000, 0x7a38, 0xd2f4, 0x0040, 0x4026, 0x2001, 0xa674,
++	0x2004, 0xd0a4, 0x00c0, 0x4026, 0x70cf, 0x0008, 0x708b, 0x0016,
++	0x1078, 0x4030, 0x0078, 0x402e, 0x1078, 0x4224, 0x0f7f, 0x007c,
++	0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xab80, 0x20a1, 0x020b,
++	0x20a9, 0x000e, 0x53a6, 0x3430, 0x2011, 0xab8e, 0x708b, 0x0017,
++	0x1078, 0x42d4, 0x00c0, 0x4050, 0x7074, 0xa005, 0x00c0, 0x4050,
++	0x1078, 0x4104, 0x00c0, 0x405a, 0xa085, 0x0001, 0x1078, 0x256a,
++	0x20a9, 0x0008, 0x2099, 0xab8e, 0x26a0, 0x53a6, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x420b, 0x007c, 0x0f7e,
++	0x7080, 0xa005, 0x0040, 0x407f, 0x2011, 0x41dc, 0x1078, 0x5a45,
++	0xa086, 0x0084, 0x00c0, 0x407d, 0x2079, 0xab80, 0x7a30, 0xa296,
++	0x1106, 0x00c0, 0x407d, 0x7834, 0xa005, 0x00c0, 0x407d, 0x708b,
++	0x0018, 0x1078, 0x4081, 0x0078, 0x407f, 0x1078, 0x4224, 0x0f7f,
++	0x007c, 0x708b, 0x0019, 0x1078, 0x4295, 0x20a3, 0x1106, 0x20a3,
++	0x0000, 0x3430, 0x2099, 0xab8e, 0x2039, 0xab0e, 0x27a0, 0x20a9,
++	0x0040, 0x53a3, 0x1078, 0x42d4, 0x00c0, 0x40b5, 0x2728, 0x2514,
++	0x8207, 0xa084, 0x00ff, 0x8000, 0x2018, 0xa294, 0x00ff, 0x8007,
++	0xa205, 0x202a, 0x6030, 0x2310, 0x8214, 0xa2a0, 0xab0e, 0x2414,
++	0xa38c, 0x0001, 0x0040, 0x40b0, 0xa294, 0xff00, 0x0078, 0x40b3,
++	0xa294, 0x00ff, 0x8007, 0xa215, 0x2222, 0x2798, 0x26a0, 0x20a9,
++	0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084,
++	0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x40e7,
++	0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0084, 0x00c0, 0x40e5,
++	0x2079, 0xab80, 0x7a30, 0xa296, 0x1107, 0x00c0, 0x40e5, 0x7834,
++	0xa005, 0x00c0, 0x40e5, 0x7087, 0x0001, 0x1078, 0x427b, 0x708b,
++	0x001a, 0x1078, 0x40e9, 0x0078, 0x40e7, 0x1078, 0x4224, 0x0f7f,
++	0x007c, 0x708b, 0x001b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099,
++	0xab80, 0x20a1, 0x020b, 0x7480, 0xa480, 0x0018, 0xa080, 0x0007,
++	0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0084, 0x1078,
++	0x420b, 0x007c, 0x007c, 0x007c, 0x087e, 0x097e, 0x2029, 0xa653,
++	0x252c, 0x20a9, 0x0008, 0x2041, 0xab0e, 0x28a0, 0x2099, 0xab8e,
++	0x53a3, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0040, 0x411a,
++	0x2011, 0x0000, 0x2800, 0xa200, 0x200c, 0xa1a6, 0xffff, 0x00c0,
++	0x412c, 0xd5d4, 0x0040, 0x4127, 0x8210, 0x0078, 0x4128, 0x8211,
++	0x00f0, 0x411a, 0x0078, 0x4194, 0x82ff, 0x00c0, 0x413e, 0xd5d4,
++	0x0040, 0x4138, 0xa1a6, 0x3fff, 0x0040, 0x4124, 0x0078, 0x413c,
++	0xa1a6, 0x3fff, 0x0040, 0x4194, 0xa18d, 0xc000, 0x20a9, 0x0010,
++	0x2019, 0x0001, 0xd5d4, 0x0040, 0x4147, 0x2019, 0x0010, 0x2120,
++	0xd5d4, 0x0040, 0x414e, 0x8423, 0x0078, 0x414f, 0x8424, 0x00c8,
++	0x415c, 0xd5d4, 0x0040, 0x4157, 0x8319, 0x0078, 0x4158, 0x8318,
++	0x00f0, 0x4148, 0x0078, 0x4194, 0x23a8, 0x2021, 0x0001, 0x8426,
++	0x8425, 0x00f0, 0x4160, 0x2328, 0x8529, 0xa2be, 0x0007, 0x0040,
++	0x4174, 0x007e, 0x2039, 0x0007, 0x2200, 0xa73a, 0x007f, 0x27a8,
++	0xa5a8, 0x0010, 0x00f0, 0x4170, 0x7552, 0xa5c8, 0x29c0, 0x292c,
++	0xa5ac, 0x00ff, 0x6532, 0x60e7, 0x0000, 0x65ea, 0x706f, 0x0000,
++	0x7572, 0x2018, 0x2304, 0xa405, 0x201a, 0x7077, 0x0001, 0x26a0,
++	0x2898, 0x20a9, 0x0008, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0xa085, 0x0001, 0x0078, 0x419a, 0xa006, 0x0078, 0x419a, 0xa006,
++	0x1078, 0x1332, 0x097f, 0x087f, 0x007c, 0x2118, 0x2021, 0x0000,
++	0x2001, 0x0007, 0xa39a, 0x0010, 0x0048, 0x41aa, 0x8420, 0x8001,
++	0x0078, 0x41a2, 0x2118, 0x84ff, 0x0040, 0x41b3, 0xa39a, 0x0010,
++	0x8421, 0x00c0, 0x41ae, 0x2021, 0x0001, 0x83ff, 0x0040, 0x41bc,
++	0x8423, 0x8319, 0x00c0, 0x41b8, 0xa238, 0x2704, 0xa42c, 0x00c0,
++	0x41d4, 0xa405, 0x203a, 0x7152, 0xa1a0, 0x29c0, 0x242c, 0xa5ac,
++	0x00ff, 0x6532, 0x60e7, 0x0000, 0x65ea, 0x706f, 0x0000, 0x7572,
++	0x7077, 0x0001, 0xa084, 0x0000, 0x007c, 0x0e7e, 0x2071, 0xa600,
++	0x707b, 0x0000, 0x0e7f, 0x007c, 0x0e7e, 0x0f7e, 0x2001, 0x0002,
++	0x1078, 0x5ae6, 0x2079, 0x0100, 0x2071, 0x0140, 0x1078, 0x6e0f,
++	0x7004, 0xa084, 0x4000, 0x0040, 0x41f1, 0x7003, 0x1000, 0x7003,
++	0x0000, 0x127e, 0x2091, 0x8000, 0x2071, 0xa622, 0x2073, 0x0000,
++	0x7840, 0x027e, 0x017e, 0x2009, 0x00f7, 0x1078, 0x42a1, 0x017f,
++	0xa094, 0x0010, 0xa285, 0x0080, 0x7842, 0x7a42, 0x027f, 0x127f,
++	0x0f7f, 0x0e7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x2011, 0xa8bb,
++	0x2013, 0x0000, 0x7083, 0x0000, 0x127f, 0x20e1, 0x9080, 0x60a3,
++	0x0056, 0x60a7, 0x9575, 0x1078, 0x6e06, 0x2009, 0x07d0, 0x2011,
++	0x41dc, 0x1078, 0x5add, 0x007c, 0x017e, 0x027e, 0x0c7e, 0x127e,
++	0x2091, 0x8000, 0x2011, 0x0003, 0x1078, 0x70e0, 0x2011, 0x0002,
++	0x1078, 0x70ea, 0x1078, 0x6fc4, 0x037e, 0x2019, 0x0000, 0x1078,
++	0x7058, 0x037f, 0x2009, 0x00f7, 0x1078, 0x42a1, 0x2061, 0xa8c4,
++	0x601b, 0x0000, 0x601f, 0x0000, 0x2061, 0xa600, 0x6003, 0x0001,
++	0x2061, 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x002d,
++	0x2011, 0x4259, 0x1078, 0x5a38, 0x127f, 0x0c7f, 0x027f, 0x017f,
++	0x007c, 0x0e7e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2001, 0x0001,
++	0x1078, 0x5ae6, 0x2071, 0x0100, 0x1078, 0x6e0f, 0x2071, 0x0140,
++	0x7004, 0xa084, 0x4000, 0x0040, 0x4271, 0x7003, 0x1000, 0x7003,
++	0x0000, 0x2001, 0x0001, 0x1078, 0x24e8, 0x1078, 0x4224, 0x127f,
++	0x007f, 0x0e7f, 0x007c, 0x20a9, 0x0040, 0x20a1, 0xacc0, 0x2099,
++	0xab8e, 0x3304, 0x8007, 0x20a2, 0x9398, 0x94a0, 0x00f0, 0x4281,
++	0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xab00, 0x20a1,
++	0x020b, 0x20a9, 0x000c, 0x53a6, 0x007c, 0x20e1, 0x9080, 0x20e1,
++	0x4000, 0x2099, 0xab80, 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6,
++	0x007c, 0x0c7e, 0x007e, 0x2061, 0x0100, 0x810f, 0x2001, 0xa62f,
++	0x2004, 0xa005, 0x00c0, 0x42b2, 0x6030, 0xa084, 0x00ff, 0xa105,
++	0x0078, 0x42b4, 0xa185, 0x00f7, 0x604a, 0x007f, 0x0c7f, 0x007c,
++	0x017e, 0x047e, 0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040, 0x42cb,
++	0xa006, 0x2020, 0x2009, 0x002a, 0x1078, 0xa21d, 0x2001, 0xa60c,
++	0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0000, 0x1078,
++	0x284f, 0x047f, 0x017f, 0x007c, 0x007e, 0x2001, 0xa60c, 0x2004,
++	0xd09c, 0x0040, 0x42db, 0x007f, 0x007c, 0x007e, 0x017e, 0x127e,
++	0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0xa18d, 0x0006, 0x2102,
++	0x127f, 0x017f, 0x007f, 0x007c, 0x157e, 0x20a9, 0x00ff, 0x2009,
++	0xa735, 0xa006, 0x200a, 0x8108, 0x00f0, 0x42f2, 0x157f, 0x007c,
++	0x0d7e, 0x037e, 0x157e, 0x137e, 0x147e, 0x2069, 0xa652, 0xa006,
++	0x6002, 0x6007, 0x0707, 0x600a, 0x600e, 0x6012, 0xa198, 0x29c0,
++	0x231c, 0xa39c, 0x00ff, 0x6316, 0x20a9, 0x0004, 0xac98, 0x0006,
++	0x23a0, 0x40a4, 0x20a9, 0x0004, 0xac98, 0x000a, 0x23a0, 0x40a4,
++	0x603e, 0x6042, 0x604e, 0x6052, 0x6056, 0x605a, 0x605e, 0x6062,
++	0x6066, 0x606a, 0x606e, 0x6072, 0x6076, 0x607a, 0x607e, 0x6082,
++	0x6086, 0x608a, 0x608e, 0x6092, 0x6096, 0x609a, 0x609e, 0x60ae,
++	0x61a2, 0x0d7e, 0x60a4, 0xa06d, 0x0040, 0x4338, 0x1078, 0x13a4,
++	0x60a7, 0x0000, 0x60a8, 0xa06d, 0x0040, 0x4340, 0x1078, 0x13a4,
++	0x60ab, 0x0000, 0x0d7f, 0xa006, 0x604a, 0x6810, 0x603a, 0x680c,
++	0x6046, 0x6814, 0xa084, 0x00ff, 0x6042, 0x147f, 0x137f, 0x157f,
++	0x037f, 0x0d7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x6944, 0x6e48,
++	0xa684, 0x3fff, 0xa082, 0x4000, 0x00c8, 0x4424, 0xa18c, 0xff00,
++	0x810f, 0xa182, 0x00ff, 0x00c8, 0x442a, 0x2001, 0xa60c, 0x2004,
++	0xa084, 0x0003, 0x0040, 0x4385, 0x2001, 0xa60c, 0x2004, 0xd084,
++	0x00c0, 0x4405, 0xa188, 0xa735, 0x2104, 0xa065, 0x0040, 0x4405,
++	0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x00c0, 0x4405, 0x6000,
++	0xd0c4, 0x0040, 0x4405, 0x0078, 0x4392, 0xa188, 0xa735, 0x2104,
++	0xa065, 0x0040, 0x43e9, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006,
++	0x00c0, 0x43ef, 0x60a4, 0xa00d, 0x0040, 0x439a, 0x1078, 0x4817,
++	0x0040, 0x43e3, 0x60a8, 0xa00d, 0x0040, 0x43b4, 0x1078, 0x486a,
++	0x00c0, 0x43b4, 0x694c, 0xd1fc, 0x00c0, 0x43aa, 0x1078, 0x44df,
++	0x0078, 0x43de, 0x1078, 0x4484, 0x694c, 0xd1ec, 0x00c0, 0x43de,
++	0x1078, 0x46d6, 0x0078, 0x43de, 0x694c, 0xa184, 0xa000, 0x0040,
++	0x43ce, 0xd1ec, 0x0040, 0x43c7, 0xd1fc, 0x0040, 0x43c3, 0x1078,
++	0x46e7, 0x0078, 0x43ca, 0x1078, 0x46e7, 0x0078, 0x43ce, 0xd1fc,
++	0x0040, 0x43ce, 0x1078, 0x4484, 0x0078, 0x43de, 0x6050, 0xa00d,
++	0x0040, 0x43d9, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052, 0x0078,
++	0x43de, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x1078, 0x5da9,
++	0xa006, 0x127f, 0x007c, 0x2001, 0x0005, 0x2009, 0x0000, 0x0078,
++	0x442e, 0x2001, 0x0028, 0x2009, 0x0000, 0x0078, 0x442e, 0xa082,
++	0x0006, 0x00c8, 0x4405, 0x60a0, 0xd0bc, 0x00c0, 0x4401, 0x6100,
++	0xd1fc, 0x0040, 0x4392, 0x2001, 0x0029, 0x2009, 0x1000, 0x0078,
++	0x442e, 0x2001, 0x0028, 0x0078, 0x4420, 0x2009, 0xa60c, 0x210c,
++	0xd18c, 0x0040, 0x440f, 0x2001, 0x0004, 0x0078, 0x4420, 0xd184,
++	0x0040, 0x4416, 0x2001, 0x0004, 0x0078, 0x4420, 0x2001, 0x0029,
++	0x6100, 0xd1fc, 0x0040, 0x4420, 0x2009, 0x1000, 0x0078, 0x442e,
++	0x2009, 0x0000, 0x0078, 0x442e, 0x2001, 0x0029, 0x2009, 0x0000,
++	0x0078, 0x442e, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005, 0x127f,
++	0x007c, 0x6944, 0x6e48, 0xa684, 0x3fff, 0xa082, 0x4000, 0x00c8,
++	0x447e, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x00c8, 0x4464,
++	0xa188, 0xa735, 0x2104, 0xa065, 0x0040, 0x4464, 0x6004, 0xa084,
++	0x00ff, 0xa08e, 0x0006, 0x00c0, 0x446a, 0x684c, 0xd0ec, 0x0040,
++	0x4457, 0x1078, 0x46e7, 0x1078, 0x4484, 0x0078, 0x445f, 0x1078,
++	0x4484, 0x684c, 0xd0fc, 0x0040, 0x445f, 0x1078, 0x46d6, 0x1078,
++	0x472f, 0xa006, 0x0078, 0x4482, 0x2001, 0x0028, 0x2009, 0x0000,
++	0x0078, 0x4482, 0xa082, 0x0006, 0x00c8, 0x4478, 0x6100, 0xd1fc,
++	0x0040, 0x444d, 0x2001, 0x0029, 0x2009, 0x1000, 0x0078, 0x4482,
++	0x2001, 0x0029, 0x2009, 0x0000, 0x0078, 0x4482, 0x2001, 0x0029,
++	0x2009, 0x0000, 0xa005, 0x007c, 0x127e, 0x2091, 0x8000, 0x6050,
++	0xa00d, 0x0040, 0x4492, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052,
++	0x127f, 0x007c, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x0078,
++	0x4490, 0x127e, 0x2091, 0x8000, 0x604c, 0xa005, 0x0040, 0x44af,
++	0x0e7e, 0x2071, 0xa8b1, 0x7004, 0xa086, 0x0002, 0x0040, 0x44b6,
++	0x0e7f, 0x604c, 0x6802, 0x2d00, 0x604e, 0x127f, 0x007c, 0x2d00,
++	0x6052, 0x604e, 0x6803, 0x0000, 0x0078, 0x44ad, 0x701c, 0xac06,
++	0x00c0, 0x44a8, 0x604c, 0x2070, 0x7000, 0x6802, 0x2d00, 0x7002,
++	0x0e7f, 0x127f, 0x007c, 0x127e, 0x2091, 0x8000, 0x604c, 0xa06d,
++	0x0040, 0x44d1, 0x6800, 0xa005, 0x00c0, 0x44cf, 0x6052, 0x604e,
++	0xad05, 0x127f, 0x007c, 0x604c, 0xa06d, 0x0040, 0x44de, 0x6800,
++	0xa005, 0x00c0, 0x44dc, 0x6052, 0x604e, 0xad05, 0x007c, 0x6803,
++	0x0000, 0x6084, 0xa00d, 0x0040, 0x44e9, 0x2d00, 0x200a, 0x6086,
++	0x007c, 0x2d00, 0x6086, 0x6082, 0x0078, 0x44e8, 0x127e, 0x0c7e,
++	0x027e, 0x2091, 0x8000, 0x6218, 0x2260, 0x6200, 0xa005, 0x0040,
++	0x44fc, 0xc285, 0x0078, 0x44fd, 0xc284, 0x6202, 0x027f, 0x0c7f,
++	0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091, 0x8000, 0x6218, 0x2260,
++	0x6204, 0x007e, 0xa086, 0x0006, 0x00c0, 0x4521, 0x609c, 0xd0ac,
++	0x0040, 0x4521, 0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040, 0x4521,
++	0xa284, 0xff00, 0x8007, 0xa086, 0x0007, 0x00c0, 0x4521, 0x2011,
++	0x0600, 0x007f, 0xa294, 0xff00, 0xa215, 0x6206, 0x007e, 0xa086,
++	0x0006, 0x00c0, 0x4531, 0x6290, 0x82ff, 0x00c0, 0x4531, 0x1078,
++	0x1332, 0x007f, 0x0c7f, 0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091,
++	0x8000, 0x6218, 0x2260, 0x6204, 0x007e, 0xa086, 0x0006, 0x00c0,
++	0x4553, 0x609c, 0xd0a4, 0x0040, 0x4553, 0x2001, 0xa653, 0x2004,
++	0xd0ac, 0x00c0, 0x4553, 0xa284, 0x00ff, 0xa086, 0x0007, 0x00c0,
++	0x4553, 0x2011, 0x0006, 0x007f, 0xa294, 0x00ff, 0x8007, 0xa215,
++	0x6206, 0x0c7f, 0x127f, 0x007c, 0x027e, 0xa182, 0x00ff, 0x0048,
++	0x4565, 0xa085, 0x0001, 0x0078, 0x457d, 0xa190, 0xa735, 0x2204,
++	0xa065, 0x00c0, 0x457c, 0x017e, 0x0d7e, 0x1078, 0x1370, 0x2d60,
++	0x0d7f, 0x017f, 0x0040, 0x4561, 0x2c00, 0x2012, 0x60a7, 0x0000,
++	0x60ab, 0x0000, 0x1078, 0x42f8, 0xa006, 0x027f, 0x007c, 0x127e,
++	0x2091, 0x8000, 0x027e, 0xa182, 0x00ff, 0x0048, 0x458b, 0xa085,
++	0x0001, 0x0078, 0x45c1, 0x0d7e, 0xa190, 0xa735, 0x2204, 0xa06d,
++	0x0040, 0x45bf, 0x2013, 0x0000, 0x0d7e, 0x0c7e, 0x2d60, 0x60a4,
++	0xa06d, 0x0040, 0x459d, 0x1078, 0x13a4, 0x60a8, 0xa06d, 0x0040,
++	0x45a3, 0x1078, 0x13a4, 0x0c7f, 0x0d7f, 0x0d7e, 0x0c7e, 0x68ac,
++	0x2060, 0x8cff, 0x0040, 0x45bb, 0x600c, 0x007e, 0x6010, 0x2068,
++	0x1078, 0x8d06, 0x0040, 0x45b6, 0x1078, 0x13b4, 0x1078, 0x772d,
++	0x0c7f, 0x0078, 0x45a9, 0x0c7f, 0x0d7f, 0x1078, 0x13a4, 0x0d7f,
++	0xa006, 0x027f, 0x127f, 0x007c, 0x017e, 0xa182, 0x00ff, 0x0048,
++	0x45cd, 0xa085, 0x0001, 0x0078, 0x45d4, 0xa188, 0xa735, 0x2104,
++	0xa065, 0x0040, 0x45c9, 0xa006, 0x017f, 0x007c, 0x0d7e, 0x157e,
++	0x137e, 0x147e, 0x600b, 0x0000, 0x600f, 0x0000, 0x6000, 0xc08c,
++	0x6002, 0x2069, 0xab8e, 0x6808, 0x605e, 0x6810, 0x6062, 0x6138,
++	0xa10a, 0x0048, 0x45ec, 0x603a, 0x6814, 0x6066, 0x2099, 0xab96,
++	0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2099, 0xab9a,
++	0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2069, 0xabae,
++	0x6808, 0x606a, 0x690c, 0x616e, 0x6810, 0x6072, 0x6818, 0x6076,
++	0x60a0, 0xa086, 0x007e, 0x00c0, 0x4611, 0x2069, 0xab8e, 0x690c,
++	0x616e, 0xa182, 0x0211, 0x00c8, 0x4619, 0x2009, 0x0008, 0x0078,
++	0x4643, 0xa182, 0x0259, 0x00c8, 0x4621, 0x2009, 0x0007, 0x0078,
++	0x4643, 0xa182, 0x02c1, 0x00c8, 0x4629, 0x2009, 0x0006, 0x0078,
++	0x4643, 0xa182, 0x0349, 0x00c8, 0x4631, 0x2009, 0x0005, 0x0078,
++	0x4643, 0xa182, 0x0421, 0x00c8, 0x4639, 0x2009, 0x0004, 0x0078,
++	0x4643, 0xa182, 0x0581, 0x00c8, 0x4641, 0x2009, 0x0003, 0x0078,
++	0x4643, 0x2009, 0x0002, 0x6192, 0x147f, 0x137f, 0x157f, 0x0d7f,
++	0x007c, 0x017e, 0x027e, 0x0e7e, 0x2071, 0xab8d, 0x2e04, 0x6896,
++	0x2071, 0xab8e, 0x7004, 0x689a, 0x701c, 0x689e, 0x6a00, 0x2009,
++	0xa672, 0x210c, 0xd0bc, 0x0040, 0x4663, 0xd1ec, 0x0040, 0x4663,
++	0xc2ad, 0x0078, 0x4664, 0xc2ac, 0xd0c4, 0x0040, 0x466d, 0xd1e4,
++	0x0040, 0x466d, 0xc2bd, 0x0078, 0x466e, 0xc2bc, 0x6a02, 0x0e7f,
++	0x027f, 0x017f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x60a4,
++	0xa06d, 0x0040, 0x4697, 0x6900, 0x81ff, 0x00c0, 0x46ab, 0x6a04,
++	0xa282, 0x0010, 0x00c8, 0x46b0, 0xad88, 0x0004, 0x20a9, 0x0010,
++	0x2104, 0xa086, 0xffff, 0x0040, 0x4692, 0x8108, 0x00f0, 0x4688,
++	0x1078, 0x1332, 0x260a, 0x8210, 0x6a06, 0x0078, 0x46ab, 0x1078,
++	0x138b, 0x0040, 0x46b0, 0x2d00, 0x60a6, 0x6803, 0x0000, 0xad88,
++	0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x00f0, 0x46a3,
++	0x6807, 0x0001, 0x6e12, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x007c,
++	0xa006, 0x0078, 0x46ad, 0x127e, 0x2091, 0x8000, 0x0d7e, 0x60a4,
++	0xa00d, 0x0040, 0x46d3, 0x2168, 0x6800, 0xa005, 0x00c0, 0x46cf,
++	0x1078, 0x4817, 0x00c0, 0x46d3, 0x200b, 0xffff, 0x6804, 0xa08a,
++	0x0002, 0x0048, 0x46cf, 0x8001, 0x6806, 0x0078, 0x46d3, 0x1078,
++	0x13a4, 0x60a7, 0x0000, 0x0d7f, 0x127f, 0x007c, 0x127e, 0x2091,
++	0x8000, 0x1078, 0x487f, 0x0078, 0x46df, 0x1078, 0x4484, 0x1078,
++	0x4775, 0x00c0, 0x46dd, 0x1078, 0x472f, 0x127f, 0x007c, 0x0d7e,
++	0x127e, 0x2091, 0x8000, 0x60a8, 0xa06d, 0x0040, 0x470b, 0x6950,
++	0x81ff, 0x00c0, 0x471f, 0x6a54, 0xa282, 0x0010, 0x00c8, 0x472c,
++	0xad88, 0x0018, 0x20a9, 0x0010, 0x2104, 0xa086, 0xffff, 0x0040,
++	0x4706, 0x8108, 0x00f0, 0x46fc, 0x1078, 0x1332, 0x260a, 0x8210,
++	0x6a56, 0x0078, 0x471f, 0x1078, 0x138b, 0x0040, 0x472c, 0x2d00,
++	0x60aa, 0x6853, 0x0000, 0xad88, 0x0018, 0x20a9, 0x0010, 0x200b,
++	0xffff, 0x8108, 0x00f0, 0x4717, 0x6857, 0x0001, 0x6e62, 0x0078,
++	0x4723, 0x1078, 0x44df, 0x1078, 0x4739, 0x00c0, 0x4721, 0xa085,
++	0x0001, 0x127f, 0x0d7f, 0x007c, 0xa006, 0x0078, 0x4729, 0x127e,
++	0x2091, 0x8000, 0x1078, 0x5da9, 0x127f, 0x007c, 0xa01e, 0x0078,
++	0x473b, 0x2019, 0x0001, 0xa00e, 0x127e, 0x2091, 0x8000, 0x604c,
++	0x2068, 0x6000, 0xd0dc, 0x00c0, 0x4759, 0x8dff, 0x0040, 0x4770,
++	0x83ff, 0x0040, 0x4751, 0x6848, 0xa606, 0x0040, 0x475e, 0x0078,
++	0x4759, 0x683c, 0xa406, 0x00c0, 0x4759, 0x6840, 0xa506, 0x0040,
++	0x475e, 0x2d08, 0x6800, 0x2068, 0x0078, 0x4745, 0x1078, 0x7233,
++	0x6a00, 0x604c, 0xad06, 0x00c0, 0x4768, 0x624e, 0x0078, 0x476b,
++	0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0, 0x4770, 0x6152, 0x8dff,
++	0x127f, 0x007c, 0xa01e, 0x0078, 0x4777, 0x2019, 0x0001, 0xa00e,
++	0x6080, 0x2068, 0x8dff, 0x0040, 0x47a3, 0x83ff, 0x0040, 0x4786,
++	0x6848, 0xa606, 0x0040, 0x4793, 0x0078, 0x478e, 0x683c, 0xa406,
++	0x00c0, 0x478e, 0x6840, 0xa506, 0x0040, 0x4793, 0x2d08, 0x6800,
++	0x2068, 0x0078, 0x477a, 0x6a00, 0x6080, 0xad06, 0x00c0, 0x479b,
++	0x6282, 0x0078, 0x479e, 0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0,
++	0x47a3, 0x6186, 0x8dff, 0x007c, 0xa016, 0x1078, 0x4810, 0x00c0,
++	0x47ab, 0x2011, 0x0001, 0x1078, 0x4863, 0x00c0, 0x47b1, 0xa295,
++	0x0002, 0x007c, 0x1078, 0x489b, 0x0040, 0x47ba, 0x1078, 0x8dca,
++	0x0078, 0x47bc, 0xa085, 0x0001, 0x007c, 0x1078, 0x489b, 0x0040,
++	0x47c5, 0x1078, 0x8d62, 0x0078, 0x47c7, 0xa085, 0x0001, 0x007c,
++	0x1078, 0x489b, 0x0040, 0x47d0, 0x1078, 0x8dac, 0x0078, 0x47d2,
++	0xa085, 0x0001, 0x007c, 0x1078, 0x489b, 0x0040, 0x47db, 0x1078,
++	0x8d7e, 0x0078, 0x47dd, 0xa085, 0x0001, 0x007c, 0x1078, 0x489b,
++	0x0040, 0x47e6, 0x1078, 0x8de8, 0x0078, 0x47e8, 0xa085, 0x0001,
++	0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091, 0x8000, 0x6080, 0xa06d,
++	0x0040, 0x4808, 0x6800, 0x007e, 0x6837, 0x0103, 0x6b4a, 0x6847,
++	0x0000, 0x1078, 0x8f7d, 0x007e, 0x6000, 0xd0fc, 0x0040, 0x4802,
++	0x1078, 0xa4ed, 0x007f, 0x1078, 0x4a73, 0x007f, 0x0078, 0x47ef,
++	0x6083, 0x0000, 0x6087, 0x0000, 0x0d7f, 0x007f, 0x127f, 0x007c,
++	0x60a4, 0xa00d, 0x00c0, 0x4817, 0xa085, 0x0001, 0x007c, 0x0e7e,
++	0x2170, 0x7000, 0xa005, 0x00c0, 0x482c, 0x20a9, 0x0010, 0xae88,
++	0x0004, 0x2104, 0xa606, 0x0040, 0x482c, 0x8108, 0x00f0, 0x4821,
++	0xa085, 0x0001, 0x0078, 0x482d, 0xa006, 0x0e7f, 0x007c, 0x0d7e,
++	0x127e, 0x2091, 0x8000, 0x60a4, 0xa06d, 0x00c0, 0x483d, 0x1078,
++	0x138b, 0x0040, 0x484f, 0x2d00, 0x60a6, 0x6803, 0x0001, 0x6807,
++	0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108,
++	0x00f0, 0x4845, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x007c, 0xa006,
++	0x0078, 0x484c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x60a4, 0xa06d,
++	0x0040, 0x4860, 0x60a7, 0x0000, 0x1078, 0x13a4, 0xa085, 0x0001,
++	0x127f, 0x0d7f, 0x007c, 0x60a8, 0xa00d, 0x00c0, 0x486a, 0xa085,
++	0x0001, 0x007c, 0x0e7e, 0x2170, 0x7050, 0xa005, 0x00c0, 0x487d,
++	0x20a9, 0x0010, 0xae88, 0x0018, 0x2104, 0xa606, 0x0040, 0x487d,
++	0x8108, 0x00f0, 0x4874, 0xa085, 0x0001, 0x0e7f, 0x007c, 0x127e,
++	0x2091, 0x8000, 0x1078, 0x4863, 0x00c0, 0x4899, 0x200b, 0xffff,
++	0x0d7e, 0x60a8, 0x2068, 0x6854, 0xa08a, 0x0002, 0x0048, 0x4894,
++	0x8001, 0x6856, 0x0078, 0x4898, 0x1078, 0x13a4, 0x60ab, 0x0000,
++	0x0d7f, 0x127f, 0x007c, 0x609c, 0xd0a4, 0x007c, 0x0f7e, 0x71b0,
++	0x81ff, 0x00c0, 0x48b9, 0x71cc, 0xd19c, 0x0040, 0x48b9, 0x2001,
++	0x007e, 0xa080, 0xa735, 0x2004, 0xa07d, 0x0040, 0x48b9, 0x7804,
++	0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x48b9, 0x7800, 0xc0ed,
++	0x7802, 0x2079, 0xa652, 0x7804, 0xd0a4, 0x0040, 0x48df, 0x157e,
++	0x0c7e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x45c4,
++	0x00c0, 0x48d9, 0x6004, 0xa084, 0xff00, 0x8007, 0xa096, 0x0004,
++	0x0040, 0x48d6, 0xa086, 0x0006, 0x00c0, 0x48d9, 0x6000, 0xc0ed,
++	0x6002, 0x017f, 0x8108, 0x00f0, 0x48c5, 0x0c7f, 0x157f, 0x1078,
++	0x4967, 0x0040, 0x48e8, 0x2001, 0xa8a1, 0x200c, 0x0078, 0x48f0,
++	0x2079, 0xa652, 0x7804, 0xd0a4, 0x0040, 0x48f4, 0x2009, 0x07d0,
++	0x2011, 0x48f6, 0x1078, 0x5add, 0x0f7f, 0x007c, 0x2011, 0x48f6,
++	0x1078, 0x5a45, 0x1078, 0x4967, 0x0040, 0x491e, 0x2001, 0xa7b3,
++	0x2004, 0xa080, 0x0000, 0x200c, 0xc1ec, 0x2102, 0x2001, 0xa653,
++	0x2004, 0xd0a4, 0x0040, 0x4912, 0x2009, 0x07d0, 0x2011, 0x48f6,
++	0x1078, 0x5add, 0x0e7e, 0x2071, 0xa600, 0x706f, 0x0000, 0x7073,
++	0x0000, 0x1078, 0x2677, 0x0e7f, 0x0078, 0x4956, 0x157e, 0x0c7e,
++	0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x45c4, 0x00c0,
++	0x4950, 0x6000, 0xd0ec, 0x0040, 0x4950, 0x047e, 0x62a0, 0xa294,
++	0x00ff, 0x8227, 0xa006, 0x2009, 0x0029, 0x1078, 0xa21d, 0x6000,
++	0xc0e5, 0xc0ec, 0x6002, 0x6004, 0xa084, 0x00ff, 0xa085, 0x0700,
++	0x6006, 0x2019, 0x0029, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000,
++	0x1078, 0x5e0a, 0x2009, 0x0000, 0x1078, 0x9f8b, 0x077f, 0x047f,
++	0x017f, 0x8108, 0x00f0, 0x4924, 0x0c7f, 0x157f, 0x007c, 0x0c7e,
++	0x6018, 0x2060, 0x6000, 0xc0ec, 0x6002, 0x0c7f, 0x007c, 0x7818,
++	0x2004, 0xd0ac, 0x007c, 0x7818, 0x2004, 0xd0bc, 0x007c, 0x0f7e,
++	0x2001, 0xa7b3, 0x2004, 0xa07d, 0x0040, 0x4970, 0x7800, 0xd0ec,
++	0x0f7f, 0x007c, 0x127e, 0x027e, 0x2091, 0x8000, 0x007e, 0x62a0,
++	0xa290, 0xa735, 0x2204, 0xac06, 0x10c0, 0x1332, 0x007f, 0x6200,
++	0xa005, 0x0040, 0x4986, 0xc2fd, 0x0078, 0x4987, 0xc2fc, 0x6202,
++	0x027f, 0x127f, 0x007c, 0x2011, 0xa633, 0x2204, 0xd0cc, 0x0040,
++	0x4998, 0x2001, 0xa89f, 0x200c, 0x2011, 0x4999, 0x1078, 0x5add,
++	0x007c, 0x2011, 0x4999, 0x1078, 0x5a45, 0x2011, 0xa633, 0x2204,
++	0xc0cc, 0x2012, 0x007c, 0x2071, 0xa714, 0x7003, 0x0001, 0x7007,
++	0x0000, 0x7013, 0x0000, 0x7017, 0x0000, 0x701b, 0x0000, 0x701f,
++	0x0000, 0x700b, 0x0000, 0x704b, 0x0001, 0x704f, 0x0000, 0x705b,
++	0x0020, 0x705f, 0x0040, 0x707f, 0x0000, 0x2071, 0xa87d, 0x7003,
++	0xa714, 0x7007, 0x0000, 0x700b, 0x0000, 0x700f, 0xa85d, 0x7013,
++	0x0020, 0x7017, 0x0040, 0x7037, 0x0000, 0x007c, 0x017e, 0x0e7e,
++	0x2071, 0xa835, 0xa00e, 0x7186, 0x718a, 0x7097, 0x0001, 0x2001,
++	0xa653, 0x2004, 0xd0fc, 0x00c0, 0x49e8, 0x2001, 0xa653, 0x2004,
++	0xa00e, 0xd09c, 0x0040, 0x49e5, 0x8108, 0x7102, 0x0078, 0x4a3b,
++	0x2001, 0xa672, 0x200c, 0xa184, 0x000f, 0x2009, 0xa673, 0x210c,
++	0x0079, 0x49f2, 0x49dd, 0x4a13, 0x4a1b, 0x4a26, 0x4a2c, 0x49dd,
++	0x49dd, 0x49dd, 0x4a02, 0x49dd, 0x49dd, 0x49dd, 0x49dd, 0x49dd,
++	0x49dd, 0x49dd, 0x7003, 0x0004, 0x137e, 0x147e, 0x157e, 0x2099,
++	0xa676, 0x20a1, 0xa886, 0x20a9, 0x0004, 0x53a3, 0x157f, 0x147f,
++	0x137f, 0x0078, 0x4a3b, 0x708f, 0x0005, 0x7007, 0x0122, 0x2001,
++	0x0002, 0x0078, 0x4a21, 0x708f, 0x0002, 0x7007, 0x0121, 0x2001,
++	0x0003, 0x7002, 0x7097, 0x0001, 0x0078, 0x4a38, 0x7007, 0x0122,
++	0x2001, 0x0002, 0x0078, 0x4a30, 0x7007, 0x0121, 0x2001, 0x0003,
++	0x7002, 0xa006, 0x7096, 0x708e, 0xa184, 0xff00, 0x8007, 0x709a,
++	0xa184, 0x00ff, 0x7092, 0x0e7f, 0x017f, 0x007c, 0x0e7e, 0x2071,
++	0xa714, 0x684c, 0xa005, 0x00c0, 0x4a4c, 0x7028, 0xc085, 0x702a,
++	0xa085, 0x0001, 0x0078, 0x4a71, 0x6a60, 0x7236, 0x6b64, 0x733a,
++	0x6868, 0x703e, 0x7076, 0x686c, 0x7042, 0x707a, 0x684c, 0x702e,
++	0x6844, 0x7032, 0x2009, 0x000d, 0x200a, 0x700b, 0x0000, 0x8007,
++	0x8006, 0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100,
++	0xa319, 0x726e, 0x7372, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001,
++	0xa006, 0x0e7f, 0x007c, 0x0e7e, 0x027e, 0x6838, 0xd0fc, 0x00c0,
++	0x4ac9, 0x6804, 0xa00d, 0x0040, 0x4a8f, 0x0d7e, 0x2071, 0xa600,
++	0xa016, 0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff,
++	0x00c0, 0x4a82, 0x702e, 0x70ac, 0xa200, 0x70ae, 0x0d7f, 0x2071,
++	0xa714, 0x701c, 0xa005, 0x00c0, 0x4adb, 0x0068, 0x4ad9, 0x2071,
++	0xa835, 0x7200, 0x82ff, 0x0040, 0x4ad9, 0x6934, 0xa186, 0x0103,
++	0x00c0, 0x4aec, 0x6948, 0x6844, 0xa105, 0x00c0, 0x4acc, 0x2009,
++	0x8020, 0x2200, 0x0079, 0x4aac, 0x4ad9, 0x4ab1, 0x4b09, 0x4b17,
++	0x4ad9, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x4ad9, 0x7122,
++	0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091, 0x4080,
++	0x2071, 0xa600, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70ac, 0x8000,
++	0x70ae, 0x027f, 0x0e7f, 0x007c, 0x6844, 0xa086, 0x0100, 0x00c0,
++	0x4ad9, 0x6868, 0xa005, 0x00c0, 0x4ad9, 0x2009, 0x8020, 0x0078,
++	0x4aa9, 0x2071, 0xa714, 0x2d08, 0x206b, 0x0000, 0x7010, 0x8000,
++	0x7012, 0x7018, 0xa06d, 0x711a, 0x0040, 0x4ae9, 0x6902, 0x0078,
++	0x4aea, 0x711e, 0x0078, 0x4ac9, 0xa18c, 0x00ff, 0xa186, 0x0017,
++	0x0040, 0x4afa, 0xa186, 0x001e, 0x0040, 0x4afa, 0xa18e, 0x001f,
++	0x00c0, 0x4ad9, 0x684c, 0xd0cc, 0x0040, 0x4ad9, 0x6850, 0xa084,
++	0x00ff, 0xa086, 0x0001, 0x00c0, 0x4ad9, 0x2009, 0x8021, 0x0078,
++	0x4aa9, 0x7084, 0x8008, 0xa092, 0x001e, 0x00c8, 0x4ad9, 0x7186,
++	0xae90, 0x0003, 0xa210, 0x683c, 0x2012, 0x0078, 0x4b27, 0x7084,
++	0x8008, 0xa092, 0x000f, 0x00c8, 0x4ad9, 0x7186, 0xae90, 0x0003,
++	0x8003, 0xa210, 0x683c, 0x2012, 0x8210, 0x6840, 0x2012, 0x7088,
++	0xa10a, 0x0048, 0x4ac0, 0x718c, 0x7084, 0xa10a, 0x0048, 0x4ac0,
++	0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x4ac0, 0x2071, 0xa835,
++	0x7000, 0xa086, 0x0002, 0x00c0, 0x4b47, 0x1078, 0x4dc3, 0x2071,
++	0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x4ac0, 0x1078,
++	0x4dee, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078,
++	0x4ac0, 0x007e, 0x684c, 0x007e, 0x6837, 0x0103, 0x20a9, 0x001c,
++	0xad80, 0x0011, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x007f, 0xa084,
++	0x00ff, 0x684e, 0x007f, 0x684a, 0x6952, 0x007c, 0x2071, 0xa714,
++	0x7004, 0x0079, 0x4b6b, 0x4b75, 0x4b86, 0x4d94, 0x4d95, 0x4dbc,
++	0x4dc2, 0x4b76, 0x4d82, 0x4d23, 0x4da5, 0x007c, 0x127e, 0x2091,
++	0x8000, 0x0068, 0x4b85, 0x2009, 0x000d, 0x7030, 0x200a, 0x2091,
++	0x4080, 0x7007, 0x0001, 0x700b, 0x0000, 0x127f, 0x2069, 0xa8c4,
++	0x6844, 0xa005, 0x0050, 0x4bae, 0x00c0, 0x4bae, 0x127e, 0x2091,
++	0x8000, 0x2069, 0x0000, 0x6934, 0x2001, 0xa720, 0x2004, 0xa10a,
++	0x0040, 0x4ba9, 0x0068, 0x4bad, 0x2069, 0x0000, 0x6818, 0xd084,
++	0x00c0, 0x4bad, 0x2009, 0x8040, 0x6922, 0x681b, 0x0001, 0x2091,
++	0x4080, 0x2069, 0xa8c4, 0x6847, 0xffff, 0x127f, 0x2069, 0xa600,
++	0x6848, 0x6964, 0xa102, 0x2069, 0xa835, 0x688a, 0x6984, 0x701c,
++	0xa06d, 0x0040, 0x4bc0, 0x81ff, 0x0040, 0x4c08, 0x0078, 0x4bd6,
++	0x81ff, 0x0040, 0x4cda, 0x2071, 0xa835, 0x7184, 0x7088, 0xa10a,
++	0x00c8, 0x4bd6, 0x7190, 0x2071, 0xa8c4, 0x7040, 0xa005, 0x0040,
++	0x4bd6, 0x00d0, 0x4cda, 0x7142, 0x0078, 0x4cda, 0x2071, 0xa835,
++	0x718c, 0x127e, 0x2091, 0x8000, 0x7084, 0xa10a, 0x0048, 0x4cf7,
++	0x0068, 0x4c8c, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x4c8c,
++	0x2001, 0xffff, 0x2071, 0xa8c4, 0x7042, 0x2071, 0xa835, 0x7000,
++	0xa086, 0x0002, 0x00c0, 0x4bfe, 0x1078, 0x4dc3, 0x2071, 0x0000,
++	0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x4c8c, 0x1078, 0x4dee,
++	0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x4c8c,
++	0x2071, 0xa835, 0x7000, 0xa005, 0x0040, 0x4cb9, 0x6934, 0xa186,
++	0x0103, 0x00c0, 0x4c8f, 0x684c, 0xd0bc, 0x00c0, 0x4cb9, 0x6948,
++	0x6844, 0xa105, 0x00c0, 0x4cac, 0x2009, 0x8020, 0x2071, 0xa835,
++	0x7000, 0x0079, 0x4c23, 0x4cb9, 0x4c71, 0x4c49, 0x4c5b, 0x4c28,
++	0x137e, 0x147e, 0x157e, 0x2099, 0xa676, 0x20a1, 0xa886, 0x20a9,
++	0x0004, 0x53a3, 0x157f, 0x147f, 0x137f, 0x2071, 0xa87d, 0xad80,
++	0x000f, 0x700e, 0x7013, 0x0002, 0x7007, 0x0002, 0x700b, 0x0000,
++	0x2e10, 0x1078, 0x13db, 0x2071, 0xa714, 0x7007, 0x0009, 0x0078,
++	0x4cda, 0x7084, 0x8008, 0xa092, 0x001e, 0x00c8, 0x4cda, 0xae90,
++	0x0003, 0xa210, 0x683c, 0x2012, 0x7186, 0x2071, 0xa714, 0x1078,
++	0x4e4c, 0x0078, 0x4cda, 0x7084, 0x8008, 0xa092, 0x000f, 0x00c8,
++	0x4cda, 0xae90, 0x0003, 0x8003, 0xa210, 0x683c, 0x2012, 0x8210,
++	0x6840, 0x2012, 0x7186, 0x2071, 0xa714, 0x1078, 0x4e4c, 0x0078,
++	0x4cda, 0x127e, 0x2091, 0x8000, 0x0068, 0x4c8c, 0x2071, 0x0000,
++	0x7018, 0xd084, 0x00c0, 0x4c8c, 0x7122, 0x683c, 0x7026, 0x6840,
++	0x702a, 0x701b, 0x0001, 0x2091, 0x4080, 0x127f, 0x2071, 0xa714,
++	0x1078, 0x4e4c, 0x0078, 0x4cda, 0x127f, 0x0078, 0x4cda, 0xa18c,
++	0x00ff, 0xa186, 0x0017, 0x0040, 0x4c9d, 0xa186, 0x001e, 0x0040,
++	0x4c9d, 0xa18e, 0x001f, 0x00c0, 0x4cb9, 0x684c, 0xd0cc, 0x0040,
++	0x4cb9, 0x6850, 0xa084, 0x00ff, 0xa086, 0x0001, 0x00c0, 0x4cb9,
++	0x2009, 0x8021, 0x0078, 0x4c1e, 0x6844, 0xa086, 0x0100, 0x00c0,
++	0x4cb9, 0x6868, 0xa005, 0x00c0, 0x4cb9, 0x2009, 0x8020, 0x0078,
++	0x4c1e, 0x2071, 0xa714, 0x1078, 0x4e60, 0x0040, 0x4cda, 0x2071,
++	0xa714, 0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, 0x0003,
++	0x00c0, 0x4cd1, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0040, 0x4cd1,
++	0x710e, 0x7007, 0x0003, 0x1078, 0x4e80, 0x7050, 0xa086, 0x0100,
++	0x0040, 0x4d95, 0x127e, 0x2091, 0x8000, 0x2071, 0xa714, 0x7008,
++	0xa086, 0x0001, 0x00c0, 0x4cf5, 0x0068, 0x4cf5, 0x2009, 0x000d,
++	0x7030, 0x200a, 0x2091, 0x4080, 0x700b, 0x0000, 0x7004, 0xa086,
++	0x0006, 0x00c0, 0x4cf5, 0x7007, 0x0001, 0x127f, 0x007c, 0x2071,
++	0xa714, 0x1078, 0x4e60, 0x0040, 0x4d20, 0x2071, 0xa835, 0x7084,
++	0x700a, 0x20a9, 0x0020, 0x2099, 0xa836, 0x20a1, 0xa85d, 0x53a3,
++	0x7087, 0x0000, 0x2071, 0xa714, 0x2069, 0xa87d, 0x706c, 0x6826,
++	0x7070, 0x682a, 0x7074, 0x682e, 0x7078, 0x6832, 0x2d10, 0x1078,
++	0x13db, 0x7007, 0x0008, 0x2001, 0xffff, 0x2071, 0xa8c4, 0x7042,
++	0x127f, 0x0078, 0x4cda, 0x2069, 0xa87d, 0x6808, 0xa08e, 0x0000,
++	0x0040, 0x4d81, 0xa08e, 0x0200, 0x0040, 0x4d7f, 0xa08e, 0x0100,
++	0x00c0, 0x4d81, 0x127e, 0x2091, 0x8000, 0x0068, 0x4d7c, 0x2069,
++	0x0000, 0x6818, 0xd084, 0x00c0, 0x4d7c, 0x702c, 0x7130, 0x8108,
++	0xa102, 0x0048, 0x4d4a, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072,
++	0x0078, 0x4d54, 0x706c, 0xa080, 0x0040, 0x706e, 0x00c8, 0x4d54,
++	0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x6936, 0x700b, 0x0000,
++	0x2001, 0xa85a, 0x2004, 0xa005, 0x00c0, 0x4d73, 0x6934, 0x2069,
++	0xa835, 0x689c, 0x699e, 0x2069, 0xa8c4, 0xa102, 0x00c0, 0x4d6c,
++	0x6844, 0xa005, 0x00d0, 0x4d7a, 0x2001, 0xa85b, 0x200c, 0x810d,
++	0x6946, 0x0078, 0x4d7a, 0x2009, 0x8040, 0x6922, 0x681b, 0x0001,
++	0x2091, 0x4080, 0x7007, 0x0001, 0x127f, 0x0078, 0x4d81, 0x7007,
++	0x0005, 0x007c, 0x701c, 0xa06d, 0x0040, 0x4d93, 0x1078, 0x4e60,
++	0x0040, 0x4d93, 0x7007, 0x0003, 0x1078, 0x4e80, 0x7050, 0xa086,
++	0x0100, 0x0040, 0x4d95, 0x007c, 0x007c, 0x7050, 0xa09e, 0x0100,
++	0x00c0, 0x4d9e, 0x7007, 0x0004, 0x0078, 0x4dbc, 0xa086, 0x0200,
++	0x00c0, 0x4da4, 0x7007, 0x0005, 0x007c, 0x2001, 0xa87f, 0x2004,
++	0xa08e, 0x0100, 0x00c0, 0x4db1, 0x7007, 0x0001, 0x1078, 0x4e4c,
++	0x007c, 0xa08e, 0x0000, 0x0040, 0x4db0, 0xa08e, 0x0200, 0x00c0,
++	0x4db0, 0x7007, 0x0005, 0x007c, 0x1078, 0x4e16, 0x7006, 0x1078,
++	0x4e4c, 0x007c, 0x007c, 0x0e7e, 0x157e, 0x2071, 0xa835, 0x7184,
++	0x81ff, 0x0040, 0x4deb, 0xa006, 0x7086, 0xae80, 0x0003, 0x2071,
++	0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, 0x0070, 0x4de8, 0x2014,
++	0x722a, 0x8000, 0x0070, 0x4de8, 0x2014, 0x722e, 0x8000, 0x0070,
++	0x4de8, 0x2014, 0x723a, 0x8000, 0x0070, 0x4de8, 0x2014, 0x723e,
++	0xa180, 0x8030, 0x7022, 0x157f, 0x0e7f, 0x007c, 0x0e7e, 0x157e,
++	0x2071, 0xa835, 0x7184, 0x81ff, 0x0040, 0x4e13, 0xa006, 0x7086,
++	0xae80, 0x0003, 0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000,
++	0x2014, 0x722a, 0x8000, 0x0070, 0x4e0c, 0x2014, 0x723a, 0x8000,
++	0x2014, 0x723e, 0x0078, 0x4e10, 0x2001, 0x8020, 0x0078, 0x4e12,
++	0x2001, 0x8042, 0x7022, 0x157f, 0x0e7f, 0x007c, 0x702c, 0x7130,
++	0x8108, 0xa102, 0x0048, 0x4e23, 0xa00e, 0x7034, 0x706e, 0x7038,
++	0x7072, 0x0078, 0x4e2d, 0x706c, 0xa080, 0x0040, 0x706e, 0x00c8,
++	0x4e2d, 0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x700c, 0x8001,
++	0x700e, 0x00c0, 0x4e43, 0x127e, 0x2091, 0x8000, 0x0068, 0x4e46,
++	0x2001, 0x000d, 0x2102, 0x2091, 0x4080, 0x2001, 0x0001, 0x700b,
++	0x0000, 0x127f, 0x007c, 0x2001, 0x0007, 0x007c, 0x2001, 0x0006,
++	0x700b, 0x0001, 0x127f, 0x007c, 0x701c, 0xa06d, 0x0040, 0x4e5f,
++	0x127e, 0x2091, 0x8000, 0x7010, 0x8001, 0x7012, 0x2d04, 0x701e,
++	0xa005, 0x00c0, 0x4e5c, 0x701a, 0x127f, 0x1078, 0x13a4, 0x007c,
++	0x2019, 0x000d, 0x2304, 0x230c, 0xa10e, 0x0040, 0x4e6f, 0x2304,
++	0x230c, 0xa10e, 0x0040, 0x4e6f, 0xa006, 0x0078, 0x4e7f, 0x732c,
++	0x8319, 0x7130, 0xa102, 0x00c0, 0x4e79, 0x2300, 0xa005, 0x0078,
++	0x4e7f, 0x0048, 0x4e7e, 0xa302, 0x0078, 0x4e7f, 0x8002, 0x007c,
++	0x2d00, 0x7026, 0xa080, 0x000d, 0x7056, 0x7053, 0x0000, 0x127e,
++	0x2091, 0x8000, 0x2009, 0xa8d6, 0x2104, 0xc08d, 0x200a, 0x127f,
++	0x1078, 0x13f9, 0x007c, 0x2071, 0xa6e2, 0x7003, 0x0000, 0x7007,
++	0x0000, 0x700f, 0x0000, 0x702b, 0x0001, 0x704f, 0x0000, 0x7053,
++	0x0001, 0x705f, 0x0020, 0x7063, 0x0040, 0x7083, 0x0000, 0x708b,
++	0x0000, 0x708f, 0x0001, 0x70bf, 0x0000, 0x007c, 0x0e7e, 0x2071,
++	0xa6e2, 0x6848, 0xa005, 0x00c0, 0x4ebc, 0x7028, 0xc085, 0x702a,
++	0xa085, 0x0001, 0x0078, 0x4ee1, 0x6a50, 0x7236, 0x6b54, 0x733a,
++	0x6858, 0x703e, 0x707a, 0x685c, 0x7042, 0x707e, 0x6848, 0x702e,
++	0x6840, 0x7032, 0x2009, 0x000c, 0x200a, 0x8007, 0x8006, 0x8006,
++	0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, 0x7272,
++	0x7376, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700f, 0x0000,
++	0xa006, 0x0e7f, 0x007c, 0x2b78, 0x2071, 0xa6e2, 0x7004, 0x1079,
++	0x4f41, 0x700c, 0x0079, 0x4eec, 0x4ef1, 0x4ee6, 0x4ee6, 0x4ee6,
++	0x4ee6, 0x007c, 0x700c, 0x0079, 0x4ef5, 0x4efa, 0x4f3f, 0x4f3f,
++	0x4f40, 0x4f40, 0x7830, 0x7930, 0xa106, 0x0040, 0x4f04, 0x7830,
++	0x7930, 0xa106, 0x00c0, 0x4f2a, 0x7030, 0xa10a, 0x0040, 0x4f2a,
++	0x00c8, 0x4f0c, 0x712c, 0xa10a, 0xa18a, 0x0002, 0x00c8, 0x4f2b,
++	0x1078, 0x1370, 0x0040, 0x4f2a, 0x2d00, 0x705a, 0x7063, 0x0040,
++	0x2001, 0x0003, 0x7057, 0x0000, 0x127e, 0x007e, 0x2091, 0x8000,
++	0x2009, 0xa8d6, 0x2104, 0xc085, 0x200a, 0x007f, 0x700e, 0x127f,
++	0x1078, 0x13f9, 0x007c, 0x1078, 0x1370, 0x0040, 0x4f2a, 0x2d00,
++	0x705a, 0x1078, 0x1370, 0x00c0, 0x4f37, 0x0078, 0x4f16, 0x2d00,
++	0x7086, 0x7063, 0x0080, 0x2001, 0x0004, 0x0078, 0x4f1a, 0x007c,
++	0x007c, 0x4f52, 0x4f53, 0x4f8a, 0x4f8b, 0x4f3f, 0x4fc1, 0x4fc6,
++	0x4ffd, 0x4ffe, 0x5019, 0x501a, 0x501b, 0x501c, 0x501d, 0x501e,
++	0x509e, 0x50c8, 0x007c, 0x700c, 0x0079, 0x4f56, 0x4f5b, 0x4f5e,
++	0x4f6e, 0x4f89, 0x4f89, 0x1078, 0x4ef2, 0x007c, 0x127e, 0x8001,
++	0x700e, 0x7058, 0x007e, 0x1078, 0x5464, 0x0040, 0x4f6b, 0x2091,
++	0x8000, 0x1078, 0x4ef2, 0x0d7f, 0x0078, 0x4f77, 0x127e, 0x8001,
++	0x700e, 0x1078, 0x5464, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803,
++	0x0000, 0x6807, 0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x0020,
++	0x00c8, 0x4f86, 0x1079, 0x4fa1, 0x127f, 0x007c, 0x127f, 0x1078,
++	0x501f, 0x007c, 0x007c, 0x007c, 0x0e7e, 0x2071, 0xa6e2, 0x700c,
++	0x0079, 0x4f92, 0x4f97, 0x4f97, 0x4f97, 0x4f99, 0x4f9d, 0x0e7f,
++	0x007c, 0x700f, 0x0001, 0x0078, 0x4f9f, 0x700f, 0x0002, 0x0e7f,
++	0x007c, 0x501f, 0x501f, 0x503b, 0x501f, 0x5171, 0x501f, 0x501f,
++	0x501f, 0x501f, 0x501f, 0x503b, 0x51bb, 0x5208, 0x5261, 0x5277,
++	0x501f, 0x501f, 0x5057, 0x503b, 0x501f, 0x501f, 0x5078, 0x5338,
++	0x5356, 0x501f, 0x5057, 0x501f, 0x501f, 0x501f, 0x501f, 0x506d,
++	0x5356, 0x7020, 0x2068, 0x1078, 0x13a4, 0x007c, 0x700c, 0x0079,
++	0x4fc9, 0x4fce, 0x4fd1, 0x4fe1, 0x4ffc, 0x4ffc, 0x1078, 0x4ef2,
++	0x007c, 0x127e, 0x8001, 0x700e, 0x7058, 0x007e, 0x1078, 0x5464,
++	0x0040, 0x4fde, 0x2091, 0x8000, 0x1078, 0x4ef2, 0x0d7f, 0x0078,
++	0x4fea, 0x127e, 0x8001, 0x700e, 0x1078, 0x5464, 0x7058, 0x2068,
++	0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000, 0x6834, 0xa084,
++	0x00ff, 0xa08a, 0x001a, 0x00c8, 0x4ff9, 0x1079, 0x4fff, 0x127f,
++	0x007c, 0x127f, 0x1078, 0x501f, 0x007c, 0x007c, 0x007c, 0x501f,
++	0x503b, 0x515b, 0x501f, 0x503b, 0x501f, 0x503b, 0x503b, 0x501f,
++	0x503b, 0x515b, 0x503b, 0x503b, 0x503b, 0x503b, 0x503b, 0x501f,
++	0x503b, 0x515b, 0x501f, 0x501f, 0x503b, 0x501f, 0x501f, 0x501f,
++	0x503b, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x7007,
++	0x0001, 0x6838, 0xa084, 0x00ff, 0xc0d5, 0x683a, 0x127e, 0x2091,
++	0x8000, 0x1078, 0x4a73, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838,
++	0xa084, 0x00ff, 0xc0e5, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078,
++	0x4a73, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff,
++	0xc0ed, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x4a73, 0x127f,
++	0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0dd, 0x683a,
++	0x127e, 0x2091, 0x8000, 0x1078, 0x4a73, 0x127f, 0x007c, 0x6834,
++	0x8007, 0xa084, 0x00ff, 0x0040, 0x502d, 0x8001, 0x00c0, 0x5064,
++	0x7007, 0x0001, 0x0078, 0x513a, 0x7007, 0x0006, 0x7012, 0x2d00,
++	0x7016, 0x701a, 0x704b, 0x513a, 0x007c, 0x684c, 0xa084, 0x00c0,
++	0xa086, 0x00c0, 0x00c0, 0x5078, 0x7007, 0x0001, 0x0078, 0x5373,
++	0x2d00, 0x7016, 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098,
++	0x20a1, 0xa70d, 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x00c8,
++	0x5049, 0x6884, 0xa08a, 0x0002, 0x00c8, 0x5049, 0x82ff, 0x00c0,
++	0x509a, 0x6888, 0x698c, 0xa105, 0x0040, 0x509a, 0x2001, 0x510a,
++	0x0078, 0x509d, 0xa280, 0x5100, 0x2004, 0x70c6, 0x7010, 0xa015,
++	0x0040, 0x50e8, 0x1078, 0x1370, 0x00c0, 0x50a9, 0x7007, 0x000f,
++	0x007c, 0x2d00, 0x7022, 0x70c4, 0x2060, 0x6000, 0x6836, 0x6004,
++	0xad00, 0x7096, 0x6008, 0xa20a, 0x00c8, 0x50b8, 0xa00e, 0x2200,
++	0x7112, 0x620c, 0x8003, 0x800b, 0xa296, 0x0004, 0x0040, 0x50c1,
++	0xa108, 0x719a, 0x810b, 0x719e, 0xae90, 0x0022, 0x1078, 0x13db,
++	0x7090, 0xa08e, 0x0100, 0x0040, 0x50dc, 0xa086, 0x0200, 0x0040,
++	0x50d4, 0x7007, 0x0010, 0x007c, 0x7020, 0x2068, 0x1078, 0x13a4,
++	0x7014, 0x2068, 0x0078, 0x5049, 0x7020, 0x2068, 0x7018, 0x6802,
++	0x6807, 0x0000, 0x2d08, 0x2068, 0x6906, 0x711a, 0x0078, 0x509e,
++	0x7014, 0x2068, 0x7007, 0x0001, 0x6884, 0xa005, 0x00c0, 0x50f7,
++	0x6888, 0x698c, 0xa105, 0x0040, 0x50f7, 0x1078, 0x510e, 0x6834,
++	0xa084, 0x00ff, 0xa086, 0x001e, 0x0040, 0x5373, 0x0078, 0x513a,
++	0x5102, 0x5106, 0x0002, 0x0011, 0x0007, 0x0004, 0x000a, 0x000f,
++	0x0005, 0x0006, 0x000a, 0x0011, 0x0005, 0x0004, 0x0f7e, 0x0e7e,
++	0x0c7e, 0x077e, 0x067e, 0x6f88, 0x6e8c, 0x6804, 0x2060, 0xacf0,
++	0x0021, 0xacf8, 0x0027, 0x2009, 0x0005, 0x700c, 0x7816, 0x7008,
++	0x7812, 0x7004, 0x7806, 0x7000, 0x7802, 0x7e0e, 0x7f0a, 0x8109,
++	0x0040, 0x5130, 0xaef2, 0x0004, 0xaffa, 0x0006, 0x0078, 0x511d,
++	0x6004, 0xa065, 0x00c0, 0x5117, 0x067f, 0x077f, 0x0c7f, 0x0e7f,
++	0x0f7f, 0x007c, 0x2009, 0xa62f, 0x210c, 0x81ff, 0x00c0, 0x5155,
++	0x6838, 0xa084, 0x00ff, 0x683a, 0x1078, 0x4353, 0x00c0, 0x5149,
++	0x007c, 0x1078, 0x4b51, 0x127e, 0x2091, 0x8000, 0x1078, 0x8f7d,
++	0x1078, 0x4a73, 0x127f, 0x0078, 0x5148, 0x2001, 0x0028, 0x2009,
++	0x0000, 0x0078, 0x5149, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906,
++	0x711a, 0x7010, 0x8001, 0x7012, 0x0040, 0x516a, 0x7007, 0x0006,
++	0x0078, 0x5170, 0x7014, 0x2068, 0x7007, 0x0001, 0x7048, 0x107a,
++	0x007c, 0x7007, 0x0001, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x6848,
++	0xa084, 0x00ff, 0x20a9, 0x0001, 0xa096, 0x0001, 0x0040, 0x519a,
++	0x2009, 0x0000, 0x20a9, 0x00ff, 0xa096, 0x0002, 0x0040, 0x519a,
++	0xa005, 0x00c0, 0x51ad, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x1078,
++	0x45c4, 0x00c0, 0x51ad, 0x067e, 0x6e50, 0x1078, 0x46b3, 0x067f,
++	0x0078, 0x51ad, 0x047e, 0x2011, 0xa60c, 0x2224, 0xc484, 0xc48c,
++	0x2412, 0x047f, 0x0c7e, 0x1078, 0x45c4, 0x00c0, 0x51a9, 0x1078,
++	0x4852, 0x8108, 0x00f0, 0x51a3, 0x0c7f, 0x684c, 0xd084, 0x00c0,
++	0x51b4, 0x1078, 0x13a4, 0x007c, 0x127e, 0x2091, 0x8000, 0x1078,
++	0x4a73, 0x127f, 0x007c, 0x127e, 0x2091, 0x8000, 0x7007, 0x0001,
++	0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040, 0x51ff, 0x2061, 0xa933,
++	0x6100, 0xd184, 0x0040, 0x51df, 0x6858, 0xa084, 0x00ff, 0x00c0,
++	0x5202, 0x6000, 0xd084, 0x0040, 0x51ff, 0x6004, 0xa005, 0x00c0,
++	0x5205, 0x6003, 0x0000, 0x600b, 0x0000, 0x0078, 0x51fc, 0x2011,
++	0x0001, 0x6860, 0xa005, 0x00c0, 0x51e7, 0x2001, 0x001e, 0x8000,
++	0x6016, 0x6858, 0xa084, 0x00ff, 0x0040, 0x51ff, 0x6006, 0x6858,
++	0x8007, 0xa084, 0x00ff, 0x0040, 0x51ff, 0x600a, 0x6858, 0x8000,
++	0x00c0, 0x51fb, 0xc28d, 0x6202, 0x127f, 0x0078, 0x5453, 0x127f,
++	0x0078, 0x544b, 0x127f, 0x0078, 0x5443, 0x127f, 0x0078, 0x5447,
++	0x127e, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0xa653, 0x2004,
++	0xd0a4, 0x0040, 0x525e, 0x2061, 0xa933, 0x6000, 0xd084, 0x0040,
++	0x525e, 0x6204, 0x6308, 0xd08c, 0x00c0, 0x5250, 0x6c48, 0xa484,
++	0x0003, 0x0040, 0x5236, 0x6958, 0xa18c, 0x00ff, 0x8001, 0x00c0,
++	0x522f, 0x2100, 0xa210, 0x0048, 0x525b, 0x0078, 0x5236, 0x8001,
++	0x00c0, 0x525b, 0x2100, 0xa212, 0x0048, 0x525b, 0xa484, 0x000c,
++	0x0040, 0x5250, 0x6958, 0x810f, 0xa18c, 0x00ff, 0xa082, 0x0004,
++	0x00c0, 0x5248, 0x2100, 0xa318, 0x0048, 0x525b, 0x0078, 0x5250,
++	0xa082, 0x0004, 0x00c0, 0x525b, 0x2100, 0xa31a, 0x0048, 0x525b,
++	0x6860, 0xa005, 0x0040, 0x5256, 0x8000, 0x6016, 0x6206, 0x630a,
++	0x127f, 0x0078, 0x5453, 0x127f, 0x0078, 0x544f, 0x127f, 0x0078,
++	0x544b, 0x127e, 0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0xa933,
++	0x6300, 0xd38c, 0x00c0, 0x5271, 0x6308, 0x8318, 0x0048, 0x5274,
++	0x630a, 0x127f, 0x0078, 0x5461, 0x127f, 0x0078, 0x544f, 0x127e,
++	0x0c7e, 0x2091, 0x8000, 0x7007, 0x0001, 0x684c, 0xd0ac, 0x0040,
++	0x528b, 0x0c7e, 0x2061, 0xa933, 0x6000, 0xa084, 0xfcff, 0x6002,
++	0x0c7f, 0x0078, 0x52ba, 0x6858, 0xa005, 0x0040, 0x52d1, 0x685c,
++	0xa065, 0x0040, 0x52cd, 0x2001, 0xa62f, 0x2004, 0xa005, 0x0040,
++	0x529d, 0x1078, 0x8ec6, 0x0078, 0x52ab, 0x6013, 0x0400, 0x6037,
++	0x0000, 0x694c, 0xd1a4, 0x0040, 0x52a7, 0x6950, 0x6136, 0x2009,
++	0x0041, 0x1078, 0x775c, 0x6958, 0xa18c, 0xff00, 0xa186, 0x2000,
++	0x00c0, 0x52ba, 0x027e, 0x2009, 0x0000, 0x2011, 0xfdff, 0x1078,
++	0x5bf1, 0x027f, 0x684c, 0xd0c4, 0x0040, 0x52c9, 0x2061, 0xa933,
++	0x6000, 0xd08c, 0x00c0, 0x52c9, 0x6008, 0x8000, 0x0048, 0x52cd,
++	0x600a, 0x0c7f, 0x127f, 0x0078, 0x5453, 0x0c7f, 0x127f, 0x0078,
++	0x544b, 0x6954, 0xa186, 0x0045, 0x0040, 0x5306, 0xa186, 0x002a,
++	0x00c0, 0x52e1, 0x2001, 0xa60c, 0x200c, 0xc194, 0x2102, 0x0078,
++	0x52ba, 0xa186, 0x0020, 0x0040, 0x52fa, 0xa186, 0x0029, 0x0040,
++	0x52ed, 0xa186, 0x002d, 0x00c0, 0x52cd, 0x6944, 0xa18c, 0xff00,
++	0x810f, 0x1078, 0x45c4, 0x00c0, 0x52ba, 0x6000, 0xc0e4, 0x6002,
++	0x0078, 0x52ba, 0x685c, 0xa065, 0x0040, 0x52cd, 0x6007, 0x0024,
++	0x2001, 0xa8a3, 0x2004, 0x6016, 0x0078, 0x52ba, 0x685c, 0xa065,
++	0x0040, 0x52cd, 0x0e7e, 0x6860, 0xa075, 0x2001, 0xa62f, 0x2004,
++	0xa005, 0x0040, 0x531e, 0x1078, 0x8ec6, 0x8eff, 0x0040, 0x531b,
++	0x2e60, 0x1078, 0x8ec6, 0x0e7f, 0x0078, 0x52ba, 0x6024, 0xc0dc,
++	0xc0d5, 0x6026, 0x2e60, 0x6007, 0x003a, 0x6870, 0xa005, 0x0040,
++	0x532f, 0x6007, 0x003b, 0x6874, 0x602a, 0x6878, 0x6012, 0x6003,
++	0x0001, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0e7f, 0x0078, 0x52ba,
++	0x2061, 0xa933, 0x6000, 0xd084, 0x0040, 0x5352, 0xd08c, 0x00c0,
++	0x5461, 0x2091, 0x8000, 0x6204, 0x8210, 0x0048, 0x534c, 0x6206,
++	0x2091, 0x8001, 0x0078, 0x5461, 0x2091, 0x8001, 0x6853, 0x0016,
++	0x0078, 0x545a, 0x6853, 0x0007, 0x0078, 0x545a, 0x6834, 0x8007,
++	0xa084, 0x00ff, 0x00c0, 0x5360, 0x1078, 0x502d, 0x0078, 0x5372,
++	0x2030, 0x8001, 0x00c0, 0x536a, 0x7007, 0x0001, 0x1078, 0x5373,
++	0x0078, 0x5372, 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a,
++	0x704b, 0x5373, 0x007c, 0x0e7e, 0x127e, 0x2091, 0x8000, 0xa03e,
++	0x2009, 0xa62f, 0x210c, 0x81ff, 0x00c0, 0x53ff, 0x2009, 0xa60c,
++	0x210c, 0xd194, 0x00c0, 0x5431, 0x6848, 0x2070, 0xae82, 0xad00,
++	0x0048, 0x53ef, 0x2001, 0xa616, 0x2004, 0xae02, 0x00c8, 0x53ef,
++	0x2061, 0xa933, 0x6100, 0xa184, 0x0301, 0xa086, 0x0001, 0x00c0,
++	0x53d2, 0x711c, 0xa186, 0x0006, 0x00c0, 0x53da, 0x7018, 0xa005,
++	0x0040, 0x53ff, 0x2004, 0xd0e4, 0x00c0, 0x542b, 0x7024, 0xd0dc,
++	0x00c0, 0x5435, 0x6853, 0x0000, 0x6803, 0x0000, 0x2d08, 0x7010,
++	0xa005, 0x00c0, 0x53be, 0x7112, 0x684c, 0xd0f4, 0x00c0, 0x5439,
++	0x2e60, 0x1078, 0x5b27, 0x127f, 0x0e7f, 0x007c, 0x2068, 0x6800,
++	0xa005, 0x00c0, 0x53be, 0x6902, 0x2168, 0x684c, 0xd0f4, 0x00c0,
++	0x5439, 0x127f, 0x0e7f, 0x007c, 0x127f, 0x0e7f, 0x6853, 0x0006,
++	0x0078, 0x545a, 0xd184, 0x0040, 0x53cc, 0xd1c4, 0x00c0, 0x53f3,
++	0x0078, 0x53f7, 0x6944, 0xa18c, 0xff00, 0x810f, 0x1078, 0x45c4,
++	0x00c0, 0x542b, 0x6000, 0xd0e4, 0x00c0, 0x542b, 0x711c, 0xa186,
++	0x0007, 0x00c0, 0x53ef, 0x6853, 0x0002, 0x0078, 0x542d, 0x6853,
++	0x0008, 0x0078, 0x542d, 0x6853, 0x000e, 0x0078, 0x542d, 0x6853,
++	0x0017, 0x0078, 0x542d, 0x6853, 0x0035, 0x0078, 0x542d, 0x2001,
++	0xa672, 0x2004, 0xd0fc, 0x0040, 0x5427, 0x6848, 0x2070, 0xae82,
++	0xad00, 0x0048, 0x5427, 0x6058, 0xae02, 0x00c8, 0x5427, 0x711c,
++	0xa186, 0x0006, 0x00c0, 0x5427, 0x7018, 0xa005, 0x0040, 0x5427,
++	0x2004, 0xd0bc, 0x0040, 0x5427, 0x2039, 0x0001, 0x7000, 0xa086,
++	0x0007, 0x00c0, 0x537e, 0x7003, 0x0002, 0x0078, 0x537e, 0x6853,
++	0x0028, 0x0078, 0x542d, 0x6853, 0x0029, 0x127f, 0x0e7f, 0x0078,
++	0x545a, 0x6853, 0x002a, 0x0078, 0x542d, 0x6853, 0x0045, 0x0078,
++	0x542d, 0x2e60, 0x2019, 0x0002, 0x6017, 0x0014, 0x1078, 0x9dc7,
++	0x127f, 0x0e7f, 0x007c, 0x2009, 0x003e, 0x0078, 0x5455, 0x2009,
++	0x0004, 0x0078, 0x5455, 0x2009, 0x0006, 0x0078, 0x5455, 0x2009,
++	0x0016, 0x0078, 0x5455, 0x2009, 0x0001, 0x6854, 0xa084, 0xff00,
++	0xa105, 0x6856, 0x2091, 0x8000, 0x1078, 0x4a73, 0x2091, 0x8001,
++	0x007c, 0x1078, 0x13a4, 0x007c, 0x702c, 0x7130, 0x8108, 0xa102,
++	0x0048, 0x5471, 0xa00e, 0x7034, 0x7072, 0x7038, 0x7076, 0x0078,
++	0x547d, 0x7070, 0xa080, 0x0040, 0x7072, 0x00c8, 0x547d, 0x7074,
++	0xa081, 0x0000, 0x7076, 0xa085, 0x0001, 0x7932, 0x7132, 0x007c,
++	0x0d7e, 0x1078, 0x5b1e, 0x0d7f, 0x007c, 0x0d7e, 0x2011, 0x0004,
++	0x2204, 0xa085, 0x8002, 0x2012, 0x0d7f, 0x007c, 0x20e1, 0x0002,
++	0x3d08, 0x20e1, 0x2000, 0x3d00, 0xa084, 0x7000, 0x0040, 0x549c,
++	0xa086, 0x1000, 0x00c0, 0x54d3, 0x20e1, 0x0000, 0x3d00, 0xa094,
++	0xff00, 0x8217, 0xa084, 0xf000, 0xa086, 0x3000, 0x00c0, 0x54b7,
++	0xa184, 0xff00, 0x8007, 0xa086, 0x0008, 0x00c0, 0x54d3, 0x1078,
++	0x29bb, 0x00c0, 0x54d3, 0x1078, 0x56b2, 0x0078, 0x54ce, 0x20e1,
++	0x0004, 0x3d60, 0xd1bc, 0x00c0, 0x54be, 0x3e60, 0xac84, 0x000f,
++	0x00c0, 0x54d3, 0xac82, 0xad00, 0x0048, 0x54d3, 0x6858, 0xac02,
++	0x00c8, 0x54d3, 0x2009, 0x0047, 0x1078, 0x775c, 0x7a1c, 0xd284,
++	0x00c0, 0x548e, 0x007c, 0xa016, 0x1078, 0x15fa, 0x0078, 0x54ce,
++	0x0078, 0x54d3, 0x781c, 0xd08c, 0x0040, 0x5502, 0x157e, 0x137e,
++	0x147e, 0x20e1, 0x3000, 0x3d20, 0x3e28, 0xa584, 0x0076, 0x00c0,
++	0x5518, 0xa484, 0x7000, 0xa086, 0x1000, 0x00c0, 0x5507, 0x1078,
++	0x554e, 0x0040, 0x5518, 0x20e1, 0x3000, 0x7828, 0x7828, 0x1078,
++	0x556c, 0x147f, 0x137f, 0x157f, 0x2009, 0xa8b9, 0x2104, 0xa005,
++	0x00c0, 0x5503, 0x007c, 0x1078, 0x62d1, 0x0078, 0x5502, 0xa484,
++	0x7000, 0x00c0, 0x5518, 0x1078, 0x554e, 0x0040, 0x552c, 0x7000,
++	0xa084, 0xff00, 0xa086, 0x8100, 0x0040, 0x54f3, 0x0078, 0x552c,
++	0x1078, 0xa54f, 0xd5a4, 0x0040, 0x5528, 0x047e, 0x1078, 0x1b22,
++	0x047f, 0x20e1, 0x9010, 0x2001, 0x0138, 0x2202, 0x0078, 0x5530,
++	0x1078, 0x554e, 0x6883, 0x0000, 0x20e1, 0x3000, 0x7828, 0x7828,
++	0x1078, 0x5537, 0x147f, 0x137f, 0x157f, 0x0078, 0x5502, 0x2001,
++	0xa60e, 0x2004, 0xd08c, 0x0040, 0x554d, 0x2001, 0xa600, 0x2004,
++	0xa086, 0x0003, 0x00c0, 0x554d, 0x027e, 0x037e, 0x2011, 0x8048,
++	0x2518, 0x1078, 0x361b, 0x037f, 0x027f, 0x007c, 0xa484, 0x01ff,
++	0x6882, 0xa005, 0x0040, 0x5560, 0xa080, 0x001f, 0xa084, 0x03f8,
++	0x80ac, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0x007c,
++	0x20a9, 0x000c, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5,
++	0xa085, 0x0001, 0x0078, 0x555f, 0x7000, 0xa084, 0xff00, 0xa08c,
++	0xf000, 0x8007, 0xa196, 0x0000, 0x00c0, 0x5579, 0x0078, 0x57ba,
++	0x007c, 0xa196, 0x2000, 0x00c0, 0x558a, 0x6900, 0xa18e, 0x0001,
++	0x00c0, 0x5586, 0x1078, 0x3aec, 0x0078, 0x5578, 0x1078, 0x5592,
++	0x0078, 0x5578, 0xa196, 0x8000, 0x00c0, 0x5578, 0x1078, 0x5871,
++	0x0078, 0x5578, 0x0c7e, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa196,
++	0x0001, 0x0040, 0x559f, 0xa196, 0x0023, 0x00c0, 0x56aa, 0xa08e,
++	0x0023, 0x00c0, 0x55d4, 0x1078, 0x591d, 0x0040, 0x56aa, 0x7124,
++	0x610a, 0x7030, 0xa08e, 0x0200, 0x00c0, 0x55b8, 0x7034, 0xa005,
++	0x00c0, 0x56aa, 0x2009, 0x0015, 0x1078, 0x775c, 0x0078, 0x56aa,
++	0xa08e, 0x0214, 0x0040, 0x55c0, 0xa08e, 0x0210, 0x00c0, 0x55c6,
++	0x2009, 0x0015, 0x1078, 0x775c, 0x0078, 0x56aa, 0xa08e, 0x0100,
++	0x00c0, 0x56aa, 0x7034, 0xa005, 0x00c0, 0x56aa, 0x2009, 0x0016,
++	0x1078, 0x775c, 0x0078, 0x56aa, 0xa08e, 0x0022, 0x00c0, 0x56aa,
++	0x7030, 0xa08e, 0x0300, 0x00c0, 0x55e5, 0x7034, 0xa005, 0x00c0,
++	0x56aa, 0x2009, 0x0017, 0x0078, 0x5676, 0xa08e, 0x0500, 0x00c0,
++	0x55f1, 0x7034, 0xa005, 0x00c0, 0x56aa, 0x2009, 0x0018, 0x0078,
++	0x5676, 0xa08e, 0x2010, 0x00c0, 0x55f9, 0x2009, 0x0019, 0x0078,
++	0x5676, 0xa08e, 0x2110, 0x00c0, 0x5601, 0x2009, 0x001a, 0x0078,
++	0x5676, 0xa08e, 0x5200, 0x00c0, 0x560d, 0x7034, 0xa005, 0x00c0,
++	0x56aa, 0x2009, 0x001b, 0x0078, 0x5676, 0xa08e, 0x5000, 0x00c0,
++	0x5619, 0x7034, 0xa005, 0x00c0, 0x56aa, 0x2009, 0x001c, 0x0078,
++	0x5676, 0xa08e, 0x1300, 0x00c0, 0x5621, 0x2009, 0x0034, 0x0078,
++	0x5676, 0xa08e, 0x1200, 0x00c0, 0x562d, 0x7034, 0xa005, 0x00c0,
++	0x56aa, 0x2009, 0x0024, 0x0078, 0x5676, 0xa08c, 0xff00, 0xa18e,
++	0x2400, 0x00c0, 0x5637, 0x2009, 0x002d, 0x0078, 0x5676, 0xa08c,
++	0xff00, 0xa18e, 0x5300, 0x00c0, 0x5641, 0x2009, 0x002a, 0x0078,
++	0x5676, 0xa08e, 0x0f00, 0x00c0, 0x5649, 0x2009, 0x0020, 0x0078,
++	0x5676, 0xa08e, 0x5300, 0x00c0, 0x564f, 0x0078, 0x566c, 0xa08e,
++	0x6104, 0x00c0, 0x566c, 0x2011, 0xab8d, 0x8208, 0x2204, 0xa082,
++	0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011, 0x8015, 0x211c, 0x8108,
++	0x047e, 0x2124, 0x1078, 0x361b, 0x047f, 0x8108, 0x00f0, 0x565c,
++	0x2009, 0x0023, 0x0078, 0x5676, 0xa08e, 0x6000, 0x00c0, 0x5674,
++	0x2009, 0x003f, 0x0078, 0x5676, 0x2009, 0x001d, 0x017e, 0x2011,
++	0xab83, 0x2204, 0x8211, 0x220c, 0x1078, 0x254d, 0x00c0, 0x56ac,
++	0x1078, 0x455c, 0x00c0, 0x56ac, 0x6612, 0x6516, 0x86ff, 0x0040,
++	0x569c, 0x017f, 0x017e, 0xa186, 0x0017, 0x00c0, 0x569c, 0x686c,
++	0xa606, 0x00c0, 0x569c, 0x6870, 0xa506, 0xa084, 0xff00, 0x00c0,
++	0x569c, 0x6000, 0xc0f5, 0x6002, 0x0c7e, 0x1078, 0x76c7, 0x0040,
++	0x56af, 0x017f, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0x017f,
++	0x1078, 0x775c, 0x0c7f, 0x007c, 0x017f, 0x0078, 0x56aa, 0x0c7f,
++	0x0078, 0x56ac, 0x0c7e, 0x1078, 0x570f, 0x00c0, 0x570d, 0xa28e,
++	0x0033, 0x00c0, 0x56de, 0x1078, 0x591d, 0x0040, 0x570d, 0x7124,
++	0x610a, 0x7030, 0xa08e, 0x0200, 0x00c0, 0x56d0, 0x7034, 0xa005,
++	0x00c0, 0x570d, 0x2009, 0x0015, 0x1078, 0x775c, 0x0078, 0x570d,
++	0xa08e, 0x0100, 0x00c0, 0x570d, 0x7034, 0xa005, 0x00c0, 0x570d,
++	0x2009, 0x0016, 0x1078, 0x775c, 0x0078, 0x570d, 0xa28e, 0x0032,
++	0x00c0, 0x570d, 0x7030, 0xa08e, 0x1400, 0x00c0, 0x570d, 0x2009,
++	0x0038, 0x017e, 0x2011, 0xab83, 0x2204, 0x8211, 0x220c, 0x1078,
++	0x254d, 0x00c0, 0x570c, 0x1078, 0x455c, 0x00c0, 0x570c, 0x6612,
++	0x6516, 0x0c7e, 0x1078, 0x76c7, 0x0040, 0x570b, 0x017f, 0x611a,
++	0x601f, 0x0004, 0x7120, 0x610a, 0x017f, 0x1078, 0x775c, 0x1078,
++	0x62d1, 0x0078, 0x570d, 0x0c7f, 0x017f, 0x0c7f, 0x007c, 0x0f7e,
++	0x0d7e, 0x027e, 0x017e, 0x137e, 0x147e, 0x157e, 0x3c00, 0x007e,
++	0x2079, 0x0030, 0x2069, 0x0200, 0x1078, 0x1c6a, 0x00c0, 0x5750,
++	0x1078, 0x1b40, 0x0040, 0x575d, 0x7908, 0xa18c, 0x1fff, 0xa182,
++	0x0011, 0x00c8, 0x575a, 0x20a9, 0x000c, 0x20e1, 0x0000, 0x2ea0,
++	0x2099, 0x020a, 0x53a5, 0x20e1, 0x2000, 0x2001, 0x020a, 0x2004,
++	0x7a0c, 0x7808, 0xa080, 0x0007, 0xa084, 0x1ff8, 0xa08a, 0x0140,
++	0x10c8, 0x1332, 0x80ac, 0x20e1, 0x6000, 0x2099, 0x020a, 0x53a5,
++	0x20e1, 0x7000, 0x6828, 0x6828, 0x7803, 0x0004, 0xa294, 0x0070,
++	0x007f, 0x20e0, 0x157f, 0x147f, 0x137f, 0x017f, 0x027f, 0x0d7f,
++	0x0f7f, 0x007c, 0xa016, 0x1078, 0x15fa, 0xa085, 0x0001, 0x0078,
++	0x5750, 0x047e, 0x0e7e, 0x0d7e, 0x2028, 0x2130, 0xa696, 0x00ff,
++	0x00c0, 0x5782, 0xa596, 0xfffd, 0x00c0, 0x5772, 0x2009, 0x007f,
++	0x0078, 0x57b5, 0xa596, 0xfffe, 0x00c0, 0x577a, 0x2009, 0x007e,
++	0x0078, 0x57b5, 0xa596, 0xfffc, 0x00c0, 0x5782, 0x2009, 0x0080,
++	0x0078, 0x57b5, 0x2011, 0x0000, 0x2021, 0x0081, 0x20a9, 0x007e,
++	0x2071, 0xa7b6, 0x2e1c, 0x83ff, 0x00c0, 0x5794, 0x82ff, 0x00c0,
++	0x57a9, 0x2410, 0x0078, 0x57a9, 0x2368, 0x6f10, 0x007e, 0x2100,
++	0xa706, 0x007f, 0x6b14, 0x00c0, 0x57a3, 0xa346, 0x00c0, 0x57a3,
++	0x2408, 0x0078, 0x57b5, 0x87ff, 0x00c0, 0x57a9, 0x83ff, 0x0040,
++	0x578e, 0x8420, 0x8e70, 0x00f0, 0x578a, 0x82ff, 0x00c0, 0x57b4,
++	0xa085, 0x0001, 0x0078, 0x57b6, 0x2208, 0xa006, 0x0d7f, 0x0e7f,
++	0x047f, 0x007c, 0xa084, 0x0007, 0x0079, 0x57bf, 0x007c, 0x57c7,
++	0x57c7, 0x57c7, 0x5933, 0x57c7, 0x57c8, 0x57e1, 0x5858, 0x007c,
++	0x7110, 0xd1bc, 0x0040, 0x57e0, 0x7120, 0x2160, 0xac8c, 0x000f,
++	0x00c0, 0x57e0, 0xac8a, 0xad00, 0x0048, 0x57e0, 0x6858, 0xac02,
++	0x00c8, 0x57e0, 0x7124, 0x610a, 0x2009, 0x0046, 0x1078, 0x775c,
++	0x007c, 0x0c7e, 0xa484, 0x01ff, 0x0040, 0x5833, 0x7110, 0xd1bc,
++	0x00c0, 0x5833, 0x2011, 0xab83, 0x2204, 0x8211, 0x220c, 0x1078,
++	0x254d, 0x00c0, 0x5833, 0x1078, 0x455c, 0x00c0, 0x5833, 0x6612,
++	0x6516, 0x6000, 0xd0ec, 0x00c0, 0x5833, 0x6204, 0xa294, 0xff00,
++	0x8217, 0xa286, 0x0006, 0x00c0, 0x5818, 0x0c7e, 0x1078, 0x76c7,
++	0x017f, 0x0040, 0x5835, 0x611a, 0x601f, 0x0006, 0x7120, 0x610a,
++	0x7130, 0x6122, 0x2009, 0x0044, 0x1078, 0x775c, 0x0078, 0x5833,
++	0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x5833, 0x611a, 0x601f,
++	0x0004, 0x7120, 0x610a, 0xa286, 0x0004, 0x00c0, 0x582b, 0x6007,
++	0x0005, 0x0078, 0x582d, 0x6007, 0x0001, 0x6003, 0x0001, 0x1078,
++	0x5dd7, 0x1078, 0x62d1, 0x0c7f, 0x007c, 0x2001, 0xa60d, 0x2004,
++	0xd0ec, 0x0040, 0x583f, 0x2011, 0x8049, 0x1078, 0x361b, 0x0c7e,
++	0x1078, 0x9187, 0x017f, 0x0040, 0x5833, 0x611a, 0x601f, 0x0006,
++	0x7120, 0x610a, 0x7130, 0x6122, 0x6013, 0x0300, 0x6003, 0x0001,
++	0x6007, 0x0041, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078, 0x5833,
++	0x7110, 0xd1bc, 0x0040, 0x5870, 0x7020, 0x2060, 0xac84, 0x000f,
++	0x00c0, 0x5870, 0xac82, 0xad00, 0x0048, 0x5870, 0x6858, 0xac02,
++	0x00c8, 0x5870, 0x7124, 0x610a, 0x2009, 0x0045, 0x1078, 0x775c,
++	0x007c, 0x007e, 0x1078, 0x29bb, 0x007f, 0x00c0, 0x5887, 0x7110,
++	0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000, 0x00c0, 0x5887, 0xa084,
++	0x000f, 0xa08a, 0x0006, 0x00c8, 0x5887, 0x1079, 0x5888, 0x007c,
++	0x588e, 0x588f, 0x588e, 0x588e, 0x58ff, 0x590e, 0x007c, 0x7110,
++	0xd1bc, 0x0040, 0x5897, 0x702c, 0xd084, 0x0040, 0x58fe, 0x700c,
++	0x7108, 0x1078, 0x254d, 0x00c0, 0x58fe, 0x1078, 0x455c, 0x00c0,
++	0x58fe, 0x6612, 0x6516, 0x6204, 0x7110, 0xd1bc, 0x0040, 0x58c9,
++	0xa28c, 0x00ff, 0xa186, 0x0004, 0x0040, 0x58b2, 0xa186, 0x0006,
++	0x00c0, 0x58ef, 0x0c7e, 0x1078, 0x591d, 0x0c7f, 0x0040, 0x58fe,
++	0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x58fe, 0x611a, 0x601f,
++	0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x1078, 0x775c, 0x0078,
++	0x58fe, 0xa28c, 0x00ff, 0xa186, 0x0006, 0x0040, 0x58de, 0xa186,
++	0x0004, 0x0040, 0x58de, 0xa294, 0xff00, 0x8217, 0xa286, 0x0004,
++	0x0040, 0x58de, 0xa286, 0x0006, 0x00c0, 0x58ef, 0x0c7e, 0x1078,
++	0x76c7, 0x017f, 0x0040, 0x58fe, 0x611a, 0x601f, 0x0005, 0x7120,
++	0x610a, 0x2009, 0x0088, 0x1078, 0x775c, 0x0078, 0x58fe, 0x0c7e,
++	0x1078, 0x76c7, 0x017f, 0x0040, 0x58fe, 0x611a, 0x601f, 0x0004,
++	0x7120, 0x610a, 0x2009, 0x0001, 0x1078, 0x775c, 0x007c, 0x7110,
++	0xd1bc, 0x0040, 0x590d, 0x1078, 0x591d, 0x0040, 0x590d, 0x7124,
++	0x610a, 0x2009, 0x0089, 0x1078, 0x775c, 0x007c, 0x7110, 0xd1bc,
++	0x0040, 0x591c, 0x1078, 0x591d, 0x0040, 0x591c, 0x7124, 0x610a,
++	0x2009, 0x008a, 0x1078, 0x775c, 0x007c, 0x7020, 0x2060, 0xac84,
++	0x000f, 0x00c0, 0x5930, 0xac82, 0xad00, 0x0048, 0x5930, 0x2001,
++	0xa616, 0x2004, 0xac02, 0x00c8, 0x5930, 0xa085, 0x0001, 0x007c,
++	0xa006, 0x0078, 0x592f, 0x7110, 0xd1bc, 0x00c0, 0x5949, 0x7024,
++	0x2060, 0xac84, 0x000f, 0x00c0, 0x5949, 0xac82, 0xad00, 0x0048,
++	0x5949, 0x6858, 0xac02, 0x00c8, 0x5949, 0x2009, 0x0051, 0x1078,
++	0x775c, 0x007c, 0x2071, 0xa8c4, 0x7003, 0x0003, 0x700f, 0x0361,
++	0xa006, 0x701a, 0x7012, 0x7017, 0xad00, 0x7007, 0x0000, 0x7026,
++	0x702b, 0x6e1c, 0x7032, 0x7037, 0x6e70, 0x703b, 0x0002, 0x703f,
++	0x0000, 0x7043, 0xffff, 0x7047, 0xffff, 0x007c, 0x2071, 0xa8c4,
++	0x00e0, 0x5a32, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x00c0,
++	0x59de, 0x700f, 0x0361, 0x7007, 0x0001, 0x127e, 0x2091, 0x8000,
++	0x7138, 0x8109, 0x713a, 0x00c0, 0x59dc, 0x703b, 0x0002, 0x2009,
++	0x0100, 0x2104, 0xa082, 0x0003, 0x00c8, 0x59dc, 0x703c, 0xa086,
++	0x0001, 0x00c0, 0x59b9, 0x0d7e, 0x2069, 0x0140, 0x6804, 0xa084,
++	0x4000, 0x0040, 0x5997, 0x6803, 0x1000, 0x0078, 0x599e, 0x6804,
++	0xa084, 0x1000, 0x0040, 0x599e, 0x6803, 0x0100, 0x6803, 0x0000,
++	0x703f, 0x0000, 0x2069, 0xa8b1, 0x6804, 0xa082, 0x0006, 0x00c0,
++	0x59ab, 0x6807, 0x0000, 0x6830, 0xa082, 0x0003, 0x00c0, 0x59b2,
++	0x6833, 0x0000, 0x1078, 0x62d1, 0x1078, 0x639b, 0x0d7f, 0x0078,
++	0x59dc, 0x0d7e, 0x2069, 0xa600, 0x6948, 0x6864, 0xa102, 0x00c8,
++	0x59db, 0x2069, 0xa8b1, 0x6804, 0xa086, 0x0000, 0x00c0, 0x59db,
++	0x6830, 0xa086, 0x0000, 0x00c0, 0x59db, 0x703f, 0x0001, 0x6807,
++	0x0006, 0x6833, 0x0003, 0x2069, 0x0100, 0x6830, 0x689e, 0x2069,
++	0x0140, 0x6803, 0x0600, 0x0d7f, 0x0078, 0x59e1, 0x127e, 0x2091,
++	0x8000, 0x7024, 0xa00d, 0x0040, 0x59f9, 0x7020, 0x8001, 0x7022,
++	0x00c0, 0x59f9, 0x7023, 0x0009, 0x8109, 0x7126, 0xa186, 0x03e8,
++	0x00c0, 0x59f4, 0x7028, 0x107a, 0x81ff, 0x00c0, 0x59f9, 0x7028,
++	0x107a, 0x7030, 0xa00d, 0x0040, 0x5a10, 0x702c, 0x8001, 0x702e,
++	0x00c0, 0x5a10, 0x702f, 0x0009, 0x8109, 0x7132, 0x0040, 0x5a0e,
++	0xa184, 0x007f, 0x1040, 0x6ea2, 0x0078, 0x5a10, 0x7034, 0x107a,
++	0x7040, 0xa005, 0x0040, 0x5a18, 0x0050, 0x5a18, 0x8001, 0x7042,
++	0x7044, 0xa005, 0x0040, 0x5a20, 0x0050, 0x5a20, 0x8001, 0x7046,
++	0x7018, 0xa00d, 0x0040, 0x5a31, 0x7008, 0x8001, 0x700a, 0x00c0,
++	0x5a31, 0x700b, 0x0009, 0x8109, 0x711a, 0x00c0, 0x5a31, 0x701c,
++	0x107a, 0x127f, 0x7004, 0x0079, 0x5a35, 0x5a5c, 0x5a5d, 0x5a79,
++	0x0e7e, 0x2071, 0xa8c4, 0x7018, 0xa005, 0x00c0, 0x5a43, 0x711a,
++	0x721e, 0x700b, 0x0009, 0x0e7f, 0x007c, 0x0e7e, 0x007e, 0x2071,
++	0xa8c4, 0x701c, 0xa206, 0x00c0, 0x5a4f, 0x701a, 0x701e, 0x007f,
++	0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa8c4, 0x6088, 0xa102, 0x0048,
++	0x5a5a, 0x618a, 0x0e7f, 0x007c, 0x007c, 0x7110, 0x1078, 0x45c4,
++	0x00c0, 0x5a6f, 0x6088, 0x8001, 0x0048, 0x5a6f, 0x608a, 0x00c0,
++	0x5a6f, 0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x8108,
++	0xa182, 0x00ff, 0x0048, 0x5a77, 0xa00e, 0x7007, 0x0002, 0x7112,
++	0x007c, 0x7014, 0x2060, 0x127e, 0x2091, 0x8000, 0x603c, 0xa005,
++	0x0040, 0x5a88, 0x8001, 0x603e, 0x00c0, 0x5a88, 0x1078, 0x8f9c,
++	0x6014, 0xa005, 0x0040, 0x5ab2, 0x8001, 0x6016, 0x00c0, 0x5ab2,
++	0x611c, 0xa186, 0x0003, 0x0040, 0x5a99, 0xa186, 0x0006, 0x00c0,
++	0x5ab0, 0x6010, 0x2068, 0x6854, 0xa08a, 0x199a, 0x0048, 0x5ab0,
++	0xa082, 0x1999, 0x6856, 0xa08a, 0x199a, 0x0048, 0x5aa9, 0x2001,
++	0x1999, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x0078, 0x5ab2,
++	0x1078, 0x8abe, 0x127f, 0xac88, 0x0010, 0x7116, 0x2001, 0xcd00,
++	0xa102, 0x0048, 0x5abf, 0x7017, 0xad00, 0x7007, 0x0000, 0x007c,
++	0x0e7e, 0x2071, 0xa8c4, 0x7027, 0x07d0, 0x7023, 0x0009, 0x703b,
++	0x0002, 0x0e7f, 0x007c, 0x2001, 0xa8cd, 0x2003, 0x0000, 0x007c,
++	0x0e7e, 0x2071, 0xa8c4, 0x7132, 0x702f, 0x0009, 0x0e7f, 0x007c,
++	0x2011, 0xa8d0, 0x2013, 0x0000, 0x007c, 0x0e7e, 0x2071, 0xa8c4,
++	0x711a, 0x721e, 0x700b, 0x0009, 0x0e7f, 0x007c, 0x027e, 0x0e7e,
++	0x0f7e, 0x2079, 0xa600, 0x7a34, 0xd294, 0x0040, 0x5b15, 0x2071,
++	0xa8ac, 0x2e14, 0xa0fe, 0x0000, 0x0040, 0x5b02, 0xa0fe, 0x0001,
++	0x0040, 0x5b06, 0xa0fe, 0x0002, 0x00c0, 0x5b11, 0xa292, 0x0085,
++	0x0078, 0x5b08, 0xa292, 0x0005, 0x0078, 0x5b08, 0xa292, 0x0002,
++	0x2272, 0x0040, 0x5b0d, 0x00c8, 0x5b15, 0x2011, 0x8037, 0x1078,
++	0x361b, 0x2011, 0xa8ab, 0x2204, 0x2072, 0x0f7f, 0x0e7f, 0x027f,
++	0x007c, 0x0c7e, 0x2061, 0xa933, 0x0c7f, 0x007c, 0xa184, 0x000f,
++	0x8003, 0x8003, 0x8003, 0xa080, 0xa933, 0x2060, 0x007c, 0x6854,
++	0xa08a, 0x199a, 0x0048, 0x5b2e, 0x2001, 0x1999, 0xa005, 0x00c0,
++	0x5b3d, 0x0c7e, 0x2061, 0xa933, 0x6014, 0x0c7f, 0xa005, 0x00c0,
++	0x5b42, 0x2001, 0x001e, 0x0078, 0x5b42, 0xa08e, 0xffff, 0x00c0,
++	0x5b42, 0xa006, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x684c,
++	0xa08c, 0x00c0, 0xa18e, 0x00c0, 0x0040, 0x5b9e, 0xd0b4, 0x00c0,
++	0x5b59, 0xd0bc, 0x00c0, 0x5b8b, 0x2009, 0x0006, 0x1078, 0x5bc3,
++	0x007c, 0xd0fc, 0x0040, 0x5b64, 0xa084, 0x0003, 0x0040, 0x5b64,
++	0xa086, 0x0003, 0x00c0, 0x5bbc, 0x6024, 0xd0d4, 0x0040, 0x5b6e,
++	0xc0d4, 0x6026, 0x6860, 0x602a, 0x685c, 0x602e, 0x2009, 0xa674,
++	0x2104, 0xd084, 0x0040, 0x5b83, 0x6118, 0xa188, 0x0027, 0x2104,
++	0xd08c, 0x00c0, 0x5b83, 0x87ff, 0x00c0, 0x5b82, 0x2009, 0x0042,
++	0x1078, 0x775c, 0x007c, 0x87ff, 0x00c0, 0x5b8a, 0x2009, 0x0043,
++	0x1078, 0x775c, 0x007c, 0xd0fc, 0x0040, 0x5b96, 0xa084, 0x0003,
++	0x0040, 0x5b96, 0xa086, 0x0003, 0x00c0, 0x5bbc, 0x87ff, 0x00c0,
++	0x5b9d, 0x2009, 0x0042, 0x1078, 0x775c, 0x007c, 0xd0fc, 0x0040,
++	0x5baf, 0xa084, 0x0003, 0xa08e, 0x0002, 0x0040, 0x5bb3, 0x87ff,
++	0x00c0, 0x5bae, 0x2009, 0x0041, 0x1078, 0x775c, 0x007c, 0x1078,
++	0x5bc1, 0x0078, 0x5bae, 0x87ff, 0x00c0, 0x5bae, 0x2009, 0x0043,
++	0x1078, 0x775c, 0x0078, 0x5bae, 0x2009, 0x0004, 0x1078, 0x5bc3,
++	0x007c, 0x2009, 0x0001, 0x0d7e, 0x6010, 0xa0ec, 0xf000, 0x0040,
++	0x5bef, 0x2068, 0x6952, 0x6800, 0x6012, 0xa186, 0x0001, 0x00c0,
++	0x5be5, 0x694c, 0xa18c, 0x8100, 0xa18e, 0x8100, 0x00c0, 0x5be5,
++	0x0c7e, 0x2061, 0xa933, 0x6200, 0xd28c, 0x00c0, 0x5be4, 0x6204,
++	0x8210, 0x0048, 0x5be4, 0x6206, 0x0c7f, 0x1078, 0x4a73, 0x6010,
++	0xa06d, 0x077e, 0x2039, 0x0000, 0x10c0, 0x5b27, 0x077f, 0x0d7f,
++	0x007c, 0x157e, 0x0c7e, 0x2061, 0xa933, 0x6000, 0x81ff, 0x0040,
++	0x5bfc, 0xa205, 0x0078, 0x5bfd, 0xa204, 0x6002, 0x0c7f, 0x157f,
++	0x007c, 0x6800, 0xd08c, 0x00c0, 0x5c0d, 0x6808, 0xa005, 0x0040,
++	0x5c0d, 0x8001, 0x680a, 0xa085, 0x0001, 0x007c, 0x20a9, 0x0010,
++	0xa006, 0x8004, 0x8086, 0x818e, 0x00c8, 0x5c17, 0xa200, 0x00f0,
++	0x5c12, 0x8086, 0x818e, 0x007c, 0x157e, 0x20a9, 0x0010, 0xa005,
++	0x0040, 0x5c3d, 0xa11a, 0x00c8, 0x5c3d, 0x8213, 0x818d, 0x0048,
++	0x5c30, 0xa11a, 0x00c8, 0x5c31, 0x00f0, 0x5c25, 0x0078, 0x5c35,
++	0xa11a, 0x2308, 0x8210, 0x00f0, 0x5c25, 0x007e, 0x3200, 0xa084,
++	0xf7ff, 0x2080, 0x007f, 0x157f, 0x007c, 0x007e, 0x3200, 0xa085,
++	0x0800, 0x0078, 0x5c39, 0x127e, 0x2091, 0x2200, 0x2079, 0xa8b1,
++	0x127f, 0x0d7e, 0x2069, 0xa8b1, 0x6803, 0x0005, 0x2069, 0x0004,
++	0x2d04, 0xa085, 0x8001, 0x206a, 0x0d7f, 0x007c, 0x0c7e, 0x6027,
++	0x0001, 0x7804, 0xa084, 0x0007, 0x0079, 0x5c5e, 0x5c68, 0x5c8d,
++	0x5ce8, 0x5c6e, 0x5c8d, 0x5c68, 0x5c66, 0x5c66, 0x1078, 0x1332,
++	0x1078, 0x5acb, 0x1078, 0x62d1, 0x0c7f, 0x007c, 0x62c0, 0x82ff,
++	0x00c0, 0x5c74, 0x0c7f, 0x007c, 0x2011, 0x41dc, 0x1078, 0x5a45,
++	0x7828, 0xa092, 0x00c8, 0x00c8, 0x5c83, 0x8000, 0x782a, 0x1078,
++	0x421b, 0x0078, 0x5c72, 0x1078, 0x41dc, 0x7807, 0x0003, 0x7827,
++	0x0000, 0x782b, 0x0000, 0x0078, 0x5c72, 0x1078, 0x5acb, 0x3c00,
++	0x007e, 0x2011, 0x0209, 0x20e1, 0x4000, 0x2214, 0x007f, 0x20e0,
++	0x82ff, 0x0040, 0x5cab, 0x62c0, 0x82ff, 0x00c0, 0x5cab, 0x782b,
++	0x0000, 0x7824, 0xa065, 0x1040, 0x1332, 0x2009, 0x0013, 0x1078,
++	0x775c, 0x0c7f, 0x007c, 0x3900, 0xa082, 0xa9e3, 0x00c8, 0x5cb2,
++	0x1078, 0x747a, 0x0c7e, 0x7824, 0xa065, 0x1040, 0x1332, 0x7804,
++	0xa086, 0x0004, 0x0040, 0x5d2d, 0x7828, 0xa092, 0x2710, 0x00c8,
++	0x5cc8, 0x8000, 0x782a, 0x0c7f, 0x1078, 0x6e01, 0x0078, 0x5ca9,
++	0x6104, 0xa186, 0x0003, 0x00c0, 0x5cdf, 0x0e7e, 0x2071, 0xa600,
++	0x70d8, 0x0e7f, 0xd08c, 0x0040, 0x5cdf, 0x0c7e, 0x0e7e, 0x2061,
++	0x0100, 0x2071, 0xa600, 0x1078, 0x4224, 0x0e7f, 0x0c7f, 0x1078,
++	0xa5c4, 0x2009, 0x0014, 0x1078, 0x775c, 0x0c7f, 0x0078, 0x5ca9,
++	0x2001, 0xa8cd, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x00c0, 0x5cfc,
++	0x782b, 0x0000, 0x7824, 0xa065, 0x1040, 0x1332, 0x2009, 0x0013,
++	0x1078, 0x77b3, 0x0c7f, 0x007c, 0x0c7e, 0x0d7e, 0x3900, 0xa082,
++	0xa9e3, 0x00c8, 0x5d05, 0x1078, 0x747a, 0x7824, 0xa005, 0x1040,
++	0x1332, 0x781c, 0xa06d, 0x1040, 0x1332, 0x6800, 0xc0dc, 0x6802,
++	0x7924, 0x2160, 0x1078, 0x772d, 0x693c, 0x81ff, 0x1040, 0x1332,
++	0x8109, 0x693e, 0x6854, 0xa015, 0x0040, 0x5d21, 0x7a1e, 0x0078,
++	0x5d23, 0x7918, 0x791e, 0x7807, 0x0000, 0x7827, 0x0000, 0x0d7f,
++	0x0c7f, 0x1078, 0x62d1, 0x0078, 0x5cfa, 0x6104, 0xa186, 0x0002,
++	0x0040, 0x5d38, 0xa186, 0x0004, 0x0040, 0x5d38, 0x0078, 0x5cbc,
++	0x7808, 0xac06, 0x0040, 0x5cbc, 0x1078, 0x61cd, 0x1078, 0x5dd7,
++	0x0c7f, 0x1078, 0x62d1, 0x0078, 0x5ca9, 0x0c7e, 0x6027, 0x0002,
++	0x62c8, 0x82ff, 0x00c0, 0x5d61, 0x62c4, 0x82ff, 0x00c0, 0x5d61,
++	0x793c, 0xa1e5, 0x0000, 0x0040, 0x5d5b, 0x2009, 0x0049, 0x1078,
++	0x775c, 0x0c7f, 0x007c, 0x2011, 0xa8d0, 0x2013, 0x0000, 0x0078,
++	0x5d59, 0x3908, 0xa192, 0xa9e3, 0x00c8, 0x5d68, 0x1078, 0x747a,
++	0x6017, 0x0010, 0x793c, 0x81ff, 0x0040, 0x5d5b, 0x7944, 0xa192,
++	0x7530, 0x00c8, 0x5d85, 0x8108, 0x7946, 0x793c, 0xa188, 0x0007,
++	0x210c, 0xa18e, 0x0006, 0x00c0, 0x5d81, 0x6017, 0x0012, 0x0078,
++	0x5d59, 0x6017, 0x0016, 0x0078, 0x5d59, 0x7848, 0xc085, 0x784a,
++	0x0078, 0x5d59, 0x007e, 0x017e, 0x0c7e, 0x127e, 0x2091, 0x8000,
++	0x600f, 0x0000, 0x2c08, 0x2061, 0xa8b1, 0x6020, 0x8000, 0x6022,
++	0x6010, 0xa005, 0x0040, 0x5da5, 0xa080, 0x0003, 0x2102, 0x6112,
++	0x127f, 0x0c7f, 0x017f, 0x007f, 0x007c, 0x6116, 0x6112, 0x0078,
++	0x5da0, 0x0d7e, 0x2069, 0xa8b1, 0x6000, 0xd0d4, 0x0040, 0x5dbe,
++	0x6820, 0x8000, 0x6822, 0xa086, 0x0001, 0x00c0, 0x5db9, 0x2c00,
++	0x681e, 0x6804, 0xa084, 0x0007, 0x0079, 0x62d9, 0xc0d5, 0x6002,
++	0x6818, 0xa005, 0x0040, 0x5dd0, 0x6056, 0x605b, 0x0000, 0x007e,
++	0x2c00, 0x681a, 0x0d7f, 0x685a, 0x2069, 0xa8b1, 0x0078, 0x5db0,
++	0x6056, 0x605a, 0x2c00, 0x681a, 0x681e, 0x0078, 0x5db0, 0x007e,
++	0x017e, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08,
++	0x2061, 0xa8b1, 0x6020, 0x8000, 0x6022, 0x6008, 0xa005, 0x0040,
++	0x5df2, 0xa080, 0x0003, 0x2102, 0x610a, 0x127f, 0x0c7f, 0x017f,
++	0x007f, 0x007c, 0x610e, 0x610a, 0x0078, 0x5ded, 0x0c7e, 0x600f,
++	0x0000, 0x2c08, 0x2061, 0xa8b1, 0x6034, 0xa005, 0x0040, 0x5e06,
++	0xa080, 0x0003, 0x2102, 0x6136, 0x0c7f, 0x007c, 0x613a, 0x6136,
++	0x0078, 0x5e04, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x057e,
++	0x037e, 0x027e, 0x017e, 0x007e, 0x127e, 0xa02e, 0x2071, 0xa8b1,
++	0x7638, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0040, 0x5e8c,
++	0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x00c0, 0x5e87, 0x87ff,
++	0x0040, 0x5e2e, 0x6020, 0xa106, 0x00c0, 0x5e87, 0x703c, 0xac06,
++	0x00c0, 0x5e44, 0x037e, 0x2019, 0x0001, 0x1078, 0x7058, 0x7033,
++	0x0000, 0x703f, 0x0000, 0x7043, 0x0000, 0x7047, 0x0000, 0x704b,
++	0x0000, 0x037f, 0x2029, 0x0001, 0x7038, 0xac36, 0x00c0, 0x5e4a,
++	0x660c, 0x763a, 0x7034, 0xac36, 0x00c0, 0x5e58, 0x2c00, 0xaf36,
++	0x0040, 0x5e56, 0x2f00, 0x7036, 0x0078, 0x5e58, 0x7037, 0x0000,
++	0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x5e61, 0x7e0e, 0x0078,
++	0x5e62, 0x2678, 0x600f, 0x0000, 0x1078, 0x8d06, 0x0040, 0x5e82,
++	0x6010, 0x2068, 0x601c, 0xa086, 0x0003, 0x00c0, 0x5e9d, 0x6837,
++	0x0103, 0x6b4a, 0x6847, 0x0000, 0x017e, 0x037e, 0x077e, 0x1078,
++	0x8f7d, 0x1078, 0xa4e2, 0x1078, 0x4a73, 0x077f, 0x037f, 0x017f,
++	0x1078, 0x8eb9, 0x1078, 0x8ec6, 0x0c7f, 0x0078, 0x5e1d, 0x2c78,
++	0x600c, 0x2060, 0x0078, 0x5e1d, 0x85ff, 0x0040, 0x5e91, 0x1078,
++	0x639b, 0x127f, 0x007f, 0x017f, 0x027f, 0x037f, 0x057f, 0x067f,
++	0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086, 0x0006,
++	0x00c0, 0x5e6f, 0x017e, 0x037e, 0x077e, 0x1078, 0xa4e2, 0x1078,
++	0xa1ca, 0x077f, 0x037f, 0x017f, 0x0078, 0x5e82, 0x007e, 0x067e,
++	0x0c7e, 0x0d7e, 0x0f7e, 0x2031, 0x0000, 0x127e, 0x2091, 0x8000,
++	0x2079, 0xa8b1, 0x7838, 0xa065, 0x0040, 0x5eef, 0x600c, 0x007e,
++	0x600f, 0x0000, 0x783c, 0xac06, 0x00c0, 0x5ed6, 0x037e, 0x2019,
++	0x0001, 0x1078, 0x7058, 0x7833, 0x0000, 0x783f, 0x0000, 0x7843,
++	0x0000, 0x7847, 0x0000, 0x784b, 0x0000, 0x037f, 0x1078, 0x8d06,
++	0x0040, 0x5eea, 0x6010, 0x2068, 0x601c, 0xa086, 0x0003, 0x00c0,
++	0x5ef8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4a73,
++	0x1078, 0x8eb9, 0x1078, 0x8ec6, 0x007f, 0x0078, 0x5ebb, 0x7e3a,
++	0x7e36, 0x127f, 0x0f7f, 0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c,
++	0x601c, 0xa086, 0x0006, 0x00c0, 0x5ee1, 0x1078, 0xa1ca, 0x0078,
++	0x5eea, 0x017e, 0x027e, 0x087e, 0x2041, 0x0000, 0x1078, 0x5f1b,
++	0x1078, 0x5fdb, 0x087f, 0x027f, 0x017f, 0x007c, 0x0f7e, 0x127e,
++	0x2079, 0xa8b1, 0x2091, 0x8000, 0x1078, 0x6076, 0x1078, 0x60ec,
++	0x127f, 0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e,
++	0x017e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa8b1, 0x7614,
++	0x2660, 0x2678, 0x8cff, 0x0040, 0x5fb5, 0x6018, 0xa080, 0x0028,
++	0x2004, 0xa206, 0x00c0, 0x5fb0, 0x88ff, 0x0040, 0x5f3b, 0x6020,
++	0xa106, 0x00c0, 0x5fb0, 0x7024, 0xac06, 0x00c0, 0x5f6b, 0x2069,
++	0x0100, 0x68c0, 0xa005, 0x0040, 0x5f66, 0x1078, 0x5acb, 0x1078,
++	0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378, 0x7027, 0x0000, 0x037e,
++	0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x5f5b, 0x6803,
++	0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040,
++	0x5f63, 0x6827, 0x0001, 0x037f, 0x0078, 0x5f6b, 0x6003, 0x0009,
++	0x630a, 0x0078, 0x5fb0, 0x7014, 0xac36, 0x00c0, 0x5f71, 0x660c,
++	0x7616, 0x7010, 0xac36, 0x00c0, 0x5f7f, 0x2c00, 0xaf36, 0x0040,
++	0x5f7d, 0x2f00, 0x7012, 0x0078, 0x5f7f, 0x7013, 0x0000, 0x660c,
++	0x067e, 0x2c00, 0xaf06, 0x0040, 0x5f88, 0x7e0e, 0x0078, 0x5f89,
++	0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040,
++	0x5fa9, 0x601c, 0xa086, 0x0003, 0x00c0, 0x5fbe, 0x6837, 0x0103,
++	0x6b4a, 0x6847, 0x0000, 0x017e, 0x037e, 0x087e, 0x1078, 0x8f7d,
++	0x1078, 0xa4e2, 0x1078, 0x4a73, 0x087f, 0x037f, 0x017f, 0x1078,
++	0x8eb9, 0x1078, 0x8ec6, 0x1078, 0x7233, 0x0c7f, 0x0078, 0x5f2a,
++	0x2c78, 0x600c, 0x2060, 0x0078, 0x5f2a, 0x127f, 0x007f, 0x017f,
++	0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086,
++	0x0006, 0x00c0, 0x5fcf, 0x017e, 0x037e, 0x087e, 0x1078, 0xa4e2,
++	0x1078, 0xa1ca, 0x087f, 0x037f, 0x017f, 0x0078, 0x5fa9, 0x601c,
++	0xa086, 0x0002, 0x00c0, 0x5fa9, 0x6004, 0xa086, 0x0085, 0x0040,
++	0x5f96, 0x0078, 0x5fa9, 0x0c7e, 0x007e, 0x127e, 0x2091, 0x8000,
++	0xa280, 0xa735, 0x2004, 0xa065, 0x0040, 0x6072, 0x0f7e, 0x0e7e,
++	0x0d7e, 0x067e, 0x2071, 0xa8b1, 0x6654, 0x7018, 0xac06, 0x00c0,
++	0x5ff2, 0x761a, 0x701c, 0xac06, 0x00c0, 0x5ffe, 0x86ff, 0x00c0,
++	0x5ffd, 0x7018, 0x701e, 0x0078, 0x5ffe, 0x761e, 0x6058, 0xa07d,
++	0x0040, 0x6003, 0x7e56, 0xa6ed, 0x0000, 0x0040, 0x6009, 0x2f00,
++	0x685a, 0x6057, 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc,
++	0x6002, 0x1078, 0x44d3, 0x0040, 0x606e, 0x7624, 0x86ff, 0x0040,
++	0x605c, 0xa680, 0x0004, 0x2004, 0xad06, 0x00c0, 0x605c, 0x0d7e,
++	0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x6053, 0x1078, 0x5acb,
++	0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378, 0x7027, 0x0000,
++	0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x603c,
++	0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084,
++	0x0040, 0x6044, 0x6827, 0x0001, 0x037f, 0x0d7f, 0x0c7e, 0x603c,
++	0xa005, 0x0040, 0x604d, 0x8001, 0x603e, 0x2660, 0x1078, 0x8ec6,
++	0x0c7f, 0x0078, 0x605c, 0x0d7f, 0x0c7e, 0x2660, 0x6003, 0x0009,
++	0x630a, 0x0c7f, 0x0078, 0x6011, 0x8dff, 0x0040, 0x606a, 0x6837,
++	0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x8f7d, 0x1078, 0xa4e2,
++	0x1078, 0x4a73, 0x1078, 0x7233, 0x0078, 0x6011, 0x067f, 0x0d7f,
++	0x0e7f, 0x0f7f, 0x127f, 0x007f, 0x0c7f, 0x007c, 0x007e, 0x067e,
++	0x0c7e, 0x0d7e, 0x2031, 0x0000, 0x7814, 0xa065, 0x0040, 0x60d0,
++	0x600c, 0x007e, 0x600f, 0x0000, 0x7824, 0xac06, 0x00c0, 0x60b5,
++	0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x60af, 0x1078, 0x5acb,
++	0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378, 0x7827, 0x0000,
++	0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x60a4,
++	0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084,
++	0x0040, 0x60ac, 0x6827, 0x0001, 0x037f, 0x0078, 0x60b5, 0x6003,
++	0x0009, 0x630a, 0x2c30, 0x0078, 0x60cd, 0x6010, 0x2068, 0x1078,
++	0x8d06, 0x0040, 0x60c9, 0x601c, 0xa086, 0x0003, 0x00c0, 0x60d7,
++	0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4a73, 0x1078,
++	0x8eb9, 0x1078, 0x8ec6, 0x1078, 0x7233, 0x007f, 0x0078, 0x607d,
++	0x7e16, 0x7e12, 0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c, 0x601c,
++	0xa086, 0x0006, 0x00c0, 0x60e0, 0x1078, 0xa1ca, 0x0078, 0x60c9,
++	0x601c, 0xa086, 0x0002, 0x00c0, 0x60c9, 0x6004, 0xa086, 0x0085,
++	0x0040, 0x60c0, 0x0078, 0x60c9, 0x007e, 0x067e, 0x0c7e, 0x0d7e,
++	0x7818, 0xa065, 0x0040, 0x615a, 0x6054, 0x007e, 0x6057, 0x0000,
++	0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x1078, 0x44d3,
++	0x0040, 0x6157, 0x7e24, 0x86ff, 0x0040, 0x6149, 0xa680, 0x0004,
++	0x2004, 0xad06, 0x00c0, 0x6149, 0x0d7e, 0x2069, 0x0100, 0x68c0,
++	0xa005, 0x0040, 0x6140, 0x1078, 0x5acb, 0x1078, 0x6e0f, 0x68c3,
++	0x0000, 0x1078, 0x7378, 0x7827, 0x0000, 0x037e, 0x2069, 0x0140,
++	0x6b04, 0xa384, 0x1000, 0x0040, 0x6129, 0x6803, 0x0100, 0x6803,
++	0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x6131, 0x6827,
++	0x0001, 0x037f, 0x0d7f, 0x0c7e, 0x603c, 0xa005, 0x0040, 0x613a,
++	0x8001, 0x603e, 0x2660, 0x1078, 0x8ec6, 0x0c7f, 0x0078, 0x6149,
++	0x0d7f, 0x0c7e, 0x2660, 0x6003, 0x0009, 0x630a, 0x0c7f, 0x0078,
++	0x60fe, 0x8dff, 0x0040, 0x6153, 0x6837, 0x0103, 0x6b4a, 0x6847,
++	0x0000, 0x1078, 0x4a73, 0x1078, 0x7233, 0x0078, 0x60fe, 0x007f,
++	0x0078, 0x60f1, 0x781e, 0x781a, 0x0d7f, 0x0c7f, 0x067f, 0x007f,
++	0x007c, 0x0e7e, 0x0d7e, 0x067e, 0x6000, 0xd0dc, 0x0040, 0x6181,
++	0x604c, 0xa06d, 0x0040, 0x6181, 0x6848, 0xa606, 0x00c0, 0x6181,
++	0x2071, 0xa8b1, 0x7024, 0xa035, 0x0040, 0x6181, 0xa080, 0x0004,
++	0x2004, 0xad06, 0x00c0, 0x6181, 0x6000, 0xc0dc, 0x6002, 0x1078,
++	0x6185, 0x067f, 0x0d7f, 0x0e7f, 0x007c, 0x0f7e, 0x2079, 0x0100,
++	0x78c0, 0xa005, 0x00c0, 0x6194, 0x0c7e, 0x2660, 0x6003, 0x0009,
++	0x630a, 0x0c7f, 0x0078, 0x61cb, 0x1078, 0x6e0f, 0x78c3, 0x0000,
++	0x1078, 0x7378, 0x7027, 0x0000, 0x037e, 0x2079, 0x0140, 0x7b04,
++	0xa384, 0x1000, 0x0040, 0x61a8, 0x7803, 0x0100, 0x7803, 0x0000,
++	0x2079, 0x0100, 0x7824, 0xd084, 0x0040, 0x61b0, 0x7827, 0x0001,
++	0x1078, 0x7378, 0x037f, 0x1078, 0x44d3, 0x0c7e, 0x603c, 0xa005,
++	0x0040, 0x61bc, 0x8001, 0x603e, 0x2660, 0x1078, 0x772d, 0x0c7f,
++	0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x8f7d, 0x1078,
++	0x4a73, 0x1078, 0x7233, 0x0f7f, 0x007c, 0x0e7e, 0x0c7e, 0x2071,
++	0xa8b1, 0x7004, 0xa084, 0x0007, 0x0079, 0x61d6, 0x61e0, 0x61e3,
++	0x61fc, 0x6218, 0x6262, 0x61e0, 0x61e0, 0x61de, 0x1078, 0x1332,
++	0x0c7f, 0x0e7f, 0x007c, 0x7024, 0xa065, 0x0040, 0x61f1, 0x7020,
++	0x8001, 0x7022, 0x600c, 0xa015, 0x0040, 0x61f8, 0x7216, 0x600f,
++	0x0000, 0x7007, 0x0000, 0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c,
++	0x7216, 0x7212, 0x0078, 0x61f1, 0x6018, 0x2060, 0x1078, 0x44d3,
++	0x6000, 0xc0dc, 0x6002, 0x7020, 0x8001, 0x7022, 0x0040, 0x620d,
++	0x6054, 0xa015, 0x0040, 0x6214, 0x721e, 0x7007, 0x0000, 0x7027,
++	0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x7218, 0x721e, 0x0078, 0x620d,
++	0x7024, 0xa065, 0x0040, 0x625f, 0x700c, 0xac06, 0x00c0, 0x622f,
++	0x1078, 0x7233, 0x600c, 0xa015, 0x0040, 0x622b, 0x720e, 0x600f,
++	0x0000, 0x0078, 0x625d, 0x720e, 0x720a, 0x0078, 0x625d, 0x7014,
++	0xac06, 0x00c0, 0x6242, 0x1078, 0x7233, 0x600c, 0xa015, 0x0040,
++	0x623e, 0x7216, 0x600f, 0x0000, 0x0078, 0x625d, 0x7216, 0x7212,
++	0x0078, 0x625d, 0x601c, 0xa086, 0x0003, 0x00c0, 0x625d, 0x6018,
++	0x2060, 0x1078, 0x44d3, 0x6000, 0xc0dc, 0x6002, 0x1078, 0x7233,
++	0x701c, 0xa065, 0x0040, 0x625d, 0x6054, 0xa015, 0x0040, 0x625b,
++	0x721e, 0x0078, 0x625d, 0x7218, 0x721e, 0x7027, 0x0000, 0x0c7f,
++	0x0e7f, 0x007c, 0x7024, 0xa065, 0x0040, 0x626f, 0x1078, 0x7233,
++	0x600c, 0xa015, 0x0040, 0x6276, 0x720e, 0x600f, 0x0000, 0x1078,
++	0x7378, 0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x720e, 0x720a,
++	0x0078, 0x626f, 0x0d7e, 0x2069, 0xa8b1, 0x6830, 0xa084, 0x0003,
++	0x0079, 0x6282, 0x6288, 0x628a, 0x62b4, 0x6288, 0x1078, 0x1332,
++	0x0d7f, 0x007c, 0x0c7e, 0x6840, 0xa086, 0x0001, 0x0040, 0x62aa,
++	0x683c, 0xa065, 0x0040, 0x629b, 0x600c, 0xa015, 0x0040, 0x62a6,
++	0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011,
++	0xa8d0, 0x2013, 0x0000, 0x0c7f, 0x0d7f, 0x007c, 0x683a, 0x6836,
++	0x0078, 0x629b, 0x6843, 0x0000, 0x6838, 0xa065, 0x0040, 0x629b,
++	0x6003, 0x0003, 0x0078, 0x629b, 0x0c7e, 0x6843, 0x0000, 0x6847,
++	0x0000, 0x684b, 0x0000, 0x683c, 0xa065, 0x0040, 0x62ce, 0x600c,
++	0xa015, 0x0040, 0x62ca, 0x6a3a, 0x600f, 0x0000, 0x683f, 0x0000,
++	0x0078, 0x62ce, 0x683f, 0x0000, 0x683a, 0x6836, 0x0c7f, 0x0d7f,
++	0x007c, 0x0d7e, 0x2069, 0xa8b1, 0x6804, 0xa084, 0x0007, 0x0079,
++	0x62d9, 0x62e3, 0x638a, 0x638a, 0x638a, 0x638a, 0x638c, 0x638a,
++	0x62e1, 0x1078, 0x1332, 0x6820, 0xa005, 0x00c0, 0x62e9, 0x0d7f,
++	0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040, 0x62f8, 0x6807, 0x0004,
++	0x6826, 0x682b, 0x0000, 0x1078, 0x63d4, 0x0c7f, 0x0d7f, 0x007c,
++	0x6814, 0xa065, 0x0040, 0x6306, 0x6807, 0x0001, 0x6826, 0x682b,
++	0x0000, 0x1078, 0x63d4, 0x0c7f, 0x0d7f, 0x007c, 0x0e7e, 0x037e,
++	0x6a1c, 0xa2f5, 0x0000, 0x0040, 0x6385, 0x704c, 0xa00d, 0x0040,
++	0x6315, 0x7088, 0xa005, 0x0040, 0x632d, 0x7054, 0xa075, 0x0040,
++	0x631e, 0xa20e, 0x0040, 0x6385, 0x0078, 0x6323, 0x6818, 0xa20e,
++	0x0040, 0x6385, 0x2070, 0x704c, 0xa00d, 0x0040, 0x6315, 0x7088,
++	0xa005, 0x00c0, 0x6315, 0x2e00, 0x681e, 0x733c, 0x7038, 0xa302,
++	0x00c8, 0x6315, 0x1078, 0x76fc, 0x0040, 0x6385, 0x8318, 0x733e,
++	0x6112, 0x2e10, 0x621a, 0xa180, 0x0014, 0x2004, 0xa084, 0x00ff,
++	0x6032, 0xa180, 0x0014, 0x2003, 0x0000, 0xa180, 0x0015, 0x2004,
++	0xa08a, 0x199a, 0x0048, 0x634e, 0x2001, 0x1999, 0x8003, 0x801b,
++	0x831b, 0xa318, 0x6316, 0x037f, 0x0f7e, 0x2c78, 0x71a0, 0xd1bc,
++	0x0040, 0x6367, 0x7100, 0xd1f4, 0x0040, 0x6363, 0x7114, 0xa18c,
++	0x00ff, 0x0078, 0x636c, 0x2009, 0x0000, 0x0078, 0x636c, 0xa1e0,
++	0x29c0, 0x2c0c, 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0x1078,
++	0x6965, 0x7300, 0xc3dd, 0x7302, 0x6807, 0x0002, 0x2f18, 0x6b26,
++	0x682b, 0x0000, 0x781f, 0x0003, 0x7803, 0x0001, 0x7807, 0x0040,
++	0x0f7f, 0x0e7f, 0x0c7f, 0x0d7f, 0x007c, 0x037f, 0x0e7f, 0x0c7f,
++	0x0078, 0x6383, 0x0d7f, 0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040,
++	0x6398, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x1078, 0x63d4,
++	0x0c7f, 0x0d7f, 0x007c, 0x0f7e, 0x0d7e, 0x2069, 0xa8b1, 0x6830,
++	0xa086, 0x0000, 0x00c0, 0x63bb, 0x6838, 0xa07d, 0x0040, 0x63bb,
++	0x6833, 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x127e,
++	0x0f7e, 0x2091, 0x2200, 0x027f, 0x1078, 0x1d6d, 0x00c0, 0x63be,
++	0x127f, 0x1078, 0x6cb3, 0x0d7f, 0x0f7f, 0x007c, 0x127f, 0x6843,
++	0x0000, 0x7803, 0x0002, 0x780c, 0xa015, 0x0040, 0x63d0, 0x6a3a,
++	0x780f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x0078, 0x63bb,
++	0x683a, 0x6836, 0x0078, 0x63ca, 0x601c, 0xa084, 0x000f, 0x1079,
++	0x63da, 0x007c, 0x63e3, 0x63e8, 0x6809, 0x6922, 0x63e8, 0x6809,
++	0x6922, 0x63e3, 0x63e8, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x007c,
++	0x157e, 0x137e, 0x147e, 0x0c7e, 0x0f7e, 0x6004, 0xa08a, 0x0044,
++	0x10c8, 0x1332, 0x6118, 0x2178, 0x79a0, 0xd1bc, 0x0040, 0x6405,
++	0x7900, 0xd1f4, 0x0040, 0x6401, 0x7914, 0xa18c, 0x00ff, 0x0078,
++	0x640a, 0x2009, 0x0000, 0x0078, 0x640a, 0xa1f8, 0x29c0, 0x2f0c,
++	0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0xa08a, 0x0040,
++	0x00c8, 0x645c, 0x1079, 0x641a, 0x0f7f, 0x0c7f, 0x147f, 0x137f,
++	0x157f, 0x007c, 0x64c2, 0x650a, 0x6532, 0x65cd, 0x65fd, 0x6605,
++	0x662c, 0x663d, 0x664e, 0x6656, 0x666e, 0x6656, 0x66d9, 0x663d,
++	0x66fa, 0x6702, 0x664e, 0x6702, 0x6713, 0x645a, 0x645a, 0x645a,
++	0x645a, 0x645a, 0x645a, 0x645a, 0x645a, 0x645a, 0x645a, 0x645a,
++	0x6eef, 0x6f14, 0x6f29, 0x6f4c, 0x6f6d, 0x662c, 0x645a, 0x662c,
++	0x6656, 0x645a, 0x6532, 0x65cd, 0x645a, 0x749c, 0x6656, 0x645a,
++	0x74bc, 0x6656, 0x645a, 0x645a, 0x64bd, 0x646b, 0x645a, 0x74e1,
++	0x7558, 0x7640, 0x645a, 0x7651, 0x6626, 0x766d, 0x645a, 0x6f82,
++	0x645a, 0x645a, 0x1078, 0x1332, 0x2100, 0x1079, 0x6465, 0x0f7f,
++	0x0c7f, 0x147f, 0x137f, 0x157f, 0x007c, 0x6469, 0x6469, 0x6469,
++	0x649f, 0x1078, 0x1332, 0x0d7e, 0x20a1, 0x020b, 0x1078, 0x6731,
++	0x7810, 0x2068, 0x20a3, 0x2414, 0x20a3, 0x0018, 0x20a3, 0x0800,
++	0x683c, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x6850, 0x20a2, 0x6854, 0x20a2, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x60c3, 0x0018, 0x1078, 0x6dfb, 0x0d7f, 0x007c,
++	0x0d7e, 0x7818, 0x2068, 0x68a0, 0xa082, 0x007e, 0x0048, 0x649c,
++	0xa085, 0x0001, 0x0d7f, 0x007c, 0xa006, 0x0078, 0x649a, 0x0d7e,
++	0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x0500, 0x20a3, 0x0000,
++	0x7810, 0xa0e8, 0x000f, 0x6808, 0x20a2, 0x680c, 0x20a2, 0x6810,
++	0x20a2, 0x6814, 0x20a2, 0x6818, 0x20a2, 0x681c, 0x20a2, 0x60c3,
++	0x0010, 0x1078, 0x6dfb, 0x0d7f, 0x007c, 0x6030, 0x609a, 0x1078,
++	0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x5200,
++	0x20a3, 0x0000, 0x0d7e, 0x2069, 0xa652, 0x6804, 0xd084, 0x0040,
++	0x64dc, 0x6828, 0x20a3, 0x0000, 0x017e, 0x1078, 0x2564, 0x21a2,
++	0x017f, 0x0d7f, 0x0078, 0x64e1, 0x0d7f, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a9, 0x0004, 0x2099, 0xa605, 0x53a6, 0x20a9, 0x0004,
++	0x2099, 0xa601, 0x53a6, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082,
++	0x007f, 0x0048, 0x64fb, 0x2001, 0xa61b, 0x20a6, 0x2001, 0xa61c,
++	0x20a6, 0x0078, 0x6501, 0x20a3, 0x0000, 0x6030, 0xa084, 0x00ff,
++	0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x1078,
++	0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x0500,
++	0x20a3, 0x0000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007f,
++	0x0048, 0x6522, 0x2001, 0xa61b, 0x20a6, 0x2001, 0xa61c, 0x20a6,
++	0x0078, 0x6528, 0x20a3, 0x0000, 0x6030, 0xa084, 0x00ff, 0x20a2,
++	0x20a9, 0x0004, 0x2099, 0xa605, 0x53a6, 0x60c3, 0x0010, 0x1078,
++	0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x6731, 0x0c7e, 0x7818,
++	0x2060, 0x2001, 0x0000, 0x1078, 0x4972, 0x0c7f, 0x7818, 0xa080,
++	0x0028, 0x2004, 0xa086, 0x007e, 0x00c0, 0x654d, 0x20a3, 0x0400,
++	0x620c, 0xc2b4, 0x620e, 0x0078, 0x654f, 0x20a3, 0x0300, 0x20a3,
++	0x0000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x00c0,
++	0x659c, 0x2099, 0xa88d, 0x33a6, 0x9398, 0x33a6, 0x9398, 0x3304,
++	0xa084, 0x3fff, 0x20a2, 0x9398, 0x33a6, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099,
++	0xa605, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xa601, 0x53a6, 0x20a9,
++	0x0010, 0x20a3, 0x0000, 0x00f0, 0x6579, 0x2099, 0xa895, 0x3304,
++	0xc0dd, 0x20a2, 0x2001, 0xa672, 0x2004, 0xd0e4, 0x0040, 0x6594,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x9398, 0x9398, 0x9398, 0x33a6,
++	0x20a9, 0x0004, 0x0078, 0x6596, 0x20a9, 0x0007, 0x20a3, 0x0000,
++	0x00f0, 0x6596, 0x0078, 0x65bc, 0x2099, 0xa88d, 0x20a9, 0x0008,
++	0x53a6, 0x20a9, 0x0004, 0x2099, 0xa605, 0x53a6, 0x20a9, 0x0004,
++	0x2099, 0xa601, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0,
++	0x65ad, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0, 0x65b3, 0x2099,
++	0xa895, 0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000,
++	0x00f0, 0x65be, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x00f0, 0x65c4,
++	0x60c3, 0x0074, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078,
++	0x6731, 0x20a3, 0x2010, 0x20a3, 0x0014, 0x20a3, 0x0800, 0x20a3,
++	0x2000, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x0f7e,
++	0x2079, 0xa652, 0x7904, 0x0f7f, 0xd1ac, 0x00c0, 0x65e9, 0xa085,
++	0x0020, 0xd1a4, 0x0040, 0x65ee, 0xa085, 0x0010, 0xa085, 0x0002,
++	0x0d7e, 0x0078, 0x66b7, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x0014, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078,
++	0x6731, 0x20a3, 0x5000, 0x0078, 0x654f, 0x20a1, 0x020b, 0x1078,
++	0x6731, 0x20a3, 0x2110, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x60c3, 0x0014, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b,
++	0x1078, 0x67b9, 0x0078, 0x6630, 0x20a1, 0x020b, 0x1078, 0x67c2,
++	0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x0004, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078,
++	0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3,
++	0x2a00, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b,
++	0x1078, 0x67c2, 0x20a3, 0x0200, 0x0078, 0x654f, 0x20a1, 0x020b,
++	0x1078, 0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0xa005,
++	0x0040, 0x6665, 0x20a2, 0x0078, 0x6667, 0x20a3, 0x0003, 0x7810,
++	0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c, 0x0d7e, 0x20a1,
++	0x020b, 0x1078, 0x67c2, 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3,
++	0x0800, 0x7818, 0x2068, 0x6894, 0xa086, 0x0014, 0x00c0, 0x6694,
++	0x6998, 0xa184, 0xc000, 0x00c0, 0x6690, 0xd1ec, 0x0040, 0x668c,
++	0x20a3, 0x2100, 0x0078, 0x6696, 0x20a3, 0x0100, 0x0078, 0x6696,
++	0x20a3, 0x0400, 0x0078, 0x6696, 0x20a3, 0x0700, 0xa006, 0x20a2,
++	0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x0f7e, 0x2079, 0xa652, 0x7904,
++	0x0f7f, 0xd1ac, 0x00c0, 0x66a6, 0xa085, 0x0020, 0xd1a4, 0x0040,
++	0x66ab, 0xa085, 0x0010, 0x2009, 0xa674, 0x210c, 0xd184, 0x0040,
++	0x66b5, 0x699c, 0xd18c, 0x0040, 0x66b7, 0xa085, 0x0002, 0x027e,
++	0x2009, 0xa672, 0x210c, 0xd1e4, 0x0040, 0x66c5, 0xc0c5, 0xa094,
++	0x0030, 0xa296, 0x0010, 0x0040, 0x66cf, 0xd1ec, 0x0040, 0x66cf,
++	0xa094, 0x0030, 0xa296, 0x0010, 0x0040, 0x66cf, 0xc0bd, 0x027f,
++	0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x0014, 0x1078, 0x6dfb, 0x0d7f,
++	0x007c, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0210, 0x20a3,
++	0x0014, 0x20a3, 0x0000, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
++	0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0200,
++	0x0078, 0x64c8, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0100,
++	0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008,
++	0x1078, 0x6dfb, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a1,
++	0x020b, 0x1078, 0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3,
++	0x000b, 0x20a3, 0x0000, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c,
++	0x027e, 0x037e, 0x047e, 0x2019, 0x3200, 0x2021, 0x0800, 0x0078,
++	0x6738, 0x027e, 0x037e, 0x047e, 0x2019, 0x2200, 0x2021, 0x0100,
++	0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2014,
++	0xa286, 0x007e, 0x00c0, 0x674b, 0xa385, 0x00ff, 0x20a2, 0x20a3,
++	0xfffe, 0x0078, 0x6780, 0xa286, 0x007f, 0x00c0, 0x6757, 0x0d7e,
++	0xa385, 0x00ff, 0x20a2, 0x20a3, 0xfffd, 0x0078, 0x676e, 0xd2bc,
++	0x0040, 0x6776, 0xa286, 0x0080, 0x0d7e, 0x00c0, 0x6766, 0xa385,
++	0x00ff, 0x20a2, 0x20a3, 0xfffc, 0x0078, 0x676e, 0xa2e8, 0xa735,
++	0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b,
++	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6784, 0x0d7e, 0xa2e8,
++	0xa735, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x0d7f,
++	0x20a3, 0x0000, 0x6230, 0x22a2, 0xa485, 0x0029, 0x20a2, 0x047f,
++	0x037f, 0x20a3, 0x0000, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000,
++	0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f,
++	0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3, 0x02ff,
++	0x2011, 0xfffc, 0x22a2, 0x0d7e, 0x2069, 0xa61b, 0x2da6, 0x8d68,
++	0x2da6, 0x0d7f, 0x20a3, 0x2029, 0x20a3, 0x0000, 0x0078, 0x678b,
++	0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0xfc02, 0x20a3, 0x0000,
++	0x007c, 0x027e, 0x037e, 0x047e, 0x2019, 0x3300, 0x2021, 0x0800,
++	0x0078, 0x67c9, 0x027e, 0x037e, 0x047e, 0x2019, 0x2300, 0x2021,
++	0x0100, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++	0x2004, 0xa092, 0x007e, 0x0048, 0x67e6, 0x0d7e, 0xa0e8, 0xa735,
++	0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b,
++	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x67f4, 0x0d7e, 0xa0e8,
++	0xa735, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x0d7f,
++	0x20a3, 0x0000, 0x6230, 0x22a2, 0xa485, 0x0098, 0x20a2, 0x20a3,
++	0x0000, 0x047f, 0x037f, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000,
++	0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f,
++	0x007c, 0x0c7e, 0x0f7e, 0x6004, 0xa08a, 0x0085, 0x1048, 0x1332,
++	0xa08a, 0x008c, 0x10c8, 0x1332, 0x6118, 0x2178, 0x79a0, 0xd1bc,
++	0x0040, 0x6827, 0x7900, 0xd1f4, 0x0040, 0x6823, 0x7914, 0xa18c,
++	0x00ff, 0x0078, 0x682c, 0x2009, 0x0000, 0x0078, 0x682c, 0xa1f8,
++	0x29c0, 0x2f0c, 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a,
++	0xa082, 0x0085, 0x1079, 0x6837, 0x0f7f, 0x0c7f, 0x007c, 0x6840,
++	0x684b, 0x6866, 0x683e, 0x683e, 0x683e, 0x6840, 0x1078, 0x1332,
++	0x147e, 0x20a1, 0x020b, 0x1078, 0x6879, 0x60c3, 0x0000, 0x1078,
++	0x6dfb, 0x147f, 0x007c, 0x147e, 0x20a1, 0x020b, 0x1078, 0x68ad,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x7810, 0x20a2,
++	0x20a3, 0x0000, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x000c, 0x1078, 0x6dfb, 0x147f, 0x007c, 0x147e, 0x20a1,
++	0x020b, 0x1078, 0x68ee, 0x20a3, 0x0003, 0x20a3, 0x0300, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004, 0x1078, 0x6dfb, 0x147f,
++	0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080,
++	0x0028, 0x2004, 0xa092, 0x007e, 0x0048, 0x6898, 0x0d7e, 0xa0e8,
++	0xa735, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2,
++	0x2069, 0xa61b, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x68a7,
++	0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2,
++	0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3,
++	0x0009, 0x20a3, 0x0000, 0x0078, 0x678b, 0x027e, 0x20e1, 0x9080,
++	0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa092, 0x007e,
++	0x0048, 0x68cc, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085,
++	0x8400, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b, 0x2da6, 0x8d68,
++	0x2da6, 0x0d7f, 0x0078, 0x68db, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c,
++	0x6810, 0xa085, 0x8400, 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3,
++	0x0000, 0x6230, 0x22a2, 0x20a3, 0x0099, 0x20a3, 0x0000, 0x1078,
++	0x6dea, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x7a10, 0x22a2,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x027e, 0x20e1,
++	0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa092,
++	0x007e, 0x0048, 0x690d, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810,
++	0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b, 0x2da6,
++	0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x691c, 0x0d7e, 0xa0e8, 0xa735,
++	0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x0d7f,
++	0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0099, 0x20a3, 0x0000,
++	0x0078, 0x68df, 0x0c7e, 0x0f7e, 0x2c78, 0x7804, 0xa08a, 0x0040,
++	0x1048, 0x1332, 0xa08a, 0x0053, 0x10c8, 0x1332, 0x7918, 0x2160,
++	0x61a0, 0xd1bc, 0x0040, 0x6941, 0x6100, 0xd1f4, 0x0040, 0x693d,
++	0x6114, 0xa18c, 0x00ff, 0x0078, 0x6946, 0x2009, 0x0000, 0x0078,
++	0x6946, 0xa1e0, 0x29c0, 0x2c0c, 0xa18c, 0x00ff, 0x2061, 0x0100,
++	0x619a, 0xa082, 0x0040, 0x1079, 0x6950, 0x0f7f, 0x0c7f, 0x007c,
++	0x6965, 0x6a73, 0x6a14, 0x6c27, 0x6963, 0x6963, 0x6963, 0x6963,
++	0x6963, 0x6963, 0x6963, 0x714c, 0x715d, 0x716e, 0x717f, 0x6963,
++	0x767e, 0x6963, 0x713b, 0x1078, 0x1332, 0x0d7e, 0x157e, 0x147e,
++	0x780b, 0xffff, 0x20a1, 0x020b, 0x1078, 0x69d0, 0x7910, 0x2168,
++	0x6948, 0x7922, 0x21a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x694c,
++	0xa184, 0x000f, 0x00c0, 0x6980, 0x2001, 0x0005, 0x0078, 0x698a,
++	0xd184, 0x0040, 0x6987, 0x2001, 0x0004, 0x0078, 0x698a, 0xa084,
++	0x0006, 0x8004, 0x017e, 0x2008, 0x7830, 0xa084, 0x00ff, 0x8007,
++	0xa105, 0x017f, 0x20a2, 0xd1ac, 0x0040, 0x699a, 0x20a3, 0x0002,
++	0x0078, 0x69a6, 0xd1b4, 0x0040, 0x69a1, 0x20a3, 0x0001, 0x0078,
++	0x69a6, 0x20a3, 0x0000, 0x2230, 0x0078, 0x69a8, 0x6a80, 0x6e7c,
++	0x20a9, 0x0008, 0xad80, 0x0017, 0x200c, 0x810f, 0x21a2, 0x8000,
++	0x00f0, 0x69ac, 0x22a2, 0x26a2, 0x60c3, 0x0020, 0x20e1, 0x9080,
++	0x6014, 0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x2001, 0xa8cd,
++	0x2003, 0x07d0, 0x2001, 0xa8cc, 0x2003, 0x0009, 0x2001, 0xa8d2,
++	0x2003, 0x0002, 0x1078, 0x158c, 0x147f, 0x157f, 0x0d7f, 0x007c,
++	0x20e1, 0x9080, 0x20e1, 0x4000, 0x7a18, 0xa280, 0x0023, 0x2014,
++	0x8210, 0xa294, 0x00ff, 0x2202, 0x8217, 0x7818, 0xa080, 0x0028,
++	0x2004, 0xd0bc, 0x0040, 0x69f6, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c,
++	0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b,
++	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6a05, 0x0d7e, 0xa0e8,
++	0xa735, 0x2d6c, 0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2,
++	0x0d7f, 0x20a3, 0x0000, 0x6130, 0x21a2, 0x20a3, 0x0829, 0x20a3,
++	0x0000, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e,
++	0x20a1, 0x020b, 0x1078, 0x6a34, 0x7810, 0x2068, 0x6860, 0x20a2,
++	0x685c, 0x20a2, 0x6880, 0x20a2, 0x687c, 0x20a2, 0xa006, 0x20a2,
++	0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x000c, 0x1078, 0x6dfb, 0x147f,
++	0x137f, 0x157f, 0x0d7f, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1,
++	0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x6a52,
++	0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2,
++	0x6814, 0x20a2, 0x2069, 0xa61b, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
++	0x0078, 0x6a61, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085,
++	0x0500, 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230,
++	0x22a2, 0x20a3, 0x0889, 0x20a3, 0x0000, 0x1078, 0x6dea, 0x22a2,
++	0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x027f, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x7810,
++	0xa0ec, 0xf000, 0x0040, 0x6a8b, 0xa06d, 0x1078, 0x495f, 0x0040,
++	0x6a8b, 0x684c, 0xa084, 0x2020, 0xa086, 0x2020, 0x00c0, 0x6a8b,
++	0x7824, 0xc0cd, 0x7826, 0x20a1, 0x020b, 0x1078, 0x6be0, 0xa016,
++	0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x7810, 0xa084, 0xf000,
++	0x00c0, 0x6aa2, 0x7810, 0xa084, 0x0700, 0x8007, 0x1079, 0x6aaa,
++	0x0078, 0x6aa5, 0xa006, 0x1079, 0x6aaa, 0x147f, 0x137f, 0x157f,
++	0x0d7f, 0x007c, 0x6ab4, 0x6b4c, 0x6b57, 0x6b81, 0x6b95, 0x6bb1,
++	0x6bbc, 0x6ab2, 0x1078, 0x1332, 0x017e, 0x037e, 0x694c, 0xa18c,
++	0x0003, 0x0040, 0x6abf, 0xa186, 0x0003, 0x00c0, 0x6ace, 0x6b78,
++	0x7824, 0xd0cc, 0x0040, 0x6ac5, 0xc3e5, 0x23a2, 0x6868, 0x20a2,
++	0x6864, 0x20a2, 0x037f, 0x017f, 0x0078, 0x6b8c, 0xa186, 0x0001,
++	0x10c0, 0x1332, 0x6b78, 0x7824, 0xd0cc, 0x0040, 0x6ad8, 0xc3e5,
++	0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x22a2, 0x6874, 0x20a2,
++	0x22a2, 0x687c, 0x20a2, 0x2009, 0x0018, 0xa384, 0x0300, 0x0040,
++	0x6b46, 0xd3c4, 0x0040, 0x6aee, 0x687c, 0xa108, 0xd3cc, 0x0040,
++	0x6af3, 0x6874, 0xa108, 0x157e, 0x20a9, 0x000d, 0xad80, 0x0020,
++	0x201c, 0x831f, 0x23a2, 0x8000, 0x00f0, 0x6af8, 0x157f, 0x22a2,
++	0x22a2, 0x22a2, 0xa184, 0x0003, 0x0040, 0x6b46, 0x20a1, 0x020b,
++	0x20e1, 0x9080, 0x20e1, 0x4000, 0x007e, 0x7818, 0xa080, 0x0028,
++	0x2004, 0xd0bc, 0x0040, 0x6b26, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c,
++	0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b,
++	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6b35, 0x0d7e, 0xa0e8,
++	0xa735, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2,
++	0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x007f, 0x7b24, 0xd3cc,
++	0x0040, 0x6b3e, 0x20a3, 0x0889, 0x0078, 0x6b40, 0x20a3, 0x0898,
++	0x20a2, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, 0x61c2, 0x037f,
++	0x017f, 0x1078, 0x6dfb, 0x007c, 0x2011, 0x0008, 0x7824, 0xd0cc,
++	0x0040, 0x6b53, 0xc2e5, 0x22a2, 0xa016, 0x0078, 0x6b8a, 0x2011,
++	0x0302, 0x7824, 0xd0cc, 0x0040, 0x6b5e, 0xc2e5, 0x22a2, 0xa016,
++	0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0012, 0x22a2, 0x20a3, 0x0008,
++	0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x7000, 0x20a3, 0x0500,
++	0x22a2, 0x20a3, 0x000a, 0x22a2, 0x22a2, 0x20a3, 0x2500, 0x22a2,
++	0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0032, 0x1078, 0x6dfb,
++	0x007c, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x0040, 0x6b88, 0xc2e5,
++	0x22a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2,
++	0x60c3, 0x0018, 0x1078, 0x6dfb, 0x007c, 0x2011, 0x0100, 0x7824,
++	0xd0cc, 0x0040, 0x6b9c, 0xc2e5, 0x22a2, 0xa016, 0x22a2, 0x22a2,
++	0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0008, 0x22a2, 0x7834, 0xa084,
++	0x00ff, 0x20a2, 0x22a2, 0x22a2, 0x60c3, 0x0020, 0x1078, 0x6dfb,
++	0x007c, 0x2011, 0x0008, 0x7824, 0xd0cc, 0x0040, 0x6bb8, 0xc2e5,
++	0x22a2, 0xa016, 0x0078, 0x6b8a, 0x037e, 0x7b10, 0xa384, 0xff00,
++	0x7812, 0xa384, 0x00ff, 0x8001, 0x00c0, 0x6bcf, 0x7824, 0xd0cc,
++	0x0040, 0x6bcb, 0xc2e5, 0x22a2, 0x037f, 0x0078, 0x6b8a, 0x047e,
++	0x2021, 0x0800, 0x007e, 0x7824, 0xd0cc, 0x007f, 0x0040, 0x6bd9,
++	0xc4e5, 0x24a2, 0x047f, 0x22a2, 0x20a2, 0x037f, 0x0078, 0x6b8c,
++	0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++	0x2004, 0xd0bc, 0x0040, 0x6bfe, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c,
++	0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b,
++	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6c0d, 0x0d7e, 0xa0e8,
++	0xa735, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2,
++	0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x7824, 0xd0cc, 0x0040,
++	0x6c15, 0x20a3, 0x0889, 0x0078, 0x6c17, 0x20a3, 0x0898, 0x20a3,
++	0x0000, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2,
++	0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x0d7e,
++	0x157e, 0x137e, 0x147e, 0x017e, 0x037e, 0x7810, 0xa084, 0x0700,
++	0x8007, 0x1079, 0x6c3a, 0x037f, 0x017f, 0x147f, 0x137f, 0x157f,
++	0x0d7f, 0x007c, 0x6c42, 0x6c42, 0x6c44, 0x6c42, 0x6c42, 0x6c42,
++	0x6c69, 0x6c42, 0x1078, 0x1332, 0x7910, 0xa18c, 0xf8ff, 0xa18d,
++	0x0600, 0x7912, 0x20a1, 0x020b, 0x2009, 0x0003, 0x1078, 0x6c73,
++	0x0d7e, 0x2069, 0xa652, 0x6804, 0xd0bc, 0x0040, 0x6c5e, 0x682c,
++	0xa084, 0x00ff, 0x8007, 0x20a2, 0x0078, 0x6c60, 0x20a3, 0x3f00,
++	0x0d7f, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0001, 0x1078, 0x6dfb,
++	0x007c, 0x20a1, 0x020b, 0x2009, 0x0003, 0x1078, 0x6c73, 0x20a3,
++	0x7f00, 0x0078, 0x6c61, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000,
++	0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x6c91, 0x0d7e,
++	0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2, 0x6814,
++	0x20a2, 0x2069, 0xa61b, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078,
++	0x6ca0, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085, 0x0100,
++	0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2,
++	0x20a3, 0x0888, 0xa18d, 0x0008, 0x21a2, 0x1078, 0x6dea, 0x22a2,
++	0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x027f, 0x007c, 0x0e7e, 0x0d7e, 0x0c7e, 0x057e, 0x047e,
++	0x037e, 0x2061, 0x0100, 0x2071, 0xa600, 0x6130, 0x7818, 0x2068,
++	0x68a0, 0x2028, 0xd0bc, 0x00c0, 0x6cca, 0x6910, 0x6a14, 0x6430,
++	0x0078, 0x6cce, 0x6910, 0x6a14, 0x736c, 0x7470, 0x781c, 0xa086,
++	0x0006, 0x0040, 0x6d2d, 0xd5bc, 0x0040, 0x6cde, 0xa185, 0x0100,
++	0x6062, 0x6266, 0x636a, 0x646e, 0x0078, 0x6ce5, 0xa185, 0x0100,
++	0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x6073, 0x0809, 0x6077,
++	0x0008, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a,
++	0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, 0x7810, 0x2070,
++	0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008, 0x60ca,
++	0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000,
++	0xa582, 0x0080, 0x0048, 0x6d17, 0x6a00, 0xd2f4, 0x0040, 0x6d15,
++	0x6a14, 0xa294, 0x00ff, 0x0078, 0x6d17, 0x2011, 0x0000, 0x629e,
++	0x6017, 0x0016, 0x2009, 0x07d0, 0x60c4, 0xa084, 0xfff0, 0xa005,
++	0x0040, 0x6d24, 0x2009, 0x1b58, 0x1078, 0x5ad0, 0x037f, 0x047f,
++	0x057f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0x7810, 0x2070, 0x704c,
++	0xa084, 0x0003, 0xa086, 0x0002, 0x0040, 0x6d85, 0xd5bc, 0x0040,
++	0x6d41, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e, 0x0078,
++	0x6d48, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e,
++	0x6073, 0x0880, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084, 0x00ff,
++	0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808,
++	0x6082, 0x7060, 0x608a, 0x705c, 0x608e, 0x7080, 0x60c6, 0x707c,
++	0x60ca, 0x707c, 0x792c, 0xa108, 0x792e, 0x7080, 0x7928, 0xa109,
++	0x792a, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7,
++	0x0000, 0xa582, 0x0080, 0x0048, 0x6d80, 0x6a00, 0xd2f4, 0x0040,
++	0x6d7e, 0x6a14, 0xa294, 0x00ff, 0x0078, 0x6d80, 0x2011, 0x0000,
++	0x629e, 0x6017, 0x0012, 0x0078, 0x6d1a, 0xd5bc, 0x0040, 0x6d90,
++	0xa185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, 0x0078, 0x6d97,
++	0xa185, 0x0700, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x1078,
++	0x495f, 0x0040, 0x6dad, 0x0d7e, 0x7810, 0xa06d, 0x684c, 0x0d7f,
++	0xa084, 0x2020, 0xa086, 0x2020, 0x00c0, 0x6dad, 0x7824, 0xc0cd,
++	0x7826, 0x6073, 0x0889, 0x0078, 0x6daf, 0x6073, 0x0898, 0x6077,
++	0x0000, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a,
++	0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, 0x6082, 0x7014, 0x608a,
++	0x7010, 0x608e, 0x700c, 0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce,
++	0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080,
++	0x0048, 0x6ddd, 0x6a00, 0xd2f4, 0x0040, 0x6ddb, 0x6a14, 0xa294,
++	0x00ff, 0x0078, 0x6ddd, 0x2011, 0x0000, 0x629e, 0x7824, 0xd0cc,
++	0x0040, 0x6de6, 0x6017, 0x0016, 0x0078, 0x6d1a, 0x6017, 0x0012,
++	0x0078, 0x6d1a, 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294,
++	0x00ff, 0x2202, 0x8217, 0x007c, 0x0d7e, 0x2069, 0xa8b1, 0x6843,
++	0x0001, 0x0d7f, 0x007c, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7,
++	0x9575, 0x1078, 0x6e06, 0x1078, 0x5ac0, 0x007c, 0x007e, 0x6014,
++	0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x007f, 0x007c, 0x007e,
++	0x0c7e, 0x2061, 0x0100, 0x6014, 0xa084, 0x0004, 0xa085, 0x0008,
++	0x6016, 0x0c7f, 0x007f, 0x007c, 0x0c7e, 0x0d7e, 0x017e, 0x027e,
++	0x2061, 0x0100, 0x2069, 0x0140, 0x6904, 0xa194, 0x4000, 0x0040,
++	0x6e59, 0x1078, 0x6e0f, 0x6803, 0x1000, 0x6803, 0x0000, 0x0c7e,
++	0x2061, 0xa8b1, 0x6128, 0xa192, 0x00c8, 0x00c8, 0x6e44, 0x8108,
++	0x612a, 0x6124, 0x0c7f, 0x81ff, 0x0040, 0x6e54, 0x1078, 0x5ac0,
++	0x1078, 0x6e06, 0x0078, 0x6e54, 0x6124, 0xa1e5, 0x0000, 0x0040,
++	0x6e51, 0x1078, 0xa5c4, 0x1078, 0x5acb, 0x2009, 0x0014, 0x1078,
++	0x775c, 0x0c7f, 0x0078, 0x6e54, 0x027f, 0x017f, 0x0d7f, 0x0c7f,
++	0x007c, 0x2001, 0xa8cd, 0x2004, 0xa005, 0x00c0, 0x6e54, 0x0c7e,
++	0x2061, 0xa8b1, 0x6128, 0xa192, 0x0003, 0x00c8, 0x6e44, 0x8108,
++	0x612a, 0x0c7f, 0x1078, 0x5ac0, 0x1078, 0x4224, 0x0078, 0x6e54,
++	0x0c7e, 0x0d7e, 0x0e7e, 0x017e, 0x027e, 0x1078, 0x5ad8, 0x2071,
++	0xa8b1, 0x713c, 0x81ff, 0x0040, 0x6e9a, 0x2061, 0x0100, 0x2069,
++	0x0140, 0x6904, 0xa194, 0x4000, 0x0040, 0x6ea0, 0x6803, 0x1000,
++	0x6803, 0x0000, 0x037e, 0x2019, 0x0001, 0x1078, 0x7058, 0x037f,
++	0x713c, 0x2160, 0x1078, 0xa5c4, 0x2009, 0x004a, 0x1078, 0x775c,
++	0x0078, 0x6e9a, 0x027f, 0x017f, 0x0e7f, 0x0d7f, 0x0c7f, 0x007c,
++	0x0078, 0x6e8a, 0x0e7e, 0x2071, 0xa8b1, 0x7048, 0xd084, 0x0040,
++	0x6ebc, 0x713c, 0x81ff, 0x0040, 0x6ebc, 0x2071, 0x0100, 0xa188,
++	0x0007, 0x210c, 0xa18e, 0x0006, 0x00c0, 0x6eba, 0x7017, 0x0012,
++	0x0078, 0x6ebc, 0x7017, 0x0016, 0x0e7f, 0x007c, 0x0e7e, 0x0d7e,
++	0x0c7e, 0x067e, 0x057e, 0x047e, 0x007e, 0x127e, 0x2091, 0x8000,
++	0x6018, 0x2068, 0x6ca0, 0x2071, 0xa8b1, 0x7018, 0x2068, 0x8dff,
++	0x0040, 0x6ee6, 0x68a0, 0xa406, 0x0040, 0x6eda, 0x6854, 0x2068,
++	0x0078, 0x6ecf, 0x6010, 0x2060, 0x643c, 0x6540, 0x6648, 0x2d60,
++	0x1078, 0x4736, 0x0040, 0x6ee6, 0xa085, 0x0001, 0x127f, 0x007f,
++	0x047f, 0x057f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0x20a1,
++	0x020b, 0x1078, 0x6731, 0x20a3, 0x1200, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x781c, 0xa086, 0x0004, 0x00c0, 0x6f01, 0x6098, 0x0078,
++	0x6f02, 0x6030, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a9,
++	0x0010, 0xa006, 0x20a2, 0x00f0, 0x6f0a, 0x20a2, 0x20a2, 0x60c3,
++	0x002c, 0x1078, 0x6dfb, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b,
++	0x1078, 0x6731, 0x20a3, 0x0f00, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x7808, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x147f, 0x157f,
++	0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3,
++	0x0200, 0x20a3, 0x0000, 0x20a9, 0x0006, 0x2011, 0xa640, 0x2019,
++	0xa641, 0x23a6, 0x22a6, 0xa398, 0x0002, 0xa290, 0x0002, 0x00f0,
++	0x6f39, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x1078,
++	0x6dfb, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x017e, 0x027e,
++	0x20a1, 0x020b, 0x1078, 0x6799, 0x1078, 0x67b0, 0x7810, 0xa080,
++	0x0000, 0x2004, 0xa080, 0x0015, 0x2098, 0x7808, 0xa088, 0x0002,
++	0x21a8, 0x53a6, 0xa080, 0x0004, 0x8003, 0x60c2, 0x1078, 0x6dfb,
++	0x027f, 0x017f, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x20a1,
++	0x020b, 0x1078, 0x6731, 0x20a3, 0x6200, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x147f,
++	0x157f, 0x007c, 0x157e, 0x147e, 0x017e, 0x027e, 0x20a1, 0x020b,
++	0x1078, 0x6731, 0x7810, 0xa080, 0x0000, 0x2004, 0xa080, 0x0017,
++	0x2098, 0x7808, 0xa088, 0x0002, 0x21a8, 0x53a6, 0x8003, 0x60c2,
++	0x1078, 0x6dfb, 0x027f, 0x017f, 0x147f, 0x157f, 0x007c, 0x0e7e,
++	0x0c7e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa8b1, 0x700c,
++	0x2060, 0x8cff, 0x0040, 0x6fbb, 0x1078, 0x8f00, 0x00c0, 0x6fb2,
++	0x1078, 0x7c83, 0x600c, 0x007e, 0x1078, 0x772d, 0x1078, 0x7233,
++	0x0c7f, 0x0078, 0x6fa9, 0x700f, 0x0000, 0x700b, 0x0000, 0x127f,
++	0x007f, 0x0c7f, 0x0e7f, 0x007c, 0x127e, 0x157e, 0x0f7e, 0x0e7e,
++	0x0d7e, 0x0c7e, 0x027e, 0x017e, 0x007e, 0x2091, 0x8000, 0x2069,
++	0x0100, 0x2079, 0x0140, 0x2071, 0xa8b1, 0x7024, 0x2060, 0x8cff,
++	0x0040, 0x7014, 0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x5acb,
++	0x2009, 0x0013, 0x1078, 0x775c, 0x20a9, 0x01f4, 0x6824, 0xd094,
++	0x0040, 0x6ff7, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x0040,
++	0x7009, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0x7009, 0xd084,
++	0x0040, 0x6ffe, 0x6827, 0x0001, 0x0078, 0x7000, 0x00f0, 0x6fe6,
++	0x7804, 0xa084, 0x1000, 0x0040, 0x7009, 0x7803, 0x0100, 0x7803,
++	0x0000, 0x6824, 0x007f, 0x017f, 0x027f, 0x0c7f, 0x0d7f, 0x0e7f,
++	0x0f7f, 0x157f, 0x127f, 0x007c, 0x2001, 0xa600, 0x2004, 0xa096,
++	0x0001, 0x0040, 0x704e, 0xa096, 0x0004, 0x0040, 0x704e, 0x1078,
++	0x5acb, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x41dc, 0x1078,
++	0x5a45, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0040, 0x703c, 0x6827,
++	0x0004, 0x7804, 0xa084, 0x4000, 0x0040, 0x704e, 0x7803, 0x1000,
++	0x7803, 0x0000, 0x0078, 0x704e, 0xd084, 0x0040, 0x7043, 0x6827,
++	0x0001, 0x0078, 0x7045, 0x00f0, 0x702b, 0x7804, 0xa084, 0x1000,
++	0x0040, 0x704e, 0x7803, 0x0100, 0x7803, 0x0000, 0x007f, 0x017f,
++	0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c,
++	0x127e, 0x157e, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x027e, 0x017e,
++	0x007e, 0x2091, 0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071,
++	0xa8b1, 0x703c, 0x2060, 0x8cff, 0x0040, 0x70d6, 0x68af, 0x95f5,
++	0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, 0x00c0, 0x7074, 0x68c7,
++	0x0000, 0x68cb, 0x0008, 0x1078, 0x5ad8, 0x1078, 0x1f7e, 0x047e,
++	0x057e, 0x2009, 0x017f, 0x212c, 0x200b, 0x00a5, 0x2021, 0x0169,
++	0x2404, 0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x70a5, 0x68c7,
++	0x0000, 0x68cb, 0x0008, 0x0e7e, 0x0f7e, 0x2079, 0x0020, 0x2071,
++	0xa908, 0x6814, 0xa084, 0x0004, 0xa085, 0x0012, 0x6816, 0x7803,
++	0x0008, 0x7003, 0x0000, 0x0f7f, 0x0e7f, 0x250a, 0x057f, 0x047f,
++	0xa39d, 0x0000, 0x00c0, 0x70b0, 0x2009, 0x0049, 0x1078, 0x775c,
++	0x20a9, 0x03e8, 0x6824, 0xd094, 0x0040, 0x70c3, 0x6827, 0x0004,
++	0x7804, 0xa084, 0x4000, 0x0040, 0x70d5, 0x7803, 0x1000, 0x7803,
++	0x0000, 0x0078, 0x70d5, 0xd08c, 0x0040, 0x70ca, 0x6827, 0x0002,
++	0x0078, 0x70cc, 0x00f0, 0x70b2, 0x7804, 0xa084, 0x1000, 0x0040,
++	0x70d5, 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, 0x007f, 0x017f,
++	0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c,
++	0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0xa8b1, 0x6a06, 0x127f,
++	0x0d7f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0xa8b1,
++	0x6a32, 0x127f, 0x0d7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e,
++	0x007e, 0x127e, 0x2071, 0xa8b1, 0x7614, 0x2660, 0x2678, 0x2091,
++	0x8000, 0x8cff, 0x0040, 0x7134, 0x601c, 0xa206, 0x00c0, 0x712f,
++	0x7014, 0xac36, 0x00c0, 0x710e, 0x660c, 0x7616, 0x7010, 0xac36,
++	0x00c0, 0x711c, 0x2c00, 0xaf36, 0x0040, 0x711a, 0x2f00, 0x7012,
++	0x0078, 0x711c, 0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06,
++	0x0040, 0x7125, 0x7e0e, 0x0078, 0x7126, 0x2678, 0x600f, 0x0000,
++	0x1078, 0x8ec6, 0x1078, 0x7233, 0x0c7f, 0x0078, 0x7101, 0x2c78,
++	0x600c, 0x2060, 0x0078, 0x7101, 0x127f, 0x007f, 0x067f, 0x0c7f,
++	0x0e7f, 0x0f7f, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078,
++	0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2,
++	0x20a3, 0x1000, 0x0078, 0x718e, 0x157e, 0x147e, 0x20a1, 0x020b,
++	0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2,
++	0x20a2, 0x20a3, 0x4000, 0x0078, 0x718e, 0x157e, 0x147e, 0x20a1,
++	0x020b, 0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2,
++	0x20a2, 0x20a2, 0x20a3, 0x2000, 0x0078, 0x718e, 0x157e, 0x147e,
++	0x20a1, 0x020b, 0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2,
++	0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078, 0x718e, 0x157e,
++	0x147e, 0x20a1, 0x020b, 0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006,
++	0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, 0x1078, 0x723e,
++	0x60c3, 0x0020, 0x1078, 0x6dfb, 0x147f, 0x157f, 0x007c, 0x127e,
++	0x0c7e, 0x2091, 0x8000, 0x2061, 0x0100, 0x6120, 0xd1b4, 0x00c0,
++	0x71a6, 0xd1bc, 0x00c0, 0x71f0, 0x0078, 0x7230, 0x2009, 0x017f,
++	0x200b, 0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069, 0x0140, 0x20a9,
++	0x001e, 0x2009, 0x0169, 0x6804, 0xa084, 0x4000, 0x0040, 0x71e7,
++	0x6020, 0xd0b4, 0x0040, 0x71e7, 0x6024, 0xd094, 0x00c0, 0x71e7,
++	0x2104, 0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x71e7, 0x00f0,
++	0x71b3, 0x027e, 0x6198, 0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c,
++	0x00ff, 0xa10d, 0x6088, 0x628c, 0x618e, 0x608b, 0xbc91, 0x6043,
++	0x0001, 0x6043, 0x0000, 0x608a, 0x628e, 0x6024, 0xd094, 0x00c0,
++	0x71e6, 0x6a04, 0xa294, 0x4000, 0x00c0, 0x71dd, 0x027f, 0x0d7f,
++	0x007f, 0x157f, 0x2009, 0x017f, 0x200b, 0x0000, 0x0078, 0x7230,
++	0x2009, 0x017f, 0x200b, 0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069,
++	0x0140, 0x20a9, 0x001e, 0x2009, 0x0169, 0x6804, 0xa084, 0x4000,
++	0x0040, 0x7229, 0x6020, 0xd0bc, 0x0040, 0x7229, 0x2104, 0xa084,
++	0x000f, 0xa086, 0x0004, 0x00c0, 0x7229, 0x00f0, 0x71fd, 0x027e,
++	0x6164, 0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, 0x00ff, 0xa10d,
++	0x6088, 0x628c, 0x608b, 0xbc91, 0x618e, 0x6043, 0x0001, 0x6043,
++	0x0000, 0x608a, 0x628e, 0x6a04, 0xa294, 0x4000, 0x00c0, 0x7223,
++	0x027f, 0x0d7f, 0x007f, 0x157f, 0x2009, 0x017f, 0x200b, 0x0000,
++	0x0c7f, 0x127f, 0x007c, 0x0e7e, 0x2071, 0xa8b1, 0x7020, 0xa005,
++	0x0040, 0x723c, 0x8001, 0x7022, 0x0e7f, 0x007c, 0x20a9, 0x0008,
++	0x20a2, 0x00f0, 0x7240, 0x20a2, 0x20a2, 0x007c, 0x0f7e, 0x0e7e,
++	0x0d7e, 0x0c7e, 0x077e, 0x067e, 0x007e, 0x127e, 0x2091, 0x8000,
++	0x2071, 0xa8b1, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff,
++	0x0040, 0x72e2, 0x8cff, 0x0040, 0x72e2, 0x601c, 0xa086, 0x0006,
++	0x00c0, 0x72dd, 0x88ff, 0x0040, 0x726d, 0x2800, 0xac06, 0x00c0,
++	0x72dd, 0x2039, 0x0000, 0x0078, 0x7278, 0x6018, 0xa206, 0x00c0,
++	0x72dd, 0x85ff, 0x0040, 0x7278, 0x6020, 0xa106, 0x00c0, 0x72dd,
++	0x7024, 0xac06, 0x00c0, 0x72a8, 0x2069, 0x0100, 0x68c0, 0xa005,
++	0x0040, 0x72a3, 0x1078, 0x5acb, 0x6817, 0x0008, 0x68c3, 0x0000,
++	0x1078, 0x7378, 0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04,
++	0xa384, 0x1000, 0x0040, 0x7298, 0x6803, 0x0100, 0x6803, 0x0000,
++	0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x72a0, 0x6827, 0x0001,
++	0x037f, 0x0078, 0x72a8, 0x6003, 0x0009, 0x630a, 0x0078, 0x72dd,
++	0x7014, 0xac36, 0x00c0, 0x72ae, 0x660c, 0x7616, 0x7010, 0xac36,
++	0x00c0, 0x72bc, 0x2c00, 0xaf36, 0x0040, 0x72ba, 0x2f00, 0x7012,
++	0x0078, 0x72bc, 0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06,
++	0x0040, 0x72c5, 0x7e0e, 0x0078, 0x72c6, 0x2678, 0x89ff, 0x00c0,
++	0x72d5, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040,
++	0x72d3, 0x1078, 0xa1ca, 0x1078, 0x8ec6, 0x1078, 0x7233, 0x88ff,
++	0x00c0, 0x72ec, 0x0c7f, 0x0078, 0x7257, 0x2c78, 0x600c, 0x2060,
++	0x0078, 0x7257, 0xa006, 0x127f, 0x007f, 0x067f, 0x077f, 0x0c7f,
++	0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x6017, 0x0000, 0x0c7f, 0xa8c5,
++	0x0001, 0x0078, 0x72e3, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e,
++	0x027e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa8b1, 0x7638,
++	0x2660, 0x2678, 0x8cff, 0x0040, 0x7367, 0x601c, 0xa086, 0x0006,
++	0x00c0, 0x7362, 0x87ff, 0x0040, 0x7313, 0x2700, 0xac06, 0x00c0,
++	0x7362, 0x0078, 0x731e, 0x6018, 0xa206, 0x00c0, 0x7362, 0x85ff,
++	0x0040, 0x731e, 0x6020, 0xa106, 0x00c0, 0x7362, 0x703c, 0xac06,
++	0x00c0, 0x7332, 0x037e, 0x2019, 0x0001, 0x1078, 0x7058, 0x7033,
++	0x0000, 0x703f, 0x0000, 0x7043, 0x0000, 0x7047, 0x0000, 0x704b,
++	0x0000, 0x037f, 0x7038, 0xac36, 0x00c0, 0x7338, 0x660c, 0x763a,
++	0x7034, 0xac36, 0x00c0, 0x7346, 0x2c00, 0xaf36, 0x0040, 0x7344,
++	0x2f00, 0x7036, 0x0078, 0x7346, 0x7037, 0x0000, 0x660c, 0x067e,
++	0x2c00, 0xaf06, 0x0040, 0x734f, 0x7e0e, 0x0078, 0x7350, 0x2678,
++	0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x735a,
++	0x1078, 0xa1ca, 0x1078, 0x8ec6, 0x87ff, 0x00c0, 0x7371, 0x0c7f,
++	0x0078, 0x7302, 0x2c78, 0x600c, 0x2060, 0x0078, 0x7302, 0xa006,
++	0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f,
++	0x007c, 0x6017, 0x0000, 0x0c7f, 0xa7bd, 0x0001, 0x0078, 0x7368,
++	0x0e7e, 0x2071, 0xa8b1, 0x2001, 0xa600, 0x2004, 0xa086, 0x0002,
++	0x00c0, 0x7386, 0x7007, 0x0005, 0x0078, 0x7388, 0x7007, 0x0000,
++	0x0e7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e, 0x027e, 0x007e,
++	0x127e, 0x2091, 0x8000, 0x2071, 0xa8b1, 0x2c10, 0x7638, 0x2660,
++	0x2678, 0x8cff, 0x0040, 0x73c8, 0x2200, 0xac06, 0x00c0, 0x73c3,
++	0x7038, 0xac36, 0x00c0, 0x73a6, 0x660c, 0x763a, 0x7034, 0xac36,
++	0x00c0, 0x73b4, 0x2c00, 0xaf36, 0x0040, 0x73b2, 0x2f00, 0x7036,
++	0x0078, 0x73b4, 0x7037, 0x0000, 0x660c, 0x2c00, 0xaf06, 0x0040,
++	0x73bc, 0x7e0e, 0x0078, 0x73bd, 0x2678, 0x600f, 0x0000, 0xa085,
++	0x0001, 0x0078, 0x73c8, 0x2c78, 0x600c, 0x2060, 0x0078, 0x7399,
++	0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c,
++	0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x007e, 0x127e, 0x2091,
++	0x8000, 0x2071, 0xa8b1, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0040,
++	0x7469, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x00c0, 0x7464,
++	0x7024, 0xac06, 0x00c0, 0x740f, 0x2069, 0x0100, 0x68c0, 0xa005,
++	0x0040, 0x743d, 0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378,
++	0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000,
++	0x0040, 0x7406, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
++	0x6824, 0xd084, 0x0040, 0x740e, 0x6827, 0x0001, 0x037f, 0x700c,
++	0xac36, 0x00c0, 0x7415, 0x660c, 0x760e, 0x7008, 0xac36, 0x00c0,
++	0x7423, 0x2c00, 0xaf36, 0x0040, 0x7421, 0x2f00, 0x700a, 0x0078,
++	0x7423, 0x700b, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040,
++	0x742c, 0x7e0e, 0x0078, 0x742d, 0x2678, 0x600f, 0x0000, 0x1078,
++	0x8eec, 0x00c0, 0x7441, 0x1078, 0x28a6, 0x1078, 0x8f00, 0x00c0,
++	0x745d, 0x1078, 0x7c83, 0x0078, 0x745d, 0x1078, 0x7378, 0x0078,
++	0x740f, 0x1078, 0x8f00, 0x00c0, 0x7449, 0x1078, 0x7c83, 0x0078,
++	0x745d, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x745d, 0x601c,
++	0xa086, 0x0003, 0x00c0, 0x7471, 0x6837, 0x0103, 0x6b4a, 0x6847,
++	0x0000, 0x1078, 0x4a73, 0x1078, 0x8eb9, 0x1078, 0x8ec6, 0x1078,
++	0x7233, 0x0c7f, 0x0078, 0x73de, 0x2c78, 0x600c, 0x2060, 0x0078,
++	0x73de, 0x127f, 0x007f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f,
++	0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x745d, 0x1078, 0xa1ca,
++	0x0078, 0x745d, 0x037e, 0x157e, 0x137e, 0x147e, 0x3908, 0xa006,
++	0xa190, 0x0020, 0x221c, 0xa39e, 0x2676, 0x00c0, 0x748b, 0x8210,
++	0x8000, 0x0078, 0x7482, 0xa005, 0x0040, 0x7497, 0x20a9, 0x0020,
++	0x2198, 0x8211, 0xa282, 0x0020, 0x20c8, 0x20a0, 0x53a3, 0x147f,
++	0x137f, 0x157f, 0x037f, 0x007c, 0x0d7e, 0x20a1, 0x020b, 0x1078,
++	0x67c2, 0x20a3, 0x0200, 0x20a3, 0x0014, 0x60c3, 0x0014, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x2099, 0xa8a5, 0x20a9, 0x0004, 0x53a6,
++	0x20a3, 0x0004, 0x20a3, 0x7878, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x1078, 0x6dfb, 0x0d7f, 0x007c, 0x20a1, 0x020b, 0x1078, 0x67c2,
++	0x20a3, 0x0214, 0x20a3, 0x0018, 0x20a3, 0x0800, 0x7810, 0xa084,
++	0xff00, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x7810, 0xa084, 0x00ff, 0x20a2, 0x7828, 0x20a2,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0018, 0x1078, 0x6dfb,
++	0x007c, 0x0d7e, 0x017e, 0x2f68, 0x2009, 0x0035, 0x1078, 0x91bc,
++	0x00c0, 0x7551, 0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x1300,
++	0x20a3, 0x0000, 0x7828, 0x2068, 0x681c, 0xa086, 0x0003, 0x0040,
++	0x752d, 0x7818, 0xa080, 0x0028, 0x2014, 0xa286, 0x007e, 0x00c0,
++	0x7507, 0x20a3, 0x00ff, 0x20a3, 0xfffe, 0x0078, 0x7542, 0xa286,
++	0x007f, 0x00c0, 0x7511, 0x20a3, 0x00ff, 0x20a3, 0xfffd, 0x0078,
++	0x7542, 0xd2bc, 0x0040, 0x7527, 0xa286, 0x0080, 0x00c0, 0x751e,
++	0x20a3, 0x00ff, 0x20a3, 0xfffc, 0x0078, 0x7542, 0xa2e8, 0xa735,
++	0x2d6c, 0x6810, 0x20a2, 0x6814, 0x20a2, 0x0078, 0x7542, 0x20a3,
++	0x0000, 0x6098, 0x20a2, 0x0078, 0x7542, 0x7818, 0xa080, 0x0028,
++	0x2004, 0xa082, 0x007e, 0x0048, 0x753e, 0x0d7e, 0x2069, 0xa61b,
++	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x7542, 0x20a3, 0x0000,
++	0x6030, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x60c3, 0x000c, 0x1078, 0x6dfb, 0x017f, 0x0d7f,
++	0x007c, 0x7817, 0x0001, 0x7803, 0x0006, 0x017f, 0x0d7f, 0x007c,
++	0x0d7e, 0x027e, 0x7928, 0x2168, 0x691c, 0xa186, 0x0006, 0x0040,
++	0x757a, 0xa186, 0x0003, 0x0040, 0x75d5, 0xa186, 0x0005, 0x0040,
++	0x75b8, 0xa186, 0x0004, 0x0040, 0x75a8, 0xa186, 0x0008, 0x0040,
++	0x75c2, 0x7807, 0x0037, 0x7813, 0x1700, 0x1078, 0x7640, 0x027f,
++	0x0d7f, 0x007c, 0x1078, 0x75fd, 0x2009, 0x4000, 0x6800, 0x0079,
++	0x7581, 0x7594, 0x75a2, 0x7596, 0x75a2, 0x759d, 0x7594, 0x7594,
++	0x75a2, 0x75a2, 0x75a2, 0x75a2, 0x7594, 0x7594, 0x7594, 0x7594,
++	0x7594, 0x75a2, 0x7594, 0x75a2, 0x1078, 0x1332, 0x6824, 0xd0e4,
++	0x0040, 0x759d, 0xd0cc, 0x0040, 0x75a0, 0xa00e, 0x0078, 0x75a2,
++	0x2009, 0x2000, 0x6828, 0x20a2, 0x682c, 0x20a2, 0x0078, 0x75f3,
++	0x1078, 0x75fd, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, 0x4000,
++	0x6a00, 0xa286, 0x0002, 0x00c0, 0x75b6, 0xa00e, 0x0078, 0x75f3,
++	0x1078, 0x75fd, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, 0x4000,
++	0x0078, 0x75f3, 0x1078, 0x75fd, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x2009, 0x4000, 0xa286, 0x0005, 0x0040, 0x75d2, 0xa286, 0x0002,
++	0x00c0, 0x75d3, 0xa00e, 0x0078, 0x75f3, 0x1078, 0x75fd, 0x6810,
++	0x2068, 0x697c, 0x6810, 0xa112, 0x6980, 0x6814, 0xa103, 0x20a2,
++	0x22a2, 0x7928, 0xa180, 0x0000, 0x2004, 0xa08e, 0x0002, 0x0040,
++	0x75f1, 0xa08e, 0x0004, 0x0040, 0x75f1, 0x2009, 0x4000, 0x0078,
++	0x75f3, 0x2009, 0x0000, 0x21a2, 0x20a3, 0x0000, 0x60c3, 0x0018,
++	0x1078, 0x6dfb, 0x027f, 0x0d7f, 0x007c, 0x037e, 0x047e, 0x057e,
++	0x067e, 0x20a1, 0x020b, 0x1078, 0x67c2, 0xa006, 0x20a3, 0x0200,
++	0x20a2, 0x7934, 0x21a2, 0x7938, 0x21a2, 0x7818, 0xa080, 0x0028,
++	0x2004, 0xa092, 0x007e, 0x0048, 0x7623, 0x0d7e, 0x2069, 0xa61b,
++	0x2d2c, 0x8d68, 0x2d34, 0xa0e8, 0xa735, 0x2d6c, 0x6b10, 0x6c14,
++	0x0d7f, 0x0078, 0x7629, 0x2019, 0x0000, 0x6498, 0x2029, 0x0000,
++	0x6630, 0x7828, 0xa080, 0x0007, 0x2004, 0xa086, 0x0003, 0x00c0,
++	0x7637, 0x25a2, 0x26a2, 0x23a2, 0x24a2, 0x0078, 0x763b, 0x23a2,
++	0x24a2, 0x25a2, 0x26a2, 0x067f, 0x057f, 0x047f, 0x037f, 0x007c,
++	0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000,
++	0x20a3, 0x0009, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb,
++	0x007c, 0x20a1, 0x020b, 0x1078, 0x6728, 0x20a3, 0x1400, 0x20a3,
++	0x0000, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x7828, 0x20a2, 0x782c,
++	0x20a2, 0x7830, 0xa084, 0x00ff, 0x8007, 0x20a2, 0x20a3, 0x0000,
++	0x60c3, 0x0010, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078,
++	0x67b9, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0x20a2, 0x7810,
++	0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c, 0x147e, 0x20a1,
++	0x020b, 0x1078, 0x7689, 0x60c3, 0x0000, 0x1078, 0x6dfb, 0x147f,
++	0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++	0x2004, 0xd0bc, 0x0040, 0x76a6, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c,
++	0x6810, 0xa085, 0x0300, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b,
++	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x76ae, 0x20a3, 0x0300,
++	0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0819,
++	0x20a3, 0x0000, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, 0x2fa2,
++	0x7a08, 0x22a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x007c, 0x2061,
++	0xad00, 0x2a70, 0x7064, 0x704a, 0x704f, 0xad00, 0x007c, 0x0e7e,
++	0x127e, 0x2071, 0xa600, 0x2091, 0x8000, 0x7548, 0xa582, 0x0010,
++	0x0048, 0x76f9, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0040,
++	0x76e5, 0xace0, 0x0010, 0x7058, 0xac02, 0x00c8, 0x76e1, 0x0078,
++	0x76d4, 0x2061, 0xad00, 0x0078, 0x76d4, 0x6003, 0x0008, 0x8529,
++	0x754a, 0xaca8, 0x0010, 0x7058, 0xa502, 0x00c8, 0x76f5, 0x754e,
++	0xa085, 0x0001, 0x127f, 0x0e7f, 0x007c, 0x704f, 0xad00, 0x0078,
++	0x76f0, 0xa006, 0x0078, 0x76f2, 0x0e7e, 0x2071, 0xa600, 0x7548,
++	0xa582, 0x0010, 0x0048, 0x772a, 0x704c, 0x2060, 0x6000, 0xa086,
++	0x0000, 0x0040, 0x7717, 0xace0, 0x0010, 0x7058, 0xac02, 0x00c8,
++	0x7713, 0x0078, 0x7706, 0x2061, 0xad00, 0x0078, 0x7706, 0x6003,
++	0x0008, 0x8529, 0x754a, 0xaca8, 0x0010, 0x7058, 0xa502, 0x00c8,
++	0x7726, 0x754e, 0xa085, 0x0001, 0x0e7f, 0x007c, 0x704f, 0xad00,
++	0x0078, 0x7722, 0xa006, 0x0078, 0x7724, 0xac82, 0xad00, 0x1048,
++	0x1332, 0x2001, 0xa616, 0x2004, 0xac02, 0x10c8, 0x1332, 0xa006,
++	0x6006, 0x600a, 0x600e, 0x6012, 0x6016, 0x601a, 0x601f, 0x0000,
++	0x6003, 0x0000, 0x6022, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036,
++	0x603a, 0x603e, 0x2061, 0xa600, 0x6048, 0x8000, 0x604a, 0xa086,
++	0x0001, 0x0040, 0x7754, 0x007c, 0x127e, 0x2091, 0x8000, 0x1078,
++	0x62d1, 0x127f, 0x0078, 0x7753, 0x601c, 0xa084, 0x000f, 0x0079,
++	0x7761, 0x776a, 0x777b, 0x7797, 0x77b3, 0x920e, 0x922a, 0x9246,
++	0x776a, 0x777b, 0xa186, 0x0013, 0x00c0, 0x7773, 0x1078, 0x61cd,
++	0x1078, 0x62d1, 0x007c, 0xa18e, 0x0047, 0x00c0, 0x777a, 0xa016,
++	0x1078, 0x15fa, 0x007c, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8,
++	0x1332, 0x1079, 0x7785, 0x067f, 0x007c, 0x7795, 0x7b00, 0x7cb2,
++	0x7795, 0x7d36, 0x77cf, 0x7795, 0x7795, 0x7a92, 0x80f6, 0x7795,
++	0x7795, 0x7795, 0x7795, 0x7795, 0x7795, 0x1078, 0x1332, 0x067e,
++	0x6000, 0xa0b2, 0x0010, 0x10c8, 0x1332, 0x1079, 0x77a1, 0x067f,
++	0x007c, 0x77b1, 0x87c3, 0x77b1, 0x77b1, 0x77b1, 0x77b1, 0x77b1,
++	0x77b1, 0x8766, 0x8951, 0x77b1, 0x87f3, 0x8879, 0x87f3, 0x8879,
++	0x77b1, 0x1078, 0x1332, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8,
++	0x1332, 0x1079, 0x77bd, 0x067f, 0x007c, 0x77cd, 0x813d, 0x820e,
++	0x8368, 0x84e4, 0x77cd, 0x77cd, 0x77cd, 0x8116, 0x870e, 0x8712,
++	0x77cd, 0x77cd, 0x77cd, 0x77cd, 0x8742, 0x1078, 0x1332, 0xa1b6,
++	0x0015, 0x00c0, 0x77d7, 0x1078, 0x772d, 0x0078, 0x77dd, 0xa1b6,
++	0x0016, 0x10c0, 0x1332, 0x1078, 0x772d, 0x007c, 0x20a9, 0x000e,
++	0x2e98, 0x6010, 0x20a0, 0x53a3, 0x20a9, 0x0006, 0x3310, 0x3420,
++	0x9398, 0x94a0, 0x3318, 0x3428, 0x222e, 0x2326, 0xa290, 0x0002,
++	0xa5a8, 0x0002, 0xa398, 0x0002, 0xa4a0, 0x0002, 0x00f0, 0x77ec,
++	0x0e7e, 0x1078, 0x8d06, 0x0040, 0x7803, 0x6010, 0x2070, 0x7007,
++	0x0000, 0x7037, 0x0103, 0x0e7f, 0x1078, 0x772d, 0x007c, 0x0d7e,
++	0x037e, 0x7330, 0xa386, 0x0200, 0x00c0, 0x7814, 0x6018, 0x2068,
++	0x6813, 0x00ff, 0x6817, 0xfffd, 0x6010, 0xa005, 0x0040, 0x781e,
++	0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6b32, 0x1078, 0x772d,
++	0x037f, 0x0d7f, 0x007c, 0x017e, 0x20a9, 0x002a, 0xae80, 0x000c,
++	0x2098, 0x6010, 0xa080, 0x0002, 0x20a0, 0x53a3, 0x20a9, 0x002a,
++	0x6010, 0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x20a0, 0x53a3,
++	0x0e7e, 0x6010, 0x2004, 0x2070, 0x7037, 0x0103, 0x0e7f, 0x1078,
++	0x772d, 0x017f, 0x007c, 0x0e7e, 0x0d7e, 0x603f, 0x0000, 0x2c68,
++	0x017e, 0x2009, 0x0035, 0x1078, 0x91bc, 0x017f, 0x00c0, 0x785f,
++	0x027e, 0x6228, 0x2268, 0x027f, 0x2071, 0xab8c, 0x6b1c, 0xa386,
++	0x0003, 0x0040, 0x7863, 0xa386, 0x0006, 0x0040, 0x7867, 0x1078,
++	0x772d, 0x0078, 0x7869, 0x1078, 0x786c, 0x0078, 0x7869, 0x1078,
++	0x7938, 0x0d7f, 0x0e7f, 0x007c, 0x0f7e, 0x6810, 0x2078, 0xa186,
++	0x0015, 0x0040, 0x791d, 0xa18e, 0x0016, 0x00c0, 0x7936, 0x700c,
++	0xa08c, 0xff00, 0xa186, 0x1700, 0x0040, 0x7882, 0xa186, 0x0300,
++	0x00c0, 0x78f8, 0x8fff, 0x00c0, 0x788c, 0x6800, 0xa086, 0x000f,
++	0x0040, 0x78db, 0x0078, 0x7934, 0x6808, 0xa086, 0xffff, 0x00c0,
++	0x7921, 0x784c, 0xa084, 0x0060, 0xa086, 0x0020, 0x00c0, 0x78a2,
++	0x797c, 0x7810, 0xa106, 0x00c0, 0x7921, 0x7980, 0x7814, 0xa106,
++	0x00c0, 0x7921, 0x1078, 0x8eb9, 0x6830, 0x7852, 0x784c, 0xc0dc,
++	0xc0f4, 0xc0d4, 0x784e, 0x027e, 0xa00e, 0x6a14, 0x2001, 0x000a,
++	0x1078, 0x5c1c, 0x7854, 0xa20a, 0x0048, 0x78b7, 0x8011, 0x7a56,
++	0x82ff, 0x027f, 0x00c0, 0x78c3, 0x0c7e, 0x2d60, 0x1078, 0x8ae0,
++	0x0c7f, 0x0078, 0x7934, 0x0c7e, 0x0d7e, 0x2f68, 0x6838, 0xd0fc,
++	0x00c0, 0x78ce, 0x1078, 0x4353, 0x0078, 0x78d0, 0x1078, 0x4431,
++	0x0d7f, 0x0c7f, 0x00c0, 0x7921, 0x0c7e, 0x2d60, 0x1078, 0x772d,
++	0x0c7f, 0x0078, 0x7934, 0x0c7e, 0x1078, 0x9187, 0x0040, 0x78f1,
++	0x6013, 0x0000, 0x6818, 0x601a, 0x601f, 0x0003, 0x6904, 0x0c7e,
++	0x2d60, 0x1078, 0x772d, 0x0c7f, 0x1078, 0x775c, 0x0c7f, 0x0078,
++	0x7934, 0x2001, 0xa8a4, 0x2004, 0x683e, 0x0c7f, 0x0078, 0x7934,
++	0x7008, 0xa086, 0x000b, 0x00c0, 0x7912, 0x6018, 0x200c, 0xc1bc,
++	0x2102, 0x0c7e, 0x2d60, 0x7853, 0x0003, 0x6007, 0x0085, 0x6003,
++	0x000b, 0x601f, 0x0002, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7f,
++	0x0078, 0x7934, 0x700c, 0xa086, 0x2a00, 0x00c0, 0x7921, 0x2001,
++	0xa8a4, 0x2004, 0x683e, 0x0078, 0x7934, 0x1078, 0x7953, 0x0078,
++	0x7936, 0x8fff, 0x1040, 0x1332, 0x0c7e, 0x0d7e, 0x2d60, 0x2f68,
++	0x6837, 0x0103, 0x684b, 0x0003, 0x1078, 0x89cf, 0x1078, 0x8eb9,
++	0x1078, 0x8ec6, 0x0d7f, 0x0c7f, 0x1078, 0x772d, 0x0f7f, 0x007c,
++	0xa186, 0x0015, 0x00c0, 0x7942, 0x2001, 0xa8a4, 0x2004, 0x683e,
++	0x0078, 0x7950, 0xa18e, 0x0016, 0x00c0, 0x7952, 0x0c7e, 0x2d00,
++	0x2060, 0x1078, 0xa495, 0x1078, 0x5bc1, 0x1078, 0x772d, 0x0c7f,
++	0x1078, 0x772d, 0x007c, 0x027e, 0x037e, 0x047e, 0x7228, 0x7c80,
++	0x7b7c, 0xd2f4, 0x0040, 0x7962, 0x2001, 0xa8a4, 0x2004, 0x683e,
++	0x0078, 0x79c6, 0x0c7e, 0x2d60, 0x1078, 0x89f3, 0x0c7f, 0x6804,
++	0xa086, 0x0050, 0x00c0, 0x797a, 0x0c7e, 0x2d00, 0x2060, 0x6003,
++	0x0001, 0x6007, 0x0050, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7f,
++	0x0078, 0x79c6, 0x6800, 0xa086, 0x000f, 0x0040, 0x799c, 0x8fff,
++	0x1040, 0x1332, 0x6824, 0xd0dc, 0x00c0, 0x799c, 0x6800, 0xa086,
++	0x0004, 0x00c0, 0x79a1, 0x784c, 0xd0ac, 0x0040, 0x79a1, 0x784c,
++	0xc0dc, 0xc0f4, 0x784e, 0x7850, 0xc0f4, 0xc0fc, 0x7852, 0x2001,
++	0x0001, 0x682e, 0x0078, 0x79c0, 0x2001, 0x0007, 0x682e, 0x0078,
++	0x79c0, 0x784c, 0xd0b4, 0x00c0, 0x79ae, 0xd0ac, 0x0040, 0x799c,
++	0x784c, 0xd0f4, 0x00c0, 0x799c, 0x0078, 0x798f, 0xd2ec, 0x00c0,
++	0x799c, 0x7024, 0xa306, 0x00c0, 0x79b9, 0x7020, 0xa406, 0x0040,
++	0x799c, 0x7020, 0x6836, 0x7024, 0x683a, 0x2001, 0x0005, 0x682e,
++	0x1078, 0x8ff0, 0x1078, 0x62d1, 0x0078, 0x79c8, 0x1078, 0x772d,
++	0x047f, 0x037f, 0x027f, 0x007c, 0x0e7e, 0x0d7e, 0x027e, 0x6034,
++	0x2068, 0x6a1c, 0xa286, 0x0007, 0x0040, 0x7a35, 0xa286, 0x0002,
++	0x0040, 0x7a35, 0xa286, 0x0000, 0x0040, 0x7a35, 0x6808, 0x6338,
++	0xa306, 0x00c0, 0x7a35, 0x2071, 0xab8c, 0xa186, 0x0015, 0x0040,
++	0x7a2f, 0xa18e, 0x0016, 0x00c0, 0x7a02, 0x6030, 0xa084, 0x00ff,
++	0xa086, 0x0001, 0x00c0, 0x7a02, 0x700c, 0xa086, 0x2a00, 0x00c0,
++	0x7a02, 0x6034, 0xa080, 0x0009, 0x200c, 0xc1dd, 0xc1f5, 0x2102,
++	0x0078, 0x7a2f, 0x0c7e, 0x6034, 0x2060, 0x6104, 0xa186, 0x004b,
++	0x0040, 0x7a22, 0xa186, 0x004c, 0x0040, 0x7a22, 0xa186, 0x004d,
++	0x0040, 0x7a22, 0xa186, 0x004e, 0x0040, 0x7a22, 0xa186, 0x0052,
++	0x0040, 0x7a22, 0x6010, 0x2068, 0x1078, 0x8d06, 0x1040, 0x1332,
++	0x6853, 0x0003, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002,
++	0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7f, 0x0078, 0x7a35, 0x6034,
++	0x2068, 0x2001, 0xa8a4, 0x2004, 0x683e, 0x1078, 0x772d, 0x027f,
++	0x0d7f, 0x0e7f, 0x007c, 0x0d7e, 0x20a9, 0x000e, 0x2e98, 0x6010,
++	0x20a0, 0x53a3, 0xa1b6, 0x0015, 0x00c0, 0x7a73, 0x6018, 0x2068,
++	0x157e, 0x037e, 0x027e, 0xae90, 0x000c, 0xa290, 0x0004, 0x20a9,
++	0x0004, 0xad98, 0x000a, 0x1078, 0x80de, 0x027f, 0x037f, 0x157f,
++	0x00c0, 0x7a76, 0x157e, 0x037e, 0x027e, 0xae90, 0x000c, 0xa290,
++	0x0008, 0x20a9, 0x0004, 0xad98, 0x0006, 0x1078, 0x80de, 0x027f,
++	0x037f, 0x157f, 0x00c0, 0x7a76, 0x7038, 0x680a, 0x703c, 0x680e,
++	0x6800, 0xc08d, 0x6802, 0x0d7f, 0x0078, 0x77f8, 0x1078, 0x2880,
++	0x0c7e, 0x1078, 0x76c7, 0x2f00, 0x601a, 0x6013, 0x0000, 0x601f,
++	0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x1078,
++	0x4502, 0x1078, 0x4535, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0c7f,
++	0x0078, 0x7a73, 0x2100, 0xa1b2, 0x0044, 0x10c8, 0x1332, 0xa1b2,
++	0x0040, 0x00c8, 0x7af7, 0x0079, 0x7a9d, 0x7aeb, 0x7adf, 0x7aeb,
++	0x7aeb, 0x7aeb, 0x7aeb, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add,
++	0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add,
++	0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add,
++	0x7add, 0x7add, 0x7add, 0x7add, 0x7aeb, 0x7add, 0x7aeb, 0x7aeb,
++	0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7aeb, 0x7add, 0x7add,
++	0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7aeb,
++	0x7aeb, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add,
++	0x7add, 0x7add, 0x7aeb, 0x7add, 0x7add, 0x1078, 0x1332, 0x6003,
++	0x0001, 0x6106, 0x1078, 0x5dd7, 0x127e, 0x2091, 0x8000, 0x1078,
++	0x62d1, 0x127f, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078, 0x5dd7,
++	0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0x2600,
++	0x0079, 0x7afa, 0x7afe, 0x7afe, 0x7afe, 0x7aeb, 0x1078, 0x1332,
++	0x6004, 0xa0b2, 0x0044, 0x10c8, 0x1332, 0xa1b6, 0x0013, 0x00c0,
++	0x7b10, 0xa0b2, 0x0040, 0x00c8, 0x7c79, 0x2008, 0x0079, 0x7bbf,
++	0xa1b6, 0x0027, 0x00c0, 0x7b7c, 0x1078, 0x61cd, 0x6004, 0x1078,
++	0x8eec, 0x0040, 0x7b2d, 0x1078, 0x8f00, 0x0040, 0x7b74, 0xa08e,
++	0x0021, 0x0040, 0x7b78, 0xa08e, 0x0022, 0x0040, 0x7b74, 0xa08e,
++	0x003d, 0x0040, 0x7b78, 0x0078, 0x7b6f, 0x1078, 0x28a6, 0x2001,
++	0x0007, 0x1078, 0x4502, 0x6018, 0xa080, 0x0028, 0x200c, 0x1078,
++	0x7c83, 0xa186, 0x007e, 0x00c0, 0x7b42, 0x2001, 0xa633, 0x2014,
++	0xc285, 0x2202, 0x017e, 0x027e, 0x037e, 0x2110, 0x027e, 0x2019,
++	0x0028, 0x1078, 0x73d0, 0x027f, 0x1078, 0xa4f1, 0x037f, 0x027f,
++	0x017f, 0x017e, 0x027e, 0x037e, 0x2110, 0x2019, 0x0028, 0x1078,
++	0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a, 0x0c7e, 0x6018,
++	0xa065, 0x0040, 0x7b65, 0x1078, 0x47e9, 0x0c7f, 0x2c08, 0x1078,
++	0x9f8b, 0x077f, 0x037f, 0x027f, 0x017f, 0x1078, 0x457f, 0x1078,
++	0x772d, 0x1078, 0x62d1, 0x007c, 0x1078, 0x7c83, 0x0078, 0x7b6f,
++	0x1078, 0x7ca6, 0x0078, 0x7b6f, 0xa186, 0x0014, 0x00c0, 0x7b73,
++	0x1078, 0x61cd, 0x1078, 0x2880, 0x1078, 0x8eec, 0x00c0, 0x7b9b,
++	0x1078, 0x28a6, 0x6018, 0xa080, 0x0028, 0x200c, 0x1078, 0x7c83,
++	0xa186, 0x007e, 0x00c0, 0x7b99, 0x2001, 0xa633, 0x200c, 0xc185,
++	0x2102, 0x0078, 0x7b6f, 0x1078, 0x8f00, 0x00c0, 0x7ba3, 0x1078,
++	0x7c83, 0x0078, 0x7b6f, 0x6004, 0xa08e, 0x0032, 0x00c0, 0x7bb4,
++	0x0e7e, 0x0f7e, 0x2071, 0xa682, 0x2079, 0x0000, 0x1078, 0x2bd7,
++	0x0f7f, 0x0e7f, 0x0078, 0x7b6f, 0x6004, 0xa08e, 0x0021, 0x0040,
++	0x7b9f, 0xa08e, 0x0022, 0x1040, 0x7c83, 0x0078, 0x7b6f, 0x7c01,
++	0x7c03, 0x7c07, 0x7c0b, 0x7c0f, 0x7c13, 0x7bff, 0x7bff, 0x7bff,
++	0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff,
++	0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff,
++	0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7c17, 0x7c29, 0x7bff,
++	0x7c2b, 0x7c29, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7c29,
++	0x7c29, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff,
++	0x7bff, 0x7c5c, 0x7c29, 0x7bff, 0x7c23, 0x7bff, 0x7bff, 0x7bff,
++	0x7c25, 0x7bff, 0x7bff, 0x7bff, 0x7c29, 0x7bff, 0x7bff, 0x1078,
++	0x1332, 0x0078, 0x7c29, 0x2001, 0x000b, 0x0078, 0x7c36, 0x2001,
++	0x0003, 0x0078, 0x7c36, 0x2001, 0x0005, 0x0078, 0x7c36, 0x2001,
++	0x0001, 0x0078, 0x7c36, 0x2001, 0x0009, 0x0078, 0x7c36, 0x1078,
++	0x61cd, 0x6003, 0x0005, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x1078,
++	0x62d1, 0x0078, 0x7c35, 0x0078, 0x7c29, 0x0078, 0x7c29, 0x1078,
++	0x4502, 0x0078, 0x7c6e, 0x1078, 0x61cd, 0x6003, 0x0004, 0x2001,
++	0xa8a2, 0x2004, 0x6016, 0x1078, 0x62d1, 0x007c, 0x1078, 0x4502,
++	0x1078, 0x61cd, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x6003, 0x0002,
++	0x037e, 0x2019, 0xa65d, 0x2304, 0xa084, 0xff00, 0x00c0, 0x7c4d,
++	0x2019, 0xa8a2, 0x231c, 0x0078, 0x7c56, 0x8007, 0xa09a, 0x0004,
++	0x0048, 0x7c48, 0x8003, 0x801b, 0x831b, 0xa318, 0x6316, 0x037f,
++	0x1078, 0x62d1, 0x0078, 0x7c35, 0x0e7e, 0x0f7e, 0x2071, 0xa682,
++	0x2079, 0x0000, 0x1078, 0x2bd7, 0x0f7f, 0x0e7f, 0x1078, 0x61cd,
++	0x1078, 0x772d, 0x1078, 0x62d1, 0x0078, 0x7c35, 0x1078, 0x61cd,
++	0x6003, 0x0002, 0x2001, 0xa8a2, 0x2004, 0x6016, 0x1078, 0x62d1,
++	0x007c, 0x2600, 0x2008, 0x0079, 0x7c7d, 0x7c81, 0x7c81, 0x7c81,
++	0x7c6e, 0x1078, 0x1332, 0x0e7e, 0x1078, 0x8d06, 0x0040, 0x7c9f,
++	0x6010, 0x2070, 0x7038, 0xd0fc, 0x0040, 0x7c9f, 0x7007, 0x0000,
++	0x017e, 0x6004, 0xa08e, 0x0021, 0x0040, 0x7ca1, 0xa08e, 0x003d,
++	0x0040, 0x7ca1, 0x017f, 0x7037, 0x0103, 0x7033, 0x0100, 0x0e7f,
++	0x007c, 0x017f, 0x1078, 0x7ca6, 0x0078, 0x7c9f, 0x0e7e, 0xacf0,
++	0x0004, 0x2e74, 0x7000, 0x2070, 0x7037, 0x0103, 0x7023, 0x8001,
++	0x0e7f, 0x007c, 0x0d7e, 0x6618, 0x2668, 0x6804, 0xa084, 0x00ff,
++	0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x1332, 0x6604, 0xa6b6, 0x0043,
++	0x00c0, 0x7cc6, 0x1078, 0x9134, 0x0078, 0x7d25, 0x6604, 0xa6b6,
++	0x0033, 0x00c0, 0x7ccf, 0x1078, 0x90d8, 0x0078, 0x7d25, 0x6604,
++	0xa6b6, 0x0028, 0x00c0, 0x7cd8, 0x1078, 0x8f2f, 0x0078, 0x7d25,
++	0x6604, 0xa6b6, 0x0029, 0x00c0, 0x7ce1, 0x1078, 0x8f49, 0x0078,
++	0x7d25, 0x6604, 0xa6b6, 0x001f, 0x00c0, 0x7cea, 0x1078, 0x77de,
++	0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0000, 0x00c0, 0x7cf3, 0x1078,
++	0x7a3b, 0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0022, 0x00c0, 0x7cfc,
++	0x1078, 0x7807, 0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0035, 0x00c0,
++	0x7d05, 0x1078, 0x7843, 0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0039,
++	0x00c0, 0x7d0e, 0x1078, 0x79cc, 0x0078, 0x7d25, 0x6604, 0xa6b6,
++	0x003d, 0x00c0, 0x7d17, 0x1078, 0x7823, 0x0078, 0x7d25, 0xa1b6,
++	0x0015, 0x00c0, 0x7d1f, 0x1079, 0x7d2a, 0x0078, 0x7d25, 0xa1b6,
++	0x0016, 0x00c0, 0x7d26, 0x1079, 0x7e7f, 0x007c, 0x1078, 0x7773,
++	0x0078, 0x7d25, 0x7d4e, 0x7d51, 0x7d4e, 0x7d9c, 0x7d4e, 0x7e13,
++	0x7e8b, 0x7d4e, 0x7d4e, 0x7e57, 0x7d4e, 0x7e6d, 0xa1b6, 0x0048,
++	0x0040, 0x7d42, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078,
++	0x15fa, 0x007c, 0x0e7e, 0xacf0, 0x0004, 0x2e74, 0x7000, 0x2070,
++	0x7037, 0x0103, 0x0e7f, 0x1078, 0x772d, 0x007c, 0x0005, 0x0005,
++	0x007c, 0x0e7e, 0x2071, 0xa600, 0x7080, 0xa086, 0x0074, 0x00c0,
++	0x7d85, 0x1078, 0x9f5f, 0x00c0, 0x7d77, 0x0d7e, 0x6018, 0x2068,
++	0x7030, 0xd08c, 0x0040, 0x7d6a, 0x6800, 0xd0bc, 0x0040, 0x7d6a,
++	0xc0c5, 0x6802, 0x1078, 0x7d89, 0x0d7f, 0x2001, 0x0006, 0x1078,
++	0x4502, 0x1078, 0x28a6, 0x1078, 0x772d, 0x0078, 0x7d87, 0x2001,
++	0x000a, 0x1078, 0x4502, 0x1078, 0x28a6, 0x6003, 0x0001, 0x6007,
++	0x0001, 0x1078, 0x5dd7, 0x0078, 0x7d87, 0x1078, 0x7dff, 0x0e7f,
++	0x007c, 0x6800, 0xd084, 0x0040, 0x7d9b, 0x2001, 0x0000, 0x1078,
++	0x44ee, 0x2069, 0xa652, 0x6804, 0xd0a4, 0x0040, 0x7d9b, 0x2001,
++	0x0006, 0x1078, 0x4535, 0x007c, 0x0d7e, 0x2011, 0xa620, 0x2204,
++	0xa086, 0x0074, 0x00c0, 0x7dfb, 0x6018, 0x2068, 0x6aa0, 0xa286,
++	0x007e, 0x00c0, 0x7daf, 0x1078, 0x7f9b, 0x0078, 0x7dfd, 0x1078,
++	0x7f91, 0x6018, 0x2068, 0xa080, 0x0028, 0x2014, 0xa286, 0x0080,
++	0x00c0, 0x7dd3, 0x6813, 0x00ff, 0x6817, 0xfffc, 0x6010, 0xa005,
++	0x0040, 0x7dc9, 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6833,
++	0x0200, 0x2001, 0x0006, 0x1078, 0x4502, 0x1078, 0x28a6, 0x1078,
++	0x772d, 0x0078, 0x7dfd, 0x0e7e, 0x2071, 0xa633, 0x2e04, 0xd09c,
++	0x0040, 0x7dee, 0x2071, 0xab80, 0x7108, 0x720c, 0xa18c, 0x00ff,
++	0x00c0, 0x7de6, 0xa284, 0xff00, 0x0040, 0x7dee, 0x6018, 0x2070,
++	0x70a0, 0xd0bc, 0x00c0, 0x7dee, 0x7112, 0x7216, 0x0e7f, 0x2001,
++	0x0004, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0003, 0x1078,
++	0x5dd7, 0x0078, 0x7dfd, 0x1078, 0x7dff, 0x0d7f, 0x007c, 0x2001,
++	0x0007, 0x1078, 0x4502, 0x2001, 0xa600, 0x2004, 0xa086, 0x0003,
++	0x00c0, 0x7e0e, 0x2001, 0x0007, 0x1078, 0x4535, 0x1078, 0x28a6,
++	0x1078, 0x772d, 0x007c, 0x0e7e, 0x2071, 0xa600, 0x7080, 0xa086,
++	0x0014, 0x00c0, 0x7e51, 0x7000, 0xa086, 0x0003, 0x00c0, 0x7e26,
++	0x6010, 0xa005, 0x00c0, 0x7e26, 0x1078, 0x3699, 0x0d7e, 0x6018,
++	0x2068, 0x1078, 0x4649, 0x1078, 0x7d89, 0x0d7f, 0x1078, 0x8043,
++	0x00c0, 0x7e51, 0x0d7e, 0x6018, 0x2068, 0x6890, 0x0d7f, 0xa005,
++	0x0040, 0x7e51, 0x2001, 0x0006, 0x1078, 0x4502, 0x0e7e, 0x6010,
++	0xa005, 0x0040, 0x7e4a, 0x2070, 0x7007, 0x0000, 0x7037, 0x0103,
++	0x7033, 0x0200, 0x0e7f, 0x1078, 0x28a6, 0x1078, 0x772d, 0x0078,
++	0x7e55, 0x1078, 0x7c83, 0x1078, 0x7dff, 0x0e7f, 0x007c, 0x2011,
++	0xa620, 0x2204, 0xa086, 0x0014, 0x00c0, 0x7e6a, 0x2001, 0x0002,
++	0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078, 0x5dd7,
++	0x0078, 0x7e6c, 0x1078, 0x7dff, 0x007c, 0x2011, 0xa620, 0x2204,
++	0xa086, 0x0004, 0x00c0, 0x7e7c, 0x2001, 0x0007, 0x1078, 0x4502,
++	0x1078, 0x772d, 0x0078, 0x7e7e, 0x1078, 0x7dff, 0x007c, 0x7d4e,
++	0x7e97, 0x7d4e, 0x7ed2, 0x7d4e, 0x7f44, 0x7e8b, 0x7d4e, 0x7d4e,
++	0x7f59, 0x7d4e, 0x7f6c, 0x6604, 0xa686, 0x0003, 0x0040, 0x7e13,
++	0xa6b6, 0x001e, 0x00c0, 0x7e96, 0x1078, 0x772d, 0x007c, 0x0d7e,
++	0x0c7e, 0x1078, 0x7f7f, 0x00c0, 0x7ead, 0x2001, 0x0000, 0x1078,
++	0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007,
++	0x0002, 0x1078, 0x5dd7, 0x0078, 0x7ecf, 0x2009, 0xab8e, 0x2104,
++	0xa086, 0x0009, 0x00c0, 0x7ec2, 0x6018, 0x2068, 0x6840, 0xa084,
++	0x00ff, 0xa005, 0x0040, 0x7ecd, 0x8001, 0x6842, 0x6017, 0x000a,
++	0x0078, 0x7ecf, 0x2009, 0xab8f, 0x2104, 0xa084, 0xff00, 0xa086,
++	0x1900, 0x00c0, 0x7ecd, 0x0078, 0x7ea1, 0x1078, 0x7dff, 0x0c7f,
++	0x0d7f, 0x007c, 0x1078, 0x7f8e, 0x00c0, 0x7ee6, 0x2001, 0x0000,
++	0x1078, 0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x6003, 0x0001,
++	0x6007, 0x0002, 0x1078, 0x5dd7, 0x0078, 0x7f12, 0x1078, 0x7c83,
++	0x2009, 0xab8e, 0x2134, 0xa6b4, 0x00ff, 0xa686, 0x0005, 0x0040,
++	0x7f13, 0xa686, 0x000b, 0x0040, 0x7f10, 0x2009, 0xab8f, 0x2104,
++	0xa084, 0xff00, 0x00c0, 0x7f00, 0xa686, 0x0009, 0x0040, 0x7f13,
++	0xa086, 0x1900, 0x00c0, 0x7f10, 0xa686, 0x0009, 0x0040, 0x7f13,
++	0x2001, 0x0004, 0x1078, 0x4502, 0x1078, 0x772d, 0x0078, 0x7f12,
++	0x1078, 0x7dff, 0x007c, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d06,
++	0x0040, 0x7f21, 0x6838, 0xd0fc, 0x0040, 0x7f21, 0x0d7f, 0x0078,
++	0x7f10, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0040,
++	0x7f32, 0x8001, 0x6842, 0x6017, 0x000a, 0x6007, 0x0016, 0x0d7f,
++	0x0078, 0x7f12, 0x68a0, 0xa086, 0x007e, 0x00c0, 0x7f3f, 0x0e7e,
++	0x2071, 0xa600, 0x1078, 0x42b8, 0x0e7f, 0x0078, 0x7f41, 0x1078,
++	0x2880, 0x0d7f, 0x0078, 0x7f10, 0x1078, 0x7f8e, 0x00c0, 0x7f54,
++	0x2001, 0x0004, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0003,
++	0x1078, 0x5dd7, 0x0078, 0x7f58, 0x1078, 0x7c83, 0x1078, 0x7dff,
++	0x007c, 0x1078, 0x7f8e, 0x00c0, 0x7f69, 0x2001, 0x0008, 0x1078,
++	0x4502, 0x6003, 0x0001, 0x6007, 0x0005, 0x1078, 0x5dd7, 0x0078,
++	0x7f6b, 0x1078, 0x7dff, 0x007c, 0x1078, 0x7f8e, 0x00c0, 0x7f7c,
++	0x2001, 0x000a, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0001,
++	0x1078, 0x5dd7, 0x0078, 0x7f7e, 0x1078, 0x7dff, 0x007c, 0x2009,
++	0xab8e, 0x2104, 0xa086, 0x0003, 0x00c0, 0x7f8d, 0x2009, 0xab8f,
++	0x2104, 0xa084, 0xff00, 0xa086, 0x2a00, 0x007c, 0xa085, 0x0001,
++	0x007c, 0x0c7e, 0x017e, 0xac88, 0x0006, 0x2164, 0x1078, 0x45d6,
++	0x017f, 0x0c7f, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x037e, 0x017e,
++	0x6018, 0x2068, 0x2071, 0xa633, 0x2e04, 0xa085, 0x0003, 0x2072,
++	0x1078, 0x8014, 0x0040, 0x7fd9, 0x2009, 0xa633, 0x2104, 0xc0cd,
++	0x200a, 0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040, 0x7fc2, 0xa006,
++	0x2020, 0x2009, 0x002a, 0x1078, 0xa21d, 0x2001, 0xa60c, 0x200c,
++	0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, 0x1078, 0x284f,
++	0x2071, 0xa600, 0x1078, 0x2677, 0x0c7e, 0x157e, 0x20a9, 0x0081,
++	0x2009, 0x007f, 0x1078, 0x298e, 0x8108, 0x00f0, 0x7fd2, 0x157f,
++	0x0c7f, 0x1078, 0x7f91, 0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071,
++	0xab80, 0x2079, 0x0100, 0x2e04, 0xa084, 0x00ff, 0x2069, 0xa61b,
++	0x206a, 0x78e6, 0x007e, 0x8e70, 0x2e04, 0x2069, 0xa61c, 0x206a,
++	0x78ea, 0xa084, 0xff00, 0x017f, 0xa105, 0x2009, 0xa626, 0x200a,
++	0x2069, 0xab8e, 0x2071, 0xa89e, 0x6810, 0x2072, 0x6814, 0x7006,
++	0x6818, 0x700a, 0x681c, 0x700e, 0x1078, 0x906e, 0x2001, 0x0006,
++	0x1078, 0x4502, 0x1078, 0x28a6, 0x1078, 0x772d, 0x017f, 0x037f,
++	0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x027e, 0x037e, 0x0e7e, 0x157e,
++	0x2019, 0xa626, 0x231c, 0x83ff, 0x0040, 0x803e, 0x2071, 0xab80,
++	0x2e14, 0xa294, 0x00ff, 0x7004, 0xa084, 0xff00, 0xa205, 0xa306,
++	0x00c0, 0x803e, 0x2011, 0xab96, 0xad98, 0x000a, 0x20a9, 0x0004,
++	0x1078, 0x80de, 0x00c0, 0x803e, 0x2011, 0xab9a, 0xad98, 0x0006,
++	0x20a9, 0x0004, 0x1078, 0x80de, 0x00c0, 0x803e, 0x157f, 0x0e7f,
++	0x037f, 0x027f, 0x007c, 0x0e7e, 0x2071, 0xab8c, 0x7004, 0xa086,
++	0x0014, 0x00c0, 0x8066, 0x7008, 0xa086, 0x0800, 0x00c0, 0x8066,
++	0x700c, 0xd0ec, 0x0040, 0x8064, 0xa084, 0x0f00, 0xa086, 0x0100,
++	0x00c0, 0x8064, 0x7024, 0xd0a4, 0x00c0, 0x8061, 0xd0ac, 0x0040,
++	0x8064, 0xa006, 0x0078, 0x8066, 0xa085, 0x0001, 0x0e7f, 0x007c,
++	0x0e7e, 0x0d7e, 0x0c7e, 0x077e, 0x057e, 0x047e, 0x027e, 0x007e,
++	0x127e, 0x2091, 0x8000, 0x2029, 0xa8ba, 0x252c, 0x2021, 0xa8c0,
++	0x2424, 0x2061, 0xad00, 0x2071, 0xa600, 0x7248, 0x7064, 0xa202,
++	0x00c8, 0x80cc, 0x1078, 0xa242, 0x0040, 0x80c4, 0x671c, 0xa786,
++	0x0001, 0x0040, 0x80c4, 0xa786, 0x0007, 0x0040, 0x80c4, 0x2500,
++	0xac06, 0x0040, 0x80c4, 0x2400, 0xac06, 0x0040, 0x80c4, 0x0c7e,
++	0x6000, 0xa086, 0x0004, 0x00c0, 0x809f, 0x1078, 0x1757, 0xa786,
++	0x0008, 0x00c0, 0x80ae, 0x1078, 0x8f00, 0x00c0, 0x80ae, 0x0c7f,
++	0x1078, 0x7c83, 0x1078, 0x8ec6, 0x0078, 0x80c4, 0x6010, 0x2068,
++	0x1078, 0x8d06, 0x0040, 0x80c1, 0xa786, 0x0003, 0x00c0, 0x80d6,
++	0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4a73, 0x1078,
++	0x8eb9, 0x1078, 0x8ec6, 0x0c7f, 0xace0, 0x0010, 0x7058, 0xac02,
++	0x00c8, 0x80cc, 0x0078, 0x807d, 0x127f, 0x007f, 0x027f, 0x047f,
++	0x057f, 0x077f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0xa786, 0x0006,
++	0x00c0, 0x80b8, 0x1078, 0xa1ca, 0x0078, 0x80c1, 0x220c, 0x2304,
++	0xa106, 0x00c0, 0x80e9, 0x8210, 0x8318, 0x00f0, 0x80de, 0xa006,
++	0x007c, 0x2304, 0xa102, 0x0048, 0x80f1, 0x2001, 0x0001, 0x0078,
++	0x80f3, 0x2001, 0x0000, 0xa18d, 0x0001, 0x007c, 0x6004, 0xa08a,
++	0x0044, 0x10c8, 0x1332, 0x1078, 0x8eec, 0x0040, 0x8105, 0x1078,
++	0x8f00, 0x0040, 0x8112, 0x0078, 0x810b, 0x1078, 0x28a6, 0x1078,
++	0x8f00, 0x0040, 0x8112, 0x1078, 0x61cd, 0x1078, 0x772d, 0x1078,
++	0x62d1, 0x007c, 0x1078, 0x7c83, 0x0078, 0x810b, 0xa182, 0x0040,
++	0x0079, 0x811a, 0x812d, 0x812d, 0x812d, 0x812d, 0x812d, 0x812d,
++	0x812d, 0x812d, 0x812d, 0x812d, 0x812d, 0x812f, 0x812f, 0x812f,
++	0x812f, 0x812d, 0x812d, 0x812d, 0x812f, 0x1078, 0x1332, 0x600b,
++	0xffff, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a, 0x127e, 0x2091,
++	0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0xa186, 0x0013, 0x00c0,
++	0x8146, 0x6004, 0xa082, 0x0040, 0x0079, 0x81d1, 0xa186, 0x0027,
++	0x00c0, 0x8168, 0x1078, 0x61cd, 0x1078, 0x2880, 0x0d7e, 0x6110,
++	0x2168, 0x1078, 0x8d06, 0x0040, 0x8162, 0x6837, 0x0103, 0x684b,
++	0x0029, 0x6847, 0x0000, 0x694c, 0xc1c5, 0x694e, 0x1078, 0x4a73,
++	0x1078, 0x8eb9, 0x0d7f, 0x1078, 0x772d, 0x1078, 0x62d1, 0x007c,
++	0xa186, 0x0014, 0x00c0, 0x8171, 0x6004, 0xa082, 0x0040, 0x0079,
++	0x8199, 0xa186, 0x0046, 0x0040, 0x817d, 0xa186, 0x0045, 0x0040,
++	0x817d, 0xa186, 0x0047, 0x10c0, 0x1332, 0x2001, 0x0109, 0x2004,
++	0xd084, 0x0040, 0x8196, 0x127e, 0x2091, 0x2200, 0x007e, 0x017e,
++	0x027e, 0x1078, 0x5c56, 0x027f, 0x017f, 0x007f, 0x127f, 0x6000,
++	0xa086, 0x0002, 0x00c0, 0x8196, 0x0078, 0x820e, 0x1078, 0x7773,
++	0x007c, 0x81ae, 0x81ac, 0x81ac, 0x81ac, 0x81ac, 0x81ac, 0x81ac,
++	0x81ac, 0x81ac, 0x81ac, 0x81ac, 0x81ca, 0x81ca, 0x81ca, 0x81ca,
++	0x81ac, 0x81ca, 0x81ac, 0x81ca, 0x1078, 0x1332, 0x1078, 0x61cd,
++	0x0d7e, 0x6110, 0x2168, 0x1078, 0x8d06, 0x0040, 0x81c4, 0x6837,
++	0x0103, 0x684b, 0x0006, 0x6847, 0x0000, 0x6850, 0xc0ec, 0x6852,
++	0x1078, 0x4a73, 0x1078, 0x8eb9, 0x0d7f, 0x1078, 0x772d, 0x1078,
++	0x62d1, 0x007c, 0x1078, 0x61cd, 0x1078, 0x772d, 0x1078, 0x62d1,
++	0x007c, 0x81e6, 0x81e4, 0x81e4, 0x81e4, 0x81e4, 0x81e4, 0x81e4,
++	0x81e4, 0x81e4, 0x81e4, 0x81e4, 0x81f8, 0x81f8, 0x81f8, 0x81f8,
++	0x81e4, 0x8207, 0x81e4, 0x81f8, 0x1078, 0x1332, 0x1078, 0x61cd,
++	0x2001, 0xa8a4, 0x2004, 0x603e, 0x6003, 0x0002, 0x1078, 0x62d1,
++	0x6010, 0xa088, 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x007c,
++	0x1078, 0x61cd, 0x2001, 0xa8a2, 0x2004, 0x6016, 0x2001, 0xa8a4,
++	0x2004, 0x603e, 0x6003, 0x000f, 0x1078, 0x62d1, 0x007c, 0x1078,
++	0x61cd, 0x1078, 0x772d, 0x1078, 0x62d1, 0x007c, 0xa182, 0x0040,
++	0x0079, 0x8212, 0x8225, 0x8225, 0x8225, 0x8225, 0x8225, 0x8227,
++	0x8327, 0x8359, 0x8225, 0x8225, 0x8225, 0x8225, 0x8225, 0x8225,
++	0x8225, 0x8225, 0x8225, 0x8225, 0x8225, 0x1078, 0x1332, 0x0e7e,
++	0x0d7e, 0x603f, 0x0000, 0x2071, 0xab80, 0x7124, 0x610a, 0x2071,
++	0xab8c, 0x6110, 0x2168, 0x7614, 0xa6b4, 0x0fff, 0x86ff, 0x0040,
++	0x82e9, 0xa68c, 0x0c00, 0x0040, 0x825e, 0x0f7e, 0x2c78, 0x1078,
++	0x4963, 0x0f7f, 0x0040, 0x825a, 0x684c, 0xd0ac, 0x0040, 0x825a,
++	0x6024, 0xd0dc, 0x00c0, 0x825a, 0x6850, 0xd0bc, 0x00c0, 0x825a,
++	0x7318, 0x6814, 0xa306, 0x00c0, 0x8301, 0x731c, 0x6810, 0xa306,
++	0x00c0, 0x8301, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff,
++	0xa186, 0x0002, 0x0040, 0x8291, 0xa186, 0x0028, 0x00c0, 0x826e,
++	0x1078, 0x8eda, 0x684b, 0x001c, 0x0078, 0x8293, 0xd6dc, 0x0040,
++	0x828a, 0x684b, 0x0015, 0x684c, 0xd0ac, 0x0040, 0x8288, 0x6914,
++	0x6a10, 0x2100, 0xa205, 0x0040, 0x8288, 0x7018, 0xa106, 0x00c0,
++	0x8285, 0x701c, 0xa206, 0x0040, 0x8288, 0x6962, 0x6a5e, 0xc6dc,
++	0x0078, 0x8293, 0xd6d4, 0x0040, 0x8291, 0x684b, 0x0007, 0x0078,
++	0x8293, 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46, 0xa01e, 0xd6c4,
++	0x0040, 0x82bc, 0xa686, 0x0100, 0x00c0, 0x82a7, 0x2001, 0xab99,
++	0x2004, 0xa005, 0x00c0, 0x82a7, 0xc6c4, 0x0078, 0x8236, 0x7328,
++	0x732c, 0x6b56, 0x83ff, 0x0040, 0x82bc, 0xa38a, 0x0009, 0x0048,
++	0x82b3, 0x2019, 0x0008, 0x037e, 0x2308, 0x2019, 0xab98, 0xad90,
++	0x0019, 0x1078, 0x89e2, 0x037f, 0xd6cc, 0x0040, 0x8317, 0x7124,
++	0x695a, 0x81ff, 0x0040, 0x8317, 0xa192, 0x0021, 0x00c8, 0x82d5,
++	0x2071, 0xab98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078,
++	0x89e2, 0x1078, 0x91f4, 0x0078, 0x8317, 0x6838, 0xd0fc, 0x0040,
++	0x82de, 0x2009, 0x0020, 0x695a, 0x0078, 0x82c8, 0x0f7e, 0x2d78,
++	0x1078, 0x897a, 0x0f7f, 0x1078, 0x91f4, 0x1078, 0x89cf, 0x0078,
++	0x8319, 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f, 0x0040, 0x8307,
++	0x684c, 0xd0ac, 0x0040, 0x8307, 0x6024, 0xd0dc, 0x00c0, 0x8307,
++	0x6850, 0xd0bc, 0x00c0, 0x8307, 0x6810, 0x6914, 0xa105, 0x0040,
++	0x8307, 0x1078, 0x8fbf, 0x0d7f, 0x0e7f, 0x0078, 0x8326, 0x684b,
++	0x0000, 0x6837, 0x0103, 0x6e46, 0x684c, 0xd0ac, 0x0040, 0x8317,
++	0x6810, 0x6914, 0xa115, 0x0040, 0x8317, 0x1078, 0x84d5, 0x1078,
++	0x4a73, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x1078, 0x8f89,
++	0x0d7f, 0x0e7f, 0x00c0, 0x8326, 0x1078, 0x772d, 0x007c, 0x0f7e,
++	0x6003, 0x0003, 0x2079, 0xab8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08,
++	0x6010, 0x2078, 0x784c, 0xd0ac, 0x0040, 0x833e, 0x6003, 0x0002,
++	0x0f7f, 0x007c, 0x2130, 0x2228, 0x0078, 0x834a, 0x2400, 0x797c,
++	0xa10a, 0x2300, 0x7a80, 0xa213, 0x2600, 0xa102, 0x2500, 0xa203,
++	0x0048, 0x833a, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x0f7f, 0x603f,
++	0x0000, 0x2c10, 0x1078, 0x1cf0, 0x1078, 0x5df6, 0x1078, 0x639b,
++	0x007c, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x6003, 0x0004, 0x6110,
++	0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, 0x15fa, 0x007c,
++	0xa182, 0x0040, 0x0079, 0x836c, 0x837f, 0x837f, 0x837f, 0x837f,
++	0x837f, 0x8381, 0x8424, 0x837f, 0x837f, 0x843a, 0x84ab, 0x837f,
++	0x837f, 0x837f, 0x837f, 0x84ba, 0x837f, 0x837f, 0x837f, 0x1078,
++	0x1332, 0x077e, 0x0f7e, 0x0e7e, 0x0d7e, 0x2071, 0xab8c, 0x6110,
++	0x2178, 0x7614, 0xa6b4, 0x0fff, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e,
++	0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0040, 0x841f,
++	0xa694, 0xff00, 0xa284, 0x0c00, 0x0040, 0x83a2, 0x7018, 0x7862,
++	0x701c, 0x785e, 0xa284, 0x0300, 0x0040, 0x841f, 0x1078, 0x138b,
++	0x1040, 0x1332, 0x2d00, 0x784a, 0x7f4c, 0xc7cd, 0x7f4e, 0x6837,
++	0x0103, 0x7838, 0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46,
++	0xa68c, 0x0c00, 0x0040, 0x83c0, 0x7318, 0x6b62, 0x731c, 0x6b5e,
++	0xa68c, 0x00ff, 0xa186, 0x0002, 0x0040, 0x83dc, 0xa186, 0x0028,
++	0x00c0, 0x83ce, 0x684b, 0x001c, 0x0078, 0x83de, 0xd6dc, 0x0040,
++	0x83d5, 0x684b, 0x0015, 0x0078, 0x83de, 0xd6d4, 0x0040, 0x83dc,
++	0x684b, 0x0007, 0x0078, 0x83de, 0x684b, 0x0000, 0x6f4e, 0x7850,
++	0x6852, 0x7854, 0x6856, 0xa01e, 0xd6c4, 0x0040, 0x83fc, 0x7328,
++	0x732c, 0x6b56, 0x83ff, 0x0040, 0x83fc, 0xa38a, 0x0009, 0x0048,
++	0x83f3, 0x2019, 0x0008, 0x037e, 0x2308, 0x2019, 0xab98, 0xad90,
++	0x0019, 0x1078, 0x89e2, 0x037f, 0xd6cc, 0x0040, 0x841f, 0x7124,
++	0x695a, 0x81ff, 0x0040, 0x841f, 0xa192, 0x0021, 0x00c8, 0x8413,
++	0x2071, 0xab98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078,
++	0x89e2, 0x0078, 0x841f, 0x7838, 0xd0fc, 0x0040, 0x841c, 0x2009,
++	0x0020, 0x695a, 0x0078, 0x8408, 0x2d78, 0x1078, 0x897a, 0x0d7f,
++	0x0e7f, 0x0f7f, 0x077f, 0x007c, 0x0f7e, 0x6003, 0x0003, 0x2079,
++	0xab8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010, 0x2078, 0x7c12,
++	0x7b16, 0x7e0a, 0x7d0e, 0x0f7f, 0x2c10, 0x1078, 0x1cf0, 0x1078,
++	0x6df4, 0x007c, 0x0d7e, 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f,
++	0x0040, 0x8446, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x6003, 0x0002,
++	0x1078, 0x627a, 0x1078, 0x639b, 0x6110, 0x2168, 0x694c, 0xd1e4,
++	0x0040, 0x84a9, 0xd1cc, 0x0040, 0x8480, 0x6948, 0x6838, 0xd0fc,
++	0x0040, 0x8478, 0x017e, 0x684c, 0x007e, 0x6850, 0x007e, 0xad90,
++	0x000d, 0xa198, 0x000d, 0x2009, 0x0020, 0x157e, 0x21a8, 0x2304,
++	0x2012, 0x8318, 0x8210, 0x00f0, 0x8467, 0x157f, 0x007f, 0x6852,
++	0x007f, 0x684e, 0x017f, 0x2168, 0x1078, 0x13b4, 0x0078, 0x84a3,
++	0x017e, 0x1078, 0x13b4, 0x0d7f, 0x1078, 0x89cf, 0x0078, 0x84a3,
++	0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0040,
++	0x849f, 0xa086, 0x0028, 0x00c0, 0x8491, 0x684b, 0x001c, 0x0078,
++	0x84a1, 0xd1dc, 0x0040, 0x8498, 0x684b, 0x0015, 0x0078, 0x84a1,
++	0xd1d4, 0x0040, 0x849f, 0x684b, 0x0007, 0x0078, 0x84a1, 0x684b,
++	0x0000, 0x1078, 0x4a73, 0x1078, 0x8f89, 0x00c0, 0x84a9, 0x1078,
++	0x772d, 0x0d7f, 0x007c, 0x2019, 0x0001, 0x1078, 0x7058, 0x6003,
++	0x0002, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x1078, 0x627a, 0x1078,
++	0x639b, 0x007c, 0x1078, 0x627a, 0x1078, 0x2880, 0x0d7e, 0x6110,
++	0x2168, 0x1078, 0x8d06, 0x0040, 0x84cf, 0x6837, 0x0103, 0x684b,
++	0x0029, 0x6847, 0x0000, 0x1078, 0x4a73, 0x1078, 0x8eb9, 0x0d7f,
++	0x1078, 0x772d, 0x1078, 0x639b, 0x007c, 0x684b, 0x0015, 0xd1fc,
++	0x0040, 0x84e1, 0x684b, 0x0007, 0x8002, 0x8000, 0x810a, 0xa189,
++	0x0000, 0x6962, 0x685e, 0x007c, 0xa182, 0x0040, 0x0079, 0x84e8,
++	0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fd, 0x84fb, 0x85d0,
++	0x85dc, 0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fb,
++	0x84fb, 0x84fb, 0x84fb, 0x1078, 0x1332, 0x077e, 0x0f7e, 0x0e7e,
++	0x0d7e, 0x2071, 0xab8c, 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff,
++	0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f, 0x0040, 0x851b, 0xa684,
++	0x00ff, 0x00c0, 0x851b, 0x6024, 0xd0f4, 0x0040, 0x851b, 0x1078,
++	0x8fbf, 0x0078, 0x85cb, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218,
++	0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0040, 0x85c0, 0xa694,
++	0xff00, 0xa284, 0x0c00, 0x0040, 0x8531, 0x7018, 0x7862, 0x701c,
++	0x785e, 0xa284, 0x0300, 0x0040, 0x85bd, 0xa686, 0x0100, 0x00c0,
++	0x8543, 0x2001, 0xab99, 0x2004, 0xa005, 0x00c0, 0x8543, 0xc6c4,
++	0x7e46, 0x0078, 0x8524, 0x1078, 0x138b, 0x1040, 0x1332, 0x2d00,
++	0x784a, 0x7f4c, 0xa7bd, 0x0200, 0x7f4e, 0x6837, 0x0103, 0x7838,
++	0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00,
++	0x0040, 0x855e, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff,
++	0xa186, 0x0002, 0x0040, 0x857a, 0xa186, 0x0028, 0x00c0, 0x856c,
++	0x684b, 0x001c, 0x0078, 0x857c, 0xd6dc, 0x0040, 0x8573, 0x684b,
++	0x0015, 0x0078, 0x857c, 0xd6d4, 0x0040, 0x857a, 0x684b, 0x0007,
++	0x0078, 0x857c, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854,
++	0x6856, 0xa01e, 0xd6c4, 0x0040, 0x859a, 0x7328, 0x732c, 0x6b56,
++	0x83ff, 0x0040, 0x859a, 0xa38a, 0x0009, 0x0048, 0x8591, 0x2019,
++	0x0008, 0x037e, 0x2308, 0x2019, 0xab98, 0xad90, 0x0019, 0x1078,
++	0x89e2, 0x037f, 0xd6cc, 0x0040, 0x85bd, 0x7124, 0x695a, 0x81ff,
++	0x0040, 0x85bd, 0xa192, 0x0021, 0x00c8, 0x85b1, 0x2071, 0xab98,
++	0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078, 0x89e2, 0x0078,
++	0x85bd, 0x7838, 0xd0fc, 0x0040, 0x85ba, 0x2009, 0x0020, 0x695a,
++	0x0078, 0x85a6, 0x2d78, 0x1078, 0x897a, 0xd6dc, 0x00c0, 0x85c3,
++	0xa006, 0x0078, 0x85c9, 0x2001, 0x0001, 0x2071, 0xab8c, 0x7218,
++	0x731c, 0x1078, 0x1653, 0x0d7f, 0x0e7f, 0x0f7f, 0x077f, 0x007c,
++	0x2001, 0xa8a4, 0x2004, 0x603e, 0x20e1, 0x0005, 0x3d18, 0x3e20,
++	0x2c10, 0x1078, 0x15fa, 0x007c, 0x2001, 0xa8a4, 0x2004, 0x603e,
++	0x0d7e, 0x6003, 0x0002, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0040,
++	0x870c, 0x603f, 0x0000, 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f,
++	0x0040, 0x8622, 0x6814, 0x6910, 0xa115, 0x0040, 0x8622, 0x6a60,
++	0xa206, 0x00c0, 0x85ff, 0x685c, 0xa106, 0x0040, 0x8622, 0x684c,
++	0xc0e4, 0x684e, 0x6847, 0x0000, 0x6863, 0x0000, 0x685f, 0x0000,
++	0x6024, 0xd0f4, 0x00c0, 0x8617, 0x697c, 0x6810, 0xa102, 0x603a,
++	0x6980, 0x6814, 0xa103, 0x6036, 0x6024, 0xc0f5, 0x6026, 0x0d7e,
++	0x6018, 0x2068, 0x683c, 0x8000, 0x683e, 0x0d7f, 0x1078, 0x8fbf,
++	0x0078, 0x870c, 0x694c, 0xd1cc, 0x0040, 0x86d1, 0x6948, 0x6838,
++	0xd0fc, 0x0040, 0x8689, 0x017e, 0x684c, 0x007e, 0x6850, 0x007e,
++	0x0f7e, 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0040,
++	0x865c, 0xa086, 0x0028, 0x00c0, 0x8643, 0x684b, 0x001c, 0x784b,
++	0x001c, 0x0078, 0x8667, 0xd1dc, 0x0040, 0x8653, 0x684b, 0x0015,
++	0x784b, 0x0015, 0x1078, 0x916c, 0x0040, 0x8651, 0x7944, 0xc1dc,
++	0x7946, 0x0078, 0x8667, 0xd1d4, 0x0040, 0x865c, 0x684b, 0x0007,
++	0x784b, 0x0007, 0x0078, 0x8667, 0x684c, 0xd0ac, 0x0040, 0x8667,
++	0x6810, 0x6914, 0xa115, 0x0040, 0x8667, 0x1078, 0x84d5, 0x6848,
++	0x784a, 0x6860, 0x7862, 0x685c, 0x785e, 0xad90, 0x000d, 0xaf98,
++	0x000d, 0x2009, 0x0020, 0x157e, 0x21a8, 0x2304, 0x2012, 0x8318,
++	0x8210, 0x00f0, 0x8675, 0x157f, 0x0f7f, 0x007f, 0x6852, 0x007f,
++	0x684e, 0x1078, 0x91f4, 0x017f, 0x2168, 0x1078, 0x13b4, 0x0078,
++	0x8706, 0x017e, 0x0f7e, 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6,
++	0x0002, 0x0040, 0x86b6, 0xa086, 0x0028, 0x00c0, 0x869d, 0x684b,
++	0x001c, 0x784b, 0x001c, 0x0078, 0x86c1, 0xd1dc, 0x0040, 0x86ad,
++	0x684b, 0x0015, 0x784b, 0x0015, 0x1078, 0x916c, 0x0040, 0x86ab,
++	0x7944, 0xc1dc, 0x7946, 0x0078, 0x86c1, 0xd1d4, 0x0040, 0x86b6,
++	0x684b, 0x0007, 0x784b, 0x0007, 0x0078, 0x86c1, 0x684c, 0xd0ac,
++	0x0040, 0x86c1, 0x6810, 0x6914, 0xa115, 0x0040, 0x86c1, 0x1078,
++	0x84d5, 0x6860, 0x7862, 0x685c, 0x785e, 0x684c, 0x784e, 0x0f7f,
++	0x1078, 0x13b4, 0x0d7f, 0x1078, 0x91f4, 0x1078, 0x89cf, 0x0078,
++	0x8706, 0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002,
++	0x0040, 0x86f7, 0xa086, 0x0028, 0x00c0, 0x86e2, 0x684b, 0x001c,
++	0x0078, 0x8704, 0xd1dc, 0x0040, 0x86f0, 0x684b, 0x0015, 0x1078,
++	0x916c, 0x0040, 0x86ee, 0x6944, 0xc1dc, 0x6946, 0x0078, 0x8704,
++	0xd1d4, 0x0040, 0x86f7, 0x684b, 0x0007, 0x0078, 0x8704, 0x684b,
++	0x0000, 0x684c, 0xd0ac, 0x0040, 0x8704, 0x6810, 0x6914, 0xa115,
++	0x0040, 0x8704, 0x1078, 0x84d5, 0x1078, 0x4a73, 0x1078, 0x8f89,
++	0x00c0, 0x870c, 0x1078, 0x772d, 0x0d7f, 0x007c, 0x1078, 0x61cd,
++	0x0078, 0x8714, 0x1078, 0x627a, 0x1078, 0x8d06, 0x0040, 0x8733,
++	0x0d7e, 0x6110, 0x2168, 0x6837, 0x0103, 0x2009, 0xa60c, 0x210c,
++	0xd18c, 0x00c0, 0x873e, 0xd184, 0x00c0, 0x873a, 0x6108, 0x694a,
++	0xa18e, 0x0029, 0x00c0, 0x872e, 0x1078, 0xa4e2, 0x6847, 0x0000,
++	0x1078, 0x4a73, 0x0d7f, 0x1078, 0x772d, 0x1078, 0x62d1, 0x1078,
++	0x639b, 0x007c, 0x684b, 0x0004, 0x0078, 0x872e, 0x684b, 0x0004,
++	0x0078, 0x872e, 0xa182, 0x0040, 0x0079, 0x8746, 0x8759, 0x8759,
++	0x8759, 0x8759, 0x8759, 0x875b, 0x8759, 0x875e, 0x8759, 0x8759,
++	0x8759, 0x8759, 0x8759, 0x8759, 0x8759, 0x8759, 0x8759, 0x8759,
++	0x8759, 0x1078, 0x1332, 0x1078, 0x772d, 0x007c, 0x007e, 0x027e,
++	0xa016, 0x1078, 0x15fa, 0x027f, 0x007f, 0x007c, 0xa182, 0x0085,
++	0x0079, 0x876a, 0x8773, 0x8771, 0x8771, 0x877f, 0x8771, 0x8771,
++	0x8771, 0x1078, 0x1332, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a,
++	0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0x027e,
++	0x057e, 0x0d7e, 0x0e7e, 0x2071, 0xab80, 0x7224, 0x6212, 0x7220,
++	0x1078, 0x8cf2, 0x0040, 0x87a4, 0x2268, 0x6800, 0xa086, 0x0000,
++	0x0040, 0x87a4, 0x6018, 0x6d18, 0xa52e, 0x00c0, 0x87a4, 0x0c7e,
++	0x2d60, 0x1078, 0x89f3, 0x0c7f, 0x0040, 0x87a4, 0x6803, 0x0002,
++	0x6007, 0x0086, 0x0078, 0x87a6, 0x6007, 0x0087, 0x6003, 0x0001,
++	0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0f7e, 0x2278, 0x1078, 0x4963,
++	0x0f7f, 0x0040, 0x87be, 0x6824, 0xd0ec, 0x0040, 0x87be, 0x0c7e,
++	0x2260, 0x603f, 0x0000, 0x1078, 0x8fbf, 0x0c7f, 0x0e7f, 0x0d7f,
++	0x057f, 0x027f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x87d4, 0x6004,
++	0xa08a, 0x0085, 0x1048, 0x1332, 0xa08a, 0x008c, 0x10c8, 0x1332,
++	0xa082, 0x0085, 0x0079, 0x87e3, 0xa186, 0x0027, 0x0040, 0x87dc,
++	0xa186, 0x0014, 0x10c0, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ec6,
++	0x1078, 0x62d1, 0x007c, 0x87ea, 0x87ec, 0x87ec, 0x87ea, 0x87ea,
++	0x87ea, 0x87ea, 0x1078, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ec6,
++	0x1078, 0x62d1, 0x007c, 0xa186, 0x0013, 0x00c0, 0x87fd, 0x6004,
++	0xa082, 0x0085, 0x2008, 0x0078, 0x8838, 0xa186, 0x0027, 0x00c0,
++	0x8820, 0x1078, 0x61cd, 0x1078, 0x2880, 0x0d7e, 0x6010, 0x2068,
++	0x1078, 0x8d06, 0x0040, 0x8816, 0x6837, 0x0103, 0x6847, 0x0000,
++	0x684b, 0x0029, 0x1078, 0x4a73, 0x1078, 0x8eb9, 0x0d7f, 0x1078,
++	0x772d, 0x1078, 0x62d1, 0x007c, 0x1078, 0x7773, 0x0078, 0x881b,
++	0xa186, 0x0014, 0x00c0, 0x881c, 0x1078, 0x61cd, 0x0d7e, 0x6010,
++	0x2068, 0x1078, 0x8d06, 0x0040, 0x8816, 0x6837, 0x0103, 0x6847,
++	0x0000, 0x684b, 0x0006, 0x6850, 0xc0ec, 0x6852, 0x0078, 0x8812,
++	0x0079, 0x883a, 0x8843, 0x8841, 0x8841, 0x8841, 0x8841, 0x8841,
++	0x885e, 0x1078, 0x1332, 0x1078, 0x61cd, 0x6030, 0xa08c, 0xff00,
++	0x810f, 0xa186, 0x0039, 0x0040, 0x8851, 0xa186, 0x0035, 0x00c0,
++	0x8855, 0x2001, 0xa8a2, 0x0078, 0x8857, 0x2001, 0xa8a3, 0x2004,
++	0x6016, 0x6003, 0x000c, 0x1078, 0x62d1, 0x007c, 0x1078, 0x61cd,
++	0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0040, 0x886c,
++	0xa186, 0x0035, 0x00c0, 0x8870, 0x2001, 0xa8a2, 0x0078, 0x8872,
++	0x2001, 0xa8a3, 0x2004, 0x6016, 0x6003, 0x000e, 0x1078, 0x62d1,
++	0x007c, 0xa182, 0x008c, 0x00c8, 0x8883, 0xa182, 0x0085, 0x0048,
++	0x8883, 0x0079, 0x8886, 0x1078, 0x7773, 0x007c, 0x888d, 0x888d,
++	0x888d, 0x888d, 0x888f, 0x88ec, 0x888d, 0x1078, 0x1332, 0x0f7e,
++	0x2c78, 0x1078, 0x4963, 0x0f7f, 0x0040, 0x88a2, 0x6030, 0xa08c,
++	0xff00, 0x810f, 0xa186, 0x0039, 0x0040, 0x8903, 0xa186, 0x0035,
++	0x0040, 0x8903, 0x0d7e, 0x1078, 0x8d06, 0x00c0, 0x88ab, 0x1078,
++	0x8eb9, 0x0078, 0x88ce, 0x6010, 0x2068, 0x684c, 0xd0e4, 0x00c0,
++	0x88b3, 0x1078, 0x8eb9, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0040,
++	0x88bf, 0x684b, 0x0006, 0xc0ec, 0x6852, 0x0078, 0x88ca, 0xd0bc,
++	0x0040, 0x88c6, 0x684b, 0x0002, 0x0078, 0x88ca, 0x684b, 0x0005,
++	0x1078, 0x8f85, 0x6847, 0x0000, 0x1078, 0x4a73, 0x2c68, 0x1078,
++	0x76c7, 0x0040, 0x88e7, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009,
++	0xab8e, 0x210c, 0x6136, 0x2009, 0xab8f, 0x210c, 0x613a, 0x6918,
++	0x611a, 0x6920, 0x6122, 0x601f, 0x0001, 0x1078, 0x5d8a, 0x2d60,
++	0x1078, 0x772d, 0x0d7f, 0x007c, 0x0f7e, 0x2c78, 0x1078, 0x4963,
++	0x0f7f, 0x0040, 0x8929, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186,
++	0x0035, 0x0040, 0x8903, 0xa186, 0x001e, 0x0040, 0x8903, 0xa186,
++	0x0039, 0x00c0, 0x8929, 0x0d7e, 0x2c68, 0x1078, 0x91bc, 0x00c0,
++	0x894d, 0x1078, 0x76c7, 0x0040, 0x8926, 0x6106, 0x6003, 0x0001,
++	0x601f, 0x0001, 0x6918, 0x611a, 0x6928, 0x612a, 0x692c, 0x612e,
++	0x6930, 0xa18c, 0x00ff, 0x6132, 0x6934, 0x6136, 0x6938, 0x613a,
++	0x6920, 0x6122, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x2d60, 0x0078,
++	0x894d, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x894d,
++	0x6837, 0x0103, 0x6850, 0xd0b4, 0x0040, 0x893c, 0xc0ec, 0x6852,
++	0x684b, 0x0006, 0x0078, 0x8947, 0xd0bc, 0x0040, 0x8943, 0x684b,
++	0x0002, 0x0078, 0x8947, 0x684b, 0x0005, 0x1078, 0x8f85, 0x6847,
++	0x0000, 0x1078, 0x4a73, 0x1078, 0x8eb9, 0x0d7f, 0x1078, 0x772d,
++	0x007c, 0x017e, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040,
++	0x8961, 0x6837, 0x0103, 0x684b, 0x0028, 0x6847, 0x0000, 0x1078,
++	0x4a73, 0x0d7f, 0x017f, 0xa186, 0x0013, 0x0040, 0x8973, 0xa186,
++	0x0014, 0x0040, 0x8973, 0xa186, 0x0027, 0x0040, 0x8973, 0x1078,
++	0x7773, 0x0078, 0x8979, 0x1078, 0x61cd, 0x1078, 0x8ec6, 0x1078,
++	0x62d1, 0x007c, 0x057e, 0x067e, 0x0d7e, 0x0f7e, 0x2029, 0x0001,
++	0xa182, 0x0101, 0x00c8, 0x8986, 0x0078, 0x8988, 0x2009, 0x0100,
++	0x2130, 0x2069, 0xab98, 0x831c, 0x2300, 0xad18, 0x2009, 0x0020,
++	0xaf90, 0x001d, 0x1078, 0x89e2, 0xa6b2, 0x0020, 0x7804, 0xa06d,
++	0x0040, 0x899c, 0x1078, 0x13b4, 0x1078, 0x138b, 0x0040, 0x89c6,
++	0x8528, 0x6837, 0x0110, 0x683b, 0x0000, 0x2d20, 0x7c06, 0xa68a,
++	0x003d, 0x00c8, 0x89b2, 0x2608, 0xad90, 0x000f, 0x1078, 0x89e2,
++	0x0078, 0x89c6, 0xa6b2, 0x003c, 0x2009, 0x003c, 0x2d78, 0xad90,
++	0x000f, 0x1078, 0x89e2, 0x0078, 0x899c, 0x0f7f, 0x852f, 0xa5ad,
++	0x0003, 0x7d36, 0xa5ac, 0x0000, 0x0078, 0x89cb, 0x0f7f, 0x852f,
++	0xa5ad, 0x0003, 0x7d36, 0x0d7f, 0x067f, 0x057f, 0x007c, 0x0f7e,
++	0x8dff, 0x0040, 0x89e0, 0x6804, 0xa07d, 0x0040, 0x89de, 0x6807,
++	0x0000, 0x1078, 0x4a73, 0x2f68, 0x0078, 0x89d3, 0x1078, 0x4a73,
++	0x0f7f, 0x007c, 0x157e, 0xa184, 0x0001, 0x0040, 0x89e8, 0x8108,
++	0x810c, 0x21a8, 0x2304, 0x8007, 0x2012, 0x8318, 0x8210, 0x00f0,
++	0x89ea, 0x157f, 0x007c, 0x067e, 0x127e, 0x2091, 0x8000, 0x2031,
++	0x0001, 0x601c, 0xa084, 0x000f, 0x1079, 0x8a0f, 0x127f, 0x067f,
++	0x007c, 0x127e, 0x2091, 0x8000, 0x067e, 0x2031, 0x0000, 0x601c,
++	0xa084, 0x000f, 0x1079, 0x8a0f, 0x067f, 0x127f, 0x007c, 0x8a29,
++	0x8a17, 0x8a24, 0x8a45, 0x8a17, 0x8a24, 0x8a45, 0x8a24, 0x1078,
++	0x1332, 0x037e, 0x2019, 0x0010, 0x1078, 0x9dc7, 0x601f, 0x0006,
++	0x6003, 0x0007, 0x037f, 0x007c, 0xa006, 0x007c, 0xa085, 0x0001,
++	0x007c, 0x0d7e, 0x86ff, 0x00c0, 0x8a40, 0x6010, 0x2068, 0x1078,
++	0x8d06, 0x0040, 0x8a42, 0xa00e, 0x2001, 0x0005, 0x1078, 0x4b51,
++	0x1078, 0x8f85, 0x1078, 0x4a73, 0x1078, 0x772d, 0xa085, 0x0001,
++	0x0d7f, 0x007c, 0xa006, 0x0078, 0x8a40, 0x6000, 0xa08a, 0x0010,
++	0x10c8, 0x1332, 0x1079, 0x8a4d, 0x007c, 0x8a5d, 0x8a82, 0x8a5f,
++	0x8aa5, 0x8a7e, 0x8a5d, 0x8a24, 0x8a29, 0x8a29, 0x8a24, 0x8a24,
++	0x8a24, 0x8a24, 0x8a24, 0x8a24, 0x8a24, 0x1078, 0x1332, 0x86ff,
++	0x00c0, 0x8a7b, 0x601c, 0xa086, 0x0006, 0x0040, 0x8a7b, 0x0d7e,
++	0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x8a70, 0x1078, 0x8f85,
++	0x0d7f, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x1078,
++	0x5d8a, 0x1078, 0x62d1, 0xa085, 0x0001, 0x007c, 0x1078, 0x1757,
++	0x0078, 0x8a5f, 0x0e7e, 0x2071, 0xa8b1, 0x7024, 0xac06, 0x00c0,
++	0x8a8b, 0x1078, 0x6fc4, 0x601c, 0xa084, 0x000f, 0xa086, 0x0006,
++	0x00c0, 0x8a9d, 0x087e, 0x097e, 0x2049, 0x0001, 0x2c40, 0x1078,
++	0x7246, 0x097f, 0x087f, 0x0078, 0x8a9f, 0x1078, 0x6ebe, 0x0e7f,
++	0x00c0, 0x8a5f, 0x1078, 0x8a24, 0x007c, 0x037e, 0x0e7e, 0x2071,
++	0xa8b1, 0x703c, 0xac06, 0x00c0, 0x8ab5, 0x2019, 0x0000, 0x1078,
++	0x7058, 0x0e7f, 0x037f, 0x0078, 0x8a5f, 0x1078, 0x738a, 0x0e7f,
++	0x037f, 0x00c0, 0x8a5f, 0x1078, 0x8a24, 0x007c, 0x0c7e, 0x601c,
++	0xa084, 0x000f, 0x1079, 0x8ac6, 0x0c7f, 0x007c, 0x8ad5, 0x8b47,
++	0x8c7f, 0x8ae0, 0x8ec6, 0x8ad5, 0x9db8, 0x772d, 0x8b47, 0x1078,
++	0x8f00, 0x00c0, 0x8ad5, 0x1078, 0x7c83, 0x007c, 0x1078, 0x61cd,
++	0x1078, 0x62d1, 0x1078, 0x772d, 0x007c, 0x6017, 0x0001, 0x007c,
++	0x1078, 0x8d06, 0x0040, 0x8ae8, 0x6010, 0xa080, 0x0019, 0x2c02,
++	0x6000, 0xa08a, 0x0010, 0x10c8, 0x1332, 0x1079, 0x8af0, 0x007c,
++	0x8b00, 0x8b02, 0x8b24, 0x8b36, 0x8b43, 0x8b00, 0x8ad5, 0x8ad5,
++	0x8ad5, 0x8b36, 0x8b36, 0x8b00, 0x8b00, 0x8b00, 0x8b00, 0x8b40,
++	0x1078, 0x1332, 0x0e7e, 0x6010, 0x2070, 0x7050, 0xc0b5, 0x7052,
++	0x2071, 0xa8b1, 0x7024, 0xac06, 0x0040, 0x8b20, 0x1078, 0x6ebe,
++	0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x2001, 0xa8a3,
++	0x2004, 0x6016, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0e7f, 0x007c,
++	0x6017, 0x0001, 0x0078, 0x8b1e, 0x0d7e, 0x6010, 0x2068, 0x6850,
++	0xc0b5, 0x6852, 0x0d7f, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f,
++	0x0002, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x007c, 0x0d7e, 0x6017,
++	0x0001, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852, 0x0d7f, 0x007c,
++	0x1078, 0x772d, 0x007c, 0x1078, 0x1757, 0x0078, 0x8b24, 0x6000,
++	0xa08a, 0x0010, 0x10c8, 0x1332, 0x1079, 0x8b4f, 0x007c, 0x8b5f,
++	0x8add, 0x8b61, 0x8b5f, 0x8b61, 0x8b61, 0x8ad6, 0x8b5f, 0x8acf,
++	0x8acf, 0x8b5f, 0x8b5f, 0x8b5f, 0x8b5f, 0x8b5f, 0x8b5f, 0x1078,
++	0x1332, 0x0d7e, 0x6018, 0x2068, 0x6804, 0xa084, 0x00ff, 0x0d7f,
++	0xa08a, 0x000c, 0x10c8, 0x1332, 0x1079, 0x8b6f, 0x007c, 0x8b7b,
++	0x8c23, 0x8b7d, 0x8bbd, 0x8b7d, 0x8bbd, 0x8b7d, 0x8b8a, 0x8b7b,
++	0x8bbd, 0x8b7b, 0x8ba7, 0x1078, 0x1332, 0x6004, 0xa08e, 0x0016,
++	0x0040, 0x8bb8, 0xa08e, 0x0004, 0x0040, 0x8bb8, 0xa08e, 0x0002,
++	0x0040, 0x8bb8, 0x6004, 0x1078, 0x8f00, 0x0040, 0x8c3e, 0xa08e,
++	0x0021, 0x0040, 0x8c42, 0xa08e, 0x0022, 0x0040, 0x8c3e, 0xa08e,
++	0x003d, 0x0040, 0x8c42, 0xa08e, 0x0039, 0x0040, 0x8c46, 0xa08e,
++	0x0035, 0x0040, 0x8c46, 0xa08e, 0x001e, 0x0040, 0x8bba, 0xa08e,
++	0x0001, 0x00c0, 0x8bb6, 0x0d7e, 0x6018, 0x2068, 0x6804, 0xa084,
++	0x00ff, 0x0d7f, 0xa086, 0x0006, 0x0040, 0x8bb8, 0x1078, 0x2880,
++	0x1078, 0x7c83, 0x1078, 0x8ec6, 0x007c, 0x0c7e, 0x0d7e, 0x6104,
++	0xa186, 0x0016, 0x0040, 0x8c13, 0xa186, 0x0002, 0x00c0, 0x8be6,
++	0x6018, 0x2068, 0x68a0, 0xd0bc, 0x00c0, 0x8c6a, 0x6840, 0xa084,
++	0x00ff, 0xa005, 0x0040, 0x8be6, 0x8001, 0x6842, 0x6013, 0x0000,
++	0x601f, 0x0007, 0x6017, 0x0398, 0x1078, 0x76c7, 0x0040, 0x8be6,
++	0x2d00, 0x601a, 0x601f, 0x0001, 0x0078, 0x8c13, 0x0d7f, 0x0c7f,
++	0x6004, 0xa08e, 0x0002, 0x00c0, 0x8c04, 0x6018, 0xa080, 0x0028,
++	0x2004, 0xa086, 0x007e, 0x00c0, 0x8c04, 0x2009, 0xa633, 0x2104,
++	0xc085, 0x200a, 0x0e7e, 0x2071, 0xa600, 0x1078, 0x42b8, 0x0e7f,
++	0x1078, 0x7c83, 0x0078, 0x8c08, 0x1078, 0x7c83, 0x1078, 0x2880,
++	0x0e7e, 0x127e, 0x2091, 0x8000, 0x1078, 0x28a6, 0x127f, 0x0e7f,
++	0x1078, 0x8ec6, 0x007c, 0x2001, 0x0002, 0x1078, 0x4502, 0x6003,
++	0x0001, 0x6007, 0x0002, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0d7f,
++	0x0c7f, 0x0078, 0x8c12, 0x0c7e, 0x0d7e, 0x6104, 0xa186, 0x0016,
++	0x0040, 0x8c13, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005,
++	0x0040, 0x8be6, 0x8001, 0x6842, 0x6003, 0x0001, 0x1078, 0x5dd7,
++	0x1078, 0x62d1, 0x0d7f, 0x0c7f, 0x0078, 0x8c12, 0x1078, 0x7c83,
++	0x0078, 0x8bba, 0x1078, 0x7ca6, 0x0078, 0x8bba, 0x0d7e, 0x2c68,
++	0x6104, 0x1078, 0x91bc, 0x0d7f, 0x0040, 0x8c52, 0x1078, 0x772d,
++	0x0078, 0x8c69, 0x6004, 0x8007, 0x6130, 0xa18c, 0x00ff, 0xa105,
++	0x6032, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x6038,
++	0x600a, 0x2001, 0xa8a3, 0x2004, 0x6016, 0x1078, 0x5d8a, 0x1078,
++	0x62d1, 0x007c, 0x0d7f, 0x0c7f, 0x1078, 0x7c83, 0x1078, 0x2880,
++	0x0e7e, 0x127e, 0x2091, 0x8000, 0x1078, 0x28a6, 0x6013, 0x0000,
++	0x601f, 0x0007, 0x6017, 0x0398, 0x127f, 0x0e7f, 0x007c, 0x6000,
++	0xa08a, 0x0010, 0x10c8, 0x1332, 0x1079, 0x8c87, 0x007c, 0x8c97,
++	0x8c97, 0x8c97, 0x8c97, 0x8c97, 0x8c97, 0x8c97, 0x8c97, 0x8c97,
++	0x8ad5, 0x8c97, 0x8add, 0x8c99, 0x8add, 0x8ca7, 0x8c97, 0x1078,
++	0x1332, 0x6004, 0xa086, 0x008b, 0x0040, 0x8ca7, 0x6007, 0x008b,
++	0x6003, 0x000d, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x007c, 0x1078,
++	0x8eb9, 0x1078, 0x8d06, 0x0040, 0x8cdf, 0x1078, 0x2880, 0x0d7e,
++	0x1078, 0x8d06, 0x0040, 0x8cc1, 0x6010, 0x2068, 0x6837, 0x0103,
++	0x684b, 0x0006, 0x6847, 0x0000, 0x6850, 0xc0ed, 0x6852, 0x1078,
++	0x4a73, 0x2c68, 0x1078, 0x76c7, 0x0040, 0x8ccf, 0x6818, 0x601a,
++	0x0c7e, 0x2d60, 0x1078, 0x8ec6, 0x0c7f, 0x0078, 0x8cd0, 0x2d60,
++	0x0d7f, 0x6013, 0x0000, 0x601f, 0x0001, 0x6007, 0x0001, 0x6003,
++	0x0001, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0078, 0x8cf1, 0x6030,
++	0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0040, 0x8ceb, 0xa186,
++	0x0035, 0x00c0, 0x8cef, 0x1078, 0x2880, 0x0078, 0x8cc1, 0x1078,
++	0x8ec6, 0x007c, 0xa284, 0x000f, 0x00c0, 0x8d03, 0xa282, 0xad00,
++	0x0048, 0x8d03, 0x2001, 0xa616, 0x2004, 0xa202, 0x00c8, 0x8d03,
++	0xa085, 0x0001, 0x007c, 0xa006, 0x0078, 0x8d02, 0x027e, 0x0e7e,
++	0x2071, 0xa600, 0x6210, 0x705c, 0xa202, 0x0048, 0x8d18, 0x7060,
++	0xa202, 0x00c8, 0x8d18, 0xa085, 0x0001, 0x0e7f, 0x027f, 0x007c,
++	0xa006, 0x0078, 0x8d15, 0x0e7e, 0x0c7e, 0x037e, 0x007e, 0x127e,
++	0x2091, 0x8000, 0x2061, 0xad00, 0x2071, 0xa600, 0x7348, 0x7064,
++	0xa302, 0x00c8, 0x8d45, 0x601c, 0xa206, 0x00c0, 0x8d3d, 0x1078,
++	0x902b, 0x0040, 0x8d3d, 0x1078, 0x8f00, 0x00c0, 0x8d39, 0x1078,
++	0x7c83, 0x0c7e, 0x1078, 0x772d, 0x0c7f, 0xace0, 0x0010, 0x7058,
++	0xac02, 0x00c8, 0x8d45, 0x0078, 0x8d26, 0x127f, 0x007f, 0x037f,
++	0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x0c7e, 0x017e, 0xa188, 0xa735,
++	0x210c, 0x81ff, 0x0040, 0x8d59, 0x2061, 0xa9b3, 0x611a, 0x1078,
++	0x2880, 0xa006, 0x0078, 0x8d5e, 0xa085, 0x0001, 0x017f, 0x0c7f,
++	0x0e7f, 0x007c, 0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000, 0x0c7e,
++	0x1078, 0x76c7, 0x057f, 0x0040, 0x8d7b, 0x6612, 0x651a, 0x601f,
++	0x0003, 0x2009, 0x004b, 0x1078, 0x775c, 0xa085, 0x0001, 0x127f,
++	0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8d77, 0x0c7e, 0x057e,
++	0x127e, 0x2091, 0x8000, 0x62a0, 0x0c7e, 0x1078, 0x76c7, 0x057f,
++	0x0040, 0x8da9, 0x6013, 0x0000, 0x651a, 0x601f, 0x0003, 0x0c7e,
++	0x2560, 0x1078, 0x47e9, 0x0c7f, 0x1078, 0x5f01, 0x077e, 0x2039,
++	0x0000, 0x1078, 0x5e0a, 0x2c08, 0x1078, 0x9f8b, 0x077f, 0x2009,
++	0x004c, 0x1078, 0x775c, 0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f,
++	0x007c, 0xa006, 0x0078, 0x8da5, 0x0f7e, 0x0c7e, 0x047e, 0x0c7e,
++	0x1078, 0x76c7, 0x2c78, 0x0c7f, 0x0040, 0x8dc6, 0x7e12, 0x2c00,
++	0x781a, 0x781f, 0x0003, 0x2021, 0x0005, 0x1078, 0x8e11, 0x2f60,
++	0x2009, 0x004d, 0x1078, 0x775c, 0xa085, 0x0001, 0x047f, 0x0c7f,
++	0x0f7f, 0x007c, 0x0f7e, 0x0c7e, 0x047e, 0x0c7e, 0x1078, 0x76c7,
++	0x2c78, 0x0c7f, 0x0040, 0x8de4, 0x7e12, 0x2c00, 0x781a, 0x781f,
++	0x0003, 0x2021, 0x0005, 0x1078, 0x8e11, 0x2f60, 0x2009, 0x004e,
++	0x1078, 0x775c, 0xa085, 0x0001, 0x047f, 0x0c7f, 0x0f7f, 0x007c,
++	0x0f7e, 0x0c7e, 0x047e, 0x0c7e, 0x1078, 0x76c7, 0x2c78, 0x0c7f,
++	0x0040, 0x8e0d, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021,
++	0x0004, 0x1078, 0x8e11, 0x2001, 0xa89d, 0x2004, 0xd0fc, 0x0040,
++	0x8e06, 0x2f60, 0x1078, 0x772d, 0x0078, 0x8e0b, 0x2f60, 0x2009,
++	0x0052, 0x1078, 0x775c, 0xa085, 0x0001, 0x047f, 0x0c7f, 0x0f7f,
++	0x007c, 0x097e, 0x077e, 0x127e, 0x2091, 0x8000, 0x1078, 0x4775,
++	0x0040, 0x8e1e, 0x2001, 0x8e16, 0x0078, 0x8e24, 0x1078, 0x4739,
++	0x0040, 0x8e2d, 0x2001, 0x8e1e, 0x007e, 0xa00e, 0x2400, 0x1078,
++	0x4b51, 0x1078, 0x4a73, 0x007f, 0x007a, 0x2418, 0x1078, 0x6161,
++	0x62a0, 0x087e, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, 0x1078,
++	0x5f1b, 0x087f, 0x1078, 0x5e0a, 0x2f08, 0x2648, 0x1078, 0x9f8b,
++	0x613c, 0x81ff, 0x1040, 0x5fdb, 0x1078, 0x62d1, 0x127f, 0x077f,
++	0x097f, 0x007c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078,
++	0x76c7, 0x017f, 0x0040, 0x8e63, 0x660a, 0x611a, 0x601f, 0x0001,
++	0x2d00, 0x6012, 0x2009, 0x001f, 0x1078, 0x775c, 0xa085, 0x0001,
++	0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8e60, 0x0c7e, 0x127e,
++	0x2091, 0x8000, 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x8e7f,
++	0x660a, 0x611a, 0x601f, 0x0008, 0x2d00, 0x6012, 0x2009, 0x0021,
++	0x1078, 0x775c, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006,
++	0x0078, 0x8e7c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078,
++	0x76c7, 0x017f, 0x0040, 0x8e9b, 0x660a, 0x611a, 0x601f, 0x0001,
++	0x2d00, 0x6012, 0x2009, 0x003d, 0x1078, 0x775c, 0xa085, 0x0001,
++	0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8e98, 0x0c7e, 0x127e,
++	0x2091, 0x8000, 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x8eb6,
++	0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0000, 0x1078,
++	0x775c, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078,
++	0x8eb3, 0x027e, 0x0d7e, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0040,
++	0x8ec3, 0x8211, 0x6a3e, 0x0d7f, 0x027f, 0x007c, 0x007e, 0x6000,
++	0xa086, 0x0000, 0x0040, 0x8ed8, 0x6013, 0x0000, 0x601f, 0x0007,
++	0x2001, 0xa8a3, 0x2004, 0x6016, 0x1078, 0xa495, 0x603f, 0x0000,
++	0x007f, 0x007c, 0x067e, 0x0c7e, 0x0d7e, 0x2031, 0xa653, 0x2634,
++	0xd6e4, 0x0040, 0x8ee8, 0x6618, 0x2660, 0x6e48, 0x1078, 0x46e7,
++	0x0d7f, 0x0c7f, 0x067f, 0x007c, 0x007e, 0x017e, 0x6004, 0xa08e,
++	0x0002, 0x0040, 0x8efd, 0xa08e, 0x0003, 0x0040, 0x8efd, 0xa08e,
++	0x0004, 0x0040, 0x8efd, 0xa085, 0x0001, 0x017f, 0x007f, 0x007c,
++	0x007e, 0x0d7e, 0x6010, 0xa06d, 0x0040, 0x8f0d, 0x6838, 0xd0fc,
++	0x0040, 0x8f0d, 0xa006, 0x0078, 0x8f0f, 0xa085, 0x0001, 0x0d7f,
++	0x007f, 0x007c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078,
++	0x76c7, 0x017f, 0x0040, 0x8f2c, 0x611a, 0x601f, 0x0001, 0x2d00,
++	0x6012, 0x1078, 0x2880, 0x2009, 0x0028, 0x1078, 0x775c, 0xa085,
++	0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8f29, 0xa186,
++	0x0015, 0x00c0, 0x8f44, 0x2011, 0xa620, 0x2204, 0xa086, 0x0074,
++	0x00c0, 0x8f44, 0x1078, 0x7f91, 0x6003, 0x0001, 0x6007, 0x0029,
++	0x1078, 0x5dd7, 0x0078, 0x8f48, 0x1078, 0x7c83, 0x1078, 0x772d,
++	0x007c, 0xa186, 0x0016, 0x00c0, 0x8f53, 0x2001, 0x0004, 0x1078,
++	0x4502, 0x0078, 0x8f74, 0xa186, 0x0015, 0x00c0, 0x8f78, 0x2011,
++	0xa620, 0x2204, 0xa086, 0x0014, 0x00c0, 0x8f78, 0x0d7e, 0x6018,
++	0x2068, 0x1078, 0x4649, 0x0d7f, 0x1078, 0x8043, 0x00c0, 0x8f78,
++	0x0d7e, 0x6018, 0x2068, 0x6890, 0x0d7f, 0xa005, 0x0040, 0x8f78,
++	0x2001, 0x0006, 0x1078, 0x4502, 0x1078, 0x77f8, 0x0078, 0x8f7c,
++	0x1078, 0x7c83, 0x1078, 0x772d, 0x007c, 0x6848, 0xa086, 0x0005,
++	0x00c0, 0x8f84, 0x1078, 0x8f85, 0x007c, 0x6850, 0xc0ad, 0x6852,
++	0x007c, 0x0e7e, 0x2071, 0xab8c, 0x7014, 0xd0e4, 0x0040, 0x8f9a,
++	0x6013, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x1078, 0x5d8a,
++	0x1078, 0x62d1, 0x0e7f, 0x007c, 0x0c7e, 0x0f7e, 0x2c78, 0x1078,
++	0x4963, 0x0f7f, 0x0040, 0x8fa9, 0x601c, 0xa084, 0x000f, 0x1079,
++	0x8fab, 0x0c7f, 0x007c, 0x8ad5, 0x8fb6, 0x8fb9, 0x8fbc, 0xa25d,
++	0xa279, 0xa27c, 0x8ad5, 0x8ad5, 0x1078, 0x1332, 0x0005, 0x0005,
++	0x007c, 0x0005, 0x0005, 0x007c, 0x1078, 0x8fbf, 0x007c, 0x0f7e,
++	0x2c78, 0x1078, 0x4963, 0x0040, 0x8fee, 0x1078, 0x76c7, 0x00c0,
++	0x8fcf, 0x2001, 0xa8a4, 0x2004, 0x783e, 0x0078, 0x8fee, 0x7818,
++	0x601a, 0x781c, 0xa086, 0x0003, 0x0040, 0x8fdc, 0x7808, 0x6036,
++	0x2f00, 0x603a, 0x0078, 0x8fe0, 0x7808, 0x603a, 0x2f00, 0x6036,
++	0x602a, 0x601f, 0x0001, 0x6007, 0x0035, 0x6003, 0x0001, 0x7920,
++	0x6122, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x2f60, 0x0f7f, 0x007c,
++	0x017e, 0x0f7e, 0x682c, 0x6032, 0xa08e, 0x0001, 0x0040, 0x9001,
++	0xa086, 0x0005, 0x0040, 0x9005, 0xa006, 0x602a, 0x602e, 0x0078,
++	0x9016, 0x6824, 0xc0f4, 0xc0d5, 0x6826, 0x6810, 0x2078, 0x787c,
++	0x6938, 0xa102, 0x7880, 0x6934, 0xa103, 0x00c8, 0x8ffc, 0x6834,
++	0x602a, 0x6838, 0xa084, 0xfffc, 0x683a, 0x602e, 0x2d00, 0x6036,
++	0x6808, 0x603a, 0x6918, 0x611a, 0x6920, 0x6122, 0x601f, 0x0001,
++	0x6007, 0x0039, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x6803, 0x0002,
++	0x0f7f, 0x017f, 0x007c, 0x007e, 0x017e, 0x6004, 0xa08e, 0x0034,
++	0x0040, 0x9050, 0xa08e, 0x0035, 0x0040, 0x9050, 0xa08e, 0x0036,
++	0x0040, 0x9050, 0xa08e, 0x0037, 0x0040, 0x9050, 0xa08e, 0x0038,
++	0x0040, 0x9050, 0xa08e, 0x0039, 0x0040, 0x9050, 0xa08e, 0x003a,
++	0x0040, 0x9050, 0xa08e, 0x003b, 0x0040, 0x9050, 0xa085, 0x0001,
++	0x017f, 0x007f, 0x007c, 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x00c0,
++	0x905d, 0xa085, 0x0001, 0x0078, 0x906c, 0x6024, 0xd0f4, 0x00c0,
++	0x906b, 0xc0f5, 0x6026, 0x6010, 0x2078, 0x7828, 0x603a, 0x782c,
++	0x6036, 0x1078, 0x1757, 0xa006, 0x0f7f, 0x007c, 0x007e, 0x017e,
++	0x027e, 0x037e, 0x0e7e, 0x2001, 0xa89e, 0x200c, 0x8000, 0x2014,
++	0x2001, 0x0032, 0x1078, 0x5c1c, 0x2001, 0xa8a2, 0x82ff, 0x00c0,
++	0x9083, 0x2011, 0x0014, 0x2202, 0x2001, 0xa8a0, 0x200c, 0x8000,
++	0x2014, 0x2071, 0xa88d, 0x711a, 0x721e, 0x2001, 0x0064, 0x1078,
++	0x5c1c, 0x2001, 0xa8a3, 0x82ff, 0x00c0, 0x9098, 0x2011, 0x0014,
++	0x2202, 0x2009, 0xa8a4, 0xa280, 0x000a, 0x200a, 0x1078, 0x498b,
++	0x0e7f, 0x037f, 0x027f, 0x017f, 0x007f, 0x007c, 0x007e, 0x0e7e,
++	0x2001, 0xa8a2, 0x2003, 0x0028, 0x2001, 0xa8a3, 0x2003, 0x0014,
++	0x2071, 0xa88d, 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, 0xa8a4,
++	0x2003, 0x001e, 0x0e7f, 0x007f, 0x007c, 0x0c7e, 0x127e, 0x2091,
++	0x8000, 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x90d5, 0x611a,
++	0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0033, 0x1078, 0x775c,
++	0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x90d2,
++	0x0d7e, 0x0e7e, 0x0f7e, 0x2071, 0xa600, 0xa186, 0x0015, 0x00c0,
++	0x9107, 0x7080, 0xa086, 0x0018, 0x00c0, 0x9107, 0x6010, 0x2068,
++	0x6a3c, 0xd2e4, 0x00c0, 0x90fb, 0x2c78, 0x1078, 0x6490, 0x0040,
++	0x910f, 0x706c, 0x6a50, 0xa206, 0x00c0, 0x9103, 0x7070, 0x6a54,
++	0xa206, 0x00c0, 0x9103, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009,
++	0x0000, 0x1078, 0x28c8, 0x1078, 0x77f8, 0x0078, 0x910b, 0x1078,
++	0x7c83, 0x1078, 0x772d, 0x0f7f, 0x0e7f, 0x0d7f, 0x007c, 0x7050,
++	0xa080, 0x29c0, 0x2004, 0x6a54, 0xa206, 0x0040, 0x90fb, 0x0078,
++	0x9103, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, 0x76c7,
++	0x017f, 0x0040, 0x9131, 0x611a, 0x601f, 0x0001, 0x2d00, 0x6012,
++	0x2009, 0x0043, 0x1078, 0x775c, 0xa085, 0x0001, 0x127f, 0x0c7f,
++	0x007c, 0xa006, 0x0078, 0x912e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2071,
++	0xa600, 0xa186, 0x0015, 0x00c0, 0x915a, 0x7080, 0xa086, 0x0004,
++	0x00c0, 0x915a, 0x6010, 0xa0e8, 0x000f, 0x2c78, 0x1078, 0x6490,
++	0x0040, 0x9162, 0x706c, 0x6a08, 0xa206, 0x00c0, 0x9156, 0x7070,
++	0x6a0c, 0xa206, 0x00c0, 0x9156, 0x1078, 0x2880, 0x1078, 0x77f8,
++	0x0078, 0x915e, 0x1078, 0x7c83, 0x1078, 0x772d, 0x0f7f, 0x0e7f,
++	0x0d7f, 0x007c, 0x7050, 0xa080, 0x29c0, 0x2004, 0x6a0c, 0xa206,
++	0x0040, 0x9154, 0x0078, 0x9156, 0x017e, 0x027e, 0x684c, 0xd0ac,
++	0x0040, 0x9184, 0x6914, 0x6a10, 0x2100, 0xa205, 0x0040, 0x9184,
++	0x6860, 0xa106, 0x00c0, 0x9180, 0x685c, 0xa206, 0x0040, 0x9184,
++	0x6962, 0x6a5e, 0xa085, 0x0001, 0x027f, 0x017f, 0x007c, 0x0e7e,
++	0x127e, 0x2071, 0xa600, 0x2091, 0x8000, 0x7548, 0xa582, 0x0001,
++	0x0048, 0x91b9, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0040,
++	0x91a5, 0xace0, 0x0010, 0x7058, 0xac02, 0x00c8, 0x91a1, 0x0078,
++	0x9194, 0x2061, 0xad00, 0x0078, 0x9194, 0x6003, 0x0008, 0x8529,
++	0x754a, 0xaca8, 0x0010, 0x7058, 0xa502, 0x00c8, 0x91b5, 0x754e,
++	0xa085, 0x0001, 0x127f, 0x0e7f, 0x007c, 0x704f, 0xad00, 0x0078,
++	0x91b0, 0xa006, 0x0078, 0x91b2, 0x0c7e, 0x027e, 0x017e, 0xa186,
++	0x0035, 0x0040, 0x91c6, 0x6a34, 0x0078, 0x91c7, 0x6a28, 0x1078,
++	0x8cf2, 0x0040, 0x91f0, 0x2260, 0x611c, 0xa186, 0x0003, 0x0040,
++	0x91d5, 0xa186, 0x0006, 0x00c0, 0x91ec, 0x6834, 0xa206, 0x0040,
++	0x91e4, 0x6838, 0xa206, 0x00c0, 0x91ec, 0x6108, 0x6834, 0xa106,
++	0x00c0, 0x91ec, 0x0078, 0x91e9, 0x6008, 0x6938, 0xa106, 0x00c0,
++	0x91ec, 0x6018, 0x6918, 0xa106, 0x017f, 0x027f, 0x0c7f, 0x007c,
++	0xa085, 0x0001, 0x0078, 0x91ec, 0x6944, 0xd1cc, 0x0040, 0x920d,
++	0xa18c, 0x00ff, 0xa18e, 0x0002, 0x00c0, 0x920d, 0xad88, 0x001e,
++	0x210c, 0xa18c, 0x0f00, 0x810f, 0xa18e, 0x0001, 0x00c0, 0x920d,
++	0x6810, 0x6914, 0xa115, 0x10c0, 0x84d5, 0x007c, 0x067e, 0x6000,
++	0xa0b2, 0x0010, 0x10c8, 0x1332, 0x1079, 0x9218, 0x067f, 0x007c,
++	0x9228, 0x96df, 0x97fb, 0x9228, 0x9228, 0x9228, 0x9228, 0x9228,
++	0x9262, 0x988e, 0x9228, 0x9228, 0x9228, 0x9228, 0x9228, 0x9228,
++	0x1078, 0x1332, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x1332,
++	0x1079, 0x9234, 0x067f, 0x007c, 0x9244, 0x9d53, 0x9244, 0x9244,
++	0x9244, 0x9244, 0x9244, 0x9244, 0x9d11, 0x9da1, 0x9244, 0xa3b0,
++	0xa3e4, 0xa3b0, 0xa3e4, 0x9244, 0x1078, 0x1332, 0x067e, 0x6000,
++	0xa0b2, 0x0010, 0x10c8, 0x1332, 0x1079, 0x9250, 0x067f, 0x007c,
++	0x9260, 0x99eb, 0x9ac7, 0x9af5, 0x9b70, 0x9260, 0x9c76, 0x9c1e,
++	0x989a, 0x9ce5, 0x9cfb, 0x9260, 0x9260, 0x9260, 0x9260, 0x9260,
++	0x1078, 0x1332, 0xa1b2, 0x0044, 0x10c8, 0x1332, 0x2100, 0x0079,
++	0x9269, 0x92a9, 0x9498, 0x92a9, 0x92a9, 0x92a9, 0x94a0, 0x92a9,
++	0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9,
++	0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9,
++	0x92ab, 0x9311, 0x9320, 0x9377, 0x9396, 0x9415, 0x9485, 0x92a9,
++	0x92a9, 0x94a4, 0x92a9, 0x92a9, 0x94b7, 0x94c2, 0x92a9, 0x92a9,
++	0x92a9, 0x92a9, 0x92a9, 0x94fa, 0x92a9, 0x92a9, 0x9509, 0x92a9,
++	0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x9522, 0x92a9, 0x92a9,
++	0x92a9, 0x95af, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9,
++	0x9629, 0x1078, 0x1332, 0x1078, 0x4967, 0x00c0, 0x92bb, 0x2001,
++	0xa633, 0x2004, 0xd0cc, 0x00c0, 0x92bb, 0xa084, 0x0009, 0xa086,
++	0x0008, 0x00c0, 0x92c3, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013,
++	0x0000, 0x0078, 0x9493, 0x1078, 0x4957, 0x0e7e, 0x0c7e, 0x037e,
++	0x027e, 0x017e, 0x6218, 0x2270, 0x72a0, 0x027e, 0x2019, 0x0029,
++	0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a, 0x2c08,
++	0x1078, 0x9f8b, 0x077f, 0x017f, 0x2e60, 0x1078, 0x47e9, 0x017f,
++	0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x6618, 0x0c7e, 0x2660, 0x1078,
++	0x45d6, 0x0c7f, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082,
++	0x0006, 0x0048, 0x9303, 0x1078, 0x9ebf, 0x00c0, 0x9371, 0x1078,
++	0x9e50, 0x00c0, 0x92ff, 0x6007, 0x0008, 0x0078, 0x9493, 0x6007,
++	0x0009, 0x0078, 0x9493, 0x1078, 0xa09f, 0x0040, 0x930d, 0x1078,
++	0x9ebf, 0x0040, 0x92f7, 0x0078, 0x9371, 0x6013, 0x1900, 0x0078,
++	0x92ff, 0x1078, 0x29bb, 0x00c0, 0x9664, 0x6106, 0x1078, 0x9e05,
++	0x6007, 0x0006, 0x0078, 0x9493, 0x6007, 0x0007, 0x0078, 0x9493,
++	0x1078, 0xa41c, 0x00c0, 0x9664, 0x1078, 0x29bb, 0x00c0, 0x9664,
++	0x0d7e, 0x6618, 0x2668, 0x6e04, 0xa684, 0x00ff, 0xa082, 0x0006,
++	0x00c8, 0x9336, 0x2001, 0x0001, 0x1078, 0x44ee, 0xa6b4, 0xff00,
++	0x8637, 0xa686, 0x0006, 0x0040, 0x9353, 0xa686, 0x0004, 0x0040,
++	0x9353, 0x6e04, 0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0040, 0x9353,
++	0xa686, 0x0004, 0x0040, 0x9353, 0xa686, 0x0005, 0x0040, 0x9353,
++	0x0d7f, 0x0078, 0x9371, 0x1078, 0x9f25, 0x00c0, 0x936c, 0xa686,
++	0x0006, 0x00c0, 0x9365, 0x027e, 0x6218, 0xa290, 0x0028, 0x2214,
++	0x2009, 0x0000, 0x1078, 0x28c8, 0x027f, 0x1078, 0x4649, 0x6007,
++	0x000a, 0x0d7f, 0x0078, 0x9493, 0x6007, 0x000b, 0x0d7f, 0x0078,
++	0x9493, 0x1078, 0x2880, 0x6007, 0x0001, 0x0078, 0x9493, 0x1078,
++	0xa41c, 0x00c0, 0x9664, 0x1078, 0x29bb, 0x00c0, 0x9664, 0x6618,
++	0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa686, 0x0707, 0x0040, 0x9371,
++	0x027e, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x1078,
++	0x28c8, 0x027f, 0x6007, 0x000c, 0x0078, 0x9493, 0x1078, 0x4967,
++	0x00c0, 0x93a3, 0x2001, 0xa633, 0x2004, 0xa084, 0x0009, 0xa086,
++	0x0008, 0x00c0, 0x93ab, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013,
++	0x0000, 0x0078, 0x9493, 0x1078, 0x4957, 0x6618, 0xa6b0, 0x0001,
++	0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x93ef, 0xa6b4,
++	0xff00, 0x8637, 0xa686, 0x0004, 0x0040, 0x93c2, 0xa686, 0x0006,
++	0x00c0, 0x9371, 0x1078, 0x9f34, 0x00c0, 0x93ca, 0x6007, 0x000e,
++	0x0078, 0x9493, 0x047e, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4,
++	0x00ff, 0x8427, 0x047e, 0x1078, 0x2880, 0x047f, 0x017e, 0xa006,
++	0x2009, 0xa653, 0x210c, 0xd1a4, 0x0040, 0x93e9, 0x2009, 0x0029,
++	0x1078, 0xa21d, 0x6018, 0x0d7e, 0x2068, 0x6800, 0xc0e5, 0x6802,
++	0x0d7f, 0x017f, 0x047f, 0x6007, 0x0001, 0x0078, 0x9493, 0x2001,
++	0x0001, 0x1078, 0x44ee, 0x157e, 0x017e, 0x027e, 0x037e, 0x20a9,
++	0x0004, 0x2019, 0xa605, 0x2011, 0xab90, 0x1078, 0x80de, 0x037f,
++	0x027f, 0x017f, 0x157f, 0xa005, 0x0040, 0x940f, 0xa6b4, 0xff00,
++	0x8637, 0xa686, 0x0006, 0x0040, 0x93c2, 0x0078, 0x9371, 0x6013,
++	0x1900, 0x6007, 0x0009, 0x0078, 0x9493, 0x1078, 0x4967, 0x00c0,
++	0x9422, 0x2001, 0xa633, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008,
++	0x00c0, 0x942a, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, 0x0000,
++	0x0078, 0x9493, 0x1078, 0x4957, 0x6618, 0xa6b0, 0x0001, 0x2634,
++	0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x9472, 0xa6b4, 0xff00,
++	0x8637, 0xa686, 0x0004, 0x0040, 0x9441, 0xa686, 0x0006, 0x00c0,
++	0x9371, 0x1078, 0x9f5f, 0x00c0, 0x944d, 0x1078, 0x9e50, 0x00c0,
++	0x944d, 0x6007, 0x0010, 0x0078, 0x9493, 0x047e, 0x6418, 0xa4a0,
++	0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, 0x047e, 0x1078, 0x2880,
++	0x047f, 0x017e, 0xa006, 0x2009, 0xa653, 0x210c, 0xd1a4, 0x0040,
++	0x946c, 0x2009, 0x0029, 0x1078, 0xa21d, 0x6018, 0x0d7e, 0x2068,
++	0x6800, 0xc0e5, 0x6802, 0x0d7f, 0x017f, 0x047f, 0x6007, 0x0001,
++	0x0078, 0x9493, 0x1078, 0xa09f, 0x0040, 0x947f, 0xa6b4, 0xff00,
++	0x8637, 0xa686, 0x0006, 0x0040, 0x9441, 0x0078, 0x9371, 0x6013,
++	0x1900, 0x6007, 0x0009, 0x0078, 0x9493, 0x1078, 0x29bb, 0x00c0,
++	0x9664, 0x1078, 0xa41c, 0x00c0, 0x9664, 0x1078, 0x9667, 0x00c0,
++	0x9371, 0x6007, 0x0012, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x007c,
++	0x6007, 0x0001, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x0078, 0x9497,
++	0x6007, 0x0005, 0x0078, 0x949a, 0x1078, 0xa41c, 0x00c0, 0x9664,
++	0x1078, 0x29bb, 0x00c0, 0x9664, 0x1078, 0x9667, 0x00c0, 0x9371,
++	0x6007, 0x0020, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x007c, 0x1078,
++	0x29bb, 0x00c0, 0x9664, 0x6007, 0x0023, 0x6003, 0x0001, 0x1078,
++	0x5dd7, 0x007c, 0x1078, 0xa41c, 0x00c0, 0x9664, 0x1078, 0x29bb,
++	0x00c0, 0x9664, 0x1078, 0x9667, 0x00c0, 0x9371, 0x017e, 0x027e,
++	0x2011, 0xab90, 0x2214, 0x2c08, 0xa006, 0x1078, 0xa1e6, 0x00c0,
++	0x94e9, 0x2160, 0x6007, 0x0026, 0x6013, 0x1700, 0x2011, 0xab89,
++	0x2214, 0xa296, 0xffff, 0x00c0, 0x94f3, 0x6007, 0x0025, 0x0078,
++	0x94f3, 0x6004, 0xa086, 0x0024, 0x00c0, 0x94f0, 0x1078, 0x772d,
++	0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x027f,
++	0x017f, 0x007c, 0x1078, 0x29bb, 0x00c0, 0x9664, 0x6106, 0x1078,
++	0x9687, 0x6007, 0x002b, 0x0078, 0x9493, 0x6007, 0x002c, 0x0078,
++	0x9493, 0x1078, 0xa41c, 0x00c0, 0x9664, 0x1078, 0x29bb, 0x00c0,
++	0x9664, 0x1078, 0x9667, 0x00c0, 0x9371, 0x6106, 0x1078, 0x968c,
++	0x00c0, 0x951e, 0x6007, 0x002e, 0x0078, 0x9493, 0x6007, 0x002f,
++	0x0078, 0x9493, 0x1078, 0x29bb, 0x00c0, 0x9664, 0x0e7e, 0x0d7e,
++	0x0c7e, 0x6018, 0xa080, 0x0001, 0x200c, 0xa184, 0x00ff, 0xa086,
++	0x0006, 0x0040, 0x953f, 0xa184, 0xff00, 0x8007, 0xa086, 0x0006,
++	0x0040, 0x953f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0078, 0x9498, 0x2001,
++	0xa672, 0x2004, 0xd0e4, 0x0040, 0x95ab, 0x2071, 0xab8c, 0x7010,
++	0x6036, 0x7014, 0x603a, 0x7108, 0x720c, 0x2001, 0xa653, 0x2004,
++	0xd0a4, 0x0040, 0x955d, 0x6018, 0x2068, 0x6810, 0xa106, 0x00c0,
++	0x955d, 0x6814, 0xa206, 0x0040, 0x9581, 0x2001, 0xa653, 0x2004,
++	0xd0ac, 0x00c0, 0x959f, 0x2069, 0xa600, 0x6870, 0xa206, 0x00c0,
++	0x959f, 0x686c, 0xa106, 0x00c0, 0x959f, 0x7210, 0x1078, 0x8cf2,
++	0x0040, 0x95a5, 0x1078, 0xa28e, 0x0040, 0x95a5, 0x622a, 0x6007,
++	0x0036, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x0c7f, 0x0d7f, 0x0e7f,
++	0x007c, 0x7214, 0xa286, 0xffff, 0x0040, 0x9593, 0x1078, 0x8cf2,
++	0x0040, 0x95a5, 0xa280, 0x0002, 0x2004, 0x7110, 0xa106, 0x00c0,
++	0x95a5, 0x0078, 0x956e, 0x7210, 0x2c08, 0xa085, 0x0001, 0x1078,
++	0xa1e6, 0x2c10, 0x2160, 0x0040, 0x95a5, 0x0078, 0x956e, 0x6007,
++	0x0037, 0x6013, 0x1500, 0x0078, 0x9579, 0x6007, 0x0037, 0x6013,
++	0x1700, 0x0078, 0x9579, 0x6007, 0x0012, 0x0078, 0x9579, 0x1078,
++	0x29bb, 0x00c0, 0x9664, 0x6018, 0xa080, 0x0001, 0x2004, 0xa084,
++	0xff00, 0x8007, 0xa086, 0x0006, 0x00c0, 0x9498, 0x0e7e, 0x0d7e,
++	0x0c7e, 0x2001, 0xa672, 0x2004, 0xd0e4, 0x0040, 0x9621, 0x2069,
++	0xa600, 0x2071, 0xab8c, 0x7008, 0x6036, 0x720c, 0x623a, 0xa286,
++	0xffff, 0x00c0, 0x95de, 0x7208, 0x0c7e, 0x2c08, 0xa085, 0x0001,
++	0x1078, 0xa1e6, 0x2c10, 0x0c7f, 0x0040, 0x9615, 0x1078, 0x8cf2,
++	0x0040, 0x9615, 0x0c7e, 0x027e, 0x2260, 0x1078, 0x89f3, 0x027f,
++	0x0c7f, 0x7118, 0xa18c, 0xff00, 0x810f, 0xa186, 0x0001, 0x0040,
++	0x95ff, 0xa186, 0x0005, 0x0040, 0x95f9, 0xa186, 0x0007, 0x00c0,
++	0x9609, 0xa280, 0x0004, 0x2004, 0xa005, 0x0040, 0x9609, 0x057e,
++	0x7510, 0x7614, 0x1078, 0xa2a3, 0x057f, 0x0c7f, 0x0d7f, 0x0e7f,
++	0x007c, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, 0x2a00, 0x6003,
++	0x0001, 0x1078, 0x5d8a, 0x0078, 0x9605, 0x6007, 0x003b, 0x602b,
++	0x0009, 0x6013, 0x1700, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x0078,
++	0x9605, 0x6007, 0x003b, 0x602b, 0x000b, 0x6013, 0x0000, 0x0078,
++	0x9579, 0x0e7e, 0x027e, 0x1078, 0x4967, 0x0040, 0x965e, 0x1078,
++	0x4957, 0x1078, 0xa4a9, 0x00c0, 0x965c, 0x2071, 0xa600, 0x70cc,
++	0xc085, 0x70ce, 0x0f7e, 0x2079, 0x0100, 0x7298, 0xa284, 0x00ff,
++	0x706e, 0x78e6, 0xa284, 0xff00, 0x7270, 0xa205, 0x7072, 0x78ea,
++	0x0f7f, 0x70d7, 0x0000, 0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040,
++	0x9655, 0x2011, 0xa8ca, 0x2013, 0x07d0, 0xd0ac, 0x00c0, 0x965e,
++	0x1078, 0x2677, 0x0078, 0x965e, 0x1078, 0xa4d9, 0x027f, 0x0e7f,
++	0x1078, 0x772d, 0x0078, 0x9497, 0x1078, 0x772d, 0x007c, 0x0d7e,
++	0x067e, 0x6618, 0x2668, 0x6e04, 0xa6b4, 0xff00, 0x8637, 0xa686,
++	0x0006, 0x0040, 0x9684, 0xa686, 0x0004, 0x0040, 0x9684, 0x6e04,
++	0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0040, 0x9684, 0xa686, 0x0004,
++	0x0040, 0x9684, 0xa085, 0x0001, 0x067f, 0x0d7f, 0x007c, 0x0d7e,
++	0x1078, 0x96bb, 0x0d7f, 0x007c, 0x0d7e, 0x1078, 0x96ca, 0x00c0,
++	0x96b4, 0x680c, 0xa08c, 0xff00, 0x6820, 0xa084, 0x00ff, 0xa115,
++	0x6212, 0x6824, 0x602a, 0xd1e4, 0x0040, 0x96a2, 0x2009, 0x0001,
++	0x0078, 0x96b0, 0xd1ec, 0x0040, 0x96b4, 0x6920, 0xa18c, 0x00ff,
++	0x6824, 0x1078, 0x254d, 0x00c0, 0x96b4, 0x2110, 0x2009, 0x0000,
++	0x1078, 0x28c8, 0x0078, 0x96b8, 0xa085, 0x0001, 0x0078, 0x96b9,
++	0xa006, 0x0d7f, 0x007c, 0x2069, 0xab8d, 0x6800, 0xa082, 0x0010,
++	0x00c8, 0x96c8, 0x6013, 0x0000, 0xa085, 0x0001, 0x0078, 0x96c9,
++	0xa006, 0x007c, 0x6013, 0x0000, 0x2069, 0xab8c, 0x6808, 0xa084,
++	0xff00, 0xa086, 0x0800, 0x00c0, 0x96de, 0x6800, 0xa084, 0x00ff,
++	0xa08e, 0x0014, 0x0040, 0x96de, 0xa08e, 0x0010, 0x007c, 0x6004,
++	0xa0b2, 0x0044, 0x10c8, 0x1332, 0xa1b6, 0x0013, 0x00c0, 0x96eb,
++	0x2008, 0x0079, 0x96fe, 0xa1b6, 0x0027, 0x0040, 0x96f3, 0xa1b6,
++	0x0014, 0x10c0, 0x1332, 0x2001, 0x0007, 0x1078, 0x4535, 0x1078,
++	0x61cd, 0x1078, 0x8ec6, 0x1078, 0x62d1, 0x007c, 0x973e, 0x9740,
++	0x973e, 0x973e, 0x973e, 0x9740, 0x974c, 0x97d6, 0x9799, 0x97d6,
++	0x97ad, 0x97d6, 0x974c, 0x97d6, 0x97ce, 0x97d6, 0x97ce, 0x97d6,
++	0x97d6, 0x973e, 0x973e, 0x973e, 0x973e, 0x973e, 0x973e, 0x973e,
++	0x973e, 0x973e, 0x973e, 0x973e, 0x9740, 0x973e, 0x97d6, 0x973e,
++	0x973e, 0x97d6, 0x973e, 0x97d6, 0x97d6, 0x973e, 0x973e, 0x973e,
++	0x973e, 0x97d6, 0x97d6, 0x973e, 0x97d6, 0x97d6, 0x973e, 0x973e,
++	0x973e, 0x973e, 0x973e, 0x9740, 0x97d6, 0x97d6, 0x973e, 0x973e,
++	0x97d6, 0x97d6, 0x973e, 0x973e, 0x973e, 0x973e, 0x1078, 0x1332,
++	0x1078, 0x61cd, 0x2001, 0xa8a2, 0x2004, 0x6016, 0x6003, 0x0002,
++	0x1078, 0x62d1, 0x0078, 0x97dc, 0x0f7e, 0x2079, 0xa652, 0x7804,
++	0x0f7f, 0xd0ac, 0x00c0, 0x97d6, 0x2001, 0x0000, 0x1078, 0x44ee,
++	0x6018, 0xa080, 0x0004, 0x2004, 0xa086, 0x00ff, 0x0040, 0x97d6,
++	0x0c7e, 0x6018, 0x2060, 0x6000, 0xd0f4, 0x00c0, 0x9770, 0x6010,
++	0xa005, 0x0040, 0x9770, 0x0c7f, 0x1078, 0x3699, 0x0078, 0x97d6,
++	0x0c7f, 0x2001, 0xa600, 0x2004, 0xa086, 0x0002, 0x00c0, 0x977f,
++	0x0f7e, 0x2079, 0xa600, 0x7890, 0x8000, 0x7892, 0x0f7f, 0x2001,
++	0x0002, 0x1078, 0x4502, 0x1078, 0x61cd, 0x601f, 0x0001, 0x6003,
++	0x0001, 0x6007, 0x0002, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0c7e,
++	0x6118, 0x2160, 0x2009, 0x0001, 0x1078, 0x5a52, 0x0c7f, 0x0078,
++	0x97dc, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa6b4, 0xff00,
++	0x8637, 0xa686, 0x0006, 0x0040, 0x97d6, 0xa686, 0x0004, 0x0040,
++	0x97d6, 0x2001, 0x0004, 0x0078, 0x97d4, 0x2001, 0xa600, 0x2004,
++	0xa086, 0x0003, 0x00c0, 0x97b6, 0x1078, 0x3699, 0x2001, 0x0006,
++	0x1078, 0x97dd, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa6b4,
++	0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x97d6, 0x2001, 0x0006,
++	0x0078, 0x97d4, 0x2001, 0x0004, 0x0078, 0x97d4, 0x2001, 0x0006,
++	0x1078, 0x97dd, 0x0078, 0x97d6, 0x1078, 0x4535, 0x1078, 0x61cd,
++	0x1078, 0x772d, 0x1078, 0x62d1, 0x007c, 0x017e, 0x0d7e, 0x6118,
++	0x2168, 0x6900, 0xd184, 0x0040, 0x97f8, 0x6104, 0xa18e, 0x000a,
++	0x00c0, 0x97f0, 0x699c, 0xd1a4, 0x00c0, 0x97f0, 0x2001, 0x0007,
++	0x1078, 0x4502, 0x2001, 0x0000, 0x1078, 0x44ee, 0x1078, 0x28a6,
++	0x0d7f, 0x017f, 0x007c, 0x0d7e, 0x6618, 0x2668, 0x6804, 0xa084,
++	0xff00, 0x8007, 0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x1332, 0xa1b6,
++	0x0015, 0x00c0, 0x980f, 0x1079, 0x9816, 0x0078, 0x9815, 0xa1b6,
++	0x0016, 0x10c0, 0x1332, 0x1079, 0x9822, 0x007c, 0x7d4e, 0x7d4e,
++	0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x9877, 0x982e, 0x7d4e, 0x7d4e,
++	0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e,
++	0x9877, 0x987f, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x0f7e, 0x2079,
++	0xa652, 0x7804, 0xd0ac, 0x00c0, 0x9855, 0x6018, 0xa07d, 0x0040,
++	0x9855, 0x7800, 0xd0f4, 0x00c0, 0x9841, 0x7810, 0xa005, 0x00c0,
++	0x9855, 0x2001, 0x0000, 0x1078, 0x44ee, 0x2001, 0x0002, 0x1078,
++	0x4502, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x1078,
++	0x5dd7, 0x1078, 0x62d1, 0x0078, 0x9875, 0x2011, 0xab83, 0x2204,
++	0x8211, 0x220c, 0x1078, 0x254d, 0x00c0, 0x9875, 0x0c7e, 0x1078,
++	0x45c4, 0x0040, 0x9868, 0x0c7f, 0x1078, 0x772d, 0x0078, 0x9875,
++	0x6010, 0x007e, 0x6014, 0x007e, 0x1078, 0x42f8, 0x007f, 0x6016,
++	0x007f, 0x6012, 0x0c7f, 0x1078, 0x772d, 0x0f7f, 0x007c, 0x6604,
++	0xa6b6, 0x001e, 0x00c0, 0x987e, 0x1078, 0x772d, 0x007c, 0x1078,
++	0x7f8e, 0x00c0, 0x988b, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078,
++	0x5dd7, 0x0078, 0x988d, 0x1078, 0x772d, 0x007c, 0x6004, 0xa08a,
++	0x0044, 0x10c8, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ec6, 0x1078,
++	0x62d1, 0x007c, 0xa182, 0x0040, 0x0079, 0x989e, 0x98b1, 0x98b1,
++	0x98b1, 0x98b1, 0x98b3, 0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1,
++	0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1,
++	0x98b1, 0x1078, 0x1332, 0x0d7e, 0x0e7e, 0x0f7e, 0x157e, 0x047e,
++	0x027e, 0x6218, 0xa280, 0x002b, 0x2004, 0xa005, 0x0040, 0x98c4,
++	0x2021, 0x0000, 0x1078, 0xa472, 0x6106, 0x2071, 0xab80, 0x7444,
++	0xa4a4, 0xff00, 0x0040, 0x991b, 0xa486, 0x2000, 0x00c0, 0x98d6,
++	0x2009, 0x0001, 0x2011, 0x0200, 0x1078, 0x5bf1, 0x1078, 0x138b,
++	0x1040, 0x1332, 0x6003, 0x0007, 0x2d00, 0x6837, 0x010d, 0x6803,
++	0x0000, 0x683b, 0x0000, 0x6c5a, 0x2c00, 0x685e, 0x6008, 0x68b2,
++	0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, 0x694a, 0x017e, 0xa084,
++	0xff00, 0x6846, 0x684f, 0x0000, 0x6857, 0x0036, 0x1078, 0x4a73,
++	0x017f, 0xa486, 0x2000, 0x00c0, 0x9903, 0x2019, 0x0017, 0x1078,
++	0xa195, 0x0078, 0x997d, 0xa486, 0x0400, 0x00c0, 0x990d, 0x2019,
++	0x0002, 0x1078, 0xa146, 0x0078, 0x997d, 0xa486, 0x0200, 0x00c0,
++	0x9913, 0x1078, 0xa12b, 0xa486, 0x1000, 0x00c0, 0x9919, 0x1078,
++	0xa17a, 0x0078, 0x997d, 0x2069, 0xa933, 0x6a00, 0xd284, 0x0040,
++	0x99e7, 0xa284, 0x0300, 0x00c0, 0x99df, 0x6804, 0xa005, 0x0040,
++	0x99c5, 0x2d78, 0x6003, 0x0007, 0x1078, 0x1370, 0x0040, 0x9984,
++	0x7800, 0xd08c, 0x00c0, 0x9937, 0x7804, 0x8001, 0x7806, 0x6013,
++	0x0000, 0x6803, 0x0000, 0x6837, 0x0116, 0x683b, 0x0000, 0x6008,
++	0x68b2, 0x2c00, 0x684a, 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130,
++	0x6986, 0x6846, 0x7928, 0x698a, 0x792c, 0x698e, 0x7930, 0x6992,
++	0x7934, 0x6996, 0x6853, 0x003d, 0x7244, 0xa294, 0x0003, 0xa286,
++	0x0002, 0x00c0, 0x995f, 0x684f, 0x0040, 0x0078, 0x9969, 0xa286,
++	0x0001, 0x00c0, 0x9967, 0x684f, 0x0080, 0x0078, 0x9969, 0x684f,
++	0x0000, 0x20a9, 0x000a, 0x2001, 0xab90, 0xad90, 0x0015, 0x200c,
++	0x810f, 0x2112, 0x8000, 0x8210, 0x00f0, 0x996f, 0x200c, 0x6982,
++	0x8000, 0x200c, 0x697e, 0x1078, 0x4a73, 0x027f, 0x047f, 0x157f,
++	0x0f7f, 0x0e7f, 0x0d7f, 0x007c, 0x2001, 0xa60e, 0x2004, 0xd084,
++	0x0040, 0x998e, 0x1078, 0x138b, 0x00c0, 0x9930, 0x6013, 0x0100,
++	0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x5d8a, 0x1078, 0x62d1,
++	0x0078, 0x997d, 0x2069, 0xab92, 0x2d04, 0xa084, 0xff00, 0xa086,
++	0x1200, 0x00c0, 0x99b9, 0x2069, 0xab80, 0x686c, 0xa084, 0x00ff,
++	0x017e, 0x6110, 0xa18c, 0x0700, 0xa10d, 0x6112, 0x017f, 0x6003,
++	0x0001, 0x6007, 0x0043, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078,
++	0x997d, 0x6013, 0x0200, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078,
++	0x5d8a, 0x1078, 0x62d1, 0x0078, 0x997d, 0x2001, 0xa60d, 0x2004,
++	0xd0ec, 0x0040, 0x99cf, 0x2011, 0x8049, 0x1078, 0x361b, 0x6013,
++	0x0300, 0x0078, 0x99d5, 0x6013, 0x0100, 0x6003, 0x0001, 0x6007,
++	0x0041, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078, 0x997d, 0x6013,
++	0x0500, 0x0078, 0x99d5, 0x6013, 0x0600, 0x0078, 0x999a, 0x6013,
++	0x0200, 0x0078, 0x999a, 0xa186, 0x0013, 0x00c0, 0x99fd, 0x6004,
++	0xa08a, 0x0040, 0x1048, 0x1332, 0xa08a, 0x0053, 0x10c8, 0x1332,
++	0xa082, 0x0040, 0x2008, 0x0079, 0x9a82, 0xa186, 0x0051, 0x0040,
++	0x9a0a, 0xa186, 0x0047, 0x00c0, 0x9a23, 0x6004, 0xa086, 0x0041,
++	0x0040, 0x9a31, 0x2001, 0x0109, 0x2004, 0xd084, 0x0040, 0x9a31,
++	0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x027e, 0x1078, 0x5c56,
++	0x027f, 0x017f, 0x007f, 0x127f, 0x6000, 0xa086, 0x0002, 0x00c0,
++	0x9a31, 0x0078, 0x9ac7, 0xa186, 0x0027, 0x0040, 0x9a2b, 0xa186,
++	0x0014, 0x10c0, 0x1332, 0x6004, 0xa082, 0x0040, 0x2008, 0x0079,
++	0x9a34, 0x1078, 0x7773, 0x007c, 0x9a47, 0x9a49, 0x9a49, 0x9a71,
++	0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47,
++	0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x1078,
++	0x1332, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x037e, 0x0d7e, 0x6010,
++	0xa06d, 0x0040, 0x9a6e, 0xad84, 0xf000, 0x0040, 0x9a6e, 0x6003,
++	0x0002, 0x6018, 0x2004, 0xd0bc, 0x00c0, 0x9a6e, 0x2019, 0x0004,
++	0x1078, 0xa1ca, 0x6013, 0x0000, 0x6014, 0xa005, 0x00c0, 0x9a6c,
++	0x2001, 0xa8a3, 0x2004, 0x6016, 0x6003, 0x0007, 0x0d7f, 0x037f,
++	0x007c, 0x0d7e, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x1078, 0x8d06,
++	0x0040, 0x9a7e, 0x6010, 0x2068, 0x1078, 0x13a4, 0x1078, 0x8ec6,
++	0x0d7f, 0x007c, 0x9a95, 0x9ab4, 0x9a9e, 0x9ac1, 0x9a95, 0x9a95,
++	0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95,
++	0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x1078, 0x1332, 0x6010,
++	0xa088, 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x1078, 0x61cd,
++	0x6010, 0xa080, 0x0013, 0x2004, 0xd0b4, 0x0040, 0x9aaf, 0x6003,
++	0x0007, 0x2009, 0x0043, 0x1078, 0x775c, 0x0078, 0x9ab1, 0x6003,
++	0x0002, 0x1078, 0x62d1, 0x007c, 0x1078, 0x61cd, 0x1078, 0xa423,
++	0x00c0, 0x9abe, 0x1078, 0x5bc1, 0x1078, 0x772d, 0x1078, 0x62d1,
++	0x007c, 0x1078, 0x61cd, 0x2009, 0x0041, 0x0078, 0x9c1e, 0xa182,
++	0x0040, 0x0079, 0x9acb, 0x9ade, 0x9ae0, 0x9ade, 0x9ade, 0x9ade,
++	0x9ade, 0x9ade, 0x9ae1, 0x9ade, 0x9ade, 0x9ade, 0x9ade, 0x9ade,
++	0x9ade, 0x9ade, 0x9ade, 0x9ade, 0x9aec, 0x9ade, 0x1078, 0x1332,
++	0x007c, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20,
++	0x2c10, 0x1078, 0x15fa, 0x007c, 0x0d7e, 0x1078, 0x5bc1, 0x0d7f,
++	0x1078, 0xa495, 0x1078, 0x772d, 0x007c, 0xa182, 0x0040, 0x0079,
++	0x9af9, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c,
++	0x9b0e, 0x9b0c, 0x9b11, 0x9b3c, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c,
++	0x9b3c, 0x9b0c, 0x9b0c, 0x9b0c, 0x1078, 0x1332, 0x1078, 0x7773,
++	0x007c, 0x1078, 0x627a, 0x1078, 0x639b, 0x6010, 0x0d7e, 0x2068,
++	0x684c, 0xd0fc, 0x0040, 0x9b27, 0xa08c, 0x0003, 0xa18e, 0x0002,
++	0x0040, 0x9b2f, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x9c1e, 0x6003,
++	0x0007, 0x6017, 0x0000, 0x1078, 0x5bc1, 0x0d7f, 0x007c, 0x1078,
++	0xa423, 0x0040, 0x9b35, 0x0d7f, 0x007c, 0x1078, 0x5bc1, 0x1078,
++	0x772d, 0x0d7f, 0x0078, 0x9b2e, 0x037e, 0x1078, 0x627a, 0x1078,
++	0x639b, 0x6010, 0x0d7e, 0x2068, 0x6018, 0x2004, 0xd0bc, 0x0040,
++	0x9b5c, 0x684c, 0xa084, 0x0003, 0xa086, 0x0002, 0x0040, 0x9b58,
++	0x687c, 0x632c, 0xa31a, 0x632e, 0x6880, 0x6328, 0xa31b, 0x632a,
++	0x6003, 0x0002, 0x0078, 0x9b6d, 0x2019, 0x0004, 0x1078, 0xa1ca,
++	0x6014, 0xa005, 0x00c0, 0x9b69, 0x2001, 0xa8a3, 0x2004, 0x8003,
++	0x6016, 0x6013, 0x0000, 0x6003, 0x0007, 0x0d7f, 0x037f, 0x007c,
++	0xa186, 0x0013, 0x00c0, 0x9b7e, 0x6004, 0xa086, 0x0042, 0x10c0,
++	0x1332, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x007c, 0xa186, 0x0027,
++	0x0040, 0x9b86, 0xa186, 0x0014, 0x00c0, 0x9b96, 0x6004, 0xa086,
++	0x0042, 0x10c0, 0x1332, 0x2001, 0x0007, 0x1078, 0x4535, 0x1078,
++	0x61cd, 0x1078, 0x8ec6, 0x1078, 0x62d1, 0x007c, 0xa182, 0x0040,
++	0x0079, 0x9b9a, 0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x9bad,
++	0x9bad, 0x9baf, 0x9bbb, 0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x9bad,
++	0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x1078, 0x1332, 0x037e,
++	0x047e, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, 0x15fa,
++	0x047f, 0x037f, 0x007c, 0x6010, 0x0d7e, 0x2068, 0x6810, 0x6a14,
++	0x6118, 0x210c, 0xd1bc, 0x0040, 0x9bda, 0x6124, 0xd1f4, 0x00c0,
++	0x9bda, 0x007e, 0x047e, 0x057e, 0x6c7c, 0xa422, 0x6d80, 0x2200,
++	0xa52b, 0x602c, 0xa420, 0x642e, 0x6028, 0xa529, 0x652a, 0x057f,
++	0x047f, 0x007f, 0xa20d, 0x00c0, 0x9bee, 0x684c, 0xd0fc, 0x0040,
++	0x9be6, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x9c1e, 0x6003, 0x0007,
++	0x6017, 0x0000, 0x1078, 0x5bc1, 0x0d7f, 0x007c, 0x007e, 0x0f7e,
++	0x2c78, 0x1078, 0x4963, 0x0f7f, 0x007f, 0x0040, 0x9bfb, 0x6003,
++	0x0002, 0x0d7f, 0x007c, 0x2009, 0xa60d, 0x210c, 0xd19c, 0x0040,
++	0x9c05, 0x6003, 0x0007, 0x0078, 0x9c07, 0x6003, 0x0006, 0x1078,
++	0x9c0d, 0x1078, 0x5bc3, 0x0d7f, 0x007c, 0xd2fc, 0x0040, 0x9c19,
++	0x8002, 0x8000, 0x8212, 0xa291, 0x0000, 0x2009, 0x0009, 0x0078,
++	0x9c1b, 0x2009, 0x0015, 0x6a6a, 0x6866, 0x007c, 0xa182, 0x0040,
++	0x0048, 0x9c24, 0x0079, 0x9c31, 0xa186, 0x0013, 0x0040, 0x9c2c,
++	0xa186, 0x0014, 0x10c0, 0x1332, 0x6024, 0xd0dc, 0x1040, 0x1332,
++	0x007c, 0x9c44, 0x9c4b, 0x9c57, 0x9c63, 0x9c44, 0x9c44, 0x9c44,
++	0x9c72, 0x9c44, 0x9c46, 0x9c46, 0x9c44, 0x9c44, 0x9c44, 0x9c44,
++	0x9c44, 0x9c44, 0x9c44, 0x9c44, 0x1078, 0x1332, 0x6024, 0xd0dc,
++	0x1040, 0x1332, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a,
++	0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0x6003,
++	0x0001, 0x6106, 0x1078, 0x5d8a, 0x127e, 0x2091, 0x8000, 0x1078,
++	0x62d1, 0x127f, 0x007c, 0x6003, 0x0003, 0x6106, 0x2c10, 0x1078,
++	0x1cf0, 0x127e, 0x2091, 0x8000, 0x1078, 0x5df6, 0x1078, 0x639b,
++	0x127f, 0x007c, 0xa016, 0x1078, 0x15fa, 0x007c, 0x127e, 0x2091,
++	0x8000, 0x037e, 0x0d7e, 0xa182, 0x0040, 0x1079, 0x9c83, 0x0d7f,
++	0x037f, 0x127f, 0x007c, 0x9c93, 0x9c95, 0x9caa, 0x9cc9, 0x9c93,
++	0x9c93, 0x9c93, 0x9ce1, 0x9c93, 0x9c93, 0x9c93, 0x9c93, 0x9c93,
++	0x9c93, 0x9c93, 0x9c93, 0x1078, 0x1332, 0x6010, 0x2068, 0x684c,
++	0xd0fc, 0x0040, 0x9cbf, 0xa09c, 0x0003, 0xa39e, 0x0003, 0x0040,
++	0x9cbf, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a, 0x1078, 0x62d1,
++	0x0078, 0x9ce4, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0040, 0x9cbf,
++	0xa09c, 0x0003, 0xa39e, 0x0003, 0x0040, 0x9cbf, 0x6003, 0x0001,
++	0x6106, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078, 0x9ce4, 0x6013,
++	0x0000, 0x6017, 0x0000, 0x2019, 0x0004, 0x1078, 0xa1ca, 0x0078,
++	0x9ce4, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0040, 0x9cbf, 0xa09c,
++	0x0003, 0xa39e, 0x0003, 0x0040, 0x9cbf, 0x6003, 0x0003, 0x6106,
++	0x2c10, 0x1078, 0x1cf0, 0x1078, 0x5df6, 0x1078, 0x639b, 0x0078,
++	0x9ce4, 0xa016, 0x1078, 0x15fa, 0x007c, 0x1078, 0x61cd, 0x6110,
++	0x81ff, 0x0040, 0x9cf6, 0x0d7e, 0x2168, 0x1078, 0xa4e2, 0x037e,
++	0x2019, 0x0029, 0x1078, 0xa1ca, 0x037f, 0x0d7f, 0x1078, 0x8ec6,
++	0x1078, 0x62d1, 0x007c, 0x1078, 0x627a, 0x6110, 0x81ff, 0x0040,
++	0x9d0c, 0x0d7e, 0x2168, 0x1078, 0xa4e2, 0x037e, 0x2019, 0x0029,
++	0x1078, 0xa1ca, 0x037f, 0x0d7f, 0x1078, 0x8ec6, 0x1078, 0x639b,
++	0x007c, 0xa182, 0x0085, 0x0079, 0x9d15, 0x9d1e, 0x9d1c, 0x9d1c,
++	0x9d2a, 0x9d1c, 0x9d1c, 0x9d1c, 0x1078, 0x1332, 0x6003, 0x000b,
++	0x6106, 0x1078, 0x5d8a, 0x127e, 0x2091, 0x8000, 0x1078, 0x62d1,
++	0x127f, 0x007c, 0x027e, 0x0e7e, 0x1078, 0xa41c, 0x0040, 0x9d34,
++	0x1078, 0x772d, 0x0078, 0x9d50, 0x2071, 0xab80, 0x7224, 0x6212,
++	0x7220, 0x1078, 0xa069, 0x0040, 0x9d41, 0x6007, 0x0086, 0x0078,
++	0x9d4a, 0x6007, 0x0087, 0x7224, 0xa296, 0xffff, 0x00c0, 0x9d4a,
++	0x6007, 0x0086, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x1078, 0x62d1,
++	0x0e7f, 0x027f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x9d64, 0x6004,
++	0xa08a, 0x0085, 0x1048, 0x1332, 0xa08a, 0x008c, 0x10c8, 0x1332,
++	0xa082, 0x0085, 0x0079, 0x9d7b, 0xa186, 0x0027, 0x0040, 0x9d70,
++	0xa186, 0x0014, 0x0040, 0x9d70, 0x1078, 0x7773, 0x0078, 0x9d7a,
++	0x2001, 0x0007, 0x1078, 0x4535, 0x1078, 0x61cd, 0x1078, 0x8ec6,
++	0x1078, 0x62d1, 0x007c, 0x9d82, 0x9d84, 0x9d84, 0x9d82, 0x9d82,
++	0x9d82, 0x9d82, 0x1078, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ec6,
++	0x1078, 0x62d1, 0x007c, 0xa182, 0x0085, 0x1048, 0x1332, 0xa182,
++	0x008c, 0x10c8, 0x1332, 0xa182, 0x0085, 0x0079, 0x9d97, 0x9d9e,
++	0x9d9e, 0x9d9e, 0x9da0, 0x9d9e, 0x9d9e, 0x9d9e, 0x1078, 0x1332,
++	0x007c, 0xa186, 0x0013, 0x0040, 0x9db1, 0xa186, 0x0014, 0x0040,
++	0x9db1, 0xa186, 0x0027, 0x0040, 0x9db1, 0x1078, 0x7773, 0x0078,
++	0x9db7, 0x1078, 0x61cd, 0x1078, 0x8ec6, 0x1078, 0x62d1, 0x007c,
++	0x037e, 0x1078, 0xa495, 0x603f, 0x0000, 0x2019, 0x000b, 0x1078,
++	0x9dc7, 0x601f, 0x0006, 0x6003, 0x0007, 0x037f, 0x007c, 0x127e,
++	0x037e, 0x2091, 0x8000, 0x087e, 0x2c40, 0x097e, 0x2049, 0x0000,
++	0x1078, 0x7246, 0x097f, 0x087f, 0x00c0, 0x9e02, 0x077e, 0x2c38,
++	0x1078, 0x72f3, 0x077f, 0x00c0, 0x9e02, 0x6000, 0xa086, 0x0000,
++	0x0040, 0x9e02, 0x601c, 0xa086, 0x0007, 0x0040, 0x9e02, 0x0d7e,
++	0x6000, 0xa086, 0x0004, 0x00c0, 0x9df3, 0x1078, 0xa495, 0x601f,
++	0x0007, 0x1078, 0x1757, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040,
++	0x9dfb, 0x1078, 0xa1ca, 0x0d7f, 0x6013, 0x0000, 0x1078, 0xa495,
++	0x601f, 0x0007, 0x037f, 0x127f, 0x007c, 0x0f7e, 0x0c7e, 0x037e,
++	0x157e, 0x2079, 0xab80, 0x7938, 0x783c, 0x1078, 0x254d, 0x00c0,
++	0x9e49, 0x017e, 0x0c7e, 0x1078, 0x45c4, 0x00c0, 0x9e49, 0x017f,
++	0x027f, 0x027e, 0x017e, 0x2019, 0x0029, 0x1078, 0x73d0, 0x1078,
++	0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a, 0x077f, 0x017f,
++	0x077e, 0x2039, 0x0000, 0x1078, 0x9f8b, 0x077f, 0x1078, 0x47e9,
++	0x027e, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, 0x0006, 0x0040,
++	0x9e3d, 0xa286, 0x0004, 0x00c0, 0x9e40, 0x62a0, 0x1078, 0x2942,
++	0x027f, 0x017f, 0x1078, 0x42f8, 0x6612, 0x6516, 0xa006, 0x0078,
++	0x9e4b, 0x0c7f, 0x017f, 0x157f, 0x037f, 0x0c7f, 0x0f7f, 0x007c,
++	0x0c7e, 0x0d7e, 0x0e7e, 0x017e, 0x2009, 0xa620, 0x2104, 0xa086,
++	0x0074, 0x00c0, 0x9eb3, 0x2069, 0xab8e, 0x690c, 0xa182, 0x0100,
++	0x0048, 0x9ea3, 0x6908, 0xa184, 0x8000, 0x0040, 0x9eaf, 0x6018,
++	0x2070, 0x7010, 0xa084, 0x00ff, 0x0040, 0x9e72, 0x7000, 0xd0f4,
++	0x0040, 0x9e76, 0xa184, 0x0800, 0x0040, 0x9eaf, 0x6910, 0xa18a,
++	0x0001, 0x0048, 0x9ea7, 0x6914, 0x2069, 0xabae, 0x6904, 0x81ff,
++	0x00c0, 0x9e9b, 0x690c, 0xa182, 0x0100, 0x0048, 0x9ea3, 0x6908,
++	0x81ff, 0x00c0, 0x9e9f, 0x6910, 0xa18a, 0x0001, 0x0048, 0x9ea7,
++	0x6918, 0xa18a, 0x0001, 0x0048, 0x9eaf, 0x0078, 0x9eb9, 0x6013,
++	0x0100, 0x0078, 0x9eb5, 0x6013, 0x0300, 0x0078, 0x9eb5, 0x6013,
++	0x0500, 0x0078, 0x9eb5, 0x6013, 0x0700, 0x0078, 0x9eb5, 0x6013,
++	0x0900, 0x0078, 0x9eb5, 0x6013, 0x0b00, 0x0078, 0x9eb5, 0x6013,
++	0x0f00, 0x0078, 0x9eb5, 0x6013, 0x2d00, 0xa085, 0x0001, 0x0078,
++	0x9eba, 0xa006, 0x017f, 0x0e7f, 0x0d7f, 0x0c7f, 0x007c, 0x0c7e,
++	0x0d7e, 0x027e, 0x037e, 0x157e, 0x6218, 0x2268, 0x6b04, 0xa394,
++	0x00ff, 0xa286, 0x0006, 0x0040, 0x9ee3, 0xa286, 0x0004, 0x0040,
++	0x9ee3, 0xa394, 0xff00, 0x8217, 0xa286, 0x0006, 0x0040, 0x9ee3,
++	0xa286, 0x0004, 0x0040, 0x9ee3, 0x0c7e, 0x2d60, 0x1078, 0x45d6,
++	0x0c7f, 0x0078, 0x9f1e, 0x2011, 0xab96, 0xad98, 0x000a, 0x20a9,
++	0x0004, 0x1078, 0x80de, 0x00c0, 0x9f1f, 0x2011, 0xab9a, 0xad98,
++	0x0006, 0x20a9, 0x0004, 0x1078, 0x80de, 0x00c0, 0x9f1f, 0x047e,
++	0x017e, 0x6aa0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0xa653,
++	0x210c, 0xd1a4, 0x0040, 0x9f0b, 0x2009, 0x0029, 0x1078, 0xa21d,
++	0x6800, 0xc0e5, 0x6802, 0x2019, 0x0029, 0x1078, 0x5f01, 0x077e,
++	0x2039, 0x0000, 0x1078, 0x5e0a, 0x2c08, 0x1078, 0x9f8b, 0x077f,
++	0x2001, 0x0007, 0x1078, 0x4535, 0x017f, 0x047f, 0xa006, 0x157f,
++	0x037f, 0x027f, 0x0d7f, 0x0c7f, 0x007c, 0x0d7e, 0x2069, 0xab8e,
++	0x6800, 0xa086, 0x0800, 0x0040, 0x9f31, 0x6013, 0x0000, 0x0078,
++	0x9f32, 0xa006, 0x0d7f, 0x007c, 0x0c7e, 0x0f7e, 0x017e, 0x027e,
++	0x037e, 0x157e, 0x2079, 0xab8c, 0x7930, 0x7834, 0x1078, 0x254d,
++	0x00c0, 0x9f58, 0x1078, 0x45c4, 0x00c0, 0x9f58, 0x2011, 0xab90,
++	0xac98, 0x000a, 0x20a9, 0x0004, 0x1078, 0x80de, 0x00c0, 0x9f58,
++	0x2011, 0xab94, 0xac98, 0x0006, 0x20a9, 0x0004, 0x1078, 0x80de,
++	0x157f, 0x037f, 0x027f, 0x017f, 0x0f7f, 0x0c7f, 0x007c, 0x0c7e,
++	0x007e, 0x017e, 0x027e, 0x037e, 0x157e, 0x2011, 0xab83, 0x2204,
++	0x8211, 0x220c, 0x1078, 0x254d, 0x00c0, 0x9f84, 0x1078, 0x45c4,
++	0x00c0, 0x9f84, 0x2011, 0xab96, 0xac98, 0x000a, 0x20a9, 0x0004,
++	0x1078, 0x80de, 0x00c0, 0x9f84, 0x2011, 0xab9a, 0xac98, 0x0006,
++	0x20a9, 0x0004, 0x1078, 0x80de, 0x157f, 0x037f, 0x027f, 0x017f,
++	0x007f, 0x0c7f, 0x007c, 0x0e7e, 0x0c7e, 0x087e, 0x077e, 0x067e,
++	0x057e, 0x047e, 0x027e, 0x127e, 0x2091, 0x8000, 0x2740, 0x2029,
++	0xa8ba, 0x252c, 0x2021, 0xa8c0, 0x2424, 0x2061, 0xad00, 0x2071,
++	0xa600, 0x7648, 0x7064, 0x81ff, 0x0040, 0x9fb2, 0x007e, 0xa186,
++	0xa9b3, 0x007f, 0x0040, 0x9fb2, 0x8001, 0xa602, 0x00c8, 0xa01c,
++	0x0078, 0x9fb5, 0xa606, 0x0040, 0xa01c, 0x2100, 0xac06, 0x0040,
++	0xa012, 0x1078, 0xa242, 0x0040, 0xa012, 0x671c, 0xa786, 0x0001,
++	0x0040, 0xa037, 0xa786, 0x0004, 0x0040, 0xa037, 0xa786, 0x0007,
++	0x0040, 0xa012, 0x2500, 0xac06, 0x0040, 0xa012, 0x2400, 0xac06,
++	0x0040, 0xa012, 0x1078, 0xa256, 0x00c0, 0xa012, 0x88ff, 0x0040,
++	0x9fdd, 0x6020, 0xa906, 0x00c0, 0xa012, 0x0d7e, 0x6000, 0xa086,
++	0x0004, 0x00c0, 0x9fe7, 0x017e, 0x1078, 0x1757, 0x017f, 0xa786,
++	0x0008, 0x00c0, 0x9ff6, 0x1078, 0x8f00, 0x00c0, 0x9ff6, 0x1078,
++	0x7c83, 0x0d7f, 0x1078, 0x8ec6, 0x0078, 0xa012, 0x6010, 0x2068,
++	0x1078, 0x8d06, 0x0040, 0xa00f, 0xa786, 0x0003, 0x00c0, 0xa026,
++	0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0xa4e2, 0x017e,
++	0x1078, 0x8f7d, 0x1078, 0x4a73, 0x017f, 0x1078, 0x8eb9, 0x0d7f,
++	0x1078, 0x8ec6, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004, 0xac02,
++	0x00c8, 0xa01c, 0x0078, 0x9f9f, 0x127f, 0x027f, 0x047f, 0x057f,
++	0x067f, 0x077f, 0x087f, 0x0c7f, 0x0e7f, 0x007c, 0xa786, 0x0006,
++	0x00c0, 0xa000, 0xa386, 0x0005, 0x0040, 0xa034, 0x1078, 0xa4e2,
++	0x1078, 0xa1ca, 0x0078, 0xa00f, 0x0d7f, 0x0078, 0xa012, 0x1078,
++	0xa256, 0x00c0, 0xa012, 0x81ff, 0x0040, 0xa012, 0xa180, 0x0001,
++	0x2004, 0xa086, 0x0018, 0x0040, 0xa04c, 0xa180, 0x0001, 0x2004,
++	0xa086, 0x002d, 0x00c0, 0xa012, 0x6000, 0xa086, 0x0002, 0x00c0,
++	0xa012, 0x1078, 0x8eec, 0x0040, 0xa05d, 0x1078, 0x8f00, 0x00c0,
++	0xa012, 0x1078, 0x7c83, 0x0078, 0xa065, 0x1078, 0x28a6, 0x1078,
++	0x8f00, 0x00c0, 0xa065, 0x1078, 0x7c83, 0x1078, 0x8ec6, 0x0078,
++	0xa012, 0x0c7e, 0x0e7e, 0x017e, 0x2c08, 0x2170, 0xa006, 0x1078,
++	0xa1e6, 0x017f, 0x0040, 0xa079, 0x601c, 0xa084, 0x000f, 0x1079,
++	0xa07c, 0x0e7f, 0x0c7f, 0x007c, 0xa084, 0xa084, 0xa084, 0xa084,
++	0xa084, 0xa084, 0xa086, 0xa084, 0xa006, 0x007c, 0x047e, 0x017e,
++	0x7018, 0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00,
++	0x2009, 0x0020, 0x1078, 0xa21d, 0x017f, 0x047f, 0x037e, 0x2019,
++	0x0002, 0x1078, 0x9dc7, 0x037f, 0xa085, 0x0001, 0x007c, 0x2001,
++	0x0001, 0x1078, 0x44ee, 0x157e, 0x017e, 0x027e, 0x037e, 0x20a9,
++	0x0004, 0x2019, 0xa605, 0x2011, 0xab96, 0x1078, 0x80de, 0x037f,
++	0x027f, 0x017f, 0x157f, 0xa005, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e,
++	0x087e, 0x077e, 0x067e, 0x027e, 0x127e, 0x2091, 0x8000, 0x2740,
++	0x2061, 0xad00, 0x2079, 0x0001, 0x8fff, 0x0040, 0xa11d, 0x2071,
++	0xa600, 0x7648, 0x7064, 0x8001, 0xa602, 0x00c8, 0xa11d, 0x88ff,
++	0x0040, 0xa0d8, 0x2800, 0xac06, 0x00c0, 0xa113, 0x2079, 0x0000,
++	0x1078, 0xa242, 0x0040, 0xa113, 0x2400, 0xac06, 0x0040, 0xa113,
++	0x671c, 0xa786, 0x0006, 0x00c0, 0xa113, 0xa786, 0x0007, 0x0040,
++	0xa113, 0x88ff, 0x00c0, 0xa0f7, 0x6018, 0xa206, 0x00c0, 0xa113,
++	0x85ff, 0x0040, 0xa0f7, 0x6020, 0xa106, 0x00c0, 0xa113, 0x0d7e,
++	0x6000, 0xa086, 0x0004, 0x00c0, 0xa103, 0x1078, 0xa495, 0x601f,
++	0x0007, 0x1078, 0x1757, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040,
++	0xa10d, 0x047e, 0x1078, 0xa1ca, 0x047f, 0x0d7f, 0x1078, 0x8ec6,
++	0x88ff, 0x00c0, 0xa127, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004,
++	0xac02, 0x00c8, 0xa11d, 0x0078, 0xa0c4, 0xa006, 0x127f, 0x027f,
++	0x067f, 0x077f, 0x087f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0xa8c5,
++	0x0001, 0x0078, 0xa11e, 0x077e, 0x057e, 0x087e, 0x2041, 0x0000,
++	0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, 0x6218, 0x097e, 0x2049,
++	0x0000, 0x1078, 0x7246, 0x097f, 0x087f, 0x2039, 0x0000, 0x1078,
++	0x72f3, 0x1078, 0xa0b5, 0x057f, 0x077f, 0x007c, 0x027e, 0x047e,
++	0x057e, 0x077e, 0x0c7e, 0x157e, 0x2c20, 0x2128, 0x20a9, 0x007f,
++	0x2009, 0x0000, 0x017e, 0x037e, 0x1078, 0x45c4, 0x00c0, 0xa16e,
++	0x2c10, 0x057e, 0x087e, 0x2041, 0x0000, 0x2508, 0x2029, 0x0001,
++	0x097e, 0x2049, 0x0000, 0x1078, 0x7246, 0x097f, 0x087f, 0x2039,
++	0x0000, 0x1078, 0x72f3, 0x1078, 0xa0b5, 0x057f, 0x037f, 0x017f,
++	0x8108, 0x00f0, 0xa152, 0x157f, 0x0c7f, 0x077f, 0x057f, 0x047f,
++	0x027f, 0x007c, 0x077e, 0x057e, 0x6218, 0x087e, 0x2041, 0x0000,
++	0x2029, 0x0001, 0x2019, 0x0048, 0x097e, 0x2049, 0x0000, 0x1078,
++	0x7246, 0x097f, 0x087f, 0x2039, 0x0000, 0x1078, 0x72f3, 0x2c20,
++	0x1078, 0xa0b5, 0x057f, 0x077f, 0x007c, 0x027e, 0x047e, 0x057e,
++	0x077e, 0x0c7e, 0x157e, 0x2c20, 0x20a9, 0x007f, 0x2009, 0x0000,
++	0x017e, 0x037e, 0x1078, 0x45c4, 0x00c0, 0xa1be, 0x2c10, 0x087e,
++	0x2041, 0x0000, 0x2828, 0x047e, 0x2021, 0x0001, 0x1078, 0xa472,
++	0x047f, 0x097e, 0x2049, 0x0000, 0x1078, 0x7246, 0x097f, 0x087f,
++	0x2039, 0x0000, 0x1078, 0x72f3, 0x1078, 0xa0b5, 0x037f, 0x017f,
++	0x8108, 0x00f0, 0xa1a0, 0x157f, 0x0c7f, 0x077f, 0x057f, 0x047f,
++	0x027f, 0x007c, 0x017e, 0x0f7e, 0xad82, 0xcd00, 0x0048, 0xa1e3,
++	0xad82, 0xffff, 0x00c8, 0xa1e3, 0x6800, 0xa07d, 0x0040, 0xa1e0,
++	0x6803, 0x0000, 0x6b52, 0x1078, 0x4a73, 0x2f68, 0x0078, 0xa1d4,
++	0x6b52, 0x1078, 0x4a73, 0x0f7f, 0x017f, 0x007c, 0x0e7e, 0x047e,
++	0x037e, 0x2061, 0xad00, 0xa005, 0x00c0, 0xa1f6, 0x2071, 0xa600,
++	0x7448, 0x7064, 0x8001, 0xa402, 0x00c8, 0xa218, 0x2100, 0xac06,
++	0x0040, 0xa20a, 0x6000, 0xa086, 0x0000, 0x0040, 0xa20a, 0x6008,
++	0xa206, 0x00c0, 0xa20a, 0x6018, 0xa1a0, 0x0006, 0x2424, 0xa406,
++	0x0040, 0xa214, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004, 0xac02,
++	0x00c8, 0xa218, 0x0078, 0xa1f6, 0xa085, 0x0001, 0x0078, 0xa219,
++	0xa006, 0x037f, 0x047f, 0x0e7f, 0x007c, 0x0d7e, 0x007e, 0x1078,
++	0x138b, 0x007f, 0x1040, 0x1332, 0x6837, 0x010d, 0x685e, 0x027e,
++	0x2010, 0x1078, 0x8cf2, 0x2001, 0x0000, 0x0040, 0xa233, 0x2200,
++	0xa080, 0x0008, 0x2004, 0x027f, 0x684a, 0x6956, 0x6c46, 0x684f,
++	0x0000, 0xa006, 0x68b2, 0x6802, 0x683a, 0x685a, 0x1078, 0x4a73,
++	0x0d7f, 0x007c, 0x6700, 0xa786, 0x0000, 0x0040, 0xa255, 0xa786,
++	0x0001, 0x0040, 0xa255, 0xa786, 0x000a, 0x0040, 0xa255, 0xa786,
++	0x0009, 0x0040, 0xa255, 0xa085, 0x0001, 0x007c, 0x0e7e, 0x6018,
++	0x2070, 0x70a0, 0xa206, 0x0e7f, 0x007c, 0x017e, 0x6004, 0xa08e,
++	0x001e, 0x00c0, 0xa277, 0x8007, 0x6130, 0xa18c, 0x00ff, 0xa105,
++	0x6032, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0005, 0x2001,
++	0xa8a3, 0x2004, 0x6016, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x017f,
++	0x007c, 0x0005, 0x0005, 0x007c, 0x6024, 0xd0e4, 0x0040, 0xa28d,
++	0xd0cc, 0x0040, 0xa287, 0x1078, 0x8fbf, 0x0078, 0xa28d, 0x1078,
++	0xa495, 0x1078, 0x5bc1, 0x1078, 0x772d, 0x007c, 0xa280, 0x0007,
++	0x2004, 0xa084, 0x000f, 0x0079, 0xa295, 0xa29e, 0xa29e, 0xa29e,
++	0xa2a0, 0xa29e, 0xa2a0, 0xa2a0, 0xa29e, 0xa2a0, 0xa006, 0x007c,
++	0xa085, 0x0001, 0x007c, 0xa280, 0x0007, 0x2004, 0xa084, 0x000f,
++	0x0079, 0xa2aa, 0xa2b3, 0xa2b3, 0xa2b3, 0xa2b3, 0xa2b3, 0xa2b3,
++	0xa2be, 0xa2b3, 0xa2b3, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013,
++	0x2a00, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x007c, 0x0c7e, 0x2260,
++	0x1078, 0xa495, 0x603f, 0x0000, 0x6024, 0xc0f4, 0xc0cc, 0x6026,
++	0x0c7f, 0x0d7e, 0x2268, 0xa186, 0x0007, 0x00c0, 0xa31f, 0x6810,
++	0xa005, 0x0040, 0xa2dc, 0xa080, 0x0013, 0x2004, 0xd0fc, 0x00c0,
++	0xa2dc, 0x0d7f, 0x0078, 0xa2b3, 0x6007, 0x003a, 0x6003, 0x0001,
++	0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7e, 0x2d60, 0x6100, 0xa186,
++	0x0002, 0x00c0, 0xa3ad, 0x6010, 0xa005, 0x00c0, 0xa2f6, 0x6000,
++	0xa086, 0x0007, 0x10c0, 0x1332, 0x0078, 0xa3ad, 0xa08c, 0xf000,
++	0x00c0, 0xa302, 0x0078, 0xa302, 0x2068, 0x6800, 0xa005, 0x00c0,
++	0xa2fc, 0x2d00, 0xa080, 0x0013, 0x2004, 0xa084, 0x0003, 0xa086,
++	0x0002, 0x00c0, 0xa31b, 0x6010, 0x2068, 0x684c, 0xc0dc, 0xc0f4,
++	0x684e, 0x6850, 0xc0f4, 0xc0fc, 0x6852, 0x2009, 0x0043, 0x1078,
++	0x9c1e, 0x0078, 0xa3ad, 0x2009, 0x0041, 0x0078, 0xa3a7, 0xa186,
++	0x0005, 0x00c0, 0xa366, 0x6810, 0xa080, 0x0013, 0x2004, 0xd0bc,
++	0x00c0, 0xa32d, 0x0d7f, 0x0078, 0xa2b3, 0xd0b4, 0x0040, 0xa335,
++	0xd0fc, 0x1040, 0x1332, 0x0078, 0xa2cf, 0x6007, 0x003a, 0x6003,
++	0x0001, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7e, 0x2d60, 0x6100,
++	0xa186, 0x0002, 0x0040, 0xa348, 0xa186, 0x0004, 0x00c0, 0xa3ad,
++	0x2071, 0xa8e7, 0x7000, 0xa086, 0x0003, 0x00c0, 0xa355, 0x7004,
++	0xac06, 0x00c0, 0xa355, 0x7003, 0x0000, 0x6810, 0xa080, 0x0013,
++	0x200c, 0xc1f4, 0xc1dc, 0x2102, 0x8000, 0x200c, 0xc1f4, 0xc1fc,
++	0xc1bc, 0x2102, 0x2009, 0x0042, 0x0078, 0xa3a7, 0x037e, 0x0d7e,
++	0x0d7e, 0x1078, 0x138b, 0x037f, 0x1040, 0x1332, 0x6837, 0x010d,
++	0x6803, 0x0000, 0x683b, 0x0000, 0x685b, 0x0000, 0x6b5e, 0x6857,
++	0x0045, 0x2c00, 0x6862, 0x6034, 0x6872, 0x2360, 0x6024, 0xc0dd,
++	0x6026, 0x6018, 0xa080, 0x0028, 0x2004, 0xa084, 0x00ff, 0x8007,
++	0x6320, 0x6b4a, 0x6846, 0x684f, 0x0000, 0x6d6a, 0x6e66, 0x686f,
++	0x0001, 0x1078, 0x4a73, 0x2019, 0x0045, 0x6008, 0x2068, 0x1078,
++	0x9dc7, 0x2d00, 0x600a, 0x601f, 0x0006, 0x6003, 0x0007, 0x6017,
++	0x0000, 0x603f, 0x0000, 0x0d7f, 0x037f, 0x0078, 0xa3ae, 0x603f,
++	0x0000, 0x6003, 0x0007, 0x1078, 0x9c1e, 0x0c7f, 0x0d7f, 0x007c,
++	0xa186, 0x0013, 0x00c0, 0xa3ba, 0x6004, 0xa082, 0x0085, 0x2008,
++	0x0079, 0xa3d4, 0xa186, 0x0027, 0x00c0, 0xa3cd, 0x1078, 0x61cd,
++	0x037e, 0x0d7e, 0x6010, 0x2068, 0x2019, 0x0004, 0x1078, 0xa1ca,
++	0x0d7f, 0x037f, 0x1078, 0x62d1, 0x007c, 0xa186, 0x0014, 0x0040,
++	0xa3be, 0x1078, 0x7773, 0x007c, 0xa3dd, 0xa3db, 0xa3db, 0xa3db,
++	0xa3db, 0xa3db, 0xa3dd, 0x1078, 0x1332, 0x1078, 0x61cd, 0x6003,
++	0x000c, 0x1078, 0x62d1, 0x007c, 0xa182, 0x008c, 0x00c8, 0xa3ee,
++	0xa182, 0x0085, 0x0048, 0xa3ee, 0x0079, 0xa3f1, 0x1078, 0x7773,
++	0x007c, 0xa3f8, 0xa3f8, 0xa3f8, 0xa3f8, 0xa3fa, 0xa419, 0xa3f8,
++	0x1078, 0x1332, 0x0d7e, 0x2c68, 0x1078, 0x76c7, 0x0040, 0xa414,
++	0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0xab8e, 0x210c, 0x6136,
++	0x2009, 0xab8f, 0x210c, 0x613a, 0x600b, 0xffff, 0x6918, 0x611a,
++	0x601f, 0x0004, 0x1078, 0x5d8a, 0x2d60, 0x1078, 0x772d, 0x0d7f,
++	0x007c, 0x1078, 0x772d, 0x007c, 0x0e7e, 0x6018, 0x2070, 0x7000,
++	0xd0ec, 0x0e7f, 0x007c, 0x6010, 0xa08c, 0xf000, 0x0040, 0xa471,
++	0xa080, 0x0013, 0x200c, 0xd1ec, 0x0040, 0xa471, 0x2001, 0xa672,
++	0x2004, 0xd0ec, 0x0040, 0xa471, 0x6003, 0x0002, 0x6024, 0xc0e5,
++	0x6026, 0xd1ac, 0x0040, 0xa44f, 0x0f7e, 0x2c78, 0x1078, 0x495f,
++	0x0f7f, 0x0040, 0xa44f, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x2009,
++	0xa672, 0x210c, 0xd1f4, 0x00c0, 0xa46f, 0x0078, 0xa461, 0x2009,
++	0xa672, 0x210c, 0xd1f4, 0x0040, 0xa45b, 0x6024, 0xc0e4, 0x6026,
++	0xa006, 0x0078, 0xa471, 0x2001, 0xa8a4, 0x200c, 0x8103, 0xa100,
++	0x603e, 0x6018, 0xa088, 0x002b, 0x2104, 0xa005, 0x0040, 0xa46c,
++	0xa088, 0x0003, 0x0078, 0xa464, 0x2c0a, 0x600f, 0x0000, 0xa085,
++	0x0001, 0x007c, 0x017e, 0x0c7e, 0x0e7e, 0x6120, 0xa2f0, 0x002b,
++	0x2e04, 0x2060, 0x8cff, 0x0040, 0xa491, 0x84ff, 0x00c0, 0xa484,
++	0x6020, 0xa106, 0x00c0, 0xa48c, 0x600c, 0x2072, 0x1078, 0x5bc1,
++	0x1078, 0x772d, 0x0078, 0xa48e, 0xacf0, 0x0003, 0x2e64, 0x0078,
++	0xa47a, 0x0e7f, 0x0c7f, 0x017f, 0x007c, 0x0d7e, 0x6018, 0xa0e8,
++	0x002b, 0x2d04, 0xa005, 0x0040, 0xa4a7, 0xac06, 0x0040, 0xa4a5,
++	0x2d04, 0xa0e8, 0x0003, 0x0078, 0xa499, 0x600c, 0x206a, 0x0d7f,
++	0x007c, 0x027e, 0x037e, 0x157e, 0x2011, 0xa626, 0x2204, 0xa084,
++	0x00ff, 0x2019, 0xab8e, 0x2334, 0xa636, 0x00c0, 0xa4d5, 0x8318,
++	0x2334, 0x2204, 0xa084, 0xff00, 0xa636, 0x00c0, 0xa4d5, 0x2011,
++	0xab90, 0x6018, 0xa098, 0x000a, 0x20a9, 0x0004, 0x1078, 0x80de,
++	0x00c0, 0xa4d5, 0x2011, 0xab94, 0x6018, 0xa098, 0x0006, 0x20a9,
++	0x0004, 0x1078, 0x80de, 0x00c0, 0xa4d5, 0x157f, 0x037f, 0x027f,
++	0x007c, 0x0e7e, 0x2071, 0xa600, 0x1078, 0x42b8, 0x1078, 0x2677,
++	0x0e7f, 0x007c, 0x0e7e, 0x6018, 0x2070, 0x7000, 0xd0fc, 0x0040,
++	0xa4eb, 0x1078, 0xa4ed, 0x0e7f, 0x007c, 0x6850, 0xc0e5, 0x6852,
++	0x007c, 0x0e7e, 0x0c7e, 0x077e, 0x067e, 0x057e, 0x047e, 0x027e,
++	0x017e, 0x127e, 0x2091, 0x8000, 0x2029, 0xa8ba, 0x252c, 0x2021,
++	0xa8c0, 0x2424, 0x2061, 0xad00, 0x2071, 0xa600, 0x7648, 0x7064,
++	0xa606, 0x0040, 0xa545, 0x671c, 0xa786, 0x0001, 0x0040, 0xa514,
++	0xa786, 0x0008, 0x00c0, 0xa53b, 0x2500, 0xac06, 0x0040, 0xa53b,
++	0x2400, 0xac06, 0x0040, 0xa53b, 0x1078, 0xa242, 0x0040, 0xa53b,
++	0x1078, 0xa256, 0x00c0, 0xa53b, 0x6000, 0xa086, 0x0004, 0x00c0,
++	0xa52d, 0x017e, 0x1078, 0x1757, 0x017f, 0x1078, 0x8eec, 0x00c0,
++	0xa533, 0x1078, 0x28a6, 0x1078, 0x8f00, 0x00c0, 0xa539, 0x1078,
++	0x7c83, 0x1078, 0x8ec6, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004,
++	0xac02, 0x00c8, 0xa545, 0x0078, 0xa504, 0x127f, 0x017f, 0x027f,
++	0x047f, 0x057f, 0x067f, 0x077f, 0x0c7f, 0x0e7f, 0x007c, 0x127e,
++	0x007e, 0x0e7e, 0x017e, 0x2091, 0x8000, 0x2071, 0xa640, 0xd5a4,
++	0x0040, 0xa55d, 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0040, 0xa563,
++	0x7030, 0x8000, 0x7032, 0xd5ac, 0x0040, 0xa579, 0x2500, 0xa084,
++	0x0007, 0xa08e, 0x0003, 0x0040, 0xa579, 0xa08e, 0x0004, 0x0040,
++	0xa579, 0xa08e, 0x0005, 0x0040, 0xa579, 0x2071, 0xa64a, 0x1078,
++	0xa5ba, 0x017f, 0x0e7f, 0x007f, 0x127f, 0x007c, 0x127e, 0x007e,
++	0x0e7e, 0x017e, 0x2091, 0x8000, 0x2071, 0xa640, 0xd5a4, 0x0040,
++	0xa58c, 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0040, 0xa592, 0x7030,
++	0x8000, 0x7032, 0xd5ac, 0x0040, 0xa5a8, 0x2500, 0xa084, 0x0007,
++	0xa08e, 0x0003, 0x0040, 0xa5a8, 0xa08e, 0x0004, 0x0040, 0xa5a8,
++	0xa08e, 0x0005, 0x0040, 0xa5a8, 0x2071, 0xa64a, 0x1078, 0xa5ba,
++	0x017f, 0x0e7f, 0x007f, 0x127f, 0x007c, 0x127e, 0x007e, 0x0e7e,
++	0x2091, 0x8000, 0x2071, 0xa642, 0x1078, 0xa5ba, 0x0e7f, 0x007f,
++	0x127f, 0x007c, 0x2e04, 0x8000, 0x2072, 0x00c8, 0xa5c3, 0x8e70,
++	0x2e04, 0x8000, 0x2072, 0x007c, 0x0e7e, 0x2071, 0xa640, 0x1078,
++	0xa5ba, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa644, 0x1078, 0xa5ba,
++	0x0e7f, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071,
++	0xa640, 0x7044, 0x8000, 0x7046, 0x0e7f, 0x007f, 0x127f, 0x007c,
++	0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
++	0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000,
++	0xa50c
++};
++#ifdef UNIQUE_FW_NAME
++unsigned short fw2100tp_length01 = 0x95f1;
++#else
++unsigned short risc_code_length01 = 0x95f1;
++#endif
++
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/ql2200ip_fw.c	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,5884 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ *************************************************************************/
++
++/************************************************************************
++ *									*
++ * 	      -- ISP2200 Initiator/Target Firmware ---              	*
++ *      IP and SCSI, Fabric (Public Loop), Point-point, and      	*
++ *             expanded LUN addressing for FCTAPE       		*
++ *									*
++ ************************************************************************/
++
++/*
++ *	Firmware Version 2.02.05 (13:47 Apr 25, 2003)
++ */
++
++#ifdef UNIQUE_FW_NAME
++unsigned short fw2200ip_version = 2*1024+2;
++#else
++unsigned short risc_code_version = 2*1024+2;
++#endif
++
++#ifdef UNIQUE_FW_NAME
++unsigned char fw2200ip_version_str[] = {2,2,5};
++#else
++unsigned char firmware_version[] = {2,2,5};
++#endif
++
++#ifdef UNIQUE_FW_NAME
++#define fw2200ip_VERSION_STRING "2.02.05"
++#else
++#define FW_VERSION_STRING "2.02.05"
++#endif
++
++#ifdef UNIQUE_FW_NAME
++unsigned short fw2200ip_addr01 = 0x1000 ;
++#else
++unsigned short risc_code_addr01 = 0x1000 ;
++#endif
++
++#ifdef UNIQUE_FW_NAME
++unsigned short fw2200ip_code01[] = { 
++#else
++unsigned short risc_code01[] = { 
++#endif
++	0x0470, 0x0000, 0x0000, 0xb5c6, 0x0000, 0x0002, 0x0002, 0x0005,
++	0x0037, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030,
++	0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241,
++	0x5449, 0x4f4e, 0x2049, 0x5350, 0x3232, 0x3030, 0x2046, 0x6972,
++	0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030,
++	0x322e, 0x3032, 0x2e30, 0x3520, 0x2020, 0x2020, 0x2400, 0x20c1,
++	0x0005, 0x2001, 0x017f, 0x2003, 0x0000, 0x20c9, 0xcbff, 0x2091,
++	0x2000, 0x2059, 0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x2b14,
++	0x2051, 0xc600, 0x2a70, 0x2029, 0xfe00, 0x2031, 0xffff, 0x2039,
++	0xfde9, 0x2021, 0x0200, 0x0804, 0x146c, 0x20a1, 0xc5c6, 0xa00e,
++	0x20a9, 0x083a, 0x41a4, 0x3400, 0x7562, 0x7666, 0x775e, 0x746a,
++	0x746e, 0x20a1, 0xce00, 0x7164, 0x810d, 0x810d, 0x810d, 0x810d,
++	0xa18c, 0x000f, 0x2001, 0x000c, 0xa112, 0xa00e, 0x21a8, 0x41a4,
++	0x3400, 0x8211, 0x1dd8, 0x7164, 0x3400, 0xa102, 0x0120, 0x0218,
++	0x20a8, 0xa00e, 0x41a4, 0x3800, 0xd08c, 0x01d8, 0x2009, 0xc600,
++	0x810d, 0x810d, 0x810d, 0x810d, 0xa18c, 0x000f, 0x2001, 0x0001,
++	0xa112, 0x20a1, 0x1000, 0xa00e, 0x21a8, 0x41a4, 0x8211, 0x1de0,
++	0x2009, 0xc600, 0x3400, 0xa102, 0x0120, 0x0218, 0x20a8, 0xa00e,
++	0x41a4, 0x080c, 0x1415, 0x080c, 0x163c, 0x080c, 0x17de, 0x080c,
++	0x2061, 0x080c, 0x4f3b, 0x080c, 0x9585, 0x080c, 0x15bf, 0x080c,
++	0x306e, 0x080c, 0x61dd, 0x080c, 0x5743, 0x080c, 0x7147, 0x080c,
++	0x6edf, 0x080c, 0x265b, 0x080c, 0x7860, 0x080c, 0x68c0, 0x080c,
++	0x2515, 0x080c, 0x2629, 0x2091, 0x3009, 0x7823, 0x0000, 0x1004,
++	0x10c7, 0x7820, 0xa086, 0x0002, 0x1150, 0x7823, 0x4000, 0x0e04,
++	0x10bf, 0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2a70,
++	0x7003, 0x0000, 0x2a70, 0x7000, 0xa08e, 0x0003, 0x1168, 0x080c,
++	0x40b9, 0x080c, 0x3095, 0x080c, 0x622b, 0x080c, 0x5943, 0x080c,
++	0x7184, 0x080c, 0x6f0a, 0x0c70, 0x000b, 0x0c88, 0x10e8, 0x10e9,
++	0x1214, 0x10e6, 0x12e1, 0x1412, 0x1413, 0x1414, 0x080c, 0x1519,
++	0x0005, 0x0126, 0x00f6, 0x2091, 0x8000, 0x7000, 0xa086, 0x0001,
++	0x1904, 0x11f1, 0x080c, 0x158c, 0x080c, 0x5f22, 0x0150, 0x080c,
++	0x5f48, 0x15c0, 0x2079, 0x0100, 0x7828, 0xa085, 0x1800, 0x782a,
++	0x0488, 0x080c, 0x5e5a, 0x7000, 0xa086, 0x0001, 0x1904, 0x11f1,
++	0x708c, 0xa086, 0x0028, 0x1904, 0x11f1, 0x2001, 0x0161, 0x2003,
++	0x0001, 0x2079, 0x0100, 0x7827, 0xffff, 0x7a28, 0xa295, 0x1e2f,
++	0x7a2a, 0x2011, 0x5df5, 0x080c, 0x6fad, 0x2011, 0x5de8, 0x080c,
++	0x7070, 0x2011, 0x5e37, 0x080c, 0x6fad, 0x2011, 0x4e18, 0x080c,
++	0x6fad, 0x2011, 0x8030, 0x2019, 0x0000, 0x708b, 0x0000, 0x080c,
++	0x1eae, 0x00e8, 0x080c, 0x47cb, 0x2079, 0x0100, 0x7844, 0xa005,
++	0x1904, 0x11f1, 0x2011, 0x4e18, 0x080c, 0x6fad, 0x2011, 0x5e37,
++	0x080c, 0x6fad, 0x080c, 0x1eae, 0x2001, 0xc8d4, 0x2004, 0x780e,
++	0x7840, 0xa084, 0xfffb, 0x7842, 0x2011, 0x8010, 0x73cc, 0x080c,
++	0x407d, 0x723c, 0xc284, 0x723e, 0x2001, 0xc60c, 0x200c, 0xc1ac,
++	0x2102, 0x080c, 0x8dca, 0x2011, 0x0004, 0x080c, 0xac97, 0x080c,
++	0x55e1, 0x080c, 0x5f22, 0x0158, 0x080c, 0x4f24, 0x0140, 0x708b,
++	0x0001, 0x70c7, 0x0000, 0x080c, 0x4968, 0x0804, 0x11f1, 0x080c,
++	0x570b, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, 0x0060, 0x7073, 0x0000,
++	0x080c, 0xb03f, 0x70d4, 0xd09c, 0x1128, 0x70a0, 0xa005, 0x0110,
++	0x080c, 0x4f02, 0x70df, 0x0000, 0x70db, 0x0000, 0x72d4, 0x080c,
++	0x5f22, 0x1178, 0x2011, 0x0000, 0x0016, 0x080c, 0x2a95, 0x2019,
++	0xc8d6, 0x211a, 0x001e, 0x7053, 0xffff, 0x7057, 0x00ef, 0x7077,
++	0x0000, 0x2079, 0xc652, 0x7804, 0xd0ac, 0x0108, 0xc295, 0x72d6,
++	0x080c, 0x5f22, 0x0118, 0xa296, 0x0004, 0x0548, 0x2011, 0x0001,
++	0x080c, 0xac97, 0x709b, 0x0000, 0x709f, 0xffff, 0x7003, 0x0002,
++	0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0xa085, 0x0003, 0x782a,
++	0x00fe, 0x080c, 0x2c62, 0x2011, 0x0005, 0x080c, 0x8f0e, 0x080c,
++	0x7e94, 0x080c, 0x5f22, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016,
++	0x080c, 0x2a95, 0x61e2, 0x001e, 0x00ce, 0x012e, 0x0420, 0x709b,
++	0x0000, 0x709f, 0xffff, 0x7003, 0x0002, 0x00f6, 0x2079, 0x0100,
++	0x7827, 0x0003, 0x7828, 0xa085, 0x0003, 0x782a, 0x00fe, 0x2011,
++	0x0005, 0x080c, 0x8f0e, 0x080c, 0x7e94, 0x080c, 0x5f22, 0x0148,
++	0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, 0x2a95, 0x61e2, 0x001e,
++	0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6, 0x080c, 0x5f22, 0x1118,
++	0x20a9, 0x0100, 0x0010, 0x20a9, 0x0082, 0x080c, 0x5f22, 0x1118,
++	0x2009, 0x0000, 0x0010, 0x2009, 0x007e, 0x080c, 0x2f41, 0x8108,
++	0x1f04, 0x1205, 0x00ce, 0x7073, 0x0000, 0x7074, 0xa084, 0x00ff,
++	0x7076, 0x70a3, 0x0000, 0x0005, 0x0126, 0x2091, 0x8000, 0x7000,
++	0xa086, 0x0002, 0x1904, 0x12df, 0x709c, 0xa086, 0xffff, 0x0130,
++	0x080c, 0x2c62, 0x080c, 0x7e94, 0x0804, 0x12df, 0x70d4, 0xd0ac,
++	0x1110, 0xd09c, 0x0540, 0xd084, 0x0530, 0x0006, 0x0016, 0x2001,
++	0x0103, 0x2009, 0xc8d4, 0x210c, 0x2102, 0x001e, 0x000e, 0xd08c,
++	0x01d0, 0x70d8, 0xa086, 0xffff, 0x0190, 0x080c, 0x2dc1, 0x080c,
++	0x7e94, 0x70d4, 0xd094, 0x1904, 0x12df, 0x2011, 0x0001, 0x2019,
++	0x0000, 0x080c, 0x2df9, 0x080c, 0x7e94, 0x0804, 0x12df, 0x70dc,
++	0xa005, 0x1904, 0x12df, 0x7098, 0xa005, 0x1904, 0x12df, 0x70d4,
++	0xd0a4, 0x0118, 0xd0b4, 0x0904, 0x12df, 0x080c, 0x570b, 0x1904,
++	0x12df, 0x2001, 0xc653, 0x2004, 0xd0ac, 0x01c8, 0x0156, 0x00c6,
++	0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x533d, 0x1118,
++	0x6000, 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04, 0x126c, 0x00ce,
++	0x015e, 0x0028, 0x001e, 0x00ce, 0x015e, 0x0804, 0x12df, 0x0006,
++	0x0016, 0x2001, 0x0103, 0x2009, 0xc8d4, 0x210c, 0x2102, 0x001e,
++	0x000e, 0x71a8, 0x81ff, 0x11b0, 0xa006, 0x2009, 0x0200, 0x20a9,
++	0x0002, 0x20a1, 0xc925, 0x40a1, 0x2009, 0x0700, 0x20a9, 0x0002,
++	0x20a1, 0xc915, 0x40a1, 0x7070, 0x8007, 0x7174, 0x810f, 0x20a9,
++	0x0002, 0x40a1, 0x20a1, 0xc919, 0x2009, 0x0000, 0x080c, 0x14ff,
++	0x2001, 0x0000, 0x810f, 0x20a9, 0x0002, 0x40a1, 0x7030, 0xc08c,
++	0x7032, 0x7003, 0x0003, 0x709f, 0xffff, 0x080c, 0x1585, 0xa006,
++	0x080c, 0x296d, 0x080c, 0x40ef, 0x00f6, 0x2079, 0x0100, 0x080c,
++	0x5f48, 0x0150, 0x080c, 0x5f22, 0x7828, 0x0118, 0xa084, 0xe1ff,
++	0x0010, 0xa084, 0xffdf, 0x782a, 0x00fe, 0x2001, 0xc928, 0x2004,
++	0xa086, 0x0005, 0x1120, 0x2011, 0x0000, 0x080c, 0x8f0e, 0x2011,
++	0x0000, 0x080c, 0x8f18, 0x080c, 0x7e94, 0x080c, 0x7f6e, 0x012e,
++	0x0005, 0x0016, 0x0046, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079,
++	0x0100, 0x2009, 0xc634, 0x2104, 0xa005, 0x1110, 0x080c, 0x2ac1,
++	0x2009, 0x00f7, 0x080c, 0x4eeb, 0x7940, 0xa18c, 0x0010, 0x7942,
++	0x7924, 0xd1b4, 0x0110, 0x7827, 0x0040, 0xd19c, 0x0110, 0x7827,
++	0x0008, 0x0006, 0x0036, 0x0156, 0x7954, 0xd1ac, 0x1904, 0x134f,
++	0x080c, 0x5f34, 0x0158, 0x080c, 0x5f48, 0x1128, 0x2001, 0xc8e5,
++	0x2003, 0x0000, 0x0070, 0x080c, 0x5f2a, 0x0dc0, 0x2001, 0xc8e5,
++	0x2003, 0xaaaa, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x080c, 0x5e5a,
++	0x0058, 0x080c, 0x5f22, 0x0140, 0x2009, 0x00f8, 0x080c, 0x4eeb,
++	0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c,
++	0x1138, 0x080c, 0x5f22, 0x0138, 0x7824, 0xd0ac, 0x1904, 0x13f9,
++	0x1f04, 0x132e, 0x0070, 0x7824, 0x080c, 0x5f3e, 0x0118, 0xd0ac,
++	0x1904, 0x13f9, 0xa084, 0x1800, 0x0d98, 0x7003, 0x0001, 0x0804,
++	0x13f9, 0x2001, 0x0001, 0x080c, 0x296d, 0x0804, 0x1408, 0x7850,
++	0xa084, 0x0180, 0x7852, 0x782f, 0x0020, 0x20a9, 0x0046, 0x1d04,
++	0x1357, 0x080c, 0x7058, 0x1f04, 0x1357, 0x7850, 0xa084, 0x0180,
++	0xa085, 0x0400, 0x7852, 0x782f, 0x0000, 0x080c, 0x5f34, 0x0158,
++	0x080c, 0x5f48, 0x1128, 0x2001, 0xc8e5, 0x2003, 0x0000, 0x0070,
++	0x080c, 0x5f2a, 0x0dc0, 0x2001, 0xc8e5, 0x2003, 0xaaaa, 0x2001,
++	0xc8e6, 0x2003, 0x0001, 0x080c, 0x5e5a, 0x0020, 0x2009, 0x00f8,
++	0x080c, 0x4eeb, 0x20a9, 0x000e, 0xe000, 0x1f04, 0x1384, 0x7850,
++	0xa084, 0x0180, 0xa085, 0x1400, 0x7852, 0x080c, 0x5f22, 0x0120,
++	0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678, 0x2019, 0xea60,
++	0x7820, 0xd09c, 0x1558, 0x080c, 0x5f22, 0x05d8, 0x7824, 0xd0ac,
++	0x1904, 0x13f9, 0x080c, 0x5f48, 0x1508, 0x0046, 0x2021, 0x0190,
++	0x8421, 0x1df0, 0x004e, 0x8421, 0x11c8, 0x7827, 0x0048, 0x20a9,
++	0x01f4, 0x1d04, 0x13b1, 0x080c, 0x7058, 0x1f04, 0x13b1, 0x7824,
++	0xa084, 0x0068, 0x15c8, 0x2001, 0xc8e5, 0x2003, 0xaaaa, 0x2001,
++	0xc8e6, 0x2003, 0x0001, 0x7003, 0x0001, 0x0498, 0x1d04, 0x13ca,
++	0x080c, 0x7058, 0x8319, 0x1960, 0x2009, 0xc634, 0x2104, 0x8000,
++	0x200a, 0xa084, 0xfff0, 0x0120, 0x200b, 0x0000, 0x080c, 0x2ac1,
++	0x00d8, 0x080c, 0x5f34, 0x1140, 0xa4a2, 0x0064, 0x1128, 0x080c,
++	0x5ef9, 0x7003, 0x0001, 0x00a8, 0x7827, 0x1800, 0xe000, 0xe000,
++	0x7824, 0x080c, 0x5f3e, 0x0110, 0xd0ac, 0x1158, 0xa084, 0x1800,
++	0x09a8, 0x7003, 0x0001, 0x0028, 0x2001, 0x0001, 0x080c, 0x296d,
++	0x0048, 0x2001, 0xc634, 0x2003, 0x0000, 0x7827, 0x0048, 0x7828,
++	0xc09d, 0x782a, 0x7850, 0xa084, 0x0180, 0xa085, 0x0400, 0x7852,
++	0x015e, 0x003e, 0x000e, 0x080c, 0x155c, 0x012e, 0x00fe, 0x004e,
++	0x001e, 0x0005, 0x0005, 0x0005, 0x0005, 0x2a70, 0x2061, 0xc908,
++	0x2063, 0x0002, 0x6007, 0x0002, 0x600b, 0x0005, 0x600f, 0x0037,
++	0x2001, 0xc8e5, 0x2003, 0x0000, 0x708b, 0x0000, 0x2009, 0x0100,
++	0x2104, 0xa082, 0x0002, 0x0218, 0x7053, 0xffff, 0x0010, 0x7053,
++	0x0000, 0x705b, 0xffff, 0x7073, 0x0000, 0x7077, 0x0000, 0x080c,
++	0xb03f, 0x2061, 0xc8d5, 0x6003, 0x0909, 0x6007, 0x0000, 0x600b,
++	0x8800, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x001f, 0x601b,
++	0x0000, 0x601f, 0x07d0, 0x2061, 0xc8dd, 0x6003, 0x8000, 0x6007,
++	0x0000, 0x600b, 0x0000, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017,
++	0x0000, 0x601b, 0x0001, 0x601f, 0x0000, 0x2061, 0xc900, 0x6003,
++	0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, 0x2001,
++	0xc628, 0x2003, 0x0000, 0x0005, 0x04a0, 0x2011, 0x0000, 0x81ff,
++	0x0570, 0xa186, 0x0001, 0x1148, 0x2031, 0x8fff, 0x2039, 0xe601,
++	0x2021, 0x0100, 0x2029, 0xe600, 0x00e8, 0xa186, 0x0002, 0x1118,
++	0x2011, 0x0000, 0x00b8, 0xa186, 0x0005, 0x1118, 0x2011, 0x0001,
++	0x0088, 0xa186, 0x0009, 0x1118, 0x2011, 0x0002, 0x0058, 0xa186,
++	0x000a, 0x1118, 0x2011, 0x0002, 0x0028, 0xa186, 0x0055, 0x1110,
++	0x2011, 0x0003, 0x3800, 0xa084, 0xfffc, 0xa205, 0x20c0, 0x0804,
++	0x104d, 0xa00e, 0x2011, 0x0003, 0x2019, 0x14a8, 0x0804, 0x14f9,
++	0x2019, 0xaaaa, 0x2061, 0xffff, 0x2c14, 0x2362, 0xe000, 0xe000,
++	0x2c04, 0xa306, 0x2262, 0x1110, 0xc1b5, 0xc1a5, 0x2011, 0x0000,
++	0x2019, 0x14bb, 0x04f0, 0x2019, 0xaaaa, 0x2061, 0xffff, 0x2c14,
++	0x2362, 0xe000, 0xe000, 0x2c1c, 0x2061, 0x7fff, 0xe000, 0xe000,
++	0x2c04, 0x2061, 0xffff, 0x2262, 0xa306, 0x0110, 0xc18d, 0x0008,
++	0xc185, 0x2011, 0x0002, 0x2019, 0x14d6, 0x0418, 0x2061, 0xffff,
++	0x2019, 0xaaaa, 0x2c14, 0x2362, 0xe000, 0xe000, 0x2c04, 0x2262,
++	0xa306, 0x1180, 0x2c14, 0x2362, 0xe000, 0xe000, 0x2c1c, 0x2061,
++	0x7fff, 0x2c04, 0x2061, 0xffff, 0x2262, 0xa306, 0x1110, 0xc195,
++	0x0008, 0xc19d, 0x2011, 0x0001, 0x2019, 0x14f7, 0x0010, 0x0804,
++	0x146d, 0x3800, 0xa084, 0xfffc, 0xa205, 0x20c0, 0x0837, 0x2011,
++	0x0000, 0x080c, 0x533d, 0x1178, 0x6004, 0xa0c4, 0x00ff, 0xa8c6,
++	0x0006, 0x0128, 0xa0c4, 0xff00, 0xa8c6, 0x0600, 0x1120, 0xa186,
++	0x0080, 0x0108, 0x8210, 0x8108, 0xa186, 0x0100, 0x1d50, 0x2208,
++	0x0005, 0x2091, 0x8000, 0x0e04, 0x151b, 0x0006, 0x0016, 0x2079,
++	0x0000, 0x7818, 0xd084, 0x1de8, 0x001e, 0x792e, 0x000e, 0x782a,
++	0x000e, 0x7826, 0x3900, 0x783a, 0x7823, 0x8002, 0x781b, 0x0001,
++	0x2091, 0x5000, 0x0126, 0x0156, 0x0146, 0x20a9, 0x0010, 0x20a1,
++	0xca54, 0x2091, 0x2000, 0x40a1, 0x20a9, 0x0010, 0x2091, 0x2200,
++	0x40a1, 0x20a9, 0x0010, 0x2091, 0x2400, 0x40a1, 0x20a9, 0x0010,
++	0x2091, 0x2600, 0x40a1, 0x20a9, 0x0010, 0x2091, 0x2800, 0x40a1,
++	0x014e, 0x015e, 0x012e, 0x2079, 0xc600, 0x7803, 0x0005, 0x2091,
++	0x4080, 0x04c9, 0x0cf8, 0x0005, 0x0006, 0x080c, 0x15a7, 0x1518,
++	0x00f6, 0x2079, 0xc624, 0x2f04, 0x8000, 0x207a, 0xa082, 0x000f,
++	0x0258, 0xa006, 0x207a, 0x2079, 0xc626, 0x2f04, 0xa084, 0x0001,
++	0xa086, 0x0001, 0x207a, 0x0070, 0x2079, 0xc626, 0x2f7c, 0x8fff,
++	0x1128, 0x2001, 0x0c03, 0x2003, 0x0040, 0x0020, 0x2001, 0x0c03,
++	0x2003, 0x00c0, 0x00fe, 0x000e, 0x0005, 0x0409, 0x1120, 0x2001,
++	0x0c03, 0x2003, 0x0080, 0x0005, 0x00d1, 0x1120, 0x2001, 0x0c03,
++	0x2003, 0x0040, 0x0005, 0x0006, 0x0091, 0x1178, 0x2001, 0x0c03,
++	0x2003, 0x0040, 0x2009, 0x0fff, 0x00a1, 0x2001, 0x0c03, 0x2003,
++	0x0080, 0x2009, 0x0fff, 0x0069, 0x0c88, 0x000e, 0x0005, 0x00c6,
++	0x2061, 0x0c00, 0x2c04, 0xa084, 0x00ff, 0xa086, 0x00aa, 0x00ce,
++	0x0005, 0x0156, 0x0126, 0xa18c, 0x0fff, 0x21a8, 0x1d04, 0x15b6,
++	0x2091, 0x6000, 0x1f04, 0x15b6, 0x012e, 0x015e, 0x0005, 0x2071,
++	0xc600, 0x7160, 0x712e, 0x2021, 0x0001, 0xa190, 0x0030, 0xa298,
++	0x0030, 0x0240, 0x7064, 0xa302, 0x1228, 0x220a, 0x2208, 0x2310,
++	0x8420, 0x0ca8, 0x3800, 0xd08c, 0x0148, 0x7064, 0xa086, 0xc600,
++	0x0128, 0x7067, 0xc600, 0x2011, 0x1000, 0x0c48, 0x200b, 0x0000,
++	0x74b2, 0x74b6, 0x70eb, 0x0010, 0x0005, 0x00e6, 0x0126, 0x2091,
++	0x8000, 0x2071, 0xc600, 0x70b4, 0x0016, 0x2008, 0x70e8, 0xa16a,
++	0x2100, 0x001e, 0x0268, 0x8001, 0x70b6, 0x702c, 0x2068, 0x2d04,
++	0x702e, 0x206b, 0x0000, 0x6807, 0x0000, 0x012e, 0x00ee, 0x0005,
++	0xa06e, 0x0cd8, 0x00e6, 0x2071, 0xc600, 0x0126, 0x2091, 0x8000,
++	0x70b4, 0x8001, 0x0260, 0x70b6, 0x702c, 0x2068, 0x2d04, 0x702e,
++	0x206b, 0x0000, 0x6807, 0x0000, 0x012e, 0x00ee, 0x0005, 0xa06e,
++	0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0xc600, 0x702c,
++	0x206a, 0x2d00, 0x702e, 0x70b4, 0x8000, 0x70b6, 0x012e, 0x00ee,
++	0x0005, 0x8dff, 0x0138, 0x6804, 0x6807, 0x0000, 0x0006, 0x0c49,
++	0x00de, 0x0cb8, 0x0005, 0x00e6, 0x2071, 0xc600, 0x70b4, 0xa08a,
++	0x0010, 0xa00d, 0x00ee, 0x0005, 0x00e6, 0x2071, 0xc959, 0x7007,
++	0x0000, 0x701b, 0x0000, 0x701f, 0x0000, 0x2071, 0x0000, 0x7010,
++	0xa085, 0x8004, 0x7012, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000,
++	0x00e6, 0x2270, 0x700b, 0x0000, 0x2071, 0xc959, 0x7018, 0xa088,
++	0xc962, 0x220a, 0x8000, 0xa084, 0x0007, 0x701a, 0x7004, 0xa005,
++	0x1128, 0x00f6, 0x2079, 0x0010, 0x0089, 0x00fe, 0x00ee, 0x012e,
++	0x0005, 0x00e6, 0x2071, 0xc959, 0x7004, 0xa005, 0x1128, 0x00f6,
++	0x2079, 0x0010, 0x0019, 0x00fe, 0x00ee, 0x0005, 0x7000, 0x0002,
++	0x1680, 0x16e4, 0x1701, 0x1701, 0x23e7, 0x16e4, 0x1701, 0x16e4,
++	0x7018, 0x711c, 0xa106, 0x1118, 0x7007, 0x0000, 0x0005, 0x00d6,
++	0xa180, 0xc962, 0x2004, 0x700a, 0x2068, 0x8108, 0xa18c, 0x0007,
++	0x711e, 0x7803, 0x0026, 0x6824, 0x7832, 0x6828, 0x7836, 0x682c,
++	0x783a, 0x6830, 0x783e, 0x6810, 0x700e, 0x680c, 0x7016, 0x6804,
++	0x00de, 0xd084, 0x0120, 0x7007, 0x0001, 0x0029, 0x0005, 0x7007,
++	0x0002, 0x00b1, 0x0005, 0x0016, 0x0026, 0x710c, 0x2011, 0x0040,
++	0xa182, 0x0040, 0x1210, 0x2110, 0xa006, 0x700e, 0x7212, 0x8203,
++	0x7822, 0x7803, 0x0020, 0x7803, 0x0041, 0x002e, 0x001e, 0x0005,
++	0x0016, 0x0026, 0x0136, 0x0146, 0x0156, 0x7014, 0x2098, 0x20a1,
++	0x0014, 0x7803, 0x0026, 0x710c, 0x2011, 0x0040, 0xa182, 0x0040,
++	0x1210, 0x2110, 0xa006, 0x700e, 0x22a8, 0x53a6, 0x8203, 0x7822,
++	0x7803, 0x0020, 0x3300, 0x7016, 0x7803, 0x0001, 0x015e, 0x014e,
++	0x013e, 0x002e, 0x001e, 0x0005, 0x0136, 0x0146, 0x0156, 0x2099,
++	0xc71a, 0x20a1, 0x0018, 0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020,
++	0x0126, 0x2091, 0x8000, 0x7803, 0x0041, 0x7007, 0x0003, 0x7000,
++	0xc084, 0x7002, 0x700b, 0xc715, 0x012e, 0x015e, 0x014e, 0x013e,
++	0x0005, 0x0136, 0x0146, 0x0156, 0x2001, 0xc749, 0x209c, 0x20a1,
++	0x0014, 0x7803, 0x0026, 0x2001, 0xc74a, 0x20ac, 0x53a6, 0x2099,
++	0xc74b, 0x20a1, 0x0018, 0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020,
++	0x0126, 0x2091, 0x8000, 0x7803, 0x0001, 0x7007, 0x0004, 0x7000,
++	0xc08c, 0x7002, 0x700b, 0xc746, 0x012e, 0x015e, 0x014e, 0x013e,
++	0x0005, 0x0016, 0x00e6, 0x2071, 0xc959, 0x00f6, 0x2079, 0x0010,
++	0x7904, 0x7803, 0x0002, 0xd1fc, 0x0120, 0xa18c, 0x0700, 0x7004,
++	0x0023, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x1676, 0x1745, 0x1773,
++	0x179d, 0x17cd, 0x2404, 0x1744, 0x0cf8, 0xa18c, 0x0700, 0x1528,
++	0x0136, 0x0146, 0x0156, 0x7014, 0x20a0, 0x2099, 0x0014, 0x7803,
++	0x0040, 0x7010, 0x20a8, 0x53a5, 0x3400, 0x7016, 0x015e, 0x014e,
++	0x013e, 0x700c, 0xa005, 0x0570, 0x7830, 0x7832, 0x7834, 0x7836,
++	0x080c, 0x16ab, 0x0005, 0x7008, 0xa080, 0x0002, 0x2003, 0x0100,
++	0x7007, 0x0000, 0x080c, 0x1676, 0x0005, 0x7008, 0xa080, 0x0002,
++	0x2003, 0x0200, 0x0ca8, 0xa18c, 0x0700, 0x1150, 0x700c, 0xa005,
++	0x0188, 0x7830, 0x7832, 0x7834, 0x7836, 0x080c, 0x16c0, 0x0005,
++	0x7008, 0xa080, 0x0002, 0x2003, 0x0200, 0x7007, 0x0000, 0x080c,
++	0x1676, 0x0005, 0x00d6, 0x7008, 0x2068, 0x7830, 0x6826, 0x7834,
++	0x682a, 0x7838, 0x682e, 0x783c, 0x6832, 0x680b, 0x0100, 0x00de,
++	0x7007, 0x0000, 0x080c, 0x1676, 0x0005, 0xa18c, 0x0700, 0x1540,
++	0x0136, 0x0146, 0x0156, 0x2001, 0xc718, 0x2004, 0xa080, 0x000d,
++	0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x20a9, 0x0020, 0x53a5,
++	0x2001, 0xc71a, 0x2004, 0xd0bc, 0x0148, 0x2001, 0xc723, 0x2004,
++	0xa080, 0x000d, 0x20a0, 0x20a9, 0x0020, 0x53a5, 0x015e, 0x014e,
++	0x013e, 0x7007, 0x0000, 0x080c, 0x62c2, 0x080c, 0x1676, 0x0005,
++	0x2011, 0x8003, 0x080c, 0x407d, 0x0cf8, 0xa18c, 0x0700, 0x1148,
++	0x2001, 0xc748, 0x2003, 0x0100, 0x7007, 0x0000, 0x080c, 0x1676,
++	0x0005, 0x2011, 0x8004, 0x080c, 0x407d, 0x0cf8, 0x0126, 0x2091,
++	0x2200, 0x2079, 0x0030, 0x2071, 0xc96a, 0x7003, 0x0000, 0x700f,
++	0xc977, 0x7013, 0xc977, 0x780f, 0x00f6, 0x7803, 0x0004, 0x012e,
++	0x0005, 0x6934, 0xa184, 0x0007, 0x0002, 0x17fd, 0x183e, 0x17fd,
++	0x17fd, 0x1801, 0x1826, 0x180d, 0x1804, 0xa085, 0x0001, 0x0804,
++	0x1858, 0x080c, 0x7684, 0x05d0, 0x684c, 0xd0bc, 0x0db0, 0x6860,
++	0x682e, 0x685c, 0x682a, 0x6858, 0x04c8, 0xa18c, 0x00ff, 0xa186,
++	0x001e, 0x1d58, 0x684c, 0xd0bc, 0x0d40, 0x6860, 0x682e, 0x685c,
++	0x682a, 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f,
++	0xa080, 0x23c7, 0x2005, 0x6832, 0x6858, 0x0440, 0xa18c, 0x00ff,
++	0xa186, 0x0015, 0x1990, 0x684c, 0xd0ac, 0x0978, 0x6804, 0x681a,
++	0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x23c7, 0x2005,
++	0x6832, 0xa006, 0x682e, 0x682a, 0x6858, 0x0080, 0x684c, 0xd0ac,
++	0x0904, 0x17fd, 0xa006, 0x682e, 0x682a, 0x6858, 0xa18c, 0x000f,
++	0xa188, 0x23c7, 0x210d, 0x6932, 0x2d08, 0x691a, 0x6826, 0x684c,
++	0xc0dd, 0x684e, 0xa006, 0x680a, 0x697c, 0x6912, 0x6980, 0x6916,
++	0x0005, 0x684c, 0xd0ac, 0x090c, 0x1519, 0x6833, 0x23c4, 0x2d08,
++	0x691a, 0x6858, 0x8001, 0x6826, 0x684c, 0xc0dd, 0x684e, 0xa006,
++	0x680a, 0x682e, 0x682a, 0x697c, 0x6912, 0x6980, 0x6916, 0x0005,
++	0x20e1, 0x0007, 0x20e1, 0x2000, 0x2001, 0x020a, 0x2004, 0x82ff,
++	0x01e8, 0xa280, 0x0004, 0x00d6, 0x206c, 0x684c, 0xd0dc, 0x1190,
++	0xa280, 0x0007, 0x2004, 0xa086, 0x000a, 0x1110, 0x0891, 0x0010,
++	0x080c, 0x17f1, 0x0138, 0x00de, 0xa280, 0x0000, 0x2003, 0x0002,
++	0xa016, 0x0020, 0x6808, 0x8000, 0x680a, 0x00de, 0x0126, 0x0046,
++	0x0036, 0x0026, 0x2091, 0x2200, 0x002e, 0x003e, 0x004e, 0x7000,
++	0xa005, 0x0178, 0x710c, 0x220a, 0x8108, 0x230a, 0x8108, 0x240a,
++	0x8108, 0xa182, 0xc992, 0x0210, 0x2009, 0xc977, 0x710e, 0x012e,
++	0x0005, 0x7206, 0x2001, 0x18af, 0x0006, 0x2260, 0x0804, 0x19d3,
++	0x0126, 0x0026, 0x0036, 0x00c6, 0x0006, 0x2091, 0x2200, 0x000e,
++	0x004e, 0x003e, 0x002e, 0x00d6, 0x00c6, 0x2460, 0x6110, 0x2168,
++	0x6a62, 0x6b5e, 0xa005, 0x0904, 0x1910, 0x6808, 0xa005, 0x0904,
++	0x1947, 0x7000, 0xa005, 0x1108, 0x0488, 0x700c, 0x7110, 0xa106,
++	0x1904, 0x194f, 0x7004, 0xa406, 0x1548, 0x2001, 0x0005, 0x2004,
++	0xd08c, 0x0168, 0x0046, 0x080c, 0x1b83, 0x004e, 0x2460, 0x6010,
++	0xa080, 0x0002, 0x2004, 0xa005, 0x0904, 0x1947, 0x0c10, 0x2001,
++	0x0207, 0x2004, 0xd09c, 0x1d48, 0x7804, 0xa084, 0x6000, 0x0120,
++	0xa086, 0x6000, 0x0108, 0x0c08, 0x7818, 0x6812, 0x781c, 0x6816,
++	0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x6100, 0xa18e,
++	0x0004, 0x1904, 0x194f, 0x2009, 0x0048, 0x080c, 0x9613, 0x04f8,
++	0x6808, 0xa005, 0x05a0, 0x7000, 0xa005, 0x0588, 0x700c, 0x7110,
++	0xa106, 0x1118, 0x7004, 0xa406, 0x1550, 0x2001, 0x0005, 0x2004,
++	0xd08c, 0x0160, 0x0046, 0x080c, 0x1b83, 0x004e, 0x2460, 0x6010,
++	0xa080, 0x0002, 0x2004, 0xa005, 0x01d0, 0x0c28, 0x2001, 0x0207,
++	0x2004, 0xd09c, 0x1d50, 0x2001, 0x0005, 0x2004, 0xd08c, 0x1d50,
++	0x7804, 0xa084, 0x6000, 0x0118, 0xa086, 0x6000, 0x19f0, 0x7818,
++	0x6812, 0x781c, 0x6816, 0x7803, 0x0004, 0x7003, 0x0000, 0x6100,
++	0xa18e, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, 0x9613, 0x00ce,
++	0x00de, 0x012e, 0x0005, 0x00f6, 0x00e6, 0x0026, 0x0036, 0x0046,
++	0x0056, 0x2071, 0xc96a, 0x7000, 0xa086, 0x0000, 0x0904, 0x19b9,
++	0x7004, 0xac06, 0x1904, 0x19ab, 0x2079, 0x0030, 0x7000, 0xa086,
++	0x0003, 0x0904, 0x19ab, 0x7804, 0xd0fc, 0x15c8, 0x20e1, 0x6000,
++	0x2011, 0x0032, 0x2001, 0x0208, 0x200c, 0x2001, 0x0209, 0x2004,
++	0xa106, 0x1d88, 0x8211, 0x1db0, 0x7804, 0xd0fc, 0x1540, 0x080c,
++	0x1f2d, 0x0026, 0x0056, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x1de8,
++	0x7803, 0x0002, 0x7803, 0x0009, 0x7003, 0x0003, 0x7007, 0x0000,
++	0x005e, 0x002e, 0x2001, 0x015d, 0x2003, 0x0000, 0x080c, 0x5f22,
++	0x1138, 0x0066, 0x2031, 0x0001, 0x080c, 0x5fa4, 0x006e, 0x0058,
++	0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0020, 0x080c,
++	0x1b83, 0x0804, 0x195b, 0x0156, 0x20a9, 0x0009, 0x2009, 0xc977,
++	0x2104, 0xac06, 0x1108, 0x200a, 0xa188, 0x0003, 0x1f04, 0x19b0,
++	0x015e, 0x005e, 0x004e, 0x003e, 0x002e, 0x00ee, 0x00fe, 0x0005,
++	0x700c, 0x7110, 0xa106, 0x0904, 0x1a5c, 0x2104, 0x7006, 0x2060,
++	0x8108, 0x211c, 0x8108, 0x2124, 0x8108, 0xa182, 0xc992, 0x0210,
++	0x2009, 0xc977, 0x7112, 0x8cff, 0x05e8, 0x6010, 0x2068, 0x2d58,
++	0x080c, 0x7824, 0x6828, 0xa406, 0x15e0, 0x682c, 0xa306, 0x15c8,
++	0x7004, 0x2060, 0x6020, 0xc0d4, 0x6022, 0x684c, 0xd0f4, 0x0128,
++	0x6817, 0xffff, 0x6813, 0xffff, 0x0428, 0x6850, 0xd0f4, 0x1130,
++	0x7803, 0x0004, 0x6810, 0x781a, 0x6814, 0x781e, 0x6824, 0x2050,
++	0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f, 0x080c,
++	0x7684, 0x1128, 0x2009, 0x0011, 0x080c, 0x1a5f, 0x0048, 0x2009,
++	0x0011, 0x080c, 0x1a5f, 0x0120, 0x2009, 0x0001, 0x080c, 0x1a5f,
++	0x2d58, 0x0005, 0x7803, 0x0004, 0x080c, 0x1ea2, 0x0904, 0x19c0,
++	0x0cc0, 0x080c, 0x7684, 0x1128, 0x080c, 0x1953, 0x080c, 0x761a,
++	0x0c88, 0x6020, 0xd0f4, 0x11e0, 0xd0d4, 0x01b8, 0x6038, 0xa402,
++	0x6034, 0xa303, 0x0108, 0x1288, 0x643a, 0x6336, 0x6c2a, 0x6b2e,
++	0x0046, 0x0036, 0x2400, 0x6c7c, 0xa402, 0x6812, 0x2300, 0x6b80,
++	0xa303, 0x6816, 0x003e, 0x004e, 0x0018, 0x080c, 0xafd1, 0x0990,
++	0x601c, 0xa08e, 0x0008, 0x0904, 0x19e0, 0xa08e, 0x000a, 0x0904,
++	0x19e0, 0x2001, 0xc674, 0x2004, 0xd0b4, 0x1140, 0x6018, 0x2004,
++	0xd0bc, 0x1120, 0x6817, 0x7fff, 0x6813, 0xffff, 0x080c, 0x241b,
++	0x1904, 0x1a12, 0x0804, 0x19e0, 0x7003, 0x0000, 0x0005, 0x8aff,
++	0x0904, 0x1b5d, 0xa03e, 0x2730, 0xc9fc, 0x6850, 0xd0fc, 0x11b8,
++	0xd0f4, 0x1538, 0x00d6, 0x2805, 0xac68, 0x2900, 0x0002, 0x1acb,
++	0x1a98, 0x1a98, 0x1acb, 0x1ace, 0x1ac3, 0x1acb, 0x1a98, 0x1acb,
++	0x1aa9, 0x1aa9, 0x1acb, 0x1ace, 0x1acb, 0x1abb, 0x1aa9, 0x7803,
++	0x0004, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0x00d6,
++	0xd99c, 0x0904, 0x1b1e, 0x2805, 0xac68, 0x6f08, 0x6e0c, 0x0804,
++	0x1b1f, 0xc0f4, 0x6852, 0x6b6c, 0x6a70, 0x00d6, 0x0804, 0x1b2c,
++	0x2d10, 0x00de, 0x00d6, 0x6834, 0x2268, 0xa084, 0x00ff, 0xa096,
++	0x0024, 0x0904, 0x1afe, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x0804,
++	0x1b1e, 0x2d10, 0x00de, 0x00d6, 0x6834, 0x2268, 0xa084, 0x00ff,
++	0xa096, 0x002c, 0x0540, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08,
++	0x6e0c, 0x0804, 0x1b1f, 0x00de, 0x00d6, 0x6834, 0xa084, 0x00ff,
++	0xa086, 0x001e, 0x1140, 0x00de, 0x080c, 0x2389, 0x1904, 0x1a5f,
++	0xa00e, 0x0804, 0x1b5d, 0x00de, 0x080c, 0x1519, 0x2d10, 0x00de,
++	0x00d6, 0x6834, 0x2268, 0xa084, 0x00ff, 0xa096, 0x0024, 0x0530,
++	0xa096, 0x002c, 0x1d80, 0x6b10, 0xa3a6, 0xffff, 0x1130, 0x2d10,
++	0x00de, 0x00d6, 0x080c, 0x72fa, 0x2268, 0x2d10, 0x00de, 0x00d6,
++	0x7314, 0x685c, 0xa086, 0x0001, 0x1120, 0x6868, 0xa005, 0x0108,
++	0x2018, 0x2268, 0x2011, 0x0000, 0x6d00, 0x6c04, 0x6f08, 0x6e0c,
++	0x780f, 0x00f0, 0xe000, 0xe000, 0xe000, 0x0408, 0x6b08, 0xa3a6,
++	0xffff, 0x1130, 0x2d10, 0x00de, 0x00d6, 0x080c, 0x72fa, 0x2268,
++	0x2d10, 0x00de, 0x00d6, 0x7314, 0x685c, 0xa086, 0x0001, 0x1120,
++	0x6868, 0xa005, 0x0108, 0x2018, 0x2268, 0x2011, 0x0000, 0x6d00,
++	0x6c04, 0x780f, 0x00f0, 0xe000, 0xe000, 0xe000, 0xc9fd, 0x7b22,
++	0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x731a, 0x721e, 0x7522,
++	0x7426, 0x772a, 0x762e, 0x7902, 0x7100, 0x8108, 0x7102, 0x00de,
++	0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x8109, 0x2d08,
++	0x1500, 0xd9fc, 0x0160, 0xc9fc, 0x080c, 0x2389, 0x01e8, 0x2805,
++	0xac68, 0x6800, 0xa506, 0x11c0, 0x6804, 0xa406, 0x00a8, 0xc9fc,
++	0x080c, 0x2389, 0x0188, 0x2805, 0xac68, 0x6800, 0xa506, 0x1160,
++	0x6804, 0xa406, 0x1148, 0x6808, 0xa706, 0x1130, 0x680c, 0xa606,
++	0x0018, 0xc9fc, 0x080c, 0x2389, 0x2168, 0x0005, 0x080c, 0x1519,
++	0x080c, 0x2014, 0x7004, 0x2060, 0x00d6, 0x6010, 0x2068, 0x7003,
++	0x0000, 0x080c, 0x1ec3, 0x080c, 0xac91, 0x0170, 0x6808, 0x8001,
++	0x680a, 0x697c, 0x6912, 0x6980, 0x6916, 0x682b, 0xffff, 0x682f,
++	0xffff, 0x6850, 0xc0bd, 0x6852, 0x00de, 0x080c, 0xa961, 0x0804,
++	0x1dec, 0x080c, 0x1519, 0x0126, 0x2091, 0x2200, 0x0006, 0x0016,
++	0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700,
++	0x1978, 0xa184, 0x0003, 0xa086, 0x0003, 0x0d58, 0x7000, 0x0002,
++	0x1ba0, 0x1ba6, 0x1cf5, 0x1dc1, 0x1ddb, 0x1ba0, 0x1ba0, 0x1ba0,
++	0x7804, 0xd09c, 0x1904, 0x1dec, 0x080c, 0x1519, 0x8001, 0x7002,
++	0xd1bc, 0x15c0, 0x080c, 0x7684, 0x1508, 0xd1dc, 0x1598, 0x6864,
++	0x8000, 0x6866, 0xd19c, 0x0140, 0x7004, 0x2060, 0x2009, 0x0102,
++	0x080c, 0x9613, 0x0804, 0x1cbc, 0x8aff, 0x0130, 0x2009, 0x0001,
++	0x080c, 0x1a5f, 0x0804, 0x1dec, 0x7004, 0x2060, 0x080c, 0x24e0,
++	0x080c, 0x761a, 0x7007, 0x0000, 0x0804, 0x1c45, 0xd19c, 0x1904,
++	0x1c79, 0xd1dc, 0x1178, 0x8aff, 0x0904, 0x1c79, 0x2009, 0x0001,
++	0x080c, 0x1a5f, 0x0904, 0x1dec, 0x2009, 0x0001, 0x080c, 0x1a5f,
++	0x0804, 0x1dec, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc, 0x1904,
++	0x1c4b, 0x080c, 0x7684, 0x1130, 0xd19c, 0x0120, 0x6864, 0x8000,
++	0x6866, 0x0810, 0x0026, 0x0036, 0x7c20, 0x7d24, 0x7e30, 0x7f34,
++	0x7818, 0x6812, 0x781c, 0x6816, 0x2001, 0x0201, 0x2004, 0xa005,
++	0x0140, 0x7808, 0xd0ec, 0x1128, 0x7803, 0x0009, 0x7003, 0x0004,
++	0x0028, 0x080c, 0x7684, 0x0110, 0x080c, 0x1df0, 0x6b28, 0x6a2c,
++	0x2400, 0x686e, 0xa31a, 0x2500, 0x6872, 0xa213, 0x6b2a, 0x6a2e,
++	0x00c6, 0x7004, 0x2060, 0x6020, 0xd0f4, 0x1110, 0x633a, 0x6236,
++	0x00ce, 0x003e, 0x002e, 0x6e1e, 0x6f22, 0x2500, 0xa405, 0x0128,
++	0x080c, 0x239f, 0x6850, 0xc0fd, 0x6852, 0x2a00, 0x6826, 0x2c00,
++	0x681a, 0x2800, 0x6832, 0x6808, 0x8001, 0x680a, 0x1148, 0x684c,
++	0xd0e4, 0x0130, 0x7004, 0x2060, 0x2009, 0x0048, 0x080c, 0x9613,
++	0x7000, 0xa086, 0x0004, 0x0904, 0x1dec, 0x7003, 0x0000, 0x080c,
++	0x19c0, 0x0804, 0x1dec, 0x0056, 0x7d0c, 0xd5bc, 0x1110, 0x080c,
++	0xc55e, 0x005e, 0x080c, 0x1ec3, 0x7004, 0x2060, 0x601c, 0xa086,
++	0x0009, 0x1140, 0x2009, 0x0106, 0x080c, 0x9613, 0x7007, 0x0000,
++	0x0804, 0x1dec, 0x00f6, 0x7004, 0x2078, 0x080c, 0x56c3, 0x0118,
++	0x7820, 0xc0f5, 0x7822, 0x00fe, 0x682b, 0xffff, 0x682f, 0xffff,
++	0x6808, 0x8001, 0x680a, 0x697c, 0x791a, 0x6980, 0x791e, 0x0804,
++	0x1dec, 0x7004, 0x00c6, 0x2060, 0x6020, 0x00ce, 0xd0f4, 0x0120,
++	0x6808, 0x8001, 0x680a, 0x04c0, 0x7818, 0x6812, 0x7a1c, 0x6a16,
++	0xd19c, 0x0160, 0xa205, 0x0150, 0x7004, 0xa080, 0x0007, 0x2004,
++	0xa084, 0xfffd, 0xa086, 0x0008, 0x1904, 0x1be2, 0x684c, 0xc0f5,
++	0x684e, 0x7814, 0xa005, 0x1520, 0x7003, 0x0000, 0x6808, 0x8001,
++	0x680a, 0x01a0, 0x7004, 0x2060, 0x601c, 0xa086, 0x000a, 0x11a0,
++	0x0156, 0x20a9, 0x0009, 0x2009, 0xc977, 0x2104, 0xac06, 0x1108,
++	0x200a, 0xa188, 0x0003, 0x1f04, 0x1cad, 0x015e, 0x7004, 0x2060,
++	0x2009, 0x0048, 0x080c, 0x9613, 0x080c, 0x19c0, 0x0804, 0x1dec,
++	0x7818, 0x6812, 0x781c, 0x6816, 0x7814, 0x7908, 0xa18c, 0x0fff,
++	0xa192, 0x0841, 0x1a04, 0x1b60, 0xa188, 0x0007, 0x8114, 0x8214,
++	0x8214, 0xa10a, 0x8104, 0x8004, 0x8004, 0xa20a, 0x810b, 0x810b,
++	0x810b, 0x080c, 0x1f58, 0x7803, 0x0004, 0x780f, 0xffff, 0x7803,
++	0x0001, 0x7804, 0xd0fc, 0x0de8, 0x7803, 0x0002, 0x7803, 0x0004,
++	0x780f, 0x00f6, 0x7004, 0x7007, 0x0000, 0x2060, 0x2009, 0x0048,
++	0x080c, 0x9613, 0x080c, 0x1fae, 0x0838, 0x8001, 0x7002, 0xd194,
++	0x01b0, 0x7804, 0xd0fc, 0x1904, 0x1d91, 0xd09c, 0x0138, 0x7804,
++	0xd0fc, 0x1904, 0x1d91, 0xd09c, 0x1904, 0x1d95, 0x8aff, 0x0904,
++	0x1dec, 0x2009, 0x0001, 0x080c, 0x1a5f, 0x0804, 0x1dec, 0xa184,
++	0x0888, 0x1148, 0x8aff, 0x0904, 0x1dec, 0x2009, 0x0001, 0x080c,
++	0x1a5f, 0x0804, 0x1dec, 0x7818, 0x6812, 0x7a1c, 0x6a16, 0xa205,
++	0x0904, 0x1c96, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc, 0x1904,
++	0x1d73, 0x6834, 0xa084, 0x00ff, 0xa086, 0x0029, 0x1118, 0xd19c,
++	0x1904, 0x1c96, 0x0026, 0x0036, 0x7c20, 0x7d24, 0x7e30, 0x7f34,
++	0x7818, 0x6812, 0x781c, 0x6816, 0x2001, 0x0201, 0x2004, 0xa005,
++	0x0140, 0x7808, 0xd0ec, 0x1128, 0x7803, 0x0009, 0x7003, 0x0004,
++	0x0020, 0x0016, 0x080c, 0x1df0, 0x001e, 0x6b28, 0x6a2c, 0x080c,
++	0x239f, 0x00d6, 0x2805, 0xac68, 0x6034, 0xd09c, 0x1128, 0x6808,
++	0xa31a, 0x680c, 0xa213, 0x0020, 0x6810, 0xa31a, 0x6814, 0xa213,
++	0x00de, 0xd194, 0x0904, 0x1c10, 0x2a00, 0x6826, 0x2c00, 0x681a,
++	0x2800, 0x6832, 0x6808, 0x8001, 0x680a, 0x6b2a, 0x6a2e, 0x003e,
++	0x002e, 0x0804, 0x1cbc, 0x0056, 0x7d0c, 0x080c, 0xc55e, 0x005e,
++	0x080c, 0x1ec3, 0x00f6, 0x7004, 0x2078, 0x080c, 0x56c3, 0x0118,
++	0x7820, 0xc0f5, 0x7822, 0x00fe, 0x682b, 0xffff, 0x682f, 0xffff,
++	0x6808, 0x8001, 0x680a, 0x697c, 0x791a, 0x6980, 0x791e, 0x0804,
++	0x1dec, 0x7804, 0xd09c, 0x0904, 0x1b8b, 0x7c20, 0x7824, 0xa405,
++	0x1904, 0x1b8b, 0x7818, 0x6812, 0x7c1c, 0x6c16, 0xa405, 0x1120,
++	0x7803, 0x0002, 0x0804, 0x1c96, 0x7520, 0x7424, 0x7728, 0x762c,
++	0x7018, 0xa528, 0x701c, 0xa421, 0xa7b9, 0x0000, 0xa6b1, 0x0000,
++	0x7830, 0xa506, 0x1150, 0x7834, 0xa406, 0x1138, 0x7838, 0xa706,
++	0x1120, 0x783c, 0xa606, 0x0904, 0x1b8b, 0x7803, 0x0002, 0x0804,
++	0x1d22, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0xa00d, 0x0180,
++	0x6808, 0x8001, 0x680a, 0x1160, 0x7004, 0x2060, 0x2009, 0x0048,
++	0x601c, 0xa086, 0x0009, 0x1110, 0x080c, 0x1519, 0x080c, 0x9613,
++	0x080c, 0x19c0, 0x0088, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004,
++	0x2060, 0x6010, 0xa005, 0x0da0, 0x2068, 0x6808, 0x8000, 0x680a,
++	0x6c28, 0x6b2c, 0x080c, 0x19d3, 0x001e, 0x000e, 0x012e, 0x0005,
++	0x700c, 0x7110, 0xa106, 0x0904, 0x1e96, 0x7004, 0x0016, 0x210c,
++	0xa106, 0x001e, 0x0904, 0x1e96, 0x00d6, 0x00c6, 0x216c, 0x2d00,
++	0xa005, 0x0904, 0x1e94, 0x681c, 0xa086, 0x0008, 0x0904, 0x1e94,
++	0x6820, 0xd0d4, 0x1904, 0x1e94, 0x6810, 0x2068, 0x080c, 0x7684,
++	0x0904, 0x1e94, 0x6850, 0xd0fc, 0x05a8, 0x8108, 0x2104, 0x6b2c,
++	0xa306, 0x1904, 0x1e94, 0x8108, 0x2104, 0x6a28, 0xa206, 0x1904,
++	0x1e94, 0x6850, 0xc0fc, 0xc0f5, 0x6852, 0x686c, 0x7822, 0x701a,
++	0x6870, 0x7826, 0x701e, 0x681c, 0x7832, 0x7022, 0x6820, 0x7836,
++	0x7026, 0x6818, 0x2060, 0x6034, 0xd09c, 0x0168, 0x6830, 0x2005,
++	0x00d6, 0xac68, 0x6808, 0x783a, 0x702a, 0x680c, 0x783e, 0x702e,
++	0x00de, 0x0804, 0x1e8e, 0xa006, 0x783a, 0x783e, 0x702a, 0x702e,
++	0x0804, 0x1e8e, 0x8108, 0x2104, 0xa005, 0x1904, 0x1e94, 0x6b2c,
++	0xa306, 0x1904, 0x1e94, 0x8108, 0x2104, 0xa005, 0x15e8, 0x6a28,
++	0xa206, 0x15d0, 0x6850, 0xc0f5, 0x6852, 0x6830, 0x2005, 0x6918,
++	0xa160, 0xa180, 0x000d, 0x2004, 0xd09c, 0x11a0, 0x6008, 0x7822,
++	0x701a, 0x686e, 0x600c, 0x7826, 0x701e, 0x6872, 0x6000, 0x7832,
++	0x7022, 0x6004, 0x7836, 0x7026, 0xa006, 0x783a, 0x783e, 0x702a,
++	0x702e, 0x00a0, 0x6010, 0x7822, 0x701a, 0x686e, 0x6014, 0x7826,
++	0x701e, 0x6872, 0x6000, 0x7832, 0x7022, 0x6004, 0x7836, 0x7026,
++	0x6008, 0x783a, 0x702a, 0x600c, 0x783e, 0x702e, 0x6810, 0x781a,
++	0x6814, 0x781e, 0x7803, 0x0011, 0x00ce, 0x00de, 0x0005, 0x2011,
++	0x0201, 0x2009, 0x003c, 0x2204, 0xa005, 0x1118, 0x8109, 0x1dd8,
++	0x0005, 0x0005, 0x0ca1, 0x0118, 0x780c, 0xd0a4, 0x0120, 0x00d9,
++	0xa085, 0x0001, 0x0010, 0x080c, 0x1fae, 0x0005, 0x0126, 0x2091,
++	0x2200, 0x7000, 0xa086, 0x0003, 0x1160, 0x700c, 0x7110, 0xa106,
++	0x0140, 0x080c, 0x2b06, 0x20e1, 0x9028, 0x700f, 0xc977, 0x7013,
++	0xc977, 0x012e, 0x0005, 0x00c6, 0x080c, 0x5f22, 0x11b8, 0x2001,
++	0x0160, 0x2003, 0x0000, 0x2001, 0x0138, 0x2003, 0x0000, 0x2011,
++	0x00c8, 0xe000, 0xe000, 0x8211, 0x1de0, 0x0481, 0x0066, 0x2031,
++	0x0000, 0x080c, 0x5fa4, 0x006e, 0x00ce, 0x0005, 0x080c, 0x1f2d,
++	0x080c, 0x2b06, 0x20e1, 0x9028, 0x700c, 0x7110, 0xa106, 0x0190,
++	0x2104, 0xa005, 0x0130, 0x2060, 0x6010, 0x2060, 0x6008, 0x8001,
++	0x600a, 0xa188, 0x0003, 0xa182, 0xc992, 0x0210, 0x2009, 0xc977,
++	0x7112, 0x0c50, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0160,
++	0x2502, 0x2001, 0x0138, 0x2202, 0x00ce, 0x0005, 0x080c, 0x2b06,
++	0x20e1, 0x9028, 0x2001, 0x015d, 0x2003, 0x0000, 0x00e6, 0x00c6,
++	0x0016, 0x2071, 0xc96a, 0x700c, 0x7110, 0xa106, 0x0190, 0x2104,
++	0xa005, 0x0130, 0x2060, 0x6010, 0x2060, 0x6008, 0x8001, 0x600a,
++	0xa188, 0x0003, 0xa182, 0xc992, 0x0210, 0x2009, 0xc977, 0x7112,
++	0x0c50, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x2001, 0x0138, 0x2014,
++	0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003, 0x0000, 0x080c,
++	0x5f22, 0x1148, 0x2021, 0x0002, 0x1d04, 0x1f3c, 0x2091, 0x6000,
++	0x8421, 0x1dd0, 0x0005, 0x2021, 0xb015, 0x2001, 0x0141, 0x201c,
++	0xd3dc, 0x1168, 0x2001, 0x0109, 0x201c, 0xa39c, 0x0048, 0x1138,
++	0x2001, 0x0111, 0x201c, 0x83ff, 0x1110, 0x8421, 0x1d70, 0x0005,
++	0x00e6, 0x2071, 0x0200, 0x7808, 0xa084, 0xf000, 0xa10d, 0x0869,
++	0x2001, 0x0105, 0x2004, 0xa084, 0x0003, 0x1130, 0x2001, 0xc992,
++	0x2004, 0xa086, 0x0000, 0x0548, 0xa026, 0x2019, 0xf000, 0x8319,
++	0x1148, 0x2001, 0x012b, 0x2003, 0x95f5, 0x2001, 0x0129, 0x2003,
++	0x95f5, 0x00d8, 0x2001, 0x0105, 0x2004, 0xa084, 0x0003, 0x1130,
++	0x2001, 0xc992, 0x2004, 0xa086, 0x0000, 0x0178, 0x2001, 0x0132,
++	0x2004, 0xa436, 0x0110, 0x2020, 0x0c00, 0x2001, 0x0021, 0x2004,
++	0xd0fc, 0x09e8, 0x080c, 0x222c, 0x08c0, 0x20e1, 0x7000, 0x7324,
++	0x7420, 0x7028, 0x7028, 0x7426, 0x7037, 0x0001, 0x810f, 0x712e,
++	0x702f, 0x0100, 0x7037, 0x0008, 0x7326, 0x7422, 0x2001, 0x0160,
++	0x2502, 0x2001, 0x0138, 0x2202, 0x00ee, 0x0005, 0x0026, 0x2001,
++	0x015d, 0x2003, 0x0000, 0x7908, 0xa18c, 0x0fff, 0xa182, 0x0ffd,
++	0x0210, 0x2009, 0x0000, 0xa190, 0x0007, 0xa294, 0x1ff8, 0x8214,
++	0x8214, 0x8214, 0x2001, 0x020a, 0x82ff, 0x0140, 0x20e1, 0x6000,
++	0x200c, 0x200c, 0x200c, 0x200c, 0x8211, 0x1dd0, 0x20e1, 0x7000,
++	0x200c, 0x200c, 0x7003, 0x0000, 0x20e1, 0x6000, 0x2001, 0x0208,
++	0x200c, 0x2001, 0x0209, 0x2004, 0xa106, 0x0158, 0x080c, 0x1e97,
++	0x0130, 0x7908, 0xd1ec, 0x1128, 0x790c, 0xd1a4, 0x0960, 0x080c,
++	0x1ec3, 0xa006, 0x002e, 0x0005, 0x00f6, 0x00e6, 0x0016, 0x0026,
++	0x2071, 0xc96a, 0x2079, 0x0030, 0x2011, 0x0050, 0x7000, 0xa086,
++	0x0000, 0x01a8, 0x8211, 0x0188, 0x2001, 0x0005, 0x2004, 0xd08c,
++	0x0dc8, 0x7904, 0xa18c, 0x0780, 0x0016, 0x080c, 0x1b83, 0x001e,
++	0x81ff, 0x1118, 0x2011, 0x0050, 0x0c48, 0xa085, 0x0001, 0x002e,
++	0x001e, 0x00ee, 0x00fe, 0x0005, 0x7803, 0x0004, 0x2009, 0x0064,
++	0x7804, 0xd0ac, 0x0904, 0x2060, 0x8109, 0x1dd0, 0x2009, 0x0100,
++	0x210c, 0xa18a, 0x0003, 0x0a0c, 0x1519, 0x080c, 0x2333, 0x00e6,
++	0x00f6, 0x2071, 0xc959, 0x2079, 0x0010, 0x7004, 0xa086, 0x0000,
++	0x0538, 0x7800, 0x0006, 0x7820, 0x0006, 0x7830, 0x0006, 0x7834,
++	0x0006, 0x7838, 0x0006, 0x783c, 0x0006, 0x7803, 0x0004, 0xe000,
++	0xe000, 0x2079, 0x0030, 0x7804, 0xd0ac, 0x190c, 0x1519, 0x2079,
++	0x0010, 0x000e, 0x783e, 0x000e, 0x783a, 0x000e, 0x7836, 0x000e,
++	0x7832, 0x000e, 0x7822, 0x000e, 0x7802, 0x00fe, 0x00ee, 0x0030,
++	0x00fe, 0x00ee, 0x7804, 0xd0ac, 0x190c, 0x1519, 0x080c, 0x7f6e,
++	0x0005, 0x00e6, 0x2071, 0xc992, 0x7003, 0x0000, 0x00ee, 0x0005,
++	0x00d6, 0xa280, 0x0004, 0x206c, 0x694c, 0xd1dc, 0x1904, 0x20ed,
++	0x6934, 0xa184, 0x0007, 0x0002, 0x207c, 0x20d8, 0x207c, 0x207e,
++	0x207c, 0x20bf, 0x209e, 0x208d, 0x080c, 0x1519, 0x2100, 0xa084,
++	0x00ff, 0xa086, 0x0013, 0x0904, 0x20d8, 0x2100, 0xa084, 0x00ff,
++	0xa086, 0x001b, 0x0904, 0x20d8, 0x0c78, 0x684c, 0xd0b4, 0x0904,
++	0x21e9, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812, 0x687c,
++	0x680a, 0x6880, 0x680e, 0x6958, 0x0804, 0x20e0, 0x6834, 0xa084,
++	0x00ff, 0xa086, 0x001e, 0x19c0, 0x684c, 0xd0b4, 0x0904, 0x21e9,
++	0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812, 0x687c, 0x680a,
++	0x6880, 0x680e, 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084,
++	0x000f, 0xa080, 0x23c7, 0x2005, 0x6832, 0x6958, 0x0450, 0xa18c,
++	0x00ff, 0xa186, 0x0015, 0x1548, 0x684c, 0xd0b4, 0x0904, 0x21e9,
++	0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080,
++	0x23c7, 0x2005, 0x6832, 0x6958, 0xa006, 0x682e, 0x682a, 0x0088,
++	0x684c, 0xd0b4, 0x0904, 0x1b5e, 0x6958, 0xa006, 0x682e, 0x682a,
++	0x2d00, 0x681a, 0x6834, 0xa084, 0x000f, 0xa080, 0x23c7, 0x2005,
++	0x6832, 0x6926, 0x684c, 0xc0dd, 0x684e, 0x00de, 0x0005, 0x00f6,
++	0x2079, 0x0020, 0x7804, 0xd0fc, 0x190c, 0x222c, 0x00e6, 0x00d6,
++	0x2071, 0xc992, 0x7000, 0xa005, 0x1904, 0x2155, 0x00c6, 0x7206,
++	0xa280, 0x0004, 0x205c, 0x7004, 0x2068, 0x7803, 0x0004, 0x6818,
++	0x00d6, 0x2068, 0x686c, 0x7812, 0x6890, 0x00f6, 0x20e1, 0x9040,
++	0x2079, 0x0200, 0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x00fe,
++	0x00de, 0x2b68, 0x6824, 0x2050, 0x6818, 0x2060, 0x6830, 0x2040,
++	0x6034, 0xa0cc, 0x000f, 0x6908, 0x791a, 0x7116, 0x680c, 0x781e,
++	0x701a, 0xa006, 0x700e, 0x7012, 0x7004, 0x692c, 0x6814, 0xa106,
++	0x1120, 0x6928, 0x6810, 0xa106, 0x0158, 0x0036, 0x0046, 0x6b14,
++	0x6c10, 0x080c, 0x241b, 0x004e, 0x003e, 0x0110, 0x00ce, 0x00a8,
++	0x8aff, 0x1120, 0x00ce, 0xa085, 0x0001, 0x0078, 0x0126, 0x2091,
++	0x8000, 0x2079, 0x0020, 0x2009, 0x0001, 0x0059, 0x0118, 0x2009,
++	0x0001, 0x0039, 0x012e, 0x00ce, 0xa006, 0x00de, 0x00ee, 0x00fe,
++	0x0005, 0x0076, 0x0066, 0x0056, 0x0046, 0x0036, 0x0026, 0x8aff,
++	0x0904, 0x21e2, 0x700c, 0x7214, 0xa23a, 0x7010, 0x7218, 0xa203,
++	0x0a04, 0x21e1, 0xa705, 0x0904, 0x21e1, 0xa03e, 0x2730, 0x6850,
++	0xd0fc, 0x11a8, 0x00d6, 0x2805, 0xac68, 0x2900, 0x0002, 0x21b0,
++	0x2195, 0x2195, 0x21b0, 0x21b0, 0x21a9, 0x21b0, 0x2195, 0x21b0,
++	0x219a, 0x219a, 0x21b0, 0x21b0, 0x21b0, 0x21a1, 0x219a, 0xc0fc,
++	0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0xd99c, 0x05c8, 0x00d6,
++	0x2805, 0xac68, 0x6f08, 0x6e0c, 0x0490, 0x6b08, 0x6a0c, 0x6d00,
++	0x6c04, 0x0468, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c,
++	0x0430, 0x00de, 0x00d6, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e,
++	0x1138, 0x00de, 0x080c, 0x2389, 0x1904, 0x215f, 0xa00e, 0x0490,
++	0x2d10, 0x00de, 0x00d6, 0x6834, 0xa084, 0x00ff, 0xa086, 0x0013,
++	0x2268, 0x09d8, 0x2d10, 0x00de, 0x00d6, 0x6834, 0xa084, 0x00ff,
++	0xa086, 0x001b, 0x2268, 0x09b0, 0x00de, 0x080c, 0x1519, 0x00de,
++	0x7b22, 0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000,
++	0x8000, 0x7002, 0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e,
++	0x700c, 0xa300, 0x700e, 0x7010, 0xa201, 0x7012, 0x080c, 0x2389,
++	0x0008, 0xa006, 0x002e, 0x003e, 0x004e, 0x005e, 0x006e, 0x007e,
++	0x0005, 0x080c, 0x1519, 0x0026, 0x2001, 0x0105, 0x2003, 0x0010,
++	0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060,
++	0x00d6, 0x6010, 0x2068, 0x080c, 0xac91, 0x0118, 0x6850, 0xc0bd,
++	0x6852, 0x601c, 0xa086, 0x0006, 0x1180, 0x2061, 0x0100, 0x62c8,
++	0x2001, 0x00fa, 0x8001, 0x1df0, 0x60c8, 0xa206, 0x1dc0, 0x60c4,
++	0x686a, 0x60c8, 0x6866, 0x7004, 0x2060, 0x00de, 0x00c6, 0x080c,
++	0xa961, 0x00ce, 0x2001, 0xc936, 0x2004, 0xac06, 0x1150, 0x20e1,
++	0x9040, 0x080c, 0x90f6, 0x2011, 0x0000, 0x080c, 0x8f18, 0x080c,
++	0x7f6e, 0x002e, 0x0804, 0x22e6, 0x0126, 0x2091, 0x2400, 0x0006,
++	0x0016, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x2079, 0x0020, 0x2071,
++	0xc992, 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184,
++	0x0700, 0x1904, 0x21eb, 0x7000, 0x0002, 0x22e6, 0x2249, 0x22b9,
++	0x22e4, 0x8001, 0x7002, 0xd19c, 0x1170, 0x8aff, 0x05d0, 0x2009,
++	0x0001, 0x080c, 0x2159, 0x0904, 0x22e6, 0x2009, 0x0001, 0x080c,
++	0x2159, 0x0804, 0x22e6, 0x7803, 0x0004, 0xd194, 0x0148, 0x6850,
++	0xc0fc, 0x6852, 0x8aff, 0x11d8, 0x684c, 0xc0f5, 0x684e, 0x00b8,
++	0x0026, 0x0036, 0x6b28, 0x6a2c, 0x7820, 0x686e, 0xa31a, 0x7824,
++	0x6872, 0xa213, 0x7830, 0x681e, 0x7834, 0x6822, 0x6b2a, 0x6a2e,
++	0x003e, 0x002e, 0x080c, 0x239f, 0x6850, 0xc0fd, 0x6852, 0x2a00,
++	0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, 0x0000, 0x0804,
++	0x22e6, 0x00f6, 0x0026, 0x781c, 0x0006, 0x7818, 0x0006, 0x2079,
++	0x0100, 0x7a14, 0xa284, 0x0184, 0xa085, 0x0012, 0x7816, 0x0036,
++	0x2019, 0x1000, 0x8319, 0x090c, 0x1519, 0x7820, 0xd0bc, 0x1dd0,
++	0x003e, 0x79c8, 0x000e, 0xa102, 0x001e, 0x0006, 0x0016, 0x79c4,
++	0x000e, 0xa103, 0x78c6, 0x000e, 0x78ca, 0xa284, 0x0184, 0xa085,
++	0x0012, 0x7816, 0x002e, 0x00fe, 0x7803, 0x0008, 0x7003, 0x0000,
++	0x0468, 0x8001, 0x7002, 0xd194, 0x0168, 0x7804, 0xd0fc, 0x1904,
++	0x223c, 0xd19c, 0x11f8, 0x8aff, 0x0508, 0x2009, 0x0001, 0x080c,
++	0x2159, 0x00e0, 0x0026, 0x0036, 0x6b28, 0x6a2c, 0x080c, 0x239f,
++	0x00d6, 0x2805, 0xac68, 0x6034, 0xd09c, 0x1128, 0x6808, 0xa31a,
++	0x680c, 0xa213, 0x0020, 0x6810, 0xa31a, 0x6814, 0xa213, 0x00de,
++	0x0804, 0x226c, 0x0804, 0x2268, 0x080c, 0x1519, 0x00ce, 0x00de,
++	0x00ee, 0x00fe, 0x001e, 0x000e, 0x012e, 0x0005, 0x00f6, 0x00e6,
++	0x2071, 0xc992, 0x7000, 0xa086, 0x0000, 0x05d0, 0x2079, 0x0020,
++	0x0016, 0x2009, 0x0207, 0x210c, 0xd194, 0x0198, 0x2009, 0x020c,
++	0x210c, 0xa184, 0x0003, 0x0168, 0x080c, 0xc5a7, 0x2001, 0x0133,
++	0x2004, 0xa005, 0x090c, 0x1519, 0x20e1, 0x9040, 0x2001, 0x020c,
++	0x2102, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0xa106,
++	0x1110, 0x20e1, 0x9040, 0x7804, 0xd0fc, 0x09d8, 0x080c, 0x222c,
++	0x7000, 0xa086, 0x0000, 0x19a8, 0x001e, 0x7803, 0x0004, 0x7804,
++	0xd0ac, 0x1de8, 0x20e1, 0x9040, 0x7803, 0x0002, 0x7003, 0x0000,
++	0x00ee, 0x00fe, 0x0005, 0x0026, 0x00c6, 0x00d6, 0x00e6, 0x00f6,
++	0x2071, 0xc992, 0x2079, 0x0020, 0x7000, 0xa086, 0x0000, 0x0540,
++	0x7004, 0x2060, 0x6010, 0x2068, 0x080c, 0xac91, 0x0158, 0x6850,
++	0xc0b5, 0x6852, 0x680c, 0x7a1c, 0xa206, 0x1120, 0x6808, 0x7a18,
++	0xa206, 0x01e0, 0x2001, 0x0105, 0x2003, 0x0010, 0x20e1, 0x9040,
++	0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x080c, 0xa961,
++	0x20e1, 0x9040, 0x080c, 0x90f6, 0x2011, 0x0000, 0x080c, 0x8f18,
++	0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x0005, 0x6810, 0x6a14,
++	0xa205, 0x1d00, 0x684c, 0xc0dc, 0x684e, 0x2c10, 0x080c, 0x2068,
++	0x2001, 0x0105, 0x2003, 0x0010, 0x20e1, 0x9040, 0x7803, 0x0004,
++	0x7003, 0x0000, 0x2069, 0xc927, 0x6833, 0x0000, 0x683f, 0x0000,
++	0x08f8, 0x8840, 0x2805, 0xa005, 0x1170, 0x6004, 0xa005, 0x0168,
++	0x681a, 0x2060, 0x6034, 0xa084, 0x000f, 0xa080, 0x23c7, 0x2045,
++	0x88ff, 0x090c, 0x1519, 0x8a51, 0x0005, 0x2050, 0x0005, 0x8a50,
++	0x8841, 0x2805, 0xa005, 0x1190, 0x2c00, 0xad06, 0x0120, 0x6000,
++	0xa005, 0x1108, 0x2d00, 0x2060, 0x681a, 0x6034, 0xa084, 0x000f,
++	0xa080, 0x23d7, 0x2045, 0x88ff, 0x090c, 0x1519, 0x0005, 0x0000,
++	0x0011, 0x0015, 0x0019, 0x001d, 0x0021, 0x0025, 0x0029, 0x0000,
++	0x000f, 0x0015, 0x001b, 0x0021, 0x0027, 0x0000, 0x0000, 0x0000,
++	0x23bc, 0x23b8, 0x23bc, 0x23bc, 0x23c6, 0x0000, 0x23bc, 0x0000,
++	0x23c3, 0x23c0, 0x23c3, 0x23c3, 0x0000, 0x23c6, 0x23c3, 0x0000,
++	0x23be, 0x23be, 0x0000, 0x23be, 0x23c6, 0x0000, 0x23be, 0x0000,
++	0x23c4, 0x23c4, 0x0000, 0x23c4, 0x0000, 0x23c6, 0x23c4, 0x0136,
++	0x0146, 0x0156, 0x2099, 0xc765, 0x20a1, 0x0018, 0x20a9, 0x0008,
++	0x53a3, 0x7803, 0x0020, 0x0126, 0x2091, 0x8000, 0x7803, 0x0041,
++	0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x700b, 0xc760, 0x012e,
++	0x015e, 0x014e, 0x013e, 0x0005, 0x2099, 0x0014, 0x7803, 0x0040,
++	0x2001, 0xc765, 0x2004, 0x2010, 0x080c, 0x72ad, 0x2009, 0xc699,
++	0x2104, 0xa084, 0xfffc, 0x200a, 0x080c, 0x721f, 0x7007, 0x0000,
++	0x080c, 0x1676, 0x0005, 0x00a6, 0x0096, 0x0086, 0x6b2e, 0x6c2a,
++	0x6858, 0xa055, 0x0904, 0x24ac, 0x2d60, 0x6034, 0xa0cc, 0x000f,
++	0xa9c0, 0x23c7, 0xa986, 0x0007, 0x0130, 0xa986, 0x000e, 0x0118,
++	0xa986, 0x000f, 0x1120, 0x605c, 0xa422, 0x6060, 0xa31b, 0x2805,
++	0xa045, 0x1140, 0x0310, 0x0804, 0x24ac, 0x6004, 0xa065, 0x0904,
++	0x24ac, 0x0c18, 0x2805, 0xa005, 0x01a8, 0xac68, 0xd99c, 0x1128,
++	0x6808, 0xa422, 0x680c, 0xa31b, 0x0020, 0x6810, 0xa422, 0x6814,
++	0xa31b, 0x0620, 0x2300, 0xa405, 0x0150, 0x8a51, 0x0904, 0x24ac,
++	0x8840, 0x0c40, 0x6004, 0xa065, 0x0904, 0x24ac, 0x0830, 0x8a51,
++	0x0904, 0x24ac, 0x8840, 0x2805, 0xa005, 0x1158, 0x6004, 0xa065,
++	0x0904, 0x24ac, 0x6034, 0xa0cc, 0x000f, 0xa9c0, 0x23c7, 0x2805,
++	0x2040, 0x2b68, 0x6850, 0xc0fc, 0x6852, 0x0458, 0x8422, 0x8420,
++	0x831a, 0xa399, 0x0000, 0x00d6, 0x2b68, 0x6c6e, 0x6b72, 0x00de,
++	0xd99c, 0x1168, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b,
++	0x0a0c, 0x1519, 0x6800, 0xa420, 0x6804, 0xa319, 0x0060, 0x6910,
++	0x2400, 0xa122, 0x6914, 0x2300, 0xa11b, 0x0a0c, 0x1519, 0x6800,
++	0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e, 0x6b22, 0x6850, 0xc0fd,
++	0x6852, 0x2c00, 0x681a, 0x2800, 0x6832, 0x2a00, 0x6826, 0x000e,
++	0x000e, 0x000e, 0xa006, 0x0028, 0x008e, 0x009e, 0x00ae, 0xa085,
++	0x0001, 0x0005, 0x2001, 0x0005, 0x2004, 0xa084, 0x0007, 0x0002,
++	0x24c0, 0x24c1, 0x24c4, 0x24c7, 0x24cc, 0x24cf, 0x24d4, 0x24d9,
++	0x0005, 0x080c, 0x222c, 0x0005, 0x080c, 0x1b83, 0x0005, 0x080c,
++	0x1b83, 0x080c, 0x222c, 0x0005, 0x080c, 0x1729, 0x0005, 0x080c,
++	0x222c, 0x080c, 0x1729, 0x0005, 0x080c, 0x1b83, 0x080c, 0x1729,
++	0x0005, 0x080c, 0x1b83, 0x080c, 0x222c, 0x080c, 0x1729, 0x0005,
++	0x0006, 0x0016, 0x0156, 0x20a9, 0x0009, 0x2009, 0xc977, 0x2104,
++	0xac06, 0x1108, 0x200a, 0xa188, 0x0003, 0x1f04, 0x24e7, 0x015e,
++	0x001e, 0x000e, 0x0005, 0x00e6, 0x00d6, 0x2071, 0xc96a, 0x700c,
++	0x7110, 0xa106, 0x01b8, 0x2104, 0xa005, 0x0138, 0xa080, 0x0004,
++	0x2004, 0x2068, 0x080c, 0x7684, 0x0158, 0xa188, 0x0003, 0xa182,
++	0xc992, 0x0210, 0x2009, 0xc977, 0x700c, 0xa106, 0x1d60, 0x0010,
++	0xa085, 0x0001, 0x00de, 0x00ee, 0x0005, 0x0126, 0x2091, 0x2600,
++	0x2079, 0x0200, 0x2071, 0xcc80, 0x2069, 0xc600, 0x080c, 0x260b,
++	0x080c, 0x25fb, 0x2009, 0x0004, 0x7912, 0x7817, 0x0004, 0x080c,
++	0x29a2, 0x781b, 0x0002, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a9,
++	0x0080, 0x782f, 0x0000, 0x1f04, 0x2531, 0x20e1, 0x9080, 0x783b,
++	0x001f, 0x20e1, 0x8700, 0x012e, 0x0005, 0x0126, 0x2091, 0x2600,
++	0x781c, 0xd0a4, 0x190c, 0x25f8, 0xa084, 0x0007, 0x0002, 0x2561,
++	0x254f, 0x2552, 0x2555, 0x255a, 0x255c, 0x255e, 0x2560, 0x080c,
++	0x68c9, 0x0078, 0x080c, 0x6916, 0x0060, 0x080c, 0x68c9, 0x080c,
++	0x6916, 0x0038, 0x0041, 0x0028, 0x0031, 0x0018, 0x0021, 0x0008,
++	0x0011, 0x012e, 0x0005, 0x0006, 0x0016, 0x0026, 0x080c, 0xc5a7,
++	0x7930, 0xa184, 0x0003, 0x01b0, 0x2001, 0xc936, 0x2004, 0xa005,
++	0x0170, 0x2001, 0x0133, 0x2004, 0xa005, 0x090c, 0x1519, 0x00c6,
++	0x2001, 0xc936, 0x2064, 0x080c, 0xa961, 0x00ce, 0x04b8, 0x20e1,
++	0x9040, 0x04a0, 0xa184, 0x0030, 0x01e0, 0x6a00, 0xa286, 0x0003,
++	0x1108, 0x00a0, 0x080c, 0x5f22, 0x1178, 0x2001, 0xc8e6, 0x2003,
++	0x0001, 0x2001, 0xc600, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c,
++	0x5f66, 0x080c, 0x5e5a, 0x0010, 0x080c, 0x4e5b, 0x080c, 0x25fb,
++	0x00a8, 0xa184, 0x00c0, 0x0168, 0x00e6, 0x0036, 0x0046, 0x0056,
++	0x2071, 0xc96a, 0x080c, 0x1ec3, 0x005e, 0x004e, 0x003e, 0x00ee,
++	0x0028, 0xa184, 0x0300, 0x0110, 0x20e1, 0x9020, 0x7932, 0x002e,
++	0x001e, 0x000e, 0x0005, 0x0016, 0x00e6, 0x00f6, 0x2071, 0xc600,
++	0x7128, 0x2001, 0xc8d8, 0x2102, 0x2001, 0xc8e0, 0x2102, 0xa182,
++	0x0211, 0x1218, 0x2009, 0x0008, 0x0400, 0xa182, 0x0259, 0x1218,
++	0x2009, 0x0007, 0x00d0, 0xa182, 0x02c1, 0x1218, 0x2009, 0x0006,
++	0x00a0, 0xa182, 0x0349, 0x1218, 0x2009, 0x0005, 0x0070, 0xa182,
++	0x0421, 0x1218, 0x2009, 0x0004, 0x0040, 0xa182, 0x0581, 0x1218,
++	0x2009, 0x0003, 0x0010, 0x2009, 0x0002, 0x2079, 0x0200, 0x7912,
++	0x7817, 0x0004, 0x080c, 0x29a2, 0x00fe, 0x00ee, 0x001e, 0x0005,
++	0x7938, 0x080c, 0x1519, 0x00e6, 0x0026, 0x2071, 0x0200, 0x20e1,
++	0x1000, 0x7220, 0x7028, 0x7020, 0xa206, 0x0de0, 0x20e1, 0x9010,
++	0x002e, 0x00ee, 0x0005, 0x20e1, 0xa000, 0x7837, 0x0001, 0x782f,
++	0x0000, 0x782f, 0x0000, 0x782f, 0x0000, 0x782f, 0x0000, 0x7837,
++	0x0005, 0x20a9, 0x0210, 0x7830, 0xd0bc, 0x1110, 0x1f04, 0x261b,
++	0x7837, 0x0001, 0x7837, 0x0000, 0xe000, 0xe000, 0x20e1, 0xa000,
++	0x0005, 0x0126, 0x2091, 0x2800, 0x2061, 0x0100, 0x2071, 0xc600,
++	0x6024, 0x6026, 0x6053, 0x0030, 0x080c, 0x29e1, 0x6050, 0xa084,
++	0xfe7f, 0x6052, 0x2009, 0x00ef, 0x6132, 0x6136, 0x080c, 0x29f1,
++	0x60e7, 0x0000, 0x61ea, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043,
++	0x0000, 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, 0x0e9f, 0x601b,
++	0x001e, 0x600f, 0x00ff, 0x2001, 0xc8d4, 0x2003, 0x00ff, 0x602b,
++	0x002f, 0x012e, 0x0005, 0x2001, 0xc632, 0x2003, 0x0000, 0x2001,
++	0xc631, 0x2003, 0x0001, 0x0005, 0x0126, 0x2091, 0x2800, 0x0006,
++	0x0016, 0x0026, 0x6124, 0x0066, 0x2031, 0xc635, 0x2634, 0xa6b4,
++	0x0028, 0x006e, 0x11c0, 0x6020, 0xd0bc, 0x01a8, 0xd1bc, 0x0198,
++	0x783c, 0xa005, 0x0180, 0x00e6, 0x0006, 0x2070, 0x701c, 0xa086,
++	0x0009, 0x000e, 0x00ee, 0x1138, 0x00e6, 0x783c, 0x2070, 0x7008,
++	0xd0fc, 0x00ee, 0x1130, 0xa184, 0x1e2c, 0x1118, 0xa184, 0x0007,
++	0x002a, 0xa195, 0x0004, 0xa284, 0x0007, 0x0002, 0x26b8, 0x269e,
++	0x26a1, 0x26a4, 0x26a9, 0x26ab, 0x26af, 0x26b3, 0x080c, 0x7873,
++	0x00b8, 0x080c, 0x794e, 0x00a0, 0x080c, 0x794e, 0x080c, 0x7873,
++	0x0078, 0x0099, 0x0068, 0x080c, 0x7873, 0x0079, 0x0048, 0x080c,
++	0x794e, 0x0059, 0x0028, 0x080c, 0x794e, 0x080c, 0x7873, 0x0029,
++	0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x6124, 0x6028, 0xd09c,
++	0x0118, 0xd19c, 0x1904, 0x2910, 0x080c, 0x5f22, 0x0578, 0x7000,
++	0xa086, 0x0003, 0x0198, 0x6024, 0xa084, 0x1800, 0x0178, 0x080c,
++	0x5f48, 0x0118, 0x080c, 0x5f34, 0x1148, 0x6027, 0x0020, 0x6043,
++	0x0000, 0x2001, 0xc8e5, 0x2003, 0xaaaa, 0x0458, 0x080c, 0x5f48,
++	0x15d0, 0x6024, 0xa084, 0x1800, 0x1108, 0x04a8, 0x2001, 0xc8e5,
++	0x2003, 0xaaaa, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600,
++	0x2003, 0x0001, 0x080c, 0x5e5a, 0x0804, 0x2910, 0xd1ac, 0x1518,
++	0x6024, 0xd0dc, 0x1170, 0xd0e4, 0x1188, 0xd0d4, 0x11a0, 0xd0cc,
++	0x0130, 0x708c, 0xa086, 0x0028, 0x1110, 0x080c, 0x60b1, 0x0804,
++	0x2910, 0x2001, 0xc8e6, 0x2003, 0x0000, 0x0048, 0x2001, 0xc8e6,
++	0x2003, 0x0002, 0x0020, 0x080c, 0x6024, 0x0804, 0x2910, 0x080c,
++	0x6156, 0x0804, 0x2910, 0x6220, 0xd1bc, 0x0568, 0xd2bc, 0x0558,
++	0x783c, 0xa005, 0x0540, 0x00e6, 0x2070, 0x7008, 0xd0fc, 0x00ee,
++	0x0510, 0x6028, 0xc0bc, 0x602a, 0x0026, 0x0036, 0x6288, 0x638c,
++	0x608b, 0xbc91, 0x608f, 0xffff, 0x6043, 0x0001, 0xe000, 0xe000,
++	0x6027, 0x0080, 0x6017, 0x0000, 0x6043, 0x0000, 0x628a, 0x638e,
++	0x003e, 0x002e, 0x0016, 0x2001, 0xc696, 0x200c, 0xc184, 0x2102,
++	0x001e, 0x0804, 0x2969, 0xd1ac, 0x0904, 0x284c, 0x0036, 0x6328,
++	0xc3bc, 0x632a, 0x003e, 0x080c, 0x5f22, 0x11d8, 0x6027, 0x0020,
++	0x0006, 0x0026, 0x0036, 0x080c, 0x5f3e, 0x1170, 0x2001, 0xc8e6,
++	0x2003, 0x0001, 0x2001, 0xc600, 0x2003, 0x0001, 0x080c, 0x5e5a,
++	0x003e, 0x002e, 0x000e, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c,
++	0x5ef9, 0x0016, 0x0046, 0x00c6, 0x644c, 0xa486, 0xf0f0, 0x1138,
++	0x2061, 0x0100, 0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74ce,
++	0xa48c, 0xff00, 0x7034, 0xd084, 0x0178, 0xa186, 0xf800, 0x1160,
++	0x703c, 0xd084, 0x1148, 0xc085, 0x703e, 0x0036, 0x2418, 0x2011,
++	0x8016, 0x080c, 0x407d, 0x003e, 0xa196, 0xff00, 0x05b8, 0x7054,
++	0xa084, 0x00ff, 0x810f, 0xa116, 0x0588, 0x7130, 0xd184, 0x1570,
++	0x2011, 0xc653, 0x2214, 0xd2ec, 0x0138, 0xc18d, 0x7132, 0x2011,
++	0xc653, 0x2214, 0xd2ac, 0x1510, 0x6240, 0xa294, 0x0010, 0x0130,
++	0x6248, 0xa294, 0xff00, 0xa296, 0xff00, 0x01c0, 0x7030, 0xd08c,
++	0x0904, 0x2819, 0x7034, 0xd08c, 0x1140, 0x2001, 0xc60c, 0x200c,
++	0xd1ac, 0x1904, 0x2819, 0xc1ad, 0x2102, 0x0036, 0x73cc, 0x2011,
++	0x8013, 0x080c, 0x407d, 0x003e, 0x0804, 0x2819, 0x7034, 0xd08c,
++	0x1140, 0x2001, 0xc60c, 0x200c, 0xd1ac, 0x1904, 0x2819, 0xc1ad,
++	0x2102, 0x0036, 0x73cc, 0x2011, 0x8013, 0x080c, 0x407d, 0x003e,
++	0x7130, 0xc185, 0x7132, 0x2011, 0xc653, 0x220c, 0xd1a4, 0x01d0,
++	0x0016, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x712e, 0x2019,
++	0x000e, 0x080c, 0xc10d, 0xa484, 0x00ff, 0xa080, 0x2f6e, 0x200d,
++	0xa18c, 0xff00, 0x810f, 0x8127, 0xa006, 0x2009, 0x000e, 0x080c,
++	0xc190, 0x001e, 0x0016, 0x2009, 0x0000, 0x2019, 0x0004, 0x080c,
++	0x2e19, 0x001e, 0x0070, 0x0156, 0x20a9, 0x007f, 0x2009, 0x0000,
++	0x080c, 0x533d, 0x1110, 0x080c, 0x4f47, 0x8108, 0x1f04, 0x2810,
++	0x015e, 0x00ce, 0x004e, 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011,
++	0x0002, 0x080c, 0x8f18, 0x080c, 0x8dee, 0x0036, 0x2019, 0x0000,
++	0x080c, 0x8e79, 0x003e, 0x60e3, 0x0000, 0x001e, 0x2001, 0xc600,
++	0x2014, 0xa296, 0x0004, 0x1128, 0xd19c, 0x11b0, 0x6228, 0xc29d,
++	0x622a, 0x2003, 0x0001, 0x2001, 0xc623, 0x2003, 0x0000, 0x6027,
++	0x0020, 0x080c, 0x5f48, 0x1140, 0x0016, 0x2009, 0x07d0, 0x2011,
++	0x5e37, 0x080c, 0x7036, 0x001e, 0xd194, 0x0904, 0x2910, 0x0016,
++	0x6220, 0xd2b4, 0x0904, 0x28b5, 0x080c, 0x7024, 0x080c, 0x8bf5,
++	0x6027, 0x0004, 0x00f6, 0x2019, 0xc930, 0x2304, 0xa07d, 0x0570,
++	0x7804, 0xa086, 0x0032, 0x1550, 0x00d6, 0x00c6, 0x00e6, 0x2069,
++	0x0140, 0x618c, 0x6288, 0x7818, 0x608e, 0x7808, 0x608a, 0x6043,
++	0x0002, 0x2001, 0x0003, 0x8001, 0x1df0, 0x6043, 0x0000, 0x6803,
++	0x1000, 0x6803, 0x0000, 0x618e, 0x628a, 0x080c, 0x7db1, 0x080c,
++	0x7e94, 0x7810, 0x2070, 0x7037, 0x0103, 0x2f60, 0x080c, 0x95e3,
++	0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x0005, 0x00fe, 0x00d6,
++	0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0120, 0x6803, 0x1000,
++	0x6803, 0x0000, 0x00de, 0x00c6, 0x2061, 0xc927, 0x6028, 0xa09a,
++	0x00c8, 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0x8be8, 0x0804,
++	0x290f, 0x2019, 0xc930, 0x2304, 0xa065, 0x0120, 0x2009, 0x0027,
++	0x080c, 0x9613, 0x00ce, 0x0804, 0x290f, 0xd2bc, 0x0904, 0x290f,
++	0x080c, 0x7031, 0x6014, 0xa084, 0x0184, 0xa085, 0x0010, 0x6016,
++	0x6027, 0x0004, 0x00d6, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000,
++	0x0120, 0x6803, 0x1000, 0x6803, 0x0000, 0x00de, 0x00c6, 0x2061,
++	0xc927, 0x6044, 0xa09a, 0x00c8, 0x1620, 0x8000, 0x6046, 0x603c,
++	0x00ce, 0xa005, 0x05a0, 0x2009, 0x07d0, 0x080c, 0x7029, 0xa080,
++	0x0007, 0x2004, 0xa086, 0x0006, 0x1138, 0x6114, 0xa18c, 0x0184,
++	0xa18d, 0x0012, 0x6116, 0x0418, 0xa080, 0x0007, 0x2004, 0xa086,
++	0x0009, 0x0d98, 0x6114, 0xa18c, 0x0184, 0xa18d, 0x0016, 0x6116,
++	0x00b0, 0x0036, 0x2019, 0x0001, 0x080c, 0x8e79, 0x003e, 0x2019,
++	0xc936, 0x2304, 0xa065, 0x0150, 0x2009, 0x004f, 0x601c, 0xa086,
++	0x0009, 0x1110, 0x2009, 0x0105, 0x080c, 0x9613, 0x00ce, 0x001e,
++	0xd19c, 0x0904, 0x2969, 0x7034, 0xd0ac, 0x1560, 0x0016, 0x0156,
++	0x6027, 0x0008, 0x602f, 0x0020, 0x20a9, 0x0006, 0x1d04, 0x291e,
++	0x2091, 0x6000, 0x1f04, 0x291e, 0x602f, 0x0000, 0x6150, 0xa185,
++	0x1400, 0x6052, 0x20a9, 0x0366, 0x1d04, 0x292c, 0x2091, 0x6000,
++	0x6020, 0xd09c, 0x1130, 0x015e, 0x6152, 0x001e, 0x6027, 0x0008,
++	0x0480, 0x080c, 0x2ab1, 0x1f04, 0x292c, 0x015e, 0x6152, 0x001e,
++	0x6027, 0x0008, 0x0016, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003,
++	0x080c, 0x8f0e, 0x2011, 0x0002, 0x080c, 0x8f18, 0x080c, 0x8dee,
++	0x0036, 0x2019, 0x0000, 0x080c, 0x8e79, 0x003e, 0x60e3, 0x0000,
++	0x080c, 0xc586, 0x080c, 0xc5a1, 0xa085, 0x0001, 0x080c, 0x5f66,
++	0x2001, 0xc600, 0x2003, 0x0004, 0x6027, 0x0008, 0x080c, 0x12e1,
++	0x001e, 0xa18c, 0xffd0, 0x6126, 0x0005, 0x0006, 0x0016, 0x0026,
++	0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, 0xc600, 0x71c4,
++	0x70c6, 0xa116, 0x0500, 0x81ff, 0x0128, 0x2011, 0x8011, 0x080c,
++	0x407d, 0x00c8, 0x2011, 0x8012, 0x080c, 0x407d, 0x2001, 0xc672,
++	0x2004, 0xd0fc, 0x1180, 0x0036, 0x00c6, 0x080c, 0x2a3c, 0x080c,
++	0x8dca, 0x2061, 0x0100, 0x2019, 0x0028, 0x2009, 0x0000, 0x080c,
++	0x2e19, 0x00ce, 0x003e, 0x012e, 0x00fe, 0x00ee, 0x002e, 0x001e,
++	0x000e, 0x0005, 0x00c6, 0x00f6, 0x0006, 0x0026, 0x2061, 0x0100,
++	0xa190, 0x29b5, 0x2205, 0x60f2, 0x2011, 0x29c2, 0x2205, 0x60ee,
++	0x002e, 0x000e, 0x00fe, 0x00ce, 0x0005, 0x0840, 0x0840, 0x0840,
++	0x0580, 0x0420, 0x0348, 0x02c0, 0x0258, 0x0210, 0x01a8, 0x01a8,
++	0x01a8, 0x01a8, 0x0140, 0x00f8, 0x00d0, 0x00b0, 0x00a0, 0x2028,
++	0xa18c, 0x00ff, 0x2130, 0xa094, 0xff00, 0x1110, 0x81ff, 0x0118,
++	0x080c, 0x6be0, 0x0038, 0xa080, 0x2f6e, 0x200d, 0xa18c, 0xff00,
++	0x810f, 0xa006, 0x0005, 0xa080, 0x2f6e, 0x200d, 0xa18c, 0x00ff,
++	0x0005, 0x00d6, 0x2069, 0x0140, 0x2001, 0xc615, 0x2003, 0x00ef,
++	0x20a9, 0x0010, 0xa006, 0x6852, 0x6856, 0x1f04, 0x29ec, 0x00de,
++	0x0005, 0x0006, 0x00d6, 0x0026, 0x2069, 0x0140, 0x2001, 0xc615,
++	0x2102, 0x8114, 0x8214, 0x8214, 0x8214, 0x20a9, 0x0010, 0x6853,
++	0x0000, 0xa006, 0x82ff, 0x1128, 0xa184, 0x000f, 0xa080, 0xc5b5,
++	0x2005, 0x6856, 0x8211, 0x1f04, 0x2a01, 0x002e, 0x00de, 0x000e,
++	0x0005, 0x00c6, 0x2061, 0xc600, 0x6030, 0x0110, 0xc09d, 0x0008,
++	0xc09c, 0x6032, 0x00ce, 0x0005, 0x0156, 0x00d6, 0x0026, 0x0016,
++	0x0006, 0x2069, 0x0140, 0x6980, 0xa116, 0x0180, 0xa112, 0x1230,
++	0x8212, 0x8210, 0x22a8, 0x2001, 0x0402, 0x0018, 0x22a8, 0x2001,
++	0x0404, 0x680e, 0x1f04, 0x2a31, 0x680f, 0x0000, 0x000e, 0x001e,
++	0x002e, 0x00de, 0x015e, 0x0005, 0x2001, 0xc653, 0x2004, 0xd0c4,
++	0x0150, 0xd0a4, 0x0140, 0xa006, 0x0046, 0x2020, 0x2009, 0x002e,
++	0x080c, 0xc190, 0x004e, 0x0005, 0x00f6, 0x0016, 0x0026, 0x2079,
++	0x0140, 0x78c4, 0xd0dc, 0x0548, 0xa084, 0x0700, 0xa08e, 0x0300,
++	0x1520, 0x2011, 0x0000, 0x2009, 0x0002, 0x2300, 0xa080, 0x0020,
++	0x2018, 0x2300, 0x080c, 0x783f, 0x2011, 0x0030, 0x2200, 0x8007,
++	0xa085, 0x004c, 0x78c2, 0x2009, 0x0204, 0x210c, 0x2200, 0xa100,
++	0x2009, 0x0138, 0x200a, 0x080c, 0x5f22, 0x1118, 0x2009, 0xc8d6,
++	0x200a, 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8,
++	0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170,
++	0x200c, 0x8000, 0x2014, 0xa184, 0x0003, 0x0110, 0x0804, 0x1b81,
++	0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x0006, 0x2001, 0x0100,
++	0x2004, 0xa082, 0x0005, 0x000e, 0x0268, 0x2001, 0x0170, 0x200c,
++	0xa18c, 0x00ff, 0xa18e, 0x004c, 0x1128, 0x200c, 0xa18c, 0xff00,
++	0x810f, 0x0010, 0x2009, 0x0000, 0x2001, 0x0204, 0x2004, 0xa108,
++	0x0005, 0x0006, 0x0156, 0x00f6, 0x2079, 0x0100, 0x20a9, 0x000a,
++	0x7854, 0xd08c, 0x1110, 0x1f04, 0x2ab8, 0x00fe, 0x015e, 0x000e,
++	0x0005, 0x0016, 0x00c6, 0x0006, 0x2061, 0x0100, 0x6030, 0x0006,
++	0x6048, 0x0006, 0x60e4, 0x0006, 0x60e8, 0x0006, 0x6050, 0x0006,
++	0x60f0, 0x0006, 0x60ec, 0x0006, 0x600c, 0x0006, 0x6004, 0x0006,
++	0x6028, 0x0006, 0x60e0, 0x0006, 0x602f, 0x0100, 0x602f, 0x0000,
++	0xe000, 0xe000, 0xe000, 0xe000, 0x602f, 0x0040, 0x602f, 0x0000,
++	0x000e, 0x60e2, 0x000e, 0x602a, 0x000e, 0x6006, 0x000e, 0x600e,
++	0x000e, 0x60ee, 0x000e, 0x60f2, 0x000e, 0x6052, 0x000e, 0x60ea,
++	0x000e, 0x60e6, 0x000e, 0x604a, 0x000e, 0x6032, 0x6036, 0x2008,
++	0x080c, 0x29f1, 0x000e, 0x00ce, 0x001e, 0x0005, 0x2009, 0x0171,
++	0x2104, 0xd0dc, 0x0140, 0x2009, 0x0170, 0x2104, 0x200b, 0x0080,
++	0xe000, 0xe000, 0x200a, 0x0005, 0x2ba4, 0x2ba8, 0x2bac, 0x2bb2,
++	0x2bb8, 0x2bbe, 0x2bc4, 0x2bcc, 0x2bd4, 0x2bda, 0x2be0, 0x2be8,
++	0x2bf0, 0x2bf8, 0x2c00, 0x2c0a, 0x2c57, 0x2c57, 0x2c57, 0x2c57,
++	0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57,
++	0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c14, 0x2c14, 0x2c14, 0x2c14,
++	0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14,
++	0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c57, 0x2c57, 0x2c57, 0x2c57,
++	0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57,
++	0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c16, 0x2c16, 0x2c1c, 0x2c1c,
++	0x2c23, 0x2c23, 0x2c2a, 0x2c2a, 0x2c33, 0x2c33, 0x2c3a, 0x2c3a,
++	0x2c43, 0x2c43, 0x2c4c, 0x2c4c, 0x2c57, 0x2c57, 0x2c57, 0x2c57,
++	0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57,
++	0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c14, 0x2c14, 0x2c14, 0x2c14,
++	0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14,
++	0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c57, 0x2c57, 0x2c57, 0x2c57,
++	0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57,
++	0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c14, 0x2c14, 0x2c14, 0x2c14,
++	0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14,
++	0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x0106, 0x0006, 0x0804, 0x2c5f,
++	0x0106, 0x0006, 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x2664,
++	0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x2664, 0x0804, 0x2c5f,
++	0x0106, 0x0006, 0x080c, 0x24b2, 0x0804, 0x2c5f, 0x0106, 0x0006,
++	0x080c, 0x24b2, 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x2664,
++	0x080c, 0x24b2, 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x2664,
++	0x080c, 0x24b2, 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x253d,
++	0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x253d, 0x0804, 0x2c5f,
++	0x0106, 0x0006, 0x080c, 0x2664, 0x080c, 0x253d, 0x0804, 0x2c5f,
++	0x0106, 0x0006, 0x080c, 0x2664, 0x080c, 0x253d, 0x0804, 0x2c5f,
++	0x0106, 0x0006, 0x080c, 0x24b2, 0x080c, 0x253d, 0x0804, 0x2c5f,
++	0x0106, 0x0006, 0x080c, 0x24b2, 0x080c, 0x253d, 0x0804, 0x2c5f,
++	0x0106, 0x0006, 0x080c, 0x2664, 0x080c, 0x24b2, 0x080c, 0x253d,
++	0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x2664, 0x080c, 0x24b2,
++	0x080c, 0x253d, 0x0804, 0x2c5f, 0xe000, 0x0cf0, 0x0106, 0x0006,
++	0x080c, 0x2a80, 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x2a80,
++	0x080c, 0x2664, 0x04e0, 0x0106, 0x0006, 0x080c, 0x2a80, 0x080c,
++	0x24b2, 0x04a8, 0x0106, 0x0006, 0x080c, 0x2a80, 0x080c, 0x2664,
++	0x080c, 0x24b2, 0x0460, 0x0106, 0x0006, 0x080c, 0x2a80, 0x080c,
++	0x253d, 0x0428, 0x0106, 0x0006, 0x080c, 0x2a80, 0x080c, 0x2664,
++	0x080c, 0x253d, 0x00e0, 0x0106, 0x0006, 0x080c, 0x2a80, 0x080c,
++	0x24b2, 0x080c, 0x253d, 0x0098, 0x0106, 0x0006, 0x080c, 0x2a80,
++	0x080c, 0x2664, 0x080c, 0x24b2, 0x080c, 0x253d, 0x0040, 0x20d1,
++	0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000, 0x080c, 0x1519, 0x000e,
++	0x010e, 0x000d, 0x00c6, 0x0026, 0x0046, 0x2021, 0x0000, 0x080c,
++	0x570b, 0x1904, 0x2d3f, 0x72d4, 0x2001, 0xc8e5, 0x2004, 0xa005,
++	0x1110, 0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, 0x2d3f,
++	0x080c, 0x2d43, 0x0804, 0x2d3f, 0xd2cc, 0x1904, 0x2d3f, 0x080c,
++	0x5f22, 0x1120, 0x709f, 0xffff, 0x0804, 0x2d3f, 0xd294, 0x0120,
++	0x709f, 0xffff, 0x0804, 0x2d3f, 0x2001, 0xc615, 0x203c, 0x7288,
++	0xd284, 0x0904, 0x2ce1, 0xd28c, 0x1904, 0x2ce1, 0x0036, 0x739c,
++	0xa38e, 0xffff, 0x1110, 0x2019, 0x0001, 0x8314, 0xa2e0, 0xcdc0,
++	0x2c04, 0xa38c, 0x0001, 0x0120, 0xa084, 0xff00, 0x8007, 0x0010,
++	0xa084, 0x00ff, 0xa70e, 0x0560, 0xa08e, 0x0000, 0x0548, 0xa08e,
++	0x00ff, 0x1150, 0x7230, 0xd284, 0x1538, 0x7288, 0xc28d, 0x728a,
++	0x709f, 0xffff, 0x003e, 0x0428, 0x2009, 0x0000, 0x080c, 0x29c7,
++	0x080c, 0x52e1, 0x11b8, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006,
++	0x1150, 0x7030, 0xd08c, 0x0118, 0x6000, 0xd0bc, 0x0120, 0x080c,
++	0x2d56, 0x0140, 0x0028, 0x080c, 0x2e87, 0x080c, 0x2d84, 0x0110,
++	0x8318, 0x0818, 0x739e, 0x0010, 0x709f, 0xffff, 0x003e, 0x0804,
++	0x2d3f, 0xa780, 0x2f6e, 0x203d, 0xa7bc, 0xff00, 0x873f, 0x2041,
++	0x007e, 0x709c, 0xa096, 0xffff, 0x1120, 0x2009, 0x0000, 0x28a8,
++	0x0050, 0xa812, 0x0220, 0x2008, 0xa802, 0x20a8, 0x0020, 0x709f,
++	0xffff, 0x0804, 0x2d3f, 0x2700, 0x0156, 0x0016, 0xa106, 0x05a0,
++	0xc484, 0x080c, 0x533d, 0x0120, 0x080c, 0x52e1, 0x15a8, 0x0008,
++	0xc485, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1130, 0x7030,
++	0xd08c, 0x01e8, 0x6000, 0xd0bc, 0x11d0, 0x7288, 0xd28c, 0x0188,
++	0x6004, 0xa084, 0x00ff, 0xa082, 0x0006, 0x02b0, 0xd484, 0x1118,
++	0x080c, 0x5300, 0x0028, 0x080c, 0x2f14, 0x0170, 0x080c, 0x2f41,
++	0x0058, 0x080c, 0x2e87, 0x080c, 0x2d84, 0x0170, 0x0028, 0x080c,
++	0x2f14, 0x0110, 0x0419, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04,
++	0x2cfb, 0x709f, 0xffff, 0x0018, 0x001e, 0x015e, 0x719e, 0x004e,
++	0x002e, 0x00ce, 0x0005, 0x00c6, 0x0016, 0x709f, 0x0001, 0x2009,
++	0x007e, 0x080c, 0x52e1, 0x1138, 0x080c, 0x2e87, 0x04a9, 0x0118,
++	0x70d4, 0xc0bd, 0x70d6, 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076,
++	0x00d6, 0x00c6, 0x2c68, 0x2001, 0xc657, 0x2004, 0xa084, 0x00ff,
++	0x6842, 0x080c, 0xaf0d, 0x01d8, 0x2d00, 0x601a, 0x080c, 0xb05e,
++	0x601f, 0x0001, 0x2001, 0x0000, 0x080c, 0x527f, 0x2001, 0x0000,
++	0x080c, 0x5291, 0x0126, 0x2091, 0x8000, 0x7098, 0x8000, 0x709a,
++	0x012e, 0x2009, 0x0004, 0x080c, 0x9613, 0xa085, 0x0001, 0x00ce,
++	0x00de, 0x007e, 0x001e, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6,
++	0x2c68, 0x2001, 0xc657, 0x2004, 0xa084, 0x00ff, 0x6842, 0x080c,
++	0xaf0d, 0x0550, 0x2d00, 0x601a, 0x6800, 0xc0c4, 0x6802, 0x68a0,
++	0xa086, 0x007e, 0x0140, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006,
++	0x1110, 0x080c, 0x2e46, 0x080c, 0xb05e, 0x601f, 0x0001, 0x2001,
++	0x0000, 0x080c, 0x527f, 0x2001, 0x0002, 0x080c, 0x5291, 0x0126,
++	0x2091, 0x8000, 0x7098, 0x8000, 0x709a, 0x012e, 0x2009, 0x0002,
++	0x080c, 0x9613, 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e,
++	0x0005, 0x00c6, 0x0026, 0x2009, 0x0080, 0x080c, 0x52e1, 0x1120,
++	0x0031, 0x0110, 0x70db, 0xffff, 0x002e, 0x00ce, 0x0005, 0x0016,
++	0x0076, 0x00d6, 0x00c6, 0x2c68, 0x080c, 0x958d, 0x01e8, 0x2d00,
++	0x601a, 0x080c, 0xb05e, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c,
++	0x527f, 0x2001, 0x0002, 0x080c, 0x5291, 0x0126, 0x2091, 0x8000,
++	0x080c, 0x2e46, 0x70dc, 0x8000, 0x70de, 0x012e, 0x2009, 0x0002,
++	0x080c, 0x9613, 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e,
++	0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2009, 0x007f,
++	0x080c, 0x52e1, 0x1190, 0x2c68, 0x080c, 0x958d, 0x0170, 0x2d00,
++	0x601a, 0x6312, 0x601f, 0x0001, 0x620a, 0x080c, 0xb05e, 0x2009,
++	0x0022, 0x080c, 0x9613, 0xa085, 0x0001, 0x012e, 0x00de, 0x00ce,
++	0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x080c, 0x7b22,
++	0x080c, 0x7abb, 0x080c, 0xa090, 0x2130, 0x81ff, 0x0128, 0x20a9,
++	0x007e, 0x2009, 0x0000, 0x0020, 0x20a9, 0x007f, 0x2009, 0x0000,
++	0x0016, 0x080c, 0x533d, 0x1120, 0x080c, 0x553e, 0x080c, 0x4f47,
++	0x001e, 0x8108, 0x1f04, 0x2e30, 0x86ff, 0x1110, 0x080c, 0x11f4,
++	0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6,
++	0x0036, 0x0026, 0x0016, 0x6218, 0x2270, 0x72a0, 0x0026, 0x2019,
++	0x0029, 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a0e,
++	0x2c08, 0x080c, 0xbef7, 0x007e, 0x001e, 0x2e60, 0x080c, 0x553e,
++	0x6210, 0x6314, 0x080c, 0x4f47, 0x6212, 0x6316, 0x001e, 0x002e,
++	0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x6018, 0xa080,
++	0x0028, 0x2004, 0xa086, 0x0080, 0x0150, 0x2071, 0xc600, 0x7098,
++	0xa005, 0x0110, 0x8001, 0x709a, 0x000e, 0x00ee, 0x0005, 0x2071,
++	0xc600, 0x70dc, 0xa005, 0x0dc0, 0x8001, 0x70de, 0x0ca8, 0x6000,
++	0xc08c, 0x6002, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0036, 0x0026,
++	0x0016, 0x0156, 0x2178, 0x81ff, 0x1118, 0x20a9, 0x0001, 0x0098,
++	0x2001, 0xc653, 0x2004, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0xa006,
++	0x0046, 0x2020, 0x2009, 0x002d, 0x080c, 0xc190, 0x004e, 0x20a9,
++	0x00ff, 0x2011, 0x0000, 0x0026, 0xa28e, 0x007e, 0x0904, 0x2ef3,
++	0xa28e, 0x007f, 0x0904, 0x2ef3, 0xa28e, 0x0080, 0x05e0, 0xa288,
++	0xc77b, 0x210c, 0x81ff, 0x05b8, 0x8fff, 0x1148, 0x2001, 0xc905,
++	0x0006, 0x2003, 0x0001, 0x04d9, 0x000e, 0x2003, 0x0000, 0x00c6,
++	0x2160, 0x2001, 0x0001, 0x080c, 0x5715, 0x00ce, 0x2019, 0x0029,
++	0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a0e, 0x00c6,
++	0x0026, 0x2160, 0x6204, 0xa294, 0x00ff, 0xa286, 0x0006, 0x1118,
++	0x6007, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007, 0xa215, 0x6206,
++	0x002e, 0x00ce, 0x0016, 0x2c08, 0x080c, 0xbef7, 0x001e, 0x007e,
++	0x2160, 0x080c, 0x553e, 0x002e, 0x8210, 0x1f04, 0x2eab, 0x015e,
++	0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046,
++	0x0026, 0x0016, 0x2001, 0xc653, 0x2004, 0xd0c4, 0x0148, 0xd0a4,
++	0x0138, 0xa006, 0x2220, 0x8427, 0x2009, 0x0029, 0x080c, 0xc190,
++	0x001e, 0x002e, 0x004e, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6,
++	0x7288, 0x82ff, 0x01f8, 0x2011, 0xc653, 0x2214, 0xd2ac, 0x11d0,
++	0x2100, 0x080c, 0x29db, 0x81ff, 0x01b8, 0x2019, 0x0001, 0x8314,
++	0xa2e0, 0xcdc0, 0x2c04, 0xd384, 0x0120, 0xa084, 0xff00, 0x8007,
++	0x0010, 0xa084, 0x00ff, 0xa116, 0x0138, 0xa096, 0x00ff, 0x0110,
++	0x8318, 0x0c68, 0xa085, 0x0001, 0x00ce, 0x003e, 0x002e, 0x001e,
++	0x0005, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0016, 0x0026,
++	0x0036, 0x2110, 0x0026, 0x2019, 0x0029, 0x080c, 0x9132, 0x002e,
++	0x080c, 0xc4e4, 0x003e, 0x002e, 0x001e, 0xa180, 0xc77b, 0x2004,
++	0xa065, 0x0158, 0x0016, 0x00c6, 0x2061, 0xca3c, 0x001e, 0x611a,
++	0x080c, 0x2e46, 0x001e, 0x080c, 0x5300, 0x012e, 0x00ce, 0x001e,
++	0x0005, 0x2001, 0xc635, 0x2004, 0xd0cc, 0x0005, 0x7eef, 0x7de8,
++	0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9, 0x80d6,
++	0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd, 0x80cc,
++	0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5, 0x76c3, 0x80bc,
++	0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3, 0x80b2, 0x80b1,
++	0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9, 0x80a7, 0x6da6,
++	0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b, 0x8098, 0x6797,
++	0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081, 0x8080, 0x617c,
++	0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073, 0x8072, 0x8071,
++	0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69, 0x8067, 0x5a66,
++	0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056, 0x8055, 0x5454,
++	0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c, 0x804b, 0x4e4a,
++	0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c, 0x803a, 0x8039,
++	0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831, 0x802e, 0x472d,
++	0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026, 0x8025, 0x4123,
++	0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017, 0x8010, 0x3b0f,
++	0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000, 0x3800, 0x3700,
++	0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000, 0x3400, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300, 0x3200, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100, 0x3000, 0x8000,
++	0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00, 0x8000, 0x8000,
++	0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800, 0x8000, 0x2700,
++	0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000, 0x8000, 0x2100,
++	0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000, 0x8000, 0x1b00,
++	0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++	0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500, 0x8000, 0x1400,
++	0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000, 0x8000, 0x0e00,
++	0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000, 0x8000, 0x0800,
++	0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000, 0x0500, 0x0400,
++	0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000, 0x0100, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x8000, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x2071, 0xc6a2,
++	0x7003, 0x0002, 0xa006, 0x7012, 0x7016, 0x703a, 0x703e, 0x7033,
++	0xc6b2, 0x7037, 0xc6b2, 0x7007, 0x0001, 0x2061, 0xc6f2, 0x6003,
++	0x0002, 0x0005, 0x1004, 0x3094, 0x0e04, 0x3094, 0x2071, 0xc6a2,
++	0x2b78, 0x7818, 0xd084, 0x1140, 0x2a60, 0x7820, 0xa08e, 0x0069,
++	0x1904, 0x3179, 0x0804, 0x3112, 0x0005, 0x2071, 0xc6a2, 0x7004,
++	0x0002, 0x309d, 0x309e, 0x30a7, 0x30b8, 0x0005, 0x1004, 0x30a6,
++	0x0e04, 0x30a6, 0x2b78, 0x7818, 0xd084, 0x01e8, 0x0005, 0x2b78,
++	0x2061, 0xc6f2, 0x6008, 0xa08e, 0x0100, 0x0128, 0xa086, 0x0200,
++	0x0904, 0x3173, 0x0005, 0x7014, 0x2068, 0x2a60, 0x7018, 0x0807,
++	0x7010, 0x2068, 0x6834, 0xa086, 0x0103, 0x0108, 0x0005, 0x2a60,
++	0x2b78, 0x7018, 0x0807, 0x2a60, 0x7820, 0xa08a, 0x0040, 0x1210,
++	0x61c4, 0x0042, 0x2100, 0xa08a, 0x003f, 0x1a04, 0x3170, 0x61c4,
++	0x0804, 0x3112, 0x3154, 0x317f, 0x3187, 0x318b, 0x3193, 0x3199,
++	0x319d, 0x31a9, 0x31ac, 0x31b6, 0x31b9, 0x3170, 0x3170, 0x3170,
++	0x31bc, 0x3170, 0x31cb, 0x31e2, 0x31f9, 0x3273, 0x3278, 0x32a1,
++	0x32f2, 0x3303, 0x3322, 0x335a, 0x3364, 0x3371, 0x3384, 0x33a5,
++	0x33ae, 0x33e4, 0x33ea, 0x3170, 0x3413, 0x3170, 0x3170, 0x3170,
++	0x3170, 0x3170, 0x341a, 0x3424, 0x3170, 0x3170, 0x3170, 0x3170,
++	0x3170, 0x3170, 0x3170, 0x3170, 0x342c, 0x3170, 0x3170, 0x3170,
++	0x3170, 0x3170, 0x343e, 0x3448, 0x3170, 0x3170, 0x3170, 0x3170,
++	0x3170, 0x3170, 0x0002, 0x3472, 0x34c6, 0x3521, 0x353b, 0x3170,
++	0x356c, 0x399f, 0x456f, 0x3170, 0x3170, 0x3170, 0x3170, 0x3170,
++	0x3170, 0x3170, 0x3170, 0x31b6, 0x31b9, 0x39a1, 0x3170, 0x39ae,
++	0x4608, 0x4663, 0x46c7, 0x3170, 0x472a, 0x4754, 0x4773, 0x47a5,
++	0x3170, 0x3170, 0x3170, 0x39b2, 0x3b57, 0x3b71, 0x3b8f, 0x3bf0,
++	0x3c50, 0x3c5b, 0x3c93, 0x3ca2, 0x3cb1, 0x3cb4, 0x3cd7, 0x3d21,
++	0x3d97, 0x3da4, 0x3ea5, 0x3fd4, 0x3ffd, 0x40fb, 0x411d, 0x4129,
++	0x4162, 0x4232, 0x428c, 0x4352, 0x43a4, 0x4404, 0x4419, 0x4434,
++	0x44a6, 0x4558, 0x713c, 0x0000, 0x2021, 0x4000, 0x080c, 0x405a,
++	0x0126, 0x2091, 0x8000, 0x0e04, 0x3160, 0x7818, 0xd084, 0x0110,
++	0x012e, 0x0cb0, 0x7c22, 0x7926, 0x7a2a, 0x7b2e, 0x781b, 0x0001,
++	0x2091, 0x4080, 0x7007, 0x0001, 0x2091, 0x5000, 0x012e, 0x0005,
++	0x2021, 0x4001, 0x0c18, 0x2021, 0x4002, 0x0c00, 0x2021, 0x4003,
++	0x08e8, 0x2021, 0x4005, 0x08d0, 0x2021, 0x4006, 0x08b8, 0xa02e,
++	0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0804, 0x4067, 0x7823,
++	0x0004, 0x7824, 0x0807, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824,
++	0x7930, 0x0804, 0x406a, 0x7924, 0x7828, 0x2114, 0x200a, 0x0804,
++	0x3154, 0x7924, 0x2114, 0x0804, 0x3154, 0x2099, 0x0009, 0x20a1,
++	0x0009, 0x20a9, 0x0007, 0x53a3, 0x7924, 0x7a28, 0x7b2c, 0x0804,
++	0x3154, 0x7824, 0x2060, 0x0090, 0x2009, 0x0002, 0x2011, 0x0002,
++	0x2019, 0x0005, 0x783b, 0x0037, 0x0804, 0x3154, 0x7d38, 0x7c3c,
++	0x0840, 0x7d38, 0x7c3c, 0x0888, 0x2061, 0x1000, 0xe10c, 0xa006,
++	0x2c15, 0xa200, 0x8c60, 0x8109, 0x1dd8, 0x2010, 0xa005, 0x0904,
++	0x3154, 0x0804, 0x3176, 0x2069, 0xc652, 0x7824, 0x7930, 0xa11a,
++	0x1a04, 0x317c, 0x8019, 0x0904, 0x317c, 0x684a, 0x6942, 0x782c,
++	0x6852, 0x7828, 0x6856, 0xa006, 0x685a, 0x685e, 0x080c, 0x61f8,
++	0x0804, 0x3154, 0x2069, 0xc652, 0x7824, 0x7934, 0xa11a, 0x1a04,
++	0x317c, 0x8019, 0x0904, 0x317c, 0x684e, 0x6946, 0x782c, 0x6862,
++	0x7828, 0x6866, 0xa006, 0x686a, 0x686e, 0x080c, 0x57d7, 0x0804,
++	0x3154, 0xa02e, 0x2520, 0x81ff, 0x1904, 0x3179, 0x7924, 0x7b28,
++	0x7a2c, 0x20a9, 0x0005, 0x20a1, 0xc6a9, 0x41a1, 0x080c, 0x4026,
++	0x0904, 0x3179, 0x2009, 0x0020, 0x080c, 0x4067, 0x701b, 0x3211,
++	0x0005, 0x6834, 0x2008, 0xa084, 0x00ff, 0xa096, 0x0011, 0x0138,
++	0xa096, 0x0019, 0x0120, 0xa096, 0x0015, 0x1904, 0x3179, 0x810f,
++	0xa18c, 0x00ff, 0x0904, 0x3179, 0x710e, 0x700c, 0x8001, 0x0528,
++	0x700e, 0x080c, 0x4026, 0x0904, 0x3179, 0x2009, 0x0020, 0x2061,
++	0xc6f2, 0x6224, 0x6328, 0x642c, 0x6530, 0xa290, 0x0040, 0xa399,
++	0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x080c, 0x4067, 0x701b,
++	0x3242, 0x0005, 0x6834, 0xa084, 0x00ff, 0xa096, 0x0002, 0x0120,
++	0xa096, 0x000a, 0x1904, 0x3179, 0x08c0, 0x7010, 0x2068, 0x6838,
++	0xc0fd, 0x683a, 0x080c, 0x51dd, 0x1128, 0x7007, 0x0003, 0x701b,
++	0x325c, 0x0005, 0x080c, 0x592e, 0x0126, 0x2091, 0x8000, 0x20a9,
++	0x0005, 0x2099, 0xc6a9, 0x530a, 0x2100, 0xa210, 0xa399, 0x0000,
++	0xa4a1, 0x0000, 0xa5a9, 0x0000, 0xad80, 0x000d, 0x2009, 0x0020,
++	0x012e, 0x0804, 0x406a, 0x61ac, 0x7824, 0x60ae, 0x0804, 0x3154,
++	0x2091, 0x8000, 0x7823, 0x4000, 0x7827, 0x4953, 0x782b, 0x5020,
++	0x782f, 0x2020, 0x2009, 0x017f, 0x2104, 0x7832, 0x3f00, 0x7836,
++	0x2061, 0x0100, 0x6200, 0x2061, 0x0200, 0x603c, 0x8007, 0xa205,
++	0x783a, 0x2009, 0x04fd, 0x2104, 0x783e, 0x781b, 0x0001, 0x2091,
++	0x5000, 0x2091, 0x4080, 0x2071, 0x0010, 0x20c1, 0x00f0, 0x0804,
++	0x0427, 0x81ff, 0x1904, 0x3179, 0x7924, 0x810f, 0xa18c, 0x00ff,
++	0x080c, 0x533d, 0x1904, 0x317c, 0x7e38, 0xa684, 0x3fff, 0xa082,
++	0x4000, 0x0210, 0x0804, 0x317c, 0x7c28, 0x7d2c, 0x080c, 0x5505,
++	0xd28c, 0x1118, 0x080c, 0x54ae, 0x0010, 0x080c, 0x54de, 0x1518,
++	0x2061, 0xce00, 0x0126, 0x2091, 0x8000, 0x6000, 0xa086, 0x0000,
++	0x0148, 0x6010, 0xa06d, 0x0130, 0x683c, 0xa406, 0x1118, 0x6840,
++	0xa506, 0x0150, 0x012e, 0xace0, 0x0018, 0x2001, 0xc617, 0x2004,
++	0xac02, 0x1a04, 0x3179, 0x0c30, 0x080c, 0xa961, 0x012e, 0x0904,
++	0x3179, 0x0804, 0x3154, 0xa00e, 0x2001, 0x0005, 0x080c, 0x592e,
++	0x0126, 0x2091, 0x8000, 0x080c, 0xaf09, 0x080c, 0x580a, 0x012e,
++	0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, 0x403b, 0x0904,
++	0x317c, 0x080c, 0x5403, 0x0904, 0x3179, 0x080c, 0x5511, 0x0904,
++	0x3179, 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, 0x404b,
++	0x0904, 0x317c, 0x080c, 0x557d, 0x0904, 0x3179, 0x2019, 0x0005,
++	0x7924, 0x080c, 0x552c, 0x0904, 0x3179, 0x7828, 0xa08a, 0x1000,
++	0x1a04, 0x317c, 0x8003, 0x800b, 0x810b, 0xa108, 0x080c, 0x6fb9,
++	0x0804, 0x3154, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009,
++	0x0001, 0x0450, 0x2029, 0x00ff, 0x6450, 0x2400, 0xa506, 0x01f8,
++	0x2508, 0x080c, 0x533d, 0x11d8, 0x080c, 0x557d, 0x1128, 0x2009,
++	0x0002, 0x62b4, 0x2518, 0x00c0, 0x2019, 0x0004, 0xa00e, 0x080c,
++	0x552c, 0x1118, 0x2009, 0x0006, 0x0078, 0x7824, 0xa08a, 0x1000,
++	0x1270, 0x8003, 0x800b, 0x810b, 0xa108, 0x080c, 0x6fb9, 0x8529,
++	0x1ae0, 0x012e, 0x0804, 0x3154, 0x012e, 0x0804, 0x3179, 0x012e,
++	0x0804, 0x317c, 0x080c, 0x403b, 0x0904, 0x317c, 0x080c, 0x5469,
++	0x080c, 0x5505, 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c,
++	0x403b, 0x0904, 0x317c, 0x080c, 0x545a, 0x080c, 0x5505, 0x0804,
++	0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, 0x403b, 0x0904, 0x317c,
++	0x080c, 0x54e0, 0x0904, 0x3179, 0x080c, 0x5221, 0x080c, 0x54a7,
++	0x080c, 0x5505, 0x0804, 0x3154, 0x080c, 0x403b, 0x0904, 0x317c,
++	0x080c, 0x5403, 0x0904, 0x3179, 0x62a0, 0x2019, 0x0005, 0x00c6,
++	0x080c, 0x553e, 0x2061, 0x0000, 0x080c, 0x7b16, 0x0076, 0x2039,
++	0x0000, 0x080c, 0x7a0e, 0x2009, 0x0000, 0x080c, 0xbef7, 0x007e,
++	0x00ce, 0x080c, 0x5505, 0x0804, 0x3154, 0x080c, 0x403b, 0x0904,
++	0x317c, 0x080c, 0x5505, 0x2208, 0x0804, 0x3154, 0x0156, 0x00d6,
++	0x00e6, 0x2069, 0xc734, 0x6810, 0x6914, 0xa10a, 0x1210, 0x2009,
++	0x0000, 0x6816, 0x2011, 0x0000, 0x2019, 0x0000, 0x20a9, 0x007e,
++	0x2069, 0xc77b, 0x2d04, 0xa075, 0x0130, 0x704c, 0x0071, 0xa210,
++	0x7080, 0x0059, 0xa318, 0x8d68, 0x1f04, 0x33c2, 0x2300, 0xa218,
++	0x00ee, 0x00de, 0x015e, 0x0804, 0x3154, 0x00f6, 0x0016, 0xa07d,
++	0x0140, 0x2001, 0x0000, 0x8000, 0x2f0c, 0x81ff, 0x0110, 0x2178,
++	0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, 0xc734, 0x6910, 0x62b0,
++	0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x6150, 0xa190, 0x2f6e,
++	0x2215, 0xa294, 0x00ff, 0x6370, 0x83ff, 0x0108, 0x6274, 0x67d4,
++	0xd79c, 0x0118, 0x2031, 0x0001, 0x0090, 0xd7ac, 0x0118, 0x2031,
++	0x0003, 0x0068, 0xd7a4, 0x0118, 0x2031, 0x0002, 0x0040, 0x080c,
++	0x5f22, 0x1118, 0x2031, 0x0004, 0x0010, 0x2031, 0x0000, 0x7e3a,
++	0x7f3e, 0x0804, 0x3154, 0x6140, 0x6244, 0x2019, 0xc8fd, 0x231c,
++	0x0804, 0x3154, 0x0126, 0x2091, 0x8000, 0x6134, 0xa006, 0x2010,
++	0x6338, 0x012e, 0x0804, 0x3154, 0x080c, 0x404b, 0x0904, 0x317c,
++	0x6244, 0x6338, 0x0804, 0x3154, 0x6140, 0x6244, 0x7824, 0x6042,
++	0x7b28, 0x6346, 0x2069, 0xc652, 0x831f, 0xa305, 0x6816, 0x782c,
++	0x2069, 0xc8fd, 0x2d1c, 0x206a, 0x0804, 0x3154, 0x0126, 0x2091,
++	0x8000, 0x7824, 0x6036, 0x782c, 0x603a, 0x012e, 0x0804, 0x3154,
++	0x7838, 0xa005, 0x01a8, 0x7828, 0xa025, 0x0904, 0x317c, 0x782c,
++	0xa02d, 0x0904, 0x317c, 0xa00e, 0x080c, 0x533d, 0x1120, 0x6244,
++	0x6338, 0x6446, 0x653a, 0xa186, 0x00ff, 0x0190, 0x8108, 0x0ca0,
++	0x080c, 0x404b, 0x0904, 0x317c, 0x7828, 0xa00d, 0x0904, 0x317c,
++	0x782c, 0xa005, 0x0904, 0x317c, 0x6244, 0x6146, 0x6338, 0x603a,
++	0x0804, 0x3154, 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1904,
++	0x3179, 0x00c6, 0x2061, 0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff,
++	0xa196, 0x00ff, 0x1130, 0x2001, 0xc615, 0x2004, 0xa085, 0xff00,
++	0x0078, 0xa182, 0x007f, 0x16a0, 0xa188, 0x2f6e, 0x210d, 0xa18c,
++	0x00ff, 0x2001, 0xc615, 0x2004, 0xa116, 0x0550, 0x810f, 0xa105,
++	0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0x958d, 0x000e, 0x01e0,
++	0x601a, 0x600b, 0xbc09, 0x601f, 0x0001, 0x080c, 0x4026, 0x01d8,
++	0x6837, 0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd,
++	0x683a, 0x701b, 0x351a, 0x2d00, 0x6012, 0x2009, 0x0032, 0x080c,
++	0x9613, 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x3179,
++	0x00ce, 0x0804, 0x317c, 0x080c, 0x95e3, 0x0cb0, 0x2001, 0xc600,
++	0x2004, 0xa086, 0x0003, 0x1904, 0x3179, 0x00c6, 0x2061, 0x0100,
++	0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff, 0x1130, 0x2001,
++	0xc615, 0x2004, 0xa085, 0xff00, 0x0078, 0xa182, 0x007f, 0x16a0,
++	0xa188, 0x2f6e, 0x210d, 0xa18c, 0x00ff, 0x2001, 0xc615, 0x2004,
++	0xa116, 0x0550, 0x810f, 0xa105, 0x0126, 0x2091, 0x8000, 0x0006,
++	0x080c, 0x958d, 0x000e, 0x01e0, 0x601a, 0x600b, 0xbc05, 0x601f,
++	0x0001, 0x080c, 0x4026, 0x01d8, 0x6837, 0x0000, 0x7007, 0x0003,
++	0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x701b, 0x351a, 0x2d00,
++	0x6012, 0x2009, 0x0032, 0x080c, 0x9613, 0x012e, 0x00ce, 0x0005,
++	0x012e, 0x00ce, 0x0804, 0x3179, 0x00ce, 0x0804, 0x317c, 0x080c,
++	0x95e3, 0x0cb0, 0x6830, 0xa086, 0x0100, 0x0904, 0x3179, 0x0804,
++	0x3154, 0x2061, 0xc9bc, 0x0126, 0x2091, 0x8000, 0x6000, 0xd084,
++	0x0178, 0x6104, 0x6208, 0x2a60, 0x6068, 0x783a, 0x60b4, 0x783e,
++	0x60b0, 0x2019, 0x0072, 0x201a, 0x6348, 0x012e, 0x0804, 0x3154,
++	0xa00e, 0x2110, 0x0c80, 0x81ff, 0x1904, 0x3179, 0x080c, 0x5f22,
++	0x0904, 0x3179, 0x0126, 0x2091, 0x8000, 0x6248, 0x6068, 0xa202,
++	0x0248, 0xa085, 0x0001, 0x080c, 0x2a11, 0x080c, 0x4968, 0x012e,
++	0x0804, 0x3154, 0x012e, 0x0804, 0x317c, 0x0006, 0x0016, 0x00c6,
++	0x00e6, 0x2001, 0xc906, 0x2070, 0x2061, 0xc652, 0x6008, 0x2072,
++	0x2009, 0x0000, 0x2011, 0x1000, 0x080c, 0x783f, 0x7206, 0x00ee,
++	0x00ce, 0x001e, 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, 0x7824,
++	0xa084, 0x0007, 0x0002, 0x357e, 0x3587, 0x358e, 0x357b, 0x357b,
++	0x357b, 0x357b, 0x357b, 0x012e, 0x0804, 0x317c, 0x2009, 0x0114,
++	0x2104, 0xa085, 0x0800, 0x200a, 0x080c, 0x36f9, 0x0070, 0x2009,
++	0x010b, 0x200b, 0x0010, 0x080c, 0x36f9, 0x0038, 0x81ff, 0x0128,
++	0x012e, 0x2021, 0x400b, 0x0804, 0x3156, 0x0086, 0x0096, 0x00a6,
++	0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3555, 0x2009,
++	0x0101, 0x210c, 0x0016, 0x2001, 0x0138, 0x200c, 0x2003, 0x0001,
++	0x0016, 0x2001, 0x007a, 0x2034, 0x2001, 0x007b, 0x202c, 0xa006,
++	0x2048, 0x2050, 0x2058, 0x080c, 0x3944, 0x080c, 0x38a8, 0xa03e,
++	0x2720, 0x00f6, 0x00e6, 0x00c6, 0x2d60, 0x2071, 0xc992, 0x2079,
++	0x0020, 0x00d6, 0x2069, 0x0000, 0x6824, 0xd0b4, 0x0140, 0x2001,
++	0x007d, 0x2004, 0x783e, 0x2001, 0x007c, 0x2004, 0x783a, 0x00de,
++	0x2011, 0x0001, 0x080c, 0x3854, 0x080c, 0x3854, 0x00ce, 0x00ee,
++	0x00fe, 0x080c, 0x379f, 0x080c, 0x387c, 0x080c, 0x37f9, 0x080c,
++	0x375e, 0x080c, 0x378f, 0x00f6, 0x2079, 0x0100, 0x7824, 0xd094,
++	0x0530, 0x7814, 0xa084, 0x0184, 0xa085, 0x0010, 0x7816, 0x2079,
++	0x0140, 0x080c, 0x36d7, 0x1110, 0x00fe, 0x0430, 0x7804, 0xd0dc,
++	0x0dc0, 0x2079, 0x0100, 0x7827, 0x0086, 0x7814, 0xa084, 0x0184,
++	0xa085, 0x0032, 0x7816, 0x080c, 0x36d7, 0x1110, 0x00fe, 0x00a0,
++	0x7824, 0xd0bc, 0x0dc0, 0x7827, 0x0080, 0xa026, 0x7c16, 0x7824,
++	0xd0ac, 0x0130, 0x8b58, 0x080c, 0x36e1, 0x00fe, 0x0804, 0x36a1,
++	0x00fe, 0x080c, 0x36d7, 0x1150, 0x8948, 0x2001, 0x007a, 0x2602,
++	0x2001, 0x007b, 0x2502, 0x080c, 0x36e1, 0x0088, 0x87ff, 0x0140,
++	0x2001, 0x0201, 0x2004, 0xa005, 0x1904, 0x35db, 0x8739, 0x0038,
++	0x2001, 0xc96a, 0x2004, 0xa086, 0x0000, 0x1904, 0x35db, 0x2001,
++	0x0033, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, 0x2500, 0xa605,
++	0x0904, 0x36a1, 0x7824, 0xd0bc, 0x0128, 0x2900, 0xaa05, 0xab05,
++	0x1904, 0x36a1, 0x6033, 0x000d, 0x2001, 0x0030, 0x2003, 0x0004,
++	0x7824, 0xd0ac, 0x1148, 0x2001, 0xc96a, 0x2003, 0x0003, 0x2001,
++	0x0030, 0x2003, 0x0009, 0x0040, 0x6027, 0x0001, 0x2001, 0x0075,
++	0x2004, 0xa005, 0x0108, 0x6026, 0x2c00, 0x601a, 0x20e1, 0x9040,
++	0x2d00, 0x681a, 0x6833, 0x000d, 0x7824, 0xd0a4, 0x1180, 0x6827,
++	0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0020, 0x6003, 0x0008,
++	0x2001, 0x0203, 0x2004, 0x1f04, 0x3676, 0x00ce, 0x0040, 0x6827,
++	0x0001, 0x2001, 0x0074, 0x2004, 0xa005, 0x0108, 0x6826, 0x00f6,
++	0x00c6, 0x2079, 0x0100, 0x2061, 0x0020, 0x7827, 0x0002, 0x2001,
++	0x0072, 0x2004, 0xa084, 0xfff8, 0x601a, 0x0006, 0x2001, 0x0073,
++	0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca, 0x00ce, 0x00fe, 0x0804,
++	0x35b9, 0x2061, 0x0100, 0x6027, 0x0002, 0x001e, 0x61e2, 0x001e,
++	0x6106, 0x7824, 0xa084, 0x0003, 0xa086, 0x0002, 0x0188, 0x20e1,
++	0x9028, 0x6050, 0xa084, 0xf7ef, 0x6052, 0x602f, 0x0000, 0x602c,
++	0xc0ac, 0x602e, 0x604b, 0xf7f7, 0x6043, 0x0090, 0x6043, 0x0010,
++	0x2908, 0x2a10, 0x2b18, 0x2b00, 0xaa05, 0xa905, 0x00fe, 0x00ee,
++	0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x1118, 0x012e,
++	0x0804, 0x3154, 0x012e, 0x2021, 0x400c, 0x0804, 0x3156, 0xa085,
++	0x0001, 0x1d04, 0x36e0, 0x2091, 0x6000, 0x8420, 0xa486, 0x0064,
++	0x0005, 0x2001, 0x0105, 0x2003, 0x0010, 0x2001, 0x0030, 0x2003,
++	0x0004, 0x2001, 0x0020, 0x2003, 0x0004, 0x2001, 0xc96a, 0x2003,
++	0x0000, 0x2001, 0xc992, 0x2003, 0x0000, 0x20e1, 0xf000, 0xa026,
++	0x0005, 0x00f6, 0x2079, 0x0100, 0x2001, 0xc615, 0x200c, 0x7932,
++	0x7936, 0x080c, 0x29f1, 0x7850, 0xa084, 0x0980, 0xa085, 0x0030,
++	0x7852, 0x2019, 0x01f4, 0x8319, 0x1df0, 0xa084, 0x0980, 0x7852,
++	0x782c, 0xc0ad, 0x782e, 0x20a9, 0x0046, 0x1d04, 0x3715, 0x2091,
++	0x6000, 0x1f04, 0x3715, 0x7850, 0xa085, 0x0400, 0x7852, 0x2001,
++	0x0009, 0x2004, 0xa084, 0x0003, 0xa086, 0x0001, 0x1118, 0x782c,
++	0xc0ac, 0x782e, 0x784b, 0xf7f7, 0x7843, 0x0090, 0x7843, 0x0010,
++	0x20a9, 0x000e, 0xe000, 0x1f04, 0x3732, 0x7850, 0xa085, 0x1400,
++	0x7852, 0x2019, 0x61a8, 0x7854, 0xe000, 0xe000, 0xd08c, 0x1110,
++	0x8319, 0x1dc8, 0x7827, 0x0048, 0x7850, 0xa085, 0x0400, 0x7852,
++	0x7843, 0x0040, 0x2019, 0x01f4, 0xe000, 0xe000, 0x8319, 0x1de0,
++	0x2001, 0x0140, 0x2003, 0x0100, 0x7827, 0x0020, 0x7843, 0x0000,
++	0x2003, 0x0000, 0x7827, 0x0048, 0x00fe, 0x0005, 0x7824, 0xd0ac,
++	0x11c8, 0x00f6, 0x00e6, 0x2071, 0xc96a, 0x2079, 0x0030, 0x2001,
++	0x0201, 0x2004, 0xa005, 0x0160, 0x7000, 0xa086, 0x0000, 0x1140,
++	0x0051, 0xd0bc, 0x0108, 0x8738, 0x7003, 0x0003, 0x7803, 0x0019,
++	0x00ee, 0x00fe, 0x0005, 0x780c, 0xa08c, 0x0070, 0x0178, 0x2009,
++	0x007a, 0x260a, 0x2009, 0x007b, 0x250a, 0xd0b4, 0x0108, 0x8a50,
++	0xd0ac, 0x0108, 0x8948, 0xd0a4, 0x0108, 0x8b58, 0x0005, 0x00f6,
++	0x2079, 0x0200, 0x781c, 0xd084, 0x0140, 0x20e1, 0x0007, 0x20e1,
++	0x2000, 0x2001, 0x020a, 0x2004, 0x0ca8, 0x00fe, 0x0005, 0x00e6,
++	0x2071, 0x0100, 0x2001, 0xc907, 0x2004, 0x70e2, 0x2009, 0xc615,
++	0x210c, 0x716e, 0x7063, 0x0100, 0x7166, 0x719e, 0x706b, 0x0000,
++	0x7073, 0x0809, 0x7077, 0x0008, 0x7078, 0xa080, 0x0100, 0x707a,
++	0x7080, 0x8000, 0x7082, 0x7087, 0xaaaa, 0xa006, 0x708a, 0x708e,
++	0x707e, 0x70d6, 0x70ab, 0x0036, 0x70af, 0x95d5, 0x7027, 0x0080,
++	0x7014, 0xa084, 0x0184, 0xa085, 0x0032, 0x7016, 0x080c, 0x387c,
++	0x080c, 0x36d7, 0x1110, 0x8421, 0x0028, 0x7024, 0xd0bc, 0x0db0,
++	0x7027, 0x0080, 0x00f6, 0x00e6, 0x2071, 0xc96a, 0x2079, 0x0030,
++	0x00d6, 0x2069, 0x0000, 0x6824, 0xd0b4, 0x0120, 0x683c, 0x783e,
++	0x6838, 0x783a, 0x00de, 0x2011, 0x0011, 0x080c, 0x3854, 0x2011,
++	0x0001, 0x080c, 0x3854, 0x00ee, 0x00fe, 0x7017, 0x0000, 0x00ee,
++	0x0005, 0x00f6, 0x00e6, 0x2071, 0xc96a, 0x2079, 0x0030, 0x7904,
++	0xd1fc, 0x0904, 0x3851, 0x7803, 0x0002, 0xa026, 0xd19c, 0x1904,
++	0x384d, 0x7000, 0x0002, 0x3851, 0x380f, 0x3833, 0x384d, 0xd1bc,
++	0x1150, 0xd1dc, 0x1150, 0x8001, 0x7002, 0x2011, 0x0001, 0x04e1,
++	0x05c0, 0x04d1, 0x04b0, 0x780f, 0x0000, 0x7820, 0x7924, 0x7803,
++	0x0004, 0x7822, 0x7926, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0de8,
++	0x080c, 0x377b, 0x2009, 0x0001, 0x7808, 0xd0ec, 0x0110, 0x2009,
++	0x0011, 0x7902, 0x00f0, 0x8001, 0x7002, 0xa184, 0x0880, 0x1138,
++	0x7804, 0xd0fc, 0x1940, 0x2011, 0x0001, 0x00b1, 0x0090, 0x6030,
++	0xa092, 0x0004, 0xa086, 0x0009, 0x1120, 0x6000, 0x601a, 0x2011,
++	0x0025, 0x6232, 0xd1dc, 0x1988, 0x0870, 0x7803, 0x0004, 0x7003,
++	0x0000, 0x00ee, 0x00fe, 0x0005, 0x6024, 0xa005, 0x0520, 0x8001,
++	0x6026, 0x6018, 0x6130, 0xa140, 0x2804, 0x7832, 0x8840, 0x2804,
++	0x7836, 0x8840, 0x2804, 0x7822, 0x8840, 0x2804, 0x7826, 0x8840,
++	0x7a02, 0x7000, 0x8000, 0x7002, 0x6018, 0xa802, 0xa08a, 0x0029,
++	0x1138, 0x6018, 0xa080, 0x0001, 0x2004, 0x601a, 0x2001, 0x000d,
++	0x6032, 0xa085, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x2071,
++	0xc992, 0x2079, 0x0020, 0x7904, 0xd1fc, 0x01f0, 0x7803, 0x0002,
++	0x2d60, 0xa026, 0x7000, 0x0002, 0x38a4, 0x388f, 0x389b, 0x8001,
++	0x7002, 0xd19c, 0x1188, 0x2011, 0x0001, 0x080c, 0x3854, 0x0160,
++	0x080c, 0x3854, 0x0048, 0x8001, 0x7002, 0x7804, 0xd0fc, 0x1d30,
++	0x2011, 0x0001, 0x080c, 0x3854, 0x00ce, 0x00ee, 0x00fe, 0x0005,
++	0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0xc907, 0x2004,
++	0x601a, 0x2061, 0x0100, 0x2001, 0xc906, 0x2004, 0x60ce, 0x6004,
++	0xc0ac, 0xa085, 0x0200, 0x6006, 0x2001, 0x0074, 0x2004, 0xa005,
++	0x01f8, 0x2038, 0x2001, 0x0076, 0x2024, 0x2001, 0x0077, 0x201c,
++	0x080c, 0x4026, 0x6833, 0x000d, 0x6f26, 0x2d00, 0x681a, 0xa78a,
++	0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0xa03e,
++	0x6818, 0xa080, 0x000d, 0x04b1, 0x1d90, 0x2d00, 0x681a, 0x0088,
++	0x080c, 0x4026, 0x6833, 0x000d, 0x2070, 0x6827, 0x0001, 0x2d00,
++	0x681a, 0x2001, 0x0076, 0x2004, 0x2072, 0x2001, 0x0077, 0x2004,
++	0x7006, 0x2061, 0x0020, 0x2079, 0x0100, 0x2001, 0xc906, 0x2004,
++	0x6012, 0x20e1, 0x9040, 0x2001, 0x0072, 0x2004, 0xa084, 0xfff8,
++	0x700a, 0x601a, 0x0006, 0x2001, 0x0073, 0x2004, 0x700e, 0x601e,
++	0x78c6, 0x000e, 0x78ca, 0xa006, 0x603a, 0x603e, 0x00ce, 0x00ee,
++	0x00fe, 0x0005, 0x00e6, 0x2071, 0x0010, 0x20a0, 0x2099, 0x0014,
++	0x7003, 0x0026, 0x7432, 0x7336, 0xa006, 0x703a, 0x703e, 0x810b,
++	0x810b, 0x21a8, 0x810b, 0x7122, 0x7003, 0x0041, 0x7004, 0xd0fc,
++	0x0de8, 0x7003, 0x0002, 0x7003, 0x0040, 0x53a5, 0x7430, 0x7334,
++	0x87ff, 0x0180, 0x00c6, 0x00d6, 0x2d60, 0x00c6, 0x080c, 0x4026,
++	0x00ce, 0x6018, 0x2070, 0x2d00, 0x7006, 0x601a, 0x00de, 0x00ce,
++	0xa085, 0x0001, 0x00ee, 0x0005, 0x00e6, 0x2001, 0x0075, 0x2004,
++	0xa005, 0x0508, 0x2038, 0x2001, 0x0078, 0x2024, 0x2001, 0x0079,
++	0x201c, 0x080c, 0x4026, 0x2d60, 0x6833, 0x000d, 0x6f26, 0x2d00,
++	0x681a, 0xa78a, 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010,
++	0x2708, 0xa03e, 0x6818, 0xa080, 0x000d, 0x080c, 0x3912, 0x1d88,
++	0x2d00, 0x681a, 0x00e0, 0x080c, 0x4026, 0x2d60, 0x6033, 0x000d,
++	0x2070, 0x6027, 0x0001, 0x2c00, 0x601a, 0x2001, 0x0078, 0x2004,
++	0x2072, 0x2001, 0x0079, 0x2004, 0x7006, 0x2001, 0x0072, 0x2004,
++	0xa084, 0xfff8, 0x700a, 0x2001, 0x0073, 0x2004, 0x700e, 0x2001,
++	0x0030, 0x2003, 0x0004, 0x7824, 0xd0ac, 0x1178, 0x2001, 0x0101,
++	0x200c, 0xc1ed, 0x2102, 0x6027, 0x0000, 0x2001, 0xc96a, 0x2003,
++	0x0003, 0x2001, 0x0030, 0x2003, 0x0009, 0x00ee, 0x0005, 0x0804,
++	0x3154, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0012, 0x2001, 0xc640,
++	0x20a0, 0xa006, 0x40a4, 0x012e, 0x0804, 0x3154, 0x7d38, 0x7c3c,
++	0x0804, 0x31fb, 0x080c, 0x4026, 0x0904, 0x3179, 0x080c, 0x5f22,
++	0x0110, 0x080c, 0x4f2c, 0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c,
++	0x7d38, 0x080c, 0x4067, 0x701b, 0x39c6, 0x0005, 0xade8, 0x000d,
++	0x6800, 0xa005, 0x0904, 0x317c, 0x6804, 0xd0ac, 0x0118, 0xd0a4,
++	0x0904, 0x317c, 0xd094, 0x00c6, 0x2061, 0x0100, 0x6104, 0x0138,
++	0x6200, 0xa292, 0x0005, 0x0218, 0xa18c, 0xffdf, 0x0010, 0xa18d,
++	0x0020, 0x6106, 0x00ce, 0xd08c, 0x00c6, 0x2061, 0x0100, 0x6104,
++	0x0118, 0xa18d, 0x0010, 0x0010, 0xa18c, 0xffef, 0x6106, 0x00ce,
++	0x2009, 0x0100, 0x210c, 0xa18a, 0x0002, 0x0268, 0xd084, 0x0158,
++	0x6a28, 0xa28a, 0x007f, 0x1a04, 0x317c, 0xa288, 0x2f6e, 0x210d,
++	0xa18c, 0x00ff, 0x615a, 0xd0dc, 0x0130, 0x6828, 0xa08a, 0x007f,
++	0x1a04, 0x317c, 0x6052, 0x6808, 0xa08a, 0x0100, 0x0a04, 0x317c,
++	0xa08a, 0x0841, 0x1a04, 0x317c, 0xa084, 0x0007, 0x1904, 0x317c,
++	0x680c, 0xa005, 0x0904, 0x317c, 0x6810, 0xa005, 0x0904, 0x317c,
++	0x6848, 0x6940, 0xa10a, 0x1a04, 0x317c, 0x8001, 0x0904, 0x317c,
++	0x684c, 0x6944, 0xa10a, 0x1a04, 0x317c, 0x8001, 0x0904, 0x317c,
++	0x6804, 0xd0fc, 0x0560, 0x080c, 0x4026, 0x0904, 0x3179, 0x2009,
++	0x0014, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0xa290, 0x0038, 0xa399,
++	0x0000, 0x080c, 0x4067, 0x701b, 0x3a46, 0x0005, 0xade8, 0x000d,
++	0x20a9, 0x0014, 0x2d98, 0x2069, 0xc66e, 0x2da0, 0x53a3, 0x7010,
++	0xa0e8, 0x000d, 0x2001, 0xc672, 0x200c, 0xd1e4, 0x0140, 0x00c6,
++	0x2061, 0x0100, 0x6004, 0xa085, 0x0b00, 0x6006, 0x00ce, 0x2009,
++	0xc8f8, 0x200b, 0x0000, 0x2001, 0xc674, 0x2004, 0xd0ac, 0x0158,
++	0x7824, 0x200a, 0x2009, 0x017f, 0x200a, 0x3200, 0xa084, 0x003f,
++	0xa085, 0x3020, 0x2090, 0x20a9, 0x001c, 0x2d98, 0x2069, 0xc652,
++	0x2da0, 0x53a3, 0x6814, 0xa08c, 0x00ff, 0x6142, 0x8007, 0xa084,
++	0x00ff, 0x6046, 0x080c, 0x61f8, 0x080c, 0x576e, 0x080c, 0x57d7,
++	0x6000, 0xa086, 0x0000, 0x1904, 0x3b41, 0x6808, 0x602a, 0x080c,
++	0x25bb, 0x0006, 0x2001, 0x0100, 0x2004, 0xa082, 0x0005, 0x000e,
++	0x0268, 0x2009, 0x0170, 0x200b, 0x0080, 0xe000, 0xe000, 0x200b,
++	0x0000, 0x0036, 0x6b08, 0x080c, 0x2a4c, 0x003e, 0x6818, 0x691c,
++	0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f, 0x6016, 0x611a,
++	0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0148, 0x6830, 0x6934, 0x6a38,
++	0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f, 0x0010, 0xa084, 0xf0ff,
++	0x6006, 0x610a, 0x620e, 0x6312, 0x8007, 0x810f, 0x8217, 0x831f,
++	0x20a9, 0x0004, 0x20a1, 0xc90d, 0x40a1, 0x080c, 0x707c, 0x6904,
++	0xd1fc, 0x0520, 0x00c6, 0x2009, 0x0000, 0x20a9, 0x0001, 0x6b70,
++	0xd384, 0x01c8, 0x0020, 0x839d, 0x12b0, 0x3508, 0x8109, 0x080c,
++	0x67ed, 0x6878, 0x6016, 0x6874, 0x2008, 0xa084, 0xff00, 0x8007,
++	0x600a, 0xa184, 0x00ff, 0x6006, 0x8108, 0x1118, 0x6003, 0x0003,
++	0x0010, 0x6003, 0x0001, 0x1f04, 0x3adb, 0x00ce, 0x2069, 0xc652,
++	0x2001, 0xc8e5, 0x6a80, 0xa294, 0x0030, 0xa28e, 0x0000, 0x0170,
++	0xa28e, 0x0010, 0x0118, 0xa28e, 0x0020, 0x0140, 0x2003, 0xaaaa,
++	0x080c, 0x2a95, 0x2001, 0xc8d6, 0x2102, 0x0008, 0x2102, 0x00c6,
++	0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c,
++	0x5f22, 0x0128, 0x080c, 0x440b, 0x0110, 0x080c, 0x2a11, 0x60c8,
++	0xa005, 0x01d0, 0x6003, 0x0001, 0x2009, 0x3b27, 0x00e0, 0x080c,
++	0x5f22, 0x1178, 0x2011, 0x5df5, 0x080c, 0x6fad, 0x2011, 0x5de8,
++	0x080c, 0x7070, 0x2001, 0xc8e6, 0x2003, 0x0000, 0x080c, 0x5e5a,
++	0x0040, 0x080c, 0x4e5b, 0x0028, 0x6003, 0x0004, 0x2009, 0x3b41,
++	0x0010, 0x0804, 0x3154, 0x2001, 0x0100, 0x2004, 0xa082, 0x0005,
++	0x0258, 0x2001, 0x0170, 0x2004, 0xa084, 0x00ff, 0xa086, 0x004c,
++	0x1118, 0x2091, 0x309d, 0x0817, 0x2091, 0x301d, 0x0817, 0x6000,
++	0xa086, 0x0000, 0x0904, 0x3179, 0x2069, 0xc652, 0x7830, 0x6842,
++	0x7834, 0x6846, 0x6804, 0xd0fc, 0x0118, 0x2009, 0x0030, 0x0010,
++	0x2009, 0x001c, 0x2d00, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804,
++	0x406a, 0xa006, 0x080c, 0x2a11, 0x81ff, 0x1904, 0x3179, 0x080c,
++	0x5f22, 0x1178, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600,
++	0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5f66, 0x080c, 0x5e5a,
++	0x0020, 0x080c, 0x4f2c, 0x080c, 0x4e5b, 0x0804, 0x3154, 0x81ff,
++	0x1904, 0x3179, 0x080c, 0x5f22, 0x1110, 0x0804, 0x3179, 0x6188,
++	0x81ff, 0x0198, 0x703f, 0x0000, 0x2001, 0xcdc0, 0x2009, 0x0040,
++	0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0126, 0x2091, 0x8000, 0x080c,
++	0x406a, 0x701b, 0x3152, 0x012e, 0x0005, 0x703f, 0x0001, 0x00d6,
++	0x2069, 0xcdc0, 0x20a9, 0x0040, 0x20a1, 0xcdc0, 0x2019, 0xffff,
++	0x43a4, 0x6550, 0xa588, 0x2f6e, 0x210d, 0xa18c, 0x00ff, 0x216a,
++	0xa00e, 0x2011, 0x0002, 0x2100, 0xa506, 0x01a8, 0x080c, 0x533d,
++	0x1190, 0x6014, 0x821c, 0x0238, 0xa398, 0xcdc0, 0xa085, 0xff00,
++	0x8007, 0x201a, 0x0038, 0xa398, 0xcdc0, 0x2324, 0xa4a4, 0xff00,
++	0xa405, 0x201a, 0x8210, 0x8108, 0xa182, 0x0080, 0x1208, 0x0c18,
++	0x8201, 0x8007, 0x2d0c, 0xa105, 0x206a, 0x00de, 0x20a9, 0x0040,
++	0x20a1, 0xcdc0, 0x2099, 0xcdc0, 0x080c, 0x4ecb, 0x0804, 0x3b9c,
++	0x080c, 0x404b, 0x0904, 0x317c, 0x00c6, 0x080c, 0x4026, 0x00ce,
++	0x1120, 0x2009, 0x0002, 0x0804, 0x3179, 0x2001, 0xc653, 0x2004,
++	0xd0b4, 0x0550, 0x7824, 0xa084, 0xff00, 0xa08e, 0x7e00, 0x0520,
++	0xa08e, 0x7f00, 0x0508, 0xa08e, 0x8000, 0x01f0, 0x6000, 0xd08c,
++	0x11d8, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x11a8, 0x6837,
++	0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c, 0xae11, 0x1120, 0x2009,
++	0x0003, 0x0804, 0x3179, 0x7007, 0x0003, 0x701b, 0x3c28, 0x0005,
++	0x080c, 0x404b, 0x0904, 0x317c, 0x20a9, 0x002b, 0x2c98, 0xade8,
++	0x0002, 0x2da0, 0x53a3, 0x20a9, 0x0004, 0xac80, 0x0006, 0x2098,
++	0xad80, 0x0006, 0x20a0, 0x080c, 0x4ecb, 0x20a9, 0x0004, 0xac80,
++	0x000a, 0x2098, 0xad80, 0x000a, 0x20a0, 0x080c, 0x4ecb, 0x2d00,
++	0x2009, 0x002b, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x406a,
++	0x81ff, 0x1904, 0x3179, 0x080c, 0x403b, 0x0904, 0x317c, 0x080c,
++	0x551a, 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x7828, 0xa08a,
++	0x1000, 0x1a04, 0x317c, 0x080c, 0x404b, 0x0904, 0x317c, 0x080c,
++	0x557d, 0x0904, 0x3179, 0x2019, 0x0004, 0xa00e, 0x080c, 0x552c,
++	0x7924, 0x810f, 0x7a28, 0x0011, 0x0804, 0x3154, 0xa186, 0x00ff,
++	0x0110, 0x0071, 0x0060, 0x2029, 0x007e, 0x2061, 0xc600, 0x6450,
++	0x2400, 0xa506, 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005,
++	0x080c, 0x533d, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0xa108,
++	0x080c, 0x6fb9, 0x0005, 0x81ff, 0x1904, 0x3179, 0x080c, 0x403b,
++	0x0904, 0x317c, 0x080c, 0x5403, 0x0904, 0x3179, 0x080c, 0x5523,
++	0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, 0x403b, 0x0904,
++	0x317c, 0x080c, 0x5403, 0x0904, 0x3179, 0x080c, 0x5511, 0x0804,
++	0x3154, 0x6100, 0x0804, 0x3154, 0x080c, 0x404b, 0x0904, 0x317c,
++	0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1904, 0x3179, 0x00d6,
++	0xace8, 0x000a, 0x7924, 0xd184, 0x0110, 0xace8, 0x0006, 0x680c,
++	0x8007, 0x783e, 0x6808, 0x8007, 0x783a, 0x6b04, 0x831f, 0x6a00,
++	0x8217, 0x00de, 0x6100, 0xa18c, 0x0200, 0x0804, 0x3154, 0x7824,
++	0xa09c, 0x00ff, 0xa39a, 0x0003, 0x1a04, 0x3179, 0x6250, 0xa294,
++	0x00ff, 0xa084, 0xff00, 0x8007, 0xa206, 0x1150, 0x2001, 0xc640,
++	0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x406a,
++	0x81ff, 0x1904, 0x3179, 0x080c, 0x404b, 0x0904, 0x317c, 0x6004,
++	0xa084, 0x00ff, 0xa086, 0x0006, 0x1904, 0x3179, 0x00c6, 0x080c,
++	0x4026, 0x00ce, 0x0904, 0x3179, 0x6837, 0x0000, 0x6838, 0xc0fd,
++	0x683a, 0x080c, 0xadbd, 0x0904, 0x3179, 0x7007, 0x0003, 0x701b,
++	0x3d12, 0x0005, 0x6830, 0xa086, 0x0100, 0x0904, 0x3179, 0xad80,
++	0x000e, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804,
++	0x406a, 0xa006, 0x080c, 0x2a11, 0x7824, 0xa084, 0x00ff, 0xa086,
++	0x00ff, 0x0118, 0x81ff, 0x1904, 0x3179, 0x080c, 0x5f22, 0x0110,
++	0x080c, 0x4f2c, 0x7828, 0xa08a, 0x1000, 0x1a04, 0x317c, 0x7924,
++	0xa18c, 0xff00, 0x810f, 0xa186, 0x00ff, 0x0138, 0xa182, 0x007f,
++	0x1a04, 0x317c, 0x2100, 0x080c, 0x29db, 0x0026, 0x00c6, 0x0126,
++	0x2091, 0x8000, 0x2061, 0xc93a, 0x601b, 0x0000, 0x601f, 0x0000,
++	0x080c, 0x5f22, 0x1178, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001,
++	0xc600, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5f66, 0x080c,
++	0x5e5a, 0x0420, 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, 0x0002,
++	0x080c, 0x8f18, 0x080c, 0x8dee, 0x0036, 0x2019, 0x0000, 0x080c,
++	0x8e79, 0x003e, 0x2061, 0x0100, 0x2001, 0xc615, 0x2004, 0xa084,
++	0x00ff, 0x810f, 0xa105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010,
++	0x2009, 0x002d, 0x2011, 0x4e90, 0x080c, 0x7036, 0x7924, 0xa18c,
++	0xff00, 0x810f, 0x080c, 0x5f22, 0x1110, 0x2009, 0x00ff, 0x7a28,
++	0x080c, 0x3c76, 0x012e, 0x00ce, 0x002e, 0x0804, 0x3154, 0x7924,
++	0xa18c, 0xff00, 0x810f, 0x00c6, 0x080c, 0x52e1, 0x2c08, 0x00ce,
++	0x1904, 0x317c, 0x0804, 0x3154, 0x81ff, 0x0120, 0x2009, 0x0001,
++	0x0804, 0x3179, 0x60d4, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009,
++	0x0005, 0x0804, 0x3179, 0x080c, 0x4026, 0x1120, 0x2009, 0x0002,
++	0x0804, 0x3179, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c,
++	0x4067, 0x701b, 0x3dc4, 0x0005, 0x2009, 0x0080, 0x080c, 0x533d,
++	0x1130, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0120, 0x2021,
++	0x400a, 0x0804, 0x3156, 0x00d6, 0xade8, 0x000d, 0x6900, 0x6a08,
++	0x6b0c, 0x6c10, 0x6d14, 0x6e18, 0x6820, 0xa0be, 0x0100, 0x0904,
++	0x3e3b, 0xa0be, 0x0112, 0x0904, 0x3e3b, 0xa0be, 0x0113, 0x0904,
++	0x3e3b, 0xa0be, 0x0114, 0x0904, 0x3e3b, 0xa0be, 0x0117, 0x0904,
++	0x3e3b, 0xa0be, 0x011a, 0x0904, 0x3e3b, 0xa0be, 0x011c, 0x0904,
++	0x3e3b, 0xa0be, 0x0121, 0x05b0, 0xa0be, 0x0131, 0x0598, 0xa0be,
++	0x0171, 0x05c8, 0xa0be, 0x0173, 0x05b0, 0xa0be, 0x01a1, 0x1120,
++	0x6830, 0x8007, 0x6832, 0x04a8, 0xa0be, 0x0212, 0x0540, 0xa0be,
++	0x0213, 0x0528, 0xa0be, 0x0214, 0x01b0, 0xa0be, 0x0217, 0x0168,
++	0xa0be, 0x021a, 0x1120, 0x6838, 0x8007, 0x683a, 0x00e0, 0xa0be,
++	0x0300, 0x01c8, 0x00de, 0x0804, 0x317c, 0xad80, 0x0010, 0x20a9,
++	0x0007, 0x080c, 0x3e81, 0xad80, 0x000e, 0x20a9, 0x0001, 0x080c,
++	0x3e81, 0x0048, 0xad80, 0x000c, 0x080c, 0x3e8f, 0x0050, 0xad80,
++	0x000e, 0x080c, 0x3e8f, 0xad80, 0x000c, 0x20a9, 0x0001, 0x080c,
++	0x3e81, 0x00c6, 0x080c, 0x4026, 0x0568, 0x6838, 0xc0fd, 0x683a,
++	0x6837, 0x0119, 0x6853, 0x0000, 0x684f, 0x0020, 0x685b, 0x0001,
++	0x810b, 0x697e, 0x6883, 0x0000, 0x6a86, 0x6b8a, 0x6c8e, 0x6d92,
++	0x6996, 0x689b, 0x0000, 0x00ce, 0x00de, 0x6837, 0x0000, 0x6838,
++	0xc0fd, 0x683a, 0x6823, 0x0000, 0x6804, 0x2068, 0x080c, 0xadd9,
++	0x1120, 0x2009, 0x0003, 0x0804, 0x3179, 0x7007, 0x0003, 0x701b,
++	0x3e78, 0x0005, 0x00ce, 0x00de, 0x2009, 0x0002, 0x0804, 0x3179,
++	0x6820, 0xa086, 0x8001, 0x1904, 0x3154, 0x2009, 0x0004, 0x0804,
++	0x3179, 0x0016, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x290a,
++	0x8108, 0x280a, 0x8108, 0x1f04, 0x3e83, 0x001e, 0x0005, 0x0016,
++	0x00a6, 0x00b6, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x2054,
++	0x8000, 0x205c, 0x2b0a, 0x8108, 0x2a0a, 0x8108, 0x290a, 0x8108,
++	0x280a, 0x00be, 0x00ae, 0x001e, 0x0005, 0x81ff, 0x0120, 0x2009,
++	0x0001, 0x0804, 0x3179, 0x60d4, 0xd0ac, 0x1130, 0xd09c, 0x1120,
++	0x2009, 0x0005, 0x0804, 0x3179, 0x7924, 0x2140, 0xa18c, 0xff00,
++	0x810f, 0x60d4, 0xd0ac, 0x1120, 0xa182, 0x0080, 0x0a04, 0x317c,
++	0xa182, 0x00ff, 0x1a04, 0x317c, 0x7a2c, 0x7b28, 0x6070, 0xa306,
++	0x1140, 0x6074, 0xa24e, 0x0904, 0x317c, 0xa9cc, 0xff00, 0x0904,
++	0x317c, 0x00c6, 0x080c, 0x3f6e, 0x2c68, 0x00ce, 0x0538, 0xa0c6,
++	0x4000, 0x1180, 0x00c6, 0x0006, 0x2d60, 0x2009, 0x0000, 0x080c,
++	0x55de, 0x1108, 0xc185, 0x6000, 0xd0bc, 0x0108, 0xc18d, 0x000e,
++	0x00ce, 0x0088, 0xa0c6, 0x4007, 0x1110, 0x2408, 0x0060, 0xa0c6,
++	0x4008, 0x1118, 0x2708, 0x2610, 0x0030, 0xa0c6, 0x4009, 0x1108,
++	0x0010, 0x2001, 0x4006, 0x2020, 0x0804, 0x3156, 0x2d00, 0x7022,
++	0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0x958d, 0x05d8,
++	0x2d00, 0x601a, 0x080c, 0xb05e, 0x2e58, 0x00ee, 0x00e6, 0x00c6,
++	0x080c, 0x4026, 0x00ce, 0x2b70, 0x1150, 0x080c, 0x95e3, 0x00ee,
++	0x00ce, 0x00be, 0x001e, 0x2009, 0x0002, 0x0804, 0x3179, 0x6837,
++	0x0000, 0x683b, 0x0000, 0x2d00, 0x6012, 0x6833, 0x0000, 0x6838,
++	0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0x683a, 0x0126, 0x2091, 0x8000,
++	0x080c, 0x2e46, 0x012e, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c,
++	0x527f, 0x2001, 0x0002, 0x080c, 0x5291, 0x2009, 0x0002, 0x080c,
++	0x9613, 0xa085, 0x0001, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x1120,
++	0x2009, 0x0003, 0x0804, 0x3179, 0x7007, 0x0003, 0x701b, 0x3f51,
++	0x0005, 0x6830, 0xa086, 0x0100, 0x7020, 0x2060, 0x1138, 0x2009,
++	0x0004, 0x6204, 0xa294, 0x00ff, 0x0804, 0x3179, 0x2009, 0x0000,
++	0x6838, 0xd0f4, 0x1904, 0x3154, 0x080c, 0x55de, 0x1108, 0xc185,
++	0x6000, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x3154, 0x00e6, 0x00d6,
++	0x2029, 0x0000, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x0138, 0x2021,
++	0x0000, 0x20a9, 0x00ff, 0x2071, 0xc77b, 0x0030, 0x2021, 0x0080,
++	0x20a9, 0x007f, 0x2071, 0xc7fb, 0x2e04, 0xa005, 0x1130, 0x2100,
++	0xa406, 0x15a0, 0x2428, 0xc5fd, 0x0488, 0x2068, 0x6f10, 0x2700,
++	0xa306, 0x11e0, 0x6e14, 0x2600, 0xa206, 0x11c0, 0x2400, 0xa106,
++	0x1190, 0x2d60, 0xd884, 0x0598, 0x080c, 0x56ed, 0x1580, 0x2001,
++	0x4000, 0x0470, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1538,
++	0x2001, 0x4000, 0x0428, 0x2001, 0x4007, 0x0410, 0x2400, 0xa106,
++	0x1168, 0x6e14, 0x87ff, 0x1138, 0x86ff, 0x09a0, 0x2001, 0xc635,
++	0x2004, 0xd0ac, 0x1978, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70,
++	0x1f04, 0x3f84, 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001,
++	0x0001, 0x0030, 0x080c, 0x52e1, 0x1dd0, 0x6312, 0x6216, 0xa006,
++	0xa005, 0x00de, 0x00ee, 0x0005, 0x81ff, 0x1904, 0x3179, 0x080c,
++	0x4026, 0x0904, 0x3179, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a,
++	0x7824, 0xa005, 0x0904, 0x317c, 0xa096, 0x00ff, 0x0120, 0xa092,
++	0x0004, 0x1a04, 0x317c, 0x2010, 0x2d18, 0x080c, 0x2df9, 0x0904,
++	0x3179, 0x7007, 0x0003, 0x701b, 0x3ff6, 0x0005, 0x6830, 0xa086,
++	0x0100, 0x0904, 0x3179, 0x0804, 0x3154, 0x7924, 0xa18c, 0xff00,
++	0x810f, 0x60d4, 0xd0ac, 0x1120, 0xa182, 0x0080, 0x0a04, 0x317c,
++	0xa182, 0x00ff, 0x1a04, 0x317c, 0x0126, 0x2091, 0x8000, 0x080c,
++	0xacc1, 0x1188, 0xa190, 0xc77b, 0x2204, 0xa065, 0x0160, 0x080c,
++	0x4f47, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x0110, 0x6017, 0x0000,
++	0x012e, 0x0804, 0x3154, 0x012e, 0x0804, 0x3179, 0x080c, 0x1602,
++	0x0188, 0xa006, 0x6802, 0x7010, 0xa005, 0x1120, 0x2d00, 0x7012,
++	0x7016, 0x0030, 0x7014, 0x6802, 0x2060, 0x2d00, 0x6006, 0x7016,
++	0xad80, 0x000d, 0x0005, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x080c,
++	0x533d, 0x1130, 0x7e28, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0208,
++	0xa066, 0x8cff, 0x0005, 0x7e24, 0x860f, 0xa18c, 0x00ff, 0x080c,
++	0x533d, 0x1128, 0xa6b4, 0x00ff, 0xa682, 0x4000, 0x0208, 0xa066,
++	0x8cff, 0x0005, 0x0016, 0x7110, 0x81ff, 0x0128, 0x2168, 0x6904,
++	0x080c, 0x1619, 0x0cc8, 0x7112, 0x7116, 0x001e, 0x0005, 0x2031,
++	0x0001, 0x0010, 0x2031, 0x0000, 0x2061, 0xc6f2, 0x6606, 0x6112,
++	0x600e, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x080c, 0x164d,
++	0x7007, 0x0002, 0x701b, 0x3154, 0x0005, 0x00f6, 0x0126, 0x2091,
++	0x8000, 0x2079, 0x0000, 0x2001, 0xc6b0, 0x2004, 0xa005, 0x1168,
++	0x0e04, 0x4095, 0x7818, 0xd084, 0x1140, 0x7a22, 0x7b26, 0x7c2a,
++	0x781b, 0x0001, 0x2091, 0x4080, 0x0408, 0x0016, 0x00c6, 0x00e6,
++	0x2071, 0xc6a2, 0x7138, 0xa182, 0x0010, 0x0218, 0x7030, 0x2060,
++	0x0078, 0x7030, 0xa0e0, 0x0004, 0xac82, 0xc6f2, 0x0210, 0x2061,
++	0xc6b2, 0x2c00, 0x7032, 0x81ff, 0x1108, 0x7036, 0x8108, 0x713a,
++	0x2262, 0x6306, 0x640a, 0x00ee, 0x00ce, 0x001e, 0x012e, 0x00fe,
++	0x0005, 0x00e6, 0x2071, 0xc6a2, 0x7038, 0xa005, 0x0570, 0x0126,
++	0x2091, 0x8000, 0x0e04, 0x40ec, 0x00f6, 0x2079, 0x0000, 0x7818,
++	0xd084, 0x1508, 0x00c6, 0x7034, 0x2060, 0x2c04, 0x7822, 0x6004,
++	0x7826, 0x6008, 0x782a, 0x781b, 0x0001, 0x2091, 0x4080, 0x7038,
++	0x8001, 0x703a, 0xa005, 0x1130, 0x7033, 0xc6b2, 0x7037, 0xc6b2,
++	0x00ce, 0x0048, 0xac80, 0x0004, 0xa0fa, 0xc6f2, 0x0210, 0x2001,
++	0xc6b2, 0x7036, 0x00ce, 0x00fe, 0x012e, 0x00ee, 0x0005, 0x0026,
++	0x2001, 0xc653, 0x2004, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c,
++	0x407d, 0x002e, 0x0005, 0x81ff, 0x1904, 0x3179, 0x0126, 0x2091,
++	0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x5f22,
++	0x1178, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, 0x2003,
++	0x0001, 0xa085, 0x0001, 0x080c, 0x5f66, 0x080c, 0x5e5a, 0x0010,
++	0x080c, 0x4e5b, 0x012e, 0x0804, 0x3154, 0x7824, 0x2008, 0xa18c,
++	0xfffd, 0x1128, 0x61e0, 0xa10d, 0x61e2, 0x0804, 0x3154, 0x0804,
++	0x317c, 0x81ff, 0x1904, 0x3179, 0x6000, 0xa086, 0x0003, 0x1904,
++	0x3179, 0x2001, 0xc653, 0x2004, 0xd0ac, 0x1904, 0x3179, 0x080c,
++	0x404b, 0x0904, 0x317c, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006,
++	0x1120, 0x7828, 0xa005, 0x0904, 0x3154, 0x00c6, 0x080c, 0x4026,
++	0x00ce, 0x0904, 0x3179, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838,
++	0xc0fd, 0x683a, 0x080c, 0xaea2, 0x0904, 0x3179, 0x7007, 0x0003,
++	0x701b, 0x415b, 0x0005, 0x6830, 0xa086, 0x0100, 0x0904, 0x3179,
++	0x0804, 0x3154, 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1904,
++	0x3179, 0x7f24, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x4026,
++	0x0904, 0x3179, 0x2009, 0x0000, 0x2031, 0x0000, 0x7023, 0x0000,
++	0x702f, 0x0000, 0xad80, 0x0005, 0x7026, 0x20a0, 0x080c, 0x533d,
++	0x1904, 0x41e1, 0x6004, 0xa0c4, 0x00ff, 0xa8c6, 0x0006, 0x0148,
++	0xa0c4, 0xff00, 0xa8c6, 0x0600, 0x0120, 0x080c, 0x56ed, 0x1904,
++	0x41e1, 0xd794, 0x1110, 0xd784, 0x0158, 0xac80, 0x0006, 0x2098,
++	0x3400, 0x20a9, 0x0004, 0x53a3, 0x080c, 0x3e8f, 0xd794, 0x0148,
++	0xac80, 0x000a, 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, 0x080c,
++	0x3e8f, 0xa186, 0x007e, 0x0178, 0xa186, 0x0080, 0x0160, 0x6004,
++	0xa084, 0x00ff, 0xa0c2, 0x0006, 0x1210, 0xc1fd, 0x0020, 0x080c,
++	0x55de, 0x1108, 0xc1fd, 0x21a2, 0xc1fc, 0xd794, 0x01d8, 0xac80,
++	0x0000, 0x2098, 0x94a0, 0x20a9, 0x0002, 0x53a3, 0xac80, 0x0003,
++	0x20a6, 0x94a0, 0xac80, 0x0004, 0x2098, 0x3400, 0x20a9, 0x0002,
++	0x53a3, 0x080c, 0x3e81, 0xac80, 0x0026, 0x2098, 0x20a9, 0x0002,
++	0x53a3, 0x0008, 0x94a0, 0xd794, 0x0110, 0xa6b0, 0x000b, 0xa6b0,
++	0x0005, 0x8108, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x0118, 0xa186,
++	0x0100, 0x0040, 0xd78c, 0x0120, 0xa186, 0x0100, 0x0170, 0x0018,
++	0xa186, 0x007e, 0x0150, 0xd794, 0x0118, 0xa686, 0x0020, 0x0010,
++	0xa686, 0x0028, 0x0150, 0x0804, 0x417e, 0x86ff, 0x1120, 0x7120,
++	0x810b, 0x0804, 0x3154, 0x702f, 0x0001, 0x711e, 0x7020, 0xa600,
++	0x7022, 0x772a, 0x2061, 0xc6f2, 0x6007, 0x0000, 0x6612, 0x7024,
++	0x600e, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x080c, 0x164d,
++	0x7007, 0x0002, 0x701b, 0x421d, 0x0005, 0x702c, 0xa005, 0x1170,
++	0x711c, 0x7024, 0x20a0, 0x7728, 0x2031, 0x0000, 0x2061, 0xc6f2,
++	0x6224, 0x6328, 0x642c, 0x6530, 0x0804, 0x417e, 0x7120, 0x810b,
++	0x0804, 0x3154, 0x2029, 0x007e, 0x7924, 0x7a28, 0x7b2c, 0x7c38,
++	0xa184, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x317c, 0xa502,
++	0x0a04, 0x317c, 0xa184, 0x00ff, 0xa0e2, 0x0020, 0x0a04, 0x317c,
++	0xa502, 0x0a04, 0x317c, 0xa284, 0xff00, 0x8007, 0xa0e2, 0x0020,
++	0x0a04, 0x317c, 0xa502, 0x0a04, 0x317c, 0xa284, 0x00ff, 0xa0e2,
++	0x0020, 0x0a04, 0x317c, 0xa502, 0x0a04, 0x317c, 0xa384, 0xff00,
++	0x8007, 0xa0e2, 0x0020, 0x0a04, 0x317c, 0xa502, 0x0a04, 0x317c,
++	0xa384, 0x00ff, 0xa0e2, 0x0020, 0x0a04, 0x317c, 0xa502, 0x0a04,
++	0x317c, 0xa484, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x317c,
++	0xa502, 0x0a04, 0x317c, 0xa484, 0x00ff, 0xa0e2, 0x0020, 0x0a04,
++	0x317c, 0xa502, 0x0a04, 0x317c, 0x2061, 0xc900, 0x6102, 0x6206,
++	0x630a, 0x640e, 0x0804, 0x3154, 0x080c, 0x4026, 0x0904, 0x3179,
++	0x2009, 0x0020, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x4067,
++	0x701b, 0x429b, 0x0005, 0x0126, 0xade8, 0x000d, 0x2001, 0x0138,
++	0x2003, 0x0000, 0x00e6, 0x2071, 0xc96a, 0x700c, 0x7110, 0xa106,
++	0x1de0, 0x00ee, 0x2091, 0x8000, 0x6800, 0xa005, 0x0904, 0x432f,
++	0x6804, 0x2008, 0xa18c, 0xffe0, 0x1904, 0x432f, 0x680c, 0xa005,
++	0x0904, 0x432f, 0xa082, 0xff01, 0x1a04, 0x432f, 0x6810, 0xa082,
++	0x005c, 0x0a04, 0x432f, 0x6824, 0x2008, 0xa082, 0x0008, 0x0a04,
++	0x432f, 0xa182, 0x0400, 0x1a04, 0x432f, 0x080c, 0x7394, 0x6820,
++	0x8000, 0x6822, 0x6944, 0x6820, 0xa102, 0x0a04, 0x432f, 0x6828,
++	0x6944, 0x810c, 0xa102, 0x0a04, 0x432f, 0x6840, 0xa082, 0x000f,
++	0x1a04, 0x432f, 0x00d6, 0x6848, 0xa005, 0x0148, 0x2008, 0x2069,
++	0xc600, 0x68e8, 0xa108, 0x68b0, 0xa102, 0x1208, 0x69ea, 0x00de,
++	0x20a9, 0x0020, 0x2d98, 0x2069, 0xc682, 0x2da0, 0x53a3, 0x00d6,
++	0x080c, 0x15e5, 0x2d00, 0x00de, 0x0904, 0x4346, 0x684e, 0x080c,
++	0x725b, 0x05d8, 0x080c, 0x7158, 0x080c, 0x5695, 0x0580, 0x00c6,
++	0x2061, 0x0100, 0x6104, 0xa18d, 0x8000, 0x6106, 0x610c, 0xa18d,
++	0x0300, 0xa18c, 0xffbf, 0x610e, 0x2001, 0xc8d4, 0x200c, 0xa18d,
++	0x0300, 0xa18c, 0xffbf, 0x2102, 0x6b10, 0x2061, 0xc96a, 0x6316,
++	0x00ce, 0x685f, 0x0000, 0x2001, 0xc696, 0x2003, 0x0000, 0x080c,
++	0x2a95, 0x2001, 0x0138, 0x2102, 0x012e, 0x0804, 0x3154, 0x080c,
++	0x2a95, 0x2001, 0x0138, 0x2102, 0x012e, 0x0804, 0x317c, 0x080c,
++	0x7475, 0x080c, 0x7484, 0x080c, 0x7147, 0x2001, 0xc695, 0x206c,
++	0x080c, 0x1619, 0x2001, 0xc695, 0x2003, 0x0000, 0x2001, 0xc63a,
++	0x2003, 0x0010, 0x080c, 0x2a95, 0x2001, 0x0138, 0x2102, 0x012e,
++	0x0804, 0x3179, 0x2001, 0xc756, 0x2004, 0xa086, 0x0000, 0x0904,
++	0x3179, 0x080c, 0x768f, 0x1904, 0x3179, 0x2001, 0xc8e5, 0x2004,
++	0xa086, 0xaaaa, 0x0138, 0x2001, 0xc635, 0x2004, 0xa084, 0x0028,
++	0x0904, 0x3170, 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1904,
++	0x3179, 0x7924, 0x810c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c,
++	0x4026, 0x0904, 0x3179, 0x080c, 0x4067, 0x701b, 0x4380, 0x0005,
++	0x080c, 0x958d, 0x0904, 0x3179, 0x2001, 0xc8d3, 0x2004, 0x601a,
++	0x0016, 0x0026, 0x2001, 0xc61c, 0x2004, 0x8007, 0x6934, 0xa105,
++	0x6836, 0x2001, 0xc61d, 0x2004, 0x8007, 0x683a, 0x002e, 0x001e,
++	0x2d00, 0x6012, 0x601f, 0x0001, 0x2009, 0x0040, 0x080c, 0x9613,
++	0x0804, 0x3154, 0x0804, 0x3179, 0x2001, 0xc756, 0x200c, 0xa18e,
++	0x0000, 0x0904, 0x4402, 0x2001, 0x0101, 0x200c, 0xa18c, 0x7fff,
++	0x2102, 0x2001, 0x0103, 0x200c, 0xa18c, 0xfeff, 0xa18c, 0xfdff,
++	0xa18d, 0x0040, 0x2102, 0x2001, 0xc8d4, 0x200c, 0xa18c, 0xfeff,
++	0xa18c, 0xfdff, 0xa18d, 0x0040, 0x2102, 0x2001, 0x0138, 0x2003,
++	0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x24f3, 0x012e, 0x0128,
++	0x20a9, 0x006e, 0x1f04, 0x43d2, 0x0ca0, 0x2001, 0xc756, 0x2003,
++	0x0000, 0x080c, 0x2a95, 0x2001, 0x0138, 0x2102, 0x0126, 0x2091,
++	0x8000, 0x2001, 0xc695, 0x200c, 0x81ff, 0x0138, 0x2168, 0x080c,
++	0x1619, 0x2001, 0xc695, 0x2003, 0x0000, 0x2001, 0xc8d3, 0x200c,
++	0x81ff, 0x0138, 0x2168, 0x080c, 0x1619, 0x2001, 0xc8d3, 0x2003,
++	0x0000, 0x2001, 0xc63a, 0x2003, 0x0010, 0x080c, 0x7475, 0x080c,
++	0x7484, 0x012e, 0x0804, 0x3154, 0x7824, 0x00e6, 0x2071, 0xc682,
++	0x00ee, 0x0804, 0x3154, 0x0006, 0x2001, 0xc653, 0x2004, 0xd0cc,
++	0x000e, 0x0005, 0x0006, 0x2001, 0xc672, 0x2004, 0xd0bc, 0x000e,
++	0x0005, 0x6168, 0x7a24, 0x6300, 0x82ff, 0x1118, 0x7926, 0x0804,
++	0x3154, 0x83ff, 0x1904, 0x317c, 0x2001, 0xfff0, 0xa200, 0x1a04,
++	0x317c, 0x2019, 0xffff, 0x606c, 0xa302, 0xa200, 0x0a04, 0x317c,
++	0x7926, 0x626a, 0x0804, 0x3154, 0x2001, 0xc600, 0x2004, 0xa086,
++	0x0003, 0x1904, 0x3179, 0x7c28, 0x7d24, 0x7e38, 0x7f2c, 0x080c,
++	0x4026, 0x0904, 0x3179, 0x2009, 0x0000, 0x2019, 0x0000, 0x7023,
++	0x0000, 0x702f, 0x0000, 0xad80, 0x0003, 0x7026, 0x20a0, 0xa1e0,
++	0xc77b, 0x2c64, 0x8cff, 0x01b8, 0x6004, 0xa084, 0x00ff, 0xa086,
++	0x0006, 0x0130, 0x6004, 0xa084, 0xff00, 0xa086, 0x0600, 0x1158,
++	0x6014, 0x20a2, 0x94a0, 0x6010, 0x8007, 0xa105, 0x8007, 0x20a2,
++	0x94a0, 0xa398, 0x0002, 0x8108, 0xa182, 0x00ff, 0x0120, 0xa386,
++	0x002a, 0x0148, 0x08e0, 0x83ff, 0x1120, 0x7120, 0x810c, 0x0804,
++	0x3154, 0x702f, 0x0001, 0x711e, 0x7020, 0xa300, 0x7022, 0x2061,
++	0xc6f2, 0x6007, 0x0000, 0x6312, 0x7024, 0x600e, 0x6426, 0x652a,
++	0x662e, 0x6732, 0x2c10, 0x080c, 0x164d, 0x7007, 0x0002, 0x701b,
++	0x4492, 0x0005, 0x702c, 0xa005, 0x1168, 0x711c, 0x7024, 0x20a0,
++	0x2019, 0x0000, 0x2061, 0xc6f2, 0x6424, 0x6528, 0x662c, 0x6730,
++	0x0804, 0x444f, 0x7120, 0x810c, 0x0804, 0x3154, 0x81ff, 0x1904,
++	0x3179, 0x60d4, 0xd0ac, 0x1118, 0xd09c, 0x0904, 0x3179, 0x080c,
++	0x4026, 0x0904, 0x3179, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
++	0x080c, 0x4067, 0x701b, 0x44bd, 0x0005, 0x00d6, 0xade8, 0x000d,
++	0x6828, 0xa0be, 0x7000, 0x0148, 0xa0be, 0x7100, 0x0130, 0xa0be,
++	0x7200, 0x0118, 0x00de, 0x0804, 0x317c, 0x6820, 0x6924, 0x080c,
++	0x29c7, 0x1510, 0x080c, 0x52e1, 0x11f8, 0x7122, 0x6612, 0x6516,
++	0x6e18, 0x00c6, 0x080c, 0x4026, 0x01b8, 0x080c, 0x4026, 0x01a0,
++	0x00ce, 0x00de, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x6823,
++	0x0000, 0x6804, 0x2068, 0x080c, 0xadf5, 0x0904, 0x3179, 0x7007,
++	0x0003, 0x701b, 0x44f7, 0x0005, 0x00de, 0x0804, 0x3179, 0x7120,
++	0x080c, 0x2f41, 0x6820, 0xa086, 0x8001, 0x0904, 0x3179, 0x2d00,
++	0x701e, 0x6804, 0xa080, 0x0002, 0x0006, 0x20a9, 0x002a, 0x2098,
++	0x20a0, 0x080c, 0x4ecb, 0x000e, 0xade8, 0x000d, 0x6a08, 0x6b0c,
++	0x6c10, 0x6d14, 0x2061, 0xc6f2, 0x6007, 0x0000, 0x6e00, 0x6f28,
++	0xa7c6, 0x7000, 0x1108, 0x0018, 0xa7c6, 0x7100, 0x1140, 0xa6c2,
++	0x0004, 0x0a04, 0x317c, 0x2009, 0x0004, 0x0804, 0x406a, 0xa7c6,
++	0x7200, 0x1904, 0x317c, 0xa6c2, 0x0054, 0x0a04, 0x317c, 0x600e,
++	0x6013, 0x002a, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x080c,
++	0x164d, 0x7007, 0x0002, 0x701b, 0x453e, 0x0005, 0x701c, 0x2068,
++	0x6804, 0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x0006, 0x20a9,
++	0x002a, 0x2098, 0x20a0, 0x080c, 0x4ecb, 0x000e, 0x2009, 0x002a,
++	0x2061, 0xc6f2, 0x6224, 0x6328, 0x642c, 0x6530, 0x0804, 0x406a,
++	0x81ff, 0x1904, 0x3179, 0x792c, 0x2001, 0xc8e7, 0x2102, 0x080c,
++	0x403b, 0x0904, 0x317c, 0x080c, 0x5403, 0x0904, 0x3179, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x5535, 0x012e, 0x0804, 0x3154, 0x7824,
++	0xd08c, 0x1118, 0xd084, 0x0904, 0x3bf0, 0x080c, 0x404b, 0x0904,
++	0x317c, 0x00c6, 0x080c, 0x4026, 0x00ce, 0x1120, 0x2009, 0x0002,
++	0x0804, 0x3179, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0128,
++	0xa08e, 0x0004, 0x0110, 0xa08e, 0x0005, 0x15b8, 0x7824, 0xd08c,
++	0x0120, 0x6000, 0xc08c, 0x6002, 0x0030, 0x2001, 0xc653, 0x2004,
++	0xd0b4, 0x0904, 0x3c2c, 0x7824, 0xa084, 0xff00, 0xa08e, 0x7e00,
++	0x0904, 0x3c2c, 0xa08e, 0x7f00, 0x0904, 0x3c2c, 0xa08e, 0x8000,
++	0x0904, 0x3c2c, 0x6000, 0xd08c, 0x1904, 0x3c2c, 0x6837, 0x0000,
++	0x6838, 0xc0fd, 0x683a, 0x080c, 0xae11, 0x1120, 0x2009, 0x0003,
++	0x0804, 0x3179, 0x7007, 0x0003, 0x701b, 0x45bf, 0x0005, 0x080c,
++	0x404b, 0x0904, 0x317c, 0x0804, 0x3c2c, 0x2009, 0xc631, 0x210c,
++	0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3179, 0x2001, 0xc600,
++	0x2004, 0xa086, 0x0003, 0x0120, 0x2009, 0x0007, 0x0804, 0x3179,
++	0x2001, 0xc653, 0x2004, 0xd0ac, 0x0120, 0x2009, 0x0008, 0x0804,
++	0x3179, 0x609c, 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x3c2c, 0x6837,
++	0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c, 0xaea2,
++	0x1120, 0x2009, 0x0003, 0x0804, 0x3179, 0x7007, 0x0003, 0x701b,
++	0x45fa, 0x0005, 0x6830, 0xa086, 0x0100, 0x1120, 0x2009, 0x0004,
++	0x0804, 0x3179, 0x080c, 0x404b, 0x0904, 0x317c, 0x0804, 0x458e,
++	0x81ff, 0x2009, 0x0001, 0x1904, 0x3179, 0x6000, 0xa086, 0x0003,
++	0x2009, 0x0007, 0x1904, 0x3179, 0x2001, 0xc653, 0x2004, 0xd0ac,
++	0x2009, 0x0008, 0x1904, 0x3179, 0x080c, 0x404b, 0x0904, 0x317c,
++	0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x2009, 0x0009, 0x1904,
++	0x3179, 0x00c6, 0x080c, 0x4026, 0x00ce, 0x2009, 0x0002, 0x0904,
++	0x3179, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a,
++	0x7928, 0xa194, 0xff00, 0xa18c, 0x00ff, 0xa006, 0x82ff, 0x1128,
++	0xc0ed, 0x6952, 0x792c, 0x6956, 0x0048, 0xa28e, 0x0100, 0x1904,
++	0x317c, 0xc0e5, 0x6853, 0x0000, 0x6857, 0x0000, 0x683e, 0x080c,
++	0xb05f, 0x2009, 0x0003, 0x0904, 0x3179, 0x7007, 0x0003, 0x701b,
++	0x465a, 0x0005, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004, 0x0904,
++	0x3179, 0x0804, 0x3154, 0x81ff, 0x2009, 0x0001, 0x1904, 0x3179,
++	0x6000, 0xa086, 0x0003, 0x2009, 0x0007, 0x1904, 0x3179, 0x080c,
++	0x404b, 0x0904, 0x317c, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006,
++	0x2009, 0x0009, 0x1904, 0x3179, 0x00c6, 0x080c, 0x4026, 0x00ce,
++	0x2009, 0x0002, 0x0904, 0x3179, 0xad80, 0x000f, 0x2009, 0x0008,
++	0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x4067, 0x701b, 0x4691,
++	0x0005, 0x00d6, 0xade8, 0x000f, 0x6800, 0xa086, 0x0500, 0x1140,
++	0x6804, 0xa005, 0x1128, 0x6808, 0xa084, 0xff00, 0x1108, 0x0018,
++	0x00de, 0x1904, 0x317c, 0x00de, 0x6837, 0x0000, 0x6833, 0x0000,
++	0x6838, 0xc0fd, 0x683a, 0x00c6, 0x080c, 0x404b, 0x1118, 0x00ce,
++	0x0804, 0x317c, 0x080c, 0xb0ae, 0x2009, 0x0003, 0x00ce, 0x0904,
++	0x3179, 0x7007, 0x0003, 0x701b, 0x46be, 0x0005, 0x6830, 0xa086,
++	0x0100, 0x2009, 0x0004, 0x0904, 0x3179, 0x0804, 0x3154, 0x81ff,
++	0x0120, 0x2009, 0x0001, 0x0804, 0x3179, 0x6000, 0xa086, 0x0003,
++	0x0120, 0x2009, 0x0007, 0x0804, 0x3179, 0x7e24, 0x860f, 0xa18c,
++	0x00ff, 0xa6b4, 0x00ff, 0x080c, 0x533d, 0x1904, 0x317c, 0xa186,
++	0x007f, 0x0150, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0120,
++	0x2009, 0x0009, 0x0804, 0x3179, 0x00c6, 0x080c, 0x4026, 0x00ce,
++	0x1120, 0x2009, 0x0002, 0x0804, 0x3179, 0x6837, 0x0000, 0x6838,
++	0xc0fd, 0x683a, 0x2001, 0x0100, 0x8007, 0x680a, 0x080c, 0xae2c,
++	0x1120, 0x2009, 0x0003, 0x0804, 0x3179, 0x7007, 0x0003, 0x701b,
++	0x470a, 0x0005, 0x6808, 0x8007, 0xa086, 0x0100, 0x1120, 0x2009,
++	0x0004, 0x0804, 0x3179, 0x68b0, 0x6836, 0x6810, 0x8007, 0xa084,
++	0x00ff, 0x800c, 0x6814, 0x8007, 0xa084, 0x00ff, 0x8004, 0xa080,
++	0x0002, 0xa108, 0xad80, 0x0004, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
++	0x0804, 0x406a, 0x080c, 0x4026, 0x1120, 0x2009, 0x0002, 0x0804,
++	0x3179, 0x7924, 0xa194, 0xff00, 0xa18c, 0x00ff, 0x8217, 0x82ff,
++	0x0110, 0x0804, 0x317c, 0x2009, 0x001a, 0x7a2c, 0x7b28, 0x7c3c,
++	0x7d38, 0x080c, 0x4067, 0x701b, 0x4746, 0x0005, 0x2001, 0xc62a,
++	0x2003, 0x0001, 0xad80, 0x000d, 0x2098, 0x20a9, 0x001a, 0x20a1,
++	0xc90d, 0x53a3, 0x0804, 0x3154, 0x080c, 0x4026, 0x1120, 0x2009,
++	0x0002, 0x0804, 0x3179, 0x7924, 0xa194, 0xff00, 0xa18c, 0x00ff,
++	0x8217, 0x82ff, 0x0110, 0x0804, 0x317c, 0x2099, 0xc90d, 0x20a0,
++	0x20a9, 0x001a, 0x53a3, 0x2009, 0x001a, 0x7a2c, 0x7b28, 0x7c3c,
++	0x7d38, 0x0804, 0x406a, 0x7824, 0xa08a, 0x1000, 0x1a04, 0x317c,
++	0x0126, 0x2091, 0x8000, 0x8003, 0x800b, 0x810b, 0xa108, 0x00c6,
++	0x2061, 0xc93a, 0x6142, 0x00ce, 0x012e, 0x0804, 0x3154, 0x00c6,
++	0x080c, 0x5f22, 0x1188, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001,
++	0xc600, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5f66, 0x080c,
++	0x5e5a, 0x080c, 0x1519, 0x0038, 0x2061, 0xc600, 0x6030, 0xc09d,
++	0x6032, 0x080c, 0x4e5b, 0x00ce, 0x0005, 0x0126, 0x2091, 0x8000,
++	0x00c6, 0x2061, 0xc93a, 0x7924, 0x6152, 0x614e, 0x6057, 0x0000,
++	0x604b, 0x0009, 0x7838, 0x606a, 0x783c, 0x6066, 0x7828, 0x6062,
++	0x782c, 0x605e, 0x2061, 0xc8e8, 0x2001, 0xc94f, 0x600e, 0x6013,
++	0x0001, 0x6017, 0x0002, 0x6007, 0x0000, 0x6037, 0x0000, 0x00ce,
++	0x012e, 0x0804, 0x3154, 0x0126, 0x00c6, 0x00e6, 0x2061, 0x0100,
++	0x2071, 0xc600, 0x6044, 0xd0a4, 0x11b0, 0xd084, 0x0118, 0x080c,
++	0x4942, 0x0068, 0xd08c, 0x0118, 0x080c, 0x4863, 0x0040, 0xd094,
++	0x0118, 0x080c, 0x4834, 0x0018, 0xd09c, 0x0108, 0x0061, 0x00ee,
++	0x00ce, 0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, 0xc19d,
++	0x612a, 0x001e, 0x0ca0, 0x624c, 0xa286, 0xf0f0, 0x1150, 0x6048,
++	0xa086, 0xf0f0, 0x0130, 0x624a, 0x6043, 0x0090, 0x6043, 0x0010,
++	0x0490, 0xa294, 0xff00, 0xa296, 0xf700, 0x0178, 0x7134, 0xd1a4,
++	0x1160, 0x6240, 0xa295, 0x0100, 0x6242, 0xa294, 0x0010, 0x0128,
++	0x2009, 0x00f7, 0x080c, 0x4eeb, 0x00f0, 0x6040, 0xa084, 0x0010,
++	0xa085, 0x0140, 0x6042, 0x6043, 0x0000, 0x707b, 0x0000, 0x7097,
++	0x0001, 0x70bb, 0x0000, 0x70d7, 0x0000, 0x2009, 0xcdc0, 0x200b,
++	0x0000, 0x708b, 0x0000, 0x707f, 0x000a, 0x2009, 0x000a, 0x2011,
++	0x4e11, 0x080c, 0x7036, 0x0005, 0x0156, 0x2001, 0xc674, 0x2004,
++	0xd08c, 0x0110, 0x7053, 0xffff, 0x707c, 0xa005, 0x1510, 0x2011,
++	0x4e11, 0x080c, 0x6fad, 0x6040, 0xa094, 0x0010, 0xa285, 0x0020,
++	0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, 0x484b,
++	0x6242, 0x708f, 0x0000, 0x6040, 0xa094, 0x0010, 0xa285, 0x0080,
++	0x6042, 0x6242, 0x0030, 0x6242, 0x708f, 0x0000, 0x7083, 0x0000,
++	0x0000, 0x015e, 0x0005, 0x7080, 0xa08a, 0x0003, 0x1210, 0x0023,
++	0x0010, 0x080c, 0x1519, 0x0005, 0x486f, 0x48bf, 0x4941, 0x00f6,
++	0x7083, 0x0001, 0x20e1, 0xa000, 0xe000, 0x20e1, 0x8700, 0x080c,
++	0x25bb, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2079, 0xcc00, 0x207b,
++	0x2200, 0x7807, 0x00ef, 0x780b, 0x0000, 0x780f, 0x00ef, 0x7813,
++	0x0138, 0x7817, 0x0000, 0x781b, 0x0000, 0x781f, 0x0000, 0x7823,
++	0xffff, 0x7827, 0xffff, 0x782b, 0x0000, 0x782f, 0x0000, 0x2079,
++	0xcc0c, 0x207b, 0x1101, 0x7807, 0x0000, 0x2099, 0xc605, 0x20a1,
++	0xcc0e, 0x20a9, 0x0004, 0x53a3, 0x2079, 0xcc12, 0x207b, 0x0000,
++	0x7807, 0x0000, 0x2099, 0xcc00, 0x20a1, 0x020b, 0x20a9, 0x0014,
++	0x53a6, 0x60c3, 0x000c, 0x600f, 0x0000, 0x080c, 0x4e42, 0x00fe,
++	0x7087, 0x0000, 0x6043, 0x0008, 0x6043, 0x0000, 0x0005, 0x00d6,
++	0x7084, 0x7087, 0x0000, 0xa025, 0x0904, 0x4929, 0x6020, 0xd0b4,
++	0x1904, 0x4927, 0x7194, 0x81ff, 0x0904, 0x4917, 0xa486, 0x000c,
++	0x1904, 0x4922, 0xa480, 0x0018, 0x8004, 0x20a8, 0x2011, 0xcc80,
++	0x2019, 0xcc00, 0x220c, 0x2304, 0xa106, 0x11b8, 0x8210, 0x8318,
++	0x1f04, 0x48da, 0x6043, 0x0004, 0x608b, 0xbc94, 0x608f, 0xf0f0,
++	0x6043, 0x0006, 0x7083, 0x0002, 0x708f, 0x0002, 0x2009, 0x07d0,
++	0x2011, 0x4e18, 0x080c, 0x7036, 0x0490, 0x2069, 0xcc80, 0x6930,
++	0xa18e, 0x1101, 0x1538, 0x6834, 0xa005, 0x1520, 0x6900, 0xa18c,
++	0x00ff, 0x1118, 0x6804, 0xa005, 0x0190, 0x2011, 0xcc8e, 0x2019,
++	0xc605, 0x20a9, 0x0004, 0x220c, 0x2304, 0xa102, 0x0230, 0x1190,
++	0x8210, 0x8318, 0x1f04, 0x490b, 0x0068, 0x7097, 0x0000, 0x20e1,
++	0x9080, 0x20e1, 0x4000, 0x2099, 0xcc80, 0x20a1, 0x020b, 0x20a9,
++	0x0014, 0x53a6, 0x6043, 0x0008, 0x6043, 0x0000, 0x0010, 0x00de,
++	0x0005, 0x6040, 0xa085, 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8,
++	0x60c3, 0x000c, 0x2011, 0xc931, 0x2013, 0x0000, 0x7087, 0x0000,
++	0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x8bec,
++	0x0c30, 0x0005, 0x708c, 0xa08a, 0x001d, 0x1210, 0x0023, 0x0010,
++	0x080c, 0x1519, 0x0005, 0x4975, 0x4984, 0x49ac, 0x49c5, 0x49e9,
++	0x4a11, 0x4a35, 0x4a66, 0x4a8a, 0x4ab2, 0x4ae9, 0x4b11, 0x4b2d,
++	0x4b43, 0x4b63, 0x4b76, 0x4b7e, 0x4bae, 0x4bd2, 0x4bfa, 0x4c1e,
++	0x4c4f, 0x4c8c, 0x4cbb, 0x4cd7, 0x4d16, 0x4d36, 0x4d4f, 0x4d50,
++	0x00c6, 0x2061, 0xc600, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004,
++	0xa084, 0xfff9, 0x6006, 0x00ce, 0x0005, 0x608b, 0xbc94, 0x608f,
++	0xf0f0, 0x6043, 0x0002, 0x708f, 0x0001, 0x2009, 0x07d0, 0x2011,
++	0x4e18, 0x080c, 0x7036, 0x0005, 0x00f6, 0x7084, 0xa086, 0x0014,
++	0x1508, 0x6043, 0x0000, 0x6020, 0xd0b4, 0x11e0, 0x2079, 0xcc80,
++	0x7a30, 0xa296, 0x1102, 0x11a0, 0x7834, 0xa005, 0x1188, 0x7a38,
++	0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x2011,
++	0x4e18, 0x080c, 0x6fad, 0x708f, 0x0010, 0x080c, 0x4b7e, 0x0010,
++	0x080c, 0x4e5b, 0x00fe, 0x0005, 0x708f, 0x0003, 0x6043, 0x0004,
++	0x2011, 0x4e18, 0x080c, 0x6fad, 0x080c, 0x4ed3, 0x20a3, 0x1102,
++	0x20a3, 0x0000, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x1f04, 0x49bc,
++	0x60c3, 0x0014, 0x080c, 0x4e42, 0x0005, 0x00f6, 0x7084, 0xa005,
++	0x01f0, 0x2011, 0x4e18, 0x080c, 0x6fad, 0xa086, 0x0014, 0x11a8,
++	0x2079, 0xcc80, 0x7a30, 0xa296, 0x1102, 0x1178, 0x7834, 0xa005,
++	0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb,
++	0x0001, 0x708f, 0x0004, 0x0029, 0x0010, 0x080c, 0x4e5b, 0x00fe,
++	0x0005, 0x708f, 0x0005, 0x080c, 0x4ed3, 0x20a3, 0x1103, 0x20a3,
++	0x0000, 0x3430, 0x2011, 0xcc8e, 0x080c, 0x4f24, 0x1160, 0x7078,
++	0xa005, 0x1148, 0x7150, 0xa186, 0xffff, 0x0128, 0x080c, 0x4ddc,
++	0x0110, 0x080c, 0x4f02, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4e42,
++	0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, 0x4e18, 0x080c,
++	0x6fad, 0xa086, 0x0014, 0x11a8, 0x2079, 0xcc80, 0x7a30, 0xa296,
++	0x1103, 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128,
++	0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, 0x0006, 0x0029,
++	0x0010, 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x708f, 0x0007, 0x080c,
++	0x4ed3, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011, 0xcc8e,
++	0x080c, 0x4f24, 0x11a8, 0x7078, 0xa005, 0x1190, 0x7158, 0xa186,
++	0xffff, 0x0170, 0xa180, 0x2f6e, 0x200d, 0xa18c, 0xff00, 0x810f,
++	0x080c, 0x4ddc, 0x0128, 0x080c, 0x4412, 0x0110, 0x080c, 0x2a11,
++	0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x60c3, 0x0014, 0x080c, 0x4e42, 0x0005, 0x00f6, 0x7084,
++	0xa005, 0x01f0, 0x2011, 0x4e18, 0x080c, 0x6fad, 0xa086, 0x0014,
++	0x11a8, 0x2079, 0xcc80, 0x7a30, 0xa296, 0x1104, 0x1178, 0x7834,
++	0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110,
++	0x70bb, 0x0001, 0x708f, 0x0008, 0x0029, 0x0010, 0x080c, 0x4e5b,
++	0x00fe, 0x0005, 0x708f, 0x0009, 0x080c, 0x4ed3, 0x20a3, 0x1105,
++	0x20a3, 0x0100, 0x3430, 0x080c, 0x4f24, 0x1150, 0x7078, 0xa005,
++	0x1138, 0x080c, 0x4d51, 0x1170, 0xa085, 0x0001, 0x080c, 0x2a11,
++	0x20a9, 0x0008, 0x2099, 0xcc8e, 0x26a0, 0x53a6, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4e42, 0x0010, 0x080c,
++	0x4968, 0x0005, 0x00f6, 0x7084, 0xa005, 0x0588, 0x2011, 0x4e18,
++	0x080c, 0x6fad, 0xa086, 0x0014, 0x1540, 0x2079, 0xcc80, 0x7a30,
++	0xa296, 0x1105, 0x1510, 0x7834, 0x2011, 0x0100, 0xa21e, 0x1160,
++	0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001,
++	0x708f, 0x000a, 0x00b1, 0x0098, 0xa005, 0x1178, 0x7a38, 0xd2fc,
++	0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708b, 0x0000,
++	0x708f, 0x000e, 0x080c, 0x4b63, 0x0010, 0x080c, 0x4e5b, 0x00fe,
++	0x0005, 0x708f, 0x000b, 0x2011, 0xcc0e, 0x22a0, 0x20a9, 0x0040,
++	0x2019, 0xffff, 0x43a4, 0x20a9, 0x0002, 0x2009, 0x0000, 0x41a4,
++	0x080c, 0x4ed3, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x080c, 0x4f24,
++	0x0118, 0x2013, 0x0000, 0x0020, 0x7054, 0xa085, 0x0100, 0x2012,
++	0x2298, 0x20a9, 0x0042, 0x53a6, 0x60c3, 0x0084, 0x080c, 0x4e42,
++	0x0005, 0x00f6, 0x7084, 0xa005, 0x01b0, 0x2011, 0x4e18, 0x080c,
++	0x6fad, 0xa086, 0x0084, 0x1168, 0x2079, 0xcc80, 0x7a30, 0xa296,
++	0x1106, 0x1138, 0x7834, 0xa005, 0x1120, 0x708f, 0x000c, 0x0029,
++	0x0010, 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x708f, 0x000d, 0x080c,
++	0x4ed3, 0x20a3, 0x1107, 0x20a3, 0x0000, 0x2099, 0xcc8e, 0x20a9,
++	0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084,
++	0x080c, 0x4e42, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01d0, 0x2011,
++	0x4e18, 0x080c, 0x6fad, 0xa086, 0x0084, 0x1188, 0x2079, 0xcc80,
++	0x7a30, 0xa296, 0x1107, 0x1158, 0x7834, 0xa005, 0x1140, 0x708b,
++	0x0001, 0x080c, 0x4ec5, 0x708f, 0x000e, 0x0029, 0x0010, 0x080c,
++	0x4e5b, 0x00fe, 0x0005, 0x708f, 0x000f, 0x7087, 0x0000, 0x608b,
++	0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009,
++	0x07d0, 0x2011, 0x4e18, 0x080c, 0x6fa1, 0x0005, 0x7084, 0xa005,
++	0x0120, 0x2011, 0x4e18, 0x080c, 0x6fad, 0x0005, 0x708f, 0x0011,
++	0x080c, 0x4f24, 0x11a0, 0x7170, 0x81ff, 0x0188, 0x2009, 0x0000,
++	0x7074, 0xa084, 0x00ff, 0x080c, 0x29c7, 0xa186, 0x007e, 0x0138,
++	0xa186, 0x0080, 0x0120, 0x2011, 0xcc8e, 0x080c, 0x4ddc, 0x20e1,
++	0x9080, 0x20e1, 0x4000, 0x2099, 0xcc80, 0x20a1, 0x020b, 0x7484,
++	0xa480, 0x0018, 0xa080, 0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8,
++	0x53a6, 0x60c3, 0x0014, 0x080c, 0x4e42, 0x0005, 0x00f6, 0x7084,
++	0xa005, 0x01f0, 0x2011, 0x4e18, 0x080c, 0x6fad, 0xa086, 0x0014,
++	0x11a8, 0x2079, 0xcc80, 0x7a30, 0xa296, 0x1103, 0x1178, 0x7834,
++	0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110,
++	0x70bb, 0x0001, 0x708f, 0x0012, 0x0029, 0x0010, 0x080c, 0x4e5b,
++	0x00fe, 0x0005, 0x708f, 0x0013, 0x080c, 0x4edf, 0x20a3, 0x1103,
++	0x20a3, 0x0000, 0x3430, 0x2011, 0xcc8e, 0x080c, 0x4f24, 0x1160,
++	0x7078, 0xa005, 0x1148, 0x7150, 0xa186, 0xffff, 0x0128, 0x080c,
++	0x4ddc, 0x0110, 0x080c, 0x4f02, 0x20a9, 0x0008, 0x2298, 0x26a0,
++	0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c,
++	0x4e42, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, 0x4e18,
++	0x080c, 0x6fad, 0xa086, 0x0014, 0x11a8, 0x2079, 0xcc80, 0x7a30,
++	0xa296, 0x1104, 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc,
++	0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, 0x0014,
++	0x0029, 0x0010, 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x708f, 0x0015,
++	0x080c, 0x4edf, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011,
++	0xcc8e, 0x080c, 0x4f24, 0x11a8, 0x7078, 0xa005, 0x1190, 0x7158,
++	0xa186, 0xffff, 0x0170, 0xa180, 0x2f6e, 0x200d, 0xa18c, 0xff00,
++	0x810f, 0x080c, 0x4ddc, 0x0128, 0x080c, 0x4412, 0x0110, 0x080c,
++	0x2a11, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4e42, 0x0005, 0x00f6,
++	0x7084, 0xa005, 0x05b8, 0x2011, 0x4e18, 0x080c, 0x6fad, 0xa086,
++	0x0014, 0x1570, 0x2079, 0xcc80, 0x7a30, 0xa296, 0x1105, 0x1540,
++	0x7834, 0x2011, 0x0100, 0xa21e, 0x1148, 0x7a38, 0xd2fc, 0x0128,
++	0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x0060, 0xa005, 0x11c0,
++	0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001,
++	0x708b, 0x0000, 0x7a38, 0xd2f4, 0x0138, 0x2001, 0xc674, 0x2004,
++	0xd0a4, 0x1110, 0x70d7, 0x0008, 0x708f, 0x0016, 0x0029, 0x0010,
++	0x080c, 0x4e5b, 0x00fe, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000,
++	0x2099, 0xcc80, 0x20a1, 0x020b, 0x20a9, 0x000e, 0x53a6, 0x3430,
++	0x2011, 0xcc8e, 0x708f, 0x0017, 0x080c, 0x4f24, 0x1150, 0x7078,
++	0xa005, 0x1138, 0x080c, 0x4d51, 0x1170, 0xa085, 0x0001, 0x080c,
++	0x2a11, 0x20a9, 0x0008, 0x2099, 0xcc8e, 0x26a0, 0x53a6, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4e42, 0x0010,
++	0x080c, 0x4968, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01b0, 0x2011,
++	0x4e18, 0x080c, 0x6fad, 0xa086, 0x0084, 0x1168, 0x2079, 0xcc80,
++	0x7a30, 0xa296, 0x1106, 0x1138, 0x7834, 0xa005, 0x1120, 0x708f,
++	0x0018, 0x0029, 0x0010, 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x708f,
++	0x0019, 0x080c, 0x4edf, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x3430,
++	0x2099, 0xcc8e, 0x2039, 0xcc0e, 0x27a0, 0x20a9, 0x0040, 0x53a3,
++	0x080c, 0x4f24, 0x11e8, 0x2728, 0x2514, 0x8207, 0xa084, 0x00ff,
++	0x8000, 0x2018, 0xa294, 0x00ff, 0x8007, 0xa205, 0x202a, 0x7054,
++	0x2310, 0x8214, 0xa2a0, 0xcc0e, 0x2414, 0xa38c, 0x0001, 0x0118,
++	0xa294, 0xff00, 0x0018, 0xa294, 0x00ff, 0x8007, 0xa215, 0x2222,
++	0x2798, 0x26a0, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x60c3, 0x0084, 0x080c, 0x4e42, 0x0005, 0x00f6, 0x7084,
++	0xa005, 0x01d0, 0x2011, 0x4e18, 0x080c, 0x6fad, 0xa086, 0x0084,
++	0x1188, 0x2079, 0xcc80, 0x7a30, 0xa296, 0x1107, 0x1158, 0x7834,
++	0xa005, 0x1140, 0x708b, 0x0001, 0x080c, 0x4ec5, 0x708f, 0x001a,
++	0x0029, 0x0010, 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x708f, 0x001b,
++	0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xcc80, 0x20a1, 0x020b,
++	0x7484, 0xa480, 0x0018, 0xa080, 0x0007, 0xa084, 0x03f8, 0x8004,
++	0x20a8, 0x53a6, 0x60c3, 0x0084, 0x080c, 0x4e42, 0x0005, 0x0005,
++	0x0005, 0x0086, 0x0096, 0x2029, 0xc653, 0x252c, 0x20a9, 0x0008,
++	0x2041, 0xcc0e, 0x28a0, 0x2099, 0xcc8e, 0x53a3, 0x20a9, 0x0008,
++	0x2011, 0x0007, 0xd5d4, 0x0110, 0x2011, 0x0000, 0x2800, 0xa200,
++	0x200c, 0xa1a6, 0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210, 0x0008,
++	0x8211, 0x1f04, 0x4d66, 0x0804, 0x4dd4, 0x82ff, 0x1160, 0xd5d4,
++	0x0120, 0xa1a6, 0x3fff, 0x0d90, 0x0020, 0xa1a6, 0x3fff, 0x0904,
++	0x4dd4, 0xa18d, 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4,
++	0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, 0x0008,
++	0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, 0x1f04,
++	0x4d8c, 0x04d0, 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, 0x1f04,
++	0x4d9e, 0x2328, 0x8529, 0xa2be, 0x0007, 0x0158, 0x0006, 0x2039,
++	0x0007, 0x2200, 0xa73a, 0x000e, 0x27a8, 0xa5a8, 0x0010, 0x1f04,
++	0x4dad, 0x7552, 0xa5c8, 0x2f6e, 0x292d, 0xa5ac, 0x00ff, 0x7576,
++	0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x29f1, 0x001e, 0x60e7,
++	0x0000, 0x65ea, 0x2018, 0x2304, 0xa405, 0x201a, 0x707b, 0x0001,
++	0x26a0, 0x2898, 0x20a9, 0x0008, 0x53a6, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0xa085, 0x0001, 0x0028, 0xa006, 0x0018, 0xa006, 0x080c,
++	0x1519, 0x009e, 0x008e, 0x0005, 0x2118, 0x2021, 0x0000, 0x2001,
++	0x0007, 0xa39a, 0x0010, 0x0218, 0x8420, 0x8001, 0x0cd0, 0x2118,
++	0x84ff, 0x0120, 0xa39a, 0x0010, 0x8421, 0x1de0, 0x2021, 0x0001,
++	0x83ff, 0x0118, 0x8423, 0x8319, 0x1de8, 0xa238, 0x2704, 0xa42c,
++	0x11b8, 0xa405, 0x203a, 0x7152, 0xa1a0, 0x2f6e, 0x242d, 0xa5ac,
++	0x00ff, 0x7576, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x29f1,
++	0x001e, 0x60e7, 0x0000, 0x65ea, 0x707b, 0x0001, 0xa084, 0x0000,
++	0x0005, 0x00e6, 0x2071, 0xc600, 0x707f, 0x0000, 0x00ee, 0x0005,
++	0x00e6, 0x00f6, 0x2079, 0x0100, 0x2071, 0x0140, 0x080c, 0x8bf5,
++	0x7004, 0xa084, 0x4000, 0x0120, 0x7003, 0x1000, 0x7003, 0x0000,
++	0x0126, 0x2091, 0x8000, 0x2071, 0xc623, 0x2073, 0x0000, 0x7840,
++	0x0026, 0x0016, 0x2009, 0x00f7, 0x080c, 0x4eeb, 0x001e, 0xa094,
++	0x0010, 0xa285, 0x0080, 0x7842, 0x7a42, 0x002e, 0x012e, 0x00fe,
++	0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x2011, 0xc931, 0x2013,
++	0x0000, 0x7087, 0x0000, 0x012e, 0x20e1, 0x9080, 0x60a3, 0x0056,
++	0x60a7, 0x9575, 0x080c, 0x8bec, 0x2009, 0x07d0, 0x2011, 0x4e18,
++	0x080c, 0x7036, 0x0005, 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091,
++	0x8000, 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, 0x0002, 0x080c,
++	0x8f18, 0x080c, 0x8dee, 0x0036, 0x2019, 0x0000, 0x080c, 0x8e79,
++	0x003e, 0x2009, 0x00f7, 0x080c, 0x4eeb, 0x2061, 0xc93a, 0x601b,
++	0x0000, 0x601f, 0x0000, 0x2061, 0xc600, 0x6003, 0x0001, 0x2061,
++	0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x002d, 0x2011,
++	0x4e90, 0x080c, 0x6fa1, 0x012e, 0x00ce, 0x002e, 0x001e, 0x0005,
++	0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x0100, 0x080c,
++	0x8bf5, 0x2071, 0x0140, 0x7004, 0xa084, 0x4000, 0x0120, 0x7003,
++	0x1000, 0x7003, 0x0000, 0x080c, 0x5f2a, 0x01a8, 0x080c, 0x5f48,
++	0x1190, 0x2001, 0xc8e5, 0x2003, 0xaaaa, 0x0016, 0x080c, 0x2a95,
++	0x2001, 0xc8d6, 0x2102, 0x001e, 0x2001, 0xc8e6, 0x2003, 0x0000,
++	0x080c, 0x5e5a, 0x0030, 0x2001, 0x0001, 0x080c, 0x296d, 0x080c,
++	0x4e5b, 0x012e, 0x000e, 0x00ee, 0x0005, 0x20a9, 0x0040, 0x20a1,
++	0xcdc0, 0x2099, 0xcc8e, 0x3304, 0x8007, 0x20a2, 0x9398, 0x94a0,
++	0x1f04, 0x4ecb, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099,
++	0xcc00, 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6, 0x0005, 0x20e1,
++	0x9080, 0x20e1, 0x4000, 0x2099, 0xcc80, 0x20a1, 0x020b, 0x20a9,
++	0x000c, 0x53a6, 0x0005, 0x00c6, 0x0006, 0x2061, 0x0100, 0x810f,
++	0x2001, 0xc631, 0x2004, 0xa005, 0x1138, 0x2001, 0xc615, 0x2004,
++	0xa084, 0x00ff, 0xa105, 0x0010, 0xa185, 0x00f7, 0x604a, 0x000e,
++	0x00ce, 0x0005, 0x0016, 0x0046, 0x2001, 0xc653, 0x2004, 0xd0a4,
++	0x0158, 0xa006, 0x2020, 0x2009, 0x002a, 0x080c, 0xc190, 0x2001,
++	0xc60c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0000,
++	0x080c, 0x2e19, 0x004e, 0x001e, 0x0005, 0x080c, 0x4e5b, 0x708f,
++	0x0000, 0x7087, 0x0000, 0x0005, 0x0006, 0x2001, 0xc60c, 0x2004,
++	0xd09c, 0x0100, 0x000e, 0x0005, 0x0006, 0x0016, 0x0126, 0x2091,
++	0x8000, 0x2001, 0x0101, 0x200c, 0xa18d, 0x0006, 0x2102, 0x012e,
++	0x001e, 0x000e, 0x0005, 0x0156, 0x20a9, 0x00ff, 0x2009, 0xc77b,
++	0xa006, 0x200a, 0x8108, 0x1f04, 0x4f41, 0x015e, 0x0005, 0x00d6,
++	0x0036, 0x0156, 0x0136, 0x0146, 0x2069, 0xc652, 0xa006, 0x6002,
++	0x6007, 0x0707, 0x600a, 0x600e, 0x6012, 0xa198, 0x2f6e, 0x231d,
++	0xa39c, 0x00ff, 0x6316, 0x20a9, 0x0004, 0xac98, 0x0006, 0x23a0,
++	0x40a4, 0x20a9, 0x0004, 0xac98, 0x000a, 0x23a0, 0x40a4, 0x603e,
++	0x6042, 0x604e, 0x6052, 0x6056, 0x605a, 0x605e, 0x6062, 0x6066,
++	0x606a, 0x606e, 0x6072, 0x6076, 0x607a, 0x607e, 0x6082, 0x6086,
++	0x608a, 0x608e, 0x6092, 0x6096, 0x609a, 0x609e, 0x60be, 0x61a2,
++	0x00d6, 0x60a4, 0xa06d, 0x0110, 0x080c, 0x1619, 0x60a7, 0x0000,
++	0x60a8, 0xa06d, 0x0110, 0x080c, 0x1619, 0x60ab, 0x0000, 0x00de,
++	0xa006, 0x604a, 0x6810, 0x603a, 0x680c, 0x6046, 0xa006, 0x60b2,
++	0x60ae, 0x60b6, 0x60bb, 0x0520, 0x6814, 0xa084, 0x00ff, 0x6042,
++	0x014e, 0x013e, 0x015e, 0x003e, 0x00de, 0x0005, 0x0126, 0x2091,
++	0x8000, 0x6944, 0x6e48, 0xa684, 0x3fff, 0xa082, 0x4000, 0x1a04,
++	0x505c, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x1a04, 0x5061,
++	0x2001, 0xc60c, 0x2004, 0xa084, 0x0003, 0x01c0, 0x2001, 0xc60c,
++	0x2004, 0xd084, 0x1904, 0x5044, 0xa188, 0xc77b, 0x2104, 0xa065,
++	0x0904, 0x5044, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x1904,
++	0x5044, 0x6000, 0xd0c4, 0x0904, 0x5044, 0x0068, 0xa188, 0xc77b,
++	0x2104, 0xa065, 0x0904, 0x5028, 0x6004, 0xa084, 0x00ff, 0xa08e,
++	0x0006, 0x1904, 0x502d, 0x60a4, 0xa00d, 0x0118, 0x080c, 0x5568,
++	0x05d0, 0x60a8, 0xa00d, 0x0188, 0x080c, 0x55b3, 0x1170, 0x694c,
++	0xd1fc, 0x1118, 0x080c, 0x5272, 0x0448, 0x080c, 0x5221, 0x694c,
++	0xd1ec, 0x1520, 0x080c, 0x545a, 0x0408, 0x694c, 0xa184, 0xa000,
++	0x0178, 0xd1ec, 0x0140, 0xd1fc, 0x0118, 0x080c, 0x5469, 0x0028,
++	0x080c, 0x5469, 0x0028, 0xd1fc, 0x0118, 0x080c, 0x5221, 0x0070,
++	0x6050, 0xa00d, 0x0130, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052,
++	0x0028, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x080c, 0x79b6,
++	0xa006, 0x012e, 0x0005, 0x2001, 0x0005, 0x2009, 0x0000, 0x04e8,
++	0x2001, 0x0028, 0x2009, 0x0000, 0x04c0, 0xa082, 0x0006, 0x12a0,
++	0x2001, 0xc635, 0x2004, 0xd0ac, 0x1160, 0x60a0, 0xd0bc, 0x1148,
++	0x6100, 0xd1fc, 0x0904, 0x4fe3, 0x2001, 0x0029, 0x2009, 0x1000,
++	0x0420, 0x2001, 0x0028, 0x00a8, 0x2009, 0xc60c, 0x210c, 0xd18c,
++	0x0118, 0x2001, 0x0004, 0x0068, 0xd184, 0x0118, 0x2001, 0x0004,
++	0x0040, 0x2001, 0x0029, 0x6100, 0xd1fc, 0x0118, 0x2009, 0x1000,
++	0x0060, 0x2009, 0x0000, 0x0048, 0x2001, 0x0029, 0x2009, 0x0000,
++	0x0020, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005, 0x012e, 0x0005,
++	0x00e6, 0x0126, 0x2091, 0x8000, 0x6844, 0xa084, 0xff00, 0xa08e,
++	0xff00, 0x1120, 0x2001, 0xc8d3, 0x2064, 0x0080, 0x6844, 0x8007,
++	0xa084, 0x00ff, 0x2008, 0xa182, 0x00ff, 0x1698, 0xa188, 0xc77b,
++	0x2104, 0xa065, 0x01d8, 0x080c, 0x56ed, 0x11d8, 0x2c70, 0x080c,
++	0x958d, 0x0568, 0x2e00, 0x601a, 0x2d00, 0x6012, 0x601f, 0x0009,
++	0x600b, 0x0000, 0x6844, 0xa08e, 0xff00, 0x1110, 0x600b, 0x8000,
++	0x2009, 0x0100, 0x080c, 0x9613, 0xa006, 0x00b0, 0x2001, 0x0028,
++	0x0090, 0x2009, 0xc60c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004,
++	0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029,
++	0x0010, 0x2001, 0x0029, 0xa005, 0x012e, 0x00ee, 0x0005, 0x2001,
++	0x002c, 0x0cc8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x6844, 0x8007,
++	0xa084, 0x00ff, 0x2008, 0xa182, 0x00ff, 0x1a04, 0x510d, 0xa188,
++	0xc77b, 0x2104, 0xa065, 0x01c0, 0x6004, 0xa084, 0x00ff, 0xa08e,
++	0x0006, 0x11a8, 0x2c70, 0x080c, 0x958d, 0x05e8, 0x2e00, 0x601a,
++	0x2d00, 0x6012, 0x600b, 0xffff, 0x601f, 0x000a, 0x2009, 0x0003,
++	0x080c, 0x9613, 0xa006, 0x0460, 0x2001, 0x0028, 0x0440, 0xa082,
++	0x0006, 0x1298, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1158, 0x60a0,
++	0xd0bc, 0x1140, 0x6100, 0xd1fc, 0x09e8, 0x2001, 0x0029, 0x2009,
++	0x1000, 0x00a8, 0x2001, 0x0028, 0x0090, 0x2009, 0xc60c, 0x210c,
++	0xd18c, 0x0118, 0x2001, 0x0004, 0x0050, 0xd184, 0x0118, 0x2001,
++	0x0004, 0x0028, 0x2001, 0x0029, 0x0010, 0x2001, 0x0029, 0xa005,
++	0x012e, 0x00ee, 0x0005, 0x2001, 0x002c, 0x0cc8, 0x00f6, 0x00e6,
++	0x0126, 0x2091, 0x8000, 0x2011, 0x0000, 0x2079, 0xc600, 0x6944,
++	0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x1a04, 0x51d8, 0x080c,
++	0x533d, 0x11a0, 0x6004, 0xa084, 0x00ff, 0xa082, 0x0006, 0x1270,
++	0x6864, 0xa0c6, 0x006f, 0x0150, 0x2001, 0xc635, 0x2004, 0xd0ac,
++	0x1904, 0x51c1, 0x60a0, 0xd0bc, 0x1904, 0x51c1, 0x6864, 0xa0c6,
++	0x006f, 0x0118, 0x2008, 0x0804, 0x518a, 0x6968, 0x2140, 0xa18c,
++	0xff00, 0x810f, 0x78d4, 0xd0ac, 0x1118, 0xa182, 0x0080, 0x06d0,
++	0xa182, 0x00ff, 0x16b8, 0x6a70, 0x6b6c, 0x7870, 0xa306, 0x1160,
++	0x7874, 0xa24e, 0x1118, 0x2208, 0x2310, 0x0460, 0xa9cc, 0xff00,
++	0x1118, 0x2208, 0x2310, 0x0430, 0x080c, 0x3f6e, 0x2c70, 0x0550,
++	0x2009, 0x0000, 0x2011, 0x0000, 0xa0c6, 0x4000, 0x1160, 0x0006,
++	0x2e60, 0x080c, 0x55de, 0x1108, 0xc185, 0x7000, 0xd0bc, 0x0108,
++	0xc18d, 0x000e, 0x0088, 0xa0c6, 0x4007, 0x1110, 0x2408, 0x0060,
++	0xa0c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0030, 0xa0c6, 0x4009,
++	0x1108, 0x0010, 0x2001, 0x4006, 0x6866, 0x696a, 0x6a6e, 0x2001,
++	0x0030, 0x0450, 0x080c, 0x958d, 0x1138, 0x2001, 0x4005, 0x2009,
++	0x0003, 0x2011, 0x0000, 0x0c80, 0x2e00, 0x601a, 0x080c, 0xb05e,
++	0x2d00, 0x6012, 0x601f, 0x0001, 0x6838, 0xd88c, 0x0108, 0xc0f5,
++	0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x2e46, 0x012e, 0x2001,
++	0x0000, 0x080c, 0x527f, 0x2001, 0x0002, 0x080c, 0x5291, 0x2009,
++	0x0002, 0x080c, 0x9613, 0xa006, 0xa005, 0x012e, 0x00ee, 0x00fe,
++	0x0005, 0x2001, 0x0028, 0x2009, 0x0000, 0x0cb0, 0x2009, 0xc60c,
++	0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118,
++	0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x2009, 0x0000, 0x0c20,
++	0x2001, 0x0029, 0x2009, 0x0000, 0x08f8, 0x6944, 0x6e48, 0xa684,
++	0x3fff, 0xa082, 0x4000, 0x16b8, 0xa18c, 0xff00, 0x810f, 0xa182,
++	0x00ff, 0x12e0, 0xa188, 0xc77b, 0x2104, 0xa065, 0x01b8, 0x6004,
++	0xa084, 0x00ff, 0xa08e, 0x0006, 0x11b0, 0x684c, 0xd0ec, 0x0120,
++	0x080c, 0x5469, 0x0431, 0x0030, 0x0421, 0x684c, 0xd0fc, 0x0110,
++	0x080c, 0x545a, 0x080c, 0x54a7, 0xa006, 0x00c8, 0x2001, 0x0028,
++	0x2009, 0x0000, 0x00a0, 0xa082, 0x0006, 0x1240, 0x6100, 0xd1fc,
++	0x0d20, 0x2001, 0x0029, 0x2009, 0x1000, 0x0048, 0x2001, 0x0029,
++	0x2009, 0x0000, 0x0020, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005,
++	0x0005, 0x0126, 0x2091, 0x8000, 0x6050, 0xa00d, 0x0138, 0x2d00,
++	0x200a, 0x6803, 0x0000, 0x6052, 0x012e, 0x0005, 0x2d00, 0x6052,
++	0x604e, 0x6803, 0x0000, 0x0cc0, 0x0126, 0x2091, 0x8000, 0x604c,
++	0xa005, 0x0170, 0x00e6, 0x2071, 0xc927, 0x7004, 0xa086, 0x0002,
++	0x0168, 0x00ee, 0x604c, 0x6802, 0x2d00, 0x604e, 0x012e, 0x0005,
++	0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x0cc0, 0x701c, 0xac06,
++	0x1d80, 0x604c, 0x2070, 0x7000, 0x6802, 0x2d00, 0x7002, 0x00ee,
++	0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x604c, 0xa06d, 0x0130,
++	0x6800, 0xa005, 0x1108, 0x6052, 0x604e, 0xad05, 0x012e, 0x0005,
++	0x604c, 0xa06d, 0x0130, 0x6800, 0xa005, 0x1108, 0x6052, 0x604e,
++	0xad05, 0x0005, 0x6803, 0x0000, 0x6084, 0xa00d, 0x0120, 0x2d00,
++	0x200a, 0x6086, 0x0005, 0x2d00, 0x6086, 0x6082, 0x0cd8, 0x0126,
++	0x00c6, 0x0026, 0x2091, 0x8000, 0x6218, 0x2260, 0x6200, 0xa005,
++	0x0110, 0xc285, 0x0008, 0xc284, 0x6202, 0x002e, 0x00ce, 0x012e,
++	0x0005, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6218, 0x2260, 0x6204,
++	0x0006, 0xa086, 0x0006, 0x1180, 0x609c, 0xd0ac, 0x0168, 0x2001,
++	0xc653, 0x2004, 0xd0a4, 0x0140, 0xa284, 0xff00, 0x8007, 0xa086,
++	0x0007, 0x1110, 0x2011, 0x0600, 0x000e, 0xa294, 0xff00, 0xa215,
++	0x6206, 0x0006, 0xa086, 0x0006, 0x1128, 0x6290, 0x82ff, 0x1110,
++	0x080c, 0x1519, 0x000e, 0x00ce, 0x012e, 0x0005, 0x0126, 0x00c6,
++	0x2091, 0x8000, 0x6218, 0x2260, 0x6204, 0x0006, 0xa086, 0x0006,
++	0x1178, 0x609c, 0xd0a4, 0x0160, 0x2001, 0xc653, 0x2004, 0xd0ac,
++	0x1138, 0xa284, 0x00ff, 0xa086, 0x0007, 0x1110, 0x2011, 0x0006,
++	0x000e, 0xa294, 0x00ff, 0x8007, 0xa215, 0x6206, 0x00ce, 0x012e,
++	0x0005, 0x0026, 0xa182, 0x00ff, 0x0218, 0xa085, 0x0001, 0x00b0,
++	0xa190, 0xc77b, 0x2204, 0xa065, 0x1180, 0x0016, 0x00d6, 0x080c,
++	0x15e5, 0x2d60, 0x00de, 0x001e, 0x0d80, 0x2c00, 0x2012, 0x60a7,
++	0x0000, 0x60ab, 0x0000, 0x080c, 0x4f47, 0xa006, 0x002e, 0x0005,
++	0x0126, 0x2091, 0x8000, 0x0026, 0xa182, 0x00ff, 0x0218, 0xa085,
++	0x0001, 0x0480, 0x00d6, 0xa190, 0xc77b, 0x2204, 0xa06d, 0x0540,
++	0x2013, 0x0000, 0x00d6, 0x00c6, 0x2d60, 0x60a4, 0xa06d, 0x0110,
++	0x080c, 0x1619, 0x60a8, 0xa06d, 0x0110, 0x080c, 0x1619, 0x00ce,
++	0x00de, 0x00d6, 0x00c6, 0x68bc, 0x2060, 0x8cff, 0x0168, 0x600c,
++	0x0006, 0x6010, 0x2068, 0x080c, 0xac91, 0x0110, 0x080c, 0x1629,
++	0x080c, 0x95e3, 0x00ce, 0x0c88, 0x00ce, 0x00de, 0x080c, 0x1619,
++	0x00de, 0xa006, 0x002e, 0x012e, 0x0005, 0x0016, 0xa182, 0x00ff,
++	0x0218, 0xa085, 0x0001, 0x0030, 0xa188, 0xc77b, 0x2104, 0xa065,
++	0x0dc0, 0xa006, 0x001e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146,
++	0x600b, 0x0000, 0x600f, 0x0000, 0x6000, 0xc08c, 0x6002, 0x080c,
++	0x5f22, 0x1558, 0x60a0, 0xa086, 0x007e, 0x2069, 0xcc90, 0x0130,
++	0x2001, 0xc635, 0x2004, 0xd0ac, 0x1500, 0x0098, 0x2d04, 0xd0e4,
++	0x01e0, 0x00d6, 0x2069, 0xcc8e, 0x00c6, 0x2061, 0xc8f9, 0x6810,
++	0x2062, 0x6814, 0x6006, 0x6818, 0x600a, 0x681c, 0x600e, 0x00ce,
++	0x00de, 0x8d69, 0x2d04, 0x2069, 0x0140, 0xa005, 0x1110, 0x2001,
++	0x0001, 0x6886, 0x2069, 0xc600, 0x68a6, 0x2069, 0xcc8e, 0x6808,
++	0x605e, 0x6810, 0x6062, 0x6138, 0xa10a, 0x0208, 0x603a, 0x6814,
++	0x6066, 0x2099, 0xcc96, 0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004,
++	0x53a3, 0x2099, 0xcc9a, 0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004,
++	0x53a3, 0x2069, 0xccae, 0x6808, 0x606a, 0x690c, 0x616e, 0x6810,
++	0x6072, 0x6818, 0x6076, 0x60a0, 0xa086, 0x007e, 0x1120, 0x2069,
++	0xcc8e, 0x690c, 0x616e, 0xa182, 0x0211, 0x1218, 0x2009, 0x0008,
++	0x0400, 0xa182, 0x0259, 0x1218, 0x2009, 0x0007, 0x00d0, 0xa182,
++	0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0xa182, 0x0349, 0x1218,
++	0x2009, 0x0005, 0x0070, 0xa182, 0x0421, 0x1218, 0x2009, 0x0004,
++	0x0040, 0xa182, 0x0581, 0x1218, 0x2009, 0x0003, 0x0010, 0x2009,
++	0x0002, 0x6192, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, 0x0016,
++	0x0026, 0x00e6, 0x2071, 0xcc8d, 0x2e04, 0x6896, 0x2071, 0xcc8e,
++	0x7004, 0x689a, 0x701c, 0x689e, 0x6a00, 0x2009, 0xc672, 0x210c,
++	0xd0bc, 0x0120, 0xd1ec, 0x0110, 0xc2ad, 0x0008, 0xc2ac, 0xd0c4,
++	0x0120, 0xd1e4, 0x0110, 0xc2bd, 0x0008, 0xc2bc, 0x6a02, 0x00ee,
++	0x002e, 0x001e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x60a4,
++	0xa06d, 0x01c0, 0x6900, 0x81ff, 0x1540, 0x6a04, 0xa282, 0x0010,
++	0x1648, 0xad88, 0x0004, 0x20a9, 0x0010, 0x2104, 0xa086, 0xffff,
++	0x0128, 0x8108, 0x1f04, 0x5415, 0x080c, 0x1519, 0x260a, 0x8210,
++	0x6a06, 0x0098, 0x080c, 0x1602, 0x01a8, 0x2d00, 0x60a6, 0x6803,
++	0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108,
++	0x1f04, 0x542d, 0x6807, 0x0001, 0x6e12, 0xa085, 0x0001, 0x012e,
++	0x00de, 0x0005, 0xa006, 0x0cd8, 0x0126, 0x2091, 0x8000, 0x00d6,
++	0x60a4, 0xa00d, 0x01a0, 0x2168, 0x6800, 0xa005, 0x1160, 0x080c,
++	0x5568, 0x1168, 0x200b, 0xffff, 0x6804, 0xa08a, 0x0002, 0x0218,
++	0x8001, 0x6806, 0x0020, 0x080c, 0x1619, 0x60a7, 0x0000, 0x00de,
++	0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x55c6, 0x0010,
++	0x080c, 0x5221, 0x080c, 0x54e0, 0x1dd8, 0x080c, 0x54a7, 0x012e,
++	0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x60a8, 0xa06d, 0x01c0,
++	0x6950, 0x81ff, 0x1540, 0x6a54, 0xa282, 0x0010, 0x1670, 0xad88,
++	0x0018, 0x20a9, 0x0010, 0x2104, 0xa086, 0xffff, 0x0128, 0x8108,
++	0x1f04, 0x547b, 0x080c, 0x1519, 0x260a, 0x8210, 0x6a56, 0x0098,
++	0x080c, 0x1602, 0x01d0, 0x2d00, 0x60aa, 0x6853, 0x0000, 0xad88,
++	0x0018, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x1f04, 0x5493,
++	0x6857, 0x0001, 0x6e62, 0x0010, 0x080c, 0x5272, 0x0089, 0x1de0,
++	0xa085, 0x0001, 0x012e, 0x00de, 0x0005, 0xa006, 0x0cd8, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x79b6, 0x012e, 0x0005, 0xa01e, 0x0010,
++	0x2019, 0x0001, 0xa00e, 0x0126, 0x2091, 0x8000, 0x604c, 0x2068,
++	0x6000, 0xd0dc, 0x1170, 0x8dff, 0x01f8, 0x83ff, 0x0120, 0x6848,
++	0xa606, 0x0158, 0x0030, 0x683c, 0xa406, 0x1118, 0x6840, 0xa506,
++	0x0120, 0x2d08, 0x6800, 0x2068, 0x0c70, 0x080c, 0x8fb7, 0x6a00,
++	0x604c, 0xad06, 0x1110, 0x624e, 0x0018, 0xa180, 0x0000, 0x2202,
++	0x82ff, 0x1110, 0x6152, 0x8dff, 0x012e, 0x0005, 0xa01e, 0x0010,
++	0x2019, 0x0001, 0xa00e, 0x6080, 0x2068, 0x8dff, 0x01e8, 0x83ff,
++	0x0120, 0x6848, 0xa606, 0x0158, 0x0030, 0x683c, 0xa406, 0x1118,
++	0x6840, 0xa506, 0x0120, 0x2d08, 0x6800, 0x2068, 0x0c70, 0x6a00,
++	0x6080, 0xad06, 0x1110, 0x6282, 0x0018, 0xa180, 0x0000, 0x2202,
++	0x82ff, 0x1110, 0x6186, 0x8dff, 0x0005, 0xa016, 0x080c, 0x5562,
++	0x1110, 0x2011, 0x0001, 0x080c, 0x55ad, 0x1110, 0xa295, 0x0002,
++	0x0005, 0x080c, 0x55de, 0x0118, 0x080c, 0xad46, 0x0010, 0xa085,
++	0x0001, 0x0005, 0x080c, 0x55de, 0x0118, 0x080c, 0xacd6, 0x0010,
++	0xa085, 0x0001, 0x0005, 0x080c, 0x55de, 0x0118, 0x080c, 0xad29,
++	0x0010, 0xa085, 0x0001, 0x0005, 0x080c, 0x55de, 0x0118, 0x080c,
++	0xacf2, 0x0010, 0xa085, 0x0001, 0x0005, 0x080c, 0x55de, 0x0118,
++	0x080c, 0xad62, 0x0010, 0xa085, 0x0001, 0x0005, 0x0126, 0x0006,
++	0x00d6, 0x2091, 0x8000, 0x6080, 0xa06d, 0x01a0, 0x6800, 0x0006,
++	0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0xaf03, 0x0006,
++	0x6000, 0xd0fc, 0x0110, 0x080c, 0xc4e0, 0x000e, 0x080c, 0x580a,
++	0x000e, 0x0c50, 0x6083, 0x0000, 0x6087, 0x0000, 0x00de, 0x000e,
++	0x012e, 0x0005, 0x60a4, 0xa00d, 0x1118, 0xa085, 0x0001, 0x0005,
++	0x00e6, 0x2170, 0x7000, 0xa005, 0x1168, 0x20a9, 0x0010, 0xae88,
++	0x0004, 0x2104, 0xa606, 0x0130, 0x8108, 0x1f04, 0x5571, 0xa085,
++	0x0001, 0x0008, 0xa006, 0x00ee, 0x0005, 0x00d6, 0x0126, 0x2091,
++	0x8000, 0x60a4, 0xa06d, 0x1128, 0x080c, 0x1602, 0x01a0, 0x2d00,
++	0x60a6, 0x6803, 0x0001, 0x6807, 0x0000, 0xad88, 0x0004, 0x20a9,
++	0x0010, 0x200b, 0xffff, 0x8108, 0x1f04, 0x5591, 0xa085, 0x0001,
++	0x012e, 0x00de, 0x0005, 0xa006, 0x0cd8, 0x00d6, 0x0126, 0x2091,
++	0x8000, 0x60a4, 0xa06d, 0x0130, 0x60a7, 0x0000, 0x080c, 0x1619,
++	0xa085, 0x0001, 0x012e, 0x00de, 0x0005, 0x60a8, 0xa00d, 0x1118,
++	0xa085, 0x0001, 0x0005, 0x00e6, 0x2170, 0x7050, 0xa005, 0x1160,
++	0x20a9, 0x0010, 0xae88, 0x0018, 0x2104, 0xa606, 0x0128, 0x8108,
++	0x1f04, 0x55bc, 0xa085, 0x0001, 0x00ee, 0x0005, 0x0126, 0x2091,
++	0x8000, 0x0c19, 0x1188, 0x200b, 0xffff, 0x00d6, 0x60a8, 0x2068,
++	0x6854, 0xa08a, 0x0002, 0x0218, 0x8001, 0x6856, 0x0020, 0x080c,
++	0x1619, 0x60ab, 0x0000, 0x00de, 0x012e, 0x0005, 0x609c, 0xd0a4,
++	0x0005, 0x00f6, 0x080c, 0x5f22, 0x01b0, 0x71b8, 0x81ff, 0x1198,
++	0x71d4, 0xd19c, 0x0180, 0x2001, 0x007e, 0xa080, 0xc77b, 0x2004,
++	0xa07d, 0x0148, 0x7804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1118,
++	0x7800, 0xc0ed, 0x7802, 0x2079, 0xc652, 0x7804, 0xd0a4, 0x01e8,
++	0x0156, 0x00c6, 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c,
++	0x533d, 0x1168, 0x6004, 0xa084, 0xff00, 0x8007, 0xa096, 0x0004,
++	0x0118, 0xa086, 0x0006, 0x1118, 0x6000, 0xc0ed, 0x6002, 0x001e,
++	0x8108, 0x1f04, 0x5606, 0x00ce, 0x015e, 0x080c, 0x570b, 0x0120,
++	0x2001, 0xc8fc, 0x200c, 0x0038, 0x2079, 0xc652, 0x7804, 0xd0a4,
++	0x0130, 0x2009, 0x07d0, 0x2011, 0x5631, 0x080c, 0x7036, 0x00fe,
++	0x0005, 0x2011, 0x5631, 0x080c, 0x6fad, 0x080c, 0x570b, 0x01f0,
++	0x2001, 0xc7f9, 0x2004, 0xa080, 0x0000, 0x200c, 0xc1ec, 0x2102,
++	0x2001, 0xc653, 0x2004, 0xd0a4, 0x0130, 0x2009, 0x07d0, 0x2011,
++	0x5631, 0x080c, 0x7036, 0x00e6, 0x2071, 0xc600, 0x7073, 0x0000,
++	0x7077, 0x0000, 0x080c, 0x2c62, 0x00ee, 0x04b0, 0x0156, 0x00c6,
++	0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x533d, 0x1530,
++	0x6000, 0xd0ec, 0x0518, 0x0046, 0x62a0, 0xa294, 0x00ff, 0x8227,
++	0xa006, 0x2009, 0x0029, 0x080c, 0xc190, 0x6000, 0xc0e5, 0xc0ec,
++	0x6002, 0x6004, 0xa084, 0x00ff, 0xa085, 0x0700, 0x6006, 0x2019,
++	0x0029, 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a0e,
++	0x2009, 0x0000, 0x080c, 0xbef7, 0x007e, 0x004e, 0x001e, 0x8108,
++	0x1f04, 0x565c, 0x00ce, 0x015e, 0x0005, 0x00c6, 0x6018, 0x2060,
++	0x6000, 0xc0ec, 0x6002, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x080c,
++	0x15e5, 0x2d60, 0x0508, 0x2009, 0x00ff, 0x60a7, 0x0000, 0x60ab,
++	0x0000, 0x080c, 0x4f47, 0x6007, 0x0006, 0x6013, 0x00ff, 0x6017,
++	0xffff, 0x606f, 0x0200, 0x606c, 0x6093, 0x0002, 0x60bb, 0x0520,
++	0x60a3, 0x00ff, 0x60b7, 0x0000, 0x60af, 0x0000, 0x2c08, 0x2001,
++	0xc8d3, 0x2102, 0xa085, 0x0001, 0x00de, 0x00ce, 0x0005, 0x7818,
++	0x2004, 0xd0ac, 0x0005, 0x7818, 0x2004, 0xd0bc, 0x0005, 0x0156,
++	0x00e6, 0x00d6, 0x00c6, 0x0026, 0x20a9, 0x00ff, 0x2009, 0x0000,
++	0x0016, 0x080c, 0x533d, 0x1178, 0x2c70, 0x70ac, 0xa005, 0x0158,
++	0x2060, 0x620c, 0x0026, 0x6010, 0x2068, 0x080c, 0x761a, 0x002e,
++	0x2260, 0x82ff, 0x1db0, 0x001e, 0x8108, 0x1f04, 0x56d0, 0x002e,
++	0x00ce, 0x00de, 0x00ee, 0x015e, 0x0005, 0x0006, 0x0016, 0x0026,
++	0x6004, 0xa08c, 0x00ff, 0xa196, 0x0006, 0x0188, 0xa196, 0x0004,
++	0x0170, 0xa196, 0x0005, 0x0158, 0xa08c, 0xff00, 0x810f, 0xa196,
++	0x0006, 0x0128, 0xa196, 0x0004, 0x0110, 0xa196, 0x0005, 0x002e,
++	0x001e, 0x000e, 0x0005, 0x00f6, 0x2001, 0xc7f9, 0x2004, 0xa07d,
++	0x0110, 0x7800, 0xd0ec, 0x00fe, 0x0005, 0x0126, 0x0026, 0x2091,
++	0x8000, 0x0006, 0x62a0, 0xa290, 0xc77b, 0x2204, 0xac06, 0x190c,
++	0x1519, 0x000e, 0x6200, 0xa005, 0x0110, 0xc2fd, 0x0008, 0xc2fc,
++	0x6202, 0x002e, 0x012e, 0x0005, 0x2011, 0xc635, 0x2204, 0xd0cc,
++	0x0138, 0x2001, 0xc8fa, 0x200c, 0x2011, 0x5739, 0x080c, 0x7036,
++	0x0005, 0x2011, 0x5739, 0x080c, 0x6fad, 0x2011, 0xc635, 0x2204,
++	0xc0cc, 0x2012, 0x0005, 0x2071, 0xc734, 0x7003, 0x0001, 0x7007,
++	0x0000, 0x7013, 0x0000, 0x7017, 0x0000, 0x701b, 0x0000, 0x701f,
++	0x0000, 0x700b, 0x0000, 0x704b, 0x0001, 0x704f, 0x0000, 0x705b,
++	0x0020, 0x705f, 0x0040, 0x707f, 0x0000, 0x2071, 0xc8c3, 0x7003,
++	0xc734, 0x7007, 0x0000, 0x700b, 0x0000, 0x700f, 0xc8a3, 0x7013,
++	0x0020, 0x7017, 0x0040, 0x7037, 0x0000, 0x0005, 0x0016, 0x00e6,
++	0x2071, 0xc87b, 0xa00e, 0x7186, 0x718a, 0x7097, 0x0001, 0x2001,
++	0xc653, 0x2004, 0xd0fc, 0x1150, 0x2001, 0xc653, 0x2004, 0xa00e,
++	0xd09c, 0x0108, 0x8108, 0x7102, 0x0804, 0x57d4, 0x2001, 0xc672,
++	0x200c, 0xa184, 0x000f, 0x2009, 0xc673, 0x210c, 0x0002, 0x577c,
++	0x57af, 0x57b6, 0x57c0, 0x57c5, 0x577c, 0x577c, 0x577c, 0x579f,
++	0x577c, 0x577c, 0x577c, 0x577c, 0x577c, 0x577c, 0x577c, 0x7003,
++	0x0004, 0x0136, 0x0146, 0x0156, 0x2099, 0xc676, 0x20a1, 0xc8cc,
++	0x20a9, 0x0004, 0x53a3, 0x015e, 0x014e, 0x013e, 0x0428, 0x708f,
++	0x0005, 0x7007, 0x0122, 0x2001, 0x0002, 0x0030, 0x708f, 0x0002,
++	0x7007, 0x0121, 0x2001, 0x0003, 0x7002, 0x7097, 0x0001, 0x0088,
++	0x7007, 0x0122, 0x2001, 0x0002, 0x0020, 0x7007, 0x0121, 0x2001,
++	0x0003, 0x7002, 0xa006, 0x7096, 0x708e, 0xa184, 0xff00, 0x8007,
++	0x709a, 0xa184, 0x00ff, 0x7092, 0x00ee, 0x001e, 0x0005, 0x00e6,
++	0x2071, 0xc734, 0x684c, 0xa005, 0x1130, 0x7028, 0xc085, 0x702a,
++	0xa085, 0x0001, 0x0428, 0x6a60, 0x7236, 0x6b64, 0x733a, 0x6868,
++	0x703e, 0x7076, 0x686c, 0x7042, 0x707a, 0x684c, 0x702e, 0x6844,
++	0x7032, 0x2009, 0x000d, 0x200a, 0x700b, 0x0000, 0x8007, 0x8006,
++	0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319,
++	0x726e, 0x7372, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0xa006,
++	0x00ee, 0x0005, 0x0156, 0x00e6, 0x0026, 0x6838, 0xd0fc, 0x1904,
++	0x5863, 0x6804, 0xa00d, 0x0188, 0x00d6, 0x2071, 0xc600, 0xa016,
++	0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8,
++	0x702e, 0x70b4, 0xa200, 0x70b6, 0x00de, 0x2071, 0xc734, 0x701c,
++	0xa005, 0x1904, 0x5873, 0x20a9, 0x0032, 0x0f04, 0x5871, 0x0e04,
++	0x582d, 0x2071, 0xc87b, 0x7200, 0x82ff, 0x05d8, 0x6934, 0xa186,
++	0x0103, 0x1904, 0x5881, 0x6948, 0x6844, 0xa105, 0x1540, 0x2009,
++	0x8020, 0x2200, 0x0002, 0x5871, 0x5848, 0x58e8, 0x58f5, 0x5871,
++	0x2071, 0x0000, 0x20a9, 0x0032, 0x0f04, 0x5871, 0x7018, 0xd084,
++	0x1dd8, 0x7122, 0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001,
++	0x2091, 0x4080, 0x2071, 0xc600, 0x702c, 0x206a, 0x2d00, 0x702e,
++	0x70b4, 0x8000, 0x70b6, 0x002e, 0x00ee, 0x015e, 0x0005, 0x6844,
++	0xa086, 0x0100, 0x1130, 0x6868, 0xa005, 0x1118, 0x2009, 0x8020,
++	0x0880, 0x2071, 0xc734, 0x2d08, 0x206b, 0x0000, 0x7010, 0x8000,
++	0x7012, 0x7018, 0xa06d, 0x711a, 0x0110, 0x6902, 0x0008, 0x711e,
++	0x0c10, 0xa18c, 0x00ff, 0xa186, 0x0013, 0x01e0, 0xa186, 0x001b,
++	0x01c8, 0xa186, 0x0023, 0x01e8, 0xa186, 0x0017, 0x0130, 0xa186,
++	0x001e, 0x0118, 0xa18e, 0x001f, 0x19e0, 0x684c, 0xd0cc, 0x09c8,
++	0x6850, 0xa084, 0x00ff, 0xa086, 0x0001, 0x1998, 0x2009, 0x8021,
++	0x0804, 0x5841, 0x6848, 0xa005, 0x1960, 0x2009, 0x8022, 0x0804,
++	0x5841, 0x2071, 0x0000, 0x7018, 0xd084, 0x1918, 0x00e6, 0x2071,
++	0xc682, 0x7140, 0x00ee, 0x6838, 0xa102, 0x0a04, 0x5871, 0x684c,
++	0xa005, 0x1158, 0x00e6, 0x2071, 0xc682, 0x7004, 0x00ee, 0xd08c,
++	0x1904, 0x5871, 0x2001, 0x8024, 0x0040, 0x6848, 0xd084, 0x1118,
++	0x2001, 0x8023, 0x0010, 0x2001, 0x8027, 0x7022, 0x6840, 0x7026,
++	0x683c, 0x702a, 0x6850, 0x702e, 0x0026, 0x0036, 0x6b38, 0x2e10,
++	0xa290, 0x0072, 0x2d00, 0xa080, 0x0015, 0x200c, 0x2112, 0x8000,
++	0x200c, 0x8210, 0x8319, 0x1dd0, 0x003e, 0x002e, 0x0804, 0x5856,
++	0x7084, 0x8008, 0xa092, 0x001e, 0x1a04, 0x5871, 0x7186, 0xae90,
++	0x0003, 0xa210, 0x683c, 0x2012, 0x0080, 0x7084, 0x8008, 0xa092,
++	0x000f, 0x1a04, 0x5871, 0x7186, 0xae90, 0x0003, 0x8003, 0xa210,
++	0x683c, 0x2012, 0x8210, 0x6840, 0x2012, 0x7088, 0xa10a, 0x0a04,
++	0x585a, 0x718c, 0x7084, 0xa10a, 0x0a04, 0x585a, 0x2071, 0x0000,
++	0x7018, 0xd084, 0x1904, 0x585a, 0x2071, 0xc87b, 0x7000, 0xa086,
++	0x0002, 0x1150, 0x080c, 0x5b75, 0x2071, 0x0000, 0x701b, 0x0001,
++	0x2091, 0x4080, 0x0804, 0x585a, 0x080c, 0x5b9f, 0x2071, 0x0000,
++	0x701b, 0x0001, 0x2091, 0x4080, 0x0804, 0x585a, 0x0006, 0x684c,
++	0x0006, 0x6837, 0x0103, 0x20a9, 0x001c, 0xad80, 0x0011, 0x20a0,
++	0x2001, 0x0000, 0x40a4, 0x000e, 0xa084, 0x00ff, 0x684e, 0x000e,
++	0x684a, 0x6952, 0x0005, 0x2071, 0xc734, 0x7004, 0x0002, 0x5951,
++	0x5962, 0x5b60, 0x5b61, 0x5b6e, 0x5b74, 0x5952, 0x5b51, 0x5ae7,
++	0x5b3d, 0x0005, 0x0126, 0x2091, 0x8000, 0x0e04, 0x5961, 0x2009,
++	0x000d, 0x7030, 0x200a, 0x2091, 0x4080, 0x7007, 0x0001, 0x700b,
++	0x0000, 0x012e, 0x2069, 0xc93a, 0x683c, 0xa005, 0x03f8, 0x11f0,
++	0x0126, 0x2091, 0x8000, 0x2069, 0x0000, 0x6934, 0x2001, 0xc740,
++	0x2004, 0xa10a, 0x0170, 0x0e04, 0x5985, 0x2069, 0x0000, 0x6818,
++	0xd084, 0x1158, 0x2009, 0x8040, 0x6922, 0x681b, 0x0001, 0x2091,
++	0x4080, 0x2069, 0xc93a, 0x683f, 0xffff, 0x012e, 0x2069, 0xc600,
++	0x6848, 0x6968, 0xa102, 0x2069, 0xc87b, 0x688a, 0x6984, 0x701c,
++	0xa06d, 0x0120, 0x81ff, 0x0904, 0x59db, 0x00a0, 0x81ff, 0x0904,
++	0x5aa1, 0x2071, 0xc87b, 0x7184, 0x7088, 0xa10a, 0x1258, 0x7190,
++	0x2071, 0xc93a, 0x7038, 0xa005, 0x0128, 0x1b04, 0x5aa1, 0x713a,
++	0x0804, 0x5aa1, 0x2071, 0xc87b, 0x718c, 0x0126, 0x2091, 0x8000,
++	0x7084, 0xa10a, 0x0a04, 0x5abc, 0x0e04, 0x5a5d, 0x2071, 0x0000,
++	0x7018, 0xd084, 0x1904, 0x5a5d, 0x2001, 0xffff, 0x2071, 0xc93a,
++	0x703a, 0x2071, 0xc87b, 0x7000, 0xa086, 0x0002, 0x1150, 0x080c,
++	0x5b75, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0804,
++	0x5a5d, 0x080c, 0x5b9f, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091,
++	0x4080, 0x0804, 0x5a5d, 0x2071, 0xc87b, 0x7000, 0xa005, 0x0904,
++	0x5a83, 0x6934, 0xa186, 0x0103, 0x1904, 0x5a60, 0x684c, 0xd0bc,
++	0x1904, 0x5a83, 0x6948, 0x6844, 0xa105, 0x1904, 0x5a78, 0x2009,
++	0x8020, 0x2071, 0xc87b, 0x7000, 0x0002, 0x5a83, 0x5a43, 0x5a1b,
++	0x5a2d, 0x59fa, 0x0136, 0x0146, 0x0156, 0x2099, 0xc676, 0x20a1,
++	0xc8cc, 0x20a9, 0x0004, 0x53a3, 0x015e, 0x014e, 0x013e, 0x2071,
++	0xc8c3, 0xad80, 0x000f, 0x700e, 0x7013, 0x0002, 0x7007, 0x0002,
++	0x700b, 0x0000, 0x2e10, 0x080c, 0x164d, 0x2071, 0xc734, 0x7007,
++	0x0009, 0x0804, 0x5aa1, 0x7084, 0x8008, 0xa092, 0x001e, 0x1a04,
++	0x5aa1, 0xae90, 0x0003, 0xa210, 0x683c, 0x2012, 0x7186, 0x2071,
++	0xc734, 0x080c, 0x5bf6, 0x0804, 0x5aa1, 0x7084, 0x8008, 0xa092,
++	0x000f, 0x1a04, 0x5aa1, 0xae90, 0x0003, 0x8003, 0xa210, 0x683c,
++	0x2012, 0x8210, 0x6840, 0x2012, 0x7186, 0x2071, 0xc734, 0x080c,
++	0x5bf6, 0x0804, 0x5aa1, 0x0126, 0x2091, 0x8000, 0x0e04, 0x5a5d,
++	0x2071, 0x0000, 0x7018, 0xd084, 0x1180, 0x7122, 0x683c, 0x7026,
++	0x6840, 0x702a, 0x701b, 0x0001, 0x2091, 0x4080, 0x012e, 0x2071,
++	0xc734, 0x080c, 0x5bf6, 0x0804, 0x5aa1, 0x012e, 0x0804, 0x5aa1,
++	0xa18c, 0x00ff, 0xa186, 0x0017, 0x0130, 0xa186, 0x001e, 0x0118,
++	0xa18e, 0x001f, 0x11c0, 0x684c, 0xd0cc, 0x01a8, 0x6850, 0xa084,
++	0x00ff, 0xa086, 0x0001, 0x1178, 0x2009, 0x8021, 0x0804, 0x59f1,
++	0x6844, 0xa086, 0x0100, 0x1138, 0x6868, 0xa005, 0x1120, 0x2009,
++	0x8020, 0x0804, 0x59f1, 0x2071, 0xc734, 0x080c, 0x5c08, 0x01c8,
++	0x2071, 0xc734, 0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086,
++	0x0003, 0x1130, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0108, 0x710e,
++	0x7007, 0x0003, 0x080c, 0x5c21, 0x7050, 0xa086, 0x0100, 0x0904,
++	0x5b61, 0x0126, 0x2091, 0x8000, 0x2071, 0xc734, 0x7008, 0xa086,
++	0x0001, 0x1180, 0x0e04, 0x5aba, 0x2009, 0x000d, 0x7030, 0x200a,
++	0x2091, 0x4080, 0x700b, 0x0000, 0x7004, 0xa086, 0x0006, 0x1110,
++	0x7007, 0x0001, 0x012e, 0x0005, 0x2071, 0xc734, 0x080c, 0x5c08,
++	0x0518, 0x2071, 0xc87b, 0x7084, 0x700a, 0x20a9, 0x0020, 0x2099,
++	0xc87c, 0x20a1, 0xc8a3, 0x53a3, 0x7087, 0x0000, 0x2071, 0xc734,
++	0x2069, 0xc8c3, 0x706c, 0x6826, 0x7070, 0x682a, 0x7074, 0x682e,
++	0x7078, 0x6832, 0x2d10, 0x080c, 0x164d, 0x7007, 0x0008, 0x2001,
++	0xffff, 0x2071, 0xc93a, 0x703a, 0x012e, 0x0804, 0x5aa1, 0x2069,
++	0xc8c3, 0x6808, 0xa08e, 0x0000, 0x0904, 0x5b3c, 0xa08e, 0x0200,
++	0x0904, 0x5b3a, 0xa08e, 0x0100, 0x1904, 0x5b3c, 0x0126, 0x2091,
++	0x8000, 0x0e04, 0x5b38, 0x2069, 0x0000, 0x6818, 0xd084, 0x15c0,
++	0x702c, 0x7130, 0x8108, 0xa102, 0x0230, 0xa00e, 0x7034, 0x706e,
++	0x7038, 0x7072, 0x0048, 0x706c, 0xa080, 0x0040, 0x706e, 0x1220,
++	0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x6936, 0x700b, 0x0000,
++	0x2001, 0xc8a0, 0x2004, 0xa005, 0x1190, 0x6934, 0x2069, 0xc87b,
++	0x689c, 0x699e, 0x2069, 0xc93a, 0xa102, 0x1118, 0x683c, 0xa005,
++	0x1368, 0x2001, 0xc8a1, 0x200c, 0x810d, 0x693e, 0x0038, 0x2009,
++	0x8040, 0x6922, 0x681b, 0x0001, 0x2091, 0x4080, 0x7007, 0x0001,
++	0x012e, 0x0010, 0x7007, 0x0005, 0x0005, 0x2001, 0xc8c5, 0x2004,
++	0xa08e, 0x0100, 0x1128, 0x7007, 0x0001, 0x080c, 0x5bf6, 0x0005,
++	0xa08e, 0x0000, 0x0de0, 0xa08e, 0x0200, 0x1dc8, 0x7007, 0x0005,
++	0x0005, 0x701c, 0xa06d, 0x0158, 0x080c, 0x5c08, 0x0140, 0x7007,
++	0x0003, 0x080c, 0x5c21, 0x7050, 0xa086, 0x0100, 0x0110, 0x0005,
++	0x0005, 0x7050, 0xa09e, 0x0100, 0x1118, 0x7007, 0x0004, 0x0030,
++	0xa086, 0x0200, 0x1110, 0x7007, 0x0005, 0x0005, 0x080c, 0x5bc4,
++	0x7006, 0x080c, 0x5bf6, 0x0005, 0x0005, 0x00e6, 0x0156, 0x2071,
++	0xc87b, 0x7184, 0x81ff, 0x0500, 0xa006, 0x7086, 0xae80, 0x0003,
++	0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, 0x0f04, 0x5b99,
++	0x2014, 0x722a, 0x8000, 0x0f04, 0x5b99, 0x2014, 0x722e, 0x8000,
++	0x0f04, 0x5b99, 0x2014, 0x723a, 0x8000, 0x0f04, 0x5b99, 0x2014,
++	0x723e, 0xa180, 0x8030, 0x7022, 0x015e, 0x00ee, 0x0005, 0x00e6,
++	0x0156, 0x2071, 0xc87b, 0x7184, 0x81ff, 0x01d8, 0xa006, 0x7086,
++	0xae80, 0x0003, 0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000,
++	0x2014, 0x722a, 0x8000, 0x0f04, 0x5bbb, 0x2014, 0x723a, 0x8000,
++	0x2014, 0x723e, 0x0018, 0x2001, 0x8020, 0x0010, 0x2001, 0x8042,
++	0x7022, 0x015e, 0x00ee, 0x0005, 0x702c, 0x7130, 0x8108, 0xa102,
++	0x0230, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072, 0x0048, 0x706c,
++	0xa080, 0x0040, 0x706e, 0x1220, 0x7070, 0xa081, 0x0000, 0x7072,
++	0x7132, 0x700c, 0x8001, 0x700e, 0x1180, 0x0126, 0x2091, 0x8000,
++	0x0e04, 0x5bf0, 0x2001, 0x000d, 0x2102, 0x2091, 0x4080, 0x2001,
++	0x0001, 0x700b, 0x0000, 0x012e, 0x0005, 0x2001, 0x0007, 0x0005,
++	0x2001, 0x0006, 0x700b, 0x0001, 0x012e, 0x0005, 0x701c, 0xa06d,
++	0x0170, 0x0126, 0x2091, 0x8000, 0x7010, 0x8001, 0x7012, 0x2d04,
++	0x701e, 0xa005, 0x1108, 0x701a, 0x012e, 0x080c, 0x1619, 0x0005,
++	0x2019, 0x000d, 0x2304, 0x230c, 0xa10e, 0x0130, 0x2304, 0x230c,
++	0xa10e, 0x0110, 0xa006, 0x0060, 0x732c, 0x8319, 0x7130, 0xa102,
++	0x1118, 0x2300, 0xa005, 0x0020, 0x0210, 0xa302, 0x0008, 0x8002,
++	0x0005, 0x2d00, 0x7026, 0xa080, 0x000d, 0x7056, 0x7053, 0x0000,
++	0x0126, 0x2091, 0x8000, 0x2009, 0xc959, 0x2104, 0xc08d, 0x200a,
++	0x012e, 0x080c, 0x1669, 0x0005, 0x708c, 0xa08a, 0x0029, 0x1220,
++	0xa082, 0x001d, 0x0033, 0x0010, 0x080c, 0x1519, 0x6027, 0x1e00,
++	0x0005, 0x5d2f, 0x5caa, 0x5cc2, 0x5cff, 0x5d20, 0x5d5a, 0x5d6c,
++	0x5cc2, 0x5d46, 0x5c4e, 0x5c7c, 0x5c4d, 0x0005, 0x00d6, 0x2069,
++	0x0200, 0x6804, 0xa005, 0x1180, 0x6808, 0xa005, 0x1518, 0x708f,
++	0x0028, 0x2069, 0xc90c, 0x2d04, 0x7002, 0x080c, 0x6024, 0x6028,
++	0xa085, 0x0600, 0x602a, 0x00b0, 0x708f, 0x0028, 0x2069, 0xc90c,
++	0x2d04, 0x7002, 0x6028, 0xa085, 0x0600, 0x602a, 0x00e6, 0x0036,
++	0x0046, 0x0056, 0x2071, 0xc96a, 0x080c, 0x1ec3, 0x005e, 0x004e,
++	0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804,
++	0xa005, 0x1180, 0x6808, 0xa005, 0x1518, 0x708f, 0x0028, 0x2069,
++	0xc90c, 0x2d04, 0x7002, 0x080c, 0x60b1, 0x6028, 0xa085, 0x0600,
++	0x602a, 0x00b0, 0x708f, 0x0028, 0x2069, 0xc90c, 0x2d04, 0x7002,
++	0x6028, 0xa085, 0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056,
++	0x2071, 0xc96a, 0x080c, 0x1ec3, 0x005e, 0x004e, 0x003e, 0x00ee,
++	0x00de, 0x0005, 0x6803, 0x0090, 0x6124, 0xd1e4, 0x1190, 0x080c,
++	0x5dd7, 0xd1d4, 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x708f,
++	0x0020, 0x080c, 0x5dd7, 0x0028, 0x708f, 0x001d, 0x0010, 0x708f,
++	0x001f, 0x0005, 0x6803, 0x0088, 0x6124, 0xd1cc, 0x1590, 0xd1dc,
++	0x1568, 0xd1e4, 0x1540, 0xa184, 0x1e00, 0x1580, 0x60e3, 0x0001,
++	0x600c, 0xc0b4, 0x600e, 0x080c, 0x5f52, 0x080c, 0x25fb, 0x0156,
++	0x6803, 0x0100, 0x20a9, 0x0014, 0x6804, 0xd0dc, 0x1118, 0x1f04,
++	0x5cdc, 0x0048, 0x20a9, 0x0014, 0x6803, 0x0080, 0x6804, 0xd0d4,
++	0x1130, 0x1f04, 0x5ce6, 0x080c, 0x5f73, 0x015e, 0x0078, 0x015e,
++	0x708f, 0x0028, 0x0058, 0x708f, 0x001e, 0x0040, 0x708f, 0x001d,
++	0x0028, 0x708f, 0x0020, 0x0010, 0x708f, 0x001f, 0x0005, 0x60e3,
++	0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x5f52, 0x080c, 0x25fb,
++	0x6803, 0x0080, 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158, 0xd1e4,
++	0x1130, 0xa184, 0x1e00, 0x1158, 0x708f, 0x0028, 0x0040, 0x708f,
++	0x001e, 0x0028, 0x708f, 0x001d, 0x0010, 0x708f, 0x001f, 0x0005,
++	0x6803, 0x00a0, 0x6124, 0xd1dc, 0x1138, 0xd1e4, 0x0138, 0x080c,
++	0x1f06, 0x708f, 0x001e, 0x0010, 0x708f, 0x001d, 0x0005, 0x080c,
++	0x5e49, 0x6124, 0xd1dc, 0x1188, 0x080c, 0x5dd7, 0x0016, 0x080c,
++	0x1f06, 0x001e, 0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x708f, 0x001e,
++	0x0020, 0x708f, 0x001f, 0x080c, 0x5dd7, 0x0005, 0x6803, 0x00a0,
++	0x6124, 0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4,
++	0x0140, 0x708f, 0x001e, 0x0028, 0x708f, 0x001d, 0x0010, 0x708f,
++	0x0021, 0x0005, 0x080c, 0x5e49, 0x6124, 0xd1d4, 0x1150, 0xd1dc,
++	0x1128, 0xd1e4, 0x0140, 0x708f, 0x001e, 0x0028, 0x708f, 0x001d,
++	0x0010, 0x708f, 0x001f, 0x0005, 0x6803, 0x0090, 0x6124, 0xd1d4,
++	0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0158, 0x708f,
++	0x001e, 0x0040, 0x708f, 0x001d, 0x0028, 0x708f, 0x0020, 0x0010,
++	0x708f, 0x001f, 0x0005, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x0126,
++	0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0xc600, 0x2091, 0x8000,
++	0x080c, 0x5f22, 0x11e8, 0x2001, 0xc60c, 0x200c, 0xd1b4, 0x01c0,
++	0xc1b4, 0x2102, 0x6027, 0x0200, 0xe000, 0xe000, 0x6024, 0xd0cc,
++	0x0158, 0x6803, 0x00a0, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001,
++	0xc600, 0x2003, 0x0001, 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408,
++	0x080c, 0x5f3e, 0x0150, 0x080c, 0x5f34, 0x1138, 0x2001, 0x0001,
++	0x080c, 0x296d, 0x080c, 0x5ef9, 0x00a0, 0x080c, 0x5e46, 0x0178,
++	0x2001, 0x0001, 0x080c, 0x296d, 0x708c, 0xa086, 0x001e, 0x0120,
++	0x708c, 0xa086, 0x0022, 0x1118, 0x708f, 0x0025, 0x0010, 0x708f,
++	0x0021, 0x012e, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026,
++	0x2011, 0x5de8, 0x080c, 0x7070, 0x002e, 0x0016, 0x0026, 0x2009,
++	0x0064, 0x2011, 0x5de8, 0x080c, 0x7067, 0x002e, 0x001e, 0x0005,
++	0x00e6, 0x00f6, 0x0016, 0x080c, 0x8bf5, 0x2071, 0xc600, 0x080c,
++	0x5d83, 0x001e, 0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036,
++	0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0126, 0x080c, 0x8bf5, 0x2061,
++	0x0100, 0x2069, 0x0140, 0x2071, 0xc600, 0x2091, 0x8000, 0x6028,
++	0xc09c, 0x602a, 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, 0x0002,
++	0x080c, 0x8f18, 0x080c, 0x8dee, 0x080c, 0x7024, 0x0036, 0x2019,
++	0x0000, 0x080c, 0x8e79, 0x003e, 0x60e3, 0x0000, 0x080c, 0xc586,
++	0x080c, 0xc5a1, 0x2001, 0xc600, 0x2003, 0x0004, 0x6027, 0x0008,
++	0x080c, 0x12e1, 0x2001, 0x0001, 0x080c, 0x296d, 0x012e, 0x00fe,
++	0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x2001,
++	0xc600, 0x2004, 0xa086, 0x0004, 0x0140, 0x2001, 0xc8e5, 0x2003,
++	0xaaaa, 0x2001, 0xc8e6, 0x2003, 0x0000, 0x0005, 0x6020, 0xd09c,
++	0x0005, 0x6800, 0xa086, 0x00c0, 0x0160, 0x6803, 0x00c0, 0x0156,
++	0x20a9, 0x002d, 0x1d04, 0x5e52, 0x2091, 0x6000, 0x1f04, 0x5e52,
++	0x015e, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069,
++	0x0140, 0x2071, 0xc600, 0x2001, 0xc8e6, 0x200c, 0xa186, 0x0000,
++	0x0158, 0xa186, 0x0001, 0x0158, 0xa186, 0x0002, 0x0158, 0xa186,
++	0x0003, 0x0158, 0x0804, 0x5ee7, 0x708f, 0x0022, 0x0040, 0x708f,
++	0x0021, 0x0028, 0x708f, 0x0023, 0x0020, 0x708f, 0x0024, 0x6043,
++	0x0000, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c,
++	0x2a1c, 0x0026, 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, 0x0002,
++	0x080c, 0x8f18, 0x080c, 0x8dee, 0x0036, 0x2019, 0x0000, 0x080c,
++	0x8e79, 0x003e, 0x002e, 0x7000, 0xa08e, 0x0004, 0x0118, 0x602b,
++	0x0028, 0x0010, 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, 0x8000,
++	0x20a9, 0x0005, 0x6024, 0xd0ac, 0x0120, 0x012e, 0x015e, 0x0804,
++	0x5ef5, 0x6800, 0xa084, 0x00a0, 0xc0bd, 0x6802, 0x6904, 0xd1d4,
++	0x1130, 0x6803, 0x0100, 0x1f04, 0x5eaa, 0x080c, 0x5f73, 0x012e,
++	0x015e, 0x080c, 0x5f34, 0x01a8, 0x6044, 0xa005, 0x0168, 0x6050,
++	0x0006, 0xa085, 0x0020, 0x6052, 0x080c, 0x5f73, 0xa006, 0x8001,
++	0x1df0, 0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c,
++	0x5f73, 0x0016, 0x0026, 0x2009, 0x00c8, 0x2011, 0x5df5, 0x080c,
++	0x7036, 0x002e, 0x001e, 0x2001, 0xc8e6, 0x2003, 0x0004, 0x080c,
++	0x5c34, 0x080c, 0x5f34, 0x0148, 0x6804, 0xd0d4, 0x1130, 0xd0dc,
++	0x1100, 0x2001, 0xc8e6, 0x2003, 0x0000, 0x00ee, 0x00de, 0x00ce,
++	0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140,
++	0x2071, 0xc600, 0x2001, 0xc8e5, 0x2003, 0x0000, 0x2001, 0xc8d6,
++	0x2003, 0x0000, 0x708f, 0x0000, 0x60e3, 0x0000, 0x6887, 0x0000,
++	0x2001, 0x0000, 0x080c, 0x2a1c, 0x6803, 0x0000, 0x6043, 0x0090,
++	0x6043, 0x0010, 0x6027, 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de,
++	0x00ce, 0x0005, 0x0006, 0x2001, 0xc8e5, 0x2004, 0xa086, 0xaaaa,
++	0x000e, 0x0005, 0x0006, 0x2001, 0xc672, 0x2004, 0xa084, 0x0030,
++	0xa086, 0x0000, 0x000e, 0x0005, 0x0006, 0x2001, 0xc672, 0x2004,
++	0xa084, 0x0030, 0xa086, 0x0030, 0x000e, 0x0005, 0x0006, 0x2001,
++	0xc672, 0x2004, 0xa084, 0x0030, 0xa086, 0x0010, 0x000e, 0x0005,
++	0x0006, 0x2001, 0xc672, 0x2004, 0xa084, 0x0030, 0xa086, 0x0020,
++	0x000e, 0x0005, 0x2001, 0xc60c, 0x2004, 0xd0a4, 0x0170, 0x080c,
++	0x2a3c, 0x0036, 0x0016, 0x2009, 0x0000, 0x2019, 0x0028, 0x080c,
++	0x2e19, 0x001e, 0x003e, 0xa006, 0x0009, 0x0005, 0x00e6, 0x2071,
++	0xc60c, 0x2e04, 0x0118, 0xa085, 0x0010, 0x0010, 0xa084, 0xffef,
++	0x2072, 0x00ee, 0x0005, 0x6050, 0x0006, 0x60f0, 0x0006, 0x60ec,
++	0x0006, 0x600c, 0x0006, 0x6004, 0x0006, 0x6028, 0x0006, 0x602f,
++	0x0100, 0x602f, 0x0000, 0x602f, 0x0040, 0x602f, 0x0000, 0x000e,
++	0x602a, 0x000e, 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x000e,
++	0x60f2, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c,
++	0x2a1c, 0x6800, 0xa084, 0x00a0, 0xc0bd, 0x6802, 0x6803, 0x00a0,
++	0x000e, 0x6052, 0x6050, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036,
++	0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071,
++	0xc600, 0x6020, 0xa084, 0x0080, 0x0138, 0x2001, 0xc60c, 0x200c,
++	0xc1bd, 0x2102, 0x0804, 0x601c, 0x2001, 0xc60c, 0x200c, 0xc1bc,
++	0x2102, 0x6028, 0xa084, 0xe1ff, 0x602a, 0x6027, 0x0200, 0x6803,
++	0x0090, 0x20a9, 0x0384, 0x6024, 0xd0cc, 0x1508, 0x1d04, 0x5fcb,
++	0x2091, 0x6000, 0x1f04, 0x5fcb, 0x2011, 0x0003, 0x080c, 0x8f0e,
++	0x2011, 0x0002, 0x080c, 0x8f18, 0x080c, 0x8dee, 0x2019, 0x0000,
++	0x080c, 0x8e79, 0x6803, 0x00a0, 0x2001, 0xc8e6, 0x2003, 0x0001,
++	0x2001, 0xc600, 0x2003, 0x0001, 0xa085, 0x0001, 0x0468, 0x86ff,
++	0x1120, 0x080c, 0x1f06, 0x080c, 0x25fb, 0x60e3, 0x0000, 0x2001,
++	0xc8d6, 0x2004, 0x080c, 0x2a1c, 0x60e2, 0x6803, 0x0080, 0x20a9,
++	0x0384, 0x6027, 0x1e00, 0x2009, 0x1e00, 0xe000, 0x6024, 0xa10c,
++	0x0138, 0x1d04, 0x6001, 0x2091, 0x6000, 0x1f04, 0x6001, 0x0820,
++	0x6028, 0xa085, 0x1e00, 0x602a, 0x70a4, 0xa005, 0x1118, 0x6887,
++	0x0001, 0x0008, 0x6886, 0xa006, 0x00ee, 0x00de, 0x00ce, 0x003e,
++	0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036,
++	0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0xc600, 0x2069,
++	0x0140, 0x6020, 0xa084, 0x00c0, 0x0120, 0x6884, 0xa005, 0x1904,
++	0x6078, 0x6803, 0x0088, 0x60e3, 0x0000, 0x6887, 0x0000, 0x2001,
++	0x0000, 0x080c, 0x2a1c, 0x2069, 0x0200, 0x6804, 0xa005, 0x1118,
++	0x6808, 0xa005, 0x01c0, 0x6028, 0xa084, 0xfbff, 0x602a, 0x6027,
++	0x0400, 0x2069, 0xc90c, 0x7000, 0x206a, 0x708f, 0x0026, 0x7003,
++	0x0001, 0x20a9, 0x0002, 0x1d04, 0x605b, 0x2091, 0x6000, 0x1f04,
++	0x605b, 0x0804, 0x60a9, 0x2069, 0x0140, 0x20a9, 0x0384, 0x6027,
++	0x1e00, 0x2009, 0x1e00, 0xe000, 0x6024, 0xa10c, 0x0520, 0xa084,
++	0x1a00, 0x1508, 0x1d04, 0x6067, 0x2091, 0x6000, 0x1f04, 0x6067,
++	0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, 0x0002, 0x080c, 0x8f18,
++	0x080c, 0x8dee, 0x2019, 0x0000, 0x080c, 0x8e79, 0x6803, 0x00a0,
++	0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, 0x2003, 0x0001,
++	0xa085, 0x0001, 0x00b0, 0x080c, 0x25fb, 0x6803, 0x0080, 0x2069,
++	0x0140, 0x60e3, 0x0000, 0x70a4, 0xa005, 0x1118, 0x6887, 0x0001,
++	0x0008, 0x6886, 0x2001, 0xc8d6, 0x2004, 0x080c, 0x2a1c, 0x60e2,
++	0xa006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e,
++	0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6,
++	0x2061, 0x0100, 0x2071, 0xc600, 0x6020, 0xa084, 0x00c0, 0x01e0,
++	0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, 0x0002, 0x080c, 0x8f18,
++	0x080c, 0x8dee, 0x2019, 0x0000, 0x080c, 0x8e79, 0x2069, 0x0140,
++	0x6803, 0x00a0, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600,
++	0x2003, 0x0001, 0x0804, 0x614e, 0x2001, 0xc60c, 0x200c, 0xd1b4,
++	0x1160, 0xc1b5, 0x2102, 0x080c, 0x5ddd, 0x2069, 0x0140, 0x080c,
++	0x25fb, 0x6803, 0x0080, 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804,
++	0xa005, 0x1118, 0x6808, 0xa005, 0x01c0, 0x6028, 0xa084, 0xfdff,
++	0x602a, 0x6027, 0x0200, 0x2069, 0xc90c, 0x7000, 0x206a, 0x708f,
++	0x0027, 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x6105, 0x2091,
++	0x6000, 0x1f04, 0x6105, 0x0804, 0x614e, 0x6027, 0x1e00, 0x2009,
++	0x1e00, 0xe000, 0x6024, 0xa10c, 0x01c8, 0xa084, 0x1c00, 0x11b0,
++	0x1d04, 0x610d, 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c,
++	0x6f0a, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071,
++	0xc93a, 0x7018, 0x00ee, 0xa005, 0x1d00, 0x0500, 0x0026, 0x2011,
++	0x5df5, 0x080c, 0x6fad, 0x2011, 0x5de8, 0x080c, 0x7070, 0x002e,
++	0x2069, 0x0140, 0x60e3, 0x0000, 0x70a4, 0xa005, 0x1118, 0x6887,
++	0x0001, 0x0008, 0x6886, 0x2001, 0xc8d6, 0x2004, 0x080c, 0x2a1c,
++	0x60e2, 0x2001, 0xc60c, 0x200c, 0xc1b4, 0x2102, 0x00ee, 0x00de,
++	0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016,
++	0x0026, 0x0036, 0x0046, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071,
++	0xc600, 0x7130, 0xd184, 0x1180, 0x2011, 0xc653, 0x2214, 0xd2ec,
++	0x0138, 0xc18d, 0x7132, 0x2011, 0xc653, 0x2214, 0xd2ac, 0x1120,
++	0x7030, 0xd08c, 0x0904, 0x61bb, 0x7130, 0xc185, 0x7132, 0x2011,
++	0xc653, 0x220c, 0xd1a4, 0x0530, 0x0016, 0x2019, 0x000e, 0x080c,
++	0xc10d, 0x0156, 0x20a9, 0x007f, 0x2009, 0x0000, 0xa186, 0x007e,
++	0x01a0, 0xa186, 0x0080, 0x0188, 0x080c, 0x533d, 0x1170, 0x8127,
++	0xa006, 0x0016, 0x2009, 0x000e, 0x080c, 0xc190, 0x2009, 0x0001,
++	0x2011, 0x0100, 0x080c, 0x712e, 0x001e, 0x8108, 0x1f04, 0x6186,
++	0x015e, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0000, 0x2019,
++	0x0004, 0x080c, 0x2e19, 0x001e, 0x0070, 0x0156, 0x20a9, 0x007f,
++	0x2009, 0x0000, 0x080c, 0x533d, 0x1110, 0x080c, 0x4f47, 0x8108,
++	0x1f04, 0x61b2, 0x015e, 0x080c, 0x1f06, 0x2011, 0x0003, 0x080c,
++	0x8f0e, 0x2011, 0x0002, 0x080c, 0x8f18, 0x080c, 0x8dee, 0x0036,
++	0x2019, 0x0000, 0x080c, 0x8e79, 0x003e, 0x60e3, 0x0000, 0x2001,
++	0xc600, 0x2003, 0x0001, 0x080c, 0x5e5a, 0x00ee, 0x00ce, 0x004e,
++	0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x2071, 0xc702, 0x7003,
++	0x0000, 0x7007, 0x0000, 0x700f, 0x0000, 0x702b, 0x0001, 0x704f,
++	0x0000, 0x7053, 0x0001, 0x705f, 0x0020, 0x7063, 0x0040, 0x7083,
++	0x0000, 0x708b, 0x0000, 0x708f, 0x0001, 0x70bf, 0x0000, 0x0005,
++	0x00e6, 0x2071, 0xc702, 0x6848, 0xa005, 0x1130, 0x7028, 0xc085,
++	0x702a, 0xa085, 0x0001, 0x0428, 0x6a50, 0x7236, 0x6b54, 0x733a,
++	0x6858, 0x703e, 0x707a, 0x685c, 0x7042, 0x707e, 0x6848, 0x702e,
++	0x6840, 0x7032, 0x2009, 0x000c, 0x200a, 0x8007, 0x8006, 0x8006,
++	0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, 0x7272,
++	0x7376, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700f, 0x0000,
++	0xa006, 0x00ee, 0x0005, 0x2b78, 0x2071, 0xc702, 0x7004, 0x0043,
++	0x700c, 0x0002, 0x6237, 0x622e, 0x622e, 0x622e, 0x622e, 0x0005,
++	0x628d, 0x628e, 0x62c0, 0x62c1, 0x628b, 0x630f, 0x6314, 0x6345,
++	0x6346, 0x6361, 0x6362, 0x6363, 0x6364, 0x6365, 0x6366, 0x6431,
++	0x6458, 0x700c, 0x0002, 0x6250, 0x628b, 0x628b, 0x628c, 0x628c,
++	0x7830, 0x7930, 0xa106, 0x0120, 0x7830, 0x7930, 0xa106, 0x1510,
++	0x7030, 0xa10a, 0x01f8, 0x1210, 0x712c, 0xa10a, 0xa18a, 0x0002,
++	0x12d0, 0x080c, 0x15e5, 0x01b0, 0x2d00, 0x705a, 0x7063, 0x0040,
++	0x2001, 0x0003, 0x7057, 0x0000, 0x0126, 0x0006, 0x2091, 0x8000,
++	0x2009, 0xc959, 0x2104, 0xc085, 0x200a, 0x000e, 0x700e, 0x012e,
++	0x080c, 0x1669, 0x0005, 0x080c, 0x15e5, 0x0de0, 0x2d00, 0x705a,
++	0x080c, 0x15e5, 0x1108, 0x0c10, 0x2d00, 0x7086, 0x7063, 0x0080,
++	0x2001, 0x0004, 0x08f8, 0x0005, 0x0005, 0x0005, 0x700c, 0x0002,
++	0x6295, 0x6298, 0x62a6, 0x62bf, 0x62bf, 0x080c, 0x6249, 0x0005,
++	0x0126, 0x8001, 0x700e, 0x7058, 0x0006, 0x080c, 0x67d4, 0x0120,
++	0x2091, 0x8000, 0x080c, 0x6249, 0x00de, 0x0048, 0x0126, 0x8001,
++	0x700e, 0x080c, 0x67d4, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803,
++	0x0000, 0x6807, 0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x003a,
++	0x1218, 0x00db, 0x012e, 0x0005, 0x012e, 0x080c, 0x6367, 0x0005,
++	0x0005, 0x0005, 0x00e6, 0x2071, 0xc702, 0x700c, 0x0002, 0x62cc,
++	0x62cc, 0x62cc, 0x62ce, 0x62d1, 0x00ee, 0x0005, 0x700f, 0x0001,
++	0x0010, 0x700f, 0x0002, 0x00ee, 0x0005, 0x6367, 0x6367, 0x6383,
++	0x6367, 0x653e, 0x6367, 0x6367, 0x6367, 0x6367, 0x6367, 0x6383,
++	0x6580, 0x65c3, 0x660c, 0x6620, 0x6367, 0x6367, 0x639f, 0x6383,
++	0x63b3, 0x6367, 0x640e, 0x66cc, 0x66e7, 0x6367, 0x639f, 0x6367,
++	0x63b3, 0x6367, 0x6367, 0x6404, 0x66e7, 0x6367, 0x6367, 0x6367,
++	0x6367, 0x6367, 0x6367, 0x6367, 0x6367, 0x6367, 0x63c8, 0x6367,
++	0x6367, 0x6367, 0x6367, 0x6367, 0x6367, 0x6367, 0x6367, 0x6367,
++	0x6866, 0x6367, 0x67f2, 0x6367, 0x67f2, 0x6367, 0x63dd, 0x7020,
++	0x2068, 0x080c, 0x1619, 0x0005, 0x700c, 0x0002, 0x631b, 0x631e,
++	0x632c, 0x6344, 0x6344, 0x080c, 0x6249, 0x0005, 0x0126, 0x8001,
++	0x700e, 0x7058, 0x0006, 0x080c, 0x67d4, 0x0120, 0x2091, 0x8000,
++	0x080c, 0x6249, 0x00de, 0x0048, 0x0126, 0x8001, 0x700e, 0x080c,
++	0x67d4, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807,
++	0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x001a, 0x1218, 0x003b,
++	0x012e, 0x0005, 0x012e, 0x0419, 0x0005, 0x0005, 0x0005, 0x6367,
++	0x6383, 0x652a, 0x6367, 0x6383, 0x6367, 0x6383, 0x6383, 0x6367,
++	0x6383, 0x652a, 0x6383, 0x6383, 0x6383, 0x6383, 0x6383, 0x6367,
++	0x6383, 0x652a, 0x6367, 0x6367, 0x6383, 0x6367, 0x6367, 0x6367,
++	0x6383, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x7007,
++	0x0001, 0x6838, 0xa084, 0x00ff, 0xc0d5, 0x683a, 0x0126, 0x2091,
++	0x8000, 0x080c, 0x580a, 0x012e, 0x0005, 0x7007, 0x0001, 0x6838,
++	0xa084, 0x00ff, 0xc0e5, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c,
++	0x580a, 0x012e, 0x0005, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff,
++	0xc0ed, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x580a, 0x012e,
++	0x0005, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0dd, 0x683a,
++	0x0126, 0x2091, 0x8000, 0x080c, 0x580a, 0x012e, 0x0005, 0x6834,
++	0x8007, 0xa084, 0x00ff, 0x0988, 0x8001, 0x1120, 0x7007, 0x0001,
++	0x0804, 0x64c1, 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a,
++	0x704b, 0x64c1, 0x0005, 0x6834, 0x8007, 0xa084, 0x00ff, 0x0904,
++	0x6375, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x64de, 0x7007,
++	0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x64de, 0x0005,
++	0x6834, 0x8007, 0xa084, 0x00ff, 0x0904, 0x6375, 0x8001, 0x1120,
++	0x7007, 0x0001, 0x0804, 0x6507, 0x7007, 0x0006, 0x7012, 0x2d00,
++	0x7016, 0x701a, 0x704b, 0x6507, 0x0005, 0x6834, 0x8007, 0xa084,
++	0x00ff, 0xa086, 0x0001, 0x1904, 0x6375, 0x7007, 0x0001, 0x2009,
++	0xc631, 0x210c, 0x81ff, 0x11a8, 0x6838, 0xa084, 0x00ff, 0x683a,
++	0x6853, 0x0000, 0x080c, 0x5116, 0x1108, 0x0005, 0x0126, 0x2091,
++	0x8000, 0x6837, 0x0139, 0x684a, 0x6952, 0x080c, 0x580a, 0x012e,
++	0x0ca0, 0x2001, 0x0028, 0x0c90, 0x684c, 0xa084, 0x00c0, 0xa086,
++	0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x66ff, 0x2d00, 0x7016,
++	0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098, 0x20a1, 0xc72d,
++	0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x1a04, 0x6391, 0x6a84,
++	0xa28a, 0x0002, 0x1a04, 0x6391, 0x82ff, 0x1138, 0x6888, 0x698c,
++	0xa105, 0x0118, 0x2001, 0x6494, 0x0018, 0xa280, 0x648a, 0x2005,
++	0x70c6, 0x7010, 0xa015, 0x0904, 0x6476, 0x080c, 0x15e5, 0x1118,
++	0x7007, 0x000f, 0x0005, 0x2d00, 0x7022, 0x70c4, 0x2060, 0x2c05,
++	0x6836, 0xe004, 0xad00, 0x7096, 0xe008, 0xa20a, 0x1210, 0xa00e,
++	0x2200, 0x7112, 0xe20c, 0x8003, 0x800b, 0xa296, 0x0004, 0x0108,
++	0xa108, 0x719a, 0x810b, 0x719e, 0xae90, 0x0022, 0x080c, 0x164d,
++	0x7090, 0xa08e, 0x0100, 0x0170, 0xa086, 0x0200, 0x0118, 0x7007,
++	0x0010, 0x0005, 0x7020, 0x2068, 0x080c, 0x1619, 0x7014, 0x2068,
++	0x0804, 0x6391, 0x7020, 0x2068, 0x7018, 0x6802, 0x6807, 0x0000,
++	0x2d08, 0x2068, 0x6906, 0x711a, 0x0804, 0x6431, 0x7014, 0x2068,
++	0x7007, 0x0001, 0x6884, 0xa005, 0x1128, 0x6888, 0x698c, 0xa105,
++	0x0108, 0x00b1, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x0904,
++	0x66ff, 0x04b8, 0x648c, 0x6490, 0x0002, 0x0011, 0x0007, 0x0004,
++	0x000a, 0x000f, 0x0005, 0x0006, 0x000a, 0x0011, 0x0005, 0x0004,
++	0x00f6, 0x00e6, 0x00c6, 0x0076, 0x0066, 0x6f88, 0x6e8c, 0x6804,
++	0x2060, 0xacf0, 0x0021, 0xacf8, 0x0027, 0x2009, 0x0005, 0x700c,
++	0x7816, 0x7008, 0x7812, 0x7004, 0x7806, 0x7000, 0x7802, 0x7e0e,
++	0x7f0a, 0x8109, 0x0128, 0xaef2, 0x0004, 0xaffa, 0x0006, 0x0c78,
++	0x6004, 0xa065, 0x1d30, 0x006e, 0x007e, 0x00ce, 0x00ee, 0x00fe,
++	0x0005, 0x2009, 0xc631, 0x210c, 0x81ff, 0x1198, 0x6838, 0xa084,
++	0x00ff, 0x683a, 0x080c, 0x4fa6, 0x1108, 0x0005, 0x080c, 0x592e,
++	0x0126, 0x2091, 0x8000, 0x080c, 0xaf03, 0x080c, 0x580a, 0x012e,
++	0x0ca0, 0x2001, 0x0028, 0x2009, 0x0000, 0x0c80, 0x2009, 0xc631,
++	0x210c, 0x81ff, 0x11d8, 0x6858, 0xa005, 0x01d8, 0x2001, 0xc756,
++	0x2004, 0xa086, 0x0000, 0x01c0, 0x6838, 0xa084, 0x00ff, 0x683a,
++	0x6853, 0x0000, 0x080c, 0x5068, 0x1108, 0x0005, 0x684a, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x580a, 0x012e, 0x0cb8, 0x2001, 0x0028,
++	0x0ca8, 0x2001, 0x0000, 0x0c90, 0x2001, 0x002c, 0x0c78, 0x2009,
++	0xc631, 0x210c, 0x81ff, 0x11b0, 0x6858, 0xa005, 0x01c0, 0x6838,
++	0xa084, 0x00ff, 0x683a, 0x6853, 0x0000, 0x080c, 0x50ba, 0x1108,
++	0x0005, 0x0126, 0x2091, 0x8000, 0x684a, 0x6952, 0x080c, 0x580a,
++	0x012e, 0x0cb0, 0x2001, 0x0028, 0x2009, 0x0000, 0x0c90, 0x2001,
++	0x0000, 0x0c78, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906, 0x711a,
++	0x7010, 0x8001, 0x7012, 0x0118, 0x7007, 0x0006, 0x0030, 0x7014,
++	0x2068, 0x7007, 0x0001, 0x7048, 0x080f, 0x0005, 0x7007, 0x0001,
++	0x6944, 0x810f, 0xa18c, 0x00ff, 0x6848, 0xa084, 0x00ff, 0x20a9,
++	0x0001, 0xa096, 0x0001, 0x01b0, 0x2009, 0x0000, 0x20a9, 0x00ff,
++	0xa096, 0x0002, 0x0178, 0xa005, 0x11f0, 0x6944, 0x810f, 0xa18c,
++	0x00ff, 0x080c, 0x533d, 0x11b8, 0x0066, 0x6e50, 0x080c, 0x543c,
++	0x006e, 0x0088, 0x0046, 0x2011, 0xc60c, 0x2224, 0xc484, 0x2412,
++	0x004e, 0x00c6, 0x080c, 0x533d, 0x1110, 0x080c, 0x559d, 0x8108,
++	0x1f04, 0x656a, 0x00ce, 0x684c, 0xd084, 0x1118, 0x080c, 0x1619,
++	0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x580a, 0x012e, 0x0005,
++	0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0xc653, 0x2004,
++	0xd0a4, 0x0580, 0x2061, 0xc9bc, 0x6100, 0xd184, 0x0178, 0x6858,
++	0xa084, 0x00ff, 0x1550, 0x6000, 0xd084, 0x0520, 0x6004, 0xa005,
++	0x1538, 0x6003, 0x0000, 0x600b, 0x0000, 0x00c8, 0x2011, 0x0001,
++	0x6860, 0xa005, 0x1110, 0x2001, 0x001e, 0x8000, 0x6016, 0x6858,
++	0xa084, 0x00ff, 0x0178, 0x6006, 0x6858, 0x8007, 0xa084, 0x00ff,
++	0x0148, 0x600a, 0x6858, 0x8000, 0x1108, 0xc28d, 0x6202, 0x012e,
++	0x0804, 0x67c3, 0x012e, 0x0804, 0x67bd, 0x012e, 0x0804, 0x67b7,
++	0x012e, 0x0804, 0x67ba, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001,
++	0x2001, 0xc653, 0x2004, 0xd0a4, 0x05e0, 0x2061, 0xc9bc, 0x6000,
++	0xd084, 0x05b8, 0x6204, 0x6308, 0xd08c, 0x1530, 0x6c48, 0xa484,
++	0x0003, 0x0170, 0x6958, 0xa18c, 0x00ff, 0x8001, 0x1120, 0x2100,
++	0xa210, 0x0620, 0x0028, 0x8001, 0x1508, 0x2100, 0xa212, 0x02f0,
++	0xa484, 0x000c, 0x0188, 0x6958, 0x810f, 0xa18c, 0x00ff, 0xa082,
++	0x0004, 0x1120, 0x2100, 0xa318, 0x0288, 0x0030, 0xa082, 0x0004,
++	0x1168, 0x2100, 0xa31a, 0x0250, 0x6860, 0xa005, 0x0110, 0x8000,
++	0x6016, 0x6206, 0x630a, 0x012e, 0x0804, 0x67c3, 0x012e, 0x0804,
++	0x67c0, 0x012e, 0x0804, 0x67bd, 0x0126, 0x2091, 0x8000, 0x7007,
++	0x0001, 0x2061, 0xc9bc, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318,
++	0x0220, 0x630a, 0x012e, 0x0804, 0x67d1, 0x012e, 0x0804, 0x67c0,
++	0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, 0x684c, 0xd0ac,
++	0x0148, 0x00c6, 0x2061, 0xc9bc, 0x6000, 0xa084, 0xfcff, 0x6002,
++	0x00ce, 0x0448, 0x6858, 0xa005, 0x05d0, 0x685c, 0xa065, 0x0598,
++	0x2001, 0xc631, 0x2004, 0xa005, 0x0118, 0x080c, 0xae54, 0x0068,
++	0x6013, 0x0400, 0x6057, 0x0000, 0x694c, 0xd1a4, 0x0110, 0x6950,
++	0x6156, 0x2009, 0x0041, 0x080c, 0x9613, 0x6958, 0xa18c, 0xff00,
++	0xa186, 0x2000, 0x1140, 0x0026, 0x2009, 0x0000, 0x2011, 0xfdff,
++	0x080c, 0x712e, 0x002e, 0x684c, 0xd0c4, 0x0148, 0x2061, 0xc9bc,
++	0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce,
++	0x012e, 0x0804, 0x67c3, 0x00ce, 0x012e, 0x0804, 0x67bd, 0x6954,
++	0xa186, 0x002e, 0x0d40, 0xa186, 0x002d, 0x0d28, 0xa186, 0x0045,
++	0x0528, 0xa186, 0x002a, 0x1130, 0x2001, 0xc60c, 0x200c, 0xc194,
++	0x2102, 0x08c8, 0xa186, 0x0020, 0x0170, 0xa186, 0x0029, 0x1d18,
++	0x6944, 0xa18c, 0xff00, 0x810f, 0x080c, 0x533d, 0x1960, 0x6000,
++	0xc0e4, 0x6002, 0x0840, 0x685c, 0xa065, 0x09a8, 0x6007, 0x0024,
++	0x2001, 0xc8fd, 0x2004, 0x6016, 0x0804, 0x665b, 0x685c, 0xa065,
++	0x0950, 0x00e6, 0x6860, 0xa075, 0x2001, 0xc631, 0x2004, 0xa005,
++	0x0150, 0x080c, 0xae54, 0x8eff, 0x0118, 0x2e60, 0x080c, 0xae54,
++	0x00ee, 0x0804, 0x665b, 0x6020, 0xc0dc, 0xc0d5, 0x6022, 0x2e60,
++	0x6007, 0x003a, 0x6870, 0xa005, 0x0130, 0x6007, 0x003b, 0x6874,
++	0x602a, 0x6878, 0x6012, 0x6003, 0x0001, 0x080c, 0x7999, 0x080c,
++	0x7e94, 0x00ee, 0x0804, 0x665b, 0x2061, 0xc9bc, 0x6000, 0xd084,
++	0x0190, 0xd08c, 0x1904, 0x67d1, 0x0126, 0x2091, 0x8000, 0x6204,
++	0x8210, 0x0220, 0x6206, 0x012e, 0x0804, 0x67d1, 0x012e, 0x6853,
++	0x0016, 0x0804, 0x67ca, 0x6853, 0x0007, 0x0804, 0x67ca, 0x6834,
++	0x8007, 0xa084, 0x00ff, 0x1118, 0x080c, 0x6375, 0x0078, 0x2030,
++	0x8001, 0x1120, 0x7007, 0x0001, 0x0051, 0x0040, 0x7007, 0x0006,
++	0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x66ff, 0x0005, 0x00e6,
++	0x0126, 0x2091, 0x8000, 0xa03e, 0x2009, 0xc631, 0x210c, 0x81ff,
++	0x1904, 0x677d, 0x2009, 0xc60c, 0x210c, 0xd194, 0x1904, 0x67a7,
++	0x6848, 0x2070, 0xae82, 0xce00, 0x0a04, 0x6771, 0x2001, 0xc617,
++	0x2004, 0xae02, 0x1a04, 0x6771, 0x711c, 0xa186, 0x0006, 0x1904,
++	0x6760, 0x7018, 0xa005, 0x0904, 0x677d, 0x2004, 0xd0e4, 0x1904,
++	0x67a2, 0x2061, 0xc9bc, 0x6100, 0xa184, 0x0301, 0xa086, 0x0001,
++	0x1550, 0x7020, 0xd0dc, 0x1904, 0x67aa, 0x6853, 0x0000, 0x6803,
++	0x0000, 0x2d08, 0x7010, 0xa005, 0x1158, 0x7112, 0x684c, 0xd0f4,
++	0x1904, 0x67ad, 0x2e60, 0x080c, 0x708a, 0x012e, 0x00ee, 0x0005,
++	0x2068, 0x6800, 0xa005, 0x1de0, 0x6902, 0x2168, 0x684c, 0xd0f4,
++	0x1904, 0x67ad, 0x012e, 0x00ee, 0x0005, 0x012e, 0x00ee, 0x6853,
++	0x0006, 0x0804, 0x67ca, 0xd184, 0x0dc0, 0xd1c4, 0x11a8, 0x00b8,
++	0x6944, 0xa18c, 0xff00, 0x810f, 0x080c, 0x533d, 0x15d8, 0x6000,
++	0xd0e4, 0x15c0, 0x711c, 0xa186, 0x0007, 0x1118, 0x6853, 0x0002,
++	0x0498, 0x6853, 0x0008, 0x0480, 0x6853, 0x000e, 0x0468, 0x6853,
++	0x0017, 0x0450, 0x6853, 0x0035, 0x0438, 0x2001, 0xc672, 0x2004,
++	0xd0fc, 0x01e8, 0x6848, 0x2070, 0xae82, 0xce00, 0x02c0, 0x605c,
++	0xae02, 0x12a8, 0x711c, 0xa186, 0x0006, 0x1188, 0x7018, 0xa005,
++	0x0170, 0x2004, 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, 0xa086,
++	0x0007, 0x1904, 0x670a, 0x7003, 0x0002, 0x0804, 0x670a, 0x6853,
++	0x0028, 0x0010, 0x6853, 0x0029, 0x012e, 0x00ee, 0x0418, 0x6853,
++	0x002a, 0x0cd0, 0x6853, 0x0045, 0x0cb8, 0x2e60, 0x2019, 0x0002,
++	0x6017, 0x0014, 0x080c, 0xbd55, 0x012e, 0x00ee, 0x0005, 0x2009,
++	0x003e, 0x0058, 0x2009, 0x0004, 0x0040, 0x2009, 0x0006, 0x0028,
++	0x2009, 0x0016, 0x0010, 0x2009, 0x0001, 0x6854, 0xa084, 0xff00,
++	0xa105, 0x6856, 0x0126, 0x2091, 0x8000, 0x080c, 0x580a, 0x012e,
++	0x0005, 0x080c, 0x1619, 0x0005, 0x702c, 0x7130, 0x8108, 0xa102,
++	0x0230, 0xa00e, 0x7034, 0x7072, 0x7038, 0x7076, 0x0058, 0x7070,
++	0xa080, 0x0040, 0x7072, 0x1230, 0x7074, 0xa081, 0x0000, 0x7076,
++	0xa085, 0x0001, 0x7932, 0x7132, 0x0005, 0x00d6, 0x080c, 0x7081,
++	0x00de, 0x0005, 0x2001, 0xc756, 0x2004, 0xa086, 0x0000, 0x0904,
++	0x684d, 0x080c, 0x768f, 0x0904, 0x6850, 0x6868, 0xa084, 0x0007,
++	0x0904, 0x6844, 0x080c, 0x958d, 0x0904, 0x6847, 0x2d00, 0x6012,
++	0x6834, 0xa084, 0x00ff, 0xa086, 0x0035, 0x1198, 0x2001, 0xc8e5,
++	0x2004, 0xa086, 0xaaaa, 0x0130, 0x2001, 0xc635, 0x2004, 0xa084,
++	0x0028, 0x05c8, 0x6008, 0xc0fd, 0x600a, 0x2001, 0xc8d3, 0x2004,
++	0x0098, 0x6870, 0xa084, 0x00ff, 0x696c, 0xa18c, 0xff00, 0xa105,
++	0x696c, 0xa18c, 0x00ff, 0x080c, 0x29c7, 0x11e0, 0x00c6, 0x080c,
++	0x533d, 0x2c00, 0x00ce, 0x11b0, 0x601a, 0x601f, 0x0001, 0x2009,
++	0x0040, 0x6834, 0xa084, 0x00ff, 0xa086, 0x0035, 0x0110, 0x2009,
++	0x0041, 0x080c, 0x9613, 0x0005, 0x684b, 0x0101, 0x0078, 0x684b,
++	0x002c, 0x0060, 0x684b, 0x0028, 0x0080, 0x684b, 0x0104, 0x0030,
++	0x684b, 0x0105, 0x0018, 0x684b, 0x0106, 0x0038, 0x0126, 0x2091,
++	0x8000, 0x080c, 0x580a, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000,
++	0x080c, 0x580a, 0x012e, 0x080c, 0x95e3, 0x0005, 0x00d6, 0x00c6,
++	0x0036, 0x0026, 0x0016, 0x7007, 0x0001, 0x6a44, 0xa282, 0x0004,
++	0x1a04, 0x68b1, 0xd284, 0x0170, 0x6a4c, 0xa290, 0xc77b, 0x2204,
++	0xa065, 0x6004, 0x05e0, 0x8007, 0xa084, 0x00ff, 0xa084, 0x0006,
++	0x1108, 0x04a8, 0x2c10, 0x080c, 0x958d, 0x1118, 0x080c, 0xaf0d,
++	0x05a0, 0x621a, 0x6844, 0x0002, 0x6890, 0x6895, 0x6898, 0x689e,
++	0x2019, 0x0002, 0x080c, 0xc10d, 0x0060, 0x080c, 0xc0a4, 0x0048,
++	0x2019, 0x0002, 0x6950, 0x080c, 0xc0bf, 0x0018, 0x6950, 0x080c,
++	0xc0a4, 0x080c, 0x95e3, 0x6857, 0x0000, 0x0126, 0x2091, 0x8000,
++	0x080c, 0x580a, 0x012e, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00de,
++	0x0005, 0x6857, 0x0006, 0x0c88, 0x6857, 0x0002, 0x0c70, 0x6857,
++	0x0005, 0x0c58, 0x6857, 0x0004, 0x0c40, 0x6857, 0x0007, 0x0c28,
++	0x00d6, 0x2011, 0x0004, 0x2204, 0xa085, 0x8002, 0x2012, 0x00de,
++	0x0005, 0x20e1, 0x0002, 0x3d08, 0x20e1, 0x2000, 0x3d00, 0xa084,
++	0x7000, 0x0118, 0xa086, 0x1000, 0x15e0, 0x20e1, 0x0000, 0x3d00,
++	0xa094, 0xff00, 0x8217, 0xa084, 0xf000, 0xa086, 0x3000, 0x1160,
++	0xa184, 0xff00, 0x8007, 0xa086, 0x0008, 0x1558, 0x080c, 0x2f69,
++	0x1540, 0x080c, 0x6b32, 0x0400, 0x20e1, 0x0004, 0x3d60, 0xd1bc,
++	0x1170, 0x2100, 0xa084, 0xff00, 0xa086, 0x0500, 0x1138, 0x0026,
++	0x2c10, 0x080c, 0x6d90, 0x002e, 0x01a0, 0x0070, 0x3e60, 0xac84,
++	0x0007, 0x1178, 0xac82, 0xce00, 0x0260, 0x685c, 0xac02, 0x1248,
++	0x2009, 0x0047, 0x080c, 0x9613, 0x7a1c, 0xd284, 0x1904, 0x68c9,
++	0x0005, 0xa016, 0x080c, 0x1870, 0x0cb8, 0x0cd8, 0x781c, 0xd08c,
++	0x0500, 0x0156, 0x0136, 0x0146, 0x20e1, 0x3000, 0x3d20, 0x3e28,
++	0xa584, 0x0076, 0x1538, 0xa484, 0x7000, 0xa086, 0x1000, 0x11a8,
++	0x080c, 0x6991, 0x01f8, 0x20e1, 0x3000, 0x7828, 0x7828, 0x080c,
++	0x69ad, 0x014e, 0x013e, 0x015e, 0x2009, 0xc92f, 0x2104, 0xa005,
++	0x1108, 0x0005, 0x080c, 0x7e94, 0x0ce0, 0xa484, 0x7000, 0x1548,
++	0x080c, 0x6991, 0x01d8, 0x7000, 0xa084, 0xff00, 0xa086, 0x8100,
++	0x0d10, 0x00a0, 0xd5a4, 0x0178, 0x0056, 0x0046, 0x080c, 0x1f2d,
++	0x080c, 0x25fb, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202,
++	0x004e, 0x005e, 0x0048, 0x04a9, 0x6887, 0x0000, 0x080c, 0xc536,
++	0x20e1, 0x3000, 0x7828, 0x7828, 0x00b9, 0x014e, 0x013e, 0x015e,
++	0x0880, 0x0439, 0x1130, 0x7000, 0xa084, 0xff00, 0xa086, 0x8100,
++	0x1d68, 0x080c, 0xc536, 0x20e1, 0x3000, 0x7828, 0x7828, 0x0056,
++	0x080c, 0x6e1f, 0x005e, 0x0c40, 0x2001, 0xc60e, 0x2004, 0xd08c,
++	0x0178, 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1148, 0x0026,
++	0x0036, 0x2011, 0x8048, 0x2518, 0x080c, 0x407d, 0x003e, 0x002e,
++	0x0005, 0xa484, 0x01ff, 0x6886, 0xa005, 0x0160, 0xa080, 0x001f,
++	0xa084, 0x03f8, 0x80ac, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a,
++	0x53a5, 0x0005, 0x20a9, 0x000c, 0x20e1, 0x1000, 0x2ea0, 0x2099,
++	0x020a, 0x53a5, 0xa085, 0x0001, 0x0ca0, 0x7000, 0xa084, 0xff00,
++	0xa08c, 0xf000, 0x8007, 0xa196, 0x0000, 0x1118, 0x0804, 0x6c37,
++	0x0005, 0xa196, 0x2000, 0x1148, 0x6900, 0xa18e, 0x0001, 0x1118,
++	0x080c, 0x47cb, 0x0ca8, 0x0039, 0x0c98, 0xa196, 0x8000, 0x1d80,
++	0x080c, 0x6ce3, 0x0c68, 0x00c6, 0x6a84, 0x82ff, 0x0904, 0x6b2c,
++	0x7110, 0xa18c, 0xff00, 0x810f, 0xa196, 0x0001, 0x0120, 0xa196,
++	0x0023, 0x1904, 0x6b2c, 0xa08e, 0x0023, 0x1570, 0x080c, 0x6d7e,
++	0x0904, 0x6b2c, 0x7124, 0x610a, 0x7030, 0xa08e, 0x0200, 0x1150,
++	0x7034, 0xa005, 0x1904, 0x6b2c, 0x2009, 0x0015, 0x080c, 0x9613,
++	0x0804, 0x6b2c, 0xa08e, 0x0214, 0x0118, 0xa08e, 0x0210, 0x1130,
++	0x2009, 0x0015, 0x080c, 0x9613, 0x0804, 0x6b2c, 0xa08e, 0x0100,
++	0x1904, 0x6b2c, 0x7034, 0xa005, 0x1904, 0x6b2c, 0x2009, 0x0016,
++	0x080c, 0x9613, 0x0804, 0x6b2c, 0xa08e, 0x0022, 0x1904, 0x6b2c,
++	0x7030, 0xa08e, 0x0300, 0x1580, 0x68d4, 0xd0a4, 0x0528, 0xc0b5,
++	0x68d6, 0x7100, 0xa18c, 0x00ff, 0x6972, 0x7004, 0x6876, 0x00f6,
++	0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006, 0xa084, 0x00ff, 0x0016,
++	0x2008, 0x080c, 0x29f1, 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe,
++	0x080c, 0x29c7, 0x6952, 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086,
++	0x2071, 0xc600, 0x70a6, 0x00ee, 0x7034, 0xa005, 0x1904, 0x6b2c,
++	0x2009, 0x0017, 0x0804, 0x6af2, 0xa08e, 0x0400, 0x1158, 0x7034,
++	0xa005, 0x1904, 0x6b2c, 0x68d4, 0xc0a5, 0x68d6, 0x2009, 0x0030,
++	0x0804, 0x6af2, 0xa08e, 0x0500, 0x1140, 0x7034, 0xa005, 0x1904,
++	0x6b2c, 0x2009, 0x0018, 0x0804, 0x6af2, 0xa08e, 0x2010, 0x1120,
++	0x2009, 0x0019, 0x0804, 0x6af2, 0xa08e, 0x2110, 0x1120, 0x2009,
++	0x001a, 0x0804, 0x6af2, 0xa08e, 0x5200, 0x1140, 0x7034, 0xa005,
++	0x1904, 0x6b2c, 0x2009, 0x001b, 0x0804, 0x6af2, 0xa08e, 0x5000,
++	0x1140, 0x7034, 0xa005, 0x1904, 0x6b2c, 0x2009, 0x001c, 0x0804,
++	0x6af2, 0xa08e, 0x1300, 0x1120, 0x2009, 0x0034, 0x0804, 0x6af2,
++	0xa08e, 0x1200, 0x1140, 0x7034, 0xa005, 0x1904, 0x6b2c, 0x2009,
++	0x0024, 0x0804, 0x6af2, 0xa08c, 0xff00, 0xa18e, 0x2400, 0x1120,
++	0x2009, 0x002d, 0x0804, 0x6af2, 0xa08c, 0xff00, 0xa18e, 0x5300,
++	0x1120, 0x2009, 0x002a, 0x0804, 0x6af2, 0xa08e, 0x0f00, 0x1120,
++	0x2009, 0x0020, 0x0804, 0x6af2, 0xa08e, 0x5300, 0x1108, 0x00d8,
++	0xa08e, 0x6104, 0x11c0, 0x2011, 0xcc8d, 0x8208, 0x2204, 0xa082,
++	0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011, 0x8015, 0x211c, 0x8108,
++	0x0046, 0x2124, 0x080c, 0x407d, 0x004e, 0x8108, 0x1f04, 0x6abc,
++	0x2009, 0x0023, 0x0438, 0xa08e, 0x6000, 0x1118, 0x2009, 0x003f,
++	0x0408, 0xa08e, 0x5400, 0x1158, 0x080c, 0x6e79, 0x1904, 0x6b2c,
++	0x2009, 0x0046, 0x0016, 0x2001, 0xc8d3, 0x2064, 0x0498, 0xa08e,
++	0x5500, 0x1140, 0x080c, 0x6eac, 0x2009, 0x0041, 0x0158, 0x2009,
++	0x0042, 0x0040, 0xa08e, 0x7800, 0x1118, 0x2009, 0x0045, 0x0010,
++	0x2009, 0x001d, 0x0016, 0x2011, 0xcc83, 0x2204, 0x8211, 0x220c,
++	0x080c, 0x29c7, 0x1598, 0x080c, 0x52e1, 0x1580, 0x6612, 0x6516,
++	0x86ff, 0x01e8, 0x001e, 0x0016, 0xa186, 0x0017, 0x1158, 0x6870,
++	0xa606, 0x11a8, 0x6874, 0xa506, 0xa084, 0xff00, 0x1180, 0x6000,
++	0xc0f5, 0x6002, 0xa186, 0x0046, 0x1150, 0x6870, 0xa606, 0x1138,
++	0x6874, 0xa506, 0xa084, 0xff00, 0x1110, 0x001e, 0x0068, 0x00c6,
++	0x080c, 0x958d, 0x0168, 0x001e, 0x611a, 0x601f, 0x0004, 0x7120,
++	0x610a, 0x001e, 0x080c, 0x9613, 0x00ce, 0x0005, 0x001e, 0x0ce0,
++	0x00ce, 0x0ce0, 0x00c6, 0x0046, 0x080c, 0x6b86, 0x1904, 0x6b83,
++	0xa28e, 0x0033, 0x11e8, 0x080c, 0x6d7e, 0x0904, 0x6b83, 0x7124,
++	0x610a, 0x7030, 0xa08e, 0x0200, 0x1140, 0x7034, 0xa005, 0x15d8,
++	0x2009, 0x0015, 0x080c, 0x9613, 0x04b0, 0xa08e, 0x0100, 0x1598,
++	0x7034, 0xa005, 0x1580, 0x2009, 0x0016, 0x080c, 0x9613, 0x0458,
++	0xa28e, 0x0032, 0x1540, 0x7030, 0xa08e, 0x1400, 0x1520, 0x2009,
++	0x0038, 0x0016, 0x2011, 0xcc83, 0x2204, 0x8211, 0x220c, 0x080c,
++	0x29c7, 0x11c0, 0x080c, 0x52e1, 0x11a8, 0x6612, 0x6516, 0x00c6,
++	0x080c, 0x958d, 0x0170, 0x001e, 0x611a, 0x080c, 0xb05e, 0x601f,
++	0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x9613, 0x080c, 0x7e94,
++	0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce, 0x0005, 0x00f6, 0x00d6,
++	0x0026, 0x0016, 0x0136, 0x0146, 0x0156, 0x3c00, 0x0006, 0x2079,
++	0x0030, 0x2069, 0x0200, 0x080c, 0x1fec, 0x1590, 0x080c, 0x1e97,
++	0x05e0, 0x04f1, 0x1130, 0x7908, 0xa18c, 0x1fff, 0xa182, 0x0011,
++	0x1688, 0x20a9, 0x000c, 0x20e1, 0x0000, 0x2ea0, 0x2099, 0x020a,
++	0x53a5, 0x20e1, 0x2000, 0x2001, 0x020a, 0x2004, 0x7a0c, 0x7808,
++	0xa080, 0x0007, 0xa084, 0x1ff8, 0x0419, 0x1120, 0xa08a, 0x0140,
++	0x1a0c, 0x1519, 0x80ac, 0x20e1, 0x6000, 0x2099, 0x020a, 0x53a5,
++	0x20e1, 0x7000, 0x6828, 0x6828, 0x7803, 0x0004, 0xa294, 0x0070,
++	0x000e, 0x20e0, 0x015e, 0x014e, 0x013e, 0x001e, 0x002e, 0x00de,
++	0x00fe, 0x0005, 0xa016, 0x080c, 0x1870, 0xa085, 0x0001, 0x0c80,
++	0x0006, 0x2001, 0x0111, 0x2004, 0xa084, 0x0003, 0x000e, 0x0005,
++	0x0046, 0x00e6, 0x00d6, 0x2028, 0x2130, 0xa696, 0x00ff, 0x1198,
++	0xa596, 0xfffd, 0x1120, 0x2009, 0x007f, 0x0804, 0x6c32, 0xa596,
++	0xfffe, 0x1118, 0x2009, 0x007e, 0x04e8, 0xa596, 0xfffc, 0x1118,
++	0x2009, 0x0080, 0x04b8, 0x2011, 0x0000, 0x2019, 0xc635, 0x231c,
++	0xd3ac, 0x0138, 0x2021, 0x0000, 0x20a9, 0x00ff, 0x2071, 0xc77b,
++	0x0030, 0x2021, 0x0081, 0x20a9, 0x007e, 0x2071, 0xc7fc, 0x2e1c,
++	0x83ff, 0x1128, 0x82ff, 0x1198, 0x2410, 0xc2fd, 0x0080, 0x2368,
++	0x6f10, 0x0006, 0x2100, 0xa706, 0x000e, 0x6b14, 0x1120, 0xa346,
++	0x1110, 0x2408, 0x0078, 0x87ff, 0x1110, 0x83ff, 0x0d58, 0x8420,
++	0x8e70, 0x1f04, 0x6c0f, 0x82ff, 0x1118, 0xa085, 0x0001, 0x0018,
++	0xc2fc, 0x2208, 0xa006, 0x00de, 0x00ee, 0x004e, 0x0005, 0xa084,
++	0x0007, 0x000a, 0x0005, 0x6c43, 0x6c43, 0x6c43, 0x6e0c, 0x6c43,
++	0x6c44, 0x6c59, 0x6cce, 0x0005, 0x7110, 0xd1bc, 0x0188, 0x7120,
++	0x2160, 0xac8c, 0x0007, 0x1160, 0xac8a, 0xce00, 0x0248, 0x685c,
++	0xac02, 0x1230, 0x7124, 0x610a, 0x2009, 0x0046, 0x080c, 0x9613,
++	0x0005, 0x00c6, 0xa484, 0x01ff, 0x0904, 0x6cac, 0x7110, 0xd1bc,
++	0x1904, 0x6cac, 0x2011, 0xcc83, 0x2204, 0x8211, 0x220c, 0x080c,
++	0x29c7, 0x1904, 0x6cac, 0x080c, 0x52e1, 0x15f0, 0x6612, 0x6516,
++	0x6000, 0xd0ec, 0x15c8, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286,
++	0x0006, 0x0148, 0x6204, 0xa294, 0x00ff, 0xa286, 0x0006, 0x11a0,
++	0xa295, 0x0600, 0x6206, 0x00c6, 0x080c, 0x958d, 0x001e, 0x0530,
++	0x611a, 0x601f, 0x0006, 0x7120, 0x610a, 0x7130, 0x6152, 0x2009,
++	0x0044, 0x080c, 0x9613, 0x00c0, 0x00c6, 0x080c, 0x958d, 0x001e,
++	0x0198, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0xa286, 0x0004,
++	0x1118, 0x6007, 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001,
++	0x080c, 0x79df, 0x080c, 0x7e94, 0x00ce, 0x0005, 0x2001, 0xc60d,
++	0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x407d, 0x00c6,
++	0x080c, 0xaf0d, 0x001e, 0x0d80, 0x611a, 0x601f, 0x0006, 0x7120,
++	0x610a, 0x7130, 0x6152, 0x6013, 0x0300, 0x6003, 0x0001, 0x6007,
++	0x0041, 0x080c, 0x7999, 0x080c, 0x7e94, 0x08f0, 0x7110, 0xd1bc,
++	0x0188, 0x7020, 0x2060, 0xac84, 0x0007, 0x1160, 0xac82, 0xce00,
++	0x0248, 0x685c, 0xac02, 0x1230, 0x7124, 0x610a, 0x2009, 0x0045,
++	0x080c, 0x9613, 0x0005, 0x0006, 0x080c, 0x2f69, 0x000e, 0x1168,
++	0x7110, 0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000, 0x1130, 0xa084,
++	0x000f, 0xa08a, 0x0006, 0x1208, 0x000b, 0x0005, 0x6cfc, 0x6cfd,
++	0x6cfc, 0x6cfc, 0x6d66, 0x6d72, 0x0005, 0x7110, 0xd1bc, 0x0120,
++	0x702c, 0xd084, 0x0904, 0x6d65, 0x700c, 0x7108, 0x080c, 0x29c7,
++	0x1904, 0x6d65, 0x080c, 0x52e1, 0x1904, 0x6d65, 0x6612, 0x6516,
++	0x6204, 0x7110, 0xd1bc, 0x01f8, 0xa28c, 0x00ff, 0xa186, 0x0004,
++	0x0118, 0xa186, 0x0006, 0x15c8, 0x00c6, 0x080c, 0x6d7e, 0x00ce,
++	0x0904, 0x6d65, 0x00c6, 0x080c, 0x958d, 0x001e, 0x05f0, 0x611a,
++	0x080c, 0xb05e, 0x601f, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088,
++	0x080c, 0x9613, 0x0490, 0xa28c, 0x00ff, 0xa186, 0x0006, 0x0160,
++	0xa186, 0x0004, 0x0148, 0xa294, 0xff00, 0x8217, 0xa286, 0x0004,
++	0x0118, 0xa286, 0x0006, 0x1188, 0x00c6, 0x080c, 0x958d, 0x001e,
++	0x01e0, 0x611a, 0x080c, 0xb05e, 0x601f, 0x0005, 0x7120, 0x610a,
++	0x2009, 0x0088, 0x080c, 0x9613, 0x0080, 0x00c6, 0x080c, 0x958d,
++	0x001e, 0x0158, 0x611a, 0x080c, 0xb05e, 0x601f, 0x0004, 0x7120,
++	0x610a, 0x2009, 0x0001, 0x080c, 0x9613, 0x0005, 0x7110, 0xd1bc,
++	0x0140, 0x00a1, 0x0130, 0x7124, 0x610a, 0x2009, 0x0089, 0x080c,
++	0x9613, 0x0005, 0x7110, 0xd1bc, 0x0140, 0x0041, 0x0130, 0x7124,
++	0x610a, 0x2009, 0x008a, 0x080c, 0x9613, 0x0005, 0x7020, 0x2060,
++	0xac84, 0x0007, 0x1158, 0xac82, 0xce00, 0x0240, 0x2001, 0xc617,
++	0x2004, 0xac02, 0x1218, 0xa085, 0x0001, 0x0005, 0xa006, 0x0ce8,
++	0x00c6, 0x00d6, 0x00e6, 0x080c, 0x2f69, 0x1904, 0x6e07, 0x2001,
++	0xc756, 0x2004, 0xa086, 0x0000, 0x0904, 0x6e07, 0x20e1, 0x0000,
++	0x3d08, 0xa18c, 0x00ff, 0xa18e, 0x00ff, 0x1500, 0x3e00, 0xa086,
++	0xffff, 0x11e0, 0x2001, 0xc8d3, 0x2064, 0x2009, 0x00ff, 0x0006,
++	0x0016, 0x2001, 0xc61d, 0x2004, 0x20e1, 0x0001, 0x3e08, 0xa106,
++	0x1130, 0x2001, 0xc61c, 0x2004, 0x3d08, 0xa106, 0x0118, 0x001e,
++	0x000e, 0x00a8, 0x001e, 0x000e, 0x0804, 0x6e07, 0x20e1, 0x0001,
++	0x3d08, 0x3e00, 0x0156, 0x080c, 0x29c7, 0x015e, 0x15c0, 0x080c,
++	0x533d, 0x0128, 0x2001, 0xc8d3, 0x2064, 0x2009, 0x00ff, 0x2138,
++	0x873f, 0x2c00, 0x2070, 0x20e1, 0x0003, 0x3d18, 0x831f, 0xa39c,
++	0x00ff, 0x20e1, 0x2000, 0x3d00, 0xa084, 0x7000, 0xa086, 0x1000,
++	0x0120, 0x080c, 0x75ea, 0x11d8, 0x0080, 0x080c, 0x958d, 0x01b8,
++	0x20e1, 0x0002, 0x3e08, 0xd19c, 0x0118, 0x6124, 0xc19d, 0x6126,
++	0x2e00, 0x601a, 0x620a, 0x601f, 0x0009, 0x2009, 0x0101, 0x080c,
++	0x9613, 0xa085, 0x0001, 0x00ee, 0x00de, 0x00ce, 0x0005, 0xa006,
++	0x00ee, 0x00de, 0x00ce, 0x0005, 0x7110, 0xd1bc, 0x1178, 0x7024,
++	0x2060, 0xac84, 0x0007, 0x1150, 0xac82, 0xce00, 0x0238, 0x685c,
++	0xac02, 0x1220, 0x2009, 0x0051, 0x080c, 0x9613, 0x0005, 0x2031,
++	0x0105, 0x0069, 0x0005, 0x2031, 0x0206, 0x0049, 0x0005, 0x2031,
++	0x0207, 0x0029, 0x0005, 0x2031, 0x0213, 0x0009, 0x0005, 0x00c6,
++	0x00d6, 0x00f6, 0x7000, 0xa084, 0xf000, 0xa086, 0xc000, 0x05b0,
++	0x080c, 0x958d, 0x0598, 0x0066, 0x00c6, 0x0046, 0x2011, 0xcc83,
++	0x2204, 0x8211, 0x220c, 0x080c, 0x29c7, 0x1580, 0x080c, 0x52e1,
++	0x1568, 0x6612, 0x6516, 0x2c00, 0x004e, 0x00ce, 0x601a, 0x080c,
++	0xb05e, 0x080c, 0x1602, 0x01f0, 0x2d00, 0x6056, 0x6803, 0x0000,
++	0x6837, 0x0000, 0x6c3a, 0xadf8, 0x000f, 0x20a9, 0x000e, 0x2fa0,
++	0x2e98, 0x53a3, 0x006e, 0x6612, 0x6007, 0x003e, 0x601f, 0x0001,
++	0x6003, 0x0001, 0x080c, 0x79df, 0x080c, 0x7e94, 0x00fe, 0x00de,
++	0x00ce, 0x0005, 0x080c, 0x95e3, 0x006e, 0x0cc0, 0x004e, 0x00ce,
++	0x0cc8, 0x0156, 0x0046, 0x2e00, 0xa0a0, 0x000e, 0x2404, 0x2020,
++	0x8427, 0xa4a4, 0x0007, 0xd484, 0x0148, 0x20a9, 0x0003, 0x2019,
++	0xc606, 0x2011, 0xcc9b, 0x080c, 0xa103, 0x11d8, 0xd48c, 0x0148,
++	0x20a9, 0x0003, 0x2019, 0xc602, 0x2011, 0xcc9f, 0x080c, 0xa103,
++	0x1180, 0xd494, 0x0170, 0x080c, 0x7694, 0x0148, 0x20a9, 0x0008,
++	0x2019, 0xc69a, 0x2011, 0xccaa, 0x080c, 0xa118, 0x0010, 0xa085,
++	0x0001, 0x004e, 0x015e, 0x0005, 0x0156, 0x0046, 0x2e00, 0xa0a0,
++	0x000e, 0x2404, 0x2020, 0x8427, 0xa4a4, 0x0007, 0xd484, 0x0148,
++	0x20a9, 0x0003, 0x2019, 0xc606, 0x2011, 0xcc93, 0x080c, 0xa103,
++	0x11d8, 0xd48c, 0x0148, 0x20a9, 0x0003, 0x2019, 0xc602, 0x2011,
++	0xcc97, 0x080c, 0xa103, 0x1180, 0xd494, 0x0170, 0x080c, 0x7694,
++	0x0148, 0x20a9, 0x0008, 0x2019, 0xc69a, 0x2011, 0xcca2, 0x080c,
++	0xa118, 0x0010, 0xa085, 0x0001, 0x004e, 0x015e, 0x0005, 0x2071,
++	0xc93a, 0x7003, 0x0003, 0x700f, 0x0361, 0xa006, 0x701a, 0x7076,
++	0x7012, 0x7017, 0xce00, 0x7007, 0x0000, 0x7026, 0x702b, 0x8c0c,
++	0x7032, 0x7037, 0x8c6c, 0x703b, 0xffff, 0x703f, 0xffff, 0x7042,
++	0x7047, 0x4787, 0x704a, 0x705b, 0x703f, 0x2001, 0xc8e8, 0x2003,
++	0x0003, 0x2001, 0xc8ea, 0x2003, 0x0100, 0x3a00, 0xa084, 0x0005,
++	0x706e, 0x0005, 0x2071, 0xc93a, 0x1d04, 0x6f9c, 0x2091, 0x6000,
++	0x700c, 0x8001, 0x700e, 0x1518, 0x700f, 0x0361, 0x7007, 0x0001,
++	0x0126, 0x2091, 0x8000, 0x7040, 0xa00d, 0x0128, 0x8109, 0x7142,
++	0x1110, 0x7044, 0x080f, 0x00c6, 0x2061, 0xc600, 0x6034, 0x00ce,
++	0xd0cc, 0x0180, 0x3a00, 0xa084, 0x0005, 0x726c, 0xa216, 0x0150,
++	0x706e, 0x2011, 0x8043, 0x2018, 0x080c, 0x407d, 0x0018, 0x0126,
++	0x2091, 0x8000, 0x7024, 0xa00d, 0x0188, 0x7020, 0x8001, 0x7022,
++	0x1168, 0x7023, 0x0009, 0x8109, 0x7126, 0xa186, 0x03e8, 0x1110,
++	0x7028, 0x080f, 0x81ff, 0x1110, 0x7028, 0x080f, 0x7030, 0xa00d,
++	0x0180, 0x702c, 0x8001, 0x702e, 0x1160, 0x702f, 0x0009, 0x8109,
++	0x7132, 0x0128, 0xa184, 0x007f, 0x090c, 0x8cc8, 0x0010, 0x7034,
++	0x080f, 0x7038, 0xa005, 0x0118, 0x0310, 0x8001, 0x703a, 0x703c,
++	0xa005, 0x0118, 0x0310, 0x8001, 0x703e, 0x704c, 0xa00d, 0x0168,
++	0x7048, 0x8001, 0x704a, 0x1148, 0x704b, 0x0009, 0x8109, 0x714e,
++	0x1120, 0x7150, 0x714e, 0x7058, 0x080f, 0x7018, 0xa00d, 0x01d8,
++	0x0016, 0x7074, 0xa00d, 0x0158, 0x7070, 0x8001, 0x7072, 0x1138,
++	0x7073, 0x0009, 0x8109, 0x7176, 0x1110, 0x7078, 0x080f, 0x001e,
++	0x7008, 0x8001, 0x700a, 0x1138, 0x700b, 0x0009, 0x8109, 0x711a,
++	0x1110, 0x701c, 0x080f, 0x012e, 0x7004, 0x0002, 0x6fc2, 0x6fc3,
++	0x6fdb, 0x00e6, 0x2071, 0xc93a, 0x7018, 0xa005, 0x1120, 0x711a,
++	0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071,
++	0xc93a, 0x701c, 0xa206, 0x1110, 0x701a, 0x701e, 0x000e, 0x00ee,
++	0x0005, 0x00e6, 0x2071, 0xc93a, 0x6088, 0xa102, 0x0208, 0x618a,
++	0x00ee, 0x0005, 0x0005, 0x7110, 0x080c, 0x533d, 0x1158, 0x6088,
++	0x8001, 0x0240, 0x608a, 0x1130, 0x0126, 0x2091, 0x8000, 0x080c,
++	0x7e94, 0x012e, 0x8108, 0xa182, 0x00ff, 0x0218, 0xa00e, 0x7007,
++	0x0002, 0x7112, 0x0005, 0x7014, 0x2060, 0x0126, 0x2091, 0x8000,
++	0x603c, 0xa005, 0x0128, 0x8001, 0x603e, 0x1110, 0x080c, 0xaf4c,
++	0x6014, 0xa005, 0x0518, 0x8001, 0x6016, 0x1500, 0x611c, 0xa186,
++	0x0003, 0x0130, 0xa186, 0x0006, 0x0118, 0xa186, 0x0009, 0x11a0,
++	0x6010, 0x2068, 0x6854, 0xa08a, 0x199a, 0x0270, 0xa082, 0x1999,
++	0x6856, 0xa08a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x800b,
++	0x810b, 0xa108, 0x6116, 0x0010, 0x080c, 0xaa1c, 0x012e, 0xac88,
++	0x0018, 0x7116, 0x2001, 0xfe00, 0xa102, 0x0220, 0x7017, 0xce00,
++	0x7007, 0x0000, 0x0005, 0x00e6, 0x2071, 0xc93a, 0x7027, 0x07d0,
++	0x7023, 0x0009, 0x00ee, 0x0005, 0x2001, 0xc943, 0x2003, 0x0000,
++	0x0005, 0x00e6, 0x2071, 0xc93a, 0x7132, 0x702f, 0x0009, 0x00ee,
++	0x0005, 0x2011, 0xc946, 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071,
++	0xc93a, 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00c6,
++	0x0026, 0x7054, 0x8000, 0x7056, 0x2061, 0xc8e8, 0x6008, 0xa086,
++	0x0000, 0x0158, 0x7068, 0x6032, 0x7064, 0x602e, 0x7060, 0x602a,
++	0x705c, 0x6026, 0x2c10, 0x080c, 0x164d, 0x002e, 0x00ce, 0x0005,
++	0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x6f0a,
++	0x00fe, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x0005, 0x00e6,
++	0x2071, 0xc93a, 0x7176, 0x727a, 0x7073, 0x0009, 0x00ee, 0x0005,
++	0x00e6, 0x0006, 0x2071, 0xc93a, 0x7078, 0xa206, 0x1110, 0x7076,
++	0x707a, 0x000e, 0x00ee, 0x0005, 0x00c6, 0x2061, 0xc9bc, 0x00ce,
++	0x0005, 0xa184, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0xc9bc,
++	0x2060, 0x0005, 0x6854, 0xa08a, 0x199a, 0x0210, 0x2001, 0x1999,
++	0xa005, 0x1150, 0x00c6, 0x2061, 0xc9bc, 0x6014, 0x00ce, 0xa005,
++	0x1138, 0x2001, 0x001e, 0x0020, 0xa08e, 0xffff, 0x1108, 0xa006,
++	0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x684c, 0xa08c, 0x00c0,
++	0xa18e, 0x00c0, 0x05e8, 0xd0b4, 0x1138, 0xd0bc, 0x1550, 0x2009,
++	0x0006, 0x080c, 0x7105, 0x0005, 0xd0fc, 0x0138, 0xa084, 0x0003,
++	0x0120, 0xa086, 0x0003, 0x1904, 0x70ff, 0x6020, 0xd0d4, 0x0130,
++	0xc0d4, 0x6022, 0x6860, 0x602a, 0x685c, 0x602e, 0x2009, 0xc674,
++	0x2104, 0xd084, 0x0138, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c,
++	0x9613, 0x0005, 0x87ff, 0x1120, 0x2009, 0x0043, 0x080c, 0x9613,
++	0x0005, 0xd0fc, 0x0130, 0xa084, 0x0003, 0x0118, 0xa086, 0x0003,
++	0x11f0, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0x9613, 0x0005,
++	0xd0fc, 0x0160, 0xa084, 0x0003, 0xa08e, 0x0002, 0x0148, 0x87ff,
++	0x1120, 0x2009, 0x0041, 0x080c, 0x9613, 0x0005, 0x0061, 0x0ce8,
++	0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, 0x9613, 0x0cb0, 0x2009,
++	0x0004, 0x0019, 0x0005, 0x2009, 0x0001, 0x00d6, 0x6010, 0xa0ec,
++	0xf000, 0x0510, 0x2068, 0x6952, 0x6800, 0x6012, 0xa186, 0x0001,
++	0x1188, 0x694c, 0xa18c, 0x8100, 0xa18e, 0x8100, 0x1158, 0x00c6,
++	0x2061, 0xc9bc, 0x6200, 0xd28c, 0x1120, 0x6204, 0x8210, 0x0208,
++	0x6206, 0x00ce, 0x080c, 0x580a, 0x6010, 0xa06d, 0x0076, 0x2039,
++	0x0000, 0x190c, 0x708a, 0x007e, 0x00de, 0x0005, 0x0156, 0x00c6,
++	0x2061, 0xc9bc, 0x6000, 0x81ff, 0x0110, 0xa205, 0x0008, 0xa204,
++	0x6002, 0x00ce, 0x015e, 0x0005, 0x6800, 0xd08c, 0x1138, 0x6808,
++	0xa005, 0x0120, 0x8001, 0x680a, 0xa085, 0x0001, 0x0005, 0x2071,
++	0xc755, 0x7003, 0x0006, 0x7007, 0x0000, 0x700f, 0x0000, 0x7013,
++	0x0001, 0x702f, 0x0006, 0x7033, 0x0001, 0x7063, 0x0000, 0x0005,
++	0x00e6, 0x2071, 0xc755, 0x6a2c, 0x721e, 0x6b30, 0x7322, 0x6834,
++	0x7026, 0x705a, 0x6838, 0x702a, 0x705e, 0x6824, 0x7016, 0x683c,
++	0x701a, 0x2009, 0x0070, 0x200a, 0xa005, 0x0150, 0x2009, 0x0000,
++	0xa188, 0x000c, 0x8001, 0x1de0, 0x2100, 0xa210, 0x1208, 0x8318,
++	0x7252, 0x7356, 0x7010, 0xc084, 0x7012, 0x7007, 0x0001, 0x700f,
++	0x0000, 0xa006, 0x00ee, 0x0005, 0x2b78, 0x2071, 0xc755, 0x7004,
++	0x004b, 0x700c, 0x0002, 0x718e, 0x7187, 0x7187, 0x0005, 0x7198,
++	0x71e9, 0x71ea, 0x71eb, 0x71ec, 0x71ff, 0x7200, 0x700c, 0x0cba,
++	0x2f00, 0xa080, 0x0070, 0x2004, 0x2f08, 0xa188, 0x0070, 0x210c,
++	0xa106, 0x0150, 0x2f00, 0xa080, 0x0070, 0x2004, 0x2f08, 0xa188,
++	0x0070, 0x210c, 0xa106, 0x15e0, 0x7018, 0xa10a, 0x1118, 0x080c,
++	0x722d, 0x04b0, 0x1210, 0x7114, 0xa10a, 0xa192, 0x000a, 0x0210,
++	0x2009, 0x000a, 0x00d6, 0x0016, 0x2001, 0xc682, 0xa080, 0x0011,
++	0x2014, 0x2001, 0xc76f, 0xa080, 0x0005, 0x2004, 0xa100, 0xa202,
++	0x001e, 0x00de, 0x0e20, 0x080c, 0x727c, 0x2200, 0xa102, 0x0208,
++	0x2208, 0x713a, 0x080c, 0x7377, 0x2100, 0x7042, 0x2001, 0x0002,
++	0x7037, 0x0000, 0x0126, 0x0006, 0x2091, 0x8000, 0x2009, 0xc959,
++	0x2104, 0xc095, 0x200a, 0x000e, 0x700e, 0x012e, 0x080c, 0x1669,
++	0x0005, 0x0005, 0x0005, 0x0005, 0x700c, 0x0002, 0x71f1, 0x71f4,
++	0x71fe, 0x080c, 0x7196, 0x0005, 0x0126, 0x8001, 0x700e, 0x7138,
++	0x0041, 0x2091, 0x8000, 0x080c, 0x7196, 0x012e, 0x0005, 0x0005,
++	0x0005, 0x7018, 0xa100, 0x7214, 0xa21a, 0x1130, 0x701c, 0x7052,
++	0x7020, 0x7056, 0xa006, 0x0068, 0x0006, 0x080c, 0x7377, 0x2100,
++	0x7250, 0xa210, 0x7252, 0x1220, 0x7054, 0xa081, 0x0000, 0x7056,
++	0x000e, 0x2f08, 0xa188, 0x0070, 0x200a, 0x701a, 0x0005, 0x00e6,
++	0x2071, 0xc755, 0x700c, 0x0002, 0x7227, 0x7227, 0x7229, 0x00ee,
++	0x0005, 0x700f, 0x0001, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000,
++	0x00d6, 0x00e6, 0x2071, 0xc76f, 0x702c, 0xa005, 0x0178, 0x2068,
++	0x6964, 0x080c, 0x727c, 0x2100, 0x2208, 0xa102, 0x0238, 0x6800,
++	0x702e, 0x080c, 0x75b9, 0x080c, 0x1629, 0x0c70, 0x00ee, 0x00de,
++	0x012e, 0x0005, 0x00e6, 0x2071, 0xc76f, 0x702c, 0x6802, 0x2d00,
++	0x702e, 0x6858, 0x7120, 0xa102, 0x0a0c, 0x1519, 0x7022, 0x685b,
++	0x0000, 0x00ee, 0x0005, 0x00d6, 0x00e6, 0x2071, 0xc76f, 0xa006,
++	0x7006, 0x700e, 0x701a, 0x701e, 0x7022, 0x7016, 0x702a, 0x7026,
++	0x702f, 0x0000, 0x080c, 0x742b, 0x0168, 0x080c, 0x745d, 0x2d00,
++	0x7002, 0x700a, 0x701a, 0x7013, 0x0001, 0x701f, 0x0007, 0x00ee,
++	0x00de, 0x0005, 0xa00e, 0x0cd8, 0x00e6, 0x00d6, 0x00c6, 0x2071,
++	0xc76f, 0x721c, 0x2100, 0xa202, 0x1618, 0x080c, 0x745d, 0x090c,
++	0x1519, 0x7018, 0xa005, 0x1160, 0x2d00, 0x7002, 0x700a, 0x701a,
++	0xa006, 0x7006, 0x700e, 0x6806, 0x6802, 0x7012, 0x701e, 0x0038,
++	0x2060, 0x6806, 0x2d00, 0x6002, 0x701a, 0x6803, 0x0000, 0x7010,
++	0x8000, 0x7012, 0x701c, 0xa080, 0x0007, 0x701e, 0x721c, 0x08d0,
++	0x721c, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x0156, 0x0136, 0x0146,
++	0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0xc76f, 0x7300, 0xa398,
++	0x0003, 0x7104, 0x080c, 0x7377, 0x810c, 0x2100, 0xa318, 0x8003,
++	0x2228, 0x2021, 0x0054, 0xa402, 0xa532, 0x0208, 0x2028, 0x2500,
++	0x8004, 0x20a8, 0x23a0, 0xe000, 0xe000, 0xe000, 0x53a5, 0x2508,
++	0x080c, 0x7380, 0x2130, 0x7014, 0xa600, 0x7016, 0x2600, 0x711c,
++	0xa102, 0x701e, 0x7004, 0xa600, 0x2008, 0xa082, 0x0007, 0x1180,
++	0x7000, 0x2004, 0xa005, 0x1140, 0x2009, 0x0001, 0x0026, 0x080c,
++	0x727c, 0x002e, 0x7000, 0x2004, 0x7002, 0x7007, 0x0000, 0x0008,
++	0x7106, 0x2500, 0xa212, 0x1910, 0x012e, 0x00ee, 0x014e, 0x013e,
++	0x015e, 0x0005, 0x0016, 0x0026, 0x00e6, 0x00d6, 0x080c, 0x7340,
++	0x15e0, 0x2170, 0x2805, 0xac68, 0x2900, 0x0002, 0x7316, 0x7316,
++	0x731a, 0x7316, 0x731a, 0x7316, 0x7316, 0x7316, 0x7316, 0x7316,
++	0x7323, 0x7316, 0x7323, 0x7316, 0x7316, 0x7316, 0x080c, 0x1519,
++	0xa005, 0x00f0, 0x7000, 0x6802, 0x7004, 0x6806, 0x7010, 0x680a,
++	0x680f, 0x0000, 0x0060, 0x7010, 0x6812, 0x6817, 0x0000, 0x7000,
++	0x6802, 0x7004, 0x6806, 0x7008, 0x680a, 0x700c, 0x680e, 0x00de,
++	0x685c, 0x8000, 0x685e, 0x6858, 0x8001, 0x685a, 0x00d6, 0xa006,
++	0x00de, 0x00ee, 0x002e, 0x001e, 0x0005, 0xa085, 0x0001, 0x0cc0,
++	0x00e6, 0x0036, 0x2071, 0xc76f, 0x7014, 0xa005, 0x0568, 0x8001,
++	0x7016, 0x7020, 0x8001, 0x7022, 0x7008, 0xa080, 0x0003, 0x710c,
++	0x2110, 0x0429, 0x810c, 0xa118, 0x8210, 0xa282, 0x0007, 0x11b0,
++	0x7008, 0x2004, 0xa005, 0x0178, 0x00d6, 0x0006, 0x7008, 0x2068,
++	0x080c, 0x746c, 0x000e, 0x2068, 0x6807, 0x0000, 0x700a, 0x00de,
++	0x7010, 0x8001, 0x7012, 0x700f, 0x0000, 0x0008, 0x720e, 0x2308,
++	0xa006, 0x003e, 0x00ee, 0x0005, 0xa085, 0x0001, 0x0cd0, 0x0006,
++	0x810b, 0x810b, 0x2100, 0x810b, 0xa100, 0x2008, 0x000e, 0x0005,
++	0x0006, 0x0026, 0x2100, 0xa005, 0x0160, 0xa092, 0x000c, 0x0248,
++	0x2009, 0x0000, 0x8108, 0xa082, 0x000c, 0x1de0, 0x002e, 0x000e,
++	0x0005, 0x2009, 0x0000, 0x0cd0, 0x2d00, 0xa0b8, 0x0008, 0x690c,
++	0x6810, 0x2019, 0x0001, 0x2031, 0x73c2, 0xa112, 0x0220, 0x0118,
++	0x8318, 0x2208, 0x0cd0, 0x6808, 0xa005, 0x0108, 0x8318, 0x233a,
++	0x6804, 0xd084, 0x2300, 0x2021, 0x0001, 0x1150, 0xa082, 0x0003,
++	0x0967, 0x0a67, 0x8420, 0xa082, 0x0007, 0x0967, 0x0a67, 0x0cd0,
++	0xa082, 0x0002, 0x0967, 0x0a67, 0x8420, 0xa082, 0x0005, 0x0967,
++	0x0a67, 0x0cd0, 0x6c1a, 0x2d00, 0xa0b8, 0x0007, 0x00e6, 0x2071,
++	0xc600, 0x7128, 0x6810, 0x2019, 0x0001, 0xa10a, 0x0118, 0x0210,
++	0x8318, 0x0cd8, 0x2031, 0x73d5, 0x0870, 0x6c16, 0x00ee, 0x0005,
++	0x00e6, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2e00, 0x2060, 0x2071,
++	0xc76f, 0x2009, 0x0001, 0x0026, 0x080c, 0x727c, 0x002e, 0x7300,
++	0xa398, 0x0003, 0x7104, 0x080c, 0x7377, 0x810c, 0x2100, 0xa318,
++	0x6834, 0xa084, 0x00ff, 0xa086, 0x0024, 0x00d6, 0x2368, 0x1138,
++	0x6000, 0x6802, 0x6004, 0x6806, 0x6008, 0x6812, 0x0050, 0x6000,
++	0x6802, 0x6004, 0x6806, 0x6008, 0x680a, 0x600c, 0x680e, 0x6010,
++	0x6812, 0x00de, 0x7014, 0x8000, 0x7016, 0x711c, 0x8109, 0x711e,
++	0x7004, 0x8000, 0x2008, 0xa082, 0x0007, 0x1180, 0x7000, 0x2004,
++	0xa005, 0x1140, 0x2009, 0x0001, 0x0026, 0x080c, 0x727c, 0x002e,
++	0x7000, 0x2004, 0x7002, 0x7007, 0x0000, 0x0008, 0x7106, 0x012e,
++	0x00ce, 0x00ee, 0x0005, 0x00d6, 0x0046, 0x0126, 0x2091, 0x8000,
++	0x2001, 0xc682, 0xa080, 0x0011, 0x2004, 0x8003, 0x2020, 0x080c,
++	0x15e5, 0x01d0, 0x2d00, 0x7026, 0x6803, 0x0000, 0x6807, 0x0000,
++	0x080c, 0x15e5, 0x0188, 0x7024, 0x6802, 0x6807, 0x0000, 0x2d00,
++	0x7026, 0xa4a2, 0x0007, 0x0110, 0x0208, 0x0c90, 0xa085, 0x0001,
++	0x012e, 0x004e, 0x00de, 0x0005, 0x7024, 0xa005, 0x0dc8, 0x2068,
++	0x2024, 0x080c, 0x1619, 0x2400, 0x0cc0, 0x0126, 0x2091, 0x8000,
++	0x7024, 0x2068, 0xa005, 0x0130, 0x2004, 0x7026, 0x6803, 0x0000,
++	0x6807, 0x0000, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x7024,
++	0x6802, 0x2d00, 0x7026, 0x012e, 0x0005, 0x00d6, 0x2001, 0xc778,
++	0x2004, 0xa005, 0x0138, 0x2068, 0x6800, 0x0006, 0x080c, 0x1619,
++	0x000e, 0x0cb8, 0x00de, 0x0005, 0x00d6, 0x00e6, 0x2071, 0xc76f,
++	0x7008, 0xa005, 0x0138, 0x2068, 0x6800, 0x0006, 0x080c, 0x1619,
++	0x000e, 0x0cb8, 0xa006, 0x7002, 0x700a, 0x7006, 0x700e, 0x701a,
++	0x701e, 0x7022, 0x702a, 0x7026, 0x702e, 0x00ee, 0x00de, 0x0005,
++	0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0086, 0x0046, 0x0056, 0x0026,
++	0x2031, 0x0000, 0x2001, 0xc756, 0x2004, 0xa005, 0x0904, 0x7532,
++	0x2071, 0xc682, 0x20e1, 0x0002, 0x3d08, 0xd19c, 0x0140, 0x2069,
++	0xc600, 0x6a28, 0x761c, 0x7114, 0x2041, 0x0000, 0x0028, 0x7118,
++	0x720c, 0x7620, 0x7008, 0x2040, 0x080c, 0x7627, 0x0904, 0x7532,
++	0x7004, 0xd084, 0x1128, 0x2021, 0x0024, 0x2029, 0x0002, 0x0020,
++	0x2021, 0x002c, 0x2029, 0x000a, 0x080c, 0x1602, 0x0904, 0x752a,
++	0x2d00, 0x2060, 0x6436, 0x0016, 0x20e1, 0x0001, 0x3d08, 0x3e00,
++	0xa18c, 0x00ff, 0x6142, 0x603e, 0x001e, 0x6746, 0x2700, 0xa086,
++	0xff00, 0x1118, 0x6063, 0x0000, 0x0010, 0x6063, 0x0003, 0xa006,
++	0x6002, 0x602a, 0x602e, 0x6006, 0x603a, 0x604a, 0x6052, 0x6057,
++	0x0005, 0x605e, 0x6066, 0x604e, 0x2800, 0x606a, 0x604c, 0xc0ad,
++	0x604e, 0x665a, 0x2c00, 0x2078, 0x0479, 0x607f, 0xffff, 0x6083,
++	0x0000, 0x8109, 0x0180, 0x080c, 0x1602, 0x01c0, 0x2d00, 0x7806,
++	0x2f00, 0x6802, 0x6d36, 0xa006, 0x2d00, 0x2520, 0x00e9, 0x2d00,
++	0x2078, 0x8109, 0x1d80, 0x2c00, 0xa005, 0x002e, 0x005e, 0x004e,
++	0x008e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x2c00, 0x2068,
++	0x080c, 0x1629, 0x2600, 0x2071, 0xc76f, 0x7120, 0xa102, 0x0a0c,
++	0x1519, 0x7022, 0xa006, 0x0c48, 0x00d6, 0x00c6, 0x0136, 0x0146,
++	0x0156, 0x0016, 0x2068, 0x2400, 0xa084, 0x000f, 0xa080, 0x23c7,
++	0x2005, 0x2005, 0xad60, 0x2c00, 0x2d08, 0xa188, 0x0030, 0xa102,
++	0x20a8, 0x2c00, 0x20a0, 0x2001, 0xffff, 0x40a4, 0x001e, 0x015e,
++	0x014e, 0x013e, 0x00ce, 0x00de, 0x0005, 0x00c6, 0x00e6, 0x00f6,
++	0x6858, 0x2071, 0xc76f, 0x7120, 0xa102, 0x0a0c, 0x1519, 0x7022,
++	0x6960, 0x694e, 0x697c, 0x2009, 0xffff, 0x7818, 0xa102, 0xe000,
++	0x6852, 0x684b, 0x0000, 0x6868, 0xa005, 0x0118, 0x6848, 0xc085,
++	0x684a, 0x2d00, 0xa080, 0x0015, 0x2038, 0x2031, 0x0018, 0x6864,
++	0x2020, 0x683a, 0x685c, 0xa08a, 0x00ff, 0x1a0c, 0x1519, 0x2028,
++	0x2d00, 0x2060, 0x2078, 0x6934, 0xa18c, 0x000f, 0xa188, 0x23c7,
++	0x2145, 0x685c, 0x2050, 0xa005, 0x0530, 0x2805, 0xac70, 0x6834,
++	0xa084, 0x00ff, 0xa086, 0x0024, 0x1110, 0x7008, 0x0040, 0x6834,
++	0xa084, 0x00ff, 0xa086, 0x002c, 0x190c, 0x1519, 0x7010, 0x0006,
++	0x2400, 0xa005, 0x000e, 0x0168, 0x203a, 0x8738, 0x8631, 0x090c,
++	0x1519, 0x8421, 0x8529, 0x0138, 0x080c, 0x2389, 0x090c, 0x1519,
++	0x08e0, 0x080c, 0x73d8, 0x6837, 0x0023, 0x00fe, 0x00ee, 0x00ce,
++	0x0005, 0x00e6, 0x00c6, 0x00a6, 0x0086, 0x0056, 0x2d00, 0x2060,
++	0x6934, 0xa18c, 0x000f, 0xa188, 0x23c7, 0x2145, 0x685c, 0x2050,
++	0xa005, 0x01d0, 0x2028, 0x2805, 0xac70, 0x6834, 0xa084, 0x00ff,
++	0xa086, 0x0024, 0x1110, 0x7008, 0x0008, 0x7010, 0x0006, 0xa086,
++	0xffff, 0x000e, 0x0110, 0x080c, 0x73d8, 0x8529, 0x0128, 0x080c,
++	0x2389, 0x090c, 0x1519, 0x0c38, 0x005e, 0x008e, 0x00ae, 0x00ce,
++	0x00ee, 0x0005, 0x70ac, 0xa005, 0x0120, 0x2060, 0x6008, 0xa306,
++	0x0005, 0xa085, 0x0001, 0x0ce0, 0x70ac, 0x600e, 0x2c00, 0x70ae,
++	0x0005, 0x00f6, 0x00d6, 0x0036, 0x70ac, 0xa005, 0x01b8, 0x2068,
++	0x2079, 0x0000, 0x2c08, 0xa11e, 0x1118, 0x680c, 0x70ae, 0x0060,
++	0xa106, 0x0140, 0x2d00, 0x2078, 0x680c, 0xa005, 0x090c, 0x1519,
++	0x2068, 0x0cb0, 0x6b0c, 0x7b0e, 0x600f, 0x0000, 0x003e, 0x00de,
++	0x00fe, 0x0005, 0x00e6, 0x080c, 0x724a, 0x6018, 0x2070, 0xa006,
++	0x70b2, 0x70b6, 0x08b1, 0x080c, 0x95e3, 0x00ee, 0x0005, 0x00d6,
++	0x0026, 0x0016, 0x2061, 0xc76f, 0x6020, 0x6414, 0xa600, 0xa42a,
++	0x02f0, 0x6022, 0x2069, 0xc682, 0x6828, 0x6114, 0xa102, 0x1288,
++	0x685c, 0xd08c, 0x1130, 0xc08d, 0x685e, 0x2011, 0x8025, 0x080c,
++	0x407d, 0x2001, 0xc695, 0x2004, 0xa080, 0x0000, 0x200c, 0x8108,
++	0x2102, 0xa085, 0x0001, 0x001e, 0x002e, 0x00de, 0x0005, 0x2069,
++	0xc682, 0x6804, 0xd094, 0x0148, 0x685c, 0xd084, 0x1130, 0xc085,
++	0x685e, 0x2011, 0x8026, 0x080c, 0x407d, 0x2001, 0xc695, 0x2004,
++	0xa080, 0x0001, 0x200c, 0x8108, 0x2102, 0xa006, 0x2031, 0x0000,
++	0x0c10, 0x0006, 0x0016, 0x00c6, 0x6018, 0x2060, 0x6010, 0xa005,
++	0x0178, 0x2001, 0xc756, 0x2004, 0xa005, 0x0150, 0x2001, 0xc600,
++	0x2004, 0xa086, 0x0003, 0x1120, 0x2011, 0x8014, 0x080c, 0x407d,
++	0x00ce, 0x001e, 0x000e, 0x0005, 0x0016, 0x6834, 0xa08c, 0x00ff,
++	0xa186, 0x0024, 0x0110, 0xa186, 0x002c, 0x001e, 0x0005, 0x2001,
++	0xc683, 0x2004, 0xd09c, 0x0005, 0x2001, 0xc683, 0x2004, 0xd0a4,
++	0x0005, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013,
++	0x006e, 0x0005, 0x76b2, 0x76b2, 0x76b2, 0x76b4, 0x770f, 0x76b2,
++	0x76b2, 0x76b2, 0x774d, 0x76b2, 0x77aa, 0x76b2, 0x76b2, 0x76b2,
++	0x76b2, 0x76b2, 0x080c, 0x1519, 0xa182, 0x0100, 0x0002, 0x76c6,
++	0x76c6, 0x76c6, 0x76c8, 0x76e1, 0x76fb, 0x76c6, 0x76c6, 0x76c6,
++	0x76c6, 0x76c6, 0x76c6, 0x76c6, 0x76c6, 0x76c6, 0x080c, 0x1519,
++	0x00d6, 0x080c, 0x7e47, 0x080c, 0x7f6e, 0x6110, 0x2168, 0x684b,
++	0x0000, 0x00d6, 0x6018, 0x2068, 0x6008, 0x68b6, 0x68bb, 0x0500,
++	0xa006, 0x68b2, 0x00de, 0x080c, 0x580a, 0x080c, 0x95e3, 0x00de,
++	0x0005, 0x080c, 0x7e47, 0x00f6, 0x00d6, 0x6110, 0x2178, 0x080c,
++	0xac91, 0x0150, 0x00e6, 0x6018, 0x2070, 0xa006, 0x70b2, 0x70b6,
++	0x00ee, 0x2f68, 0x080c, 0x580a, 0x00de, 0x00fe, 0x080c, 0x95e3,
++	0x080c, 0x7f6e, 0x0005, 0x080c, 0x7e47, 0x080c, 0x2e46, 0x00d6,
++	0x6110, 0x2168, 0x080c, 0xac91, 0x0120, 0x684b, 0x0029, 0x080c,
++	0x580a, 0x00de, 0x080c, 0x95e3, 0x080c, 0x7f6e, 0x0005, 0xa182,
++	0x0100, 0x0002, 0x7721, 0x7723, 0x772b, 0x7721, 0x7721, 0x7721,
++	0x7748, 0x7721, 0x7721, 0x7721, 0x7721, 0x7721, 0x7721, 0x7721,
++	0x7721, 0x080c, 0x1519, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10,
++	0x080c, 0x1870, 0x0005, 0x00d6, 0x00e6, 0x2001, 0xc756, 0x2004,
++	0xa086, 0x0000, 0x6110, 0x1118, 0x080c, 0x1629, 0x0028, 0x2168,
++	0x080c, 0x7555, 0x080c, 0x580a, 0x6018, 0x2070, 0xa006, 0x70b2,
++	0x70b6, 0x080c, 0x75f9, 0x00ee, 0x00de, 0x080c, 0x95e3, 0x0005,
++	0x080c, 0x761a, 0x080c, 0x56c7, 0x0005, 0xa182, 0x0100, 0x0002,
++	0x7762, 0x7788, 0x7760, 0x7760, 0x7760, 0x7760, 0x7760, 0x7760,
++	0x7760, 0x7760, 0x7760, 0x7760, 0x7760, 0x7760, 0x7760, 0x7760,
++	0x080c, 0x1519, 0x00d6, 0x6003, 0x0003, 0x6106, 0x6010, 0x2068,
++	0x687c, 0x680a, 0x6880, 0x680e, 0x6813, 0x0000, 0x6817, 0x0000,
++	0x6854, 0xa092, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x8013,
++	0x8213, 0xa210, 0x6216, 0x00de, 0x2c10, 0x080c, 0x2068, 0x080c,
++	0x79fc, 0x0126, 0x2091, 0x8000, 0x080c, 0x7f6e, 0x012e, 0x0005,
++	0x6003, 0x0004, 0x630a, 0x080c, 0x74a0, 0x0168, 0x6012, 0x600f,
++	0x0000, 0x080c, 0x75f4, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10,
++	0x080c, 0x1870, 0x0005, 0x2011, 0x0000, 0x080c, 0x1870, 0x00e6,
++	0x6018, 0x2070, 0x70b3, 0x0000, 0x70b7, 0x0000, 0x00ee, 0x080c,
++	0x95e3, 0x0005, 0x00d6, 0x080c, 0x7e47, 0x080c, 0x7f6e, 0x6110,
++	0x2168, 0x684b, 0x0000, 0x00d6, 0x6018, 0x2068, 0x6008, 0x68b6,
++	0x68bb, 0x0500, 0xa006, 0x68b2, 0x00de, 0x080c, 0x580a, 0x080c,
++	0x95e3, 0x00de, 0x0005, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1519,
++	0x000b, 0x0005, 0x77da, 0x77da, 0x77da, 0x77dc, 0x77f1, 0x77da,
++	0x77da, 0x77da, 0x77da, 0x77da, 0x77da, 0x77da, 0x77da, 0x77da,
++	0x77da, 0x77da, 0x080c, 0x1519, 0x080c, 0x90f6, 0x6110, 0x2168,
++	0x684b, 0x0006, 0x00d6, 0x6018, 0x2068, 0x6008, 0x68b6, 0x68bb,
++	0x0500, 0xa006, 0x68b2, 0x00de, 0x080c, 0x580a, 0x080c, 0x95e3,
++	0x0005, 0x080c, 0x761a, 0x0005, 0x6000, 0xa08a, 0x0010, 0x1a0c,
++	0x1519, 0x000b, 0x0005, 0x780b, 0x780b, 0x780b, 0x780d, 0x781d,
++	0x780b, 0x780b, 0x780b, 0x780b, 0x780b, 0x780b, 0x780b, 0x780b,
++	0x780b, 0x780b, 0x780b, 0x080c, 0x1519, 0x0036, 0x00e6, 0x2071,
++	0xc927, 0x703c, 0xac06, 0x1120, 0x2019, 0x0000, 0x080c, 0x8e79,
++	0x080c, 0x90f6, 0x00ee, 0x003e, 0x0005, 0x00d6, 0x6010, 0x2068,
++	0x080c, 0x761a, 0x00de, 0x0005, 0x080c, 0x7684, 0x1150, 0x6024,
++	0xd09c, 0x1138, 0x6810, 0x2009, 0xffff, 0xa102, 0x2020, 0x2019,
++	0x0000, 0x0005, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e,
++	0x1208, 0xa200, 0x1f04, 0x7836, 0x8086, 0x818e, 0x0005, 0x0156,
++	0x20a9, 0x0010, 0xa005, 0x01b8, 0xa11a, 0x12a8, 0x8213, 0x818d,
++	0x0228, 0xa11a, 0x1220, 0x1f04, 0x7846, 0x0028, 0xa11a, 0x2308,
++	0x8210, 0x1f04, 0x7846, 0x0006, 0x3200, 0xa084, 0xefff, 0x2080,
++	0x000e, 0x015e, 0x0005, 0x0006, 0x3200, 0xa085, 0x1000, 0x0cb8,
++	0x0126, 0x2091, 0x2800, 0x2079, 0xc927, 0x012e, 0x00d6, 0x2069,
++	0xc927, 0x6803, 0x0005, 0x2069, 0x0004, 0x2d04, 0xa085, 0x8001,
++	0x206a, 0x00de, 0x0005, 0x00c6, 0x6027, 0x0001, 0x7804, 0xa084,
++	0x0007, 0x0002, 0x7884, 0x78a5, 0x78f8, 0x788a, 0x78a5, 0x7884,
++	0x7882, 0x7882, 0x080c, 0x1519, 0x080c, 0x7024, 0x080c, 0x7e94,
++	0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110, 0x00ce, 0x0005, 0x2011,
++	0x4e18, 0x080c, 0x6fad, 0x7828, 0xa092, 0x00c8, 0x1228, 0x8000,
++	0x782a, 0x080c, 0x4e52, 0x0c88, 0x080c, 0x4e18, 0x7807, 0x0003,
++	0x7827, 0x0000, 0x782b, 0x0000, 0x0c40, 0x080c, 0x7024, 0x3c00,
++	0x0006, 0x2011, 0x0209, 0x20e1, 0x4000, 0x2214, 0x000e, 0x20e0,
++	0x82ff, 0x0178, 0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824,
++	0xa065, 0x090c, 0x1519, 0x2009, 0x0013, 0x080c, 0x9613, 0x00ce,
++	0x0005, 0x3900, 0xa082, 0xca74, 0x1210, 0x080c, 0x91cb, 0x00c6,
++	0x7824, 0xa065, 0x090c, 0x1519, 0x7804, 0xa086, 0x0004, 0x0904,
++	0x7938, 0x7828, 0xa092, 0x2710, 0x1230, 0x8000, 0x782a, 0x00ce,
++	0x080c, 0x8be8, 0x0c20, 0x6104, 0xa186, 0x0003, 0x1188, 0x00e6,
++	0x2071, 0xc600, 0x70e0, 0x00ee, 0xd08c, 0x0150, 0x00c6, 0x00e6,
++	0x2061, 0x0100, 0x2071, 0xc600, 0x080c, 0x4e5b, 0x00ee, 0x00ce,
++	0x080c, 0xc59b, 0x2009, 0x0014, 0x080c, 0x9613, 0x00ce, 0x0838,
++	0x2001, 0xc943, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, 0x782b,
++	0x0000, 0x7824, 0xa065, 0x090c, 0x1519, 0x2009, 0x0013, 0x080c,
++	0x9667, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x3900, 0xa082, 0xca74,
++	0x1210, 0x080c, 0x91cb, 0x7824, 0xa005, 0x090c, 0x1519, 0x781c,
++	0xa06d, 0x090c, 0x1519, 0x6800, 0xc0dc, 0x6802, 0x7924, 0x2160,
++	0x080c, 0x95e3, 0x693c, 0x81ff, 0x090c, 0x1519, 0x8109, 0x693e,
++	0x6854, 0xa015, 0x0110, 0x7a1e, 0x0010, 0x7918, 0x791e, 0x7807,
++	0x0000, 0x7827, 0x0000, 0x00de, 0x00ce, 0x080c, 0x7e94, 0x0888,
++	0x6104, 0xa186, 0x0002, 0x0128, 0xa186, 0x0004, 0x0110, 0x0804,
++	0x78d1, 0x7808, 0xac06, 0x0904, 0x78d1, 0x080c, 0x7db1, 0x080c,
++	0x79df, 0x00ce, 0x080c, 0x7e94, 0x0804, 0x78bf, 0x00c6, 0x6027,
++	0x0002, 0x62c8, 0x60c4, 0xa205, 0x11a8, 0x793c, 0xa1e5, 0x0000,
++	0x0160, 0x2009, 0x0049, 0x601c, 0xa086, 0x0009, 0x1110, 0x2009,
++	0x0103, 0x080c, 0x9613, 0x00ce, 0x0005, 0x2011, 0xc946, 0x2013,
++	0x0000, 0x0cc8, 0x3908, 0xa192, 0xca74, 0x1210, 0x080c, 0x91cb,
++	0x793c, 0x81ff, 0x0d90, 0x7944, 0xa192, 0x7530, 0x12f0, 0x8108,
++	0x7946, 0x793c, 0xa188, 0x0007, 0x210c, 0xa18e, 0x0006, 0x1138,
++	0x6014, 0xa084, 0x0184, 0xa085, 0x0012, 0x6016, 0x08e0, 0x793c,
++	0xa188, 0x0007, 0x210c, 0xa18e, 0x0009, 0x0d90, 0x6014, 0xa084,
++	0x0184, 0xa085, 0x0016, 0x6016, 0x0870, 0x7848, 0xc085, 0x784a,
++	0x0850, 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f,
++	0x0000, 0x2c08, 0x2061, 0xc927, 0x6020, 0x8000, 0x6022, 0x6010,
++	0xa005, 0x0148, 0xa080, 0x0003, 0x2102, 0x6112, 0x012e, 0x00ce,
++	0x001e, 0x000e, 0x0005, 0x6116, 0x6112, 0x0cc0, 0x00d6, 0x2069,
++	0xc927, 0x6000, 0xd0d4, 0x0168, 0x6820, 0x8000, 0x6822, 0xa086,
++	0x0001, 0x1110, 0x2c00, 0x681e, 0x6804, 0xa084, 0x0007, 0x0804,
++	0x7e9a, 0xc0d5, 0x6002, 0x6818, 0xa005, 0x0158, 0x6056, 0x605b,
++	0x0000, 0x0006, 0x2c00, 0x681a, 0x00de, 0x685a, 0x2069, 0xc927,
++	0x0c18, 0x6056, 0x605a, 0x2c00, 0x681a, 0x681e, 0x08e8, 0x0006,
++	0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08,
++	0x2061, 0xc927, 0x6020, 0x8000, 0x6022, 0x6008, 0xa005, 0x0148,
++	0xa080, 0x0003, 0x2102, 0x610a, 0x012e, 0x00ce, 0x001e, 0x000e,
++	0x0005, 0x610e, 0x610a, 0x0cc0, 0x00c6, 0x600f, 0x0000, 0x2c08,
++	0x2061, 0xc927, 0x6034, 0xa005, 0x0130, 0xa080, 0x0003, 0x2102,
++	0x6136, 0x00ce, 0x0005, 0x613a, 0x6136, 0x0cd8, 0x00f6, 0x00e6,
++	0x00d6, 0x00c6, 0x0076, 0x0066, 0x0056, 0x0036, 0x0026, 0x0016,
++	0x0006, 0x0126, 0xa02e, 0x2071, 0xc927, 0x7638, 0x2660, 0x2678,
++	0x2091, 0x8000, 0x8cff, 0x0904, 0x7a87, 0x6018, 0xa080, 0x0028,
++	0x2004, 0xa206, 0x1904, 0x7a82, 0x87ff, 0x0120, 0x6050, 0xa106,
++	0x1904, 0x7a82, 0x703c, 0xac06, 0x1190, 0x0036, 0x2019, 0x0001,
++	0x080c, 0x8e79, 0x7033, 0x0000, 0x703f, 0x0000, 0x7043, 0x0000,
++	0x7047, 0x0000, 0x704b, 0x0000, 0x003e, 0x2029, 0x0001, 0x7038,
++	0xac36, 0x1110, 0x660c, 0x763a, 0x7034, 0xac36, 0x1140, 0x2c00,
++	0xaf36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000, 0x660c,
++	0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f,
++	0x0000, 0x080c, 0xac91, 0x01c8, 0x6010, 0x2068, 0x601c, 0xa086,
++	0x0003, 0x1580, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x0016,
++	0x0036, 0x0076, 0x080c, 0xaf03, 0x080c, 0xc4d7, 0x080c, 0x580a,
++	0x007e, 0x003e, 0x001e, 0x080c, 0xae48, 0x080c, 0xae54, 0x00ce,
++	0x0804, 0x7a22, 0x2c78, 0x600c, 0x2060, 0x0804, 0x7a22, 0x85ff,
++	0x0120, 0x0036, 0x080c, 0x7f6e, 0x003e, 0x012e, 0x000e, 0x001e,
++	0x002e, 0x003e, 0x005e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee,
++	0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x0158, 0x601c, 0xa086,
++	0x0009, 0x1190, 0x684b, 0x0006, 0x080c, 0x580a, 0x080c, 0x95e3,
++	0x08b0, 0x0016, 0x0036, 0x0076, 0x080c, 0xc4d7, 0x080c, 0xc141,
++	0x007e, 0x003e, 0x001e, 0x0848, 0x601c, 0xa086, 0x000a, 0x0904,
++	0x7a6c, 0x0804, 0x7a6a, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x00f6,
++	0x2031, 0x0000, 0x0126, 0x2091, 0x8000, 0x2079, 0xc927, 0x7838,
++	0xa065, 0x0568, 0x600c, 0x0006, 0x600f, 0x0000, 0x783c, 0xac06,
++	0x1180, 0x0036, 0x2019, 0x0001, 0x080c, 0x8e79, 0x7833, 0x0000,
++	0x783f, 0x0000, 0x7843, 0x0000, 0x7847, 0x0000, 0x784b, 0x0000,
++	0x003e, 0x080c, 0xac91, 0x0178, 0x6010, 0x2068, 0x601c, 0xa086,
++	0x0003, 0x11b0, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c,
++	0x580a, 0x080c, 0xae48, 0x080c, 0xae54, 0x000e, 0x0888, 0x7e3a,
++	0x7e36, 0x012e, 0x00fe, 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005,
++	0x601c, 0xa086, 0x0006, 0x0150, 0x601c, 0xa086, 0x0009, 0x1148,
++	0x6b4a, 0x080c, 0x580a, 0x080c, 0x95e3, 0x0c38, 0x080c, 0xc141,
++	0x0c10, 0x601c, 0xa086, 0x000a, 0x09b8, 0x08a0, 0x0016, 0x0026,
++	0x0086, 0x2041, 0x0000, 0x0099, 0x080c, 0x7be4, 0x008e, 0x002e,
++	0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0xc927, 0x2091, 0x8000,
++	0x080c, 0x7c71, 0x080c, 0x7ce3, 0x012e, 0x00fe, 0x0005, 0x00f6,
++	0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, 0x2091,
++	0x8000, 0x2071, 0xc927, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0904,
++	0x7bba, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x1904, 0x7bb5,
++	0x88ff, 0x0120, 0x6050, 0xa106, 0x1904, 0x7bb5, 0x7024, 0xac06,
++	0x1538, 0x2069, 0x0100, 0x68c0, 0xa005, 0x01f0, 0x080c, 0x7024,
++	0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c, 0x90e6, 0x7027, 0x0000,
++	0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120, 0x6803,
++	0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110,
++	0x6827, 0x0001, 0x003e, 0x0020, 0x6003, 0x0009, 0x630a, 0x04e8,
++	0x7014, 0xac36, 0x1110, 0x660c, 0x7616, 0x7010, 0xac36, 0x1140,
++	0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000,
++	0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678,
++	0x600f, 0x0000, 0x6010, 0x2068, 0x080c, 0xac91, 0x01b8, 0x601c,
++	0xa086, 0x0003, 0x1540, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000,
++	0x0016, 0x0036, 0x0086, 0x080c, 0xaf03, 0x080c, 0xc4d7, 0x080c,
++	0x580a, 0x008e, 0x003e, 0x001e, 0x080c, 0xae48, 0x080c, 0xae54,
++	0x080c, 0x8fb7, 0x00ce, 0x0804, 0x7b3e, 0x2c78, 0x600c, 0x2060,
++	0x0804, 0x7b3e, 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de,
++	0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x1158, 0x0016,
++	0x0036, 0x0086, 0x080c, 0xc4d7, 0x080c, 0xc141, 0x008e, 0x003e,
++	0x001e, 0x08e0, 0x601c, 0xa086, 0x0002, 0x1128, 0x6004, 0xa086,
++	0x0085, 0x0908, 0x0898, 0x601c, 0xa086, 0x0005, 0x1978, 0x6004,
++	0xa086, 0x0085, 0x0d20, 0x0850, 0x00c6, 0x0006, 0x0126, 0x2091,
++	0x8000, 0xa280, 0xc77b, 0x2004, 0xa065, 0x0904, 0x7c6d, 0x00f6,
++	0x00e6, 0x00d6, 0x0066, 0x2071, 0xc927, 0x6654, 0x7018, 0xac06,
++	0x1108, 0x761a, 0x701c, 0xac06, 0x1130, 0x86ff, 0x1118, 0x7018,
++	0x701e, 0x0008, 0x761e, 0x6058, 0xa07d, 0x0108, 0x7e56, 0xa6ed,
++	0x0000, 0x0110, 0x2f00, 0x685a, 0x6057, 0x0000, 0x605b, 0x0000,
++	0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x080c, 0x5268, 0x0904, 0x7c69,
++	0x7624, 0x86ff, 0x05e8, 0xa680, 0x0004, 0x2004, 0xad06, 0x15c0,
++	0x00d6, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0548, 0x080c, 0x7024,
++	0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c, 0x90e6, 0x7027, 0x0000,
++	0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120, 0x6803,
++	0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110,
++	0x6827, 0x0001, 0x003e, 0x00de, 0x00c6, 0x603c, 0xa005, 0x0110,
++	0x8001, 0x603e, 0x2660, 0x080c, 0xae54, 0x00ce, 0x0048, 0x00de,
++	0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x7c14,
++	0x8dff, 0x0158, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c,
++	0xaf03, 0x080c, 0xc4d7, 0x080c, 0x580a, 0x080c, 0x8fb7, 0x0804,
++	0x7c14, 0x006e, 0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce,
++	0x0005, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x2031, 0x0000, 0x7814,
++	0xa065, 0x0904, 0x7cc3, 0x600c, 0x0006, 0x600f, 0x0000, 0x7824,
++	0xac06, 0x1540, 0x2069, 0x0100, 0x68c0, 0xa005, 0x01f0, 0x080c,
++	0x7024, 0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c, 0x90e6, 0x7827,
++	0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120,
++	0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084,
++	0x0110, 0x6827, 0x0001, 0x003e, 0x0028, 0x6003, 0x0009, 0x630a,
++	0x2c30, 0x00b0, 0x6010, 0x2068, 0x080c, 0xac91, 0x0168, 0x601c,
++	0xa086, 0x0003, 0x11b8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000,
++	0x080c, 0x580a, 0x080c, 0xae48, 0x080c, 0xae54, 0x080c, 0x8fb7,
++	0x000e, 0x0804, 0x7c78, 0x7e16, 0x7e12, 0x00de, 0x00ce, 0x006e,
++	0x000e, 0x0005, 0x601c, 0xa086, 0x0006, 0x1118, 0x080c, 0xc141,
++	0x0c58, 0x601c, 0xa086, 0x0002, 0x1128, 0x6004, 0xa086, 0x0085,
++	0x09d0, 0x0c10, 0x601c, 0xa086, 0x0005, 0x19f0, 0x6004, 0xa086,
++	0x0085, 0x0d60, 0x08c8, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x7818,
++	0xa065, 0x0904, 0x7d49, 0x6054, 0x0006, 0x6057, 0x0000, 0x605b,
++	0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x080c, 0x5268, 0x0904,
++	0x7d46, 0x7e24, 0x86ff, 0x05e8, 0xa680, 0x0004, 0x2004, 0xad06,
++	0x15c0, 0x00d6, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0548, 0x080c,
++	0x7024, 0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c, 0x90e6, 0x7827,
++	0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120,
++	0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084,
++	0x0110, 0x6827, 0x0001, 0x003e, 0x00de, 0x00c6, 0x603c, 0xa005,
++	0x0110, 0x8001, 0x603e, 0x2660, 0x080c, 0xae54, 0x00ce, 0x0048,
++	0x00de, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804,
++	0x7cf5, 0x8dff, 0x0138, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000,
++	0x080c, 0x580a, 0x080c, 0x8fb7, 0x0804, 0x7cf5, 0x000e, 0x0804,
++	0x7ce8, 0x781e, 0x781a, 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005,
++	0x00e6, 0x00d6, 0x0066, 0x6000, 0xd0dc, 0x01a0, 0x604c, 0xa06d,
++	0x0188, 0x6848, 0xa606, 0x1170, 0x2071, 0xc927, 0x7024, 0xa035,
++	0x0148, 0xa080, 0x0004, 0x2004, 0xad06, 0x1120, 0x6000, 0xc0dc,
++	0x6002, 0x0021, 0x006e, 0x00de, 0x00ee, 0x0005, 0x00f6, 0x2079,
++	0x0100, 0x78c0, 0xa005, 0x1138, 0x00c6, 0x2660, 0x6003, 0x0009,
++	0x630a, 0x00ce, 0x04a0, 0x080c, 0x8bf5, 0x78c3, 0x0000, 0x080c,
++	0x90e6, 0x7027, 0x0000, 0x0036, 0x2079, 0x0140, 0x7b04, 0xa384,
++	0x1000, 0x0120, 0x7803, 0x0100, 0x7803, 0x0000, 0x2079, 0x0100,
++	0x7824, 0xd084, 0x0110, 0x7827, 0x0001, 0x080c, 0x90e6, 0x003e,
++	0x080c, 0x5268, 0x00c6, 0x603c, 0xa005, 0x0110, 0x8001, 0x603e,
++	0x2660, 0x080c, 0x95e3, 0x00ce, 0x6837, 0x0103, 0x6b4a, 0x6847,
++	0x0000, 0x080c, 0xaf03, 0x080c, 0x580a, 0x080c, 0x8fb7, 0x00fe,
++	0x0005, 0x00e6, 0x00c6, 0x2071, 0xc927, 0x7004, 0xa084, 0x0007,
++	0x0002, 0x7dc3, 0x7dc6, 0x7ddc, 0x7df5, 0x7e32, 0x7dc3, 0x7dc1,
++	0x7dc1, 0x080c, 0x1519, 0x00ce, 0x00ee, 0x0005, 0x7024, 0xa065,
++	0x0148, 0x7020, 0x8001, 0x7022, 0x600c, 0xa015, 0x0150, 0x7216,
++	0x600f, 0x0000, 0x7007, 0x0000, 0x7027, 0x0000, 0x00ce, 0x00ee,
++	0x0005, 0x7216, 0x7212, 0x0cb0, 0x6018, 0x2060, 0x080c, 0x5268,
++	0x6000, 0xc0dc, 0x6002, 0x7020, 0x8001, 0x7022, 0x0120, 0x6054,
++	0xa015, 0x0140, 0x721e, 0x7007, 0x0000, 0x7027, 0x0000, 0x00ce,
++	0x00ee, 0x0005, 0x7218, 0x721e, 0x0cb0, 0x7024, 0xa065, 0x05b8,
++	0x700c, 0xac06, 0x1160, 0x080c, 0x8fb7, 0x600c, 0xa015, 0x0120,
++	0x720e, 0x600f, 0x0000, 0x0448, 0x720e, 0x720a, 0x0430, 0x7014,
++	0xac06, 0x1160, 0x080c, 0x8fb7, 0x600c, 0xa015, 0x0120, 0x7216,
++	0x600f, 0x0000, 0x00d0, 0x7216, 0x7212, 0x00b8, 0x601c, 0xa086,
++	0x0003, 0x1198, 0x6018, 0x2060, 0x080c, 0x5268, 0x6000, 0xc0dc,
++	0x6002, 0x080c, 0x8fb7, 0x701c, 0xa065, 0x0138, 0x6054, 0xa015,
++	0x0110, 0x721e, 0x0010, 0x7218, 0x721e, 0x7027, 0x0000, 0x00ce,
++	0x00ee, 0x0005, 0x7024, 0xa065, 0x0140, 0x080c, 0x8fb7, 0x600c,
++	0xa015, 0x0150, 0x720e, 0x600f, 0x0000, 0x080c, 0x90e6, 0x7027,
++	0x0000, 0x00ce, 0x00ee, 0x0005, 0x720e, 0x720a, 0x0cb0, 0x00d6,
++	0x2069, 0xc927, 0x6830, 0xa084, 0x0003, 0x0002, 0x7e54, 0x7e56,
++	0x7e7a, 0x7e52, 0x080c, 0x1519, 0x00de, 0x0005, 0x00c6, 0x6840,
++	0xa086, 0x0001, 0x01b8, 0x683c, 0xa065, 0x0130, 0x600c, 0xa015,
++	0x0170, 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000,
++	0x2011, 0xc946, 0x2013, 0x0000, 0x00ce, 0x00de, 0x0005, 0x683a,
++	0x6836, 0x0c90, 0x6843, 0x0000, 0x6838, 0xa065, 0x0d68, 0x6003,
++	0x0003, 0x0c50, 0x00c6, 0x6843, 0x0000, 0x6847, 0x0000, 0x684b,
++	0x0000, 0x683c, 0xa065, 0x0168, 0x600c, 0xa015, 0x0130, 0x6a3a,
++	0x600f, 0x0000, 0x683f, 0x0000, 0x0020, 0x683f, 0x0000, 0x683a,
++	0x6836, 0x00ce, 0x00de, 0x0005, 0x00d6, 0x2069, 0xc927, 0x6804,
++	0xa084, 0x0007, 0x0006, 0xa005, 0x11c8, 0x2001, 0xc635, 0x2004,
++	0xa084, 0x0028, 0x1198, 0x2001, 0xc8e5, 0x2004, 0xa086, 0xaaaa,
++	0x0168, 0x2001, 0xc696, 0x2004, 0xd08c, 0x1118, 0xd084, 0x1118,
++	0x0028, 0x080c, 0x7f6e, 0x000e, 0x00de, 0x0005, 0x000e, 0x0002,
++	0x7ec2, 0x7f5e, 0x7f5e, 0x7f5e, 0x7f5e, 0x7f60, 0x7ec0, 0x7ec0,
++	0x080c, 0x1519, 0x6820, 0xa005, 0x1110, 0x00de, 0x0005, 0x00c6,
++	0x680c, 0xa065, 0x0150, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000,
++	0x080c, 0x7ff0, 0x00ce, 0x00de, 0x0005, 0x6814, 0xa065, 0x0150,
++	0x6807, 0x0001, 0x6826, 0x682b, 0x0000, 0x080c, 0x7ff0, 0x00ce,
++	0x00de, 0x0005, 0x00e6, 0x0036, 0x6a1c, 0xa2f5, 0x0000, 0x0904,
++	0x7f5a, 0x704c, 0xa00d, 0x0118, 0x7088, 0xa005, 0x01a0, 0x7054,
++	0xa075, 0x0120, 0xa20e, 0x0904, 0x7f5a, 0x0028, 0x6818, 0xa20e,
++	0x0904, 0x7f5a, 0x2070, 0x704c, 0xa00d, 0x0d88, 0x7088, 0xa005,
++	0x1d70, 0x2e00, 0x681e, 0x733c, 0x7038, 0xa302, 0x1e40, 0x080c,
++	0x95ba, 0x0904, 0x7f5a, 0x8318, 0x733e, 0x6112, 0x2e10, 0x621a,
++	0xa180, 0x0014, 0x2004, 0xa084, 0x00ff, 0x605a, 0xa180, 0x0014,
++	0x2003, 0x0000, 0xa180, 0x0015, 0x2004, 0xa08a, 0x199a, 0x0210,
++	0x2001, 0x1999, 0x8003, 0x801b, 0x831b, 0xa318, 0x6316, 0x003e,
++	0x00f6, 0x2c78, 0x71a0, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1110,
++	0xd1bc, 0x0150, 0x7100, 0xd1f4, 0x0120, 0x7114, 0xa18c, 0x00ff,
++	0x0040, 0x2009, 0x0000, 0x0028, 0xa1e0, 0x2f6e, 0x2c0d, 0xa18c,
++	0x00ff, 0x2061, 0x0100, 0x619a, 0x080c, 0x8620, 0x7300, 0xc3dd,
++	0x7302, 0x6807, 0x0002, 0x2f18, 0x6b26, 0x682b, 0x0000, 0x781f,
++	0x0003, 0x7803, 0x0001, 0x7807, 0x0040, 0x00fe, 0x00ee, 0x00ce,
++	0x00de, 0x0005, 0x003e, 0x00ee, 0x00ce, 0x0cd0, 0x00de, 0x0005,
++	0x00c6, 0x680c, 0xa065, 0x0138, 0x6807, 0x0004, 0x6826, 0x682b,
++	0x0000, 0x080c, 0x7ff0, 0x00ce, 0x00de, 0x0005, 0x00f6, 0x00d6,
++	0x2069, 0xc927, 0x6830, 0xa086, 0x0000, 0x1904, 0x7fcb, 0x2001,
++	0xc60c, 0x200c, 0xd1bc, 0x1904, 0x7fe6, 0x6838, 0xa07d, 0x0904,
++	0x7fcb, 0x2001, 0xc635, 0x2004, 0xa084, 0x0028, 0x11f8, 0x2001,
++	0xc8e5, 0x2004, 0xa086, 0xaaaa, 0x01c8, 0x781c, 0xa086, 0x0009,
++	0x11a8, 0x7808, 0xd0fc, 0x0190, 0x2001, 0xc928, 0x2004, 0xa005,
++	0x1138, 0x2001, 0xc696, 0x200c, 0xc185, 0xc18c, 0x2102, 0x0030,
++	0x2011, 0xc696, 0x2204, 0xc08d, 0x2012, 0x0428, 0x2f00, 0x6833,
++	0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x0126, 0x00f6,
++	0x2091, 0x2400, 0x002e, 0x080c, 0x20ef, 0x11c0, 0x012e, 0xe000,
++	0xe000, 0xe000, 0x6a3c, 0x2278, 0x781c, 0xa086, 0x0009, 0x1148,
++	0x7808, 0xd0fc, 0x0118, 0x080c, 0x8969, 0x0028, 0x080c, 0x89e2,
++	0x0010, 0x080c, 0x8a66, 0x00de, 0x00fe, 0x0005, 0x012e, 0xe000,
++	0x6843, 0x0000, 0x781c, 0xa086, 0x0009, 0x0110, 0x7803, 0x0002,
++	0x780c, 0xa015, 0x0140, 0x6a3a, 0x780f, 0x0000, 0x6833, 0x0000,
++	0x683f, 0x0000, 0x0c40, 0x683a, 0x6836, 0x0cc0, 0xc1bc, 0x2102,
++	0x0066, 0x2031, 0x0001, 0x080c, 0x5fa4, 0x006e, 0x0804, 0x7f7d,
++	0x601c, 0xa084, 0x000f, 0x000b, 0x0005, 0x7ffe, 0x8003, 0x84c1,
++	0x85dd, 0x8003, 0x84c1, 0x85dd, 0x7ffe, 0x8003, 0x080c, 0x7db1,
++	0x080c, 0x7e94, 0x0005, 0x0156, 0x0136, 0x0146, 0x00c6, 0x00f6,
++	0x6004, 0xa08a, 0x0080, 0x1a0c, 0x1519, 0x6118, 0x2178, 0x79a0,
++	0x2011, 0xc635, 0x2214, 0xd2ac, 0x1110, 0xd1bc, 0x0150, 0x7900,
++	0xd1f4, 0x0120, 0x7914, 0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000,
++	0x0028, 0xa1f8, 0x2f6e, 0x2f0d, 0xa18c, 0x00ff, 0x2c78, 0x2061,
++	0x0100, 0x619a, 0xa08a, 0x0040, 0x1a04, 0x8077, 0x0033, 0x00fe,
++	0x00ce, 0x014e, 0x013e, 0x015e, 0x0005, 0x8126, 0x8171, 0x819e,
++	0x826b, 0x8299, 0x82a1, 0x82c7, 0x82d8, 0x82e9, 0x82f1, 0x8307,
++	0x82f1, 0x8368, 0x82d8, 0x8389, 0x8391, 0x82e9, 0x8391, 0x83a2,
++	0x8075, 0x8075, 0x8075, 0x8075, 0x8075, 0x8075, 0x8075, 0x8075,
++	0x8075, 0x8075, 0x8075, 0x8d1a, 0x8d3f, 0x8d54, 0x8d77, 0x8d98,
++	0x82c7, 0x8075, 0x82c7, 0x82f1, 0x8075, 0x819e, 0x826b, 0x8075,
++	0x91e8, 0x82f1, 0x8075, 0x9208, 0x82f1, 0x8075, 0x82e9, 0x811f,
++	0x808a, 0x8075, 0x922d, 0x92a2, 0x9379, 0x8075, 0x938a, 0x82c2,
++	0x93a6, 0x8075, 0x8dad, 0x9401, 0x8075, 0x080c, 0x1519, 0x2100,
++	0x0033, 0x00fe, 0x00ce, 0x014e, 0x013e, 0x015e, 0x0005, 0x9458,
++	0x9507, 0x8088, 0x80be, 0x80dc, 0x80f2, 0x8088, 0x82c7, 0x8088,
++	0x080c, 0x1519, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x7810,
++	0x2068, 0x20a3, 0x2414, 0x20a3, 0x0018, 0x20a3, 0x0800, 0x683c,
++	0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x6850, 0x20a2, 0x6854, 0x20a2, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x60c3, 0x0018, 0x080c, 0x8be2, 0x00de, 0x0005, 0x00d6,
++	0x7818, 0x2068, 0x68a0, 0x2069, 0xc600, 0x6ad4, 0xd2ac, 0x1110,
++	0xd0bc, 0x0110, 0xa085, 0x0001, 0x00de, 0x0005, 0x00d6, 0x20a1,
++	0x020b, 0x080c, 0x83bf, 0x20a3, 0x0500, 0x20a3, 0x0000, 0x7810,
++	0xa0e8, 0x000f, 0x6808, 0x20a2, 0x680c, 0x20a2, 0x6810, 0x20a2,
++	0x6814, 0x20a2, 0x6818, 0x20a2, 0x681c, 0x20a2, 0x60c3, 0x0010,
++	0x080c, 0x8be2, 0x00de, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b,
++	0x080c, 0x83bf, 0x20a3, 0x7800, 0x20a3, 0x0000, 0x7808, 0x8007,
++	0x20a2, 0x20a3, 0x0000, 0x60c3, 0x0008, 0x080c, 0x8be2, 0x014e,
++	0x015e, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x845b,
++	0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3, 0xdf10, 0x20a3, 0x0034,
++	0x2099, 0xc605, 0x20a9, 0x0004, 0x53a6, 0x2099, 0xc601, 0x20a9,
++	0x0004, 0x53a6, 0x2099, 0xc90d, 0x20a9, 0x001a, 0x3304, 0x8007,
++	0x20a2, 0x9398, 0x1f04, 0x810e, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x004c, 0x080c, 0x8be2, 0x014e, 0x015e, 0x0005, 0x2001,
++	0xc615, 0x2004, 0x609a, 0x080c, 0x8be2, 0x0005, 0x20a1, 0x020b,
++	0x080c, 0x83bf, 0x20a3, 0x5200, 0x20a3, 0x0000, 0x00d6, 0x2069,
++	0xc652, 0x6804, 0xd084, 0x0150, 0x6828, 0x20a3, 0x0000, 0x0016,
++	0x080c, 0x29db, 0x21a2, 0x001e, 0x00de, 0x0028, 0x00de, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, 0xc605, 0x53a6,
++	0x20a9, 0x0004, 0x2099, 0xc601, 0x53a6, 0x2001, 0xc635, 0x2004,
++	0xd0ac, 0x1138, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007f,
++	0x0238, 0x2001, 0xc61c, 0x20a6, 0x2001, 0xc61d, 0x20a6, 0x0040,
++	0x20a3, 0x0000, 0x2001, 0xc615, 0x2004, 0xa084, 0x00ff, 0x20a2,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x080c, 0x8be2,
++	0x0005, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, 0x0500, 0x20a3,
++	0x0000, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1138, 0x7818, 0xa080,
++	0x0028, 0x2004, 0xa082, 0x007f, 0x0238, 0x2001, 0xc61c, 0x20a6,
++	0x2001, 0xc61d, 0x20a6, 0x0040, 0x20a3, 0x0000, 0x2001, 0xc615,
++	0x2004, 0xa084, 0x00ff, 0x20a2, 0x20a9, 0x0004, 0x2099, 0xc605,
++	0x53a6, 0x60c3, 0x0010, 0x080c, 0x8be2, 0x0005, 0x20a1, 0x020b,
++	0x080c, 0x83bf, 0x00c6, 0x7818, 0x2060, 0x2001, 0x0000, 0x080c,
++	0x5715, 0x00ce, 0x7818, 0xa080, 0x0028, 0x2004, 0xa086, 0x007e,
++	0x1130, 0x20a3, 0x0400, 0x620c, 0xc2b4, 0x620e, 0x0010, 0x20a3,
++	0x0300, 0x20a3, 0x0000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa086,
++	0x007e, 0x1904, 0x822d, 0x2001, 0xc635, 0x2004, 0xd0a4, 0x01c8,
++	0x2099, 0xc8d5, 0x33a6, 0x9398, 0x20a3, 0x0000, 0x9398, 0x3304,
++	0xa084, 0x2000, 0x20a2, 0x9398, 0x33a6, 0x9398, 0x20a3, 0x0000,
++	0x9398, 0x2001, 0x2710, 0x20a2, 0x9398, 0x33a6, 0x9398, 0x33a6,
++	0x00d0, 0x2099, 0xc8d5, 0x33a6, 0x9398, 0x33a6, 0x9398, 0x3304,
++	0x080c, 0x5f22, 0x1118, 0xa084, 0x37ff, 0x0010, 0xa084, 0x3fff,
++	0x20a2, 0x9398, 0x33a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, 0xc605, 0x53a6,
++	0x20a9, 0x0004, 0x2099, 0xc601, 0x53a6, 0x20a9, 0x0008, 0x20a3,
++	0x0000, 0x1f04, 0x8207, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04,
++	0x820d, 0x2099, 0xc8dd, 0x3304, 0xc0dd, 0x20a2, 0x2001, 0xc672,
++	0x2004, 0xd0e4, 0x0158, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x9398,
++	0x9398, 0x9398, 0x33a6, 0x20a9, 0x0004, 0x0010, 0x20a9, 0x0007,
++	0x20a3, 0x0000, 0x1f04, 0x8228, 0x0468, 0x2001, 0xc635, 0x2004,
++	0xd0a4, 0x0140, 0x2001, 0xc8d6, 0x2004, 0x60e3, 0x0000, 0x080c,
++	0x2a1c, 0x60e2, 0x2099, 0xc8d5, 0x20a9, 0x0008, 0x53a6, 0x20a9,
++	0x0004, 0x2099, 0xc605, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xc601,
++	0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x824b, 0x20a9,
++	0x0008, 0x20a3, 0x0000, 0x1f04, 0x8251, 0x2099, 0xc8dd, 0x20a9,
++	0x0008, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x825c,
++	0x20a9, 0x000a, 0x20a3, 0x0000, 0x1f04, 0x8262, 0x60c3, 0x0074,
++	0x080c, 0x8be2, 0x0005, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3,
++	0x2010, 0x20a3, 0x0014, 0x20a3, 0x0800, 0x20a3, 0x2000, 0xa006,
++	0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x00f6, 0x2079, 0xc652,
++	0x7904, 0x00fe, 0xd1ac, 0x1110, 0xa085, 0x0020, 0xd1a4, 0x0110,
++	0xa085, 0x0010, 0xa085, 0x0002, 0x00d6, 0x0804, 0x834a, 0x20a2,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x8be2,
++	0x0005, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, 0x5000, 0x0804,
++	0x81b9, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, 0x2110, 0x20a3,
++	0x0014, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c,
++	0x8be2, 0x0005, 0x20a1, 0x020b, 0x080c, 0x8453, 0x0020, 0x20a1,
++	0x020b, 0x080c, 0x845b, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004, 0x080c, 0x8be2, 0x0005,
++	0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0100, 0x20a3, 0x0000,
++	0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008, 0x080c, 0x8be2,
++	0x0005, 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0200, 0x0804,
++	0x81b9, 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0100, 0x20a3,
++	0x0000, 0x7828, 0xa005, 0x0110, 0x20a2, 0x0010, 0x20a3, 0x0003,
++	0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x8be2, 0x0005, 0x00d6,
++	0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0210, 0x20a3, 0x0014,
++	0x20a3, 0x0800, 0x7818, 0x2068, 0x6894, 0xa086, 0x0014, 0x1198,
++	0x699c, 0xa184, 0x0030, 0x0190, 0x6998, 0xa184, 0xc000, 0x1140,
++	0xd1ec, 0x0118, 0x20a3, 0x2100, 0x0058, 0x20a3, 0x0100, 0x0040,
++	0x20a3, 0x0400, 0x0028, 0x20a3, 0x0700, 0x0010, 0x700f, 0x0800,
++	0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x00f6, 0x2079,
++	0xc652, 0x7904, 0x00fe, 0xd1ac, 0x1110, 0xa085, 0x0020, 0xd1a4,
++	0x0110, 0xa085, 0x0010, 0x2009, 0xc674, 0x210c, 0xd184, 0x1110,
++	0xa085, 0x0002, 0x0026, 0x2009, 0xc672, 0x210c, 0xd1e4, 0x0130,
++	0xc0c5, 0xa094, 0x0030, 0xa296, 0x0010, 0x0140, 0xd1ec, 0x0130,
++	0xa094, 0x0030, 0xa296, 0x0010, 0x0108, 0xc0bd, 0x002e, 0x20a2,
++	0x20a2, 0x20a2, 0x60c3, 0x0014, 0x080c, 0x8be2, 0x00de, 0x0005,
++	0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0210, 0x20a3, 0x0014,
++	0x20a3, 0x0000, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x8be2,
++	0x0005, 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0200, 0x0804,
++	0x812c, 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0100, 0x20a3,
++	0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008, 0x080c,
++	0x8be2, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a1, 0x020b,
++	0x080c, 0x845b, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x000b,
++	0x20a3, 0x0000, 0x60c3, 0x0008, 0x080c, 0x8be2, 0x0005, 0x0026,
++	0x0036, 0x0046, 0x2019, 0x3200, 0x2021, 0x0800, 0x0038, 0x0026,
++	0x0036, 0x0046, 0x2019, 0x2200, 0x2021, 0x0100, 0x20e1, 0x9080,
++	0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2014, 0xa286, 0x007e,
++	0x11a0, 0xa385, 0x00ff, 0x20a2, 0x20a3, 0xfffe, 0x20a3, 0x0000,
++	0x2011, 0xc615, 0x2214, 0x2001, 0xc8e5, 0x2004, 0xa005, 0x0118,
++	0x2011, 0xc61d, 0x2214, 0x22a2, 0x04d0, 0xa286, 0x007f, 0x1138,
++	0x00d6, 0xa385, 0x00ff, 0x20a2, 0x20a3, 0xfffd, 0x00c8, 0x2001,
++	0xc635, 0x2004, 0xd0ac, 0x1110, 0xd2bc, 0x01c8, 0xa286, 0x0080,
++	0x00d6, 0x1130, 0xa385, 0x00ff, 0x20a2, 0x20a3, 0xfffc, 0x0040,
++	0xa2e8, 0xc77b, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2,
++	0x2069, 0xc61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0080, 0x00d6,
++	0xa2e8, 0xc77b, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2,
++	0x00de, 0x20a3, 0x0000, 0x2011, 0xc615, 0x2214, 0x22a2, 0xa485,
++	0x0029, 0x20a2, 0x004e, 0x003e, 0x20a3, 0x0000, 0x080c, 0x8bd1,
++	0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x002e, 0x0005, 0x0026, 0x20e1, 0x9080, 0x20e1,
++	0x4000, 0x20a3, 0x02ff, 0x2011, 0xfffc, 0x22a2, 0x00d6, 0x2069,
++	0xc61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x20a3, 0x2029, 0x20a3,
++	0x0000, 0x08e0, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0xfc02,
++	0x20a3, 0x0000, 0x0005, 0x0026, 0x0036, 0x0046, 0x2019, 0x3300,
++	0x2021, 0x0800, 0x0038, 0x0026, 0x0036, 0x0046, 0x2019, 0x2300,
++	0x2021, 0x0100, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080,
++	0x0028, 0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1118, 0xa092,
++	0x007e, 0x02d8, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa305,
++	0x20a2, 0x6814, 0x20a2, 0x6810, 0xa005, 0x1140, 0x6814, 0xa005,
++	0x1128, 0x20a3, 0x00ff, 0x20a3, 0xfffe, 0x0028, 0x2069, 0xc61c,
++	0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0080, 0x00d6, 0xa0e8, 0xc77b,
++	0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3,
++	0x0000, 0x2011, 0xc615, 0x2214, 0x22a2, 0xa485, 0x0098, 0x20a2,
++	0x20a3, 0x0000, 0x004e, 0x003e, 0x080c, 0x8bd1, 0x22a2, 0x20a3,
++	0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x002e, 0x0005, 0x080c, 0x8bd1, 0x22a2, 0x20a3, 0x0000, 0x7a08,
++	0x22a2, 0x7810, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e,
++	0x0005, 0x00c6, 0x00f6, 0x6004, 0xa08a, 0x0085, 0x0a0c, 0x1519,
++	0xa08a, 0x008c, 0x1a0c, 0x1519, 0x6118, 0x2178, 0x79a0, 0x2011,
++	0xc635, 0x2214, 0xd2ac, 0x1110, 0xd1bc, 0x0150, 0x7900, 0xd1f4,
++	0x0120, 0x7914, 0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000, 0x0028,
++	0xa1f8, 0x2f6e, 0x2f0d, 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100,
++	0x619a, 0xa082, 0x0085, 0x001b, 0x00fe, 0x00ce, 0x0005, 0x84f8,
++	0x8502, 0x851d, 0x84f6, 0x84f6, 0x84f6, 0x84f8, 0x080c, 0x1519,
++	0x0146, 0x20a1, 0x020b, 0x04a1, 0x60c3, 0x0000, 0x080c, 0x8be2,
++	0x014e, 0x0005, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8569, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x7810, 0x20a2, 0x20a3,
++	0x0000, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
++	0x000c, 0x080c, 0x8be2, 0x014e, 0x0005, 0x0146, 0x20a1, 0x020b,
++	0x080c, 0x85a3, 0x20a3, 0x0003, 0x20a3, 0x0300, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x60c3, 0x0004, 0x080c, 0x8be2, 0x014e, 0x0005,
++	0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++	0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e,
++	0x0288, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x8100,
++	0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c, 0x2da6, 0x8d68, 0x2da6,
++	0x00de, 0x0088, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085,
++	0x8100, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011,
++	0xc615, 0x2214, 0x22a2, 0x20a3, 0x0009, 0x20a3, 0x0000, 0x0804,
++	0x8426, 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080,
++	0x0028, 0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1118, 0xa092,
++	0x007e, 0x0288, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085,
++	0x8400, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c, 0x2da6, 0x8d68,
++	0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810,
++	0xa085, 0x8400, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000,
++	0x2011, 0xc615, 0x2214, 0x22a2, 0x2001, 0x0099, 0x20a2, 0x20a3,
++	0x0000, 0x0804, 0x84b2, 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000,
++	0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac,
++	0x1118, 0xa092, 0x007e, 0x0288, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c,
++	0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c,
++	0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xc77b,
++	0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x00de,
++	0x20a3, 0x0000, 0x2011, 0xc615, 0x2214, 0x22a2, 0x2001, 0x0099,
++	0x20a2, 0x20a3, 0x0000, 0x0804, 0x84b2, 0x00c6, 0x00f6, 0x2c78,
++	0x7804, 0xa08a, 0x0040, 0x0a0c, 0x1519, 0xa08a, 0x0053, 0x1a0c,
++	0x1519, 0x7918, 0x2160, 0x61a0, 0x2011, 0xc635, 0x2214, 0xd2ac,
++	0x1110, 0xd1bc, 0x0150, 0x6100, 0xd1f4, 0x0120, 0x6114, 0xa18c,
++	0x00ff, 0x0040, 0x2009, 0x0000, 0x0028, 0xa1e0, 0x2f6e, 0x2c0d,
++	0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0xa082, 0x0040, 0x001b,
++	0x00fe, 0x00ce, 0x0005, 0x8620, 0x872c, 0x86c9, 0x88de, 0x861e,
++	0x861e, 0x861e, 0x861e, 0x861e, 0x861e, 0x861e, 0x8f70, 0x8f80,
++	0x8f90, 0x8fa0, 0x861e, 0x93b7, 0x861e, 0x8f5f, 0x080c, 0x1519,
++	0x00d6, 0x0156, 0x0146, 0x780b, 0xffff, 0x20a1, 0x020b, 0x080c,
++	0x8680, 0x7910, 0x2168, 0x6948, 0x7952, 0x21a2, 0xa016, 0x22a2,
++	0x22a2, 0x22a2, 0x694c, 0xa184, 0x000f, 0x1118, 0x2001, 0x0005,
++	0x0040, 0xd184, 0x0118, 0x2001, 0x0004, 0x0018, 0xa084, 0x0006,
++	0x8004, 0x0016, 0x2008, 0x7858, 0xa084, 0x00ff, 0x8007, 0xa105,
++	0x001e, 0x20a2, 0xd1ac, 0x0118, 0x20a3, 0x0002, 0x0048, 0xd1b4,
++	0x0118, 0x20a3, 0x0001, 0x0020, 0x20a3, 0x0000, 0x2230, 0x0010,
++	0x6a80, 0x6e7c, 0x20a9, 0x0008, 0x0136, 0xad88, 0x0017, 0x2198,
++	0x20a1, 0x021b, 0x53a6, 0x013e, 0x20a1, 0x020b, 0x22a2, 0x26a2,
++	0x60c3, 0x0020, 0x20e1, 0x9080, 0x6014, 0xa084, 0x0004, 0xa085,
++	0x0009, 0x6016, 0x2001, 0xc943, 0x2003, 0x07d0, 0x2001, 0xc942,
++	0x2003, 0x0009, 0x080c, 0x17f1, 0x014e, 0x015e, 0x00de, 0x0005,
++	0x20e1, 0x9080, 0x20e1, 0x4000, 0x7a18, 0xa280, 0x0023, 0x2014,
++	0x8210, 0xa294, 0x00ff, 0x2202, 0x8217, 0x7818, 0xa080, 0x0028,
++	0x2004, 0x2019, 0xc635, 0x231c, 0xd3ac, 0x1110, 0xd0bc, 0x0188,
++	0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x0600, 0x20a2,
++	0x6814, 0x20a2, 0x2069, 0xc61c, 0x2da6, 0x8d68, 0x2da6, 0x00de,
++	0x0088, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x0600,
++	0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2009, 0xc615,
++	0x210c, 0x21a2, 0x20a3, 0x0829, 0x20a3, 0x0000, 0x22a2, 0x20a3,
++	0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, 0x20a1, 0x020b, 0x00c1,
++	0x7810, 0x2068, 0x6860, 0x20a2, 0x685c, 0x20a2, 0x6880, 0x20a2,
++	0x687c, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x60c3,
++	0x000c, 0x080c, 0x8be2, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005,
++	0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++	0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188,
++	0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2,
++	0x6814, 0x20a2, 0x2069, 0xc61c, 0x2da6, 0x8d68, 0x2da6, 0x00de,
++	0x0088, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x0500,
++	0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xc615,
++	0x2214, 0x22a2, 0x20a3, 0x0889, 0x20a3, 0x0000, 0x080c, 0x8bd1,
++	0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x002e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146,
++	0x7810, 0xa0ec, 0xf000, 0x0168, 0xa06d, 0x080c, 0x56bf, 0x0148,
++	0x684c, 0xa084, 0x2020, 0xa086, 0x2020, 0x1118, 0x7820, 0xc0cd,
++	0x7822, 0x20a1, 0x020b, 0x080c, 0x8894, 0xa016, 0x22a2, 0x22a2,
++	0x22a2, 0x22a2, 0x22a2, 0x7810, 0xa084, 0xf000, 0x1130, 0x7810,
++	0xa084, 0x0700, 0x8007, 0x0043, 0x0010, 0xa006, 0x002b, 0x014e,
++	0x013e, 0x015e, 0x00de, 0x0005, 0x8766, 0x87fb, 0x880b, 0x883d,
++	0x8850, 0x886b, 0x8874, 0x8764, 0x080c, 0x1519, 0x0016, 0x0036,
++	0x694c, 0xa18c, 0x0003, 0x0118, 0xa186, 0x0003, 0x1170, 0x6b78,
++	0x7820, 0xd0cc, 0x0108, 0xc3e5, 0x23a2, 0x6868, 0x20a2, 0x6864,
++	0x20a2, 0x003e, 0x001e, 0x0804, 0x8847, 0xa186, 0x0001, 0x190c,
++	0x1519, 0x6b78, 0x7820, 0xd0cc, 0x0108, 0xc3e5, 0x23a2, 0x6868,
++	0x20a2, 0x6864, 0x20a2, 0x22a2, 0x6874, 0x20a2, 0x22a2, 0x687c,
++	0x20a2, 0x2009, 0x0018, 0xa384, 0x0300, 0x0904, 0x87f5, 0xd3c4,
++	0x0110, 0x687c, 0xa108, 0xd3cc, 0x0110, 0x6874, 0xa108, 0x0156,
++	0x20a9, 0x000d, 0xad80, 0x0020, 0x201c, 0x831f, 0x23a2, 0x8000,
++	0x1f04, 0x87a4, 0x015e, 0x22a2, 0x22a2, 0x22a2, 0xa184, 0x0003,
++	0x0904, 0x87f5, 0x20a1, 0x020b, 0x20e1, 0x9080, 0x20e1, 0x4000,
++	0x0006, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xc635, 0x2214,
++	0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c,
++	0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c,
++	0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xc77b,
++	0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x00de,
++	0x20a3, 0x0000, 0x2011, 0xc615, 0x2214, 0x22a2, 0x000e, 0x7b20,
++	0xd3cc, 0x0118, 0x20a3, 0x0889, 0x0010, 0x20a3, 0x0898, 0x20a2,
++	0x080c, 0x8bd1, 0x22a2, 0x20a3, 0x0000, 0x61c2, 0x003e, 0x001e,
++	0x080c, 0x8be2, 0x0005, 0x2011, 0x0008, 0x2001, 0xc60d, 0x2004,
++	0xd0f4, 0x0110, 0x2011, 0x0028, 0x7820, 0xd0cc, 0x0108, 0xc2e5,
++	0x22a2, 0xa016, 0x04d0, 0x2011, 0x0302, 0x0016, 0x0036, 0x7828,
++	0x792c, 0xa11d, 0x0108, 0xc2dd, 0x7b20, 0xd3cc, 0x0108, 0xc2e5,
++	0x22a2, 0x20a2, 0x21a2, 0x003e, 0x001e, 0xa016, 0x22a2, 0x20a3,
++	0x0012, 0x22a2, 0x20a3, 0x0008, 0x22a2, 0x22a2, 0x22a2, 0x22a2,
++	0x20a3, 0x7000, 0x20a3, 0x0500, 0x22a2, 0x20a3, 0x000a, 0x22a2,
++	0x22a2, 0x20a3, 0x2500, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2,
++	0x60c3, 0x0032, 0x080c, 0x8be2, 0x0005, 0x2011, 0x0028, 0x7820,
++	0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016, 0x22a2, 0x22a2, 0x22a2,
++	0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0018, 0x080c, 0x8be2, 0x0005,
++	0x2011, 0x0100, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016,
++	0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0008, 0x22a2,
++	0x7854, 0xa084, 0x00ff, 0x20a2, 0x22a2, 0x22a2, 0x60c3, 0x0020,
++	0x080c, 0x8be2, 0x0005, 0x2011, 0x0008, 0x7820, 0xd0cc, 0x0108,
++	0xc2e5, 0x22a2, 0xa016, 0x0888, 0x0036, 0x7b10, 0xa384, 0xff00,
++	0x7812, 0xa384, 0x00ff, 0x8001, 0x1138, 0x7820, 0xd0cc, 0x0108,
++	0xc2e5, 0x22a2, 0x003e, 0x0808, 0x0046, 0x2021, 0x0800, 0x0006,
++	0x7820, 0xd0cc, 0x000e, 0x0108, 0xc4e5, 0x24a2, 0x004e, 0x22a2,
++	0x20a2, 0x003e, 0x0804, 0x8847, 0x0026, 0x20e1, 0x9080, 0x20e1,
++	0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xc635, 0x2214,
++	0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c,
++	0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c,
++	0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xc77b,
++	0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x00de,
++	0x20a3, 0x0000, 0x2011, 0xc615, 0x2214, 0x22a2, 0x7820, 0xd0cc,
++	0x0118, 0x20a3, 0x0889, 0x0010, 0x20a3, 0x0898, 0x20a3, 0x0000,
++	0x080c, 0x8bd1, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x00d6, 0x0156,
++	0x0136, 0x0146, 0x0016, 0x0036, 0x7810, 0xa084, 0x0700, 0x8007,
++	0x003b, 0x003e, 0x001e, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005,
++	0x88f8, 0x88f8, 0x88fa, 0x88f8, 0x88f8, 0x88f8, 0x891c, 0x88f8,
++	0x080c, 0x1519, 0x7910, 0xa18c, 0xf8ff, 0xa18d, 0x0600, 0x7912,
++	0x20a1, 0x020b, 0x2009, 0x0003, 0x00f9, 0x00d6, 0x2069, 0xc652,
++	0x6804, 0xd0bc, 0x0130, 0x682c, 0xa084, 0x00ff, 0x8007, 0x20a2,
++	0x0010, 0x20a3, 0x3f00, 0x00de, 0x22a2, 0x22a2, 0x22a2, 0x60c3,
++	0x0001, 0x080c, 0x8be2, 0x0005, 0x20a1, 0x020b, 0x2009, 0x0003,
++	0x0019, 0x20a3, 0x7f00, 0x0c80, 0x0026, 0x20e1, 0x9080, 0x20e1,
++	0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xc635, 0x2214,
++	0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c,
++	0x6810, 0xa085, 0x0100, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c,
++	0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xc77b,
++	0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2, 0x6814, 0x20a2, 0x00de,
++	0x20a3, 0x0000, 0x2011, 0xc615, 0x2214, 0x22a2, 0x20a3, 0x0888,
++	0xa18d, 0x0008, 0x21a2, 0x080c, 0x8bd1, 0x22a2, 0x20a3, 0x0000,
++	0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e,
++	0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, 0x0036,
++	0x2061, 0x0100, 0x2071, 0xc600, 0x2009, 0xc615, 0x210c, 0x7818,
++	0x2068, 0x2031, 0xc635, 0x2634, 0xa6b4, 0x0028, 0x0110, 0x7370,
++	0x7474, 0x2500, 0x2031, 0xc635, 0x2634, 0xa6b4, 0x0028, 0x0140,
++	0x2001, 0x04ff, 0x6062, 0x6067, 0xffff, 0x636a, 0x646e, 0x0050,
++	0x2001, 0x00ff, 0xa085, 0x0400, 0x6062, 0x6067, 0xffff, 0x606b,
++	0x0000, 0x616e, 0x68b8, 0x6073, 0x0530, 0x6077, 0x0008, 0x688c,
++	0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0xa085, 0x0020, 0x607a,
++	0x68b4, 0x607f, 0x0000, 0x2d00, 0x6082, 0x6087, 0xffff, 0x7810,
++	0x2070, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008,
++	0x60ca, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7,
++	0x0000, 0x2001, 0xc635, 0x2004, 0xa084, 0x0028, 0x0128, 0x609f,
++	0x0000, 0x2001, 0x0092, 0x0048, 0x6028, 0xc0bd, 0x602a, 0x609f,
++	0x00ff, 0x6027, 0xffff, 0x2001, 0x00b2, 0x6016, 0x2009, 0x07d0,
++	0x080c, 0x7029, 0x003e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de,
++	0x00ee, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046,
++	0x0036, 0x2061, 0x0100, 0x2071, 0xc600, 0x2009, 0xc615, 0x210c,
++	0x7818, 0x2068, 0x68a0, 0x2028, 0x2031, 0xc635, 0x2634, 0xd6ac,
++	0x1160, 0xa582, 0x007e, 0x1248, 0x2500, 0xd0bc, 0x1130, 0xa080,
++	0x2f6e, 0x2015, 0xa294, 0x00ff, 0x0020, 0x6910, 0x6a14, 0x7370,
++	0x7474, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1128, 0xa582, 0x007e,
++	0x1210, 0xd5bc, 0x0138, 0xa185, 0x0400, 0x6062, 0x6266, 0x636a,
++	0x646e, 0x0030, 0x6063, 0x0400, 0x6266, 0x606b, 0x0000, 0x616e,
++	0x68b8, 0x6072, 0x6077, 0x0000, 0x6864, 0xd0a4, 0x0110, 0x6077,
++	0x0008, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0xa085,
++	0x0020, 0x607a, 0x68b4, 0x607f, 0x0000, 0x2d00, 0x6082, 0x6087,
++	0xffff, 0x7810, 0x2070, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c,
++	0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af,
++	0x95d5, 0x60d7, 0x0000, 0xa582, 0x007e, 0x0210, 0x2011, 0x0000,
++	0x629e, 0x00f6, 0x2079, 0x0140, 0x7803, 0x0000, 0x00fe, 0x2009,
++	0x0092, 0x6116, 0x2009, 0x07d0, 0x080c, 0x7029, 0x003e, 0x004e,
++	0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x00e6, 0x00d6,
++	0x00c6, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0xc600,
++	0x7154, 0x7818, 0x2068, 0x68a0, 0x2028, 0x76d4, 0xd6ac, 0x1130,
++	0xd0bc, 0x1120, 0x6910, 0x6a14, 0x7454, 0x0020, 0x6910, 0x6a14,
++	0x7370, 0x7474, 0x781c, 0xa0be, 0x0006, 0x0904, 0x8b1c, 0xa0be,
++	0x000a, 0x15e8, 0xa185, 0x0200, 0x6062, 0x6266, 0x636a, 0x646e,
++	0x6073, 0x2029, 0x6077, 0x0000, 0x688c, 0x8000, 0xa084, 0x00ff,
++	0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808,
++	0x6086, 0x7810, 0x2070, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c,
++	0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7,
++	0x0000, 0x609f, 0x0000, 0x080c, 0x9452, 0x2009, 0x07d0, 0x60c4,
++	0xa084, 0xfff0, 0xa005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x7029,
++	0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x70d4,
++	0xd0ac, 0x1110, 0xd5bc, 0x0138, 0xa185, 0x0100, 0x6062, 0x6266,
++	0x636a, 0x646e, 0x0038, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b,
++	0x0000, 0x646e, 0x6073, 0x0809, 0x6077, 0x0008, 0x688c, 0x8000,
++	0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00,
++	0x6082, 0x7808, 0x6086, 0x7810, 0x2070, 0x7014, 0x608a, 0x7010,
++	0x608e, 0x700c, 0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60af,
++	0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080, 0x0248, 0x6a00, 0xd2f4,
++	0x0120, 0x6a14, 0xa294, 0x00ff, 0x0010, 0x2011, 0x0000, 0x629e,
++	0x080c, 0x9452, 0x2009, 0x07d0, 0x60c4, 0xa084, 0xfff0, 0xa005,
++	0x0110, 0x2009, 0x1b58, 0x080c, 0x7029, 0x003e, 0x004e, 0x005e,
++	0x00ce, 0x00de, 0x00ee, 0x0005, 0x7810, 0x2070, 0x704c, 0xa084,
++	0x0003, 0xa086, 0x0002, 0x0904, 0x8b72, 0x2001, 0xc635, 0x2004,
++	0xd0ac, 0x1110, 0xd5bc, 0x0138, 0xa185, 0x0100, 0x6062, 0x6266,
++	0x636a, 0x646e, 0x0038, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b,
++	0x0000, 0x646e, 0x6073, 0x0880, 0x6077, 0x0008, 0x688c, 0x8000,
++	0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x7834, 0x607e, 0x2f00,
++	0x6086, 0x7808, 0x6082, 0x7060, 0x608a, 0x705c, 0x608e, 0x7080,
++	0x60c6, 0x707c, 0x60ca, 0x707c, 0x792c, 0xa108, 0x792e, 0x7080,
++	0x7928, 0xa109, 0x792a, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7,
++	0x0000, 0xa582, 0x0080, 0x0248, 0x6a00, 0xd2f4, 0x0120, 0x6a14,
++	0xa294, 0x00ff, 0x0010, 0x2011, 0x0000, 0x629e, 0x080c, 0x944f,
++	0x0804, 0x8b0a, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1110, 0xd5bc,
++	0x0138, 0xa185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, 0x0038,
++	0xa185, 0x0700, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x080c,
++	0x56bf, 0x0180, 0x00d6, 0x7810, 0xa06d, 0x684c, 0x00de, 0xa084,
++	0x2020, 0xa086, 0x2020, 0x1130, 0x7820, 0xc0cd, 0x7822, 0x6073,
++	0x0889, 0x0010, 0x6073, 0x0898, 0x6077, 0x0000, 0x688c, 0x8000,
++	0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00,
++	0x6086, 0x7808, 0x6082, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c,
++	0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7,
++	0x0000, 0xa582, 0x0080, 0x0248, 0x6a00, 0xd2f4, 0x0120, 0x6a14,
++	0xa294, 0x00ff, 0x0010, 0x2011, 0x0000, 0x629e, 0x7820, 0xd0cc,
++	0x0120, 0x080c, 0x9452, 0x0804, 0x8b0a, 0x080c, 0x944f, 0x0804,
++	0x8b0a, 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff,
++	0x2202, 0x8217, 0x0005, 0x00d6, 0x2069, 0xc927, 0x6843, 0x0001,
++	0x00de, 0x0005, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575,
++	0x0019, 0x080c, 0x701b, 0x0005, 0x0006, 0x6014, 0xa084, 0x0004,
++	0xa085, 0x0009, 0x6016, 0x000e, 0x0005, 0x0016, 0x00c6, 0x0006,
++	0x2061, 0x0100, 0x61a4, 0x60a7, 0x95f5, 0x6014, 0xa084, 0x0004,
++	0xa085, 0x0008, 0x6016, 0x000e, 0xe000, 0xe000, 0xe000, 0xe000,
++	0x61a6, 0x00ce, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0016, 0x0026,
++	0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x5f22, 0x1198, 0x2001,
++	0xc943, 0x2004, 0xa005, 0x15b8, 0x0066, 0x2031, 0x0001, 0x080c,
++	0x5fa4, 0x006e, 0x1118, 0x080c, 0x701b, 0x0468, 0x00c6, 0x2061,
++	0xc927, 0x00d8, 0x6904, 0xa194, 0x4000, 0x0550, 0x0831, 0x6803,
++	0x1000, 0x6803, 0x0000, 0x00c6, 0x2061, 0xc927, 0x6128, 0xa192,
++	0x00c8, 0x1258, 0x8108, 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198,
++	0x080c, 0x701b, 0x080c, 0x8bec, 0x0070, 0x6124, 0xa1e5, 0x0000,
++	0x0140, 0x080c, 0xc59b, 0x080c, 0x7024, 0x2009, 0x0014, 0x080c,
++	0x9613, 0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005,
++	0x2001, 0xc943, 0x2004, 0xa005, 0x1db0, 0x00c6, 0x2061, 0xc927,
++	0x6128, 0xa192, 0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c,
++	0x701b, 0x080c, 0x4e5b, 0x0c38, 0x00c6, 0x00d6, 0x00e6, 0x0016,
++	0x0026, 0x080c, 0x7031, 0x2071, 0xc927, 0x713c, 0x81ff, 0x0904,
++	0x8cc1, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x5f22, 0x1500,
++	0x0036, 0x2019, 0x0002, 0x080c, 0x8e79, 0x003e, 0x713c, 0x2160,
++	0x080c, 0xc59b, 0x2009, 0x004a, 0x621c, 0xa296, 0x0009, 0x1138,
++	0x6110, 0xa188, 0x0012, 0x200b, 0x0006, 0x2009, 0x0104, 0x080c,
++	0x9613, 0x0066, 0x2031, 0x0001, 0x080c, 0x5fa4, 0x006e, 0x0408,
++	0x6904, 0xa194, 0x4000, 0x0518, 0x6803, 0x1000, 0x6803, 0x0000,
++	0x0036, 0x2019, 0x0001, 0x080c, 0x8e79, 0x003e, 0x713c, 0x2160,
++	0x080c, 0xc59b, 0x2009, 0x004a, 0x621c, 0xa296, 0x0009, 0x1138,
++	0x6110, 0xa188, 0x0012, 0x200b, 0x0006, 0x2009, 0x0104, 0x080c,
++	0x9613, 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0c00,
++	0x0026, 0x00e6, 0x2071, 0xc927, 0x7048, 0xd084, 0x01d8, 0x713c,
++	0x81ff, 0x01c0, 0x2071, 0x0100, 0xa188, 0x0007, 0x2114, 0xa28e,
++	0x0006, 0x1138, 0x7014, 0xa084, 0x0184, 0xa085, 0x0012, 0x7016,
++	0x0048, 0xa28e, 0x0009, 0x0db0, 0x7014, 0xa084, 0x0184, 0xa085,
++	0x0016, 0x7016, 0x00ee, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x00c6,
++	0x0066, 0x0056, 0x0046, 0x0006, 0x0126, 0x2091, 0x8000, 0x6018,
++	0x2068, 0x6ca0, 0x2071, 0xc927, 0x7018, 0x2068, 0x8dff, 0x0188,
++	0x68a0, 0xa406, 0x0118, 0x6854, 0x2068, 0x0cc0, 0x6010, 0x2060,
++	0x643c, 0x6540, 0x6648, 0x2d60, 0x080c, 0x54ae, 0x0110, 0xa085,
++	0x0001, 0x012e, 0x000e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de,
++	0x00ee, 0x0005, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, 0x1200,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x781c, 0xa086, 0x0004, 0x1110,
++	0x6098, 0x0018, 0x2001, 0xc615, 0x2004, 0x20a2, 0x7834, 0x20a2,
++	0x7838, 0x20a2, 0x20a9, 0x0010, 0xa006, 0x20a2, 0x1f04, 0x8d35,
++	0x20a2, 0x20a2, 0x60c3, 0x002c, 0x080c, 0x8be2, 0x0005, 0x0156,
++	0x0146, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, 0x0f00, 0x20a3,
++	0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008, 0x080c,
++	0x8be2, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b,
++	0x080c, 0x845b, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a9, 0x0006,
++	0x2011, 0xc640, 0x2019, 0xc641, 0x23a6, 0x22a6, 0xa398, 0x0002,
++	0xa290, 0x0002, 0x1f04, 0x8d64, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x001c, 0x080c, 0x8be2, 0x014e, 0x015e, 0x0005, 0x0156,
++	0x0146, 0x0016, 0x0026, 0x20a1, 0x020b, 0x080c, 0x8434, 0x080c,
++	0x844a, 0x7810, 0xa080, 0x0000, 0x2004, 0xa080, 0x0015, 0x2098,
++	0x7808, 0xa088, 0x0002, 0x21a8, 0x53a6, 0xa080, 0x0004, 0x8003,
++	0x60c2, 0x080c, 0x8be2, 0x002e, 0x001e, 0x014e, 0x015e, 0x0005,
++	0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, 0x6200,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008,
++	0x080c, 0x8be2, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x0016,
++	0x0026, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x7810, 0xa080, 0x0000,
++	0x2004, 0xa080, 0x0017, 0x2098, 0x7808, 0xa088, 0x0002, 0x21a8,
++	0x53a6, 0x8003, 0x60c2, 0x080c, 0x8be2, 0x002e, 0x001e, 0x014e,
++	0x015e, 0x0005, 0x00e6, 0x00c6, 0x0006, 0x0126, 0x2091, 0x8000,
++	0x2071, 0xc927, 0x700c, 0x2060, 0x8cff, 0x0178, 0x080c, 0xae8f,
++	0x1110, 0x080c, 0x9c09, 0x600c, 0x0006, 0x080c, 0xb056, 0x080c,
++	0x95e3, 0x080c, 0x8fb7, 0x00ce, 0x0c78, 0x700f, 0x0000, 0x700b,
++	0x0000, 0x012e, 0x000e, 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0156,
++	0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0026, 0x0016, 0x0006, 0x2091,
++	0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0xc927, 0x7024,
++	0x2060, 0x8cff, 0x05a0, 0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c,
++	0x7024, 0x2009, 0x0013, 0x080c, 0x9613, 0x20a9, 0x01f4, 0x6824,
++	0xd094, 0x0158, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0,
++	0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0xd084, 0x0118, 0x6827,
++	0x0001, 0x0010, 0x1f04, 0x8e0f, 0x7804, 0xa084, 0x1000, 0x0120,
++	0x7803, 0x0100, 0x7803, 0x0000, 0x6824, 0x000e, 0x001e, 0x002e,
++	0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001,
++	0xc600, 0x2004, 0xa096, 0x0001, 0x0590, 0xa096, 0x0004, 0x0578,
++	0x080c, 0x7024, 0x6814, 0xa084, 0x0001, 0x0110, 0x68a7, 0x95f5,
++	0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x4e18, 0x080c, 0x6fad,
++	0x20a9, 0x01f4, 0x6824, 0xd094, 0x0158, 0x6827, 0x0004, 0x7804,
++	0xa084, 0x4000, 0x01a0, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078,
++	0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0x8e52, 0x7804,
++	0xa084, 0x1000, 0x0120, 0x7803, 0x0100, 0x7803, 0x0000, 0x000e,
++	0x001e, 0x002e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e,
++	0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0026,
++	0x0016, 0x0006, 0x2091, 0x8000, 0x2069, 0x0100, 0x2079, 0x0140,
++	0x2071, 0xc927, 0x703c, 0x2060, 0x8cff, 0x0904, 0x8f04, 0xa386,
++	0x0002, 0x1128, 0x6814, 0xa084, 0x0002, 0x0904, 0x8f04, 0x68af,
++	0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, 0x1df0, 0x68c7,
++	0x0000, 0x68cb, 0x0008, 0x080c, 0x7031, 0x080c, 0x22ee, 0x0046,
++	0x2009, 0x017f, 0x200b, 0x00a5, 0x2021, 0x0169, 0x2404, 0xa084,
++	0x000f, 0xa086, 0x0004, 0x1500, 0x68af, 0x95f5, 0x68c7, 0x0000,
++	0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0020, 0x2071, 0xc992,
++	0x6814, 0xa084, 0x0184, 0xa085, 0x0012, 0x6816, 0x7803, 0x0008,
++	0x7003, 0x0000, 0x00fe, 0x00ee, 0xa386, 0x0002, 0x1128, 0x7884,
++	0xa005, 0x1110, 0x7887, 0x0001, 0x2001, 0xc8f8, 0x2004, 0x200a,
++	0x004e, 0xa39d, 0x0000, 0x1140, 0x2009, 0x0049, 0x601c, 0xa086,
++	0x0009, 0x0110, 0x080c, 0x9613, 0x20a9, 0x03e8, 0x6824, 0xd094,
++	0x0158, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0, 0x7803,
++	0x1000, 0x7803, 0x0000, 0x0078, 0xd08c, 0x0118, 0x6827, 0x0002,
++	0x0010, 0x1f04, 0x8ee6, 0x7804, 0xa084, 0x1000, 0x0120, 0x7803,
++	0x0100, 0x7803, 0x0000, 0x6824, 0x000e, 0x001e, 0x002e, 0x00ce,
++	0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6, 0x0126,
++	0x2091, 0x8000, 0x2069, 0xc927, 0x6a06, 0x012e, 0x00de, 0x0005,
++	0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0xc927, 0x6a32, 0x012e,
++	0x00de, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0006, 0x0126,
++	0x2071, 0xc927, 0x7614, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff,
++	0x0538, 0x601c, 0xa206, 0x1500, 0x7014, 0xac36, 0x1110, 0x660c,
++	0x7616, 0x7010, 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00,
++	0x7012, 0x0010, 0x7013, 0x0000, 0x660c, 0x0066, 0x2c00, 0xaf06,
++	0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xae54,
++	0x080c, 0x8fb7, 0x00ce, 0x08d8, 0x2c78, 0x600c, 0x2060, 0x08b8,
++	0x012e, 0x000e, 0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0156,
++	0x0146, 0x20a1, 0x020b, 0x080c, 0x8680, 0x7810, 0x20a2, 0xa006,
++	0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x1000, 0x0804, 0x8faf,
++	0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8680, 0x7810, 0x20a2,
++	0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x4000, 0x0478,
++	0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8680, 0x7810, 0x20a2,
++	0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x2000, 0x00f8,
++	0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8680, 0x7810, 0x20a2,
++	0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078,
++	0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8680, 0x7810, 0x20a2,
++	0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, 0x0089,
++	0x60c3, 0x0020, 0x080c, 0x8be2, 0x014e, 0x015e, 0x0005, 0x00e6,
++	0x2071, 0xc927, 0x7020, 0xa005, 0x0110, 0x8001, 0x7022, 0x00ee,
++	0x0005, 0x20a9, 0x0008, 0x20a2, 0x1f04, 0x8fc3, 0x20a2, 0x20a2,
++	0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006,
++	0x0126, 0x2091, 0x8000, 0x2071, 0xc927, 0x7614, 0x2660, 0x2678,
++	0x2039, 0x0001, 0x87ff, 0x0904, 0x905f, 0x8cff, 0x0904, 0x905f,
++	0x601c, 0xa086, 0x0006, 0x1904, 0x905a, 0x88ff, 0x0138, 0x2800,
++	0xac06, 0x1904, 0x905a, 0x2039, 0x0000, 0x0050, 0x6018, 0xa206,
++	0x1904, 0x905a, 0x85ff, 0x0120, 0x6050, 0xa106, 0x1904, 0x905a,
++	0x7024, 0xac06, 0x1598, 0x2069, 0x0100, 0x68c0, 0xa005, 0x1160,
++	0x6824, 0xd084, 0x0148, 0x6827, 0x0001, 0x080c, 0x7024, 0x080c,
++	0x90e6, 0x7027, 0x0000, 0x0410, 0x080c, 0x7024, 0x6820, 0xd0b4,
++	0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c,
++	0x90e6, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384,
++	0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
++	0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x7014, 0xac36,
++	0x1110, 0x660c, 0x7616, 0x7010, 0xac36, 0x1140, 0x2c00, 0xaf36,
++	0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000, 0x660c, 0x0066,
++	0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x89ff, 0x1158,
++	0x600f, 0x0000, 0x6010, 0x2068, 0x080c, 0xac91, 0x0110, 0x080c,
++	0xc141, 0x080c, 0xae54, 0x080c, 0x8fb7, 0x88ff, 0x1190, 0x00ce,
++	0x0804, 0x8fda, 0x2c78, 0x600c, 0x2060, 0x0804, 0x8fda, 0xa006,
++	0x012e, 0x000e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x00fe,
++	0x0005, 0x6017, 0x0000, 0x00ce, 0xa8c5, 0x0001, 0x0c88, 0x00f6,
++	0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091,
++	0x8000, 0x2071, 0xc927, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0904,
++	0x90d6, 0x601c, 0xa086, 0x0006, 0x1904, 0x90d1, 0x87ff, 0x0128,
++	0x2700, 0xac06, 0x1904, 0x90d1, 0x0048, 0x6018, 0xa206, 0x1904,
++	0x90d1, 0x85ff, 0x0118, 0x6050, 0xa106, 0x15d8, 0x703c, 0xac06,
++	0x1180, 0x0036, 0x2019, 0x0001, 0x080c, 0x8e79, 0x7033, 0x0000,
++	0x703f, 0x0000, 0x7043, 0x0000, 0x7047, 0x0000, 0x704b, 0x0000,
++	0x003e, 0x7038, 0xac36, 0x1110, 0x660c, 0x763a, 0x7034, 0xac36,
++	0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037,
++	0x0000, 0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008,
++	0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x080c, 0xac91, 0x0110,
++	0x080c, 0xc141, 0x080c, 0xae54, 0x87ff, 0x1190, 0x00ce, 0x0804,
++	0x907e, 0x2c78, 0x600c, 0x2060, 0x0804, 0x907e, 0xa006, 0x012e,
++	0x000e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005,
++	0x6017, 0x0000, 0x00ce, 0xa7bd, 0x0001, 0x0c88, 0x00e6, 0x2071,
++	0xc927, 0x2001, 0xc600, 0x2004, 0xa086, 0x0002, 0x1118, 0x7007,
++	0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6,
++	0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071,
++	0xc927, 0x2c10, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0518, 0x2200,
++	0xac06, 0x11e0, 0x7038, 0xac36, 0x1110, 0x660c, 0x763a, 0x7034,
++	0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7036, 0x0010,
++	0x7037, 0x0000, 0x660c, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008,
++	0x2678, 0x600f, 0x0000, 0xa085, 0x0001, 0x0020, 0x2c78, 0x600c,
++	0x2060, 0x08d8, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00ee,
++	0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0006,
++	0x0126, 0x2091, 0x8000, 0x2071, 0xc927, 0x760c, 0x2660, 0x2678,
++	0x8cff, 0x0904, 0x91bc, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206,
++	0x1904, 0x91b7, 0x7024, 0xac06, 0x1508, 0x2069, 0x0100, 0x68c0,
++	0xa005, 0x0904, 0x9193, 0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c,
++	0x90e6, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384,
++	0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
++	0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x700c, 0xac36,
++	0x1110, 0x660c, 0x760e, 0x7008, 0xac36, 0x1140, 0x2c00, 0xaf36,
++	0x0118, 0x2f00, 0x700a, 0x0010, 0x700b, 0x0000, 0x660c, 0x0066,
++	0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000,
++	0x080c, 0xae7e, 0x1158, 0x080c, 0x2e6c, 0x080c, 0xae8f, 0x11f0,
++	0x080c, 0x9c09, 0x00d8, 0x080c, 0x90e6, 0x08c0, 0x080c, 0xae8f,
++	0x1118, 0x080c, 0x9c09, 0x0090, 0x6010, 0x2068, 0x080c, 0xac91,
++	0x0168, 0x601c, 0xa086, 0x0003, 0x11f8, 0x6837, 0x0103, 0x6b4a,
++	0x6847, 0x0000, 0x080c, 0x580a, 0x080c, 0xae48, 0x080c, 0xb056,
++	0x080c, 0xae54, 0x080c, 0x8fb7, 0x00ce, 0x0804, 0x9140, 0x2c78,
++	0x600c, 0x2060, 0x0804, 0x9140, 0x012e, 0x000e, 0x006e, 0x00ce,
++	0x00de, 0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x1d30,
++	0x080c, 0xc141, 0x0c18, 0x0036, 0x0156, 0x0136, 0x0146, 0x3908,
++	0xa006, 0xa190, 0x0020, 0x221c, 0xa39e, 0x2c61, 0x1118, 0x8210,
++	0x8000, 0x0cc8, 0xa005, 0x0138, 0x20a9, 0x0020, 0x2198, 0xa110,
++	0x22a0, 0x22c8, 0x53a3, 0x014e, 0x013e, 0x015e, 0x003e, 0x0005,
++	0x00d6, 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0200, 0x20a3,
++	0x0014, 0x60c3, 0x0014, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2099,
++	0xc900, 0x20a9, 0x0004, 0x53a6, 0x20a3, 0x0004, 0x20a3, 0x7878,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x080c, 0x8be2, 0x00de, 0x0005,
++	0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0214, 0x20a3, 0x0018,
++	0x20a3, 0x0800, 0x7810, 0xa084, 0xff00, 0x20a2, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7810, 0xa084,
++	0x00ff, 0x20a2, 0x7828, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x0018, 0x080c, 0x8be2, 0x0005, 0x00d6, 0x0016, 0x2f68,
++	0x2009, 0x0035, 0x080c, 0xb141, 0x1904, 0x929b, 0x20a1, 0x020b,
++	0x080c, 0x83bf, 0x20a3, 0x1300, 0x20a3, 0x0000, 0x7828, 0x2068,
++	0x681c, 0xa086, 0x0003, 0x0580, 0x7818, 0xa080, 0x0028, 0x2014,
++	0x2001, 0xc635, 0x2004, 0xd0ac, 0x11d0, 0xa286, 0x007e, 0x1128,
++	0x20a3, 0x00ff, 0x20a3, 0xfffe, 0x04b8, 0xa286, 0x007f, 0x1128,
++	0x20a3, 0x00ff, 0x20a3, 0xfffd, 0x0478, 0xd2bc, 0x0180, 0xa286,
++	0x0080, 0x1128, 0x20a3, 0x00ff, 0x20a3, 0xfffc, 0x0428, 0xa2e8,
++	0xc77b, 0x2d6c, 0x6810, 0x20a2, 0x6814, 0x20a2, 0x00e8, 0x20a3,
++	0x0000, 0x6098, 0x20a2, 0x00c0, 0x2001, 0xc635, 0x2004, 0xd0ac,
++	0x1138, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007e, 0x0240,
++	0x00d6, 0x2069, 0xc61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0020,
++	0x20a3, 0x0000, 0x6034, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x000c, 0x080c, 0x8be2,
++	0x001e, 0x00de, 0x0005, 0x7817, 0x0001, 0x7803, 0x0006, 0x001e,
++	0x00de, 0x0005, 0x00d6, 0x0026, 0x7928, 0x2168, 0x691c, 0xa186,
++	0x0006, 0x01c0, 0xa186, 0x0003, 0x0904, 0x9311, 0xa186, 0x0005,
++	0x0904, 0x92fa, 0xa186, 0x0004, 0x05b8, 0xa186, 0x0008, 0x0904,
++	0x9302, 0x7807, 0x0037, 0x7813, 0x1700, 0x080c, 0x9379, 0x002e,
++	0x00de, 0x0005, 0x080c, 0x9335, 0x2009, 0x4000, 0x6800, 0x0002,
++	0x92db, 0x92e6, 0x92dd, 0x92e6, 0x92e2, 0x92db, 0x92db, 0x92e6,
++	0x92e6, 0x92e6, 0x92e6, 0x92db, 0x92db, 0x92db, 0x92db, 0x92db,
++	0x92e6, 0x92db, 0x92e6, 0x080c, 0x1519, 0x6820, 0xd0e4, 0x0110,
++	0xd0cc, 0x0110, 0xa00e, 0x0010, 0x2009, 0x2000, 0x6828, 0x20a2,
++	0x682c, 0x20a2, 0x0804, 0x932b, 0x080c, 0x9335, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x2009, 0x4000, 0x6a00, 0xa286, 0x0002, 0x1108,
++	0xa00e, 0x0488, 0x04d1, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009,
++	0x4000, 0x0448, 0x0491, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009,
++	0x4000, 0xa286, 0x0005, 0x0118, 0xa286, 0x0002, 0x1108, 0xa00e,
++	0x00d0, 0x0419, 0x6810, 0x2068, 0x697c, 0x6810, 0xa112, 0x6980,
++	0x6814, 0xa103, 0x20a2, 0x22a2, 0x7928, 0xa180, 0x0000, 0x2004,
++	0xa08e, 0x0002, 0x0130, 0xa08e, 0x0004, 0x0118, 0x2009, 0x4000,
++	0x0010, 0x2009, 0x0000, 0x21a2, 0x20a3, 0x0000, 0x60c3, 0x0018,
++	0x080c, 0x8be2, 0x002e, 0x00de, 0x0005, 0x0036, 0x0046, 0x0056,
++	0x0066, 0x20a1, 0x020b, 0x080c, 0x845b, 0xa006, 0x20a3, 0x0200,
++	0x20a2, 0x7934, 0x21a2, 0x7938, 0x21a2, 0x7818, 0xa080, 0x0028,
++	0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e,
++	0x0268, 0x00d6, 0x2069, 0xc61c, 0x2d2c, 0x8d68, 0x2d34, 0xa0e8,
++	0xc77b, 0x2d6c, 0x6b10, 0x6c14, 0x00de, 0x0030, 0x2019, 0x0000,
++	0x6498, 0x2029, 0x0000, 0x6634, 0x7828, 0xa080, 0x0007, 0x2004,
++	0xa086, 0x0003, 0x1128, 0x25a2, 0x26a2, 0x23a2, 0x24a2, 0x0020,
++	0x23a2, 0x24a2, 0x25a2, 0x26a2, 0x006e, 0x005e, 0x004e, 0x003e,
++	0x0005, 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0100, 0x20a3,
++	0x0000, 0x20a3, 0x0009, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c,
++	0x8be2, 0x0005, 0x20a1, 0x020b, 0x080c, 0x83b7, 0x20a3, 0x1400,
++	0x20a3, 0x0000, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x7828, 0x20a2,
++	0x782c, 0x20a2, 0x7830, 0xa084, 0x00ff, 0x8007, 0x20a2, 0x20a3,
++	0x0000, 0x60c3, 0x0010, 0x080c, 0x8be2, 0x0005, 0x20a1, 0x020b,
++	0x080c, 0x8453, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0x20a2,
++	0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x8be2, 0x0005, 0x0146,
++	0x20a1, 0x020b, 0x0031, 0x60c3, 0x0000, 0x080c, 0x8be2, 0x014e,
++	0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++	0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188,
++	0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x0300, 0x20a2,
++	0x6814, 0x20a2, 0x2069, 0xc61c, 0x2da6, 0x8d68, 0x2da6, 0x00de,
++	0x0078, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x0300,
++	0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x6234, 0x22a2,
++	0x20a3, 0x0819, 0x20a3, 0x0000, 0x080c, 0x8bd1, 0x22a2, 0x20a3,
++	0x0000, 0x2fa2, 0x7a08, 0x22a2, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x0005, 0x20a1, 0x020b, 0x0079, 0x7910, 0x21a2, 0x20a3, 0x0000,
++	0x60c3, 0x0000, 0x20e1, 0x9080, 0x60a7, 0x9575, 0x080c, 0x8bec,
++	0x080c, 0x701b, 0x0005, 0x0156, 0x0136, 0x0036, 0x00d6, 0x00e6,
++	0x20e1, 0x9080, 0x20e1, 0x4000, 0x7854, 0x2068, 0xadf0, 0x000f,
++	0x7210, 0xa296, 0x00c0, 0xa294, 0xfffd, 0x7212, 0x7214, 0xa294,
++	0x0300, 0x7216, 0x7100, 0xa194, 0x00ff, 0x7308, 0xa384, 0x00ff,
++	0xa08d, 0xc200, 0x7102, 0xa384, 0xff00, 0xa215, 0x720a, 0x7004,
++	0x720c, 0x700e, 0x7206, 0x20a9, 0x000a, 0x2e98, 0x53a6, 0x60a3,
++	0x0035, 0x6a38, 0xa294, 0x7000, 0xa286, 0x3000, 0x0110, 0x60a3,
++	0x0037, 0x00ee, 0x00de, 0x003e, 0x013e, 0x015e, 0x0005, 0x2009,
++	0x0092, 0x0010, 0x2009, 0x0096, 0x60ab, 0x0036, 0x6116, 0x0005,
++	0x609b, 0x0000, 0x20a1, 0x020b, 0x20e1, 0x9080, 0x20e1, 0x4000,
++	0x20a3, 0x22ff, 0x20a3, 0xffff, 0x00d6, 0x2069, 0xc61c, 0x2da6,
++	0x8d68, 0x2da6, 0x00de, 0x20a3, 0x0138, 0x20a3, 0x0000, 0x0026,
++	0x080c, 0x8bd1, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff,
++	0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x20a3, 0x5400, 0x20a3,
++	0x0000, 0x080c, 0x768f, 0x11b8, 0x0016, 0x7810, 0xa080, 0x000d,
++	0x20a9, 0x0014, 0x200c, 0x810f, 0x21a2, 0x8000, 0x1f04, 0x948a,
++	0x20a9, 0x0012, 0x2001, 0x0000, 0x20a3, 0x0000, 0x1f04, 0x9494,
++	0x001e, 0x0804, 0x9502, 0x7810, 0x0016, 0x00c6, 0x00d6, 0x7810,
++	0x2068, 0x2061, 0xc600, 0x6070, 0xa084, 0x00ff, 0x6968, 0x810f,
++	0xa18c, 0xff00, 0xa105, 0x20a2, 0x6074, 0x20a2, 0x6968, 0xa18c,
++	0xff00, 0x21a2, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2009, 0xc605,
++	0x2104, 0x20a2, 0x8108, 0x1f04, 0x94b8, 0x20a9, 0x0004, 0x2009,
++	0xc601, 0x2104, 0x20a2, 0x8108, 0x1f04, 0x94c1, 0x20a9, 0x0004,
++	0x2d08, 0xa188, 0x001d, 0x2104, 0x8007, 0x20a2, 0x8108, 0x1f04,
++	0x94cb, 0x20a9, 0x0004, 0x2d08, 0xa188, 0x0021, 0x2104, 0x8007,
++	0x20a2, 0x8108, 0x1f04, 0x94d6, 0x080c, 0x7694, 0x1138, 0x20a9,
++	0x0008, 0x20a3, 0x0000, 0x1f04, 0x94e1, 0x0050, 0x20a9, 0x0008,
++	0x2009, 0xc69a, 0x2104, 0x8007, 0x20a2, 0x8108, 0x1f04, 0x94ea,
++	0x20a9, 0x0008, 0x2d08, 0xa188, 0x0025, 0x2104, 0x8007, 0x20a2,
++	0x8108, 0x1f04, 0x94f5, 0x00de, 0x00ce, 0x001e, 0x20a3, 0x0000,
++	0x20a3, 0x0000, 0x60c3, 0x004c, 0x080c, 0x8be2, 0x0005, 0x20a1,
++	0x020b, 0x080c, 0x83bf, 0x20a3, 0x5500, 0x20a3, 0x0000, 0x7810,
++	0x0016, 0x00c6, 0x00d6, 0x7810, 0x2068, 0x686c, 0xa084, 0x00ff,
++	0x6968, 0x810f, 0xa18c, 0xff00, 0xa105, 0x20a2, 0x696c, 0xa18c,
++	0xff00, 0x6870, 0xa084, 0x00ff, 0xa105, 0x20a2, 0x6968, 0xa18c,
++	0xff00, 0x2061, 0xc600, 0x6070, 0xa084, 0x00ff, 0xa10d, 0x21a2,
++	0x6174, 0x21a2, 0x20a9, 0x0004, 0x2d08, 0xa188, 0x001d, 0x2104,
++	0x8007, 0x20a2, 0x8108, 0x1f04, 0x9537, 0x20a9, 0x0004, 0x2d08,
++	0xa188, 0x0021, 0x2104, 0x8007, 0x20a2, 0x8108, 0x1f04, 0x9542,
++	0x20a9, 0x0004, 0x2009, 0xc605, 0x2104, 0x20a2, 0x8108, 0x1f04,
++	0x954c, 0x20a9, 0x0004, 0x2009, 0xc601, 0x2104, 0x20a2, 0x8108,
++	0x1f04, 0x9555, 0x20a9, 0x0008, 0x2d08, 0xa188, 0x0025, 0x2104,
++	0x8007, 0x20a2, 0x8108, 0x1f04, 0x955f, 0x080c, 0x7694, 0x1138,
++	0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x956a, 0x0050, 0x20a9,
++	0x0008, 0x2009, 0xc69a, 0x2104, 0x8007, 0x20a2, 0x8108, 0x1f04,
++	0x9573, 0x00de, 0x00ce, 0x001e, 0x20a3, 0x0000, 0x20a3, 0x0000,
++	0x60c3, 0x004c, 0x080c, 0x8be2, 0x0005, 0x2061, 0xce00, 0x2a70,
++	0x7068, 0x704a, 0x704f, 0xce00, 0x0005, 0x00e6, 0x0126, 0x2071,
++	0xc600, 0x2091, 0x8000, 0x7548, 0xa582, 0x0010, 0x0608, 0x704c,
++	0x2060, 0x6000, 0xa086, 0x0000, 0x0148, 0xace0, 0x0018, 0x705c,
++	0xac02, 0x1208, 0x0cb0, 0x2061, 0xce00, 0x0c98, 0x6003, 0x0008,
++	0x8529, 0x754a, 0xaca8, 0x0018, 0x705c, 0xa502, 0x1230, 0x754e,
++	0xa085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x704f, 0xce00, 0x0cc0,
++	0xa006, 0x0cc0, 0x00e6, 0x2071, 0xc600, 0x7548, 0xa582, 0x0010,
++	0x0600, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0148, 0xace0,
++	0x0018, 0x705c, 0xac02, 0x1208, 0x0cb0, 0x2061, 0xce00, 0x0c98,
++	0x6003, 0x0008, 0x8529, 0x754a, 0xaca8, 0x0018, 0x705c, 0xa502,
++	0x1228, 0x754e, 0xa085, 0x0001, 0x00ee, 0x0005, 0x704f, 0xce00,
++	0x0cc8, 0xa006, 0x0cc8, 0xac82, 0xce00, 0x0a0c, 0x1519, 0x2001,
++	0xc617, 0x2004, 0xac02, 0x1a0c, 0x1519, 0xa006, 0x6006, 0x600a,
++	0x600e, 0x6012, 0x6016, 0x601a, 0x601f, 0x0000, 0x6003, 0x0000,
++	0x6052, 0x6056, 0x6022, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036,
++	0x603a, 0x603e, 0x6026, 0x2061, 0xc600, 0x6048, 0x8000, 0x604a,
++	0xa086, 0x0001, 0x0108, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c,
++	0x7e94, 0x012e, 0x0cc0, 0x601c, 0xa084, 0x000f, 0x0002, 0x9622,
++	0x9631, 0x964c, 0x9667, 0xb189, 0xb1a4, 0xb1bf, 0x9622, 0x9631,
++	0x7699, 0x9682, 0xa186, 0x0013, 0x1128, 0x080c, 0x7db1, 0x080c,
++	0x7e94, 0x0005, 0xa18e, 0x0047, 0x1118, 0xa016, 0x080c, 0x1870,
++	0x0005, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013,
++	0x006e, 0x0005, 0x964a, 0x9a78, 0x9c43, 0x964a, 0x9cc0, 0x9740,
++	0x964a, 0x964a, 0x9a0a, 0xa126, 0x964a, 0x964a, 0x964a, 0x964a,
++	0x964a, 0x964a, 0x080c, 0x1519, 0x0066, 0x6000, 0xa0b2, 0x0010,
++	0x1a0c, 0x1519, 0x0013, 0x006e, 0x0005, 0x9665, 0xa759, 0x9665,
++	0x9665, 0x9665, 0x9665, 0x9665, 0x9665, 0xa704, 0xa8c5, 0x9665,
++	0xa786, 0xa7fd, 0xa786, 0xa7fd, 0x9665, 0x080c, 0x1519, 0x0066,
++	0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013, 0x006e, 0x0005,
++	0x9680, 0xa167, 0xa231, 0xa36c, 0xa4c8, 0x9680, 0x9680, 0x9680,
++	0xa141, 0xa6b4, 0xa6b7, 0x9680, 0x9680, 0x9680, 0x9680, 0xa6e1,
++	0x080c, 0x1519, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519,
++	0x0013, 0x006e, 0x0005, 0x969b, 0x969b, 0x969b, 0x96c9, 0x9716,
++	0x969b, 0x969b, 0x969b, 0x969d, 0x969b, 0x969b, 0x969b, 0x969b,
++	0x969b, 0x969b, 0x969b, 0x080c, 0x1519, 0xa186, 0x0003, 0x190c,
++	0x1519, 0x00d6, 0x6003, 0x0003, 0x6106, 0x6010, 0x2068, 0x684f,
++	0x0040, 0x687c, 0x680a, 0x6880, 0x680e, 0x6813, 0x0000, 0x6817,
++	0x0000, 0x6854, 0xa092, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003,
++	0x8013, 0x8213, 0xa210, 0x6216, 0x00de, 0x2c10, 0x080c, 0x2068,
++	0x080c, 0x79fc, 0x0126, 0x2091, 0x8000, 0x080c, 0x7f6e, 0x012e,
++	0x0005, 0xa182, 0x0047, 0x0002, 0x96d5, 0x96d5, 0x96d7, 0x96f0,
++	0x96d5, 0x96d5, 0x96d5, 0x96d5, 0x9702, 0x080c, 0x1519, 0x00d6,
++	0x0016, 0x080c, 0x7e47, 0x080c, 0x7f6e, 0x6003, 0x0004, 0x6110,
++	0x2168, 0x684f, 0x0020, 0x685c, 0x685a, 0x6874, 0x687e, 0x6878,
++	0x6882, 0x6897, 0x0000, 0x689b, 0x0000, 0x001e, 0x00de, 0x0005,
++	0x080c, 0x7e47, 0x00d6, 0x6110, 0x2168, 0x080c, 0xac91, 0x0120,
++	0x684b, 0x0006, 0x080c, 0x580a, 0x00de, 0x080c, 0x95e3, 0x080c,
++	0x7f6e, 0x0005, 0x080c, 0x7e47, 0x080c, 0x2e46, 0x00d6, 0x6110,
++	0x2168, 0x080c, 0xac91, 0x0120, 0x684b, 0x0029, 0x080c, 0x580a,
++	0x00de, 0x080c, 0x95e3, 0x080c, 0x7f6e, 0x0005, 0xa182, 0x0047,
++	0x0002, 0x9724, 0x9733, 0x9722, 0x9722, 0x9722, 0x9722, 0x9722,
++	0x9722, 0x9722, 0x080c, 0x1519, 0x00d6, 0x6010, 0x2068, 0x684c,
++	0xc0f4, 0x684e, 0x00de, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10,
++	0x080c, 0x1870, 0x0005, 0x00d6, 0x6110, 0x2168, 0x684b, 0x0000,
++	0x6853, 0x0000, 0x080c, 0x580a, 0x00de, 0x080c, 0x95e3, 0x0005,
++	0xa1b6, 0x0015, 0x1118, 0x080c, 0x95e3, 0x0030, 0xa1b6, 0x0016,
++	0x190c, 0x1519, 0x080c, 0x95e3, 0x0005, 0x20a9, 0x000e, 0x2e98,
++	0x6010, 0x20a0, 0x53a3, 0x20a9, 0x0006, 0x3310, 0x3420, 0x9398,
++	0x94a0, 0x3318, 0x3428, 0x222e, 0x2326, 0xa290, 0x0002, 0xa5a8,
++	0x0002, 0xa398, 0x0002, 0xa4a0, 0x0002, 0x1f04, 0x975b, 0x00e6,
++	0x080c, 0xac91, 0x0130, 0x6010, 0x2070, 0x7007, 0x0000, 0x7037,
++	0x0103, 0x00ee, 0x080c, 0x95e3, 0x0005, 0x00d6, 0x0036, 0x7330,
++	0xa386, 0x0200, 0x1130, 0x6018, 0x2068, 0x6813, 0x00ff, 0x6817,
++	0xfffd, 0x6010, 0xa005, 0x0130, 0x2068, 0x6807, 0x0000, 0x6837,
++	0x0103, 0x6b32, 0x080c, 0x95e3, 0x003e, 0x00de, 0x0005, 0x0016,
++	0x20a9, 0x002a, 0xae80, 0x000c, 0x2098, 0x6010, 0xa080, 0x0002,
++	0x20a0, 0x53a3, 0x20a9, 0x002a, 0x6010, 0xa080, 0x0001, 0x2004,
++	0xa080, 0x0002, 0x20a0, 0x53a3, 0x00e6, 0x6010, 0x2004, 0x2070,
++	0x7037, 0x0103, 0x00ee, 0x080c, 0x95e3, 0x001e, 0x0005, 0x0016,
++	0x2009, 0x0000, 0x7030, 0xa086, 0x0100, 0x0140, 0x7038, 0xa084,
++	0x00ff, 0x800c, 0x703c, 0xa084, 0x00ff, 0x8004, 0xa080, 0x0004,
++	0xa108, 0x21a8, 0xae80, 0x000c, 0x2098, 0x6010, 0xa080, 0x0002,
++	0x20a0, 0x080c, 0x4ecb, 0x00e6, 0x080c, 0xac91, 0x0140, 0x6010,
++	0x2070, 0x7007, 0x0000, 0x7034, 0x70b2, 0x7037, 0x0103, 0x00ee,
++	0x080c, 0x95e3, 0x001e, 0x0005, 0x0016, 0x2009, 0x0000, 0x7030,
++	0xa086, 0x0200, 0x0110, 0x2009, 0x0001, 0x00d6, 0x6010, 0xa06d,
++	0x090c, 0x1519, 0x694a, 0x080c, 0x580a, 0x00de, 0x080c, 0x95e3,
++	0x001e, 0x0005, 0x00e6, 0x00d6, 0x603f, 0x0000, 0x2c68, 0x0016,
++	0x2009, 0x0035, 0x080c, 0xb141, 0x001e, 0x1168, 0x0026, 0x6228,
++	0x2268, 0x002e, 0x2071, 0xcc8c, 0x6b1c, 0xa386, 0x0003, 0x0130,
++	0xa386, 0x0006, 0x0128, 0x080c, 0x95e3, 0x0020, 0x0031, 0x0010,
++	0x080c, 0x98d3, 0x00de, 0x00ee, 0x0005, 0x00f6, 0x6810, 0x2078,
++	0xa186, 0x0015, 0x0904, 0x98ba, 0xa18e, 0x0016, 0x1904, 0x98d1,
++	0x700c, 0xa08c, 0xff00, 0xa186, 0x1700, 0x0120, 0xa186, 0x0300,
++	0x1904, 0x9899, 0x8fff, 0x1138, 0x6800, 0xa086, 0x000f, 0x0904,
++	0x987d, 0x0804, 0x98cf, 0x6808, 0xa086, 0xffff, 0x1904, 0x98bc,
++	0x784c, 0xa084, 0x0060, 0xa086, 0x0020, 0x1150, 0x797c, 0x7810,
++	0xa106, 0x1904, 0x98bc, 0x7980, 0x7814, 0xa106, 0x1904, 0x98bc,
++	0x080c, 0xae48, 0x6858, 0x7852, 0x784c, 0xc0dc, 0xc0f4, 0xc0d4,
++	0x784e, 0x0026, 0xa00e, 0x6a14, 0x2001, 0x000a, 0x080c, 0x783f,
++	0x7854, 0xa20a, 0x0208, 0x8011, 0x7a56, 0x82ff, 0x002e, 0x1138,
++	0x00c6, 0x2d60, 0x080c, 0xaa40, 0x00ce, 0x0804, 0x98cf, 0x00c6,
++	0x00d6, 0x2f68, 0x6838, 0xd0fc, 0x1118, 0x080c, 0x4fa6, 0x0010,
++	0x080c, 0x51dd, 0x00de, 0x00ce, 0x1904, 0x98bc, 0x00c6, 0x2d60,
++	0x080c, 0x95e3, 0x00ce, 0x0804, 0x98cf, 0x00c6, 0x080c, 0xaf0d,
++	0x0190, 0x6013, 0x0000, 0x6818, 0x601a, 0x080c, 0xb05e, 0x601f,
++	0x0003, 0x6904, 0x00c6, 0x2d60, 0x080c, 0x95e3, 0x00ce, 0x080c,
++	0x9613, 0x00ce, 0x04e0, 0x2001, 0xc8ff, 0x2004, 0x683e, 0x00ce,
++	0x04b0, 0x7008, 0xa086, 0x000b, 0x11a0, 0x6018, 0x200c, 0xc1bc,
++	0x2102, 0x00c6, 0x2d60, 0x7853, 0x0003, 0x6007, 0x0085, 0x6003,
++	0x000b, 0x601f, 0x0002, 0x080c, 0x7999, 0x080c, 0x7e94, 0x00ce,
++	0x00f0, 0x700c, 0xa086, 0x2a00, 0x1138, 0x2001, 0xc8ff, 0x2004,
++	0x683e, 0x00a8, 0x0481, 0x00a8, 0x8fff, 0x090c, 0x1519, 0x00c6,
++	0x00d6, 0x2d60, 0x2f68, 0x6837, 0x0103, 0x684b, 0x0003, 0x080c,
++	0xa934, 0x080c, 0xae48, 0x080c, 0xae54, 0x00de, 0x00ce, 0x080c,
++	0x95e3, 0x00fe, 0x0005, 0xa186, 0x0015, 0x1128, 0x2001, 0xc8ff,
++	0x2004, 0x683e, 0x0068, 0xa18e, 0x0016, 0x1160, 0x00c6, 0x2d00,
++	0x2060, 0x080c, 0xc3e2, 0x080c, 0x7103, 0x080c, 0x95e3, 0x00ce,
++	0x080c, 0x95e3, 0x0005, 0x0026, 0x0036, 0x0046, 0x7228, 0x7c80,
++	0x7b7c, 0xd2f4, 0x0130, 0x2001, 0xc8ff, 0x2004, 0x683e, 0x0804,
++	0x994d, 0x00c6, 0x2d60, 0x080c, 0xa954, 0x00ce, 0x6804, 0xa086,
++	0x0050, 0x1168, 0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007,
++	0x0050, 0x080c, 0x7999, 0x080c, 0x7e94, 0x00ce, 0x04f0, 0x6800,
++	0xa086, 0x000f, 0x01c8, 0x8fff, 0x090c, 0x1519, 0x6820, 0xd0dc,
++	0x1198, 0x6800, 0xa086, 0x0004, 0x1198, 0x784c, 0xd0ac, 0x0180,
++	0x784c, 0xc0dc, 0xc0f4, 0x784e, 0x7850, 0xc0f4, 0xc0fc, 0x7852,
++	0x2001, 0x0001, 0x682e, 0x00e0, 0x2001, 0x0007, 0x682e, 0x00c0,
++	0x784c, 0xd0b4, 0x1130, 0xd0ac, 0x0db8, 0x784c, 0xd0f4, 0x1da0,
++	0x0c38, 0xd2ec, 0x1d88, 0x7024, 0xa306, 0x1118, 0x7020, 0xa406,
++	0x0d58, 0x7020, 0x6836, 0x7024, 0x683a, 0x2001, 0x0005, 0x682e,
++	0x080c, 0xaf9a, 0x080c, 0x7e94, 0x0010, 0x080c, 0x95e3, 0x004e,
++	0x003e, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x0026, 0x6034, 0x2068,
++	0x6a1c, 0xa286, 0x0007, 0x0904, 0x99b1, 0xa286, 0x0002, 0x0904,
++	0x99b1, 0xa286, 0x0000, 0x0904, 0x99b1, 0x6808, 0x6338, 0xa306,
++	0x1904, 0x99b1, 0x2071, 0xcc8c, 0xa186, 0x0015, 0x05e0, 0xa18e,
++	0x0016, 0x1190, 0x6030, 0xa084, 0x00ff, 0xa086, 0x0001, 0x1160,
++	0x700c, 0xa086, 0x2a00, 0x1140, 0x6034, 0xa080, 0x0008, 0x200c,
++	0xc1dd, 0xc1f5, 0x2102, 0x0438, 0x00c6, 0x6034, 0x2060, 0x6104,
++	0xa186, 0x004b, 0x01a0, 0xa186, 0x004c, 0x0188, 0xa186, 0x004d,
++	0x0170, 0xa186, 0x004e, 0x0158, 0xa186, 0x0052, 0x0140, 0x6010,
++	0x2068, 0x080c, 0xac91, 0x090c, 0x1519, 0x6853, 0x0003, 0x6007,
++	0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x7999, 0x080c,
++	0x7e94, 0x00ce, 0x0030, 0x6034, 0x2070, 0x2001, 0xc8ff, 0x2004,
++	0x703e, 0x080c, 0x95e3, 0x002e, 0x00de, 0x00ee, 0x0005, 0x00d6,
++	0x20a9, 0x000e, 0x2e98, 0x6010, 0x20a0, 0x53a3, 0xa1b6, 0x0015,
++	0x1558, 0x6018, 0x2068, 0x0156, 0x0036, 0x0026, 0xae90, 0x000c,
++	0xa290, 0x0004, 0x20a9, 0x0004, 0xad98, 0x000a, 0x080c, 0xa103,
++	0x002e, 0x003e, 0x015e, 0x11d8, 0x0156, 0x0036, 0x0026, 0xae90,
++	0x000c, 0xa290, 0x0008, 0x20a9, 0x0004, 0xad98, 0x0006, 0x080c,
++	0xa103, 0x002e, 0x003e, 0x015e, 0x1150, 0x7038, 0x680a, 0x703c,
++	0x680e, 0x6800, 0xc08d, 0x6802, 0x00de, 0x0804, 0x9767, 0x080c,
++	0x2e46, 0x00c6, 0x080c, 0x958d, 0x2f00, 0x601a, 0x6013, 0x0000,
++	0x601f, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007,
++	0x080c, 0x5291, 0x080c, 0x52be, 0x080c, 0x79df, 0x080c, 0x7e94,
++	0x00ce, 0x0c10, 0x2100, 0xa1b2, 0x0080, 0x1a0c, 0x1519, 0xa1b2,
++	0x0040, 0x1a04, 0x9a6e, 0x0002, 0x9a62, 0x9a56, 0x9a62, 0x9a62,
++	0x9a62, 0x9a62, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54,
++	0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54,
++	0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54,
++	0x9a54, 0x9a54, 0x9a54, 0x9a62, 0x9a54, 0x9a62, 0x9a62, 0x9a54,
++	0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a62, 0x9a54, 0x9a54, 0x9a54,
++	0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a62, 0x9a62,
++	0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54,
++	0x9a54, 0x9a62, 0x9a54, 0x9a54, 0x080c, 0x1519, 0x6003, 0x0001,
++	0x6106, 0x080c, 0x79df, 0x0126, 0x2091, 0x8000, 0x080c, 0x7e94,
++	0x012e, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x79df, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x7e94, 0x012e, 0x0005, 0x2600, 0x0002,
++	0x9a62, 0x9a62, 0x9a76, 0x9a62, 0x9a62, 0x9a76, 0x080c, 0x1519,
++	0x6004, 0xa0b2, 0x0080, 0x1a0c, 0x1519, 0xa1b6, 0x0013, 0x0904,
++	0x9b28, 0xa1b6, 0x0027, 0x1904, 0x9aee, 0x080c, 0x7db1, 0x6004,
++	0x080c, 0xae7e, 0x0190, 0x080c, 0xae8f, 0x0904, 0x9ae8, 0xa08e,
++	0x0021, 0x0904, 0x9aeb, 0xa08e, 0x0022, 0x0904, 0x9ae8, 0xa08e,
++	0x003d, 0x0904, 0x9aeb, 0x0804, 0x9ae1, 0x080c, 0x2e6c, 0x2001,
++	0x0007, 0x080c, 0x5291, 0x6018, 0xa080, 0x0028, 0x200c, 0x080c,
++	0x9c09, 0xa186, 0x007e, 0x1148, 0x2001, 0xc635, 0x2014, 0xc285,
++	0x080c, 0x5f22, 0x1108, 0xc2ad, 0x2202, 0x0016, 0x0026, 0x0036,
++	0x2110, 0x0026, 0x2019, 0x0028, 0x080c, 0x9132, 0x002e, 0x080c,
++	0xc4e4, 0x003e, 0x002e, 0x001e, 0x0016, 0x0026, 0x0036, 0x2110,
++	0x2019, 0x0028, 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c,
++	0x7a0e, 0x00c6, 0x6018, 0xa065, 0x0110, 0x080c, 0x553e, 0x00ce,
++	0x2c08, 0x080c, 0xbef7, 0x007e, 0x003e, 0x002e, 0x001e, 0x080c,
++	0x5300, 0x080c, 0xb056, 0x080c, 0x95e3, 0x080c, 0x7e94, 0x0005,
++	0x080c, 0x9c09, 0x0cb0, 0x080c, 0x9c37, 0x0c98, 0xa186, 0x0014,
++	0x1db0, 0x080c, 0x7db1, 0x080c, 0x2e46, 0x080c, 0xae7e, 0x1188,
++	0x080c, 0x2e6c, 0x6018, 0xa080, 0x0028, 0x200c, 0x080c, 0x9c09,
++	0xa186, 0x007e, 0x1128, 0x2001, 0xc635, 0x200c, 0xc185, 0x2102,
++	0x08c0, 0x080c, 0xae8f, 0x1118, 0x080c, 0x9c09, 0x0890, 0x6004,
++	0xa08e, 0x0032, 0x1158, 0x00e6, 0x00f6, 0x2071, 0xc6a2, 0x2079,
++	0x0000, 0x080c, 0x3179, 0x00fe, 0x00ee, 0x0818, 0x6004, 0xa08e,
++	0x0021, 0x0d50, 0xa08e, 0x0022, 0x090c, 0x9c09, 0x0804, 0x9ae1,
++	0xa0b2, 0x0040, 0x1a04, 0x9beb, 0x2008, 0x0002, 0x9b70, 0x9b71,
++	0x9b74, 0x9b77, 0x9b7a, 0x9b7d, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e,
++	0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e,
++	0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e,
++	0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b80, 0x9b8f, 0x9b6e, 0x9b91,
++	0x9b8f, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b8f, 0x9b8f,
++	0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e,
++	0x9bcb, 0x9b8f, 0x9b6e, 0x9b8b, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b8c,
++	0x9b6e, 0x9b6e, 0x9b6e, 0x9b8f, 0x9bc2, 0x9b6e, 0x080c, 0x1519,
++	0x00f0, 0x2001, 0x000b, 0x0460, 0x2001, 0x0003, 0x0448, 0x2001,
++	0x0005, 0x0430, 0x2001, 0x0001, 0x0418, 0x2001, 0x0009, 0x0400,
++	0x080c, 0x7db1, 0x6003, 0x0005, 0x2001, 0xc8ff, 0x2004, 0x603e,
++	0x080c, 0x7e94, 0x00a0, 0x0018, 0x0010, 0x080c, 0x5291, 0x0804,
++	0x9bdc, 0x080c, 0x7db1, 0x2001, 0xc8fd, 0x2004, 0x6016, 0x2001,
++	0xc8ff, 0x2004, 0x603e, 0x6003, 0x0004, 0x080c, 0x7e94, 0x0005,
++	0x080c, 0x5291, 0x080c, 0x7db1, 0x6003, 0x0002, 0x2001, 0xc8ff,
++	0x2004, 0x603e, 0x0036, 0x2019, 0xc65d, 0x2304, 0xa084, 0xff00,
++	0x1120, 0x2001, 0xc8fd, 0x201c, 0x0040, 0x8007, 0xa09a, 0x0004,
++	0x0ec0, 0x8003, 0x801b, 0x831b, 0xa318, 0x6316, 0x003e, 0x080c,
++	0x7e94, 0x08e8, 0x080c, 0x7db1, 0x080c, 0xb056, 0x080c, 0x95e3,
++	0x080c, 0x7e94, 0x08a0, 0x00e6, 0x00f6, 0x2071, 0xc6a2, 0x2079,
++	0x0000, 0x080c, 0x3179, 0x00fe, 0x00ee, 0x080c, 0x7db1, 0x080c,
++	0x95e3, 0x080c, 0x7e94, 0x0818, 0x080c, 0x7db1, 0x2001, 0xc8ff,
++	0x2004, 0x603e, 0x6003, 0x0002, 0x2001, 0xc8fd, 0x2004, 0x6016,
++	0x080c, 0x7e94, 0x0005, 0x2600, 0x2008, 0x0002, 0x9bf6, 0x9bdc,
++	0x9bf4, 0x9bdc, 0x9bdc, 0x9bf4, 0x080c, 0x1519, 0x080c, 0x7db1,
++	0x00d6, 0x6010, 0x2068, 0x080c, 0x768f, 0x1118, 0x080c, 0x1619,
++	0x0010, 0x080c, 0x580a, 0x00de, 0x080c, 0x95e3, 0x080c, 0x7e94,
++	0x0005, 0x00e6, 0x0026, 0x0016, 0x080c, 0xac91, 0x0508, 0x6010,
++	0x2070, 0x7034, 0xa086, 0x0139, 0x1148, 0x2001, 0x0030, 0x2009,
++	0x0000, 0x2011, 0x4005, 0x080c, 0xb10d, 0x0090, 0x7038, 0xd0fc,
++	0x0178, 0x7007, 0x0000, 0x0016, 0x6004, 0xa08e, 0x0021, 0x0160,
++	0xa08e, 0x003d, 0x0148, 0x001e, 0x7037, 0x0103, 0x7033, 0x0100,
++	0x001e, 0x002e, 0x00ee, 0x0005, 0x001e, 0x0009, 0x0cc8, 0x00e6,
++	0xacf0, 0x0004, 0x2e74, 0x7000, 0x2070, 0x7037, 0x0103, 0x7023,
++	0x8001, 0x00ee, 0x0005, 0x00d6, 0x6618, 0x2668, 0x6804, 0xa084,
++	0x00ff, 0x00de, 0xa0b2, 0x000c, 0x1a0c, 0x1519, 0x6604, 0xa6b6,
++	0x0043, 0x1120, 0x080c, 0xb0c9, 0x0804, 0x9cb0, 0x6604, 0xa6b6,
++	0x0033, 0x1120, 0x080c, 0xb079, 0x0804, 0x9cb0, 0x6604, 0xa6b6,
++	0x0028, 0x1120, 0x080c, 0xaebf, 0x0804, 0x9cb0, 0x6604, 0xa6b6,
++	0x0029, 0x1120, 0x080c, 0xaed6, 0x0804, 0x9cb0, 0x6604, 0xa6b6,
++	0x001f, 0x1118, 0x080c, 0x974d, 0x04d8, 0x6604, 0xa6b6, 0x0000,
++	0x1118, 0x080c, 0x99b7, 0x04a0, 0x6604, 0xa6b6, 0x0022, 0x1118,
++	0x080c, 0x9775, 0x0468, 0x6604, 0xa6b6, 0x0035, 0x1118, 0x080c,
++	0x97f2, 0x0430, 0x6604, 0xa6b6, 0x0039, 0x1118, 0x080c, 0x9953,
++	0x00f8, 0x6604, 0xa6b6, 0x003d, 0x1118, 0x080c, 0x978f, 0x00c0,
++	0x6604, 0xa6b6, 0x0044, 0x1118, 0x080c, 0x97af, 0x0088, 0x6604,
++	0xa6b6, 0x0041, 0x1118, 0x080c, 0x97dc, 0x0050, 0xa1b6, 0x0015,
++	0x1110, 0x0053, 0x0028, 0xa1b6, 0x0016, 0x1118, 0x0804, 0x9e93,
++	0x0005, 0x080c, 0x962a, 0x0ce0, 0x9cda, 0x9cdd, 0x9cda, 0x9d21,
++	0x9cda, 0x9e1a, 0x9ea1, 0x9cda, 0x9cda, 0x9e6b, 0x9cda, 0x9e81,
++	0xa1b6, 0x0048, 0x0140, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10,
++	0x080c, 0x1870, 0x0005, 0x00e6, 0xacf0, 0x0004, 0x2e74, 0x7000,
++	0x2070, 0x7037, 0x0103, 0x00ee, 0x080c, 0x95e3, 0x0005, 0x080c,
++	0x95e3, 0x0005, 0xe000, 0xe000, 0x0005, 0x00e6, 0x2071, 0xc600,
++	0x7084, 0xa086, 0x0074, 0x1530, 0x080c, 0xbece, 0x11b0, 0x00d6,
++	0x6018, 0x2068, 0x7030, 0xd08c, 0x0128, 0x6800, 0xd0bc, 0x0110,
++	0xc0c5, 0x6802, 0x00e9, 0x00de, 0x2001, 0x0006, 0x080c, 0x5291,
++	0x080c, 0x2e6c, 0x080c, 0x95e3, 0x0088, 0x2001, 0x000a, 0x080c,
++	0x5291, 0x080c, 0x2e6c, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c,
++	0x79df, 0x0020, 0x2001, 0x0001, 0x080c, 0x9df5, 0x00ee, 0x0005,
++	0x6800, 0xd084, 0x0168, 0x2001, 0x0000, 0x080c, 0x527f, 0x2069,
++	0xc652, 0x6804, 0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c, 0x52be,
++	0x0005, 0x00d6, 0x2011, 0xc621, 0x2204, 0xa086, 0x0074, 0x1904,
++	0x9df0, 0x6018, 0x2068, 0x6aa0, 0xa286, 0x007e, 0x1120, 0x080c,
++	0x9fc3, 0x0804, 0x9d8f, 0x080c, 0x9fb9, 0x6018, 0x2068, 0xa080,
++	0x0028, 0x2014, 0xa286, 0x0080, 0x11c0, 0x6813, 0x00ff, 0x6817,
++	0xfffc, 0x6010, 0xa005, 0x0138, 0x2068, 0x6807, 0x0000, 0x6837,
++	0x0103, 0x6833, 0x0200, 0x2001, 0x0006, 0x080c, 0x5291, 0x080c,
++	0x2e6c, 0x080c, 0x95e3, 0x0804, 0x9df3, 0x00e6, 0x2071, 0xc635,
++	0x2e04, 0xd09c, 0x0188, 0x2071, 0xcc80, 0x7108, 0x720c, 0xa18c,
++	0x00ff, 0x1118, 0xa284, 0xff00, 0x0138, 0x6018, 0x2070, 0x70a0,
++	0xd0bc, 0x1110, 0x7112, 0x7216, 0x00ee, 0x6010, 0xa005, 0x0198,
++	0x2068, 0x6838, 0xd0f4, 0x0178, 0x6834, 0xa084, 0x00ff, 0xa086,
++	0x0039, 0x1958, 0x2001, 0x0000, 0x2009, 0x0000, 0x2011, 0x4000,
++	0x080c, 0xb10d, 0x0840, 0x2001, 0x0004, 0x080c, 0x5291, 0x6003,
++	0x0001, 0x6007, 0x0003, 0x080c, 0x79df, 0x0804, 0x9df3, 0x685c,
++	0xd0e4, 0x01d8, 0x080c, 0xb009, 0x080c, 0x5f22, 0x0118, 0xd0dc,
++	0x1904, 0x9d4b, 0x2011, 0xc635, 0x2204, 0xc0ad, 0x2012, 0x2001,
++	0xc8d6, 0x2004, 0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c,
++	0x2a1c, 0x78e2, 0x00fe, 0x0804, 0x9d4b, 0x080c, 0xb03f, 0x2011,
++	0xc635, 0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c, 0xc023, 0x000e,
++	0x1904, 0x9d4b, 0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, 0x5291,
++	0x2001, 0x0000, 0x080c, 0x527f, 0x00c6, 0x2009, 0x00ef, 0x00f6,
++	0x2079, 0x0100, 0x79ea, 0x7932, 0x7936, 0x00fe, 0x080c, 0x29f1,
++	0x00f6, 0x2079, 0xc600, 0x7976, 0x2100, 0x2009, 0x0000, 0x080c,
++	0x29c7, 0x7952, 0x00fe, 0x8108, 0x080c, 0x52e1, 0x2c00, 0x00ce,
++	0x1904, 0x9d4b, 0x601a, 0x2001, 0x0002, 0x080c, 0x5291, 0x601f,
++	0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x79df, 0x0018,
++	0x2001, 0x0001, 0x0011, 0x00de, 0x0005, 0x0066, 0x2030, 0xa005,
++	0x0170, 0x2001, 0x0007, 0x080c, 0x5291, 0x2001, 0xc600, 0x2004,
++	0xa086, 0x0003, 0x1120, 0x2001, 0x0007, 0x080c, 0x52be, 0x2600,
++	0xa005, 0x1150, 0x6010, 0xa080, 0x000e, 0x2004, 0xd0fc, 0x1120,
++	0x2011, 0x8014, 0x080c, 0x407d, 0x080c, 0x2e6c, 0x080c, 0x95e3,
++	0x006e, 0x0005, 0x00e6, 0x0026, 0x0016, 0x2071, 0xc600, 0x7084,
++	0xa086, 0x0014, 0x15f0, 0x7000, 0xa086, 0x0003, 0x1128, 0x6010,
++	0xa005, 0x1110, 0x080c, 0x40ef, 0x00d6, 0x6018, 0x2068, 0x080c,
++	0x53df, 0x080c, 0x9d10, 0x00de, 0x080c, 0xa072, 0x1550, 0x00d6,
++	0x6018, 0x2068, 0x6890, 0x00de, 0xa005, 0x0518, 0x2001, 0x0006,
++	0x080c, 0x5291, 0x00e6, 0x6010, 0xa075, 0x01a8, 0x7034, 0xa084,
++	0x00ff, 0xa086, 0x0039, 0x1148, 0x2001, 0x0000, 0x2009, 0x0000,
++	0x2011, 0x4000, 0x080c, 0xb10d, 0x0030, 0x7007, 0x0000, 0x7037,
++	0x0103, 0x7033, 0x0200, 0x00ee, 0x080c, 0x2e6c, 0x080c, 0x95e3,
++	0x0030, 0x080c, 0x9c09, 0x2001, 0x0000, 0x080c, 0x9df5, 0x001e,
++	0x002e, 0x00ee, 0x0005, 0x2011, 0xc621, 0x2204, 0xa086, 0x0014,
++	0x1158, 0x2001, 0x0002, 0x080c, 0x5291, 0x6003, 0x0001, 0x6007,
++	0x0001, 0x080c, 0x79df, 0x0020, 0x2001, 0x0001, 0x080c, 0x9df5,
++	0x0005, 0x2011, 0xc621, 0x2204, 0xa086, 0x0004, 0x1138, 0x2001,
++	0x0007, 0x080c, 0x5291, 0x080c, 0x95e3, 0x0020, 0x2001, 0x0001,
++	0x080c, 0x9df5, 0x0005, 0x000b, 0x0005, 0x9cda, 0x9eac, 0x9cda,
++	0x9ee2, 0x9cda, 0x9f6f, 0x9ea1, 0x9cd7, 0x9cda, 0x9f84, 0x9cda,
++	0x9f96, 0x6604, 0xa686, 0x0003, 0x0904, 0x9e1a, 0xa6b6, 0x001e,
++	0x1110, 0x080c, 0x95e3, 0x0005, 0x00d6, 0x00c6, 0x080c, 0x9fa8,
++	0x1178, 0x2001, 0x0000, 0x080c, 0x527f, 0x2001, 0x0002, 0x080c,
++	0x5291, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x79df, 0x00f8,
++	0x2009, 0xcc8e, 0x2104, 0xa086, 0x0009, 0x1160, 0x6018, 0x2068,
++	0x6840, 0xa084, 0x00ff, 0xa005, 0x0170, 0x8001, 0x6842, 0x6017,
++	0x000a, 0x0068, 0x2009, 0xcc8f, 0x2104, 0xa084, 0xff00, 0xa086,
++	0x1900, 0x1108, 0x08d0, 0x2001, 0x0001, 0x080c, 0x9df5, 0x00ce,
++	0x00de, 0x0005, 0x0026, 0x2011, 0x0000, 0x080c, 0x9fb6, 0x00d6,
++	0x2069, 0xc8e5, 0x2d04, 0xa005, 0x0168, 0x6018, 0x2068, 0x68a0,
++	0xa086, 0x007e, 0x1138, 0x2069, 0xc61d, 0x2d04, 0x8000, 0x206a,
++	0x00de, 0x0010, 0x00de, 0x0078, 0x2001, 0x0000, 0x080c, 0x527f,
++	0x2001, 0x0002, 0x080c, 0x5291, 0x6003, 0x0001, 0x6007, 0x0002,
++	0x080c, 0x79df, 0x0490, 0x00d6, 0x6010, 0x2068, 0x080c, 0xac91,
++	0x00de, 0x0108, 0x6a34, 0x080c, 0x9c09, 0x2009, 0xcc8e, 0x2134,
++	0xa6b4, 0x00ff, 0xa686, 0x0005, 0x0510, 0xa686, 0x000b, 0x01c8,
++	0x2009, 0xcc8f, 0x2104, 0xa084, 0xff00, 0x1118, 0xa686, 0x0009,
++	0x01b0, 0xa086, 0x1900, 0x1168, 0xa686, 0x0009, 0x0180, 0x2001,
++	0x0004, 0x080c, 0x5291, 0x2001, 0x0028, 0x6016, 0x6007, 0x004b,
++	0x0020, 0x2001, 0x0001, 0x080c, 0x9df5, 0x002e, 0x0005, 0x00d6,
++	0xa286, 0x0139, 0x0160, 0x6010, 0x2068, 0x080c, 0xac91, 0x0148,
++	0x6834, 0xa086, 0x0139, 0x0118, 0x6838, 0xd0fc, 0x0110, 0x00de,
++	0x0c40, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0140,
++	0x8001, 0x6842, 0x6017, 0x000a, 0x6007, 0x0016, 0x00de, 0x08e8,
++	0x68a0, 0xa086, 0x007e, 0x1138, 0x00e6, 0x2071, 0xc600, 0x080c,
++	0x4f02, 0x00ee, 0x0010, 0x080c, 0x2e46, 0x00de, 0x0850, 0x080c,
++	0x9fb6, 0x1158, 0x2001, 0x0004, 0x080c, 0x5291, 0x6003, 0x0001,
++	0x6007, 0x0003, 0x080c, 0x79df, 0x0030, 0x080c, 0x9c09, 0x2001,
++	0x0000, 0x080c, 0x9df5, 0x0005, 0x0489, 0x1158, 0x2001, 0x0008,
++	0x080c, 0x5291, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, 0x79df,
++	0x0020, 0x2001, 0x0001, 0x080c, 0x9df5, 0x0005, 0x00f9, 0x1158,
++	0x2001, 0x000a, 0x080c, 0x5291, 0x6003, 0x0001, 0x6007, 0x0001,
++	0x080c, 0x79df, 0x0020, 0x2001, 0x0001, 0x080c, 0x9df5, 0x0005,
++	0x2009, 0xcc8e, 0x2104, 0xa086, 0x0003, 0x1138, 0x2009, 0xcc8f,
++	0x2104, 0xa084, 0xff00, 0xa086, 0x2a00, 0x0005, 0xa085, 0x0001,
++	0x0005, 0x00c6, 0x0016, 0xac88, 0x0006, 0x2164, 0x080c, 0x534c,
++	0x001e, 0x00ce, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016,
++	0x6018, 0x2068, 0x2071, 0xc635, 0x2e04, 0xa085, 0x0003, 0x2072,
++	0x080c, 0xa047, 0x0560, 0x2009, 0xc635, 0x2104, 0xc0cd, 0x200a,
++	0x2001, 0xc653, 0x2004, 0xd0a4, 0x0158, 0xa006, 0x2020, 0x2009,
++	0x002a, 0x080c, 0xc190, 0x2001, 0xc60c, 0x200c, 0xc195, 0x2102,
++	0x2019, 0x002a, 0x2009, 0x0001, 0x080c, 0x2e19, 0x2071, 0xc600,
++	0x080c, 0x2c62, 0x00c6, 0x0156, 0x20a9, 0x0081, 0x2009, 0x007f,
++	0x080c, 0x2f41, 0x8108, 0x1f04, 0x9ff8, 0x015e, 0x00ce, 0x080c,
++	0x9fb9, 0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071, 0xcc80, 0x2079,
++	0x0100, 0x2e04, 0xa084, 0x00ff, 0x2069, 0xc61c, 0x206a, 0x78e6,
++	0x0006, 0x8e70, 0x2e04, 0x2069, 0xc61d, 0x206a, 0x78ea, 0x7832,
++	0x7836, 0x2010, 0xa084, 0xff00, 0x001e, 0xa105, 0x2009, 0xc628,
++	0x200a, 0x2200, 0xa084, 0x00ff, 0x2008, 0x080c, 0x29f1, 0x080c,
++	0x5f22, 0x0170, 0x2069, 0xcc8e, 0x2071, 0xc8f9, 0x6810, 0x2072,
++	0x6814, 0x7006, 0x6818, 0x700a, 0x681c, 0x700e, 0x080c, 0xb009,
++	0x0040, 0x2001, 0x0006, 0x080c, 0x5291, 0x080c, 0x2e6c, 0x080c,
++	0x95e3, 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x0026,
++	0x0036, 0x00e6, 0x0156, 0x2019, 0xc628, 0x231c, 0x83ff, 0x01e8,
++	0x2071, 0xcc80, 0x2e14, 0xa294, 0x00ff, 0x7004, 0xa084, 0xff00,
++	0xa205, 0xa306, 0x1190, 0x2011, 0xcc96, 0xad98, 0x000a, 0x20a9,
++	0x0004, 0x080c, 0xa103, 0x1148, 0x2011, 0xcc9a, 0xad98, 0x0006,
++	0x20a9, 0x0004, 0x080c, 0xa103, 0x1100, 0x015e, 0x00ee, 0x003e,
++	0x002e, 0x0005, 0x00e6, 0x2071, 0xcc8c, 0x7004, 0xa086, 0x0014,
++	0x11a8, 0x7008, 0xa086, 0x0800, 0x1188, 0x700c, 0xd0ec, 0x0160,
++	0xa084, 0x0f00, 0xa086, 0x0100, 0x1138, 0x7024, 0xd0a4, 0x1110,
++	0xd0ac, 0x0110, 0xa006, 0x0010, 0xa085, 0x0001, 0x00ee, 0x0005,
++	0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0056, 0x0046, 0x0026, 0x0006,
++	0x0126, 0x2091, 0x8000, 0x2029, 0xc930, 0x252c, 0x2021, 0xc936,
++	0x2424, 0x2061, 0xce00, 0x2071, 0xc600, 0x7248, 0x7068, 0xa202,
++	0x16f0, 0x080c, 0xc1b8, 0x05a0, 0x671c, 0xa786, 0x0001, 0x0580,
++	0xa786, 0x0007, 0x0568, 0x2500, 0xac06, 0x0550, 0x2400, 0xac06,
++	0x0538, 0x00c6, 0x6000, 0xa086, 0x0004, 0x1110, 0x080c, 0x1953,
++	0xa786, 0x0008, 0x1148, 0x080c, 0xae8f, 0x1130, 0x00ce, 0x080c,
++	0x9c09, 0x080c, 0xae54, 0x00a0, 0x6010, 0x2068, 0x080c, 0xac91,
++	0x0160, 0xa786, 0x0003, 0x11e8, 0x6837, 0x0103, 0x6b4a, 0x6847,
++	0x0000, 0x080c, 0x580a, 0x080c, 0xae48, 0x080c, 0xae54, 0x00ce,
++	0xace0, 0x0018, 0x705c, 0xac02, 0x1210, 0x0804, 0xa0a5, 0x012e,
++	0x000e, 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, 0x00de, 0x00ee,
++	0x0005, 0xa786, 0x0006, 0x1118, 0x080c, 0xc141, 0x0c30, 0xa786,
++	0x0009, 0x1128, 0x2009, 0x0106, 0x080c, 0x9613, 0x0c00, 0xa786,
++	0x000a, 0x09a0, 0x0888, 0x220c, 0x2304, 0xa106, 0x1130, 0x8210,
++	0x8318, 0x1f04, 0xa103, 0xa006, 0x0005, 0x2304, 0xa102, 0x0218,
++	0x2001, 0x0001, 0x0010, 0x2001, 0x0000, 0xa18d, 0x0001, 0x0005,
++	0x220c, 0x810f, 0x2304, 0xa106, 0x1130, 0x8210, 0x8318, 0x1f04,
++	0xa118, 0xa006, 0x0005, 0xa18d, 0x0001, 0x0005, 0x6004, 0xa08a,
++	0x0080, 0x1a0c, 0x1519, 0x080c, 0xae7e, 0x0120, 0x080c, 0xae8f,
++	0x0168, 0x0028, 0x080c, 0x2e6c, 0x080c, 0xae8f, 0x0138, 0x080c,
++	0x7db1, 0x080c, 0x95e3, 0x080c, 0x7e94, 0x0005, 0x080c, 0x9c09,
++	0x0cb0, 0xa182, 0x0040, 0x0002, 0xa157, 0xa157, 0xa157, 0xa157,
++	0xa157, 0xa157, 0xa157, 0xa157, 0xa157, 0xa157, 0xa157, 0xa159,
++	0xa159, 0xa159, 0xa159, 0xa157, 0xa157, 0xa157, 0xa159, 0x080c,
++	0x1519, 0x600b, 0xffff, 0x6003, 0x0001, 0x6106, 0x080c, 0x7999,
++	0x0126, 0x2091, 0x8000, 0x080c, 0x7e94, 0x012e, 0x0005, 0xa186,
++	0x0013, 0x1128, 0x6004, 0xa082, 0x0040, 0x0804, 0xa1f3, 0xa186,
++	0x0027, 0x11e8, 0x080c, 0x7db1, 0x080c, 0x2e46, 0x00d6, 0x6110,
++	0x2168, 0x080c, 0xac91, 0x0168, 0x6837, 0x0103, 0x684b, 0x0029,
++	0x6847, 0x0000, 0x694c, 0xc1c5, 0x694e, 0x080c, 0x580a, 0x080c,
++	0xae48, 0x00de, 0x080c, 0x95e3, 0x080c, 0x7e94, 0x0005, 0xa186,
++	0x0014, 0x1120, 0x6004, 0xa082, 0x0040, 0x0428, 0xa186, 0x0046,
++	0x0138, 0xa186, 0x0045, 0x0120, 0xa186, 0x0047, 0x190c, 0x1519,
++	0x2001, 0x0109, 0x2004, 0xd084, 0x0198, 0x0126, 0x2091, 0x2800,
++	0x0006, 0x0016, 0x0026, 0x080c, 0x7873, 0x002e, 0x001e, 0x000e,
++	0x012e, 0xe000, 0x6000, 0xa086, 0x0002, 0x1110, 0x0804, 0xa231,
++	0x080c, 0x962a, 0x0005, 0x0002, 0xa1d1, 0xa1cf, 0xa1cf, 0xa1cf,
++	0xa1cf, 0xa1cf, 0xa1cf, 0xa1cf, 0xa1cf, 0xa1cf, 0xa1cf, 0xa1ec,
++	0xa1ec, 0xa1ec, 0xa1ec, 0xa1cf, 0xa1ec, 0xa1cf, 0xa1ec, 0x080c,
++	0x1519, 0x080c, 0x7db1, 0x00d6, 0x6110, 0x2168, 0x080c, 0xac91,
++	0x0168, 0x6837, 0x0103, 0x684b, 0x0006, 0x6847, 0x0000, 0x6850,
++	0xc0ec, 0x6852, 0x080c, 0x580a, 0x080c, 0xae48, 0x00de, 0x080c,
++	0x95e3, 0x080c, 0x7e94, 0x0005, 0x080c, 0x7db1, 0x080c, 0x95e3,
++	0x080c, 0x7e94, 0x0005, 0x0002, 0xa209, 0xa207, 0xa207, 0xa207,
++	0xa207, 0xa207, 0xa207, 0xa207, 0xa207, 0xa207, 0xa207, 0xa21b,
++	0xa21b, 0xa21b, 0xa21b, 0xa207, 0xa22a, 0xa207, 0xa21b, 0x080c,
++	0x1519, 0x080c, 0x7db1, 0x2001, 0xc8ff, 0x2004, 0x603e, 0x6003,
++	0x0002, 0x080c, 0x7e94, 0x6010, 0xa088, 0x0013, 0x2104, 0xa085,
++	0x0400, 0x200a, 0x0005, 0x080c, 0x7db1, 0x2001, 0xc8fd, 0x2004,
++	0x6016, 0x2001, 0xc8ff, 0x2004, 0x603e, 0x6003, 0x000f, 0x080c,
++	0x7e94, 0x0005, 0x080c, 0x7db1, 0x080c, 0x95e3, 0x080c, 0x7e94,
++	0x0005, 0xa182, 0x0040, 0x0002, 0xa247, 0xa247, 0xa247, 0xa247,
++	0xa247, 0xa249, 0xa32e, 0xa35d, 0xa247, 0xa247, 0xa247, 0xa247,
++	0xa247, 0xa247, 0xa247, 0xa247, 0xa247, 0xa247, 0xa247, 0x080c,
++	0x1519, 0x00e6, 0x00d6, 0x603f, 0x0000, 0x2071, 0xcc80, 0x7124,
++	0x610a, 0x2071, 0xcc8c, 0x6110, 0x2168, 0x7614, 0xa6b4, 0x0fff,
++	0x86ff, 0x0904, 0xa2f7, 0xa68c, 0x0c00, 0x0518, 0x00f6, 0x2c78,
++	0x080c, 0x56c3, 0x00fe, 0x01c8, 0x684c, 0xd0ac, 0x01b0, 0x6020,
++	0xd0dc, 0x1198, 0x6850, 0xd0bc, 0x1180, 0x7318, 0x6814, 0xa306,
++	0x1904, 0xa30a, 0x731c, 0x6810, 0xa31e, 0x0138, 0xd6d4, 0x0904,
++	0xa30a, 0x6b14, 0xa305, 0x1904, 0xa30a, 0x7318, 0x6b62, 0x731c,
++	0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0518, 0xa186, 0x0028,
++	0x1128, 0x080c, 0xae6d, 0x684b, 0x001c, 0x00e8, 0xd6dc, 0x01a0,
++	0x684b, 0x0015, 0x684c, 0xd0ac, 0x0170, 0x6914, 0x6a10, 0x2100,
++	0xa205, 0x0148, 0x7018, 0xa106, 0x1118, 0x701c, 0xa206, 0x0118,
++	0x6962, 0x6a5e, 0xc6dc, 0x0038, 0xd6d4, 0x0118, 0x684b, 0x0007,
++	0x0010, 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46, 0xa01e, 0xd6c4,
++	0x01f0, 0xa686, 0x0100, 0x1140, 0x2001, 0xcc99, 0x2004, 0xa005,
++	0x1118, 0xc6c4, 0x0804, 0xa258, 0x7328, 0x732c, 0x6b56, 0x83ff,
++	0x0170, 0xa38a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308,
++	0x2019, 0xcc98, 0xad90, 0x0019, 0x080c, 0xa944, 0x003e, 0xd6cc,
++	0x0904, 0xa31d, 0x7124, 0x695a, 0x81ff, 0x0904, 0xa31d, 0xa192,
++	0x0021, 0x1260, 0x2071, 0xcc98, 0x831c, 0x2300, 0xae18, 0xad90,
++	0x001d, 0x080c, 0xa944, 0x080c, 0xb16e, 0x04b8, 0x6838, 0xd0fc,
++	0x0120, 0x2009, 0x0020, 0x695a, 0x0c68, 0x00f6, 0x2d78, 0x080c,
++	0xa8e9, 0x00fe, 0x080c, 0xb16e, 0x080c, 0xa934, 0x0440, 0x00f6,
++	0x2c78, 0x080c, 0x56c3, 0x00fe, 0x0190, 0x684c, 0xd0ac, 0x0178,
++	0x6020, 0xd0dc, 0x1160, 0x6850, 0xd0bc, 0x1148, 0x6810, 0x6914,
++	0xa105, 0x0128, 0x080c, 0xaf6c, 0x00de, 0x00ee, 0x00f0, 0x684b,
++	0x0000, 0x6837, 0x0103, 0x6e46, 0x684c, 0xd0ac, 0x0130, 0x6810,
++	0x6914, 0xa115, 0x0110, 0x080c, 0xa4ba, 0x080c, 0x580a, 0x6218,
++	0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e, 0x080c, 0xaf3a,
++	0x00de, 0x00ee, 0x1110, 0x080c, 0x95e3, 0x0005, 0x00f6, 0x6003,
++	0x0003, 0x2079, 0xcc8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010,
++	0x2078, 0x784c, 0xd0ac, 0x0138, 0x6003, 0x0002, 0x00fe, 0x0005,
++	0x2130, 0x2228, 0x0058, 0x2400, 0x797c, 0xa10a, 0x2300, 0x7a80,
++	0xa213, 0x2600, 0xa102, 0x2500, 0xa203, 0x0e90, 0x7c12, 0x7b16,
++	0x7e0a, 0x7d0e, 0x00fe, 0x603f, 0x0000, 0x2c10, 0x080c, 0x2068,
++	0x080c, 0x79fc, 0x080c, 0x7f6e, 0x0005, 0x2001, 0xc8ff, 0x2004,
++	0x603e, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20,
++	0x2c10, 0x080c, 0x1870, 0x0005, 0xa182, 0x0040, 0x0002, 0xa382,
++	0xa382, 0xa382, 0xa382, 0xa382, 0xa384, 0xa417, 0xa382, 0xa382,
++	0xa42d, 0xa491, 0xa382, 0xa382, 0xa382, 0xa382, 0xa4a0, 0xa382,
++	0xa382, 0xa382, 0x080c, 0x1519, 0x0076, 0x00f6, 0x00e6, 0x00d6,
++	0x2071, 0xcc8c, 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x7e46,
++	0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0110,
++	0x8211, 0x6a3e, 0x86ff, 0x0904, 0xa412, 0xa694, 0xff00, 0xa284,
++	0x0c00, 0x0120, 0x7018, 0x7862, 0x701c, 0x785e, 0xa284, 0x0300,
++	0x0904, 0xa412, 0x080c, 0x1602, 0x090c, 0x1519, 0x2d00, 0x784a,
++	0x7f4c, 0xc7cd, 0x7f4e, 0x6837, 0x0103, 0x7838, 0x683a, 0x783c,
++	0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00, 0x0120, 0x7318,
++	0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0180,
++	0xa186, 0x0028, 0x1118, 0x684b, 0x001c, 0x0060, 0xd6dc, 0x0118,
++	0x684b, 0x0015, 0x0038, 0xd6d4, 0x0118, 0x684b, 0x0007, 0x0010,
++	0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854, 0x6856, 0xa01e,
++	0xd6c4, 0x0198, 0x7328, 0x732c, 0x6b56, 0x83ff, 0x0170, 0xa38a,
++	0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0xcc98,
++	0xad90, 0x0019, 0x080c, 0xa944, 0x003e, 0xd6cc, 0x01d8, 0x7124,
++	0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, 0x1250, 0x2071, 0xcc98,
++	0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0xa944, 0x0050,
++	0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, 0x0c78, 0x2d78,
++	0x080c, 0xa8e9, 0x00de, 0x00ee, 0x00fe, 0x007e, 0x0005, 0x00f6,
++	0x6003, 0x0003, 0x2079, 0xcc8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08,
++	0x6010, 0x2078, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x00fe, 0x2c10,
++	0x080c, 0x2068, 0x080c, 0x8bdb, 0x0005, 0x00d6, 0x00f6, 0x2c78,
++	0x080c, 0x56c3, 0x00fe, 0x0120, 0x2001, 0xc8ff, 0x2004, 0x603e,
++	0x6003, 0x0002, 0x080c, 0x7e47, 0x080c, 0x7f6e, 0x6110, 0x2168,
++	0x694c, 0xd1e4, 0x0904, 0xa48f, 0xd1cc, 0x0540, 0x6948, 0x6838,
++	0xd0fc, 0x01e8, 0x0016, 0x684c, 0x0006, 0x6850, 0x0006, 0xad90,
++	0x000d, 0xa198, 0x000d, 0x2009, 0x0020, 0x0156, 0x21a8, 0x2304,
++	0x2012, 0x8318, 0x8210, 0x1f04, 0xa457, 0x015e, 0x000e, 0x6852,
++	0x000e, 0x684e, 0x001e, 0x2168, 0x080c, 0x1629, 0x0418, 0x0016,
++	0x080c, 0x1629, 0x00de, 0x080c, 0xa934, 0x00e0, 0x6837, 0x0103,
++	0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0180, 0xa086, 0x0028,
++	0x1118, 0x684b, 0x001c, 0x0060, 0xd1dc, 0x0118, 0x684b, 0x0015,
++	0x0038, 0xd1d4, 0x0118, 0x684b, 0x0007, 0x0010, 0x684b, 0x0000,
++	0x080c, 0x580a, 0x080c, 0xaf3a, 0x1110, 0x080c, 0x95e3, 0x00de,
++	0x0005, 0x2019, 0x0001, 0x080c, 0x8e79, 0x6003, 0x0002, 0x2001,
++	0xc8ff, 0x2004, 0x603e, 0x080c, 0x7e47, 0x080c, 0x7f6e, 0x0005,
++	0x080c, 0x7e47, 0x080c, 0x2e46, 0x00d6, 0x6110, 0x2168, 0x080c,
++	0xac91, 0x0150, 0x6837, 0x0103, 0x684b, 0x0029, 0x6847, 0x0000,
++	0x080c, 0x580a, 0x080c, 0xae48, 0x00de, 0x080c, 0x95e3, 0x080c,
++	0x7f6e, 0x0005, 0x684b, 0x0015, 0xd1fc, 0x0138, 0x684b, 0x0007,
++	0x8002, 0x8000, 0x810a, 0xa189, 0x0000, 0x6962, 0x685e, 0x0005,
++	0xa182, 0x0040, 0x0002, 0xa4de, 0xa4de, 0xa4de, 0xa4de, 0xa4de,
++	0xa4e0, 0xa4de, 0xa59b, 0xa5a7, 0xa4de, 0xa4de, 0xa4de, 0xa4de,
++	0xa4de, 0xa4de, 0xa4de, 0xa4de, 0xa4de, 0xa4de, 0x080c, 0x1519,
++	0x0076, 0x00f6, 0x00e6, 0x00d6, 0x2071, 0xcc8c, 0x6110, 0x2178,
++	0x7614, 0xa6b4, 0x0fff, 0x00f6, 0x2c78, 0x080c, 0x56c3, 0x00fe,
++	0x0150, 0xa684, 0x00ff, 0x1138, 0x6020, 0xd0f4, 0x0120, 0x080c,
++	0xaf6c, 0x0804, 0xa596, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218,
++	0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e, 0x86ff, 0x0904,
++	0xa58c, 0xa694, 0xff00, 0xa284, 0x0c00, 0x0120, 0x7018, 0x7862,
++	0x701c, 0x785e, 0xa284, 0x0300, 0x0904, 0xa58a, 0xa686, 0x0100,
++	0x1140, 0x2001, 0xcc99, 0x2004, 0xa005, 0x1118, 0xc6c4, 0x7e46,
++	0x0c28, 0x080c, 0x1602, 0x090c, 0x1519, 0x2d00, 0x784a, 0x7f4c,
++	0xa7bd, 0x0200, 0x7f4e, 0x6837, 0x0103, 0x7838, 0x683a, 0x783c,
++	0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00, 0x0120, 0x7318,
++	0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0180,
++	0xa186, 0x0028, 0x1118, 0x684b, 0x001c, 0x0060, 0xd6dc, 0x0118,
++	0x684b, 0x0015, 0x0038, 0xd6d4, 0x0118, 0x684b, 0x0007, 0x0010,
++	0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854, 0x6856, 0xa01e,
++	0xd6c4, 0x0198, 0x7328, 0x732c, 0x6b56, 0x83ff, 0x0170, 0xa38a,
++	0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0xcc98,
++	0xad90, 0x0019, 0x080c, 0xa944, 0x003e, 0xd6cc, 0x01d8, 0x7124,
++	0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, 0x1250, 0x2071, 0xcc98,
++	0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0xa944, 0x0050,
++	0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, 0x0c78, 0x2d78,
++	0x080c, 0xa8e9, 0xd6dc, 0x1110, 0xa006, 0x0030, 0x2001, 0x0001,
++	0x2071, 0xcc8c, 0x7218, 0x731c, 0x080c, 0x18b8, 0x00de, 0x00ee,
++	0x00fe, 0x007e, 0x0005, 0x2001, 0xc8ff, 0x2004, 0x603e, 0x20e1,
++	0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1870, 0x0005, 0x2001,
++	0xc8ff, 0x2004, 0x603e, 0x00d6, 0x6003, 0x0002, 0x6110, 0x2168,
++	0x694c, 0xd1e4, 0x0904, 0xa6b2, 0x603f, 0x0000, 0x00f6, 0x2c78,
++	0x080c, 0x56c3, 0x00fe, 0x0560, 0x6814, 0x6910, 0xa115, 0x0540,
++	0x6a60, 0xa206, 0x1118, 0x685c, 0xa106, 0x0510, 0x684c, 0xc0e4,
++	0x684e, 0x6847, 0x0000, 0x6863, 0x0000, 0x685f, 0x0000, 0x6020,
++	0xd0f4, 0x1158, 0x697c, 0x6810, 0xa102, 0x603a, 0x6980, 0x6814,
++	0xa103, 0x6036, 0x6020, 0xc0f5, 0x6022, 0x00d6, 0x6018, 0x2068,
++	0x683c, 0x8000, 0x683e, 0x00de, 0x080c, 0xaf6c, 0x0804, 0xa6b2,
++	0x694c, 0xd1cc, 0x0904, 0xa682, 0x6948, 0x6838, 0xd0fc, 0x0904,
++	0xa645, 0x0016, 0x684c, 0x0006, 0x6850, 0x0006, 0x00f6, 0x2178,
++	0x7944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x01e0, 0xa086, 0x0028,
++	0x1128, 0x684b, 0x001c, 0x784b, 0x001c, 0x00e8, 0xd1dc, 0x0158,
++	0x684b, 0x0015, 0x784b, 0x0015, 0x080c, 0xb0f6, 0x0118, 0x7944,
++	0xc1dc, 0x7946, 0x0080, 0xd1d4, 0x0128, 0x684b, 0x0007, 0x784b,
++	0x0007, 0x0048, 0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, 0xa115,
++	0x0110, 0x080c, 0xa4ba, 0x6848, 0x784a, 0x6860, 0x7862, 0x685c,
++	0x785e, 0xad90, 0x000d, 0xaf98, 0x000d, 0x2009, 0x0020, 0x0156,
++	0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, 0x1f04, 0xa631, 0x015e,
++	0x00fe, 0x000e, 0x6852, 0x000e, 0x684e, 0x080c, 0xb16e, 0x001e,
++	0x2168, 0x080c, 0x1629, 0x0804, 0xa6ad, 0x0016, 0x00f6, 0x2178,
++	0x7944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x01e0, 0xa086, 0x0028,
++	0x1128, 0x684b, 0x001c, 0x784b, 0x001c, 0x00e8, 0xd1dc, 0x0158,
++	0x684b, 0x0015, 0x784b, 0x0015, 0x080c, 0xb0f6, 0x0118, 0x7944,
++	0xc1dc, 0x7946, 0x0080, 0xd1d4, 0x0128, 0x684b, 0x0007, 0x784b,
++	0x0007, 0x0048, 0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, 0xa115,
++	0x0110, 0x080c, 0xa4ba, 0x6860, 0x7862, 0x685c, 0x785e, 0x684c,
++	0x784e, 0x00fe, 0x080c, 0x1629, 0x00de, 0x080c, 0xb16e, 0x080c,
++	0xa934, 0x0458, 0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, 0xa0b6,
++	0x0002, 0x01b0, 0xa086, 0x0028, 0x1118, 0x684b, 0x001c, 0x00d8,
++	0xd1dc, 0x0148, 0x684b, 0x0015, 0x080c, 0xb0f6, 0x0118, 0x6944,
++	0xc1dc, 0x6946, 0x0080, 0xd1d4, 0x0118, 0x684b, 0x0007, 0x0058,
++	0x684b, 0x0000, 0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, 0xa115,
++	0x0110, 0x080c, 0xa4ba, 0x080c, 0x580a, 0x080c, 0xaf3a, 0x1110,
++	0x080c, 0x95e3, 0x00de, 0x0005, 0x080c, 0x7db1, 0x0010, 0x080c,
++	0x7e47, 0x080c, 0xac91, 0x01c0, 0x00d6, 0x6110, 0x2168, 0x6837,
++	0x0103, 0x2009, 0xc60c, 0x210c, 0xd18c, 0x11c0, 0xd184, 0x1198,
++	0x6108, 0x694a, 0xa18e, 0x0029, 0x1110, 0x080c, 0xc4d7, 0x6847,
++	0x0000, 0x080c, 0x580a, 0x00de, 0x080c, 0x95e3, 0x080c, 0x7e94,
++	0x080c, 0x7f6e, 0x0005, 0x684b, 0x0004, 0x0c88, 0x684b, 0x0004,
++	0x0c70, 0xa182, 0x0040, 0x0002, 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7,
++	0xa6f7, 0xa6f9, 0xa6f7, 0xa6fc, 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7,
++	0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7, 0x080c,
++	0x1519, 0x080c, 0x95e3, 0x0005, 0x0006, 0x0026, 0xa016, 0x080c,
++	0x1870, 0x002e, 0x000e, 0x0005, 0xa182, 0x0085, 0x0002, 0xa710,
++	0xa70e, 0xa70e, 0xa71c, 0xa70e, 0xa70e, 0xa70e, 0x080c, 0x1519,
++	0x6003, 0x0001, 0x6106, 0x080c, 0x7999, 0x0126, 0x2091, 0x8000,
++	0x080c, 0x7e94, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6,
++	0x2071, 0xcc80, 0x7224, 0x6212, 0x7220, 0x080c, 0xac81, 0x01a0,
++	0x2268, 0x6800, 0xa086, 0x0000, 0x0178, 0x6018, 0x6d18, 0xa52e,
++	0x1158, 0x00c6, 0x2d60, 0x080c, 0xa954, 0x00ce, 0x0128, 0x6803,
++	0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, 0x6003, 0x0001,
++	0x080c, 0x7999, 0x080c, 0x7e94, 0x00f6, 0x2278, 0x080c, 0x56c3,
++	0x00fe, 0x0150, 0x6820, 0xd0ec, 0x0138, 0x00c6, 0x2260, 0x603f,
++	0x0000, 0x080c, 0xaf6c, 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e,
++	0x0005, 0xa186, 0x0013, 0x1160, 0x6004, 0xa08a, 0x0085, 0x0a0c,
++	0x1519, 0xa08a, 0x008c, 0x1a0c, 0x1519, 0xa082, 0x0085, 0x0072,
++	0xa186, 0x0027, 0x0120, 0xa186, 0x0014, 0x190c, 0x1519, 0x080c,
++	0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, 0x0005, 0xa77d, 0xa77f,
++	0xa77f, 0xa77d, 0xa77d, 0xa77d, 0xa77d, 0x080c, 0x1519, 0x080c,
++	0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, 0x0005, 0xa186, 0x0013,
++	0x1128, 0x6004, 0xa082, 0x0085, 0x2008, 0x04a8, 0xa186, 0x0027,
++	0x11e8, 0x080c, 0x7db1, 0x080c, 0x2e46, 0x00d6, 0x6010, 0x2068,
++	0x080c, 0xac91, 0x0150, 0x6837, 0x0103, 0x6847, 0x0000, 0x684b,
++	0x0029, 0x080c, 0x580a, 0x080c, 0xae48, 0x00de, 0x080c, 0x95e3,
++	0x080c, 0x7e94, 0x0005, 0x080c, 0x962a, 0x0ce0, 0xa186, 0x0014,
++	0x1dd0, 0x080c, 0x7db1, 0x00d6, 0x6010, 0x2068, 0x080c, 0xac91,
++	0x0d60, 0x6837, 0x0103, 0x6847, 0x0000, 0x684b, 0x0006, 0x6850,
++	0xc0ec, 0x6852, 0x08f0, 0x0002, 0xa7cd, 0xa7cb, 0xa7cb, 0xa7cb,
++	0xa7cb, 0xa7cb, 0xa7e5, 0x080c, 0x1519, 0x080c, 0x7db1, 0x6030,
++	0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, 0x0035,
++	0x1118, 0x2001, 0xc8fd, 0x0010, 0x2001, 0xc8fe, 0x2004, 0x6016,
++	0x6003, 0x000c, 0x080c, 0x7e94, 0x0005, 0x080c, 0x7db1, 0x6030,
++	0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, 0x0035,
++	0x1118, 0x2001, 0xc8fd, 0x0010, 0x2001, 0xc8fe, 0x2004, 0x6016,
++	0x6003, 0x000e, 0x080c, 0x7e94, 0x0005, 0xa182, 0x008c, 0x1220,
++	0xa182, 0x0085, 0x0208, 0x001a, 0x080c, 0x962a, 0x0005, 0xa80e,
++	0xa80e, 0xa80e, 0xa80e, 0xa810, 0xa869, 0xa80e, 0x080c, 0x1519,
++	0x00d6, 0x00f6, 0x2c78, 0x080c, 0x56c3, 0x00fe, 0x0168, 0x6030,
++	0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, 0x0035,
++	0x1118, 0x00de, 0x0804, 0xa87c, 0x080c, 0xac91, 0x1118, 0x080c,
++	0xae48, 0x00f0, 0x6010, 0x2068, 0x684c, 0xd0e4, 0x1110, 0x080c,
++	0xae48, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128, 0x684b, 0x0006,
++	0xc0ec, 0x6852, 0x0048, 0xd0bc, 0x0118, 0x684b, 0x0002, 0x0020,
++	0x684b, 0x0005, 0x080c, 0xaf09, 0x6847, 0x0000, 0x080c, 0x580a,
++	0x2c68, 0x080c, 0x958d, 0x01c0, 0x6003, 0x0001, 0x6007, 0x001e,
++	0x600b, 0xffff, 0x2009, 0xcc8e, 0x210c, 0x6136, 0x2009, 0xcc8f,
++	0x210c, 0x613a, 0x6918, 0x611a, 0x080c, 0xb05e, 0x6950, 0x6152,
++	0x601f, 0x0001, 0x080c, 0x7999, 0x2d60, 0x080c, 0x95e3, 0x00de,
++	0x0005, 0x00f6, 0x2c78, 0x080c, 0x56c3, 0x00fe, 0x0598, 0x6030,
++	0xa08c, 0xff00, 0x810f, 0xa186, 0x0035, 0x0130, 0xa186, 0x001e,
++	0x0118, 0xa186, 0x0039, 0x1530, 0x00d6, 0x2c68, 0x080c, 0xb141,
++	0x1904, 0xa8c1, 0x080c, 0x958d, 0x01d8, 0x6106, 0x6003, 0x0001,
++	0x601f, 0x0001, 0x6918, 0x611a, 0x6928, 0x612a, 0x692c, 0x612e,
++	0x6930, 0xa18c, 0x00ff, 0x6132, 0x6934, 0x6136, 0x6938, 0x613a,
++	0x6950, 0x6152, 0x080c, 0xb05e, 0x080c, 0x7999, 0x080c, 0x7e94,
++	0x2d60, 0x00f8, 0x00d6, 0x6010, 0x2068, 0x080c, 0xac91, 0x01c8,
++	0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128, 0xc0ec, 0x6852, 0x684b,
++	0x0006, 0x0048, 0xd0bc, 0x0118, 0x684b, 0x0002, 0x0020, 0x684b,
++	0x0005, 0x080c, 0xaf09, 0x6847, 0x0000, 0x080c, 0x580a, 0x080c,
++	0xae48, 0x00de, 0x080c, 0x95e3, 0x0005, 0x0016, 0x00d6, 0x6010,
++	0x2068, 0x080c, 0xac91, 0x0140, 0x6837, 0x0103, 0x684b, 0x0028,
++	0x6847, 0x0000, 0x080c, 0x580a, 0x00de, 0x001e, 0xa186, 0x0013,
++	0x0148, 0xa186, 0x0014, 0x0130, 0xa186, 0x0027, 0x0118, 0x080c,
++	0x962a, 0x0030, 0x080c, 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94,
++	0x0005, 0x0056, 0x0066, 0x00d6, 0x00f6, 0x2029, 0x0001, 0xa182,
++	0x0101, 0x1208, 0x0010, 0x2009, 0x0100, 0x2130, 0x2069, 0xcc98,
++	0x831c, 0x2300, 0xad18, 0x2009, 0x0020, 0xaf90, 0x001d, 0x080c,
++	0xa944, 0xa6b2, 0x0020, 0x7804, 0xa06d, 0x0110, 0x080c, 0x1629,
++	0x080c, 0x1602, 0x0500, 0x8528, 0x6837, 0x0110, 0x683b, 0x0000,
++	0x2d20, 0x7c06, 0xa68a, 0x003d, 0x1228, 0x2608, 0xad90, 0x000f,
++	0x0459, 0x0088, 0xa6b2, 0x003c, 0x2009, 0x003c, 0x2d78, 0xad90,
++	0x000f, 0x0411, 0x0c28, 0x00fe, 0x852f, 0xa5ad, 0x0003, 0x7d36,
++	0xa5ac, 0x0000, 0x0028, 0x00fe, 0x852f, 0xa5ad, 0x0003, 0x7d36,
++	0x00de, 0x006e, 0x005e, 0x0005, 0x00f6, 0x8dff, 0x0158, 0x6804,
++	0xa07d, 0x0130, 0x6807, 0x0000, 0x080c, 0x580a, 0x2f68, 0x0cb8,
++	0x080c, 0x580a, 0x00fe, 0x0005, 0x0156, 0xa184, 0x0001, 0x0108,
++	0x8108, 0x810c, 0x21a8, 0x2304, 0x8007, 0x2012, 0x8318, 0x8210,
++	0x1f04, 0xa94b, 0x015e, 0x0005, 0x0066, 0x0126, 0x2091, 0x8000,
++	0x2031, 0x0001, 0x601c, 0xa084, 0x000f, 0x0083, 0x012e, 0x006e,
++	0x0005, 0x0126, 0x2091, 0x8000, 0x0066, 0x2031, 0x0000, 0x601c,
++	0xa084, 0x000f, 0x001b, 0x006e, 0x012e, 0x0005, 0xa98b, 0xa98b,
++	0xa986, 0xa9ad, 0xa979, 0xa986, 0xa9ad, 0xa986, 0xa979, 0x77f4,
++	0xa986, 0x080c, 0x1519, 0x0036, 0x2019, 0x0010, 0x080c, 0xbd55,
++	0x601f, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0xa006, 0x0005,
++	0xa085, 0x0001, 0x0005, 0x00d6, 0x86ff, 0x11d8, 0x6010, 0x2068,
++	0x080c, 0xac91, 0x01c0, 0x6834, 0xa086, 0x0139, 0x1128, 0x684b,
++	0x0005, 0x6853, 0x0000, 0x0028, 0xa00e, 0x2001, 0x0005, 0x080c,
++	0x592e, 0x080c, 0xaf09, 0x080c, 0x580a, 0x080c, 0x95e3, 0xa085,
++	0x0001, 0x00de, 0x0005, 0xa006, 0x0ce0, 0x6000, 0xa08a, 0x0010,
++	0x1a0c, 0x1519, 0x000b, 0x0005, 0xa9c4, 0xa9e5, 0xa9c6, 0xaa04,
++	0xa9e2, 0xa9c4, 0xa986, 0xa98b, 0xa98b, 0xa986, 0xa986, 0xa986,
++	0xa986, 0xa986, 0xa986, 0xa986, 0x080c, 0x1519, 0x86ff, 0x11b8,
++	0x601c, 0xa086, 0x0006, 0x0198, 0x00d6, 0x6010, 0x2068, 0x080c,
++	0xac91, 0x0110, 0x080c, 0xaf09, 0x00de, 0x6007, 0x0085, 0x6003,
++	0x000b, 0x601f, 0x0002, 0x080c, 0x7999, 0x080c, 0x7e94, 0xa085,
++	0x0001, 0x0005, 0x080c, 0x1953, 0x0c08, 0x00e6, 0x2071, 0xc927,
++	0x7024, 0xac06, 0x1110, 0x080c, 0x8dee, 0x601c, 0xa084, 0x000f,
++	0xa086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049, 0x0001, 0x2c40,
++	0x080c, 0x8fc9, 0x009e, 0x008e, 0x0010, 0x080c, 0x8ced, 0x00ee,
++	0x1928, 0x080c, 0xa986, 0x0005, 0x0036, 0x00e6, 0x2071, 0xc927,
++	0x703c, 0xac06, 0x1140, 0x2019, 0x0000, 0x080c, 0x8e79, 0x00ee,
++	0x003e, 0x0804, 0xa9c6, 0x080c, 0x90f6, 0x00ee, 0x003e, 0x1904,
++	0xa9c6, 0x080c, 0xa986, 0x0005, 0x00c6, 0x601c, 0xa084, 0x000f,
++	0x0013, 0x00ce, 0x0005, 0xaa35, 0xaaa2, 0xabf0, 0xaa40, 0xae54,
++	0xaa35, 0xbd47, 0xb185, 0xaaa2, 0x77c3, 0xac5b, 0x080c, 0x1519,
++	0x080c, 0xae8f, 0x1110, 0x080c, 0x9c09, 0x0005, 0x080c, 0x7db1,
++	0x080c, 0x7e94, 0x080c, 0x95e3, 0x0005, 0x6017, 0x0001, 0x0005,
++	0x080c, 0xac91, 0x0120, 0x6010, 0xa080, 0x0019, 0x2c02, 0x6000,
++	0xa08a, 0x0010, 0x1a0c, 0x1519, 0x000b, 0x0005, 0xaa5e, 0xaa60,
++	0xaa80, 0xaa92, 0xaa9f, 0xaa5e, 0xaa35, 0xaa35, 0xaa35, 0xaa92,
++	0xaa92, 0xaa5e, 0xaa5e, 0xaa5e, 0xaa5e, 0xaa9c, 0x080c, 0x1519,
++	0x00e6, 0x6010, 0x2070, 0x7050, 0xc0b5, 0x7052, 0x2071, 0xc927,
++	0x7024, 0xac06, 0x0190, 0x080c, 0x8ced, 0x6007, 0x0085, 0x6003,
++	0x000b, 0x601f, 0x0002, 0x2001, 0xc8fe, 0x2004, 0x6016, 0x080c,
++	0x7999, 0x080c, 0x7e94, 0x00ee, 0x0005, 0x6017, 0x0001, 0x0cd8,
++	0x00d6, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852, 0x00de, 0x6007,
++	0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x7999, 0x080c,
++	0x7e94, 0x0005, 0x00d6, 0x6017, 0x0001, 0x6010, 0x2068, 0x6850,
++	0xc0b5, 0x6852, 0x00de, 0x0005, 0x080c, 0x95e3, 0x0005, 0x080c,
++	0x1953, 0x08f0, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1519, 0x000b,
++	0x0005, 0xaab9, 0xaa3d, 0xaabb, 0xaab9, 0xaabb, 0xaabb, 0xaa36,
++	0xaab9, 0xaa30, 0xaa30, 0xaab9, 0xaab9, 0xaab9, 0xaab9, 0xaab9,
++	0xaab9, 0x080c, 0x1519, 0x00d6, 0x6018, 0x2068, 0x6804, 0xa084,
++	0x00ff, 0x00de, 0xa08a, 0x000c, 0x1a0c, 0x1519, 0x000b, 0x0005,
++	0xaad4, 0xab96, 0xaad6, 0xab14, 0xaad6, 0xab14, 0xaad6, 0xaae4,
++	0xaad4, 0xab14, 0xaad4, 0xab00, 0x080c, 0x1519, 0x6004, 0xa08e,
++	0x0016, 0x05a8, 0xa08e, 0x0004, 0x0590, 0xa08e, 0x0002, 0x0578,
++	0xa08e, 0x004b, 0x0904, 0xab92, 0x6004, 0x080c, 0xae8f, 0x0904,
++	0xabaf, 0xa08e, 0x0021, 0x0904, 0xabb3, 0xa08e, 0x0022, 0x0904,
++	0xabaf, 0xa08e, 0x003d, 0x0904, 0xabb3, 0xa08e, 0x0039, 0x0904,
++	0xabb7, 0xa08e, 0x0035, 0x0904, 0xabb7, 0xa08e, 0x001e, 0x0188,
++	0xa08e, 0x0001, 0x1150, 0x00d6, 0x6018, 0x2068, 0x6804, 0xa084,
++	0x00ff, 0x00de, 0xa086, 0x0006, 0x0110, 0x080c, 0x2e46, 0x080c,
++	0x9c09, 0x080c, 0xae54, 0x0005, 0x00c6, 0x00d6, 0x6104, 0xa186,
++	0x0016, 0x0904, 0xab83, 0xa186, 0x0002, 0x15d8, 0x2001, 0xc635,
++	0x2004, 0xd08c, 0x1198, 0x080c, 0x5f22, 0x1180, 0x2001, 0xc8e6,
++	0x2003, 0x0001, 0x2001, 0xc600, 0x2003, 0x0001, 0xa085, 0x0001,
++	0x080c, 0x5f66, 0x080c, 0x5e5a, 0x0804, 0xabd9, 0x6018, 0x2068,
++	0x2001, 0xc635, 0x2004, 0xd0ac, 0x1904, 0xabd9, 0x68a0, 0xd0bc,
++	0x1904, 0xabd9, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0190, 0x8001,
++	0x6842, 0x6013, 0x0000, 0x601f, 0x0007, 0x6017, 0x0398, 0x603f,
++	0x0000, 0x080c, 0x958d, 0x0128, 0x2d00, 0x601a, 0x601f, 0x0001,
++	0x0450, 0x00de, 0x00ce, 0x6004, 0xa08e, 0x0002, 0x11a8, 0x6018,
++	0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x1170, 0x2009, 0xc635,
++	0x2104, 0xc085, 0x200a, 0x00e6, 0x2071, 0xc600, 0x080c, 0x4f02,
++	0x00ee, 0x080c, 0x9c09, 0x0020, 0x080c, 0x9c09, 0x080c, 0x2e46,
++	0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2e6c, 0x012e, 0x00ee,
++	0x080c, 0xae54, 0x0005, 0x2001, 0x0002, 0x080c, 0x5291, 0x6003,
++	0x0001, 0x6007, 0x0002, 0x080c, 0x79df, 0x080c, 0x7e94, 0x00de,
++	0x00ce, 0x0c80, 0x080c, 0x2e6c, 0x0804, 0xab0f, 0x00c6, 0x00d6,
++	0x6104, 0xa186, 0x0016, 0x0d38, 0x6018, 0x2068, 0x6840, 0xa084,
++	0x00ff, 0xa005, 0x0904, 0xab59, 0x8001, 0x6842, 0x6003, 0x0001,
++	0x080c, 0x79df, 0x080c, 0x7e94, 0x00de, 0x00ce, 0x0898, 0x080c,
++	0x9c09, 0x0804, 0xab11, 0x080c, 0x9c37, 0x0804, 0xab11, 0x00d6,
++	0x2c68, 0x6104, 0x080c, 0xb141, 0x00de, 0x0118, 0x080c, 0x95e3,
++	0x00b8, 0x6004, 0x8007, 0x6130, 0xa18c, 0x00ff, 0xa105, 0x6032,
++	0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x6038, 0x600a,
++	0x2001, 0xc8fe, 0x2004, 0x6016, 0x080c, 0x7999, 0x080c, 0x7e94,
++	0x0005, 0x00de, 0x00ce, 0x080c, 0x9c09, 0x080c, 0x2e46, 0x00e6,
++	0x0126, 0x2091, 0x8000, 0x080c, 0x2e6c, 0x6013, 0x0000, 0x601f,
++	0x0007, 0x6017, 0x0398, 0x603f, 0x0000, 0x012e, 0x00ee, 0x0005,
++	0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1519, 0x000b, 0x0005, 0xac07,
++	0xac07, 0xac07, 0xac07, 0xac07, 0xac07, 0xac07, 0xac07, 0xac07,
++	0xaa35, 0xac07, 0xaa3d, 0xac09, 0xaa3d, 0xac16, 0xac07, 0x080c,
++	0x1519, 0x6004, 0xa086, 0x008b, 0x0148, 0x6007, 0x008b, 0x6003,
++	0x000d, 0x080c, 0x7999, 0x080c, 0x7e94, 0x0005, 0x080c, 0xae48,
++	0x080c, 0xac91, 0x0580, 0x080c, 0x2e46, 0x00d6, 0x080c, 0xac91,
++	0x0168, 0x6010, 0x2068, 0x6837, 0x0103, 0x684b, 0x0006, 0x6847,
++	0x0000, 0x6850, 0xc0ed, 0x6852, 0x080c, 0x580a, 0x2c68, 0x080c,
++	0x958d, 0x0150, 0x6818, 0x601a, 0x080c, 0xb05e, 0x00c6, 0x2d60,
++	0x080c, 0xae54, 0x00ce, 0x0008, 0x2d60, 0x00de, 0x6013, 0x0000,
++	0x601f, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x79df,
++	0x080c, 0x7e94, 0x0078, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186,
++	0x0039, 0x0118, 0xa186, 0x0035, 0x1118, 0x080c, 0x2e46, 0x08b0,
++	0x080c, 0xae54, 0x0005, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1519,
++	0x000b, 0x0005, 0xac72, 0xac72, 0xac72, 0xac74, 0xac74, 0xac72,
++	0xac72, 0xac72, 0xac72, 0xac72, 0xac72, 0xac72, 0xac72, 0xac72,
++	0xac72, 0xac72, 0x080c, 0x1519, 0x080c, 0x90f6, 0x190c, 0x1519,
++	0x6110, 0x2168, 0x684b, 0x0006, 0x080c, 0x580a, 0x080c, 0x95e3,
++	0x0005, 0xa284, 0x0007, 0x1158, 0xa282, 0xce00, 0x0240, 0x2001,
++	0xc617, 0x2004, 0xa202, 0x1218, 0xa085, 0x0001, 0x0005, 0xa006,
++	0x0ce8, 0x0026, 0x6210, 0xa294, 0xf000, 0x002e, 0x0005, 0x00e6,
++	0x00c6, 0x0036, 0x0006, 0x0126, 0x2091, 0x8000, 0x2061, 0xce00,
++	0x2071, 0xc600, 0x7348, 0x7068, 0xa302, 0x12a8, 0x601c, 0xa206,
++	0x1160, 0x080c, 0xafe9, 0x0148, 0x080c, 0xae8f, 0x1110, 0x080c,
++	0x9c09, 0x00c6, 0x080c, 0x95e3, 0x00ce, 0xace0, 0x0018, 0x705c,
++	0xac02, 0x1208, 0x0c38, 0x012e, 0x000e, 0x003e, 0x00ce, 0x00ee,
++	0x0005, 0x00e6, 0x00c6, 0x0016, 0xa188, 0xc77b, 0x210c, 0x81ff,
++	0x0128, 0x2061, 0xca3c, 0x611a, 0x080c, 0x2e46, 0xa006, 0x0010,
++	0xa085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6, 0x0056,
++	0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x958d, 0x005e, 0x0180,
++	0x6612, 0x651a, 0x080c, 0xb05e, 0x601f, 0x0003, 0x2009, 0x004b,
++	0x080c, 0x9613, 0xa085, 0x0001, 0x012e, 0x005e, 0x00ce, 0x0005,
++	0xa006, 0x0cd0, 0x00c6, 0x0056, 0x0126, 0x2091, 0x8000, 0x62a0,
++	0x00c6, 0x080c, 0xaf0d, 0x005e, 0x0550, 0x6013, 0x0000, 0x651a,
++	0x080c, 0xb05e, 0x601f, 0x0003, 0x0016, 0x00c6, 0x2560, 0x080c,
++	0x553e, 0x00ce, 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c,
++	0x7a0e, 0x2c08, 0x080c, 0xbef7, 0x007e, 0x001e, 0xd184, 0x0128,
++	0x080c, 0x95e3, 0xa085, 0x0001, 0x0030, 0x2009, 0x004c, 0x080c,
++	0x9613, 0xa085, 0x0001, 0x012e, 0x005e, 0x00ce, 0x0005, 0xa006,
++	0x0cd0, 0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c, 0x958d, 0x2c78,
++	0x00ce, 0x0180, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021,
++	0x0005, 0x080c, 0xad87, 0x2f60, 0x2009, 0x004d, 0x080c, 0x9613,
++	0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6,
++	0x0046, 0x00c6, 0x080c, 0x958d, 0x2c78, 0x00ce, 0x0178, 0x7e12,
++	0x2c00, 0x781a, 0x781f, 0x0003, 0x2021, 0x0005, 0x0481, 0x2f60,
++	0x2009, 0x004e, 0x080c, 0x9613, 0xa085, 0x0001, 0x004e, 0x00ce,
++	0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c, 0x958d,
++	0x2c78, 0x00ce, 0x01c0, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003,
++	0x2021, 0x0004, 0x00a1, 0x2001, 0xc8e7, 0x2004, 0xd0fc, 0x0120,
++	0x2f60, 0x080c, 0x95e3, 0x0028, 0x2f60, 0x2009, 0x0052, 0x080c,
++	0x9613, 0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x0096,
++	0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0x54e0, 0x0118, 0x2001,
++	0xad8c, 0x0028, 0x080c, 0x54b0, 0x0158, 0x2001, 0xad92, 0x0006,
++	0xa00e, 0x2400, 0x080c, 0x592e, 0x080c, 0x580a, 0x000e, 0x0807,
++	0x2418, 0x080c, 0x7d50, 0x62a0, 0x0086, 0x2041, 0x0001, 0x2039,
++	0x0001, 0x2608, 0x080c, 0x7b2f, 0x008e, 0x080c, 0x7a0e, 0x2f08,
++	0x2648, 0x080c, 0xbef7, 0x613c, 0x81ff, 0x090c, 0x7be4, 0x080c,
++	0x7e94, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091,
++	0x8000, 0x00c6, 0x080c, 0x958d, 0x001e, 0x0188, 0x660a, 0x611a,
++	0x080c, 0xb05e, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x001f,
++	0x080c, 0x9613, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006,
++	0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x958d,
++	0x001e, 0x0188, 0x660a, 0x611a, 0x080c, 0xb05e, 0x601f, 0x0008,
++	0x2d00, 0x6012, 0x2009, 0x0021, 0x080c, 0x9613, 0xa085, 0x0001,
++	0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091,
++	0x8000, 0x00c6, 0x080c, 0x958d, 0x001e, 0x0188, 0x660a, 0x611a,
++	0x080c, 0xb05e, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x003d,
++	0x080c, 0x9613, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006,
++	0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0xaf0d,
++	0x001e, 0x0180, 0x611a, 0x080c, 0xb05e, 0x601f, 0x0001, 0x2d00,
++	0x6012, 0x2009, 0x0000, 0x080c, 0x9613, 0xa085, 0x0001, 0x012e,
++	0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000,
++	0x00c6, 0x080c, 0x958d, 0x001e, 0x0188, 0x660a, 0x611a, 0x080c,
++	0xb05e, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0044, 0x080c,
++	0x9613, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8,
++	0x0026, 0x00d6, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211,
++	0x6a3e, 0x00de, 0x002e, 0x0005, 0x0006, 0x6000, 0xa086, 0x0000,
++	0x0190, 0x6013, 0x0000, 0x601f, 0x0007, 0x2001, 0xc8fd, 0x2004,
++	0x0006, 0xa082, 0x0051, 0x000e, 0x0208, 0x8004, 0x6016, 0x080c,
++	0xc3e2, 0x603f, 0x0000, 0x000e, 0x0005, 0x0066, 0x00c6, 0x00d6,
++	0x2031, 0xc653, 0x2634, 0xd6e4, 0x0128, 0x6618, 0x2660, 0x6e48,
++	0x080c, 0x5469, 0x00de, 0x00ce, 0x006e, 0x0005, 0x0006, 0x0016,
++	0x6004, 0xa08e, 0x0002, 0x0140, 0xa08e, 0x0003, 0x0128, 0xa08e,
++	0x0004, 0x0110, 0xa085, 0x0001, 0x001e, 0x000e, 0x0005, 0x0006,
++	0x00d6, 0x6010, 0xa06d, 0x0148, 0x6834, 0xa086, 0x0139, 0x0138,
++	0x6838, 0xd0fc, 0x0110, 0xa006, 0x0010, 0xa085, 0x0001, 0x00de,
++	0x000e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c,
++	0x958d, 0x001e, 0x0190, 0x611a, 0x080c, 0xb05e, 0x601f, 0x0001,
++	0x2d00, 0x6012, 0x080c, 0x2e46, 0x2009, 0x0028, 0x080c, 0x9613,
++	0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0xa186,
++	0x0015, 0x1178, 0x2011, 0xc621, 0x2204, 0xa086, 0x0074, 0x1148,
++	0x080c, 0x9fb9, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, 0x79df,
++	0x0020, 0x080c, 0x9c09, 0x080c, 0x95e3, 0x0005, 0xa186, 0x0016,
++	0x1128, 0x2001, 0x0004, 0x080c, 0x5291, 0x00e8, 0xa186, 0x0015,
++	0x11e8, 0x2011, 0xc621, 0x2204, 0xa086, 0x0014, 0x11b8, 0x00d6,
++	0x6018, 0x2068, 0x080c, 0x53df, 0x00de, 0x080c, 0xa072, 0x1170,
++	0x00d6, 0x6018, 0x2068, 0x6890, 0x00de, 0xa005, 0x0138, 0x2001,
++	0x0006, 0x080c, 0x5291, 0x080c, 0x9767, 0x0020, 0x080c, 0x9c09,
++	0x080c, 0x95e3, 0x0005, 0x6848, 0xa086, 0x0005, 0x1108, 0x0009,
++	0x0005, 0x6850, 0xc0ad, 0x6852, 0x0005, 0x00e6, 0x0126, 0x2071,
++	0xc600, 0x2091, 0x8000, 0x7548, 0xa582, 0x0001, 0x0608, 0x704c,
++	0x2060, 0x6000, 0xa086, 0x0000, 0x0148, 0xace0, 0x0018, 0x705c,
++	0xac02, 0x1208, 0x0cb0, 0x2061, 0xce00, 0x0c98, 0x6003, 0x0008,
++	0x8529, 0x754a, 0xaca8, 0x0018, 0x705c, 0xa502, 0x1230, 0x754e,
++	0xa085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x704f, 0xce00, 0x0cc0,
++	0xa006, 0x0cc0, 0x00e6, 0x2071, 0xcc8c, 0x7014, 0xd0e4, 0x0150,
++	0x6013, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x7999,
++	0x080c, 0x7e94, 0x00ee, 0x0005, 0x00c6, 0x00f6, 0x2c78, 0x080c,
++	0x56c3, 0x00fe, 0x0120, 0x601c, 0xa084, 0x000f, 0x0013, 0x00ce,
++	0x0005, 0xaa35, 0xaf64, 0xaf67, 0xaf6a, 0xc1cf, 0xc1ea, 0xc1ed,
++	0xaa35, 0xaa35, 0x080c, 0x1519, 0xe000, 0xe000, 0x0005, 0xe000,
++	0xe000, 0x0005, 0x0009, 0x0005, 0x00f6, 0x2c78, 0x080c, 0x56c3,
++	0x0538, 0x080c, 0x958d, 0x1128, 0x2001, 0xc8ff, 0x2004, 0x783e,
++	0x00f8, 0x7818, 0x601a, 0x080c, 0xb05e, 0x781c, 0xa086, 0x0003,
++	0x0128, 0x7808, 0x6036, 0x2f00, 0x603a, 0x0020, 0x7808, 0x603a,
++	0x2f00, 0x6036, 0x602a, 0x601f, 0x0001, 0x6007, 0x0035, 0x6003,
++	0x0001, 0x7950, 0x6152, 0x080c, 0x7999, 0x080c, 0x7e94, 0x2f60,
++	0x00fe, 0x0005, 0x0016, 0x00f6, 0x682c, 0x6032, 0xa08e, 0x0001,
++	0x0138, 0xa086, 0x0005, 0x0140, 0xa006, 0x602a, 0x602e, 0x00a0,
++	0x6820, 0xc0f4, 0xc0d5, 0x6822, 0x6810, 0x2078, 0x787c, 0x6938,
++	0xa102, 0x7880, 0x6934, 0xa103, 0x1e78, 0x6834, 0x602a, 0x6838,
++	0xa084, 0xfffc, 0x683a, 0x602e, 0x2d00, 0x6036, 0x6808, 0x603a,
++	0x6918, 0x611a, 0x6950, 0x6152, 0x601f, 0x0001, 0x6007, 0x0039,
++	0x6003, 0x0001, 0x080c, 0x7999, 0x6803, 0x0002, 0x00fe, 0x001e,
++	0x0005, 0x00f6, 0x2c78, 0x080c, 0x56c3, 0x1118, 0xa085, 0x0001,
++	0x0070, 0x6020, 0xd0f4, 0x1150, 0xc0f5, 0x6022, 0x6010, 0x2078,
++	0x7828, 0x603a, 0x782c, 0x6036, 0x080c, 0x1953, 0xa006, 0x00fe,
++	0x0005, 0x0006, 0x0016, 0x6004, 0xa08e, 0x0034, 0x01b8, 0xa08e,
++	0x0035, 0x01a0, 0xa08e, 0x0036, 0x0188, 0xa08e, 0x0037, 0x0170,
++	0xa08e, 0x0038, 0x0158, 0xa08e, 0x0039, 0x0140, 0xa08e, 0x003a,
++	0x0128, 0xa08e, 0x003b, 0x0110, 0xa085, 0x0001, 0x001e, 0x000e,
++	0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x2001, 0xc8f9,
++	0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, 0x783f, 0x2001,
++	0xc8fd, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0xc8fb,
++	0x200c, 0x8000, 0x2014, 0x2071, 0xc8d5, 0x711a, 0x721e, 0x2001,
++	0x0064, 0x080c, 0x783f, 0x2001, 0xc8fe, 0x82ff, 0x1110, 0x2011,
++	0x0014, 0x2202, 0x2009, 0xc8ff, 0xa280, 0x000a, 0x200a, 0x080c,
++	0x572c, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006,
++	0x00e6, 0x2001, 0xc8fd, 0x2003, 0x0028, 0x2001, 0xc8fe, 0x2003,
++	0x0014, 0x2071, 0xc8d5, 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001,
++	0xc8ff, 0x2003, 0x001e, 0x00ee, 0x000e, 0x0005, 0x00d6, 0x6054,
++	0xa06d, 0x0110, 0x080c, 0x1619, 0x00de, 0x0005, 0x0005, 0x00c6,
++	0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x958d, 0x001e, 0x0178,
++	0x611a, 0x0ca1, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0033,
++	0x080c, 0x9613, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006,
++	0x0cd8, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0xc600, 0xa186, 0x0015,
++	0x1500, 0x7084, 0xa086, 0x0018, 0x11e0, 0x6010, 0x2068, 0x6a3c,
++	0xd2e4, 0x1160, 0x2c78, 0x080c, 0x80af, 0x01d8, 0x7070, 0x6a50,
++	0xa206, 0x1160, 0x7074, 0x6a54, 0xa206, 0x1140, 0x6218, 0xa290,
++	0x0028, 0x2214, 0x2009, 0x0000, 0x080c, 0x2e8b, 0x080c, 0x9767,
++	0x0020, 0x080c, 0x9c09, 0x080c, 0x95e3, 0x00fe, 0x00ee, 0x00de,
++	0x0005, 0x7054, 0x6a54, 0xa206, 0x0d48, 0x0c80, 0x00c6, 0x0126,
++	0x2091, 0x8000, 0x00c6, 0x080c, 0x958d, 0x001e, 0x0180, 0x611a,
++	0x080c, 0xb05e, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0043,
++	0x080c, 0x9613, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006,
++	0x0cd8, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0xc600, 0xa186, 0x0015,
++	0x11c0, 0x7084, 0xa086, 0x0004, 0x11a0, 0x6010, 0xa0e8, 0x000f,
++	0x2c78, 0x080c, 0x80af, 0x01a8, 0x7070, 0x6a08, 0xa206, 0x1130,
++	0x7074, 0x6a0c, 0xa206, 0x1110, 0x080c, 0x2e46, 0x080c, 0x9767,
++	0x0020, 0x080c, 0x9c09, 0x080c, 0x95e3, 0x00fe, 0x00ee, 0x00de,
++	0x0005, 0x7054, 0x6a0c, 0xa206, 0x0d78, 0x0c80, 0x0016, 0x0026,
++	0x684c, 0xd0ac, 0x0178, 0x6914, 0x6a10, 0x2100, 0xa205, 0x0150,
++	0x6860, 0xa106, 0x1118, 0x685c, 0xa206, 0x0120, 0x6962, 0x6a5e,
++	0xa085, 0x0001, 0x002e, 0x001e, 0x0005, 0x00d6, 0x0036, 0x6310,
++	0x2368, 0x684a, 0x6952, 0xa29e, 0x4000, 0x11a0, 0x00c6, 0x6318,
++	0x2360, 0x2009, 0x0000, 0x6838, 0xd0f4, 0x1140, 0x080c, 0x55de,
++	0x1108, 0xc185, 0x6000, 0xd0bc, 0x0108, 0xc18d, 0x6a66, 0x696a,
++	0x00ce, 0x0080, 0x6a66, 0x3918, 0xa398, 0x0006, 0x231c, 0x686b,
++	0x0004, 0x6b72, 0x00c6, 0x6318, 0x2360, 0x6004, 0xa084, 0x00ff,
++	0x686e, 0x00ce, 0x080c, 0x580a, 0x6013, 0x0000, 0x003e, 0x00de,
++	0x0005, 0x00c6, 0x0026, 0x0016, 0xa186, 0x0035, 0x0110, 0x6a34,
++	0x0008, 0x6a28, 0x080c, 0xac81, 0x01f0, 0x2260, 0x611c, 0xa186,
++	0x0003, 0x0118, 0xa186, 0x0006, 0x1190, 0x6834, 0xa206, 0x0140,
++	0x6838, 0xa206, 0x1160, 0x6108, 0x6834, 0xa106, 0x1140, 0x0020,
++	0x6008, 0x6938, 0xa106, 0x1118, 0x6018, 0x6918, 0xa106, 0x001e,
++	0x002e, 0x00ce, 0x0005, 0xa085, 0x0001, 0x0cc8, 0x6944, 0xd1cc,
++	0x0198, 0xa18c, 0x00ff, 0xa18e, 0x0002, 0x1170, 0xad88, 0x001e,
++	0x210c, 0xa18c, 0x0f00, 0x810f, 0xa18e, 0x0001, 0x1128, 0x6810,
++	0x6914, 0xa115, 0x190c, 0xa4ba, 0x0005, 0x080c, 0x95e3, 0x0804,
++	0x7e94, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013,
++	0x006e, 0x0005, 0xb1a2, 0xb6b9, 0xb7e1, 0xb1a2, 0xb1a2, 0xb1a2,
++	0xb1a2, 0xb1a2, 0xb1da, 0xb865, 0xb1a2, 0xb1a2, 0xb1a2, 0xb1a2,
++	0xb1a2, 0xb1a2, 0x080c, 0x1519, 0x0066, 0x6000, 0xa0b2, 0x0010,
++	0x1a0c, 0x1519, 0x0013, 0x006e, 0x0005, 0xb1bd, 0xbcec, 0xb1bd,
++	0xb1bd, 0xb1bd, 0xb1bd, 0xb1bd, 0xb1bd, 0xbcae, 0xbd34, 0xb1bd,
++	0xc314, 0xc344, 0xc314, 0xc344, 0xb1bd, 0x080c, 0x1519, 0x0066,
++	0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013, 0x006e, 0x0005,
++	0xb1d8, 0xb9b5, 0xba82, 0xbaaf, 0xbb33, 0xb1d8, 0xbc20, 0xbbcb,
++	0xb871, 0xbc84, 0xbc99, 0xb1d8, 0xb1d8, 0xb1d8, 0xb1d8, 0xb1d8,
++	0x080c, 0x1519, 0xa1b2, 0x0080, 0x1a0c, 0x1519, 0x2100, 0xa1b2,
++	0x0040, 0x1a04, 0xb5f1, 0x0002, 0xb224, 0xb3ef, 0xb224, 0xb224,
++	0xb224, 0xb3f6, 0xb224, 0xb224, 0xb224, 0xb224, 0xb224, 0xb224,
++	0xb224, 0xb224, 0xb224, 0xb224, 0xb224, 0xb224, 0xb224, 0xb224,
++	0xb224, 0xb224, 0xb224, 0xb226, 0xb284, 0xb293, 0xb2e1, 0xb2ff,
++	0xb37d, 0xb3dc, 0xb224, 0xb224, 0xb3f9, 0xb224, 0xb224, 0xb40c,
++	0xb417, 0xb224, 0xb224, 0xb224, 0xb224, 0xb224, 0xb4a2, 0xb224,
++	0xb224, 0xb4b5, 0xb224, 0xb224, 0xb46d, 0xb224, 0xb224, 0xb224,
++	0xb4cd, 0xb224, 0xb224, 0xb224, 0xb547, 0xb224, 0xb224, 0xb224,
++	0xb224, 0xb224, 0xb224, 0xb5b8, 0x080c, 0x1519, 0x080c, 0x570b,
++	0x1150, 0x2001, 0xc635, 0x2004, 0xd0cc, 0x1128, 0xa084, 0x0009,
++	0xa086, 0x0008, 0x1140, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013,
++	0x0000, 0x0804, 0xb3ea, 0x080c, 0x568d, 0x00e6, 0x00c6, 0x0036,
++	0x0026, 0x0016, 0x6218, 0x2270, 0x72a0, 0x0026, 0x2019, 0x0029,
++	0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a0e, 0x2c08,
++	0x080c, 0xbef7, 0x007e, 0x001e, 0x2e60, 0x080c, 0x553e, 0x001e,
++	0x002e, 0x003e, 0x00ce, 0x00ee, 0x6618, 0x00c6, 0x2660, 0x080c,
++	0x534c, 0x00ce, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082,
++	0x0006, 0x0278, 0x080c, 0xbe3b, 0x1904, 0xb2db, 0x080c, 0xbddb,
++	0x1120, 0x6007, 0x0008, 0x0804, 0xb3ea, 0x6007, 0x0009, 0x0804,
++	0xb3ea, 0x080c, 0xc023, 0x0128, 0x080c, 0xbe3b, 0x0d78, 0x0804,
++	0xb2db, 0x6013, 0x1900, 0x0c88, 0x080c, 0x2f69, 0x1904, 0xb5ee,
++	0x6106, 0x080c, 0xbd95, 0x6007, 0x0006, 0x0804, 0xb3ea, 0x6007,
++	0x0007, 0x0804, 0xb3ea, 0x080c, 0xc378, 0x1904, 0xb5ee, 0x080c,
++	0x2f69, 0x1904, 0xb5ee, 0x00d6, 0x6618, 0x2668, 0x6e04, 0xa684,
++	0x00ff, 0xa082, 0x0006, 0x1220, 0x2001, 0x0001, 0x080c, 0x527f,
++	0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0188, 0xa686, 0x0004,
++	0x0170, 0x6e04, 0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0140, 0xa686,
++	0x0004, 0x0128, 0xa686, 0x0005, 0x0110, 0x00de, 0x00e0, 0x080c,
++	0xbe99, 0x11a0, 0xa686, 0x0006, 0x1150, 0x0026, 0x6218, 0xa290,
++	0x0028, 0x2214, 0x2009, 0x0000, 0x080c, 0x2e8b, 0x002e, 0x080c,
++	0x53df, 0x6007, 0x000a, 0x00de, 0x0804, 0xb3ea, 0x6007, 0x000b,
++	0x00de, 0x0804, 0xb3ea, 0x080c, 0x2e46, 0x6007, 0x0001, 0x0804,
++	0xb3ea, 0x080c, 0xc378, 0x1904, 0xb5ee, 0x080c, 0x2f69, 0x1904,
++	0xb5ee, 0x6618, 0x00d6, 0x2668, 0x6e04, 0x00de, 0xa686, 0x0707,
++	0x0d50, 0x0026, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, 0x0000,
++	0x080c, 0x2e8b, 0x002e, 0x6007, 0x000c, 0x0804, 0xb3ea, 0x080c,
++	0x570b, 0x1140, 0x2001, 0xc635, 0x2004, 0xa084, 0x0009, 0xa086,
++	0x0008, 0x1110, 0x0804, 0xb233, 0x080c, 0x568d, 0x6618, 0xa6b0,
++	0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x06e8, 0x1138,
++	0x0026, 0x2001, 0x0006, 0x080c, 0x52be, 0x002e, 0x0050, 0xa6b4,
++	0xff00, 0x8637, 0xa686, 0x0004, 0x0120, 0xa686, 0x0006, 0x1904,
++	0xb2db, 0x080c, 0xbea6, 0x1120, 0x6007, 0x000e, 0x0804, 0xb3ea,
++	0x0046, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427,
++	0x0046, 0x080c, 0x2e46, 0x004e, 0x0016, 0xa006, 0x2009, 0xc653,
++	0x210c, 0xd1a4, 0x0158, 0x2009, 0x0029, 0x080c, 0xc190, 0x6018,
++	0x00d6, 0x2068, 0x6800, 0xc0e5, 0x6802, 0x00de, 0x001e, 0x004e,
++	0x6007, 0x0001, 0x0804, 0xb3ea, 0x2001, 0x0001, 0x080c, 0x527f,
++	0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0xc605,
++	0x2011, 0xcc90, 0x080c, 0xa103, 0x003e, 0x002e, 0x001e, 0x015e,
++	0xa005, 0x0168, 0xa6b4, 0xff00, 0x8637, 0xa682, 0x0004, 0x0a04,
++	0xb2db, 0xa682, 0x0007, 0x0a04, 0xb329, 0x0804, 0xb2db, 0x6013,
++	0x1900, 0x6007, 0x0009, 0x0804, 0xb3ea, 0x080c, 0x570b, 0x1140,
++	0x2001, 0xc635, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008, 0x1110,
++	0x0804, 0xb233, 0x080c, 0x568d, 0x6618, 0xa6b0, 0x0001, 0x2634,
++	0xa684, 0x00ff, 0xa082, 0x0006, 0x06b8, 0xa6b4, 0xff00, 0x8637,
++	0xa686, 0x0004, 0x0120, 0xa686, 0x0006, 0x1904, 0xb2db, 0x080c,
++	0xbece, 0x1138, 0x080c, 0xbddb, 0x1120, 0x6007, 0x0010, 0x0804,
++	0xb3ea, 0x0046, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff,
++	0x8427, 0x0046, 0x080c, 0x2e46, 0x004e, 0x0016, 0xa006, 0x2009,
++	0xc653, 0x210c, 0xd1a4, 0x0158, 0x2009, 0x0029, 0x080c, 0xc190,
++	0x6018, 0x00d6, 0x2068, 0x6800, 0xc0e5, 0x6802, 0x00de, 0x001e,
++	0x004e, 0x6007, 0x0001, 0x00f0, 0x080c, 0xc023, 0x0140, 0xa6b4,
++	0xff00, 0x8637, 0xa686, 0x0006, 0x0950, 0x0804, 0xb2db, 0x6013,
++	0x1900, 0x6007, 0x0009, 0x0070, 0x080c, 0x2f69, 0x1904, 0xb5ee,
++	0x080c, 0xc378, 0x1904, 0xb5ee, 0x080c, 0xb652, 0x1904, 0xb2db,
++	0x6007, 0x0012, 0x6003, 0x0001, 0x080c, 0x79df, 0x0005, 0x6007,
++	0x0001, 0x6003, 0x0001, 0x080c, 0x79df, 0x0cc0, 0x6007, 0x0005,
++	0x0cc0, 0x080c, 0xc378, 0x1904, 0xb5ee, 0x080c, 0x2f69, 0x1904,
++	0xb5ee, 0x080c, 0xb652, 0x1904, 0xb2db, 0x6007, 0x0020, 0x6003,
++	0x0001, 0x080c, 0x79df, 0x0005, 0x080c, 0x2f69, 0x1904, 0xb5ee,
++	0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x79df, 0x0005, 0x080c,
++	0xc378, 0x1904, 0xb5ee, 0x080c, 0x2f69, 0x1904, 0xb5ee, 0x080c,
++	0xb652, 0x1904, 0xb2db, 0x0016, 0x0026, 0x2011, 0xcc91, 0x2214,
++	0xa286, 0xffff, 0x0190, 0x2c08, 0x080c, 0xac81, 0x01e0, 0x2260,
++	0x2011, 0xcc90, 0x2214, 0x6008, 0xa206, 0x11a8, 0x6018, 0xa190,
++	0x0006, 0x2214, 0xa206, 0x01e8, 0x0070, 0x2011, 0xcc90, 0x2214,
++	0x2c08, 0xa006, 0x080c, 0xc162, 0x11a0, 0x2011, 0xcc91, 0x2214,
++	0xa286, 0xffff, 0x01c0, 0x2160, 0x6007, 0x0026, 0x6013, 0x1700,
++	0x2011, 0xcc89, 0x2214, 0xa296, 0xffff, 0x1180, 0x6007, 0x0025,
++	0x0068, 0x601c, 0xa086, 0x0007, 0x1d70, 0x6004, 0xa086, 0x0024,
++	0x1110, 0x080c, 0x95e3, 0x2160, 0x6007, 0x0025, 0x6003, 0x0001,
++	0x080c, 0x79df, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c,
++	0x527f, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019,
++	0xc605, 0x2011, 0xcc96, 0x080c, 0xa103, 0x003e, 0x002e, 0x001e,
++	0x015e, 0x0120, 0x6007, 0x0031, 0x0804, 0xb3ea, 0x080c, 0x9df5,
++	0x080c, 0x5f22, 0x11b0, 0x0006, 0x0026, 0x0036, 0x080c, 0x5f3e,
++	0x1158, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, 0x2003,
++	0x0001, 0x080c, 0x5e5a, 0x0010, 0x080c, 0x5ef9, 0x003e, 0x002e,
++	0x000e, 0x0005, 0x080c, 0x2f69, 0x1904, 0xb5ee, 0x080c, 0xb652,
++	0x1904, 0xb2db, 0x6106, 0x080c, 0xb66e, 0x6007, 0x002b, 0x0804,
++	0xb3ea, 0x6007, 0x002c, 0x0804, 0xb3ea, 0x080c, 0xc378, 0x1904,
++	0xb5ee, 0x080c, 0x2f69, 0x1904, 0xb5ee, 0x080c, 0xb652, 0x1904,
++	0xb2db, 0x6106, 0x080c, 0xb672, 0x1120, 0x6007, 0x002e, 0x0804,
++	0xb3ea, 0x6007, 0x002f, 0x0804, 0xb3ea, 0x080c, 0x2f69, 0x1904,
++	0xb5ee, 0x00e6, 0x00d6, 0x00c6, 0x6018, 0xa080, 0x0001, 0x200c,
++	0xa184, 0x00ff, 0xa086, 0x0006, 0x0158, 0xa184, 0xff00, 0x8007,
++	0xa086, 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee, 0x0804, 0xb3ef,
++	0x2001, 0xc672, 0x2004, 0xd0e4, 0x0904, 0xb544, 0x2071, 0xcc8c,
++	0x7010, 0x6036, 0x7014, 0x603a, 0x7108, 0x720c, 0x2001, 0xc653,
++	0x2004, 0xd0a4, 0x0140, 0x6018, 0x2068, 0x6810, 0xa106, 0x1118,
++	0x6814, 0xa206, 0x01f8, 0x2001, 0xc653, 0x2004, 0xd0ac, 0x1590,
++	0x2069, 0xc600, 0x6874, 0xa206, 0x1568, 0x6870, 0xa106, 0x1550,
++	0x7210, 0x080c, 0xac81, 0x0558, 0x080c, 0xc1fc, 0x0540, 0x622a,
++	0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x7999, 0x00ce, 0x00de,
++	0x00ee, 0x0005, 0x7214, 0xa286, 0xffff, 0x0150, 0x080c, 0xac81,
++	0x01b0, 0xa280, 0x0002, 0x2004, 0x7110, 0xa106, 0x1180, 0x0c08,
++	0x7210, 0x2c08, 0xa085, 0x0001, 0x080c, 0xc162, 0x2c10, 0x2160,
++	0x0130, 0x08b8, 0x6007, 0x0037, 0x6013, 0x1500, 0x08d8, 0x6007,
++	0x0037, 0x6013, 0x1700, 0x08b0, 0x6007, 0x0012, 0x0898, 0x080c,
++	0x2f69, 0x1904, 0xb5ee, 0x6018, 0xa080, 0x0001, 0x2004, 0xa084,
++	0xff00, 0x8007, 0xa086, 0x0006, 0x1904, 0xb3ef, 0x00e6, 0x00d6,
++	0x00c6, 0x2001, 0xc672, 0x2004, 0xd0e4, 0x0904, 0xb5b0, 0x2069,
++	0xc600, 0x2071, 0xcc8c, 0x7008, 0x6036, 0x720c, 0x623a, 0xa286,
++	0xffff, 0x1150, 0x7208, 0x00c6, 0x2c08, 0xa085, 0x0001, 0x080c,
++	0xc162, 0x2c10, 0x00ce, 0x0588, 0x080c, 0xac81, 0x0570, 0x00c6,
++	0x0026, 0x2260, 0x080c, 0xa954, 0x002e, 0x00ce, 0x7118, 0xa18c,
++	0xff00, 0x810f, 0xa186, 0x0001, 0x0158, 0xa186, 0x0005, 0x0118,
++	0xa186, 0x0007, 0x1178, 0xa280, 0x0004, 0x2004, 0xa005, 0x0150,
++	0x0056, 0x7510, 0x7614, 0x080c, 0xc213, 0x005e, 0x00ce, 0x00de,
++	0x00ee, 0x0005, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, 0x2a00,
++	0x6003, 0x0001, 0x080c, 0x7999, 0x0c88, 0x6007, 0x003b, 0x602b,
++	0x0009, 0x6013, 0x1700, 0x6003, 0x0001, 0x080c, 0x7999, 0x0c30,
++	0x6007, 0x003b, 0x602b, 0x000b, 0x6013, 0x0000, 0x0804, 0xb51a,
++	0x00e6, 0x0026, 0x080c, 0x570b, 0x0558, 0x080c, 0x568d, 0x080c,
++	0xc3f3, 0x1520, 0x2071, 0xc600, 0x70d4, 0xc085, 0x70d6, 0x00f6,
++	0x2079, 0x0100, 0x72a0, 0xa284, 0x00ff, 0x7072, 0x78e6, 0xa284,
++	0xff00, 0x7274, 0xa205, 0x7076, 0x78ea, 0x00fe, 0x70df, 0x0000,
++	0x2001, 0xc653, 0x2004, 0xd0a4, 0x0120, 0x2011, 0xc940, 0x2013,
++	0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2c62, 0x0010, 0x080c, 0xc41f,
++	0x002e, 0x00ee, 0x080c, 0x95e3, 0x0804, 0xb3ee, 0x080c, 0x95e3,
++	0x0005, 0x2600, 0x0002, 0xb5fc, 0xb630, 0xb641, 0xb5fc, 0xb5fc,
++	0xb5fe, 0xb617, 0xb5fc, 0xb5fc, 0x080c, 0x1519, 0x080c, 0xc378,
++	0x1d68, 0x080c, 0x2f69, 0x1d50, 0x080c, 0xb652, 0x1138, 0x6007,
++	0x0045, 0x6003, 0x0001, 0x080c, 0x79df, 0x0005, 0x080c, 0x2e46,
++	0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x79df, 0x0005, 0x080c,
++	0x2f69, 0x19a0, 0x080c, 0x768f, 0x1160, 0x2e00, 0xa080, 0x0010,
++	0x2004, 0x8007, 0xd084, 0x0110, 0x080c, 0xc428, 0x080c, 0x95e3,
++	0x0005, 0x2009, 0x0046, 0x080c, 0xc44e, 0x080c, 0x95e3, 0x0005,
++	0x080c, 0x2f69, 0x1904, 0xb5ee, 0x2009, 0x0041, 0x080c, 0xc44e,
++	0x6007, 0x0047, 0x6003, 0x0001, 0x080c, 0x79df, 0x080c, 0x7e94,
++	0x0005, 0x080c, 0x2f69, 0x1904, 0xb5ee, 0x2009, 0x0042, 0x080c,
++	0xc44e, 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, 0x79df, 0x080c,
++	0x7e94, 0x0005, 0x00d6, 0x0066, 0x6618, 0x2668, 0x6e04, 0xa6b4,
++	0xff00, 0x8637, 0xa686, 0x0006, 0x0170, 0xa686, 0x0004, 0x0158,
++	0x6e04, 0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0128, 0xa686, 0x0004,
++	0x0110, 0xa085, 0x0001, 0x006e, 0x00de, 0x0005, 0x00d6, 0x0449,
++	0x00de, 0x0005, 0x00d6, 0x0491, 0x11f0, 0x680c, 0xa08c, 0xff00,
++	0x6820, 0xa084, 0x00ff, 0xa115, 0x6212, 0x6824, 0x602a, 0xd1e4,
++	0x0118, 0x2009, 0x0001, 0x0060, 0xd1ec, 0x0168, 0x6920, 0xa18c,
++	0x00ff, 0x6824, 0x080c, 0x29c7, 0x1130, 0x2110, 0x2009, 0x0000,
++	0x080c, 0x2e8b, 0x0018, 0xa085, 0x0001, 0x0008, 0xa006, 0x00de,
++	0x0005, 0x2069, 0xcc8d, 0x6800, 0xa082, 0x0010, 0x1228, 0x6013,
++	0x0000, 0xa085, 0x0001, 0x0008, 0xa006, 0x0005, 0x6013, 0x0000,
++	0x2069, 0xcc8c, 0x6808, 0xa084, 0xff00, 0xa086, 0x0800, 0x1140,
++	0x6800, 0xa084, 0x00ff, 0xa08e, 0x0014, 0x0110, 0xa08e, 0x0010,
++	0x0005, 0x6004, 0xa0b2, 0x0080, 0x1a0c, 0x1519, 0xa1b6, 0x0013,
++	0x1130, 0x2008, 0xa1b2, 0x0040, 0x1a04, 0xb7bb, 0x0092, 0xa1b6,
++	0x0027, 0x0120, 0xa1b6, 0x0014, 0x190c, 0x1519, 0x2001, 0x0007,
++	0x080c, 0x52be, 0x080c, 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94,
++	0x0005, 0xb719, 0xb71b, 0xb719, 0xb719, 0xb719, 0xb71b, 0xb72d,
++	0xb7b4, 0xb77d, 0xb7b4, 0xb790, 0xb7b4, 0xb72d, 0xb7b4, 0xb7ac,
++	0xb7b4, 0xb7ac, 0xb7b4, 0xb7b4, 0xb719, 0xb719, 0xb719, 0xb719,
++	0xb719, 0xb719, 0xb719, 0xb719, 0xb719, 0xb719, 0xb719, 0xb71b,
++	0xb719, 0xb7b4, 0xb719, 0xb719, 0xb7b4, 0xb719, 0xb7b1, 0xb7b4,
++	0xb719, 0xb719, 0xb719, 0xb719, 0xb7b4, 0xb7b4, 0xb719, 0xb7b4,
++	0xb7b4, 0xb719, 0xb727, 0xb719, 0xb719, 0xb719, 0xb719, 0xb7b0,
++	0xb7b4, 0xb719, 0xb719, 0xb7b4, 0xb7b4, 0xb719, 0xb719, 0xb719,
++	0xb719, 0x080c, 0x1519, 0x080c, 0x7db1, 0x2001, 0xc8fd, 0x2004,
++	0x6016, 0x6003, 0x0002, 0x080c, 0x7e94, 0x0804, 0xb7ba, 0x2001,
++	0x0000, 0x080c, 0x527f, 0x0804, 0xb7b4, 0x00f6, 0x2079, 0xc652,
++	0x7804, 0x00fe, 0xd0ac, 0x1904, 0xb7b4, 0x2001, 0x0000, 0x080c,
++	0x527f, 0x6018, 0xa080, 0x0004, 0x2004, 0xa086, 0x00ff, 0x1140,
++	0x00f6, 0x2079, 0xc600, 0x7898, 0x8000, 0x789a, 0x00fe, 0x00e0,
++	0x00c6, 0x6018, 0x2060, 0x6000, 0xd0f4, 0x1140, 0x6010, 0xa005,
++	0x0128, 0x00ce, 0x080c, 0x40ef, 0x0804, 0xb7b4, 0x00ce, 0x2001,
++	0xc600, 0x2004, 0xa086, 0x0002, 0x1138, 0x00f6, 0x2079, 0xc600,
++	0x7898, 0x8000, 0x789a, 0x00fe, 0x2001, 0x0002, 0x080c, 0x5291,
++	0x080c, 0x7db1, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002,
++	0x080c, 0x79df, 0x080c, 0x7e94, 0x00c6, 0x6118, 0x2160, 0x2009,
++	0x0001, 0x080c, 0x6fb9, 0x00ce, 0x04e8, 0x6618, 0x00d6, 0x2668,
++	0x6e04, 0x00de, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0560,
++	0xa686, 0x0004, 0x0548, 0x080c, 0x7669, 0x2001, 0x0004, 0x0410,
++	0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1110, 0x080c, 0x40ef,
++	0x2001, 0x0006, 0x04a1, 0x6618, 0x00d6, 0x2668, 0x6e04, 0x00de,
++	0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0170, 0x2001, 0x0006,
++	0x0048, 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x0401, 0x0020,
++	0x0018, 0x0010, 0x080c, 0x52be, 0x080c, 0x7db1, 0x080c, 0x95e3,
++	0x080c, 0x7e94, 0x0005, 0x2600, 0x0002, 0xb7c6, 0xb7c6, 0xb7c6,
++	0xb7c6, 0xb7c6, 0xb7c8, 0xb7c6, 0xb7c8, 0xb7c6, 0x080c, 0x1519,
++	0x080c, 0x7db1, 0x080c, 0x95e3, 0x080c, 0x7e94, 0x0005, 0x0016,
++	0x00d6, 0x6118, 0x2168, 0x6900, 0xd184, 0x0140, 0x080c, 0x5291,
++	0x2001, 0x0000, 0x080c, 0x527f, 0x080c, 0x2e6c, 0x00de, 0x001e,
++	0x0005, 0x00d6, 0x6618, 0x2668, 0x6804, 0xa084, 0xff00, 0x8007,
++	0x00de, 0xa0b2, 0x000c, 0x1a0c, 0x1519, 0xa1b6, 0x0015, 0x1110,
++	0x003b, 0x0028, 0xa1b6, 0x0016, 0x190c, 0x1519, 0x006b, 0x0005,
++	0x9cda, 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0xb851, 0xb810,
++	0x9cda, 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0x9cda,
++	0x9cda, 0x9cda, 0xb851, 0xb858, 0x9cda, 0x9cda, 0x9cda, 0x9cda,
++	0x00f6, 0x2079, 0xc652, 0x7804, 0xd0ac, 0x11e0, 0x6018, 0xa07d,
++	0x01c8, 0x7800, 0xd0f4, 0x1118, 0x7810, 0xa005, 0x1198, 0x2001,
++	0x0000, 0x080c, 0x527f, 0x2001, 0x0002, 0x080c, 0x5291, 0x601f,
++	0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x79df, 0x080c,
++	0x7e94, 0x00e8, 0x2011, 0xcc83, 0x2204, 0x8211, 0x220c, 0x080c,
++	0x29c7, 0x11a8, 0x00c6, 0x080c, 0x533d, 0x0120, 0x00ce, 0x080c,
++	0x95e3, 0x0068, 0x6010, 0x0006, 0x6014, 0x0006, 0x080c, 0x4f47,
++	0x000e, 0x6016, 0x000e, 0x6012, 0x00ce, 0x080c, 0x95e3, 0x00fe,
++	0x0005, 0x6604, 0xa6b6, 0x001e, 0x1110, 0x080c, 0x95e3, 0x0005,
++	0x080c, 0x9fb6, 0x1138, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c,
++	0x79df, 0x0010, 0x080c, 0x95e3, 0x0005, 0x6004, 0xa08a, 0x0080,
++	0x1a0c, 0x1519, 0x080c, 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94,
++	0x0005, 0xa182, 0x0040, 0x0002, 0xb887, 0xb887, 0xb887, 0xb887,
++	0xb889, 0xb887, 0xb887, 0xb887, 0xb887, 0xb887, 0xb887, 0xb887,
++	0xb887, 0xb887, 0xb887, 0xb887, 0xb887, 0xb887, 0xb887, 0x080c,
++	0x1519, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0046, 0x0026, 0x6218,
++	0xa280, 0x002f, 0x2004, 0xa005, 0x0120, 0x2021, 0x0000, 0x080c,
++	0xc3c4, 0x6106, 0x2071, 0xcc80, 0x7444, 0xa4a4, 0xff00, 0x0904,
++	0xb8ed, 0xa486, 0x2000, 0x1130, 0x2009, 0x0001, 0x2011, 0x0200,
++	0x080c, 0x712e, 0x080c, 0x1602, 0x090c, 0x1519, 0x6003, 0x0007,
++	0x2d00, 0x6837, 0x010d, 0x6803, 0x0000, 0x683b, 0x0000, 0x6c5a,
++	0x2c00, 0x685e, 0x6008, 0x68b2, 0x6018, 0x2078, 0x78a0, 0x8007,
++	0x7130, 0x694a, 0x0016, 0xa084, 0xff00, 0x6846, 0x684f, 0x0000,
++	0x6853, 0x0000, 0x6857, 0x0036, 0x080c, 0x580a, 0x001e, 0xa486,
++	0x2000, 0x1130, 0x2019, 0x0017, 0x080c, 0xc10d, 0x0804, 0xb94a,
++	0xa486, 0x0400, 0x1130, 0x2019, 0x0002, 0x080c, 0xc0bf, 0x0804,
++	0xb94a, 0xa486, 0x0200, 0x1110, 0x080c, 0xc0a4, 0xa486, 0x1000,
++	0x1110, 0x080c, 0xc0f2, 0x0804, 0xb94a, 0x2069, 0xc9bc, 0x6a00,
++	0xd284, 0x0904, 0xb9b1, 0xa284, 0x0300, 0x1904, 0xb9aa, 0x6804,
++	0xa005, 0x0904, 0xb992, 0x2d78, 0x6003, 0x0007, 0x080c, 0x15e5,
++	0x0904, 0xb951, 0x7800, 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806,
++	0x6013, 0x0000, 0x6803, 0x0000, 0x6837, 0x0116, 0x683b, 0x0000,
++	0x6008, 0x68b2, 0x2c00, 0x684a, 0x6018, 0x2078, 0x78a0, 0x8007,
++	0x7130, 0x6986, 0x6846, 0x7928, 0x698a, 0x792c, 0x698e, 0x7930,
++	0x6992, 0x7934, 0x6996, 0x6853, 0x003d, 0x7244, 0xa294, 0x0003,
++	0xa286, 0x0002, 0x1118, 0x684f, 0x0040, 0x0040, 0xa286, 0x0001,
++	0x1118, 0x684f, 0x0080, 0x0010, 0x684f, 0x0000, 0x20a9, 0x000a,
++	0x2001, 0xcc90, 0xad90, 0x0015, 0x200c, 0x810f, 0x2112, 0x8000,
++	0x8210, 0x1f04, 0xb93c, 0x200c, 0x6982, 0x8000, 0x200c, 0x697e,
++	0x080c, 0x580a, 0x002e, 0x004e, 0x015e, 0x00fe, 0x00ee, 0x00de,
++	0x0005, 0x2001, 0xc60e, 0x2004, 0xd084, 0x0120, 0x080c, 0x1602,
++	0x1904, 0xb902, 0x6013, 0x0100, 0x6003, 0x0001, 0x6007, 0x0041,
++	0x080c, 0x7999, 0x080c, 0x7e94, 0x0c28, 0x2069, 0xcc92, 0x2d04,
++	0xa084, 0xff00, 0xa086, 0x1200, 0x11a8, 0x2069, 0xcc80, 0x686c,
++	0xa084, 0x00ff, 0x0016, 0x6110, 0xa18c, 0x0700, 0xa10d, 0x6112,
++	0x001e, 0x6003, 0x0001, 0x6007, 0x0043, 0x080c, 0x7999, 0x080c,
++	0x7e94, 0x0840, 0x6868, 0x602a, 0x686c, 0x602e, 0x6013, 0x0200,
++	0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x7999, 0x080c, 0x7e94,
++	0x0804, 0xb94a, 0x2001, 0xc60d, 0x2004, 0xd0ec, 0x0120, 0x2011,
++	0x8049, 0x080c, 0x407d, 0x6013, 0x0300, 0x0010, 0x6013, 0x0100,
++	0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x7999, 0x080c, 0x7e94,
++	0x0804, 0xb94a, 0x6013, 0x0500, 0x0c98, 0x6013, 0x0600, 0x0804,
++	0xb965, 0x6013, 0x0200, 0x0804, 0xb965, 0xa186, 0x0013, 0x1170,
++	0x6004, 0xa08a, 0x0040, 0x0a0c, 0x1519, 0xa08a, 0x0053, 0x1a0c,
++	0x1519, 0xa082, 0x0040, 0x2008, 0x0804, 0xba3f, 0xa186, 0x0051,
++	0x0138, 0xa186, 0x0047, 0x11d8, 0x6004, 0xa086, 0x0041, 0x0518,
++	0x2001, 0x0109, 0x2004, 0xd084, 0x01f0, 0x0126, 0x2091, 0x2800,
++	0x0006, 0x0016, 0x0026, 0x080c, 0x7873, 0x002e, 0x001e, 0x000e,
++	0x012e, 0x6000, 0xa086, 0x0002, 0x1170, 0x0804, 0xba82, 0xa186,
++	0x0027, 0x0120, 0xa186, 0x0014, 0x190c, 0x1519, 0x6004, 0xa082,
++	0x0040, 0x2008, 0x001a, 0x080c, 0x962a, 0x0005, 0xba09, 0xba0b,
++	0xba0b, 0xba2f, 0xba09, 0xba09, 0xba09, 0xba09, 0xba09, 0xba09,
++	0xba09, 0xba09, 0xba09, 0xba09, 0xba09, 0xba09, 0xba09, 0xba09,
++	0xba09, 0x080c, 0x1519, 0x080c, 0x7db1, 0x080c, 0x7e94, 0x0036,
++	0x00d6, 0x6010, 0xa06d, 0x01c0, 0xad84, 0xf000, 0x01a8, 0x6003,
++	0x0002, 0x6018, 0x2004, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c,
++	0xc141, 0x6013, 0x0000, 0x6014, 0xa005, 0x1120, 0x2001, 0xc8fe,
++	0x2004, 0x6016, 0x6003, 0x0007, 0x00de, 0x003e, 0x0005, 0x00d6,
++	0x080c, 0x7db1, 0x080c, 0x7e94, 0x080c, 0xac91, 0x0120, 0x6010,
++	0x2068, 0x080c, 0x1619, 0x080c, 0xae54, 0x00de, 0x0005, 0x0002,
++	0xba53, 0xba70, 0xba5c, 0xba7c, 0xba53, 0xba53, 0xba53, 0xba53,
++	0xba53, 0xba53, 0xba53, 0xba53, 0xba53, 0xba53, 0xba53, 0xba53,
++	0xba53, 0xba53, 0xba53, 0x080c, 0x1519, 0x6010, 0xa088, 0x0013,
++	0x2104, 0xa085, 0x0400, 0x200a, 0x080c, 0x7db1, 0x6010, 0xa080,
++	0x0013, 0x2004, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043,
++	0x080c, 0x9613, 0x0010, 0x6003, 0x0002, 0x080c, 0x7e94, 0x0005,
++	0x080c, 0x7db1, 0x080c, 0xc37f, 0x1120, 0x080c, 0x7103, 0x080c,
++	0x95e3, 0x080c, 0x7e94, 0x0005, 0x080c, 0x7db1, 0x2009, 0x0041,
++	0x0804, 0xbbcb, 0xa182, 0x0040, 0x0002, 0xba98, 0xba9a, 0xba98,
++	0xba98, 0xba98, 0xba98, 0xba98, 0xba9b, 0xba98, 0xba98, 0xba98,
++	0xba98, 0xba98, 0xba98, 0xba98, 0xba98, 0xba98, 0xbaa6, 0xba98,
++	0x080c, 0x1519, 0x0005, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005,
++	0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1870, 0x0005, 0x00d6, 0x080c,
++	0x7103, 0x00de, 0x080c, 0xc3e2, 0x080c, 0x95e3, 0x0005, 0xa182,
++	0x0040, 0x0002, 0xbac5, 0xbac5, 0xbac5, 0xbac5, 0xbac5, 0xbac5,
++	0xbac5, 0xbac7, 0xbac5, 0xbaca, 0xbb03, 0xbac5, 0xbac5, 0xbac5,
++	0xbac5, 0xbb03, 0xbac5, 0xbac5, 0xbac5, 0x080c, 0x1519, 0x080c,
++	0x962a, 0x0005, 0x2001, 0xc672, 0x2004, 0xd0e4, 0x0158, 0x2001,
++	0x0100, 0x2004, 0xa082, 0x0005, 0x0228, 0x2001, 0x011f, 0x2004,
++	0x6036, 0x0010, 0x6037, 0x0000, 0x080c, 0x7e47, 0x080c, 0x7f6e,
++	0x6010, 0x00d6, 0x2068, 0x684c, 0xd0fc, 0x0150, 0xa08c, 0x0003,
++	0xa18e, 0x0002, 0x0168, 0x2009, 0x0041, 0x00de, 0x0804, 0xbbcb,
++	0x6003, 0x0007, 0x6017, 0x0000, 0x080c, 0x7103, 0x00de, 0x0005,
++	0x080c, 0xc37f, 0x0110, 0x00de, 0x0005, 0x080c, 0x7103, 0x080c,
++	0x95e3, 0x00de, 0x0ca0, 0x0036, 0x080c, 0x7e47, 0x080c, 0x7f6e,
++	0x6010, 0x00d6, 0x2068, 0x6018, 0x2004, 0xd0bc, 0x0188, 0x684c,
++	0xa084, 0x0003, 0xa086, 0x0002, 0x0140, 0x687c, 0x632c, 0xa31a,
++	0x632e, 0x6880, 0x6328, 0xa31b, 0x632a, 0x6003, 0x0002, 0x0080,
++	0x2019, 0x0004, 0x080c, 0xc141, 0x6014, 0xa005, 0x1128, 0x2001,
++	0xc8fe, 0x2004, 0x8003, 0x6016, 0x6013, 0x0000, 0x6003, 0x0007,
++	0x00de, 0x003e, 0x0005, 0xa186, 0x0013, 0x1150, 0x6004, 0xa086,
++	0x0042, 0x190c, 0x1519, 0x080c, 0x7db1, 0x080c, 0x7e94, 0x0005,
++	0xa186, 0x0027, 0x0118, 0xa186, 0x0014, 0x1180, 0x6004, 0xa086,
++	0x0042, 0x190c, 0x1519, 0x2001, 0x0007, 0x080c, 0x52be, 0x080c,
++	0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, 0x0005, 0xa182, 0x0040,
++	0x0002, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c,
++	0xbb6e, 0xbb7a, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c,
++	0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, 0x080c, 0x1519, 0x0036, 0x0046,
++	0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1870, 0x004e,
++	0x003e, 0x0005, 0x6010, 0x00d6, 0x2068, 0x6810, 0x6a14, 0x0006,
++	0x0046, 0x0056, 0x6c7c, 0xa422, 0x6d80, 0x2200, 0xa52b, 0x602c,
++	0xa420, 0x642e, 0x6028, 0xa529, 0x652a, 0x005e, 0x004e, 0x000e,
++	0xa20d, 0x1178, 0x684c, 0xd0fc, 0x0120, 0x2009, 0x0041, 0x00de,
++	0x0490, 0x6003, 0x0007, 0x6017, 0x0000, 0x080c, 0x7103, 0x00de,
++	0x0005, 0x0006, 0x00f6, 0x2c78, 0x080c, 0x56c3, 0x00fe, 0x000e,
++	0x0120, 0x6003, 0x0002, 0x00de, 0x0005, 0x2009, 0xc60d, 0x210c,
++	0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006, 0x0021,
++	0x080c, 0x7105, 0x00de, 0x0005, 0xd2fc, 0x0140, 0x8002, 0x8000,
++	0x8212, 0xa291, 0x0000, 0x2009, 0x0009, 0x0010, 0x2009, 0x0015,
++	0x6a6a, 0x6866, 0x0005, 0xa182, 0x0040, 0x0208, 0x0062, 0xa186,
++	0x0013, 0x0120, 0xa186, 0x0014, 0x190c, 0x1519, 0x6020, 0xd0dc,
++	0x090c, 0x1519, 0x0005, 0xbbee, 0xbbf5, 0xbc01, 0xbc0d, 0xbbee,
++	0xbbee, 0xbbee, 0xbc1c, 0xbbee, 0xbbf0, 0xbbf0, 0xbbee, 0xbbee,
++	0xbbee, 0xbbee, 0xbbf0, 0xbbee, 0xbbf0, 0xbbee, 0x080c, 0x1519,
++	0x6020, 0xd0dc, 0x090c, 0x1519, 0x0005, 0x6003, 0x0001, 0x6106,
++	0x080c, 0x7999, 0x0126, 0x2091, 0x8000, 0x080c, 0x7e94, 0x012e,
++	0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x7999, 0x0126, 0x2091,
++	0x8000, 0x080c, 0x7e94, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106,
++	0x2c10, 0x080c, 0x2068, 0x0126, 0x2091, 0x8000, 0x080c, 0x79fc,
++	0x080c, 0x7f6e, 0x012e, 0x0005, 0xa016, 0x080c, 0x1870, 0x0005,
++	0x0126, 0x2091, 0x8000, 0x0036, 0x00d6, 0xa182, 0x0040, 0x0023,
++	0x00de, 0x003e, 0x012e, 0x0005, 0xbc3c, 0xbc3e, 0xbc50, 0xbc6b,
++	0xbc3c, 0xbc3c, 0xbc3c, 0xbc80, 0xbc3c, 0xbc3c, 0xbc3c, 0xbc3c,
++	0xbc3c, 0xbc3c, 0xbc3c, 0xbc3c, 0x080c, 0x1519, 0x6010, 0x2068,
++	0x684c, 0xd0fc, 0x01f8, 0xa09c, 0x0003, 0xa39e, 0x0003, 0x01d0,
++	0x6003, 0x0001, 0x6106, 0x080c, 0x7999, 0x080c, 0x7e94, 0x0498,
++	0x6010, 0x2068, 0x684c, 0xd0fc, 0x0168, 0xa09c, 0x0003, 0xa39e,
++	0x0003, 0x0140, 0x6003, 0x0001, 0x6106, 0x080c, 0x7999, 0x080c,
++	0x7e94, 0x0408, 0x6013, 0x0000, 0x6017, 0x0000, 0x2019, 0x0004,
++	0x080c, 0xc141, 0x00c0, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0d90,
++	0xa09c, 0x0003, 0xa39e, 0x0003, 0x0d68, 0x6003, 0x0003, 0x6106,
++	0x2c10, 0x080c, 0x2068, 0x080c, 0x79fc, 0x080c, 0x7f6e, 0x0018,
++	0xa016, 0x080c, 0x1870, 0x0005, 0x080c, 0x7db1, 0x6110, 0x81ff,
++	0x0158, 0x00d6, 0x2168, 0x080c, 0xc4d7, 0x0036, 0x2019, 0x0029,
++	0x080c, 0xc141, 0x003e, 0x00de, 0x080c, 0xae54, 0x080c, 0x7e94,
++	0x0005, 0x080c, 0x7e47, 0x6110, 0x81ff, 0x0158, 0x00d6, 0x2168,
++	0x080c, 0xc4d7, 0x0036, 0x2019, 0x0029, 0x080c, 0xc141, 0x003e,
++	0x00de, 0x080c, 0xae54, 0x080c, 0x7f6e, 0x0005, 0xa182, 0x0085,
++	0x0002, 0xbcba, 0xbcb8, 0xbcb8, 0xbcc6, 0xbcb8, 0xbcb8, 0xbcb8,
++	0x080c, 0x1519, 0x6003, 0x000b, 0x6106, 0x080c, 0x7999, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x7e94, 0x012e, 0x0005, 0x0026, 0x00e6,
++	0x080c, 0xc378, 0x0118, 0x080c, 0x95e3, 0x00d8, 0x2071, 0xcc80,
++	0x7224, 0x6212, 0x7220, 0x080c, 0xbfef, 0x0118, 0x6007, 0x0086,
++	0x0040, 0x6007, 0x0087, 0x7224, 0xa296, 0xffff, 0x1110, 0x6007,
++	0x0086, 0x6003, 0x0001, 0x080c, 0x7999, 0x080c, 0x7e94, 0x080c,
++	0x7f6e, 0x00ee, 0x002e, 0x0005, 0xa186, 0x0013, 0x1160, 0x6004,
++	0xa08a, 0x0085, 0x0a0c, 0x1519, 0xa08a, 0x008c, 0x1a0c, 0x1519,
++	0xa082, 0x0085, 0x00a2, 0xa186, 0x0027, 0x0130, 0xa186, 0x0014,
++	0x0118, 0x080c, 0x962a, 0x0050, 0x2001, 0x0007, 0x080c, 0x52be,
++	0x080c, 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, 0x0005, 0xbd16,
++	0xbd18, 0xbd18, 0xbd16, 0xbd16, 0xbd16, 0xbd16, 0x080c, 0x1519,
++	0x080c, 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, 0x0005, 0xa182,
++	0x0085, 0x0a0c, 0x1519, 0xa182, 0x008c, 0x1a0c, 0x1519, 0xa182,
++	0x0085, 0x0002, 0xbd31, 0xbd31, 0xbd31, 0xbd33, 0xbd31, 0xbd31,
++	0xbd31, 0x080c, 0x1519, 0x0005, 0xa186, 0x0013, 0x0148, 0xa186,
++	0x0014, 0x0130, 0xa186, 0x0027, 0x0118, 0x080c, 0x962a, 0x0030,
++	0x080c, 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, 0x0005, 0x0036,
++	0x080c, 0xc3e2, 0x603f, 0x0000, 0x2019, 0x000b, 0x0031, 0x601f,
++	0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, 0x2091,
++	0x8000, 0x0086, 0x2c40, 0x0096, 0x2049, 0x0000, 0x080c, 0x8fc9,
++	0x009e, 0x008e, 0x1578, 0x0076, 0x2c38, 0x080c, 0x906f, 0x007e,
++	0x1548, 0x6000, 0xa086, 0x0000, 0x0528, 0x601c, 0xa086, 0x0007,
++	0x0508, 0x00d6, 0x6000, 0xa086, 0x0004, 0x1150, 0x080c, 0xc3e2,
++	0x601f, 0x0007, 0x2001, 0xc8fd, 0x2004, 0x6016, 0x080c, 0x1953,
++	0x6010, 0x2068, 0x080c, 0xac91, 0x0110, 0x080c, 0xc141, 0x00de,
++	0x6013, 0x0000, 0x080c, 0xc3e2, 0x601f, 0x0007, 0x2001, 0xc8fd,
++	0x2004, 0x6016, 0x003e, 0x012e, 0x0005, 0x00f6, 0x00c6, 0x0036,
++	0x0156, 0x2079, 0xcc80, 0x7938, 0x783c, 0x080c, 0x29c7, 0x15b0,
++	0x0016, 0x00c6, 0x080c, 0x533d, 0x1578, 0x001e, 0x002e, 0x0026,
++	0x0016, 0x2019, 0x0029, 0x080c, 0x9132, 0x080c, 0x7b16, 0x0076,
++	0x2039, 0x0000, 0x080c, 0x7a0e, 0x007e, 0x001e, 0x0076, 0x2039,
++	0x0000, 0x080c, 0xbef7, 0x007e, 0x080c, 0x553e, 0x0026, 0x6204,
++	0xa294, 0xff00, 0x8217, 0xa286, 0x0006, 0x0118, 0xa286, 0x0004,
++	0x1118, 0x62a0, 0x080c, 0x2eff, 0x002e, 0x001e, 0x080c, 0x4f47,
++	0x6612, 0x6516, 0xa006, 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e,
++	0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x2009,
++	0xc621, 0x2104, 0xa086, 0x0074, 0x1904, 0xbe30, 0x2069, 0xcc8e,
++	0x690c, 0xa182, 0x0100, 0x06c0, 0x6908, 0xa184, 0x8000, 0x05e8,
++	0x2001, 0xc8e5, 0x2004, 0xa005, 0x1160, 0x6018, 0x2070, 0x7010,
++	0xa084, 0x00ff, 0x0118, 0x7000, 0xd0f4, 0x0118, 0xa184, 0x0800,
++	0x0560, 0x6910, 0xa18a, 0x0001, 0x0610, 0x6914, 0x2069, 0xccae,
++	0x6904, 0x81ff, 0x1198, 0x690c, 0xa182, 0x0100, 0x02a8, 0x6908,
++	0x81ff, 0x1178, 0x6910, 0xa18a, 0x0001, 0x0288, 0x6918, 0xa18a,
++	0x0001, 0x0298, 0x00d0, 0x6013, 0x0100, 0x00a0, 0x6013, 0x0300,
++	0x0088, 0x6013, 0x0500, 0x0070, 0x6013, 0x0700, 0x0058, 0x6013,
++	0x0900, 0x0040, 0x6013, 0x0b00, 0x0028, 0x6013, 0x0f00, 0x0010,
++	0x6013, 0x2d00, 0xa085, 0x0001, 0x0008, 0xa006, 0x001e, 0x00ee,
++	0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x0026, 0x0036, 0x0156,
++	0x6218, 0x2268, 0x6b04, 0xa394, 0x00ff, 0xa286, 0x0006, 0x0190,
++	0xa286, 0x0004, 0x0178, 0xa394, 0xff00, 0x8217, 0xa286, 0x0006,
++	0x0148, 0xa286, 0x0004, 0x0130, 0x00c6, 0x2d60, 0x080c, 0x534c,
++	0x00ce, 0x04c0, 0x2011, 0xcc96, 0xad98, 0x000a, 0x20a9, 0x0004,
++	0x080c, 0xa103, 0x1580, 0x2011, 0xcc9a, 0xad98, 0x0006, 0x20a9,
++	0x0004, 0x080c, 0xa103, 0x1538, 0x0046, 0x0016, 0x6aa0, 0xa294,
++	0x00ff, 0x8227, 0xa006, 0x2009, 0xc653, 0x210c, 0xd1a4, 0x0138,
++	0x2009, 0x0029, 0x080c, 0xc190, 0x6800, 0xc0e5, 0x6802, 0x2019,
++	0x0029, 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a0e,
++	0x2c08, 0x080c, 0xbef7, 0x007e, 0x2001, 0x0007, 0x080c, 0x52be,
++	0x001e, 0x004e, 0xa006, 0x015e, 0x003e, 0x002e, 0x00de, 0x00ce,
++	0x0005, 0x00d6, 0x2069, 0xcc8e, 0x6800, 0xa086, 0x0800, 0x0118,
++	0x6013, 0x0000, 0x0008, 0xa006, 0x00de, 0x0005, 0x00c6, 0x00f6,
++	0x0016, 0x0026, 0x0036, 0x0156, 0x2079, 0xcc8c, 0x7930, 0x7834,
++	0x080c, 0x29c7, 0x11a0, 0x080c, 0x533d, 0x1188, 0x2011, 0xcc90,
++	0xac98, 0x000a, 0x20a9, 0x0004, 0x080c, 0xa103, 0x1140, 0x2011,
++	0xcc94, 0xac98, 0x0006, 0x20a9, 0x0004, 0x080c, 0xa103, 0x015e,
++	0x003e, 0x002e, 0x001e, 0x00fe, 0x00ce, 0x0005, 0x00c6, 0x0006,
++	0x0016, 0x0026, 0x0036, 0x0156, 0x2011, 0xcc83, 0x2204, 0x8211,
++	0x220c, 0x080c, 0x29c7, 0x11a0, 0x080c, 0x533d, 0x1188, 0x2011,
++	0xcc96, 0xac98, 0x000a, 0x20a9, 0x0004, 0x080c, 0xa103, 0x1140,
++	0x2011, 0xcc9a, 0xac98, 0x0006, 0x20a9, 0x0004, 0x080c, 0xa103,
++	0x015e, 0x003e, 0x002e, 0x001e, 0x000e, 0x00ce, 0x0005, 0x00e6,
++	0x00c6, 0x0086, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0126,
++	0x2091, 0x8000, 0x2740, 0x2029, 0xc930, 0x252c, 0x2021, 0xc936,
++	0x2424, 0x2061, 0xce00, 0x2071, 0xc600, 0x7648, 0x7068, 0x81ff,
++	0x0150, 0x0006, 0xa186, 0xca3c, 0x000e, 0x0128, 0x8001, 0xa602,
++	0x1a04, 0xbf78, 0x0018, 0xa606, 0x0904, 0xbf78, 0x2100, 0xac06,
++	0x0904, 0xbf6f, 0x080c, 0xc1b8, 0x0904, 0xbf6f, 0x671c, 0xa786,
++	0x0001, 0x0904, 0xbfc1, 0xa786, 0x0004, 0x0904, 0xbfc1, 0xa786,
++	0x0007, 0x05e8, 0x2500, 0xac06, 0x05d0, 0x2400, 0xac06, 0x05b8,
++	0x080c, 0xc1c8, 0x15a0, 0x88ff, 0x0118, 0x6050, 0xa906, 0x1578,
++	0x00d6, 0x6000, 0xa086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1953,
++	0x001e, 0xa786, 0x0008, 0x1148, 0x080c, 0xae8f, 0x1130, 0x080c,
++	0x9c09, 0x00de, 0x080c, 0xae54, 0x00d0, 0x6010, 0x2068, 0x080c,
++	0xac91, 0x0190, 0xa786, 0x0003, 0x1528, 0x6837, 0x0103, 0x6b4a,
++	0x6847, 0x0000, 0x080c, 0xc4d7, 0x0016, 0x080c, 0xaf03, 0x080c,
++	0x580a, 0x001e, 0x080c, 0xae48, 0x00de, 0x080c, 0xae54, 0xace0,
++	0x0018, 0x2001, 0xc617, 0x2004, 0xac02, 0x1210, 0x0804, 0xbf0b,
++	0x012e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce,
++	0x00ee, 0x0005, 0xa786, 0x0006, 0x1150, 0xa386, 0x0005, 0x0128,
++	0x080c, 0xc4d7, 0x080c, 0xc141, 0x08f8, 0x00de, 0x0c00, 0xa786,
++	0x0009, 0x1548, 0x6000, 0xa086, 0x0004, 0x1128, 0x00c6, 0x080c,
++	0x761a, 0x00ce, 0x00e8, 0x6000, 0xa086, 0x0003, 0x11c8, 0x080c,
++	0x7e47, 0x00e6, 0x00d6, 0x6110, 0x2168, 0x080c, 0xac91, 0x0140,
++	0x6018, 0x2070, 0x70b3, 0x0000, 0x70b7, 0x0000, 0x080c, 0x580a,
++	0x00de, 0x00ee, 0x00c6, 0x080c, 0x95e3, 0x00ce, 0x080c, 0x7f6e,
++	0x00de, 0x0804, 0xbf6f, 0xa786, 0x000a, 0x0904, 0xbf5f, 0x0804,
++	0xbf5d, 0x080c, 0xc1c8, 0x1904, 0xbf6f, 0x81ff, 0x0904, 0xbf6f,
++	0xa180, 0x0001, 0x2004, 0xa086, 0x0018, 0x0138, 0xa180, 0x0001,
++	0x2004, 0xa086, 0x002d, 0x1904, 0xbf6f, 0x6000, 0xa086, 0x0002,
++	0x1904, 0xbf6f, 0x080c, 0xae7e, 0x0138, 0x080c, 0xae8f, 0x1904,
++	0xbf6f, 0x080c, 0x9c09, 0x0038, 0x080c, 0x2e6c, 0x080c, 0xae8f,
++	0x1110, 0x080c, 0x9c09, 0x080c, 0xae54, 0x0804, 0xbf6f, 0x00c6,
++	0x00e6, 0x0016, 0x2c08, 0x2170, 0xa006, 0x080c, 0xc162, 0x001e,
++	0x0120, 0x601c, 0xa084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005,
++	0xc008, 0xc008, 0xc008, 0xc008, 0xc008, 0xc008, 0xc00a, 0xc008,
++	0xa006, 0x0005, 0x0046, 0x0016, 0x7018, 0xa080, 0x0028, 0x2024,
++	0xa4a4, 0x00ff, 0x8427, 0x2c00, 0x2009, 0x0020, 0x080c, 0xc190,
++	0x001e, 0x004e, 0x0036, 0x2019, 0x0002, 0x080c, 0xbd55, 0x003e,
++	0xa085, 0x0001, 0x0005, 0x2001, 0x0001, 0x080c, 0x527f, 0x0156,
++	0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0xc605, 0x2011,
++	0xcc96, 0x080c, 0xa103, 0x003e, 0x002e, 0x001e, 0x015e, 0xa005,
++	0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0026,
++	0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0xce00, 0x2079, 0x0001,
++	0x8fff, 0x0904, 0xc097, 0x2071, 0xc600, 0x7648, 0x7068, 0x8001,
++	0xa602, 0x1a04, 0xc097, 0x88ff, 0x0128, 0x2800, 0xac06, 0x15b0,
++	0x2079, 0x0000, 0x080c, 0xc1b8, 0x0588, 0x2400, 0xac06, 0x0570,
++	0x671c, 0xa786, 0x0006, 0x1550, 0xa786, 0x0007, 0x0538, 0x88ff,
++	0x1140, 0x6018, 0xa206, 0x1510, 0x85ff, 0x0118, 0x6050, 0xa106,
++	0x11e8, 0x00d6, 0x6000, 0xa086, 0x0004, 0x1150, 0x080c, 0xc3e2,
++	0x601f, 0x0007, 0x2001, 0xc8fd, 0x2004, 0x6016, 0x080c, 0x1953,
++	0x6010, 0x2068, 0x080c, 0xac91, 0x0120, 0x0046, 0x080c, 0xc141,
++	0x004e, 0x00de, 0x080c, 0xae54, 0x88ff, 0x1198, 0xace0, 0x0018,
++	0x2001, 0xc617, 0x2004, 0xac02, 0x1210, 0x0804, 0xc048, 0xa006,
++	0x012e, 0x002e, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, 0x00fe,
++	0x0005, 0xa8c5, 0x0001, 0x0ca0, 0x0076, 0x0056, 0x0086, 0x2041,
++	0x0000, 0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, 0x6218, 0x0096,
++	0x2049, 0x0000, 0x080c, 0x8fc9, 0x009e, 0x008e, 0x2039, 0x0000,
++	0x080c, 0x906f, 0x080c, 0xc039, 0x005e, 0x007e, 0x0005, 0x0026,
++	0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128, 0x20a9,
++	0x007f, 0x2009, 0x0000, 0x0016, 0x0036, 0x080c, 0x533d, 0x11b0,
++	0x2c10, 0x0056, 0x0086, 0x2041, 0x0000, 0x2508, 0x2029, 0x0001,
++	0x0096, 0x2049, 0x0000, 0x080c, 0x8fc9, 0x009e, 0x008e, 0x2039,
++	0x0000, 0x080c, 0x906f, 0x080c, 0xc039, 0x005e, 0x003e, 0x001e,
++	0x8108, 0x1f04, 0xc0cb, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e,
++	0x002e, 0x0005, 0x0076, 0x0056, 0x6218, 0x0086, 0x2041, 0x0000,
++	0x2029, 0x0001, 0x2019, 0x0048, 0x0096, 0x2049, 0x0000, 0x080c,
++	0x8fc9, 0x009e, 0x008e, 0x2039, 0x0000, 0x080c, 0x906f, 0x2c20,
++	0x080c, 0xc039, 0x005e, 0x007e, 0x0005, 0x0026, 0x0046, 0x0056,
++	0x0076, 0x00c6, 0x0156, 0x2c20, 0x20a9, 0x007f, 0x2009, 0x0000,
++	0x0016, 0x0036, 0x080c, 0x533d, 0x11c0, 0x2c10, 0x0086, 0x2041,
++	0x0000, 0x2828, 0x0046, 0x2021, 0x0001, 0x080c, 0xc3c4, 0x004e,
++	0x0096, 0x2049, 0x0000, 0x080c, 0x8fc9, 0x009e, 0x008e, 0x2039,
++	0x0000, 0x080c, 0x906f, 0x080c, 0xc039, 0x003e, 0x001e, 0x8108,
++	0x1f04, 0xc118, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x002e,
++	0x0005, 0x0016, 0x00f6, 0x3800, 0xd08c, 0x0130, 0xad82, 0x1000,
++	0x02b0, 0xad82, 0xc600, 0x0230, 0xad82, 0xfe00, 0x0280, 0xad82,
++	0xffff, 0x1268, 0x6800, 0xa07d, 0x0138, 0x6803, 0x0000, 0x6b52,
++	0x080c, 0x580a, 0x2f68, 0x0cb0, 0x6b52, 0x080c, 0x580a, 0x00fe,
++	0x001e, 0x0005, 0x00e6, 0x0046, 0x0036, 0x2061, 0xce00, 0xa005,
++	0x1138, 0x2071, 0xc600, 0x7448, 0x7068, 0x8001, 0xa402, 0x12d8,
++	0x2100, 0xac06, 0x0168, 0x6000, 0xa086, 0x0000, 0x0148, 0x6008,
++	0xa206, 0x1130, 0x6018, 0xa1a0, 0x0006, 0x2424, 0xa406, 0x0140,
++	0xace0, 0x0018, 0x2001, 0xc617, 0x2004, 0xac02, 0x1220, 0x0c40,
++	0xa085, 0x0001, 0x0008, 0xa006, 0x003e, 0x004e, 0x00ee, 0x0005,
++	0x00d6, 0x0006, 0x080c, 0x1602, 0x000e, 0x090c, 0x1519, 0x6837,
++	0x010d, 0x685e, 0x0026, 0x2010, 0x080c, 0xac81, 0x2001, 0x0000,
++	0x0120, 0x2200, 0xa080, 0x0014, 0x2004, 0x002e, 0x684a, 0x6956,
++	0x6c46, 0x684f, 0x0000, 0x2001, 0xc905, 0x2004, 0x6852, 0xa006,
++	0x68b2, 0x6802, 0x683a, 0x685a, 0x080c, 0x580a, 0x00de, 0x0005,
++	0x6700, 0xa786, 0x0000, 0x0158, 0xa786, 0x0001, 0x0140, 0xa786,
++	0x000a, 0x0128, 0xa786, 0x0009, 0x0110, 0xa085, 0x0001, 0x0005,
++	0x00e6, 0x6018, 0x2070, 0x70a0, 0xa206, 0x00ee, 0x0005, 0x0016,
++	0x6004, 0xa08e, 0x001e, 0x11a0, 0x8007, 0x6130, 0xa18c, 0x00ff,
++	0xa105, 0x6032, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0005,
++	0x2001, 0xc8fe, 0x2004, 0x6016, 0x080c, 0x7999, 0x080c, 0x7e94,
++	0x001e, 0x0005, 0xe000, 0xe000, 0x0005, 0x6020, 0xd0e4, 0x0158,
++	0xd0cc, 0x0118, 0x080c, 0xaf6c, 0x0030, 0x080c, 0xc3e2, 0x080c,
++	0x7103, 0x080c, 0x95e3, 0x0005, 0xa280, 0x0007, 0x2004, 0xa084,
++	0x000f, 0x0002, 0xc20b, 0xc20b, 0xc20b, 0xc210, 0xc20b, 0xc20d,
++	0xc20d, 0xc20b, 0xc20d, 0xa006, 0x0005, 0x00c6, 0x2260, 0x00ce,
++	0xa085, 0x0001, 0x0005, 0xa280, 0x0007, 0x2004, 0xa084, 0x000f,
++	0x0002, 0xc222, 0xc222, 0xc222, 0xc222, 0xc222, 0xc222, 0xc22d,
++	0xc222, 0xc222, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, 0x2a00,
++	0x6003, 0x0001, 0x080c, 0x7999, 0x0005, 0x00c6, 0x2260, 0x080c,
++	0xc3e2, 0x603f, 0x0000, 0x6020, 0xc0f4, 0xc0cc, 0x6022, 0x6037,
++	0x0000, 0x00ce, 0x00d6, 0x2268, 0xa186, 0x0007, 0x1904, 0xc288,
++	0x6810, 0xa005, 0x0138, 0xa080, 0x0013, 0x2004, 0xd0fc, 0x1110,
++	0x00de, 0x08c0, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, 0x7999,
++	0x080c, 0x7e94, 0x00c6, 0x2d60, 0x6100, 0xa186, 0x0002, 0x1904,
++	0xc311, 0x6010, 0xa005, 0x1138, 0x6000, 0xa086, 0x0007, 0x190c,
++	0x1519, 0x0804, 0xc311, 0xa08c, 0xf000, 0x1130, 0x0028, 0x2068,
++	0x6800, 0xa005, 0x1de0, 0x2d00, 0xa080, 0x0013, 0x2004, 0xa084,
++	0x0003, 0xa086, 0x0002, 0x1180, 0x6010, 0x2068, 0x684c, 0xc0dc,
++	0xc0f4, 0x684e, 0x6850, 0xc0f4, 0xc0fc, 0x6852, 0x2009, 0x0043,
++	0x080c, 0xbbcb, 0x0804, 0xc311, 0x2009, 0x0041, 0x0804, 0xc30b,
++	0xa186, 0x0005, 0x15f0, 0x6810, 0xa080, 0x0013, 0x2004, 0xd0bc,
++	0x1118, 0x00de, 0x0804, 0xc222, 0xd0b4, 0x0128, 0xd0fc, 0x090c,
++	0x1519, 0x0804, 0xc240, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c,
++	0x7999, 0x080c, 0x7e94, 0x00c6, 0x2d60, 0x6100, 0xa186, 0x0002,
++	0x0120, 0xa186, 0x0004, 0x1904, 0xc311, 0x2071, 0xc96a, 0x7000,
++	0xa086, 0x0003, 0x1128, 0x7004, 0xac06, 0x1110, 0x7003, 0x0000,
++	0x6810, 0xa080, 0x0013, 0x200c, 0xc1f4, 0xc1dc, 0x2102, 0x8000,
++	0x200c, 0xc1f4, 0xc1fc, 0xc1bc, 0x2102, 0x2009, 0x0042, 0x0804,
++	0xc30b, 0x0036, 0x00d6, 0x00d6, 0x080c, 0x1602, 0x003e, 0x090c,
++	0x1519, 0x6837, 0x010d, 0x6803, 0x0000, 0x683b, 0x0000, 0x685b,
++	0x0000, 0x6b5e, 0x6857, 0x0045, 0x2c00, 0x6862, 0x6034, 0x6872,
++	0x2360, 0x6020, 0xc0dd, 0x6022, 0x6018, 0xa080, 0x0028, 0x2004,
++	0xa084, 0x00ff, 0x8007, 0x6350, 0x6b4a, 0x6846, 0x684f, 0x0000,
++	0x6853, 0x0000, 0x6d6a, 0x6e66, 0x686f, 0x0001, 0x080c, 0x580a,
++	0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xbd55, 0x2d00, 0x600a,
++	0x601f, 0x0006, 0x6003, 0x0007, 0x6017, 0x0000, 0x603f, 0x0000,
++	0x00de, 0x003e, 0x0038, 0x603f, 0x0000, 0x6003, 0x0007, 0x080c,
++	0xbbcb, 0x00ce, 0x00de, 0x0005, 0xa186, 0x0013, 0x1128, 0x6004,
++	0xa082, 0x0085, 0x2008, 0x00c2, 0xa186, 0x0027, 0x1178, 0x080c,
++	0x7db1, 0x0036, 0x00d6, 0x6010, 0x2068, 0x2019, 0x0004, 0x080c,
++	0xc141, 0x00de, 0x003e, 0x080c, 0x7e94, 0x0005, 0xa186, 0x0014,
++	0x0d70, 0x080c, 0x962a, 0x0005, 0xc33d, 0xc33b, 0xc33b, 0xc33b,
++	0xc33b, 0xc33b, 0xc33d, 0x080c, 0x1519, 0x080c, 0x7db1, 0x6003,
++	0x000c, 0x080c, 0x7e94, 0x0005, 0xa182, 0x008c, 0x1220, 0xa182,
++	0x0085, 0x0208, 0x001a, 0x080c, 0x962a, 0x0005, 0xc355, 0xc355,
++	0xc355, 0xc355, 0xc357, 0xc375, 0xc355, 0x080c, 0x1519, 0x00d6,
++	0x2c68, 0x080c, 0x958d, 0x01a0, 0x6003, 0x0001, 0x6007, 0x001e,
++	0x2009, 0xcc8e, 0x210c, 0x6136, 0x2009, 0xcc8f, 0x210c, 0x613a,
++	0x600b, 0xffff, 0x6918, 0x611a, 0x601f, 0x0004, 0x080c, 0x7999,
++	0x2d60, 0x080c, 0x95e3, 0x00de, 0x0005, 0x080c, 0x95e3, 0x0005,
++	0x00e6, 0x6018, 0x2070, 0x7000, 0xd0ec, 0x00ee, 0x0005, 0x6010,
++	0xa08c, 0xf000, 0x0904, 0xc3c3, 0xa080, 0x0013, 0x200c, 0xd1ec,
++	0x05d0, 0x2001, 0xc672, 0x2004, 0xd0ec, 0x05a8, 0x6003, 0x0002,
++	0x6020, 0xc0e5, 0x6022, 0xd1ac, 0x0180, 0x00f6, 0x2c78, 0x080c,
++	0x56bf, 0x00fe, 0x0150, 0x2001, 0xc8ff, 0x2004, 0x603e, 0x2009,
++	0xc672, 0x210c, 0xd1f4, 0x11e8, 0x0080, 0x2009, 0xc672, 0x210c,
++	0xd1f4, 0x0128, 0x6020, 0xc0e4, 0x6022, 0xa006, 0x00a0, 0x2001,
++	0xc8ff, 0x200c, 0x8103, 0xa100, 0x603e, 0x6018, 0xa088, 0x002f,
++	0x2104, 0xa005, 0x0118, 0xa088, 0x0003, 0x0cd0, 0x2c0a, 0x600f,
++	0x0000, 0xa085, 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6, 0x6150,
++	0xa2f0, 0x002f, 0x2e04, 0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118,
++	0x6050, 0xa106, 0x1138, 0x600c, 0x2072, 0x080c, 0x7103, 0x080c,
++	0x95e3, 0x0010, 0xacf0, 0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce,
++	0x001e, 0x0005, 0x00d6, 0x6018, 0xa0e8, 0x002f, 0x2d04, 0xa005,
++	0x0140, 0xac06, 0x0120, 0x2d04, 0xa0e8, 0x0003, 0x0cb8, 0x600c,
++	0x206a, 0x00de, 0x0005, 0x0026, 0x0036, 0x0156, 0x2011, 0xc628,
++	0x2204, 0xa084, 0x00ff, 0x2019, 0xcc8e, 0x2334, 0xa636, 0x11d8,
++	0x8318, 0x2334, 0x2204, 0xa084, 0xff00, 0xa636, 0x11a0, 0x2011,
++	0xcc90, 0x6018, 0xa098, 0x000a, 0x20a9, 0x0004, 0x080c, 0xa103,
++	0x1150, 0x2011, 0xcc94, 0x6018, 0xa098, 0x0006, 0x20a9, 0x0004,
++	0x080c, 0xa103, 0x1100, 0x015e, 0x003e, 0x002e, 0x0005, 0x00e6,
++	0x2071, 0xc600, 0x080c, 0x4f02, 0x080c, 0x2c62, 0x00ee, 0x0005,
++	0x00d6, 0x080c, 0x15e5, 0x0500, 0x2d10, 0xa290, 0x000d, 0x2013,
++	0x0134, 0x8210, 0x2013, 0x0000, 0x8210, 0x703c, 0x2012, 0x8210,
++	0x7038, 0x2012, 0x8210, 0x2218, 0x7048, 0x2012, 0x8210, 0x704c,
++	0x2012, 0x8210, 0x7050, 0x2012, 0x8210, 0x7054, 0x2012, 0x2300,
++	0x080c, 0x3e8f, 0x080c, 0x580a, 0x00de, 0x0005, 0x00d6, 0x0026,
++	0x080c, 0x1602, 0x090c, 0x1519, 0xad90, 0x000e, 0x20a9, 0x000c,
++	0x22a0, 0xa016, 0x42a4, 0xa186, 0x0046, 0x1118, 0x6837, 0x0136,
++	0x0038, 0x6837, 0x0138, 0xa186, 0x0041, 0x0110, 0x684b, 0x0001,
++	0x7038, 0xa084, 0xff00, 0x7240, 0xa294, 0xff00, 0x8007, 0xa215,
++	0x6a6a, 0xa186, 0x0046, 0x1168, 0x7038, 0xa084, 0x00ff, 0x723c,
++	0xa294, 0xff00, 0xa215, 0x6a6e, 0x723c, 0xa294, 0x00ff, 0x6a72,
++	0x0060, 0x7040, 0xa084, 0x00ff, 0x7244, 0xa294, 0xff00, 0xa215,
++	0x6a6e, 0x7244, 0xa294, 0x00ff, 0x6a72, 0xa186, 0x0046, 0x1118,
++	0xae90, 0x0012, 0x0010, 0xae90, 0x001a, 0x2204, 0x8007, 0x6876,
++	0x8210, 0x2204, 0x8007, 0x687a, 0x8210, 0x2204, 0x8007, 0x687e,
++	0x8210, 0x2204, 0x8007, 0x6882, 0x8210, 0xa186, 0x0046, 0x1118,
++	0xae90, 0x0016, 0x0010, 0xae90, 0x001e, 0x2204, 0x8007, 0x6886,
++	0x8210, 0x2204, 0x8007, 0x688a, 0x8210, 0x2204, 0x8007, 0x688e,
++	0x8210, 0x2204, 0x8007, 0x6892, 0x8210, 0xa186, 0x0046, 0x1118,
++	0xae90, 0x0022, 0x0010, 0xae90, 0x002a, 0x00d6, 0xade8, 0x0025,
++	0x20a9, 0x0008, 0x2204, 0x8007, 0x206a, 0x8210, 0x8d68, 0x1f04,
++	0xc4ca, 0x00de, 0x002e, 0x080c, 0x580a, 0x00de, 0x0005, 0x00e6,
++	0x6018, 0x2070, 0x7000, 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005,
++	0x6850, 0xc0e5, 0x6852, 0x0005, 0x00e6, 0x00c6, 0x0076, 0x0066,
++	0x0056, 0x0046, 0x0026, 0x0016, 0x0126, 0x2091, 0x8000, 0x2029,
++	0xc930, 0x252c, 0x2021, 0xc936, 0x2424, 0x2061, 0xce00, 0x2071,
++	0xc600, 0x7648, 0x7068, 0xa606, 0x0578, 0x671c, 0xa786, 0x0001,
++	0x0118, 0xa786, 0x0008, 0x1500, 0x2500, 0xac06, 0x01e8, 0x2400,
++	0xac06, 0x01d0, 0x080c, 0xc1b8, 0x01b8, 0x080c, 0xc1c8, 0x11a0,
++	0x6000, 0xa086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1953, 0x001e,
++	0x080c, 0xae7e, 0x1110, 0x080c, 0x2e6c, 0x080c, 0xae8f, 0x1110,
++	0x080c, 0x9c09, 0x080c, 0xae54, 0xace0, 0x0018, 0x2001, 0xc617,
++	0x2004, 0xac02, 0x1208, 0x0858, 0x012e, 0x001e, 0x002e, 0x004e,
++	0x005e, 0x006e, 0x007e, 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0006,
++	0x00e6, 0x0016, 0x2091, 0x8000, 0x2071, 0xc640, 0xd5a4, 0x0118,
++	0x7034, 0x8000, 0x7036, 0xd5b4, 0x0118, 0x7030, 0x8000, 0x7032,
++	0xd5ac, 0x0178, 0x2500, 0xa084, 0x0007, 0xa08e, 0x0003, 0x0148,
++	0xa08e, 0x0004, 0x0130, 0xa08e, 0x0005, 0x0118, 0x2071, 0xc64a,
++	0x04c9, 0x001e, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0126, 0x0006,
++	0x00e6, 0x0016, 0x2091, 0x8000, 0x2071, 0xc640, 0xd5a4, 0x0118,
++	0x7034, 0x8000, 0x7036, 0xd5b4, 0x0118, 0x7030, 0x8000, 0x7032,
++	0xd5ac, 0x0178, 0x2500, 0xa084, 0x0007, 0xa08e, 0x0003, 0x0148,
++	0xa08e, 0x0004, 0x0130, 0xa08e, 0x0005, 0x0118, 0x2071, 0xc64a,
++	0x0089, 0x001e, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0126, 0x0006,
++	0x00e6, 0x2091, 0x8000, 0x2071, 0xc642, 0x0021, 0x00ee, 0x000e,
++	0x012e, 0x0005, 0x2e04, 0x8000, 0x2072, 0x1220, 0x8e70, 0x2e04,
++	0x8000, 0x2072, 0x0005, 0x00e6, 0x2071, 0xc640, 0x0c99, 0x00ee,
++	0x0005, 0x00e6, 0x2071, 0xc644, 0x0c69, 0x00ee, 0x0005, 0x0126,
++	0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0xc640, 0x7044, 0x8000,
++	0x7046, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0001, 0x0002, 0x0004,
++	0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400,
++	0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0xb0c4
++};
++#ifdef UNIQUE_FW_NAME
++unsigned short fw2200ip_length01 = 0xb5c6;
++#else
++unsigned short risc_code_length01 = 0xb5c6;
++#endif
++
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/ql2300tpx_fw.c	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,6494 @@
++/**************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ *************************************************************************/
++/*
++ *	Firmware Version 3.02.10 (14:20 Apr 17, 2003)
++ */
++
++#ifdef UNIQUE_FW_NAME
++unsigned short fw2300tpx_version = 3*1024+2;
++#else
++unsigned short risc_code_version = 3*1024+2;
++#endif
++
++#ifdef UNIQUE_FW_NAME
++unsigned char fw2300tpx_version_str[] = {3, 2,10};
++#else
++unsigned char firmware_version[] = {3, 2,10};
++#endif
++
++#ifdef UNIQUE_FW_NAME
++#define fw2300tpx_VERSION_STRING "3.02.10"
++#else
++#define FW_VERSION_STRING "3.02.10"
++#endif
++
++#ifdef UNIQUE_FW_NAME
++unsigned short fw2300tpx_addr01 = 0x0800 ;
++#else
++unsigned short risc_code_addr01 = 0x0800 ;
++#endif
++
++#ifdef UNIQUE_FW_NAME
++unsigned short fw2300tpx_code01[] = { 
++#else
++unsigned short risc_code01[] = { 
++#endif
++	0x0470, 0x0000, 0x0000, 0xc920, 0x0000, 0x0003, 0x0002, 0x000a,
++	0x0117, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030,
++	0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241,
++	0x5449, 0x4f4e, 0x2049, 0x5350, 0x3233, 0x3030, 0x2046, 0x6972,
++	0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030,
++	0x332e, 0x3032, 0x2e31, 0x3020, 0x2020, 0x2020, 0x2400, 0x20a9,
++	0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2200, 0x20a9, 0x000f,
++	0x2001, 0x0000, 0x400f, 0x2091, 0x2400, 0x20a9, 0x000f, 0x2001,
++	0x0000, 0x400f, 0x2091, 0x2600, 0x20a9, 0x000f, 0x2001, 0x0000,
++	0x400f, 0x2091, 0x2800, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f,
++	0x2091, 0x2a00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091,
++	0x2c00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2e00,
++	0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2000, 0x2001,
++	0x0000, 0x20c1, 0x0004, 0x2001, 0x017f, 0x2003, 0x0000, 0x20c9,
++	0x1bff, 0x2059, 0x0000, 0x2b78, 0x7883, 0x0004, 0x2089, 0x28b1,
++	0x2051, 0x1800, 0x2a70, 0x20e1, 0x0001, 0x20e9, 0x0001, 0x2029,
++	0x4d00, 0x2031, 0xffff, 0x2039, 0x4cd0, 0x2021, 0x0200, 0x20e9,
++	0x0001, 0x20a1, 0x0000, 0x20a9, 0x0800, 0x900e, 0x4104, 0x20e9,
++	0x0001, 0x20a1, 0x1000, 0x900e, 0x2001, 0x0cc0, 0x9084, 0x0fff,
++	0x20a8, 0x4104, 0x2001, 0x0000, 0x9086, 0x0000, 0x0120, 0x21a8,
++	0x4104, 0x8001, 0x1de0, 0x7566, 0x766a, 0x7762, 0x746e, 0x7472,
++	0x00e6, 0x2071, 0x1a8a, 0x2472, 0x00ee, 0x20a1, 0x1cd0, 0x7168,
++	0x810d, 0x810d, 0x810d, 0x810d, 0x918c, 0x000f, 0x2001, 0x0001,
++	0x9112, 0x900e, 0x21a8, 0x4104, 0x8211, 0x1de0, 0x7168, 0x3400,
++	0x8001, 0x9102, 0x0120, 0x0218, 0x20a8, 0x900e, 0x4104, 0x2009,
++	0x1800, 0x810d, 0x810d, 0x810d, 0x810d, 0x810d, 0x918c, 0x001f,
++	0x2001, 0x0001, 0x9112, 0x20e9, 0x0001, 0x20a1, 0x0800, 0x900e,
++	0x20a9, 0x0800, 0x4104, 0x8211, 0x1dd8, 0x080c, 0x0ec6, 0x080c,
++	0x56e7, 0x080c, 0x94ea, 0x080c, 0x107b, 0x080c, 0x1245, 0x080c,
++	0x18ae, 0x080c, 0x0d1d, 0x080c, 0x1000, 0x080c, 0x2f6e, 0x080c,
++	0x6b54, 0x080c, 0x5f51, 0x080c, 0x774d, 0x080c, 0x20b6, 0x080c,
++	0x7a7b, 0x080c, 0x7190, 0x080c, 0x1ef3, 0x080c, 0x2027, 0x080c,
++	0x20ab, 0x2091, 0x3009, 0x7883, 0x0000, 0x1004, 0x091d, 0x7880,
++	0x9086, 0x0002, 0x1190, 0x7883, 0x4000, 0x7837, 0x4000, 0x7833,
++	0x0010, 0x0e04, 0x0911, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001,
++	0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x2071, 0x1800, 0x7003,
++	0x0000, 0x2071, 0x1800, 0x7000, 0x908e, 0x0003, 0x1168, 0x080c,
++	0x44bf, 0x080c, 0x2f92, 0x080c, 0x6bc5, 0x080c, 0x63e8, 0x080c,
++	0x7778, 0x080c, 0x2849, 0x0c68, 0x000b, 0x0c88, 0x0940, 0x0941,
++	0x0ab2, 0x093e, 0x0b69, 0x0d14, 0x0d14, 0x0d14, 0x080c, 0x0d84,
++	0x0005, 0x0126, 0x00f6, 0x2091, 0x8000, 0x7000, 0x9086, 0x0001,
++	0x1904, 0x0a90, 0x080c, 0x0e2c, 0x080c, 0x6877, 0x0150, 0x080c,
++	0x689a, 0x1580, 0x2079, 0x0100, 0x7828, 0x9085, 0x1800, 0x782a,
++	0x0448, 0x080c, 0x67be, 0x7000, 0x9086, 0x0001, 0x1904, 0x0a90,
++	0x7090, 0x9086, 0x0028, 0x1904, 0x0a90, 0x2001, 0x0161, 0x2003,
++	0x0001, 0x2079, 0x0100, 0x7827, 0xffff, 0x7a28, 0x9295, 0x5e2f,
++	0x7a2a, 0x2011, 0x6739, 0x080c, 0x781a, 0x2011, 0x672c, 0x080c,
++	0x78e7, 0x2011, 0x554d, 0x080c, 0x781a, 0x2011, 0x8030, 0x901e,
++	0x738e, 0x0460, 0x080c, 0x4e04, 0x2079, 0x0100, 0x7844, 0x9005,
++	0x1904, 0x0a90, 0x2011, 0x554d, 0x080c, 0x781a, 0x2001, 0x0265,
++	0x2001, 0x0205, 0x2003, 0x0000, 0x7840, 0x9084, 0xfffb, 0x7842,
++	0x2001, 0x1973, 0x2004, 0x9005, 0x1140, 0x00c6, 0x2061, 0x0100,
++	0x080c, 0x568f, 0x00ce, 0x0804, 0x0a90, 0x780f, 0x006b, 0x7a28,
++	0x9295, 0x5e2f, 0x7a2a, 0x2011, 0x8010, 0x73d4, 0x2001, 0x1974,
++	0x2003, 0x0001, 0x080c, 0x2718, 0x080c, 0x447f, 0x7240, 0xc284,
++	0x7242, 0x2001, 0x180c, 0x200c, 0xc1ac, 0xc1cc, 0x2102, 0x080c,
++	0x8d36, 0x2011, 0x0004, 0x080c, 0xb0b9, 0x080c, 0x5e30, 0x080c,
++	0x6877, 0x1120, 0x080c, 0x275c, 0x02e0, 0x0400, 0x080c, 0x5696,
++	0x0140, 0x708f, 0x0001, 0x70cf, 0x0000, 0x080c, 0x4fc7, 0x0804,
++	0x0a90, 0x080c, 0x4dea, 0xd094, 0x0188, 0x2011, 0x180c, 0x2204,
++	0xc0cd, 0x2012, 0x080c, 0x4dee, 0xd0d4, 0x1118, 0x080c, 0x275c,
++	0x1270, 0x2011, 0x180c, 0x2204, 0xc0bc, 0x00a8, 0x080c, 0x4dee,
++	0xd0d4, 0x1db8, 0x2011, 0x180c, 0x2204, 0xc0bd, 0x0060, 0x2011,
++	0x180c, 0x2204, 0xc0bd, 0x2012, 0x080c, 0x5f25, 0x1128, 0xd0a4,
++	0x0118, 0x2204, 0xc0fd, 0x2012, 0x080c, 0x5eeb, 0x0120, 0x7a0c,
++	0xc2b4, 0x7a0e, 0x00a8, 0x7077, 0x0000, 0x080c, 0x6877, 0x1130,
++	0x70a8, 0x9005, 0x1168, 0x080c, 0xb4bd, 0x0050, 0x080c, 0xb4bd,
++	0x70d8, 0xd09c, 0x1128, 0x70a8, 0x9005, 0x0110, 0x080c, 0x5677,
++	0x70e3, 0x0000, 0x70df, 0x0000, 0x709f, 0x0000, 0x72d8, 0x080c,
++	0x6877, 0x1170, 0x9016, 0x0016, 0x080c, 0x2515, 0x2019, 0x193c,
++	0x211a, 0x001e, 0x7057, 0xffff, 0x705b, 0x00ef, 0x707b, 0x0000,
++	0x2079, 0x1852, 0x7804, 0xd0ac, 0x0108, 0xc295, 0x72da, 0x080c,
++	0x6877, 0x0118, 0x9296, 0x0004, 0x0548, 0x2011, 0x0001, 0x080c,
++	0xb0b9, 0x70a3, 0x0000, 0x70a7, 0xffff, 0x7003, 0x0002, 0x2079,
++	0x0100, 0x7827, 0x0003, 0x7828, 0x9085, 0x0003, 0x782a, 0x00fe,
++	0x080c, 0x2b1e, 0x2011, 0x0005, 0x080c, 0x8e99, 0x080c, 0x8125,
++	0x080c, 0x6877, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c,
++	0x2515, 0x61e2, 0x001e, 0x00ce, 0x012e, 0x0420, 0x70a3, 0x0000,
++	0x70a7, 0xffff, 0x7003, 0x0002, 0x00f6, 0x2079, 0x0100, 0x7827,
++	0x0003, 0x7828, 0x9085, 0x0003, 0x782a, 0x00fe, 0x2011, 0x0005,
++	0x080c, 0x8e99, 0x080c, 0x8125, 0x080c, 0x6877, 0x0148, 0x00c6,
++	0x2061, 0x0100, 0x0016, 0x080c, 0x2515, 0x61e2, 0x001e, 0x00ce,
++	0x00fe, 0x012e, 0x0005, 0x00c6, 0x080c, 0x6877, 0x1118, 0x20a9,
++	0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, 0x6877, 0x1110, 0x900e,
++	0x0010, 0x2009, 0x007e, 0x080c, 0x2e11, 0x8108, 0x1f04, 0x0aa3,
++	0x7077, 0x0000, 0x7078, 0x9084, 0x00ff, 0x707a, 0x70ab, 0x0000,
++	0x00ce, 0x0005, 0x00b6, 0x0126, 0x2091, 0x8000, 0x7000, 0x9086,
++	0x0002, 0x1904, 0x0b66, 0x70a4, 0x9086, 0xffff, 0x0130, 0x080c,
++	0x2b1e, 0x080c, 0x8125, 0x0804, 0x0b66, 0x70d8, 0xd0ac, 0x1110,
++	0xd09c, 0x0540, 0xd084, 0x0530, 0x0006, 0x2001, 0x0103, 0x2003,
++	0x002b, 0x000e, 0xd08c, 0x01f0, 0x70dc, 0x9086, 0xffff, 0x01b0,
++	0x080c, 0x2c86, 0x080c, 0x8125, 0x70d8, 0xd094, 0x1904, 0x0b66,
++	0x2011, 0x0001, 0x080c, 0xb759, 0x0110, 0x2011, 0x0003, 0x901e,
++	0x080c, 0x2cc0, 0x080c, 0x8125, 0x0804, 0x0b66, 0x70e0, 0x9005,
++	0x1904, 0x0b66, 0x70a0, 0x9005, 0x1904, 0x0b66, 0x70d8, 0xd0a4,
++	0x0118, 0xd0b4, 0x0904, 0x0b66, 0x080c, 0x5eeb, 0x1904, 0x0b66,
++	0x080c, 0x5f3e, 0x1904, 0x0b66, 0x080c, 0x5f25, 0x01c0, 0x0156,
++	0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x5c0d, 0x1118,
++	0xb800, 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04, 0x0b0c, 0x00ce,
++	0x015e, 0x0028, 0x001e, 0x00ce, 0x015e, 0x0804, 0x0b66, 0x0006,
++	0x2001, 0x0103, 0x2003, 0x006b, 0x000e, 0x2011, 0x1980, 0x080c,
++	0x0f36, 0x2011, 0x199a, 0x080c, 0x0f36, 0x7030, 0xc08c, 0x7032,
++	0x7003, 0x0003, 0x70a7, 0xffff, 0x080c, 0x0e0e, 0x9006, 0x080c,
++	0x23a6, 0x0036, 0x0046, 0x2019, 0xffff, 0x2021, 0x0006, 0x080c,
++	0x44f9, 0x004e, 0x003e, 0x00f6, 0x2079, 0x0100, 0x080c, 0x689a,
++	0x0150, 0x080c, 0x6877, 0x7828, 0x0118, 0x9084, 0xe1ff, 0x0010,
++	0x9084, 0xffdf, 0x782a, 0x00fe, 0x2001, 0x19b5, 0x2004, 0x9086,
++	0x0005, 0x1120, 0x2011, 0x0000, 0x080c, 0x8e99, 0x2011, 0x0000,
++	0x080c, 0x8ea3, 0x080c, 0x8125, 0x080c, 0x820b, 0x012e, 0x00be,
++	0x0005, 0x0016, 0x0046, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079,
++	0x0100, 0x7904, 0x918c, 0xfffd, 0x7906, 0x2009, 0x00f7, 0x080c,
++	0x5660, 0x7940, 0x918c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0110,
++	0x7827, 0x0040, 0xd19c, 0x0110, 0x7827, 0x0008, 0x0006, 0x0036,
++	0x0156, 0x7954, 0xd1ac, 0x1904, 0x0bf6, 0x2001, 0x1974, 0x2004,
++	0x9005, 0x1518, 0x080c, 0x27d7, 0x1148, 0x2001, 0x0001, 0x080c,
++	0x2747, 0x2001, 0x0001, 0x080c, 0x272a, 0x00b8, 0x080c, 0x27df,
++	0x1138, 0x9006, 0x080c, 0x2747, 0x9006, 0x080c, 0x272a, 0x0068,
++	0x080c, 0x27e7, 0x1d50, 0x2001, 0x1965, 0x2004, 0xd0fc, 0x0108,
++	0x0020, 0x080c, 0x2541, 0x0804, 0x0cd6, 0x080c, 0x6888, 0x0148,
++	0x080c, 0x689a, 0x1118, 0x080c, 0x6b4f, 0x0050, 0x080c, 0x687f,
++	0x0dd0, 0x080c, 0x6b4a, 0x080c, 0x6b40, 0x080c, 0x67be, 0x0058,
++	0x080c, 0x6877, 0x0140, 0x2009, 0x00f8, 0x080c, 0x5660, 0x7843,
++	0x0090, 0x7843, 0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138,
++	0x080c, 0x6877, 0x0138, 0x7824, 0xd0ac, 0x1904, 0x0cdb, 0x1f04,
++	0x0bd5, 0x0070, 0x7824, 0x080c, 0x6891, 0x0118, 0xd0ac, 0x1904,
++	0x0cdb, 0x9084, 0x1800, 0x0d98, 0x7003, 0x0001, 0x0804, 0x0cdb,
++	0x2001, 0x0001, 0x080c, 0x23a6, 0x0804, 0x0cee, 0x2001, 0x1974,
++	0x2004, 0x9005, 0x1518, 0x080c, 0x27d7, 0x1148, 0x2001, 0x0001,
++	0x080c, 0x2747, 0x2001, 0x0001, 0x080c, 0x272a, 0x00b8, 0x080c,
++	0x27df, 0x1138, 0x9006, 0x080c, 0x2747, 0x9006, 0x080c, 0x272a,
++	0x0068, 0x080c, 0x27e7, 0x1d50, 0x2001, 0x1965, 0x2004, 0xd0fc,
++	0x0108, 0x0020, 0x080c, 0x2541, 0x0804, 0x0cd6, 0x7850, 0x9085,
++	0x0040, 0x7852, 0x7938, 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c,
++	0x27ef, 0x9085, 0x2000, 0x7852, 0x793a, 0x20a9, 0x0046, 0x1d04,
++	0x0c2f, 0x080c, 0x78c7, 0x1f04, 0x0c2f, 0x7850, 0x9085, 0x0400,
++	0x9084, 0xdfbf, 0x7852, 0x793a, 0x080c, 0x6888, 0x0148, 0x080c,
++	0x689a, 0x1118, 0x080c, 0x6b4f, 0x0050, 0x080c, 0x687f, 0x0dd0,
++	0x080c, 0x6b4a, 0x080c, 0x6b40, 0x080c, 0x67be, 0x0020, 0x2009,
++	0x00f8, 0x080c, 0x5660, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x0c55,
++	0x7850, 0x9085, 0x1400, 0x7852, 0x080c, 0x6877, 0x0120, 0x7843,
++	0x0090, 0x7843, 0x0010, 0x2021, 0xe678, 0x2019, 0xea60, 0x080c,
++	0x0d15, 0x7820, 0xd09c, 0x1588, 0x080c, 0x6877, 0x0904, 0x0cbb,
++	0x7824, 0xd0ac, 0x1904, 0x0cdb, 0x080c, 0x689a, 0x1530, 0x0046,
++	0x2021, 0x0320, 0x8421, 0x1df0, 0x004e, 0x7827, 0x1800, 0x080c,
++	0x27ef, 0x7824, 0x9084, 0x1800, 0x1168, 0x9484, 0x0fff, 0x1140,
++	0x2001, 0x180f, 0x2004, 0x9084, 0x9000, 0x0110, 0x080c, 0x0cfc,
++	0x8421, 0x1158, 0x1d04, 0x0c96, 0x080c, 0x78c7, 0x080c, 0x6b4a,
++	0x080c, 0x6b40, 0x7003, 0x0001, 0x04f0, 0x8319, 0x1940, 0x1d04,
++	0x0ca3, 0x080c, 0x78c7, 0x2009, 0x1968, 0x2104, 0x9005, 0x0118,
++	0x8001, 0x200a, 0x1178, 0x200b, 0x000a, 0x7827, 0x0048, 0x20a9,
++	0x0002, 0x080c, 0x27d0, 0x7924, 0x080c, 0x27ef, 0xd19c, 0x0110,
++	0x080c, 0x2718, 0x00d8, 0x080c, 0x6888, 0x1140, 0x94a2, 0x03e8,
++	0x1128, 0x080c, 0x6853, 0x7003, 0x0001, 0x00a8, 0x7827, 0x1800,
++	0x080c, 0x27ef, 0x7824, 0x080c, 0x6891, 0x0110, 0xd0ac, 0x1158,
++	0x9084, 0x1800, 0x0950, 0x7003, 0x0001, 0x0028, 0x2001, 0x0001,
++	0x080c, 0x23a6, 0x0078, 0x2009, 0x180c, 0x210c, 0xd19c, 0x1120,
++	0x7904, 0x918d, 0x0002, 0x7906, 0x7827, 0x0048, 0x7828, 0x9085,
++	0x0028, 0x782a, 0x7850, 0x9085, 0x0400, 0x7852, 0x2001, 0x1974,
++	0x2003, 0x0000, 0x9006, 0x78f2, 0x015e, 0x003e, 0x000e, 0x012e,
++	0x00fe, 0x004e, 0x001e, 0x0005, 0x0006, 0x0016, 0x0036, 0x0046,
++	0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x080c, 0x2f92,
++	0x0061, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x004e,
++	0x003e, 0x001e, 0x000e, 0x0005, 0x0005, 0x080c, 0xb759, 0x0120,
++	0x1d04, 0x0d1c, 0x080c, 0x78c7, 0x0005, 0x2a70, 0x2061, 0x1978,
++	0x2063, 0x0003, 0x6007, 0x0002, 0x600b, 0x000a, 0x600f, 0x0117,
++	0x2001, 0x194b, 0x900e, 0x2102, 0x718e, 0x2001, 0x0100, 0x2004,
++	0x9082, 0x0002, 0x0218, 0x7057, 0xffff, 0x0008, 0x7156, 0x705f,
++	0xffff, 0x7176, 0x717a, 0x080c, 0xb4bd, 0x70ef, 0x00c0, 0x2061,
++	0x193b, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800, 0x600f, 0x0200,
++	0x6013, 0x00ff, 0x6017, 0x000f, 0x611a, 0x601f, 0x07d0, 0x2061,
++	0x1943, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f, 0x0200, 0x6013,
++	0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061, 0x1956, 0x6003,
++	0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, 0x2001,
++	0x182a, 0x2102, 0x0005, 0x9016, 0x080c, 0x5c0d, 0x1178, 0xb804,
++	0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4, 0xff00, 0x98c6,
++	0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210, 0x8108, 0x9186,
++	0x0800, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000, 0x0e04, 0x0d86,
++	0x0006, 0x0016, 0x2001, 0x8002, 0x0006, 0x2079, 0x0000, 0x000e,
++	0x7882, 0x7836, 0x001e, 0x798e, 0x000e, 0x788a, 0x000e, 0x7886,
++	0x3900, 0x789a, 0x7833, 0x0012, 0x2091, 0x5000, 0x0156, 0x00d6,
++	0x0036, 0x0026, 0x2079, 0x0300, 0x2069, 0x1a65, 0x7a18, 0x226a,
++	0x8d68, 0x7a1c, 0x226a, 0x782c, 0x2019, 0x1a72, 0x201a, 0x2019,
++	0x1a75, 0x9016, 0x7808, 0xd09c, 0x0168, 0x7820, 0x201a, 0x8210,
++	0x8318, 0x9386, 0x1a8a, 0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110,
++	0x2011, 0xdead, 0x2019, 0x1a73, 0x782c, 0x201a, 0x8318, 0x221a,
++	0x7803, 0x0000, 0x2069, 0x1a45, 0x901e, 0x20a9, 0x0020, 0x7b26,
++	0x7a28, 0x226a, 0x8d68, 0x8318, 0x1f04, 0x0dcf, 0x002e, 0x003e,
++	0x00de, 0x015e, 0x2079, 0x1800, 0x7803, 0x0005, 0x2091, 0x4080,
++	0x2001, 0x0089, 0x2004, 0xd084, 0x0180, 0x2001, 0x19e7, 0x2004,
++	0x9005, 0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001,
++	0x008a, 0x2003, 0x0002, 0x2003, 0x1001, 0x080c, 0x4df9, 0x1108,
++	0x0011, 0x0cd8, 0x0005, 0x0026, 0x0126, 0x2011, 0x0080, 0x080c,
++	0x0e8d, 0x20a9, 0x0900, 0x080c, 0x0eae, 0x2011, 0x0040, 0x080c,
++	0x0e8d, 0x20a9, 0x0900, 0x080c, 0x0eae, 0x0c78, 0x0026, 0x080c,
++	0x0e9a, 0x1118, 0x2011, 0x0040, 0x0098, 0x2011, 0x010e, 0x2214,
++	0x9294, 0x0007, 0x9296, 0x0007, 0x0118, 0x2011, 0xa880, 0x0010,
++	0x2011, 0x6840, 0xd0e4, 0x70f3, 0x0000, 0x1128, 0x70f3, 0x0fa0,
++	0x080c, 0x0e9f, 0x002e, 0x0005, 0x0026, 0x080c, 0x0e9a, 0x0128,
++	0xd0a4, 0x1138, 0x2011, 0xcdd5, 0x0010, 0x2011, 0x0080, 0x080c,
++	0x0e9f, 0x002e, 0x0005, 0x0026, 0x70f3, 0x0000, 0x080c, 0x0e9a,
++	0x1148, 0x080c, 0x27e7, 0x1118, 0x2011, 0x8484, 0x0058, 0x2011,
++	0x8282, 0x0040, 0x080c, 0x27e7, 0x1118, 0x2011, 0xcdc5, 0x0010,
++	0x2011, 0xcac2, 0x080c, 0x0e9f, 0x002e, 0x0005, 0x00e6, 0x0006,
++	0x2071, 0x1800, 0xd0b4, 0x70ec, 0x1148, 0xc0e4, 0x0080, 0x70ee,
++	0x0026, 0x9094, 0x00c0, 0x0449, 0x002e, 0x0048, 0x0006, 0x3b00,
++	0x9084, 0xff3f, 0x20d8, 0x000e, 0x70f3, 0x0000, 0xc0e5, 0x0079,
++	0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, 0xd0e4, 0x70ec,
++	0x1110, 0xc0dc, 0x0008, 0xc0dd, 0x0011, 0x00ee, 0x0005, 0x70ee,
++	0x7000, 0x9084, 0x0007, 0x000b, 0x0005, 0x0e55, 0x0e2c, 0x0e2c,
++	0x0e0e, 0x0e3b, 0x0e2c, 0x0e2c, 0x0e3b, 0x0016, 0x3b08, 0x3a00,
++	0x9104, 0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f, 0x9205, 0x20d0,
++	0x001e, 0x0005, 0x2001, 0x183b, 0x2004, 0xd0dc, 0x0005, 0x9e86,
++	0x1800, 0x190c, 0x0d84, 0x70ec, 0xd0e4, 0x0108, 0xc2e5, 0x72ee,
++	0xd0e4, 0x1118, 0x9294, 0x00c0, 0x0c01, 0x0005, 0x1d04, 0x0eae,
++	0x2091, 0x6000, 0x1f04, 0x0eae, 0x0005, 0x890e, 0x810e, 0x810f,
++	0x9194, 0x003f, 0x918c, 0xffc0, 0x0005, 0x0006, 0x2200, 0x914d,
++	0x894f, 0x894d, 0x894d, 0x000e, 0x000e, 0x0005, 0x01d6, 0x0146,
++	0x0036, 0x0096, 0x2061, 0x1882, 0x600b, 0x0000, 0x600f, 0x0000,
++	0x6003, 0x0000, 0x6007, 0x0000, 0x2009, 0xffc0, 0x2105, 0x0006,
++	0x2001, 0xaaaa, 0x200f, 0x2019, 0x5555, 0x9016, 0x2049, 0x0bff,
++	0xab02, 0xa001, 0xa001, 0xa800, 0x9306, 0x1138, 0x2105, 0x9306,
++	0x0120, 0x8210, 0x99c8, 0x0400, 0x0c98, 0x000e, 0x200f, 0x2001,
++	0x1892, 0x928a, 0x000e, 0x1638, 0x928a, 0x0006, 0x2011, 0x0006,
++	0x1210, 0x2011, 0x0000, 0x2202, 0x9006, 0x2008, 0x82ff, 0x01b0,
++	0x8200, 0x600a, 0x600f, 0xffff, 0x6003, 0x0002, 0x6007, 0x0000,
++	0x0026, 0x2019, 0x0010, 0x9280, 0x0001, 0x20e8, 0x21a0, 0x21a8,
++	0x4104, 0x8319, 0x1de0, 0x8211, 0x1da0, 0x002e, 0x009e, 0x003e,
++	0x014e, 0x01de, 0x0005, 0x2011, 0x000e, 0x08e8, 0x0016, 0x0026,
++	0x0096, 0x3348, 0x080c, 0x0eb5, 0x2100, 0x9300, 0x2098, 0x22e0,
++	0x009e, 0x002e, 0x001e, 0x0036, 0x3518, 0x20a9, 0x0001, 0x4002,
++	0x8007, 0x4004, 0x8319, 0x1dd8, 0x003e, 0x0005, 0x20e9, 0x0001,
++	0x71b0, 0x81ff, 0x11c0, 0x9006, 0x2009, 0x0200, 0x20a9, 0x0002,
++	0x9298, 0x0018, 0x23a0, 0x4001, 0x2009, 0x0700, 0x20a9, 0x0002,
++	0x9298, 0x0008, 0x23a0, 0x4001, 0x7074, 0x8007, 0x7178, 0x810f,
++	0x20a9, 0x0002, 0x4001, 0x9298, 0x000c, 0x23a0, 0x900e, 0x080c,
++	0x0d6b, 0x2001, 0x0000, 0x810f, 0x20a9, 0x0002, 0x4001, 0x0005,
++	0x89ff, 0x0140, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, 0x0fe0,
++	0x009e, 0x0cb0, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x1057,
++	0x090c, 0x0d84, 0x00ee, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0026,
++	0x0036, 0x0126, 0x2091, 0x8000, 0x00c9, 0x2071, 0x1800, 0x73bc,
++	0x702c, 0x9016, 0x9045, 0x0158, 0x8210, 0x9906, 0x090c, 0x0d84,
++	0x2300, 0x9202, 0x0120, 0x1a0c, 0x0d84, 0xa000, 0x0c98, 0x012e,
++	0x003e, 0x002e, 0x000e, 0x00ee, 0x008e, 0x0005, 0x0086, 0x00e6,
++	0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x1904, 0x7010, 0x9005,
++	0x0140, 0x7018, 0x9045, 0x0128, 0x9906, 0x090c, 0x0d84, 0xa000,
++	0x0cc8, 0x012e, 0x000e, 0x00ee, 0x008e, 0x0005, 0x00e6, 0x2071,
++	0x1800, 0x0126, 0x2091, 0x8000, 0x70bc, 0x8001, 0x0270, 0x70be,
++	0x702c, 0x2048, 0x9085, 0x0001, 0xa800, 0x702e, 0xa803, 0x0000,
++	0xa807, 0x0000, 0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6,
++	0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x70bc, 0x90ca, 0x0040,
++	0x0268, 0x8001, 0x70be, 0x702c, 0x2048, 0xa800, 0x702e, 0xa803,
++	0x0000, 0xa807, 0x0000, 0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8,
++	0x00e6, 0x0126, 0x2091, 0x8000, 0x0016, 0x890e, 0x810e, 0x810f,
++	0x9184, 0x003f, 0xa862, 0x9184, 0xffc0, 0xa85e, 0x001e, 0x0020,
++	0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x702c, 0xa802,
++	0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x012e, 0x00ee, 0x0005,
++	0x2071, 0x1800, 0x9026, 0x2009, 0x0000, 0x2049, 0x0400, 0x2900,
++	0x702e, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420,
++	0x9886, 0x0440, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071,
++	0x1882, 0x7000, 0x9005, 0x11a0, 0x2001, 0x0534, 0xa802, 0x2048,
++	0x2009, 0x4d00, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001,
++	0x8420, 0x9886, 0x0800, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90,
++	0x2071, 0x1882, 0x7104, 0x7200, 0x82ff, 0x01d0, 0x7308, 0x8318,
++	0x831f, 0x831b, 0x831b, 0x7312, 0x8319, 0x2001, 0x0800, 0xa802,
++	0x2048, 0x8900, 0xa802, 0x2040, 0xa95e, 0xaa62, 0x8420, 0x2300,
++	0x9906, 0x0130, 0x2848, 0x9188, 0x0040, 0x9291, 0x0000, 0x0c88,
++	0xa803, 0x0000, 0x2071, 0x1800, 0x74ba, 0x74be, 0x0005, 0x00e6,
++	0x0016, 0x9984, 0xfc00, 0x01e8, 0x908c, 0xf800, 0x1168, 0x9982,
++	0x0400, 0x02b8, 0x9982, 0x0440, 0x0278, 0x9982, 0x0534, 0x0288,
++	0x9982, 0x0800, 0x1270, 0x0040, 0x9982, 0x0800, 0x0250, 0x2071,
++	0x1882, 0x7010, 0x9902, 0x1228, 0x9085, 0x0001, 0x001e, 0x00ee,
++	0x0005, 0x9006, 0x0cd8, 0x00e6, 0x2071, 0x19e6, 0x7007, 0x0000,
++	0x9006, 0x701e, 0x7022, 0x7002, 0x2071, 0x0000, 0x7010, 0x9085,
++	0x8004, 0x7012, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6,
++	0xa06f, 0x0000, 0x2071, 0x19e6, 0x701c, 0x9088, 0x19f0, 0x280a,
++	0x8000, 0x9084, 0x003f, 0x701e, 0x7120, 0x9106, 0x090c, 0x0d84,
++	0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x00a9, 0x00fe,
++	0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071,
++	0x19e6, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x0021,
++	0x00fe, 0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, 0x0000, 0x1110,
++	0x7007, 0x0006, 0x7000, 0x0002, 0x10ce, 0x10cc, 0x10cc, 0x10cc,
++	0x1234, 0x1234, 0x1234, 0x1234, 0x080c, 0x0d84, 0x701c, 0x7120,
++	0x9106, 0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110,
++	0x7007, 0x0000, 0x0005, 0x0096, 0x9180, 0x19f0, 0x2004, 0x700a,
++	0x2048, 0x8108, 0x918c, 0x003f, 0x7122, 0x782b, 0x0026, 0xa88c,
++	0x7802, 0xa890, 0x7806, 0xa894, 0x780a, 0xa898, 0x780e, 0xa878,
++	0x700e, 0xa870, 0x7016, 0xa874, 0x701a, 0xa868, 0x009e, 0xd084,
++	0x0120, 0x7007, 0x0001, 0x0029, 0x0005, 0x7007, 0x0002, 0x00b1,
++	0x0005, 0x0016, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182, 0x0040,
++	0x1210, 0x2110, 0x9006, 0x700e, 0x7212, 0x8203, 0x7812, 0x782b,
++	0x0020, 0x782b, 0x0041, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026,
++	0x0136, 0x0146, 0x0156, 0x7014, 0x20e0, 0x7018, 0x2098, 0x20e9,
++	0x0000, 0x20a1, 0x0088, 0x782b, 0x0026, 0x710c, 0x2011, 0x0040,
++	0x9182, 0x0040, 0x1210, 0x2110, 0x9006, 0x700e, 0x22a8, 0x4006,
++	0x8203, 0x7812, 0x782b, 0x0020, 0x3300, 0x701a, 0x782b, 0x0001,
++	0x015e, 0x014e, 0x013e, 0x002e, 0x001e, 0x0005, 0x2009, 0x19e6,
++	0x2104, 0xc095, 0x200a, 0x080c, 0x10ab, 0x0005, 0x0016, 0x00e6,
++	0x2071, 0x19e6, 0x00f6, 0x2079, 0x0080, 0x792c, 0x782b, 0x0002,
++	0xd1fc, 0x0120, 0x918c, 0x0700, 0x7004, 0x0023, 0x00fe, 0x00ee,
++	0x001e, 0x0005, 0x10bc, 0x1161, 0x1195, 0x0d84, 0x0d84, 0x1240,
++	0x0d84, 0x918c, 0x0700, 0x1550, 0x0136, 0x0146, 0x0156, 0x7014,
++	0x20e8, 0x7018, 0x20a0, 0x20e1, 0x0000, 0x2099, 0x0088, 0x782b,
++	0x0040, 0x7010, 0x20a8, 0x4005, 0x3400, 0x701a, 0x015e, 0x014e,
++	0x013e, 0x700c, 0x9005, 0x0578, 0x7800, 0x7802, 0x7804, 0x7806,
++	0x080c, 0x1101, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0100,
++	0x009e, 0x7007, 0x0000, 0x080c, 0x10bc, 0x0005, 0x7008, 0x0096,
++	0x2048, 0xa86f, 0x0200, 0x009e, 0x0ca0, 0x918c, 0x0700, 0x1150,
++	0x700c, 0x9005, 0x0180, 0x7800, 0x7802, 0x7804, 0x7806, 0x080c,
++	0x1116, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e,
++	0x7007, 0x0000, 0x0080, 0x0096, 0x7008, 0x2048, 0x7800, 0xa88e,
++	0x7804, 0xa892, 0x7808, 0xa896, 0x780c, 0xa89a, 0xa86f, 0x0100,
++	0x009e, 0x7007, 0x0000, 0x0096, 0x00d6, 0x7008, 0x2048, 0x2001,
++	0x18ad, 0x2004, 0x9906, 0x1128, 0xa89c, 0x080f, 0x00de, 0x009e,
++	0x00a0, 0x00de, 0x009e, 0x0096, 0x00d6, 0x7008, 0x2048, 0x0081,
++	0x0150, 0xa89c, 0x0086, 0x2940, 0x080f, 0x008e, 0x00de, 0x009e,
++	0x080c, 0x10ab, 0x0005, 0x00de, 0x009e, 0x080c, 0x10ab, 0x0005,
++	0xa8a8, 0xd08c, 0x0005, 0x0096, 0xa0a0, 0x904d, 0x090c, 0x0d84,
++	0xa06c, 0x908e, 0x0100, 0x0130, 0xa87b, 0x0030, 0xa883, 0x0000,
++	0xa897, 0x4002, 0x080c, 0x619c, 0xa09f, 0x0000, 0xa0a3, 0x0000,
++	0x2848, 0x080c, 0x0fe0, 0x009e, 0x0005, 0x00a6, 0xa0a0, 0x904d,
++	0x090c, 0x0d84, 0xa06c, 0x908e, 0x0100, 0x0128, 0xa87b, 0x0001,
++	0xa883, 0x0000, 0x00c0, 0xa80c, 0x2050, 0xb004, 0x9005, 0x0198,
++	0xa80e, 0x2050, 0x8006, 0x8006, 0x8007, 0x908c, 0x003f, 0x9084,
++	0xffc0, 0x9080, 0x0002, 0xa076, 0xa172, 0xb000, 0xa07a, 0x2810,
++	0x080c, 0x108c, 0x0078, 0xa97c, 0xa894, 0x0016, 0x0006, 0x080c,
++	0x619c, 0x000e, 0x001e, 0xd1f4, 0x0128, 0x00c6, 0x2060, 0x080c,
++	0x9554, 0x00ce, 0x00ae, 0x0005, 0x0126, 0x2091, 0x8000, 0x782b,
++	0x1001, 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x012e, 0x0005,
++	0x7007, 0x0000, 0x080c, 0x10bc, 0x0005, 0x0126, 0x2091, 0x2200,
++	0x2079, 0x0300, 0x2071, 0x1a30, 0x7003, 0x0000, 0x78bf, 0x00f6,
++	0x00c1, 0x7803, 0x0003, 0x780f, 0x0000, 0x20a9, 0x01ec, 0x2061,
++	0xcd39, 0x2c0d, 0x7912, 0xe104, 0x9ce0, 0x0002, 0x7916, 0x1f04,
++	0x1259, 0x7807, 0x0001, 0x7803, 0x0000, 0x7803, 0x0001, 0x012e,
++	0x0005, 0x00c6, 0x7803, 0x0000, 0x7808, 0xd09c, 0x0110, 0x7820,
++	0x0cd8, 0x2001, 0x1a31, 0x2003, 0x0000, 0x78ab, 0x0004, 0x78ac,
++	0xd0ac, 0x1de8, 0x78ab, 0x0002, 0x7807, 0x0001, 0x7827, 0x0030,
++	0x782b, 0x0400, 0x7827, 0x0031, 0x782b, 0x1a45, 0x781f, 0xff00,
++	0x781b, 0xff00, 0x2001, 0x0200, 0x2004, 0xd0dc, 0x0110, 0x781f,
++	0x0303, 0x2061, 0x1a45, 0x602f, 0x1cd0, 0x2001, 0x1818, 0x2004,
++	0x9082, 0x1cd0, 0x6032, 0x603b, 0x1cdd, 0x00ce, 0x0005, 0x0126,
++	0x2091, 0x2200, 0x7808, 0xd09c, 0x0158, 0x7820, 0x908c, 0xf000,
++	0x1588, 0x908a, 0x0021, 0x1a0c, 0x0d84, 0x0043, 0x012e, 0x0005,
++	0x9084, 0x0070, 0x190c, 0x0d84, 0x012e, 0x0005, 0x12d8, 0x12d8,
++	0x12e1, 0x12e6, 0x12ea, 0x12ef, 0x1317, 0x131b, 0x1329, 0x132d,
++	0x12d8, 0x13b6, 0x13ba, 0x141a, 0x12d8, 0x12d8, 0x12d8, 0x12d8,
++	0x12d8, 0x12d8, 0x12d8, 0x12d8, 0x12d8, 0x12d8, 0x12d8, 0x12d8,
++	0x12d8, 0x12f1, 0x12d8, 0x12d8, 0x12d8, 0x12d8, 0x12d8, 0x12d8,
++	0x080c, 0x0d84, 0x2009, 0x0048, 0x2060, 0x080c, 0x95ce, 0x012e,
++	0x0005, 0x7004, 0xc085, 0xc0b5, 0x7006, 0x0005, 0x7004, 0xc085,
++	0x7006, 0x0005, 0x080c, 0x1421, 0x080c, 0x14c5, 0x0005, 0x080c,
++	0x0d84, 0x080c, 0x1421, 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b,
++	0xffff, 0x009e, 0x2009, 0x0048, 0x080c, 0x95ce, 0x2001, 0x015d,
++	0x2003, 0x0000, 0x2009, 0x03e8, 0x8109, 0x0160, 0x2001, 0x0201,
++	0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1110,
++	0x080c, 0x1426, 0x2001, 0x0307, 0x2003, 0x8000, 0x0005, 0x7004,
++	0xc095, 0x7006, 0x0005, 0x080c, 0x1421, 0x2060, 0x6014, 0x0096,
++	0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, 0x95ce,
++	0x0005, 0x080c, 0x1421, 0x080c, 0x0d84, 0x080c, 0x1421, 0x080c,
++	0x13a1, 0x7827, 0x0018, 0x79ac, 0xd1dc, 0x0540, 0x7827, 0x0015,
++	0x7828, 0x782b, 0x0000, 0x9065, 0x0138, 0x2001, 0x020d, 0x2003,
++	0x0050, 0x2003, 0x0020, 0x0400, 0x7004, 0x9005, 0x1180, 0x78ab,
++	0x0004, 0x7827, 0x0018, 0x782b, 0x0000, 0xd1bc, 0x090c, 0x0d84,
++	0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0478, 0x78ab,
++	0x0004, 0x7803, 0x0001, 0x080c, 0x13ba, 0x0005, 0x7828, 0x782b,
++	0x0000, 0x9065, 0x090c, 0x0d84, 0x6014, 0x2048, 0x78ab, 0x0004,
++	0x918c, 0x0700, 0x0198, 0x080c, 0x724d, 0x080c, 0x1827, 0x080c,
++	0xb0ad, 0x0158, 0xa9ac, 0xa936, 0xa9b0, 0xa93a, 0xa83f, 0xffff,
++	0xa843, 0xffff, 0xa880, 0xc0bd, 0xa882, 0x0005, 0x6010, 0x00b6,
++	0x2058, 0xb800, 0x00be, 0xd0bc, 0x190c, 0xb456, 0x2029, 0x00c8,
++	0x8529, 0x0128, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x7dbc,
++	0x080c, 0xcce2, 0xd5a4, 0x1118, 0x080c, 0x1426, 0x0005, 0x080c,
++	0x724d, 0x080c, 0x1827, 0x0005, 0x781f, 0x0300, 0x7803, 0x0001,
++	0x0005, 0x0016, 0x0066, 0x0076, 0x00f6, 0x2079, 0x0300, 0x7908,
++	0x918c, 0x0007, 0x9186, 0x0003, 0x0120, 0x2001, 0x0016, 0x080c,
++	0x1492, 0x00fe, 0x007e, 0x006e, 0x001e, 0x0005, 0x7004, 0xc09d,
++	0x7006, 0x0005, 0x7104, 0x9184, 0x0004, 0x190c, 0x0d84, 0xd184,
++	0x1189, 0xd19c, 0x0158, 0xc19c, 0x7106, 0x2001, 0x020d, 0x2003,
++	0x0050, 0x2003, 0x0020, 0x080c, 0x1426, 0x0005, 0x81ff, 0x190c,
++	0x0d84, 0x0005, 0xc184, 0xd1b4, 0xc1b4, 0x7106, 0x0016, 0x00e6,
++	0x15c8, 0x2071, 0x0200, 0x080c, 0x14b9, 0x6014, 0x9005, 0x0590,
++	0x0096, 0x2048, 0xa864, 0x009e, 0x9084, 0x00ff, 0x908e, 0x0029,
++	0x0148, 0x908e, 0x0048, 0x1530, 0x00f6, 0x2c78, 0x080c, 0x150d,
++	0x00fe, 0x00a8, 0x00f6, 0x2c78, 0x080c, 0x163f, 0x00fe, 0x2009,
++	0x01f4, 0x8109, 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8,
++	0x2001, 0x0218, 0x2004, 0xd0ec, 0x1110, 0x0401, 0x0040, 0x2001,
++	0x020d, 0x2003, 0x0020, 0x080c, 0x1269, 0x7803, 0x0001, 0x00ee,
++	0x001e, 0x0005, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020,
++	0x0069, 0x0ca8, 0x0031, 0x2060, 0x2009, 0x0053, 0x080c, 0x95ce,
++	0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x0005, 0x080c, 0x13a1,
++	0x00d6, 0x2069, 0x0200, 0x2009, 0x01f4, 0x8109, 0x0508, 0x6804,
++	0x9005, 0x0dd8, 0x2001, 0x015d, 0x2003, 0x0000, 0x79bc, 0xd1a4,
++	0x1520, 0x79b8, 0x918c, 0x0fff, 0x0178, 0x9182, 0x0841, 0x1260,
++	0x9188, 0x0007, 0x918c, 0x0ff8, 0x810c, 0x810c, 0x810c, 0x04e1,
++	0x6827, 0x0001, 0x8109, 0x1dd8, 0x04b9, 0x6827, 0x0002, 0x04a1,
++	0x6804, 0x9005, 0x1130, 0x682c, 0xd0e4, 0x11e0, 0x6804, 0x9005,
++	0x0de8, 0x79b8, 0xd1ec, 0x1130, 0x08c8, 0x080c, 0x724d, 0x080c,
++	0x1827, 0x0070, 0x7827, 0x0015, 0x782b, 0x0000, 0x2001, 0x020d,
++	0x2003, 0x0020, 0x2001, 0x0307, 0x2003, 0x0300, 0x7803, 0x0001,
++	0x00de, 0x0005, 0x682c, 0x9084, 0x5400, 0x9086, 0x5400, 0x0d50,
++	0x7827, 0x0015, 0x782b, 0x0000, 0x7803, 0x0001, 0x6800, 0x9085,
++	0x1800, 0x6802, 0x00de, 0x0005, 0x6824, 0x9084, 0x0003, 0x1de0,
++	0x0005, 0x2001, 0x0030, 0x2c08, 0x621c, 0x0021, 0x7830, 0x9086,
++	0x0041, 0x0005, 0x00f6, 0x2079, 0x0300, 0x0006, 0x7808, 0xd09c,
++	0x0140, 0x0016, 0x0026, 0x00c6, 0x080c, 0x129f, 0x00ce, 0x002e,
++	0x001e, 0x000e, 0x0006, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080,
++	0x2009, 0xff00, 0x8109, 0x0130, 0x7818, 0xd0bc, 0x1dd8, 0x000e,
++	0x00fe, 0x0005, 0x000e, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c,
++	0x0d84, 0x7037, 0x0001, 0x7150, 0x7037, 0x0002, 0x7050, 0x2060,
++	0xd1bc, 0x1110, 0x7054, 0x2060, 0x0005, 0x00e6, 0x0016, 0x2071,
++	0x0200, 0x0c79, 0x7358, 0x745c, 0x6014, 0x905d, 0x0598, 0x2b48,
++	0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x190c, 0xb431,
++	0xab42, 0xac3e, 0x2001, 0x1874, 0x2004, 0xd0b4, 0x1170, 0x601c,
++	0xd0e4, 0x1158, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc,
++	0x1120, 0xa83b, 0x7fff, 0xa837, 0xffff, 0x080c, 0x1cfd, 0x1190,
++	0x080c, 0x168e, 0x2a00, 0xa816, 0x0130, 0x2800, 0xa80e, 0x2c05,
++	0xa80a, 0x2c00, 0xa812, 0x7037, 0x0020, 0x781f, 0x0300, 0x001e,
++	0x00ee, 0x0005, 0x7037, 0x0050, 0x7037, 0x0020, 0x001e, 0x00ee,
++	0x080c, 0x1426, 0x0005, 0x080c, 0x0d84, 0x2ff0, 0x0126, 0x2091,
++	0x2200, 0x3e60, 0x6014, 0x2048, 0x2940, 0x903e, 0x2730, 0xa864,
++	0x2068, 0xa81a, 0x9d84, 0x000f, 0x9088, 0x1cdd, 0x2165, 0x0002,
++	0x1537, 0x1584, 0x1537, 0x1537, 0x1537, 0x1566, 0x1537, 0x153b,
++	0x1530, 0x157b, 0x1537, 0x1537, 0x1537, 0x1537, 0x154f, 0x1545,
++	0xa964, 0x918c, 0x00ff, 0x918e, 0x0048, 0x0904, 0x157b, 0x9085,
++	0x0001, 0x0804, 0x1637, 0xa87c, 0xd0bc, 0x0dc8, 0xa890, 0xa842,
++	0xa88c, 0xa83e, 0xa888, 0x0804, 0x158b, 0xa87c, 0xd0bc, 0x0d78,
++	0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x15da, 0xa87c,
++	0xd0bc, 0x0d28, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa804, 0x9045,
++	0x090c, 0x0d84, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1cdd,
++	0x2065, 0xa888, 0xd19c, 0x1904, 0x15da, 0x0428, 0xa87c, 0xd0ac,
++	0x0970, 0xa804, 0x9045, 0x090c, 0x0d84, 0xa164, 0xa91a, 0x91ec,
++	0x000f, 0x9d80, 0x1cdd, 0x2065, 0x9006, 0xa842, 0xa83e, 0xd19c,
++	0x1904, 0x15da, 0x0080, 0xa87c, 0xd0ac, 0x0904, 0x1537, 0x9006,
++	0xa842, 0xa83e, 0x0804, 0x15da, 0xa87c, 0xd0ac, 0x0904, 0x1537,
++	0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0d84,
++	0x9082, 0x001b, 0x0002, 0x15ae, 0x15ae, 0x15b0, 0x15ae, 0x15ae,
++	0x15ae, 0x15b6, 0x15ae, 0x15ae, 0x15ae, 0x15bc, 0x15ae, 0x15ae,
++	0x15ae, 0x15c2, 0x15ae, 0x15ae, 0x15ae, 0x15c8, 0x15ae, 0x15ae,
++	0x15ae, 0x15ce, 0x15ae, 0x15ae, 0x15ae, 0x15d4, 0x080c, 0x0d84,
++	0xa574, 0xa478, 0xa37c, 0xa280, 0x0804, 0x161f, 0xa584, 0xa488,
++	0xa38c, 0xa290, 0x0804, 0x161f, 0xa594, 0xa498, 0xa39c, 0xa2a0,
++	0x0804, 0x161f, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x161f,
++	0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x161f, 0xa5c4, 0xa4c8,
++	0xa3cc, 0xa2d0, 0x0804, 0x161f, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0,
++	0x0804, 0x161f, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d84, 0x9082,
++	0x001b, 0x0002, 0x15fd, 0x15fb, 0x15fb, 0x15fb, 0x15fb, 0x15fb,
++	0x1604, 0x15fb, 0x15fb, 0x15fb, 0x15fb, 0x15fb, 0x160b, 0x15fb,
++	0x15fb, 0x15fb, 0x15fb, 0x15fb, 0x1612, 0x15fb, 0x15fb, 0x15fb,
++	0x15fb, 0x15fb, 0x1619, 0x080c, 0x0d84, 0xa56c, 0xa470, 0xa774,
++	0xa678, 0xa37c, 0xa280, 0x00d8, 0xa584, 0xa488, 0xa78c, 0xa690,
++	0xa394, 0xa298, 0x00a0, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac,
++	0xa2b0, 0x0068, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8,
++	0x0030, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0xab2e,
++	0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa988, 0x8c60, 0x2c1d,
++	0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x8109, 0xa916, 0x1150, 0x3e60,
++	0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x012e,
++	0x0005, 0x2800, 0xa80e, 0xab0a, 0x2c00, 0xa812, 0x0c80, 0x2ff0,
++	0x0126, 0x2091, 0x2200, 0x3e60, 0x6014, 0x2048, 0x2940, 0xa80e,
++	0x2061, 0x1cd8, 0xa80b, 0x1cd8, 0x2c05, 0xa812, 0xa964, 0xa91a,
++	0xa87c, 0xd0ac, 0x090c, 0x0d84, 0x9006, 0xa842, 0xa83e, 0x2c05,
++	0x908a, 0x0034, 0x1a0c, 0x0d84, 0xadcc, 0xacd0, 0xafd4, 0xaed8,
++	0xabdc, 0xaae0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a,
++	0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0xa988, 0x918a, 0x0002, 0xa916,
++	0x1150, 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e,
++	0x9006, 0x012e, 0x0005, 0xa804, 0x9045, 0x090c, 0x0d84, 0xa80e,
++	0xa064, 0xa81a, 0x9084, 0x000f, 0x9080, 0x1cdd, 0x2015, 0x82ff,
++	0x090c, 0x0d84, 0xaa0a, 0x2205, 0xa812, 0x0c18, 0x903e, 0x2730,
++	0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002, 0x1783, 0x16e5, 0x16e5,
++	0x1783, 0x1783, 0x177d, 0x1783, 0x16e5, 0x1783, 0x1734, 0x1734,
++	0x1783, 0x1783, 0x1783, 0x177a, 0x1734, 0xc0fc, 0xa882, 0xab2c,
++	0xaa30, 0xad1c, 0xac20, 0xdd9c, 0x0904, 0x1785, 0x2c05, 0x908a,
++	0x0034, 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, 0x16d1, 0x16cf,
++	0x16cf, 0x16cf, 0x16cf, 0x16cf, 0x16d5, 0x16cf, 0x16cf, 0x16cf,
++	0x16cf, 0x16cf, 0x16d9, 0x16cf, 0x16cf, 0x16cf, 0x16cf, 0x16cf,
++	0x16dd, 0x16cf, 0x16cf, 0x16cf, 0x16cf, 0x16cf, 0x16e1, 0x080c,
++	0x0d84, 0xa774, 0xa678, 0x0804, 0x1785, 0xa78c, 0xa690, 0x0804,
++	0x1785, 0xa7a4, 0xa6a8, 0x0804, 0x1785, 0xa7bc, 0xa6c0, 0x0804,
++	0x1785, 0xa7d4, 0xa6d8, 0x0804, 0x1785, 0x2c05, 0x908a, 0x0036,
++	0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, 0x1708, 0x1708, 0x170a,
++	0x1708, 0x1708, 0x1708, 0x1710, 0x1708, 0x1708, 0x1708, 0x1716,
++	0x1708, 0x1708, 0x1708, 0x171c, 0x1708, 0x1708, 0x1708, 0x1722,
++	0x1708, 0x1708, 0x1708, 0x1728, 0x1708, 0x1708, 0x1708, 0x172e,
++	0x080c, 0x0d84, 0xa574, 0xa478, 0xa37c, 0xa280, 0x0804, 0x1785,
++	0xa584, 0xa488, 0xa38c, 0xa290, 0x0804, 0x1785, 0xa594, 0xa498,
++	0xa39c, 0xa2a0, 0x0804, 0x1785, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0,
++	0x0804, 0x1785, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x1785,
++	0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x1785, 0xa5d4, 0xa4d8,
++	0xa3dc, 0xa2e0, 0x0804, 0x1785, 0x2c05, 0x908a, 0x0034, 0x1a0c,
++	0x0d84, 0x9082, 0x001b, 0x0002, 0x1757, 0x1755, 0x1755, 0x1755,
++	0x1755, 0x1755, 0x175e, 0x1755, 0x1755, 0x1755, 0x1755, 0x1755,
++	0x1765, 0x1755, 0x1755, 0x1755, 0x1755, 0x1755, 0x176c, 0x1755,
++	0x1755, 0x1755, 0x1755, 0x1755, 0x1773, 0x080c, 0x0d84, 0xa56c,
++	0xa470, 0xa774, 0xa678, 0xa37c, 0xa280, 0x0438, 0xa584, 0xa488,
++	0xa78c, 0xa690, 0xa394, 0xa298, 0x0400, 0xa59c, 0xa4a0, 0xa7a4,
++	0xa6a8, 0xa3ac, 0xa2b0, 0x00c8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0,
++	0xa3c4, 0xa2c8, 0x0090, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc,
++	0xa2e0, 0x0058, 0x9d86, 0x000e, 0x1130, 0x080c, 0x1c9b, 0x1904,
++	0x168e, 0x900e, 0x0050, 0x080c, 0x0d84, 0xab2e, 0xaa32, 0xad1e,
++	0xac22, 0xaf26, 0xae2a, 0x080c, 0x1c9b, 0x0005, 0x6014, 0x2048,
++	0x6118, 0x810c, 0x810c, 0x810c, 0x81ff, 0x1118, 0xa887, 0x0001,
++	0x0008, 0xa986, 0x601b, 0x0002, 0xa974, 0xd1dc, 0x1108, 0x0005,
++	0xa934, 0xa88c, 0x9106, 0x1158, 0xa938, 0xa890, 0x9106, 0x1138,
++	0x601c, 0xc084, 0x601e, 0x2009, 0x0048, 0x0804, 0x95ce, 0x0005,
++	0x0126, 0x00c6, 0x2091, 0x2200, 0x00ce, 0x7908, 0x918c, 0x0007,
++	0x9186, 0x0000, 0x0904, 0x181c, 0x9186, 0x0003, 0x0904, 0x181c,
++	0x6020, 0x6023, 0x0000, 0x0006, 0x2031, 0x0190, 0x00c6, 0x7808,
++	0xd09c, 0x190c, 0x129f, 0x00ce, 0x2001, 0x0038, 0x2c08, 0x621c,
++	0x080c, 0x1492, 0x7930, 0x9186, 0x0040, 0x0904, 0x1818, 0x9186,
++	0x0042, 0x190c, 0x0d84, 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631,
++	0x1d28, 0x080c, 0x1876, 0x0026, 0x0056, 0x2001, 0x00d2, 0x8001,
++	0x1df0, 0x2031, 0x2000, 0x8631, 0x1148, 0x080c, 0x724d, 0x04b9,
++	0x601c, 0xc084, 0x601e, 0x005e, 0x002e, 0x0410, 0x2001, 0x020b,
++	0x2004, 0xd0e4, 0x0d80, 0x2001, 0x015d, 0x2003, 0x0000, 0x78ab,
++	0x0004, 0x2001, 0x0200, 0x200c, 0x918d, 0x1800, 0x2102, 0x080c,
++	0x1269, 0x601c, 0xc084, 0x601e, 0x7803, 0x0000, 0x7803, 0x0001,
++	0x005e, 0x002e, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202,
++	0x000e, 0x6022, 0x012e, 0x0005, 0x601c, 0xc084, 0x601e, 0x7827,
++	0x0015, 0x7828, 0x9c06, 0x1db0, 0x782b, 0x0000, 0x0c98, 0x00f6,
++	0x2079, 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, 0x00fe, 0x080c,
++	0x6877, 0x11b0, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160,
++	0x2003, 0x0000, 0x2011, 0x012c, 0xa001, 0xa001, 0x8211, 0x1de0,
++	0x0081, 0x0066, 0x2031, 0x0000, 0x080c, 0x691e, 0x006e, 0x0005,
++	0x0469, 0x0039, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202,
++	0x0005, 0x00e6, 0x2071, 0x0200, 0x080c, 0x27fb, 0x2009, 0x003c,
++	0x080c, 0x2014, 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084,
++	0x003c, 0x1de0, 0x70a0, 0x70a2, 0x7098, 0x709a, 0x709c, 0x709e,
++	0x2001, 0x020d, 0x2003, 0x0020, 0x00f6, 0x2079, 0x0300, 0x080c,
++	0x1269, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005, 0x2001, 0x0138,
++	0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003, 0x0000,
++	0x080c, 0x6877, 0x1108, 0x0005, 0x2021, 0x0260, 0x2001, 0x0141,
++	0x201c, 0xd3dc, 0x1168, 0x2001, 0x0109, 0x201c, 0x939c, 0x0048,
++	0x1160, 0x2001, 0x0111, 0x201c, 0x83ff, 0x1110, 0x8421, 0x1d70,
++	0x2001, 0x015d, 0x2003, 0x0000, 0x0005, 0x0046, 0x2021, 0x0019,
++	0x2003, 0x0048, 0xa001, 0xa001, 0x201c, 0x939c, 0x0048, 0x0120,
++	0x8421, 0x1db0, 0x004e, 0x0c60, 0x004e, 0x0c40, 0x0126, 0x2091,
++	0x2400, 0x2071, 0x1a33, 0x2079, 0x0090, 0x012e, 0x0005, 0x9280,
++	0x0005, 0x2004, 0x2048, 0xa97c, 0xd1dc, 0x1904, 0x1932, 0xa964,
++	0x9184, 0x0007, 0x0002, 0x18cb, 0x191d, 0x18d2, 0x18d2, 0x18d2,
++	0x1905, 0x18e5, 0x18d4, 0x2100, 0x9084, 0x00ff, 0x9086, 0x0048,
++	0x0904, 0x191d, 0x080c, 0x0d84, 0xa87c, 0xd0b4, 0x0904, 0x1ae4,
++	0xa890, 0xa842, 0xa83a, 0xa88c, 0xa83e, 0xa836, 0xa8ac, 0xa846,
++	0xa8b0, 0xa84a, 0xa988, 0x0804, 0x1925, 0xa864, 0x9084, 0x00ff,
++	0x9086, 0x001e, 0x1d38, 0xa87c, 0xd0b4, 0x0904, 0x1ae4, 0xa890,
++	0xa842, 0xa83a, 0xa88c, 0xa83e, 0xa836, 0xa8ac, 0xa846, 0xa8b0,
++	0xa84a, 0xa804, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080,
++	0x1cdd, 0x2005, 0xa812, 0xa988, 0x0448, 0x918c, 0x00ff, 0x9186,
++	0x0015, 0x1540, 0xa87c, 0xd0b4, 0x0904, 0x1ae4, 0xa804, 0xa85a,
++	0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x1cdd, 0x2005, 0xa812,
++	0xa988, 0x9006, 0xa842, 0xa83e, 0x0088, 0xa87c, 0xd0b4, 0x0904,
++	0x1ae4, 0xa988, 0x9006, 0xa842, 0xa83e, 0x2900, 0xa85a, 0xa864,
++	0x9084, 0x000f, 0x9080, 0x1cdd, 0x2005, 0xa812, 0xa916, 0xa87c,
++	0xc0dd, 0xa87e, 0x0005, 0x00f6, 0x2079, 0x0090, 0x782c, 0xd0fc,
++	0x190c, 0x1b25, 0x00e6, 0x2071, 0x1a33, 0x7000, 0x9005, 0x1904,
++	0x198c, 0x7206, 0x9280, 0x0005, 0x204c, 0x9280, 0x0004, 0x2004,
++	0x782b, 0x0004, 0x00f6, 0x2079, 0x0200, 0x7803, 0x0040, 0x00fe,
++	0x00b6, 0x2058, 0xb86c, 0x7836, 0xb890, 0x00be, 0x00f6, 0x2079,
++	0x0200, 0x7803, 0x0040, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001,
++	0xa001, 0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x00fe, 0xa814,
++	0x2050, 0xa858, 0x2040, 0xa810, 0x2060, 0xa064, 0x90ec, 0x000f,
++	0xa944, 0x791a, 0x7116, 0xa848, 0x781e, 0x701a, 0x9006, 0x700e,
++	0x7012, 0x7004, 0xa940, 0xa838, 0x9106, 0x1188, 0xa93c, 0xa834,
++	0x9106, 0x1168, 0x8aff, 0x01a8, 0x0126, 0x2091, 0x8000, 0x00a1,
++	0x0108, 0x0091, 0x012e, 0x9006, 0x00ee, 0x00fe, 0x0005, 0x0036,
++	0x0046, 0xab38, 0xac34, 0x080c, 0x1cfd, 0x004e, 0x003e, 0x0d50,
++	0x0c98, 0x9085, 0x0001, 0x0c80, 0x0076, 0x0066, 0x0056, 0x0046,
++	0x0036, 0x0026, 0x8aff, 0x0904, 0x1add, 0x700c, 0x7214, 0x923a,
++	0x7010, 0x7218, 0x9203, 0x0a04, 0x1adc, 0x9705, 0x0904, 0x1adc,
++	0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002, 0x1ac0,
++	0x1a07, 0x1a07, 0x1ac0, 0x1ac0, 0x1aa3, 0x1ac0, 0x1a07, 0x1aa9,
++	0x1a56, 0x1a56, 0x1ac0, 0x1ac0, 0x1ac0, 0x1a9d, 0x1a56, 0xc0fc,
++	0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, 0x0904, 0x1ac2,
++	0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002,
++	0x19f3, 0x19f1, 0x19f1, 0x19f1, 0x19f1, 0x19f1, 0x19f7, 0x19f1,
++	0x19f1, 0x19f1, 0x19f1, 0x19f1, 0x19fb, 0x19f1, 0x19f1, 0x19f1,
++	0x19f1, 0x19f1, 0x19ff, 0x19f1, 0x19f1, 0x19f1, 0x19f1, 0x19f1,
++	0x1a03, 0x080c, 0x0d84, 0xa774, 0xa678, 0x0804, 0x1ac2, 0xa78c,
++	0xa690, 0x0804, 0x1ac2, 0xa7a4, 0xa6a8, 0x0804, 0x1ac2, 0xa7bc,
++	0xa6c0, 0x0804, 0x1ac2, 0xa7d4, 0xa6d8, 0x0804, 0x1ac2, 0x2c05,
++	0x908a, 0x0036, 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, 0x1a2a,
++	0x1a2a, 0x1a2c, 0x1a2a, 0x1a2a, 0x1a2a, 0x1a32, 0x1a2a, 0x1a2a,
++	0x1a2a, 0x1a38, 0x1a2a, 0x1a2a, 0x1a2a, 0x1a3e, 0x1a2a, 0x1a2a,
++	0x1a2a, 0x1a44, 0x1a2a, 0x1a2a, 0x1a2a, 0x1a4a, 0x1a2a, 0x1a2a,
++	0x1a2a, 0x1a50, 0x080c, 0x0d84, 0xa574, 0xa478, 0xa37c, 0xa280,
++	0x0804, 0x1ac2, 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804, 0x1ac2,
++	0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x1ac2, 0xa5a4, 0xa4a8,
++	0xa3ac, 0xa2b0, 0x0804, 0x1ac2, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0,
++	0x0804, 0x1ac2, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x1ac2,
++	0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x1ac2, 0x2c05, 0x908a,
++	0x0034, 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, 0x1a79, 0x1a77,
++	0x1a77, 0x1a77, 0x1a77, 0x1a77, 0x1a81, 0x1a77, 0x1a77, 0x1a77,
++	0x1a77, 0x1a77, 0x1a88, 0x1a77, 0x1a77, 0x1a77, 0x1a77, 0x1a77,
++	0x1a8f, 0x1a77, 0x1a77, 0x1a77, 0x1a77, 0x1a77, 0x1a96, 0x080c,
++	0x0d84, 0xa56c, 0xa470, 0xa774, 0xa678, 0xa37c, 0xa280, 0x0804,
++	0x1ac2, 0xa584, 0xa488, 0xa78c, 0xa690, 0xa394, 0xa298, 0x04d0,
++	0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0, 0x0498, 0xa5b4,
++	0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, 0x0460, 0xa5cc, 0xa4d0,
++	0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0x0428, 0xa864, 0x9084, 0x00ff,
++	0x9086, 0x001e, 0x11e8, 0x080c, 0x1c9b, 0x1904, 0x19a2, 0x900e,
++	0x04a0, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0048, 0x190c, 0x0d84,
++	0x00c6, 0x7004, 0x2060, 0x6004, 0x9086, 0x0043, 0x00ce, 0x0904,
++	0x1a56, 0xab9c, 0x9016, 0xad8c, 0xac90, 0xaf94, 0xae98, 0x0010,
++	0x080c, 0x0d84, 0x7b12, 0x7a16, 0x7d02, 0x7c06, 0x7f0a, 0x7e0e,
++	0x782b, 0x0001, 0x7000, 0x8000, 0x7002, 0xa83c, 0x9300, 0xa83e,
++	0xa840, 0x9201, 0xa842, 0x700c, 0x9300, 0x700e, 0x7010, 0x9201,
++	0x7012, 0x080c, 0x1c9b, 0x0008, 0x9006, 0x002e, 0x003e, 0x004e,
++	0x005e, 0x006e, 0x007e, 0x0005, 0x080c, 0x0d84, 0x0026, 0x2001,
++	0x0105, 0x2003, 0x0010, 0x782b, 0x0004, 0x7003, 0x0000, 0x7004,
++	0x2060, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0118, 0xa880, 0xc0bd,
++	0xa882, 0x6020, 0x9086, 0x0006, 0x1180, 0x2061, 0x0100, 0x62c8,
++	0x2001, 0x00fa, 0x8001, 0x1df0, 0x60c8, 0x9206, 0x1dc0, 0x60c4,
++	0xa89a, 0x60c8, 0xa896, 0x7004, 0x2060, 0x00c6, 0x080c, 0xad1e,
++	0x00ce, 0x2001, 0x19c3, 0x2004, 0x9c06, 0x1160, 0x2009, 0x0040,
++	0x080c, 0x2014, 0x080c, 0x901f, 0x2011, 0x0000, 0x080c, 0x8ea3,
++	0x080c, 0x820b, 0x002e, 0x0804, 0x1c4d, 0x0126, 0x2091, 0x2400,
++	0xa858, 0x2040, 0x792c, 0x782b, 0x0002, 0x9184, 0x0700, 0x1904,
++	0x1ae6, 0x7000, 0x0002, 0x1c4d, 0x1b37, 0x1ba0, 0x1c4b, 0x8001,
++	0x7002, 0xd19c, 0x1150, 0x8aff, 0x0590, 0x080c, 0x199c, 0x0904,
++	0x1c4d, 0x080c, 0x199c, 0x0804, 0x1c4d, 0x782b, 0x0004, 0xd194,
++	0x0148, 0xa880, 0xc0fc, 0xa882, 0x8aff, 0x11b8, 0xa87c, 0xc0f5,
++	0xa87e, 0x0098, 0xab3c, 0xaa40, 0x7810, 0xa82e, 0x931a, 0x7814,
++	0xa832, 0x9213, 0x7800, 0xa81e, 0x7804, 0xa822, 0xab3e, 0xaa42,
++	0x080c, 0x1cb3, 0xa880, 0xc0fd, 0xa882, 0x2a00, 0xa816, 0x2800,
++	0xa85a, 0x2c00, 0xa812, 0x7003, 0x0000, 0x0804, 0x1c4d, 0x00f6,
++	0x0026, 0x781c, 0x0006, 0x7818, 0x0006, 0x2079, 0x0100, 0x7a14,
++	0x9284, 0x1984, 0x9085, 0x0012, 0x7816, 0x0036, 0x2019, 0x1000,
++	0x8319, 0x090c, 0x0d84, 0x7820, 0xd0bc, 0x1dd0, 0x003e, 0x79c8,
++	0x000e, 0x9102, 0x001e, 0x0006, 0x0016, 0x79c4, 0x000e, 0x9103,
++	0x78c6, 0x000e, 0x78ca, 0x9284, 0x1984, 0x9085, 0x0012, 0x7816,
++	0x002e, 0x00fe, 0x782b, 0x0008, 0x7003, 0x0000, 0x0804, 0x1c4d,
++	0x8001, 0x7002, 0xd194, 0x0170, 0x782c, 0xd0fc, 0x1904, 0x1b2a,
++	0xd19c, 0x1904, 0x1c49, 0x8aff, 0x0904, 0x1c4d, 0x080c, 0x199c,
++	0x0804, 0x1c4d, 0xab3c, 0xaa40, 0x080c, 0x1cb3, 0xdd9c, 0x1904,
++	0x1c08, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0d84, 0x9082, 0x001b,
++	0x0002, 0x1bdc, 0x1bdc, 0x1bde, 0x1bdc, 0x1bdc, 0x1bdc, 0x1be4,
++	0x1bdc, 0x1bdc, 0x1bdc, 0x1bea, 0x1bdc, 0x1bdc, 0x1bdc, 0x1bf0,
++	0x1bdc, 0x1bdc, 0x1bdc, 0x1bf6, 0x1bdc, 0x1bdc, 0x1bdc, 0x1bfc,
++	0x1bdc, 0x1bdc, 0x1bdc, 0x1c02, 0x080c, 0x0d84, 0xa07c, 0x931a,
++	0xa080, 0x9213, 0x0804, 0x1b54, 0xa08c, 0x931a, 0xa090, 0x9213,
++	0x0804, 0x1b54, 0xa09c, 0x931a, 0xa0a0, 0x9213, 0x0804, 0x1b54,
++	0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1b54, 0xa0bc, 0x931a,
++	0xa0c0, 0x9213, 0x0804, 0x1b54, 0xa0cc, 0x931a, 0xa0d0, 0x9213,
++	0x0804, 0x1b54, 0xa0dc, 0x931a, 0xa0e0, 0x9213, 0x0804, 0x1b54,
++	0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002,
++	0x1c2b, 0x1c29, 0x1c29, 0x1c29, 0x1c29, 0x1c29, 0x1c31, 0x1c29,
++	0x1c29, 0x1c29, 0x1c29, 0x1c29, 0x1c37, 0x1c29, 0x1c29, 0x1c29,
++	0x1c29, 0x1c29, 0x1c3d, 0x1c29, 0x1c29, 0x1c29, 0x1c29, 0x1c29,
++	0x1c43, 0x080c, 0x0d84, 0xa07c, 0x931a, 0xa080, 0x9213, 0x0804,
++	0x1b54, 0xa094, 0x931a, 0xa098, 0x9213, 0x0804, 0x1b54, 0xa0ac,
++	0x931a, 0xa0b0, 0x9213, 0x0804, 0x1b54, 0xa0c4, 0x931a, 0xa0c8,
++	0x9213, 0x0804, 0x1b54, 0xa0dc, 0x931a, 0xa0e0, 0x9213, 0x0804,
++	0x1b54, 0x0804, 0x1b52, 0x080c, 0x0d84, 0x012e, 0x0005, 0x00f6,
++	0x00e6, 0x2071, 0x1a33, 0x7000, 0x9086, 0x0000, 0x0904, 0x1c98,
++	0x2079, 0x0090, 0x2009, 0x0207, 0x210c, 0xd194, 0x01b8, 0x2009,
++	0x020c, 0x210c, 0x9184, 0x0003, 0x0188, 0x080c, 0xcd2b, 0x2001,
++	0x0133, 0x2004, 0x9005, 0x090c, 0x0d84, 0x0016, 0x2009, 0x0040,
++	0x080c, 0x2014, 0x001e, 0x2001, 0x020c, 0x2102, 0x2009, 0x0206,
++	0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, 0x2009, 0x0040,
++	0x080c, 0x2014, 0x782c, 0xd0fc, 0x09a8, 0x080c, 0x1b25, 0x7000,
++	0x9086, 0x0000, 0x1978, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8,
++	0x2009, 0x0040, 0x080c, 0x2014, 0x782b, 0x0002, 0x7003, 0x0000,
++	0x00ee, 0x00fe, 0x0005, 0x8c60, 0x2c05, 0x9005, 0x0110, 0x8a51,
++	0x0005, 0xa004, 0x9005, 0x0168, 0xa85a, 0x2040, 0xa064, 0x9084,
++	0x000f, 0x9080, 0x1cdd, 0x2065, 0x8cff, 0x090c, 0x0d84, 0x8a51,
++	0x0005, 0x2050, 0x0005, 0x8a50, 0x8c61, 0x2c05, 0x9005, 0x1190,
++	0x2800, 0x9906, 0x0120, 0xa000, 0x9005, 0x1108, 0x2900, 0x2040,
++	0xa85a, 0xa064, 0x9084, 0x000f, 0x9080, 0x1ced, 0x2065, 0x8cff,
++	0x090c, 0x0d84, 0x0005, 0x0000, 0x001d, 0x0021, 0x0025, 0x0029,
++	0x002d, 0x0031, 0x0035, 0x0000, 0x001b, 0x0021, 0x0027, 0x002d,
++	0x0033, 0x0000, 0x0000, 0x0023, 0x0000, 0x0000, 0x1cd0, 0x1ccc,
++	0x0000, 0x0000, 0x1cda, 0x0000, 0x1cd0, 0x1cd7, 0x1cd7, 0x1cd4,
++	0x0000, 0x0000, 0x0000, 0x1cda, 0x1cd7, 0x0000, 0x1cd2, 0x1cd2,
++	0x0000, 0x0000, 0x1cda, 0x0000, 0x1cd2, 0x1cd8, 0x1cd8, 0x1cd8,
++	0x0000, 0x0000, 0x0000, 0x1cda, 0x1cd8, 0x00c6, 0x00d6, 0x0086,
++	0xab42, 0xac3e, 0xa888, 0x9055, 0x0904, 0x1ed4, 0x2940, 0xa064,
++	0x90ec, 0x000f, 0x9de0, 0x1cdd, 0x9d86, 0x0007, 0x0130, 0x9d86,
++	0x000e, 0x0118, 0x9d86, 0x000f, 0x1120, 0xa08c, 0x9422, 0xa090,
++	0x931b, 0x2c05, 0x9065, 0x1140, 0x0310, 0x0804, 0x1ed4, 0xa004,
++	0x9045, 0x0904, 0x1ed4, 0x0c18, 0x2c05, 0x9005, 0x0904, 0x1dbc,
++	0xdd9c, 0x1904, 0x1d78, 0x908a, 0x0036, 0x1a0c, 0x0d84, 0x9082,
++	0x001b, 0x0002, 0x1d4d, 0x1d4d, 0x1d4f, 0x1d4d, 0x1d4d, 0x1d4d,
++	0x1d55, 0x1d4d, 0x1d4d, 0x1d4d, 0x1d5b, 0x1d4d, 0x1d4d, 0x1d4d,
++	0x1d61, 0x1d4d, 0x1d4d, 0x1d4d, 0x1d67, 0x1d4d, 0x1d4d, 0x1d4d,
++	0x1d6d, 0x1d4d, 0x1d4d, 0x1d4d, 0x1d73, 0x080c, 0x0d84, 0xa07c,
++	0x9422, 0xa080, 0x931b, 0x0804, 0x1db2, 0xa08c, 0x9422, 0xa090,
++	0x931b, 0x0804, 0x1db2, 0xa09c, 0x9422, 0xa0a0, 0x931b, 0x0804,
++	0x1db2, 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0804, 0x1db2, 0xa0bc,
++	0x9422, 0xa0c0, 0x931b, 0x0804, 0x1db2, 0xa0cc, 0x9422, 0xa0d0,
++	0x931b, 0x0804, 0x1db2, 0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x04d0,
++	0x908a, 0x0034, 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, 0x1d9a,
++	0x1d98, 0x1d98, 0x1d98, 0x1d98, 0x1d98, 0x1d9f, 0x1d98, 0x1d98,
++	0x1d98, 0x1d98, 0x1d98, 0x1da4, 0x1d98, 0x1d98, 0x1d98, 0x1d98,
++	0x1d98, 0x1da9, 0x1d98, 0x1d98, 0x1d98, 0x1d98, 0x1d98, 0x1dae,
++	0x080c, 0x0d84, 0xa07c, 0x9422, 0xa080, 0x931b, 0x0098, 0xa094,
++	0x9422, 0xa098, 0x931b, 0x0070, 0xa0ac, 0x9422, 0xa0b0, 0x931b,
++	0x0048, 0xa0c4, 0x9422, 0xa0c8, 0x931b, 0x0020, 0xa0dc, 0x9422,
++	0xa0e0, 0x931b, 0x0630, 0x2300, 0x9405, 0x0160, 0x8a51, 0x0904,
++	0x1ed4, 0x8c60, 0x0804, 0x1d24, 0xa004, 0x9045, 0x0904, 0x1ed4,
++	0x0804, 0x1d07, 0x8a51, 0x0904, 0x1ed4, 0x8c60, 0x2c05, 0x9005,
++	0x1158, 0xa004, 0x9045, 0x0904, 0x1ed4, 0xa064, 0x90ec, 0x000f,
++	0x9de0, 0x1cdd, 0x2c05, 0x2060, 0xa880, 0xc0fc, 0xa882, 0x0804,
++	0x1ec9, 0x2c05, 0x8422, 0x8420, 0x831a, 0x9399, 0x0000, 0xac2e,
++	0xab32, 0xdd9c, 0x1904, 0x1e66, 0x9082, 0x001b, 0x0002, 0x1e02,
++	0x1e02, 0x1e04, 0x1e02, 0x1e02, 0x1e02, 0x1e12, 0x1e02, 0x1e02,
++	0x1e02, 0x1e20, 0x1e02, 0x1e02, 0x1e02, 0x1e2e, 0x1e02, 0x1e02,
++	0x1e02, 0x1e3c, 0x1e02, 0x1e02, 0x1e02, 0x1e4a, 0x1e02, 0x1e02,
++	0x1e02, 0x1e58, 0x080c, 0x0d84, 0xa17c, 0x2400, 0x9122, 0xa180,
++	0x2300, 0x911b, 0x0a0c, 0x0d84, 0xa074, 0x9420, 0xa078, 0x9319,
++	0x0804, 0x1ec4, 0xa18c, 0x2400, 0x9122, 0xa190, 0x2300, 0x911b,
++	0x0a0c, 0x0d84, 0xa084, 0x9420, 0xa088, 0x9319, 0x0804, 0x1ec4,
++	0xa19c, 0x2400, 0x9122, 0xa1a0, 0x2300, 0x911b, 0x0a0c, 0x0d84,
++	0xa094, 0x9420, 0xa098, 0x9319, 0x0804, 0x1ec4, 0xa1ac, 0x2400,
++	0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0d84, 0xa0a4, 0x9420,
++	0xa0a8, 0x9319, 0x0804, 0x1ec4, 0xa1bc, 0x2400, 0x9122, 0xa1c0,
++	0x2300, 0x911b, 0x0a0c, 0x0d84, 0xa0b4, 0x9420, 0xa0b8, 0x9319,
++	0x0804, 0x1ec4, 0xa1cc, 0x2400, 0x9122, 0xa1d0, 0x2300, 0x911b,
++	0x0a0c, 0x0d84, 0xa0c4, 0x9420, 0xa0c8, 0x9319, 0x0804, 0x1ec4,
++	0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0d84,
++	0xa0d4, 0x9420, 0xa0d8, 0x9319, 0x0804, 0x1ec4, 0x9082, 0x001b,
++	0x0002, 0x1e84, 0x1e82, 0x1e82, 0x1e82, 0x1e82, 0x1e82, 0x1e91,
++	0x1e82, 0x1e82, 0x1e82, 0x1e82, 0x1e82, 0x1e9e, 0x1e82, 0x1e82,
++	0x1e82, 0x1e82, 0x1e82, 0x1eab, 0x1e82, 0x1e82, 0x1e82, 0x1e82,
++	0x1e82, 0x1eb8, 0x080c, 0x0d84, 0xa17c, 0x2400, 0x9122, 0xa180,
++	0x2300, 0x911b, 0x0a0c, 0x0d84, 0xa06c, 0x9420, 0xa070, 0x9319,
++	0x0498, 0xa194, 0x2400, 0x9122, 0xa198, 0x2300, 0x911b, 0x0a0c,
++	0x0d84, 0xa084, 0x9420, 0xa088, 0x9319, 0x0430, 0xa1ac, 0x2400,
++	0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0d84, 0xa09c, 0x9420,
++	0xa0a0, 0x9319, 0x00c8, 0xa1c4, 0x2400, 0x9122, 0xa1c8, 0x2300,
++	0x911b, 0x0a0c, 0x0d84, 0xa0b4, 0x9420, 0xa0b8, 0x9319, 0x0060,
++	0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0d84,
++	0xa0cc, 0x9420, 0xa0d0, 0x9319, 0xac1e, 0xab22, 0xa880, 0xc0fd,
++	0xa882, 0x2800, 0xa85a, 0x2c00, 0xa812, 0x2a00, 0xa816, 0x000e,
++	0x000e, 0x000e, 0x9006, 0x0028, 0x008e, 0x00de, 0x00ce, 0x9085,
++	0x0001, 0x0005, 0x2001, 0x0005, 0x2004, 0x9084, 0x0007, 0x0002,
++	0x1ef2, 0x1b25, 0x1ef2, 0x1ee8, 0x1eeb, 0x1eee, 0x1eeb, 0x1eee,
++	0x080c, 0x1b25, 0x0005, 0x080c, 0x1146, 0x0005, 0x080c, 0x1b25,
++	0x080c, 0x1146, 0x0005, 0x0126, 0x2091, 0x2600, 0x2079, 0x0200,
++	0x2071, 0x0260, 0x2069, 0x1800, 0x7817, 0x0000, 0x789b, 0x0814,
++	0x78a3, 0x0406, 0x789f, 0x0410, 0x2009, 0x013b, 0x200b, 0x0400,
++	0x781b, 0x0002, 0x783b, 0x001f, 0x7837, 0x0020, 0x7803, 0x1600,
++	0x012e, 0x0005, 0x2091, 0x2600, 0x781c, 0xd0a4, 0x190c, 0x2011,
++	0x7900, 0xd1dc, 0x1118, 0x9084, 0x0006, 0x001a, 0x9084, 0x000e,
++	0x0002, 0x1f39, 0x1f31, 0x71ab, 0x1f31, 0x1f33, 0x1f33, 0x1f33,
++	0x1f33, 0x7191, 0x1f31, 0x1f35, 0x1f31, 0x1f33, 0x1f31, 0x1f33,
++	0x1f31, 0x080c, 0x0d84, 0x0031, 0x0020, 0x080c, 0x7191, 0x080c,
++	0x71ab, 0x0005, 0x0006, 0x0016, 0x0026, 0x080c, 0xcd2b, 0x7930,
++	0x9184, 0x0003, 0x01c0, 0x2001, 0x19c3, 0x2004, 0x9005, 0x0170,
++	0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0d84, 0x00c6, 0x2001,
++	0x19c3, 0x2064, 0x080c, 0xad1e, 0x00ce, 0x00f8, 0x2009, 0x0040,
++	0x080c, 0x2014, 0x00d0, 0x9184, 0x0014, 0x01a0, 0x6a00, 0x9286,
++	0x0003, 0x0160, 0x080c, 0x6877, 0x1138, 0x080c, 0x6b40, 0x080c,
++	0x56d9, 0x080c, 0x67be, 0x0010, 0x080c, 0x55a0, 0x080c, 0x7243,
++	0x0041, 0x0018, 0x9184, 0x9540, 0x1dc8, 0x002e, 0x001e, 0x000e,
++	0x0005, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a30, 0x080c,
++	0x1827, 0x005e, 0x004e, 0x003e, 0x00ee, 0x0005, 0x0126, 0x2091,
++	0x2e00, 0x2071, 0x1800, 0x7128, 0x2001, 0x193e, 0x2102, 0x2001,
++	0x1946, 0x2102, 0x2001, 0x013b, 0x2102, 0x2079, 0x0200, 0x2001,
++	0x0201, 0x789e, 0x78a3, 0x0200, 0x9198, 0x0007, 0x831c, 0x831c,
++	0x831c, 0x9398, 0x0005, 0x2320, 0x9182, 0x0204, 0x1230, 0x2011,
++	0x0008, 0x8423, 0x8423, 0x8423, 0x0488, 0x9182, 0x024c, 0x1240,
++	0x2011, 0x0007, 0x8403, 0x8003, 0x9400, 0x9400, 0x9420, 0x0430,
++	0x9182, 0x02bc, 0x1238, 0x2011, 0x0006, 0x8403, 0x8003, 0x9400,
++	0x9420, 0x00e0, 0x9182, 0x034c, 0x1230, 0x2011, 0x0005, 0x8403,
++	0x8003, 0x9420, 0x0098, 0x9182, 0x042c, 0x1228, 0x2011, 0x0004,
++	0x8423, 0x8423, 0x0058, 0x9182, 0x059c, 0x1228, 0x2011, 0x0003,
++	0x8403, 0x9420, 0x0018, 0x2011, 0x0002, 0x8423, 0x9482, 0x0228,
++	0x8002, 0x8020, 0x8301, 0x9402, 0x0110, 0x0208, 0x8321, 0x8217,
++	0x8203, 0x9405, 0x789a, 0x012e, 0x0005, 0x0006, 0x00d6, 0x2069,
++	0x0200, 0x6814, 0x9084, 0xffc0, 0x910d, 0x6916, 0x00de, 0x000e,
++	0x0005, 0x00d6, 0x2069, 0x0200, 0x9005, 0x6810, 0x0110, 0xc0a5,
++	0x0008, 0xc0a4, 0x6812, 0x00de, 0x0005, 0x0006, 0x00d6, 0x2069,
++	0x0200, 0x6810, 0x9084, 0xfff8, 0x910d, 0x6912, 0x00de, 0x000e,
++	0x0005, 0x7938, 0x080c, 0x0d84, 0x00f6, 0x2079, 0x0200, 0x7902,
++	0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x7902, 0xa001,
++	0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x00fe, 0x0005, 0x0126,
++	0x2091, 0x2800, 0x2061, 0x0100, 0x2071, 0x1800, 0x2009, 0x0000,
++	0x080c, 0x27f5, 0x080c, 0x2718, 0x6054, 0x8004, 0x8004, 0x8004,
++	0x8004, 0x9084, 0x000c, 0x6150, 0x918c, 0xfff3, 0x9105, 0x6052,
++	0x6050, 0x9084, 0xfbff, 0x9085, 0x2000, 0x6052, 0x2009, 0x196a,
++	0x2011, 0x196b, 0x6358, 0x939c, 0x38f0, 0x2320, 0x080c, 0x275c,
++	0x1238, 0x939d, 0x4003, 0x94a5, 0x8603, 0x230a, 0x2412, 0x0030,
++	0x939d, 0x0203, 0x94a5, 0x8603, 0x230a, 0x2412, 0x9006, 0x080c,
++	0x2747, 0x9006, 0x080c, 0x272a, 0x20a9, 0x0012, 0x1d04, 0x2066,
++	0x2091, 0x6000, 0x1f04, 0x2066, 0x602f, 0x0100, 0x602f, 0x0000,
++	0x6050, 0x9085, 0x0400, 0x9084, 0xdfff, 0x6052, 0x6024, 0x6026,
++	0x080c, 0x2436, 0x2009, 0x00ef, 0x6132, 0x6136, 0x080c, 0x2446,
++	0x60e7, 0x0000, 0x61ea, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043,
++	0x0000, 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, 0x049f, 0x60bb,
++	0x0000, 0x20a9, 0x0018, 0x60bf, 0x0000, 0x1f04, 0x2093, 0x60bb,
++	0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012, 0x60bf, 0x0320, 0x60bf,
++	0x0018, 0x601b, 0x00f0, 0x601f, 0x001e, 0x600f, 0x006b, 0x602b,
++	0x402f, 0x012e, 0x0005, 0x00f6, 0x2079, 0x0140, 0x78c3, 0x0080,
++	0x78c3, 0x0083, 0x78c3, 0x0000, 0x00fe, 0x0005, 0x2001, 0x1834,
++	0x2003, 0x0000, 0x2001, 0x1833, 0x2003, 0x0001, 0x0005, 0x0126,
++	0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x6124, 0x9184, 0x5e2c,
++	0x1118, 0x9184, 0x0007, 0x002a, 0x9195, 0x0004, 0x9284, 0x0007,
++	0x0002, 0x20f3, 0x20d9, 0x20dc, 0x20df, 0x20e4, 0x20e6, 0x20ea,
++	0x20ee, 0x080c, 0x7ab7, 0x00b8, 0x080c, 0x7b8a, 0x00a0, 0x080c,
++	0x7b8a, 0x080c, 0x7ab7, 0x0078, 0x0099, 0x0068, 0x080c, 0x7ab7,
++	0x0079, 0x0048, 0x080c, 0x7b8a, 0x0059, 0x0028, 0x080c, 0x7b8a,
++	0x080c, 0x7ab7, 0x0029, 0x002e, 0x001e, 0x000e, 0x012e, 0x0005,
++	0x00a6, 0x6124, 0x6028, 0xd09c, 0x0118, 0xd19c, 0x1904, 0x232f,
++	0xd1f4, 0x0110, 0x080c, 0x0d84, 0x080c, 0x6877, 0x05a0, 0x7000,
++	0x9086, 0x0003, 0x01f0, 0x6024, 0x9084, 0x1800, 0x01d0, 0x080c,
++	0x689a, 0x0118, 0x080c, 0x6888, 0x11a0, 0x6027, 0x0020, 0x6043,
++	0x0000, 0x709c, 0x9005, 0x1150, 0x709f, 0x0001, 0x00d6, 0x2069,
++	0x0140, 0x080c, 0x68d0, 0x00de, 0x1904, 0x2332, 0x080c, 0x6b4a,
++	0x0428, 0x080c, 0x689a, 0x1590, 0x6024, 0x9084, 0x1800, 0x1108,
++	0x0468, 0x080c, 0x6b4a, 0x080c, 0x6b40, 0x080c, 0x56d9, 0x080c,
++	0x67be, 0x0804, 0x232f, 0xd1ac, 0x1508, 0x6024, 0xd0dc, 0x1170,
++	0xd0e4, 0x1178, 0xd0d4, 0x1190, 0xd0cc, 0x0130, 0x7090, 0x9086,
++	0x0028, 0x1110, 0x080c, 0x6a2d, 0x0804, 0x232f, 0x080c, 0x6b45,
++	0x0048, 0x2001, 0x194c, 0x2003, 0x0002, 0x0020, 0x080c, 0x69a3,
++	0x0804, 0x232f, 0x080c, 0x6ac8, 0x0804, 0x232f, 0xd1ac, 0x0904,
++	0x224f, 0x080c, 0x6877, 0x11c0, 0x6027, 0x0020, 0x0006, 0x0026,
++	0x0036, 0x080c, 0x6891, 0x1158, 0x080c, 0x6b40, 0x080c, 0x56d9,
++	0x080c, 0x67be, 0x003e, 0x002e, 0x000e, 0x00ae, 0x0005, 0x003e,
++	0x002e, 0x000e, 0x080c, 0x6853, 0x0016, 0x0046, 0x00c6, 0x644c,
++	0x9486, 0xf0f0, 0x1138, 0x2061, 0x0100, 0x644a, 0x6043, 0x0090,
++	0x6043, 0x0010, 0x74d6, 0x948c, 0xff00, 0x7034, 0xd084, 0x0178,
++	0x9186, 0xf800, 0x1160, 0x7040, 0xd084, 0x1148, 0xc085, 0x7042,
++	0x0036, 0x2418, 0x2011, 0x8016, 0x080c, 0x447f, 0x003e, 0x080c,
++	0xb752, 0x1904, 0x222c, 0x9196, 0xff00, 0x05a8, 0x7058, 0x9084,
++	0x00ff, 0x810f, 0x81ff, 0x0110, 0x9116, 0x0568, 0x7130, 0xd184,
++	0x1550, 0x080c, 0x2e69, 0x0128, 0xc18d, 0x7132, 0x080c, 0x5f25,
++	0x1510, 0x6240, 0x9294, 0x0010, 0x0130, 0x6248, 0x9294, 0xff00,
++	0x9296, 0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, 0x222c, 0x7034,
++	0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, 0x222c,
++	0xc1ad, 0x2102, 0x0036, 0x73d4, 0x2011, 0x8013, 0x080c, 0x447f,
++	0x003e, 0x0804, 0x222c, 0x7034, 0xd08c, 0x1140, 0x2001, 0x180c,
++	0x200c, 0xd1ac, 0x1904, 0x222c, 0xc1ad, 0x2102, 0x0036, 0x73d4,
++	0x2011, 0x8013, 0x080c, 0x447f, 0x003e, 0x7130, 0xc185, 0x7132,
++	0x2011, 0x1853, 0x220c, 0xd1a4, 0x01f0, 0x0016, 0x2009, 0x0001,
++	0x2011, 0x0100, 0x080c, 0x7a0a, 0x2019, 0x000e, 0x00c6, 0x2061,
++	0x0000, 0x080c, 0xc941, 0x00ce, 0x9484, 0x00ff, 0x9080, 0x2e6e,
++	0x200d, 0x918c, 0xff00, 0x810f, 0x2120, 0x9006, 0x2009, 0x000e,
++	0x080c, 0xc9c5, 0x001e, 0xd1ac, 0x1140, 0x0016, 0x900e, 0x2019,
++	0x0004, 0x080c, 0x2ce5, 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9,
++	0x007f, 0x900e, 0x080c, 0x5c0d, 0x1110, 0x080c, 0x56f3, 0x8108,
++	0x1f04, 0x2222, 0x00be, 0x015e, 0x00ce, 0x004e, 0x080c, 0x94da,
++	0x60e3, 0x0000, 0x001e, 0x2001, 0x1800, 0x2014, 0x9296, 0x0004,
++	0x1170, 0xd19c, 0x11a0, 0x2011, 0x180c, 0x2214, 0xd29c, 0x1120,
++	0x6204, 0x9295, 0x0002, 0x6206, 0x6228, 0xc29d, 0x622a, 0x2003,
++	0x0001, 0x2001, 0x1824, 0x2003, 0x0000, 0x6027, 0x0020, 0xd194,
++	0x0904, 0x232f, 0x0016, 0x6220, 0xd2b4, 0x0904, 0x22db, 0x080c,
++	0x7893, 0x080c, 0x8b50, 0x6027, 0x0004, 0x00f6, 0x2019, 0x19bd,
++	0x2304, 0x907d, 0x0904, 0x22ac, 0x7804, 0x9086, 0x0032, 0x1904,
++	0x22ac, 0x00d6, 0x00c6, 0x00e6, 0x0096, 0x2069, 0x0140, 0x7814,
++	0x685e, 0x7808, 0x685a, 0x6043, 0x0002, 0x2001, 0x0003, 0x8001,
++	0x1df0, 0x6043, 0x0000, 0x2001, 0x003c, 0x8001, 0x1df0, 0x2001,
++	0x1000, 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 0x2001, 0x001e,
++	0x8001, 0x0240, 0x20a9, 0x0009, 0x080c, 0x27d0, 0x6904, 0xd1dc,
++	0x1140, 0x0cb0, 0x2001, 0x0100, 0x080c, 0x28a5, 0x9006, 0x080c,
++	0x28a5, 0x080c, 0x8026, 0x080c, 0x8125, 0x7814, 0x2048, 0xa867,
++	0x0103, 0x2f60, 0x080c, 0x9554, 0x009e, 0x00ee, 0x00ce, 0x00de,
++	0x00fe, 0x001e, 0x00ae, 0x0005, 0x00fe, 0x00d6, 0x2069, 0x0140,
++	0x6804, 0x9084, 0x4000, 0x0138, 0x2001, 0x1000, 0x080c, 0x28a5,
++	0x9006, 0x080c, 0x28a5, 0x00de, 0x00c6, 0x2061, 0x19b4, 0x6028,
++	0x909a, 0x00c8, 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0x8b2c,
++	0x0804, 0x232e, 0x2061, 0x0100, 0x62c0, 0x080c, 0x9367, 0x2019,
++	0x19bd, 0x2304, 0x9065, 0x0120, 0x2009, 0x0027, 0x080c, 0x95ce,
++	0x00ce, 0x0804, 0x232e, 0xd2bc, 0x05f0, 0x080c, 0x78a0, 0x6014,
++	0x9084, 0x1984, 0x9085, 0x0010, 0x6016, 0x6027, 0x0004, 0x00d6,
++	0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0138, 0x2001, 0x1000,
++	0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 0x00de, 0x00c6, 0x2061,
++	0x19b4, 0x6044, 0x909a, 0x00c8, 0x1608, 0x8000, 0x6046, 0x603c,
++	0x00ce, 0x9005, 0x0558, 0x2009, 0x07d0, 0x080c, 0x7898, 0x9080,
++	0x0008, 0x2004, 0x9086, 0x0006, 0x1138, 0x6114, 0x918c, 0x1984,
++	0x918d, 0x0012, 0x6116, 0x00d0, 0x6114, 0x918c, 0x1984, 0x918d,
++	0x0016, 0x6116, 0x0098, 0x6027, 0x0004, 0x0080, 0x0036, 0x2019,
++	0x0001, 0x080c, 0x8dfe, 0x003e, 0x2019, 0x19c3, 0x2304, 0x9065,
++	0x0120, 0x2009, 0x004f, 0x080c, 0x95ce, 0x00ce, 0x001e, 0xd19c,
++	0x0904, 0x23a1, 0x7034, 0xd0ac, 0x1904, 0x2376, 0x0016, 0x0156,
++	0x6027, 0x0008, 0x6050, 0x9085, 0x0040, 0x6052, 0x6050, 0x9084,
++	0xfbcf, 0x6052, 0x080c, 0x27ef, 0x9085, 0x2000, 0x6052, 0x20a9,
++	0x0012, 0x1d04, 0x2349, 0x080c, 0x78c7, 0x1f04, 0x2349, 0x6050,
++	0x9085, 0x0400, 0x9084, 0xdfbf, 0x6052, 0x20a9, 0x0028, 0xa001,
++	0x1f04, 0x2357, 0x6150, 0x9185, 0x1400, 0x6052, 0x20a9, 0x0366,
++	0x1d04, 0x2360, 0x080c, 0x78c7, 0x6020, 0xd09c, 0x1130, 0x015e,
++	0x6152, 0x001e, 0x6027, 0x0008, 0x04a0, 0x080c, 0x27b7, 0x1f04,
++	0x2360, 0x015e, 0x6152, 0x001e, 0x6027, 0x0008, 0x0016, 0x6028,
++	0xc09c, 0x602a, 0x080c, 0x94da, 0x60e3, 0x0000, 0x080c, 0xcd0a,
++	0x080c, 0xcd25, 0x080c, 0x4dee, 0xd0fc, 0x1138, 0x080c, 0xb752,
++	0x1120, 0x9085, 0x0001, 0x080c, 0x68c0, 0x9006, 0x080c, 0x28a5,
++	0x2009, 0x0002, 0x080c, 0x27f5, 0x00e6, 0x2071, 0x1800, 0x7003,
++	0x0004, 0x080c, 0x0e3b, 0x00ee, 0x6027, 0x0008, 0x080c, 0x0b69,
++	0x001e, 0x918c, 0xffd0, 0x6126, 0x00ae, 0x0005, 0x0006, 0x0016,
++	0x0026, 0x0036, 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071,
++	0x1800, 0x71cc, 0x70ce, 0x9116, 0x0904, 0x23f5, 0x81ff, 0x01a0,
++	0x2009, 0x0000, 0x080c, 0x27f5, 0x2011, 0x8011, 0x2019, 0x010e,
++	0x231c, 0x939e, 0x0007, 0x1118, 0x2019, 0x0001, 0x0010, 0x2019,
++	0x0000, 0x080c, 0x447f, 0x0448, 0x2001, 0x1975, 0x200c, 0x81ff,
++	0x1140, 0x2001, 0x0109, 0x2004, 0xd0b4, 0x0118, 0x2019, 0x0003,
++	0x0008, 0x2118, 0x2011, 0x8012, 0x080c, 0x447f, 0x080c, 0x0e3b,
++	0x080c, 0x4dee, 0xd0fc, 0x1188, 0x080c, 0xb752, 0x1170, 0x00c6,
++	0x080c, 0x2491, 0x080c, 0x8d36, 0x2061, 0x0100, 0x2019, 0x0028,
++	0x2009, 0x0002, 0x080c, 0x2ce5, 0x00ce, 0x012e, 0x00fe, 0x00ee,
++	0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x2028, 0x918c, 0x00ff,
++	0x2130, 0x9094, 0xff00, 0x11f0, 0x2011, 0x1836, 0x2214, 0xd2ac,
++	0x11c8, 0x81ff, 0x01e8, 0x2011, 0x181d, 0x2204, 0x9106, 0x1190,
++	0x2011, 0x181e, 0x2214, 0x9294, 0xff00, 0x9584, 0xff00, 0x9206,
++	0x1148, 0x2011, 0x181e, 0x2214, 0x9294, 0x00ff, 0x9584, 0x00ff,
++	0x9206, 0x1120, 0x2500, 0x080c, 0x745f, 0x0048, 0x9584, 0x00ff,
++	0x9080, 0x2e6e, 0x200d, 0x918c, 0xff00, 0x810f, 0x9006, 0x0005,
++	0x9080, 0x2e6e, 0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, 0x2069,
++	0x0140, 0x2001, 0x1816, 0x2003, 0x00ef, 0x20a9, 0x0010, 0x9006,
++	0x6852, 0x6856, 0x1f04, 0x2441, 0x00de, 0x0005, 0x0006, 0x00d6,
++	0x0026, 0x2069, 0x0140, 0x2001, 0x1816, 0x2102, 0x8114, 0x8214,
++	0x8214, 0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, 0x82ff,
++	0x1128, 0x9184, 0x000f, 0x9080, 0xd10f, 0x2005, 0x6856, 0x8211,
++	0x1f04, 0x2456, 0x002e, 0x00de, 0x000e, 0x0005, 0x00c6, 0x2061,
++	0x1800, 0x6030, 0x0110, 0xc09d, 0x0008, 0xc09c, 0x6032, 0x00ce,
++	0x0005, 0x0156, 0x00d6, 0x0026, 0x0016, 0x0006, 0x2069, 0x0140,
++	0x6980, 0x9116, 0x0180, 0x9112, 0x1230, 0x8212, 0x8210, 0x22a8,
++	0x2001, 0x0402, 0x0018, 0x22a8, 0x2001, 0x0404, 0x680e, 0x1f04,
++	0x2486, 0x680f, 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e,
++	0x0005, 0x080c, 0x4dea, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006,
++	0x0046, 0x2020, 0x2009, 0x002e, 0x080c, 0xc9c5, 0x004e, 0x0005,
++	0x00f6, 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0904,
++	0x24fd, 0x080c, 0x275c, 0x0660, 0x9084, 0x0700, 0x908e, 0x0600,
++	0x1120, 0x2011, 0x4000, 0x900e, 0x0458, 0x908e, 0x0500, 0x1120,
++	0x2011, 0x8000, 0x900e, 0x0420, 0x908e, 0x0400, 0x1120, 0x9016,
++	0x2009, 0x0001, 0x00e8, 0x908e, 0x0300, 0x1120, 0x9016, 0x2009,
++	0x0002, 0x00b0, 0x908e, 0x0200, 0x1120, 0x9016, 0x2009, 0x0004,
++	0x0078, 0x908e, 0x0100, 0x1548, 0x9016, 0x2009, 0x0008, 0x0040,
++	0x9084, 0x0700, 0x908e, 0x0300, 0x1500, 0x2011, 0x0030, 0x0058,
++	0x2300, 0x9080, 0x0020, 0x2018, 0x080c, 0x7a4b, 0x928c, 0xff00,
++	0x0110, 0x2011, 0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, 0x78c2,
++	0x2009, 0x0138, 0x220a, 0x080c, 0x6877, 0x1118, 0x2009, 0x193c,
++	0x220a, 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8,
++	0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170,
++	0x200c, 0x8000, 0x2014, 0x9184, 0x0003, 0x0110, 0x080c, 0x0d84,
++	0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x2001, 0x0171, 0x2004,
++	0xd0dc, 0x0168, 0x2001, 0x0170, 0x200c, 0x918c, 0x00ff, 0x918e,
++	0x004c, 0x1128, 0x200c, 0x918c, 0xff00, 0x810f, 0x0005, 0x900e,
++	0x2001, 0x0227, 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108,
++	0x2001, 0x0226, 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108,
++	0x0005, 0x0018, 0x000c, 0x0018, 0x0020, 0x1000, 0x0800, 0x1000,
++	0x1800, 0x0156, 0x0006, 0x0016, 0x0026, 0x00e6, 0x2001, 0x195d,
++	0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d84, 0x0033, 0x00ee, 0x002e,
++	0x001e, 0x000e, 0x015e, 0x0005, 0x255b, 0x2579, 0x259d, 0x259f,
++	0x25c8, 0x25ca, 0x25cc, 0x2001, 0x0001, 0x080c, 0x23a6, 0x080c,
++	0x27b2, 0x2001, 0x195f, 0x2003, 0x0000, 0x7828, 0x9084, 0xe1d7,
++	0x782a, 0x9006, 0x20a9, 0x0009, 0x080c, 0x2770, 0x2001, 0x195d,
++	0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x25cd, 0x080c, 0x78a5,
++	0x0005, 0x2009, 0x1962, 0x200b, 0x0000, 0x2001, 0x1967, 0x2003,
++	0x0036, 0x2001, 0x1966, 0x2003, 0x002a, 0x2001, 0x195f, 0x2003,
++	0x0001, 0x9006, 0x080c, 0x272a, 0x2001, 0xffff, 0x20a9, 0x0009,
++	0x080c, 0x2770, 0x2001, 0x195d, 0x2003, 0x0006, 0x2009, 0x001e,
++	0x2011, 0x25cd, 0x080c, 0x78a5, 0x0005, 0x080c, 0x0d84, 0x2001,
++	0x1967, 0x2003, 0x0036, 0x2001, 0x195f, 0x2003, 0x0003, 0x7a38,
++	0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001,
++	0x0001, 0x080c, 0x272a, 0x2001, 0x1963, 0x2003, 0x0000, 0x2001,
++	0xffff, 0x20a9, 0x0009, 0x080c, 0x2770, 0x2001, 0x195d, 0x2003,
++	0x0006, 0x2009, 0x001e, 0x2011, 0x25cd, 0x080c, 0x78a5, 0x0005,
++	0x080c, 0x0d84, 0x080c, 0x0d84, 0x0005, 0x0006, 0x0016, 0x0026,
++	0x00e6, 0x00f6, 0x0156, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100,
++	0x2001, 0x195f, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d84, 0x0043,
++	0x012e, 0x015e, 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005,
++	0x25ef, 0x260f, 0x264f, 0x267f, 0x26a3, 0x26b3, 0x26b5, 0x080c,
++	0x2764, 0x11b0, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x1965,
++	0x2104, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0xc08d,
++	0x0008, 0xc085, 0x200a, 0x2001, 0x195d, 0x2003, 0x0001, 0x0030,
++	0x080c, 0x26d9, 0x2001, 0xffff, 0x080c, 0x256a, 0x0005, 0x080c,
++	0x26b7, 0x05e0, 0x2009, 0x1966, 0x2104, 0x8001, 0x200a, 0x080c,
++	0x2764, 0x1178, 0x7850, 0x9084, 0xefff, 0x7852, 0x7a38, 0x9294,
++	0x0005, 0x9296, 0x0005, 0x0518, 0x2009, 0x1965, 0x2104, 0xc085,
++	0x200a, 0x2009, 0x1962, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005,
++	0x0118, 0x080c, 0x26bf, 0x00c0, 0x200b, 0x0000, 0x7a38, 0x9294,
++	0x0006, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001,
++	0x080c, 0x2747, 0x2001, 0x195f, 0x2003, 0x0002, 0x0028, 0x2001,
++	0x195d, 0x2003, 0x0003, 0x0010, 0x080c, 0x258c, 0x0005, 0x080c,
++	0x26b7, 0x0560, 0x2009, 0x1966, 0x2104, 0x8001, 0x200a, 0x080c,
++	0x2764, 0x1168, 0x7850, 0x9084, 0xefff, 0x7852, 0x2001, 0x195d,
++	0x2003, 0x0003, 0x2001, 0x195e, 0x2003, 0x0000, 0x00b8, 0x2009,
++	0x1966, 0x2104, 0x9005, 0x1118, 0x080c, 0x26fc, 0x0010, 0x080c,
++	0x26cc, 0x080c, 0x26bf, 0x2009, 0x1962, 0x200b, 0x0000, 0x2001,
++	0x195f, 0x2003, 0x0001, 0x080c, 0x258c, 0x0000, 0x0005, 0x04b9,
++	0x0508, 0x080c, 0x2764, 0x11b8, 0x7850, 0x9084, 0xefff, 0x7852,
++	0x2009, 0x1963, 0x2104, 0x8000, 0x200a, 0x9086, 0x0007, 0x0108,
++	0x0078, 0x2001, 0x1968, 0x2003, 0x000a, 0x2009, 0x1965, 0x2104,
++	0xc0fd, 0x200a, 0x0038, 0x0419, 0x2001, 0x195f, 0x2003, 0x0004,
++	0x080c, 0x25b7, 0x0005, 0x0099, 0x0168, 0x080c, 0x2764, 0x1138,
++	0x7850, 0x9084, 0xefff, 0x7852, 0x080c, 0x25a3, 0x0018, 0x0079,
++	0x080c, 0x25b7, 0x0005, 0x080c, 0x0d84, 0x080c, 0x0d84, 0x2009,
++	0x1967, 0x2104, 0x8001, 0x200a, 0x090c, 0x2718, 0x0005, 0x7a38,
++	0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001,
++	0x0001, 0x080c, 0x2747, 0x0005, 0x7a38, 0x9294, 0x0006, 0x9296,
++	0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x272a,
++	0x0005, 0x2009, 0x1962, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005,
++	0x0108, 0x0068, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, 0x9296,
++	0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x04d9, 0x7a38,
++	0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001,
++	0x0001, 0x080c, 0x2747, 0x0005, 0x0086, 0x2001, 0x1965, 0x2004,
++	0x9084, 0x7fff, 0x090c, 0x0d84, 0x2009, 0x1964, 0x2144, 0x8846,
++	0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120, 0xd084, 0x1120, 0x080c,
++	0x0d84, 0x9006, 0x0010, 0x2001, 0x0001, 0x00a1, 0x008e, 0x0005,
++	0x0006, 0x0156, 0x2001, 0x195d, 0x20a9, 0x0009, 0x2003, 0x0000,
++	0x8000, 0x1f04, 0x271e, 0x2001, 0x1964, 0x2003, 0x8000, 0x015e,
++	0x000e, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0158,
++	0x7838, 0x9084, 0xfff9, 0x9085, 0x0004, 0x783a, 0x2009, 0x196a,
++	0x210c, 0x795a, 0x0050, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0006,
++	0x783a, 0x2009, 0x196b, 0x210c, 0x795a, 0x00fe, 0x0005, 0x00f6,
++	0x2079, 0x0100, 0x9085, 0x0000, 0x0138, 0x7838, 0x9084, 0xfffa,
++	0x9085, 0x0004, 0x783a, 0x0030, 0x7838, 0x9084, 0xfffb, 0x9085,
++	0x0005, 0x783a, 0x00fe, 0x0005, 0x0006, 0x2001, 0x0100, 0x2004,
++	0x9082, 0x0007, 0x000e, 0x0005, 0x0156, 0x20a9, 0x0064, 0x7820,
++	0x080c, 0x27ef, 0xd09c, 0x1110, 0x1f04, 0x2767, 0x015e, 0x0005,
++	0x0126, 0x0016, 0x0006, 0x2091, 0x8000, 0x7850, 0x9085, 0x0040,
++	0x7852, 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x27ef, 0x9085,
++	0x2000, 0x7852, 0x000e, 0x2008, 0x9186, 0x0000, 0x1118, 0x783b,
++	0x0007, 0x0090, 0x9186, 0x0001, 0x1118, 0x783b, 0x0006, 0x0060,
++	0x9186, 0x0002, 0x1118, 0x783b, 0x0005, 0x0030, 0x9186, 0x0003,
++	0x1118, 0x783b, 0x0004, 0x0000, 0x0006, 0x1d04, 0x279d, 0x080c,
++	0x78c7, 0x1f04, 0x279d, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf,
++	0x7852, 0x080c, 0x27ef, 0x9085, 0x1000, 0x7852, 0x000e, 0x001e,
++	0x012e, 0x0005, 0x7850, 0x9084, 0xffcf, 0x7852, 0x0005, 0x0006,
++	0x0156, 0x00f6, 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd0ac,
++	0x1130, 0x7820, 0xd0e4, 0x1140, 0x1f04, 0x27c1, 0x0028, 0x7854,
++	0xd08c, 0x1110, 0x1f04, 0x27c7, 0x00fe, 0x015e, 0x000e, 0x0005,
++	0x1d04, 0x27d0, 0x080c, 0x78c7, 0x1f04, 0x27d0, 0x0005, 0x0006,
++	0x2001, 0x1969, 0x2004, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006,
++	0x2001, 0x1969, 0x2004, 0x9086, 0x0001, 0x000e, 0x0005, 0x0006,
++	0x2001, 0x1969, 0x2004, 0x9086, 0x0002, 0x000e, 0x0005, 0xa001,
++	0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, 0x2001, 0x1975,
++	0x2102, 0x000e, 0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc, 0x0140,
++	0x2009, 0x0170, 0x2104, 0x200b, 0x0080, 0xa001, 0xa001, 0x200a,
++	0x0005, 0x0036, 0x0046, 0x2001, 0x0141, 0x200c, 0x918c, 0xff00,
++	0x9186, 0x2000, 0x0118, 0x9186, 0x0100, 0x1580, 0x2009, 0x017f,
++	0x200b, 0x00a2, 0x2019, 0x0160, 0x2324, 0x2011, 0x0003, 0x2009,
++	0x0169, 0x2104, 0xa001, 0x210c, 0x910e, 0x1dc8, 0x9084, 0x0007,
++	0x9086, 0x0003, 0x11b8, 0x2304, 0x9402, 0x02a0, 0x1d68, 0x8211,
++	0x1d70, 0x84ff, 0x0170, 0x2001, 0x0141, 0x200c, 0x918c, 0xff00,
++	0x9186, 0x0100, 0x0130, 0x2009, 0x180c, 0x2104, 0xc0dd, 0x200a,
++	0x0008, 0x0419, 0x2001, 0x017f, 0x2003, 0x0000, 0x004e, 0x003e,
++	0x0005, 0x2001, 0x180c, 0x2004, 0xd0dc, 0x01b0, 0x2001, 0x0160,
++	0x2004, 0x9005, 0x0140, 0x2001, 0x0141, 0x2004, 0x9084, 0xff00,
++	0x9086, 0x0100, 0x1148, 0x0126, 0x2091, 0x8000, 0x0016, 0x0026,
++	0x0021, 0x002e, 0x001e, 0x012e, 0x0005, 0x00c6, 0x2061, 0x0100,
++	0x6014, 0x0006, 0x2001, 0x0161, 0x2003, 0x0000, 0x6017, 0x0018,
++	0xa001, 0xa001, 0x602f, 0x0008, 0x6104, 0x918e, 0x0010, 0x6106,
++	0x918e, 0x0010, 0x6106, 0x6017, 0x0040, 0x2001, 0x1000, 0x0429,
++	0x9006, 0x0419, 0x001e, 0x9184, 0x0003, 0x01c0, 0x0036, 0x2019,
++	0x0141, 0x2304, 0x9084, 0xff00, 0x9086, 0x0800, 0x1dd0, 0x919c,
++	0xffe4, 0x9184, 0x0001, 0x0118, 0x9385, 0x0009, 0x6016, 0x9184,
++	0x0002, 0x0118, 0x9385, 0x0012, 0x6016, 0x003e, 0x2001, 0x180c,
++	0x200c, 0xc1dc, 0x2102, 0x00ce, 0x0005, 0x0016, 0x0026, 0x2009,
++	0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, 0x002e, 0x001e,
++	0x0005, 0x2b1d, 0x2b1d, 0x2941, 0x2941, 0x294d, 0x294d, 0x2959,
++	0x2959, 0x2967, 0x2967, 0x2973, 0x2973, 0x2981, 0x2981, 0x298f,
++	0x298f, 0x29a1, 0x29a1, 0x29ad, 0x29ad, 0x29bb, 0x29bb, 0x29d9,
++	0x29d9, 0x29f9, 0x29f9, 0x29c9, 0x29c9, 0x29e9, 0x29e9, 0x2a07,
++	0x2a07, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f,
++	0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f,
++	0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f,
++	0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f,
++	0x299f, 0x2a19, 0x2a19, 0x2a25, 0x2a25, 0x2a33, 0x2a33, 0x2a41,
++	0x2a41, 0x2a51, 0x2a51, 0x2a5f, 0x2a5f, 0x2a6f, 0x2a6f, 0x2a7f,
++	0x2a7f, 0x2a91, 0x2a91, 0x2a9f, 0x2a9f, 0x2aaf, 0x2aaf, 0x2ad1,
++	0x2ad1, 0x2af3, 0x2af3, 0x2abf, 0x2abf, 0x2ae2, 0x2ae2, 0x2b02,
++	0x2b02, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f,
++	0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f,
++	0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f,
++	0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f,
++	0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f,
++	0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f,
++	0x299f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++	0x0156, 0x080c, 0x20bf, 0x0804, 0x2b15, 0x0106, 0x0006, 0x0126,
++	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eda, 0x0804,
++	0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++	0x0156, 0x080c, 0x1eda, 0x080c, 0x20bf, 0x0804, 0x2b15, 0x0106,
++	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
++	0x1f12, 0x0804, 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++	0x0136, 0x0146, 0x0156, 0x080c, 0x20bf, 0x080c, 0x1f12, 0x0804,
++	0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++	0x0156, 0x080c, 0x1eda, 0x080c, 0x1f12, 0x0804, 0x2b15, 0x0106,
++	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
++	0x1eda, 0x080c, 0x20bf, 0x080c, 0x1f12, 0x0804, 0x2b15, 0xa001,
++	0x0cf0, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++	0x0156, 0x080c, 0x129f, 0x0804, 0x2b15, 0x0106, 0x0006, 0x0126,
++	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20bf, 0x080c,
++	0x129f, 0x0804, 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++	0x0136, 0x0146, 0x0156, 0x080c, 0x1eda, 0x080c, 0x129f, 0x0804,
++	0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++	0x0156, 0x080c, 0x20bf, 0x080c, 0x129f, 0x080c, 0x1f12, 0x0804,
++	0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++	0x0156, 0x080c, 0x1eda, 0x080c, 0x20bf, 0x080c, 0x129f, 0x0804,
++	0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++	0x0156, 0x080c, 0x1eda, 0x080c, 0x129f, 0x080c, 0x1f12, 0x0804,
++	0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++	0x0156, 0x080c, 0x129f, 0x080c, 0x1f12, 0x0804, 0x2b15, 0x0106,
++	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
++	0x1eda, 0x080c, 0x20bf, 0x080c, 0x129f, 0x080c, 0x1f12, 0x0804,
++	0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++	0x0156, 0x080c, 0x2500, 0x0804, 0x2b15, 0x0106, 0x0006, 0x0126,
++	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2500, 0x080c,
++	0x20bf, 0x0804, 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++	0x0136, 0x0146, 0x0156, 0x080c, 0x2500, 0x080c, 0x1eda, 0x0804,
++	0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++	0x0156, 0x080c, 0x2500, 0x080c, 0x1eda, 0x080c, 0x20bf, 0x0804,
++	0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++	0x0156, 0x080c, 0x2500, 0x080c, 0x1f12, 0x0804, 0x2b15, 0x0106,
++	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
++	0x2500, 0x080c, 0x20bf, 0x080c, 0x1f12, 0x0804, 0x2b15, 0x0106,
++	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
++	0x2500, 0x080c, 0x1eda, 0x080c, 0x1f12, 0x0804, 0x2b15, 0x0106,
++	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
++	0x2500, 0x080c, 0x1eda, 0x080c, 0x20bf, 0x080c, 0x1f12, 0x0804,
++	0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++	0x0156, 0x080c, 0x2500, 0x080c, 0x129f, 0x0804, 0x2b15, 0x0106,
++	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
++	0x2500, 0x080c, 0x20bf, 0x080c, 0x129f, 0x0804, 0x2b15, 0x0106,
++	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
++	0x2500, 0x080c, 0x1eda, 0x080c, 0x129f, 0x0804, 0x2b15, 0x0106,
++	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
++	0x2500, 0x080c, 0x20bf, 0x080c, 0x129f, 0x080c, 0x1f12, 0x0804,
++	0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++	0x0156, 0x080c, 0x2500, 0x080c, 0x1eda, 0x080c, 0x20bf, 0x080c,
++	0x129f, 0x0498, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
++	0x0146, 0x0156, 0x080c, 0x2500, 0x080c, 0x1eda, 0x080c, 0x129f,
++	0x080c, 0x1f12, 0x0410, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++	0x0136, 0x0146, 0x0156, 0x080c, 0x2500, 0x080c, 0x129f, 0x080c,
++	0x1f12, 0x0098, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
++	0x0146, 0x0156, 0x080c, 0x2500, 0x080c, 0x1eda, 0x080c, 0x20bf,
++	0x080c, 0x129f, 0x080c, 0x1f12, 0x0000, 0x015e, 0x014e, 0x013e,
++	0x01de, 0x01ce, 0x012e, 0x000e, 0x010e, 0x000d, 0x00b6, 0x00c6,
++	0x0026, 0x0046, 0x9026, 0x080c, 0x5eeb, 0x1904, 0x2c03, 0x72d8,
++	0x2001, 0x194b, 0x2004, 0x9005, 0x1110, 0xd29c, 0x0148, 0xd284,
++	0x1138, 0xd2bc, 0x1904, 0x2c03, 0x080c, 0x2c08, 0x0804, 0x2c03,
++	0xd2cc, 0x1904, 0x2c03, 0x080c, 0x6877, 0x1120, 0x70a7, 0xffff,
++	0x0804, 0x2c03, 0xd294, 0x0120, 0x70a7, 0xffff, 0x0804, 0x2c03,
++	0x080c, 0x2e64, 0x0140, 0x080c, 0xb759, 0x1904, 0x2ba4, 0x70a7,
++	0xffff, 0x0804, 0x2c03, 0x2001, 0x1816, 0x203c, 0x728c, 0xd284,
++	0x0904, 0x2ba4, 0xd28c, 0x1904, 0x2ba4, 0x0036, 0x73a4, 0x938e,
++	0xffff, 0x1110, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1c80, 0x2c04,
++	0x938c, 0x0001, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084,
++	0x00ff, 0x970e, 0x0540, 0x908e, 0x0000, 0x0528, 0x908e, 0x00ff,
++	0x1150, 0x7230, 0xd284, 0x1518, 0x728c, 0xc28d, 0x728e, 0x70a7,
++	0xffff, 0x003e, 0x0408, 0x900e, 0x080c, 0x23fd, 0x080c, 0x5bb0,
++	0x11a0, 0x080c, 0x5f2d, 0x1150, 0x7030, 0xd08c, 0x0118, 0xb800,
++	0xd0bc, 0x0120, 0x080c, 0x2c1f, 0x0140, 0x0028, 0x080c, 0x2d5b,
++	0x080c, 0x2c4b, 0x0110, 0x8318, 0x0838, 0x73a6, 0x0010, 0x70a7,
++	0xffff, 0x003e, 0x0804, 0x2c03, 0x9780, 0x2e6e, 0x203d, 0x97bc,
++	0xff00, 0x873f, 0x2041, 0x007e, 0x70a4, 0x9096, 0xffff, 0x1118,
++	0x900e, 0x28a8, 0x0050, 0x9812, 0x0220, 0x2008, 0x9802, 0x20a8,
++	0x0020, 0x70a7, 0xffff, 0x0804, 0x2c03, 0x2700, 0x0156, 0x0016,
++	0x9106, 0x05b0, 0xc484, 0x080c, 0x5c0d, 0x0138, 0x080c, 0xb759,
++	0x1578, 0x080c, 0x5bb0, 0x15a0, 0x0008, 0xc485, 0x080c, 0x5f2d,
++	0x1130, 0x7030, 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, 0x728c,
++	0xd28c, 0x0180, 0x080c, 0x5f2d, 0x9082, 0x0006, 0x02c8, 0xd484,
++	0x1118, 0x080c, 0x5bd1, 0x0028, 0x080c, 0x2de6, 0x0188, 0x080c,
++	0x2e11, 0x0070, 0x080c, 0x2d5b, 0x080c, 0xb759, 0x1148, 0x080c,
++	0x2c4b, 0x0170, 0x0028, 0x080c, 0x2de6, 0x0110, 0x0441, 0x0140,
++	0x001e, 0x8108, 0x015e, 0x1f04, 0x2bbd, 0x70a7, 0xffff, 0x0018,
++	0x001e, 0x015e, 0x71a6, 0x004e, 0x002e, 0x00ce, 0x00be, 0x0005,
++	0x00c6, 0x0016, 0x70a7, 0x0001, 0x2009, 0x007e, 0x080c, 0x5bb0,
++	0x1158, 0xb813, 0x00ff, 0xb817, 0xfffe, 0x080c, 0x2d5b, 0x0499,
++	0x0118, 0x70d8, 0xc0bd, 0x70da, 0x001e, 0x00ce, 0x0005, 0x0016,
++	0x0076, 0x00d6, 0x00c6, 0x2001, 0x1857, 0x2004, 0x9084, 0x00ff,
++	0xb842, 0x080c, 0x95a1, 0x01d0, 0x2b00, 0x6012, 0x080c, 0xb4e6,
++	0x6023, 0x0001, 0x9006, 0x080c, 0x5b4d, 0x2001, 0x0000, 0x080c,
++	0x5b61, 0x0126, 0x2091, 0x8000, 0x70a0, 0x8000, 0x70a2, 0x012e,
++	0x2009, 0x0004, 0x080c, 0x95ce, 0x9085, 0x0001, 0x00ce, 0x00de,
++	0x007e, 0x001e, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001,
++	0x1857, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0x95a1, 0x0548,
++	0x2b00, 0x6012, 0xb800, 0xc0c4, 0xb802, 0xb8a0, 0x9086, 0x007e,
++	0x0140, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1110, 0x080c,
++	0x2d1a, 0x080c, 0xb4e6, 0x6023, 0x0001, 0x9006, 0x080c, 0x5b4d,
++	0x2001, 0x0002, 0x080c, 0x5b61, 0x0126, 0x2091, 0x8000, 0x70a0,
++	0x8000, 0x70a2, 0x012e, 0x2009, 0x0002, 0x080c, 0x95ce, 0x9085,
++	0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00b6, 0x00c6,
++	0x0026, 0x2009, 0x0080, 0x080c, 0x5bb0, 0x1140, 0xb813, 0x00ff,
++	0xb817, 0xfffc, 0x0039, 0x0110, 0x70df, 0xffff, 0x002e, 0x00ce,
++	0x00be, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x080c, 0x94fe,
++	0x01d0, 0x2b00, 0x6012, 0x080c, 0xb4e6, 0x6023, 0x0001, 0x9006,
++	0x080c, 0x5b4d, 0x2001, 0x0002, 0x080c, 0x5b61, 0x0126, 0x2091,
++	0x8000, 0x70e0, 0x8000, 0x70e2, 0x012e, 0x2009, 0x0002, 0x080c,
++	0x95ce, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005,
++	0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2009, 0x007f, 0x080c,
++	0x5bb0, 0x11b8, 0xb813, 0x00ff, 0xb817, 0xfffd, 0xb8bf, 0x0004,
++	0x080c, 0x94fe, 0x0170, 0x2b00, 0x6012, 0x6316, 0x6023, 0x0001,
++	0x620a, 0x080c, 0xb4e6, 0x2009, 0x0022, 0x080c, 0x95ce, 0x9085,
++	0x0001, 0x012e, 0x00de, 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066,
++	0x0036, 0x0026, 0x00b6, 0x21f0, 0x080c, 0x7d60, 0x080c, 0x7cef,
++	0x080c, 0x93ac, 0x080c, 0xa3ab, 0x3e08, 0x2130, 0x81ff, 0x0120,
++	0x20a9, 0x007e, 0x900e, 0x0018, 0x20a9, 0x007f, 0x900e, 0x0016,
++	0x080c, 0x5c0d, 0x1140, 0x9686, 0x0002, 0x1118, 0xb800, 0xd0bc,
++	0x1110, 0x080c, 0x56f3, 0x001e, 0x8108, 0x1f04, 0x2cff, 0x86ff,
++	0x1110, 0x080c, 0x2e3e, 0x00be, 0x002e, 0x003e, 0x006e, 0x00ce,
++	0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6,
++	0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x7d55,
++	0x0076, 0x2039, 0x0000, 0x080c, 0x7c4d, 0x2c08, 0x080c, 0xc73e,
++	0x007e, 0x001e, 0xba10, 0xbb14, 0x080c, 0x56f3, 0xba12, 0xbb16,
++	0x00be, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6,
++	0x0006, 0x00b6, 0x6010, 0x2058, 0xb8a0, 0x00be, 0x9086, 0x0080,
++	0x0150, 0x2071, 0x1800, 0x70a0, 0x9005, 0x0110, 0x8001, 0x70a2,
++	0x000e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x70e0, 0x9005, 0x0dc0,
++	0x8001, 0x70e2, 0x0ca8, 0xb800, 0xc08c, 0xb802, 0x0005, 0x00f6,
++	0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x81ff,
++	0x1118, 0x20a9, 0x0001, 0x0088, 0x080c, 0x4dea, 0xd0c4, 0x0150,
++	0xd0a4, 0x0140, 0x9006, 0x0046, 0x2020, 0x2009, 0x002d, 0x080c,
++	0xc9c5, 0x004e, 0x20a9, 0x0800, 0x9016, 0x0026, 0x928e, 0x007e,
++	0x0904, 0x2dc7, 0x928e, 0x007f, 0x0904, 0x2dc7, 0x928e, 0x0080,
++	0x05f0, 0x9288, 0x1000, 0x210c, 0x81ff, 0x05c8, 0x8fff, 0x1148,
++	0x2001, 0x195b, 0x0006, 0x2003, 0x0001, 0x04e9, 0x000e, 0x2003,
++	0x0000, 0x00b6, 0x00c6, 0x2158, 0x2001, 0x0001, 0x080c, 0x5ef7,
++	0x00ce, 0x00be, 0x2019, 0x0029, 0x080c, 0x7d55, 0x0076, 0x2039,
++	0x0000, 0x080c, 0x7c4d, 0x00b6, 0x00c6, 0x0026, 0x2158, 0xba04,
++	0x9294, 0x00ff, 0x9286, 0x0006, 0x1118, 0xb807, 0x0404, 0x0028,
++	0x2001, 0x0004, 0x8007, 0x9215, 0xba06, 0x002e, 0x00ce, 0x00be,
++	0x0016, 0x2c08, 0x080c, 0xc73e, 0x001e, 0x007e, 0x2160, 0x002e,
++	0x8210, 0x1f04, 0x2d7d, 0x015e, 0x001e, 0x002e, 0x003e, 0x00ce,
++	0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026, 0x0016, 0x080c, 0x4dea,
++	0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006, 0x2220, 0x2009, 0x0029,
++	0x080c, 0xc9c5, 0x001e, 0x002e, 0x004e, 0x0005, 0x0016, 0x0026,
++	0x0036, 0x00c6, 0x728c, 0x82ff, 0x01e8, 0x080c, 0x5f25, 0x11d0,
++	0x2100, 0x080c, 0x2430, 0x81ff, 0x01b8, 0x2019, 0x0001, 0x8314,
++	0x92e0, 0x1c80, 0x2c04, 0xd384, 0x0120, 0x9084, 0xff00, 0x8007,
++	0x0010, 0x9084, 0x00ff, 0x9116, 0x0138, 0x9096, 0x00ff, 0x0110,
++	0x8318, 0x0c68, 0x9085, 0x0001, 0x00ce, 0x003e, 0x002e, 0x001e,
++	0x0005, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0036, 0x2019,
++	0x0029, 0x00a9, 0x003e, 0x9180, 0x1000, 0x2004, 0x9065, 0x0158,
++	0x0016, 0x00c6, 0x2061, 0x1a72, 0x001e, 0x6112, 0x080c, 0x2d1a,
++	0x001e, 0x080c, 0x5bd1, 0x012e, 0x00ce, 0x001e, 0x0005, 0x0016,
++	0x0026, 0x2110, 0x080c, 0x905b, 0x080c, 0xcc7a, 0x002e, 0x001e,
++	0x0005, 0x2001, 0x1836, 0x2004, 0xd0cc, 0x0005, 0x00c6, 0x080c,
++	0x6877, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c,
++	0x6877, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x9180, 0x1000,
++	0x2004, 0x9065, 0x0110, 0x080c, 0x5bd1, 0x8108, 0x1f04, 0x2e4e,
++	0x2061, 0x1800, 0x6077, 0x0000, 0x6078, 0x9084, 0x00ff, 0x607a,
++	0x60ab, 0x0000, 0x00ce, 0x0005, 0x2001, 0x1874, 0x2004, 0xd0bc,
++	0x0005, 0x2011, 0x1853, 0x2214, 0xd2ec, 0x0005, 0x7eef, 0x7de8,
++	0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9, 0x80d6,
++	0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd, 0x80cc,
++	0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5, 0x76c3, 0x80bc,
++	0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3, 0x80b2, 0x80b1,
++	0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9, 0x80a7, 0x6da6,
++	0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b, 0x8098, 0x6797,
++	0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081, 0x8080, 0x617c,
++	0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073, 0x8072, 0x8071,
++	0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69, 0x8067, 0x5a66,
++	0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056, 0x8055, 0x5454,
++	0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c, 0x804b, 0x4e4a,
++	0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c, 0x803a, 0x8039,
++	0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831, 0x802e, 0x472d,
++	0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026, 0x8025, 0x4123,
++	0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017, 0x8010, 0x3b0f,
++	0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000, 0x3800, 0x3700,
++	0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000, 0x3400, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300, 0x3200, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100, 0x3000, 0x8000,
++	0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00, 0x8000, 0x8000,
++	0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800, 0x8000, 0x2700,
++	0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000, 0x8000, 0x2100,
++	0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000, 0x8000, 0x1b00,
++	0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++	0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500, 0x8000, 0x1400,
++	0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000, 0x8000, 0x0e00,
++	0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000, 0x8000, 0x0800,
++	0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000, 0x0500, 0x0400,
++	0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000, 0x0100, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x8000, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x2071, 0x1893,
++	0x7003, 0x0002, 0x9006, 0x7012, 0x7016, 0x7046, 0x704a, 0x7037,
++	0x18ae, 0x703b, 0x18ae, 0x7007, 0x0001, 0x080c, 0x0fc7, 0x090c,
++	0x0d84, 0x2900, 0x7066, 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x080c,
++	0x0fc7, 0x090c, 0x0d84, 0x2900, 0x706a, 0xa867, 0x0002, 0xa8ab,
++	0xdcb0, 0x0005, 0x2071, 0x1893, 0x7004, 0x0002, 0x2f9a, 0x2f9b,
++	0x2fa3, 0x2fb7, 0x0005, 0x1004, 0x2fa2, 0x0e04, 0x2fa2, 0x2079,
++	0x0000, 0x0458, 0x0005, 0x2079, 0x0000, 0x2061, 0x18ac, 0x2c4c,
++	0xa86c, 0x908e, 0x0100, 0x0128, 0x9086, 0x0200, 0x0904, 0x3089,
++	0x0005, 0x7014, 0x2048, 0x2061, 0x1800, 0x7018, 0x0807, 0x7010,
++	0x2048, 0xa864, 0x9094, 0x00ff, 0x9296, 0x0029, 0x1120, 0xaa78,
++	0xd2fc, 0x0128, 0x0005, 0x9086, 0x0103, 0x0108, 0x0005, 0x2079,
++	0x0000, 0x2061, 0x1800, 0x7018, 0x0807, 0x2061, 0x1800, 0x7880,
++	0x908a, 0x0040, 0x1210, 0x61cc, 0x0042, 0x2100, 0x908a, 0x003f,
++	0x1a04, 0x3086, 0x61cc, 0x0804, 0x301d, 0x305f, 0x3095, 0x309f,
++	0x30a3, 0x30ad, 0x30b3, 0x30b7, 0x30c7, 0x30ca, 0x30d4, 0x30d9,
++	0x30de, 0x30e9, 0x30f4, 0x3103, 0x3112, 0x3120, 0x3137, 0x3152,
++	0x31f2, 0x31f7, 0x3235, 0x32dd, 0x32ee, 0x3311, 0x3086, 0x3086,
++	0x3086, 0x3349, 0x3367, 0x3370, 0x339f, 0x33a5, 0x3086, 0x33dd,
++	0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x33e8, 0x33f1, 0x33f9,
++	0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x33fb,
++	0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x3418, 0x3475, 0x3086,
++	0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x0002, 0x349f, 0x34a2,
++	0x3502, 0x351b, 0x354b, 0x37ed, 0x3086, 0x49c6, 0x3086, 0x3086,
++	0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x30d4, 0x30d9,
++	0x3cbf, 0x3086, 0x3cd6, 0x4a55, 0x4aa5, 0x4ba8, 0x3086, 0x4c0a,
++	0x4c46, 0x4c77, 0x4d79, 0x4ca4, 0x4cfb, 0x3086, 0x3cda, 0x3ea6,
++	0x3ebc, 0x3ed8, 0x3f3d, 0x3fb1, 0x3fd1, 0x403b, 0x404c, 0x405d,
++	0x4060, 0x4085, 0x40f9, 0x415b, 0x4163, 0x428b, 0x43b4, 0x43dd,
++	0x4504, 0x4522, 0x452e, 0x45d0, 0x46a0, 0x3086, 0x3086, 0x3086,
++	0x3086, 0x4706, 0x4721, 0x48ac, 0x4982, 0x7148, 0x0000, 0x2021,
++	0x4000, 0x080c, 0x445b, 0x0126, 0x2091, 0x8000, 0x0e04, 0x3069,
++	0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833,
++	0x0011, 0x0010, 0x7833, 0x0010, 0x7c82, 0x7986, 0x7a8a, 0x7b8e,
++	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x113e,
++	0x7007, 0x0001, 0x2091, 0x5000, 0x012e, 0x0005, 0x2021, 0x4001,
++	0x08c0, 0x2021, 0x4002, 0x08a8, 0x2021, 0x4003, 0x0890, 0x2021,
++	0x4005, 0x0878, 0x2021, 0x4006, 0x0860, 0x2039, 0x0001, 0x902e,
++	0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, 0x4468, 0x7883,
++	0x0004, 0x7884, 0x0807, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88,
++	0x7a8c, 0x7884, 0x7990, 0x0804, 0x446b, 0x7984, 0x7888, 0x2114,
++	0x200a, 0x0804, 0x305f, 0x7984, 0x2114, 0x0804, 0x305f, 0x20e1,
++	0x0000, 0x2099, 0x0021, 0x20e9, 0x0000, 0x20a1, 0x0021, 0x20a9,
++	0x001f, 0x4003, 0x7984, 0x7a88, 0x7b8c, 0x0804, 0x305f, 0x7884,
++	0x2060, 0x04d8, 0x2009, 0x0003, 0x2011, 0x0002, 0x2019, 0x000a,
++	0x789b, 0x0117, 0x0804, 0x305f, 0x2039, 0x0001, 0x7d98, 0x7c9c,
++	0x0800, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0848, 0x79a0, 0x9182,
++	0x0040, 0x0210, 0x0804, 0x3092, 0x2138, 0x7d98, 0x7c9c, 0x0804,
++	0x3099, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3092, 0x2138,
++	0x7d98, 0x7c9c, 0x0804, 0x30a7, 0x79a0, 0x9182, 0x0040, 0x0210,
++	0x0804, 0x3092, 0x21e8, 0x7984, 0x7888, 0x20a9, 0x0001, 0x21a0,
++	0x4004, 0x0804, 0x305f, 0x2061, 0x0800, 0xe10c, 0x9006, 0x2c15,
++	0x9200, 0x8c60, 0x8109, 0x1dd8, 0x2010, 0x9005, 0x0904, 0x305f,
++	0x0804, 0x308c, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3092,
++	0x21e0, 0x20a9, 0x0001, 0x7984, 0x2198, 0x4012, 0x0804, 0x305f,
++	0x2069, 0x1852, 0x7884, 0x7990, 0x911a, 0x1a04, 0x3092, 0x8019,
++	0x0904, 0x3092, 0x684a, 0x6942, 0x788c, 0x6852, 0x7888, 0x6856,
++	0x9006, 0x685a, 0x685e, 0x080c, 0x6b71, 0x0804, 0x305f, 0x2069,
++	0x1852, 0x7884, 0x7994, 0x911a, 0x1a04, 0x3092, 0x8019, 0x0904,
++	0x3092, 0x684e, 0x6946, 0x788c, 0x6862, 0x7888, 0x6866, 0x9006,
++	0x686a, 0x686e, 0x0126, 0x2091, 0x8000, 0x080c, 0x5f97, 0x012e,
++	0x0804, 0x305f, 0x902e, 0x2520, 0x81ff, 0x1904, 0x308f, 0x7984,
++	0x7b88, 0x7a8c, 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1, 0x189a,
++	0x4101, 0x080c, 0x441f, 0x0904, 0x308f, 0x2009, 0x0020, 0xa85c,
++	0x9080, 0x0019, 0xaf60, 0x080c, 0x4468, 0x701b, 0x3170, 0x0005,
++	0xa864, 0x2008, 0x9084, 0x00ff, 0x9096, 0x0011, 0x0168, 0x9096,
++	0x0019, 0x0150, 0x9096, 0x0015, 0x0138, 0x9096, 0x0048, 0x0120,
++	0x9096, 0x0029, 0x1904, 0x308f, 0x810f, 0x918c, 0x00ff, 0x0904,
++	0x308f, 0x710e, 0x700c, 0x8001, 0x0548, 0x700e, 0x080c, 0x441f,
++	0x0904, 0x308f, 0x2009, 0x0020, 0x7064, 0x2040, 0xa28c, 0xa390,
++	0xa494, 0xa598, 0x9290, 0x0040, 0x9399, 0x0000, 0x94a1, 0x0000,
++	0x95a9, 0x0000, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4468,
++	0x701b, 0x31ab, 0x0005, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0002,
++	0x0120, 0x9096, 0x000a, 0x1904, 0x308f, 0x08a0, 0x7010, 0x2048,
++	0xa868, 0xc0fd, 0xa86a, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0029,
++	0x1160, 0xc2fd, 0xaa7a, 0x080c, 0x57e4, 0x0150, 0x0126, 0x2091,
++	0x8000, 0xa87a, 0xa982, 0x012e, 0x0050, 0x080c, 0x5ac6, 0x1128,
++	0x7007, 0x0003, 0x701b, 0x31d7, 0x0005, 0x080c, 0x63d1, 0x0126,
++	0x2091, 0x8000, 0x20a9, 0x0005, 0x20e1, 0x0001, 0x2099, 0x189a,
++	0x400a, 0x2100, 0x9210, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9,
++	0x0000, 0xa85c, 0x9080, 0x0019, 0x2009, 0x0020, 0x012e, 0xaf60,
++	0x0804, 0x446b, 0x61b4, 0x7884, 0x60b6, 0x0804, 0x305f, 0x2091,
++	0x8000, 0x7837, 0x4000, 0x7833, 0x0010, 0x7883, 0x4000, 0x7887,
++	0x4953, 0x788b, 0x5020, 0x788f, 0x2020, 0x2009, 0x017f, 0x2104,
++	0x7892, 0x3f00, 0x7896, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200,
++	0x603c, 0x8007, 0x9205, 0x789a, 0x2009, 0x04fd, 0x2104, 0x789e,
++	0x2091, 0x5000, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084,
++	0x0180, 0x2001, 0x19e7, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b,
++	0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, 0x2003,
++	0x1001, 0x2071, 0x0080, 0x0804, 0x0427, 0x81ff, 0x1904, 0x308f,
++	0x7984, 0x080c, 0x5c0d, 0x1904, 0x3092, 0x7e98, 0x9684, 0x3fff,
++	0x9082, 0x4000, 0x0210, 0x0804, 0x3092, 0x7c88, 0x7d8c, 0x080c,
++	0x5d70, 0x080c, 0x5d3f, 0x0000, 0x1518, 0x2061, 0x1cd0, 0x0126,
++	0x2091, 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d,
++	0x0130, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0150, 0x012e,
++	0x9ce0, 0x0018, 0x2001, 0x1818, 0x2004, 0x9c02, 0x1a04, 0x308f,
++	0x0c30, 0x080c, 0xad1e, 0x012e, 0x0904, 0x308f, 0x0804, 0x305f,
++	0x900e, 0x2001, 0x0005, 0x080c, 0x63d1, 0x0126, 0x2091, 0x8000,
++	0x080c, 0xb37a, 0x080c, 0x61a9, 0x012e, 0x0804, 0x305f, 0x00a6,
++	0x2950, 0xb198, 0x080c, 0x5c0d, 0x1904, 0x32ca, 0xb6a4, 0x9684,
++	0x3fff, 0x9082, 0x4000, 0x0208, 0x04e8, 0xb49c, 0xb5a0, 0x080c,
++	0x5d70, 0x080c, 0x5d3f, 0x1520, 0x2061, 0x1cd0, 0x0126, 0x2091,
++	0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130,
++	0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0158, 0x012e, 0x9ce0,
++	0x0018, 0x2001, 0x1818, 0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0,
++	0x0c28, 0x080c, 0xad1e, 0x012e, 0x2009, 0x0003, 0x0178, 0x00e0,
++	0x900e, 0x2001, 0x0005, 0x080c, 0x63d1, 0x0126, 0x2091, 0x8000,
++	0x080c, 0xb37a, 0x080c, 0x61a9, 0x012e, 0x0070, 0xb097, 0x4005,
++	0xb19a, 0x0010, 0xb097, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001,
++	0x0030, 0x2a48, 0x00ae, 0x0005, 0xb097, 0x4000, 0x9006, 0x918d,
++	0x0001, 0x2008, 0x2a48, 0x00ae, 0x0005, 0x81ff, 0x1904, 0x308f,
++	0x080c, 0x4436, 0x0904, 0x3092, 0x080c, 0x5cd4, 0x0904, 0x308f,
++	0x080c, 0x5d76, 0x0904, 0x308f, 0x0804, 0x3fc8, 0x81ff, 0x1904,
++	0x308f, 0x080c, 0x4452, 0x0904, 0x3092, 0x080c, 0x5e04, 0x0904,
++	0x308f, 0x2019, 0x0005, 0x79a8, 0x080c, 0x5d91, 0x0904, 0x308f,
++	0x7888, 0x908a, 0x1000, 0x1a04, 0x3092, 0x8003, 0x800b, 0x810b,
++	0x9108, 0x080c, 0x7826, 0x7984, 0xd184, 0x1904, 0x305f, 0x0804,
++	0x3fc8, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009, 0x0001,
++	0x0450, 0x2029, 0x07ff, 0x6454, 0x2400, 0x9506, 0x01f8, 0x2508,
++	0x080c, 0x5c0d, 0x11d8, 0x080c, 0x5e04, 0x1128, 0x2009, 0x0002,
++	0x62bc, 0x2518, 0x00c0, 0x2019, 0x0004, 0x900e, 0x080c, 0x5d91,
++	0x1118, 0x2009, 0x0006, 0x0078, 0x7884, 0x908a, 0x1000, 0x1270,
++	0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x7826, 0x8529, 0x1ae0,
++	0x012e, 0x0804, 0x305f, 0x012e, 0x0804, 0x308f, 0x012e, 0x0804,
++	0x3092, 0x080c, 0x4436, 0x0904, 0x3092, 0x080c, 0x5cd4, 0x0904,
++	0x308f, 0xbaa0, 0x2019, 0x0005, 0x00c6, 0x2061, 0x0000, 0x080c,
++	0x7d55, 0x0076, 0x2039, 0x0000, 0x080c, 0x7c4d, 0x900e, 0x080c,
++	0xc73e, 0x007e, 0x00ce, 0x080c, 0x5d70, 0x0804, 0x305f, 0x080c,
++	0x4436, 0x0904, 0x3092, 0x080c, 0x5d70, 0x2208, 0x0804, 0x305f,
++	0x0156, 0x00d6, 0x00e6, 0x2069, 0x1904, 0x6810, 0x6914, 0x910a,
++	0x1208, 0x900e, 0x6816, 0x9016, 0x901e, 0x20a9, 0x007e, 0x2069,
++	0x1000, 0x2d04, 0x905d, 0x0118, 0xb84c, 0x0059, 0x9210, 0x8d68,
++	0x1f04, 0x3381, 0x2300, 0x9218, 0x00ee, 0x00de, 0x015e, 0x0804,
++	0x305f, 0x00f6, 0x0016, 0x907d, 0x0138, 0x9006, 0x8000, 0x2f0c,
++	0x81ff, 0x0110, 0x2178, 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069,
++	0x1904, 0x6910, 0x62b8, 0x0804, 0x305f, 0x81ff, 0x1904, 0x308f,
++	0x6154, 0x9190, 0x2e6e, 0x2215, 0x9294, 0x00ff, 0x6374, 0x83ff,
++	0x0108, 0x6278, 0x67d8, 0x97c4, 0x000a, 0x98c6, 0x000a, 0x1118,
++	0x2031, 0x0001, 0x00f0, 0x97c4, 0x0022, 0x98c6, 0x0022, 0x1118,
++	0x2031, 0x0003, 0x00b0, 0x97c4, 0x0012, 0x98c6, 0x0012, 0x1118,
++	0x2031, 0x0002, 0x0070, 0x080c, 0x6877, 0x1118, 0x2031, 0x0004,
++	0x0040, 0xd79c, 0x0120, 0x2009, 0x0005, 0x0804, 0x308f, 0x2031,
++	0x0000, 0x7e9a, 0x7f9e, 0x0804, 0x305f, 0x6144, 0x6248, 0x2019,
++	0x1953, 0x231c, 0x2001, 0x1954, 0x2004, 0x789a, 0x0804, 0x305f,
++	0x0126, 0x2091, 0x8000, 0x6134, 0x6238, 0x633c, 0x012e, 0x0804,
++	0x305f, 0x080c, 0x4452, 0x0904, 0x3092, 0xba44, 0xbb38, 0x0804,
++	0x305f, 0x080c, 0x0d84, 0x6144, 0x6248, 0x7884, 0x6046, 0x7b88,
++	0x634a, 0x2069, 0x1852, 0x831f, 0x9305, 0x6816, 0x788c, 0x2069,
++	0x1953, 0x2d1c, 0x206a, 0x7e98, 0x9682, 0x0014, 0x1210, 0x2031,
++	0x07d0, 0x2069, 0x1954, 0x2d04, 0x266a, 0x789a, 0x0804, 0x305f,
++	0x0126, 0x2091, 0x8000, 0x6134, 0x7884, 0x6036, 0x910e, 0xd1b4,
++	0x190c, 0x0e56, 0xd0c4, 0x01a8, 0x00d6, 0x78a8, 0x2009, 0x196a,
++	0x200a, 0x78ac, 0x2011, 0x196b, 0x2012, 0x2069, 0x0100, 0x6838,
++	0x9086, 0x0007, 0x1118, 0x2214, 0x6a5a, 0x0010, 0x210c, 0x695a,
++	0x00de, 0x7884, 0x7888, 0x603a, 0x2011, 0x0114, 0x220c, 0x7888,
++	0xd08c, 0x0118, 0x918d, 0x0080, 0x0010, 0x918c, 0xff7f, 0x2112,
++	0x613c, 0x788c, 0x603e, 0x910e, 0xd1e4, 0x190c, 0x0e73, 0x603c,
++	0xd0cc, 0x0120, 0x78b0, 0x2011, 0x0114, 0x2012, 0x012e, 0x0804,
++	0x305f, 0x00f6, 0x2079, 0x1800, 0x7a34, 0xa898, 0x9084, 0xfebf,
++	0x9215, 0xa89c, 0x9084, 0xfebf, 0x8002, 0x9214, 0x79ec, 0x7834,
++	0x9084, 0x0140, 0x9215, 0x7a36, 0xa897, 0x4000, 0x900e, 0x9085,
++	0x0001, 0x2001, 0x0000, 0x00fe, 0x0005, 0x7898, 0x9005, 0x01a8,
++	0x7888, 0x9025, 0x0904, 0x3092, 0x788c, 0x902d, 0x0904, 0x3092,
++	0x900e, 0x080c, 0x5c0d, 0x1120, 0xba44, 0xbb38, 0xbc46, 0xbd3a,
++	0x9186, 0x07ff, 0x0190, 0x8108, 0x0ca0, 0x080c, 0x4452, 0x0904,
++	0x3092, 0x7888, 0x900d, 0x0904, 0x3092, 0x788c, 0x9005, 0x0904,
++	0x3092, 0xba44, 0xb946, 0xbb38, 0xb83a, 0x0804, 0x305f, 0x2011,
++	0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c, 0x4dfe, 0x1904, 0x308f,
++	0x00c6, 0x2061, 0x0100, 0x7984, 0x9186, 0x00ff, 0x1130, 0x2001,
++	0x1816, 0x2004, 0x9085, 0xff00, 0x0088, 0x9182, 0x007f, 0x16e8,
++	0x9188, 0x2e6e, 0x210d, 0x918c, 0x00ff, 0x2001, 0x1816, 0x2004,
++	0x0026, 0x9116, 0x002e, 0x0588, 0x810f, 0x9105, 0x0126, 0x2091,
++	0x8000, 0x0006, 0x080c, 0x94fe, 0x000e, 0x0518, 0x6016, 0x600b,
++	0xbc05, 0x7984, 0x00b6, 0x080c, 0x5bb0, 0x2b08, 0x00be, 0x1500,
++	0x6112, 0x6023, 0x0001, 0x080c, 0x441f, 0x01d0, 0x9006, 0xa866,
++	0x7007, 0x0003, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x701b, 0x34fb,
++	0x2900, 0x6016, 0x2009, 0x0032, 0x080c, 0x95ce, 0x012e, 0x00ce,
++	0x0005, 0x012e, 0x00ce, 0x0804, 0x308f, 0x00ce, 0x0804, 0x3092,
++	0x080c, 0x9554, 0x0cb0, 0xa830, 0x9086, 0x0100, 0x0904, 0x308f,
++	0x0804, 0x305f, 0x2061, 0x1a3d, 0x0126, 0x2091, 0x8000, 0x6000,
++	0xd084, 0x0170, 0x6104, 0x6208, 0x2061, 0x1800, 0x634c, 0x606c,
++	0x789a, 0x60bc, 0x789e, 0x60b8, 0x78aa, 0x012e, 0x0804, 0x305f,
++	0x900e, 0x2110, 0x0c88, 0x81ff, 0x1904, 0x308f, 0x080c, 0x6877,
++	0x0904, 0x308f, 0x0126, 0x2091, 0x8000, 0x624c, 0x606c, 0x9202,
++	0x0248, 0x9085, 0x0001, 0x080c, 0x2466, 0x080c, 0x4fc7, 0x012e,
++	0x0804, 0x305f, 0x012e, 0x0804, 0x3092, 0x0006, 0x0016, 0x00c6,
++	0x00e6, 0x2001, 0x1976, 0x2070, 0x2061, 0x1852, 0x6008, 0x2072,
++	0x900e, 0x2011, 0x1400, 0x080c, 0x7a4b, 0x7206, 0x00ee, 0x00ce,
++	0x001e, 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0128,
++	0x012e, 0x2021, 0x400b, 0x0804, 0x3061, 0x7884, 0xd0fc, 0x0148,
++	0x2001, 0x002a, 0x2004, 0x9082, 0x00e1, 0x02a8, 0x012e, 0x0804,
++	0x3092, 0x2001, 0x002a, 0x2004, 0x2069, 0x1852, 0x6908, 0x9102,
++	0x1218, 0x012e, 0x0804, 0x3092, 0x614c, 0x606c, 0x9106, 0x0118,
++	0x012e, 0x0804, 0x308f, 0x080c, 0x94d3, 0x0dd0, 0x7884, 0xd0fc,
++	0x0904, 0x35ca, 0x00c6, 0x080c, 0x441f, 0x00ce, 0x0d88, 0xa867,
++	0x0000, 0x7884, 0xa80a, 0x7898, 0xa80e, 0x789c, 0xa812, 0x2001,
++	0x002e, 0x2004, 0xa81a, 0x2001, 0x002f, 0x2004, 0xa81e, 0x2001,
++	0x0030, 0x2004, 0xa822, 0x2001, 0x0031, 0x2004, 0xa826, 0x2001,
++	0x0034, 0x2004, 0xa82a, 0x2001, 0x0035, 0x2004, 0xa82e, 0x2001,
++	0x002a, 0x2004, 0x9080, 0x0003, 0x9084, 0x00fc, 0x8004, 0xa816,
++	0x080c, 0x3750, 0x0928, 0x7010, 0x2048, 0xad2c, 0xac28, 0xab1c,
++	0xaa18, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021,
++	0x0000, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0,
++	0x9080, 0x001b, 0x080c, 0x4468, 0x701b, 0x368d, 0x701f, 0x0001,
++	0x012e, 0x0005, 0x0046, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6,
++	0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3535, 0x2001, 0x196c, 0x2003,
++	0x0000, 0x2021, 0x000a, 0x2061, 0x0100, 0x6104, 0x0016, 0x60bb,
++	0x0000, 0x60bf, 0x32e1, 0x60bf, 0x0012, 0x080c, 0x37bf, 0x080c,
++	0x377e, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x1a33, 0x2079,
++	0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0140, 0x2001,
++	0x0035, 0x2004, 0x780e, 0x2001, 0x0034, 0x2004, 0x780a, 0x00de,
++	0x2011, 0x0001, 0x080c, 0x3b2b, 0x008e, 0x00ee, 0x00fe, 0x080c,
++	0x3a61, 0x080c, 0x396a, 0x05b8, 0x2001, 0x020b, 0x2004, 0x9084,
++	0x0140, 0x1db8, 0x080c, 0x3b7f, 0x00f6, 0x2079, 0x0300, 0x78bc,
++	0x00fe, 0x908c, 0x0070, 0x1560, 0x2071, 0x0200, 0x7037, 0x0000,
++	0x7050, 0x9084, 0xff00, 0x9086, 0x3200, 0x1510, 0x7037, 0x0001,
++	0x7050, 0x9084, 0xff00, 0x9086, 0xe100, 0x11d0, 0x7037, 0x0000,
++	0x7054, 0x7037, 0x0000, 0x715c, 0x9106, 0x1190, 0x2001, 0x181e,
++	0x2004, 0x9106, 0x1168, 0x00c6, 0x2061, 0x0100, 0x6024, 0x9084,
++	0x1e00, 0x00ce, 0x0138, 0x080c, 0x3974, 0x080c, 0x3779, 0x0058,
++	0x080c, 0x3779, 0x080c, 0x3ac3, 0x080c, 0x3a57, 0x2001, 0x020b,
++	0x2004, 0xd0e4, 0x0dd8, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061,
++	0x0100, 0x6027, 0x0002, 0x001e, 0x6106, 0x2011, 0x020d, 0x2013,
++	0x0020, 0x60bb, 0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012, 0x2001,
++	0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x1245, 0x2009,
++	0x0028, 0x080c, 0x2014, 0x2001, 0x0227, 0x200c, 0x2102, 0x00fe,
++	0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x004e,
++	0x2001, 0x196c, 0x2004, 0x9005, 0x1118, 0x012e, 0x0804, 0x305f,
++	0x012e, 0x2021, 0x400c, 0x0804, 0x3061, 0x0016, 0x0026, 0x0036,
++	0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, 0x7010,
++	0x2048, 0x701c, 0x20a8, 0x8000, 0x701e, 0xa804, 0x9005, 0x0904,
++	0x36e9, 0x2048, 0x1f04, 0x369d, 0x7064, 0x2040, 0xa28c, 0xa390,
++	0xa494, 0xa598, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000,
++	0x2021, 0x0000, 0x0096, 0x7010, 0x2048, 0xa864, 0x009e, 0x9086,
++	0x0103, 0x0170, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084,
++	0xffc0, 0x9080, 0x001b, 0x080c, 0x4468, 0x701b, 0x368d, 0x00b0,
++	0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080,
++	0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c,
++	0x0f2b, 0x000e, 0x080c, 0x446b, 0x701b, 0x368d, 0x015e, 0x00de,
++	0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e,
++	0x0005, 0x7010, 0x2048, 0xa864, 0x9086, 0x0103, 0x1118, 0x701b,
++	0x374e, 0x0450, 0x7010, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0x2009,
++	0x007f, 0x080c, 0x5bb0, 0x0110, 0x9006, 0x0030, 0xb813, 0x00ff,
++	0xb817, 0xfffd, 0x080c, 0xb535, 0x015e, 0x00de, 0x009e, 0x008e,
++	0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0904, 0x308f,
++	0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096,
++	0x00d6, 0x0156, 0x701b, 0x3720, 0x7007, 0x0003, 0x0804, 0x36de,
++	0x0076, 0xa830, 0x9086, 0x0100, 0x2021, 0x400c, 0x0904, 0x3061,
++	0xad10, 0xac0c, 0xab24, 0xaa20, 0xa930, 0xa808, 0xd0b4, 0x1120,
++	0x2029, 0x0000, 0x2021, 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc,
++	0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098,
++	0x27e8, 0x20a0, 0x0006, 0x080c, 0x0f2b, 0x000e, 0x080c, 0x446b,
++	0x007e, 0x701b, 0x368d, 0x701f, 0x0001, 0x0005, 0x0804, 0x305f,
++	0x0156, 0x00c6, 0xa814, 0x908a, 0x001e, 0x0218, 0xa833, 0x001e,
++	0x0010, 0xa832, 0x0078, 0x81ff, 0x0168, 0x0016, 0x080c, 0x441f,
++	0x001e, 0x0130, 0xa800, 0x2040, 0xa008, 0xa80a, 0x2100, 0x0c58,
++	0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, 0x015e, 0x0005, 0x0006,
++	0x00f6, 0x2079, 0x0000, 0x7880, 0x9086, 0x0044, 0x00fe, 0x000e,
++	0x0005, 0x2001, 0x196c, 0x2003, 0x0001, 0x0005, 0x00f6, 0x00e6,
++	0x00c6, 0x2061, 0x0200, 0x2001, 0x1977, 0x2004, 0x601a, 0x2061,
++	0x0100, 0x2001, 0x1976, 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106,
++	0x080c, 0x441f, 0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a,
++	0x2001, 0x002e, 0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a,
++	0x2061, 0x0090, 0x2079, 0x0100, 0x2001, 0x1976, 0x2004, 0x6036,
++	0x2009, 0x0040, 0x080c, 0x2014, 0x2001, 0x002a, 0x2004, 0x9084,
++	0xfff8, 0xa86e, 0x601a, 0xa873, 0x0000, 0x601f, 0x0000, 0x78ca,
++	0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6,
++	0x080c, 0x441f, 0x2940, 0xa013, 0x0019, 0xa017, 0x0001, 0x2800,
++	0xa05a, 0x2001, 0x0030, 0x2004, 0xa866, 0x2001, 0x0031, 0x2004,
++	0xa86a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, 0xa873,
++	0x0000, 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x0300, 0x2003,
++	0x0000, 0x2001, 0x020d, 0x2003, 0x0000, 0x2001, 0x0004, 0x200c,
++	0x918d, 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000,
++	0x81ff, 0x0148, 0x080c, 0x27e7, 0x1130, 0x9006, 0x080c, 0x2747,
++	0x9006, 0x080c, 0x272a, 0x7884, 0x9084, 0x0007, 0x0002, 0x380a,
++	0x3813, 0x381c, 0x3807, 0x3807, 0x3807, 0x3807, 0x3807, 0x012e,
++	0x0804, 0x3092, 0x2009, 0x0114, 0x2104, 0x9085, 0x0800, 0x200a,
++	0x080c, 0x39ba, 0x00c0, 0x2009, 0x0114, 0x2104, 0x9085, 0x4000,
++	0x200a, 0x080c, 0x39ba, 0x0078, 0x080c, 0x6877, 0x1128, 0x012e,
++	0x2009, 0x0016, 0x0804, 0x308f, 0x81ff, 0x0128, 0x012e, 0x2021,
++	0x400b, 0x0804, 0x3061, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6,
++	0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3535, 0x2009, 0x0101, 0x210c,
++	0x0016, 0x7ec8, 0x7dcc, 0x9006, 0x2068, 0x2060, 0x2058, 0x080c,
++	0x3c52, 0x080c, 0x3bab, 0x903e, 0x2720, 0x00f6, 0x00e6, 0x0086,
++	0x2940, 0x2071, 0x1a33, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000,
++	0x6884, 0xd0b4, 0x0120, 0x68d4, 0x780e, 0x68d0, 0x780a, 0x00de,
++	0x2011, 0x0001, 0x080c, 0x3b2b, 0x080c, 0x27ef, 0x080c, 0x27ef,
++	0x080c, 0x27ef, 0x080c, 0x27ef, 0x080c, 0x3b2b, 0x008e, 0x00ee,
++	0x00fe, 0x080c, 0x3a61, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140,
++	0x1dd0, 0x00f6, 0x2079, 0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178,
++	0x2001, 0x0201, 0x200c, 0x81ff, 0x0150, 0x080c, 0x3a3f, 0x2d00,
++	0x9c05, 0x9b05, 0x0120, 0x080c, 0x3974, 0x0804, 0x3921, 0x080c,
++	0x3b7f, 0x080c, 0x3ac3, 0x080c, 0x3a22, 0x080c, 0x3a57, 0x00f6,
++	0x2079, 0x0100, 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x3974,
++	0x00fe, 0x0804, 0x3921, 0x00fe, 0x080c, 0x396a, 0x1150, 0x8d68,
++	0x2001, 0x0032, 0x2602, 0x2001, 0x0033, 0x2502, 0x080c, 0x3974,
++	0x0080, 0x87ff, 0x0138, 0x2001, 0x0201, 0x2004, 0x9005, 0x1908,
++	0x8739, 0x0038, 0x2001, 0x1a30, 0x2004, 0x9086, 0x0000, 0x1904,
++	0x3871, 0x2001, 0x032f, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529,
++	0x2500, 0x9605, 0x0904, 0x3921, 0x7884, 0xd0bc, 0x0128, 0x2d00,
++	0x9c05, 0x9b05, 0x1904, 0x3921, 0xa013, 0x0019, 0x2001, 0x032a,
++	0x2003, 0x0004, 0x7884, 0xd0ac, 0x1148, 0x2001, 0x1a30, 0x2003,
++	0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x0030, 0xa017, 0x0001,
++	0x78b4, 0x9005, 0x0108, 0xa016, 0x2800, 0xa05a, 0x2009, 0x0040,
++	0x080c, 0x2014, 0x2900, 0xa85a, 0xa813, 0x0019, 0x7884, 0xd0a4,
++	0x1180, 0xa817, 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090,
++	0x602b, 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x38f8, 0x00ce,
++	0x0030, 0xa817, 0x0001, 0x78b0, 0x9005, 0x0108, 0xa816, 0x00f6,
++	0x00c6, 0x2079, 0x0100, 0x2061, 0x0090, 0x7827, 0x0002, 0x2001,
++	0x002a, 0x2004, 0x9084, 0xfff8, 0x601a, 0x0006, 0x2001, 0x002b,
++	0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca, 0x00ce, 0x00fe, 0x0804,
++	0x3845, 0x001e, 0x00c6, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061,
++	0x0100, 0x6027, 0x0002, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020,
++	0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x1245,
++	0x7884, 0x9084, 0x0003, 0x9086, 0x0002, 0x01a0, 0x2009, 0x0028,
++	0x080c, 0x2014, 0x2001, 0x0227, 0x200c, 0x2102, 0x6050, 0x9084,
++	0xb7ef, 0x6052, 0x602f, 0x0000, 0x604b, 0xf7f7, 0x6043, 0x0090,
++	0x6043, 0x0010, 0x00ce, 0x2d08, 0x2c10, 0x2b18, 0x2b00, 0x9c05,
++	0x9d05, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e,
++	0x008e, 0x1118, 0x012e, 0x0804, 0x305f, 0x012e, 0x2021, 0x400c,
++	0x0804, 0x3061, 0x9085, 0x0001, 0x1d04, 0x3973, 0x2091, 0x6000,
++	0x8420, 0x9486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, 0x0010,
++	0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x1a30, 0x2003, 0x0000,
++	0x0051, 0x2009, 0x0048, 0x080c, 0x2014, 0x2001, 0x0227, 0x2024,
++	0x2402, 0x9026, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a33, 0x7000,
++	0x9086, 0x0000, 0x0520, 0x2079, 0x0090, 0x2009, 0x0206, 0x2104,
++	0x2009, 0x0203, 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, 0x080c,
++	0x2014, 0x782c, 0xd0fc, 0x0d88, 0x080c, 0x3b7f, 0x7000, 0x9086,
++	0x0000, 0x1d58, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, 0x2009,
++	0x0040, 0x080c, 0x2014, 0x782b, 0x0002, 0x7003, 0x0000, 0x00ee,
++	0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100, 0x2001, 0x1816, 0x200c,
++	0x7932, 0x7936, 0x080c, 0x2446, 0x7850, 0x9084, 0xfbff, 0x9085,
++	0x0030, 0x7852, 0x2019, 0x01f4, 0x8319, 0x1df0, 0x9084, 0xffcf,
++	0x9085, 0x2000, 0x7852, 0x20a9, 0x0046, 0x1d04, 0x39d5, 0x2091,
++	0x6000, 0x1f04, 0x39d5, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfff,
++	0x7852, 0x2001, 0x0021, 0x2004, 0x9084, 0x0003, 0x9086, 0x0001,
++	0x1120, 0x7850, 0x9084, 0xdfff, 0x7852, 0x784b, 0xf7f7, 0x7843,
++	0x0090, 0x7843, 0x0010, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x39f5,
++	0x7850, 0x9085, 0x1400, 0x7852, 0x2019, 0x61a8, 0x7854, 0xa001,
++	0xa001, 0xd08c, 0x1110, 0x8319, 0x1dc8, 0x7827, 0x0048, 0x7850,
++	0x9085, 0x0400, 0x7852, 0x7843, 0x0040, 0x2019, 0x01f4, 0xa001,
++	0xa001, 0x8319, 0x1de0, 0x2001, 0x0100, 0x080c, 0x28a5, 0x7827,
++	0x0020, 0x7843, 0x0000, 0x9006, 0x080c, 0x28a5, 0x7827, 0x0048,
++	0x00fe, 0x0005, 0x7884, 0xd0ac, 0x11c8, 0x00f6, 0x00e6, 0x2071,
++	0x1a30, 0x2079, 0x0320, 0x2001, 0x0201, 0x2004, 0x9005, 0x0160,
++	0x7000, 0x9086, 0x0000, 0x1140, 0x0051, 0xd0bc, 0x0108, 0x8738,
++	0x7003, 0x0003, 0x782b, 0x0019, 0x00ee, 0x00fe, 0x0005, 0x00f6,
++	0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c, 0x0070, 0x0178, 0x2009,
++	0x0032, 0x260a, 0x2009, 0x0033, 0x250a, 0xd0b4, 0x0108, 0x8c60,
++	0xd0ac, 0x0108, 0x8d68, 0xd0a4, 0x0108, 0x8b58, 0x0005, 0x00f6,
++	0x2079, 0x0200, 0x781c, 0xd084, 0x0110, 0x7837, 0x0050, 0x00fe,
++	0x0005, 0x00e6, 0x2071, 0x0100, 0x2001, 0x1977, 0x2004, 0x70e2,
++	0x080c, 0x376f, 0x1188, 0x2001, 0x181e, 0x2004, 0x2009, 0x181d,
++	0x210c, 0x918c, 0x00ff, 0x706e, 0x716a, 0x7066, 0x918d, 0x3200,
++	0x7162, 0x7073, 0xe109, 0x0080, 0x702c, 0x9085, 0x0002, 0x702e,
++	0x2009, 0x1816, 0x210c, 0x716e, 0x7063, 0x0100, 0x7166, 0x719e,
++	0x706b, 0x0000, 0x7073, 0x0809, 0x7077, 0x0008, 0x7078, 0x9080,
++	0x0100, 0x707a, 0x7080, 0x8000, 0x7082, 0x7087, 0xaaaa, 0x9006,
++	0x708a, 0x708e, 0x707e, 0x70d6, 0x70ab, 0x0036, 0x70af, 0x95d5,
++	0x7014, 0x9084, 0x1984, 0x9085, 0x0012, 0x7016, 0x080c, 0x3b7f,
++	0x00f6, 0x2071, 0x1a30, 0x2079, 0x0320, 0x00d6, 0x2069, 0x0000,
++	0x6884, 0xd0b4, 0x0120, 0x689c, 0x780e, 0x6898, 0x780a, 0x00de,
++	0x2011, 0x0011, 0x080c, 0x3b2b, 0x2011, 0x0001, 0x080c, 0x3b2b,
++	0x00fe, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a30, 0x2079,
++	0x0320, 0x792c, 0xd1fc, 0x0904, 0x3b28, 0x782b, 0x0002, 0x9026,
++	0xd19c, 0x1904, 0x3b24, 0x7000, 0x0002, 0x3b28, 0x3ad9, 0x3b09,
++	0x3b24, 0xd1bc, 0x1170, 0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011,
++	0x0001, 0x080c, 0x3b2b, 0x0904, 0x3b28, 0x080c, 0x3b2b, 0x0804,
++	0x3b28, 0x00f6, 0x2079, 0x0300, 0x78bf, 0x0000, 0x00fe, 0x7810,
++	0x7914, 0x782b, 0x0004, 0x7812, 0x7916, 0x2001, 0x0201, 0x200c,
++	0x81ff, 0x0de8, 0x080c, 0x3a3f, 0x2009, 0x0001, 0x00f6, 0x2079,
++	0x0300, 0x78b8, 0x00fe, 0xd0ec, 0x0110, 0x2009, 0x0011, 0x792a,
++	0x00f8, 0x8001, 0x7002, 0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc,
++	0x1904, 0x3acd, 0x2011, 0x0001, 0x00b1, 0x0090, 0xa010, 0x9092,
++	0x0004, 0x9086, 0x0015, 0x1120, 0xa000, 0xa05a, 0x2011, 0x0031,
++	0xa212, 0xd1dc, 0x1960, 0x0828, 0x782b, 0x0004, 0x7003, 0x0000,
++	0x00ee, 0x00fe, 0x0005, 0xa014, 0x9005, 0x0540, 0x8001, 0x0036,
++	0x0096, 0xa016, 0xa058, 0x2048, 0xa010, 0x2009, 0x0025, 0x911a,
++	0x831c, 0x831c, 0x938a, 0x0004, 0x1a0c, 0x0d84, 0x9398, 0x3b57,
++	0x231d, 0x083f, 0x9080, 0x0004, 0x7a2a, 0x7100, 0x8108, 0x7102,
++	0x009e, 0x003e, 0x908a, 0x0029, 0x1130, 0xa058, 0x2048, 0xa804,
++	0xa05a, 0x2001, 0x0019, 0xa012, 0x9085, 0x0001, 0x0005, 0x3b76,
++	0x3b6d, 0x3b64, 0x3b5b, 0xa964, 0x7902, 0xa968, 0x7906, 0xa96c,
++	0x7912, 0xa970, 0x7916, 0x0005, 0xa974, 0x7902, 0xa978, 0x7906,
++	0xa97c, 0x7912, 0xa980, 0x7916, 0x0005, 0xa984, 0x7902, 0xa988,
++	0x7906, 0xa98c, 0x7912, 0xa990, 0x7916, 0x0005, 0xa994, 0x7902,
++	0xa998, 0x7906, 0xa99c, 0x7912, 0xa9a0, 0x7916, 0x0005, 0x00f6,
++	0x00e6, 0x0086, 0x2071, 0x1a33, 0x2079, 0x0090, 0x792c, 0xd1fc,
++	0x01f0, 0x782b, 0x0002, 0x2940, 0x9026, 0x7000, 0x0002, 0x3ba7,
++	0x3b92, 0x3b9e, 0x8001, 0x7002, 0xd19c, 0x1188, 0x2011, 0x0001,
++	0x080c, 0x3b2b, 0x0160, 0x080c, 0x3b2b, 0x0048, 0x8001, 0x7002,
++	0x782c, 0xd0fc, 0x1d30, 0x2011, 0x0001, 0x080c, 0x3b2b, 0x008e,
++	0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x2061,
++	0x0200, 0x2001, 0x1977, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001,
++	0x1976, 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x2001, 0x002c,
++	0x2004, 0x9005, 0x0518, 0x2038, 0x2001, 0x002e, 0x2024, 0x2001,
++	0x002f, 0x201c, 0x080c, 0x441f, 0xa813, 0x0019, 0xaf16, 0x2900,
++	0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010,
++	0x2708, 0x903e, 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019,
++	0x009e, 0x04c1, 0x1d70, 0x2900, 0xa85a, 0x0080, 0x080c, 0x441f,
++	0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e,
++	0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, 0x2061, 0x0090,
++	0x2079, 0x0100, 0x2001, 0x1976, 0x2004, 0x6036, 0x2009, 0x0040,
++	0x080c, 0x2014, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e,
++	0x601a, 0x0006, 0x2001, 0x002b, 0x2004, 0xa872, 0x601e, 0x78c6,
++	0x000e, 0x78ca, 0x9006, 0x600a, 0x600e, 0x008e, 0x00ce, 0x00ee,
++	0x00fe, 0x0005, 0x00e6, 0x2071, 0x0080, 0xaa60, 0x22e8, 0x20a0,
++	0x20e1, 0x0000, 0x2099, 0x0088, 0x702b, 0x0026, 0x7402, 0x7306,
++	0x9006, 0x700a, 0x700e, 0x810b, 0x810b, 0x21a8, 0x810b, 0x7112,
++	0x702b, 0x0041, 0x702c, 0xd0fc, 0x0de8, 0x702b, 0x0002, 0x702b,
++	0x0040, 0x4005, 0x7400, 0x7304, 0x87ff, 0x0190, 0x0086, 0x0096,
++	0x2940, 0x0086, 0x080c, 0x441f, 0x008e, 0xa058, 0x00a6, 0x2050,
++	0x2900, 0xb006, 0xa05a, 0x00ae, 0x009e, 0x008e, 0x9085, 0x0001,
++	0x00ee, 0x0005, 0x00e6, 0x2001, 0x002d, 0x2004, 0x9005, 0x0528,
++	0x2038, 0x2001, 0x0030, 0x2024, 0x2001, 0x0031, 0x201c, 0x080c,
++	0x441f, 0x2940, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a,
++	0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e,
++	0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c,
++	0x3c1a, 0x1d68, 0x2900, 0xa85a, 0x00d8, 0x080c, 0x441f, 0x2940,
++	0xa013, 0x0019, 0xa017, 0x0001, 0x2800, 0xa05a, 0x2001, 0x0030,
++	0x2004, 0xa066, 0x2001, 0x0031, 0x2004, 0xa06a, 0x2001, 0x002a,
++	0x2004, 0x9084, 0xfff8, 0xa06e, 0x2001, 0x002b, 0x2004, 0xa072,
++	0x2001, 0x032a, 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1180, 0x2001,
++	0x0101, 0x200c, 0x918d, 0x0200, 0x2102, 0xa017, 0x0000, 0x2001,
++	0x1a30, 0x2003, 0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x2001,
++	0x0300, 0x2003, 0x0000, 0x2001, 0x020d, 0x2003, 0x0000, 0x2001,
++	0x0004, 0x200c, 0x918d, 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126,
++	0x2091, 0x8000, 0x20a9, 0x0012, 0x2001, 0x1840, 0x20e9, 0x0001,
++	0x20a0, 0x9006, 0x4004, 0x2009, 0x013c, 0x200a, 0x012e, 0x7880,
++	0x9086, 0x0052, 0x0108, 0x0005, 0x0804, 0x305f, 0x7d98, 0x7c9c,
++	0x0804, 0x3154, 0x080c, 0x6877, 0x0110, 0x080c, 0x569e, 0x2069,
++	0x1852, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
++	0x2039, 0x0001, 0x080c, 0x4468, 0x701b, 0x3cef, 0x0005, 0x080c,
++	0x4df9, 0x1130, 0x3b00, 0x3a08, 0xc194, 0xc095, 0x20d8, 0x21d0,
++	0x2069, 0x1852, 0x6800, 0x9005, 0x0904, 0x3092, 0x6804, 0xd0ac,
++	0x0118, 0xd0a4, 0x0904, 0x3092, 0xd094, 0x00c6, 0x2061, 0x0100,
++	0x6104, 0x0138, 0x6200, 0x9292, 0x0005, 0x0218, 0x918c, 0xffdf,
++	0x0010, 0x918d, 0x0020, 0x6106, 0x00ce, 0xd08c, 0x00c6, 0x2061,
++	0x0100, 0x6104, 0x0118, 0x918d, 0x0010, 0x0010, 0x918c, 0xffef,
++	0x6106, 0x00ce, 0xd084, 0x0158, 0x6a28, 0x928a, 0x007f, 0x1a04,
++	0x3092, 0x9288, 0x2e6e, 0x210d, 0x918c, 0x00ff, 0x615e, 0xd0dc,
++	0x0130, 0x6828, 0x908a, 0x007f, 0x1a04, 0x3092, 0x6056, 0x6888,
++	0x9084, 0x0030, 0x8004, 0x8004, 0x8004, 0x8004, 0x0006, 0x2009,
++	0x197e, 0x9080, 0x2539, 0x2005, 0x200a, 0x000e, 0x2009, 0x197f,
++	0x9080, 0x253d, 0x2005, 0x200a, 0x6808, 0x908a, 0x0100, 0x0a04,
++	0x3092, 0x908a, 0x0841, 0x1a04, 0x3092, 0x9084, 0x0007, 0x1904,
++	0x3092, 0x680c, 0x9005, 0x0904, 0x3092, 0x6810, 0x9005, 0x0904,
++	0x3092, 0x6848, 0x6940, 0x910a, 0x1a04, 0x3092, 0x8001, 0x0904,
++	0x3092, 0x684c, 0x6944, 0x910a, 0x1a04, 0x3092, 0x8001, 0x0904,
++	0x3092, 0x6980, 0xd1e4, 0x0140, 0x00c6, 0x2061, 0x0100, 0x6004,
++	0x9085, 0x0100, 0x6006, 0x00ce, 0x2009, 0x194e, 0x200b, 0x0000,
++	0x2001, 0x1874, 0x2004, 0xd0c4, 0x0140, 0x7884, 0x200a, 0x2009,
++	0x017f, 0x200a, 0x3b00, 0xc085, 0x20d8, 0x6814, 0x908c, 0x00ff,
++	0x6146, 0x8007, 0x9084, 0x00ff, 0x604a, 0x080c, 0x6b71, 0x080c,
++	0x5f63, 0x080c, 0x5f97, 0x6808, 0x602a, 0x080c, 0x1f86, 0x2009,
++	0x0170, 0x200b, 0x0080, 0xa001, 0xa001, 0x200b, 0x0000, 0x0036,
++	0x6b08, 0x080c, 0x24a0, 0x003e, 0x6000, 0x9086, 0x0000, 0x1904,
++	0x3e96, 0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217,
++	0x831f, 0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0148,
++	0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f,
++	0x0010, 0x9084, 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312, 0x8007,
++	0x810f, 0x8217, 0x831f, 0x20a9, 0x0004, 0x20a1, 0x1980, 0x20e9,
++	0x0001, 0x4001, 0x20a9, 0x0004, 0x20a1, 0x199a, 0x20e9, 0x0001,
++	0x4001, 0x080c, 0x791c, 0x00c6, 0x900e, 0x20a9, 0x0001, 0x6b70,
++	0xd384, 0x0510, 0x0068, 0x2009, 0x0100, 0x210c, 0x918e, 0x0008,
++	0x1110, 0x839d, 0x0010, 0x83f5, 0x3e18, 0x12b0, 0x3508, 0x8109,
++	0x080c, 0x70f4, 0x6878, 0x6016, 0x6874, 0x2008, 0x9084, 0xff00,
++	0x8007, 0x600a, 0x9184, 0x00ff, 0x6006, 0x8108, 0x1118, 0x6003,
++	0x0003, 0x0010, 0x6003, 0x0001, 0x1f04, 0x3deb, 0x00ce, 0x00c6,
++	0x2061, 0x1969, 0x6a88, 0x9284, 0xc000, 0x2010, 0x9286, 0x0000,
++	0x1158, 0x2063, 0x0000, 0x2001, 0x0001, 0x080c, 0x2747, 0x2001,
++	0x0001, 0x080c, 0x272a, 0x0088, 0x9286, 0x4000, 0x1148, 0x2063,
++	0x0001, 0x9006, 0x080c, 0x2747, 0x9006, 0x080c, 0x272a, 0x0028,
++	0x9286, 0x8000, 0x1d30, 0x2063, 0x0002, 0x00ce, 0x00e6, 0x2c70,
++	0x080c, 0x0e3b, 0x00ee, 0x6888, 0xd0ec, 0x0130, 0x2011, 0x0114,
++	0x2204, 0x9085, 0x0100, 0x2012, 0x6a80, 0x9284, 0x0030, 0x9086,
++	0x0030, 0x1128, 0x9294, 0xffcf, 0x9295, 0x0020, 0x6a82, 0x2001,
++	0x194b, 0x6a80, 0x9294, 0x0030, 0x928e, 0x0000, 0x0170, 0x928e,
++	0x0010, 0x0118, 0x928e, 0x0020, 0x0140, 0x2003, 0xaaaa, 0x080c,
++	0x2515, 0x2001, 0x193c, 0x2102, 0x0008, 0x2102, 0x00c6, 0x2061,
++	0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, 0x6877,
++	0x0128, 0x080c, 0x46fa, 0x0110, 0x080c, 0x2466, 0x60d0, 0x9005,
++	0x01c0, 0x6003, 0x0001, 0x2009, 0x3e7e, 0x00d0, 0x080c, 0x6877,
++	0x1168, 0x2011, 0x6739, 0x080c, 0x781a, 0x2011, 0x672c, 0x080c,
++	0x78e7, 0x080c, 0x6b45, 0x080c, 0x67be, 0x0040, 0x080c, 0x55a0,
++	0x0028, 0x6003, 0x0004, 0x2009, 0x3e96, 0x0010, 0x0804, 0x305f,
++	0x2001, 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, 0x1118,
++	0x2091, 0x30bd, 0x0817, 0x2091, 0x303d, 0x0817, 0x6000, 0x9086,
++	0x0000, 0x0904, 0x308f, 0x2069, 0x1852, 0x7890, 0x6842, 0x7894,
++	0x6846, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
++	0x2039, 0x0001, 0x0804, 0x446b, 0x9006, 0x080c, 0x2466, 0x81ff,
++	0x1904, 0x308f, 0x080c, 0x6877, 0x1168, 0x080c, 0x6b40, 0x080c,
++	0x56d9, 0x080c, 0x2e69, 0x0118, 0x6130, 0xc18d, 0x6132, 0x080c,
++	0x67be, 0x0020, 0x080c, 0x569e, 0x080c, 0x55a0, 0x0804, 0x305f,
++	0x81ff, 0x1904, 0x308f, 0x080c, 0x6877, 0x1110, 0x0804, 0x308f,
++	0x618c, 0x81ff, 0x01a8, 0x704b, 0x0000, 0x2001, 0x1c80, 0x2009,
++	0x0040, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126, 0x2091, 0x8000,
++	0x2039, 0x0001, 0x080c, 0x446b, 0x701b, 0x305d, 0x012e, 0x0005,
++	0x704b, 0x0001, 0x00d6, 0x2069, 0x1c80, 0x20a9, 0x0040, 0x20e9,
++	0x0001, 0x20a1, 0x1c80, 0x2019, 0xffff, 0x4304, 0x6554, 0x9588,
++	0x2e6e, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, 0x2011, 0x0002,
++	0x2100, 0x9506, 0x01a8, 0x080c, 0x5c0d, 0x1190, 0xb814, 0x821c,
++	0x0238, 0x9398, 0x1c80, 0x9085, 0xff00, 0x8007, 0x201a, 0x0038,
++	0x9398, 0x1c80, 0x2324, 0x94a4, 0xff00, 0x9405, 0x201a, 0x8210,
++	0x8108, 0x9182, 0x0080, 0x1208, 0x0c18, 0x8201, 0x8007, 0x2d0c,
++	0x9105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, 0x1c80, 0x2099,
++	0x1c80, 0x080c, 0x5634, 0x0804, 0x3ee5, 0x080c, 0x4452, 0x0904,
++	0x3092, 0x080c, 0x441f, 0x1120, 0x2009, 0x0002, 0x0804, 0x308f,
++	0x080c, 0x4dea, 0xd0b4, 0x0558, 0x7884, 0x908e, 0x007e, 0x0538,
++	0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508, 0x080c, 0x2e64,
++	0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, 0x00ff, 0x9086,
++	0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c,
++	0xb258, 0x1120, 0x2009, 0x0003, 0x0804, 0x308f, 0x7007, 0x0003,
++	0x701b, 0x3f73, 0x0005, 0x080c, 0x4452, 0x0904, 0x3092, 0x20a9,
++	0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, 0xa860, 0x20e8, 0xa85c,
++	0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, 0x0006,
++	0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c,
++	0x0f2b, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x000a, 0x20a0,
++	0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0f2b,
++	0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080,
++	0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804,
++	0x446b, 0x81ff, 0x1904, 0x308f, 0x080c, 0x4436, 0x0904, 0x3092,
++	0x080c, 0x5d7f, 0x0904, 0x308f, 0x0058, 0xa878, 0x9005, 0x0120,
++	0x2009, 0x0004, 0x0804, 0x308f, 0xa974, 0xaa94, 0x0804, 0x305f,
++	0x080c, 0x4df2, 0x0904, 0x305f, 0x701b, 0x3fbd, 0x7007, 0x0003,
++	0x0005, 0x81ff, 0x1904, 0x308f, 0x7888, 0x908a, 0x1000, 0x1a04,
++	0x3092, 0x080c, 0x4452, 0x0904, 0x3092, 0x080c, 0x5e04, 0x0904,
++	0x308f, 0x2019, 0x0004, 0x900e, 0x080c, 0x5d91, 0x0904, 0x308f,
++	0x7984, 0x7a88, 0x0499, 0x08e0, 0xa89c, 0x908a, 0x1000, 0x12c8,
++	0x080c, 0x4450, 0x01b0, 0x080c, 0x5e04, 0x2009, 0x0002, 0x0168,
++	0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x5d91, 0x2009, 0x0003,
++	0x0120, 0xa998, 0xaa9c, 0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a,
++	0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030,
++	0x0005, 0xa897, 0x4000, 0x080c, 0x4df2, 0x0110, 0x9006, 0x0018,
++	0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x9186, 0x00ff,
++	0x0110, 0x0071, 0x0060, 0x2029, 0x007e, 0x2061, 0x1800, 0x6454,
++	0x2400, 0x9506, 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005,
++	0x080c, 0x5c0d, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0x9108,
++	0x080c, 0x7826, 0x0005, 0x81ff, 0x1904, 0x308f, 0x080c, 0x4436,
++	0x0904, 0x3092, 0x080c, 0x5cd4, 0x0904, 0x308f, 0x080c, 0x5d88,
++	0x0904, 0x308f, 0x0804, 0x3fc8, 0x81ff, 0x1904, 0x308f, 0x080c,
++	0x4436, 0x0904, 0x3092, 0x080c, 0x5cd4, 0x0904, 0x308f, 0x080c,
++	0x5d76, 0x0904, 0x308f, 0x0804, 0x3fc8, 0x6100, 0x0804, 0x305f,
++	0x080c, 0x4452, 0x0904, 0x3092, 0x080c, 0x4dfe, 0x1904, 0x308f,
++	0x79a8, 0xd184, 0x1158, 0xb834, 0x8007, 0x789e, 0xb830, 0x8007,
++	0x789a, 0xbb2c, 0x831f, 0xba28, 0x8217, 0x0050, 0xb824, 0x8007,
++	0x789e, 0xb820, 0x8007, 0x789a, 0xbb1c, 0x831f, 0xba18, 0x8217,
++	0xb900, 0x918c, 0x0200, 0x0804, 0x305f, 0x78a8, 0x909c, 0x0003,
++	0xd0b4, 0x1150, 0x939a, 0x0003, 0x1a04, 0x308f, 0x6254, 0x9294,
++	0x00ff, 0x7884, 0x9206, 0x1560, 0x2031, 0x1848, 0x2009, 0x013c,
++	0x2136, 0x2001, 0x1840, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c,
++	0x7d98, 0x2039, 0x0001, 0x0006, 0x78a8, 0x9084, 0x0080, 0x1118,
++	0x000e, 0x0804, 0x446b, 0x000e, 0x2031, 0x0000, 0x2061, 0x18ac,
++	0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496,
++	0xa59a, 0x080c, 0x108c, 0x7007, 0x0002, 0x701b, 0x40df, 0x0005,
++	0x81ff, 0x1904, 0x308f, 0x080c, 0x4452, 0x0904, 0x3092, 0x080c,
++	0x5f2d, 0x1904, 0x308f, 0x00c6, 0x080c, 0x441f, 0x00ce, 0x0904,
++	0x308f, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xb1fe,
++	0x0904, 0x308f, 0x7007, 0x0003, 0x701b, 0x40e3, 0x0005, 0x080c,
++	0x3cbf, 0x0804, 0x305f, 0xa830, 0x9086, 0x0100, 0x0904, 0x308f,
++	0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080,
++	0x001b, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804,
++	0x446b, 0x9006, 0x080c, 0x2466, 0x78a8, 0x9084, 0x00ff, 0x9086,
++	0x00ff, 0x0118, 0x81ff, 0x1904, 0x308f, 0x080c, 0x6877, 0x0110,
++	0x080c, 0x569e, 0x7888, 0x908a, 0x1000, 0x1a04, 0x3092, 0x7984,
++	0x9186, 0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, 0x3092, 0x2100,
++	0x080c, 0x2430, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2061,
++	0x19c7, 0x601b, 0x0000, 0x601f, 0x0000, 0x080c, 0x6877, 0x1158,
++	0x080c, 0x6b40, 0x080c, 0x56d9, 0x9085, 0x0001, 0x080c, 0x68c0,
++	0x080c, 0x67be, 0x00d0, 0x080c, 0x94da, 0x2061, 0x0100, 0x2001,
++	0x1816, 0x2004, 0x9084, 0x00ff, 0x810f, 0x9105, 0x604a, 0x6043,
++	0x0090, 0x6043, 0x0010, 0x2009, 0x1966, 0x200b, 0x0000, 0x2009,
++	0x002d, 0x2011, 0x55ca, 0x080c, 0x78a5, 0x7984, 0x080c, 0x6877,
++	0x1110, 0x2009, 0x00ff, 0x7a88, 0x080c, 0x401e, 0x012e, 0x00ce,
++	0x002e, 0x0804, 0x305f, 0x7984, 0x080c, 0x5bb0, 0x2b08, 0x1904,
++	0x3092, 0x0804, 0x305f, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804,
++	0x308f, 0x60d8, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005,
++	0x0804, 0x308f, 0x080c, 0x441f, 0x1120, 0x2009, 0x0002, 0x0804,
++	0x308f, 0x7984, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080,
++	0x0019, 0x7026, 0xaf60, 0x7732, 0x080c, 0x4468, 0x701b, 0x4189,
++	0x0005, 0x2009, 0x0080, 0x080c, 0x5c0d, 0x1118, 0x080c, 0x5f2d,
++	0x0120, 0x2021, 0x400a, 0x0804, 0x3061, 0x00d6, 0x0096, 0xa964,
++	0xaa6c, 0xab70, 0xac74, 0xad78, 0xae7c, 0xa884, 0x90be, 0x0100,
++	0x0904, 0x4222, 0x90be, 0x0112, 0x0904, 0x4222, 0x90be, 0x0113,
++	0x0904, 0x4222, 0x90be, 0x0114, 0x0904, 0x4222, 0x90be, 0x0117,
++	0x0904, 0x4222, 0x90be, 0x011a, 0x0904, 0x4222, 0x90be, 0x011c,
++	0x0904, 0x4222, 0x90be, 0x0121, 0x0904, 0x4209, 0x90be, 0x0131,
++	0x0904, 0x4209, 0x90be, 0x0171, 0x0904, 0x4222, 0x90be, 0x0173,
++	0x0904, 0x4222, 0x90be, 0x01a1, 0x1128, 0xa894, 0x8007, 0xa896,
++	0x0804, 0x422d, 0x90be, 0x0212, 0x0904, 0x4216, 0x90be, 0x0213,
++	0x05e8, 0x90be, 0x0214, 0x0500, 0x90be, 0x0217, 0x0188, 0x90be,
++	0x021a, 0x1120, 0xa89c, 0x8007, 0xa89e, 0x04e0, 0x90be, 0x021f,
++	0x05c8, 0x90be, 0x0300, 0x05b0, 0x009e, 0x00de, 0x0804, 0x3092,
++	0x7024, 0x9080, 0x0010, 0x2098, 0x20a0, 0x7030, 0x20e0, 0x20e8,
++	0x20a9, 0x0007, 0x080c, 0x426b, 0x7024, 0x9080, 0x000e, 0x2098,
++	0x20a0, 0x7030, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x426b,
++	0x00c8, 0x7024, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7030, 0x20e0,
++	0x20e8, 0x20a9, 0x0001, 0x080c, 0x4278, 0x00b8, 0x7024, 0x9080,
++	0x000e, 0x2098, 0x20a0, 0x7030, 0x20e0, 0x20e8, 0x20a9, 0x0001,
++	0x080c, 0x4278, 0x7024, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7030,
++	0x20e0, 0x20e8, 0x20a9, 0x0001, 0x04f1, 0x00c6, 0x080c, 0x441f,
++	0x0550, 0xa868, 0xc0fd, 0xa86a, 0xa867, 0x0119, 0x9006, 0xa882,
++	0xa87f, 0x0020, 0xa88b, 0x0001, 0x810b, 0xa9ae, 0xa8b2, 0xaab6,
++	0xabba, 0xacbe, 0xadc2, 0xa9c6, 0xa8ca, 0x00ce, 0x009e, 0x00de,
++	0xa866, 0xa822, 0xa868, 0xc0fd, 0xa86a, 0xa804, 0x2048, 0x080c,
++	0xb219, 0x1120, 0x2009, 0x0003, 0x0804, 0x308f, 0x7007, 0x0003,
++	0x701b, 0x4262, 0x0005, 0x00ce, 0x009e, 0x00de, 0x2009, 0x0002,
++	0x0804, 0x308f, 0xa820, 0x9086, 0x8001, 0x1904, 0x305f, 0x2009,
++	0x0004, 0x0804, 0x308f, 0x0016, 0x0026, 0x3510, 0x20a9, 0x0002,
++	0x4002, 0x4104, 0x4004, 0x8211, 0x1dc8, 0x002e, 0x001e, 0x0005,
++	0x0016, 0x0026, 0x0036, 0x0046, 0x3520, 0x20a9, 0x0004, 0x4002,
++	0x4304, 0x4204, 0x4104, 0x4004, 0x8421, 0x1db8, 0x004e, 0x003e,
++	0x002e, 0x001e, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804,
++	0x308f, 0x60d8, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005,
++	0x0804, 0x308f, 0x7984, 0x78a8, 0x2040, 0x080c, 0x94d3, 0x1120,
++	0x9182, 0x007f, 0x0a04, 0x3092, 0x9186, 0x00ff, 0x0904, 0x3092,
++	0x9182, 0x0800, 0x1a04, 0x3092, 0x7a8c, 0x7b88, 0x6074, 0x9306,
++	0x1140, 0x6078, 0x924e, 0x0904, 0x3092, 0x99cc, 0xff00, 0x0904,
++	0x3092, 0x080c, 0x435a, 0x0538, 0x90c6, 0x4000, 0x1170, 0x00c6,
++	0x0006, 0x900e, 0x080c, 0x5e2d, 0x1108, 0xc185, 0xb800, 0xd0bc,
++	0x0108, 0xc18d, 0x000e, 0x00ce, 0x0098, 0x90c6, 0x4007, 0x1110,
++	0x2408, 0x0070, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0040,
++	0x90c6, 0x4009, 0x1108, 0x0020, 0x2001, 0x4005, 0x2009, 0x000a,
++	0x2020, 0x0804, 0x3061, 0x2b00, 0x7022, 0x0016, 0x00b6, 0x00c6,
++	0x00e6, 0x2c70, 0x080c, 0x95a1, 0x0904, 0x4330, 0x2b00, 0x6012,
++	0x080c, 0xb4e6, 0x2e58, 0x00ee, 0x00e6, 0x00c6, 0x080c, 0x441f,
++	0x00ce, 0x2b70, 0x1150, 0x080c, 0x9554, 0x00ee, 0x00ce, 0x00be,
++	0x001e, 0x2009, 0x0002, 0x0804, 0x308f, 0x900e, 0xa966, 0xa96a,
++	0x2900, 0x6016, 0xa932, 0xa868, 0xc0fd, 0xd88c, 0x0108, 0xc0f5,
++	0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, 0x2d1a, 0x012e, 0x6023,
++	0x0001, 0x9006, 0x080c, 0x5b4d, 0x2001, 0x0002, 0x080c, 0x5b61,
++	0x2009, 0x0002, 0x080c, 0x95ce, 0x78a8, 0xd094, 0x0138, 0x00ee,
++	0x7020, 0x00e6, 0x2058, 0xb8bc, 0xc08d, 0xb8be, 0x9085, 0x0001,
++	0x00ee, 0x00ce, 0x00be, 0x001e, 0x1120, 0x2009, 0x0003, 0x0804,
++	0x308f, 0x7007, 0x0003, 0x701b, 0x433e, 0x0005, 0xa830, 0x9086,
++	0x0100, 0x7020, 0x2058, 0x1138, 0x2009, 0x0004, 0xba04, 0x9294,
++	0x00ff, 0x0804, 0x4d49, 0x900e, 0xa868, 0xd0f4, 0x1904, 0x305f,
++	0x080c, 0x5e2d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d,
++	0x0804, 0x305f, 0x00e6, 0x00d6, 0x2029, 0x0000, 0x080c, 0x94d3,
++	0x0138, 0x2021, 0x0000, 0x20a9, 0x0800, 0x2071, 0x1000, 0x0030,
++	0x2021, 0x0080, 0x20a9, 0x0780, 0x2071, 0x1080, 0x2e04, 0x9005,
++	0x1130, 0x2100, 0x9406, 0x1550, 0x2428, 0xc5fd, 0x0438, 0x2058,
++	0xbf10, 0x2700, 0x9306, 0x11a0, 0xbe14, 0x2600, 0x9206, 0x1180,
++	0x2400, 0x9106, 0x1150, 0xd884, 0x0550, 0xd894, 0x1540, 0x080c,
++	0x5f2d, 0x1528, 0x2001, 0x4000, 0x0418, 0x2001, 0x4007, 0x0400,
++	0x2400, 0x9106, 0x1158, 0xbe14, 0x87ff, 0x1128, 0x86ff, 0x09e0,
++	0x080c, 0x94d3, 0x19c8, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70,
++	0x1f04, 0x436e, 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001,
++	0x0001, 0x0030, 0x080c, 0x5bb0, 0x1dd0, 0xbb12, 0xba16, 0x9006,
++	0x9005, 0x00de, 0x00ee, 0x0005, 0x81ff, 0x1904, 0x308f, 0x080c,
++	0x441f, 0x0904, 0x308f, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a,
++	0x7884, 0x9005, 0x0904, 0x3092, 0x9096, 0x00ff, 0x0120, 0x9092,
++	0x0004, 0x1a04, 0x3092, 0x2010, 0x2918, 0x080c, 0x2cc0, 0x0904,
++	0x308f, 0x7007, 0x0003, 0x701b, 0x43d6, 0x0005, 0xa830, 0x9086,
++	0x0100, 0x0904, 0x308f, 0x0804, 0x305f, 0x7984, 0x080c, 0x94d3,
++	0x1120, 0x9182, 0x0080, 0x0a04, 0x3092, 0x9186, 0x00ff, 0x0904,
++	0x3092, 0x9182, 0x0800, 0x1a04, 0x3092, 0x2001, 0x9000, 0x080c,
++	0x4da2, 0x1904, 0x308f, 0x0804, 0x305f, 0xa998, 0x080c, 0x94d3,
++	0x1118, 0x9182, 0x0080, 0x0280, 0x9186, 0x00ff, 0x0168, 0x9182,
++	0x0800, 0x1250, 0x2001, 0x9000, 0x080c, 0x4da2, 0x11a8, 0x0060,
++	0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085,
++	0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x900e, 0x9085,
++	0x0001, 0x2001, 0x0000, 0x0005, 0x2009, 0x000a, 0x0c48, 0x080c,
++	0x0fae, 0x0198, 0x9006, 0xa802, 0x7010, 0x9005, 0x1120, 0x2900,
++	0x7012, 0x7016, 0x0040, 0x7014, 0xa802, 0x0086, 0x2040, 0x2900,
++	0xa006, 0x7016, 0x008e, 0x9085, 0x0001, 0x0005, 0x7984, 0x080c,
++	0x5c0d, 0x1130, 0x7e88, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208,
++	0x905e, 0x8bff, 0x0005, 0xa998, 0x080c, 0x5c0d, 0x1130, 0xae9c,
++	0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005,
++	0xae98, 0x0008, 0x7e84, 0x2608, 0x080c, 0x5c0d, 0x1108, 0x0008,
++	0x905e, 0x8bff, 0x0005, 0x0016, 0x7110, 0x81ff, 0x0128, 0x2148,
++	0xa904, 0x080c, 0x0fe0, 0x0cc8, 0x7112, 0x7116, 0x001e, 0x0005,
++	0x2031, 0x0001, 0x0010, 0x2031, 0x0000, 0x2061, 0x18ac, 0x2c44,
++	0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a,
++	0x080c, 0x108c, 0x7007, 0x0002, 0x701b, 0x305f, 0x0005, 0x00f6,
++	0x0126, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001, 0x18a4, 0x2004,
++	0x9005, 0x1188, 0x0e04, 0x449b, 0x7a36, 0x7833, 0x0012, 0x7a82,
++	0x7b86, 0x7c8a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084,
++	0x190c, 0x113e, 0x0408, 0x0016, 0x00c6, 0x00e6, 0x2071, 0x1893,
++	0x7144, 0x9182, 0x0010, 0x0218, 0x7034, 0x2060, 0x0078, 0x7034,
++	0x90e0, 0x0004, 0x9c82, 0x18ee, 0x0210, 0x2061, 0x18ae, 0x2c00,
++	0x7036, 0x81ff, 0x1108, 0x703a, 0x8108, 0x7146, 0x2262, 0x6306,
++	0x640a, 0x00ee, 0x00ce, 0x001e, 0x012e, 0x00fe, 0x0005, 0x00e6,
++	0x2071, 0x1893, 0x7044, 0x9005, 0x0590, 0x0126, 0x2091, 0x8000,
++	0x0e04, 0x44f6, 0x00f6, 0x2079, 0x0000, 0x00c6, 0x7038, 0x2060,
++	0x2c04, 0x7836, 0x7833, 0x0012, 0x7882, 0x6004, 0x7886, 0x6008,
++	0x788a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
++	0x113e, 0x7044, 0x8001, 0x7046, 0x9005, 0x1130, 0x7037, 0x18ae,
++	0x703b, 0x18ae, 0x00ce, 0x0048, 0x9c80, 0x0004, 0x90fa, 0x18ee,
++	0x0210, 0x2001, 0x18ae, 0x703a, 0x00ce, 0x00fe, 0x012e, 0x00ee,
++	0x0005, 0x0026, 0x080c, 0x4dea, 0xd0c4, 0x0120, 0x2011, 0x8014,
++	0x080c, 0x447f, 0x002e, 0x0005, 0x81ff, 0x1904, 0x308f, 0x0126,
++	0x2091, 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c,
++	0x6877, 0x1158, 0x080c, 0x6b40, 0x080c, 0x56d9, 0x9085, 0x0001,
++	0x080c, 0x68c0, 0x080c, 0x67be, 0x0010, 0x080c, 0x55a0, 0x012e,
++	0x0804, 0x305f, 0x7884, 0x2008, 0x918c, 0xfffd, 0x1128, 0x61e4,
++	0x910d, 0x61e6, 0x0804, 0x305f, 0x0804, 0x3092, 0x81ff, 0x1904,
++	0x308f, 0x080c, 0x4dfe, 0x1904, 0x308f, 0x080c, 0x5f25, 0x1904,
++	0x308f, 0x080c, 0x2e64, 0x0128, 0x7984, 0x080c, 0x5bb0, 0x1904,
++	0x3092, 0x080c, 0x4452, 0x0904, 0x3092, 0x2b00, 0x7022, 0x080c,
++	0x5f2d, 0x7888, 0x1170, 0x9084, 0x0005, 0x1158, 0x900e, 0x080c,
++	0x5e2d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804,
++	0x305f, 0x080c, 0x441f, 0x0904, 0x308f, 0x9006, 0xa866, 0xa832,
++	0xa868, 0xc0fd, 0xa86a, 0x080c, 0xb2a8, 0x0904, 0x308f, 0x7888,
++	0xd094, 0x0118, 0xb8bc, 0xc08d, 0xb8be, 0x7007, 0x0003, 0x701b,
++	0x45bd, 0x0005, 0x2061, 0x1800, 0x080c, 0x4dfe, 0x2009, 0x0007,
++	0x1570, 0x080c, 0x5f25, 0x2009, 0x0008, 0x1548, 0x080c, 0x2e64,
++	0x0120, 0xa998, 0x080c, 0x5bb0, 0x1530, 0x080c, 0x4450, 0x0518,
++	0x080c, 0x5f2d, 0xa89c, 0x1168, 0x9084, 0x0005, 0x1150, 0x900e,
++	0x080c, 0x5e2d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d,
++	0x00d0, 0xa868, 0xc0fc, 0xa86a, 0x080c, 0xb2a8, 0x11e0, 0xa89c,
++	0xd094, 0x0118, 0xb8bc, 0xc08d, 0xb8be, 0x2009, 0x0003, 0xa897,
++	0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001,
++	0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0xa99a, 0x9006, 0x918d,
++	0x0001, 0x2008, 0x0005, 0x9006, 0x0005, 0xa830, 0x9086, 0x0100,
++	0x7020, 0x2058, 0x1110, 0x0804, 0x4d49, 0x900e, 0x080c, 0x5e2d,
++	0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x305f,
++	0x080c, 0x4dfe, 0x1904, 0x308f, 0x7f84, 0x7a8c, 0x7b88, 0x7c9c,
++	0x7d98, 0x080c, 0x441f, 0x0904, 0x308f, 0x900e, 0x2130, 0x7122,
++	0x712e, 0xa860, 0x20e8, 0x7032, 0xa85c, 0x9080, 0x0005, 0x7026,
++	0x20a0, 0x080c, 0x5c0d, 0x1904, 0x464d, 0x080c, 0x5f2d, 0x0120,
++	0x080c, 0x5f35, 0x1904, 0x464d, 0x080c, 0x5f25, 0x1130, 0x080c,
++	0x5e2d, 0x1118, 0xd79c, 0x0904, 0x464d, 0xd794, 0x1110, 0xd784,
++	0x01a8, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x3400,
++	0xd794, 0x0160, 0x20a9, 0x0008, 0x4003, 0x2098, 0x20a0, 0x3d00,
++	0x20e0, 0x20a9, 0x0002, 0x080c, 0x4278, 0x0048, 0x20a9, 0x0004,
++	0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x4278, 0x4104,
++	0xd794, 0x0528, 0xb8b4, 0x20e0, 0xb8b8, 0x2060, 0x9c80, 0x0000,
++	0x2098, 0x20a9, 0x0002, 0x4003, 0x9c80, 0x0003, 0x2098, 0x20a9,
++	0x0001, 0x4005, 0x9c80, 0x0004, 0x2098, 0x3400, 0x20a9, 0x0002,
++	0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x426b, 0x9c80,
++	0x0026, 0x2098, 0xb8b4, 0x20e0, 0x20a9, 0x0002, 0x4003, 0xd794,
++	0x0110, 0x96b0, 0x000b, 0x96b0, 0x0005, 0x8108, 0x080c, 0x94d3,
++	0x0118, 0x9186, 0x0800, 0x0040, 0xd78c, 0x0120, 0x9186, 0x0800,
++	0x0170, 0x0018, 0x9186, 0x007e, 0x0150, 0xd794, 0x0118, 0x9686,
++	0x0020, 0x0010, 0x9686, 0x0028, 0x0150, 0x0804, 0x45e9, 0x86ff,
++	0x1120, 0x7120, 0x810b, 0x0804, 0x305f, 0x702f, 0x0001, 0x711e,
++	0x7020, 0x9600, 0x7022, 0x772a, 0x2061, 0x18ac, 0x2c44, 0xa06b,
++	0x0000, 0xa67a, 0x7030, 0xa072, 0x7024, 0xa076, 0xa28e, 0xa392,
++	0xa496, 0xa59a, 0x080c, 0x108c, 0x7007, 0x0002, 0x701b, 0x4689,
++	0x0005, 0x702c, 0x9005, 0x1180, 0x711c, 0x7024, 0x20a0, 0x7728,
++	0x9036, 0x7030, 0x20e8, 0x2061, 0x18ac, 0x2c44, 0xa28c, 0xa390,
++	0xa494, 0xa598, 0x0804, 0x45e9, 0x7120, 0x810b, 0x0804, 0x305f,
++	0x2029, 0x007e, 0x7984, 0x7a88, 0x7b8c, 0x7c98, 0x9184, 0xff00,
++	0x8007, 0x90e2, 0x0020, 0x0a04, 0x3092, 0x9502, 0x0a04, 0x3092,
++	0x9184, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3092, 0x9502, 0x0a04,
++	0x3092, 0x9284, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3092,
++	0x9502, 0x0a04, 0x3092, 0x9284, 0x00ff, 0x90e2, 0x0020, 0x0a04,
++	0x3092, 0x9502, 0x0a04, 0x3092, 0x9384, 0xff00, 0x8007, 0x90e2,
++	0x0020, 0x0a04, 0x3092, 0x9502, 0x0a04, 0x3092, 0x9384, 0x00ff,
++	0x90e2, 0x0020, 0x0a04, 0x3092, 0x9502, 0x0a04, 0x3092, 0x9484,
++	0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3092, 0x9502, 0x0a04,
++	0x3092, 0x9484, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3092, 0x9502,
++	0x0a04, 0x3092, 0x2061, 0x1956, 0x6102, 0x6206, 0x630a, 0x640e,
++	0x0804, 0x305f, 0x0006, 0x080c, 0x4dea, 0xd0cc, 0x000e, 0x0005,
++	0x0006, 0x080c, 0x4dee, 0xd0bc, 0x000e, 0x0005, 0x616c, 0x7a84,
++	0x6300, 0x82ff, 0x1118, 0x7986, 0x0804, 0x305f, 0x83ff, 0x1904,
++	0x3092, 0x2001, 0xfff0, 0x9200, 0x1a04, 0x3092, 0x2019, 0xffff,
++	0x6070, 0x9302, 0x9200, 0x0a04, 0x3092, 0x7986, 0x626e, 0x0804,
++	0x305f, 0x080c, 0x4dfe, 0x1904, 0x308f, 0x7c88, 0x7d84, 0x7e98,
++	0x7f8c, 0x080c, 0x441f, 0x0904, 0x308f, 0x900e, 0x901e, 0x7322,
++	0x732e, 0xa860, 0x20e8, 0x7032, 0xa85c, 0x9080, 0x0003, 0x7026,
++	0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x5f2d,
++	0x0118, 0x080c, 0x5f35, 0x1148, 0x20a9, 0x0001, 0xb814, 0x4004,
++	0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800,
++	0x0120, 0x9386, 0x003c, 0x0170, 0x0c20, 0x83ff, 0x1148, 0x7220,
++	0x900e, 0x2001, 0x0003, 0x080c, 0x7a4b, 0x2208, 0x0804, 0x305f,
++	0x702f, 0x0001, 0x711e, 0x7020, 0x9300, 0x7022, 0x2061, 0x18ac,
++	0x2c44, 0xa06b, 0x0000, 0xa37a, 0x7024, 0xa076, 0x7030, 0xa072,
++	0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x108c, 0x7007, 0x0002,
++	0x701b, 0x477b, 0x0005, 0x702c, 0x9005, 0x1178, 0x711c, 0x7024,
++	0x20a0, 0x901e, 0x7030, 0x20e8, 0x2061, 0x18ac, 0x2c44, 0xa48c,
++	0xa590, 0xa694, 0xa798, 0x0804, 0x4739, 0x7220, 0x900e, 0x2001,
++	0x0003, 0x080c, 0x7a4b, 0x2208, 0x0804, 0x305f, 0x00f6, 0x00e6,
++	0x080c, 0x4dfe, 0x2009, 0x0007, 0x1904, 0x480e, 0x2071, 0x1893,
++	0x7458, 0x84ff, 0x2009, 0x000e, 0x1904, 0x480e, 0xac9c, 0xad98,
++	0xaea4, 0xafa0, 0x0096, 0x080c, 0x0fc7, 0x2009, 0x0002, 0x0904,
++	0x480e, 0x2900, 0x705a, 0x900e, 0x901e, 0x7352, 0x735e, 0xa860,
++	0x7062, 0xa85c, 0x9080, 0x0003, 0x7056, 0x20a0, 0x91d8, 0x1000,
++	0x2b5c, 0x8bff, 0x0178, 0x080c, 0x5f2d, 0x0118, 0x080c, 0x5f35,
++	0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104,
++	0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c,
++	0x01e8, 0x0c20, 0x83ff, 0x11c0, 0x7250, 0x900e, 0x2001, 0x0003,
++	0x080c, 0x7a4b, 0x2208, 0x009e, 0xa897, 0x4000, 0xa99a, 0x7158,
++	0x81ff, 0x090c, 0x0d84, 0x2148, 0x080c, 0x0fe0, 0x9006, 0x705a,
++	0x918d, 0x0001, 0x2008, 0x0418, 0x705f, 0x0001, 0x714e, 0x7050,
++	0x9300, 0x7052, 0x2061, 0x18ad, 0x2c44, 0xa37a, 0x7054, 0xa076,
++	0x7060, 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, 0xa09f, 0x481a,
++	0x000e, 0xa0a2, 0x080c, 0x108c, 0x9006, 0x0048, 0x009e, 0xa897,
++	0x4005, 0xa99a, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ee,
++	0x00fe, 0x0005, 0x00f6, 0xa0a0, 0x904d, 0x090c, 0x0d84, 0x00e6,
++	0x2071, 0x1893, 0xa06c, 0x908e, 0x0100, 0x0138, 0xa87b, 0x0030,
++	0xa883, 0x0000, 0xa897, 0x4002, 0x00d8, 0x705c, 0x9005, 0x1158,
++	0x714c, 0x7054, 0x20a0, 0x901e, 0x7060, 0x20e8, 0xa48c, 0xa590,
++	0xa694, 0xa798, 0x0428, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897,
++	0x4000, 0x7250, 0x900e, 0x2001, 0x0003, 0x080c, 0x7a4b, 0xaa9a,
++	0x7158, 0x81ff, 0x090c, 0x0d84, 0x2148, 0x080c, 0x0fe0, 0x705b,
++	0x0000, 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9,
++	0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x00ee, 0x00fe, 0x0005,
++	0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x5f2d, 0x0118,
++	0x080c, 0x5f35, 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810,
++	0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120,
++	0x9386, 0x003c, 0x0518, 0x0c20, 0x83ff, 0x11f0, 0x7150, 0x810c,
++	0xa99a, 0xa897, 0x4000, 0x7158, 0x81ff, 0x090c, 0x0d84, 0x2148,
++	0x080c, 0x0fe0, 0x9006, 0x705a, 0x918d, 0x0001, 0x2008, 0xa0a0,
++	0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, 0x012e, 0xa09f,
++	0x0000, 0xa0a3, 0x0000, 0x0070, 0x705f, 0x0001, 0x714e, 0x7050,
++	0x9300, 0x7052, 0xa37a, 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c,
++	0x108c, 0x9006, 0x00ee, 0x0005, 0x81ff, 0x1904, 0x308f, 0x60d8,
++	0xd0ac, 0x1118, 0xd09c, 0x0904, 0x308f, 0x080c, 0x441f, 0x0904,
++	0x308f, 0x7984, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080,
++	0x0019, 0xaf60, 0x080c, 0x4468, 0x701b, 0x48c7, 0x0005, 0x0096,
++	0xa88c, 0x90be, 0x7000, 0x0148, 0x90be, 0x7100, 0x0130, 0x90be,
++	0x7200, 0x0118, 0x009e, 0x0804, 0x3092, 0xa884, 0xa988, 0x080c,
++	0x23fd, 0x1500, 0x080c, 0x5bb0, 0x11e8, 0x7122, 0xbe12, 0xbd16,
++	0xae7c, 0x080c, 0x441f, 0x01b0, 0x080c, 0x441f, 0x0198, 0x009e,
++	0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0xa887, 0x0000, 0xa804,
++	0x2048, 0x080c, 0xb239, 0x0904, 0x308f, 0x7007, 0x0003, 0x701b,
++	0x48fd, 0x0005, 0x009e, 0x0804, 0x308f, 0x7120, 0x080c, 0x2e11,
++	0xa884, 0x9086, 0x8001, 0x0904, 0x308f, 0x2900, 0x701e, 0xa804,
++	0x2040, 0x0086, 0xa05c, 0x9080, 0x0002, 0x2098, 0x20a0, 0xa060,
++	0x20e0, 0x20e8, 0x20a9, 0x002a, 0x080c, 0x0f2b, 0xaa6c, 0xab70,
++	0xac74, 0xad78, 0x2061, 0x18ac, 0x2c44, 0xa06b, 0x0000, 0xae64,
++	0xaf8c, 0x97c6, 0x7000, 0x1108, 0x0018, 0x97c6, 0x7100, 0x1190,
++	0x96c2, 0x0004, 0x0a04, 0x3092, 0x2009, 0x0004, 0x009e, 0x8906,
++	0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002,
++	0x0804, 0x446b, 0x97c6, 0x7200, 0x1904, 0x3092, 0x96c2, 0x0054,
++	0x0a04, 0x3092, 0x009e, 0x2061, 0x18ac, 0x2c44, 0x8906, 0x8006,
++	0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xa076,
++	0xa772, 0xa07b, 0x002a, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c,
++	0x108c, 0x7007, 0x0002, 0x701b, 0x495e, 0x0005, 0x701c, 0x2048,
++	0xa804, 0x2048, 0xa804, 0x2048, 0x8906, 0x8006, 0x8007, 0x90bc,
++	0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2098, 0x20a0, 0x27e0,
++	0x27e8, 0x20a9, 0x002a, 0x080c, 0x0f2b, 0x2100, 0x2238, 0x2061,
++	0x18ac, 0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598, 0x2009, 0x002a,
++	0x0804, 0x446b, 0x81ff, 0x1904, 0x308f, 0x798c, 0x2001, 0x194d,
++	0x2102, 0x080c, 0x4436, 0x0904, 0x3092, 0x080c, 0x5cd4, 0x0904,
++	0x308f, 0x0126, 0x2091, 0x8000, 0x080c, 0x5d9a, 0x012e, 0x0904,
++	0x308f, 0x0804, 0x3fc8, 0xa9a0, 0x2001, 0x194d, 0xc18d, 0x2102,
++	0x080c, 0x4443, 0x0170, 0x080c, 0x5cd4, 0x2009, 0x0002, 0x0128,
++	0x080c, 0x5d9a, 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a,
++	0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030,
++	0x0005, 0xa897, 0x4000, 0x080c, 0x4df2, 0x0110, 0x9006, 0x0018,
++	0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x78a8, 0xd08c,
++	0x1118, 0xd084, 0x0904, 0x3f3d, 0x080c, 0x4452, 0x0904, 0x3092,
++	0x080c, 0x441f, 0x1120, 0x2009, 0x0002, 0x0804, 0x308f, 0x080c,
++	0x5f2d, 0x0130, 0x908e, 0x0004, 0x0118, 0x908e, 0x0005, 0x15a0,
++	0x78a8, 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802, 0x0028, 0x080c,
++	0x4dea, 0xd0b4, 0x0904, 0x3f77, 0x7884, 0x908e, 0x007e, 0x0904,
++	0x3f77, 0x908e, 0x007f, 0x0904, 0x3f77, 0x908e, 0x0080, 0x0904,
++	0x3f77, 0xb800, 0xd08c, 0x1904, 0x3f77, 0xa867, 0x0000, 0xa868,
++	0xc0fd, 0xa86a, 0x080c, 0xb258, 0x1120, 0x2009, 0x0003, 0x0804,
++	0x308f, 0x7007, 0x0003, 0x701b, 0x4a0e, 0x0005, 0x080c, 0x4452,
++	0x0904, 0x3092, 0x0804, 0x3f77, 0x080c, 0x2e64, 0x0108, 0x0005,
++	0x2009, 0x1833, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804,
++	0x308f, 0x080c, 0x4dfe, 0x0120, 0x2009, 0x0007, 0x0804, 0x308f,
++	0x080c, 0x5f25, 0x0120, 0x2009, 0x0008, 0x0804, 0x308f, 0xb89c,
++	0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x3f77, 0x9006, 0xa866, 0xa832,
++	0xa868, 0xc0fd, 0xa86a, 0x080c, 0xb2a8, 0x1120, 0x2009, 0x0003,
++	0x0804, 0x308f, 0x7007, 0x0003, 0x701b, 0x4a47, 0x0005, 0xa830,
++	0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x4d49, 0x080c,
++	0x4452, 0x0904, 0x3092, 0x0804, 0x49e0, 0x81ff, 0x2009, 0x0001,
++	0x1904, 0x308f, 0x080c, 0x4dfe, 0x2009, 0x0007, 0x1904, 0x308f,
++	0x080c, 0x5f25, 0x2009, 0x0008, 0x1904, 0x308f, 0x080c, 0x4452,
++	0x0904, 0x3092, 0x080c, 0x5f2d, 0x2009, 0x0009, 0x1904, 0x308f,
++	0x080c, 0x441f, 0x2009, 0x0002, 0x0904, 0x308f, 0x9006, 0xa866,
++	0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988, 0x9194, 0xff00, 0x918c,
++	0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952, 0x798c, 0xa956,
++	0x0038, 0x928e, 0x0100, 0x1904, 0x3092, 0xc0e5, 0xa952, 0xa956,
++	0xa83e, 0x080c, 0xb4e7, 0x2009, 0x0003, 0x0904, 0x308f, 0x7007,
++	0x0003, 0x701b, 0x4a9c, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009,
++	0x0004, 0x0904, 0x308f, 0x0804, 0x305f, 0x7aa8, 0x9284, 0xc000,
++	0x0148, 0xd2ec, 0x01a0, 0x080c, 0x4dfe, 0x1188, 0x2009, 0x0014,
++	0x0804, 0x308f, 0xd2dc, 0x1568, 0x81ff, 0x2009, 0x0001, 0x1904,
++	0x308f, 0x080c, 0x4dfe, 0x2009, 0x0007, 0x1904, 0x308f, 0xd2f4,
++	0x0130, 0x9284, 0x5000, 0x080c, 0x4dc5, 0x0804, 0x305f, 0xd2fc,
++	0x0158, 0x080c, 0x4452, 0x0904, 0x3092, 0x7984, 0x9284, 0x9000,
++	0x080c, 0x4da2, 0x0804, 0x305f, 0x080c, 0x4452, 0x0904, 0x3092,
++	0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x2009, 0x0009, 0x1904,
++	0x4b85, 0x080c, 0x441f, 0x2009, 0x0002, 0x0904, 0x4b85, 0xa85c,
++	0x9080, 0x001b, 0xaf60, 0x2009, 0x0008, 0x7a8c, 0x7b88, 0x7c9c,
++	0x7d98, 0x080c, 0x4468, 0x701b, 0x4af6, 0x0005, 0xa86c, 0x9086,
++	0x0500, 0x1138, 0xa870, 0x9005, 0x1120, 0xa874, 0x9084, 0xff00,
++	0x0110, 0x1904, 0x3092, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a,
++	0x080c, 0x4452, 0x1110, 0x0804, 0x3092, 0x2009, 0x0043, 0x080c,
++	0xb54f, 0x2009, 0x0003, 0x0904, 0x4b85, 0x7007, 0x0003, 0x701b,
++	0x4b1a, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, 0x0004, 0x0904,
++	0x4b85, 0x7984, 0x7aa8, 0x9284, 0x1000, 0x080c, 0x4da2, 0x0804,
++	0x305f, 0x00c6, 0xaab0, 0x9284, 0xc000, 0x0140, 0xd2ec, 0x0168,
++	0x080c, 0x4dfe, 0x1150, 0x2009, 0x0014, 0x04f0, 0x2061, 0x1800,
++	0x080c, 0x4dfe, 0x2009, 0x0007, 0x15b8, 0xd2f4, 0x0128, 0x9284,
++	0x5000, 0x080c, 0x4dc5, 0x0050, 0xd2fc, 0x0178, 0x080c, 0x4450,
++	0x0588, 0xa998, 0x9284, 0x9000, 0x080c, 0x4da2, 0xa87b, 0x0000,
++	0xa883, 0x0000, 0xa897, 0x4000, 0x0438, 0x080c, 0x4450, 0x0510,
++	0x080c, 0x5f2d, 0x2009, 0x0009, 0x11b8, 0xa8c4, 0x9086, 0x0500,
++	0x11c8, 0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084, 0xff00, 0x1190,
++	0x080c, 0x4450, 0x1108, 0x0070, 0x2009, 0x004b, 0x080c, 0xb54f,
++	0x2009, 0x0003, 0x0108, 0x0078, 0x0429, 0x19c0, 0xa897, 0x4005,
++	0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001,
++	0x0030, 0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8, 0xd2dc, 0x0904,
++	0x308f, 0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x4da2,
++	0x001e, 0x1904, 0x308f, 0x0804, 0x305f, 0x00f6, 0x2d78, 0x0011,
++	0x00fe, 0x0005, 0xaab0, 0xd2dc, 0x0150, 0x0016, 0xa998, 0x9284,
++	0x1000, 0xc0fd, 0x080c, 0x4da2, 0x001e, 0x9085, 0x0001, 0x0005,
++	0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x308f, 0x080c, 0x4dfe,
++	0x0120, 0x2009, 0x0007, 0x0804, 0x308f, 0x7984, 0x7ea8, 0x96b4,
++	0x00ff, 0x080c, 0x5c0d, 0x1904, 0x3092, 0x9186, 0x007f, 0x0138,
++	0x080c, 0x5f2d, 0x0120, 0x2009, 0x0009, 0x0804, 0x308f, 0x080c,
++	0x441f, 0x1120, 0x2009, 0x0002, 0x0804, 0x308f, 0xa867, 0x0000,
++	0xa868, 0xc0fd, 0xa86a, 0x2001, 0x0100, 0x8007, 0xa80a, 0x080c,
++	0xb272, 0x1120, 0x2009, 0x0003, 0x0804, 0x308f, 0x7007, 0x0003,
++	0x701b, 0x4be3, 0x0005, 0xa808, 0x8007, 0x9086, 0x0100, 0x1120,
++	0x2009, 0x0004, 0x0804, 0x308f, 0xa8e0, 0xa866, 0xa810, 0x8007,
++	0x9084, 0x00ff, 0x800c, 0xa814, 0x8007, 0x9084, 0x00ff, 0x8004,
++	0x9080, 0x0002, 0x9108, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f,
++	0x9084, 0xffc0, 0x9080, 0x0004, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
++	0x0804, 0x446b, 0x080c, 0x441f, 0x1120, 0x2009, 0x0002, 0x0804,
++	0x308f, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff,
++	0x1118, 0x701f, 0x1980, 0x0040, 0x92c6, 0x0001, 0x1118, 0x701f,
++	0x199a, 0x0010, 0x0804, 0x3092, 0x2009, 0x001a, 0x7a8c, 0x7b88,
++	0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4468,
++	0x701b, 0x4c33, 0x0005, 0x2001, 0x182c, 0x2003, 0x0001, 0xa85c,
++	0x9080, 0x0019, 0x2098, 0xa860, 0x20e0, 0x20a9, 0x001a, 0x701c,
++	0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804, 0x305f, 0x080c, 0x441f,
++	0x1120, 0x2009, 0x0002, 0x0804, 0x308f, 0x7984, 0x9194, 0xff00,
++	0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, 0x2099, 0x1980, 0x0040,
++	0x92c6, 0x0001, 0x1118, 0x2099, 0x199a, 0x0010, 0x0804, 0x3092,
++	0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8, 0x20a9, 0x001a,
++	0x20e1, 0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c,
++	0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x0804, 0x446b, 0x7884,
++	0x908a, 0x1000, 0x1a04, 0x3092, 0x0126, 0x2091, 0x8000, 0x8003,
++	0x800b, 0x810b, 0x9108, 0x00c6, 0x2061, 0x19c7, 0x6146, 0x00ce,
++	0x012e, 0x0804, 0x305f, 0x00c6, 0x080c, 0x6877, 0x1160, 0x080c,
++	0x6b40, 0x080c, 0x56d9, 0x9085, 0x0001, 0x080c, 0x68c0, 0x080c,
++	0x67be, 0x080c, 0x0d84, 0x2061, 0x1800, 0x6030, 0xc09d, 0x6032,
++	0x080c, 0x55a0, 0x00ce, 0x0005, 0x00c6, 0x2001, 0x1800, 0x2004,
++	0x908e, 0x0000, 0x0904, 0x308f, 0x7884, 0x9005, 0x0188, 0x7888,
++	0x2061, 0x1969, 0x2c0c, 0x2062, 0x080c, 0x27d7, 0x01a0, 0x080c,
++	0x27df, 0x0188, 0x080c, 0x27e7, 0x0170, 0x2162, 0x0804, 0x3092,
++	0x2061, 0x0100, 0x6038, 0x9086, 0x0007, 0x1118, 0x2009, 0x0001,
++	0x0010, 0x2009, 0x0000, 0x7884, 0x9086, 0x0002, 0x1548, 0x2061,
++	0x0100, 0x6028, 0xc09c, 0x602a, 0x0026, 0x2011, 0x0003, 0x080c,
++	0x8e99, 0x2011, 0x0002, 0x080c, 0x8ea3, 0x002e, 0x080c, 0x8d59,
++	0x0036, 0x901e, 0x080c, 0x8dfe, 0x003e, 0x60e3, 0x0000, 0x080c,
++	0xcd0a, 0x080c, 0xcd25, 0x9085, 0x0001, 0x080c, 0x68c0, 0x9006,
++	0x080c, 0x28a5, 0x2001, 0x1800, 0x2003, 0x0004, 0x6027, 0x0008,
++	0x00ce, 0x0804, 0x305f, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804,
++	0x308f, 0x080c, 0x4dfe, 0x0120, 0x2009, 0x0007, 0x0804, 0x308f,
++	0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x5c0d, 0x1904, 0x3092,
++	0x9186, 0x007f, 0x0138, 0x080c, 0x5f2d, 0x0120, 0x2009, 0x0009,
++	0x0804, 0x308f, 0x080c, 0x441f, 0x1120, 0x2009, 0x0002, 0x0804,
++	0x308f, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xb275,
++	0x1120, 0x2009, 0x0003, 0x0804, 0x308f, 0x7007, 0x0003, 0x701b,
++	0x4d32, 0x0005, 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004,
++	0x0804, 0x308f, 0xa8e0, 0xa866, 0xa834, 0x8007, 0x800c, 0xa85c,
++	0x9080, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xaf60, 0x0804,
++	0x446b, 0xa898, 0x9086, 0x000d, 0x1904, 0x308f, 0x2021, 0x4005,
++	0x0126, 0x2091, 0x8000, 0x0e04, 0x4d56, 0x0010, 0x012e, 0x0cc0,
++	0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833,
++	0x0010, 0x7883, 0x4005, 0xa998, 0x7986, 0xa9a4, 0x799a, 0xa9a8,
++	0x799e, 0x080c, 0x445b, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
++	0xd084, 0x190c, 0x113e, 0x7007, 0x0001, 0x2091, 0x5000, 0x012e,
++	0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061, 0x19c7, 0x7984,
++	0x6156, 0x6152, 0x605b, 0x0000, 0x604f, 0x0009, 0x7898, 0x606e,
++	0x789c, 0x606a, 0x7888, 0x6066, 0x788c, 0x6062, 0x2001, 0x19d5,
++	0x2044, 0x2001, 0x19dd, 0xa076, 0xa060, 0xa072, 0xa07b, 0x0001,
++	0xa07f, 0x0002, 0xa06b, 0x0000, 0xa09f, 0x0000, 0x00ce, 0x012e,
++	0x0804, 0x305f, 0x0126, 0x2091, 0x8000, 0x00b6, 0x00c6, 0x90e4,
++	0xc000, 0x0128, 0x0006, 0x080c, 0xb0e3, 0x000e, 0x1198, 0xd0e4,
++	0x0160, 0x9180, 0x1000, 0x2004, 0x905d, 0x0160, 0x080c, 0x56f3,
++	0x080c, 0x94d3, 0x0110, 0xb817, 0x0000, 0x9006, 0x00ce, 0x00be,
++	0x012e, 0x0005, 0x9085, 0x0001, 0x0cc8, 0x0126, 0x2091, 0x8000,
++	0x0156, 0x2010, 0x900e, 0x20a9, 0x0800, 0x0016, 0x9180, 0x1000,
++	0x2004, 0x9005, 0x0180, 0x9186, 0x007e, 0x0168, 0x9186, 0x007f,
++	0x0150, 0x9186, 0x0080, 0x0138, 0x9186, 0x00ff, 0x0120, 0x0026,
++	0x2200, 0x0801, 0x002e, 0x001e, 0x8108, 0x1f04, 0x4dcd, 0x015e,
++	0x012e, 0x0005, 0x2001, 0x1853, 0x2004, 0x0005, 0x2001, 0x1872,
++	0x2004, 0x0005, 0x0006, 0x2001, 0x180f, 0x2004, 0xd0d4, 0x000e,
++	0x0005, 0x2001, 0x180d, 0x2004, 0xd0b4, 0x0005, 0x2001, 0x1800,
++	0x2004, 0x9086, 0x0003, 0x0005, 0x0126, 0x0156, 0x0136, 0x0146,
++	0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2061, 0x0100,
++	0x2069, 0x0200, 0x2071, 0x1800, 0x6044, 0xd0a4, 0x11e8, 0xd084,
++	0x0118, 0x080c, 0x4fa3, 0x0068, 0xd08c, 0x0118, 0x080c, 0x4eb6,
++	0x0040, 0xd094, 0x0118, 0x080c, 0x4e86, 0x0018, 0xd09c, 0x0108,
++	0x0099, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e,
++	0x013e, 0x015e, 0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110,
++	0xc19d, 0x612a, 0x001e, 0x0c68, 0x0006, 0x7090, 0x9005, 0x000e,
++	0x0120, 0x7093, 0x0000, 0x708b, 0x0000, 0x624c, 0x9286, 0xf0f0,
++	0x1150, 0x6048, 0x9086, 0xf0f0, 0x0130, 0x624a, 0x6043, 0x0090,
++	0x6043, 0x0010, 0x0490, 0x9294, 0xff00, 0x9296, 0xf700, 0x0178,
++	0x7134, 0xd1a4, 0x1160, 0x6240, 0x9295, 0x0100, 0x6242, 0x9294,
++	0x0010, 0x0128, 0x2009, 0x00f7, 0x080c, 0x5660, 0x00f0, 0x6040,
++	0x9084, 0x0010, 0x9085, 0x0140, 0x6042, 0x6043, 0x0000, 0x707f,
++	0x0000, 0x709b, 0x0001, 0x70c3, 0x0000, 0x70db, 0x0000, 0x2009,
++	0x1c80, 0x200b, 0x0000, 0x708f, 0x0000, 0x7083, 0x000f, 0x2009,
++	0x000f, 0x2011, 0x5546, 0x080c, 0x78a5, 0x0005, 0x2001, 0x1874,
++	0x2004, 0xd08c, 0x0110, 0x7057, 0xffff, 0x7080, 0x9005, 0x1528,
++	0x2011, 0x5546, 0x080c, 0x781a, 0x6040, 0x9094, 0x0010, 0x9285,
++	0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04,
++	0x4e9c, 0x6242, 0x7093, 0x0000, 0x6040, 0x9094, 0x0010, 0x9285,
++	0x0080, 0x6042, 0x6242, 0x0048, 0x6242, 0x7093, 0x0000, 0x7087,
++	0x0000, 0x9006, 0x080c, 0x56de, 0x0000, 0x0005, 0x7084, 0x908a,
++	0x0003, 0x1a0c, 0x0d84, 0x000b, 0x0005, 0x4ec0, 0x4f07, 0x4fa2,
++	0x00f6, 0x7087, 0x0001, 0x6803, 0x00fc, 0x20a9, 0x0004, 0x6800,
++	0x9084, 0x00fc, 0x0120, 0x1f04, 0x4ec7, 0x080c, 0x0d84, 0x68a0,
++	0x68a2, 0x689c, 0x689e, 0x6898, 0x689a, 0xa001, 0x6803, 0x1600,
++	0x6837, 0x0020, 0x080c, 0x56ba, 0x2079, 0x1c00, 0x7833, 0x1101,
++	0x7837, 0x0000, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0001,
++	0x20a1, 0x1c0e, 0x20a9, 0x0004, 0x4003, 0x080c, 0x9363, 0x20e1,
++	0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9,
++	0x0014, 0x4003, 0x60c3, 0x000c, 0x600f, 0x0000, 0x080c, 0x557c,
++	0x00fe, 0x9006, 0x708a, 0x6043, 0x0008, 0x6042, 0x0005, 0x00f6,
++	0x7088, 0x708b, 0x0000, 0x9025, 0x0904, 0x4f7f, 0x6020, 0xd0b4,
++	0x1904, 0x4f7d, 0x7198, 0x81ff, 0x0904, 0x4f6b, 0x9486, 0x000c,
++	0x1904, 0x4f78, 0x9480, 0x0018, 0x8004, 0x20a8, 0x080c, 0x56b3,
++	0x2011, 0x0260, 0x2019, 0x1c00, 0x220c, 0x2304, 0x9106, 0x11e8,
++	0x8210, 0x8318, 0x1f04, 0x4f24, 0x6043, 0x0004, 0x2061, 0x0140,
++	0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0006,
++	0x7087, 0x0002, 0x7093, 0x0002, 0x2009, 0x07d0, 0x2011, 0x554d,
++	0x080c, 0x78a5, 0x080c, 0x56ba, 0x04c0, 0x080c, 0x56b3, 0x2079,
++	0x0260, 0x7930, 0x918e, 0x1101, 0x1558, 0x7834, 0x9005, 0x1540,
++	0x7900, 0x918c, 0x00ff, 0x1118, 0x7804, 0x9005, 0x0190, 0x080c,
++	0x56b3, 0x2011, 0x026e, 0x2019, 0x1805, 0x20a9, 0x0004, 0x220c,
++	0x2304, 0x9102, 0x0230, 0x11a0, 0x8210, 0x8318, 0x1f04, 0x4f5f,
++	0x0078, 0x709b, 0x0000, 0x080c, 0x56b3, 0x20e1, 0x0000, 0x2099,
++	0x0260, 0x20e9, 0x0001, 0x20a1, 0x1c00, 0x20a9, 0x0014, 0x4003,
++	0x6043, 0x0008, 0x6043, 0x0000, 0x0010, 0x00fe, 0x0005, 0x6040,
++	0x9085, 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8, 0x080c, 0x9363,
++	0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240,
++	0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x2011, 0x19be, 0x2013,
++	0x0000, 0x708b, 0x0000, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c,
++	0x8b47, 0x08d8, 0x0005, 0x7090, 0x908a, 0x001d, 0x1a0c, 0x0d84,
++	0x000b, 0x0005, 0x4fd4, 0x4fe7, 0x5010, 0x5030, 0x5056, 0x5085,
++	0x50ab, 0x50e3, 0x5109, 0x5137, 0x5172, 0x51aa, 0x51c8, 0x51f3,
++	0x5215, 0x5230, 0x523a, 0x526e, 0x5294, 0x52c3, 0x52e9, 0x5321,
++	0x5365, 0x53a2, 0x53c3, 0x541c, 0x543e, 0x546c, 0x546c, 0x00c6,
++	0x2061, 0x1800, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0x9084,
++	0xfff9, 0x6006, 0x00ce, 0x0005, 0x2061, 0x0140, 0x605b, 0xbc94,
++	0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0002, 0x7093, 0x0001,
++	0x2009, 0x07d0, 0x2011, 0x554d, 0x080c, 0x78a5, 0x0005, 0x00f6,
++	0x7088, 0x9086, 0x0014, 0x1510, 0x6042, 0x6020, 0xd0b4, 0x11f0,
++	0x080c, 0x56b3, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x11a0,
++	0x7834, 0x9005, 0x1188, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005,
++	0x1110, 0x70c3, 0x0001, 0x2011, 0x554d, 0x080c, 0x781a, 0x7093,
++	0x0010, 0x080c, 0x523a, 0x0010, 0x708b, 0x0000, 0x00fe, 0x0005,
++	0x00f6, 0x7093, 0x0003, 0x6043, 0x0004, 0x2011, 0x554d, 0x080c,
++	0x781a, 0x080c, 0x5642, 0x2079, 0x0240, 0x7833, 0x1102, 0x7837,
++	0x0000, 0x20a9, 0x0008, 0x9f88, 0x000e, 0x200b, 0x0000, 0x8108,
++	0x1f04, 0x5025, 0x60c3, 0x0014, 0x080c, 0x557c, 0x00fe, 0x0005,
++	0x00f6, 0x7088, 0x9005, 0x0500, 0x2011, 0x554d, 0x080c, 0x781a,
++	0x9086, 0x0014, 0x11b8, 0x080c, 0x56b3, 0x2079, 0x0260, 0x7a30,
++	0x9296, 0x1102, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc,
++	0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7093, 0x0004,
++	0x0029, 0x0010, 0x080c, 0x568f, 0x00fe, 0x0005, 0x00f6, 0x7093,
++	0x0005, 0x080c, 0x5642, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837,
++	0x0000, 0x080c, 0x56b3, 0x080c, 0x5696, 0x1170, 0x707c, 0x9005,
++	0x1158, 0x7154, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c,
++	0x54fa, 0x0168, 0x080c, 0x5677, 0x20a9, 0x0008, 0x20e1, 0x0000,
++	0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3,
++	0x0014, 0x080c, 0x557c, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005,
++	0x0500, 0x2011, 0x554d, 0x080c, 0x781a, 0x9086, 0x0014, 0x11b8,
++	0x080c, 0x56b3, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178,
++	0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005,
++	0x1110, 0x70c3, 0x0001, 0x7093, 0x0006, 0x0029, 0x0010, 0x080c,
++	0x568f, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x0007, 0x080c, 0x5642,
++	0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x56b3,
++	0x080c, 0x5696, 0x11b8, 0x707c, 0x9005, 0x11a0, 0x715c, 0x9186,
++	0xffff, 0x0180, 0x9180, 0x2e6e, 0x200d, 0x918c, 0xff00, 0x810f,
++	0x2011, 0x0008, 0x080c, 0x54fa, 0x0180, 0x080c, 0x4700, 0x0110,
++	0x080c, 0x2466, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e,
++	0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c,
++	0x557c, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x0500, 0x2011,
++	0x554d, 0x080c, 0x781a, 0x9086, 0x0014, 0x11b8, 0x080c, 0x56b3,
++	0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, 0x9005,
++	0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3,
++	0x0001, 0x7093, 0x0008, 0x0029, 0x0010, 0x080c, 0x568f, 0x00fe,
++	0x0005, 0x00f6, 0x7093, 0x0009, 0x080c, 0x5642, 0x2079, 0x0240,
++	0x7833, 0x1105, 0x7837, 0x0100, 0x080c, 0x5696, 0x1150, 0x707c,
++	0x9005, 0x1138, 0x080c, 0x546d, 0x1188, 0x9085, 0x0001, 0x080c,
++	0x2466, 0x20a9, 0x0008, 0x080c, 0x56b3, 0x20e1, 0x0000, 0x2099,
++	0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014,
++	0x080c, 0x557c, 0x0010, 0x080c, 0x4fc7, 0x00fe, 0x0005, 0x00f6,
++	0x7088, 0x9005, 0x05a8, 0x2011, 0x554d, 0x080c, 0x781a, 0x9086,
++	0x0014, 0x1560, 0x080c, 0x56b3, 0x2079, 0x0260, 0x7a30, 0x9296,
++	0x1105, 0x1520, 0x7834, 0x9084, 0x0100, 0x2011, 0x0100, 0x921e,
++	0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3,
++	0x0001, 0x7093, 0x000a, 0x00b1, 0x0098, 0x9005, 0x1178, 0x7a38,
++	0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x708f,
++	0x0000, 0x7093, 0x000e, 0x080c, 0x5215, 0x0010, 0x080c, 0x568f,
++	0x00fe, 0x0005, 0x00f6, 0x7093, 0x000b, 0x2011, 0x1c0e, 0x20e9,
++	0x0001, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, 0x4304, 0x080c,
++	0x5642, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c,
++	0x5696, 0x0118, 0x2013, 0x0000, 0x0020, 0x7058, 0x9085, 0x0100,
++	0x2012, 0x20a9, 0x0040, 0x2009, 0x024e, 0x2011, 0x1c0e, 0x220e,
++	0x8210, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000, 0x6812,
++	0x2009, 0x0240, 0x1f04, 0x5197, 0x60c3, 0x0084, 0x080c, 0x557c,
++	0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01c0, 0x2011, 0x554d,
++	0x080c, 0x781a, 0x9086, 0x0084, 0x1178, 0x080c, 0x56b3, 0x2079,
++	0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, 0x7834, 0x9005, 0x1120,
++	0x7093, 0x000c, 0x0029, 0x0010, 0x080c, 0x568f, 0x00fe, 0x0005,
++	0x00f6, 0x7093, 0x000d, 0x080c, 0x5642, 0x2079, 0x0240, 0x7833,
++	0x1107, 0x7837, 0x0000, 0x080c, 0x56b3, 0x20a9, 0x0040, 0x2011,
++	0x026e, 0x2009, 0x024e, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260,
++	0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x6814, 0x8000,
++	0x6816, 0x2011, 0x0260, 0x1f04, 0x51db, 0x60c3, 0x0084, 0x080c,
++	0x557c, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01e0, 0x2011,
++	0x554d, 0x080c, 0x781a, 0x9086, 0x0084, 0x1198, 0x080c, 0x56b3,
++	0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005,
++	0x1140, 0x708f, 0x0001, 0x080c, 0x5614, 0x7093, 0x000e, 0x0029,
++	0x0010, 0x080c, 0x568f, 0x00fe, 0x0005, 0x918d, 0x0001, 0x080c,
++	0x56de, 0x7093, 0x000f, 0x708b, 0x0000, 0x2061, 0x0140, 0x605b,
++	0xbc85, 0x605f, 0xb5b5, 0x2061, 0x0100, 0x6043, 0x0005, 0x6043,
++	0x0004, 0x2009, 0x07d0, 0x2011, 0x554d, 0x080c, 0x780e, 0x0005,
++	0x7088, 0x9005, 0x0130, 0x2011, 0x554d, 0x080c, 0x781a, 0x7093,
++	0x0000, 0x0005, 0x7093, 0x0011, 0x080c, 0x9363, 0x080c, 0x56b3,
++	0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240,
++	0x7488, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004,
++	0x20a8, 0x4003, 0x080c, 0x5696, 0x11a0, 0x7174, 0x81ff, 0x0188,
++	0x900e, 0x7078, 0x9084, 0x00ff, 0x0160, 0x080c, 0x23fd, 0x9186,
++	0x007e, 0x0138, 0x9186, 0x0080, 0x0120, 0x2011, 0x0008, 0x080c,
++	0x54fa, 0x60c3, 0x0014, 0x080c, 0x557c, 0x0005, 0x00f6, 0x7088,
++	0x9005, 0x0500, 0x2011, 0x554d, 0x080c, 0x781a, 0x9086, 0x0014,
++	0x11b8, 0x080c, 0x56b3, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103,
++	0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0,
++	0x9005, 0x1110, 0x70c3, 0x0001, 0x7093, 0x0012, 0x0029, 0x0010,
++	0x708b, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x0013, 0x080c,
++	0x5650, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c,
++	0x56b3, 0x080c, 0x5696, 0x1170, 0x707c, 0x9005, 0x1158, 0x7154,
++	0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x54fa, 0x0168,
++	0x080c, 0x5677, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e,
++	0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c,
++	0x557c, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x0500, 0x2011,
++	0x554d, 0x080c, 0x781a, 0x9086, 0x0014, 0x11b8, 0x080c, 0x56b3,
++	0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, 0x9005,
++	0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3,
++	0x0001, 0x7093, 0x0014, 0x0029, 0x0010, 0x708b, 0x0000, 0x00fe,
++	0x0005, 0x00f6, 0x7093, 0x0015, 0x080c, 0x5650, 0x2079, 0x0240,
++	0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x56b3, 0x080c, 0x5696,
++	0x11b8, 0x707c, 0x9005, 0x11a0, 0x715c, 0x9186, 0xffff, 0x0180,
++	0x9180, 0x2e6e, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008,
++	0x080c, 0x54fa, 0x0180, 0x080c, 0x4700, 0x0110, 0x080c, 0x2466,
++	0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000,
++	0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x557c, 0x00fe,
++	0x0005, 0x00f6, 0x7088, 0x9005, 0x05f0, 0x2011, 0x554d, 0x080c,
++	0x781a, 0x9086, 0x0014, 0x15a8, 0x080c, 0x56b3, 0x2079, 0x0260,
++	0x7a30, 0x9296, 0x1105, 0x1568, 0x7834, 0x9084, 0x0100, 0x2011,
++	0x0100, 0x921e, 0x1168, 0x9085, 0x0001, 0x080c, 0x56de, 0x7a38,
++	0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x0080,
++	0x9005, 0x11b8, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110,
++	0x70c3, 0x0001, 0x9085, 0x0001, 0x080c, 0x56de, 0x708f, 0x0000,
++	0x7a38, 0xd2f4, 0x0110, 0x70db, 0x0008, 0x7093, 0x0016, 0x0029,
++	0x0010, 0x708b, 0x0000, 0x00fe, 0x0005, 0x080c, 0x9363, 0x080c,
++	0x56b3, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1,
++	0x0240, 0x20a9, 0x000e, 0x4003, 0x2011, 0x026d, 0x2204, 0x9084,
++	0x0100, 0x2011, 0x024d, 0x2012, 0x2011, 0x026e, 0x7093, 0x0017,
++	0x080c, 0x5696, 0x1150, 0x707c, 0x9005, 0x1138, 0x080c, 0x546d,
++	0x1188, 0x9085, 0x0001, 0x080c, 0x2466, 0x20a9, 0x0008, 0x080c,
++	0x56b3, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1,
++	0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x557c, 0x0010, 0x080c,
++	0x4fc7, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01d8, 0x2011, 0x554d,
++	0x080c, 0x781a, 0x9086, 0x0084, 0x1190, 0x080c, 0x56b3, 0x2079,
++	0x0260, 0x7a30, 0x9296, 0x1106, 0x1150, 0x7834, 0x9005, 0x1138,
++	0x9006, 0x080c, 0x56de, 0x7093, 0x0018, 0x0029, 0x0010, 0x708b,
++	0x0000, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x0019, 0x080c, 0x5650,
++	0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x56b3,
++	0x2009, 0x026e, 0x2039, 0x1c0e, 0x20a9, 0x0040, 0x213e, 0x8738,
++	0x8108, 0x9186, 0x0280, 0x1128, 0x6814, 0x8000, 0x6816, 0x2009,
++	0x0260, 0x1f04, 0x53d6, 0x2039, 0x1c0e, 0x080c, 0x5696, 0x11e8,
++	0x2728, 0x2514, 0x8207, 0x9084, 0x00ff, 0x8000, 0x2018, 0x9294,
++	0x00ff, 0x8007, 0x9205, 0x202a, 0x7058, 0x2310, 0x8214, 0x92a0,
++	0x1c0e, 0x2414, 0x938c, 0x0001, 0x0118, 0x9294, 0xff00, 0x0018,
++	0x9294, 0x00ff, 0x8007, 0x9215, 0x2222, 0x20a9, 0x0040, 0x2009,
++	0x024e, 0x270e, 0x8738, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810,
++	0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, 0x5409, 0x60c3, 0x0084,
++	0x080c, 0x557c, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01e0,
++	0x2011, 0x554d, 0x080c, 0x781a, 0x9086, 0x0084, 0x1198, 0x080c,
++	0x56b3, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834,
++	0x9005, 0x1140, 0x708f, 0x0001, 0x080c, 0x5614, 0x7093, 0x001a,
++	0x0029, 0x0010, 0x708b, 0x0000, 0x00fe, 0x0005, 0x9085, 0x0001,
++	0x080c, 0x56de, 0x7093, 0x001b, 0x080c, 0x9363, 0x080c, 0x56b3,
++	0x2011, 0x0260, 0x2009, 0x0240, 0x7488, 0x9480, 0x0018, 0x9080,
++	0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x220e, 0x8210, 0x8108,
++	0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240,
++	0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, 0x5455, 0x60c3,
++	0x0084, 0x080c, 0x557c, 0x0005, 0x0005, 0x0086, 0x0096, 0x2029,
++	0x1853, 0x252c, 0x20a9, 0x0008, 0x2041, 0x1c0e, 0x20e9, 0x0001,
++	0x28a0, 0x080c, 0x56b3, 0x20e1, 0x0000, 0x2099, 0x026e, 0x4003,
++	0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0108, 0x9016, 0x2800,
++	0x9200, 0x200c, 0x91a6, 0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210,
++	0x0008, 0x8211, 0x1f04, 0x5487, 0x0804, 0x54f6, 0x82ff, 0x1160,
++	0xd5d4, 0x0120, 0x91a6, 0x3fff, 0x0d90, 0x0020, 0x91a6, 0x3fff,
++	0x0904, 0x54f6, 0x918d, 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001,
++	0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423,
++	0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318,
++	0x1f04, 0x54ad, 0x04d8, 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425,
++	0x1f04, 0x54bf, 0x2328, 0x8529, 0x92be, 0x0007, 0x0158, 0x0006,
++	0x2039, 0x0007, 0x2200, 0x973a, 0x000e, 0x27a8, 0x95a8, 0x0010,
++	0x1f04, 0x54ce, 0x7556, 0x95c8, 0x2e6e, 0x292d, 0x95ac, 0x00ff,
++	0x757a, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x2446, 0x001e,
++	0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304, 0x9405, 0x201a, 0x707f,
++	0x0001, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x20e1, 0x0001, 0x2898,
++	0x20a9, 0x0008, 0x4003, 0x9085, 0x0001, 0x0008, 0x9006, 0x009e,
++	0x008e, 0x0005, 0x0156, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x22a8,
++	0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x2011, 0x024e,
++	0x22a0, 0x4003, 0x014e, 0x013e, 0x01de, 0x01ce, 0x015e, 0x2118,
++	0x9026, 0x2001, 0x0007, 0x939a, 0x0010, 0x0218, 0x8420, 0x8001,
++	0x0cd0, 0x2118, 0x84ff, 0x0120, 0x939a, 0x0010, 0x8421, 0x1de0,
++	0x2021, 0x0001, 0x83ff, 0x0118, 0x8423, 0x8319, 0x1de8, 0x9238,
++	0x2029, 0x026e, 0x9528, 0x2504, 0x942c, 0x11b8, 0x9405, 0x203a,
++	0x7156, 0x91a0, 0x2e6e, 0x242d, 0x95ac, 0x00ff, 0x757a, 0x6532,
++	0x6536, 0x0016, 0x2508, 0x080c, 0x2446, 0x001e, 0x60e7, 0x0000,
++	0x65ea, 0x707f, 0x0001, 0x9084, 0x0000, 0x0005, 0x00e6, 0x2071,
++	0x1800, 0x7083, 0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6, 0x2079,
++	0x0100, 0x2071, 0x0140, 0x080c, 0x5603, 0x080c, 0x8b50, 0x7004,
++	0x9084, 0x4000, 0x0138, 0x2001, 0x1000, 0x080c, 0x28a5, 0x9006,
++	0x080c, 0x28a5, 0x0126, 0x2091, 0x8000, 0x2071, 0x1824, 0x2073,
++	0x0000, 0x7840, 0x0026, 0x0016, 0x2009, 0x00f7, 0x080c, 0x5660,
++	0x001e, 0x9094, 0x0010, 0x9285, 0x0080, 0x7842, 0x7a42, 0x002e,
++	0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x2011,
++	0x19be, 0x2013, 0x0000, 0x708b, 0x0000, 0x012e, 0x60a3, 0x0056,
++	0x60a7, 0x9575, 0x080c, 0x8b47, 0x6144, 0xd184, 0x0120, 0x7190,
++	0x918d, 0x2000, 0x0018, 0x7184, 0x918d, 0x1000, 0x2011, 0x1966,
++	0x2112, 0x2009, 0x07d0, 0x2011, 0x554d, 0x080c, 0x78a5, 0x0005,
++	0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x94da,
++	0x2009, 0x00f7, 0x080c, 0x5660, 0x2061, 0x19c7, 0x900e, 0x611a,
++	0x611e, 0x2061, 0x1800, 0x6003, 0x0001, 0x2061, 0x0100, 0x6043,
++	0x0090, 0x6043, 0x0010, 0x2009, 0x1966, 0x200b, 0x0000, 0x2009,
++	0x002d, 0x2011, 0x55ca, 0x080c, 0x780e, 0x012e, 0x00ce, 0x002e,
++	0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x0499,
++	0x2071, 0x0100, 0x080c, 0x8b50, 0x2071, 0x0140, 0x7004, 0x9084,
++	0x4000, 0x0138, 0x2001, 0x1000, 0x080c, 0x28a5, 0x9006, 0x080c,
++	0x28a5, 0x080c, 0x687f, 0x0188, 0x080c, 0x689a, 0x1170, 0x080c,
++	0x6b4a, 0x0016, 0x080c, 0x2515, 0x2001, 0x193c, 0x2102, 0x001e,
++	0x080c, 0x6b45, 0x080c, 0x67be, 0x0050, 0x2009, 0x0001, 0x080c,
++	0x27f5, 0x2001, 0x0001, 0x080c, 0x23a6, 0x080c, 0x55a0, 0x012e,
++	0x000e, 0x00ee, 0x0005, 0x2001, 0x180d, 0x2004, 0xd0bc, 0x0158,
++	0x0026, 0x0036, 0x2011, 0x8017, 0x2001, 0x1966, 0x201c, 0x080c,
++	0x447f, 0x003e, 0x002e, 0x0005, 0x20a9, 0x0012, 0x20e9, 0x0001,
++	0x20a1, 0x1c80, 0x080c, 0x56b3, 0x20e9, 0x0000, 0x2099, 0x026e,
++	0x0099, 0x20a9, 0x0020, 0x080c, 0x56ad, 0x2099, 0x0260, 0x20a1,
++	0x1c92, 0x0051, 0x20a9, 0x000e, 0x080c, 0x56b0, 0x2099, 0x0260,
++	0x20a1, 0x1cb2, 0x0009, 0x0005, 0x0016, 0x0026, 0x3410, 0x3308,
++	0x2104, 0x8007, 0x2012, 0x8108, 0x8210, 0x1f04, 0x5638, 0x002e,
++	0x001e, 0x0005, 0x080c, 0x9363, 0x20e1, 0x0001, 0x2099, 0x1c00,
++	0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005,
++	0x080c, 0x9363, 0x080c, 0x56b3, 0x20e1, 0x0000, 0x2099, 0x0260,
++	0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005,
++	0x00c6, 0x0006, 0x2061, 0x0100, 0x810f, 0x2001, 0x1833, 0x2004,
++	0x9005, 0x1138, 0x2001, 0x1816, 0x2004, 0x9084, 0x00ff, 0x9105,
++	0x0010, 0x9185, 0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016,
++	0x0046, 0x080c, 0x5f29, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a,
++	0x080c, 0xc9c5, 0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019,
++	0x002a, 0x900e, 0x080c, 0x2ce5, 0x004e, 0x001e, 0x0005, 0x080c,
++	0x55a0, 0x7093, 0x0000, 0x708b, 0x0000, 0x0005, 0x0006, 0x2001,
++	0x180c, 0x2004, 0xd09c, 0x0100, 0x000e, 0x0005, 0x0006, 0x0016,
++	0x0126, 0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0x918d, 0x0006,
++	0x2102, 0x012e, 0x001e, 0x000e, 0x0005, 0x2009, 0x0001, 0x0020,
++	0x2009, 0x0002, 0x0008, 0x900e, 0x6814, 0x9084, 0xffc0, 0x910d,
++	0x6916, 0x0005, 0x00f6, 0x0156, 0x0146, 0x01d6, 0x9006, 0x20a9,
++	0x0080, 0x20e9, 0x0001, 0x20a1, 0x1c00, 0x4004, 0x2079, 0x1c00,
++	0x7803, 0x2200, 0x7807, 0x00ef, 0x780f, 0x00ef, 0x7813, 0x0138,
++	0x7823, 0xffff, 0x7827, 0xffff, 0x01de, 0x014e, 0x015e, 0x00fe,
++	0x0005, 0x2001, 0x1800, 0x2003, 0x0001, 0x0005, 0x2001, 0x1973,
++	0x0118, 0x2003, 0x0001, 0x0010, 0x2003, 0x0000, 0x0005, 0x0156,
++	0x20a9, 0x0800, 0x2009, 0x1000, 0x9006, 0x200a, 0x8108, 0x1f04,
++	0x56ed, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136, 0x0146,
++	0x2069, 0x1852, 0x9006, 0xb802, 0xb8be, 0xb807, 0x0707, 0xb80a,
++	0xb80e, 0xb812, 0x9198, 0x2e6e, 0x231d, 0x939c, 0x00ff, 0xbb16,
++	0x0016, 0x0026, 0xb8b2, 0x080c, 0x94d3, 0x1120, 0x9192, 0x007e,
++	0x1208, 0xbbb2, 0x20a9, 0x0004, 0xb8b4, 0x20e8, 0xb9b8, 0x9198,
++	0x0006, 0x9006, 0x23a0, 0x4004, 0x20a9, 0x0004, 0x9198, 0x000a,
++	0x23a0, 0x4004, 0x002e, 0x001e, 0xb83e, 0xb842, 0xb84e, 0xb852,
++	0xb856, 0xb85a, 0xb85e, 0xb862, 0xb866, 0xb86a, 0xb86f, 0x0100,
++	0xb872, 0xb876, 0xb87a, 0xb88a, 0xb88e, 0xb893, 0x0008, 0xb896,
++	0xb89a, 0xb89e, 0xb8ae, 0xb9a2, 0x0096, 0xb8a4, 0x904d, 0x0110,
++	0x080c, 0x0fe0, 0xb8a7, 0x0000, 0x009e, 0x9006, 0xb84a, 0x6810,
++	0xb83a, 0x680c, 0xb846, 0x6814, 0x9084, 0x00ff, 0xb842, 0x014e,
++	0x013e, 0x015e, 0x003e, 0x00de, 0x0005, 0x0126, 0x2091, 0x8000,
++	0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x57c2,
++	0x9182, 0x0800, 0x1a04, 0x57c6, 0x2001, 0x180c, 0x2004, 0x9084,
++	0x0003, 0x1904, 0x57cc, 0x9188, 0x1000, 0x2104, 0x905d, 0x0518,
++	0xb804, 0x9084, 0x00ff, 0x908e, 0x0006, 0x1508, 0xb8a4, 0x900d,
++	0x1904, 0x57de, 0xb850, 0x900d, 0x1148, 0xa802, 0x2900, 0xb852,
++	0xb84e, 0x080c, 0x7be8, 0x9006, 0x012e, 0x0005, 0x00a6, 0x2150,
++	0x2900, 0xb002, 0xa803, 0x0000, 0x00ae, 0xb852, 0x0c90, 0x2001,
++	0x0005, 0x900e, 0x04b0, 0x2001, 0x0028, 0x900e, 0x0490, 0x9082,
++	0x0006, 0x1288, 0x080c, 0x94d3, 0x1158, 0xb8a0, 0xd0bc, 0x1140,
++	0xb900, 0xd1fc, 0x0998, 0x2001, 0x0029, 0x2009, 0x1000, 0x0408,
++	0x2001, 0x0028, 0x00a8, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118,
++	0x2001, 0x0004, 0x0068, 0xd184, 0x0118, 0x2001, 0x0004, 0x0040,
++	0x2001, 0x0029, 0xb900, 0xd1fc, 0x0118, 0x2009, 0x1000, 0x0048,
++	0x900e, 0x0038, 0x2001, 0x0029, 0x900e, 0x0018, 0x2001, 0x0029,
++	0x900e, 0x9005, 0x012e, 0x0005, 0x2001, 0x180c, 0x2004, 0xd084,
++	0x19d0, 0x9188, 0x1000, 0x2104, 0x905d, 0x09a8, 0x080c, 0x5f2d,
++	0x1990, 0xb800, 0xd0c4, 0x0978, 0x0804, 0x5776, 0x080c, 0x5da9,
++	0x0904, 0x578f, 0x0804, 0x577a, 0x00b6, 0x00e6, 0x0126, 0x2091,
++	0x8000, 0xa974, 0x9182, 0x0800, 0x1a04, 0x583f, 0x9188, 0x1000,
++	0x2104, 0x905d, 0x0528, 0xb8a0, 0x9086, 0x007f, 0x0130, 0x080c,
++	0x5f35, 0x0118, 0x080c, 0x5f2d, 0x11f0, 0xa87c, 0xd0fc, 0x0138,
++	0xa894, 0x9005, 0x0120, 0x2060, 0x2900, 0x6016, 0x0058, 0x080c,
++	0x94fe, 0x05e0, 0x2b00, 0x6012, 0x2900, 0x6016, 0x600b, 0xffff,
++	0x6023, 0x000a, 0x2009, 0x0003, 0x080c, 0x95ce, 0x9006, 0x0450,
++	0x2001, 0x0028, 0x0430, 0x9082, 0x0006, 0x1288, 0x080c, 0x94d3,
++	0x1158, 0xb8a0, 0xd0bc, 0x1140, 0xb900, 0xd1fc, 0x09b0, 0x2001,
++	0x0029, 0x2009, 0x1000, 0x00a8, 0x2001, 0x0028, 0x0090, 0x2009,
++	0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0050, 0xd184,
++	0x0118, 0x2001, 0x0004, 0x0028, 0x2001, 0x0029, 0x0010, 0x2001,
++	0x0029, 0x9005, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2001, 0x002c,
++	0x0cc0, 0x00f6, 0x00b6, 0x0126, 0x2091, 0x8000, 0xa8e0, 0x9005,
++	0x1550, 0xa8dc, 0x9082, 0x0101, 0x1630, 0xa8c8, 0x9005, 0x1518,
++	0xa8c4, 0x9082, 0x0101, 0x12f8, 0xa974, 0x2079, 0x1800, 0x9182,
++	0x0800, 0x12e8, 0x7830, 0x9084, 0x0003, 0x1130, 0xaa98, 0xab94,
++	0xa878, 0x9084, 0x0007, 0x00ea, 0x7930, 0xd18c, 0x0118, 0x2001,
++	0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001,
++	0x0029, 0x900e, 0x0038, 0x2001, 0x002c, 0x900e, 0x0018, 0x2001,
++	0x0029, 0x900e, 0x9006, 0x0008, 0x9005, 0x012e, 0x00be, 0x00fe,
++	0x0005, 0x58d5, 0x5891, 0x58a7, 0x58d5, 0x58d5, 0x58d5, 0x58d5,
++	0x58d5, 0x2100, 0x9082, 0x007e, 0x1270, 0x080c, 0x5bb0, 0x0140,
++	0xb810, 0x9306, 0x1904, 0x58dd, 0xb814, 0x9206, 0x15f0, 0x0028,
++	0xbb12, 0xba16, 0x0010, 0x080c, 0x435a, 0x0150, 0x04b0, 0x080c,
++	0x5c0d, 0x1598, 0xb810, 0x9306, 0x1580, 0xb814, 0x9206, 0x1568,
++	0x080c, 0x94fe, 0x0530, 0x2b00, 0x6012, 0x080c, 0xb4e6, 0x2900,
++	0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0xa878, 0x9086, 0x0001,
++	0x1170, 0x080c, 0x2d1a, 0x9006, 0x080c, 0x5b4d, 0x2001, 0x0002,
++	0x080c, 0x5b61, 0x2001, 0x0200, 0xb86e, 0xb893, 0x0002, 0x2009,
++	0x0003, 0x080c, 0x95ce, 0x9006, 0x0068, 0x2001, 0x0001, 0x900e,
++	0x0038, 0x2001, 0x002c, 0x900e, 0x0018, 0x2001, 0x0028, 0x900e,
++	0x9005, 0x0000, 0x012e, 0x00be, 0x00fe, 0x0005, 0x00b6, 0x00f6,
++	0x00e6, 0x0126, 0x2091, 0x8000, 0xa894, 0x90c6, 0x0015, 0x0904,
++	0x5aa6, 0x90c6, 0x0056, 0x0904, 0x5aaa, 0x90c6, 0x0066, 0x0904,
++	0x5aae, 0x90c6, 0x0071, 0x0904, 0x5ab2, 0x90c6, 0x0074, 0x0904,
++	0x5ab6, 0x90c6, 0x007c, 0x0904, 0x5aba, 0x90c6, 0x007e, 0x0904,
++	0x5abe, 0x90c6, 0x0037, 0x0904, 0x5ac2, 0x9016, 0x2079, 0x1800,
++	0xa974, 0x9186, 0x00ff, 0x0904, 0x5aa1, 0x9182, 0x0800, 0x1a04,
++	0x5aa1, 0x080c, 0x5c0d, 0x1190, 0xb804, 0x9084, 0x00ff, 0x9082,
++	0x0006, 0x1260, 0xa894, 0x90c6, 0x006f, 0x0140, 0x080c, 0x94d3,
++	0x1904, 0x5a8a, 0xb8a0, 0xd0bc, 0x1904, 0x5a8a, 0xa894, 0x90c6,
++	0x006f, 0x0158, 0x90c6, 0x005e, 0x0904, 0x59e6, 0x90c6, 0x0064,
++	0x0904, 0x5a12, 0x2008, 0x0804, 0x59a8, 0xa998, 0xa8b0, 0x2040,
++	0x080c, 0x94d3, 0x1120, 0x9182, 0x007f, 0x0a04, 0x59a8, 0x9186,
++	0x00ff, 0x0904, 0x59a8, 0x9182, 0x0800, 0x1a04, 0x59a8, 0xaaa0,
++	0xab9c, 0x7874, 0x9306, 0x1188, 0x7878, 0x0096, 0x924e, 0x1128,
++	0x2208, 0x2310, 0x009e, 0x0804, 0x59a8, 0x99cc, 0xff00, 0x009e,
++	0x1120, 0x2208, 0x2310, 0x0804, 0x59a8, 0x080c, 0x435a, 0x0904,
++	0x59b2, 0x900e, 0x9016, 0x90c6, 0x4000, 0x1558, 0x0006, 0x080c,
++	0x5e2d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x20a9,
++	0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8b4,
++	0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0f2b, 0x20a9,
++	0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b4,
++	0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0f2b, 0x000e,
++	0x0098, 0x90c6, 0x4007, 0x1110, 0x2408, 0x0070, 0x90c6, 0x4008,
++	0x1118, 0x2708, 0x2610, 0x0040, 0x90c6, 0x4009, 0x1108, 0x0020,
++	0x2001, 0x4005, 0x2009, 0x000a, 0xa896, 0xa99a, 0xaa9e, 0x2001,
++	0x0030, 0x0470, 0x080c, 0x94fe, 0x1130, 0x2001, 0x4005, 0x2009,
++	0x0003, 0x9016, 0x0c88, 0x2b00, 0x6012, 0x080c, 0xb4e6, 0x2900,
++	0x6016, 0x6023, 0x0001, 0xa868, 0xd88c, 0x0108, 0xc0f5, 0xa86a,
++	0x0126, 0x2091, 0x8000, 0x080c, 0x2d1a, 0x012e, 0x9006, 0x080c,
++	0x5b4d, 0x2001, 0x0002, 0x080c, 0x5b61, 0x2009, 0x0002, 0x080c,
++	0x95ce, 0xa8b0, 0xd094, 0x0118, 0xb8bc, 0xc08d, 0xb8be, 0x9006,
++	0x9005, 0x012e, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x080c, 0x4dfe,
++	0x0118, 0x2009, 0x0007, 0x0410, 0xa998, 0xaeb0, 0x080c, 0x5c0d,
++	0x0120, 0x2009, 0x000a, 0x0804, 0x59a8, 0x9186, 0x007f, 0x0130,
++	0x080c, 0x5f2d, 0x0118, 0x2009, 0x0009, 0x0080, 0x0096, 0x080c,
++	0x0fae, 0x1120, 0x009e, 0x2009, 0x0002, 0x0040, 0x2900, 0x009e,
++	0xa806, 0x080c, 0xb275, 0x1998, 0x2009, 0x0003, 0x2001, 0x4005,
++	0x0804, 0x59ac, 0xa998, 0xaeb0, 0x080c, 0x5c0d, 0x0120, 0x2009,
++	0x000a, 0x0804, 0x59a8, 0x0096, 0x080c, 0x0fae, 0x1128, 0x009e,
++	0x2009, 0x0002, 0x0804, 0x5a69, 0x2900, 0x009e, 0xa806, 0x0096,
++	0x2048, 0x20a9, 0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, 0xa860,
++	0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008,
++	0x9080, 0x0006, 0x20a0, 0xbbb8, 0x9398, 0x0006, 0x2398, 0x080c,
++	0x0f2b, 0x009e, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000,
++	0xd684, 0x1168, 0x080c, 0x4dea, 0xd0b4, 0x1118, 0xa89b, 0x000b,
++	0x00e0, 0xb800, 0xd08c, 0x0118, 0xa89b, 0x000c, 0x00b0, 0x080c,
++	0x5f2d, 0x0118, 0xa89b, 0x0009, 0x0080, 0x080c, 0x4dfe, 0x0118,
++	0xa89b, 0x0007, 0x0050, 0x080c, 0xb258, 0x1904, 0x59df, 0x2009,
++	0x0003, 0x2001, 0x4005, 0x0804, 0x59ac, 0xa87b, 0x0030, 0xa897,
++	0x4005, 0xa804, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084,
++	0xffc0, 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031,
++	0x0000, 0x2041, 0x11e3, 0x080c, 0x9a1f, 0x1904, 0x59df, 0x2009,
++	0x0002, 0x08f8, 0x2001, 0x0028, 0x900e, 0x0804, 0x59e0, 0x2009,
++	0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184,
++	0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, 0x0804,
++	0x59e0, 0x2001, 0x0029, 0x900e, 0x0804, 0x59e0, 0x080c, 0x327f,
++	0x0804, 0x59e1, 0x080c, 0x4b29, 0x0804, 0x59e1, 0x080c, 0x3fec,
++	0x0804, 0x59e1, 0x080c, 0x43f5, 0x0804, 0x59e1, 0x080c, 0x4572,
++	0x0804, 0x59e1, 0x080c, 0x4796, 0x0804, 0x59e1, 0x080c, 0x499b,
++	0x0804, 0x59e1, 0x080c, 0x3459, 0x0804, 0x59e1, 0x00b6, 0xa974,
++	0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1618, 0x9182, 0x0800,
++	0x1268, 0x9188, 0x1000, 0x2104, 0x905d, 0x0140, 0x080c, 0x5f2d,
++	0x1148, 0x00e9, 0x080c, 0x5d38, 0x9006, 0x00b0, 0x2001, 0x0028,
++	0x900e, 0x0090, 0x9082, 0x0006, 0x1240, 0xb900, 0xd1fc, 0x0d88,
++	0x2001, 0x0029, 0x2009, 0x1000, 0x0038, 0x2001, 0x0029, 0x900e,
++	0x0018, 0x2001, 0x0029, 0x900e, 0x9005, 0x00be, 0x0005, 0x0126,
++	0x2091, 0x8000, 0xb850, 0x900d, 0x0150, 0x2900, 0x0096, 0x2148,
++	0xa802, 0x009e, 0xa803, 0x0000, 0xb852, 0x012e, 0x0005, 0x2900,
++	0xb852, 0xb84e, 0xa803, 0x0000, 0x0cc0, 0x0126, 0x2091, 0x8000,
++	0xb84c, 0x9005, 0x0170, 0x00e6, 0x2071, 0x19b4, 0x7004, 0x9086,
++	0x0002, 0x0168, 0x00ee, 0xb84c, 0xa802, 0x2900, 0xb84e, 0x012e,
++	0x0005, 0x2900, 0xb852, 0xb84e, 0xa803, 0x0000, 0x0cc0, 0x701c,
++	0x9b06, 0x1d80, 0xb84c, 0x00a6, 0x2050, 0xb000, 0xa802, 0x2900,
++	0xb002, 0x00ae, 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000,
++	0xb84c, 0x904d, 0x0130, 0xa800, 0x9005, 0x1108, 0xb852, 0xb84e,
++	0x9905, 0x012e, 0x0005, 0xb84c, 0x904d, 0x0130, 0xa800, 0x9005,
++	0x1108, 0xb852, 0xb84e, 0x9905, 0x0005, 0x00b6, 0x0126, 0x00c6,
++	0x0026, 0x2091, 0x8000, 0x6210, 0x2258, 0xba00, 0x9005, 0x0110,
++	0xc285, 0x0008, 0xc284, 0xba02, 0x002e, 0x00ce, 0x012e, 0x00be,
++	0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, 0x2258,
++	0xba04, 0x0006, 0x9086, 0x0006, 0x1170, 0xb89c, 0xd0ac, 0x0158,
++	0x080c, 0x5f29, 0x0140, 0x9284, 0xff00, 0x8007, 0x9086, 0x0007,
++	0x1110, 0x2011, 0x0600, 0x000e, 0x9294, 0xff00, 0x9215, 0xba06,
++	0x0006, 0x9086, 0x0006, 0x1120, 0xba90, 0x82ff, 0x090c, 0x0d84,
++	0x000e, 0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6,
++	0x2091, 0x8000, 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, 0x0006,
++	0x1168, 0xb89c, 0xd0a4, 0x0150, 0x080c, 0x5f25, 0x1138, 0x9284,
++	0x00ff, 0x9086, 0x0007, 0x1110, 0x2011, 0x0006, 0x000e, 0x9294,
++	0x00ff, 0x8007, 0x9215, 0xba06, 0x00ce, 0x012e, 0x00be, 0x0005,
++	0x00d6, 0x0026, 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x00b0,
++	0x9190, 0x1000, 0x2204, 0x905d, 0x1180, 0x0096, 0x080c, 0x0fae,
++	0x2958, 0x009e, 0x0d90, 0x2b00, 0x2012, 0xb85c, 0xb8ba, 0xb860,
++	0xb8b6, 0x9006, 0xb8a6, 0x080c, 0x56f3, 0x9006, 0x002e, 0x00de,
++	0x0005, 0x00b6, 0x0096, 0x0126, 0x2091, 0x8000, 0x0026, 0x9182,
++	0x0800, 0x0218, 0x9085, 0x0001, 0x0458, 0x00d6, 0x9190, 0x1000,
++	0x2204, 0x905d, 0x0518, 0x2013, 0x0000, 0xb8a4, 0x904d, 0x0110,
++	0x080c, 0x0fe0, 0x00d6, 0x00c6, 0xb8ac, 0x2060, 0x8cff, 0x0168,
++	0x600c, 0x0006, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0110, 0x080c,
++	0x0f60, 0x080c, 0x9554, 0x00ce, 0x0c88, 0x00ce, 0x00de, 0x2b48,
++	0xb8b8, 0xb85e, 0xb8b4, 0xb862, 0x080c, 0x0ff0, 0x00de, 0x9006,
++	0x002e, 0x012e, 0x009e, 0x00be, 0x0005, 0x0016, 0x9182, 0x0800,
++	0x0218, 0x9085, 0x0001, 0x0030, 0x9188, 0x1000, 0x2104, 0x905d,
++	0x0dc0, 0x9006, 0x001e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146,
++	0x9006, 0xb80a, 0xb80e, 0xb800, 0xc08c, 0xb802, 0x080c, 0x6877,
++	0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c, 0x94d3, 0x11d8,
++	0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061, 0x194f, 0x7048,
++	0x2062, 0x704c, 0x6006, 0x7050, 0x600a, 0x7054, 0x600e, 0x00ce,
++	0x703c, 0x2069, 0x0140, 0x9005, 0x1110, 0x2001, 0x0001, 0x6886,
++	0x2069, 0x1800, 0x68ae, 0x7040, 0xb85e, 0x7048, 0xb862, 0x704c,
++	0xb866, 0x20e1, 0x0000, 0x2099, 0x0276, 0xb8b4, 0x20e8, 0xb8b8,
++	0x9088, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2099, 0x027a,
++	0x9088, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2069, 0x0200,
++	0x6817, 0x0001, 0x7040, 0xb86a, 0x7144, 0xb96e, 0x7048, 0xb872,
++	0x7050, 0xb876, 0x2069, 0x0200, 0x6817, 0x0000, 0xb8a0, 0x9086,
++	0x007e, 0x1110, 0x7144, 0xb96e, 0x9182, 0x0211, 0x1218, 0x2009,
++	0x0008, 0x0400, 0x9182, 0x0259, 0x1218, 0x2009, 0x0007, 0x00d0,
++	0x9182, 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0x9182, 0x0349,
++	0x1218, 0x2009, 0x0005, 0x0070, 0x9182, 0x0421, 0x1218, 0x2009,
++	0x0004, 0x0040, 0x9182, 0x0581, 0x1218, 0x2009, 0x0003, 0x0010,
++	0x2009, 0x0002, 0xb992, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005,
++	0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x7034, 0xb896, 0x703c,
++	0xb89a, 0x7054, 0xb89e, 0x0036, 0xbbbc, 0xc384, 0xba00, 0x2009,
++	0x1872, 0x210c, 0xd0bc, 0x0120, 0xd1ec, 0x0110, 0xc2ad, 0x0008,
++	0xc2ac, 0xd0c4, 0x0148, 0xd1e4, 0x0138, 0xc2bd, 0xd0cc, 0x0128,
++	0xd38c, 0x1108, 0xc385, 0x0008, 0xc2bc, 0xba02, 0xbbbe, 0x003e,
++	0x00ee, 0x002e, 0x001e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000,
++	0xb8a4, 0x904d, 0x0578, 0xa900, 0x81ff, 0x15c0, 0xaa04, 0x9282,
++	0x0010, 0x16c8, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x8906, 0x8006,
++	0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9080, 0x0004,
++	0x2098, 0x2009, 0x0010, 0x20a9, 0x0001, 0x4002, 0x9086, 0xffff,
++	0x0120, 0x8109, 0x1dd0, 0x080c, 0x0d84, 0x3c00, 0x20e8, 0x3300,
++	0x8001, 0x20a0, 0x4604, 0x8210, 0xaa06, 0x01de, 0x01ce, 0x014e,
++	0x013e, 0x0060, 0x080c, 0x0fae, 0x0170, 0x2900, 0xb8a6, 0xa803,
++	0x0000, 0x080c, 0x5dc9, 0xa807, 0x0001, 0xae12, 0x9085, 0x0001,
++	0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091, 0x8000,
++	0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005, 0x1150, 0x080c,
++	0x5dd8, 0x1158, 0xa804, 0x908a, 0x0002, 0x0218, 0x8001, 0xa806,
++	0x0020, 0x080c, 0x0fe0, 0xb8a7, 0x0000, 0x009e, 0x012e, 0x0005,
++	0x0126, 0x2091, 0x8000, 0x080c, 0x7be8, 0x012e, 0x0005, 0x901e,
++	0x0010, 0x2019, 0x0001, 0x900e, 0x0126, 0x2091, 0x8000, 0xb84c,
++	0x2048, 0xb800, 0xd0dc, 0x1170, 0x89ff, 0x0500, 0x83ff, 0x0120,
++	0xa878, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, 0xa870,
++	0x9506, 0x0120, 0x2908, 0xa800, 0x2048, 0x0c70, 0x080c, 0x8eec,
++	0xaa00, 0xb84c, 0x9906, 0x1110, 0xba4e, 0x0020, 0x00a6, 0x2150,
++	0xb202, 0x00ae, 0x82ff, 0x1110, 0xb952, 0x89ff, 0x012e, 0x0005,
++	0x9016, 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, 0x5e2d,
++	0x0118, 0x080c, 0xb15e, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c,
++	0x5e2d, 0x0118, 0x080c, 0xb0f8, 0x0010, 0x9085, 0x0001, 0x0005,
++	0x080c, 0x5e2d, 0x0118, 0x080c, 0xb15b, 0x0010, 0x9085, 0x0001,
++	0x0005, 0x080c, 0x5e2d, 0x0118, 0x080c, 0xb11c, 0x0010, 0x9085,
++	0x0001, 0x0005, 0x080c, 0x5e2d, 0x0118, 0x080c, 0xb188, 0x0010,
++	0x9085, 0x0001, 0x0005, 0xb8a4, 0x900d, 0x1118, 0x9085, 0x0001,
++	0x0005, 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e,
++	0x810f, 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004,
++	0x2098, 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128,
++	0x8109, 0x1dd8, 0x9085, 0x0001, 0x0008, 0x9006, 0x01ce, 0x013e,
++	0x0005, 0x0146, 0x01d6, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0004,
++	0x20a0, 0x20a9, 0x0010, 0x2009, 0xffff, 0x4104, 0x01de, 0x014e,
++	0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, 0x810f,
++	0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004, 0x2098,
++	0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128, 0x8109,
++	0x1dd8, 0x9085, 0x0001, 0x0068, 0x0146, 0x01d6, 0x3300, 0x8001,
++	0x20a0, 0x3c00, 0x20e8, 0x2001, 0xffff, 0x4004, 0x01de, 0x014e,
++	0x9006, 0x01ce, 0x013e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000,
++	0xb8a4, 0x904d, 0x1128, 0x080c, 0x0fae, 0x0168, 0x2900, 0xb8a6,
++	0x080c, 0x5dc9, 0xa803, 0x0001, 0xa807, 0x0000, 0x9085, 0x0001,
++	0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x0126, 0x2091,
++	0x8000, 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, 0x080c, 0x0fe0,
++	0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, 0xd0a4, 0x0005,
++	0x00b6, 0x00f6, 0x080c, 0x6877, 0x01b0, 0x71c0, 0x81ff, 0x1198,
++	0x71d8, 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, 0x1000, 0x2004,
++	0x905d, 0x0148, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1118,
++	0xb800, 0xc0ed, 0xb802, 0x2079, 0x1852, 0x7804, 0xd0a4, 0x01d0,
++	0x0156, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x5c0d, 0x1168,
++	0xb804, 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, 0x9086,
++	0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, 0x1f04,
++	0x5e54, 0x015e, 0x080c, 0x5eeb, 0x0120, 0x2001, 0x1952, 0x200c,
++	0x0038, 0x2079, 0x1852, 0x7804, 0xd0a4, 0x0130, 0x2009, 0x07d0,
++	0x2011, 0x5e7f, 0x080c, 0x78a5, 0x00fe, 0x00be, 0x0005, 0x00b6,
++	0x2011, 0x5e7f, 0x080c, 0x781a, 0x080c, 0x5eeb, 0x01d8, 0x2001,
++	0x107e, 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c, 0x5f29,
++	0x0130, 0x2009, 0x07d0, 0x2011, 0x5e7f, 0x080c, 0x78a5, 0x00e6,
++	0x2071, 0x1800, 0x9006, 0x7076, 0x7058, 0x707a, 0x080c, 0x2b1e,
++	0x00ee, 0x0488, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016,
++	0x080c, 0x5c0d, 0x1510, 0xb800, 0xd0ec, 0x01f8, 0x0046, 0xbaa0,
++	0x2220, 0x9006, 0x2009, 0x0029, 0x080c, 0xc9c5, 0xb800, 0xc0e5,
++	0xc0ec, 0xb802, 0xb804, 0x9084, 0x00ff, 0x9085, 0x0700, 0xb806,
++	0x2019, 0x0029, 0x080c, 0x7d55, 0x0076, 0x903e, 0x080c, 0x7c4d,
++	0x900e, 0x080c, 0xc73e, 0x007e, 0x004e, 0x001e, 0x8108, 0x1f04,
++	0x5ea7, 0x00ce, 0x015e, 0x00be, 0x0005, 0x00b6, 0x6010, 0x2058,
++	0xb800, 0xc0ec, 0xb802, 0x00be, 0x0005, 0x7810, 0x00b6, 0x2058,
++	0xb800, 0x00be, 0xd0ac, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800,
++	0x00be, 0xd0bc, 0x0005, 0x00b6, 0x00f6, 0x2001, 0x107e, 0x2004,
++	0x905d, 0x0110, 0xb800, 0xd0ec, 0x00fe, 0x00be, 0x0005, 0x0126,
++	0x0026, 0x2091, 0x8000, 0x0006, 0xbaa0, 0x9290, 0x1000, 0x2204,
++	0x9b06, 0x190c, 0x0d84, 0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd,
++	0x0008, 0xc2fc, 0xba02, 0x002e, 0x012e, 0x0005, 0x2011, 0x1836,
++	0x2204, 0xd0cc, 0x0138, 0x2001, 0x1950, 0x200c, 0x2011, 0x5f1b,
++	0x080c, 0x78a5, 0x0005, 0x2011, 0x5f1b, 0x080c, 0x781a, 0x2011,
++	0x1836, 0x2204, 0xc0cc, 0x2012, 0x0005, 0x080c, 0x4dea, 0xd0ac,
++	0x0005, 0x080c, 0x4dea, 0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184,
++	0x00ff, 0x908e, 0x0006, 0x001e, 0x0005, 0x0016, 0xb904, 0x9184,
++	0xff00, 0x8007, 0x908e, 0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6,
++	0x080c, 0xb759, 0x0158, 0x70d8, 0x9084, 0x0028, 0x0138, 0x2001,
++	0x107f, 0x2004, 0x905d, 0x0110, 0xb8bc, 0xd094, 0x00fe, 0x00be,
++	0x0005, 0x2071, 0x1904, 0x7003, 0x0001, 0x7007, 0x0000, 0x9006,
++	0x7012, 0x7016, 0x701a, 0x701e, 0x700a, 0x7046, 0x2001, 0x1917,
++	0x2003, 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071, 0x1918, 0x900e,
++	0x710a, 0x080c, 0x4dea, 0xd0fc, 0x1140, 0x080c, 0x4dea, 0x900e,
++	0xd09c, 0x0108, 0x8108, 0x7102, 0x00f8, 0x2001, 0x1872, 0x200c,
++	0x9184, 0x0007, 0x0002, 0x5f6d, 0x5f6d, 0x5f6d, 0x5f6d, 0x5f6d,
++	0x5f83, 0x5f91, 0x5f6d, 0x7003, 0x0003, 0x2009, 0x1873, 0x210c,
++	0x9184, 0xff00, 0x8007, 0x9005, 0x1110, 0x2001, 0x0002, 0x7006,
++	0x0018, 0x7003, 0x0005, 0x0c88, 0x00ee, 0x001e, 0x0005, 0x00e6,
++	0x2071, 0x0050, 0x684c, 0x9005, 0x1150, 0x00e6, 0x2071, 0x1904,
++	0x7028, 0xc085, 0x702a, 0x00ee, 0x9085, 0x0001, 0x0488, 0x6844,
++	0x9005, 0x0158, 0x080c, 0x6bb2, 0x6a60, 0x9200, 0x7002, 0x6864,
++	0x9101, 0x7006, 0x9006, 0x7012, 0x7016, 0x6860, 0x7002, 0x6864,
++	0x7006, 0x6868, 0x700a, 0x686c, 0x700e, 0x6844, 0x9005, 0x1110,
++	0x7012, 0x7016, 0x684c, 0x701a, 0x701c, 0x9085, 0x0040, 0x701e,
++	0x7037, 0x0019, 0x702b, 0x0001, 0x00e6, 0x2071, 0x1904, 0x7028,
++	0xc084, 0x702a, 0x7007, 0x0001, 0x700b, 0x0000, 0x00ee, 0x9006,
++	0x00ee, 0x0005, 0xa868, 0xd0fc, 0x11c8, 0x00e6, 0x0026, 0x2001,
++	0x1918, 0x2004, 0x9005, 0x0904, 0x61ae, 0xa87c, 0xd0bc, 0x1904,
++	0x61ae, 0xa978, 0xa874, 0x9105, 0x1904, 0x61ae, 0x2001, 0x1918,
++	0x2004, 0x0002, 0x61ae, 0x6017, 0x6051, 0x6051, 0x0005, 0xa868,
++	0xd0fc, 0x11e0, 0x00e6, 0x0026, 0x2009, 0x1918, 0x210c, 0x81ff,
++	0x0904, 0x61ae, 0xa87c, 0xd0cc, 0x0904, 0x61ae, 0xa880, 0x9084,
++	0x00ff, 0x9086, 0x0001, 0x1904, 0x61ae, 0x9186, 0x0003, 0x0904,
++	0x6051, 0xa84f, 0x8021, 0xa853, 0x0017, 0x0028, 0x0005, 0xa84f,
++	0x8020, 0xa853, 0x0016, 0x2071, 0x1904, 0x701c, 0x9005, 0x1904,
++	0x6360, 0x0e04, 0x63a9, 0x2071, 0x0000, 0xa84c, 0x7082, 0xa850,
++	0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, 0x4080,
++	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x2071, 0x1800,
++	0x2011, 0x0001, 0xa804, 0x900d, 0x702c, 0x1148, 0xa802, 0x2900,
++	0x702e, 0x70bc, 0x9200, 0x70be, 0x002e, 0x00ee, 0x0005, 0x0096,
++	0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x009e,
++	0x0c68, 0xa84f, 0x0000, 0x00f6, 0x2079, 0x0050, 0x2071, 0x1904,
++	0xa803, 0x0000, 0x7010, 0x9005, 0x1904, 0x6136, 0x782c, 0x908c,
++	0x0780, 0x190c, 0x64ce, 0x8004, 0x8004, 0x8004, 0x9084, 0x0003,
++	0x0002, 0x606f, 0x6136, 0x6092, 0x60d5, 0x080c, 0x0d84, 0x2071,
++	0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1170, 0x2071, 0x19c7,
++	0x7040, 0x9005, 0x1328, 0x2001, 0x1919, 0x2004, 0x8005, 0x7042,
++	0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904,
++	0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200,
++	0x70be, 0x0c20, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d,
++	0x1570, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148,
++	0x2009, 0x182f, 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, 0x00ee,
++	0x0048, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc,
++	0x8000, 0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd0a4,
++	0x1d00, 0x2071, 0x19c7, 0x7040, 0x9005, 0x1328, 0x2001, 0x1919,
++	0x2004, 0x8005, 0x7042, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016,
++	0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8,
++	0x702e, 0x70bc, 0x9200, 0x70be, 0x0820, 0x0096, 0x00e6, 0x7824,
++	0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc,
++	0x8000, 0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd0a4,
++	0x1d70, 0x00ee, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd09c,
++	0x11a0, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x1560, 0x2071,
++	0x19c7, 0x7040, 0x9005, 0x1328, 0x2001, 0x1919, 0x2004, 0x8005,
++	0x7042, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x009e, 0x2908, 0x7010,
++	0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008,
++	0x711e, 0x2148, 0xa804, 0x900d, 0x1170, 0x2071, 0x19c7, 0x7040,
++	0x9005, 0x1328, 0x2001, 0x1919, 0x2004, 0x8005, 0x7042, 0x00fe,
++	0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148,
++	0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc,
++	0x9200, 0x70be, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2908, 0x7010,
++	0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008,
++	0x711e, 0x2148, 0xa804, 0x900d, 0x1904, 0x6189, 0x782c, 0x9094,
++	0x0780, 0x190c, 0x64ce, 0xd09c, 0x1198, 0x701c, 0x904d, 0x0180,
++	0x7010, 0x8001, 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900,
++	0x7822, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd09c, 0x0d68,
++	0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd0a4, 0x01a0, 0x00e6,
++	0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e,
++	0x70bc, 0x8000, 0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce,
++	0xd0a4, 0x1d70, 0x00ee, 0x2071, 0x19c7, 0x7040, 0x9005, 0x1328,
++	0x2001, 0x1919, 0x2004, 0x8005, 0x7042, 0x00fe, 0x002e, 0x00ee,
++	0x0005, 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904,
++	0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200,
++	0x70be, 0x00ee, 0x0804, 0x6146, 0xa868, 0xd0fc, 0x1904, 0x61ea,
++	0x0096, 0xa804, 0xa807, 0x0000, 0x904d, 0x190c, 0x0f60, 0x009e,
++	0x0018, 0xa868, 0xd0fc, 0x15f0, 0x00e6, 0x0026, 0xa84f, 0x0000,
++	0x00f6, 0x2079, 0x0050, 0x2071, 0x1800, 0x70f0, 0x8001, 0x01d0,
++	0x1678, 0x2071, 0x1904, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904,
++	0x62de, 0x782c, 0x908c, 0x0780, 0x190c, 0x64ce, 0x8004, 0x8004,
++	0x8004, 0x9084, 0x0003, 0x0002, 0x61eb, 0x62de, 0x6204, 0x6271,
++	0x080c, 0x0d84, 0x70f3, 0x0fa0, 0x71ec, 0x8107, 0x9106, 0x9094,
++	0x00c0, 0x9184, 0xff3f, 0x9205, 0x70ee, 0x3b08, 0x3a00, 0x9104,
++	0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f, 0x9205, 0x20d0, 0x0888,
++	0x70f2, 0x0878, 0x0005, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804,
++	0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c,
++	0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e,
++	0x70bc, 0x9200, 0x70be, 0x0c70, 0x2071, 0x1800, 0x2900, 0x7822,
++	0xa804, 0x900d, 0x1904, 0x6262, 0x7830, 0x8007, 0x9084, 0x001f,
++	0x9082, 0x0005, 0x1220, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7824,
++	0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009, 0x182f,
++	0x210c, 0x918a, 0x0040, 0x0218, 0x7022, 0x00ee, 0x0048, 0x00ee,
++	0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be,
++	0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd0a4, 0x1d00, 0x0e04,
++	0x6259, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000,
++	0x6836, 0x6833, 0x0013, 0x00de, 0x2001, 0x1915, 0x200c, 0xc184,
++	0x2102, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
++	0x113e, 0x2009, 0x1917, 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee,
++	0x0005, 0x2001, 0x1915, 0x200c, 0xc185, 0x2102, 0x00fe, 0x002e,
++	0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210,
++	0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x0804,
++	0x6217, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c,
++	0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x782c, 0x9094,
++	0x0780, 0x190c, 0x64ce, 0xd0a4, 0x1d70, 0x00ee, 0x0e04, 0x62b3,
++	0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836,
++	0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, 0x4080,
++	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x2009, 0x1917,
++	0x200b, 0x0000, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd09c,
++	0x1170, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x11e0, 0x00fe,
++	0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x0c58, 0x009e,
++	0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110,
++	0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1120, 0x00fe,
++	0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148,
++	0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc,
++	0x9200, 0x70be, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2908, 0x7010,
++	0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008,
++	0x711e, 0x2148, 0xa804, 0x900d, 0x1904, 0x634d, 0x782c, 0x9094,
++	0x0780, 0x190c, 0x64ce, 0xd09c, 0x11b0, 0x701c, 0x904d, 0x0198,
++	0xa84c, 0x9005, 0x1180, 0x7010, 0x8001, 0x7012, 0x1108, 0x701a,
++	0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, 0x0780, 0x190c,
++	0x64ce, 0xd09c, 0x0d50, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce,
++	0xd0a4, 0x05b8, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c,
++	0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x782c, 0x9094,
++	0x0780, 0x190c, 0x64ce, 0xd0a4, 0x1d70, 0x00ee, 0x0e04, 0x6346,
++	0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836,
++	0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, 0x4080,
++	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x2009, 0x1917,
++	0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085,
++	0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800,
++	0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff,
++	0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x00ee, 0x0804, 0x62ee,
++	0x2071, 0x1904, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012,
++	0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148,
++	0xa804, 0x900d, 0x1128, 0x1e04, 0x6389, 0x002e, 0x00ee, 0x0005,
++	0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210,
++	0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x0e04,
++	0x6375, 0x2071, 0x1904, 0x701c, 0x2048, 0xa84c, 0x900d, 0x0d28,
++	0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036,
++	0xa870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084,
++	0x190c, 0x113e, 0x2071, 0x1904, 0x080c, 0x64ba, 0x002e, 0x00ee,
++	0x0005, 0x2071, 0x1904, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000,
++	0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e,
++	0x2148, 0xa804, 0x900d, 0x1118, 0x002e, 0x00ee, 0x0005, 0x2071,
++	0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900,
++	0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x002e, 0x00ee,
++	0x0005, 0x0006, 0xa87c, 0x0006, 0xa867, 0x0103, 0x20a9, 0x001c,
++	0xa860, 0x20e8, 0xa85c, 0x9080, 0x001d, 0x20a0, 0x9006, 0x4004,
++	0x000e, 0x9084, 0x00ff, 0xa87e, 0x000e, 0xa87a, 0xa982, 0x0005,
++	0x2071, 0x1904, 0x7004, 0x0002, 0x63f2, 0x63f3, 0x64b9, 0x63f3,
++	0x0d84, 0x64b9, 0x0005, 0x2001, 0x1918, 0x2004, 0x0002, 0x63fd,
++	0x63fd, 0x6452, 0x6453, 0x63fd, 0x6453, 0x0126, 0x2091, 0x8000,
++	0x1e0c, 0x64d9, 0x701c, 0x904d, 0x01e0, 0xa84c, 0x9005, 0x01d8,
++	0x0e04, 0x6421, 0xa94c, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032,
++	0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, 0x4080, 0x2001,
++	0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x2071, 0x1904, 0x080c,
++	0x64ba, 0x012e, 0x0470, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780,
++	0x190c, 0x64ce, 0xd09c, 0x2071, 0x1904, 0x1510, 0x2071, 0x1904,
++	0x700f, 0x0001, 0xa964, 0x9184, 0x00ff, 0x9086, 0x0003, 0x1130,
++	0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, 0x710e, 0x2900, 0x00d6,
++	0x2069, 0x0050, 0x6822, 0x00de, 0x2071, 0x1904, 0x701c, 0x2048,
++	0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, 0x701a,
++	0x012e, 0x0005, 0x0005, 0x00d6, 0x2008, 0x2069, 0x19c7, 0x6840,
++	0x9005, 0x0760, 0x0158, 0x9186, 0x0003, 0x0540, 0x2001, 0x1813,
++	0x2004, 0x2009, 0x1a8a, 0x210c, 0x9102, 0x1500, 0x0126, 0x2091,
++	0x8000, 0x2069, 0x0050, 0x693c, 0x6838, 0x9106, 0x0190, 0x0e04,
++	0x6485, 0x2069, 0x0000, 0x6837, 0x8040, 0x6833, 0x0012, 0x6883,
++	0x8040, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
++	0x113e, 0x2069, 0x19c7, 0x6843, 0xffff, 0x012e, 0x00de, 0x0126,
++	0x2091, 0x8000, 0x1e0c, 0x654b, 0x701c, 0x904d, 0x0540, 0x2001,
++	0x005b, 0x2004, 0x9094, 0x0780, 0x15c9, 0xd09c, 0x1500, 0x2071,
++	0x1904, 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff, 0x9086, 0x0003,
++	0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, 0x710e, 0x2900,
++	0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, 0x701c, 0x2048, 0x7010,
++	0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, 0x701a, 0x012e,
++	0x0005, 0x0005, 0x0126, 0x2091, 0x8000, 0x701c, 0x904d, 0x0160,
++	0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, 0x701a,
++	0x012e, 0x080c, 0x0fe0, 0x0005, 0x012e, 0x0005, 0x2091, 0x8000,
++	0x0e04, 0x64d0, 0x0006, 0x0016, 0x2001, 0x8004, 0x0006, 0x0804,
++	0x0d8d, 0x0096, 0x00f6, 0x2079, 0x0050, 0x7044, 0xd084, 0x01e0,
++	0xc084, 0x7046, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069,
++	0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001,
++	0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x2009, 0x1917, 0x200b,
++	0x0000, 0x00fe, 0x009e, 0x0005, 0x782c, 0x9094, 0x0780, 0x1971,
++	0xd0a4, 0x0db8, 0x2001, 0x1918, 0x2004, 0x2009, 0x1917, 0x2104,
++	0x8000, 0x200a, 0x9082, 0x000f, 0x0e60, 0x00e6, 0x2071, 0x1800,
++	0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009,
++	0x182f, 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, 0x00ee, 0x0048,
++	0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000,
++	0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd0a4, 0x1d00,
++	0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836,
++	0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
++	0xd084, 0x190c, 0x113e, 0x2009, 0x1917, 0x200b, 0x0000, 0x00ee,
++	0x00fe, 0x009e, 0x0005, 0x00f6, 0x2079, 0x0050, 0x7044, 0xd084,
++	0x01b8, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6,
++	0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080,
++	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x00fe, 0x0005,
++	0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd0a4, 0x0db8, 0x00e6,
++	0x2071, 0x1800, 0x7824, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e,
++	0x70bc, 0x8000, 0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce,
++	0xd0a4, 0x1d80, 0x00d6, 0x2069, 0x0050, 0x693c, 0x2069, 0x1918,
++	0x6808, 0x690a, 0x2069, 0x19c7, 0x9102, 0x1118, 0x6840, 0x9005,
++	0x1328, 0x2001, 0x1919, 0x200c, 0x810d, 0x6942, 0x00de, 0x00ee,
++	0x00fe, 0x0005, 0x7090, 0x908a, 0x0029, 0x1a0c, 0x0d84, 0x9082,
++	0x001d, 0x001b, 0x6027, 0x1e00, 0x0005, 0x666d, 0x65f7, 0x6613,
++	0x663b, 0x665c, 0x669c, 0x66ae, 0x6613, 0x6684, 0x65b2, 0x65e0,
++	0x65b1, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1180,
++	0x6808, 0x9005, 0x1518, 0x7093, 0x0028, 0x2069, 0x195c, 0x2d04,
++	0x7002, 0x080c, 0x69a3, 0x6028, 0x9085, 0x0600, 0x602a, 0x00b0,
++	0x7093, 0x0028, 0x2069, 0x195c, 0x2d04, 0x7002, 0x6028, 0x9085,
++	0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a30,
++	0x080c, 0x1827, 0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005,
++	0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1178, 0x6808, 0x9005,
++	0x1160, 0x7093, 0x0028, 0x2069, 0x195c, 0x2d04, 0x7002, 0x080c,
++	0x6a2d, 0x6028, 0x9085, 0x0600, 0x602a, 0x00de, 0x0005, 0x0006,
++	0x2001, 0x0090, 0x080c, 0x28a5, 0x000e, 0x6124, 0xd1e4, 0x1190,
++	0x080c, 0x671b, 0xd1d4, 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150,
++	0x7093, 0x0020, 0x080c, 0x671b, 0x0028, 0x7093, 0x001d, 0x0010,
++	0x7093, 0x001f, 0x0005, 0x2001, 0x0088, 0x080c, 0x28a5, 0x6124,
++	0xd1cc, 0x11d8, 0xd1dc, 0x11b0, 0xd1e4, 0x1188, 0x9184, 0x1e00,
++	0x11c8, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x68a3,
++	0x2001, 0x0080, 0x080c, 0x28a5, 0x7093, 0x0028, 0x0058, 0x7093,
++	0x001e, 0x0040, 0x7093, 0x001d, 0x0028, 0x7093, 0x0020, 0x0010,
++	0x7093, 0x001f, 0x0005, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e,
++	0x080c, 0x68a3, 0x2001, 0x0080, 0x080c, 0x28a5, 0x6124, 0xd1d4,
++	0x1180, 0xd1dc, 0x1158, 0xd1e4, 0x1130, 0x9184, 0x1e00, 0x1158,
++	0x7093, 0x0028, 0x0040, 0x7093, 0x001e, 0x0028, 0x7093, 0x001d,
++	0x0010, 0x7093, 0x001f, 0x0005, 0x2001, 0x00a0, 0x080c, 0x28a5,
++	0x6124, 0xd1dc, 0x1138, 0xd1e4, 0x0138, 0x080c, 0x1851, 0x7093,
++	0x001e, 0x0010, 0x7093, 0x001d, 0x0005, 0x080c, 0x6794, 0x6124,
++	0xd1dc, 0x1188, 0x080c, 0x671b, 0x0016, 0x080c, 0x1851, 0x001e,
++	0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x7093, 0x001e, 0x0020, 0x7093,
++	0x001f, 0x080c, 0x671b, 0x0005, 0x0006, 0x2001, 0x00a0, 0x080c,
++	0x28a5, 0x000e, 0x6124, 0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc,
++	0x1128, 0xd1e4, 0x0140, 0x7093, 0x001e, 0x0028, 0x7093, 0x001d,
++	0x0010, 0x7093, 0x0021, 0x0005, 0x080c, 0x6794, 0x6124, 0xd1d4,
++	0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x7093, 0x001e, 0x0028,
++	0x7093, 0x001d, 0x0010, 0x7093, 0x001f, 0x0005, 0x0006, 0x2001,
++	0x0090, 0x080c, 0x28a5, 0x000e, 0x6124, 0xd1d4, 0x1178, 0xd1cc,
++	0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0158, 0x7093, 0x001e, 0x0040,
++	0x7093, 0x001d, 0x0028, 0x7093, 0x0020, 0x0010, 0x7093, 0x001f,
++	0x0005, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x0126, 0x2061, 0x0100,
++	0x2069, 0x0140, 0x2071, 0x1800, 0x2091, 0x8000, 0x080c, 0x6877,
++	0x11d8, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x01b0, 0xc1b4, 0x2102,
++	0x6027, 0x0200, 0x080c, 0x27ef, 0x6024, 0xd0cc, 0x0148, 0x2001,
++	0x00a0, 0x080c, 0x28a5, 0x080c, 0x6b40, 0x080c, 0x56d9, 0x0428,
++	0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x6891, 0x0150, 0x080c,
++	0x6888, 0x1138, 0x2001, 0x0001, 0x080c, 0x23a6, 0x080c, 0x6853,
++	0x00a0, 0x080c, 0x6791, 0x0178, 0x2001, 0x0001, 0x080c, 0x23a6,
++	0x7090, 0x9086, 0x001e, 0x0120, 0x7090, 0x9086, 0x0022, 0x1118,
++	0x7093, 0x0025, 0x0010, 0x7093, 0x0021, 0x012e, 0x00ee, 0x00de,
++	0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x672c, 0x080c, 0x78e7,
++	0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, 0x672c, 0x080c,
++	0x78de, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016, 0x080c,
++	0x8b50, 0x2071, 0x1800, 0x080c, 0x66c9, 0x001e, 0x00fe, 0x00ee,
++	0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x00f6,
++	0x0126, 0x080c, 0x8b50, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071,
++	0x1800, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003,
++	0x080c, 0x8e99, 0x2011, 0x0002, 0x080c, 0x8ea3, 0x080c, 0x8d59,
++	0x080c, 0x7893, 0x0036, 0x901e, 0x080c, 0x8dfe, 0x003e, 0x60e3,
++	0x0000, 0x080c, 0xcd0a, 0x080c, 0xcd25, 0x2009, 0x0004, 0x080c,
++	0x27f5, 0x080c, 0x2718, 0x2001, 0x1800, 0x2003, 0x0004, 0x6027,
++	0x0008, 0x080c, 0x0b69, 0x2001, 0x0001, 0x080c, 0x23a6, 0x012e,
++	0x00fe, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005,
++	0x0026, 0x00e6, 0x2011, 0x6739, 0x2071, 0x19c7, 0x701c, 0x9206,
++	0x1118, 0x7018, 0x9005, 0x0110, 0x9085, 0x0001, 0x00ee, 0x002e,
++	0x0005, 0x6020, 0xd09c, 0x0005, 0x6800, 0x9084, 0xfffe, 0x9086,
++	0x00c0, 0x01b8, 0x2001, 0x00c0, 0x080c, 0x28a5, 0x0156, 0x20a9,
++	0x002d, 0x1d04, 0x67a1, 0x2091, 0x6000, 0x1f04, 0x67a1, 0x015e,
++	0x00d6, 0x2069, 0x1800, 0x6894, 0x8001, 0x0220, 0x0118, 0x6896,
++	0x00de, 0x0005, 0x6897, 0x0014, 0x68ec, 0xd0dc, 0x0dc8, 0x6800,
++	0x9086, 0x0001, 0x1da8, 0x080c, 0x78f3, 0x0c90, 0x00c6, 0x00d6,
++	0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2001,
++	0x194c, 0x200c, 0x9186, 0x0000, 0x0158, 0x9186, 0x0001, 0x0158,
++	0x9186, 0x0002, 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, 0x6843,
++	0x7093, 0x0022, 0x0040, 0x7093, 0x0021, 0x0028, 0x7093, 0x0023,
++	0x0010, 0x7093, 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001,
++	0x0001, 0x080c, 0x2471, 0x0026, 0x080c, 0x94da, 0x002e, 0x7000,
++	0x908e, 0x0004, 0x0118, 0x602b, 0x0028, 0x0010, 0x602b, 0x0020,
++	0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x6024, 0xd0ac,
++	0x0120, 0x012e, 0x015e, 0x0804, 0x684f, 0x6800, 0x9084, 0x00a1,
++	0xc0bd, 0x6802, 0x080c, 0x27ef, 0x6904, 0xd1d4, 0x1140, 0x2001,
++	0x0100, 0x080c, 0x28a5, 0x1f04, 0x67fe, 0x080c, 0x68d0, 0x012e,
++	0x015e, 0x080c, 0x6888, 0x01a8, 0x6044, 0x9005, 0x0168, 0x6050,
++	0x0006, 0x9085, 0x0020, 0x6052, 0x080c, 0x68d0, 0x9006, 0x8001,
++	0x1df0, 0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c,
++	0x68d0, 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, 0x0130, 0x2009,
++	0x00c8, 0x2011, 0x6739, 0x080c, 0x78a5, 0x002e, 0x001e, 0x2001,
++	0x194c, 0x2003, 0x0004, 0x080c, 0x659a, 0x080c, 0x6888, 0x0138,
++	0x6804, 0xd0d4, 0x1120, 0xd0dc, 0x1100, 0x080c, 0x6b45, 0x00ee,
++	0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100,
++	0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x6b4f, 0x2001, 0x193c,
++	0x2003, 0x0000, 0x9006, 0x7092, 0x60e2, 0x6886, 0x080c, 0x2471,
++	0x9006, 0x080c, 0x28a5, 0x6043, 0x0090, 0x6043, 0x0010, 0x6027,
++	0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006,
++	0x2001, 0x194b, 0x2004, 0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006,
++	0x080c, 0x4dee, 0x9084, 0x0030, 0x9086, 0x0000, 0x000e, 0x0005,
++	0x0006, 0x080c, 0x4dee, 0x9084, 0x0030, 0x9086, 0x0030, 0x000e,
++	0x0005, 0x0006, 0x080c, 0x4dee, 0x9084, 0x0030, 0x9086, 0x0010,
++	0x000e, 0x0005, 0x0006, 0x080c, 0x4dee, 0x9084, 0x0030, 0x9086,
++	0x0020, 0x000e, 0x0005, 0x0036, 0x0016, 0x2001, 0x180c, 0x2004,
++	0x908c, 0x0013, 0x0190, 0x9084, 0x0011, 0x0120, 0x080c, 0x2491,
++	0x900e, 0x0028, 0x080c, 0x5f25, 0x1dc8, 0x2009, 0x0002, 0x2019,
++	0x0028, 0x080c, 0x2ce5, 0x9006, 0x0019, 0x001e, 0x003e, 0x0005,
++	0x00e6, 0x2071, 0x180c, 0x2e04, 0x0130, 0x080c, 0xb752, 0x1128,
++	0x9085, 0x0010, 0x0010, 0x9084, 0xffef, 0x2072, 0x00ee, 0x0005,
++	0x6050, 0x0006, 0x60ec, 0x0006, 0x600c, 0x0006, 0x6004, 0x0006,
++	0x6028, 0x0006, 0x0016, 0x6138, 0x6050, 0x9084, 0xfbff, 0x9085,
++	0x2000, 0x6052, 0x613a, 0x20a9, 0x0012, 0x1d04, 0x68e5, 0x2091,
++	0x6000, 0x1f04, 0x68e5, 0x602f, 0x0100, 0x602f, 0x0000, 0x6050,
++	0x9085, 0x0400, 0x9084, 0xdfff, 0x6052, 0x613a, 0x001e, 0x602f,
++	0x0040, 0x602f, 0x0000, 0x000e, 0x602a, 0x000e, 0x6006, 0x000e,
++	0x600e, 0x000e, 0x60ee, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001,
++	0x0001, 0x080c, 0x2471, 0x2001, 0x00a0, 0x080c, 0x28a5, 0x000e,
++	0x6052, 0x6058, 0x0006, 0xc0e5, 0x605a, 0x00f6, 0x2079, 0x0100,
++	0x080c, 0x2764, 0x00fe, 0x000e, 0x605a, 0x0005, 0x0156, 0x0016,
++	0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069,
++	0x0140, 0x2071, 0x1800, 0x6020, 0x9084, 0x0080, 0x0138, 0x2001,
++	0x180c, 0x200c, 0xc1c5, 0x2102, 0x0804, 0x6996, 0x2001, 0x180c,
++	0x200c, 0xc1c4, 0x2102, 0x6028, 0x9084, 0xe1ff, 0x602a, 0x6027,
++	0x0200, 0x2001, 0x0090, 0x080c, 0x28a5, 0x20a9, 0x0366, 0x6024,
++	0xd0cc, 0x11f0, 0x1d04, 0x6947, 0x2091, 0x6000, 0x1f04, 0x6947,
++	0x2011, 0x0003, 0x080c, 0x8e99, 0x2011, 0x0002, 0x080c, 0x8ea3,
++	0x080c, 0x8d59, 0x901e, 0x080c, 0x8dfe, 0x2001, 0x00a0, 0x080c,
++	0x28a5, 0x080c, 0x6b40, 0x080c, 0x56d9, 0x9085, 0x0001, 0x0470,
++	0x86ff, 0x1110, 0x080c, 0x1851, 0x60e3, 0x0000, 0x2001, 0x193c,
++	0x2004, 0x080c, 0x2471, 0x60e2, 0x2001, 0x0080, 0x080c, 0x28a5,
++	0x20a9, 0x0366, 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x27ef,
++	0x6024, 0x910c, 0x0138, 0x1d04, 0x697a, 0x2091, 0x6000, 0x1f04,
++	0x697a, 0x0830, 0x6028, 0x9085, 0x1e00, 0x602a, 0x70ac, 0x9005,
++	0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x9006, 0x080c, 0xb759,
++	0x0110, 0x080c, 0x0cfc, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e,
++	0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6,
++	0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x2069, 0x0140,
++	0x6020, 0x9084, 0x00c0, 0x0120, 0x6884, 0x9005, 0x1904, 0x69f7,
++	0x2001, 0x0088, 0x080c, 0x28a5, 0x9006, 0x60e2, 0x6886, 0x080c,
++	0x2471, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, 0x6808, 0x9005,
++	0x01c0, 0x6028, 0x9084, 0xfbff, 0x602a, 0x6027, 0x0400, 0x2069,
++	0x195c, 0x7000, 0x206a, 0x7093, 0x0026, 0x7003, 0x0001, 0x20a9,
++	0x0002, 0x1d04, 0x69d9, 0x2091, 0x6000, 0x1f04, 0x69d9, 0x0804,
++	0x6a25, 0x2069, 0x0140, 0x20a9, 0x0384, 0x6027, 0x1e00, 0x2009,
++	0x1e00, 0x080c, 0x27ef, 0x6024, 0x910c, 0x0508, 0x9084, 0x1a00,
++	0x11f0, 0x1d04, 0x69e5, 0x2091, 0x6000, 0x1f04, 0x69e5, 0x2011,
++	0x0003, 0x080c, 0x8e99, 0x2011, 0x0002, 0x080c, 0x8ea3, 0x080c,
++	0x8d59, 0x901e, 0x080c, 0x8dfe, 0x2001, 0x00a0, 0x080c, 0x28a5,
++	0x080c, 0x6b40, 0x080c, 0x56d9, 0x9085, 0x0001, 0x00b0, 0x2001,
++	0x0080, 0x080c, 0x28a5, 0x2069, 0x0140, 0x60e3, 0x0000, 0x70ac,
++	0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, 0x193c,
++	0x2004, 0x080c, 0x2471, 0x60e2, 0x9006, 0x00ee, 0x00de, 0x00ce,
++	0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026,
++	0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800,
++	0x6020, 0x9084, 0x00c0, 0x01c8, 0x2011, 0x0003, 0x080c, 0x8e99,
++	0x2011, 0x0002, 0x080c, 0x8ea3, 0x080c, 0x8d59, 0x901e, 0x080c,
++	0x8dfe, 0x2069, 0x0140, 0x2001, 0x00a0, 0x080c, 0x28a5, 0x080c,
++	0x6b40, 0x080c, 0x56d9, 0x0804, 0x6ac0, 0x2001, 0x180c, 0x200c,
++	0xd1b4, 0x1160, 0xc1b5, 0x2102, 0x080c, 0x6721, 0x2069, 0x0140,
++	0x2001, 0x0080, 0x080c, 0x28a5, 0x60e3, 0x0000, 0x2069, 0x0200,
++	0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x0180, 0x6028, 0x9084,
++	0xfdff, 0x602a, 0x6027, 0x0200, 0x2069, 0x195c, 0x7000, 0x206a,
++	0x7093, 0x0027, 0x7003, 0x0001, 0x0804, 0x6ac0, 0x6027, 0x1e00,
++	0x2009, 0x1e00, 0x080c, 0x27ef, 0x6024, 0x910c, 0x01c8, 0x9084,
++	0x1c00, 0x11b0, 0x1d04, 0x6a7e, 0x0006, 0x0016, 0x00c6, 0x00d6,
++	0x00e6, 0x080c, 0x7778, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e,
++	0x00e6, 0x2071, 0x19c7, 0x7018, 0x00ee, 0x9005, 0x19f8, 0x0500,
++	0x0026, 0x2011, 0x6739, 0x080c, 0x781a, 0x2011, 0x672c, 0x080c,
++	0x78e7, 0x002e, 0x2069, 0x0140, 0x60e3, 0x0000, 0x70ac, 0x9005,
++	0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, 0x193c, 0x2004,
++	0x080c, 0x2471, 0x60e2, 0x2001, 0x180c, 0x200c, 0xc1b4, 0x2102,
++	0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005,
++	0x0156, 0x0016, 0x0026, 0x0036, 0x0046, 0x00c6, 0x00e6, 0x2061,
++	0x0100, 0x2071, 0x1800, 0x080c, 0xb752, 0x1904, 0x6b2e, 0x7130,
++	0xd184, 0x1170, 0x080c, 0x2e69, 0x0138, 0xc18d, 0x7132, 0x2011,
++	0x1853, 0x2214, 0xd2ac, 0x1120, 0x7030, 0xd08c, 0x0904, 0x6b2e,
++	0x2011, 0x1853, 0x220c, 0xd1a4, 0x0538, 0x0016, 0x2019, 0x000e,
++	0x080c, 0xc941, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x9186,
++	0x007e, 0x01a0, 0x9186, 0x0080, 0x0188, 0x080c, 0x5c0d, 0x1170,
++	0x2120, 0x9006, 0x0016, 0x2009, 0x000e, 0x080c, 0xc9c5, 0x2009,
++	0x0001, 0x2011, 0x0100, 0x080c, 0x7a0a, 0x001e, 0x8108, 0x1f04,
++	0x6af7, 0x00be, 0x015e, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009,
++	0x0002, 0x2019, 0x0004, 0x080c, 0x2ce5, 0x001e, 0x0078, 0x0156,
++	0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x5c0d, 0x1110, 0x080c,
++	0x56f3, 0x8108, 0x1f04, 0x6b24, 0x00be, 0x015e, 0x080c, 0x1851,
++	0x080c, 0x94da, 0x60e3, 0x0000, 0x080c, 0x56d9, 0x080c, 0x67be,
++	0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005,
++	0x2001, 0x194c, 0x2003, 0x0001, 0x0005, 0x2001, 0x194c, 0x2003,
++	0x0000, 0x0005, 0x2001, 0x194b, 0x2003, 0xaaaa, 0x0005, 0x2001,
++	0x194b, 0x2003, 0x0000, 0x0005, 0x2071, 0x18ee, 0x7003, 0x0000,
++	0x7007, 0x0000, 0x080c, 0x0fc7, 0x090c, 0x0d84, 0xa8ab, 0xdcb0,
++	0x2900, 0x704e, 0x080c, 0x0fc7, 0x090c, 0x0d84, 0xa8ab, 0xdcb0,
++	0x2900, 0x7052, 0xa867, 0x0000, 0xa86b, 0x0001, 0xa89f, 0x0000,
++	0x0005, 0x00e6, 0x2071, 0x0040, 0x6848, 0x9005, 0x1118, 0x9085,
++	0x0001, 0x04b0, 0x6840, 0x9005, 0x0150, 0x04a1, 0x6a50, 0x9200,
++	0x7002, 0x6854, 0x9101, 0x7006, 0x9006, 0x7012, 0x7016, 0x6850,
++	0x7002, 0x6854, 0x7006, 0x6858, 0x700a, 0x685c, 0x700e, 0x6840,
++	0x9005, 0x1110, 0x7012, 0x7016, 0x6848, 0x701a, 0x701c, 0x9085,
++	0x0040, 0x701e, 0x2001, 0x0019, 0x7036, 0x702b, 0x0001, 0x2001,
++	0x0004, 0x200c, 0x918c, 0xfff7, 0x918d, 0x8000, 0x2102, 0x00d6,
++	0x2069, 0x18ee, 0x6807, 0x0001, 0x00de, 0x080c, 0x70f9, 0x9006,
++	0x00ee, 0x0005, 0x900e, 0x0156, 0x20a9, 0x0006, 0x8003, 0x2011,
++	0x0100, 0x2214, 0x9296, 0x0008, 0x1110, 0x818d, 0x0010, 0x81f5,
++	0x3e08, 0x1f04, 0x6bb6, 0x015e, 0x0005, 0x2079, 0x0040, 0x2071,
++	0x18ee, 0x7004, 0x0002, 0x6bd5, 0x6bd6, 0x6c0b, 0x6c66, 0x6d61,
++	0x6bd3, 0x6bd3, 0x6d8b, 0x080c, 0x0d84, 0x0005, 0x2079, 0x0040,
++	0x782c, 0x908c, 0x0780, 0x190c, 0x7185, 0xd0a4, 0x01f0, 0x7824,
++	0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a,
++	0x0040, 0x12c0, 0x04db, 0x2001, 0x1800, 0x200c, 0x9186, 0x0003,
++	0x1160, 0x7104, 0x9186, 0x0004, 0x0140, 0x9186, 0x0007, 0x0128,
++	0x9186, 0x0003, 0x19e8, 0x080c, 0x6c66, 0x782c, 0xd09c, 0x090c,
++	0x70f9, 0x0005, 0x9082, 0x005a, 0x1218, 0x2100, 0x002b, 0x0c18,
++	0x080c, 0x6c9c, 0x0c90, 0x0005, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c,
++	0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6cbe, 0x6c9c, 0x6c9c, 0x6c9c,
++	0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c,
++	0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c,
++	0x6ca8, 0x6c9c, 0x6e60, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c,
++	0x6ca8, 0x6ea1, 0x6ee2, 0x6f29, 0x6f3d, 0x6c9c, 0x6c9c, 0x6cbe,
++	0x6ca8, 0x6c9c, 0x6c9c, 0x6d35, 0x6fe8, 0x7003, 0x6c9c, 0x6cbe,
++	0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6d2b, 0x7003, 0x6c9c, 0x6c9c,
++	0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6cd2,
++	0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c,
++	0x6c9c, 0x7129, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6ce6,
++	0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x2079, 0x0040,
++	0x7004, 0x9086, 0x0003, 0x1198, 0x782c, 0x080c, 0x7122, 0xd0a4,
++	0x0170, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084,
++	0x00ff, 0x908a, 0x001a, 0x1210, 0x002b, 0x0c50, 0x00e9, 0x080c,
++	0x70f9, 0x0005, 0x6c9c, 0x6ca8, 0x6e4c, 0x6c9c, 0x6ca8, 0x6c9c,
++	0x6ca8, 0x6ca8, 0x6c9c, 0x6ca8, 0x6e4c, 0x6ca8, 0x6ca8, 0x6ca8,
++	0x6ca8, 0x6ca8, 0x6c9c, 0x6ca8, 0x6e4c, 0x6c9c, 0x6c9c, 0x6ca8,
++	0x6c9c, 0x6c9c, 0x6c9c, 0x6ca8, 0x00e6, 0x2071, 0x18ee, 0x2009,
++	0x0400, 0x0071, 0x00ee, 0x0005, 0x2009, 0x1000, 0x0049, 0x0005,
++	0x2009, 0x2000, 0x0029, 0x0005, 0x2009, 0x0800, 0x0009, 0x0005,
++	0x7007, 0x0001, 0xa868, 0x9084, 0x00ff, 0x9105, 0xa86a, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x61a9, 0x012e, 0x0005, 0xa864, 0x8007,
++	0x9084, 0x00ff, 0x0d08, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804,
++	0x6e0a, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b,
++	0x6e0a, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0968, 0x8001,
++	0x1120, 0x7007, 0x0001, 0x0804, 0x6e25, 0x7007, 0x0003, 0x7012,
++	0x2900, 0x7016, 0x701a, 0x704b, 0x6e25, 0x0005, 0xa864, 0x8007,
++	0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x6ca4, 0x7007, 0x0001,
++	0x2009, 0x1833, 0x210c, 0x81ff, 0x11a8, 0xa868, 0x9084, 0x00ff,
++	0xa86a, 0xa883, 0x0000, 0x080c, 0x58e6, 0x1108, 0x0005, 0x0126,
++	0x2091, 0x8000, 0xa867, 0x0139, 0xa87a, 0xa982, 0x080c, 0x61a9,
++	0x012e, 0x0ca0, 0xa994, 0x9186, 0x0071, 0x0d38, 0x9186, 0x0064,
++	0x0d20, 0x9186, 0x007c, 0x0d08, 0x9186, 0x0028, 0x09f0, 0x9186,
++	0x0038, 0x09d8, 0x9186, 0x0078, 0x09c0, 0x9186, 0x005f, 0x09a8,
++	0x9186, 0x0056, 0x0990, 0xa897, 0x4005, 0xa89b, 0x0001, 0x2001,
++	0x0030, 0x900e, 0x08a0, 0xa87c, 0x9084, 0x00c0, 0x9086, 0x00c0,
++	0x1120, 0x7007, 0x0001, 0x0804, 0x701a, 0x2900, 0x7016, 0x701a,
++	0x20a9, 0x0004, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0030, 0x2098,
++	0x7050, 0x2040, 0xa060, 0x20e8, 0xa05c, 0x9080, 0x0023, 0x20a0,
++	0x4003, 0xa888, 0x7012, 0x9082, 0x0401, 0x1a04, 0x6cac, 0xaab4,
++	0x928a, 0x0002, 0x1a04, 0x6cac, 0x82ff, 0x1138, 0xa8b8, 0xa9bc,
++	0x9105, 0x0118, 0x2001, 0x6dc8, 0x0018, 0x9280, 0x6dbe, 0x2005,
++	0x7056, 0x7010, 0x9015, 0x0904, 0x6da9, 0x080c, 0x0fc7, 0x1118,
++	0x7007, 0x0004, 0x0005, 0x2900, 0x7022, 0x7054, 0x2060, 0xe000,
++	0xa866, 0xe004, 0x7050, 0x2040, 0xa95c, 0x9100, 0xa076, 0xa860,
++	0xa072, 0xe008, 0x920a, 0x1210, 0x900e, 0x2200, 0x7112, 0xe20c,
++	0x8003, 0x800b, 0x9296, 0x0004, 0x0108, 0x9108, 0xa17a, 0x810b,
++	0xa17e, 0x080c, 0x108c, 0xa06c, 0x908e, 0x0100, 0x0170, 0x9086,
++	0x0200, 0x0118, 0x7007, 0x0007, 0x0005, 0x7020, 0x2048, 0x080c,
++	0x0fe0, 0x7014, 0x2048, 0x0804, 0x6cac, 0x7020, 0x2048, 0x7018,
++	0xa802, 0xa807, 0x0000, 0x2908, 0x2048, 0xa906, 0x711a, 0x0804,
++	0x6d61, 0x7014, 0x2048, 0x7007, 0x0001, 0xa8b4, 0x9005, 0x1128,
++	0xa8b8, 0xa9bc, 0x9105, 0x0108, 0x00b9, 0xa864, 0x9084, 0x00ff,
++	0x9086, 0x001e, 0x0904, 0x701a, 0x0804, 0x6e0a, 0x6dc0, 0x6dc4,
++	0x0002, 0x001d, 0x0007, 0x0004, 0x000a, 0x001b, 0x0005, 0x0006,
++	0x000a, 0x001d, 0x0005, 0x0004, 0x0076, 0x0066, 0xafb8, 0xaebc,
++	0xa804, 0x2050, 0xb0c0, 0xb0e2, 0xb0bc, 0xb0de, 0xb0b8, 0xb0d2,
++	0xb0b4, 0xb0ce, 0xb6da, 0xb7d6, 0xb0b0, 0xb0ca, 0xb0ac, 0xb0c6,
++	0xb0a8, 0xb0ba, 0xb0a4, 0xb0b6, 0xb6c2, 0xb7be, 0xb0a0, 0xb0b2,
++	0xb09c, 0xb0ae, 0xb098, 0xb0a2, 0xb094, 0xb09e, 0xb6aa, 0xb7a6,
++	0xb090, 0xb09a, 0xb08c, 0xb096, 0xb088, 0xb08a, 0xb084, 0xb086,
++	0xb692, 0xb78e, 0xb080, 0xb082, 0xb07c, 0xb07e, 0xb078, 0xb072,
++	0xb074, 0xb06e, 0xb67a, 0xb776, 0xb004, 0x9055, 0x1958, 0x006e,
++	0x007e, 0x0005, 0x2009, 0x1833, 0x210c, 0x81ff, 0x1178, 0x080c,
++	0x5755, 0x1108, 0x0005, 0x080c, 0x63d1, 0x0126, 0x2091, 0x8000,
++	0x080c, 0xb374, 0x080c, 0x61a9, 0x012e, 0x0ca0, 0x080c, 0xb752,
++	0x1d70, 0x2001, 0x0028, 0x900e, 0x0c70, 0x2009, 0x1833, 0x210c,
++	0x81ff, 0x11d8, 0xa888, 0x9005, 0x01e0, 0xa883, 0x0000, 0xa87c,
++	0xd0f4, 0x0120, 0x080c, 0x5849, 0x1138, 0x0005, 0x9006, 0xa87a,
++	0x080c, 0x57e4, 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa87a,
++	0xa982, 0x080c, 0x61a9, 0x012e, 0x0cb0, 0x2001, 0x0028, 0x900e,
++	0x0c98, 0x2001, 0x0000, 0x0c80, 0x7018, 0xa802, 0x2908, 0x2048,
++	0xa906, 0x711a, 0x7010, 0x8001, 0x7012, 0x0118, 0x7007, 0x0003,
++	0x0030, 0x7014, 0x2048, 0x7007, 0x0001, 0x7048, 0x080f, 0x0005,
++	0x00b6, 0x7007, 0x0001, 0xa974, 0xa878, 0x9084, 0x00ff, 0x9096,
++	0x0004, 0x0540, 0x20a9, 0x0001, 0x9096, 0x0001, 0x0190, 0x900e,
++	0x20a9, 0x0800, 0x9096, 0x0002, 0x0160, 0x9005, 0x11d8, 0xa974,
++	0x080c, 0x5c0d, 0x11b8, 0x0066, 0xae80, 0x080c, 0x5d1d, 0x006e,
++	0x0088, 0x0046, 0x2011, 0x180c, 0x2224, 0xc484, 0x2412, 0x004e,
++	0x00c6, 0x080c, 0x5c0d, 0x1110, 0x080c, 0x5e1d, 0x8108, 0x1f04,
++	0x6e89, 0x00ce, 0xa87c, 0xd084, 0x1120, 0x080c, 0x0fe0, 0x00be,
++	0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, 0x012e, 0x00be,
++	0x0005, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x5f29,
++	0x0580, 0x2061, 0x1a3d, 0x6100, 0xd184, 0x0178, 0xa888, 0x9084,
++	0x00ff, 0x1550, 0x6000, 0xd084, 0x0520, 0x6004, 0x9005, 0x1538,
++	0x6003, 0x0000, 0x600b, 0x0000, 0x00c8, 0x2011, 0x0001, 0xa890,
++	0x9005, 0x1110, 0x2001, 0x001e, 0x8000, 0x6016, 0xa888, 0x9084,
++	0x00ff, 0x0178, 0x6006, 0xa888, 0x8007, 0x9084, 0x00ff, 0x0148,
++	0x600a, 0xa888, 0x8000, 0x1108, 0xc28d, 0x6202, 0x012e, 0x0804,
++	0x70e3, 0x012e, 0x0804, 0x70dd, 0x012e, 0x0804, 0x70d7, 0x012e,
++	0x0804, 0x70da, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c,
++	0x5f29, 0x05e0, 0x2061, 0x1a3d, 0x6000, 0xd084, 0x05b8, 0x6204,
++	0x6308, 0xd08c, 0x1530, 0xac78, 0x9484, 0x0003, 0x0170, 0xa988,
++	0x918c, 0x00ff, 0x8001, 0x1120, 0x2100, 0x9210, 0x0620, 0x0028,
++	0x8001, 0x1508, 0x2100, 0x9212, 0x02f0, 0x9484, 0x000c, 0x0188,
++	0xa988, 0x810f, 0x918c, 0x00ff, 0x9082, 0x0004, 0x1120, 0x2100,
++	0x9318, 0x0288, 0x0030, 0x9082, 0x0004, 0x1168, 0x2100, 0x931a,
++	0x0250, 0xa890, 0x9005, 0x0110, 0x8000, 0x6016, 0x6206, 0x630a,
++	0x012e, 0x0804, 0x70e3, 0x012e, 0x0804, 0x70e0, 0x012e, 0x0804,
++	0x70dd, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0x1a3d,
++	0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, 0x0220, 0x630a, 0x012e,
++	0x0804, 0x70f1, 0x012e, 0x0804, 0x70e0, 0x00b6, 0x0126, 0x00c6,
++	0x2091, 0x8000, 0x7007, 0x0001, 0xa87c, 0xd0ac, 0x0148, 0x00c6,
++	0x2061, 0x1a3d, 0x6000, 0x9084, 0xfcff, 0x6002, 0x00ce, 0x0440,
++	0xa888, 0x9005, 0x05d8, 0xa88c, 0x9065, 0x0598, 0x2001, 0x1833,
++	0x2004, 0x9005, 0x0118, 0x080c, 0x9584, 0x0068, 0x6017, 0xf400,
++	0x605b, 0x0000, 0xa97c, 0xd1a4, 0x0110, 0xa980, 0x615a, 0x2009,
++	0x0041, 0x080c, 0x95ce, 0xa988, 0x918c, 0xff00, 0x9186, 0x2000,
++	0x1138, 0x0026, 0x900e, 0x2011, 0xfdff, 0x080c, 0x7a0a, 0x002e,
++	0xa87c, 0xd0c4, 0x0148, 0x2061, 0x1a3d, 0x6000, 0xd08c, 0x1120,
++	0x6008, 0x8000, 0x0208, 0x600a, 0x00ce, 0x012e, 0x00be, 0x0804,
++	0x70e3, 0x00ce, 0x012e, 0x00be, 0x0804, 0x70dd, 0xa984, 0x9186,
++	0x002e, 0x0d30, 0x9186, 0x002d, 0x0d18, 0x9186, 0x0045, 0x0510,
++	0x9186, 0x002a, 0x1130, 0x2001, 0x180c, 0x200c, 0xc194, 0x2102,
++	0x08b8, 0x9186, 0x0020, 0x0158, 0x9186, 0x0029, 0x1d10, 0xa974,
++	0x080c, 0x5c0d, 0x1968, 0xb800, 0xc0e4, 0xb802, 0x0848, 0xa88c,
++	0x9065, 0x09b8, 0x6007, 0x0024, 0x2001, 0x1953, 0x2004, 0x601a,
++	0x0804, 0x6f78, 0xa88c, 0x9065, 0x0960, 0x00e6, 0xa890, 0x9075,
++	0x2001, 0x1833, 0x2004, 0x9005, 0x0150, 0x080c, 0x9584, 0x8eff,
++	0x0118, 0x2e60, 0x080c, 0x9584, 0x00ee, 0x0804, 0x6f78, 0x6024,
++	0xc0dc, 0xc0d5, 0x6026, 0x2e60, 0x6007, 0x003a, 0xa8a0, 0x9005,
++	0x0130, 0x6007, 0x003b, 0xa8a4, 0x602e, 0xa8a8, 0x6016, 0x6003,
++	0x0001, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x00ee, 0x0804, 0x6f78,
++	0x2061, 0x1a3d, 0x6000, 0xd084, 0x0190, 0xd08c, 0x1904, 0x70f1,
++	0x0126, 0x2091, 0x8000, 0x6204, 0x8210, 0x0220, 0x6206, 0x012e,
++	0x0804, 0x70f1, 0x012e, 0xa883, 0x0016, 0x0804, 0x70ea, 0xa883,
++	0x0007, 0x0804, 0x70ea, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0130,
++	0x8001, 0x1138, 0x7007, 0x0001, 0x0069, 0x0005, 0x080c, 0x6ca4,
++	0x0040, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b,
++	0x701a, 0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x903e,
++	0x2061, 0x1800, 0x61cc, 0x81ff, 0x1904, 0x709c, 0x6130, 0xd194,
++	0x1904, 0x70c6, 0xa878, 0x2070, 0x9e82, 0x1cd0, 0x0a04, 0x7090,
++	0x6060, 0x9e02, 0x1a04, 0x7090, 0x7120, 0x9186, 0x0006, 0x1904,
++	0x7082, 0x7010, 0x905d, 0x0904, 0x709c, 0xb800, 0xd0e4, 0x1904,
++	0x70c0, 0x2061, 0x1a3d, 0x6100, 0x9184, 0x0301, 0x9086, 0x0001,
++	0x15a0, 0x7024, 0xd0dc, 0x1904, 0x70c9, 0xa883, 0x0000, 0xa803,
++	0x0000, 0x2908, 0x7014, 0x9005, 0x1198, 0x7116, 0xa87c, 0xd0f4,
++	0x1904, 0x70cc, 0x080c, 0x4dea, 0xd09c, 0x1118, 0xa87c, 0xc0cc,
++	0xa87e, 0x2e60, 0x080c, 0x792a, 0x012e, 0x00ee, 0x00be, 0x0005,
++	0x2048, 0xa800, 0x9005, 0x1de0, 0xa902, 0x2148, 0xa87c, 0xd0f4,
++	0x1904, 0x70cc, 0x012e, 0x00ee, 0x00be, 0x0005, 0x012e, 0x00ee,
++	0xa883, 0x0006, 0x00be, 0x0804, 0x70ea, 0xd184, 0x0db8, 0xd1c4,
++	0x1190, 0x00a0, 0xa974, 0x080c, 0x5c0d, 0x15d0, 0xb800, 0xd0e4,
++	0x15b8, 0x7120, 0x9186, 0x0007, 0x1118, 0xa883, 0x0002, 0x0490,
++	0xa883, 0x0008, 0x0478, 0xa883, 0x000e, 0x0460, 0xa883, 0x0017,
++	0x0448, 0xa883, 0x0035, 0x0430, 0x080c, 0x4dee, 0xd0fc, 0x01e8,
++	0xa878, 0x2070, 0x9e82, 0x1cd0, 0x02c0, 0x6060, 0x9e02, 0x12a8,
++	0x7120, 0x9186, 0x0006, 0x1188, 0x7010, 0x905d, 0x0170, 0xb800,
++	0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, 0x9086, 0x0007, 0x1904,
++	0x7026, 0x7003, 0x0002, 0x0804, 0x7026, 0xa883, 0x0028, 0x0010,
++	0xa883, 0x0029, 0x012e, 0x00ee, 0x00be, 0x0420, 0xa883, 0x002a,
++	0x0cc8, 0xa883, 0x0045, 0x0cb0, 0x2e60, 0x2019, 0x0002, 0x601b,
++	0x0014, 0x080c, 0xc58e, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2009,
++	0x003e, 0x0058, 0x2009, 0x0004, 0x0040, 0x2009, 0x0006, 0x0028,
++	0x2009, 0x0016, 0x0010, 0x2009, 0x0001, 0xa884, 0x9084, 0xff00,
++	0x9105, 0xa886, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, 0x012e,
++	0x0005, 0x080c, 0x0fe0, 0x0005, 0x00d6, 0x080c, 0x7921, 0x00de,
++	0x0005, 0x00d6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x0040,
++	0x702c, 0xd084, 0x01d8, 0x908c, 0x0780, 0x190c, 0x7185, 0xd09c,
++	0x11a8, 0x2071, 0x1800, 0x70bc, 0x90ea, 0x0040, 0x0278, 0x8001,
++	0x70be, 0x702c, 0x2048, 0xa800, 0x702e, 0x9006, 0xa802, 0xa806,
++	0x2071, 0x0040, 0x2900, 0x7022, 0x702c, 0x0c28, 0x012e, 0x00ee,
++	0x00de, 0x0005, 0x0006, 0x9084, 0x0780, 0x190c, 0x7185, 0x000e,
++	0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6, 0x7007,
++	0x0001, 0xaa74, 0x9282, 0x0004, 0x1a04, 0x7176, 0xa97c, 0x9188,
++	0x1000, 0x2104, 0x905d, 0xb804, 0xd284, 0x0140, 0x05e8, 0x8007,
++	0x9084, 0x00ff, 0x9084, 0x0006, 0x1108, 0x04b0, 0x2b10, 0x080c,
++	0x94fe, 0x1118, 0x080c, 0x95a1, 0x05a8, 0x6212, 0xa874, 0x0002,
++	0x7154, 0x7159, 0x715c, 0x7162, 0x2019, 0x0002, 0x080c, 0xc941,
++	0x0060, 0x080c, 0xc8dd, 0x0048, 0x2019, 0x0002, 0xa980, 0x080c,
++	0xc8f8, 0x0018, 0xa980, 0x080c, 0xc8dd, 0x080c, 0x9554, 0xa887,
++	0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, 0x012e, 0x00be,
++	0x001e, 0x002e, 0x003e, 0x00ce, 0x00de, 0x0005, 0xa887, 0x0006,
++	0x0c80, 0xa887, 0x0002, 0x0c68, 0xa887, 0x0005, 0x0c50, 0xa887,
++	0x0004, 0x0c38, 0xa887, 0x0007, 0x0c20, 0x2091, 0x8000, 0x0e04,
++	0x7187, 0x0006, 0x0016, 0x2001, 0x8003, 0x0006, 0x0804, 0x0d8d,
++	0x0005, 0x00f6, 0x2079, 0x0300, 0x2001, 0x0200, 0x200c, 0xc1e5,
++	0xc1dc, 0x2102, 0x2009, 0x0218, 0x210c, 0xd1ec, 0x1120, 0x080c,
++	0x1426, 0x00fe, 0x0005, 0x2001, 0x020d, 0x2003, 0x0020, 0x781f,
++	0x0300, 0x00fe, 0x0005, 0x781c, 0xd08c, 0x05e8, 0x7d44, 0x7c40,
++	0x9584, 0x00f6, 0x1508, 0x9484, 0x7000, 0x0138, 0x908a, 0x2000,
++	0x1258, 0x9584, 0x0700, 0x8007, 0x04a8, 0x7000, 0x9084, 0xff00,
++	0x9086, 0x8100, 0x0db0, 0x00b0, 0x9484, 0x0fff, 0x1130, 0x7000,
++	0x9084, 0xff00, 0x9086, 0x8100, 0x11c0, 0x080c, 0xcce2, 0x080c,
++	0x7692, 0x7817, 0x0140, 0x00a8, 0x9584, 0x0076, 0x1118, 0x080c,
++	0x76f0, 0x19c8, 0xd5a4, 0x0148, 0x0046, 0x0056, 0x080c, 0x724d,
++	0x080c, 0x1f79, 0x005e, 0x004e, 0x0020, 0x080c, 0xcce2, 0x7817,
++	0x0140, 0x080c, 0x722e, 0x2001, 0x19bd, 0x2004, 0x9005, 0x090c,
++	0x8125, 0x0005, 0x0002, 0x7204, 0x74c3, 0x71fb, 0x71fb, 0x71fb,
++	0x71fb, 0x71fb, 0x71fb, 0x7817, 0x0140, 0x2001, 0x19bd, 0x2004,
++	0x9005, 0x090c, 0x8125, 0x0005, 0x7000, 0x908c, 0xff00, 0x9194,
++	0xf000, 0x810f, 0x9484, 0x0fff, 0x688a, 0x9286, 0x2000, 0x1150,
++	0x6800, 0x9086, 0x0001, 0x1118, 0x080c, 0x4e04, 0x0070, 0x080c,
++	0x726d, 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, 0x73fe, 0x0028,
++	0x9286, 0x8000, 0x1110, 0x080c, 0x75c8, 0x7817, 0x0140, 0x2001,
++	0x19bd, 0x2004, 0x9005, 0x090c, 0x8125, 0x0005, 0x2001, 0x180f,
++	0x2004, 0xd08c, 0x0178, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003,
++	0x1148, 0x0026, 0x0036, 0x2011, 0x8048, 0x2518, 0x080c, 0x447f,
++	0x003e, 0x002e, 0x0005, 0x0036, 0x0046, 0x0056, 0x00f6, 0x2079,
++	0x0200, 0x2019, 0xfffe, 0x7c30, 0x0050, 0x0036, 0x0046, 0x0056,
++	0x00f6, 0x2079, 0x0200, 0x7d44, 0x7c40, 0x2019, 0xffff, 0x2001,
++	0x180f, 0x2004, 0xd08c, 0x0160, 0x2001, 0x1800, 0x2004, 0x9086,
++	0x0003, 0x1130, 0x0026, 0x2011, 0x8048, 0x080c, 0x447f, 0x002e,
++	0x00fe, 0x005e, 0x004e, 0x003e, 0x0005, 0x00b6, 0x00c6, 0x7010,
++	0x9084, 0xff00, 0x8007, 0x9096, 0x0001, 0x0120, 0x9096, 0x0023,
++	0x1904, 0x73cf, 0x9186, 0x0023, 0x1550, 0x080c, 0x7657, 0x0904,
++	0x73cf, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1130, 0x2009,
++	0x0015, 0x080c, 0x95ce, 0x0804, 0x73cf, 0x908e, 0x0214, 0x0118,
++	0x908e, 0x0210, 0x1130, 0x2009, 0x0015, 0x080c, 0x95ce, 0x0804,
++	0x73cf, 0x908e, 0x0100, 0x1904, 0x73cf, 0x7034, 0x9005, 0x1904,
++	0x73cf, 0x2009, 0x0016, 0x080c, 0x95ce, 0x0804, 0x73cf, 0x9186,
++	0x0022, 0x1904, 0x73cf, 0x7030, 0x908e, 0x0300, 0x1580, 0x68d8,
++	0xd0a4, 0x0528, 0xc0b5, 0x68da, 0x7100, 0x918c, 0x00ff, 0x6976,
++	0x7004, 0x687a, 0x00f6, 0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006,
++	0x9084, 0x00ff, 0x0016, 0x2008, 0x080c, 0x2446, 0x7932, 0x7936,
++	0x001e, 0x000e, 0x00fe, 0x080c, 0x23fd, 0x6956, 0x703c, 0x00e6,
++	0x2071, 0x0140, 0x7086, 0x2071, 0x1800, 0x70ae, 0x00ee, 0x7034,
++	0x9005, 0x1904, 0x73cf, 0x2009, 0x0017, 0x0804, 0x739c, 0x908e,
++	0x0400, 0x1190, 0x7034, 0x9005, 0x1904, 0x73cf, 0x080c, 0x6877,
++	0x0120, 0x2009, 0x001d, 0x0804, 0x739c, 0x68d8, 0xc0a5, 0x68da,
++	0x2009, 0x0030, 0x0804, 0x739c, 0x908e, 0x0500, 0x1140, 0x7034,
++	0x9005, 0x1904, 0x73cf, 0x2009, 0x0018, 0x0804, 0x739c, 0x908e,
++	0x2010, 0x1120, 0x2009, 0x0019, 0x0804, 0x739c, 0x908e, 0x2110,
++	0x1120, 0x2009, 0x001a, 0x0804, 0x739c, 0x908e, 0x5200, 0x1140,
++	0x7034, 0x9005, 0x1904, 0x73cf, 0x2009, 0x001b, 0x0804, 0x739c,
++	0x908e, 0x5000, 0x1140, 0x7034, 0x9005, 0x1904, 0x73cf, 0x2009,
++	0x001c, 0x0804, 0x739c, 0x908e, 0x1300, 0x1120, 0x2009, 0x0034,
++	0x0804, 0x739c, 0x908e, 0x1200, 0x1140, 0x7034, 0x9005, 0x1904,
++	0x73cf, 0x2009, 0x0024, 0x0804, 0x739c, 0x908c, 0xff00, 0x918e,
++	0x2400, 0x1120, 0x2009, 0x002d, 0x0804, 0x739c, 0x908c, 0xff00,
++	0x918e, 0x5300, 0x1120, 0x2009, 0x002a, 0x0804, 0x739c, 0x908e,
++	0x0f00, 0x1120, 0x2009, 0x0020, 0x0804, 0x739c, 0x908e, 0x5300,
++	0x1108, 0x00d8, 0x908e, 0x6104, 0x11c0, 0x2011, 0x026d, 0x8208,
++	0x2204, 0x9082, 0x0004, 0x8004, 0x8004, 0x20a8, 0x2011, 0x8015,
++	0x211c, 0x8108, 0x0046, 0x2124, 0x080c, 0x447f, 0x004e, 0x8108,
++	0x1f04, 0x735e, 0x2009, 0x0023, 0x0478, 0x908e, 0x6000, 0x1118,
++	0x2009, 0x003f, 0x0448, 0x908e, 0x7800, 0x1118, 0x2009, 0x0045,
++	0x0418, 0x908e, 0x1000, 0x1118, 0x2009, 0x004e, 0x00e8, 0x908e,
++	0x6300, 0x1118, 0x2009, 0x004a, 0x00b8, 0x908c, 0xff00, 0x918e,
++	0x5600, 0x1118, 0x2009, 0x004f, 0x0078, 0x908c, 0xff00, 0x918e,
++	0x5700, 0x1118, 0x2009, 0x0050, 0x0038, 0x2009, 0x001d, 0x6834,
++	0xd0d4, 0x0110, 0x2009, 0x004c, 0x0016, 0x2011, 0x0263, 0x2204,
++	0x8211, 0x220c, 0x080c, 0x23fd, 0x1568, 0x080c, 0x5bb0, 0x1550,
++	0xbe12, 0xbd16, 0x001e, 0x0016, 0xb8b0, 0x9005, 0x1168, 0x9186,
++	0x0046, 0x1150, 0x6874, 0x9606, 0x1138, 0x6878, 0x9506, 0x9084,
++	0xff00, 0x1110, 0x001e, 0x0098, 0x080c, 0x94fe, 0x01a8, 0x2b08,
++	0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x9186, 0x004c,
++	0x1110, 0x6023, 0x000a, 0x0016, 0x001e, 0x080c, 0x95ce, 0x00ce,
++	0x00be, 0x0005, 0x001e, 0x0cd8, 0x2001, 0x180d, 0x2004, 0xd0ec,
++	0x0120, 0x2011, 0x8049, 0x080c, 0x447f, 0x080c, 0x95a1, 0x0d90,
++	0x2b08, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x0016,
++	0x9186, 0x0017, 0x0118, 0x9186, 0x0030, 0x1128, 0x6007, 0x0009,
++	0x6017, 0x2900, 0x0020, 0x6007, 0x0051, 0x6017, 0x0000, 0x602f,
++	0x0009, 0x6003, 0x0001, 0x080c, 0x7c1d, 0x08a0, 0x080c, 0x2e39,
++	0x1140, 0x7010, 0x9084, 0xff00, 0x8007, 0x908e, 0x0008, 0x1108,
++	0x0009, 0x0005, 0x00b6, 0x00c6, 0x0046, 0x7000, 0x908c, 0xff00,
++	0x810f, 0x9186, 0x0033, 0x11e8, 0x080c, 0x7657, 0x0904, 0x745b,
++	0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1140, 0x7034, 0x9005,
++	0x15d0, 0x2009, 0x0015, 0x080c, 0x95ce, 0x04a8, 0x908e, 0x0100,
++	0x1590, 0x7034, 0x9005, 0x1578, 0x2009, 0x0016, 0x080c, 0x95ce,
++	0x0450, 0x9186, 0x0032, 0x1538, 0x7030, 0x908e, 0x1400, 0x1518,
++	0x2009, 0x0038, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c,
++	0x080c, 0x23fd, 0x11b8, 0x080c, 0x5bb0, 0x11a0, 0xbe12, 0xbd16,
++	0x080c, 0x94fe, 0x0178, 0x2b08, 0x6112, 0x080c, 0xb4e6, 0x6023,
++	0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x95ce, 0x080c, 0x8125,
++	0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce, 0x00be, 0x0005, 0x00b6,
++	0x0046, 0x00e6, 0x00d6, 0x2028, 0x2130, 0x9696, 0x00ff, 0x11b8,
++	0x9592, 0xfffc, 0x02a0, 0x9596, 0xfffd, 0x1120, 0x2009, 0x007f,
++	0x0804, 0x74bd, 0x9596, 0xfffe, 0x1120, 0x2009, 0x007e, 0x0804,
++	0x74bd, 0x9596, 0xfffc, 0x1118, 0x2009, 0x0080, 0x04f0, 0x2011,
++	0x0000, 0x2019, 0x1836, 0x231c, 0xd3ac, 0x0130, 0x9026, 0x20a9,
++	0x0800, 0x2071, 0x1000, 0x0030, 0x2021, 0x0081, 0x20a9, 0x077f,
++	0x2071, 0x1081, 0x2e1c, 0x93dd, 0x0000, 0x1140, 0x82ff, 0x11d0,
++	0x9496, 0x00ff, 0x01b8, 0x2410, 0xc2fd, 0x00a0, 0xbf10, 0x2600,
++	0x9706, 0xb814, 0x1120, 0x9546, 0x1110, 0x2408, 0x00b0, 0x9745,
++	0x1148, 0x94c6, 0x007e, 0x0130, 0x94c6, 0x007f, 0x0118, 0x94c6,
++	0x0080, 0x1d20, 0x8420, 0x8e70, 0x1f04, 0x7492, 0x82ff, 0x1118,
++	0x9085, 0x0001, 0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de, 0x00ee,
++	0x004e, 0x00be, 0x0005, 0x7000, 0x908c, 0xff00, 0x810f, 0x9184,
++	0x000f, 0x0002, 0x74da, 0x74da, 0x74da, 0x7669, 0x74da, 0x74e3,
++	0x750e, 0x759d, 0x74da, 0x74da, 0x74da, 0x74da, 0x74da, 0x74da,
++	0x74da, 0x74da, 0x7817, 0x0140, 0x2001, 0x19bd, 0x2004, 0x9005,
++	0x090c, 0x8125, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7120,
++	0x2160, 0x9c8c, 0x0007, 0x11c0, 0x9c8a, 0x1cd0, 0x02a8, 0x6860,
++	0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910,
++	0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a,
++	0x2009, 0x0046, 0x080c, 0x95ce, 0x7817, 0x0140, 0x2001, 0x19bd,
++	0x2004, 0x9005, 0x090c, 0x8125, 0x00be, 0x0005, 0x00b6, 0x00c6,
++	0x9484, 0x0fff, 0x0904, 0x7573, 0x7110, 0xd1bc, 0x1904, 0x7573,
++	0x7108, 0x700c, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, 0xff00,
++	0x15b8, 0x81ff, 0x15a8, 0x9080, 0x2e6e, 0x200d, 0x918c, 0xff00,
++	0x810f, 0x2001, 0x0080, 0x9106, 0x0904, 0x7573, 0x080c, 0x5bb0,
++	0x1904, 0x7573, 0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15e0, 0xba04,
++	0x9294, 0xff00, 0x9286, 0x0600, 0x11a0, 0x080c, 0x94fe, 0x05f0,
++	0x2b08, 0x7028, 0x604a, 0x702c, 0x6046, 0x6112, 0x6023, 0x0006,
++	0x7120, 0x610a, 0x7130, 0x6156, 0x2009, 0x0044, 0x080c, 0xbfdb,
++	0x0410, 0x080c, 0x5f2d, 0x2010, 0x1138, 0xb807, 0x0606, 0x0c28,
++	0x190c, 0x745f, 0x11c0, 0x0890, 0x080c, 0x94fe, 0x2b08, 0x0198,
++	0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x9286, 0x0004, 0x1118,
++	0x6007, 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c,
++	0x7c1d, 0x080c, 0x8125, 0x7817, 0x0140, 0x2001, 0x19bd, 0x2004,
++	0x9005, 0x090c, 0x8125, 0x00ce, 0x00be, 0x0005, 0x2001, 0x180d,
++	0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x447f, 0x080c,
++	0x95a1, 0x0d48, 0x2b08, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a,
++	0x7130, 0x6156, 0x6017, 0xf300, 0x6003, 0x0001, 0x6007, 0x0041,
++	0x080c, 0x7bcb, 0x080c, 0x8125, 0x08b0, 0x00b6, 0x7110, 0xd1bc,
++	0x01e8, 0x7020, 0x2060, 0x9c84, 0x0007, 0x11c0, 0x9c82, 0x1cd0,
++	0x02a8, 0x6860, 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110,
++	0x2158, 0xb910, 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130,
++	0x7124, 0x610a, 0x2009, 0x0045, 0x080c, 0x95ce, 0x7817, 0x0140,
++	0x2001, 0x19bd, 0x2004, 0x9005, 0x090c, 0x8125, 0x00be, 0x0005,
++	0x080c, 0x2e39, 0x1168, 0x7010, 0x9084, 0xff00, 0x8007, 0x9086,
++	0x0000, 0x1130, 0x9184, 0x000f, 0x908a, 0x0006, 0x1208, 0x000b,
++	0x0005, 0x75df, 0x75e0, 0x75df, 0x75df, 0x763f, 0x764b, 0x0005,
++	0x00b6, 0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904, 0x763d,
++	0x700c, 0x7108, 0x080c, 0x23fd, 0x1904, 0x763d, 0x080c, 0x5bb0,
++	0x1904, 0x763d, 0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x01d8, 0x080c,
++	0x5f2d, 0x0118, 0x9086, 0x0004, 0x1588, 0x00c6, 0x080c, 0x7657,
++	0x00ce, 0x05d8, 0x080c, 0x94fe, 0x2b08, 0x05b8, 0x6112, 0x080c,
++	0xb4e6, 0x6023, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c,
++	0x95ce, 0x0458, 0x080c, 0x5f2d, 0x0148, 0x9086, 0x0004, 0x0130,
++	0x080c, 0x5f35, 0x0118, 0x9086, 0x0004, 0x1180, 0x080c, 0x94fe,
++	0x2b08, 0x01d8, 0x6112, 0x080c, 0xb4e6, 0x6023, 0x0005, 0x7120,
++	0x610a, 0x2009, 0x0088, 0x080c, 0x95ce, 0x0078, 0x080c, 0x94fe,
++	0x2b08, 0x0158, 0x6112, 0x080c, 0xb4e6, 0x6023, 0x0004, 0x7120,
++	0x610a, 0x2009, 0x0001, 0x080c, 0x95ce, 0x00be, 0x0005, 0x7110,
++	0xd1bc, 0x0140, 0x00a1, 0x0130, 0x7124, 0x610a, 0x2009, 0x0089,
++	0x080c, 0x95ce, 0x0005, 0x7110, 0xd1bc, 0x0140, 0x0041, 0x0130,
++	0x7124, 0x610a, 0x2009, 0x008a, 0x080c, 0x95ce, 0x0005, 0x7020,
++	0x2060, 0x9c84, 0x0007, 0x1158, 0x9c82, 0x1cd0, 0x0240, 0x2001,
++	0x1818, 0x2004, 0x9c02, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006,
++	0x0ce8, 0x00b6, 0x7110, 0xd1bc, 0x11d8, 0x7024, 0x2060, 0x9c84,
++	0x0007, 0x11b0, 0x9c82, 0x1cd0, 0x0298, 0x6860, 0x9c02, 0x1280,
++	0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1140,
++	0x700c, 0xb914, 0x9106, 0x1120, 0x2009, 0x0051, 0x080c, 0x95ce,
++	0x7817, 0x0140, 0x2001, 0x19bd, 0x2004, 0x9005, 0x090c, 0x8125,
++	0x00be, 0x0005, 0x2031, 0x0105, 0x0069, 0x0005, 0x2031, 0x0206,
++	0x0049, 0x0005, 0x2031, 0x0207, 0x0029, 0x0005, 0x2031, 0x0213,
++	0x0009, 0x0005, 0x00c6, 0x0096, 0x00f6, 0x7000, 0x9084, 0xf000,
++	0x9086, 0xc000, 0x05d0, 0x080c, 0x94fe, 0x05b8, 0x0066, 0x00c6,
++	0x0046, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x23fd,
++	0x15a0, 0x080c, 0x5bb0, 0x1588, 0xbe12, 0xbd16, 0x2b00, 0x004e,
++	0x00ce, 0x6012, 0x080c, 0xb4e6, 0x080c, 0x0fae, 0x0510, 0x2900,
++	0x605a, 0x9006, 0xa802, 0xa866, 0xac6a, 0xa85c, 0x90f8, 0x001b,
++	0x20a9, 0x000e, 0xa860, 0x20e8, 0x20e1, 0x0000, 0x2fa0, 0x2e98,
++	0x4003, 0x006e, 0x6616, 0x6007, 0x003e, 0x6023, 0x0001, 0x6003,
++	0x0001, 0x080c, 0x7c1d, 0x080c, 0x8125, 0x00fe, 0x009e, 0x00ce,
++	0x0005, 0x080c, 0x9554, 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8,
++	0x00c6, 0x7000, 0x908c, 0xff00, 0x9184, 0xf000, 0x810f, 0x9086,
++	0x2000, 0x1904, 0x7747, 0x9186, 0x0022, 0x15f0, 0x2001, 0x0111,
++	0x2004, 0x9005, 0x1904, 0x7749, 0x7030, 0x908e, 0x0400, 0x0904,
++	0x7749, 0x908e, 0x6000, 0x05e8, 0x908e, 0x5400, 0x05d0, 0x908e,
++	0x0300, 0x11d8, 0x2009, 0x1836, 0x210c, 0xd18c, 0x1590, 0xd1a4,
++	0x1580, 0x080c, 0x5eeb, 0x0558, 0x68a8, 0x9084, 0x00ff, 0x7100,
++	0x918c, 0x00ff, 0x9106, 0x1518, 0x6878, 0x69a8, 0x918c, 0xff00,
++	0x9105, 0x7104, 0x9106, 0x11d8, 0x00e0, 0x2009, 0x0103, 0x210c,
++	0xd1b4, 0x11a8, 0x908e, 0x5200, 0x09e8, 0x908e, 0x0500, 0x09d0,
++	0x908e, 0x5000, 0x09b8, 0x0058, 0x9186, 0x0023, 0x1140, 0x080c,
++	0x7657, 0x0128, 0x6004, 0x9086, 0x0002, 0x0118, 0x0000, 0x9006,
++	0x0010, 0x9085, 0x0001, 0x00ce, 0x0005, 0x2071, 0x19c7, 0x7003,
++	0x0003, 0x700f, 0x0361, 0x9006, 0x701a, 0x7076, 0x7012, 0x7017,
++	0x1cd0, 0x7007, 0x0000, 0x7026, 0x702b, 0x8b66, 0x7032, 0x7037,
++	0x8bc9, 0x703f, 0xffff, 0x7043, 0xffff, 0x7046, 0x704b, 0x4c8b,
++	0x704e, 0x705f, 0x78ae, 0x080c, 0x0fc7, 0x090c, 0x0d84, 0x2900,
++	0x703a, 0xa867, 0x0003, 0xa86f, 0x0100, 0xa8ab, 0xdcb0, 0x0005,
++	0x2071, 0x19c7, 0x1d04, 0x7809, 0x2091, 0x6000, 0x700c, 0x8001,
++	0x700e, 0x1510, 0x2001, 0x1874, 0x2004, 0xd0c4, 0x0158, 0x3a00,
++	0xd08c, 0x1140, 0x20d1, 0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000,
++	0x080c, 0x0d84, 0x700f, 0x0361, 0x7007, 0x0001, 0x0126, 0x2091,
++	0x8000, 0x080c, 0x78f3, 0x7044, 0x900d, 0x0148, 0x8109, 0x7146,
++	0x1130, 0x7048, 0x080f, 0x0018, 0x0126, 0x2091, 0x8000, 0x7024,
++	0x900d, 0x0188, 0x7020, 0x8001, 0x7022, 0x1168, 0x7023, 0x0009,
++	0x8109, 0x7126, 0x9186, 0x03e8, 0x1110, 0x7028, 0x080f, 0x81ff,
++	0x1110, 0x7028, 0x080f, 0x7030, 0x900d, 0x0180, 0x702c, 0x8001,
++	0x702e, 0x1160, 0x702f, 0x0009, 0x8109, 0x7132, 0x0128, 0x9184,
++	0x007f, 0x090c, 0x8c48, 0x0010, 0x7034, 0x080f, 0x703c, 0x9005,
++	0x0118, 0x0310, 0x8001, 0x703e, 0x7040, 0x9005, 0x0118, 0x0310,
++	0x8001, 0x7042, 0x7050, 0x900d, 0x0168, 0x704c, 0x8001, 0x704e,
++	0x1148, 0x704f, 0x0009, 0x8109, 0x7152, 0x1120, 0x7154, 0x7152,
++	0x705c, 0x080f, 0x7018, 0x900d, 0x01d8, 0x0016, 0x7074, 0x900d,
++	0x0158, 0x7070, 0x8001, 0x7072, 0x1138, 0x7073, 0x0009, 0x8109,
++	0x7176, 0x1110, 0x7078, 0x080f, 0x001e, 0x7008, 0x8001, 0x700a,
++	0x1138, 0x700b, 0x0009, 0x8109, 0x711a, 0x1110, 0x701c, 0x080f,
++	0x012e, 0x7004, 0x0002, 0x782f, 0x7830, 0x784a, 0x00e6, 0x2071,
++	0x19c7, 0x7018, 0x9005, 0x1120, 0x711a, 0x721e, 0x700b, 0x0009,
++	0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x19c7, 0x701c, 0x9206,
++	0x1110, 0x701a, 0x701e, 0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071,
++	0x19c7, 0xb888, 0x9102, 0x0208, 0xb98a, 0x00ee, 0x0005, 0x0005,
++	0x00b6, 0x7110, 0x080c, 0x5c0d, 0x1158, 0xb888, 0x8001, 0x0240,
++	0xb88a, 0x1130, 0x0126, 0x2091, 0x8000, 0x080c, 0x8125, 0x012e,
++	0x8108, 0x9182, 0x0800, 0x0218, 0x900e, 0x7007, 0x0002, 0x7112,
++	0x00be, 0x0005, 0x7014, 0x2060, 0x0126, 0x2091, 0x8000, 0x6040,
++	0x9005, 0x0128, 0x8001, 0x6042, 0x1110, 0x080c, 0xb38b, 0x6018,
++	0x9005, 0x0510, 0x8001, 0x601a, 0x11f8, 0x6120, 0x9186, 0x0003,
++	0x0118, 0x9186, 0x0006, 0x11b0, 0x6014, 0x2048, 0xa884, 0x908a,
++	0x199a, 0x0280, 0x9082, 0x1999, 0xa886, 0x908a, 0x199a, 0x0210,
++	0x2001, 0x1999, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c,
++	0xd0e4, 0x0110, 0x080c, 0xaddd, 0x012e, 0x9c88, 0x0018, 0x7116,
++	0x2001, 0x1818, 0x2004, 0x9102, 0x0220, 0x7017, 0x1cd0, 0x7007,
++	0x0000, 0x0005, 0x00e6, 0x2071, 0x19c7, 0x7027, 0x07d0, 0x7023,
++	0x0009, 0x00ee, 0x0005, 0x2001, 0x19d0, 0x2003, 0x0000, 0x0005,
++	0x00e6, 0x2071, 0x19c7, 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005,
++	0x2011, 0x19d3, 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19c7,
++	0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x0086, 0x0026,
++	0x7058, 0x8000, 0x705a, 0x2001, 0x19d5, 0x2044, 0xa06c, 0x9086,
++	0x0000, 0x0150, 0x706c, 0xa09a, 0x7068, 0xa096, 0x7064, 0xa092,
++	0x7060, 0xa08e, 0x080c, 0x108c, 0x002e, 0x008e, 0x0005, 0x0006,
++	0x0016, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6,
++	0x0156, 0x080c, 0x7778, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce,
++	0x00be, 0x00ae, 0x009e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071,
++	0x19c7, 0x7176, 0x727a, 0x7073, 0x0009, 0x00ee, 0x0005, 0x00e6,
++	0x0006, 0x2071, 0x19c7, 0x7078, 0x9206, 0x1110, 0x7076, 0x707a,
++	0x000e, 0x00ee, 0x0005, 0x2069, 0x1800, 0x69ec, 0xd1e4, 0x1518,
++	0x0026, 0xd1ec, 0x0140, 0x684c, 0x9082, 0x0200, 0x0288, 0x8117,
++	0x9294, 0x00c0, 0x0088, 0x9184, 0x0007, 0x01a0, 0x8109, 0x9184,
++	0x0007, 0x0110, 0x69ee, 0x0070, 0x8107, 0x9084, 0x0007, 0x910d,
++	0x8107, 0x9106, 0x9094, 0x00c0, 0x9184, 0xff3f, 0x9205, 0x68ee,
++	0x080c, 0x0e8d, 0x002e, 0x0005, 0x00c6, 0x2061, 0x1a3d, 0x00ce,
++	0x0005, 0x9184, 0x000f, 0x8003, 0x8003, 0x8003, 0x9080, 0x1a3d,
++	0x2060, 0x0005, 0xa884, 0x908a, 0x199a, 0x1638, 0x9005, 0x1150,
++	0x00c6, 0x2061, 0x1a3d, 0x6014, 0x00ce, 0x9005, 0x1130, 0x2001,
++	0x001e, 0x0018, 0x908e, 0xffff, 0x01b0, 0x8003, 0x800b, 0x810b,
++	0x9108, 0x611a, 0xa87c, 0x908c, 0x00c0, 0x918e, 0x00c0, 0x0904,
++	0x79b4, 0xd0b4, 0x1168, 0xd0bc, 0x1904, 0x798d, 0x2009, 0x0006,
++	0x080c, 0x79e1, 0x0005, 0x900e, 0x0c60, 0x2001, 0x1999, 0x08b0,
++	0xd0fc, 0x0160, 0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904,
++	0x79db, 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, 0x6024, 0xd0d4,
++	0x11e8, 0x2009, 0x1874, 0x2104, 0xd084, 0x1138, 0x87ff, 0x1120,
++	0x2009, 0x0043, 0x0804, 0x95ce, 0x0005, 0x87ff, 0x1de8, 0x2009,
++	0x0042, 0x0804, 0x95ce, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be,
++	0xd1ac, 0x0d20, 0x6024, 0xc0cd, 0x6026, 0x0c00, 0xc0d4, 0x6026,
++	0xa890, 0x602e, 0xa88c, 0x6032, 0x08e0, 0xd0fc, 0x0160, 0x908c,
++	0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x79db, 0x908c, 0x2020,
++	0x918e, 0x2020, 0x0170, 0x0076, 0x00f6, 0x2c78, 0x080c, 0x150d,
++	0x00fe, 0x007e, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0x95ce,
++	0x0005, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d58,
++	0x6124, 0xc1cd, 0x6126, 0x0c38, 0xd0fc, 0x0188, 0x908c, 0x2020,
++	0x918e, 0x2020, 0x01a8, 0x9084, 0x0003, 0x908e, 0x0002, 0x0148,
++	0x87ff, 0x1120, 0x2009, 0x0041, 0x080c, 0x95ce, 0x0005, 0x00b9,
++	0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, 0x95ce, 0x0cb0,
++	0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6124,
++	0xc1cd, 0x6126, 0x0c00, 0x2009, 0x0004, 0x0019, 0x0005, 0x2009,
++	0x0001, 0x0096, 0x080c, 0xb0ad, 0x0518, 0x6014, 0x2048, 0xa982,
++	0xa800, 0x6016, 0x9186, 0x0001, 0x1188, 0xa97c, 0x918c, 0x8100,
++	0x918e, 0x8100, 0x1158, 0x00c6, 0x2061, 0x1a3d, 0x6200, 0xd28c,
++	0x1120, 0x6204, 0x8210, 0x0208, 0x6206, 0x00ce, 0x080c, 0x5ff7,
++	0x6014, 0x904d, 0x0076, 0x2039, 0x0000, 0x190c, 0x792a, 0x007e,
++	0x009e, 0x0005, 0x0156, 0x00c6, 0x2061, 0x1a3d, 0x6000, 0x81ff,
++	0x0110, 0x9205, 0x0008, 0x9204, 0x6002, 0x00ce, 0x015e, 0x0005,
++	0x6800, 0xd08c, 0x1138, 0x6808, 0x9005, 0x0120, 0x8001, 0x680a,
++	0x9085, 0x0001, 0x0005, 0x0126, 0x2091, 0x8000, 0x0036, 0x0046,
++	0x20a9, 0x0010, 0x9006, 0x8004, 0x2019, 0x0100, 0x231c, 0x93a6,
++	0x0008, 0x1118, 0x8086, 0x818e, 0x0020, 0x80f6, 0x3e00, 0x81f6,
++	0x3e08, 0x1208, 0x9200, 0x1f04, 0x7a2c, 0x93a6, 0x0008, 0x1118,
++	0x8086, 0x818e, 0x0020, 0x80f6, 0x3e00, 0x81f6, 0x3e08, 0x004e,
++	0x003e, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0076, 0x0156,
++	0x20a9, 0x0010, 0x9005, 0x0510, 0x911a, 0x1600, 0x8213, 0x2039,
++	0x0100, 0x273c, 0x97be, 0x0008, 0x1110, 0x818d, 0x0010, 0x81f5,
++	0x3e08, 0x0228, 0x911a, 0x1220, 0x1f04, 0x7a56, 0x0028, 0x911a,
++	0x2308, 0x8210, 0x1f04, 0x7a56, 0x0006, 0x3200, 0x9084, 0xefff,
++	0x2080, 0x000e, 0x015e, 0x007e, 0x012e, 0x0005, 0x0006, 0x3200,
++	0x9085, 0x1000, 0x0ca8, 0x0126, 0x2091, 0x2800, 0x2079, 0x19b4,
++	0x012e, 0x00d6, 0x2069, 0x19b4, 0x6803, 0x0005, 0x0156, 0x0146,
++	0x01d6, 0x20e9, 0x0000, 0x2069, 0x0200, 0x080c, 0x9363, 0x0401,
++	0x080c, 0x934e, 0x00e9, 0x080c, 0x9351, 0x00d1, 0x080c, 0x9354,
++	0x00b9, 0x080c, 0x9357, 0x00a1, 0x080c, 0x935a, 0x0089, 0x080c,
++	0x935d, 0x0071, 0x080c, 0x9360, 0x0059, 0x01de, 0x014e, 0x015e,
++	0x2069, 0x0004, 0x2d04, 0x9085, 0x8001, 0x206a, 0x00de, 0x0005,
++	0x20a9, 0x0020, 0x20a1, 0x0240, 0x9006, 0x4004, 0x0005, 0x00c6,
++	0x6027, 0x0001, 0x7804, 0x9084, 0x0007, 0x0002, 0x7ac8, 0x7aec,
++	0x7b36, 0x7ace, 0x7aec, 0x7ac8, 0x7ac6, 0x7ac6, 0x080c, 0x0d84,
++	0x080c, 0x7893, 0x080c, 0x8125, 0x00ce, 0x0005, 0x62c0, 0x82ff,
++	0x1110, 0x00ce, 0x0005, 0x2011, 0x554d, 0x080c, 0x781a, 0x7828,
++	0x9092, 0x00c8, 0x1228, 0x8000, 0x782a, 0x080c, 0x558a, 0x0c88,
++	0x62c0, 0x080c, 0x9367, 0x080c, 0x554d, 0x7807, 0x0003, 0x7827,
++	0x0000, 0x782b, 0x0000, 0x0c28, 0x080c, 0x7893, 0x6220, 0xd2a4,
++	0x0178, 0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824, 0x9065,
++	0x090c, 0x0d84, 0x2009, 0x0013, 0x080c, 0x95ce, 0x00ce, 0x0005,
++	0x00c6, 0x7824, 0x9065, 0x090c, 0x0d84, 0x7804, 0x9086, 0x0004,
++	0x0904, 0x7b74, 0x7828, 0x9092, 0xc350, 0x1230, 0x8000, 0x782a,
++	0x00ce, 0x080c, 0x8b2c, 0x0c50, 0x2011, 0x0130, 0x2214, 0x080c,
++	0x9367, 0x6104, 0x9186, 0x0003, 0x1188, 0x00e6, 0x2071, 0x1800,
++	0x70e4, 0x00ee, 0xd08c, 0x0150, 0x00c6, 0x00e6, 0x2061, 0x0100,
++	0x2071, 0x1800, 0x080c, 0x55a0, 0x00ee, 0x00ce, 0x080c, 0xcd1f,
++	0x2009, 0x0014, 0x080c, 0x95ce, 0x00ce, 0x0840, 0x2001, 0x19d0,
++	0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824,
++	0x9065, 0x090c, 0x0d84, 0x2009, 0x0013, 0x080c, 0x9620, 0x00ce,
++	0x0005, 0x00b6, 0x00c6, 0x00d6, 0x7824, 0x9005, 0x090c, 0x0d84,
++	0x781c, 0x905d, 0x090c, 0x0d84, 0x080c, 0x9367, 0xb800, 0xc0dc,
++	0xb802, 0x7924, 0x2160, 0x080c, 0x9554, 0xb93c, 0x81ff, 0x090c,
++	0x0d84, 0x8109, 0xb93e, 0xb854, 0x9015, 0x0110, 0x7a1e, 0x0010,
++	0x7918, 0x791e, 0x7807, 0x0000, 0x7827, 0x0000, 0x00de, 0x00ce,
++	0x00be, 0x080c, 0x8125, 0x0898, 0x6104, 0x9186, 0x0002, 0x0128,
++	0x9186, 0x0004, 0x0110, 0x0804, 0x7b0a, 0x7808, 0x9c06, 0x0904,
++	0x7b0a, 0x080c, 0x8026, 0x080c, 0x7c1d, 0x00ce, 0x080c, 0x8125,
++	0x0804, 0x7afe, 0x00c6, 0x6024, 0x6027, 0x0002, 0xd0f4, 0x1580,
++	0x62c8, 0x60c4, 0x9205, 0x1170, 0x783c, 0x9065, 0x0130, 0x2009,
++	0x0049, 0x080c, 0x95ce, 0x00ce, 0x0005, 0x2011, 0x19d3, 0x2013,
++	0x0000, 0x0cc8, 0x793c, 0x81ff, 0x0dc0, 0x7944, 0x9192, 0x7530,
++	0x12f0, 0x8108, 0x7946, 0x793c, 0x9188, 0x0008, 0x210c, 0x918e,
++	0x0006, 0x1138, 0x6014, 0x9084, 0x1984, 0x9085, 0x0012, 0x6016,
++	0x0c10, 0x6014, 0x9084, 0x1984, 0x9085, 0x0016, 0x6016, 0x08d8,
++	0x793c, 0x2160, 0x2009, 0x004a, 0x080c, 0x95ce, 0x08a0, 0x7848,
++	0xc085, 0x784a, 0x0880, 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091,
++	0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19b4, 0x6020, 0x8000,
++	0x6022, 0x6010, 0x9005, 0x0148, 0x9080, 0x0003, 0x2102, 0x6112,
++	0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, 0x6116, 0x6112, 0x0cc0,
++	0x00d6, 0x2069, 0x19b4, 0xb800, 0xd0d4, 0x01b8, 0x6820, 0x8000,
++	0x6822, 0x9086, 0x0001, 0x1110, 0x2b00, 0x681e, 0x2001, 0x180c,
++	0x2004, 0xd0fc, 0x0118, 0x00de, 0x0804, 0x8125, 0x6804, 0x9084,
++	0x0007, 0x0804, 0x813c, 0x00de, 0x0005, 0xc0d5, 0xb802, 0x6818,
++	0x9005, 0x0168, 0xb856, 0xb85b, 0x0000, 0x0086, 0x0006, 0x2b00,
++	0x681a, 0x008e, 0xa05a, 0x008e, 0x2069, 0x19b4, 0x08b8, 0xb856,
++	0xb85a, 0x2b00, 0x681a, 0x681e, 0x0888, 0x0006, 0x0016, 0x00c6,
++	0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19b4,
++	0x6020, 0x8000, 0x6022, 0x6008, 0x9005, 0x0148, 0x9080, 0x0003,
++	0x2102, 0x610a, 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, 0x610e,
++	0x610a, 0x0cc0, 0x00c6, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19b4,
++	0x6034, 0x9005, 0x0130, 0x9080, 0x0003, 0x2102, 0x6136, 0x00ce,
++	0x0005, 0x613a, 0x6136, 0x00ce, 0x0005, 0x00f6, 0x00e6, 0x00d6,
++	0x00c6, 0x00b6, 0x0096, 0x0076, 0x0066, 0x0056, 0x0036, 0x0026,
++	0x0016, 0x0006, 0x0126, 0x902e, 0x2071, 0x19b4, 0x7638, 0x2660,
++	0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, 0x7cc4, 0x6010, 0x2058,
++	0xb8a0, 0x9206, 0x1904, 0x7cbf, 0x87ff, 0x0120, 0x6054, 0x9106,
++	0x1904, 0x7cbf, 0x703c, 0x9c06, 0x1178, 0x0036, 0x2019, 0x0001,
++	0x080c, 0x8dfe, 0x7033, 0x0000, 0x9006, 0x703e, 0x7042, 0x7046,
++	0x704a, 0x003e, 0x2029, 0x0001, 0x7038, 0x9c36, 0x1110, 0x660c,
++	0x763a, 0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00,
++	0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06,
++	0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xb0ad,
++	0x01c8, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1590, 0xa867,
++	0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0076, 0x080c,
++	0xb374, 0x080c, 0xcc6b, 0x080c, 0x61a9, 0x007e, 0x003e, 0x001e,
++	0x080c, 0xb278, 0x080c, 0x9584, 0x00ce, 0x0804, 0x7c63, 0x2c78,
++	0x600c, 0x2060, 0x0804, 0x7c63, 0x85ff, 0x0120, 0x0036, 0x080c,
++	0x820b, 0x003e, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, 0x005e,
++	0x006e, 0x007e, 0x009e, 0x00be, 0x00ce, 0x00de, 0x00ee, 0x00fe,
++	0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0076,
++	0x080c, 0xcc6b, 0x080c, 0xc970, 0x007e, 0x003e, 0x001e, 0x0890,
++	0x6020, 0x9086, 0x000a, 0x0904, 0x7ca9, 0x0804, 0x7ca7, 0x0006,
++	0x0066, 0x0096, 0x00c6, 0x00d6, 0x00f6, 0x9036, 0x0126, 0x2091,
++	0x8000, 0x2079, 0x19b4, 0x7838, 0x9065, 0x0904, 0x7d3f, 0x600c,
++	0x0006, 0x600f, 0x0000, 0x783c, 0x9c06, 0x1168, 0x0036, 0x2019,
++	0x0001, 0x080c, 0x8dfe, 0x7833, 0x0000, 0x901e, 0x7b3e, 0x7b42,
++	0x7b46, 0x7b4a, 0x003e, 0x080c, 0xb0ad, 0x0520, 0x6014, 0x2048,
++	0x6020, 0x9086, 0x0003, 0x1568, 0x3e08, 0x918e, 0x0002, 0x1188,
++	0x6010, 0x9005, 0x0170, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc,
++	0x0140, 0x6040, 0x9005, 0x1180, 0x2001, 0x1955, 0x2004, 0x6042,
++	0x0058, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x61a9,
++	0x080c, 0xb278, 0x080c, 0x9584, 0x000e, 0x0804, 0x7cfc, 0x7e3a,
++	0x7e36, 0x012e, 0x00fe, 0x00de, 0x00ce, 0x009e, 0x006e, 0x000e,
++	0x0005, 0x6020, 0x9086, 0x0006, 0x1118, 0x080c, 0xc970, 0x0c50,
++	0x6020, 0x9086, 0x000a, 0x09f8, 0x08e0, 0x0016, 0x0026, 0x0086,
++	0x9046, 0x0099, 0x080c, 0x7e2b, 0x008e, 0x002e, 0x001e, 0x0005,
++	0x00f6, 0x0126, 0x2079, 0x19b4, 0x2091, 0x8000, 0x080c, 0x7ec2,
++	0x080c, 0x7f3a, 0x012e, 0x00fe, 0x0005, 0x00b6, 0x0096, 0x00f6,
++	0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, 0x2091,
++	0x8000, 0x2071, 0x19b4, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0904,
++	0x7dfc, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x7df7, 0x88ff,
++	0x0120, 0x6054, 0x9106, 0x1904, 0x7df7, 0x7024, 0x9c06, 0x1550,
++	0x2069, 0x0100, 0x68c0, 0x9005, 0x0508, 0x080c, 0x7893, 0x080c,
++	0x8b50, 0x68c3, 0x0000, 0x080c, 0x900f, 0x7027, 0x0000, 0x0036,
++	0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100,
++	0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 0x2069, 0x0100, 0x6824,
++	0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0020, 0x6003, 0x0009,
++	0x630a, 0x04e8, 0x7014, 0x9c36, 0x1110, 0x660c, 0x7616, 0x7010,
++	0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7012, 0x0010,
++	0x7013, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e,
++	0x0008, 0x2678, 0x600f, 0x0000, 0x6014, 0x2048, 0x080c, 0xb0ad,
++	0x01b8, 0x6020, 0x9086, 0x0003, 0x1550, 0xa867, 0x0103, 0xab7a,
++	0xa877, 0x0000, 0x0016, 0x0036, 0x0086, 0x080c, 0xb374, 0x080c,
++	0xcc6b, 0x080c, 0x61a9, 0x008e, 0x003e, 0x001e, 0x080c, 0xb278,
++	0x080c, 0x9584, 0x080c, 0x8eec, 0x00ce, 0x0804, 0x7d7e, 0x2c78,
++	0x600c, 0x2060, 0x0804, 0x7d7e, 0x012e, 0x000e, 0x001e, 0x006e,
++	0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x00be, 0x0005, 0x6020,
++	0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0086, 0x080c, 0xcc6b,
++	0x080c, 0xc970, 0x008e, 0x003e, 0x001e, 0x08d0, 0x080c, 0x9e99,
++	0x6020, 0x9086, 0x0002, 0x1130, 0x6004, 0x9086, 0x0085, 0x0904,
++	0x7ddd, 0x0870, 0x6020, 0x9086, 0x0005, 0x1950, 0x6004, 0x9086,
++	0x0085, 0x0d08, 0x0828, 0x00b6, 0x00a6, 0x0096, 0x00c6, 0x0006,
++	0x0126, 0x2091, 0x8000, 0x9280, 0x1000, 0x2004, 0x905d, 0x0904,
++	0x7ebb, 0x00f6, 0x00e6, 0x00d6, 0x0066, 0x2071, 0x19b4, 0xbe54,
++	0x7018, 0x9b06, 0x1108, 0x761a, 0x701c, 0x9b06, 0x1130, 0x86ff,
++	0x1118, 0x7018, 0x701e, 0x0008, 0x761e, 0xb858, 0x904d, 0x0108,
++	0xae56, 0x96d5, 0x0000, 0x0110, 0x2900, 0xb05a, 0xb857, 0x0000,
++	0xb85b, 0x0000, 0xb800, 0xc0d4, 0xc0dc, 0xb802, 0x080c, 0x5b43,
++	0x0904, 0x7eb7, 0x7624, 0x86ff, 0x0904, 0x7ea6, 0x9680, 0x0005,
++	0x2004, 0x9906, 0x15d8, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005,
++	0x0560, 0x080c, 0x7893, 0x080c, 0x8b50, 0x68c3, 0x0000, 0x080c,
++	0x900f, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384,
++	0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x28a5, 0x9006, 0x080c,
++	0x28a5, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001,
++	0x003e, 0x00de, 0x00c6, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e,
++	0x2660, 0x080c, 0x9584, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660,
++	0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x7e5e, 0x89ff, 0x0158,
++	0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xb374, 0x080c,
++	0xcc6b, 0x080c, 0x61a9, 0x080c, 0x8eec, 0x0804, 0x7e5e, 0x006e,
++	0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce, 0x009e, 0x00ae,
++	0x00be, 0x0005, 0x0096, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x9036,
++	0x7814, 0x9065, 0x0904, 0x7f17, 0x600c, 0x0006, 0x600f, 0x0000,
++	0x7824, 0x9c06, 0x1558, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0508,
++	0x080c, 0x7893, 0x080c, 0x8b50, 0x68c3, 0x0000, 0x080c, 0x900f,
++	0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000,
++	0x0138, 0x2001, 0x0100, 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5,
++	0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e,
++	0x0028, 0x6003, 0x0009, 0x630a, 0x2c30, 0x00b0, 0x6014, 0x2048,
++	0x080c, 0xb0ab, 0x0168, 0x6020, 0x9086, 0x0003, 0x11c0, 0xa867,
++	0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x61a9, 0x080c, 0xb278,
++	0x080c, 0x9584, 0x080c, 0x8eec, 0x000e, 0x0804, 0x7ec9, 0x7e16,
++	0x7e12, 0x00de, 0x00ce, 0x006e, 0x000e, 0x009e, 0x0005, 0x6020,
++	0x9086, 0x0006, 0x1118, 0x080c, 0xc970, 0x0c50, 0x080c, 0x9e99,
++	0x6020, 0x9086, 0x0002, 0x1128, 0x6004, 0x9086, 0x0085, 0x09b8,
++	0x08f8, 0x6020, 0x9086, 0x0005, 0x19d8, 0x6004, 0x9086, 0x0085,
++	0x0d50, 0x08b0, 0x0006, 0x0066, 0x0096, 0x00b6, 0x00c6, 0x00d6,
++	0x7818, 0x905d, 0x0904, 0x7fb7, 0xb854, 0x0006, 0x9006, 0xb856,
++	0xb85a, 0xb800, 0xc0d4, 0xc0dc, 0xb802, 0x080c, 0x5b43, 0x0904,
++	0x7fb4, 0x7e24, 0x86ff, 0x0904, 0x7fa7, 0x9680, 0x0005, 0x2004,
++	0x9906, 0x1904, 0x7fa7, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005,
++	0x05e8, 0x080c, 0x7893, 0x080c, 0x8b50, 0x68c3, 0x0000, 0x080c,
++	0x900f, 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384,
++	0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x28a5, 0x9006, 0x080c,
++	0x28a5, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001,
++	0x003e, 0x00de, 0x00c6, 0x3e08, 0x918e, 0x0002, 0x1168, 0xb800,
++	0xd0bc, 0x0150, 0x9680, 0x0010, 0x200c, 0x81ff, 0x1508, 0x2009,
++	0x1955, 0x210c, 0x2102, 0x00e0, 0xb83c, 0x9005, 0x0110, 0x8001,
++	0xb83e, 0x2660, 0x080c, 0x9584, 0x00ce, 0x0048, 0x00de, 0x00c6,
++	0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x7f4d, 0x89ff,
++	0x0138, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x61a9,
++	0x080c, 0x8eec, 0x0804, 0x7f4d, 0x000e, 0x0804, 0x7f41, 0x781e,
++	0x781a, 0x00de, 0x00ce, 0x00be, 0x009e, 0x006e, 0x000e, 0x0005,
++	0x00e6, 0x00d6, 0x0096, 0x0066, 0xb800, 0xd0dc, 0x01a0, 0xb84c,
++	0x904d, 0x0188, 0xa878, 0x9606, 0x1170, 0x2071, 0x19b4, 0x7024,
++	0x9035, 0x0148, 0x9080, 0x0005, 0x2004, 0x9906, 0x1120, 0xb800,
++	0xc0dc, 0xb802, 0x0029, 0x006e, 0x009e, 0x00de, 0x00ee, 0x0005,
++	0x00f6, 0x2079, 0x0100, 0x78c0, 0x9005, 0x1138, 0x00c6, 0x2660,
++	0x6003, 0x0009, 0x630a, 0x00ce, 0x04b8, 0x080c, 0x8b50, 0x78c3,
++	0x0000, 0x080c, 0x900f, 0x7027, 0x0000, 0x0036, 0x2079, 0x0140,
++	0x7b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x28a5,
++	0x9006, 0x080c, 0x28a5, 0x2079, 0x0100, 0x7824, 0xd084, 0x0110,
++	0x7827, 0x0001, 0x080c, 0x900f, 0x003e, 0x080c, 0x5b43, 0x00c6,
++	0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660, 0x080c, 0x9554,
++	0x00ce, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xb374,
++	0x080c, 0x61a9, 0x080c, 0x8eec, 0x00fe, 0x0005, 0x00b6, 0x00e6,
++	0x00c6, 0x2001, 0x180c, 0x2014, 0xc2e4, 0x2202, 0x2071, 0x19b4,
++	0x7004, 0x9084, 0x0007, 0x0002, 0x803e, 0x8042, 0x8059, 0x8082,
++	0x80c0, 0x803e, 0x8059, 0x803c, 0x080c, 0x0d84, 0x00ce, 0x00ee,
++	0x00be, 0x0005, 0x7024, 0x9065, 0x0148, 0x7020, 0x8001, 0x7022,
++	0x600c, 0x9015, 0x0158, 0x7216, 0x600f, 0x0000, 0x7007, 0x0000,
++	0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x7216, 0x7212,
++	0x0ca8, 0x6010, 0x2058, 0x080c, 0x5b43, 0xb800, 0xc0dc, 0xb802,
++	0x7007, 0x0000, 0x7027, 0x0000, 0x7020, 0x8001, 0x7022, 0x1148,
++	0x2001, 0x180c, 0x2014, 0xd2ec, 0x1180, 0x00ce, 0x00ee, 0x00be,
++	0x0005, 0xb854, 0x9015, 0x0120, 0x721e, 0x080c, 0x8125, 0x0ca8,
++	0x7218, 0x721e, 0x080c, 0x8125, 0x0c80, 0xc2ec, 0x2202, 0x080c,
++	0x820b, 0x0c58, 0x7024, 0x9065, 0x05b8, 0x700c, 0x9c06, 0x1160,
++	0x080c, 0x8eec, 0x600c, 0x9015, 0x0120, 0x720e, 0x600f, 0x0000,
++	0x0448, 0x720e, 0x720a, 0x0430, 0x7014, 0x9c06, 0x1160, 0x080c,
++	0x8eec, 0x600c, 0x9015, 0x0120, 0x7216, 0x600f, 0x0000, 0x00d0,
++	0x7216, 0x7212, 0x00b8, 0x6020, 0x9086, 0x0003, 0x1198, 0x6010,
++	0x2058, 0x080c, 0x5b43, 0xb800, 0xc0dc, 0xb802, 0x080c, 0x8eec,
++	0x701c, 0x9065, 0x0138, 0xb854, 0x9015, 0x0110, 0x721e, 0x0010,
++	0x7218, 0x721e, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005,
++	0x7024, 0x9065, 0x0140, 0x080c, 0x8eec, 0x600c, 0x9015, 0x0158,
++	0x720e, 0x600f, 0x0000, 0x080c, 0x900f, 0x7027, 0x0000, 0x00ce,
++	0x00ee, 0x00be, 0x0005, 0x720e, 0x720a, 0x0ca8, 0x00d6, 0x2069,
++	0x19b4, 0x6830, 0x9084, 0x0003, 0x0002, 0x80e3, 0x80e5, 0x8109,
++	0x80e1, 0x080c, 0x0d84, 0x00de, 0x0005, 0x00c6, 0x6840, 0x9086,
++	0x0001, 0x01b8, 0x683c, 0x9065, 0x0130, 0x600c, 0x9015, 0x0170,
++	0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011,
++	0x19d3, 0x2013, 0x0000, 0x00ce, 0x00de, 0x0005, 0x683a, 0x6836,
++	0x0c90, 0x6843, 0x0000, 0x6838, 0x9065, 0x0d68, 0x6003, 0x0003,
++	0x0c50, 0x00c6, 0x9006, 0x6842, 0x6846, 0x684a, 0x683c, 0x9065,
++	0x0160, 0x600c, 0x9015, 0x0130, 0x6a3a, 0x600f, 0x0000, 0x683f,
++	0x0000, 0x0018, 0x683e, 0x683a, 0x6836, 0x00ce, 0x00de, 0x0005,
++	0xc1e5, 0x2001, 0x180c, 0x2102, 0x0005, 0x2001, 0x180c, 0x200c,
++	0xd1ec, 0x0138, 0xc1ec, 0x2102, 0x080c, 0x820b, 0x2001, 0x180c,
++	0x200c, 0x9184, 0x0600, 0x9086, 0x0600, 0x0d50, 0x00d6, 0x2069,
++	0x19b4, 0x6804, 0x9084, 0x0007, 0x0002, 0x8147, 0x81ea, 0x81ea,
++	0x81ea, 0x81ea, 0x81ec, 0x81ea, 0x8145, 0x080c, 0x0d84, 0x6820,
++	0x9005, 0x1110, 0x00de, 0x0005, 0x00c6, 0x680c, 0x9065, 0x0150,
++	0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x8256, 0x00ce,
++	0x00de, 0x0005, 0x6814, 0x9065, 0x0150, 0x6807, 0x0001, 0x6826,
++	0x682b, 0x0000, 0x080c, 0x8256, 0x00ce, 0x00de, 0x0005, 0x00b6,
++	0x00e6, 0x6a1c, 0x92dd, 0x0000, 0x0904, 0x81d6, 0xb84c, 0x900d,
++	0x0118, 0xb888, 0x9005, 0x01a0, 0xb854, 0x905d, 0x0120, 0x920e,
++	0x0904, 0x81d6, 0x0028, 0x6818, 0x920e, 0x0904, 0x81d6, 0x2058,
++	0xb84c, 0x900d, 0x0d88, 0xb888, 0x9005, 0x1d70, 0x2b00, 0x681e,
++	0xbb3c, 0xb838, 0x9302, 0x1e40, 0x080c, 0x952b, 0x0904, 0x81d6,
++	0x8318, 0xbb3e, 0x6116, 0x2b10, 0x6212, 0x0096, 0x2148, 0xa880,
++	0x9084, 0x00ff, 0x605e, 0xa883, 0x0000, 0xa884, 0x009e, 0x908a,
++	0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x801b, 0x831b, 0x9318,
++	0x631a, 0x6114, 0x0096, 0x2148, 0xa964, 0x009e, 0x918c, 0x00ff,
++	0x918e, 0x0048, 0x0538, 0x00f6, 0x2c78, 0x2061, 0x0100, 0xbab0,
++	0x629a, 0x2069, 0x0200, 0x2071, 0x0240, 0x080c, 0x8786, 0x2069,
++	0x19b4, 0xbb00, 0xc3dd, 0xbb02, 0x6807, 0x0002, 0x2f18, 0x6b26,
++	0x682b, 0x0000, 0x7823, 0x0003, 0x7803, 0x0001, 0x7807, 0x0040,
++	0x00fe, 0x00ee, 0x00be, 0x00ce, 0x00de, 0x0005, 0x00ee, 0x00be,
++	0x00ce, 0x0cd0, 0xbb00, 0xc3dd, 0xbb02, 0x6807, 0x0006, 0x2f18,
++	0x6b26, 0x682b, 0x0000, 0x080c, 0x9387, 0x00ee, 0x00be, 0x00ce,
++	0x00de, 0x0005, 0x00de, 0x0005, 0x00c6, 0x680c, 0x9065, 0x0138,
++	0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x8256, 0x00ce,
++	0x00de, 0x0005, 0x2001, 0x180c, 0x2014, 0xc2ed, 0x2202, 0x00de,
++	0x00fe, 0x0005, 0x2001, 0x180c, 0x2014, 0xd2e4, 0x0120, 0xc2e4,
++	0x2202, 0x080c, 0x8136, 0x00f6, 0x00d6, 0x2069, 0x19b4, 0x6830,
++	0x9086, 0x0000, 0x11f0, 0x2001, 0x180c, 0x200c, 0xd1c4, 0x11e0,
++	0x6838, 0x907d, 0x01b0, 0x6a04, 0x9296, 0x0000, 0x1588, 0x6833,
++	0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x0126, 0x00f6,
++	0x2091, 0x2400, 0x002e, 0x080c, 0x1933, 0x1178, 0x012e, 0x080c,
++	0x899e, 0x00de, 0x00fe, 0x0005, 0xc1c4, 0x2102, 0x0066, 0x2031,
++	0x0001, 0x080c, 0x691e, 0x006e, 0x08d8, 0x012e, 0x6843, 0x0000,
++	0x7803, 0x0002, 0x780c, 0x9015, 0x0140, 0x6a3a, 0x780f, 0x0000,
++	0x6833, 0x0000, 0x683f, 0x0000, 0x0c20, 0x683a, 0x6836, 0x0cc0,
++	0x6a04, 0x9296, 0x0006, 0x0958, 0x0804, 0x81fa, 0x6020, 0x9084,
++	0x000f, 0x000b, 0x0005, 0x826a, 0x826f, 0x86ca, 0x874f, 0x826f,
++	0x86ca, 0x874f, 0x826a, 0x826f, 0x826a, 0x826a, 0x826a, 0x826a,
++	0x826a, 0x826a, 0x080c, 0x8026, 0x080c, 0x8125, 0x0005, 0x00b6,
++	0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6,
++	0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004, 0x908a, 0x0053,
++	0x1a0c, 0x0d84, 0x6110, 0x2158, 0xb9b0, 0x2c78, 0x2061, 0x0100,
++	0x619a, 0x908a, 0x0040, 0x1a04, 0x82db, 0x005b, 0x00fe, 0x00ee,
++	0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be,
++	0x0005, 0x8451, 0x848c, 0x84b5, 0x8559, 0x857b, 0x8581, 0x858e,
++	0x8596, 0x85a2, 0x85a8, 0x85b9, 0x85a8, 0x8611, 0x8596, 0x861d,
++	0x8623, 0x85a2, 0x8623, 0x862f, 0x82d9, 0x82d9, 0x82d9, 0x82d9,
++	0x82d9, 0x82d9, 0x82d9, 0x82d9, 0x82d9, 0x82d9, 0x82d9, 0x8c9a,
++	0x8cb0, 0x8cba, 0x8cda, 0x8d0c, 0x858e, 0x82d9, 0x858e, 0x85a8,
++	0x82d9, 0x84b5, 0x8559, 0x82d9, 0x90fc, 0x85a8, 0x82d9, 0x9118,
++	0x85a8, 0x82d9, 0x85a2, 0x844b, 0x82fc, 0x82d9, 0x912e, 0x919a,
++	0x9271, 0x82d9, 0x927e, 0x858b, 0x92a9, 0x82d9, 0x8d16, 0x92d6,
++	0x82d9, 0x080c, 0x0d84, 0x2100, 0x005b, 0x00fe, 0x00ee, 0x00de,
++	0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005,
++	0x82fa, 0x82fa, 0x82fa, 0x8322, 0x83ce, 0x83d9, 0x82fa, 0x82fa,
++	0x82fa, 0x8420, 0x842c, 0x833d, 0x82fa, 0x8358, 0x838c, 0x9447,
++	0x948c, 0x85a8, 0x080c, 0x0d84, 0x00d6, 0x0096, 0x080c, 0x8642,
++	0x7003, 0x2414, 0x7007, 0x0018, 0x700b, 0x0800, 0x7814, 0x2048,
++	0xa83c, 0x700e, 0xa850, 0x7022, 0xa854, 0x7026, 0x60c3, 0x0018,
++	0x080c, 0x8b24, 0x009e, 0x00de, 0x0005, 0x7810, 0x00b6, 0x2058,
++	0xb8a0, 0x00be, 0x080c, 0x94d3, 0x1110, 0xd0bc, 0x0110, 0x9085,
++	0x0001, 0x0005, 0x00d6, 0x0096, 0x080c, 0x8642, 0x7003, 0x0500,
++	0x7814, 0x2048, 0xa874, 0x700a, 0xa878, 0x700e, 0xa87c, 0x7012,
++	0xa880, 0x7016, 0xa884, 0x701a, 0xa888, 0x701e, 0x60c3, 0x0010,
++	0x080c, 0x8b24, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x080c,
++	0x8642, 0x7003, 0x0500, 0x7814, 0x2048, 0xa8cc, 0x700a, 0xa8d0,
++	0x700e, 0xa8d4, 0x7012, 0xa8d8, 0x7016, 0xa8dc, 0x701a, 0xa8e0,
++	0x701e, 0x60c3, 0x0010, 0x080c, 0x8b24, 0x009e, 0x00de, 0x0005,
++	0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x8642, 0x20e9,
++	0x0000, 0x2001, 0x1970, 0x2003, 0x0000, 0x7814, 0x2048, 0xa814,
++	0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080,
++	0x001b, 0x2098, 0x2001, 0x1970, 0x0016, 0x200c, 0x2001, 0x0001,
++	0x080c, 0x1ff9, 0x080c, 0xbd44, 0x9006, 0x080c, 0x1ff9, 0x001e,
++	0xa804, 0x9005, 0x0110, 0x2048, 0x0c28, 0x04d9, 0x080c, 0x8b24,
++	0x012e, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091,
++	0x8000, 0x080c, 0x868d, 0x20e9, 0x0000, 0x2001, 0x1970, 0x2003,
++	0x0000, 0x7814, 0x2048, 0xa86f, 0x0200, 0xa873, 0x0000, 0xa814,
++	0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080,
++	0x001b, 0x2098, 0x2001, 0x1970, 0x0016, 0x200c, 0x080c, 0xbd44,
++	0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c60, 0x0051, 0x7814,
++	0x2048, 0x080c, 0x0f60, 0x080c, 0x8b24, 0x012e, 0x009e, 0x00de,
++	0x0005, 0x60c0, 0x8004, 0x9084, 0x0003, 0x9005, 0x0130, 0x9082,
++	0x0004, 0x20a3, 0x0000, 0x8000, 0x1de0, 0x0005, 0x080c, 0x8642,
++	0x7003, 0x7800, 0x7808, 0x8007, 0x700a, 0x60c3, 0x0008, 0x0804,
++	0x8b24, 0x00d6, 0x00e6, 0x080c, 0x868d, 0x7814, 0x9084, 0xff00,
++	0x2073, 0x0200, 0x8e70, 0x8e70, 0x9095, 0x0010, 0x2272, 0x8e70,
++	0x2073, 0x0034, 0x8e70, 0x2069, 0x1805, 0x20a9, 0x0004, 0x2d76,
++	0x8d68, 0x8e70, 0x1f04, 0x83ef, 0x2069, 0x1801, 0x20a9, 0x0004,
++	0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x83f8, 0x2069, 0x1980, 0x9086,
++	0xdf00, 0x0110, 0x2069, 0x199a, 0x20a9, 0x001a, 0x9e86, 0x0260,
++	0x1148, 0x00c6, 0x2061, 0x0200, 0x6010, 0x8000, 0x6012, 0x00ce,
++	0x2071, 0x0240, 0x2d04, 0x8007, 0x2072, 0x8d68, 0x8e70, 0x1f04,
++	0x8406, 0x60c3, 0x004c, 0x080c, 0x8b24, 0x00ee, 0x00de, 0x0005,
++	0x080c, 0x8642, 0x7003, 0x6300, 0x7007, 0x0028, 0x7808, 0x700e,
++	0x60c3, 0x0008, 0x0804, 0x8b24, 0x00d6, 0x0026, 0x0016, 0x080c,
++	0x868d, 0x7003, 0x0200, 0x7814, 0x700e, 0x00e6, 0x9ef0, 0x0004,
++	0x2009, 0x0001, 0x2011, 0x000c, 0x2073, 0x0800, 0x8e70, 0x2073,
++	0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, 0x8b24, 0x001e,
++	0x002e, 0x00de, 0x0005, 0x2001, 0x1816, 0x2004, 0x609a, 0x0804,
++	0x8b24, 0x080c, 0x8642, 0x7003, 0x5200, 0x2069, 0x1852, 0x6804,
++	0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x2430, 0x710e, 0x001e,
++	0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000,
++	0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1,
++	0x0254, 0x4003, 0x080c, 0x94d3, 0x1120, 0xb8a0, 0x9082, 0x007f,
++	0x0248, 0x2001, 0x181d, 0x2004, 0x7032, 0x2001, 0x181e, 0x2004,
++	0x7036, 0x0030, 0x2001, 0x1816, 0x2004, 0x9084, 0x00ff, 0x7036,
++	0x60c3, 0x001c, 0x0804, 0x8b24, 0x080c, 0x8642, 0x7003, 0x0500,
++	0x080c, 0x94d3, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001,
++	0x181d, 0x2004, 0x700a, 0x2001, 0x181e, 0x2004, 0x700e, 0x0030,
++	0x2001, 0x1816, 0x2004, 0x9084, 0x00ff, 0x700e, 0x20a9, 0x0004,
++	0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0250,
++	0x4003, 0x60c3, 0x0010, 0x0804, 0x8b24, 0x080c, 0x8642, 0x9006,
++	0x080c, 0x5ef7, 0xb8a0, 0x9086, 0x007e, 0x1130, 0x7003, 0x0400,
++	0x620c, 0xc2b4, 0x620e, 0x0058, 0x7814, 0x0096, 0x904d, 0x0120,
++	0x9006, 0xa89a, 0xa8a6, 0xa8aa, 0x009e, 0x7003, 0x0300, 0xb8a0,
++	0x9086, 0x007e, 0x1904, 0x8520, 0x00d6, 0x2069, 0x193b, 0x2001,
++	0x1836, 0x2004, 0xd0a4, 0x0178, 0x6800, 0x700a, 0x6808, 0x9084,
++	0x2000, 0x7012, 0x680c, 0x7016, 0x701f, 0x2710, 0x6818, 0x7022,
++	0x681c, 0x7026, 0x0080, 0x6800, 0x700a, 0x6804, 0x700e, 0x6808,
++	0x080c, 0x6877, 0x1118, 0x9084, 0x37ff, 0x0010, 0x9084, 0x3fff,
++	0x7012, 0x680c, 0x7016, 0x00de, 0x20a9, 0x0004, 0x20e1, 0x0001,
++	0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x20a9,
++	0x0004, 0x2099, 0x1801, 0x20a1, 0x025a, 0x4003, 0x00d6, 0x080c,
++	0x934e, 0x2069, 0x1943, 0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002,
++	0x080c, 0x4dee, 0xd0e4, 0x0110, 0x680c, 0x700e, 0x00de, 0x04a8,
++	0x2001, 0x1836, 0x2004, 0xd0a4, 0x0170, 0x0016, 0x2001, 0x193c,
++	0x200c, 0x60e0, 0x9106, 0x0130, 0x2100, 0x60e3, 0x0000, 0x080c,
++	0x2471, 0x61e2, 0x001e, 0x20e1, 0x0001, 0x2099, 0x193b, 0x20e9,
++	0x0000, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004,
++	0x2099, 0x1805, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099,
++	0x1801, 0x20a1, 0x025a, 0x4003, 0x080c, 0x934e, 0x20a1, 0x024e,
++	0x20a9, 0x0008, 0x2099, 0x1943, 0x4003, 0x60c3, 0x0074, 0x0804,
++	0x8b24, 0x080c, 0x8642, 0x7003, 0x2010, 0x7007, 0x0014, 0x700b,
++	0x0800, 0x700f, 0x2000, 0x9006, 0x00f6, 0x2079, 0x1852, 0x7904,
++	0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0xd1a4, 0x0110, 0x9085,
++	0x0010, 0x9085, 0x0002, 0x00d6, 0x0804, 0x85f2, 0x7026, 0x60c3,
++	0x0014, 0x0804, 0x8b24, 0x080c, 0x8642, 0x7003, 0x5000, 0x0804,
++	0x84cf, 0x080c, 0x8642, 0x7003, 0x2110, 0x7007, 0x0014, 0x60c3,
++	0x0014, 0x0804, 0x8b24, 0x080c, 0x8684, 0x0010, 0x080c, 0x868d,
++	0x7003, 0x0200, 0x60c3, 0x0004, 0x0804, 0x8b24, 0x080c, 0x868d,
++	0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008,
++	0x0804, 0x8b24, 0x080c, 0x868d, 0x7003, 0x0200, 0x0804, 0x84cf,
++	0x080c, 0x868d, 0x7003, 0x0100, 0x782c, 0x9005, 0x0110, 0x700a,
++	0x0010, 0x700b, 0x0003, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804,
++	0x8b24, 0x00d6, 0x080c, 0x868d, 0x7003, 0x0210, 0x7007, 0x0014,
++	0x700b, 0x0800, 0xb894, 0x9086, 0x0014, 0x1198, 0xb99c, 0x9184,
++	0x0030, 0x0190, 0xb998, 0x9184, 0xc000, 0x1140, 0xd1ec, 0x0118,
++	0x700f, 0x2100, 0x0058, 0x700f, 0x0100, 0x0040, 0x700f, 0x0400,
++	0x0028, 0x700f, 0x0700, 0x0010, 0x700f, 0x0800, 0x00f6, 0x2079,
++	0x1852, 0x7904, 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0xd1a4,
++	0x0110, 0x9085, 0x0010, 0x2009, 0x1874, 0x210c, 0xd184, 0x1110,
++	0x9085, 0x0002, 0x0026, 0x2009, 0x1872, 0x210c, 0xd1e4, 0x0150,
++	0xc0c5, 0xbabc, 0xd28c, 0x1108, 0xc0cd, 0x9094, 0x0030, 0x9296,
++	0x0010, 0x0140, 0xd1ec, 0x0130, 0x9094, 0x0030, 0x9296, 0x0010,
++	0x0108, 0xc0bd, 0x002e, 0x7026, 0x60c3, 0x0014, 0x00de, 0x0804,
++	0x8b24, 0x080c, 0x868d, 0x7003, 0x0210, 0x7007, 0x0014, 0x700f,
++	0x0100, 0x60c3, 0x0014, 0x0804, 0x8b24, 0x080c, 0x868d, 0x7003,
++	0x0200, 0x0804, 0x8455, 0x080c, 0x868d, 0x7003, 0x0100, 0x700b,
++	0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0x8b24, 0x080c,
++	0x868d, 0x7003, 0x0100, 0x700b, 0x000b, 0x60c3, 0x0008, 0x0804,
++	0x8b24, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x3200, 0x2021,
++	0x0800, 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x2200,
++	0x2021, 0x0100, 0x080c, 0x9363, 0xb810, 0x9305, 0x7002, 0xb814,
++	0x7006, 0x2069, 0x1800, 0x6874, 0x700a, 0x6878, 0x700e, 0x9485,
++	0x0029, 0x7012, 0x004e, 0x003e, 0x00de, 0x080c, 0x8b12, 0x721a,
++	0x9f95, 0x0000, 0x7222, 0x7027, 0xffff, 0x2071, 0x024c, 0x002e,
++	0x0005, 0x0026, 0x080c, 0x9363, 0x7003, 0x02ff, 0x7007, 0xfffc,
++	0x00d6, 0x2069, 0x1800, 0x6874, 0x700a, 0x6878, 0x700e, 0x00de,
++	0x7013, 0x2029, 0x0c10, 0x7003, 0x0100, 0x7007, 0x0000, 0x700b,
++	0xfc02, 0x700f, 0x0000, 0x0005, 0x0026, 0x00d6, 0x0036, 0x0046,
++	0x2019, 0x3300, 0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036,
++	0x0046, 0x2019, 0x2300, 0x2021, 0x0100, 0x080c, 0x9363, 0xb810,
++	0x9305, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0xb810, 0x9005,
++	0x1140, 0xb814, 0x9005, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe,
++	0x0020, 0x6874, 0x700a, 0x6878, 0x700e, 0x0000, 0x9485, 0x0098,
++	0x7012, 0x004e, 0x003e, 0x00de, 0x080c, 0x8b12, 0x721a, 0x7a08,
++	0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x002e, 0x0005, 0x080c,
++	0x8b12, 0x721a, 0x7a08, 0x7222, 0x7814, 0x7026, 0x2071, 0x024c,
++	0x002e, 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069,
++	0x0200, 0x2071, 0x0240, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d84,
++	0x908a, 0x0092, 0x1a0c, 0x0d84, 0x6110, 0x2158, 0xb9b0, 0x2c78,
++	0x2061, 0x0100, 0x619a, 0x9082, 0x0085, 0x0033, 0x00fe, 0x00ee,
++	0x00de, 0x00ce, 0x00be, 0x0005, 0x86fb, 0x8700, 0x870b, 0x86f9,
++	0x86f9, 0x86f9, 0x86fb, 0x86f9, 0x86f9, 0x86f9, 0x86f9, 0x86f9,
++	0x86f9, 0x080c, 0x0d84, 0x00c1, 0x60c3, 0x0000, 0x0804, 0x8b24,
++	0x0431, 0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff, 0x60c3,
++	0x000c, 0x0804, 0x8b24, 0x0479, 0x7003, 0x0003, 0x7007, 0x0300,
++	0x60c3, 0x0004, 0x0804, 0x8b24, 0x0026, 0x080c, 0x9363, 0xb810,
++	0x9085, 0x8100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6874,
++	0x700a, 0x6878, 0x700e, 0x7013, 0x0009, 0x0804, 0x865d, 0x0026,
++	0x080c, 0x9363, 0xb810, 0x9085, 0x8400, 0x7002, 0xb814, 0x7006,
++	0x2069, 0x1800, 0x6874, 0x700a, 0x6878, 0x700e, 0x2001, 0x0099,
++	0x7012, 0x0804, 0x86bf, 0x0026, 0x080c, 0x9363, 0xb810, 0x9085,
++	0x8500, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6874, 0x700a,
++	0x6878, 0x700e, 0x2001, 0x0099, 0x7012, 0x0804, 0x86bf, 0x00b6,
++	0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200, 0x2071,
++	0x0240, 0x7804, 0x908a, 0x0040, 0x0a0c, 0x0d84, 0x908a, 0x0054,
++	0x1a0c, 0x0d84, 0x7910, 0x2158, 0xb9b0, 0x2061, 0x0100, 0x619a,
++	0x9082, 0x0040, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be,
++	0x0005, 0x8786, 0x882d, 0x8800, 0x894f, 0x8784, 0x8784, 0x8784,
++	0x8784, 0x8784, 0x8784, 0x8784, 0x8eb9, 0x8ec5, 0x8ed1, 0x8edd,
++	0x8784, 0x92b5, 0x8784, 0x8ead, 0x080c, 0x0d84, 0x0096, 0x780b,
++	0xffff, 0x080c, 0x87dc, 0x7914, 0x2148, 0xa978, 0x7956, 0x7132,
++	0xa97c, 0x9184, 0x000f, 0x1118, 0x2001, 0x0005, 0x0040, 0xd184,
++	0x0118, 0x2001, 0x0004, 0x0018, 0x9084, 0x0006, 0x8004, 0x2010,
++	0x785c, 0x9084, 0x00ff, 0x8007, 0x9205, 0x7042, 0xd1ac, 0x0128,
++	0x7047, 0x0002, 0x080c, 0x150d, 0x0050, 0xd1b4, 0x0118, 0x7047,
++	0x0001, 0x0028, 0x7047, 0x0000, 0x9016, 0x2230, 0x0010, 0xaab0,
++	0xaeac, 0x726a, 0x766e, 0x20a9, 0x0008, 0x20e9, 0x0000, 0xa860,
++	0x20e0, 0xa85c, 0x9080, 0x0023, 0x2098, 0x20a1, 0x0252, 0x2069,
++	0x0200, 0x6813, 0x0018, 0x4003, 0x6813, 0x0008, 0x60c3, 0x0020,
++	0x6017, 0x0009, 0x2001, 0x19d0, 0x2003, 0x07d0, 0x2001, 0x19cf,
++	0x2003, 0x0009, 0x009e, 0x0005, 0x6813, 0x0008, 0xba8c, 0x8210,
++	0xb8bc, 0xd084, 0x0128, 0x7a46, 0x7b14, 0x7b4a, 0x722e, 0x732a,
++	0x9294, 0x00ff, 0xba8e, 0x8217, 0x721a, 0xba10, 0x9295, 0x0600,
++	0x7202, 0xba14, 0x7206, 0x2069, 0x1800, 0x6a74, 0x720a, 0x6a78,
++	0x720e, 0x7013, 0x0829, 0x2f10, 0x7222, 0x7027, 0xffff, 0x0005,
++	0x00d6, 0x0096, 0x0081, 0x7814, 0x2048, 0xa890, 0x7002, 0xa88c,
++	0x7006, 0xa8b0, 0x700a, 0xa8ac, 0x700e, 0x60c3, 0x000c, 0x009e,
++	0x00de, 0x0804, 0x8b24, 0x6813, 0x0008, 0xb810, 0x9085, 0x0500,
++	0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6874, 0x700a, 0x6878,
++	0x700e, 0x7013, 0x0889, 0x080c, 0x8b12, 0x721a, 0x7a08, 0x7222,
++	0x2f10, 0x7226, 0x2071, 0x024c, 0x0005, 0x00d6, 0x0096, 0x080c,
++	0x892d, 0x7814, 0x2048, 0x080c, 0xb0ab, 0x1130, 0x7814, 0x9084,
++	0x0700, 0x8007, 0x0033, 0x0010, 0x9006, 0x001b, 0x009e, 0x00de,
++	0x0005, 0x884b, 0x88b4, 0x88c4, 0x88ea, 0x88f6, 0x8907, 0x890f,
++	0x8849, 0x080c, 0x0d84, 0x0016, 0x0036, 0xa97c, 0x918c, 0x0003,
++	0x0118, 0x9186, 0x0003, 0x1198, 0xaba8, 0x7824, 0xd0cc, 0x1168,
++	0x7316, 0xa898, 0x701a, 0xa894, 0x701e, 0x003e, 0x001e, 0x2001,
++	0x197e, 0x2004, 0x60c2, 0x0804, 0x8b24, 0xc3e5, 0x0c88, 0x9186,
++	0x0001, 0x190c, 0x0d84, 0xaba8, 0x7824, 0xd0cc, 0x1904, 0x88b1,
++	0x7316, 0xa898, 0x701a, 0xa894, 0x701e, 0xa8a4, 0x7026, 0xa8ac,
++	0x702e, 0x2009, 0x0018, 0x9384, 0x0300, 0x0570, 0xd3c4, 0x0110,
++	0xa8ac, 0x9108, 0xd3cc, 0x0110, 0xa8a4, 0x9108, 0x6810, 0x9085,
++	0x0010, 0x6812, 0x2011, 0x0258, 0x20e9, 0x0000, 0x22a0, 0x0156,
++	0x20a9, 0x0008, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x002c, 0x2098,
++	0x4003, 0x6810, 0x8000, 0x6812, 0x2011, 0x0240, 0x22a0, 0x20a9,
++	0x0005, 0x4003, 0x6810, 0xc084, 0x6812, 0x015e, 0x9184, 0x0003,
++	0x0118, 0x2019, 0x0245, 0x201a, 0x61c2, 0x003e, 0x001e, 0x0804,
++	0x8b24, 0xc3e5, 0x0804, 0x8870, 0x2011, 0x0008, 0x2001, 0x180e,
++	0x2004, 0xd0a4, 0x0110, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x1110,
++	0x7216, 0x0470, 0x0ce8, 0xc2e5, 0x2011, 0x0302, 0x0016, 0x782c,
++	0x701a, 0x7930, 0x711e, 0x9105, 0x0108, 0xc2dd, 0x001e, 0x7824,
++	0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x7027, 0x0012, 0x702f, 0x0008,
++	0x7043, 0x7000, 0x7047, 0x0500, 0x704f, 0x000a, 0x2069, 0x0200,
++	0x6813, 0x0009, 0x2071, 0x0240, 0x700b, 0x2500, 0x60c3, 0x0032,
++	0x0804, 0x8b24, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x1128, 0x7216,
++	0x60c3, 0x0018, 0x0804, 0x8b24, 0x0cd0, 0xc2e5, 0x2011, 0x0100,
++	0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x702f, 0x0008, 0x7858,
++	0x9084, 0x00ff, 0x7036, 0x60c3, 0x0020, 0x0804, 0x8b24, 0x2011,
++	0x0008, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x0c08, 0x0036,
++	0x7b14, 0x9384, 0xff00, 0x7816, 0x9384, 0x00ff, 0x8001, 0x1138,
++	0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x003e, 0x0888, 0x0046,
++	0x2021, 0x0800, 0x0006, 0x7824, 0xd0cc, 0x000e, 0x0108, 0xc4e5,
++	0x7416, 0x004e, 0x701e, 0x003e, 0x0818, 0x00d6, 0x6813, 0x0008,
++	0xb810, 0x9085, 0x0700, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800,
++	0x6874, 0x700a, 0x6878, 0x700e, 0x7824, 0xd0cc, 0x1168, 0x7013,
++	0x0898, 0x080c, 0x8b12, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226,
++	0x2071, 0x024c, 0x00de, 0x0005, 0x7013, 0x0889, 0x0c90, 0x0016,
++	0x7814, 0x9084, 0x0700, 0x8007, 0x0013, 0x001e, 0x0005, 0x895f,
++	0x895f, 0x8961, 0x895f, 0x895f, 0x895f, 0x897b, 0x895f, 0x080c,
++	0x0d84, 0x7914, 0x918c, 0x08ff, 0x918d, 0xf600, 0x7916, 0x2009,
++	0x0003, 0x00b9, 0x2069, 0x1852, 0x6804, 0xd0bc, 0x0130, 0x682c,
++	0x9084, 0x00ff, 0x8007, 0x7032, 0x0010, 0x7033, 0x3f00, 0x60c3,
++	0x0001, 0x0804, 0x8b24, 0x2009, 0x0003, 0x0019, 0x7033, 0x7f00,
++	0x0cb0, 0x0016, 0x080c, 0x9363, 0x001e, 0xb810, 0x9085, 0x0100,
++	0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6a74, 0x720a, 0x6a78,
++	0x720e, 0x7013, 0x0888, 0x918d, 0x0008, 0x7116, 0x080c, 0x8b12,
++	0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x0005, 0x00b6, 0x0096,
++	0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100,
++	0x2071, 0x1800, 0x7158, 0x7810, 0x2058, 0xb8a0, 0x2028, 0xb910,
++	0xba14, 0x7374, 0x7478, 0x7820, 0x90be, 0x0006, 0x0904, 0x8a81,
++	0x90be, 0x000a, 0x1904, 0x8a3d, 0x609f, 0x0000, 0x7814, 0x2048,
++	0xa87c, 0xd0fc, 0x05c8, 0xaf90, 0x9784, 0xff00, 0x9105, 0x6062,
++	0x873f, 0x9784, 0xff00, 0x0006, 0x7814, 0x2048, 0xa878, 0x9005,
++	0x000e, 0x1160, 0xaf94, 0x87ff, 0x0510, 0x2039, 0x0098, 0x9705,
++	0x6072, 0x7808, 0x6082, 0x2f00, 0x6086, 0x0038, 0x9185, 0x2200,
++	0x6062, 0x6073, 0x0129, 0x6077, 0x0000, 0x609f, 0x0000, 0x2001,
++	0x1836, 0x2004, 0xd0ac, 0x11a8, 0xd09c, 0x0130, 0x7814, 0x2048,
++	0xa874, 0x9082, 0x0080, 0x1268, 0xb814, 0x609e, 0x0050, 0x2039,
++	0x0029, 0x9705, 0x6072, 0x0c48, 0x9185, 0x0200, 0x6062, 0x6073,
++	0x2029, 0xa87c, 0xd0fc, 0x0118, 0xaf94, 0x87ff, 0x1120, 0x2f00,
++	0x6082, 0x7808, 0x6086, 0x6266, 0x636a, 0x646e, 0x6077, 0x0000,
++	0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, 0x607f,
++	0x0000, 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844,
++	0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0x080c,
++	0x9348, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110,
++	0x2009, 0x1b58, 0x080c, 0x7898, 0x003e, 0x004e, 0x005e, 0x00ce,
++	0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, 0x7804, 0x9086, 0x0040,
++	0x0904, 0x8abd, 0x9185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e,
++	0x6073, 0x0809, 0x6077, 0x0008, 0x60af, 0x95d5, 0x60d7, 0x0000,
++	0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, 0x607f,
++	0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, 0x7814, 0x2048, 0xa838,
++	0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca, 0xb86c,
++	0x60ce, 0xbab0, 0x629e, 0x080c, 0x9348, 0x2009, 0x07d0, 0x60c4,
++	0x9084, 0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x7898,
++	0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be,
++	0x0005, 0x7814, 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002,
++	0x0904, 0x8ad9, 0x9185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e,
++	0x6073, 0x0880, 0x6077, 0x0008, 0xb88c, 0x8000, 0x9084, 0x00ff,
++	0xb88e, 0x8007, 0x607a, 0x7838, 0x607e, 0x2f00, 0x6086, 0x7808,
++	0x6082, 0xa890, 0x608a, 0xa88c, 0x608e, 0xa8b0, 0x60c6, 0xa8ac,
++	0x60ca, 0xa8ac, 0x7930, 0x9108, 0x7932, 0xa8b0, 0x792c, 0x9109,
++	0x792e, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xbab0,
++	0x629e, 0x080c, 0x9325, 0x0804, 0x8a6d, 0xb8bc, 0xd084, 0x0148,
++	0xb88c, 0x7814, 0x2048, 0xb88c, 0x7846, 0xa836, 0x2900, 0xa83a,
++	0xb04a, 0x9185, 0x0600, 0x6062, 0x6266, 0x636a, 0x646e, 0x6073,
++	0x0829, 0x6077, 0x0000, 0x60af, 0x9575, 0x60d7, 0x0000, 0x0804,
++	0x8a50, 0x9185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, 0x7824,
++	0xd0cc, 0x7826, 0x0118, 0x6073, 0x0889, 0x0010, 0x6073, 0x0898,
++	0x6077, 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007,
++	0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, 0x6082, 0xa838,
++	0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca, 0xb86c,
++	0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xbab0, 0x629e, 0x7824,
++	0xd0cc, 0x0120, 0x080c, 0x9348, 0x0804, 0x8a6d, 0x080c, 0x9325,
++	0x0804, 0x8a6d, 0x7a10, 0x00b6, 0x2258, 0xba8c, 0x8210, 0x9294,
++	0x00ff, 0xba8e, 0x00be, 0x8217, 0x0005, 0x00d6, 0x2069, 0x19b4,
++	0x6843, 0x0001, 0x00de, 0x0005, 0x60a3, 0x0056, 0x60a7, 0x9575,
++	0x00f1, 0x080c, 0x788a, 0x0005, 0x0016, 0x2001, 0x180c, 0x200c,
++	0x9184, 0x0600, 0x9086, 0x0600, 0x0128, 0x0089, 0x080c, 0x788a,
++	0x001e, 0x0005, 0xc1e5, 0x2001, 0x180c, 0x2102, 0x2001, 0x19b5,
++	0x2003, 0x0000, 0x2001, 0x19bd, 0x2003, 0x0000, 0x0c88, 0x0006,
++	0x6014, 0x9084, 0x1804, 0x9085, 0x0009, 0x6016, 0x000e, 0x0005,
++	0x0016, 0x00c6, 0x0006, 0x2061, 0x0100, 0x61a4, 0x60a7, 0x95f5,
++	0x6014, 0x9084, 0x1804, 0x9085, 0x0008, 0x6016, 0x000e, 0xa001,
++	0xa001, 0xa001, 0x61a6, 0x00ce, 0x001e, 0x0005, 0x00c6, 0x00d6,
++	0x0016, 0x0026, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x6877,
++	0x1198, 0x2001, 0x19d0, 0x2004, 0x9005, 0x15d0, 0x0066, 0x2031,
++	0x0001, 0x080c, 0x691e, 0x006e, 0x1118, 0x080c, 0x788a, 0x0480,
++	0x00c6, 0x2061, 0x19b4, 0x00f0, 0x6904, 0x9194, 0x4000, 0x0568,
++	0x0839, 0x2001, 0x1000, 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5,
++	0x00c6, 0x2061, 0x19b4, 0x6128, 0x9192, 0x00c8, 0x1258, 0x8108,
++	0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c, 0x788a, 0x080c,
++	0x8b47, 0x0070, 0x6124, 0x91e5, 0x0000, 0x0140, 0x080c, 0xcd1f,
++	0x080c, 0x7893, 0x2009, 0x0014, 0x080c, 0x95ce, 0x00ce, 0x0000,
++	0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, 0x19d0, 0x2004,
++	0x9005, 0x1db0, 0x00c6, 0x2061, 0x19b4, 0x6128, 0x9192, 0x0003,
++	0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, 0x788a, 0x080c, 0x55a0,
++	0x0c38, 0x0096, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c,
++	0x78a0, 0x2071, 0x19b4, 0x713c, 0x81ff, 0x0904, 0x8c3c, 0x2061,
++	0x0100, 0x2069, 0x0140, 0x080c, 0x6877, 0x11b0, 0x0036, 0x2019,
++	0x0002, 0x080c, 0x8dfe, 0x003e, 0x713c, 0x2160, 0x080c, 0xcd1f,
++	0x2009, 0x004a, 0x080c, 0x95ce, 0x0066, 0x2031, 0x0001, 0x080c,
++	0x691e, 0x006e, 0x0804, 0x8c3c, 0x6904, 0xd1f4, 0x0904, 0x8c43,
++	0x2001, 0x1000, 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 0x00c6,
++	0x703c, 0x9065, 0x090c, 0x0d84, 0x6020, 0x00ce, 0x9086, 0x0006,
++	0x1528, 0x61c8, 0x60c4, 0x9105, 0x1508, 0x2009, 0x180c, 0x2104,
++	0xd0d4, 0x01e0, 0x6214, 0x9294, 0x1800, 0x1128, 0x6224, 0x9294,
++	0x0002, 0x1510, 0x0030, 0xc0d4, 0x200a, 0xd0cc, 0x0110, 0x080c,
++	0x2809, 0x6014, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x6016, 0x703c,
++	0x2060, 0x2009, 0x0049, 0x080c, 0x95ce, 0x0070, 0x0036, 0x2019,
++	0x0001, 0x080c, 0x8dfe, 0x003e, 0x713c, 0x2160, 0x080c, 0xcd1f,
++	0x2009, 0x004a, 0x080c, 0x95ce, 0x002e, 0x001e, 0x00ee, 0x00de,
++	0x00ce, 0x009e, 0x0005, 0xd1ec, 0x1904, 0x8bf8, 0x0804, 0x8bff,
++	0x0026, 0x00e6, 0x2071, 0x19b4, 0x7048, 0xd084, 0x01c0, 0x713c,
++	0x81ff, 0x01a8, 0x2071, 0x0100, 0x9188, 0x0008, 0x2114, 0x928e,
++	0x0006, 0x1138, 0x7014, 0x9084, 0x1984, 0x9085, 0x0012, 0x7016,
++	0x0030, 0x7014, 0x9084, 0x1984, 0x9085, 0x0016, 0x7016, 0x00ee,
++	0x002e, 0x0005, 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056,
++	0x0046, 0x0006, 0x0126, 0x2091, 0x8000, 0x6010, 0x2058, 0xbca0,
++	0x2071, 0x19b4, 0x7018, 0x2058, 0x8bff, 0x0190, 0xb8a0, 0x9406,
++	0x0118, 0xb854, 0x2058, 0x0cc0, 0x6014, 0x0096, 0x2048, 0xac6c,
++	0xad70, 0xae78, 0x009e, 0x080c, 0x5d3f, 0x0110, 0x9085, 0x0001,
++	0x012e, 0x000e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee,
++	0x00be, 0x0005, 0x080c, 0x8642, 0x7003, 0x1200, 0x7820, 0x9086,
++	0x0004, 0x1110, 0x6098, 0x0018, 0x2001, 0x1816, 0x2004, 0x700e,
++	0x7838, 0x7012, 0x783c, 0x7016, 0x60c3, 0x002c, 0x0804, 0x8b24,
++	0x080c, 0x8642, 0x7003, 0x0f00, 0x7808, 0x700e, 0x60c3, 0x0008,
++	0x0804, 0x8b24, 0x0156, 0x080c, 0x868d, 0x7003, 0x0200, 0x2011,
++	0x1848, 0x63f0, 0x2312, 0x20a9, 0x0006, 0x2011, 0x1840, 0x2019,
++	0x1841, 0x9ef0, 0x0002, 0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398,
++	0x0002, 0x9290, 0x0002, 0x1f04, 0x8ccb, 0x60c3, 0x001c, 0x015e,
++	0x0804, 0x8b24, 0x0016, 0x0026, 0x080c, 0x8669, 0x080c, 0x867b,
++	0x9e80, 0x0004, 0x20e9, 0x0000, 0x20a0, 0x7814, 0x0096, 0x2048,
++	0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098,
++	0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, 0x9192, 0x0010, 0x1250,
++	0x4003, 0x9080, 0x0004, 0x8003, 0x60c2, 0x080c, 0x8b24, 0x002e,
++	0x001e, 0x0005, 0x20a9, 0x0010, 0x4003, 0x080c, 0x934e, 0x20a1,
++	0x0240, 0x22a8, 0x4003, 0x0c68, 0x080c, 0x8642, 0x7003, 0x6200,
++	0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0x8b24, 0x0016, 0x0026,
++	0x080c, 0x8642, 0x20e9, 0x0000, 0x20a1, 0x024c, 0x7814, 0x0096,
++	0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021,
++	0x2098, 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, 0x4003, 0x8003,
++	0x60c2, 0x080c, 0x8b24, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00c6,
++	0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b4, 0x700c, 0x2060,
++	0x8cff, 0x0178, 0x080c, 0xb295, 0x1110, 0x080c, 0x9e99, 0x600c,
++	0x0006, 0x080c, 0xb4de, 0x080c, 0x9554, 0x080c, 0x8eec, 0x00ce,
++	0x0c78, 0x2c00, 0x700e, 0x700a, 0x012e, 0x000e, 0x00ce, 0x00ee,
++	0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0026,
++	0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c,
++	0xe7ff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19b4,
++	0x7024, 0x2060, 0x8cff, 0x0904, 0x8db6, 0x080c, 0x8b50, 0x6ac0,
++	0x68c3, 0x0000, 0x080c, 0x7893, 0x00c6, 0x2061, 0x0100, 0x080c,
++	0x9367, 0x00ce, 0x2009, 0x0013, 0x080c, 0x95ce, 0x20a9, 0x01f4,
++	0x6824, 0xd094, 0x0170, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000,
++	0x01d0, 0x2001, 0x1000, 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5,
++	0x0090, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0x8d88,
++	0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x28a5,
++	0x9006, 0x080c, 0x28a5, 0x6824, 0x000e, 0x001e, 0x002e, 0x00ce,
++	0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, 0x1800,
++	0x2004, 0x9096, 0x0001, 0x05c0, 0x9096, 0x0004, 0x05a8, 0x080c,
++	0x7893, 0x6814, 0x9084, 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817,
++	0x0008, 0x68c3, 0x0000, 0x2011, 0x554d, 0x080c, 0x781a, 0x20a9,
++	0x01f4, 0x6824, 0xd094, 0x0170, 0x6827, 0x0004, 0x7804, 0x9084,
++	0x4000, 0x01d0, 0x2001, 0x1000, 0x080c, 0x28a5, 0x9006, 0x080c,
++	0x28a5, 0x0090, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04,
++	0x8dd1, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c,
++	0x28a5, 0x9006, 0x080c, 0x28a5, 0x000e, 0x001e, 0x002e, 0x00ce,
++	0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x0126, 0x0156,
++	0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0026, 0x0016, 0x0006, 0x2091,
++	0x8000, 0x2001, 0x180c, 0x200c, 0x918c, 0xdbff, 0x2102, 0x2069,
++	0x0100, 0x2079, 0x0140, 0x2071, 0x19b4, 0x703c, 0x2060, 0x8cff,
++	0x0904, 0x8e8f, 0x9386, 0x0002, 0x1128, 0x6814, 0x9084, 0x0002,
++	0x0904, 0x8e8f, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa,
++	0x8109, 0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c, 0x78a0, 0x080c,
++	0x1c4f, 0x0046, 0x2009, 0x017f, 0x200b, 0x00a5, 0x2021, 0x0169,
++	0x2404, 0x9084, 0x000f, 0x9086, 0x0004, 0x11f8, 0x68af, 0x95f5,
++	0x68c6, 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0090, 0x2071,
++	0x1a33, 0x6814, 0x9084, 0x1984, 0x9085, 0x0012, 0x6816, 0x782b,
++	0x0008, 0x7003, 0x0000, 0x00fe, 0x00ee, 0x9386, 0x0002, 0x1128,
++	0x7884, 0x9005, 0x1110, 0x7887, 0x0001, 0x2001, 0x194e, 0x2004,
++	0x200a, 0x004e, 0x939d, 0x0000, 0x1120, 0x2009, 0x0049, 0x080c,
++	0x95ce, 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0170, 0x6827, 0x0004,
++	0x7804, 0x9084, 0x4000, 0x01d0, 0x2001, 0x1000, 0x080c, 0x28a5,
++	0x9006, 0x080c, 0x28a5, 0x0090, 0xd08c, 0x0118, 0x6827, 0x0002,
++	0x0010, 0x1f04, 0x8e6b, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001,
++	0x0100, 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 0x6824, 0x000e,
++	0x001e, 0x002e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e,
++	0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x19b4, 0x6a06,
++	0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069,
++	0x19b4, 0x6a32, 0x012e, 0x00de, 0x0005, 0x080c, 0x87dc, 0x7814,
++	0x080c, 0x4df2, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x1000,
++	0x0478, 0x080c, 0x87dc, 0x7814, 0x080c, 0x4df2, 0x0108, 0x782c,
++	0x7032, 0x7042, 0x7047, 0x4000, 0x0418, 0x080c, 0x87dc, 0x7814,
++	0x080c, 0x4df2, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x2000,
++	0x00b8, 0x080c, 0x87dc, 0x7814, 0x080c, 0x4df2, 0x0108, 0x782c,
++	0x7032, 0x7042, 0x7047, 0x0400, 0x0058, 0x080c, 0x87dc, 0x7814,
++	0x080c, 0x4df2, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x0200,
++	0x60c3, 0x0020, 0x0804, 0x8b24, 0x00e6, 0x2071, 0x19b4, 0x7020,
++	0x9005, 0x0110, 0x8001, 0x7022, 0x00ee, 0x0005, 0x00f6, 0x00e6,
++	0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126, 0x2091, 0x8000,
++	0x2071, 0x19b4, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff,
++	0x0904, 0x8f8a, 0x8cff, 0x0904, 0x8f8a, 0x6020, 0x9086, 0x0006,
++	0x1904, 0x8f85, 0x88ff, 0x0138, 0x2800, 0x9c06, 0x1904, 0x8f85,
++	0x2039, 0x0000, 0x0050, 0x6010, 0x9b06, 0x1904, 0x8f85, 0x85ff,
++	0x0120, 0x6054, 0x9106, 0x1904, 0x8f85, 0x7024, 0x9c06, 0x1578,
++	0x2069, 0x0100, 0x68c0, 0x9005, 0x0530, 0x080c, 0x7893, 0x6820,
++	0xd0b4, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000,
++	0x080c, 0x900f, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04,
++	0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x28a5, 0x9006,
++	0x080c, 0x28a5, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827,
++	0x0001, 0x003e, 0x0020, 0x6003, 0x0009, 0x630a, 0x0470, 0x7014,
++	0x9c36, 0x1110, 0x660c, 0x7616, 0x7010, 0x9c36, 0x1140, 0x2c00,
++	0x9f36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000, 0x660c,
++	0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x89ff,
++	0x1168, 0x600f, 0x0000, 0x6014, 0x0096, 0x2048, 0x080c, 0xb0ab,
++	0x0110, 0x080c, 0xc970, 0x009e, 0x080c, 0x9584, 0x080c, 0x8eec,
++	0x88ff, 0x1190, 0x00ce, 0x0804, 0x8f07, 0x2c78, 0x600c, 0x2060,
++	0x0804, 0x8f07, 0x9006, 0x012e, 0x000e, 0x006e, 0x007e, 0x00ce,
++	0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x98c5,
++	0x0001, 0x0c88, 0x00f6, 0x00e6, 0x00d6, 0x0096, 0x00c6, 0x0066,
++	0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b4, 0x7638,
++	0x2660, 0x2678, 0x8cff, 0x0904, 0x8ffe, 0x6020, 0x9086, 0x0006,
++	0x1904, 0x8ff9, 0x87ff, 0x0128, 0x2700, 0x9c06, 0x1904, 0x8ff9,
++	0x0040, 0x6010, 0x9b06, 0x15e8, 0x85ff, 0x0118, 0x6054, 0x9106,
++	0x15c0, 0x703c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, 0x080c,
++	0x8dfe, 0x7033, 0x0000, 0x9006, 0x703e, 0x7042, 0x7046, 0x704a,
++	0x003e, 0x7038, 0x9c36, 0x1110, 0x660c, 0x763a, 0x7034, 0x9c36,
++	0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037,
++	0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008,
++	0x2678, 0x600f, 0x0000, 0x6014, 0x2048, 0x080c, 0xb0ab, 0x0110,
++	0x080c, 0xc970, 0x080c, 0x9584, 0x87ff, 0x1198, 0x00ce, 0x0804,
++	0x8faa, 0x2c78, 0x600c, 0x2060, 0x0804, 0x8faa, 0x9006, 0x012e,
++	0x000e, 0x002e, 0x006e, 0x00ce, 0x009e, 0x00de, 0x00ee, 0x00fe,
++	0x0005, 0x601b, 0x0000, 0x00ce, 0x97bd, 0x0001, 0x0c80, 0x00e6,
++	0x2071, 0x19b4, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, 0x1118,
++	0x7007, 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6,
++	0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000,
++	0x2071, 0x19b4, 0x2c10, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0518,
++	0x2200, 0x9c06, 0x11e0, 0x7038, 0x9c36, 0x1110, 0x660c, 0x763a,
++	0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036,
++	0x0010, 0x7037, 0x0000, 0x660c, 0x2c00, 0x9f06, 0x0110, 0x7e0e,
++	0x0008, 0x2678, 0x600f, 0x0000, 0x9085, 0x0001, 0x0020, 0x2c78,
++	0x600c, 0x2060, 0x08d8, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce,
++	0x00ee, 0x00fe, 0x0005, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6,
++	0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b4,
++	0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, 0x90eb, 0x6010, 0x00b6,
++	0x2058, 0xb8a0, 0x00be, 0x9206, 0x1904, 0x90e6, 0x7024, 0x9c06,
++	0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x90c2, 0x080c,
++	0x8b50, 0x68c3, 0x0000, 0x080c, 0x900f, 0x7027, 0x0000, 0x0036,
++	0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100,
++	0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 0x2069, 0x0100, 0x6824,
++	0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x700c, 0x9c36, 0x1110,
++	0x660c, 0x760e, 0x7008, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118,
++	0x2f00, 0x700a, 0x0010, 0x700b, 0x0000, 0x660c, 0x0066, 0x2c00,
++	0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c,
++	0xb284, 0x1158, 0x080c, 0x2d3f, 0x080c, 0xb295, 0x11f0, 0x080c,
++	0x9e99, 0x00d8, 0x080c, 0x900f, 0x08c0, 0x080c, 0xb295, 0x1118,
++	0x080c, 0x9e99, 0x0090, 0x6014, 0x2048, 0x080c, 0xb0ab, 0x0168,
++	0x6020, 0x9086, 0x0003, 0x1508, 0xa867, 0x0103, 0xab7a, 0xa877,
++	0x0000, 0x080c, 0x61a9, 0x080c, 0xb278, 0x080c, 0xb4de, 0x080c,
++	0x9584, 0x080c, 0x8eec, 0x00ce, 0x0804, 0x906b, 0x2c78, 0x600c,
++	0x2060, 0x0804, 0x906b, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce,
++	0x00de, 0x00ee, 0x00fe, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006,
++	0x1d20, 0x080c, 0xc970, 0x0c08, 0x00d6, 0x080c, 0x868d, 0x7003,
++	0x0200, 0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1, 0x0001, 0x2099,
++	0x1956, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9, 0x0004, 0x4003,
++	0x7023, 0x0004, 0x7027, 0x7878, 0x080c, 0x8b24, 0x00de, 0x0005,
++	0x080c, 0x868d, 0x7003, 0x0214, 0x7007, 0x0018, 0x700b, 0x0800,
++	0x7814, 0x9084, 0xff00, 0x700e, 0x7814, 0x9084, 0x00ff, 0x7022,
++	0x782c, 0x7026, 0x60c3, 0x0018, 0x0804, 0x8b24, 0x00b6, 0x00d6,
++	0x0016, 0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, 0xb6d9, 0x00de,
++	0x1904, 0x9192, 0x080c, 0x8642, 0x7003, 0x1300, 0x782c, 0x080c,
++	0x9294, 0x2068, 0x6820, 0x9086, 0x0003, 0x0558, 0x7810, 0x2058,
++	0xbaa0, 0x080c, 0x94d3, 0x11d0, 0x9286, 0x007e, 0x1128, 0x700b,
++	0x00ff, 0x700f, 0xfffe, 0x0490, 0x9286, 0x007f, 0x1128, 0x700b,
++	0x00ff, 0x700f, 0xfffd, 0x0450, 0xd2bc, 0x0180, 0x9286, 0x0080,
++	0x1128, 0x700b, 0x00ff, 0x700f, 0xfffc, 0x0400, 0x92d8, 0x1000,
++	0x2b5c, 0xb810, 0x700a, 0xb814, 0x700e, 0x00c0, 0x6098, 0x700e,
++	0x00a8, 0x080c, 0x94d3, 0x1130, 0x7810, 0x2058, 0xb8a0, 0x9082,
++	0x007e, 0x0250, 0x00d6, 0x2069, 0x181d, 0x2d04, 0x700a, 0x8d68,
++	0x2d04, 0x700e, 0x00de, 0x0010, 0x6034, 0x700e, 0x7838, 0x7012,
++	0x783c, 0x7016, 0x60c3, 0x000c, 0x001e, 0x00de, 0x080c, 0x8b24,
++	0x00be, 0x0005, 0x781b, 0x0001, 0x7803, 0x0006, 0x001e, 0x00de,
++	0x00be, 0x0005, 0x792c, 0x9180, 0x0008, 0x200c, 0x9186, 0x0006,
++	0x01c0, 0x9186, 0x0003, 0x0904, 0x920c, 0x9186, 0x0005, 0x0904,
++	0x91f5, 0x9186, 0x0004, 0x05d8, 0x9186, 0x0008, 0x0904, 0x91fd,
++	0x7807, 0x0037, 0x782f, 0x0003, 0x7817, 0x1700, 0x080c, 0x9271,
++	0x0005, 0x080c, 0x9232, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009,
++	0x4000, 0x6800, 0x0002, 0x91d6, 0x91e1, 0x91d8, 0x91e1, 0x91dd,
++	0x91d6, 0x91d6, 0x91e1, 0x91e1, 0x91e1, 0x91e1, 0x91d6, 0x91d6,
++	0x91d6, 0x91d6, 0x91d6, 0x91e1, 0x91d6, 0x91e1, 0x080c, 0x0d84,
++	0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0x900e, 0x0010, 0x2009,
++	0x2000, 0x682c, 0x7022, 0x6830, 0x7026, 0x0804, 0x922b, 0x080c,
++	0x9232, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x6a00,
++	0x9286, 0x0002, 0x1108, 0x900e, 0x04b0, 0x04e1, 0x00d6, 0x0026,
++	0x792c, 0x2168, 0x2009, 0x4000, 0x0470, 0x04a1, 0x00d6, 0x0026,
++	0x792c, 0x2168, 0x2009, 0x4000, 0x9286, 0x0005, 0x0118, 0x9286,
++	0x0002, 0x1108, 0x900e, 0x00f8, 0x0429, 0x00d6, 0x0026, 0x792c,
++	0x2168, 0x6814, 0x0096, 0x2048, 0xa9ac, 0xa834, 0x9112, 0xa9b0,
++	0xa838, 0x009e, 0x9103, 0x7022, 0x7226, 0x792c, 0x9180, 0x0000,
++	0x2004, 0x908e, 0x0002, 0x0130, 0x908e, 0x0004, 0x0118, 0x2009,
++	0x4000, 0x0008, 0x900e, 0x712a, 0x60c3, 0x0018, 0x002e, 0x00de,
++	0x0804, 0x8b24, 0x00b6, 0x0036, 0x0046, 0x0056, 0x0066, 0x080c,
++	0x868d, 0x9006, 0x7003, 0x0200, 0x7938, 0x710a, 0x793c, 0x710e,
++	0x7810, 0x2058, 0xb8a0, 0x080c, 0x94d3, 0x1118, 0x9092, 0x007e,
++	0x0268, 0x00d6, 0x2069, 0x181d, 0x2d2c, 0x8d68, 0x2d34, 0x90d8,
++	0x1000, 0x2b5c, 0xbb10, 0xbc14, 0x00de, 0x0028, 0x901e, 0x6498,
++	0x2029, 0x0000, 0x6634, 0x782c, 0x9080, 0x0008, 0x2004, 0x9086,
++	0x0003, 0x1128, 0x7512, 0x7616, 0x731a, 0x741e, 0x0020, 0x7312,
++	0x7416, 0x751a, 0x761e, 0x006e, 0x005e, 0x004e, 0x003e, 0x00be,
++	0x0005, 0x080c, 0x868d, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814,
++	0x700e, 0x700e, 0x60c3, 0x0008, 0x0804, 0x8b24, 0x080c, 0x8639,
++	0x7003, 0x1400, 0x7838, 0x700a, 0x0079, 0x783c, 0x700e, 0x782c,
++	0x7012, 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, 0x701a,
++	0x60c3, 0x0010, 0x0804, 0x8b24, 0x00e6, 0x2071, 0x0240, 0x0006,
++	0x00f6, 0x2078, 0x7810, 0x00b6, 0x2058, 0xb8bc, 0xd084, 0x0120,
++	0x7848, 0x702a, 0x7844, 0x702e, 0x00be, 0x00fe, 0x000e, 0x00ee,
++	0x0005, 0x080c, 0x8684, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814,
++	0x700e, 0x60c3, 0x0008, 0x0804, 0x8b24, 0x0021, 0x60c3, 0x0000,
++	0x0804, 0x8b24, 0x00d6, 0x080c, 0x9363, 0xb810, 0x9085, 0x0300,
++	0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6874, 0x700a, 0x6878,
++	0x700e, 0x7013, 0x0819, 0x080c, 0x8b12, 0x721a, 0x2f10, 0x7222,
++	0x7a08, 0x7226, 0x2071, 0x024c, 0x00de, 0x0005, 0x0059, 0x7914,
++	0x712a, 0x60c3, 0x0000, 0x60a7, 0x9575, 0x080c, 0x8b47, 0x080c,
++	0x788a, 0x0005, 0x0036, 0x0096, 0x00d6, 0x00e6, 0x7858, 0x2048,
++	0xaa7c, 0x9296, 0x00c0, 0x9294, 0xfffd, 0xaa7e, 0xaa80, 0x9294,
++	0x0300, 0xaa82, 0xa96c, 0x9194, 0x00ff, 0xab74, 0x9384, 0x00ff,
++	0x908d, 0xc200, 0xa96e, 0x9384, 0xff00, 0x9215, 0xaa76, 0xa870,
++	0xaa78, 0xa87a, 0xaa72, 0x00d6, 0x2069, 0x0200, 0x080c, 0x9363,
++	0x00de, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000a, 0xa860,
++	0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x4003, 0x60a3, 0x0035,
++	0xaa68, 0x9294, 0x7000, 0x9286, 0x3000, 0x0110, 0x60a3, 0x0037,
++	0x00ee, 0x00de, 0x009e, 0x003e, 0x0005, 0x900e, 0x7814, 0x0096,
++	0x2048, 0xa87c, 0xd0fc, 0x01c0, 0x9084, 0x0003, 0x11a8, 0x2001,
++	0x180c, 0x2004, 0xd0bc, 0x0180, 0x7824, 0xd0cc, 0x1168, 0xd0c4,
++	0x1158, 0xa8a8, 0x9005, 0x1140, 0x2001, 0x180c, 0x200c, 0xc1d5,
++	0x2102, 0x2009, 0x197f, 0x210c, 0x009e, 0x918d, 0x0092, 0x0010,
++	0x2009, 0x0096, 0x60ab, 0x0036, 0x6116, 0x0005, 0x2009, 0x0009,
++	0x00a0, 0x2009, 0x000a, 0x0088, 0x2009, 0x000b, 0x0070, 0x2009,
++	0x000c, 0x0058, 0x2009, 0x000d, 0x0040, 0x2009, 0x000e, 0x0028,
++	0x2009, 0x000f, 0x0010, 0x2009, 0x0008, 0x6912, 0x0005, 0x00d6,
++	0x9290, 0x0018, 0x8214, 0x20e9, 0x0000, 0x2069, 0x0200, 0x6813,
++	0x0000, 0x22a8, 0x9284, 0x00e0, 0x0128, 0x20a9, 0x0020, 0x9292,
++	0x0020, 0x0008, 0x9016, 0x20a1, 0x0240, 0x9006, 0x4004, 0x82ff,
++	0x0120, 0x6810, 0x8000, 0x6812, 0x0c60, 0x00de, 0x0005, 0x00d6,
++	0x0096, 0x6014, 0x2048, 0x9006, 0xa836, 0xa83a, 0xa99c, 0xa946,
++	0xa84a, 0x6023, 0x0003, 0x6007, 0x0040, 0x6003, 0x0003, 0x600b,
++	0xffff, 0xa817, 0x0001, 0xa842, 0xa83e, 0x2900, 0xa85a, 0xa813,
++	0x1cdb, 0x080c, 0x7c3a, 0x0126, 0x2091, 0x8000, 0x080c, 0x820b,
++	0x012e, 0x009e, 0x00de, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6,
++	0x00a6, 0x0096, 0x0066, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b4,
++	0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, 0x9433, 0x7024, 0x9c06,
++	0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x940a, 0x080c,
++	0x8b50, 0x68c3, 0x0000, 0x080c, 0x900f, 0x7027, 0x0000, 0x0036,
++	0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100,
++	0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 0x2069, 0x0100, 0x6824,
++	0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x700c, 0x9c36, 0x1110,
++	0x660c, 0x760e, 0x7008, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118,
++	0x2f00, 0x700a, 0x0010, 0x700b, 0x0000, 0x660c, 0x0066, 0x2c00,
++	0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c,
++	0xb284, 0x1158, 0x080c, 0x2d3f, 0x080c, 0xb295, 0x11f0, 0x080c,
++	0x9e99, 0x00d8, 0x080c, 0x900f, 0x08c0, 0x080c, 0xb295, 0x1118,
++	0x080c, 0x9e99, 0x0090, 0x6014, 0x2048, 0x080c, 0xb0ab, 0x0168,
++	0x6020, 0x9086, 0x0003, 0x1520, 0xa867, 0x0103, 0xab7a, 0xa877,
++	0x0000, 0x080c, 0x61a9, 0x080c, 0xb278, 0x080c, 0xb4de, 0x080c,
++	0x9584, 0x080c, 0x8eec, 0x00ce, 0x0804, 0x93bb, 0x2c78, 0x600c,
++	0x2060, 0x0804, 0x93bb, 0x700f, 0x0000, 0x700b, 0x0000, 0x012e,
++	0x006e, 0x009e, 0x00ae, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005,
++	0x6020, 0x9086, 0x0006, 0x1d08, 0x080c, 0xc970, 0x08f0, 0x00d6,
++	0x0156, 0x080c, 0x868d, 0x7a14, 0x82ff, 0x0138, 0x7003, 0x0100,
++	0x700b, 0x0003, 0x60c3, 0x0008, 0x0490, 0x7003, 0x0200, 0x7007,
++	0x0000, 0x2069, 0x1800, 0x901e, 0x6800, 0x9086, 0x0004, 0x1110,
++	0xc38d, 0x0060, 0x080c, 0x6877, 0x1110, 0xc3ad, 0x0008, 0xc3a5,
++	0x6ad8, 0xd29c, 0x1110, 0xd2ac, 0x0108, 0xc39d, 0x730e, 0x2011,
++	0x1848, 0x63f0, 0x2312, 0x20a9, 0x0006, 0x2011, 0x1840, 0x2019,
++	0x1841, 0x2071, 0x0250, 0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398,
++	0x0002, 0x9290, 0x0002, 0x1f04, 0x947b, 0x60c3, 0x0040, 0x080c,
++	0x8b24, 0x015e, 0x00de, 0x0005, 0x0156, 0x080c, 0x868d, 0x7a14,
++	0x82ff, 0x0168, 0x9286, 0xffff, 0x0118, 0x9282, 0x000e, 0x1238,
++	0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0488, 0x7003,
++	0x0200, 0x7007, 0x001c, 0x700f, 0x0001, 0x2011, 0x198a, 0x2204,
++	0x8007, 0x701a, 0x8210, 0x2204, 0x8007, 0x701e, 0x0421, 0x1120,
++	0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181d, 0x2004, 0x7022,
++	0x2001, 0x181e, 0x2004, 0x7026, 0x0030, 0x2001, 0x1816, 0x2004,
++	0x9084, 0x00ff, 0x7026, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099,
++	0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x60c3, 0x001c,
++	0x015e, 0x0804, 0x8b24, 0x0006, 0x2001, 0x1836, 0x2004, 0xd0ac,
++	0x000e, 0x0005, 0x2011, 0x0003, 0x080c, 0x8e99, 0x2011, 0x0002,
++	0x080c, 0x8ea3, 0x080c, 0x8d59, 0x0036, 0x901e, 0x080c, 0x8dfe,
++	0x003e, 0x0005, 0x2071, 0x1882, 0x7000, 0x9005, 0x0140, 0x2001,
++	0x0976, 0x2071, 0x1800, 0x706e, 0x7072, 0x7063, 0xffe0, 0x2071,
++	0x1800, 0x706c, 0x704e, 0x7053, 0x1cd0, 0x0005, 0x00e6, 0x0126,
++	0x2071, 0x1800, 0x2091, 0x8000, 0x754c, 0x9582, 0x0010, 0x0608,
++	0x7050, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018,
++	0x7060, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003,
++	0x0008, 0x8529, 0x754e, 0x9ca8, 0x0018, 0x7060, 0x9502, 0x1230,
++	0x7552, 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x7053, 0x1cd0,
++	0x0cc0, 0x9006, 0x0cc0, 0x00e6, 0x2071, 0x1800, 0x754c, 0x9582,
++	0x0010, 0x0600, 0x7050, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148,
++	0x9ce0, 0x0018, 0x7060, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0,
++	0x0c98, 0x6003, 0x0008, 0x8529, 0x754e, 0x9ca8, 0x0018, 0x7060,
++	0x9502, 0x1228, 0x7552, 0x9085, 0x0001, 0x00ee, 0x0005, 0x7053,
++	0x1cd0, 0x0cc8, 0x9006, 0x0cc8, 0x9c82, 0x1cd0, 0x0a0c, 0x0d84,
++	0x2001, 0x1818, 0x2004, 0x9c02, 0x1a0c, 0x0d84, 0x9006, 0x6006,
++	0x600a, 0x600e, 0x6016, 0x601a, 0x6012, 0x6023, 0x0000, 0x6003,
++	0x0000, 0x601e, 0x6056, 0x605a, 0x6026, 0x602a, 0x602e, 0x6032,
++	0x6036, 0x603a, 0x603e, 0x6042, 0x2061, 0x1800, 0x604c, 0x8000,
++	0x604e, 0x9086, 0x0001, 0x0108, 0x0005, 0x0126, 0x2091, 0x8000,
++	0x080c, 0x8125, 0x012e, 0x0cc0, 0x0006, 0x6000, 0x9086, 0x0000,
++	0x01b0, 0x601c, 0xd084, 0x190c, 0x17b0, 0x6017, 0x0000, 0x6023,
++	0x0007, 0x2001, 0x1953, 0x2004, 0x0006, 0x9082, 0x0051, 0x000e,
++	0x0208, 0x8004, 0x601a, 0x080c, 0xcc1f, 0x6043, 0x0000, 0x000e,
++	0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091, 0x8000, 0x754c,
++	0x9582, 0x0001, 0x0608, 0x7050, 0x2060, 0x6000, 0x9086, 0x0000,
++	0x0148, 0x9ce0, 0x0018, 0x7060, 0x9c02, 0x1208, 0x0cb0, 0x2061,
++	0x1cd0, 0x0c98, 0x6003, 0x0008, 0x8529, 0x754e, 0x9ca8, 0x0018,
++	0x7060, 0x9502, 0x1230, 0x7552, 0x9085, 0x0001, 0x012e, 0x00ee,
++	0x0005, 0x7053, 0x1cd0, 0x0cc0, 0x9006, 0x0cc0, 0x6020, 0x9084,
++	0x000f, 0x0002, 0x95e1, 0x95ea, 0x9605, 0x9620, 0xb77d, 0xb79a,
++	0xb7b5, 0x95e1, 0x95ea, 0x95e1, 0x963c, 0x95e1, 0x95e1, 0x95e1,
++	0x95e1, 0x9186, 0x0013, 0x1128, 0x080c, 0x8026, 0x080c, 0x8125,
++	0x0005, 0x0005, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d84,
++	0x0013, 0x006e, 0x0005, 0x9603, 0x9d1f, 0x9ee0, 0x9603, 0x9f6e,
++	0x98e8, 0x9603, 0x9603, 0x9ca1, 0xa463, 0x9603, 0x9603, 0x9603,
++	0x9603, 0x9603, 0x9603, 0x080c, 0x0d84, 0x0066, 0x6000, 0x90b2,
++	0x0016, 0x1a0c, 0x0d84, 0x0013, 0x006e, 0x0005, 0x961e, 0xaaef,
++	0x961e, 0x961e, 0x961e, 0x961e, 0x961e, 0x961e, 0xaa94, 0xac61,
++	0x961e, 0xab21, 0xaba0, 0xab21, 0xaba0, 0x961e, 0x080c, 0x0d84,
++	0x6000, 0x9082, 0x0016, 0x1a0c, 0x0d84, 0x6000, 0x0002, 0x963a,
++	0xa4a5, 0xa574, 0xa69f, 0xa838, 0x963a, 0x963a, 0x963a, 0xa47e,
++	0xaa2b, 0xaa2e, 0x963a, 0x963a, 0x963a, 0x963a, 0xaa57, 0x963a,
++	0x963a, 0x963a, 0x080c, 0x0d84, 0x0066, 0x6000, 0x90b2, 0x0016,
++	0x1a0c, 0x0d84, 0x0013, 0x006e, 0x0005, 0x9655, 0x9655, 0x9694,
++	0x972f, 0x979c, 0x9655, 0x9655, 0x9655, 0x9657, 0x9655, 0x9655,
++	0x9655, 0x9655, 0x9655, 0x9655, 0x9655, 0x080c, 0x0d84, 0x9186,
++	0x004c, 0x0588, 0x9186, 0x0003, 0x190c, 0x0d84, 0x0096, 0x601c,
++	0xc0ed, 0x601e, 0x6003, 0x0003, 0x6106, 0x6014, 0x2048, 0xa87c,
++	0x9084, 0x8000, 0xc0b5, 0xa87e, 0xa8ac, 0xa846, 0xa8b0, 0xa84a,
++	0x9006, 0xa836, 0xa83a, 0xa884, 0x9092, 0x199a, 0x0210, 0x2001,
++	0x1999, 0x8003, 0x8013, 0x8213, 0x9210, 0x621a, 0x009e, 0x2c10,
++	0x080c, 0x18b7, 0x080c, 0x7c3a, 0x0126, 0x2091, 0x8000, 0x080c,
++	0x820b, 0x012e, 0x0005, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be,
++	0x2c00, 0x080c, 0x97be, 0x0005, 0x00d6, 0x0096, 0x00f6, 0x2079,
++	0x1800, 0x7a88, 0x9290, 0x0018, 0x6014, 0x2048, 0xac78, 0x0046,
++	0xa8e0, 0x9005, 0x1140, 0xa8dc, 0x921a, 0x0140, 0x0220, 0xa87b,
++	0x0007, 0x2010, 0x0028, 0xa87b, 0x0015, 0x0010, 0xa87b, 0x0000,
++	0x8214, 0xa883, 0x0000, 0xaa02, 0x0006, 0x0016, 0x0026, 0x00c6,
++	0x00d6, 0x00e6, 0x00f6, 0x2400, 0x9005, 0x1108, 0x009a, 0x2100,
++	0x9086, 0x0015, 0x1118, 0x2001, 0x0001, 0x0038, 0x2100, 0x9086,
++	0x0016, 0x0118, 0x2001, 0x0001, 0x002a, 0x94a4, 0x0007, 0x8423,
++	0x9405, 0x0002, 0x96f7, 0x96f7, 0x96f2, 0x96f5, 0x96f7, 0x96ef,
++	0x96e2, 0x96e2, 0x96e2, 0x96e2, 0x96e2, 0x96e2, 0x96e2, 0x96e2,
++	0x96e2, 0x96e2, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e,
++	0x000e, 0x004e, 0x00fe, 0x009e, 0x00de, 0x080c, 0x0d84, 0x080c,
++	0xa0f1, 0x0028, 0x080c, 0xa1cf, 0x0010, 0x080c, 0xa2bc, 0x00fe,
++	0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x2c00, 0xa896, 0x000e,
++	0x080c, 0x987c, 0x0530, 0xa804, 0xa80e, 0x00a6, 0x2050, 0xb100,
++	0x00ae, 0x8006, 0x8006, 0x8007, 0x97bc, 0x003f, 0x9084, 0xffc0,
++	0x9080, 0x0002, 0xaacc, 0xabd0, 0xacd4, 0xadd8, 0x2031, 0x0000,
++	0x2041, 0x11fd, 0x080c, 0x9a1f, 0x0160, 0x000e, 0x9005, 0x0120,
++	0x00fe, 0x009e, 0x00de, 0x0005, 0x00fe, 0x009e, 0x00de, 0x0804,
++	0x9554, 0x2001, 0x002c, 0x900e, 0x080c, 0x98db, 0x0c70, 0x9182,
++	0x0047, 0x0002, 0x973b, 0x973b, 0x973d, 0x9772, 0x973b, 0x973b,
++	0x973b, 0x973b, 0x9785, 0x080c, 0x0d84, 0x00d6, 0x0016, 0x0096,
++	0x080c, 0x80d6, 0x080c, 0x820b, 0x6003, 0x0004, 0x6114, 0x2148,
++	0xa87c, 0xd0fc, 0x01b8, 0xa878, 0x9005, 0x1158, 0xa894, 0x9005,
++	0x0140, 0x2001, 0x0000, 0x900e, 0x080c, 0x98db, 0x080c, 0x9554,
++	0x00a8, 0x6003, 0x0002, 0xa8a4, 0xa9a8, 0x9105, 0x1178, 0xa8ae,
++	0xa8b2, 0x0c78, 0xa87f, 0x0020, 0xa88c, 0xa88a, 0xa8a4, 0xa8ae,
++	0xa8a8, 0xa8b2, 0xa8c7, 0x0000, 0xa8cb, 0x0000, 0x009e, 0x001e,
++	0x00de, 0x0005, 0x080c, 0x80d6, 0x00d6, 0x0096, 0x6114, 0x2148,
++	0x080c, 0xb0ad, 0x0120, 0xa87b, 0x0006, 0x080c, 0x61a9, 0x009e,
++	0x00de, 0x080c, 0x9554, 0x0804, 0x820b, 0x080c, 0x80d6, 0x080c,
++	0x2d1a, 0x080c, 0xb76c, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c,
++	0xb0ad, 0x0120, 0xa87b, 0x0029, 0x080c, 0x61a9, 0x009e, 0x00de,
++	0x080c, 0x9554, 0x0804, 0x820b, 0x9182, 0x0047, 0x0002, 0x97ac,
++	0x97ae, 0x97ac, 0x97ac, 0x97ac, 0x97ac, 0x97ac, 0x97ac, 0x97ac,
++	0x97ac, 0x97ac, 0x97ac, 0x97ae, 0x080c, 0x0d84, 0x00d6, 0x0096,
++	0x080c, 0x1489, 0x6114, 0x2148, 0xa87b, 0x0000, 0xa883, 0x0000,
++	0x080c, 0x61a9, 0x009e, 0x00de, 0x0804, 0x9554, 0x0026, 0x0036,
++	0x0056, 0x0066, 0x0096, 0x00a6, 0x00f6, 0x0006, 0x080c, 0x0fae,
++	0x000e, 0x090c, 0x0d84, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019,
++	0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xa87a, 0x2079, 0x1800,
++	0x7988, 0x9188, 0x0018, 0x918c, 0x0fff, 0xa972, 0xac76, 0x2950,
++	0x00a6, 0x2001, 0x0205, 0x2003, 0x0000, 0x901e, 0x2029, 0x0001,
++	0x9182, 0x0034, 0x1228, 0x2011, 0x001f, 0x080c, 0xace6, 0x04c0,
++	0x2130, 0x2009, 0x0034, 0x2011, 0x001f, 0x080c, 0xace6, 0x96b2,
++	0x0034, 0xb004, 0x904d, 0x0110, 0x080c, 0x0f60, 0x080c, 0x0fae,
++	0x01d0, 0x8528, 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406,
++	0x968a, 0x003d, 0x1230, 0x2608, 0x2011, 0x001b, 0x080c, 0xace6,
++	0x00b8, 0x96b2, 0x003c, 0x2009, 0x003c, 0x2950, 0x2011, 0x001b,
++	0x080c, 0xace6, 0x0c18, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae,
++	0x852f, 0x95ad, 0x0050, 0xb566, 0xb070, 0xc0fd, 0xb072, 0x0048,
++	0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0050,
++	0xb566, 0x2a48, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, 0x61a9,
++	0x000e, 0x2048, 0x9005, 0x1db0, 0x00fe, 0x00ae, 0x009e, 0x006e,
++	0x005e, 0x003e, 0x002e, 0x0005, 0x00d6, 0x00f6, 0x0096, 0x0006,
++	0x080c, 0x0fae, 0x000e, 0x090c, 0x0d84, 0xa960, 0x21e8, 0xa95c,
++	0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xaa66,
++	0xa87a, 0x2079, 0x1800, 0x7988, 0x810c, 0x9188, 0x000c, 0x9182,
++	0x001a, 0x0210, 0x2009, 0x001a, 0x21a8, 0x810b, 0xa972, 0xac76,
++	0x2e98, 0xa85c, 0x9080, 0x001f, 0x20a0, 0x2001, 0x0205, 0x200c,
++	0x918d, 0x0080, 0x2102, 0x4003, 0x2003, 0x0000, 0x080c, 0x61a9,
++	0x009e, 0x00fe, 0x00de, 0x0005, 0x0016, 0x00d6, 0x00f6, 0x0096,
++	0x0016, 0x2001, 0x0205, 0x200c, 0x918d, 0x0080, 0x2102, 0x001e,
++	0x2079, 0x0200, 0x2e98, 0x2021, 0x003e, 0x901e, 0x9282, 0x0020,
++	0x0218, 0x2011, 0x0020, 0x2018, 0x9486, 0x003e, 0x1170, 0x0096,
++	0x080c, 0x0fae, 0x2900, 0x009e, 0x05b8, 0xa806, 0x2048, 0xa860,
++	0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x3300, 0x908e, 0x0260,
++	0x0140, 0x2009, 0x0280, 0x9102, 0x920a, 0x0218, 0x2010, 0x2100,
++	0x9318, 0x2200, 0x9402, 0x1220, 0x2410, 0x9006, 0x9398, 0x0002,
++	0x2020, 0x22a8, 0xa800, 0x9200, 0xa802, 0x20e1, 0x0000, 0x4003,
++	0x83ff, 0x0180, 0x3300, 0x9086, 0x0280, 0x1130, 0x7814, 0x8000,
++	0x9085, 0x0080, 0x7816, 0x2e98, 0x2310, 0x84ff, 0x0904, 0x988b,
++	0x0804, 0x988d, 0x9085, 0x0001, 0x7817, 0x0000, 0x009e, 0x00fe,
++	0x00de, 0x001e, 0x0005, 0x00d6, 0x0036, 0x0096, 0x6314, 0x2348,
++	0xa87a, 0xa982, 0x080c, 0x619c, 0x009e, 0x003e, 0x00de, 0x0005,
++	0x91b6, 0x0015, 0x1118, 0x080c, 0x9554, 0x0030, 0x91b6, 0x0016,
++	0x190c, 0x0d84, 0x080c, 0x9554, 0x0005, 0x20a9, 0x000e, 0x20e1,
++	0x0000, 0x2e98, 0x6014, 0x0096, 0x2048, 0xa860, 0x20e8, 0xa85c,
++	0x20a0, 0x009e, 0x4003, 0x0136, 0x9080, 0x001b, 0x2011, 0x0006,
++	0x20a9, 0x0001, 0x3418, 0x8318, 0x23a0, 0x4003, 0x3318, 0x8318,
++	0x2398, 0x8211, 0x1db8, 0x2011, 0x0006, 0x013e, 0x20a0, 0x3318,
++	0x8318, 0x2398, 0x4003, 0x3418, 0x8318, 0x23a0, 0x8211, 0x1db8,
++	0x0096, 0x080c, 0xb0ad, 0x0130, 0x6014, 0x2048, 0xa807, 0x0000,
++	0xa867, 0x0103, 0x009e, 0x0804, 0x9554, 0x0096, 0x00d6, 0x0036,
++	0x7330, 0x9386, 0x0200, 0x11a8, 0x6010, 0x00b6, 0x2058, 0xb8bf,
++	0x0000, 0x00be, 0x6014, 0x9005, 0x0130, 0x2048, 0xa807, 0x0000,
++	0xa867, 0x0103, 0xab32, 0x080c, 0x9554, 0x003e, 0x00de, 0x009e,
++	0x0005, 0x0011, 0x1d48, 0x0cc8, 0x0006, 0x0016, 0x080c, 0xb759,
++	0x0188, 0x6014, 0x9005, 0x1170, 0x600b, 0x0003, 0x601b, 0x0000,
++	0x6043, 0x0000, 0x2009, 0x0022, 0x080c, 0x9cf7, 0x9006, 0x001e,
++	0x000e, 0x0005, 0x9085, 0x0001, 0x0cd0, 0x0096, 0x0016, 0x20a9,
++	0x0014, 0x9e80, 0x000c, 0x20e1, 0x0000, 0x2098, 0x6014, 0x2048,
++	0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x2001,
++	0x0205, 0x2003, 0x0001, 0x2099, 0x0260, 0x20a9, 0x0016, 0x4003,
++	0x20a9, 0x000a, 0xa804, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080,
++	0x0002, 0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0002, 0x2099,
++	0x0260, 0x20a9, 0x0020, 0x4003, 0x2003, 0x0000, 0x6014, 0x2048,
++	0xa800, 0x2048, 0xa867, 0x0103, 0x080c, 0x9554, 0x001e, 0x009e,
++	0x0005, 0x0096, 0x0016, 0x900e, 0x7030, 0x9086, 0x0100, 0x0140,
++	0x7038, 0x9084, 0x00ff, 0x800c, 0x703c, 0x9084, 0x00ff, 0x8004,
++	0x9080, 0x0004, 0x9108, 0x810b, 0x2011, 0x0002, 0x2019, 0x000c,
++	0x6014, 0x2048, 0x080c, 0xace6, 0x080c, 0xb0ad, 0x0140, 0x6014,
++	0x2048, 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c,
++	0x9554, 0x001e, 0x009e, 0x0005, 0x0016, 0x0096, 0x7030, 0x9086,
++	0x0100, 0x1118, 0x2009, 0x0004, 0x0010, 0x7034, 0x800c, 0x810b,
++	0x2011, 0x000c, 0x2019, 0x000c, 0x6014, 0x2048, 0xa804, 0x0096,
++	0x9005, 0x0108, 0x2048, 0x080c, 0xace6, 0x009e, 0x080c, 0xb0ad,
++	0x0148, 0xa804, 0x9005, 0x1158, 0xa807, 0x0000, 0xa864, 0xa8e2,
++	0xa867, 0x0103, 0x080c, 0x9554, 0x009e, 0x001e, 0x0005, 0x0086,
++	0x2040, 0xa030, 0x8007, 0x9086, 0x0100, 0x1118, 0x080c, 0x9e99,
++	0x00e0, 0xa034, 0x8007, 0x800c, 0x8806, 0x8006, 0x8007, 0x90bc,
++	0x003f, 0x9084, 0xffc0, 0x9080, 0x000c, 0xa87b, 0x0000, 0xa883,
++	0x0000, 0xa897, 0x4000, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031,
++	0x0000, 0x2041, 0x11e3, 0x0019, 0x0d08, 0x008e, 0x0898, 0x0096,
++	0x0006, 0x080c, 0x0fae, 0x000e, 0x01b0, 0xa8ab, 0x0dcb, 0xa876,
++	0x000e, 0xa8a2, 0x0006, 0xae6a, 0x2800, 0xa89e, 0xa97a, 0xaf72,
++	0xaa8e, 0xab92, 0xac96, 0xad9a, 0x0086, 0x2940, 0x080c, 0x108c,
++	0x008e, 0x9085, 0x0001, 0x009e, 0x0005, 0x00e6, 0x00d6, 0x0026,
++	0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, 0xba10, 0x00be,
++	0x9206, 0x1520, 0x700c, 0x6210, 0x00b6, 0x2258, 0xba14, 0x00be,
++	0x9206, 0x11e0, 0x6043, 0x0000, 0x2c68, 0x0016, 0x2009, 0x0035,
++	0x080c, 0xb6d9, 0x001e, 0x1158, 0x622c, 0x2268, 0x2071, 0x026c,
++	0x6b20, 0x9386, 0x0003, 0x0130, 0x9386, 0x0006, 0x0128, 0x080c,
++	0x9554, 0x0020, 0x0039, 0x0010, 0x080c, 0x9b31, 0x002e, 0x00de,
++	0x00ee, 0x0005, 0x0096, 0x6814, 0x2048, 0x9186, 0x0015, 0x0904,
++	0x9b19, 0x918e, 0x0016, 0x1904, 0x9b2f, 0x700c, 0x908c, 0xff00,
++	0x9186, 0x1700, 0x0120, 0x9186, 0x0300, 0x1904, 0x9af3, 0x89ff,
++	0x1138, 0x6800, 0x9086, 0x000f, 0x0904, 0x9ad6, 0x0804, 0x9b2d,
++	0x6808, 0x9086, 0xffff, 0x1904, 0x9b1b, 0xa87c, 0x9084, 0x0060,
++	0x9086, 0x0020, 0x1128, 0xa83c, 0xa940, 0x9105, 0x1904, 0x9b1b,
++	0x6824, 0xd0b4, 0x1904, 0x9b1b, 0x080c, 0xb278, 0x685c, 0xa882,
++	0xa87c, 0xc0dc, 0xc0f4, 0xc0d4, 0xa87e, 0x0026, 0x900e, 0x6a18,
++	0x2001, 0x000a, 0x080c, 0x7a4b, 0xa884, 0x920a, 0x0208, 0x8011,
++	0xaa86, 0x82ff, 0x002e, 0x1138, 0x00c6, 0x2d60, 0x080c, 0xae04,
++	0x00ce, 0x0804, 0x9b2d, 0x00c6, 0xa868, 0xd0fc, 0x1118, 0x080c,
++	0x5755, 0x0010, 0x080c, 0x5ac6, 0x00ce, 0x1904, 0x9b1b, 0x00c6,
++	0x2d60, 0x080c, 0x9554, 0x00ce, 0x0804, 0x9b2d, 0x00c6, 0x080c,
++	0x95a1, 0x0198, 0x6017, 0x0000, 0x6810, 0x6012, 0x080c, 0xb4e6,
++	0x6023, 0x0003, 0x6904, 0x00c6, 0x2d60, 0x080c, 0x9554, 0x00ce,
++	0x080c, 0x95ce, 0x00ce, 0x0804, 0x9b2d, 0x2001, 0x1955, 0x2004,
++	0x6842, 0x00ce, 0x04d0, 0x7008, 0x9086, 0x000b, 0x11c8, 0x6010,
++	0x00b6, 0x2058, 0xb900, 0xc1bc, 0xb902, 0x00be, 0x00c6, 0x2d60,
++	0xa883, 0x0003, 0x080c, 0xb71f, 0x6007, 0x0085, 0x6003, 0x000b,
++	0x6023, 0x0002, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x00ce, 0x00e8,
++	0x700c, 0x9086, 0x2a00, 0x1138, 0x2001, 0x1955, 0x2004, 0x6842,
++	0x00a0, 0x0479, 0x00a0, 0x89ff, 0x090c, 0x0d84, 0x00c6, 0x00d6,
++	0x2d60, 0xa867, 0x0103, 0xa87b, 0x0003, 0x080c, 0xacd6, 0x080c,
++	0xb278, 0x080c, 0x9584, 0x00de, 0x00ce, 0x080c, 0x9554, 0x009e,
++	0x0005, 0x9186, 0x0015, 0x1128, 0x2001, 0x1955, 0x2004, 0x6842,
++	0x0068, 0x918e, 0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c,
++	0xcc1f, 0x080c, 0x79df, 0x080c, 0x9554, 0x00ce, 0x080c, 0x9554,
++	0x0005, 0x0026, 0x0036, 0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4,
++	0x0130, 0x2001, 0x1955, 0x2004, 0x6842, 0x0804, 0x9ba9, 0x00c6,
++	0x2d60, 0x080c, 0xad11, 0x00ce, 0x6804, 0x9086, 0x0050, 0x1168,
++	0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c,
++	0x7bcb, 0x080c, 0x8125, 0x00ce, 0x04e0, 0x6800, 0x9086, 0x000f,
++	0x01b0, 0x89ff, 0x090c, 0x0d84, 0x6800, 0x9086, 0x0004, 0x1198,
++	0xa87c, 0xd0ac, 0x0180, 0xa843, 0x0fff, 0xa83f, 0x0fff, 0xa880,
++	0xc0f4, 0xc0fc, 0xa882, 0x2001, 0x0001, 0x6832, 0x00e8, 0x2001,
++	0x0007, 0x6832, 0x00c8, 0xa87c, 0xd0b4, 0x1138, 0xd0ac, 0x0db8,
++	0xa838, 0xa934, 0x9105, 0x0d98, 0x0c30, 0xd2ec, 0x1d80, 0x7024,
++	0x9306, 0x1118, 0x7020, 0x9406, 0x0d50, 0x7020, 0x683e, 0x7024,
++	0x683a, 0x2001, 0x0005, 0x6832, 0x080c, 0xb3e0, 0x080c, 0x8125,
++	0x0010, 0x080c, 0x9554, 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6,
++	0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258,
++	0xba10, 0x00be, 0x9206, 0x1904, 0x9c11, 0x700c, 0x6210, 0x00b6,
++	0x2258, 0xba14, 0x00be, 0x9206, 0x1904, 0x9c11, 0x6038, 0x2068,
++	0x6a20, 0x9286, 0x0007, 0x0904, 0x9c11, 0x9286, 0x0002, 0x0904,
++	0x9c11, 0x9286, 0x0000, 0x05e8, 0x6808, 0x633c, 0x9306, 0x15c8,
++	0x2071, 0x026c, 0x9186, 0x0015, 0x0570, 0x918e, 0x0016, 0x1100,
++	0x00c6, 0x6038, 0x2060, 0x6104, 0x9186, 0x004b, 0x01c0, 0x9186,
++	0x004c, 0x01a8, 0x9186, 0x004d, 0x0190, 0x9186, 0x004e, 0x0178,
++	0x9186, 0x0052, 0x0160, 0x6014, 0x0096, 0x2048, 0x080c, 0xb0ad,
++	0x090c, 0x0d84, 0xa883, 0x0003, 0x009e, 0x080c, 0xb71f, 0x6007,
++	0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x7bcb, 0x080c,
++	0x8125, 0x00ce, 0x0030, 0x6038, 0x2070, 0x2001, 0x1955, 0x2004,
++	0x7042, 0x080c, 0x9554, 0x002e, 0x00de, 0x00ee, 0x0005, 0x00b6,
++	0x0096, 0x00f6, 0x6014, 0x2048, 0x6010, 0x2058, 0x91b6, 0x0015,
++	0x0130, 0xba08, 0xbb0c, 0xbc00, 0xc48c, 0xbc02, 0x0460, 0x0096,
++	0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0010, 0x2019, 0x000a,
++	0x20a9, 0x0004, 0x080c, 0xa439, 0x002e, 0x003e, 0x015e, 0x009e,
++	0x1904, 0x9c80, 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90,
++	0x0014, 0x2019, 0x0006, 0x20a9, 0x0004, 0x080c, 0xa439, 0x002e,
++	0x003e, 0x015e, 0x009e, 0x15a0, 0x7238, 0xba0a, 0x733c, 0xbb0e,
++	0xbc00, 0xc48d, 0xbc02, 0xa804, 0x9005, 0x1128, 0x00fe, 0x009e,
++	0x00be, 0x0804, 0x9920, 0x0096, 0x2048, 0xaa12, 0xab16, 0xac0a,
++	0x009e, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0,
++	0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4,
++	0x2031, 0x0000, 0x2041, 0x11e3, 0x080c, 0x9a1f, 0x0130, 0x00fe,
++	0x009e, 0x080c, 0x9554, 0x00be, 0x0005, 0x080c, 0x9e99, 0x0cb8,
++	0x2b78, 0x00f6, 0x080c, 0x2d1a, 0x080c, 0xb76c, 0x00fe, 0x00c6,
++	0x080c, 0x94fe, 0x2f00, 0x6012, 0x6017, 0x0000, 0x6023, 0x0001,
++	0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x080c, 0x5b61,
++	0x080c, 0x5b8d, 0x080c, 0x7c1d, 0x080c, 0x8125, 0x00ce, 0x0804,
++	0x9c53, 0x2100, 0x91b2, 0x0053, 0x1a0c, 0x0d84, 0x91b2, 0x0040,
++	0x1a04, 0x9d09, 0x0002, 0x9cf7, 0x9cf7, 0x9ced, 0x9cf7, 0x9cf7,
++	0x9cf7, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb,
++	0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb,
++	0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb,
++	0x9ceb, 0x9ceb, 0x9cf7, 0x9ceb, 0x9cf7, 0x9cf7, 0x9ceb, 0x9ceb,
++	0x9ceb, 0x9ceb, 0x9ceb, 0x9ced, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb,
++	0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9cf7, 0x9cf7, 0x9ceb,
++	0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb,
++	0x9cf7, 0x9ceb, 0x9ceb, 0x080c, 0x0d84, 0x0066, 0x00b6, 0x6610,
++	0x2658, 0xb8bc, 0xc08c, 0xb8be, 0x00be, 0x006e, 0x0000, 0x6003,
++	0x0001, 0x6106, 0x9186, 0x0032, 0x0118, 0x080c, 0x7c1d, 0x0010,
++	0x080c, 0x7bcb, 0x0126, 0x2091, 0x8000, 0x080c, 0x8125, 0x012e,
++	0x0005, 0x2600, 0x0002, 0x9d1d, 0x9d1d, 0x9d1d, 0x9cf7, 0x9cf7,
++	0x9d1d, 0x9d1d, 0x9d1d, 0x9d1d, 0x9cf7, 0x9d1d, 0x9cf7, 0x9d1d,
++	0x9cf7, 0x9d1d, 0x9d1d, 0x9d1d, 0x9d1d, 0x080c, 0x0d84, 0x6004,
++	0x90b2, 0x0053, 0x1a0c, 0x0d84, 0x91b6, 0x0013, 0x0904, 0x9dd4,
++	0x91b6, 0x0027, 0x1904, 0x9d8f, 0x080c, 0x8026, 0x6004, 0x080c,
++	0xb284, 0x01a8, 0x080c, 0xb295, 0x01a0, 0x908e, 0x0021, 0x0904,
++	0x9d8c, 0x908e, 0x0022, 0x1130, 0x080c, 0x994c, 0x0904, 0x9d88,
++	0x0804, 0x9d89, 0x908e, 0x003d, 0x0904, 0x9d8c, 0x04d8, 0x080c,
++	0x2d3f, 0x2001, 0x0007, 0x080c, 0x5b61, 0x6010, 0x00b6, 0x2058,
++	0xb9a0, 0x00be, 0x080c, 0x9e99, 0x9186, 0x007e, 0x1148, 0x2001,
++	0x1836, 0x2014, 0xc285, 0x080c, 0x6877, 0x1108, 0xc2ad, 0x2202,
++	0x0036, 0x2019, 0x0028, 0x080c, 0x2e2f, 0x003e, 0x0016, 0x0026,
++	0x0036, 0x2110, 0x2019, 0x0028, 0x080c, 0x7d55, 0x0076, 0x903e,
++	0x080c, 0x7c4d, 0x6010, 0x00b6, 0x905d, 0x0100, 0x00be, 0x2c08,
++	0x080c, 0xc73e, 0x007e, 0x003e, 0x002e, 0x001e, 0x080c, 0xb76c,
++	0x080c, 0x5bd1, 0x080c, 0xb4de, 0x080c, 0x9554, 0x080c, 0x8125,
++	0x0005, 0x080c, 0x9e99, 0x0cb0, 0x080c, 0x9ed5, 0x0c98, 0x9186,
++	0x0014, 0x1db0, 0x080c, 0x8026, 0x6004, 0x908e, 0x0022, 0x1118,
++	0x080c, 0x994c, 0x0d68, 0x080c, 0x2d1a, 0x080c, 0xb76c, 0x080c,
++	0xb284, 0x1190, 0x080c, 0x2d3f, 0x6010, 0x00b6, 0x2058, 0xb9a0,
++	0x00be, 0x080c, 0x9e99, 0x9186, 0x007e, 0x1128, 0x2001, 0x1836,
++	0x200c, 0xc185, 0x2102, 0x0870, 0x080c, 0xb295, 0x1118, 0x080c,
++	0x9e99, 0x0840, 0x6004, 0x908e, 0x0032, 0x1160, 0x00e6, 0x00f6,
++	0x2071, 0x1893, 0x2079, 0x0000, 0x080c, 0x308f, 0x00fe, 0x00ee,
++	0x0804, 0x9d82, 0x6004, 0x908e, 0x0021, 0x0d48, 0x908e, 0x0022,
++	0x090c, 0x9e99, 0x0804, 0x9d82, 0x90b2, 0x0040, 0x1a04, 0x9e82,
++	0x2008, 0x0002, 0x9e1c, 0x9e1d, 0x9e20, 0x9e23, 0x9e26, 0x9e29,
++	0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a,
++	0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a,
++	0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a,
++	0x9e2c, 0x9e37, 0x9e1a, 0x9e39, 0x9e37, 0x9e1a, 0x9e1a, 0x9e1a,
++	0x9e1a, 0x9e1a, 0x9e37, 0x9e37, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a,
++	0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e69, 0x9e37, 0x9e1a, 0x9e33,
++	0x9e1a, 0x9e1a, 0x9e1a, 0x9e34, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e37,
++	0x9e60, 0x9e1a, 0x080c, 0x0d84, 0x00d0, 0x2001, 0x000b, 0x0410,
++	0x2001, 0x0003, 0x00f8, 0x2001, 0x0005, 0x00e0, 0x2001, 0x0001,
++	0x00c8, 0x2001, 0x0009, 0x00b0, 0x080c, 0x8026, 0x6003, 0x0005,
++	0x080c, 0x8125, 0x0070, 0x0018, 0x0010, 0x080c, 0x5b61, 0x0804,
++	0x9e7a, 0x080c, 0x8026, 0x080c, 0xb76f, 0x6003, 0x0004, 0x080c,
++	0x8125, 0x0005, 0x080c, 0x5b61, 0x080c, 0x8026, 0x6003, 0x0002,
++	0x0036, 0x2019, 0x185d, 0x2304, 0x9084, 0xff00, 0x1120, 0x2001,
++	0x1953, 0x201c, 0x0040, 0x8007, 0x909a, 0x0004, 0x0ec0, 0x8003,
++	0x801b, 0x831b, 0x9318, 0x631a, 0x003e, 0x080c, 0x8125, 0x0c08,
++	0x080c, 0x8026, 0x080c, 0xb4de, 0x080c, 0x9554, 0x080c, 0x8125,
++	0x08c0, 0x00e6, 0x00f6, 0x2071, 0x1893, 0x2079, 0x0000, 0x080c,
++	0x308f, 0x00fe, 0x00ee, 0x080c, 0x8026, 0x080c, 0x9554, 0x080c,
++	0x8125, 0x0838, 0x080c, 0x8026, 0x6003, 0x0002, 0x080c, 0xb76f,
++	0x0804, 0x8125, 0x2600, 0x2008, 0x0002, 0x9e97, 0x9e97, 0x9e97,
++	0x9e7a, 0x9e7a, 0x9e97, 0x9e97, 0x9e97, 0x9e97, 0x9e7a, 0x9e97,
++	0x9e7a, 0x9e97, 0x9e7a, 0x9e97, 0x9e97, 0x9e97, 0x9e97, 0x080c,
++	0x0d84, 0x00e6, 0x0096, 0x0026, 0x0016, 0x080c, 0xb0ad, 0x0568,
++	0x6014, 0x2048, 0xa864, 0x9086, 0x0139, 0x11a8, 0xa894, 0x9086,
++	0x0056, 0x1148, 0x080c, 0x4b95, 0x0130, 0x2001, 0x0000, 0x900e,
++	0x2011, 0x4000, 0x0028, 0x2001, 0x0030, 0x900e, 0x2011, 0x4005,
++	0x080c, 0xb644, 0x0090, 0xa868, 0xd0fc, 0x0178, 0xa807, 0x0000,
++	0x0016, 0x6004, 0x908e, 0x0021, 0x0168, 0x908e, 0x003d, 0x0150,
++	0x001e, 0xa867, 0x0103, 0xa833, 0x0100, 0x001e, 0x002e, 0x009e,
++	0x00ee, 0x0005, 0x001e, 0x0009, 0x0cc0, 0x0096, 0x6014, 0x2048,
++	0xa800, 0x2048, 0xa867, 0x0103, 0xa823, 0x8001, 0x009e, 0x0005,
++	0x00b6, 0x6610, 0x2658, 0xb804, 0x9084, 0x00ff, 0x90b2, 0x000c,
++	0x1a0c, 0x0d84, 0x6604, 0x96b6, 0x004d, 0x1120, 0x080c, 0xb56a,
++	0x0804, 0x9f5d, 0x6604, 0x96b6, 0x0043, 0x1120, 0x080c, 0xb5b3,
++	0x0804, 0x9f5d, 0x6604, 0x96b6, 0x004b, 0x1120, 0x080c, 0xb5df,
++	0x0804, 0x9f5d, 0x6604, 0x96b6, 0x0033, 0x1120, 0x080c, 0xb500,
++	0x0804, 0x9f5d, 0x6604, 0x96b6, 0x0028, 0x1120, 0x080c, 0xb2c4,
++	0x0804, 0x9f5d, 0x6604, 0x96b6, 0x0029, 0x1120, 0x080c, 0xb305,
++	0x0804, 0x9f5d, 0x6604, 0x96b6, 0x001f, 0x1118, 0x080c, 0x98f5,
++	0x04e0, 0x6604, 0x96b6, 0x0000, 0x1118, 0x080c, 0x9c17, 0x04a8,
++	0x6604, 0x96b6, 0x0022, 0x1118, 0x080c, 0x992d, 0x0470, 0x6604,
++	0x96b6, 0x0035, 0x1118, 0x080c, 0x9a3d, 0x0438, 0x6604, 0x96b6,
++	0x0039, 0x1118, 0x080c, 0x9baf, 0x0400, 0x6604, 0x96b6, 0x003d,
++	0x1118, 0x080c, 0x9965, 0x00c8, 0x6604, 0x96b6, 0x0044, 0x1118,
++	0x080c, 0x99a1, 0x0090, 0x6604, 0x96b6, 0x0049, 0x1118, 0x080c,
++	0x99cc, 0x0058, 0x91b6, 0x0015, 0x1110, 0x0063, 0x0030, 0x91b6,
++	0x0016, 0x1128, 0x00be, 0x0804, 0xa178, 0x00be, 0x0005, 0x080c,
++	0x95e9, 0x0cd8, 0x9f7a, 0x9f7d, 0x9f7a, 0x9fc2, 0x9f7a, 0xa0f1,
++	0xa185, 0x9f7a, 0x9f7a, 0xa152, 0x9f7a, 0xa166, 0x0096, 0x080c,
++	0x1489, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0x009e,
++	0x0804, 0x9554, 0xa001, 0xa001, 0x0005, 0x00e6, 0x2071, 0x1800,
++	0x7088, 0x9086, 0x0074, 0x1540, 0x080c, 0xc70f, 0x11b0, 0x6010,
++	0x00b6, 0x2058, 0x7030, 0xd08c, 0x0128, 0xb800, 0xd0bc, 0x0110,
++	0xc0c5, 0xb802, 0x00e9, 0x00be, 0x2001, 0x0006, 0x080c, 0x5b61,
++	0x080c, 0x2d3f, 0x080c, 0x9554, 0x0088, 0x2001, 0x000a, 0x080c,
++	0x5b61, 0x080c, 0x2d3f, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c,
++	0x7c1d, 0x080c, 0x8125, 0x0010, 0x080c, 0xa0dc, 0x00ee, 0x0005,
++	0x00d6, 0xb800, 0xd084, 0x0160, 0x9006, 0x080c, 0x5b4d, 0x2069,
++	0x1852, 0x6804, 0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c, 0x5b8d,
++	0x00de, 0x0005, 0x00b6, 0x0096, 0x00d6, 0x2011, 0x1822, 0x2204,
++	0x9086, 0x0074, 0x1904, 0xa0c0, 0x6010, 0x2058, 0xbaa0, 0x9286,
++	0x007e, 0x1120, 0x080c, 0xa2c7, 0x0804, 0xa025, 0x080c, 0xa2bc,
++	0x6010, 0x2058, 0xbaa0, 0x9286, 0x0080, 0x1510, 0x6014, 0x9005,
++	0x01a8, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140,
++	0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xb644, 0x0030,
++	0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x2001, 0x0006,
++	0x080c, 0x5b61, 0x080c, 0x2d3f, 0x080c, 0x9554, 0x0804, 0xa0c1,
++	0x080c, 0xa0c5, 0x6014, 0x9005, 0x0190, 0x2048, 0xa868, 0xd0f4,
++	0x0170, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1d08, 0x2001,
++	0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xb644, 0x08f8, 0x2001,
++	0x0004, 0x080c, 0x5b61, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c,
++	0x7c1d, 0x080c, 0x8125, 0x0804, 0xa0c1, 0xb85c, 0xd0e4, 0x01d0,
++	0x080c, 0xb480, 0x080c, 0x6877, 0x0110, 0xd0dc, 0x1938, 0x2011,
++	0x1836, 0x2204, 0xc0ad, 0x2012, 0x2001, 0x193c, 0x2004, 0x00f6,
++	0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, 0x2471, 0x78e2, 0x00fe,
++	0x0804, 0x9ff6, 0x080c, 0xb4bd, 0x2011, 0x1836, 0x2204, 0xc0a5,
++	0x2012, 0x0006, 0x080c, 0xc860, 0x000e, 0x1904, 0x9ff6, 0xc0b5,
++	0x2012, 0x2001, 0x0006, 0x080c, 0x5b61, 0x9006, 0x080c, 0x5b4d,
++	0x00c6, 0x2001, 0x180e, 0x2004, 0xd09c, 0x0520, 0x00f6, 0x2079,
++	0x0100, 0x00e6, 0x2071, 0x1800, 0x700c, 0x9084, 0x00ff, 0x78e6,
++	0x7076, 0x7010, 0x78ea, 0x707a, 0x908c, 0x00ff, 0x00ee, 0x780c,
++	0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2446, 0x00f6, 0x2100, 0x900e,
++	0x080c, 0x23fd, 0x7956, 0x00fe, 0x9186, 0x0081, 0x01d8, 0x2009,
++	0x0081, 0x00c8, 0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea,
++	0x7932, 0x7936, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2446,
++	0x00f6, 0x2079, 0x1800, 0x797a, 0x2100, 0x900e, 0x080c, 0x23fd,
++	0x7956, 0x00fe, 0x8108, 0x080c, 0x5bb0, 0x2b00, 0x00ce, 0x1904,
++	0x9ff6, 0x6012, 0x2009, 0x180e, 0x210c, 0xd19c, 0x0150, 0x2009,
++	0x027c, 0x210c, 0x918c, 0x00ff, 0xb912, 0x2009, 0x027d, 0x210c,
++	0xb916, 0x2001, 0x0002, 0x080c, 0x5b61, 0x6023, 0x0001, 0x6003,
++	0x0001, 0x6007, 0x0002, 0x080c, 0x7c1d, 0x080c, 0x8125, 0x0008,
++	0x00d9, 0x00de, 0x009e, 0x00be, 0x0005, 0x00e6, 0x080c, 0xccd1,
++	0x0188, 0x2071, 0x0260, 0x7108, 0x720c, 0x918c, 0x00ff, 0x1118,
++	0x9284, 0xff00, 0x0138, 0x6010, 0x2058, 0xb8a0, 0xd0bc, 0x1110,
++	0xb912, 0xba16, 0x00ee, 0x0005, 0x2030, 0x2001, 0x0007, 0x080c,
++	0x5b61, 0x080c, 0x4dfe, 0x1120, 0x2001, 0x0007, 0x080c, 0x5b8d,
++	0x080c, 0x2d3f, 0x6020, 0x9086, 0x000a, 0x1108, 0x0005, 0x0804,
++	0x9554, 0x00b6, 0x00e6, 0x0026, 0x0016, 0x2071, 0x1800, 0x7088,
++	0x9086, 0x0014, 0x1904, 0xa149, 0x080c, 0x4dfe, 0x1170, 0x6014,
++	0x9005, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021,
++	0x0006, 0x080c, 0x44f9, 0x004e, 0x003e, 0x00d6, 0x6010, 0x2058,
++	0x080c, 0x5ca8, 0x080c, 0x9fb0, 0x00de, 0x080c, 0xa38d, 0x1588,
++	0x6010, 0x2058, 0xb890, 0x9005, 0x0560, 0x2001, 0x0006, 0x080c,
++	0x5b61, 0x0096, 0x6014, 0x904d, 0x01d0, 0xa864, 0x9084, 0x00ff,
++	0x9086, 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000,
++	0x080c, 0xb644, 0x0060, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0029,
++	0x0130, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x009e,
++	0x080c, 0x2d3f, 0x6020, 0x9086, 0x000a, 0x0138, 0x080c, 0x9554,
++	0x0020, 0x080c, 0x9e99, 0x080c, 0xa0dc, 0x001e, 0x002e, 0x00ee,
++	0x00be, 0x0005, 0x2011, 0x1822, 0x2204, 0x9086, 0x0014, 0x1160,
++	0x2001, 0x0002, 0x080c, 0x5b61, 0x6003, 0x0001, 0x6007, 0x0001,
++	0x080c, 0x7c1d, 0x0804, 0x8125, 0x0804, 0xa0dc, 0x2030, 0x2011,
++	0x1822, 0x2204, 0x9086, 0x0004, 0x1148, 0x96b6, 0x000b, 0x1120,
++	0x2001, 0x0007, 0x080c, 0x5b61, 0x0804, 0x9554, 0x0804, 0xa0dc,
++	0x0002, 0x9f7a, 0xa190, 0x9f7a, 0xa1cf, 0x9f7a, 0xa278, 0xa185,
++	0x9f7a, 0x9f7a, 0xa28b, 0x9f7a, 0xa29b, 0x6604, 0x9686, 0x0003,
++	0x0904, 0xa0f1, 0x96b6, 0x001e, 0x1110, 0x080c, 0x9554, 0x0005,
++	0x00b6, 0x00d6, 0x00c6, 0x080c, 0xa2ab, 0x11a0, 0x9006, 0x080c,
++	0x5b4d, 0x080c, 0x2d1a, 0x080c, 0xb76c, 0x2001, 0x0002, 0x080c,
++	0x5b61, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x7c1d, 0x080c,
++	0x8125, 0x0408, 0x2009, 0x026e, 0x2104, 0x9086, 0x0009, 0x1160,
++	0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0170, 0x8001,
++	0xb842, 0x601b, 0x000a, 0x0078, 0x2009, 0x026f, 0x2104, 0x9084,
++	0xff00, 0x9086, 0x1900, 0x1108, 0x08a0, 0x080c, 0x2d1a, 0x080c,
++	0xb76c, 0x080c, 0xa0dc, 0x00ce, 0x00de, 0x00be, 0x0005, 0x0096,
++	0x00b6, 0x0026, 0x9016, 0x080c, 0xa2b9, 0x00d6, 0x2069, 0x194b,
++	0x2d04, 0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e,
++	0x1138, 0x2069, 0x181e, 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010,
++	0x00de, 0x0088, 0x9006, 0x080c, 0x5b4d, 0x2001, 0x0002, 0x080c,
++	0x5b61, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x7c1d, 0x080c,
++	0x8125, 0x0804, 0xa248, 0x080c, 0xb0ad, 0x01a0, 0x6014, 0x2048,
++	0xa864, 0x2010, 0x9086, 0x0139, 0x1128, 0x2001, 0x0002, 0x080c,
++	0xb69a, 0x00b0, 0x6014, 0x2048, 0xa864, 0xd0fc, 0x0118, 0x2001,
++	0x0001, 0x0ca8, 0x2001, 0x180d, 0x2004, 0xd0dc, 0x0148, 0x6010,
++	0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x1110, 0x9006, 0x0c38,
++	0x080c, 0x9e99, 0x2009, 0x026e, 0x2134, 0x96b4, 0x00ff, 0x9686,
++	0x0005, 0x0510, 0x9686, 0x000b, 0x01c8, 0x2009, 0x026f, 0x2104,
++	0x9084, 0xff00, 0x1118, 0x9686, 0x0009, 0x01b0, 0x9086, 0x1900,
++	0x1168, 0x9686, 0x0009, 0x0180, 0x2001, 0x0004, 0x080c, 0x5b61,
++	0x2001, 0x0028, 0x601a, 0x6007, 0x0052, 0x0010, 0x080c, 0xa0dc,
++	0x002e, 0x00be, 0x009e, 0x0005, 0x9286, 0x0139, 0x0160, 0x6014,
++	0x2048, 0x080c, 0xb0ad, 0x0140, 0xa864, 0x9086, 0x0139, 0x0118,
++	0xa868, 0xd0fc, 0x0108, 0x0c50, 0x6010, 0x2058, 0xb840, 0x9084,
++	0x00ff, 0x9005, 0x0138, 0x8001, 0xb842, 0x601b, 0x000a, 0x6007,
++	0x0016, 0x08f0, 0xb8a0, 0x9086, 0x007e, 0x1138, 0x00e6, 0x2071,
++	0x1800, 0x080c, 0x5677, 0x00ee, 0x0010, 0x080c, 0x2d1a, 0x0870,
++	0x080c, 0xa2b9, 0x1160, 0x2001, 0x0004, 0x080c, 0x5b61, 0x6003,
++	0x0001, 0x6007, 0x0003, 0x080c, 0x7c1d, 0x0804, 0x8125, 0x080c,
++	0x9e99, 0x0804, 0xa0dc, 0x0469, 0x1160, 0x2001, 0x0008, 0x080c,
++	0x5b61, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, 0x7c1d, 0x0804,
++	0x8125, 0x0804, 0xa0dc, 0x00e9, 0x1160, 0x2001, 0x000a, 0x080c,
++	0x5b61, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x7c1d, 0x0804,
++	0x8125, 0x0804, 0xa0dc, 0x2009, 0x026e, 0x2104, 0x9086, 0x0003,
++	0x1138, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x9086, 0x2a00,
++	0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, 0x00c6, 0x0016, 0x6110,
++	0x2158, 0x080c, 0x5c1c, 0x001e, 0x00ce, 0x00be, 0x0005, 0x00b6,
++	0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6010, 0x2058, 0x2009,
++	0x1836, 0x2104, 0x9085, 0x0003, 0x200a, 0x080c, 0xa35f, 0x0560,
++	0x2009, 0x1836, 0x2104, 0xc0cd, 0x200a, 0x080c, 0x5f29, 0x0158,
++	0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xc9c5, 0x2001, 0x180c,
++	0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, 0x080c,
++	0x2ce5, 0x00e6, 0x2071, 0x1800, 0x080c, 0x2b1e, 0x00ee, 0x00c6,
++	0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, 0x080c, 0x2e11, 0x8108,
++	0x1f04, 0xa2fd, 0x015e, 0x00ce, 0x080c, 0xa2bc, 0x2071, 0x0260,
++	0x2079, 0x0200, 0x7817, 0x0001, 0x2001, 0x1836, 0x200c, 0xc1c5,
++	0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118, 0x7038, 0xd0dc, 0x1108,
++	0xc1c4, 0x7817, 0x0000, 0x2001, 0x1836, 0x2102, 0x2079, 0x0100,
++	0x2e04, 0x9084, 0x00ff, 0x2069, 0x181d, 0x206a, 0x78e6, 0x0006,
++	0x8e70, 0x2e04, 0x2069, 0x181e, 0x206a, 0x78ea, 0x7832, 0x7836,
++	0x2010, 0x9084, 0xff00, 0x001e, 0x9105, 0x2009, 0x182a, 0x200a,
++	0x2200, 0x9084, 0x00ff, 0x2008, 0x080c, 0x2446, 0x080c, 0x6877,
++	0x0170, 0x2071, 0x0260, 0x2069, 0x194f, 0x7048, 0x206a, 0x704c,
++	0x6806, 0x7050, 0x680a, 0x7054, 0x680e, 0x080c, 0xb480, 0x0040,
++	0x2001, 0x0006, 0x080c, 0x5b61, 0x080c, 0x2d3f, 0x080c, 0x9554,
++	0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x0096,
++	0x0026, 0x0036, 0x00e6, 0x0156, 0x2019, 0x182a, 0x231c, 0x83ff,
++	0x01f0, 0x2071, 0x0260, 0x7200, 0x9294, 0x00ff, 0x7004, 0x9084,
++	0xff00, 0x9205, 0x9306, 0x1198, 0x2011, 0x0276, 0x20a9, 0x0004,
++	0x2b48, 0x2019, 0x000a, 0x080c, 0xa439, 0x1148, 0x2011, 0x027a,
++	0x20a9, 0x0004, 0x2019, 0x0006, 0x080c, 0xa439, 0x1100, 0x015e,
++	0x00ee, 0x003e, 0x002e, 0x009e, 0x0005, 0x00e6, 0x2071, 0x0260,
++	0x7034, 0x9086, 0x0014, 0x11a8, 0x7038, 0x9086, 0x0800, 0x1188,
++	0x703c, 0xd0ec, 0x0160, 0x9084, 0x0f00, 0x9086, 0x0100, 0x1138,
++	0x7054, 0xd0a4, 0x1110, 0xd0ac, 0x0110, 0x9006, 0x0010, 0x9085,
++	0x0001, 0x00ee, 0x0005, 0x00e6, 0x0096, 0x00c6, 0x0076, 0x0056,
++	0x0046, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2029, 0x19bd,
++	0x252c, 0x2021, 0x19c3, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800,
++	0x724c, 0x706c, 0x9202, 0x1a04, 0xa411, 0x080c, 0xc9f1, 0x0904,
++	0xa40a, 0x6720, 0x9786, 0x0007, 0x05e8, 0x2500, 0x9c06, 0x05d0,
++	0x2400, 0x9c06, 0x05b8, 0x3e08, 0x9186, 0x0002, 0x1148, 0x6010,
++	0x9005, 0x0130, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1550,
++	0x00c6, 0x6000, 0x9086, 0x0004, 0x1110, 0x080c, 0x17b0, 0x9786,
++	0x0008, 0x1148, 0x080c, 0xb295, 0x1130, 0x00ce, 0x080c, 0x9e99,
++	0x080c, 0x9584, 0x00b8, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0178,
++	0x9786, 0x0003, 0x1500, 0x080c, 0xc810, 0x0110, 0xa867, 0x0103,
++	0xab7a, 0xa877, 0x0000, 0x080c, 0x619c, 0x080c, 0xb278, 0x080c,
++	0x9584, 0x00ce, 0x9ce0, 0x0018, 0x7060, 0x9c02, 0x1210, 0x0804,
++	0xa3c0, 0x012e, 0x000e, 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce,
++	0x009e, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1118, 0x080c, 0xc970,
++	0x0c30, 0x9786, 0x000a, 0x09e0, 0x08b0, 0x220c, 0x2304, 0x9106,
++	0x1130, 0x8210, 0x8318, 0x1f04, 0xa425, 0x9006, 0x0005, 0x2304,
++	0x9102, 0x0218, 0x2001, 0x0001, 0x0008, 0x9006, 0x918d, 0x0001,
++	0x0005, 0x0136, 0x01c6, 0x0016, 0x8906, 0x8006, 0x8007, 0x908c,
++	0x003f, 0x21e0, 0x9084, 0xffc0, 0x9300, 0x2098, 0x3518, 0x20a9,
++	0x0001, 0x220c, 0x4002, 0x910e, 0x1140, 0x8210, 0x8319, 0x1dc8,
++	0x9006, 0x001e, 0x01ce, 0x013e, 0x0005, 0x220c, 0x9102, 0x0218,
++	0x2001, 0x0001, 0x0010, 0x2001, 0x0000, 0x918d, 0x0001, 0x001e,
++	0x01ce, 0x013e, 0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d84,
++	0x080c, 0xb284, 0x0120, 0x080c, 0xb295, 0x0168, 0x0028, 0x080c,
++	0x2d3f, 0x080c, 0xb295, 0x0138, 0x080c, 0x8026, 0x080c, 0x9554,
++	0x080c, 0x8125, 0x0005, 0x080c, 0x9e99, 0x0cb0, 0x9182, 0x0040,
++	0x0002, 0xa495, 0xa495, 0xa495, 0xa495, 0xa495, 0xa495, 0xa495,
++	0xa495, 0xa495, 0xa495, 0xa495, 0xa497, 0xa497, 0xa497, 0xa497,
++	0xa495, 0xa495, 0xa495, 0xa497, 0xa495, 0x080c, 0x0d84, 0x600b,
++	0xffff, 0x6003, 0x0001, 0x6106, 0x080c, 0x7bcb, 0x0126, 0x2091,
++	0x8000, 0x080c, 0x8125, 0x012e, 0x0005, 0x9186, 0x0013, 0x1128,
++	0x6004, 0x9082, 0x0040, 0x0804, 0xa536, 0x9186, 0x0027, 0x11f0,
++	0x080c, 0x8026, 0x080c, 0x2d1a, 0x080c, 0xb76c, 0x0096, 0x6114,
++	0x2148, 0x080c, 0xb0ad, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0029,
++	0xa877, 0x0000, 0xa97c, 0xc1c5, 0xa97e, 0x080c, 0x61a9, 0x080c,
++	0xb278, 0x009e, 0x080c, 0x9554, 0x0804, 0x8125, 0x9186, 0x0014,
++	0x1120, 0x6004, 0x9082, 0x0040, 0x0440, 0x9186, 0x0046, 0x0150,
++	0x9186, 0x0045, 0x0138, 0x9186, 0x0053, 0x0120, 0x9186, 0x0048,
++	0x190c, 0x0d84, 0x2001, 0x0109, 0x2004, 0xd084, 0x01a8, 0x0126,
++	0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x0036, 0x080c, 0x7ab7,
++	0x003e, 0x002e, 0x001e, 0x000e, 0x012e, 0xa001, 0x6000, 0x9086,
++	0x0002, 0x1110, 0x0804, 0xa574, 0x0005, 0x0002, 0xa514, 0xa512,
++	0xa512, 0xa512, 0xa512, 0xa512, 0xa512, 0xa512, 0xa512, 0xa512,
++	0xa512, 0xa52f, 0xa52f, 0xa52f, 0xa52f, 0xa512, 0xa52f, 0xa512,
++	0xa52f, 0xa512, 0x080c, 0x0d84, 0x080c, 0x8026, 0x0096, 0x6114,
++	0x2148, 0x080c, 0xb0ad, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0006,
++	0xa877, 0x0000, 0xa880, 0xc0ec, 0xa882, 0x080c, 0x61a9, 0x080c,
++	0xb278, 0x009e, 0x080c, 0x9554, 0x080c, 0x8125, 0x0005, 0x080c,
++	0x8026, 0x080c, 0x9554, 0x080c, 0x8125, 0x0005, 0x0002, 0xa54d,
++	0xa54b, 0xa54b, 0xa54b, 0xa54b, 0xa54b, 0xa54b, 0xa54b, 0xa54b,
++	0xa54b, 0xa54b, 0xa564, 0xa564, 0xa564, 0xa564, 0xa54b, 0xa56e,
++	0xa54b, 0xa564, 0xa54b, 0x080c, 0x0d84, 0x0096, 0x080c, 0x8026,
++	0x6014, 0x2048, 0x2001, 0x1955, 0x2004, 0x6042, 0xa97c, 0xd1ac,
++	0x0140, 0x6003, 0x0004, 0xa87c, 0x9085, 0x0400, 0xa87e, 0x009e,
++	0x0005, 0x6003, 0x0002, 0x0cb8, 0x080c, 0x8026, 0x080c, 0xb76f,
++	0x080c, 0xb774, 0x6003, 0x000f, 0x0804, 0x8125, 0x080c, 0x8026,
++	0x080c, 0x9554, 0x0804, 0x8125, 0x9182, 0x0040, 0x0002, 0xa58b,
++	0xa58b, 0xa58b, 0xa58b, 0xa58b, 0xa58d, 0xa66a, 0xa58b, 0xa58b,
++	0xa58b, 0xa58b, 0xa58b, 0xa58b, 0xa58b, 0xa58b, 0xa58b, 0xa58b,
++	0xa58b, 0xa58b, 0xa69e, 0x080c, 0x0d84, 0x00b6, 0x0096, 0x6114,
++	0x2148, 0x7644, 0x96b4, 0x0fff, 0x86ff, 0x1528, 0x6010, 0x2058,
++	0xb800, 0xd0bc, 0x1904, 0xa659, 0xa87b, 0x0000, 0xa867, 0x0103,
++	0xae76, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c,
++	0xa82a, 0x080c, 0x5fda, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110,
++	0x8211, 0xba3e, 0x7044, 0xd0e4, 0x1904, 0xa63d, 0x080c, 0x9554,
++	0x009e, 0x00be, 0x0005, 0x968c, 0x0c00, 0x0150, 0x6010, 0x2058,
++	0xb800, 0xd0bc, 0x1904, 0xa641, 0x7348, 0xab92, 0x734c, 0xab8e,
++	0x968c, 0x00ff, 0x9186, 0x0002, 0x0508, 0x9186, 0x0028, 0x1118,
++	0xa87b, 0x001c, 0x00e8, 0xd6dc, 0x01a0, 0xa87b, 0x0015, 0xa87c,
++	0xd0ac, 0x0170, 0xa938, 0xaa34, 0x2100, 0x9205, 0x0148, 0x7048,
++	0x9106, 0x1118, 0x704c, 0x9206, 0x0118, 0xa992, 0xaa8e, 0xc6dc,
++	0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000,
++	0xa867, 0x0103, 0xae76, 0x901e, 0xd6c4, 0x01d8, 0x9686, 0x0100,
++	0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, 0x0804, 0xa594, 0x735c,
++	0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008,
++	0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xace6,
++	0x003e, 0xd6cc, 0x0904, 0xa5a9, 0x7154, 0xa98a, 0x81ff, 0x0904,
++	0xa5a9, 0x9192, 0x0021, 0x1278, 0x8304, 0x9098, 0x0018, 0x2011,
++	0x0029, 0x080c, 0xace6, 0x2011, 0x0205, 0x2013, 0x0000, 0x080c,
++	0xb706, 0x0804, 0xa5a9, 0xa868, 0xd0fc, 0x0120, 0x2009, 0x0020,
++	0xa98a, 0x0c50, 0x00a6, 0x2950, 0x080c, 0xac85, 0x00ae, 0x080c,
++	0xb706, 0x080c, 0xacd6, 0x0804, 0xa5ab, 0x080c, 0xb37e, 0x0804,
++	0xa5b8, 0xa87c, 0xd0ac, 0x0904, 0xa5c4, 0xa880, 0xd0bc, 0x1904,
++	0xa5c4, 0x7348, 0xa838, 0x9306, 0x11c8, 0x734c, 0xa834, 0x931e,
++	0x0904, 0xa5c4, 0xd6d4, 0x0190, 0xab38, 0x9305, 0x0904, 0xa5c4,
++	0x0068, 0xa87c, 0xd0ac, 0x0904, 0xa59c, 0xa838, 0xa934, 0x9105,
++	0x0904, 0xa59c, 0xa880, 0xd0bc, 0x1904, 0xa59c, 0x080c, 0xb3ae,
++	0x0804, 0xa5b8, 0x0096, 0x00f6, 0x6003, 0x0003, 0x6007, 0x0043,
++	0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6014, 0x2048,
++	0xa87c, 0xd0ac, 0x0140, 0x6003, 0x0002, 0x00fe, 0x009e, 0x0005,
++	0x2130, 0x2228, 0x0058, 0x2400, 0xa9ac, 0x910a, 0x2300, 0xaab0,
++	0x9213, 0x2600, 0x9102, 0x2500, 0x9203, 0x0e90, 0xac36, 0xab3a,
++	0xae46, 0xad4a, 0x00fe, 0x6043, 0x0000, 0x2c10, 0x080c, 0x18b7,
++	0x080c, 0x7c3a, 0x080c, 0x820b, 0x009e, 0x0005, 0x0005, 0x9182,
++	0x0040, 0x0002, 0xa6b6, 0xa6b6, 0xa6b6, 0xa6b6, 0xa6b6, 0xa6b8,
++	0xa74e, 0xa6b6, 0xa6b6, 0xa765, 0xa7f1, 0xa6b6, 0xa6b6, 0xa6b6,
++	0xa6b6, 0xa806, 0xa6b6, 0xa6b6, 0xa6b6, 0xa6b6, 0x080c, 0x0d84,
++	0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114, 0x2150,
++	0x7644, 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e, 0x6210,
++	0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be,
++	0x86ff, 0x0904, 0xa749, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120,
++	0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, 0xa749,
++	0x080c, 0x0fae, 0x090c, 0x0d84, 0x2900, 0xb07a, 0xb77c, 0xc7cd,
++	0xb77e, 0xa867, 0x0103, 0xb068, 0xa86a, 0xb06c, 0xa86e, 0xb070,
++	0xa872, 0xae76, 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92, 0x734c,
++	0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, 0x0028,
++	0x1118, 0xa87b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0xa87b, 0x0015,
++	0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000,
++	0xaf7e, 0xb080, 0xa882, 0xb084, 0xa886, 0x901e, 0xd6c4, 0x0190,
++	0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019,
++	0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c,
++	0xace6, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8,
++	0x9192, 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029,
++	0x080c, 0xace6, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068,
++	0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c,
++	0xac85, 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, 0x00f6, 0x00a6,
++	0x6003, 0x0003, 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08,
++	0x6014, 0x2050, 0xb436, 0xb33a, 0xb646, 0xb54a, 0x00ae, 0x00fe,
++	0x2c10, 0x080c, 0x18b7, 0x0804, 0x8b1d, 0x6003, 0x0002, 0x6004,
++	0x9086, 0x0040, 0x11c8, 0x0096, 0x6014, 0x2048, 0xa87c, 0xd0ac,
++	0x0160, 0x601c, 0xd084, 0x1130, 0x00f6, 0x2c00, 0x2078, 0x080c,
++	0x150d, 0x00fe, 0x6003, 0x0004, 0x0010, 0x6003, 0x0002, 0x009e,
++	0x080c, 0x8026, 0x080c, 0x8125, 0x0096, 0x2001, 0x1955, 0x2004,
++	0x6042, 0x080c, 0x80d6, 0x080c, 0x820b, 0x6114, 0x2148, 0xa97c,
++	0xd1e4, 0x0904, 0xa7ec, 0xd1cc, 0x05a8, 0xa978, 0xa868, 0xd0fc,
++	0x0538, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0xa860, 0x20e8,
++	0xa85c, 0x9080, 0x0019, 0x20a0, 0x810e, 0x810e, 0x810f, 0x9184,
++	0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0019, 0x2098, 0x0156,
++	0x20a9, 0x0020, 0x4003, 0x015e, 0x000e, 0xa882, 0x000e, 0xa87e,
++	0x001e, 0xa874, 0x0006, 0x2148, 0x080c, 0x0f60, 0x001e, 0x0440,
++	0x0016, 0x080c, 0x0f60, 0x009e, 0xa974, 0x0016, 0x080c, 0xacd6,
++	0x001e, 0x00f0, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, 0x90b6,
++	0x0002, 0x0180, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c, 0x0060,
++	0xd1dc, 0x0118, 0xa87b, 0x0015, 0x0038, 0xd1d4, 0x0118, 0xa87b,
++	0x0007, 0x0010, 0xa87b, 0x0000, 0x0016, 0x080c, 0x5fda, 0x001e,
++	0xd1e4, 0x1120, 0x080c, 0x9554, 0x009e, 0x0005, 0x080c, 0xb37e,
++	0x0cd8, 0x6004, 0x9086, 0x0040, 0x1120, 0x080c, 0x8026, 0x080c,
++	0x8125, 0x2019, 0x0001, 0x080c, 0x8dfe, 0x6003, 0x0002, 0x080c,
++	0xb774, 0x080c, 0x80d6, 0x080c, 0x820b, 0x0005, 0x6004, 0x9086,
++	0x0040, 0x1120, 0x080c, 0x8026, 0x080c, 0x8125, 0x080c, 0x80d6,
++	0x080c, 0x2d1a, 0x080c, 0xb76c, 0x0096, 0x6114, 0x2148, 0x080c,
++	0xb0ad, 0x0150, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, 0x0000,
++	0x080c, 0x61a9, 0x080c, 0xb278, 0x009e, 0x080c, 0x9554, 0x080c,
++	0x820b, 0x0005, 0xa87b, 0x0015, 0xd1fc, 0x0138, 0xa87b, 0x0007,
++	0x8002, 0x8000, 0x810a, 0x9189, 0x0000, 0xa992, 0xa88e, 0x0005,
++	0x9182, 0x0040, 0x0002, 0xa84f, 0xa84f, 0xa84f, 0xa84f, 0xa84f,
++	0xa851, 0xa84f, 0xa84f, 0xa8f4, 0xa84f, 0xa84f, 0xa84f, 0xa84f,
++	0xa84f, 0xa84f, 0xa84f, 0xa84f, 0xa84f, 0xa84f, 0xaa22, 0x080c,
++	0x0d84, 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114,
++	0x2150, 0x7644, 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e,
++	0x6210, 0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e,
++	0x00be, 0x86ff, 0x0904, 0xa8ed, 0x9694, 0xff00, 0x9284, 0x0c00,
++	0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904,
++	0xa8ed, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4,
++	0xb676, 0x0c38, 0x080c, 0x0fae, 0x090c, 0x0d84, 0x2900, 0xb07a,
++	0xb77c, 0x97bd, 0x0200, 0xb77e, 0xa867, 0x0103, 0xb068, 0xa86a,
++	0xb06c, 0xa86e, 0xb070, 0xa872, 0x7044, 0x9084, 0xf000, 0x9635,
++	0xae76, 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92, 0x734c, 0xab8e,
++	0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, 0x0028, 0x1118,
++	0xa87b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0xa87b, 0x0015, 0x0038,
++	0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, 0xaf7e,
++	0xb080, 0xa882, 0xb084, 0xa886, 0x901e, 0xd6c4, 0x0190, 0x735c,
++	0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008,
++	0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xace6,
++	0x003e, 0xd6cc, 0x01d0, 0x7154, 0xa98a, 0x81ff, 0x01b0, 0x9192,
++	0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c,
++	0xace6, 0x2011, 0x0205, 0x2013, 0x0000, 0x0038, 0xb068, 0xd0fc,
++	0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x080c, 0x178e, 0x009e,
++	0x00ee, 0x00ae, 0x007e, 0x0005, 0x2001, 0x1955, 0x2004, 0x6042,
++	0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105, 0x1118, 0xa87c,
++	0xc0dc, 0xa87e, 0x6003, 0x0002, 0xa97c, 0xd1e4, 0x0904, 0xaa1d,
++	0x6043, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc,
++	0x11f8, 0xd1cc, 0x0904, 0xa9ec, 0xa978, 0xa868, 0xd0fc, 0x0904,
++	0xa9ad, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0x00a6, 0x2150,
++	0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x0904, 0xa97b, 0x9086,
++	0x0028, 0x15e8, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x0804, 0xa983,
++	0x6024, 0xd0f4, 0x11d0, 0xa838, 0xaa34, 0x9205, 0x09d0, 0xa838,
++	0xaa90, 0x9206, 0x1120, 0xa88c, 0xaa34, 0x9206, 0x0990, 0x6024,
++	0xd0d4, 0x1148, 0xa9ac, 0xa834, 0x9102, 0x603a, 0xa9b0, 0xa838,
++	0x9103, 0x603e, 0x6024, 0xc0f5, 0x6026, 0x6010, 0x00b6, 0x2058,
++	0xb83c, 0x8000, 0xb83e, 0x00be, 0x9006, 0xa876, 0xa892, 0xa88e,
++	0xa87c, 0xc0e4, 0xa87e, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048,
++	0x080c, 0x0f60, 0x009e, 0x080c, 0xb3ae, 0x0804, 0xaa1d, 0xd1dc,
++	0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xb62d, 0x0118,
++	0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007,
++	0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938,
++	0x9115, 0x190c, 0xa82a, 0xa87c, 0xb07e, 0xa890, 0xb092, 0xa88c,
++	0xb08e, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0019, 0x20a0, 0x20a9,
++	0x0020, 0x8a06, 0x8006, 0x8007, 0x9094, 0x003f, 0x22e0, 0x9084,
++	0xffc0, 0x9080, 0x0019, 0x2098, 0x4003, 0x00ae, 0x000e, 0xa882,
++	0x000e, 0xa87e, 0x080c, 0xb706, 0x001e, 0xa874, 0x0006, 0x2148,
++	0x080c, 0x0f60, 0x001e, 0x0804, 0xaa19, 0x0016, 0x00a6, 0x2150,
++	0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, 0x0028,
++	0x1128, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, 0x0158,
++	0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xb62d, 0x0118, 0xb174,
++	0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b,
++	0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115,
++	0x190c, 0xa82a, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, 0xb07e,
++	0x00ae, 0x080c, 0x0f60, 0x009e, 0x080c, 0xb706, 0xa974, 0x0016,
++	0x080c, 0xacd6, 0x001e, 0x0468, 0xa867, 0x0103, 0xa974, 0x9184,
++	0x00ff, 0x90b6, 0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, 0xa87b,
++	0x001c, 0x00d0, 0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, 0xb62d,
++	0x0118, 0xa974, 0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, 0xa87b,
++	0x0007, 0x0050, 0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834,
++	0xa938, 0x9115, 0x190c, 0xa82a, 0xa974, 0x0016, 0x080c, 0x5fda,
++	0x001e, 0xd1e4, 0x1120, 0x080c, 0x9554, 0x009e, 0x0005, 0x080c,
++	0xb37e, 0x0cd8, 0x6114, 0x0096, 0x2148, 0xa97c, 0xd1e4, 0x190c,
++	0x179c, 0x009e, 0x0005, 0x080c, 0x8026, 0x0010, 0x080c, 0x80d6,
++	0x080c, 0xb0ad, 0x01c0, 0x0096, 0x6114, 0x2148, 0xa867, 0x0103,
++	0x2009, 0x180c, 0x210c, 0xd18c, 0x11b8, 0xd184, 0x1190, 0x6108,
++	0xa97a, 0x918e, 0x0029, 0x1110, 0x080c, 0xcc6b, 0xa877, 0x0000,
++	0x080c, 0x61a9, 0x009e, 0x080c, 0x9554, 0x080c, 0x8125, 0x0804,
++	0x820b, 0xa87b, 0x0004, 0x0c90, 0xa87b, 0x0004, 0x0c78, 0x9182,
++	0x0040, 0x0002, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa70,
++	0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e,
++	0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0x080c, 0x0d84,
++	0x080c, 0x4df2, 0x01f8, 0x6014, 0x7144, 0x918c, 0x0fff, 0x9016,
++	0xd1c4, 0x0118, 0x7264, 0x9294, 0x00ff, 0x0096, 0x904d, 0x0188,
++	0xa87b, 0x0000, 0xa864, 0x9086, 0x0139, 0x0128, 0xa867, 0x0103,
++	0xa976, 0xaa96, 0x0030, 0xa897, 0x4000, 0xa99a, 0xaa9e, 0x080c,
++	0x61a9, 0x009e, 0x0804, 0x9554, 0x9182, 0x0085, 0x0002, 0xaaa6,
++	0xaaa4, 0xaaa4, 0xaab2, 0xaaa4, 0xaaa4, 0xaaa4, 0xaaa4, 0xaaa4,
++	0xaaa4, 0xaaa4, 0xaaa4, 0xaaa4, 0x080c, 0x0d84, 0x6003, 0x0001,
++	0x6106, 0x080c, 0x7bcb, 0x0126, 0x2091, 0x8000, 0x080c, 0x8125,
++	0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6, 0x2071, 0x0260,
++	0x7224, 0x6216, 0x7220, 0x080c, 0xb09b, 0x01a0, 0x2268, 0x6800,
++	0x9086, 0x0000, 0x0178, 0x6010, 0x6d10, 0x952e, 0x1158, 0x00c6,
++	0x2d60, 0x080c, 0xad11, 0x00ce, 0x0128, 0x6803, 0x0002, 0x6007,
++	0x0086, 0x0010, 0x6007, 0x0087, 0x6003, 0x0001, 0x080c, 0x7bcb,
++	0x080c, 0x8125, 0x9280, 0x0004, 0x00b6, 0x2058, 0xb800, 0x00be,
++	0xd0bc, 0x0140, 0x6824, 0xd0ec, 0x0128, 0x00c6, 0x2260, 0x080c,
++	0xb3ae, 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e, 0x0005, 0x9186,
++	0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d84, 0x908a,
++	0x0092, 0x1a0c, 0x0d84, 0x9082, 0x0085, 0x006a, 0x9186, 0x0027,
++	0x0120, 0x9186, 0x0014, 0x190c, 0x0d84, 0x080c, 0x8026, 0x080c,
++	0x9584, 0x0804, 0x8125, 0xab18, 0xab1a, 0xab1a, 0xab18, 0xab18,
++	0xab18, 0xab18, 0xab18, 0xab18, 0xab18, 0xab18, 0xab18, 0xab18,
++	0x080c, 0x0d84, 0x080c, 0x8026, 0x080c, 0x9584, 0x080c, 0x8125,
++	0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0085, 0x2008,
++	0x04b8, 0x9186, 0x0027, 0x11f8, 0x080c, 0x8026, 0x080c, 0x2d1a,
++	0x080c, 0xb76c, 0x0096, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0150,
++	0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x61a9,
++	0x080c, 0xb278, 0x009e, 0x080c, 0x9554, 0x080c, 0x8125, 0x0005,
++	0x080c, 0x95e9, 0x0ce0, 0x9186, 0x0014, 0x1dd0, 0x080c, 0x8026,
++	0x0096, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0d60, 0xa867, 0x0103,
++	0xa877, 0x0000, 0xa87b, 0x0006, 0xa880, 0xc0ec, 0xa882, 0x08f0,
++	0x0002, 0xab70, 0xab6e, 0xab6e, 0xab6e, 0xab6e, 0xab6e, 0xab88,
++	0xab6e, 0xab6e, 0xab6e, 0xab6e, 0xab6e, 0xab6e, 0x080c, 0x0d84,
++	0x080c, 0x8026, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039,
++	0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1953, 0x0010, 0x2001,
++	0x1954, 0x2004, 0x601a, 0x6003, 0x000c, 0x080c, 0x8125, 0x0005,
++	0x080c, 0x8026, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039,
++	0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1953, 0x0010, 0x2001,
++	0x1954, 0x2004, 0x601a, 0x6003, 0x000e, 0x080c, 0x8125, 0x0005,
++	0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x0012, 0x0804,
++	0x95e9, 0xabb6, 0xabb6, 0xabb6, 0xabb6, 0xabb8, 0xac05, 0xabb6,
++	0xabb6, 0xabb6, 0xabb6, 0xabb6, 0xabb6, 0xabb6, 0x080c, 0x0d84,
++	0x0096, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0168,
++	0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186,
++	0x0035, 0x1118, 0x009e, 0x0804, 0xac19, 0x080c, 0xb0ad, 0x1118,
++	0x080c, 0xb278, 0x0068, 0x6014, 0x2048, 0xa87c, 0xd0e4, 0x1110,
++	0x080c, 0xb278, 0xa867, 0x0103, 0x080c, 0xb739, 0x080c, 0x61a9,
++	0x00d6, 0x2c68, 0x080c, 0x94fe, 0x01d0, 0x6003, 0x0001, 0x6007,
++	0x001e, 0x600b, 0xffff, 0x2009, 0x026e, 0x210c, 0x613a, 0x2009,
++	0x026f, 0x210c, 0x613e, 0x6910, 0x6112, 0x080c, 0xb4e6, 0x6954,
++	0x6156, 0x6023, 0x0001, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x2d60,
++	0x00de, 0x080c, 0x9554, 0x009e, 0x0005, 0x6010, 0x00b6, 0x2058,
++	0xb800, 0x00be, 0xd0bc, 0x0598, 0x6034, 0x908c, 0xff00, 0x810f,
++	0x9186, 0x0035, 0x0130, 0x9186, 0x001e, 0x0118, 0x9186, 0x0039,
++	0x1530, 0x00d6, 0x2c68, 0x080c, 0xb6d9, 0x1904, 0xac5e, 0x080c,
++	0x94fe, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023, 0x0001, 0x6910,
++	0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934, 0x918c, 0x00ff,
++	0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x6954, 0x6156, 0x080c,
++	0xb4e6, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x2d60, 0x00f8, 0x0096,
++	0x6014, 0x2048, 0x080c, 0xb0ad, 0x01c8, 0xa867, 0x0103, 0xa880,
++	0xd0b4, 0x0128, 0xc0ec, 0xa882, 0xa87b, 0x0006, 0x0048, 0xd0bc,
++	0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xb37a,
++	0xa877, 0x0000, 0x080c, 0x61a9, 0x080c, 0xb278, 0x009e, 0x0804,
++	0x9554, 0x0016, 0x0096, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0140,
++	0xa867, 0x0103, 0xa87b, 0x0028, 0xa877, 0x0000, 0x080c, 0x61a9,
++	0x009e, 0x001e, 0x9186, 0x0013, 0x0148, 0x9186, 0x0014, 0x0130,
++	0x9186, 0x0027, 0x0118, 0x080c, 0x95e9, 0x0030, 0x080c, 0x8026,
++	0x080c, 0x9584, 0x080c, 0x8125, 0x0005, 0x0056, 0x0066, 0x0096,
++	0x00a6, 0x2029, 0x0001, 0x9182, 0x0101, 0x1208, 0x0010, 0x2009,
++	0x0100, 0x2130, 0x8304, 0x9098, 0x0018, 0x2009, 0x0020, 0x2011,
++	0x0029, 0x080c, 0xace6, 0x96b2, 0x0020, 0xb004, 0x904d, 0x0110,
++	0x080c, 0x0f60, 0x080c, 0x0fae, 0x0520, 0x8528, 0xa867, 0x0110,
++	0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, 0x1228, 0x2608,
++	0x2011, 0x001b, 0x0499, 0x00a8, 0x96b2, 0x003c, 0x2009, 0x003c,
++	0x2950, 0x2011, 0x001b, 0x0451, 0x0c28, 0x2001, 0x0205, 0x2003,
++	0x0000, 0x00ae, 0x852f, 0x95ad, 0x0003, 0xb566, 0x95ac, 0x0000,
++	0x0048, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad,
++	0x0003, 0xb566, 0x009e, 0x006e, 0x005e, 0x0005, 0x00a6, 0x89ff,
++	0x0158, 0xa804, 0x9055, 0x0130, 0xa807, 0x0000, 0x080c, 0x61a9,
++	0x2a48, 0x0cb8, 0x080c, 0x61a9, 0x00ae, 0x0005, 0x00f6, 0x2079,
++	0x0200, 0x7814, 0x9085, 0x0080, 0x7816, 0xd184, 0x0108, 0x8108,
++	0x810c, 0x20a9, 0x0001, 0xa860, 0x20e8, 0xa85c, 0x9200, 0x20a0,
++	0x20e1, 0x0000, 0x2300, 0x9e00, 0x2098, 0x4003, 0x8318, 0x9386,
++	0x0020, 0x1148, 0x2018, 0x2300, 0x9e00, 0x2098, 0x7814, 0x8000,
++	0x9085, 0x0080, 0x7816, 0x8109, 0x1d80, 0x7817, 0x0000, 0x00fe,
++	0x0005, 0x0066, 0x0126, 0x2091, 0x8000, 0x2031, 0x0001, 0x6020,
++	0x9084, 0x000f, 0x0083, 0x012e, 0x006e, 0x0005, 0x0126, 0x2091,
++	0x8000, 0x0066, 0x2031, 0x0000, 0x6020, 0x9084, 0x000f, 0x001b,
++	0x006e, 0x012e, 0x0005, 0xad4c, 0xad4c, 0xad47, 0xad6e, 0xad3a,
++	0xad47, 0xad6e, 0xad47, 0xad3a, 0xad3a, 0xad47, 0xad47, 0xad47,
++	0xad3a, 0xad3a, 0x080c, 0x0d84, 0x0036, 0x2019, 0x0010, 0x080c,
++	0xc58e, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x9006,
++	0x0005, 0x9085, 0x0001, 0x0005, 0x0096, 0x86ff, 0x11d8, 0x6014,
++	0x2048, 0x080c, 0xb0ad, 0x01c0, 0xa864, 0x9086, 0x0139, 0x1128,
++	0xa87b, 0x0005, 0xa883, 0x0000, 0x0028, 0x900e, 0x2001, 0x0005,
++	0x080c, 0x63d1, 0x080c, 0xb37a, 0x080c, 0x61a9, 0x080c, 0x9584,
++	0x9085, 0x0001, 0x009e, 0x0005, 0x9006, 0x0ce0, 0x6000, 0x908a,
++	0x0016, 0x1a0c, 0x0d84, 0x0002, 0xad84, 0xada9, 0xad86, 0xadc7,
++	0xada4, 0xad84, 0xad47, 0xad4c, 0xad4c, 0xad47, 0xad47, 0xad47,
++	0xad47, 0xad47, 0xad47, 0xad47, 0x080c, 0x0d84, 0x86ff, 0x11c8,
++	0x6020, 0x9086, 0x0006, 0x01a8, 0x0096, 0x6014, 0x2048, 0x080c,
++	0xb0ad, 0x0110, 0x080c, 0xb37a, 0x009e, 0x080c, 0xb71b, 0x6007,
++	0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x7bcb, 0x080c,
++	0x8125, 0x9085, 0x0001, 0x0005, 0x0066, 0x080c, 0x17b0, 0x006e,
++	0x08e8, 0x00e6, 0x2071, 0x19b4, 0x7024, 0x9c06, 0x1110, 0x080c,
++	0x8d59, 0x6020, 0x9084, 0x000f, 0x9086, 0x0006, 0x1150, 0x0086,
++	0x0096, 0x2049, 0x0001, 0x2c40, 0x080c, 0x8ef6, 0x009e, 0x008e,
++	0x0010, 0x080c, 0x8c6a, 0x00ee, 0x1908, 0x0804, 0xad47, 0x0036,
++	0x00e6, 0x2071, 0x19b4, 0x703c, 0x9c06, 0x1138, 0x901e, 0x080c,
++	0x8dfe, 0x00ee, 0x003e, 0x0804, 0xad86, 0x080c, 0x901f, 0x00ee,
++	0x003e, 0x1904, 0xad86, 0x0804, 0xad47, 0x00c6, 0x6020, 0x9084,
++	0x000f, 0x0013, 0x00ce, 0x0005, 0xadfa, 0xaea2, 0xaff8, 0xae04,
++	0x9584, 0xadfa, 0xc580, 0xb779, 0xaea2, 0xadf3, 0xb077, 0xadf3,
++	0xadf3, 0xadf3, 0xadf3, 0x080c, 0x0d84, 0x080c, 0xb295, 0x1110,
++	0x080c, 0x9e99, 0x0005, 0x080c, 0x8026, 0x080c, 0x8125, 0x0804,
++	0x9554, 0x601b, 0x0001, 0x0005, 0x080c, 0xb0ad, 0x0130, 0x6014,
++	0x0096, 0x2048, 0x2c00, 0xa896, 0x009e, 0x6000, 0x908a, 0x0016,
++	0x1a0c, 0x0d84, 0x0002, 0xae23, 0xae25, 0xae49, 0xae5d, 0xae81,
++	0xae23, 0xadfa, 0xadfa, 0xadfa, 0xae5d, 0xae5d, 0xae23, 0xae23,
++	0xae23, 0xae23, 0xae67, 0x080c, 0x0d84, 0x00e6, 0x6014, 0x0096,
++	0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x2071, 0x19b4, 0x7024,
++	0x9c06, 0x01a0, 0x080c, 0x8c6a, 0x080c, 0xb71b, 0x6007, 0x0085,
++	0x6003, 0x000b, 0x6023, 0x0002, 0x2001, 0x1954, 0x2004, 0x601a,
++	0x080c, 0x7bcb, 0x080c, 0x8125, 0x00ee, 0x0005, 0x601b, 0x0001,
++	0x0cd8, 0x0096, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e,
++	0x080c, 0xb71b, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002,
++	0x080c, 0x7bcb, 0x080c, 0x8125, 0x0005, 0x0096, 0x601b, 0x0001,
++	0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005, 0x080c,
++	0x4df2, 0x01a8, 0x6014, 0x0096, 0x904d, 0x0180, 0xa864, 0xa867,
++	0x0103, 0xa87b, 0x0006, 0x9086, 0x0139, 0x1140, 0xa867, 0x0139,
++	0xa897, 0x4005, 0xa89b, 0x0004, 0x080c, 0x61a9, 0x009e, 0x0804,
++	0x9554, 0x6014, 0x0096, 0x904d, 0x01c0, 0xa97c, 0xd1e4, 0x01a8,
++	0xa884, 0x009e, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0x2001,
++	0x0037, 0x2c08, 0x080c, 0x1492, 0x6000, 0x9086, 0x0004, 0x1120,
++	0x2009, 0x0048, 0x080c, 0x95ce, 0x0005, 0x009e, 0x080c, 0x17b0,
++	0x0804, 0xae49, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d84, 0x000b,
++	0x0005, 0xaeb9, 0xae01, 0xaebb, 0xaeb9, 0xaebb, 0xaebb, 0xadfb,
++	0xaeb9, 0xadf5, 0xadf5, 0xaeb9, 0xaeb9, 0xaeb9, 0xaeb9, 0xaeb9,
++	0xaeb9, 0x080c, 0x0d84, 0x6010, 0x00b6, 0x2058, 0xb804, 0x9084,
++	0x00ff, 0x00be, 0x908a, 0x000c, 0x1a0c, 0x0d84, 0x00b6, 0x0013,
++	0x00be, 0x0005, 0xaed6, 0xaf92, 0xaed8, 0xaf13, 0xaed8, 0xaf13,
++	0xaed8, 0xaee6, 0xaed6, 0xaf13, 0xaed6, 0xaf02, 0x080c, 0x0d84,
++	0x6004, 0x908e, 0x0016, 0x0598, 0x908e, 0x0004, 0x0580, 0x908e,
++	0x0002, 0x0568, 0x908e, 0x0052, 0x0904, 0xaf8e, 0x6004, 0x080c,
++	0xb295, 0x0904, 0xafab, 0x908e, 0x0021, 0x0904, 0xafaf, 0x908e,
++	0x0022, 0x0904, 0xaff3, 0x908e, 0x003d, 0x0904, 0xafaf, 0x908e,
++	0x0039, 0x0904, 0xafb3, 0x908e, 0x0035, 0x0904, 0xafb3, 0x908e,
++	0x001e, 0x0178, 0x908e, 0x0001, 0x1140, 0x6010, 0x2058, 0xb804,
++	0x9084, 0x00ff, 0x9086, 0x0006, 0x0110, 0x080c, 0x2d1a, 0x080c,
++	0x9e99, 0x0804, 0x9584, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016,
++	0x0904, 0xaf7f, 0x9186, 0x0002, 0x15b8, 0x2001, 0x1836, 0x2004,
++	0xd08c, 0x1178, 0x080c, 0x6877, 0x1160, 0x2001, 0x194c, 0x2003,
++	0x0001, 0x2001, 0x1800, 0x2003, 0x0001, 0x080c, 0x67be, 0x0804,
++	0xafdc, 0x6010, 0x2058, 0x2001, 0x1836, 0x2004, 0xd0ac, 0x1904,
++	0xafdc, 0xb8a0, 0xd0bc, 0x1904, 0xafdc, 0xb840, 0x9084, 0x00ff,
++	0x9005, 0x0190, 0x8001, 0xb842, 0x6017, 0x0000, 0x6023, 0x0007,
++	0x601b, 0x0398, 0x6043, 0x0000, 0x080c, 0x94fe, 0x0128, 0x2b00,
++	0x6012, 0x6023, 0x0001, 0x0458, 0x00de, 0x00ce, 0x6004, 0x908e,
++	0x0002, 0x11a0, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1170,
++	0x2009, 0x1836, 0x2104, 0xc085, 0x200a, 0x00e6, 0x2071, 0x1800,
++	0x080c, 0x5677, 0x00ee, 0x080c, 0x9e99, 0x0030, 0x080c, 0x9e99,
++	0x080c, 0x2d1a, 0x080c, 0xb76c, 0x00e6, 0x0126, 0x2091, 0x8000,
++	0x080c, 0x2d3f, 0x012e, 0x00ee, 0x080c, 0x9584, 0x0005, 0x2001,
++	0x0002, 0x080c, 0x5b61, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c,
++	0x7c1d, 0x080c, 0x8125, 0x00de, 0x00ce, 0x0c80, 0x080c, 0x2d3f,
++	0x0804, 0xaf0f, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0d38,
++	0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0904, 0xaf54,
++	0x8001, 0xb842, 0x6003, 0x0001, 0x080c, 0x7c1d, 0x080c, 0x8125,
++	0x00de, 0x00ce, 0x0898, 0x080c, 0x9e99, 0x0804, 0xaf11, 0x080c,
++	0x9ed5, 0x0804, 0xaf11, 0x00d6, 0x2c68, 0x6104, 0x080c, 0xb6d9,
++	0x00de, 0x0118, 0x080c, 0x9554, 0x00f0, 0x6004, 0x8007, 0x6134,
++	0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b,
++	0x6023, 0x0002, 0x603c, 0x600a, 0x2001, 0x1954, 0x2004, 0x601a,
++	0x602c, 0x2c08, 0x2060, 0x6024, 0xc0b5, 0x6026, 0x2160, 0x080c,
++	0x7bcb, 0x080c, 0x8125, 0x0005, 0x00de, 0x00ce, 0x080c, 0x9e99,
++	0x080c, 0x2d1a, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2d3f,
++	0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x6043, 0x0000,
++	0x012e, 0x00ee, 0x0005, 0x080c, 0x994c, 0x1904, 0xafab, 0x0005,
++	0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d84, 0x0096, 0x00d6, 0x001b,
++	0x00de, 0x009e, 0x0005, 0xb013, 0xb013, 0xb013, 0xb013, 0xb013,
++	0xb013, 0xb013, 0xb013, 0xb013, 0xadfa, 0xb013, 0xae01, 0xb015,
++	0xae01, 0xb022, 0xb013, 0x080c, 0x0d84, 0x6004, 0x9086, 0x008b,
++	0x0148, 0x6007, 0x008b, 0x6003, 0x000d, 0x080c, 0x7bcb, 0x080c,
++	0x8125, 0x0005, 0x080c, 0xb74d, 0x0118, 0x080c, 0xb75e, 0x0010,
++	0x080c, 0xb76c, 0x080c, 0xb278, 0x080c, 0xb0ad, 0x0570, 0x080c,
++	0x2d1a, 0x080c, 0xb0ad, 0x0168, 0x6014, 0x2048, 0xa867, 0x0103,
++	0xa87b, 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ed, 0xa882, 0x080c,
++	0x61a9, 0x2c68, 0x080c, 0x94fe, 0x0150, 0x6810, 0x6012, 0x080c,
++	0xb4e6, 0x00c6, 0x2d60, 0x080c, 0x9584, 0x00ce, 0x0008, 0x2d60,
++	0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001,
++	0x080c, 0x7c1d, 0x080c, 0x8125, 0x00c8, 0x080c, 0xb74d, 0x0138,
++	0x6034, 0x9086, 0x4000, 0x1118, 0x080c, 0x2d1a, 0x08d0, 0x6034,
++	0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035,
++	0x1118, 0x080c, 0x2d1a, 0x0868, 0x080c, 0x9584, 0x0005, 0x6000,
++	0x908a, 0x0016, 0x1a0c, 0x0d84, 0x0002, 0xb08d, 0xb08d, 0xb08f,
++	0xb08f, 0xb08f, 0xb08d, 0xb08d, 0xb08d, 0xb08d, 0xb08d, 0xb08d,
++	0xb08d, 0xb08d, 0xb08d, 0xb08d, 0xb08d, 0x080c, 0x0d84, 0x080c,
++	0x901f, 0x6114, 0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, 0x61a9,
++	0x009e, 0x0804, 0x9554, 0x9284, 0x0007, 0x1158, 0x9282, 0x1cd0,
++	0x0240, 0x2001, 0x1818, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001,
++	0x0005, 0x9006, 0x0ce8, 0x0096, 0x0018, 0x0096, 0x6014, 0x2048,
++	0x9984, 0xf000, 0x9086, 0xf000, 0x0110, 0x080c, 0x1057, 0x009e,
++	0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126, 0x2091, 0x8000,
++	0x2061, 0x1cd0, 0x2071, 0x1800, 0x734c, 0x706c, 0x9302, 0x12a8,
++	0x6020, 0x9206, 0x1160, 0x080c, 0xb460, 0x0148, 0x080c, 0xb295,
++	0x1110, 0x080c, 0x9e99, 0x00c6, 0x080c, 0x9554, 0x00ce, 0x9ce0,
++	0x0018, 0x7060, 0x9c02, 0x1208, 0x0c38, 0x012e, 0x000e, 0x003e,
++	0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000,
++	0x210c, 0x81ff, 0x0128, 0x2061, 0x1a72, 0x6112, 0x080c, 0x2d1a,
++	0x9006, 0x0010, 0x9085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005,
++	0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x94fe, 0x01d8, 0x080c,
++	0x4df2, 0x0110, 0x662e, 0x0008, 0x6616, 0x2b00, 0x6012, 0x080c,
++	0x4df2, 0x0118, 0x080c, 0xb1bc, 0x0168, 0x080c, 0xb4e6, 0x6023,
++	0x0003, 0x2009, 0x004b, 0x080c, 0x95ce, 0x9085, 0x0001, 0x012e,
++	0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000,
++	0xbaa0, 0x080c, 0x95a1, 0x0590, 0x080c, 0x4df2, 0x0118, 0x602f,
++	0x0000, 0x0010, 0x6017, 0x0000, 0x2b00, 0x6012, 0x080c, 0xb4e6,
++	0x6023, 0x0003, 0x0016, 0x080c, 0x7d55, 0x0076, 0x903e, 0x080c,
++	0x7c4d, 0x2c08, 0x080c, 0xc73e, 0x007e, 0x001e, 0xd184, 0x0128,
++	0x080c, 0x9554, 0x9085, 0x0001, 0x0070, 0x080c, 0x4df2, 0x0128,
++	0xd18c, 0x1170, 0x080c, 0xb1bc, 0x0148, 0x2009, 0x004c, 0x080c,
++	0x95ce, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8,
++	0x2900, 0x6016, 0x0c90, 0x2009, 0x004d, 0x0010, 0x2009, 0x004e,
++	0x00f6, 0x00c6, 0x0046, 0x0016, 0x080c, 0x94fe, 0x2c78, 0x01d8,
++	0x080c, 0x4df2, 0x0110, 0x7e2e, 0x0008, 0x7e16, 0x2b00, 0x7812,
++	0x7823, 0x0003, 0x2021, 0x0005, 0x080c, 0xb1ce, 0x2f60, 0x080c,
++	0x4df2, 0x0118, 0x080c, 0xb1bc, 0x0130, 0x001e, 0x0016, 0x080c,
++	0x95ce, 0x9085, 0x0001, 0x001e, 0x004e, 0x00ce, 0x00fe, 0x0005,
++	0x00f6, 0x00c6, 0x0046, 0x080c, 0x94fe, 0x2c78, 0x0530, 0x080c,
++	0x4df2, 0x0110, 0x7e2e, 0x0008, 0x7e16, 0x2b00, 0x7812, 0x7823,
++	0x0003, 0x0096, 0x2021, 0x0004, 0x0489, 0x009e, 0x2001, 0x194d,
++	0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0x9554, 0x0060, 0x2f60,
++	0x080c, 0x4df2, 0x0120, 0xd18c, 0x1160, 0x0071, 0x0130, 0x2009,
++	0x0052, 0x080c, 0x95ce, 0x9085, 0x0001, 0x004e, 0x00ce, 0x00fe,
++	0x0005, 0x2900, 0x7816, 0x0c98, 0x00c6, 0x080c, 0x441f, 0x00ce,
++	0x1120, 0x080c, 0x9554, 0x9006, 0x0005, 0xa867, 0x0000, 0xa86b,
++	0x8000, 0x2900, 0x6016, 0x9085, 0x0001, 0x0005, 0x0096, 0x0076,
++	0x0126, 0x2091, 0x8000, 0x080c, 0x5d41, 0x0158, 0x2001, 0xb1d3,
++	0x0006, 0x900e, 0x2400, 0x080c, 0x63d1, 0x080c, 0x61a9, 0x000e,
++	0x0807, 0x2418, 0x080c, 0x7fc0, 0xbaa0, 0x0086, 0x2041, 0x0001,
++	0x2039, 0x0001, 0x2608, 0x080c, 0x7d6d, 0x008e, 0x080c, 0x7c4d,
++	0x2f08, 0x2648, 0x080c, 0xc73e, 0xb93c, 0x81ff, 0x090c, 0x7e2b,
++	0x080c, 0x8125, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x94fe, 0x0190, 0x660a, 0x2b08, 0x6112,
++	0x080c, 0xb4e6, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x001f,
++	0x080c, 0x95ce, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006,
++	0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x95a1, 0x01b8,
++	0x660a, 0x2b08, 0x6112, 0x080c, 0xb4e6, 0x6023, 0x0008, 0x2900,
++	0x6016, 0x00f6, 0x2c78, 0x080c, 0x150d, 0x00fe, 0x2009, 0x0021,
++	0x080c, 0x95ce, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006,
++	0x0cd8, 0x2009, 0x003d, 0x00c6, 0x0126, 0x0016, 0x2091, 0x8000,
++	0x080c, 0x94fe, 0x0198, 0x660a, 0x2b08, 0x6112, 0x080c, 0xb4e6,
++	0x6023, 0x0001, 0x2900, 0x6016, 0x001e, 0x0016, 0x080c, 0x95ce,
++	0x9085, 0x0001, 0x001e, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd0,
++	0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x95a1, 0x0188, 0x2b08,
++	0x6112, 0x080c, 0xb4e6, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009,
++	0x0000, 0x080c, 0x95ce, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005,
++	0x9006, 0x0cd8, 0x2009, 0x0044, 0x0830, 0x2009, 0x0049, 0x0818,
++	0x0026, 0x00b6, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211,
++	0xba3e, 0x00be, 0x002e, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e,
++	0x0002, 0x0140, 0x908e, 0x0003, 0x0128, 0x908e, 0x0004, 0x0110,
++	0x9085, 0x0001, 0x001e, 0x000e, 0x0005, 0x0006, 0x0096, 0x6014,
++	0x904d, 0x0148, 0xa864, 0x9086, 0x0139, 0x0138, 0xa868, 0xd0fc,
++	0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x009e, 0x000e, 0x0005,
++	0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x94fe, 0x0198, 0x2b08,
++	0x6112, 0x080c, 0xb4e6, 0x6023, 0x0001, 0x2900, 0x6016, 0x080c,
++	0x2d1a, 0x2009, 0x0028, 0x080c, 0x95ce, 0x9085, 0x0001, 0x012e,
++	0x00ce, 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8, 0x2011,
++	0x1822, 0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, 0xa0c5,
++	0x00be, 0x080c, 0xa2bc, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c,
++	0x7c1d, 0x080c, 0x8125, 0x0078, 0x6014, 0x0096, 0x2048, 0xa868,
++	0x009e, 0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, 0xb69a, 0x080c,
++	0x9e99, 0x080c, 0x9554, 0x0005, 0x0096, 0x6014, 0x904d, 0x090c,
++	0x0d84, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b,
++	0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9,
++	0x012e, 0x009e, 0x080c, 0x9554, 0x0c30, 0x0096, 0x9186, 0x0016,
++	0x1128, 0x2001, 0x0004, 0x080c, 0x5b61, 0x00e8, 0x9186, 0x0015,
++	0x1510, 0x2011, 0x1822, 0x2204, 0x9086, 0x0014, 0x11e0, 0x6010,
++	0x00b6, 0x2058, 0x080c, 0x5ca8, 0x00be, 0x080c, 0xa38d, 0x1198,
++	0x6010, 0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, 0x0160, 0x2001,
++	0x0006, 0x080c, 0x5b61, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0170,
++	0x080c, 0x9920, 0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0528,
++	0x080c, 0x9e99, 0x080c, 0x9554, 0x009e, 0x0005, 0x6014, 0x6310,
++	0x2358, 0x904d, 0x090c, 0x0d84, 0xa87b, 0x0000, 0xa883, 0x0000,
++	0xa897, 0x4000, 0x900e, 0x080c, 0x5e2d, 0x1108, 0xc185, 0xb800,
++	0xd0bc, 0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, 0x080c,
++	0x61a9, 0x012e, 0x080c, 0x9554, 0x08f8, 0x6014, 0x904d, 0x090c,
++	0x0d84, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b,
++	0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9,
++	0x012e, 0x080c, 0x9554, 0x0840, 0xa878, 0x9086, 0x0005, 0x1108,
++	0x0009, 0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, 0x6043, 0x0000,
++	0x6017, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x7bcb,
++	0x080c, 0x8125, 0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058, 0xb800,
++	0x00be, 0xd0bc, 0x0120, 0x6020, 0x9084, 0x000f, 0x0013, 0x00ce,
++	0x0005, 0xadfa, 0xb3aa, 0xb3aa, 0xb3ad, 0xca0f, 0xca2a, 0xca2d,
++	0xadfa, 0xadfa, 0xadfa, 0xadfa, 0xadfa, 0xadfa, 0xadfa, 0xadfa,
++	0x080c, 0x0d84, 0xa001, 0xa001, 0x0005, 0x0000, 0x6010, 0x00b6,
++	0x2058, 0xb800, 0x00be, 0xd0bc, 0x0550, 0x00f6, 0x2c78, 0x080c,
++	0x94fe, 0x1128, 0x2001, 0x1955, 0x2004, 0x7842, 0x00f8, 0x7810,
++	0x6012, 0x080c, 0xb4e6, 0x7820, 0x9086, 0x0003, 0x0128, 0x7808,
++	0x603a, 0x2f00, 0x603e, 0x0020, 0x7808, 0x603e, 0x2f00, 0x603a,
++	0x602e, 0x6023, 0x0001, 0x6007, 0x0035, 0x6003, 0x0001, 0x7954,
++	0x6156, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x2f60, 0x00fe, 0x0005,
++	0x0016, 0x0096, 0x6814, 0x2048, 0xa87c, 0xd0e4, 0x0170, 0xc0e4,
++	0xa87e, 0xa877, 0x0000, 0xa893, 0x0000, 0xa88f, 0x0000, 0xd0cc,
++	0x0120, 0xa878, 0x2048, 0x080c, 0x0f60, 0x6830, 0x6036, 0x908e,
++	0x0001, 0x0148, 0x6803, 0x0002, 0x9086, 0x0005, 0x0168, 0x9006,
++	0x602e, 0x6032, 0x00c8, 0x681c, 0xc085, 0x681e, 0x6803, 0x0004,
++	0x6824, 0xc0f4, 0xc0d5, 0x6826, 0x6814, 0x2048, 0xa8ac, 0x6938,
++	0x9102, 0xa8b0, 0x693c, 0x9103, 0x1e50, 0x683c, 0x602e, 0x6838,
++	0x9084, 0xfffc, 0x683a, 0x6032, 0x2d00, 0x603a, 0x6808, 0x603e,
++	0x6910, 0x6112, 0x6954, 0x6156, 0x6023, 0x0001, 0x6007, 0x0039,
++	0x6003, 0x0001, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x009e, 0x001e,
++	0x0005, 0x6024, 0xd0d4, 0x0510, 0xd0f4, 0x11f8, 0x6038, 0x940a,
++	0x603c, 0x9303, 0x0230, 0x9105, 0x0120, 0x6024, 0xc0d4, 0xc0f5,
++	0x0098, 0x643a, 0x633e, 0xac3e, 0xab42, 0x0046, 0x0036, 0x2400,
++	0xacac, 0x9402, 0xa836, 0x2300, 0xabb0, 0x9303, 0xa83a, 0x003e,
++	0x004e, 0x6024, 0xc0d4, 0x0000, 0x6026, 0x0005, 0xd0f4, 0x1138,
++	0xa83c, 0x603a, 0xa840, 0x603e, 0x6024, 0xc0f5, 0x6026, 0x0005,
++	0x0006, 0x0016, 0x6004, 0x908e, 0x0034, 0x01b8, 0x908e, 0x0035,
++	0x01a0, 0x908e, 0x0036, 0x0188, 0x908e, 0x0037, 0x0170, 0x908e,
++	0x0038, 0x0158, 0x908e, 0x0039, 0x0140, 0x908e, 0x003a, 0x0128,
++	0x908e, 0x003b, 0x0110, 0x9085, 0x0001, 0x001e, 0x000e, 0x0005,
++	0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x2001, 0x194f, 0x200c,
++	0x8000, 0x2014, 0x2001, 0x0032, 0x080c, 0x7a4b, 0x2001, 0x1953,
++	0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0x1951, 0x200c,
++	0x8000, 0x2014, 0x2071, 0x193b, 0x711a, 0x721e, 0x2001, 0x0064,
++	0x080c, 0x7a4b, 0x2001, 0x1954, 0x82ff, 0x1110, 0x2011, 0x0014,
++	0x2202, 0x2001, 0x1955, 0x9288, 0x000a, 0x2102, 0x2001, 0x1a54,
++	0x2102, 0x2001, 0x0032, 0x080c, 0x1492, 0x080c, 0x5f0e, 0x00ee,
++	0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x00e6,
++	0x2001, 0x1953, 0x2003, 0x0028, 0x2001, 0x1954, 0x2003, 0x0014,
++	0x2071, 0x193b, 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, 0x1955,
++	0x2009, 0x001e, 0x2102, 0x2001, 0x1a54, 0x2102, 0x2001, 0x0032,
++	0x080c, 0x1492, 0x00ee, 0x001e, 0x000e, 0x0005, 0x0096, 0x6058,
++	0x904d, 0x0110, 0x080c, 0x0fe0, 0x009e, 0x0005, 0x0005, 0x00c6,
++	0x0126, 0x2091, 0x8000, 0x080c, 0x94fe, 0x0180, 0x2b08, 0x6112,
++	0x0ca9, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x0033, 0x080c,
++	0x95ce, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8,
++	0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x1500,
++	0x7088, 0x9086, 0x0018, 0x11e0, 0x6014, 0x2048, 0xaa3c, 0xd2e4,
++	0x1160, 0x2c78, 0x080c, 0x8315, 0x01d8, 0x7074, 0xaa50, 0x9206,
++	0x1160, 0x7078, 0xaa54, 0x9206, 0x1140, 0x6210, 0x00b6, 0x2258,
++	0xbaa0, 0x00be, 0x900e, 0x080c, 0x2d5f, 0x080c, 0x9920, 0x0020,
++	0x080c, 0x9e99, 0x080c, 0x9554, 0x00fe, 0x00ee, 0x009e, 0x0005,
++	0x7058, 0xaa54, 0x9206, 0x0d48, 0x0c80, 0x00c6, 0x0126, 0x2091,
++	0x8000, 0x080c, 0x94fe, 0x0188, 0x2b08, 0x6112, 0x080c, 0xb4e6,
++	0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x004d, 0x080c, 0x95ce,
++	0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6,
++	0x0126, 0x2091, 0x8000, 0x0016, 0x080c, 0x94fe, 0x0180, 0x2b08,
++	0x6112, 0x080c, 0xb4e6, 0x6023, 0x0001, 0x2900, 0x6016, 0x001e,
++	0x080c, 0x95ce, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x001e,
++	0x9006, 0x0cd0, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0066,
++	0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x1568,
++	0x7188, 0x6014, 0x2048, 0xa814, 0x8003, 0x9106, 0x1530, 0x20e1,
++	0x0000, 0x2001, 0x196d, 0x2003, 0x0000, 0x6014, 0x2048, 0xa830,
++	0x20a8, 0x8906, 0x8006, 0x8007, 0x9094, 0x003f, 0x22e8, 0x9084,
++	0xffc0, 0x9080, 0x001b, 0x20a0, 0x2001, 0x196d, 0x0016, 0x200c,
++	0x080c, 0xbcf8, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c38,
++	0x6014, 0x2048, 0xa867, 0x0103, 0x0010, 0x080c, 0x9e99, 0x080c,
++	0x9554, 0x00fe, 0x00ee, 0x009e, 0x006e, 0x005e, 0x004e, 0x003e,
++	0x002e, 0x001e, 0x0005, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800,
++	0x9186, 0x0015, 0x11b8, 0x7088, 0x9086, 0x0004, 0x1198, 0x6014,
++	0x2048, 0x2c78, 0x080c, 0x8315, 0x01a8, 0x7074, 0xaa74, 0x9206,
++	0x1130, 0x7078, 0xaa78, 0x9206, 0x1110, 0x080c, 0x2d1a, 0x080c,
++	0x9920, 0x0020, 0x080c, 0x9e99, 0x080c, 0x9554, 0x00fe, 0x00ee,
++	0x009e, 0x0005, 0x7058, 0xaa78, 0x9206, 0x0d78, 0x0c80, 0x0096,
++	0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x1538, 0x7088,
++	0x9086, 0x0004, 0x1518, 0x6014, 0x2048, 0x2c78, 0x080c, 0x8315,
++	0x05b8, 0x7074, 0xaacc, 0x9206, 0x1180, 0x7078, 0xaad0, 0x9206,
++	0x1160, 0x080c, 0x2d1a, 0x0016, 0xa998, 0xaab0, 0x9284, 0x1000,
++	0xc0fd, 0x080c, 0x4da2, 0x001e, 0x0010, 0x080c, 0x4b95, 0xa87b,
++	0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0060, 0x080c, 0x4b95,
++	0x6014, 0x2048, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005,
++	0xa89b, 0x0004, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0x080c,
++	0x61a9, 0x012e, 0x080c, 0x9554, 0x00fe, 0x00ee, 0x009e, 0x0005,
++	0x7058, 0xaad0, 0x9206, 0x0968, 0x08c0, 0x0016, 0x0026, 0xa87c,
++	0xd0ac, 0x0178, 0xa938, 0xaa34, 0x2100, 0x9205, 0x0150, 0xa890,
++	0x9106, 0x1118, 0xa88c, 0x9206, 0x0120, 0xa992, 0xaa8e, 0x9085,
++	0x0001, 0x002e, 0x001e, 0x0005, 0x00b6, 0x00d6, 0x0036, 0x0096,
++	0x6314, 0x2348, 0xa87a, 0xa982, 0x929e, 0x4000, 0x1580, 0x6310,
++	0x00c6, 0x2358, 0x2009, 0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c,
++	0x5e2d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96,
++	0xa99a, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031,
++	0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c,
++	0x0f2b, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b8,
++	0x9080, 0x000a, 0x2098, 0x080c, 0x0f2b, 0x00ce, 0x0090, 0xaa96,
++	0x3918, 0x9398, 0x0007, 0x231c, 0x6004, 0x9086, 0x0016, 0x0110,
++	0xa89b, 0x0004, 0xaba2, 0x6310, 0x2358, 0xb804, 0x9084, 0x00ff,
++	0xa89e, 0x080c, 0x619c, 0x6017, 0x0000, 0x009e, 0x003e, 0x00de,
++	0x00be, 0x0005, 0x0026, 0x0036, 0x0046, 0x00b6, 0x0096, 0x00f6,
++	0x6214, 0x2248, 0x6210, 0x2258, 0x2079, 0x0260, 0x9096, 0x0000,
++	0x11a0, 0xb814, 0x9084, 0x00ff, 0x900e, 0x080c, 0x23fd, 0x2118,
++	0x831f, 0x939c, 0xff00, 0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c,
++	0x2011, 0x8018, 0x080c, 0x447f, 0x00a8, 0x9096, 0x0001, 0x1148,
++	0x89ff, 0x0180, 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa,
++	0x0048, 0x9096, 0x0002, 0x1130, 0xa89b, 0x000d, 0x7838, 0xa8a6,
++	0x783c, 0xa8aa, 0x00fe, 0x009e, 0x00be, 0x004e, 0x003e, 0x002e,
++	0x0005, 0x00c6, 0x0026, 0x0016, 0x9186, 0x0035, 0x0110, 0x6a38,
++	0x0008, 0x6a2c, 0x080c, 0xb09b, 0x01f0, 0x2260, 0x6120, 0x9186,
++	0x0003, 0x0118, 0x9186, 0x0006, 0x1190, 0x6838, 0x9206, 0x0140,
++	0x683c, 0x9206, 0x1160, 0x6108, 0x6838, 0x9106, 0x1140, 0x0020,
++	0x6008, 0x693c, 0x9106, 0x1118, 0x6010, 0x6910, 0x9106, 0x001e,
++	0x002e, 0x00ce, 0x0005, 0x9085, 0x0001, 0x0cc8, 0xa974, 0xd1cc,
++	0x0188, 0x918c, 0x00ff, 0x918e, 0x0002, 0x1160, 0xa9a8, 0x918c,
++	0x0f00, 0x810f, 0x918e, 0x0001, 0x1128, 0xa834, 0xa938, 0x9115,
++	0x190c, 0xa82a, 0x0005, 0x0036, 0x2019, 0x0001, 0x0010, 0x0036,
++	0x901e, 0x0459, 0x01a0, 0x080c, 0xb0ad, 0x0188, 0x6037, 0x4000,
++	0x6014, 0x6017, 0x0000, 0x0096, 0x2048, 0xa87c, 0xa867, 0x0103,
++	0xa877, 0x0000, 0x83ff, 0x1129, 0x080c, 0x61a9, 0x009e, 0x003e,
++	0x0005, 0xa880, 0xd0b4, 0x0128, 0xa87b, 0x0006, 0xc0ec, 0xa882,
++	0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005,
++	0x080c, 0xb37a, 0xa877, 0x0000, 0x0005, 0x2001, 0x180f, 0x2004,
++	0xd0ec, 0x0005, 0x0006, 0x2001, 0x180f, 0x2004, 0xd0f4, 0x000e,
++	0x0005, 0x2001, 0x180f, 0x2004, 0xd0e4, 0x0005, 0x0036, 0x0046,
++	0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0007, 0x080c,
++	0x44f9, 0x004e, 0x003e, 0x0005, 0x0c61, 0x1d81, 0x0005, 0x2001,
++	0x1953, 0x2004, 0x601a, 0x0005, 0x2001, 0x1955, 0x2004, 0x6042,
++	0x0005, 0x080c, 0x9554, 0x0804, 0x8125, 0x00b6, 0x0066, 0x6000,
++	0x90b2, 0x0016, 0x1a0c, 0x0d84, 0x001b, 0x006e, 0x00be, 0x0005,
++	0xb798, 0xbdf9, 0xbf54, 0xb798, 0xb798, 0xb798, 0xb798, 0xb798,
++	0xb7cf, 0xbfcf, 0xb798, 0xb798, 0xb798, 0xb798, 0xb798, 0xb798,
++	0x080c, 0x0d84, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d84,
++	0x0013, 0x006e, 0x0005, 0xb7b3, 0xc519, 0xb7b3, 0xb7b3, 0xb7b3,
++	0xb7b3, 0xb7b3, 0xb7b3, 0xc4c8, 0xc56d, 0xb7b3, 0xcb4c, 0xcb82,
++	0xcb4c, 0xcb82, 0xb7b3, 0x080c, 0x0d84, 0x6000, 0x9082, 0x0016,
++	0x1a0c, 0x0d84, 0x6000, 0x000a, 0x0005, 0xb7cd, 0xc1ad, 0xc29d,
++	0xc2bf, 0xc366, 0xb7cd, 0xc43f, 0xc3ee, 0xbfdb, 0xc49e, 0xc4b3,
++	0xb7cd, 0xb7cd, 0xb7cd, 0xb7cd, 0xb7cd, 0x080c, 0x0d84, 0x91b2,
++	0x0053, 0x1a0c, 0x0d84, 0x2100, 0x91b2, 0x0040, 0x1a04, 0xbbfa,
++	0x0002, 0xb819, 0xb9eb, 0xb819, 0xb819, 0xb819, 0xb9f4, 0xb819,
++	0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819,
++	0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819,
++	0xb81b, 0xb871, 0xb880, 0xb8e1, 0xb908, 0xb97f, 0xb9d6, 0xb819,
++	0xb819, 0xb9f7, 0xb819, 0xb819, 0xba0c, 0xba19, 0xb819, 0xb819,
++	0xb819, 0xb819, 0xb819, 0xba9c, 0xb819, 0xb819, 0xbab0, 0xb819,
++	0xb819, 0xba6b, 0xb819, 0xb819, 0xb819, 0xbac8, 0xb819, 0xb819,
++	0xb819, 0xbb45, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819,
++	0xbbc2, 0x080c, 0x0d84, 0x080c, 0x5eeb, 0x1150, 0x2001, 0x1836,
++	0x2004, 0xd0cc, 0x1128, 0x9084, 0x0009, 0x9086, 0x0008, 0x1140,
++	0x6007, 0x0009, 0x602f, 0x0009, 0x6017, 0x0000, 0x0804, 0xb9e4,
++	0x080c, 0x5ed5, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x6210,
++	0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x7d55, 0x0076,
++	0x903e, 0x080c, 0x7c4d, 0x2c08, 0x080c, 0xc73e, 0x007e, 0x001e,
++	0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610, 0x2658, 0x080c,
++	0x5c1c, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x0278, 0x080c,
++	0xc675, 0x1904, 0xb8db, 0x080c, 0xc611, 0x1120, 0x6007, 0x0008,
++	0x0804, 0xb9e4, 0x6007, 0x0009, 0x0804, 0xb9e4, 0x080c, 0xc860,
++	0x0128, 0x080c, 0xc675, 0x0d78, 0x0804, 0xb8db, 0x6017, 0x1900,
++	0x0c88, 0x080c, 0x2e39, 0x1904, 0xbbf7, 0x6106, 0x080c, 0xc5c8,
++	0x6007, 0x0006, 0x0804, 0xb9e4, 0x6007, 0x0007, 0x0804, 0xb9e4,
++	0x080c, 0xcbbe, 0x1904, 0xbbf7, 0x080c, 0x2e39, 0x1904, 0xbbf7,
++	0x00d6, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006,
++	0x1220, 0x2001, 0x0001, 0x080c, 0x5b4d, 0x96b4, 0xff00, 0x8637,
++	0x9686, 0x0006, 0x0188, 0x9686, 0x0004, 0x0170, 0xbe04, 0x96b4,
++	0x00ff, 0x9686, 0x0006, 0x0140, 0x9686, 0x0004, 0x0128, 0x9686,
++	0x0005, 0x0110, 0x00de, 0x0478, 0x00e6, 0x2071, 0x0260, 0x7034,
++	0x90b4, 0x0003, 0x1138, 0x90b2, 0x0014, 0x0220, 0x7030, 0x9084,
++	0x0003, 0x0130, 0x00ee, 0x6017, 0x0000, 0x602f, 0x0007, 0x00b0,
++	0x00ee, 0x080c, 0xc6d4, 0x1190, 0x9686, 0x0006, 0x1140, 0x0026,
++	0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x2d5f, 0x002e, 0x080c,
++	0x5ca8, 0x6007, 0x000a, 0x00de, 0x0804, 0xb9e4, 0x6007, 0x000b,
++	0x00de, 0x0804, 0xb9e4, 0x080c, 0x2d1a, 0x6007, 0x0001, 0x0804,
++	0xb9e4, 0x080c, 0xcbbe, 0x1904, 0xbbf7, 0x080c, 0x2e39, 0x1904,
++	0xbbf7, 0x2071, 0x0260, 0x7034, 0x90b4, 0x0003, 0x1958, 0x90b2,
++	0x0014, 0x0a40, 0x7030, 0x9084, 0x0003, 0x1920, 0x6610, 0x2658,
++	0xbe04, 0x9686, 0x0707, 0x09f8, 0x0026, 0x6210, 0x2258, 0xbaa0,
++	0x900e, 0x080c, 0x2d5f, 0x002e, 0x6007, 0x000c, 0x0804, 0xb9e4,
++	0x080c, 0x5eeb, 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009,
++	0x9086, 0x0008, 0x1110, 0x0804, 0xb828, 0x080c, 0x5ed5, 0x6610,
++	0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x06b8, 0x1138,
++	0x0026, 0x2001, 0x0006, 0x080c, 0x5b8d, 0x002e, 0x0050, 0x96b4,
++	0xff00, 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904,
++	0xb8db, 0x080c, 0xc6e1, 0x1120, 0x6007, 0x000e, 0x0804, 0xb9e4,
++	0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x2d1a, 0x004e,
++	0x0016, 0x9006, 0x2009, 0x1853, 0x210c, 0xd1a4, 0x0148, 0x2009,
++	0x0029, 0x080c, 0xc9c5, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802,
++	0x001e, 0x004e, 0x6007, 0x0001, 0x0804, 0xb9e4, 0x2001, 0x0001,
++	0x080c, 0x5b4d, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004,
++	0x2019, 0x1805, 0x2011, 0x0270, 0x080c, 0xa425, 0x003e, 0x002e,
++	0x001e, 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637, 0x9682,
++	0x0004, 0x0a04, 0xb8db, 0x9682, 0x0007, 0x0a04, 0xb931, 0x0804,
++	0xb8db, 0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xb9e4, 0x080c,
++	0x5eeb, 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, 0x9086,
++	0x0008, 0x1110, 0x0804, 0xb828, 0x080c, 0x5ed5, 0x6610, 0x2658,
++	0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x0680, 0x96b4, 0xff00,
++	0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xb8db,
++	0x080c, 0xc70f, 0x1130, 0x080c, 0xc611, 0x1118, 0x6007, 0x0010,
++	0x04d8, 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x2d1a,
++	0x004e, 0x0016, 0x9006, 0x2009, 0x1853, 0x210c, 0xd1a4, 0x0148,
++	0x2009, 0x0029, 0x080c, 0xc9c5, 0x6010, 0x2058, 0xb800, 0xc0e5,
++	0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c, 0xc860,
++	0x0140, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0988, 0x0804,
++	0xb8db, 0x6017, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, 0x2e39,
++	0x1904, 0xbbf7, 0x080c, 0xcbbe, 0x1904, 0xbbf7, 0x080c, 0xbd93,
++	0x1904, 0xb8db, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, 0x7c1d,
++	0x080c, 0x8125, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c,
++	0x7c1d, 0x080c, 0x8125, 0x0cb0, 0x6007, 0x0005, 0x0c68, 0x080c,
++	0xcbbe, 0x1904, 0xbbf7, 0x080c, 0x2e39, 0x1904, 0xbbf7, 0x080c,
++	0xbd93, 0x1904, 0xb8db, 0x6007, 0x0020, 0x6003, 0x0001, 0x080c,
++	0x7c1d, 0x080c, 0x8125, 0x0005, 0x080c, 0x2e39, 0x1904, 0xbbf7,
++	0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x7c1d, 0x080c, 0x8125,
++	0x0005, 0x080c, 0xcbbe, 0x1904, 0xbbf7, 0x080c, 0x2e39, 0x1904,
++	0xbbf7, 0x080c, 0xbd93, 0x1904, 0xb8db, 0x0016, 0x0026, 0x00e6,
++	0x2071, 0x0260, 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08, 0x080c,
++	0xb09b, 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188, 0x6010,
++	0x9190, 0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240, 0x2c08,
++	0x9006, 0x080c, 0xc997, 0x1180, 0x7244, 0x9286, 0xffff, 0x01b0,
++	0x2160, 0x6007, 0x0026, 0x6017, 0x1700, 0x7214, 0x9296, 0xffff,
++	0x1180, 0x6007, 0x0025, 0x0068, 0x6020, 0x9086, 0x0007, 0x1d80,
++	0x6004, 0x9086, 0x0024, 0x1110, 0x080c, 0x9554, 0x2160, 0x6007,
++	0x0025, 0x6003, 0x0001, 0x080c, 0x7c1d, 0x080c, 0x8125, 0x00ee,
++	0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x5b4d, 0x0156,
++	0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011,
++	0x0276, 0x080c, 0xa425, 0x003e, 0x002e, 0x001e, 0x015e, 0x0120,
++	0x6007, 0x0031, 0x0804, 0xb9e4, 0x080c, 0xa0dc, 0x080c, 0x6877,
++	0x1190, 0x0006, 0x0026, 0x0036, 0x080c, 0x6891, 0x1138, 0x080c,
++	0x6b40, 0x080c, 0x56d9, 0x080c, 0x67be, 0x0010, 0x080c, 0x6853,
++	0x003e, 0x002e, 0x000e, 0x0005, 0x080c, 0x2e39, 0x1904, 0xbbf7,
++	0x080c, 0xbd93, 0x1904, 0xb8db, 0x6106, 0x080c, 0xbdaf, 0x1120,
++	0x6007, 0x002b, 0x0804, 0xb9e4, 0x6007, 0x002c, 0x0804, 0xb9e4,
++	0x080c, 0xcbbe, 0x1904, 0xbbf7, 0x080c, 0x2e39, 0x1904, 0xbbf7,
++	0x080c, 0xbd93, 0x1904, 0xb8db, 0x6106, 0x080c, 0xbdb3, 0x1120,
++	0x6007, 0x002e, 0x0804, 0xb9e4, 0x6007, 0x002f, 0x0804, 0xb9e4,
++	0x080c, 0x2e39, 0x1904, 0xbbf7, 0x00e6, 0x00d6, 0x00c6, 0x6010,
++	0x2058, 0xb804, 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158, 0x9184,
++	0xff00, 0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee,
++	0x0804, 0xb9eb, 0x080c, 0x4dee, 0xd0e4, 0x0904, 0xbb42, 0x2071,
++	0x026c, 0x7010, 0x603a, 0x7014, 0x603e, 0x7108, 0x720c, 0x080c,
++	0x5f29, 0x0140, 0x6010, 0x2058, 0xb810, 0x9106, 0x1118, 0xb814,
++	0x9206, 0x0510, 0x080c, 0x5f25, 0x15b8, 0x2069, 0x1800, 0x6878,
++	0x9206, 0x1590, 0x6874, 0x9106, 0x1578, 0x7210, 0x080c, 0xb09b,
++	0x0590, 0x080c, 0xbc80, 0x0578, 0x080c, 0xca3c, 0x0560, 0x622e,
++	0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x7bcb, 0x080c, 0x8125,
++	0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff, 0x0150,
++	0x080c, 0xb09b, 0x01c0, 0x9280, 0x0002, 0x2004, 0x7110, 0x9106,
++	0x1190, 0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c, 0xc997,
++	0x2c10, 0x2160, 0x0140, 0x0890, 0x6007, 0x0037, 0x602f, 0x0009,
++	0x6017, 0x1500, 0x08b8, 0x6007, 0x0037, 0x602f, 0x0003, 0x6017,
++	0x1700, 0x0880, 0x6007, 0x0012, 0x0868, 0x080c, 0x2e39, 0x1904,
++	0xbbf7, 0x6010, 0x2058, 0xb804, 0x9084, 0xff00, 0x8007, 0x9086,
++	0x0006, 0x1904, 0xb9eb, 0x00e6, 0x00d6, 0x00c6, 0x080c, 0x4dee,
++	0xd0e4, 0x0904, 0xbbba, 0x2069, 0x1800, 0x2071, 0x026c, 0x7008,
++	0x603a, 0x720c, 0x623e, 0x9286, 0xffff, 0x1150, 0x7208, 0x00c6,
++	0x2c08, 0x9085, 0x0001, 0x080c, 0xc997, 0x2c10, 0x00ce, 0x05e8,
++	0x080c, 0xb09b, 0x05d0, 0x7108, 0x9280, 0x0002, 0x2004, 0x9106,
++	0x15a0, 0x00c6, 0x0026, 0x2260, 0x080c, 0xad11, 0x002e, 0x00ce,
++	0x7118, 0x918c, 0xff00, 0x810f, 0x9186, 0x0001, 0x0178, 0x9186,
++	0x0005, 0x0118, 0x9186, 0x0007, 0x1198, 0x9280, 0x0005, 0x2004,
++	0x9005, 0x0170, 0x080c, 0xbc80, 0x0904, 0xbb3b, 0x0056, 0x7510,
++	0x7614, 0x080c, 0xca55, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005,
++	0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001,
++	0x080c, 0x7bcb, 0x080c, 0x8125, 0x0c78, 0x6007, 0x003b, 0x602f,
++	0x0003, 0x6017, 0x0300, 0x6003, 0x0001, 0x080c, 0x7bcb, 0x080c,
++	0x8125, 0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, 0x6017, 0x0000,
++	0x0804, 0xbb12, 0x00e6, 0x0026, 0x080c, 0x5eeb, 0x0550, 0x080c,
++	0x5ed5, 0x080c, 0xcc30, 0x1518, 0x2071, 0x1800, 0x70d8, 0x9085,
++	0x0003, 0x70da, 0x00f6, 0x2079, 0x0100, 0x72a8, 0x9284, 0x00ff,
++	0x7076, 0x78e6, 0x9284, 0xff00, 0x7278, 0x9205, 0x707a, 0x78ea,
++	0x00fe, 0x70e3, 0x0000, 0x080c, 0x5f29, 0x0120, 0x2011, 0x19cd,
++	0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2b1e, 0x0010, 0x080c,
++	0xcc62, 0x002e, 0x00ee, 0x080c, 0x9554, 0x0804, 0xb9ea, 0x080c,
++	0x9554, 0x0005, 0x2600, 0x0002, 0xbc0e, 0xbc0e, 0xbc0e, 0xbc0e,
++	0xbc0e, 0xbc10, 0xbc0e, 0xbc0e, 0xbc0e, 0xbc0e, 0xbc2b, 0xbc0e,
++	0xbc0e, 0xbc0e, 0xbc3d, 0xbc4a, 0xbc7b, 0xbc0e, 0x080c, 0x0d84,
++	0x080c, 0xcbbe, 0x1d20, 0x080c, 0x2e39, 0x1d08, 0x080c, 0xbd93,
++	0x1148, 0x7038, 0x6016, 0x6007, 0x0045, 0x6003, 0x0001, 0x080c,
++	0x7c1d, 0x0005, 0x080c, 0x2d1a, 0x6007, 0x0001, 0x6003, 0x0001,
++	0x080c, 0x7c1d, 0x0005, 0x080c, 0xcbbe, 0x1948, 0x080c, 0x2e39,
++	0x1930, 0x080c, 0xbd93, 0x1d70, 0x703c, 0x6016, 0x6007, 0x004a,
++	0x6003, 0x0001, 0x080c, 0x7c1d, 0x0005, 0x080c, 0xbc9b, 0x0904,
++	0xbbf7, 0x6007, 0x004e, 0x6003, 0x0001, 0x080c, 0x7c1d, 0x080c,
++	0x8125, 0x0005, 0x6007, 0x004f, 0x6017, 0x0000, 0x7134, 0x918c,
++	0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001, 0x1160, 0x7140, 0x2001,
++	0x198a, 0x2004, 0x9106, 0x11b0, 0x7144, 0x2001, 0x198b, 0x2004,
++	0x9106, 0x0190, 0x9186, 0x0002, 0x1168, 0x2011, 0x0276, 0x20a9,
++	0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xa439,
++	0x009e, 0x0110, 0x6017, 0x0001, 0x6003, 0x0001, 0x080c, 0x7c1d,
++	0x080c, 0x8125, 0x0005, 0x6007, 0x0050, 0x703c, 0x6016, 0x0ca0,
++	0x00e6, 0x2071, 0x0260, 0x00b6, 0x00c6, 0x2260, 0x6010, 0x2058,
++	0xb8bc, 0xd084, 0x0150, 0x7128, 0x6048, 0x9106, 0x1120, 0x712c,
++	0x6044, 0x9106, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce,
++	0x00be, 0x00ee, 0x0005, 0x0016, 0x0096, 0x0086, 0x00e6, 0x01c6,
++	0x01d6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x7088, 0x908a,
++	0x00f9, 0x16e8, 0x20e1, 0x0000, 0x2001, 0x196d, 0x2003, 0x0000,
++	0x080c, 0x0fc7, 0x05a0, 0x2900, 0x6016, 0x7088, 0x8004, 0xa816,
++	0x908a, 0x001e, 0x02d0, 0xa833, 0x001e, 0x20a9, 0x001e, 0xa860,
++	0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x196d, 0x0016,
++	0x200c, 0x0471, 0x001e, 0x2940, 0x080c, 0x0fc7, 0x01c0, 0x2900,
++	0xa006, 0x2100, 0x81ff, 0x0180, 0x0c18, 0xa832, 0x20a8, 0xa860,
++	0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x196d, 0x0016,
++	0x200c, 0x00b1, 0x001e, 0x0000, 0x9085, 0x0001, 0x0048, 0x2071,
++	0x1800, 0x708b, 0x0000, 0x6014, 0x2048, 0x080c, 0x0f60, 0x9006,
++	0x012e, 0x01de, 0x01ce, 0x00ee, 0x008e, 0x009e, 0x001e, 0x0005,
++	0x0006, 0x0016, 0x0026, 0x0036, 0x00c6, 0x918c, 0xffff, 0x11a8,
++	0x080c, 0x1fed, 0x2099, 0x026c, 0x2001, 0x0014, 0x3518, 0x9312,
++	0x1218, 0x23a8, 0x4003, 0x00f8, 0x20a8, 0x4003, 0x22a8, 0x8108,
++	0x080c, 0x1fed, 0x2099, 0x0260, 0x0ca8, 0x080c, 0x1fed, 0x2061,
++	0x196d, 0x6004, 0x2098, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8,
++	0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x1fed,
++	0x2099, 0x0260, 0x0ca8, 0x2061, 0x196d, 0x2019, 0x0280, 0x3300,
++	0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0260, 0x6006, 0x8108,
++	0x2162, 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, 0x00ce, 0x003e,
++	0x002e, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036,
++	0x00c6, 0x81ff, 0x11b8, 0x080c, 0x2005, 0x20a1, 0x024c, 0x2001,
++	0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0418, 0x20a8,
++	0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108, 0x080c, 0x2005, 0x20a1,
++	0x0240, 0x0c98, 0x080c, 0x2005, 0x2061, 0x1970, 0x6004, 0x20a0,
++	0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0058, 0x20a8,
++	0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108, 0x080c, 0x2005, 0x20a1,
++	0x0240, 0x0c98, 0x2061, 0x1970, 0x2019, 0x0260, 0x3400, 0x931e,
++	0x0110, 0x6006, 0x0020, 0x2001, 0x0240, 0x6006, 0x8108, 0x2162,
++	0x9292, 0x0021, 0x9296, 0xffff, 0x620a, 0x00ce, 0x003e, 0x002e,
++	0x001e, 0x000e, 0x0005, 0x00b6, 0x0066, 0x6610, 0x2658, 0xbe04,
++	0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0170, 0x9686, 0x0004,
++	0x0158, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x0128, 0x9686,
++	0x0004, 0x0110, 0x9085, 0x0001, 0x006e, 0x00be, 0x0005, 0x00d6,
++	0x0441, 0x00de, 0x0005, 0x00d6, 0x0489, 0x11e8, 0x680c, 0x908c,
++	0xff00, 0x6820, 0x9084, 0x00ff, 0x9115, 0x6216, 0x6824, 0x602e,
++	0xd1e4, 0x0118, 0x2009, 0x0001, 0x0058, 0xd1ec, 0x0160, 0x6920,
++	0x918c, 0x00ff, 0x6824, 0x080c, 0x23fd, 0x1128, 0x2110, 0x900e,
++	0x080c, 0x2d5f, 0x0018, 0x9085, 0x0001, 0x0008, 0x9006, 0x00de,
++	0x0005, 0x2069, 0x026d, 0x6800, 0x9082, 0x0010, 0x1228, 0x6017,
++	0x0000, 0x9085, 0x0001, 0x0008, 0x9006, 0x0005, 0x6017, 0x0000,
++	0x2069, 0x026c, 0x6808, 0x9084, 0xff00, 0x9086, 0x0800, 0x1140,
++	0x6800, 0x9084, 0x00ff, 0x908e, 0x0014, 0x0110, 0x908e, 0x0010,
++	0x0005, 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0d84, 0x91b6, 0x0013,
++	0x1130, 0x2008, 0x91b2, 0x0040, 0x1a04, 0xbf24, 0x0092, 0x91b6,
++	0x0027, 0x0120, 0x91b6, 0x0014, 0x190c, 0x0d84, 0x2001, 0x0007,
++	0x080c, 0x5b8d, 0x080c, 0x8026, 0x080c, 0x9584, 0x080c, 0x8125,
++	0x0005, 0xbe59, 0xbe5b, 0xbe59, 0xbe59, 0xbe59, 0xbe5b, 0xbe6a,
++	0xbf1d, 0xbebc, 0xbf1d, 0xbece, 0xbf1d, 0xbe6a, 0xbf1d, 0xbf15,
++	0xbf1d, 0xbf15, 0xbf1d, 0xbf1d, 0xbe59, 0xbe59, 0xbe59, 0xbe59,
++	0xbe59, 0xbe59, 0xbe59, 0xbe59, 0xbe59, 0xbe59, 0xbe59, 0xbe5b,
++	0xbe59, 0xbf1d, 0xbe59, 0xbe59, 0xbf1d, 0xbe59, 0xbf1a, 0xbf1d,
++	0xbe59, 0xbe59, 0xbe59, 0xbe59, 0xbf1d, 0xbf1d, 0xbe59, 0xbf1d,
++	0xbf1d, 0xbe59, 0xbe65, 0xbe59, 0xbe59, 0xbe59, 0xbe59, 0xbf19,
++	0xbf1d, 0xbe59, 0xbe59, 0xbf1d, 0xbf1d, 0xbe59, 0xbe59, 0xbe59,
++	0xbe59, 0x080c, 0x0d84, 0x080c, 0x8026, 0x080c, 0xb76f, 0x6003,
++	0x0002, 0x080c, 0x8125, 0x0804, 0xbf23, 0x9006, 0x080c, 0x5b4d,
++	0x0804, 0xbf1d, 0x080c, 0x5f25, 0x1904, 0xbf1d, 0x9006, 0x080c,
++	0x5b4d, 0x6010, 0x2058, 0xb810, 0x9086, 0x00ff, 0x1140, 0x00f6,
++	0x2079, 0x1800, 0x78a0, 0x8000, 0x78a2, 0x00fe, 0x0428, 0x6010,
++	0x2058, 0xb8b0, 0x9005, 0x1178, 0x080c, 0xb759, 0x1904, 0xbf1d,
++	0x0036, 0x0046, 0xbba0, 0x2021, 0x0007, 0x080c, 0x44f9, 0x004e,
++	0x003e, 0x0804, 0xbf1d, 0x080c, 0x2e64, 0x1904, 0xbf1d, 0x2001,
++	0x1800, 0x2004, 0x9086, 0x0002, 0x1138, 0x00f6, 0x2079, 0x1800,
++	0x78a0, 0x8000, 0x78a2, 0x00fe, 0x2001, 0x0002, 0x080c, 0x5b61,
++	0x080c, 0x8026, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002,
++	0x080c, 0x7c1d, 0x080c, 0x8125, 0x6110, 0x2158, 0x2009, 0x0001,
++	0x080c, 0x7826, 0x0804, 0xbf23, 0x6610, 0x2658, 0xbe04, 0x96b4,
++	0xff00, 0x8637, 0x9686, 0x0006, 0x0904, 0xbf1d, 0x9686, 0x0004,
++	0x0904, 0xbf1d, 0x2001, 0x0004, 0x0804, 0xbf1b, 0x2001, 0x1800,
++	0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058,
++	0xbba0, 0x2021, 0x0006, 0x080c, 0x44f9, 0x004e, 0x003e, 0x2001,
++	0x0006, 0x080c, 0xbf41, 0x6610, 0x2658, 0xbe04, 0x0066, 0x96b4,
++	0xff00, 0x8637, 0x9686, 0x0006, 0x006e, 0x0168, 0x2001, 0x0006,
++	0x080c, 0x5b8d, 0x9284, 0x00ff, 0x908e, 0x0007, 0x1120, 0x2001,
++	0x0006, 0x080c, 0x5b61, 0x080c, 0x5f25, 0x11f8, 0x2001, 0x1836,
++	0x2004, 0xd0a4, 0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006,
++	0x01a0, 0x00f6, 0x2079, 0x1800, 0x78a0, 0x8000, 0x78a2, 0x00fe,
++	0x0804, 0xbea4, 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x0449,
++	0x0020, 0x0018, 0x0010, 0x080c, 0x5b8d, 0x080c, 0x8026, 0x080c,
++	0x9554, 0x080c, 0x8125, 0x0005, 0x2600, 0x0002, 0xbf38, 0xbf38,
++	0xbf38, 0xbf38, 0xbf38, 0xbf3a, 0xbf38, 0xbf38, 0xbf38, 0xbf38,
++	0xbf3a, 0xbf38, 0xbf38, 0xbf38, 0xbf3a, 0xbf3a, 0xbf3a, 0xbf3a,
++	0x080c, 0x0d84, 0x080c, 0x8026, 0x080c, 0x9554, 0x080c, 0x8125,
++	0x0005, 0x0016, 0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900, 0xd184,
++	0x0138, 0x080c, 0x5b61, 0x9006, 0x080c, 0x5b4d, 0x080c, 0x2d3f,
++	0x00de, 0x00be, 0x001e, 0x0005, 0x6610, 0x2658, 0xb804, 0x9084,
++	0xff00, 0x8007, 0x90b2, 0x000c, 0x1a0c, 0x0d84, 0x91b6, 0x0015,
++	0x1110, 0x003b, 0x0028, 0x91b6, 0x0016, 0x190c, 0x0d84, 0x006b,
++	0x0005, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, 0xbfb9,
++	0xbf81, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a,
++	0x9f7a, 0x9f7a, 0x9f7a, 0xbfb9, 0xbfc0, 0x9f7a, 0x9f7a, 0x9f7a,
++	0x9f7a, 0x00f6, 0x080c, 0x5f25, 0x11c0, 0x6010, 0x905d, 0x01a8,
++	0xb8b0, 0x9005, 0x0190, 0x9006, 0x080c, 0x5b4d, 0x2001, 0x0002,
++	0x080c, 0x5b61, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002,
++	0x080c, 0x7c1d, 0x080c, 0x8125, 0x00d0, 0x2011, 0x0263, 0x2204,
++	0x8211, 0x220c, 0x080c, 0x23fd, 0x1190, 0x080c, 0x5c0d, 0x0118,
++	0x080c, 0x9554, 0x0060, 0xb810, 0x0006, 0xb814, 0x0006, 0x080c,
++	0x56f3, 0x000e, 0xb816, 0x000e, 0xb812, 0x080c, 0x9554, 0x00fe,
++	0x0005, 0x6604, 0x96b6, 0x001e, 0x1110, 0x080c, 0x9554, 0x0005,
++	0x080c, 0xa2b9, 0x1148, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c,
++	0x7c1d, 0x080c, 0x8125, 0x0010, 0x080c, 0x9554, 0x0005, 0x6004,
++	0x908a, 0x0053, 0x1a0c, 0x0d84, 0x080c, 0x8026, 0x080c, 0x9584,
++	0x080c, 0x8125, 0x0005, 0x9182, 0x0040, 0x0002, 0xbff1, 0xbff1,
++	0xbff1, 0xbff1, 0xbff3, 0xbff1, 0xbff1, 0xbff1, 0xbff1, 0xbff1,
++	0xbff1, 0xbff1, 0xbff1, 0xbff1, 0xbff1, 0xbff1, 0xbff1, 0xbff1,
++	0xbff1, 0x080c, 0x0d84, 0x0096, 0x00b6, 0x00d6, 0x00e6, 0x00f6,
++	0x0046, 0x0026, 0x6210, 0x2258, 0xb8ac, 0x9005, 0x11a8, 0x6106,
++	0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, 0x0904, 0xc05a, 0x080c,
++	0xcccc, 0x1170, 0x9486, 0x2000, 0x1158, 0x2009, 0x0001, 0x2011,
++	0x0200, 0x080c, 0x7a0a, 0x0020, 0x9026, 0x080c, 0xcc03, 0x0c38,
++	0x080c, 0x0fae, 0x090c, 0x0d84, 0x6003, 0x0007, 0xa867, 0x010d,
++	0x9006, 0xa802, 0xa86a, 0xac8a, 0x2c00, 0xa88e, 0x6008, 0xa8e2,
++	0x6010, 0x2058, 0xb8a0, 0x7130, 0xa97a, 0x0016, 0xa876, 0xa87f,
++	0x0000, 0xa883, 0x0000, 0xa887, 0x0036, 0x080c, 0x61a9, 0x001e,
++	0x080c, 0xcccc, 0x1904, 0xc0ba, 0x9486, 0x2000, 0x1130, 0x2019,
++	0x0017, 0x080c, 0xc941, 0x0804, 0xc0ba, 0x9486, 0x0400, 0x1130,
++	0x2019, 0x0002, 0x080c, 0xc8f8, 0x0804, 0xc0ba, 0x9486, 0x0200,
++	0x1110, 0x080c, 0xc8dd, 0x9486, 0x1000, 0x1110, 0x080c, 0xc926,
++	0x0804, 0xc0ba, 0x2069, 0x1a3d, 0x6a00, 0xd284, 0x0904, 0xc124,
++	0x9284, 0x0300, 0x1904, 0xc11d, 0x6804, 0x9005, 0x0904, 0xc105,
++	0x2d78, 0x6003, 0x0007, 0x080c, 0x0fc7, 0x0904, 0xc0c6, 0x7800,
++	0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, 0x6017, 0x0000, 0x2001,
++	0x180e, 0x2004, 0xd084, 0x1904, 0xc128, 0x9006, 0xa802, 0xa867,
++	0x0116, 0xa86a, 0x6008, 0xa8e2, 0x2c00, 0xa87a, 0x6010, 0x2058,
++	0xb8a0, 0x7130, 0xa9b6, 0xa876, 0xb928, 0xa9ba, 0xb92c, 0xa9be,
++	0xb930, 0xa9c2, 0xb934, 0xa9c6, 0xa883, 0x003d, 0x7044, 0x9084,
++	0x0003, 0x9080, 0xc0c2, 0x2005, 0xa87e, 0x20a9, 0x000a, 0x2001,
++	0x0270, 0xaa5c, 0x9290, 0x0021, 0x2009, 0x0205, 0x200b, 0x0080,
++	0x20e1, 0x0000, 0xab60, 0x23e8, 0x2098, 0x22a0, 0x4003, 0x200b,
++	0x0000, 0x2001, 0x027a, 0x200c, 0xa9b2, 0x8000, 0x200c, 0xa9ae,
++	0x080c, 0x61a9, 0x002e, 0x004e, 0x00fe, 0x00ee, 0x00de, 0x00be,
++	0x009e, 0x0005, 0x0000, 0x0080, 0x0040, 0x0000, 0x2001, 0x180f,
++	0x2004, 0xd084, 0x0120, 0x080c, 0x0fae, 0x1904, 0xc06f, 0x6017,
++	0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x7bcb, 0x080c,
++	0x8125, 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084, 0xff00, 0x9086,
++	0x1200, 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016, 0x6114, 0x918c,
++	0xf700, 0x910d, 0x6116, 0x001e, 0x6003, 0x0001, 0x6007, 0x0043,
++	0x080c, 0x7bcb, 0x080c, 0x8125, 0x0828, 0x6868, 0x602e, 0x686c,
++	0x6032, 0x6017, 0xf200, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c,
++	0x7bcb, 0x080c, 0x8125, 0x0804, 0xc0ba, 0x2001, 0x180d, 0x2004,
++	0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x447f, 0x6017, 0xf300,
++	0x0010, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c,
++	0x7bcb, 0x080c, 0x8125, 0x0804, 0xc0ba, 0x6017, 0xf500, 0x0c98,
++	0x6017, 0xf600, 0x0804, 0xc0da, 0x6017, 0xf200, 0x0804, 0xc0da,
++	0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886, 0x2c00, 0xa87a,
++	0x7044, 0x9084, 0x0003, 0x9080, 0xc0c2, 0x2005, 0xa87e, 0x2928,
++	0x6010, 0x2058, 0xb8a0, 0xa876, 0xb828, 0xa88a, 0xb82c, 0xa88e,
++	0xb830, 0xa892, 0xb834, 0xa896, 0xa883, 0x003d, 0x2009, 0x0205,
++	0x2104, 0x9085, 0x0080, 0x200a, 0x20e1, 0x0000, 0x2011, 0x0210,
++	0x2214, 0x9294, 0x0fff, 0xaaa2, 0x9282, 0x0111, 0x1a0c, 0x0d84,
++	0x8210, 0x821c, 0x2001, 0x026c, 0x2098, 0xa860, 0x20e8, 0xa85c,
++	0x9080, 0x0029, 0x20a0, 0x2011, 0xc1a4, 0x2041, 0x0001, 0x223d,
++	0x9784, 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8, 0x4003, 0x931a,
++	0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a, 0x2001, 0x0260,
++	0x2098, 0x0c68, 0x2950, 0x080c, 0x0fc7, 0x0170, 0x2900, 0xb002,
++	0xa867, 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8, 0xa85c, 0x9080,
++	0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800, 0x902d, 0x0118,
++	0x080c, 0x0fe0, 0x0cc8, 0x080c, 0x0fe0, 0x0804, 0xc0c6, 0x2548,
++	0x8847, 0x9885, 0x0046, 0xa866, 0x2009, 0x0205, 0x200b, 0x0000,
++	0x080c, 0xc970, 0x0804, 0xc0ba, 0x8010, 0x0004, 0x801a, 0x0006,
++	0x8018, 0x0008, 0x8016, 0x000a, 0x8014, 0x9186, 0x0013, 0x1160,
++	0x6004, 0x908a, 0x0054, 0x1a0c, 0x0d84, 0x9082, 0x0040, 0x0a0c,
++	0x0d84, 0x2008, 0x0804, 0xc255, 0x9186, 0x0051, 0x0108, 0x00c0,
++	0x2001, 0x0109, 0x2004, 0xd084, 0x0904, 0xc206, 0x0126, 0x2091,
++	0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x7ab7, 0x002e, 0x001e,
++	0x000e, 0x012e, 0x6000, 0x9086, 0x0002, 0x1580, 0x0804, 0xc29d,
++	0x9186, 0x0027, 0x0530, 0x9186, 0x0048, 0x0128, 0x9186, 0x0014,
++	0x0500, 0x190c, 0x0d84, 0x2001, 0x0109, 0x2004, 0xd084, 0x01f0,
++	0x00c6, 0x0126, 0x2091, 0x2800, 0x00c6, 0x2061, 0x0100, 0x0006,
++	0x0016, 0x0026, 0x080c, 0x7ab7, 0x002e, 0x001e, 0x000e, 0x00ce,
++	0x012e, 0x00ce, 0x6000, 0x9086, 0x0004, 0x190c, 0x0d84, 0x0804,
++	0xc366, 0x6004, 0x9082, 0x0040, 0x2008, 0x001a, 0x080c, 0x95e9,
++	0x0005, 0xc21c, 0xc21e, 0xc21e, 0xc245, 0xc21c, 0xc21c, 0xc21c,
++	0xc21c, 0xc21c, 0xc21c, 0xc21c, 0xc21c, 0xc21c, 0xc21c, 0xc21c,
++	0xc21c, 0xc21c, 0xc21c, 0xc21c, 0x080c, 0x0d84, 0x080c, 0x8026,
++	0x080c, 0x8125, 0x0036, 0x0096, 0x6014, 0x904d, 0x01d8, 0x080c,
++	0xb0ad, 0x01c0, 0x6003, 0x0002, 0x6010, 0x00b6, 0x2058, 0xb800,
++	0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c, 0xc970, 0x6017,
++	0x0000, 0x6018, 0x9005, 0x1120, 0x2001, 0x1954, 0x2004, 0x601a,
++	0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x0096, 0x080c, 0x8026,
++	0x080c, 0x8125, 0x080c, 0xb0ad, 0x0120, 0x6014, 0x2048, 0x080c,
++	0x0fe0, 0x080c, 0x9584, 0x009e, 0x0005, 0x0002, 0xc269, 0xc280,
++	0xc26b, 0xc297, 0xc269, 0xc269, 0xc269, 0xc269, 0xc269, 0xc269,
++	0xc269, 0xc269, 0xc269, 0xc269, 0xc269, 0xc269, 0xc269, 0xc269,
++	0xc269, 0x080c, 0x0d84, 0x0096, 0x080c, 0x8026, 0x6014, 0x2048,
++	0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, 0x080c,
++	0x95ce, 0x0010, 0x6003, 0x0004, 0x080c, 0x8125, 0x009e, 0x0005,
++	0x080c, 0x8026, 0x080c, 0xb0ad, 0x0138, 0x6114, 0x0096, 0x2148,
++	0xa97c, 0x009e, 0xd1ec, 0x1138, 0x080c, 0x79df, 0x080c, 0x9554,
++	0x080c, 0x8125, 0x0005, 0x080c, 0xcbc7, 0x0db0, 0x0cc8, 0x080c,
++	0x8026, 0x2009, 0x0041, 0x0804, 0xc3ee, 0x9182, 0x0040, 0x0002,
++	0xc2b3, 0xc2b5, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3,
++	0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3,
++	0xc2b3, 0xc2b6, 0xc2b3, 0x080c, 0x0d84, 0x0005, 0x00d6, 0x080c,
++	0x79df, 0x00de, 0x080c, 0xcc1f, 0x080c, 0x9554, 0x0005, 0x9182,
++	0x0040, 0x0002, 0xc2d5, 0xc2d5, 0xc2d5, 0xc2d5, 0xc2d5, 0xc2d5,
++	0xc2d5, 0xc2d5, 0xc2d5, 0xc2d7, 0xc32e, 0xc2d5, 0xc2d5, 0xc2d5,
++	0xc2d5, 0xc32e, 0xc2d5, 0xc2d5, 0xc2d5, 0x080c, 0x0d84, 0x2001,
++	0x0105, 0x2004, 0x9084, 0x1800, 0x1904, 0xc32e, 0x2001, 0x1872,
++	0x2004, 0xd0e4, 0x1528, 0x603b, 0x0000, 0x080c, 0x80d6, 0x6014,
++	0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0188, 0x908c, 0x0003, 0x918e,
++	0x0002, 0x0508, 0x2001, 0x180c, 0x2004, 0xd0d4, 0x11e0, 0x080c,
++	0x8202, 0x2009, 0x0041, 0x009e, 0x0804, 0xc3ee, 0x080c, 0x8202,
++	0x6003, 0x0007, 0x601b, 0x0000, 0x080c, 0x79df, 0x009e, 0x0005,
++	0x2001, 0x0100, 0x2004, 0x9082, 0x0005, 0x0aa8, 0x2001, 0x011f,
++	0x2004, 0x603a, 0x0890, 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102,
++	0xd1cc, 0x0110, 0x080c, 0x2809, 0x080c, 0x8202, 0x6014, 0x2048,
++	0xa97c, 0xd1ec, 0x1130, 0x080c, 0x79df, 0x080c, 0x9554, 0x009e,
++	0x0005, 0x080c, 0xcbc7, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c,
++	0x200c, 0xc1d4, 0x2102, 0x0036, 0x080c, 0x80d6, 0x080c, 0x8202,
++	0x6014, 0x0096, 0x2048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be,
++	0xd0bc, 0x0188, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x0140,
++	0xa8ac, 0x6330, 0x931a, 0x6332, 0xa8b0, 0x632c, 0x931b, 0x632e,
++	0x6003, 0x0002, 0x0080, 0x2019, 0x0004, 0x080c, 0xc970, 0x6018,
++	0x9005, 0x1128, 0x2001, 0x1954, 0x2004, 0x8003, 0x601a, 0x6017,
++	0x0000, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040,
++	0x0002, 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37d,
++	0xc37d, 0xc37f, 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37d,
++	0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc3ca, 0x080c, 0x0d84, 0x6014,
++	0x0096, 0x2048, 0xa834, 0xaa38, 0x6110, 0x00b6, 0x2058, 0xb900,
++	0x00be, 0xd1bc, 0x1190, 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128,
++	0x2009, 0x0041, 0x00de, 0x0804, 0xc3ee, 0x6003, 0x0007, 0x601b,
++	0x0000, 0x080c, 0x79df, 0x009e, 0x0005, 0x6124, 0xd1f4, 0x1d58,
++	0x0006, 0x0046, 0xacac, 0x9422, 0xa9b0, 0x2200, 0x910b, 0x6030,
++	0x9420, 0x6432, 0x602c, 0x9109, 0x612e, 0x004e, 0x000e, 0x08d8,
++	0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc, 0x1178, 0x2009,
++	0x180d, 0x210c, 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003,
++	0x0006, 0x00e9, 0x080c, 0x79e1, 0x009e, 0x0005, 0x6003, 0x0002,
++	0x009e, 0x0005, 0x6024, 0xd0f4, 0x0128, 0x080c, 0x1489, 0x1904,
++	0xc37f, 0x0005, 0x6014, 0x0096, 0x2048, 0xa834, 0xa938, 0x009e,
++	0x9105, 0x1120, 0x080c, 0x1489, 0x1904, 0xc37f, 0x0005, 0xd2fc,
++	0x0140, 0x8002, 0x8000, 0x8212, 0x9291, 0x0000, 0x2009, 0x0009,
++	0x0010, 0x2009, 0x0015, 0xaa9a, 0xa896, 0x0005, 0x9182, 0x0040,
++	0x0208, 0x0062, 0x9186, 0x0013, 0x0120, 0x9186, 0x0014, 0x190c,
++	0x0d84, 0x6024, 0xd0dc, 0x090c, 0x0d84, 0x0005, 0xc411, 0xc418,
++	0xc424, 0xc430, 0xc411, 0xc411, 0xc411, 0xc411, 0xc411, 0xc413,
++	0xc413, 0xc411, 0xc411, 0xc411, 0xc411, 0xc413, 0xc411, 0xc413,
++	0xc411, 0x080c, 0x0d84, 0x6024, 0xd0dc, 0x090c, 0x0d84, 0x0005,
++	0x6003, 0x0001, 0x6106, 0x080c, 0x7bcb, 0x0126, 0x2091, 0x8000,
++	0x080c, 0x8125, 0x012e, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c,
++	0x7bcb, 0x0126, 0x2091, 0x8000, 0x080c, 0x8125, 0x012e, 0x0005,
++	0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, 0x18b7, 0x0126, 0x2091,
++	0x8000, 0x080c, 0x7c3a, 0x080c, 0x820b, 0x012e, 0x0005, 0x0126,
++	0x2091, 0x8000, 0x0036, 0x0096, 0x9182, 0x0040, 0x0023, 0x009e,
++	0x003e, 0x012e, 0x0005, 0xc45b, 0xc45d, 0xc46f, 0xc489, 0xc45b,
++	0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45b,
++	0xc45b, 0xc45b, 0xc45b, 0x080c, 0x0d84, 0x6014, 0x2048, 0xa87c,
++	0xd0fc, 0x01f8, 0x909c, 0x0003, 0x939e, 0x0003, 0x01d0, 0x6003,
++	0x0001, 0x6106, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x0470, 0x6014,
++	0x2048, 0xa87c, 0xd0fc, 0x0168, 0x909c, 0x0003, 0x939e, 0x0003,
++	0x0140, 0x6003, 0x0001, 0x6106, 0x080c, 0x7bcb, 0x080c, 0x8125,
++	0x00e0, 0x901e, 0x6316, 0x631a, 0x2019, 0x0004, 0x080c, 0xc970,
++	0x00a0, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003,
++	0x939e, 0x0003, 0x0d70, 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c,
++	0x18b7, 0x080c, 0x7c3a, 0x080c, 0x820b, 0x0005, 0x080c, 0x8026,
++	0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, 0xcc6b, 0x0036,
++	0x2019, 0x0029, 0x080c, 0xc970, 0x003e, 0x009e, 0x080c, 0x9584,
++	0x080c, 0x8125, 0x0005, 0x080c, 0x80d6, 0x6114, 0x81ff, 0x0158,
++	0x0096, 0x2148, 0x080c, 0xcc6b, 0x0036, 0x2019, 0x0029, 0x080c,
++	0xc970, 0x003e, 0x009e, 0x080c, 0x9584, 0x080c, 0x820b, 0x0005,
++	0x9182, 0x0085, 0x0002, 0xc4da, 0xc4d8, 0xc4d8, 0xc4e6, 0xc4d8,
++	0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8,
++	0x080c, 0x0d84, 0x6003, 0x000b, 0x6106, 0x080c, 0x7bcb, 0x0126,
++	0x2091, 0x8000, 0x080c, 0x8125, 0x012e, 0x0005, 0x0026, 0x00e6,
++	0x080c, 0xcbbe, 0x0118, 0x080c, 0x9554, 0x0440, 0x2071, 0x0260,
++	0x7224, 0x6216, 0x2001, 0x180d, 0x2004, 0xd0e4, 0x0150, 0x6010,
++	0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2011, 0x014e, 0x080c,
++	0x9844, 0x7220, 0x080c, 0xc816, 0x0118, 0x6007, 0x0086, 0x0040,
++	0x6007, 0x0087, 0x7224, 0x9296, 0xffff, 0x1110, 0x6007, 0x0086,
++	0x6003, 0x0001, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x00ee, 0x002e,
++	0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c,
++	0x0d84, 0x908a, 0x0092, 0x1a0c, 0x0d84, 0x9082, 0x0085, 0x00a2,
++	0x9186, 0x0027, 0x0130, 0x9186, 0x0014, 0x0118, 0x080c, 0x95e9,
++	0x0050, 0x2001, 0x0007, 0x080c, 0x5b8d, 0x080c, 0x8026, 0x080c,
++	0x9584, 0x080c, 0x8125, 0x0005, 0xc549, 0xc54b, 0xc54b, 0xc549,
++	0xc549, 0xc549, 0xc549, 0xc549, 0xc549, 0xc549, 0xc549, 0xc549,
++	0xc549, 0x080c, 0x0d84, 0x080c, 0x8026, 0x080c, 0x9584, 0x080c,
++	0x8125, 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0d84, 0x9182, 0x0092,
++	0x1a0c, 0x0d84, 0x9182, 0x0085, 0x0002, 0xc56a, 0xc56a, 0xc56a,
++	0xc56c, 0xc56a, 0xc56a, 0xc56a, 0xc56a, 0xc56a, 0xc56a, 0xc56a,
++	0xc56a, 0xc56a, 0x080c, 0x0d84, 0x0005, 0x9186, 0x0013, 0x0148,
++	0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0x95e9,
++	0x0030, 0x080c, 0x8026, 0x080c, 0x9584, 0x080c, 0x8125, 0x0005,
++	0x0036, 0x080c, 0xcc1f, 0x6043, 0x0000, 0x2019, 0x000b, 0x0031,
++	0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036,
++	0x2091, 0x8000, 0x0086, 0x2c40, 0x0096, 0x904e, 0x080c, 0x8ef6,
++	0x009e, 0x008e, 0x1550, 0x0076, 0x2c38, 0x080c, 0x8f9a, 0x007e,
++	0x1520, 0x6000, 0x9086, 0x0000, 0x0500, 0x6020, 0x9086, 0x0007,
++	0x01e0, 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xcc1f, 0x080c,
++	0xb76f, 0x080c, 0x17b0, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c,
++	0xb0ad, 0x0110, 0x080c, 0xc970, 0x009e, 0x6017, 0x0000, 0x080c,
++	0xcc1f, 0x6023, 0x0007, 0x080c, 0xb76f, 0x003e, 0x012e, 0x0005,
++	0x00f6, 0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260, 0x7938,
++	0x783c, 0x080c, 0x23fd, 0x15b8, 0x0016, 0x00c6, 0x080c, 0x5c0d,
++	0x1580, 0x001e, 0x00c6, 0x2160, 0x080c, 0xb76c, 0x00ce, 0x002e,
++	0x0026, 0x0016, 0x2019, 0x0029, 0x080c, 0x905b, 0x080c, 0x7d55,
++	0x0076, 0x903e, 0x080c, 0x7c4d, 0x007e, 0x001e, 0x0076, 0x903e,
++	0x080c, 0xc73e, 0x007e, 0x0026, 0xba04, 0x9294, 0xff00, 0x8217,
++	0x9286, 0x0006, 0x0118, 0x9286, 0x0004, 0x1118, 0xbaa0, 0x080c,
++	0x2dd3, 0x002e, 0x001e, 0x080c, 0x56f3, 0xbe12, 0xbd16, 0x9006,
++	0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, 0x00be, 0x00ce, 0x00fe,
++	0x0005, 0x00c6, 0x00d6, 0x00b6, 0x0016, 0x2009, 0x1822, 0x2104,
++	0x9086, 0x0074, 0x1904, 0xc66a, 0x2069, 0x0260, 0x6944, 0x9182,
++	0x0100, 0x06e0, 0x6940, 0x9184, 0x8000, 0x0904, 0xc667, 0x2001,
++	0x194b, 0x2004, 0x9005, 0x1140, 0x6010, 0x2058, 0xb8b0, 0x9005,
++	0x0118, 0x9184, 0x0800, 0x0598, 0x6948, 0x918a, 0x0001, 0x0648,
++	0x080c, 0xccd1, 0x0118, 0x6978, 0xd1fc, 0x11b8, 0x2009, 0x0205,
++	0x200b, 0x0001, 0x693c, 0x81ff, 0x1198, 0x6944, 0x9182, 0x0100,
++	0x02a8, 0x6940, 0x81ff, 0x1178, 0x6948, 0x918a, 0x0001, 0x0288,
++	0x6950, 0x918a, 0x0001, 0x0298, 0x00d0, 0x6017, 0x0100, 0x00a0,
++	0x6017, 0x0300, 0x0088, 0x6017, 0x0500, 0x0070, 0x6017, 0x0700,
++	0x0058, 0x6017, 0x0900, 0x0040, 0x6017, 0x0b00, 0x0028, 0x6017,
++	0x0f00, 0x0010, 0x6017, 0x2d00, 0x9085, 0x0001, 0x0008, 0x9006,
++	0x001e, 0x00be, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00b6, 0x0026,
++	0x0036, 0x0156, 0x6210, 0x2258, 0xbb04, 0x9394, 0x00ff, 0x9286,
++	0x0006, 0x0178, 0x9286, 0x0004, 0x0160, 0x9394, 0xff00, 0x8217,
++	0x9286, 0x0006, 0x0130, 0x9286, 0x0004, 0x0118, 0x080c, 0x5c1c,
++	0x04e0, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019,
++	0x000a, 0x080c, 0xa439, 0x009e, 0x1588, 0x2011, 0x027a, 0x20a9,
++	0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xa439, 0x009e,
++	0x1528, 0x0046, 0x0016, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x1853,
++	0x210c, 0xd1a4, 0x0138, 0x2009, 0x0029, 0x080c, 0xc9c5, 0xb800,
++	0xc0e5, 0xb802, 0x2019, 0x0029, 0x080c, 0x7d55, 0x0076, 0x2039,
++	0x0000, 0x080c, 0x7c4d, 0x2c08, 0x080c, 0xc73e, 0x007e, 0x2001,
++	0x0007, 0x080c, 0x5b8d, 0x001e, 0x004e, 0x9006, 0x015e, 0x003e,
++	0x002e, 0x00be, 0x00ce, 0x0005, 0x00d6, 0x2069, 0x026e, 0x6800,
++	0x9086, 0x0800, 0x0118, 0x6017, 0x0000, 0x0008, 0x9006, 0x00de,
++	0x0005, 0x00b6, 0x00f6, 0x0016, 0x0026, 0x0036, 0x0156, 0x2079,
++	0x026c, 0x7930, 0x7834, 0x080c, 0x23fd, 0x11d0, 0x080c, 0x5c0d,
++	0x11b8, 0x2011, 0x0270, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019,
++	0x000a, 0x080c, 0xa439, 0x009e, 0x1158, 0x2011, 0x0274, 0x20a9,
++	0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xa439, 0x009e,
++	0x015e, 0x003e, 0x002e, 0x001e, 0x00fe, 0x00be, 0x0005, 0x00b6,
++	0x0006, 0x0016, 0x0026, 0x0036, 0x0156, 0x2011, 0x0263, 0x2204,
++	0x8211, 0x220c, 0x080c, 0x23fd, 0x11d0, 0x080c, 0x5c0d, 0x11b8,
++	0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a,
++	0x080c, 0xa439, 0x009e, 0x1158, 0x2011, 0x027a, 0x20a9, 0x0004,
++	0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xa439, 0x009e, 0x015e,
++	0x003e, 0x002e, 0x001e, 0x000e, 0x00be, 0x0005, 0x00e6, 0x00c6,
++	0x0086, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0126, 0x2091,
++	0x8000, 0x2740, 0x2029, 0x19bd, 0x252c, 0x2021, 0x19c3, 0x2424,
++	0x2061, 0x1cd0, 0x2071, 0x1800, 0x764c, 0x706c, 0x81ff, 0x0150,
++	0x0006, 0x9186, 0x1a72, 0x000e, 0x0128, 0x8001, 0x9602, 0x1a04,
++	0xc7cf, 0x0018, 0x9606, 0x0904, 0xc7cf, 0x2100, 0x9c06, 0x0904,
++	0xc7c6, 0x080c, 0xca01, 0x1904, 0xc7c6, 0x080c, 0xccd8, 0x0904,
++	0xc7c6, 0x080c, 0xc9f1, 0x0904, 0xc7c6, 0x6720, 0x9786, 0x0001,
++	0x1148, 0x080c, 0x2e64, 0x0904, 0xc7ea, 0x6004, 0x9086, 0x0000,
++	0x1904, 0xc7ea, 0x9786, 0x0004, 0x0904, 0xc7ea, 0x9786, 0x0007,
++	0x05e8, 0x2500, 0x9c06, 0x05d0, 0x2400, 0x9c06, 0x05b8, 0x88ff,
++	0x0118, 0x6054, 0x9906, 0x1590, 0x0096, 0x6000, 0x9086, 0x0004,
++	0x1120, 0x0016, 0x080c, 0x17b0, 0x001e, 0x9786, 0x0008, 0x1148,
++	0x080c, 0xb295, 0x1130, 0x080c, 0x9e99, 0x009e, 0x080c, 0x9584,
++	0x00e8, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x01a8, 0x9786, 0x0003,
++	0x1540, 0x080c, 0xc810, 0x0110, 0xa867, 0x0103, 0xab7a, 0xa877,
++	0x0000, 0x080c, 0xcc6b, 0x0016, 0x080c, 0xb374, 0x080c, 0x619c,
++	0x001e, 0x080c, 0xb278, 0x009e, 0x080c, 0x9584, 0x9ce0, 0x0018,
++	0x2001, 0x1818, 0x2004, 0x9c02, 0x1210, 0x0804, 0xc752, 0x012e,
++	0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee,
++	0x0005, 0x9786, 0x0006, 0x1150, 0x9386, 0x0005, 0x0128, 0x080c,
++	0xcc6b, 0x080c, 0xc970, 0x08f8, 0x009e, 0x0c00, 0x9786, 0x000a,
++	0x0968, 0x0838, 0x81ff, 0x09d0, 0x9180, 0x0001, 0x2004, 0x9086,
++	0x0018, 0x0130, 0x9180, 0x0001, 0x2004, 0x9086, 0x002d, 0x1970,
++	0x6000, 0x9086, 0x0002, 0x1950, 0x080c, 0xb284, 0x0130, 0x080c,
++	0xb295, 0x1920, 0x080c, 0x9e99, 0x0038, 0x080c, 0x2d3f, 0x080c,
++	0xb295, 0x1110, 0x080c, 0x9e99, 0x080c, 0x9584, 0x0804, 0xc7c6,
++	0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x0005, 0x00c6, 0x00e6,
++	0x0016, 0x2c08, 0x2170, 0x9006, 0x080c, 0xc997, 0x001e, 0x0120,
++	0x6020, 0x9084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005, 0xc835,
++	0xc835, 0xc835, 0xc835, 0xc835, 0xc835, 0xc837, 0xc835, 0xc835,
++	0xc835, 0xc835, 0x9584, 0x9584, 0xc835, 0x9006, 0x0005, 0x0036,
++	0x0046, 0x0016, 0x7010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00,
++	0x2009, 0x0020, 0x080c, 0xc9c5, 0x001e, 0x004e, 0x2019, 0x0002,
++	0x080c, 0xc58e, 0x003e, 0x9085, 0x0001, 0x0005, 0x0096, 0x080c,
++	0xb0ad, 0x0140, 0x6014, 0x904d, 0x080c, 0xad1e, 0x687b, 0x0005,
++	0x080c, 0x61a9, 0x009e, 0x080c, 0x9584, 0x9085, 0x0001, 0x0005,
++	0x2001, 0x0001, 0x080c, 0x5b4d, 0x0156, 0x0016, 0x0026, 0x0036,
++	0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0276, 0x080c, 0xa425,
++	0x003e, 0x002e, 0x001e, 0x015e, 0x9005, 0x0005, 0x00f6, 0x00e6,
++	0x00c6, 0x0086, 0x0076, 0x0066, 0x00b6, 0x0126, 0x2091, 0x8000,
++	0x2740, 0x2061, 0x1cd0, 0x2079, 0x0001, 0x8fff, 0x0904, 0xc8d0,
++	0x2071, 0x1800, 0x764c, 0x706c, 0x8001, 0x9602, 0x1a04, 0xc8d0,
++	0x88ff, 0x0120, 0x2800, 0x9c06, 0x1590, 0x2078, 0x080c, 0xc9f1,
++	0x0570, 0x2400, 0x9c06, 0x0558, 0x6720, 0x9786, 0x0006, 0x1538,
++	0x9786, 0x0007, 0x0520, 0x88ff, 0x1140, 0x6010, 0x9b06, 0x11f8,
++	0x85ff, 0x0118, 0x6054, 0x9106, 0x11d0, 0x0096, 0x601c, 0xd084,
++	0x0140, 0x080c, 0xcc1f, 0x080c, 0xb76f, 0x080c, 0x17b0, 0x6023,
++	0x0007, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0120, 0x0046, 0x080c,
++	0xc970, 0x004e, 0x009e, 0x080c, 0x9584, 0x88ff, 0x1198, 0x9ce0,
++	0x0018, 0x2001, 0x1818, 0x2004, 0x9c02, 0x1210, 0x0804, 0xc885,
++	0x9006, 0x012e, 0x00be, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee,
++	0x00fe, 0x0005, 0x98c5, 0x0001, 0x0ca0, 0x00b6, 0x0076, 0x0056,
++	0x0086, 0x9046, 0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, 0x6210,
++	0x2258, 0x0096, 0x904e, 0x080c, 0x8ef6, 0x009e, 0x008e, 0x903e,
++	0x080c, 0x8f9a, 0x080c, 0xc876, 0x005e, 0x007e, 0x00be, 0x0005,
++	0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128,
++	0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c, 0x5c0d, 0x1190,
++	0x0056, 0x0086, 0x9046, 0x2508, 0x2029, 0x0001, 0x0096, 0x904e,
++	0x080c, 0x8ef6, 0x009e, 0x008e, 0x903e, 0x080c, 0x8f9a, 0x080c,
++	0xc876, 0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, 0xc903, 0x015e,
++	0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x0005, 0x00b6, 0x0076,
++	0x0056, 0x6210, 0x2258, 0x0086, 0x9046, 0x2029, 0x0001, 0x2019,
++	0x0048, 0x0096, 0x904e, 0x080c, 0x8ef6, 0x009e, 0x008e, 0x903e,
++	0x080c, 0x8f9a, 0x2c20, 0x080c, 0xc876, 0x005e, 0x007e, 0x00be,
++	0x0005, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20,
++	0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c, 0x5c0d, 0x11a0,
++	0x0086, 0x9046, 0x2828, 0x0046, 0x2021, 0x0001, 0x080c, 0xcc03,
++	0x004e, 0x0096, 0x904e, 0x080c, 0x8ef6, 0x009e, 0x008e, 0x903e,
++	0x080c, 0x8f9a, 0x080c, 0xc876, 0x003e, 0x001e, 0x8108, 0x1f04,
++	0xc94b, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x0005,
++	0x0016, 0x00f6, 0x080c, 0xb0ab, 0x0198, 0xa864, 0x9084, 0x00ff,
++	0x9086, 0x0046, 0x0180, 0xa800, 0x907d, 0x0138, 0xa803, 0x0000,
++	0xab82, 0x080c, 0x61a9, 0x2f48, 0x0cb0, 0xab82, 0x080c, 0x61a9,
++	0x00fe, 0x001e, 0x0005, 0xa800, 0x907d, 0x0130, 0xa803, 0x0000,
++	0x080c, 0x61a9, 0x2f48, 0x0cb8, 0x080c, 0x61a9, 0x0c88, 0x00e6,
++	0x0046, 0x0036, 0x2061, 0x1cd0, 0x9005, 0x1138, 0x2071, 0x1800,
++	0x744c, 0x706c, 0x8001, 0x9402, 0x12d8, 0x2100, 0x9c06, 0x0168,
++	0x6000, 0x9086, 0x0000, 0x0148, 0x6008, 0x9206, 0x1130, 0x6010,
++	0x91a0, 0x0004, 0x2424, 0x9406, 0x0140, 0x9ce0, 0x0018, 0x2001,
++	0x1818, 0x2004, 0x9c02, 0x1220, 0x0c40, 0x9085, 0x0001, 0x0008,
++	0x9006, 0x003e, 0x004e, 0x00ee, 0x0005, 0x0096, 0x0006, 0x080c,
++	0x0fae, 0x000e, 0x090c, 0x0d84, 0xa867, 0x010d, 0xa88e, 0x0026,
++	0x2010, 0x080c, 0xb09b, 0x2001, 0x0000, 0x0120, 0x2200, 0x9080,
++	0x0015, 0x2004, 0x002e, 0xa87a, 0xa986, 0xac76, 0xa87f, 0x0000,
++	0x2001, 0x195b, 0x2004, 0xa882, 0x9006, 0xa8e2, 0xa802, 0xa86a,
++	0xa88a, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, 0x012e, 0x009e,
++	0x0005, 0x6700, 0x9786, 0x0000, 0x0158, 0x9786, 0x0001, 0x0140,
++	0x9786, 0x000a, 0x0128, 0x9786, 0x0009, 0x0110, 0x9085, 0x0001,
++	0x0005, 0x00e6, 0x6010, 0x9075, 0x0138, 0x00b6, 0x2058, 0xb8a0,
++	0x00be, 0x9206, 0x00ee, 0x0005, 0x9085, 0x0001, 0x0cd8, 0x0016,
++	0x6004, 0x908e, 0x001e, 0x11a0, 0x8007, 0x6134, 0x918c, 0x00ff,
++	0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0005,
++	0x2001, 0x1954, 0x2004, 0x601a, 0x080c, 0x7bcb, 0x080c, 0x8125,
++	0x001e, 0x0005, 0xa001, 0xa001, 0x0005, 0x6024, 0xd0e4, 0x0158,
++	0xd0cc, 0x0118, 0x080c, 0xb3ae, 0x0030, 0x080c, 0xcc1f, 0x080c,
++	0x79df, 0x080c, 0x9554, 0x0005, 0x9280, 0x0008, 0x2004, 0x9084,
++	0x000f, 0x0002, 0xca50, 0xca50, 0xca50, 0xca52, 0xca50, 0xca52,
++	0xca52, 0xca50, 0xca52, 0xca50, 0xca50, 0xca50, 0xca50, 0xca50,
++	0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x9280, 0x0008, 0x2004,
++	0x9084, 0x000f, 0x0002, 0xca69, 0xca69, 0xca69, 0xca69, 0xca69,
++	0xca69, 0xca76, 0xca69, 0xca69, 0xca69, 0xca69, 0xca69, 0xca69,
++	0xca69, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003,
++	0x0001, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x0005, 0x0096, 0x00c6,
++	0x2260, 0x080c, 0xcc1f, 0x6043, 0x0000, 0x6024, 0xc0f4, 0xc0e4,
++	0x6026, 0x603b, 0x0000, 0x00ce, 0x00d6, 0x2268, 0x9186, 0x0007,
++	0x1904, 0xcad0, 0x6814, 0x9005, 0x0138, 0x2048, 0xa87c, 0xd0fc,
++	0x1118, 0x00de, 0x009e, 0x08a8, 0x6007, 0x003a, 0x6003, 0x0001,
++	0x080c, 0x7bcb, 0x080c, 0x8125, 0x00c6, 0x2d60, 0x6100, 0x9186,
++	0x0002, 0x1904, 0xcb48, 0x6014, 0x9005, 0x1138, 0x6000, 0x9086,
++	0x0007, 0x190c, 0x0d84, 0x0804, 0xcb48, 0x2048, 0x080c, 0xb0ad,
++	0x1130, 0x0028, 0x2048, 0xa800, 0x9005, 0x1de0, 0x2900, 0x2048,
++	0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x1170, 0xa87c, 0xc0dc,
++	0xc0f4, 0xa87e, 0xa880, 0xc0f4, 0xc0fc, 0xa882, 0x2009, 0x0043,
++	0x080c, 0xc3ee, 0x0804, 0xcb48, 0x2009, 0x0041, 0x0804, 0xcb42,
++	0x9186, 0x0005, 0x15a8, 0x6814, 0x2048, 0xa87c, 0xd0bc, 0x1120,
++	0x00de, 0x009e, 0x0804, 0xca69, 0xd0b4, 0x0128, 0xd0fc, 0x090c,
++	0x0d84, 0x0804, 0xca8a, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c,
++	0x7bcb, 0x080c, 0x8125, 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002,
++	0x0120, 0x9186, 0x0004, 0x1904, 0xcb48, 0x6814, 0x2048, 0xa97c,
++	0xc1f4, 0xc1dc, 0xa97e, 0xa980, 0xc1f4, 0xc1fc, 0xc1bc, 0xa982,
++	0x00f6, 0x2c78, 0x080c, 0x150d, 0x00fe, 0x2009, 0x0042, 0x04d0,
++	0x0036, 0x080c, 0x0fae, 0x090c, 0x0d84, 0xa867, 0x010d, 0x9006,
++	0xa802, 0xa86a, 0xa88a, 0x2d18, 0xab8e, 0xa887, 0x0045, 0x2c00,
++	0xa892, 0x6038, 0xa8a2, 0x2360, 0x6024, 0xc0dd, 0x6026, 0x6010,
++	0x00b6, 0x2058, 0xb8a0, 0x00be, 0x2004, 0x6354, 0xab7a, 0xa876,
++	0x9006, 0xa87e, 0xa882, 0xad9a, 0xae96, 0xa89f, 0x0001, 0x080c,
++	0x61a9, 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xc58e, 0x2d00,
++	0x600a, 0x6023, 0x0006, 0x6003, 0x0007, 0x901e, 0x631a, 0x6342,
++	0x003e, 0x0038, 0x6043, 0x0000, 0x6003, 0x0007, 0x080c, 0xc3ee,
++	0x00ce, 0x00de, 0x009e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004,
++	0x9082, 0x0085, 0x2008, 0x00c2, 0x9186, 0x0027, 0x1178, 0x080c,
++	0x8026, 0x0036, 0x0096, 0x6014, 0x2048, 0x2019, 0x0004, 0x080c,
++	0xc970, 0x009e, 0x003e, 0x080c, 0x8125, 0x0005, 0x9186, 0x0014,
++	0x0d70, 0x080c, 0x95e9, 0x0005, 0xcb7b, 0xcb79, 0xcb79, 0xcb79,
++	0xcb79, 0xcb79, 0xcb7b, 0xcb79, 0xcb79, 0xcb79, 0xcb79, 0xcb79,
++	0xcb79, 0x080c, 0x0d84, 0x080c, 0x8026, 0x6003, 0x000c, 0x080c,
++	0x8125, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208,
++	0x001a, 0x080c, 0x95e9, 0x0005, 0xcb99, 0xcb99, 0xcb99, 0xcb99,
++	0xcb9b, 0xcbbb, 0xcb99, 0xcb99, 0xcb99, 0xcb99, 0xcb99, 0xcb99,
++	0xcb99, 0x080c, 0x0d84, 0x00d6, 0x2c68, 0x080c, 0x94fe, 0x01b0,
++	0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0x026e, 0x210c, 0x613a,
++	0x2009, 0x026f, 0x210c, 0x613e, 0x600b, 0xffff, 0x6910, 0x6112,
++	0x6023, 0x0004, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x2d60, 0x080c,
++	0x9554, 0x00de, 0x0005, 0x080c, 0x9554, 0x0005, 0x00e6, 0x6010,
++	0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ec, 0x00ee, 0x0005, 0x2009,
++	0x1872, 0x210c, 0xd1ec, 0x05b0, 0x6003, 0x0002, 0x6024, 0xc0e5,
++	0x6026, 0xd0cc, 0x0150, 0x2001, 0x1955, 0x2004, 0x6042, 0x2009,
++	0x1872, 0x210c, 0xd1f4, 0x1520, 0x00a0, 0x2009, 0x1872, 0x210c,
++	0xd1f4, 0x0128, 0x6024, 0xc0e4, 0x6026, 0x9006, 0x00d8, 0x2001,
++	0x1955, 0x200c, 0x2001, 0x1953, 0x2004, 0x9100, 0x9080, 0x000a,
++	0x6042, 0x6010, 0x00b6, 0x2058, 0xb8ac, 0x00be, 0x0008, 0x2104,
++	0x9005, 0x0118, 0x9088, 0x0003, 0x0cd0, 0x2c0a, 0x600f, 0x0000,
++	0x9085, 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6, 0x6154, 0xb8ac,
++	0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, 0x6054, 0x9106, 0x1138,
++	0x600c, 0x2072, 0x080c, 0x79df, 0x080c, 0x9554, 0x0010, 0x9cf0,
++	0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce, 0x001e, 0x0005, 0x00d6,
++	0x00b6, 0x6010, 0x2058, 0xb8ac, 0x2068, 0x9005, 0x0130, 0x9c06,
++	0x0110, 0x680c, 0x0cd0, 0x600c, 0x680e, 0x00be, 0x00de, 0x0005,
++	0x0026, 0x0036, 0x0156, 0x2011, 0x182a, 0x2204, 0x9084, 0x00ff,
++	0x2019, 0x026e, 0x2334, 0x9636, 0x1508, 0x8318, 0x2334, 0x2204,
++	0x9084, 0xff00, 0x9636, 0x11d0, 0x2011, 0x0270, 0x20a9, 0x0004,
++	0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xa439, 0x009e,
++	0x1168, 0x2011, 0x0274, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048,
++	0x2019, 0x0006, 0x080c, 0xa439, 0x009e, 0x1100, 0x015e, 0x003e,
++	0x002e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5677, 0x080c,
++	0x2b1e, 0x00ee, 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800,
++	0x00be, 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005, 0xa880, 0xc0e5,
++	0xa882, 0x0005, 0x00e6, 0x00c6, 0x0076, 0x0066, 0x0056, 0x0046,
++	0x0026, 0x0016, 0x0126, 0x2091, 0x8000, 0x2029, 0x19bd, 0x252c,
++	0x2021, 0x19c3, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x764c,
++	0x706c, 0x9606, 0x0578, 0x6720, 0x9786, 0x0001, 0x0118, 0x9786,
++	0x0008, 0x1500, 0x2500, 0x9c06, 0x01e8, 0x2400, 0x9c06, 0x01d0,
++	0x080c, 0xc9f1, 0x01b8, 0x080c, 0xca01, 0x11a0, 0x6000, 0x9086,
++	0x0004, 0x1120, 0x0016, 0x080c, 0x17b0, 0x001e, 0x080c, 0xb284,
++	0x1110, 0x080c, 0x2d3f, 0x080c, 0xb295, 0x1110, 0x080c, 0x9e99,
++	0x080c, 0x9584, 0x9ce0, 0x0018, 0x2001, 0x1818, 0x2004, 0x9c02,
++	0x1208, 0x0858, 0x012e, 0x001e, 0x002e, 0x004e, 0x005e, 0x006e,
++	0x007e, 0x00ce, 0x00ee, 0x0005, 0x2001, 0x180f, 0x2004, 0xd0dc,
++	0x0005, 0x0006, 0x2001, 0x1836, 0x2004, 0xd09c, 0x000e, 0x0005,
++	0x6004, 0x9086, 0x0001, 0x1128, 0x080c, 0x905b, 0x080c, 0x9584,
++	0x9006, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, 0x8000,
++	0x2071, 0x1840, 0xd5a4, 0x0118, 0x7034, 0x8000, 0x7036, 0xd5b4,
++	0x0118, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0178, 0x2500, 0x9084,
++	0x0007, 0x908e, 0x0003, 0x0148, 0x908e, 0x0004, 0x0130, 0x908e,
++	0x0005, 0x0118, 0x2071, 0x184a, 0x0089, 0x001e, 0x00ee, 0x000e,
++	0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071,
++	0x1842, 0x0021, 0x00ee, 0x000e, 0x012e, 0x0005, 0x2e04, 0x8000,
++	0x2072, 0x1220, 0x8e70, 0x2e04, 0x8000, 0x2072, 0x0005, 0x00e6,
++	0x2071, 0x1840, 0x0c99, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1844,
++	0x0c69, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000,
++	0x2071, 0x1840, 0x7044, 0x8000, 0x7046, 0x00ee, 0x000e, 0x012e,
++	0x0005, 0x0002, 0x0003, 0x03d6, 0x0000, 0x8064, 0x0008, 0x0010,
++	0x0000, 0x8066, 0x0000, 0x0101, 0x0008, 0x4406, 0x000b, 0x8060,
++	0x0000, 0x0400, 0x0000, 0x580c, 0x0003, 0x7934, 0x000b, 0x5090,
++	0x000b, 0x4c09, 0x0003, 0xbac0, 0x0009, 0x0082, 0x0008, 0x0c09,
++	0x000b, 0x15fe, 0x0008, 0x3409, 0x0003, 0x808c, 0x0008, 0x0001,
++	0x0000, 0x0000, 0x0007, 0x4047, 0x000a, 0x808c, 0x0008, 0x0002,
++	0x0000, 0x081b, 0x0003, 0x4022, 0x0000, 0x001c, 0x0003, 0x4122,
++	0x0008, 0x4447, 0x0002, 0x0de7, 0x0003, 0x0bfe, 0x0008, 0x11a0,
++	0x0001, 0x11c9, 0x000b, 0x0ca0, 0x0001, 0x11c9, 0x000b, 0x9180,
++	0x0001, 0x0004, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62,
++	0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x442a, 0x0003, 0x808c,
++	0x0008, 0x0000, 0x0008, 0x0060, 0x0008, 0x8062, 0x0008, 0x0004,
++	0x0000, 0x8066, 0x0000, 0x0411, 0x0000, 0x4432, 0x0003, 0x03fe,
++	0x0000, 0x43e0, 0x0001, 0x0dc6, 0x0003, 0xc2c0, 0x0009, 0x00ff,
++	0x0008, 0x02e0, 0x0001, 0x0dc6, 0x0003, 0x9180, 0x0001, 0x0005,
++	0x0008, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066,
++	0x0000, 0x0019, 0x0000, 0x4441, 0x000b, 0x0240, 0x0002, 0x09c3,
++	0x000b, 0x00fe, 0x0000, 0x31c6, 0x0003, 0x112a, 0x0000, 0x002e,
++	0x0008, 0x022c, 0x0008, 0x3a44, 0x0002, 0x0c09, 0x000b, 0x808c,
++	0x0008, 0x0002, 0x0000, 0x1760, 0x0008, 0x8062, 0x0008, 0x000f,
++	0x0008, 0x8066, 0x0000, 0x0011, 0x0008, 0x4452, 0x0003, 0x01fe,
++	0x0008, 0x42e0, 0x0009, 0x0db9, 0x000b, 0x00fe, 0x0000, 0x43e0,
++	0x0001, 0x0db9, 0x000b, 0x1734, 0x0000, 0x1530, 0x0000, 0x1632,
++	0x0008, 0x0d2a, 0x0008, 0x9880, 0x0001, 0x0010, 0x0000, 0x8060,
++	0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x1e0a,
++	0x0008, 0x4464, 0x0003, 0x808a, 0x0008, 0x0003, 0x0008, 0x1a60,
++	0x0000, 0x8062, 0x0008, 0x0002, 0x0000, 0x586a, 0x0003, 0x8066,
++	0x0000, 0x3679, 0x0000, 0x446d, 0x0003, 0x586e, 0x000b, 0x8054,
++	0x0008, 0x0011, 0x0008, 0x8074, 0x0000, 0x1010, 0x0008, 0x1efe,
++	0x0000, 0x3009, 0x000b, 0x0077, 0x0004, 0x0009, 0x000b, 0x1c60,
++	0x0000, 0x1b62, 0x0000, 0x8066, 0x0000, 0x0231, 0x0008, 0x447b,
++	0x000b, 0x587c, 0x000b, 0x0140, 0x0008, 0x0242, 0x0000, 0x1f43,
++	0x0002, 0x0c86, 0x0003, 0x0d44, 0x0000, 0x0d46, 0x0008, 0x0348,
++	0x0008, 0x044a, 0x0008, 0x008a, 0x0003, 0x0344, 0x0008, 0x0446,
++	0x0008, 0x0548, 0x0008, 0x064a, 0x0000, 0x588a, 0x000b, 0x8054,
++	0x0008, 0x0001, 0x0000, 0x8074, 0x0000, 0x2020, 0x0008, 0x4000,
++	0x000f, 0x3a40, 0x000a, 0x0c0c, 0x000b, 0x2b24, 0x0008, 0x2b24,
++	0x0008, 0x5894, 0x000b, 0x8054, 0x0008, 0x0002, 0x0000, 0x1242,
++	0x0002, 0x08d8, 0x0003, 0x3a45, 0x000a, 0x08c9, 0x0003, 0x1e10,
++	0x000a, 0x7f3c, 0x0000, 0x08c6, 0x0003, 0x1d00, 0x0002, 0x7f3a,
++	0x0000, 0x0d60, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009,
++	0x0008, 0x44a4, 0x0003, 0x00fe, 0x0000, 0x34c3, 0x0003, 0x1c60,
++	0x0000, 0x8062, 0x0008, 0x0001, 0x0000, 0x8066, 0x0000, 0x0009,
++	0x0008, 0x44ac, 0x000b, 0x00fe, 0x0000, 0x31a2, 0x000b, 0x0038,
++	0x0000, 0x0060, 0x0008, 0x8062, 0x0008, 0x0019, 0x0000, 0x8066,
++	0x0000, 0x0009, 0x0008, 0x44b5, 0x0003, 0x80c0, 0x0009, 0x00ff,
++	0x0008, 0x7f3e, 0x0008, 0x0d60, 0x0000, 0x0efe, 0x0008, 0x1f80,
++	0x0001, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x44bf,
++	0x0003, 0x003a, 0x0008, 0x1dfe, 0x0000, 0x00a0, 0x000b, 0x0036,
++	0x0008, 0x0077, 0x0004, 0x00d8, 0x000b, 0x8074, 0x0000, 0x2000,
++	0x0000, 0x00d8, 0x000b, 0x3a44, 0x0002, 0x09cc, 0x000b, 0x8074,
++	0x0000, 0x1000, 0x0000, 0x2d0e, 0x0000, 0x2d0e, 0x0000, 0x35a2,
++	0x0003, 0x26fe, 0x0008, 0x26fe, 0x0008, 0x2700, 0x0008, 0x2700,
++	0x0008, 0x00d0, 0x0009, 0x0ce6, 0x0003, 0x8074, 0x0000, 0x4040,
++	0x0008, 0x58d8, 0x0003, 0x5090, 0x000b, 0x3a46, 0x000a, 0x0ce6,
++	0x0003, 0x3a47, 0x0002, 0x08e3, 0x000b, 0x8054, 0x0008, 0x0004,
++	0x0000, 0x8074, 0x0000, 0x8000, 0x0000, 0x0127, 0x0003, 0x92c0,
++	0x0009, 0x0f88, 0x0008, 0x0809, 0x0003, 0x1a60, 0x0000, 0x8062,
++	0x0008, 0x0002, 0x0000, 0x8066, 0x0000, 0x362a, 0x0000, 0x44eb,
++	0x000b, 0x2000, 0x0000, 0x2000, 0x0000, 0x2102, 0x0000, 0x2102,
++	0x0000, 0x2204, 0x0000, 0x2204, 0x0000, 0x2306, 0x0000, 0x2306,
++	0x0000, 0x2408, 0x0000, 0x2408, 0x0000, 0x250a, 0x0000, 0x250a,
++	0x0000, 0x260c, 0x0000, 0x260c, 0x0000, 0x270e, 0x0000, 0x270e,
++	0x0000, 0x2810, 0x0000, 0x2810, 0x0000, 0x2912, 0x0000, 0x2912,
++	0x0000, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0007, 0x0000, 0x8066,
++	0x0000, 0x0052, 0x0000, 0x4505, 0x0003, 0x92c0, 0x0009, 0x0780,
++	0x0008, 0x0db3, 0x000b, 0x124b, 0x0002, 0x090e, 0x0003, 0x2e4d,
++	0x0002, 0x2e4d, 0x0002, 0x09a2, 0x0003, 0x3a46, 0x000a, 0x0d1b,
++	0x0003, 0x5910, 0x0003, 0x8054, 0x0008, 0x0004, 0x0000, 0x1243,
++	0x000a, 0x0925, 0x0003, 0x8010, 0x0008, 0x000d, 0x0000, 0x0193,
++	0x000c, 0x1810, 0x0000, 0x0193, 0x000c, 0x0125, 0x000b, 0x194d,
++	0x000a, 0x091f, 0x0003, 0x1243, 0x000a, 0x09a9, 0x000b, 0x591f,
++	0x0003, 0x8054, 0x0008, 0x0004, 0x0000, 0x0188, 0x000c, 0x1810,
++	0x0000, 0x0193, 0x000c, 0x8074, 0x0000, 0xf000, 0x0008, 0x3a42,
++	0x0002, 0x0d2d, 0x0003, 0x15fe, 0x0008, 0x344b, 0x0003, 0x0d30,
++	0x0000, 0x0009, 0x000b, 0x0d30, 0x0000, 0x8074, 0x0000, 0x0501,
++	0x0000, 0x8010, 0x0008, 0x000c, 0x0008, 0x0193, 0x000c, 0x0009,
++	0x000b, 0xbbe0, 0x0009, 0x0030, 0x0008, 0x0d44, 0x0003, 0x18fe,
++	0x0000, 0x3ce0, 0x0009, 0x0941, 0x000b, 0x15fe, 0x0008, 0x3ce0,
++	0x0009, 0x0941, 0x000b, 0x0183, 0x0004, 0x8076, 0x0008, 0x0040,
++	0x0000, 0x0180, 0x000b, 0x8076, 0x0008, 0x0041, 0x0008, 0x0180,
++	0x000b, 0xbbe0, 0x0009, 0x0032, 0x0000, 0x0d49, 0x000b, 0x3c1e,
++	0x0008, 0x0180, 0x000b, 0xbbe0, 0x0009, 0x0037, 0x0000, 0x0d65,
++	0x0003, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x0d41, 0x0003, 0x1a60,
++	0x0000, 0x8062, 0x0008, 0x000d, 0x0000, 0x2604, 0x0008, 0x2604,
++	0x0008, 0x2706, 0x0008, 0x2706, 0x0008, 0x2808, 0x0000, 0x2808,
++	0x0000, 0x290a, 0x0000, 0x290a, 0x0000, 0x8066, 0x0000, 0x0422,
++	0x0000, 0x455c, 0x0003, 0x0188, 0x000c, 0x8054, 0x0008, 0x0004,
++	0x0000, 0x8074, 0x0000, 0xf000, 0x0008, 0x8072, 0x0000, 0x8000,
++	0x0000, 0x0127, 0x0003, 0xbbe0, 0x0009, 0x0038, 0x0000, 0x0d77,
++	0x0003, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x0974, 0x000b, 0x15fe,
++	0x0008, 0x3ce0, 0x0009, 0x0d3d, 0x000b, 0x0183, 0x0004, 0x8076,
++	0x0008, 0x0040, 0x0000, 0x8072, 0x0000, 0x8000, 0x0000, 0x01c3,
++	0x0003, 0x8076, 0x0008, 0x0042, 0x0008, 0x0180, 0x000b, 0xbbe0,
++	0x0009, 0x0016, 0x0000, 0x0d80, 0x000b, 0x3a44, 0x0002, 0x0c0b,
++	0x0003, 0x8072, 0x0000, 0x8000, 0x0000, 0x8000, 0x000f, 0x0009,
++	0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x0009, 0x000b, 0x3d30,
++	0x000a, 0x7f00, 0x0000, 0xbc80, 0x0001, 0x0007, 0x0000, 0x018c,
++	0x000b, 0x1930, 0x000a, 0x7f00, 0x0000, 0x9880, 0x0001, 0x0007,
++	0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066,
++	0x0000, 0x000a, 0x0008, 0x4591, 0x000b, 0x4000, 0x000f, 0x2193,
++	0x000b, 0x0870, 0x0008, 0x4000, 0x000f, 0xbac0, 0x0009, 0x0090,
++	0x0008, 0x099c, 0x000b, 0x8074, 0x0000, 0x0706, 0x0000, 0x019e,
++	0x000b, 0x8074, 0x0000, 0x0703, 0x0000, 0x4000, 0x000f, 0x8010,
++	0x0008, 0x0008, 0x0000, 0x01d1, 0x0003, 0x0188, 0x000c, 0x8010,
++	0x0008, 0x0007, 0x0000, 0x0193, 0x000c, 0x1810, 0x0000, 0x0193,
++	0x000c, 0x01db, 0x0003, 0x0188, 0x000c, 0x8010, 0x0008, 0x001b,
++	0x0008, 0x0193, 0x000c, 0x1810, 0x0000, 0x0193, 0x000c, 0x8074,
++	0x0000, 0xf080, 0x0000, 0x0d30, 0x0000, 0x0009, 0x000b, 0x8010,
++	0x0008, 0x0009, 0x0008, 0x01d1, 0x0003, 0x8010, 0x0008, 0x0005,
++	0x0008, 0x01d1, 0x0003, 0x808c, 0x0008, 0x0001, 0x0000, 0x8010,
++	0x0008, 0x0004, 0x0000, 0x4143, 0x000a, 0x0859, 0x0003, 0x3a44,
++	0x0002, 0x0c09, 0x000b, 0x0d2a, 0x0008, 0x01d1, 0x0003, 0x8010,
++	0x0008, 0x0003, 0x0008, 0x01d3, 0x000b, 0x8010, 0x0008, 0x000b,
++	0x0000, 0x01d3, 0x000b, 0x8010, 0x0008, 0x0002, 0x0000, 0x01d3,
++	0x000b, 0x3a47, 0x0002, 0x0cd8, 0x000b, 0x8010, 0x0008, 0x0006,
++	0x0008, 0x01d3, 0x000b, 0x8074, 0x0000, 0xf000, 0x0008, 0x0193,
++	0x000c, 0x0196, 0x000c, 0x3a40, 0x000a, 0x0809, 0x0003, 0x8010,
++	0x0008, 0x000c, 0x0008, 0x0193, 0x000c, 0x0009, 0x000b, 0x8074,
++	0x0000, 0xf080, 0x0000, 0x0d30, 0x0000, 0x2e4d, 0x0002, 0x2e4d,
++	0x0002, 0x09e4, 0x000b, 0x8054, 0x0008, 0x0019, 0x0000, 0x0009,
++	0x000b, 0x8054, 0x0008, 0x0009, 0x0008, 0x0009, 0x000b, 0x3a44,
++	0x0002, 0x0c09, 0x000b, 0x01c6, 0x0003, 0xc993, 0xf609, 0x0001,
++	0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100,
++	0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0xd29e
++};
++#ifdef UNIQUE_FW_NAME
++unsigned short fw2300tpx_length01 = 0xc920;
++#else
++unsigned short risc_code_length01 = 0xc920;
++#endif
++
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_cfg.c	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,2780 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++/*
++ * QLogic ISP2x00 Multi-path LUN Support Driver
++ *
++ */
++
++#include "qla_os.h"
++#include "qla_def.h"
++
++#include "qlfo.h"
++
++/*
++ *  Local Function Prototypes.
++ */
++
++static uint32_t qla2x00_add_portname_to_mp_dev(mp_device_t *, uint8_t *);
++
++static mp_device_t * qla2x00_allocate_mp_dev(uint8_t *, uint8_t *);
++static mp_path_t * qla2x00_allocate_path(mp_host_t *, uint16_t, fc_port_t *,
++    uint16_t);
++static mp_path_list_t * qla2x00_allocate_path_list(void);
++
++static mp_host_t * qla2x00_find_host_by_name(uint8_t *);
++
++static mp_device_t * qla2x00_find_or_allocate_mp_dev (mp_host_t *, uint16_t,
++    fc_port_t *);
++static mp_path_t * qla2x00_find_or_allocate_path(mp_host_t *, mp_device_t *,
++    uint16_t, fc_port_t *);
++
++static uint32_t qla2x00_cfg_register_failover_lun(mp_device_t *,srb_t *,
++    fc_lun_t *);
++static uint32_t qla2x00_send_failover_notify(mp_device_t *, uint8_t,
++    mp_path_t *, mp_path_t *);
++static mp_path_t * qla2x00_select_next_path(mp_host_t *, mp_device_t *,
++    uint8_t);
++
++static uint8_t qla2x00_update_mp_host(mp_host_t  *);
++static uint32_t qla2x00_update_mp_tree (void);
++
++static fc_lun_t *qla2x00_find_matching_lun(uint8_t , mp_path_t *);
++static mp_path_t *qla2x00_find_path_by_id(mp_device_t *, uint8_t);
++static mp_device_t *qla2x00_find_mp_dev_by_id(mp_host_t *, uint8_t);
++static mp_device_t *qla2x00_find_mp_dev_by_name(mp_host_t *, uint8_t *);
++
++static mp_path_t *qla2x00_get_visible_path(mp_device_t *dp);
++static void qla2x00_map_os_targets(mp_host_t *);
++static void qla2x00_map_os_luns(mp_host_t *, mp_device_t *, uint16_t);
++static uint8_t qla2x00_map_a_oslun(mp_host_t *, mp_device_t *, uint16_t, uint16_t);
++
++static uint8_t qla2x00_is_ww_name_zero(uint8_t *);
++static void qla2x00_add_path(mp_path_list_t *, mp_path_t *);
++static void qla2x00_failback_single_lun(mp_device_t *, uint8_t, uint8_t);
++static void qla2x00_failback_luns(mp_host_t *);
++static void qla2x00_setup_new_path(mp_device_t *, mp_path_t *);
++
++/*
++ * Global data items
++ */
++mp_host_t  *mp_hosts_base = NULL;
++uint8_t   mp_config_required = FALSE;
++static int    mp_num_hosts = 0;
++static uint8_t   mp_initialized = FALSE;
++
++
++/*
++ * ENTRY ROUTINES
++ */
++
++/*
++ * qla2x00_cfg_init
++ *      Initialize configuration structures to handle an instance of
++ *      an HBA, QLA2x000 card.
++ *
++ * Input:
++ *      ha = adapter state pointer.
++ *
++ * Returns:
++ *      qla2x00 local function return status code.
++ *
++ * Context:
++ *      Kernel context.
++ */
++int
++qla2x00_cfg_init(scsi_qla_host_t *ha)
++{
++	int	rval;
++
++	ENTER("qla2x00_cfg_init");
++	set_bit(CFG_ACTIVE, &ha->cfg_flags);
++	if (!mp_initialized) {
++		/* First HBA, initialize the failover global properties */
++		qla2x00_fo_init_params(ha);
++
++		/* If the user specified a device configuration then
++		 * it is use as the configuration. Otherwise, we wait
++		 * for path discovery.
++		 */
++		if ( mp_config_required )
++			qla2x00_cfg_build_path_tree(ha);
++	}
++	rval = qla2x00_cfg_path_discovery(ha);
++	clear_bit(CFG_ACTIVE, &ha->cfg_flags);
++	LEAVE("qla2x00_cfg_init");
++	return rval;
++}
++
++/*
++ * qla2x00_cfg_path_discovery
++ *      Discover the path configuration from the device configuration
++ *      for the specified host adapter and build the path search tree.
++ *      This function is called after the lower level driver has
++ *      completed its port and lun discovery.
++ *
++ * Input:
++ *      ha = adapter state pointer.
++ *
++ * Returns:
++ *      qla2x00 local function return status code.
++ *
++ * Context:
++ *      Kernel context.
++ */
++int
++qla2x00_cfg_path_discovery(scsi_qla_host_t *ha)
++{
++	int		rval = QLA2X00_SUCCESS;
++	mp_host_t	*host;
++	uint8_t		*name;
++
++	ENTER("qla2x00_cfg_path_discovery");
++
++	name = 	&ha->init_cb->node_name[0];
++
++	set_bit(CFG_ACTIVE, &ha->cfg_flags);
++	/* Initialize the path tree for this adapter */
++	host = qla2x00_find_host_by_name(name);
++	if ( mp_config_required ) {
++		if (host == NULL ) {
++			DEBUG4(printk("cfg_path_discovery: host not found, "
++				"node name = "
++				"%02x%02x%02x%02x%02x%02x%02x%02x\n",
++				name[0], name[1], name[2], name[3],
++				name[4], name[5], name[6], name[7]);)
++			rval = QLA2X00_FUNCTION_FAILED;
++		} else if (ha->instance != host->instance) {
++			DEBUG4(printk("cfg_path_discovery: host instance "
++				"don't match - instance=%ld.\n",
++				ha->instance);)
++			rval = QLA2X00_FUNCTION_FAILED;
++		}
++	} else if ( host == NULL ) {
++		/* New host adapter so allocate it */
++		if ( (host = qla2x00_alloc_host(ha)) == NULL ) {
++			printk(KERN_INFO
++				"qla2x00(%d): Couldn't allocate "
++				"host - ha = %p.\n",
++				(int)ha->instance, ha);
++			rval = QLA2X00_FUNCTION_FAILED;
++		}
++	}
++
++	/* Fill in information about host */
++	if (host != NULL ) {
++		host->flags |= MP_HOST_FLAG_NEEDS_UPDATE;
++		host->flags |= MP_HOST_FLAG_LUN_FO_ENABLED;
++		host->fcports = &ha->fcports;
++
++		/* Check if multipath is enabled */
++		if (!qla2x00_update_mp_host(host)) {
++			rval = QLA2X00_FUNCTION_FAILED;
++		}
++		host->flags &= ~MP_HOST_FLAG_LUN_FO_ENABLED;
++	}
++
++	if (rval != QLA2X00_SUCCESS) {
++		/* EMPTY */
++		DEBUG4(printk("qla2x00_path_discovery: Exiting FAILED\n");)
++	} else {
++		LEAVE("qla2x00_cfg_path_discovery");
++	}
++	clear_bit(CFG_ACTIVE, &ha->cfg_flags);
++
++	return rval;
++}
++
++/*
++ * qla2x00_cfg_event_notifiy
++ *      Callback for host driver to notify us of configuration changes.
++ *
++ * Input:
++ *      ha = adapter state pointer.
++ *      i_type = event type
++ *
++ * Returns:
++ *
++ * Context:
++ *      Kernel context.
++ */
++int
++qla2x00_cfg_event_notify(scsi_qla_host_t *ha, uint32_t i_type)
++{
++	mp_host_t	*host;			/* host adapter pointer */
++
++	ENTER("qla2x00_cfg_event_notify");
++
++	set_bit(CFG_ACTIVE, &ha->cfg_flags);
++	switch (i_type) {
++		case MP_NOTIFY_RESET_DETECTED:
++			DEBUG(printk("scsi%ld: MP_NOTIFY_RESET_DETECTED "
++					"- no action\n",
++					ha->host_no);)
++				break;
++		case MP_NOTIFY_PWR_LOSS:
++			DEBUG(printk("scsi%ld: MP_NOTIFY_PWR_LOSS - "
++					"update tree\n",
++					ha->host_no);)
++			/*
++			 * Update our path tree in case we are
++			 * losing the adapter
++			 */
++			qla2x00_update_mp_tree();
++			/* Free our resources for adapter */
++			break;
++		case MP_NOTIFY_LOOP_UP:
++			DEBUG(printk("scsi%ld: MP_NOTIFY_LOOP_UP - "
++					"update host tree\n",
++					ha->host_no);)
++			/* Adapter is back up with new configuration */
++			if ((host = qla2x00_cfg_find_host(ha)) != NULL) {
++				host->flags |= MP_HOST_FLAG_NEEDS_UPDATE;
++				host->fcports = &ha->fcports;
++				qla2x00_update_mp_tree();
++			}
++			break;
++		case MP_NOTIFY_LOOP_DOWN:
++		case MP_NOTIFY_BUS_RESET:
++			DEBUG(printk("scsi%ld: MP_NOTIFY_OTHERS - "
++					"no action\n",
++					ha->host_no);)
++			break;
++		default:
++			break;
++
++	}
++	clear_bit(CFG_ACTIVE, &ha->cfg_flags);
++
++	LEAVE("qla2x00_cfg_event_notify");
++
++	return QLA2X00_SUCCESS;
++}
++
++/*
++ * qla2x00_cfg_failover
++ *      A problem has been detected with the current path for this
++ *      lun.  Select the next available path as the current path
++ *      for this device.
++ *
++ * Inputs:
++ *      ha = pointer to host adapter
++ *      fp - pointer to failed fc_lun (failback lun)
++ *      tgt - pointer to target
++ *
++ * Returns:
++ *      pointer to new fc_lun_t, or NULL if failover fails.
++ */
++fc_lun_t *
++qla2x00_cfg_failover(scsi_qla_host_t *ha, fc_lun_t *fp,
++    os_tgt_t *tgt, srb_t *sp)
++{
++	mp_host_t	*host;			/* host adapter pointer */
++	mp_device_t	*dp;			/* virtual device pointer */
++	mp_path_t	*new_path;		/* new path pointer */
++	fc_lun_t	*new_fp = NULL;
++
++	ENTER("qla2x00_cfg_failover");
++	set_bit(CFG_ACTIVE, &ha->cfg_flags);
++	if ((host = qla2x00_cfg_find_host(ha)) != NULL) {
++		if ((dp = qla2x00_find_mp_dev_by_name(
++					host, tgt->node_name)) != NULL ) {
++
++			DEBUG3(printk("qla2x00_cfg_failover: dp = %p\n", dp);)
++			/*
++			 * Point at the next path in the path list if there is
++			 * one, and if it hasn't already been failed over by
++			 * another I/O. If there is only one path continuer
++			 * to point at it.
++			 */
++			new_path = qla2x00_select_next_path(host, dp, fp->lun);
++			DEBUG3(printk("cfg_failover: new path @ %p\n",
++						new_path);)
++			new_fp = qla2x00_find_matching_lun(fp->lun, new_path);
++			DEBUG3(printk("cfg_failover: new fp lun @ %p\n",
++						new_fp);)
++
++			qla2x00_cfg_register_failover_lun(dp, sp, new_fp);
++		} else {
++			printk(KERN_INFO
++				"qla2x00(%d): Couldn't find device "
++				"to failover\n",
++				host->instance);
++		}
++	}
++	clear_bit(CFG_ACTIVE, &ha->cfg_flags);
++
++	LEAVE("qla2x00_cfg_failover");
++
++	return new_fp;
++}
++
++/*
++ * IOCTL support
++ */
++#define CFG_IOCTL
++#if defined(CFG_IOCTL)
++/*
++ * qla2x00_cfg_get_paths
++ *      Get list of paths EXT_FO_GET_PATHS.
++ *
++ * Input:
++ *      ha = pointer to adapter
++ *      bp = pointer to buffer
++ *      cmd = Pointer to kernel copy of EXT_IOCTL.
++ *
++ * Return;
++ *      0 on success or errno.
++ *	driver ioctl errors are returned via cmd->Status.
++ *
++ * Context:
++ *      Kernel context.
++ */
++int
++qla2x00_cfg_get_paths(EXT_IOCTL *cmd, FO_GET_PATHS *bp, int mode)
++{
++	FO_PATHS_INFO	*paths,	*u_paths;
++	FO_PATH_ENTRY	*entry;
++	EXT_DEST_ADDR   *sap = &bp->HbaAddr;
++	mp_host_t	*host = NULL;	/* host adapter pointer */
++	mp_device_t	*dp;		/* virtual device pointer */
++	mp_path_t	*path;		/* path pointer */
++	mp_path_list_t	*path_list;	/* path list pointer */
++	int	cnt;
++	int	rval = 0;
++	scsi_qla_host_t *ha;
++
++	DEBUG9(printk("%s: entered.\n", __func__);)
++
++	u_paths = (FO_PATHS_INFO *) cmd->ResponseAdr;
++	ha = qla2x00_get_hba((int)bp->HbaInstance);
++
++	if (!ha) {
++		DEBUG2_9_10(printk("%s: no ha matching inst %d.\n",
++		    __func__, bp->HbaInstance);)
++
++		cmd->Status = EXT_STATUS_DEV_NOT_FOUND;
++		return (rval);
++	}
++
++	if (ha->flags.failover_enabled)
++		if ((host = qla2x00_cfg_find_host(ha)) == NULL) {
++			cmd->Status = EXT_STATUS_DEV_NOT_FOUND;
++			cmd->DetailStatus = EXT_DSTATUS_HBA_INST;
++			DEBUG4(printk("%s: cannot find target (%ld)\n",
++			    __func__, ha->instance);)
++			DEBUG9_10(printk("%s: cannot find host inst(%ld).\n",
++			    __func__, ha->instance);)
++
++			return rval;
++		}
++
++	paths = (FO_PATHS_INFO *)qla2x00_kmem_zalloc(
++	    sizeof(FO_PATHS_INFO), GFP_ATOMIC, 20);
++	if (paths == NULL) {
++		DEBUG4(printk("%s: failed to allocate memory of size (%d)\n",
++		    __func__, (int)sizeof(FO_PATHS_INFO));)
++		DEBUG9_10(printk("%s: failed allocate memory size(%d).\n",
++		    __func__, (int)sizeof(FO_PATHS_INFO));)
++
++		cmd->Status = EXT_STATUS_NO_MEMORY;
++
++		return -ENOMEM;
++	}
++
++	if (!ha->flags.failover_enabled) {
++		/* non-fo case. There's only one path. */
++
++		mp_path_list_t	*ptmp_plist;
++#define STD_MAX_PATH_CNT	1
++#define STD_VISIBLE_INDEX	0
++		int		found;
++		struct list_head *fcpl;
++		fc_port_t	*fcport;
++
++		DEBUG9(printk("%s: non-fo case.\n", __func__);)
++
++		if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_plist,
++		    sizeof(mp_path_list_t))) {
++			/* not enough memory */
++			DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++			    "lun_mask requested=%d.\n",
++			    __func__, ha->host_no, ha->instance,
++			    sizeof(mp_path_list_t));)
++			cmd->Status = EXT_STATUS_NO_MEMORY;
++
++			return -ENOMEM;
++		}
++
++		found = 0;
++		fcport = NULL;
++		list_for_each(fcpl, &ha->fcports) {
++			fcport = list_entry(fcpl, fc_port_t, list);
++
++			if (memcmp(fcport->node_name, sap->DestAddr.WWNN,
++			    EXT_DEF_WWN_NAME_SIZE) == 0) {
++				found++;
++				break;
++			}
++		}
++
++		if (found) {
++			DEBUG9(printk("%s: found fcport:"
++			    "(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)\n.",
++			    __func__,
++			    sap->DestAddr.WWNN[0],
++			    sap->DestAddr.WWNN[1],
++			    sap->DestAddr.WWNN[2],
++			    sap->DestAddr.WWNN[3],
++			    sap->DestAddr.WWNN[4],
++			    sap->DestAddr.WWNN[5],
++			    sap->DestAddr.WWNN[6],
++			    sap->DestAddr.WWNN[7]);)
++
++			paths->HbaInstance         = bp->HbaInstance;
++			paths->PathCount           = STD_MAX_PATH_CNT;
++			paths->VisiblePathIndex    = STD_VISIBLE_INDEX;
++
++			/* Copy current path, which is the first one (0). */
++			memcpy(paths->CurrentPathIndex, ptmp_plist->current_path,
++			    sizeof(paths->CurrentPathIndex));
++
++			entry = &(paths->PathEntry[STD_VISIBLE_INDEX]);
++
++			entry->Visible     = TRUE;
++			entry->HbaInstance = bp->HbaInstance;
++
++			memcpy(entry->PortName, fcport->port_name,
++			    EXT_DEF_WWP_NAME_SIZE);
++
++			rval = verify_area(VERIFY_WRITE, (void *)u_paths,
++			    cmd->ResponseLen);
++			if (rval) {
++				/* error */
++				DEBUG9_10(printk("%s: u_paths %p verify write"
++				    " error. paths->PathCount=%d.\n",
++				    __func__, u_paths, paths->PathCount);)
++			}
++
++			/* Copy data to user */
++			if (rval == 0)
++			 	rval = copy_to_user(&u_paths->PathCount,
++			 	    &paths->PathCount, 4);
++			if (rval == 0)
++				rval = copy_to_user(&u_paths->CurrentPathIndex,
++				    &paths->CurrentPathIndex,
++				    sizeof(paths->CurrentPathIndex));
++			if (rval == 0)
++				rval = copy_to_user(&u_paths->PathEntry,
++				    &paths->PathEntry,
++				    sizeof(paths->PathEntry));
++
++			if (rval) { /* if any of the above failed */
++				DEBUG9_10(printk("%s: data copy failed.\n",
++				    __func__);)
++
++				cmd->Status = EXT_STATUS_COPY_ERR;
++			}
++		} else {
++			cmd->Status = EXT_STATUS_DEV_NOT_FOUND;
++			cmd->DetailStatus = EXT_DSTATUS_TARGET;
++
++			DEBUG10(printk("%s: cannot find fcport "
++			    "(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)\n.",
++			    __func__,
++			    sap->DestAddr.WWNN[0],
++			    sap->DestAddr.WWNN[1],
++			    sap->DestAddr.WWNN[2],
++			    sap->DestAddr.WWNN[3],
++			    sap->DestAddr.WWNN[4],
++			    sap->DestAddr.WWNN[5],
++			    sap->DestAddr.WWNN[6],
++			    sap->DestAddr.WWNN[7]);)
++			DEBUG4(printk("%s: cannot find fcport "
++			    "(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)\n.",
++			    __func__,
++			    sap->DestAddr.WWNN[0],
++			    sap->DestAddr.WWNN[1],
++			    sap->DestAddr.WWNN[2],
++			    sap->DestAddr.WWNN[3],
++			    sap->DestAddr.WWNN[4],
++			    sap->DestAddr.WWNN[5],
++			    sap->DestAddr.WWNN[6],
++			    sap->DestAddr.WWNN[7]);)
++		}
++
++		qla2x00_free_ioctl_scrap_mem(ha);
++		/* end of non-fo case. */
++
++	} else if (sap->DestType != EXT_DEF_DESTTYPE_WWNN) {
++		/* Scan for mp_dev by nodename *ONLY* */
++
++		cmd->Status = EXT_STATUS_INVALID_PARAM;
++		cmd->DetailStatus = EXT_DSTATUS_TARGET;
++
++		DEBUG4(printk("%s: target can be accessed by NodeName only.",
++		    __func__);)
++		DEBUG10(printk("%s: target can be accessed by NodeName only. "
++		    "got type %d.\n",
++		    __func__, sap->DestType);)
++
++	} else if ((dp = qla2x00_find_mp_dev_by_name(host,
++	    sap->DestAddr.WWNN)) != NULL) {
++		DEBUG9(printk("%s: Found mp_dev:"
++		    "(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)\n.",
++		    __func__,
++		    sap->DestAddr.WWNN[0],
++		    sap->DestAddr.WWNN[1],
++		    sap->DestAddr.WWNN[2],
++		    sap->DestAddr.WWNN[3],
++		    sap->DestAddr.WWNN[4],
++		    sap->DestAddr.WWNN[5],
++		    sap->DestAddr.WWNN[6],
++		    sap->DestAddr.WWNN[7]);)
++
++		path_list = dp->path_list;
++
++		paths->HbaInstance = bp->HbaInstance;
++		paths->PathCount           = path_list->path_cnt;
++		paths->VisiblePathIndex    = path_list->visible;
++
++		/* copy current paths */
++		memcpy(paths->CurrentPathIndex,
++		    path_list->current_path,
++		    sizeof(paths->CurrentPathIndex));
++
++		path = path_list->last;
++		for (cnt = 0; cnt < path_list->path_cnt; cnt++) {
++			entry = &(paths->PathEntry[path->id]);
++
++			entry->Visible    = (path->id == path_list->visible);
++			entry->HbaInstance = path->host->instance;
++
++			memcpy(entry->PortName,
++			    path->portname,
++			    EXT_DEF_WWP_NAME_SIZE);
++
++			path = path->next;
++		}
++
++		rval = verify_area(VERIFY_WRITE, (void *)u_paths,
++		    cmd->ResponseLen);
++		if (rval) {
++			/* error */
++			DEBUG9_10(printk("%s: u_paths %p verify write"
++			    " error. paths->PathCount=%d.\n",
++			    __func__, u_paths, paths->PathCount);)
++		}
++
++		/* copy data to user */
++		if (rval == 0)
++			rval = copy_to_user(&u_paths->PathCount,
++			    &paths->PathCount, 4);
++		if (rval == 0)
++			rval = copy_to_user(&u_paths->CurrentPathIndex,
++			    &paths->CurrentPathIndex,
++			    sizeof(paths->CurrentPathIndex));
++		if (rval == 0)
++			rval = copy_to_user(&u_paths->PathEntry,
++			    &paths->PathEntry,
++			    sizeof(paths->PathEntry));
++
++		if (rval != 0) {  /* if any of the above failed */
++			DEBUG9_10(printk("%s: u_paths %p copy"
++			    " error. paths->PathCount=%d.\n",
++			    __func__, u_paths, paths->PathCount);)
++			cmd->Status = EXT_STATUS_COPY_ERR;
++		}
++
++	} else {
++
++		cmd->Status = EXT_STATUS_DEV_NOT_FOUND;
++		cmd->DetailStatus = EXT_DSTATUS_TARGET;
++
++		DEBUG4(printk("%s: cannot find device "
++		    "(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)\n.",
++		    __func__,
++		    sap->DestAddr.WWNN[0],
++		    sap->DestAddr.WWNN[1],
++		    sap->DestAddr.WWNN[2],
++		    sap->DestAddr.WWNN[3],
++		    sap->DestAddr.WWNN[4],
++		    sap->DestAddr.WWNN[5],
++		    sap->DestAddr.WWNN[6],
++		    sap->DestAddr.WWNN[7]);)
++	}
++
++	KMEM_FREE(paths, sizeof(FO_PATHS_INFO));
++
++	DEBUG9(printk("%s: exiting. rval=%d.\n", __func__, rval);)
++
++	return rval;
++
++} /* qla2x00_cfg_get_paths */
++
++/*
++ * qla2x00_cfg_set_current_path
++ *      Set the current failover path EXT_FO_GET_PATHS IOCTL call.
++ *
++ * Input:
++ *      ha = pointer to adapter
++ *      bp = pointer to buffer
++ *      cmd = Pointer to kernel copy of EXT_IOCTL.
++ *
++ * Return;
++ *      0 on success or errno.
++ *
++ * Context:
++ *      Kernel context.
++ */
++int
++qla2x00_cfg_set_current_path(EXT_IOCTL *cmd, FO_SET_CURRENT_PATH *bp, int mode )
++{
++	uint8_t         orig_id, new_id;
++	mp_host_t       *host, *new_host;
++	mp_device_t     *dp;
++	mp_path_list_t  *path_list;
++	EXT_DEST_ADDR   *sap = &bp->HbaAddr;
++	uint32_t        rval = 0;
++	scsi_qla_host_t *ha;
++	mp_path_t       *new_path, *old_path;
++
++	DEBUG9(printk("%s: entered.\n", __func__);)
++
++	/* First find the adapter with the instance number. */
++	ha = qla2x00_get_hba((int)bp->HbaInstance);
++	if (!ha) {
++		DEBUG2_9_10(printk("%s: no ha matching inst %d.\n",
++		    __func__, bp->HbaInstance);)
++
++		cmd->Status = EXT_STATUS_DEV_NOT_FOUND;
++		return (rval);
++	}
++
++	if (!ha->flags.failover_enabled)
++		/* non-failover mode. nothing to be done. */
++		return 0;
++
++	if ((host = qla2x00_cfg_find_host(ha)) == NULL) {
++		cmd->Status = EXT_STATUS_DEV_NOT_FOUND;
++		cmd->DetailStatus = EXT_DSTATUS_HBA_INST;
++		DEBUG4(printk("%s: cannot find adapter.\n",
++		    __func__);)
++		return (rval);
++	}
++
++	set_bit(CFG_ACTIVE, &ha->cfg_flags);
++	sap = &bp->HbaAddr;
++	/* Scan for mp_dev by nodename *ONLY* */
++	if (sap->DestType != EXT_DEF_DESTTYPE_WWNN) {
++		cmd->Status = EXT_STATUS_DEV_NOT_FOUND;
++		cmd->DetailStatus = EXT_DSTATUS_TARGET;
++		DEBUG4(printk("%s: target can be accessed by NodeName only.",
++		    __func__);)
++		DEBUG9_10(printk("%s: target can be accessed by NodeName only.",
++		    __func__);)
++	} else if ((dp = qla2x00_find_mp_dev_by_name(
++	    host, sap->DestAddr.WWNN)) != NULL) {
++
++		path_list = dp->path_list;
++
++		if (bp->NewCurrentPathIndex < MAX_PATHS_PER_DEVICE &&
++		    sap->Lun < MAX_LUNS &&
++		    bp->NewCurrentPathIndex < path_list->path_cnt) {
++
++			orig_id = path_list->current_path[sap->Lun];
++
++			DEBUG(printk("%s: dev no  %d, lun %d, "
++			    "newindex %d, oldindex %d "
++			    "nn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
++			    __func__, dp->dev_id, sap->Lun,
++			    bp->NewCurrentPathIndex, orig_id,
++			    host->nodename[0], host->nodename[1],
++			    host->nodename[2], host->nodename[3],
++			    host->nodename[4], host->nodename[5],
++			    host->nodename[6], host->nodename[7]);)
++
++			if (bp->NewCurrentPathIndex != orig_id) {
++				/* Acquire the update spinlock. */
++
++				/* Set the new current path. */
++				new_id = path_list-> current_path[sap->Lun] =
++				    bp->NewCurrentPathIndex;
++
++				/* Release the update spinlock. */
++				old_path = qla2x00_find_path_by_id(
++				    dp, orig_id);
++				new_path = qla2x00_find_path_by_id(dp, new_id);
++				new_host = new_path->host;
++
++				/* remap the lun */
++				qla2x00_map_a_oslun(new_host, dp,
++				    dp->dev_id, sap->Lun);
++
++				qla2x00_send_failover_notify(dp,
++				    sap->Lun, old_path, new_path);
++			} else {
++				/* EMPTY */
++				DEBUG4(printk("%s: path index not changed.\n",
++				    __func__);)
++			}
++		} else {
++			cmd->Status = EXT_STATUS_INVALID_PARAM;
++			cmd->DetailStatus = EXT_DSTATUS_PATH_INDEX;
++			DEBUG4(printk("%s: invalid index for device.\n",
++			    __func__);)
++			DEBUG9_10(printk("%s: invalid index for device.\n",
++			    __func__);)
++		}
++	} else {
++		cmd->Status = EXT_STATUS_DEV_NOT_FOUND;
++		cmd->DetailStatus = EXT_DSTATUS_TARGET;
++		DEBUG4(printk("%s: cannot find device.\n",
++		    __func__);)
++		DEBUG9_10(printk("%s: cannot find device.\n",
++		    __func__);)
++	}
++	clear_bit(CFG_ACTIVE, &ha->cfg_flags);
++
++	DEBUG9(printk("%s: exiting. rval = %d.\n", __func__, rval);)
++
++	return rval;
++}
++#endif
++
++/*
++ * MP SUPPORT ROUTINES
++ */
++
++/*
++ * qla2x00_add_mp_host
++ *	Add the specified host the host list.
++ *
++ * Input:
++ *	node_name = pointer to node name
++ *
++ * Returns:
++ *
++ * Context:
++ *	Kernel context.
++ */
++mp_host_t *
++qla2x00_add_mp_host(uint8_t *node_name)
++{
++	mp_host_t   *host, *temp;
++
++	host = (mp_host_t *) KMEM_ZALLOC(sizeof(mp_host_t), 1);
++	if (host != NULL) {
++		memcpy(host->nodename, node_name, WWN_SIZE);
++		host->next = NULL;
++		/* add to list */
++		if (mp_hosts_base == NULL) {
++			mp_hosts_base = host;
++		} else {
++			temp = mp_hosts_base;
++			while (temp->next != NULL)
++				temp = temp->next;
++			temp->next = host;
++		}
++		mp_num_hosts++;
++	}
++	return host;
++}
++
++/*
++ * qla2x00_alloc_host
++ *      Allocate and initialize an mp host structure.
++ *
++ * Input:
++ *      ha = pointer to base driver's adapter structure.
++ *
++ * Returns:
++ *      Pointer to host structure or null on error.
++ *
++ * Context:
++ *      Kernel context.
++ */
++mp_host_t   *
++qla2x00_alloc_host(scsi_qla_host_t *ha)
++{
++	mp_host_t	*host, *temp;
++	uint8_t		*name, *portname;
++
++	name = 	&ha->init_cb->node_name[0];
++	portname = &ha->init_cb->port_name[0];
++
++	ENTER("qla2x00_alloc_host");
++
++	host = (mp_host_t *) KMEM_ZALLOC(sizeof(mp_host_t), 2);
++
++	if (host != NULL) {
++		host->ha = ha;
++		memcpy(host->nodename, name, WWN_SIZE);
++		memcpy(host->portname, portname, WWN_SIZE);
++		host->next = NULL;
++		host->flags = MP_HOST_FLAG_NEEDS_UPDATE;
++		host->instance = ha->instance;
++		/* host->MaxLunsPerTarget = qla_fo_params.MaxLunsPerTarget; */
++
++		if (qla2x00_fo_enabled(host->ha, host->instance)) {
++			host->flags |= MP_HOST_FLAG_FO_ENABLED;
++			DEBUG4(printk("%s: Failover enabled.\n",
++			    __func__);)
++		} else {
++			/* EMPTY */
++			DEBUG4(printk("%s: Failover disabled.\n",
++			    __func__);)
++		}
++		/* add to list */
++		if (mp_hosts_base == NULL) {
++			mp_hosts_base = host;
++		} else {
++			temp = mp_hosts_base;
++			while (temp->next != NULL)
++				temp = temp->next;
++			temp->next = host;
++		}
++		mp_num_hosts++;
++
++		DEBUG4(printk("%s: Alloc host @ %p\n", __func__, host);)
++	} else {
++		/* EMPTY */
++		DEBUG4(printk("%s: Failed\n", __func__);)
++	}
++
++	return host;
++}
++
++/*
++ * qla2x00_add_portname_to_mp_dev
++ *      Add the specific port name to the list of port names for a
++ *      multi-path device.
++ *
++ * Input:
++ *      dp = pointer ti virtual device
++ *      portname = Port name to add to device
++ *
++ * Returns:
++ *      qla2x00 local function return status code.
++ *
++ * Context:
++ *      Kernel context.
++ */
++static uint32_t
++qla2x00_add_portname_to_mp_dev(mp_device_t *dp, uint8_t *portname)
++{
++	uint8_t		index;
++	uint32_t	rval = QLA2X00_SUCCESS;
++
++	ENTER("qla2x00_add_portname_to_mp_dev");
++
++	/* Look for an empty slot and add the specified portname.   */
++	for (index = 0; index < MAX_NUMBER_PATHS; index++) {
++		if (qla2x00_is_ww_name_zero(&dp->portnames[index][0])) {
++			DEBUG4(printk("%s: adding portname to dp = "
++			    "%p at index = %d\n",
++			    __func__, dp, index);)
++			memcpy(&dp->portnames[index][0], portname, WWN_SIZE);
++			break;
++		}
++	}
++	if (index == MAX_NUMBER_PATHS) {
++		rval = QLA2X00_FUNCTION_FAILED;
++		DEBUG4(printk("%s: Fail no room\n", __func__);)
++	} else {
++		/* EMPTY */
++		DEBUG4(printk("%s: Exit OK\n", __func__);)
++	}
++
++	LEAVE("qla2x00_add_portname_to_mp_dev");
++
++	return rval;
++}
++
++
++/*
++ *  qla2x00_allocate_mp_dev
++ *      Allocate an fc_mp_dev, clear the memory, and log a system
++ *      error if the allocation fails. After fc_mp_dev is allocated
++ *
++ *  Inputs:
++ *      nodename  = pointer to nodename of new device
++ *      portname  = pointer to portname of new device
++ *
++ *  Returns:
++ *      Pointer to new mp_device_t, or NULL if the allocation fails.
++ *
++ * Context:
++ *      Kernel context.
++ */
++static mp_device_t *
++qla2x00_allocate_mp_dev(uint8_t  *nodename, uint8_t *portname)
++{
++	mp_device_t   *dp;            /* Virtual device pointer */
++
++	ENTER("qla2x00_allocate_mp_dev");
++
++	dp = (mp_device_t *)KMEM_ZALLOC(sizeof(mp_device_t), 3);
++
++	if (dp != NULL) {
++		DEBUG3(printk("%s: mp_device_t allocated at %p\n",
++		    __func__, dp);)
++
++		/*
++		 * Copy node name into the mp_device_t.
++		 */
++		if (nodename)
++			memcpy(dp->nodename, nodename, WWN_SIZE);
++
++		/*
++		 * Since this is the first port, it goes at
++		 * index zero.
++		 */
++		if (portname)
++			memcpy(&dp->portnames[0][0], portname, PORT_NAME_SIZE);
++
++		/* Allocate an PATH_LIST for the fc_mp_dev. */
++		if ((dp->path_list = qla2x00_allocate_path_list()) == NULL) {
++			DEBUG4(printk("%s: allocate path_list Failed.\n",
++			    __func__);)
++			KMEM_FREE(dp, sizeof(mp_device_t));
++			dp = NULL;
++		} else {
++			DEBUG4(printk("%s: mp_path_list_t allocated at %p\n",
++			    __func__, dp->path_list);)
++			/* EMPTY */
++			DEBUG4(printk("qla2x00_allocate_mp_dev: Exit Okay\n");)
++		}
++	} else {
++		/* EMPTY */
++		DEBUG4(printk("%s: Allocate failed.\n", __func__);)
++	}
++
++	LEAVE("qla2x00_allocate_mp_dev");
++
++	return dp;
++}
++
++/*
++ *  qla2x00_allocate_path
++ *      Allocate a PATH.
++ *
++ *  Inputs:
++ *     host   Host adapter for the device.
++ *     path_id  path number
++ *     port   port for device.
++ *      dev_id  device number
++ *
++ *  Returns:
++ *      Pointer to new PATH, or NULL if the allocation failed.
++ *
++ * Context:
++ *      Kernel context.
++ */
++static mp_path_t *
++qla2x00_allocate_path(mp_host_t *host, uint16_t path_id,
++    fc_port_t *port, uint16_t dev_id)
++{
++	mp_path_t	*path;
++	uint16_t	lun;
++
++	ENTER("qla2x00_allocate_path");
++
++	path = (mp_path_t *) KMEM_ZALLOC(sizeof(mp_path_t), 4);
++	if (path != NULL) {
++		DEBUG3(printk("%s: mp_path_t allocated at %p\n",
++		    __func__, path); )
++
++		/* Copy the supplied information into the MP_PATH.  */
++		path->host = host;
++		if (!(port->flags & FC_CONFIG) ||
++			port->loop_id != FC_NO_LOOP_ID) {
++
++			path->port = port;
++		}
++		path->id   = path_id;
++		port->cur_path = path->id;
++		path->mp_byte  = port->mp_byte;
++		path->next  = NULL;
++		memcpy(path->portname, port->port_name, WWN_SIZE);
++		for (lun = 0; lun < MAX_LUNS; lun++) {
++			path->lun_data.data[lun] |= LUN_DATA_ENABLED;
++		}
++	} else {
++		/* EMPTY */
++		DEBUG4(printk("%s: Failed\n", __func__);)
++	}
++
++	return path;
++}
++
++
++/*
++ *  qla2x00_allocate_path_list
++ *      Allocate a PATH_LIST
++ *
++ *  Input:
++ * 		None
++ *
++ *  Returns:
++ *      Pointer to new PATH_LIST, or NULL if the allocation fails.
++ *
++ * Context:
++ *      Kernel context.
++ */
++static mp_path_list_t *
++qla2x00_allocate_path_list( void )
++{
++	mp_path_list_t	*path_list;
++	uint16_t		i;
++	uint8_t			l;
++
++	path_list = (mp_path_list_t *) KMEM_ZALLOC(sizeof(mp_path_list_t), 5);
++
++	if (path_list != NULL) {
++		DEBUG4(printk("%s: allocated at %p\n",
++		    __func__, path_list);)
++
++		path_list->visible = PATH_INDEX_INVALID;
++		/* Initialized current path */
++		for (i = 0; i < MAX_LUNS_PER_DEVICE; i++) {
++			l = (uint8_t)(i & 0xFF);
++			path_list->current_path[l] = PATH_INDEX_INVALID;
++		}
++		path_list->last = NULL;
++
++	} else {
++		/* EMPTY */
++		DEBUG4(printk("%s: Alloc pool failed for MP_PATH_LIST.\n",
++		    __func__);)
++	}
++
++	return path_list;
++}
++
++/*
++ *  qla2x00_cfg_find_host
++ *      Look through the existing multipath tree, and find
++ *      a host adapter to match the specified ha.
++ *
++ *  Input:
++ *      ha = pointer to host adapter
++ *
++ *  Return:
++ *      Pointer to new host, or NULL if no match found.
++ *
++ * Context:
++ *      Kernel context.
++ */
++mp_host_t *
++qla2x00_cfg_find_host(scsi_qla_host_t *ha)
++{
++	mp_host_t     *host = NULL;	/* Host found and null if not */
++	mp_host_t     *tmp_host;
++
++	ENTER("qla2x00_cfg_find_host");
++
++	for (tmp_host = mp_hosts_base; (tmp_host); tmp_host = tmp_host->next) {
++		if (tmp_host->ha == ha) {
++			host = tmp_host;
++			DEBUG3(printk("%s: Found host =%p, instance %d\n",
++			    __func__, host, host->instance);)
++			break;
++		}
++	}
++
++	LEAVE("qla2x00_cfg_find_host");
++
++	return host;
++}
++
++/*
++ *  qla2x00_find_host_by_name
++ *      Look through the existing multipath tree, and find
++ *      a host adapter to match the specified name.
++ *
++ *  Input:
++ *      name = node name to match.
++ *
++ *  Return:
++ *      Pointer to new host, or NULL if no match found.
++ *
++ * Context:
++ *      Kernel context.
++ */
++mp_host_t *
++qla2x00_find_host_by_name(uint8_t   *name)
++{
++	mp_host_t     *host;		/* Host found and null if not */
++
++	for (host = mp_hosts_base; (host); host = host->next) {
++		if (memcmp(host->nodename, name, WWN_SIZE) == 0)
++			break;
++	}
++	return host;
++}
++
++
++/*
++ *  qla2x00_find_or_allocate_mp_dev
++ *      Look through the existing multipath control tree, and find
++ *      an mp_device_t with the supplied world-wide node name.  If
++ *      one cannot be found, allocate one.
++ *
++ *  Input:
++ *      host      Adapter to add device to.
++ *      dev_id    Index of device on adapter.
++ *      port      port database information.
++ *
++ *  Returns:
++ *      Pointer to new mp_device_t, or NULL if the allocation fails.
++ *
++ *  Side Effects:
++ *      If the MP HOST does not already point to the mp_device_t,
++ *      a pointer is added at the proper port offset.
++ *
++ * Context:
++ *      Kernel context.
++ */
++static mp_device_t *
++qla2x00_find_or_allocate_mp_dev(mp_host_t *host, uint16_t dev_id,
++    fc_port_t *port)
++{
++	mp_device_t	*dp = NULL;  /* pointer to multi-path device   */
++	uint8_t		node_found;  /* Found matching node name. */
++	uint8_t		port_found;  /* Found matching port name. */
++	uint8_t		names_valid; /* Node name and port name are not zero */ 
++	mp_host_t	*temp_host;  /* pointer to temporary host */
++
++	uint16_t	j;
++	mp_device_t	*temp_dp;
++
++	ENTER("qla2x00_find_or_allocate_mp_dev");
++
++	DEBUG3(printk("%s: host =%p, port =%p, id = %d\n",
++	    __func__, host, port, dev_id);)
++
++	temp_dp = qla2x00_find_mp_dev_by_id(host,dev_id);
++
++	DEBUG3(printk("%s: temp dp =%p\n", __func__, temp_dp);)
++	/* if Device already known at this port. */
++	if (temp_dp != NULL) {
++		node_found = qla2x00_is_nodename_equal(temp_dp->nodename,
++					port->node_name);
++		port_found = qla2x00_is_portname_in_device(temp_dp,
++					port->port_name);
++
++		if (node_found && port_found) {
++			DEBUG3(printk("%s: port exists in device %p\n",
++			    __func__, temp_dp);)
++			dp = temp_dp;
++
++			/*
++			 * Copy the LUN configuration data
++			 * into the mp_device_t.
++			 */
++		}
++	}
++
++
++	/* Sanity check the port information  */
++	names_valid = (!qla2x00_is_ww_name_zero(port->node_name) &&
++			!qla2x00_is_ww_name_zero(port->port_name));
++
++	/*
++	 * If the optimized check failed, loop through each known
++	 * device on each known adapter looking for the node name.
++	 */
++	if (dp == NULL && names_valid) {
++		DEBUG3(printk("%s: Searching each adapter for the device...\n",
++		    __func__);)
++
++		for (temp_host = mp_hosts_base; (temp_host);
++		    temp_host = temp_host->next) {
++
++			/* Loop through each potential device on adapter. */
++			for (j = 0; j < MAX_MP_DEVICES; j++) {
++				temp_dp = temp_host->mp_devs[j];
++
++				if (temp_dp == NULL)
++					continue;
++
++				node_found = qla2x00_is_nodename_equal(
++						temp_dp->nodename,
++						port->node_name);
++				port_found = qla2x00_is_portname_in_device(
++						temp_dp,
++						port->port_name);
++
++				if (node_found || port_found) {
++					DEBUG3(printk("%s: Matching device "
++					    "found at %p @ %d\n",
++					    __func__, temp_dp, j);)
++					/*
++					 * If the node name matches but
++					 * the port name was not found,
++					 * add the port name to the list
++					 * of port names.
++					 */
++					if (!port_found) {
++						qla2x00_add_portname_to_mp_dev(
++								temp_dp,
++								port->port_name);
++					}
++
++					/*
++					 * Set the flag that we have
++					 * found the device.
++					 */
++					dp = temp_dp;
++					host->mp_devs[j] = dp;
++					dp->use_cnt++;
++
++					/* Fixme(dg)
++					 * Copy the LUN info into
++					 * the mp_device_t
++					 */
++					break;
++				}
++			}
++
++			/* Break outer loop if inner loop succeeded. */
++			if (dp != NULL)
++				break;
++		}
++
++	}
++
++	/* If we couldn't find one, allocate one. */
++	if (dp == NULL &&
++		((port->flags & FC_CONFIG) || !mp_config_required ) ) {
++
++		dp = qla2x00_allocate_mp_dev(port->node_name, port->port_name);
++		host->mp_devs[dev_id] = dp;
++		dp->dev_id = dev_id;
++		dp->use_cnt++;
++	}
++
++	LEAVE("qla2x00_allocate_mp_dev");
++
++	return dp;
++}
++
++
++/*
++ *  qla2x00_find_or_allocate_path
++ *      Look through the path list for the supplied device, and either
++ *      find the supplied adapter (path) for the adapter, or create
++ *      a new one and add it to the path list.
++ *
++ *  Input:
++ *      host      Adapter (path) for the device.
++ *      dp       Device and path list for the device.
++ *      dev_id    Index of device on adapter.
++ *      port     Device data from port database.
++ *
++ *  Returns:
++ *      Pointer to new PATH, or NULL if the allocation fails.
++ *
++ *  Side Effects:
++ *      1. If the PATH_LIST does not already point to the PATH,
++ *         a new PATH is added to the PATH_LIST.
++ *      2. If the new path is found to be a second visible path, it is
++ *         marked as hidden, and the device database is updated to be
++ *         hidden as well, to keep the miniport synchronized.
++ *
++ * Context:
++ *      Kernel context.
++ */
++/* ARGSUSED */
++static mp_path_t *
++qla2x00_find_or_allocate_path(mp_host_t *host, mp_device_t *dp,
++    uint16_t dev_id, fc_port_t *port)
++{
++	mp_path_list_t	*path_list = dp->path_list;
++	mp_path_t		*path;
++	uint8_t			id;
++
++
++	ENTER("qla2x00_find_or_allocate_path");
++
++	DEBUG4(printk("%s: host =%p, port =%p, dp=%p, dev id = %d\n",
++	    __func__, host, port, dp, dev_id);)
++	/*
++	 * Loop through each known path in the path list.  Look for
++	 * a PATH that matches both the adapter and the port name.
++	 */
++	path = qla2x00_find_path_by_name(host, path_list, port->port_name);
++
++
++	if (path != NULL ) {
++		DEBUG3(printk("%s: Found an existing "
++		    "path -  host =%p, port =%p, path id = %d\n",
++		    __func__, host, path->port, path->id);)
++		DEBUG3(printk("%s: Luns for path_id %d, instance %d\n",
++		    __func__, path->id, host->instance);)
++		DEBUG3(qla2x00_dump_buffer(
++		    (char *)&path->lun_data.data[0], 64);)
++
++		/* If we found an existing path, look for any changes to it. */
++		if (path->port == NULL) {
++			DEBUG3(printk("%s: update path %p, path id= %d, "
++			    "mp_byte=0x%x port=%p\n",
++			    __func__, path, path->id,
++			    path->mp_byte, path->port);)
++			path->port = port;
++			port->mp_byte = path->mp_byte;
++		} else {
++			if ((path->mp_byte & MP_MASK_HIDDEN) &&
++				!(port->mp_byte & MP_MASK_HIDDEN)) {
++
++				DEBUG3(printk("%s: Adapter(%p) "
++				    "Device (%p) Path (%d) "
++				    "has become visible.\n",
++				    __func__, host, dp, path->id);)
++
++				path->mp_byte &= ~MP_MASK_HIDDEN;
++			}
++
++			if (!(path->mp_byte & MP_MASK_HIDDEN) &&
++					(port->mp_byte & MP_MASK_HIDDEN)) {
++
++				DEBUG3(printk("%s: Adapter(%p) "
++				    "Device (%p) Path (%d) "
++				    "has become hidden.\n",
++				    __func__, host, dp, path->id);)
++
++				path->mp_byte |= MP_MASK_HIDDEN;
++			}
++		}
++
++	} else {
++		/*
++		 * If we couldn't find an existing path, and there is still
++		 * room to add one, allocate one and put it in the list.
++		 */
++		if (path_list->path_cnt < MAX_PATHS_PER_DEVICE &&
++			path_list->path_cnt < qla_fo_params.MaxPathsPerDevice) {
++
++			id = path_list->path_cnt;
++
++			/* Update port with bitmask info */
++			path = qla2x00_allocate_path(host, id, port, dev_id);
++			DEBUG3(printk("%s: new path %p, path id= %d, "
++			    "mp_byte=0x%x port=%p\n",
++			    __func__, path, id,
++			    path->mp_byte, path->port);)
++			qla2x00_add_path(path_list, path);
++
++			/* Reconcile the new path against the existing ones. */
++			qla2x00_setup_new_path(dp, path);
++		} else {
++			/* EMPTY */
++			DEBUG4(printk("%s: Err exit, no space to add path.\n",
++			    __func__);)
++		}
++
++	}
++
++	LEAVE("qla2x00_find_or_allocate_path");
++
++	return path;
++}
++
++static uint32_t
++qla2x00_cfg_register_failover_lun(mp_device_t *dp, srb_t *sp, fc_lun_t *new_lp)
++{
++	uint32_t	status = QLA2X00_SUCCESS;
++	os_tgt_t	*tq;
++	os_lun_t	*lq;
++	fc_lun_t 	*old_lp;
++
++	DEBUG2(printk("%s: NEW fclun = %p, sp = %p\n",
++	    __func__, new_lp, sp);)
++
++	/*
++	 * Fix lun descriptors to point to new fclun which is a new fcport.
++	 */
++	if (new_lp == NULL) {
++		DEBUG2(printk("%s: Failed new lun %p\n",
++		    __func__, new_lp);)
++		return QLA2X00_FUNCTION_FAILED;
++	}
++
++	tq = sp->tgt_queue;
++	lq = sp->lun_queue;
++	if (tq == NULL) {
++		DEBUG2(printk("%s: Failed to get old tq %p\n",
++		    __func__, tq);)
++		return QLA2X00_FUNCTION_FAILED;
++	}
++	if (lq == NULL) {
++		DEBUG2(printk("%s: Failed to get old lq %p\n",
++		    __func__, lq);)
++		return QLA2X00_FUNCTION_FAILED;
++	}
++	old_lp = lq->fclun;
++	lq->fclun = new_lp;
++
++	/* Log the failover to console */
++	printk(KERN_INFO
++		"qla2x00: FAILOVER device %d from "
++		"%02x%02x%02x%02x%02x%02x%02x%02x -> "
++		"%02x%02x%02x%02x%02x%02x%02x%02x - "
++		"LUN %02x, reason=0x%x\n",
++		dp->dev_id,
++		old_lp->fcport->port_name[0], old_lp->fcport->port_name[1],
++		old_lp->fcport->port_name[2], old_lp->fcport->port_name[3],
++		old_lp->fcport->port_name[4], old_lp->fcport->port_name[5],
++		old_lp->fcport->port_name[6], old_lp->fcport->port_name[7],
++		new_lp->fcport->port_name[0], new_lp->fcport->port_name[1],
++		new_lp->fcport->port_name[2], new_lp->fcport->port_name[3],
++		new_lp->fcport->port_name[4], new_lp->fcport->port_name[5],
++		new_lp->fcport->port_name[6], new_lp->fcport->port_name[7],
++		new_lp->lun, sp->err_id);
++	printk(KERN_INFO
++		"qla2x00: FROM HBA %d to HBA %d\n",
++		(int)old_lp->fcport->ha->instance,
++		(int)new_lp->fcport->ha->instance);
++
++	DEBUG3(printk("%s: NEW fclun = %p , port =%p, "
++	    "loop_id =0x%x, instance %ld\n",
++	    __func__,
++	    new_lp, new_lp->fcport,
++	    new_lp->fcport->loop_id,
++	    new_lp->fcport->ha->instance);)
++
++	return status;
++}
++
++
++/*
++ * qla2x00_send_failover_notify
++ *      A failover operation has just been done from an old path
++ *      index to a new index.  Call lower level driver
++ *      to perform the failover notification.
++ *
++ * Inputs:
++ *      device           Device being failed over.
++ *      lun                LUN being failed over.
++ *      newpath           path that was failed over too.
++ *      oldpath           path that was failed over from.
++ *
++ * Return:
++ *      Local function status code.
++ *
++ * Context:
++ *      Kernel context.
++ */
++/* ARGSUSED */
++static uint32_t
++qla2x00_send_failover_notify(mp_device_t *dp,
++    uint8_t lun, mp_path_t *newpath, mp_path_t *oldpath)
++{
++	fc_lun_t	*old_lp, *new_lp;
++	uint32_t	status = QLA2X00_SUCCESS;
++
++	ENTER("qla2x00_send_failover_notify");
++
++	old_lp = qla2x00_find_matching_lun(lun, oldpath);
++	new_lp = qla2x00_find_matching_lun(lun, newpath);
++
++	/*
++	 * If the target is the same target, but a new HBA has been selected,
++	 * send a third party logout if required.
++	 */
++	if ((qla_fo_params.FailoverNotifyType &
++			 FO_NOTIFY_TYPE_LOGOUT_OR_LUN_RESET ||
++			qla_fo_params.FailoverNotifyType &
++			 FO_NOTIFY_TYPE_LOGOUT_OR_CDB) &&
++			qla2x00_is_portname_equal(
++				oldpath->portname, newpath->portname)) {
++
++		status =  qla2x00_send_fo_notification(old_lp, new_lp);
++		if (status == QLA2X00_SUCCESS) {
++			/* EMPTY */
++			DEBUG4(printk("%s: Logout succeded\n",
++			    __func__);)
++		} else {
++			/* EMPTY */
++			DEBUG4(printk("%s: Logout Failed\n",
++			    __func__);)
++		}
++	} else if ((qla_fo_params.FailoverNotifyType &
++			 FO_NOTIFY_TYPE_LUN_RESET) ||
++			(qla_fo_params.FailoverNotifyType &
++			 FO_NOTIFY_TYPE_LOGOUT_OR_LUN_RESET)) {
++
++		/*
++		 * If desired, send a LUN reset as the
++		 * failover notification type.
++		 */
++		if (newpath->lun_data.data[lun] & LUN_DATA_ENABLED) {
++			status = qla2x00_send_fo_notification(old_lp, new_lp);
++			if (status == QLA2X00_SUCCESS) {
++				/* EMPTY */
++				DEBUG4(printk("%s: LUN reset succeeded.\n",
++				    __func__);)
++			} else {
++				/* EMPTY */
++				DEBUG4(printk("%s: Failed reset LUN.\n",
++				    __func__);)
++			}
++		}
++
++	} else if (qla_fo_params.FailoverNotifyType == FO_NOTIFY_TYPE_CDB ||
++			qla_fo_params.FailoverNotifyType ==
++			 FO_NOTIFY_TYPE_LOGOUT_OR_CDB) {
++
++		if (newpath->lun_data.data[lun] & LUN_DATA_ENABLED) {
++			status = qla2x00_send_fo_notification(old_lp, new_lp);
++			if (status == QLA2X00_SUCCESS) {
++				/* EMPTY */
++				DEBUG4(printk("%s: Send CDB succeeded.\n",
++				    __func__);)
++			} else {
++				/* EMPTY */
++				DEBUG4(printk("%s: Send CDB Error "
++				    "lun=(%d).\n", __func__, lun);)
++			}
++		}
++	} else {
++		/* EMPTY */
++		DEBUG4(printk("%s: failover disabled or no notify routine "
++		    "defined.\n", __func__);)
++	}
++
++	return status;
++}
++
++/*
++ *  qla2x00_select_next_path
++ *      A problem has been detected with the current path for this
++ *      device.  Try to select the next available path as the current
++ *      path for this device.  If there are no more paths, the same
++ *      path will still be selected.
++ *
++ *  Inputs:
++ *      dp           pointer of device structure.
++ *      lun                LUN to failover.
++ *
++ *  Return Value:
++ *      	new path or same path
++ *
++ * Context:
++ *      Kernel context.
++ */
++static mp_path_t *
++qla2x00_select_next_path(mp_host_t *host, mp_device_t *dp, uint8_t lun)
++{
++	mp_path_t	*path = NULL;
++	mp_path_list_t	*path_list;
++	mp_path_t	*orig_path;
++	int		id;
++	uint32_t	status;
++	mp_host_t *new_host;
++
++	ENTER("qla2x00_select_next_path:");
++
++	path_list = dp->path_list;
++	if (path_list == NULL)
++		return NULL;
++
++	/* Get current path */
++	id = path_list->current_path[lun];
++
++	/* Get path for current path id  */
++	if ((orig_path = qla2x00_find_path_by_id(dp, id)) != NULL) {
++
++		/* select next path */
++		path = orig_path->next;
++		new_host = path->host;
++
++		/* FIXME may need to check for HBA being reset */
++		DEBUG3(printk("%s: orig path = %p new path = %p " 
++		    "curr idx = %d, new idx = %d\n",
++		    __func__, orig_path, path, orig_path->id, path->id);)
++		DEBUG3(printk("  FAILOVER: device nodename: "
++		    "%02x%02x%02x%02x%02x%02x%02x%02x\n",
++		    dp->nodename[0], dp->nodename[1],
++		    dp->nodename[2], dp->nodename[3],
++		    dp->nodename[4], dp->nodename[5],
++		    dp->nodename[6], dp->nodename[7]);)
++		DEBUG3(printk(" Original  - host nodename: "
++		    "%02x%02x%02x%02x%02x%02x%02x%02x\n",
++		    orig_path->host->nodename[0],
++		    orig_path->host->nodename[1],
++		    orig_path->host->nodename[2],
++		    orig_path->host->nodename[3],
++		    orig_path->host->nodename[4],
++		    orig_path->host->nodename[5],
++		    orig_path->host->nodename[6],
++		    orig_path->host->nodename[7]);)
++		DEBUG3(printk("   portname: "
++		    "%02x%02x%02x%02x%02x%02x%02x%02x\n",
++		    orig_path->port->port_name[0],
++		    orig_path->port->port_name[1],
++		    orig_path->port->port_name[2],
++		    orig_path->port->port_name[3],
++		    orig_path->port->port_name[4],
++		    orig_path->port->port_name[5],
++		    orig_path->port->port_name[6],
++		    orig_path->port->port_name[7]);)
++		DEBUG3(printk(" New  - host nodename: "
++		    "%02x%02x%02x%02x%02x%02x%02x%02x\n",
++		    new_host->nodename[0], new_host->nodename[1],
++		    new_host->nodename[2], new_host->nodename[3],
++		    new_host->nodename[4], new_host->nodename[5],
++		    new_host->nodename[6], new_host->nodename[7]);)
++		DEBUG3(printk("   portname: "
++		    "%02x%02x%02x%02x%02x%02x%02x%02x\n",
++		    path->port->port_name[0],
++		    path->port->port_name[1],
++		    path->port->port_name[2],
++		    path->port->port_name[3],
++		    path->port->port_name[4],
++		    path->port->port_name[5],
++		    path->port->port_name[6],
++		    path->port->port_name[7]);)
++
++		path_list->current_path[lun] = path->id;
++
++		/* If we selected a new path, do failover notification. */
++		if (path != orig_path) {
++			status = qla2x00_send_failover_notify(
++					dp, lun, path, orig_path);
++
++			/*
++			 * Currently we ignore the returned status from
++			 * the notify. however, if failover notify fails
++			 */
++		}
++	}
++
++	LEAVE("qla2x00_select_next_path:");
++
++	return  path ;
++}
++
++
++
++/*
++ *  qla2x00_update_mp_host
++ *      Update the multipath control information from the port
++ *      database for that adapter.
++ *
++ *  Input:
++ *      host      Adapter to update. Devices that are new are
++ *                      known to be attached to this adapter.
++ *
++ *  Returns:
++ *      TRUE if updated successfully; FALSE if error.
++ *
++ */
++static uint8_t
++qla2x00_update_mp_host(mp_host_t  *host)
++{
++	uint8_t		success = TRUE;
++	uint16_t	dev_id;
++	struct list_head	*fcpl;
++	fc_port_t 	*fcport;
++	scsi_qla_host_t *ha = host->ha;
++
++	ENTER("qla2x00_update_mp_host");
++
++	/*
++	 * We make sure each port is attached to some virtual device.
++	 */
++	dev_id = 0;
++	fcport = NULL;
++	list_for_each(fcpl, &ha->fcports) {
++		fcport = list_entry(fcpl, fc_port_t, list);
++
++		success |= qla2x00_update_mp_device(host, fcport, dev_id);
++
++		dev_id++;
++	}
++	if (success) {
++		DEBUG2(printk("%s: Exit OK\n", __func__);)
++		qla2x00_map_os_targets(host);
++	} else {
++		/* EMPTY */
++		DEBUG2(printk("%s: Exit FAILED\n", __func__);)
++	}
++
++	LEAVE("qla2x00_update_mp_host");
++
++	return success;
++}
++
++/*
++ *  qla2x00_update_mp_device
++ *      Update the multipath control information from the port
++ *      database for that adapter.
++ *
++ *  Inputs:
++ *		host   Host adapter structure
++ *      port   Device to add to the path tree.
++ *		dev_id  Device id
++ *
++ *  Synchronization:
++ *      The Adapter Lock should have already been acquired
++ *      before calling this routine.
++ *
++ *  Return
++ *      TRUE if updated successfully; FALSE if error.
++ *
++ */
++uint8_t
++qla2x00_update_mp_device(mp_host_t *host, fc_port_t *port, uint16_t dev_id)
++{
++	uint8_t		success = TRUE;
++	mp_device_t *dp;
++	mp_path_t  *path;
++
++	ENTER("qla2x00_update_mp_device");
++
++	DEBUG3(printk("%s: host =%p, port =%p, id = %d\n",
++	    __func__, host, port, dev_id);)
++
++	if (!qla2x00_is_ww_name_zero(port->port_name)) {
++
++		/*
++		 * Search for a device with a matching node name,
++		 * or create one.
++		 */
++		dp = qla2x00_find_or_allocate_mp_dev(host, dev_id, port);
++
++		/*
++		 * We either have found or created a path list. Find this
++		 * host's path in the path list or allocate a new one
++		 * and add it to the list.
++		 */
++		if (dp == NULL) {
++			DEBUG4(printk("%s: Device NOT found or created at.\n",
++			    __func__);)
++			return FALSE;
++		}
++
++		/*
++		 * Find the path in the current path list, or allocate
++		 * a new one and put it in the list if it doesn't exist.
++		 * Note that we do NOT set bSuccess to FALSE in the case
++		 * of failure here.  We must tolerate the situation where
++		 * the customer has more paths to a device than he can
++		 * get into a PATH_LIST.
++		 */
++
++		path = qla2x00_find_or_allocate_path(host, dp, dev_id, port);
++		if (path == NULL) {
++			DEBUG4(printk("%s:Path NOT found or created.\n",
++			    __func__);)
++			return FALSE;
++		}
++
++		/* Set the PATH flag to match the device flag
++		 * of whether this device needs a relogin.  If any
++		 * device needs relogin, set the relogin countdown.
++		 */
++		if (port->flags & FC_CONFIG)
++			path->config = TRUE;
++
++		if (atomic_read(&port->state) != FC_ONLINE) {
++			path->relogin = TRUE;
++			if (host->relogin_countdown == 0)
++				host->relogin_countdown = 30;
++		} else {
++			path->relogin = FALSE;
++		}
++
++	} else {
++		/* EMPTY */
++		DEBUG4(printk("%s: Failed portname empty.\n",
++		    __func__);)
++	}
++
++	LEAVE("qla2x00_update_mp_device");
++
++	return success;
++}
++
++/*
++ * qla2x00_update_mp_tree
++ *      Get port information from each adapter, and build or rebuild
++ *      the multipath control tree from this data.  This is called
++ *      from init and during port database notification.
++ *
++ * Input:
++ *      None
++ *
++ * Return:
++ *      Local function return code.
++ *
++ */
++static uint32_t
++qla2x00_update_mp_tree(void)
++{
++	mp_host_t	*host;
++	uint32_t	rval = QLA2X00_SUCCESS;
++
++	ENTER("qla2x00_update_mp_tree:");
++
++	/* Loop through each adapter and see what needs updating. */
++	for (host = mp_hosts_base; (host) ; host = host->next) {
++
++		DEBUG4(printk("%s: hba(%d) flags (%x)\n",
++		    __func__, host->instance, host->flags);)
++		/* Clear the countdown; it may be reset in the update. */
++		host->relogin_countdown = 0;
++
++		/* Override the NEEDS_UPDATE flag if disabled. */
++		if (host->flags & MP_HOST_FLAG_DISABLE ||
++		    list_empty(host->fcports))
++			host->flags &= ~MP_HOST_FLAG_NEEDS_UPDATE;
++
++		if (host->flags & MP_HOST_FLAG_NEEDS_UPDATE) {
++
++			/*
++			 * Perform the actual updates.  If this succeeds, clear
++			 * the flag that an update is needed, and failback all
++			 * devices that are visible on this path to use this
++			 * path.  If the update fails, leave set the flag that
++			 * an update is needed, and it will be picked back up
++			 * during the next timer routine.
++			 */
++			if (qla2x00_update_mp_host(host)) {
++				host->flags &= ~MP_HOST_FLAG_NEEDS_UPDATE;
++
++				qla2x00_failback_luns(host);
++			} else
++				rval = QLA2X00_FUNCTION_FAILED;
++
++		}
++
++	}
++
++	if (rval != QLA2X00_SUCCESS) {
++		/* EMPTY */
++		DEBUG4(printk("%s: Exit FAILED.\n", __func__);)
++
++	} else {
++		/* EMPTY */
++		DEBUG4(printk("%s: Exit OK.\n", __func__);)
++	}
++	return rval;
++}
++
++
++
++/*
++ * qla2x00_find_matching_lun
++ *      Find the lun in the path that matches the
++ *  specified lun number.
++ *
++ * Input:
++ *      lun  = lun number
++ *      newpath = path to search for lun
++ *
++ * Returns:
++ *      NULL or pointer to lun
++ *
++ * Context:
++ *      Kernel context.
++ * (dg)
++ */
++static fc_lun_t  *
++qla2x00_find_matching_lun(uint8_t lun, mp_path_t *newpath)
++{
++	fc_lun_t *lp = NULL;	/* lun ptr */
++	struct list_head	*fcll;
++	fc_lun_t *nlp;			/* Next lun ptr */
++	fc_port_t *fcport;		/* port ptr */
++
++	if ((fcport = newpath->port) != NULL) {
++		list_for_each(fcll, &fcport->fcluns) {
++			nlp = list_entry(fcll, fc_lun_t, list);
++
++			if (lun == nlp->lun) {
++				lp = nlp;
++				break;
++			}
++		}
++	}
++	return lp;
++}
++
++/*
++ * qla2x00_find_path_by_name
++ *      Find the path specified portname from the pathlist
++ *
++ * Input:
++ *      host = host adapter pointer.
++ * 	pathlist =  multi-path path list
++ *      portname  	portname to search for
++ *
++ * Returns:
++ * pointer to the path or NULL
++ *
++ * Context:
++ *      Kernel context.
++ */
++mp_path_t *
++qla2x00_find_path_by_name(mp_host_t *host, mp_path_list_t *plp,
++    uint8_t *portname)
++{
++	mp_path_t  *path = NULL;		/* match if not NULL */
++	mp_path_t  *tmp_path;
++	int cnt;
++
++	if ((tmp_path = plp->last) != NULL) {
++		for (cnt = 0; cnt < plp->path_cnt; cnt++) {
++			if (tmp_path->host == host &&
++				qla2x00_is_portname_equal(
++					tmp_path->portname, portname)) {
++
++				path = tmp_path;
++				break;
++			}
++			tmp_path = tmp_path->next;
++		}
++	}
++	return path ;
++}
++
++/*
++ * qla2x00_find_path_by_id
++ *      Find the path for the specified path id.
++ *
++ * Input:
++ * 	dp 		multi-path device
++ * 	id 		path id
++ *
++ * Returns:
++ *      pointer to the path or NULL
++ *
++ * Context:
++ *      Kernel context.
++ */
++static mp_path_t *
++qla2x00_find_path_by_id(mp_device_t *dp, uint8_t id)
++{
++	mp_path_t  *path = NULL;
++	mp_path_t  *tmp_path;
++	mp_path_list_t		*path_list;
++	int cnt;
++
++	path_list = dp->path_list;
++	tmp_path = path_list->last;
++	for (cnt = 0; (tmp_path) && cnt < path_list->path_cnt; cnt++) {
++		if (tmp_path->id == id) {
++			path = tmp_path;
++			break;
++		}
++		tmp_path = tmp_path->next;
++	}
++	return path ;
++}
++
++/*
++ * qla2x00_find_mp_dev_by_id
++ *      Find the mp_dev for the specified target id.
++ *
++ * Input:
++ *      host = host adapter pointer.
++ *      tgt  = Target id
++ *
++ * Returns:
++ *
++ * Context:
++ *      Kernel context.
++ */
++static mp_device_t  *
++qla2x00_find_mp_dev_by_id(mp_host_t *host, uint8_t id )
++{
++	if (id < MAX_MP_DEVICES)
++		return host->mp_devs[id];
++	else
++		return NULL;
++}
++
++/*
++ * qla2x00_find_mp_dev_by_name
++ *      Find the mp_dev for the specified target name.
++ *
++ * Input:
++ *      host = host adapter pointer.
++ *      name  = Target name
++ *
++ * Returns:
++ *
++ * Context:
++ *      Kernel context.
++ */
++static mp_device_t  *
++qla2x00_find_mp_dev_by_name(mp_host_t *host, uint8_t *name )
++{
++	int id;
++	mp_device_t *dp;
++
++	ENTER("qla2x00_find_mp_dev_by_name");
++
++	for (id= 0; id < MAX_MP_DEVICES; id++) {
++		if ((dp = host->mp_devs[id] ) == NULL)
++			continue;
++
++		if (qla2x00_is_nodename_equal(dp->nodename, name)) {
++			DEBUG3(printk("%s: Found matching device @ index %d:\n",
++			    __func__, id);)
++			return dp;
++		}
++	}
++
++	LEAVE("qla2x00_find_mp_dev_by_name");
++
++	return NULL;
++}
++
++/*
++ * qla2x00_get_visible_path
++ * Find the the visible path for the specified device.
++ *
++ * Input:
++ *      dp = device pointer
++ *
++ * Returns:
++ *      NULL or path
++ *
++ * Context:
++ *      Kernel context.
++ */
++static mp_path_t *
++qla2x00_get_visible_path(mp_device_t *dp)
++{
++	uint16_t	id;
++	mp_path_list_t	*path_list;
++	mp_path_t	*path;
++
++	path_list = dp->path_list;
++	/* if we don't have a visible path skip it */
++	if ((id = path_list->visible) == PATH_INDEX_INVALID) {
++		return NULL;
++	}
++
++	if ((path = qla2x00_find_path_by_id(dp,id))== NULL)
++		return NULL;
++
++	return path ;
++}
++
++/*
++ * qla2x00_map_os_targets
++ * Allocate the luns and setup the OS target.
++ *
++ * Input:
++ *      host = host adapter pointer.
++ *
++ * Returns:
++ *      None
++ *
++ * Context:
++ *      Kernel context.
++ */
++static void
++qla2x00_map_os_targets(mp_host_t *host)
++{
++	scsi_qla_host_t *ha = host->ha;
++	mp_path_t	*path;
++	mp_device_t 	*dp;
++	os_tgt_t	*tgt;
++	int		t;
++
++	ENTER("qla2x00_map_os_targets ");
++
++	for (t = 0; t < MAX_TARGETS; t++ ) {
++		dp = host->mp_devs[t];
++		if (dp != NULL) {
++			DEBUG3(printk("%s: (%d) found a dp=%p, "
++			    "host=%p, ha=%p\n",
++			    __func__, t, dp, host,ha);)
++
++			if ((path = qla2x00_get_visible_path(dp)) == NULL) {
++				printk(KERN_INFO
++				    "qla_cfg(%d): No visible path "
++				    "for target %d, dp = %p\n",
++				    host->instance, t, dp);
++				continue;
++			}
++
++			/* if not the visible path skip it */
++			if (path->host == host) {
++				if (TGT_Q(ha, t) == NULL) {
++					tgt = qla2x00_tgt_alloc(ha, t);
++					memcpy(tgt->node_name,
++							dp->nodename,
++							WWN_SIZE);
++					tgt->vis_port = path->port;
++				}
++				DEBUG3(printk("%s(%ld): host=%d, "
++				    "device= %p has VISIBLE "
++				    "path=%p, path id=%d\n",
++				    __func__, ha->host_no,
++				    host->instance,
++				    dp, path, path->id);)
++			} else {
++			/* EMPTY */
++				DEBUG3(printk("%s(%ld): host=%d, "
++				    "device= %p has HIDDEN "
++				    "path=%p, path id=%d\n",
++				    __func__, ha->host_no,
++				    host->instance, dp, path,path->id);)
++			}
++			qla2x00_map_os_luns(host, dp, t);
++		} else {
++			if ((tgt= TGT_Q(ha,t)) != NULL) {
++				qla2x00_tgt_free(ha,t);
++			}
++		}
++	}
++
++	LEAVE("qla2x00_map_os_targets ");
++}
++
++/*
++ * qla2x00_map_os_luns
++ *      Allocate the luns for the OS target.
++ *
++ * Input:
++ *      dp = pointer to device
++ *      t  = OS target number.
++ *
++ * Returns:
++ *      None
++ *
++ * Context:
++ *	Kernel context.
++ */
++static void
++qla2x00_map_os_luns(mp_host_t *host, mp_device_t *dp, uint16_t t)
++{
++	uint16_t lun;
++	int	i;
++
++	for (lun = 0; lun < MAX_LUNS; lun++ ) {
++		if ( qla2x00_map_a_oslun(host, dp, t, lun) &&
++			(host->flags & MP_HOST_FLAG_LUN_FO_ENABLED) ){
++			/* find a path for us to use */
++			for ( i = 0; i < dp->path_list->path_cnt; i++ ){
++				qla2x00_select_next_path(host, dp, lun);
++				if( !qla2x00_map_a_oslun(host, dp, t, lun))
++					break;
++			}
++		}
++	}
++}
++
++/*
++ * qla2x00_map_a_osluns
++ *      Map the OS lun to the current path
++ *
++ * Input:
++ *      host = pointer to host
++ *      dp = pointer to device
++ *      lun  = OS lun number.
++ *
++ * Returns:
++ *      None
++ *
++ * Context:
++ *	Kernel context.
++ */
++
++static uint8_t
++qla2x00_map_a_oslun(mp_host_t *host, mp_device_t *dp, uint16_t t, uint16_t lun)
++{
++	fc_port_t	*fcport;
++	fc_lun_t	*fclun;
++	os_lun_t	*lq;
++	uint16_t	id;
++	mp_path_t	*path, *vis_path;
++	mp_host_t 	*vis_host;
++	uint8_t		status = FALSE;
++
++	if ((id = dp->path_list->current_path[lun]) != PATH_INDEX_INVALID) {
++		path = qla2x00_find_path_by_id(dp,id);
++		if (path) {
++			fcport = path->port;
++			if (fcport) {
++				/* dg 04/26/02 */
++			 	fcport->cur_path = id;
++				fclun = qla2x00_find_matching_lun(lun,path);
++
++				/* Always map all luns if they are enabled */
++				if (fclun &&
++					(path->lun_data.data[lun] &
++					 LUN_DATA_ENABLED) ) {
++
++					/*
++					 * Mapped lun on the visible path
++					 */
++					if ((vis_path =
++					    qla2x00_get_visible_path(dp)) ==
++					    NULL ) {
++
++						printk(KERN_INFO
++						    "qla2x00(%d): No visible "
++						    "path for target %d, "
++						    "dp = %p\n",
++						    host->instance,
++						    t, dp);
++
++						return FALSE;
++					}
++
++					vis_host = vis_path->host;
++
++					/* ra 11/30/01 */
++					/*
++					 * Always alloc LUN 0 so kernel
++					 * will scan past LUN 0.
++					 */
++					if (lun != 0 &&
++					    (EXT_IS_LUN_BIT_SET(
++						&(fcport->lun_mask), lun))) {
++
++						/* mask this LUN */
++						return FALSE;
++					}
++
++					if ((lq = qla2x00_lun_alloc(
++							vis_host->ha,
++							t, lun)) != NULL) {
++
++						lq->fclun = fclun;
++					}
++				}
++			}
++			else
++				status = TRUE;
++		}
++	}
++	return status;
++}
++
++/*
++ * qla2x00_is_ww_name_zero
++ *
++ * Input:
++ *      ww_name = Pointer to WW name to check
++ *
++ * Returns:
++ *      TRUE if name is 0 else FALSE
++ *
++ * Context:
++ *      Kernel context.
++ */
++static uint8_t
++qla2x00_is_ww_name_zero(uint8_t *nn)
++{
++	int cnt;
++
++	/* Check for zero node name */
++	for (cnt = 0; cnt < WWN_SIZE ; cnt++, nn++) {
++		if (*nn != 0)
++			break;
++	}
++	/* if zero return TRUE */
++	if (cnt == WWN_SIZE)
++		return TRUE;
++	else
++		return FALSE;
++}
++
++/*
++ * qla2x00_add_path
++ * Add a path to the pathlist
++ *
++ * Input:
++ * pathlist -- path list of paths
++ * path -- path to be added to list
++ *
++ * Returns:
++ *      None
++ *
++ * Context:
++ *      Kernel context.
++ */
++static void
++qla2x00_add_path( mp_path_list_t *pathlist, mp_path_t *path )
++{
++	mp_path_t *last = pathlist->last;
++
++	ENTER("qla2x00_add_path");
++
++	DEBUG3(printk("%s: pathlist =%p, path =%p, cnt = %d\n",
++	    __func__, pathlist, path, pathlist->path_cnt);)
++	if (last == NULL) {
++		last = path;
++	} else {
++		path->next = last->next;
++	}
++
++	last->next = path;
++	pathlist->last = path;
++	pathlist->path_cnt++;
++
++	LEAVE("qla2x00_add_path");
++}
++
++
++/*
++ * qla2x00_is_portname_in_device
++ *	Search for the specified "portname" in the device list.
++ *
++ * Input:
++ *	dp = device pointer
++ *	portname = portname to searched for in device
++ *
++ * Returns:
++ *      qla2x00 local function return status code.
++ *
++ * Context:
++ *      Kernel context.
++ */
++uint8_t
++qla2x00_is_portname_in_device(mp_device_t *dp, uint8_t *portname)
++{
++	int idx;
++
++	for (idx = 0; idx < MAX_PATHS_PER_DEVICE; idx++) {
++		if (memcmp(&dp->portnames[idx][0], portname, WWN_SIZE) == 0)
++			return TRUE;
++	}
++	return FALSE;
++}
++
++
++/*
++ *  qla2x00_set_lun_data_from_bitmask
++ *      Set or clear the LUN_DATA_ENABLED bits in the LUN_DATA from
++ *      a LUN bitmask provided from the miniport driver.
++ *
++ *  Inputs:
++ *      lun_data = Extended LUN_DATA buffer to set.
++ *      lun_mask = Pointer to lun bit mask union.
++ *
++ *  Return Value: none.
++ */
++void
++qla2x00_set_lun_data_from_bitmask(mp_lun_data_t *lun_data,
++    lun_bit_mask_t *lun_mask)
++{
++	int16_t	lun;
++
++	ENTER("qla2x00_set_lun_data_from_bitmask");
++
++	for (lun = 0; lun < MAX_LUNS; lun++) {
++		/* our bit mask is inverted */
++		if (!(EXT_IS_LUN_BIT_SET(lun_mask,lun)))
++			lun_data->data[lun] |= LUN_DATA_ENABLED;
++		else
++			lun_data->data[lun] &= ~LUN_DATA_ENABLED;
++
++		DEBUG5(printk("%s: lun data[%d] = 0x%x\n",
++		    __func__, lun, lun_data->data[lun]);)
++	}
++
++	LEAVE("qla2x00_set_lun_data_from_bitmask");
++
++	return;
++}
++
++static void
++qla2x00_failback_single_lun(mp_device_t *dp, uint8_t lun, uint8_t new)
++{
++	mp_path_list_t   *pathlist;
++	mp_path_t        *new_path, *old_path;
++	uint8_t 	old;
++	mp_host_t  *host;
++	os_lun_t *lq;
++	mp_path_t	*vis_path;
++	mp_host_t 	*vis_host;
++
++	/* Failback and update statistics. */
++	if ((pathlist = dp->path_list) == NULL)
++		return;
++
++	old = pathlist->current_path[lun];
++	pathlist->current_path[lun] = new;
++
++	if ((new_path = qla2x00_find_path_by_id(dp, new)) == NULL)
++		return;
++	if ((old_path = qla2x00_find_path_by_id(dp, old)) == NULL)
++		return;
++
++	/* An fclun should exist for the failbacked lun */
++	if (qla2x00_find_matching_lun(lun, new_path) == NULL)
++		return;
++	if (qla2x00_find_matching_lun(lun, old_path) == NULL)
++		return;
++
++	/* Log to console and to event log. */
++	printk(KERN_INFO
++		"qla2x00: FAILBACK device %d -> "
++		"%02x%02x%02x%02x%02x%02x%02x%02x LUN %02x\n",
++		dp->dev_id,
++		dp->nodename[0], dp->nodename[1],
++		dp->nodename[2], dp->nodename[3],
++		dp->nodename[4], dp->nodename[5],
++		dp->nodename[6], dp->nodename[7],
++		lun);
++
++	printk(KERN_INFO
++		"qla2x00: FROM HBA %d to HBA %d \n",
++		old_path->host->instance,
++		new_path->host->instance);
++
++
++	/* Send a failover notification. */
++#if 0
++	qla2x00_send_failover_notify(dp, lun, new_path, old_path);
++#endif
++
++	host = 	new_path->host;
++
++	/* remap the lun */
++	qla2x00_map_a_oslun(host, dp, dp->dev_id, lun);
++
++	/* 7/16
++	 * Reset counts on the visible path
++	 */
++	if ((vis_path = qla2x00_get_visible_path(dp)) == NULL) {
++		printk(KERN_INFO
++			"qla2x00(%d): No visible path for "
++			"target %d, dp = %p\n",
++			host->instance,
++			dp->dev_id, dp);
++		return;
++	}
++
++	vis_host = vis_path->host;
++	if ((lq = qla2x00_lun_alloc(vis_host->ha, dp->dev_id, lun)) != NULL) {
++		qla2x00_delay_lun(vis_host->ha, lq, recoveryTime);
++		qla2x00_flush_failover_q(vis_host->ha, lq);
++		qla2x00_reset_lun_fo_counts(vis_host->ha, lq);
++	}
++}
++
++/*
++*  qla2x00_failback_luns
++*      This routine looks through the devices on an adapter, and
++*      for each device that has this adapter as the visible path,
++*      it forces that path to be the current path.  This allows us
++*      to keep some semblance of static load balancing even after
++*      an adapter goes away and comes back.
++*
++*  Arguments:
++*      host          Adapter that has just come back online.
++*
++*  Return:
++*	None.
++*/
++static void
++qla2x00_failback_luns( mp_host_t  *host)
++{
++	uint16_t          dev_no;
++	uint8_t           l;
++	uint16_t          lun;
++	int i;
++	mp_device_t      *dp;
++	mp_path_list_t   *path_list;
++	mp_path_t        *path;
++	fc_lun_t	*new_fp;
++
++	ENTER("qla2x00_failback_luns");
++
++	for (dev_no = 0; dev_no < MAX_MP_DEVICES; dev_no++) {
++		dp = host->mp_devs[dev_no];
++
++		if (dp == NULL)
++			continue;
++
++		path_list = dp->path_list;
++		for (path = path_list->last, i= 0;
++			i < path_list->path_cnt;
++			i++, path = path->next) {
++
++			if (path->host != host )
++				continue;
++
++			if (path->port == NULL)
++				continue;
++
++			if (atomic_read(&path->port->state) == FC_DEVICE_DEAD)
++				continue;
++
++			/* 
++			 * Failback all the paths for this host,
++			 * the luns could be preferred across all paths 
++			 */
++			DEBUG2(printk("%s(%d): Lun Data for device %p, "
++			    "id=%d, path id=%d\n",
++			    __func__, host->instance, dp, dp->dev_id,
++			    path->id);)
++			DEBUG4(qla2x00_dump_buffer(
++			    (char *)&path->lun_data.data[0], 64);)
++			DEBUG4(printk("%s(%d): Perferrred Path data:\n",
++			    __func__, host->instance);)
++			DEBUG4(qla2x00_dump_buffer(
++			    (char *)&path_list->current_path[0], 64);)
++
++			for (lun = 0; lun < MAX_LUNS_PER_DEVICE; lun++) {
++				l = (uint8_t)(lun & 0xFF);
++
++				/*
++				 * if this is the preferred lun and not
++				 * the current path then failback lun.
++				 */
++				DEBUG4(printk("%s: target=%d, cur path id =%d, "
++				    "lun data[%d] = %d)\n",
++				    __func__, dp->dev_id, path->id,
++				    lun, path->lun_data.data[lun]);)
++
++				if ((path->lun_data.data[l] &
++						LUN_DATA_PREFERRED_PATH) &&
++					/* !path->relogin && */
++					path_list->current_path[l] !=
++						path->id) {
++					/* No point in failing back a
++					   disconnected lun */
++					new_fp = qla2x00_find_matching_lun(
++							l, path);
++
++					if (new_fp == NULL)
++						continue;
++					if (new_fp->flags & FC_DISCON_LUN)
++						continue;
++
++					qla2x00_failback_single_lun(
++							dp, l, path->id);
++				}
++			}
++		}
++
++	}
++
++	LEAVE("qla2x00_failback_luns");
++
++	return;
++}
++
++/*
++ *  qla2x00_setup_new_path
++ *      Checks the path against the existing paths to see if there
++ *      are any incompatibilities.  It then checks and sets up the
++ *      current path indices.
++ *
++ *  Inputs:
++ *      dp   =  pointer to device
++ *      path = new path
++ *
++ *  Returns:
++ *      None
++ */
++static void
++qla2x00_setup_new_path( mp_device_t *dp, mp_path_t *path)
++{
++	mp_path_list_t  *path_list = dp->path_list;
++	mp_path_t       *tmp_path, *first_path;
++	mp_host_t       *first_host;
++	mp_host_t       *tmp_host;
++
++	uint16_t	lun;
++	uint8_t		l;
++	int		i;
++
++	ENTER("qla2x00_setup_new_path");
++
++	/* If this is a visible path, and there is not already a
++	 * visible path, save it as the visible path.  If there
++	 * is already a visible path, log an error and make this
++	 * path invisible.
++	 */
++	if (!(path->mp_byte & (MP_MASK_HIDDEN | MP_MASK_UNCONFIGURED))) {
++
++		/* No known visible path */
++		if (path_list->visible == PATH_INDEX_INVALID) {
++			DEBUG3(printk("%s: No know visible path - make this "
++			    "path visible\n",
++			    __func__);)
++				
++			path_list->visible = path->id;
++			path->mp_byte &= ~MP_MASK_HIDDEN;
++		} else {
++			DEBUG3(printk("%s: Second visible path found- make "
++			    "this one hidden\n",
++			    __func__);)
++
++			path->mp_byte |= MP_MASK_HIDDEN;
++		}
++	}
++
++	/*
++	 * If this is not the first path added, and the setting for
++	 * MaxLunsPerTarget does not match that of the first path
++	 * then disable qla_cfg for all adapters.
++	 */
++	first_path = qla2x00_find_path_by_id(dp, 0);
++
++	if (first_path != NULL) {
++		first_host = first_path->host;
++		if ((path->id != 0) &&
++			(first_host->MaxLunsPerTarget !=
++			 path->host->MaxLunsPerTarget)) {
++
++			for (tmp_path = path_list->last, i = 0;
++				(tmp_path) && i <= path->id; i++) {
++
++				tmp_host = tmp_path->host;
++				if (!(tmp_host->flags &
++						MP_HOST_FLAG_DISABLE)) {
++
++					DEBUG4(printk("%s: 2nd visible "
++					    "path (%p)\n",
++					    __func__, tmp_host);)
++
++					tmp_host->flags |= MP_HOST_FLAG_DISABLE;
++				}
++			}
++		}
++	}
++
++	/*
++	 * For each LUN, evaluate whether the new path that is added
++	 * is better than the existing path.  If it is, make it the
++	 * current path for the LUN.
++	 */
++	for (lun = 0; lun < MAX_LUNS_PER_DEVICE; lun++) {
++		l = (uint8_t)(lun & 0xFF);
++
++		/* If this is the first path added, it is the only
++		 * available path, so make it the current path.
++		 */
++
++		DEBUG4(printk("%s: lun_data 0x%x, LUN %d\n",
++		    __func__, path->lun_data.data[l], lun);)
++
++		if (first_path == path) {
++			path_list->current_path[l] = 0;
++			path->lun_data.data[l] |=  LUN_DATA_PREFERRED_PATH;
++		} else if (path->lun_data.data[l] & LUN_DATA_PREFERRED_PATH) {
++			/*
++			 * If this is not the first path added, if this is
++			 * the preferred path, make it the current path.
++			 */
++			path_list->current_path[l] = path->id;
++		}
++	}
++
++	LEAVE("qla2x00_setup_new_path");
++
++	return;
++}
++
++/*
++ * qla2x00_cfg_mem_free
++ *     Free all configuration structures.
++ *
++ * Input:
++ *      ha = adapter state pointer.
++ *
++ * Context:
++ *      Kernel context.
++ */
++void
++qla2x00_cfg_mem_free(scsi_qla_host_t *ha)
++{
++	mp_device_t *dp;
++	mp_path_list_t  *path_list;
++	mp_path_t       *tmp_path, *path;
++	mp_host_t       *host, *temp;
++	int	id, cnt;
++
++	if ((host = qla2x00_cfg_find_host(ha)) != NULL) {
++		if( mp_num_hosts == 0 )
++			return;
++
++		for (id= 0; id < MAX_MP_DEVICES; id++) {
++			if ((dp = host->mp_devs[id]) == NULL)
++				continue;
++			if ((path_list = dp->path_list) == NULL)
++				continue;
++			if ((tmp_path = path_list->last) == NULL)
++				continue;
++			for (cnt = 0; cnt < path_list->path_cnt; cnt++) {
++				path = tmp_path;
++				tmp_path = tmp_path->next;
++				DEBUG(printk(KERN_INFO
++						"host%d - Removing path[%d] "
++						"= %p\n",
++						host->instance,
++						cnt, path);)
++				KMEM_FREE(path,sizeof(mp_path_t));
++			}
++			KMEM_FREE(path_list, sizeof(mp_path_list_t));
++			host->mp_devs[id] = NULL;
++			/* remove dp from other hosts */
++			for (temp = mp_hosts_base; (temp); temp = temp->next) {
++				if (temp->mp_devs[id] == dp) {
++					DEBUG(printk(KERN_INFO
++						"host%d - Removing host[%d] = "
++						"%p\n",
++						host->instance,
++						temp->instance,temp);)
++					temp->mp_devs[id] = NULL;
++				}
++			}
++			KMEM_FREE(dp, sizeof(mp_device_t));
++		}
++
++		/* remove this host from host list */
++		temp = mp_hosts_base;
++		if (temp != NULL) {
++			/* Remove from top of queue */
++			if (temp == host) {
++				mp_hosts_base = host->next;
++			} else {
++				/*
++				 * Remove from middle of queue
++				 * or bottom of queue
++				 */
++				for (temp = mp_hosts_base;
++						temp != NULL;
++						temp = temp->next) {
++
++					if (temp->next == host) {
++						temp->next = host->next;
++						break;
++					}
++				}
++			}
++		}
++		KMEM_FREE(host, sizeof(mp_host_t));
++		mp_num_hosts--;
++	}
++}
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_cfg.h	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,181 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++/*
++ * QLogic ISP2x00 Multi-path LUN Support
++ * Multi-path include file.
++ */
++
++#if !defined(_QLA_CFG_H)
++#define	_QLA_CFG_H
++
++#if defined(__cplusplus)
++extern "C"
++{
++#endif
++
++/*
++ * Failover definitions
++ */
++#define FAILOVER_TYPE_COUNT		4
++#define MP_NOTIFY_RESET_DETECTED	1
++#define MP_NOTIFY_PWR_LOSS		2
++#define MP_NOTIFY_LOOP_UP		3
++#define MP_NOTIFY_LOOP_DOWN		4
++#define MP_NOTIFY_BUS_RESET		5
++#define FAILOVER_TYPE_ERROR_RETRY	1
++#define MAX_NUMBER_PATHS		FO_MAX_PATHS
++#define PORT_NAME_SIZE			WWN_SIZE
++#define FAILOVER_NOTIFY_STATUS_ERROR	QLA2X00_SUCCESS
++#define FAILOVER_NOTIFY_STATUS_SUCCESS  QLA2X00_SUCCESS
++#define FAILOVER_NOTIFY_CDB_LENGTH_MAX	FO_NOTIFY_CDB_LENGTH_MAX
++#define MAX_TARGETS_PER_DEVICE		SDM_DEF_MAX_TARGETS_PER_DEVICE
++
++/*
++ * Limits definitions.
++ */
++#define MAX_LUNS_PER_DEVICE	MAX_LUNS	/* Maximum # of luns */
++#define MAX_MP_DEVICES		MAX_TARGETS	/* Maximum # of virtual devs */
++#define MAX_PATHS_PER_DEVICE	8		/* Maximum # of paths */
++#if !defined(MAX_LUNS)
++#define	MAX_LUNS		256
++#endif
++#define MAX_HOSTS		MAX_HOST_COUNT
++
++/* Async notification types */
++#define NOTIFY_EVENT_LINK_DOWN      1		/* Link went down */
++#define NOTIFY_EVENT_LINK_UP        2		/* Link is back up */
++#define NOTIFY_EVENT_RESET_DETECTED 3		/* Reset detected */
++
++/* MACROS */
++#define qla2x00_is_portname_equal(N1,N2) \
++	((memcmp((N1),(N2),WWN_SIZE)==0?TRUE:FALSE))
++#define qla2x00_is_nodename_equal(N1,N2) \
++	((memcmp((N1),(N2),WWN_SIZE)==0?TRUE:FALSE))
++#if 0
++#define qla2x00_allocate_path_list() \
++    ((mp_path_list_t *)KMEM_ZALLOC(sizeof(mp_path_list_t)))
++#endif
++
++/*
++ * Per-multipath driver parameters
++ */
++typedef struct _mp_lun_data {
++	uint8_t 	data[MAX_LUNS];
++#define LUN_DATA_ENABLED		BIT_7
++#define LUN_DATA_PREFERRED_PATH		BIT_6
++}
++mp_lun_data_t;
++
++
++#define PATH_INDEX_INVALID		0xff
++
++/*
++ * Per-device collection of all paths.
++ */
++typedef struct _mp_path_list {
++	struct _mp_path *last;		/* ptrs to end of circular list of paths */
++	uint8_t		path_cnt;	/* number of paths */
++	uint8_t		visible;	/* visible path */
++	uint16_t	reserved1;	/* Memory alignment */
++	uint32_t	reserved2;	/* Memory alignment */
++	uint8_t		current_path[ MAX_LUNS_PER_DEVICE ]; /* current path for a given lun */
++	uint16_t	failover_cnt[ FAILOVER_TYPE_COUNT ];
++}
++mp_path_list_t;
++
++/*
++ * Definitions for failover notify SRBs.  These SRBs contain failover notify
++ * CDBs to notify a target that a failover has occurred.
++ *
++ */
++typedef struct _failover_notify_srb {
++	srb_t		*srb;
++	uint16_t	status;
++	uint16_t	reserved;
++}
++failover_notify_srb_t;
++
++/*
++ * Per-device multipath control data.
++ */
++typedef struct _mp_device {
++	mp_path_list_t	*path_list;		/* Path list for device.  */
++	int				dev_id;
++	int			use_cnt;	/* number of users */
++	uint8_t         nodename[WWN_SIZE];	/* World-wide node name. */
++	/* World-wide port names. */
++	uint8_t         portnames[MAX_PATHS_PER_DEVICE][WWN_SIZE];
++}
++mp_device_t;
++
++/*
++ * Per-adapter multipath Host
++ */
++typedef struct _mp_host {
++	struct _mp_host	*next;	/* ptr to next host adapter in list */
++	scsi_qla_host_t	*ha;	/* ptr to lower-level driver adapter struct */
++	int		instance;	/* OS instance number */
++	struct list_head *fcports;	/* Port chain for this adapter */
++	mp_device_t	*mp_devs[MAX_MP_DEVICES]; /* Multipath devices */
++
++	uint32_t	flags;
++#define MP_HOST_FLAG_NEEDS_UPDATE  BIT_0  /* Need to update device data. */
++#define MP_HOST_FLAG_FO_ENABLED	   BIT_1  /* Failover enabled for this host */
++#define MP_HOST_FLAG_DISABLE	   BIT_2  /* Bypass qla_cfg. */
++#define MP_HOST_FLAG_LUN_FO_ENABLED   BIT_3  /* lun Failover enabled */
++
++	uint8_t		nodename[WWN_SIZE];
++	uint8_t		portname[WWN_SIZE];
++	uint16_t	MaxLunsPerTarget;
++
++	uint16_t	relogin_countdown;
++}
++mp_host_t;
++
++/*
++ * Describes path a single.
++ */
++typedef struct _mp_path {
++	struct _mp_path  *next;			/* next path in list  */
++	struct _mp_host *host;			/* Pointer to adapter */
++	fc_port_t	*port;			/* FC port info  */
++	uint16_t       id;			/* Path id (index) */
++	uint8_t        mp_byte;			/* Multipath control byte */
++#define MP_MASK_HIDDEN	0x80
++#define MP_MASK_UNCONFIGURED	0x40
++#define MP_MASK_PRIORITY	0x07
++
++	uint8_t        relogin;			/* Need to relogin to port */
++	uint8_t        config;			/* User configured path	*/
++	uint8_t        reserved[3];
++	mp_lun_data_t	lun_data;		/* Lun data information */
++	uint8_t        portname[WWN_SIZE];	/* Port name of this target. */
++}
++mp_path_t;
++
++/*
++ * Failover notification requests from host driver.
++ */
++typedef struct failover_notify_entry {
++	struct scsi_address		*os_addr;
++}
++failover_notify_t;
++
++#endif /* _QLA_CFG_H */
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_cfgln.c	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,726 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++/*
++ * QLogic ISP2x00 Multi-path LUN Support Driver 
++ * Solaris specific functions
++ *
++ */
++
++#include "qla_os.h"
++#include "qla_def.h"
++
++#include "qlfo.h"
++
++#define MAX_SEARCH_STR_SIZE	512
++
++/*
++ * qla2x00_set_lun_data_from_config
++ * Set lun_data byte from the configuration parameters.
++ *
++ * Input:
++ * host -- pointer to host adapter structure.
++ * port -- pointer to port
++ * tgt  -- target number
++ * dev_no  -- device number
++ */
++void
++qla2x00_set_lun_data_from_config(mp_host_t *host, fc_port_t *port,
++    uint16_t tgt, uint16_t dev_no)
++{
++	char		*propbuf;  /* As big as largest search string */
++	int		rval;
++	int16_t		lun, l;
++	scsi_qla_host_t *ha = host->ha;
++	mp_device_t	*dp;
++	lun_bit_mask_t	*plun_mask;
++	lun_bit_mask_t  *mask_ptr;
++	mp_path_list_t	*pathlist;
++#if 0
++	uint8_t		control_byte;
++#endif
++
++	mp_path_t *path;
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&propbuf,
++	    MAX_SEARCH_STR_SIZE)) {
++		/* not enough memory */
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "propbuf requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    MAX_SEARCH_STR_SIZE);)
++		return;
++	}
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&plun_mask,
++	    sizeof(lun_bit_mask_t))) {
++		/* not enough memory */
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "lun_mask requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(lun_bit_mask_t));)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return;
++	}
++	mask_ptr = plun_mask;
++
++	dp = host->mp_devs[tgt];
++	if (dp == NULL) {
++		printk("qla2x00_set_lun_data_from_config: Target %d "
++		    "not found for hba %d\n",tgt, host->instance);
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return;
++	}
++	if ( (pathlist = dp->path_list) == NULL ) {
++		printk("qla2x00_set_lun_data_from_config: path list "
++		    "not found for target %d\n", tgt);
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return;
++	}
++
++	if ((path = qla2x00_find_path_by_name(host, pathlist,
++	    port->port_name)) == NULL ) {
++		printk("qla2x00_set_lun_data_from_config: No path found "
++		    "for target %d\n", tgt);
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return;
++	}
++
++	/* clear port information */
++	path->port = NULL;
++
++#if 0
++	/* 02/06/01 - move to build path tree */
++	/*
++	 * Get "target-N-device-N-control" if property is present then all
++	 * luns are visible.
++	 */
++	sprintf(propbuf, "scsi-qla%d-tgt-%d-di-%d-control",
++			host->instance, tgt, dev_no);
++	DEBUG3(printk("build_tree: %s\n",propbuf);)
++	rval = qla2x00_get_prop_xstr(ha, propbuf,
++			(uint8_t *)(&control_byte), sizeof(control_byte));
++	if (rval != -1) {
++		if (!((control_byte & MP_MASK_HIDDEN) ||
++			(control_byte & MP_MASK_UNCONFIGURED))) {
++			pathlist->visible = path->id;
++			DEBUG(printk("qla2x00_set_lun_data_from_config: "
++					"found visible path id %d hba %d\n",
++					path->id, host->instance);)
++		} else {
++			pathlist->visible = PATH_INDEX_INVALID; /* 01/30 */
++			DEBUG(printk("qla2x00_set_lun_data_from_config: "
++					"found hidden path id %d hba %d\n",
++					path->id, host->instance);)
++		}
++		path->mp_byte = control_byte;
++		DEBUG(printk("qla2x00_set_lun_data_from_config: "
++				"control byte 0x%x for path id %d hba %d\n",
++				path->mp_byte, path->id, host->instance);)
++	}
++#endif
++
++	/* Get "target-N-device-N-preferred" as a 256 bit lun_mask*/
++	sprintf(propbuf, "scsi-qla%ld-tgt-%d-di-%d-preferred",
++	    ha->instance, tgt, dev_no);
++	DEBUG2(printk("build_tree: %s\n",propbuf);)
++
++	rval = qla2x00_get_prop_xstr(ha, propbuf,
++	    (uint8_t *)(plun_mask), sizeof(lun_bit_mask_t));
++
++	if (rval == -1) {
++		/* EMPTY */
++		DEBUG2(printk("qla2x00_set_lun_data_from_config: "
++		    "NO Preferred mask  - ret %d\n", rval);)
++	} else {
++		if (rval != sizeof(lun_bit_mask_t)) {
++			/* EMPTY */
++			printk("qla2x00_set_lun_data_from_config: "
++			    "Preferred mask len %d is incorrect.\n", rval);
++		}
++
++		DEBUG3(printk("qla2x00_set_lun_data_from_config: "
++		    "Preferred mask read:\n");)
++		DEBUG3(qla2x00_dump_buffer((char *)plun_mask,
++		    sizeof(lun_bit_mask_t));)
++
++		for (lun = MAX_LUNS-1, l =0; lun >= 0; lun--, l++ ) {
++			if (EXT_IS_LUN_BIT_SET(mask_ptr, lun)) {
++				path->lun_data.data[l] |=
++				    LUN_DATA_PREFERRED_PATH;
++				pathlist->current_path[l] = path->id;
++			} else {
++				path->lun_data.data[l] &=
++				    ~LUN_DATA_PREFERRED_PATH;
++			}
++		}
++
++	}
++
++	/* Get "target-N-device-N-lun-disable" as a 256 bit lun_mask*/
++	sprintf(propbuf, "scsi-qla%ld-tgt-%d-di-%d-lun-disabled",
++	    ha->instance, tgt, dev_no);
++	DEBUG3(printk("build_tree: %s\n",propbuf);)
++
++	rval = qla2x00_get_prop_xstr(ha, propbuf,
++	    (uint8_t *)plun_mask, sizeof(lun_bit_mask_t));
++	if (rval == -1) {
++		/* default: all luns enabled */
++		for (lun = 0; lun < MAX_LUNS; lun++) {
++			path->lun_data.data[lun] |= LUN_DATA_ENABLED;
++		}
++	} else {
++		if (rval != sizeof(lun_bit_mask_t)) {
++			printk("qla2x00_set_lun_data_from_config: Enable "
++			    "mask has wrong size %d != %d\n",
++			    rval, (int)sizeof(lun_bit_mask_t));
++		} else {
++			for (lun = MAX_LUNS-1, l =0; lun >= 0; lun--, l++) {
++				/* our bit mask is inverted */
++				if (!EXT_IS_LUN_BIT_SET(mask_ptr,lun))
++					path->lun_data.data[l] |=
++					    LUN_DATA_ENABLED;
++				else
++					path->lun_data.data[l] &=
++					    ~LUN_DATA_ENABLED;
++			}
++		}
++	}
++
++	DEBUG3(printk("qla2x00_set_lun_data_from_config: Luns data for "
++	    "device %p, instance %d, path id=%d\n",
++	    dp,host->instance,path->id);)
++	DEBUG3(qla2x00_dump_buffer((char *)&path->lun_data.data[0], 64);)
++
++	qla2x00_free_ioctl_scrap_mem(ha);
++	LEAVE("qla2x00_set_lun_data_from_config");
++}
++
++
++
++/*
++ * qla2x00_cfg_build_path_tree
++ *	Find all path properties and build a path tree. The
++ *  resulting tree has no actual port assigned to it
++ *  until the port discovery is done by the lower level.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *
++ * Context:
++ *	Kernel context.
++ */
++void
++qla2x00_cfg_build_path_tree(scsi_qla_host_t *ha)
++{
++	char		*propbuf;
++	uint8_t		node_name[WWN_SIZE];
++	uint8_t		port_name[WWN_SIZE];
++	fc_port_t	*port;
++	uint16_t	dev_no = 0, tgt_no;
++	int		instance, rval;
++	mp_host_t	*host = NULL;
++	uint8_t		*name;
++	int		done;
++	uint8_t         control_byte;
++
++
++	ENTER("qla2x00_cfg_build_path_tree");
++
++	printk(KERN_INFO
++	    "qla02%d: ConfigRequired is set. \n", (int)ha->instance);
++	DEBUG(printk("qla2x00_cfg_build_path_tree: hba =%d",
++	    (int)ha->instance);)
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&propbuf,
++	    MAX_SEARCH_STR_SIZE)) {
++		/* not enough memory */
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "propbuf requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    MAX_SEARCH_STR_SIZE);)
++		return;
++	}
++
++	/* Look for adapter nodename in properties */
++	sprintf(propbuf, "scsi-qla%ld-adapter-port", ha->instance);
++	DEBUG(printk("build_tree: %s\n",propbuf);)
++
++	rval = qla2x00_get_prop_xstr(ha, propbuf, port_name, WWN_SIZE);
++	if (rval != WWN_SIZE) {
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return;
++	}
++
++	/* Does nodename match the host adapter nodename? */
++	name = 	&ha->init_cb->port_name[0];
++	if (!qla2x00_is_nodename_equal(name, port_name)) {
++		printk(KERN_INFO
++		    "scsi(%d): Adapter nodenames don't match - ha = %p.\n",
++		    (int)ha->instance,ha);
++		DEBUG(printk("qla(%d): Adapter nodenames don't match - "
++		    "ha = %p.\n",
++		    (int)ha->instance,ha);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return;
++	}
++
++	instance = ha->instance;
++	if ((host = qla2x00_alloc_host(ha)) == NULL) {
++		printk(KERN_INFO
++		    "scsi(%d): Couldn't allocate host - ha = %p.\n",
++		    (int)instance,ha);
++	} else {
++		/* create a dummy port */
++		port = (fc_port_t *)KMEM_ZALLOC(sizeof (fc_port_t),9);
++		if (port == NULL) {
++			printk(KERN_INFO
++			    "scsi(%d): Couldn't allocate port.\n",
++			    (int)instance);
++			DEBUG(printk("qla(%d): Couldn't allocate port.\n",
++			    (int)host->instance);)
++			/* remove host */
++			qla2x00_free_ioctl_scrap_mem(ha);
++			return;
++		}
++
++		done = 0;
++
++		/* For each target on the host bus adapter */
++		for (tgt_no = 0; tgt_no < MAX_MP_DEVICES &&
++		    !done; tgt_no++) {
++
++			/* get all paths for this target */
++			for (dev_no = 0; dev_no < MAX_PATHS_PER_DEVICE &&
++			    !done ; dev_no++) {
++
++				/*
++				 * O(N*M) scan, should ideally check if there
++				 * are any tgt entries present, if not, then
++				 * continue.
++				 *
++				 *   sprintf(propbuf,
++				 * 		"scsi-qla%d-tgt-%d-",
++				 *		instance, tgt_no);
++				 *   if (strstr(ha->cmdline, propbuf) == NULL)
++				 *	continue;
++				 *
++				 */
++				memset(port, 0, sizeof (fc_port_t));
++
++				/*
++				 * Get "target-N-device-N-node" is a 16-chars
++				 * number
++				 */
++				sprintf(propbuf, "scsi-qla%d-tgt-%d-di-%d-node",
++				    instance, tgt_no, dev_no);
++				DEBUG(printk("build_tree: %s\n",propbuf);)
++
++				rval = qla2x00_get_prop_xstr(ha, propbuf,
++				    node_name, WWN_SIZE);
++				if (rval != WWN_SIZE)
++					continue;
++
++				memcpy(port->node_name, node_name, WWN_SIZE);
++
++				/*
++				 * Get "target-N-device-N-port" is a 16-chars
++				 * number
++				 */
++				sprintf(propbuf, "scsi-qla%d-tgt-%d-di-%d-port",
++				    instance,  tgt_no, dev_no);
++				DEBUG(printk("build_tree: %s\n",propbuf);)
++
++				rval = qla2x00_get_prop_xstr(ha, propbuf,
++				    port_name, WWN_SIZE);
++				if (rval != WWN_SIZE)
++					continue;
++
++				memcpy(port->node_name, node_name, WWN_SIZE);
++				memcpy(port->port_name, port_name, WWN_SIZE);
++				port->flags |= FC_CONFIG;
++
++				/*
++				 * Get "target-N-device-N-control" if property 
++				 * is present then all luns are visible.
++				 */
++				sprintf(propbuf,
++				    "scsi-qla%d-tgt-%d-di-%d-control",
++				    instance, tgt_no, dev_no);
++				DEBUG3(printk("build_tree: %s\n",propbuf);)
++
++				rval = qla2x00_get_prop_xstr(ha, propbuf,
++				    (uint8_t *)(&control_byte),
++				    sizeof(control_byte));
++				if (rval == -1) {
++					/* error getting string. go to next. */
++					continue;
++				}
++
++				DEBUG(printk("build_tree: control byte 0x%x\n",
++				    control_byte);)
++
++				port->mp_byte = control_byte;
++				DEBUG(printk("build_tree: update_mp_device "
++				    "host=%p, port=%p, tgt_no=%d\n",
++				    host, port, tgt_no);)
++
++				qla2x00_update_mp_device(host, port, tgt_no);
++				qla2x00_set_lun_data_from_config(host,
++				    port, tgt_no, dev_no);
++			}
++		}
++		KMEM_FREE(port, sizeof (fc_port_t));
++	}
++
++	qla2x00_free_ioctl_scrap_mem(ha);
++
++	LEAVE("qla2x00_cfg_build_path_tree");
++	DEBUG(printk("Leaving: qla2x00_cfg_build_path_tree\n");)
++}
++
++/*
++ * qla2x00_cfg_display_devices
++ *      This routine will the node names of the different devices found
++ *      after port inquiry.
++ *
++ * Input:
++ *
++ * Returns:
++ *      None.
++ */
++void qla2x00_cfg_display_devices(void)
++{
++	mp_host_t     *host;
++	int     id;
++	mp_device_t	*dp;
++	mp_path_t  *path;
++	mp_path_list_t	*path_list;
++	int cnt, i, dev_no;
++	int instance;
++	lun_bit_mask_t	lun_mask;
++	int	mask_set;
++	uint8_t	l;
++
++	printk("qla2x00_cfg_display_devices\n");
++	for (host = mp_hosts_base; (host); host = host->next) {
++
++		instance = (int) host->instance;
++		/* Display the node name for adapter */
++		printk(KERN_INFO
++			"scsi-qla%d-adapter-port="
++			"%02x%02x%02x%02x%02x%02x%02x%02x\\;\n",
++			instance,
++			host->portname[0],
++			host->portname[1],
++			host->portname[2],
++			host->portname[3],
++			host->portname[4],
++			host->portname[5],
++			host->portname[6],
++			host->portname[7]);
++
++		for (id = 0; id < MAX_MP_DEVICES; id++) {
++			if( (dp = host->mp_devs[id] ) == NULL )
++				continue;
++
++			path_list = dp->path_list;
++
++
++			if( (path = path_list->last) != NULL ) {
++				/* Print out device port names */
++				path = path->next; /* first path */
++				for (dev_no = 0,  cnt = 0;
++					cnt < path_list->path_cnt;
++					path = path->next, cnt++) {
++
++					/* skip others if not our host */
++					if (host != path->host)
++						continue;
++					printk(KERN_INFO
++						"scsi-qla%d-tgt-%d-di-%d-node="
++						"%02x%02x%02x%02x"
++						"%02x%02x%02x%02x\\;\n",
++						instance, id, path->id,
++						dp->nodename[0],
++						dp->nodename[1],
++						dp->nodename[2],
++						dp->nodename[3],
++						dp->nodename[4],
++						dp->nodename[5],
++						dp->nodename[6],
++						dp->nodename[7]);
++
++					/* port_name */
++					printk(KERN_INFO
++						"scsi-qla%d-tgt-%d-di-%d-port="
++						"%02x%02x%02x%02x"
++						"%02x%02x%02x%02x\\;\n",
++						instance, id, path->id,
++						path->portname[0],
++						path->portname[1],
++						path->portname[2],
++						path->portname[3],
++						path->portname[4],
++						path->portname[5],
++						path->portname[6],
++						path->portname[7]);
++
++					/* control byte */
++					printk(KERN_INFO
++						"scsi-qla%d-tgt-%d-di-%d-"
++						"control=%02x\\;\n",
++						instance, id, path->id,
++						path->mp_byte);
++
++					/*
++					 * Build preferred bit mask for this
++					 * path */
++					memset(&lun_mask, 0, sizeof(lun_mask));
++					mask_set = 0;
++					for (i = 0; i < MAX_LUNS; i++) {
++						l = (uint8_t)(i & 0xFF);
++						if (path_list->current_path[l] == path->id ) {
++							EXT_SET_LUN_BIT((&lun_mask),l);
++							mask_set++;
++						}
++					}
++					if (mask_set) {
++						printk(KERN_INFO
++							"scsi-qla%d-tgt-%d-di-%d-preferred=%08x%08x%08x%08x%08x%08x%08x%08x\\;\n",
++							instance,  id, path->id,
++							*((uint32_t *) &lun_mask.mask[28]),
++							*((uint32_t *) &lun_mask.mask[24]),
++							*((uint32_t *) &lun_mask.mask[20]),
++							*((uint32_t *) &lun_mask.mask[16]),
++							*((uint32_t *) &lun_mask.mask[12]),
++							*((uint32_t *) &lun_mask.mask[8]),
++							*((uint32_t *) &lun_mask.mask[4]),
++							*((uint32_t *) &lun_mask.mask[0]) );
++					}
++					/*
++					 * Build disable bit mask for this path
++					 */
++					mask_set = 0;
++					for (i = 0; i < MAX_LUNS; i++) {
++						l = (uint8_t)(i & 0xFF);
++						if (!(path->lun_data.data[l] &
++							LUN_DATA_ENABLED) ) {
++
++							mask_set++;
++						}
++					}
++					if (mask_set) {
++						printk(KERN_INFO
++							"scsi-qla%d-tgt-%d-di-%d-lun-disable=%08x%08x%08x%08x%08x%08x%08x%08x\\;\n",
++							instance,  id, path->id,
++							*((uint32_t *) &lun_mask.mask[28]),
++							*((uint32_t *) &lun_mask.mask[24]),
++							*((uint32_t *) &lun_mask.mask[20]),
++							*((uint32_t *) &lun_mask.mask[16]),
++							*((uint32_t *) &lun_mask.mask[12]),
++							*((uint32_t *) &lun_mask.mask[8]),
++							*((uint32_t *) &lun_mask.mask[4]),
++							*((uint32_t *) &lun_mask.mask[0]) );
++					}
++					dev_no++;
++				}
++
++			}
++		}
++	}
++}
++
++#if 0
++int qla2x00_cfg_build_range( mp_path_t *path, uint8_t *buf, int siz, uint8_t mask )
++{
++        int 	i;
++        int	max, min;
++        int	colonflg = FALSE;
++        int	len = 0;
++
++        max = -1;
++        min = 0;
++        for (i = 0; i < MAX_LUNS; i++) {
++                if( (path->lun_data.data[i] & mask) ) {
++                        max = i;
++                } else {
++                        if( colonflg && max >= min ) {
++                                len += sprintf(&buf[len],":");
++                                if( len > siz)
++                                        return len;
++                                colonflg = FALSE;
++                        }
++                        if (max > min ) {
++                                len += sprintf(&buf[len],"%02x-%02x",min,max);
++                                if( len > siz)
++                                        return len;
++                                colonflg = TRUE;
++                        } else if ( max == min ) {
++                                len += sprintf(&buf[len],"%02x",max);
++                                if( len > siz)
++                                        return len;
++                                colonflg = TRUE;
++                        }
++                        min = i + 1;
++                        max = i;
++                }
++        }
++        DEBUG4(printk("build_range: return len =%d\n",len);)
++        return(len);
++}
++#endif
++
++#if 0
++/*
++ * qla2x00_cfg_proc_display_devices
++ *      This routine will the node names of the different devices found
++ *      after port inquiry.
++ *
++ * Input:
++ *
++ * Returns:
++ *      None.
++ */
++int qla2x00_cfg_proc_display_devices(scsi_qla_host_t *ha)
++{
++        mp_host_t     *host;
++        int     id;
++        mp_device_t	*dp;
++        mp_path_t  *path;
++        mp_path_list_t	*path_list;
++        int cnt, i;
++        int instance;
++        lun_bit_mask_t	lun_mask;
++        int	mask_set;
++        uint8_t	l;
++        fc_port_t 	*port;
++        int len = 0;
++
++        for (host = mp_hosts_base; (host); host = host->next) {
++
++                if( host->ha != ha )
++                        continue;
++
++                instance = (int) host->instance;
++
++                /* Display the node name for adapter */
++                len += sprintf(PROC_BUF,
++                                "scsi-qla%d-adapter-node="
++				"%02x%02x%02x%02x%02x%02x%02x%02x;\n",
++                                instance,
++                                host->nodename[0],
++                                host->nodename[1],
++                                host->nodename[2],
++                                host->nodename[3],
++                                host->nodename[4],
++                                host->nodename[5],
++                                host->nodename[6],
++                                host->nodename[7]);
++
++
++                for (id = 0; id < MAX_MP_DEVICES; id++) {
++                        if( (dp = host->mp_devs[id] ) == NULL )
++                                continue;
++
++                        path_list = dp->path_list;
++
++                        if( (path = path_list->last) != NULL ) {
++                                /* Print out device port names */
++                                path = path->next; /* first path */
++                                for (cnt = 0; cnt < path_list->path_cnt; path = path->next, cnt++) {
++                                        /* skip others if not our host */
++                                        if (host != path->host)
++                                                continue;
++                                        len += sprintf(PROC_BUF,
++                                                       "scsi-qla%d-target-%d-path-%d-node=%02x%02x%02x%02x%02x%02x%02x%02x;\n",
++                                                       instance,  id, path->id,
++                                                       dp->nodename[0],
++                                                       dp->nodename[1],
++                                                       dp->nodename[2],
++                                                       dp->nodename[3],
++                                                       dp->nodename[4],
++                                                       dp->nodename[5],
++                                                       dp->nodename[6],
++                                                       dp->nodename[7]);
++
++                                        /* port_name */
++                                        len += sprintf(PROC_BUF,
++                                                       "scsi-qla%d-target-%d-path-%d-port=%02x%02x%02x%02x%02x%02x%02x%02x;\n",
++                                                       instance,  id, path->id,
++                                                       path->portname[0],
++                                                       path->portname[1],
++                                                       path->portname[2],
++                                                       path->portname[3],
++                                                       path->portname[4],
++                                                       path->portname[5],
++                                                       path->portname[6],
++                                                       path->portname[7]);
++
++                                        if( path_list->visible == path->id ) {
++                                                len += sprintf(PROC_BUF, "scsi-qla%d-target-%d-path-%d-visible=%02x;\n",
++                                                               instance,  id, path->id, path->id);
++                                        }
++
++                                        len +=sprintf(PROC_BUF, "scsi-qla%d-target-%d-path-%d-control=%02x;\n",
++                                                      instance,  id, path->id, path->mp_byte);
++
++                                        /* Build preferred bit mask for this path */
++                                        memset(&lun_mask, 0, sizeof(lun_mask));
++                                        mask_set = 0;
++                                        for (i = 0; i < MAX_LUNS_PER_DEVICE; i++) {
++                                                l = (uint8_t)(i & 0xFF);
++                                                if( path_list->current_path[l] == path->id ) {
++                                                        EXT_SET_LUN_BIT((&lun_mask),l);
++                                                        mask_set++;
++                                                }
++                                        }
++                                        if( mask_set && EXT_DEF_MAX_LUNS <= 256 ) {
++                                                len += sprintf(PROC_BUF,
++                                                               "scsi-qla%d-target-%d-path-%d-preferred=%08x%08x%08x%08x%08x%08x%08x%08x;\n",
++                                                               instance,  id, path->id,
++                                                               *((uint32_t *) &lun_mask.mask[0]),
++                                                               *((uint32_t *) &lun_mask.mask[4]),
++                                                               *((uint32_t *) &lun_mask.mask[8]),
++                                                               *((uint32_t *) &lun_mask.mask[12]),
++                                                               *((uint32_t *) &lun_mask.mask[16]),
++                                                               *((uint32_t *) &lun_mask.mask[20]),
++                                                               *((uint32_t *) &lun_mask.mask[24]),
++                                                               *((uint32_t *) &lun_mask.mask[28]) );
++                                        }
++
++                                        len += sprintf(PROC_BUF,
++                                                       "scsi-qla%d-target-%d-path-%d-lun-enable=%08x%08x%08x%08x%08x%08x%08x%08x;\n",
++                                                       instance,  id, path->id,
++                                                       *((uint32_t *) &path->lun_data.data[0]),
++                                                       *((uint32_t *) &path->lun_data.data[4]),
++                                                       *((uint32_t *) &path->lun_data.data[8]),
++                                                       *((uint32_t *) &path->lun_data.data[12]),
++                                                       *((uint32_t *) &path->lun_data.data[16]),
++                                                       *((uint32_t *) &path->lun_data.data[20]),
++                                                       *((uint32_t *) &path->lun_data.data[24]),
++                                                       *((uint32_t *) &path->lun_data.data[28]) );
++
++                                } /* for */
++                        }
++                }
++        }
++        return( len );
++}
++#endif
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_dbg.c	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,1000 @@
++/*
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ */
++#include "qla_os.h"
++
++#include "qla_def.h"
++
++
++#if defined(ISP2300)
++/**
++ * qla2x00_fw_dump() - Dumps binary data from the 2300 firmware.
++ * @ha: SCSI driver HA context
++ * @hardware_locked: Called with the hardware_lock
++ */
++void
++qla2x00_dump_isp(scsi_qla_host_t *ha, int hardware_locked)
++{
++	int		rval;
++	uint32_t	i;
++	uint32_t	cnt, timer;
++	uint32_t	risc_address;
++	uint16_t	risc_code_size;
++	uint16_t	mb0, mb2;
++
++	uint16_t	data, stat;
++	device_reg_t	*reg;
++	uint16_t	*dmp_reg;
++	unsigned long	flags;
++
++
++	reg = ha->iobase;
++	flags = 0;
++
++	if (!hardware_locked)
++		spin_lock_irqsave(&ha->hardware_lock, flags);
++
++	printk("\n\n[==>BEG]\n");
++
++	printk("HCCR Register:\n");
++	printk("%04x\n\n", RD_REG_WORD(&reg->hccr));
++
++	WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC); 
++	SYS_DELAY(100);
++
++	printk("PBIU Registers:\n");
++	dmp_reg = (uint16_t *)(reg + 0);
++	for (i = 0; i < 8; i++) 
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++
++	printk("\n\n");
++
++	printk("ReqQ-RspQ-Risc2Host Status registers:\n");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x10);
++	for (i = 0; i < 8; i++) 
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++
++	printk("\n\n");
++
++	printk("Mailbox Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x40);
++	for (i = 0; i < 32; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->ctrl_status, 0x40);
++	printk("Auto Request Response DMA Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 32; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->ctrl_status, 0x50); 
++	printk("DMA Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 48; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->ctrl_status, 0x00); 
++	printk("RISC Hardware Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0xA0);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->pcr, 0x2000); 
++	printk("RISC GP0 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->pcr, 0x2200); 
++	printk("RISC GP1 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->pcr, 0x2400); 
++	printk("RISC GP2 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->pcr, 0x2600); 
++	printk("RISC GP3 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->pcr, 0x2800); 
++	printk("RISC GP4 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->pcr, 0x2A00); 
++	printk("RISC GP5 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->pcr, 0x2C00); 
++	printk("RISC GP6 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->pcr, 0x2E00); 
++	printk("RISC GP7 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->ctrl_status, 0x10); 
++	printk("Frame Buffer Hardware Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 64; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->ctrl_status, 0x20); 
++	printk("FPM B0 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 64; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->ctrl_status, 0x30); 
++	printk("FPM B1 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 64; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
++
++	data = RD_REG_WORD(&reg->ctrl_status);
++	for (i = 6000000; i && data & CSR_ISP_SOFT_RESET; i--) {
++		SYS_DELAY(5);
++		data = RD_REG_WORD(&reg->ctrl_status);
++	}
++	if (ha->pdev->device == QLA2312_DEVICE_ID ||
++	    ha->pdev->device == QLA2322_DEVICE_ID) {
++		SYS_DELAY(10);
++	} else {
++		data = RD_REG_WORD(&reg->mailbox0);
++		for (i = 6000000; i && data == MBS_BUSY; i--) {
++			SYS_DELAY(5);
++			data = RD_REG_WORD(&reg->mailbox0);
++		}
++	}
++
++	rval = QLA2X00_SUCCESS;
++	mb0 = mb2 = 0;
++	printk("Code RAM Dump:");
++	risc_address      = 0x800;
++	risc_code_size    = 0xffff - 0x800 + 1;
++	WRT_REG_WORD(&reg->mailbox0, MBC_READ_RAM_WORD);
++	clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
++	for (cnt = 0; cnt < risc_code_size && rval == QLA2X00_SUCCESS; cnt++) {
++		if ((cnt % 8) == 0)
++			printk("\n%04x: ", cnt + 0x0800);
++		WRT_REG_WORD(&reg->mailbox1, (uint16_t)risc_address++);
++		WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
++
++		for (timer = 6000000; timer != 0; timer--) {
++			/* Check for pending interrupts. */
++			if ((stat = RD_REG_WORD(&reg->host_status_lo)) & HSR_INT) {
++				stat &= 0xff;
++
++				if (stat == 0x1 || stat == 0x2) {
++					set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
++
++					mb0 = RD_REG_WORD(&reg->mailbox0);
++					mb2 = RD_REG_WORD(&reg->mailbox2);
++
++					/* Release mailbox registers. */
++					WRT_REG_WORD(&reg->semaphore, 0);
++					WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
++					break;
++				} else if (stat == 0x10 || stat == 0x11) {
++					set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
++
++					mb0 = RD_REG_WORD(&reg->mailbox0);
++					mb2 = RD_REG_WORD(&reg->mailbox2);
++
++					WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
++					break;
++				}
++
++				/* clear this intr; it wasn't a mailbox intr */
++				WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
++			}
++
++			mdelay(5);
++		}
++
++		if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
++			rval = mb0 & MBS_MASK;
++			printk("%04x ", mb2);
++		} else {
++			rval = QLA2X00_FUNCTION_FAILED;
++		}
++	}
++
++	printk("\n\n");
++
++	mb0 = mb2 = 0;
++	printk("Stack RAM Dump:");
++	risc_address      = 0x10000;
++	risc_code_size    = 0x107ff - 0x10000 + 1;
++	WRT_REG_WORD(&reg->mailbox0, 0xf /* MBC_READ_RAM_EXTENDED */);
++	clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
++
++	for (cnt = 0; cnt < risc_code_size && rval == QLA2X00_SUCCESS; cnt++) {
++		if ((cnt % 8) == 0)
++			printk("\n%05x: ", cnt + 0x10000);
++		WRT_REG_WORD(&reg->mailbox1, LSW(risc_address));
++		WRT_REG_WORD(&reg->mailbox8, MSW(risc_address++));
++		WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
++
++		for (timer = 6000000; timer != 0; timer--) {
++			/* Check for pending interrupts. */
++			if ((stat = RD_REG_WORD(&reg->host_status_lo)) & HSR_INT) {
++				stat &= 0xff;
++
++				if (stat == 0x1 || stat == 0x2) {
++					set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
++
++					mb0 = RD_REG_WORD(&reg->mailbox0);
++					mb2 = RD_REG_WORD(&reg->mailbox2);
++
++					/* Release mailbox registers. */
++					WRT_REG_WORD(&reg->semaphore, 0);
++					WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
++					break;
++				} else if (stat == 0x10 || stat == 0x11) {
++					set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
++
++					mb0 = RD_REG_WORD(&reg->mailbox0);
++					mb2 = RD_REG_WORD(&reg->mailbox2);
++
++					WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
++					break;
++				}
++
++				/* clear this intr; it wasn't a mailbox intr */
++				WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
++			}
++
++			mdelay(5);
++		}
++
++		if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
++			rval = mb0 & MBS_MASK;
++			printk("%04x ", mb2);
++		} else {
++			rval = QLA2X00_FUNCTION_FAILED;
++		}
++	}
++
++	printk("\n\n");
++
++	mb0 = mb2 = 0;
++	printk("Data RAM Dump:");
++	risc_address      = 0x10800;
++	risc_code_size    = 0x1ffff - 0x10800 + 1;
++	WRT_REG_WORD(&reg->mailbox0, 0xf /* MBC_READ_RAM_EXTENDED */);
++	clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
++
++	for (cnt = 0; cnt < risc_code_size && rval == QLA2X00_SUCCESS; cnt++) {
++		if ((cnt % 8) == 0)
++			printk("\n%05x: ", cnt + 0x10800);
++		WRT_REG_WORD(&reg->mailbox1, LSW(risc_address));
++		WRT_REG_WORD(&reg->mailbox8, MSW(risc_address++));
++		WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
++
++		for (timer = 6000000; timer != 0; timer--) {
++			/* Check for pending interrupts. */
++			if ((stat = RD_REG_WORD(&reg->host_status_lo)) & HSR_INT) {
++				stat &= 0xff;
++
++				if (stat == 0x1 || stat == 0x2) {
++					set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
++
++					mb0 = RD_REG_WORD(&reg->mailbox0);
++					mb2 = RD_REG_WORD(&reg->mailbox2);
++
++					/* Release mailbox registers. */
++					WRT_REG_WORD(&reg->semaphore, 0);
++					WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
++					break;
++				} else if (stat == 0x10 || stat == 0x11) {
++					set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
++
++					mb0 = RD_REG_WORD(&reg->mailbox0);
++					mb2 = RD_REG_WORD(&reg->mailbox2);
++
++					WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
++					break;
++				}
++
++				/* clear this intr; it wasn't a mailbox intr */
++				WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
++			}
++
++			mdelay(5);
++		}
++
++		if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
++			rval = mb0 & MBS_MASK;
++			printk("%04x ", mb2);
++		} else {
++			rval = QLA2X00_FUNCTION_FAILED;
++		}
++	}
++
++	printk("\n[<==END] ISP DEBUG DUMP\n");
++
++	if (!hardware_locked)
++		spin_unlock_irqrestore(&ha->hardware_lock, flags);
++}
++
++#elif defined(ISP2200)
++
++/**
++ * qla2x00_fw_dump() - Dumps binary data from the 2200 firmware.
++ * @ha: SCSI driver HA context
++ * @hardware_locked: Called with the hardware_lock
++ */
++void
++qla2x00_dump_isp(scsi_qla_host_t *ha, int hardware_locked)
++{
++	int		rval;
++	uint32_t	i;
++	uint32_t	cnt, timer;
++	uint32_t	risc_address;
++	uint16_t	risc_code_size;
++	uint16_t	mb0, mb2;
++
++	uint16_t	data, stat;
++	device_reg_t	*reg;
++	uint16_t	*dmp_reg;
++	unsigned long	flags;
++
++
++	reg = ha->iobase;
++	flags = 0;
++
++	if (!hardware_locked)
++		spin_lock_irqsave(&ha->hardware_lock, flags);
++
++	printk("\n\n[==>BEG]\n");
++
++	printk("HCCR Register:\n");
++	printk("%04x\n\n", RD_REG_WORD(&reg->hccr));
++
++	/* Pause RISC. */
++	WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC); 
++	for (cnt = 30000; cnt; cnt--) {
++		if ((RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) != 0)
++			break;
++		SYS_DELAY(10);
++	}
++	if (!cnt)
++		goto done;
++
++	printk("PBIU Registers:\n");
++	dmp_reg = (uint16_t *)(reg + 0);
++	for (i = 0; i < 8; i++) 
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++
++	printk("\n\n");
++
++	printk("Mailbox Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x10);
++	for (i = 0; i < 32; i++) {
++		if (i == 8)
++			dmp_reg = (uint16_t *)((uint8_t *)reg + 0xe0);
++
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	printk("DMA Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x20);
++	for (i = 0; i < 48; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->ctrl_status, 0x00); 
++	printk("RISC Hardware Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0xA0);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->pcr, 0x2000); 
++	printk("RISC GP0 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->pcr, 0x2100); 
++	printk("RISC GP1 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->pcr, 0x2200); 
++	printk("RISC GP2 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->pcr, 0x2300); 
++	printk("RISC GP3 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->pcr, 0x2400); 
++	printk("RISC GP4 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->pcr, 0x2500); 
++	printk("RISC GP5 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->pcr, 0x2600); 
++	printk("RISC GP6 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->pcr, 0x2700); 
++	printk("RISC GP7 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->ctrl_status, 0x10); 
++	printk("Frame Buffer Hardware Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 16; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->ctrl_status, 0x20); 
++	printk("FPM B0 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 64; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->ctrl_status, 0x30); 
++	printk("FPM B1 Registers:");
++	dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
++	for (i = 0; i < 64; i++) {
++		if ((i % 8) == 0)
++			printk("\n");
++		printk("%04x ", RD_REG_WORD(dmp_reg++));
++	}
++
++	printk("\n\n");
++
++	WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
++
++	data = RD_REG_WORD(&reg->ctrl_status);
++	for (i = 6000000; i && data & CSR_ISP_SOFT_RESET; i--) {
++		SYS_DELAY(5);
++		data = RD_REG_WORD(&reg->ctrl_status);
++	}
++	data = RD_REG_WORD(&reg->mailbox0);
++	for (i = 6000000; i && data == MBS_BUSY; i--) {
++		SYS_DELAY(5);
++		data = RD_REG_WORD(&reg->mailbox0);
++	}
++
++	/* Pause RISC. */
++	WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC); 
++	for (cnt = 30000; cnt; cnt--) {
++		if ((RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) != 0)
++			break;
++		SYS_DELAY(10);
++	}
++	if (!cnt)
++		goto done;
++
++	rval = QLA2X00_SUCCESS;
++	mb0 = mb2 = 0;
++	printk("RISC SRAM:");
++	risc_address      = 0x1000;
++	risc_code_size    = 0xffff - 0x1000 + 1;
++	WRT_REG_WORD(&reg->mailbox0, MBC_READ_RAM_WORD);
++	clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
++	for (cnt = 0; cnt < risc_code_size && rval == QLA2X00_SUCCESS; cnt++) {
++		if ((cnt % 8) == 0)
++			printk("\n%04x: ", cnt + 0x1000);
++		WRT_REG_WORD(&reg->mailbox1, (uint16_t)risc_address++);
++		WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
++
++		for (timer = 6000000; timer != 0; timer--) {
++			/* Check for pending interrupts. */
++			if ((stat = RD_REG_WORD(&reg->host_status_lo)) & HSR_INT) {
++				stat &= 0xff;
++
++				if (stat == 0x1 || stat == 0x2) {
++					set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
++
++					mb0 = RD_REG_WORD(&reg->mailbox0);
++					mb2 = RD_REG_WORD(&reg->mailbox2);
++
++					/* Release mailbox registers. */
++					WRT_REG_WORD(&reg->semaphore, 0);
++					WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
++					break;
++				} else if (stat == 0x10 || stat == 0x11) {
++					set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
++
++					mb0 = RD_REG_WORD(&reg->mailbox0);
++					mb2 = RD_REG_WORD(&reg->mailbox2);
++
++					WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
++					break;
++				}
++
++				/* clear this intr; it wasn't a mailbox intr */
++				WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
++			}
++
++			mdelay(5);
++		}
++
++		if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
++			rval = mb0 & MBS_MASK;
++			printk("%04x ", mb2);
++		} else {
++			rval = QLA2X00_FUNCTION_FAILED;
++		}
++	}
++
++	printk("\n[<==END] ISP DEBUG DUMP\n");
++
++done:
++	if (!hardware_locked)
++		spin_unlock_irqrestore(&ha->hardware_lock, flags);
++}
++#else /* if defined(ISP2100) */
++
++/**
++ * qla2x00_fw_dump() - Dumps binary data from the 2100 firmware.
++ * @ha: SCSI driver HA context
++ * @hardware_locked: Called with the hardware_lock
++ *
++ * NOTE: On the ISP2100, this function will not be implemented.
++ */
++void
++qla2x00_dump_isp(scsi_qla_host_t *ha, int hardware_locked)
++{
++	/* NO-OP */
++	printk("\n\n[==>BEG]\n");
++	printk("\n[<==END] ISP DEBUG DUMP\n");
++}
++
++#endif /* if defined(ISP2300) */
++
++//FIXME
++
++/****************************************************************************/
++/*                         Driver Debug Functions.                          */
++/****************************************************************************/
++
++void 
++qla2x00_dump_regs(struct Scsi_Host *host) 
++{
++	/* Assumes non-memory mapped I/O */
++	printk("Mailbox registers:\n");
++	printk("scsi(%d): mbox 0 0x%04x \n",
++	    host->host_no, inw(host->io_port + 0x10));
++	printk("scsi(%d): mbox 1 0x%04x \n",
++	    host->host_no, inw(host->io_port + 0x12));
++	printk("scsi(%d): mbox 2 0x%04x \n",
++	    host->host_no, inw(host->io_port + 0x14));
++	printk("scsi(%d): mbox 3 0x%04x \n",
++	    host->host_no, inw(host->io_port + 0x16));
++	printk("scsi(%d): mbox 4 0x%04x \n",
++	    host->host_no, inw(host->io_port + 0x18));
++	printk("scsi(%d): mbox 5 0x%04x \n",
++	    host->host_no, inw(host->io_port + 0x1a));
++}
++
++
++void
++qla2x00_dump_buffer(uint8_t * b, uint32_t size) 
++{
++	uint32_t cnt;
++	uint8_t c;
++
++	printk(" 0   1   2   3   4   5   6   7   8   9   "
++	    "Ah  Bh  Ch  Dh  Eh  Fh\n");
++	printk("-----------------------------------------"
++	    "----------------------\n");
++
++	for (cnt = 0; cnt < size;) {
++		c = *b++;
++		printk("%02x",(uint32_t) c);
++		cnt++;
++		if (!(cnt % 16))
++			printk("\n");
++		else
++			printk("  ");
++	}
++	if (cnt % 16)
++		printk("\n");
++}
++
++/**************************************************************************
++ *   qla2x00_print_scsi_cmd
++ *	 Dumps out info about the scsi cmd and srb.
++ *   Input	 
++ *	 cmd : Scsi_Cmnd
++ **************************************************************************/
++void
++qla2x00_print_scsi_cmd(Scsi_Cmnd * cmd) 
++{
++	struct scsi_qla_host *ha;
++	struct Scsi_Host *host;
++	srb_t *sp;
++	struct os_lun *lq;
++	fc_port_t *fcport;
++
++	int i;
++
++	host = cmd->device->host;
++	ha = (struct scsi_qla_host *) host->hostdata;
++
++	sp = (srb_t *) CMD_SP(cmd);
++	printk("SCSI Command @= 0x%p, Handle=0x%08lx\n", 
++			cmd, (u_long) CMD_HANDLE(cmd));
++	printk("  chan=%d, target = 0x%02x, lun = 0x%02x, cmd_len = 0x%02x\n",
++			SCSI_BUS_32(cmd), SCSI_TCN_32(cmd), SCSI_LUN_32(cmd),
++			cmd->cmd_len);
++	printk(" CDB = ");
++	for (i = 0; i < cmd->cmd_len; i++) {
++		printk("0x%02x ", cmd->cmnd[i]);
++	}
++	printk("\n  seg_cnt =%d, retries=%d, serial_number_at_timeout=0x%lx\n",
++			cmd->use_sg,
++			cmd->retries, cmd->serial_number_at_timeout);
++	printk("  request buffer=0x%p, request buffer len=0x%x\n", 
++			cmd->request_buffer,
++			cmd->request_bufflen);
++	printk("  tag=%d, flags=0x%x, transfersize=0x%x \n", 
++			cmd->tag, cmd->flags, cmd->transfersize);
++	printk("  serial_number=%d, SP=%p\n", (int) cmd->serial_number,sp); 
++	printk("  data direction=%d\n", cmd->sc_data_direction);
++	if (sp) {
++		printk("  sp flags=0x%x\n", sp->flags);
++		printk("  r_start=0x%lx, u_start=0x%lx, "
++				"f_start=0x%lx, state=%d\n", 
++				sp->r_start, sp->u_start,
++				sp->f_start, sp->state);
++
++		lq = sp->lun_queue;
++		fcport = lq->fclun->fcport;
++		printk(" e_start= 0x%lx, ext_history= %d, "
++				"fo retry=%d, loopid =%x, port path=%d\n", 
++				sp->e_start, sp->ext_history,
++				sp->fo_retry_cnt,
++				fcport->loop_id, 
++				fcport->cur_path);
++	}
++}
++
++/*
++ * qla2x00_print_q_info
++ * 	 Prints queue info
++ * Input
++ *      q: lun queue	 
++ */ 
++void 
++qla2x00_print_q_info(struct os_lun *q) 
++{
++	printk("Queue info: flags=0x%lx\n", q->q_flag);
++}
++
++#if defined(QL_DEBUG_ROUTINES)
++/*
++ * qla2x00_formatted_dump_buffer
++ *       Prints string plus buffer.
++ *
++ * Input:
++ *       string  = Null terminated string (no newline at end).
++ *       buffer  = buffer address.
++ *       wd_size = word size 8, 16, 32 or 64 bits
++ *       count   = number of words.
++ */
++void
++qla2x00_formatted_dump_buffer(char *string, uint8_t * buffer, 
++				uint8_t wd_size, uint32_t count) 
++{
++	uint32_t cnt;
++	uint16_t *buf16;
++	uint32_t *buf32;
++
++	if (strcmp(string, "") != 0)
++		printk("%s\n",string);
++
++	switch (wd_size) {
++		case 8:
++			printk(" 0    1    2    3    4    5    6    7    "
++				"8    9    Ah   Bh   Ch   Dh   Eh   Fh\n");
++			printk("-----------------------------------------"
++				"-------------------------------------\n");
++
++			for (cnt = 1; cnt <= count; cnt++, buffer++) {
++				printk("%02x",*buffer);
++				if (cnt % 16 == 0)
++					printk("\n");
++				else
++					printk("  ");
++			}
++			if (cnt % 16 != 0)
++				printk("\n");
++			break;
++		case 16:
++			printk("   0      2      4      6      8      Ah "
++				"	Ch     Eh\n");
++			printk("-----------------------------------------"
++				"-------------\n");
++
++			buf16 = (uint16_t *) buffer;
++			for (cnt = 1; cnt <= count; cnt++, buf16++) {
++				printk("%4x",*buf16);
++
++				if (cnt % 8 == 0)
++					printk("\n");
++				else if (*buf16 < 10)
++					printk("   ");
++				else
++					printk("  ");
++			}
++			if (cnt % 8 != 0)
++				printk("\n");
++			break;
++		case 32:
++			printk("       0          4          8          Ch\n");
++			printk("------------------------------------------\n");
++
++			buf32 = (uint32_t *) buffer;
++			for (cnt = 1; cnt <= count; cnt++, buf32++) {
++				printk("%8x", *buf32);
++
++				if (cnt % 4 == 0)
++					printk("\n");
++				else if (*buf32 < 10)
++					printk("   ");
++				else
++					printk("  ");
++			}
++			if (cnt % 4 != 0)
++				printk("\n");
++			break;
++		default:
++			break;
++	}
++}
++
++#endif
++
++
++#if STOP_ON_ERROR
++/**************************************************************************
++*   qla2x00_panic
++*
++**************************************************************************/
++static void 
++qla2x00_panic(char *cp, struct Scsi_Host *host) 
++{
++	struct scsi_qla_host *ha;
++	long *fp;
++
++	ha = (struct scsi_qla_host *) host->hostdata;
++	DEBUG2(ql2x_debug_print = 1;);
++	printk("qla2100 - PANIC:  %s\n", cp);
++	printk("Current time=0x%lx\n", jiffies);
++	printk("Number of pending commands =0x%lx\n", ha->actthreads);
++	printk("Number of queued commands =0x%lx\n", ha->qthreads);
++	printk("Number of free entries = (%d)\n", ha->req_q_cnt);
++	printk("Request Queue @ 0x%lx, Response Queue @ 0x%lx\n",
++			       ha->request_dma, ha->response_dma);
++	printk("Request In Ptr %d\n", ha->req_ring_index);
++	fp = (long *) &ha->flags;
++	printk("HA flags =0x%lx\n", *fp);
++	qla2x00_dump_requests(ha);
++	qla2x00_dump_regs(host);
++	cli();
++	for (;;) {
++		udelay(2);
++		barrier();
++		/* cpu_relax();*/
++	}
++	sti();
++}
++
++#endif
++
++/**************************************************************************
++*   qla2x00_dump_requests
++*
++**************************************************************************/
++void
++qla2x00_dump_requests(scsi_qla_host_t *ha) 
++{
++
++	Scsi_Cmnd       *cp;
++	srb_t           *sp;
++	int i;
++
++	printk("Outstanding Commands on controller:\n");
++
++	for (i = 1; i < MAX_OUTSTANDING_COMMANDS; i++) {
++		if ((sp = ha->outstanding_cmds[i]) == NULL)
++			continue;
++		if ((cp = sp->cmd) == NULL)
++			continue;
++
++		printk("(%d): Pid=%d, sp flags=0x%lx, cmd=0x%p\n", 
++			i, 
++			(int)sp->cmd->serial_number, 
++			(long)sp->flags,CMD_SP(sp->cmd));
++	}
++}
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_dbg.h	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,138 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++#undef ENTER_TRACE
++/*
++* Macros use for debugging the driver.
++*/
++#if defined(ENTER_TRACE)
++#define ENTER(x)	do { printk("qla2100 : Entering %s()\n", x); } while (0)
++#define LEAVE(x)	do { printk("qla2100 : Leaving %s()\n", x);  } while (0)
++#define ENTER_INTR(x)	do { printk("qla2100 : Entering %s()\n", x); } while (0)
++#define LEAVE_INTR(x)	do { printk("qla2100 : Leaving %s()\n", x);  } while (0)
++#else
++#define ENTER(x)	do {} while (0)
++#define LEAVE(x)	do {} while (0)
++#define ENTER_INTR(x) 	do {} while (0)
++#define LEAVE_INTR(x)   do {} while (0)
++#endif
++
++#if  DEBUG_QLA2100
++#define DEBUG(x)	do {x;} while (0);
++#else
++#define DEBUG(x)	do {} while (0);
++#endif
++
++#if defined(QL_DEBUG_LEVEL_1)
++#define DEBUG1(x)	do {x;} while (0);
++#else
++#define DEBUG1(x)	do {} while (0);
++#endif
++
++#if defined(QL_DEBUG_LEVEL_2)
++#define DEBUG2(x)       do {x;} while (0);
++#define DEBUG2_3(x)     do {x;} while (0);
++#define DEBUG2_3_11(x)  do {x;} while (0);
++#define DEBUG2_9_10(x)    do {x;} while (0);
++#define DEBUG2_11(x)    do {x;} while (0);
++#else
++#define DEBUG2(x)	do {} while (0);
++#endif
++
++#if defined(QL_DEBUG_LEVEL_3)
++#define DEBUG3(x)	do {x;} while (0);
++#define DEBUG2_3(x)	do {x;} while (0);
++#define DEBUG2_3_11(x)	do {x;} while (0);
++#define DEBUG3_11(x)	do {x;} while (0);
++#else
++#define DEBUG3(x)	do {} while (0);
++  #if !defined(QL_DEBUG_LEVEL_2)
++  #define DEBUG2_3(x)	do {} while (0);
++  #endif
++#endif
++
++#if defined(QL_DEBUG_LEVEL_4)
++#define DEBUG4(x)	do {x;} while (0);
++#else
++#define DEBUG4(x)	do {} while (0);
++#endif
++
++#if defined(QL_DEBUG_LEVEL_5)
++#define DEBUG5(x)          do {x;} while (0);
++#else
++#define DEBUG5(x)	do {} while (0);
++#endif
++
++#if defined(QL_DEBUG_LEVEL_7)
++#define DEBUG7(x)          do {x;} while (0);
++#else
++#define DEBUG7(x)	   do {} while (0);
++#endif
++
++#if defined(QL_DEBUG_LEVEL_9)
++#define DEBUG9(x)       do {x;} while (0);
++#define DEBUG9_10(x)    do {x;} while (0);
++#define DEBUG2_9_10(x)	do {x;} while (0);
++#else
++#define DEBUG9(x)	do {} while (0);
++#endif
++
++#if defined(QL_DEBUG_LEVEL_10)
++#define DEBUG10(x)      do {x;} while (0);
++#define DEBUG2_9_10(x)	do {x;} while (0);
++#define DEBUG9_10(x)	do {x;} while (0);
++#else
++#define DEBUG10(x)	do {} while (0);
++  #if !defined(DEBUG2_9_10)
++  #define DEBUG2_9_10(x)	do {} while (0);
++  #endif
++  #if !defined(DEBUG9_10)
++  #define DEBUG9_10(x)	do {} while (0);
++  #endif
++#endif
++
++#if defined(QL_DEBUG_LEVEL_11)
++#define DEBUG11(x)      do{x;} while(0);
++#if !defined(DEBUG2_11)
++#define DEBUG2_11(x)    do{x;} while(0);
++#endif
++#if !defined(DEBUG2_3_11)
++#define DEBUG2_3_11(x)  do{x;} while(0);
++#endif
++#if !defined(DEBUG3_11)
++#define DEBUG3_11(x)    do{x;} while(0);
++#endif
++#else
++#define DEBUG11(x)	do{} while(0);
++  #if !defined(QL_DEBUG_LEVEL_2)
++  #define DEBUG2_11(x)	do{} while(0);
++    #if !defined(QL_DEBUG_LEVEL_3)
++    #define DEBUG2_3_11(x) do{} while(0);
++    #endif
++  #endif
++  #if !defined(QL_DEBUG_LEVEL_3)
++  #define DEBUG3_11(x)	do{} while(0);
++  #endif
++#endif
++
++#if defined(QL_DEBUG_LEVEL_12)
++#define DEBUG12(x)      do {x;} while (0);
++#else
++#define DEBUG12(x)	do {} while (0);
++#endif
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_def.h	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,2484 @@
++/********************************************************************************
++*                  QLOGIC LINUX SOFTWARE
++*
++* QLogic ISP2x00 device driver for Linux 2.5.x
++* Copyright (C) 2003 Qlogic Corporation
++* (www.qlogic.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, 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.
++**
++******************************************************************************/
++
++#ifndef __QLA_DEF_H
++#define __QLA_DEF_H
++
++#if defined(qla23xx)
++	#define MAILBOX_REGISTER_COUNT	32
++	#define ISP_NAME		"23xx"
++	#define DRIVER_NAME		"qla2300"
++	#define ISP2300
++	#undef ISP2322
++#elif defined(qla22xx)
++	#define MAILBOX_REGISTER_COUNT	32
++	#define ISP_NAME		"22xx"
++	#define DRIVER_NAME		"qla2200"
++	#define ISP2200
++#else /* qla21xx */
++	#define MAILBOX_REGISTER_COUNT	8
++	#define ISP_NAME		"21xx"
++	#define DRIVER_NAME		"qla2100"
++	#define ISP2100
++#endif
++
++/*****************************************/
++/*   ISP Boards supported by this driver */
++/*****************************************/
++#define QLA2X00_VENDOR_ID	0x1077
++
++#define QLA2100_DEVICE_ID	0x2100
++
++#define QLA2200_DEVICE_ID	0x2200
++#define QLA2200A_RISC_ROM_VER	4
++
++#define QLA2300_DEVICE_ID	0x2300
++#define QLA2312_DEVICE_ID	0x2312
++#define QLA2322_DEVICE_ID	0x2322
++#define FPM_2300		6
++#define FPM_2310		7
++
++#include "qla_settings.h"
++#include "exioct.h"
++#include "inioct.h"
++
++/* 
++ * Data bit definitions
++ */
++#define BIT_0	0x1
++#define BIT_1	0x2
++#define BIT_2	0x4
++#define BIT_3	0x8
++#define BIT_4	0x10
++#define BIT_5	0x20
++#define BIT_6	0x40
++#define BIT_7	0x80
++#define BIT_8	0x100
++#define BIT_9	0x200
++#define BIT_10	0x400
++#define BIT_11	0x800
++#define BIT_12	0x1000
++#define BIT_13	0x2000
++#define BIT_14	0x4000
++#define BIT_15	0x8000
++#define BIT_16	0x10000
++#define BIT_17	0x20000
++#define BIT_18	0x40000
++#define BIT_19	0x80000
++#define BIT_20	0x100000
++#define BIT_21	0x200000
++#define BIT_22	0x400000
++#define BIT_23	0x800000
++#define BIT_24	0x1000000
++#define BIT_25	0x2000000
++#define BIT_26	0x4000000
++#define BIT_27	0x8000000
++#define BIT_28	0x10000000
++#define BIT_29	0x20000000
++#define BIT_30	0x40000000
++#define BIT_31	0x80000000
++
++#define LSB(x)	((uint8_t)(x))
++#define MSB(x)	((uint8_t)((uint16_t)(x) >> 8))
++
++#define LSW(x)	((uint16_t)(x))
++#define MSW(x)	((uint16_t)((uint32_t)(x) >> 16))
++
++#define LSD(x)	((uint32_t)((uint64_t)(x)))
++#define MSD(x)	((uint32_t)((uint64_t)(x) >> 32))
++
++
++/*
++ * I/O register
++*/
++/* #define MEMORY_MAPPED_IO  */    /* Enable memory mapped I/O */
++#undef MEMORY_MAPPED_IO            /* Disable memory mapped I/O */
++
++#if defined(MEMORY_MAPPED_IO)
++#define RD_REG_BYTE(addr)		readb(addr)
++#define RD_REG_WORD(addr)		readw(addr)
++#define RD_REG_DWORD(addr)		readl(addr)
++#define WRT_REG_BYTE(addr, data)	writeb(data,addr)
++#define WRT_REG_WORD(addr, data)	writew(data,addr)
++#define WRT_REG_DWORD(addr, data)	writel(data,addr)
++#else   /* MEMORY_MAPPED_IO */
++#define RD_REG_BYTE(addr)		(inb((unsigned long)addr))
++#define RD_REG_WORD(addr)		(inw((unsigned long)addr))
++#define RD_REG_DWORD(addr)		(inl((unsigned long)addr))
++#define WRT_REG_BYTE(addr, data)	(outb(data,(unsigned long)addr))
++#define WRT_REG_WORD(addr, data)	(outw(data,(unsigned long)addr))
++#define WRT_REG_DWORD(addr, data)	(outl(data,(unsigned long)addr))
++#endif  /* MEMORY_MAPPED_IO */
++
++/*
++ * Fibre Channel device definitions.
++ */
++#define WWN_SIZE		8	/* Size of WWPN, WWN & WWNN */
++#define MAX_FIBRE_DEVICES	256
++#define MAX_FIBRE_LUNS  	256
++#define	MAX_RSCN_COUNT		10
++#define	MAX_HOST_COUNT		16
++
++/*
++ * Host adapter default definitions.
++ */
++#define MAX_BUSES		1  /* We only have one bus today */
++#define MAX_TARGETS_2100	MAX_FIBRE_DEVICES
++#define MAX_TARGETS_2200	MAX_FIBRE_DEVICES
++#define MAX_TARGETS		MAX_FIBRE_DEVICES
++#define MIN_LUNS		8
++#define MAX_LUNS		MAX_FIBRE_LUNS
++#define MAX_CMDS_PER_LUN	255 
++#define MAX_SRBS		4096
++                                    
++/*
++ * Fibre Channel device definitions.
++ */
++#define LAST_LOCAL_LOOP_ID	0x7d
++#define SNS_FL_PORT		0x7e
++#define FABRIC_CONTROLLER	0x7f
++#define SIMPLE_NAME_SERVER	0x80
++#define SNS_FIRST_LOOP_ID	0x81
++#define LAST_SNS_LOOP_ID	0xfe
++#define MANAGEMENT_SERVER	0xfe
++#define BROADCAST		0xff
++#define SNS_ACCEPT		0x0280	/* 8002 swapped */
++#define SNS_REJECT		0x0180	/* 8001 swapped */
++
++/* Loop ID's used as database flags, must be higher than any valid Loop ID */
++#define PORT_UNUSED		0x100	/* Port never been used. */
++#define PORT_AVAILABLE		0x101	/* Device does not exist on port. */
++#define PORT_NEED_MAP		0x102       
++#define PORT_LOST_ID		0x200       
++#define PORT_LOGIN_NEEDED	0x400       
++
++/*
++ * Timeout timer counts in seconds
++ */
++#define QLA2100_WDG_TIME_QUANTUM	5	/* In seconds */
++#define PORT_RETRY_TIME			2
++#define LOOP_DOWN_TIMEOUT		60
++#define LOOP_DOWN_TIME			120	/* 240 */
++#define	LOOP_DOWN_RESET			(LOOP_DOWN_TIME - 30)
++
++/* Maximum outstanding commands in ISP queues (1-65535) */
++#define MAX_OUTSTANDING_COMMANDS	1024
++
++/* ISP request and response entry counts (37-65535) */
++#define REQUEST_ENTRY_CNT		1024	/* Number of request entries. */
++#if defined(ISP2100) || defined(ISP2200)
++#define RESPONSE_ENTRY_CNT		64	/* Number of response entries.*/
++#else
++#define RESPONSE_ENTRY_CNT		512	/* Number of response entries.*/
++#endif
++
++/* Number of segments 1 - 65535 */
++#define SG_SEGMENTS     32             /* Cmd entry + 6 continuations */
++
++/*
++ * SCSI Request Block 
++ */
++typedef struct srb {
++	struct list_head   list;
++
++	Scsi_Cmnd  *cmd;		/* Linux SCSI command pkt */
++	struct scsi_qla_host *ha;	/* ha this SP is queued on */
++
++	uint8_t     dir;		/* direction of transfer */
++	uint8_t     unused1;
++
++	uint16_t    flags;		/* Status flags - defined below */
++
++	uint16_t     state;
++#define SRB_FREE_STATE          0	/* Request returned back */
++#define SRB_PENDING_STATE       1	/* Request being queued in LUN Q */
++#define SRB_ACTIVE_STATE        2	/* Request in Active Array */
++#define SRB_DONE_STATE          3	/* Request Queued in Done Queue */
++#define SRB_RETRY_STATE         4	/* Request in Retry Queue */
++#define SRB_SUSPENDED_STATE     5	/* Request in suspended state */
++#define SRB_NO_QUEUE_STATE      6	/* Request is in between states */
++#define SRB_ACTIVE_TIMEOUT_STATE 7	/* Request in Active Array but timed out */
++#define SRB_FAILOVER_STATE 	8	/* Request in Failover Queue */
++#define SRB_SCSI_RETRY_STATE    9	/* Request in Scsi Retry Queue */
++
++	uint8_t     used;		/* used by allocation code */
++	uint8_t     ref_num;		/* reference SRB number */	
++	uint16_t    magic;		/* qlogic magic number */
++#define SRB_MAGIC       0x10CB
++
++	u_long      host_no;		/* Host number of allocating host */
++	struct      timer_list   timer;	/* used to timeout command */
++	dma_addr_t	 saved_dma_handle;	/* for unmap of single transfers */
++
++	atomic_t	 ref_count;	/* reference count for this structure */			
++
++	/* Target/LUN queue pointers. */
++	struct os_tgt	*tgt_queue;	/* ptr to visible ha's target */
++	struct os_lun	*lun_queue;	/* ptr to visible ha's lun */
++	struct fc_lun	*fclun;		/* FC LUN context pointer. */
++
++	/* Raw completion info for use by failover ? */
++	uint8_t	fo_retry_cnt;	/* Retry count this request */
++	uint8_t	err_id;		/* error id */
++	uint8_t	cmd_length;	/* command length */
++	uint8_t	unused3;
++
++	int      delay;        /* delay in seconds */
++	int      ext_history;	/*  */
++
++	u_long      e_start;	/* jiffies at start of extend timeout */
++	u_long      r_start;	/* jiffies at start of request */
++	u_long      u_start;	/* jiffies when sent to F/W    */
++	u_long      f_start;	/* ra 10/29/01*/
++				/*jiffies when put in failover queue*/
++
++	uint32_t    resid;	/* Residual transfer length */
++	uint16_t    sense_len;	/* Sense data length */
++	uint32_t    request_sense_length;
++	void        *request_sense_ptr;
++
++#if defined(IOCB_THROLLE_USAGE)
++	uint32_t 	 iocb_cnt;
++#endif
++} srb_t;
++
++/*
++ * SRB flag definitions
++ */
++#define SRB_TIMEOUT		BIT_0	/* Command timed out */
++#define SRB_DMA_VALID		BIT_1	/* Command sent to ISP */
++#define SRB_WATCHDOG		BIT_2	/* Command on watchdog list */
++#define SRB_ABORT_PENDING	BIT_3	/* Command abort sent to device */
++
++#define SRB_ABORTED		BIT_4	/* Command aborted command already */
++#define SRB_RETRY		BIT_5	/* Command needs retrying */
++#define SRB_GOT_SENSE		BIT_6	/* Command has sense data */
++#define SRB_FAILOVER		BIT_7	/* Command in failover state */
++
++#define SRB_BUSY		BIT_8	/* Command is in busy retry state */
++#define SRB_FO_CANCEL		BIT_9	/* Command don't need to do failover */
++#define	SRB_IOCTL		BIT_10	/* IOCTL command. */
++#define	SRB_ISP_STARTED		BIT_11	/* Command sent to ISP. */
++
++#define	SRB_ISP_COMPLETED	BIT_12	/* ISP finished with command */
++
++
++/*
++ *  ISP PCI Configuration Register Set
++ */
++typedef volatile struct {
++    uint16_t vendor_id;                 /* 0x0 */
++    uint16_t device_id;                 /* 0x2 */
++    uint16_t command;                   /* 0x4 */
++    uint16_t status;                    /* 0x6 */
++    uint8_t revision_id;                /* 0x8 */
++    uint8_t programming_interface;      /* 0x9 */
++    uint8_t sub_class;                  /* 0xa */
++    uint8_t base_class;                 /* 0xb */
++    uint8_t cache_line;                 /* 0xc */
++    uint8_t latency_timer;              /* 0xd */
++    uint8_t header_type;                /* 0xe */
++    uint8_t bist;                       /* 0xf */
++    uint32_t base_port;                 /* 0x10 */
++    uint32_t mem_base_addr;             /* 0x14 */
++    uint32_t base_addr[4];              /* 0x18-0x24 */
++    uint32_t reserved_1[2];             /* 0x28-0x2c */
++    uint16_t expansion_rom;             /* 0x30 */
++    uint32_t reserved_2[2];             /* 0x34-0x38 */
++    uint8_t interrupt_line;             /* 0x3c */
++    uint8_t interrupt_pin;              /* 0x3d */
++    uint8_t min_grant;                  /* 0x3e */
++    uint8_t max_latency;                /* 0x3f */
++} config_reg_t __attribute__((packed));
++
++
++/*
++ * ISP I/O Register Set structure definitions.
++ */
++typedef volatile struct {
++	volatile uint16_t flash_address; /* Flash BIOS address */
++	volatile uint16_t flash_data;	/* Flash BIOS data */
++	uint16_t unused_1[1];		/* Gap */
++	volatile uint16_t ctrl_status;	/* Control/Status */
++#define CSR_FLASH_64K_BANK	BIT_3	/* Flash upper 64K bank select */ 
++#define CSR_FLASH_ENABLE	BIT_1	/* Flash BIOS Read/Write enable */
++#define CSR_ISP_SOFT_RESET	BIT_0	/* ISP soft reset */
++
++	volatile uint16_t ictrl;	/* Interrupt control */
++#define ICR_EN_INT		BIT_15	/* ISP enable interrupts. */
++#define ICR_EN_RISC		BIT_3	/* ISP enable RISC interrupts. */
++
++	volatile uint16_t istatus;	/* Interrupt status */
++#define ISR_RISC_INT		BIT_3	/* RISC interrupt */
++
++	volatile uint16_t semaphore;	/* Semaphore */
++	volatile uint16_t nvram;	/* NVRAM register. */
++#define NVR_DESELECT		0
++#define NVR_CLOCK		BIT_0
++#define NVR_SELECT		BIT_1
++#define NVR_DATA_OUT		BIT_2
++#define NVR_DATA_IN		BIT_3
++#define NVR_BUSY		BIT_15
++
++#if defined(ISP2100) || defined(ISP2200)
++	volatile uint16_t mailbox0;
++	volatile uint16_t mailbox1;
++	volatile uint16_t mailbox2;
++	volatile uint16_t mailbox3;
++	volatile uint16_t mailbox4;
++#define	ISP_REQ_Q_IN(reg)	(&(reg)->mailbox4)
++#define	ISP_REQ_Q_OUT(reg)	(&(reg)->mailbox4)
++	volatile uint16_t mailbox5;
++#define	ISP_RSP_Q_IN(reg)	(&(reg)->mailbox5)
++#define	ISP_RSP_Q_OUT(reg)	(&(reg)->mailbox5)
++	volatile uint16_t mailbox6;
++	volatile uint16_t mailbox7;
++	uint16_t unused_2[0x3b];	/* Gap */
++#else /* defined(ISP2300) */
++	volatile uint16_t req_q_in;	/* Request Queue In-Pointer */
++#define	ISP_REQ_Q_IN(reg)	(&(reg)->req_q_in)
++	volatile uint16_t req_q_out;	/* Request Queue Out-Pointer */
++#define	ISP_REQ_Q_OUT(reg)	(&(reg)->req_q_out)
++	volatile uint16_t rsp_q_in;	/* Response Queue In-Pointer */
++#define	ISP_RSP_Q_IN(reg)	(&(reg)->rsp_q_in)
++	volatile uint16_t rsp_q_out;	/* Response Queue Out-Pointer */
++#define	ISP_RSP_Q_OUT(reg)	(&(reg)->rsp_q_out)
++
++	volatile uint16_t host_status_lo; /* RISC to Host Status Low */
++#define HSR_INT			BIT_15	/* RISC int */
++#define HSR_RISC_PAUSED		BIT_8	/* RISC Paused */
++	volatile uint16_t host_status_hi; /* RISC to Host Status High */
++#define HSR_ROM_MB_CMD_COMP	0x01	/* ROM mailbox cmd complete */
++#define HSR_ROM_MB_CMD_ERROR	0x02	/*ROM mailbox cmd unsuccessful*/
++#define HSR_MB_CMD_COMP		0x10	/* Mailbox cmd complete */
++#define HSR_MB_CMD_ERROR	0x11	/* Mailbox cmd unsuccessful */
++#define HSR_ASYNC_EVENT		0x12	/* Asynchronous event */
++#define HSR_RESPONSE_QUEUE_UP	0x13	/* Response Queue update */
++#define HSR_RIO_ONE		0x15	/* RIO one 16 bit handle */
++#define HSR_FAST_SCSI_COMP	0x16	/* Fast Post SCSI complete */
++
++	volatile uint16_t host_semaphore; /* Host to Host Semaphore */
++	uint16_t unused_3[0x11];	/* Gap */
++	volatile uint16_t mailbox0;
++	volatile uint16_t mailbox1;
++	volatile uint16_t mailbox2;
++	volatile uint16_t mailbox3;
++	volatile uint16_t mailbox4;
++	volatile uint16_t mailbox5;
++	volatile uint16_t mailbox6;
++	volatile uint16_t mailbox7;
++	volatile uint16_t mailbox8;
++	volatile uint16_t mailbox9;
++	volatile uint16_t mailbox10;
++	volatile uint16_t mailbox11;
++	volatile uint16_t mailbox12;
++	volatile uint16_t mailbox13;
++	volatile uint16_t mailbox14;
++	volatile uint16_t mailbox15;
++	volatile uint16_t mailbox16;
++	volatile uint16_t mailbox17;
++	volatile uint16_t mailbox18;
++	volatile uint16_t mailbox19;
++	volatile uint16_t mailbox20;
++	volatile uint16_t mailbox21;
++	volatile uint16_t mailbox22;
++	volatile uint16_t mailbox23;
++	volatile uint16_t mailbox24;
++	volatile uint16_t mailbox25;
++	volatile uint16_t mailbox26;
++	volatile uint16_t mailbox27;
++	volatile uint16_t mailbox28;
++	volatile uint16_t mailbox29;
++	volatile uint16_t mailbox30;
++	volatile uint16_t mailbox31;
++	volatile uint16_t fb_cmd;
++	uint16_t unused_4[0xa];		/* Gap */
++#endif /* defined(ISP2100) || defined(ISP2200) */
++	volatile uint16_t fpm_diag_config;
++	uint16_t unused_5[0x6];		/* Gap */
++	volatile uint16_t pcr;		/* Processor Control Register. */
++	uint16_t unused_6[0x5];		/* Gap */
++	volatile uint16_t mctr;		/* Memory Configuration and Timing. */
++	uint16_t unused_7[0x3];		/* Gap */
++#if defined(ISP2100) || defined(ISP2200)
++	volatile uint16_t fb_cmd;
++#else /* defined(ISP2300) */
++	uint16_t unused_11;
++#endif /* defined(ISP2100) || defined(ISP2200) */
++	uint16_t unused_8[0x3];		/* Gap */
++	volatile uint16_t hccr;		/* Host command & control register. */
++#define HCCR_HOST_INT		BIT_7	/* Host interrupt bit */
++#define HCCR_RISC_PAUSE		BIT_5	/* Pause mode bit */
++					/* HCCR commands */
++#define HCCR_RESET_RISC		0x1000	/* Reset RISC */
++#define HCCR_PAUSE_RISC		0x2000	/* Pause RISC */
++#define HCCR_RELEASE_RISC	0x3000	/* Release RISC from reset. */
++#define HCCR_SET_HOST_INT	0x5000	/* Set host interrupt */
++#define HCCR_CLR_HOST_INT	0x6000	/* Clear HOST interrupt */
++#define HCCR_CLR_RISC_INT	0x7000	/* Clear RISC interrupt */
++#define	HCCR_DISABLE_PARITY_PAUSE 0x4001 /* Disable parity error RISC pause. */
++#define HCCR_ENABLE_PARITY	0xA000	/* Enable PARITY interrupt */
++
++	uint16_t unused_9[5];		/* Gap */
++	volatile uint16_t gpiod;	/* GPIO Data register. */
++	volatile uint16_t gpioe;	/* GPIO Enable register. */
++#if defined(ISP2200)
++	uint16_t unused_10[8];		/* Gap */
++	volatile uint16_t mailbox8;
++	volatile uint16_t mailbox9;
++	volatile uint16_t mailbox10;
++	volatile uint16_t mailbox11;
++	volatile uint16_t mailbox12;
++	volatile uint16_t mailbox13;
++	volatile uint16_t mailbox14;
++	volatile uint16_t mailbox15;
++	volatile uint16_t mailbox16;
++	volatile uint16_t mailbox17;
++	volatile uint16_t mailbox18;
++	volatile uint16_t mailbox19;
++	volatile uint16_t mailbox20;
++	volatile uint16_t mailbox21;
++	volatile uint16_t mailbox22;
++	volatile uint16_t mailbox23;	/* Also probe reg. */
++#endif /* defined(ISP2200) */
++} device_reg_t;
++
++typedef struct {
++	uint32_t	out_mb;		/* outbound from driver */
++	uint32_t	in_mb;			/* Incoming from RISC */
++	uint16_t	mb[MAILBOX_REGISTER_COUNT];
++	long		buf_size;
++	void		*bufp;
++	uint32_t	tov;
++	uint8_t		flags;
++#define MBX_DMA_IN	BIT_0
++#define	MBX_DMA_OUT	BIT_1
++#define IOCTL_CMD	BIT_2
++} mbx_cmd_t;
++
++#define	MBX_TOV_SECONDS	30
++
++/*
++ *  ISP product identification definitions in mailboxes after reset.
++ */
++#define PROD_ID_1		0x4953
++#define PROD_ID_2		0x0000
++#define PROD_ID_2a		0x5020
++#define PROD_ID_3		0x2020
++#define PROD_ID_4		0x1
++#define PROD_ID_4a		0x2
++
++/*
++ * ISP mailbox Self-Test status codes
++ */
++#define MBS_FRM_ALIVE		0	/* Firmware Alive. */
++#define MBS_CHKSUM_ERR		1	/* Checksum Error. */
++#define MBS_BUSY		4	/* Busy. */
++
++/*
++ * ISP mailbox command complete status codes
++ */
++#define MBS_CMD_CMP		0x4000	/* Command Complete. */
++#define MBS_INV_CMD		0x4001	/* Invalid Command. */
++#define MBS_HOST_INF_ERR	0x4002	/* Host Interface Error. */
++#define MBS_TEST_FAILED		0x4003	/* Test Failed. */
++#define MBS_CMD_ERR		0x4005	/* Command Error. */
++#define MBS_CMD_PARAM_ERR	0x4006	/* Command Parameter Error. */
++#define MBS_FATAL_ERROR		0xF000	/* Command Fatal Error. */
++//TODO consolidate these definitions
++#define MBS_FIRMWARE_ALIVE	0x0000 
++#define MBS_COMMAND_COMPLETE	0x4000 
++#define MBS_INVALID_COMMAND	0x4001 
++
++/* QLogic subroutine status definitions */
++#define QL_STATUS_SUCCESS		0
++#define QL_STATUS_ERROR			1
++#define QL_STATUS_FATAL_ERROR		2
++#define QL_STATUS_RESOURCE_ERROR	3
++#define QL_STATUS_LOOP_ID_IN_USE	4
++#define QL_STATUS_NO_DATA		5
++#define QL_STATUS_TIMEOUT		6
++/*
++ * ISP mailbox asynchronous event status codes
++ */
++#define MBA_ASYNC_EVENT		0x8000	/* Asynchronous event. */
++#define MBA_RESET		0x8001	/* Reset Detected. */
++#define MBA_SYSTEM_ERR		0x8002	/* System Error. */
++#define MBA_REQ_TRANSFER_ERR	0x8003	/* Request Transfer Error. */
++#define MBA_RSP_TRANSFER_ERR	0x8004	/* Response Transfer Error. */
++#define MBA_WAKEUP_THRES	0x8005	/* Request Queue Wake-up. */
++#define MBA_LIP_OCCURRED	0x8010	/* Loop Initialization Procedure */
++                                      	/* occurred. */
++#define MBA_LOOP_UP		0x8011	/* FC Loop UP. */
++#define MBA_LOOP_DOWN		0x8012	/* FC Loop Down. */
++#define MBA_LIP_RESET		0x8013	/* LIP reset occurred. */
++#define MBA_PORT_UPDATE		0x8014	/* Port Database update. */
++#define MBA_SCR_UPDATE		0x8015	/* State Change Registration. */
++#define MBA_RSCN_UPDATE		MBA_SCR_UPDATE
++#define MBA_SCSI_COMPLETION	0x8020  /* SCSI Command Complete. */
++#define MBA_CTIO_COMPLETION	0x8021  /* CTIO Complete. */
++#if !defined(ISP2100)
++#define MBA_LINK_MODE_UP	0x8030  /* FC Link Mode UP. */
++#define MBA_UPDATE_CONFIG	0x8036  /* FC Update Configuration. */
++#endif
++
++/*
++ * ISP mailbox commands
++ */
++#define MBC_LOAD_RAM              1     /* Load RAM. */
++#define MBC_EXECUTE_FIRMWARE      2     /* Execute firmware. */
++#define MBC_WRITE_RAM_WORD        4     /* Write RAM word. */
++#define MBC_READ_RAM_WORD         5     /* Read RAM word. */
++#define MBC_MAILBOX_REGISTER_TEST 6     /* Wrap incoming mailboxes */
++#define MBC_VERIFY_CHECKSUM       7     /* Verify checksum. */
++#define MBC_ABOUT_FIRMWARE        8     /* Get firmware revision. */
++#define MBC_LOAD_RAM_A64          9     /* Load RAM by 64-bit address. */
++#define MBC_DUMP_RAM              0xA   /* READ BACK FW */
++#define MBC_LOAD_RAM_EXTENDED     0xB   /* Load Extended RAM */
++#define MBC_DUMP_SRAM             0xC   /* Dump SRAM    */
++#define MBC_WRITE_RAM_WORD_EXTENDED	0xD     /* Write RAM word extended */
++#define MBC_IOCB_EXECUTE          0x12  /* Execute an IOCB command */
++#define MBC_ABORT_COMMAND         0x15  /* Abort IOCB command. */
++#define MBC_ABORT_DEVICE          0x16  /* Abort device (ID/LUN). */
++#define MBC_ABORT_TARGET          0x17  /* Abort target (ID). */
++#define MBC_TARGET_RESET_ALL      0x18  /* Reset all local targets. */
++#define MBC_GET_ADAPTER_LOOP_ID   0x20  /* Get loop id of ISP2100. */
++#define MBC_GET_RETRY_COUNT       0x22  /* GET RATOV & retry count */
++#define MBC_GET_FIRMWARE_OPTIONS  0x28  /* Get firmware options. */
++#define MBC_SET_RETRY_COUNT       0x32  /* SET RATOV & retry count. */
++#define MBC_SET_FIRMWARE_OPTIONS  0x38  /* Set firmware options. */
++#define MBC_GET_RESOURCE_COUNTS   0x42  /* GET Resource counts */
++#define MBC_DIAGNOSTIC_LOOP_BACK  0x45  /* Perform LoopBack diagnostic */
++#define MBC_ENHANCED_GET_PORT_DATABASE     0x47  /* Get port database. */
++#define MBC_IOCB_EXECUTE_A64	  0x54  /* Execute an IOCB command (64bit) */
++#define	MBC_SEND_RNID_ELS         0x57	/* Send RNID ELS request */
++#define	MBC_SET_RNID_PARAMS       0x59	/* Set RNID parameters */
++#define	MBC_GET_RNID_PARAMS       0x5a	/* Get RNID parameters */
++#define MBC_INITIALIZE_FIRMWARE   0x60  /* Initialize firmware */
++#define MBC_INITIATE_LIP          0x62  /* Initiate Loop Initialization */
++                                        /* Procedure */
++#define MBC_GET_FCAL_MAP	0x63  /* Get FC/AL position map */
++#define MBC_GET_PORT_DATABASE     0x64  /* Get port database. */
++#define MBC_TARGET_RESET	  0x66  /* Target reset. */
++#define MBC_GET_FIRMWARE_STATE    0x69  /* Get firmware state. */
++#define MBC_GET_PORT_NAME         0x6a  /* Get port name. */
++#define MBC_GET_LINK_STATUS       0x6b  /* Get link status. */
++#define MBC_LIP_RESET             0x6c  /* LIP reset. */
++#define MBC_SEND_SNS_COMMAND      0x6e  /* Send Simple Name Server command. */
++#define MBC_LOGIN_FABRIC_PORT     0x6f  /* Login fabric port. */
++#define MBC_LOGOUT_FABRIC_PORT    0x71  /* Logout fabric port. */
++#define MBC_LIP_FULL_LOGIN        0x72  /* Full login LIP. */
++#define	MBC_LOGIN_LOOP_PORT       0x74	/* Login Loop Port. */
++#define MBC_GET_PORT_LIST         0x75  /* Get port list. */
++#define	MBC_INITIALIZE_RECEIVE_QUEUE	0x77	/* Initialize receive queue */
++#define	MBC_SEND_FARP_REQ_COMMAND	0x78	/* FARP request. */
++#define	MBC_SEND_FARP_REPLY_COMMAND	0x79	/* FARP reply. */
++#define	MBC_PORT_LOOP_NAME_LIST		0x7C	/* Get port/node name list. */
++#define	MBC_SEND_LFA_COMMAND		0x7D	/* Send Loop Fabric Address */
++#define	MBC_LUN_RESET			0x7E	/* Send LUN reset */
++
++/* Firmware return data sizes */
++#define FCAL_MAP_SIZE	128
++
++/* Mailbox bit definitions for out_mb and in_mb */
++#define	MBX_31		BIT_31
++#define	MBX_30		BIT_30
++#define	MBX_29		BIT_29
++#define	MBX_28		BIT_28
++#define	MBX_27		BIT_27
++#define	MBX_26		BIT_26
++#define	MBX_25		BIT_25
++#define	MBX_24		BIT_24
++#define	MBX_23		BIT_23
++#define	MBX_22		BIT_22
++#define	MBX_21		BIT_21
++#define	MBX_20		BIT_20
++#define	MBX_19		BIT_19
++#define	MBX_18		BIT_18
++#define	MBX_17		BIT_17
++#define	MBX_16		BIT_16
++#define	MBX_15		BIT_15
++#define	MBX_14		BIT_14
++#define	MBX_13		BIT_13
++#define	MBX_12		BIT_12
++#define	MBX_11		BIT_11
++#define	MBX_10		BIT_10
++#define	MBX_9		BIT_9
++#define	MBX_8		BIT_8
++#define	MBX_7		BIT_7
++#define	MBX_6		BIT_6
++#define	MBX_5		BIT_5
++#define	MBX_4		BIT_4
++#define	MBX_3		BIT_3
++#define	MBX_2		BIT_2
++#define	MBX_1		BIT_1
++#define	MBX_0		BIT_0
++
++/*
++ * Firmware state codes from get firmware state mailbox command
++ */
++#define FSTATE_CONFIG_WAIT      0
++#define FSTATE_WAIT_AL_PA       1
++#define FSTATE_WAIT_LOGIN       2
++#define FSTATE_READY            3
++#define FSTATE_LOSS_OF_SYNC     4
++#define FSTATE_ERROR            5
++#define FSTATE_REINIT           6
++#define FSTATE_NON_PART         7
++
++#define FSTATE_CONFIG_CORRECT      0
++#define FSTATE_P2P_RCV_LIP         1
++#define FSTATE_P2P_CHOOSE_LOOP     2
++#define FSTATE_P2P_RCV_UNIDEN_LIP  3
++#define FSTATE_FATAL_ERROR         4
++#define FSTATE_LOOP_BACK_CONN      5
++
++/*
++ * Port Database structure definition
++ * Little endian except where noted.
++ */
++#define	PORT_DATABASE_SIZE	128	/* bytes */
++typedef struct {
++	uint8_t options;
++	uint8_t control;
++	uint8_t master_state;
++	uint8_t slave_state;
++#define	PD_STATE_DISCOVERY			0
++#define	PD_STATE_WAIT_DISCOVERY_ACK		1
++#define	PD_STATE_PORT_LOGIN			2
++#define	PD_STATE_WAIT_PORT_LOGIN_ACK		3
++#define	PD_STATE_PROCESS_LOGIN			4
++#define	PD_STATE_WAIT_PROCESS_LOGIN_ACK		5
++#define	PD_STATE_PORT_LOGGED_IN			6
++#define	PD_STATE_PORT_UNAVAILABLE		7
++#define	PD_STATE_PROCESS_LOGOUT			8
++#define	PD_STATE_WAIT_PROCESS_LOGOUT_ACK	9
++#define	PD_STATE_PORT_LOGOUT			10
++#define	PD_STATE_WAIT_PORT_LOGOUT_ACK		11
++	uint8_t reserved[2];
++	uint8_t hard_address;
++	uint8_t reserved_1;
++	uint8_t port_id[4];
++	uint8_t node_name[8];			/* Big endian. */
++	uint8_t port_name[8];			/* Big endian. */
++	uint16_t execution_throttle;
++	uint16_t execution_count;
++	uint8_t reset_count;
++	uint8_t reserved_2;
++	uint16_t resource_allocation;
++	uint16_t current_allocation;
++	uint16_t queue_head;
++	uint16_t queue_tail;
++	uint16_t transmit_execution_list_next;
++	uint16_t transmit_execution_list_previous;
++	uint16_t common_features;
++	uint16_t total_concurrent_sequences;
++	uint16_t RO_by_information_category;
++	uint8_t recipient;
++	uint8_t initiator;
++	uint16_t receive_data_size;
++	uint16_t concurrent_sequences;
++	uint16_t open_sequences_per_exchange;
++	uint16_t lun_abort_flags;
++	uint16_t lun_stop_flags;
++	uint16_t stop_queue_head;
++	uint16_t stop_queue_tail;
++	uint16_t port_retry_timer;
++	uint16_t next_sequence_id;
++	uint16_t frame_count;
++	uint16_t PRLI_payload_length;
++	uint8_t prli_svc_param_word_0[2];	/* Big endian */
++						/* Bits 15-0 of word 0 */
++	uint8_t prli_svc_param_word_3[2];	/* Big endian */
++						/* Bits 15-0 of word 3 */
++	uint16_t loop_id;
++	uint16_t extended_lun_info_list_pointer;
++	uint16_t extended_lun_stop_list_pointer;
++} port_database_t;
++
++/*
++ * ISP Initialization Control Block.
++ */
++
++#define SO_DATA_RATE_1GB	0
++#define SO_DATA_RATE_2GB	1
++#define SO_DATA_RATE_AUTO	2
++
++/*
++ * ISP Initialization Control Block.
++ * Little endian except where noted.
++ */
++#define	ICB_VERSION 1
++typedef struct {
++	uint8_t  version;
++	uint8_t  reserved_1;
++
++	/*
++	 * LSB BIT 0  = Enable Hard Loop Id
++	 * LSB BIT 1  = Enable Fairness
++	 * LSB BIT 2  = Enable Full-Duplex
++	 * LSB BIT 3  = Enable Fast Posting
++	 * LSB BIT 4  = Enable Target Mode
++	 * LSB BIT 5  = Disable Initiator Mode
++	 * LSB BIT 6  = Enable ADISC
++	 * LSB BIT 7  = Enable Target Inquiry Data
++	 *
++	 * MSB BIT 0  = Enable PDBC Notify
++	 * MSB BIT 1  = Non Participating LIP
++	 * MSB BIT 2  = Descending Loop ID Search
++	 * MSB BIT 3  = Acquire Loop ID in LIPA
++	 * MSB BIT 4  = Stop PortQ on Full Status
++	 * MSB BIT 5  = Full Login after LIP
++	 * MSB BIT 6  = Node Name Option
++	 * MSB BIT 7  = Ext IFWCB enable bit
++	 */
++	uint8_t  firmware_options[2];
++
++	uint16_t frame_payload_size;
++	uint16_t max_iocb_allocation;
++	uint16_t execution_throttle;
++	uint8_t  retry_count;
++	uint8_t	 retry_delay;			/* unused */
++	uint8_t	 port_name[WWN_SIZE];		/* Big endian. */
++	uint16_t hard_address;
++	uint8_t	 inquiry_data;
++	uint8_t	 login_timeout;
++	uint8_t	 node_name[WWN_SIZE];		/* Big endian. */
++
++	uint16_t request_q_outpointer;
++	uint16_t response_q_inpointer;
++	uint16_t request_q_length;
++	uint16_t response_q_length;
++	uint32_t request_q_address[2];
++	uint32_t response_q_address[2];
++
++	uint16_t lun_enables;
++	uint8_t  command_resource_count;
++	uint8_t  immediate_notify_resource_count;
++	uint16_t timeout;
++	uint8_t  reserved_2[2];
++
++	/*
++	 * LSB BIT 0 = Timer Operation mode bit 0
++	 * LSB BIT 1 = Timer Operation mode bit 1
++	 * LSB BIT 2 = Timer Operation mode bit 2
++	 * LSB BIT 3 = Timer Operation mode bit 3
++	 * LSB BIT 4 = Init Config Mode bit 0
++	 * LSB BIT 5 = Init Config Mode bit 1
++	 * LSB BIT 6 = Init Config Mode bit 2
++	 * LSB BIT 7 = Enable Non part on LIHA failure
++	 *
++	 * MSB BIT 0 = Enable class 2
++	 * MSB BIT 1 = Enable ACK0
++	 * MSB BIT 2 =
++	 * MSB BIT 3 =
++	 * MSB BIT 4 = FC Tape Enable
++	 * MSB BIT 5 = Enable FC Confirm
++	 * MSB BIT 6 = Enable command queuing in target mode
++	 * MSB BIT 7 = No Logo On Link Down
++	 */
++	uint8_t	 add_firmware_options[2];
++
++	uint8_t	 response_accumulation_timer;
++	uint8_t	 interrupt_delay_timer;
++
++	/*
++	 * LSB BIT 0 = Enable Read xfr_rdy
++	 * LSB BIT 1 = Soft ID only
++	 * LSB BIT 2 =
++	 * LSB BIT 3 =
++	 * LSB BIT 4 = FCP RSP Payload [0]
++	 * LSB BIT 5 = FCP RSP Payload [1] / Sbus enable - 2200
++	 * LSB BIT 6 = Enable Out-of-Order frame handling
++	 * LSB BIT 7 = Disable Automatic PLOGI on Local Loop
++	 *
++	 * MSB BIT 0 = Sbus enable - 2300
++	 * MSB BIT 1 =
++	 * MSB BIT 2 =
++	 * MSB BIT 3 =
++	 * MSB BIT 4 =
++	 * MSB BIT 5 = enable 50 ohm termination
++	 * MSB BIT 6 = Data Rate (2300 only)
++	 * MSB BIT 7 = Data Rate (2300 only)
++	 */
++	uint8_t	 special_options[2];
++
++	uint8_t  reserved_3[26];
++} init_cb_t;
++
++/*
++ * ISP Get/Set Target Parameters mailbox command control flags.
++ */
++
++/*
++ * Get Link Status mailbox command return buffer.
++ */
++typedef struct {
++	uint32_t	link_fail_cnt;
++	uint32_t	loss_sync_cnt;
++	uint32_t	loss_sig_cnt;
++	uint32_t	prim_seq_err_cnt;
++	uint32_t	inval_xmit_word_cnt;
++	uint32_t	inval_crc_cnt;
++} link_stat_t;
++
++/*
++ * NVRAM Command values.
++ */
++#define NV_START_BIT            BIT_2
++#define NV_WRITE_OP             (BIT_26+BIT_24)
++#define NV_READ_OP              (BIT_26+BIT_25)
++#define NV_ERASE_OP             (BIT_26+BIT_25+BIT_24)
++#define NV_MASK_OP              (BIT_26+BIT_25+BIT_24)
++#define NV_DELAY_COUNT          10
++
++/*
++ * QLogic ISP2100, ISP2200 and ISP2300 NVRAM structure definition.
++ */
++typedef struct {
++	/*
++	 * NVRAM header
++	 */
++	uint8_t	id[4];
++	uint8_t	nvram_version;
++	uint8_t	reserved_0;
++
++	/*
++	 * NVRAM RISC parameter block
++	 */
++	uint8_t	parameter_block_version;
++	uint8_t	reserved_1;
++
++	/*
++	 * LSB BIT 0  = Enable Hard Loop Id
++	 * LSB BIT 1  = Enable Fairness
++	 * LSB BIT 2  = Enable Full-Duplex
++	 * LSB BIT 3  = Enable Fast Posting
++	 * LSB BIT 4  = Enable Target Mode
++	 * LSB BIT 5  = Disable Initiator Mode
++	 * LSB BIT 6  = Enable ADISC
++	 * LSB BIT 7  = Enable Target Inquiry Data
++	 *
++	 * MSB BIT 0  = Enable PDBC Notify
++	 * MSB BIT 1  = Non Participating LIP
++	 * MSB BIT 2  = Descending Loop ID Search
++	 * MSB BIT 3  = Acquire Loop ID in LIPA
++	 * MSB BIT 4  = Stop PortQ on Full Status
++	 * MSB BIT 5  = Full Login after LIP
++	 * MSB BIT 6  = Node Name Option
++	 * MSB BIT 7  = Ext IFWCB enable bit
++	 */
++	uint8_t	 firmware_options[2];
++
++	uint16_t frame_payload_size;
++	uint16_t max_iocb_allocation;
++	uint16_t execution_throttle;
++	uint8_t	 retry_count;
++	uint8_t	 retry_delay;			/* unused */
++	uint8_t	 port_name[WWN_SIZE];		/* Big endian. */
++	uint16_t hard_address;
++	uint8_t	 inquiry_data;
++	uint8_t	 login_timeout;
++	uint8_t	 node_name[WWN_SIZE];		/* Big endian. */
++
++	/*
++	 * LSB BIT 0 = Timer Operation mode bit 0
++	 * LSB BIT 1 = Timer Operation mode bit 1
++	 * LSB BIT 2 = Timer Operation mode bit 2
++	 * LSB BIT 3 = Timer Operation mode bit 3
++	 * LSB BIT 4 = Init Config Mode bit 0
++	 * LSB BIT 5 = Init Config Mode bit 1
++	 * LSB BIT 6 = Init Config Mode bit 2
++	 * LSB BIT 7 = Enable Non part on LIHA failure
++	 *
++	 * MSB BIT 0 = Enable class 2
++	 * MSB BIT 1 = Enable ACK0
++	 * MSB BIT 2 =
++	 * MSB BIT 3 =
++	 * MSB BIT 4 = FC Tape Enable
++	 * MSB BIT 5 = Enable FC Confirm
++	 * MSB BIT 6 = Enable command queuing in target mode
++	 * MSB BIT 7 = No Logo On Link Down
++	 */
++	uint8_t	 add_firmware_options[2];
++
++	uint8_t	 response_accumulation_timer;
++	uint8_t	 interrupt_delay_timer;
++
++	/*
++	 * LSB BIT 0 = Enable Read xfr_rdy
++	 * LSB BIT 1 = Soft ID only
++	 * LSB BIT 2 =
++	 * LSB BIT 3 =
++	 * LSB BIT 4 = FCP RSP Payload [0]
++	 * LSB BIT 5 = FCP RSP Payload [1] / Sbus enable - 2200
++	 * LSB BIT 6 = Enable Out-of-Order frame handling
++	 * LSB BIT 7 = Disable Automatic PLOGI on Local Loop
++	 *
++	 * MSB BIT 0 = Sbus enable - 2300
++	 * MSB BIT 1 =
++	 * MSB BIT 2 =
++	 * MSB BIT 3 =
++	 * MSB BIT 4 =
++	 * MSB BIT 5 = enable 50 ohm termination
++	 * MSB BIT 6 = Data Rate (2300 only)
++	 * MSB BIT 7 = Data Rate (2300 only)
++	 */
++	uint8_t	 special_options[2];
++
++	/* Reserved for expanded RISC parameter block */
++	uint8_t reserved_2[24];
++
++	/*
++	 * LSB BIT 0 = Output Swing 1G bit 0
++	 * LSB BIT 1 = Output Swing 1G bit 1
++	 * LSB BIT 2 = Output Swing 1G bit 2
++	 * LSB BIT 3 = Output Emphasis 1G bit 0
++	 * LSB BIT 4 = Output Emphasis 1G bit 1
++	 * LSB BIT 5 = Output Swing 2G bit 0
++	 * LSB BIT 6 = Output Swing 2G bit 1
++	 * LSB BIT 7 = Output Swing 2G bit 2
++	 *            
++	 * MSB BIT 0 = Output Emphasis 2G bit 0
++	 * MSB BIT 1 = Output Emphasis 2G bit 1
++	 * MSB BIT 2 = Output Enable
++	 * MSB BIT 3 =
++	 * MSB BIT 4 =
++	 * MSB BIT 5 =
++	 * MSB BIT 6 =
++	 * MSB BIT 7 =
++	 */
++	uint8_t seriallink_options[2];
++
++	/*
++	 * NVRAM host parameter block
++	 *
++	 * LSB BIT 0 = Enable spinup delay
++	 * LSB BIT 1 = Disable BIOS
++	 * LSB BIT 2 = Enable Memory Map BIOS
++	 * LSB BIT 3 = Enable Selectable Boot
++	 * LSB BIT 4 = Disable RISC code load
++	 * LSB BIT 5 = Set cache line size 1
++	 * LSB BIT 6 = PCI Parity Disable
++	 * LSB BIT 7 = Enable extended logging
++	 *
++	 * MSB BIT 0 = Enable 64bit addressing
++	 * MSB BIT 1 = Enable lip reset
++	 * MSB BIT 2 = Enable lip full login
++	 * MSB BIT 3 = Enable target reset
++	 * MSB BIT 4 = Enable database storage
++	 * MSB BIT 5 = Enable cache flush read
++	 * MSB BIT 6 = Enable database load
++	 * MSB BIT 7 = Enable alternate WWN
++	 */
++	uint8_t host_p[2];
++
++	uint8_t boot_node_name[WWN_SIZE];
++	uint8_t boot_lun_number;
++	uint8_t reset_delay;
++	uint8_t port_down_retry_count;
++	uint8_t boot_id_number;
++	uint16_t max_luns_per_target;
++	uint8_t fcode_boot_port_name[WWN_SIZE];
++	uint8_t alternate_port_name[WWN_SIZE];
++	uint8_t alternate_node_name[WWN_SIZE];
++
++	/*
++	 * BIT 0 = Boot Zoning
++	 * BIT 1 = Alt-Boot Enable
++	 * BIT 2 = Report SCSI Path
++	 * BIT 3 = unused
++	 * BIT 4 = unused
++	 * BIT 5 = unused
++	 * BIT 6 = unused
++	 * BIT 7 = unused
++	 */
++	uint8_t efi_parameters;
++
++	uint8_t link_down_timeout;
++
++	uint8_t adapter_id_0[4];
++	uint8_t adapter_id_1[4];
++	uint8_t adapter_id_2[4];
++	uint8_t adapter_id_3[4];
++
++	uint8_t alt1_boot_node_name[WWN_SIZE];
++	uint16_t alt1_boot_lun_number;
++	uint8_t alt2_boot_node_name[WWN_SIZE];
++	uint16_t alt2_boot_lun_number;
++	uint8_t alt3_boot_node_name[WWN_SIZE];
++	uint16_t alt3_boot_lun_number;
++	uint8_t alt4_boot_node_name[WWN_SIZE];
++	uint16_t alt4_boot_lun_number;
++	uint8_t alt5_boot_node_name[WWN_SIZE];
++	uint16_t alt5_boot_lun_number;
++	uint8_t alt6_boot_node_name[WWN_SIZE];
++	uint16_t alt6_boot_lun_number;
++	uint8_t alt7_boot_node_name[WWN_SIZE];
++	uint16_t alt7_boot_lun_number;
++
++	uint8_t reserved_3[2];
++
++	uint8_t oem_id;
++	uint8_t oem_specific[31];
++
++	/*
++	 * NVRAM Adapter Features offset 232-239
++	 *
++	 * LSB BIT 0 = External GBIC
++	 * LSB BIT 1 = Risc RAM parity
++	 * LSB BIT 2 = Buffer Plus Module
++	 * LSB BIT 3 = Multi Chip Adapter
++	 * LSB BIT 4 = Internal connector
++	 * LSB BIT 5 =
++	 * LSB BIT 6 =
++	 * LSB BIT 7 =
++	 *
++	 * MSB BIT 0 =
++	 * MSB BIT 1 =
++	 * MSB BIT 2 =
++	 * MSB BIT 3 =
++	 * MSB BIT 4 =
++	 * MSB BIT 5 =
++	 * MSB BIT 6 =
++	 * MSB BIT 7 =
++	 */
++	uint8_t	adapter_features[2];
++
++	uint8_t reserved_4[16];
++
++	/* Subsystem vendor ID for ISP2200 */
++	uint16_t subsystem_vendor_id_2200;
++
++	/* Subsystem device ID for ISP2200 */
++	uint16_t subsystem_device_id_2200;
++
++	uint8_t	 reserved_5;
++	uint8_t	 checksum;
++} nvram_t;
++
++
++/*
++ * ISP queue - command entry structure definition.
++ */
++#define MAX_CMDSZ   16			/* SCSI maximum CDB size. */
++typedef struct {
++	uint8_t		entry_type;	/* Entry type. */
++#define COMMAND_TYPE	0x11		/* Command entry */
++	uint8_t		entry_count;	/* Entry count. */
++	uint8_t		sys_define;	/* System defined. */
++	uint8_t		entry_status;	/* Entry Status. */
++	uint32_t	handle;		/* System handle. */
++#if defined(EXTENDED_IDS)
++	uint16_t	target;		/* SCSI ID */
++#else
++	uint8_t		reserved;
++	uint8_t		target;		/* SCSI ID */
++#endif
++	uint16_t	lun;		/* SCSI LUN */
++	uint16_t	control_flags;	/* Control flags. */
++#define CF_HEAD_TAG	BIT_1
++#define CF_ORDERED_TAG	BIT_2
++#define CF_SIMPLE_TAG	BIT_3
++#define CF_READ		BIT_5
++#define CF_WRITE	BIT_6
++	uint16_t	reserved_1;
++	uint16_t	timeout;	/* Command timeout. */
++	uint16_t	dseg_count;	/* Data segment count. */
++	uint8_t		scsi_cdb[MAX_CMDSZ]; 	/* SCSI command words. */
++	uint32_t	byte_count;	/* Total byte count. */
++	uint32_t	dseg_0_address;	/* Data segment 0 address. */
++	uint32_t	dseg_0_length;	/* Data segment 0 length. */
++	uint32_t	dseg_1_address;	/* Data segment 1 address. */
++	uint32_t	dseg_1_length;	/* Data segment 1 length. */
++	uint32_t	dseg_2_address;	/* Data segment 2 address. */
++	uint32_t	dseg_2_length;	/* Data segment 2 length. */
++} cmd_entry_t;
++
++/*
++ * ISP queue - 64-Bit addressing, command entry structure definition.
++ */
++#define COMMAND_A64_TYPE	0x19	/* Command A64 entry */
++typedef struct {
++	uint8_t		entry_type;	/* Entry type. */
++	uint8_t		entry_count;	/* Entry count. */
++	uint8_t		sys_define;	/* System defined. */
++	uint8_t		entry_status;	/* Entry Status. */
++	uint32_t	handle;		/* System handle. */
++#if defined(EXTENDED_IDS)
++	uint16_t	target;		/* SCSI ID */
++#else
++	uint8_t		reserved;
++	uint8_t		target;		/* SCSI ID */
++#endif
++	uint16_t	lun;		/* SCSI LUN */
++	uint16_t	control_flags;	/* Control flags. */
++	uint16_t	reserved_1;
++	uint16_t	timeout;	/* Command timeout. */
++	uint16_t	dseg_count;	/* Data segment count. */
++	uint8_t		scsi_cdb[MAX_CMDSZ];	/* SCSI command words. */
++	uint32_t	byte_count;	/* Total byte count. */
++	uint32_t	dseg_0_address[2];	/* Data segment 0 address. */
++	uint32_t	dseg_0_length;		/* Data segment 0 length. */
++	uint32_t	dseg_1_address[2];	/* Data segment 1 address. */
++	uint32_t	dseg_1_length;		/* Data segment 1 length. */
++} cmd_a64_entry_t, request_t;
++
++/*
++ * ISP queue - continuation entry structure definition.
++ */
++#define CONTINUE_TYPE		0x02	/* Continuation entry. */
++typedef struct {
++	uint8_t		entry_type;	/* Entry type. */
++	uint8_t		entry_count;	/* Entry count. */
++	uint8_t		sys_define;	/* System defined. */
++	uint8_t		entry_status;	/* Entry Status. */
++	uint32_t	reserved;
++	uint32_t	dseg_0_address;	/* Data segment 0 address. */
++	uint32_t	dseg_0_length;	/* Data segment 0 length. */
++	uint32_t	dseg_1_address;	/* Data segment 1 address. */
++	uint32_t	dseg_1_length;	/* Data segment 1 length. */
++	uint32_t	dseg_2_address;	/* Data segment 2 address. */
++	uint32_t	dseg_2_length;	/* Data segment 2 length. */
++	uint32_t	dseg_3_address;	/* Data segment 3 address. */
++	uint32_t	dseg_3_length;	/* Data segment 3 length. */
++	uint32_t	dseg_4_address;	/* Data segment 4 address. */
++	uint32_t	dseg_4_length;	/* Data segment 4 length. */
++	uint32_t	dseg_5_address;	/* Data segment 5 address. */
++	uint32_t	dseg_5_length;	/* Data segment 5 length. */
++	uint32_t	dseg_6_address;	/* Data segment 6 address. */
++	uint32_t	dseg_6_length;	/* Data segment 6 length. */
++} cont_entry_t;
++
++/*
++ * ISP queue - 64-Bit addressing, continuation entry structure definition.
++ */
++#define CONTINUE_A64_TYPE	0x0A	/* Continuation A64 entry. */
++typedef struct {
++	uint8_t		entry_type;	/* Entry type. */
++	uint8_t		entry_count;	/* Entry count. */
++	uint8_t		sys_define;	/* System defined. */
++	uint8_t		entry_status;	/* Entry Status. */
++	uint32_t	dseg_0_address[2]; /* Data segment 0 address. */
++	uint32_t	dseg_0_length;	/* Data segment 0 length. */
++	uint32_t	dseg_1_address[2]; /* Data segment 1 address. */
++	uint32_t	dseg_1_length;	/* Data segment 1 length. */
++	uint32_t	dseg_2_address[2]; /* Data segment 2 address. */
++	uint32_t	dseg_2_length;	/* Data segment 2 length. */
++	uint32_t	dseg_3_address[2]; /* Data segment 3 address. */
++	uint32_t	dseg_3_length;	/* Data segment 3 length. */
++	uint32_t	dseg_4_address[2]; /* Data segment 4 address. */
++	uint32_t	dseg_4_length;	/* Data segment 4 length. */
++} cont_a64_entry_t;
++
++/*
++ * ISP queue - status entry structure definition.
++ */
++#define STATUS_TYPE		0x03	/* Status entry. */
++#define STS_SENSE_BUF_LEN	32
++typedef struct {
++	uint8_t		entry_type;	/* Entry type. */
++	uint8_t		entry_count;	/* Entry count. */
++	uint8_t		sys_define;	/* System defined. */
++	uint8_t		entry_status;	/* Entry Status. */
++#define RF_INV_E_ORDER	BIT_5		/* Invalid entry order. */
++#define RF_INV_E_COUNT	BIT_4		/* Invalid entry count. */
++#define RF_INV_E_PARAM	BIT_3		/* Invalid entry parameter. */
++#define RF_INV_E_TYPE	BIT_2		/* Invalid entry type. */
++#define RF_BUSY		BIT_1		/* Busy */
++	uint32_t	handle;		/* System handle. */
++	uint16_t	scsi_status;	/* SCSI status. */
++	uint16_t	comp_status;	/* Completion status. */
++	uint16_t	state_flags;	/* State flags. */
++	uint16_t	status_flags;	/* Status flags. */
++#define IOCBSTAT_SF_LOGO BIT_13		/* Logo after 2 abts w/no */
++					/* response (2 sec) */
++	uint16_t	rsp_info_len;	/* Response Info Length. */
++	uint16_t	req_sense_length; /* Request sense data length. */
++	uint32_t	residual_length;  /* Residual transfer length. */
++	uint8_t		rsp_info[8];	/* FCP response information. */
++					/* Request sense data. */
++	uint8_t		req_sense_data[STS_SENSE_BUF_LEN];
++} sts_entry_t, response_t;
++
++/*
++ * ISP queue - marker entry structure definition.
++ */
++#define MARKER_TYPE	0x04		/* Marker entry. */
++typedef struct {
++	uint8_t		entry_type;	/* Entry type. */
++	uint8_t		entry_count;	/* Entry count. */
++	uint8_t		sys_define;	/* System defined. */
++	uint8_t		entry_status;	/* Entry Status. */
++	uint32_t	sys_define_2;	/* System defined. */
++#if defined(EXTENDED_IDS)
++	uint16_t	target;		/* SCSI ID */
++#else
++	uint8_t		reserved;
++	uint8_t		target;		/* SCSI ID */
++#endif
++	uint8_t		modifier;	/* Modifier (7-0). */
++#define MK_SYNC_ID_LUN	0		/* Synchronize ID/LUN */
++#define MK_SYNC_ID	1		/* Synchronize ID */
++#define MK_SYNC_ALL	2		/* Synchronize all ID/LUN */
++#define MK_SYNC_LIP	3		/* Synchronize all ID/LUN, */
++					/* clear port changed, */
++					/* use sequence number. */
++	uint8_t		reserved_1;
++	uint16_t	sequence_number; /* Sequence number of event */
++	uint16_t	lun;		/* SCSI LUN */
++	uint8_t		reserved_2[48];
++} mrk_entry_t;
++
++/*
++ * ISP queue - Status Contination entry structure definition.
++ */
++#define STATUS_CONT_TYPE	0x10	/* Status contination entry */
++#define EXT_STS_SENSE_BUF_LEN	60
++typedef struct {
++	uint8_t		entry_type;	/* Entry type. */
++	uint8_t		entry_count;	/* Entry count. */
++	uint8_t		reserved;
++	uint8_t		entry_status;	/* Entry Status. */
++					/* Extended sense data. */
++	uint8_t		req_sense_data[EXT_STS_SENSE_BUF_LEN];   
++} sts_cont_entry_t;
++
++/*
++ * ISP queue - Management Server entry structure definition.
++ */
++#define MS_IOCB_TYPE		0x29	/* Management Server IOCB entry */
++typedef struct {
++	uint8_t		entry_type;	/* Entry type. */
++	uint8_t		entry_count;	/* Entry count. */
++	uint8_t		sys_define;	/* System defined. */
++	uint8_t		entry_status;	/* Entry Status. */
++	uint32_t	handle1;	/* System handle. */
++#if defined(EXTENDED_IDS)
++	uint16_t	loop_id;
++#else
++	uint8_t		reserved;
++	uint8_t		loop_id;
++#endif
++	uint16_t	status;
++	uint16_t	control_flags;	/* Control flags. */
++	uint16_t	reserved2;
++	uint16_t	timeout;
++	uint16_t	cmd_dsd_count;
++	uint16_t	total_dsd_count;
++	uint8_t		type;
++	uint8_t		r_ctl;
++	uint16_t	rx_id;
++	uint16_t	reserved3;
++	uint32_t	handle2;
++	uint32_t	rsp_bytecount;
++	uint32_t	req_bytecount;
++	uint32_t	dseg_req_address[2]; /* Data segment 0 address. */
++	uint32_t	dseg_req_length;     /* Data segment 0 length. */
++	uint32_t	dseg_rsp_address[2]; /* Data segment 1 address. */
++	uint32_t	dseg_rsp_length;     /* Data segment 1 length. */
++} ms_iocb_entry_t;
++
++
++/*
++ * ISP queue - Mailbox Command entry structure definition.
++ */
++#define ET_MAILBOX_COMMAND	0x39
++struct mbx_entry {
++	uint8_t		entry_type;
++
++	uint8_t		entry_count;
++	uint8_t		sys_define1;
++	/* Use sys_define1 for source type */
++#define SOURCE_SCSI	0x00
++#define SOURCE_IP	0x01
++#define SOURCE_VI	0x02
++#define SOURCE_SCTP	0x03
++#define SOURCE_MP	0x04
++#define SOURCE_MPIOCTL	0x05
++
++	uint8_t		entry_status;
++
++	uint32_t	handle;
++#if defined(EXTENDED_IDS)
++	uint16_t	loop_id;
++#else
++	uint8_t		reserved_1;
++	uint8_t		loop_id;
++#endif
++
++	uint16_t	status;
++	uint16_t	state_flags;
++	uint16_t	status_flags;
++	uint16_t	sys_define2[4];
++	uint16_t	mb0;
++	/* Mailbox command completion status */
++#define MBS_PORT_ID_IN_USE		0x4007
++#define MBS_LOOP_ID_IN_USE		0x4008
++#define MBS_ALL_LOOP_IDS_IN_USE		0x4009
++#define MBS_NAME_SERVER_NOT_LOGGED_IN	0x400A
++
++	uint16_t	mb1;
++	/* Fabric login mailbox command option bits */
++#define MBC_NO_PLOGI_IF_LOGGED_IN	0x01
++#define MBC_NO_PROCESS_LOGIN		0x02
++
++	uint16_t	mb2;
++	uint16_t	mb3;
++	uint16_t	mb6;
++	uint16_t	mb7;
++#if defined(EXTENDED_IDS)
++	uint16_t	mb9;
++	uint16_t	mb10;
++	uint32_t	reserved_2[6];
++#else
++	uint32_t	reserved_2[7];
++#endif
++};
++
++/*
++ * ISP request and response queue entry sizes
++ */
++#define RESPONSE_ENTRY_SIZE	(sizeof(response_t))
++#define REQUEST_ENTRY_SIZE	(sizeof(request_t))
++
++/*
++ * ISP status entry - completion status definitions.
++ */
++#define CS_COMPLETE		0x0	/* No errors */
++#define CS_INCOMPLETE		0x1	/* Incomplete transfer of cmd. */
++#define CS_DMA			0x2	/* A DMA direction error. */
++#define CS_TRANSPORT		0x3	/* Transport error. */
++#define CS_RESET		0x4	/* SCSI bus reset occurred */
++#define CS_ABORTED		0x5	/* System aborted command. */
++#define CS_TIMEOUT		0x6	/* Timeout error. */
++#define CS_DATA_OVERRUN		0x7	/* Data overrun. */
++#define CS_DATA_UNDERRUN	0x15	/* Data Underrun. */
++#define CS_ABORT_MSG		0xE	/* Target rejected abort msg. */
++#define CS_DEV_RESET_MSG	0x12	/* Target rejected dev rst msg. */
++#define CS_PORT_UNAVAILABLE	0x28	/* Port unavailable (selection timeout) */
++#define CS_PORT_LOGGED_OUT	0x29	/* Port Logged Out */
++#define CS_PORT_CONFIG_CHG	0x2A	/* Port Configuration Changed */
++#define CS_PORT_BUSY		0x2B	/* Port Busy */
++#define CS_BAD_PAYLOAD		0x80	/* Driver defined */
++#define CS_UNKNOWN		0x81	/* Driver defined */
++#define CS_RETRY		0x82	/* Driver defined */
++#define CS_QUEUE_FULL		0x1c	/* Target queue full*/
++
++/*
++ * ISP status entry - SCSI status byte bit definitions.
++ */
++#define SS_MASK			0xfff /* Mask off reserved bits BIT_12-BIT_15*/
++#define SS_RESIDUAL_UNDER	BIT_11
++#define SS_RESIDUAL_OVER	BIT_10
++#define SS_SENSE_LEN_VALID	BIT_9
++#if defined(ISP2100)
++#define SS_RESIDUAL_LEN_VALID	BIT_8
++#else
++#define SS_RESPONSE_INFO_LEN_VALID	BIT_8
++#endif
++
++#define SS_RESERVE_CONFLICT	(BIT_4 | BIT_3)
++#define SS_BUSY_CONDITION	BIT_3
++#define SS_CONDITION_MET	BIT_2
++#define SS_CHECK_CONDITION	BIT_1
++
++/*
++ * 24 bit port ID type definition.
++ */
++typedef union {
++	uint32_t	b24 : 24;
++
++	struct {
++		uint8_t	d_id[3];
++		uint8_t	rsvd_1;
++	} r;
++
++	struct {
++		uint8_t	al_pa;
++		uint8_t	area;
++		uint8_t	domain;
++		uint8_t	rsvd_1;
++	} b;
++} port_id_t;
++
++/*
++ * Switch info gathering structure.
++ */
++typedef struct {
++	port_id_t	d_id;
++	uint8_t		node_name[WWN_SIZE];
++	uint8_t		port_name[WWN_SIZE];
++	uint32_t	type;
++#define SW_TYPE_SCSI	BIT_0
++#define SW_TYPE_IP	BIT_1
++} sw_info_t;
++
++//TODO This should be removed (simplified fcport list)
++typedef struct
++{
++    port_id_t d_id;
++    uint8_t   name[WWN_SIZE];
++    uint8_t   wwn[WWN_SIZE];          /* port name */
++    uint16_t  loop_id;
++    uint16_t   flag;
++  /* flags bits defined as follows */
++#define DEV_PUBLIC          BIT_0
++#define DEV_LUNMASK_SET     BIT_1  /* some LUNs masked for this device */
++#define	DEV_TAPE_DEVICE		BIT_2
++#define	DEV_RELOGIN	        BIT_3
++#define	DEV_PORT_DOWN	    BIT_4
++#define	DEV_CONFIGURED    	BIT_5
++#define	DEV_ABSENCE    		BIT_6
++#define	DEV_RETURN    		BIT_7
++#define	DEV_INITIATOR  		BIT_8
++#define	DEV_FLAG_VSA  		BIT_9
++	int			port_login_retry_count;
++    uint8_t  port_timer;
++}fcdev_t;
++
++/* New device name list struct; used in configure_fabric. */
++struct new_dev {
++    port_id_t  d_id;
++    uint8_t    name[WWN_SIZE];
++    uint8_t    wwn[WWN_SIZE];          /* port name */
++};
++#define LOGOUT_PERFORMED  0x01
++
++
++/*
++ * Inquiry command structure.
++ */
++#define INQ_SCSI_OPCODE		0x12
++#define	INQ_DATA_SIZE		36
++
++/*
++ * Inquiry mailbox IOCB packet definition.
++ */
++typedef struct {
++	union {
++		cmd_a64_entry_t	cmd;
++		sts_entry_t	rsp;
++	} p;
++	uint8_t		inq[INQ_DATA_SIZE];
++} inq_cmd_rsp_t;
++
++/*
++ * Report LUN command structure.
++ */
++#define RPT_LUN_SCSI_OPCODE	0xA0
++#define CHAR_TO_SHORT(a, b)	(uint16_t)((uint8_t)b << 8 | (uint8_t)a)
++
++typedef struct {
++	uint32_t	len;
++	uint32_t	rsrv;
++} rpt_hdr_t;
++
++typedef struct {
++	struct {
++		uint8_t	b : 6;
++		uint8_t	address_method : 2;
++	} msb;
++	uint8_t		lsb;
++	uint8_t		unused[6];
++} rpt_lun_t;
++
++typedef struct {
++	rpt_hdr_t	hdr;
++	rpt_lun_t	lst[MAX_LUNS];
++} rpt_lun_lst_t;
++
++/*
++ * Report Lun mailbox IOCB packet definition.
++ */
++typedef struct {
++	union {
++		cmd_a64_entry_t cmd;
++		sts_entry_t rsp;
++	} p;
++	rpt_lun_lst_t list;
++} rpt_lun_cmd_rsp_t;
++
++//TODO Continue formatting
++/*
++ * SCSI Target Queue structure
++ */
++typedef struct os_tgt {
++	struct os_lun		*olun[MAX_LUNS]; /* LUN context pointer. */
++	uint8_t			port_down_retry_count;
++	struct scsi_qla_host	*ha;
++    	uint32_t		down_timer;
++
++	/* Persistent binding information */
++	port_id_t		d_id;
++	uint8_t			node_name[WWN_SIZE];
++	uint8_t			port_name[WWN_SIZE];
++	struct fc_port		*vis_port;
++
++	uint8_t			flags;
++#define	TGT_BUSY		BIT_0		/* Reached hi-water mark */
++#define	TGT_TAGGED_QUEUE	BIT_1		/* Tagged queuing. */
++} os_tgt_t;
++
++/*
++ * SCSI LUN Queue structure
++ */
++typedef struct os_lun {
++	struct fc_lun	*fclun;		/* FC LUN context pointer. */
++    	spinlock_t      q_lock;       /* Lun Lock */
++
++	u_long		io_cnt;     /* total xfer count since boot */
++	u_long		out_cnt;    /* total outstanding IO count */
++	u_long		w_cnt;      /* total writes */
++	u_long		r_cnt;      /* total reads */
++	u_long		avg_time;      /*  */
++
++	unsigned long	q_flag;
++#define	LUN_MPIO_BUSY		2	/* Lun is changing paths  */
++#define	LUN_SCSI_SCAN_DONE	BIT_3	/* indicates the scsi scan is done */
++#define	LUN_EXEC_DELAYED	7	/* Lun execution is delayed */
++
++	u_long		q_timeout;           /* total command timeouts */
++	atomic_t	q_timer;  /* suspend timer */
++	uint32_t	q_count;	/* current count */
++	uint32_t	q_max;		/* maxmum count lun can be suspended */
++	uint8_t		q_state;	/* lun State */
++#define	LUN_STATE_READY	1	/* indicates the lun is ready for i/o */
++#define	LUN_STATE_RUN	2	/* indicates the lun has a timer running */
++#define	LUN_STATE_WAIT	3	/* indicates the lun is suspended */
++#define	LUN_STATE_TIMEOUT  4	/* indicates the lun has timed out */
++
++} os_lun_t;
++
++
++/* LUN BitMask structure definition, array of 32bit words,
++ * 1 bit per lun.  When bit == 1, the lun is masked.
++ * Most significant bit of mask[0] is lun 0, bit 24 is lun 7.
++ */
++typedef struct lun_bit_mask {
++	/* Must allocate at least enough bits to accomodate all LUNs */
++#if ((MAX_FIBRE_LUNS & 0x7) == 0)
++	UINT8	mask[MAX_FIBRE_LUNS >> 3];
++#else
++	uint8_t	mask[(MAX_FIBRE_LUNS + 8) >> 3];
++#endif
++} lun_bit_mask_t;
++
++/*
++ * Fibre channel port structure.
++ */
++typedef struct fc_port {
++	struct list_head	list;
++
++	struct list_head	fcluns;
++
++	struct scsi_qla_host	*ha;
++	struct scsi_qla_host	*vis_ha; /* only used when suspending lun */
++	port_id_t		d_id;
++	uint16_t		loop_id;
++	uint16_t		old_loop_id;
++	int16_t			lun_cnt;
++	int16_t			dev_id;	/* index in fc_dev table */
++#define FC_NO_LOOP_ID		0x100
++	uint8_t			node_name[WWN_SIZE];	/* Big Endian. */
++	uint8_t			port_name[WWN_SIZE];	/* Big Endian. */
++	uint8_t			mp_byte;	/* multi-path byte (not used) */
++    	uint8_t		cur_path;		/* current path id */
++	int			port_login_retry_count;
++	int		login_retry;
++	atomic_t		state;		/* port state */
++#define FC_DEVICE_DEAD		1
++#define FC_DEVICE_LOST		2
++#define FC_ONLINE		3
++#define FC_LOGIN_NEEDED		4
++
++	uint8_t			flags;
++#define	FC_FABRIC_DEVICE	BIT_0
++#define	FC_TAPE_DEVICE		BIT_1
++#define	FC_INITIATOR_DEVICE	BIT_2
++#define	FC_CONFIG		BIT_3
++#define	FC_VSA			BIT_4
++#define	FC_HD_DEVICE		BIT_5
++#define	FC_SUPPORT_RPT_LUNS	BIT_6
++	atomic_t	port_down_timer;
++	lun_bit_mask_t	lun_mask;
++} fc_port_t;
++
++/*
++ * Fibre channel LUN structure.
++ */
++typedef struct fc_lun {
++        struct list_head	list;
++
++	fc_port_t		*fcport;
++	uint16_t		lun;
++	uint8_t			max_path_retries;
++	uint8_t			flags;
++#define	FC_DISCON_LUN		BIT_0
++} fc_lun_t;
++
++typedef struct
++{
++    uint8_t   in_use;
++}fabricid_t;
++
++typedef struct {
++	struct list_head	list;
++
++	uint8_t		node_name[WWN_SIZE];
++	uint8_t		port_name[WWN_SIZE];
++	port_id_t	d_id;
++	uint16_t	loop_id;
++} fc_initiator_t;
++
++/*
++ * Registered State Change Notification structures.
++ */
++typedef struct {
++    port_id_t d_id;
++    uint8_t format;
++} rscn_t;
++
++/*
++ * Flash Database structures.
++ */
++#define FLASH_DATABASE_0        0x1c000
++#define FLASH_DATABASE_1        0x18000
++#define FLASH_DATABASE_VERSION  1
++
++typedef struct
++{
++    uint32_t seq;
++    uint8_t  version;
++    uint8_t  checksum;
++    uint16_t size;
++    uint8_t  spares[8];
++}flash_hdr_t;
++
++typedef struct
++{
++    uint8_t name[WWN_SIZE];
++    uint8_t  spares[8];
++}flash_node_t;
++
++typedef struct
++{
++    flash_hdr_t  hdr;
++    flash_node_t node[MAX_FIBRE_DEVICES];
++}flash_database_t;
++//TODO End formatting
++
++/*
++ * FC-CT interface
++ *
++ * NOTE: All structures are in big-endian in form.
++ */
++
++#define CT_REJECT_RESPONSE	0x8001
++#define CT_ACCEPT_RESPONSE	0x8002
++
++#define NS_N_PORT_TYPE	0x01
++#define NS_NL_PORT_TYPE	0x02
++#define NS_NX_PORT_TYPE	0x7F
++
++#define	GA_NXT_CMD	0x100
++#define	GA_NXT_REQ_SIZE	(16 + 4)
++#define	GA_NXT_RSP_SIZE	(16 + 620)
++
++#define	GID_PT_CMD	0x1A1
++#define	GID_PT_REQ_SIZE	(16 + 4)
++#define	GID_PT_RSP_SIZE	(16 + (MAX_FIBRE_DEVICES * 4))
++
++#define	GPN_ID_CMD	0x112
++#define	GPN_ID_REQ_SIZE	(16 + 4)
++#define	GPN_ID_RSP_SIZE	(16 + 8)
++
++#define	GNN_ID_CMD	0x113
++#define	GNN_ID_REQ_SIZE	(16 + 4)
++#define	GNN_ID_RSP_SIZE	(16 + 8)
++
++#define	GFT_ID_CMD	0x117
++#define	GFT_ID_REQ_SIZE	(16 + 4)
++#define	GFT_ID_RSP_SIZE	(16 + 32)
++
++#define	RFT_ID_CMD	0x217
++#define	RFT_ID_REQ_SIZE	(16 + 4 + 32)
++#define	RFT_ID_RSP_SIZE	16
++
++#define	RFF_ID_CMD	0x21F
++#define	RFF_ID_REQ_SIZE	(16 + 4 + 2 + 1 + 1)
++#define	RFF_ID_RSP_SIZE	16
++
++#define	RNN_ID_CMD	0x213
++#define	RNN_ID_REQ_SIZE	(16 + 4 + 8)
++#define	RNN_ID_RSP_SIZE	16
++
++#define	RSNN_NN_CMD	 0x239
++#define	RSNN_NN_REQ_SIZE (16 + 8 + 1 + 255)
++#define	RSNN_NN_RSP_SIZE 16
++
++/* CT command header -- request/response common fields */
++struct ct_cmd_hdr {
++	uint8_t	revision;
++	uint8_t	in_id[3];
++	uint8_t gs_type;
++	uint8_t gs_subtype;
++	uint8_t options;
++	uint8_t reserved;
++};
++
++/* CT command request */
++struct ct_sns_req {
++	struct ct_cmd_hdr header;
++	uint16_t	command;
++	uint16_t	max_rsp_size;
++	uint32_t	reserved;
++
++	union {
++		/* GA_NXT, GPN_ID, GNN_ID, GFT_ID */
++		struct {
++			uint8_t reserved;
++			uint8_t	port_id[3];
++		} port_id;
++
++		struct {
++			uint8_t port_type;
++			uint8_t	domain;
++			uint8_t	area;
++			uint8_t	reserved;
++		} gid_pt;
++
++		struct {
++			uint8_t reserved;
++			uint8_t	port_id[3];
++			uint8_t	fc4_types[32];
++		} rft_id;
++
++		struct {
++			uint8_t reserved;
++			uint8_t	port_id[3];
++			uint16_t reserved2;
++			uint8_t	fc4_feature;
++			uint8_t	fc4_type;
++		} rff_id;
++
++		struct {
++			uint8_t reserved;
++			uint8_t	port_id[3];
++			uint8_t	node_name[8];
++		} rnn_id;
++
++		struct {
++			uint8_t	node_name[8];
++			uint8_t	name_len;
++			uint8_t	sym_node_name[255];
++		} rsnn_nn;
++	} req;
++};
++
++/* CT command response header */
++struct ct_rsp_hdr {
++	struct ct_cmd_hdr header;
++	uint16_t	response;
++	uint16_t	residual;
++	uint8_t		reserved;
++	uint8_t		reason_code;
++	uint8_t		explanation_code;
++	uint8_t		vendor_unique;
++};
++
++struct ct_sns_gid_pt_data {
++	uint8_t	control_byte;
++	uint8_t	port_id[3];
++};
++
++struct ct_sns_rsp {
++	struct ct_rsp_hdr header;
++
++	union {
++		struct {
++			uint8_t	port_type;
++			uint8_t	port_id[3];
++			uint8_t	port_name[8];
++			uint8_t	sym_port_name_len;
++			uint8_t	sym_port_name[255];
++			uint8_t	node_name[8];
++			uint8_t	sym_node_name_len;
++			uint8_t	sym_node_name[255];
++			uint8_t	init_proc_assoc[8];
++			uint8_t	node_ip_addr[16];
++			uint8_t	class_of_service[4];
++			uint8_t	fc4_types[32];
++			uint8_t ip_address[16];
++			uint8_t	fabric_port_name[8];
++			uint8_t	reserved;
++			uint8_t	hard_address[3];
++		} ga_nxt;
++
++		struct {
++			struct ct_sns_gid_pt_data entries[MAX_FIBRE_DEVICES];
++		} gid_pt;
++
++		struct {
++			uint8_t	port_name[8];
++		} gpn_id;
++
++		struct {
++			uint8_t	node_name[8];
++		} gnn_id;
++
++		struct {
++			uint8_t	fc4_types[32];
++		} gft_id;
++	} rsp;
++};
++
++struct ct_sns_pkt {
++	union {
++		struct ct_sns_req req;
++		struct ct_sns_rsp rsp;
++	} p;
++};
++
++#if defined(ISP2100)
++#define GN_LIST_LENGTH  126 * sizeof(port_list_entry_t)
++#else
++#define GN_LIST_LENGTH  256 * sizeof(port_list_entry_t)
++#endif
++
++/*
++ * Structure used in Get Port List mailbox command (0x75).
++ */
++typedef struct {
++	uint8_t		name[WWN_SIZE];
++	uint16_t	loop_id;
++} port_list_entry_t;
++
++/*
++ * Structure used for device info.
++ */
++typedef struct {
++	uint8_t		name[WWN_SIZE];
++	uint8_t		wwn[WWN_SIZE];
++	uint16_t		loop_id;
++	uint8_t		port_id[3];
++} device_data_t;
++
++//TODO Complete Formatting...
++
++/* Mailbox command completion status */
++#define MBS_PORT_ID_IN_USE              0x4007
++#define MBS_LOOP_ID_IN_USE              0x4008
++#define MBS_ALL_LOOP_IDS_IN_USE         0x4009
++#define MBS_NAME_SERVER_NOT_LOGGED_IN   0x400A
++
++
++#define MAX_IOCTL_WAIT_THREADS	32
++typedef struct _wait_q_t {
++	uint8_t			flags;
++#define WQ_IN_USE	0x1
++
++	struct semaphore	wait_q_sem;
++	struct _wait_q_t	*pnext;
++} wait_q_t;
++
++typedef struct hba_ioctl{
++
++	/* Ioctl cmd serialization */
++	uint16_t	access_bits; /* bits should be used atomically */
++#define IOCTL_ACTIVE	1 /* first bit */
++#define IOCTL_WANT	2 /* 2nd bit */
++
++	spinlock_t	wait_q_lock; /* IOCTL wait_q Queue Lock */
++	wait_q_t	wait_q_arr[MAX_IOCTL_WAIT_THREADS];
++	wait_q_t	*wait_q_head;
++	wait_q_t	*wait_q_tail;
++
++	/* Passthru cmd/completion */
++	struct semaphore	cmpl_sem;
++	struct timer_list	cmpl_timer;
++	uint8_t		ioctl_tov;
++	uint8_t		SCSIPT_InProgress;
++	uint8_t		MSIOCB_InProgress;
++
++	os_tgt_t	*ioctl_tq;
++	os_lun_t	*ioctl_lq;
++
++	/* AEN queue */
++	void		*aen_tracking_queue;/* points to async events buffer */
++	uint8_t		aen_q_head;	/* index to the current head of q */
++	uint8_t		aen_q_tail;	/* index to the current tail of q */
++
++	/* Misc. */
++	uint32_t	flags;
++#define	IOCTL_OPEN			BIT_0
++#define	IOCTL_AEN_TRACKING_ENABLE	BIT_1
++	uint8_t		*scrap_mem;	/* per ha scrap buf for ioctl usage */
++	uint32_t	scrap_mem_size; /* total size */
++	uint32_t	scrap_mem_used; /* portion used */
++
++} hba_ioctl_context;
++
++/* Mailbox command semaphore queue for command serialization */
++typedef struct _mbx_cmdq_t {
++	struct semaphore	cmd_sem;
++	struct _mbx_cmdq_t	*pnext;
++} mbx_cmdq_t;
++
++/*
++ * Linux Host Adapter structure
++ */
++typedef struct scsi_qla_host
++{
++	struct list_head	list;
++
++	/* Linux adapter configuration data */
++	struct Scsi_Host *host;             /* pointer to host data */
++	struct pci_dev   *pdev;
++
++	u_long            host_no;
++	u_long            instance;
++
++	device_reg_t     *iobase;           /* Base Memory-mapped I/O address */
++	volatile unsigned char  *mmpbase;      /* memory mapped address */
++
++	struct qla_board_info	*brd_info;
++	uint16_t		fw_major_version;
++	uint16_t		fw_minor_version;
++	uint16_t		fw_subminor_version;
++	uint16_t		fw_attributes;
++	uint32_t		fw_transfer_size;
++
++	uint16_t		fw_options1;
++	uint16_t		fw_options2;
++	uint16_t		fw_options3;
++	uint8_t			fw_seriallink_options[2];
++
++	ms_iocb_entry_t		*ms_iocb;
++	dma_addr_t		ms_iocb_dma;
++	struct ct_sns_pkt	*ct_sns;
++	dma_addr_t		ct_sns_dma;
++
++	uint16_t		isp_ctrl_status;
++
++	uint16_t           revision;
++	uint8_t           ports;
++	u_long            actthreads;
++	u_long            ipreq_cnt;
++	u_long            qthreads;
++	u_long            spurious_int;
++	uint32_t        total_isr_cnt;		/* Interrupt count */
++	uint32_t        total_isp_aborts;	/* controller err cnt */
++	uint32_t        total_lip_cnt;		/* LIP cnt */
++	uint32_t	total_dev_errs;		/* device error cnt */
++	uint32_t	total_ios;		/* IO cnt */
++	uint64_t	total_bytes;		/* xfr byte cnt */
++
++	/* Adapter I/O statistics for failover */
++	uint64_t	IosRequested;
++	uint64_t	BytesRequested;
++	uint64_t	IosExecuted;
++	uint64_t	BytesExecuted;
++
++	/* ISP connection configuration data */
++	uint16_t         max_public_loop_ids;
++	uint16_t         min_external_loopid; /* First external loop Id */
++	uint8_t          current_topology; /* Current ISP configuration */
++	uint8_t          prev_topology;    /* Previous ISP configuration */
++                     #define ISP_CFG_NL     1
++                     #define ISP_CFG_N      2
++                     #define ISP_CFG_FL     4
++                     #define ISP_CFG_F      8
++	uint8_t         id;                 /* Host adapter SCSI id */
++	uint16_t        loop_id;       /* Host adapter loop id */
++	port_id_t       d_id;           /* Host adapter port id */
++
++	uint8_t         operating_mode;  /* current F/W operating mode */
++		#define LOOP      0
++		#define P2P       1
++		#define LOOP_P2P  2
++		#define P2P_LOOP  3
++
++	uint8_t         active_fc4_types;/* active fc4 types */
++	uint8_t         current_speed;   /* current F/W operating speed */
++
++	/* NVRAM configuration data */
++	uint16_t        loop_reset_delay;   /* Loop reset delay. */
++	uint16_t        hiwat;              /* High water mark per device. */
++	uint16_t        execution_throttle; /* queue depth */ 
++	uint16_t        minimum_timeout;    /* Minimum timeout. */
++	uint8_t         retry_count;
++	uint8_t         login_timeout;
++	int             port_down_retry_count;
++	uint8_t         loop_down_timeout;
++	uint16_t        max_probe_luns;
++	uint16_t        max_luns;
++	uint16_t        max_targets;
++	
++	/* Fibre Channel Device List. */
++        struct list_head	fcports;
++
++	/* OS target queue pointers. */
++	os_tgt_t		*otgt[MAX_FIBRE_DEVICES];
++
++	/* Fibre Channel Device Database and LIP sequence. */
++	fcdev_t           fc_db[MAX_FIBRE_DEVICES]; /* Driver database. */
++	uint32_t          flash_db;         /* Flash database address in use. */
++	fabricid_t        fabricid[MAX_FIBRE_DEVICES]; /* Fabric ids table . */
++	uint32_t          flash_seq;        /* Flash database seq # in use. */
++	volatile uint16_t lip_seq;          /* LIP sequence number. */
++	
++	/* Tracks host adapters we find */	
++	struct list_head	fcinitiators;	/* Initiator database */
++    
++	  /* RSCN queue. */
++	rscn_t rscn_queue[MAX_RSCN_COUNT];
++	uint8_t rscn_in_ptr;
++	uint8_t rscn_out_ptr;
++
++	/* Doneq bottom half handler */
++	struct work_struct run_qla_task;
++
++	/* __get_free_pages() srb_t pool */
++	srb_t	*srb_pool;
++	int	srb_pool_order;
++
++	/*
++	 * Need to hold the list_lock with irq's disabled in order to
++	 * access the following list.
++	 * This list_lock is of lower priority than the io_request_lock.
++	 */
++	/*********************************************************/
++        spinlock_t              list_lock;      /* lock to guard lists which 
++						   hold srb_t's*/
++        struct list_head        retry_queue;    /* watchdog queue */
++        struct list_head        done_queue;     /* job on done queue */
++        struct list_head        failover_queue; /* failover list link. */
++	struct list_head        free_queue;     /* SRB free queue */
++	struct list_head        scsi_retry_queue;     /* SCSI retry queue */
++	
++	struct list_head        pending_queue;	/* SCSI command pending queue */
++
++        /*********************************************************/
++
++	/* This spinlock is used to protect "io transactions", you must	
++	 * aquire it before doing any IO to the card, eg with RD_REG*() and
++	 * WRT_REG*() for the duration of your entire commandtransaction.
++	 *
++	 * This spinlock is of lower priority than the io request lock.
++	 */
++
++	spinlock_t		hardware_lock;
++
++	/* Linux kernel thread */
++#if 0
++	struct task_struct  *dpc_handler;     /* kernel thread */
++	struct semaphore    *dpc_notify;     /* requester waits for DPC on this semaphore */
++	struct semaphore    dpc_sem;       /* DPC's semaphore */
++#endif
++	pid_t			dpc_pid;
++	int			dpc_should_die;
++	struct completion	dpc_inited;
++	struct completion	dpc_exited;
++	struct semaphore	*dpc_wait;
++
++	uint8_t dpc_active;                  /* DPC routine is active */
++
++	/* Received ISP mailbox data. */
++	volatile uint16_t mailbox_out[MAILBOX_REGISTER_COUNT];
++
++	/* Outstandings ISP commands. */
++	srb_t           *outstanding_cmds[MAX_OUTSTANDING_COMMANDS];
++	uint32_t current_outstanding_cmd; 
++
++	/* ISP ring lock, rings, and indexes */
++	dma_addr_t	request_dma;        /* Physical address. */
++	request_t       *request_ring;      /* Base virtual address */
++	request_t       *request_ring_ptr;  /* Current address. */
++	uint16_t        req_ring_index;     /* Current index. */
++	uint16_t        req_q_cnt;          /* Number of available entries. */
++
++	dma_addr_t	response_dma;       /* Physical address. */
++	response_t      *response_ring;     /* Base virtual address */
++	response_t      *response_ring_ptr; /* Current address. */
++	uint16_t        rsp_ring_index;     /* Current index. */
++    
++#if defined(FC_IP_SUPPORT)
++	/* Data for IP support */
++	uint8_t		ip_port_name[WWN_SIZE];
++
++	struct risc_rec_entry *risc_rec_q;	/* RISC receive queue */
++	dma_addr_t	risc_rec_q_dma;		/*  physical address */
++	uint16_t	rec_entries_in;
++	uint16_t	rec_entries_out;
++
++	struct send_cb	*active_scb_q[MAX_SEND_PACKETS];
++	uint32_t	current_scb_q_idx;
++
++	uint32_t	mtu;
++	uint16_t	header_size;
++	uint16_t        max_receive_buffers;
++	struct buffer_cb *receive_buffers;
++	uint32_t	receive_buff_data_size;
++
++	void		(*send_completion_routine)
++				(struct send_cb *scb);
++	void		*receive_packets_context;
++	void		(*receive_packets_routine)
++				(void *context, struct buffer_cb *bcb);
++	void		*notify_context;
++	void		(*notify_routine)
++				(void *context, uint32_t type);
++
++	struct ip_device ipdev_db[QLLAN_MAX_IP_DEVICES];
++	struct ip_device *ipdev_db_next_free;
++	struct ip_device *ipdev_db_top;
++	struct ip_device *ipdev_db_bottom;
++#endif
++
++	/* Firmware Initialization Control Block data */
++	dma_addr_t	init_cb_dma;         /* Physical address. */
++	init_cb_t       *init_cb;
++  
++	/* Timeout timers. */
++	uint8_t         queue_restart_timer;   
++	atomic_t         loop_down_timer;         /* loop down timer */
++	uint8_t         loop_down_abort_time;    /* port down timer */
++	uint32_t        timer_active;
++	uint32_t        forceLip;
++	struct timer_list        timer;
++
++	/* These are used by mailbox operations. */
++	mbx_cmd_t	*mcp;
++	unsigned long	mbx_cmd_flags;
++#define MBX_CMD_ACTIVE	1 /* first bit */
++#define MBX_CMD_WANT	2 /* 2nd bit */
++#define MBX_INTERRUPT	3 /* 3rd bit */
++#define MBX_INTR_WAIT   4 /* 4rd bit */
++
++	spinlock_t	mbx_reg_lock;   /* Mbx Cmd Register Lock */
++	spinlock_t	mbx_q_lock;     /* Mbx Active Cmd Queue Lock */
++	spinlock_t	mbx_bits_lock;  /* Mailbox access bits Lock */
++
++	uint32_t	mbx_lock_bits;  /* controlled by mbx_bits_lock */
++#define MBX_CMD_LOCK	1 /* first bit */
++#define MBX_CMD_WANT	2 /* 2nd bit */
++
++	struct semaphore  mbx_intr_sem;  /* Used for completion notification */
++
++	mbx_cmdq_t	*mbx_sem_pool_head;  /* Head Pointer to a list of
++			                      * recyclable mbx semaphore pool
++			                      * to be used during run time.
++			                      */
++	mbx_cmdq_t	*mbx_sem_pool_tail;  /* Tail Pointer to semaphore pool*/
++#define MBQ_INIT_LEN	16 /* initial mbx sem pool q len. actual len may vary */
++
++	mbx_cmdq_t	*mbx_q_head; /* Head Pointer to sem q for active cmds */
++	mbx_cmdq_t	*mbx_q_tail; /* Tail Pointer to sem q for active cmds */
++
++
++        uint32_t	retry_q_cnt; 
++        uint32_t	scsi_retry_q_cnt; 
++        uint32_t	failover_cnt; 
++
++	uint8_t	*cmdline;
++
++        uint32_t	login_retry_count; 
++    
++	volatile struct
++	{
++		uint32_t     online                  :1;   /* 0 */
++		uint32_t     enable_64bit_addressing :1;   /* 1 */
++		uint32_t     mbox_int                :1;   /* 2 */
++		uint32_t     mbox_busy               :1;   /* 3 */
++		// UNUSED and UNASSIGNED
++		uint32_t     port_name_used          :1;   /* 4 */
++		uint32_t     failover_enabled        :1;   /* 5 */
++		uint32_t     watchdog_enabled        :1;   /* 6 */
++		uint32_t     cfg_suspended   	     :1;   /* 7 */
++
++		uint32_t     disable_host_adapter    :1;   /* 8 */
++		uint32_t     rscn_queue_overflow     :1;   /* 9 */
++		uint32_t     reset_active            :1;   /* 10 */
++		uint32_t     link_down_error_enable  :1;   /* 11 */
++
++		uint32_t     disable_risc_code_load  :1;   /* 12 */
++		uint32_t     set_cache_line_size_1   :1;   /* 13 */
++		uint32_t     enable_target_mode      :1;   /* 14 */
++		uint32_t     disable_luns            :1;   /* 15 */
++
++		uint32_t     enable_lip_reset        :1;   /* 16 */
++		uint32_t     enable_lip_full_login   :1;   /* 17 */
++		uint32_t     enable_target_reset     :1;   /* 18 */
++		uint32_t     updated_fc_db           :1;   /* 19 */
++
++		uint32_t     enable_flash_db_update  :1;   /* 20 */
++		uint32_t     in_isr                  :1;   /* 21 */
++		uint32_t     dpc_sched               :1;   /* 23 */
++
++		uint32_t     nvram_config_done       :1;   /* 24 */
++		uint32_t     update_config_needed    :1;   /* 25 */
++		uint32_t     management_server_logged_in    :1; /* 26 */
++#if defined(FC_IP_SUPPORT)
++                uint32_t     enable_ip               :1;   /* 27 */
++#endif
++
++	} flags;
++
++	uint32_t     device_flags;
++#define DFLG_LOCAL_DEVICES		BIT_0
++#define DFLG_RETRY_LOCAL_DEVICES	BIT_1
++#define DFLG_FABRIC_DEVICES		BIT_2
++#define	SWITCH_FOUND			BIT_3
++#define	DFLG_NO_CABLE			BIT_4
++
++	unsigned long	cpu_flags;
++
++        uint8_t		marker_needed; 
++	uint8_t		missing_targets;
++	uint8_t		sns_retry_cnt;
++	uint8_t		cmd_wait_cnt;
++	uint8_t		mem_err;
++
++	unsigned long   dpc_flags;
++#define	RESET_MARKER_NEEDED	0	/* initiate sending a marker to ISP */
++#define	RESET_ACTIVE		1
++#define	ISP_ABORT_NEEDED	2	/* initiate ISP Abort */
++#define	ABORT_ISP_ACTIVE	3	/* isp abort in progress */
++
++#define	LOOP_RESYNC_NEEDED	4	/* initiate a configure fabric sequence */
++#define	LOOP_RESYNC_ACTIVE	5
++#define	COMMAND_WAIT_NEEDED	6
++#define	COMMAND_WAIT_ACTIVE	7
++
++#define LOCAL_LOOP_UPDATE       8	/* Perform a local loop update */
++#define RSCN_UPDATE             9	/* Perform a RSCN update */
++#define MAILBOX_RETRY           10
++#define ISP_RESET_NEEDED        11	/* Initiate a ISP reset ??? */
++
++#define FAILOVER_EVENT_NEEDED   12
++#define FAILOVER_EVENT		13
++#define FAILOVER_NEEDED   	14
++#define LOOP_RESET_NEEDED	15
++
++#define DEVICE_RESET_NEEDED	16
++#define DEVICE_ABORT_NEEDED	17
++#define SCSI_RESTART_NEEDED	18	/* Processes any requests in scsi retry queue */
++#define PORT_RESTART_NEEDED	19	/* Processes any requests in retry queue */
++
++#define RESTART_QUEUES_NEEDED	20	/* Restarts requeusts in the lun queue */
++#define ABORT_QUEUES_NEEDED	21
++#define RELOGIN_NEEDED	        22
++#define LOGIN_RETRY_NEEDED	23	/* initiates any fabric logins that are required */ 
++#define REGISTER_FC4_NEEDED	24	/* set when need to register again.*/
++
++#define TASKLET_SCHED		25	/* Tasklet is scheduled.  */ 
++#define DONE_RUNNING		26	/* Done task is running. */
++#define ISP_ABORT_RETRY         27      /* ISP aborted. */
++
++
++/* macro for timer to start dpc for handling mailbox commands */
++#define MAILBOX_CMD_NEEDED	(LOOP_RESET_NEEDED|DEVICE_RESET_NEEDED|   \
++    DEVICE_ABORT_NEEDED|ISP_ABORT_NEEDED)
++
++	/* These 3 fields are used by the reset done in dpc thread */
++	uint16_t	reset_bus_id;
++	uint16_t	reset_tgt_id;
++	uint16_t	reset_lun;
++
++	uint8_t		interrupts_on;
++	uint8_t		init_done;
++
++	volatile uint16_t loop_state;
++#define LOOP_TIMEOUT 0x01
++#define LOOP_DOWN    0x02
++#define LOOP_UP      0x04
++#define LOOP_UPDATE  0x08
++#define LOOP_READY   0x10
++
++	mbx_cmd_t 	mc;
++	uint32_t	mbx_flags;
++#define  MBX_IN_PROGRESS  BIT_0
++#define  MBX_BUSY       BIT_1 /* Got the Access */
++#define  MBX_SLEEPING_ON_SEM  BIT_2 
++#define  MBX_POLLING_FOR_COMP  BIT_3
++#define  MBX_COMPLETED      BIT_4
++#define  MBX_TIMEDOUT       BIT_5 
++#define  MBX_ACCESS_TIMEDOUT BIT_6
++
++/* following are new and needed for IOCTL support */
++	hba_ioctl_context *ioctl;
++	uint8_t     node_name[WWN_SIZE];
++
++	uint8_t     optrom_major; 
++	uint8_t     optrom_minor; 
++
++	uint8_t     nvram_version; 
++
++	void        *ioctl_mem;
++	dma_addr_t  ioctl_mem_phys;
++	uint32_t    ioctl_mem_size;
++	uint32_t    isp_abort_cnt;
++
++	/* HBA serial number */
++	uint8_t     serial0;
++	uint8_t     serial1;
++	uint8_t     serial2;
++
++	/* oem related items */
++	uint8_t	oem_id;
++	uint8_t oem_specific[31];
++
++	uint32_t    dump_done;
++	unsigned long    done_q_cnt;
++	unsigned long    pending_in_q;
++
++	uint32_t failover_type;
++	uint32_t failback_delay;
++	unsigned long   cfg_flags;
++#define	CFG_ACTIVE	0	/* CFG during a failover, event update, or ioctl */
++	/* uint8_t	cfg_active; */
++	int	eh_start;
++
++#if defined(IOCB_THROLLE_USAGE)
++	uint32_t 	 iocb_hiwat;
++	uint32_t 	 iocb_cnt;
++	uint32_t 	 iocb_overflow_cnt;
++#endif
++	
++	int	srb_cnt;
++	int	srb_alloc_cnt;	/*Number of allocated SRBs  */
++
++	uint32_t mbox_trace;
++
++	uint32_t	binding_type;
++#define BIND_BY_PORT_NAME	0
++#define BIND_BY_PORT_ID		1
++#define BIND_BY_NODE_NAME	2
++
++	srb_t	*status_srb;    /* Keep track of Status Continuation Entries */
++
++	uint32_t	dropped_frame_error_cnt;
++} scsi_qla_host_t;
++
++#if defined(__BIG_ENDIAN)
++/* Big endian machine correction defines. */
++#define	LITTLE_ENDIAN_16(x)	qla2x00_chg_endian((uint8_t *)&(x), 2)
++#define	LITTLE_ENDIAN_24(x)	qla2x00_chg_endian((uint8_t *)&(x), 3)
++#define	LITTLE_ENDIAN_32(x)	qla2x00_chg_endian((uint8_t *)&(x), 4)
++#define	LITTLE_ENDIAN_64(x)	qla2x00_chg_endian((uint8_t *)&(x), 8)
++#define	BIG_ENDIAN_16(x)
++#define	BIG_ENDIAN_24(x)
++#define	BIG_ENDIAN_32(x)
++#define	BIG_ENDIAN_64(x)
++
++#else
++/* Little endian machine correction defines. */
++#define	LITTLE_ENDIAN_16(x)
++#define	LITTLE_ENDIAN_24(x)
++#define	LITTLE_ENDIAN_32(x)
++#define	LITTLE_ENDIAN_64(x)
++#define	BIG_ENDIAN_16(x)	qla2x00_chg_endian((uint8_t *)&(x), 2)
++#define	BIG_ENDIAN_24(x)	qla2x00_chg_endian((uint8_t *)&(x), 3)
++#define	BIG_ENDIAN_32(x)	qla2x00_chg_endian((uint8_t *)&(x), 4)
++#define	BIG_ENDIAN_64(x)	qla2x00_chg_endian((uint8_t *)&(x), 8)
++
++#endif
++
++/*
++ * Macros to help code, maintain, etc.
++ */
++#define	LOOP_TRANSITION(ha)	( test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || \
++				  test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) )
++
++#define	LOOP_NOT_READY(ha)	 ( (test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || \
++				    test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) || \
++                                    test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) || \
++				    test_bit(LOOP_RESYNC_ACTIVE, &ha->dpc_flags) || \
++				    test_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags) || \
++                                    test_bit(COMMAND_WAIT_ACTIVE, &ha->dpc_flags)) ||  \
++				 ha->loop_state == LOOP_DOWN)
++				 
++#define	LOOP_RDY(ha)	 ( !LOOP_NOT_READY(ha) )
++
++#define	TGT_Q(ha, t)		(ha->otgt[t])
++#define	LUN_Q(ha, t, l)		(TGT_Q(ha, t)->olun[l])
++#define GET_LU_Q(ha, t, l)  ( (TGT_Q(ha,t) != NULL)? TGT_Q(ha, t)->olun[l] : NULL)
++#define PORT_DOWN_TIMER(ha, t)    ((ha)->fc_db[(t)].port_timer)
++#define PORT(ha, t)    		((ha)->fc_db[(t)])
++#define PORT_LOGIN_RETRY(fcport)    ((fcport)->port_login_retry_count)
++
++#define MBOX_TRACE(ha,b)		{(ha)->mbox_trace |= (b);}
++
++#define	MBS_MASK			0x3fff
++#define	MBS_END				0x100
++#define	QLA2X00_SUCCESS		(MBS_COMMAND_COMPLETE & MBS_MASK)
++#define	QLA2X00_FAILED		(MBS_END + 2)
++#define	QLA2X00_FUNCTION_FAILED		(MBS_END + 2)
++
++#define  KMEM_ZALLOC(siz,id)	qla2x00_kmem_zalloc((siz), GFP_ATOMIC, (id))
++#define  KMEM_FREE(ip,siz)	kfree((ip))
++
++/*
++ * LOCK MACROS
++ */
++#define QLA_MBX_REG_LOCK(ha)	\
++    spin_lock_irqsave(&(ha)->mbx_reg_lock, mbx_flags);
++#define QLA_MBX_REG_UNLOCK(ha)	\
++    spin_unlock_irqrestore(&(ha)->mbx_reg_lock, mbx_flags);
++
++/*
++* Stat info for all adpaters
++*/
++struct _qla2x00stats  {
++        unsigned long   mboxtout;            /* mailbox timeouts */
++        unsigned long   mboxerr;             /* mailbox errors */
++        unsigned long   ispAbort;            /* ISP aborts */
++        unsigned long   debugNo;
++        unsigned long   loop_resync;
++        unsigned long   outarray_full;
++        unsigned long   retry_q_cnt;
++};
++
++#define SYS_DELAY(x)		udelay(x);barrier()
++#define QLA2100_DELAY(sec)	mdelay(sec * HZ)
++#define NVRAM_DELAY()		udelay(10)
++#define UDELAY(x)		udelay(x)
++
++#define  CACHE_FLUSH(a) (RD_REG_WORD(a))
++#define  INVALID_HANDLE    (MAX_OUTSTANDING_COMMANDS+1)
++
++#define  ABORTS_ACTIVE  ((test_bit(LOOP_RESET_NEEDED, &ha->dpc_flags)) || \
++			(test_bit(DEVICE_RESET_NEEDED, &ha->dpc_flags)) || \
++			(test_bit(DEVICE_ABORT_NEEDED, &ha->dpc_flags)) || \
++			(test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)))
++
++/*
++ * Flash support definitions
++ */
++#define FLASH_IMAGE_SIZE	131072
++
++#include "qla_fo.h"
++#include "qla_cfg.h"
++#include "qla_gbl.h"
++#include "qla_dbg.h"
++#include "qla_inline.h"
++#include "qla_listops.h"
++
++#endif
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_fo.c	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,1681 @@
++/********************************************************************************
++*                  QLOGIC LINUX SOFTWARE
++*
++* QLogic ISP2x00 device driver for Linux 2.5.x
++* Copyright (C) 2003 Qlogic Corporation
++* (www.qlogic.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, 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.
++*
++******************************************************************************
++* Failover include file
++******************************************************************************/
++
++#include "qla_os.h"
++#include "qla_def.h"
++
++#include "qlfo.h"
++#include "qlfolimits.h"
++
++//TODO Why??
++#include "qla_fo.cfg"
++
++/*
++ * Global variables
++ */
++SysFoParams_t qla_fo_params;
++
++/*
++ * Local routines
++ */
++#if !defined(linux)
++static int qla2x00_sdm_setup(EXT_IOCTL *cmd_stp, void *arg, int mode);
++#endif
++static uint32_t qla2x00_fo_get_params(PFO_PARAMS pp);
++static uint32_t qla2x00_fo_set_params(PFO_PARAMS pp);
++static uint8_t qla2x00_fo_count_retries(scsi_qla_host_t *ha, srb_t *sp);
++static int qla2x00_fo_get_lun_data(EXT_IOCTL *pext,
++		FO_LUN_DATA_INPUT *bp, int mode);
++static int qla2x00_fo_set_lun_data(EXT_IOCTL *pext,
++		FO_LUN_DATA_INPUT *bp, int mode);
++static uint32_t qla2x00_fo_stats(FO_HBA_STAT *stat_p, uint8_t reset);
++static int qla2x00_fo_set_target_data(EXT_IOCTL *pext,
++		FO_TARGET_DATA_INPUT *bp, int mode);
++static int qla2x00_fo_get_target_data(EXT_IOCTL *pext,
++		FO_TARGET_DATA_INPUT *bp, int mode);
++
++/*
++ * qla2x00_get_hba
++ *	Searches the hba structure chain for the requested instance
++ *      aquires the mutex and returns a pointer to the hba structure.
++ *
++ * Input:
++ *	inst = adapter instance number.
++ *
++ * Returns:
++ *	Return value is a pointer to the adapter structure or
++ *      NULL if instance not found.
++ *
++ * Context:
++ *	Kernel context.
++ */
++scsi_qla_host_t *
++qla2x00_get_hba(int instance)
++{
++	int	found;
++	struct list_head *hal;
++	scsi_qla_host_t *ha;
++
++	ha = NULL;
++	found = 0;
++	read_lock(&qla_hostlist_lock);
++	list_for_each(hal, &qla_hostlist) {
++		ha = list_entry(hal, scsi_qla_host_t, list);
++
++		if (ha->instance == instance) {
++			found++;
++			break;
++		}
++	}
++	read_unlock(&qla_hostlist_lock);
++
++	return (found ? ha : NULL);
++}
++
++/*
++ * qla2x00_fo_stats
++ *	Searches the hba structure chan for the requested instance
++ *      aquires the mutex and returns a pointer to the hba structure.
++ *
++ * Input:
++ *	stat_p = Pointer to FO_HBA_STAT union.
++ *      reset  = Flag, TRUE = reset statistics.
++ *                     FALSE = return statistics values.
++ *
++ * Returns:
++ *	0 = success
++ *
++ * Context:
++ *	Kernel context.
++ */
++static uint32_t
++qla2x00_fo_stats(FO_HBA_STAT *stat_p, uint8_t reset)
++{
++	int32_t	inst, idx;
++	uint32_t rval = 0;
++	struct list_head *hal;
++	scsi_qla_host_t *ha;
++
++	DEBUG9(printk("%s: entered.\n", __func__);)
++
++	inst = stat_p->input.HbaInstance;
++	stat_p->info.HbaCount = 0;
++
++	ha = NULL;
++
++	read_lock(&qla_hostlist_lock);
++	list_for_each(hal, &qla_hostlist) {
++		ha = list_entry(hal, scsi_qla_host_t, list);
++
++		if (inst == FO_ADAPTER_ALL) {
++			stat_p->info.HbaCount++;
++			idx = ha->instance;
++		} else if (ha->instance == inst) {
++			stat_p->info.HbaCount = 1;
++			idx = inst;
++		}
++		if (reset == TRUE) {
++			DEBUG9(printk("%s: reset stats.\n", __func__);)
++			ha->IosRequested = 0;
++			ha->BytesRequested = 0;
++			ha->IosExecuted = 0;
++			ha->BytesExecuted = 0;
++		} else {
++ 			DEBUG9(printk("%s: get stats for inst %d.\n",
++ 			    __func__, inst);)
++ 
++#if 0
++			stat_p->info.StatEntry[idx].IosRequested =
++				ha->IosRequested;
++			stat_p->info.StatEntry[idx].BytesRequested =
++				ha->BytesRequested;
++			stat_p->info.StatEntry[idx].IosExecuted =
++				ha->IosExecuted;
++			stat_p->info.StatEntry[idx].BytesExecuted =
++				ha->BytesExecuted;
++#endif
++		}
++		if (inst != FO_ADAPTER_ALL)
++			break;
++	}
++	read_unlock(&qla_hostlist_lock);
++ 
++ 	DEBUG9(printk("%s: exiting.\n", __func__);)
++ 
++	return rval;
++}
++
++/*
++ * qla2x00_fo_get_lun_data
++ *      Get lun data from all devices attached to a HBA (FO_GET_LUN_DATA).
++ *      Gets lun mask if failover not enabled.
++ *
++ * Input:
++ *      ha = pointer to adapter
++ *      bp = pointer to buffer
++ *
++ * Return;
++ *      0 on success or errno.
++ *
++ * Context:
++ *      Kernel context.
++ */
++static int
++qla2x00_fo_get_lun_data(EXT_IOCTL *pext, FO_LUN_DATA_INPUT *bp, int mode)
++{
++	scsi_qla_host_t  *ha;
++	struct list_head	*fcports, *fcpl;
++	fc_port_t        *fcport;
++	int              ret = 0;
++	mp_host_t        *host = NULL;
++	mp_device_t      *dp;
++	mp_path_t        *path;
++	mp_path_list_t   *pathlist;
++	os_tgt_t         *ostgt;
++	uint8_t          path_id;
++	uint16_t         dev_no;
++	uint16_t         cnt;
++	uint16_t         lun;
++	FO_EXTERNAL_LUN_DATA_ENTRY *u_entry, *entry;
++	FO_LUN_DATA_LIST *u_list, *list;
++
++
++	DEBUG9(printk("%s: entered.\n", __func__);)
++
++	ha = qla2x00_get_hba((int)bp->HbaInstance);
++
++	if (!ha) {
++		DEBUG2_9_10(printk("%s: no ha matching inst %d.\n",
++		    __func__, bp->HbaInstance);)
++
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		return (ret);
++	}
++
++	DEBUG9(printk("%s: ha inst %ld, buff %p.\n",
++	    __func__, ha->instance, bp);)
++	DEBUG4(printk("%s: hba %p, buff %p bp->HbaInstance(%x).\n",
++	    __func__, ha, bp, (int)bp->HbaInstance));
++
++	if (ha->flags.failover_enabled)
++		if ((host = qla2x00_cfg_find_host(ha)) == NULL) {
++			DEBUG2_9_10(printk("%s: no HOST for ha inst %ld.\n",
++			    __func__, ha->instance);)
++			pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++			return (ret);
++		}
++
++	list = (FO_LUN_DATA_LIST *)qla2x00_kmem_zalloc(
++	    sizeof(FO_LUN_DATA_LIST), GFP_ATOMIC, 12);
++	if (list == NULL) {
++		DEBUG2_9_10(printk("%s: failed to alloc memory of size (%d)\n",
++		    __func__, (int)sizeof(FO_LUN_DATA_LIST));)
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		return (-ENOMEM);
++	}
++
++	entry = &list->DataEntry[0];
++
++	u_list = (FO_LUN_DATA_LIST *)pext->ResponseAdr;
++	u_entry = &u_list->DataEntry[0];
++
++	/* find the correct fcport list */
++	if (!ha->flags.failover_enabled)
++		fcports = &ha->fcports;
++	else
++		fcports = host->fcports;
++
++	/* Check thru this adapter's fcport list */
++	fcport = NULL;
++	list_for_each(fcpl, fcports) {
++		fcport = list_entry(fcpl, fc_port_t, list);
++
++		memcpy(entry->NodeName,
++		    fcport->node_name, EXT_DEF_WWN_NAME_SIZE);
++		memcpy(entry->PortName,
++		    fcport->port_name, EXT_DEF_WWN_NAME_SIZE);
++
++		if (!ha->flags.failover_enabled) {
++			/*
++			 * Failover disabled. Just return LUN mask info
++			 * in lun data entry of this port.
++			 */
++			entry->TargetId = 0;
++			for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) {
++				if (!(ostgt = ha->otgt[cnt])) {
++					continue;
++				}
++
++				if (ostgt->vis_port == fcport) {
++					entry->TargetId = cnt;
++					break;
++				}
++			}
++			if (cnt == MAX_FIBRE_DEVICES) {
++				/* Not found?  For now just go to next port. */
++#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_10)
++				uint8_t          *tmp_name;
++
++				tmp_name = fcport->port_name;
++
++ 				printk("%s(%ld): ERROR - port "
++ 				    "%02x%02x%02x%02x%02x%02x%02x%02x "
++ 				    "not configured.\n",
++ 				    __func__, ha->host_no,
++ 				    tmp_name[0], tmp_name[1], tmp_name[2],
++ 				    tmp_name[3], tmp_name[4], tmp_name[5],
++ 				    tmp_name[6], tmp_name[7]);
++#endif /* DEBUG */
++
++				continue;
++			}
++
++			/* Got a valid port */
++			list->EntryCount++;
++
++			for (lun = 0; lun < MAX_LUNS; lun++) {
++				/* set MSB if masked */
++				entry->Data[lun] = LUN_DATA_PREFERRED_PATH;
++				if (!EXT_IS_LUN_BIT_SET(&(fcport->lun_mask),
++				    lun)) {
++					entry->Data[lun] |= LUN_DATA_ENABLED;
++				}
++			}
++
++ 			DEBUG9(printk("%s: got lun_mask for tgt %d\n",
++ 			    __func__, cnt);)
++ 			DEBUG9(qla2x00_dump_buffer((char *)&(fcport->lun_mask),
++ 			    sizeof(lun_bit_mask_t));)
++ 
++ 			ret = verify_area(VERIFY_WRITE, (void *)u_entry,
++ 			    sizeof(FO_EXTERNAL_LUN_DATA_ENTRY));
++ 			if (ret) {
++ 				/* error */
++ 				DEBUG9_10(printk("%s: u_entry %p verify write"
++ 				    " error. list->EntryCount=%d.\n",
++ 				    __func__, u_entry, list->EntryCount);)
++ 				pext->Status = EXT_STATUS_COPY_ERR;
++ 				break;
++ 			}
++ 
++ 			ret = copy_to_user(u_entry, entry,
++ 			    sizeof(FO_EXTERNAL_LUN_DATA_ENTRY));
++ 
++ 			if (ret) {
++ 				/* error */
++ 				DEBUG9_10(printk("%s: u_entry %p copy "
++ 				    "error. list->EntryCount=%d.\n",
++ 				    __func__, u_entry, list->EntryCount);)
++ 				pext->Status = EXT_STATUS_COPY_ERR;
++ 				break;
++ 			}
++
++			copy_to_user(u_entry, entry,
++					sizeof(FO_EXTERNAL_LUN_DATA_ENTRY));
++
++			/* Go to next port */
++			u_entry++;
++			continue;
++		}
++
++		/*
++		 * Failover is enabled. Go through the mp_devs list and return
++		 * lun data in configured path.
++		 */
++		for (dev_no = 0; dev_no < MAX_MP_DEVICES; dev_no++) {
++			dp = host->mp_devs[dev_no];
++
++			if (dp == NULL)
++				continue;
++
++			/* Lookup entry name */
++			if (!qla2x00_is_portname_in_device(dp, entry->PortName))
++				continue;
++
++			if ((pathlist = dp->path_list) == NULL)
++				continue;
++
++			path = pathlist->last;
++			for (path_id = 0; path_id < pathlist->path_cnt;
++			    path_id++, path = path->next) {
++
++				if (path->host != host)
++					continue;
++
++				if (!qla2x00_is_portname_equal(path->portname,
++				    entry->PortName))
++					continue;
++
++				/* Got an entry */
++				entry->TargetId = dp->dev_id;
++				entry->Dev_No = path->id;
++				list->EntryCount++;
++
++				for (lun = 0; lun < MAX_LUNS; lun++) {
++					entry->Data[lun] =
++					    path->lun_data.data[lun];
++				}
++
++				ret = verify_area(VERIFY_WRITE, (void *)u_entry,
++				    sizeof(FO_EXTERNAL_LUN_DATA_ENTRY));
++				if (ret) {
++					/* error */
++					DEBUG2_9_10(printk("%s: u_entry %p "
++					    "verify wrt err. EntryCount=%d.\n",
++					    __func__, u_entry, list->EntryCount);)
++					pext->Status = EXT_STATUS_COPY_ERR;
++					break;
++				}
++
++				ret = copy_to_user(u_entry, entry,
++				    sizeof(FO_EXTERNAL_LUN_DATA_ENTRY));
++				if (ret) {
++					/* error */
++					DEBUG2_9_10(printk("%s: u_entry %p "
++					    "copy out err. EntryCount=%d.\n",
++					    __func__, u_entry, list->EntryCount);)
++					pext->Status = EXT_STATUS_COPY_ERR;
++					break;
++				}
++
++				u_entry++;
++
++				DEBUG9(printk("%s: (output) get_lun_data - "
++				    "u_entry(%p) - lun entry[%d] :\n",
++				    __func__, u_entry,list->EntryCount - 1);)
++
++				DEBUG9(qla2x00_dump_buffer((void *)entry, 64);)
++
++				/*
++				 * We found the right path for this port.
++				 * Continue with next port.
++				 */
++				break;
++			}
++
++			/* Continue with next port. */
++			break;
++		}
++	}
++
++	DEBUG9(printk("%s: get_lun_data - entry count = [%d]\n",
++	    __func__, list->EntryCount);)
++	DEBUG4(printk("%s: get_lun_data - entry count = [%d]\n",
++	    __func__, list->EntryCount);)
++
++	if (ret == 0) {
++		ret = verify_area(VERIFY_WRITE, (void *)&u_list->EntryCount,
++		    sizeof(list->EntryCount));
++		if (ret) {
++			/* error */
++			DEBUG2_9_10(printk("%s: u_list->EntryCount %p verify "
++			    " write error. list->EntryCount=%d.\n",
++			    __func__, u_entry, list->EntryCount);)
++			pext->Status = EXT_STATUS_COPY_ERR;
++		} else {
++			/* copy number of entries */
++			ret = copy_to_user(&u_list->EntryCount, &list->EntryCount,
++			    sizeof(list->EntryCount));
++			pext->ResponseLen = FO_LUN_DATA_LIST_MAX_SIZE;
++		}
++	}
++
++	KMEM_FREE(list, sizeof(FO_LUN_DATA_LIST));
++
++	DEBUG9(printk("%s: exiting. ret=%d.\n", __func__, ret);)
++
++	return ret;
++}
++
++/*
++ * qla2x00_fo_set_lun_data
++ *      Set lun data for the specified device on the attached hba
++ *      (FO_SET_LUN_DATA).
++ *      Sets lun mask if failover not enabled.
++ *
++ * Input:
++ *      bp = pointer to buffer
++ *
++ * Return;
++ *      0 on success or errno.
++ *
++ * Context:
++ *      Kernel context.
++ */
++static int
++qla2x00_fo_set_lun_data(EXT_IOCTL *pext, FO_LUN_DATA_INPUT  *bp, int mode)
++{
++	scsi_qla_host_t  *ha;
++	fc_port_t        *fcport;
++	int              i;
++	int              ret = 0;
++	mp_host_t        *host = NULL;
++	mp_device_t      *dp;
++	mp_path_t        *path;
++	mp_path_list_t   *pathlist;
++	os_tgt_t         *ostgt;
++	uint8_t	         path_id;
++	uint16_t         dev_no;
++	uint16_t         lun;
++	FO_LUN_DATA_LIST *u_list, *list;
++	FO_EXTERNAL_LUN_DATA_ENTRY *u_entry, *entry;
++
++	typedef struct _tagStruct {
++		FO_LUN_DATA_INPUT   foLunDataInput;
++		FO_LUN_DATA_LIST    foLunDataList;
++	}
++	com_struc;
++	com_struc *com_iter;
++
++
++	DEBUG9(printk("%s: entered.\n", __func__);)
++
++	ha = qla2x00_get_hba((int)bp->HbaInstance);
++
++	if (!ha) {
++		DEBUG2_9_10(printk("%s: no ha matching inst %d.\n",
++		    __func__, bp->HbaInstance);)
++
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		return (ret);
++	}
++
++	DEBUG9(printk("%s: ha inst %ld, buff %p.\n",
++	    __func__, ha->instance, bp);)
++
++	if (ha->flags.failover_enabled)
++		if ((host = qla2x00_cfg_find_host(ha)) == NULL) {
++			DEBUG2_9_10(printk("%s: no HOST for ha inst %ld.\n",
++			    __func__, ha->instance);)
++			pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++			return (ret);
++		}
++
++	list = (FO_LUN_DATA_LIST *)qla2x00_kmem_zalloc(
++	    sizeof(FO_LUN_DATA_LIST), GFP_ATOMIC, 13);
++	if (list == NULL) {
++		DEBUG2_9_10(printk("%s: failed to alloc memory of size (%d)\n",
++		    __func__, (int)sizeof(FO_LUN_DATA_LIST));)
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		return (-ENOMEM);
++	}
++
++	entry = &list->DataEntry[0];
++
++	/* get lun data list from user */
++	com_iter = (com_struc *)pext->RequestAdr;
++	u_list = &(com_iter->foLunDataList);
++	u_entry = &u_list->DataEntry[0];
++
++	ret = verify_area(VERIFY_READ, (void *)u_list,
++	    sizeof(FO_LUN_DATA_LIST));
++	if (ret) {
++		/* error */
++		DEBUG2_9_10(printk("%s: u_list %p verify read error.\n",
++		    __func__, u_list);)
++		pext->Status = EXT_STATUS_COPY_ERR;
++		KMEM_FREE(list, FO_LUN_DATA_LIST);
++		return (ret);
++	}
++
++	ret = copy_from_user(list, u_list, sizeof(FO_LUN_DATA_LIST));
++	if (ret) {
++		/* error */
++		DEBUG2_9_10(printk("%s: u_list %p copy error.\n",
++		    __func__, u_list);)
++		pext->Status = EXT_STATUS_COPY_ERR;
++		KMEM_FREE(list, FO_LUN_DATA_LIST);
++		return (ret);
++	}
++
++	DEBUG2(printk("qla_fo_set_lun_data: pext->RequestAdr(%p) u_list (%p) "
++			"sizeof(FO_LUN_DATA_INPUT) =(%d) and 64 bytes...\n",
++			pext->RequestAdr, u_list,
++			(int)sizeof(FO_LUN_DATA_INPUT));)
++	DEBUG2(qla2x00_dump_buffer((void *)u_list, 64);)
++
++	for (i = 0; i < list->EntryCount; i++, u_entry++) {
++
++		ret = verify_area(VERIFY_READ, (void *)u_entry,
++		    sizeof(FO_EXTERNAL_LUN_DATA_ENTRY));
++		if (ret) {
++			/* error */
++			DEBUG2_9_10(printk("%s: u_entry %p verify "
++			    " read error.\n",
++			    __func__, u_entry);)
++			pext->Status = EXT_STATUS_COPY_ERR;
++			break;
++		}
++		ret = copy_from_user(entry, u_entry,
++		    sizeof(FO_EXTERNAL_LUN_DATA_ENTRY));
++		if (ret) {
++			/* error */
++			DEBUG2_9_10(printk("%s: u_entry %p copy error.\n",
++			    __func__, u_entry);)
++			pext->Status = EXT_STATUS_COPY_ERR;
++			break;
++		}
++
++		if (!ha->flags.failover_enabled) {
++			/*
++			 * Failover disabled. Just find the port and set
++			 * LUN mask values in lun_mask field of this port.
++			 */
++
++			if (entry->TargetId >= MAX_FIBRE_DEVICES)
++				/* ERROR */
++				continue;
++
++			if (!(ostgt = ha->otgt[entry->TargetId]))
++				/* ERROR */
++				continue;
++
++			if (!(fcport = ostgt->vis_port))
++				/* ERROR */
++				continue;
++
++			for (lun = 0; lun < MAX_LUNS; lun++) {
++				/* set MSB if masked */
++				if (entry->Data[lun] | LUN_DATA_ENABLED) {
++					EXT_CLR_LUN_BIT(&(fcport->lun_mask),
++								lun);
++				} else {
++					EXT_SET_LUN_BIT(&(fcport->lun_mask),
++								lun);
++				}
++			}
++
++			/* Go to next entry */
++			continue;
++		}
++
++		/*
++		 * Failover is enabled. Go through the mp_devs list and set lun
++		 * data in configured path.
++		 */
++		for (dev_no = 0; dev_no < MAX_MP_DEVICES; dev_no++) {
++			dp = host->mp_devs[dev_no];
++
++			if (dp == NULL)
++				continue;
++
++			/* Lookup entry name */
++			if (!qla2x00_is_portname_in_device(dp, entry->PortName))
++					continue;
++
++			if ((pathlist = dp->path_list) == NULL)
++					continue;
++
++			path = pathlist->last;
++			for (path_id = 0; path_id < pathlist->path_cnt;
++			    path_id++, path = path->next) {
++
++				if (path->host != host)
++					continue;
++
++				if (!qla2x00_is_portname_equal(path->portname,
++				    entry->PortName))
++					continue;
++
++				for (lun = 0; lun < MAX_LUNS; lun++) {
++					path->lun_data.data[lun] =
++					    entry->Data[lun];
++					DEBUG4(printk("cfg_set_lun_data: lun "
++					    "data[%d] = 0x%x \n", lun,
++					    path->lun_data.data[lun]);)
++				}
++
++				break;
++			}
++			break;
++		}
++	}
++
++	KMEM_FREE(list, FO_LUN_DATA_LIST);
++
++	DEBUG9(printk("%s: exiting. ret = %d.\n", __func__, ret);)
++
++	return ret;
++}
++
++/*
++ * qla2x00_fo_get_target_data
++ *      Get the target control byte for all devices attached to a HBA.
++ *
++ * Input:
++ *      bp = pointer to buffer
++ *
++ * Return;
++ *      0 on success or errno.
++ *
++ * Context:
++ *      Kernel context.
++ */
++static int
++qla2x00_fo_get_target_data(EXT_IOCTL *pext, FO_TARGET_DATA_INPUT *bp, int mode)
++{
++	scsi_qla_host_t  *ha;
++	struct list_head	*fcports, *fcpl;
++	fc_port_t        *fcport;
++	int              ret = 0;
++	mp_host_t        *host = NULL;
++	mp_device_t      *dp;
++	mp_path_t        *path;
++	mp_path_list_t   *pathlist;
++	os_tgt_t         *ostgt;
++	uint8_t          i, cnt;
++	uint8_t          path_id;
++	uint16_t         dev_no;
++	FO_DEVICE_DATA   *entry, *u_entry;
++	uint32_t	b;
++
++
++	DEBUG9(printk("%s: entered.\n", __func__);)
++
++	ha = qla2x00_get_hba((int)bp->HbaInstance);
++
++	if (!ha) {
++		DEBUG2_9_10(printk("%s: no ha matching inst %d.\n",
++		    __func__, bp->HbaInstance);)
++
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		return (ret);
++	}
++
++	DEBUG9(printk("%s: ha inst %ld, buff %p.\n",
++	    __func__, ha->instance, bp);)
++
++	if (ha->flags.failover_enabled)
++		if ((host = qla2x00_cfg_find_host(ha)) == NULL) {
++			DEBUG2_9_10(printk("%s: no HOST for ha inst %ld.\n",
++			    __func__, ha->instance);)
++			pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++			return (ret);
++		}
++
++	entry = (FO_DEVICE_DATA *)qla2x00_kmem_zalloc(
++	    sizeof(FO_DEVICE_DATA), GFP_ATOMIC, 14);
++	if (entry == NULL) {
++		DEBUG2_9_10(printk("%s: failed to alloc memory of size (%d)\n",
++		    __func__, (int)sizeof(FO_DEVICE_DATA));)
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		return (-ENOMEM);
++	}
++
++	u_entry = (FO_DEVICE_DATA *) pext->ResponseAdr;
++
++	/* find the correct fcport list */
++	if (!ha->flags.failover_enabled)
++		fcports = &ha->fcports;
++	else
++		fcports = host->fcports;
++
++	/* Check thru this adapter's fcport list */
++	i = 0;
++	fcport = NULL;
++	list_for_each(fcpl, fcports) {
++		fcport = list_entry(fcpl, fc_port_t, list);
++
++		if (i >= MAX_TARGETS)
++			break;
++
++		memcpy(entry->WorldWideName,
++		    fcport->node_name, EXT_DEF_WWN_NAME_SIZE);
++		memcpy(entry->PortName,
++		    fcport->port_name, EXT_DEF_WWN_NAME_SIZE);
++
++		for (b = 0; b < 3 ; b++)
++			entry->PortId[b] = fcport->d_id.r.d_id[2-b];
++
++		if (!ha->flags.failover_enabled) {
++			/*
++			 * Failover disabled. Just find the port and return
++			 * target info.
++			 */
++			for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) {
++				if (!(ostgt = ha->otgt[cnt])) {
++					continue;
++				}
++
++				if (ostgt->vis_port == fcport) {
++					entry->TargetId = cnt;
++					break;
++				}
++			}
++			if (cnt == MAX_FIBRE_DEVICES) {
++				/* Not found?  For now just go to next port. */
++#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_10)
++				uint8_t          *tmp_name;
++
++				tmp_name = fcport->port_name;
++
++				printk("fo_get_target_data(%ld): ERROR "
++				    "port %02x%02x%02x%02x%02x%02x%02x%02x "
++				    "not configured.\n", ha->host_no,
++				    tmp_name[0], tmp_name[1], tmp_name[2],
++				    tmp_name[3], tmp_name[4], tmp_name[5],
++				    tmp_name[6], tmp_name[7]);
++#endif /* DEBUG */
++
++				continue;
++			}
++
++			entry->MultipathControl = 0; /* always configured */
++
++			ret = verify_area(VERIFY_WRITE, (void *)u_entry,
++			    sizeof(FO_DEVICE_DATA));
++			if (ret) {
++				/* error */
++				DEBUG2_9_10(printk("%s: u_entry %p verify "
++				    " wrt err. tgt id=%d.\n",
++				    __func__, u_entry, cnt);)
++				pext->Status = EXT_STATUS_COPY_ERR;
++				break;
++			}
++
++			ret = copy_to_user(u_entry, entry,
++			    sizeof(FO_DEVICE_DATA));
++			if (ret) {
++				/* error */
++				DEBUG2_9_10(printk("%s: u_entry %p copy "
++				    "out err. tgt id=%d.\n",
++				    __func__, u_entry, cnt);)
++				pext->Status = EXT_STATUS_COPY_ERR;
++				break;
++			}
++
++			u_entry++;
++
++			i++;
++			continue;
++		}
++
++		/*
++		 * Failover is enabled. Go through the mp_devs list and
++		 * get target data in configured path.
++		 */
++		for (dev_no = 0; dev_no < MAX_MP_DEVICES; dev_no++) {
++			dp = host->mp_devs[dev_no];
++
++			if (dp == NULL)
++				continue;
++
++			/* Lookup entry name */
++			if (!qla2x00_is_portname_in_device(dp, entry->PortName))
++				continue;
++
++			if ((pathlist = dp->path_list) == NULL)
++				continue;
++
++			path = pathlist->last;
++			for (path_id = 0; path_id < pathlist->path_cnt;
++			    path_id++, path= path->next) {
++
++				if (path->host != host)
++					continue;
++
++				if (!qla2x00_is_portname_equal(path->portname,
++				    entry->PortName))
++					continue;
++
++				entry->TargetId = dp->dev_id;
++				entry->Dev_No = path->id;
++				entry->MultipathControl = path->mp_byte;
++
++				DEBUG9(printk("cfg_get_target_data: path->id "
++				    "= %d, target data = 0x%x \n",
++				    path->id, path->mp_byte);)
++
++				ret = verify_area(VERIFY_WRITE, (void *)u_entry,
++				    sizeof(FO_DEVICE_DATA));
++				if (ret) {
++					/* error */
++					DEBUG2_9_10(printk("%s: u_entry %p "
++					    "verify wrt err. tgt id=%d.\n",
++					    __func__, u_entry, dp->dev_id);)
++					pext->Status = EXT_STATUS_COPY_ERR;
++					break;
++				}
++
++				ret = copy_to_user(u_entry, entry,
++				    sizeof(FO_DEVICE_DATA));
++				if (ret) {
++					/* error */
++					DEBUG2_9_10(printk("%s: u_entry %p "
++					    "copy out err. tgt id=%d.\n",
++					    __func__, u_entry, dp->dev_id);)
++					pext->Status = EXT_STATUS_COPY_ERR;
++					break;
++				}
++
++				u_entry++;
++
++				/* Path found. Continue with next fcport */
++				break;
++			}
++			break;
++		}
++		i++;
++	}
++
++	if (ret == 0) {
++		pext->ResponseLen = sizeof(FO_DEVICE_DATABASE);
++	}
++
++	KMEM_FREE(entry, sizeof(FO_DEVICE_DATA));
++
++	DEBUG9(printk("%s: exiting. ret = %d.\n", __func__, ret);)
++
++	return (ret);
++}
++
++/*
++ * qla2x00_fo_set_target_data
++ *      Set multipath control byte for all devices on the attached hba
++ *
++ * Input:
++ *      bp = pointer to buffer
++ *
++ * Return;
++ *      0 on success or errno.
++ *
++ * Context:
++ *      Kernel context.
++ */
++static int
++qla2x00_fo_set_target_data(EXT_IOCTL *pext, FO_TARGET_DATA_INPUT  *bp, int mode)
++{
++	scsi_qla_host_t  *ha;
++	int              i;
++	int              ret = 0;
++	mp_host_t        *host;
++	mp_device_t      *dp;
++	mp_path_t        *path;
++	mp_path_list_t   *pathlist;
++	uint16_t         dev_no;
++	uint8_t	         path_id;
++	FO_DEVICE_DATA *entry, *u_entry;
++
++	DEBUG9(printk("%s: entered.\n", __func__);)
++
++	ha = qla2x00_get_hba((int)bp->HbaInstance);
++
++	if (!ha) {
++		DEBUG2_9_10(printk("%s: no ha matching inst %d.\n",
++		    __func__, bp->HbaInstance);)
++
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		return (ret);
++	}
++
++	DEBUG9(printk("%s: ha inst %ld, buff %p.\n",
++	    __func__, ha->instance, bp);)
++
++	if (!ha->flags.failover_enabled)
++		/* non-failover mode. nothing to be done. */
++		return 0;
++
++	if ((host = qla2x00_cfg_find_host(ha)) == NULL) {
++		DEBUG2_9_10(printk("%s: no HOST for ha inst %ld.\n",
++		    __func__, ha->instance);)
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		return (ret);
++	}
++
++	entry = (FO_DEVICE_DATA *)qla2x00_kmem_zalloc(
++	    sizeof(FO_DEVICE_DATA), GFP_ATOMIC, 15);
++	if (entry == NULL) {
++		DEBUG2_9_10(printk("%s: failed to alloc memory of size (%d)\n",
++		    __func__, (int)sizeof(FO_DEVICE_DATA));)
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		return (-ENOMEM);
++	}
++
++	u_entry = (FO_DEVICE_DATA *)(pext->RequestAdr +
++	    sizeof(FO_TARGET_DATA_INPUT));
++
++	for (i = 0; i < MAX_TARGETS; i++, u_entry++) {
++		ret = verify_area(VERIFY_READ, (void *)u_entry,
++		    sizeof(FO_DEVICE_DATA));
++		if (ret) {
++			/* error */
++			DEBUG2_9_10(printk("%s: u_entry %p verify read err.\n",
++			    __func__, u_entry);)
++			pext->Status = EXT_STATUS_COPY_ERR;
++			break;
++		}
++
++		ret = copy_from_user(entry, u_entry, sizeof(FO_DEVICE_DATA));
++
++		if (ret) {
++			/* error */
++			DEBUG2_9_10(printk("%s: u_entry %p copy error.\n",
++			    __func__, u_entry);)
++			pext->Status = EXT_STATUS_COPY_ERR;
++			break;
++		}
++
++		for (dev_no = 0; dev_no < MAX_MP_DEVICES; dev_no++) {
++			dp = host->mp_devs[dev_no];
++
++			if (dp == NULL)
++				continue;
++
++			/* Lookup entry name */
++			if (!qla2x00_is_portname_in_device(dp, entry->PortName))
++				continue;
++
++			if ((pathlist = dp->path_list) == NULL)
++				continue;
++
++			path = pathlist->last;
++			for (path_id = 0; path_id < pathlist->path_cnt;
++			    path_id++, path= path->next) {
++
++				if (path->host != host)
++					continue;
++
++				if (!qla2x00_is_portname_equal(path->portname,
++				    entry->PortName))
++					continue;
++
++				path->mp_byte = entry->MultipathControl;
++
++				DEBUG9(printk("cfg_set_target_data: %d target "
++				    "data = 0x%x \n",
++				    path->id,path->mp_byte);)
++
++				/*
++				 * If this is the visible path, then make it
++				 * available on next reboot.
++				 */
++				if (!((path->mp_byte & MP_MASK_HIDDEN) ||
++				    (path->mp_byte & MP_MASK_UNCONFIGURED))) {
++					pathlist->visible = path->id;
++				}
++
++				/* Found path. Go to next entry. */
++				break;
++			}
++			break;
++		}
++	}
++
++	KMEM_FREE(entry, sizeof(FO_DEVICE_DATA));
++
++	DEBUG9(printk("%s: exiting. ret = %d.\n", __func__, ret);)
++
++	return (ret);
++
++}
++
++/*
++ * qla2x00_fo_ioctl
++ *	Provides functions for failover ioctl() calls.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	ioctl_code = ioctl function to perform
++ *	arg = Address of application EXT_IOCTL cmd data
++ *	mode = flags
++ *
++ * Returns:
++ *	Return value is the ioctl rval_p return value.
++ *	0 = success
++ *
++ * Context:
++ *	Kernel context.
++ */
++/* ARGSUSED */
++int
++qla2x00_fo_ioctl(scsi_qla_host_t *ha, int ioctl_code, void *ret_arg, int mode)
++{
++	static EXT_IOCTL cmd_struct;
++	int    rval = 0;
++	size_t	in_size, out_size;
++	static	union {
++		FO_PARAMS params;
++		FO_GET_PATHS path;
++		FO_SET_CURRENT_PATH set_path;
++		/* FO_HBA_STAT_INPUT stat; */
++		FO_HBA_STAT stat;
++		FO_LUN_DATA_INPUT lun_data;
++		FO_TARGET_DATA_INPUT target_data;
++	} buff;
++
++
++	ENTER("qla2x00_fo_ioctl");
++	DEBUG9(printk("%s: entered. arg (%p):\n", __func__, ret_arg);)
++
++	memcpy(&cmd_struct, ret_arg, sizeof(cmd_struct));
++
++	/*
++	 * default case for this switch not needed,
++	 * ioctl_code validated by caller.
++	 */
++	in_size = out_size = 0;
++	switch (ioctl_code) {
++		case FO_CC_GET_PARAMS:
++			out_size = sizeof(FO_PARAMS);
++			break;
++		case FO_CC_SET_PARAMS:
++			in_size = sizeof(FO_PARAMS);
++			break;
++		case FO_CC_GET_PATHS:
++			in_size = sizeof(FO_GET_PATHS);
++			break;
++		case FO_CC_SET_CURRENT_PATH:
++			in_size = sizeof(FO_SET_CURRENT_PATH);
++			break;
++		case FO_CC_GET_HBA_STAT:
++		case FO_CC_RESET_HBA_STAT:
++			in_size = sizeof(FO_HBA_STAT_INPUT);
++			break;
++		case FO_CC_GET_LUN_DATA:
++			in_size = sizeof(FO_LUN_DATA_INPUT);
++			break;
++		case FO_CC_SET_LUN_DATA:
++			in_size = sizeof(FO_LUN_DATA_INPUT);
++			break;
++		case FO_CC_GET_TARGET_DATA:
++			in_size = sizeof(FO_TARGET_DATA_INPUT);
++			break;
++		case FO_CC_SET_TARGET_DATA:
++			in_size = sizeof(FO_TARGET_DATA_INPUT);
++			break;
++
++	}
++	if (in_size != 0) {
++		if ((int)cmd_struct.RequestLen < in_size) {
++			cmd_struct.Status = EXT_STATUS_INVALID_PARAM;
++			cmd_struct.DetailStatus = EXT_DSTATUS_REQUEST_LEN;
++			DEBUG10(printk("%s: got invalie req len (%d).\n",
++			    __func__, cmd_struct.RequestLen);)
++
++		} else {
++
++			rval = verify_area(VERIFY_READ,
++			    (void *)cmd_struct.RequestAdr, in_size);
++			if (rval) {
++				/* error */
++				DEBUG2_9_10(printk("%s: req buf verify read "
++				    "error. size=%d.\n",
++				    __func__, in_size);)
++				cmd_struct.Status = EXT_STATUS_COPY_ERR;
++			}
++			rval = copy_from_user(&buff,
++			    (void *)cmd_struct.RequestAdr, in_size);
++
++			if (rval) {
++				DEBUG2_9_10(printk("%s: req buf copy error. "
++				    "size=%d.\n",
++				    __func__, in_size);)
++
++				cmd_struct.Status = EXT_STATUS_COPY_ERR;
++			} else {
++				DEBUG9(printk("qla2x00_fo_ioctl: req buf "
++				    "copied ok.\n"));
++			}
++		}
++	} else if (out_size != 0 && (int)cmd_struct.ResponseLen < out_size) {
++		cmd_struct.Status = EXT_STATUS_BUFFER_TOO_SMALL;
++		cmd_struct.DetailStatus = out_size;
++		DEBUG10(printk("%s: got invalie resp len (%d).\n",
++		    __func__, cmd_struct.ResponseLen);)
++	}
++
++	if (rval != 0 || cmd_struct.Status != 0)
++		goto done_fo_ioctl;
++
++	cmd_struct.Status = EXT_STATUS_OK;
++	cmd_struct.DetailStatus = EXT_STATUS_OK;
++
++	switch (ioctl_code) {
++		case FO_CC_GET_PARAMS:
++			rval = qla2x00_fo_get_params(&buff.params);
++			break;
++		case FO_CC_SET_PARAMS:
++			rval = qla2x00_fo_set_params(&buff.params);
++			break;
++		case FO_CC_GET_PATHS:
++			rval = qla2x00_cfg_get_paths(&cmd_struct,
++					&buff.path,mode);
++			if (rval != 0)
++				out_size = 0;
++			break;
++		case FO_CC_SET_CURRENT_PATH:
++			rval = qla2x00_cfg_set_current_path(&cmd_struct,
++					&buff.set_path,mode);
++			break;
++		case FO_CC_RESET_HBA_STAT:
++			rval = qla2x00_fo_stats(&buff.stat, TRUE);
++			break;
++		case FO_CC_GET_HBA_STAT:
++			rval = qla2x00_fo_stats(&buff.stat, FALSE);
++			break;
++		case FO_CC_GET_LUN_DATA:
++
++			DEBUG4(printk("calling qla2x00_fo_get_lun_data\n");)
++			DEBUG4(printk("cmd_struct.RequestAdr (%p):\n",
++					cmd_struct.RequestAdr);)
++
++			rval = qla2x00_fo_get_lun_data(&cmd_struct,
++			    &buff.lun_data, mode);
++
++			if (rval != 0)
++				out_size = 0;
++			break;
++		case FO_CC_SET_LUN_DATA:
++
++			DEBUG4(printk("calling qla2x00_fo_set_lun_data\n");)
++			DEBUG4(printk("	cmd_struct.RequestAdr (%p):\n",
++			    cmd_struct.RequestAdr);)
++
++			rval = qla2x00_fo_set_lun_data(&cmd_struct,
++			    &buff.lun_data, mode);
++			break;
++		case FO_CC_GET_TARGET_DATA:
++			DEBUG4(printk("calling qla2x00_fo_get_target_data\n");)
++			DEBUG4(printk("cmd_struct.RequestAdr (%p):\n",
++			    cmd_struct.RequestAdr);)
++
++			rval = qla2x00_fo_get_target_data(&cmd_struct,
++			    &buff.target_data, mode);
++
++			if (rval != 0) {
++				out_size = 0;
++			}
++			break;
++		case FO_CC_SET_TARGET_DATA:
++			DEBUG4(printk("calling qla2x00_fo_set_target_data\n");)
++			DEBUG4(printk("	cmd_struct.RequestAdr (%p):\n",
++			    cmd_struct.RequestAdr);)
++			rval = qla2x00_fo_set_target_data(&cmd_struct,
++			    &buff.target_data, mode);
++			break;
++
++	}
++
++	if (rval == 0 && (cmd_struct.ResponseLen = out_size) != 0) {
++		rval = verify_area(VERIFY_WRITE, (void *)cmd_struct.ResponseAdr,
++		    out_size);
++		if (rval != 0) {
++			DEBUG10(printk("%s: resp buf very write error.\n",
++			    __func__);)
++			cmd_struct.Status = EXT_STATUS_COPY_ERR;
++		}
++	}
++
++	if (rval == 0) {
++		rval = copy_to_user((void *)cmd_struct.ResponseAdr,
++		    &buff, out_size);
++
++		if (rval != 0) {
++			DEBUG10(printk("%s: resp buf copy error. size=%d.\n",
++			    __func__, out_size);)
++			cmd_struct.Status = EXT_STATUS_COPY_ERR;
++		}
++	}
++
++done_fo_ioctl:
++
++	/* Set Status and DetailStatus fields in application EXT_IOCTL */
++	(((EXT_IOCTL*)ret_arg)->Status) 	= cmd_struct.Status;
++	(((EXT_IOCTL*)ret_arg)->DetailStatus)	= cmd_struct.DetailStatus;
++	(((EXT_IOCTL*)ret_arg)->ResponseLen)	= cmd_struct.ResponseLen;
++
++	if (rval != 0) {
++		/*EMPTY*/
++		DEBUG10(printk("%s: **** FAILED ****\n", __func__);)
++	} else {
++		/*EMPTY*/
++		DEBUG9(printk("%s: exiting normally\n", __func__);)
++	}
++
++	return rval;
++}
++
++
++/*
++ * qla2x00_fo_count_retries
++ *	Increment the retry counter for the command.
++ *      Set or reset the SRB_RETRY flag.
++ *
++ * Input:
++ *	sp = Pointer to command.
++ *
++ * Returns:
++ *	TRUE -- retry
++ * 	FALSE -- don't retry
++ *
++ * Context:
++ *	Kernel context.
++ */
++static uint8_t
++qla2x00_fo_count_retries(scsi_qla_host_t *ha, srb_t *sp)
++{
++	uint8_t		retry = TRUE;
++	os_lun_t	*lq;
++	os_tgt_t	*tq;
++
++	DEBUG9(printk("%s: entered.\n", __func__);)
++
++	if (++sp->fo_retry_cnt >  qla_fo_params.MaxRetriesPerIo) {
++		/* no more failovers for this request */
++		retry = FALSE;
++		sp->fo_retry_cnt = 0;
++		printk(KERN_INFO
++		    "qla2x00: no more failovers for request - "
++		    "pid= %ld\n", sp->cmd->serial_number);
++	} else {
++		/*
++		 * We haven't exceeded the max retries for this request, check
++		 * max retries this path
++		 */
++		if ((sp->fo_retry_cnt % qla_fo_params.MaxRetriesPerPath) == 0) {
++			DEBUG(printk(" qla2x00_fo_count_retries: FAILOVER - "
++			    "queuing ha=%ld, sp=%p, pid =%ld, "
++			    "fo retry= %d \n",
++			    ha->host_no,
++			    sp, sp->cmd->serial_number,
++			    sp->fo_retry_cnt);)
++
++			/*
++			 * Note: we don't want it to timeout, so it is
++			 * recycling on the retry queue and the fialover queue.
++			 */
++			lq = sp->lun_queue;
++			tq = sp->tgt_queue;
++			set_bit(LUN_MPIO_BUSY, &lq->q_flag);
++
++			/*
++			 * ??? We can get a path error on any ha, but always
++			 * queue failover on originating ha. This will allow us
++			 * to syncronized the requests for a given lun.
++			 */
++			sp->f_start=jiffies;/*ra 10/29/01*/
++			/* Now queue it on to be failover */
++			sp->ha = ha;
++			add_to_failover_queue(ha,sp);
++		}
++	}
++
++	DEBUG9(printk("%s: exiting. retry = %d.\n", __func__, retry);)
++
++	return retry ;
++}
++
++
++/*
++ * qla2x00_fo_check
++ *	This function is called from the done routine to see if
++ *  the SRB requires a failover.
++ *
++ *	This function examines the available os returned status and
++ *  if meets condition, the command(srb) is placed ont the failover
++ *  queue for processing.
++ *
++ * Input:
++ *	sp  = Pointer to the SCSI Request Block
++ *
++ * Output:
++ *      sp->flags SRB_RETRY bit id command is to
++ *      be retried otherwise bit is reset.
++ *
++ * Returns:
++ *      None.
++ *
++ * Context:
++ *	Kernel/Interrupt context.
++ */
++uint8_t
++qla2x00_fo_check(scsi_qla_host_t *ha, srb_t *sp)
++{
++	uint8_t		retry = FALSE;
++	int host_status;
++#if DEBUG_QLA2100
++	static char *reason[] = {
++		"DID_OK",
++		"DID_NO_CONNECT",
++		"DID_BUS_BUSY",
++		"DID_TIME_OUT",
++		"DID_BAD_TARGET",
++		"DID_ABORT",
++		"DID_PARITY",
++		"DID_ERROR",
++		"DID_RESET",
++		"DID_BAD_INTR"
++	};
++#endif
++
++	DEBUG9(printk("%s: entered.\n", __func__);)
++
++	/* we failover on selction timeouts only */
++	host_status = CMD_RESULT(sp->cmd) >>16;
++	if( host_status == DID_NO_CONNECT) {
++		if( qla2x00_fo_count_retries(ha,sp) ) {
++			/* Force a retry  on this request, it will
++			 * cause the LINUX timer to get reset, while we
++			 * we are processing the failover.
++			 */
++			CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16;
++			retry = TRUE;
++		}
++		DEBUG(printk("qla2x00_fo_check: pid= %ld sp %p "
++				"retry count=%d, retry flag = %d, "
++				"host status (%s)\n\r",
++				sp->cmd->serial_number,
++				sp, sp->fo_retry_cnt,
++				retry, reason[host_status]);)
++	}
++
++	DEBUG9(printk("%s: exiting. retry = %d.\n", __func__, retry);)
++
++	return retry;
++}
++
++/*
++ * qla2x00_fo_path_change
++ *	This function is called from configuration mgr to notify
++ *	of a path change.
++ *
++ * Input:
++ *      type    = Failover notify type, FO_NOTIFY_LUN_RESET or FO_NOTIFY_LOGOUT
++ *      newlunp = Pointer to the fc_lun struct for current path.
++ *      oldlunp = Pointer to fc_lun struct for previous path.
++ *
++ * Returns:
++ *
++ * Context:
++ *	Kernel context.
++ */
++uint32_t
++qla2x00_fo_path_change(uint32_t type, fc_lun_t *newlunp, fc_lun_t *oldlunp)
++{
++	uint32_t	ret = QLA2X00_SUCCESS;
++
++	newlunp->max_path_retries = 0;
++	return ret;
++}
++
++/*
++ * qla2x00_fo_get_params
++ *	Process an ioctl request to get system wide failover parameters.
++ *
++ * Input:
++ *	pp = Pointer to FO_PARAMS structure.
++ *
++ * Returns:
++ *	EXT_STATUS code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static uint32_t
++qla2x00_fo_get_params(PFO_PARAMS pp)
++{
++	DEBUG9(printk("%s: entered.\n", __func__);)
++
++	pp->MaxPathsPerDevice = qla_fo_params.MaxPathsPerDevice;
++	pp->MaxRetriesPerPath = qla_fo_params.MaxRetriesPerPath;
++	pp->MaxRetriesPerIo = qla_fo_params.MaxRetriesPerIo;
++	pp->Flags = qla_fo_params.Flags;
++	pp->FailoverNotifyType = qla_fo_params.FailoverNotifyType;
++	pp->FailoverNotifyCdbLength = qla_fo_params.FailoverNotifyCdbLength;
++	memset(pp->FailoverNotifyCdb, 0, sizeof(pp->FailoverNotifyCdb));
++	memcpy(pp->FailoverNotifyCdb,
++	    &qla_fo_params.FailoverNotifyCdb[0], sizeof(pp->FailoverNotifyCdb));
++
++	DEBUG9(printk("%s: exiting.\n", __func__);)
++
++	return EXT_STATUS_OK;
++}
++
++/*
++ * qla2x00_fo_set_params
++ *	Process an ioctl request to set system wide failover parameters.
++ *
++ * Input:
++ *	pp = Pointer to FO_PARAMS structure.
++ *
++ * Returns:
++ *	EXT_STATUS code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static uint32_t
++qla2x00_fo_set_params(PFO_PARAMS pp)
++{
++	DEBUG9(printk("%s: entered.\n", __func__);)
++
++	/* Check values for defined MIN and MAX */
++	if ((pp->MaxPathsPerDevice > SDM_DEF_MAX_PATHS_PER_DEVICE) ||
++	    (pp->MaxRetriesPerPath < FO_MAX_RETRIES_PER_PATH_MIN) ||
++	    (pp->MaxRetriesPerPath > FO_MAX_RETRIES_PER_PATH_MAX) ||
++	    (pp->MaxRetriesPerIo < FO_MAX_RETRIES_PER_IO_MIN) ||
++	    (pp->MaxRetriesPerPath > FO_MAX_RETRIES_PER_IO_MAX)) {
++		DEBUG2_9_10(printk("%s: got invalid params.\n", __func__);)
++		return EXT_STATUS_INVALID_PARAM;
++	}
++
++	/* Update the global structure. */
++	qla_fo_params.MaxPathsPerDevice = pp->MaxPathsPerDevice;
++	qla_fo_params.MaxRetriesPerPath = pp->MaxRetriesPerPath;
++	qla_fo_params.MaxRetriesPerIo = pp->MaxRetriesPerIo;
++	qla_fo_params.Flags = pp->Flags;
++	qla_fo_params.FailoverNotifyType = pp->FailoverNotifyType;
++	qla_fo_params.FailoverNotifyCdbLength = pp->FailoverNotifyCdbLength;
++	if (pp->FailoverNotifyType & FO_NOTIFY_TYPE_CDB) {
++		if (pp->FailoverNotifyCdbLength >
++		    sizeof(qla_fo_params.FailoverNotifyCdb)) {
++			DEBUG2_9_10(printk("%s: got invalid cdb length.\n",
++			    __func__);)
++			return EXT_STATUS_INVALID_PARAM;
++		}
++
++		memcpy(qla_fo_params.FailoverNotifyCdb,
++		    pp->FailoverNotifyCdb,
++		    sizeof(qla_fo_params.FailoverNotifyCdb));
++	}
++
++	DEBUG9(printk("%s: exiting.\n", __func__);)
++
++	return EXT_STATUS_OK;
++}
++
++
++/*
++ * qla2x00_fo_init_params
++ *	Gets driver configuration file failover properties to initalize
++ *	the global failover parameters structure.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *
++ * Context:
++ *	Kernel context.
++ */
++void
++qla2x00_fo_init_params(scsi_qla_host_t *ha)
++{
++	DEBUG3(printk("%s: entered.\n", __func__);)
++
++	/* For parameters that are not completely implemented yet, */
++
++	memset(&qla_fo_params, 0, sizeof(qla_fo_params));
++
++	if(MaxPathsPerDevice) {
++		qla_fo_params.MaxPathsPerDevice = MaxPathsPerDevice;
++	} else
++		qla_fo_params.MaxPathsPerDevice =FO_MAX_PATHS_PER_DEVICE_DEF ;
++	if(MaxRetriesPerPath) {
++		qla_fo_params.MaxRetriesPerPath = MaxRetriesPerPath;
++	} else
++		qla_fo_params.MaxRetriesPerPath =FO_MAX_RETRIES_PER_PATH_DEF;
++	if(MaxRetriesPerIo) {
++		qla_fo_params.MaxRetriesPerIo =MaxRetriesPerIo;
++	} else
++		qla_fo_params.MaxRetriesPerIo =FO_MAX_RETRIES_PER_IO_DEF;
++
++	qla_fo_params.Flags =  0;
++	qla_fo_params.FailoverNotifyType = FO_NOTIFY_TYPE_NONE;
++
++	DEBUG3(printk("%s: exiting.\n", __func__);)
++
++}
++
++/*
++ * qla2x00_send_fo_notification
++ *      Sends failover notification if needed.  Change the fc_lun pointer
++ *      in the old path lun queue.
++ *
++ * Input:
++ *      old_lp = Pointer to old fc_lun.
++ *      new_lp = Pointer to new fc_lun.
++ *
++ * Returns:
++ *      Local function status code.
++ *
++ * Context:
++ *      Kernel context.
++ */
++uint32_t
++qla2x00_send_fo_notification(fc_lun_t *old_lp, fc_lun_t *new_lp)
++{
++	scsi_qla_host_t	*old_ha = old_lp->fcport->ha;
++	int		rval = QLA2X00_SUCCESS;
++	inq_cmd_rsp_t	*pkt;
++	uint16_t	loop_id, lun;
++	dma_addr_t	phys_address;
++
++
++	ENTER("qla2x00_send_fo_notification");
++	DEBUG3(printk("%s: entered.\n", __func__);)
++
++	loop_id = old_lp->fcport->loop_id;
++	lun = old_lp->lun;
++
++	if (qla_fo_params.FailoverNotifyType == FO_NOTIFY_TYPE_LUN_RESET) {
++		rval = qla2x00_lun_reset(old_ha, loop_id, lun);
++		if (rval == QLA2X00_SUCCESS) {
++			DEBUG4(printk("qla2x00_send_fo_notification: LUN "
++			    "reset succeded\n");)
++		} else {
++			DEBUG4(printk("qla2x00_send_fo_notification: LUN "
++			    "reset failed\n");)
++		}
++
++	}
++	if ( (qla_fo_params.FailoverNotifyType ==
++	     FO_NOTIFY_TYPE_LOGOUT_OR_LUN_RESET) ||
++	    (qla_fo_params.FailoverNotifyType ==
++	     FO_NOTIFY_TYPE_LOGOUT_OR_CDB) )  {
++
++		rval = qla2x00_fabric_logout(old_ha, loop_id);
++		if (rval == QLA2X00_SUCCESS) {
++			DEBUG4(printk("qla2x00_send_fo_failover_notify: "
++			    "logout succeded\n");)
++		} else {
++			DEBUG4(printk("qla2x00_send_fo_failover_notify: "
++			    "logout failed\n");)
++		}
++
++	}
++
++	if (qla_fo_params.FailoverNotifyType == FO_NOTIFY_TYPE_CDB) {
++		pkt = pci_alloc_consistent(old_ha->pdev,
++		    sizeof(inq_cmd_rsp_t), &phys_address);
++		if (pkt == NULL) {
++			DEBUG4(printk("qla2x00_send_fo_failover_notify: "
++			    "memory allocation failed\n");)
++
++			return(QLA2X00_FUNCTION_FAILED);
++		}
++
++		memset(pkt,0, sizeof(inq_cmd_rsp_t));
++		pkt->p.cmd.entry_type = COMMAND_A64_TYPE;
++		pkt->p.cmd.entry_count = 1;
++		pkt->p.cmd.lun = lun;
++		pkt->p.cmd.target = (uint8_t)loop_id;
++		pkt->p.cmd.control_flags = CF_SIMPLE_TAG;
++		memcpy(pkt->p.cmd.scsi_cdb,
++		    qla_fo_params.FailoverNotifyCdb,
++		    qla_fo_params.FailoverNotifyCdbLength);
++		/* FIXME This setup needs to be verified with Dennis. */
++		pkt->p.cmd.dseg_count = __constant_cpu_to_le16(1);
++		pkt->p.cmd.byte_count = __constant_cpu_to_le32(0);
++		pkt->p.cmd.dseg_0_address[0] = cpu_to_le32(
++		    LSD(phys_address + sizeof (sts_entry_t)));
++		pkt->p.cmd.dseg_0_address[1] = cpu_to_le32(
++		    MSD(phys_address + sizeof (sts_entry_t)));
++		pkt->p.cmd.dseg_0_length = __constant_cpu_to_le32(0);
++
++		rval = qla2x00_issue_iocb(old_ha,
++		    pkt, phys_address, sizeof (inq_cmd_rsp_t));
++
++		if (rval != QLA2X00_SUCCESS ||
++		    pkt->p.rsp.comp_status != CS_COMPLETE ||
++		    pkt->p.rsp.scsi_status & SS_CHECK_CONDITION ||
++		    pkt->inq[0] == 0x7f) {
++
++			DEBUG4(printk("qla2x00_fo_notification: send CDB "
++			    "failed: comp_status = %x"
++			    "scsi_status = %x inq[0] = %x\n",
++			    pkt->p.rsp.comp_status,
++			    pkt->p.rsp.scsi_status,
++			    pkt->inq[0]);)
++		}
++
++		pci_free_consistent(old_ha->pdev,
++		    sizeof(inq_cmd_rsp_t), pkt, phys_address);
++	}
++
++	DEBUG3(printk("%s: exiting. rval = %d.\n", __func__, rval);)
++
++	return rval;
++}
++
++
++/*
++ * qla2100_fo_enabled
++ *      Reads and validates the failover enabled property.
++ *
++ * Input:
++ *      ha = adapter state pointer.
++ *      instance = HBA number.
++ *
++ * Returns:
++ *      TRUE when failover is authorized else FALSE
++ *
++ * Context:
++ *      Kernel context.
++ */
++uint8_t
++qla2x00_fo_enabled(scsi_qla_host_t *ha, int instance)
++{
++	uint8_t enable = FALSE;
++
++	if (ha->flags.failover_enabled)
++		enable = TRUE;
++
++	return enable;
++}
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_fo.cfg	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,31 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.4.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++/*
++ * QLogic ISP2x00 Multi-path LUN Support Driver
++ */
++int	MaxPathsPerDevice = 0;
++int	MaxRetriesPerPath =0 ;
++int	MaxRetriesPerIo =0;
++#if defined(MODULE)
++/* insmod qla2100 <options> ql2xopts=<string> */
++MODULE_PARM(MaxPathsPerDevice, "i");
++MODULE_PARM(MaxRetriesPerPath, "i");
++MODULE_PARM(MaxRetriesPerIo, "i");
++#endif
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_fo.h	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,75 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++/*
++ * QLogic ISP2x00 Failover Header 
++ *
++ */
++#ifndef _QLA_FO_H
++#define _QLA_FO_H
++
++#if defined(__cplusplus)
++extern "C"
++{
++#endif
++
++#include "qlfo.h"
++        /*
++         * This structure definition is for a scsi I/O request NOT subject to
++         * failover re-routing.  It is for the use of configuration operations
++         * and diagnostics functions as definted in ExIoct.h
++         */
++        typedef struct scsi_cdb_request {
++                struct adapter_state		*ha;
++                uint16_t	target;
++                uint16_t	lun;
++                uint8_t		*cdb_ptr;	/* Pointer to cdb to be sent */
++                uint8_t		cdb_len;	/* cdb length */
++                uint8_t		direction;	/* Direction of I/O for buffer */
++                uint8_t		scb_len;	/* Scsi completion block length */
++                uint8_t		*scb_ptr;	/* Scsi completion block pointer */
++                uint8_t		*buf_ptr;	/* Pointer to I/O buffer */
++                uint16_t	buf_len;	/* Buffer size */
++        }
++        SCSI_REQ_t, *SCSI_REQ_p;
++
++
++        /*
++        * Special defines
++        */
++        typedef	union	_FO_HBA_STAT {
++                FO_HBA_STAT_INPUT	input;
++                FO_HBA_STAT_INFO	info;
++        } FO_HBA_STAT;
++
++        typedef	union	_FO_LUN_DATA {
++                FO_LUN_DATA_INPUT	input;
++                FO_LUN_DATA_LIST	list;
++        } FO_LUN_DATA;
++
++        typedef union	_FO_TARGET_DATA {
++                FO_TARGET_DATA_INPUT    input;
++                FO_DEVICE_DATABASE    list;
++        } FO_TARGET_DATA;
++
++#if defined(__cplusplus)
++}
++#endif
++
++#endif	/* ifndef _QLA_FO_H */
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_gbl.h	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,395 @@
++/********************************************************************************
++*                  QLOGIC LINUX SOFTWARE
++*
++* QLogic ISP2x00 device driver for Linux 2.5.x
++* Copyright (C) 2003 Qlogic Corporation
++* (www.qlogic.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, 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.
++*
++******************************************************************************
++* Global include file.
++******************************************************************************/
++
++
++#ifndef __QLA_GBL_H
++#define	__QLA_GBL_H
++
++/*
++ * Global Data in FW files.
++ */
++extern unsigned char  fw2100tp_version[];
++extern unsigned char  fw2100tp_version_str[];
++extern unsigned short fw2100tp_addr01;
++extern unsigned short fw2100tp_code01[];
++extern unsigned short fw2100tp_length01;
++
++extern unsigned char  fw2200ip_version[];
++extern unsigned char  fw2200ip_version_str[];
++extern unsigned short fw2200ip_addr01;
++extern unsigned short fw2200ip_code01[];
++extern unsigned short fw2200ip_length01;
++
++extern unsigned char  fw2300tpx_version[];
++extern unsigned char  fw2300tpx_version_str[];
++extern unsigned short fw2300tpx_addr01;
++extern unsigned short fw2300tpx_code01[];
++extern unsigned short fw2300tpx_length01;
++
++extern unsigned char  fw2300ipx_version[];
++extern unsigned char  fw2300ipx_version_str[];
++extern unsigned short fw2300ipx_addr01;
++extern unsigned short fw2300ipx_code01[];
++extern unsigned short fw2300ipx_length01;
++
++#if defined(ISP2322)
++extern unsigned char  fw2322tpx_version[];
++extern unsigned char  fw2322tpx_version_str[];
++extern unsigned short fw2322tpx_addr01;
++extern unsigned short fw2322tpx_code01[];
++extern unsigned short fw2322tpx_length01;
++extern unsigned long rseqtpx_code_addr01;
++extern unsigned short rseqtpx_code01[];
++extern unsigned short rseqtpx_code_length01;
++extern unsigned long xseqtpx_code_addr01;
++extern unsigned short xseqtpx_code01[];
++extern unsigned short xseqtpx_code_length01;
++
++extern unsigned char  fw2322ipx_version[];
++extern unsigned char  fw2322ipx_version_str[];
++extern unsigned short fw2322ipx_addr01;
++extern unsigned short fw2322ipx_code01[];
++extern unsigned short fw2322ipx_length01;
++extern unsigned long rseqipx_code_addr01;
++extern unsigned short rseqipx_code01[];
++extern unsigned short rseqipx_code_length01;
++extern unsigned long xseqipx_code_addr01;
++extern unsigned short xseqipx_code01[];
++extern unsigned short xseqipx_code_length01;
++#endif
++
++/*
++ * Global Function Prototypes in qla_init.c source file.
++ */
++extern uint8_t qla2x00_initialize_adapter(scsi_qla_host_t *);
++extern uint8_t qla2x00_loop_resync(scsi_qla_host_t *);
++extern void qla2x00_tgt_free(scsi_qla_host_t *ha, uint16_t t);
++extern uint8_t qla2x00_fabric_login(scsi_qla_host_t *, fcdev_t *);
++extern uint8_t qla2x00_local_device_login(scsi_qla_host_t *, uint16_t);
++
++extern void qla2x00_restart_queues(scsi_qla_host_t *, uint8_t);
++
++extern os_tgt_t *qla2x00_tgt_alloc(scsi_qla_host_t *, uint16_t);
++extern os_lun_t * qla2x00_lun_alloc(scsi_qla_host_t *, uint16_t, uint16_t);
++
++extern uint8_t qla2x00_abort_isp(scsi_qla_host_t *, uint8_t);
++
++
++/*
++ * Global Data in qla_os.c source file.
++ */
++extern char qla2x00_version_str[];
++extern unsigned long qla2x00_verbose;
++extern unsigned long qla2x00_quiet;
++extern unsigned long qla2x00_reinit;
++extern unsigned long qla2x00_req_dmp;
++
++extern int num_hosts;
++extern int apiHBAInstance;
++
++extern struct _qla2x00stats qla2x00_stats;
++extern char *ql2xdevconf;
++extern int ql2xretrycount;
++extern int qla2xenbinq;
++extern int max_srbs;
++#if defined(ISP2200) || defined(ISP2300)
++extern int ql2xlogintimeout;
++extern int qlport_down_retry;
++#endif
++extern int ql2xmaxqdepth;
++extern int displayConfig;
++
++extern int ql2xfailover;
++
++extern int ConfigRequired;
++extern int recoveryTime;
++extern int failbackTime;
++
++extern int Bind;
++extern int ql2xsuspendcount;
++extern int qla2x00_retryq_dmp;
++#if defined(MODULE)
++extern char *ql2xopts;
++#endif
++extern struct list_head qla_hostlist;
++extern rwlock_t qla_hostlist_lock;
++
++extern int qla2x00_queuecommand(Scsi_Cmnd *, void (*)(Scsi_Cmnd *));
++
++extern uint8_t 
++__qla2x00_suspend_lun(scsi_qla_host_t *, os_lun_t *, int, int, int);
++
++extern int qla2x00_done(scsi_qla_host_t *);
++extern void qla2x00_next(scsi_qla_host_t *);
++extern void qla2x00_flush_failover_q(scsi_qla_host_t *, os_lun_t *);
++extern void qla2x00_reset_lun_fo_counts(scsi_qla_host_t *, os_lun_t *);
++
++extern uint8_t qla2x00_check_tgt_status(scsi_qla_host_t *, Scsi_Cmnd *);
++extern uint8_t qla2x00_check_port_status(scsi_qla_host_t *, fc_port_t *);
++
++extern void qla2x00_extend_timeout(Scsi_Cmnd *, int);
++extern srb_t * qla2x00_get_new_sp (scsi_qla_host_t *ha);
++
++extern void qla2x00_mark_device_lost(scsi_qla_host_t *, fc_port_t *);
++extern void qla2x00_mark_all_devices_lost(scsi_qla_host_t *);
++
++extern int qla2x00_get_prop_xstr(scsi_qla_host_t *, char *, uint8_t *, int);
++
++extern void qla2x00_abort_queues(scsi_qla_host_t *, uint8_t);
++
++/*
++ * Global Function Prototypes in qla_iocb.c source file.
++ */
++extern request_t *qla2x00_req_pkt(scsi_qla_host_t *);
++extern request_t *qla2x00_ms_req_pkt(scsi_qla_host_t *, srb_t *);
++extern void qla2x00_isp_cmd(scsi_qla_host_t *);
++extern int qla2x00_start_scsi(srb_t *sp);
++int qla2x00_marker(scsi_qla_host_t *, uint16_t, uint16_t, uint8_t);
++int __qla2x00_marker(scsi_qla_host_t *, uint16_t, uint16_t, uint8_t);
++
++/*
++ * Global Function Prototypes in qla_mbx.c source file.
++ */
++extern uint8_t
++qla2x00_mailbox_command(scsi_qla_host_t *, mbx_cmd_t *);
++
++extern int
++qla2x00_load_ram(scsi_qla_host_t *, dma_addr_t, uint16_t, uint16_t);
++
++extern int
++qla2x00_load_ram_ext(scsi_qla_host_t *, dma_addr_t, uint32_t, uint16_t);
++
++extern int
++qla2x00_execute_fw(scsi_qla_host_t *);
++
++extern void
++qla2x00_get_fw_version(scsi_qla_host_t *, uint16_t *,
++    uint16_t *, uint16_t *, uint16_t *);
++
++extern int
++qla2x00_get_fw_options(scsi_qla_host_t *, uint16_t *, uint16_t *, uint16_t *);
++
++extern int
++qla2x00_set_fw_options(scsi_qla_host_t *,
++    uint16_t, uint16_t, uint16_t, uint16_t, uint16_t);
++
++extern int
++qla2x00_read_ram_word(scsi_qla_host_t *, uint16_t, uint16_t *);
++extern int
++qla2x00_write_ram_word(scsi_qla_host_t *, uint16_t, uint16_t);
++extern int
++qla2x00_write_ram_word_ext(scsi_qla_host_t *, uint32_t, uint16_t);
++
++extern int
++qla2x00_mbx_reg_test(scsi_qla_host_t *);
++
++extern int
++qla2x00_verify_checksum(scsi_qla_host_t *);
++
++extern int
++qla2x00_issue_iocb(scsi_qla_host_t *, void *, dma_addr_t, size_t);
++
++extern int
++qla2x00_abort_command(scsi_qla_host_t *, srb_t *);
++
++extern int
++qla2x00_abort_device(scsi_qla_host_t *, uint16_t, uint16_t);
++
++#if USE_ABORT_TGT
++extern int
++qla2x00_abort_target(fc_port_t *fcport);
++#endif
++
++extern int
++qla2x00_target_reset(scsi_qla_host_t *, uint16_t, uint16_t);
++
++extern int
++qla2x00_get_adapter_id(scsi_qla_host_t *, uint16_t *, uint8_t *, uint8_t *,
++    uint8_t *, uint16_t *);
++
++extern int
++qla2x00_get_retry_cnt(scsi_qla_host_t *, uint8_t *, uint8_t *);
++
++int
++qla2x00_loopback_test(scsi_qla_host_t *, INT_LOOPBACK_REQ *, uint16_t *);
++
++extern int
++qla2x00_init_firmware(scsi_qla_host_t *, uint16_t);
++
++extern int
++qla2x00_get_port_database(scsi_qla_host_t *, fcdev_t *, uint8_t);
++
++extern int
++qla2x00_get_firmware_state(scsi_qla_host_t *, uint16_t *);
++
++extern int
++qla2x00_get_port_name(scsi_qla_host_t *, uint16_t, uint8_t *, uint8_t);
++
++extern uint8_t
++qla2x00_get_link_status(scsi_qla_host_t *, uint8_t, void *, uint16_t *);
++
++extern int
++qla2x00_lip_reset(scsi_qla_host_t *);
++
++extern int
++qla2x00_send_sns(scsi_qla_host_t *, dma_addr_t, uint16_t, size_t);
++
++extern int
++qla2x00_login_fabric(scsi_qla_host_t *, uint16_t, uint8_t, uint8_t, uint8_t,
++    uint16_t *, uint8_t);
++
++extern int
++qla2x00_login_local_device(scsi_qla_host_t *, uint16_t, uint16_t *, uint8_t);
++
++extern int
++qla2x00_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id);
++
++extern int
++qla2x00_full_login_lip(scsi_qla_host_t *ha);
++
++extern int
++qla2x00_get_port_list(scsi_qla_host_t *, port_list_entry_t *, dma_addr_t,
++    uint16_t, uint16_t *);
++
++#if 0 /* not yet needed */
++extern int
++qla2x00_dump_ram(scsi_qla_host_t *, uint32_t, dma_addr_t, uint32_t);
++#endif
++
++extern int
++qla2x00_lun_reset(scsi_qla_host_t *, uint16_t, uint16_t);
++
++extern int
++qla2x00_send_rnid_mbx(scsi_qla_host_t *, uint16_t, uint8_t, dma_addr_t,
++    size_t, uint16_t *);
++
++extern int
++qla2x00_set_rnid_params_mbx(scsi_qla_host_t *, dma_addr_t, size_t, uint16_t *);
++
++extern int
++qla2x00_get_rnid_params_mbx(scsi_qla_host_t *, dma_addr_t, size_t, uint16_t *);
++
++#if defined(QL_DEBUG_LEVEL_3)
++extern int
++qla2x00_get_fcal_position_map(scsi_qla_host_t *ha, char *pos_map);
++#endif
++
++/*
++ * Global Data in qla_fo.c source file.
++ */
++extern SysFoParams_t qla_fo_params;
++
++/*
++ * Global Function Prototypes in qla_fo.c source file.
++ */
++extern scsi_qla_host_t *qla2x00_get_hba(int);
++extern uint32_t qla2x00_send_fo_notification(fc_lun_t *fclun_p, fc_lun_t *olun_p);
++extern void qla2x00_fo_init_params(scsi_qla_host_t *ha);
++extern uint8_t qla2x00_fo_enabled(scsi_qla_host_t *ha, int instance);
++
++/*
++ * Global Data in qla_cfg.c source file.
++ */
++extern mp_host_t  *mp_hosts_base;
++extern uint8_t   mp_config_required;
++/*
++ * Global Function Prototypes in qla_cfg.c source file.
++ */
++extern mp_host_t * qla2x00_cfg_find_host(scsi_qla_host_t *);
++extern uint8_t qla2x00_is_portname_in_device(mp_device_t *, uint8_t *);
++extern int qla2x00_cfg_init (scsi_qla_host_t *ha);
++extern int qla2x00_cfg_path_discovery(scsi_qla_host_t *ha);
++extern int qla2x00_cfg_event_notify(scsi_qla_host_t *ha, uint32_t i_type);
++extern fc_lun_t *qla2x00_cfg_failover(scsi_qla_host_t *ha, fc_lun_t *fp,
++					      os_tgt_t *tgt, srb_t *sp);
++extern int qla2x00_cfg_get_paths( EXT_IOCTL *, FO_GET_PATHS *, int);
++extern int qla2x00_cfg_set_current_path( EXT_IOCTL *,
++			FO_SET_CURRENT_PATH *, int);
++extern void qla2x00_fo_properties(scsi_qla_host_t *ha);
++extern mp_host_t * qla2x00_add_mp_host(uint8_t *);
++extern void qla2x00_cfg_mem_free(scsi_qla_host_t *ha);
++extern mp_host_t * qla2x00_alloc_host(scsi_qla_host_t *);
++extern uint8_t qla2x00_fo_check(scsi_qla_host_t *ha, srb_t *sp);
++extern mp_path_t *qla2x00_find_path_by_name(mp_host_t *, mp_path_list_t *,
++			uint8_t *name);
++
++/*
++ * Global Function Prototypes in qla_cfgln.c source file.
++ */
++extern void qla2x00_cfg_build_path_tree( scsi_qla_host_t *ha);
++extern uint8_t qla2x00_update_mp_device(mp_host_t *,
++					     fc_port_t  *, uint16_t	);
++extern void qla2x00_cfg_display_devices(void);
++
++/*
++ * Global Function Prototypes in qla_xioctl.c source file.
++ */
++extern void qla2x00_enqueue_aen(scsi_qla_host_t *, uint16_t, void *);
++extern int qla2x00_fo_ioctl(scsi_qla_host_t *, int, void *, int);
++extern int qla2x00_alloc_ioctl_mem(scsi_qla_host_t *);
++extern void qla2x00_free_ioctl_mem(scsi_qla_host_t *);
++extern int qla2x00_get_ioctl_scrap_mem(scsi_qla_host_t *, void **, uint32_t);
++extern void qla2x00_free_ioctl_scrap_mem(scsi_qla_host_t *);
++
++/*
++ * Global Function Prototypes in qla_inioctl.c source file.
++ */
++extern int qla2x00_read_nvram(scsi_qla_host_t *, EXT_IOCTL *, int);
++extern int qla2x00_update_nvram(scsi_qla_host_t *, EXT_IOCTL *, int);
++extern int qla2x00_write_nvram_word(scsi_qla_host_t *, uint8_t, uint16_t);
++extern int qla2x00_send_loopback(scsi_qla_host_t *, EXT_IOCTL *, int);
++extern int qla2x00_read_option_rom(scsi_qla_host_t *, EXT_IOCTL *, int);
++extern int qla2x00_update_option_rom(scsi_qla_host_t *, EXT_IOCTL *, int);
++
++
++/*
++ * Global Function Prototypes in qla_isr.c source file.
++ */
++extern irqreturn_t qla2x00_intr_handler(int, void *, struct pt_regs *);
++
++
++/*
++ * Global Function Prototypes in qla_sup.c source file.
++ */
++extern uint16_t qla2x00_get_nvram_word(scsi_qla_host_t *, uint32_t);
++extern void qla2x00_nv_write(scsi_qla_host_t *, uint16_t);
++extern void qla2x00_nv_deselect(scsi_qla_host_t *);
++extern uint8_t qla2x00_read_flash_byte(scsi_qla_host_t *, uint32_t);
++extern uint8_t qla2x00_get_flash_manufacturer(scsi_qla_host_t *);
++extern uint16_t qla2x00_get_flash_version(scsi_qla_host_t *);
++extern uint16_t qla2x00_get_flash_image(scsi_qla_host_t *, uint8_t *);
++extern uint16_t qla2x00_set_flash_image(scsi_qla_host_t *, uint8_t *);
++
++/*
++ * Global Function Prototypes in qla_vendor.c source file.
++ */
++void qla2x00_set_vend_direction(scsi_qla_host_t *, Scsi_Cmnd *, cmd_entry_t *);
++
++/*
++ * Global Function Prototypes in qla_dbg.c source file.
++ */
++extern void qla2x00_dump_isp(scsi_qla_host_t *, int);
++extern void qla2x00_dump_regs(struct Scsi_Host *);
++extern void qla2x00_dump_buffer(uint8_t *, uint32_t);
++extern void qla2x00_print_scsi_cmd(Scsi_Cmnd *);
++extern void qla2x00_print_q_info(struct os_lun *);
++
++#endif /* _QLA_GBL_H */
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_inioct.c	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,495 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++#include "qla_os.h"
++#include "qla_def.h"
++
++#include "inioct.h"
++
++extern int qla2x00_loopback_test(scsi_qla_host_t *ha, INT_LOOPBACK_REQ *req,
++    uint16_t *ret_mb);
++
++int qla2x00_read_nvram(scsi_qla_host_t *, EXT_IOCTL *, int);
++int qla2x00_update_nvram(scsi_qla_host_t *, EXT_IOCTL *, int);
++int qla2x00_write_nvram_word(scsi_qla_host_t *, uint8_t, uint16_t);
++int qla2x00_send_loopback(scsi_qla_host_t *, EXT_IOCTL *, int);
++int qla2x00_read_option_rom(scsi_qla_host_t *, EXT_IOCTL *, int);
++int qla2x00_update_option_rom(scsi_qla_host_t *, EXT_IOCTL *, int);
++
++int
++qla2x00_read_nvram(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	uint8_t  *usr_temp, *kernel_tmp;
++	uint16_t data;
++	uint32_t i, cnt;
++	uint32_t transfer_size;
++
++	DEBUG9(printk("qla2x00_read_nvram: entered.\n");)
++
++	if (pext->ResponseLen < sizeof(nvram_t))
++		transfer_size = pext->ResponseLen / 2;
++	else
++		transfer_size = sizeof(nvram_t) / 2;
++
++	/* Dump NVRAM. */
++	usr_temp = (uint8_t *)pext->ResponseAdr;
++	for (i = 0, cnt = 0; cnt < transfer_size; cnt++, i++) {
++		data = cpu_to_le16(qla2x00_get_nvram_word(ha, cnt));
++
++		kernel_tmp = (uint8_t *)&data;
++
++		__put_user(*kernel_tmp, usr_temp);
++
++		/* next byte */
++		usr_temp++;
++		kernel_tmp++;
++
++		__put_user(*kernel_tmp, usr_temp);
++
++		usr_temp++;
++	}
++
++	pext->Status       = EXT_STATUS_OK;
++	pext->DetailStatus = EXT_STATUS_OK;
++
++	DEBUG9(printk("qla2x00_read_nvram: exiting.\n");)
++
++	return 0;
++}
++
++/*
++ * qla2x00_update_nvram
++ *	Write data to NVRAM.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	pext = pointer to driver internal IOCTL structure.
++ *
++ * Returns:
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_update_nvram(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	uint8_t i, cnt;
++	uint8_t *usr_tmp, *kernel_tmp;
++	nvram_t *pnew_nv;
++	uint16_t *wptr;
++	uint16_t data;
++	uint32_t transfer_size;
++	uint8_t chksum = 0;
++	int ret = 0;
++
++	// FIXME: Endianess?
++	DEBUG9(printk("qla2x00_update_nvram: entered.\n");)
++
++	if (pext->RequestLen < sizeof(nvram_t))
++		transfer_size = pext->RequestLen;
++	else
++		transfer_size = sizeof(nvram_t);
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pnew_nv,
++	    sizeof(nvram_t))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(nvram_t));)
++		return (ret);
++	}
++
++	/* Read from user buffer */
++	kernel_tmp = (uint8_t *)pnew_nv;
++	usr_tmp = (uint8_t *)pext->RequestAdr;
++
++	ret = verify_area(VERIFY_READ, (void *)usr_tmp, transfer_size);
++	if (ret) {
++		DEBUG9_10(printk(
++		    "qla2x00_update_nvram: ERROR in buffer verify READ. "
++		    "RequestAdr=%p\n", pext->RequestAdr);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return ret;
++	}
++
++	copy_from_user(kernel_tmp, usr_tmp, transfer_size);
++
++	kernel_tmp = (uint8_t *)pnew_nv;
++
++	/* we need to checksum the nvram */
++	for (i = 0; i < sizeof(nvram_t) - 1; i++) {
++		chksum += *kernel_tmp;
++		kernel_tmp++;
++	}
++
++	chksum = ~chksum + 1;
++
++	*kernel_tmp = chksum;
++
++	/* Write to NVRAM */
++	wptr = (uint16_t *)pnew_nv;
++	for (cnt = 0; cnt < transfer_size / 2; cnt++) {
++		data = *wptr++;
++		qla2x00_write_nvram_word(ha, cnt, data);
++	}
++
++	pext->Status       = EXT_STATUS_OK;
++	pext->DetailStatus = EXT_STATUS_OK;
++
++	DEBUG9(printk("qla2x00_update_nvram: exiting.\n");)
++
++	qla2x00_free_ioctl_scrap_mem(ha);
++	return 0;
++}
++
++int
++qla2x00_write_nvram_word(scsi_qla_host_t *ha, uint8_t addr, uint16_t data)
++{
++	int count;
++	uint16_t word;
++	uint32_t nv_cmd;
++	device_reg_t *reg = ha->iobase;
++
++	qla2x00_nv_write(ha, NVR_DATA_OUT);
++	qla2x00_nv_write(ha, 0);
++	qla2x00_nv_write(ha, 0);
++
++	for (word = 0; word < 8; word++)
++		qla2x00_nv_write(ha, NVR_DATA_OUT);
++
++	qla2x00_nv_deselect(ha);
++
++	/* Erase Location */
++	nv_cmd = (addr << 16) | NV_ERASE_OP;
++	nv_cmd <<= 5;
++	for (count = 0; count < 11; count++) {
++		if (nv_cmd & BIT_31)
++			qla2x00_nv_write(ha, NVR_DATA_OUT);
++		else
++			qla2x00_nv_write(ha, 0);
++
++		nv_cmd <<= 1;
++	}
++
++	qla2x00_nv_deselect(ha);
++
++	/* Wait for Erase to Finish */
++	WRT_REG_WORD(&reg->nvram, NVR_SELECT);
++	do {
++		NVRAM_DELAY();
++		word = RD_REG_WORD(&reg->nvram);
++	} while ((word & NVR_DATA_IN) == 0);
++
++	qla2x00_nv_deselect(ha);
++
++	/* Write data */
++	nv_cmd = (addr << 16) | NV_WRITE_OP;
++	nv_cmd |= data;
++	nv_cmd <<= 5;
++	for (count = 0; count < 27; count++) {
++		if (nv_cmd & BIT_31)
++			qla2x00_nv_write(ha, NVR_DATA_OUT);
++		else
++			qla2x00_nv_write(ha, 0);
++
++		nv_cmd <<= 1;
++	}
++
++	qla2x00_nv_deselect(ha);
++
++	/* Wait for NVRAM to become ready */
++	WRT_REG_WORD(&reg->nvram, NVR_SELECT);
++	do {
++		NVRAM_DELAY();
++		word = RD_REG_WORD(&reg->nvram);
++	} while ((word & NVR_DATA_IN) == 0);
++
++	qla2x00_nv_deselect(ha);
++
++	/* Disable writes */
++	qla2x00_nv_write(ha, NVR_DATA_OUT);
++	for (count = 0; count < 10; count++)
++		qla2x00_nv_write(ha, 0);
++
++	qla2x00_nv_deselect(ha);
++
++	DEBUG9(printk("qla2x00_write_nvram_word: exiting.\n");)
++
++	return 0;
++}
++
++int
++qla2x00_send_loopback(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int		status;
++	uint16_t	ret_mb[MAILBOX_REGISTER_COUNT];
++	INT_LOOPBACK_REQ req;
++	INT_LOOPBACK_RSP rsp;
++
++	DEBUG9(printk("qla2x00_send_loopback: entered.\n");)
++
++
++	if (pext->RequestLen != sizeof(INT_LOOPBACK_REQ)) {
++		pext->Status = EXT_STATUS_INVALID_PARAM;
++		DEBUG9_10(printk(
++		    "qla2x00_send_loopback: invalid RequestLen =%d.\n",
++		    pext->RequestLen);)
++		return pext->Status;
++	}
++
++	if (pext->ResponseLen != sizeof(INT_LOOPBACK_RSP)) {
++		pext->Status = EXT_STATUS_INVALID_PARAM;
++		DEBUG9_10(printk(
++		    "qla2x00_send_loopback: invalid ResponseLen =%d.\n",
++		    pext->ResponseLen);)
++		return pext->Status;
++	}
++
++	status = verify_area(VERIFY_READ, (void *)pext->RequestAdr,
++			pext->RequestLen);
++	if (status) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify read of "
++		    "request buffer.\n");)
++		return pext->Status;
++	}
++
++	copy_from_user((uint8_t *)&req, (uint8_t *)pext->RequestAdr,
++	    pext->RequestLen);
++
++	status = verify_area(VERIFY_READ, (void *)pext->ResponseAdr,
++			pext->ResponseLen);
++	if (status) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify read of "
++		    "response buffer.\n");)
++		return pext->Status;
++	}
++
++	copy_from_user((uint8_t *)&rsp, (uint8_t *)pext->ResponseAdr,
++	    pext->ResponseLen);
++
++	if (req.TransferCount > req.BufferLength ||
++	    req.TransferCount > rsp.BufferLength) {
++
++		/* Buffer lengths not large enough. */
++		pext->Status = EXT_STATUS_INVALID_PARAM;
++
++		DEBUG9_10(printk(
++		    "qla2x00_send_loopback: invalid TransferCount =%d. "
++		    "req BufferLength =%d rspBufferLength =%d.\n",
++		    req.TransferCount, req.BufferLength, rsp.BufferLength);)
++
++		return pext->Status;
++	}
++
++	status = verify_area(VERIFY_READ, (void *)req.BufferAddress,
++	    req.TransferCount);
++	if (status) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify read of "
++		    "user loopback data buffer.\n");)
++		return pext->Status;
++	}
++
++	copy_from_user((uint8_t *)ha->ioctl_mem, (uint8_t *)req.BufferAddress,
++	    req.TransferCount);
++
++	DEBUG9(printk("qla2x00_send_loopback: req -- bufadr=%p, buflen=%x, "
++	    "xfrcnt=%x, rsp -- bufadr=%p, buflen=%x.\n",
++	    req.BufferAddress, req.BufferLength, req.TransferCount,
++	    rsp.BufferAddress, rsp.BufferLength);)
++
++	/*
++	 * AV - the caller of this IOCTL expects the FW to handle
++	 * a loopdown situation and return a good status for the
++	 * call function and a LOOPDOWN status for the test operations
++	 */
++	/*if (ha->loop_state != LOOP_READY || */
++	if (
++	    (test_bit(CFG_ACTIVE, &ha->cfg_flags)) ||
++	    (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) ||
++	    ABORTS_ACTIVE || ha->dpc_active) {
++
++		pext->Status = EXT_STATUS_BUSY;
++		DEBUG9_10(printk("qla2x00_send_loopback(%ld): "
++		    "loop not ready.\n", ha->host_no);)
++		return pext->Status;
++	}
++
++	status = qla2x00_loopback_test(ha, &req, ret_mb);
++
++	if (status) {
++		if (status == QL_STATUS_TIMEOUT ) {
++			pext->Status = EXT_STATUS_BUSY;
++			DEBUG9_10(printk("qla2x00_send_loopback: ERROR "
++			    "command timed out.\n");)
++			return pext->Status;
++		} else {
++			/* EMPTY. Just proceed to copy back mailbox reg
++			 * values for users to interpret.
++			 */
++			DEBUG10(printk("qla2x00_send_loopback: ERROR "
++			    "loopback command failed 0x%x.\n", ret_mb[0]);)
++		}
++	}
++
++	status = verify_area(VERIFY_WRITE, (void *)rsp.BufferAddress,
++	    req.TransferCount);
++	if (status) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify "
++		    "write of return data buffer.\n");)
++		return pext->Status;
++	}
++
++	DEBUG9(printk("qla2x00_send_loopback: loopback mbx cmd ok. "
++	    "copying data.\n");)
++
++	/* put loopback return data in user buffer */
++	copy_to_user((uint8_t *)rsp.BufferAddress,
++	    (uint8_t *)ha->ioctl_mem, req.TransferCount);
++
++	rsp.CompletionStatus = ret_mb[0];
++	if (rsp.CompletionStatus == INT_DEF_LB_COMPLETE) {
++		rsp.CrcErrorCount = ret_mb[1];
++		rsp.DisparityErrorCount = ret_mb[2];
++		rsp.FrameLengthErrorCount = ret_mb[3];
++		rsp.IterationCountLastError = (ret_mb[19] << 16) | ret_mb[18];
++	}
++
++	status = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr,
++	    pext->ResponseLen);
++	if (status) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify "
++		    "write of response buffer.\n");)
++		return pext->Status;
++	}
++
++	copy_to_user((uint8_t *)pext->ResponseAdr, (uint8_t *)&rsp,
++	    pext->ResponseLen);
++
++	pext->Status       = EXT_STATUS_OK;
++	pext->DetailStatus = EXT_STATUS_OK;
++
++	DEBUG9(printk("qla2x00_send_loopback: exiting.\n");)
++
++	return pext->Status;
++}
++
++int qla2x00_read_option_rom(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	uint8_t		*usr_tmp;
++	uint32_t	addr;
++	uint32_t	midpoint;
++	uint32_t	transfer_size;
++	uint8_t		data;
++	device_reg_t	*reg = ha->iobase;
++	unsigned long	cpu_flags;
++
++	DEBUG9(printk("%s: entered.\n", __func__);)
++
++	if (pext->ResponseLen != FLASH_IMAGE_SIZE) {
++		pext->Status = EXT_STATUS_BUFFER_TOO_SMALL;
++		return (1);
++	}
++
++	transfer_size = FLASH_IMAGE_SIZE;
++
++	midpoint = FLASH_IMAGE_SIZE / 2;
++	usr_tmp = (uint8_t *)pext->ResponseAdr;
++
++	/* Dump FLASH. */
++	spin_lock_irqsave(&ha->hardware_lock, cpu_flags);
++	WRT_REG_WORD(&reg->nvram, 0);
++	for (addr = 0; addr < transfer_size; addr++, usr_tmp++) {
++		if (addr == midpoint)
++			WRT_REG_WORD(&reg->nvram, NVR_SELECT);
++
++		data = qla2x00_read_flash_byte(ha, addr);
++		__put_user(data, usr_tmp);
++	}
++	spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags);
++
++	pext->Status = EXT_STATUS_OK;
++	pext->DetailStatus = EXT_STATUS_OK;
++
++	DEBUG9(printk("%s: exiting.\n", __func__);)
++
++	return (0);
++}
++
++int qla2x00_update_option_rom(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int		ret;
++	uint8_t		*usr_tmp;
++	uint8_t		*kern_tmp;
++	uint16_t	status;
++	unsigned long	cpu_flags;
++
++	DEBUG9(printk("%s: entered.\n", __func__);)
++
++	if (pext->RequestLen != FLASH_IMAGE_SIZE) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		return (1);
++	}
++
++	pext->Status = EXT_STATUS_OK;
++	pext->DetailStatus = EXT_STATUS_OK;
++
++	/* Read from user buffer */
++	usr_tmp = (uint8_t *)pext->RequestAdr;
++	ret = verify_area(VERIFY_READ, (void *)usr_tmp, FLASH_IMAGE_SIZE);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s: ERROR in buffer verify READ. "
++				"RequestAdr=%p\n",
++				__func__, pext->RequestAdr);)
++		return (ret);
++	}
++
++	kern_tmp = (uint8_t *)KMEM_ZALLOC(FLASH_IMAGE_SIZE, 30);
++	if (kern_tmp == NULL) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		printk(KERN_WARNING
++			"%s: ERROR in flash allocation.\n", __func__);
++		return (1);
++	}
++	copy_from_user(kern_tmp, usr_tmp, FLASH_IMAGE_SIZE);
++
++	/* Go with update */
++	spin_lock_irqsave(&ha->hardware_lock, cpu_flags);
++	status = qla2x00_set_flash_image(ha, kern_tmp);
++	spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags);
++
++	KMEM_FREE(kern_tmp, FLASH_IMAGE_SIZE);
++
++	if (status) {
++		ret = 1;
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s: ERROR updating flash.\n", __func__);)
++	}
++
++	DEBUG9(printk("%s: exiting.\n", __func__);)
++
++	return (ret);
++}
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_init.c	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,5945 @@
++/*
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ */
++#include "qla_os.h"
++
++#include "qla_def.h"
++
++/*
++*  QLogic ISP2x00 Hardware Support Function Prototypes.
++*/
++uint8_t qla2x00_initialize_adapter(scsi_qla_host_t *);
++
++static uint8_t qla2x00_isp_firmware(scsi_qla_host_t *);
++static void qla2x00_reset_chip(scsi_qla_host_t *);
++static uint8_t qla2x00_pci_config(scsi_qla_host_t *);
++static uint8_t qla2x00_set_cache_line(scsi_qla_host_t *);
++static uint8_t qla2x00_chip_diag(scsi_qla_host_t *);
++static uint8_t qla2x00_setup_chip(scsi_qla_host_t *ha);
++static uint8_t qla2x00_init_rings(scsi_qla_host_t *ha);
++static uint8_t qla2x00_fw_ready(scsi_qla_host_t *ha);
++static uint8_t qla2x00_nvram_config(scsi_qla_host_t *);
++
++static void qla2x00_init_fc_db(scsi_qla_host_t *);
++static void qla2x00_init_tgt_map(scsi_qla_host_t *);
++
++static uint8_t qla2x00_configure_loop(scsi_qla_host_t *);
++static uint8_t qla2x00_configure_local_loop(scsi_qla_host_t *, uint8_t );
++static uint8_t qla2x00_configure_fabric(scsi_qla_host_t *, uint8_t );
++static uint8_t qla2x00_find_all_fabric_devs(scsi_qla_host_t *,
++    struct new_dev *, uint16_t *, uint8_t *);
++static void qla2x00_device_resync(scsi_qla_host_t *);
++static int qla2x00_ga_nxt(scsi_qla_host_t *, sw_info_t *);
++static int qla2x00_gid_pt(scsi_qla_host_t *, sw_info_t *);
++static int qla2x00_gpn_id(scsi_qla_host_t *, sw_info_t *);
++static int qla2x00_gnn_id(scsi_qla_host_t *, sw_info_t *);
++static int qla2x00_gft_id(scsi_qla_host_t *, sw_info_t *);
++static int qla2x00_rft_id(scsi_qla_host_t *);
++static int qla2x00_rff_id(scsi_qla_host_t *);
++static int qla2x00_rnn_id(scsi_qla_host_t *);
++static int qla2x00_rsnn_nn(scsi_qla_host_t *);
++
++static int qla2x00_add_initiator_device(scsi_qla_host_t *, fcdev_t *);
++
++uint8_t qla2x00_fabric_login(scsi_qla_host_t *, fcdev_t *);
++uint8_t qla2x00_local_device_login(scsi_qla_host_t *, uint16_t);
++
++static uint8_t qla2x00_update_fc_database(scsi_qla_host_t *,
++    fcdev_t *, uint8_t);
++static int qla2x00_build_fcport_list(scsi_qla_host_t *ha);
++static void qla2x00_config_os(scsi_qla_host_t *ha);
++static uint16_t qla2x00_fcport_bind(scsi_qla_host_t *ha, fc_port_t *fcport);
++static int qla2x00_update_fcport(scsi_qla_host_t *ha, fc_port_t *fcport, int);
++static int qla2x00_lun_discovery(scsi_qla_host_t *ha, fc_port_t *fcport, int);
++static int qla2x00_rpt_lun_discovery(scsi_qla_host_t *ha, fc_port_t *fcport);
++static void qla2x00_cfg_lun(fc_port_t *fcport, uint16_t lun);
++
++static void qla2x00_lun_free(scsi_qla_host_t *, uint16_t, uint16_t);
++
++static void qla2x00_get_lun_mask_from_config(scsi_qla_host_t *,
++    fc_port_t *, uint16_t, uint16_t);
++static int qla2x00_bstr_to_hex(char *, uint8_t *, int);
++
++static uint8_t qla2x00_find_propname(scsi_qla_host_t *,
++    char *, char *, char *, int);
++static int qla2x00_get_prop_16chars(scsi_qla_host_t *,
++    char *, char *, char *);
++static void qla2x00_get_properties(scsi_qla_host_t *, char *);
++
++static void qla2x00_cfg_persistent_binding(scsi_qla_host_t *);
++
++static int qla2x00_restart_isp(scsi_qla_host_t *);
++static void qla2x00_reset_adapter(scsi_qla_host_t *);
++
++#define MAX_LOCAL_LOOP_IDS	127
++static uint8_t alpa_table[MAX_LOCAL_LOOP_IDS] = {
++	0xEF, 0xE8, 0xE4, 0xE2, 0xE1, 0xE0, 0xDC, 0xDA,
++	0xD9, 0xD6, 0xD5, 0xD4, 0xD3, 0xD2, 0xD1, 0xCE,
++	0xCD, 0xCC, 0xCB, 0xCA, 0xC9, 0xC7, 0xC6, 0xC5,
++	0xC3, 0xBC, 0xBA, 0xB9, 0xB6, 0xB5, 0xB4, 0xB3,
++	0xB2, 0xB1, 0xAE, 0xAD, 0xAC, 0xAB, 0xAA, 0xA9,
++	0xA7, 0xA6, 0xA5, 0xA3, 0x9F, 0x9E, 0x9D, 0x9B,
++	0x98, 0x97, 0x90, 0x8F, 0x88, 0x84, 0x82, 0x81,
++	0x80, 0x7C, 0x7A, 0x79, 0x76, 0x75, 0x74, 0x73,
++	0x72, 0x71, 0x6E, 0x6D, 0x6C, 0x6B, 0x6A, 0x69,
++	0x67, 0x66, 0x65, 0x63, 0x5C, 0x5A, 0x59, 0x56,
++	0x55, 0x54, 0x53, 0x52, 0x51, 0x4E, 0x4D, 0x4C,
++	0x4B, 0x4A, 0x49, 0x47, 0x46, 0x45, 0x43, 0x3C,
++	0x3A, 0x39, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31,
++	0x2E, 0x2D, 0x2C, 0x2B, 0x2A, 0x29, 0x27, 0x26,
++	0x25, 0x23, 0x1F, 0x1E, 0x1D, 0x1B, 0x18, 0x17,
++	0x10, 0x0F, 0x08, 0x04, 0x02, 0x01, 0x00
++};
++
++/****************************************************************************/
++/*                QLogic ISP2x00 Hardware Support Functions.                */
++/****************************************************************************/
++
++/*
++* qla2x00_initialize_adapter
++*      Initialize board.
++*
++* Input:
++*      ha = adapter block pointer.
++*
++* Returns:
++*      0 = success
++*/
++uint8_t
++qla2x00_initialize_adapter(scsi_qla_host_t *ha)
++{
++	uint8_t	status;
++	uint8_t	isp_init = 0;
++	uint8_t	restart_risc = 0;
++	uint8_t	retry;
++	unsigned long	wait_device = 0;
++
++	ENTER(__func__);
++
++	/* Clear adapter flags. */
++	ha->forceLip = 0;
++	ha->flags.online = FALSE;
++	ha->flags.disable_host_adapter = FALSE;
++	ha->flags.reset_active = FALSE;
++	ha->flags.watchdog_enabled = FALSE;
++	atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME);
++	ha->loop_state = LOOP_DOWN;
++	ha->device_flags = 0;
++	ha->sns_retry_cnt = 0;
++	ha->device_flags = 0;
++	ha->dpc_flags = 0;
++	ha->sns_retry_cnt = 0;
++	ha->failback_delay = 0;
++#if defined(IOCB_THROLLE_USAGE)
++	ha->iocb_cnt = 0;
++	ha->iocb_overflow_cnt = 0;
++#endif
++	ha->flags.management_server_logged_in = 0;
++	ha->marker_needed = 0;
++	ha->mbx_flags = 0;
++	ha->isp_abort_cnt = 0;
++
++	if (!(status = qla2x00_pci_config(ha))) {
++
++		qla2x00_reset_chip(ha);
++
++		/* Initialize Fibre Channel database. */
++		qla2x00_init_fc_db(ha);
++
++		/* Initialize target map database. */
++		qla2x00_init_tgt_map(ha);
++
++		/* Get Flash Version */
++		qla2x00_get_flash_version(ha);
++
++		if (qla2x00_verbose)
++			printk("scsi(%ld): Configure NVRAM parameters...\n",
++				ha->host_no);
++
++		qla2x00_nvram_config(ha);
++
++		ha->retry_count = ql2xretrycount;
++
++		if (qla2x00_verbose)
++			printk("scsi(%ld): Verifying loaded RISC code...\n",
++				ha->host_no);
++
++		qla2x00_set_cache_line(ha);
++
++		/*
++		 * If the user specified a device configuration on the command
++		 * line then use it as the configuration.  Otherwise, we scan
++		 * for all devices.
++		 */
++		if (ql2xdevconf) {
++			ha->cmdline = ql2xdevconf;
++			if (!ha->flags.failover_enabled)
++				qla2x00_get_properties(ha, ql2xdevconf);
++		}
++
++		retry = 10;
++		/*
++		 * Try an configure the loop.
++		 */
++		do {
++			restart_risc = 0;
++			isp_init = 0;
++
++			/* If firmware needs to be loaded */
++			if (qla2x00_isp_firmware(ha)) {
++				if (qla2x00_verbose)
++					printk("scsi(%ld): Verifying chip...\n",
++						ha->host_no);
++
++				if (!(status = qla2x00_chip_diag(ha)))
++					status = qla2x00_setup_chip(ha);
++
++				if (!status) {
++					DEBUG(printk("scsi(%ld): Chip verified "
++							"and RISC loaded...\n",
++							ha->host_no));
++				}
++			}
++
++			/* Retrieve firmware information */
++			qla2x00_get_fw_version(ha, &ha->fw_major_version,
++			    &ha->fw_minor_version, &ha->fw_subminor_version,
++			    &ha->fw_attributes);
++
++			if (!status && !(status = qla2x00_init_rings(ha))) {
++				/* dg - 7/3/1999
++				 *
++				 * Wait for a successful LIP up to a maximum 
++				 * of (in seconds): RISC login timeout value,
++				 * RISC retry count value, and port down retry
++				 * value OR a minimum of 4 seconds OR If no 
++				 * cable, only 5 seconds.
++				 */
++				DEBUG(printk("scsi(%ld): Init rings OK..."
++				    "calling qla2x00_fw_ready()...\n",
++				    ha->host_no));
++
++				if (!qla2x00_fw_ready(ha)) {
++					clear_bit(RESET_MARKER_NEEDED,
++							&ha->dpc_flags);
++					clear_bit(COMMAND_WAIT_NEEDED,
++							&ha->dpc_flags);
++
++					/*
++					 * Go setup flash database devices 
++					 * with proper Loop ID's.
++					 */
++					do {
++						clear_bit(LOOP_RESYNC_NEEDED,
++								&ha->dpc_flags);
++						status = qla2x00_configure_loop(ha);
++
++						/*
++						 * Temp code: delay a while for certain
++						 * slower devices to become ready.
++						 */
++						for ((wait_device = jiffies + HZ);
++							!time_after_eq(jiffies,wait_device);) {
++							qla2x00_check_fabric_devices(ha);
++
++							set_current_state(TASK_INTERRUPTIBLE);
++							schedule_timeout(5);
++						}
++
++					} while (!atomic_read(&ha->loop_down_timer) &&
++						!(test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) &&
++						(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) );
++				}
++
++				if (ha->flags.update_config_needed) {
++					ha->init_cb->add_firmware_options[0] |=
++					    ((ha->operating_mode << 4) &
++						(BIT_6 | BIT_5 | BIT_4));
++
++					restart_risc = 1;
++				}
++
++				if (ha->mem_err) {
++					restart_risc = 1;
++				}
++				isp_init = 1;
++
++			}
++		} while (restart_risc && retry--);
++
++		if (isp_init) {
++			clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags);
++			ha->marker_needed = 1;
++			qla2x00_marker(ha, 0, 0, MK_SYNC_ALL);
++			ha->marker_needed = 0;
++
++			ha->flags.online = TRUE;
++		}
++
++	}
++
++#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3)
++	if (status)
++		printk("%s(): **** FAILED ****\n", __func__);
++#endif
++
++	LEAVE(__func__);
++
++	return (status);
++}
++
++/**
++ * qla2x00_isp_firmware() - Choose firmware image.
++ * @ha: HA context
++ *
++ * Returns 0 on success.
++ */
++static uint8_t
++qla2x00_isp_firmware(scsi_qla_host_t *ha)
++{
++	uint8_t  status;
++
++
++	ENTER(__func__);
++
++	/* Assume loading risc code */
++	status = 1; 
++
++	if (ha->flags.disable_risc_code_load) {
++		DEBUG2(printk("scsi(%ld): RISC CODE NOT loaded\n",
++		    ha->host_no));
++		printk(KERN_INFO
++		    "scsi(%ld): RISC CODE NOT loaded\n", ha->host_no);
++
++		/* Verify checksum of loaded RISC code. */
++		status = qla2x00_verify_checksum(ha);
++	}
++
++	if (status) {
++		DEBUG2_3(printk("scsi(%ld): **** Load RISC code ****\n",
++		    ha->host_no));
++	}
++
++	LEAVE(__func__);
++
++	return (status);
++}
++
++/**
++ * qla2x00_reset_chip() - Reset ISP chip.
++ * @ha: HA context
++ *
++ * Returns 0 on success.
++ */
++static void
++qla2x00_reset_chip(scsi_qla_host_t *ha) 
++{
++	unsigned long   flags = 0;
++	device_reg_t	*reg = ha->iobase;
++	uint32_t	cnt;
++	unsigned long	mbx_flags = 0;
++	uint16_t	cmd;
++
++	ENTER(__func__);
++
++	/* Disable ISP interrupts. */
++	qla2x00_disable_intrs(ha);
++
++	spin_lock_irqsave(&ha->hardware_lock, flags);
++
++	/* Turn off master enable */
++	cmd = 0;
++	pci_read_config_word(ha->pdev, PCI_COMMAND, &cmd);
++	cmd &= ~PCI_COMMAND_MASTER;
++	pci_write_config_word(ha->pdev, PCI_COMMAND, cmd);
++
++#if defined(ISP2200) || defined(ISP2300)
++	/* Pause RISC. */
++	WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);
++	if (ha->pdev->device == QLA2312_DEVICE_ID ||
++	    ha->pdev->device == QLA2322_DEVICE_ID) {
++		for (cnt = 0; cnt < 30000; cnt++) {
++			if ((RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) != 0)
++				break;
++			udelay(100);
++		}
++	} else {
++		udelay(10);
++	}
++
++	/* Select FPM registers. */
++	WRT_REG_WORD(&reg->ctrl_status, 0x20);
++
++	/* FPM Soft Reset. */
++	WRT_REG_WORD(&reg->fpm_diag_config, 0x100);
++
++#if defined(ISP2300)
++	/* Toggle Fpm Reset. */
++	WRT_REG_WORD(&reg->fpm_diag_config, 0x0);
++#endif
++
++	/* Select frame buffer registers. */
++	WRT_REG_WORD(&reg->ctrl_status, 0x10);
++
++	/* Reset frame buffer FIFOs. */
++#if defined(ISP2200)
++	WRT_REG_WORD(&reg->fb_cmd, 0xa000);
++#else
++	WRT_REG_WORD(&reg->fb_cmd, 0x00fc);
++
++	/* Read back fb_cmd until zero or 3 seconds max */
++	for (cnt = 0; cnt < 3000; cnt++) {
++		if ((RD_REG_WORD(&reg->fb_cmd) & 0xff) == 0)
++			break;
++		udelay(100);
++	}
++#endif /* defined(ISP2200) */
++
++	/* Select RISC module registers. */
++	WRT_REG_WORD(&reg->ctrl_status, 0);
++
++	/* Reset RISC processor. */
++	WRT_REG_WORD(&reg->hccr, HCCR_RESET_RISC);
++
++	/* Release RISC processor. */
++	WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);
++
++#endif /* defined(ISP2200) || defined(ISP2300) */
++
++	WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
++	WRT_REG_WORD(&reg->hccr, HCCR_CLR_HOST_INT);
++
++	/* Reset ISP chip. */
++	WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
++
++	/* Wait for RISC to recover from reset. */
++	if (ha->pdev->device == QLA2312_DEVICE_ID ||
++	    ha->pdev->device == QLA2322_DEVICE_ID) {
++		udelay(10);
++	} else {
++		for (cnt = 30000; cnt; cnt--) {
++			if ((RD_REG_WORD(&reg->ctrl_status) &
++			    CSR_ISP_SOFT_RESET) == 0)
++				break;
++			udelay(100);
++		}
++	}
++
++	/* Reset RISC processor. */
++	WRT_REG_WORD(&reg->hccr, HCCR_RESET_RISC);
++
++	WRT_REG_WORD(&reg->semaphore, 0);
++
++	/* Release RISC processor. */
++	WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);
++
++	if (ha->pdev->device == QLA2312_DEVICE_ID ||
++	    ha->pdev->device == QLA2322_DEVICE_ID) {
++		udelay(100);
++	} else {
++		for (cnt = 0; cnt < 30000; cnt++) {
++			if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)))
++				QLA_MBX_REG_LOCK(ha);
++
++			if (RD_REG_WORD(&reg->mailbox0) != MBS_BUSY) {
++				if (!(test_bit(ABORT_ISP_ACTIVE,
++				    &ha->dpc_flags)))
++					QLA_MBX_REG_UNLOCK(ha);
++				break;
++			}
++
++			if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)))
++				QLA_MBX_REG_UNLOCK(ha);
++
++			udelay(100);
++		}
++	}
++
++	/* Turn on master enable */
++	cmd |= PCI_COMMAND_MASTER;
++	pci_write_config_word(ha->pdev, PCI_COMMAND, cmd);
++
++#if defined(ISP2200) || defined(ISP2300)
++	/* Disable RISC pause on FPM parity error. */
++	WRT_REG_WORD(&reg->hccr, HCCR_DISABLE_PARITY_PAUSE);
++#endif
++
++	/* Save PCI information. */
++	ha->isp_ctrl_status = RD_REG_WORD(&reg->ctrl_status);
++
++	spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++	LEAVE(__func__);
++}
++
++/**
++ * qla2x00_pci_config() - Setup device PCI configuration registers.
++ * @ha: HA context
++ *
++ * Returns 0 on success.
++ */
++static uint8_t
++qla2x00_pci_config(scsi_qla_host_t *ha)
++{
++	uint8_t		status;
++	uint16_t	w;
++#if defined(ISP2300)
++	uint32_t	cnt;
++	unsigned long   flags = 0;
++#endif
++#if MEMORY_MAPPED_IO
++	uint32_t	mmapbase;
++	uint32_t	page_offset, base;
++#endif
++
++	ENTER(__func__);
++
++	if (qla2x00_verbose)
++		printk("scsi(%ld): Configuring PCI space...\n",
++			ha->host_no);
++
++	/* 
++	 * Turn on PCI master; for system BIOSes that don't turn it on by
++	 * default.
++	 */
++	pci_set_master(ha->pdev);
++	pci_read_config_word(ha->pdev, PCI_REVISION_ID, &ha->revision);
++
++	if (ha->iobase)
++		return 0;
++
++	/*
++	 * We want to respect framework's setting of PCI configuration space
++	 * command register and also want to make sure that all bits of
++	 * interest to us are properly set in command register.
++	 */
++	pci_read_config_word(ha->pdev, PCI_COMMAND, &w);
++	w |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | 
++	    PCI_COMMAND_INVALIDATE | PCI_COMMAND_PARITY | PCI_COMMAND_SERR);
++
++#if MEMORY_MAPPED_IO
++	DEBUG(printk("scsi(%ld): I/O SPACE and MEMORY MAPPED I/O enabled.\n",
++	    ha->host_no));
++#else
++	DEBUG(printk("scsi(%ld): I/O SPACE enabled and MEMORY MAPPED I/O "
++	    "disabled.\n", ha->host_no));
++
++	w &= ~PCI_COMMAND_MEMORY;
++#endif
++
++#if defined(ISP2300)
++	/* PCI Specification Revision 2.3 changes */
++	if (ha->pdev->device == QLA2322_DEVICE_ID) {
++		/* Command Register -- Reset Interrupt Disable -- BIT_10 */
++		w &= ~BIT_10;
++	}
++
++	/*
++	 * If this is a 2300 card and not 2312, reset the COMMAND_INVALIDATE
++	 * due to a bug in the 2300. Unfortunately, the 2310 also reports
++	 * itself as a 2300 so we need to get the fb revision level -- a 6
++	 * indicates it really is a 2300 and not a 2310.
++	 */
++	if (ha->pdev->device == QLA2300_DEVICE_ID) {
++		spin_lock_irqsave(&ha->hardware_lock, flags);
++
++		/* Pause RISC. */
++		WRT_REG_WORD(&ha->iobase->hccr, HCCR_PAUSE_RISC);
++		for (cnt = 0; cnt < 30000; cnt++) {
++			if ((RD_REG_WORD(&ha->iobase->hccr) &
++			    HCCR_RISC_PAUSE) != 0)
++				break;
++
++			udelay(10);
++		}
++
++		/* Select FPM registers. */
++		WRT_REG_WORD(&ha->iobase->ctrl_status, 0x20);
++
++		/* Get the fb rev level */
++		if (RD_REG_WORD(&ha->iobase->fb_cmd) == FPM_2300)
++			w &= ~PCI_COMMAND_INVALIDATE;
++
++		/* Deselect FPM registers. */
++		WRT_REG_WORD(&ha->iobase->ctrl_status, 0x0);
++
++		/* Release RISC module. */
++		WRT_REG_WORD(&ha->iobase->hccr, HCCR_RELEASE_RISC);
++		for (cnt = 0; cnt < 30000; cnt++) {
++			if ((RD_REG_WORD(&ha->iobase->hccr) &
++			    HCCR_RISC_PAUSE) == 0)
++				break;
++
++			udelay(10);
++		}
++
++		spin_unlock_irqrestore(&ha->hardware_lock, flags);
++	}
++#endif
++
++	pci_write_config_word(ha->pdev, PCI_COMMAND, w);
++
++	/* Reset expansion ROM address decode enable */
++	pci_read_config_word(ha->pdev, PCI_ROM_ADDRESS, &w);
++	w &= ~PCI_ROM_ADDRESS_ENABLE;
++	pci_write_config_word(ha->pdev, PCI_ROM_ADDRESS, w);
++
++	status = 0;
++#if MEMORY_MAPPED_IO
++	/* Get memory mapped I/O address */
++	pci_read_config_dword(ha->pdev, PCI_BASE_ADDRESS_1, &mmapbase);
++	mmapbase &= PCI_BASE_ADDRESS_MEM_MASK;
++
++	/* Find proper memory chunk for memory map I/O reg */
++	base = mmapbase & PAGE_MASK;
++	page_offset = mmapbase - base;
++
++	/* Get virtual address for I/O registers  */
++	ha->mmpbase = ioremap(base, page_offset + 256);
++	if (ha->mmpbase) {
++		ha->mmpbase += page_offset;
++		ha->iobase = ha->mmpbase;
++		status = 0;
++	}
++#endif
++
++	LEAVE(__func__);
++
++	return (status);
++}
++
++/**
++ * qla2x00_set_cache_line() - Sets PCI cache line parameter.
++ * @ha: HA context
++ *
++ * Returns 0 on success.
++ */
++static uint8_t
++qla2x00_set_cache_line(struct scsi_qla_host * ha)
++{
++	unsigned char cache_size;
++
++	ENTER(__func__);
++
++	/* Set the cache line. */
++	if (!ha->flags.set_cache_line_size_1) {
++		LEAVE(__func__);
++
++		return (0);
++	}
++
++	/* Taken from drivers/net/acenic.c */
++	pci_read_config_byte(ha->pdev, PCI_CACHE_LINE_SIZE, &cache_size);
++	cache_size <<= 2;
++	if (cache_size != SMP_CACHE_BYTES) {
++		printk(KERN_INFO
++		    "scsi(%ld): PCI cache line size set incorrectly "
++		    "(%d bytes) by BIOS/FW, ",
++		    ha->host_no, cache_size);
++
++		if (cache_size > SMP_CACHE_BYTES) {
++			printk(KERN_INFO "expecting %d.\n", SMP_CACHE_BYTES);
++		} else {
++			printk(KERN_INFO
++			    "correcting to %d.\n", SMP_CACHE_BYTES);
++			pci_write_config_byte(ha->pdev,
++			    PCI_CACHE_LINE_SIZE, SMP_CACHE_BYTES >> 2);
++		}
++	}
++
++	LEAVE(__func__);
++
++	return (0);
++}
++
++/**
++ * qla2x00_chip_diag() - Test chip for proper operation.
++ * @ha: HA context
++ *
++ * Returns 0 on success.
++ */
++static uint8_t
++qla2x00_chip_diag(scsi_qla_host_t *ha)
++{
++	uint8_t		status;
++	device_reg_t	*reg = ha->iobase;
++	unsigned long	flags = 0;
++	uint16_t	data;
++	uint32_t	cnt;
++	uint16_t	mb[5];
++
++	ENTER(__func__);
++
++	/* Assume a failed state */
++	status = 1;
++
++	DEBUG3(printk("scsi(%ld): Testing device at %lx.\n",
++	    ha->host_no, (u_long)&reg->flash_address));
++
++	spin_lock_irqsave(&ha->hardware_lock, flags);
++
++	/* Reset ISP chip. */
++	WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
++	data = qla2x00_debounce_register(&reg->ctrl_status);
++	for (cnt = 6000000 ; cnt && (data & CSR_ISP_SOFT_RESET); cnt--) {
++		udelay(5);
++		data = RD_REG_WORD(&reg->ctrl_status);
++		barrier();
++	}
++
++	if (!cnt)
++		goto chip_diag_failed;
++
++	DEBUG3(printk("scsi(%ld): Reset register cleared by chip reset\n",
++	    ha->host_no));
++
++	/* Reset RISC processor. */
++	WRT_REG_WORD(&reg->hccr, HCCR_RESET_RISC);
++	WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);
++
++#if defined(ISP2300)
++	/* Workaround for QLA2312 PCI parity error */
++	if (ha->pdev->device == QLA2312_DEVICE_ID ||
++	    ha->pdev->device == QLA2322_DEVICE_ID) {
++		udelay(10);
++	} else {
++		data = qla2x00_debounce_register(&reg->mailbox0);
++		for (cnt = 6000000; cnt && (data == MBS_BUSY); cnt--) {
++			udelay(5);
++			data = RD_REG_WORD(&reg->mailbox0);
++			barrier(); 
++		}
++	}
++#else
++	data = qla2x00_debounce_register(&reg->mailbox0);
++	for (cnt = 6000000; cnt && (data == MBS_BUSY); cnt--) {
++		udelay(5);
++		data = RD_REG_WORD(&reg->mailbox0);
++		barrier(); 
++	}
++#endif
++	if (!cnt)
++		goto chip_diag_failed;
++
++	/* Check product ID of chip */
++	DEBUG3(printk("scsi(%ld): Checking product ID of chip\n",
++	    ha->host_no));
++
++	mb[1] = RD_REG_WORD(&reg->mailbox1);
++	mb[2] = RD_REG_WORD(&reg->mailbox2);
++	mb[3] = RD_REG_WORD(&reg->mailbox3);
++	mb[4] = qla2x00_debounce_register(&reg->mailbox4);
++
++	if (mb[1] != PROD_ID_1 ||
++	    (mb[2] != PROD_ID_2 && mb[2] != PROD_ID_2a) ||
++	    mb[3] != PROD_ID_3 ||
++	    (mb[4] != PROD_ID_4 && mb[4] != PROD_ID_4a)) {
++
++		printk(KERN_WARNING
++		    "scsi(%ld): Wrong product ID = 0x%x,0x%x,0x%x,0x%x\n",
++		    ha->host_no, mb[1], mb[2], mb[3], mb[4]);
++
++		goto chip_diag_failed;
++	}
++
++	/* Adjust fw RISC transfer size */
++	ha->fw_transfer_size = REQUEST_ENTRY_SIZE * REQUEST_ENTRY_CNT;
++#if defined(ISP2200)
++	if (ha->pdev->device == QLA2200_DEVICE_ID &&
++	    RD_REG_WORD(&reg->mailbox7) == QLA2200A_RISC_ROM_VER) {
++
++		/* Limit firmware transfer size with a 2200A */
++		DEBUG3(printk("scsi(%ld): Found QLA2200A chip.\n",
++		    ha->host_no));
++
++		ha->fw_transfer_size = 128;
++	}
++#endif
++
++	/* Wrap Incoming Mailboxes Test. */
++	spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++	DEBUG3(printk("scsi(%ld): Checking mailboxes.\n", ha->host_no));
++	status = qla2x00_mbx_reg_test(ha);
++	if (status) {
++		DEBUG(printk("scsi(%ld): Failed mailbox send register test\n",
++		    ha->host_no));
++		printk(KERN_WARNING
++		    "scsi(%ld): Failed mailbox send register test\n",
++		    ha->host_no);
++	}
++	else {
++		/* Flag a successful status */
++		status = 0;
++	}
++	spin_lock_irqsave(&ha->hardware_lock, flags);
++
++chip_diag_failed:
++	if (status)
++		DEBUG2_3(printk("scsi(%ld): Chip diagnostics **** FAILED "
++		    "****\n", ha->host_no));
++
++	spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++	LEAVE(__func__);
++
++	return (status);
++}
++
++/**
++ * qla2x00_setup_chip() - Load and start RISC firmware.
++ * @ha: HA context
++ *
++ * Returns 0 on success.
++ */
++static uint8_t
++qla2x00_setup_chip(scsi_qla_host_t *ha)
++{
++	uint8_t		status = 0;
++	uint16_t	cnt;
++	uint16_t	*risc_code;
++	unsigned long	risc_address;
++	unsigned long	risc_code_size;
++	int		num;
++	int		i;
++	uint16_t	*req_ring;
++	struct qla_fw_info	*fw_iter;
++
++	ENTER(__func__);
++
++	/* Load firmware sequences */
++	fw_iter = ha->brd_info->fwinfo;
++	while (fw_iter->addressing != FW_INFO_ADDR_NOMORE) {
++		risc_code = fw_iter->fwcode;
++		risc_code_size = *fw_iter->fwlen;
++
++		if (fw_iter->addressing == FW_INFO_ADDR_NORMAL) {
++			risc_address = *fw_iter->fwstart;
++		} else {
++			/* Extended address */
++			risc_address = *fw_iter->lfwstart;
++		}
++
++		num = 0;
++		status = 0;
++		while (risc_code_size > 0 && !status) {
++			cnt = (uint16_t)(ha->fw_transfer_size >> 1);
++			if (cnt > risc_code_size)
++				cnt = risc_code_size;
++
++			DEBUG7(printk("scsi(%ld): Loading risc segment@ "
++			    "addr %p, number of bytes 0x%x, offset 0x%lx.\n",
++			    ha->host_no, risc_code, cnt, risc_address));
++
++			req_ring = (uint16_t *)ha->request_ring;
++			for (i = 0; i < cnt; i++)
++				req_ring[i] = cpu_to_le16(risc_code[i]);
++
++			/*
++			 * Flush written firmware to the ha->request_ring buffer
++			 * before DMA.
++			 */
++			flush_cache_all();
++
++			if (fw_iter->addressing == FW_INFO_ADDR_NORMAL) {
++				status = qla2x00_load_ram(ha,
++				    ha->request_dma, risc_address, cnt);
++			} else {
++				status = qla2x00_load_ram_ext(ha,
++				    ha->request_dma, risc_address, cnt);
++			}
++			if (status) {
++				DEBUG(printk("scsi(%ld): [ERROR] Failed to "
++				    "load segment %d of firmware\n",
++				    ha->host_no, num));
++				printk(KERN_WARNING
++				    "scsi(%ld): [ERROR] Failed to load "
++				    "segment %d of firmware\n",
++				    ha->host_no, num);
++
++				qla2x00_dump_regs(ha->host);
++				break;
++			}
++
++			risc_code += cnt;
++			risc_address += cnt;
++			risc_code_size -= cnt;
++			num++;
++		}
++
++		/* Next firmware sequence */
++		fw_iter++;
++	}
++
++	/* Verify checksum of loaded RISC code. */
++	if (!status) {
++		DEBUG(printk("scsi(%ld): Verifying Checksum of loaded RISC "
++		    "code.\n", ha->host_no));
++
++		status = qla2x00_verify_checksum(ha);
++		if (status == QL_STATUS_SUCCESS) {
++			/* Start firmware execution. */
++			DEBUG(printk("scsi(%ld): Checksum OK, start "
++			    "firmware.\n", ha->host_no));
++
++			status = qla2x00_execute_fw(ha);
++		}
++		else {
++			DEBUG2(printk(KERN_INFO
++			    "scsi(%ld): ISP Firmware failed checksum.\n",
++			    ha->host_no));
++		}
++	}
++
++	if (status) {
++		DEBUG2_3(printk("scsi(%ld): Setup chip **** FAILED ****.\n",
++		    ha->host_no));
++	}
++
++	return (status);
++}
++
++/**
++ * qla2x00_init_rings() - Initializes firmware.
++ * @ha: HA context
++ *
++ * Beginning of request ring has initialization control block already built
++ * by nvram config routine.
++ *
++ * Returns 0 on success.
++ */
++static uint8_t
++qla2x00_init_rings(scsi_qla_host_t *ha)
++{
++	unsigned long flags = 0;
++	uint8_t  status;
++	int cnt;
++	device_reg_t *reg = ha->iobase;
++
++
++	spin_lock_irqsave(&ha->hardware_lock, flags);
++
++	/* Clear outstanding commands array. */
++	for (cnt = 0; cnt < MAX_OUTSTANDING_COMMANDS; cnt++)
++		ha->outstanding_cmds[cnt] = 0;
++
++	ha->current_outstanding_cmd = 0;
++
++	/* Clear RSCN queue. */
++	ha->rscn_in_ptr = 0;
++	ha->rscn_out_ptr = 0;
++
++	/* Initialize firmware. */
++	ha->request_ring_ptr  = ha->request_ring;
++	ha->req_ring_index    = 0;
++	ha->req_q_cnt         = REQUEST_ENTRY_CNT;
++	ha->response_ring_ptr = ha->response_ring;
++	ha->rsp_ring_index    = 0;
++
++	WRT_REG_WORD(ISP_REQ_Q_IN(reg), 0);
++	WRT_REG_WORD(ISP_REQ_Q_OUT(reg), 0);
++	WRT_REG_WORD(ISP_RSP_Q_IN(reg), 0);
++	WRT_REG_WORD(ISP_RSP_Q_OUT(reg), 0);
++
++	spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++	DEBUG(printk("scsi(%ld): Issue init firmware.\n", ha->host_no));
++	status = qla2x00_init_firmware(ha, sizeof(init_cb_t));
++	if (status) {
++		DEBUG2_3(printk("scsi(%ld): Init firmware **** FAILED ****.\n",
++		    ha->host_no));
++	} else {
++		/* Setup seriallink options */
++		uint16_t swing, emphasis;
++		uint16_t opt10, opt11;
++
++		DEBUG3(printk("scsi(%ld): Serial link options:\n",
++		    ha->host_no));
++		DEBUG3(qla2x00_dump_buffer(
++		    (uint8_t *)&ha->fw_seriallink_options,
++		    sizeof(ha->fw_seriallink_options)));
++
++		qla2x00_get_fw_options(ha,
++		    &ha->fw_options1, &ha->fw_options2, &ha->fw_options3);
++
++		ha->fw_options1 &= ~BIT_8;
++		if (ha->fw_seriallink_options[1] & BIT_2)
++			ha->fw_options1 |= BIT_8;
++
++		/* 1G settings */
++		swing = ha->fw_seriallink_options[0] & (BIT_2 | BIT_1 | BIT_0);
++		emphasis = ha->fw_seriallink_options[0] & (BIT_4 | BIT_3);
++		emphasis >>= 3;
++		opt10 = (emphasis << 14) | (swing << 8) | 0x3;
++
++		/* 2G settings */
++		swing = ha->fw_seriallink_options[0] & (BIT_7 | BIT_6 | BIT_5);
++		swing >>= 5;
++		emphasis = ha->fw_seriallink_options[1] & (BIT_1 | BIT_0);
++		opt11 = (emphasis << 14) | (swing << 8) | 0x3;
++
++		qla2x00_set_fw_options(ha, ha->fw_options1,
++		    ha->fw_options2, ha->fw_options3, opt10, opt11);
++
++		DEBUG3(printk("scsi(%ld): Init firmware -- success.\n",
++		    ha->host_no));
++	}
++
++	return (status);
++}
++
++/**
++ * qla2x00_fw_ready() - Waits for firmware ready.
++ * @ha: HA context
++ *
++ * Returns 0 on success.
++ */
++static uint8_t
++qla2x00_fw_ready(scsi_qla_host_t *ha)
++{
++	uint8_t		status = 0;
++	unsigned long	wtime, mtime;
++	uint16_t	min_wait;	/* Minimum wait time if loop is down */
++	uint16_t	wait_time;	/* Wait time if loop is coming ready */
++	uint16_t	pause_time;
++	uint16_t	fw_state;
++
++	/* 20 seconds for loop down. */
++	min_wait = 20;		
++	ha->device_flags &= ~DFLG_NO_CABLE;
++
++	/*
++	 * Firmware should take at most one RATOV to login, plus 5 seconds for
++	 * our own processing.
++	 */
++	if ((wait_time = (ha->retry_count*ha->login_timeout) + 5) < min_wait) {
++		wait_time = min_wait;
++	}
++
++	pause_time = 1000;	/* 1000 usec */
++
++	/* Min wait time if loop down */
++	mtime = jiffies + (min_wait * HZ);
++
++	/* wait time before firmware ready */
++	wtime = jiffies + (wait_time * HZ);
++
++	/* Wait for ISP to finish LIP */
++	if (!qla2x00_quiet)
++		printk(KERN_INFO
++		    "scsi(%ld): Waiting for LIP to complete...\n", ha->host_no);
++
++	DEBUG3(printk("scsi(%ld): Waiting for LIP to complete...\n",
++	    ha->host_no));
++
++	do {
++		status = qla2x00_get_firmware_state(ha, &fw_state);
++
++		if (status == QL_STATUS_SUCCESS) {
++			if (fw_state == FSTATE_READY) {
++				DEBUG(printk("scsi(%ld): F/W Ready - OK \n",
++				    ha->host_no));
++
++				qla2x00_get_retry_cnt(ha,
++				    &ha->retry_count, &ha->login_timeout);
++
++				status = QL_STATUS_SUCCESS;
++				break;
++			}
++
++			status = QL_STATUS_ERROR;
++
++			if (atomic_read(&ha->loop_down_timer) ||
++			    fw_state == FSTATE_LOSS_OF_SYNC) {
++
++				/* Loop down. Timeout on min_wait */
++				if (time_after_eq(jiffies, mtime)) {
++					printk(KERN_INFO
++					    "scsi(%ld): Cable is "
++					    "unplugged...\n",
++					    ha->host_no);
++
++					ha->device_flags |= DFLG_NO_CABLE;
++					break;
++				}
++			}
++		} else {
++			/* Mailbox cmd failed. Timeout on min_wait. */
++			if (time_after_eq(jiffies, mtime))
++				break;
++		}
++
++		if (time_after_eq(jiffies, wtime))
++			break;
++
++		/* Delay for a while */
++		set_current_state(TASK_INTERRUPTIBLE);
++		schedule_timeout(HZ / 2);
++
++		DEBUG3(printk("scsi(%ld): fw_state=%x curr time=%lx.\n",
++		    ha->host_no, fw_state, jiffies));
++	} while (1);
++
++	DEBUG(printk("scsi(%ld): fw_state=%x curr time=%lx.\n",
++	    ha->host_no, fw_state, jiffies));
++
++	if (status) {
++		DEBUG2_3(printk("scsi(%ld): Firmware ready **** FAILED ****.\n",
++		    ha->host_no));
++	}
++
++	return (status);
++}
++
++/*
++*  qla2x00_configure_hba
++*      Setup adapter context.
++*
++* Input:
++*      ha = adapter state pointer.
++*
++* Returns:
++*      0 = success
++*
++* Context:
++*      Kernel context.
++*/
++static uint8_t
++qla2x00_configure_hba(scsi_qla_host_t *ha)
++{
++	uint8_t       rval;
++	uint16_t      loop_id;
++	uint16_t      topo;
++	uint8_t       al_pa;
++	uint8_t       area;
++	uint8_t       domain;
++	char		connect_type[22];
++
++	ENTER(__func__);
++
++	/* Get host addresses. */
++	rval = qla2x00_get_adapter_id(ha,
++	    &loop_id, &al_pa, &area, &domain, &topo);
++	if (rval != QL_STATUS_SUCCESS) {
++		printk(KERN_WARNING
++		    "scsi(%ld): ERROR -- Unable to get host loop ID.\n",
++		    ha->host_no);
++		return (rval);
++	}
++
++	if (topo == 4) {
++		printk(KERN_INFO
++			"scsi(%ld): Cannot get topology - retrying.\n",
++			ha->host_no);
++		return (QL_STATUS_ERROR);
++	}
++
++	ha->loop_id = loop_id;
++
++#if defined(ISP2100)
++	/* Make sure 2100 only has loop, in case of any firmware bug. */
++	topo = 0;
++#endif
++
++	/* initialize */
++	ha->min_external_loopid = SNS_FIRST_LOOP_ID;
++	ha->operating_mode = LOOP;
++
++	switch (topo) {
++	case 0:
++		DEBUG3(printk("scsi(%ld): HBA in NL topology.\n",
++		    ha->host_no));
++		ha->current_topology = ISP_CFG_NL;
++		strcpy(connect_type, "(Loop)");
++		break;
++
++	case 1:
++		DEBUG3(printk("scsi(%ld): HBA in FL topology.\n",
++		    ha->host_no));
++		ha->current_topology = ISP_CFG_FL;
++		strcpy(connect_type, "(FL_Port)");
++		break;
++
++	case 2:
++		DEBUG3(printk("scsi(%ld): HBA in N P2P topology.\n",
++		    ha->host_no));
++		ha->operating_mode = P2P;
++		ha->current_topology = ISP_CFG_N;
++		strcpy(connect_type, "(N_Port-to-N_Port)");
++		break;
++
++	case 3:
++		DEBUG3(printk("scsi(%ld): HBA in F P2P topology.\n",
++		    ha->host_no));
++		ha->operating_mode = P2P;
++		ha->current_topology = ISP_CFG_F;
++		strcpy(connect_type, "(F_Port)");
++		break;
++
++	default:
++		DEBUG3(printk("scsi(%ld): HBA in unknown topology %x. "
++		    "Using NL.\n",
++		    ha->host_no, topo));
++		ha->current_topology = ISP_CFG_NL;
++		strcpy(connect_type, "(Loop)");
++		break;
++	}
++
++	/* Save Host port and loop ID. */
++	/* byte order - Big Endian */
++	ha->d_id.b.domain = domain;
++	ha->d_id.b.area = area;
++	ha->d_id.b.al_pa = al_pa;
++
++	if (!qla2x00_quiet)
++		printk(KERN_INFO
++		    "scsi(%ld): Topology - %s, Host Loop address 0x%x\n",
++		    ha->host_no, connect_type, ha->loop_id);
++
++	if (rval) {
++		DEBUG2_3(printk("scsi(%ld): FAILED.\n", ha->host_no));
++	} else {
++		DEBUG3(printk("scsi(%ld): exiting normally.\n", ha->host_no));
++	}
++
++	return(rval);
++}
++
++/*
++* NVRAM configuration for ISP 2xxx
++*
++* Input:
++*      ha                = adapter block pointer.
++*
++* Output:
++*      initialization control block in response_ring
++*      host adapters parameters in host adapter block
++*
++* Returns:
++*      0 = success.
++*/
++static uint8_t
++qla2x00_nvram_config(scsi_qla_host_t *ha)
++{
++	uint8_t   status = 0;
++	uint8_t   chksum = 0;
++	uint16_t  cnt, base;
++	uint8_t   *dptr1, *dptr2;
++	init_cb_t *icb   = ha->init_cb;
++	nvram_t *nv    = (nvram_t *)ha->request_ring;
++	uint16_t  *wptr  = (uint16_t *)ha->request_ring;
++#if defined(ISP2300)
++	device_reg_t *reg = ha->iobase;
++	uint16_t  data;
++#endif
++
++	if (ha->flags.nvram_config_done)
++		return (status);
++
++	ENTER(__func__);
++ 
++	/* Determine NVRAM starting address. */
++	base = 0;
++#if defined(ISP2300)
++	if (ha->pdev->device == QLA2312_DEVICE_ID ||
++	    ha->pdev->device == QLA2322_DEVICE_ID) {
++		data = RD_REG_WORD(&reg->ctrl_status);
++		if ((data >> 14) == 1)
++			base = 0x80;
++
++		data = RD_REG_WORD(&reg->nvram);
++		while (data & NVR_BUSY) {
++			udelay(100);
++			data = RD_REG_WORD(&reg->nvram);
++		}
++
++		/* Lock resource */
++		WRT_REG_WORD(&reg->host_semaphore, 0x1);
++		udelay(5);
++		data = RD_REG_WORD(&reg->host_semaphore);
++		while ((data & BIT_0) == 0) {
++			/* Lock failed */
++			udelay(100);
++			WRT_REG_WORD(&reg->host_semaphore, 0x1);
++			udelay(5);
++			data = RD_REG_WORD(&reg->host_semaphore);
++		}
++	}
++#endif
++
++	/* Get NVRAM data and calculate checksum. */
++	for (cnt = 0; cnt < sizeof(nvram_t)/2; cnt++) {
++		*wptr = cpu_to_le16(qla2x00_get_nvram_word(ha, (cnt+base)));
++		chksum += (uint8_t)*wptr;
++		chksum += (uint8_t)(*wptr >> 8);
++		wptr++;
++	}
++
++#if defined(ISP2300)
++	if (ha->pdev->device == QLA2312_DEVICE_ID ||
++	    ha->pdev->device == QLA2322_DEVICE_ID) {
++		/* Unlock resource */
++		WRT_REG_WORD(&reg->host_semaphore, 0);
++	}
++#endif
++
++	DEBUG5(printk("scsi(%ld): Contents of NVRAM\n", ha->host_no));
++	DEBUG5(qla2x00_dump_buffer(
++	    (uint8_t *)ha->request_ring, sizeof(nvram_t)));
++
++	/* Bad NVRAM data, set defaults parameters. */
++	if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' ||
++	    nv->id[2] != 'P' || nv->id[3] != ' ' || nv->nvram_version < 1) {
++
++		/* Reset NVRAM data. */
++		DEBUG(printk("scsi(%ld): Using defaults for NVRAM - "
++		    "checksum=0x%x, Id=%c, version=0x%x\n",
++		    ha->host_no,
++		    chksum, nv->id[0], nv->nvram_version));
++
++		memset(nv, 0, sizeof(nvram_t));
++
++		/*
++		 * Set default initialization control block.
++		 */
++		nv->parameter_block_version = ICB_VERSION;
++
++#if defined(ISP2300)
++		nv->firmware_options[0] = BIT_2 | BIT_1;
++		nv->firmware_options[1] = BIT_7 | BIT_5;
++		nv->add_firmware_options[0] = BIT_5;
++		nv->add_firmware_options[1] = BIT_5 | BIT_4;
++		nv->frame_payload_size  = __constant_cpu_to_le16(2048);
++#elif defined(ISP2200)
++		nv->firmware_options[0] = BIT_3 | BIT_2 | BIT_1;
++		nv->firmware_options[1] = BIT_7 | BIT_5;
++		nv->add_firmware_options[0] = BIT_5 | BIT_4;
++		nv->add_firmware_options[1] = BIT_5 | BIT_4;
++		nv->frame_payload_size  = __constant_cpu_to_le16(1024);
++#else /* defined(ISP2100) */
++		nv->firmware_options[0] = BIT_3 | BIT_1;
++		nv->firmware_options[1] = BIT_5;
++		nv->frame_payload_size  = __constant_cpu_to_le16(1024);
++#endif
++
++		nv->max_iocb_allocation = __constant_cpu_to_le16(256);
++		nv->execution_throttle  = __constant_cpu_to_le16(16);
++		nv->retry_count = 8;
++		nv->retry_delay = 1;
++
++		nv->port_name[0] = 33;
++		nv->port_name[3] = 224;
++		nv->port_name[4] = 139;
++
++		nv->login_timeout = 4;
++
++		/*
++		 * Set default host adapter parameters
++		 */
++		nv->host_p[1] = BIT_2;
++		nv->reset_delay = 5;
++		nv->port_down_retry_count = 8;
++		nv->max_luns_per_target = __constant_cpu_to_le16(8);
++
++		status = 1;
++	}
++
++	/* Reset Initialization control block */
++	memset(icb, 0, sizeof(init_cb_t));
++
++	/*
++	 * Setup driver NVRAM options.
++	 */
++	nv->firmware_options[0] |= (BIT_6 | BIT_1);
++	nv->firmware_options[0] &= ~(BIT_5 | BIT_4);
++	nv->firmware_options[1] |= (BIT_5 | BIT_0);
++	nv->firmware_options[1] &= ~BIT_4;
++#if defined(ISP2300)
++	nv->firmware_options[0] |= BIT_2;
++	nv->firmware_options[0] &= ~BIT_3;
++#elif defined(ISP2200)
++	nv->firmware_options[0] |= BIT_2;
++#endif
++
++#if !defined(FC_IP_SUPPORT)
++	/* Enable FC-Tape support */
++	nv->firmware_options[1] |= BIT_7;
++	nv->add_firmware_options[1] |= (BIT_5 | BIT_4);
++#endif
++
++	/*
++	 * Copy over NVRAM RISC parameter block to initialization control block.
++	 */
++	dptr1 = (uint8_t *)icb;
++	dptr2 = (uint8_t *)&nv->parameter_block_version;
++	cnt = (uint8_t *)&icb->request_q_outpointer - (uint8_t *)&icb->version;
++	while (cnt--)
++		*dptr1++ = *dptr2++;
++
++	/* Copy 2nd half. */
++	dptr1 = (uint8_t *)icb->add_firmware_options;
++	cnt = (uint8_t *)icb->reserved_3 - (uint8_t *)icb->add_firmware_options;
++	while (cnt--)
++		*dptr1++ = *dptr2++;
++
++	/* Prepare nodename */
++	if ((icb->firmware_options[1] & BIT_6) == 0) {
++		/*
++		 * Firmware will apply the following mask if the nodename was
++		 * not provided.
++		 */
++		memcpy(icb->node_name, icb->port_name, WWN_SIZE);
++		icb->node_name[0] &= 0xF0;
++	}
++
++	/*
++	 * Set host adapter parameters.
++	 */
++	ha->nvram_version = nv->nvram_version;
++
++	ha->flags.disable_luns = ((nv->host_p[0] & BIT_2) ? 1 : 0);
++	ha->flags.disable_risc_code_load = ((nv->host_p[0] & BIT_4) ? 1 : 0);
++	ha->flags.set_cache_line_size_1 = ((nv->host_p[0] & BIT_5) ? 1 : 0);
++	ha->flags.enable_64bit_addressing = ((nv->host_p[1] & BIT_0) ? 1 : 0);
++	ha->flags.enable_lip_reset = ((nv->host_p[1] & BIT_1) ? 1 : 0);
++	ha->flags.enable_lip_full_login = ((nv->host_p[1] & BIT_2) ? 1 : 0);
++	ha->flags.enable_target_reset = ((nv->host_p[1] & BIT_3) ? 1 : 0);
++	ha->flags.enable_flash_db_update = ((nv->host_p[1] & BIT_4) ? 1 : 0);
++
++	ha->flags.link_down_error_enable  = 1;
++
++	ha->flags.enable_target_mode =
++	    ((icb->firmware_options[0] & BIT_4) ? 1 : 0);
++	ha->operating_mode =
++	    (icb->add_firmware_options[0] & (BIT_6 | BIT_5 | BIT_4)) >> 4;
++
++	qla2x00_config_dma_addressing(ha);
++
++	ha->fw_seriallink_options[0] = nv->seriallink_options[0];
++	ha->fw_seriallink_options[1] = nv->seriallink_options[1];
++
++	/* save HBA serial number */
++	ha->serial0 = icb->port_name[5];
++	ha->serial1 = icb->port_name[6];
++	ha->serial2 = icb->port_name[7];
++	memcpy(ha->node_name, icb->node_name, WWN_SIZE);
++#if defined(FC_IP_SUPPORT)
++	memcpy(ha->ip_port_name, icb->port_name, WWN_SIZE);
++#endif
++
++	ha->hiwat = le16_to_cpu(icb->max_iocb_allocation);
++	ha->execution_throttle = 0xFFFF;
++	icb->execution_throttle = __constant_cpu_to_le16(0xFFFF);
++
++	ha->retry_count = nv->retry_count;
++
++	/* Set minimum login_timeout to 4 seconds. */
++	if (nv->login_timeout < ql2xlogintimeout)
++		nv->login_timeout = ql2xlogintimeout;
++	if (nv->login_timeout < 4)
++		nv->login_timeout = 4;
++	ha->login_timeout = nv->login_timeout;
++	icb->login_timeout = nv->login_timeout;
++
++/* FIXME
++ *
++ * port_down_retry_count updated twice
++ *
++ */
++	ha->port_down_retry_count = nv->port_down_retry_count;
++	ha->minimum_timeout =
++	    (ha->login_timeout * ha->retry_count) + ha->port_down_retry_count;
++	ha->loop_reset_delay = nv->reset_delay;
++
++	/* Will get the value from NVRAM. */
++	ha->loop_down_timeout = LOOP_DOWN_TIMEOUT;
++	ha->loop_down_abort_time = LOOP_DOWN_TIME - ha->loop_down_timeout;
++
++	/* save OEM related items for QLA2200s and QLA2300s */
++	ha->oem_id = nv->oem_id;
++	memcpy(ha->oem_specific, nv->oem_specific, sizeof(ha->oem_specific));
++
++	ha->max_probe_luns = le16_to_cpu(nv->max_luns_per_target);
++	if (ha->max_probe_luns == 0)
++		ha->max_probe_luns = MIN_LUNS;
++
++#if defined(IOCB_THROLLE_USAGE)
++	/* High-water mark of IOCBs */
++	ha->iocb_hiwat = MAX_IOCBS_AVAILBALE;
++#endif
++
++#if USE_BIOS_MAX_LUNS
++	ha->max_luns = le16_to_cpu(nv->max_luns_per_target);
++	if (ha->max_luns == 0)
++		ha->max_luns = MAX_LUNS;
++	else if (ha->max_luns > MAX_LUNS)
++		ha->max_luns = MAX_LUNS;
++#else
++	ha->max_luns = MAX_LUNS;
++#endif
++
++/* FIXME
++ *
++ * port_down_retry_count updated twice
++ *
++ */
++	/*
++	 * Need enough time to try and get the port back.
++	 */
++	if (qlport_down_retry)
++		ha->port_down_retry_count = qlport_down_retry;
++	/* Set login_retry_count */
++	ha->login_retry_count  = nv->retry_count;
++	if (ha->port_down_retry_count == nv->port_down_retry_count &&
++	    ha->port_down_retry_count > 3)
++		ha->login_retry_count = ha->port_down_retry_count;
++	else if (ha->port_down_retry_count > ha->login_retry_count)
++		ha->login_retry_count = ha->port_down_retry_count;
++
++	ha->binding_type = Bind;
++	if ((ha->binding_type != BIND_BY_PORT_NAME) &&
++	    (ha->binding_type != BIND_BY_PORT_ID) &&
++	    (ha->binding_type != BIND_BY_NODE_NAME)) {
++
++		printk(KERN_WARNING
++		    "scsi(%ld): Invalid binding type specified (%d), "
++		    "defaulting to BIND_BY_PORT_NAME!!!\n",
++		    ha->host_no, ha->binding_type);
++
++		ha->binding_type = BIND_BY_PORT_NAME;
++	}
++
++	/*
++	 * Setup ring parameters in initialization control block
++	 */
++	icb->request_q_outpointer = __constant_cpu_to_le16(0);
++	icb->response_q_inpointer = __constant_cpu_to_le16(0);
++	icb->request_q_length = __constant_cpu_to_le16(REQUEST_ENTRY_CNT);
++	icb->response_q_length = __constant_cpu_to_le16(RESPONSE_ENTRY_CNT);
++	icb->request_q_address[0] = cpu_to_le32(LSD(ha->request_dma));
++	icb->request_q_address[1] = cpu_to_le32(MSD(ha->request_dma));
++	icb->response_q_address[0] = cpu_to_le32(LSD(ha->response_dma));
++	icb->response_q_address[1] = cpu_to_le32(MSD(ha->response_dma));
++
++	icb->lun_enables = __constant_cpu_to_le16(0);
++	icb->command_resource_count = 0;
++	icb->immediate_notify_resource_count = 0;
++	icb->timeout = __constant_cpu_to_le16(0);
++
++	ha->flags.nvram_config_done = 1;
++
++	if (status) {
++		DEBUG2_3(printk(KERN_WARNING
++		    "scsi(%ld): NVRAM configuration failed!\n", ha->host_no));
++	}
++
++	LEAVE(__func__);
++
++	return (status);
++}
++
++/*
++* qla2x00_init_fc_db
++*      Initializes Fibre Channel Device Database.
++*
++* Input:
++*      ha = adapter block pointer.
++*
++* Output:
++*      ha->fc_db = initialized
++*/
++static void
++qla2x00_init_fc_db(scsi_qla_host_t *ha)
++{
++	uint16_t cnt;
++
++	ENTER(__func__);
++
++	/* Initialize fc database if it is not initialized. */
++	if (!ha->fc_db[0].loop_id && !ha->fc_db[1].loop_id) {
++		ha->flags.updated_fc_db = FALSE;
++
++		/* Initialize target database. */
++		for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) {
++			ha->fc_db[cnt].name[0] = 0L;
++			ha->fc_db[cnt].name[1] = 0L;
++			ha->fc_db[cnt].loop_id = PORT_UNUSED;
++			ha->fc_db[cnt].port_login_retry_count =
++			    ha->port_down_retry_count * PORT_RETRY_TIME;
++			ha->fc_db[cnt].flag = 0;   /* v2.19.5b3 */
++		}
++	}
++
++	LEAVE(__func__);
++}
++
++
++/*
++* qla2x00_init_tgt_map
++*      Initializes target map.
++*
++* Input:
++*      ha = adapter block pointer.
++*
++* Output:
++*      TGT_Q initialized
++*/
++static void
++qla2x00_init_tgt_map(scsi_qla_host_t *ha)
++{
++	uint32_t t;
++
++	ENTER(__func__);
++
++	for (t = 0; t < MAX_TARGETS; t++)
++		TGT_Q(ha, t) = (os_tgt_t *)NULL;
++
++	LEAVE(__func__);
++}
++
++/*
++ * qla2x00_configure_loop
++ *      Updates Fibre Channel Device Database with what is actually on loop.
++ *
++ * Input:
++ *      ha                = adapter block pointer.
++ *
++ * Output:
++ *      ha->fc_db = updated
++ *
++ * Returns:
++ *      0 = success.
++ *      1 = error.
++ *      2 = database was full and device was not configured.
++ */
++static uint8_t
++qla2x00_configure_loop(scsi_qla_host_t *ha) 
++{
++	uint8_t  rval = 0;
++	uint8_t  rval1 = 0;
++	uint8_t  enable_slot_reuse = FALSE;
++	uint16_t  cnt;
++	static unsigned long  flags, save_flags;
++#if defined(FC_IP_SUPPORT)
++	struct ip_device	*ipdev;
++#endif
++
++	ENTER(__func__);
++
++	DEBUG(printk("scsi(%ld): Begin configure loop.\n", ha->host_no));
++
++	/* Get Initiator ID */
++	if (qla2x00_configure_hba(ha)) {
++		DEBUG(printk("scsi(%ld): Unable to configure HBA.\n",
++		    ha->host_no));
++		return(1);
++	}
++
++#if defined(FC_IP_SUPPORT)
++	/* Disable all IP devices in linked list */
++	for (ipdev = ha->ipdev_db_top; ipdev; ipdev = ipdev->next)
++		ipdev->flags &= ~IP_DEV_FLAG_PRESENT;
++#endif /* FC_IP_SUPPORT */
++
++	save_flags = flags = ha->dpc_flags;
++	DEBUG(printk("scsi(%ld): Configure loop -- dpc flags =0x%lx\n",
++	    ha->host_no, flags));
++
++	/* dg 02/26/02 ha->dpc_flags &= ~(LOCAL_LOOP_UPDATE | RSCN_UPDATE); */
++
++	/*
++	 * If we have both an RSCN and PORT UPDATE pending then handle them
++	 * both at the same time.
++	 */
++	clear_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags);
++	clear_bit(RSCN_UPDATE, &ha->dpc_flags);
++	ha->mem_err = 0 ;
++
++	/* Determine what we need to do */
++	if (ha->current_topology == ISP_CFG_FL &&
++	    (test_bit(LOCAL_LOOP_UPDATE, &flags))) {
++
++		ha->flags.rscn_queue_overflow = TRUE;
++		set_bit(RSCN_UPDATE, &flags);
++
++	} else if (ha->current_topology == ISP_CFG_F &&
++	    (test_bit(LOCAL_LOOP_UPDATE, &flags))) {
++
++		ha->flags.rscn_queue_overflow = TRUE;
++		set_bit(RSCN_UPDATE, &flags);
++		clear_bit(LOCAL_LOOP_UPDATE, &flags);
++
++	} else if (!ha->flags.online ||
++	    (test_bit(ABORT_ISP_ACTIVE, &flags))) {
++
++		ha->flags.rscn_queue_overflow = TRUE;
++		set_bit(RSCN_UPDATE, &flags);
++		set_bit(LOCAL_LOOP_UPDATE, &flags);
++	}
++
++	do {
++		if (test_bit(LOCAL_LOOP_UPDATE, &flags)) {
++			rval = rval |
++			    qla2x00_configure_local_loop(ha, enable_slot_reuse);
++		}
++
++		if (test_bit(RSCN_UPDATE, &flags)) {
++			rval1 = qla2x00_configure_fabric(ha, enable_slot_reuse);
++			if ((rval1 & BIT_0) && ha->sns_retry_cnt < 8) {
++				ha->sns_retry_cnt++;
++				set_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags);
++			}
++		}
++
++		/* If devices not configured first time try reusing slots.*/
++		if (enable_slot_reuse == FALSE && (rval & BIT_1))
++			enable_slot_reuse = TRUE;
++		else
++			enable_slot_reuse = FALSE;
++
++		/* Isolate error status. */
++		if (rval & BIT_0) {
++			rval = 1;
++		} else {
++			rval = 0;
++		}
++
++	} while (enable_slot_reuse == TRUE && rval == 0);
++
++	if (!atomic_read(&ha->loop_down_timer) &&
++	    !(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags))) {
++
++		/* Mark devices that are not present as DEV_ABSENCE */
++		for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) {
++			if (ha->fc_db[cnt].loop_id & PORT_LOST_ID) {
++				ha->fc_db[cnt].flag |= DEV_ABSENCE;
++			} else {
++				/* device returned */
++				if (ha->fc_db[cnt].loop_id <
++				    LAST_SNS_LOOP_ID &&
++				    ha->fc_db[cnt].flag & DEV_ABSENCE) {
++					ha->fc_db[cnt].flag &= ~DEV_ABSENCE;
++					ha->fc_db[cnt].flag |= DEV_RETURN;
++					ha->fc_db[cnt].port_login_retry_count =
++					    ha->port_down_retry_count *
++					     PORT_RETRY_TIME;
++				}
++			}
++		}
++
++		rval1 = qla2x00_build_fcport_list(ha);
++		if (((rval1 & BIT_0) || ha->mem_err != 0) &&
++		    ha->sns_retry_cnt < 8) {
++
++			ha->sns_retry_cnt++;
++			set_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags);
++		}
++
++		if (!ha->flags.failover_enabled)
++			qla2x00_config_os(ha);
++
++		/* If we found all devices then go ready */
++		if (!(test_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags))) {
++			ha->loop_state = LOOP_READY;
++
++			if (ha->flags.failover_enabled) {
++				DEBUG(printk("scsi(%ld): schedule FAILBACK "
++				    "EVENT\n", ha->host_no));
++				if (!(test_and_set_bit(FAILOVER_EVENT_NEEDED,
++				    &ha->dpc_flags))) {
++					ha->failback_delay = failbackTime;
++				}
++				set_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags);
++				ha->failover_type = MP_NOTIFY_LOOP_UP;
++			}
++
++			DEBUG(printk("scsi(%ld): LOOP READY\n", ha->host_no));
++		} else {
++			if (test_bit(LOCAL_LOOP_UPDATE, &save_flags))
++				set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags);
++			if (test_bit(RSCN_UPDATE, &save_flags))
++				set_bit(RSCN_UPDATE, &ha->dpc_flags);
++		}
++	} else {
++		DEBUG(printk("scsi(%ld): Loop down counter running= %d or "
++		    "Resync needed- dpc flags= %ld\n",
++		    ha->host_no,
++		    atomic_read(&ha->loop_down_timer), ha->dpc_flags));
++		/* ???? dg 02/26/02  rval = 1; */
++	}
++
++	if (rval) {
++		DEBUG2_3(printk("%s(%ld): *** FAILED ***\n",
++		    __func__, ha->host_no));
++	} else {
++		DEBUG3(printk("%s: exiting normally\n", __func__));
++	}
++
++	return(rval);
++}
++
++/*
++ * qla2x00_configure_local_loop
++ *	Updates Fibre Channel Device Database with local loop devices.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	enable_slot_reuse = allows the use of PORT_AVAILABLE slots.
++ *
++ * Returns:
++ *	0 = success.
++ *	BIT_0 = error.
++ *	BIT_1 = database was full and a device was not configured.
++ */
++static uint8_t
++qla2x00_configure_local_loop(scsi_qla_host_t *ha, uint8_t enable_slot_reuse) 
++{
++	uint8_t  status = 0;
++	uint8_t  rval;
++	uint8_t  port_name[8];
++	uint8_t  update_status = 0;
++	uint16_t index, size;
++	dma_addr_t phys_address = 0;
++	fcdev_t device;
++	port_list_entry_t *gn_list, *port_entry;
++	uint16_t localdevices = 0;
++#if defined(FC_IP_SUPPORT)
++	uint16_t list_entry_loop_id;
++#endif
++
++	ENTER(__func__);
++
++	/*
++	 * No point in continuing if the loop is in a volatile state -- 
++	 * reschedule LOCAL_LOOP_UPDATE for later processing
++	 */
++	if (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) {
++		set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags);
++		return (0);
++	}
++
++	gn_list = pci_alloc_consistent(ha->pdev,
++	    sizeof(GN_LIST_LENGTH), &phys_address);
++	if (gn_list == NULL) {
++		DEBUG2(printk("scsi(%ld): Failed to allocate memory, No local "
++		    "loop\n",
++		    ha->host_no));
++
++		printk(KERN_WARNING
++		    "scsi(%ld): Memory Allocation failed - port_list",
++		    ha->host_no);
++
++		ha->mem_err++;
++		return (BIT_0);
++	}
++	memset(gn_list, 0, sizeof(GN_LIST_LENGTH));
++
++	/* Mark all local devices PORT_LOST_ID first */
++	for (index = 0; index < MAX_FIBRE_DEVICES; index++) {
++		if (ha->fc_db[index].loop_id <= LAST_SNS_LOOP_ID &&
++		    !(ha->fc_db[index].flag & DEV_PUBLIC)) {
++
++			DEBUG(printk("scsi(%ld): Marking port lost @ slot "
++			    "%d %02x%02x%02x\n",
++			    ha->host_no,
++			    index,
++			    ha->fc_db[index].d_id.b.domain,
++			    ha->fc_db[index].d_id.b.area,
++			    ha->fc_db[index].d_id.b.al_pa));
++
++			ha->fc_db[index].loop_id |= PORT_LOST_ID;
++		}
++	}
++
++	DEBUG3(printk("scsi(%ld): Getting FCAL position map\n", ha->host_no));
++	DEBUG3(qla2x00_get_fcal_position_map(ha, NULL));
++
++	/* Get port name list
++	 *
++	 * Via qla2x00_get_port_list:
++	 *
++	 *	Bit 0 - return node names,
++	 *	Bit 1 - loop IDs 0-255
++	 */
++#if defined(FC_IP_SUPPORT)
++	if (ha->flags.enable_ip == FALSE)
++		rval = qla2x00_get_port_list(ha,
++		    gn_list, phys_address, BIT_0, &size);
++	else
++		rval = qla2x00_get_port_list(ha,
++		    gn_list, phys_address, BIT_0|BIT_1, &size);
++#else
++	rval = qla2x00_get_port_list(ha, gn_list, phys_address, BIT_0, &size);
++#endif
++	if (rval) {
++		status = BIT_0;
++		goto cleanup_allocation;
++	}
++
++	DEBUG3(printk("scsi(%ld): Port list size (%d)\n", ha->host_no, size));
++	DEBUG3(qla2x00_dump_buffer((uint8_t *)gn_list, size));
++
++	/* Any valid entries returned? */
++	if (size / sizeof(port_list_entry_t) == 0)
++		goto cleanup_allocation;
++
++	port_entry = gn_list;
++	for ( ; size >= sizeof(port_list_entry_t);
++	    size -= sizeof(port_list_entry_t), port_entry++) {
++
++		device.loop_id = le16_to_cpu(port_entry->loop_id);
++
++#if defined(FC_IP_SUPPORT)
++    		list_entry_loop_id = device.loop_id;
++		device.loop_id &= LOOP_ID_MASK; 
++#endif
++
++		/* Skip any non-local loop-ids - this includes 'known ports' */
++		if (device.loop_id > LAST_LOCAL_LOOP_ID) 
++			continue;
++#if NOT_NEEDED
++		/* Skip the known ports. */
++		if ((device.loop_id == SNS_FL_PORT) ||
++			(device.loop_id == FABRIC_CONTROLLER) ||
++			(device.loop_id == SIMPLE_NAME_SERVER))
++			continue;
++#endif
++
++		device.flag = 0;
++
++		/* Prep node name -- big-endian format */
++		*((u64 *)device.name) = __swab64p((u64 *)port_entry->name);
++
++		/* Retrieve port name */
++		rval = qla2x00_get_port_name(ha, device.loop_id, port_name, 0);
++		if (rval || qla2x00_is_wwn_zero(port_name)) {
++			DEBUG2(printk("scsi(%ld): Loop -- error retrieving "
++			    "port_name.\n",
++			    ha->host_no));
++
++			status = BIT_0;
++			break;
++		}
++		memcpy(device.wwn, port_name, WWN_SIZE);
++
++		/* Derive portid from alpa table */
++		device.d_id.b24 = 0;
++		device.d_id.b.al_pa = alpa_table[device.loop_id];
++
++		DEBUG2_3(printk("scsi(%ld): Loop scan found device - "
++		    "nodename %02x%02x%02x%02x%02x%02x%02x%02x "
++		    "portname %02x%02x%02x%02x%02x%02x%02x%02x "
++		    "portid %02x%02x%02x.\n", 
++		    ha->host_no,
++		    device.name[0], device.name[1],
++		    device.name[2], device.name[3],
++		    device.name[4], device.name[5],
++		    device.name[6], device.name[7],
++		    device.wwn[0], device.wwn[1], device.wwn[2], device.wwn[3],
++		    device.wwn[4], device.wwn[5], device.wwn[6], device.wwn[7],
++		    device.d_id.b.domain,
++		    device.d_id.b.area,
++		    device.d_id.b.al_pa));
++
++#if !defined(FC_IP_SUPPORT)
++		/* SCSI type device */
++		update_status = qla2x00_update_fc_database(ha,
++		    &device, enable_slot_reuse);
++		if (update_status)
++			status |= update_status;
++		else
++			localdevices++;
++#else
++		if (!(list_entry_loop_id & PLE_NOT_SCSI_DEVICE)) {
++			/* SCSI type device */
++			update_status = qla2x00_update_fc_database(ha,
++			    &device, enable_slot_reuse);
++
++			if (update_status)
++				status |= update_status;
++			else
++				localdevices++;
++		} else if (ha->flags.enable_ip == TRUE) {
++			/* SCSI login failed, assume it is IP device */
++			DEBUG12(printk("scsi(%ld): Loop scan found IP device "
++			    "WWNN:%02x%02x%02x%02x%02x%02x%02x%02x "
++			    "DID:%02x%02x%02x.\n",
++			    ha->host_no,
++			    device.name[0], device.name[1],
++			    device.name[2], device.name[3],
++			    device.name[4], device.name[5],
++			    device.name[6], device.name[7],
++			    device.d_id.b.domain,
++			    device.d_id.b.area,
++			    device.d_id.b.al_pa));
++
++			update_status =
++			    qla2x00_update_ip_device_data(ha, &device);
++			if (update_status == QL_STATUS_SUCCESS)
++				localdevices++;
++			else if (update_status == QL_STATUS_RESOURCE_ERROR)
++				status |= BIT_1;
++			else
++				status |= BIT_0;
++		}
++#endif
++	} /* for each port entry */
++
++cleanup_allocation:
++	pci_free_consistent(ha->pdev,
++	    sizeof(GN_LIST_LENGTH), gn_list, phys_address);
++
++	if (status & BIT_0) {
++		DEBUG2(printk("scsi(%ld): Configure local loop error exit: "
++		    "rval=%x\n", ha->host_no, rval));
++	}
++
++	if (localdevices > 0) {
++		ha->device_flags |= DFLG_LOCAL_DEVICES;
++		ha->device_flags &= ~DFLG_RETRY_LOCAL_DEVICES;
++	}
++
++	LEAVE(__func__);
++
++	return (status);
++}
++
++/*
++ * qla2x00_configure_fabric
++ *      Setup SNS devices with loop ID's.
++ *
++ * Input:
++ *      ha = adapter block pointer.
++ *
++ * Returns:
++ *      0 = success.
++ *      BIT_0 = error
++ *      BIT_1 = database was full and device was not configured.
++ */
++#define MAX_PUBLIC_LOOP_IDS LAST_SNS_LOOP_ID + 1
++
++static uint8_t
++qla2x00_configure_fabric(scsi_qla_host_t *ha, uint8_t enable_slot_reuse) 
++{
++	uint8_t     rval = 0;
++	uint8_t     rval1;
++	uint8_t     local_flags = 0;
++	uint8_t     tmp_name[8];
++	fcdev_t     dev;
++	uint16_t    i, index, found_cnt;
++	uint16_t    new_dev_cnt;
++	uint16_t    tmp_loop_id;
++	uint16_t    tmp_topo;
++	struct new_dev *new_dev_list;
++	struct list_head *fcil, *fcitemp;
++	fc_initiator_t	*fcinitiator;
++
++	ENTER(__func__);
++
++	DEBUG2(printk("scsi(%ld): Begin configure fabric -- hba=%p\n",
++	    ha->host_no, ha));
++
++	/* If FL port exists, then SNS is present */
++	rval1 = qla2x00_get_port_name(ha, SNS_FL_PORT, tmp_name, 0);
++	if (rval1 || qla2x00_is_wwn_zero(tmp_name)) {
++		DEBUG2(printk("scsi(%ld): MBC_GET_PORT_NAME Failed, No FL "
++		    "Port\n", ha->host_no));
++
++		ha->device_flags &= ~SWITCH_FOUND;
++		return (0);
++	}
++
++	new_dev_list = kmalloc(sizeof(struct new_dev) * MAX_FIBRE_DEVICES,
++	    GFP_ATOMIC);
++	if (new_dev_list == NULL) {
++		DEBUG2(printk("scsi(%ld): Configure Fabric allocation failed, "
++		    "device list\n", ha->host_no));
++		ha->mem_err++;
++		return (BIT_0);
++	}
++
++	/* Get adapter port ID. */
++	rval = qla2x00_get_adapter_id(ha, &tmp_loop_id,
++	    &ha->d_id.b.al_pa, &ha->d_id.b.area, &ha->d_id.b.domain, &tmp_topo);
++
++	/* Mark devices that need re-synchronization. */
++	qla2x00_device_resync(ha);
++	found_cnt = 0;
++	do {
++		if (test_and_clear_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags)) {
++			if (qla2x00_rft_id(ha)) {
++				/* EMPTY */
++				DEBUG2(printk("scsi(%ld): Register FC-4 "
++				    "TYPE failed.\n", ha->host_no));
++			}
++			if (qla2x00_rff_id(ha)) {
++				/* EMPTY */
++				DEBUG2(printk("scsi(%ld): Register FC-4 "
++				    "Features failed.\n", ha->host_no));
++			}
++			if (qla2x00_rnn_id(ha)) {
++				/* EMPTY */
++				DEBUG2(printk("scsi(%ld): Register Node Name "
++				    "failed.\n", ha->host_no));
++			}
++			if (qla2x00_rsnn_nn(ha)) {
++				/* EMPTY */
++				DEBUG2(printk("scsi(%ld): Register Symbolic "
++				    "Node Name failed.\n", ha->host_no));
++			}
++		}
++
++		rval = qla2x00_find_all_fabric_devs(ha,
++		    new_dev_list, &new_dev_cnt, &local_flags);
++		if (rval != 0)
++			break;
++
++		/*
++		 * Logout all previous fabric devices marked lost, except
++		 * tape devices.
++		 */
++		for (index = 0; index < MAX_FIBRE_DEVICES &&
++		    !atomic_read(&ha->loop_down_timer) &&
++		    !(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)); index++) {
++
++			if (ha->fc_db[index].loop_id & PORT_LOST_ID &&
++			    (ha->fc_db[index].flag & DEV_PUBLIC) &&
++			    !(ha->fc_db[index].flag & DEV_TAPE_DEVICE)) {
++
++				qla2x00_fabric_logout(ha,
++				    ha->fc_db[index].loop_id & 0xff);
++				local_flags |= LOGOUT_PERFORMED;
++			}
++		}
++
++		/* Logout and remove any lost initiator devices */
++		list_for_each_safe(fcil, fcitemp, &ha->fcinitiators) {
++			fcinitiator = list_entry(fcil, fc_initiator_t, list);
++
++			if ((fcinitiator->loop_id & PORT_LOST_ID) == 0)
++				continue;
++
++			qla2x00_fabric_logout(ha, fcinitiator->loop_id & 0xff);
++			ha->fabricid[fcinitiator->loop_id &0xFF].in_use = FALSE;
++
++			list_del(&fcinitiator->list);
++			kfree(fcinitiator);
++		}
++
++		/*
++		 * Scan through our database and login entries already in our
++		 * database.
++		 */
++		for (index = 0; index < MAX_FIBRE_DEVICES &&
++		    !atomic_read(&ha->loop_down_timer) &&
++		    !(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)); index++) {
++
++			if (!(ha->fc_db[index].loop_id & PORT_LOGIN_NEEDED))
++				continue;
++
++			ha->fc_db[index].loop_id &= ~PORT_LOGIN_NEEDED;
++			if (ha->fc_db[index].loop_id <= LAST_SNS_LOOP_ID) {
++				/* loop_id reusable */
++				dev.loop_id = ha->fc_db[index].loop_id & 0xff;
++			} else {
++				for (i = ha->min_external_loopid;
++				    i < MAX_PUBLIC_LOOP_IDS; i++) {
++
++					if (!ha->fabricid[i].in_use) {
++						ha->fabricid[i].in_use = TRUE;
++						dev.loop_id = i;
++						break;
++					}
++				}
++
++				if (i == MAX_PUBLIC_LOOP_IDS)
++					break;
++			}
++
++			dev.d_id.b24 = ha->fc_db[index].d_id.b24;
++
++			/* login and update database */
++			if (qla2x00_fabric_login(ha, &dev) == 0) {
++				ha->fc_db[index].loop_id = dev.loop_id;
++		 	 	found_cnt++;
++			}
++		}
++
++		/*
++		 * Scan through new device list and login and add to our
++		 * database.
++		 */
++		for (index = 0; index < new_dev_cnt &&
++		    !atomic_read(&ha->loop_down_timer) &&
++		    !(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)); index++) {
++
++			memcpy(&dev,
++			    &new_dev_list[index], sizeof(struct new_dev));
++
++			dev.flag = DEV_PUBLIC;
++
++			for (i = ha->min_external_loopid;
++			    i < MAX_PUBLIC_LOOP_IDS; i++) {
++
++				if (!ha->fabricid[i].in_use) {
++					ha->fabricid[i].in_use = TRUE;
++					dev.loop_id = i;
++					break;
++				}
++			}
++
++			if (i == MAX_PUBLIC_LOOP_IDS)
++				break;
++
++			if (qla2x00_fabric_login(ha, &dev) == 0) {
++		 	 	found_cnt++;
++				rval = qla2x00_update_fc_database(ha,
++				    &dev, enable_slot_reuse);
++
++				if (rval) {
++					qla2x00_fabric_logout(ha, dev.loop_id);
++					ha->fabricid[i].in_use = FALSE;
++					break;
++				}
++			}
++		}
++	} while(0);
++
++	kfree(new_dev_list);
++
++	if (rval) {
++		DEBUG2(printk("scsi(%ld): Configure fabric error exit: "
++		    "rval=%d\n", ha->host_no, rval));
++	} else {
++		/* EMPTY */
++		DEBUG2(if (found_cnt))
++		DEBUG2(printk("scsi(%ld) Found (%d) ports\n",
++		    ha->host_no, found_cnt));
++	}
++
++	LEAVE(__func__);
++
++	return(rval);
++}
++
++
++/*
++ * qla2x00_find_all_fabric_devs
++ *	Go through GAN list to find all fabric devices.  Will perform
++ *	necessary logout of previously existed devices that have changed
++ *	and save new devices in a new device list.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	dev = database device entry pointer.
++ *
++ * Returns:
++ *	0 = success.
++ *	BIT_0 = error.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static uint8_t
++qla2x00_find_all_fabric_devs(scsi_qla_host_t *ha, 
++    struct new_dev *new_dev_list, uint16_t *new_dev_cnt, uint8_t *flags) 
++{
++	fcdev_t		dev;
++	uint8_t		rval = 0;
++	int		status = 0;
++	uint16_t	i;
++	uint16_t	index;
++	uint16_t	new_cnt;
++	uint16_t	public_count;
++	uint16_t	initiator;
++	struct list_head *fcil;
++	fc_initiator_t	*fcinitiator;
++
++	sw_info_t	*swl;
++	sw_info_t	swl_entry;
++	int		swl_idx;
++	int		first_dev, last_dev;
++	port_id_t	wrap;
++	int		ip_dev;
++
++	ENTER(__func__);
++
++	/* Try GID_PT to get device list, else GAN. */
++	swl = kmalloc(sizeof(sw_info_t) * MAX_FIBRE_DEVICES, GFP_ATOMIC);
++	if (swl == NULL) {
++		/*EMPTY*/
++		DEBUG2(printk("scsi(%ld): GID_PT allocations failed, fallback "
++		    "on GAN\n", ha->host_no));
++	} else if (qla2x00_gid_pt(ha, swl) != QL_STATUS_SUCCESS) {
++		kfree(swl);
++		swl = NULL;
++	} else if (qla2x00_gpn_id(ha, swl) != QL_STATUS_SUCCESS) {
++		kfree(swl);
++		swl = NULL;
++	} else if (qla2x00_gnn_id(ha, swl) != QL_STATUS_SUCCESS) {
++		kfree(swl);
++		swl = NULL;
++	} else if (qla2x00_gft_id(ha, swl) != QL_STATUS_SUCCESS) {
++		kfree(swl);
++		swl = NULL;
++	}
++	swl_idx = 0;
++
++	/*
++	 * Loop getting devices from switch. Logout the devices that were in
++	 * our database but changed port ID.
++	 */
++#if defined(ISP2100)
++	ha->max_public_loop_ids = LAST_SNS_LOOP_ID - SNS_FIRST_LOOP_ID + 1;
++	public_count = ha->max_public_loop_ids;
++#else
++	ha->max_public_loop_ids = MAX_PUBLIC_LOOP_IDS;
++	public_count = ha->max_public_loop_ids - ha->min_external_loopid + 2;
++#endif
++
++	/* Set start port ID scan at adapter ID. */
++	swl_entry.d_id.b24 = ha->d_id.b24;
++	first_dev = 1;
++	last_dev = 0;
++
++	new_cnt = 0;	/* new device count */
++
++	for (i = 0;
++	    i < public_count && !atomic_read(&ha->loop_down_timer) &&
++	    !(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)); i++) {
++
++		if (swl != NULL) {
++			if (last_dev) {
++				wrap.b24 = dev.d_id.b24;
++			} else {
++				dev.flag = DEV_PUBLIC;
++				dev.d_id.b24 = swl[swl_idx].d_id.b24;
++				memcpy(dev.name,
++				    swl[swl_idx].node_name, WWN_SIZE);
++				memcpy(dev.wwn,
++				    swl[swl_idx].port_name, WWN_SIZE);
++
++				/* IP capable device */
++				ip_dev = 0;
++				if (swl[swl_idx].type & SW_TYPE_IP)
++					ip_dev = 1;
++
++				if (swl[swl_idx].d_id.b.rsvd_1 != 0) {
++					last_dev = 1;
++				}
++				swl_idx++;
++			}
++		} else {
++			/* Send GAN to the switch */
++			rval = 0;
++			if (qla2x00_ga_nxt(ha, &swl_entry) !=
++			    QL_STATUS_SUCCESS) {
++				rval |= BIT_0;
++				break;
++			}
++
++			dev.flag = DEV_PUBLIC;
++			dev.d_id.b24 = swl_entry.d_id.b24;
++			memcpy(dev.name, swl_entry.node_name, WWN_SIZE);
++			memcpy(dev.wwn, swl_entry.port_name, WWN_SIZE);
++
++			/* IP capable device */
++			ip_dev = 0;
++			if (swl_entry.type & SW_TYPE_IP)
++				ip_dev = 1;
++		}
++
++		/* If wrap on switch device list, exit. */
++		if (first_dev) {
++			wrap.b24 = dev.d_id.b24;
++			first_dev = 0;
++		} else if (dev.d_id.b24 == wrap.b24) {
++			DEBUG2(printk("scsi(%ld): device wrap (%02x%02x%02x)\n",
++			    ha->host_no,
++			    dev.d_id.b.domain, 
++			    dev.d_id.b.area, 
++			    dev.d_id.b.al_pa));
++			break;
++		}
++
++		DEBUG(printk("scsi(%ld): Fabric scan found device(%d) - port "
++		    "Id=%02x%02x%02x\n",
++		    ha->host_no, i,
++		    dev.d_id.b.domain, dev.d_id.b.area, dev.d_id.b.al_pa));
++
++		/* Bypass if host adapter. */
++		if (dev.d_id.b24 == ha->d_id.b24)
++			continue;
++
++		/* Bypass reserved domain fields. */
++		if ((dev.d_id.b.domain & 0xf0) == 0xf0)
++			continue;
++
++		/* Bypass if same domain and area of adapter. */
++		if ((dev.d_id.b24 & 0xffff00) == (ha->d_id.b24 & 0xffff00))
++			continue;
++
++#if defined(FC_IP_SUPPORT)
++		/* Check for IP device */
++		if (ip_dev) {
++			/* Found IP device */
++			DEBUG12(printk("scsi(%ld): IP fabric "
++			    "WWN: %02x%02x%02x%02x%02x%02x%02x%02x "
++			    "DID: %02x%02x%02x.\n",
++			    ha->host_no,
++			    dev.name[0], dev.name[1], dev.name[2], dev.name[3],
++			    dev.name[4], dev.name[5], dev.name[6], dev.name[7],
++			    dev.d_id.b.domain, 
++			    dev.d_id.b.area, 
++			    dev.d_id.b.al_pa));
++
++			qla2x00_update_ip_device_data(ha, &dev);
++			continue;
++		}
++#endif
++
++		/* Bypass if initiator */
++		initiator = FALSE;
++		list_for_each(fcil, &ha->fcinitiators) {
++			fcinitiator = list_entry(fcil, fc_initiator_t, list);
++
++			if (memcmp(dev.wwn, fcinitiator->port_name, 8) != 0)
++				continue;
++
++			initiator = TRUE;
++			DEBUG(printk("scsi(%ld): found host "
++			    "%02x%02x%02x%02x%02x%02x%02x%02x, "
++			    "portid=%02x%02x%02x.\n",
++			    ha->host_no,
++			    dev.name[0], dev.name[1], dev.name[2], dev.name[3],
++			    dev.name[4], dev.name[5], dev.name[6], dev.name[7],
++			    dev.d_id.b.domain, 
++			    dev.d_id.b.area, 
++			    dev.d_id.b.al_pa));
++
++			/*
++			 * If the initiator was marked as lost, perform the
++			 * required logout and relogin the initiator by
++			 * assuming a new device.
++			 */
++			if ((fcinitiator->loop_id & PORT_LOST_ID) == 0)
++				break;
++
++			initiator = FALSE;
++			break;
++		}
++
++		/* Bypass if initiator */
++		if (initiator)
++			continue;
++
++		/* Locate matching device in database. */
++		for (index = 0; index < MAX_FIBRE_DEVICES; index++) {
++			if (ha->fc_db[index].loop_id == PORT_UNUSED)
++				continue;
++
++			status = 1;
++			switch (ha->binding_type) {
++			case BIND_BY_PORT_NAME:
++				status = memcmp(dev.wwn,
++				    ha->fc_db[index].wwn, WWN_SIZE);
++				break;
++
++			case BIND_BY_PORT_ID:
++				status = (dev.d_id.b24 !=
++				    ha->fc_db[index].d_id.b24);
++				break;
++
++			case BIND_BY_NODE_NAME:
++				status = memcmp(dev.name,
++				    ha->fc_db[index].name, WWN_SIZE);
++				break;
++			}
++			if (status)
++				continue;
++
++			/*
++			 * Update volatile unbound fields for PortID binding
++			 * only
++			 */
++			if (ha->binding_type == BIND_BY_PORT_ID) {
++				memcpy(ha->fc_db[index].name,
++				    dev.name, WWN_SIZE);
++				memcpy(ha->fc_db[index].wwn,
++				    dev.wwn, WWN_SIZE);
++			}
++
++			/* Now we found a matching device name */
++			DEBUG(printk("scsi(%ld): Found fabric dev %d in "
++			    "tgt %d db, flags= 0x%x, loop_id=0x%04x, port="
++			    "%02x%02x%02x, "
++			    "name=%02x%02x%02x%02x%02x%02x%02x%02x.\n",
++			    ha->host_no, i, index,
++			    ha->fc_db[index].flag,
++			    ha->fc_db[index].loop_id,
++			    ha->fc_db[index].d_id.b.domain,
++			    ha->fc_db[index].d_id.b.area,
++			    ha->fc_db[index].d_id.b.al_pa,
++			    dev.wwn[0], dev.wwn[1], dev.wwn[2], dev.wwn[3],
++			    dev.wwn[4], dev.wwn[5], dev.wwn[6], dev.wwn[7]));
++
++			if (!(ha->fc_db[index].flag & DEV_PUBLIC)) {
++				/*
++				 * This was in our database as a local device.
++				 * Here we assume this device either has
++				 * changed location so configure_local_loop has
++				 * already done necessary clean up, or it's
++				 * saved here due to persistent name binding.
++				 * We'll just add it in as a fabric device.
++				 */
++				/* Copy port id and name fields. */
++				ha->fc_db[index].flag |= DEV_PUBLIC;
++				ha->fc_db[index].d_id.b24 = dev.d_id.b24;
++				ha->fc_db[index].loop_id |= PORT_LOGIN_NEEDED;
++
++				break;
++			}
++
++			/* This was in our database as a fabric device. */
++			if ((ha->fc_db[index].d_id.b24 == dev.d_id.b24) &&
++			    (ha->fc_db[index].loop_id <= LAST_SNS_LOOP_ID))
++				/* Device didn't change */
++				break;
++
++			if (ha->fc_db[index].loop_id == PORT_AVAILABLE) {
++				ha->fc_db[index].flag |= DEV_PUBLIC;
++				ha->fc_db[index].d_id.b24 = dev.d_id.b24;
++				ha->fc_db[index].loop_id |= PORT_LOGIN_NEEDED;
++				break;
++			}
++
++			/*
++			 * Port ID changed or device was marked to be updated;
++			 * logout and mark it for relogin later.
++			 */
++			qla2x00_fabric_logout(ha,
++			    ha->fc_db[index].loop_id & 0xff);
++			ha->fc_db[index].flag |= DEV_PUBLIC;
++			ha->fc_db[index].d_id.b24 = dev.d_id.b24;
++
++			ha->fc_db[index].loop_id |= PORT_LOGIN_NEEDED;
++			ha->fc_db[index].loop_id &= ~PORT_LOST_ID;
++
++			*flags |= LOGOUT_PERFORMED;
++
++			break;
++		}
++
++		if (index == MAX_FIBRE_DEVICES) {
++			/*
++			 * Did not find a match in our database.  This is a new
++			 * device.
++			 */
++			DEBUG3(printk("scsi(%ld): Found new device "
++			    "%02x%02x%02x%02x%02x%02x%02x%02x.\n",
++			    ha->host_no,
++			    dev.wwn[0], dev.wwn[1], dev.wwn[2], dev.wwn[3],
++			    dev.wwn[4], dev.wwn[5], dev.wwn[6], dev.wwn[7]));
++
++			memcpy(&new_dev_list[new_cnt],
++			    &dev, sizeof(struct new_dev));
++			new_cnt++;
++		}
++	}
++
++	if (swl)
++		kfree(swl);
++
++	*new_dev_cnt = new_cnt;
++
++	if (new_cnt >  0)
++		ha->device_flags |= DFLG_FABRIC_DEVICES;
++
++	LEAVE(__func__);
++
++	return (rval);
++}
++
++/*
++ * qla2x00_device_resync
++ *	Marks devices in the database that needs resynchronization.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static void
++qla2x00_device_resync(scsi_qla_host_t *ha) 
++{
++	uint16_t index;
++	uint32_t mask;
++	rscn_t dev;
++	struct list_head *fcil;
++	fc_initiator_t	*fcinitiator;
++
++	ENTER(__func__);
++
++	while (ha->rscn_out_ptr != ha->rscn_in_ptr ||
++	    ha->flags.rscn_queue_overflow) {
++
++		memcpy(&dev, &ha->rscn_queue[ha->rscn_out_ptr], sizeof(rscn_t));
++
++		DEBUG(printk("scsi(%ld): device_resync: rscn_queue[%d], "
++		    "portID=%02x%02x%02x.\n",
++		    ha->host_no,
++		    ha->rscn_out_ptr,
++		    ha->rscn_queue[ha->rscn_out_ptr].d_id.b.domain,
++		    ha->rscn_queue[ha->rscn_out_ptr].d_id.b.area,
++		    ha->rscn_queue[ha->rscn_out_ptr].d_id.b.al_pa));
++
++		ha->rscn_out_ptr++;
++		if (ha->rscn_out_ptr == MAX_RSCN_COUNT)
++			ha->rscn_out_ptr = 0;
++
++		/* Queue overflow, set switch default case. */
++		if (ha->flags.rscn_queue_overflow) {
++			DEBUG(printk("scsi(%ld): device_resync: rscn "
++			    "overflow.\n", ha->host_no));
++
++			dev.format = 3;
++			ha->flags.rscn_queue_overflow = 0;
++		}
++
++		switch (dev.format) {
++		case 0:
++			mask = 0xffffff;
++			break;
++		case 1:
++			mask = 0xffff00;
++			break;
++		case 2:
++			mask = 0xff0000;
++			break;
++		default:
++			mask = 0x0;
++			dev.d_id.b24 = 0;
++			ha->rscn_out_ptr = ha->rscn_in_ptr;
++			break;
++		}
++
++		/* Mark target devices indicated by RSCN for later processing */
++		for (index = 0; index < MAX_FIBRE_DEVICES; index++) {
++			if ((ha->fc_db[index].flag & DEV_PUBLIC) &&
++			    (ha->fc_db[index].d_id.b24 & mask) ==
++			     dev.d_id.b24) {
++
++				/* fabric device */
++				if (ha->fc_db[index].loop_id != PORT_UNUSED) {
++					ha->fc_db[index].loop_id |=
++					    PORT_LOST_ID;
++
++					DEBUG(printk("scsi(%ld): RSCN port @ "
++					    "slot %d port_id=%02x%02x%02x.\n",
++					    ha->host_no,
++					    index,
++					    ha->fc_db[index].d_id.b.domain,
++					    ha->fc_db[index].d_id.b.area,
++					    ha->fc_db[index].d_id.b.al_pa));
++				}
++			}
++		}
++
++		if (dev.format == 3)
++			continue;
++
++		/*
++		 * Invalidate initiator devices indicated by RSCN so we know
++		 * they are no longer logged in.
++		 */
++		list_for_each(fcil, &ha->fcinitiators) {
++			fcinitiator = list_entry(fcil, fc_initiator_t, list);
++
++			if ((fcinitiator->d_id.b24 & mask) != dev.d_id.b24)
++				continue;
++			if (fcinitiator->loop_id & PORT_LOST_ID ||
++				fcinitiator->loop_id & PORT_LOGIN_NEEDED)
++				continue;
++
++			fcinitiator->loop_id |= PORT_LOST_ID;
++			fcinitiator->d_id.b24 = 0;
++		}
++	}
++
++	LEAVE(__func__);
++}
++
++
++/*
++ *  qla2x00_loop_resync
++ *      Resync with fibre channel devices.
++ *
++ * Input:
++ *      ha = adapter block pointer.
++ *
++ * Returns:
++ *      0 = success
++ */
++uint8_t
++qla2x00_loop_resync(scsi_qla_host_t *ha) 
++{
++	uint8_t   status;
++
++	ENTER(__func__);
++
++	ha->loop_state = LOOP_UPDATE;
++	qla2x00_stats.loop_resync++;
++	clear_bit(ISP_ABORT_RETRY, &ha->dpc_flags);
++	if (ha->flags.online) {
++		if (!(status = qla2x00_fw_ready(ha))) {
++			do {
++				/* v2.19.05b6 */
++				ha->loop_state = LOOP_UPDATE;
++
++				/*
++				 * Issue marker command only when we are going
++				 * to start the I/O .
++				 */
++				ha->marker_needed = 1;
++
++				/* Remap devices on Loop. */
++				clear_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags);
++
++				qla2x00_configure_loop(ha);
++
++			} while (!atomic_read(&ha->loop_down_timer) &&
++				!(test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) &&
++				(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)));
++		}
++		qla2x00_restart_queues(ha,TRUE);
++	} else
++		status = 0;
++
++	if (test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) {
++		return (1);
++	}
++
++	if (status) {
++		DEBUG2_3(printk("%s(): **** FAILED ****\n", __func__));
++	}
++
++	LEAVE(__func__);
++
++	return(status);
++}
++
++/*
++ * qla2x00_fabric_login
++ *	Issue fabric login command.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	device = pointer to FC device type structure.
++ *
++ * Returns:
++ *      0 - Login successfully
++ *      1 - Login failed
++ *      2 - Initiator device
++ *      3 - Fatal error
++ */
++uint8_t
++qla2x00_fabric_login(scsi_qla_host_t *ha, fcdev_t *device) 
++{
++	uint16_t	status[3];
++
++	for (;;) {
++		DEBUG(printk("scsi(%ld): Trying Fabric Login w/loop id 0x%04x "
++ 		    "for port %02x%02x%02x.\n",
++ 		    ha->host_no, device->loop_id,
++		    device->d_id.b.domain,
++		    device->d_id.b.area,
++		    device->d_id.b.al_pa));
++
++		/* Login device on switch. */
++		qla2x00_login_fabric(ha,
++ 		    device->loop_id, device->d_id.b.domain,
++ 		    device->d_id.b.area, device->d_id.b.al_pa, 
++ 		    &status[0], BIT_0);
++
++		if (status[0] == 0x4007) {
++			ha->fabricid[device->loop_id].in_use = FALSE;
++			device->loop_id = status[1];
++
++			DEBUG(printk("Fabric Login: port in use - next "
++ 			    "loop id=0x%04x, port Id=%02x%02x%02x.\n",
++			    device->loop_id,
++			    device->d_id.b.domain,
++			    device->d_id.b.area,
++			    device->d_id.b.al_pa));
++
++			if (device->loop_id <= LAST_SNS_LOOP_ID)
++				ha->fabricid[device->loop_id].in_use = TRUE;
++			else
++				return 1;
++
++		} else if (status[0] == 0x4000) {
++			if (status[1] & 0x0001) {
++				/* Initiator only device */
++				qla2x00_add_initiator_device(ha, device);
++
++				return 2;
++			}
++
++			/* This is target capable device */
++			qla2x00_get_port_database(ha, device, 0);
++
++			DEBUG(printk("scsi(%ld): Fabric Login OK. loop "
++ 			    "id=0x%04x, port Id=%02x%02x%02x.\n",
++ 			    ha->host_no,
++			    device->loop_id,
++			    device->d_id.b.domain,
++			    device->d_id.b.area,
++			    device->d_id.b.al_pa));
++			return 0;
++
++		} else if (status[0] == 0x4008) {
++			if (device->loop_id++ <= LAST_SNS_LOOP_ID)
++				ha->fabricid[device->loop_id].in_use = TRUE;
++			else
++				return 1;
++
++		} else if (status[0] == 0x4006) {
++			/* No more retry needed. */
++			return 3;
++		} else {
++			DEBUG2(printk("%s(%ld): failed=%x port_id=%02x%02x%02x "
++ 			    "loop_id=%x jiffies=%lx.\n", 
++ 			    __func__, ha->host_no, status[0], 
++			    device->d_id.b.domain,
++			    device->d_id.b.area,
++			    device->d_id.b.al_pa,
++			    device->loop_id, jiffies));
++			return 1;
++		}
++	}
++}
++
++/*
++ * qla2x00_local_device_login
++ *	Issue local device login command.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	loop_id = loop id of device to login to.
++ *
++ * Returns (Where's the #define!!!!):
++ *      0 - Login successfully
++ *      1 - Login failed
++ *      3 - Fatal error
++ */
++uint8_t
++qla2x00_local_device_login(scsi_qla_host_t *ha, uint16_t loop_id)
++{
++	int		rval;
++	uint16_t	mb[MAILBOX_REGISTER_COUNT];
++
++	memset(mb, 0, sizeof(mb));
++	rval = qla2x00_login_local_device(ha, loop_id, mb, BIT_0);
++	if (rval == QL_STATUS_SUCCESS) {
++		/* Interrogate mailbox registers for any errors */
++		if (mb[0] == 0x4005)
++			rval = 1;
++		else if (mb[0] == 0x4006)
++			/* device not in PCB table */
++			rval = 3;
++	}
++	return rval;
++}
++
++
++/**
++ * qla2x00_ga_nxt() - SNS scan for fabric devices via GA_NXT command.
++ * @ha: HA context
++ * @swl_entry: switch info entry to updated
++ *
++ * NOTE: Non-Nx_Ports are skipped.
++ *
++ * Returns 0 on success.
++ */
++static int
++qla2x00_ga_nxt(scsi_qla_host_t *ha, sw_info_t *swl_entry)
++{
++	int		rval;
++
++	ms_iocb_entry_t	*ms_pkt;
++	struct ct_sns_req	*ct_req;
++	struct ct_sns_rsp	*ct_rsp;
++
++	ENTER(__func__);
++
++retry_ga_nxt:
++	/* Issue GA_NXT */
++	/* Prepare common MS IOCB */
++	ms_pkt = qla2x00_prep_ms_iocb(ha, GA_NXT_REQ_SIZE, GA_NXT_RSP_SIZE);
++
++	/* Prepare CT request */
++	ct_req = &ha->ct_sns->p.req;
++	ct_rsp = &ha->ct_sns->p.rsp;
++	memset(ct_req, 0, sizeof(struct ct_sns_pkt));
++
++	ct_req->header.revision = 0x01;
++	ct_req->header.gs_type = 0xFC;
++	ct_req->header.gs_subtype = 0x02;
++	ct_req->command = __constant_cpu_to_be16(GA_NXT_CMD);
++	ct_req->max_rsp_size =
++	    __constant_cpu_to_be16((GA_NXT_RSP_SIZE - 16) / 4);
++
++	/* Prepare CT arguments -- port_id */
++	ct_req->req.port_id.port_id[0] = swl_entry->d_id.b.domain;
++	ct_req->req.port_id.port_id[1] = swl_entry->d_id.b.area;
++	ct_req->req.port_id.port_id[2] = swl_entry->d_id.b.al_pa;
++
++	/* Execute MS IOCB */
++	rval = qla2x00_issue_iocb(ha,
++	    ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t));
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3(printk("scsi(%ld): GA_NXT issue IOCB failed (%d).\n",
++		    ha->host_no, rval));
++	} else if (ct_rsp->header.response !=
++	    __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) {
++		DEBUG2_3(printk("scsi(%ld): GA_NXT failed, rejected request, "
++		    "ga_nxt_rsp:\n", ha->host_no));
++		DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header,
++		    sizeof(struct ct_rsp_hdr)));
++		rval = QL_STATUS_ERROR;
++	} else if (ct_rsp->rsp.ga_nxt.port_type != NS_N_PORT_TYPE &&
++	    ct_rsp->rsp.ga_nxt.port_type != NS_NL_PORT_TYPE) {
++		/* We're only interested in Nx ports */
++		DEBUG2_3(printk("scsi(%ld): GA_NXT skipping *NON* Nx_Port - "
++		    "nodename %02x%02x%02x%02x%02x%02x%02x%02x "
++		    "portname %02x%02x%02x%02x%02x%02x%02x%02x "
++		    "portid=%02x%02x%02x port_type=%x.\n",
++		    ha->host_no,
++		    ct_rsp->rsp.ga_nxt.node_name[0],
++		    ct_rsp->rsp.ga_nxt.node_name[1], 
++		    ct_rsp->rsp.ga_nxt.node_name[2], 
++		    ct_rsp->rsp.ga_nxt.node_name[3], 
++		    ct_rsp->rsp.ga_nxt.node_name[4], 
++		    ct_rsp->rsp.ga_nxt.node_name[5], 
++		    ct_rsp->rsp.ga_nxt.node_name[6], 
++		    ct_rsp->rsp.ga_nxt.node_name[7], 
++		    ct_rsp->rsp.ga_nxt.port_name[0],
++		    ct_rsp->rsp.ga_nxt.port_name[1], 
++		    ct_rsp->rsp.ga_nxt.port_name[2], 
++		    ct_rsp->rsp.ga_nxt.port_name[3], 
++		    ct_rsp->rsp.ga_nxt.port_name[4], 
++		    ct_rsp->rsp.ga_nxt.port_name[5], 
++		    ct_rsp->rsp.ga_nxt.port_name[6], 
++		    ct_rsp->rsp.ga_nxt.port_name[7], 
++		    ct_rsp->rsp.ga_nxt.port_id[0], 
++		    ct_rsp->rsp.ga_nxt.port_id[1], 
++		    ct_rsp->rsp.ga_nxt.port_id[2],
++		    ct_rsp->rsp.ga_nxt.port_type));
++		goto retry_ga_nxt;
++	} else {
++		/* Populate switch info entry. */
++		swl_entry->d_id.b.domain = ct_rsp->rsp.ga_nxt.port_id[0];
++		swl_entry->d_id.b.area = ct_rsp->rsp.ga_nxt.port_id[1];
++		swl_entry->d_id.b.al_pa = ct_rsp->rsp.ga_nxt.port_id[2];
++
++		memcpy(swl_entry->node_name,
++		    ct_rsp->rsp.ga_nxt.node_name, WWN_SIZE);
++		memcpy(swl_entry->port_name,
++		    ct_rsp->rsp.ga_nxt.port_name, WWN_SIZE);
++
++		swl_entry->type = SW_TYPE_SCSI;
++		if (ct_rsp->rsp.ga_nxt.fc4_types[3] & 0x20)
++			swl_entry->type |= SW_TYPE_IP;
++
++		DEBUG2_3(printk("scsi(%ld): GA_NXT entry - "
++		    "nodename %02x%02x%02x%02x%02x%02x%02x%02x "
++		    "portname %02x%02x%02x%02x%02x%02x%02x%02x "
++		    "portid=%02x%02x%02x type=%02x.\n",
++		    ha->host_no,
++		    swl_entry->node_name[0], swl_entry->node_name[1],
++		    swl_entry->node_name[2], swl_entry->node_name[3],
++		    swl_entry->node_name[4], swl_entry->node_name[5],
++		    swl_entry->node_name[6], swl_entry->node_name[7],
++		    swl_entry->port_name[0], swl_entry->port_name[1],
++		    swl_entry->port_name[2], swl_entry->port_name[3],
++		    swl_entry->port_name[4], swl_entry->port_name[5],
++		    swl_entry->port_name[6], swl_entry->port_name[7],
++		    swl_entry->d_id.b.domain,
++		    swl_entry->d_id.b.area,
++		    swl_entry->d_id.b.al_pa,
++		    swl_entry->type));
++	}
++
++	LEAVE(__func__);
++
++	return (rval);
++}
++
++/**
++ * qla2x00_gid_pt() - SNS scan for fabric devices via GID_PT command.
++ * @ha: HA context
++ * @list: switch info entries to populate
++ *
++ * NOTE: Non-Nx_Ports are not requested.
++ *
++ * Returns 0 on success.
++ */
++static int
++qla2x00_gid_pt(scsi_qla_host_t *ha, sw_info_t *list)
++{
++	int		rval;
++	uint16_t	i;
++
++	ms_iocb_entry_t	*ms_pkt;
++	struct ct_sns_req	*ct_req;
++	struct ct_sns_rsp	*ct_rsp;
++
++	struct ct_sns_gid_pt_data *gid_data;
++
++	ENTER(__func__);
++
++	gid_data = NULL;
++
++	/* Issue GID_PT */
++	/* Prepare common MS IOCB */
++	ms_pkt = qla2x00_prep_ms_iocb(ha, GID_PT_REQ_SIZE, GID_PT_RSP_SIZE);
++
++	/* Prepare CT request */
++	ct_req = &ha->ct_sns->p.req;
++	ct_rsp = &ha->ct_sns->p.rsp;
++	memset(ct_req, 0, sizeof(struct ct_sns_pkt));
++
++	ct_req->header.revision = 0x01;
++	ct_req->header.gs_type = 0xFC;
++	ct_req->header.gs_subtype = 0x02;
++	ct_req->command = __constant_cpu_to_be16(GID_PT_CMD);
++	ct_req->max_rsp_size =
++	    __constant_cpu_to_be16((GID_PT_RSP_SIZE - 16) / 4);
++
++	/* Prepare CT arguments -- port_type */
++	ct_req->req.gid_pt.port_type = NS_NX_PORT_TYPE;
++
++	/* Execute MS IOCB */
++	rval = qla2x00_issue_iocb(ha,
++	    ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t));
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3(printk("scsi(%ld): GID_PT issue IOCB failed (%d).\n",
++		    ha->host_no, rval));
++	} else if (ct_rsp->header.response !=
++	    __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) {
++		DEBUG2_3(printk("scsi(%ld): GID_PT failed, rejected request, "
++		    "gid_pt_rsp:\n", ha->host_no));
++		DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header,
++		    sizeof(struct ct_rsp_hdr)));
++		rval = QL_STATUS_ERROR;
++	} else {
++		/* Set port IDs in switch info list. */
++		for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
++			memset(&list[i], 0, sizeof(sw_info_t));
++			gid_data = &ct_rsp->rsp.gid_pt.entries[i];
++			list[i].d_id.b.domain = gid_data->port_id[0];
++			list[i].d_id.b.area = gid_data->port_id[1];
++			list[i].d_id.b.al_pa = gid_data->port_id[2];
++
++			/* Last one exit. */
++			if (gid_data->control_byte & BIT_7) {
++				list[i].d_id.b.rsvd_1 = gid_data->control_byte;
++				break;
++			}
++		}
++	}
++
++	LEAVE(__func__);
++
++	return (rval);
++}
++
++/**
++ * qla2x00_gpn_id() - SNS Get Port Name (GPN_ID) query.
++ * @ha: HA context
++ * @list: switch info entries to populate
++ *
++ * Returns 0 on success.
++ */
++static int
++qla2x00_gpn_id(scsi_qla_host_t *ha, sw_info_t *list)
++{
++	int		rval;
++	uint16_t	i;
++
++	ms_iocb_entry_t	*ms_pkt;
++	struct ct_sns_req	*ct_req;
++	struct ct_sns_rsp	*ct_rsp;
++
++	ENTER(__func__);
++
++	for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
++		/* Issue GPN_ID */
++		/* Prepare common MS IOCB */
++		ms_pkt = qla2x00_prep_ms_iocb(ha,
++		    GPN_ID_REQ_SIZE, GPN_ID_RSP_SIZE);
++
++		/* Prepare CT request */
++		ct_req = &ha->ct_sns->p.req;
++		ct_rsp = &ha->ct_sns->p.rsp;
++		memset(ct_req, 0, sizeof(struct ct_sns_pkt));
++
++		ct_req->header.revision = 0x01;
++		ct_req->header.gs_type = 0xFC;
++		ct_req->header.gs_subtype = 0x02;
++		ct_req->command = __constant_cpu_to_be16(GPN_ID_CMD);
++		ct_req->max_rsp_size =
++		    __constant_cpu_to_be16((GPN_ID_RSP_SIZE - 16) / 4);
++
++		/* Prepare CT arguments -- port_id */
++		ct_req->req.port_id.port_id[0] = list[i].d_id.b.domain;
++		ct_req->req.port_id.port_id[1] = list[i].d_id.b.area;
++		ct_req->req.port_id.port_id[2] = list[i].d_id.b.al_pa;
++
++		/* Execute MS IOCB */
++		rval = qla2x00_issue_iocb(ha,
++		    ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t));
++		if (rval != QL_STATUS_SUCCESS) {
++			/*EMPTY*/
++			DEBUG2_3(printk("scsi(%ld): GPN_ID issue IOCB failed "
++			    "(%d).\n",
++			    ha->host_no, rval));
++		} else if (ct_rsp->header.response !=
++		    __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) {
++			DEBUG2_3(printk("scsi(%ld): GPN_ID failed, rejected "
++			    "request, gpn_id_rsp:\n", ha->host_no));
++			DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header,
++			    sizeof(struct ct_rsp_hdr)));
++			rval = QL_STATUS_ERROR;
++		} else {
++			/* Save portname */
++			memcpy(list[i].port_name,
++			    ct_rsp->rsp.gpn_id.port_name, WWN_SIZE);
++		}
++
++		/* Last device exit. */
++		if (list[i].d_id.b.rsvd_1 != 0)
++			break;
++	}
++
++	LEAVE(__func__);
++
++	return (rval);
++}
++
++/**
++ * qla2x00_gnn_id() - SNS Get Node Name (GPN_ID) query.
++ * @ha: HA context
++ * @list: switch info entries to populate
++ *
++ * Returns 0 on success.
++ */
++static int
++qla2x00_gnn_id(scsi_qla_host_t *ha, sw_info_t *list)
++{
++	int		rval;
++	uint16_t	i;
++
++	ms_iocb_entry_t	*ms_pkt;
++	struct ct_sns_req	*ct_req;
++	struct ct_sns_rsp	*ct_rsp;
++
++	ENTER(__func__);
++
++	for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
++		/* Issue GNN_ID */
++		/* Prepare common MS IOCB */
++		ms_pkt = qla2x00_prep_ms_iocb(ha,
++		    GNN_ID_REQ_SIZE, GNN_ID_RSP_SIZE);
++
++		/* Prepare CT request */
++		ct_req = &ha->ct_sns->p.req;
++		ct_rsp = &ha->ct_sns->p.rsp;
++		memset(ct_req, 0, sizeof(struct ct_sns_pkt));
++
++		ct_req->header.revision = 0x01;
++		ct_req->header.gs_type = 0xFC;
++		ct_req->header.gs_subtype = 0x02;
++		ct_req->command = __constant_cpu_to_be16(GNN_ID_CMD);
++		ct_req->max_rsp_size =
++		    __constant_cpu_to_be16((GNN_ID_RSP_SIZE - 16) / 4);
++
++		/* Prepare CT arguments -- port_id */
++		ct_req->req.port_id.port_id[0] = list[i].d_id.b.domain;
++		ct_req->req.port_id.port_id[1] = list[i].d_id.b.area;
++		ct_req->req.port_id.port_id[2] = list[i].d_id.b.al_pa;
++
++		/* Execute MS IOCB */
++		rval = qla2x00_issue_iocb(ha,
++		    ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t));
++		if (rval != QL_STATUS_SUCCESS) {
++			/*EMPTY*/
++			DEBUG2_3(printk("scsi(%ld): GNN_ID issue IOCB failed "
++			    "(%d).\n",
++			    ha->host_no, rval));
++		} else if (ct_rsp->header.response !=
++		    __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) {
++			DEBUG2_3(printk("scsi(%ld): GNN_ID failed, rejected "
++			    "request, gnn_id_rsp:\n", ha->host_no));
++			DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header,
++			    sizeof(struct ct_rsp_hdr)));
++			rval = QL_STATUS_ERROR;
++		} else {
++			/* Save nodename */
++			memcpy(list[i].node_name,
++			    ct_rsp->rsp.gnn_id.node_name, WWN_SIZE);
++		}
++
++		/* Last device exit. */
++		if (list[i].d_id.b.rsvd_1 != 0)
++			break;
++	}
++
++	LEAVE(__func__);
++
++	return (rval);
++}
++
++/**
++ * qla2x00_gft_id() - SNS Get FC-4 TYPEs (GFT_ID) query.
++ * @ha: HA context
++ * @list: switch info entries to populate
++ *
++ * Returns 0 on success.
++ */
++static int
++qla2x00_gft_id(scsi_qla_host_t *ha, sw_info_t *list)
++{
++	int		rval;
++	uint16_t	i;
++
++	ms_iocb_entry_t	*ms_pkt;
++	struct ct_sns_req	*ct_req;
++	struct ct_sns_rsp	*ct_rsp;
++
++	ENTER(__func__);
++
++	for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
++		/* Issue GFT_ID */
++		/* Prepare common MS IOCB */
++		ms_pkt = qla2x00_prep_ms_iocb(ha,
++		    GFT_ID_REQ_SIZE, GFT_ID_RSP_SIZE);
++
++		/* Prepare CT request */
++		ct_req = &ha->ct_sns->p.req;
++		ct_rsp = &ha->ct_sns->p.rsp;
++		memset(ct_req, 0, sizeof(struct ct_sns_pkt));
++
++		ct_req->header.revision = 0x01;
++		ct_req->header.gs_type = 0xFC;
++		ct_req->header.gs_subtype = 0x02;
++		ct_req->command = __constant_cpu_to_be16(GFT_ID_CMD);
++		ct_req->max_rsp_size =
++		    __constant_cpu_to_be16((GFT_ID_RSP_SIZE - 16) / 4);
++
++		/* Prepare CT arguments -- port_id */
++		ct_req->req.port_id.port_id[0] = list[i].d_id.b.domain;
++		ct_req->req.port_id.port_id[1] = list[i].d_id.b.area;
++		ct_req->req.port_id.port_id[2] = list[i].d_id.b.al_pa;
++
++		/* Execute MS IOCB */
++		rval = qla2x00_issue_iocb(ha,
++		    ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t));
++		if (rval != QL_STATUS_SUCCESS) {
++			/*EMPTY*/
++			DEBUG2_3(printk("scsi(%ld): GFT_ID issue IOCB failed "
++			    "(%d).\n",
++			    ha->host_no, rval));
++		} else if (ct_rsp->header.response !=
++		    __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) {
++			DEBUG2_3(printk("scsi(%ld): GFT_ID failed, rejected "
++			    "request, gft_id_rsp:\n", ha->host_no));
++			DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header,
++			    sizeof(struct ct_rsp_hdr)));
++			rval = QL_STATUS_ERROR;
++		} else {
++			/* FCP-3 check necessary?  No, assume FCP-3 */
++			/*if (ct_rsp->rsp.gft_id.fc4_types[2] & 0x01)*/
++			list[i].type = SW_TYPE_SCSI;
++			if (ct_rsp->rsp.gft_id.fc4_types[3] & 0x20)
++				list[i].type |= SW_TYPE_IP;
++
++			DEBUG2_3(printk("scsi(%ld): GID_PT entry - "
++			    "nodename %02x%02x%02x%02x%02x%02x%02x%02x "
++			    "portname %02x%02x%02x%02x%02x%02x%02x%02x "
++			    "portid=%02x%02x%02x type=%02x.\n",
++			    ha->host_no,
++			    list[i].node_name[0], list[i].node_name[1],
++			    list[i].node_name[2], list[i].node_name[3],
++			    list[i].node_name[4], list[i].node_name[5],
++			    list[i].node_name[6], list[i].node_name[7],
++			    list[i].port_name[0], list[i].port_name[1],
++			    list[i].port_name[2], list[i].port_name[3],
++			    list[i].port_name[4], list[i].port_name[5],
++			    list[i].port_name[6], list[i].port_name[7],
++			    list[i].d_id.b.domain,
++			    list[i].d_id.b.area,
++			    list[i].d_id.b.al_pa,
++			    list[i].type));
++		}
++
++		/* Last device exit. */
++		if (list[i].d_id.b.rsvd_1 != 0)
++			break;
++	}
++
++	LEAVE(__func__);
++
++	return (rval);
++}
++
++/**
++ * qla2x00_rft_id() - SNS Register FC-4 TYPEs (RFT_ID) supported by the HBA.
++ * @ha: HA context
++ *
++ * Returns 0 on success.
++ */
++static int
++qla2x00_rft_id(scsi_qla_host_t *ha)
++{
++	int		rval;
++
++	ms_iocb_entry_t	*ms_pkt;
++	struct ct_sns_req	*ct_req;
++	struct ct_sns_rsp	*ct_rsp;
++
++	ENTER(__func__);
++
++	/* Issue RFT_ID */
++	/* Prepare common MS IOCB */
++	ms_pkt = qla2x00_prep_ms_iocb(ha, RFT_ID_REQ_SIZE, RFT_ID_RSP_SIZE);
++
++	/* Prepare CT request */
++	ct_req = &ha->ct_sns->p.req;
++	ct_rsp = &ha->ct_sns->p.rsp;
++	memset(ct_req, 0, sizeof(struct ct_sns_pkt));
++
++	ct_req->header.revision = 0x01;
++	ct_req->header.gs_type = 0xFC;
++	ct_req->header.gs_subtype = 0x02;
++	ct_req->command = __constant_cpu_to_be16(RFT_ID_CMD);
++	ct_req->max_rsp_size =
++	    __constant_cpu_to_be16((RFT_ID_RSP_SIZE - 16) / 4);
++
++	/* Prepare CT arguments -- port_id, FC-4 types */
++	ct_req->req.rft_id.port_id[0] = ha->d_id.b.domain;
++	ct_req->req.rft_id.port_id[1] = ha->d_id.b.area;
++	ct_req->req.rft_id.port_id[2] = ha->d_id.b.al_pa;
++
++	ct_req->req.rft_id.fc4_types[2] = 0x01;		/* FCP-3 */
++	ha->active_fc4_types = EXT_DEF_FC4_TYPE_SCSI;
++
++#if defined(FC_IP_SUPPORT)
++	if (ha->flags.enable_ip) {
++		ct_req->req.rft_id.fc4_types[3] = 0x20; /* IP over FC */
++		ha->active_fc4_types |= EXT_DEF_FC4_TYPE_IP;
++	}
++#endif
++#if defined(FC_VI_SUPPORT)
++	ct_req->req.rft_id.fc4_types[8] = 0x01;		/* FC-VI */
++	ha->active_fc4_types |= EXT_DEF_FC4_TYPE_VI;
++#endif
++
++	/* Execute MS IOCB */
++	rval = qla2x00_issue_iocb(ha,
++	    ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t));
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3(printk("scsi(%ld): RFT_ID issue IOCB failed (%d).\n",
++		    ha->host_no, rval));
++	} else if (ct_rsp->header.response !=
++	    __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) {
++		DEBUG2_3(printk("scsi(%ld): RFT_ID failed, rejected "
++		    "request, rft_id_rsp:\n", ha->host_no));
++		DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header,
++		    sizeof(struct ct_rsp_hdr)));
++		rval = QL_STATUS_ERROR;
++	} else {
++		DEBUG2(printk("scsi(%ld): RFT_ID exiting normally.\n",
++		    ha->host_no));
++	}
++
++	LEAVE(__func__);
++
++	return (rval);
++}
++
++/**
++ * qla2x00_rff_id() - SNS Register FC-4 Features (RFF_ID) supported by the HBA.
++ * @ha: HA context
++ *
++ * Returns 0 on success.
++ */
++static int
++qla2x00_rff_id(scsi_qla_host_t *ha)
++{
++	int		rval;
++
++	ms_iocb_entry_t	*ms_pkt;
++	struct ct_sns_req	*ct_req;
++	struct ct_sns_rsp	*ct_rsp;
++
++	ENTER(__func__);
++
++	/* Issue RFF_ID */
++	/* Prepare common MS IOCB */
++	ms_pkt = qla2x00_prep_ms_iocb(ha, RFF_ID_REQ_SIZE, RFF_ID_RSP_SIZE);
++
++	/* Prepare CT request */
++	ct_req = &ha->ct_sns->p.req;
++	ct_rsp = &ha->ct_sns->p.rsp;
++	memset(ct_req, 0, sizeof(struct ct_sns_pkt));
++
++	ct_req->header.revision = 0x01;
++	ct_req->header.gs_type = 0xFC;
++	ct_req->header.gs_subtype = 0x02;
++	ct_req->command = __constant_cpu_to_be16(RFF_ID_CMD);
++	ct_req->max_rsp_size =
++	    __constant_cpu_to_be16((RFF_ID_RSP_SIZE - 16) / 4);
++
++	/* Prepare CT arguments -- port_id, FC-4 feature, FC-4 type */
++	ct_req->req.rff_id.port_id[0] = ha->d_id.b.domain;
++	ct_req->req.rff_id.port_id[1] = ha->d_id.b.area;
++	ct_req->req.rff_id.port_id[2] = ha->d_id.b.al_pa;
++
++	if (!ha->flags.enable_target_mode)
++		ct_req->req.rff_id.fc4_feature = 0x02;	/* SCSI Initiator */
++
++	ct_req->req.rff_id.fc4_type = 0x08;		/* SCSI - FCP */
++
++	/* Execute MS IOCB */
++	rval = qla2x00_issue_iocb(ha,
++	    ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t));
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3(printk("scsi(%ld): RFF_ID issue IOCB failed (%d).\n",
++		    ha->host_no, rval));
++	} else if (ct_rsp->header.response !=
++	    __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) {
++		DEBUG2_3(printk("scsi(%ld): RFF_ID failed, rejected "
++		    "request, rff_id_rsp:\n", ha->host_no));
++		DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header,
++		    sizeof(struct ct_rsp_hdr)));
++		rval = QL_STATUS_ERROR;
++	} else {
++		DEBUG2(printk("scsi(%ld): RFF_ID exiting normally.\n",
++		    ha->host_no));
++	}
++
++	LEAVE(__func__);
++
++	return (rval);
++}
++
++/**
++ * qla2x00_rnn_id() - SNS Register Node Name (RNN_ID) of the HBA.
++ * @ha: HA context
++ *
++ * Returns 0 on success.
++ */
++static int
++qla2x00_rnn_id(scsi_qla_host_t *ha)
++{
++	int		rval;
++
++	ms_iocb_entry_t	*ms_pkt;
++	struct ct_sns_req	*ct_req;
++	struct ct_sns_rsp	*ct_rsp;
++
++	ENTER(__func__);
++
++	/* Issue RNN_ID */
++	/* Prepare common MS IOCB */
++	ms_pkt = qla2x00_prep_ms_iocb(ha, RNN_ID_REQ_SIZE, RNN_ID_RSP_SIZE);
++
++	/* Prepare CT request */
++	ct_req = &ha->ct_sns->p.req;
++	ct_rsp = &ha->ct_sns->p.rsp;
++	memset(ct_req, 0, sizeof(struct ct_sns_pkt));
++
++	ct_req->header.revision = 0x01;
++	ct_req->header.gs_type = 0xFC;
++	ct_req->header.gs_subtype = 0x02;
++	ct_req->command = __constant_cpu_to_be16(RNN_ID_CMD);
++	ct_req->max_rsp_size =
++	    __constant_cpu_to_be16((RNN_ID_RSP_SIZE - 16) / 4);
++
++	/* Prepare CT arguments -- port_id, node_name */
++	ct_req->req.rnn_id.port_id[0] = ha->d_id.b.domain;
++	ct_req->req.rnn_id.port_id[1] = ha->d_id.b.area;
++	ct_req->req.rnn_id.port_id[2] = ha->d_id.b.al_pa;
++
++	memcpy(ct_req->req.rnn_id.node_name, ha->init_cb->node_name, WWN_SIZE);
++
++	/* Execute MS IOCB */
++	rval = qla2x00_issue_iocb(ha,
++	    ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t));
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3(printk("scsi(%ld): RNN_ID issue IOCB failed (%d).\n",
++		    ha->host_no, rval));
++	} else if (ct_rsp->header.response !=
++	    __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) {
++		DEBUG2_3(printk("scsi(%ld): RNN_ID failed, rejected "
++		    "request, rnn_id_rsp:\n", ha->host_no));
++		DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header,
++		    sizeof(struct ct_rsp_hdr)));
++		rval = QL_STATUS_ERROR;
++	} else {
++		DEBUG2(printk("scsi(%ld): RNN_ID exiting normally.\n",
++		    ha->host_no));
++	}
++
++	LEAVE(__func__);
++
++	return (rval);
++}
++
++/**
++ * qla2x00_rsnn_nn() - SNS Register Symbolic Node Name (RSNN_NN) of the HBA.
++ * @ha: HA context
++ *
++ * Returns 0 on success.
++ */
++static int
++qla2x00_rsnn_nn(scsi_qla_host_t *ha)
++{
++	int		rval;
++	uint8_t		*snn;
++	uint8_t		version[20];
++
++	ms_iocb_entry_t	*ms_pkt;
++	struct ct_sns_req	*ct_req;
++	struct ct_sns_rsp	*ct_rsp;
++
++	ENTER(__func__);
++
++	/* Issue RSNN_NN */
++	/* Prepare common MS IOCB */
++	/*   Request size adjusted after CT preparation */
++	ms_pkt = qla2x00_prep_ms_iocb(ha, 0, RSNN_NN_RSP_SIZE);
++
++	/* Prepare CT request */
++	ct_req = &ha->ct_sns->p.req;
++	ct_rsp = &ha->ct_sns->p.rsp;
++	memset(ct_req, 0, sizeof(struct ct_sns_pkt));
++
++	ct_req->header.revision = 0x01;
++	ct_req->header.gs_type = 0xFC;
++	ct_req->header.gs_subtype = 0x02;
++	ct_req->command = __constant_cpu_to_be16(RSNN_NN_CMD);
++	ct_req->max_rsp_size =
++	    __constant_cpu_to_be16((RSNN_NN_RSP_SIZE - 16) / 4);
++
++	/* Prepare CT arguments -- node_name, symbolic node_name, size */
++	memcpy(ct_req->req.rsnn_nn.node_name, ha->init_cb->node_name, WWN_SIZE);
++	
++	/* Prepare the Symbolic Node Name */
++	/* Board type */
++	snn = ct_req->req.rsnn_nn.sym_node_name;
++#if defined(ISP2300)
++	if (ha->pdev->device == QLA2312_DEVICE_ID) {
++		switch (ha->pdev->subsystem_device) {
++		case 0x0100:
++			strcpy(snn , "QLA2340");
++			break;
++
++		case 0x0101:
++			strcpy(snn , "QLA2342");
++			break;
++
++		case 0x0102:
++			strcpy(snn , "QLA2312");
++			break;
++
++		default:
++			strcpy(snn , "QLA2312");
++			break;
++		}
++	} else {
++		strcpy(snn ,"QLA23xx");
++	}
++#else
++	sprintf(snn, "QLA%04x", ha->pdev->device);
++#endif
++
++	/* Firmware version */
++	strcat(snn, " FW:v");
++	sprintf(version, "%d.%02d.%02d", ha->fw_major_version,
++	    ha->fw_minor_version, ha->fw_subminor_version);
++	strcat(snn, version);
++
++	/* Driver version */
++	strcat(snn, " DVR:v");
++	strcat(snn, qla2x00_version_str);
++
++	/* Calculate SNN length */
++	ct_req->req.rsnn_nn.name_len = (uint8_t)strlen(snn);
++
++	/* Update MS IOCB request */
++	ms_pkt->req_bytecount =
++	    cpu_to_le32(24 + 1 + ct_req->req.rsnn_nn.name_len);
++	ms_pkt->dseg_req_length = ms_pkt->req_bytecount;
++
++	/* Execute MS IOCB */
++	rval = qla2x00_issue_iocb(ha,
++	    ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t));
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3(printk("scsi(%ld): RSNN_NN issue IOCB failed (%d).\n",
++		    ha->host_no, rval));
++	} else if (ct_rsp->header.response !=
++	    __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) {
++		DEBUG2_3(printk("scsi(%ld): RSNN_NN failed, rejected "
++		    "request, rsnn_id_rsp:\n", ha->host_no));
++		DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header,
++		    sizeof(struct ct_rsp_hdr)));
++		rval = QL_STATUS_ERROR;
++	} else {
++		DEBUG2(printk("scsi(%ld): RSNN_NN exiting normally.\n",
++		    ha->host_no));
++	}
++
++	LEAVE(__func__);
++
++	return (rval);
++}
++
++static int
++qla2x00_add_initiator_device(scsi_qla_host_t *ha, fcdev_t *device)
++{
++	int	ret;
++	fc_initiator_t	*fcinitiator;
++
++	ret = 1;
++	fcinitiator = kmalloc(sizeof(fc_initiator_t), GFP_ATOMIC);
++	if (fcinitiator != NULL) {
++		/* Setup initiator structure. */
++		memset(fcinitiator, 0, sizeof(fc_initiator_t));
++	
++		memcpy(fcinitiator->node_name, device->name, WWN_SIZE);
++		memcpy(fcinitiator->port_name, device->wwn, WWN_SIZE);
++		fcinitiator->d_id.b24 = device->d_id.b24;
++		fcinitiator->loop_id = device->loop_id;
++		list_add_tail(&fcinitiator->list, &ha->fcinitiators);
++		ret = 0;
++	} else {
++		printk(KERN_WARNING
++		    "%s(): Memory Allocation failed - FCINITIATOR\n",
++		    __func__);
++	}
++
++	return (ret);
++}
++
++/*
++ *  qla2x00_restart_queues
++ *	Restart device queues.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *
++ * Context:
++ *	Kernel/Interrupt context.
++ */
++void
++qla2x00_restart_queues(scsi_qla_host_t *ha, uint8_t flush) 
++{
++	srb_t  		*sp;
++	int		retry_q_cnt = 0;
++	int		pending_q_cnt = 0;
++	struct list_head *list, *temp;
++	unsigned long flags = 0;
++	struct list_head *hal;
++	scsi_qla_host_t *vis_ha;
++
++
++	ENTER(__func__);
++
++	clear_bit(RESTART_QUEUES_NEEDED, &ha->dpc_flags);
++
++	/*
++	 * start pending queue
++	 */
++	pending_q_cnt = ha->qthreads;
++	if (flush) {
++		spin_lock_irqsave(&ha->list_lock,flags);
++		list_for_each_safe(list, temp, &ha->pending_queue) {
++			sp = list_entry(list, srb_t, list);
++			/* 
++			 * When time expire return request back to OS as BUSY 
++			 */
++			__del_from_pending_queue(ha, sp);
++			CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16;
++			CMD_HANDLE(sp->cmd) = (unsigned char *)NULL;
++			__add_to_done_queue(ha, sp);
++		}
++		spin_unlock_irqrestore(&ha->list_lock, flags);
++	} else {
++		if (!list_empty(&ha->pending_queue))
++			qla2x00_next(ha);
++	}
++
++	/*
++	 * Clear out our retry queue
++	 */
++	if (flush) {
++		spin_lock_irqsave(&ha->list_lock, flags);
++		retry_q_cnt = ha->retry_q_cnt;
++		list_for_each_safe(list, temp, &ha->retry_queue) {
++			sp = list_entry(list, srb_t, list);
++			/* when time expire return request back to OS as BUSY */
++			__del_from_retry_queue(ha, sp);
++			CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16;
++			CMD_HANDLE(sp->cmd) = (unsigned char *) NULL;
++			__add_to_done_queue(ha, sp);
++		}
++		spin_unlock_irqrestore(&ha->list_lock, flags);
++
++		DEBUG2(printk("%s(%ld): callback %d commands.\n",
++				__func__,
++				ha->host_no,
++				retry_q_cnt);)
++	}
++
++	DEBUG2(printk("%s(%ld): active=%ld, retry=%d, pending=%d, "
++			"done=%ld, failover=%d, scsi retry=%d commands.\n",
++			__func__,
++			ha->host_no,
++			ha->actthreads,
++			ha->retry_q_cnt,
++			pending_q_cnt,
++			ha->done_q_cnt,
++			ha->failover_cnt,
++			ha->scsi_retry_q_cnt);)
++
++	if (ha->flags.failover_enabled) {
++		/* Try and start all visible adapters */
++		read_lock(&qla_hostlist_lock);
++		list_for_each(hal, &qla_hostlist) {
++			vis_ha = list_entry(hal, scsi_qla_host_t, list);
++
++			if (!list_empty(&vis_ha->pending_queue))
++				qla2x00_next(vis_ha);
++
++			DEBUG2(printk("host(%ld):Commands busy=%d "
++					"failed=%d\nin_recovery=%d "
++					"eh_active=%d\n ",
++					vis_ha->host_no,
++					vis_ha->host->host_busy,
++					vis_ha->host->host_failed,
++					vis_ha->host->in_recovery,
++					vis_ha->host->eh_active);)	
++		}
++		read_unlock(&qla_hostlist_lock);
++	}
++
++	if (!list_empty(&ha->done_queue))
++		schedule_work(&ha->run_qla_task);
++
++	LEAVE(__func__);
++}
++
++/*
++ * qla2x00_update_fc_database
++ *      This routine updates the device data in the database.
++ *
++ * Input:
++ *      ha = adapter block pointer.
++ *      device = device data pointer.
++ *
++ * Returns:
++ *      0 = success, if device found or added to database.
++ *      BIT_0 = error
++ *      BIT_1 = database was full and device was not configured.
++ */
++static uint8_t
++qla2x00_update_fc_database(scsi_qla_host_t *ha,
++    fcdev_t *device, uint8_t enable_slot_reuse) 
++{
++	int		rval;
++	uint16_t	cnt, i;
++
++	DEBUG(printk("scsi(%ld): Found device - "
++	    "nodename=%02x%02x%02x%02x%02x%02x%02x%02x, "
++	    "portname=%02x%02x%02x%02x%02x%02x%02x%02x, "
++	    "port Id=%02x%02x%02x, loop id=%04x\n",
++	    ha->host_no,
++	    device->name[0], device->name[1],
++	    device->name[2], device->name[3],
++	    device->name[4], device->name[5],
++	    device->name[6], device->name[7],
++	    device->wwn[0], device->wwn[1],
++	    device->wwn[2], device->wwn[3],
++	    device->wwn[4], device->wwn[5],
++	    device->wwn[6], device->wwn[7],
++	    device->d_id.b.domain, device->d_id.b.area, device->d_id.b.al_pa,
++	    device->loop_id));
++
++	/* Look for device in database. */
++	for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) {
++		if (ha->fc_db[cnt].loop_id == PORT_UNUSED)
++			continue;
++
++		rval = 1;
++		switch (ha->binding_type) {
++		case BIND_BY_PORT_NAME:
++			rval = memcmp(device->wwn,
++			    ha->fc_db[cnt].wwn, WWN_SIZE);
++			break;
++
++		case BIND_BY_PORT_ID:
++			rval = (device->d_id.b24 != ha->fc_db[cnt].d_id.b24);
++			break;
++
++		case BIND_BY_NODE_NAME:
++			rval = memcmp(device->name,
++			    ha->fc_db[cnt].name, WWN_SIZE);
++			break;
++		}
++		if (rval)
++			continue;
++
++		DEBUG(printk("scsi(%ld): Reusing slot %d for device "
++		    "%02x%02x%02x%02x%02x%02x%02x%02x\n",
++		    ha->host_no, cnt,
++		    device->wwn[0],
++		    device->wwn[1],
++		    device->wwn[2],
++		    device->wwn[3],
++		    device->wwn[4],
++		    device->wwn[5],
++		    device->wwn[6],
++		    device->wwn[7]));
++
++		if (device->flag & DEV_PUBLIC) {
++			ha->fc_db[cnt].flag |= DEV_PUBLIC;
++		} else {
++			if (ha->fc_db[cnt].flag & DEV_PUBLIC) {
++				ha->fc_db[cnt].flag &= ~DEV_PUBLIC;
++				ha->fabricid[ha->fc_db[cnt].loop_id].in_use 
++				    = FALSE;
++			}
++		}
++
++		ha->fc_db[cnt].loop_id = device->loop_id;
++		ha->fc_db[cnt].d_id.b24 = device->d_id.b24;
++
++		/* Update volatile unbound fields for PortID binding only */
++		if (ha->binding_type == BIND_BY_PORT_ID) {
++			memcpy(ha->fc_db[cnt].name, device->name, WWN_SIZE);
++			memcpy(ha->fc_db[cnt].wwn, device->wwn, WWN_SIZE);
++		}
++
++		return (0);
++	}
++
++	/* Find a empty slot and add device into database. */
++	for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
++
++/* FlexServ Patch */
++#if QLA2XXX_HOTSWAP_ENUMERATION
++		/*
++		 * Enumerate upon the actual ID so add-single-device works
++		 */
++		if (i != device->loop_id) {
++			continue;
++		}
++#endif
++
++		if ((ha->fc_db[i].loop_id == PORT_UNUSED) ||
++			(ha->fc_db[i].loop_id == PORT_NEED_MAP)) {
++
++			DEBUG(printk("scsi(%ld): New slot %d for device "
++			    "%02x%02x%02x%02x%02x%02x%02x%02x\n",
++			    ha->host_no, i,
++			    device->wwn[0],
++			    device->wwn[1],
++			    device->wwn[2],
++			    device->wwn[3],
++			    device->wwn[4],
++			    device->wwn[5],
++			    device->wwn[6],
++			    device->wwn[7]));
++
++			memcpy(ha->fc_db[i].name, device->name, WWN_SIZE);
++ 			memcpy(ha->fc_db[i].wwn, device->wwn, WWN_SIZE);
++			ha->fc_db[i].loop_id = device->loop_id;
++			ha->fc_db[i].d_id.b24 = device->d_id.b24;
++
++			if (device->flag & DEV_PUBLIC)
++				ha->fc_db[i].flag |= DEV_PUBLIC;
++
++			ha->flags.updated_fc_db = TRUE;
++
++			return (0);
++		}
++	}
++
++	if (enable_slot_reuse) {
++		for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
++			if (ha->fc_db[i].loop_id == PORT_AVAILABLE) {
++				DEBUG(printk("scsi(%ld): Assigned slot %d "
++				    "reuse for device "
++				    "%02x%02x%02x%02x%02x%02x%02x%02x\n",
++				    ha->host_no, i, 
++				    device->wwn[0],
++				    device->wwn[1],
++				    device->wwn[2],
++				    device->wwn[3],
++				    device->wwn[4],
++				    device->wwn[5],
++				    device->wwn[6],
++				    device->wwn[7]));
++
++				memcpy(ha->fc_db[i].name,
++				    device->name, WWN_SIZE);
++				memcpy(ha->fc_db[i].wwn,
++				    device->wwn, WWN_SIZE);
++				ha->fc_db[i].loop_id = device->loop_id;
++				ha->fc_db[i].d_id.b24 = device->d_id.b24;
++
++				if (device->flag & DEV_PUBLIC)
++					ha->fc_db[i].flag |= DEV_PUBLIC;
++
++				ha->flags.updated_fc_db = TRUE;
++
++				return (0);
++			}
++		}
++	}
++
++	return(BIT_1);
++}
++
++/*
++ * qla2x00_build_fcport_list
++ *	Updates device on list.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	fcport = port structure pointer.
++ *
++ * Return:
++ *	0  - Success
++ *  BIT_0 - error
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int 
++qla2x00_build_fcport_list(scsi_qla_host_t *ha) 
++{
++// FIXME: FIX THIS C*!P!!!
++	int	rval;
++	fcdev_t		*dev;
++	int	found = 0;
++	int cnt, i;
++	struct list_head	*fcpl;
++	fc_port_t	*fcport;
++
++	ENTER(__func__);
++
++	for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) {
++		dev = &ha->fc_db[cnt];
++
++		/* Skip if zero port name */
++		if (qla2x00_is_wwn_zero(dev->wwn)) {
++			continue;
++		}
++
++		DEBUG3(printk("scsi(%ld): found tgt %d in fc_db.\n",
++		    ha->host_no, cnt));
++
++		/* Check for matching device in port list. */
++		i = 0;
++		found = 0;
++		fcport = NULL;
++		list_for_each(fcpl, &ha->fcports) {
++			fcport = list_entry(fcpl, fc_port_t, list);
++
++			rval = 1;
++			switch (ha->binding_type) {
++				case BIND_BY_PORT_NAME:
++					rval = memcmp(dev->wwn,
++							fcport->port_name,
++							WWN_SIZE);
++					break;
++
++				case BIND_BY_PORT_ID:
++					rval = (dev->d_id.b24 !=
++						 fcport->d_id.b24);
++					break;
++
++				case BIND_BY_NODE_NAME:
++					rval = memcmp(dev->name,
++							fcport->node_name,
++							WWN_SIZE);
++					break;
++			}
++			if (rval) {
++				i++;
++				continue;
++			}
++
++			/*
++			 * Update volatile unbound fields for PortID binding
++			 * only
++			 */
++			if (ha->binding_type == BIND_BY_PORT_ID) {
++				memcpy(fcport->node_name, dev->name, WWN_SIZE);
++				memcpy(fcport->port_name, dev->wwn, WWN_SIZE);
++			}
++
++			DEBUG(printk("%s(): Found matching port %02x%02x%02x, "
++					"device flags= 0x%x\n",
++					__func__,
++					dev->d_id.b.domain,
++					dev->d_id.b.area,
++					dev->d_id.b.al_pa,
++					dev->flag);)
++
++			/* if device found is missing then mark it */
++			if (dev->flag & DEV_ABSENCE) {
++				DEBUG(printk("%s(): Port missing ---  "
++						"(port_name) -> "
++						"%02x%02x%02x%02x%02x"
++						"%02x%02x%02x, "
++						"loop id = 0x%04x\n",
++						__func__,
++						fcport->port_name[0],
++						fcport->port_name[1],
++						fcport->port_name[2],
++						fcport->port_name[3],
++						fcport->port_name[4],
++						fcport->port_name[5],
++						fcport->port_name[6],
++						fcport->port_name[7],
++						fcport->loop_id);)
++
++				fcport->loop_id = FC_NO_LOOP_ID;
++
++				qla2x00_mark_device_lost(ha, fcport);
++
++				found++;
++				break;
++			}
++
++			/* if device was missing but returned */
++			if (fcport->loop_id == FC_NO_LOOP_ID ||
++				!(dev->flag & DEV_PUBLIC) ||
++				atomic_read(&fcport->state) != FC_ONLINE) {
++
++				DEBUG(printk("%s(): Port returned +++  "
++						"(port_name) -> "
++						"%02x%02x%02x%02x%02x"
++						"%02x%02x%02x, "
++						"loop id = 0x%04x\n",
++						__func__,
++						fcport->port_name[0],
++						fcport->port_name[1],
++						fcport->port_name[2],
++						fcport->port_name[3],
++						fcport->port_name[4],
++						fcport->port_name[5],
++						fcport->port_name[6],
++						fcport->port_name[7],
++						fcport->loop_id);)
++
++				fcport->loop_id = dev->loop_id;
++				fcport->old_loop_id = dev->loop_id;
++				fcport->d_id.b24 = dev->d_id.b24;
++
++				if (qla2x00_update_fcport(ha, fcport, cnt)) {
++					DEBUG2(printk("%s(%ld): update_fcport "
++							"failed.\n",
++							__func__,
++							ha->host_no);)
++
++					return BIT_0;
++				}
++
++				found++;
++				break;
++			}
++
++			DEBUG(printk("%s(): Match - fcport[%d] = fc_db[%d] "
++					"(ignored) -> "
++					"%02x%02x%02x%02x%02x%02x%02x%02x, "
++					"loop id = 0x%04x\n",
++					__func__,
++					i, 
++					cnt,
++					fcport->port_name[0],
++					fcport->port_name[1],
++					fcport->port_name[2],
++					fcport->port_name[3],
++					fcport->port_name[4],
++					fcport->port_name[5],
++					fcport->port_name[6],
++					fcport->port_name[7],
++					fcport->loop_id);)
++
++			fcport->loop_id = dev->loop_id;
++			fcport->old_loop_id = dev->loop_id;
++
++			found++;
++			break;
++		}
++		if (found)
++			continue;
++
++		/* Add device to port list. */
++		DEBUG3(printk("%s(%ld): adding new device to list.\n",
++				__func__,
++				ha->host_no);)
++
++		fcport = kmalloc(sizeof(fc_port_t), GFP_ATOMIC);
++		if (fcport == NULL)
++			break;
++
++		memset(fcport, 0, sizeof(fc_port_t));
++
++		INIT_LIST_HEAD(&fcport->fcluns);
++
++		/* copy fields into fcport */
++		memcpy(fcport->port_name, dev->wwn, WWN_SIZE);
++		memcpy(fcport->node_name, dev->name, WWN_SIZE);
++
++		fcport->dev_id = cnt;
++
++		if (dev->flag & DEV_ABSENCE) {
++			DEBUG(printk("%s(): Port missing --- "
++					"(port_name) -> "
++					"%02x%02x%02x%02x"
++					"%02x%02x%02x%02x, "
++					"loop id = 0x%04x\n",
++					__func__,
++					fcport->port_name[0],
++					fcport->port_name[1],
++					fcport->port_name[2],
++					fcport->port_name[3],
++					fcport->port_name[4],
++					fcport->port_name[5],
++					fcport->port_name[6],
++					fcport->port_name[7],
++					fcport->loop_id);)
++
++ 			fcport->loop_id = FC_NO_LOOP_ID;
++ 
++ 			qla2x00_mark_device_lost(ha, fcport);
++ 		} else {
++ 			fcport->loop_id = dev->loop_id;
++ 			fcport->old_loop_id = dev->loop_id;
++ 		}
++ 
++ 		fcport->d_id.b24 = dev->d_id.b24;
++ 
++ 		DEBUG(printk("%s(): New Device +++ (port_name) -> "
++ 				"%02x%02x%02x%02x%02x%02x%02x%02x, "
++ 				"loop id = 0x%04x\n",
++ 				__func__,
++ 				fcport->port_name[0],
++ 				fcport->port_name[1],
++ 				fcport->port_name[2],
++ 				fcport->port_name[3],
++ 				fcport->port_name[4],
++ 				fcport->port_name[5],
++ 				fcport->port_name[6],
++ 				fcport->port_name[7],
++ 				fcport->loop_id);)
++ 
++ 		/* flags */
++ 		if (dev->flag & DEV_PUBLIC)
++ 			fcport->flags |= FC_FABRIC_DEVICE;
++ 
++ 		if (dev->flag & DEV_INITIATOR)
++ 			fcport->flags |= FC_INITIATOR_DEVICE;
++ 
++ 		/* Assume the device supports RLC */
++ 		fcport->flags |= FC_SUPPORT_RPT_LUNS;
++ 
++ 		if (!ha->flags.failover_enabled)
++ 			qla2x00_get_lun_mask_from_config(ha, fcport, cnt, 0);
++ 
++ 		/* Add to our list */
++ 		list_add_tail(&fcport->list, &ha->fcports);
++ 
++ 		if (qla2x00_update_fcport(ha, fcport, cnt)) {
++ 			DEBUG2(printk("%s(%ld): update_fcport failed.\n",
++ 					__func__,
++ 					ha->host_no);)
++ 
++ 			return BIT_0;
++		}
++	}
++
++	LEAVE(__func__);
++
++	return (0);
++}
++
++/*
++ * qla2x00_config_os
++ *	Setup OS target and LUN structures.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static void
++qla2x00_config_os(scsi_qla_host_t *ha) 
++{
++	struct list_head	*fcpl;
++	fc_port_t	*fcport;
++	struct list_head	*fcll;
++	fc_lun_t	*fclun;
++	os_lun_t	*lq;
++	uint16_t	t, l;
++
++
++	DEBUG3(printk("%s(%ld): entered.\n", __func__, ha->host_no);)
++
++	list_for_each(fcpl, &ha->fcports) {
++		fcport = list_entry(fcpl, fc_port_t, list);
++
++		/* Allocate target */
++#if 0
++		if (fcport->loop_id == FC_NO_LOOP_ID)
++			continue;
++#endif
++
++		/* Bind fcport to target number. */
++		DEBUG5(printk("%s(%ld): fcport bind= %p\n",
++				__func__,
++				ha->host_no, fcport);)
++
++		if ((t = qla2x00_fcport_bind(ha, fcport)) == MAX_TARGETS)
++			continue;
++
++#if VSA
++		if ((ha->fc_db[t].flag & DEV_FLAG_VSA))
++			fcport->flags |= FC_VSA;
++#endif
++		DEBUG5(printk("%s(%ld): going to alloc lun for tgt %d. mask="
++				"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
++				"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
++				"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
++				".\n",
++				__func__,
++				ha->host_no, 
++				t, 
++				fcport->lun_mask.mask[0],
++				fcport->lun_mask.mask[1],
++				fcport->lun_mask.mask[2],
++				fcport->lun_mask.mask[3],
++				fcport->lun_mask.mask[4],
++				fcport->lun_mask.mask[5],
++				fcport->lun_mask.mask[6],
++				fcport->lun_mask.mask[7],
++				fcport->lun_mask.mask[8],
++				fcport->lun_mask.mask[9],
++				fcport->lun_mask.mask[10],
++				fcport->lun_mask.mask[11],
++				fcport->lun_mask.mask[12],
++				fcport->lun_mask.mask[13],
++				fcport->lun_mask.mask[14],
++				fcport->lun_mask.mask[15],
++				fcport->lun_mask.mask[16],
++				fcport->lun_mask.mask[17],
++				fcport->lun_mask.mask[18],
++				fcport->lun_mask.mask[19],
++				fcport->lun_mask.mask[20],
++				fcport->lun_mask.mask[21],
++				fcport->lun_mask.mask[22],
++				fcport->lun_mask.mask[23],
++				fcport->lun_mask.mask[24],
++				fcport->lun_mask.mask[25],
++				fcport->lun_mask.mask[26],
++				fcport->lun_mask.mask[27],
++				fcport->lun_mask.mask[28],
++				fcport->lun_mask.mask[29],
++				fcport->lun_mask.mask[30],
++				fcport->lun_mask.mask[31]);)
++
++		/* Allocate LUNs */
++		list_for_each(fcll, &fcport->fcluns) {
++			fclun = list_entry(fcll, fc_lun_t, list);
++
++			l = fclun->lun;		/* Must not exceed MAX_LUN */
++
++			/*
++			 * Always alloc LUN 0 so kernel will scan past LUN 0.
++			 */
++			if (l != 0 &&
++			    (EXT_IS_LUN_BIT_SET(&(fcport->lun_mask), l))) {
++
++				/* mask this LUN */
++				continue;
++			}
++
++			if ((lq = qla2x00_lun_alloc(ha, t, l)) == NULL)
++				continue;
++
++			lq->fclun = fclun;
++		}
++	}
++
++	DEBUG3(printk("%s(%ld): exiting normally.\n", __func__, ha->host_no);)
++}
++
++/*
++ * qla2x00_fcport_bind
++ *	Locates a target number for FC port.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	fcport = FC port structure pointer.
++ *
++ * Returns:
++ *	target number
++ *
++ * Context:
++ *	Kernel context.
++ */
++static uint16_t
++qla2x00_fcport_bind(scsi_qla_host_t *ha, fc_port_t *fcport) 
++{
++	int		rval;
++	uint16_t	t;
++	os_tgt_t	*tq;
++
++	ENTER(__func__);
++
++	/* Check for tgt already allocated for persistent binding. */
++	for (t = 0; t < MAX_TARGETS; t++) {
++		if ((tq = TGT_Q(ha, t)) == NULL)
++			continue;
++
++		rval = 0;
++		switch (ha->binding_type) {
++		case BIND_BY_PORT_NAME:
++			rval = memcmp(fcport->port_name,
++			    tq->port_name, WWN_SIZE);
++			break;
++
++		case BIND_BY_PORT_ID:
++			rval = (fcport->d_id.b24 != tq->d_id.b24);
++			break;
++
++		case BIND_BY_NODE_NAME:
++			rval = memcmp(fcport->node_name,
++			    tq->node_name, WWN_SIZE);
++			break;
++		}
++		/* Found a persistently bound match */
++		if (rval == 0)
++			break;
++	}
++
++	if (fcport->loop_id == FC_NO_LOOP_ID) {
++		DEBUG(tq = TGT_Q(ha, t);)
++		DEBUG(printk("scsi%ld: Missing target ID %02x @ %p to "
++				"loop id: %04x, port state=0x%x, "
++				"port down retry=%d\n",
++				ha->host_no,
++				t,
++				tq,
++				fcport->loop_id,
++				atomic_read(&fcport->state),
++				atomic_read(&fcport->port_down_timer));)
++		return (MAX_TARGETS);
++	}
++
++	if (t != MAX_TARGETS) {
++		tq = TGT_Q(ha, t);
++		tq->vis_port = fcport;
++
++		DEBUG(printk("scsi%ld: Assigning target ID %02x @ %p to "
++				"loop id: %04x, port state=0x%x, "
++				"port down retry=%d\n",
++				ha->host_no,
++				t,
++				tq,
++				fcport->loop_id,
++				atomic_read(&fcport->state),
++				atomic_read(&fcport->port_down_timer));)
++		return (t);
++	}
++
++	/* Check for persistent binding not yet configured. */
++	for (t = 0; t < MAX_TARGETS; t++) {
++		rval = 0;
++		switch (ha->binding_type) {
++			case BIND_BY_PORT_NAME:
++				rval = memcmp(fcport->port_name,
++						ha->fc_db[t].wwn, WWN_SIZE);
++				break;
++
++			case BIND_BY_PORT_ID:
++				rval = (fcport->d_id.b24 !=
++						ha->fc_db[t].d_id.b24);
++				break;
++
++			case BIND_BY_NODE_NAME:
++				rval = memcmp(fcport->node_name,
++						ha->fc_db[t].name, WWN_SIZE);
++				break;
++		}
++		/* Found not-yet-allocated target at t */
++		if (rval == 0)
++			break;
++	}
++
++	if (t == MAX_TARGETS) {
++		/* Check if slot at loop ID is available. */
++		t = fcport->loop_id;
++		if (TGT_Q(ha, t) != NULL) {
++			/* Locate first free target id in db for device. */
++			for (t = 0; t < MAX_TARGETS; t++) {
++				if (TGT_Q(ha, t) == NULL)
++					break;
++			}
++		}
++	}
++
++	if (t != MAX_TARGETS) {
++	       	tq = qla2x00_tgt_alloc(ha, t);
++		if (tq != NULL) {
++			memcpy(tq->port_name, fcport->port_name, WWN_SIZE);
++			tq->d_id.b24 = fcport->d_id.b24;
++			memcpy(tq->node_name, fcport->node_name, WWN_SIZE);
++		}
++		else
++			t = MAX_TARGETS;
++	}
++
++	if (t == MAX_TARGETS) {
++		DEBUG2(printk("%s(): **** FAILED ****", __func__);)
++		printk(KERN_WARNING
++			"%s(): **** FAILED ****", __func__);
++	} else {
++		if (!ha->flags.failover_enabled) {
++			/* fcport IS the visible port in non-failover mode */
++			tq = TGT_Q(ha, t);
++			tq->vis_port = fcport;
++		}
++
++		DEBUG(tq = TGT_Q(ha, t);)
++		DEBUG(printk("scsi%ld: Assigning target ID %02x @ %p to "
++				"loop id: %04x, port state=0x%x, "
++				"port down retry=%d\n",
++				ha->host_no,
++				t,
++				tq,
++				fcport->loop_id,
++				atomic_read(&fcport->state),
++				atomic_read(&fcport->port_down_timer));)
++	}
++
++	LEAVE(__func__);
++
++	return (t);
++}
++
++/*
++ * qla2x00_update_fcport
++ *	Updates device on list.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	fcport = port structure pointer.
++ *
++ * Return:
++ *	0  - Success
++ *  BIT_0 - error
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_update_fcport(scsi_qla_host_t *ha, fc_port_t *fcport, int index) 
++{
++	DEBUG4(printk("%s(): entered, loop_id = %d\n",
++			__func__,
++			fcport->loop_id);)
++
++	fcport->port_login_retry_count =
++	    ha->port_down_retry_count * PORT_RETRY_TIME;
++	atomic_set(&fcport->state, FC_ONLINE);
++	fcport->login_retry = 0;
++	fcport->ha = ha;
++	atomic_set(&fcport->port_down_timer,
++	    ha->port_down_retry_count * PORT_RETRY_TIME);
++
++	/* Do LUN discovery. */
++	return (qla2x00_lun_discovery(ha, fcport, index));
++}
++
++/*
++ * qla2x00_lun_discovery
++ *	Issue SCSI inquiry command for LUN discovery.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	fcport = FC port structure pointer.
++ *
++ * Return:
++ *	0  - Success
++ *  BIT_0 - error
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_lun_discovery(scsi_qla_host_t *ha, fc_port_t *fcport, int index) 
++{
++	inq_cmd_rsp_t	*pkt;
++	int		rval;
++	uint16_t	lun;
++	struct list_head	*fcll;
++	fc_lun_t	*fclun;
++	int		found;
++	dma_addr_t	phys_address = 0;
++	int		disconnected;
++	int		retry;
++	fcdev_t		dev;
++	int		rlc_succeeded;
++	uint16_t	comp_status;
++	uint16_t	scsi_status;
++
++	ENTER(__func__);
++
++	/* 
++	 * Immediately issue a RLC to the fcport
++	 */
++	rlc_succeeded = 0;
++	if (qla2x00_rpt_lun_discovery(ha, fcport) == QLA2X00_SUCCESS) {
++		/* 
++		 * We always need at least LUN 0 to be present in our fclun
++		 * list if RLC succeeds.
++		 */
++		qla2x00_cfg_lun(fcport, 0);
++		/* 
++		 * At least do an inquiry on LUN 0 to determine peripheral
++		 * qualifier type.
++		 */
++		rlc_succeeded = 1;
++	}
++
++	/*
++	 * RLC failed for some reason, try basic inquiries
++	 */
++	pkt = pci_alloc_consistent(ha->pdev,
++	    sizeof(inq_cmd_rsp_t), &phys_address);
++	if (pkt == NULL) {
++		printk(KERN_WARNING
++		    "scsi(%ld): Memory Allocation failed - INQ\n",
++		    ha->host_no);
++
++		ha->mem_err++;
++		return BIT_0;
++	}
++
++	for (lun = 0; lun < ha->max_probe_luns; lun++) {
++		retry = 2;
++		do {
++			memset(pkt, 0, sizeof(inq_cmd_rsp_t));
++			pkt->p.cmd.entry_type = COMMAND_A64_TYPE;
++			pkt->p.cmd.entry_count = 1;
++			pkt->p.cmd.lun = cpu_to_le16(lun);
++#if defined(EXTENDED_IDS)
++			pkt->p.cmd.target = cpu_to_le16(fcport->loop_id & 0xFF);
++#else
++			pkt->p.cmd.target = (uint8_t)fcport->loop_id;
++#endif
++			pkt->p.cmd.control_flags =
++			    __constant_cpu_to_le16(CF_READ | CF_SIMPLE_TAG);
++			pkt->p.cmd.scsi_cdb[0] = INQ_SCSI_OPCODE;
++			pkt->p.cmd.scsi_cdb[4] = INQ_DATA_SIZE;
++			pkt->p.cmd.dseg_count = __constant_cpu_to_le16(1);
++			pkt->p.cmd.timeout = __constant_cpu_to_le16(10);
++			pkt->p.cmd.byte_count =
++			    __constant_cpu_to_le32(INQ_DATA_SIZE);
++			pkt->p.cmd.dseg_0_address[0] = cpu_to_le32(
++			    LSD(phys_address + sizeof(sts_entry_t)));
++			pkt->p.cmd.dseg_0_address[1] = cpu_to_le32(
++			    MSD(phys_address + sizeof(sts_entry_t)));
++			pkt->p.cmd.dseg_0_length =
++			    __constant_cpu_to_le32(INQ_DATA_SIZE);
++
++			DEBUG5(printk("scsi(%ld): Lun Inquiry - fcport=%p,"
++			    " lun (%d)\n",
++			    ha->host_no, fcport, lun));
++
++			rval = qla2x00_issue_iocb(ha,
++			    pkt, phys_address, sizeof(inq_cmd_rsp_t));
++
++			comp_status = le16_to_cpu(pkt->p.rsp.comp_status);
++			scsi_status = le16_to_cpu(pkt->p.rsp.scsi_status);
++
++			DEBUG5(printk("scsi(%ld): lun (%d) inquiry - "
++			    "inq[0]= 0x%x, comp status 0x%x, scsi status 0x%x, "
++			    "rval=%d\n",
++			    ha->host_no,
++			    lun, pkt->inq[0],
++			    comp_status, scsi_status, rval));
++
++			/* if port not logged in then try and login */
++			if (lun == 0 && comp_status == CS_PORT_LOGGED_OUT) {
++				memset(&dev, 0, sizeof (dev));
++				dev.d_id.b24 = ha->fc_db[index].d_id.b24;
++
++				/* login and update database */
++				if (qla2x00_fabric_login(ha, &dev) == 0)
++					ha->fc_db[index].loop_id = dev.loop_id;
++			}
++		} while ((rval != QLA2X00_SUCCESS ||
++		    comp_status != CS_COMPLETE) && retry--);
++
++		if (rval != QLA2X00_SUCCESS ||
++		    comp_status != CS_COMPLETE ||
++		    (scsi_status & SS_CHECK_CONDITION)) {
++
++			DEBUG(printk("scsi(%ld): Failed lun inquiry - "
++			    "inq[0]= 0x%x, comp status 0x%x, scsi status 0x%x. "
++			    "loop_id=%d\n",
++			    ha->host_no,
++			    pkt->inq[0],
++			    comp_status, scsi_status,
++			    fcport->loop_id));
++
++			break;
++		}
++
++		disconnected = 0;
++
++		/*
++		 * We only need to issue an inquiry on LUN 0 to determine the
++		 * port's peripheral qualifier type
++		 */
++		if (rlc_succeeded == 1) {
++			if (pkt->inq[0] == 0 || pkt->inq[0] == 0xc) {
++				fcport->flags &= ~(FC_TAPE_DEVICE);
++				ha->fc_db[index].flag &= ~DEV_TAPE_DEVICE;
++			} else if (pkt->inq[0] == 1 || pkt->inq[0] == 8) {
++				fcport->flags |= FC_TAPE_DEVICE;
++				ha->fc_db[index].flag |= DEV_TAPE_DEVICE;
++			}
++
++			/* Stop the scan */
++			break;
++		}
++
++		/* inq[0] ==:
++		 *	 0x0- Hard Disk.
++		 *	 0xc- is a processor device.	
++		 *	 0x1- is a Tape Device.
++		 *       0x8- is a medium changer device
++		 * 	      which is basically a Tape device.
++		 */
++		if (pkt->inq[0] == 0 || pkt->inq[0] == 0xc) {
++			fcport->flags &= ~(FC_TAPE_DEVICE);
++			ha->fc_db[index].flag &= ~DEV_TAPE_DEVICE;
++		} else if (pkt->inq[0] == 1 || pkt->inq[0] == 8) {
++			fcport->flags |= FC_TAPE_DEVICE;
++			ha->fc_db[index].flag |= DEV_TAPE_DEVICE;
++		} else if (pkt->inq[0] == 0x20 || pkt->inq[0] == 0x7f) {
++			disconnected++;
++		} else {
++			continue;
++		}
++		
++		/* Allocate LUN if not already allocated. */
++		found = 0;
++		list_for_each(fcll, &fcport->fcluns) {
++			fclun = list_entry(fcll, fc_lun_t, list);
++
++			if (fclun->lun == lun) {
++				found++;
++				break;
++			}
++		}
++		if (found)
++			continue;
++
++		/* Add this lun to our list */
++		fclun = kmalloc(sizeof(fc_lun_t), GFP_ATOMIC);
++		if (fclun != NULL) {
++			fcport->lun_cnt++;
++			/* Setup LUN structure. */
++			memset(fclun, 0, sizeof(fc_lun_t));
++
++			fclun->fcport = fcport;
++			fclun->lun = lun;
++
++			if (disconnected)
++				fclun->flags |= FC_DISCON_LUN;
++
++			list_add_tail(&fclun->list, &fcport->fcluns);
++
++			DEBUG5(printk("scsi(%ld): Allocated fclun %p, lun=%d"
++			    "disconnected=%d\n",
++			    ha->host_no,
++			    fclun,
++			    fclun->lun,
++			    disconnected));
++		} else {
++			printk(KERN_WARNING
++			    "scsi(%ld): Memory Allocation failed - fclun\n",
++			    ha->host_no);
++
++			ha->mem_err++;
++			pci_free_consistent(ha->pdev,
++			    sizeof(inq_cmd_rsp_t), pkt, phys_address);
++
++			return BIT_0;
++		}
++
++	}
++
++	DEBUG(printk("scsi(%ld): fcport lun count=%d, fcport= %p\n",
++	    ha->host_no, fcport->lun_cnt, fcport));
++
++	pci_free_consistent(ha->pdev, sizeof(inq_cmd_rsp_t), pkt, phys_address);
++
++	LEAVE(__func__);
++
++	return 0;
++}
++
++/*
++ * qla2x00_rpt_lun_discovery
++ *	Issue SCSI report LUN command for LUN discovery.
++ *
++ * Input:
++ *	ha:		adapter state pointer.
++ *	fcport:		FC port structure pointer.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_rpt_lun_discovery(scsi_qla_host_t *ha, fc_port_t *fcport) 
++{
++	rpt_lun_cmd_rsp_t	*pkt;
++	dma_addr_t		phys_address = 0;
++	int			rval;
++	uint32_t		len, cnt;
++	uint8_t			retries;
++	uint16_t		lun;
++	uint16_t		comp_status;
++	uint16_t		scsi_status;
++
++	ENTER(__func__);
++
++	/* Assume a failed status */
++	rval = QLA2X00_FAILED;
++
++	/* No point in continuing if the device doesn't support RLC */
++	if (!(fcport->flags & FC_SUPPORT_RPT_LUNS))
++		return (rval);
++
++	pkt = pci_alloc_consistent(ha->pdev,
++	    sizeof(rpt_lun_cmd_rsp_t), &phys_address);
++	if (pkt == NULL) {
++		printk(KERN_WARNING
++			"scsi(%ld): Memory Allocation failed - RLC",
++			ha->host_no);
++
++		ha->mem_err++;
++		return BIT_0;
++	}
++
++	for (retries = 4; retries; retries--) {
++		memset(pkt, 0, sizeof(rpt_lun_cmd_rsp_t));
++		pkt->p.cmd.entry_type = COMMAND_A64_TYPE;
++		pkt->p.cmd.entry_count = 1;
++#if defined(EXTENDED_IDS)
++		pkt->p.cmd.target = cpu_to_le16(fcport->loop_id & 0xFF);
++#else
++		pkt->p.cmd.target = (uint8_t)fcport->loop_id;
++#endif
++		pkt->p.cmd.control_flags =
++		    __constant_cpu_to_le16(CF_READ | CF_SIMPLE_TAG);
++		pkt->p.cmd.scsi_cdb[0] = RPT_LUN_SCSI_OPCODE;
++		pkt->p.cmd.scsi_cdb[8] = MSB(sizeof(rpt_lun_lst_t));
++		pkt->p.cmd.scsi_cdb[9] = LSB(sizeof(rpt_lun_lst_t));
++		pkt->p.cmd.dseg_count = __constant_cpu_to_le16(1);
++		pkt->p.cmd.timeout = __constant_cpu_to_le16(10);
++		pkt->p.cmd.byte_count =
++		    __constant_cpu_to_le32(sizeof(rpt_lun_lst_t));
++		pkt->p.cmd.dseg_0_address[0] = cpu_to_le32(
++		    LSD(phys_address + sizeof(sts_entry_t)));
++		pkt->p.cmd.dseg_0_address[1] = cpu_to_le32(
++		    MSD(phys_address + sizeof(sts_entry_t)));
++		pkt->p.cmd.dseg_0_length =
++		    __constant_cpu_to_le32(sizeof(rpt_lun_lst_t));
++
++		rval = qla2x00_issue_iocb(ha,
++		    pkt, phys_address, sizeof(rpt_lun_cmd_rsp_t));
++
++		comp_status = le16_to_cpu(pkt->p.rsp.comp_status);
++		scsi_status = le16_to_cpu(pkt->p.rsp.scsi_status);
++
++		if (rval != QLA2X00_SUCCESS ||
++		    comp_status != CS_COMPLETE ||
++		    scsi_status & SS_CHECK_CONDITION) {
++
++			/* Device underrun, treat as OK. */
++			if (comp_status == CS_DATA_UNDERRUN &&
++			    scsi_status & SS_RESIDUAL_UNDER) {
++
++				rval = QLA2X00_SUCCESS;
++				break;
++			}
++
++			DEBUG(printk("scsi(%ld): RLC failed to issue iocb! "
++			    "fcport = %p rval = %x cs = %x ss = %x\n",
++			    ha->host_no,
++			    fcport,
++			    rval, comp_status, scsi_status));
++
++			rval = QLA2X00_FAILED;
++			if (scsi_status & SS_CHECK_CONDITION) {
++				DEBUG2(printk("scsi(%ld): RLC "
++				    "SS_CHECK_CONDITION Sense Data "
++				    "%02x %02x %02x %02x %02x %02x %02x %02x\n",
++				    ha->host_no,
++				    pkt->p.rsp.req_sense_data[0],
++				    pkt->p.rsp.req_sense_data[1],
++				    pkt->p.rsp.req_sense_data[2],
++				    pkt->p.rsp.req_sense_data[3],
++				    pkt->p.rsp.req_sense_data[4],
++				    pkt->p.rsp.req_sense_data[5],
++				    pkt->p.rsp.req_sense_data[6],
++				    pkt->p.rsp.req_sense_data[7]));
++				/* No point in retrying if ILLEGAL REQUEST */
++				if (pkt->p.rsp.req_sense_data[2] ==
++				    ILLEGAL_REQUEST) {
++					/* Clear RLC support flag */
++					fcport->flags &= ~(FC_SUPPORT_RPT_LUNS);
++					break;
++				}
++			}
++		} else {
++			break;
++		}
++	}
++
++	/* Test for report LUN failure. */
++	if (rval == QLA2X00_SUCCESS) {
++		/* Configure LUN list. */
++		len = be32_to_cpu(pkt->list.hdr.len);
++		len /= 8;
++		if (len == 0) {
++			rval = QLA2X00_FAILED;
++		} else {
++			for (cnt = 0; cnt < len; cnt++) {
++				lun = CHAR_TO_SHORT(pkt->list.lst[cnt].lsb,
++				    pkt->list.lst[cnt].msb.b);
++
++				DEBUG3(printk("scsi(%ld): RLC lun = (%d)\n",
++				    ha->host_no, lun));
++
++				/* We only support 0 through MAX_LUNS-1 range */
++				if (lun < MAX_LUNS) {
++					qla2x00_cfg_lun(fcport, lun);
++				}
++			}
++			rval = QLA2X00_SUCCESS;
++		}
++	} else {
++		rval = QLA2X00_FAILED;
++	}
++
++	pci_free_consistent(ha->pdev,
++	    sizeof(rpt_lun_cmd_rsp_t), pkt, phys_address);
++
++
++	LEAVE(__func__);
++
++	return (rval);
++}
++
++/*
++ * qla2x00_cfg_lun
++ *	Configures LUN into fcport LUN list.
++ *
++ * Input:
++ *	fcport:		FC port structure pointer.
++ *	lun:		LUN number.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static void
++qla2x00_cfg_lun(fc_port_t *fcport, uint16_t lun) 
++{
++	int			found;
++	struct list_head	*fcll;
++	fc_lun_t		*fclun;
++
++	/* Allocate LUN if not already allocated. */
++	found = 0;
++	list_for_each(fcll, &fcport->fcluns) {
++		fclun = list_entry(fcll, fc_lun_t, list);
++
++		if (fclun->lun == lun) {
++			found++;
++			break;
++		}
++	}
++	if (!found) {
++		fclun = kmalloc(sizeof(fc_lun_t), GFP_ATOMIC);
++		if (fclun != NULL) {
++			fcport->lun_cnt++;
++			/* Setup LUN structure. */
++			memset(fclun, 0, sizeof(fc_lun_t));
++			fclun->fcport = fcport;
++			fclun->lun = lun;
++			/* How dow we assign the following */
++			/*  fclun->state = FCS_ONLINE; */
++
++			list_add_tail(&fclun->list, &fcport->fcluns);
++		} else {
++			printk(KERN_WARNING
++				"%s(): Memory Allocation failed - FCLUN\n",
++				__func__);
++		}
++	}
++}
++
++/*
++ * qla2x00_tgt_alloc
++ *	Allocate and pre-initialize target queue.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	t = SCSI target number.
++ *
++ * Returns:
++ *	NULL = failure
++ *
++ * Context:
++ *	Kernel context.
++ */
++os_tgt_t *
++qla2x00_tgt_alloc(scsi_qla_host_t *ha, uint16_t t) 
++{
++	os_tgt_t	*tq;
++
++	ENTER(__func__);
++
++	/*
++	 * If SCSI addressing OK, allocate TGT queue and lock.
++	 */
++	if (t >= MAX_TARGETS) {
++		DEBUG2(printk("%s(%ld): *** Invalid target number, exiting ***",
++				__func__,
++				ha->host_no);)
++		return (NULL);
++	}
++
++	tq = TGT_Q(ha, t);
++	if (tq == NULL) {
++		tq = kmalloc(sizeof(os_tgt_t), GFP_ATOMIC);
++		if (tq != NULL) {
++			DEBUG(printk("Alloc Target %d @ %p\n", t, tq);)
++
++			memset(tq, 0, sizeof(os_tgt_t));
++			tq->flags = TGT_TAGGED_QUEUE;
++			tq->ha = ha;
++
++			TGT_Q(ha, t) = tq;
++		}
++	}
++	if (tq != NULL) {
++		tq->port_down_retry_count = ha->port_down_retry_count;
++	} else {
++		printk(KERN_WARNING
++			"%s(%ld): Failed to allocate target\n",
++			__func__,
++			ha->host_no);
++		ha->mem_err++;
++	}
++
++	LEAVE(__func__);
++
++	return (tq);
++}
++
++/*
++ * qla2x00_tgt_free
++ *	Frees target and LUN queues.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	t = SCSI target number.
++ *
++ * Context:
++ *	Kernel context.
++ */
++void
++qla2x00_tgt_free(scsi_qla_host_t *ha, uint16_t t) 
++{
++	os_tgt_t	*tq;
++	uint16_t	l;
++
++	ENTER(__func__);
++
++	/*
++	 * If SCSI addressing OK, allocate TGT queue and lock.
++	 */
++	if (t >= MAX_TARGETS) {
++		DEBUG2(printk("%s(): **** FAILED exiting ****", __func__);)
++
++		return;
++	}
++
++	tq = TGT_Q(ha, t);
++	if (tq != NULL) {
++		TGT_Q(ha, t) = NULL;
++		DEBUG(printk("Dealloc target @ %p -- deleted\n", tq);)
++
++		/* Free LUN structures. */
++		for (l = 0; l < MAX_LUNS; l++)
++			qla2x00_lun_free(ha, t, l);
++
++		kfree(tq);
++	}
++
++	LEAVE(__func__);
++
++	return;
++}
++
++/*
++ * qla2x00_lun_alloc
++ *	Allocate and initialize LUN queue.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	t = SCSI target number.
++ *	l = LUN number.
++ *
++ * Returns:
++ *	NULL = failure
++ *
++ * Context:
++ *	Kernel context.
++ */
++os_lun_t *
++qla2x00_lun_alloc(scsi_qla_host_t *ha, uint16_t t, uint16_t l) 
++{
++	os_lun_t	*lq;
++
++	ENTER(__func__);
++
++	/*
++	 * If SCSI addressing OK, allocate LUN queue.
++	 */
++	if (t >= MAX_TARGETS || 
++		l >= MAX_LUNS || 
++		TGT_Q(ha, t) == NULL) {
++
++		DEBUG2(printk("%s(): tgt=%d, tgt_q= %p, lun=%d, "
++				"instance=%ld **** FAILED exiting ****\n",
++				__func__,
++				t,
++				TGT_Q(ha,t),
++				l,
++				ha->instance);)
++
++		return (NULL);
++	}
++
++	lq = LUN_Q(ha, t, l);
++	if (lq == NULL) {
++		lq = kmalloc(sizeof(os_lun_t), GFP_ATOMIC);
++		if (lq != NULL) {
++
++			DEBUG5(printk("Alloc Lun %d @ %p \n",l,lq);)
++
++			memset(lq, 0, sizeof (os_lun_t));
++			LUN_Q(ha, t, l) = lq;
++			/*
++			 * The following lun queue initialization code
++			 * must be duplicated in alloc_ioctl_mem function
++			 * for ioctl_lq.
++			 */
++			lq->q_state = LUN_STATE_READY;
++			spin_lock_init(&lq->q_lock);
++		} else {
++			/*EMPTY*/
++			DEBUG2(printk("%s(): Failed to allocate lun %d ***\n",
++					__func__,
++					l);)
++			printk(KERN_WARNING
++				"scsi(%ld): Memory Allocation failed - FCLUN\n",
++				ha->host_no);
++			ha->mem_err++;
++		}
++	}
++
++	if (lq == NULL) {
++		DEBUG2(printk("%s(): **** FAILED exiting ****\n", __func__);)
++	} else {
++		LEAVE(__func__);
++	}
++
++	return (lq);
++}
++
++/*
++ * qla2x00_lun_free
++ *	Frees LUN queue.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	t = SCSI target number.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static void
++qla2x00_lun_free(scsi_qla_host_t *ha, uint16_t t, uint16_t l) 
++{
++	os_lun_t	*lq;
++
++	ENTER(__func__);
++
++	/*
++	 * If SCSI addressing OK, allocate TGT queue and lock.
++	 */
++	if (t >= MAX_TARGETS || l >= MAX_LUNS) {
++		DEBUG2(printk("%s(): **** FAILED exiting ****", __func__);)
++
++		return;
++	}
++
++	if (TGT_Q(ha, t) != NULL && 
++		(lq = LUN_Q(ha, t, l)) != NULL) {
++
++		LUN_Q(ha, t, l) = NULL;
++		kfree(lq);
++
++		DEBUG3(printk("Dealloc lun @ %p -- deleted\n", lq);)
++	}
++
++	LEAVE(__func__);
++
++	return;
++}
++
++
++/*
++ * qla2x00_get_lun_mask_from_config
++ *      Get lun mask from the configuration parameters.
++ *      Bit order is little endian.
++ *
++ * Input:
++ * ha  -- Host adapter
++ * tgt  -- target/device number
++ * port -- pointer to port
++ */
++static void
++qla2x00_get_lun_mask_from_config(scsi_qla_host_t *ha, 
++		fc_port_t *port, uint16_t tgt, uint16_t dev_no) 
++{
++	char		propbuf[60]; /* size of search string */
++	int		rval, lun, l;
++	lun_bit_mask_t	lun_mask, *mask_ptr = &lun_mask;
++
++	/* Get "target-N-device-N-lun-mask" as a 256 bit lun_mask*/
++	sprintf(propbuf, "scsi-qla%ld-tgt-%d-di-%d-lun-disabled",
++			ha->instance, tgt, dev_no);
++
++	rval = qla2x00_get_prop_xstr(ha, propbuf, (uint8_t *)&lun_mask,
++			sizeof(lun_bit_mask_t));
++	if (rval != -1 && 
++		(rval == sizeof(lun_bit_mask_t))) {
++
++		DEBUG3(printk("%s(%ld): lun mask for port %p from file:\n",
++				__func__,
++				ha->host_no, 
++				port);)
++		DEBUG3(qla2x00_dump_buffer((uint8_t *)&port->lun_mask,
++					sizeof(lun_bit_mask_t));)
++
++		for (lun = 8 * sizeof(lun_bit_mask_t) - 1, l = 0; 
++			lun >= 0; 
++			lun--, l++) {
++
++			if (EXT_IS_LUN_BIT_SET(mask_ptr, lun))
++				EXT_SET_LUN_BIT((&port->lun_mask),l);
++			else
++				EXT_CLR_LUN_BIT((&port->lun_mask),l);
++		}
++
++		DEBUG3(printk("%s(%ld): returning lun mask for port "
++				"%02x%02x%02x%02x%02x%02x%02x%02x:\n",
++				__func__,
++				ha->host_no, 
++				port->port_name[0], port->port_name[1],
++				port->port_name[2], port->port_name[3],
++				port->port_name[4], port->port_name[5],
++				port->port_name[6], port->port_name[7]);)
++		DEBUG3(qla2x00_dump_buffer((uint8_t *)&port->lun_mask,
++				sizeof(lun_bit_mask_t));)
++	}
++}
++
++/*
++ * qla2x00_bstr_to_hex
++ *	Convert hex byte string to number.
++ *
++ * Input:
++ *	s = byte string pointer.
++ *	bp = byte pointer for number.
++ *	size = number of bytes.
++ *
++ * Context:
++ *	Kernel/Interrupt context.
++ */
++static int
++qla2x00_bstr_to_hex(char *s, uint8_t *bp, int size) 
++{
++	int		cnt;
++	uint8_t		n;
++
++	ENTER(__func__);
++
++	for (cnt = 0; *s != '\0' && cnt / 2 < size; cnt++) {
++		if (*s >= 'A' && *s <= 'F') {
++			n = (*s++ - 'A') + 10;
++		} else if (*s >= 'a' && *s <= 'f') {
++			n = (*s++ - 'a') + 10;
++		} else if (*s >= '0' && *s <= '9') {
++			n = *s++ - '0';
++		} else {
++			cnt = 0;
++			break;
++		}
++
++		if (cnt & BIT_0)
++			*bp++ |= n;
++		else
++			*bp = n << 4;
++	}
++	/* fixme(dg) Need to swap data little endian */
++
++	LEAVE(__func__);
++
++	return (cnt / 2);
++}
++
++/*
++ * qla2x00_get_prop_xstr
++ *      Get a string property value for the specified property name and
++ *      convert from the property string found in the configuration file,
++ *      which are ASCII characters representing nibbles, 2 characters represent
++ *      the hexdecimal value for a byte in the byte array.
++ *      The byte array is initialized to zero.
++ *      The resulting converted value is in big endian format (MSB at byte0).
++ *
++ * Input:
++ *      ha = adapter state pointer.
++ *      propname = property name pointer.
++ *      propval  = pointer where to store converted property val.
++ *      size = max or expected size of 'propval' array.
++ *
++ * Returns:
++ *      0 = empty value string or invalid character in string
++ *      >0 = count of characters converted
++ *      -1 = property not found
++ *
++ * Context:
++ *      Kernel context.
++ */
++int
++qla2x00_get_prop_xstr(scsi_qla_host_t *ha, 
++		char *propname, uint8_t *propval, int size) 
++{
++	char		*propstr;
++	int		rval = -1;
++	static char	buf[LINESIZE];
++
++	ENTER(__func__);
++
++	/* Get the requested property string */
++	rval = qla2x00_find_propname(ha, propname, buf, ha->cmdline, size*2);
++	DEBUG3(printk("%s(): Ret rval from find propname = %d\n",
++			__func__,
++			rval);)
++
++	propstr = &buf[0];
++	if (*propstr == '=')
++		propstr++;   /* ignore equal sign */
++
++	if (rval == 0) {  /* not found */
++		LEAVE(__func__);
++		return (-1);
++	}
++
++	rval = qla2x00_bstr_to_hex(propstr, (uint8_t *)propval, size);
++	if (rval == 0) {
++		/* Invalid character in value string */
++		printk(KERN_INFO
++			"%s(): %s Invalid hex string for property\n",
++			__func__,
++			propname);
++		printk(KERN_INFO
++			" Invalid string - %s\n", 
++			propstr);
++	}
++
++	LEAVE(__func__);
++
++	return (rval);
++}
++
++/*
++ * qla2x00_find_propname
++ *	Get property in database.
++ *
++ * Input:
++ *	ha = adapter structure pointer.
++ *      db = pointer to database
++ *      propstr = pointer to dest array for string
++ *	propname = name of property to search for.
++ *	siz = size of property
++ *
++ * Returns:
++ *	0 = no property
++ *      size = index of property
++ *
++ * Context:
++ *	Kernel context.
++ */
++static uint8_t
++qla2x00_find_propname(scsi_qla_host_t *ha, 
++			char *propname, char *propstr, 
++			char *db, int siz) 
++{
++	char	*cp;
++
++	/* find the specified string */
++	if (db) {
++		/* find the property name */
++		if ((cp = strstr(db,propname)) != NULL) {
++			while ((*cp)  && *cp != '=')
++				cp++;
++			if (*cp) {
++				strncpy(propstr, cp, siz+1);
++				propstr[siz+1] = '\0';
++				DEBUG(printk("qla2x00_find_propname: found "
++						"property = {%s}\n",
++						propstr);)
++				return (siz);   /* match */
++			}
++		}
++	}
++
++	return (0);
++}
++
++
++/*
++ * qla2x00_get_prop_16chars
++ *	Get an 8-byte property value for the specified property name by
++ *      converting from the property string found in the configuration file.
++ *      The resulting converted value is in big endian format (MSB at byte0).
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	propname = property name pointer.
++ *	propval  = pointer to location for the converted property val.
++ *      db = pointer to database
++ *
++ * Returns:
++ *	0 = value returned successfully.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_get_prop_16chars(scsi_qla_host_t *ha,
++				char *propname, char *propval, char *db) 
++{
++	char		*propstr;
++	int		i, k;
++	int		rval;
++	uint8_t		nval;
++	uint8_t		*pchar;
++	uint8_t		*ret_byte;
++	uint8_t		*tmp_byte;
++	uint8_t		*retval = (uint8_t*)propval;
++	uint8_t		tmpval[8] = {0, 0, 0, 0, 0, 0, 0, 0};
++	uint16_t	max_byte_cnt = 8; /* 16 chars = 8 bytes */
++	uint16_t	max_strlen = 16;
++	static char	buf[LINESIZE];
++
++	rval = qla2x00_find_propname(ha, propname, buf, db, max_strlen);
++
++	propstr = &buf[0];
++	if (*propstr == '=')
++		propstr++;   /* ignore equal sign */
++
++	if (rval == 0) {
++		return (1);
++	}
++
++	/* Convert string to numbers. */
++	pchar = (uint8_t *)propstr;
++	tmp_byte = (uint8_t *)tmpval;
++
++	rval = 0;
++	for (i = 0; i < max_strlen; i++) {
++		/*
++		 * Check for invalid character, two at a time,
++		 * then convert them starting with first byte.
++		 */
++
++		if ((pchar[i] >= '0') && (pchar[i] <= '9')) {
++			nval = pchar[i] - '0';
++		} else if ((pchar[i] >= 'A') && (pchar[i] <= 'F')) {
++			nval = pchar[i] - 'A' + 10;
++		} else if ((pchar[i] >= 'a') && (pchar[i] <= 'f')) {
++			nval = pchar[i] - 'a' + 10;
++		} else {
++			/* invalid character */
++			rval = 1;
++			break;
++		}
++
++		if (i & BIT_0) {
++			*tmp_byte = *tmp_byte | nval;
++			tmp_byte++;
++		} else {
++			*tmp_byte = *tmp_byte | nval << 4;
++		}
++	}
++
++	if (rval != 0) {
++		/* Encountered invalid character. */
++		return (rval);
++	}
++
++	/* Copy over the converted value. */
++	ret_byte = retval;
++	tmp_byte = tmpval;
++
++	i = max_byte_cnt;
++	k = 0;
++	while (i--) {
++		*ret_byte++ = *tmp_byte++;
++	}
++
++	/* big endian retval[0]; */
++	return (0);
++}
++
++/*
++* qla2x00_get_properties
++*	Find all properties for the specified adapeter in
++*      command line.
++*
++* Input:
++*	ha = adapter block pointer.
++*	cmdline = pointer to command line string
++*
++* Context:
++*	Kernel context.
++*/
++static void
++qla2x00_get_properties(scsi_qla_host_t *ha, char *cmdline) 
++{
++	static char	propbuf[LINESIZE];
++	uint8_t		tmp_name[8];
++
++	/* Adapter FC node names. */
++	sprintf(propbuf, "scsi-qla%d-adapter-node", (int) ha->instance);
++	qla2x00_get_prop_16chars (ha, 
++			propbuf,
++			(uint8_t *)(&ha->init_cb->node_name), 
++			cmdline);
++
++	sprintf(propbuf, "scsi-qla%d-adapter-port", (int) ha->instance);
++
++	/* DG 04/07 check portname of adapter */
++	qla2x00_get_prop_16chars (ha, 
++			propbuf,
++			tmp_name, 
++			cmdline);
++	if (memcmp(ha->init_cb->port_name, tmp_name, 8) != 0) {
++		/*
++		 * Adapter port name is WWN, and cannot be changed.
++		 * Inform users of the mismatch, then just continue driver
++		 * loading using the original adapter port name in NVRAM.
++		 */
++		printk(KERN_WARNING
++			"qla2x00: qla%ld found mismatch in "
++			"adapter port names.\n",
++			ha->instance);
++		printk(KERN_INFO
++			"       qla%ld port name found in NVRAM "
++			"-> %02x%02x%02x%02x%02x%02x%02x%02x\n",
++			ha->instance,
++			ha->init_cb->port_name[0],
++			ha->init_cb->port_name[1],
++			ha->init_cb->port_name[2],
++			ha->init_cb->port_name[3],
++			ha->init_cb->port_name[4],
++			ha->init_cb->port_name[5],
++			ha->init_cb->port_name[6],
++			ha->init_cb->port_name[7]);
++		printk(KERN_INFO
++			"      qla%ld port name found on command line "
++			"-> %02x%02x%02x%02x%02x%02x%02x%02x\n",
++			ha->instance,
++			tmp_name[0],
++			tmp_name[1],
++			tmp_name[2],
++			tmp_name[3],
++			tmp_name[4],
++			tmp_name[5],
++			tmp_name[6],
++			tmp_name[7]);
++		printk(KERN_INFO
++			"      Using port name from NVRAM.\n");
++	}
++
++	qla2x00_cfg_persistent_binding(ha);
++}
++
++/*
++ * qla2x00_cfg_persistent_binding
++ *	Get driver configuration file target persistent binding entries.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static void
++qla2x00_cfg_persistent_binding(scsi_qla_host_t *ha) 
++{
++	int		rval;
++	static char	propbuf[LINESIZE];
++	uint16_t	tgt;
++	uint16_t	dev_no = 0; /* not used */
++	char		*cmdline = ha->cmdline;
++	port_id_t	d_id, *pd_id;
++	uint8_t		portid[3];
++	uint8_t		node_name[8], *pnn;
++	uint8_t		port_name[8], *ppn;
++	os_tgt_t	*tq;
++
++	ENTER(__func__);
++
++	/* FC name for devices */
++	for (tgt = 0; tgt < MAX_FIBRE_DEVICES; tgt++) {
++
++		/*
++		 * Retrive as much information as possible (PN/PID/NN).
++		 *
++		 * Based on binding type, skip incomplete entries.
++		 */
++		ppn = port_name;
++		sprintf(propbuf, "scsi-qla%d-tgt-%d-di-%d-port",
++				(int)ha->instance, tgt, dev_no);
++		rval = qla2x00_get_prop_16chars(ha, propbuf, ppn, cmdline);
++		if (rval != 0)
++			ppn = NULL;
++		if (ha->binding_type == BIND_BY_PORT_NAME && rval != 0)
++			continue;
++
++		pd_id = &d_id;
++		sprintf(propbuf, "scsi-qla%d-tgt-%d-di-%d-pid",
++				(int)ha->instance, tgt, dev_no);
++		rval = qla2x00_get_prop_xstr(ha,
++				propbuf, portid, sizeof(portid));
++		if (rval == -1 || rval != sizeof(portid))
++			pd_id = NULL;
++		if (ha->binding_type == BIND_BY_PORT_ID &&
++			(rval == -1 || rval != sizeof(portid)))
++			continue;
++
++		pnn = node_name;
++		sprintf(propbuf, "scsi-qla%d-tgt-%d-di-%d-node",
++				(int)ha->instance, tgt, dev_no);
++		rval = qla2x00_get_prop_16chars(ha, propbuf, pnn, cmdline);
++		if (rval != 0)
++			pnn = NULL;
++		if (ha->binding_type == BIND_BY_NODE_NAME && rval != 0)
++			continue;
++
++		tq = qla2x00_tgt_alloc(ha, tgt);
++		if (tq == NULL) {
++			printk(KERN_WARNING
++				"%s(): Unable to allocate memory for target\n",
++				__func__);
++			continue;
++		}
++
++		ha->fc_db[tgt].loop_id = PORT_AVAILABLE;
++		ha->fc_db[tgt].flag = 0;  /* v2.19.05b3 */
++		ha->fc_db[tgt].flag |= DEV_CONFIGURED;
++
++		if (ppn != NULL) {
++			memcpy(tq->port_name, ppn, WWN_SIZE);
++			memcpy(ha->fc_db[tgt].wwn, ppn, WWN_SIZE);
++		}
++		if (pd_id != NULL) {
++			/*
++			 * The portid is read in big-endian format, convert 
++			 * before updating information
++			 */
++			pd_id->r.d_id[0] = portid[2];
++			pd_id->r.d_id[1] = portid[1];
++			pd_id->r.d_id[2] = portid[0];
++			tq->d_id.b24 = pd_id->b24;
++			ha->fc_db[tgt].d_id.b24 = pd_id->b24;
++		}
++		if (pnn != NULL) {
++			memcpy(tq->node_name, pnn, WWN_SIZE);
++			memcpy(ha->fc_db[tgt].name, pnn, WWN_SIZE);
++		}
++
++		DEBUG(printk("Target %03d - configured by user: ",tgt);)
++		switch (ha->binding_type) {
++			case BIND_BY_PORT_NAME:
++				DEBUG(printk("tgt-%03d="
++					"%02x%02x%02x%02x%02x%02x%02x%02x\n",
++					tgt,
++					ppn[0], ppn[1], ppn[2], ppn[3],
++					ppn[4], ppn[5], ppn[6], ppn[7]);)
++				break;
++
++			case BIND_BY_PORT_ID:
++				DEBUG(printk("tgt-%03d=%02x%02x%02x\n",
++					tgt,
++					pd_id->b.domain,
++					pd_id->b.area,
++					pd_id->b.al_pa));
++				break;
++
++			case BIND_BY_NODE_NAME:
++				DEBUG(printk("tgt-%03d="
++					"%02x%02x%02x%02x%02x%02x%02x%02x\n",
++					tgt,
++					pnn[0], pnn[1], pnn[2], pnn[3],
++					pnn[4], pnn[5], pnn[6], pnn[7]);)
++				break;
++		}
++		/* look for VSA */
++#if VSA
++		qla2x00_get_vsa_opt_from_config(ha, tgt, dev_no);
++#endif
++
++	}
++
++	LEAVE(__func__);
++}
++
++/*
++*  qla2x00_abort_isp
++*      Resets ISP and aborts all outstanding commands.
++*
++* Input:
++*      ha           = adapter block pointer.
++*
++* Returns:
++*      0 = success
++*/
++uint8_t
++qla2x00_abort_isp(scsi_qla_host_t *ha, uint8_t flag)
++{
++	unsigned long flags = 0;
++	uint16_t       cnt;
++	srb_t          *sp;
++	uint8_t        status = 0;
++
++	ENTER("qla2x00_abort_isp");
++
++	if (ha->flags.online) {
++		ha->flags.online = FALSE;
++		clear_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags);
++		clear_bit(COMMAND_WAIT_ACTIVE, &ha->dpc_flags);
++		clear_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++		qla2x00_stats.ispAbort++;
++		ha->total_isp_aborts++;  /* used by ioctl */
++		ha->sns_retry_cnt = 0;
++
++		printk(KERN_INFO
++		    "scsi(%ld): Performing ISP error recovery - ha= %p.\n",
++		    ha->host_no, ha);
++		qla2x00_reset_chip(ha);
++
++		if (ha->loop_state != LOOP_DOWN) {
++			ha->loop_state = LOOP_DOWN;
++			atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME);
++			qla2x00_mark_all_devices_lost(ha);
++		}
++
++#if defined(FC_IP_SUPPORT)
++		/* Return all IP send packets */
++		for (cnt = 0; cnt < MAX_SEND_PACKETS; cnt++) {
++			if (ha->active_scb_q[cnt] != NULL) {
++				/* Via IP callback */
++				(*ha->send_completion_routine)
++					(ha->active_scb_q[cnt]);
++
++				ha->active_scb_q[cnt] = NULL;
++			}
++		}
++#endif
++
++		spin_lock_irqsave(&ha->hardware_lock, flags);
++		/* Requeue all commands in outstanding command list. */
++		for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) {
++			sp = ha->outstanding_cmds[cnt];
++			if (sp) {
++				ha->outstanding_cmds[cnt] = 0;
++				if( ha->actthreads )
++					ha->actthreads--;
++				sp->lun_queue->out_cnt--;
++#if defined(IOCB_THROLLE_USAGE)
++				ha->iocb_cnt -= sp->iocb_cnt;
++#endif
++				
++				sp->flags = 0;
++
++				/* 
++				 * We need to send the command back to OS now 
++				 * if returning RESET status for kernel's 
++				 * error handling.
++				 */
++				if (flag == 0) {
++					CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16;
++				} else {
++					CMD_RESULT(sp->cmd) = DID_RESET << 16;
++				}
++				CMD_HANDLE(sp->cmd) = (unsigned char *) NULL;
++				add_to_done_queue(ha, sp);
++			}
++		}
++
++		spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++#if defined(ISP2100)
++		qla2100_nvram_config(ha);
++#else
++		qla2x00_nvram_config(ha);
++#endif
++
++		if (!qla2x00_restart_isp(ha)) {
++			clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags);
++
++			if (!atomic_read(&ha->loop_down_timer)) {
++				/*
++				 * Issue marker command only when we are going
++				 * to start the I/O .
++				 */
++				ha->marker_needed = 1;
++			}
++
++			ha->flags.online = TRUE;
++
++#if defined(FC_IP_SUPPORT)
++			/* Reenable IP support */
++			if (ha->flags.enable_ip) {
++				set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags);
++				qla2x00_ip_initialize(ha);
++			}
++#endif
++			/* Enable ISP interrupts. */
++			qla2x00_enable_intrs(ha);
++
++			/* v2.19.5b6 Return all commands */
++			qla2x00_abort_queues(ha, TRUE);
++
++			/* Restart queues that may have been stopped. */
++			qla2x00_restart_queues(ha,TRUE);
++			ha->isp_abort_cnt = 0; 
++			clear_bit(ISP_ABORT_RETRY, &ha->dpc_flags);
++		} else {	/* failed the ISP abort */
++			ha->flags.online = TRUE;
++			if( test_bit(ISP_ABORT_RETRY, &ha->dpc_flags) ){
++				if( ha->isp_abort_cnt == 0 ){
++					printk(KERN_WARNING
++					"qla2x00(%ld): ISP error recovery failed - "
++					"board disabled\n",ha->host_no);
++					/* 
++					 * The next call disables the board
++					 * completely.
++					 */
++					qla2x00_reset_adapter(ha);
++					qla2x00_abort_queues(ha, FALSE);
++					ha->flags.online = TRUE;
++					clear_bit(ISP_ABORT_RETRY, &ha->dpc_flags);
++					status = 0;
++				} else { /* schedule another ISP abort */
++					ha->isp_abort_cnt--;
++					DEBUG(printk("qla%ld: ISP abort - retry remainning %d\n",
++					ha->host_no, 
++					ha->isp_abort_cnt);)
++					status = 1;
++				}
++			} else {
++				ha->isp_abort_cnt = MAX_RETRIES_OF_ISP_ABORT;
++				DEBUG(printk( "qla2x00(%ld): ISP error recovery - "
++				"retrying (%d) more times\n",ha->host_no,
++				ha->isp_abort_cnt);)
++				set_bit(ISP_ABORT_RETRY, &ha->dpc_flags);
++				status = 1;
++			}
++		}
++		       
++	}
++
++	if (status) {
++		printk(KERN_INFO
++			"qla2x00_abort_isp(%ld): **** FAILED ****\n",
++			ha->host_no);
++	} else {
++		DEBUG(printk(KERN_INFO
++				"qla2x00_abort_isp(%ld): exiting.\n",
++				ha->host_no);)
++	}
++
++	return(status);
++}
++
++/*
++*  qla2x00_restart_isp
++*      restarts the ISP after a reset
++*
++* Input:
++*      ha = adapter block pointer.
++*
++* Returns:
++*      0 = success
++*/
++static int
++qla2x00_restart_isp(scsi_qla_host_t *ha)
++{
++	uint8_t		status = 0;
++#if defined(ISP2300)
++	device_reg_t	*reg;
++	unsigned long	flags = 0;
++#endif
++
++	/* If firmware needs to be loaded */
++	if (qla2x00_isp_firmware(ha)) {
++		ha->flags.online = FALSE;
++		if (!(status = qla2x00_chip_diag(ha))) {
++#if defined(ISP2300)
++			reg = ha->iobase;
++			spin_lock_irqsave(&ha->hardware_lock, flags);
++			/* Disable SRAM, Instruction RAM and GP RAM parity. */
++			WRT_REG_WORD(&reg->hccr, (HCCR_ENABLE_PARITY + 0x0));
++			spin_unlock_irqrestore(&ha->hardware_lock, flags);
++#endif
++			status = qla2x00_setup_chip(ha);
++#if defined(ISP2300)
++			spin_lock_irqsave(&ha->hardware_lock, flags);
++ 
++ 			/* Enable proper parity */
++ 			if (ha->pdev->device == QLA2312_DEVICE_ID ||
++			    ha->pdev->device == QLA2322_DEVICE_ID)
++ 				/* SRAM, Instruction RAM and GP RAM parity */
++ 				WRT_REG_WORD(&reg->hccr,
++ 				    (HCCR_ENABLE_PARITY + 0x7));
++ 			else
++ 				/* SRAM parity */
++ 				WRT_REG_WORD(&reg->hccr,
++ 				    (HCCR_ENABLE_PARITY + 0x1));
++
++			spin_unlock_irqrestore(&ha->hardware_lock, flags);
++#endif
++		}
++	}
++	if (!status && !(status = qla2x00_init_rings(ha))) {
++		clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags);
++		clear_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags);
++		if (!(status = qla2x00_fw_ready(ha))) {
++			DEBUG(printk("%s(): Start configure loop, "
++					"status = %d\n",
++					__func__,
++					status);)
++			ha->flags.online = TRUE;
++			do {
++				clear_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags);
++				qla2x00_configure_loop(ha);
++			} while (!atomic_read(&ha->loop_down_timer) &&
++				!(test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) &&
++				(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)));
++		}
++
++		/* if no cable then assume it's good */
++		if ((ha->device_flags & DFLG_NO_CABLE)) 
++			status = 0;
++
++		DEBUG(printk("%s(): Configure loop done, status = 0x%x\n",
++				__func__,
++				status);)
++	}
++	return (status);
++}
++
++/*
++* qla2x00_reset_adapter
++*      Reset adapter.
++*
++* Input:
++*      ha = adapter block pointer.
++*/
++static void
++qla2x00_reset_adapter(scsi_qla_host_t *ha)
++{
++	unsigned long flags = 0;
++	device_reg_t *reg = ha->iobase;
++
++	ENTER(__func__);
++
++	ha->flags.online = FALSE;
++	qla2x00_disable_intrs(ha);
++	/* Reset RISC processor. */
++	spin_lock_irqsave(&ha->hardware_lock, flags);
++	WRT_REG_WORD(&reg->hccr, HCCR_RESET_RISC);
++	WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);
++	spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++	LEAVE(__func__);
++}
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_inline.h	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,375 @@
++/*
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ */
++
++
++static __inline__ uint16_t qla2x00_debounce_register(volatile uint16_t *);
++/*
++ * qla2x00_debounce_register
++ *      Debounce register.
++ *
++ * Input:
++ *      port = register address.
++ *
++ * Returns:
++ *      register value.
++ */
++static __inline__ uint16_t
++qla2x00_debounce_register(volatile uint16_t *addr) 
++{
++	volatile uint16_t first;
++	volatile uint16_t second;
++
++	do {
++		first = RD_REG_WORD(addr);
++		barrier();
++		second = RD_REG_WORD(addr);
++	} while (first != second);
++
++	return (first);
++}
++
++static __inline__ void qla2x00_config_dma_addressing(scsi_qla_host_t *ha);
++
++/**
++ * qla2x00_config_dma_addressing() - Configure OS DMA addressing method.
++ * @ha: HA context
++ *
++ * At exit, the @ha's flags.enable_64bit_addressing set to indicated
++ * supported addressing method.
++ */
++static __inline__ void
++qla2x00_config_dma_addressing(scsi_qla_host_t *ha)
++{
++	/*
++	 * Given the two variants pci_set_dma_mask(), allow the compiler to
++	 * assist in setting the proper dma mask.
++	 */
++	if (sizeof(dma_addr_t) > 4) {
++		ha->flags.enable_64bit_addressing = 1;
++		/* Update our PCI device dma_mask for full 64 bits */
++		if (pci_set_dma_mask(ha->pdev, 0xffffffffffffffffULL)) {
++			printk("scsi(%ld): Failed to set 64 bit PCI DMA mask, "
++			    "using 32 bits\n",
++			    ha->host_no);
++			ha->flags.enable_64bit_addressing = 0;
++			pci_set_dma_mask(ha->pdev, 0xffffffff);
++		}
++	}
++	else {
++		ha->flags.enable_64bit_addressing = 0;
++		pci_set_dma_mask(ha->pdev, 0xffffffff);
++	}
++	printk(KERN_INFO
++	    "scsi(%ld): %d Bit DMA Addressing Enabled.\n",
++	    ha->host_no,
++	    (ha->flags.enable_64bit_addressing ? 64 : 32));
++}
++
++
++static __inline__ int qla2x00_normalize_dma_addr(
++    dma_addr_t *e_addr,  uint32_t *e_len,
++    dma_addr_t *ne_addr, uint32_t *ne_len);
++
++/**
++ * qla2x00_normalize_dma_addr() - Normalize an DMA address.
++ * @e_addr: Raw DMA address
++ * @e_len: Raw DMA length
++ * @ne_addr: Normalized second DMA address
++ * @ne_len: Normalized second DMA length
++ *
++ * If the address does not span a 4GB page boundary, the contents of @ne_addr
++ * and @ne_len are undefined.  @e_len is updated to reflect a normalization.
++ *
++ * Example:
++ *
++ * 	ffffabc0ffffeeee	(e_addr) start of DMA address
++ * 	0000000020000000	(e_len)  length of DMA transfer
++ *	ffffabc11fffeeed	end of DMA transfer
++ *
++ * Is the 4GB boundary crossed?
++ *
++ * 	ffffabc0ffffeeee	(e_addr)
++ *	ffffabc11fffeeed	(e_addr + e_len - 1)
++ *	00000001e0000003	((e_addr ^ (e_addr + e_len - 1))
++ *	0000000100000000	((e_addr ^ (e_addr + e_len - 1)) & ~(0xffffffff)
++ *
++ * Compute start of second DMA segment:
++ *
++ * 	ffffabc0ffffeeee	(e_addr)
++ *	ffffabc1ffffeeee	(0x100000000 + e_addr)
++ *	ffffabc100000000	(0x100000000 + e_addr) & ~(0xffffffff)
++ *	ffffabc100000000	(ne_addr)
++ *	
++ * Compute length of second DMA segment:
++ *
++ *	00000000ffffeeee	(e_addr & 0xffffffff)
++ *	0000000000001112	(0x100000000 - (e_addr & 0xffffffff))
++ *	000000001fffeeee	(e_len - (0x100000000 - (e_addr & 0xffffffff))
++ *	000000001fffeeee	(ne_len)
++ *
++ * Adjust length of first DMA segment
++ *
++ * 	0000000020000000	(e_len)
++ *	0000000000001112	(e_len - ne_len)
++ *	0000000000001112	(e_len)
++ *
++ * Returns non-zero if the specified address was normalized, else zero.
++ */
++static __inline__ int
++qla2x00_normalize_dma_addr(
++    dma_addr_t *e_addr,  uint32_t *e_len,
++    dma_addr_t *ne_addr, uint32_t *ne_len)
++{
++	int normalized;
++
++	normalized = 0;
++	if ((*e_addr ^ (*e_addr + *e_len - 1)) & ~(0xFFFFFFFFULL)) {
++		/* Compute normalized crossed address and len */
++		*ne_addr = (0x100000000ULL + *e_addr) & ~(0xFFFFFFFFULL);
++		*ne_len = *e_len - (0x100000000ULL - (*e_addr & 0xFFFFFFFFULL));
++		*e_len -= *ne_len;
++
++		normalized++;
++	}
++	return (normalized);
++}
++
++static __inline__ void qla2x00_poll(scsi_qla_host_t *);
++static inline void 
++qla2x00_poll(scsi_qla_host_t *ha)
++{
++	qla2x00_intr_handler(0, ha, NULL);
++}
++
++
++static __inline__ void qla2x00_enable_intrs(scsi_qla_host_t *);
++static __inline__ void qla2x00_disable_intrs(scsi_qla_host_t *);
++
++static inline void 
++qla2x00_enable_intrs(scsi_qla_host_t *ha)
++{
++	unsigned long flags = 0;
++	device_reg_t *reg;
++
++	spin_lock_irqsave(&ha->hardware_lock, flags);
++	reg = ha->iobase;
++	ha->interrupts_on = 1;
++	/* enable risc and host interrupts */
++	WRT_REG_WORD(&reg->ictrl, ICR_EN_INT | ICR_EN_RISC);
++	CACHE_FLUSH(&reg->ictrl);
++	spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++}
++
++static inline void 
++qla2x00_disable_intrs(scsi_qla_host_t *ha)
++{
++	unsigned long flags = 0;
++	device_reg_t *reg;
++
++	spin_lock_irqsave(&ha->hardware_lock, flags);
++	reg = ha->iobase;
++	ha->interrupts_on = 0;
++	/* disable risc and host interrupts */
++	WRT_REG_WORD(&reg->ictrl, 0);
++	CACHE_FLUSH(&reg->ictrl);
++	spin_unlock_irqrestore(&ha->hardware_lock, flags);
++}
++
++
++static __inline__ int qla2x00_is_wwn_zero(uint8_t *);
++
++/*
++ * qla2x00_is_wwn_zero - Check for zero node name
++ *
++ * Input:
++ *      wwn = Pointer to WW name to check
++ *
++ * Returns:
++ *      TRUE if name is 0 else FALSE
++ *
++ * Context:
++ *      Kernel context.
++ */
++static __inline__ int
++qla2x00_is_wwn_zero(uint8_t *wwn)
++{
++	int cnt;
++
++	for (cnt = 0; cnt < WWN_SIZE ; cnt++, wwn++) {
++		if (*wwn != 0)
++			break;
++	}
++	/* if zero return TRUE */
++	if (cnt == WWN_SIZE)
++		return (1);
++	else
++		return (0);
++}
++
++static __inline__ uint8_t
++qla2x00_suspend_lun(scsi_qla_host_t *, os_lun_t *, int, int);
++static __inline__ uint8_t
++qla2x00_delay_lun(scsi_qla_host_t *, os_lun_t *, int);
++
++static __inline__ uint8_t
++qla2x00_suspend_lun(scsi_qla_host_t *ha, os_lun_t *lq, int time, int count)
++{
++	return (__qla2x00_suspend_lun(ha, lq, time, count, 0));
++}
++
++static __inline__ uint8_t
++qla2x00_delay_lun(scsi_qla_host_t *ha, os_lun_t *lq, int time)
++{
++	return (__qla2x00_suspend_lun(ha, lq, time, 1, 1));
++}
++
++
++
++static __inline__ void qla2x00_chg_endian(uint8_t *, size_t);
++/*
++ * qla2x00_chg_endian
++ *	Change endianess of byte array.
++ *
++ * Input:
++ *	buf = array pointer.
++ *	size = size of array in bytes.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static __inline__ void
++qla2x00_chg_endian(uint8_t *buf, size_t size) 
++{
++	uint8_t byte;
++	size_t cnt1;
++	size_t cnt;
++
++	cnt1 = size - 1;
++	for (cnt = 0; cnt < size / 2; cnt++) {
++		byte = buf[cnt1];
++		buf[cnt1] = buf[cnt];
++		buf[cnt] = byte;
++		cnt1--;
++	}
++}
++
++static __inline__ void qla2x00_check_fabric_devices(scsi_qla_host_t *);
++/*
++ * This routine will wait for fabric devices for
++ * the reset delay.
++ */
++static __inline__ void qla2x00_check_fabric_devices(scsi_qla_host_t *ha) 
++{
++	uint16_t	fw_state;
++
++	qla2x00_get_firmware_state(ha, &fw_state);
++}
++
++static inline void qla2x00_filter_command(scsi_qla_host_t *ha, srb_t *sp);
++static inline void
++qla2x00_filter_command(scsi_qla_host_t *ha, srb_t *sp)
++{
++	Scsi_Cmnd	*cp = sp->cmd;
++	uint8_t		*strp;
++
++	/*
++	 * Special case considertaion on an Inquiry command (0x12) for Lun 0,
++	 * device responds with no devices (0x7F), then Linux will not scan
++	 * further Luns. While reporting that some device exists on Lun 0 Linux
++	 * will scan all devices on this target.
++	 */
++	if (qla2xenbinq && (cp->cmnd[0] == INQUIRY) && (SCSI_LUN_32(cp) == 0)) {
++		strp = (uint8_t *)cp->request_buffer;
++		if (*strp == 0x7f) {
++			/* Make lun unassigned and processor type */
++			*strp = 0x23;
++		}
++	}
++}
++
++static __inline__ void * qla2x00_kmem_zalloc(int, int, int);
++/*
++ * qla2x00_kmem_zalloc
++ * Allocate and zero out the block of memory
++ */
++static __inline__ void *
++qla2x00_kmem_zalloc(int siz, int code, int id) 
++{
++	uint8_t *bp;
++
++	if ((bp = kmalloc(siz, code)) != NULL) {
++		memset(bp, 0, siz);
++	}
++#if QL_TRACE_MEMORY
++	if (mem_trace_ptr == 1000)
++		mem_trace_ptr = 0;
++	mem_trace[mem_trace_ptr] = (u_long ) bp;
++	mem_id[mem_trace_ptr++] = (u_long ) id;
++#endif
++
++	return ((void *)bp);
++}
++
++
++static __inline__ ms_iocb_entry_t *
++qla2x00_prep_ms_iocb(scsi_qla_host_t *, uint32_t, uint32_t);
++/**
++ * qla2x00_prep_ms_iocb() - Prepare common MS IOCB fields for SNS CT query.
++ * @ha: HA context
++ * @req_size: request size in bytes
++ * @rsp_size: response size in bytes
++ *
++ * Returns a pointer to the @ha's ms_iocb.
++ */
++static __inline__ ms_iocb_entry_t *
++qla2x00_prep_ms_iocb(scsi_qla_host_t *ha, uint32_t req_size, uint32_t rsp_size)
++{
++	ms_iocb_entry_t *ms_pkt;
++
++	ms_pkt = ha->ms_iocb;
++	memset(ms_pkt, 0, sizeof(ms_iocb_entry_t));
++
++	ms_pkt->entry_type = MS_IOCB_TYPE;
++	ms_pkt->entry_count = 1;
++#if defined(EXTENDED_IDS)
++	ms_pkt->loop_id = __constant_cpu_to_le16(SIMPLE_NAME_SERVER);
++#else
++	ms_pkt->loop_id = SIMPLE_NAME_SERVER;
++#endif
++	ms_pkt->control_flags =
++	    __constant_cpu_to_le16(CF_READ | CF_HEAD_TAG);
++	ms_pkt->timeout = __constant_cpu_to_le16(25);
++	ms_pkt->cmd_dsd_count = __constant_cpu_to_le16(1);
++	ms_pkt->total_dsd_count = __constant_cpu_to_le16(2);
++	ms_pkt->rsp_bytecount = cpu_to_le32(rsp_size);
++	ms_pkt->req_bytecount = cpu_to_le32(req_size);
++
++	ms_pkt->dseg_req_address[0] = cpu_to_le32(LSD(ha->ct_sns_dma));
++	ms_pkt->dseg_req_address[1] = cpu_to_le32(MSD(ha->ct_sns_dma));
++	ms_pkt->dseg_req_length = ms_pkt->req_bytecount;
++
++	ms_pkt->dseg_rsp_address[0] = cpu_to_le32(LSD(ha->ct_sns_dma));
++	ms_pkt->dseg_rsp_address[1] = cpu_to_le32(MSD(ha->ct_sns_dma));
++	ms_pkt->dseg_rsp_length = ms_pkt->rsp_bytecount;
++
++	return (ms_pkt);
++}
++
++
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_iocb.c	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,1276 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++#include "qla_os.h"
++#include "qla_def.h"
++
++static inline uint16_t qla2x00_get_cmd_direction(Scsi_Cmnd *cmd);
++
++static inline int qla2x00_cmd_build_iocb(scsi_qla_host_t *ha,
++    srb_t *sp, cmd_entry_t *cmd_pkt, uint16_t *req_q_cnt,
++    uint16_t *req_ring_index, request_t **request_ring_ptr,
++    uint16_t *tot_iocbs, uint16_t *tot_dsds);
++
++static inline int qla2x00_cmd_build_64bit_iocbs(scsi_qla_host_t *ha,
++    srb_t *sp, cmd_entry_t *cmd_pkt, uint16_t *req_q_cnt,
++    uint16_t *req_ring_index, request_t **request_ring_ptr,
++    uint16_t *tot_iocbs, uint16_t *tot_dsds);
++
++static inline int qla2x00_cmd_build_32bit_iocbs(scsi_qla_host_t *ha,
++    srb_t *sp, cmd_entry_t *cmd_pkt, uint16_t *req_q_cnt,
++    uint16_t *req_ring_index, request_t **request_ring_ptr,
++    uint16_t *tot_iocbs, uint16_t *tot_dsds);
++
++static inline int qla2x00_check_request_ring(scsi_qla_host_t *ha,
++    uint16_t tot_iocbs, uint16_t req_ring_index, uint16_t *req_q_cnt);
++
++static inline cont_a64_entry_t *qla2x00_prep_a64_cont_packet(
++    scsi_qla_host_t *ha,
++    uint16_t *req_ring_index, request_t **request_ring_ptr);
++
++static inline cont_entry_t *qla2x00_prep_cont_packet(scsi_qla_host_t *ha,
++    uint16_t *req_ring_index, request_t **request_ring_ptr);
++
++
++/* Command queuing function */
++
++/**
++ * qla2x00_get_cmd_direction() - Determine control_flag data direction.
++ * @cmd: SCSI command
++ *
++ * This is ridiculous, the mid-layer applications should perform this step for
++ * all commands sent down through the SCSI layers.  The following is a terrible
++ * hack.
++ *
++ * Returns the proper CF_* direction based on CDB.
++ */
++static inline uint16_t
++qla2x00_get_cmd_direction(Scsi_Cmnd *cmd)
++{
++	uint16_t cflags;
++
++	cflags = 0;
++
++#if defined(SANE_USAGE_OF_CMD_DIRECTION)
++	/* Set transfer direction */
++	if (cmd->sc_data_direction == SCSI_DATA_WRITE)
++		cflags = CF_WRITE;
++	else if (cmd->sc_data_direction == SCSI_DATA_READ)
++		cflags = CF_READ;
++	else {
++		switch (cmd->data_cmnd[0]) {
++		case WRITE_6:
++		case WRITE_10:
++		case WRITE_12:
++		case WRITE_BUFFER:
++		case WRITE_LONG:
++		case WRITE_SAME:
++		case WRITE_VERIFY:
++		case WRITE_VERIFY_12:
++		case FORMAT_UNIT:
++		case SEND_VOLUME_TAG:
++		case MODE_SELECT:
++		case SEND_DIAGNOSTIC:
++		case MODE_SELECT_10:
++			cflags = CF_WRITE;
++			break;
++		default:
++			cflags = CF_READ;
++			break;
++		}
++	}
++#else
++	switch (cmd->data_cmnd[0]) {
++	case WRITE_6:
++	case WRITE_10:
++	case WRITE_12:
++	case WRITE_BUFFER:
++	case WRITE_LONG:
++	case WRITE_SAME:
++	case WRITE_VERIFY:
++	case WRITE_VERIFY_12:
++	case FORMAT_UNIT:
++	case SEND_VOLUME_TAG:
++	case MODE_SELECT:
++	case SEND_DIAGNOSTIC:
++	case MODE_SELECT_10:
++		cflags = CF_WRITE;
++		break;
++	default:
++		if (cmd->sc_data_direction == SCSI_DATA_WRITE)
++			cflags = CF_WRITE;
++		else
++			cflags = CF_READ;
++		break;
++	}
++#endif
++
++	return (cflags);
++}
++
++/**
++ * qla2x00_check_request_ring() - Checks request ring for additional IOCB space.
++ * @ha: HA context
++ * @tot_iocbs: Number of IOCBs required
++ * @req_ring_index: Current index to request ring
++ * @req_q_cnt: Number of free request entries
++ *
++ * Returns non-zero if no additional room available on request ring, else zero.
++ */
++static inline int
++qla2x00_check_request_ring(scsi_qla_host_t *ha,
++    uint16_t tot_iocbs, uint16_t req_ring_index, uint16_t *req_q_cnt)
++{
++	uint16_t	ret;
++	uint16_t	cnt;
++	device_reg_t	*reg;
++
++	reg = ha->iobase;
++
++	/* If room for request in request ring for at least N IOCB */
++	ret = 0;
++	if ((tot_iocbs + 2) >= *req_q_cnt) {
++		/*
++		 * Calculate number of free request entries.
++		 */
++		cnt = RD_REG_WORD(ISP_REQ_Q_OUT(reg));
++		if (req_ring_index < cnt)
++			*req_q_cnt = cnt - req_ring_index;
++		else
++			*req_q_cnt = REQUEST_ENTRY_CNT - (req_ring_index - cnt);
++	}
++	if ((tot_iocbs + 2) >= *req_q_cnt) {
++		DEBUG5(printk("scsi(%ld): in-ptr=%x req_q_cnt=%x "
++		    "tot_iocbs=%x.\n",
++		    ha->host_no, req_ring_index, *req_q_cnt, tot_iocbs));
++
++		ret++;
++	}
++#if defined(IOCB_THROLLE_USAGE)
++	if ((ha->iocb_cnt + tot_iocbs) >= ha->iocb_hiwat) {
++		DEBUG5(printk("%s(): Not Enough IOCBS for request. "
++		    "iocb_cnt=%x, tot_iocbs=%x, hiwat=%x.\n",
++		    __func__, ha->iocb_cnt, tot_iocbs, ha->iocb_hiwat));
++#if defined(IOCB_HIT_RATE)
++		ha->iocb_overflow_cnt++;
++#endif
++		ret++;
++	}
++#endif
++
++	return (ret);
++}
++
++/**
++ * qla2x00_prep_a64_cont_packet() - Initialize an A64 continuation packet.
++ * @ha: HA context
++ * @req_ring_index: Current index to request ring
++ * @req_ring_ptr: Current pointer to request ring
++ *
++ * Returns a pointer to the continuation packet.
++ */
++static inline cont_a64_entry_t *
++qla2x00_prep_a64_cont_packet(scsi_qla_host_t *ha,
++    uint16_t *req_ring_index, request_t **request_ring_ptr)
++{
++	cont_a64_entry_t *cont_pkt;
++
++	/* Adjust ring index. */
++	*req_ring_index += 1;
++	if (*req_ring_index == REQUEST_ENTRY_CNT) {
++		*req_ring_index = 0;
++		*request_ring_ptr = ha->request_ring;
++	} else
++		*request_ring_ptr += 1;
++
++	cont_pkt = (cont_a64_entry_t *)(*request_ring_ptr);
++
++	/* Load packet defaults. */
++	*((uint32_t *)(&cont_pkt->entry_type)) =
++	    __constant_cpu_to_le32(CONTINUE_A64_TYPE);
++	//cont_pkt->entry_type = CONTINUE_A64_TYPE;
++	//cont_pkt->entry_count = 0;
++	//cont_pkt->sys_define = (uint8_t)req_ring_index;
++
++	return (cont_pkt);
++}
++
++/**
++ * qla2x00_prep_cont_packet() - Initialize a continuation packet.
++ * @ha: HA context
++ * @req_ring_index: Current index to request ring
++ * @req_ring_ptr: Current pointer to request ring
++ *
++ * Returns a pointer to the continuation packet.
++ */
++static inline cont_entry_t *
++qla2x00_prep_cont_packet(scsi_qla_host_t *ha,
++    uint16_t *req_ring_index, request_t **request_ring_ptr)
++{
++	cont_entry_t *cont_pkt;
++
++	/* Adjust ring index. */
++	*req_ring_index += 1;
++	if (*req_ring_index == REQUEST_ENTRY_CNT) {
++		*req_ring_index = 0;
++		*request_ring_ptr = ha->request_ring;
++	} else
++		*request_ring_ptr += 1;
++
++	cont_pkt = (cont_entry_t *)(*request_ring_ptr);
++
++	/* Load packet defaults. */
++	*((uint32_t *)(&cont_pkt->entry_type)) =
++	    __constant_cpu_to_le32(CONTINUE_TYPE);
++	//cont_pkt->entry_type = CONTINUE_TYPE;
++	//cont_pkt->entry_count = 0;
++	//cont_pkt->sys_define = (uint8_t)req_ring_index;
++
++	return (cont_pkt);
++}
++
++static inline int
++qla2x00_cmd_build_64bit_iocbs(scsi_qla_host_t *ha,
++    srb_t *sp,
++    cmd_entry_t *cmd_pkt,
++    uint16_t *req_q_cnt,
++    uint16_t *req_ring_index, request_t **request_ring_ptr,
++    uint16_t *tot_iocbs, uint16_t *tot_dsds)
++{
++	uint16_t	avail_dsds;
++	uint32_t	*cur_dsd;
++	Scsi_Cmnd	*cmd;
++
++	cmd = sp->cmd;
++
++	/* No data transfer */
++	if (cmd->request_bufflen == 0 ||
++	    cmd->sc_data_direction == SCSI_DATA_NONE) {
++		cmd_pkt->byte_count = __constant_cpu_to_le32(0);
++		return (QL_STATUS_SUCCESS);
++	}
++
++	cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(cmd));
++	sp->dir = cmd_pkt->control_flags &
++	    __constant_cpu_to_le16(CF_READ | CF_WRITE);
++
++	/* Two DSDs are available in the command 64 IOCB */
++	avail_dsds = 2;
++	cur_dsd = (uint32_t *)&cmd_pkt->dseg_0_address;
++
++	/* Load data segments */
++	if (cmd->use_sg != 0) {
++		struct	scatterlist *cur_seg;
++		struct	scatterlist *end_seg;
++		int	nseg;
++
++		cur_seg = (struct scatterlist *)cmd->request_buffer;
++		nseg = pci_map_sg(ha->pdev, cur_seg, cmd->use_sg,
++		    scsi_to_pci_dma_dir(cmd->sc_data_direction));
++		end_seg = cur_seg + nseg;
++		while (cur_seg < end_seg) {
++			int		failed;
++			dma_addr_t	sle_dma;
++			uint32_t	sle_len;
++			dma_addr_t	nml_dma;
++			uint32_t	nml_len;
++			uint32_t	normalized;
++			cont_a64_entry_t *cont_pkt;
++
++			/* Allocate additional continuation packets? */
++			if (avail_dsds == 0) {
++				*tot_iocbs += 1;
++				failed = qla2x00_check_request_ring(ha,
++				    *tot_iocbs,
++				    *req_ring_index,
++				    req_q_cnt);
++				if (failed) {
++					goto mapped_queuing_error_64;
++				}
++
++				cont_pkt = qla2x00_prep_a64_cont_packet(ha,
++				    req_ring_index,
++				    request_ring_ptr);
++
++				cur_dsd = (uint32_t *)&cont_pkt->dseg_0_address;
++				avail_dsds = 5;
++			}
++
++			sle_dma = sg_dma_address(cur_seg);
++			sle_len = sg_dma_len(cur_seg);
++
++			normalized = qla2x00_normalize_dma_addr(
++			    &sle_dma, &sle_len,
++			    &nml_dma, &nml_len);
++
++			/* One entry always consumed */
++			*cur_dsd++ = cpu_to_le32(LSD(sle_dma));
++			*cur_dsd++ = cpu_to_le32(MSD(sle_dma));
++			*cur_dsd++ = cpu_to_le32(sle_len);
++			*tot_dsds += 1;
++			avail_dsds--;
++
++			cur_seg++;
++			if (!normalized)
++				continue;
++
++			/*
++			 * Allocate additional continuation packets?
++			 */
++			if (avail_dsds == 0) {
++				*tot_iocbs += 1;
++				failed = qla2x00_check_request_ring(ha,
++				    *tot_iocbs,
++				    *req_ring_index,
++				    req_q_cnt);
++				if (failed)
++					goto mapped_queuing_error_64;
++
++				cont_pkt = qla2x00_prep_a64_cont_packet(ha,
++				    req_ring_index,
++				    request_ring_ptr);
++
++				cur_dsd = (uint32_t *)&cont_pkt->dseg_0_address;
++				avail_dsds = 5;
++			}
++
++			*cur_dsd++ = cpu_to_le32(LSD(nml_dma));
++			*cur_dsd++ = cpu_to_le32(MSD(nml_dma));
++			*cur_dsd++ = cpu_to_le32(nml_len);
++			*tot_dsds += 1;
++			avail_dsds--;
++		}
++	}
++	else {
++		/*
++		 * No more than 1 (one) IOCB is needed for this type of 
++		 * request, even if the DMA address spans the 4GB page 
++		 * boundary.
++		 *
++		 * @tot_dsds == 1 if non-spanning, else 2
++		 */
++		dma_addr_t	req_dma;
++		uint32_t	req_len;
++		dma_addr_t	nml_dma;
++		uint32_t	nml_len;
++		uint32_t	normalized;
++		struct page	*page;
++		unsigned long	offset;
++
++		page = virt_to_page(cmd->request_buffer);
++		offset = ((unsigned long)cmd->request_buffer & ~PAGE_MASK);
++		req_dma = pci_map_page(ha->pdev,
++		    page,
++		    offset,
++		    cmd->request_bufflen,
++		    scsi_to_pci_dma_dir(cmd->sc_data_direction));
++		req_len = cmd->request_bufflen;
++
++		sp->saved_dma_handle = req_dma;
++
++		normalized = qla2x00_normalize_dma_addr(
++		    &req_dma, &req_len,
++		    &nml_dma, &nml_len);
++
++		/* One entry always consumed */
++		*cur_dsd++ = cpu_to_le32(LSD(req_dma));
++		*cur_dsd++ = cpu_to_le32(MSD(req_dma));
++		*cur_dsd++ = cpu_to_le32(req_len);
++		*tot_dsds += 1;
++
++		if (normalized) {
++			*cur_dsd++ = cpu_to_le32(LSD(nml_dma));
++			*cur_dsd++ = cpu_to_le32(MSD(nml_dma));
++			*cur_dsd++ = cpu_to_le32(nml_len);
++			*tot_dsds += 1;
++		}
++	}
++
++	return (QL_STATUS_SUCCESS);
++
++mapped_queuing_error_64:
++	pci_unmap_sg(ha->pdev, (struct scatterlist *)cmd->request_buffer,
++	    cmd->use_sg, scsi_to_pci_dma_dir(cmd->sc_data_direction));
++	return (QL_STATUS_ERROR);
++}
++
++static inline int
++qla2x00_cmd_build_32bit_iocbs(scsi_qla_host_t *ha,
++    srb_t *sp,
++    cmd_entry_t *cmd_pkt,
++    uint16_t *req_q_cnt,
++    uint16_t *req_ring_index, request_t **request_ring_ptr,
++    uint16_t *tot_iocbs, uint16_t *tot_dsds)
++{
++	uint16_t	avail_dsds;
++	uint32_t	*cur_dsd;
++	Scsi_Cmnd	*cmd;
++
++	cmd = sp->cmd;
++
++	/* No data transfer */
++	if (cmd->request_bufflen == 0 ||
++	    cmd->sc_data_direction == SCSI_DATA_NONE) {
++		cmd_pkt->byte_count = __constant_cpu_to_le32(0);
++		return (QL_STATUS_SUCCESS);
++	}
++
++	cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(cmd));
++	sp->dir = cmd_pkt->control_flags &
++	    __constant_cpu_to_le16(CF_READ | CF_WRITE);
++
++	/* Three DSDs are available in the command IOCB */
++	avail_dsds = 3;
++	cur_dsd = (uint32_t *)&cmd_pkt->dseg_0_address;
++
++	/* Load data segments */
++	if (cmd->use_sg != 0) {
++		struct	scatterlist *cur_seg;
++		struct	scatterlist *end_seg;
++		int	nseg;
++
++		cur_seg = (struct scatterlist *)cmd->request_buffer;
++		nseg = pci_map_sg(ha->pdev, cur_seg, cmd->use_sg,
++		    scsi_to_pci_dma_dir(cmd->sc_data_direction));
++		end_seg = cur_seg + nseg;
++
++		while (cur_seg < end_seg) {
++			int		failed;
++			dma_addr_t	sle_dma;
++			uint32_t	sle_len;
++			cont_entry_t	*cont_pkt;
++
++			/* Allocate additional continuation packets? */
++			if (avail_dsds == 0) {
++				*tot_iocbs += 1;
++				failed = qla2x00_check_request_ring(ha,
++				    *tot_iocbs,
++				    *req_ring_index,
++				    req_q_cnt);
++				if (failed) {
++					goto mapped_queuing_error_32;
++				}
++
++				cont_pkt = qla2x00_prep_cont_packet(ha,
++				    req_ring_index,
++				    request_ring_ptr);
++
++				cur_dsd = (uint32_t *)&cont_pkt->dseg_0_address;
++				avail_dsds = 7;
++			}
++
++			sle_dma = sg_dma_address(cur_seg);
++			sle_len = sg_dma_len(cur_seg);
++
++			/* One entry always consumed */
++			*cur_dsd++ = cpu_to_le32(sle_dma);
++			*cur_dsd++ = cpu_to_le32(sle_len);
++			*tot_dsds += 1;
++			avail_dsds--;
++
++			cur_seg++;
++		}
++	}
++	else {
++		/*
++		 * No more than 1 (one) IOCB is needed for this type of request.
++		 */
++		dma_addr_t	req_dma;
++		uint32_t	req_len;
++		struct page	*page;
++		unsigned long	offset;
++
++		page = virt_to_page(cmd->request_buffer);
++		offset = ((unsigned long)cmd->request_buffer & ~PAGE_MASK);
++		req_dma = pci_map_page(ha->pdev,
++		    page,
++		    offset,
++		    cmd->request_bufflen,
++		    scsi_to_pci_dma_dir(cmd->sc_data_direction));
++		req_len = cmd->request_bufflen;
++
++		sp->saved_dma_handle = req_dma;
++
++		/* One entry always consumed */
++		*cur_dsd++ = cpu_to_le32(req_dma);
++		*cur_dsd++ = cpu_to_le32(req_len);
++		*tot_dsds += 1;
++	}
++
++	return (QL_STATUS_SUCCESS);
++
++mapped_queuing_error_32:
++	pci_unmap_sg(ha->pdev, (struct scatterlist *)cmd->request_buffer,
++	    cmd->use_sg, scsi_to_pci_dma_dir(cmd->sc_data_direction));
++	return (QL_STATUS_ERROR);
++}
++
++static inline int
++qla2x00_cmd_build_iocb(scsi_qla_host_t *ha,
++    srb_t *sp,
++    cmd_entry_t *cmd_pkt,
++    uint16_t *req_q_cnt,
++    uint16_t *req_ring_index, request_t **request_ring_ptr,
++    uint16_t *tot_iocbs, uint16_t *tot_dsds)
++{
++	int		ret;
++
++	ret = QL_STATUS_ERROR;
++
++	if (ha->flags.enable_64bit_addressing) {
++		*((uint32_t *)(&cmd_pkt->entry_type)) =
++		    __constant_cpu_to_le32(COMMAND_A64_TYPE);
++		//cmd_pkt->entry_type = COMMAND_A64_TYPE;
++		//cmd_pkt->entry_count = (uint8_t)tot_iocbs;
++		//cmd_pkt->sys_define = (uint8_t)ha->req_ring_index;
++		//cmd_pkt->entry_status = 0;
++
++		ret = qla2x00_cmd_build_64bit_iocbs(ha,
++		    sp, cmd_pkt, req_q_cnt, req_ring_index, request_ring_ptr,
++		    tot_iocbs, tot_dsds);
++
++	} else {
++		*((uint32_t *)(&cmd_pkt->entry_type)) =
++		    __constant_cpu_to_le32(COMMAND_TYPE);
++		//cmd_pkt->entry_type = COMMAND_TYPE;
++		//cmd_pkt->entry_count = (uint8_t)tot_iocbs;
++		//cmd_pkt->sys_define = (uint8_t)ha->req_ring_index;
++		//cmd_pkt->entry_status = 0;
++
++		ret = qla2x00_cmd_build_32bit_iocbs(ha,
++		    sp, cmd_pkt, req_q_cnt, req_ring_index, request_ring_ptr,
++		    tot_iocbs, tot_dsds);
++	}
++
++	return (ret);
++}
++
++/**
++ * qla2x00_start_scsi() - Send a SCSI command to the ISP
++ * @sp: command to send to the ISP
++ *
++ * Returns non-zero if a failure occured, else zero.
++ */
++int
++qla2x00_start_scsi(srb_t *sp)
++{
++	int		ret;
++	unsigned long   flags;
++	uint16_t        failed;
++	scsi_qla_host_t	*ha;
++	fc_lun_t	*fclun;
++	Scsi_Cmnd	*cmd;
++	uint16_t	req_q_cnt;
++	uint16_t	req_ring_index;
++	request_t	*request_ring_ptr;
++	uint32_t	*clr_ptr;
++	uint32_t	found;
++	uint32_t        index;
++	uint32_t	handle;
++	uint16_t	tot_iocbs;
++	uint16_t	tot_dsds;
++	cmd_entry_t	*cmd_pkt;
++	uint32_t        timeout;
++
++	device_reg_t	*reg;
++	uint16_t        reg_flushed;
++
++	ENTER(__func__);
++
++	/* Setup device pointers. */
++	ret = 0;
++	fclun = sp->lun_queue->fclun;
++	ha = fclun->fcport->ha;
++
++	cmd = sp->cmd;
++	reg = ha->iobase;
++
++	DEBUG3(printk("scsi(%ld): cmd=%p sp=%p CDB=%x\n",
++	    ha->host_no,
++	    cmd, sp, cmd->cmnd[0]));
++
++	/* Send marker if required */
++	if (ha->marker_needed != 0) {
++		if (qla2x00_marker(ha, 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS) {
++			return (QL_STATUS_ERROR);
++		}
++		ha->marker_needed = 0;
++	}
++
++	/* Acquire ring specific lock */
++	spin_lock_irqsave(&ha->hardware_lock, flags);
++
++	/* Save ha fields for post-update */
++	req_ring_index = ha->req_ring_index;
++	request_ring_ptr = ha->request_ring_ptr;
++	req_q_cnt = ha->req_q_cnt;
++
++	tot_dsds = 0;
++	tot_iocbs = 1;
++
++	/* Allocate space for an additional IOCB */
++	failed = qla2x00_check_request_ring(ha,
++	    tot_iocbs, req_ring_index, &req_q_cnt);
++	if (failed)
++		goto queuing_error;
++
++	/* Check for room in outstanding command list. */
++	found = 0;
++	handle = ha->current_outstanding_cmd;
++	for (index = 1; index < MAX_OUTSTANDING_COMMANDS; index++) {
++		handle++;
++		if (handle == MAX_OUTSTANDING_COMMANDS)
++			handle = 1;
++		if (ha->outstanding_cmds[handle] == 0) {
++			found = 1;
++			ha->current_outstanding_cmd = handle;
++			break;
++		}
++	}
++	if (!found) {
++		DEBUG5(printk("scsi(%ld): Unable to queue command -- NO ROOM "
++		    "IN OUTSTANDING ARRAY (req_q_cnt=%lx).\n",
++		    ha->host_no,
++		    (u_long)ha->req_q_cnt));
++		goto queuing_error;
++	}
++
++	/*
++	 * Build command packet.
++	 */
++	cmd_pkt = (cmd_entry_t *)request_ring_ptr;
++
++	cmd_pkt->handle = handle;
++
++	/* Zero out remaining portion of packet. */
++	clr_ptr = (uint32_t *)cmd_pkt + 2;
++	for (index = 2; index < REQUEST_ENTRY_SIZE / 4; index++)
++		*clr_ptr++ = 0;
++
++	/* Set target ID */
++#if defined(EXTENDED_IDS)
++	cmd_pkt->target = cpu_to_le16(fclun->fcport->loop_id & 0xFF);
++#else
++	cmd_pkt->target = (uint8_t)fclun->fcport->loop_id;
++#endif
++
++	/* Set LUN number*/
++#if VSA
++	if ((cmd->data_cmnd[0] == 0x26) ||
++	    (cmd->data_cmnd[0] == 0xA0) ||
++	    (cmd->data_cmnd[0] == 0xCB) ) {
++		cmd_pkt->lun = cpu_to_le16(fclun->lun);
++	} else if ((fclun->fcport->flags & FC_VSA))
++		cmd_pkt->lun = cpu_to_le16(fclun->lun | 0x4000);
++	else
++		cmd_pkt->lun = cpu_to_le16(fclun->lun);
++#else
++	cmd_pkt->lun = cpu_to_le16(fclun->lun);
++#endif
++
++	/* Update tagged queuing modifier */
++	cmd_pkt->control_flags = __constant_cpu_to_le16(CF_SIMPLE_TAG);
++	if (cmd->device->tagged_queue) {
++		switch (cmd->tag) {
++		case HEAD_OF_QUEUE_TAG:
++			cmd_pkt->control_flags =
++			    __constant_cpu_to_le16(CF_HEAD_TAG);
++			break;
++		case ORDERED_QUEUE_TAG:
++			cmd_pkt->control_flags =
++			    __constant_cpu_to_le16(CF_ORDERED_TAG);
++			break;
++		}
++	}
++
++	/*
++	 * Allocate at least 5 (+ QLA_CMD_TIMER_DELTA) seconds for RISC timeout.
++	 */
++	timeout = (uint32_t) CMD_TIMEOUT(cmd)/HZ;
++	if (timeout > 65535)
++		cmd_pkt->timeout = __constant_cpu_to_le16(0);
++	if (timeout > 25)
++		cmd_pkt->timeout = cpu_to_le16((uint16_t)timeout -
++		    (5 + QLA_CMD_TIMER_DELTA));
++	else
++		cmd_pkt->timeout = cpu_to_le16((uint16_t)timeout);
++
++	/* Load SCSI command packet. */
++	memcpy(cmd_pkt->scsi_cdb, cmd->cmnd, cmd->cmd_len);
++
++	cmd_pkt->byte_count = cpu_to_le32((uint32_t)cmd->request_bufflen);
++
++	/* Load IOCB segments */
++	ret = qla2x00_cmd_build_iocb(ha,
++	    sp,
++	    cmd_pkt,
++	    &req_q_cnt, &req_ring_index, &request_ring_ptr,
++	    &tot_iocbs, &tot_dsds);
++	if (ret)
++		goto queuing_error;
++
++	/* Set total data segment count. */
++	cmd_pkt->dseg_count = cpu_to_le16(tot_dsds);
++	cmd_pkt->entry_count = (uint8_t)tot_iocbs;
++
++	/* Update ha fields */
++	ha->req_ring_index = req_ring_index;
++	ha->request_ring_ptr = request_ring_ptr;
++	ha->req_q_cnt = req_q_cnt;
++	ha->req_q_cnt -= tot_iocbs;
++#if defined(IOCB_THROLLE_USAGE)
++	ha->iocb_cnt += tot_iocbs;
++
++	sp->iocb_cnt = tot_iocbs;
++#endif
++
++	/* Add command to the active array */
++	ha->outstanding_cmds[handle] = sp;
++	CMD_HANDLE(sp->cmd) = (unsigned char *)(u_long)handle;
++
++	/* Adjust ring index. */
++	ha->req_ring_index++;
++	if (ha->req_ring_index == REQUEST_ENTRY_CNT) {
++		ha->req_ring_index = 0;
++		ha->request_ring_ptr = ha->request_ring;
++	} else
++		ha->request_ring_ptr++;
++
++	ha->actthreads++;
++	ha->total_ios++;
++	sp->ha = ha;
++	sp->lun_queue->out_cnt++;
++	sp->flags |= SRB_DMA_VALID;
++	sp->state = SRB_ACTIVE_STATE;
++	sp->u_start = jiffies;
++
++	/* Set chip new ring index. */
++	reg_flushed = CACHE_FLUSH(ISP_REQ_Q_IN(reg));
++	WRT_REG_WORD(ISP_REQ_Q_IN(reg), ha->req_ring_index);
++
++	spin_unlock_irqrestore(&ha->hardware_lock, flags);
++	return (QL_STATUS_SUCCESS);
++
++queuing_error:
++	spin_unlock_irqrestore(&ha->hardware_lock, flags);
++	return (QL_STATUS_ERROR);
++}
++
++
++/**
++ * qla2x00_marker() - Send a marker IOCB to the firmware.
++ * @ha: HA context
++ * @loop_id: loop ID
++ * @lun: LUN
++ * @type: marker modifier
++ *
++ * Can be called from both normal and interrupt context.
++ *
++ * Returns non-zero if a failure occured, else zero.
++ */
++int
++__qla2x00_marker(scsi_qla_host_t *ha,
++    uint16_t loop_id,
++    uint16_t lun,
++    uint8_t type)
++{
++	mrk_entry_t	*pkt;
++
++	ENTER(__func__);
++
++	pkt = (mrk_entry_t *)qla2x00_req_pkt(ha);
++	if (pkt == NULL) {
++		DEBUG2_3(printk("%s(): **** FAILED ****\n", __func__));
++
++		return (QL_STATUS_ERROR);
++	}
++
++	pkt->entry_type = MARKER_TYPE;
++	pkt->modifier = type;
++
++	if (type != MK_SYNC_ALL) {
++		pkt->lun = cpu_to_le16(lun);
++#if defined(EXTENDED_IDS)
++		pkt->target = cpu_to_le16(loop_id & 0xFF);
++#else
++		pkt->target = (uint8_t)loop_id;
++#endif
++	}
++
++	/* Issue command to ISP */
++	qla2x00_isp_cmd(ha);
++
++	LEAVE(__func__);
++
++	return (QL_STATUS_SUCCESS);
++}
++
++int 
++qla2x00_marker(scsi_qla_host_t *ha,
++    uint16_t loop_id,
++    uint16_t lun,
++    uint8_t type)
++{
++	int ret;
++	unsigned long flags = 0;
++
++	spin_lock_irqsave(&ha->hardware_lock, flags);
++	ret = __qla2x00_marker(ha, loop_id, lun, type);
++	spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++	return (ret);
++}
++
++/**
++ * qla2x00_req_pkt() - Retrieve a request packet from the request ring.
++ * @ha: HA context
++ *
++ * Note: The caller must hold the hardware lock before calling this routine.
++ *
++ * Returns NULL if function failed, else, a pointer to the request packet.
++ */
++request_t *
++qla2x00_req_pkt(scsi_qla_host_t *ha)
++{
++	device_reg_t	*reg = ha->iobase;
++	request_t	*pkt = NULL;
++	uint16_t	cnt;
++	uint32_t	*dword_ptr;
++	uint32_t	timer;
++	uint16_t	req_cnt = 1;
++
++	ENTER(__func__);
++
++	/* Wait 1 second for slot. */
++	for (timer = HZ; timer; timer--) {
++		if ((req_cnt + 2) >= ha->req_q_cnt) {
++			/* Calculate number of free request entries. */
++			cnt = qla2x00_debounce_register(ISP_REQ_Q_OUT(reg));
++			if  (ha->req_ring_index < cnt)
++				ha->req_q_cnt = cnt - ha->req_ring_index;
++			else
++				ha->req_q_cnt = REQUEST_ENTRY_CNT -
++				    (ha->req_ring_index - cnt);
++		}
++		/* If room for request in request ring. */
++		if ((req_cnt + 2) < ha->req_q_cnt) {
++			ha->req_q_cnt--;
++			pkt = ha->request_ring_ptr;
++
++			/* Zero out packet. */
++			dword_ptr = (uint32_t *)pkt;
++			for (cnt = 0; cnt < REQUEST_ENTRY_SIZE / 4; cnt++)
++				*dword_ptr++ = 0;
++
++			/* Set system defined field. */
++			pkt->sys_define = (uint8_t)ha->req_ring_index;
++
++			/* Set entry count. */
++			pkt->entry_count = 1;
++
++			break;
++		}
++
++		/* Release ring specific lock */
++		spin_unlock(&ha->hardware_lock);
++
++		udelay(2);   /* 2 us */
++
++		/* Check for pending interrupts. */
++		/* During init we issue marker directly */
++		if (!ha->marker_needed)
++			qla2x00_poll(ha);
++
++		spin_lock_irq(&ha->hardware_lock);
++	}
++	if (!pkt) {
++		DEBUG2_3(printk("%s(): **** FAILED ****\n", __func__));
++	}
++
++	LEAVE(__func__);
++
++	return (pkt);
++}
++
++/**
++ * qla2x00_ms_req_pkt() - Retrieve a Management Server request packet from
++ * 				the request ring.
++ * @ha: HA context
++ * @sp: pointer to handle post function call
++ *
++ * Note: The caller must hold the hardware lock before calling this routine.
++ *
++ * Returns NULL if function failed, else, a pointer to the request packet.
++ */
++request_t *
++qla2x00_ms_req_pkt(scsi_qla_host_t *ha, srb_t  *sp)
++{
++	device_reg_t	*reg = ha->iobase;
++	request_t	*pkt = NULL;
++	uint16_t	cnt, i, index;
++	uint32_t	*dword_ptr;
++	uint32_t	timer;
++	uint8_t		found = 0;
++	uint16_t	req_cnt = 1;
++
++	ENTER(__func__);
++
++	/* Wait 1 second for slot. */
++	for (timer = HZ; timer; timer--) {
++		if ((req_cnt + 2) >= ha->req_q_cnt) {
++			/* Calculate number of free request entries. */
++			cnt = qla2x00_debounce_register(ISP_REQ_Q_OUT(reg));
++			if (ha->req_ring_index < cnt) {
++				ha->req_q_cnt = cnt - ha->req_ring_index;
++			} else {
++				ha->req_q_cnt = REQUEST_ENTRY_CNT -
++				    (ha->req_ring_index - cnt);
++			}
++		}
++
++		/* Check for room in outstanding command list. */
++		cnt = ha->current_outstanding_cmd;
++		for (index = 1; index < MAX_OUTSTANDING_COMMANDS; index++) {
++			cnt++;
++			if (cnt == MAX_OUTSTANDING_COMMANDS)
++				cnt = 1;
++
++			if (ha->outstanding_cmds[cnt] == 0) {
++				found = 1;
++				ha->current_outstanding_cmd = cnt;
++				break;
++			}
++		}
++
++		/* If room for request in request ring. */
++		if (found && (req_cnt + 2) < ha->req_q_cnt) {
++			pkt = ha->request_ring_ptr;
++
++			/* Zero out packet. */
++			dword_ptr = (uint32_t *)pkt;
++			for (i = 0; i < REQUEST_ENTRY_SIZE / 4; i++ )
++				*dword_ptr++ = 0;
++
++			DEBUG5(printk("%s(): putting sp=%p in "
++			    "outstanding_cmds[%x]\n",
++			    __func__,
++			    sp, cnt));
++
++			ha->outstanding_cmds[cnt] = sp;
++
++			/* save the handle */
++			CMD_HANDLE(sp->cmd) = (unsigned char *) (u_long) cnt;
++			CMD_SP(sp->cmd) = (void *)sp;
++
++			ha->req_q_cnt--;
++			pkt->handle = (uint32_t)cnt;
++
++			/* Set system defined field. */
++			pkt->sys_define = (uint8_t)ha->req_ring_index;
++			pkt->entry_status = 0;
++
++			break;
++		}
++
++		/* Release ring specific lock */
++		spin_unlock(&ha->hardware_lock);
++		udelay(20);
++
++		/* Check for pending interrupts. */
++		qla2x00_poll(ha);
++
++		spin_lock_irq(&ha->hardware_lock);
++	}
++	if (!pkt) {
++		DEBUG2_3(printk("%s(): **** FAILED ****\n", __func__));
++	}
++
++	LEAVE(__func__);
++
++	return (pkt);
++}
++
++/**
++ * qla2x00_isp_cmd() - Modify the request ring pointer.
++ * @ha: HA context
++ *
++ * Note: The caller must hold the hardware lock before calling this routine.
++ */
++void
++qla2x00_isp_cmd(scsi_qla_host_t *ha)
++{
++	device_reg_t *reg = ha->iobase;
++
++	ENTER(__func__);
++
++	DEBUG5(printk("%s(): IOCB data:\n", __func__));
++	DEBUG5(qla2x00_dump_buffer(
++	    (uint8_t *)ha->request_ring_ptr, REQUEST_ENTRY_SIZE));
++
++	/* Adjust ring index. */
++	ha->req_ring_index++;
++	if (ha->req_ring_index == REQUEST_ENTRY_CNT) {
++		ha->req_ring_index = 0;
++		ha->request_ring_ptr = ha->request_ring;
++	} else
++		ha->request_ring_ptr++;
++
++	/* Set chip new ring index. */
++	WRT_REG_WORD(ISP_REQ_Q_IN(reg), ha->req_ring_index);
++
++	LEAVE(__func__);
++}
++
++// TODO: Complete implementation.
++// TODO: Add support for EXTENDED_IDS.
++#ifdef COMPLETE_IMPLEMENTATION
++
++/* MAILBOX IOCB stuff */
++
++/**
++ * qla2x00_send_login_port_iocb() - Login to a device.
++ * @ha: SCSI driver HA context
++ * @ipdev: IP device to login to
++ *
++ * This routine will build and send a mailbox IOCB to login to a fabric port.
++ *
++ * The qla2x00_mailbox_iocb_done() routine will be called upon IOCB
++ * completion, where further processing is performed.
++ *
++ * Returns QL_STATUS_SUCCESS if the operation succeeded.
++ */
++static int
++qla2x00_send_login_port_iocb(scsi_qla_host_t *ha, fcdev_t *device)
++{
++	unsigned long	flags = 0;
++	struct mbx_entry *mbxentry;
++
++	DEBUG2(printk("%s(): port ID: %x\n",
++			__func__,
++			device->port_id[2]<<16 |
++			device->port_id[1]<<8 |
++			device->port_id[0]);)
++
++	/* Send marker if required */
++	if (ha->marker_needed != 0) {
++		if (qla2x00_marker(ha, 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS)
++			return (QL_STATUS_ERROR);
++		ha->marker_needed = 0;
++	}
++
++	spin_lock_irqsave(&ha->hardware_lock, flags);
++
++	mbxentry = (struct mbx_entry *)qla2x00_req_pkt(ha);
++	if (mbxentry == NULL) {
++		DEBUG2(printk("%s(): failed\n", __func__);)
++
++		spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++		return (QL_STATUS_ERROR);
++	}
++
++	/* Build fabric login MBX IOCB */
++	mbxentry->entry_type = ET_MAILBOX_COMMAND;
++	mbxentry->entry_count = 1;
++	mbxentry->sys_define1 = SOURCE_SCSI;
++	mbxentry->entry_status = 0;
++	mbxentry->handle = cpu_to_le32(device->dev_id |
++				(MBC_LOGIN_FABRIC_PORT << 16));
++	mbxentry->loop_id = device->loop_id;
++	mbxentry->mb0 = __constant_cpu_to_le16(MBC_LOGIN_FABRIC_PORT);
++	mbxentry->mb1 = cpu_to_le16((device->loop_id << 8) | 
++				(MBC_NO_PROCESS_LOGIN |
++				 MBC_NO_PLOGI_IF_LOGGED_IN));
++	mbxentry->mb2 = cpu_to_le16(device->port_id[2]);
++	mbxentry->mb3 = cpu_to_le16((device->port_id[1] << 8) |
++				device->port_id[0]);
++	mbxentry->mb6 = __constant_cpu_to_le16(0);
++	mbxentry->mb7 = __constant_cpu_to_le16(0);
++
++	/* Issue command to ISP */
++	qla2x00_isp_cmd(ha);
++
++	spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++	return (QL_STATUS_SUCCESS);
++}
++
++/**
++ * qla2x00_send_logout_port_iocb() - Logout an FC device.
++ * @ha: SCSI driver HA context
++ * @device: FC device to logout
++ *
++ * This routine will build and send a mailbox IOCB to logout a fabric port.
++ *
++ * The qla2x00_mailbox_iocb_done() routine will be called upon IOCB
++ * completion, where further processing is performed.
++ *
++ * Returns QL_STATUS_SUCCESS if the operation succeeded.
++ */
++static int
++qla2x00_send_logout_port_iocb(scsi_qla_host_t *ha, fcdev_t *device)
++{
++	unsigned long	flags = 0;
++	struct mbx_entry *mbxentry;
++
++	DEBUG2(printk("%s(): port ID: %x\n",
++			__func__,
++			device->port_id[2]<<16 |
++			device->port_id[1]<<8 |
++			device->port_id[0]);)
++
++	/* Send marker if required */
++	if (ha->marker_needed != 0) {
++		if (qla2x00_marker(ha, 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS)
++			return (QL_STATUS_ERROR);
++		ha->marker_needed = 0;
++	}
++
++	spin_lock_irqsave(&ha->hardware_lock, flags);
++
++	mbxentry = (struct mbx_entry *)qla2x00_req_pkt(ha);
++	if (mbxentry == NULL) {
++		DEBUG3(printk("%s(): failed\n", __func__);)
++
++		spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++		return (QL_STATUS_ERROR);
++	}
++
++	/* Build fabric logout MBX IOCB */
++	mbxentry->entry_type = ET_MAILBOX_COMMAND;
++	mbxentry->entry_count = 1;
++	mbxentry->sys_define1 = SOURCE_SCSI;
++	mbxentry->entry_status = 0;
++	mbxentry->handle = cpu_to_le32(device->dev_id |
++				(MBC_LOGOUT_FABRIC_PORT << 16));
++	mbxentry->loop_id = device->loop_id;
++	mbxentry->mb0 = __constant_cpu_to_le16(MBC_LOGOUT_FABRIC_PORT);
++	mbxentry->mb1 = cpu_to_le16(device->loop_id << 8);
++	mbxentry->mb2 = __constant_cpu_to_le16(0);
++	mbxentry->mb3 = __constant_cpu_to_le16(0);
++	mbxentry->mb6 = __constant_cpu_to_le16(0);
++	mbxentry->mb7 = __constant_cpu_to_le16(0);
++
++	/* Issue command to ISP */
++	qla2x00_isp_cmd(ha);
++
++	spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++	return (QL_STATUS_SUCCESS);
++}
++
++/**
++ * qla2x00_mailbox_iocb_done() - Process an mailbox IOCB completion.
++ * @ha: SCSI driver HA context
++ * @mbxentry: completed mailbox IOCB entry
++ *
++ * This routine is currently used for fabric login and logouts only.
++ */
++static void
++qla2x00_mailbox_iocb_done(scsi_qla_host_t *ha, struct mbx_entry *mbxentry)
++{
++	int		status;
++	uint16_t	cmd;
++	uint16_t	index;
++	fcdev		*device;
++
++// FIXME: endianess?
++	/* Parse-out originating mailbox command */
++	cmd = MSW(mbxentry->handle);
++
++	DEBUG2(printk("%s: cmd %x, status %x, mb0 %x, mb1 %x, mb2 %x\n",
++			__func__,
++			cmd,
++			mbxentry->status,
++			mbxentry->mb0,
++			mbxentry->mb1,
++			mbxentry->mb2);)
++
++	/* Get device block pointer */
++	index = LSW(mbxentry->handle);
++	if (index >= QLLAN_MAX_IP_DEVICES) {
++		/* Bad handle from ISP */
++		DEBUG3(printk("%s: bad handle from isp\n", __func__);)
++
++		/* TODO: Cleanup??? */
++
++		return;
++	}
++// FIXME FROM HERE!!!
++	ipdev = &ha->ipdev_db[index];
++
++	if (cmd == MBC_LOGOUT_FABRIC_PORT) {
++		/* Check fabric logout completion status */
++		if (/*mbxentry->status == CS_COMPLETE && */
++			mbxentry->mb0 == MBS_COMMAND_COMPLETE) {
++
++			/* Logout successful -- do nothing */
++		}
++		else {
++			DEBUG12(printk("%s: fabric logout failed\n", __func__);)
++		}
++	}
++	else {
++		/* Check fabric login completion status */
++		/* Note: sometimes ISP returns Status=0x30 and MB0=0x4000 */
++		/* Therefore, only check mb0 for now */
++		if (/* mbxentry->status == CS_COMPLETE && */
++			mbxentry->mb0 == MBS_COMMAND_COMPLETE) {
++
++			/* Login successful */
++			ipdev->flags |= IP_DEV_FLAG_PRESENT;
++		}
++		else if (mbxentry->mb0 == MBS_PORT_ID_IN_USE) {
++			/* Different loop ID already assigned to port ID */
++			/* Use the one that is already assigned */
++			qla2x00_free_loopid(ha, ipdev->loop_id);
++			ipdev->loop_id = mbxentry->mb1;
++
++			/* Do logout first and then relogin */
++			qla2x00_ip_send_logout_port_iocb(ha, ipdev, 1);
++			qla2x00_ip_send_login_port_iocb(ha, ipdev, 1);
++		}
++		else if (mbxentry->mb0 == MBS_LOOP_ID_IN_USE) {
++			/* Loop ID already used for different port ID */
++			/* Get a new loop ID and reissue login request */
++			status = qla2x00_reserve_loopid(ha, &ipdev->loop_id);
++			if (status == QL_STATUS_SUCCESS) {
++				qla2x00_ip_send_login_port_iocb(ha, ipdev, 1);
++			}
++			else {
++				DEBUG12(printk("%s: out of loop IDs\n",
++						__func__);)
++
++				qla2x00_free_ip_block(ha, ipdev);
++			}
++		}
++		else {
++			/* Login failed, return resources */
++			DEBUG12(printk("%s: fabric login failed\n", __func__);)
++
++			qla2x00_free_loopid(ha, ipdev->loop_id);
++			qla2x00_free_ip_block(ha, ipdev);
++		}
++	}
++}
++
++#endif
++
++
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_ip.c	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,1769 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++/****************************************************************************
++              Please see revision.notes for revision history.
++*****************************************************************************/
++
++static __u8	hwbroadcast_addr[ETH_ALEN] = { [0 ... ETH_ALEN-1] = 0xFF };
++
++
++/**
++ * qla2x00_ip_initialize() - Initialize RISC IP support.
++ * @ha: SCSI driver HA context
++ *
++ * Prior to RISC IP initialization, this routine, if necessary, will reset all
++ * buffers in the receive buffer ring.
++ *
++ * Returns TRUE if the RISC IP initialization succeeds.
++ */
++static int
++qla2x00_ip_initialize(scsi_qla_host_t *ha)
++{
++	int		i;
++	int		status;
++	unsigned long	flags;
++	device_reg_t	*reg;
++	static mbx_cmd_t mc;
++	mbx_cmd_t	*mcp = &mc;
++	struct ip_init_cb *ipinit_cb;
++	dma_addr_t	ipinit_cb_dma;
++
++	DEBUG12(printk("%s: enter\n", __func__);)
++
++	status = FALSE;
++
++	/* Initialize IP data in ha */
++	ha->ipdev_db_top = NULL;
++	ha->ipdev_db_bottom = NULL;
++	ha->ipdev_db_next_free = &ha->ipdev_db[0];
++	for (i = 0; i < QLLAN_MAX_IP_DEVICES; i++) {
++		ha->ipdev_db[i].index = i;
++		ha->ipdev_db[i].next = &ha->ipdev_db[i+1];
++	}
++	ha->ipdev_db[QLLAN_MAX_IP_DEVICES-1].next = NULL;
++
++	/* Reset/pack buffers owned by RISC in receive buffer ring */
++	if (ha->rec_entries_in != ha->rec_entries_out) {
++		struct buffer_cb	*bcb;
++		uint16_t		rec_out;
++		struct risc_rec_entry	*rec_entry;
++
++		bcb = ha->receive_buffers;
++		rec_out = ha->rec_entries_out;
++
++		/*
++		 * Must locate all RISC owned buffers and pack them in the
++		 * buffer ring.
++		 */
++		/* between IpBufferOut and IpBufferIN */
++		for (i = 0; i < ha->max_receive_buffers; i++, bcb++) {
++			if (test_bit(BCB_RISC_OWNS_BUFFER, &bcb->state)) {
++				/*
++				 * Set RISC owned buffer into receive buffer
++				 * ring.
++				 */
++				rec_entry = &ha->risc_rec_q[rec_out];
++				rec_entry->handle = bcb->handle;
++				rec_entry->data_addr_low =
++					LSD(bcb->skb_data_dma);
++			       	rec_entry->data_addr_high =
++					MSD(bcb->skb_data_dma);
++				if (rec_out < IP_BUFFER_QUEUE_DEPTH - 1)
++					rec_out++;
++				else
++					rec_out = 0;
++			}
++		}
++
++		/* Verify correct number of RISC owned buffers were found */
++		if (rec_out != ha->rec_entries_in) {
++			/* Incorrect number of RISC owned buffers?? */
++			DEBUG12(printk("%s: incorrect number of RISC "
++					"owned buffers, disable IP\n",
++					__func__);)
++			ha->flags.enable_ip = FALSE;
++			return (FALSE);
++		}
++	}
++
++	/* Init RISC buffer pointer */
++	spin_lock_irqsave(&ha->hardware_lock, flags);
++	reg = ha->iobase;
++	WRT_REG_WORD(&reg->mailbox8, ha->rec_entries_in);
++	spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++	/* Wait for a ready state from the adapter */
++	while (!ha->init_done || ha->dpc_active) {
++		set_current_state(TASK_INTERRUPTIBLE);
++		schedule_timeout(HZ);
++	}
++
++	/* Setup IP initialization control block */
++	ipinit_cb = pci_alloc_consistent(ha->pdev,
++				sizeof(struct ip_init_cb), 
++				&ipinit_cb_dma);
++	if (ipinit_cb) {
++		memset(ipinit_cb, 0, sizeof(struct ip_init_cb));
++		ipinit_cb->version = IPICB_VERSION;
++		ipinit_cb->firmware_options =
++			__constant_cpu_to_le16(
++				IPICB_OPTION_NO_BROADCAST_FASTPOST |
++				 IPICB_OPTION_64BIT_ADDRESSING);
++		ipinit_cb->header_size = cpu_to_le16(ha->header_size);
++		ipinit_cb->mtu = cpu_to_le16((uint16_t)ha->mtu);
++		ipinit_cb->receive_buffer_size =
++			cpu_to_le16((uint16_t)ha->receive_buff_data_size);
++		ipinit_cb->receive_queue_size =
++			 __constant_cpu_to_le16(IP_BUFFER_QUEUE_DEPTH);
++		ipinit_cb->low_water_mark =
++			 __constant_cpu_to_le16(IPICB_LOW_WATER_MARK);
++		ipinit_cb->receive_queue_addr[0] =
++			cpu_to_le16(LSW(ha->risc_rec_q_dma));
++		ipinit_cb->receive_queue_addr[1] =
++			cpu_to_le16(MSW(ha->risc_rec_q_dma));
++		ipinit_cb->receive_queue_addr[2] =
++			cpu_to_le16(LSW(MSD(ha->risc_rec_q_dma)));
++		ipinit_cb->receive_queue_addr[3] =
++			cpu_to_le16(MSW(MSD(ha->risc_rec_q_dma)));
++		ipinit_cb->receive_queue_in = cpu_to_le16(ha->rec_entries_out);
++		ipinit_cb->fast_post_count =
++			 __constant_cpu_to_le16(IPICB_FAST_POST_COUNT);
++		ipinit_cb->container_count =
++			 __constant_cpu_to_le16(IPICB_BUFFER_CONTAINER_COUNT);
++		ipinit_cb->resource_allocation =
++			 __constant_cpu_to_le16(IPICB_IOCB_RESERVE_COUNT);
++
++		/* Issue mailbox command to initialize IP firmware */
++		mcp->mb[0] = MBC_INITIALIZE_IP;
++		mcp->mb[2] = MSW(ipinit_cb_dma);
++		mcp->mb[3] = LSW(ipinit_cb_dma);
++		mcp->mb[6] = MSW(MSD(ipinit_cb_dma));
++		mcp->mb[7] = LSW(MSD(ipinit_cb_dma));
++		mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
++		mcp->in_mb = MBX_0;
++		mcp->tov = 30;
++		mcp->buf_size = sizeof(struct ip_init_cb);
++		mcp->flags = MBX_DMA_OUT;
++
++		status = qla2x00_mailbox_command(ha, mcp);
++		if (status == QL_STATUS_SUCCESS) {
++			/* IP initialization successful */
++			DEBUG12(printk("%s: successful\n", __func__);)
++
++			ha->flags.enable_ip = TRUE;
++
++			/* Force database update */
++			set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags);
++			set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags);
++			set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags);
++
++			/* qla2x00_loop_resync(ha); */
++			if (ha->dpc_wait && !ha->dpc_active) {
++				up(ha->dpc_wait);
++			}
++			status = TRUE;
++		}
++		else {
++			DEBUG12(printk("%s: MBC_INITIALIZE_IP "
++					"failed %x MB0 %x\n",
++					__func__, 
++					status,
++					mcp->mb[0]);)
++			status = FALSE;
++		}
++		pci_free_consistent(ha->pdev, sizeof(struct ip_init_cb),
++					ipinit_cb, ipinit_cb_dma);
++
++	}
++	else {
++		DEBUG12(printk("%s: memory allocation error\n", __func__);)
++	}
++
++	return (status);
++}
++
++/**
++ * qla2x00_ip_send_complete() - Handle IP send completion.
++ * @ha: SCSI driver HA context
++ * @handle: handle to completed send_cb
++ * @comp_status: Firmware completion status of send_cb
++ *
++ * Upon cleanup of the internal active-scb queue, the IP driver is notified of
++ * the completion.
++ */
++static void
++qla2x00_ip_send_complete(scsi_qla_host_t *ha,
++			uint32_t handle, uint16_t comp_status)
++{
++	struct send_cb *scb;
++
++	/* Set packet pointer from queue entry handle */
++	if (handle < MAX_SEND_PACKETS) {
++		scb = ha->active_scb_q[handle];
++		if (scb) {
++			ha->ipreq_cnt--;
++			ha->active_scb_q[handle] = NULL;
++
++			scb->comp_status = comp_status;
++			pci_unmap_single(ha->pdev,
++					scb->skb_data_dma,
++					scb->skb->len,
++					PCI_DMA_TODEVICE);
++	
++			/* Return send packet to IP driver */
++			(*ha->send_completion_routine)(scb);
++			return;
++		}
++	}
++
++	/* Invalid handle from RISC, reset RISC firmware */
++	printk(KERN_WARNING
++		"%s: Bad IP send handle %x - aborting ISP\n",
++		__func__, handle);
++
++	set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++}
++
++/**
++ * qla2x00_ip_receive() - Handle IP receive IOCB.
++ * @ha: SCSI driver HA context
++ * @pkt: RISC IP receive packet
++ *
++ * Upon preparation of one or more buffer_cbs, the IP driver is notified of
++ * the received packet.
++ */
++static void
++qla2x00_ip_receive(scsi_qla_host_t *ha, response_t *pkt)
++{
++	uint32_t	handle;
++	uint32_t	packet_size;
++	uint16_t	linked_bcb_cnt;
++	uint32_t	rec_data_size;
++	uint16_t	comp_status;
++	struct buffer_cb *bcb;
++	struct buffer_cb *nbcb;
++	struct ip_rec_entry *iprec_entry;
++
++	DEBUG12(printk("%s: enter\n", __func__);)
++
++	iprec_entry = (struct ip_rec_entry *)pkt;
++	comp_status = le16_to_cpu(iprec_entry->comp_status);
++
++	/* If split buffer, set header size for 1st buffer */
++	if (comp_status & IPREC_STATUS_SPLIT_BUFFER)
++		rec_data_size = ha->header_size;
++	else
++		rec_data_size = ha->receive_buff_data_size;
++
++	handle = iprec_entry->buffer_handles[0];
++	if (handle >= ha->max_receive_buffers) {
++		/* Invalid handle from RISC, reset RISC firmware */
++		printk(KERN_WARNING
++			"%s: Bad IP buffer handle %x (> buffer_count)...Post "
++			"ISP Abort\n",
++			__func__,
++			handle);
++		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++		return;
++	}
++
++	bcb = &ha->receive_buffers[handle];
++
++	if (!test_and_clear_bit(BCB_RISC_OWNS_BUFFER, &bcb->state)) {
++		/* Invalid handle from RISC, reset RISC firmware */
++		printk(KERN_WARNING
++			"%s: Bad IP buffer handle %x (!RISC_owned)...Post "
++			"ISP Abort\n",
++			__func__,
++			handle);
++		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++		return;
++	}
++
++	packet_size = le16_to_cpu(iprec_entry->sequence_length);
++	bcb->comp_status = comp_status;
++	bcb->packet_size = packet_size;
++	nbcb = bcb;
++
++	/* Prepare any linked buffers */
++	for (linked_bcb_cnt = 1; ; linked_bcb_cnt++) {
++		if (packet_size > rec_data_size) {
++			nbcb->rec_data_size = rec_data_size;
++			packet_size -= rec_data_size;
++
++			/*
++			 * If split buffer, only use header size on 1st buffer
++			 */
++			rec_data_size = ha->receive_buff_data_size;
++
++			handle = iprec_entry->buffer_handles[linked_bcb_cnt];
++			if (handle >= ha->max_receive_buffers) {
++				/*
++				 * Invalid handle from RISC reset RISC firmware
++				 */
++				printk(KERN_WARNING
++					"%s: Bad IP buffer handle %x (> "
++					"buffer_count - PS)...Post ISP Abort\n",
++					__func__,
++					handle);
++				set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++				return;
++			}
++			nbcb->next_bcb = &ha->receive_buffers[handle];
++			nbcb = nbcb->next_bcb;
++
++			if (!test_and_clear_bit(BCB_RISC_OWNS_BUFFER,
++							&nbcb->state)) {
++				/*
++				 * Invalid handle from RISC reset RISC firmware
++				 */
++				printk(KERN_WARNING
++					"%s: Bad IP buffer handle %x "
++					"(!RISC_owned - PS)...Post ISP Abort\n",
++					__func__,
++					handle);
++				set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++				return;
++			}
++		}
++		else {
++			/* Single buffer_cb */
++			nbcb->rec_data_size = packet_size;
++			nbcb->next_bcb = NULL;
++			break;
++		}
++	}
++
++	/* Check for incoming ARP packet with matching IP address */
++	if (le16_to_cpu(iprec_entry->service_class) == 0) {
++		uint8_t	port_id[3];
++		struct ip_device *ipdev;
++		struct packet_header *packethdr;
++
++		packethdr = (struct packet_header *)bcb->skb_data;
++
++		/* Scan list of IP devices to see if login needed */
++		for (ipdev = ha->ipdev_db_top; ipdev; ipdev = ipdev->next) {
++			if (!memcmp(&ipdev->port_name[2],
++				packethdr->networkh.s.na.addr, ETH_ALEN)) {
++				/* Device already in IP list, skip login */
++				goto skip_device_login;
++			}
++		}
++
++		/* Device not in list, need to do login */
++		port_id[2] = iprec_entry->s_idhigh;
++// FIXME: endianess?
++		port_id[1] = MSB(iprec_entry->s_idlow);
++		port_id[0] = LSB(iprec_entry->s_idlow);
++
++		/* Make sure its not a local device */
++		if (port_id[2] == ha->d_id.b.domain &&
++			port_id[1] == ha->d_id.b.area) {
++
++			goto skip_device_login;
++		}
++
++		if (qla2x00_add_new_ip_device(ha,
++					PUBLIC_LOOP_DEVICE,
++					port_id,
++					packethdr->networkh.s.fcaddr,
++					TRUE,
++					1) == QL_STATUS_FATAL_ERROR) {
++
++			/* Fatal error, reinitialize */
++			set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++		}
++
++	}
++
++skip_device_login:
++
++	/* Pass received packet to IP driver */
++	bcb->linked_bcb_cnt = linked_bcb_cnt;
++	(*ha->receive_packets_routine)(ha->receive_packets_context, bcb);
++
++	/* Keep track of RISC buffer pointer (for IP reinit) */
++	ha->rec_entries_out += linked_bcb_cnt;
++	if (ha->rec_entries_out >= IP_BUFFER_QUEUE_DEPTH)
++		ha->rec_entries_out -= IP_BUFFER_QUEUE_DEPTH;
++}
++
++/**
++ * qla2x00_ip_receive_fastpost() - Handle IP receive fastpost.
++ * @ha: SCSI driver HA context
++ * @type: RISC fastpost type
++ *
++ * Upon preparation of one or more buffer_cbs, the IP driver is notified of
++ * the received packet.
++ */
++static void
++qla2x00_ip_receive_fastpost(scsi_qla_host_t *ha, uint16_t type)
++{
++	uint32_t	handle;
++	uint32_t	packet_size;
++	uint16_t	linked_bcb_cnt;
++	uint32_t	rec_data_size;
++	volatile uint16_t *next_mb;
++	device_reg_t	*reg = ha->iobase;
++	struct buffer_cb *bcb;
++	struct buffer_cb *nbcb;
++
++	DEBUG12(printk("%s: enter\n", __func__);)
++
++	next_mb = &reg->mailbox10;
++
++	/* If split buffer, set header size for 1st buffer */
++	if (type == MBA_IP_RECEIVE_COMPLETE_SPLIT)
++		rec_data_size = ha->header_size;
++	else
++		rec_data_size = ha->receive_buff_data_size;
++
++	handle = RD_REG_WORD(next_mb);
++	if (handle >= ha->max_receive_buffers) {
++		goto invalid_handle;
++	}
++
++	bcb = &ha->receive_buffers[handle];
++
++	if (!test_and_clear_bit(BCB_RISC_OWNS_BUFFER, &bcb->state)) {
++		goto invalid_handle;
++	}
++
++	packet_size = RD_REG_WORD(&reg->mailbox3);
++	/* Fastpost entries are always successfully transferred */
++	bcb->comp_status = CS_COMPLETE;
++	bcb->packet_size = packet_size;
++	nbcb = bcb;
++
++	/* Prepare any linked buffers */
++	for (linked_bcb_cnt = 1; ; linked_bcb_cnt++) {
++		if (packet_size > rec_data_size) {
++			nbcb->rec_data_size = rec_data_size;
++			packet_size -= rec_data_size;
++			/*
++			 * If split buffer, only use header size on 1st buffer
++			 */
++			rec_data_size = ha->receive_buff_data_size;
++
++			next_mb++;
++			handle = RD_REG_WORD(next_mb);
++			if (handle >= ha->max_receive_buffers) {
++invalid_handle:
++				printk(KERN_WARNING
++					"%s: bad IP receive fast post handle "
++					"%x\n", 
++					__func__,
++					handle);
++				set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++				return;
++			}
++
++			nbcb->next_bcb = &ha->receive_buffers[handle];
++			nbcb = nbcb->next_bcb;
++
++			if (!test_and_clear_bit(BCB_RISC_OWNS_BUFFER,
++							&nbcb->state)) {
++				goto invalid_handle;
++			}
++		}
++		else {
++			/* Single buffer_cb */
++			nbcb->rec_data_size = packet_size;
++			nbcb->next_bcb = NULL;
++			break;
++		}
++	}
++
++	/* Pass received packet to IP driver */
++	bcb->linked_bcb_cnt = linked_bcb_cnt;
++	(*ha->receive_packets_routine)(ha->receive_packets_context, bcb);
++
++	/* Keep track of RISC buffer pointer (for IP reinit) */
++	ha->rec_entries_out += linked_bcb_cnt;
++	if (ha->rec_entries_out >= IP_BUFFER_QUEUE_DEPTH)
++		ha->rec_entries_out -= IP_BUFFER_QUEUE_DEPTH;
++}
++
++/**
++ * qla2x00_convert_to_arp() - Convert an IP send packet to an ARP packet
++ * @ha: SCSI driver HA context
++ * @scb: The send_cb structure to convert
++ *
++ * Returns TRUE if conversion successful.
++ */
++static int
++qla2x00_convert_to_arp(scsi_qla_host_t *ha, struct send_cb *scb)
++{
++	struct sk_buff		*skb;
++	struct packet_header	*packethdr;
++	struct arp_header	*arphdr;
++	struct ip_header	*iphdr;
++
++	DEBUG12(printk("%s: convert packet to ARP\n", __func__);)
++
++	skb = scb->skb;
++	packethdr = scb->header;
++	arphdr = (struct arp_header *)skb->data;
++	iphdr  = (struct ip_header *)skb->data;
++
++	if (packethdr->snaph.ethertype == __constant_htons(ETH_P_IP)) {
++		/* Convert IP packet to ARP packet */
++		packethdr->networkh.d.na.naa = NAA_IEEE_MAC_TYPE;
++		packethdr->networkh.d.na.unused = 0;
++		memcpy(packethdr->networkh.d.na.addr,
++				hwbroadcast_addr, ETH_ALEN);
++		packethdr->snaph.ethertype = __constant_htons(ETH_P_ARP);
++
++		arphdr->ar_tip = iphdr->iph.daddr;
++		arphdr->ar_sip = iphdr->iph.saddr;
++		arphdr->arph.ar_hrd = __constant_htons(ARPHRD_IEEE802);
++		arphdr->arph.ar_pro = __constant_htons(ETH_P_IP);
++		arphdr->arph.ar_hln = ETH_ALEN;
++		arphdr->arph.ar_pln = sizeof(iphdr->iph.daddr); /* 4 */
++		arphdr->arph.ar_op = __constant_htons(ARPOP_REQUEST);
++		memcpy(arphdr->ar_sha, packethdr->networkh.s.na.addr, ETH_ALEN);
++		memset(arphdr->ar_tha, 0, ETH_ALEN);
++
++		skb->len = sizeof(struct arp_header);
++
++		return (TRUE);
++	}
++	else {
++		return (FALSE);
++	}
++}
++
++/**
++ * qla2x00_get_ip_loopid() - Retrieve loop id of an IP device.
++ * @ha: SCSI driver HA context
++ * @packethdr: IP device to remove
++ * @loop_id: loop id of discovered device
++ *
++ * This routine will interrogate the packet header to determine if the sender is
++ * in the list of active IP devices.  The first two bytes of the destination
++ * address will be modified to match the port name stored in the active IP
++ * device list.
++ *
++ * Returns TRUE if a valid loop id is returned.
++ */
++static int
++qla2x00_get_ip_loopid(scsi_qla_host_t *ha,
++		struct packet_header *packethdr, uint8_t *loop_id)
++{
++	struct ip_device *ipdev;
++
++	/* Scan list of logged in IP devices for match */
++	for (ipdev = ha->ipdev_db_top; ipdev; ipdev = ipdev->next) {
++		if (memcmp(&ipdev->port_name[2],
++				&(packethdr->networkh.d.fcaddr[2]), ETH_ALEN))
++			continue;
++
++		/* Found match, return loop ID  */
++		*loop_id = (uint8_t)ipdev->loop_id;
++
++		/* Update first 2 bytes of port name */
++		packethdr->networkh.d.fcaddr[0] = ipdev->port_name[0];
++		packethdr->networkh.d.fcaddr[1] = ipdev->port_name[1];
++
++		if (ipdev != ha->ipdev_db_top) {
++			/* Device not at top, move it to top of list */
++			/* Unhook it first */
++			if (ipdev == ha->ipdev_db_bottom) {
++				ha->ipdev_db_bottom = ipdev->last;
++				ipdev->last->next = NULL;
++			}
++			else {
++				ipdev->last->next = ipdev->next;
++				ipdev->next->last = ipdev->last;
++			}
++
++			/* Now put it at top of list */
++			ipdev->next = ha->ipdev_db_top;
++			ipdev->last = NULL;
++			ha->ipdev_db_top->last = ipdev;
++			ha->ipdev_db_top = ipdev;
++		}
++		return (TRUE);
++	}
++
++	/* Check for broadcast packet */
++	if (!memcmp(packethdr->networkh.d.na.addr,
++				hwbroadcast_addr, ETH_ALEN)) {
++		/* Broadcast packet, return broadcast loop ID  */
++		*loop_id = BROADCAST;
++
++		/* Update destination NAA of header */
++		packethdr->networkh.d.na.naa = NAA_IEEE_MAC_TYPE;
++		packethdr->networkh.d.na.unused = 0;
++
++		return (TRUE);
++	}
++
++	/* Check for multicast packet */
++	if (packethdr->networkh.d.na.addr[0] & 0x01) {
++		/* Use broadcast loop ID for multicast packets  */
++		*loop_id = BROADCAST;
++
++		/* Update destination NAA of header */
++		packethdr->networkh.d.na.naa = NAA_IEEE_MAC_TYPE;
++		packethdr->networkh.d.na.unused = 0;
++
++		return (TRUE);
++	}
++
++	/* TODO */
++	/* Try sending FARP IOCB to request login */
++
++	DEBUG12(printk("%s: ID not found for "
++			"XX XX %02x %02x %02x %02x %02x %02x\n",
++			__func__,
++			packethdr->networkh.d.na.addr[0],
++			packethdr->networkh.d.na.addr[1],
++			packethdr->networkh.d.na.addr[2],
++			packethdr->networkh.d.na.addr[3],
++			packethdr->networkh.d.na.addr[4],
++			packethdr->networkh.d.na.addr[5]);)
++
++	return (FALSE);
++}
++
++/**
++ * qla2x00_reserve_loopid() - Reserve an unused public loop id.
++ * @ha: SCSI driver HA context
++ * @loop_id: loop id reserved
++ *
++ * Returns QL_STATUS_SUCCESS if a valid loop id is returned.
++ */
++static int
++qla2x00_reserve_loopid(scsi_qla_host_t *ha, uint16_t *loop_id)
++{
++	int i;
++
++	/* Look for unused loop ID */
++	for (i = ha->min_external_loopid; i < ha->max_public_loop_ids; i++) {
++		if (ha->fabricid[i].in_use)
++			continue;
++
++		/* Found free loop ID */
++		ha->fabricid[i].in_use = TRUE;
++		*loop_id = i;
++
++		DEBUG12(printk("%s: assigned loop ID %x\n",
++				__func__,
++				*loop_id);)
++
++		return (QL_STATUS_SUCCESS);
++	}
++
++	/* Out of loop IDs */
++	*loop_id = ha->max_public_loop_ids + 1;     /* Set out of range */
++
++	DEBUG12(printk("%s: out of loop IDs\n", __func__);)
++
++	return (QL_STATUS_RESOURCE_ERROR);
++}
++
++/**
++ * qla2x00_free_loopid() - Free a public loop id.
++ * @ha: SCSI driver HA context
++ * @loop_id: loop id to free
++ */
++static void
++qla2x00_free_loopid(scsi_qla_host_t *ha, uint16_t loop_id)
++{
++	if (loop_id < ha->max_public_loop_ids) {
++		ha->fabricid[loop_id].in_use = FALSE;
++		DEBUG12(printk("%s: free loop ID %x\n",
++				__func__,
++				loop_id);)
++	}
++	else {
++		DEBUG12(printk("%s: loop ID %x out of range\n",
++				__func__,
++				loop_id);)
++	}
++}
++
++
++/**
++ * qla2x00_add_new_ip_device() - Add a new IP capable device to the list.
++ * @ha: SCSI driver HA context
++ * @loop_id: loop id, if a private loop, of the new device
++ * @port_id: port id of the new device
++ * @port_name: port name of the new device
++ * @force_add: should the function force the addition of the device
++ * @ha_locked: Flag indicating if the function is called with the hardware lock
++ *
++ * Prior to RISC IP initialization, this routine, if necessary, will reset all
++ * buffers in the receive buffer ring.
++ *
++ * Returns QL_STATUS_SUCCESS if there were no errors adding the device.
++ */
++static int
++qla2x00_add_new_ip_device(scsi_qla_host_t *ha,
++			     uint16_t loop_id,
++			     uint8_t *port_id,
++			     uint8_t *port_name,
++			     int force_add,
++			     uint32_t ha_locked)
++{
++	int	status;
++	struct ip_device *ipdev;
++
++	/* Get free IP device block */
++	status = qla2x00_reserve_ip_block(ha, &ipdev);
++	if (status == QL_STATUS_RESOURCE_ERROR) {
++		if (!force_add)
++			return (status);
++
++		/*
++		 * Out of IP blocks, bump public device at bottom of list
++		 */
++		DEBUG12(printk("%s: bump device from IP list\n", __func__);)
++
++		for (ipdev = ha->ipdev_db_bottom; ipdev; ipdev = ipdev->last) {
++			if (!(ipdev->flags & IP_DEV_FLAG_PUBLIC_DEVICE))
++				continue;
++
++			/* Do fabric logout and free loop ID */
++			qla2x00_ip_send_logout_port_iocb(ha, ipdev, ha_locked);
++			qla2x00_free_loopid(ha, ipdev->loop_id);
++
++			/* Move device to top of list */
++			qla2x00_free_ip_block(ha, ipdev);
++			status = qla2x00_reserve_ip_block(ha, &ipdev);
++			break;
++		}
++		if (status != QL_STATUS_SUCCESS)
++			return (status);
++	}
++
++	/* Save IP port name */
++	memcpy(ipdev->port_name, port_name, WWN_SIZE);
++
++	if (loop_id != PUBLIC_LOOP_DEVICE) {
++		/* Private loop device */
++		ipdev->loop_id = loop_id;
++		ipdev->flags = IP_DEV_FLAG_PRESENT;
++
++		DEBUG12(printk("%s: WWN:%02x%02x%02x%02x%02x%02x%02x%02x, "
++				"LoopID:%x\n",
++				__func__,
++				ipdev->port_name[0],
++				ipdev->port_name[1],
++				ipdev->port_name[2],
++				ipdev->port_name[3],
++				ipdev->port_name[4],
++				ipdev->port_name[5],
++				ipdev->port_name[6],
++				ipdev->port_name[7],
++				ipdev->loop_id);)
++	}
++	else {
++		/* Public device */
++		/* Reserve public loop ID, save it in database */
++		status = qla2x00_reserve_loopid(ha, &ipdev->loop_id);
++		if (status == QL_STATUS_RESOURCE_ERROR) {
++			struct ip_device *ipdev_bump;
++
++			if (!force_add) { 
++				/* Failed to get loop ID */
++				DEBUG12(printk("%s: failed to get loop ID\n",
++						__func__);)
++				qla2x00_free_ip_block(ha, ipdev);
++
++				return (status);
++			}
++
++			/*
++			 * Out of loop IDs, bump public device at bottom of
++			 * list.
++			 */
++			DEBUG12(printk("%s: bump device from IP list\n",
++					__func__);)
++
++			for (ipdev_bump = ha->ipdev_db_bottom;
++				ipdev_bump;
++				ipdev_bump = ipdev_bump->last) {
++
++				if (!(ipdev_bump->flags &
++						IP_DEV_FLAG_PUBLIC_DEVICE))
++					continue;
++
++				/*
++				 * Do fabric logout, steal loop ID, free bumped
++				 * IP block.
++				 */
++				qla2x00_ip_send_logout_port_iocb(ha,
++						ipdev_bump, ha_locked);
++				ipdev->loop_id = ipdev_bump->loop_id;
++				qla2x00_free_ip_block(ha, ipdev_bump);
++
++				status = QL_STATUS_SUCCESS;
++				break;
++			}
++
++			if (status != QL_STATUS_SUCCESS) {
++				/* Failed to get loop ID */
++				DEBUG12(printk("%s: failed to get loop ID\n",
++						__func__);)
++				qla2x00_free_ip_block(ha, ipdev);
++
++				return (status);
++			}
++		}
++
++		/* Save device data */
++		ipdev->port_id[0] = port_id[0];
++		ipdev->port_id[1] = port_id[1];
++		ipdev->port_id[2] = port_id[2];
++		ipdev->flags = IP_DEV_FLAG_PUBLIC_DEVICE;
++
++		/* Login public device */
++		status = qla2x00_ip_send_login_port_iocb(ha, ipdev, ha_locked);
++		if (status == QL_STATUS_SUCCESS) {
++			DEBUG12(printk("%s: "
++					"WWN:%02x%02x%02x%02x%02x%02x%02x%02x, "
++					"LoopID:%x, PortID:%x\n",
++					__func__,
++					ipdev->port_name[0],
++					ipdev->port_name[1],
++					ipdev->port_name[2],
++					ipdev->port_name[3],
++					ipdev->port_name[4],
++					ipdev->port_name[5],
++					ipdev->port_name[6],
++					ipdev->port_name[7],
++					ipdev->loop_id,
++					ipdev->port_id[2]<<16 |
++					ipdev->port_id[1]<<8 |
++					ipdev->port_id[0]);)
++		}
++		else {
++			/* Login failed, return resources */
++			qla2x00_free_loopid(ha, ipdev->loop_id);
++			qla2x00_free_ip_block(ha, ipdev);
++		}
++	}
++
++	return (status);
++}
++
++/**
++ * qla2x00_free_ip_block() - Remove an IP device from the active IP list.
++ * @ha: SCSI driver HA context
++ * @ipdev: IP device to remove
++ */
++static void
++qla2x00_free_ip_block(scsi_qla_host_t *ha, struct ip_device *ipdev)
++{
++	/* Unhook IP device block from active list */
++	if (ipdev->last == NULL)
++		ha->ipdev_db_top = ipdev->next;
++	else
++		ipdev->last->next = ipdev->next;
++
++	if (ipdev->next == NULL)
++		ha->ipdev_db_bottom = ipdev->last;
++	else
++		ipdev->next->last = ipdev->last;
++
++	/* Add IP device block to free list */
++	ipdev->next = ha->ipdev_db_next_free;
++	ha->ipdev_db_next_free = ipdev;
++}
++
++/**
++ * qla2x00_reserve_ip_block() - Move an IP device to the IP device list.
++ * @ha: SCSI driver HA context
++ * @ipdevblk: reserved IP device to add 
++ *
++ * This routine will move the unused @ipdevblk from the free list to the top of
++ * the active IP device list.
++ *
++ * Returns QL_STATUS_SUCCESS if the operation succeeded.
++ */
++static int
++qla2x00_reserve_ip_block(scsi_qla_host_t *ha, struct ip_device **ipdevblk)
++{
++	struct ip_device *ipdev;
++
++	/* Get free IP device block */
++	ipdev = ha->ipdev_db_next_free;
++	if (ipdev) { 
++		/* Remove IP device block from free list */
++		ha->ipdev_db_next_free = ipdev->next;
++
++		/* Add IP device block to top of IP device list */
++		ipdev->next = ha->ipdev_db_top;
++		ipdev->last = NULL;
++		if (ha->ipdev_db_top == NULL)
++			ha->ipdev_db_bottom = ipdev;
++		else
++			ha->ipdev_db_top->last = ipdev;
++		ha->ipdev_db_top = ipdev;
++
++		*ipdevblk = ipdev;
++
++		return (QL_STATUS_SUCCESS);
++	}
++
++	/* Out of IP blocks */
++	DEBUG12(printk("%s: out of IP blocks\n", __func__);)
++
++	return (QL_STATUS_RESOURCE_ERROR);
++}
++
++/**
++ * qla2x00_update_ip_device_data() - Update IP device list with driver data.
++ * @ha: SCSI driver HA context
++ * @fcdev: SCSI driver FC device list
++ *
++ * This routine searchs for the device port name in the current IP database and
++ * updates the IP device list.
++ *
++ * If device found:
++ *	- Handle device movement between public and private loops
++ *	- Mark device present
++ *	- Log in device if necessary
++ * If device not found and private loop device:
++ *	- Insert the new entry in database
++ * If device not found and public IP device:
++ * 	- Ignore device until packet received from device
++ *
++ * Returns QL_STATUS_SUCCESS if the operation succeeded.
++ */
++static int
++qla2x00_update_ip_device_data(scsi_qla_host_t *ha, fcdev_t *fcdev)
++{
++	int	status;
++	struct ip_device *ipdev;
++
++	status = 0;
++
++	if (!ha->flags.enable_ip) {
++		/* IP not enabled, just return */
++		return (QL_STATUS_SUCCESS);
++	}
++
++	/* Scan list of IP devices for match */
++	for (ipdev = ha->ipdev_db_top; ipdev; ipdev = ipdev->next) {
++		if (memcmp(fcdev->wwn, ipdev->port_name, WWN_SIZE))
++			continue;
++
++		/* Found device in IP device list */
++		DEBUG12(printk("%s: already in IP list, port ID: %x\n",
++				__func__,
++				ipdev->port_id[2] << 16 |
++				 ipdev->port_id[1] << 8 |
++				 ipdev->port_id[0]);)
++
++		if (fcdev->flag != DEV_PUBLIC &&
++			!(ipdev->flags & IP_DEV_FLAG_PUBLIC_DEVICE)) {
++			/*
++			 * Device on private loop now, was on private loop
++			 * before.
++			 */
++			DEBUG12(printk("%s: was private loop, now "
++					"private loop\n",
++					__func__);)
++
++			/* Update private loop ID in database */
++			ipdev->loop_id = fcdev->loop_id;
++			ipdev->flags |= IP_DEV_FLAG_PRESENT;
++		}
++		else if (fcdev->flag != DEV_PUBLIC &&
++				(ipdev->flags & IP_DEV_FLAG_PUBLIC_DEVICE)) {
++			/*
++			 * Device on private loop now, was public device before.
++			 */
++			DEBUG12(printk("%s: was public, now private loop\n",
++					__func__);)
++
++			/*
++			 * If loop ID changed, logout device and free loop ID.
++			 */
++			if (fcdev->loop_id != ipdev->loop_id) { 
++				qla2x00_ip_send_logout_port_iocb(ha, ipdev, 0);
++				qla2x00_free_loopid(ha, ipdev->loop_id);
++
++				/*
++				 * Clear public device flag and save private
++				 * loop ID in database.
++				 */
++				ipdev->flags &= ~IP_DEV_FLAG_PUBLIC_DEVICE;
++				ipdev->loop_id = fcdev->loop_id;
++			}
++			ipdev->flags |= IP_DEV_FLAG_PRESENT;
++		}
++		else if (fcdev->flag == DEV_PUBLIC &&
++				!(ipdev->flags & IP_DEV_FLAG_PUBLIC_DEVICE)) {
++			/*
++			 * Device public now, was on private loop before.
++			 */
++			DEBUG12(printk("%s: was private loop, now public\n",
++					__func__);)
++
++			/*
++			 * Reserve public loop ID, save it in database.
++			 */
++			status = qla2x00_reserve_loopid(ha, &ipdev->loop_id);
++			if (status == QL_STATUS_SUCCESS) { 
++				/*
++				 * Save port ID and set public device flag.
++				 */
++				ipdev->port_id[0] = fcdev->d_id.r.d_id[0];
++				ipdev->port_id[1] = fcdev->d_id.r.d_id[1];
++				ipdev->port_id[2] = fcdev->d_id.r.d_id[2];
++				ipdev->flags |= IP_DEV_FLAG_PUBLIC_DEVICE;
++
++				/* Login public device */
++				status = qla2x00_ip_send_login_port_iocb(ha,
++							ipdev, 0);
++			}
++			if (status == QL_STATUS_RESOURCE_ERROR) {
++				/* Out of loop IDs */
++				ipdev->flags &= ~IP_DEV_FLAG_PUBLIC_DEVICE;
++			}
++		}
++		else {
++			/*
++			 * Device public now, was public device before.
++			 */
++			DEBUG12(printk("%s: was public, now public\n",
++					__func__);)
++
++			/* Check if port ID changed */
++			if (ipdev->port_id[0] != fcdev->d_id.r.d_id[0] ||
++				ipdev->port_id[1] != fcdev->d_id.r.d_id[1] ||
++				ipdev->port_id[2] != fcdev->d_id.r.d_id[2]) {
++
++				/* Save new port ID */
++				ipdev->port_id[0] = fcdev->d_id.r.d_id[0];
++				ipdev->port_id[1] = fcdev->d_id.r.d_id[1];
++				ipdev->port_id[2] = fcdev->d_id.r.d_id[2];
++
++				DEBUG12(printk("%s: Port ID changed\n",
++						__func__);)
++
++				/* Logout public device */
++				qla2x00_ip_send_logout_port_iocb(ha, ipdev, 0);
++			}
++
++			/* Login public device */
++			status = qla2x00_ip_send_login_port_iocb(ha, ipdev, 0);
++			if (status == QL_STATUS_RESOURCE_ERROR) {
++				/* Out of loop IDs */
++				ipdev->flags &= ~IP_DEV_FLAG_PUBLIC_DEVICE;
++			}
++		}
++		return (status);
++	}
++
++	/* Device not found in database */
++	DEBUG12(printk("%s: device NOT in list\n", __func__);)
++
++	/* If private loop device, add device to IP list */
++	/* Public devices will be added as needed when packet received */
++	if (fcdev->flag != DEV_PUBLIC) {
++		/* Add (force) new private loop device to IP list */
++		status = qla2x00_add_new_ip_device(ha,
++					fcdev->loop_id,
++					NULL,
++					fcdev->wwn,
++					TRUE,
++					0);
++	}
++
++	/* The following code is temporary, until FARP supported */
++	/* Login all IP public devices for now */
++	if (fcdev->flag == DEV_PUBLIC) {
++		/* Add (don't force) new public device to IP list */
++		status = qla2x00_add_new_ip_device(ha,
++					PUBLIC_LOOP_DEVICE,
++					(uint8_t *)&fcdev->d_id,
++					fcdev->wwn,
++					FALSE,
++					0);
++	}
++
++	return (status);
++}
++
++/**
++ * qla2x00_ip_send_login_port_iocb() - Login to an IP device.
++ * @ha: SCSI driver HA context
++ * @ipdev: IP device to login to
++ * @ha_locked: Flag indicating if the function is called with the hardware lock
++ *
++ * This routine will build and send a mailbox IOCB to login to a fabric port.
++ *
++ * The qla2x00_ip_mailbox_iocb_done() routine will be called upon IOCB
++ * completion, where further processing is performed.
++ *
++ * Returns QL_STATUS_SUCCESS if the operation succeeded.
++ */
++static int
++qla2x00_ip_send_login_port_iocb(scsi_qla_host_t *ha,
++				struct ip_device *ipdev, uint32_t ha_locked)
++{
++	unsigned long	flags = 0;
++	struct mbx_entry *mbxentry;
++
++	DEBUG12(printk("%s: port ID: %x\n",
++			__func__,
++			ipdev->port_id[2]<<16 |
++			ipdev->port_id[1]<<8 |
++			ipdev->port_id[0]);)
++
++	/* Send marker if required */
++	if (ha->marker_needed != 0) {
++		if (ha_locked) {
++			if(__qla2x00_marker(ha,
++					0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS)
++				return (QL_STATUS_ERROR);
++		}
++		else {
++			if(qla2x00_marker(ha,
++					0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS)
++				return (QL_STATUS_ERROR);
++		}
++		ha->marker_needed = 0;
++	}
++
++	if (!ha_locked)
++		spin_lock_irqsave(&ha->hardware_lock, flags);
++
++	mbxentry = (struct mbx_entry *)qla2x00_req_pkt(ha);
++	if (mbxentry == NULL) {
++		DEBUG12(printk("%s: failed\n", __func__);)
++
++		if (!ha_locked)
++			spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++		return (QL_STATUS_ERROR);
++	}
++
++	/* Build fabric login MBX IOCB */
++	mbxentry->entry_type = ET_MAILBOX_COMMAND;
++	mbxentry->entry_count = 1;
++	mbxentry->sys_define1 = SOURCE_IP;
++	mbxentry->entry_status = 0;
++	mbxentry->handle = cpu_to_le32(ipdev->index |
++				(MBC_LOGIN_FABRIC_PORT << 16));
++	mbxentry->loop_id = ipdev->loop_id;
++	mbxentry->mb0 = __constant_cpu_to_le16(MBC_LOGIN_FABRIC_PORT);
++	mbxentry->mb1 = cpu_to_le16((ipdev->loop_id << 8) | 
++				(MBC_NO_PROCESS_LOGIN |
++				 MBC_NO_PLOGI_IF_LOGGED_IN));
++	mbxentry->mb2 = cpu_to_le16(ipdev->port_id[2]);
++	mbxentry->mb3 = cpu_to_le16((ipdev->port_id[1] << 8) |
++				ipdev->port_id[0]);
++	mbxentry->mb6 = __constant_cpu_to_le16(0);
++	mbxentry->mb7 = __constant_cpu_to_le16(0);
++
++	/* Issue command to ISP */
++	qla2x00_isp_cmd(ha);
++
++	if (!ha_locked)
++		spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++	return (QL_STATUS_SUCCESS);
++}
++
++/**
++ * qla2x00_ip_send_logout_port_iocb() - Logout an IP device.
++ * @ha: SCSI driver HA context
++ * @ipdev: IP device to logout
++ * @ha_locked: Flag indicating if the function is called with the hardware lock
++ *
++ * This routine will build and send a mailbox IOCB to logout a fabric port.
++ *
++ * The qla2x00_ip_mailbox_iocb_done() routine will be called upon IOCB
++ * completion, where further processing is performed.
++ *
++ * Returns QL_STATUS_SUCCESS if the operation succeeded.
++ */
++static int
++qla2x00_ip_send_logout_port_iocb(scsi_qla_host_t *ha,
++				struct ip_device *ipdev, uint32_t ha_locked)
++{
++	unsigned long	flags = 0;
++	struct mbx_entry *mbxentry;
++
++	DEBUG12(printk("%s: port ID: %x\n",
++			__func__,
++			ipdev->port_id[2]<<16 |
++			ipdev->port_id[1]<<8 |
++			ipdev->port_id[0]);)
++
++	/* Send marker if required */
++	if (ha->marker_needed != 0) {
++		if (ha_locked) {
++			if(__qla2x00_marker(ha,
++					0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS)
++				return (QL_STATUS_ERROR);
++		}
++		else {
++			if(qla2x00_marker(ha,
++					0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS)
++				return (QL_STATUS_ERROR);
++		}
++		ha->marker_needed = 0;
++	}
++
++	if (!ha_locked)
++		spin_lock_irqsave(&ha->hardware_lock, flags);
++
++	mbxentry = (struct mbx_entry *)qla2x00_req_pkt(ha);
++	if (mbxentry == NULL) {
++		DEBUG12(printk("%s: failed\n", __func__);)
++
++		if (!ha_locked)
++			spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++		return (QL_STATUS_ERROR);
++	}
++
++	/* Build fabric logout MBX IOCB */
++	mbxentry->entry_type = ET_MAILBOX_COMMAND;
++	mbxentry->entry_count = 1;
++	mbxentry->sys_define1 = SOURCE_IP;
++	mbxentry->entry_status = 0;
++	mbxentry->handle = cpu_to_le32(ipdev->index |
++				(MBC_LOGOUT_FABRIC_PORT << 16));
++	mbxentry->loop_id = ipdev->loop_id;
++	mbxentry->mb0 = __constant_cpu_to_le16(MBC_LOGOUT_FABRIC_PORT);
++	mbxentry->mb1 = cpu_to_le16(ipdev->loop_id << 8);
++	mbxentry->mb2 = __constant_cpu_to_le16(0);
++	mbxentry->mb3 = __constant_cpu_to_le16(0);
++	mbxentry->mb6 = __constant_cpu_to_le16(0);
++	mbxentry->mb7 = __constant_cpu_to_le16(0);
++
++	/* Issue command to ISP */
++	qla2x00_isp_cmd(ha);
++
++	if (!ha_locked)
++		spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++	return (QL_STATUS_SUCCESS);
++}
++
++/**
++ * qla2x00_ip_mailbox_iocb_done() - Process an mailbox IOCB completion.
++ * @ha: SCSI driver HA context
++ * @mbxentry: completed mailbox IOCB entry
++ *
++ * This routine is currently used for fabric login and logouts only.
++ */
++static void
++qla2x00_ip_mailbox_iocb_done(scsi_qla_host_t *ha, struct mbx_entry *mbxentry)
++{
++	int		status;
++	uint16_t	cmd;
++	uint16_t	index;
++	struct ip_device *ipdev;
++// FIXME: endianess?
++	/* Parse-out originating mailbox command */
++	cmd = MSW(mbxentry->handle);
++
++	DEBUG12(printk("%s: cmd %x, status %x, mb0 %x, mb1 %x, mb2 %x\n",
++			__func__,
++			cmd,
++			mbxentry->status,
++			mbxentry->mb0,
++			mbxentry->mb1,
++			mbxentry->mb2);)
++
++	/* Get device block pointer */
++	index = LSW(mbxentry->handle);
++	if (index >= QLLAN_MAX_IP_DEVICES) {
++		/* Bad handle from ISP */
++		DEBUG12(printk("%s: bad handle from isp\n", __func__);)
++
++		/* TODO: Cleanup??? */
++
++		return;
++	}
++
++	ipdev = &ha->ipdev_db[index];
++
++	if (cmd == MBC_LOGOUT_FABRIC_PORT) {
++		/* Check fabric logout completion status */
++		if (/*mbxentry->status == CS_COMPLETE && */
++			mbxentry->mb0 == MBS_COMMAND_COMPLETE) {
++
++			/* Logout successful -- do nothing */
++		}
++		else {
++			DEBUG12(printk("%s: fabric logout failed\n", __func__);)
++		}
++	}
++	else {
++		/* Check fabric login completion status */
++		/* Note: sometimes ISP returns Status=0x30 and MB0=0x4000 */
++		/* Therefore, only check mb0 for now */
++		if (/* mbxentry->status == CS_COMPLETE && */
++			mbxentry->mb0 == MBS_COMMAND_COMPLETE) {
++
++			/* Login successful */
++			ipdev->flags |= IP_DEV_FLAG_PRESENT;
++		}
++		else if (mbxentry->mb0 == MBS_PORT_ID_IN_USE) {
++			/* Different loop ID already assigned to port ID */
++			/* Use the one that is already assigned */
++			qla2x00_free_loopid(ha, ipdev->loop_id);
++			ipdev->loop_id = mbxentry->mb1;
++
++			/* Do logout first and then relogin */
++			qla2x00_ip_send_logout_port_iocb(ha, ipdev, 1);
++			qla2x00_ip_send_login_port_iocb(ha, ipdev, 1);
++		}
++		else if (mbxentry->mb0 == MBS_LOOP_ID_IN_USE) {
++			/* Loop ID already used for different port ID */
++			/* Get a new loop ID and reissue login request */
++			status = qla2x00_reserve_loopid(ha, &ipdev->loop_id);
++			if (status == QL_STATUS_SUCCESS) {
++				qla2x00_ip_send_login_port_iocb(ha, ipdev, 1);
++			}
++			else {
++				DEBUG12(printk("%s: out of loop IDs\n",
++						__func__);)
++
++				qla2x00_free_ip_block(ha, ipdev);
++			}
++		}
++		else {
++			/* Login failed, return resources */
++			DEBUG12(printk("%s: fabric login failed\n", __func__);)
++
++			qla2x00_free_loopid(ha, ipdev->loop_id);
++			qla2x00_free_ip_block(ha, ipdev);
++		}
++	}
++}
++
++
++/**
++ * qla2x00_ip_inquiry() - Discover IP-capable adapters.
++ * @adapter_num: adapter number to check (instance)
++ * @inq_data: return bd_inquiry data of the discovered adapter
++ *
++ * This routine is called by the IP driver to discover adapters that support IP
++ * and to get adapter parameters from the SCSI driver.
++ *
++ * Returns TRUE if the specified adapter supports IP.
++ */
++#if defined (ISP2200)
++int
++qla2200_ip_inquiry(uint16_t adapter_num, struct bd_inquiry *inq_data)
++#elif defined(ISP2300)
++int
++qla2300_ip_inquiry(uint16_t adapter_num, struct bd_inquiry *inq_data)
++#endif
++{
++	int	found;
++	struct list_head *hal;
++	scsi_qla_host_t *ha;
++
++	/* Verify structure size and version */
++	if ((inq_data->length != BDI_LENGTH) ||
++		(inq_data->version != BDI_VERSION)) {
++
++		DEBUG12(printk("%s: incompatable structure\n", __func__);)
++		return (FALSE);
++	}
++
++	/* Find the specified host adapter */
++	ha = NULL;
++	found = 0;
++	read_lock(&qla_hostlist_lock);
++	list_for_each(hal, &qla_hostlist) {
++		ha = list_entry(hal, scsi_qla_host_t, list);
++
++		if (ha->instance == adapter_num) {
++			found++;
++			break;
++		}
++	}
++	read_unlock(&qla_hostlist_lock);
++
++	if (found) {
++		if (!ha->flags.online)
++			return (FALSE);
++
++		DEBUG12(printk("%s: found adapter %d\n",
++				__func__,
++				adapter_num);)
++
++		/* Return inquiry data to backdoor IP driver */
++		set_bit(BDI_IP_SUPPORT, &inq_data->options);
++		if (ha->flags.enable_64bit_addressing)
++			set_bit(BDI_64BIT_ADDRESSING, &inq_data->options);
++		inq_data->ha = ha;                
++		inq_data->risc_rec_q = ha->risc_rec_q;
++		inq_data->risc_rec_q_size = IP_BUFFER_QUEUE_DEPTH;
++		inq_data->link_speed = ha->current_speed;
++		memcpy(inq_data->port_name, ha->ip_port_name, WWN_SIZE);
++		inq_data->pdev = ha->pdev;
++		inq_data->ip_enable_routine = qla2x00_ip_enable;
++		inq_data->ip_disable_routine = qla2x00_ip_disable;
++		inq_data->ip_add_buffers_routine = qla2x00_add_buffers;
++		inq_data->ip_send_packet_routine = qla2x00_send_packet;
++		inq_data->ip_tx_timeout_routine = qla2x00_tx_timeout;
++		return (TRUE);
++	}
++	return (FALSE);
++}
++
++/**
++ * qla2x00_ip_enable() - Create IP-driver/SCSI-driver IP connection.
++ * @ha: SCSI driver HA context
++ * @enable_data: bd_enable data describing the IP connection
++ *
++ * This routine is called by the IP driver to enable an IP connection to the
++ * SCSI driver and to pass in IP driver parameters.
++ *
++ * The HA context is propagated with the specified @enable_data and the
++ * Firmware is initialized for IP support.
++ * 
++ * Returns TRUE if the IP connection was successfully enabled.
++ */
++static int
++qla2x00_ip_enable(scsi_qla_host_t *ha, struct bd_enable *enable_data)
++{
++	int status;
++
++	DEBUG12(printk("%s: enable adapter %d\n", __func__, (int)ha->host_no);)
++
++	status = FALSE;
++
++	/* Verify structure size and version and adapter online */
++	if (!(ha->flags.online) ||
++		(enable_data->length != BDE_LENGTH) ||
++		(enable_data->version != BDE_VERSION)) {
++
++		DEBUG12(printk("%s: incompatable structure or offline\n",
++				__func__);)
++		return (status);
++	}
++
++	/* Save parameters from IP driver */
++	ha->mtu = enable_data->mtu;
++	ha->header_size = enable_data->header_size;
++	ha->receive_buffers = enable_data->receive_buffers;
++	ha->max_receive_buffers = enable_data->max_receive_buffers;
++	ha->receive_buff_data_size = enable_data->receive_buff_data_size;
++	if (test_bit(BDE_NOTIFY_ROUTINE, &enable_data->options)) {
++		ha->notify_routine = enable_data->notify_routine;
++		ha->notify_context = enable_data->notify_context;
++	}
++	ha->send_completion_routine = enable_data->send_completion_routine;
++	ha->receive_packets_routine = enable_data->receive_packets_routine;
++	ha->receive_packets_context = enable_data->receive_packets_context;
++
++	/* Enable RISC IP support */
++	status = qla2x00_ip_initialize(ha);
++	if (!status) {
++		DEBUG12(printk("%s: IP initialization failed", __func__);)
++		ha->notify_routine = NULL;
++	}
++	return (status);
++}
++
++/**
++ * qla2x00_ip_disable() - Remove IP-driver/SCSI-driver IP connection.
++ * @ha: SCSI driver HA context
++ *
++ * This routine is called by the IP driver to disable a previously created IP
++ * connection.
++ *
++ * A Firmware call to disable IP support is issued.
++ */
++static void
++qla2x00_ip_disable(scsi_qla_host_t *ha)
++{
++	int	rval;
++	static mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG12(printk("%s: disable adapter %d\n", __func__, (int)ha->host_no);)
++
++	/* Wait for a ready state from the adapter */
++	while (!ha->init_done || ha->dpc_active) {
++		set_current_state(TASK_INTERRUPTIBLE);
++		schedule_timeout(HZ);
++	}
++
++	/* Disable IP support */
++	ha->flags.enable_ip = FALSE;
++
++	mcp->mb[0] = MBC_DISABLE_IP;
++	mcp->out_mb = MBX_0;
++	mcp->in_mb = MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = qla2x00_mailbox_command(ha, mcp);
++	if (rval == QL_STATUS_SUCCESS) {
++		/* IP disabled successful */
++		DEBUG12(printk(KERN_INFO
++				"%s: successful\n", __func__);)
++	}
++	else {
++		DEBUG12(printk(KERN_WARNING
++				"%s: MBC_DISABLE_IP failed\n", __func__);)
++	}
++
++	/* Reset IP parameters */
++	ha->rec_entries_in = 0;
++	ha->rec_entries_out = 0;
++	ha->notify_routine = NULL;
++}
++
++/**
++ * qla2x00_add_buffers() - Adds buffers to the receive buffer queue.
++ * @ha: SCSI driver HA context
++ * @rec_count: The number of receive buffers to add to the queue
++ * @ha_locked: Flag indicating if the function is called with the hardware lock
++ *
++ * This routine is called by the IP driver to pass new buffers to the receive
++ * buffer queue.
++ */
++static void
++qla2x00_add_buffers(scsi_qla_host_t *ha, uint16_t rec_count, int ha_locked)
++{
++	int		i;
++	uint16_t	rec_in;
++	uint16_t	handle;
++	unsigned long	flags = 0;
++	device_reg_t	*reg;
++	struct risc_rec_entry *risc_rec_q;
++	struct buffer_cb *bcbs;
++
++	flags = 0;
++	risc_rec_q = ha->risc_rec_q;
++	rec_in = ha->rec_entries_in;
++	bcbs = ha->receive_buffers;
++
++	/* Set RISC owns buffer flag on new entries */
++	for (i = 0; i < rec_count; i++) {
++		handle = risc_rec_q[rec_in].handle;
++		set_bit(BCB_RISC_OWNS_BUFFER, &(bcbs[handle].state));
++		if (rec_in < IP_BUFFER_QUEUE_DEPTH - 1)
++			rec_in++;
++		else
++			rec_in = 0;
++	}
++	
++	/* Update RISC buffer pointer */
++	if (!ha_locked)
++		spin_lock_irqsave(&ha->hardware_lock, flags);
++
++	reg = ha->iobase;
++	WRT_REG_WORD(&reg->mailbox8, rec_in);
++	ha->rec_entries_in = rec_in;
++
++	if (!ha_locked)
++		spin_unlock_irqrestore(&ha->hardware_lock, flags);
++}
++
++/**
++ * qla2x00_send_packet() - Transmit a send_cb.
++ * @ha: SCSI driver HA context
++ * @scb: The send_cb structure to send
++ *
++ * This routine is called by the IP driver to pass @scb (IP packet) to the ISP
++ * for transmission.
++ *
++ * Returns QL_STATUS_SUCCESS if @scb was sent, QL_STATUS_RESOURCE_ERROR if the
++ * RISC was too busy to send, or QL_STATUS_ERROR.
++ */
++static int
++qla2x00_send_packet(scsi_qla_host_t *ha, struct send_cb *scb)
++{
++	int		i;
++	uint16_t	cnt;
++	uint16_t	temp;
++	uint32_t	handle;
++	unsigned long	flags;
++	struct ip_cmd_entry *ipcmd_entry;
++	struct sk_buff	*skb;
++	device_reg_t	*reg;
++
++	DEBUG12(printk("%s: enter\n", __func__);)
++
++	skb = scb->skb;
++	reg = ha->iobase;
++
++	/* Check adapter state */
++	if (!ha->flags.online) {
++		return (QL_STATUS_ERROR);
++	}
++
++	/* Send marker if required */
++	if (ha->marker_needed != 0) {
++		if(qla2x00_marker(ha, 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS) {
++			printk(KERN_WARNING
++				"%s: Unable to issue marker.\n",
++				__func__);
++			return (QL_STATUS_ERROR);
++		}
++		ha->marker_needed = 0;
++	}
++
++	/* Acquire ring specific lock */
++	spin_lock_irqsave(&ha->hardware_lock, flags);
++
++	if (ha->req_q_cnt < 4) {
++		/* Update number of free request entries */
++		cnt = qla2x00_debounce_register(ISP_REQ_Q_OUT(reg));
++		if (ha->req_ring_index < cnt)
++			ha->req_q_cnt = cnt - ha->req_ring_index;
++		else
++			ha->req_q_cnt = REQUEST_ENTRY_CNT -
++						(ha->req_ring_index - cnt);
++	}
++
++	if (ha->req_q_cnt >= 4) {
++		/* Get tag handle for command */
++		handle = ha->current_scb_q_idx;
++		for (i = 0; i < MAX_SEND_PACKETS; i++) {
++			handle++;
++			if (handle == MAX_SEND_PACKETS)
++				handle = 0;
++			if (ha->active_scb_q[handle] == NULL) {
++				ha->current_scb_q_idx = handle;
++				goto found_handle;
++			}
++		}
++	}
++
++	/* Low on resources, try again later */
++	spin_unlock_irqrestore(&ha->hardware_lock, flags);
++	printk(KERN_WARNING
++		"%s: Low on resources, try again later...\n",
++		__func__);
++
++	return (QL_STATUS_RESOURCE_ERROR);
++
++found_handle:
++
++	/* Build ISP command packet */
++	ipcmd_entry = (struct ip_cmd_entry *)ha->request_ring_ptr;
++
++	/* OPTIMIZATION ??? */
++	/* Throughput increases an additional 10 Mbps with the following code */
++	*((uint32_t *)(&ipcmd_entry->entry_type)) = 
++			 __constant_cpu_to_le32(ET_IP_COMMAND_64 | (1 << 8));
++	//ipcmd_entry->entry_type = ET_IP_COMMAND_64;
++	//ipcmd_entry->entry_count = 1;
++	//ipcmd_entry->sys_define = 0;
++	//ipcmd_entry->entry_status = 0;
++	
++	ipcmd_entry->handle = handle;
++	ipcmd_entry->reserved_1 = 0;
++
++	/* Get destination loop ID for packet */
++	if (!qla2x00_get_ip_loopid(ha, scb->header, &ipcmd_entry->loop_id)) {
++		/* Failed to get loop ID, convert packet to ARP */
++		if (qla2x00_convert_to_arp(ha, scb)) {
++			/* Broadcast ARP */
++			ipcmd_entry->loop_id = BROADCAST;
++		}
++		else {
++			/* Return packet */
++			spin_unlock_irqrestore(&ha->hardware_lock, flags);
++			printk(KERN_WARNING
++				"%s: Unable to determine loop id for "
++				"destination.\n",
++				__func__);
++			return (QL_STATUS_ERROR);
++		}
++	}
++
++	/* Default five second firmware timeout */
++	ipcmd_entry->timeout = __constant_cpu_to_le16(5);
++	ipcmd_entry->control_flags = __constant_cpu_to_le16(CF_WRITE);
++	ipcmd_entry->reserved_2 = 0;
++	ipcmd_entry->service_class = __constant_cpu_to_le16(0);
++
++	ipcmd_entry->data_seg_count = __constant_cpu_to_le16(2);
++	ipcmd_entry->ds.data_segs64[0].address[0] =
++			cpu_to_le32(LSD(scb->header_dma));
++	ipcmd_entry->ds.data_segs64[0].address[1] =
++			cpu_to_le32(MSD(scb->header_dma));
++	ipcmd_entry->ds.data_segs64[0].length =
++			__constant_cpu_to_le32(sizeof(struct packet_header));
++	scb->skb_data_dma = pci_map_single(ha->pdev,
++					skb->data, skb->len,
++					PCI_DMA_TODEVICE);
++	ipcmd_entry->ds.data_segs64[1].address[0] =
++			cpu_to_le32(LSD(scb->skb_data_dma));
++	ipcmd_entry->ds.data_segs64[1].address[1] =
++			cpu_to_le32(MSD(scb->skb_data_dma));
++	ipcmd_entry->ds.data_segs64[1].length = cpu_to_le32(skb->len);
++
++	ipcmd_entry->byte_count =
++			cpu_to_le32(skb->len + sizeof(struct packet_header));
++
++	/* Adjust ring index. */
++	ha->req_ring_index++;
++	if (ha->req_ring_index == REQUEST_ENTRY_CNT) {
++		ha->req_ring_index = 0;
++		ha->request_ring_ptr = ha->request_ring;
++	} else
++		ha->request_ring_ptr++;
++
++	ha->ipreq_cnt++;
++	ha->req_q_cnt--;
++	ha->active_scb_q[handle] = scb;
++
++	/* Set chip new ring index. */
++	temp = CACHE_FLUSH(ISP_REQ_Q_IN(reg));
++	WRT_REG_WORD(ISP_REQ_Q_IN(reg), ha->req_ring_index);
++
++	spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++	return (QL_STATUS_SUCCESS);
++}
++
++/**
++ * qla2x00_tx_timeout() - Handle transmission timeout.
++ * @ha: SCSI driver HA context
++ *
++ * This routine is called by the IP driver to handle packet transmission
++ * timeouts.
++ *
++ * Returns QL_STATUS_SUCCESS if timeout handling completed successfully.
++ */
++static int
++qla2x00_tx_timeout(scsi_qla_host_t *ha)
++{
++	/* TODO: complete interface */
++
++	/* Reset RISC firmware for basic recovery */
++	printk(KERN_WARNING
++		"%s: A transmission timeout occured - aborting ISP\n",
++		__func__);
++	set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++
++	return (QL_STATUS_SUCCESS);
++}
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_ip.h	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,420 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 IP network driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++/****************************************************************************
++              Please see revision.notes for revision history.
++*****************************************************************************/
++
++#if !defined(_QLA_IP_H_)
++#define _QLA_IP_H_
++
++#define MAX_SEND_PACKETS		32	/* Maximum # send packets */
++#define MAX_RECEIVE_BUFFERS		64	/* Maximum # receive buffers */
++#define MIN_RECEIVE_BUFFERS		8	/* Minimum # receive buffers */
++#define IP_BUFFER_QUEUE_DEPTH		(MAX_RECEIVE_BUFFERS+1)
++
++/* Async notification types */
++#define NOTIFY_EVENT_LINK_DOWN		1	/* Link went down */
++#define NOTIFY_EVENT_LINK_UP		2	/* Link is back up */
++#define NOTIFY_EVENT_RESET_DETECTED	3	/* Reset detected */
++
++/* QLogic subroutine status definitions */
++#define QL_STATUS_SUCCESS		0
++#define QL_STATUS_ERROR			1
++#define QL_STATUS_FATAL_ERROR		2
++#define QL_STATUS_RESOURCE_ERROR	3
++#define QL_STATUS_LOOP_ID_IN_USE	4
++#define QL_STATUS_NO_DATA		5
++
++/************************************************************************/
++/* RFC 2625 -- networking structure definitions                         */
++/************************************************************************/
++
++/* Network header definitions */
++struct network_address
++{
++#if defined(__LITTLE_ENDIAN_BITFIELD)
++	__u16	unused:12,
++		naa:4;
++#elif defined (__BIG_ENDIAN_BITFIELD)
++	__u16	naa:4,
++		unused:12;
++#else
++#error  "Please fix <asm/byteorder.h>"
++#endif
++
++#define NAA_IEEE_MAC_TYPE	1		/* NAA code - IEEE MAC addr */
++
++	__u8	addr[6];
++};
++
++struct network_header
++{
++	union
++	{
++		struct network_address	na;
++		__u8	fcaddr[8];
++	} d;
++
++	union
++	{
++		struct network_address	na;
++		__u8	fcaddr[8];
++	} s;
++};
++
++/* SNAP header definitions */
++/* from linux/if_fc.h */
++struct snap_header
++{
++	__u8  dsap;				/* destination SAP */
++	__u8  ssap;				/* source SAP */
++#define LLC_SAP_IEEE_802DOT2	0xAA		/* LLC SAP code - IEEE 802.2 */
++
++	__u8  llc;				/* LLC control field */
++#define LLC_CONTROL		0x03		/* LLC control code */
++
++	__u8  protid[3];			/* protocol id */
++#define SNAP_OUI		0x00		/* SNAP OUI code */
++
++	__u16 ethertype;			/* ether type field */
++};
++
++/* Packet header definitions */
++struct packet_header
++{
++	struct network_header	networkh;
++	struct snap_header	snaph;
++};
++
++/* ARP header definitions */
++/* from linux/if_arp.h */
++struct arp_header
++{
++	struct arphdr	arph;
++	__u8		ar_sha[ETH_ALEN];	/* sender hardware address */
++	__u32		ar_sip;			/* sender IP address */
++        __u8		ar_tha[ETH_ALEN];	/* target hardware address */
++	__u32		ar_tip;			/* target IP address */
++};
++
++/* IP header definitions */
++struct ip_header
++{
++	struct iphdr	iph;
++	__u32		options;		/* IP packet options */
++};
++
++
++/************************************************************************/
++/* Support structures.                                                  */
++/************************************************************************/
++
++/* Definitions for IP support */
++#define LOOP_ID_MASK		0x00FF
++#define PLE_NOT_SCSI_DEVICE	0x8000		/* Upper bit of loop ID set */
++						/*  if not SCSI */
++
++/* Receive buffer control block definitions */
++struct buffer_cb
++{
++	uint16_t	handle;			/* ISP buffer handle */
++	uint16_t	comp_status;		/* completion status from FW */
++
++	uint32_t	state;			/* Buffer CB state */
++#define BCB_RISC_OWNS_BUFFER	1
++
++	struct sk_buff	*skb;			/* Socket buffer */
++	uint8_t		*skb_data;		/* Socket buffer data */
++	dma_addr_t	skb_data_dma;		/* SKB data physical address */
++	uint32_t	rec_data_size;		/* Size of received data */
++	uint32_t	packet_size;		/* Size of packet received */
++
++	uint16_t	linked_bcb_cnt;		/* # of linked CBs for packet */
++	uint16_t	unused2;
++	struct buffer_cb *next_bcb;		/* Next buffer CB */
++};
++
++/* Send control block definitions */
++struct send_cb
++{
++	uint16_t	comp_status;		/* completion status from FW */
++#define SCB_CS_COMPLETE		0x0		
++#define SCB_CS_INCOMPLETE	0x1
++#define SCB_CS_RESET		0x4
++#define SCB_CS_ABORTED		0x5
++#define SCB_CS_TIMEOUT		0x6
++#define SCB_CS_PORT_UNAVAILABLE	0x28
++#define SCB_CS_PORT_LOGGED_OUT	0x29
++#define SCB_CS_PORT_CONFIG_CHG	0x2A
++#define SCB_CS_FW_RESOURCE_UNAVAILABLE	0x2C
++
++	uint16_t	unused1;
++
++	void		*qdev;			/* netdev private structure */
++
++	struct packet_header *header;		/* Network and SNAP headers */
++	dma_addr_t	header_dma;		/* Header physical address */
++
++	struct sk_buff	*skb;			/* socket buffer to send */
++	dma_addr_t	skb_data_dma;		/* skb data physical address */
++};
++
++/* IP device data structure */
++#define QLLAN_MAX_IP_DEVICES	64	/* Maximum number of IP devices */
++
++struct ip_device
++{
++	uint16_t	index;
++	uint16_t	unused1;
++
++	uint32_t	flags;
++#define IP_DEV_FLAG_PRESENT		0x00000001 
++#define IP_DEV_FLAG_PUBLIC_DEVICE	0x00000002
++
++	uint16_t	loop_id;
++#define PUBLIC_LOOP_DEVICE		((uint16_t)-1)
++
++	uint16_t	unused2;
++	uint8_t		port_id[3];
++	uint8_t		unused3;
++	uint8_t		port_name[8]; 
++
++	struct ip_device *next;
++	struct ip_device *last;
++};
++
++/************************************************************************/
++/* Definitions for Backdoor Inquiry.                                   */
++/************************************************************************/
++
++struct bd_inquiry
++{
++	uint16_t	length;			/* Length of structure */
++#define BDI_LENGTH		sizeof(struct bd_inquiry)
++
++	uint16_t	version;		/* Structure version number */
++/* NOTE: Update this value anytime the structure changes */
++#define BDI_VERSION		2
++
++						/* Exports */
++	uint32_t	options;		/*  supported options */
++#define BDI_IP_SUPPORT		1		/*   IP supported */
++#define BDI_64BIT_ADDRESSING	2		/*   64bit address supported */
++
++	void		*ha;			/*  Driver ha pointer */
++	void		*risc_rec_q;		/*  RISC receive queue */
++	uint16_t	risc_rec_q_size;	/*   size */
++
++	uint16_t	link_speed;		/* Current link speed */
++#define BDI_1GBIT_PORTSPEED	1		/*   operating at 1GBIT */
++#define BDI_2GBIT_PORTSPEED	2		/*   operating at 2GBIT */
++#define BDI_10GBIT_PORTSPEED	4		/*   operating at 10GBIT */
++
++	uint8_t		port_name[8];		/*  Adapter port name */
++
++	struct pci_dev	*pdev;			/* PCI device information */
++
++	/* Pointers to SCSI-backdoor callbacks */
++	void            *ip_enable_routine;
++	void            *ip_disable_routine;
++	void            *ip_add_buffers_routine;
++	void            *ip_send_packet_routine;
++	void            *ip_tx_timeout_routine;
++
++	uint32_t        unused2[9];
++};
++
++/************************************************************************/
++/* Definitions for Backdoor Enable.                                    */
++/************************************************************************/
++
++struct bd_enable
++{
++	uint16_t	length;			/* Length of structure */
++#define BDE_LENGTH		sizeof(struct bd_enable)
++
++	uint16_t	version;		/* Structure version number */
++/* NOTE: Update this value anytime the structure changes */
++#define BDE_VERSION		2
++
++						/* Imports */
++	uint32_t	options;		/*  supported options */
++#define BDE_NOTIFY_ROUTINE	1		/*  notify routine imported */
++
++	uint32_t	mtu;			/*  maximum transfer size */
++	uint16_t	header_size;		/*  split header size */
++	uint16_t	unused1;
++
++	void		*receive_buffers;	/*  receive buffers array */
++	uint16_t	max_receive_buffers;	/*  max # receive buffers */
++	uint16_t	unused2;
++	uint32_t	receive_buff_data_size;	/*  buffer size */
++
++	/* Pointers to IP-backdoor callbacks */
++	void		*notify_routine;
++	void		*notify_context;
++	void		*send_completion_routine;
++	void		*receive_packets_routine;
++	void		*receive_packets_context;
++
++	uint32_t        unused3[9];
++};
++
++
++/************************************************************************/
++/* RISC interface structures                                            */
++/************************************************************************/
++
++/* IP mailbox commands */
++#define MBC_INITIALIZE_IP               0x0077
++#define MBC_DISABLE_IP                  0x0079
++
++/* IP async events */
++#define MBA_IP_TRANSMIT_COMPLETE        0x8022
++#define MBA_IP_RECEIVE_COMPLETE         0x8023
++#define MBA_IP_BROADCAST_RECEIVED       0x8024
++#define MBA_IP_RECEIVE_BUFFERS_LOW      0x8025
++#define MBA_IP_OUT_OF_BUFFERS           0x8026
++#define MBA_IP_RECEIVE_COMPLETE_SPLIT   0x8027
++
++/* IP fast post completions for 2300 */
++#define RHS_IP_SEND_COMPLETE            0x18
++#define RHS_IP_RECV_COMPLETE            0x19
++#define RHS_IP_RECV_DA_COMPLETE         0x1B
++
++/* RISC IP receive buffer queue entry structure */
++struct risc_rec_entry
++{
++	uint32_t        data_addr_low;
++	uint32_t        data_addr_high;
++	uint16_t        handle;
++	uint16_t        unused;
++};
++
++/* Firmware IP initialization control block definitions */
++struct ip_init_cb
++{
++	uint8_t		version;
++#define IPICB_VERSION				0x01
++
++	uint8_t		reserved_1;
++
++	uint16_t	firmware_options;
++#define IPICB_OPTION_64BIT_ADDRESSING		0x0001
++#define IPICB_OPTION_NO_BROADCAST_FASTPOST	0x0002
++#define IPICB_OPTION_OUT_OF_BUFFERS_EVENT	0x0004
++
++	uint16_t	header_size;
++	uint16_t	mtu;
++	uint16_t	receive_buffer_size;
++	uint16_t	reserved_2;
++	uint16_t	reserved_3;
++	uint16_t	reserved_4;
++	uint16_t	reserved_5;
++
++	uint16_t	receive_queue_size;
++	uint16_t	low_water_mark;
++#define IPICB_LOW_WATER_MARK			0
++
++	uint16_t	receive_queue_addr[4];
++	uint16_t	receive_queue_in;
++	uint16_t	fast_post_count;
++#define IPICB_FAST_POST_COUNT			4
++
++	uint16_t	container_count;
++#define IPICB_BUFFER_CONTAINER_COUNT		64
++
++	uint16_t	resource_allocation;
++#define IPICB_IOCB_RESERVE_COUNT		250
++};
++
++
++/* IP IOCB types */
++
++/* Data segment descriptor structures */
++struct data_seg
++{
++	uint32_t	address;
++	uint32_t	length;
++};
++
++struct data_seg_a64
++{
++	uint32_t	address[2];
++	uint32_t	length;
++};
++
++/* IP Command IOCB structure */
++struct ip_cmd_entry
++{
++	uint8_t		entry_type;
++#define ET_IP_COMMAND_32		0x13
++#define ET_IP_COMMAND_64		0x1B
++
++	uint8_t		entry_count;
++	uint8_t		sys_define;
++	uint8_t		entry_status;
++
++	uint32_t	handle;
++	uint8_t		reserved_1;
++	uint8_t		loop_id;
++	uint16_t	comp_status;
++	uint16_t	control_flags;
++	uint16_t	reserved_2;
++	uint16_t	timeout;
++	uint16_t	data_seg_count;
++	uint16_t	service_class;
++	uint16_t	reserved_3[7];
++	uint32_t	byte_count;
++	union
++	{
++		struct data_seg		data_segs[3];
++		struct data_seg_a64	data_segs64[2];
++	} ds;
++};
++
++/* IP Receive IOCB structure */
++#define ET_IP_RECEIVE_CONTINUATION  0x2B
++
++struct ip_rec_entry
++{
++	uint8_t		entry_type;
++#define ET_IP_RECEIVE			0x23
++
++	uint8_t		entry_count;
++	uint8_t		segment_count;
++	uint8_t		entry_status;
++
++	uint16_t	s_idlow;
++	uint8_t		s_idhigh;
++	uint8_t		reserved_1;
++	uint8_t		reserved_2;
++	uint8_t		loop_id;
++	uint16_t	comp_status;
++#define IPREC_STATUS_SPLIT_BUFFER	0x0001
++
++	uint16_t	service_class;
++	uint16_t	sequence_length;
++
++#define IPREC_MAX_HANDLES		24
++	uint16_t	buffer_handles[IPREC_MAX_HANDLES];
++};
++
++#endif /* _QLA_IP_H_ */
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_isr.c	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,1474 @@
++/*
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ */
++
++#include "qla_os.h"
++
++#include "qla_def.h"
++
++static void qla2x00_mbx_completion(scsi_qla_host_t *, uint16_t);
++static void qla2x00_async_event(scsi_qla_host_t *, uint32_t);
++static void qla2x00_process_completed_request(struct scsi_qla_host *, int);
++static void qla2x00_response_pkt(scsi_qla_host_t *, uint16_t);
++static void qla2x00_status_entry(scsi_qla_host_t *, sts_entry_t *);
++static void qla2x00_status_cont_entry(scsi_qla_host_t *, sts_cont_entry_t *);
++static void qla2x00_error_entry(scsi_qla_host_t *, response_t *);
++static void qla2x00_ms_entry(scsi_qla_host_t *, ms_iocb_entry_t *);
++
++static int qla2x00_check_sense(Scsi_Cmnd *cp, os_lun_t *);
++
++/**
++ * qla2x00_intr_handler() - Process interrupts for the ISP.
++ * @irq:
++ * @dev_id: SCSI driver HA context
++ * @regs:
++ *
++ * Called by system whenever the host adapter generates an interrupt.
++ *
++ * Returns handled flag.
++ */
++irqreturn_t
++qla2x00_intr_handler(int irq, void *dev_id, struct pt_regs *regs)
++{
++	scsi_qla_host_t	*ha;
++	device_reg_t	*reg;
++	uint32_t	mbx;
++	uint16_t	stat;
++	int		status = 0;
++	unsigned long	flags = 0;
++	unsigned long	mbx_flags = 0;
++	unsigned long	intr_iter;
++
++	/* Don't loop forever, interrupt are OFF */
++	intr_iter = 50; 
++
++	ha = (scsi_qla_host_t *) dev_id;
++	if (!ha) {
++		printk(KERN_INFO
++		    "%s(): NULL host pointer\n", __func__);
++		return (IRQ_NONE);
++	}
++
++	reg = ha->iobase;
++
++	spin_lock_irqsave(&ha->hardware_lock, flags);
++
++	for (;;) {
++		/* Relax CPU! */
++		if (!(intr_iter--))
++			break;
++
++#if defined(ISP2100) || defined(ISP2200)
++		if ((RD_REG_WORD(&reg->istatus) & ISR_RISC_INT) == 0) {
++			break;
++		}
++
++		if (RD_REG_WORD(&reg->semaphore) & BIT_0) {
++			WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
++
++			/* Get mailbox data. */
++			mbx = RD_REG_WORD(&reg->mailbox0);
++			if (mbx > 0x3fff && mbx < 0x8000) {
++				qla2x00_mbx_completion(ha, (uint16_t)mbx);
++				status |= MBX_INTERRUPT;
++			} else if (mbx > 0x7fff && mbx < 0xc000) {
++				qla2x00_async_event(ha, mbx);
++			} else {
++				/*EMPTY*/
++				DEBUG2(printk("scsi(%ld): Unrecognized "
++				    "interrupt type (%d)\n",
++				    ha->host_no, mbx));
++			}
++			/* Release mailbox registers. */
++			WRT_REG_WORD(&reg->semaphore, 0);
++		} else {
++			stat = RD_REG_WORD(&reg->mailbox5);
++			qla2x00_response_pkt(ha, stat);
++
++			WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
++		}
++
++#else /* ISP2300 */
++		if ((ha->pdev->device == QLA2312_DEVICE_ID ||
++		    ha->pdev->device == QLA2322_DEVICE_ID) &&
++		    (RD_REG_WORD(&reg->istatus) & ISR_RISC_INT) == 0) {
++			break;
++		}
++
++		stat = RD_REG_WORD(&reg->host_status_lo);
++		if ((stat & HSR_INT) == 0) {
++			break;
++		}
++		if (stat & HSR_RISC_PAUSED) {
++			uint16_t hccr;
++
++			hccr = RD_REG_WORD(&reg->hccr);
++			printk(KERN_INFO
++			    "scsi(%ld): RISC paused, dumping HCCR (%x)\n",
++			    ha->host_no,
++			    hccr);
++
++			/*
++			 * Issue a "HARD" reset in order for the RISC interrupt
++			 * bit to be cleared.  Schedule a big hammmer to get
++			 * out of the RISC PAUSED state.
++			 */
++			WRT_REG_WORD(&reg->hccr, HCCR_RESET_RISC);
++			set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++			break;
++		}
++		mbx = RD_REG_WORD(&reg->host_status_hi);
++		switch (stat & 0xff) {
++		case 0x1:
++		case 0x2:
++		case 0x10:
++		case 0x11:
++			qla2x00_mbx_completion(ha, (uint16_t)mbx);
++			status |= MBX_INTERRUPT;
++
++			/* Release mailbox registers. */
++			WRT_REG_WORD(&reg->semaphore, 0);
++			break;
++		case 0x12:
++			qla2x00_async_event(ha, mbx);
++			break;
++		case 0x13:
++			qla2x00_response_pkt(ha, (uint16_t)mbx);
++			break;
++		case 0x16:
++			mbx = mbx << 16 | MBA_SCSI_COMPLETION;
++			qla2x00_async_event(ha, mbx);
++			break;
++#if defined(FC_IP_SUPPORT)
++		case 0x18:
++			WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
++			qla2x00_ip_send_complete(ha, mbx, CS_COMPLETE);
++			continue;
++			break;
++		case 0x19:
++			qla2x00_ip_receive_fastpost(ha,
++			    MBA_IP_RECEIVE_COMPLETE);
++			break;
++		case 0x1b:
++			qla2x00_ip_receive_fastpost(ha,
++			    MBA_IP_RECEIVE_COMPLETE_SPLIT);
++			break;
++#endif
++		default:
++			DEBUG2(printk("scsi(%ld): Unrecognized interrupt type "
++			    "(%d)\n",
++			    ha->host_no, stat & 0xff));
++			break;
++		}
++
++		WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
++#endif
++	}
++
++	spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++	ha->total_isr_cnt++;
++
++	if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
++	    (status & MBX_INTERRUPT) && ha->flags.mbox_int) {
++
++		/* There was a mailbox completion */
++		DEBUG3(printk("%s(%ld): Going to get mbx reg lock.\n",
++		    __func__, ha->host_no));
++
++		QLA_MBX_REG_LOCK(ha);
++
++		MBOX_TRACE(ha, BIT_5);
++		if (ha->mcp == NULL) {
++			DEBUG3(printk("%s(%ld): Error mbx pointer.\n",
++			    __func__, ha->host_no));
++		} else {
++			DEBUG3(printk("%s(%ld): Going to set mbx intr flags. "
++			    "cmd=%x.\n",
++			    __func__, ha->host_no, ha->mcp->mb[0]));
++		}
++		set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
++
++		DEBUG3(printk("%s(%ld): Going to wake up mbx function for "
++		    "completion.\n",
++		    __func__, ha->host_no));
++
++		MBOX_TRACE(ha,BIT_6);
++		up(&ha->mbx_intr_sem);
++
++		DEBUG3(printk("%s(%ld): Going to release mbx reg lock.\n",
++		    __func__, ha->host_no));
++		QLA_MBX_REG_UNLOCK(ha);
++	}
++
++	if (!list_empty(&ha->done_queue))
++		schedule_work(&ha->run_qla_task);
++
++	/* Wakeup the DPC routine */
++	if ((!ha->flags.mbox_busy &&
++	    (test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) ||
++		test_bit(RESET_MARKER_NEEDED, &ha->dpc_flags) ||
++		test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags))) &&
++		    ha->dpc_wait && !ha->dpc_active) {
++
++		up(ha->dpc_wait);
++	}
++
++	return (IRQ_HANDLED);
++}
++
++/**
++ * qla2x00_mbx_completion() - Process mailbox command completions.
++ * @ha: SCSI driver HA context
++ * @mb0: Mailbox0 register
++ */
++static void
++qla2x00_mbx_completion(scsi_qla_host_t *ha, uint16_t mb0)
++{
++	uint16_t                cnt;
++	uint16_t                *wptr;
++	device_reg_t            *reg = ha->iobase;
++
++	ENTER(__func__);
++
++	/* Load return mailbox registers. */
++	ha->flags.mbox_int = TRUE;
++	ha->mailbox_out[0] = mb0;
++	wptr = (uint16_t *)&reg->mailbox1;
++
++	for (cnt = 1; cnt < MAILBOX_REGISTER_COUNT; cnt++) {
++#if defined(ISP2200)
++		if (cnt == 8) 
++			wptr = (uint16_t *)&reg->mailbox8;
++#endif
++		if (cnt == 4 || cnt == 5)
++			ha->mailbox_out[cnt] = qla2x00_debounce_register(wptr);
++		else
++			ha->mailbox_out[cnt] = RD_REG_WORD(wptr);
++	
++		wptr++;
++	}
++
++	if (ha->mcp) {
++		DEBUG3(printk("%s(%ld): Got mailbox completion. cmd=%x.\n",
++		    __func__, ha->host_no, ha->mcp->mb[0]));
++	} else {
++		DEBUG2_3(printk("%s(%ld): MBX pointer ERROR!\n",
++		    __func__, ha->host_no));
++	}
++
++	LEAVE(__func__);
++}
++
++/**
++ * qla2x00_async_event() - Process aynchronous events.
++ * @ha: SCSI driver HA context
++ * @mb0: Mailbox0 register
++ */
++static void
++qla2x00_async_event(scsi_qla_host_t *ha, uint32_t mbx)
++{
++	uint32_t	index;
++	uint16_t	mb[4];
++	device_reg_t	*reg = ha->iobase;
++	uint8_t		rscn_queue_index;
++
++	ENTER(__func__);
++
++	/* Setup to process completions */
++	mb[0] = LSW(mbx);
++	switch(mb[0]) {
++	case MBA_SCSI_COMPLETION:	/* Fast Post */
++#if defined(ISP2100) || defined(ISP2200)
++		mb[1] = RD_REG_WORD(&reg->mailbox1);
++#else
++		mb[1] = MSW(mbx);
++#endif
++		mb[2] = RD_REG_WORD(&reg->mailbox2);
++
++		DEBUG5(printk("%s(): mailbox response completion.\n",
++		    __func__));
++
++		if (!ha->flags.online)
++			break;
++
++		/* Get outstanding command index  */
++		index = (uint32_t)(mb[2] << 16 | mb[1]);
++		qla2x00_process_completed_request(ha, index);
++		break;
++
++#if defined(FC_IP_SUPPORT)
++	case MBA_IP_TRANSMIT_COMPLETE:	/* IP Completion */
++		mb[1] = RD_REG_WORD(&reg->mailbox1);
++
++		qla2x00_ip_send_complete(ha, mb[1], CS_COMPLETE);
++		break;
++
++	case MBA_IP__RECEIVE_COMPLETE:
++	case MBA_IP_RECEIVE_COMPLETE_SPLIT:
++		qla2x00_ip_receive_fastpost(ha, mb[0]);
++		break;
++#endif /* FC_IP_SUPPORT */
++
++	case MBA_RESET:			/* Reset */
++		DEBUG2(printk("scsi(%ld): Asynchronous RESET.\n", ha->host_no));
++
++		set_bit(RESET_MARKER_NEEDED, &ha->dpc_flags);
++		break;
++
++	case MBA_SYSTEM_ERR:		/* System Error */
++		mb[1] = RD_REG_WORD(&reg->mailbox1);
++		mb[2] = RD_REG_WORD(&reg->mailbox2);
++		mb[3] = RD_REG_WORD(&reg->mailbox3);
++
++		printk(KERN_INFO
++		    "scsi(%ld): ISP System Error - mbx1=%xh mbx2=%xh "
++		    "mbx3=%xh.\n",
++		    ha->host_no, mb[1], mb[2], mb[3]);
++
++    		qla2x00_dump_isp(ha, 1);
++
++		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++		break;
++
++	case MBA_REQ_TRANSFER_ERR:	/* Request Transfer Error */
++		DEBUG2(printk("scsi(%ld): ISP Request Transfer Error.\n",
++		    ha->host_no));
++		printk(KERN_WARNING
++		    "scsi(%ld): ISP Request Transfer Error.\n", ha->host_no);
++
++		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++		break;
++
++	case MBA_RSP_TRANSFER_ERR:	/* Response Transfer Error */
++		DEBUG2(printk("scsi(%ld): ISP Response Transfer Error.\n",
++		    ha->host_no));
++		printk(KERN_WARNING
++		    "scsi(%ld): ISP Response Transfer Error.\n", ha->host_no);
++
++		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++		break;
++
++	case MBA_WAKEUP_THRES:		/* Request Queue Wake-up */
++		DEBUG2(printk("scsi(%ld): Asynchronous WAKEUP_THRES.\n",
++		    ha->host_no));
++		break;
++
++	case MBA_LIP_OCCURRED:		/* Loop Initialization Procedure */
++		mb[1] = RD_REG_WORD(&reg->mailbox1);
++
++		DEBUG2(printk("scsi(%ld): Asynchronous LIP Occured.\n",
++		    ha->host_no));
++		printk(KERN_INFO
++		    "scsi(%ld): Asynchronous LIP Occured.\n", ha->host_no);
++
++		/* Save LIP sequence. */
++		ha->lip_seq = mb[1];
++		if (ha->loop_state != LOOP_DOWN) {
++			ha->loop_state = LOOP_DOWN;
++			atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME);
++			qla2x00_mark_all_devices_lost(ha);
++		}
++
++		set_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags);
++		set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags);
++
++		ha->flags.management_server_logged_in = 0;
++
++		/* Update AEN queue. */
++		if (ha->ioctl->flags & IOCTL_AEN_TRACKING_ENABLE) {
++			qla2x00_enqueue_aen(ha, MBA_LIP_OCCURRED, NULL);
++		}
++
++		ha->total_lip_cnt++;
++		break;
++
++	case MBA_LOOP_UP:		/* Loop Up Event */
++		mb[1] = RD_REG_WORD(&reg->mailbox1);
++
++		DEBUG2(printk("scsi(%ld): Asynchronous LOOP UP.\n",
++		    ha->host_no));
++		printk(KERN_INFO
++		    "scsi(%ld): LOOP UP detected.\n", ha->host_no);
++
++		ha->flags.management_server_logged_in = 0;
++
++		/* Update AEN queue. */
++		if (ha->ioctl->flags & IOCTL_AEN_TRACKING_ENABLE) {
++			qla2x00_enqueue_aen(ha, MBA_LOOP_UP, NULL);
++		}
++
++		/* Save the current speed for use by ioctl and IP driver */
++		ha->current_speed = EXT_DEF_PORTSPEED_1GBIT;
++#if defined(ISP2300)
++		if (mb[1] == 1)
++			ha->current_speed = EXT_DEF_PORTSPEED_2GBIT;
++#endif
++		break;
++
++	case MBA_LOOP_DOWN:		/* Loop Down Event */
++		DEBUG2(printk("scsi(%ld): Asynchronous LOOP DOWN.\n",
++		    ha->host_no));
++		printk(KERN_INFO
++		    "scsi(%ld): LOOP DOWN detected.\n", ha->host_no);
++
++		if (ha->loop_state != LOOP_DOWN) {
++			ha->loop_state = LOOP_DOWN;
++			atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME);
++			qla2x00_mark_all_devices_lost(ha);
++		}
++
++		ha->flags.management_server_logged_in = 0;
++		ha->current_speed = 0; /* reset value */
++
++		/* Update AEN queue. */
++		if (ha->ioctl->flags & IOCTL_AEN_TRACKING_ENABLE) {
++			qla2x00_enqueue_aen(ha, MBA_LOOP_DOWN, NULL);
++		}
++		break;
++
++	case MBA_LIP_RESET:		/* LIP reset occurred */
++		DEBUG2(printk("scsi(%ld): Asynchronous LIP RESET.\n",
++		    ha->host_no));
++		printk(KERN_INFO
++		    "scsi(%ld): LIP reset occured.\n", ha->host_no);
++
++		if (ha->loop_state != LOOP_DOWN) {
++			ha->loop_state = LOOP_DOWN;
++			atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME);
++			qla2x00_mark_all_devices_lost(ha);
++		}
++
++		set_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags);
++		set_bit(RESET_MARKER_NEEDED, &ha->dpc_flags);
++
++		ha->operating_mode = LOOP;
++		ha->flags.management_server_logged_in = 0;
++
++		/* Update AEN queue. */
++		if (ha->ioctl->flags & IOCTL_AEN_TRACKING_ENABLE) {
++			qla2x00_enqueue_aen(ha, MBA_LIP_RESET, NULL);
++		}
++
++		ha->total_lip_cnt++;
++		break;
++
++#if !defined(ISP2100)
++	case MBA_LINK_MODE_UP:		/* Link mode up. */
++		DEBUG2(printk("scsi(%ld): Asynchronous LINK MODE UP.\n",
++		    ha->host_no));
++		printk(KERN_INFO
++		    "scsi(%ld): Link mode is up.\n",
++		    ha->host_no);
++
++		/*
++		 * Until there's a transition from loop down to loop up, treat
++		 * this as loop down only.
++		 */
++		if (ha->loop_state != LOOP_DOWN) {
++			ha->loop_state = LOOP_DOWN;
++			if (!atomic_read(&ha->loop_down_timer))
++				atomic_set(&ha->loop_down_timer,
++				    LOOP_DOWN_TIME);
++			qla2x00_mark_all_devices_lost(ha);
++		}
++
++		if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) {
++			set_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags);
++			set_bit(RESET_MARKER_NEEDED, &ha->dpc_flags);
++		}
++		set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags);
++		break;
++
++	case MBA_UPDATE_CONFIG:		/* Update Configuration. */
++		mb[1] = RD_REG_WORD(&reg->mailbox1);
++
++		DEBUG2(printk("scsi(%ld): Asynchronous UPDATE CONFIG.\n",
++		    ha->host_no));
++		printk(KERN_INFO
++		    "scsi(%ld): Configuration change detected: value=%x.\n",
++		    ha->host_no, mb[1]);
++
++		if (ha->loop_state != LOOP_DOWN) {
++			ha->loop_state = LOOP_DOWN;  
++			if (!atomic_read(&ha->loop_down_timer))
++				atomic_set(&ha->loop_down_timer,
++				    LOOP_DOWN_TIME);
++			qla2x00_mark_all_devices_lost(ha);
++		}
++
++		set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags);
++		set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags);
++		break;
++#endif	/* #if !defined(ISP2100) */
++
++	case MBA_PORT_UPDATE:		/* Port database update */
++		/*
++		 * If PORT UPDATE is global (recieved LIP_OCCURED/LIP_RESET
++		 * event etc. earlier indicating loop is down) then process
++		 * it.  Otherwise ignore it and Wait for RSCN to come in.
++		 */
++		if (ha->loop_state != LOOP_DOWN) {
++			DEBUG2(printk("scsi(%ld): Asynchronous PORT UPDATE "
++			    "ignored.\n", ha->host_no));
++			printk(KERN_INFO
++			    "scsi(%ld): Asynchronous PORT UPDATE ignored.\n",
++			    ha->host_no);
++			break;
++		}
++
++		DEBUG2(printk("scsi(%ld): Asynchronous PORT UPDATE.\n",
++		    ha->host_no));
++		printk(KERN_INFO
++		    "scsi(%ld): Port database changed.\n", ha->host_no);
++
++		/*
++		 * Mark all devices as missing so we will login again.
++		 */
++		ha->loop_state = LOOP_UP;
++
++		atomic_set(&ha->loop_down_timer, 0);
++		qla2x00_mark_all_devices_lost(ha);
++
++		ha->flags.rscn_queue_overflow = 1;
++
++		set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags);
++		set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags);
++
++		/* Update AEN queue. */
++		if (ha->ioctl->flags & IOCTL_AEN_TRACKING_ENABLE) {
++			qla2x00_enqueue_aen(ha, MBA_PORT_UPDATE, NULL);
++		}
++		break;
++
++	case MBA_SCR_UPDATE:		/* State Change Registration */
++		mb[1] = RD_REG_WORD(&reg->mailbox1);
++		mb[2] = RD_REG_WORD(&reg->mailbox2);
++
++		DEBUG2(printk("scsi(%ld): Asynchronous RSCR UPDATE.\n",
++		    ha->host_no));
++		DEBUG(printk(KERN_INFO
++		    "scsi(%ld): RSCN database changed - 0x%x, 0x%x.\n",
++		    ha->host_no, mb[1], mb[2]));
++
++		rscn_queue_index = ha->rscn_in_ptr + 1;
++		if (rscn_queue_index == MAX_RSCN_COUNT)
++			rscn_queue_index = 0;
++		if (rscn_queue_index != ha->rscn_out_ptr) {
++			ha->rscn_queue[ha->rscn_in_ptr].format =
++			    MSB(mb[1]);
++			ha->rscn_queue[ha->rscn_in_ptr].d_id.b.domain =
++			    LSB(mb[1]);
++			ha->rscn_queue[ha->rscn_in_ptr].d_id.b.area =
++			    MSB(mb[2]);
++			ha->rscn_queue[ha->rscn_in_ptr].d_id.b.al_pa =
++			    LSB(mb[2]);
++			ha->rscn_in_ptr = rscn_queue_index;
++		} else {
++			ha->flags.rscn_queue_overflow = 1;
++		}
++
++		ha->loop_state = LOOP_UPDATE;
++		atomic_set(&ha->loop_down_timer, 0);
++		ha->flags.management_server_logged_in = 0;
++
++		set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags);
++		set_bit(RSCN_UPDATE, &ha->dpc_flags);
++
++		/* Update AEN queue. */
++		if (ha->ioctl->flags & IOCTL_AEN_TRACKING_ENABLE) {
++			qla2x00_enqueue_aen(ha, MBA_RSCN_UPDATE, &mb[0]);
++		}
++		break;
++	}
++}
++
++/**
++ * qla2x00_process_completed_request() - Process a Fast Post response.
++ * @ha: SCSI driver HA context
++ * @index: SRB index
++ */
++static void
++qla2x00_process_completed_request(struct scsi_qla_host *ha, int index)
++{
++	srb_t *sp;
++	struct scsi_qla_host *vis_ha;
++
++	ENTER(__func__);
++
++	/* Validate handle. */
++	if (index >= MAX_OUTSTANDING_COMMANDS) {
++		DEBUG2(printk("scsi(%ld): Invalid SCSI completion handle %d.\n",
++		    ha->host_no, index));
++		printk(KERN_WARNING
++		    "scsi(%ld): Invalid SCSI completion handle %d.\n",
++		    ha->host_no, index);
++
++		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++		return;
++	}
++
++	sp = ha->outstanding_cmds[index];
++	if (sp) {
++		/* Free outstanding command slot. */
++		ha->outstanding_cmds[index] = 0;
++#if defined(IOCB_THROLLE_USAGE)
++		ha->iocb_cnt -= sp->iocb_cnt;
++#endif
++		vis_ha = (scsi_qla_host_t *)sp->cmd->device->host->hostdata;
++		if (ha->actthreads)
++			ha->actthreads--;
++		sp->lun_queue->out_cnt--;
++		sp->flags |= SRB_ISP_COMPLETED;
++		CMD_COMPL_STATUS(sp->cmd) = 0L;
++		CMD_SCSI_STATUS(sp->cmd) = 0L;
++
++		/* Save ISP completion status */
++		CMD_RESULT(sp->cmd) = DID_OK << 16;
++		sp->fo_retry_cnt = 0;
++		add_to_done_queue(ha, sp);
++	} else {
++		DEBUG2(printk("scsi(%ld): Invalid ISP SCSI completion handle\n",
++		    ha->host_no));
++		printk(KERN_WARNING
++		    "scsi(%ld): Invalid ISP SCSI completion handle\n",
++		    ha->host_no);
++
++		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++	}
++
++	LEAVE(__func__);
++}
++
++/**
++ * qla2x00_response_pkt() - Process response queue entries.
++ * @ha: SCSI driver HA context
++ * @index: Response queue out pointer
++ */
++static void
++qla2x00_response_pkt(scsi_qla_host_t *ha, uint16_t index) 
++{
++	device_reg_t	*reg = ha->iobase;
++	response_t	*pkt;
++
++	ENTER(__func__);
++
++	if (!ha->flags.online)
++		return;
++
++	if (index >= RESPONSE_ENTRY_CNT) {
++		/* Invalid response pointer value. */
++		DEBUG(printk("scsi(%ld): Response Pointer Error - index=%x.\n",
++		    ha->host_no, index));
++
++		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++		return;
++	}
++
++	while (ha->rsp_ring_index != index) {
++		pkt = ha->response_ring_ptr;
++
++		DEBUG5(printk("%s(%ld): ha->rsp_ring_index=%ld index=%ld.\n",
++		    __func__, ha->host_no,
++		    (u_long)ha->rsp_ring_index, (u_long)index));
++		DEBUG5(printk("%s(%ld): response packet data:",
++		    __func__, ha->host_no));
++		DEBUG5(qla2x00_dump_buffer((uint8_t *)pkt,
++		    RESPONSE_ENTRY_SIZE));
++
++		ha->rsp_ring_index++;
++		if (ha->rsp_ring_index == RESPONSE_ENTRY_CNT) {
++			ha->rsp_ring_index = 0;
++			ha->response_ring_ptr = ha->response_ring;
++		} else {
++			ha->response_ring_ptr++;
++		}
++
++#if defined(FC_IP_SUPPORT)
++		/*
++		 * This code is temporary until FW is fixed.  FW is mistakenly
++		 * setting bit 6 on Mailbox IOCB response
++		 */
++		pkt->entry_status &= 0x3f;
++#endif
++
++		if (pkt->entry_status != 0) {
++			DEBUG3(printk(KERN_INFO
++			    "scsi(%ld): Process error entry.\n", ha->host_no));
++
++			qla2x00_error_entry(ha, pkt);
++			continue;
++		}
++
++		switch (pkt->entry_type) {
++		case STATUS_TYPE:
++			qla2x00_status_entry(ha, (sts_entry_t *)pkt);
++			break;
++
++		case STATUS_CONT_TYPE:
++			qla2x00_status_cont_entry(ha, (sts_cont_entry_t *)pkt);
++			break;
++
++		case MS_IOCB_TYPE:
++			qla2x00_ms_entry(ha, (ms_iocb_entry_t *)pkt);
++			break;
++
++#if defined(FC_IP_SUPPORT)
++		case ET_IP_COMMAND_64:
++			/* Handle IP send completion */
++			qla2x00_ip_send_complete(ha,
++			    pkt->handle, le16_to_cpu(pkt->comp_status));
++			break;
++
++		case ET_IP_RECEIVE:
++			/* Handle IP receive packet */
++			qla2x00_ip_receive(ha, pkt);
++			break;
++
++		case ET_MAILBOX_COMMAND:
++		    if (pkt->sys_define == SOURCE_IP) {
++			    qla2x00_ip_mailbox_iocb_done(ha,
++				(struct mbx_entry *)pkt);
++			    break;
++		    }       
++#endif  /* FC_IP_SUPPORT */
++
++		default:
++			/* Type Not Supported. */
++			DEBUG4(printk(KERN_WARNING
++			    "scsi(%ld): Received unknown response pkt type %x "
++			    "entry status=%x.\n",
++			    ha->host_no, pkt->entry_type, pkt->entry_status));
++			break;
++		}
++	}
++
++	/* Adjust ring index */
++	WRT_REG_WORD(ISP_RSP_Q_OUT(reg), ha->rsp_ring_index);
++
++	LEAVE(__func__);
++}
++
++/**
++ * qla2x00_status_entry() - Process a Status IOCB entry.
++ * @ha: SCSI driver HA context
++ * @pkt: Entry pointer
++ */
++static void
++qla2x00_status_entry(scsi_qla_host_t *ha, sts_entry_t *pkt ) 
++{
++	uint32_t	b, t, l;
++	scsi_qla_host_t	*vis_ha;
++	srb_t		*sp;
++	os_lun_t	*lq;
++	os_tgt_t	*tq;
++	fc_port_t	*fcport;
++	Scsi_Cmnd	*cp;
++	uint16_t	comp_status;
++	uint16_t	scsi_status;
++	uint8_t		lscsi_status;
++	uint32_t	resid;
++	uint8_t		sense_sz = 0;
++
++
++	ENTER(__func__);
++
++	/* Validate handle. */
++	if (pkt->handle < MAX_OUTSTANDING_COMMANDS) {
++		sp = ha->outstanding_cmds[pkt->handle];
++		/* Free outstanding command slot. */
++		ha->outstanding_cmds[pkt->handle] = 0;
++	} else
++		sp = NULL;
++
++	if (sp == NULL) {
++		DEBUG2(printk("scsi(%ld): Status Entry invalid handle.\n",
++		    ha->host_no));
++		printk(KERN_WARNING
++		    "scsi(%ld): Status Entry invalid handle.\n", ha->host_no);
++
++		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++		if (ha->dpc_wait && !ha->dpc_active) 
++			up(ha->dpc_wait);
++		return;
++	}
++
++	cp = sp->cmd;
++	if (cp == NULL) {
++		DEBUG2(printk("scsi(%ld): Cmd already returned back to OS "
++		    "pkt->handle: %d sp=%p sp->state:%d\n",
++		    ha->host_no, pkt->handle, sp, sp->state));
++		printk(KERN_WARNING
++		    "scsi(%ld): Cmd is NULL: already returned to OS (sp=%p)\n",
++		    ha->host_no, sp);
++		return;
++	}
++
++	/*
++	 * Set the visible adapter for lun Q access.
++	 */
++	vis_ha = (scsi_qla_host_t *)cp->device->host->hostdata;
++	if (ha->actthreads)
++		ha->actthreads--;
++
++	if (sp->lun_queue == NULL) {
++		DEBUG2(printk("scsi(%ld): Status Entry invalid lun "
++		    "pointer.\n", ha->host_no));
++		printk(KERN_WARNING
++		    "scsi(%ld): Status Entry invalid lun pointer.\n",
++		    ha->host_no);
++
++		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++		if (ha->dpc_wait && !ha->dpc_active) 
++			up(ha->dpc_wait);
++		return;
++	}
++
++	sp->lun_queue->out_cnt--;
++#if defined(IOCB_THROLLE_USAGE)
++	ha->iocb_cnt -= sp->iocb_cnt;
++#endif
++
++	comp_status = le16_to_cpu(pkt->comp_status);
++	/* Mask of reserved bits 12-15.  Before we examine the scsi status */
++	scsi_status = le16_to_cpu(pkt->scsi_status) & SS_MASK;
++	lscsi_status = scsi_status & STATUS_MASK;
++
++	CMD_ENTRY_STATUS(cp) = pkt->entry_status;
++	CMD_COMPL_STATUS(cp) = comp_status;
++	CMD_SCSI_STATUS(cp) = scsi_status;
++
++	/* dg 10/11 */
++	sp->flags |= SRB_ISP_COMPLETED;
++
++	/* Generate LU queue on cntrl, target, LUN */
++	b = SCSI_BUS_32(cp);
++	t = SCSI_TCN_32(cp);
++	l = SCSI_LUN_32(cp);
++
++	tq = sp->tgt_queue;
++	lq = sp->lun_queue;
++
++	/*
++	 * If loop is in transient state Report DID_BUS_BUSY
++	 */
++	if (!(sp->flags & SRB_IOCTL) &&
++	    (atomic_read(&ha->loop_down_timer) ||
++		ha->loop_state != LOOP_READY) &&
++	    (comp_status != CS_COMPLETE || scsi_status != 0)) {
++
++		DEBUG2(printk("scsi(%ld:%d:%d:%d): Loop Not Ready - "
++		    "pid=%lx.\n",
++		    ha->host_no,
++		    b, t, l, sp->cmd->serial_number));
++
++		qla2x00_extend_timeout(sp->cmd, EXTEND_CMD_TIMEOUT);
++		add_to_retry_queue(ha, sp);
++		return;
++	}
++
++	/*
++	 * Based on Host and scsi status generate status code for Linux
++	 */
++	switch (comp_status) {
++	case CS_COMPLETE:
++		/*
++		 * Host complted command OK.  Check SCSI Status to determine
++		 * the correct Host status.
++		 */
++		if (scsi_status == 0) {
++			CMD_RESULT(cp) = DID_OK << 16;
++
++			/* Perform any post command processing */
++			qla2x00_filter_command(ha, sp);
++		} else {   /* Check for non zero scsi status */
++			if (lscsi_status == SS_BUSY_CONDITION) {
++				CMD_RESULT(cp) =
++				    DID_BUS_BUSY << 16 | lscsi_status;
++			} else {
++				CMD_RESULT(cp) =
++				    DID_OK << 16 | lscsi_status;
++
++				if (lscsi_status != SS_CHECK_CONDITION)
++					break;
++
++				/*
++				 * Copy Sense Data into sense buffer
++				 */
++				memset(cp->sense_buffer,
++				    0, sizeof(cp->sense_buffer));
++
++				if (!(scsi_status & SS_SENSE_LEN_VALID))
++					break;
++
++				if (le16_to_cpu(pkt->req_sense_length) <
++				    CMD_SNSLEN(cp))
++					sense_sz =
++					    le16_to_cpu(pkt->req_sense_length);
++				else
++					sense_sz = CMD_SNSLEN(cp) - 1;
++
++				CMD_ACTUAL_SNSLEN(cp) = sense_sz;
++				sp->request_sense_length = sense_sz;
++				sp->request_sense_ptr =
++				    (void *)cp->sense_buffer;
++
++				if (sp->request_sense_length > 32) 
++					sense_sz = 32;
++
++				memcpy(cp->sense_buffer,
++				    pkt->req_sense_data, sense_sz);
++
++				sp->request_sense_ptr += sense_sz;
++				sp->request_sense_length -= sense_sz;
++				if (sp->request_sense_length != 0)
++					ha->status_srb = sp;
++
++				if (!(sp->flags & SRB_IOCTL) &&
++				    qla2x00_check_sense(cp, lq) ==
++				        QL_STATUS_SUCCESS) {
++					/*
++					 * Throw away status_cont if any
++					 */
++					ha->status_srb = NULL;
++					add_to_scsi_retry_queue(ha, sp);
++					return;
++				}
++
++				DEBUG5(printk("%s(): Check condition Sense "
++				    "data, scsi(%ld:%d:%d:%d) cmd=%p "
++				    "pid=%ld\n",
++				    __func__,
++				    ha->host_no,
++				    b, t, l,
++				    cp, cp->serial_number));
++				if (sense_sz)
++					DEBUG5(qla2x00_dump_buffer(
++					    cp->sense_buffer,
++					    CMD_ACTUAL_SNSLEN(cp)));
++			}
++		}
++		break;
++
++	case CS_DATA_UNDERRUN:
++		DEBUG2(printk(KERN_INFO
++		    "scsi(%ld:%d:%d) UNDERRUN status detected 0x%x-0x%x.\n",
++		    ha->host_no,
++		    t, l, comp_status, scsi_status));
++
++		resid = le32_to_cpu(pkt->residual_length);
++		CMD_RESID_LEN(cp) = resid;
++
++		/*
++		 * Check to see if SCSI Status is non zero.  If so report SCSI
++		 * Status.
++		 */
++		if (lscsi_status != 0) {
++			if (lscsi_status == SS_BUSY_CONDITION) {
++				CMD_RESULT(cp) =
++				    DID_BUS_BUSY << 16 | lscsi_status;
++			} else {
++				CMD_RESULT(cp) =
++				    DID_OK << 16 | lscsi_status;
++
++				if (lscsi_status != SS_CHECK_CONDITION)
++					break;
++
++				/*
++				 * Copy Sense Data into sense buffer
++				 */
++				memset(cp->sense_buffer,
++				    0, sizeof(cp->sense_buffer));
++
++				if (!(scsi_status & SS_SENSE_LEN_VALID))
++					break;
++
++				if (le16_to_cpu(pkt->req_sense_length) <
++				    CMD_SNSLEN(cp))
++					sense_sz =
++					    le16_to_cpu(pkt->req_sense_length);
++				else
++					sense_sz = CMD_SNSLEN(cp) - 1;
++
++				CMD_ACTUAL_SNSLEN(cp) = sense_sz;
++				sp->request_sense_length = sense_sz;
++				sp->request_sense_ptr =
++				    (void *)cp->sense_buffer;
++
++				if (sp->request_sense_length > 32) 
++					sense_sz = 32;
++
++				memcpy(cp->sense_buffer,
++				    pkt->req_sense_data, sense_sz);
++
++				sp->request_sense_ptr += sense_sz;
++				sp->request_sense_length -= sense_sz;
++				if (sp->request_sense_length != 0)
++					ha->status_srb = sp;
++
++				if (!(sp->flags & SRB_IOCTL) &&
++				    (qla2x00_check_sense(cp, lq) ==
++					QL_STATUS_SUCCESS)) {
++					ha->status_srb = NULL;
++					add_to_scsi_retry_queue(ha,sp);
++					return;
++				}
++
++				DEBUG5(printk("%s(): Check condition Sense "
++				    "data, scsi(%ld:%d:%d:%d) cmd=%p "
++				    "pid=%ld\n",
++				    __func__,
++				    ha->host_no,
++				    b, t, l,
++				    cp, cp->serial_number));
++				if (sense_sz)
++					DEBUG5(qla2x00_dump_buffer(
++					    cp->sense_buffer,
++					    CMD_ACTUAL_SNSLEN(cp)));
++			}
++		} else {
++			/*
++			 * If RISC reports underrun and target does not report
++			 * it then we must have a lost frame, so tell upper
++			 * layer to retry it by reporting a bus busy.
++			 */
++			if (!(scsi_status & SS_RESIDUAL_UNDER)) {
++				DEBUG2(printk("scsi(%ld:%d:%d:%d) Dropped "
++				    "frame(s) detected (%x of %x bytes)..."
++				    "retrying command.\n",
++				    ha->host_no,
++				    b, t, l, resid, CMD_XFRLEN(cp)));
++
++				CMD_RESULT(cp) = DID_BUS_BUSY << 16;
++				ha->dropped_frame_error_cnt++;
++				break;
++			}
++
++			/*
++			 * Handle mid-layer underflow???
++			 *
++			 * For kernels less than 2.4, the driver must return
++			 * an error if an underflow is detected.  For kernels
++			 * equal-to and above 2.4, the mid-layer will
++			 * appearantly handle the underflow by detecting the
++			 * residual count -- unfortunately, we do not see
++			 * where this is actually being done.  In the interim,
++			 * we will return DID_ERROR.
++			 */
++			cp->resid = resid;
++/* TODO:
++ *
++ * Determine if this is a valid check for 2.5
++ */
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++			if ((unsigned)(CMD_XFRLEN(cp) - resid) <
++			    cp->underflow) {
++				printk(KERN_INFO
++				    "scsi(%ld): Mid-layer underflow detected "
++				    "(%x of %x bytes) wanted %x bytes..."
++				    "returning DID_ERROR status!\n",
++				    ha->host_no,
++				    resid, CMD_XFRLEN(cp), cp->underflow);
++
++				CMD_RESULT(cp) = DID_ERROR << 16;
++				break;
++			}
++#endif
++			/* Everybody online, looking good... */
++			CMD_RESULT(cp) = DID_OK << 16;
++
++			/* Perform any post command processing */
++			qla2x00_filter_command(ha, sp);
++		}
++		break;
++
++	case CS_PORT_LOGGED_OUT:
++	case CS_PORT_CONFIG_CHG:
++	case CS_PORT_BUSY:
++	case CS_INCOMPLETE:
++	case CS_PORT_UNAVAILABLE:
++		/*
++		 * If the port is in Target Down state, return all IOs for this
++		 * Target with DID_NO_CONNECT ELSE Queue the IOs in the
++		 * retry_queue.
++		 */
++		fcport = lq->fclun->fcport;
++		DEBUG2(printk("scsi(%ld:%d:%d): status_entry: Port Down "
++		    "pid=%ld, compl status=0x%x, port state=0x%x\n",
++		    ha->host_no,
++		    t, l,
++		    sp->cmd->serial_number,
++		    comp_status,
++		    atomic_read(&fcport->state)));
++
++		if ((sp->flags & SRB_IOCTL) ||
++		    (atomic_read(&fcport->state) == FC_DEVICE_DEAD)) {
++			CMD_RESULT(cp) = DID_NO_CONNECT << 16;
++			add_to_done_queue(ha, sp);
++		} else {
++			qla2x00_extend_timeout(cp, EXTEND_CMD_TIMEOUT);
++			add_to_retry_queue(ha, sp);
++		}
++
++		if (atomic_read(&fcport->state) == FC_ONLINE) {
++			qla2x00_mark_device_lost(ha, fcport);
++		}
++
++		return;
++		break;
++
++	case CS_RESET:
++		DEBUG2(printk(KERN_INFO
++		    "scsi(%ld): RESET status detected 0x%x-0x%x.\n",
++		    ha->host_no, comp_status, scsi_status));
++
++		if (sp->flags & SRB_IOCTL) {
++			CMD_RESULT(cp) = DID_RESET << 16;
++		}
++		else {
++			qla2x00_extend_timeout(cp, EXTEND_CMD_TIMEOUT);
++			add_to_retry_queue(ha, sp);
++			return;
++		}
++		break;
++
++	case CS_ABORTED:
++		/* 
++		 * hv2.19.12 - DID_ABORT does not retry the request if we
++		 * aborted this request then abort otherwise it must be a
++		 * reset.
++		 */
++		DEBUG2(printk(KERN_INFO
++		    "scsi(%ld): ABORT status detected 0x%x-0x%x.\n",
++		    ha->host_no, comp_status, scsi_status));
++
++		CMD_RESULT(cp) = DID_RESET << 16;
++		break;
++
++	case CS_TIMEOUT:
++		DEBUG2(printk(KERN_INFO
++		    "scsi(%ld:%d:%d:%d): TIMEOUT status detected 0x%x-0x%x.\n",
++		    ha->host_no,
++		    b, t, l,
++		    comp_status, scsi_status));
++
++		CMD_RESULT(cp) = DID_BUS_BUSY << 16;
++
++		fcport = lq->fclun->fcport;
++// Dump FW
++printk("***TIMEOUT cmd=(%lx) cdb=(%x)\n\n", cp->serial_number, cp->cmnd[0]);
++//qla2x00_dump_isp(ha, 1);
++
++		/* 
++		 * Check to see if logout occurred
++		 */
++		t = SCSI_TCN_32(cp);
++		if ((le16_to_cpu(pkt->status_flags) & IOCBSTAT_SF_LOGO)) {
++			DEBUG2(printk("scsi: Timeout occurred with Logo, "
++			    "status flag (%x) with public device loop id "
++			    "(%x), attempt new recovery\n",
++			    le16_to_cpu(pkt->status_flags),
++			    ha->fc_db[t].loop_id));
++
++			ha->fc_db[t].flag |= DEV_RELOGIN;
++			fcport->login_retry = ha->login_retry_count;
++			set_bit(RELOGIN_NEEDED, &ha->dpc_flags);
++		}
++		break;
++
++	case CS_QUEUE_FULL:
++		DEBUG2(printk(KERN_INFO
++		    "scsi(%ld): QUEUE FULL status detected 0x%x-0x%x.\n",
++		    ha->host_no, comp_status, scsi_status));
++
++		/*
++		 * SCSI Mid-Layer handles device queue full.
++		 */				 
++		CMD_RESULT(cp) = DID_OK << 16 | lscsi_status;
++
++/* Adjust queue depth */
++{
++int ret;
++
++ret = scsi_track_queue_full(cp->device, sp->lun_queue->out_cnt-1);
++printk("scsi(%ld:%d:%d:%d): QUEUE FULL adjustments -- "
++    "outstanding/adjusted (%ld/%d) -- qd/lqfd/lqfc (%d/%d/%d).\n",
++    ha->host_no,
++    cp->device->channel, cp->device->id, cp->device->lun,
++    sp->lun_queue->out_cnt-1, ret,
++    cp->device->queue_depth,
++    cp->device->last_queue_full_count,
++    cp->device->last_queue_full_depth);
++}
++
++
++		break;
++
++	default:
++		DEBUG3(printk("scsi(%ld): Error detected (unknown status) "
++		    "0x%x-0x%x.\n",
++		    ha->host_no, comp_status, scsi_status));
++		printk(KERN_INFO
++		    "scsi(%ld): Unknown status detected 0x%x-0x%x.\n",
++		    ha->host_no, comp_status, scsi_status);
++
++		CMD_RESULT(cp) = DID_ERROR << 16;
++		break;
++	}
++
++	/* Place command on done queue. */
++	if (ha->status_srb == NULL)
++		add_to_done_queue(ha, sp);
++
++	LEAVE(__func__);
++}
++
++/**
++ * qla2x00_status_cont_entry() - Process a Status Continuations entry.
++ * @ha: SCSI driver HA context
++ * @pkt: Entry pointer
++ *
++ * Extended sense data.
++ */
++static void
++qla2x00_status_cont_entry(scsi_qla_host_t *ha, sts_cont_entry_t *pkt)
++{
++	uint8_t		sense_sz = 0;
++	srb_t		*sp = ha->status_srb;
++	Scsi_Cmnd	*cp;
++
++	ENTER(__func__);
++
++	if (sp != NULL && sp->request_sense_length != 0) {
++		cp = sp->cmd;
++		if (cp == NULL) {
++			DEBUG2(printk("%s(): Cmd already returned back to OS "
++			    "sp=%p sp->state:%d\n",
++			    __func__, sp, sp->state));
++			printk(KERN_INFO
++			    "%s(): cmd is NULL: already returned to OS "
++			    "(sp=%p)\n",
++			    __func__, sp); 
++
++			ha->status_srb = NULL;
++			return;
++		}
++
++		if (sp->request_sense_length > sizeof (pkt->req_sense_data)) {
++			sense_sz = sizeof(pkt->req_sense_data);
++		} else {
++			sense_sz = sp->request_sense_length;
++		}
++
++		/* Move sense data. */
++		memcpy(sp->request_sense_ptr, pkt->req_sense_data, sense_sz);
++		DEBUG5(qla2x00_dump_buffer(sp->request_sense_ptr, sense_sz));
++
++		sp->request_sense_ptr += sense_sz;
++		sp->request_sense_length -= sense_sz;
++
++		/* Place command on done queue. */
++		if (sp->request_sense_length == 0) {
++			add_to_done_queue(ha, sp);
++			ha->status_srb = NULL;
++		}
++	}
++
++	LEAVE(__func__);
++}
++
++/**
++ * qla2x00_error_entry() - Process an error entry.
++ * @ha: SCSI driver HA context
++ * @pkt: Entry pointer
++ */
++static void
++qla2x00_error_entry(scsi_qla_host_t *ha, response_t *pkt) 
++{
++	srb_t *sp;
++
++	ENTER(__func__);
++
++#if defined(QL_DEBUG_LEVEL_2)
++	if (pkt->entry_status & RF_INV_E_ORDER)
++		printk("%s(%ld): Invalid Entry Order\n",
++		    __func__, ha->host_no);
++	else if (pkt->entry_status & RF_INV_E_COUNT)
++		printk("%s(%ld): Invalid Entry Count\n",
++		    __func__, ha->host_no);
++	else if (pkt->entry_status & RF_INV_E_PARAM)
++		printk("%s(%ld): Invalid Entry Parameter\n",
++		    __func__, ha->host_no);
++	else if (pkt->entry_status & RF_INV_E_TYPE)
++		printk("%s(%ld): Invalid Entry Type\n",
++		    __func__, ha->host_no);
++	else if (pkt->entry_status & RF_BUSY)
++		printk("%s(%ld): Busy\n",
++		    __func__, ha->host_no);
++	else
++		printk("%s(%ld): UNKNOWN flag error\n",
++		    __func__, ha->host_no);
++#endif
++
++	/* Validate handle. */
++	if (pkt->handle < MAX_OUTSTANDING_COMMANDS)
++		sp = ha->outstanding_cmds[pkt->handle];
++	else
++		sp = NULL;
++
++	if (sp) {
++		/* Free outstanding command slot. */
++		ha->outstanding_cmds[pkt->handle] = 0;
++		if (ha->actthreads)
++			ha->actthreads--;
++		sp->lun_queue->out_cnt--;
++#if defined(IOCB_THROLLE_USAGE)
++		ha->iocb_cnt -= sp->iocb_cnt;
++#endif
++
++		sp->flags |= SRB_ISP_COMPLETED;
++
++		/* Bad payload or header */
++		if (pkt->entry_status &
++		    (RF_INV_E_ORDER | RF_INV_E_COUNT |
++		     RF_INV_E_PARAM | RF_INV_E_TYPE)) {
++			CMD_RESULT(sp->cmd) = DID_ERROR << 16;
++		} else if (pkt->entry_status & RF_BUSY) {
++			CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16;
++		} else {
++			CMD_RESULT(sp->cmd) = DID_ERROR << 16;
++		}
++		/* Place command on done queue. */
++		add_to_done_queue(ha, sp);
++
++	} else if (pkt->entry_type == COMMAND_A64_TYPE ||
++	    pkt->entry_type == COMMAND_TYPE) {
++		DEBUG2(printk("scsi(%ld): Error entry - invalid handle\n",
++		    ha->host_no));
++		printk(KERN_WARNING
++		    "scsi(%ld): Error entry - invalid handle\n",
++		    ha->host_no);
++
++		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++		if (ha->dpc_wait && !ha->dpc_active) 
++			up(ha->dpc_wait);
++	}
++
++	LEAVE(__func__);
++}
++
++/**
++ * qla2x00_ms_entry() - Process a Management Server entry.
++ * @ha: SCSI driver HA context
++ * @index: Response queue out pointer
++ */
++static void
++qla2x00_ms_entry(scsi_qla_host_t *ha, ms_iocb_entry_t *pkt) 
++{
++	srb_t          *sp;
++
++	ENTER(__func__);
++
++	DEBUG3(printk("%s(%ld): pkt=%p pkthandle=%d.\n",
++	    __func__, ha->host_no, pkt, pkt->handle1));
++
++	/* Validate handle. */
++ 	if (pkt->handle1 < MAX_OUTSTANDING_COMMANDS)
++ 		sp = ha->outstanding_cmds[pkt->handle1];
++	else
++		sp = NULL;
++
++	if (sp == NULL) {
++		DEBUG2(printk("scsi(%ld): MS entry - invalid handle\n",
++		    ha->host_no));
++		printk(KERN_WARNING
++		    "scsi(%ld): MS entry - invalid handle\n",
++		    ha->host_no);
++
++		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++		return;
++	}
++
++	CMD_COMPL_STATUS(sp->cmd) = le16_to_cpu(pkt->status);
++	CMD_ENTRY_STATUS(sp->cmd) = pkt->entry_status;
++
++	/* Free outstanding command slot. */
++	ha->outstanding_cmds[pkt->handle1] = 0;
++	sp->flags |= SRB_ISP_COMPLETED;
++
++	add_to_done_queue(ha, sp);
++
++	LEAVE(__func__);
++}
++
++/**
++ * qla2x00_check_sense() - Perform any sense data interrogation.
++ * @cp: SCSI Command
++ * @lq: Lun queue
++ *
++ * Returns QL_STATUS_SUCCESS if the lun queue is suspended, else
++ * QL_STATUS_ERROR  (lun queue not suspended).
++ */
++static int 
++qla2x00_check_sense(Scsi_Cmnd *cp, os_lun_t *lq)
++{
++	scsi_qla_host_t	*ha;
++	srb_t		*sp;
++	fc_port_t	*fcport;
++
++	ha = (scsi_qla_host_t *) cp->device->host->hostdata;
++	if (((cp->sense_buffer[0] & 0x70) >> 4) != 7) {
++		return (QL_STATUS_ERROR);
++	}
++
++	sp = (srb_t * )CMD_SP(cp);
++	sp->flags |= SRB_GOT_SENSE;
++
++	switch (cp->sense_buffer[2] & 0xf) {
++	case RECOVERED_ERROR:
++		CMD_RESULT(cp)  = DID_OK << 16;
++		cp->sense_buffer[0] = 0;
++		break;
++
++	case NOT_READY:
++		fcport = lq->fclun->fcport;
++
++		/*
++		 * Suspend the lun only for hard disk device type.
++		 */
++		if (!(fcport->flags & FC_TAPE_DEVICE) &&
++		    lq->q_state != LUN_STATE_TIMEOUT) {
++			/*
++			 * If target is in process of being ready then suspend
++			 * lun for 6 secs and retry all the commands.
++			 */
++			if (cp->sense_buffer[12] == 0x4 &&
++			    cp->sense_buffer[13] == 0x1) {
++
++				/* Suspend the lun for 6 secs */
++				qla2x00_suspend_lun(ha,
++				    lq, 6, ql2xsuspendcount);
++
++				return (QL_STATUS_SUCCESS);
++			}
++		}
++		break;
++	}
++
++	return (QL_STATUS_ERROR);
++}
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_listops.h	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,397 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++/* Management functions for various lists */
++
++/*
++ * Found in kernel 2.4.9 and higher in include/linux/lists.h
++ *
++ * Iterate over a list safe against removal of list.
++ *
++ */
++#if !defined(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
++
++/* __add_to_done_queue()
++ * 
++ * Place SRB command on done queue.
++ *
++ * Input:
++ *      ha           = host pointer
++ *      sp           = srb pointer.
++ * Locking:
++ * 	this function assumes the ha->list_lock is already taken
++ */
++static inline void 
++__add_to_done_queue(struct scsi_qla_host * ha, srb_t * sp)
++{
++	/*
++        if (sp->state != SRB_NO_QUEUE_STATE && 
++        	sp->state != SRB_ACTIVE_STATE)
++		BUG();
++	*/
++
++        /* Place block on done queue */
++        sp->cmd->host_scribble = (unsigned char *) NULL;
++        sp->state = SRB_DONE_STATE;
++        list_add_tail(&sp->list,&ha->done_queue);
++        ha->done_q_cnt++;
++	sp->ha = ha;
++}
++
++/* __add_to_free_queue()
++ * 
++ * Place SRB command on free queue.
++ *
++ * Input:
++ *      ha           = host pointer
++ *      sp           = srb pointer.
++ * Locking:
++ * 	this function assumes the ha->list_lock is already taken
++ */
++static inline void 
++__add_to_free_queue(struct scsi_qla_host * ha, srb_t * sp)
++{
++	/*
++        if (atomic_read(&sp->ref_count) != 0)
++                BUG();
++	*/
++
++
++        /* Place block on free queue */
++        sp->state = SRB_FREE_STATE;
++        list_add_tail(&sp->list,&ha->free_queue);
++        ha->srb_cnt++;
++}
++
++static inline void 
++__add_to_retry_queue(struct scsi_qla_host * ha, srb_t * sp)
++{
++	/*
++        if( sp->state != SRB_NO_QUEUE_STATE && 
++        	sp->state != SRB_ACTIVE_STATE)
++		BUG();
++	*/
++
++        /* Place block on retry queue */
++        list_add_tail(&sp->list,&ha->retry_queue);
++        ha->retry_q_cnt++;
++        sp->flags |= SRB_WATCHDOG;
++        ha->flags.watchdog_enabled = TRUE;
++        sp->state = SRB_RETRY_STATE;
++	sp->ha = ha;
++}
++
++static inline void 
++__add_to_scsi_retry_queue(struct scsi_qla_host * ha, srb_t * sp)
++{
++	/*
++        if( sp->state != SRB_NO_QUEUE_STATE && 
++        	sp->state != SRB_ACTIVE_STATE)
++		BUG();
++	*/
++
++        /* Place block on retry queue */
++        list_add_tail(&sp->list,&ha->scsi_retry_queue);
++        ha->scsi_retry_q_cnt++;
++        sp->state = SRB_SCSI_RETRY_STATE;
++	sp->ha = ha;
++}
++
++static inline void 
++add_to_done_queue(struct scsi_qla_host * ha, srb_t * sp)
++{
++        unsigned long flags;
++
++        spin_lock_irqsave(&ha->list_lock, flags);
++        __add_to_done_queue(ha,sp);
++        spin_unlock_irqrestore(&ha->list_lock, flags);
++}
++
++static inline void 
++add_to_free_queue(struct scsi_qla_host * ha, srb_t * sp)
++{
++        unsigned long flags;
++
++        spin_lock_irqsave(&ha->list_lock, flags);
++        __add_to_free_queue(ha,sp);
++        spin_unlock_irqrestore(&ha->list_lock, flags);
++}
++
++static inline void 
++add_to_retry_queue(struct scsi_qla_host * ha, srb_t * sp)
++{
++        unsigned long flags;
++
++        spin_lock_irqsave(&ha->list_lock, flags);
++        __add_to_retry_queue(ha,sp);
++        spin_unlock_irqrestore(&ha->list_lock, flags);
++}
++
++static inline void 
++add_to_scsi_retry_queue(struct scsi_qla_host * ha, srb_t * sp)
++{
++        unsigned long flags;
++
++        spin_lock_irqsave(&ha->list_lock, flags);
++        __add_to_scsi_retry_queue(ha,sp);
++        spin_unlock_irqrestore(&ha->list_lock, flags);
++}
++
++/*
++ * __del_from_retry_queue
++ *      Function used to remove a command block from the
++ *      watchdog timer queue.
++ *
++ *      Note: Must insure that command is on watchdog
++ *            list before calling del_from_retry_queue
++ *            if (sp->flags & SRB_WATCHDOG)
++ *
++ * Input: 
++ *      ha = adapter block pointer.
++ *      sp = srb pointer.
++ * Locking:
++ *	this function assumes the list_lock is already taken
++ */
++static inline void 
++__del_from_retry_queue(struct scsi_qla_host * ha, srb_t * sp)
++{
++        list_del_init(&sp->list);
++
++        if (list_empty(&ha->retry_queue))
++                ha->flags.watchdog_enabled = FALSE;
++        sp->flags &= ~(SRB_WATCHDOG | SRB_BUSY);
++        sp->state = SRB_NO_QUEUE_STATE;
++        ha->retry_q_cnt--;
++}
++
++/*
++ * __del_from_scsi_retry_queue
++ *      Function used to remove a command block from the
++ *      scsi retry queue.
++ *
++ * Input: 
++ *      ha = adapter block pointer.
++ *      sp = srb pointer.
++ * Locking:
++ *	this function assumes the list_lock is already taken
++ */
++static inline void 
++__del_from_scsi_retry_queue(struct scsi_qla_host * ha, srb_t * sp)
++{
++        list_del_init(&sp->list);
++
++        ha->scsi_retry_q_cnt--;
++        sp->state = SRB_NO_QUEUE_STATE;
++}
++
++/*
++ * del_from_retry_queue
++ *      Function used to remove a command block from the
++ *      watchdog timer queue.
++ *
++ *      Note: Must insure that command is on watchdog
++ *            list before calling del_from_retry_queue
++ *            if (sp->flags & SRB_WATCHDOG)
++ *
++ * Input: 
++ *      ha = adapter block pointer.
++ *      sp = srb pointer.
++ * Locking:
++ *	this function takes and releases the list_lock
++ */
++static inline void 
++del_from_retry_queue(struct scsi_qla_host * ha, srb_t * sp)
++{
++        unsigned long flags;
++
++        /*	if (unlikely(!(sp->flags & SRB_WATCHDOG)))
++        		BUG();*/
++        spin_lock_irqsave(&ha->list_lock, flags);
++
++        /*	if (unlikely(list_empty(&ha->retry_queue)))
++        		BUG();*/
++
++        __del_from_retry_queue(ha,sp);
++
++        spin_unlock_irqrestore(&ha->list_lock, flags);
++}
++/*
++ * del_from_scsi_retry_queue
++ *      Function used to remove a command block from the
++ *      scsi retry queue.
++ *
++ * Input: 
++ *      ha = adapter block pointer.
++ *      sp = srb pointer.
++ * Locking:
++ *	this function takes and releases the list_lock
++ */
++static inline void 
++del_from_scsi_retry_queue(struct scsi_qla_host * ha, srb_t * sp)
++{
++        unsigned long flags;
++
++        spin_lock_irqsave(&ha->list_lock, flags);
++
++        /*	if (unlikely(list_empty(&ha->scsi_retry_queue)))
++        		BUG();*/
++
++        __del_from_scsi_retry_queue(ha,sp);
++
++        spin_unlock_irqrestore(&ha->list_lock, flags);
++}
++
++static inline void
++__del_from_free_queue(struct scsi_qla_host * ha, srb_t * sp)
++{
++        ha->srb_cnt--;
++        list_del_init(&sp->list);
++        sp->state = SRB_NO_QUEUE_STATE;
++}
++
++/*
++ * __add_to_pending_queue
++ *      Add the standard SCB job to the bottom of standard SCB commands.
++ *
++ * Input:
++ * COMPLETE!!!
++ *      q  = SCSI LU pointer.
++ *      sp = srb pointer.
++ *      SCSI_LU_Q lock must be already obtained.
++ */
++static inline void 
++__add_to_pending_queue(struct scsi_qla_host *ha, srb_t * sp)
++{
++	/*
++        if( sp->state != SRB_NO_QUEUE_STATE &&
++        	sp->state != SRB_FREE_STATE &&
++        	sp->state != SRB_ACTIVE_STATE)
++		BUG();
++	*/
++
++	list_add_tail(&sp->list, &ha->pending_queue);
++	ha->qthreads++;
++	sp->state = SRB_PENDING_STATE;
++}
++
++static inline void 
++__add_to_pending_queue_head(struct scsi_qla_host *ha, srb_t * sp)
++{
++	/*
++        if( sp->state != SRB_NO_QUEUE_STATE && 
++        	sp->state != SRB_FREE_STATE &&
++        	sp->state != SRB_ACTIVE_STATE)
++		BUG();
++	*/
++
++	list_add(&sp->list, &ha->pending_queue);
++	ha->qthreads++;
++	sp->state = SRB_PENDING_STATE;
++}
++
++static inline void
++add_to_pending_queue(struct scsi_qla_host *ha, srb_t *sp)
++{
++	unsigned long flags;
++
++	spin_lock_irqsave(&ha->list_lock, flags);
++	__add_to_pending_queue(ha, sp);
++	spin_unlock_irqrestore(&ha->list_lock, flags);
++}
++static inline void
++add_to_pending_queue_head(struct scsi_qla_host *ha, srb_t *sp)
++{
++	unsigned long flags;
++
++	spin_lock_irqsave(&ha->list_lock, flags);
++	__add_to_pending_queue_head(ha, sp);
++	spin_unlock_irqrestore(&ha->list_lock, flags);
++}
++
++static inline void
++__del_from_pending_queue(struct scsi_qla_host *ha, srb_t *sp)
++{
++	list_del_init(&sp->list);
++	ha->qthreads--;
++	sp->state = SRB_NO_QUEUE_STATE;
++}
++
++/*
++ * Failover Stuff.
++ */
++static inline void
++__add_to_failover_queue(struct scsi_qla_host * ha, srb_t * sp)
++{
++	/*
++        if( sp->state != SRB_NO_QUEUE_STATE && 
++        	sp->state != SRB_ACTIVE_STATE)
++		BUG();
++	*/
++
++        list_add_tail(&sp->list,&ha->failover_queue);
++        ha->failover_cnt++;
++        sp->state = SRB_FAILOVER_STATE;
++	sp->ha = ha;
++}
++
++static inline void add_to_failover_queue(struct scsi_qla_host * ha, srb_t * sp)
++{
++        unsigned long flags;
++
++        spin_lock_irqsave(&ha->list_lock, flags);
++
++        __add_to_failover_queue(ha,sp);
++
++        spin_unlock_irqrestore(&ha->list_lock, flags);
++}
++static inline void __del_from_failover_queue(struct scsi_qla_host * ha, srb_t *
++                sp)
++{
++        ha->failover_cnt--;
++        list_del_init(&sp->list);
++        sp->state = SRB_NO_QUEUE_STATE;
++}
++
++static inline void del_from_failover_queue(struct scsi_qla_host * ha, srb_t * sp)
++{
++        unsigned long flags;
++
++        spin_lock_irqsave(&ha->list_lock, flags);
++
++        __del_from_failover_queue(ha,sp);
++
++        spin_unlock_irqrestore(&ha->list_lock, flags);
++}
++
++static inline void 
++del_from_pending_queue(struct scsi_qla_host * ha, srb_t * sp)
++{
++        unsigned long flags;
++
++        spin_lock_irqsave(&ha->list_lock, flags);
++
++        __del_from_pending_queue(ha,sp);
++
++        spin_unlock_irqrestore(&ha->list_lock, flags);
++}
++
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_mbx.c	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,2884 @@
++/*
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ */
++
++#include "qla_os.h"
++
++#include "qla_def.h"
++
++/*
++ *  Local Function Prototypes.
++ */
++static void
++qla2x00_mbx_sem_timeout(unsigned long);
++
++static uint8_t
++qla2x00_get_mbx_access(scsi_qla_host_t *, uint32_t);
++
++static uint8_t
++qla2x00_release_mbx_access(scsi_qla_host_t *, uint32_t);
++
++static uint8_t
++qla2x00_mbx_q_add(scsi_qla_host_t *, mbx_cmdq_t **);
++
++static void
++qla2x00_mbx_q_get(scsi_qla_host_t *, mbx_cmdq_t **);
++
++static void
++qla2x00_mbx_q_memb_alloc(scsi_qla_host_t *, mbx_cmdq_t **);
++
++static void
++qla2x00_mbx_q_memb_free(scsi_qla_host_t *, mbx_cmdq_t *);
++
++/***************************/
++/* Function implementation */
++/***************************/
++
++static void
++qla2x00_mbx_sem_timeout(unsigned long data)
++{
++	struct semaphore	*sem_ptr = (struct semaphore *)data;
++
++	DEBUG11(printk("qla2x00_sem_timeout: entered.\n");)
++
++	if (sem_ptr != NULL) {
++		up(sem_ptr);
++	}
++
++	DEBUG11(printk("qla2x00_mbx_sem_timeout: exiting.\n");)
++}
++
++/*
++ *  tov = timeout value in seconds
++ */
++static uint8_t
++qla2x00_get_mbx_access(scsi_qla_host_t *ha, uint32_t tov)
++{
++	uint8_t		ret;
++	int		prev_val = 1;  /* assume no access yet */
++	mbx_cmdq_t	*ptmp_mbq;
++	struct timer_list	tmp_cmd_timer;
++	unsigned long	cpu_flags;
++
++
++	DEBUG11(printk("qla2x00_get_mbx_access(%ld): entered.\n",
++	    ha->host_no);)
++
++	while (1) {
++		if (test_bit(MBX_CMD_WANT, &ha->mbx_cmd_flags) == 0) {
++
++			DEBUG11(printk("qla2x00_get_mbx_access(%ld): going "
++			    " to test access flags.\n", ha->host_no);)
++
++			/* No one else is waiting. Go ahead and try to
++			 * get access.
++			 */
++			if ((prev_val = test_and_set_bit(MBX_CMD_ACTIVE,
++			    &ha->mbx_cmd_flags)) == 0) {
++				break;
++			}
++		}
++
++		/* wait for previous command to finish */
++		DEBUG(printk("qla2x00_get_mbx_access(%ld): access "
++		    "flags=%lx. busy. Waiting for access. curr time=0x%lx.\n",
++		    ha->host_no, ha->mbx_cmd_flags, jiffies);)
++
++		DEBUG11(printk("qla2x00_get_mbx_access(%ld): access "
++		    "flags=%lx. busy. Waiting for access. curr time=0x%lx.\n",
++		    ha->host_no, ha->mbx_cmd_flags, jiffies);)
++
++		/*
++		 * Init timer and get semaphore from mbx q. After we got valid
++		 * semaphore pointer the MBX_CMD_WANT flag would also had
++		 * been set.
++		 */
++		qla2x00_mbx_q_add(ha, &ptmp_mbq);
++
++		if (ptmp_mbq == NULL) {
++			/* queue full? problem? can't proceed. */
++			DEBUG2_3_11(printk("qla2x00_get_mbx_access(%ld): ERROR "
++			    "no more mbx_q allowed. exiting.\n", ha->host_no);)
++
++			break;
++		}
++
++		/* init timer and semaphore */
++		init_timer(&tmp_cmd_timer);
++		tmp_cmd_timer.data = (unsigned long)&ptmp_mbq->cmd_sem;
++		tmp_cmd_timer.function =
++		    (void (*)(unsigned long))qla2x00_mbx_sem_timeout;
++		tmp_cmd_timer.expires = jiffies + tov * HZ;
++
++		DEBUG11(printk("get_mbx_access(%ld): adding timer. "
++		    "curr time=0x%lx timeoutval=0x%lx.\n",
++		    ha->host_no, jiffies, tmp_cmd_timer.expires);)
++
++			/* wait. */
++/*	 	 add_timer(&tmp_cmd_timer);*/
++		DEBUG11(printk("get_mbx_access(%ld): going to sleep. "
++		    "current time=0x%lx.\n", ha->host_no, jiffies);)
++
++		down_interruptible(&ptmp_mbq->cmd_sem);
++
++		DEBUG11(printk("get_mbx_access(%ld): woke up. current "
++		    "time=0x%lx.\n",
++		    ha->host_no, jiffies);)
++
++/*		del_timer(&tmp_cmd_timer);*/
++
++		/* try to get lock again. we'll test later to see
++		 * if we actually got the lock.
++		 */
++		prev_val = test_and_set_bit(MBX_CMD_ACTIVE,
++		    &ha->mbx_cmd_flags);
++
++		/*
++		 * After we tried to get access then we check to see
++		 * if we need to clear the MBX_CMD_WANT flag. Don't clear
++		 * this flag before trying to get access or else another
++		 * new thread might grab it before we did.
++		 */
++		spin_lock_irqsave(&ha->mbx_q_lock, cpu_flags);
++		if (ha->mbx_q_head == NULL) {
++			/* We're the last thread in queue. */
++			clear_bit(MBX_CMD_WANT, &ha->mbx_cmd_flags);
++		}
++		qla2x00_mbx_q_memb_free(ha, ptmp_mbq);
++		spin_unlock_irqrestore(&ha->mbx_q_lock, cpu_flags);
++
++		break;
++	}
++
++	if (prev_val == 0) {
++		/* We got the lock */
++		DEBUG11(printk("qla2x00_get_mbx_access(%ld): success.\n",
++		    ha->host_no);)
++
++		ret = QL_STATUS_SUCCESS;
++	} else {
++		/* Timeout or resource error. */
++		DEBUG2_3_11(printk("qla2x00_get_mbx_access(%ld): timed out.\n",
++		    ha->host_no);)
++
++		ret = QL_STATUS_TIMEOUT;
++	}
++
++	return ret;
++}
++
++static uint8_t
++qla2x00_release_mbx_access(scsi_qla_host_t *ha, uint32_t tov)
++{
++	mbx_cmdq_t	*next_thread;
++
++	DEBUG11(printk("qla2x00_release_mbx_access:(%ld): entered.\n",
++	    ha->host_no);)
++
++	clear_bit(MBX_CMD_ACTIVE, &ha->mbx_cmd_flags);
++
++	/* Wake up one pending mailbox cmd thread in queue. */
++	qla2x00_mbx_q_get(ha, &next_thread);
++	if (next_thread) {
++		DEBUG11(printk("qla2x00_release_mbx_access: found pending "
++		    "mbx cmd. Waking up sem in %p.\n", &next_thread);)
++		up(&next_thread->cmd_sem);
++	}
++
++	DEBUG11(printk("qla2x00_release_mbx_access:(%ld): exiting.\n",
++	    ha->host_no);)
++
++	return QL_STATUS_SUCCESS;
++}
++
++/* Allocates a mbx_cmdq_t struct and add to the mbx_q list. */
++static uint8_t
++qla2x00_mbx_q_add(scsi_qla_host_t *ha, mbx_cmdq_t **ret_mbq)
++{
++	uint8_t		ret;
++	unsigned long	cpu_flags;
++	mbx_cmdq_t	*ptmp = NULL;
++
++	spin_lock_irqsave(&ha->mbx_q_lock, cpu_flags);
++
++	DEBUG11(printk("qla2x00_mbx_q_add: got mbx_q spinlock. "
++	    "Inst=%d.\n", apiHBAInstance);)
++
++	qla2x00_mbx_q_memb_alloc(ha, &ptmp);
++	if (ptmp == NULL) {
++		/* can't add any more threads */
++		DEBUG2_3_11(printk("qla2x00_mbx_q_add: ERROR no more "
++		    "ioctl threads allowed. Inst=%d.\n", apiHBAInstance);)
++
++		ret = QL_STATUS_RESOURCE_ERROR;
++	} else {
++		if (ha->mbx_q_tail == NULL) {
++			/* First thread to queue. */
++			set_bit(IOCTL_WANT, &ha->mbx_cmd_flags);
++
++			ha->mbx_q_head = ptmp;
++		} else {
++			ha->mbx_q_tail->pnext = ptmp;
++		}
++		ha->mbx_q_tail = ptmp;
++
++		/* Now init the semaphore */
++		init_MUTEX_LOCKED(&ptmp->cmd_sem);
++		ret = QL_STATUS_SUCCESS;
++	}
++
++	*ret_mbq = ptmp;
++
++	DEBUG11(printk("qla2x00_mbx_q_add: going to release spinlock. "
++	    "ret_mbq=%p, ret=%d. Inst=%d.\n", *ret_mbq, ret, apiHBAInstance);)
++
++	spin_unlock_irqrestore(&ha->mbx_q_lock, cpu_flags);
++
++	return ret;
++}
++
++/* Just remove and return first member from mbx_cmdq.  Don't free anything. */
++static void
++qla2x00_mbx_q_get(scsi_qla_host_t *ha, mbx_cmdq_t **ret_mbq)
++{
++	unsigned long	cpu_flags;
++
++	spin_lock_irqsave(&ha->mbx_q_lock, cpu_flags);
++
++	DEBUG11(printk("qla2x00_mbx_q_get: got mbx_q spinlock. "
++	    "Inst=%d.\n", apiHBAInstance);)
++
++	/* Remove from head */
++	*ret_mbq = ha->mbx_q_head;
++	if (ha->mbx_q_head != NULL) {
++		ha->mbx_q_head = ha->mbx_q_head->pnext;
++		if (ha->mbx_q_head == NULL) {
++			/* That's the last one in queue. */
++			ha->mbx_q_tail = NULL;
++		}
++		(*ret_mbq)->pnext = NULL;
++	}
++
++	DEBUG11(printk("qla2x00_mbx_q_remove: return ret_mbq=%p. Going to "
++	    "release spinlock. Inst=%d.\n", *ret_mbq, apiHBAInstance);)
++
++	spin_unlock_irqrestore(&ha->mbx_q_lock, cpu_flags);
++}
++
++/* Find a free mbx_q member from the array. Must already got the
++ * mbx_q_lock spinlock.
++ */
++static void
++qla2x00_mbx_q_memb_alloc(scsi_qla_host_t *ha, mbx_cmdq_t **ret_mbx_q_memb)
++{
++	mbx_cmdq_t	*ptmp = NULL;
++
++	DEBUG11(printk("qla2x00_mbx_q_memb_alloc: entered. "
++	    "Inst=%d.\n", apiHBAInstance);)
++
++	ptmp = ha->mbx_sem_pool_head;
++	if (ptmp != NULL) {
++		ha->mbx_sem_pool_head = ptmp->pnext;
++		ptmp->pnext = NULL;
++		if (ha->mbx_sem_pool_head == NULL) {
++			ha->mbx_sem_pool_tail = NULL;
++		}
++	} else {
++		/* We ran out of pre-allocated semaphores.  Try to allocate
++		 * a new one.
++		 */
++		ptmp = (void *)KMEM_ZALLOC(sizeof(mbx_cmdq_t), 40);
++	}
++
++	*ret_mbx_q_memb = ptmp;
++
++	DEBUG11(printk("qla2x00_mbx_q_memb_alloc: return waitq_memb=%p. "
++	    "Inst=%d.\n", *ret_mbx_q_memb, apiHBAInstance);)
++}
++
++/* Add the specified mbx_q member back to the free semaphore pool. Must
++ * already got the mbx_q_lock spinlock.
++ */
++static void
++qla2x00_mbx_q_memb_free(scsi_qla_host_t *ha, mbx_cmdq_t *pfree_mbx_q_memb)
++{
++	DEBUG11(printk("qla2x00_mbx_q_memb_free: entered. Inst=%d.\n",
++	    apiHBAInstance);)
++
++	if (pfree_mbx_q_memb != NULL) {
++		if (ha->mbx_sem_pool_tail != NULL) {
++			/* Add to tail */
++			ha->mbx_sem_pool_tail->pnext = pfree_mbx_q_memb;
++		} else {
++			ha->mbx_sem_pool_head = pfree_mbx_q_memb;
++		}
++		ha->mbx_sem_pool_tail = pfree_mbx_q_memb;
++	}
++
++	/* put it back to the free pool. */
++
++	DEBUG11(printk("qla2x00_mbx_q_memb_free: exiting. "
++	    "Inst=%d.\n", apiHBAInstance);)
++}
++
++/*
++ * qla2x00_mailbox_command
++ *	Issue mailbox command and waits for completion.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	mcp = driver internal mbx struct pointer.
++ *
++ * Output:
++ *	mb[MAX_MAILBOX_REGISTER_COUNT] = returned mailbox data.
++ *
++ * Returns:
++ *	0 : QL_STATUS_SUCCESS = cmd performed success
++ *	1 : QL_STATUS_ERROR   (error encountered)
++ *	6 : QL_STATUS_TIMEOUT (timeout condition encountered)
++ *
++ * Context:
++ *	Kernel context.
++ */
++uint8_t
++qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp)
++{
++	unsigned long    flags = 0;
++	device_reg_t     *reg       = ha->iobase;
++	struct timer_list	tmp_intr_timer;
++	uint8_t		abort_active = test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags);
++	uint8_t		io_lock_on = ha->init_done;
++	uint8_t		mbx_count;
++	uint8_t		status = 0;
++	uint8_t		tmp_stat = 0;
++	uint16_t	command;
++	uint16_t	*iptr, *optr;
++	uint32_t	cnt;
++	uint32_t	mboxes;
++	unsigned long	mbx_flags = 0;
++	unsigned long	wait_time;
++
++	DEBUG11(printk("qla2x00_mailbox_command(%ld): entered.\n",
++	    ha->host_no);)
++	/*
++	 * Wait for active mailbox commands to finish by waiting at most
++	 * tov seconds. This is to serialize actual issuing of mailbox cmds
++	 * during non ISP abort time.
++	 */
++	if (!abort_active) {
++		tmp_stat = qla2x00_get_mbx_access(ha, mcp->tov);
++		if (tmp_stat != QL_STATUS_SUCCESS) {
++			/* Timeout occurred. Return error. */
++			DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): cmd "
++			    "access timeout. Exiting.\n", ha->host_no);)
++			return QL_STATUS_TIMEOUT;
++		}
++	}
++
++	ha->flags.mbox_busy = TRUE;
++	/* Save mailbox command for debug */
++	ha->mcp = mcp;
++
++	/* Try to get mailbox register access */
++	if (!abort_active)
++		QLA_MBX_REG_LOCK(ha);
++
++	DEBUG11(printk("scsi%d: prepare to issue mbox cmd=0x%x.\n",
++	    (int)ha->host_no, mcp->mb[0]);)
++
++	ha->mbox_trace = 0;
++
++	spin_lock_irqsave(&ha->hardware_lock, flags);
++
++	/* Load mailbox registers. */
++	optr = (uint16_t *)&reg->mailbox0;
++	mbx_count = MAILBOX_REGISTER_COUNT;
++
++	iptr = mcp->mb;
++	command = mcp->mb[0];
++	mboxes = mcp->out_mb;
++
++	for (cnt = 0; cnt < mbx_count; cnt++) {
++#if defined(ISP2200)
++		if (cnt == 8) {
++			optr = (uint16_t *)&reg->mailbox8;
++		}
++#endif
++		if (mboxes & BIT_0) {
++			WRT_REG_WORD(optr, *iptr);
++		}
++
++		mboxes >>= 1;
++		optr++;
++		iptr++;
++	}
++
++#if defined(QL_DEBUG_LEVEL_1)
++	printk("qla2x00_mailbox_command: Loaded MBX registers "
++	    "(displayed in bytes) = \n");
++	qla2x00_dump_buffer((uint8_t *)mcp->mb, 16);
++	printk("\n");
++	qla2x00_dump_buffer(((uint8_t *)mcp->mb + 0x10), 16);
++	printk("\n");
++	qla2x00_dump_buffer(((uint8_t *)mcp->mb + 0x20), 8);
++	printk("\n");
++	printk("qla2x00_mailbox_command: I/O address = %lx.\n",
++	    (u_long)optr);
++	qla2x00_dump_regs(ha->host);
++#endif
++
++	/* Issue set host interrupt command to send cmd out. */
++	ha->flags.mbox_int = FALSE;
++	clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
++
++	/* Unlock mbx registers and wait for interrupt */
++
++	DEBUG11(printk("qla2x00_mailbox_command: going to unlock irq & "
++	    "waiting for interrupt. jiffies=%lx.\n", jiffies);)
++
++	/* Wait for mbx cmd completion until timeout */
++
++	if (!abort_active && io_lock_on) {
++		/* sleep on completion semaphore */
++		DEBUG11(printk("qla2x00_mailbox_command(%ld): "
++		    "INTERRUPT MODE. Initializing timer.\n",
++		    ha->host_no);)
++
++		init_timer(&tmp_intr_timer);
++		tmp_intr_timer.data = (unsigned long)&ha->mbx_intr_sem;
++		tmp_intr_timer.expires = jiffies + mcp->tov * HZ;
++		tmp_intr_timer.function =
++		    (void (*)(unsigned long))qla2x00_mbx_sem_timeout;
++
++		DEBUG11(printk("qla2x00_mailbox_command(%ld): "
++		    "Adding timer.\n", ha->host_no);)
++		add_timer(&tmp_intr_timer);
++
++		DEBUG11(printk("qla2x00_mailbox_command: going to "
++		    "unlock & sleep. time=0x%lx.\n", jiffies);)
++
++		MBOX_TRACE(ha,BIT_0);
++		set_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags);
++
++		WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
++		spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++		if (!abort_active)
++			QLA_MBX_REG_UNLOCK(ha);
++
++		MBOX_TRACE(ha,BIT_1);
++
++		/* Wait for either the timer to expire
++		 * or the mbox completion interrupt
++		 */
++		down_interruptible(&ha->mbx_intr_sem);
++
++		DEBUG11(printk("qla2x00_mailbox_command:"
++		    "waking up."
++		    "time=0x%lx\n", jiffies);)
++		clear_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags);
++
++		/* delete the timer */
++		del_timer(&tmp_intr_timer);
++#if QLA2100_LIPTEST
++		if (mbxtimeout) {
++			DEBUG(printk("qla2x00_mailbox_command(%ld): "
++			    "INTERRUPT MODE - testing timeout handling.\n",
++			    ha->host_no);)
++			ha->flags.mbox_int= FALSE;
++		}
++		mbxtimeout= 0;
++#endif
++
++	} else {
++
++		DEBUG3_11(printk("qla2x00_mailbox_command(%ld): cmd=%x "
++			"POLLING MODE.\n", ha->host_no, command);)
++
++		WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
++		spin_unlock_irqrestore(&ha->hardware_lock, flags);
++		if (!abort_active)
++			QLA_MBX_REG_UNLOCK(ha);
++
++
++		wait_time = jiffies + mcp->tov * HZ; /* wait at most tov secs */
++		while (!ha->flags.mbox_int) {
++			if (time_after(jiffies, wait_time))
++				break;
++
++			/* Check for pending interrupts. */
++			qla2x00_poll(ha);
++
++			udelay(10); /* v4.27 */
++		} /* while */
++	}
++
++	if (!abort_active)
++		QLA_MBX_REG_LOCK(ha);
++
++	/* Check whether we timed out */
++	if (ha->flags.mbox_int) {
++
++		DEBUG3_11(printk("qla2x00_mailbox_cmd: cmd %x completed.\n",
++		    command);)
++
++		/* Got interrupt. Clear the flag. */
++		ha->flags.mbox_int = FALSE;
++		clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
++
++		if( ha->mailbox_out[0] != MBS_CMD_CMP ) {
++			qla2x00_stats.mboxerr++;
++			status = QL_STATUS_ERROR;
++		}
++
++		/* Load return mailbox registers. */
++		optr = mcp->mb;
++		iptr = (uint16_t *)&ha->mailbox_out[0];
++		mboxes = mcp->in_mb;
++		for (cnt = 0; cnt < mbx_count; cnt++) {
++
++			if (mboxes & BIT_0)
++				*optr = *iptr;
++
++			mboxes >>= 1;
++			optr++;
++			iptr++;
++		}
++	} else {
++
++#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) || \
++		defined(QL_DEBUG_LEVEL_11)
++		printk("qla2x00_mailbox_command(%ld): **** MB Command Timeout "
++		    "for cmd %x ****\n", ha->host_no, command);
++		printk("qla2x00_mailbox_command: icontrol=%x jiffies=%lx\n",
++		    RD_REG_WORD(&reg->ictrl), jiffies);
++		printk("qla2x00_mailbox_command: *** mailbox[0] = 0x%x ***\n",
++		    RD_REG_WORD(optr));
++		qla2x00_dump_regs(ha->host);
++#endif
++
++		qla2x00_stats.mboxtout++;
++		status = QL_STATUS_TIMEOUT;
++	}
++
++	if (!abort_active)
++		QLA_MBX_REG_UNLOCK(ha);
++
++	ha->flags.mbox_busy = FALSE;
++
++	/* Clean up */
++	ha->mcp = NULL;
++
++	if (!abort_active) {
++		DEBUG11(printk("qla2x00_mailbox_cmd: checking for additional "
++		    "resp interrupt.\n");)
++
++		/* polling mode for non isp_abort commands. */
++		qla2x00_poll(ha);
++	}
++
++	if (status == QL_STATUS_TIMEOUT ) {
++		if (!io_lock_on || (mcp->flags & IOCTL_CMD)) {
++			/* not in dpc. schedule it for dpc to take over. */
++			DEBUG(printk("qla2x00_mailbox_command(%ld): timeout "
++			    "schedule isp_abort_needed.\n",
++			    ha->host_no);)
++			DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): "
++			    "timeout schedule isp_abort_needed.\n",
++			    ha->host_no);)
++			set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++			if (ha->dpc_wait && !ha->dpc_active) 
++				up(ha->dpc_wait);
++
++		} else if (!abort_active) {
++
++			/* call abort directly since we are in the DPC thread */
++			DEBUG(printk("qla2x00_mailbox_command(%ld): timeout "
++			    "calling abort_isp\n", ha->host_no);)
++			DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): "
++			    "timeout calling abort_isp\n", ha->host_no);)
++
++			set_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags);
++			clear_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++			if (qla2x00_abort_isp(ha, 0)) {
++				/* failed. retry later. */
++				set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++			}
++			clear_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags);
++
++			DEBUG(printk("qla2x00_mailbox_command: finished "
++			    "abort_isp\n");)
++			DEBUG2_3_11(printk("qla2x00_mailbox_command: finished "
++			    "abort_isp\n");)
++		}
++	}
++
++	/* Allow next mbx cmd to come in. */
++	if (!abort_active) {
++		tmp_stat = qla2x00_release_mbx_access(ha, mcp->tov);
++
++		if (status == 0)
++			status = tmp_stat;
++	}
++
++	if (status) {
++		DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): **** FAILED. "
++		    "mbx0=%x, mbx1=%x, mbx2=%x, cmd=%x ****\n",
++		ha->host_no, mcp->mb[0], mcp->mb[1], mcp->mb[2], command);)
++	} else {
++		DEBUG11(printk("qla2x00_mailbox_command(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	DEBUG11(printk("qla2x00_mailbox_command(%ld): exiting.\n",
++	    ha->host_no);)
++
++	return status;
++}
++
++/*
++ * qla2x00_load_ram
++ *	Load adapter RAM using DMA.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_load_ram(scsi_qla_host_t *ha, dma_addr_t req_dma,
++		uint16_t risc_addr, uint16_t risc_code_size)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++	uint32_t	req_len;
++	dma_addr_t	nml_dma;
++	uint32_t	nml_len;
++	uint32_t	normalized;
++
++	DEBUG11(printk("qla2x00_load_ram(%ld): entered.\n",
++	    ha->host_no);)
++
++	req_len = risc_code_size;
++	nml_dma = 0;
++	nml_len = 0;
++
++	normalized = qla2x00_normalize_dma_addr(
++			&req_dma, &req_len,
++			&nml_dma, &nml_len);
++
++	/* Load first segment */
++	mcp->mb[0] = MBC_LOAD_RAM_A64;
++	mcp->mb[1] = risc_addr;
++	mcp->mb[2] = MSW(req_dma);
++	mcp->mb[3] = LSW(req_dma);
++	mcp->mb[4] = (uint16_t)req_len;
++	mcp->mb[6] = MSW(MSD(req_dma));
++	mcp->mb[7] = LSW(MSD(req_dma));
++
++	mcp->out_mb = MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->in_mb = MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	/* Load second segment - if necessary */
++	if (normalized && (rval == QL_STATUS_SUCCESS)) {
++		mcp->mb[0] = MBC_LOAD_RAM_A64;
++		mcp->mb[1] = risc_addr + (uint16_t)req_len;
++		mcp->mb[2] = MSW(nml_dma);
++		mcp->mb[3] = LSW(nml_dma);
++		mcp->mb[4] = (uint16_t)nml_len;
++		mcp->mb[6] = MSW(MSD(nml_dma));
++		mcp->mb[7] = LSW(MSD(nml_dma));
++
++		mcp->out_mb = MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
++		mcp->in_mb = MBX_0;
++		mcp->tov = 30;
++		mcp->flags = 0;
++		rval = (int)qla2x00_mailbox_command(ha, mcp);
++	}
++
++	if (rval == QL_STATUS_SUCCESS) {
++		/* Empty */
++		DEBUG11(printk("qla2x00_load_ram(%ld): done.\n",
++		    ha->host_no);)
++	} else {
++		/* Empty */
++		DEBUG2_3_11(printk("qla2x00_load_ram(%ld): failed. rval=%x "
++		    "mb[0]=%x.\n",
++		    ha->host_no, rval, mcp->mb[0]);)
++	}
++	return rval;
++}
++
++/*
++ * qla2x00_load_ram_ext
++ *	Load adapter extended RAM using DMA.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_load_ram_ext(scsi_qla_host_t *ha,
++    dma_addr_t req_dma, uint32_t risc_addr, uint16_t risc_code_size)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++	uint32_t	req_len;
++	dma_addr_t	nml_dma;
++	uint32_t	nml_len;
++	uint32_t	normalized;
++
++	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
++
++	req_len = risc_code_size;
++	nml_dma = 0;
++	nml_len = 0;
++
++	normalized = qla2x00_normalize_dma_addr(
++			&req_dma, &req_len,
++			&nml_dma, &nml_len);
++
++	/* Load first segment */
++	mcp->mb[0] = MBC_LOAD_RAM_EXTENDED;
++	mcp->mb[1] = LSW(risc_addr);
++	mcp->mb[2] = MSW(req_dma);
++	mcp->mb[3] = LSW(req_dma);
++	mcp->mb[4] = (uint16_t)req_len;
++	mcp->mb[6] = MSW(MSD(req_dma));
++	mcp->mb[7] = LSW(MSD(req_dma));
++	mcp->mb[8] = MSW(risc_addr);
++
++	mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->in_mb = MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	/* Load second segment - if necessary */
++	if (normalized && (rval == QL_STATUS_SUCCESS)) {
++		risc_addr += req_len;
++		mcp->mb[0] = MBC_LOAD_RAM_EXTENDED;
++		mcp->mb[1] = LSW(risc_addr);
++		mcp->mb[2] = MSW(nml_dma);
++		mcp->mb[3] = LSW(nml_dma);
++		mcp->mb[4] = (uint16_t)nml_len;
++		mcp->mb[6] = MSW(MSD(nml_dma));
++		mcp->mb[7] = LSW(MSD(nml_dma));
++		mcp->mb[8] = MSW(risc_addr);
++
++		mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
++		mcp->in_mb = MBX_0;
++		mcp->tov = 30;
++		mcp->flags = 0;
++		rval = (int)qla2x00_mailbox_command(ha, mcp);
++	}
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n",
++		    __func__, ha->host_no, rval, mcp->mb[0]));
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_execute_fw
++ *	Start adapter firmware.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	TARGET_QUEUE_LOCK must be released.
++ *	ADAPTER_STATE_LOCK must be released.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_execute_fw(scsi_qla_host_t *ha)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("qla2x00_execute_fw(%ld): entered.\n",
++	    ha->host_no);)
++
++	mcp->mb[0] = MBC_EXECUTE_FIRMWARE;
++	mcp->mb[1] = *ha->brd_info->fwinfo[0].fwstart;
++	mcp->out_mb = MBX_1|MBX_0;
++	if (ha->pdev->device == QLA2322_DEVICE_ID) {
++		mcp->mb[2] = 0;
++		mcp->out_mb |= MBX_2;
++	}
++	mcp->in_mb = MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = qla2x00_mailbox_command(ha, mcp);
++
++	DEBUG11(printk("qla2x00_execute_fw(%ld): done.\n",
++	    ha->host_no);)
++
++	return rval;
++}
++
++/*
++ * qla2x00_get_fw_version
++ *	Get firmware version.
++ *
++ * Input:
++ *	ha:		adapter state pointer.
++ *	major:		pointer for major number.
++ *	minor:		pointer for minor number.
++ *	subminor:	pointer for subminor number.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++void
++qla2x00_get_fw_version(scsi_qla_host_t *ha, uint16_t *major,
++    uint16_t *minor, uint16_t *subminor, uint16_t *attributes)
++{
++	int		rval;
++	mbx_cmd_t	mc;
++	mbx_cmd_t	*mcp = &mc;
++
++	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
++
++	mcp->mb[0] = MBC_ABOUT_FIRMWARE;
++	mcp->out_mb = MBX_0;
++	mcp->in_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->flags = 0;
++	mcp->tov = 30;
++	rval = qla2x00_mailbox_command(ha, mcp);
++
++	/* Return mailbox data. */
++	*major = mcp->mb[1];
++	*minor = mcp->mb[2];
++	*subminor = mcp->mb[3];
++	*attributes = mcp->mb[6];
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("%s(%ld): failed=%x.\n",
++		    __func__, ha->host_no, rval));
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
++	}
++}
++
++/*
++ * qla2x00_get_fw_options
++ *	Set firmware options.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	fwopt = pointer for firmware options.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_get_fw_options(scsi_qla_host_t *ha,
++    uint16_t *fwopts1, uint16_t *fwopts2, uint16_t *fwopts3)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
++
++	mcp->mb[0] = MBC_GET_FIRMWARE_OPTIONS;
++	mcp->out_mb = MBX_0;
++	mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("%s(%ld): failed=%x.\n",
++		    __func__, ha->host_no, rval));
++	} else {
++		*fwopts1 = mcp->mb[1];
++		*fwopts2 = mcp->mb[2];
++		*fwopts3 = mcp->mb[3];
++
++		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
++	}
++
++	return rval;
++}
++
++
++/*
++ * qla2x00_set_fw_options
++ *	Set firmware options.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	fwopt = pointer for firmware options.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_set_fw_options(scsi_qla_host_t *ha,
++    uint16_t fwopts1, uint16_t fwopts2, uint16_t fwopts3, 
++    uint16_t fwopts10, uint16_t fwopts11)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
++
++	mcp->mb[0] = MBC_SET_FIRMWARE_OPTIONS;
++	mcp->mb[1] = fwopts1;
++	mcp->mb[2] = fwopts2;
++	mcp->mb[3] = fwopts3;
++	mcp->mb[10] = fwopts10;
++	mcp->mb[11] = fwopts11;
++	mcp->mb[12] = 0;	/* Undocumented, but used */
++	mcp->out_mb = MBX_12|MBX_11|MBX_10|MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->in_mb = MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("%s(%ld): failed=%x.\n",
++		    __func__, ha->host_no, rval));
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_read_ram_word
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_read_ram_word(scsi_qla_host_t *ha, uint16_t addr, uint16_t *data)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("qla2x00_read_ram_word(%ld): entered.\n",
++	    ha->host_no);)
++
++	mcp->mb[0] = MBC_READ_RAM_WORD;
++	mcp->mb[1] = addr;
++
++	mcp->out_mb = MBX_1|MBX_0;
++	mcp->in_mb = MBX_0|MBX_2;
++	mcp->tov = 30;
++	mcp->flags = 0;
++
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("qla2x00_read_ram_word(%ld): failed=%x.\n",
++		    ha->host_no, rval);)
++	} else {
++		*data = mcp->mb[2];
++		DEBUG11(printk("qla2x00_read_ram_word(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_write_ram_word
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_write_ram_word(scsi_qla_host_t *ha, uint16_t addr, uint16_t data)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("qla2x00_write_ram_word(%ld): entered.\n",
++	    ha->host_no);)
++
++	mcp->mb[0] = MBC_WRITE_RAM_WORD;
++	mcp->mb[1] = addr;
++	mcp->mb[2] = data;
++	mcp->out_mb = MBX_2|MBX_1|MBX_0;
++	mcp->in_mb = MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("qla2x00_write_ram_word(%ld): failed=%x.\n",
++		    ha->host_no, rval);)
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("qla2x00_write_ram_word(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_write_ram_word_ext
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_write_ram_word_ext(scsi_qla_host_t *ha, uint32_t addr, uint16_t data)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
++
++	mcp->mb[0] = MBC_WRITE_RAM_WORD_EXTENDED;
++	mcp->mb[1] = LSW(addr);
++	mcp->mb[2] = data;
++	mcp->mb[8] = MSW(addr);
++	mcp->out_mb = MBX_8|MBX_2|MBX_1|MBX_0;
++	mcp->in_mb = MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("%s(%ld): failed=%x.\n",
++		    __func__, ha->host_no, rval));
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_mbx_reg_test
++ *	Mailbox register wrap test.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	TARGET_QUEUE_LOCK must be released.
++ *	ADAPTER_STATE_LOCK must be released.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_mbx_reg_test(scsi_qla_host_t *ha)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("qla2x00_mbx_reg_test(%ld): entered.\n",
++	    ha->host_no);)
++
++	mcp->mb[0] = MBC_MAILBOX_REGISTER_TEST;
++	mcp->mb[1] = 0xAAAA;
++	mcp->mb[2] = 0x5555;
++	mcp->mb[3] = 0xAA55;
++	mcp->mb[4] = 0x55AA;
++	mcp->mb[5] = 0xA5A5;
++	mcp->mb[6] = 0x5A5A;
++	mcp->mb[7] = 0x2525;
++	mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->in_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval == QL_STATUS_SUCCESS) {
++		if (mcp->mb[1] != 0xAAAA || mcp->mb[2] != 0x5555 ||
++		    mcp->mb[3] != 0xAA55 || mcp->mb[4] != 0x55AA)
++			rval = QL_STATUS_ERROR;
++		if (mcp->mb[5] != 0xA5A5 || mcp->mb[6] != 0x5A5A ||
++		    mcp->mb[7] != 0x2525)
++			rval = QL_STATUS_ERROR;
++	}
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("qla2x00_mbx_reg_test(%ld): failed=%x.\n",
++		    ha->host_no, rval);)
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("qla2x00_mbx_reg_test(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_verify_checksum
++ *	Verify firmware checksum.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	TARGET_QUEUE_LOCK must be released.
++ *	ADAPTER_STATE_LOCK must be released.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_verify_checksum(scsi_qla_host_t *ha)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("qla2x00_verify_checksum(%ld): entered.\n",
++	    ha->host_no);)
++
++	mcp->mb[0] = MBC_VERIFY_CHECKSUM;
++	mcp->mb[1] = *ha->brd_info->fwinfo[0].fwstart;
++	mcp->out_mb = MBX_1|MBX_0;
++	mcp->in_mb = MBX_2|MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("qla2x00_verify_checksum(%ld): failed=%x.\n",
++		    ha->host_no, rval);)
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("qla2x00_verify_checksum(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_issue_iocb
++ *	Issue IOCB using mailbox command
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	buffer = buffer pointer.
++ *	phys_addr = physical address of buffer.
++ *	size = size of buffer.
++ *	TARGET_QUEUE_LOCK must be released.
++ *	ADAPTER_STATE_LOCK must be released.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_issue_iocb(scsi_qla_host_t *ha, void*  buffer, dma_addr_t phys_addr,
++    size_t size)
++{
++	int		rval;
++	mbx_cmd_t	mc;
++	mbx_cmd_t	*mcp = &mc;
++
++	ENTER("qla2x00_issue_iocb: started");
++
++	mcp->mb[0] = MBC_IOCB_EXECUTE_A64;
++	mcp->mb[1] = 0;
++	mcp->mb[2] = MSW(phys_addr);
++	mcp->mb[3] = LSW(phys_addr);
++	mcp->mb[6] = MSW(MSD(phys_addr));
++	mcp->mb[7] = LSW(MSD(phys_addr));
++	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->in_mb = MBX_2|MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QLA2X00_SUCCESS) {
++		/*EMPTY*/
++		DEBUG(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x",
++		    ha->host_no,rval);)
++		DEBUG2(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x",
++		    ha->host_no,rval);)
++	} else {
++		/*EMPTY*/
++		LEAVE("qla2x00_issue_iocb: exiting normally");
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_abort_command
++ *	Abort command aborts a specified IOCB.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	sp = SB structure pointer.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_abort_command(scsi_qla_host_t *ha, srb_t *sp)
++{
++	unsigned long   flags = 0;
++	scsi_qla_host_t	*curr_ha;
++	fc_port_t	*fcport;
++	int		rval;
++	uint32_t	handle;
++	uint16_t	t;
++	mbx_cmd_t	mc;
++	mbx_cmd_t	*mcp = &mc;
++	os_lun_t	*lq = sp->lun_queue;
++
++	DEBUG11(printk("qla2x00_abort_command(%ld): entered.\n",
++	    ha->host_no);)
++
++	curr_ha = lq->fclun->fcport->ha;
++	t = SCSI_TCN_32(sp->cmd);
++	fcport = lq->fclun->fcport;
++	if (curr_ha->loop_state == LOOP_DOWN ||
++		atomic_read(&fcport->state) == FC_DEVICE_LOST) {
++		/* v2.19.8 Ignore abort request if port is down */
++		return 1;
++	}
++
++	spin_lock_irqsave(&ha->hardware_lock, flags);
++	for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) {
++		if( ha->outstanding_cmds[handle] == sp )
++			break;
++	}
++	spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++	if (handle == MAX_OUTSTANDING_COMMANDS) {
++		/* command not found */
++		return QL_STATUS_ERROR;
++	}
++
++	mcp->mb[0] = MBC_ABORT_COMMAND;
++#if defined(EXTENDED_IDS)
++	mcp->mb[1] = fcport->loop_id & 0xFF;
++#else
++	mcp->mb[1] = fcport->loop_id << 8;
++#endif
++	mcp->mb[2] = (uint16_t)handle;
++	mcp->mb[3] = (uint16_t)(handle >> 16);
++	mcp->mb[6] = (uint16_t)lq->fclun->lun;
++	mcp->out_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->in_mb = MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		DEBUG2_3_11(printk("qla2x00_abort_command(%ld): failed=%x.\n",
++		    ha->host_no, rval);)
++	} else {
++		sp->flags |= SRB_ABORT_PENDING;
++		DEBUG11(printk("qla2x00_abort_command(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_abort_device
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *      loop_id  = FC loop ID
++ *      lun  = SCSI LUN.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_abort_device(scsi_qla_host_t *ha, uint16_t loop_id, uint16_t lun)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("qla2x00_abort_device(%ld): entered.\n",
++			ha->host_no);)
++
++	mcp->mb[0] = MBC_ABORT_DEVICE;
++#if defined(EXTENDED_IDS)
++	mcp->mb[1] = loop_id & 0xFF;
++#else
++	mcp->mb[1] = loop_id << 8;
++#endif
++	mcp->mb[2] = lun;
++	mcp->out_mb = MBX_2|MBX_1|MBX_0;
++	mcp->in_mb = MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	/* Issue marker command. */
++	qla2x00_marker(ha, loop_id, lun, MK_SYNC_ID_LUN);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++		if (ha->dpc_wait && !ha->dpc_active) 
++			up(ha->dpc_wait);
++		DEBUG2_3_11(printk("qla2x00_abort_device(%ld): failed=%x.\n",
++		    ha->host_no, rval);)
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("qla2x00_abort_device(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return rval;
++}
++
++#if USE_ABORT_TGT
++/*
++ * qla2x00_abort_target
++ *	Issue abort target mailbox command.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	b = Always 0.
++ *	t = SCSI ID.
++ *	TARGET_QUEUE_LOCK must be released.
++ *	ADAPTER_STATE_LOCK must be released.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_abort_target(fc_port_t *fcport)
++{
++	int        rval;
++	uint16_t   loop_id;
++	mbx_cmd_t  mc;
++	mbx_cmd_t  *mcp = &mc;
++
++	DEBUG11(printk("qla2x00_abort_target(%ld): entered.\n",
++	    fcport->ha->host_no);)
++
++	if (fcport == NULL) {
++		/* no target to abort */
++		return 0;
++	}
++
++	loop_id = fcport->loop_id;
++
++	mcp->mb[0] = MBC_ABORT_TARGET;
++#if defined(EXTENDED_IDS)
++	mcp->mb[1] = loop_id & 0xFF;
++#else
++	mcp->mb[1] = loop_id << 8;
++#endif
++	mcp->mb[2] = fcport->ha->loop_reset_delay;
++	mcp->out_mb = MBX_2|MBX_1|MBX_0;
++#if defined(EXTENDED_IDS)
++	mcp->mb[10] = 0;
++	mcp->out_mb |= MBX_10;
++#endif
++	mcp->in_mb = MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(fcport->ha, mcp);
++
++	/* Issue marker command. */
++/*	qla2x00_marker(fcport->ha, loop_id, 0, MK_SYNC_ID);*/
++	fcport->ha->marker_needed = 1;
++
++	if (rval != QL_STATUS_SUCCESS) {
++/*		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++		if (ha->dpc_wait && !ha->dpc_active) 
++			up(ha->dpc_wait); */
++		DEBUG2_3_11(printk("qla2x00_abort_target(%ld): failed=%x.\n",
++		    fcport->ha->host_no, rval);)
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("qla2x00_abort_target(%ld): done.\n",
++		    fcport->ha->host_no);)
++	}
++
++	return rval;
++}
++#endif
++
++/*
++ * qla2x00_target_reset
++ *	Issue target reset mailbox command.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	TARGET_QUEUE_LOCK must be released.
++ *	ADAPTER_STATE_LOCK must be released.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_target_reset(scsi_qla_host_t *ha, uint16_t b, uint16_t t)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++	os_tgt_t *tgt;
++
++	DEBUG11(printk("qla2x00_target_reset(%ld): entered.\n", ha->host_no);)
++
++	tgt = TGT_Q(ha, t);
++	if (tgt->vis_port == NULL) {
++		/* no target to abort */
++		return 0;
++	}
++	if (atomic_read(&tgt->vis_port->state) != FC_ONLINE) {
++		/* target not online */
++		return 0;
++	}
++
++	mcp->mb[0] = MBC_TARGET_RESET;
++#if defined(EXTENDED_IDS)
++	mcp->mb[1] = tgt->vis_port->loop_id & 0xFF;
++#else
++	mcp->mb[1] = tgt->vis_port->loop_id << 8;
++#endif
++	mcp->mb[2] = ha->loop_reset_delay;
++	mcp->out_mb = MBX_2|MBX_1|MBX_0;
++	mcp->in_mb = MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("qla2x00_target_reset(%ld): failed=%x.\n",
++		    ha->host_no, rval);)
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("qla2x00_target_reset(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_get_adapter_id
++ *	Get adapter ID and topology.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	id = pointer for loop ID.
++ *	al_pa = pointer for AL_PA.
++ *	area = pointer for area.
++ *	domain = pointer for domain.
++ *	top = pointer for topology.
++ *	TARGET_QUEUE_LOCK must be released.
++ *	ADAPTER_STATE_LOCK must be released.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_get_adapter_id(scsi_qla_host_t *ha, uint16_t *id, uint8_t *al_pa,
++    uint8_t *area, uint8_t *domain, uint16_t *top)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("qla2x00_get_adapter_id(%ld): entered.\n",
++	    ha->host_no);)
++
++	mcp->mb[0] = MBC_GET_ADAPTER_LOOP_ID;
++	mcp->out_mb = MBX_0;
++	mcp->in_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	/* Return data. */
++	*id = mcp->mb[1];
++	*al_pa = LSB(mcp->mb[2]);
++	*area = MSB(mcp->mb[2]);
++	*domain	= LSB(mcp->mb[3]);
++	*top = mcp->mb[6];
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("qla2x00_get_adapter_id(%ld): failed=%x.\n",
++		    ha->host_no, rval);)
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("qla2x00_get_adapter_id(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_get_retry_cnt
++ *	Get current firmware login retry count and delay.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	retry_cnt = pointer to login retry count.
++ *	tov = pointer to login timeout value.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_get_retry_cnt(scsi_qla_host_t *ha, uint8_t *retry_cnt, uint8_t *tov)
++{
++	int rval;
++	uint16_t ratov;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("qla2x00_get_retry_cnt(%ld): entered.\n",
++			ha->host_no);)
++
++	mcp->mb[0] = MBC_GET_RETRY_COUNT;
++	mcp->out_mb = MBX_0;
++	mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("qla2x00_get_retry_cnt(%ld): failed = %x.\n",
++		    ha->host_no, mcp->mb[0]);)
++	} else {
++		/* Convert returned data and check our values. */
++		ratov = (mcp->mb[3]/2) / 10;  /* mb[3] value is in 100ms */
++		if (mcp->mb[1] * ratov > (*retry_cnt) * (*tov)) {
++			/* Update to the larger values */
++			*retry_cnt = (uint8_t)mcp->mb[1];
++			*tov = ratov;
++		}
++
++		DEBUG11(printk("qla2x00_get_retry_cnt(%ld): done. mb3=%d "
++		    "ratov=%d.\n", ha->host_no, mcp->mb[3], ratov);)
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_loopback_test
++ *	Send out a LOOPBACK mailbox command.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	retry_cnt = pointer to login retry count.
++ *	tov = pointer to login timeout value.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_loopback_test(scsi_qla_host_t *ha, INT_LOOPBACK_REQ *req,
++    uint16_t *ret_mb)
++{
++	int		rval;
++	mbx_cmd_t	mc;
++	mbx_cmd_t	*mcp = &mc;
++
++	memset(mcp->mb, 0 , sizeof(mcp->mb));
++
++	mcp->mb[0] = MBC_DIAGNOSTIC_LOOP_BACK;
++	mcp->mb[1] = req->Options;
++	mcp->mb[10] = LSW(req->TransferCount);
++	mcp->mb[11] = MSW(req->TransferCount);
++
++	mcp->mb[14] = LSW(ha->ioctl_mem_phys); /* send data address */
++	mcp->mb[15] = MSW(ha->ioctl_mem_phys);
++	mcp->mb[20] = LSW(MSD(ha->ioctl_mem_phys));
++	mcp->mb[21] = MSW(MSD(ha->ioctl_mem_phys));
++
++	mcp->mb[16] = LSW(ha->ioctl_mem_phys); /* rcv data address */
++	mcp->mb[17] = MSW(ha->ioctl_mem_phys);
++	mcp->mb[6] = LSW(MSD(ha->ioctl_mem_phys));
++	mcp->mb[7] = MSW(MSD(ha->ioctl_mem_phys));
++
++	mcp->mb[18] = LSW(req->IterationCount); /* iteration count lsb */
++	mcp->mb[19] = MSW(req->IterationCount); /* iteration count msb */
++
++	mcp->out_mb = MBX_21|MBX_20|MBX_19|MBX_18|MBX_17|MBX_16|MBX_15|
++		MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0;
++	mcp->in_mb = MBX_19|MBX_18|MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->buf_size = req->TransferCount;
++	mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD;
++	mcp->tov = 30;
++
++	DEBUG11(printk("qla2x00_send_loopback: req.Options=%x iterations=%x "
++	    "MAILBOX_CNT=%d.\n", req->Options, req->IterationCount,
++	    MAILBOX_REGISTER_COUNT);)
++
++	rval = qla2x00_mailbox_command(ha, mcp);
++
++	/* Always copy back return mailbox values. */
++	memcpy((void *)ret_mb, (void *)mcp->mb, sizeof(mcp->mb));
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/* Empty. */
++		DEBUG2_3_11(printk(
++		    "qla2x00_loopback_test(%ld): mailbox command FAILED=%x.\n",
++		    ha->host_no, mcp->mb[0]);)
++	} else {
++		/* Empty. */
++		DEBUG11(printk(
++		    "qla2x00_loopback_test(%ld): done.\n", ha->host_no);)
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_init_firmware
++ *	Initialize adapter firmware.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	dptr = Initialization control block pointer.
++ *	size = size of initialization control block.
++ *	TARGET_QUEUE_LOCK must be released.
++ *	ADAPTER_STATE_LOCK must be released.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_init_firmware(scsi_qla_host_t *ha, uint16_t size)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("qla2x00_init_firmware(%ld): entered.\n",
++	    ha->host_no);)
++
++	mcp->mb[0] = MBC_INITIALIZE_FIRMWARE;
++	mcp->mb[2] = MSW(ha->init_cb_dma);
++	mcp->mb[3] = LSW(ha->init_cb_dma);
++	mcp->mb[4] = 0;
++	mcp->mb[5] = 0;
++	mcp->mb[6] = MSW(MSD(ha->init_cb_dma));
++	mcp->mb[7] = LSW(MSD(ha->init_cb_dma));
++	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
++	mcp->in_mb = MBX_5|MBX_4|MBX_0;
++	mcp->buf_size = size;
++	mcp->flags = MBX_DMA_OUT;
++	mcp->tov = 30;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("qla2x00_init_firmware(%ld): failed=%x "
++		    "mb0=%x.\n",
++		    ha->host_no, rval, mcp->mb[0]);)
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("qla2x00_init_firmware(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_get_port_database
++ *	Issue normal/enhanced get port database mailbox command
++ *	and copy device name as necessary.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	dev = structure pointer.
++ *	opt = enhanced cmd option byte.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_get_port_database(scsi_qla_host_t *ha, fcdev_t *dev, uint8_t opt)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++	port_database_t *pd;
++	dma_addr_t phys_address = 0;
++
++	DEBUG11(printk("qla2x00_get_port_database(%ld): entered.\n",
++	    ha->host_no);)
++
++	pd = pci_alloc_consistent(ha->pdev, PORT_DATABASE_SIZE, &phys_address);
++	if (pd  == NULL) {
++		DEBUG2_3_11(printk("qla2x00_get_port_database(%ld): **** "
++		    "Mem Alloc Failed ****",
++		    ha->host_no);)
++		return QL_STATUS_RESOURCE_ERROR;
++	}
++
++	memset(pd, 0, PORT_DATABASE_SIZE);
++
++	if (opt != 0)
++		mcp->mb[0] = MBC_ENHANCED_GET_PORT_DATABASE;
++	else
++		mcp->mb[0] = MBC_GET_PORT_DATABASE;
++
++#if defined(EXTENDED_IDS)
++	mcp->mb[1] = dev->loop_id & 0xFF;
++#else
++	mcp->mb[1] = dev->loop_id << 8 | opt;
++#endif
++	mcp->mb[2] = MSW(phys_address);
++	mcp->mb[3] = LSW(phys_address);
++	mcp->mb[6] = MSW(MSD(phys_address));
++	mcp->mb[7] = LSW(MSD(phys_address));
++	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
++#if defined(EXTENDED_IDS)
++	mcp->mb[10] = opt;
++	mcp->out_mb |= MBX_10;
++#endif
++	mcp->in_mb = MBX_0;
++	mcp->buf_size = PORT_DATABASE_SIZE;
++	mcp->flags = MBX_DMA_IN;
++	/*mcp->tov = ha->retry_count * ha->login_timeout * 2;*/
++	mcp->tov =  ha->login_timeout * 2;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval == QL_STATUS_SUCCESS) {
++		/* Save some data */
++		/* Names are big endian. */
++		memcpy((void *)&dev->name[0],(void *)&pd->node_name[0], 8);
++		memcpy((void *)&dev->wwn[0], (void *)&pd->port_name[0], 8);
++
++		/* Get port_id of device. */
++		dev->d_id.b.al_pa = pd->port_id[2];
++		dev->d_id.b.area = pd->port_id[3];
++		dev->d_id.b.domain = pd->port_id[0];
++		dev->d_id.b.rsvd_1 = 0;
++
++		/* Get initiator status of device. */
++		pd->prli_svc_param_word_3[0] & BIT_5 ?
++		    (dev->flag = dev->flag | DEV_INITIATOR) :
++		    (dev->flag = dev->flag & ~DEV_INITIATOR);
++
++		/* Check for logged in and whether target device. */
++		if (pd->master_state != PD_STATE_PORT_LOGGED_IN &&
++		    pd->slave_state != PD_STATE_PORT_LOGGED_IN) {
++			rval = QL_STATUS_ERROR;
++		} else if (pd->master_state == PD_STATE_PORT_UNAVAILABLE) {
++			rval = QL_STATUS_ERROR;
++		}
++	}
++
++	pci_free_consistent(ha->pdev, PORT_DATABASE_SIZE, pd, phys_address);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("qla2x00_get_port_database(%ld): "
++		    "failed=%x.\n", ha->host_no, rval);)
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("qla2x00_get_port_database(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_get_firmware_state
++ *	Get adapter firmware state.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	dptr = pointer for firmware state.
++ *	TARGET_QUEUE_LOCK must be released.
++ *	ADAPTER_STATE_LOCK must be released.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_get_firmware_state(scsi_qla_host_t *ha, uint16_t *dptr)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("qla2x00_get_firmware_state(%ld): entered.\n",
++	    ha->host_no);)
++
++	mcp->mb[0] = MBC_GET_FIRMWARE_STATE;
++	mcp->out_mb = MBX_0;
++	mcp->in_mb = MBX_2|MBX_1|MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	/* Return firmware state. */
++	*dptr = mcp->mb[1];
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("qla2x00_get_firmware_state(%ld): "
++		    "failed=%x.\n", ha->host_no, rval);)
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("qla2x00_get_firmware_state(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_get_port_name
++ *	Issue get port name mailbox command.
++ *	Returned name is in big endian format.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	loop_id = loop ID of device.
++ *	name = pointer for name.
++ *	TARGET_QUEUE_LOCK must be released.
++ *	ADAPTER_STATE_LOCK must be released.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_get_port_name(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t *name,
++    uint8_t opt)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("qla2x00_get_port_name(%ld): entered.\n",
++	    ha->host_no);)
++
++	mcp->mb[0] = MBC_GET_PORT_NAME;
++#if defined(EXTENDED_IDS)
++	mcp->mb[1] = loop_id & 0xFF;
++#else
++	mcp->mb[1] = loop_id << 8 | opt;
++#endif
++	mcp->out_mb = MBX_1|MBX_0;
++#if defined(EXTENDED_IDS)
++	mcp->mb[10] = opt;
++	mcp->out_mb |= MBX_10;
++#endif
++	mcp->in_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("qla2x00_get_port_name(%ld): failed=%x.\n",
++		    ha->host_no, rval);)
++	} else {
++		if (name != NULL) {
++			/* This function returns name in big endian. */
++			name[0] = LSB(mcp->mb[2]);
++			name[1] = MSB(mcp->mb[2]);
++			name[2] = LSB(mcp->mb[3]);
++			name[3] = MSB(mcp->mb[3]);
++			name[4] = LSB(mcp->mb[6]);
++			name[5] = MSB(mcp->mb[6]);
++			name[6] = LSB(mcp->mb[7]);
++			name[7] = MSB(mcp->mb[7]);
++		}
++
++		DEBUG11(printk("qla2x00_get_port_name(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_get_link_status
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	loop_id = device loop ID.
++ *	ret_buf = pointer to link status return buffer.
++ *
++ * Returns:
++ *	0 = success.
++ *	BIT_0 = mem alloc error.
++ *	BIT_1 = mailbox error.
++ */
++uint8_t
++qla2x00_get_link_status(scsi_qla_host_t *ha, uint8_t loop_id, void *ret_buf,
++    uint16_t *status)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++	link_stat_t *stat_buf;
++	dma_addr_t phys_address = 0;
++
++
++	DEBUG11(printk("qla2x00_get_link_status(%ld): entered.\n",
++	    ha->host_no);)
++
++	stat_buf = pci_alloc_consistent(ha->pdev, sizeof(link_stat_t),
++	    &phys_address);
++	if (stat_buf == NULL) {
++		DEBUG2_3_11(printk("qla2x00_get_link_status(%ld): Failed to "
++		    "allocate memory.\n", ha->host_no));
++		return BIT_0;
++	}
++
++	memset(stat_buf, 0, sizeof(link_stat_t));
++
++	mcp->mb[0] = MBC_GET_LINK_STATUS;
++#if defined(EXTENDED_IDS)
++	mcp->mb[1] = loop_id & 0xFF;
++#else
++	mcp->mb[1] = loop_id << 8;
++#endif
++	mcp->mb[2] = MSW(phys_address);
++	mcp->mb[3] = LSW(phys_address);
++	mcp->mb[6] = MSW(MSD(phys_address));
++	mcp->mb[7] = LSW(MSD(phys_address));
++	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
++#if defined(EXTENDED_IDS)
++	mcp->mb[10] = 0;
++	mcp->out_mb |= MBX_10;
++#endif
++	mcp->in_mb = MBX_0;
++	mcp->tov = 30;
++	mcp->flags = IOCTL_CMD;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval == QL_STATUS_SUCCESS) {
++
++		if (mcp->mb[0] != MBS_COMMAND_COMPLETE) {
++			DEBUG2_3_11(printk("qla2x00_get_link_status(%ld): cmd "
++			    "failed. mbx0=%x.\n", ha->host_no, mcp->mb[0]);)
++			status[0] = mcp->mb[0];
++			rval = BIT_1;
++		} else {
++			/* copy over data */
++			memcpy(ret_buf, stat_buf,sizeof(link_stat_t));
++			DEBUG(printk("qla2x00_get_link_status(%ld): stat dump: "
++			    "fail_cnt=%d loss_sync=%d loss_sig=%d seq_err=%d "
++			    "inval_xmt_word=%d inval_crc=%d.\n",
++			    ha->host_no,
++			    stat_buf->link_fail_cnt, stat_buf->loss_sync_cnt,
++			    stat_buf->loss_sig_cnt, stat_buf->prim_seq_err_cnt,
++			    stat_buf->inval_xmit_word_cnt,
++			    stat_buf->inval_crc_cnt);)
++			DEBUG11(printk("qla2x00_get_link_status(%ld): stat "
++			    "dump: fail_cnt=%d loss_sync=%d loss_sig=%d "
++			    "seq_err=%d inval_xmt_word=%d inval_crc=%d.\n",
++			    ha->host_no,
++			    stat_buf->link_fail_cnt, stat_buf->loss_sync_cnt,
++			    stat_buf->loss_sig_cnt, stat_buf->prim_seq_err_cnt,
++			    stat_buf->inval_xmit_word_cnt,
++			    stat_buf->inval_crc_cnt);)
++		}
++	} else {
++		/* Failed. */
++		DEBUG2_3_11(printk("qla2x00_get_link_status(%ld): failed=%x.\n",
++		    ha->host_no, rval);)
++		rval = BIT_1;
++	}
++
++	pci_free_consistent(ha->pdev, sizeof(link_stat_t),
++	    stat_buf, phys_address);
++
++	return rval;
++}
++
++/*
++ * qla2x00_lip_reset
++ *	Issue LIP reset mailbox command.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	TARGET_QUEUE_LOCK must be released.
++ *	ADAPTER_STATE_LOCK must be released.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_lip_reset(scsi_qla_host_t *ha)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("qla2x00_lip_reset(%ld): entered.\n",
++	    ha->host_no);)
++
++	mcp->mb[0] = MBC_LIP_RESET;
++#if defined(EXTENDED_IDS)
++	mcp->mb[1] = 0x00ff;
++#else
++	mcp->mb[1] = 0xff00;
++#endif
++	mcp->mb[2] = ha->loop_reset_delay;
++	mcp->mb[3] = 0;
++	mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
++#if defined(EXTENDED_IDS)
++	mcp->mb[10] = 0;
++	mcp->out_mb |= MBX_10;
++#endif
++	mcp->in_mb = MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("qla2x00_lip_reset(%ld): failed=%x.\n",
++		    ha->host_no, rval);)
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("qla2x00_lip_reset(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_send_sns
++ *	Send SNS command.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	sns = pointer for command.
++ *	cmd_size = command size.
++ *	buf_size = response/command size.
++ *	TARGET_QUEUE_LOCK must be released.
++ *	ADAPTER_STATE_LOCK must be released.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_send_sns(scsi_qla_host_t *ha, dma_addr_t sns_phys_address,
++    uint16_t cmd_size, size_t buf_size)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("qla2x00_send_sns(%ld): entered.\n",
++	    ha->host_no);)
++
++	mcp->mb[0] = MBC_SEND_SNS_COMMAND;
++	mcp->mb[1] = cmd_size;
++	mcp->mb[2] = MSW(sns_phys_address);
++	mcp->mb[3] = LSW(sns_phys_address);
++	mcp->mb[6] = MSW(MSD(sns_phys_address));
++	mcp->mb[7] = LSW(MSD(sns_phys_address));
++	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->in_mb = MBX_0|MBX_1;
++	mcp->buf_size = buf_size;
++	mcp->flags = MBX_DMA_OUT|MBX_DMA_IN;
++	/*mcp->tov = ha->retry_count * ha->login_timeout * 2;*/
++	mcp->tov =  ha->login_timeout * 2;
++
++	DEBUG11(printk("qla2x00_send_sns: retry cnt=%d ratov=%d total "
++	    "tov=%d.\n", ha->retry_count, ha->login_timeout, mcp->tov);)
++
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x "
++		    "mb[1]=%x.\n",
++		    ha->host_no, rval, mcp->mb[0], mcp->mb[1]);)
++		DEBUG2_3_11(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x "
++		    "mb[1]=%x.\n",
++		    ha->host_no, rval, mcp->mb[0], mcp->mb[1]);)
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("qla2x00_send_sns(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_login_fabric
++ *	Issue login fabric port mailbox command.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	loop_id = device loop ID.
++ *	domain = device domain.
++ *	area = device area.
++ *	al_pa = device AL_PA.
++ *	status = pointer for return status.
++ *	opt = command options.
++ *	TARGET_QUEUE_LOCK must be released.
++ *	ADAPTER_STATE_LOCK must be released.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_login_fabric(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain,
++    uint8_t area, uint8_t al_pa, uint16_t *status, uint8_t opt)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("qla2x00_login_fabric(%ld): entered.\n",
++	    ha->host_no);)
++
++	mcp->mb[0] = MBC_LOGIN_FABRIC_PORT;
++#if defined(EXTENDED_IDS)
++	mcp->mb[1] = loop_id & 0xFF;
++#else
++	mcp->mb[1] = (loop_id << 8) | opt;
++#endif
++	mcp->mb[2] = domain;
++	mcp->mb[3] = area << 8 | al_pa;
++	mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
++#if defined(EXTENDED_IDS)
++	mcp->mb[10] = opt;
++	mcp->out_mb |= MBX_10;
++#endif
++	mcp->in_mb = MBX_2|MBX_1|MBX_0;
++	/*mcp->tov = ha->retry_count * ha->login_timeout * 2;*/
++	mcp->tov = ha->login_timeout * 2;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	/* Return mailbox statuses. */
++	if (status != NULL) {
++		*status++ = mcp->mb[0];
++		*status++ = mcp->mb[1];
++		*status = mcp->mb[2];
++	}
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/* RLU tmp code: need to change main mailbox_command function to
++		 * return ok even when the mailbox completion value is not
++		 * SUCCESS. The caller needs to be responsible to interpret
++		 * the return values of this mailbox command if we're not
++		 * to change too much of the existing code.
++		 */
++		if (mcp->mb[0] == 0x4001 || mcp->mb[0] == 0x4002 ||
++		    mcp->mb[0] == 0x4003 || mcp->mb[0] == 0x4005 ||
++		    mcp->mb[0] == 0x4006)
++			rval = QL_STATUS_SUCCESS;
++
++		/*EMPTY*/
++		DEBUG2_3_11(printk("qla2x00_login_fabric(%ld): failed=%x "
++		    "mb[1]=%x mb[2]=%x.\n",
++		    ha->host_no, rval, mcp->mb[1], mcp->mb[2]);)
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("qla2x00_login_fabric(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_login_local_device
++ *           Issue login loop port mailbox command.
++ *    
++ * Input:
++ *           ha = adapter block pointer.
++ *           loop_id = device loop ID.
++ *           opt = command options.
++ *          
++ * Returns:
++ *            Return status code.
++ *             
++ * Context:
++ *            Kernel context.
++ *             
++ */
++int
++qla2x00_login_local_device(scsi_qla_host_t *ha,
++		uint16_t loop_id, uint16_t *mb_ret, uint8_t opt)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG3(printk("%s(%ld): entered.\n", __func__, ha->host_no);)
++
++	mcp->mb[0] = MBC_LOGIN_LOOP_PORT;
++#if defined(EXTENDED_IDS)
++	mcp->mb[1] = loop_id & 0xFF;
++#else
++	mcp->mb[1] = (loop_id << 8);
++#endif
++	mcp->mb[2] = opt;
++	mcp->out_mb = MBX_2|MBX_1|MBX_0;
++ 	mcp->in_mb = MBX_7|MBX_6|MBX_1|MBX_0;
++	mcp->tov =  ha->login_timeout * 2;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++ 	/* Return mailbox statuses. */
++ 	if (mb_ret != NULL) {
++ 		mb_ret[0] = mcp->mb[0];
++ 		mb_ret[1] = mcp->mb[1];
++ 		mb_ret[6] = mcp->mb[6];
++ 		mb_ret[7] = mcp->mb[7];
++ 	}
++
++	if (rval != QL_STATUS_SUCCESS) {
++ 		/* AV tmp code: need to change main mailbox_command function to
++ 		 * return ok even when the mailbox completion value is not
++ 		 * SUCCESS. The caller needs to be responsible to interpret
++ 		 * the return values of this mailbox command if we're not
++ 		 * to change too much of the existing code.
++ 		 */
++ 		if (mcp->mb[0] == 0x4005 || mcp->mb[0] == 0x4006)
++ 			rval = QL_STATUS_SUCCESS;
++
++		DEBUG(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x "
++		    "mb[6]=%x mb[7]=%x.\n",
++		    __func__, ha->host_no, rval, mcp->mb[0], mcp->mb[1],
++		    mcp->mb[6], mcp->mb[7]);)
++		DEBUG2_3(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x "
++		    "mb[6]=%x mb[7]=%x.\n",
++		    __func__, ha->host_no, rval, mcp->mb[0], mcp->mb[1],
++		    mcp->mb[6], mcp->mb[7]);)
++	} else {
++		/*EMPTY*/
++		DEBUG3(printk("%s(%ld): done.\n", __func__, ha->host_no);)
++	}
++
++	return (rval);
++}
++
++/*
++ * qla2x00_fabric_logout
++ *	Issue logout fabric port mailbox command.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	loop_id = device loop ID.
++ *	TARGET_QUEUE_LOCK must be released.
++ *	ADAPTER_STATE_LOCK must be released.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("qla2x00_fabric_logout(%ld): entered.\n",
++	    ha->host_no);)
++
++	mcp->mb[0] = MBC_LOGOUT_FABRIC_PORT;
++#if defined(EXTENDED_IDS)
++	mcp->mb[1] = loop_id & 0xFF;
++#else
++	mcp->mb[1] = loop_id << 8;
++#endif
++	mcp->out_mb = MBX_1|MBX_0;
++#if defined(EXTENDED_IDS)
++	mcp->mb[10] = 0;
++	mcp->out_mb |= MBX_10;
++#endif
++	mcp->in_mb = MBX_1|MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("qla2x00_fabric_logout(%ld): failed=%x "
++		    "mbx1=%x.\n",
++		    ha->host_no, rval, mcp->mb[1]);)
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("qla2x00_fabric_logout(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_full_login_lip
++ *	Issue full login LIP mailbox command.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	TARGET_QUEUE_LOCK must be released.
++ *	ADAPTER_STATE_LOCK must be released.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_full_login_lip(scsi_qla_host_t *ha)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n",
++	    ha->host_no);)
++
++	mcp->mb[0] = MBC_LIP_FULL_LOGIN;
++	mcp->mb[1] = 0;
++	mcp->mb[2] = 0;
++	mcp->mb[3] = 0;
++	mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->in_mb = MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("qla2x00_full_login_lip(%ld): failed=%x.\n",
++		    ha->instance, rval);)
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("qla2x00_full_login_lip(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_get_port_list
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	TARGET_QUEUE_LOCK must be released.
++ *	ADAPTER_STATE_LOCK must be released.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_get_port_list(scsi_qla_host_t *ha, port_list_entry_t *gp_list,
++    dma_addr_t gpl_phys_address, uint16_t opt, uint16_t *size)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	DEBUG11(printk("qla2x00_get_port_list(%ld): entered.\n",
++	    ha->host_no);)
++
++	if( gp_list == NULL ) {
++		return QL_STATUS_ERROR;
++	}
++
++	mcp->mb[0] = MBC_GET_PORT_LIST;
++	mcp->mb[1] = opt;
++	mcp->mb[2] = MSW(gpl_phys_address);
++	mcp->mb[3] = LSW(gpl_phys_address);
++	mcp->mb[6] = MSW(MSD(gpl_phys_address));
++	mcp->mb[7] = LSW(MSD(gpl_phys_address));
++
++	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->in_mb = MBX_1|MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		/*EMPTY*/
++		DEBUG2_3_11(printk("qla2x00_get_port_list(%ld): failed=%x.\n",
++		    ha->host_no, rval);)
++	} else {
++		*size = mcp->mb[1];
++		DEBUG11(printk("qla2x00_get_port_list(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return rval;
++}
++
++#if 0 /* not yet needed */
++int
++qla2x00_dump_ram(scsi_qla_host_t *ha, uint32_t risc_address,
++    dma_addr_t ispdump_dma, uint32_t size)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++
++	mcp->mb[0] = MBC_DUMP_RAM;
++	mcp->mb[1] = risc_address & 0xffff;
++	mcp->mb[2] = MSW(ispdump_dma);
++	mcp->mb[3] = LSW(ispdump_dma);
++	mcp->mb[4] = 0;
++	mcp->mb[6] = MSW(MSD(ispdump_dma));
++	mcp->mb[7] = LSW(MSD(ispdump_dma));
++
++	mcp->out_mb = MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->in_mb = MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = qla2x00_mailbox_command(ha, mcp);
++
++	return rval;
++}
++#endif
++
++/*
++ * qla2x00_lun_reset
++ *	Issue lun reset mailbox command.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	loop_id = device loop ID.
++ *      lun = lun to be reset.
++ *	TARGET_QUEUE_LOCK must be released.
++ *	ADAPTER_STATE_LOCK must be released.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_lun_reset(scsi_qla_host_t *ha, uint16_t loop_id, uint16_t lun)
++{
++	int		rval;
++	mbx_cmd_t	mc;
++	mbx_cmd_t	*mcp = &mc;
++
++	ENTER("qla2x00_lun_reset");
++
++	mcp->mb[0] = MBC_LUN_RESET;
++#if defined(EXTENDED_IDS)
++	mcp->mb[1] = loop_id & 0xFF;
++#else
++	mcp->mb[1] = loop_id << 8;
++#endif
++	mcp->mb[2] = lun;
++	mcp->out_mb = MBX_2|MBX_1|MBX_0;
++	mcp->in_mb = MBX_0;
++	mcp->tov = 30;
++	mcp->flags = 0;
++	rval = qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QLA2X00_SUCCESS) {
++		/*EMPTY*/
++		printk(KERN_WARNING "qla2x00_lun_reset(%d): failed = %d",
++		    (int)ha->instance, rval);
++	} else {
++		/*EMPTY*/
++		LEAVE("qla2x00_lun_reset: exiting normally");
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_send_rnid_mbx
++ *	Issue RNID ELS using mailbox command
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	loop_id = loop ID of the target device.
++ *	data_fmt = currently supports only 0xDF.
++ *	buffer = buffer pointer.
++ *	buf_size = size of buffer.
++ *	mb_reg = pointer to return mailbox registers.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_send_rnid_mbx(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t data_fmt,
++    dma_addr_t buf_phys_addr, size_t buf_size, uint16_t *mb_reg)
++{
++	int		rval;
++	mbx_cmd_t	mc;
++	mbx_cmd_t	*mcp = &mc;
++
++	DEBUG11(printk("qla2x00_send_rnid_mbx(%ld): entered.\n",
++	    ha->host_no);)
++
++	mcp->mb[0] = MBC_SEND_RNID_ELS;
++#if defined(EXTENDED_IDS)
++	mcp->mb[1] = loop_id & 0xFF;
++#else
++	mcp->mb[1] = (loop_id << 8 ) | data_fmt;
++#endif
++	mcp->mb[2] = MSW(buf_phys_addr);
++	mcp->mb[3] = LSW(buf_phys_addr);
++	mcp->mb[6] = MSW(MSD(buf_phys_addr));
++	mcp->mb[7] = LSW(MSD(buf_phys_addr));
++	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
++#if defined(EXTENDED_IDS)
++	mcp->mb[10] = data_fmt;
++	mcp->out_mb |= MBX_10;
++#endif
++	mcp->in_mb = MBX_1|MBX_0;
++	mcp->buf_size = buf_size;
++	mcp->flags = MBX_DMA_IN;
++	mcp->tov = 30;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		memcpy(mb_reg, mcp->mb, 2 * 2); /* 2 status regs */
++
++		DEBUG2_3_11(printk("qla2x00_send_rnid_mbx(%ld): failed=%x "
++		    "mb[1]=%x.\n",
++		    ha->host_no, mcp->mb[0], mcp->mb[1]);)
++	} else {
++		/*EMPTY*/
++	 	DEBUG11(printk("qla2x00_send_rnid_mbx(%ld): done.\n",
++		     ha->host_no);)
++	}
++
++	return (rval);
++}
++
++/*
++ * qla2x00_set_rnid_params_mbx
++ *	Set RNID parameters using mailbox command
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	buffer = buffer pointer.
++ *	buf_size = size of buffer.
++ *	mb_reg = pointer to return mailbox registers.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_set_rnid_params_mbx(scsi_qla_host_t *ha, dma_addr_t buf_phys_addr,
++    size_t buf_size, uint16_t *mb_reg)
++{
++	int		rval;
++	mbx_cmd_t	mc;
++	mbx_cmd_t	*mcp = &mc;
++
++	DEBUG11(printk("qla2x00_set_rnid_params_mbx(%ld): entered.\n",
++	    ha->host_no);)
++
++	mcp->mb[0] = MBC_SET_RNID_PARAMS;
++	mcp->mb[1] = 0;
++	mcp->mb[2] = MSW(buf_phys_addr);
++	mcp->mb[3] = LSW(buf_phys_addr);
++	mcp->mb[6] = MSW(MSD(buf_phys_addr));
++	mcp->mb[7] = LSW(MSD(buf_phys_addr));
++	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->in_mb = MBX_1|MBX_0;
++	mcp->buf_size = buf_size;
++	mcp->flags = MBX_DMA_OUT;
++	mcp->tov = 30;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QLA2X00_SUCCESS) {
++		memcpy(mb_reg, mcp->mb, 2 * 2); /* 2 status regs */
++
++		DEBUG2_3_11(printk("qla2x00_set_rnid_params_mbx(%ld): "
++		    "failed=%x mb[1]=%x.\n",
++		    ha->host_no, mcp->mb[0], mcp->mb[1]);)
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("qla2x00_set_rnid_params_mbx(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return (rval);
++}
++
++/*
++ * qla2x00_get_rnid_params_mbx
++ *	Get RNID parameters using mailbox command
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	buffer = buffer pointer.
++ *	buf_size = size of buffer.
++ *	mb_reg = pointer to return mailbox registers.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_get_rnid_params_mbx(scsi_qla_host_t *ha, dma_addr_t buf_phys_addr,
++    size_t buf_size, uint16_t *mb_reg)
++{
++	int		rval;
++	mbx_cmd_t	mc;
++	mbx_cmd_t	*mcp = &mc;
++
++	DEBUG11(printk("qla2x00_get_rnid_params_mbx(%ld): entered.\n",
++	    ha->host_no);)
++
++	mcp->mb[0] = MBC_GET_RNID_PARAMS;
++	mcp->mb[1] = 0;
++	mcp->mb[2] = MSW(buf_phys_addr);
++	mcp->mb[3] = LSW(buf_phys_addr);
++	mcp->mb[6] = MSW(MSD(buf_phys_addr));
++	mcp->mb[7] = LSW(MSD(buf_phys_addr));
++	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
++	mcp->in_mb = MBX_1|MBX_0;
++	mcp->buf_size = buf_size;
++	mcp->flags = MBX_DMA_IN;
++	mcp->tov = 30;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval != QLA2X00_SUCCESS) {
++		memcpy(mb_reg, mcp->mb, 2 * 2); /* 2 status regs */
++
++		DEBUG2_3_11(printk("qla2x00_get_rnid_params_mbx(%ld): "
++		    "failed=%x mb[1]=%x.\n",
++		    ha->host_no, mcp->mb[0], mcp->mb[1]);)
++	} else {
++		/*EMPTY*/
++		DEBUG11(printk("qla2x00_get_rnid_params_mbx(%ld): done.\n",
++		    ha->host_no);)
++	}
++
++	return (rval);
++}
++
++#if defined(QL_DEBUG_LEVEL_3)
++/*
++ * qla2x00_get_fcal_position_map
++ *	Get FCAL (LILP) position map using mailbox command
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pos_map = buffer pointer (can be NULL).
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_get_fcal_position_map(scsi_qla_host_t *ha, char *pos_map)
++{
++	int rval;
++	mbx_cmd_t mc;
++	mbx_cmd_t *mcp = &mc;
++	char *pmap;
++	dma_addr_t pmap_dma;
++
++	pmap = pci_alloc_consistent(ha->pdev, FCAL_MAP_SIZE, &pmap_dma);
++	if (pmap  == NULL) {
++		DEBUG2_3_11(printk("%s(%ld): **** Mem Alloc Failed ****",
++		    __func__, ha->host_no));
++		return QL_STATUS_RESOURCE_ERROR;
++	}
++
++	memset(pmap, 0, FCAL_MAP_SIZE);
++
++	mcp->mb[0] = MBC_GET_FCAL_MAP;
++	mcp->mb[2] = MSW(pmap_dma);
++	mcp->mb[3] = LSW(pmap_dma);
++	mcp->mb[6] = MSW(MSD(pmap_dma));
++	mcp->mb[7] = LSW(MSD(pmap_dma));
++	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
++	mcp->in_mb = MBX_1|MBX_0;
++	mcp->buf_size = FCAL_MAP_SIZE;
++	mcp->flags = MBX_DMA_IN;
++	mcp->tov =  ha->login_timeout * 2;
++	rval = (int)qla2x00_mailbox_command(ha, mcp);
++
++	if (rval == QL_STATUS_SUCCESS) {
++		DEBUG11(printk("%s(%ld): (mb0=%x/mb1=%x) FC/AL Position Map "
++		    "size (%x)\n",
++		    __func__, ha->host_no,
++		    mcp->mb[0], mcp->mb[1], (unsigned)pmap[0]));
++		DEBUG11(qla2x00_dump_buffer(pmap, pmap[0] + 1));
++
++		if (pos_map)
++			memcpy(pos_map, pmap, FCAL_MAP_SIZE);
++	}
++	pci_free_consistent(ha->pdev, FCAL_MAP_SIZE, pmap, pmap_dma);
++
++	if (rval != QL_STATUS_SUCCESS) {
++		DEBUG2_3_11(printk("%s(%ld): failed=%x.\n",
++		    __func__, ha->host_no, rval));
++	} else {
++		DEBUG11(printk("%s(%ld): done.\n",
++		    __func__, ha->host_no));
++	}
++
++	return rval;
++}
++#endif
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_os.c	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,5879 @@
++/*
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ */
++#define QLA_MODVERSION
++#include "qla_os.h"
++
++#include "qla_def.h"
++
++/*
++ * Driver version
++ */
++char qla2x00_version_str[40] = { 0 };
++
++/*
++* Command line options.
++*/
++unsigned long qla2x00_verbose = 1L;
++unsigned long qla2x00_quiet   = 0L;
++unsigned long qla2x00_reinit = 1L;
++unsigned long qla2x00_req_dmp = 0L;
++
++/*
++ * Stats for all adpaters.
++ */
++struct _qla2x00stats qla2x00_stats;
++
++/*
++ * Ioctl related information.
++ */
++int num_hosts = 0;       
++int apiHBAInstance = 0;
++
++/*
++ * Module parameter information and variables
++ */
++
++char *ql2xdevconf = NULL;
++#if MPIO_SUPPORT
++int ql2xretrycount = 30;
++#else
++int ql2xretrycount = 20;
++#endif
++int qla2xenbinq = 1;
++int max_srbs = MAX_SRBS;
++#if defined(ISP2200) || defined(ISP2300)
++int ql2xlogintimeout = 20;
++int qlport_down_retry = 0;
++#endif
++int ql2xmaxqdepth = 0;
++int displayConfig = 0;
++
++/* Enable for failover */
++#if MPIO_SUPPORT
++int ql2xfailover = 1;
++#else
++int ql2xfailover = 0;
++#endif
++
++int ConfigRequired = 0;
++int recoveryTime = MAX_RECOVERYTIME;
++int failbackTime = MAX_FAILBACKTIME;
++
++/* Persistent binding type */
++int Bind = BIND_BY_PORT_NAME;
++
++int ql2xsuspendcount = SUSPEND_COUNT;
++
++int qla2x00_retryq_dmp = 0;
++
++#if defined(MODULE)
++char *ql2xopts = NULL;
++
++static char dummy_buffer[60] =
++		"Please don't add commas in your insmod command!!\n";
++
++/* insmod qla2100 ql2xopts=verbose" */
++MODULE_PARM(ql2xopts, "s");
++MODULE_PARM_DESC(ql2xopts,
++		"Additional driver options.");
++
++MODULE_PARM(ql2xfailover, "i");
++MODULE_PARM_DESC(ql2xfailover,
++		"Driver failover support: 0 to disable; 1 to enable. "
++		"Default behaviour based on compile-time option "
++		"MPIO_SUPPORT.");
++
++MODULE_PARM(ql2xmaxqdepth, "i");
++MODULE_PARM_DESC(ql2xmaxqdepth,
++		"Maximum queue depth to report for target devices.");
++
++#if defined(ISP2200) || defined(ISP2300)
++MODULE_PARM(ql2xlogintimeout,"i");
++MODULE_PARM_DESC(ql2xlogintimeout,
++		"Login timeout value in seconds.");
++
++MODULE_PARM(qlport_down_retry,"i");
++MODULE_PARM_DESC(qlport_down_retry,
++		"Maximum number of command retries to a port that returns"
++		"a PORT-DOWN status.");
++#endif
++
++MODULE_PARM(ql2xretrycount,"i");
++MODULE_PARM_DESC(ql2xretrycount,
++		"Maximum number of mid-layer retries allowed for a command.  "
++		"Default value in non-failover mode is 20, "
++		"in failover mode, 30.");
++
++MODULE_PARM(max_srbs,"i");
++MODULE_PARM_DESC(max_srbs,
++		"Maximum number of simultaneous commands allowed for an HBA.");
++
++MODULE_PARM(displayConfig, "i");
++MODULE_PARM_DESC(displayConfig,
++		"If 1 then display the configuration used in "
++		"/etc/modules.conf.");
++
++MODULE_PARM(ConfigRequired, "i");
++MODULE_PARM_DESC(ConfigRequired,
++		"If 1, then only configured devices passed in through the"
++		"ql2xopts parameter will be presented to the OS");
++
++MODULE_PARM(recoveryTime, "i");
++MODULE_PARM_DESC(recoveryTime,
++		"Recovery time in seconds before a target device is sent I/O "
++		"after a failback is performed.");
++
++MODULE_PARM(failbackTime, "i");
++MODULE_PARM_DESC(failbackTime,
++		"Delay in seconds before a failback is performed.");
++
++MODULE_PARM(Bind, "i");
++MODULE_PARM_DESC(Bind,
++		"Target persistent binding method: "
++		"0 by Portname (default); 1 by PortID; 2 by Nodename. ");
++
++MODULE_PARM(ql2xsuspendcount,"i");
++MODULE_PARM_DESC(ql2xsuspendcount,
++		"Number of 6-second suspend iterations to perform while a "
++		"target returns a <NOT READY> status.  Default is 10 "
++		"iterations.");
++#endif
++
++MODULE_AUTHOR("QLogic Corporation");
++MODULE_DESCRIPTION("QLogic " ISP_NAME " FC-SCSI Host Bus Adapter driver");
++MODULE_LICENSE("GPL");
++
++
++/*
++ * Proc structures and functions
++ */
++struct info_str {
++	char	*buffer;
++	int	length;
++	off_t	offset;
++	int	pos;
++};
++
++static void copy_mem_info(struct info_str *, char *, int);
++static int copy_info(struct info_str *, char *, ...);
++
++
++/*
++ * List of host adapters
++ */
++struct list_head qla_hostlist;
++rwlock_t qla_hostlist_lock;
++
++
++/*
++ * PCI driver interface definitions
++ */
++#define ISP21XX_FW_INDEX	0
++#define ISP22XX_FW_INDEX	0
++#define ISP23XX_FW_INDEX	0
++#define ISP232X_FW_INDEX	2
++
++static struct qla_fw_info qla_fw_tbl[] = {
++#if defined(ISP2100)
++	/* Start of 21xx firmware list */
++	{
++		.addressing	= FW_INFO_ADDR_NORMAL,
++		.fwcode		= &fw2100tp_code01[0],
++		.fwlen		= &fw2100tp_length01,
++		.fwstart	= &fw2100tp_addr01,
++	},
++#endif
++
++#if defined(ISP2200)
++	/* Start of 22xx firmware list */
++	{
++		.addressing	= FW_INFO_ADDR_NORMAL,
++		.fwcode		= &fw2200ip_code01[0],
++		.fwlen		= &fw2200ip_length01,
++		.fwstart	= &fw2200ip_addr01,
++	},
++#endif
++
++#if defined(ISP2300)
++	/* Start of 23xx firmware list */
++#if defined(TPX)
++	{
++		.addressing	= FW_INFO_ADDR_NORMAL,
++		.fwcode		= &fw2300tpx_code01[0],
++		.fwlen		= &fw2300tpx_length01,
++		.fwstart	= &fw2300tpx_addr01,
++	},
++#else
++	{
++		.addressing	= FW_INFO_ADDR_NORMAL,
++		.fwcode		= &fw2300ipx_code01[0],
++		.fwlen		= &fw2300ipx_length01,
++		.fwstart	= &fw2300ipx_addr01,
++	},
++#endif
++
++#if defined(ISP2322)
++	/* End of 23xx firmware list */
++	{ FW_INFO_ADDR_NOMORE, },
++
++	/* Start of 232x firmware list */
++#if defined(TPX)
++	{
++		.addressing	= FW_INFO_ADDR_NORMAL,
++		.fwcode		= &fw2322tpx_code01[0],
++		.fwlen		= &fw2322tpx_length01,
++		.fwstart	= &fw2322tpx_addr01,
++	},
++	{
++		.addressing	= FW_INFO_ADDR_EXTENDED,
++		.fwcode		= &rseqtpx_code01[0],
++		.fwlen		= &rseqtpx_code_length01,
++		.lfwstart	= &rseqtpx_code_addr01,
++	},
++	{
++		.addressing	= FW_INFO_ADDR_EXTENDED,
++		.fwcode		= &xseqtpx_code01[0],
++		.fwlen		= &xseqtpx_code_length01,
++		.lfwstart	= &xseqtpx_code_addr01,
++	},
++#else
++	{
++		.addressing	= FW_INFO_ADDR_NORMAL,
++		.fwcode		= &fw2322ipx_code01[0],
++		.fwlen		= &fw2322ipx_length01,
++		.fwstart	= &fw2322ipx_addr01,
++	},
++	{
++		.addressing	= FW_INFO_ADDR_EXTENDED,
++		.fwcode		= &rseqipx_code01[0],
++		.fwlen		= &rseqipx_code_length01,
++		.lfwstart	= &rseqipx_code_addr01,
++	},
++	{
++		.addressing	= FW_INFO_ADDR_EXTENDED,
++		.fwcode		= &xseqipx_code01[0],
++		.fwlen		= &xseqipx_code_length01,
++		.lfwstart	= &xseqipx_code_addr01,
++	},
++#endif
++
++#endif
++
++#endif
++
++	/* End of firmware list */
++	{ FW_INFO_ADDR_NOMORE, },
++};
++
++#define ISP21XX_BRD_INDEX	0
++#define ISP22XX_BRD_INDEX	0
++#define ISP23XX_BRD_INDEX	0
++#define ISP2312_BRD_INDEX	1
++#define ISP2322_BRD_INDEX	2
++
++static struct qla_board_info qla_board_tbl[] = {
++#if defined(ISP2100)
++	{
++		.name		= "QLA2100 ",
++		.fwinfo		= &qla_fw_tbl[ISP21XX_FW_INDEX],
++	}
++#endif
++
++#if defined(ISP2200)
++	{
++		.name		= "QLA2200 ",
++		.fwinfo		= &qla_fw_tbl[ISP22XX_FW_INDEX],
++	}
++#endif
++
++#if defined(ISP2300)
++	{
++		.name		= "QLA2300 ",
++		.fwinfo		= &qla_fw_tbl[ISP23XX_FW_INDEX],
++	},
++
++	{
++		.name		= "QLA2312 ",
++		.fwinfo		= &qla_fw_tbl[ISP23XX_FW_INDEX],
++	},
++
++#if defined(ISP2322)
++	{
++		.name		= "QLA2322 ",
++		.fwinfo		= &qla_fw_tbl[ISP232X_FW_INDEX],
++	}
++#endif
++#endif
++};
++
++static struct pci_device_id qla_pci_tbl[] __devinitdata = {
++#if defined(ISP2100)
++	{
++		.vendor		= QLA2X00_VENDOR_ID,
++		.device		= QLA2100_DEVICE_ID,
++		.subvendor	= PCI_ANY_ID,
++		.subdevice	= PCI_ANY_ID,
++		.driver_data
++			= (unsigned long)&qla_board_tbl[ISP21XX_BRD_INDEX],
++	},
++#endif
++
++#if defined(ISP2200)
++	{
++		.vendor		= QLA2X00_VENDOR_ID,
++		.device		= QLA2200_DEVICE_ID,
++		.subvendor	= PCI_ANY_ID,
++		.subdevice	= PCI_ANY_ID,
++		.driver_data
++			= (unsigned long)&qla_board_tbl[ISP22XX_BRD_INDEX],
++	},
++#endif
++
++#if defined(ISP2300)
++	{
++		.vendor		= QLA2X00_VENDOR_ID,
++		.device		= QLA2300_DEVICE_ID,
++		.subvendor	= PCI_ANY_ID,
++		.subdevice	= PCI_ANY_ID,
++		.driver_data
++			= (unsigned long)&qla_board_tbl[ISP23XX_BRD_INDEX],
++	},
++
++	{
++		.vendor		= QLA2X00_VENDOR_ID,
++		.device		= QLA2312_DEVICE_ID,
++		.subvendor	= PCI_ANY_ID,
++		.subdevice	= PCI_ANY_ID,
++		.driver_data
++			= (unsigned long)&qla_board_tbl[ISP2312_BRD_INDEX],
++	},
++
++#if defined(ISP2322)
++	{
++		.vendor		= QLA2X00_VENDOR_ID,
++		.device		= QLA2322_DEVICE_ID,
++		.subvendor	= PCI_ANY_ID,
++		.subdevice	= PCI_ANY_ID,
++		.driver_data
++			= (unsigned long)&qla_board_tbl[ISP2322_BRD_INDEX],
++	},
++#endif
++#endif
++	{0 , 0}
++};
++MODULE_DEVICE_TABLE(pci, qla_pci_tbl);
++
++static int __devinit qla_probe_device(struct pci_dev *,
++    const struct pci_device_id *);
++static void __devexit qla_remove_device(struct pci_dev *);
++static void qla2x00_free_device(scsi_qla_host_t *);
++
++struct pci_driver qla_pci_driver = {
++	.name		= DRIVER_NAME,
++	.id_table	= qla_pci_tbl,
++
++	.probe		= qla_probe_device,
++	.remove		= __devexit_p(qla_remove_device),
++};
++
++
++/*
++ * SCSI host template entry points 
++ */
++static int qla2x00_detect(Scsi_Host_Template *);
++static int qla2x00_release(struct Scsi_Host *);
++static const char *qla2x00_info(struct Scsi_Host *);
++static int qla2xxx_slave_configure(Scsi_Device * device);
++static int qla2x00_biosparam(struct scsi_device *,
++    struct block_device *, sector_t, int[]);
++extern int qla2x00_ioctl(Scsi_Device *, int , void *);
++static int qla2xxx_eh_abort(Scsi_Cmnd *);
++static int qla2xxx_eh_device_reset(Scsi_Cmnd *);
++static int qla2xxx_eh_bus_reset(Scsi_Cmnd *);
++static int qla2xxx_eh_host_reset(Scsi_Cmnd *);
++static uint8_t qla2x00_loop_reset(scsi_qla_host_t *ha);
++static int qla2x00_device_reset(scsi_qla_host_t *, uint16_t, uint16_t);
++
++static int qla2x00_proc_info(char *, char **, off_t, int, int, int);
++
++static uint8_t qla2x00_register_with_Linux(scsi_qla_host_t *, uint8_t);
++
++#if defined (CONFIG_SCSIFCHOTSWAP) || defined(CONFIG_GAMAP)
++int qla2x00_get_scsi_info_from_wwn(int mode, unsigned long long wwn, int *host, int *channel, int *lun, int *id);
++int qla2x00_get_wwn_from_scsi_info(int host, int id, unsigned long long *wwn);
++#endif /* CONFIG_SCSIFCHOTSWAP || CONFIG_GAMAP */
++
++#if !defined(MODULE)
++static int __init qla2x00_setup(char *);
++#else
++static void qla2x00_setup(char *);
++#endif
++static char *qla2x00_get_line(char *, char *);
++static int qla2x00_get_tokens(char *, char **, int);
++
++
++static Scsi_Host_Template qla2x00_driver_template = {
++	.module			= THIS_MODULE,
++	.name			= DRIVER_NAME,
++	.proc_name		= DRIVER_NAME,
++	.proc_info		= qla2x00_proc_info,
++	.detect			= qla2x00_detect,
++	.release		= qla2x00_release,
++	.info			= qla2x00_info,
++	.ioctl			= qla2x00_ioctl,
++	.queuecommand		= qla2x00_queuecommand,
++
++	.eh_abort_handler	= qla2xxx_eh_abort,
++	.eh_device_reset_handler = qla2xxx_eh_device_reset,
++	.eh_bus_reset_handler	= qla2xxx_eh_bus_reset,
++	.eh_host_reset_handler	= qla2xxx_eh_host_reset,
++	.bios_param		= qla2x00_biosparam,
++
++	.slave_configure	= qla2xxx_slave_configure,
++
++	.this_id		= -1,
++	.can_queue		= 255,
++	.cmd_per_lun		= 3,
++	.sg_tablesize		= SG_ALL,
++	.use_clustering		= ENABLE_CLUSTERING,
++	.unchecked_isa_dma	= 0,
++	.max_sectors		= 8192,
++	.highmem_io		= 1,
++};
++
++static void qla2x00_display_fc_names(scsi_qla_host_t *);
++
++/* TODO Convert to inlines
++ *
++ * Timer routines
++ */
++#define	WATCH_INTERVAL		1       /* number of seconds */
++
++static void qla2x00_timer(scsi_qla_host_t *);
++
++static __inline__ void qla2x00_start_timer(scsi_qla_host_t *,
++    void *, unsigned long);
++static __inline__ void qla2x00_restart_timer(scsi_qla_host_t *, unsigned long);
++static __inline__ void qla2x00_stop_timer(scsi_qla_host_t *);
++
++static inline void
++qla2x00_start_timer(scsi_qla_host_t *ha, void *func, unsigned long interval)
++{
++	init_timer(&ha->timer);
++	ha->timer.expires = jiffies + interval * HZ;
++	ha->timer.data = (unsigned long)ha;
++	ha->timer.function = (void (*)(unsigned long))func;
++	add_timer(&ha->timer);
++	ha->timer_active = 1;
++}
++
++static inline void
++qla2x00_restart_timer(scsi_qla_host_t *ha, unsigned long interval)
++{
++	mod_timer(&ha->timer, jiffies + interval * HZ);
++}
++
++static __inline__ void
++qla2x00_stop_timer(scsi_qla_host_t *ha)
++{
++	del_timer_sync(&ha->timer);
++	ha->timer_active = 0;
++}
++
++
++static void qla2x00_cmd_timeout(srb_t *sp);
++static __inline__ void qla2x00_add_timer_to_cmd(srb_t *sp, int timeout);
++static __inline__ void qla2x00_delete_timer_from_cmd(srb_t *sp);
++
++/**************************************************************************
++*   qla2x00_add_timer_to_cmd
++*
++* Description:
++*       Creates a timer for the specified command. The timeout is usually
++*       the command time from kernel minus 2 secs.
++*
++* Input:
++*     sp - pointer to validate
++*
++* Returns:
++*     None.
++**************************************************************************/
++static inline void
++qla2x00_add_timer_to_cmd(srb_t *sp, int timeout)
++{
++	init_timer(&sp->timer);
++	sp->timer.expires = jiffies + timeout * HZ;
++	sp->timer.data = (unsigned long) sp;
++	sp->timer.function = (void (*) (unsigned long))qla2x00_cmd_timeout;
++	add_timer(&sp->timer);
++}
++
++/**************************************************************************
++*   qla2x00_delete_timer_from_cmd
++*
++* Description:
++*       Delete the timer for the specified command.
++*
++* Input:
++*     sp - pointer to validate
++*
++* Returns:
++*     None.
++**************************************************************************/
++static inline void 
++qla2x00_delete_timer_from_cmd(srb_t *sp)
++{
++	if (sp->timer.function != NULL) {
++		del_timer(&sp->timer);
++		sp->timer.function =  NULL;
++		sp->timer.data = (unsigned long) NULL;
++	}
++}
++
++static __inline__ void qla2x00_callback(scsi_qla_host_t *, Scsi_Cmnd *);
++static __inline__ void sp_put(struct scsi_qla_host * ha, srb_t *sp);
++static __inline__ void sp_get(struct scsi_qla_host * ha, srb_t *sp);
++static __inline__ void __sp_put(struct scsi_qla_host * ha, srb_t *sp);
++static __inline__ void
++qla2x00_delete_from_done_queue(scsi_qla_host_t *, srb_t *); 
++
++/**************************************************************************
++* sp_put
++*
++* Description:
++*   Decrement reference count and call the callback if we're the last
++*   owner of the specified sp. Will get io_request_lock before calling
++*   the callback.
++*
++* Input:
++*   ha - pointer to the scsi_qla_host_t where the callback is to occur.
++*   sp - pointer to srb_t structure to use.
++*
++* Returns:
++*
++**************************************************************************/
++static inline void
++sp_put(struct scsi_qla_host * ha, srb_t *sp)
++{
++        unsigned long flags;
++
++        if (atomic_read(&sp->ref_count) == 0) {
++		printk(KERN_INFO
++			"%s(): **** SP->ref_count not zero\n",
++			__func__);
++                DEBUG2(BUG();)
++
++                return;
++	}
++
++        if (!atomic_dec_and_test(&sp->ref_count))
++        {
++                return;
++        }
++
++        spin_lock_irqsave(ha->host->host_lock, flags);
++
++        qla2x00_callback(ha, sp->cmd);
++
++        spin_unlock_irqrestore(ha->host->host_lock, flags);
++}
++
++/**************************************************************************
++* sp_get
++*
++* Description:
++*   Increment reference count of the specified sp.
++*
++* Input:
++*   sp - pointer to srb_t structure to use.
++*
++* Returns:
++*
++**************************************************************************/
++static inline void
++sp_get(struct scsi_qla_host * ha, srb_t *sp)
++{
++        atomic_inc(&sp->ref_count);
++
++        if (atomic_read(&sp->ref_count) > 2) {
++		printk(KERN_INFO
++			"%s(): **** SP->ref_count greater than two\n",
++			__func__);
++                DEBUG2(BUG();)
++
++		return;
++	}
++}
++
++/**************************************************************************
++* __sp_put
++*
++* Description:
++*   Decrement reference count and call the callback if we're the last
++*   owner of the specified sp. Will NOT get io_request_lock before calling
++*   the callback.
++*
++* Input:
++*   ha - pointer to the scsi_qla_host_t where the callback is to occur.
++*   sp - pointer to srb_t structure to use.
++*
++* Returns:
++*
++**************************************************************************/
++static inline void
++__sp_put(struct scsi_qla_host * ha, srb_t *sp)
++{
++        if (atomic_read(&sp->ref_count) == 0) {
++		printk(KERN_INFO
++			"%s(): **** SP->ref_count not zero\n",
++			__func__);
++                DEBUG2(BUG();)
++
++		return;
++	}
++
++        if (!atomic_dec_and_test(&sp->ref_count))
++        {
++                return;
++        }
++
++        qla2x00_callback(ha, sp->cmd);
++}
++
++
++/*
++* qla2x00_callback
++*      Returns the completed SCSI command to LINUX.
++*
++* Input:
++*	ha -- Host adapter structure
++*	cmd -- SCSI mid-level command structure.
++* Returns:
++*      None
++* Note:From failover point of view we always get the sp
++*      from vis_ha pool in queuecommand.So when we put it 
++*      back to the pool it has to be the vis_ha.	 
++*      So rely on Scsi_Cmnd to get the vis_ha and not on sp. 		 	
++*/
++static inline void
++qla2x00_callback(scsi_qla_host_t *ha, Scsi_Cmnd *cmd)
++{
++	srb_t *sp = (srb_t *) CMD_SP(cmd);
++	scsi_qla_host_t *vis_ha;
++	os_lun_t *lq;
++	int got_sense;
++	unsigned long	cpu_flags = 0;
++
++	ENTER(__func__);
++
++	CMD_HANDLE(cmd) = (unsigned char *) NULL;
++	vis_ha = (scsi_qla_host_t *) cmd->device->host->hostdata;
++
++	if (sp == NULL) {
++		printk(KERN_INFO
++			"%s(): **** CMD derives a NULL SP\n",
++			__func__);
++                DEBUG2(BUG();)
++		return;
++	}
++
++	/*
++	 * If command status is not DID_BUS_BUSY then go ahead and freed sp.
++	 */
++	/*
++	 * Cancel command timeout
++	 */
++	qla2x00_delete_timer_from_cmd(sp);
++
++	/*
++	 * Put SP back in the free queue
++	 */
++	sp->cmd   = NULL;
++	CMD_SP(cmd) = NULL;
++	lq = sp->lun_queue;
++	got_sense = (sp->flags & SRB_GOT_SENSE)? 1: 0;
++	add_to_free_queue(vis_ha, sp);
++
++	if ((CMD_RESULT(cmd)>>16) == DID_OK) {
++		/* device ok */
++		ha->total_bytes += cmd->bufflen;
++		if (!got_sense) {
++			/* If lun was suspended then clear retry count */
++			spin_lock_irqsave(&lq->q_lock, cpu_flags);
++			if (!test_bit(LUN_EXEC_DELAYED, &lq->q_flag))
++				lq->q_state = LUN_STATE_READY;
++			spin_unlock_irqrestore(&lq->q_lock, cpu_flags);
++		}
++	} else if ((CMD_RESULT(cmd)>>16) == DID_ERROR) {
++		/* device error */
++		ha->total_dev_errs++;
++	}
++
++	if (cmd->flags & IS_RESETTING) {
++		CMD_RESULT(cmd) = (int)DID_RESET << 16;
++	}
++
++	/* Call the mid-level driver interrupt handler */
++	(*(cmd)->scsi_done)(cmd);
++
++	LEAVE(__func__);
++}
++
++static inline void 
++qla2x00_delete_from_done_queue(scsi_qla_host_t *dest_ha, srb_t *sp) 
++{
++	/* remove command from done list */
++	list_del_init(&sp->list);
++	dest_ha->done_q_cnt--;
++	sp->state = SRB_NO_QUEUE_STATE;
++
++	if (sp->flags & SRB_DMA_VALID) {
++		sp->flags &= ~SRB_DMA_VALID;
++
++		/* Release memory used for this I/O */
++		if (sp->cmd->use_sg) {
++			pci_unmap_sg(dest_ha->pdev,
++					sp->cmd->request_buffer,
++					sp->cmd->use_sg,
++					scsi_to_pci_dma_dir(
++						sp->cmd->sc_data_direction));
++		} else if (sp->cmd->request_bufflen) {
++			pci_unmap_page(dest_ha->pdev,
++					sp->saved_dma_handle,
++					sp->cmd->request_bufflen,
++					scsi_to_pci_dma_dir(
++						sp->cmd->sc_data_direction));
++		}
++	}
++}
++
++static int qla2x00_do_dpc(void *data);
++static uint8_t qla2x00_check_for_devices_online(scsi_qla_host_t *);
++
++static void qla2x00_rst_aen(scsi_qla_host_t *);
++static void qla2x00_done_work(void *);
++
++static void qla2x00_process_failover(scsi_qla_host_t *);
++
++static uint8_t qla2x00_mem_alloc(scsi_qla_host_t *);
++static void qla2x00_mem_free(scsi_qla_host_t *ha);
++uint8_t qla2x00_allocate_sp_pool( scsi_qla_host_t *ha);
++void qla2x00_free_sp_pool(scsi_qla_host_t *ha);
++
++
++static int apidev_init(struct Scsi_Host *);
++static int apidev_cleanup(void);
++static int apidev_open(struct inode *, struct file *);
++static int apidev_close(struct inode *, struct file *);
++static int apidev_ioctl(struct inode *,
++    struct file *, unsigned int, unsigned long arg);
++
++/*************************************************************************
++*   qla2x00_set_info
++*
++* Description:
++*   Set parameters for the driver from the /proc filesystem.
++*
++* Returns:
++*************************************************************************/
++int
++qla2x00_set_info(char *buffer, int length, struct Scsi_Host *shost)
++{
++	return (-ENOSYS);  /* Currently this is a no-op */
++}
++
++/**************************************************************************
++* qla2x00_detect
++*
++* Description:
++*    This routine will probe for Qlogic FC SCSI host adapters.
++*    It returns the number of host adapters of a particular
++*    type that were found.	 It also initialize all data necessary for
++*    the driver.  It is passed-in the host number, so that it
++*    knows where its first entry is in the scsi_hosts[] array.
++*
++* Input:
++*     template - pointer to SCSI template
++*
++* Returns:
++*  num - number of host adapters found.
++**************************************************************************/
++int
++qla2x00_detect(Scsi_Host_Template *template)
++{
++#if defined(MODULE)
++	DEBUG2(printk("DEBUG: qla2x00_set_info() starts at address = %p\n",
++	    qla2x00_set_info));
++	printk(KERN_INFO
++	    "qla2x00_set_info() starts at address = %p\n",
++	    qla2x00_set_info);
++
++	/*
++	 * If we are called as a module, the qla2100 pointer may not be null
++	 * and it would point to our bootup string, just like on the lilo
++	 * command line.  IF not NULL, then process this config string with
++	 * qla2x00_setup
++	 *
++	 * Boot time Options To add options at boot time add a line to your
++	 * lilo.conf file like:
++	 * append="qla2100=verbose,tag_info:{{32,32,32,32},{32,32,32,32}}"
++	 * which will result in the first four devices on the first two
++	 * controllers being set to a tagged queue depth of 32.
++	 */
++	if (ql2xopts)
++		qla2x00_setup(ql2xopts);
++	if (dummy_buffer[0] != 'P')
++		printk(KERN_WARNING
++		    "qla2x00: Please read the file "
++		    "/usr/src/linux/drivers/scsi/README.qla2x00\n"
++		    "qla2x00: to see the proper way to specify options to "
++		    "the qla2x00 module\n"
++		    "qla2x00: Specifically, don't use any commas when passing "
++		    "arguments to\n"
++		    "qla2x00: insmod or else it might trash certain memory "
++		    "areas.\n");
++#endif
++
++	rwlock_init(&qla_hostlist_lock);
++	INIT_LIST_HEAD(&qla_hostlist);
++
++	pci_module_init(&qla_pci_driver);
++
++	return (num_hosts);
++}
++
++/**************************************************************************
++*   qla2x00_register_with_Linux
++*
++* Description:
++*   Free the passed in Scsi_Host memory structures prior to unloading the
++*   module.
++*
++* Input:
++*     ha - pointer to host adapter structure
++*     maxchannels - MAX number of channels.
++*
++* Returns:
++*  0 - Sucessfully reserved resources.
++*  1 - Failed to reserved a resource.
++**************************************************************************/
++static uint8_t
++qla2x00_register_with_Linux(scsi_qla_host_t *ha, uint8_t maxchannels)
++{
++	struct Scsi_Host *host = ha->host;
++
++	host->can_queue = max_srbs;  /* default value:-MAX_SRBS(4096)  */
++	host->cmd_per_lun = 3;
++	host->max_cmd_len = MAX_CMDSZ;
++
++#if defined (CONFIG_SCSIFCHOTSWAP) || defined(CONFIG_GAMAP)
++	host->hostt->get_scsi_info_from_wwn = qla2x00_get_scsi_info_from_wwn;
++	host->hostt->get_wwn_from_scsi_info = qla2x00_get_wwn_from_scsi_info;
++#endif /* CONFIG_SCSIFCHOTSWAP || CONFIG_GAMAP */
++
++	host->n_io_port = 0xFF;
++
++#if MEMORY_MAPPED_IO
++	host->base = (unsigned long)ha->mmpbase;
++#else
++	host->base = 0;
++#endif
++
++	host->max_channel = maxchannels;
++	host->max_lun = ha->max_luns;
++	host->unique_id = ha->instance;
++	host->max_id = ha->max_targets;
++
++	/* set our host ID  (need to do something about our two IDs) */
++	host->this_id = 255;
++
++#if defined(CONFIG_MD_MULTIHOST_FC)
++	{
++		unsigned long   i;
++		unsigned long   j;
++
++		union {
++			__u64   identifier;
++			char    wwn[WWN_SIZE];
++		} foo;
++
++		for (i = 0, j = WWN_SIZE-1; i < WWN_SIZE; i++, j--) {
++			foo.wwn[i] = ha->init_cb->port_name[j];
++		}
++
++		host->fc_wwn = foo.identifier;
++	}
++#endif /* CONFIG_MD_MULTIHOST_FC */
++
++	/* Register the I/O space with Linux */
++	if (request_region(host->io_port, 0xff, DRIVER_NAME) == 0) {
++		printk(KERN_WARNING
++		    "scsi(%ld): Failed to reserved i/o base region "
++		    "0x%04lx-0x%04lx already in use\n",
++		    ha->host_no,
++		    host->io_port, host->io_port + 0xff);
++		return 1;
++	}
++
++	/* Register the IRQ with Linux (sharable) */
++	if (request_irq(host->irq, qla2x00_intr_handler,
++	    SA_INTERRUPT|SA_SHIRQ, DRIVER_NAME, ha)) {
++		printk(KERN_WARNING
++		    "scsi(%ld): Failed to reserve interrupt %d already in "
++		    "use\n",
++		    ha->host_no, host->irq);
++		release_region(host->io_port, 0xff);
++		return 1;
++	}
++
++	/* Initialized the timer */
++	qla2x00_start_timer(ha, qla2x00_timer, WATCH_INTERVAL);
++
++	return 0;
++}
++
++
++/**************************************************************************
++*   qla2x00_release
++*
++* Description:
++*   Free the passed in Scsi_Host memory structures prior to unloading the
++*   module.
++*
++* Input:
++*     ha - pointer to host adapter structure
++*
++* Returns:
++*  0 - Always returns good status
++**************************************************************************/
++int
++qla2x00_release(struct Scsi_Host *host)
++{
++	scsi_qla_host_t *ha;
++
++	if (host != NULL) {
++		ha = (scsi_qla_host_t *)host->hostdata;
++		list_del(&ha->list);
++		qla2x00_free_device(ha);
++	}
++
++	if (list_empty(&qla_hostlist))
++		pci_unregister_driver(&qla_pci_driver);
++
++	return 0;
++}
++
++/**************************************************************************
++*   qla2x00_info
++*
++* Description:
++*
++* Input:
++*     host - pointer to Scsi host adapter structure
++*
++* Returns:
++*     Return a text string describing the driver.
++**************************************************************************/
++const char *
++qla2x00_info(struct Scsi_Host *host)
++{
++	static char qla2x00_buffer[255];
++	char *bp;
++	scsi_qla_host_t *ha;
++
++	/*
++	 * We must create the api node here instead of qla2x00_detect since we
++	 * want the api node to be subdirectory of /proc/scsi/qla2x00 which
++	 * will not have been created when qla2x00_detect exits, but which will
++	 * have been created by this point.
++	 */
++	apidev_init(host);
++
++	bp = &qla2x00_buffer[0];
++	ha = (scsi_qla_host_t *)host->hostdata;
++	memset(bp, 0, sizeof(qla2x00_buffer));
++
++	sprintf(bp,
++	    "QLogic %sPCI to Fibre Channel Host Adapter: bus %d device %d "
++	    "irq %d\n        Firmware version: %2d.%02d.%02d, "
++	    "Driver version %s\n",
++	    ha->brd_info->name,
++	    ha->pdev->bus->number,
++	    PCI_SLOT(ha->pdev->devfn),
++	    host->irq,
++	    ha->fw_major_version, 
++	    ha->fw_minor_version, 
++	    ha->fw_subminor_version,
++	    qla2x00_version_str);
++
++	return bp;
++}
++
++/**************************************************************************
++* qla2x00_queuecommand
++*
++* Description:
++*     Queue a command to the controller.
++*
++* Input:
++*     cmd - pointer to Scsi cmd structure
++*     fn - pointer to Scsi done function
++*
++* Returns:
++*   0 - Always
++*
++* Note:
++* The mid-level driver tries to ensures that queuecommand never gets invoked
++* concurrently with itself or the interrupt handler (although the
++* interrupt handler may call this routine as part of request-completion
++* handling).
++**************************************************************************/
++int
++qla2x00_queuecommand(Scsi_Cmnd *cmd, void (*fn)(Scsi_Cmnd *))
++{
++	fc_port_t	*fcport;
++	os_lun_t	*lq;
++	os_tgt_t	*tq;
++	scsi_qla_host_t	*ha, *ha2;
++	srb_t		*sp;
++	struct Scsi_Host *host;
++	uint32_t	b, t, l;
++#if  BITS_PER_LONG <= 32
++	uint32_t	handle;
++#else
++	u_long		handle;
++#endif
++
++	ENTER(__func__);
++
++	host = cmd->device->host;
++	ha = (scsi_qla_host_t *) host->hostdata;
++
++	cmd->scsi_done = fn;
++
++	spin_unlock(ha->host->host_lock);
++
++	/*
++	 * Allocate a command packet from the "sp" pool.  If we cant get back
++	 * one then let scsi layer come back later.
++	 */
++	if ((sp = qla2x00_get_new_sp(ha)) == NULL) {
++		printk(KERN_WARNING
++		    "scsi(%ld): Couldn't allocate memory for sp - retried.\n",
++		    ha->host_no);
++
++		spin_lock_irq(ha->host->host_lock);
++
++		LEAVE(__func__);
++		return (1);
++	}
++
++	sp->cmd = cmd;
++	CMD_SP(cmd) = (void *)sp;
++
++	sp->flags = 0;
++	if (CMD_RESID_LEN(cmd) & SRB_IOCTL) {
++		/* Need to set sp->flags */
++		sp->flags |= SRB_IOCTL;
++		CMD_RESID_LEN(cmd) = 0; /* Clear it since no more use. */
++	}
++
++	sp->fo_retry_cnt = 0;
++#if defined(IOCB_THROLLE_USAGE)
++	sp->iocb_cnt = 0;
++#endif
++
++	if (cmd->allowed < ql2xretrycount) {
++		cmd->allowed = ql2xretrycount;
++	}
++
++	/* Generate LU queue on bus, target, LUN */
++	b = SCSI_BUS_32(cmd);
++	t = SCSI_TCN_32(cmd);
++	l = SCSI_LUN_32(cmd);
++
++	/*
++	 * Start Command Timer. Typically it will be 2 seconds less than what
++	 * is requested by the Host such that we can return the IO before
++	 * aborts are called.
++	 */
++	if ((CMD_TIMEOUT(cmd)/HZ) > QLA_CMD_TIMER_DELTA)
++		qla2x00_add_timer_to_cmd(sp,
++		    (CMD_TIMEOUT(cmd)/HZ) - QLA_CMD_TIMER_DELTA);
++	else
++		qla2x00_add_timer_to_cmd(sp, (CMD_TIMEOUT(cmd)/HZ));
++
++	if (l >= ha->max_luns) {
++		CMD_RESULT(cmd) = DID_NO_CONNECT << 16;
++
++		spin_lock_irq(ha->host->host_lock);
++
++		__sp_put(ha, sp);
++		LEAVE(__func__);
++
++		return (0);
++	}
++
++	if ((tq = (os_tgt_t *) TGT_Q(ha, t)) != NULL &&
++		(lq = (os_lun_t *) LUN_Q(ha, t, l)) != NULL ) {
++
++		fcport = lq->fclun->fcport;
++		ha2 = fcport->ha;
++	} else {
++		lq = NULL;
++		fcport = NULL;
++		ha2 = ha;
++	}
++
++	/* Set an invalid handle until we issue the command to ISP */
++	/* then we will set the real handle value.                 */
++	handle = INVALID_HANDLE;
++	CMD_HANDLE(cmd) = (unsigned char *)handle;
++
++	/* Bookkeeping information */
++	sp->r_start = jiffies;       /* time the request was recieved */
++	sp->u_start = 0;
++
++	/* Setup device queue pointers. */
++	sp->tgt_queue = tq;
++	sp->lun_queue = lq;
++
++	/*
++	 * NOTE : q is NULL
++	 *
++	 * 1. When device is added from persistent binding but has not been
++	 *    discovered yet.The state of loopid == PORT_AVAIL.
++	 * 2. When device is never found on the bus.(loopid == UNUSED)
++	 *
++	 * IF Device Queue is not created, or device is not in a valid state
++	 * and link down error reporting is enabled, reject IO.
++	 */
++	if (fcport == NULL) {
++		DEBUG3(printk("scsi(%ld:%2d:%2d): port unavailable\n",
++		    ha->host_no,t,l));
++
++		CMD_RESULT(cmd) = DID_NO_CONNECT << 16;
++
++		spin_lock_irq(ha->host->host_lock);
++
++		__sp_put(ha, sp);
++
++		return (0);
++	}
++
++	DEBUG5(printk("scsi(%ld:%2d:%2d): (queuecmd) queue sp = %p, "
++	    "flags=0x%x fo retry=%d, pid=%ld, cmd flags= 0x%x\n",
++	    ha->host_no,
++	    t, l,
++	    sp, sp->flags, sp->fo_retry_cnt,
++	    cmd->serial_number,cmd->flags));
++	DEBUG5(qla2x00_print_scsi_cmd(cmd));
++
++	sp->flags &= ~SRB_ISP_COMPLETED;
++
++	sp->fclun = lq->fclun;
++	sp->ha = ha2;
++
++	sp->cmd_length = CMD_CDBLEN(cmd);
++
++	if (cmd->sc_data_direction == SCSI_DATA_UNKNOWN &&
++	    cmd->request_bufflen != 0) {
++
++		DEBUG2(printk(KERN_WARNING
++		    "scsi(%ld): Incorrect data direction - transfer "
++		    "length=%d, direction=%d, pid=%ld, opcode=%x\n",
++		    ha->host_no,
++		    cmd->request_bufflen,
++		    cmd->sc_data_direction,
++		    cmd->serial_number,
++		    cmd->cmnd[0]));
++	}
++
++	/* Final pre-check */
++	if (atomic_read(&fcport->state) == FC_DEVICE_DEAD) {
++		/*
++		 * Add the command to the done-queue for later failover
++		 * processing
++		 */
++		CMD_RESULT(cmd) = DID_NO_CONNECT << 16;
++		add_to_done_queue(ha, sp);
++		schedule_work(&ha->run_qla_task);
++
++		spin_lock_irq(ha->host->host_lock);
++		return (0);
++	}
++
++	add_to_pending_queue(ha, sp);
++
++	/* First start cmds for this lun if possible */
++	qla2x00_next(ha);
++
++	spin_lock_irq(ha->host->host_lock);
++
++	LEAVE(__func__);
++	return (0);
++}
++
++/*
++ * qla2x00_eh_wait_on_command
++ *    Waits for the command to be returned by the Firmware for some
++ *    max time.
++ *
++ * Input:
++ *    ha = actual ha whose done queue will contain the command
++ *	      returned by firmware.
++ *    cmd = Scsi Command to wait on.
++ *    flag = Abort/Reset(Bus or Device Reset)
++ *
++ * Return:
++ *    Not Found : 0
++ *    Found : 1
++ */
++static int
++qla2x00_eh_wait_on_command(scsi_qla_host_t *ha, Scsi_Cmnd *cmd)
++{
++#define ABORT_WAIT_TIME	10 /* seconds */
++#define EH_ACTIVE       1  /* Error Handler Active */	
++
++	int		found = 0;
++	int		done = 0;
++	srb_t		*rp;
++	struct list_head *list, *temp;
++	u_long		cpu_flags = 0;
++	u_long		max_wait_time = ABORT_WAIT_TIME;
++
++	ENTER(__func__);
++
++	do {
++		/* Check on done queue */
++		if (!found) {
++			spin_lock_irqsave(&ha->list_lock, cpu_flags);
++			list_for_each_safe(list, temp, &ha->done_queue) {
++				rp = list_entry(list, srb_t, list);
++
++				/*
++				* Found command.  Just exit and wait for the
++				* cmd sent to OS.
++			 	*/
++				if (cmd == rp->cmd) {
++					found++;
++					DEBUG3(printk("%s: found in done "
++							"queue.\n", __func__);)
++					break;
++				}
++			}
++			spin_unlock_irqrestore(&ha->list_lock, cpu_flags);
++		}
++
++		/* Checking to see if its returned to OS */
++		rp = (srb_t *) CMD_SP(cmd);
++		if (rp == NULL ) {
++			done++;
++			break;
++		}
++
++		spin_unlock_irq(ha->host->host_lock);
++
++		set_current_state(TASK_INTERRUPTIBLE);
++		schedule_timeout(2*HZ);
++
++		spin_lock_irq(ha->host->host_lock);
++
++	} while ((max_wait_time--));
++
++	DEBUG2(if (done))
++	DEBUG2(printk("%s: found cmd=%p.\n", __func__, cmd);)
++
++	LEAVE(__func__);
++
++	return(done);
++}
++
++/**************************************************************************
++* qla2xxx_eh_abort
++*
++* Description:
++*    The abort function will abort the specified command.
++*
++* Input:
++*    cmd = Linux SCSI command packet to be aborted.
++*
++* Returns:
++*    Either SUCCESS or FAILED.
++*
++* Note:
++**************************************************************************/
++int
++qla2xxx_eh_abort(Scsi_Cmnd *cmd)
++{
++	int		i;
++	int		return_status = FAILED;
++	os_lun_t	*q;
++	scsi_qla_host_t *ha;
++	scsi_qla_host_t *vis_ha;
++	srb_t		*sp;
++	srb_t		*rp;
++	struct list_head *list, *temp;
++	struct Scsi_Host *host;
++	uint8_t		found = 0;
++	uint32_t	b, t, l;
++	unsigned long	flags;
++
++
++	ENTER("qla2xxx_eh_abort");
++
++	/* Get the SCSI request ptr */
++	sp = (srb_t *) CMD_SP(cmd);
++
++	/*
++	 * If sp is NULL, command is already returned.
++	 * sp is NULLed just before we call back scsi_done
++	 *
++	 */
++	if ((sp == NULL)) {
++		/* no action - we don't have command */
++		DEBUG(printk("qla2xxx_eh_abort: cmd already done sp=%p\n",sp);)
++		return(SUCCESS);
++	}
++	if (sp) {
++		DEBUG(printk("qla2xxx_eh_abort: refcount %i \n",
++		    atomic_read(&sp->ref_count));)
++	}
++
++	vis_ha = (scsi_qla_host_t *) cmd->device->host->hostdata;
++	vis_ha->eh_start=0;
++	if (vis_ha->flags.failover_enabled)
++		/* Get Actual HA pointer */
++		ha = (scsi_qla_host_t *)sp->ha;
++	else
++		ha = (scsi_qla_host_t *)cmd->device->host->hostdata;
++
++	host = ha->host;
++
++	/* Generate LU queue on bus, target, LUN */
++	b = SCSI_BUS_32(cmd);
++	t = SCSI_TCN_32(cmd);
++	l = SCSI_LUN_32(cmd);
++	q = GET_LU_Q(vis_ha, t, l);
++
++	/*
++	 * if no LUN queue then something is very wrong!!!
++	 */
++	if (q == NULL) {
++		printk(KERN_WARNING
++			"qla2x00: (%x:%x:%x) No LUN queue.\n", b, t, l);
++
++		/* no action - we don't have command */
++		return(FAILED);
++	}
++
++	DEBUG2(printk("scsi(%ld): ABORTing cmd=%p sp=%p jiffies = 0x%lx, "
++	    "timeout=%x, dpc_flags=%lx, vis_ha->dpc_flags=%lx\n",
++	    ha->host_no,
++	    cmd,
++	    sp,
++	    jiffies,
++	    CMD_TIMEOUT(cmd)/HZ,
++	    ha->dpc_flags,
++	    vis_ha->dpc_flags);)
++	DEBUG2(qla2x00_print_scsi_cmd(cmd));
++	DEBUG2(qla2x00_print_q_info(q);)
++
++	/* Search done queue */
++	spin_lock_irqsave(&ha->list_lock,flags);
++	list_for_each_safe(list, temp, &ha->done_queue) {
++		rp = list_entry(list, srb_t, list);
++
++		if (cmd != rp->cmd)
++			continue;
++
++		/*
++		 * Found command. No need to remove command from done list.
++		 * Just proceed to call done.
++		 */
++		return_status = SUCCESS;
++		found++;
++		qla2x00_delete_from_done_queue(ha, sp);
++
++		break;
++	} /* list_for_each_safe() */
++	spin_unlock_irqrestore(&ha->list_lock, flags);
++
++	/*
++	 * Return immediately if the aborted command was already in the done
++	 * queue
++	 */
++	if (found) {
++		printk(KERN_INFO "qla2xxx_eh_abort: Returning completed "
++			"command=%p sp=%p\n", cmd, sp);
++		__sp_put(ha, sp);
++		return (return_status);
++	}
++	
++
++	/*
++	 * See if this command is in the retry queue
++	 */
++	if (!found) {
++		DEBUG3(printk("qla2xxx_eh_abort: searching sp %p "
++		    "in retry queue.\n", sp);)
++
++		spin_lock_irqsave(&ha->list_lock, flags);
++		list_for_each_safe(list, temp, &ha->retry_queue) {
++			rp = list_entry(list, srb_t, list);
++
++			if (cmd != rp->cmd)
++				continue;
++
++
++			DEBUG2(printk("qla2xxx_eh_abort: found "
++			    "in retry queue. SP=%p\n", sp);)
++
++			__del_from_retry_queue(ha, rp);
++			CMD_RESULT(rp->cmd) = DID_ABORT << 16;
++			__add_to_done_queue(ha, rp);
++
++			return_status = SUCCESS;
++			found++;
++
++			break;
++
++		} /* list_for_each_safe() */
++		spin_unlock_irqrestore(&ha->list_lock, flags);
++	}
++
++	/*
++	 * Search failover queue
++	 */
++	if (ha->flags.failover_enabled) {
++		if (!found) {
++			DEBUG3(printk("qla2xxx_eh_abort: searching sp %p "
++					"in failover queue.\n", sp);)
++
++			spin_lock_irqsave(&ha->list_lock, flags);
++			list_for_each_safe(list, temp, &ha->failover_queue) {
++				rp = list_entry(list, srb_t, list);
++
++				if (cmd != rp->cmd)
++					continue;
++
++				DEBUG2(printk(KERN_WARNING
++						"qla2xxx_eh_abort: found "
++						"in failover queue. SP=%p\n",
++						sp);)
++
++				/* Remove srb from failover queue. */
++				__del_from_failover_queue(ha, rp);
++				CMD_RESULT(rp->cmd) = DID_ABORT << 16;
++				__add_to_done_queue(ha, rp);
++
++				return_status = SUCCESS;
++				found++;
++
++				break;
++
++			} /* list_for_each_safe() */
++			spin_unlock_irqrestore(&ha->list_lock, flags);
++		} /*End of if !found */
++	}
++
++	/*
++	 * Our SP pointer points at the command we want to remove from the
++	 * pending queue providing we haven't already sent it to the adapter.
++	 */
++	if (!found) {
++		DEBUG3(printk("qla2xxx_eh_abort: searching sp %p "
++		    "in pending queue.\n", sp);)
++
++		spin_lock_irqsave(&vis_ha->list_lock, flags);
++		list_for_each_safe(list, temp, &vis_ha->pending_queue) {
++			rp = list_entry(list, srb_t, list);
++			if (rp->cmd != cmd)
++				continue;
++
++			/* Remove srb from LUN queue. */
++			rp->flags |=  SRB_ABORTED;
++
++			DEBUG2(printk("qla2xxx_eh_abort: Cmd in pending queue."
++			    " serial_number %ld.\n",
++			    sp->cmd->serial_number);)
++
++			__del_from_pending_queue(vis_ha, rp);
++			CMD_RESULT(cmd) = DID_ABORT << 16;
++
++			__add_to_done_queue(vis_ha, rp);
++
++			return_status = SUCCESS;
++
++			found++;
++			break;
++		} /* list_for_each_safe() */
++		spin_unlock_irqrestore(&vis_ha->list_lock, flags);
++	} /*End of if !found */
++
++	if (!found) {  /* find the command in our active list */
++		DEBUG3(printk("qla2xxx_eh_abort: searching sp %p "
++		    "in outstanding queue.\n", sp);)
++
++		spin_lock_irqsave(&ha->hardware_lock, flags);
++		for (i = 1; i < MAX_OUTSTANDING_COMMANDS; i++) {
++			sp = ha->outstanding_cmds[i];
++
++			if (sp == NULL)
++				continue;
++
++			if (sp->cmd != cmd)
++				continue;
++
++
++			DEBUG2(printk("qla2xxx_eh_abort(%ld): aborting sp %p "
++			    "from RISC. pid=%d sp->state=%x\n",
++			    ha->host_no, 
++			    sp, 
++			    (int)sp->cmd->serial_number,
++			    sp->state);)
++			DEBUG(qla2x00_print_scsi_cmd(cmd);)
++			DEBUG(qla2x00_print_q_info(q);)
++
++			/* Get a reference to the sp and drop the lock.*/
++			sp_get(ha,sp);
++
++			spin_unlock_irqrestore(&ha->hardware_lock, flags);
++			spin_unlock(ha->host->host_lock);
++
++			if (qla2x00_abort_command(ha, sp)) {
++				DEBUG2(printk("qla2xxx_eh_abort: abort_command "
++				    "mbx failed.\n");)
++				return_status = FAILED;
++			} else {
++				DEBUG3(printk("qla2xxx_eh_abort: abort_command "
++				    " mbx success.\n");)
++				return_status = SUCCESS;
++			}
++
++			sp_put(ha,sp);
++
++			spin_lock_irq(ha->host->host_lock);
++			spin_lock_irqsave(&ha->hardware_lock, flags);
++
++			/*
++			 * Regardless of mailbox command status, go check on
++			 * done queue just in case the sp is already done.
++			 */
++			break;
++
++		}/*End of for loop */
++		spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++	} /*End of if !found */
++
++	  /*Waiting for our command in done_queue to be returned to OS.*/
++	if (qla2x00_eh_wait_on_command(ha, cmd) != 0) {
++		DEBUG2(printk("qla2xxx_eh_abort: cmd returned back to OS.\n");)
++		return_status = SUCCESS;
++	}
++
++	if (return_status == FAILED) {
++		printk(KERN_INFO "qla2xxx_eh_abort Exiting: status=Failed\n");
++		return FAILED;
++	}
++
++	DEBUG(printk("qla2xxx_eh_abort: Exiting. return_status=0x%x.\n",
++	    return_status));
++
++	LEAVE("qla2xxx_eh_abort");
++
++	return(return_status);
++}
++
++/**************************************************************************
++* qla2x00_eh_wait_for_pending_target_commands
++*
++* Description:
++*    Waits for all the commands to come back from the specified target.
++*
++* Input:
++*    ha - pointer to scsi_qla_host structure.
++*    t  - target 	
++* Returns:
++*    Either SUCCESS or FAILED.
++*
++* Note:
++**************************************************************************/
++int
++qla2x00_eh_wait_for_pending_target_commands(scsi_qla_host_t *ha, int t)
++{
++	int	cnt;
++	int	status;
++	unsigned long	flags;
++	srb_t		*sp;
++	Scsi_Cmnd	*cmd;
++
++	status = 0;
++
++	/*
++	 * Waiting for all commands for the designated target in the active
++	 * array
++	 */
++	for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) {
++		spin_lock_irqsave(&ha->hardware_lock, flags);
++		sp = ha->outstanding_cmds[cnt];
++		if (sp) {
++			cmd = sp->cmd;
++			spin_unlock_irqrestore(&ha->hardware_lock, flags);
++			if (SCSI_TCN_32(cmd) == t) {
++				qla2x00_eh_wait_on_command(ha, cmd);
++			}
++		}
++		else {
++			spin_unlock_irqrestore(&ha->hardware_lock, flags);
++		}
++	}
++	return (status);
++}
++
++
++/**************************************************************************
++* qla2xxx_eh_device_reset
++*
++* Description:
++*    The device reset function will reset the target and abort any
++*    executing commands.
++*
++*    NOTE: The use of SP is undefined within this context.  Do *NOT*
++*          attempt to use this value, even if you determine it is 
++*          non-null.
++*
++* Input:
++*    cmd = Linux SCSI command packet of the command that cause the
++*          bus device reset.
++*
++* Returns:
++*    SUCCESS/FAILURE (defined as macro in scsi.h).
++*
++**************************************************************************/
++int
++qla2xxx_eh_device_reset(Scsi_Cmnd *cmd)
++{
++	int		return_status = SUCCESS;
++	uint32_t	b, t, l;
++	scsi_qla_host_t	*ha;
++
++#if defined(LOGOUT_AFTER_DEVICE_RESET)
++	os_lun_t	*lq;
++	fc_port_t	*fcport;
++#endif
++
++	ENTER(__func__);
++
++	if (cmd == NULL) {
++		printk(KERN_INFO
++			"%s(): **** SCSI mid-layer passing in NULL cmd\n",
++			__func__);
++                DEBUG2(BUG();)
++
++		return (FAILED);
++	}
++
++	/* Verify the device exists. */
++	ha = (scsi_qla_host_t *)cmd->device->host->hostdata;
++	ha->eh_start = 0;
++	b = SCSI_BUS_32(cmd);
++	t = SCSI_TCN_32(cmd);
++	l = SCSI_LUN_32(cmd);
++	if (TGT_Q(ha, t) == NULL) {
++		printk(KERN_INFO
++			"%s(): **** CMD derives a NULL TGT_Q\n",
++			__func__);
++                DEBUG2(BUG();)
++
++		return (FAILED);
++	}
++
++	ha = (scsi_qla_host_t *)cmd->device->host->hostdata;
++
++#if STOP_ON_RESET
++	printk(debug_buff,"Resetting Device= 0x%x\n", (int)cmd);
++/* WE SHOULD NOT call this function, since it dereferences SP */
++ 	//qla2x00_print_scsi_cmd(cmd);
++	qla2x00_panic(__func__, ha->host);
++#endif
++
++	if (qla2x00_verbose)
++		printk(KERN_INFO
++			"scsi(%ld:%d:%d:%d): DEVICE RESET ISSUED.\n",
++			ha->host_no, (int)b, (int)t, (int)l);
++
++	DEBUG2(printk("scsi(%ld): DEVICE_RESET cmd=%p jiffies = 0x%lx, "
++		"timeout=%x, dpc_flags=%lx, status=%x allowed=%d "
++		"cmd.state=%x\n",
++		ha->host_no,
++		cmd,
++		jiffies,
++		CMD_TIMEOUT(cmd)/HZ,
++		ha->dpc_flags,
++		cmd->result,
++		cmd->allowed,
++		cmd->state);)
++/* WE SHOULD NOT call this function, since it dereferences SP */
++	//qla2x00_print_scsi_cmd(cmd);
++
++	if (!((test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) ||
++		(test_bit(LOOP_RESET_NEEDED, &ha->dpc_flags)) ||
++		(test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) ||
++		(!atomic_read(&ha->loop_down_timer) &&
++		 ha->loop_state == LOOP_DOWN)||
++		test_bit(CFG_ACTIVE, &ha->cfg_flags) ||
++		ha->loop_state != LOOP_READY)) {
++
++		clear_bit(DEVICE_RESET_NEEDED, &ha->dpc_flags);
++
++		spin_unlock_irq(ha->host->host_lock);
++
++		if (qla2x00_device_reset(ha, t, l) != 0) {
++			return_status = FAILED;
++		}
++
++#if defined(LOGOUT_AFTER_DEVICE_RESET)
++		if (return_status == SUCCESS) {
++			lq = (os_lun_t *)LUN_Q(ha, t, l);
++			fcport = lq->fclun->fcport;
++
++			if (fcport->flags & FC_FABRIC_DEVICE) {
++				qla2x00_fabric_logout(ha,
++						ha->fc_db[t].loop_id & 0xff);
++				ha->fc_db[t].flag |= DEV_RELOGIN;
++				qla2x00_mark_device_lost(ha, fcport);
++			}
++		}
++#endif
++
++		spin_lock_irq(ha->host->host_lock);
++	} else {
++		/*
++		 * Wait a while for the loop to come back. Return SUCCESS
++		 * for the kernel to try again.
++		 */
++		spin_unlock_irq(ha->host->host_lock);
++
++		set_current_state(TASK_INTERRUPTIBLE);
++		schedule_timeout(5 * HZ);
++
++		spin_lock_irq(ha->host->host_lock);
++
++		return_status = SUCCESS;
++	}
++
++	if (return_status == FAILED) {
++		DEBUG2(printk("%s() Exiting: Reset Failed\n", __func__);)
++		return (FAILED);
++	}
++
++	/* Waiting for all commands to complete for the device */
++	if (qla2x00_eh_wait_for_pending_target_commands(ha, t))
++		return_status = FAILED;
++
++	if (return_status == FAILED) {
++		printk(KERN_INFO "%s() Exiting: status = Failed\n", __func__);
++		return (FAILED);
++	}
++
++	LEAVE(__func__);
++
++	return (return_status);
++}
++
++/**************************************************************************
++* qla2x00_eh_wait_for_pending_commands
++*
++* Description:
++*    Waits for all the commands to come back from the specified host.
++*
++* Input:
++*    ha - pointer to scsi_qla_host structure.
++*
++* Returns:
++*    1 : SUCCESS
++*    0 : FAILED
++*
++* Note:
++**************************************************************************/
++int
++qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *ha)
++{
++	int	cnt;
++	int	status;
++	unsigned long	flags;
++	srb_t		*sp;
++	Scsi_Cmnd	*cmd;
++
++	status = 1;
++
++	/*
++	 * Waiting for all commands for the designated target in the active
++	 * array
++	 */
++	for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) {
++		spin_lock_irqsave(&ha->hardware_lock, flags);
++		sp = ha->outstanding_cmds[cnt];
++		if (sp) {
++			cmd = sp->cmd;
++			spin_unlock_irqrestore(&ha->hardware_lock, flags);
++				status = qla2x00_eh_wait_on_command(ha, cmd);
++		}
++		else {
++			spin_unlock_irqrestore(&ha->hardware_lock, flags);
++		}
++	}
++	return (status);
++}
++
++
++/**************************************************************************
++* qla2xxx_eh_bus_reset
++*
++* Description:
++*    The bus reset function will reset the bus and abort any executing
++*    commands.
++*
++* Input:
++*    cmd = Linux SCSI command packet of the command that cause the
++*          bus reset.
++*
++* Returns:
++*    SUCCESS/FAILURE (defined as macro in scsi.h).
++*
++**************************************************************************/
++int
++qla2xxx_eh_bus_reset(Scsi_Cmnd *cmd)
++{
++	int        return_status = SUCCESS;
++	uint32_t   b, t, l;
++	srb_t      *sp;
++	int	found;
++	struct list_head *hal;
++	scsi_qla_host_t *ha, *search_ha;
++
++
++	ENTER("qla2xxx_eh_bus_reset");
++
++	if (cmd == NULL) {
++		printk(KERN_INFO
++			"%s(): **** SCSI mid-layer passing in NULL cmd\n",
++			__func__);
++                DEBUG2(BUG();)
++
++		return (FAILED);
++	}
++
++	b = SCSI_BUS_32(cmd);
++	t = SCSI_TCN_32(cmd);
++	l = SCSI_LUN_32(cmd);
++
++	ha = (scsi_qla_host_t *) cmd->device->host->hostdata;
++	ha->eh_start=0;
++	sp = (srb_t *) CMD_SP(cmd);
++
++	if (ha == NULL) {
++		printk(KERN_INFO
++			"%s(): **** CMD derives a NULL HA\n",
++			__func__);
++                DEBUG2(BUG();)
++
++		return (FAILED);
++	}
++
++	found = 0;
++	read_lock(&qla_hostlist_lock);
++	list_for_each(hal, &qla_hostlist) {
++		search_ha = list_entry(hal, scsi_qla_host_t, list);
++
++		if (search_ha == ha) {
++			found ++;
++			break;
++		}
++	}
++	read_unlock(&qla_hostlist_lock);
++
++	if (!found) {
++		printk(KERN_INFO
++			"%s(): **** CMD derives a NULL search HA\n",
++			__func__);
++                DEBUG2(BUG();)
++
++		return (FAILED);
++	}
++
++#if  STOP_ON_RESET
++	printk("Resetting the Bus= 0x%x\n", (int)cmd);
++	qla2x00_print_scsi_cmd(cmd);
++	qla2x00_panic("qla2100_reset", ha->host);
++#endif
++
++	if (qla2x00_verbose)
++		printk(KERN_INFO
++			"scsi(%ld:%d:%d:%d): LOOP RESET ISSUED.\n",
++			ha->host_no, (int)b, (int)t, (int)l);
++
++	if (!((test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) ||
++		(test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) ||
++		(!atomic_read(&ha->loop_down_timer) &&
++		 ha->loop_state == LOOP_DOWN)||
++		test_bit(CFG_ACTIVE, &ha->cfg_flags) ||
++		ha->loop_state != LOOP_READY)) {
++
++		clear_bit(LOOP_RESET_NEEDED, &ha->dpc_flags);
++		spin_unlock_irq(ha->host->host_lock);
++
++		if (qla2x00_loop_reset(ha) != 0) {
++			return_status = FAILED;
++		}
++		spin_lock_irq(ha->host->host_lock);
++	} else {
++		/*
++		 * Wait a while for the loop to come back. Return SUCCESS
++		 * for the kernel to try again.
++		 */
++		spin_unlock_irq(ha->host->host_lock);
++
++		set_current_state(TASK_INTERRUPTIBLE);
++		schedule_timeout(5 * HZ);
++
++		spin_lock_irq(ha->host->host_lock);
++
++		return_status = SUCCESS;
++	}
++
++	if (return_status == FAILED) {
++		DEBUG2(printk("qla2xxx_eh_bus_reset Exiting: Reset Failed\n");)
++		printk("qla2xxx_eh_bus_reset Exiting: Reset Failed\n");
++		return FAILED;
++	}
++
++	/* Blocking Call. It goes to sleep waiting for cmd to get to done q */
++	 /* Waiting for our command in done_queue to be returned to OS.*/
++
++	if ( qla2x00_eh_wait_for_pending_commands(ha) == 0) {
++		return_status = FAILED;
++	}
++
++	if(return_status == FAILED) {
++		printk(KERN_INFO "qla2xxx_eh_bus_reset Exiting: status=Failed\n");
++		return FAILED;
++	} else
++		printk(KERN_INFO "qla2xxx_eh_bus_reset Exiting: status=SUCCESS\n");
++
++	LEAVE("qla2xxx_eh_bus_reset");
++
++	return (return_status);
++}
++
++/**************************************************************************
++* qla2xxx_eh_host_reset
++*
++* Description:
++*    The reset function will reset the Adapter.
++*
++* Input:
++*      cmd = Linux SCSI command packet of the command that cause the
++*            adapter reset.
++*
++* Returns:
++*      Either SUCCESS or FAILED.
++*
++* Note:
++**************************************************************************/
++int
++qla2xxx_eh_host_reset(Scsi_Cmnd *cmd)
++{
++	int		return_status = SUCCESS;
++	srb_t		*sp;
++	uint32_t        b, t, l;
++	int	found;
++	struct list_head *hal;
++	scsi_qla_host_t *ha, *search_ha;
++
++	ENTER("qla2xxx_eh_host_reset");
++
++	if (cmd == NULL) {
++		printk(KERN_INFO
++			"%s(): **** SCSI mid-layer passing in NULL cmd\n",
++			__func__);
++                DEBUG2(BUG();)
++
++		return (FAILED);
++	}
++
++	ha = (scsi_qla_host_t *)cmd->device->host->hostdata;
++	ha->eh_start= 0;
++	/* Find actual ha */
++	sp = (srb_t *)CMD_SP(cmd);
++	if (ha->flags.failover_enabled && sp != NULL)
++		ha = sp->ha;
++	else
++		ha = (scsi_qla_host_t *)cmd->device->host->hostdata;
++
++	if (ha == NULL) {
++		printk(KERN_INFO
++			"%s(): **** CMD derives a NULL HA\n",
++			__func__);
++                DEBUG2(BUG();)
++
++		return (FAILED);
++	}
++
++	found = 0;
++	read_lock(&qla_hostlist_lock);
++	list_for_each(hal, &qla_hostlist) {
++		search_ha = list_entry(hal, scsi_qla_host_t, list);
++
++		if (search_ha == ha) {
++			found ++;
++			break;
++		}
++	}
++	read_unlock(&qla_hostlist_lock);
++
++	if (!found) {
++		printk(KERN_INFO
++			"%s(): **** CMD derives a NULL search HA\n",
++			__func__);
++                DEBUG2(BUG();)
++
++		return (FAILED);
++	}
++
++	/* Display which one we're actually resetting for debug. */
++	DEBUG(printk("qla2xxx_eh_host_reset: entered for scsi%ld. "
++			"Resetting host_no %ld.\n", 
++			((scsi_qla_host_t *)cmd->device->host->hostdata)->host_no,
++			ha->host_no));
++
++#if  STOP_ON_RESET
++	printk("Host Reset...  Command=\n");
++	qla2x00_print_scsi_cmd(cmd);
++	qla2x00_panic("qla2xxx_eh_host_reset", ha->host);
++#endif
++
++	/*
++	 *  Now issue reset.
++	 */
++	b = SCSI_BUS_32(cmd);
++	t = SCSI_TCN_32(cmd);
++	l = SCSI_LUN_32(cmd);
++
++	if (qla2x00_verbose) {
++		printk(KERN_INFO
++			"scsi(%ld:%d:%d:%d): now issue ADAPTER RESET.\n",
++			((scsi_qla_host_t *)cmd->device->host->hostdata)->host_no,
++			(int)b, 
++			(int)t, 
++			(int)l);
++	}
++
++	DEBUG2(printk(KERN_INFO
++	    "scsi(%ld:%d:%d:%d): now issue ADAPTER RESET.\n",
++	    ((scsi_qla_host_t *)cmd->device->host->hostdata)->host_no,
++	    (int)b, (int)t, (int)l));
++
++	if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) {
++		set_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags);
++
++		spin_unlock_irq(ha->host->host_lock);
++
++		if (qla2x00_abort_isp(ha, 1)) {
++			/* failed. try later */
++			set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++			return_status = FAILED;
++
++			DEBUG2(printk(KERN_WARNING
++			    "scsi(%ld:%d:%d:%d): ha %ld ADAPTER RESET "
++			    "failed. Scheduled retry later.\n",
++			    ((scsi_qla_host_t *)cmd->device->host->hostdata)->host_no,
++			    (int)b, (int)t, (int)l, ha->host_no);)
++		} else {
++			return_status = SUCCESS;
++		}
++
++		spin_lock_irq(ha->host->host_lock);
++
++		clear_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags);
++	} else {
++		/*
++		 * Already active. Sleep a while then return SUCCESS for kernel
++		 * to retry the IO.
++		 */
++		spin_unlock_irq(ha->host->host_lock);
++
++		set_current_state(TASK_INTERRUPTIBLE);
++		schedule_timeout(5 * HZ);
++
++		spin_lock_irq(ha->host->host_lock);
++
++		return_status = SUCCESS;
++	}
++	if ( return_status == FAILED) {
++		DEBUG2(printk("qla2xxx_eh_host_reset Exiting: Reset Failed\n");)
++		return FAILED;
++	}
++
++	/* Waiting for our command in done_queue to be returned to OS.*/
++	if ( qla2x00_eh_wait_for_pending_commands(ha) == 0) {
++		return_status = FAILED;
++	}
++
++	if(return_status == FAILED) {
++		printk(KERN_INFO "qla2xxx_eh_host_reset Exiting: status=Failed\n");
++		return FAILED;
++	} else
++		printk(KERN_INFO "qla2xxx_eh_host_reset Exiting: status=SUCCESS\n");
++
++	LEAVE("qla2xxx_eh_host_reset");
++
++	return(return_status);
++}
++
++
++/*
++* qla2x00_loop_reset
++*      Issue loop reset.
++*
++* Input:
++*      ha = adapter block pointer.
++*
++* Returns:
++*      0 = success
++*/
++static uint8_t
++qla2x00_loop_reset(scsi_qla_host_t *ha)
++{
++	uint8_t  status = QL_STATUS_SUCCESS;
++	uint16_t t;
++	os_tgt_t        *tq;
++
++	ENTER(__func__);
++
++	if (ha->flags.enable_lip_reset) {
++		status = qla2x00_lip_reset(ha);
++	}
++
++	if (status == QL_STATUS_SUCCESS && ha->flags.enable_target_reset) {
++		for (t = 0; t < MAX_FIBRE_DEVICES; t++) {
++			if ((tq = TGT_Q(ha, t)) == NULL)
++				continue;
++
++			if (tq->vis_port == NULL)
++				continue;
++
++			status = qla2x00_target_reset(ha, 0, t);
++			if (status != QL_STATUS_SUCCESS) {
++				break;
++			}
++		}
++	}
++
++	if (status == QL_STATUS_SUCCESS &&
++		((!ha->flags.enable_target_reset && 
++		  !ha->flags.enable_lip_reset) ||
++		ha->flags.enable_lip_full_login)) {
++
++		status = qla2x00_full_login_lip(ha);
++	}
++
++	/* Issue marker command only when we are going to start the I/O */
++	ha->marker_needed = 1;
++
++	if (status) {
++		/* Empty */
++		DEBUG2_3(printk("%s(%ld): **** FAILED ****\n",
++				__func__,
++				ha->host_no);)
++	} else {
++		/* Empty */
++		DEBUG3(printk("%s(%ld): exiting normally.\n",
++				__func__,
++				ha->host_no);)
++	}
++
++	LEAVE(__func__);
++
++	return(status);
++}
++
++/*
++ * qla2x00_device_reset
++ *	Issue bus device reset message to the target.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	t = SCSI ID.
++ *	TARGET_QUEUE_LOCK must be released.
++ *	ADAPTER_STATE_LOCK must be released.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_device_reset(scsi_qla_host_t *vis_ha, uint16_t tgt, uint16_t lun)
++{
++#if !USE_ABORT_TGT
++	uint16_t	l;
++	fc_port_t	*fcport;
++#endif
++	os_lun_t	*lq;
++	uint8_t		status = 0;
++
++	ENTER(__func__);
++
++#if USE_ABORT_TGT
++	/* Abort Target command will clear Reservation */
++	lq = GET_LU_Q(vis_ha, tgt, lun);
++	if (lq && lq->fclun)
++		 status = qla2x00_abort_target(lq->fclun->fcport);
++#else
++	/* Abort Device command will not clear Reservation */
++	for (l = 0; l < MAX_LUNS; l++) {
++		lq = GET_LU_Q(vis_ha, tgt, l);
++		if (lq == NULL)
++			continue;
++
++		fcport = lq->fclun->fcport;
++		if (LOOP_RDY(fcport->ha)) {
++			qla2x00_abort_device(fcport->ha, 
++					fcport->loop_id,
++					lq->fclun->lun);
++		}
++	}
++#endif
++
++	LEAVE(__func__);
++
++	return( status );
++}
++
++/**************************************************************************
++* qla1200_biosparam
++*
++* Description:
++*   Return the disk geometry for the given SCSI device.
++**************************************************************************/
++int
++qla2x00_biosparam(struct scsi_device *sdev,
++    struct block_device *bdev, sector_t capacity, int geom[])
++{
++	int heads, sectors, cylinders;
++
++	heads = 64;
++	sectors = 32;
++	cylinders = (unsigned long)capacity / (heads * sectors);
++	if (cylinders > 1024) {
++		heads = 255;
++		sectors = 63;
++		cylinders = (unsigned long)capacity / (heads * sectors);
++	}
++
++	geom[0] = heads;
++	geom[1] = sectors;
++	geom[2] = cylinders;
++
++	return (0);
++}
++
++/**************************************************************************
++ * qla2x00_slave_configure
++ *   Determines the queue depth for a given device.  There are two ways
++ *   a queue depth can be obtained for a tagged queueing device.  One
++ *   way is the default queue depth which is determined by whether
++ *   If it is defined, then it is used
++ *   as the default queue depth.  Otherwise, we use either 4 or 8 as the
++ *   default queue depth (dependent on the number of hardware SCBs).
++ **************************************************************************/
++int
++qla2xxx_slave_configure(Scsi_Device * device)
++{
++	int queue_depth = 64;
++
++	if (device->tagged_supported) {
++#if defined(MODULE)
++		if (!(ql2xmaxqdepth == 0 || ql2xmaxqdepth > 256))
++			queue_depth = ql2xmaxqdepth;
++#endif 
++		ql2xmaxqdepth = queue_depth;
++
++		scsi_adjust_queue_depth(device, MSG_ORDERED_TAG, queue_depth);
++
++		printk(KERN_INFO
++		    "scsi(%d:%d:%d:%d): Enabled tagged queuing, queue "
++		    "depth %d.\n",
++		    device->host->host_no,
++		    device->channel, device->id, device->lun,
++		    device->queue_depth);
++	} else {
++		 scsi_adjust_queue_depth(device, 0 /* TCQ off */,
++		     device->host->hostt->cmd_per_lun /* 3 */);
++	}
++
++	return (0);
++}
++
++/*
++ * PCI driver interface
++ */
++static int __devinit
++qla_probe_device(struct pci_dev *pdev, const struct pci_device_id *ent)
++{
++	device_reg_t	*reg;
++	struct Scsi_Host *host;
++	scsi_qla_host_t *ha;
++	unsigned long		flags = 0;
++	unsigned long		wait_switch = 0;
++
++	if (pci_enable_device(pdev))
++		return -1;
++
++	printk(KERN_INFO
++	    "qla2x00: Found VID=%x DID=%x SSVID=%x SSDID=%x\n",
++	    pdev->vendor, pdev->device,
++	    pdev->subsystem_vendor, pdev->subsystem_device);
++
++	if (ql2xfailover) {
++		sprintf(qla2x00_version_str, "%s-fo", QLA2100_VERSION);
++	} else {
++		sprintf(qla2x00_version_str, "%s", QLA2100_VERSION);
++	}
++
++	host = scsi_register(&qla2x00_driver_template, sizeof(scsi_qla_host_t));
++	if (host == NULL) {
++		printk(KERN_WARNING
++		    "qla2x00: Couldn't register with scsi layer!\n");
++		return -1;
++	}
++
++	/* Clear our data area */
++	ha = (scsi_qla_host_t *)host->hostdata;
++	memset(ha, 0, sizeof(scsi_qla_host_t));
++
++	ha->host_no = host->host_no;
++	ha->host = host;
++
++	/* Sanitize the information from PCI BIOS. */
++	host->irq = pdev->irq;
++	host->io_port = pci_resource_start(pdev, 0);
++	ha->pdev = pdev;
++	scsi_set_device(host, &pdev->dev);
++
++	ha->brd_info = (struct qla_board_info *)ent->driver_data;
++
++	if (qla2x00_verbose) {
++		printk(KERN_INFO
++		    "scsi(%d): Found a %s @ bus %d, device 0x%x, irq %d, "
++		    "iobase 0x%lx\n",
++		    host->host_no,
++		    ha->brd_info->name,
++		    ha->pdev->bus->number,
++		    PCI_SLOT(ha->pdev->devfn),
++		    host->irq, host->io_port);
++	}
++
++	ha->iobase = (device_reg_t *) host->io_port;
++
++	spin_lock_init(&ha->hardware_lock);
++
++	/* 4.23 Initialize /proc/scsi/qla2x00 counters */
++	ha->actthreads = 0;
++	ha->qthreads   = 0;
++	ha->dump_done  = 0;
++	ha->total_isr_cnt = 0;
++	ha->total_isp_aborts = 0;
++	ha->total_lip_cnt = 0;
++	ha->total_dev_errs = 0;
++	ha->total_ios = 0;
++	ha->total_bytes = 0;
++
++	if (qla2x00_mem_alloc(ha)) {
++		printk(KERN_WARNING
++		    "scsi(%d): [ERROR] Failed to allocate memory for adapter\n",
++		    host->host_no);
++
++		qla2x00_mem_free(ha);
++
++		scsi_unregister(host);
++
++		return -1;
++	}
++
++	ha->prev_topology = 0;
++	ha->ports = MAX_BUSES;
++
++#if defined(ISP2100)
++	ha->max_targets = MAX_TARGETS_2100;
++#else
++	ha->max_targets = MAX_TARGETS_2200;
++#endif
++
++	/* load the F/W, read paramaters, and init the H/W */
++	ha->instance = num_hosts;
++
++	init_MUTEX_LOCKED(&ha->mbx_intr_sem);
++
++	INIT_LIST_HEAD(&ha->list);
++	INIT_LIST_HEAD(&ha->fcports);
++	INIT_LIST_HEAD(&ha->fcinitiators);
++	INIT_LIST_HEAD(&ha->done_queue);
++	INIT_LIST_HEAD(&ha->retry_queue);
++	INIT_LIST_HEAD(&ha->scsi_retry_queue);
++	INIT_LIST_HEAD(&ha->failover_queue);
++	INIT_LIST_HEAD(&ha->pending_queue);
++
++	if (ql2xfailover)
++		ha->flags.failover_enabled = 1;
++	else
++		ha->flags.failover_enabled = 0;
++
++	INIT_WORK(&ha->run_qla_task, qla2x00_done_work, (void *) ha);
++
++	/*
++	 * These locks are used to prevent more than one CPU
++	 * from modifying the queue at the same time. The
++	 * higher level "io_request_lock" will reduce most
++	 * contention for these locks.
++	 */
++	spin_lock_init(&ha->mbx_bits_lock);
++	spin_lock_init(&ha->mbx_reg_lock);
++	spin_lock_init(&ha->mbx_q_lock);
++	spin_lock_init(&ha->list_lock);
++
++	if (qla2x00_initialize_adapter(ha) &&
++	    !(ha->device_flags & DFLG_NO_CABLE)) {
++
++		printk(KERN_WARNING
++		    "scsi(%ld): Failed to initialize adapter\n", ha->host_no);
++
++		DEBUG2(printk("scsi(%ld): Failed to initialize adapter - "
++		    "Adapter flags %x.\n",
++		    ha->host_no, ha->device_flags));
++
++		qla2x00_mem_free(ha);
++
++		scsi_unregister(host);
++
++		return -1;
++	}
++
++	/*
++	 * Startup the kernel thread for this host adapter
++	 */
++	init_completion(&ha->dpc_inited);
++	init_completion(&ha->dpc_exited);
++
++	ha->dpc_should_die = 0;
++	ha->dpc_pid = kernel_thread(qla2x00_do_dpc, ha, 0);
++	if (ha->dpc_pid < 0) {
++		printk(KERN_WARNING
++		    "scsi(%ld): Unable to start DPC thread!\n", ha->host_no);
++
++		qla2x00_mem_free(ha);
++
++		scsi_unregister(host);
++
++		return -1;
++	}
++	wait_for_completion(&ha->dpc_inited);
++
++	/*  Mark preallocated Loop IDs in use. */
++	ha->fabricid[SNS_FL_PORT].in_use = TRUE;
++	ha->fabricid[FABRIC_CONTROLLER].in_use = TRUE;
++	ha->fabricid[SIMPLE_NAME_SERVER].in_use = TRUE;
++
++	/* Register our resources with Linux */
++	if (qla2x00_register_with_Linux(ha, ha->ports - 1)) {
++		printk(KERN_WARNING
++		    "scsi(%ld): Failed to register resources.\n",
++		    ha->host_no);
++
++		qla2x00_mem_free(ha);
++
++		scsi_unregister(host);
++
++		return -1;
++	}
++
++	DEBUG2(printk("DEBUG: detect hba %ld at address = %p\n",
++	    ha->host_no, ha));
++
++	reg = ha->iobase;
++
++	/* Disable ISP interrupts. */
++	qla2x00_disable_intrs(ha);
++
++	/* Ensure mailbox registers are free. */
++	spin_lock_irqsave(&ha->hardware_lock, flags);
++	WRT_REG_WORD(&reg->semaphore, 0);
++	WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
++	WRT_REG_WORD(&reg->hccr, HCCR_CLR_HOST_INT);
++
++	/* Enable proper parity */
++#if defined(ISP2300)
++	if (ha->pdev->device == QLA2312_DEVICE_ID ||
++	    ha->pdev->device == QLA2322_DEVICE_ID)
++		/* SRAM, Instruction RAM and GP RAM parity */
++		WRT_REG_WORD(&reg->hccr, (HCCR_ENABLE_PARITY + 0x7));
++	else
++		/* SRAM parity */
++		WRT_REG_WORD(&reg->hccr, (HCCR_ENABLE_PARITY + 0x1));
++#endif
++	spin_unlock_irqrestore(&ha->hardware_lock, flags);
++
++	/*
++	 * if failover is enabled read the user configuration
++	 */
++	if (ha->flags.failover_enabled) {
++		if (ConfigRequired > 0)
++			mp_config_required = 1;
++		else
++			mp_config_required = 0;
++
++		DEBUG(printk("qla2x00_detect: qla2x00_cfg_init for hba %ld\n",
++		    ha->instance));
++
++		qla2x00_cfg_init(ha);
++	}
++
++	/* Enable chip interrupts. */
++	qla2x00_enable_intrs(ha);
++
++	/* Insert new entry into the list of adapters */
++	write_lock(&qla_hostlist_lock);
++	list_add_tail(&ha->list, &qla_hostlist);
++	write_unlock(&qla_hostlist_lock);
++
++	/* v2.19.5b6 */
++	/*
++	 * Wait around max loop_reset_delay secs for the devices to come
++	 * on-line. We don't want Linux scanning before we are ready.
++	 *
++	 */
++	for (wait_switch = jiffies + (ha->loop_reset_delay * HZ);
++	    time_before(jiffies,wait_switch) &&
++	     !(ha->device_flags & (DFLG_NO_CABLE | DFLG_FABRIC_DEVICES))
++	     && (ha->device_flags & SWITCH_FOUND) ;) {
++
++		qla2x00_check_fabric_devices(ha);
++
++		set_current_state(TASK_INTERRUPTIBLE);
++		schedule_timeout(5);
++	}
++
++	/* List the target we have found */
++	if (displayConfig && (!ha->flags.failover_enabled))
++		qla2x00_display_fc_names(ha);
++
++	pci_set_drvdata(pdev, ha);
++	ha->init_done = 1;
++	num_hosts++;
++
++ 	if (displayConfig && ha->flags.failover_enabled)
++		qla2x00_cfg_display_devices();
++
++	return 0;
++}
++
++static void __devexit
++qla_remove_device(struct pci_dev *pdev)
++{
++	struct list_head *hal, *temp;
++	scsi_qla_host_t *ha, *iter_ha;
++
++	ha = pci_get_drvdata(pdev);
++
++	/* Sanity check -- make sure the entry is in our list */
++	write_lock(&qla_hostlist_lock);
++	list_for_each_safe(hal, temp, &qla_hostlist) {
++		iter_ha = list_entry(hal, scsi_qla_host_t, list);
++						 
++		if (iter_ha == ha) {
++			list_del(&ha->list);
++			qla2x00_free_device(ha);
++			break;
++		}
++	}
++	write_unlock(&qla_hostlist_lock);
++}
++
++static void
++qla2x00_free_device(scsi_qla_host_t *ha)
++{
++	int ret;
++	struct Scsi_Host *host;
++
++	host = ha->host;
++
++	/* turn-off interrupts on the card */
++	if (ha->interrupts_on)
++		qla2x00_disable_intrs(ha);
++
++	/* Detach interrupts */
++	if (host->irq)
++		free_irq(host->irq, ha);
++
++	/* release io space registers  */
++	if (host->io_port)
++		release_region(host->io_port, 0xff);
++
++	/* Disable timer */
++	if (ha->timer_active)
++		qla2x00_stop_timer(ha);
++
++	/* Kill the kernel thread for this host */
++	if (ha->dpc_pid >= 0) {
++		ha->dpc_should_die = 1;
++		wmb();
++		ret = kill_proc(ha->dpc_pid, SIGTERM, 1);
++		if (ret) {
++			printk(KERN_ERR
++			    "scsi(%ld): Unable to signal DPC thread -- (%d)\n",
++			    ha->host_no, ret);
++
++			/* TODO: SOMETHING MORE??? */
++		} else {
++			wait_for_completion(&ha->dpc_exited);
++		}
++	}
++
++#if MEMORY_MAPPED_IO
++	if (ha->mmpbase) {
++		iounmap((void *) (((unsigned long) ha->mmpbase) & PAGE_MASK));
++	}
++#endif
++
++	apidev_cleanup();
++
++	qla2x00_mem_free(ha);
++
++	if (ha->flags.failover_enabled)
++		qla2x00_cfg_mem_free(ha);
++
++	ha->flags.online = FALSE;
++
++	scsi_unregister(host);
++}
++
++
++/*
++ * The following support functions are adopted to handle
++ * the re-entrant qla2x00_proc_info correctly.
++ */
++static void
++copy_mem_info(struct info_str *info, char *data, int len)
++{
++	if (info->pos + len > info->offset + info->length)
++		len = info->offset + info->length - info->pos;
++
++	if (info->pos + len < info->offset) {
++		info->pos += len;
++		return;
++	}
++ 
++	if (info->pos < info->offset) {
++		off_t partial;
++ 
++		partial = info->offset - info->pos;
++		data += partial;
++		info->pos += partial;
++		len  -= partial;
++	}
++ 
++	if (len > 0) {
++		memcpy(info->buffer, data, len);
++		info->pos += len;
++		info->buffer += len;
++	}
++}
++
++static int
++copy_info(struct info_str *info, char *fmt, ...)
++{
++	va_list args;
++	char buf[256];
++	int len;
++ 
++	va_start(args, fmt);
++	len = vsprintf(buf, fmt, args);
++	va_end(args);
++ 
++	copy_mem_info(info, buf, len);
++
++	return (len);
++}
++
++/*************************************************************************
++* qla2x00_proc_info
++*
++* Description:
++*   Return information to handle /proc support for the driver.
++*
++* inout : decides the direction of the dataflow and the meaning of the
++*         variables
++* buffer: If inout==FALSE data is being written to it else read from it
++*         (ptr to a page buffer)
++* *start: If inout==FALSE start of the valid data in the buffer
++* offset: If inout==FALSE starting offset from the beginning of all
++*         possible data to return.
++* length: If inout==FALSE max number of bytes to be written into the buffer
++*         else number of bytes in "buffer"
++* Returns:
++*         < 0:  error. errno value.
++*         >= 0: sizeof data returned.
++*************************************************************************/
++int
++qla2x00_proc_info(char *buffer,
++    char **start, off_t offset, int length, int hostno, int inout)
++{
++	struct Scsi_Host *host;
++	struct info_str	info;
++	int             i;
++	int             retval = -EINVAL;
++	os_lun_t	*up;
++	uint32_t        t, l;
++	uint32_t        tmp_sn;
++	unsigned long   *flags;
++	struct list_head *list, *temp;
++	unsigned long	cpu_flags;
++	uint8_t		*loop_state;
++#if REQ_TRACE
++	Scsi_Cmnd       *cp;
++	srb_t           *sp;
++#endif
++	int	found;
++	struct list_head *hal;
++	scsi_qla_host_t *ha;
++
++	DEBUG3(printk(KERN_INFO
++	    "Entering proc_info buff_in=%p, offset=0x%lx, length=0x%x, "
++	    "hostno=%d\n", buffer, offset, length, hostno);)
++
++	ha = NULL;
++	host = NULL;
++
++	/* Find the host that was specified */
++	found = 0;
++	read_lock(&qla_hostlist_lock);
++	list_for_each(hal, &qla_hostlist) {
++		ha = list_entry(hal, scsi_qla_host_t, list);
++
++		if (ha->host->host_no == hostno) {
++			found++;
++			break;
++		}
++	}
++	read_unlock(&qla_hostlist_lock);
++
++	/* if host wasn't found then exit */
++	if (!found) {
++		DEBUG2_3(printk(KERN_WARNING
++		    "%s: Can't find adapter for host number %d\n", 
++		    __func__, hostno);)
++
++		return (retval);
++	}
++
++	host = ha->host;
++
++	if (inout == TRUE) {
++		/* Has data been written to the file? */
++		DEBUG3(printk(
++		    "%s: has data been written to the file. \n",
++		    __func__);)
++		return (qla2x00_set_info(buffer, length, host));
++	}
++
++	if (start) {
++		*start = buffer;
++	}
++
++	info.buffer = buffer;
++	info.length = length;
++	info.offset = offset;
++	info.pos    = 0;
++
++	/* start building the print buffer */
++	copy_info(&info,
++	    "QLogic PCI to Fibre Channel Host Adapter for " ISP_NAME ":\n"
++	    "        Firmware version: %2d.%02d.%02d ",
++	    ha->fw_major_version, 
++	    ha->fw_minor_version, 
++	    ha->fw_subminor_version);
++
++	switch (ha->fw_attributes & 0xFF) {
++	case 0x7:
++		copy_info(&info, "EF");
++		break;
++	case 0x17:
++		copy_info(&info, "TP");
++		break;
++	case 0x37:
++		copy_info(&info, "IP");
++		break;
++	case 0x77:
++		copy_info(&info, "VI");
++		break;
++	default:
++		copy_info(&info, "(%x)", ha->fw_attributes);
++		break;
++	}
++	if (ha->fw_attributes & 0x100)
++		copy_info(&info, "X");
++	copy_info(&info, ", ");
++
++	copy_info(&info, "Driver version %s\n", qla2x00_version_str);
++
++	copy_info(&info, "Entry address = %p\n", qla2x00_set_info);
++
++	tmp_sn = ((ha->serial0 & 0x1f) << 16) | (ha->serial2 << 8) | 
++	    ha->serial1;
++	copy_info(&info, "HBA: %s, Serial# %c%05d\n",
++	    ha->brd_info->name, ('A' + tmp_sn/100000), (tmp_sn%100000));
++
++	copy_info(&info,
++	    "Request Queue = 0x%lx, Response Queue = 0x%lx\n",
++	    (long unsigned int)ha->request_dma,
++	    (long unsigned int)ha->response_dma);
++
++	copy_info(&info,
++	    "Request Queue count= %ld, Response Queue count= %ld\n",
++	    (long)REQUEST_ENTRY_CNT, (long)RESPONSE_ENTRY_CNT);
++
++	copy_info(&info,
++	    "Total number of active commands = %ld\n",
++	    ha->actthreads);
++
++	copy_info(&info,
++	    "Total number of interrupts = %ld\n",
++	    (long)ha->total_isr_cnt);
++
++#if defined(FC_IP_SUPPORT)
++	copy_info(&info,
++	    "Total number of active IP commands = %ld\n",
++	    ha->ipreq_cnt);
++#endif
++
++#if defined(IOCB_THROLLE_USAGE)
++#if defined(IOCB_HIT_RATE)
++	copy_info(&info,
++	    "Total number of IOCBs (used/max/#hit) "
++	    "= (%d/%d/%d)\n",
++	    (int)ha->iocb_cnt,
++	    (int)ha->iocb_hiwat,
++	    (int)ha->iocb_overflow_cnt);
++#else
++	copy_info(&info,
++	    "Total number of IOCBs (used/max) "
++	    "= (%d/%d)\n",
++	    (int)ha->iocb_cnt, (int)ha->iocb_hiwat);
++#endif
++#endif
++
++
++	copy_info(&info,
++	    "Total number of queued commands = %d\n",
++	    (max_srbs - ha->srb_cnt));
++
++	copy_info(&info,
++	    "    Device queue depth = 0x%x\n",
++	    (ql2xmaxqdepth == 0) ? 16 : ql2xmaxqdepth);
++
++	copy_info(&info,
++	    "Number of free request entries = %d\n", ha->req_q_cnt);
++
++	copy_info(&info,
++	    "Number of mailbox timeouts = %ld\n",
++	    qla2x00_stats.mboxtout);
++
++	copy_info(&info,
++	    "Number of ISP aborts = %ld\n",qla2x00_stats.ispAbort);
++
++	copy_info(&info,
++	    "Number of loop resyncs = %ld\n",
++	    qla2x00_stats.loop_resync);
++
++	copy_info(&info,
++	    "Number of retries for empty slots = %ld\n",
++	    qla2x00_stats.outarray_full);
++
++	copy_info(&info,
++	    "Number of reqs in pending_q= %ld, retry_q= %d, "
++	    "done_q= %ld, scsi_retry_q= %d\n",
++	    ha->qthreads, ha->retry_q_cnt,
++	    ha->done_q_cnt, ha->scsi_retry_q_cnt);
++
++	if (ha->flags.failover_enabled) {
++		copy_info(&info,
++		    "Number of reqs in failover_q= %d\n",
++		    ha->failover_cnt);
++	}
++
++	flags = (unsigned long *) &ha->flags;
++
++	if (ha->loop_state == LOOP_DOWN) {
++		loop_state = "DOWN";
++	} else if (ha->loop_state ==LOOP_UP) {
++		loop_state = "UP";
++	} else if (ha->loop_state ==LOOP_READY) {
++		loop_state = "READY";
++	} else if (ha->loop_state ==LOOP_TIMEOUT) {
++		loop_state = "TIMEOUT";
++	} else if (ha->loop_state ==LOOP_UPDATE) {
++		loop_state = "UPDATE";
++	} else {
++		loop_state = "UNKNOWN";
++	}
++
++	copy_info(&info, 
++	    "Host adapter:loop state= <%s>, flags= 0x%lx\n",
++	    loop_state , *flags);
++
++	copy_info(&info, "Dpc flags = 0x%lx\n", ha->dpc_flags);
++
++	copy_info(&info, "MBX flags = 0x%x\n", ha->mbx_flags);
++
++	copy_info(&info, "SRB Free Count = %d\n", ha->srb_cnt);
++
++	copy_info(&info, "Port down retry = %3.3d\n",
++	    ha->port_down_retry_count);
++
++	copy_info(&info, "Login retry count = %3.3d\n",
++	    ha->login_retry_count);
++
++	copy_info(&info,
++	    "Commands retried with dropped frame(s) = %d\n",
++	    ha->dropped_frame_error_cnt);
++
++	copy_info(&info, "\n");
++
++#if REQ_TRACE
++	if (qla2x00_req_dmp) {
++		copy_info(&info,
++		    "Outstanding Commands on controller:\n");
++
++		for (i = 1; i < MAX_OUTSTANDING_COMMANDS; i++) {
++			if ((sp = ha->outstanding_cmds[i]) == NULL) {
++				continue;
++			}
++
++			if ((cp = sp->cmd) == NULL) {
++				continue;
++			}
++
++			copy_info(&info, "(%d): Pid=%d, sp flags=0x%lx"
++			    ", cmd=0x%p, state=%d\n", 
++			    i, 
++			    (int)sp->cmd->serial_number, 
++			    (long)sp->flags,
++			    CMD_SP(sp->cmd),
++			    (int)sp->state);
++
++			if (info.pos >= info.offset + info.length) {
++				/* No need to continue */
++				goto profile_stop;
++			}
++		}
++	}
++#endif /* REQ_TRACE */
++
++	if (qla2x00_retryq_dmp) {
++		if (!list_empty(&ha->retry_queue)) {
++			copy_info(&info,
++			    "qla%ld: Retry queue requests:\n",
++			    ha->host_no);
++
++			spin_lock_irqsave(&ha->list_lock, cpu_flags);
++
++			i = 0;
++			list_for_each_safe(list, temp, &ha->retry_queue) {
++				sp = list_entry(list, srb_t, list);
++				t = SCSI_TCN_32(sp->cmd);
++				l = SCSI_LUN_32(sp->cmd);
++
++				copy_info(&info,
++				    "%d: target=%d, lun=%d, "
++				    "pid=%ld sp=%p, sp->flags=0x%x,"
++				    "sp->state= %d\n", 
++				    i, t, l, 
++				    sp->cmd->serial_number, sp, 
++				    sp->flags, sp->state );
++
++				i++;
++
++				if (info.pos >= info.offset + info.length) {
++					/* No need to continue */
++					goto profile_stop;
++				}
++			}
++
++			spin_unlock_irqrestore(&ha->list_lock, cpu_flags);
++
++		} /* if (!list_empty(&ha->retry_queue))*/
++	} /* if ( qla2x00_retryq_dmp )  */
++
++	/* 2.25 node/port display to proc */
++	/* Display the node name for adapter */
++	copy_info(&info, "\nSCSI Device Information:\n");
++	copy_info(&info,
++	    "scsi-qla%d-adapter-node="
++	    "%02x%02x%02x%02x%02x%02x%02x%02x;\n",
++	    (int)ha->instance,
++	    ha->init_cb->node_name[0],
++	    ha->init_cb->node_name[1],
++	    ha->init_cb->node_name[2],
++	    ha->init_cb->node_name[3],
++	    ha->init_cb->node_name[4],
++	    ha->init_cb->node_name[5],
++	    ha->init_cb->node_name[6],
++	    ha->init_cb->node_name[7]);
++
++	/* display the port name for adapter */
++	copy_info(&info,
++	    "scsi-qla%d-adapter-port="
++	    "%02x%02x%02x%02x%02x%02x%02x%02x;\n",
++	    (int)ha->instance,
++	    ha->init_cb->port_name[0],
++	    ha->init_cb->port_name[1],
++	    ha->init_cb->port_name[2],
++	    ha->init_cb->port_name[3],
++	    ha->init_cb->port_name[4],
++	    ha->init_cb->port_name[5],
++	    ha->init_cb->port_name[6],
++	    ha->init_cb->port_name[7]);
++
++	/* Print out device port names */
++	for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
++		if (ha->fc_db[i].loop_id == PORT_UNUSED) {
++			continue;
++		}
++
++		if (ha->flags.failover_enabled) {
++			copy_info(&info,
++			    "scsi-qla%d-port-%d="
++			    "%02x%02x%02x%02x%02x%02x%02x%02x:"
++			    "%02x%02x%02x%02x%02x%02x%02x%02x;\n",
++			    (int)ha->instance, i,
++			    ha->fc_db[i].name[0],
++			    ha->fc_db[i].name[1],
++			    ha->fc_db[i].name[2],
++			    ha->fc_db[i].name[3],
++			    ha->fc_db[i].name[4],
++			    ha->fc_db[i].name[5],
++			    ha->fc_db[i].name[6],
++			    ha->fc_db[i].name[7],
++			    ha->fc_db[i].wwn[0],
++			    ha->fc_db[i].wwn[1],
++			    ha->fc_db[i].wwn[2],
++			    ha->fc_db[i].wwn[3],
++			    ha->fc_db[i].wwn[4],
++			    ha->fc_db[i].wwn[5],
++			    ha->fc_db[i].wwn[6],
++			    ha->fc_db[i].wwn[7]);
++		} else {
++			copy_info(&info,
++			    "scsi-qla%d-target-%d="
++			    "%02x%02x%02x%02x%02x%02x%02x%02x;\n",
++			    (int)ha->instance, i,
++			    ha->fc_db[i].wwn[0],
++			    ha->fc_db[i].wwn[1],
++			    ha->fc_db[i].wwn[2],
++			    ha->fc_db[i].wwn[3],
++			    ha->fc_db[i].wwn[4],
++			    ha->fc_db[i].wwn[5],
++			    ha->fc_db[i].wwn[6],
++			    ha->fc_db[i].wwn[7]);
++		}
++
++	} /* 2.25 node/port display to proc */
++
++	copy_info(&info, "\nSCSI LUN Information:\n");
++
++	copy_info(&info, "(Id:Lun)\n");
++
++	/* scan for all equipment stats */
++	for (t = 0; t < MAX_FIBRE_DEVICES; t++) {
++		/* scan all luns */
++		for (l = 0; l < ha->max_luns; l++) {
++			up = (os_lun_t *) GET_LU_Q(ha, t, l);
++
++			if (up == NULL) {
++				continue;
++			}
++			if (up->fclun == NULL) {
++				continue;
++			}
++			if (up->fclun->flags & FC_DISCON_LUN) {
++				continue;
++			}
++
++			copy_info(&info,
++			    "(%2d:%2d): Total reqs %ld,",
++			    t,l,up->io_cnt);
++
++			copy_info(&info,
++			    " Pending reqs %ld,",
++			    up->out_cnt);
++
++			if (up->io_cnt < 3) {
++				copy_info(&info,
++				    " flags 0x%x*,",
++				    (int)up->q_flag);
++			} else {
++				copy_info(&info,
++				    " flags 0x%x,",
++				    (int)up->q_flag);
++			}
++
++			copy_info(&info, 
++			    " %ld:%d:%02x,",
++			    up->fclun->fcport->ha->instance,
++			    up->fclun->fcport->cur_path,
++			    up->fclun->fcport->loop_id);
++
++			copy_info(&info, "\n");
++
++			if (info.pos >= info.offset + info.length) {
++				/* No need to continue */
++				goto profile_stop;
++			}
++		}
++
++		if (info.pos >= info.offset + info.length) {
++			/* No need to continue */
++			break;
++		}
++	}
++
++profile_stop:
++
++	retval = info.pos > info.offset ? info.pos - info.offset : 0;
++
++	DEBUG3(printk(KERN_INFO 
++	    "Exiting proc_info: info.pos=%d, offset=0x%lx, "
++	    "length=0x%x\n", info.pos, offset, length);)
++
++#if QLA2100_LIPTEST
++	qla2x00_lip = 1;
++#endif
++
++	return (retval);
++}
++
++#if defined (CONFIG_SCSIFCHOTSWAP) || defined(CONFIG_GAMAP)
++union wwnmap {
++	unsigned long long wwn;
++	unsigned char wwn_u8[8];
++};
++
++int qla2x00_get_scsi_info_from_wwn (int mode,
++	unsigned long long wwn,
++	int *host,
++	int *channel,
++	int *lun,
++	int *id) {
++
++scsi_qla_host_t *list;
++Scsi_Device *scsi_device;
++union wwnmap wwncompare;
++union wwnmap wwncompare2;
++int i, j, k;
++
++	/*
++	 * Retrieve big endian version of world wide name
++	 */
++	wwncompare2.wwn = wwn;
++	for (j = 0, k=7; j < 8; j++, k--) {
++		wwncompare.wwn_u8[j] = wwncompare2.wwn_u8[k];
++	}
++
++	/*
++	 * query all hosts searching for WWN
++	 */
++	for (list = qla2x00_hostlist; list; list = list->next) {
++		for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
++			/*
++			 * Scan all devices in FibreChannel database
++			 * if WWN match found, return SCSI device information
++			 */
++			if (memcmp (wwncompare.wwn_u8, list->fc_db[i].name, 8) == 0) {
++				/*
++				 * If inserting, avoid scan for channel and lun information
++				 */
++				if (mode == 0) {
++					*channel = 0;
++					*lun = 0;
++					*host = list->host->host_no;
++					*id = i;
++					return (0);
++				}
++			
++
++				/*
++				 * WWN matches, find channel and lun information from scsi
++				 * device
++				 */
++				for (scsi_device = list->host->host_queue; scsi_device; scsi_device = scsi_device->next) {
++					if (scsi_device->id == i) {
++						*channel = scsi_device->channel;
++						*lun = scsi_device->lun;
++						break;
++					}
++				}
++				if (scsi_device == 0) {
++					return (-ENOENT);
++				}
++				/*
++				 * Device found, return all data
++				 */
++				*host = list->host->host_no;
++				*id = i;
++				return (0);
++			} /* memcmp */
++		} /* i < MAXFIBREDEVICES */
++	}
++	return (-ENOENT);
++}
++
++int qla2x00_get_wwn_from_scsi_info (int host, int id, unsigned long long *wwn) {
++scsi_qla_host_t *list;
++union wwnmap wwnendian;
++union wwnmap wwnendian2;
++int j, k;
++
++	/*
++	 * Examine all QLogic hosts
++	 */
++	for (list = qla2x00_hostlist; list; list = list->next) {
++		if (host == list->host->host_no) {
++			/*
++			 * Get endian corrected 64 bit WWN
++			 */
++
++			memcpy (&wwnendian2.wwn, list->fc_db[id].name, 8);
++			for (j = 0, k=7; j < 8; j++, k--) {
++				wwnendian.wwn_u8[j] = wwnendian2.wwn_u8[k];
++			}
++			*wwn = wwnendian.wwn;
++			return (0);
++		}
++	}
++	return (-ENOENT);
++}
++#endif /* CONFIG_SCSIFCHOTSWAP || CONFIG_GAMAP */
++
++/**************************************************************************
++*   qla2x00_setup
++*
++*   Handle Linux boot parameters. This routine allows for assigning a value
++*   to a parameter with a ';' between the parameter and the value.
++*   ie. qla2x00=arg0;arg1;...;argN;<properties .... properties>  OR
++*   via the command line.
++*   ie. qla2x00 ql2xopts=arg0;arg1;...;argN;<properties .... properties>
++**************************************************************************/
++#if !defined(MODULE)
++static int __init
++qla2x00_setup(char *s)
++#else
++void 
++qla2x00_setup(char *s)
++#endif	
++{
++	char		*cp, *np;
++	char		*slots[MAXARGS];
++	char		**argv = &slots[0];
++	static char	buf[LINESIZE];
++	int		argc, opts;
++
++#if !defined(MODULE)
++	if (s == NULL || *s == '\0')
++		return 0;
++#endif
++
++	/*
++	 * Determine if we have any properties.
++	 */
++	cp = s;
++	opts = 1;
++	while (*cp && (np = qla2x00_get_line(cp, buf)) != NULL) {
++		if (strncmp("scsi-qla",buf,8) == 0) {
++			DEBUG(printk("qla2100: devconf=%s\n",cp);)
++
++			ql2xdevconf = cp;
++			(opts > 0)? opts-- : 0;
++			break;
++		}
++		opts++;
++		cp = np;
++	}
++
++	/*
++	 * Parse the args before the properties
++	 */
++	if (opts) {
++		opts = (opts > MAXARGS-1)? MAXARGS-1: opts;
++		argc = qla2x00_get_tokens(s, argv, opts);
++		while (argc > 0) {
++			cp = *argv;
++			DEBUG(printk("scsi: found cmd arg =[%s]\n", cp));
++
++			if (strcmp(cp, "verbose") == 0) {
++				DEBUG(printk("qla2100: verbose\n"));
++				qla2x00_verbose++;
++			} else if (strcmp(cp, "quiet") == 0) {
++				qla2x00_quiet = 1;
++			} else if (strcmp(cp, "reinit_on_loopdown") == 0) {
++				qla2x00_reinit++;
++				DEBUG(printk("qla2100: reinit_on_loopdown\n"));
++			}
++			argc--, argv++;
++		}
++	}
++
++#if !defined(MODULE)
++	if (ql2xdevconf)
++		return 1;
++	else
++		return 0;
++#endif
++}
++
++#if !defined(MODULE)
++__setup("ql2xopts=", qla2x00_setup);
++#endif
++
++/********************** qla2x00_get_line *********************
++* qla2x00_get_line
++* Copy a substring from the specified string. The substring
++* consists of any number of chars seperated by white spaces (i.e. spaces)
++* and ending with a newline '\n' or a semicolon ';'.
++*
++* Enter:
++* str - orig string
++* line - substring
++*
++* Returns:
++*   cp - pointer to next string
++*     or
++*   null - End of string
++*************************************************************/
++static char *
++qla2x00_get_line(char *str, char *line) 
++{
++	register	char 	*cp = str;
++	register	char 	*sp = line;
++
++	/* skip preceeding spaces */
++	while (*cp && *cp == ' ')
++		++cp;
++	while ((*cp) && *cp != '\n' && *cp != ';')   /* end of line */
++		*sp++ = *cp++;
++
++	*sp = '\0';
++
++	DEBUG5(printk("%s(): %s\n", __func__, line));
++
++	if( (*cp) ) {
++		cp++;
++		return (cp);
++	}
++
++	return (NULL);
++}
++
++
++/**************************** get_tokens *********************
++* Parse command line into argv1, argv2, ... argvX
++* Arguments are seperated by white spaces and colons and end
++* with a NULL.
++*************************************************************/
++static int 
++qla2x00_get_tokens(char *line, char **argv, int maxargs) 
++{
++	register	char 	*cp = line;
++	int	count = 0;
++
++	while (*cp && count < maxargs) {
++		/* skip preceeding spaces */
++		while ((*cp) && *cp == ' ')
++			++cp;
++		/* symbol starts here */
++		argv[count++] = cp;
++		/* skip symbols */
++		while ((*cp) && !(*cp == ' ' || *cp == ';' || *cp == ':'))
++			cp++;
++		/* replace comma or space with a null */
++		if((*cp) && (*cp ==' ' ) && argv[count-1] != cp)
++			*cp++ = '\0';
++	}
++	return (count);
++}
++
++/*
++* qla2x00_display_fc_names
++*      This routine will the node names of the different devices found
++*      after port inquiry.
++*
++* Input:
++*      cmd = SCSI command structure
++*
++* Returns:
++*      None.
++*/
++static void
++qla2x00_display_fc_names(scsi_qla_host_t *ha) 
++{
++	uint16_t	tgt;
++	os_tgt_t	*tq;
++
++	/* Display the node name for adapter */
++	printk(KERN_INFO
++	    "scsi-qla%d-adapter-node=%02x%02x%02x%02x%02x%02x%02x%02x\\;\n",
++	    (int)ha->instance,
++	    ha->init_cb->node_name[0],
++	    ha->init_cb->node_name[1],
++	    ha->init_cb->node_name[2],
++	    ha->init_cb->node_name[3],
++	    ha->init_cb->node_name[4],
++	    ha->init_cb->node_name[5],
++	    ha->init_cb->node_name[6],
++	    ha->init_cb->node_name[7]);
++
++	/* display the port name for adapter */
++	printk(KERN_INFO
++	    "scsi-qla%d-adapter-port=%02x%02x%02x%02x%02x%02x%02x%02x\\;\n",
++	    (int)ha->instance,
++	    ha->init_cb->port_name[0],
++	    ha->init_cb->port_name[1],
++	    ha->init_cb->port_name[2],
++	    ha->init_cb->port_name[3],
++	    ha->init_cb->port_name[4],
++	    ha->init_cb->port_name[5],
++	    ha->init_cb->port_name[6],
++	    ha->init_cb->port_name[7]);
++
++	/* Print out device port names */
++	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++		if ((tq = ha->otgt[tgt]) == NULL)
++			continue;
++
++		if (tq->vis_port == NULL)
++			continue;
++
++		switch (ha->binding_type) {
++			case BIND_BY_PORT_NAME:
++				printk(KERN_INFO
++				    "scsi-qla%d-tgt-%d-di-0-port="
++				    "%02x%02x%02x%02x%02x%02x%02x%02x\\;\n",
++				    (int)ha->instance, 
++				    tgt,
++				    tq->port_name[0], 
++				    tq->port_name[1],
++				    tq->port_name[2], 
++				    tq->port_name[3],
++				    tq->port_name[4], 
++				    tq->port_name[5],
++				    tq->port_name[6], 
++				    tq->port_name[7]);
++
++				break;
++
++			case BIND_BY_PORT_ID:
++				printk(KERN_INFO
++				    "scsi-qla%d-tgt-%d-di-0-pid="
++				    "%02x%02x%02x\\;\n",
++				    (int)ha->instance,
++				    tgt,
++				    tq->d_id.b.domain,
++				    tq->d_id.b.area,
++				    tq->d_id.b.al_pa);
++				break;
++
++			case BIND_BY_NODE_NAME:
++				printk(KERN_INFO
++				    "scsi-qla%d-tgt-%d-di-0-node="
++				    "%02x%02x%02x%02x%02x%02x%02x%02x\\;\n",
++				    (int)ha->instance, 
++				    tgt,
++				    tq->node_name[0], 
++				    tq->node_name[1],
++				    tq->node_name[2], 
++				    tq->node_name[3],
++				    tq->node_name[4], 
++				    tq->node_name[5],
++				    tq->node_name[6], 
++				    tq->node_name[7]);
++				break;
++		}
++
++#if VSA
++		printk(KERN_INFO
++		    "scsi-qla%d-target-%d-vsa=01;\n", (int)ha->instance, tgt);
++#endif
++	}
++}
++
++/*
++ *  qla2x00_suspend_lun
++ *	Suspend lun and start port down timer
++ *
++ * Input:
++ *	ha = visable adapter block pointer.
++ *  lq = lun queue
++ *  cp = Scsi command pointer 
++ *  time = time in seconds
++ *  count = number of times to let time expire
++ *  delay_lun = non-zero, if lun should be delayed rather than suspended
++ *
++ * Return:
++ *     QL_STATUS_SUCCESS  -- suspended lun 
++ *     QL_STATUS_ERROR  -- Didn't suspend lun
++ *
++ * Context:
++ *	Interrupt context.
++ */
++uint8_t
++__qla2x00_suspend_lun(scsi_qla_host_t *ha,
++		os_lun_t *lq, int time, int count, int delay_lun)
++{
++	srb_t *sp;
++	struct list_head *list, *temp;
++	unsigned long flags;
++	uint8_t	status;
++
++	/* if the lun_q is already suspended then don't do it again */
++	if (lq->q_state == LUN_STATE_READY ||lq->q_state == LUN_STATE_RUN) {
++
++		spin_lock_irqsave(&lq->q_lock, flags);
++		if (lq->q_state == LUN_STATE_READY) {
++			lq->q_max = count;
++			lq->q_count = 0;
++		}
++		/* Set the suspend time usually 6 secs */
++		atomic_set(&lq->q_timer, time);
++
++		/* now suspend the lun */
++		lq->q_state = LUN_STATE_WAIT;
++
++		if (delay_lun) {
++			set_bit(LUN_EXEC_DELAYED, &lq->q_flag);
++			DEBUG(printk(KERN_INFO
++			    "scsi(%ld): Delay lun execution for %d secs, "
++			    "count=%d, max count=%d, state=%d\n",
++			    ha->host_no,
++			    time,
++			    lq->q_count, lq->q_max, lq->q_state));
++		} else {
++			DEBUG(printk(KERN_INFO
++			    "scsi(%ld): Suspend lun for %d secs, count=%d, "
++			    "max count=%d, state=%d\n",
++			    ha->host_no,
++			    time,
++			    lq->q_count, lq->q_max, lq->q_state));
++		}
++		spin_unlock_irqrestore(&lq->q_lock, flags);
++
++		/*
++		 * Remove all pending commands from request queue and  put them
++		 * in the scsi_retry queue.
++		 */
++		spin_lock_irqsave(&ha->list_lock, flags);
++		list_for_each_safe(list, temp, &ha->pending_queue) {
++			sp = list_entry(list, srb_t, list);
++			if (sp->lun_queue != lq)
++				continue;
++
++			__del_from_pending_queue(ha, sp);
++
++			if (sp->cmd->allowed < count)
++				sp->cmd->allowed = count;
++			__add_to_scsi_retry_queue(ha,sp);
++
++		} /* list_for_each_safe */
++		spin_unlock_irqrestore(&ha->list_lock, flags);
++		status = QL_STATUS_SUCCESS;
++	} else {
++		status = QL_STATUS_ERROR;
++	}
++
++	return (status);
++
++}
++
++/*
++ * qla2x00_mark_device_lost Updates fcport state when device goes offline.
++ *
++ * Input: ha = adapter block pointer.  fcport = port structure pointer.
++ *
++ * Return: None.
++ *
++ * Context:
++ */
++void qla2x00_mark_device_lost(scsi_qla_host_t *ha, fc_port_t *fcport)
++{
++	/* 
++	 * We may need to retry the login, so don't change the state of the
++	 * port but do the retries.
++	 */
++	if (atomic_read(&fcport->state) != FC_DEVICE_DEAD)
++		atomic_set(&fcport->state, FC_DEVICE_LOST);
++
++	if (fcport->login_retry == 0) {
++		fcport->login_retry = ha->login_retry_count;
++		set_bit(RELOGIN_NEEDED, &ha->dpc_flags);
++
++		DEBUG(printk("scsi(%ld): Port login retry: "
++		    "%02x%02x%02x%02x%02x%02x%02x%02x, "
++		    "id = 0x%04x retry cnt=%d\n",
++		    ha->host_no,
++		    fcport->port_name[0],
++		    fcport->port_name[1],
++		    fcport->port_name[2],
++		    fcport->port_name[3],
++		    fcport->port_name[4],
++		    fcport->port_name[5],
++		    fcport->port_name[6],
++		    fcport->port_name[7],
++		    fcport->loop_id,
++		    fcport->login_retry));
++	}
++}
++
++/*
++ * qla2x00_mark_all_devices_lost
++ *	Updates fcport state when device goes offline.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	fcport = port structure pointer.
++ *
++ * Return:
++ *	None.
++ *
++ * Context:
++ */
++void
++qla2x00_mark_all_devices_lost(scsi_qla_host_t *ha) 
++{
++	struct list_head	*fcpl;
++	fc_port_t		*fcport;
++
++	list_for_each(fcpl, &ha->fcports) {
++		fcport = list_entry(fcpl, fc_port_t, list);
++
++		/*
++		 * No point in marking the device as lost, if the device is
++		 * already DEAD.
++		 */
++		if (atomic_read(&fcport->state) == FC_DEVICE_DEAD)
++			continue;
++
++		atomic_set(&fcport->state, FC_DEVICE_LOST);
++	}
++}
++
++/*
++* qla2x00_mem_alloc
++*      Allocates adapter memory.
++*
++* Returns:
++*      0  = success.
++*      1  = failure.
++*/
++static uint8_t
++qla2x00_mem_alloc(scsi_qla_host_t *ha)
++{
++	uint8_t   status = 1;
++	uint8_t   i;
++	int	retry= 10;
++	mbx_cmdq_t	*ptmp;
++	mbx_cmdq_t	*tmp_q_head;
++	mbx_cmdq_t	*tmp_q_tail;
++
++	ENTER(__func__);
++
++	do {
++		/*
++		 * This will loop only once if everything goes well, else some
++		 * number of retries will be performed to get around a kernel
++		 * bug where available mem is not allocated until after a
++		 * little delay and a retry.
++		 */
++
++#if defined(FC_IP_SUPPORT)
++		ha->risc_rec_q = pci_alloc_consistent(ha->pdev,
++		    ((IP_BUFFER_QUEUE_DEPTH) * (sizeof(struct risc_rec_entry))),
++		    &ha->risc_rec_q_dma);
++		if (ha->risc_rec_q == NULL) {
++			printk(KERN_WARNING
++			    "scsi(%ld): Memory Allocation failed - "
++			    "risc_rec_q\n",
++			    ha->host_no);
++
++			set_current_state(TASK_INTERRUPTIBLE);
++			schedule_timeout(HZ/10);
++
++			continue;
++		}
++#endif	/* #if defined(FC_IP_SUPPORT) */
++
++		ha->request_ring = pci_alloc_consistent(ha->pdev,
++		    ((REQUEST_ENTRY_CNT + 1) * (sizeof(request_t))),
++		    &ha->request_dma);
++		if (ha->request_ring == NULL) {
++			printk(KERN_WARNING
++			    "scsi(%ld): Memory Allocation failed - "
++			    "request_ring\n",
++			    ha->host_no);
++
++			qla2x00_mem_free(ha);
++			set_current_state(TASK_INTERRUPTIBLE);
++			schedule_timeout(HZ/10);
++
++			continue;
++		}
++
++		ha->response_ring = pci_alloc_consistent(ha->pdev,
++		    ((RESPONSE_ENTRY_CNT + 1) * (sizeof(response_t))),
++		    &ha->response_dma);
++		if (ha->response_ring == NULL) {
++			printk(KERN_WARNING
++			    "scsi(%ld): Memory Allocation failed - "
++			    "response_ring\n",
++			    ha->host_no);
++
++			qla2x00_mem_free(ha);
++			set_current_state(TASK_INTERRUPTIBLE);
++			schedule_timeout(HZ/10);
++
++			continue;
++		}
++
++		/* get consistent memory allocated for init control block */
++		ha->init_cb = pci_alloc_consistent(ha->pdev,
++		    sizeof(init_cb_t), &ha->init_cb_dma);
++		if (ha->init_cb == NULL) {
++			printk(KERN_WARNING
++			    "scsi(%ld): Memory Allocation failed - "
++			    "init_cb\n",
++			    ha->host_no);
++
++			qla2x00_mem_free(ha);
++			set_current_state(TASK_INTERRUPTIBLE);
++			schedule_timeout(HZ/10);
++
++			continue;
++		}
++		memset(ha->init_cb, 0, sizeof(init_cb_t));
++
++		/* Allocate ioctl related memory. */
++		if (qla2x00_alloc_ioctl_mem(ha)) {
++			printk(KERN_WARNING
++			    "scsi(%ld): Memory Allocation failed - "
++			    "ioctl_mem\n",
++			    ha->host_no);
++
++			qla2x00_mem_free(ha);
++			set_current_state(TASK_INTERRUPTIBLE);
++			schedule_timeout(HZ/10);
++
++			continue;
++		}
++
++		if (qla2x00_allocate_sp_pool(ha)) {
++			printk(KERN_WARNING
++			    "scsi(%ld): Memory Allocation failed - "
++			    "qla2x00_allocate_sp_pool()\n",
++			    ha->host_no);
++
++			qla2x00_mem_free(ha);
++			set_current_state(TASK_INTERRUPTIBLE);
++			schedule_timeout(HZ/10);
++
++			continue;
++		}
++
++		/*
++		 * Allocate an initial list of mailbox semaphore queue to be
++		 * used for serialization of the mailbox commands.
++		 */
++		tmp_q_head = (void *)KMEM_ZALLOC(sizeof(mbx_cmdq_t), 20);
++		if (tmp_q_head == NULL) {
++			/* error */
++			printk(KERN_WARNING
++			    "scsi(%ld): Memory Allocation failed - "
++			    "mbx_cmd_q",
++			    ha->host_no);
++
++			qla2x00_mem_free(ha);
++			set_current_state(TASK_INTERRUPTIBLE);
++			schedule_timeout(HZ/10);
++
++			continue;
++		}
++		ha->mbx_sem_pool_head = tmp_q_head;
++		tmp_q_tail = tmp_q_head;
++
++		/* Now try to allocate more */
++		for (i = 1; i < MBQ_INIT_LEN; i++) {
++			ptmp = (void *)KMEM_ZALLOC(sizeof(mbx_cmdq_t), 20 + i);
++			if (ptmp == NULL) {
++				/*
++				 * Error. Just exit. If more is needed later
++				 * they will be allocated at that time.
++				 */
++				break;
++			}
++			tmp_q_tail->pnext = ptmp;
++			tmp_q_tail = ptmp;
++		}
++		ha->mbx_sem_pool_tail = tmp_q_tail;
++
++		/* Get consistent memory allocated for MS IOCB */
++		ha->ms_iocb = pci_alloc_consistent(ha->pdev,
++		    sizeof(ms_iocb_entry_t), &ha->ms_iocb_dma);
++		if (ha->ms_iocb == NULL) {
++			/* error */
++			printk(KERN_WARNING
++			    "scsi(%ld): Memory Allocation failed - ms_iocb\n",
++			    ha->host_no);
++
++			qla2x00_mem_free(ha);
++			set_current_state(TASK_INTERRUPTIBLE);
++			schedule_timeout(HZ/10);
++
++			continue;
++		}
++		memset(ha->ms_iocb, 0, sizeof(ms_iocb_entry_t));
++
++		/* Get consistent memory allocated for CT SNS commands */
++		ha->ct_sns = pci_alloc_consistent(ha->pdev,
++		    sizeof(struct ct_sns_pkt), &ha->ct_sns_dma);
++		if (ha->ct_sns == NULL) {
++			/* error */
++			printk(KERN_WARNING
++			    "scsi(%ld): Memory Allocation failed - ct_sns\n",
++			    ha->host_no);
++
++			qla2x00_mem_free(ha);
++			set_current_state(TASK_INTERRUPTIBLE);
++			schedule_timeout(HZ/10);
++
++			continue;
++		}
++		memset(ha->ct_sns, 0, sizeof(struct ct_sns_pkt));
++
++		/* Done all allocations without any error. */
++		status = 0;
++
++	} while (retry-- && status != 0);
++
++	if (status) {
++		printk(KERN_WARNING
++			"%s(): **** FAILED ****\n", __func__);
++	}
++
++	LEAVE(__func__);
++
++	return(status);
++}
++
++/*
++* qla2x00_mem_free
++*      Frees all adapter allocated memory.
++*
++* Input:
++*      ha = adapter block pointer.
++*/
++static void
++qla2x00_mem_free(scsi_qla_host_t *ha)
++{
++	uint32_t	t;
++	struct list_head	*fcpl, *fcptemp;
++	fc_port_t	*fcport;
++	struct list_head	*fcll, *fcltemp;
++	fc_lun_t	*fclun;
++	mbx_cmdq_t	*ptmp;
++	mbx_cmdq_t	*tmp_q_head;
++	unsigned long	wtime;/* max wait time if mbx cmd is busy. */
++	struct list_head *fcil, *fcitemp;
++	fc_initiator_t	*fcinitiator;
++
++	ENTER(__func__);
++
++	if (ha == NULL) {
++		/* error */
++		DEBUG2(printk("%s(): ERROR invalid ha pointer.\n", __func__));
++		return;
++	}
++
++	/* Free the target queues */
++	for (t = 0; t < MAX_TARGETS; t++) {
++		qla2x00_tgt_free(ha, t);
++	}
++
++	/* Make sure all other threads are stopped. */
++	wtime = 60 * HZ;
++	while ((ha->dpc_wait != NULL || ha->mbx_q_head != NULL) && wtime) {
++		set_current_state(TASK_INTERRUPTIBLE);
++		wtime = schedule_timeout(wtime);
++	}
++
++	/* Now free the mbx sem pool */
++	tmp_q_head = ha->mbx_sem_pool_head;
++	while (tmp_q_head != NULL) {
++		ptmp = tmp_q_head->pnext;
++		KMEM_FREE(tmp_q_head, sizeof(mbx_cmdq_t));
++		tmp_q_head = ptmp;
++	}
++	ha->mbx_sem_pool_head = NULL;
++
++	/* free ioctl memory */
++	qla2x00_free_ioctl_mem(ha);
++
++	/* Free host database. */
++	list_for_each_safe(fcil, fcitemp, &ha->fcinitiators) {
++		fcinitiator = list_entry(fcil, fc_initiator_t, list);
++
++		list_del(&fcinitiator->list);
++		kfree(fcinitiator);
++	}
++	INIT_LIST_HEAD(&ha->fcinitiators);
++
++	/* free sp pool */
++	qla2x00_free_sp_pool(ha);
++
++	if (ha->ct_sns) {
++		pci_free_consistent(ha->pdev,
++		    sizeof(struct ct_sns_pkt), ha->ct_sns, ha->ct_sns_dma);
++	}
++	if (ha->ms_iocb) {
++		pci_free_consistent(ha->pdev,
++		    sizeof(ms_iocb_entry_t), ha->ms_iocb, ha->ms_iocb_dma);
++	}
++
++	if (ha->init_cb) {
++		pci_free_consistent(ha->pdev,
++		    sizeof(init_cb_t), ha->init_cb, ha->init_cb_dma);
++	}
++
++	if (ha->request_ring) {
++		pci_free_consistent(ha->pdev,
++		    ((REQUEST_ENTRY_CNT + 1) * (sizeof(request_t))),
++		    ha->request_ring, ha->request_dma);
++	}
++
++	if (ha->response_ring) {
++		pci_free_consistent(ha->pdev,
++		    ((RESPONSE_ENTRY_CNT + 1) * (sizeof(response_t))),
++		    ha->response_ring, ha->response_dma);
++	}
++
++#if defined(FC_IP_SUPPORT)
++	if (ha->risc_rec_q) {
++		pci_free_consistent(ha->pdev,
++		    ((IP_BUFFER_QUEUE_DEPTH) * (sizeof(struct risc_rec_entry))),
++		    ha->risc_rec_q, ha->risc_rec_q_dma);
++	}
++	ha->risc_rec_q = NULL;
++	ha->risc_rec_q_dma = 0;
++#endif
++
++	ha->ct_sns = NULL;
++	ha->ms_iocb = NULL;
++
++	ha->init_cb = NULL;
++	ha->request_ring = NULL;
++	ha->request_dma = 0;
++	ha->response_ring = NULL;
++	ha->response_dma = 0;
++
++	list_for_each_safe(fcpl, fcptemp, &ha->fcports) {
++		fcport = list_entry(fcpl, fc_port_t, list);
++
++		/* fc luns */
++		list_for_each_safe(fcll, fcltemp, &fcport->fcluns) {
++			fclun = list_entry(fcll, fc_lun_t, list);
++
++			list_del_init(&fclun->list);
++			kfree(fclun);
++		}
++
++		/* fc ports */
++		list_del_init(&fcport->list);
++		kfree(fcport);
++	}
++	INIT_LIST_HEAD(&ha->fcports);
++
++	LEAVE(__func__);
++}
++
++/*
++ * qla2x00_allocate_sp_pool
++ * 	 This routine is called during initialization to allocate
++ *  	 memory for local srb_t.
++ *
++ * Input:
++ *	 ha   = adapter block pointer.
++ *
++ * Context:
++ *      Kernel context.
++ * 
++ * Note: Sets the ref_count for non Null sp to one.
++ */
++uint8_t
++qla2x00_allocate_sp_pool(scsi_qla_host_t *ha) 
++{
++	srb_t   *sp;
++	int  i;
++	uint8_t      status = QL_STATUS_SUCCESS;
++
++	ENTER(__func__);
++	
++	INIT_LIST_HEAD(&ha->free_queue);
++	ha->srb_alloc_cnt = 0;
++
++	ha->srb_pool_order = get_order(max_srbs * sizeof(srb_t));
++	ha->srb_pool =
++	    (srb_t *) __get_free_pages(GFP_KERNEL, ha->srb_pool_order);
++	if (ha->srb_pool != NULL) {
++		for (i = 0, sp = ha->srb_pool; i < max_srbs; i++, sp++) {
++			memset(sp, 0, sizeof(srb_t));
++			__add_to_free_queue (ha, sp);
++			sp->magic = SRB_MAGIC;
++			sp->ref_num = ha->srb_alloc_cnt;
++			sp->host_no = ha->host_no;
++			atomic_set(&sp->ref_count, 0);
++
++			ha->srb_alloc_cnt++;
++		}
++	}
++
++	/*
++	 * If we fail to allocte memory return an error
++	 */
++	if (ha->srb_alloc_cnt == 0)
++		status = QL_STATUS_ERROR;
++
++	printk(KERN_INFO
++	    "scsi(%ld): Allocated %d SRB(s).\n",
++	    ha->host_no, ha->srb_alloc_cnt);
++
++	LEAVE(__func__);
++
++	return (status);
++}
++
++/*
++ *  This routine frees all adapter allocated memory.
++ *  
++ */
++void
++qla2x00_free_sp_pool( scsi_qla_host_t *ha) 
++{
++	int cnt_free_srbs = 0;
++	srb_t *sp;
++	struct list_head *list, *temp;
++
++	/*
++	 * Count the number of entries, remove the entries from the list, then
++	 * free the pool.
++	 */
++	list_for_each_safe(list, temp, &ha->free_queue) {
++		sp = list_entry(list, srb_t, list);
++		
++		__del_from_free_queue(ha, sp);
++		cnt_free_srbs++;
++	}
++	free_pages((unsigned long)ha->srb_pool, ha->srb_pool_order);
++
++	if (cnt_free_srbs != ha->srb_alloc_cnt) {
++		DEBUG(printk("scsi(%ld): Did not free all srbs, Free count = "
++		    "%d, Alloc Count = %d\n",
++		    ha->host_no, cnt_free_srbs, ha->srb_alloc_cnt));
++		printk(KERN_INFO
++		    "scsi(%ld): Did not free all srbs, Free count = %d, "
++		    "Alloc Count = %d\n",
++		    ha->host_no, cnt_free_srbs, ha->srb_alloc_cnt);
++	}
++}
++
++
++
++/**************************************************************************
++* qla2x00_do_dpc
++*   This kernel thread is a task that is schedule by the interrupt handler
++*   to perform the background processing for interrupts.
++*
++* Notes:
++* This task always run in the context of a kernel thread.  It
++* is kick-off by the driver's detect code and starts up
++* up one per adapter. It immediately goes to sleep and waits for
++* some fibre event.  When either the interrupt handler or
++* the timer routine detects a event it will one of the task
++* bits then wake us up.
++**************************************************************************/
++static int
++qla2x00_do_dpc(void *data)
++{
++	DECLARE_MUTEX_LOCKED(sem);
++	scsi_qla_host_t *ha;
++	fcdev_t         dev;
++	struct list_head *fcpl;
++	fc_port_t	*fcport;
++	os_lun_t        *q;
++	srb_t           *sp;
++	uint8_t		status;
++	uint32_t        t;
++	unsigned long	flags = 0;
++	struct list_head *list, *templist;
++	int	dead_cnt, online_cnt;
++
++	ha = (scsi_qla_host_t *)data;
++
++	lock_kernel();
++
++	daemonize("%s_dpc%ld", DRIVER_NAME, ha->host_no);
++	allow_signal(SIGTERM);
++
++	ha->dpc_wait = &sem;
++
++	unlock_kernel();
++
++	complete(&ha->dpc_inited);
++
++	while (1) {
++		/*
++		 * If we get a signal, it means we are supposed to go
++		 * away and die.  This typically happens if the user is
++		 * trying to unload a module.
++		 */
++		DEBUG3(printk("qla2x00: DPC handler sleeping\n"));
++
++		down_interruptible(&sem);
++
++		if (signal_pending(current))
++			break;   /* get out */
++
++		if (ha->dpc_should_die)
++			break;
++
++		if (!list_empty(&ha->done_queue))
++			schedule_work(&ha->run_qla_task);
++
++		DEBUG3(printk("qla2x00: DPC handler waking up\n"));
++
++		/* Initialization not yet finished. Don't do anything yet. */
++		if (!ha->init_done || ha->dpc_active)
++			continue;
++
++		DEBUG3(printk("scsi(%ld): DPC handler\n", ha->host_no));
++
++		/* spin_lock_irqsave(&io_request_lock, ha->cpu_flags);*/
++		ha->dpc_active = 1;
++
++		/* Determine what action is necessary */
++
++		/* Process commands in retry queue */
++		if (test_and_clear_bit(PORT_RESTART_NEEDED, &ha->dpc_flags)) {
++			DEBUG(printk("scsi(%ld): DPC checking retry_q. "
++			    "total=%d\n",
++			    ha->host_no, ha->retry_q_cnt));
++
++			spin_lock_irqsave(&ha->list_lock, flags);
++			dead_cnt = online_cnt = 0;
++			list_for_each_safe(list, templist, &ha->retry_queue) {
++				sp = list_entry(list, srb_t, list);
++				q = sp->lun_queue;
++				DEBUG3(printk("scsi(%ld): pid=%ld sp=%p, "
++				    "spflags=0x%x, q_flag= 0x%lx\n",
++				    ha->host_no,
++				    sp->cmd->serial_number,
++				    sp, sp->flags, q->q_flag));
++
++				if (q == NULL)
++					continue;
++				fcport = q->fclun->fcport;
++
++				if (atomic_read(&fcport->state) ==
++				    FC_DEVICE_DEAD) {
++
++					__del_from_retry_queue(ha, sp);
++					CMD_RESULT(sp->cmd) =
++					    DID_NO_CONNECT << 16;
++					CMD_HANDLE(sp->cmd) =
++					    (unsigned char *) NULL;
++					__add_to_done_queue(ha, sp);
++					dead_cnt++;
++				} else if (atomic_read(&fcport->state) !=
++				    FC_DEVICE_LOST) {
++
++					__del_from_retry_queue(ha, sp);
++					CMD_RESULT(sp->cmd) =
++					    DID_BUS_BUSY << 16;
++					CMD_HANDLE(sp->cmd) =
++					    (unsigned char *) NULL;
++					__add_to_done_queue(ha, sp);
++					online_cnt++;
++				}
++			} /* list_for_each_safe() */
++			spin_unlock_irqrestore(&ha->list_lock, flags);
++
++			DEBUG(printk("scsi(%ld): done processing retry queue "
++			    "- dead=%d, online=%d\n ",
++			    ha->host_no, dead_cnt, online_cnt));
++		}
++
++		/* Process commands in scsi retry queue */
++		if (test_and_clear_bit(SCSI_RESTART_NEEDED, &ha->dpc_flags)) {
++			/*
++			 * Any requests we want to delay for some period is put
++			 * in the scsi retry queue with a delay added. The
++			 * timer will schedule a "scsi_restart_needed" every 
++			 * second as long as there are requests in the scsi
++			 * queue. 
++			 */
++			DEBUG(printk("scsi(%ld): DPC checking scsi "
++			    "retry_q.total=%d\n",
++			    ha->host_no, ha->scsi_retry_q_cnt));
++
++			online_cnt = 0;
++			spin_lock_irqsave(&ha->list_lock, flags);
++			list_for_each_safe(list,
++						templist,
++						&ha->scsi_retry_queue) {
++
++				sp = list_entry(list, srb_t, list);
++				q = sp->lun_queue;
++
++				DEBUG3(printk("scsi(%ld): scsi_retry_q: "
++				    "pid=%ld sp=%p, spflags=0x%x, "
++				    "q_flag= 0x%lx,q_state=%d\n",
++				    ha->host_no,
++				    sp->cmd->serial_number,
++				    sp, sp->flags, q->q_flag, q->q_state));
++
++				/* Was this lun suspended */
++				if (q->q_state != LUN_STATE_WAIT) {
++					online_cnt++;
++					__del_from_scsi_retry_queue(ha, sp);
++					__add_to_retry_queue(ha,sp);
++				}
++
++				/* Was this command suspended for N secs */
++				if (sp->delay != 0) {
++					sp->delay--;
++					if (sp->delay == 0) {
++						online_cnt++;
++						__del_from_scsi_retry_queue(
++						    ha, sp);
++						__add_to_retry_queue(ha,sp);
++					}
++				}
++			}
++			spin_unlock_irqrestore(&ha->list_lock, flags);
++
++			DEBUG(if (online_cnt > 0))
++			DEBUG(printk("scsi(%ld): dpc() found scsi reqs to "
++			    "restart= %d\n",
++			    ha->host_no, online_cnt));
++		}
++
++		if (ha->flags.mbox_busy) {
++			if (!list_empty(&ha->done_queue))
++				schedule_work(&ha->run_qla_task);
++
++			ha->dpc_active = 0;
++			continue;
++		}
++
++		if (test_and_clear_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) {
++
++			DEBUG(printk("scsi(%ld): dpc: sched "
++			    "qla2x00_abort_isp ha = %p\n",
++			    ha->host_no, ha));
++			if (!(test_and_set_bit(ABORT_ISP_ACTIVE,
++			    &ha->dpc_flags))) {
++
++				if (qla2x00_abort_isp(ha, 0)) {
++					/* failed. retry later */
++					set_bit(ISP_ABORT_NEEDED,
++					    &ha->dpc_flags);
++				}
++				clear_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags);
++			}
++			DEBUG(printk("scsi(%ld): dpc: qla2x00_abort_isp end\n",
++			    ha->host_no));
++		}
++
++		if (test_and_clear_bit(LOOP_RESET_NEEDED, &ha->dpc_flags)) {
++
++			DEBUG(printk("scsi(%ld): Loop Reset Needed -- "
++			    "calling qla2x00_loop_reset().\n",
++			    ha->host_no));
++
++			qla2x00_loop_reset(ha);
++		}
++
++		if (test_and_clear_bit(DEVICE_ABORT_NEEDED, &ha->dpc_flags)) {
++
++			DEBUG(printk("scsi(%ld): Device Abort Needed -- "
++			    "calling qla2x00_abort_device().\n",
++			    ha->host_no));
++
++			t = ha->reset_tgt_id;
++			if (ha->otgt[t] && ha->otgt[t]->vis_port)
++				qla2x00_abort_device(ha,
++					ha->otgt[t]->vis_port->loop_id,
++					ha->reset_lun);
++		}
++
++		if (test_and_clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags) &&
++		    (!(test_and_set_bit(RESET_ACTIVE, &ha->dpc_flags)))) {
++
++			DEBUG(printk("scsi(%ld): qla2x00_reset_marker()\n",
++			    ha->host_no));
++
++			qla2x00_rst_aen(ha);
++			clear_bit(RESET_ACTIVE, &ha->dpc_flags);
++		}
++
++		/* Retry each device up to login retry count */
++		if ((test_and_clear_bit(RELOGIN_NEEDED, &ha->dpc_flags)) &&
++		    !test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) &&
++		    ha->loop_state != LOOP_DOWN) {
++
++			DEBUG(printk("scsi(%ld): qla2x00_port_login()\n",
++			    ha->host_no));
++
++			list_for_each(fcpl, &ha->fcports) {
++				fcport = list_entry(fcpl, fc_port_t, list);
++				
++				/*
++				 * If the port is not ONLINE then try to login
++				 * to it if we haven't run out of retries.
++				 */
++				if (atomic_read(&fcport->state) != FC_ONLINE &&
++				    fcport->login_retry) {
++
++					fcport->login_retry--;
++					memset(&dev, 0, sizeof(fcdev_t));
++					dev.loop_id = fcport->old_loop_id;
++					dev.d_id.b24 = fcport->d_id.b24;
++					if (ha->fc_db[fcport->dev_id].flag &
++					    DEV_PUBLIC)	
++						status = qla2x00_fabric_login(
++						    ha, &dev);
++					else 	
++						status =
++						    qla2x00_local_device_login(
++							ha,
++							(dev.loop_id & 0xff));
++
++					if (status == QL_STATUS_SUCCESS) {
++						ha->fc_db[fcport->dev_id].loop_id = dev.loop_id;
++						fcport->loop_id = dev.loop_id;
++						fcport->old_loop_id = dev.loop_id;
++
++						DEBUG(printk("scsi(%ld): port login OK: logged in ID 0x%x\n",
++						    ha->host_no, fcport->loop_id));
++						
++						fcport->port_login_retry_count =
++						    ha->port_down_retry_count * PORT_RETRY_TIME;
++						atomic_set(&fcport->state, FC_ONLINE);
++						atomic_set(&fcport->port_down_timer,
++						    ha->port_down_retry_count * PORT_RETRY_TIME);
++
++						fcport->login_retry = 0;
++					} else if (status == 1) {
++						if (dev.loop_id != fcport->old_loop_id) {
++							fcport->old_loop_id = dev.loop_id;
++							ha->fc_db[fcport->dev_id].loop_id = dev.loop_id;
++						}
++
++						set_bit(RELOGIN_NEEDED, &ha->dpc_flags);
++						/* retry the login again */
++						DEBUG(printk("scsi(%ld): Retrying %d login again loop_id 0x%x\n",
++						    ha->host_no,
++						    fcport->login_retry, fcport->loop_id));
++					} else {
++						fcport->login_retry = 0;
++					}
++				}
++				if (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags))
++					break;
++			}
++			DEBUG(printk("scsi(%ld): qla2x00_port_login - end\n",
++			    ha->host_no));
++		}
++
++		if ((test_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags)) &&
++		    ha->loop_state != LOOP_DOWN ) {
++
++			clear_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags);
++			DEBUG(printk("scsi(%ld): qla2x00_login_retry()\n",
++			    ha->host_no));
++				
++			set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags);
++
++			DEBUG(printk("scsi(%ld): qla2x00_login_retry - end\n",
++			    ha->host_no));
++		}
++
++		if (test_and_clear_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) {
++
++			DEBUG(printk("scsi(%ld): qla2x00_loop_resync()\n",
++			    ha->host_no));
++
++			if (!(test_and_set_bit(LOOP_RESYNC_ACTIVE,
++			    &ha->dpc_flags))) {
++
++				qla2x00_loop_resync(ha);
++
++				clear_bit(LOOP_RESYNC_ACTIVE, &ha->dpc_flags);
++			}
++
++			DEBUG(printk("scsi(%ld): qla2x00_loop_resync - end\n",
++			    ha->host_no));
++		}
++
++		if (ha->flags.failover_enabled) {
++			/*
++			 * If we are not processing a ioctl or one of
++			 * the ports are still MISSING or need a resync
++			 * then process the failover event.
++			*/  
++			if (!test_bit(CFG_ACTIVE, &ha->cfg_flags)) {
++				if (qla2x00_check_for_devices_online(ha)) {
++					if (test_and_clear_bit(FAILOVER_EVENT, &ha->dpc_flags)) {
++
++						DEBUG(printk("scsi(%ld): qla2x00_cfg_event_notify()\n",
++						    ha->host_no));
++
++						if (ha->flags.online) {
++							qla2x00_cfg_event_notify(ha, ha->failover_type);
++						}
++
++						DEBUG(printk("scsi(%ld): qla2x00_cfg_event_notify - end\n",
++						    ha->host_no));
++					}
++				}
++
++				if (test_and_clear_bit(FAILOVER_NEEDED, &ha->dpc_flags)) {
++					/*
++					 * Get any requests from failover queue
++					 */
++					DEBUG(printk("scsi(%ld): qla2x00_process_failover()\n",
++					    ha->host_no));
++
++					qla2x00_process_failover(ha);
++
++					DEBUG(printk("scsi(%ld): qla2x00_process_failover - end\n",
++					    ha->host_no));
++				}
++			}
++		}
++
++		if (test_bit(RESTART_QUEUES_NEEDED, &ha->dpc_flags)) {
++			DEBUG(printk("scsi(%ld): qla2x00_restart_queues()\n",
++			    ha->host_no));
++
++			qla2x00_restart_queues(ha,FALSE);
++
++			DEBUG(printk("scsi(%ld): qla2x00_restart_queues - end\n",
++			    ha->host_no));
++		}
++
++		if (test_bit(ABORT_QUEUES_NEEDED, &ha->dpc_flags)) {
++
++			DEBUG(printk("scsi(%ld): qla2x00_abort_queues()\n",
++			    ha->host_no));
++				
++			qla2x00_abort_queues(ha, FALSE);
++
++			DEBUG(printk("scsi(%ld): qla2x00_abort_queues - end\n",
++			    ha->host_no));
++		}
++
++		if (!ha->interrupts_on)
++			qla2x00_enable_intrs(ha);
++
++		if (!list_empty(&ha->done_queue))
++			schedule_work(&ha->run_qla_task);
++
++		ha->dpc_active = 0;
++	} /* End of while(1) */
++
++	DEBUG(printk("scsi(%ld): DPC handler exiting\n", ha->host_no));
++
++	/*
++	 * Make sure that nobody tries to wake us up again.
++	 */
++	ha->dpc_wait = NULL;
++	ha->dpc_active = 0;
++
++	complete_and_exit(&ha->dpc_exited, 0);
++}
++
++/*
++ *  qla2x00_abort_queues
++ *	Abort all commands on queues on device
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *
++ * Context:
++ *	Interrupt context.
++ */
++void
++qla2x00_abort_queues(scsi_qla_host_t *ha, uint8_t doneqflg) 
++{
++
++	srb_t       *sp;
++	struct list_head *list, *temp;
++	unsigned long flags;
++
++	ENTER(__func__);
++
++	clear_bit(ABORT_QUEUES_NEEDED, &ha->dpc_flags);
++
++	/* Return all commands device queues. */
++	spin_lock_irqsave(&ha->list_lock,flags);
++	list_for_each_safe(list, temp, &ha->pending_queue) {
++		sp = list_entry(list, srb_t, list);
++
++		if (sp->flags & SRB_ABORTED)
++			continue;
++
++		/* Remove srb from LUN queue. */
++		__del_from_pending_queue(ha, sp);
++
++		/* Set ending status. */
++		CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16;
++
++		__add_to_done_queue(ha, sp);
++	}
++	spin_unlock_irqrestore(&ha->list_lock, flags);
++
++	LEAVE(__func__);
++}
++
++/*
++ * qla2x00_check_for_devices_online
++ *
++ *	Check fcport state of all devices to make sure online.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *
++ * Return:
++ *	None.
++ *
++ * Context:
++ */
++static uint8_t
++qla2x00_check_for_devices_online(scsi_qla_host_t *ha) 
++{
++	struct list_head	*fcpl;
++	fc_port_t	*fcport;
++	int		found, cnt;
++
++	found = 0;
++	cnt = 0;
++
++	list_for_each(fcpl, &ha->fcports) {
++		fcport = list_entry(fcpl, fc_port_t, list);
++
++		if ((atomic_read(&fcport->state) == FC_ONLINE) ||
++			(atomic_read(&fcport->state) == FC_DEVICE_DEAD))
++			found++;
++
++		cnt++;
++	}
++	if (cnt == found) {
++		DEBUG5(printk("%s(%ld): all online\n",
++				__func__,
++				ha->host_no);)
++		return 1;
++	} else
++		return 0;
++}
++
++/*
++*  qla2x00_rst_aen
++*      Processes asynchronous reset.
++*
++* Input:
++*      ha  = adapter block pointer.
++*/
++static void
++qla2x00_rst_aen(scsi_qla_host_t *ha) 
++{
++	ENTER(__func__);
++
++	if (ha->flags.online && !ha->flags.reset_active &&
++	    !atomic_read(&ha->loop_down_timer) &&
++	    !(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) {
++
++		/* 10/15 ha->flags.reset_active = TRUE; */
++		do {
++			clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags);
++
++			/*
++			 * Issue marker command only when we are going to start
++			 * the I/O.
++			 */
++			ha->marker_needed = 1;
++		} while (!atomic_read(&ha->loop_down_timer) &&
++		    (test_bit(RESET_MARKER_NEEDED, &ha->dpc_flags)));
++
++		/* 10/15 ha->flags.reset_active = FALSE; */
++	}
++
++	LEAVE(__func__);
++}
++
++
++/*
++ * This routine will alloacte SP from the free queue
++ * input:
++ *        scsi_qla_host_t *
++ * output:
++ *        srb_t * or NULL
++ */
++srb_t *
++qla2x00_get_new_sp(scsi_qla_host_t *ha)
++{
++	srb_t * sp = NULL;
++	ulong  flags;
++
++	spin_lock_irqsave(&ha->list_lock, flags);
++	if (!list_empty(&ha->free_queue)) {
++		sp = list_entry(ha->free_queue.next, srb_t, list);
++		__del_from_free_queue(ha, sp);
++	}
++	spin_unlock_irqrestore(&ha->list_lock, flags);
++
++	if (sp) {
++#if defined(QL_DEBUG_LEVEL_4)
++		if ((int)atomic_read(&sp->ref_count) != 0) {
++			printk(KERN_WARNING
++			    "scsi(%ld): WARNING ref_count not zero!\n",
++			    ha->host_no);
++		}
++#endif
++
++		sp_get(ha, sp);
++	}
++
++	return (sp);
++}
++
++/**************************************************************************
++*   qla2x00_timer
++*
++* Description:
++*   One second timer
++*
++* Context: Interrupt
++***************************************************************************/
++static void
++qla2x00_timer(scsi_qla_host_t *ha)
++{
++	int		t,l;
++	unsigned long	cpu_flags = 0;
++	struct list_head	*fcpl;
++	fc_port_t	*fcport;
++	os_lun_t *lq;
++	os_tgt_t *tq;
++	int		start_dpc = 0;
++
++	/*
++	 * We try and restart any request in the retry queue every second.
++	 */
++	if (!list_empty(&ha->retry_queue)) {
++		set_bit(PORT_RESTART_NEEDED, &ha->dpc_flags);
++		start_dpc++;
++	}
++
++	/*
++	 * We try and restart any request in the scsi_retry queue every second.
++	 */
++	if (!list_empty(&ha->scsi_retry_queue)) {
++		set_bit(SCSI_RESTART_NEEDED, &ha->dpc_flags);
++		start_dpc++;
++	}
++
++	/*
++	 * We try and failover any request in the failover queue every second.
++	 */
++	if (!list_empty(&ha->failover_queue)) {
++		set_bit(FAILOVER_NEEDED, &ha->dpc_flags);
++		start_dpc++;
++	}
++
++	/*
++	 * Ports - Port down timer.
++	 *
++	 * Whenever, a port is in the LOST state we start decrementing its port
++	 * down timer every second until it reaches zero. Once  it reaches zero
++	 * the port it marked DEAD. 
++	 */
++	t = 0;
++	list_for_each(fcpl, &ha->fcports) {
++		fcport = list_entry(fcpl, fc_port_t, list);
++
++		if (atomic_read(&fcport->state) == FC_DEVICE_LOST) {
++
++			if (atomic_read(&fcport->port_down_timer) == 0)
++				continue;
++
++			if (atomic_dec_and_test(&fcport->port_down_timer) != 0) 
++				atomic_set(&fcport->state, FC_DEVICE_DEAD);
++			
++			DEBUG(printk("scsi(%ld): fcport-%d - port retry count: "
++			    "%d remainning\n",
++			    ha->host_no,
++			    t, atomic_read(&fcport->port_down_timer)));
++		}
++		t++;
++	} /* End of for fcport  */
++
++	/*
++	 * LUNS - lun suspend timer.
++	 *
++	 * Whenever, a lun is suspended the timer starts decrementing its
++	 * suspend timer every second until it reaches zero. Once  it reaches
++	 * zero the lun retry count is decremented. 
++	 */
++
++	/*
++	 * FIXME(dg) - Need to convert this linear search of luns into a search
++	 * of a list of suspended luns.
++	 */
++	for (t = 0; t < ha->max_targets; t++) {
++		if ((tq = ha->otgt[t]) == NULL)
++			continue;
++
++		for (l = 0; l < ha->max_luns; l++) {
++			if ((lq = (os_lun_t *) tq->olun[l]) == NULL)
++				continue;
++
++			spin_lock_irqsave(&lq->q_lock, cpu_flags);
++			if (lq->q_state == LUN_STATE_WAIT &&
++				atomic_read(&lq->q_timer) != 0) {
++
++				if (atomic_dec_and_test(&lq->q_timer) != 0) {
++					/*
++					 * A delay should immediately
++					 * transition to a READY state
++					 */
++					if (test_and_clear_bit(LUN_EXEC_DELAYED,
++					    &lq->q_flag)) {
++						lq->q_state = LUN_STATE_READY;
++					}
++					else {
++						lq->q_count++;
++						if (lq->q_count == lq->q_max)
++							lq->q_state =
++							    LUN_STATE_TIMEOUT;
++						else
++							lq->q_state =
++							    LUN_STATE_RUN;
++					}
++				}
++				DEBUG3(printk("scsi(%ld): lun%d - timer %d, "
++				    "count=%d, max=%d, state=%d\n",
++				    ha->host_no,
++				    l,
++				    atomic_read(&lq->q_timer),
++				    lq->q_count, lq->q_max, lq->q_state));
++			}
++			spin_unlock_irqrestore(&lq->q_lock, cpu_flags);
++		} /* End of for luns  */
++	} /* End of for targets  */
++
++	/* Loop down handler. */
++	if (atomic_read(&ha->loop_down_timer) > 0 &&
++	    !(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) && ha->flags.online) {
++
++		/* dg 10/30 if (atomic_read(&ha->loop_down_timer) == LOOP_DOWN_TIME) { */
++		if (atomic_read(&ha->loop_down_timer) ==
++		    ha->loop_down_abort_time ) {
++
++			DEBUG(printk("scsi(%ld): Loop Down - aborting the "
++			    "queues before time expire\n",
++			    ha->host_no));
++
++			set_bit(ABORT_QUEUES_NEEDED, &ha->dpc_flags);
++			start_dpc++;
++		}
++
++		/* if the loop has been down for 4 minutes, reinit adapter */
++		if (atomic_dec_and_test(&ha->loop_down_timer) != 0) {
++			DEBUG(printk("scsi(%ld): Loop down exceed 4 mins - "
++			    "restarting queues.\n",
++			    ha->host_no));
++
++			set_bit(RESTART_QUEUES_NEEDED, &ha->dpc_flags);
++			start_dpc++;
++			if (!(ha->device_flags & DFLG_NO_CABLE) &&
++			    qla2x00_reinit && !ha->flags.failover_enabled) {
++
++				DEBUG(printk("scsi(%ld): Loop down - "
++				    "aborting ISP.\n",
++				    ha->host_no));
++
++				set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++			}
++		}
++		DEBUG3(printk("scsi(%ld): Loop Down - seconds remainning %d\n",
++		    ha->host_no,
++		    atomic_read(&ha->loop_down_timer)));
++	}
++
++	/*
++	 * Done Q Handler -- dgFIXME This handler will kick off doneq if we
++	 * haven't process it in 2 seconds.
++	 */
++	if (!list_empty(&ha->done_queue))
++		schedule_work(&ha->run_qla_task);
++
++#if QLA2100_LIPTEST
++	/*
++	 * This block is used to periodically schedule isp abort after
++	 * qla2x00_lip flag is set. 
++	 */
++
++	/*
++	   if (qla2x00_lip && (ha->forceLip++) == (60*2)) {
++	   printk("timer: schedule isp abort.\n");
++	   set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
++	   ha->forceLip = 0;
++	   }
++	 */
++
++	/*
++	 * This block is used to periodically schedule mailbox cmd timeout
++	 * simulation
++	 */
++	if (qla2x00_lip && (ha->forceLip++) == (60*6)) {
++		printk("qla2x00_timer: Going to force mbx timeout\n");
++
++		ha->forceLip = 0;
++		mbxtimeout = 1;
++	}
++#endif
++
++	if (test_bit(FAILOVER_EVENT_NEEDED, &ha->dpc_flags)) {
++		if (ha->failback_delay)  {
++			ha->failback_delay--;
++			if (ha->failback_delay == 0)  {
++				set_bit(FAILOVER_EVENT, &ha->dpc_flags);
++				clear_bit(FAILOVER_EVENT_NEEDED,
++				    &ha->dpc_flags);
++			}
++		} else {
++			set_bit(FAILOVER_EVENT, &ha->dpc_flags);
++			clear_bit(FAILOVER_EVENT_NEEDED, &ha->dpc_flags);
++		}
++	}
++
++	/* Schedule the DPC routine if needed */
++	if ((test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) ||
++	    test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) ||
++	    start_dpc ||
++	    test_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags) ||
++	    test_bit(FAILOVER_EVENT, &ha->dpc_flags) ||
++	    test_bit(FAILOVER_NEEDED, &ha->dpc_flags) ||
++	    test_bit(MAILBOX_CMD_NEEDED, &ha->dpc_flags)) &&
++	    ha->dpc_wait && !ha->dpc_active ) {
++
++		up(ha->dpc_wait);
++	}
++
++	qla2x00_restart_timer(ha, WATCH_INTERVAL);
++}
++
++/*
++ * qla2x00_extend_timeout
++ *      This routine will extend the timeout to the specified value.
++ *
++ * Input:
++ *      cmd = SCSI command structure
++ *
++ * Returns:
++ *      None.
++ */
++void 
++qla2x00_extend_timeout(Scsi_Cmnd *cmd, int timeout) 
++{
++	srb_t *sp = (srb_t *) CMD_SP(cmd);
++	u_long our_jiffies = (timeout * HZ) + jiffies;
++
++    	sp->ext_history= 0; 
++	sp->e_start = jiffies;
++	if (cmd->eh_timeout.function) {
++		mod_timer(&cmd->eh_timeout,our_jiffies);
++		sp->ext_history |= 1;
++	}
++	if (sp->timer.function != NULL) {
++		/* 
++		 * Our internal timer should timeout before the midlayer has a
++		 * chance begin the abort process
++		 */
++		mod_timer(&sp->timer,our_jiffies - (QLA_CMD_TIMER_DELTA * HZ));
++
++    	 	sp->ext_history |= 2;
++	}
++}
++
++/**************************************************************************
++*   qla2x00_cmd_timeout
++*
++* Description:
++*       Handles the command if it times out in any state.
++*
++* Input:
++*     sp - pointer to validate
++*
++* Returns:
++* None.
++* Note:Need to add the support for if( sp->state == SRB_FAILOVER_STATE).
++**************************************************************************/
++static void
++qla2x00_cmd_timeout(srb_t *sp)
++{
++	int t, l;
++	int processed;
++	scsi_qla_host_t *vis_ha, *dest_ha;
++	Scsi_Cmnd *cmd;
++	ulong      flags;
++#if defined(QL_DEBUG_LEVEL_3)
++	ulong      cpu_flags;
++#endif
++	fc_port_t	*fcport;
++
++	cmd = sp->cmd;
++	vis_ha = (scsi_qla_host_t *)cmd->device->host->hostdata;
++
++	DEBUG3(printk("cmd_timeout: Entering sp->state = %x\n", sp->state));
++
++	t = SCSI_TCN_32(cmd);
++	l = SCSI_LUN_32(cmd);
++	fcport = sp->fclun->fcport;
++	dest_ha = sp->ha;
++
++	/*
++	 * If IO is found either in retry Queue 
++	 *    OR in Lun Queue
++	 * Return this IO back to host
++	 */
++	spin_lock_irqsave(&vis_ha->list_lock, flags);
++	processed = 0;
++	if (sp->state == SRB_PENDING_STATE) {
++		__del_from_pending_queue(vis_ha, sp);
++		DEBUG2(printk("scsi(%ld): Found in Pending queue pid %ld, "
++		    "State = %x., fcport state=%d jiffies=%lx\n",
++		    vis_ha->host_no,
++		    sp->cmd->serial_number, sp->state,
++		    atomic_read(&fcport->state), jiffies));
++
++		/*
++		 * If FC_DEVICE is marked as dead return the cmd with
++		 * DID_NO_CONNECT status.  Otherwise set the host_byte to
++		 * DID_BUS_BUSY to let the OS  retry this cmd.
++		 */
++		if (atomic_read(&fcport->state) == FC_DEVICE_DEAD) {
++			cmd->result = DID_NO_CONNECT << 16;
++		} else {
++			cmd->result = DID_BUS_BUSY << 16;
++		}
++		__add_to_done_queue(vis_ha, sp);
++		processed++;
++	} 
++	spin_unlock_irqrestore(&vis_ha->list_lock, flags);
++
++	if (processed) {
++		 schedule_work(&vis_ha->run_qla_task);
++
++		 return;
++	}
++
++	spin_lock_irqsave(&dest_ha->list_lock, flags);
++	if ((sp->state == SRB_RETRY_STATE) ||
++	    (sp->state == SRB_SCSI_RETRY_STATE) ||
++	    (sp->state == SRB_FAILOVER_STATE)) {
++
++		DEBUG2(printk("scsi(%ld): Found in (Scsi) Retry queue or "
++		    "failover Q pid %ld, State = %x., fcport state=%d "
++		    "jiffies=%lx retried=%d\n",
++		    dest_ha->host_no,
++		    sp->cmd->serial_number, sp->state,
++		    atomic_read(&fcport->state),
++		    jiffies, sp->cmd->retries));
++
++		if ((sp->state == SRB_RETRY_STATE)) {
++			__del_from_retry_queue(dest_ha, sp);
++		} else if ((sp->state == SRB_SCSI_RETRY_STATE)) {
++			__del_from_scsi_retry_queue(dest_ha, sp);
++		} else if ((sp->state == SRB_FAILOVER_STATE)) {
++			__del_from_failover_queue(dest_ha, sp);
++		}
++
++		/*
++		 * If FC_DEVICE is marked as dead return the cmd with
++		 * DID_NO_CONNECT status.  Otherwise set the host_byte to
++		 * DID_BUS_BUSY to let the OS  retry this cmd.
++		 */
++		if (dest_ha->flags.failover_enabled) {
++			cmd->result = DID_BUS_BUSY << 16;
++		} else {
++			if (atomic_read(&fcport->state) == FC_DEVICE_DEAD) {
++				cmd->result = DID_NO_CONNECT << 16;
++				qla2x00_extend_timeout(cmd, EXTEND_CMD_TIMEOUT);
++			} else {
++				cmd->result = DID_BUS_BUSY << 16;
++			}
++		}
++
++		__add_to_done_queue(dest_ha, sp);
++		processed++;
++	} 
++	spin_unlock_irqrestore(&dest_ha->list_lock, flags);
++
++	if (processed) {
++		 schedule_work(&dest_ha->run_qla_task);
++
++		 return;
++	}
++/* TODO: Remove this code!!! */
++#if defined(QL_DEBUG_LEVEL_3)
++	spin_lock_irqsave(&dest_ha->list_lock, cpu_flags);
++	if (sp->state == SRB_DONE_STATE) {
++		/* IO in done_q  -- leave it */
++		DEBUG(printk("scsi(%ld): Found in Done queue pid %ld sp=%p.\n",
++		    dest_ha->host_no, sp->cmd->serial_number, sp));
++	} else if (sp->state == SRB_SUSPENDED_STATE) {
++		DEBUG(printk("scsi(%ld): Found SP %p in suspended state  "
++		    "- pid %d:\n",
++		    dest_ha->host_no,sp,
++		    (int)sp->cmd->serial_number));
++		DEBUG(qla2x00_dump_buffer((uint8_t *)sp, sizeof(srb_t));)
++	} else if (sp->state == SRB_ACTIVE_STATE) {
++		/*
++		 * IO is with ISP find the command in our active list.
++		 */
++		spin_unlock_irqrestore(&dest_ha->list_lock, cpu_flags);
++		spin_lock_irqsave(&dest_ha->hardware_lock, flags);
++		if (sp ==
++		    dest_ha->outstanding_cmds[(u_long)CMD_HANDLE(sp->cmd)]) {
++
++			DEBUG(printk("cmd_timeout: Found in ISP \n");)
++
++			sp->state = SRB_ACTIVE_TIMEOUT_STATE;
++			spin_unlock_irqrestore(&dest_ha->hardware_lock, flags);
++		} else {
++			spin_unlock_irqrestore(&dest_ha->hardware_lock, flags);
++			printk(KERN_INFO 
++				"qla_cmd_timeout: State indicates it is with "
++				"ISP, But not in active array\n");
++		}
++		spin_lock_irqsave(&dest_ha->list_lock, cpu_flags); 	/* 01/03 */
++	} else if (sp->state == SRB_ACTIVE_TIMEOUT_STATE) {
++		DEBUG(printk("qla2100%ld: Found in Active timeout state"
++				"pid %ld, State = %x., \n",
++				dest_ha->host_no,
++				sp->cmd->serial_number, sp->state);)
++	} else {
++		/* EMPTY */
++		DEBUG2(printk("cmd_timeout%ld: LOST command state = "
++				"0x%x, sp=%p\n",
++				vis_ha->host_no, sp->state,sp);)
++
++		printk(KERN_INFO
++			"cmd_timeout: LOST command state = 0x%x\n", sp->state);
++	}
++	spin_unlock_irqrestore(&dest_ha->list_lock, cpu_flags);
++#endif
++	
++	DEBUG3(printk("cmd_timeout: Leaving\n");)
++}
++
++/*
++ * qla2x00_done_work
++ *
++ * This is a task to process completion only similar to a
++ * bottom half handler.
++ *
++ *      Input:
++ *      p -- pointer to hba struct
++ *
++ */
++void
++qla2x00_done_work(void *p)
++{
++	scsi_qla_host_t *ha = (scsi_qla_host_t *) p;
++
++	ENTER(__func__);
++
++	set_bit(TASKLET_SCHED, &ha->dpc_flags);
++
++	if (!list_empty(&ha->done_queue))
++		qla2x00_done(ha);
++	
++	clear_bit(TASKLET_SCHED, &ha->dpc_flags);
++
++	LEAVE(__func__);
++}
++
++
++/**************************************************************************
++* qla2x00_done
++*      Process completed commands.
++*
++* Input:
++*      old_ha           = adapter block pointer.
++*
++* Returns:
++* int     
++**************************************************************************/
++int
++qla2x00_done(scsi_qla_host_t *old_ha)
++{
++	os_lun_t	*lq;
++	Scsi_Cmnd	*cmd;
++	unsigned long	flags = 0;
++	scsi_qla_host_t	*ha;
++	scsi_qla_host_t	*vis_ha;
++	int	cnt;
++	int	send_marker_once = 0;
++	struct list_head	*spl, *sptemp;
++	srb_t           *sp;
++	struct	list_head local_sp_list;
++
++	ENTER(__func__);
++
++	if (test_bit(DONE_RUNNING, &old_ha->dpc_flags))
++		return (0);
++
++	set_bit(DONE_RUNNING, &old_ha->dpc_flags);
++	cnt = 0;
++
++	INIT_LIST_HEAD(&local_sp_list);
++
++	/*
++	 * Get into local queue such that we do not wind up calling done queue
++	 * takslet for the same IOs from DPC or any other place.
++	 */
++	spin_lock_irqsave(&old_ha->list_lock,flags);
++	list_for_each_safe(spl, sptemp, &old_ha->done_queue) {
++		sp = list_entry(spl, srb_t, list);
++
++		/* remove command from done list */
++		list_del_init(&sp->list);
++
++		old_ha->done_q_cnt--;
++        	sp->state = SRB_NO_QUEUE_STATE;
++
++		/* add to local queue */
++		list_add_tail(&sp->list, &local_sp_list);
++	}
++	spin_unlock_irqrestore(&old_ha->list_lock, flags);
++
++	/*
++	 * All done commands are in the local queue, now do the call back.
++	 */
++	list_for_each_safe(spl, sptemp, &local_sp_list) {
++		sp = list_entry(spl, srb_t, list);
++
++		/* remove command from local list */
++		list_del_init(&sp->list);
++
++		cnt++;
++
++		cmd = sp->cmd;
++		if (cmd == NULL)
++		 	continue;
++
++		vis_ha = (scsi_qla_host_t *)cmd->device->host->hostdata;
++		lq = sp->lun_queue;
++		ha = lq->fclun->fcport->ha;
++
++		if (sp->flags & SRB_DMA_VALID) {
++			sp->flags &= ~SRB_DMA_VALID;
++
++			/* 4.10   64 and 32 bit */
++			/* Release memory used for this I/O */
++			if (cmd->use_sg) {
++				pci_unmap_sg(ha->pdev,
++				    cmd->request_buffer,
++				    cmd->use_sg,
++				    scsi_to_pci_dma_dir(
++					    cmd->sc_data_direction));
++			} else if (cmd->request_bufflen) {
++				pci_unmap_page(ha->pdev,
++				    sp->saved_dma_handle,
++				    cmd->request_bufflen,
++				    scsi_to_pci_dma_dir(
++					    cmd->sc_data_direction));
++			}
++		}
++
++		if (!(sp->flags & SRB_IOCTL) && ha->flags.failover_enabled) {
++			/*
++			 * This routine checks for DID_NO_CONNECT to decide
++			 * whether to failover to another path or not. We only
++			 * failover on that status.
++			 */
++			if (qla2x00_fo_check(ha,sp)) {
++				if ((sp->state != SRB_FAILOVER_STATE)) {
++					/*
++					 * Retry the command on this path
++					 * several times before selecting a new
++					 * path.
++					 */
++					add_to_pending_queue_head(vis_ha, sp);
++					qla2x00_next(vis_ha);
++				}
++				else {
++					/* we failover this path */
++					qla2x00_extend_timeout(sp->cmd,
++							EXTEND_CMD_TIMEOUT);
++				}
++				continue;
++			}
++			
++		}
++
++		switch ((CMD_RESULT(cmd)>>16)) {
++			case DID_OK:
++			case DID_ERROR:
++				break;
++
++			case DID_RESET:
++				/*
++				 * Set marker needed, so we don't have to
++				 * send multiple markers
++				 */
++				if (!send_marker_once) {
++					ha->marker_needed = 1;
++					send_marker_once++;
++				}
++
++				/*
++				 * WORKAROUND
++				 *
++				 * A backdoor device-reset requires different
++				 * error handling.  This code differentiates
++				 * between normal error handling and the
++				 * backdoor method.
++				 *
++				 */
++				if (ha->host->eh_active != EH_ACTIVE)
++					CMD_RESULT(sp->cmd) =
++					    DID_BUS_BUSY << 16;
++				break;
++
++
++			case DID_ABORT:
++				sp->flags &= ~SRB_ABORT_PENDING;
++				sp->flags |= SRB_ABORTED;
++
++				if (sp->flags & SRB_TIMEOUT)
++					CMD_RESULT(cmd)= DID_TIME_OUT << 16;
++
++				break;
++
++			default:
++				DEBUG2(printk("scsi(%ld:%d:%d) %s: did_error "
++				    "= %d, comp-scsi= 0x%x-0x%x.\n",
++				    vis_ha->host_no,
++				    SCSI_TCN_32(cmd),
++				    SCSI_LUN_32(cmd),
++				    __func__,
++				    (CMD_RESULT(cmd)>>16),
++				    CMD_COMPL_STATUS(cmd),
++				    CMD_SCSI_STATUS(cmd)));
++				break;
++		}
++
++		/*
++		 * Call the mid-level driver interrupt handler -- via sp_put()
++		 */
++		sp_put(ha, sp);
++
++		qla2x00_next(vis_ha);
++
++	} /* end of while */
++	clear_bit(DONE_RUNNING, &old_ha->dpc_flags);
++
++	LEAVE(__func__);
++
++	return (cnt);
++}
++
++/*
++ * qla2x00_next
++ *	Retrieve and process next job in the LUN queue.
++ *
++ * Input:
++ *	tq = SCSI target queue pointer.
++ *	lq = SCSI LUN queue pointer.
++ *	TGT_LOCK must be already obtained.
++ *
++ * Output:
++ *	Releases TGT_LOCK upon exit.
++ *
++ * Context:
++ *	Kernel/Interrupt context.
++ * 
++ * Note: This routine will always try to start I/O from visible HBA.
++ */
++void
++qla2x00_next(scsi_qla_host_t *vis_ha) 
++{
++	scsi_qla_host_t *dest_ha;
++	fc_port_t	*fcport;
++	srb_t		*sp;
++	int		rval;
++	unsigned long   flags;
++
++	ENTER(__func__);
++
++	spin_lock_irqsave(&vis_ha->list_lock, flags);
++	while (!list_empty(&vis_ha->pending_queue)) {
++		sp = list_entry(vis_ha->pending_queue.next, srb_t, list);
++
++		fcport = sp->fclun->fcport;
++		dest_ha = fcport->ha;
++
++		/* Check if command can be started, exit if not. */
++		if (LOOP_TRANSITION(dest_ha)) {
++			break;
++		}
++
++		__del_from_pending_queue(vis_ha, sp);
++
++		/* If device is dead then send request back to OS */
++		if ((dest_ha->flags.link_down_error_enable &&
++		    atomic_read(&fcport->state) == FC_DEVICE_DEAD)) {
++
++			CMD_RESULT(sp->cmd) = DID_NO_CONNECT << 16;
++
++			if (!atomic_read(&dest_ha->loop_down_timer) &&
++			    dest_ha->loop_state == LOOP_DOWN) {
++				sp->err_id = 2;
++			} else {
++				sp->err_id = 1;
++			}
++			DEBUG3(printk("scsi(%ld): loop/port is down - "
++			    "pid=%ld, sp=%p loopid=0x%x queued to dest HBA "
++			    "scsi%ld.\n",
++			    dest_ha->host_no,
++			    sp->cmd->serial_number, sp,
++			    fcport->loop_id, dest_ha->host_no));
++			/* 
++			 * Initiate a failover - done routine will initiate.
++			 */
++			__add_to_done_queue(vis_ha, sp);
++
++			continue;
++		}
++
++		/*
++		 * SCSI Kluge: Whenever, we need to wait for an event such as
++		 * loop down (i.e. loop_down_timer ) or port down (i.e.  LUN
++		 * request qeueue is suspended) then we will recycle new
++		 * commands back to the SCSI layer.  We do this because this is
++		 * normally a temporary condition and we don't want the
++		 * mid-level scsi.c driver to get upset and start aborting
++		 * commands.  The timeout value is extracted from the command
++		 * minus 1-second and put on a retry queue (watchdog). Once the
++		 * command timeout it is returned to the mid-level with a BUSY
++		 * status, so the mid-level will retry it. This process
++		 * continues until the LOOP DOWN time expires or the condition
++		 * goes away.
++		 */
++	 	if (!(sp->flags & SRB_IOCTL) &&
++		    (atomic_read(&fcport->state) != FC_ONLINE ||
++			test_bit(ABORT_ISP_ACTIVE, &dest_ha->dpc_flags) ||
++			(dest_ha->loop_state != LOOP_READY) ||
++			(sp->flags & SRB_FAILOVER))) {
++
++			DEBUG3(printk("scsi(%ld): port=(0x%x) retry_q(%d) "
++			    "loop state = %d, loop counter = 0x%x dpc flags "
++			    "= 0x%lx\n",
++			    dest_ha->host_no,
++			    fcport->loop_id,
++			    atomic_read(&fcport->state),
++			    dest_ha->loop_state,
++			    atomic_read(&dest_ha->loop_down_timer),
++			    dest_ha->dpc_flags));
++
++			qla2x00_extend_timeout(sp->cmd, EXTEND_CMD_TIMEOUT);
++			__add_to_retry_queue(vis_ha, sp);
++
++			continue;
++		} 
++
++		/*
++		 * If this request's lun is suspended then put the request on
++		 * the  scsi_retry queue. 
++		 */
++	 	if (!(sp->flags & SRB_IOCTL) &&
++		    sp->lun_queue->q_state == LUN_STATE_WAIT) {
++			DEBUG3(printk("scsi(%ld): lun wait state - pid=%ld, "
++			    "opcode=%d, allowed=%d, retries=%d\n",
++			    dest_ha->host_no,
++			    sp->cmd->serial_number,
++			    sp->cmd->cmnd[0],
++			    sp->cmd->allowed,
++			    sp->cmd->retries));
++				
++			__add_to_scsi_retry_queue(vis_ha, sp);
++
++			continue;
++		}
++
++		sp->lun_queue->io_cnt++;
++
++		/* Release target queue lock */
++		spin_unlock_irqrestore(&vis_ha->list_lock, flags);
++
++		rval = qla2x00_start_scsi(sp);
++
++		spin_lock_irqsave(&vis_ha->list_lock, flags);
++
++		if (rval != QLA2X00_SUCCESS) {
++			/* Place request back on top of device queue */
++			/* add to the top of queue */
++			__add_to_pending_queue_head(vis_ha, sp);
++
++			sp->lun_queue->io_cnt--;
++			break;
++		}
++	}
++	spin_unlock_irqrestore(&vis_ha->list_lock, flags);
++
++	LEAVE(__func__);
++}
++
++/*
++ *  qla2x00_flush_failover_queue
++ *	Return cmds of a "specific" LUN from the failover queue with
++ *      DID_BUS_BUSY status.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *      q  = lun queue.
++ *
++ * Context:
++ *	Interrupt context.
++ */
++void
++qla2x00_flush_failover_q(scsi_qla_host_t *ha, os_lun_t *q)
++{
++	srb_t  *sp;
++	struct list_head *list, *temp;
++	unsigned long flags;
++
++	spin_lock_irqsave(&ha->list_lock, flags);
++	list_for_each_safe(list, temp, &ha->failover_queue) {
++		sp = list_entry(list, srb_t, list);
++		/*
++		 * If request originated from the same lun_q then delete it
++		 * from the failover queue 
++		 */
++		if (q == sp->lun_queue) {
++			/* Remove srb from failover queue. */
++			__del_from_failover_queue(ha,sp);
++			CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16;
++			CMD_HANDLE(sp->cmd) = (unsigned char *) NULL;
++			__add_to_done_queue(ha, sp);
++		}
++	}
++	spin_unlock_irqrestore(&ha->list_lock, flags);
++}
++
++
++/*
++ * qla2x00_reset_lun_fo_counts
++ *	Reset failover retry counts
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *
++ * Context:
++ *	Interrupt context.
++ */
++void 
++qla2x00_reset_lun_fo_counts(scsi_qla_host_t *ha, os_lun_t *lq) 
++{
++	srb_t		*tsp;
++	os_lun_t	*orig_lq;
++	struct list_head *list;
++	unsigned long	flags ;
++
++	spin_lock_irqsave(&ha->list_lock, flags);
++	/*
++	 * the pending queue.
++	 */
++	list_for_each(list,&ha->pending_queue) {
++		tsp = list_entry(list, srb_t, list);
++		orig_lq = tsp->lun_queue;
++		if (orig_lq == lq)
++			tsp->fo_retry_cnt = 0;
++	}
++	/*
++	 * the retry queue.
++	 */
++	list_for_each(list,&ha->retry_queue) {
++		tsp = list_entry(list, srb_t, list);
++		orig_lq = tsp->lun_queue;
++		if (orig_lq == lq)
++			tsp->fo_retry_cnt = 0;
++	}
++
++	/*
++	 * the done queue.
++	 */
++	list_for_each(list, &ha->done_queue) {
++		tsp = list_entry(list, srb_t, list);
++		orig_lq = tsp->lun_queue;
++		if (orig_lq == lq)
++			tsp->fo_retry_cnt = 0;
++	}
++	spin_unlock_irqrestore(&ha->list_lock, flags);
++}
++
++/*
++ *  qla2x00_failover_cleanup
++ *	Cleanup queues after a failover.
++ *
++ * Input:
++ *	sp = command pointer
++ *
++ * Context:
++ *	Interrupt context.
++ */
++static void
++qla2x00_failover_cleanup(srb_t *sp) 
++{
++	CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16;
++	CMD_HANDLE(sp->cmd) = (unsigned char *) NULL;
++
++	/* turn-off all failover flags */
++	sp->flags = sp->flags & ~(SRB_RETRY|SRB_FAILOVER|SRB_FO_CANCEL);
++}
++
++
++/*
++ *  qla2x00_process_failover
++ *	Process any command on the failover queue.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *
++ * Context:
++ *	Interrupt context.
++ */
++static void
++qla2x00_process_failover(scsi_qla_host_t *ha) 
++{
++
++	os_tgt_t	*tq;
++	os_lun_t	*lq;
++	srb_t       *sp;
++	fc_port_t *fcport;
++	struct list_head *list, *temp;
++	unsigned long flags;
++	uint32_t    t, l;
++	scsi_qla_host_t *vis_ha = NULL;
++
++	DEBUG(printk("scsi(%ld): Processing failover for hba.\n", ha->host_no));
++
++	/*
++	 * Process all the commands in the failover queue. Attempt to failover
++	 * then either complete the command as is or requeue for retry.
++	 */
++
++	/* Prevent or allow acceptance of new I/O requests. */
++	spin_lock_irqsave(&ha->list_lock, flags);
++
++	/*
++	 * Get first entry to find our visible adapter.  We could never get
++	 * here if the list is empty
++	 */
++	list = ha->failover_queue.next;
++	sp = list_entry(list, srb_t, list);
++	vis_ha = (scsi_qla_host_t *) sp->cmd->device->host->hostdata;
++	list_for_each_safe(list, temp, &ha->failover_queue) {
++		sp = list_entry(list, srb_t, list);
++
++		tq = sp->tgt_queue;
++		lq = sp->lun_queue;
++		fcport = lq->fclun->fcport;
++
++		/* Remove srb from failover queue. */
++		__del_from_failover_queue(ha, sp);
++
++		DEBUG2(printk("%s(): pid %ld retrycnt=%d\n",
++		    __func__, sp->cmd->serial_number, sp->cmd->retries));
++
++		/*** Select an alternate path ***/
++		/* 
++		 * If the path has already been change by a previous request
++		 * sp->fclun != lq->fclun
++		 */
++		if (sp->fclun != lq->fclun ||
++		    atomic_read(&fcport->state) != FC_DEVICE_DEAD) {
++
++			qla2x00_failover_cleanup(sp);
++
++		} else if (qla2x00_cfg_failover(ha,
++		    lq->fclun, tq, sp) == NULL) {
++
++			/*
++			 * We ran out of paths, so just post the status which
++			 * is already set in the cmd.
++			 */
++			printk(KERN_INFO
++			    "scsi(%ld): Ran out of paths - pid %ld\n",
++			    ha->host_no, sp->cmd->serial_number);
++		} else {
++			qla2x00_failover_cleanup(sp);
++
++		}
++		__add_to_done_queue(ha, sp);
++	} /* list_for_each_safe */
++	spin_unlock_irqrestore(&ha->list_lock,flags);
++
++	for (t = 0; t < vis_ha->max_targets; t++) {
++		if ((tq = vis_ha->otgt[t]) == NULL)
++			continue;
++		for (l = 0; l < vis_ha->max_luns; l++) {
++			if ((lq = (os_lun_t *) tq->olun[l]) == NULL)
++				continue;
++
++			if( test_and_clear_bit(LUN_MPIO_BUSY, &lq->q_flag) ) {
++				/* EMPTY */
++				DEBUG(printk("scsi(%ld): remove suspend for "
++				    "lun %d\n", ha->host_no, lq->fclun->lun));
++			}
++		}
++	}
++
++	//qla2x00_restart_queues(ha,TRUE);
++	qla2x00_restart_queues(ha, FALSE);
++
++	DEBUG(printk("%s() - done", __func__));
++}
++
++/**************************************************************************
++*   qla2x00_check_tgt_status
++*
++* Description:
++*     Checks to see if the target or loop is down.
++*
++* Input:
++*     cmd - pointer to Scsi cmd structure
++*
++* Returns:
++*   1 - if target is present
++*   0 - if target is not present
++*
++**************************************************************************/
++uint8_t
++qla2x00_check_tgt_status(scsi_qla_host_t *ha, Scsi_Cmnd *cmd)
++{
++	os_lun_t        *lq;
++	uint32_t         b, t, l;
++	fc_port_t	*fcport;
++
++	/* Generate LU queue on bus, target, LUN */
++	b = SCSI_BUS_32(cmd);
++	t = SCSI_TCN_32(cmd);
++	l = SCSI_LUN_32(cmd);
++
++	if ((lq = GET_LU_Q(ha,t,l)) == NULL) {
++		return(QL_STATUS_ERROR);
++	}
++
++	fcport = lq->fclun->fcport;
++
++	if (TGT_Q(ha, t) == NULL ||
++	    l >= ha->max_luns ||
++	    (atomic_read(&fcport->state) == FC_DEVICE_DEAD) ||
++	    (!atomic_read(&ha->loop_down_timer) &&
++		ha->loop_state == LOOP_DOWN) ||
++	    (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) ||
++	    ABORTS_ACTIVE ||
++	    ha->loop_state != LOOP_READY) {
++
++		DEBUG(printk(KERN_INFO
++		    "scsi(%ld:%2d:%2d:%2d): %s connection is down\n",
++		    ha->host_no,
++		    b, t, l,
++		    __func__));
++
++		CMD_RESULT(cmd) = DID_NO_CONNECT << 16;
++		return(QL_STATUS_ERROR);
++	}
++	return (QL_STATUS_SUCCESS);
++}
++
++/**************************************************************************
++*   qla2x00_check_port_status
++*
++* Description:
++*     Checks to see if the port or loop is down.
++*
++* Input:
++*     fcport - pointer to fc_port_t structure.
++*
++* Returns:
++*   1 - if port is present
++*   0 - if port is not present
++*
++**************************************************************************/
++uint8_t
++qla2x00_check_port_status(scsi_qla_host_t *ha, fc_port_t *fcport)
++{
++	uint32_t	port_state;
++
++	if (fcport == NULL) {
++		return(QL_STATUS_ERROR);
++	}
++
++	port_state = (uint32_t)atomic_read(&fcport->state);
++	if ((port_state != FC_ONLINE) ||
++	    (port_state == FC_DEVICE_DEAD) ||
++	    (!atomic_read(&ha->loop_down_timer) &&
++		ha->loop_state == LOOP_DOWN) ||
++	    (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) ||
++	    test_bit(CFG_ACTIVE, &ha->cfg_flags) ||
++	    ABORTS_ACTIVE || ha->loop_state != LOOP_READY) {
++
++		DEBUG(printk(KERN_INFO
++		    "scsi(%ld): Connection is down. fcport=%p.\n",
++		    ha->host_no, fcport));
++
++		return (QL_STATUS_ERROR);
++	}
++
++	return (QL_STATUS_SUCCESS);
++}
++
++/****************************************************************************/
++/* Create character driver "HbaApiDev" w dynamically allocated major number */
++/* and create "/proc/scsi/qla2x00/HbaApiNode" as the device node associated */
++/* with the major number.                                                   */
++/****************************************************************************/
++
++#define APIDEV_NODE  "HbaApiNode"
++#define APIDEV_NAME  "HbaApiDev"
++
++static int apidev_major = 0;
++static struct Scsi_Host *apidev_host = 0;
++
++static struct file_operations apidev_fops = {
++	.ioctl = apidev_ioctl,
++	.open = apidev_open,
++	.release = apidev_close,
++};
++
++static int 
++apidev_init(struct Scsi_Host *host) 
++{
++	if (apidev_host)
++		return (0);
++
++	apidev_major = register_chrdev(0, APIDEV_NAME, &apidev_fops);
++	if (0 > apidev_major) {
++		DEBUG(printk("%s(): register_chrdev rc=%d\n",
++		    __func__, apidev_major));
++
++		return (apidev_major);
++	}
++
++	apidev_host = host;
++
++	DEBUG(printk("%s(): Creating (%s) %s/%s major=%d\n",
++	    __func__,
++	    host->hostt->proc_name, host->hostt->proc_dir->name,
++	    APIDEV_NODE, apidev_major));
++
++	proc_mknod(APIDEV_NODE, 0777+S_IFCHR, host->hostt->proc_dir,
++	    (kdev_t)mk_kdev(apidev_major, 0));
++
++	return 0;
++}
++
++static int apidev_cleanup() 
++{
++	if (!apidev_host)
++		return (0);
++
++	unregister_chrdev(apidev_major,APIDEV_NAME);
++	remove_proc_entry(APIDEV_NODE,apidev_host->hostt->proc_dir);
++	apidev_host = 0;
++
++	return (0);
++}
++
++static int 
++apidev_open(struct inode *inode, struct file *file) 
++{
++	DEBUG9(printk(KERN_INFO
++	    "%s(): open MAJOR number = %d, MINOR number = %d\n",
++	    __func__, major(inode->i_rdev), minor(inode->i_rdev)));
++
++	return 0;
++}
++
++static int 
++apidev_close(struct inode *inode, struct file *file) 
++{
++	DEBUG9(printk(KERN_INFO
++	    "%s(): closed\n", __func__));
++
++	return 0;
++}
++
++static int 
++apidev_ioctl(struct inode *inode,
++    struct file *fp, unsigned int cmd, unsigned long arg) 
++{
++	/*
++	 * Since this var is not really used, use static type to conserve
++	 * stack space.
++	 */
++	static Scsi_Device dummy_scsi_device;
++
++	dummy_scsi_device.host = apidev_host;
++
++	return (qla2x00_ioctl(&dummy_scsi_device, (int)cmd, (void*)arg));
++}
++
++#define driver_template qla2x00_driver_template
++#include "scsi_module.c"
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_os.h	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,156 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.com)
++ *
++ * Portions (C) Arjan van de Ven <arjanv@redhat.com> for Red Hat, 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, 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.
++ *
++ ******************************************************************************/
++
++#ifndef __QLA_OS_H
++#define __QLA_OS_H
++
++/*
++ * Driver debug definitions.
++ */
++/* #define QL_DEBUG_LEVEL_1  */ /* Output register accesses to COM1 */
++/* #define QL_DEBUG_LEVEL_2  */ /* Output error msgs to COM1 */
++/* #define QL_DEBUG_LEVEL_3  */ /* Output function trace msgs to COM1 */
++/* #define QL_DEBUG_LEVEL_4  */ /* Output NVRAM trace msgs to COM1 */
++/* #define QL_DEBUG_LEVEL_5  */ /* Output ring trace msgs to COM1 */
++/* #define QL_DEBUG_LEVEL_6  */ /* Output WATCHDOG timer trace to COM1 */
++/* #define QL_DEBUG_LEVEL_7  */ /* Output RISC load trace msgs to COM1 */
++/* #define QL_DEBUG_LEVEL_8  */ /* Output ring saturation msgs to COM1 */
++/* #define QL_DEBUG_LEVEL_9  */ /* Output IOCTL trace msgs */
++/* #define QL_DEBUG_LEVEL_10 */ /* Output IOCTL error msgs */
++/* #define QL_DEBUG_LEVEL_11 */ /* Output Mbx Cmd trace msgs */
++/* #define QL_DEBUG_LEVEL_12 */ /* Output IP trace msgs */
++/*
++ *  Local Macro Definitions.
++ */
++#if defined(QL_DEBUG_LEVEL_1)  || defined(QL_DEBUG_LEVEL_2) || \
++    defined(QL_DEBUG_LEVEL_3)  || defined(QL_DEBUG_LEVEL_4) || \
++    defined(QL_DEBUG_LEVEL_5)  || defined(QL_DEBUG_LEVEL_6) || \
++    defined(QL_DEBUG_LEVEL_7)  || defined(QL_DEBUG_LEVEL_8) || \
++    defined(QL_DEBUG_LEVEL_9)  || defined(QL_DEBUG_LEVEL_10) || \
++    defined(QL_DEBUG_LEVEL_11) || defined(QL_DEBUG_LEVEL_12)
++    #define QL_DEBUG_ROUTINES
++#endif
++
++#include <linux/config.h>
++#ifndef QLA_MODVERSION
++#define __NO_VERSION__
++#endif
++#include <linux/module.h>
++#include <linux/version.h>
++#include <linux/init.h>
++#include <linux/string.h>
++#include <linux/errno.h>
++#include <linux/kernel.h>
++#include <linux/ioport.h>
++#include <linux/delay.h>
++#include <linux/timer.h>
++#include <linux/sched.h>
++#include <linux/pci.h>
++#include <linux/proc_fs.h>
++#include <linux/blk.h>
++#include <linux/interrupt.h>
++#include <linux/stat.h>
++#include <linux/slab.h>
++#define __KERNEL_SYSCALLS__
++#include <linux/unistd.h>
++#include <linux/smp_lock.h>
++#include <linux/bio.h>
++#include <linux/moduleparam.h>
++
++#include <asm/system.h>
++
++#include <asm/io.h>
++#include <asm/irq.h>
++#include <asm/segment.h>
++#include <asm/byteorder.h>
++#include <asm/pgtable.h>
++
++#include "scsi.h"
++#include "hosts.h"
++
++#if defined(FC_IP_SUPPORT)
++#include <linux/ip.h>
++#include <linux/if_arp.h>
++#include <linux/skbuff.h>
++#endif
++
++#include <linux/ioctl.h>
++#include <scsi/scsi_ioctl.h>
++#include <asm/uaccess.h>
++
++//TODO Fix this!!!
++/*
++* String arrays
++*/
++#define LINESIZE    256
++#define MAXARGS      26
++
++/* PCI interface definitions */
++struct qla_fw_info {
++	unsigned short	addressing;	/* addressing method used to load fw */
++#define FW_INFO_ADDR_NORMAL	0
++#define FW_INFO_ADDR_EXTENDED	1
++#define FW_INFO_ADDR_NOMORE	0xffff
++	unsigned short	*fwcode;	/* pointer to FW array */
++	unsigned short	*fwlen;		/* number of words in array */
++	unsigned short	*fwstart;	/* start address for F/W */
++	unsigned long	*lfwstart;	/* start address (long) for F/W */
++};
++struct qla_board_info {
++	char			name[9];	/* Board ID String */
++	struct qla_fw_info	*fwinfo;
++};
++
++/***********************************************************************
++* We use the Scsi_Pointer structure that's included with each command
++* SCSI_Cmnd as a scratchpad. 
++*
++* SCp is defined as follows:
++*  - SCp.ptr  -- > pointer to the SRB
++*  - SCp.this_residual  -- > HBA completion status for ioctl code. 
++*
++* Cmnd->host_scribble --> Used to hold the hba actived handle (1..255).
++***********************************************************************/
++#define	CMD_SP(Cmnd)		((Cmnd)->SCp.ptr)
++#define CMD_COMPL_STATUS(Cmnd)  ((Cmnd)->SCp.this_residual)
++#define	CMD_HANDLE(Cmnd)	((Cmnd)->host_scribble)
++/* Additional fields used by ioctl passthru */
++#define CMD_RESID_LEN(Cmnd)	((Cmnd)->SCp.buffers_residual)
++#define CMD_SCSI_STATUS(Cmnd)	((Cmnd)->SCp.Status)
++#define CMD_ACTUAL_SNSLEN(Cmnd)	((Cmnd)->SCp.Message)
++#define CMD_ENTRY_STATUS(Cmnd)	((Cmnd)->SCp.have_data_in)
++
++/*
++ * Other SCS__Cmnd members we only reference
++ */
++#define	CMD_XFRLEN(Cmnd)	(Cmnd)->request_bufflen
++#define	CMD_CDBLEN(Cmnd)	(Cmnd)->cmd_len
++#define	CMD_CDBP(Cmnd)		(Cmnd)->cmnd
++#define	CMD_SNSP(Cmnd)		(Cmnd)->sense_buffer
++#define	CMD_SNSLEN(Cmnd)	(sizeof (Cmnd)->sense_buffer)
++#define	CMD_RESULT(Cmnd)	((Cmnd)->result)
++#define	CMD_TIMEOUT(Cmnd)	((Cmnd)->timeout_per_command)
++
++#define  SCSI_BUS_32(scp)	((scp)->device->channel)
++#define  SCSI_TCN_32(scp)	((scp)->device->id)
++#define  SCSI_LUN_32(scp)	((scp)->device->lun)
++
++#endif
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_settings.h	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,80 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++/*
++ * Compile time Options:
++ *     0 - Disable and 1 - Enable
++ */
++#define MEMORY_MAPPED_IO              0
++#define STOP_ON_ERROR                 0   /* Stop on aborts and resets  */
++#define STOP_ON_RESET                 0
++#define STOP_ON_ABORT                 0
++#define QLA_SCSI_VENDOR_DIR           0 /* Decode vendor specific opcodes for direction */
++#define QLA2100_LIPTEST    	       0
++#define REQ_TRACE    		       1
++#define USE_ABORT_TGT                  1 /* Use Abort Target mbx cmd */
++
++#define DEBUG_QLA2100                 0  /* For Debug of qla2x00 */
++
++#define MPIO_SUPPORT			0
++#define VSA				0  /* Volume Set Addressing */
++
++/* 
++ * When a lun is suspended for the "Not Ready" condition
++ * then it will suspend the lun for increments of 6 sec delays.
++ * SUSPEND_COUNT is that count.
++ */
++#define SUSPEND_COUNT 	 		10  /* 6 secs * 10 retries = 60 secs */
++					
++/* Failover options */
++#define MAX_RECOVERYTIME  		10  /* Max suspend time for a lun recovery time */
++#define MAX_FAILBACKTIME  		5  /* (60) Max suspend time before failing back */
++
++#define QLA_CMD_TIMER_DELTA 	 	3
++
++#define MAX_RETRIES_OF_ISP_ABORT  	5  /*  */
++
++/*
++ * Defines the time in seconds that 
++ * the driver extends the command timeout
++ * to get around the problem where the
++ * mid-layer only allows 5 retries for commands
++ * that return BUS_BUSY
++ */
++#define EXTEND_CMD_TIMEOUT 	 	 60
++
++/*
++ * We need to hardcode this value since the firmware
++ * does not allow us to retrieve the maximum number of 
++ * IOCBs available during initializtion.
++ *
++ * Factors that affect this value include the amount of 
++ * memory on-board (HBA) and firmware IP support.
++ *
++ */
++#undef IOCB_THROTTLE_USAGE
++#undef IOCB_HIT_RATE
++#define MAX_IOCBS_AVAILBALE 	 	3000
++
++/*
++ * Some vendor subsystems do not recover properly after a device reset.  Define
++ * the following to force a logout after a successful device reset.
++ */
++#undef LOGOUT_AFTER_DEVICE_RESET
++
++#include "qla_version.h"
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_sup.c	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,560 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++#include "qla_os.h"
++#include "qla_def.h"
++
++static uint16_t qla2x00_nvram_request(scsi_qla_host_t *, uint32_t);
++
++static void qla2x00_flash_enable(scsi_qla_host_t *);
++static void qla2x00_flash_disable(scsi_qla_host_t *);
++
++uint8_t qla2x00_read_flash_byte(scsi_qla_host_t *, uint32_t);
++static void qla2x00_write_flash_byte(scsi_qla_host_t *, uint32_t, uint8_t);
++static uint8_t qla2x00_poll_flash(scsi_qla_host_t *ha,
++		uint32_t addr, uint8_t poll_data, uint8_t mid);
++static uint8_t qla2x00_program_flash_address(scsi_qla_host_t *ha,
++		uint32_t addr, uint8_t data, uint8_t mid);
++static uint8_t qla2x00_erase_flash_sector(scsi_qla_host_t *ha,
++		uint32_t addr, uint32_t sec_mask, uint8_t mid);
++
++uint8_t qla2x00_get_flash_manufacturer(scsi_qla_host_t *ha);
++uint16_t qla2x00_get_flash_version(scsi_qla_host_t *);
++uint16_t qla2x00_get_flash_image(scsi_qla_host_t *ha, uint8_t *image);
++uint16_t qla2x00_set_flash_image(scsi_qla_host_t *ha, uint8_t *image);
++
++
++/*
++ * NVRAM support routines
++ */
++
++/**
++ * qla2x00_get_nvram_word() - Calculates word position in NVRAM and calls the
++ *	request routine to get the word from NVRAM.
++ * @ha: HA context
++ * @addr: Address in NVRAM to read
++ *
++ * Returns the word read from nvram @addr.
++ */
++uint16_t
++qla2x00_get_nvram_word(scsi_qla_host_t *ha, uint32_t addr)
++{
++	uint16_t	data;
++	uint32_t	nv_cmd;
++
++	ENTER(__func__);
++
++	nv_cmd = addr << 16;
++	nv_cmd |= NV_READ_OP;
++	data = qla2x00_nvram_request(ha, nv_cmd);
++
++	DEBUG4(printk("%s(%ld): NVRAM[%lx]=%lx.\n",
++	    __func__, ha->host_no, (u_long)addr, (u_long)data));
++
++	LEAVE(__func__);
++
++	return (data);
++}
++
++/**
++ * qla2x00_nvram_request() - Sends read command to NVRAM and gets data from
++ *	NVRAM.
++ * @ha: HA context
++ * @nv_cmd: NVRAM command
++ *
++ * Bit definitions for NVRAM command:
++ *
++ *	Bit 26     = start bit
++ *	Bit 25, 24 = opcode
++ *	Bit 23-16  = address
++ *	Bit 15-0   = write data
++ *
++ * Returns the word read from nvram @addr.
++ */
++static uint16_t
++qla2x00_nvram_request(scsi_qla_host_t *ha, uint32_t nv_cmd)
++{
++	uint8_t		cnt;
++	device_reg_t	*reg = ha->iobase;
++	uint16_t	data = 0;
++	uint16_t	reg_data;
++
++	/* Send command to NVRAM. */
++	nv_cmd <<= 5;
++	for (cnt = 0; cnt < 11; cnt++) {
++		if (nv_cmd & BIT_31)
++			qla2x00_nv_write(ha, NVR_DATA_OUT);
++		else
++			qla2x00_nv_write(ha, 0);
++		nv_cmd <<= 1;
++	}
++
++	/* Read data from NVRAM. */
++	for (cnt = 0; cnt < 16; cnt++) {
++		WRT_REG_WORD(&reg->nvram, NVR_SELECT | NVR_CLOCK);
++		NVRAM_DELAY();
++		data <<= 1;
++		reg_data = RD_REG_WORD(&reg->nvram);
++		if (reg_data & NVR_DATA_IN)
++			data |= BIT_0;
++		WRT_REG_WORD(&reg->nvram, NVR_SELECT);
++		NVRAM_DELAY();
++	}
++
++	/* Deselect chip. */
++	WRT_REG_WORD(&reg->nvram, NVR_DESELECT);
++	NVRAM_DELAY();
++
++	return (data);
++}
++
++/**
++ * qla2x00_nv_write() - Clean NVRAM operations.
++ * @ha: HA context
++ */
++void
++qla2x00_nv_deselect(scsi_qla_host_t *ha)
++{
++	device_reg_t *reg = ha->iobase;
++
++	WRT_REG_WORD(&reg->nvram, NVR_DESELECT);
++	NVRAM_DELAY();
++}
++
++/**
++ * qla2x00_nv_write() - Prepare for NVRAM read/write operation.
++ * @ha: HA context
++ * @data: Serial interface selector
++ */
++void
++qla2x00_nv_write(scsi_qla_host_t *ha, uint16_t data)
++{
++	device_reg_t *reg = ha->iobase;
++
++	WRT_REG_WORD(&reg->nvram, data | NVR_SELECT);
++	NVRAM_DELAY();
++	WRT_REG_WORD(&reg->nvram, data | NVR_SELECT | NVR_CLOCK);
++	NVRAM_DELAY();
++	WRT_REG_WORD(&reg->nvram, data | NVR_SELECT);
++	NVRAM_DELAY();
++}
++
++/*
++ * Flash support routines
++ */
++
++/**
++ * qla2x00_flash_enable() - Setup flash for reading and writing.
++ * @ha: HA context
++ */
++static void
++qla2x00_flash_enable(scsi_qla_host_t *ha)
++{
++	uint16_t	data;
++	device_reg_t	*reg = ha->iobase;
++
++	data = RD_REG_WORD(&reg->ctrl_status);
++	data |= CSR_FLASH_ENABLE;
++	WRT_REG_WORD(&reg->ctrl_status, data);
++}
++
++/**
++ * qla2x00_flash_disable() - Disable flash and allow RISC to run.
++ * @ha: HA context
++ */
++static void
++qla2x00_flash_disable(scsi_qla_host_t *ha)
++{
++	uint16_t	data;
++	device_reg_t	*reg = ha->iobase;
++
++	data = RD_REG_WORD(&reg->ctrl_status);
++	data &= ~(CSR_FLASH_ENABLE);
++	WRT_REG_WORD(&reg->ctrl_status, data);
++}
++
++/**
++ * qla2x00_read_flash_byte() - Reads a byte from flash
++ * @ha: HA context
++ * @addr: Address in flash to read
++ *
++ * A word is read from the chip, but, only the lower byte is valid.
++ *
++ * Returns the byte read from flash @addr.
++ */
++uint8_t
++qla2x00_read_flash_byte(scsi_qla_host_t *ha, uint32_t addr)
++{
++	uint16_t	data;
++	uint16_t	bank_select;
++	device_reg_t	*reg = ha->iobase;
++
++	/* Setup bit 16 of flash address. */
++	bank_select = RD_REG_WORD(&reg->ctrl_status);
++	if ((addr & BIT_16) && ((bank_select & CSR_FLASH_64K_BANK) == 0)) {
++		bank_select |= CSR_FLASH_64K_BANK;
++		WRT_REG_WORD(&reg->ctrl_status, bank_select);
++	} else if (((addr & BIT_16) == 0) &&
++	    (bank_select & CSR_FLASH_64K_BANK)) {
++		bank_select &= ~(CSR_FLASH_64K_BANK);
++		WRT_REG_WORD(&reg->ctrl_status, bank_select);
++	}
++	WRT_REG_WORD(&reg->flash_address, (uint16_t)addr);
++	data = qla2x00_debounce_register(&reg->flash_data);
++
++	return ((uint8_t)data);
++}
++
++/**
++ * qla2x00_write_flash_byte() - Write a byte to flash
++ * @ha: HA context
++ * @addr: Address in flash to write
++ * @data: Data to write
++ */
++static void
++qla2x00_write_flash_byte(scsi_qla_host_t *ha, uint32_t addr, uint8_t data)
++{
++	uint16_t	bank_select;
++	device_reg_t	*reg = ha->iobase;
++
++	/* Setup bit 16 of flash address. */
++	bank_select = RD_REG_WORD(&reg->ctrl_status);
++	if ((addr & BIT_16) && ((bank_select & CSR_FLASH_64K_BANK) == 0)) {
++		bank_select |= CSR_FLASH_64K_BANK;
++		WRT_REG_WORD(&reg->ctrl_status, bank_select);
++	} else if (((addr & BIT_16) == 0) &&
++	    (bank_select & CSR_FLASH_64K_BANK)) {
++		bank_select &= ~(CSR_FLASH_64K_BANK);
++		WRT_REG_WORD(&reg->ctrl_status, bank_select);
++	}
++	WRT_REG_WORD(&reg->flash_address, (uint16_t)addr);
++	WRT_REG_WORD(&reg->flash_data, (uint16_t)data);
++}
++
++/**
++ * qla2x00_poll_flash() - Polls flash for completion.
++ * @ha: HA context
++ * @addr: Address in flash to poll
++ * @poll_data: Data to be polled
++ * @mid: Flash manufacturer ID
++ *
++ * This function polls the device until bit 7 of what is read matches data
++ * bit 7 or until data bit 5 becomes a 1.  If that hapens, the flash ROM timed
++ * out (a fatal error).  The flash book recommeds reading bit 7 again after
++ * reading bit 5 as a 1.
++ *
++ * Returns 0 on success, else non-zero.
++ */
++static uint8_t
++qla2x00_poll_flash(scsi_qla_host_t *ha,
++    uint32_t addr, uint8_t poll_data, uint8_t mid)
++{
++	uint8_t		status;
++	uint8_t		flash_data;
++	uint32_t	cnt;
++	int		failed_pass;
++
++	status = 1;
++	failed_pass = 1;
++
++	/* Wait for 30 seconds for command to finish. */
++	poll_data &= BIT_7;
++	for (cnt = 3000000; cnt; cnt--) {
++		flash_data = qla2x00_read_flash_byte(ha, addr);
++		if ((flash_data & BIT_7) == poll_data) {
++			status = 0;
++			break;
++		}
++
++		if (mid != 0x40 && mid != 0xda) {
++			if (flash_data & BIT_5)
++				failed_pass--;
++			if (failed_pass < 0)
++				break;
++		}
++		udelay(10);
++		barrier();
++	}
++	return (status);
++}
++
++/**
++ * qla2x00_program_flash_address() - Programs a flash address
++ * @ha: HA context
++ * @addr: Address in flash to program
++ * @data: Data to be written in flash
++ * @mid: Flash manufacturer ID
++ *
++ * Returns 0 on success, else non-zero.
++ */
++static uint8_t
++qla2x00_program_flash_address(scsi_qla_host_t *ha,
++    uint32_t addr, uint8_t data, uint8_t mid)
++{
++	/* Write Program Command Sequence */
++	qla2x00_write_flash_byte(ha, 0x5555, 0xaa);
++	qla2x00_write_flash_byte(ha, 0x2aaa, 0x55);
++	qla2x00_write_flash_byte(ha, 0x5555, 0xa0);
++	qla2x00_write_flash_byte(ha, addr, data);
++
++	/* Wait for write to complete. */
++	return (qla2x00_poll_flash(ha, addr, data, mid));
++}
++
++/**
++ * qla2x00_erase_flash_sector() - Erase a flash sector.
++ * @ha: HA context
++ * @addr: Flash sector to erase
++ * @sec_mask: Sector address mask
++ * @mid: Flash manufacturer ID
++ *
++ * Returns 0 on success, else non-zero.
++ */
++static uint8_t
++qla2x00_erase_flash_sector(scsi_qla_host_t *ha,
++    uint32_t addr, uint32_t sec_mask, uint8_t mid)
++{
++	/* Individual Sector Erase Command Sequence */
++	qla2x00_write_flash_byte(ha, 0x5555, 0xaa);
++	qla2x00_write_flash_byte(ha, 0x2aaa, 0x55);
++	qla2x00_write_flash_byte(ha, 0x5555, 0x80);
++	qla2x00_write_flash_byte(ha, 0x5555, 0xaa);
++	qla2x00_write_flash_byte(ha, 0x2aaa, 0x55);
++
++	if (mid == 0xda)
++		qla2x00_write_flash_byte(ha, addr & sec_mask, 0x10);
++	else
++		qla2x00_write_flash_byte(ha, addr & sec_mask, 0x30);
++
++	udelay(150);
++
++	/* Wait for erase to complete. */
++	return (qla2x00_poll_flash(ha, addr, 0x80, mid));
++}
++
++/**
++ * qla2x00_get_flash_manufacturer() - Read manufacturer ID from flash chip.
++ * @ha: HA context
++ *
++ * Returns the manufacturer's ID read from the flash chip.
++ */
++uint8_t
++qla2x00_get_flash_manufacturer(scsi_qla_host_t *ha)
++{
++	uint8_t	manuf_id;
++
++	qla2x00_write_flash_byte(ha, 0x5555, 0xaa);
++	qla2x00_write_flash_byte(ha, 0x2aaa, 0x55);
++	qla2x00_write_flash_byte(ha, 0x5555, 0x90);
++	manuf_id = qla2x00_read_flash_byte(ha, 0x0001);
++
++	return (manuf_id);
++}
++
++/**
++ * qla2x00_get_flash_version() - Read version information from flash.
++ * @ha: HA context
++ *
++ * Returns QL_STATUS_SUCCESS on successful retrieval of flash version.
++ */
++uint16_t
++qla2x00_get_flash_version(scsi_qla_host_t *ha)
++{
++	uint16_t	ret = QL_STATUS_SUCCESS;
++	uint32_t	loop_cnt = 1;  /* this is for error exit only */
++	uint32_t	pcir_adr;
++
++	ENTER(__func__);
++
++	qla2x00_flash_enable(ha);
++	do {	/* Loop once to provide quick error exit */
++		/* Match signature */
++		if (!(qla2x00_read_flash_byte(ha, 0) == 0x55 &&
++		    qla2x00_read_flash_byte(ha, 1) == 0xaa)) {
++			/* No signature */
++			DEBUG2(printk("scsi(%ld): No matching FLASH "
++			    "signature.\n", ha->host_no));
++			ret = QL_STATUS_ERROR;
++			break;
++		}
++
++		pcir_adr = qla2x00_read_flash_byte(ha, 0x18) & 0xff;
++
++		/* validate signature of PCI data structure */
++		if ((qla2x00_read_flash_byte(ha, pcir_adr)) == 'P' &&
++		    (qla2x00_read_flash_byte(ha, pcir_adr + 1)) == 'C' &&
++		    (qla2x00_read_flash_byte(ha, pcir_adr + 2)) == 'I' &&
++		    (qla2x00_read_flash_byte(ha, pcir_adr + 3)) == 'R') {
++
++			/* Read version */
++			ha->optrom_minor =
++			    qla2x00_read_flash_byte(ha, pcir_adr + 0x12);
++			ha->optrom_major =
++			    qla2x00_read_flash_byte(ha, pcir_adr + 0x13);
++			DEBUG3(printk("%s(): got %d.%d.\n",
++			    __func__, ha->optrom_major, ha->optrom_minor));
++		} else {
++			/* error */
++			DEBUG2(printk("%s(): PCI data struct not found. "
++			    "pcir_adr=%x.\n",
++			    __func__, pcir_adr));
++			ret = QL_STATUS_ERROR;
++			break;
++		}
++
++	} while (--loop_cnt);
++	qla2x00_flash_disable(ha);
++
++	LEAVE(__func__);
++
++	return (ret);
++}
++
++/**
++ * qla2x00_get_flash_image() - Read image from flash chip.
++ * @ha: HA context
++ * @image: Buffer to receive flash image
++ *
++ * Returns 0 on success, else non-zero.
++ */
++uint16_t
++qla2x00_get_flash_image(scsi_qla_host_t *ha, uint8_t *image)
++{
++	uint32_t	addr;
++	uint32_t	midpoint;
++	uint8_t		*data;
++	device_reg_t	*reg = ha->iobase;
++
++	midpoint = FLASH_IMAGE_SIZE / 2;
++
++	qla2x00_flash_enable(ha);
++	WRT_REG_WORD(&reg->nvram, 0);
++	for (addr = 0, data = image; addr < FLASH_IMAGE_SIZE; addr++, data++) {
++		if (addr == midpoint)
++			WRT_REG_WORD(&reg->nvram, NVR_SELECT);
++
++		*data = qla2x00_read_flash_byte(ha, addr);
++	}
++	qla2x00_flash_disable(ha);
++
++	return (0);
++}
++
++/**
++ * qla2x00_set_flash_image() - Write image to flash chip.
++ * @ha: HA context
++ * @image: Source image to write to flash
++ *
++ * Returns 0 on success, else non-zero.
++ */
++uint16_t
++qla2x00_set_flash_image(scsi_qla_host_t *ha, uint8_t *image)
++{
++	uint16_t	status;
++	uint32_t	addr;
++	uint32_t	midpoint;
++	uint32_t	sec_mask;
++	uint32_t	rest_addr;
++	uint8_t		mid;
++	uint8_t		sec_number;
++	uint8_t		data;
++	device_reg_t	*reg = ha->iobase;
++
++	status = 0;
++	sec_number = 0;
++
++	/* Reset ISP chip. */
++	WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
++
++	qla2x00_flash_enable(ha);
++	do {	/* Loop once to provide quick error exit */
++		/* Structure of flash memory based on manufacturer */
++		mid = qla2x00_get_flash_manufacturer(ha);
++		if (mid == 0x6d) {
++			// Am29LV001 part
++			rest_addr = 0x1fff;
++			sec_mask = 0x1e000;
++		}
++		else if (mid == 0x40) {
++			// Mostel v29c51001 part
++			rest_addr = 0x1ff;
++			sec_mask = 0x1fe00;
++		}
++		else if (mid == 0xbf) {
++			// SST39sf10 part
++			rest_addr = 0xfff;
++			sec_mask = 0x1f000;
++		}
++		else if (mid == 0xda) {
++			// Winbond W29EE011 part
++			rest_addr = 0x7f;
++			sec_mask = 0x1ff80;
++			addr = 0;
++			if (qla2x00_erase_flash_sector(ha,
++			    addr, sec_mask, mid)) {
++				status = 1;
++				break;
++			}
++		}
++		else {
++			// Am29F010 part
++			rest_addr = 0x3fff;
++			sec_mask = 0x1c000;
++		}
++
++		midpoint = FLASH_IMAGE_SIZE / 2;
++		for (addr = 0; addr < FLASH_IMAGE_SIZE; addr++) {
++			data = *image++;
++			/* Are we at the beginning of a sector? */
++			if (!(addr & rest_addr)) {
++				if (addr == midpoint)
++					WRT_REG_WORD(&reg->nvram, NVR_SELECT);
++
++				/* Then erase it */
++				if (qla2x00_erase_flash_sector(ha,
++				    addr, sec_mask, mid)) {
++					status = 1;
++					break;
++				}
++
++				sec_number++;
++			}
++			if (mid == 0x6d) {
++				if (sec_number == 1 &&
++				    (addr == (rest_addr - 1))) {
++					rest_addr = 0x0fff;
++					sec_mask   = 0x1f000;
++				}
++				else if (sec_number == 3 && (addr & 0x7ffe)) {
++					rest_addr = 0x3fff;
++					sec_mask   = 0x1c000;
++				}
++			}
++
++			if (qla2x00_program_flash_address(ha,
++			    addr, data, mid)) {
++				status = 1;
++				break;
++			}
++		}
++	} while (0);
++	qla2x00_flash_disable(ha);
++
++	return (status);
++}
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_vendor.c	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,193 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++#include "qla_os.h"
++#include "qla_def.h"
++
++/*
++ * vendor specific op codes.
++*/
++#define	UCSCSI_DCMD		0x20 /* vendor specific command */
++#define DAC_CDB_LEN		12
++#define DAC_SENSE_LEN		64
++
++#define DACMD_WRITE_CONF_ONDISK	0x4B
++#define	DACMD_WRITE_CONFIG	0x06
++#define	DACMD_WRITE_CONF2	0x3C
++#define	DACMD_WRITE_CONFLABEL	0x49 /* Write configuration label */
++#define	DACMD_WRITE_CONFIG_V3x	0x4F
++#define	DACMD_ADD_CONFIG_V2x	0x18
++#define	DACMD_ADD_CONFIG_V3x	0x4C
++#define	DACMD_STORE_IMAGE	0x21
++#define	DACMD_ADD_CAPACITY	0x2A /* add physical drives to existing array */
++#define	DACMD_WRITE_IOPORT	0x3A /* write port B */
++#define	DACMD_S2S_WRITEFULLCONF		0x60 /* write full configuration */
++#define	DACMD_S2S_ADDFULLCONF		0x62 /* add   full configuration */
++#define	DACMD_S2S_WRITELUNMAP_OLD	0x58 /* write LUN map information */
++#define DACMD_S2S_WRITELUNMAP		0xD2	/* Write LUN MAP Information */
++#define	DACMD_S2S_WRITE_IOPORT	0x66 /* write expanded IO port */
++#define	DACMD_WRITE_V3x		0x34 /* write data from plain memory */
++#define	DACMD_S2S_WRITESIG	0x4D /* write signature information */
++
++#if !defined(s08bits)
++#define	s08bits	char
++#define	s16bits	short
++#define	s32bits	int
++#define	u08bits	unsigned s08bits
++#define	u16bits	unsigned s16bits
++#define	u32bits	unsigned s32bits
++#endif
++
++typedef struct dac_command
++{
++        u08bits	mb_Command;	/* Mail Box register 0	*/
++        u08bits	mb_CmdID;	/* Mail Box register 1	*/
++        u08bits	mb_ChannelNo;	/* Mail Box register 2	*/
++        u08bits	mb_TargetID;	/* Mail Box register 3	*/
++        u08bits	mb_DevState;	/* Mail Box register 4	*/
++        u08bits	mb_MailBox5;	/* Mail Box register 5	*/
++        u08bits	mb_MailBox6;	/* Mail Box register 6	*/
++        u08bits	mb_SysDevNo;	/* Mail Box register 7	*/
++        u32bits	mb_Datap;	/* Mail Box register 8-B */
++        u08bits	mb_MailBoxC;	/* Mail Box register C	*/
++        u08bits	mb_StatusID;	/* Mail box register D	*/
++        u16bits	mb_Status;	/* Mail Box Register E,F */
++}
++dac_command_t;
++
++typedef struct	dac_scdb
++{
++        u08bits db_ChannelTarget;	/* ChannelNo 7..4 & Target 3..0 */
++        u08bits db_DATRET;		/* different bits, see below */
++        u16bits	db_TransferSize;	/* Request/done size in bytes */
++        u32bits db_PhysDatap;		/* Physical addr in host memory	*/
++        u08bits db_CdbLen;		/* 6, 10 or 12			*/
++        u08bits db_SenseLen;		/* If returned from DAC (<= 64)	*/
++        u08bits	db_Cdb[DAC_CDB_LEN];	/* The CDB itself		*/
++        u08bits	db_SenseData[DAC_SENSE_LEN];/* Result of request sense	*/
++        u08bits db_StatusIn;		/* SCSI status returned		*/
++        u08bits	db_Reserved1;
++}
++dac_scdb_t;
++
++typedef	struct dga_scdb
++{
++        u08bits	dsc_osreq[1024];	/* OS related buffer:sizeof(mdac_req_t) */
++
++        u08bits	dsc_familyctlno;	/* Controller number within family */
++        u08bits	dsc_ctlno;		/* Controller number */
++        u08bits	dsc_chno;		/* Channel number */
++        u08bits	dsc_tgt;		/* target ID */
++
++        u08bits	dsc_lun;		/* Lun ID */
++        u08bits	dsc_rebuildflag;	/* current rebuild flag */
++        u16bits	dsc_status;		/* completion status */
++
++        u08bits	dsc_scsiversion;	/* SCSI protocol version */
++        u08bits	dsc_hostctlno;		/* host system controller number */
++        u16bits	dsc_reqsenseseqno;	/* request sense sequence number */
++
++        u32bits	dsc_events;		/* # events at start */
++
++        u32bits	dsc_pollwaitchan;	/* sleep/wakeup channel */
++        u32bits	dsc_poll;		/* polling value, if =0 op complete */
++
++        struct dga_ctldev *dsc_ctp;	/* pointer back to controller */
++        void *dsc_pdp;	/* pointer back to physical device */
++        void *dsc_ldp;	/* pointer back to logical device */
++        void (*dsc_intr)(void);	/* completion call back function */
++
++        /* all save functions are used in S2S */
++        u08bits	dsc_savedcdb[DAC_CDB_LEN];/* 12 bytes saved CDB from SCSI CDB */
++        u32bits	(*dsc_statsintr)(struct dga_scdb *); /* statistics completion function */
++
++        void (*dsc_savedintr)(void);	/* completion call back function */
++        void *dsc_savedctp;		/* pointer back to controller */
++        u08bits	dsc_savedfamilyctlno;	/* Controller number within family */
++        u08bits	dsc_savedctlno;		/* Controller number */
++        u08bits	dsc_savedchno;		/* Channel number */
++        u08bits	dsc_savedtgt;		/* target ID */
++
++        u08bits	dsc_savedlun;		/* Lun ID */
++        u08bits	dsc_savedcdblen;	/* saved CDB len for SCDB */
++        u08bits	dsc_scanmode;
++        u08bits dsc_pageno;             /* pageno for data > 4K */
++        u32bits	dsc_residue;
++        u32bits	dsc_Reserved4;
++
++        dac_command_t dsc_dcmd;		/* DCMD space, 16 bytes */
++        dac_scdb_t dsc_scdb;		/* SCDB space */
++        u32bits	dsc_EventSeqNo;
++        u32bits	dsc_ReqSenseNo;
++
++        u32bits	dsc_Reserved64[16];	/* leave this for OLD SCO driver bug */
++
++        u08bits	dsc_data[256];		/* Rest is data */
++}
++dga_scdb_t;
++
++/*
++* qla2100_set_scsi_direction
++*      This routine will set the proper direction for vendor specific
++*      commands. 
++*
++*      Note: Vendors should modify this routine to set the proper 
++*      direction of the transfer if they used vendor specific commands.
++*
++* Input:
++*      ha = adapter block pointer.
++*      sp = SCSI Request Block structure pointer.
++*
++* Returns:
++*      0 = success, was able to issue command.
++*/
++void
++qla2x00_set_vend_direction(scsi_qla_host_t *ha,
++    Scsi_Cmnd *cmd, cmd_entry_t *pkt)
++{
++	dga_scdb_t	*dsp = (dga_scdb_t *) cmd;
++
++	if (cmd->data_cmnd[0] == UCSCSI_DCMD) {
++		switch( dsp->dsc_dcmd.mb_Command ) {
++		case DACMD_WRITE_CONF_ONDISK:
++		case DACMD_WRITE_CONFIG:
++		case DACMD_WRITE_CONF2:
++		case DACMD_WRITE_CONFLABEL:
++		case DACMD_WRITE_CONFIG_V3x:
++		case DACMD_ADD_CONFIG_V2x:
++		case DACMD_ADD_CONFIG_V3x:
++		case DACMD_STORE_IMAGE:
++		case DACMD_ADD_CAPACITY:
++		case DACMD_WRITE_IOPORT:
++		case DACMD_S2S_WRITEFULLCONF:
++		case DACMD_S2S_ADDFULLCONF:
++		case DACMD_S2S_WRITELUNMAP_OLD:
++		case DACMD_S2S_WRITELUNMAP:
++		case DACMD_S2S_WRITE_IOPORT:
++		case DACMD_WRITE_V3x:
++		case DACMD_S2S_WRITESIG:
++			pkt->control_flags |= BIT_6;
++			break;
++		default:
++			pkt->control_flags |= BIT_5;
++		}
++	} else
++		pkt->control_flags |= BIT_5;
++}
++
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_version.h	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,31 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++/*
++ * Driver version 
++ */
++#if DEBUG_QLA2100
++#define QLA2100_VERSION      "8.00.00b1-debug"
++#else
++#define QLA2100_VERSION      "8.00.00b1"
++#endif
++
++#define QLA_DRIVER_MAJOR_VER	8
++#define QLA_DRIVER_MINOR_VER	0
++#define QLA_DRIVER_PATCH_VER	0
++#define QLA_DRIVER_BETA_VER	1
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_xioct.c	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,6589 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++
++#include "qla_os.h"
++#include "qla_def.h"
++
++#include "inioct.h"
++
++
++#define	QLA_PT_CMD_TOV			(60) /* firmware timeout */
++#define QLA_PT_CMD_DRV_TOV		(QLA_PT_CMD_TOV + 1) /* drvr timeout */
++#define QLA_IOCTL_ACCESS_WAIT_TIME	(QLA_PT_CMD_DRV_TOV + 2) /* wait_q tov */
++#define QLA_INITIAL_IOCTLMEM_SIZE	(2 * PAGE_SIZE)
++#define QLA_IOCTL_SCRAP_SIZE		2048 /* scrap memory for local use. */
++
++/* ELS related defines */
++#define FC_HEADER_LEN		24
++#define ELS_RJT_LENGTH		0x08	/* 8  */
++#define ELS_RPS_ACC_LENGTH	0x40	/* 64 */
++#define ELS_RLS_ACC_LENGTH	0x1C	/* 28 */
++
++/* ELS cmd Reply Codes */
++#define ELS_STAT_LS_RJT		0x01
++#define ELS_STAT_LS_ACC		0x02
++
++#define IOCTL_INVALID_STATUS    0xffff
++
++
++int qla2x00_alloc_ioctl_mem(scsi_qla_host_t *);
++void qla2x00_free_ioctl_mem(scsi_qla_host_t *);
++
++int qla2x00_get_ioctl_scrap_mem(scsi_qla_host_t *, void **, uint32_t);
++void qla2x00_free_ioctl_scrap_mem(scsi_qla_host_t *);
++
++/*
++ * Local prototypes
++ */
++static int qla2x00_get_new_ioctl_dma_mem(scsi_qla_host_t *, uint32_t);
++
++#if defined(ISP2300)
++static uint8_t qla2x00_get_next_free_pub_id(scsi_qla_host_t *, uint16_t *);
++static uint8_t qla2x00_host_relogin(scsi_qla_host_t *, fcdev_t *);
++#endif
++
++static int qla2x00_find_curr_ha(uint16_t, scsi_qla_host_t **);
++
++static int qla2x00_get_driver_specifics(EXT_IOCTL *);
++
++static int qla2x00_aen_reg(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_aen_get(scsi_qla_host_t *, EXT_IOCTL *, int);
++
++static int qla2x00_query(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_query_hba_node(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_query_hba_port(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_query_disc_port(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_query_disc_tgt(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_query_chip(scsi_qla_host_t *, EXT_IOCTL *, int);
++
++static int qla2x00_get_data(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_get_statistics(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_get_fc_statistics(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_get_port_summary(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_query_driver(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_query_fw(scsi_qla_host_t *, EXT_IOCTL *, int);
++
++#if defined(ISP2300)
++static int qla2x00_send_els_passthru(scsi_qla_host_t *, EXT_IOCTL *, int);
++#endif
++static int qla2x00_send_fcct(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_start_ms_cmd(scsi_qla_host_t *, EXT_IOCTL *, srb_t *,
++    EXT_ELS_PT_REQ *);
++
++static int qla2x00_wwpn_to_scsiaddr(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_scsi_passthru(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_sc_scsi_passthru(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_sc_fc_scsi_passthru(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_sc_scsi3_passthru(scsi_qla_host_t *, EXT_IOCTL *, int);
++
++static int qla2x00_send_els_rnid(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_get_rnid_params(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_set_host_data(scsi_qla_host_t *, EXT_IOCTL *, int);
++static int qla2x00_set_rnid_params(scsi_qla_host_t *, EXT_IOCTL *, int);
++
++static void qla2x00_waitq_sem_timeout(unsigned long);
++static uint8_t qla2x00_get_ioctl_access(scsi_qla_host_t *, uint32_t);
++static uint8_t qla2x00_release_ioctl_access(scsi_qla_host_t *);
++
++static void qla2x00_wait_q_memb_alloc(scsi_qla_host_t *, wait_q_t **);
++static void qla2x00_wait_q_memb_free(scsi_qla_host_t *, wait_q_t *);
++static uint8_t qla2x00_wait_q_add(scsi_qla_host_t *, wait_q_t **);
++static void qla2x00_wait_q_get_next(scsi_qla_host_t *, wait_q_t **);
++static void qla2x00_wait_q_remove(scsi_qla_host_t *, wait_q_t *);
++
++
++/*
++ * qla2x00_ioctl_sleep_done
++ *
++ * Description:
++ *   This is the callback function to wakeup ioctl completion semaphore
++ *   for the ioctl request that is waiting.
++ *
++ * Input:
++ *   sem - pointer to the ioctl completion semaphore.
++ *
++ * Returns:
++ */
++static void
++qla2x00_ioctl_sleep_done(struct semaphore * sem)
++{
++	DEBUG9(printk("%s: entered.\n", __func__);)
++
++	if (sem != NULL){
++		DEBUG9(printk("ioctl_sleep: wake up sem.\n");)
++		up(sem);
++	}
++
++	DEBUG9(printk("%s: exiting.\n", __func__);)
++}
++
++/*
++ * qla2x00_ioctl_sem_init
++ *
++ * Description:
++ *   Initialize the ioctl timer and semaphore used to wait for passthru
++ *   completion.
++ *
++ * Input:
++ *   ha - pointer to scsi_qla_host_t structure used for initialization.
++ *
++ * Returns:
++ *   None.
++ */
++static void
++qla2x00_ioctl_sem_init(scsi_qla_host_t *ha)
++{
++	init_MUTEX_LOCKED(&ha->ioctl->cmpl_sem);
++	init_timer(&(ha->ioctl->cmpl_timer));
++	ha->ioctl->cmpl_timer.data = (unsigned long)&ha->ioctl->cmpl_sem;
++	ha->ioctl->cmpl_timer.function =
++	    (void (*)(unsigned long))qla2x00_ioctl_sleep_done;
++}
++
++/*
++ * qla2x00_scsi_pt_done
++ *
++ * Description:
++ *   Resets ioctl progress flag and wakes up the ioctl completion semaphore.
++ *
++ * Input:
++ *   pscsi_cmd - pointer to the passthru Scsi cmd structure which has completed.
++ *
++ * Returns:
++ */
++static void
++qla2x00_scsi_pt_done(Scsi_Cmnd *pscsi_cmd)
++{
++	struct Scsi_Host *host;
++	scsi_qla_host_t  *ha;
++
++	host = pscsi_cmd->device->host;
++	ha = (scsi_qla_host_t *) host->hostdata;
++
++	DEBUG9(printk("%s post function called OK\n", __func__);)
++
++	/* save detail status for IOCTL reporting */
++	ha->ioctl->SCSIPT_InProgress = 0;
++	ha->ioctl->ioctl_tov = 0;
++
++	up(&ha->ioctl->cmpl_sem);
++
++	DEBUG9(printk("%s: exiting.\n", __func__);)
++
++	return;
++}
++
++/*
++ * qla2x00_msiocb_done
++ *
++ * Description:
++ *   Resets MSIOCB ioctl progress flag and wakes up the ioctl completion
++ *   semaphore.
++ *
++ * Input:
++ *   cmd - pointer to the passthru Scsi cmd structure which has completed.
++ *
++ * Returns:
++ */
++static void
++qla2x00_msiocb_done(Scsi_Cmnd *pscsi_cmd)
++{
++	struct Scsi_Host *host;
++	scsi_qla_host_t  *ha;
++
++	host = pscsi_cmd->device->host;
++	ha = (scsi_qla_host_t *) host->hostdata;
++
++	DEBUG9(printk("%s post function called OK\n", __func__);)
++
++	ha->ioctl->MSIOCB_InProgress = 0;
++	ha->ioctl->ioctl_tov = 0;
++
++	up(&ha->ioctl->cmpl_sem);
++
++	DEBUG9(printk("%s: exiting.\n", __func__);)
++		
++	return;
++}
++
++/*************************************************************************
++ * qla2x00_ioctl
++ *
++ * Description:
++ *   Performs additional ioctl requests not satisfied by the upper levels.
++ *
++ * Returns:
++ *   ret  = 0    Success
++ *   ret != 0    Failed; detailed status copied to EXT_IOCTL structure
++ *               if possible
++ *************************************************************************/
++int
++qla2x00_ioctl(Scsi_Device *dev, int cmd, void *arg)
++{
++	int		mode = 0;
++	int		tmp_rval = 0;
++	int		ret = -EINVAL;
++
++	uint8_t		*temp;
++	uint8_t		tempbuf[8];
++	uint32_t	i;
++	uint32_t	status;
++
++	EXT_IOCTL	*pext;
++
++	scsi_qla_host_t	*ha;
++
++
++	DEBUG9(printk("%s: entry to command (%x), arg (%p)\n",
++	    __func__, cmd, arg);)
++
++	/* Catch any non-exioct ioctls */
++	if (_IOC_TYPE(cmd) != QLMULTIPATH_MAGIC) {
++		return (ret);
++	}
++
++	ret = verify_area(VERIFY_READ, (void *)arg, sizeof(EXT_IOCTL));
++	if (ret) {
++		DEBUG9_10(printk("%s: ERROR VERIFY_READ EXT_IOCTL "
++		    "sturct. cmd=%d arg=%p.\n", __func__, cmd, arg);)
++		return (ret);
++	}
++
++	/* Allocate ioctl structure buffer to support multiple concurrent
++	 * entries.
++	 */
++	pext = KMEM_ZALLOC(sizeof(EXT_IOCTL), 16);
++	if (pext == NULL) {
++		/* error */
++		printk(KERN_WARNING
++		    "qla2x00: ERROR in main ioctl buffer allocation.\n");
++		return (-ENOMEM);
++	}
++
++	/* copy in application layer EXT_IOCTL */
++	ret = copy_from_user(pext, arg, sizeof(EXT_IOCTL));
++	if (ret) {
++		DEBUG9_10(printk("%s: ERROR COPY_FROM_USER "
++		    "EXT_IOCTL sturct. cmd=%d arg=%p.\n",
++		    __func__, cmd, arg);)
++
++		KMEM_FREE(pext, sizeof(EXT_IOCTL));
++		return (ret);
++	}
++
++	/* Verify before update status fields in EXT_IOCTL struct. */
++	ret = verify_area(VERIFY_WRITE, (void *)arg, sizeof(EXT_IOCTL));
++	if (ret) {
++		DEBUG9_10(printk("%s: ERROR VERIFY_WRITE EXT_IOCTL "
++		    "sturct. cmd=%d arg=%p.\n", __func__, cmd, arg);)
++
++		KMEM_FREE(pext, sizeof(EXT_IOCTL));
++		return (ret);
++	}
++
++	/* check signature of this ioctl */
++	temp = (uint8_t *) &pext->Signature;
++
++	for (i = 0; i < 4; i++, temp++)
++		tempbuf[i] = *temp;
++
++	if ((tempbuf[0] == 'Q') && (tempbuf[1] == 'L') &&
++	    (tempbuf[2] == 'O') && (tempbuf[3] == 'G'))
++		status = 0;
++	else
++		status = 1;
++
++	if (status != 0) {
++		DEBUG9_10(printk("%s: signature did not match. "
++		    "cmd=%d arg=%p.\n", __func__, cmd, arg);)
++		pext->Status = EXT_STATUS_INVALID_PARAM;
++		copy_to_user((void *)arg, (void *)pext, sizeof(EXT_IOCTL));
++
++		KMEM_FREE(pext, sizeof(EXT_IOCTL));
++		return (-EINVAL);
++	}
++
++	/* check version of this ioctl */
++	if (pext->Version > EXT_VERSION) {
++		printk(KERN_WARNING
++		    "qla2x00: ioctl interface version not supported = %d.\n",
++		    pext->Version);
++		pext->Status = EXT_STATUS_UNSUPPORTED_VERSION;
++		copy_to_user((void *)arg, (void *)pext, sizeof(EXT_IOCTL));
++
++		KMEM_FREE(pext, sizeof(EXT_IOCTL));
++		return (-EINVAL);
++	}
++
++	/* check for special cmds used during application's setup time. */
++	switch (cmd) {
++	case EXT_CC_STARTIOCTL:
++		DEBUG9(printk("%s: got startioctl command.\n", __func__);)
++
++		pext->Instance = num_hosts;
++		pext->Status = EXT_STATUS_OK;
++		ret = copy_to_user((void *)arg, (void *)pext,
++		    sizeof(EXT_IOCTL));
++
++		KMEM_FREE(pext, sizeof(EXT_IOCTL));
++		return (ret);
++
++	case EXT_CC_SETINSTANCE:
++		/* This call is used to return the HBA's host number to
++		 * ioctl caller.  All subsequent ioctl commands will put
++		 * the host number in HbaSelect field to tell us which
++		 * HBA is the destination.
++		 */
++		if (pext->Instance < num_hosts) {
++			if (!((uint32_t)pext->VendorSpecificData &
++			    EXT_DEF_USE_HBASELECT)) {
++				/* Backward compatible code. */
++				apiHBAInstance = pext->Instance;
++			}
++
++			/*
++			 * Return host number via pext->HbaSelect for
++			 * specified API instance number.
++			 */
++			if (qla2x00_find_curr_ha(pext->Instance, &ha) != 0) {
++				pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++				ret = copy_to_user(arg, pext, sizeof(EXT_IOCTL));
++				DEBUG9_10(printk("%s: SETINSTANCE invalid inst "
++				    "%d. num_hosts=%d ha=%p ret=%d.\n",
++				    __func__, pext->Instance, num_hosts, ha,
++				    ret);)
++
++				KMEM_FREE(pext, sizeof(EXT_IOCTL));
++				return (ret); /* ioctl completed ok */
++			}
++
++			pext->HbaSelect = ha->host_no;
++			pext->Status = EXT_STATUS_OK;
++
++			DEBUG9(printk("%s: Matching instance %d to hba "
++			    "%ld.\n", __func__, pext->Instance, ha->host_no);)
++		} else {
++			DEBUG9_10(printk("%s: ERROR EXT_SETINSTANCE."
++			    " Instance=%d num_hosts=%d ha=%p.\n",
++			    __func__, pext->Instance, num_hosts, ha);)
++
++			pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		}
++		ret = copy_to_user(arg, pext, sizeof(EXT_IOCTL));
++		KMEM_FREE(pext, sizeof(EXT_IOCTL));
++
++		DEBUG9(printk("%s: SETINSTANCE exiting. ret=%d.\n",
++		    __func__, ret);)
++
++		return (ret);
++
++	case EXT_CC_DRIVER_SPECIFIC:
++		ret = qla2x00_get_driver_specifics(pext);
++		tmp_rval = copy_to_user(arg, (void *)pext, sizeof(EXT_IOCTL));
++
++		if (ret == 0)
++			ret = tmp_rval;
++
++		KMEM_FREE(pext, sizeof(EXT_IOCTL));
++		return (ret);
++
++	default:
++		break;
++	}
++
++	if (!((uint32_t)pext->VendorSpecificData & EXT_DEF_USE_HBASELECT)) {
++		/* Backward compatible code. */
++		/* Will phase out soon. */
++
++		/* Check for valid apiHBAInstance (set previously by
++		 * EXT_SETINSTANCE or default 0)  and set ha context
++		 * for this IOCTL.
++		 */
++		if (qla2x00_find_curr_ha(apiHBAInstance, &ha) != 0) {
++
++			DEBUG9_10(printk("%s: ERROR matching apiHBAInstance "
++			    "%d to an HBA Instance.\n",
++			    __func__, pext->HbaSelect);)
++
++			pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++			copy_to_user(arg, pext, sizeof(EXT_IOCTL));
++
++			KMEM_FREE(pext, sizeof(EXT_IOCTL));
++			return (-EINVAL);
++		}
++
++		DEBUG9(printk("%s: active apiHBAInstance=%d host_no=%ld "
++		    "CC=%x SC=%x.\n",
++		    __func__, apiHBAInstance, ha->host_no, cmd, pext->SubCode);)
++
++	} else {
++		/* Use HbaSelect value to get a matching ha instance
++		 * for this ioctl command.
++		 */
++		if (qla2x00_find_curr_ha(pext->HbaSelect, &ha) != 0) {
++
++			DEBUG9_10(printk("%s: ERROR matching pext->HbaSelect "
++			    "%d to an HBA Instance.\n",
++			    __func__, pext->HbaSelect);)
++
++			pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++			copy_to_user(arg, pext, sizeof(EXT_IOCTL));
++
++			KMEM_FREE(pext, sizeof(EXT_IOCTL));
++			return (-EINVAL);
++		}
++
++		DEBUG9(printk("%s: active host_inst=%ld CC=%x SC=%x.\n",
++		    __func__, ha->instance, cmd, pext->SubCode);)
++	}
++
++	/*
++	 * Get permission to process ioctl command. Only one will proceed
++	 * at a time.
++	 */
++	if (qla2x00_get_ioctl_access(ha, QLA_IOCTL_ACCESS_WAIT_TIME) != 0) {
++		/* error timed out */
++		DEBUG9_10(printk("%s: ERROR timeout getting ioctl "
++		    "access. host no=%d.\n", __func__, pext->HbaSelect);)
++
++		pext->Status = EXT_STATUS_BUSY;
++		copy_to_user(arg, pext, sizeof(EXT_IOCTL));
++
++		KMEM_FREE(pext, sizeof(EXT_IOCTL));
++		return (-EBUSY);
++	}
++
++
++	while (test_bit(CFG_ACTIVE, &ha->cfg_flags) || ha->dpc_active) {
++		if( signal_pending(current) )
++			break;   /* get out */
++
++		set_current_state(TASK_INTERRUPTIBLE);
++		schedule_timeout(HZ);
++	}
++
++	switch (cmd) { /* switch on EXT IOCTL COMMAND CODE */
++
++	case EXT_CC_QUERY:
++		DEBUG9(printk("%s: got query command.\n", __func__);)
++
++		ret = qla2x00_query(ha, pext, 0);
++
++		break;
++
++	case EXT_CC_GET_DATA:
++		DEBUG9(printk("%s: got get_data command.\n", __func__);)
++
++		ret = qla2x00_get_data(ha, pext, 0);
++
++		break;
++
++	case EXT_CC_SEND_FCCT_PASSTHRU:
++		DEBUG9(printk("%s: got CT passthru cmd.\n", __func__));
++
++		ret = qla2x00_send_fcct(ha, pext, 0);
++
++		break;
++
++	case EXT_CC_SEND_SCSI_PASSTHRU:
++		DEBUG9(printk("%s: got SCSI passthru cmd.\n", __func__));
++
++		ret = qla2x00_scsi_passthru(ha, pext, mode);
++
++		break;
++
++	case EXT_CC_REG_AEN:
++		ret = qla2x00_aen_reg(ha, pext, mode);
++
++		break;
++
++	case EXT_CC_GET_AEN:
++		ret = qla2x00_aen_get(ha, pext, mode);
++
++		break;
++
++	case EXT_CC_WWPN_TO_SCSIADDR:
++		ret = qla2x00_wwpn_to_scsiaddr(ha, pext, 0);
++		break;
++
++	case EXT_CC_SEND_ELS_RNID:
++		ret = qla2x00_send_els_rnid(ha, pext, mode);
++		break;
++
++	case EXT_CC_SET_DATA:
++		ret = qla2x00_set_host_data(ha, pext, mode);
++		break;                                                          
++
++	case INT_CC_READ_NVRAM:
++		ret = qla2x00_read_nvram(ha, pext, mode);
++
++		break;
++
++	case INT_CC_UPDATE_NVRAM:
++		ret = qla2x00_update_nvram(ha, pext, mode);
++
++		break;
++
++	case INT_CC_LOOPBACK:
++		ret = qla2x00_send_loopback(ha, pext, mode);
++
++		break;
++
++	case INT_CC_READ_OPTION_ROM:
++		ret = qla2x00_read_option_rom(ha, pext, mode);
++
++		break;
++
++	case INT_CC_UPDATE_OPTION_ROM:
++		ret = qla2x00_update_option_rom(ha, pext, mode);
++
++		break;
++
++#if defined(ISP2300)
++	case EXT_CC_SEND_ELS_PASSTHRU:
++		DEBUG9(printk("%s: got ELS passthru cmd.\n", __func__));
++
++		ret = qla2x00_send_els_passthru(ha, pext, 0);
++
++		break;
++#endif
++
++	/* all others go here */
++	/*
++	   case EXT_CC_PLATFORM_REG:
++	   break;
++	 */
++
++	/* Failover IOCTLs */
++	case FO_CC_GET_PARAMS:
++	case FO_CC_SET_PARAMS:
++	case FO_CC_GET_PATHS:
++	case FO_CC_SET_CURRENT_PATH:
++	case FO_CC_RESET_HBA_STAT:
++	case FO_CC_GET_HBA_STAT:
++	case FO_CC_GET_LUN_DATA:
++	case FO_CC_SET_LUN_DATA:
++	case FO_CC_GET_TARGET_DATA:
++	case FO_CC_SET_TARGET_DATA:
++		DEBUG9(printk("%s: failover arg (%p):\n", __func__, arg);)
++
++		qla2x00_fo_ioctl(ha, cmd, pext, mode);
++
++		break;
++
++	default:
++		pext->Status = EXT_STATUS_INVALID_REQUEST;
++		break;
++
++	} /* end of CC decode switch */
++
++	/* Always try to copy values back regardless what happened before. */
++	tmp_rval = copy_to_user(arg, (void *)pext, sizeof(EXT_IOCTL));
++
++	if (ret == 0)
++		ret = tmp_rval;
++
++	DEBUG9(printk("%s: exiting. tmp_rval(%d) ret(%d)\n",
++	    __func__, tmp_rval, ret);)
++
++	qla2x00_release_ioctl_access(ha);
++
++	KMEM_FREE(pext, sizeof(EXT_IOCTL));
++	return (ret);
++}
++
++/*
++ * qla2x00_alloc_ioctl_mem
++ *	Allocates memory needed by IOCTL code.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_alloc_ioctl_mem(scsi_qla_host_t *ha)
++{
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	if (qla2x00_get_new_ioctl_dma_mem(ha, QLA_INITIAL_IOCTLMEM_SIZE) !=
++	    QL_STATUS_SUCCESS) {
++		printk(KERN_WARNING
++		    "qla2x00: ERROR in ioctl physical memory allocation\n");
++
++		return QL_STATUS_RESOURCE_ERROR;
++	}
++
++	/* Allocate context memory buffer */
++	ha->ioctl = KMEM_ZALLOC(sizeof(hba_ioctl_context), 11);
++	if (ha->ioctl == NULL) {
++		/* error */
++		printk(KERN_WARNING
++		    "qla2x00: ERROR in ioctl context allocation.\n");
++		return QL_STATUS_RESOURCE_ERROR;
++	}
++
++	/* Allocate AEN tracking buffer */
++	ha->ioctl->aen_tracking_queue =
++	    KMEM_ZALLOC(EXT_DEF_MAX_AEN_QUEUE * sizeof(EXT_ASYNC_EVENT), 12);
++	if (ha->ioctl->aen_tracking_queue == NULL) {
++		printk(KERN_WARNING
++		    "qla2x00: ERROR in ioctl aen_queue allocation.\n");
++		return QL_STATUS_RESOURCE_ERROR;
++	}
++
++	ha->ioctl->ioctl_tq = KMEM_ZALLOC(sizeof(os_tgt_t), 13);
++	if (ha->ioctl->ioctl_tq == NULL) {
++		printk(KERN_WARNING
++		    "qla2x00: ERROR in ioctl tgt queue allocation.\n");
++		return QL_STATUS_RESOURCE_ERROR;
++	}
++
++	ha->ioctl->ioctl_lq = KMEM_ZALLOC(sizeof(os_lun_t), 14);
++	if (ha->ioctl->ioctl_lq == NULL) {
++		printk(KERN_WARNING
++		    "qla2x00: ERROR in ioctl lun queue allocation.\n");
++		return QL_STATUS_RESOURCE_ERROR;
++	}
++	/*INIT_LIST_HEAD(&(ha->ioctl->ioctl_lq->cmd));*/
++
++	/* Pick the largest size we'll need per ha of all ioctl cmds.
++	 * Use this size when freeing.
++	 */
++	ha->ioctl->scrap_mem = KMEM_ZALLOC(QLA_IOCTL_SCRAP_SIZE, 15);
++	if (ha->ioctl->scrap_mem == NULL) {
++		printk(KERN_WARNING
++		    "qla2x00: ERROR in ioctl scrap_mem allocation.\n");
++		return QL_STATUS_RESOURCE_ERROR;
++	}
++	ha->ioctl->scrap_mem_size = QLA_IOCTL_SCRAP_SIZE;
++	ha->ioctl->scrap_mem_used = 0;
++	DEBUG9(printk("%s(%ld): scrap_mem_size=%d.\n",
++	    __func__, ha->host_no, ha->ioctl->scrap_mem_size);)
++
++	ha->ioctl->ioctl_lq->q_state = LUN_STATE_READY;
++	ha->ioctl->ioctl_lq->q_lock = SPIN_LOCK_UNLOCKED;
++
++	/* Init wait_q fields */
++	ha->ioctl->wait_q_lock = SPIN_LOCK_UNLOCKED;
++
++ 	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++ 	    __func__, ha->host_no, ha->instance);)
++  
++ 	return QL_STATUS_SUCCESS;
++}
++
++/*
++ * qla2x00_get_new_ioctl_dma_mem
++ *	Allocates dma memory of the specified size.
++ *	This is done to replace any previously allocated ioctl dma buffer.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_get_new_ioctl_dma_mem(scsi_qla_host_t *ha, uint32_t size)
++{
++	DEBUG9(printk("%s entered.\n", __func__);)
++
++	if (ha->ioctl_mem) {
++		DEBUG9(printk("%s: ioctl_mem was previously allocated. "
++		    "Dealloc old buffer.\n", __func__);)
++
++	 	/* free the memory first */
++	 	pci_free_consistent(ha->pdev, ha->ioctl_mem_size, ha->ioctl_mem,
++		    ha->ioctl_mem_phys);
++	}
++
++	/* Get consistent memory allocated for ioctl I/O operations. */
++	ha->ioctl_mem = pci_alloc_consistent(ha->pdev,
++	    size, &ha->ioctl_mem_phys);
++
++	if (ha->ioctl_mem == NULL) {
++		printk(KERN_WARNING
++		    "%s: ERROR in ioctl physical memory allocation. "
++		    "Requested length=%x.\n", __func__, size);
++
++		ha->ioctl_mem_size = 0;
++		return QL_STATUS_RESOURCE_ERROR;
++	}
++	ha->ioctl_mem_size = size;
++
++	DEBUG9(printk("%s exiting.\n", __func__);)
++
++	return QL_STATUS_SUCCESS;
++}
++
++/*
++ * qla2x00_free_ioctl_mem
++ *	Frees memory used by IOCTL code for the specified ha.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *
++ * Context:
++ *	Kernel context.
++ */
++void
++qla2x00_free_ioctl_mem(scsi_qla_host_t *ha)
++{
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	if (ha->ioctl != NULL) {
++
++		if (ha->ioctl->scrap_mem != NULL) {
++			/* The size here must match up to what we
++			 * allocated before.
++			 */
++			KMEM_FREE(ha->ioctl->scrap_mem,
++			    ha->ioctl->scrap_mem_size);
++			ha->ioctl->scrap_mem = NULL;
++			ha->ioctl->scrap_mem_size = 0;
++		}
++
++		if (ha->ioctl->ioctl_tq != NULL) {
++			KMEM_FREE(ha->ioctl->ioctl_tq, sizeof(os_tgt_t));
++			ha->ioctl->ioctl_tq = NULL;
++		}
++
++		if (ha->ioctl->ioctl_lq != NULL) {
++			KMEM_FREE(ha->ioctl->ioctl_lq, sizeof(os_lun_t));
++			ha->ioctl->ioctl_lq = NULL;
++		}
++
++		if (ha->ioctl->aen_tracking_queue != NULL) {
++			KMEM_FREE(ha->ioctl->aen_tracking_queue,
++			    EXT_DEF_MAX_AEN_QUEUE * sizeof(EXT_ASYNC_EVENT));
++			ha->ioctl->aen_tracking_queue = NULL;
++		}
++
++		KMEM_FREE(ha->ioctl, sizeof(hba_ioctl_context));
++		ha->ioctl = NULL;
++	}
++
++	/* free memory allocated for ioctl operations */
++	pci_free_consistent(ha->pdev, ha->ioctl_mem_size, ha->ioctl_mem,
++	    ha->ioctl_mem_phys);
++	ha->ioctl_mem = NULL;
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++}
++
++/*
++ * qla2x00_get_ioctl_scrap_mem
++ *	Returns pointer to memory of the specified size from the scrap buffer.
++ *	This can be called multiple times before the free call as long
++ *	as the memory is to be used by the same ioctl command and
++ *	there's still memory left in the scrap buffer.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	ppmem = pointer to return a buffer pointer.
++ *	size = size of buffer to return.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++int
++qla2x00_get_ioctl_scrap_mem(scsi_qla_host_t *ha, void **ppmem, uint32_t size)
++{
++	int		ret = QL_STATUS_SUCCESS;
++	uint32_t	free_mem;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered. size=%d.\n",
++	    __func__, ha->host_no, ha->instance, size);)
++
++	free_mem = ha->ioctl->scrap_mem_size - ha->ioctl->scrap_mem_used;
++	if (free_mem >= size) {
++		*ppmem = ha->ioctl->scrap_mem + ha->ioctl->scrap_mem_used;
++		ha->ioctl->scrap_mem_used += size;
++	} else {
++		DEBUG10(printk("%s(%ld): no more scrap memory.\n",
++		    __func__, ha->host_no);)
++
++		ret = QL_STATUS_ERROR;
++	}
++
++	DEBUG9(printk("%s(%ld): exiting. ret=%d.\n",
++	    __func__, ha->host_no, ret);)
++
++	return (ret);
++}
++
++/*
++ * qla2x00_free_ioctl_scrap_mem
++ *	Makes the entire scrap buffer free for use.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ */
++void
++qla2x00_free_ioctl_scrap_mem(scsi_qla_host_t *ha)
++{
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	memset(ha->ioctl->scrap_mem, 0, ha->ioctl->scrap_mem_size);
++	ha->ioctl->scrap_mem_used = 0;
++
++	DEBUG9(printk("%s(%ld): exiting.\n",
++	    __func__, ha->host_no);)
++}
++
++#if defined(ISP2300)
++/*
++ * qla2x00_get_next_free_pub_id
++ *	Find the next free public loop ID to use, starting from the old
++ *	loop ID passed in.  If the old loop ID is invalid, this function
++ *	will start the search from beginning.
++ *
++ * Input:
++ *	ha		= adapter block pointer.
++ *	ploop_id	= pointer to a 16bit var containing the old loop
++ *			ID which is also to be used to get the new loop ID.
++ *
++ * Returns:
++ *      QL_STATUS_SUCCESS - Found an usable loop ID
++ *      QL_STATUS_RESOURCE_ERROR - No more free loop ID
++ */
++static uint8_t
++qla2x00_get_next_free_pub_id(scsi_qla_host_t *ha, uint16_t *ploop_id)
++{
++	uint8_t		retval = QL_STATUS_SUCCESS;
++	uint16_t	index;
++	uint16_t	old_id;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	old_id = *ploop_id;
++	if (old_id >= LAST_SNS_LOOP_ID) {
++		/* set a starting point */
++		old_id = ha->min_external_loopid;
++	}
++
++	for (index = old_id; index < LAST_SNS_LOOP_ID; index++) {
++		if (!ha->fabricid[index].in_use) {
++			ha->fabricid[index].in_use = TRUE;
++			*ploop_id = index;
++			DEBUG9(printk("%s(%ld): found Lid %02x.\n",
++			    __func__, ha->host_no, index);)
++			break;
++		}
++	}
++	if (index >= LAST_SNS_LOOP_ID) {
++		/* no more free ID */
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR no more free LID "
++		    "available.\n", __func__, ha->host_no, ha->instance);)
++
++		retval = QL_STATUS_RESOURCE_ERROR;
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting. retval=%d.\n",
++	     __func__, ha->host_no, ha->instance, retval);)
++
++	return retval;
++}
++
++/*
++ * qla2x00_host_relogin
++ *	Issue fabric login command to a host in the host_db which
++ *	had somehow been lost before. All updates are passed back
++ *	via pdevice. No update will be done to any of ha's database.
++ *
++ * Input:
++ *	ha = adapter block pointer.
++ *	pdevice = pointer to FC device type structure.
++ *
++ * Returns:
++ *      QL_STATUS_SUCCESS - Login successfully
++ *      QL_STATUS_ERROR - Login failed
++ *      QL_STATUS_FATAL_ERROR - Fatal error
++ */
++static uint8_t
++qla2x00_host_relogin(scsi_qla_host_t *ha, fcdev_t *pdevice) 
++{
++	uint8_t		retval = QL_STATUS_SUCCESS;
++	uint16_t	status[3];
++	uint16_t	tmp_loop_id;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	/* pdevice->loop_id is assumed to be straight from the current
++	 * database content.
++	 */
++	tmp_loop_id = pdevice->loop_id & 0xff;
++	if (tmp_loop_id >= LAST_SNS_LOOP_ID) {
++		/* Invalid value.  We need to find a valid ID to use. */
++		if (qla2x00_get_next_free_pub_id(ha, &tmp_loop_id) != 0) {
++			/* no more free IDs to use */
++			DEBUG9_10(printk("%s(%ld): inst=%ld no free loop_id "
++			    " available for login.\n",
++			    __func__, ha->host_no, ha->instance);)
++
++			return QL_STATUS_ERROR;
++		}
++	}
++
++	for (;;) {
++		DEBUG9(printk("%s(%ld): Login w/loop id 0x%02x for port "
++		    "%02x%02x%02x\n",
++		    __func__, ha->host_no, pdevice->loop_id,
++		    pdevice->d_id.b.domain,
++		    pdevice->d_id.b.area,
++		    pdevice->d_id.b.al_pa));
++
++		/* Login device on switch. */
++		qla2x00_login_fabric(ha,
++		    tmp_loop_id, pdevice->d_id.b.domain,
++		    pdevice->d_id.b.area, pdevice->d_id.b.al_pa, 
++		    &status[0], 0);
++
++		if (status[0] != MBS_CMD_CMP &&
++		    status[0] != MBS_PORT_ID_IN_USE &&
++		    status[0] != MBS_LOOP_ID_IN_USE) {
++
++	 		DEBUG9_10(printk("%s(%ld): inst=%ld "
++			    "ERROR login status[0]=%x status[1]=%x.\n",
++			    __func__, ha->host_no, ha->instance, status[0],
++			    status[1]);)
++
++			retval = QL_STATUS_FATAL_ERROR;
++			break;
++		}
++
++		if (status[0] == MBS_CMD_CMP) {
++			DEBUG9(printk("%s(%ld): inst=%ld "
++			    " host login success; loop_id=%x.\n",
++			    __func__, ha->host_no, ha->instance, tmp_loop_id);)
++
++			pdevice->loop_id = tmp_loop_id;
++			retval = QL_STATUS_SUCCESS;
++			break;
++
++		} else if (status[0] == MBS_PORT_ID_IN_USE) {
++			ha->fabricid[tmp_loop_id].in_use = FALSE;
++			tmp_loop_id = status[1];
++
++			DEBUG9(printk("%s(%ld): inst=%ld "
++			    "port %02x%02x%02x already using loop id=0x%02x in "
++			    "f/w database. Retrying.\n",
++			    __func__, ha->host_no, ha->instance,
++			    pdevice->d_id.b.domain,
++			    pdevice->d_id.b.area,
++			    pdevice->d_id.b.al_pa,
++			    tmp_loop_id);)
++
++			if (tmp_loop_id <= LAST_SNS_LOOP_ID) {
++				ha->fabricid[tmp_loop_id].in_use = TRUE;
++			} else {
++				/* Error */
++				DEBUG9_10(printk("%s(%ld): inst=%ld "
++				    "PORT_ID_IN_USE - invalid loop id %02x "
++				    "returned.\n",
++				    __func__, ha->host_no, ha->instance,
++				    pdevice->loop_id);)
++				retval = QL_STATUS_ERROR;
++				break;
++			}
++
++		} else if (status[0] == MBS_LOOP_ID_IN_USE) {
++			/* loop id already used by others; try another one */
++			DEBUG9_10(printk("%s(%ld): inst=%ld "
++			    "loop id %02x already used.\n",
++			    __func__, ha->host_no, ha->instance,
++			    pdevice->loop_id);)
++
++			/* Search for another usable loop_id */
++			if (qla2x00_get_next_free_pub_id(ha,
++			    &tmp_loop_id) == 0) {
++
++				DEBUG9(printk("%s(%ld): previous loop "
++				    "id in use. Retry with 0x%02x.\n",
++				    __func__, ha->host_no, tmp_loop_id);)
++
++				ha->fabricid[tmp_loop_id].in_use = TRUE;
++			} else {
++				/* Error */
++				DEBUG9_10(printk("%s(%ld): inst=%ld loop id "
++				    "in use; no more free loop id.\n",
++				    __func__, ha->host_no, ha->instance);)
++
++				retval = QL_STATUS_ERROR;
++				break;
++			}
++		}
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting. retval=%d.\n",
++	     __func__, ha->host_no, ha->instance, retval);)
++
++	return (retval);
++}
++#endif
++
++/*
++ * qla2x00_find_curr_ha
++ *	Searches and returns the pointer to the adapter host_no specified.
++ *
++ * Input:
++ *	host_inst = driver internal adapter instance number to search.
++ *	ha = adapter state pointer of the instance requested.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_find_curr_ha(uint16_t host_inst, scsi_qla_host_t **ret_ha)
++{
++	int	rval = QL_STATUS_SUCCESS;
++	int	found;
++	struct list_head *hal;
++	scsi_qla_host_t *search_ha = NULL;
++
++	/*
++ 	 * Set ha context for this IOCTL by matching host_no.
++	 */
++	found = 0;
++	read_lock(&qla_hostlist_lock);
++	list_for_each(hal, &qla_hostlist) {
++		search_ha = list_entry(hal, scsi_qla_host_t, list);
++
++		if (search_ha->instance == host_inst) {
++			found++;
++			break;
++		}
++	}
++	read_unlock(&qla_hostlist_lock);
++
++	if (!found) {
++ 		DEBUG10(printk("%s: ERROR matching host_inst "
++ 		    "%d to an HBA Instance.\n", __func__, host_inst);)
++		rval = QL_STATUS_ERROR;
++	} else {
++		DEBUG9(printk("%s: found matching host_inst "
++		    "%d to an HBA Instance.\n", __func__, host_inst);)
++		*ret_ha = search_ha;
++	}
++
++	return rval;
++}
++
++/*
++ * qla2x00_get_driver_specifics
++ *	Returns driver specific data in the response buffer.
++ *
++ * Input:
++ *	pext = pointer to EXT_IOCTL structure containing values from user.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_get_driver_specifics(EXT_IOCTL *pext)
++{
++	int			ret = 0;
++	EXT_LN_DRIVER_DATA	data;
++
++	DEBUG9(printk("%s: entered.\n",
++	    __func__);)
++
++	if (pext->ResponseLen < sizeof(EXT_LN_DRIVER_DATA)) {
++		pext->Status = EXT_STATUS_BUFFER_TOO_SMALL;
++		DEBUG9_10(printk("%s: ERROR ResponseLen too small.\n",
++		    __func__);)
++
++		return (ret);
++	}
++
++	data.DrvVer.Major = QLA_DRIVER_MAJOR_VER;
++	data.DrvVer.Minor = QLA_DRIVER_MINOR_VER;
++	data.DrvVer.Patch = QLA_DRIVER_PATCH_VER;
++	data.DrvVer.Beta = QLA_DRIVER_BETA_VER;
++
++	ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr,
++	    sizeof(EXT_LN_DRIVER_DATA));
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s: ERROR verify write resp buf\n",
++		    __func__);)
++
++		return (ret);
++	}
++
++	ret = copy_to_user(pext->ResponseAdr, &data, sizeof(EXT_LN_DRIVER_DATA));
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s: ERROR copy resp buf\n",
++		    __func__);)
++	}
++
++	DEBUG9(printk("%s: exiting. ret=%d.\n",
++	    __func__, ret);)
++
++	return (ret);
++}
++
++/*
++ * qla2x00_aen_reg
++ *	IOCTL management server Asynchronous Event Tracking Enable/Disable.
++ *
++ * Input:
++ *	ha = pointer to the adapter struct of the adapter to register.
++ *	cmd = pointer to EXT_IOCTL structure containing values from user.
++ *	mode = flags. not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_aen_reg(scsi_qla_host_t *ha, EXT_IOCTL *cmd, int mode)
++{
++	int		rval = 0;
++	EXT_REG_AEN	reg_struct;
++
++	DEBUG9(printk("%s(%ld): inst %ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	rval = verify_area(VERIFY_READ, (void *)cmd->RequestAdr,
++	    sizeof(EXT_REG_AEN));
++	if (rval) {
++		cmd->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst %ld ERROR verify read req buf\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		return (rval);
++	}
++
++	rval = copy_from_user(&reg_struct, cmd->RequestAdr, sizeof(EXT_REG_AEN));
++	if (rval == 0) {
++		cmd->Status = EXT_STATUS_OK;
++		if (reg_struct.Enable) {
++			ha->ioctl->flags |= IOCTL_AEN_TRACKING_ENABLE;
++		} else {
++			ha->ioctl->flags &= ~IOCTL_AEN_TRACKING_ENABLE;
++		}
++	} else {
++		cmd->Status = EXT_STATUS_COPY_ERR;
++	}
++
++	DEBUG9(printk("%s(%ld): inst %ld reg_struct.Enable(%d) "
++	    "ha->ioctl_flag(%x) cmd->Status(%d).",
++	    __func__, ha->host_no, ha->instance, reg_struct.Enable,
++	    ha->ioctl->flags, cmd->Status);)
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	return (rval);
++}
++
++/*
++ * qla2x00_aen_get
++ *	Asynchronous Event Record Transfer to user.
++ *	The entire queue will be emptied and transferred back.
++ *
++ * Input:
++ *	ha = pointer to the adapter struct of the specified adapter.
++ *	pext = pointer to EXT_IOCTL structure containing values from user.
++ *	mode = flags.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ *
++ * NOTE: Need to use hardware lock to protect the queues from updates
++ *	 via isr/enqueue_aen after we get rid of io_request_lock.
++ */
++static int
++qla2x00_aen_get(scsi_qla_host_t *ha, EXT_IOCTL *cmd, int mode)
++{
++	int		rval = 0;
++	EXT_ASYNC_EVENT	*tmp_q;
++	EXT_ASYNC_EVENT	*paen;
++	uint8_t		i;
++	uint8_t		queue_cnt;
++	uint8_t		request_cnt;
++	uint32_t	stat = EXT_STATUS_OK;
++	uint32_t	ret_len = 0;
++	unsigned long   cpu_flags = 0;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	request_cnt = (uint8_t)(cmd->ResponseLen / sizeof(EXT_ASYNC_EVENT));
++
++	if (request_cnt < EXT_DEF_MAX_AEN_QUEUE) {
++		/* We require caller to alloc for the maximum request count */
++		cmd->Status       = EXT_STATUS_BUFFER_TOO_SMALL;
++		DEBUG9_10(printk("%s(%ld): inst=%ld Buffer too small. "
++		    "Exiting normally.",
++		    __func__, ha->host_no, ha->instance);)
++
++		return (rval);
++	}
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&paen,
++	    sizeof(EXT_ASYNC_EVENT) * EXT_DEF_MAX_AEN_QUEUE)) {
++		/* not enough memory */
++		cmd->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(EXT_ASYNC_EVENT)*EXT_DEF_MAX_AEN_QUEUE);)
++		return (rval);
++	}
++
++	/* 1st: Make a local copy of the entire queue content. */
++	tmp_q = (EXT_ASYNC_EVENT *)ha->ioctl->aen_tracking_queue;
++	queue_cnt = 0;
++
++	spin_lock_irqsave(&ha->hardware_lock, cpu_flags);
++	i = ha->ioctl->aen_q_head;
++
++	for (; queue_cnt < EXT_DEF_MAX_AEN_QUEUE;) {
++		if (tmp_q[i].AsyncEventCode != 0) {
++			memcpy(&paen[queue_cnt], &tmp_q[i],
++			    sizeof(EXT_ASYNC_EVENT));
++			queue_cnt++;
++			tmp_q[i].AsyncEventCode = 0; /* empty out the slot */
++		}
++
++		if (i == ha->ioctl->aen_q_tail) {
++			/* done. */
++			break;
++		}
++
++		i++;
++
++		if (i == EXT_DEF_MAX_AEN_QUEUE) {
++			i = 0;
++		}
++	}
++
++	/* Empty the queue. */
++	ha->ioctl->aen_q_head = 0;
++	ha->ioctl->aen_q_tail = 0;
++
++	spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags);
++
++	/* 2nd: Now transfer the queue content to user buffer */
++	/* Copy the entire queue to user's buffer. */
++	ret_len = (uint32_t)(queue_cnt * sizeof(EXT_ASYNC_EVENT));
++	if (queue_cnt != 0) {
++		rval = verify_area(VERIFY_WRITE, (void *)cmd->ResponseAdr,
++		    ret_len);
++		if (rval != 0) {
++			cmd->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk(
++			    "%s(%ld): inst=%ld ERROR verify write resp buf.\n",
++			    __func__, ha->host_no, ha->instance);)
++
++			qla2x00_free_ioctl_scrap_mem(ha);
++			return (rval);
++		}
++
++		rval = copy_to_user(cmd->ResponseAdr, paen, ret_len);
++	}
++	cmd->ResponseLen = ret_len;
++
++	if (rval != 0) {
++		stat = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld FAILED. error = %d\n",
++		    __func__, ha->host_no, ha->instance, stat);)
++	} else {
++		stat = EXT_STATUS_OK;
++	}
++
++	cmd->Status = stat;
++	qla2x00_free_ioctl_scrap_mem(ha);
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting. rval=%d.\n",
++	     __func__, ha->host_no, ha->instance, rval);)
++
++	return (rval);
++}
++
++/*
++ * qla2x00_enqueue_aen
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	event_code = async event code of the event to add to queue.
++ *	payload = event payload for the queue.
++ *
++ * Context:
++ *	Interrupt context.
++ * NOTE: Need to hold the hardware lock to protect the queues from
++ *	 aen_get after we get rid of the io_request_lock.
++ */
++void
++qla2x00_enqueue_aen(scsi_qla_host_t *ha, uint16_t event_code, void *payload)
++{
++	uint8_t			new_entry; /* index to current entry */
++	uint16_t		*mbx;
++	EXT_ASYNC_EVENT		*aen_queue;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	aen_queue = (EXT_ASYNC_EVENT *)ha->ioctl->aen_tracking_queue;
++	if (aen_queue[ha->ioctl->aen_q_tail].AsyncEventCode != 0) {
++		/* Need to change queue pointers to make room. */
++
++		/* Increment tail for adding new entry. */
++		ha->ioctl->aen_q_tail++;
++		if (ha->ioctl->aen_q_tail == EXT_DEF_MAX_AEN_QUEUE) {
++			ha->ioctl->aen_q_tail = 0;
++		}
++
++		if (ha->ioctl->aen_q_head == ha->ioctl->aen_q_tail) {
++			/*
++			 * We're overwriting the oldest entry, so need to
++			 * update the head pointer.
++			 */
++			ha->ioctl->aen_q_head++;
++			if (ha->ioctl->aen_q_head == EXT_DEF_MAX_AEN_QUEUE) {
++				ha->ioctl->aen_q_head = 0;
++			}
++		}
++	}
++
++	DEBUG(printk("%s(%ld): inst=%ld Adding code 0x%x to aen_q %p @ %d\n",
++	    __func__, ha->host_no, ha->instance, event_code, aen_queue,
++	    ha->ioctl->aen_q_tail);)
++
++	new_entry = ha->ioctl->aen_q_tail;
++	aen_queue[new_entry].AsyncEventCode = event_code;
++
++		/* Update payload */
++	switch (event_code) {
++	case MBA_LIP_OCCURRED:
++	case MBA_LOOP_UP:
++	case MBA_LOOP_DOWN:
++	case MBA_LIP_RESET:
++	case MBA_PORT_UPDATE:
++		/* empty */
++		break;
++
++	case MBA_SCR_UPDATE:
++		mbx = (uint16_t *)payload;
++		/* al_pa */
++		aen_queue[new_entry].Payload.RSCN.RSCNInfo[0] = LSB(mbx[2]);
++		/* area */
++		aen_queue[new_entry].Payload.RSCN.RSCNInfo[1] = MSB(mbx[2]);
++		/* domain */
++		aen_queue[new_entry].Payload.RSCN.RSCNInfo[2] = LSB(mbx[1]);
++		/* save in big endian */
++		BIG_ENDIAN_24(aen_queue[new_entry].Payload.RSCN.RSCNInfo[0]);
++
++		aen_queue[new_entry].Payload.RSCN.AddrFormat = MSB(mbx[1]);
++
++		break;
++
++	default:
++		/* Not supported */
++		aen_queue[new_entry].AsyncEventCode = 0;
++		break;
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++}
++
++/*
++ * qla2x00_query
++ *	Handles all subcommands of the EXT_CC_QUERY command.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = EXT_IOCTL structure pointer.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_query(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int rval = 0;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	/* All Query type ioctls are done here */
++	switch(pext->SubCode) {
++
++	case EXT_SC_QUERY_HBA_NODE:
++		/* fill in HBA NODE Information */
++		rval = qla2x00_query_hba_node(ha, pext, mode);
++		break;
++
++	case EXT_SC_QUERY_HBA_PORT:
++		/* return HBA PORT related info */
++		rval = qla2x00_query_hba_port(ha, pext, mode);
++		break;
++
++	case EXT_SC_QUERY_DISC_PORT:
++		/* return discovered port information */
++		rval = qla2x00_query_disc_port(ha, pext, mode);
++		break;
++
++	case EXT_SC_QUERY_DISC_TGT:
++		/* return discovered target information */
++		rval = qla2x00_query_disc_tgt(ha, pext, mode);
++		break;
++
++	case EXT_SC_QUERY_CHIP:
++		rval = qla2x00_query_chip(ha, pext, mode);
++		break;
++
++	case EXT_SC_QUERY_DISC_LUN:
++		pext->Status = EXT_STATUS_UNSUPPORTED_SUBCODE;
++		break;
++
++	default:
++ 		DEBUG9_10(printk("%s(%ld): inst=%ld unknown SubCode %d.\n",
++ 		    __func__, ha->host_no, ha->instance, pext->SubCode);)
++		pext->Status = EXT_STATUS_UNSUPPORTED_SUBCODE;
++		break;
++	}
++
++ 	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++ 	    __func__, ha->host_no, ha->instance);)
++	return rval;
++}
++
++/*
++ * qla2x00_query_hba_node
++ *	Handles EXT_SC_QUERY_HBA_NODE subcommand.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = EXT_IOCTL structure pointer.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_query_hba_node(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int		ret = 0;
++	uint32_t	i, transfer_size;
++	EXT_HBA_NODE	*ptmp_hba_node;
++
++ 	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++ 	    __func__, ha->host_no, ha->instance);)
++
++ 	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_hba_node,
++ 	    sizeof(EXT_HBA_NODE))) {
++ 		/* not enough memory */
++ 		pext->Status = EXT_STATUS_NO_MEMORY;
++ 		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++ 		    "size requested=%d.\n",
++ 		    __func__, ha->host_no, ha->instance,
++ 		    sizeof(EXT_HBA_NODE));)
++ 		return (ret);
++ 	}
++
++	/* fill all available HBA NODE Information */
++	for (i = 0; i < 8 ; i++)
++		ptmp_hba_node->WWNN[i] = ha->node_name[i];
++
++	sprintf((char *)(ptmp_hba_node->Manufacturer),"Qlogic Corp.");
++	sprintf((char *)(ptmp_hba_node->Model), ha->brd_info->name);
++
++	ptmp_hba_node->SerialNum[0] = ha->serial0;
++	ptmp_hba_node->SerialNum[1] = ha->serial1;
++	ptmp_hba_node->SerialNum[2] = ha->serial2;
++	sprintf((char *)(ptmp_hba_node->DriverVersion), qla2x00_version_str);
++	sprintf((char *)(ptmp_hba_node->FWVersion),"%2d.%02d.%02d",
++	    ha->fw_major_version, 
++	    ha->fw_minor_version, 
++	    ha->fw_subminor_version);
++
++	sprintf((char *)(ptmp_hba_node->OptRomVersion),"%d.%d",
++	    ha->optrom_major, ha->optrom_minor);
++
++	ptmp_hba_node->InterfaceType = EXT_DEF_FC_INTF_TYPE;
++	ptmp_hba_node->PortCount = 1;
++
++
++	ptmp_hba_node->DriverAttr = (ha->flags.failover_enabled) ?
++	    DRVR_FO_ENABLED : 0;
++
++	ret = verify_area(VERIFY_WRITE, (void  *)pext->ResponseAdr,
++	    sizeof(EXT_HBA_NODE));
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf\n",
++		    __func__, ha->host_no, ha->instance);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	/* now copy up the HBA_NODE to user */
++	if (pext->ResponseLen < sizeof(EXT_HBA_NODE))
++		transfer_size = pext->ResponseLen;
++	else
++		transfer_size = sizeof(EXT_HBA_NODE);
++
++	ret = copy_to_user((uint8_t *)pext->ResponseAdr,
++	    (uint8_t *)ptmp_hba_node, transfer_size);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n",
++		    __func__, ha->host_no, ha->instance);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	pext->Status       = EXT_STATUS_OK;
++	pext->DetailStatus = EXT_STATUS_OK;
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	qla2x00_free_ioctl_scrap_mem(ha);
++	return (ret);
++}
++
++/*
++ * qla2x00_query_hba_port
++ *	Handles EXT_SC_QUERY_HBA_PORT subcommand.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = EXT_IOCTL structure pointer.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_query_hba_port(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int		ret = 0;
++	uint32_t	tgt_cnt, tgt, transfer_size;
++	uint32_t	port_cnt;
++	struct list_head	*fcpl;
++	fc_port_t	*fcport;
++	EXT_HBA_PORT	*ptmp_hba_port;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_hba_port,
++	    sizeof(EXT_HBA_PORT))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(EXT_HBA_PORT));)
++		return (ret);
++	}
++
++	/* reflect all HBA PORT related info */
++	ptmp_hba_port->WWPN[7] = ha->init_cb->port_name[7];
++	ptmp_hba_port->WWPN[6] = ha->init_cb->port_name[6];
++	ptmp_hba_port->WWPN[5] = ha->init_cb->port_name[5];
++	ptmp_hba_port->WWPN[4] = ha->init_cb->port_name[4];
++	ptmp_hba_port->WWPN[3] = ha->init_cb->port_name[3];
++	ptmp_hba_port->WWPN[2] = ha->init_cb->port_name[2];
++	ptmp_hba_port->WWPN[1] = ha->init_cb->port_name[1];
++	ptmp_hba_port->WWPN[0] = ha->init_cb->port_name[0];
++	ptmp_hba_port->Id[0] = 0;
++	ptmp_hba_port->Id[1] = ha->d_id.r.d_id[2];
++	ptmp_hba_port->Id[2] = ha->d_id.r.d_id[1];
++	ptmp_hba_port->Id[3] = ha->d_id.r.d_id[0];
++	ptmp_hba_port->Type =  EXT_DEF_INITIATOR_DEV;
++
++	switch (ha->current_topology) {
++	case ISP_CFG_NL:
++	case ISP_CFG_FL:
++		ptmp_hba_port->Mode = EXT_DEF_LOOP_MODE;
++		break;
++
++	case ISP_CFG_N:
++	case ISP_CFG_F:
++		ptmp_hba_port->Mode = EXT_DEF_P2P_MODE;
++		break;
++
++	default:
++		ptmp_hba_port->Mode = EXT_DEF_UNKNOWN_MODE;
++		break;
++	}
++
++	port_cnt = 0;
++	list_for_each(fcpl, &ha->fcports) {
++		fcport = list_entry(fcpl, fc_port_t, list);
++
++		/* if removed or missing */
++		if (atomic_read(&fcport->state) != FC_ONLINE) {
++			DEBUG9_10(printk(
++			    "%s(%ld): inst=%ld port %02x%02x%02x not online\n",
++			    __func__, ha->host_no, ha->instance,
++			    fcport->d_id.b.domain,
++			    fcport->d_id.b.area,
++			    fcport->d_id.b.al_pa));
++			continue;
++		}
++		port_cnt++;
++	}
++
++	tgt_cnt  = 0;
++	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++		if (ha->otgt[tgt] == NULL) {
++			continue;
++		}
++		tgt_cnt++;
++	}
++
++	DEBUG9_10(printk("%s(%ld): inst=%ld disc_port cnt=%d, tgt cnt=%d.\n",
++	    __func__, ha->host_no, ha->instance,
++	    port_cnt, tgt_cnt);)
++	ptmp_hba_port->DiscPortCount   = port_cnt;
++	ptmp_hba_port->DiscTargetCount = tgt_cnt;
++
++	if (ha->loop_state == LOOP_DOWN) {
++
++		ptmp_hba_port->State = EXT_DEF_HBA_LOOP_DOWN;
++
++	} else if (ha->loop_state != LOOP_READY ||
++	    test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) ||
++	    test_bit(CFG_ACTIVE, &ha->cfg_flags) || ABORTS_ACTIVE) {
++
++		ptmp_hba_port->State = EXT_DEF_HBA_SUSPENDED;
++
++	} else {
++
++		ptmp_hba_port->State = EXT_DEF_HBA_OK;
++
++	}
++
++	ptmp_hba_port->DiscPortNameType = EXT_DEF_USE_PORT_NAME;
++
++	/* Return supported FC4 type depending on driver support. */
++	ptmp_hba_port->PortSupportedFC4Types = EXT_DEF_FC4_TYPE_SCSI;
++#if defined(FC_IP_SUPPORT)
++
++	ptmp_hba_port->PortSupportedFC4Types |= EXT_DEF_FC4_TYPE_IP;
++#endif
++#if defined(FC_SCTP_SUPPORT)
++
++	ptmp_hba_port->PortSupportedFC4Types |= EXT_DEF_FC4_TYPE_SCTP;
++#endif
++
++	ptmp_hba_port->PortActiveFC4Types = ha->active_fc4_types;
++
++	/* Return supported speed depending on adapter type */
++#if defined(ISP2100)
++
++	ptmp_hba_port->PortSupportedSpeed = EXT_DEF_PORTSPEED_1GBIT;
++#elif defined(ISP2200)
++
++	ptmp_hba_port->PortSupportedSpeed = EXT_DEF_PORTSPEED_1GBIT;
++#elif defined(ISP2300)
++
++	ptmp_hba_port->PortSupportedSpeed = EXT_DEF_PORTSPEED_2GBIT;
++#else
++	/* invalid */
++	ptmp_hba_port->PortSupportedSpeed = 0;
++#endif
++
++	ptmp_hba_port->PortSpeed = ha->current_speed;
++
++	ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr ,
++	    sizeof(EXT_HBA_PORT));
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf\n",
++		    __func__, ha->host_no, ha->instance);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	/* now copy up the HBA_PORT to user */
++	if (pext->ResponseLen < sizeof(EXT_HBA_PORT))
++		transfer_size = pext->ResponseLen;
++	else
++		transfer_size = sizeof(EXT_HBA_PORT);
++
++	ret = copy_to_user((uint8_t *)pext->ResponseAdr,
++	    (uint8_t *)ptmp_hba_port, transfer_size);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n",
++		    __func__, ha->host_no, ha->instance);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	pext->Status       = EXT_STATUS_OK;
++	pext->DetailStatus = EXT_STATUS_OK;
++	qla2x00_free_ioctl_scrap_mem(ha);
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	return ret;
++}
++
++/*
++ * qla2x00_query_disc_port
++ *	Handles EXT_SC_QUERY_DISC_PORT subcommand.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = EXT_IOCTL structure pointer.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_query_disc_port(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int		ret = 0;
++	int		found;
++	uint32_t	tgt, transfer_size, inst;
++	struct list_head *fcpl;
++	fc_port_t	*fcport;
++	os_tgt_t	*tq;
++	EXT_DISC_PORT	*ptmp_disc_port;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered. Port inst=%02d.\n",
++	    __func__, ha->host_no, ha->instance, pext->Instance);)
++
++	inst = 0;
++	found = 0;
++	fcport = NULL;
++	list_for_each(fcpl, &ha->fcports) {
++		fcport = list_entry(fcpl, fc_port_t, list);
++
++		if (atomic_read(&fcport->state) != FC_ONLINE) {
++			/* port does not exist anymore */
++			DEBUG9(printk("%s(%ld): fcport marked lost. "
++			    "d_id=%02x%02x%02x loop_id=%02x not online.\n",
++			    __func__, ha->host_no,
++			    fcport->d_id.b.domain,
++			    fcport->d_id.b.area,
++			    fcport->d_id.b.al_pa,
++			    fcport->loop_id);)
++
++			continue;
++		}
++
++		if (inst != pext->Instance) {
++			DEBUG9(printk("%s(%ld): found fcport %02d "
++			    "d_id=%02x%02x%02x. Skipping.\n",
++			    __func__, ha->host_no, inst,
++			    fcport->d_id.b.domain,
++			    fcport->d_id.b.area,
++			    fcport->d_id.b.al_pa));
++
++			inst++;
++			continue;
++		}
++
++		DEBUG9(printk("%s(%ld): inst=%ld found matching fcport %02d "
++		    "online. d_id=%02x%02x%02x loop_id=%02x online.\n",
++		    __func__, ha->host_no, ha->instance, inst,
++		    fcport->d_id.b.domain,
++		    fcport->d_id.b.area,
++		    fcport->d_id.b.al_pa,
++		    fcport->loop_id);)
++
++		/* Found the matching port still connected. */
++		found++;
++		break;
++	}
++
++	if (!found) {
++		DEBUG9_10(printk("%s(%ld): inst=%ld dev not found.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		return (ret);
++	}
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_disc_port,
++	    sizeof(EXT_DISC_PORT))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(EXT_DISC_PORT));)
++		return (ret);
++	}
++
++	memcpy(ptmp_disc_port->WWNN, fcport->node_name, WWN_SIZE);
++	memcpy(ptmp_disc_port->WWPN, fcport->port_name, WWN_SIZE);
++
++	ptmp_disc_port->Id[0] = 0;
++	ptmp_disc_port->Id[1] = fcport->d_id.r.d_id[2];
++	ptmp_disc_port->Id[2] = fcport->d_id.r.d_id[1];
++	ptmp_disc_port->Id[3] = fcport->d_id.r.d_id[0];
++
++	/* Currently all devices on fcport list are target capable devices */
++	/* This default value may need to be changed after we add non target
++	 * devices also to this list.
++	 */
++	ptmp_disc_port->Type = EXT_DEF_TARGET_DEV;
++
++	if (fcport->flags & FC_FABRIC_DEVICE) {
++		ptmp_disc_port->Type |= EXT_DEF_FABRIC_DEV;
++	}
++	if (fcport->flags & FC_TAPE_DEVICE) {
++		ptmp_disc_port->Type |= EXT_DEF_TAPE_DEV;
++	}
++	if (fcport->flags & FC_INITIATOR_DEVICE) {
++		ptmp_disc_port->Type |= EXT_DEF_INITIATOR_DEV;
++	}
++
++	ptmp_disc_port->LoopID = fcport->loop_id;
++	ptmp_disc_port->Status = 0;
++	ptmp_disc_port->Bus    = 0;
++
++	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++		if ((tq = ha->otgt[tgt]) == NULL) {
++			continue;
++		}
++
++		if (tq->vis_port == NULL)  /* dg 08/14/01 */
++			continue;
++
++		if (memcmp(fcport->port_name, tq->vis_port->port_name,
++		    EXT_DEF_WWN_NAME_SIZE) == 0) {
++			ptmp_disc_port->TargetId = tgt;
++			break;
++		}
++	}
++
++	ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr ,
++	    sizeof(EXT_DISC_PORT));
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf\n",
++		    __func__, ha->host_no, ha->instance);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	/* now copy up the DISC_PORT to user */
++	if (pext->ResponseLen < sizeof(EXT_DISC_PORT))
++		transfer_size = pext->ResponseLen;
++	else
++		transfer_size = sizeof(EXT_DISC_PORT);
++
++	ret = copy_to_user((uint8_t *)pext->ResponseAdr,
++	    (uint8_t *)ptmp_disc_port, transfer_size);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n",
++		    __func__, ha->host_no, ha->instance);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	pext->Status       = EXT_STATUS_OK;
++	pext->DetailStatus = EXT_STATUS_OK;
++	qla2x00_free_ioctl_scrap_mem(ha);
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	return (ret);
++}
++
++/*
++ * qla2x00_query_disc_tgt
++ *	Handles EXT_SC_QUERY_DISC_TGT subcommand.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = EXT_IOCTL structure pointer.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_query_disc_tgt(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int		ret = 0;
++	uint32_t	tgt, transfer_size, inst;
++	uint32_t	cnt, i;
++	fc_port_t	*tgt_fcport;
++	os_tgt_t	*tq;
++	EXT_DISC_TARGET	*ptmp_disc_target;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	tq = NULL;
++	for (tgt = 0, inst = 0; tgt < MAX_TARGETS; tgt++) {
++		if (ha->otgt[tgt] == NULL) {
++			continue;
++		}
++		/* if wrong target id then skip to next entry */
++		if (inst != pext->Instance) {
++			inst++;
++			continue;
++		}
++		tq = ha->otgt[tgt];
++		break;
++	}
++
++	if (tq == NULL || tgt == MAX_TARGETS) {
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		DEBUG9_10(printk("%s(%ld): inst=%ld target dev not found. "
++		    "tq=%p, tgt=%d.\n",
++		    __func__, ha->host_no, ha->instance, tq, tgt);)
++		return (ret);
++	}
++
++	if (tq->vis_port == NULL) { 	/* dg 08/14/01 */
++		pext->Status = EXT_STATUS_BUSY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld target dev not found. "
++		    "tq=%p.\n",
++		    __func__, ha->host_no, ha->instance, tq);)
++		return (ret);
++	}
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_disc_target,
++	    sizeof(EXT_DISC_TARGET))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(EXT_DISC_TARGET));)
++		return (ret);
++	}
++
++	tgt_fcport = tq->vis_port;
++	memcpy(ptmp_disc_target->WWNN, tgt_fcport->node_name, WWN_SIZE);
++	memcpy(ptmp_disc_target->WWPN, tgt_fcport->port_name, WWN_SIZE);
++
++	ptmp_disc_target->Id[0] = 0;
++	ptmp_disc_target->Id[1] = tgt_fcport->d_id.r.d_id[2];
++	ptmp_disc_target->Id[2] = tgt_fcport->d_id.r.d_id[1];
++	ptmp_disc_target->Id[3] = tgt_fcport->d_id.r.d_id[0];
++
++	/* All devices on ha->otgt list are target capable devices. */
++	ptmp_disc_target->Type = EXT_DEF_TARGET_DEV;
++
++	if (tgt_fcport->flags & FC_FABRIC_DEVICE) {
++		ptmp_disc_target->Type |= EXT_DEF_FABRIC_DEV;
++	}
++	if (tgt_fcport->flags & FC_TAPE_DEVICE) {
++		ptmp_disc_target->Type |= EXT_DEF_TAPE_DEV;
++	}
++	if (tgt_fcport->flags & FC_INITIATOR_DEVICE) {
++		ptmp_disc_target->Type |= EXT_DEF_INITIATOR_DEV;
++	}
++
++	ptmp_disc_target->LoopID   = tgt_fcport->loop_id;
++	ptmp_disc_target->Status   = 0;
++	ptmp_disc_target->Bus      = 0;
++	ptmp_disc_target->TargetId = tgt;
++
++	cnt = 0;
++	/* enumerate available LUNs under this TGT (if any) */
++	if (ha->otgt[tgt] != NULL) {
++		for (i = 0; i < MAX_LUNS ; i++) {
++			if ((ha->otgt[tgt])->olun[i] !=0)
++				cnt++;
++		}
++	}
++
++	ptmp_disc_target->LunCount = cnt;
++
++	ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr,
++	    sizeof(EXT_DISC_TARGET));
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf\n",
++		    __func__, ha->host_no, ha->instance);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	/* now copy up the DISC_PORT to user */
++	if (pext->ResponseLen < sizeof(EXT_DISC_PORT))
++		transfer_size = pext->ResponseLen;
++	else
++		transfer_size = sizeof(EXT_DISC_TARGET);
++
++	ret = copy_to_user((uint8_t *)pext->ResponseAdr,
++	    (uint8_t *)ptmp_disc_target, transfer_size);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n",
++		    __func__, ha->host_no, ha->instance);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	pext->Status       = EXT_STATUS_OK;
++	pext->DetailStatus = EXT_STATUS_OK;
++	qla2x00_free_ioctl_scrap_mem(ha);
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	return (ret);
++}
++
++/*
++ * qla2x00_query_chip
++ *	Handles EXT_SC_QUERY_CHIP subcommand.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = EXT_IOCTL structure pointer.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_query_chip(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int		ret = 0;
++	uint32_t	transfer_size, i;
++	EXT_CHIP		*ptmp_isp;
++	struct Scsi_Host	*host;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++ 	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_isp,
++ 	    sizeof(EXT_CHIP))) {
++ 		/* not enough memory */
++ 		pext->Status = EXT_STATUS_NO_MEMORY;
++ 		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++ 		    "size requested=%d.\n",
++ 		    __func__, ha->host_no, ha->instance,
++ 		    sizeof(EXT_CHIP));)
++ 		return (ret);
++ 	}
++
++	host = ha->host;
++	ptmp_isp->VendorId       = ha->pdev->vendor;
++	ptmp_isp->DeviceId       = ha->pdev->device;
++	ptmp_isp->SubVendorId    = ha->pdev->subsystem_vendor;
++	ptmp_isp->SubSystemId    = ha->pdev->subsystem_device;
++	ptmp_isp->PciBusNumber   = ha->pdev->bus->number;
++	ptmp_isp->PciDevFunc     = ha->pdev->devfn;
++	ptmp_isp->PciSlotNumber  = PCI_SLOT(ha->pdev->devfn);
++	ptmp_isp->IoAddr         = host->io_port;
++	ptmp_isp->IoAddrLen      = 512;
++	ptmp_isp->MemAddr        = 0; /* ? */
++	ptmp_isp->MemAddrLen     = 0; /* ? */
++	ptmp_isp->ChipType       = 0; /* ? */
++	ptmp_isp->InterruptLevel = host->irq;
++
++	for (i = 0; i < 8; i++)
++		ptmp_isp->OutMbx[i] = 0;
++
++	ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr,
++	    sizeof(EXT_CHIP));
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf\n",
++		    __func__, ha->host_no, ha->instance);)
++ 		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	/* now copy up the ISP to user */
++	if (pext->ResponseLen < sizeof(EXT_CHIP))
++		transfer_size = pext->ResponseLen;
++	else
++		transfer_size = sizeof(EXT_CHIP);
++
++	ret = copy_to_user((uint8_t *)pext->ResponseAdr, (uint8_t *)ptmp_isp,
++	    transfer_size);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n",
++		    __func__, ha->host_no, ha->instance);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	pext->Status       = EXT_STATUS_OK;
++	pext->DetailStatus = EXT_STATUS_OK;
++	qla2x00_free_ioctl_scrap_mem(ha);
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	return (ret);
++}
++
++/*
++ * qla2x00_get_data
++ *	Handles all subcommands of the EXT_CC_GET_DATA command.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = EXT_IOCTL structure pointer.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_get_data(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int	tmp_rval = 0;
++
++	switch(pext->SubCode) {
++	case EXT_SC_GET_STATISTICS:
++		tmp_rval = qla2x00_get_statistics(ha, pext, mode);
++		break;
++
++	case EXT_SC_GET_FC_STATISTICS:
++		tmp_rval = qla2x00_get_fc_statistics(ha, pext, mode);
++		break;
++
++	case EXT_SC_GET_PORT_SUMMARY:
++		tmp_rval = qla2x00_get_port_summary(ha, pext, mode);
++		break;
++
++	case EXT_SC_QUERY_DRIVER:
++		tmp_rval = qla2x00_query_driver(ha, pext, mode);
++		break;
++
++	case EXT_SC_QUERY_FW:
++		tmp_rval = qla2x00_query_fw(ha, pext, mode);
++		break;
++
++	case EXT_SC_GET_RNID:
++		tmp_rval = qla2x00_get_rnid_params(ha, pext, mode);
++		break;
++
++	default:
++		DEBUG10(printk("%s(%ld): inst=%ld unknown SubCode %d.\n",
++		    __func__, ha->host_no, ha->instance, pext->SubCode);)
++		pext->Status = EXT_STATUS_UNSUPPORTED_SUBCODE;
++		break;
++	 }
++
++	return (tmp_rval);
++}
++
++/*
++ * qla2x00_get_statistics
++ *	Issues get_link_status mbx cmd and returns statistics
++ *	relavent to the specified adapter.
++ *
++ * Input:
++ *	ha = pointer to adapter struct of the specified adapter.
++ *	pext = pointer to EXT_IOCTL structure containing values from user.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_get_statistics(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	EXT_HBA_PORT_STAT	*ptmp_stat;
++	int		ret = 0;
++	link_stat_t	stat_buf;
++	uint8_t		rval;
++	uint8_t		*usr_temp, *kernel_tmp;
++	uint16_t	mb_stat[1];
++	uint32_t	transfer_size;
++
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr,
++	    sizeof(EXT_HBA_PORT_STAT));
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR VERIFY_WRITE "
++		    "EXT_HBA_PORT_STAT.\n",
++		    __func__, ha->host_no, ha->instance);)
++		return (ret);
++	}
++
++	/* check on loop down */
++	if (ha->loop_state != LOOP_READY || 
++	    test_bit(CFG_ACTIVE, &ha->cfg_flags) ||
++	    (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) ||
++	    ABORTS_ACTIVE || ha->dpc_active) {
++
++		pext->Status = EXT_STATUS_BUSY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld loop not ready.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		return (ret);
++	}
++
++	/* Send mailbox cmd to get more. */
++	if ((rval = qla2x00_get_link_status(ha, ha->loop_id, &stat_buf,
++	    mb_stat)) != QL_STATUS_SUCCESS) {
++
++		if (rval == BIT_0) {
++			pext->Status = EXT_STATUS_NO_MEMORY;
++		} else if (rval == BIT_1) {
++			pext->Status = EXT_STATUS_MAILBOX;
++			pext->DetailStatus = EXT_DSTATUS_NOADNL_INFO;
++		} else {
++			pext->Status = EXT_STATUS_ERR;
++		}
++
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR mailbox failed. "
++		    "mb[0]=%x.\n",
++		    __func__, ha->host_no, ha->instance, mb_stat[0]);)
++		printk(KERN_WARNING
++		     "%s(%ld): inst=%ld ERROR mailbox failed. mb[0]=%x.\n",
++		    __func__, ha->host_no, ha->instance, mb_stat[0]);
++
++		return (ret);
++	}
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_stat,
++	    sizeof(EXT_HBA_PORT_STAT))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(EXT_HBA_PORT_STAT));)
++		return (ret);
++	}
++
++	ptmp_stat->ControllerErrorCount   =  ha->total_isp_aborts;
++	ptmp_stat->DeviceErrorCount       =  ha->total_dev_errs;
++	ptmp_stat->TotalIoCount           =  ha->total_ios;
++	ptmp_stat->TotalMBytes            =  ha->total_bytes >> 20;
++	ptmp_stat->TotalLipResets         =  ha->total_lip_cnt;
++	/*
++	   ptmp_stat->TotalInterrupts        =  ha->total_isr_cnt;
++	 */
++
++	ptmp_stat->TotalLinkFailures               = stat_buf.link_fail_cnt;
++	ptmp_stat->TotalLossOfSync                 = stat_buf.loss_sync_cnt;
++	ptmp_stat->TotalLossOfSignals              = stat_buf.loss_sig_cnt;
++	ptmp_stat->PrimitiveSeqProtocolErrorCount  = stat_buf.prim_seq_err_cnt;
++	ptmp_stat->InvalidTransmissionWordCount    = stat_buf.inval_xmit_word_cnt;
++	ptmp_stat->InvalidCRCCount                 = stat_buf.inval_crc_cnt;
++
++	/* now copy up the STATISTICS to user */
++	if (pext->ResponseLen < sizeof(EXT_HBA_PORT_STAT))
++		transfer_size = pext->ResponseLen;
++	else
++		transfer_size = sizeof(EXT_HBA_PORT_STAT);
++
++	usr_temp   = (uint8_t *)pext->ResponseAdr;
++	kernel_tmp = (uint8_t *)ptmp_stat;
++	ret = copy_to_user(usr_temp, kernel_tmp, transfer_size);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n",
++		    __func__, ha->host_no, ha->instance);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	pext->Status       = EXT_STATUS_OK;
++	pext->DetailStatus = EXT_STATUS_OK;
++	qla2x00_free_ioctl_scrap_mem(ha);
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	return (ret);
++}
++
++/*
++ * qla2x00_get_fc_statistics
++ *	Issues get_link_status mbx cmd to the target device with
++ *	the specified WWN and returns statistics relavent to the
++ *	device.
++ *
++ * Input:
++ *	ha = pointer to adapter struct of the specified device.
++ *	pext = pointer to EXT_IOCTL structure containing values from user.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_get_fc_statistics(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	EXT_HBA_PORT_STAT	*ptmp_stat;
++	EXT_DEST_ADDR		addr_struct;
++	int		ret = 0;
++	link_stat_t	stat_buf;
++	uint8_t		rval, tgt;
++	uint8_t		*usr_temp, *kernel_tmp;
++	uint8_t		*req_name;
++	uint16_t	mb_stat[1];
++	uint32_t	transfer_size;
++
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr,
++	    sizeof(EXT_HBA_PORT_STAT));
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR VERIFY_WRITE.\n",
++		    __func__, ha->host_no, ha->instance);)
++		return (ret);
++	}
++
++	ret = copy_from_user(&addr_struct, pext->RequestAdr, pext->RequestLen);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy req buf.\n",
++		    __func__, ha->host_no, ha->instance);)
++		return (ret);
++	}
++
++	/* find the device's loop_id */
++	switch (addr_struct.DestType) {
++	case EXT_DEF_DESTTYPE_WWPN:
++		req_name = addr_struct.DestAddr.WWPN;
++		for (tgt = 0; tgt < MAX_FIBRE_DEVICES; tgt++) {
++			if (memcmp(ha->fc_db[tgt].wwn, req_name,
++			    EXT_DEF_WWN_NAME_SIZE) == 0) {
++				break;
++			}
++		}
++		break;
++
++	case EXT_DEF_DESTTYPE_WWNN:
++	case EXT_DEF_DESTTYPE_PORTID:
++	case EXT_DEF_DESTTYPE_FABRIC:
++	case EXT_DEF_DESTTYPE_SCSI:
++	default:
++		pext->Status = EXT_STATUS_INVALID_PARAM;
++		pext->DetailStatus = EXT_DSTATUS_NOADNL_INFO;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR Unsupported subcode "
++		    "address type.\n", __func__, ha->host_no, ha->instance);)
++		return (ret);
++
++		break;
++	}
++
++	if (tgt == MAX_FIBRE_DEVICES) {
++		/* not found */
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		pext->DetailStatus = EXT_DSTATUS_TARGET;
++		return (ret);
++	}
++
++	/* check for suspended/lost device */
++	/*
++	   if (ha->fcport is suspended/lost) {
++	   pext->Status = EXT_STATUS_SUSPENDED;
++	   pext->DetailStatus = EXT_DSTATUS_TARGET;
++	   return pext->Status;
++	   }
++	 */
++
++	/* check on loop down */
++	if (ha->loop_state != LOOP_READY ||
++	    test_bit(CFG_ACTIVE, &ha->cfg_flags) ||
++	    (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) ||
++	    ABORTS_ACTIVE || ha->dpc_active) {
++
++		pext->Status = EXT_STATUS_BUSY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld loop not ready.\n",
++		     __func__, ha->host_no, ha->instance);)
++		return (ret);
++	}
++
++	/* Send mailbox cmd to get more. */
++	if ((rval = qla2x00_get_link_status(ha, ha->fc_db[tgt].loop_id,
++	    &stat_buf, mb_stat)) != QL_STATUS_SUCCESS) {
++		if (rval == BIT_0) {
++			pext->Status = EXT_STATUS_NO_MEMORY;
++		} else if (rval == BIT_1) {
++			pext->Status = EXT_STATUS_MAILBOX;
++			pext->DetailStatus = EXT_DSTATUS_NOADNL_INFO;
++		} else {
++			pext->Status = EXT_STATUS_ERR;
++		}
++
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR mailbox failed. "
++		    "mb[0]=%x.\n",
++		    __func__, ha->host_no, ha->instance, mb_stat[0]);)
++		return (ret);
++	}
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_stat,
++	    sizeof(EXT_HBA_PORT_STAT))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(EXT_HBA_PORT_STAT));)
++		return (ret);
++	}
++
++	ptmp_stat->ControllerErrorCount   =  ha->total_isp_aborts;
++	ptmp_stat->DeviceErrorCount       =  ha->total_dev_errs;
++	ptmp_stat->TotalIoCount           =  ha->total_ios;
++	ptmp_stat->TotalMBytes            =  ha->total_bytes >> 20;
++	ptmp_stat->TotalLipResets         =  ha->total_lip_cnt;
++	/*
++	   ptmp_stat->TotalInterrupts        =  ha->total_isr_cnt;
++	 */
++
++	ptmp_stat->TotalLinkFailures               = stat_buf.link_fail_cnt;
++	ptmp_stat->TotalLossOfSync                 = stat_buf.loss_sync_cnt;
++	ptmp_stat->TotalLossOfSignals              = stat_buf.loss_sig_cnt;
++	ptmp_stat->PrimitiveSeqProtocolErrorCount  = stat_buf.prim_seq_err_cnt;
++	ptmp_stat->InvalidTransmissionWordCount    = stat_buf.inval_xmit_word_cnt;
++	ptmp_stat->InvalidCRCCount                 = stat_buf.inval_crc_cnt;
++
++	/* now copy up the STATISTICS to user */
++	if (pext->ResponseLen < sizeof(EXT_HBA_PORT_STAT))
++		transfer_size = pext->ResponseLen;
++	else
++		transfer_size = sizeof(EXT_HBA_PORT_STAT);
++
++	usr_temp   = (uint8_t *)pext->ResponseAdr;
++	kernel_tmp = (uint8_t *)ptmp_stat;
++	ret = copy_to_user(usr_temp, kernel_tmp, transfer_size);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n",
++		    __func__, ha->host_no, ha->instance);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	pext->Status       = EXT_STATUS_OK;
++	pext->DetailStatus = EXT_STATUS_OK;
++	qla2x00_free_ioctl_scrap_mem(ha);
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	return (ret);
++}
++
++/*
++ * qla2x00_get_port_summary
++ *	Handles EXT_SC_GET_PORT_SUMMARY subcommand.
++ *	Returns values of devicedata and dd_entry list.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = EXT_IOCTL structure pointer.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_get_port_summary(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int		ret = 0;
++	uint8_t		*usr_temp, *kernel_tmp;
++	uint32_t	b;
++	uint32_t	i, port_cnt, entry;
++	uint32_t	number_of_entries = 0;
++	uint32_t	tgt_cnt, transfer_size;
++	struct list_head	*fcpl;
++	fc_port_t	*fcport;
++	uint32_t	current_offset;
++	void		*start_of_entry_list;
++
++	EXT_DEVICEDATA		*pdevicedata;
++	EXT_DEVICEDATAENTRY	*pdd_entry;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	port_cnt = 0;
++	tgt_cnt  = 0;
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pdevicedata,
++	    sizeof(EXT_DEVICEDATA))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "pdevicedata requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(EXT_DEVICEDATA));)
++		return (ret);
++	}
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pdd_entry,
++	    sizeof(EXT_DEVICEDATAENTRY))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "pdd_entry requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(EXT_DEVICEDATAENTRY));)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	list_for_each(fcpl, &ha->fcports) {
++		fcport = list_entry(fcpl, fc_port_t, list);
++
++		port_cnt++;
++	}
++	pdevicedata->TotalDevices = port_cnt;
++
++	number_of_entries = pext->ResponseLen / sizeof(EXT_DEVICEDATAENTRY);
++
++	/* we want the lesser of port_cnt and number_of_entries */
++	if (number_of_entries > port_cnt)
++		number_of_entries = port_cnt;
++	pdevicedata->ReturnListEntryCount  = number_of_entries;
++
++	DEBUG9(printk("%s(%ld): inst=%ld EXT_SC_GET_PORT_SUMMARY port_cnt=%x, "
++	    "return entry cnt=%x.\n",
++	    __func__, ha->host_no, ha->instance, port_cnt,
++	    number_of_entries);)
++
++	transfer_size = sizeof(pdevicedata->ReturnListEntryCount) +
++	    sizeof(pdevicedata->TotalDevices);
++
++	/* copy top of devicedata here */
++	ret = verify_area(VERIFY_WRITE, (void *)(pext->ResponseAdr),
++	    transfer_size);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf\n",
++		    __func__, ha->host_no, ha->instance);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	usr_temp   = (uint8_t *)pext->ResponseAdr;
++	kernel_tmp = (uint8_t *)pdevicedata;
++	ret = copy_to_user(usr_temp, kernel_tmp, transfer_size);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp "
++		    "devicedata buffer.\n",
++		    __func__, ha->host_no, ha->instance);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	start_of_entry_list = (void *)(pext->ResponseAdr) + transfer_size;
++
++ 	entry = 0;
++ 	list_for_each(fcpl, &ha->fcports) {
++ 		fcport = list_entry(fcpl, fc_port_t, list);
++ 
++ 		if (entry >= number_of_entries)
++ 			break;
++ 
++ 		/* copy from fc_db of this target (port) to dd_entry */
++
++		memcpy(pdd_entry->NodeWWN, fcport->node_name, WWN_SIZE);
++		memcpy(pdd_entry->PortWWN, fcport->port_name, WWN_SIZE);
++
++		for (b = 0; b < 3 ; b++)
++			pdd_entry->PortID[b] = fcport->d_id.r.d_id[2-b];
++
++		if (fcport->flags & FC_FABRIC_DEVICE) {
++			pdd_entry->ControlFlags = EXT_DEF_GET_FABRIC_DEVICE;
++		} else {
++			pdd_entry->ControlFlags = 0;
++		}
++
++		pdd_entry->TargetAddress.Bus    = 0;
++		/* Retrieve 'Target' number for port via fc_db */
++		for (i = 0; i < MAX_TARGETS; i++) {
++			if (ha->fc_db[i].loop_id == PORT_UNUSED)
++				continue;
++
++			if (memcmp(fcport->port_name, ha->fc_db[i].wwn,
++			    EXT_DEF_WWN_NAME_SIZE) == 0) {
++				pdd_entry->TargetAddress.Target = i;
++				break;
++			}
++		}
++		pdd_entry->TargetAddress.Lun    = 0;
++		pdd_entry->DeviceFlags          = 0;
++		pdd_entry->LoopID               = fcport->loop_id;
++		pdd_entry->BaseLunNumber        = 0;
++
++		current_offset = entry * sizeof(EXT_DEVICEDATAENTRY);
++
++		transfer_size = sizeof(EXT_DEVICEDATAENTRY);
++		ret = verify_area(VERIFY_WRITE,
++		    (void *)(start_of_entry_list + current_offset),
++		    transfer_size);
++
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG10(printk("%s(%ld): inst=%ld ERROR verify WRITE "
++			    "rsp bufaddr=%p\n",
++			    __func__, ha->host_no, ha->instance,
++			    (void *)(start_of_entry_list + current_offset));)
++			qla2x00_free_ioctl_scrap_mem(ha);
++			return pext->Status;
++		}
++
++		/* now copy up this dd_entry to user */
++		usr_temp = (uint8_t *)((u_long) start_of_entry_list +
++		    current_offset);
++		kernel_tmp = (uint8_t *)pdd_entry;
++	 	ret = copy_to_user(usr_temp, kernel_tmp, transfer_size);
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp "
++			    "entry list buffer.\n",
++			    __func__, ha->host_no, ha->instance);)
++			qla2x00_free_ioctl_scrap_mem(ha);
++			return (ret);
++		}
++
++		entry++;
++	} /* for number_of_entries */
++
++	pext->Status       = EXT_STATUS_OK;
++	pext->DetailStatus = EXT_STATUS_OK;
++	qla2x00_free_ioctl_scrap_mem(ha);
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	return (ret);
++}
++
++/*
++ * qla2x00_query_driver
++ *	Handles EXT_SC_QUERY_DRIVER subcommand.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = EXT_IOCTL structure pointer.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_query_driver(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int		ret = 0;
++	uint8_t		*usr_temp, *kernel_tmp;
++	uint32_t	transfer_size;
++	EXT_DRIVER	*pdriver_prop;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pdriver_prop,
++	    sizeof(EXT_DRIVER))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(EXT_DRIVER));)
++		return (ret);
++	}
++
++	sprintf(pdriver_prop->Version, qla2x00_version_str);
++	pdriver_prop->NumOfBus = MAX_BUSES;
++	pdriver_prop->TargetsPerBus = MAX_FIBRE_DEVICES;
++	pdriver_prop->LunsPerTarget = MAX_LUNS;
++	pdriver_prop->MaxTransferLen  = 0xffffffff;
++	pdriver_prop->MaxDataSegments = 0xffffffff;
++
++	if (ha->flags.enable_64bit_addressing == 1)
++		pdriver_prop->DmaBitAddresses = 64;
++	else
++		pdriver_prop->DmaBitAddresses = 32;
++
++	if (pext->ResponseLen < sizeof(EXT_DRIVER))
++		transfer_size = pext->ResponseLen;
++	else
++		transfer_size = sizeof(EXT_DRIVER);
++
++	ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr ,
++	    transfer_size);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++ 		DEBUG10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf.\n",
++ 		    __func__, ha->host_no, ha->instance);)
++ 		qla2x00_free_ioctl_scrap_mem(ha);
++ 		return (ret);
++	}
++
++	/* now copy up the ISP to user */
++	usr_temp   = (uint8_t *)pext->ResponseAdr;
++	kernel_tmp = (uint8_t *)pdriver_prop;
++ 	ret = copy_to_user(usr_temp, kernel_tmp, transfer_size);
++ 	if (ret) {
++ 		pext->Status = EXT_STATUS_COPY_ERR;
++ 		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n",
++ 		    __func__, ha->host_no, ha->instance);)
++ 		qla2x00_free_ioctl_scrap_mem(ha);
++ 		return (ret);
++ 	}
++
++	pext->Status       = EXT_STATUS_OK;
++	pext->DetailStatus = EXT_STATUS_OK;
++	qla2x00_free_ioctl_scrap_mem(ha);
++
++ 	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++ 	    __func__, ha->host_no, ha->instance);)
++
++ 	return (ret);
++}
++
++/*
++ * qla2x00_query_fw
++ *	Handles EXT_SC_QUERY_FW subcommand.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = EXT_IOCTL structure pointer.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_query_fw(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++ 	int		ret = 0;
++	uint8_t		*usr_temp, *kernel_tmp;
++	uint32_t	transfer_size;
++ 	EXT_FW		*pfw_prop;
++
++ 	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++ 	    __func__, ha->host_no, ha->instance);)
++
++ 	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pfw_prop,
++ 	    sizeof(EXT_FW))) {
++ 		/* not enough memory */
++ 		pext->Status = EXT_STATUS_NO_MEMORY;
++ 		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++ 		    "size requested=%d.\n",
++ 		    __func__, ha->host_no, ha->instance,
++ 		    sizeof(EXT_FW));)
++ 		return (ret);
++ 	}
++
++	pfw_prop->Version[0] = ha->fw_major_version; 
++	pfw_prop->Version[1] = ha->fw_minor_version; 
++	pfw_prop->Version[2] = ha->fw_subminor_version;
++
++	transfer_size = sizeof(EXT_FW);
++
++	ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr ,
++	    transfer_size);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf.\n",
++		    __func__, ha->host_no, ha->instance);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	usr_temp   = (uint8_t *)pext->ResponseAdr;
++	kernel_tmp = (uint8_t *)pfw_prop;
++	ret = copy_to_user(usr_temp, kernel_tmp, transfer_size);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n",
++		    __func__, ha->host_no, ha->instance);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	pext->Status       = EXT_STATUS_OK;
++	pext->DetailStatus = EXT_STATUS_OK;
++	qla2x00_free_ioctl_scrap_mem(ha);
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	return (ret);
++}
++
++#if defined(ISP2300)
++/*
++ * qla2x00_send_els_passthru
++ *	Passes the ELS command down to firmware as MSIOCB and
++ *	copies the response back when it completes.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = EXT_IOCTL structure pointer.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_send_els_passthru(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int		ret = 0;
++	int		tmp_rval = 0;
++
++	uint8_t		index;
++	uint8_t		invalid_wwn = FALSE;
++	uint8_t		port_found;
++	uint8_t		*ptmp_stat;
++	uint8_t		*pusr_req_buf;
++	uint8_t		*presp_payload;
++	uint32_t	payload_len;
++	uint32_t	usr_req_len;
++
++	fcdev_t		tmpdev;
++
++	fc_lun_t	*ptemp_fclun;	/* buf from scrap mem */
++	fc_port_t	*ptemp_fcport;	/* buf from scrap mem */
++
++	struct list_head *fcpl;
++	fc_port_t	*fcport;
++
++	os_lun_t	*plq;
++	os_tgt_t	*ptq;
++
++	Scsi_Cmnd	*pscsi_cmd;
++
++	srb_t		*sp = NULL;
++	EXT_ELS_PT_REQ	*pels_pt_req;
++
++	struct list_head *fcil;
++	fc_initiator_t	*fcinitiator;
++
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	/* check on current topology */
++	if ((ha->current_topology != ISP_CFG_F) &&
++	    (ha->current_topology != ISP_CFG_FL)) {
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR not in F or FL mode\n",
++		    __func__, ha->host_no, ha->instance);)
++		return (ret);
++	}
++
++	if (ha->ioctl_mem_size <= 0) {
++		if (qla2x00_get_new_ioctl_dma_mem(ha,
++		    QLA_INITIAL_IOCTLMEM_SIZE) != QL_STATUS_SUCCESS) {
++
++			DEBUG9_10(printk("%s: ERROR cannot alloc DMA "
++			    "buffer size=%lx.\n",
++			    __func__, QLA_INITIAL_IOCTLMEM_SIZE);)
++
++			pext->Status = EXT_STATUS_NO_MEMORY;
++			return (ret);
++		}
++	}
++
++	if (pext->ResponseLen > ha->ioctl_mem_size) {
++		if (qla2x00_get_new_ioctl_dma_mem(ha, pext->ResponseLen) !=
++		    QL_STATUS_SUCCESS) {
++
++			DEBUG9_10(printk("%s: ERROR cannot alloc requested"
++			    "DMA buffer size %x.\n",
++			    __func__, pext->ResponseLen);)
++
++			pext->Status = EXT_STATUS_NO_MEMORY;
++			return (ret);
++		}
++
++		DEBUG9(printk("%s(%ld): inst=%ld rsp buf length larger than "
++		    "existing size. Additional mem alloc successful.\n",
++		    __func__, ha->host_no, ha->instance);)
++	}
++
++	usr_req_len = pext->RequestLen - sizeof(EXT_ELS_PT_REQ);
++	if (usr_req_len > ha->ioctl_mem_size) {
++		pext->Status = EXT_STATUS_INVALID_PARAM;
++
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR ReqLen too big=%x.\n",
++		    __func__, ha->host_no, ha->instance, pext->RequestLen);)
++
++		return (ret);
++	}
++
++	/* Verify entire EXT IOCTL request buffer */
++	
++	ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr,
++	    pext->RequestLen);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk(
++		    "%s(%ld): inst=%ld ERROR verify read req buf\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		return (ret);
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld req buf verified.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi_cmd,
++	    sizeof(Scsi_Cmnd))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(Scsi_Cmnd));)
++		return (ret);
++	}
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pels_pt_req,
++	    sizeof(EXT_ELS_PT_REQ))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "els_pt_req size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(EXT_ELS_PT_REQ));)
++		goto els_passthru_done;
++	}
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptemp_fclun,
++	    sizeof(fc_lun_t))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "fclun size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(fc_lun_t));)
++		goto els_passthru_done;
++	}
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptemp_fcport,
++	    sizeof(fc_port_t))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "fcport size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(fc_port_t));)
++		goto els_passthru_done;
++	}
++
++	/* initialize */
++
++	memset(ha->ioctl_mem, 0, ha->ioctl_mem_size);
++
++	/* copy request buffer */
++	
++	ret = copy_from_user(pels_pt_req, pext->RequestAdr,
++	    sizeof(EXT_ELS_PT_REQ));
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR"
++		    "copy_from_user() of struct failed (%d).\n",
++		    __func__, ha->host_no, ha->instance, ret);)
++
++		goto els_passthru_done;
++	}
++
++	pusr_req_buf = (uint8_t *)pext->RequestAdr + sizeof(EXT_ELS_PT_REQ);
++	
++	ret = copy_from_user(ha->ioctl_mem, pusr_req_buf, usr_req_len);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR"
++		    "copy_from_user() of request buf failed (%d).\n",
++		    __func__, ha->host_no, ha->instance, ret);)
++
++		goto els_passthru_done;
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld after copy request.\n",
++	    __func__, ha->host_no, ha->instance);)
++	
++	/* check on loop down (1) */
++	if (ha->loop_state != LOOP_READY || 
++	    test_bit(CFG_ACTIVE, &ha->cfg_flags) ||
++	    (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ABORTS_ACTIVE) {
++
++		DEBUG9_10(printk(
++		    "%s(%ld): inst=%ld before dest port validation- loop not "
++		    "ready; cannot proceed.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		pext->Status = EXT_STATUS_BUSY;
++
++		goto els_passthru_done;
++	}
++
++	/*********************************/
++	/* Validate the destination port */
++	/*********************************/
++
++	/* first: WWN cannot be zero if no PID is specified */
++	invalid_wwn = qla2x00_is_wwn_zero(pels_pt_req->WWPN);
++	if (invalid_wwn && !(pels_pt_req->ValidMask & EXT_DEF_PID_VALID)) {
++		/* error: both are not set. */
++		pext->Status = EXT_STATUS_INVALID_PARAM;
++
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR no valid WWPN/PID\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		goto els_passthru_done;
++	}
++
++	/* second: it cannot be the local/current HBA itself */
++	if (!invalid_wwn) {
++		if (memcmp(ha->init_cb->port_name, pels_pt_req->WWPN,
++		    EXT_DEF_WWN_NAME_SIZE) == 0) {
++
++			/* local HBA specified. */
++
++			pext->Status = EXT_STATUS_INVALID_PARAM;
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR local HBA's "
++			    "WWPN found.\n",
++			    __func__, ha->host_no, ha->instance);)
++
++			goto els_passthru_done;
++		}
++	} else { /* using PID */
++		if (pels_pt_req->Id[1] == ha->d_id.r.d_id[2]
++		    && pels_pt_req->Id[2] == ha->d_id.r.d_id[1]
++		    && pels_pt_req->Id[3] == ha->d_id.r.d_id[0]) {
++
++			/* local HBA specified. */
++
++			pext->Status = EXT_STATUS_INVALID_PARAM;
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR local HBA's "
++			    "PID found.\n",
++			    __func__, ha->host_no, ha->instance);)
++
++			goto els_passthru_done;
++		}
++	}
++
++	/************************/
++	/* Now find the loop ID */
++	/************************/
++
++	/* 1st: scan thru our HBA database */
++	index = 0;
++	port_found = FALSE;
++	fcinitiator = NULL;
++	if (!invalid_wwn) {
++		/* search with WWPN */
++		list_for_each(fcil, &ha->fcinitiators) {
++			fcinitiator = list_entry(fcil, fc_initiator_t, list);
++
++			if (memcmp(pels_pt_req->WWPN, fcinitiator->port_name,
++				 EXT_DEF_WWN_NAME_SIZE) == 0) {
++
++				port_found = TRUE;
++				pels_pt_req->Lid = fcinitiator->loop_id;
++
++				DEBUG9(printk("%s(%ld): inst=%ld found host "
++				    "w/ WWN. loop_id = %02x.\n",
++				    __func__, ha->host_no, ha->instance,
++				    pels_pt_req->Lid);)
++
++				break;
++			}
++		}
++	} else {
++		/* search with PID */
++		list_for_each(fcil, &ha->fcinitiators) {
++			fcinitiator = list_entry(fcil, fc_initiator_t, list);
++
++			if (pels_pt_req->Id[1] == fcinitiator->d_id.r.d_id[2]
++			    && pels_pt_req->Id[2] == fcinitiator->d_id.r.d_id[1]
++			    && pels_pt_req->Id[3] ==
++				    fcinitiator->d_id.r.d_id[0]) {
++
++				port_found = TRUE;
++				pels_pt_req->Lid = fcinitiator->loop_id;
++
++				DEBUG9(printk("%s(%ld): inst=%ld found host "
++				    "w/ WWN. loop_id = %02x.\n",
++				    __func__, ha->host_no, ha->instance,
++				    pels_pt_req->Lid);)
++
++				break;
++			}
++		}
++	}
++
++	/* If this is for a host device, check if we need to perform login */
++	if (port_found && (fcinitiator->loop_id >= LAST_SNS_LOOP_ID)) {
++
++		DEBUG9_10(printk("%s(%ld): inst=%ld need to relogin to "
++		    "dest host.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		if (fcinitiator->d_id.b24 == 0) {
++			/* Either RSCN hasn't been processed yet or
++			 * this host is no longer connected to us.
++			 */
++			pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR dest host "
++			    "port lost.\n",
++			    __func__, ha->host_no, ha->instance);)
++
++			goto els_passthru_done;
++		}
++
++		/* login and update database */
++		tmpdev.d_id.b24 = fcinitiator->d_id.b24;
++		tmpdev.loop_id = fcinitiator->loop_id;
++
++		if (qla2x00_host_relogin(ha, &tmpdev) != 0) {
++			/* login failed. */
++			pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR login to "
++			    "host port failed. loop_id=%02x pid=%02x%02x%02x "
++			    "ret=%d.\n",
++			    __func__, ha->host_no, ha->instance, tmpdev.loop_id,
++			    tmpdev.d_id.b.domain,
++			    tmpdev.d_id.b.area,
++			    tmpdev.d_id.b.al_pa,
++			    ret);)
++
++			goto els_passthru_done;
++		} else {
++			fcinitiator->loop_id = tmpdev.loop_id;
++			pels_pt_req->Lid = tmpdev.loop_id;
++
++			DEBUG9(printk("%s(%ld): inst=%ld success login to "
++			    "remote host; Lid=%02x.\n",
++			    __func__, ha->host_no, ha->instance,
++			    fcinitiator->loop_id);)
++		}
++	}
++	
++	/* 2nd: scan thru our fcport database */
++	if (!invalid_wwn && !port_found) {
++		/* search with WWPN */
++		list_for_each(fcpl, &ha->fcports) {
++			fcport = list_entry(fcpl, fc_port_t, list);
++	 
++			if (memcmp(fcport->port_name, pels_pt_req->WWPN,
++			    EXT_DEF_WWN_NAME_SIZE) == 0) {
++
++				port_found = TRUE;
++				pels_pt_req->Lid = fcport->loop_id;
++
++				DEBUG9(printk("%s(%ld): inst=%ld found fcport "
++				    "w/ WWN. loop_id = %02x.\n",
++				    __func__, ha->host_no, ha->instance,
++				    pels_pt_req->Lid);)
++				break;
++			}
++		}
++	} else  if (!port_found) {
++		/* search with PID */
++		list_for_each(fcpl, &ha->fcports) {
++			fcport = list_entry(fcpl, fc_port_t, list);
++	 
++			if (pels_pt_req->Id[1] == fcport->d_id.r.d_id[2]
++			    && pels_pt_req->Id[2] == fcport->d_id.r.d_id[1]
++			    && pels_pt_req->Id[3] == fcport->d_id.r.d_id[0]) {
++
++				port_found = TRUE;
++				pels_pt_req->Lid = fcport->loop_id;
++
++				DEBUG9(printk("%s(%ld): inst=%ld found fcport "
++				    "w/ PID. loop_id = %02x.\n",
++				    __func__, ha->host_no, ha->instance,
++				    pels_pt_req->Lid);)
++
++				break;
++			}
++		}
++	}
++	
++	if (!port_found) {
++		/* invalid WWN or PID specified */
++		pext->Status = EXT_STATUS_INVALID_PARAM;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR WWPN/PID invalid.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		goto els_passthru_done;
++	}
++
++	/* alloc sp */
++	if ((sp = qla2x00_get_new_sp(ha)) == NULL) {
++
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s: ERROR cannot alloc sp %p.\n",
++		    __func__, sp);)
++
++		goto els_passthru_done;
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld after alloc sp.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	/* setup sp for this command */
++	ptq = ha->ioctl->ioctl_tq;
++	plq = ha->ioctl->ioctl_lq;
++	sp->cmd = pscsi_cmd;
++	sp->flags = SRB_IOCTL;
++	sp->lun_queue = plq;
++	sp->tgt_queue = ptq;
++	ptemp_fclun->fcport = ptemp_fcport;
++	ptemp_fclun->lun = 0;
++	ptemp_fclun->flags = 0;
++	plq->fclun = ptemp_fclun;
++	plq->fclun->fcport->ha = ha;
++
++	/* init scsi_cmd */
++	pscsi_cmd->device->host = ha->host;
++	pscsi_cmd->scsi_done = qla2x00_msiocb_done;
++
++	/* check on loop down (2)- check again just before sending cmd out. */
++	if (ha->loop_state != LOOP_READY || 
++	    test_bit(CFG_ACTIVE, &ha->cfg_flags) ||
++	    (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) ||
++	    ABORTS_ACTIVE) {
++
++		DEBUG9_10(printk("%s(%ld): inst=%ld before issue cmd- loop "
++		    "not ready.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		pext->Status = EXT_STATUS_BUSY;
++
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++
++		goto els_passthru_done;
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld going to issue command.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	tmp_rval = qla2x00_start_ms_cmd(ha, pext, sp, pels_pt_req);
++
++	DEBUG9(printk("%s(%ld): inst=%ld after issue command.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	if (tmp_rval != 0) {
++		/* We waited and post function did not get called */
++		DEBUG9_10(printk("%s(%ld): inst=%ld command timed out.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		pext->Status = EXT_STATUS_MS_NO_RESPONSE;
++
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++
++		goto els_passthru_done;
++	}
++
++	/* check on data returned */
++	ptmp_stat = (uint8_t *)ha->ioctl_mem + FC_HEADER_LEN;
++
++	if (*ptmp_stat == ELS_STAT_LS_RJT) {
++		payload_len = FC_HEADER_LEN + ELS_RJT_LENGTH;
++
++	} else if (*ptmp_stat == ELS_STAT_LS_ACC) {
++		payload_len = pext->ResponseLen - sizeof(EXT_ELS_PT_REQ);
++
++	} else {
++		/* invalid. just copy the status word. */
++		DEBUG9_10(printk("%s(%ld): inst=%ld invalid stat "
++		    "returned =0x%x.\n",
++		    __func__, ha->host_no, ha->instance, *ptmp_stat);)
++
++		payload_len = FC_HEADER_LEN + 4;
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld data dump-\n",
++	    __func__, ha->host_no, ha->instance);)
++	DEBUG9(qla2x00_dump_buffer((uint8_t *)ptmp_stat,
++	    pext->ResponseLen - sizeof(EXT_ELS_PT_REQ) - FC_HEADER_LEN);)
++	
++	/* Verify response buffer to be written */
++	/* The data returned include FC frame header */
++	presp_payload = (uint8_t *)pext->ResponseAdr + sizeof(EXT_ELS_PT_REQ);
++
++	ret = verify_area(VERIFY_WRITE, (void *)presp_payload, payload_len);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp "
++		    "buffer. ha=%p.\n",
++		    __func__, ha->host_no, ha->instance, ha);)
++
++		goto els_passthru_done;
++	}
++
++	/* copy back data returned to response buffer */
++	ret = copy_to_user(presp_payload, (uint8_t *)ha->ioctl_mem,
++	    payload_len);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n",
++		    __func__, ha->host_no, ha->instance);)
++		goto els_passthru_done;
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting normally.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++els_passthru_done:
++
++	qla2x00_free_ioctl_scrap_mem(ha);
++	return (ret);
++}
++#endif
++
++/*
++ * qla2x00_send_fcct
++ *	Passes the FC CT command down to firmware as MSIOCB and
++ *	copies the response back when it completes.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = EXT_IOCTL structure pointer.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_send_fcct(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int		ret = 0;
++	int		tmp_rval = 0;
++	uint16_t	mb[MAILBOX_REGISTER_COUNT];
++
++	fc_lun_t	*ptemp_fclun;
++	fc_port_t	*ptemp_fcport;
++
++	os_lun_t	*lq;
++	os_tgt_t	*tq;
++
++	Scsi_Cmnd	*pscsi_cmd;
++	srb_t		*sp = NULL;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	/* check on current topology */
++	if ((ha->current_topology != ISP_CFG_F) &&
++	    (ha->current_topology != ISP_CFG_FL)) {
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR not in F or FL mode\n",
++		    __func__, ha->host_no, ha->instance);)
++		return (ret);
++	}
++
++	if (ha->ioctl_mem_size <= 0) {
++		if (qla2x00_get_new_ioctl_dma_mem(ha,
++		    QLA_INITIAL_IOCTLMEM_SIZE) != QL_STATUS_SUCCESS) {
++
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc "
++			    "DMA buffer size=%lx.\n",
++			    __func__, ha->host_no, ha->instance,
++			    QLA_INITIAL_IOCTLMEM_SIZE);)
++
++			pext->Status = EXT_STATUS_NO_MEMORY;
++			return (ret);
++		}
++	}
++
++	if (pext->ResponseLen > ha->ioctl_mem_size) {
++		if (qla2x00_get_new_ioctl_dma_mem(ha, pext->ResponseLen) !=
++		    QL_STATUS_SUCCESS) {
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc "
++			    "requested DMA buffer size %x.\n",
++			    __func__, ha->host_no, ha->instance,
++			    pext->ResponseLen);)
++			pext->Status = EXT_STATUS_NO_MEMORY;
++			return (ret);
++		}
++
++		DEBUG9(printk("%s(%ld): inst=%ld rsp buf len larger than "
++		    "existing size. Additional mem alloc successful.\n",
++		    __func__, ha->host_no, ha->instance);)
++	}
++
++	if (pext->RequestLen > ha->ioctl_mem_size) {
++		pext->Status = EXT_STATUS_INVALID_PARAM;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR ReqLen too big=%x.\n",
++		    __func__, ha->host_no, ha->instance, pext->RequestLen);)
++
++		return (ret);
++	}
++
++	ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr,
++	    pext->RequestLen);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk(
++		    "%s(%ld): inst=%ld ERROR verify read req buf\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		return (ret);
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld req buf verified.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi_cmd,
++	    sizeof(Scsi_Cmnd))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(Scsi_Cmnd));)
++		return (ret);
++	}
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptemp_fclun,
++	    sizeof(fc_lun_t))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "fclun size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(fc_lun_t));)
++		goto fcct_passthru_done;
++	}
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptemp_fcport,
++	    sizeof(fc_port_t))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "fcport size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(fc_port_t));)
++		goto fcct_passthru_done;
++	}
++
++	/* initialize */
++	memset(ha->ioctl_mem, 0, ha->ioctl_mem_size);
++
++	/* copy request buffer */
++	ret = copy_from_user(ha->ioctl_mem, pext->RequestAdr, pext->RequestLen);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk(
++		    "%s(%ld): inst=%ld ERROR copy req buf. ret=%d\n",
++		    __func__, ha->host_no, ha->instance, ret);)
++
++
++		goto fcct_passthru_done;
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld after copy request.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	/* alloc sp */
++	if ((sp = qla2x00_get_new_sp(ha)) == NULL) {
++
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc "
++		    "sp %p.\n",
++		    __func__, ha->host_no, ha->instance, sp);)
++
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		goto fcct_passthru_done;
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld after alloc sp.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	/* setup sp for this command */
++	tq = ha->ioctl->ioctl_tq;
++	lq = ha->ioctl->ioctl_lq;
++	sp->cmd = pscsi_cmd;
++	sp->flags = SRB_IOCTL;
++	sp->lun_queue = lq;
++	sp->tgt_queue = tq;
++	ptemp_fclun->fcport = ptemp_fcport;
++	ptemp_fclun->lun = 0;
++	ptemp_fclun->flags = 0;
++	lq->fclun = ptemp_fclun;
++	lq->fclun->fcport->ha = ha;
++
++	/* init scsi_cmd */
++	pscsi_cmd->device->host = ha->host;
++	pscsi_cmd->scsi_done = qla2x00_msiocb_done;
++
++	/* check on management server login status */
++	if (ha->flags.management_server_logged_in == 0) {
++		/* login to management server device */
++
++		tmp_rval = qla2x00_login_fabric(ha, MANAGEMENT_SERVER,
++		    0xff, 0xff, 0xfa, &mb[0], BIT_1);
++
++		if (tmp_rval != 0 || mb[0] != 0x4000) {
++			pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++
++	 		DEBUG10(printk("%s(%ld): inst=%ld ERROR login to MS.\n",
++			    __func__, ha->host_no, ha->instance);)
++
++			atomic_set(&sp->ref_count, 0);
++			add_to_free_queue (ha, sp);
++
++			goto fcct_passthru_done;
++		}
++
++		ha->flags.management_server_logged_in = 1;
++	}
++
++	DEBUG9(printk("%s(%ld): success login to MS.\n",
++	    __func__, ha->host_no);)
++
++	/* check on loop down */
++	if (ha->loop_state != LOOP_READY || 
++	    test_bit(CFG_ACTIVE, &ha->cfg_flags) ||
++	    (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) ||
++	    ABORTS_ACTIVE) {
++
++		DEBUG10(printk("%s(%ld): inst=%ld loop not ready.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		pext->Status = EXT_STATUS_BUSY;
++
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++
++		goto fcct_passthru_done;
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld going to issue command.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	tmp_rval = qla2x00_start_ms_cmd(ha, pext, sp, NULL);
++
++	DEBUG9(printk("%s(%ld): inst=%ld after issue command.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	if (tmp_rval != 0) {
++		/* We waited and post function did not get called */
++		DEBUG9_10(printk("%s(%ld): inst=%ld command timed out.\n",
++		    __func__, ha->host_no, ha->instance);)
++		pext->Status = EXT_STATUS_MS_NO_RESPONSE;
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++
++		goto fcct_passthru_done;
++	}
++
++	if (CMD_COMPL_STATUS(pscsi_cmd) != 0 ||
++	    CMD_ENTRY_STATUS(pscsi_cmd) != 0) {
++		DEBUG9_10(printk("%s(%ld): inst=%ld cmd returned error=%x.\n",
++		    __func__, ha->host_no, ha->instance,
++		    CMD_COMPL_STATUS(pscsi_cmd));)
++		pext->Status = EXT_STATUS_ERR;
++		goto fcct_passthru_done;
++	}
++
++	/* getting device data and putting in pext->ResponseAdr */
++	ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr ,
++	    pext->ResponseLen);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp "
++		    "buffer. ha=%p.\n",
++		    __func__, ha->host_no, ha->instance, ha);)
++		goto fcct_passthru_done;
++	}
++
++	/* sending back data returned from Management Server */
++	ret = copy_to_user((uint8_t *)pext->ResponseAdr,
++	    (uint8_t *)ha->ioctl_mem, pext->ResponseLen);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n",
++		    __func__, ha->host_no, ha->instance);)
++		goto fcct_passthru_done;
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++fcct_passthru_done:
++
++	qla2x00_free_ioctl_scrap_mem(ha);
++	return (ret);
++}
++
++/*
++ * qla2x00_start_ms_cmd
++ *	Allocates an MSIOCB request pkt and sends out the passthru cmd.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_start_ms_cmd(scsi_qla_host_t *ha, EXT_IOCTL *pext, srb_t *sp,
++    EXT_ELS_PT_REQ *pels_pt_req)
++{
++#define	ELS_REQUEST_RCTL	0x22
++#define ELS_REPLY_RCTL		0x23
++
++	uint32_t	usr_req_len;
++	uint32_t	usr_resp_len;
++	uint64_t	usr_reqbuf_addr;
++
++	ms_iocb_entry_t		*pkt;
++	unsigned long		cpu_flags = 0;
++
++
++	/* get spin lock for this operation */
++	spin_lock_irqsave(&ha->hardware_lock, cpu_flags);
++
++	/* Get MS request packet. */
++	pkt = (ms_iocb_entry_t *)qla2x00_ms_req_pkt(ha, sp);
++	if (pkt == NULL) {
++		/* release spin lock and return error. */
++		spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags);
++
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG10(printk("%s(%ld): inst=%ld MSIOCB PT - could not get "
++		    "Request Packet.\n", __func__, ha->host_no, ha->instance);)
++		return (QL_STATUS_RESOURCE_ERROR);
++	}
++
++	pkt->entry_type  = MS_IOCB_TYPE;
++	pkt->entry_count = 1;
++	
++	if (pels_pt_req != NULL) {
++		/* process ELS passthru command */
++		usr_reqbuf_addr = (uint64_t)ha->ioctl_mem_phys +
++		    sizeof(EXT_ELS_PT_REQ);
++		usr_req_len = pext->RequestLen - sizeof(EXT_ELS_PT_REQ);
++		usr_resp_len = pext->ResponseLen - sizeof(EXT_ELS_PT_REQ);
++	
++		pkt->control_flags = BIT_15; /* ELS passthru enabled */
++		pkt->loop_id = pels_pt_req->Lid;
++		pkt->type    = 1; /* ELS frame */
++		
++		if (pext->ResponseLen != 0) {
++			pkt->r_ctl    = ELS_REQUEST_RCTL;
++			pkt->rx_id    = 0;
++		} else {
++			pkt->r_ctl    = ELS_REPLY_RCTL;
++			pkt->rx_id    = pels_pt_req->Rxid;
++		}
++	} else {
++		usr_reqbuf_addr = (uint64_t)ha->ioctl_mem_phys;
++		usr_req_len = pext->RequestLen;
++		usr_resp_len = pext->ResponseLen;
++		pkt->loop_id     = MANAGEMENT_SERVER;
++	}
++
++	DEBUG9_10(printk("%s(%ld): inst=%ld using loop_id=%02x req_len=%d, "
++	    "resp_len=%d.\n", __func__, ha->host_no, ha->instance,
++	    pkt->loop_id, usr_req_len, usr_resp_len);)
++
++	pkt->timeout = QLA_PT_CMD_TOV;
++	pkt->cmd_dsd_count = 1;
++	pkt->total_dsd_count = 2; /* no continuation */
++	pkt->rsp_bytecount = usr_resp_len;
++	pkt->req_bytecount = usr_req_len;
++
++	/* loading command payload address */
++	pkt->dseg_req_address[0] = LSD(usr_reqbuf_addr);
++	pkt->dseg_req_address[1] = MSD(usr_reqbuf_addr);
++	pkt->dseg_req_length = usr_req_len;
++
++	/* loading response payload address */
++	pkt->dseg_rsp_address[0] = LSD(ha->ioctl_mem_phys);
++	pkt->dseg_rsp_address[1] = MSD(ha->ioctl_mem_phys);
++	pkt->dseg_rsp_length = usr_resp_len;
++
++	/* set flag to indicate IOCTL MSIOCB cmd in progress */
++	ha->ioctl->MSIOCB_InProgress = 1;
++	ha->ioctl->ioctl_tov = pkt->timeout + 1; /* 1 second more */
++
++	/* prepare for receiving completion. */
++	qla2x00_ioctl_sem_init(ha);
++
++	/* Issue command to ISP */
++	qla2x00_isp_cmd(ha);
++
++	ha->ioctl->cmpl_timer.expires = jiffies + ha->ioctl->ioctl_tov * HZ;
++	add_timer(&ha->ioctl->cmpl_timer);
++
++	DEBUG9(printk("%s(%ld): inst=%ld releasing hardware_lock.\n",
++	    __func__, ha->host_no, ha->instance);)
++	spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags);
++
++	DEBUG9(printk("%s(%ld): inst=%ld sleep for completion.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	down(&ha->ioctl->cmpl_sem);
++
++	del_timer(&ha->ioctl->cmpl_timer);
++
++	if (ha->ioctl->MSIOCB_InProgress == 1) {
++	 	DEBUG9_10(printk("%s(%ld): inst=%ld timed out. exiting.\n",
++		    __func__, ha->host_no, ha->instance);)
++		return QL_STATUS_ERROR;
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	return QL_STATUS_SUCCESS;
++}
++
++/*
++ * qla2x00_wwpn_to_scsiaddr
++ *	Handles the EXT_CC_WWPN_TO_SCSIADDR command.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = EXT_IOCTL structure pointer.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_wwpn_to_scsiaddr(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int		ret = 0;
++	fc_port_t	*tgt_fcport;
++	os_tgt_t	*tq;
++	uint8_t		tmp_wwpn[EXT_DEF_WWN_NAME_SIZE];
++	uint32_t	b, tgt, l;
++	EXT_SCSI_ADDR	tmp_addr;
++
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	if (pext->RequestLen != EXT_DEF_WWN_NAME_SIZE ||
++	    pext->ResponseLen < sizeof(EXT_SCSI_ADDR)) {
++		/* error */
++		DEBUG9_10(printk("%s(%ld): inst=%ld invalid WWN buffer size %d "
++		    "received.\n",
++		    __func__, ha->host_no, ha->instance, pext->ResponseLen);)
++		pext->Status = EXT_STATUS_INVALID_PARAM;
++
++		return (ret);
++	}
++
++	ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr,
++	    pext->RequestLen);
++	if (ret) {
++		DEBUG9_10(printk(
++		    "%s(%ld): inst=%ld ERROR VERIFY_READ req buf\n",
++		    __func__, ha->host_no, ha->instance);)
++		pext->Status = EXT_STATUS_COPY_ERR;
++		return (ret);
++	}
++
++	ret = copy_from_user(tmp_wwpn, pext->RequestAdr, pext->RequestLen);
++	if (ret) {
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy_from_user "
++		    "failed(%d) on request buf.\n",
++		    __func__, ha->host_no, ha->instance, ret);)
++		pext->Status = EXT_STATUS_COPY_ERR;
++		return (ret);
++	}
++
++	tq = NULL;
++	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++		if (ha->otgt[tgt] == NULL) {
++			continue;
++		}
++
++		tq = ha->otgt[tgt];
++		if (tq->vis_port == NULL) {
++			break;
++		}
++
++		tgt_fcport = tq->vis_port;
++		if (memcmp(tmp_wwpn, tgt_fcport->port_name,
++		    EXT_DEF_WWN_NAME_SIZE) == 0) {
++			break;
++		}
++	}
++
++	if (tq == NULL || tgt >= MAX_TARGETS) {
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		DEBUG9_10(printk("%s(%ld): inst=%ld target dev not found. "
++		    "tq=%p, tgt=%x.\n", __func__, ha->host_no, ha->instance,
++		    tq, tgt);)
++		return (ret);
++	}
++
++	if (tq->vis_port == NULL) { 	/* dg 08/14/01 */
++		pext->Status = EXT_STATUS_BUSY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld target port not found. "
++		    "tq=%p, tgt=%x.\n",
++		    __func__, ha->host_no, ha->instance, tq, tgt);)
++		return (ret);
++	}	
++
++	/* Currently we only have bus 0 and no translation on LUN */
++	b = 0;
++	l = 0;
++
++	/*
++	 * Return SCSI address. Currently no translation is done for
++	 * LUN.
++	 */
++	tmp_addr.Bus = b;
++	tmp_addr.Target = tgt;
++	tmp_addr.Lun = l;
++	if (pext->ResponseLen > sizeof(EXT_SCSI_ADDR))
++		pext->ResponseLen = sizeof(EXT_SCSI_ADDR);
++
++	ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr,
++	    pext->ResponseLen);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR VERIFY wrt rsp buf\n",
++		    __func__, ha->host_no, ha->instance);)
++		return (ret);
++	}
++
++	ret = copy_to_user((uint8_t *)pext->ResponseAdr, &tmp_addr,
++	    pext->ResponseLen);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n",
++		    __func__, ha->host_no, ha->instance);)
++		return (ret);
++	}
++
++	DEBUG9(printk(KERN_INFO
++	    "%s(%ld): Found t%d l%d for %02x%02x%02x%02x%02x%02x%02x%02x.\n",
++	    __func__, ha->host_no,
++	    tmp_addr.Target, tmp_addr.Lun,
++	    tmp_wwpn[0], tmp_wwpn[1], tmp_wwpn[2], tmp_wwpn[3],
++	    tmp_wwpn[4], tmp_wwpn[5], tmp_wwpn[6], tmp_wwpn[7]);)
++
++	pext->Status = EXT_STATUS_OK;
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	return (ret);
++}
++
++/*
++ * qla2x00_scsi_passthru
++ *	Handles all subcommands of the EXT_CC_SEND_SCSI_PASSTHRU command.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = EXT_IOCTL structure pointer.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_scsi_passthru(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int tmp_rval = 0;
++
++	switch(pext->SubCode) {
++	case EXT_SC_SEND_SCSI_PASSTHRU:
++		tmp_rval = qla2x00_sc_scsi_passthru(ha, pext, mode);
++		break;
++	case EXT_SC_SEND_FC_SCSI_PASSTHRU:
++		tmp_rval = qla2x00_sc_fc_scsi_passthru(ha, pext, mode);
++		break;
++	case EXT_SC_SCSI3_PASSTHRU:
++		tmp_rval = qla2x00_sc_scsi3_passthru(ha, pext, mode);
++		break;
++	default:
++		break;
++	}
++
++	return tmp_rval;
++}
++
++/*
++ * qla2x00_sc_scsi_passthru
++ *	Handles EXT_SC_SEND_SCSI_PASSTHRU subcommand.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = EXT_IOCTL structure pointer.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_sc_scsi_passthru(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int		ret = 0;
++	uint8_t		*usr_temp, *kernel_tmp;
++	uint8_t		scsi_direction;
++	uint32_t	i;
++
++#if defined(QL_DEBUG_LEVEL_9)
++	uint32_t	b, t, l;
++#endif
++	uint32_t	transfer_len;
++
++	EXT_SCSI_PASSTHRU	*pscsi_pass;
++
++	Scsi_Cmnd		*pscsi_cmd;
++	Scsi_Device		*pscsi_device;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr,
++	    sizeof(EXT_SCSI_PASSTHRU));
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify READ "
++		    "req buf.\n",
++		    __func__, ha->host_no, ha->instance);)
++		return (ret);
++	}
++
++	if (pext->ResponseLen > ha->ioctl_mem_size) {
++		if (qla2x00_get_new_ioctl_dma_mem(ha, pext->ResponseLen) !=
++		    QL_STATUS_SUCCESS) {
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc "
++			    "requested DMA buffer size %x.\n",
++			    __func__, ha->host_no, ha->instance,
++			    pext->ResponseLen);)
++			pext->Status = EXT_STATUS_NO_MEMORY;
++			return (ret);
++		}
++	}
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi_pass,
++	    sizeof(EXT_SCSI_PASSTHRU))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(EXT_SCSI_PASSTHRU));)
++		return (ret);
++	}
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi_cmd,
++	    sizeof(Scsi_Cmnd))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "pscsi_cmd requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(Scsi_Cmnd));)
++		goto scsi_passthru_done;
++	}
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi_device,
++	    sizeof(Scsi_Device))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "pscsi_device requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(Scsi_Device));)
++		goto scsi_passthru_done;
++	}
++
++	/* clear ioctl_mem to be used */
++	memset(ha->ioctl_mem, 0, ha->ioctl_mem_size);
++
++	/* Copy request buffer */
++	usr_temp = (uint8_t *)pext->RequestAdr;
++	kernel_tmp = (uint8_t *)pscsi_pass;
++	ret = copy_from_user(kernel_tmp, usr_temp, sizeof(EXT_SCSI_PASSTHRU));
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk(
++		    "%s(%ld): inst=%ld ERROR copy req buf ret=%d\n",
++		    __func__, ha->host_no, ha->instance, ret);)
++		goto scsi_passthru_done;
++	}
++
++	/* set target coordinates */
++	pscsi_cmd->device->id = pscsi_pass->TargetAddr.Target;
++	pscsi_cmd->device->lun = pscsi_pass->TargetAddr.Lun;
++
++	/* Verify target exists */
++	if (TGT_Q(ha, pscsi_cmd->device->id) == NULL) {
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR tgt %d not found.\n",
++		    __func__,
++		    ha->host_no, ha->instance, pscsi_cmd->device->id));
++		goto scsi_passthru_done;
++	}
++
++	/* Copy over cdb */
++
++	if (pscsi_pass->CdbLength == 6) {
++		pscsi_cmd->cmd_len = 6;
++
++	} else if (pscsi_pass->CdbLength == 10) {
++		pscsi_cmd->cmd_len = 0x0A;
++
++	} else if (pscsi_pass->CdbLength == 12) {
++		pscsi_cmd->cmd_len = 0x0C;
++
++	} else {
++		printk(KERN_WARNING
++		    "%s: Unsupported Cdb Length=%x.\n",
++		    __func__, pscsi_pass->CdbLength);
++
++		pext->Status = EXT_STATUS_INVALID_PARAM;
++		goto scsi_passthru_done;
++	}
++
++	memcpy(pscsi_cmd->data_cmnd, pscsi_pass->Cdb, pscsi_cmd->cmd_len);
++	memcpy(pscsi_cmd->cmnd, pscsi_pass->Cdb, pscsi_cmd->cmd_len);
++
++	DEBUG9(printk("%s Dump of cdb buffer:\n", __func__);)
++	DEBUG9(qla2x00_dump_buffer((uint8_t *)&pscsi_cmd->data_cmnd[0],
++	    pscsi_cmd->cmd_len);)
++
++	pscsi_cmd->device->host = ha->host;
++
++	/* mark this as a special delivery and collection command */
++	pscsi_cmd->flags     = 0;
++	pscsi_cmd->scsi_done = qla2x00_scsi_pt_done;
++
++	pscsi_cmd->device               = pscsi_device;
++	pscsi_cmd->device->tagged_queue = 0;
++	pscsi_cmd->use_sg               = 0; /* no ScatterGather */
++	pscsi_cmd->request_bufflen      = pext->ResponseLen;
++	pscsi_cmd->request_buffer       = ha->ioctl_mem;
++	pscsi_cmd->timeout_per_command  = QLA_PT_CMD_TOV * HZ;
++	CMD_RESID_LEN(pscsi_cmd) = SRB_IOCTL; /* Used to set sp->flags later */
++
++	if (pscsi_pass->Direction == EXT_DEF_SCSI_PASSTHRU_DATA_OUT) {
++		/* sending user data from pext->ResponseAdr to device */
++		ret = verify_area(VERIFY_READ, (void *)pext->ResponseAdr,
++		    pext->ResponseLen);
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify READ "
++			    "rsp buf.\n", __func__, ha->host_no, ha->instance);)
++			goto scsi_passthru_done;
++		}
++
++		pscsi_cmd->sc_data_direction = SCSI_DATA_WRITE;
++		usr_temp   = (uint8_t *)pext->ResponseAdr;
++		kernel_tmp = (uint8_t *)ha->ioctl_mem;
++		ret = copy_from_user(kernel_tmp, usr_temp, pext->ResponseLen);
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buf "
++			    "failed(%d).\n",
++			    __func__, ha->host_no, ha->instance, ret);)
++			goto scsi_passthru_done;
++		}
++	} else {
++		pscsi_cmd->sc_data_direction = SCSI_DATA_READ;
++	}
++
++	DEBUG9({
++		b = SCSI_BUS_32(pscsi_cmd);
++		t = SCSI_TCN_32(pscsi_cmd);
++		l = SCSI_LUN_32(pscsi_cmd);
++	})
++	DEBUG9(printk("%s(%ld): CDB=%02x %02x %02x %02x; b=%x t=%x l=%x.\n",
++	    __func__, ha->host_no, pscsi_cmd->cmnd[0], pscsi_cmd->cmnd[1],
++	    pscsi_cmd->cmnd[2], pscsi_cmd->cmnd[3], b, t, l);)
++
++	/*
++	 * Check the status of the port
++	 */
++	if (qla2x00_check_tgt_status(ha, pscsi_cmd) != QL_STATUS_SUCCESS) {
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		DEBUG9_10(printk("%s(%ld): inst=%ld check_tgt_status "
++		    "failed.\n",
++		    __func__, ha->host_no, ha->instance);)
++		goto scsi_passthru_done;
++	}
++
++	/* set flag to indicate IOCTL SCSI PassThru in progress */
++	ha->ioctl->SCSIPT_InProgress = 1;
++	ha->ioctl->ioctl_tov = (int)QLA_PT_CMD_DRV_TOV;
++
++	/* prepare for receiving completion. */
++	qla2x00_ioctl_sem_init(ha);
++	CMD_COMPL_STATUS(pscsi_cmd) = (int) IOCTL_INVALID_STATUS;
++
++	/* send command to adapter */
++	DEBUG9(printk("%s(%ld): inst=%ld sending command.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	/* get spin lock for this operation */
++	spin_lock_irqsave(ha->host->host_lock, ha->cpu_flags);
++
++	qla2x00_queuecommand(pscsi_cmd, (void *) qla2x00_scsi_pt_done);
++
++	ha->ioctl->cmpl_timer.expires = jiffies + ha->ioctl->ioctl_tov * HZ;
++	add_timer(&ha->ioctl->cmpl_timer);
++
++	spin_unlock_irqrestore(ha->host->host_lock, ha->cpu_flags);
++
++	DEBUG9(printk("%s(%ld): inst=%ld waiting for completion.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	down(&ha->ioctl->cmpl_sem);
++
++	del_timer(&ha->ioctl->cmpl_timer);
++
++	DEBUG9(printk("%s(%ld): inst=%ld completed.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	if (ha->ioctl->SCSIPT_InProgress == 1) {
++
++		printk(KERN_WARNING
++		    "qla2x00: scsi%ld ERROR passthru command timeout.\n",
++		    ha->host_no);
++
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		goto scsi_passthru_done;
++	}
++
++	if (CMD_COMPL_STATUS(pscsi_cmd) == (int)IOCTL_INVALID_STATUS) {
++
++		DEBUG9(printk("%s(%ld): inst=%ld ERROR - cmd not completed.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		pext->Status = EXT_STATUS_ERR;
++		goto scsi_passthru_done;
++	}
++
++	switch (CMD_COMPL_STATUS(pscsi_cmd)) {
++	case CS_INCOMPLETE:
++	case CS_ABORTED:
++	case CS_PORT_UNAVAILABLE:
++	case CS_PORT_LOGGED_OUT:
++	case CS_PORT_CONFIG_CHG:
++	case CS_PORT_BUSY:
++		DEBUG9_10(printk("%s(%ld): inst=%ld cs err = %x.\n",
++		    __func__, ha->host_no, ha->instance,
++		    CMD_COMPL_STATUS(pscsi_cmd));)
++		pext->Status = EXT_STATUS_BUSY;
++
++		goto scsi_passthru_done;
++	}
++
++	if ((CMD_COMPL_STATUS(pscsi_cmd) == CS_DATA_UNDERRUN) ||
++	    (CMD_SCSI_STATUS(pscsi_cmd) != 0)) {
++
++		/* have done the post function */
++		pext->Status       = EXT_STATUS_SCSI_STATUS;
++		pext->DetailStatus = CMD_SCSI_STATUS(pscsi_cmd) & 0xff;
++		DEBUG9_10(printk("%s(%ld): inst=%ld data underrun or scsi err. "
++		    "host status =0x%x, scsi status = 0x%x.\n",
++		    __func__, ha->host_no, ha->instance,
++		    CMD_COMPL_STATUS(pscsi_cmd), CMD_SCSI_STATUS(pscsi_cmd));)
++
++	} else if (CMD_COMPL_STATUS(pscsi_cmd) != 0) {
++		DEBUG9_10(printk("%s(%ld): inst=%ld cs err=%x.\n",
++		    __func__, ha->host_no, ha->instance,
++		    CMD_COMPL_STATUS(pscsi_cmd));)
++		pext->Status = EXT_STATUS_ERR;
++		goto scsi_passthru_done;
++	}
++
++	/* copy up structure to make sense data available to user */
++	pscsi_pass->SenseLength = CMD_ACTUAL_SNSLEN(pscsi_cmd);
++	if (CMD_ACTUAL_SNSLEN(pscsi_cmd)) {
++		for (i = 0; i < CMD_ACTUAL_SNSLEN(pscsi_cmd); i++)
++			pscsi_pass->SenseData[i] = pscsi_cmd->sense_buffer[i];
++
++		DEBUG10(printk("%s Dump of sense buffer:\n", __func__);)
++		DEBUG10(qla2x00_dump_buffer(
++		    (uint8_t *)&pscsi_pass->SenseData[0],
++		    CMD_ACTUAL_SNSLEN(pscsi_cmd));)
++
++		ret = verify_area(VERIFY_WRITE, (void *)pext->RequestAdr,
++		    sizeof(EXT_SCSI_PASSTHRU));
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify WRITE "
++			    "req buf.\n", __func__, ha->host_no, ha->instance);)
++			goto scsi_passthru_done;
++		}
++
++		usr_temp   = (uint8_t *)pext->RequestAdr;
++		kernel_tmp = (uint8_t *)pscsi_pass;
++		ret = copy_to_user(usr_temp, kernel_tmp,
++		    sizeof(EXT_SCSI_PASSTHRU));
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy sense "
++			    "buffer.\n",
++			    __func__, ha->host_no, ha->instance);)
++			goto scsi_passthru_done;
++		}
++	}
++
++	scsi_direction = pscsi_pass->Direction;
++
++	if (scsi_direction == EXT_DEF_SCSI_PASSTHRU_DATA_IN) {
++		DEBUG9(printk("%s(%ld): inst=%ld copying data.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		/* getting device data and putting in pext->ResponseAdr */
++		ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr ,
++		    pext->ResponseLen);
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify write "
++			    "ResponseAdr.\n",
++			    __func__, ha->host_no, ha->instance);)
++			goto scsi_passthru_done;
++		}
++
++		/* now copy up the READ data to user */
++		if ((CMD_COMPL_STATUS(pscsi_cmd) == CS_DATA_UNDERRUN) &&
++		    (CMD_RESID_LEN(pscsi_cmd))) {
++
++			transfer_len = pext->ResponseLen -
++			    CMD_RESID_LEN(pscsi_cmd);
++
++			pext->ResponseLen = transfer_len;
++		} else {
++			transfer_len = pext->ResponseLen;
++		}
++
++		usr_temp   = (uint8_t *)pext->ResponseAdr;
++		kernel_tmp = (uint8_t *)ha->ioctl_mem;
++		ret = copy_to_user(usr_temp, kernel_tmp, transfer_len);
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk(
++			    "%s(%ld): inst=%ld ERROR copy rsp buf\n",
++			    __func__, ha->host_no, ha->instance);)
++			goto scsi_passthru_done;
++		}
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++scsi_passthru_done:
++
++	qla2x00_free_ioctl_scrap_mem(ha);
++	return (ret);
++}
++
++/*
++ * qla2x00_sc_fc_scsi_passthru
++ *	Handles EXT_SC_SEND_FC_SCSI_PASSTHRU subcommand.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = EXT_IOCTL structure pointer.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_sc_fc_scsi_passthru(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int			ret = 0;
++	int			port_found, lun_found;
++	fc_lun_t		temp_fclun;
++	struct list_head	*fcpl;
++	fc_port_t		*fcport;
++	struct list_head	*fcll;
++	fc_lun_t		*fclun = NULL;
++	os_lun_t		*lq;
++	os_tgt_t		*tq;
++	srb_t			*sp = NULL;
++	uint8_t			*usr_temp, *kernel_tmp;
++	uint32_t		i;
++
++#if defined(QL_DEBUG_LEVEL_9)
++	uint32_t		b, t, l;
++#endif
++	uint32_t		transfer_len;
++	uint8_t			scsi_direction;
++
++	EXT_FC_SCSI_PASSTHRU	*pfc_scsi_pass;
++
++	Scsi_Cmnd		*pfc_scsi_cmd;
++	Scsi_Device		*pfc_scsi_device;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	if ((sp = qla2x00_get_new_sp(ha)) == NULL) {
++
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc sp.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		return (ret);
++	}
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pfc_scsi_pass,
++	    sizeof(EXT_FC_SCSI_PASSTHRU))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(EXT_FC_SCSI_PASSTHRU));)
++		return (ret);
++	}
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pfc_scsi_cmd,
++	    sizeof(Scsi_Cmnd))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(Scsi_Cmnd));)
++		goto fc_scsi_passthru_done;
++	}
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pfc_scsi_device,
++	    sizeof(Scsi_Device))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(Scsi_Device));)
++		goto fc_scsi_passthru_done;
++	}
++
++	/* clear ioctl_mem to be used */
++	memset(ha->ioctl_mem, 0, ha->ioctl_mem_size);
++
++	ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr,
++	    sizeof(EXT_FC_SCSI_PASSTHRU));
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk(
++		    "%s(%ld): inst=%ld ERROR verify READ req buf.\n",
++		    __func__, ha->host_no, ha->instance);)
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++
++		goto fc_scsi_passthru_done;
++	}
++
++	if (pext->ResponseLen > ha->ioctl_mem_size) {
++		if (qla2x00_get_new_ioctl_dma_mem(ha, pext->ResponseLen) !=
++		    QL_STATUS_SUCCESS) {
++
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc "
++			    "requested DMA buffer size %x.\n",
++			    __func__, ha->host_no, ha->instance,
++			    pext->ResponseLen);)
++
++			pext->Status = EXT_STATUS_NO_MEMORY;
++			atomic_set(&sp->ref_count, 0);
++			add_to_free_queue (ha, sp);
++			goto fc_scsi_passthru_done;
++		}
++	}
++
++	/* Copy request buffer */
++	usr_temp   = (uint8_t *)pext->RequestAdr;
++	kernel_tmp = (uint8_t *)pfc_scsi_pass;
++	ret = copy_from_user(kernel_tmp, usr_temp,
++	    sizeof(EXT_FC_SCSI_PASSTHRU));
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk(
++		    "%s(%ld): inst=%ld ERROR copy req buf ret=%d\n",
++		    __func__, ha->host_no, ha->instance, ret);)
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++
++		goto fc_scsi_passthru_done;
++	}
++
++	if (pfc_scsi_pass->FCScsiAddr.DestType != EXT_DEF_DESTTYPE_WWPN) {
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR -wrong Dest type. \n",
++		    __func__, ha->host_no, ha->instance);)
++		ret = EXT_STATUS_ERR;
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++		goto fc_scsi_passthru_done;
++	}
++
++	fcport = NULL;
++	fclun = NULL;
++ 	port_found = lun_found = 0;
++ 	list_for_each(fcpl, &ha->fcports) {
++ 		fcport = list_entry(fcpl, fc_port_t, list);
++ 
++		if (memcmp(fcport->port_name,
++		    pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN, 8) != 0) {
++			continue;
++
++		}
++ 		port_found++;
++ 
++ 		list_for_each(fcll, &fcport->fcluns) {
++ 			fclun = list_entry(fcll, fc_lun_t, list);
++
++			if (fclun->lun == pfc_scsi_pass->FCScsiAddr.Lun) {
++				/* Found the right LUN */
++				lun_found++;
++				break;
++			}
++		}
++		break;
++	}
++
++	if (!port_found) {
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		DEBUG9_10(printk("%s(%ld): inst=%ld FC AddrFormat - DID NOT "
++		    "FIND Port matching WWPN.\n",
++		    __func__, ha->host_no, ha->instance);)
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++		goto fc_scsi_passthru_done;
++	}
++
++	/* v5.21b9 - use a temporary fclun */
++	if (!lun_found) {
++		fclun = &temp_fclun;
++		fclun->fcport = fcport;
++		fclun->lun = pfc_scsi_pass->FCScsiAddr.Lun;
++		fclun->flags = 0;
++	}
++
++	/* set target coordinates */
++	pfc_scsi_cmd->device->id = 0xff; /* not used. just put something there. */
++	pfc_scsi_cmd->device->lun = pfc_scsi_pass->FCScsiAddr.Lun;
++
++	DEBUG9(printk("%s(%ld): inst=%ld cmd for loopid=%04x L=%04x "
++	    "WWPN=%02x%02x%02x%02x%02x%02x%02x%02x.\n",
++	    __func__, ha->host_no, ha->instance, fclun->fcport->loop_id,
++	    pfc_scsi_cmd->device->lun,
++	    pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN[0],
++	    pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN[1],
++	    pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN[2],
++	    pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN[3],
++	    pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN[4],
++	    pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN[5],
++	    pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN[6],
++	    pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN[7]);)
++
++	if (pfc_scsi_pass->CdbLength == 6) {
++		sp->cmd_length = 6;
++		pfc_scsi_cmd->cmd_len = 6;
++
++	} else if (pfc_scsi_pass->CdbLength == 0x0A) {
++		sp->cmd_length = 0x0A;
++		pfc_scsi_cmd->cmd_len = 0x0A;
++
++	} else if (pfc_scsi_pass->CdbLength == 0x0C) {
++		sp->cmd_length = 0x0C;
++		pfc_scsi_cmd->cmd_len = 0x0C;
++
++	} else if (pfc_scsi_pass->CdbLength == 0x10) {
++		sp->cmd_length = 0x10;
++		pfc_scsi_cmd->cmd_len = 0x10;
++	} else {
++		printk(KERN_WARNING
++		    "qla2x00_ioctl: FC_SCSI_PASSTHRU Unknown Cdb Length=%x.\n",
++		    pfc_scsi_pass->CdbLength);
++		pext->Status = EXT_STATUS_INVALID_PARAM;
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++
++		goto fc_scsi_passthru_done;
++	}
++
++	memcpy(pfc_scsi_cmd->data_cmnd, pfc_scsi_pass->Cdb,
++	    pfc_scsi_cmd->cmd_len);
++	memcpy(pfc_scsi_cmd->cmnd, pfc_scsi_pass->Cdb,
++	    pfc_scsi_cmd->cmd_len);
++
++	DEBUG9(printk("%s Dump of cdb buffer:\n", __func__);)
++	DEBUG9(qla2x00_dump_buffer((uint8_t *)&pfc_scsi_cmd->data_cmnd[0], 16);)
++
++	pfc_scsi_cmd->device->host = ha->host;
++	sp->ha                = ha;
++	sp->cmd               = pfc_scsi_cmd;
++	sp->flags             = SRB_IOCTL;
++
++	/* set local fc_scsi_cmd's sp pointer to sp */
++	CMD_SP(pfc_scsi_cmd)  = (void *) sp;
++
++	/* mark this as a special delivery and collection command */
++	pfc_scsi_cmd->flags     = 0;
++	pfc_scsi_cmd->scsi_done = qla2x00_scsi_pt_done;
++
++	pfc_scsi_cmd->device               = pfc_scsi_device;
++	pfc_scsi_cmd->device->tagged_queue = 0;
++	pfc_scsi_cmd->use_sg               = 0; /* no ScatterGather */
++	pfc_scsi_cmd->request_bufflen      = pext->ResponseLen;
++	pfc_scsi_cmd->request_buffer       = ha->ioctl_mem;
++	pfc_scsi_cmd->timeout_per_command  = QLA_PT_CMD_TOV * HZ;
++
++	if (pfc_scsi_pass->Direction == EXT_DEF_SCSI_PASSTHRU_DATA_OUT) {
++		/* sending user data from pext->ResponseAdr to device */
++		ret = verify_area(VERIFY_READ, (void *)pext->ResponseAdr,
++		    pext->ResponseLen);
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify read "
++			    "ResponseAdr.\n",
++			    __func__, ha->host_no, ha->instance);)
++			atomic_set(&sp->ref_count, 0);
++			add_to_free_queue (ha, sp);
++
++			goto fc_scsi_passthru_done;
++		}
++
++		pfc_scsi_cmd->sc_data_direction = SCSI_DATA_WRITE;
++		usr_temp   = (uint8_t *)pext->ResponseAdr;
++		kernel_tmp = (uint8_t *)ha->ioctl_mem;
++		ret = copy_from_user(kernel_tmp, usr_temp, pext->ResponseLen);
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy "
++			    "failed(%d) on rsp buf.\n",
++			    __func__, ha->host_no, ha->instance, ret);)
++			atomic_set(&sp->ref_count, 0);
++			add_to_free_queue (ha, sp);
++
++			goto fc_scsi_passthru_done;
++		}
++	} else {
++		pfc_scsi_cmd->sc_data_direction = SCSI_DATA_READ;
++	}
++
++	tq = ha->ioctl->ioctl_tq;
++	lq = ha->ioctl->ioctl_lq;
++
++	if (fclun && tq && lq ) {
++		tq->olun[fclun->lun] = lq;
++		tq->ha = ha;
++
++		lq->fclun = fclun;
++		fcport = fclun->fcport;
++
++		sp->lun_queue = lq;
++		sp->tgt_queue = tq;
++		sp->fclun = fclun;
++	}
++
++	DEBUG9({
++		b = SCSI_BUS_32(pfc_scsi_cmd);
++		t = SCSI_TCN_32(pfc_scsi_cmd);
++		l = SCSI_LUN_32(pfc_scsi_cmd);
++	})
++	DEBUG9(printk("%s(%ld): ha instance=%ld tq=%p lq=%p "
++	    "fclun=%p.\n",
++	    __func__, ha->host_no, ha->instance, tq, lq, fclun);)
++	DEBUG9(printk("\tCDB=%02x %02x %02x %02x; b=%x t=%x l=%x.\n",
++	    pfc_scsi_cmd->cmnd[0], pfc_scsi_cmd->cmnd[1], pfc_scsi_cmd->cmnd[2],
++	    pfc_scsi_cmd->cmnd[3], b, t, l);)
++
++	/*
++	 * Check the status of the port
++	 */
++	if (qla2x00_check_port_status(ha, fcport) != QL_STATUS_SUCCESS) {
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++		goto fc_scsi_passthru_done;
++	}
++
++	/* set flag to indicate IOCTL SCSI PassThru in progress */
++	ha->ioctl->SCSIPT_InProgress = 1;
++	ha->ioctl->ioctl_tov = (int)QLA_PT_CMD_DRV_TOV;
++
++	/* prepare for receiving completion. */
++	qla2x00_ioctl_sem_init(ha);
++	CMD_COMPL_STATUS(pfc_scsi_cmd) = (int) IOCTL_INVALID_STATUS;
++
++	/* send command to adapter */
++	DEBUG9(printk("%s(%ld): inst=%ld sending command.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	add_to_pending_queue(ha, sp);
++
++	qla2x00_next(ha);
++
++	ha->ioctl->cmpl_timer.expires = jiffies + ha->ioctl->ioctl_tov * HZ;
++	add_timer(&ha->ioctl->cmpl_timer);
++
++	down(&ha->ioctl->cmpl_sem);
++
++	del_timer(&ha->ioctl->cmpl_timer);
++
++	if (ha->ioctl->SCSIPT_InProgress == 1) {
++
++		printk(KERN_WARNING
++		    "qla2x00: scsi%ld ERROR passthru command timeout.\n",
++		    ha->host_no);
++
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++		goto fc_scsi_passthru_done;
++	}
++
++	if (CMD_COMPL_STATUS(pfc_scsi_cmd) == (int)IOCTL_INVALID_STATUS) {
++
++		DEBUG9(printk("%s(%ld): inst=%ld ERROR. cmd not completed.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		pext->Status = EXT_STATUS_ERR;
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++		goto fc_scsi_passthru_done;
++	}
++
++	switch (CMD_COMPL_STATUS(pfc_scsi_cmd)) {
++	case CS_INCOMPLETE:
++	case CS_ABORTED:
++	case CS_PORT_UNAVAILABLE:
++	case CS_PORT_LOGGED_OUT:
++	case CS_PORT_CONFIG_CHG:
++	case CS_PORT_BUSY:
++		DEBUG10(printk("%s(%ld): inst=%ld cs err = %x.\n",
++		    __func__, ha->host_no, ha->instance,
++		    CMD_COMPL_STATUS(pfc_scsi_cmd));)
++		pext->Status = EXT_STATUS_BUSY;
++		break;
++	}
++
++	if ((CMD_COMPL_STATUS(pfc_scsi_cmd) == CS_DATA_UNDERRUN) ||
++	    (CMD_SCSI_STATUS(pfc_scsi_cmd) != 0))  {
++
++		/* have done the post function */
++		pext->Status       = EXT_STATUS_SCSI_STATUS;
++		/* The SDMAPI is only concerned with the low-order byte */
++		pext->DetailStatus = CMD_SCSI_STATUS(pfc_scsi_cmd) & 0xff;
++
++		DEBUG9_10(printk("%s(%ld): inst=%ld data underrun or scsi err. "
++		    "host status =0x%x, scsi status = 0x%x.\n",
++		    __func__, ha->host_no, ha->instance,
++		    CMD_COMPL_STATUS(pfc_scsi_cmd),
++		    CMD_SCSI_STATUS(pfc_scsi_cmd));)
++
++	} else if (CMD_COMPL_STATUS(pfc_scsi_cmd) != 0) {
++		DEBUG9_10(printk("%s(%ld): inst=%ld cs err=%x.\n",
++		    __func__, ha->host_no, ha->instance,
++		    CMD_COMPL_STATUS(pfc_scsi_cmd));)
++		pext->Status = EXT_STATUS_ERR;
++
++		goto fc_scsi_passthru_done;
++	}
++
++	/* Process completed command */
++	DEBUG9(printk("%s(%ld): inst=%ld done. host status=0x%x, "
++	    "scsi status=0x%x.\n",
++	    __func__, ha->host_no, ha->instance, CMD_COMPL_STATUS(pfc_scsi_cmd),
++	    CMD_SCSI_STATUS(pfc_scsi_cmd));)
++
++	/* copy up structure to make sense data available to user */
++	pfc_scsi_pass->SenseLength = CMD_ACTUAL_SNSLEN(pfc_scsi_cmd);
++	if (CMD_ACTUAL_SNSLEN(pfc_scsi_cmd)) {
++		DEBUG9_10(printk("%s(%ld): inst=%ld sense[0]=%x sense[2]=%x.\n",
++		    __func__, ha->host_no, ha->instance,
++		    pfc_scsi_cmd->sense_buffer[0],
++		    pfc_scsi_cmd->sense_buffer[2]);)
++
++		for (i = 0; i < CMD_ACTUAL_SNSLEN(pfc_scsi_cmd); i++) {
++			pfc_scsi_pass->SenseData[i] =
++			pfc_scsi_cmd->sense_buffer[i];
++		}
++
++		ret = verify_area(VERIFY_WRITE, (void *)pext->RequestAdr,
++		    sizeof(EXT_FC_SCSI_PASSTHRU));
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify WRITE "
++			    "RequestAdr.\n",
++			    __func__, ha->host_no, ha->instance);)
++			goto fc_scsi_passthru_done;
++		}
++
++		usr_temp = (uint8_t *)pext->RequestAdr;
++		kernel_tmp = (uint8_t *)pfc_scsi_pass;
++		ret = copy_to_user(usr_temp, kernel_tmp,
++		    sizeof(EXT_FC_SCSI_PASSTHRU));
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy sense "
++			    "buffer.\n",
++			    __func__, ha->host_no, ha->instance);)
++			goto fc_scsi_passthru_done;
++		}
++	}
++
++	scsi_direction = pfc_scsi_pass->Direction;
++
++	if (scsi_direction == EXT_DEF_SCSI_PASSTHRU_DATA_IN) {
++
++		DEBUG9(printk("%s(%ld): inst=%ld copying data.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		/* getting device data and putting in pext->ResponseAdr */
++		ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr,
++		    pext->ResponseLen);
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify write "
++			    "ResponseAdr.\n",
++			    __func__, ha->host_no, ha->instance);)
++
++			goto fc_scsi_passthru_done;
++		}
++
++		/* now copy up the READ data to user */
++		if ((CMD_COMPL_STATUS(pfc_scsi_cmd) == CS_DATA_UNDERRUN) &&
++		    (CMD_RESID_LEN(pfc_scsi_cmd))) {
++
++			transfer_len = pext->ResponseLen -
++			    CMD_RESID_LEN(pfc_scsi_cmd);
++
++			pext->ResponseLen = transfer_len;
++		} else {
++			transfer_len = pext->ResponseLen;
++		}
++
++		usr_temp = (uint8_t *)pext->ResponseAdr;
++		kernel_tmp = (uint8_t *)ha->ioctl_mem;
++		ret = copy_to_user(usr_temp, kernel_tmp, transfer_len);
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk(
++			    "%s(%ld): inst=%ld ERROR copy rsp buf\n",
++			    __func__, ha->host_no, ha->instance);)
++			goto fc_scsi_passthru_done;
++		}
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++fc_scsi_passthru_done:
++
++	qla2x00_free_ioctl_scrap_mem(ha);
++	return (ret);
++}
++
++/*
++ * qla2x00_sc_scsi3_passthru
++ *	Handles EXT_SC_SCSI3_PASSTHRU subcommand.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = EXT_IOCTL structure pointer.
++ *	mode = not used.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_sc_scsi3_passthru(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++#define MAX_SCSI3_CDB_LEN	16
++
++	int			ret = 0;
++	int			found;
++	fc_lun_t		temp_fclun;
++	fc_lun_t		*fclun = NULL;
++	struct list_head	*fcpl;
++	fc_port_t		*fcport;
++	os_lun_t		*lq;
++	os_tgt_t		*tq;
++	srb_t			*sp = NULL;
++	uint8_t			*usr_temp, *kernel_tmp;
++	uint32_t		transfer_len;
++	uint32_t		i, b, t;
++	uint32_t		scsi_direction;
++
++	EXT_FC_SCSI_PASSTHRU	*pfc_scsi3_pass;
++
++	Scsi_Cmnd		*pscsi3_cmd;
++	Scsi_Device		*pscsi3_device;
++
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	if ((sp = qla2x00_get_new_sp(ha)) == NULL) {
++
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc sp.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		return (ret);
++	}
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pfc_scsi3_pass,
++	    sizeof(EXT_FC_SCSI_PASSTHRU))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(EXT_FC_SCSI_PASSTHRU));)
++		return (ret);
++	}
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi3_cmd,
++	    sizeof(Scsi_Cmnd))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(Scsi_Cmnd));)
++		goto scsi3_passthru_done;
++	}
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi3_device,
++	    sizeof(Scsi_Device))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(Scsi_Device));)
++		goto scsi3_passthru_done;
++	}
++
++	/* clear ioctl_mem to be used */
++	memset(ha->ioctl_mem, 0, ha->ioctl_mem_size);
++
++	ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr,
++	    sizeof(EXT_FC_SCSI_PASSTHRU));
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify READ "
++		    "req buf.\n", __func__, ha->host_no, ha->instance);)
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++		goto scsi3_passthru_done;
++	}
++
++	if (pext->ResponseLen > ha->ioctl_mem_size) {
++		if (qla2x00_get_new_ioctl_dma_mem(ha, pext->ResponseLen) !=
++		    QL_STATUS_SUCCESS) {
++
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot "
++			    "alloc requested DMA buffer size=%x.\n",
++			    __func__, ha->host_no, ha->instance,
++			    pext->ResponseLen);)
++
++			pext->Status = EXT_STATUS_NO_MEMORY;
++			atomic_set(&sp->ref_count, 0);
++			add_to_free_queue (ha, sp);
++			goto scsi3_passthru_done;
++		}
++	}
++
++	/* Copy request buffer */
++	usr_temp   = (uint8_t *)pext->RequestAdr;
++	kernel_tmp = (uint8_t *)pfc_scsi3_pass;
++	ret = copy_from_user(kernel_tmp, usr_temp,
++	    sizeof(EXT_FC_SCSI_PASSTHRU));
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk(
++		    "%s(%ld): inst=%ld ERROR copy req buf ret=%d\n",
++		    __func__, ha->host_no, ha->instance, ret);)
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++		goto scsi3_passthru_done;
++	}
++
++	if (pfc_scsi3_pass->FCScsiAddr.DestType != EXT_DEF_DESTTYPE_WWPN) {
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR - wrong Dest type.\n",
++		    __func__, ha->host_no, ha->instance);)
++		ret = EXT_STATUS_ERR;
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++
++		goto scsi3_passthru_done;
++	}
++
++	/*
++	 * For this ioctl command we always assume all 16 bytes are
++	 * initialized.
++	 */
++	if (pfc_scsi3_pass->CdbLength != MAX_SCSI3_CDB_LEN) {
++		pext->Status = EXT_STATUS_INVALID_PARAM;
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR -wrong Cdb Len %d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    pfc_scsi3_pass->CdbLength);)
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++		goto scsi3_passthru_done;
++	}
++
++ 	fcport = NULL;
++ 	found = 0;
++ 	list_for_each(fcpl, &ha->fcports) {
++ 		fcport = list_entry(fcpl, fc_port_t, list);
++
++		if (memcmp(fcport->port_name,
++		    pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN, 8) == 0) {
++			found++;
++			break;
++		}
++	}
++	if (!found) {
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++
++		DEBUG9_10(printk("%s(%ld): inst=%ld DID NOT FIND Port for WWPN "
++		    "%02x%02x%02x%02x%02x%02x%02x%02x.\n",
++		    __func__, ha->host_no, ha->instance,
++		    pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[0],
++		    pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[1],
++		    pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[2],
++		    pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[3],
++		    pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[4],
++		    pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[5],
++		    pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[6],
++		    pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[7]);)
++
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++
++		goto scsi3_passthru_done;
++	}
++
++	/* Use a temporary fclun to send out the command. */
++	fclun = &temp_fclun;
++	fclun->fcport = fcport;
++	fclun->lun = pfc_scsi3_pass->FCScsiAddr.Lun;
++	fclun->flags = 0;
++
++	/* set target coordinates */
++	pscsi3_cmd->device->id = 0xff;  /* not used. just put something there. */
++	pscsi3_cmd->device->lun = pfc_scsi3_pass->FCScsiAddr.Lun;
++
++	DEBUG9(printk("%s(%ld): inst=%ld cmd for loopid=%04x L=%04x "
++	    "WWPN=%02x%02x%02x%02x%02x%02x%02x%02x.\n",
++	    __func__, ha->host_no, ha->instance,
++	    fclun->fcport->loop_id, pscsi3_cmd->device->lun,
++	    pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[0],
++	    pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[1],
++	    pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[2],
++	    pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[3],
++	    pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[4],
++	    pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[5],
++	    pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[6],
++	    pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[7]);)
++
++	sp->cmd_length = MAX_SCSI3_CDB_LEN;
++	pscsi3_cmd->cmd_len = MAX_SCSI3_CDB_LEN;
++
++	memcpy(pscsi3_cmd->data_cmnd, pfc_scsi3_pass->Cdb, pscsi3_cmd->cmd_len);
++	memcpy(pscsi3_cmd->cmnd, pfc_scsi3_pass->Cdb, pscsi3_cmd->cmd_len);
++
++	DEBUG9(printk("%s(%ld): inst=%ld cdb buffer dump:\n",
++	    __func__, ha->host_no, ha->instance);)
++	DEBUG9(qla2x00_dump_buffer((uint8_t *)&pscsi3_cmd->data_cmnd[0], 16);)
++
++	pscsi3_cmd->device->host = ha->host;
++	sp->ha                = ha;
++	sp->cmd               = pscsi3_cmd;
++	sp->flags             = SRB_IOCTL;
++
++	/* set local scsi3_cmd's sp pointer to sp */
++	CMD_SP(pscsi3_cmd)    = (void *) sp;
++
++	/* mark this as a special delivery and collection command */
++	pscsi3_cmd->flags     = 0;
++	pscsi3_cmd->scsi_done = qla2x00_scsi_pt_done;
++
++	pscsi3_cmd->device               = pscsi3_device;
++	pscsi3_cmd->device->tagged_queue = 0;
++	pscsi3_cmd->use_sg               = 0; /* no ScatterGather */
++	pscsi3_cmd->request_bufflen      = pext->ResponseLen;
++	pscsi3_cmd->request_buffer       = ha->ioctl_mem;
++	pscsi3_cmd->timeout_per_command  = QLA_PT_CMD_TOV * HZ;
++
++	if (pfc_scsi3_pass->Direction == EXT_DEF_SCSI_PASSTHRU_DATA_OUT) {
++		/* sending user data from pext->ResponseAdr to device */
++		ret = verify_area(VERIFY_READ, (void *)pext->ResponseAdr,
++		    pext->ResponseLen);
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify read "
++			    "ResponseAdr.\n",
++			    __func__, ha->host_no, ha->instance);)
++			atomic_set(&sp->ref_count, 0);
++			add_to_free_queue (ha, sp);
++			goto scsi3_passthru_done;
++		}
++
++		pscsi3_cmd->sc_data_direction = SCSI_DATA_WRITE;
++		usr_temp   = (uint8_t *)pext->ResponseAdr;
++		kernel_tmp = (uint8_t *)ha->ioctl_mem;
++		ret = copy_from_user(kernel_tmp, usr_temp, pext->ResponseLen);
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buf "
++			    "ret=%d.\n",
++			    __func__, ha->host_no, ha->instance, ret);)
++			atomic_set(&sp->ref_count, 0);
++			add_to_free_queue (ha, sp);
++			goto scsi3_passthru_done;
++		}
++
++	} else {
++		pscsi3_cmd->sc_data_direction = SCSI_DATA_READ;
++	}
++
++	/* Use temporary LU and TGT queue */
++	tq = ha->ioctl->ioctl_tq;
++	lq = ha->ioctl->ioctl_lq;
++
++	b = SCSI_BUS_32(pscsi3_cmd);
++	t = SCSI_TCN_32(pscsi3_cmd);
++
++	DEBUG9(printk("%s(%ld): ha instance=%ld tq=%p lq=%p fclun=%p.\n",
++	    __func__, ha->host_no, ha->instance,tq,lq,fclun); )
++	DEBUG9(printk("%s(%ld): CDB=%02x %02x %02x %02x; b=%x t=%x fclun=%x\n",
++	    __func__, ha->host_no, pscsi3_cmd->cmnd[0], pscsi3_cmd->cmnd[1],
++	    pscsi3_cmd->cmnd[2], pscsi3_cmd->cmnd[3], b, t,
++	    SCSI_LUN_32(pscsi3_cmd));)
++
++	if (tq && lq) {
++		/*
++		 * For now just save lq using the lower LUN byte value,
++		 * even though this may not be the actual LUN number.
++		 * Since we're only sending out passthru cmd one at a time,
++		 * and only passthru is using FCP LUN format now, no need
++		 * to change rest of driver just to decode the LUN.
++		 */
++		tq->olun[fclun->lun & 0xff] = lq;
++
++		tq->ha = ha;
++		lq->fclun = fclun;
++		fcport = fclun->fcport;
++
++		sp->lun_queue = lq;
++		sp->tgt_queue = tq;
++		sp->fclun = fclun;
++	} else {
++		lq = NULL;
++		fcport = NULL;
++	}
++
++	/*
++	 * Check the status of the port
++	 */
++	if (qla2x00_check_port_status(ha, fcport) != QL_STATUS_SUCCESS) {
++
++		DEBUG9_10(printk("%s(%ld): inst=%ld port missing or loop down. "
++		    "fcport=%p timer=%d state=%d dpc=%lx.\n",
++		    __func__, ha->host_no, ha->instance, fcport,
++		    atomic_read(&ha->loop_down_timer), ha->loop_state,
++		    ha->dpc_flags);)
++
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++		goto scsi3_passthru_done;
++	}
++
++	/* set flag to indicate IOCTL SCSI PassThru in progress */
++	ha->ioctl->SCSIPT_InProgress = 1;
++	ha->ioctl->ioctl_tov = (int)QLA_PT_CMD_DRV_TOV;
++
++	/* prepare for receiving completion. */
++	qla2x00_ioctl_sem_init(ha);
++	CMD_COMPL_STATUS(pscsi3_cmd) = (int) IOCTL_INVALID_STATUS;
++
++	/* send command to adapter */
++
++	/*add_to_cmd_queue(ha, lq, sp);*/
++	add_to_pending_queue(ha, sp);
++
++	/*qla2x00_next(ha, tq, lq);*/
++	qla2x00_next(ha);
++
++	ha->ioctl->cmpl_timer.expires = jiffies + ha->ioctl->ioctl_tov * HZ;
++	add_timer(&ha->ioctl->cmpl_timer);
++
++	down(&ha->ioctl->cmpl_sem);
++
++	del_timer(&ha->ioctl->cmpl_timer);
++
++	if (ha->ioctl->SCSIPT_InProgress == 1) {
++
++		printk(KERN_WARNING
++		    "qla2x00: inst=%ld scsi%ld ERROR PT command timeout.\n",
++		    ha->host_no, ha->instance);
++
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++		goto scsi3_passthru_done;
++
++	}
++	if (CMD_COMPL_STATUS(pscsi3_cmd) == (int)IOCTL_INVALID_STATUS) {
++
++		DEBUG9(printk("%s(%ld): inst=%ld ERROR - cmd not completed.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		pext->Status = EXT_STATUS_ERR;
++		atomic_set(&sp->ref_count, 0);
++		add_to_free_queue (ha, sp);
++		goto scsi3_passthru_done;
++	}
++
++	switch (CMD_COMPL_STATUS(pscsi3_cmd)) {
++	case CS_INCOMPLETE:
++	case CS_ABORTED:
++	case CS_PORT_UNAVAILABLE:
++	case CS_PORT_LOGGED_OUT:
++	case CS_PORT_CONFIG_CHG:
++	case CS_PORT_BUSY:
++		DEBUG10(printk("%s(%ld): inst=%ld cs err = %x.\n",
++		    __func__, ha->host_no, ha->instance,
++		    CMD_COMPL_STATUS(pscsi3_cmd));)
++		pext->Status = EXT_STATUS_BUSY;
++		break;
++	}
++
++	if ((CMD_COMPL_STATUS(pscsi3_cmd) == CS_DATA_UNDERRUN) ||
++	    (CMD_SCSI_STATUS(pscsi3_cmd) != 0)) {
++
++		/* have done the post function */
++		pext->Status       = EXT_STATUS_SCSI_STATUS;
++		pext->DetailStatus = CMD_SCSI_STATUS(pscsi3_cmd) & 0xff;
++
++		DEBUG9_10(printk("%s(%ld): inst=%ld data underrun or scsi err. "
++		    "host status =0x%x, scsi status = 0x%x.\n",
++		    __func__, ha->host_no, ha->instance,
++		    CMD_COMPL_STATUS(pscsi3_cmd), CMD_SCSI_STATUS(pscsi3_cmd));)
++
++	} else if (CMD_COMPL_STATUS(pscsi3_cmd) != 0) {
++		DEBUG9_10(printk("%s(%ld): inst=%ld cs err = %x.\n",
++		    __func__, ha->host_no, ha->instance,
++		    CMD_COMPL_STATUS(pscsi3_cmd));)
++		pext->Status = EXT_STATUS_ERR;
++		goto scsi3_passthru_done;
++	}
++
++	/* Process completed command */
++	DEBUG9(printk("%s(%ld): inst=%ld done. host status=0x%x, "
++	    "scsi status=0x%x.\n",
++	    __func__, ha->host_no, ha->instance, CMD_COMPL_STATUS(pscsi3_cmd),
++	    CMD_SCSI_STATUS(pscsi3_cmd));)
++
++	/* copy up structure to make sense data available to user */
++	pfc_scsi3_pass->SenseLength = CMD_ACTUAL_SNSLEN(pscsi3_cmd);
++	if (CMD_ACTUAL_SNSLEN(pscsi3_cmd)) {
++		DEBUG9_10(printk("%s(%ld): inst=%ld sense[0]=%x sense[2]=%x.\n",
++		    __func__, ha->host_no, ha->instance,
++		    pscsi3_cmd->sense_buffer[0],
++		    pscsi3_cmd->sense_buffer[2]);)
++
++		for (i = 0; i < CMD_ACTUAL_SNSLEN(pscsi3_cmd); i++) {
++			pfc_scsi3_pass->SenseData[i] =
++			    pscsi3_cmd->sense_buffer[i];
++		}
++
++		ret = verify_area(VERIFY_WRITE, (void *)pext->RequestAdr,
++		    sizeof(EXT_FC_SCSI_PASSTHRU));
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify WRITE "
++			    "RequestAdr.\n",
++			    __func__, ha->host_no, ha->instance);)
++			goto scsi3_passthru_done;
++		}
++
++		usr_temp = (uint8_t *)pext->RequestAdr;
++		kernel_tmp = (uint8_t *)pfc_scsi3_pass;
++		ret = copy_to_user(usr_temp, kernel_tmp,
++		    sizeof(EXT_FC_SCSI_PASSTHRU));
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy sense "
++			    "buffer.\n",
++			    __func__, ha->host_no, ha->instance);)
++			goto scsi3_passthru_done;
++		}
++	}
++
++	scsi_direction = pfc_scsi3_pass->Direction;
++
++	if (scsi_direction == EXT_DEF_SCSI_PASSTHRU_DATA_IN) {
++
++		DEBUG9(printk("%s(%ld): inst=%ld copying data.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		/* getting device data and putting in pext->ResponseAdr */
++		ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr,
++		    pext->ResponseLen);
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify write "
++			    "ResponseAdr.\n",
++			    __func__, ha->host_no, ha->instance);)
++
++			goto scsi3_passthru_done;
++		}
++
++		/* now copy up the READ data to user */
++		if ((CMD_COMPL_STATUS(pscsi3_cmd) == CS_DATA_UNDERRUN) &&
++		    (CMD_RESID_LEN(pscsi3_cmd))) {
++
++			transfer_len = pext->ResponseLen -
++			    CMD_RESID_LEN(pscsi3_cmd);
++
++			pext->ResponseLen = transfer_len;
++		} else {
++			transfer_len = pext->ResponseLen;
++		}
++
++		usr_temp = (uint8_t *)pext->ResponseAdr;
++		kernel_tmp = (uint8_t *)ha->ioctl_mem;
++		ret = copy_to_user(usr_temp, kernel_tmp, transfer_len);
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk(
++			    "%s(%ld): inst=%ld ERROR copy rsp buf\n",
++			    __func__, ha->host_no, ha->instance);)
++			goto scsi3_passthru_done;
++		}
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++scsi3_passthru_done:
++
++	qla2x00_free_ioctl_scrap_mem(ha);
++	return (ret);
++}
++
++/*
++ * qla2x00_send_els_rnid
++ *	IOCTL to send extended link service RNID command to a target.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = User space CT arguments pointer.
++ *	mode = flags.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_send_els_rnid(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++#define TGT_DEV 	 1
++#define HOST_DEV 	 2
++
++	EXT_RNID_REQ	*tmp_rnid;
++	int		ret = 0;
++	uint8_t 	dev_found = 0;
++	uint16_t	dev_loop_id = 0;
++	uint16_t	mb[MAILBOX_REGISTER_COUNT];
++	uint32_t	copy_len;
++	struct list_head	*fcpl;
++	fc_port_t	*fcport;
++	int		found;
++	struct list_head *fcil;
++	fc_initiator_t	*fcinitiator;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	if (ha->ioctl_mem_size < SEND_RNID_RSP_SIZE) {
++		if (qla2x00_get_new_ioctl_dma_mem(ha,
++		    SEND_RNID_RSP_SIZE) != QL_STATUS_SUCCESS) {
++
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc "
++			    "DMA buffer. size=%x.\n",
++			    __func__, ha->host_no, ha->instance,
++			    SEND_RNID_RSP_SIZE);)
++
++			pext->Status = EXT_STATUS_NO_MEMORY;
++			return (ret);
++		}
++	}
++
++	if (pext->RequestLen != sizeof(EXT_RNID_REQ)) {
++		/* parameter error */
++		DEBUG9_10(printk("%s(%ld): inst=%ld invalid req length %d.\n",
++		    __func__, ha->host_no, ha->instance, pext->RequestLen);)
++		pext->Status = EXT_STATUS_INVALID_PARAM;
++		return (ret);
++	}
++
++	ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr,
++	    pext->RequestLen);
++
++	if (ret != 0) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk(
++		    "%s(%ld): inst=%ld req buf verify READ FAILED\n",
++		    __func__, ha->host_no, ha->instance);)
++		return (ret);
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld req buf verified. Copying req data.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&tmp_rnid,
++	    sizeof(EXT_RNID_REQ))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(EXT_RNID_REQ));)
++		return (ret);
++	}
++
++	ret = copy_from_user(tmp_rnid, pext->RequestAdr, pext->RequestLen);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk(
++		    "%s(%ld): inst=%ld ERROR copy req buf ret=%d\n",
++		    __func__, ha->host_no, ha->instance, ret);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	/* Find loop ID of the device */
++	fcinitiator = NULL;
++	switch (tmp_rnid->Addr.Type) {
++	case EXT_DEF_TYPE_WWNN:
++
++		DEBUG9(printk("%s(%ld): inst=%ld got node name.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		fcport = NULL;
++		list_for_each(fcpl, &ha->fcports) {
++			fcport = list_entry(fcpl, fc_port_t, list);
++
++			/* if removed or missing */
++			if (atomic_read(&fcport->state) == FC_ONLINE &&
++			    memcmp((void *)tmp_rnid->Addr.FcAddr.WWNN,
++			    (void *)fcport->node_name,
++			    EXT_DEF_WWN_NAME_SIZE) == 0) {
++				break;
++			}
++		}
++		if (fcport != NULL) {
++			DEBUG9(printk("%s(%ld): inst=%ld found tgt dev; "
++			    "loop_id=%x.\n",
++			    __func__, ha->host_no, ha->instance,
++			    fcport->loop_id);)
++
++			dev_found = TGT_DEV;
++			dev_loop_id = fcport->loop_id;
++			break;
++		}
++
++		found = 0;
++		fcinitiator = NULL;
++		list_for_each(fcil, &ha->fcinitiators) {
++			fcinitiator = list_entry(fcil, fc_initiator_t, list);
++
++			if (memcmp(tmp_rnid->Addr.FcAddr.WWNN,
++				 fcinitiator->node_name,
++				 EXT_DEF_WWN_NAME_SIZE) == 0 &&
++				fcinitiator->d_id.b24 != 0) {
++
++				found++;
++				break;
++			}
++		}
++		if (found) {
++			DEBUG9(printk("%s(%ld): inst=%ld found host device; "
++			    "loop_id=%x.\n",
++			    __func__, ha->host_no, ha->instance,
++			    fcinitiator->loop_id);)
++
++			dev_found = HOST_DEV;
++			dev_loop_id = fcinitiator->loop_id;
++			break;
++		}
++
++		break;
++
++	case EXT_DEF_TYPE_WWPN:
++		DEBUG9(printk("%s(%ld): inst=%ld got port name.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		fcport = NULL;
++		list_for_each(fcpl, &ha->fcports) {
++			fcport = list_entry(fcpl, fc_port_t, list);
++
++			/* if removed or missing */
++			if (atomic_read(&fcport->state) == FC_ONLINE &&
++			    memcmp((void *)tmp_rnid->Addr.FcAddr.WWPN,
++			    (void *)fcport->port_name,
++			    EXT_DEF_WWN_NAME_SIZE) == 0) {
++				break;
++			}
++		}
++		if (fcport != NULL) {
++			DEBUG9(printk("%s(%ld): inst=%ld found tgt dev; "
++			    "loop_id=%x.\n",
++			    __func__, ha->host_no, ha->instance,
++			    fcport->loop_id);)
++
++			dev_found = TGT_DEV; /* target device */
++			dev_loop_id = fcport->loop_id;
++			break;
++		}
++
++		found = 0;
++		fcinitiator = NULL;
++		list_for_each(fcil, &ha->fcinitiators) {
++			fcinitiator = list_entry(fcil, fc_initiator_t, list);
++
++			if (memcmp(tmp_rnid->Addr.FcAddr.WWPN,
++				 fcinitiator->port_name,
++				 EXT_DEF_WWN_NAME_SIZE) == 0 &&
++				fcinitiator->d_id.b24 != 0) {
++
++				found++;
++				break;
++			}
++		}
++		if (found) {
++			DEBUG9(printk("%s(%ld): inst=%ld found host device; "
++			    "loop_id=%x.\n",
++			    __func__, ha->host_no, ha->instance,
++			    fcinitiator->loop_id);)
++
++			dev_found = HOST_DEV;
++			dev_loop_id = fcinitiator->loop_id;
++			break;
++		}
++
++		break;
++
++	case EXT_DEF_TYPE_PORTID:
++		DEBUG9(printk("%s(%ld): inst=%ld got port ID.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		/* PORTID bytes entered must already be big endian */
++		fcport = NULL;
++		list_for_each(fcpl, &ha->fcports) {
++			fcport = list_entry(fcpl, fc_port_t, list);
++
++			/* if removed or missing */
++			if (atomic_read(&fcport->state) == FC_ONLINE &&
++			    memcmp((void *)&tmp_rnid->Addr.FcAddr.Id[1],
++			    (void *)(fcport->d_id.r.d_id),
++			    EXT_DEF_PORTID_SIZE_ACTUAL) == 0) {
++				break;
++			}
++		}
++		if (fcport != NULL) {
++			DEBUG9(printk("%s(%ld): inst=%ld found tgt dev; "
++			    "loop_id=%x.\n",
++			    __func__, ha->host_no, ha->instance,
++			    fcport->loop_id);)
++
++			dev_found = TGT_DEV; /* target device */
++			dev_loop_id = fcport->loop_id;
++			break;
++		}
++
++		found = 0;
++		fcinitiator = NULL;
++		list_for_each(fcil, &ha->fcinitiators) {
++			fcinitiator = list_entry(fcil, fc_initiator_t, list);
++
++			if (memcmp(&tmp_rnid->Addr.FcAddr.Id[1],
++				&fcinitiator->d_id,
++				EXT_DEF_PORTID_SIZE_ACTUAL) == 0) {
++
++				found++;
++				break;
++			}
++		}
++		if (found) {
++			DEBUG9(printk("%s(%ld): inst=%ld found host device; "
++			    "loop_id=%x.\n",
++			    __func__, ha->host_no, ha->instance,
++			    fcinitiator->loop_id);)
++
++			dev_found = HOST_DEV;
++			dev_loop_id = fcinitiator->loop_id;
++			break;
++		}
++
++		break;
++	default:
++		/* parameter error */
++		pext->Status = EXT_STATUS_INVALID_PARAM;
++		DEBUG9_10(printk("%s(%ld): inst=%ld invalid addressing type.\n",
++		    __func__, ha->host_no, ha->instance);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	if (!dev_found ||
++	    (dev_found == TGT_DEV && dev_loop_id > LAST_SNS_LOOP_ID)) {
++		/* No matching device or the target device is not
++		 * configured; just return error.
++		 */
++		pext->Status = EXT_STATUS_DEV_NOT_FOUND;
++		DEBUG9_10(printk(
++		    "%s(%ld): inst=%ld device not found. dev_found=%d "
++		    "dev_loop_id=%x.\n",
++		    __func__, ha->host_no, ha->instance, dev_found,
++		    dev_loop_id);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	/* check on loop down */
++	if (ha->loop_state != LOOP_READY || 
++	    test_bit(CFG_ACTIVE, &ha->cfg_flags) ||
++	    (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) ||
++	    ABORTS_ACTIVE || ha->dpc_active) {
++
++		pext->Status = EXT_STATUS_BUSY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld loop not ready.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	/* Check whether we need to login first. */
++	if (dev_found == HOST_DEV && dev_loop_id > LAST_SNS_LOOP_ID) {
++		/*
++		 * Search for a usable loop ID before try to login to it.
++		 */
++		if ((dev_loop_id &= ~PORT_LOST_ID) > LAST_SNS_LOOP_ID) {
++			/* Just start searching from first possible ID. */
++			dev_loop_id = ha->min_external_loopid;
++		}
++		for (;;) {
++			if (ha->fabricid[dev_loop_id].in_use == TRUE) {
++				dev_loop_id++;
++			} else {
++				ha->fabricid[dev_loop_id].in_use = TRUE;
++				break;
++			}
++		}
++
++		DEBUG9(printk("%s(%ld): inst=%ld try relogin to host dev; "
++		    "dev_loop_id=%x.\n",
++		    __func__, ha->host_no, ha->instance, dev_loop_id);)
++
++		for (;;) {
++			if (dev_loop_id > LAST_SNS_LOOP_ID) {
++				/* error */
++				DEBUG10(printk("%s(%ld): inst=%ld "
++				    "no valid loop_id for login.\n",
++				    __func__, ha->host_no, ha->instance);)
++
++				break;
++			}
++
++			qla2x00_login_fabric(ha, 
++			    dev_loop_id,
++			    fcinitiator->d_id.b.domain,
++			    fcinitiator->d_id.b.area,
++			    fcinitiator->d_id.b.al_pa,
++			    &mb[0], 0);
++
++			if (mb[0] != MBS_CMD_CMP &&
++			    mb[0] != MBS_PORT_ID_IN_USE &&
++			    mb[0] != MBS_LOOP_ID_IN_USE) {
++
++	 			DEBUG10(printk("%s(%ld): inst=%ld "
++				    "ERROR login mb[0]=%x mb[1]=%x.\n",
++				    __func__, ha->host_no, ha->instance,
++				    mb[0], mb[1]);)
++				break;
++			}
++
++			if (mb[0] == MBS_CMD_CMP) {
++				DEBUG9(printk("%s(%ld): inst=%ld host login "
++				    "success; loop_id=%x.\n",
++				    __func__, ha->host_no, ha->instance,
++				    dev_loop_id);)
++
++				fcinitiator->loop_id = dev_loop_id;
++				break;
++			} else if (mb[0] == MBS_PORT_ID_IN_USE) {
++				ha->fabricid[dev_loop_id].in_use = FALSE;
++				dev_loop_id = mb[1];
++
++				DEBUG9(printk("%s(%ld): inst=%ld "
++				    "port %02x%02x%02x using loop id=0x%04x.\n",
++				    __func__, ha->host_no, ha->instance,
++				    fcinitiator->d_id.b.domain,
++				    fcinitiator->d_id.b.area,
++				    fcinitiator->d_id.b.al_pa,
++				    dev_loop_id);)
++
++				if (dev_loop_id <= LAST_SNS_LOOP_ID)
++					ha->fabricid[dev_loop_id].in_use = TRUE;
++				else
++					/* Error */
++					break;
++
++			} else if (mb[0] == MBS_LOOP_ID_IN_USE) {
++				/* Search for another usable loop_id */
++				dev_loop_id++;
++				while (ha->fabricid[dev_loop_id].in_use) {
++					if (dev_loop_id++ > LAST_SNS_LOOP_ID) {
++						/* Error */
++						break;
++					}
++				}
++
++				if (dev_loop_id <= LAST_SNS_LOOP_ID) {
++					DEBUG9(printk(
++					    "%s(%ld): inst=%ld previous loop "
++					    "id in use. Retry with 0x%04x.\n",
++					    __func__, ha->host_no, ha->instance,
++					    dev_loop_id);)
++
++					ha->fabricid[dev_loop_id].in_use = TRUE;
++				} else {
++					/* Error */
++					break;
++				}
++			}
++		}
++
++		if (mb[0] != MBS_CMD_CMP) {
++			pext->Status = EXT_STATUS_ERR;
++			DEBUG9_10(printk( "%s(%ld): inst=%ld login failed.\n",
++			    __func__, ha->host_no, ha->instance);)
++
++			qla2x00_free_ioctl_scrap_mem(ha);
++			return (ret);
++		}
++	}
++
++	/* Send command */
++	DEBUG9(printk("%s(%ld): inst=%ld sending rnid cmd.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	ret = qla2x00_send_rnid_mbx(ha, dev_loop_id,
++	    (uint8_t)tmp_rnid->DataFormat, ha->ioctl_mem_phys,
++	    SEND_RNID_RSP_SIZE, &mb[0]);
++
++	if (ret != QLA2X00_SUCCESS) {
++		/* error */
++		pext->Status = EXT_STATUS_ERR;
++
++                DEBUG9_10(printk("%s(%ld): inst=%ld FAILED. rval = %x.\n",
++                    __func__, ha->host_no, ha->instance, mb[0]);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld rnid cmd sent ok.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	/* Copy the response */
++	copy_len = (pext->ResponseLen > SEND_RNID_RSP_SIZE) ?
++	    SEND_RNID_RSP_SIZE : pext->ResponseLen;
++
++	ret = verify_area(VERIFY_WRITE, (void  *)pext->ResponseAdr,
++	    copy_len);
++
++	if (ret != 0) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk(
++		    "%s(%ld): inst=%ld rsp buf verify WRITE error\n",
++		    __func__, ha->host_no, ha->instance);)
++	} else {
++		ret = copy_to_user((uint8_t *)pext->ResponseAdr,
++		    (uint8_t *)ha->ioctl_mem, copy_len);
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk(
++			    "%s(%ld): inst=%ld ERROR copy rsp buf\n",
++			    __func__, ha->host_no, ha->instance);)
++			qla2x00_free_ioctl_scrap_mem(ha);
++			return (ret);
++		}
++
++		if (SEND_RNID_RSP_SIZE > pext->ResponseLen) {
++			pext->Status = EXT_STATUS_DATA_OVERRUN;
++			DEBUG9(printk("%s(%ld): inst=%ld data overrun. "
++			    "exiting normally.\n",
++			    __func__, ha->host_no, ha->instance);)
++		} else {
++			pext->Status = EXT_STATUS_OK;
++			DEBUG9(printk("%s(%ld): inst=%ld exiting normally.\n",
++			    __func__, ha->host_no, ha->instance);)
++		}
++		pext->ResponseLen = copy_len;
++	}
++
++	qla2x00_free_ioctl_scrap_mem(ha);
++	return (ret);
++}
++
++/*
++ * qla2x00_get_rnid_params
++ *	IOCTL to get RNID parameters of the adapter.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = User space CT arguments pointer.
++ *	mode = flags.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_get_rnid_params(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int		ret = 0;
++	int		tmp_rval = 0;
++	uint32_t	copy_len;
++	uint16_t	mb[MAILBOX_REGISTER_COUNT];
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	/* check on loop down */
++	if (ha->loop_state != LOOP_READY || 
++	    test_bit(CFG_ACTIVE, &ha->cfg_flags) ||
++	    (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) ||
++	    ABORTS_ACTIVE || ha->dpc_active) {
++
++		pext->Status = EXT_STATUS_BUSY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld loop not ready.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		return (ret);
++	}
++
++	/* Send command */
++	tmp_rval = qla2x00_get_rnid_params_mbx(ha, ha->ioctl_mem_phys,
++	    sizeof(EXT_RNID_DATA), &mb[0]);
++
++	if (tmp_rval != QLA2X00_SUCCESS) {
++		/* error */
++		pext->Status = EXT_STATUS_ERR;
++
++		DEBUG9_10(printk("%s(%ld): inst=%ld cmd FAILED=%x.\n",
++		    __func__, ha->host_no, ha->instance, mb[0]);)
++		return (ret);
++	}
++
++	/* Copy the response */
++	copy_len = (pext->ResponseLen > sizeof(EXT_RNID_DATA)) ?
++	    (uint32_t)sizeof(EXT_RNID_DATA) : pext->ResponseLen;
++	ret = verify_area(VERIFY_WRITE, (void  *)pext->ResponseAdr,
++	    copy_len);
++
++	if (ret != 0) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld verify WRITE rsp buf error\n",
++		    __func__, ha->host_no, ha->instance);)
++	} else {
++		ret = copy_to_user((void *)pext->ResponseAdr,
++		    (void *)ha->ioctl_mem, copy_len);
++		if (ret) {
++			pext->Status = EXT_STATUS_COPY_ERR;
++			DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buf\n",
++			    __func__, ha->host_no, ha->instance);)
++			return (ret);
++		}
++
++		pext->ResponseLen = copy_len;
++		if (copy_len < sizeof(EXT_RNID_DATA)) {
++			pext->Status = EXT_STATUS_DATA_OVERRUN;
++			DEBUG9_10(printk("%s(%ld): inst=%ld data overrun. "
++			    "exiting normally.\n",
++			    __func__, ha->host_no, ha->instance);)
++ 		} else if (pext->ResponseLen > sizeof(EXT_RNID_DATA)) {
++ 			pext->Status = EXT_STATUS_DATA_UNDERRUN;
++ 			DEBUG9_10(printk("%s(%ld): inst=%ld data underrun. "
++ 			    "exiting normally.\n",
++ 			    __func__, ha->host_no, ha->instance);)
++		} else {
++			pext->Status = EXT_STATUS_OK;
++			DEBUG9(printk("%s(%ld): inst=%ld exiting normally.\n",
++			    __func__, ha->host_no, ha->instance);)
++		}
++	}
++
++	return (ret);
++}
++
++/*
++ * qla2x00_set_host_data
++ *	IOCTL command to set host/adapter related data.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = User space CT arguments pointer.
++ *	mode = flags.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_set_host_data(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	int	ret = 0;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	/* check on loop down */
++	if (ha->loop_state != LOOP_READY || 
++	    test_bit(CFG_ACTIVE, &ha->cfg_flags) ||
++	    (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) ||
++	    ABORTS_ACTIVE || ha->dpc_active) {
++
++		pext->Status = EXT_STATUS_BUSY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld loop not ready.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		return (ret);
++	}
++
++	/* switch on command subcode */
++	switch (pext->SubCode) {
++	case EXT_SC_SET_RNID:
++		ret = qla2x00_set_rnid_params(ha, pext, mode);
++		break;
++	default:
++		/* function not supported. */
++		pext->Status = EXT_STATUS_UNSUPPORTED_SUBCODE;
++		break;
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	return (ret);
++}
++
++/*
++ * qla2x00_set_rnid_params
++ *	IOCTL to set RNID parameters of the adapter.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	pext = User space CT arguments pointer.
++ *	mode = flags.
++ *
++ * Returns:
++ *	0 = success
++ *	others = errno value
++ *
++ * Context:
++ *	Kernel context.
++ */
++static int
++qla2x00_set_rnid_params(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode)
++{
++	EXT_SET_RNID_REQ	*tmp_set;
++	EXT_RNID_DATA	*tmp_buf;
++	int		ret = 0;
++	int		tmp_rval = 0;
++	uint16_t	mb[MAILBOX_REGISTER_COUNT];
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	if (pext->RequestLen != sizeof(EXT_SET_RNID_REQ)) {
++		/* parameter error */
++		pext->Status = EXT_STATUS_INVALID_PARAM;
++		DEBUG9_10(printk("%s(%ld): inst=%ld invalid request length.\n",
++		    __func__, ha->host_no, ha->instance);)
++		return(ret);
++	}
++
++	ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr,
++	    pext->RequestLen);
++
++	if (ret != 0) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk("%s(%ld): inst=%ld verify READ request buf.\n",
++		    __func__, ha->host_no, ha->instance);)
++		return(ret);
++	}
++
++	if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&tmp_set,
++	    sizeof(EXT_SET_RNID_REQ))) {
++		/* not enough memory */
++		pext->Status = EXT_STATUS_NO_MEMORY;
++		DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. "
++		    "size requested=%d.\n",
++		    __func__, ha->host_no, ha->instance,
++		    sizeof(EXT_SET_RNID_REQ));)
++		return (ret);
++	}
++
++	ret = copy_from_user(tmp_set, pext->RequestAdr, pext->RequestLen);
++	if (ret) {
++		pext->Status = EXT_STATUS_COPY_ERR;
++		DEBUG9_10(printk(
++		    "%s(%ld): inst=%ld ERROR copy req buf ret=%d\n", 
++		    __func__, ha->host_no, ha->instance, ret);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return(ret);
++	}
++
++	tmp_rval = qla2x00_get_rnid_params_mbx(ha, ha->ioctl_mem_phys,
++	    sizeof(EXT_RNID_DATA), &mb[0]);
++	if (tmp_rval != QLA2X00_SUCCESS) {
++		/* error */
++		pext->Status = EXT_STATUS_ERR;
++
++                DEBUG9_10(printk("%s(%ld): inst=%ld read cmd FAILED=%x.\n",
++                    __func__, ha->host_no, ha->instance, mb[0]);)
++		qla2x00_free_ioctl_scrap_mem(ha);
++		return (ret);
++	}
++
++	tmp_buf = (EXT_RNID_DATA *)ha->ioctl_mem;
++	/* Now set the params. */
++	memcpy(tmp_buf->IPVersion, tmp_set->IPVersion, 2);
++	memcpy(tmp_buf->UDPPortNumber, tmp_set->UDPPortNumber, 2);
++	memcpy(tmp_buf->IPAddress, tmp_set->IPAddress, 16);
++	tmp_rval = qla2x00_set_rnid_params_mbx(ha, ha->ioctl_mem_phys,
++	    sizeof(EXT_RNID_DATA), &mb[0]);
++
++	if (tmp_rval != QLA2X00_SUCCESS) {
++		/* error */
++		pext->Status = EXT_STATUS_ERR;
++
++		DEBUG9_10(printk("%s(%ld): inst=%ld set cmd FAILED=%x.\n",
++		    __func__, ha->host_no, ha->instance, mb[0]);)
++	} else {
++		pext->Status = EXT_STATUS_OK;
++		DEBUG9(printk("%s(%ld): inst=%ld exiting normally.\n",
++		    __func__, ha->host_no, ha->instance);)
++	}
++
++	qla2x00_free_ioctl_scrap_mem(ha);
++	return (ret);
++}
++
++/*
++ * qla2x00_waitq_sem_timeout
++ *	Timeout function to be called when a thread on the wait_q
++ *	queue timed out.
++ *
++ * Input:
++ *	data = data pointer for timeout function.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static void
++qla2x00_waitq_sem_timeout(unsigned long data)
++{
++	wait_q_t *tmp_ptr = (wait_q_t *)data;
++
++	DEBUG9(printk("%s: entered.\n", __func__);)
++
++	if (tmp_ptr != NULL) {
++		DEBUG9(printk("%s: wait_q thread=%p.\n", __func__, tmp_ptr);)
++		up(&tmp_ptr->wait_q_sem);
++	}
++
++	DEBUG9(printk("%s: exiting.\n", __func__);)
++
++}
++
++/*
++ * qla2x00_get_ioctl_access
++ *	Serialization routine for the ioctl commands.
++ *	When succeeded the exiting thread gains "access" and
++ *	proceeds, otherwise it gives up and returns error.
++ *	Each thread would wait tov seconds before giving up.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	tov = timeout value in seconds
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static uint8_t
++qla2x00_get_ioctl_access(scsi_qla_host_t *ha, uint32_t tov)
++{
++	int		prev_val = 1;
++	uint8_t		rval = QL_STATUS_SUCCESS;
++	unsigned long	cpu_flags;
++	struct timer_list	tmp_access_timer;
++	wait_q_t	*ptmp_wq = NULL;
++
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	while (1) {
++		if (test_bit(IOCTL_WANT, (void *)&(ha->ioctl->access_bits)) ==
++		    0) {
++
++			DEBUG9(printk("%s(%ld): going to test access_bits.\n",
++			    __func__, ha->host_no);)
++
++			/* No one else is waiting. Go ahead and try to
++			 * get access.
++			 */
++			if ((prev_val = test_and_set_bit(IOCTL_ACTIVE,
++			    (void *)&ha->ioctl->access_bits)) == 0) {
++				break;
++			}
++		}
++
++		/* wait for previous command to finish */
++		DEBUG9(printk("%s(%ld): inst=%ld access_bits=%x. busy. "
++		    "Waiting for access. curr time=0x%lx.\n",
++		    __func__, ha->host_no, ha->instance,
++		    ha->ioctl->access_bits, jiffies);)
++
++		/*
++		 * Init timer and get semaphore from wait_q. if we got valid
++		 * semaphore pointer the IOCTL_WANT flag would also had
++		 * been set.
++		 */
++		qla2x00_wait_q_add(ha, &ptmp_wq);
++
++		if (ptmp_wq == NULL) {
++			/* queue full? problem? can't proceed. */
++			DEBUG9_10(printk("%s(%ld): ERROR no more wait_q "
++			    "allowed. exiting.\n", __func__, ha->host_no);)
++
++			break;
++		}
++
++		init_timer(&tmp_access_timer);
++
++		tmp_access_timer.data = (unsigned long)ptmp_wq;
++		tmp_access_timer.function =
++		    (void (*)(unsigned long))qla2x00_waitq_sem_timeout;
++		tmp_access_timer.expires = jiffies + tov * HZ;
++
++		DEBUG9(printk("%s(%ld): adding timer. "
++		    "curr time=0x%lx timeoutval=0x%lx.\n",
++		    __func__, ha->host_no, jiffies, tmp_access_timer.expires);)
++
++		/* wait. */
++		add_timer(&tmp_access_timer);
++
++		DEBUG9(printk("%s(%ld): inst=%ld wait_q %p going to sleep. "
++		    "current time=0x%lx.\n",
++		    __func__, ha->host_no, ha->instance, ptmp_wq, jiffies);)
++
++		down_interruptible(&ptmp_wq->wait_q_sem);
++
++		DEBUG9(printk("%s(%ld): inst=%ld wait_q %p woke up. current "
++		    "time=0x%lx.\n",
++		    __func__, ha->host_no, ha->instance, ptmp_wq, jiffies);)
++
++		del_timer(&tmp_access_timer);
++
++		/* try to get lock again. we'll test later to see
++		 * if we actually got the lock.
++		 */
++		prev_val = test_and_set_bit(IOCTL_ACTIVE,
++		    (void *)&(ha->ioctl->access_bits));
++
++		/*
++		 * After we tried to get access then we check to see
++		 * if we need to clear the IOCTL_WANT flag. Don't clear
++		 * this flag before trying to get access or another
++		 * new thread might grab it before we did.
++		 */
++		spin_lock_irqsave(&ha->ioctl->wait_q_lock, cpu_flags);
++		if (prev_val != 0) {
++			/* We'll return with error.
++			 * Make sure we remove ourselves from wait_q.
++			 */
++			qla2x00_wait_q_remove(ha, ptmp_wq);
++		}
++		if (ha->ioctl->wait_q_head == NULL) {
++			/* We're the last thread in wait_q queue. */
++			clear_bit(IOCTL_WANT, (void *)&ha->ioctl->access_bits);
++		}
++		qla2x00_wait_q_memb_free(ha, ptmp_wq);
++		spin_unlock_irqrestore(&ha->ioctl->wait_q_lock, cpu_flags);
++
++		break;
++	}
++
++	if (prev_val == 0) {
++		/* We got the lock */
++
++		DEBUG9(printk("%s(%ld): inst=%ld got access.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++	} else {
++		/* Timeout or resource error. */
++		DEBUG9_10(printk("%s(%ld): inst=%ld timed out "
++		    "or wait_q error.\n", __func__, ha->host_no, ha->instance);)
++
++		rval = QL_STATUS_TIMEOUT;
++	}
++
++	return (rval);
++}
++
++/*
++ * qla2x00_release_ioctl_access
++ *	Serialization routine for the ioctl commands.
++ *	This releases "access" and checks on wai_q queue. If there's
++ *	another thread waiting then wakes it up.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *	tov = timeout value in seconds
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static uint8_t
++qla2x00_release_ioctl_access(scsi_qla_host_t *ha)
++{
++	wait_q_t	*next_thread = NULL;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	clear_bit(IOCTL_ACTIVE, (void *)&(ha->ioctl->access_bits));
++
++	/* Wake up one pending ioctl thread in wait_q */
++	qla2x00_wait_q_get_next(ha, &next_thread);
++	if (next_thread) {
++		DEBUG9(printk(
++		    "%s(%ld): inst=%ld found wait_q. Wake up waitq %p\n",
++		    __func__, ha->host_no, ha->instance, &next_thread);)
++		up(&next_thread->wait_q_sem);
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	return QL_STATUS_SUCCESS;
++}
++
++/*
++ * qla2x00_wait_q_memb_alloc
++ *	Finds a free wait_q member from the array. Must already got the
++ *	wait_q_lock spinlock.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static void
++qla2x00_wait_q_memb_alloc(scsi_qla_host_t *ha, wait_q_t **ret_wait_q_memb)
++{
++	uint8_t		i;
++	wait_q_t	*ptmp = NULL;
++
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	for (i = 0; i < MAX_IOCTL_WAIT_THREADS; i++) {
++		if (!(ha->ioctl->wait_q_arr[i].flags & WQ_IN_USE)) {
++			ha->ioctl->wait_q_arr[i].flags |= WQ_IN_USE;
++			ptmp = &ha->ioctl->wait_q_arr[i];
++			break;
++		}
++	}
++
++	*ret_wait_q_memb = ptmp;
++
++	DEBUG9(printk("%s(%ld): inst=%ld return waitq_memb=%p.\n",
++	    __func__, ha->host_no, ha->instance, *ret_wait_q_memb);)
++}
++
++/*
++ * qla2x00_wait_q_memb_free
++ *	Frees the specified wait_q member. Must already got the wait_q_lock
++ *	spinlock.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static void
++qla2x00_wait_q_memb_free(scsi_qla_host_t *ha, wait_q_t *pfree_wait_q_memb)
++{
++	DEBUG9(printk("%s(%ld): inst=%ld entered.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	if (pfree_wait_q_memb != NULL) {
++		DEBUG9(printk("%s(%ld): freeing %p.\n",
++		    __func__, ha->host_no, pfree_wait_q_memb);)
++		pfree_wait_q_memb->flags &= ~WQ_IN_USE;
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++}
++
++/*
++ * qla2x00_wait_q_add
++ *	Allocates a wait_q_t struct and add to the wait_q list.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static uint8_t
++qla2x00_wait_q_add(scsi_qla_host_t *ha, wait_q_t **ret_wq)
++{
++	uint8_t		rval = QL_STATUS_SUCCESS;
++	unsigned long	cpu_flags;
++	wait_q_t	*ptmp = NULL;
++
++	spin_lock_irqsave(&ha->ioctl->wait_q_lock, cpu_flags);
++
++	DEBUG9(printk("%s(%ld): inst=%ld got wait_q spinlock.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	qla2x00_wait_q_memb_alloc(ha, &ptmp);
++	if (ptmp == NULL) {
++		/* can't add any more threads */
++		DEBUG9_10(printk("%s(%ld): inst=%ld ERROR no more ioctl "
++		    "threads allowed.\n",
++		    __func__, ha->host_no, ha->instance);)
++
++		rval = QL_STATUS_RESOURCE_ERROR;
++	} else {
++		if (ha->ioctl->wait_q_tail == NULL) {
++			/* First thread to queue. */
++			set_bit(IOCTL_WANT, (void *)&ha->ioctl->access_bits);
++
++			ha->ioctl->wait_q_head = ptmp;
++		} else {
++			ha->ioctl->wait_q_tail->pnext = ptmp;
++		}
++		ha->ioctl->wait_q_tail = ptmp;
++
++		*ret_wq = ptmp;
++
++		/* Now init the semaphore */
++
++		init_MUTEX_LOCKED(&ptmp->wait_q_sem);
++
++		rval = QL_STATUS_SUCCESS;
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld going to release spinlock. "
++	    "ret_wq=%p, rval=%d.\n",
++	    __func__, ha->host_no, ha->instance, *ret_wq, rval);)
++
++	spin_unlock_irqrestore(&ha->ioctl->wait_q_lock, cpu_flags);
++
++	return rval;
++}
++
++/*
++ * qla2x00_wait_q_get_next
++ *	This just removes one member from head of wait_q.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static void
++qla2x00_wait_q_get_next(scsi_qla_host_t *ha, wait_q_t **ret_wq)
++{
++	unsigned long	cpu_flags;
++
++	if (test_bit(IOCTL_ACTIVE, (void *)&(ha->ioctl->access_bits)) != 0) {
++		/* Another thread just became active. Exit. */
++		*ret_wq = NULL;
++		return;
++	}
++
++	/* Find the next thread to wake up */
++	spin_lock_irqsave(&ha->ioctl->wait_q_lock, cpu_flags);
++
++	DEBUG9(printk("%s(%ld): inst=%ld got wait_q spinlock.\n",
++	    __func__, ha->host_no, ha->instance);)
++
++	/* Remove from head */
++	*ret_wq = ha->ioctl->wait_q_head;
++	if (ha->ioctl->wait_q_head != NULL) {
++
++		ha->ioctl->wait_q_head = ha->ioctl->wait_q_head->pnext;
++
++		if (ha->ioctl->wait_q_head == NULL) {
++			/* That's the last one in queue. */
++			ha->ioctl->wait_q_tail = NULL;
++		}
++
++		(*ret_wq)->pnext = NULL;
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld return ret_wq=%p. Going to release "
++	    "spinlock.\n",
++	    __func__, ha->host_no, ha->instance, *ret_wq);)
++	spin_unlock_irqrestore(&ha->ioctl->wait_q_lock, cpu_flags);
++}
++
++/*
++ * qla2x00_wait_q_remove
++ *	Removes the specified member from wait_q.
++ *	Must already got the wait_q_lock spin lock.
++ *
++ * Input:
++ *	ha = adapter state pointer.
++ *
++ * Returns:
++ *	qla2x00 local function return status code.
++ *
++ * Context:
++ *	Kernel context.
++ */
++static void
++qla2x00_wait_q_remove(scsi_qla_host_t *ha, wait_q_t *rem_wq)
++{
++	wait_q_t	*ptmp_wq;
++	wait_q_t	*ptmp_prev;
++
++	DEBUG9(printk("%s(%ld): inst=%ld rem_wq=%p.\n",
++	    __func__, ha->host_no, ha->instance, rem_wq);)
++
++	/* Search then remove */
++	ptmp_prev = NULL;
++	for (ptmp_wq = ha->ioctl->wait_q_head; ptmp_wq != NULL;
++	    ptmp_wq = ptmp_wq->pnext) {
++
++		if (ptmp_wq == rem_wq) {
++			/* Found it in wait_q. Remove. */
++
++			DEBUG9(printk("%s(%ld): inst=%ld removing.\n",
++			    __func__, ha->host_no, ha->instance);)
++
++			if (ha->ioctl->wait_q_head == ptmp_wq) {
++				ha->ioctl->wait_q_head = ptmp_wq->pnext;
++			} else {
++				ptmp_prev->pnext = ptmp_wq->pnext;
++			}
++
++			if (ha->ioctl->wait_q_tail == ptmp_wq) {
++				ha->ioctl->wait_q_tail = ptmp_prev;
++			}
++
++			ptmp_wq->pnext = NULL;
++
++			break;
++		}
++		ptmp_prev = ptmp_wq;
++	}
++
++	DEBUG9(printk("%s(%ld): inst=%ld exiting.\n",
++	    __func__, ha->host_no, ha->instance);)
++}
++
++
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qlfo.h	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,413 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++/*
++ * San/Device Management Failover Ioctl Header
++ * File is created to adhere to Solaris requirement using 8-space tabs.
++ *
++ * !!!!! PLEASE DO NOT REMOVE THE TABS !!!!!
++ * !!!!! PLEASE NO SINGLE LINE COMMENTS: // !!!!!
++ * !!!!! PLEASE NO MORE THAN 80 CHARS PER LINE !!!!!
++ *
++ * Revision History:
++ *
++ * Rev. 0.00	August 8, 2000
++ * WTR	- Created.
++ *
++ * Rev. 0.01	August 8, 2000
++ * WTR	- Made size of HbaInstance fields consistant as UINT8.
++ *        Made command codes as 300 upward to be consistant with definitions
++ *        in ExIoct.h.
++ * Rev. 0.01	October 3, 2000
++ * TLE  - Exclusion of ExIoct.h
++ *
++ * Rev. 0.01	October 6, 2000
++ * TLE  - Made size of HbaInstance fields UINT8
++ *
++ * Rev. 0.01	October 10, 2000
++ * TLE  - Add _FO_DRIVER_VERSION data structure
++ */
++
++
++
++#ifndef _FO_H
++#define _FO_H
++
++/*
++ * ***********************************************************************
++ * X OS type definitions
++ * ***********************************************************************
++ */
++#ifdef _MSC_VER						/* NT */
++
++#pragma pack(1)
++#include "qlfont.h"
++
++#elif defined(linux)					/* Linux */
++
++#include "qlfoln.h"
++
++#elif defined(sun) || defined(__sun)			/* Solaris */
++
++#include "qlfoso.h"
++
++#endif
++
++#define SDM_DEF_MAX_DEVICES		16
++#define SDM_DEF_MAX_PATHS_PER_TARGET	4
++#define SDM_DEF_MAX_TARGETS_PER_DEVICE	4
++#define SDM_DEF_MAX_PATHS_PER_DEVICE (SDM_DEF_MAX_PATHS_PER_TARGET * SDM_DEF_MAX_TARGETS_PER_DEVICE)
++
++#define FO_MAX_LUNS_PER_DEVICE	MAX_LUNS_OS
++#define FO_MAX_PATHS (SDM_DEF_MAX_PATHS_PER_DEVICE * SDM_DEF_MAX_DEVICES)
++#define FO_MAX_ADAPTERS		32
++#define FO_ADAPTER_ALL		0xFF
++#define FO_DEF_WWN_SIZE             8
++#define FO_MAX_GEN_INFO_STRING_LEN  32
++
++
++#define FO_NOTIFY_TYPE_NONE                   0
++#define FO_NOTIFY_TYPE_LUN_RESET              1
++#define FO_NOTIFY_TYPE_CDB                    2
++#define FO_NOTIFY_TYPE_LOGOUT_OR_LUN_RESET    3
++#define FO_NOTIFY_TYPE_LOGOUT_OR_CDB          4
++
++#define FO_NOTIFY_TYPE_MIN                FO_NOTIFY_TYPE_NONE
++#define FO_NOTIFY_TYPE_MAX                FO_NOTIFY_TYPE_LOGOUT_OR_CDB
++#define FO_NOTIFY_TYPE_DEF                FO_NOTIFY_TYPE_NONE
++
++#define FO_NOTIFY_CDB_LENGTH_MIN              6
++#define FO_NOTIFY_CDB_LENGTH_MAX             16
++
++/*
++ * IOCTL Commands
++ */
++
++#define FO_CC_GET_PARAMS		        FO_CC_GET_PARAMS_OS
++#define FO_CC_SET_PARAMS		        FO_CC_SET_PARAMS_OS
++#define FO_CC_GET_PATHS		            FO_CC_GET_PATHS_OS
++#define FO_CC_SET_CURRENT_PATH	        FO_CC_SET_CURRENT_PATH_OS
++#define FO_CC_GET_HBA_STAT		        FO_CC_GET_HBA_STAT_OS
++#define FO_CC_RESET_HBA_STAT	        FO_CC_RESET_HBA_STAT_OS
++#define FO_CC_GET_LUN_DATA              FO_CC_GET_LUN_DATA_OS
++#define FO_CC_SET_LUN_DATA              FO_CC_SET_LUN_DATA_OS
++#define FO_CC_GET_TARGET_DATA           FO_CC_GET_TARGET_DATA_OS
++#define FO_CC_SET_TARGET_DATA           FO_CC_SET_TARGET_DATA_OS
++#define FO_CC_GET_FO_DRIVER_VERSION     FO_CC_GET_FO_DRIVER_VERSION_OS
++
++
++/* Systemwide failover parameters. */
++
++typedef struct _FO_PARAMS
++{
++        UINT32      InspectionInterval;     /* Timer interval to check for failover.*/
++        UINT8       MaxPathsPerDevice;	    /* Max paths to any single device. */
++        UINT8       MaxRetriesPerPath;	    /* Max retries on a path before */
++
++        /* Failover. */
++        UINT8       MaxRetriesPerIo;	    /* Max retries per i/o request. */
++        UINT8       Reserved1;
++        UINT32      Flags;			        /* Control flags. */
++        UINT8       DeviceErrorThreshold;   /* Max device errors. */
++        UINT8       DeviceTimeoutThreshold; /* Max device timeouts.*/
++        UINT8       FrameErrorThreshold;    /* Max frame errors.*/
++        UINT8       LinkErrorThreshold;     /* Max link errors.*/
++        UINT32      Reserved2[4];           /* Spares.*/
++
++        /* Load balancing parameters.*/
++
++        UINT8       RollingAverageIntervals;/* Intervals to sum for rolling average.*/
++        UINT8       MaxDevicesToMigrate;    /* Max devices to migrate in any interval.*/
++        UINT8       BalanceMethod;          /* Method to use for load balancing.*/
++        UINT8       Reserved3;              /* Memory alignment.*/
++
++        UINT16      LoadShareMinPercentage; /* Load balancing parameter.*/
++        UINT16      LoadShareMaxPercentage; /* Load balancing parameter.*/
++
++        /* Failover notify parameters. */
++
++        UINT8       FailoverNotifyType;	/* Type of notification. */
++        UINT8       FailoverNotifyCdbLength;/* Length of notification CDB. */
++        UINT16      Reserved4;
++        UINT8       FailoverNotifyCdb[16];	/* CDB if notification by CDB. */
++        UINT32      Reserved5;
++
++}
++FO_PARAMS, *PFO_PARAMS, SysFoParams_t, *SysFoParams_p;
++
++extern SysFoParams_t qla_fo_params;
++
++typedef struct _FO_GET_PATHS
++{
++        UINT8       HbaInstance;
++        EXT_DEST_ADDR HbaAddr;       /* Lun field is ignored */
++        UINT32      Reserved[5];
++
++}
++FO_GET_PATHS, *PFO_GET_PATHS;
++
++
++typedef struct _FO_PATH_ENTRY
++{
++        UINT8   Reserved1;
++        UINT8   Visible;		/* Path is visible path. */
++        UINT8   Priority;
++        UINT8   Reserved2;
++        UINT8   HbaInstance;
++        UINT8   PortName[EXT_DEF_WWN_NAME_SIZE];
++        UINT16  Reserved3;
++        UINT32  Reserved[3];
++
++}
++FO_PATH_ENTRY, *PFO_PATH_ENTRY;
++
++
++typedef struct _FO_PATHS_INFO
++{
++        /* These first fields in the output buffer are specifically the
++         * same as the fields in the input buffer.  This is because the
++         * same system buffer holds both, and this allows us to reference
++         * the input buffer parameters while filling the output buffer. */
++
++        UINT8       HbaInstance;
++        EXT_DEST_ADDR HbaAddr;
++        UINT32      Reserved[5];
++        UINT8       PathCount;          /* Number of Paths in PathEntry array */
++        UINT8       Reserved3;
++        UINT8       VisiblePathIndex;   /* Which index has BOOLEAN "visible" flag set */
++        UINT8       Reserved4;
++
++        UINT8       CurrentPathIndex[FO_MAX_LUNS_PER_DEVICE];   /* Current Path Index for each Lun */
++
++        FO_PATH_ENTRY   PathEntry[FO_MAX_PATHS];
++
++        UINT32      Reserved5[4];
++
++}
++FO_PATHS_INFO, *PFO_PATHS_INFO;
++
++typedef struct _FO_SET_CURRENT_PATH
++{
++        UINT8       HbaInstance;
++        EXT_DEST_ADDR HbaAddr;
++        UINT8       NewCurrentPathIndex;    /* Path index to make current path. */
++        UINT8       FailoverType;           /* Reason for failover. */
++        UINT32      Reserved[3];
++
++}
++FO_SET_CURRENT_PATH, *PFO_SET_CURRENT_PATH;
++
++typedef union _FO_PATHS {
++        FO_GET_PATHS input;
++        FO_SET_CURRENT_PATH set
++                ;
++        FO_PATHS_INFO info;
++} FO_PATHS;
++
++
++typedef struct  _FO_HBA_STAT_INPUT
++{
++        /* The first field in the input buffer is specifically the
++         * same as the field in the output buffer.  This is because the
++         * same system buffer holds both, and this allows us to reference
++         * the input buffer parameters while filling the output buffer. */
++
++        UINT8       HbaInstance;		/* Port number or ADAPTER_ALL. */
++        UINT8       Reserved1[3];
++        UINT32      Reserved2[7];
++
++}
++FO_HBA_STAT_INPUT, *PFO_HBA_STAT_INPUT;
++
++
++typedef struct _FO_HBA_STAT_ENTRY
++{
++        UINT8       HbaInstance;
++        UINT8       Reserved1[3];
++        UINT32      Reserved2;
++        UINT64      IosRequested; /* IOs requested on this adapter. */
++        UINT64      BytesRequested;		/* Bytes requested on this adapter. */
++        UINT64      IosExecuted; /* IOs executed on this adapter. */
++        UINT64      BytesExecuted;		/* Bytes executed on this adapter. */
++        UINT32      Reserved3[22];
++
++}
++FO_HBA_STAT_ENTRY, *PFO_HBA_STAT_ENTRY;
++
++
++typedef struct _FO_HBA_STAT_INFO
++{
++        /* The first fields in the output buffer is specifically the
++         * same as the field in the input buffer.  This is because the
++         * same system buffer holds both, and this allows us to reference
++         * the input buffer parameters while filling the output buffer. */
++
++        UINT8       HbaInstance; /* Port number or ADAPTER_ALL. */
++        UINT8       HbaCount; /* Count of adapters returned. */
++        UINT8       Reserved1[2];
++        UINT32      Reserved2[7];
++
++        FO_HBA_STAT_ENTRY StatEntry[FO_MAX_ADAPTERS];
++
++}
++FO_HBA_STAT_INFO, *PFO_HBA_STAT_INFO;
++
++
++
++/*  The "external" LUN data refers to the LUNs as represented in our
++  configuration utility, where one physical target can support up to
++  2048 LUNs, which are mapped around internally.  This is in comparison
++  to an "internal" LUN data, which is 256 LUNs, after being mapped
++  inside the driver to multiple target slots. */
++
++#define EXTERNAL_LUN_COUNT          2048
++
++/* Structure as used in the IOCTL.*/
++
++typedef struct _FO_EXTERNAL_LUN_DATA_ENTRY
++{
++        UINT8       NodeName[EXT_DEF_WWN_NAME_SIZE];
++        UINT8       PortName[EXT_DEF_WWP_NAME_SIZE];  //sri
++
++        UINT16      LunCount;   /* Entries in Lun Data array. */
++        UINT8       TargetId;
++        UINT8       Dev_No;
++        UINT32      Reserved3;
++        UINT32      Reserved4;
++        UINT32      Reserved5;                     /* Pad to 32-byte header.*/
++
++        UINT8       Data[EXTERNAL_LUN_COUNT];
++}
++FO_EXTERNAL_LUN_DATA_ENTRY, *PFO_EXTERNAL_LUN_DATA_ENTRY;
++
++//  Structure as it is stored in the NT registry.
++
++typedef struct _FO_LUN_DATA_LIST
++{
++        UINT16      Version;                       /* Should be LUN_DATA_REGISTRY_VERSION.*/
++        UINT16      EntryCount;                    /* Count of variable entries following.*/
++        UINT32      Reserved1;
++        UINT32      Reserved2;
++        UINT32      Reserved3;
++        UINT32      Reserved4;
++        UINT32      Reserved5;
++        UINT32      Reserved6;
++        UINT32      Reserved7;                     /* Pad to 32-byte header.*/
++
++        FO_EXTERNAL_LUN_DATA_ENTRY DataEntry[1];   /* Variable-length data.*/
++
++}
++FO_LUN_DATA_LIST, *PFO_LUN_DATA_LIST;
++
++typedef struct  _FO_LUN_DATA_INPUT
++{
++        /* The first field in the input buffer is specifically the
++         * same as the field in the output buffer.  This is because the
++         * same system buffer holds both, and this allows us to reference
++         * the input buffer parameters while filling the output buffer. */
++
++        UINT8       HbaInstance;		/* Port number */
++        UINT8       Reserved1[3];
++        UINT32      Reserved2[7];
++
++}
++FO_LUN_DATA_INPUT, *PFO_LUN_DATA_INPUT;
++
++typedef struct _FO_REQUEST_ADDR
++{
++        UINT8           HbaInstance;
++        EXT_DEST_ADDR   TargetAddr;
++        UINT32          Reserved[5];
++
++}
++FO_REQUEST_ADDR, *PFO_REQUEST_ADDR;
++
++typedef struct  _FO_TARGET_DATA_INPUT
++{
++        UINT8       HbaInstance;		/* Port number */
++        UINT8       Reserved1[3];
++        UINT32      Reserved2[7];
++
++}
++FO_TARGET_DATA_INPUT, *PFO_TARGET_DATA_INPUT;
++
++#define FO_INTERNAL_LUN_COUNT          256
++#define FO_INTERNAL_LUN_BITMASK_BYTES  (FO_INTERNAL_LUN_COUNT / 8)
++
++typedef struct _FO_INTERNAL_LUN_BITMASK
++{
++        UINT8       Bitmask[FO_INTERNAL_LUN_BITMASK_BYTES];
++}
++FO_INTERNAL_LUN_BITMASK, *PFO_INTERNAL_LUN_BITMASK;
++
++typedef struct _FO_DEVICE_DATA
++{
++        UINT32      DeviceFlags;        /* Device flags */
++        UINT16      LoopId;             /* Current loop ID */
++        UINT16      BaseLunNumber;      /* Base LUN number */
++        UINT8       WorldWideName[8];   /* World Wide Name for device */
++        UINT8       PortId[3];          /* Port ID */
++        UINT8       MultipathControl;   /* Multipath control byte. */
++        UINT16      DeviceState;        /* Device state */
++        UINT16      LoginRetryCount;    /* Number of login retries */
++        UINT8       PortName[8];        /* Port name for device */
++        UINT16      TimeoutCount;       /* Command timeout count */
++        UINT8       TargetId;
++        UINT8       Dev_No;
++        FO_INTERNAL_LUN_BITMASK    LunBitmask; /* LUN bitmask */
++}
++FO_DEVICE_DATA, *PFO_DEVICE_DATA;
++
++typedef struct _FO_DEVICE_DATABASE
++{
++        FO_DEVICE_DATA  DeviceData[256];
++}
++FO_DEVICE_DATABASE, *PFO_DEVICE_DATABASE;
++
++typedef struct _FO_DRIVER_VERSION
++{
++        // Numeric version.
++        UINT8       Version;                       // Major version number.
++        UINT8       Revision;                      // Minor version number.
++        UINT8       Subrevision;                   // Subminor version number.
++        UINT8       Reserved1;                      // Memory alignment.
++
++        // String version.
++        UINT8       VersionStr[FO_MAX_GEN_INFO_STRING_LEN];
++
++        // Reserved fields.
++        UINT32      Reserved2[16];
++
++}
++FO_DRIVER_VERSION, *PFO_DRIVER_VERSION;
++
++
++#define FO_LUN_DATA_LIST_MIN_ENTRIES      1
++#define FO_LUN_DATA_LIST_MAX_ENTRIES    256
++#ifdef _WIN64
++#define FO_LUN_DATA_LIST_HEADER_SIZE 32
++#else
++#define FO_LUN_DATA_LIST_HEADER_SIZE offsetof(FO_LUN_DATA_LIST, DataEntry)
++#endif
++
++#define FO_LUN_DATA_LIST_MIN_SIZE (FO_LUN_DATA_LIST_HEADER_SIZE + (sizeof(FO_EXTERNAL_LUN_DATA_ENTRY) * FO_LUN_DATA_LIST_MIN_ENTRIES))
++#define FO_LUN_DATA_LIST_MAX_SIZE (FO_LUN_DATA_LIST_HEADER_SIZE + (sizeof(FO_EXTERNAL_LUN_DATA_ENTRY) * FO_LUN_DATA_LIST_MAX_ENTRIES))
++
++
++#endif	/* ifndef _FO_H */
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qlfolimits.h	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,92 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++/*
++ *  Minimums, maximums, defaults, and other definitions for MC_PARAMS.
++ */
++
++#define FO_INSPECTION_INTERVAL_MIN                     0
++#define FO_INSPECTION_INTERVAL_MAX               1000000
++#define FO_INSPECTION_INTERVAL_DEF                   600
++
++#define FO_MAX_PATHS_PER_DEVICE_MIN                    1
++#define FO_MAX_PATHS_PER_DEVICE_MAX                    8
++#define FO_MAX_PATHS_PER_DEVICE_DEF                    8
++
++#define FO_MAX_RETRIES_PER_PATH_MIN                    1
++#define FO_MAX_RETRIES_PER_PATH_MAX                    8
++#define FO_MAX_RETRIES_PER_PATH_DEF                    3
++
++#define FO_MAX_RETRIES_PER_IO_MIN          ((FO_MAX_PATHS_PER_DEVICE_MIN * FO_MAX_RETRIES_PER_PATH_MIN) + 1)
++#define FO_MAX_RETRIES_PER_IO_MAX          ((FO_MAX_PATHS_PER_DEVICE_MAX * FO_MAX_RETRIES_PER_PATH_MAX) + 1)
++#define FO_MAX_RETRIES_PER_IO_DEF          ((FO_MAX_PATHS_PER_DEVICE_DEF * FO_MAX_RETRIES_PER_PATH_DEF) + 1)
++
++#define FO_DEVICE_ERROR_THRESHOLD_MIN                  1
++#define FO_DEVICE_ERROR_THRESHOLD_MAX                255
++#define FO_DEVICE_ERROR_THRESHOLD_DEF                  4
++
++#define FO_DEVICE_TIMEOUT_THRESHOLD_MIN                1
++#define FO_DEVICE_TIMEOUT_THRESHOLD_MAX              255
++#define FO_DEVICE_TIMEOUT_THRESHOLD_DEF                4
++
++#define FO_FRAME_ERROR_THRESHOLD_MIN                   1
++#define FO_FRAME_ERROR_THRESHOLD_MAX                 255
++#define FO_FRAME_ERROR_THRESHOLD_DEF                   4
++
++#define FO_LINK_ERROR_THRESHOLD_MIN                    1
++#define FO_LINK_ERROR_THRESHOLD_MAX                  255
++#define FO_LINK_ERROR_THRESHOLD_DEF                    4
++
++#define FO_ROLLING_AVERAGE_INTERVALS_MIN               1
++#define FO_ROLLING_AVERAGE_INTERVALS_MAX              10
++#define FO_ROLLING_AVERAGE_INTERVALS_DEF               1
++
++#define FO_MAX_DEVICES_TO_MIGRATE_MIN                  0
++#define FO_MAX_DEVICES_TO_MIGRATE_MAX                255
++#define FO_MAX_DEVICES_TO_MIGRATE_DEF                  4
++
++#define FO_BALANCE_METHOD_NONE                         0
++#define FO_BALANCE_METHOD_IOS                          1
++#define FO_BALANCE_METHOD_MBS                          2
++
++#define FO_BALANCE_METHOD_MIN                      FO_BALANCE_METHOD_NONE
++#define FO_BALANCE_METHOD_MAX                      FO_BALANCE_METHOD_MBS
++#define FO_BALANCE_METHOD_DEF                      FO_BALANCE_METHOD_IOS
++
++#define FO_LOAD_SHARE_MIN_PERCENTAGE_MIN              25
++#define FO_LOAD_SHARE_MIN_PERCENTAGE_MAX              99
++#define FO_LOAD_SHARE_MIN_PERCENTAGE_DEF              75
++
++#define FO_LOAD_SHARE_MAX_PERCENTAGE_MIN             101
++#define FO_LOAD_SHARE_MAX_PERCENTAGE_MAX             500
++#define FO_LOAD_SHARE_MAX_PERCENTAGE_DEF             150
++
++#define FO_NOTIFY_TYPE_NONE                   0
++#define FO_NOTIFY_TYPE_LUN_RESET              1
++#define FO_NOTIFY_TYPE_CDB                    2
++#define FO_NOTIFY_TYPE_LOGOUT_OR_LUN_RESET    3
++#define FO_NOTIFY_TYPE_LOGOUT_OR_CDB          4
++
++#define FO_NOTIFY_TYPE_MIN                FO_NOTIFY_TYPE_NONE
++#define FO_NOTIFY_TYPE_MAX                FO_NOTIFY_TYPE_LOGOUT_OR_CDB
++#define FO_NOTIFY_TYPE_DEF                FO_NOTIFY_TYPE_NONE
++
++#define FO_NOTIFY_CDB_LENGTH_MIN              6
++#define FO_NOTIFY_CDB_LENGTH_MAX             16
++
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qlfoln.h	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,76 @@
++/******************************************************************************
++ *                  QLOGIC LINUX SOFTWARE
++ *
++ * QLogic ISP2x00 device driver for Linux 2.5.x
++ * Copyright (C) 2003 Qlogic Corporation
++ * (www.qlogic.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, 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.
++ *
++ ******************************************************************************/
++
++
++#define QLMULTIPATH_MAGIC 'y'
++/********************************************************/
++/* Failover ioctl command codes range from 0xc0 to 0xdf */
++/********************************************************/
++
++
++#define FO_CC_GET_PARAMS_OS             \
++    _IOWR(QLMULTIPATH_MAGIC, 200, sizeof(EXT_IOCTL))	/* 0xc8 */
++#define FO_CC_SET_PARAMS_OS             \
++    _IOWR(QLMULTIPATH_MAGIC, 201, sizeof(EXT_IOCTL))	/* 0xc9 */
++#define FO_CC_GET_PATHS_OS              \
++    _IOWR(QLMULTIPATH_MAGIC, 202, sizeof(EXT_IOCTL))	/* 0xca */
++#define FO_CC_SET_CURRENT_PATH_OS       \
++    _IOWR(QLMULTIPATH_MAGIC, 203, sizeof(EXT_IOCTL))	/* 0xcb */
++#define FO_CC_GET_HBA_STAT_OS           \
++    _IOWR(QLMULTIPATH_MAGIC, 204, sizeof(EXT_IOCTL))	/* 0xcc */
++#define FO_CC_RESET_HBA_STAT_OS         \
++    _IOWR(QLMULTIPATH_MAGIC, 205, sizeof(EXT_IOCTL))	/* 0xcd */
++#define FO_CC_GET_LUN_DATA_OS           \
++    _IOWR(QLMULTIPATH_MAGIC, 206, sizeof(EXT_IOCTL))	/* 0xce */
++#define FO_CC_SET_LUN_DATA_OS           \
++    _IOWR(QLMULTIPATH_MAGIC, 207, sizeof(EXT_IOCTL))	/* 0xcf */
++#define FO_CC_GET_TARGET_DATA_OS        \
++    _IOWR(QLMULTIPATH_MAGIC, 208, sizeof(EXT_IOCTL))	/* 0xd0 */
++#define FO_CC_SET_TARGET_DATA_OS        \
++    _IOWR(QLMULTIPATH_MAGIC, 209, sizeof(EXT_IOCTL))	/* 0xd1 */
++#define FO_CC_GET_FO_DRIVER_VERSION_OS  \
++    _IOWR(QLMULTIPATH_MAGIC, 210, sizeof(EXT_IOCTL))	/* 0xd2 */
++
++
++#define BOOLEAN uint8_t
++#define MAX_LUNS_OS	256
++
++/* Driver attributes bits */
++#define DRVR_FO_ENABLED		0x1	/* bit 0 */
++
++
++/*
++ * Overrides for Emacs so that we almost 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: 2
++ * c-brace-imaginary-offset: 0
++ * c-brace-offset: -2
++ * c-argdecl-indent: 2
++ * c-label-offset: -2
++ * c-continued-statement-offset: 2
++ * c-continued-brace-offset: 0
++ * indent-tabs-mode: nil
++ * tab-width: 8
++ * End:
++ */
++
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/release.txt	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,28 @@
++
++                 QLogic QLA2200 and QLA2300 Linux Driver 
++
++                           Release Notes
++			   =============
++
++Version  8.00.00b1	March 05, 2003
++
+++**********************************************+
++* Features supported by this version of driver *
+++**********************************************+
++o FCAL - direct attach
++o Point-to-point 
++o Fabric support 
++o Initiator mode only
++o Fault recovery on down loops
++o Persistent binding - HBA node name valid
++o Linux 2.5.x Kernel Support *ONLY*
++o IPFC support
++
+++********************************+
++* Changes From Previous Releases *
+++********************************+
++o Please view revision.notes file
++ 
+++**************+
++* Known Issues *
+++**************+
+--- /dev/null	Thu Apr 11 07:25:15 2002
++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/revision.notes	Thu Jul  3 15:34:42 2003
+@@ -0,0 +1,167 @@
++/*
++ * QLogic ISP2200 and ISP2300 Linux Driver Revision List File.
++ *
++ ********************************************************************
++ *
++ * Revision History
++ *
++ *  Rev  8.00.00	May 05, 2003		AV
++ *	- Resync with Linux Kernel 2.5.69.
++ *	- Firmware versions: 2100 TP (1.19.24), 2200 TP (2.02.05),
++ *	  2300 TPX (3.02.10).
++ *
++ *  Rev  8.00.00b1-pre45 April ??, 2003		AV
++ *	- Resync with Linux Kernel 2.5.68-bk11:
++ *	- Fix improper return-code assignment during fabric
++ *	  discovery.
++ *	- Remove additional extraneous #defines from
++ *	  qla_settings.h.
++ *	  - USE_PORTNAME -- FO will always use portname.
++ *	- Default queue depth size set to 64.
++ *
++ *  Rev  8.00.00b1-pre42 April ??, 2003		AV
++ *	- Convert bottom-half tasklet to a work_queue.
++ *	- Initial basic coding of dynamic queue depth handling
++ *	  during QUEUE FULL statuses.
++ *	- Fix mailbox interface problem with
++ *	  qla2x00_get_retry_cnt().
++ *
++ *  Rev  8.00.00b1-pre41 April ??, 2003		AV
++ *	- Convert build defines qla2[1|2|3]00 macros to
++ *	  qla2[1|2|3]xx due to module name stringification clashes.
++ *	- Add additional ISP2322 checks during board configuration.
++ *
++ *  Rev  8.00.00b1-pre40 April ??, 2003		AV
++ *	- Resync with Linux Kernel 2.5.68-bk8:
++ *	  - Updated IRQ handler interface.
++ *	- Add ISP dump code (stub) in case of SYSTEM_ERROR on
++ *	  ISP2100.
++ *	- Add new 2200 IP firmware (2.02.05).
++ *
++ *  Rev  8.00.00b1-pre39 April ??, 2003		AV
++ *	- Resync with Linux Kernel 2.5.68.
++ *	- Add simple build.sh script to aid in external compilation.
++ *	- Clean-break with Kernel 2.4 compatibility.
++ *	  - Rework DPC routine -- completion routines for signaling.
++ *	- Re-add HBAAPI character device node for IOCTL support.
++ *	- Remove residual QLA2X_PERFORMANCE defines.
++ *	- Allocate SP pool via __get_free_pages() rather than
++ *	  individual kmalloc()'s.
++ *	- Inform SCSI mid-layer of 16-byte CDB support
++ *	  (host->max_cmd_len):
++ *	  - Remove unecessary 'more_cdb' handling code from
++ *	    qla_iocb.c and qla_xioct.c.
++ *	- Reduce duplicate code in fabric scanning logic (MS IOCB
++ *	  preparation).
++ *	- Add ISP dump code in case of SYSTEM_ERROR.
++ *	- Remove 2300 VIX firmware from distribution:
++ *	  - Add initial code for IPX support.
++ *	- Add new 2300 TPX firmware (3.02.10).
++ *
++ *  Rev  8.00.00b1-pre34 April ??, 2003		AV
++ *	- Resync with Linux Kernel 2.5.67.
++ *	- Use domain/area/al_pa fields when displaying PortID 
++ *	  values -- addresses endianess issues.
++ *	- Rework large case statement to check 'common' CDB commands
++ *	  early in qla2x00_get_cmd_direction().
++ *
++ *  Rev  8.00.00b1-pre31 April ??, 2003		AV
++ *	- Update makefile to support PPC64 build.
++ *	- Retool NVRAM configuration routine and structures:
++ *	  - Consoldate ISP21xx/ISP22xx/ISP23xx configuration
++ *	    (struct nvram_t).
++ *	  - Remove big/little endian support structures in favor of
++ *	    simplified bit-operations within byte fields.
++ *	- Fix long-standing 'static' buffer sharing problem in 
++ *	  qla2x00_configure_fabric().
++ *
++ *  Rev  8.00.00b1-pre30 April ??, 2003		AV
++ *	- Complete implementation of GID_PT scan.
++ *	- Use consistent MS IOCB invocation method to query SNS:
++ *	  - Add RNN_ID and RSNN_NN registrations in a fabric.
++ *	- Remove unused Mailbox Command 6Eh (Send SNS) support
++ *	  structures.
++ *	- Use 64bit safe IOCBs while issuing INQUIRY and RLC during
++ *	  topology scan.
++ *	- Until reimplementation of fcdev_t/fcport list
++ *	  consolidation, valid loop_id ranges are still limited from
++ *	  0x00 through 0xFF -- enforce this within the code.
++ *
++ *  Rev  8.00.00b1-pre27 March ??, 2003		AV
++ *	- Resync with 6.05.00b9.
++ *	- Retool HBA PCI configuration -- qla2x00_pci_config().
++ *	- Remove inconsistent use of delay routines (UDELAY/SYS*).
++ *	- Continue to teardown/clean/add comments and debug
++ *	  routines.
++ *	- Properly swap bytes of the device's nodename in
++ *	  qla2x00_configure_local_loop().
++ *
++ *  Rev  8.00.00b1-pre25 March ??, 2003		AV
++ *	- Resync with 6.05.00b8.
++ *
++ *  Rev  8.00.00b1-pre23 March ??, 2003		AV
++ *	- Remove (#define) IOCB usage throttling.
++ *	- Abstract interrupt polling with qla2x00_poll().
++ *	- Modify lun scanning logic:
++ *	  - If the device does not support the SCSI Report Luns
++ *	    command, the driver will now only scan from 0 to the
++ *	    max#-luns as defined in the NVRAM (BIOS), rather than
++ *	    blindly scanning from 0 to 255 -- which could result in
++ *	    an increase in startup time when running against slow
++ *	    (JBOD) devices.
++ *	- Rework reset logic in qla2x00_reset_chip() (spec).
++ *
++ *  Rev  8.00.00b1-pre22 March ??, 2003		AV
++ *	- Resync with 6.05.00b7.
++ *	- Cleanup (rewrite) ISR handler.
++ *	- Rename kmem_zalloc --> qla2x00_kmem_zalloc():
++ *	  - This function will eventually be removed.
++ *	- Add new 2300 VIX firmware (3.02.09):
++ *	  - Support for Tape, Fabric, 2K logins, IP, and VI.
++ *
++ *  Rev  8.00.00b1-pre18 March ??, 2003		AV
++ *	- Support 232x type ISPs.
++ *	- Support single firmware for each ISP type:
++ *	  - Restructure brd_info/fw_info methods.
++ *	  - Streamline firmware load process.
++ *	  - Properly query firmware for version information.
++ *	- Remove extraneous scsi_qla_host members:
++ *	  - device_id ==> pdev->device
++ *	- Fix fc4 features (RFF_ID) registration.
++ *	- Convert kmem_zalloc --> qla2x00_kmem_zalloc().
++ *	- Remove unused/extraneous #defines (USE_PORTNAME).
++ *
++ *  Rev  8.00.00b1-pre14 March ??, 2003		AV
++ *	- Resync with 6.05.00b6.
++ *	- Initial source-code restructuring effort.
++ *	  - Build procedure.
++ *	  - Source file layout -- intuitive component layout.
++ *	  - Remove unused #defines (*PERFORMANCE, WORD_FW_LOAD, etc).
++ *	- Add support for 2K logins (TPX -- firmware).
++ *	- Add module parameter ql2xsuspendcount.
++ *	- Add new 2200 IP/TP firmware (2.02.04).
++ *
++ *  Rev  8.00.00b1-pre9	March ??, 2003	RL/DG/RA/AV
++ *	- Use kernel struct list_head for fcport and fclun lists.
++ *	- Remove extraneous (L|M)S_64BITS() and QL21_64*() defines.
++ *
++ *  Rev  8.00.00b1-pre8	February 28, 2003	RL/DG/RA/AV
++ *	- Resync with 6.05.00b3.
++ *
++ *  Rev  8.00.00b1-pre7	February 23, 2003	RL/DG/RA/AV
++ *	- Add alternate fabric scanning logic (GID_PT/GNN_ID/GPN_ID).
++ *	- Remove use of deprecated function check_region().
++ *	- Add new 2300 IP/TP firmware (3.02.08).
++ *
++ *  Rev  8.00.00b1-pre5	January 28, 2003	RL/DG/RA/AV
++ *	- Resync with 6.05.00b3.
++ *	- Consolidate device_reg structure definitions for ISP types.
++ *	- Add support for new queue-depth selection.
++ *	- Add new 2300 IP/TP firmware (3.02.07).
++ *
++ *  Rev  8.00.00b1-pre1	January 17, 2003	AV
++ *	- Initial branch from 6.04.00b8 driver.
++ *	- Remove VMWARE specific code.
++ *	- Add support for pci_driver interface.
++ *
++ ********************************************************************/
+
+_
diff --git a/lustre/kernel_patches/patches/tcp_zero_copy_2.4.20_chaos.patch b/lustre/kernel_patches/patches/tcp_zero_copy_2.4.20_chaos.patch
new file mode 100644
index 0000000000..dfb4de51c6
--- /dev/null
+++ b/lustre/kernel_patches/patches/tcp_zero_copy_2.4.20_chaos.patch
@@ -0,0 +1,459 @@
+ include/linux/skbuff.h |   30 +++++
+ include/net/tcp.h      |    5 
+ net/core/skbuff.c      |   25 ++++
+ net/ipv4/tcp.c         |  252 ++++++++++++++++++++++++++++++++++++++++++++++++-
+ net/netsyms.c          |    2 
+ 5 files changed, 311 insertions(+), 3 deletions(-)
+
+--- kernel-2.4.20-6chaos_18_7/include/linux/skbuff.h~tcp_zero_copy_2.4.20_chaos	2003-06-24 11:31:17.000000000 -0600
++++ kernel-2.4.20-6chaos_18_7-braam/include/linux/skbuff.h	2003-07-12 15:38:07.000000000 -0600
+@@ -116,6 +116,30 @@ struct skb_frag_struct
+ 	__u16 size;
+ };
+ 
++/* Support for callback when skb data has been released */
++typedef struct zccd				/* Zero Copy Callback Descriptor */
++{						/* (embed as first member of custom struct) */
++	atomic_t	zccd_count;		/* reference count */
++	void           (*zccd_destructor)(struct zccd *); /* callback when refcount reaches zero */
++} zccd_t;
++
++static inline void zccd_init (zccd_t *d, void (*callback)(zccd_t *))
++{
++	atomic_set (&d->zccd_count, 1);
++	d->zccd_destructor = callback;
++}
++
++static inline void zccd_get (zccd_t *d)		/* take a reference */
++{
++	atomic_inc (&d->zccd_count);
++}
++
++static inline void zccd_put (zccd_t *d)		/* release a reference */
++{
++	if (atomic_dec_and_test (&d->zccd_count))
++		(d->zccd_destructor)(d);
++}
++
+ /* This data is invariant across clones and lives at
+  * the end of the header data, ie. at skb->end.
+  */
+@@ -123,6 +147,12 @@ struct skb_shared_info {
+ 	atomic_t	dataref;
+ 	unsigned int	nr_frags;
+ 	struct sk_buff	*frag_list;
++	zccd_t          *zccd;			/* zero copy descriptor */
++	zccd_t		*zccd2;			/* 2nd zero copy descriptor */
++	/* NB we expect zero-copy data to be at least 1 packet, so
++	 * having 2 zccds means we don't unneccessarily split the packet
++	 * where consecutive zero-copy sends abutt.
++	 */
+ 	skb_frag_t	frags[MAX_SKB_FRAGS];
+ };
+ 
+--- kernel-2.4.20-6chaos_18_7/include/net/tcp.h~tcp_zero_copy_2.4.20_chaos	2003-06-24 11:31:17.000000000 -0600
++++ kernel-2.4.20-6chaos_18_7-braam/include/net/tcp.h	2003-07-12 15:38:07.000000000 -0600
+@@ -643,6 +643,8 @@ extern int		    	tcp_v4_tw_remember_stam
+ 
+ extern int			tcp_sendmsg(struct sock *sk, struct msghdr *msg, int size);
+ extern ssize_t			tcp_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags);
++extern ssize_t			tcp_sendpage_zccd(struct socket *sock, struct page *page, int offset, size_t size,
++						  int flags, zccd_t *zccd);
+ 
+ extern int			tcp_ioctl(struct sock *sk, 
+ 					  int cmd, 
+@@ -737,6 +739,9 @@ extern int			tcp_recvmsg(struct sock *sk
+ 					    struct msghdr *msg,
+ 					    int len, int nonblock, 
+ 					    int flags, int *addr_len);
++extern int			tcp_recvpackets(struct sock *sk,
++						struct sk_buff_head *packets,
++						int len, int nonblock);
+ 
+ extern int			tcp_listen_start(struct sock *sk);
+ 
+--- kernel-2.4.20-6chaos_18_7/net/netsyms.c~tcp_zero_copy_2.4.20_chaos	2003-05-15 21:15:18.000000000 -0600
++++ kernel-2.4.20-6chaos_18_7-braam/net/netsyms.c	2003-07-12 15:38:54.000000000 -0600
+@@ -397,6 +397,8 @@ EXPORT_SYMBOL(sysctl_tcp_wmem);
+ EXPORT_SYMBOL(sysctl_tcp_ecn);
+ EXPORT_SYMBOL(tcp_cwnd_application_limited);
+ EXPORT_SYMBOL(tcp_sendpage);
++EXPORT_SYMBOL(tcp_sendpage_zccd);
++EXPORT_SYMBOL(tcp_recvpackets);
+ EXPORT_SYMBOL(sysctl_tcp_low_latency);
+ 
+ EXPORT_SYMBOL(tcp_write_xmit);
+--- kernel-2.4.20-6chaos_18_7/net/core/skbuff.c~tcp_zero_copy_2.4.20_chaos	2003-05-15 21:15:21.000000000 -0600
++++ kernel-2.4.20-6chaos_18_7-braam/net/core/skbuff.c	2003-07-12 15:38:07.000000000 -0600
+@@ -208,6 +208,8 @@ struct sk_buff *alloc_skb(unsigned int s
+ 	atomic_set(&(skb_shinfo(skb)->dataref), 1);
+ 	skb_shinfo(skb)->nr_frags = 0;
+ 	skb_shinfo(skb)->frag_list = NULL;
++	skb_shinfo(skb)->zccd = NULL;		/* skbuffs kick off with NO user zero copy descriptors */
++	skb_shinfo(skb)->zccd2 = NULL;
+ 	return skb;
+ 
+ nodata:
+@@ -276,6 +278,10 @@ static void skb_release_data(struct sk_b
+ {
+ 	if (!skb->cloned ||
+ 	    atomic_dec_and_test(&(skb_shinfo(skb)->dataref))) {
++		if (skb_shinfo(skb)->zccd != NULL) /* zero copy callback descriptor? */
++			zccd_put (skb_shinfo(skb)->zccd); /* release hold */
++		if (skb_shinfo(skb)->zccd2 != NULL) /* 2nd zero copy callback descriptor? */
++			zccd_put (skb_shinfo(skb)->zccd2); /* release hold */
+ 		if (skb_shinfo(skb)->nr_frags) {
+ 			int i;
+ 			for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
+@@ -532,6 +538,8 @@ int skb_linearize(struct sk_buff *skb, i
+ 	atomic_set(&(skb_shinfo(skb)->dataref), 1);
+ 	skb_shinfo(skb)->nr_frags = 0;
+ 	skb_shinfo(skb)->frag_list = NULL;
++	skb_shinfo(skb)->zccd = NULL;		/* copied data => no user zero copy descriptor */
++	skb_shinfo(skb)->zccd2 = NULL;
+ 
+ 	/* We are no longer a clone, even if we were. */
+ 	skb->cloned = 0;
+@@ -578,6 +586,14 @@ struct sk_buff *pskb_copy(struct sk_buff
+ 	n->data_len = skb->data_len;
+ 	n->len = skb->len;
+ 
++	if (skb_shinfo(skb)->zccd != NULL)	/* user zero copy descriptor? */
++		zccd_get (skb_shinfo(skb)->zccd); /* 1 more ref (pages are shared) */
++	skb_shinfo(n)->zccd = skb_shinfo(skb)->zccd;
++
++	if (skb_shinfo(skb)->zccd2 != NULL)	/* 2nd user zero copy descriptor? */
++		zccd_get (skb_shinfo(skb)->zccd2); /* 1 more ref (pages are shared) */
++	skb_shinfo(n)->zccd2 = skb_shinfo(skb)->zccd2;
++
+ 	if (skb_shinfo(skb)->nr_frags) {
+ 		int i;
+ 
+@@ -620,6 +636,8 @@ int pskb_expand_head(struct sk_buff *skb
+ 	u8 *data;
+ 	int size = nhead + (skb->end - skb->head) + ntail;
+ 	long off;
++	zccd_t *zccd = skb_shinfo(skb)->zccd;	/* stash user zero copy descriptor */
++	zccd_t *zccd2 = skb_shinfo(skb)->zccd2;	/* stash 2nd user zero copy descriptor */
+ 
+ 	if (skb_shared(skb))
+ 		BUG();
+@@ -641,6 +659,11 @@ int pskb_expand_head(struct sk_buff *skb
+ 	if (skb_shinfo(skb)->frag_list)
+ 		skb_clone_fraglist(skb);
+ 
++	if (zccd != NULL)			/* user zero copy descriptor? */
++		zccd_get (zccd);		/* extra ref (pages are shared) */
++	if (zccd2 != NULL)			/* 2nd user zero copy descriptor? */
++		zccd_get (zccd2);		/* extra ref (pages are shared) */
++
+ 	skb_release_data(skb);
+ 
+ 	off = (data+nhead) - skb->head;
+@@ -655,6 +678,8 @@ int pskb_expand_head(struct sk_buff *skb
+ 	skb->nh.raw += off;
+ 	skb->cloned = 0;
+ 	atomic_set(&skb_shinfo(skb)->dataref, 1);
++	skb_shinfo(skb)->zccd = zccd;
++	skb_shinfo(skb)->zccd2 = zccd2;
+ 	return 0;
+ 
+ nodata:
+--- kernel-2.4.20-6chaos_18_7/net/ipv4/tcp.c~tcp_zero_copy_2.4.20_chaos	2003-05-15 21:15:21.000000000 -0600
++++ kernel-2.4.20-6chaos_18_7-braam/net/ipv4/tcp.c	2003-07-12 15:38:07.000000000 -0600
+@@ -747,7 +747,7 @@ do_interrupted:
+ 	goto out;
+ }
+ 
+-ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags);
++ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags, zccd_t *zccd);
+ 
+ static inline int
+ can_coalesce(struct sk_buff *skb, int i, struct page *page, int off)
+@@ -826,7 +826,8 @@ static int tcp_error(struct sock *sk, in
+ 	return err;
+ }
+ 
+-ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags)
++/* Extra parameter: user zero copy descriptor (or NULL if not doing that) */
++ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags, zccd_t *zccd)
+ {
+ 	struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp);
+ 	int mss_now;
+@@ -874,6 +875,17 @@ new_segment:
+ 			copy = size;
+ 
+ 		i = skb_shinfo(skb)->nr_frags;
++
++		if (zccd != NULL &&		/* this is a zcc I/O */
++		    skb_shinfo(skb)->zccd != NULL && /* skb is part of a zcc I/O */
++		    skb_shinfo(skb)->zccd2 != NULL &&
++		    skb_shinfo(skb)->zccd != zccd && /* not the same one */
++		    skb_shinfo(skb)->zccd2 != zccd)
++		{
++			tcp_mark_push (tp, skb);
++			goto new_segment;
++		}
++
+ 		if (can_coalesce(skb, i, page, offset)) {
+ 			skb_shinfo(skb)->frags[i-1].size += copy;
+ 		} else if (i < MAX_SKB_FRAGS) {
+@@ -884,6 +896,20 @@ new_segment:
+ 			goto new_segment;
+ 		}
+ 
++		if (zccd != NULL &&	/* this is a zcc I/O */
++		    skb_shinfo(skb)->zccd != zccd && /* not already referencing this zccd */
++		    skb_shinfo(skb)->zccd2 != zccd)
++		{
++			zccd_get (zccd);	/* bump ref count */
++
++			BUG_TRAP (skb_shinfo(skb)->zccd2 == NULL);
++
++			if (skb_shinfo(skb)->zccd == NULL) /* reference this zccd */
++				skb_shinfo(skb)->zccd = zccd;
++			else
++				skb_shinfo(skb)->zccd2 = zccd;
++		}
++
+ 		skb->len += copy;
+ 		skb->data_len += copy;
+ 		skb->ip_summed = CHECKSUM_HW;
+@@ -947,7 +973,31 @@ ssize_t tcp_sendpage(struct socket *sock
+ 
+ 	lock_sock(sk);
+ 	TCP_CHECK_TIMER(sk);
+-	res = do_tcp_sendpages(sk, &page, offset, size, flags);
++	res = do_tcp_sendpages(sk, &page, offset, size, flags, NULL);
++	TCP_CHECK_TIMER(sk);
++	release_sock(sk);
++	return res;
++}
++
++ssize_t tcp_sendpage_zccd(struct socket *sock, struct page *page, int offset, size_t size,
++			  int flags, zccd_t *zccd)
++{
++	ssize_t res;
++	struct sock *sk = sock->sk;
++
++#define TCP_ZC_CSUM_FLAGS (NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM)
++
++	if (!(sk->route_caps & NETIF_F_SG) || 	/* caller shouldn't waste her time */
++	    !(sk->route_caps & TCP_ZC_CSUM_FLAGS)) /* on double mapping */
++		BUG ();
++
++#undef TCP_ZC_CSUM_FLAGS
++
++	lock_sock(sk);
++	TCP_CHECK_TIMER(sk);
++
++	res = do_tcp_sendpages(sk, &page, offset, size, flags, zccd);
++
+ 	TCP_CHECK_TIMER(sk);
+ 	release_sock(sk);
+ 	return res;
+@@ -1771,6 +1821,202 @@ recv_urg:
+ 	goto out;
+ }
+ 
++int tcp_recvpackets (struct sock *sk, struct sk_buff_head *packets,
++		     int len, int nonblock)
++{
++	struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp);
++	int copied;
++	long timeo;
++
++	BUG_TRAP (len > 0);
++	/*BUG_TRAP ((flags & (MSG_OOB | MSG_PEEK | MSG_TRUNC)) == 0);*/
++
++	lock_sock(sk);
++
++	TCP_CHECK_TIMER(sk);
++
++	copied = -ENOTCONN;
++	if (sk->state == TCP_LISTEN)
++		goto out;
++
++	copied = 0;
++	timeo = sock_rcvtimeo(sk, nonblock);
++
++	do {
++		struct sk_buff * skb;
++		u32 offset;
++		unsigned long used;
++		int exhausted;
++		int eaten;
++
++		/* Are we at urgent data? Stop if we have read anything. */
++		if (copied && tp->urg_data && tp->urg_seq == tp->copied_seq)
++			break;
++
++		/* We need to check signals first, to get correct SIGURG
++		 * handling. FIXME: Need to check this doesnt impact 1003.1g
++		 * and move it down to the bottom of the loop
++		 */
++		if (signal_pending(current)) {
++			if (copied)
++				break;
++			copied = timeo ? sock_intr_errno(timeo) : -EAGAIN;
++			break;
++		}
++
++		/* Next get a buffer. */
++
++		skb = skb_peek(&sk->receive_queue);
++
++		if (skb == NULL)		/* nothing ready */
++		{
++			if (copied) {
++				if (sk->err ||
++				    sk->state == TCP_CLOSE ||
++				    (sk->shutdown & RCV_SHUTDOWN) ||
++				    !timeo ||
++				    (0))
++					break;
++			} else {
++				if (sk->done)
++					break;
++
++				if (sk->err) {
++					copied = sock_error(sk);
++					break;
++				}
++
++				if (sk->shutdown & RCV_SHUTDOWN)
++					break;
++
++				if (sk->state == TCP_CLOSE) {
++					if (!sk->done) {
++						/* This occurs when user tries to read
++						 * from never connected socket.
++						 */
++						copied = -ENOTCONN;
++						break;
++					}
++					break;
++				}
++
++				if (!timeo) {
++					copied = -EAGAIN;
++					break;
++				}
++			}
++
++			cleanup_rbuf(sk, copied);
++			timeo = tcp_data_wait(sk, timeo);
++			continue;
++		}
++
++		BUG_TRAP (atomic_read (&skb->users) == 1);
++
++		exhausted = eaten = 0;
++
++		offset = tp->copied_seq - TCP_SKB_CB(skb)->seq;
++		if (skb->h.th->syn)
++			offset--;
++
++		used = skb->len - offset;
++
++		if (tp->urg_data) {
++			u32 urg_offset = tp->urg_seq - tp->copied_seq;
++			if (urg_offset < used) {
++				if (!urg_offset) { /* at urgent date */
++					if (!sk->urginline) {
++						tp->copied_seq++; /* discard the single byte of urgent data */
++						offset++;
++						used--;
++					}
++				} else		/* truncate read */
++					used = urg_offset;
++			}
++		}
++
++		BUG_TRAP (used >= 0);
++		if (len < used)
++			used = len;
++
++		if (used == 0)
++			exhausted = 1;
++		else
++		{
++			if (skb_is_nonlinear (skb))
++			{
++				int   rc = skb_linearize (skb, GFP_KERNEL);
++
++				printk ("tcp_recvpackets(): linearising: %d\n", rc);
++
++				if (rc)
++				{
++					if (!copied)
++						copied = rc;
++					break;
++				}
++			}
++
++			if ((offset + used) == skb->len) /* consuming the whole packet */
++			{
++				__skb_unlink (skb, &sk->receive_queue);
++				dst_release (skb->dst);
++				skb_orphan (skb);
++				__skb_pull (skb, offset);
++				__skb_queue_tail (packets, skb);
++				exhausted = eaten = 1;
++			}
++			else			/* consuming only part of the packet */
++			{
++				struct sk_buff *skb2 = skb_clone (skb, GFP_KERNEL);
++
++				if (skb2 == NULL)
++				{
++					if (!copied)
++						copied = -ENOMEM;
++					break;
++				}
++
++				dst_release (skb2->dst);
++				__skb_pull (skb2, offset);
++				__skb_trim (skb2, used);
++				__skb_queue_tail (packets, skb2);
++			}
++
++			tp->copied_seq += used;
++			copied += used;
++			len -= used;
++		}
++
++		if (tp->urg_data && after(tp->copied_seq,tp->urg_seq)) {
++			tp->urg_data = 0;
++			tcp_fast_path_check(sk, tp);
++		}
++
++		if (!exhausted)
++			continue;
++
++		if (skb->h.th->fin)
++		{
++			tp->copied_seq++;
++			if (!eaten)
++				tcp_eat_skb (sk, skb);
++			break;
++		}
++
++		if (!eaten)
++			tcp_eat_skb (sk, skb);
++
++	} while (len > 0);
++
++ out:
++	/* Clean up data we have read: This will do ACK frames. */
++	cleanup_rbuf(sk, copied);
++	TCP_CHECK_TIMER(sk);
++	release_sock(sk);
++	return copied;
++}
++
+ /*
+  *	State processing on a close. This implements the state shift for
+  *	sending our FIN frame. Note that we only send a FIN for some
+
+_
diff --git a/lustre/kernel_patches/patches/tg3_netconsole.patch b/lustre/kernel_patches/patches/tg3_netconsole.patch
deleted file mode 100644
index 267deddff8..0000000000
--- a/lustre/kernel_patches/patches/tg3_netconsole.patch
+++ /dev/null
@@ -1,247 +0,0 @@
- 0 files changed
-
---- linux-2.4.20-rh/drivers/net/tg3.c~tg3_netconsole	2003-04-11 14:04:56.000000000 +0800
-+++ linux-2.4.20-rh-root/drivers/net/tg3.c	2003-07-01 11:27:46.000000000 +0800
-@@ -170,6 +170,10 @@ static void tg3_write_indirect_reg32(str
- 	}
- }
- 
-+#ifdef HAVE_POLL_CONTROLLER
-+static void     Poll_tg3(struct net_device *);
-+#endif
-+
- #define tw32(reg,val)		tg3_write_indirect_reg32(tp,(reg),(val))
- #define tw32_mailbox(reg, val)	writel(((val) & 0xffffffff), tp->regs + (reg))
- #define tw16(reg,val)		writew(((val) & 0xffff), tp->regs + (reg))
-@@ -1899,7 +1903,138 @@ static int tg3_vlan_rx(struct tg3 *tp, s
- 	return vlan_hwaccel_receive_skb(skb, tp->vlgrp, vlan_tag);
- }
- #endif
-+/* for netconsole */
-+static int upcall_rx_hook(struct net_device *dev)
-+{
-+ 	struct tg3 *tp = dev->priv;	
-+	u32 work_mask;
-+	u32 rx_rcb_ptr = tp->rx_rcb_ptr;
-+	u16 hw_idx, sw_idx;
-+	int received;
-+
-+	hw_idx = tp->hw_status->idx[0].rx_producer;
-+	sw_idx = rx_rcb_ptr % TG3_RX_RCB_RING_SIZE;
-+	work_mask = 0;
-+	received = 0;
-+	while (sw_idx != hw_idx) {
-+		struct tg3_rx_buffer_desc *desc = &tp->rx_rcb[sw_idx];
-+		unsigned int len;
-+		struct sk_buff *skb;
-+		dma_addr_t dma_addr;
-+		u32 opaque_key, desc_idx, *post_ptr;
-+
-+		desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK;
-+		opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK;
-+		if (opaque_key == RXD_OPAQUE_RING_STD) {
-+			dma_addr = pci_unmap_addr(&tp->rx_std_buffers[desc_idx],
-+						  mapping);
-+			skb = tp->rx_std_buffers[desc_idx].skb;
-+			post_ptr = &tp->rx_std_ptr;
-+		} else if (opaque_key == RXD_OPAQUE_RING_JUMBO) {
-+			dma_addr = pci_unmap_addr(&tp->rx_jumbo_buffers[desc_idx],
-+						  mapping);
-+			skb = tp->rx_jumbo_buffers[desc_idx].skb;
-+			post_ptr = &tp->rx_jumbo_ptr;
-+		}
-+		else {
-+			goto next_pkt_nopost;
-+		}
-+
-+		work_mask |= opaque_key;
-+
-+		if ((desc->err_vlan & RXD_ERR_MASK) != 0 &&
-+		    (desc->err_vlan != RXD_ERR_ODD_NIBBLE_RCVD_MII)) {
-+		drop_it:
-+			tg3_recycle_rx(tp, opaque_key,
-+				       desc_idx, *post_ptr);
-+		drop_it_no_recycle:
-+			/* Other statistics kept track of by card. */
-+			tp->net_stats.rx_dropped++;
-+			goto next_pkt;
-+		}
-+
-+		len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) - 4; /* omit crc */
-+
-+		if (len > RX_COPY_THRESHOLD) {
-+			int skb_size;
-+
-+			skb_size = tg3_alloc_rx_skb(tp, opaque_key,
-+						    desc_idx, *post_ptr);
-+			if (skb_size < 0)
-+				goto drop_it;
-+
-+			pci_unmap_single(tp->pdev, dma_addr,
-+					 skb_size - tp->rx_offset,
-+					 PCI_DMA_FROMDEVICE);
-+
-+			skb_put(skb, len);
-+		} else {
-+			struct sk_buff *copy_skb;
-+
-+			tg3_recycle_rx(tp, opaque_key,
-+				       desc_idx, *post_ptr);
-+
-+			copy_skb = dev_alloc_skb(len + 2);
-+			if (copy_skb == NULL)
-+				goto drop_it_no_recycle;
-+
-+			copy_skb->dev = tp->dev;
-+			skb_reserve(copy_skb, 2);
-+			skb_put(copy_skb, len);
-+			pci_dma_sync_single(tp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE);
-+			memcpy(copy_skb->data, skb->data, len);
-+
-+			/* We'll reuse the original ring buffer. */
-+			skb = copy_skb;
-+		}
-+		
-+		if ((tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) &&
-+		    (desc->type_flags & RXD_FLAG_TCPUDP_CSUM) &&
-+		    (((desc->ip_tcp_csum & RXD_TCPCSUM_MASK)
-+		      >> RXD_TCPCSUM_SHIFT) == 0xffff))
-+			skb->ip_summed = CHECKSUM_UNNECESSARY;
-+		else
-+			skb->ip_summed = CHECKSUM_NONE;
-+
-+		skb->protocol = eth_type_trans(skb, tp->dev);
-+/*into netconsole driver*/	
-+		dev->rx_hook(skb);
-+               	kfree_skb(skb);
-+		tp->dev->last_rx = jiffies;
-+		received++;
-+next_pkt:
-+		(*post_ptr)++;
-+next_pkt_nopost:
-+		rx_rcb_ptr++;
-+		sw_idx = rx_rcb_ptr % TG3_RX_RCB_RING_SIZE;
-+	}
-+
-+	/* ACK the status ring. */
-+	tp->rx_rcb_ptr = rx_rcb_ptr;
-+	tw32_mailbox(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW,
-+		     (rx_rcb_ptr % TG3_RX_RCB_RING_SIZE));
-+	if (tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER)
-+		tr32(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW);
- 
-+	/* Refill RX ring(s). */
-+	if (work_mask & RXD_OPAQUE_RING_STD) {
-+		sw_idx = tp->rx_std_ptr % TG3_RX_RING_SIZE;
-+		tw32_mailbox(MAILBOX_RCV_STD_PROD_IDX + TG3_64BIT_REG_LOW,
-+			     sw_idx);
-+		if (tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER)
-+			tr32(MAILBOX_RCV_STD_PROD_IDX + TG3_64BIT_REG_LOW);
-+	}
-+	if (work_mask & RXD_OPAQUE_RING_JUMBO) {
-+		sw_idx = tp->rx_jumbo_ptr % TG3_RX_JUMBO_RING_SIZE;
-+		tw32_mailbox(MAILBOX_RCV_JUMBO_PROD_IDX + TG3_64BIT_REG_LOW,
-+			     sw_idx);
-+		if (tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER)
-+			tr32(MAILBOX_RCV_JUMBO_PROD_IDX + TG3_64BIT_REG_LOW);
-+	}
-+
-+	return received;
-+
-+}
- /* The RX ring scheme is composed of multiple rings which post fresh
-  * buffers to the chip, and one special ring the chip uses to report
-  * status back to the host.
-@@ -2006,7 +2141,7 @@ static int tg3_rx(struct tg3 *tp, int bu
- 			/* We'll reuse the original ring buffer. */
- 			skb = copy_skb;
- 		}
--
-+		
- 		if ((tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) &&
- 		    (desc->type_flags & RXD_FLAG_TCPUDP_CSUM) &&
- 		    (((desc->ip_tcp_csum & RXD_TCPCSUM_MASK)
-@@ -2016,6 +2151,8 @@ static int tg3_rx(struct tg3 *tp, int bu
- 			skb->ip_summed = CHECKSUM_NONE;
- 
- 		skb->protocol = eth_type_trans(skb, tp->dev);
-+
-+					
- #if TG3_VLAN_TAG_USED
- 		if (tp->vlgrp != NULL &&
- 		    desc->type_flags & RXD_FLAG_VLAN) {
-@@ -2058,7 +2195,6 @@ next_pkt_nopost:
- 		if (tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER)
- 			tr32(MAILBOX_RCV_JUMBO_PROD_IDX + TG3_64BIT_REG_LOW);
- 	}
--
- 	return received;
- }
- 
-@@ -2151,7 +2287,6 @@ static void tg3_interrupt(int irq, void 
- 	unsigned long flags;
- 
- 	spin_lock_irqsave(&tp->lock, flags);
--
- 	if (sblk->status & SD_STATUS_UPDATED) {
- 		/*
- 		 * writing any value to intr-mbox-0 clears PCI INTA# and
-@@ -2169,8 +2304,17 @@ static void tg3_interrupt(int irq, void 
- 		tr32(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW);
- 		sblk->status &= ~SD_STATUS_UPDATED;
- 
--		if (likely(tg3_has_work(dev, tp)))
--			netif_rx_schedule(dev);		/* schedule NAPI poll */
-+		if (likely(tg3_has_work(dev, tp))){
-+	 		if (unlikely(dev->rx_hook != NULL) && netdump_mode) {
-+                		int ret;
-+				struct sk_buff *skb;
-+				ret = upcall_rx_hook(dev);
-+				if (!ret){
-+					goto out;
-+				}
-+			}
-+			 netif_rx_schedule(dev);		/* schedule NAPI poll */
-+		}
- 		else {
- 			/* no work, shared interrupt perhaps?  re-enable
- 			 * interrupts, and flush that PCI write
-@@ -2180,7 +2324,7 @@ static void tg3_interrupt(int irq, void 
- 			tr32(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW);
- 		}
- 	}
--
-+out:
- 	spin_unlock_irqrestore(&tp->lock, flags);
- }
- 
-@@ -6804,7 +6948,10 @@ static int __devinit tg3_init_one(struct
- 	dev->watchdog_timeo = TG3_TX_TIMEOUT;
- 	dev->change_mtu = tg3_change_mtu;
- 	dev->irq = pdev->irq;
--
-+#ifdef HAVE_POLL_CONTROLLER
-+	dev->poll_controller = &Poll_tg3;
-+#endif
-+		
- 	err = tg3_get_invariants(tp);
- 	if (err) {
- 		printk(KERN_ERR PFX "Problem fetching invariants of chip, "
-@@ -6882,6 +7029,15 @@ err_out_disable_pdev:
- 	return err;
- }
- 
-+#ifdef HAVE_POLL_CONTROLLER
-+static void Poll_tg3(struct net_device *dev)
-+{
-+	if (!netdump_mode) disable_irq(dev->irq);
-+	tg3_interrupt(dev->irq, dev, NULL);
-+	if (!netdump_mode) enable_irq(dev->irq);
-+}
-+#endif
-+
- static void __devexit tg3_remove_one(struct pci_dev *pdev)
- {
- 	struct net_device *dev = pci_get_drvdata(pdev);
-
-_
diff --git a/lustre/kernel_patches/patches/uml-patch-2.4.20-4.patch b/lustre/kernel_patches/patches/uml-patch-2.4.20-6.patch
similarity index 93%
rename from lustre/kernel_patches/patches/uml-patch-2.4.20-4.patch
rename to lustre/kernel_patches/patches/uml-patch-2.4.20-6.patch
index b35fee0956..6bb0d68718 100644
--- a/lustre/kernel_patches/patches/uml-patch-2.4.20-4.patch
+++ b/lustre/kernel_patches/patches/uml-patch-2.4.20-6.patch
@@ -1,561 +1,6 @@
-diff -Naur -X ../exclude-files orig/CREDITS um/CREDITS
---- orig/CREDITS	Thu Feb 27 13:04:11 2003
-+++ um/CREDITS	Thu Feb 27 13:05:17 2003
-@@ -432,6 +432,7 @@
- E: lars@nocrew.org
- W: http://lars.nocrew.org/
- D: dsp56k device driver
-+D: ptrace proxy in user mode kernel port
- S: Kopmansg 2
- S: 411 13  Goteborg
- S: Sweden
-@@ -721,7 +722,7 @@
- E: jdike@karaya.com
- W: http://user-mode-linux.sourceforge.net
- D: User mode kernel port
--S: RR1 Box 67C
-+S: 375 Tubbs Hill Rd
- S: Deering NH 03244
- S: USA
- 
-diff -Naur -X ../exclude-files orig/Documentation/Configure.help um/Documentation/Configure.help
---- orig/Documentation/Configure.help	Thu Feb 27 13:04:11 2003
-+++ um/Documentation/Configure.help	Thu Feb 27 13:05:17 2003
-@@ -14690,19 +14690,23 @@
-   The module will be called dsbr100.o. If you want to compile it as a
-   module, say M here and read <file:Documentation/modules.txt>.
- 
--Always do synchronous disk IO for UBD
--CONFIG_BLK_DEV_UBD_SYNC
-+CONFIG_BLK_DEV_UBD
-   The User-Mode Linux port includes a driver called UBD which will let
-   you access arbitrary files on the host computer as block devices.
--  Writes to such a block device are not immediately written to the
--  host's disk; this may cause problems if, for example, the User-Mode
--  Linux 'Virtual Machine' uses a journalling file system and the host
--  computer crashes.
-+  Unless you know that you do not need such virtual block devices say
-+  Y here.
-+
-+Always do synchronous disk IO for UBD
-+CONFIG_BLK_DEV_UBD_SYNC
-+  Writes to the virtual block device are not immediately written to the host's
-+  disk; this may cause problems if, for example, the User-Mode Linux
-+  'Virtual Machine' uses a journalling filesystem and the host computer
-+  crashes.
- 
-   Synchronous operation (i.e. always writing data to the host's disk
-   immediately) is configurable on a per-UBD basis by using a special
-   kernel command line option.  Alternatively, you can say Y here to
--  turn on synchronous operation by default for all block.
-+  turn on synchronous operation by default for all block devices.
- 
-   If you're running a journalling file system (like reiserfs, for
-   example) in your virtual machine, you will want to say Y here.  If
-@@ -14714,6 +14718,7 @@
- CONFIG_PT_PROXY
-   This option enables a debugging interface which allows gdb to debug
-   the kernel without needing to actually attach to kernel threads.
-+  CONFIG_XTERM_CHAN must be enabled in order to enable CONFIG_PT_PROXY.
-   If you want to do kernel debugging, say Y here; otherwise say N.
- 
- Management console
-@@ -14908,25 +14913,173 @@
- 
- SLIP transport
- CONFIG_UML_NET_SLIP
--  The Slip User-Mode Linux network transport allows a running UML to
-+  The slip User-Mode Linux network transport allows a running UML to
-   network with its host over a point-to-point link.  Unlike Ethertap,
-   which can carry any Ethernet frame (and hence even non-IP packets),
--  the Slip transport can only carry IP packets.
-+  the slip transport can only carry IP packets.
- 
--  To use this, your host must support Slip devices.
-+  To use this, your host must support slip devices.
- 
-   For more information, see
-   <http://user-mode-linux.sourceforge.net/networking.html>.  That site
--  has examples of the UML command line to use to enable Slip
-+  has examples of the UML command line to use to enable slip
-   networking, and details of a few quirks with it.
- 
--  The Ethertap Transport is preferred over Slip because of its
--  limitation.  If you prefer Slip, however, say Y here.  Otherwise
-+  The Ethertap Transport is preferred over slip because of its
-+  limitations.  If you prefer slip, however, say Y here.  Otherwise
-   choose the Multicast transport (to network multiple UMLs on 
-   multiple hosts), Ethertap (to network with the host and the
-   outside world), and/or the Daemon transport (to network multiple
-   UMLs on a single host).  You may choose more than one without
-   conflict.  If you don't need UML networking, say N.
-+
-+SLiRP transport
-+CONFIG_UML_NET_SLIRP
-+  The SLiRP User-Mode Linux network transport allows a running UML
-+  to network by invoking a program that can handle SLIP encapsulated
-+  packets.  This is commonly (but not limited to) the application
-+  known as SLiRP, a program that can re-socket IP packets back onto
-+  the host on which it is run.  Only IP packets are supported,
-+  unlike other network transports that can handle all Ethernet
-+  frames.  In general, slirp allows the UML the same IP connectivity
-+  to the outside world that the host user is permitted, and unlike
-+  other transports, SLiRP works without the need of root level
-+  privleges, setuid binaries, or SLIP devices on the host.  This
-+  also means not every type of connection is possible, but most
-+  situations can be accomodated with carefully crafted slirp
-+  commands that can be passed along as part of the network device's
-+  setup string.  The effect of this transport on the UML is similar
-+  that of a host behind a firewall that masquerades all network
-+  connections passing through it (but is less secure).
-+
-+  To use this you should first have slirp compiled somewhere
-+  accessible on the host, and have read its documentation.  If you
-+  don't need UML networking, say N.
-+
-+  Startup example: "eth0=slirp,FE:FD:01:02:03:04,/usr/local/bin/slirp"
-+
-+Default main console channel initialization
-+CONFIG_CON_ZERO_CHAN
-+  This is the string describing the channel to which the main console
-+  will be attached by default.  This value can be overridden from the
-+  command line.  The default value is "fd:0,fd:1", which attaches the
-+  main console to stdin and stdout.
-+  It is safe to leave this unchanged.
-+
-+Default console channel initialization
-+CONFIG_CON_CHAN
-+  This is the string describing the channel to which all consoles
-+  except the main console will be attached by default.  This value can
-+  be overridden from the command line.  The default value is "xterm",
-+  which brings them up in xterms.
-+  It is safe to leave this unchanged, although you may wish to change
-+  this if you expect the UML that you build to be run in environments
-+  which don't have X or xterm available.
-+
-+Default serial line channel initialization
-+CONFIG_SSL_CHAN
-+  This is the string describing the channel to which the serial lines
-+  will be attached by default.  This value can be overridden from the
-+  command line.  The default value is "pty", which attaches them to
-+  traditional pseudo-terminals.
-+  It is safe to leave this unchanged, although you may wish to change
-+  this if you expect the UML that you build to be run in environments
-+  which don't have a set of /dev/pty* devices.
-+
-+Nesting level
-+CONFIG_NEST_LEVEL
-+  This is set to the number of layers of UMLs that this UML will be run
-+  in.  Normally, this is zero, meaning that it will run directly on the
-+  host.  Setting it to one will build a UML that can run inside a UML
-+  that is running on the host.  Generally, if you intend this UML to run
-+  inside another UML, set CONFIG_NEST_LEVEL to one more than the host UML.
-+  Note that if the hosting UML has its CONFIG_KERNEL_HALF_GIGS set to 
-+  greater than one, then the guest UML should have its CONFIG_NEST_LEVEL 
-+  set to the host's CONFIG_NEST_LEVEL + CONFIG_KERNEL_HALF_GIGS.
-+  Only change this if you are running nested UMLs.
-+
-+Kernel address space size (in .5G units)
-+CONFIG_KERNEL_HALF_GIGS
-+  This determines the amount of address space that UML will allocate for
-+  its own, measured in half Gigabyte units.  The default is 1.
-+  Change this only if you need to boot UML with an unusually large amount
-+  of physical memory.
-+
-+UML sound support
-+CONFIG_UML_SOUND
-+  This option enables UML sound support.  If enabled, it will pull in
-+  soundcore and the UML hostaudio relay, which acts as a intermediary
-+  between the host's dsp and mixer devices and the UML sound system.
-+  It is safe to say 'Y' here.
-+
-+UML SMP support
-+CONFIG_UML_SMP
-+  This option enables UML SMP support.  UML implements virtual SMP by
-+  allowing as many processes to run simultaneously on the host as
-+  there are virtual processors configured.  Obviously, if the host is
-+  a uniprocessor, those processes will timeshare, but, inside UML,
-+  will appear to be running simultaneously.  If the host is a
-+  multiprocessor, then UML processes may run simultaneously, depending
-+  on the host scheduler.
-+  CONFIG_SMP will be set to whatever this option is set to.
-+  It is safe to leave this unchanged.
-+
-+file descriptor channel support
-+CONFIG_FD_CHAN
-+  This option enables support for attaching UML consoles and serial
-+  lines to already set up file descriptors.  Generally, the main
-+  console is attached to file descriptors 0 and 1 (stdin and stdout),
-+  so it would be wise to leave this enabled unless you intend to
-+  attach it to some other host device.
-+
-+null device channel support
-+CONFIG_NULL_CHAN
-+  This option enables support for attaching UML consoles and serial
-+  lines to a device similar to /dev/null.  Data written to it disappears
-+  and there is never any data to be read.
-+
-+port channel support
-+CONFIG_PORT_CHAN
-+  This option enables support for attaching UML consoles and serial
-+  lines to host portals.  They may be accessed with 'telnet <host>
-+  <port number>'.  Any number of consoles and serial lines may be
-+  attached to a single portal, although what UML device you get when
-+  you telnet to that portal will be unpredictable.
-+  It is safe to say 'Y' here.
-+
-+pty channel support
-+CONFIG_PTY_CHAN
-+  This option enables support for attaching UML consoles and serial
-+  lines to host pseudo-terminals.  Access to both traditional
-+  pseudo-terminals (/dev/pty*) and pts pseudo-terminals are controlled
-+  with this option.  The assignment of UML devices to host devices
-+  will be announced in the kernel message log.
-+  It is safe to say 'Y' here.
-+
-+tty channel support
-+CONFIG_TTY_CHAN
-+  This option enables support for attaching UML consoles and serial
-+  lines to host terminals.  Access to both virtual consoles
-+  (/dev/tty*) and the slave side of pseudo-terminals (/dev/ttyp* and
-+  /dev/pts/*) are controlled by this option.
-+  It is safe to say 'Y' here.
-+
-+xterm channel support
-+CONFIG_XTERM_CHAN
-+  This option enables support for attaching UML consoles and serial
-+  lines to xterms.  Each UML device so assigned will be brought up in
-+  its own xterm.
-+  If you disable this option, then CONFIG_PT_PROXY will be disabled as
-+  well, since UML's gdb currently requires an xterm.
-+  It is safe to say 'Y' here.
-+
-+tty logging
-+CONFIG_TTY_LOG
-+  This option enables logging of all data going through pseudo-terminals
-+  to the host.  This is primarily useful for honeypots, where you want
-+  secure keystroke logging that can't be detected or disabled by root.
-+  Say 'N' unless you are setting up a UML honeypot or otherwise know that
-+  you want this option.
- 
- Microtek USB scanner support
- CONFIG_USB_MICROTEK
-diff -Naur -X ../exclude-files orig/MAINTAINERS um/MAINTAINERS
---- orig/MAINTAINERS	Thu Feb 27 13:04:12 2003
-+++ um/MAINTAINERS	Thu Feb 27 13:05:17 2003
-@@ -1841,6 +1841,14 @@
- L:	linux-usb-devel@lists.sourceforge.net
- W:	http://usb.in.tum.de
- S:	Maintained
-+
-+USER-MODE PORT
-+P:	Jeff Dike
-+M:	jdike@karaya.com
-+L:	user-mode-linux-devel@lists.sourceforge.net
-+L:	user-mode-linux-user@lists.sourceforge.net
-+W:	http://user-mode-linux.sourceforge.net
-+S:	Maintained
- 	
- USB "USBNET" DRIVER
- P:	David Brownell
-diff -Naur -X ../exclude-files orig/Makefile um/Makefile
---- orig/Makefile	Thu Feb 27 13:04:12 2003
-+++ um/Makefile	Thu Feb 27 13:05:17 2003
-@@ -5,7 +5,15 @@
- 
- KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
- 
--ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
-+# SUBARCH tells the usermode build what the underlying arch is.  That is set
-+# first, and if a usermode build is happening, the "ARCH=um" on the command
-+# line overrides the setting of ARCH below.  If a native build is happening,
-+# 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/)
-+ARCH := $(SUBARCH)
-+
- KERNELPATH=kernel-$(shell echo $(KERNELRELEASE) | sed -e "s/-//g")
- 
- CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
-diff -Naur -X ../exclude-files orig/arch/um/Makefile um/arch/um/Makefile
---- orig/arch/um/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/Makefile	Fri Mar 28 21:46:54 2003
-@@ -0,0 +1,168 @@
-+# 
-+# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+# Licensed under the GPL
-+#
-+
-+OS := $(shell uname -s)
-+
-+ARCH_DIR = arch/um
-+
-+core-y := kernel sys-$(SUBARCH) os-$(OS)
-+drivers-y := fs drivers
-+subdir-y := $(core-y) $(drivers-y)
-+SUBDIRS += $(foreach dir,$(subdir-y),$(ARCH_DIR)/$(dir))
-+
-+CORE_FILES += $(foreach dir,$(core-y),$(ARCH_DIR)/$(dir)/built-in.o)
-+DRIVERS += $(foreach dir,$(drivers-y),$(ARCH_DIR)/$(dir)/built-in.o)
-+
-+include $(ARCH_DIR)/Makefile-$(SUBARCH)
-+include $(ARCH_DIR)/Makefile-os-$(OS)
-+
-+MAKEFILE-$(CONFIG_MODE_TT) += Makefile-tt
-+MAKEFILE-$(CONFIG_MODE_SKAS) += Makefile-skas
-+
-+ifneq ($(MAKEFILE-y),)
-+  include $(addprefix $(ARCH_DIR)/,$(MAKEFILE-y))
-+endif
-+
-+EXTRAVERSION := $(EXTRAVERSION)-4um
-+
-+include/linux/version.h: arch/$(ARCH)/Makefile
-+
-+# Recalculate MODLIB to reflect the EXTRAVERSION changes (via KERNELRELEASE)
-+# The way the toplevel Makefile is written EXTRAVERSION is not supposed
-+# to be changed outside the toplevel Makefile, but recalculating MODLIB is
-+# a sufficient workaround until we no longer need architecture dependent
-+# EXTRAVERSION...
-+MODLIB := $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
-+
-+ifeq ($(CONFIG_DEBUGSYM),y)
-+CFLAGS := $(subst -fomit-frame-pointer,,$(CFLAGS))
-+endif
-+
-+CFLAGS-$(CONFIG_DEBUGSYM) += -g
-+
-+ARCH_INCLUDE = -I$(TOPDIR)/$(ARCH_DIR)/include
-+
-+# -Derrno=kernel_errno - This turns all kernel references to errno into
-+# kernel_errno to separate them from the libc errno.  This allows -fno-common
-+# in CFLAGS.  Otherwise, it would cause ld to complain about the two different
-+# errnos.
-+
-+CFLAGS += $(ARCH_CFLAGS) $(CFLAGS-y) -D__arch_um__ -DSUBARCH=\"$(SUBARCH)\" \
-+	-D_LARGEFILE64_SOURCE $(ARCH_INCLUDE) -Derrno=kernel_errno \
-+	$(MODE_INCLUDE)
-+
-+LINKFLAGS += -r
-+
-+LINK_WRAPS = -Wl,--wrap,malloc -Wl,--wrap,free -Wl,--wrap,calloc
-+
-+SIZE = (($(CONFIG_NEST_LEVEL) + $(CONFIG_KERNEL_HALF_GIGS)) * 0x20000000)
-+
-+# These aren't in Makefile-tt because they are needed in the !CONFIG_MODE_TT +
-+# CONFIG_MODE_SKAS + CONFIG_STATIC_LINK case.
-+
-+LINK_TT = -static
-+LD_SCRIPT_TT := link.ld
-+
-+ifeq ($(CONFIG_STATIC_LINK),y)
-+  LINK-y += $(LINK_TT)
-+  LD_SCRIPT-y := $(LD_SCRIPT_TT)
-+else
-+ifeq ($(CONFIG_MODE_TT),y)
-+  LINK-y += $(LINK_TT)
-+  LD_SCRIPT-y := $(LD_SCRIPT_TT)
-+else
-+ifeq ($(CONFIG_MODE_SKAS),y)
-+  LINK-y += $(LINK_SKAS)
-+  LD_SCRIPT-y := $(LD_SCRIPT_SKAS)
-+endif
-+endif
-+endif
-+
-+LD_SCRIPT-y := $(ARCH_DIR)/$(LD_SCRIPT-y)
-+M4_MODE_TT := $(shell [ "$(CONFIG_MODE_TT)" = "y" ] && echo -DMODE_TT)
-+
-+$(LD_SCRIPT-y): $(LD_SCRIPT-y).in
-+	pages=$$(( 1 << $(CONFIG_KERNEL_STACK_ORDER) )) ; \
-+	m4 -DSTART=$$(($(TOP_ADDR) - $(SIZE))) -DELF_ARCH=$(ELF_ARCH) \
-+		-DELF_FORMAT=$(ELF_FORMAT) $(M4_MODE_TT) \
-+		-DKERNEL_STACK_SIZE=$$(( 4096 * $$pages )) $< > $@
-+
-+SYMLINK_HEADERS = include/asm-um/archparam.h include/asm-um/system.h \
-+	include/asm-um/sigcontext.h include/asm-um/processor.h \
-+	include/asm-um/ptrace.h include/asm-um/arch-signal.h
-+
-+ARCH_SYMLINKS = include/asm-um/arch arch/um/include/sysdep arch/um/os \
-+	$(SYMLINK_HEADERS) $(ARCH_DIR)/include/uml-config.h
-+
-+ifeq ($(CONFIG_MODE_SKAS), y)
-+$(SYS_HEADERS) : $(ARCH_DIR)/kernel/skas/include/skas_ptregs.h
-+endif
-+
-+GEN_HEADERS += $(ARCH_DIR)/include/task.h $(ARCH_DIR)/include/kern_constants.h 
-+
-+setup: $(ARCH_SYMLINKS) $(SYS_HEADERS) $(GEN_HEADERS) 
-+
-+linux: setup $(ARCH_DIR)/main.o vmlinux $(LD_SCRIPT-y)
-+	mv vmlinux vmlinux.o
-+	$(CC) -Wl,-T,$(LD_SCRIPT-y) $(LINK-y) $(LINK_WRAPS) \
-+		-o linux $(ARCH_DIR)/main.o vmlinux.o -L/usr/lib -lutil
-+
-+USER_CFLAGS := $(patsubst -I%,,$(CFLAGS))
-+USER_CFLAGS := $(patsubst -Derrno=kernel_errno,,$(USER_CFLAGS))
-+USER_CFLAGS := $(patsubst -D__KERNEL__,,$(USER_CFLAGS)) $(ARCH_INCLUDE) \
-+	$(MODE_INCLUDE)
-+
-+# To get a definition of F_SETSIG
-+USER_CFLAGS += -D_GNU_SOURCE
-+
-+CLEAN_FILES += linux x.i gmon.out $(ARCH_DIR)/link.ld $(ARCH_DIR)/dyn_link.ld \
-+	$(GEN_HEADERS) $(ARCH_DIR)/include/uml-config.h
-+
-+$(ARCH_DIR)/main.o: $(ARCH_DIR)/main.c
-+	$(CC) $(USER_CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $<
-+
-+archmrproper:
-+	rm -f $(SYMLINK_HEADERS) $(ARCH_SYMLINKS) include/asm \
-+		$(LD_SCRIPT) $(addprefix $(ARCH_DIR)/kernel/,$(KERN_SYMLINKS))
-+
-+archclean: sysclean
-+	find . \( -name '*.bb' -o -name '*.bbg' -o -name '*.da' \
-+		-o -name '*.gcov' \) -type f -print | xargs rm -f
-+	cd $(ARCH_DIR) ; \
-+	for dir in $(subdir-y) util ; do $(MAKE) -C $$dir clean; done
-+
-+archdep: 
-+
-+$(SYMLINK_HEADERS):
-+	cd $(TOPDIR)/$(dir $@) ; \
-+	ln -sf $(basename $(notdir $@))-$(SUBARCH)$(suffix $@) $(notdir $@)
-+
-+include/asm-um/arch:
-+	cd $(TOPDIR)/include/asm-um && ln -sf ../asm-$(SUBARCH) arch
-+
-+arch/um/include/sysdep:
-+	cd $(TOPDIR)/arch/um/include && ln -sf sysdep-$(SUBARCH) sysdep
-+
-+arch/um/os:
-+	cd $(ARCH_DIR) && ln -sf os-$(OS) os
-+
-+$(ARCH_DIR)/include/task.h : $(ARCH_DIR)/util/mk_task
-+	$< > $@
-+
-+$(ARCH_DIR)/include/kern_constants.h : $(ARCH_DIR)/util/mk_constants
-+	$< > $@
-+
-+$(ARCH_DIR)/include/uml-config.h : $(TOPDIR)/include/linux/autoconf.h
-+	sed 's/ CONFIG/ UML_CONFIG/' $(TOPDIR)/include/linux/autoconf.h > $@
-+
-+$(ARCH_DIR)/util/mk_task : $(ARCH_DIR)/util/mk_task_user.c \
-+	$(ARCH_DIR)/util/mk_task_kern.c $(SYS_HEADERS)
-+	$(MAKE) $(MFLAGS) -C $(ARCH_DIR)/util mk_task
-+
-+$(ARCH_DIR)/util/mk_constants : $(ARCH_DIR)/util/mk_constants_user.c \
-+	$(ARCH_DIR)/util/mk_constants_kern.c 
-+	$(MAKE) $(MFLAGS) -C $(ARCH_DIR)/util mk_constants
-+
-+export SUBARCH USER_CFLAGS OS
-diff -Naur -X ../exclude-files orig/arch/um/Makefile-i386 um/arch/um/Makefile-i386
---- orig/arch/um/Makefile-i386	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/Makefile-i386	Wed Oct 23 21:08:04 2002
-@@ -0,0 +1,35 @@
-+ifeq ($(CONFIG_HOST_2G_2G), y)
-+TOP_ADDR = 0x80000000
-+else
-+TOP_ADDR = 0xc0000000
-+endif
-+
-+ARCH_CFLAGS = -U__$(SUBARCH)__ -U$(SUBARCH) -DUM_FASTCALL
-+ELF_ARCH = $(SUBARCH)
-+ELF_FORMAT = elf32-$(SUBARCH)
-+
-+I386_H = $(ARCH_DIR)/include/sysdep-i386
-+SYS = $(ARCH_DIR)/sys-i386
-+UTIL = $(SYS)/util
-+SUBDIRS += $(UTIL)
-+
-+SYS_HEADERS = $(I386_H)/sc.h $(I386_H)/thread.h
-+
-+$(I386_H)/sc.h : $(UTIL)/mk_sc
-+	$(UTIL)/mk_sc > $@
-+
-+$(I386_H)/thread.h : $(UTIL)/mk_thread
-+	$(UTIL)/mk_thread > $@
-+
-+$(UTIL)/mk_sc : $(UTIL)/mk_sc.c
-+	$(MAKE) -C $(UTIL) mk_sc
-+
-+$(UTIL)/mk_thread : $(UTIL)/mk_thread_user.c $(UTIL)/mk_thread_kern.c \
-+	$(I386_H)/sc.h
-+	$(MAKE) -C $(UTIL) mk_thread
-+
-+sysclean :
-+	rm -f $(SYS_HEADERS)
-+	$(MAKE) -C $(UTIL) clean
-+	$(MAKE) -C $(SYS) clean
-+
-diff -Naur -X ../exclude-files orig/arch/um/Makefile-ia64 um/arch/um/Makefile-ia64
---- orig/arch/um/Makefile-ia64	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/Makefile-ia64	Wed Oct 23 21:08:04 2002
-@@ -0,0 +1 @@
-+START_ADDR = 0x1000000000000000
-diff -Naur -X ../exclude-files orig/arch/um/Makefile-os-Linux um/arch/um/Makefile-os-Linux
---- orig/arch/um/Makefile-os-Linux	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/Makefile-os-Linux	Mon Dec  9 14:21:51 2002
-@@ -0,0 +1,7 @@
-+# 
-+# Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
-+# Licensed under the GPL
-+#
-+
-+SUBDIRS += $(ARCH_DIR)/os-$(OS)/drivers
-+DRIVERS += $(ARCH_DIR)/os-$(OS)/drivers/drivers.o
-diff -Naur -X ../exclude-files orig/arch/um/Makefile-ppc um/arch/um/Makefile-ppc
---- orig/arch/um/Makefile-ppc	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/Makefile-ppc	Wed Oct 23 21:08:04 2002
-@@ -0,0 +1,9 @@
-+ifeq ($(CONFIG_HOST_2G_2G), y)
-+START_ADDR = 0x80000000
-+else
-+START_ADDR = 0xc0000000
-+endif
-+ARCH_CFLAGS = -U__powerpc__ -D__UM_PPC__
-+
-+# The arch is ppc, but the elf32 name is powerpc
-+ELF_SUBARCH = powerpc
-diff -Naur -X ../exclude-files orig/arch/um/Makefile-skas um/arch/um/Makefile-skas
---- orig/arch/um/Makefile-skas	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/Makefile-skas	Sun Dec 15 22:02:57 2002
-@@ -0,0 +1,20 @@
-+# 
-+# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+# Licensed under the GPL
-+#
-+
-+PROFILE += -pg
-+
-+CFLAGS-$(CONFIG_GCOV) += -fprofile-arcs -ftest-coverage
-+CFLAGS-$(CONFIG_GPROF) += $(PROFILE)
-+LINK-$(CONFIG_GPROF) += $(PROFILE)
-+
-+MODE_INCLUDE += -I$(TOPDIR)/$(ARCH_DIR)/kernel/skas/include
-+
-+LINK_SKAS = -Wl,-rpath,/lib 
-+LD_SCRIPT_SKAS = dyn_link.ld
-+
-+GEN_HEADERS += $(ARCH_DIR)/kernel/skas/include/skas_ptregs.h
-+
-+$(ARCH_DIR)/kernel/skas/include/skas_ptregs.h :
-+	$(MAKE) -C $(ARCH_DIR)/kernel/skas include/skas_ptregs.h
-diff -Naur -X ../exclude-files orig/arch/um/Makefile-tt um/arch/um/Makefile-tt
---- orig/arch/um/Makefile-tt	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/Makefile-tt	Mon Dec 16 20:22:23 2002
-@@ -0,0 +1,7 @@
-+# 
-+# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+# Licensed under the GPL
-+#
-+
-+MODE_INCLUDE += -I$(TOPDIR)/$(ARCH_DIR)/kernel/tt/include
-+
 diff -Naur -X ../exclude-files orig/arch/um/common.ld.in um/arch/um/common.ld.in
---- orig/arch/um/common.ld.in	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/common.ld.in	Tue Feb  4 19:35:13 2003
+--- orig/arch/um/common.ld.in	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/common.ld.in	2003-02-04 19:35:13.000000000 -0500
 @@ -0,0 +1,53 @@
 +  .kstrtab : { *(.kstrtab) }
 +
@@ -610,9 +55,70 @@ diff -Naur -X ../exclude-files orig/arch/um/common.ld.in um/arch/um/common.ld.in
 +  __fini_array_end = .;
 +
 +  .data.init : { *(.data.init) }
+diff -Naur -X ../exclude-files orig/arch/um/config_block.in um/arch/um/config_block.in
+--- orig/arch/um/config_block.in	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/config_block.in	2002-10-23 21:08:04.000000000 -0400
+@@ -0,0 +1,16 @@
++mainmenu_option next_comment
++comment 'Block Devices'
++
++bool 'Virtual block device' CONFIG_BLK_DEV_UBD
++dep_bool '  Always do synchronous disk IO for UBD' CONFIG_BLK_DEV_UBD_SYNC $CONFIG_BLK_DEV_UBD
++tristate 'Loopback device support' CONFIG_BLK_DEV_LOOP
++dep_tristate 'Network block device support' CONFIG_BLK_DEV_NBD $CONFIG_NET
++tristate 'RAM disk support' CONFIG_BLK_DEV_RAM
++if [ "$CONFIG_BLK_DEV_RAM" = "y" -o "$CONFIG_BLK_DEV_RAM" = "m" ]; then
++	int '   Default RAM disk size' CONFIG_BLK_DEV_RAM_SIZE 4096
++fi
++dep_bool '  Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD $CONFIG_BLK_DEV_RAM
++
++tristate 'Example IO memory driver' CONFIG_MMAPPER
++
++endmenu
+diff -Naur -X ../exclude-files orig/arch/um/config_char.in um/arch/um/config_char.in
+--- orig/arch/um/config_char.in	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/config_char.in	2002-10-23 21:08:04.000000000 -0400
+@@ -0,0 +1,37 @@
++mainmenu_option next_comment
++comment 'Character Devices'
++
++define_bool CONFIG_STDIO_CONSOLE y
++
++bool 'Virtual serial line' CONFIG_SSL
++
++bool 'file descriptor channel support' CONFIG_FD_CHAN
++bool 'null channel support' CONFIG_NULL_CHAN
++bool 'port channel support' CONFIG_PORT_CHAN
++bool 'pty channel support' CONFIG_PTY_CHAN
++bool 'tty channel support' CONFIG_TTY_CHAN
++bool 'xterm channel support' CONFIG_XTERM_CHAN
++string 'Default main console channel initialization' CONFIG_CON_ZERO_CHAN \
++            "fd:0,fd:1"
++string 'Default console channel initialization' CONFIG_CON_CHAN "xterm"
++string 'Default serial line channel initialization' CONFIG_SSL_CHAN "pty"
++
++
++bool 'Unix98 PTY support' CONFIG_UNIX98_PTYS
++if [ "$CONFIG_UNIX98_PTYS" = "y" ]; then
++   int 'Maximum number of Unix98 PTYs in use (0-2048)' CONFIG_UNIX98_PTY_COUNT 256
++fi
++
++bool 'Watchdog Timer Support' CONFIG_WATCHDOG
++dep_bool '  Disable watchdog shutdown on close' CONFIG_WATCHDOG_NOWAYOUT \
++	$CONFIG_WATCHDOG
++dep_tristate '  Software Watchdog' CONFIG_SOFT_WATCHDOG $CONFIG_WATCHDOG
++dep_tristate '  UML watchdog' CONFIG_UML_WATCHDOG $CONFIG_WATCHDOG
++
++tristate 'Sound support' CONFIG_UML_SOUND
++define_tristate CONFIG_SOUND $CONFIG_UML_SOUND
++define_tristate CONFIG_HOSTAUDIO $CONFIG_UML_SOUND
++
++bool 'Enable tty logging' CONFIG_TTY_LOG
++
++endmenu
 diff -Naur -X ../exclude-files orig/arch/um/config.in um/arch/um/config.in
---- orig/arch/um/config.in	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/config.in	Thu Feb 27 13:12:39 2003
+--- orig/arch/um/config.in	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/config.in	2003-02-27 13:12:39.000000000 -0500
 @@ -0,0 +1,104 @@
 +define_bool CONFIG_USERMODE y
 +
@@ -718,9 +224,60 @@ diff -Naur -X ../exclude-files orig/arch/um/config.in um/arch/um/config.in
 +dep_bool 'Enable gprof support' CONFIG_GPROF $CONFIG_DEBUGSYM
 +dep_bool 'Enable gcov support' CONFIG_GCOV $CONFIG_DEBUGSYM
 +endmenu
+diff -Naur -X ../exclude-files orig/arch/um/config_net.in um/arch/um/config_net.in
+--- orig/arch/um/config_net.in	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/config_net.in	2002-10-23 21:08:04.000000000 -0400
+@@ -0,0 +1,47 @@
++mainmenu_option next_comment
++comment 'Network Devices'
++
++# UML virtual driver
++bool 'Virtual network device' CONFIG_UML_NET
++
++dep_bool '  Ethertap transport' CONFIG_UML_NET_ETHERTAP $CONFIG_UML_NET
++dep_bool '  TUN/TAP transport' CONFIG_UML_NET_TUNTAP $CONFIG_UML_NET
++dep_bool '  SLIP transport' CONFIG_UML_NET_SLIP $CONFIG_UML_NET
++dep_bool '  SLiRP transport' CONFIG_UML_NET_SLIRP $CONFIG_UML_NET
++dep_bool '  Daemon transport' CONFIG_UML_NET_DAEMON $CONFIG_UML_NET
++dep_bool '  Multicast transport' CONFIG_UML_NET_MCAST $CONFIG_UML_NET
++dep_bool '  pcap transport' CONFIG_UML_NET_PCAP $CONFIG_UML_NET
++
++# Below are hardware-independent drivers mirrored from
++# drivers/net/Config.in. It would be nice if Linux
++# had HW independent drivers separated from the other
++# but it does not. Until then each non-ISA/PCI arch
++# needs to provide it's own menu of network drivers
++
++tristate 'Dummy net driver support' CONFIG_DUMMY
++tristate 'Bonding driver support' CONFIG_BONDING
++tristate 'EQL (serial line load balancing) support' CONFIG_EQUALIZER
++tristate 'Universal TUN/TAP device driver support' CONFIG_TUN
++if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
++   if [ "$CONFIG_NETLINK" = "y" ]; then
++      tristate 'Ethertap network tap (OBSOLETE)' CONFIG_ETHERTAP
++   fi
++fi
++
++tristate 'PPP (point-to-point protocol) support' CONFIG_PPP
++if [ ! "$CONFIG_PPP" = "n" ]; then
++   dep_bool '  PPP multilink support (EXPERIMENTAL)' CONFIG_PPP_MULTILINK $CONFIG_EXPERIMENTAL
++   dep_bool '  PPP filtering' CONFIG_PPP_FILTER $CONFIG_FILTER
++   dep_tristate '  PPP support for async serial ports' CONFIG_PPP_ASYNC $CONFIG_PPP
++   dep_tristate '  PPP support for sync tty ports' CONFIG_PPP_SYNC_TTY $CONFIG_PPP
++   dep_tristate '  PPP Deflate compression' CONFIG_PPP_DEFLATE $CONFIG_PPP
++   dep_tristate '  PPP BSD-Compress compression' CONFIG_PPP_BSDCOMP $CONFIG_PPP
++   dep_tristate '  PPP over Ethernet (EXPERIMENTAL)' CONFIG_PPPOE $CONFIG_PPP $CONFIG_EXPERIMENTAL
++fi
++
++tristate 'SLIP (serial line) support' CONFIG_SLIP
++dep_bool '  CSLIP compressed headers' CONFIG_SLIP_COMPRESSED $CONFIG_SLIP
++dep_bool '  Keepalive and linefill' CONFIG_SLIP_SMART $CONFIG_SLIP
++dep_bool '  Six bit SLIP encapsulation' CONFIG_SLIP_MODE_SLIP6 $CONFIG_SLIP
++
++endmenu
 diff -Naur -X ../exclude-files orig/arch/um/config.release um/arch/um/config.release
---- orig/arch/um/config.release	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/config.release	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/config.release	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/config.release	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,302 @@
 +#
 +# Automatically generated make config: don't edit
@@ -1024,121 +581,9 @@ diff -Naur -X ../exclude-files orig/arch/um/config.release um/arch/um/config.rel
 +#
 +# CONFIG_DEBUG_SLAB is not set
 +# CONFIG_DEBUGSYM is not set
-diff -Naur -X ../exclude-files orig/arch/um/config_block.in um/arch/um/config_block.in
---- orig/arch/um/config_block.in	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/config_block.in	Wed Oct 23 21:08:04 2002
-@@ -0,0 +1,16 @@
-+mainmenu_option next_comment
-+comment 'Block Devices'
-+
-+bool 'Virtual block device' CONFIG_BLK_DEV_UBD
-+dep_bool '  Always do synchronous disk IO for UBD' CONFIG_BLK_DEV_UBD_SYNC $CONFIG_BLK_DEV_UBD
-+tristate 'Loopback device support' CONFIG_BLK_DEV_LOOP
-+dep_tristate 'Network block device support' CONFIG_BLK_DEV_NBD $CONFIG_NET
-+tristate 'RAM disk support' CONFIG_BLK_DEV_RAM
-+if [ "$CONFIG_BLK_DEV_RAM" = "y" -o "$CONFIG_BLK_DEV_RAM" = "m" ]; then
-+	int '   Default RAM disk size' CONFIG_BLK_DEV_RAM_SIZE 4096
-+fi
-+dep_bool '  Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD $CONFIG_BLK_DEV_RAM
-+
-+tristate 'Example IO memory driver' CONFIG_MMAPPER
-+
-+endmenu
-diff -Naur -X ../exclude-files orig/arch/um/config_char.in um/arch/um/config_char.in
---- orig/arch/um/config_char.in	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/config_char.in	Wed Oct 23 21:08:04 2002
-@@ -0,0 +1,37 @@
-+mainmenu_option next_comment
-+comment 'Character Devices'
-+
-+define_bool CONFIG_STDIO_CONSOLE y
-+
-+bool 'Virtual serial line' CONFIG_SSL
-+
-+bool 'file descriptor channel support' CONFIG_FD_CHAN
-+bool 'null channel support' CONFIG_NULL_CHAN
-+bool 'port channel support' CONFIG_PORT_CHAN
-+bool 'pty channel support' CONFIG_PTY_CHAN
-+bool 'tty channel support' CONFIG_TTY_CHAN
-+bool 'xterm channel support' CONFIG_XTERM_CHAN
-+string 'Default main console channel initialization' CONFIG_CON_ZERO_CHAN \
-+            "fd:0,fd:1"
-+string 'Default console channel initialization' CONFIG_CON_CHAN "xterm"
-+string 'Default serial line channel initialization' CONFIG_SSL_CHAN "pty"
-+
-+
-+bool 'Unix98 PTY support' CONFIG_UNIX98_PTYS
-+if [ "$CONFIG_UNIX98_PTYS" = "y" ]; then
-+   int 'Maximum number of Unix98 PTYs in use (0-2048)' CONFIG_UNIX98_PTY_COUNT 256
-+fi
-+
-+bool 'Watchdog Timer Support' CONFIG_WATCHDOG
-+dep_bool '  Disable watchdog shutdown on close' CONFIG_WATCHDOG_NOWAYOUT \
-+	$CONFIG_WATCHDOG
-+dep_tristate '  Software Watchdog' CONFIG_SOFT_WATCHDOG $CONFIG_WATCHDOG
-+dep_tristate '  UML watchdog' CONFIG_UML_WATCHDOG $CONFIG_WATCHDOG
-+
-+tristate 'Sound support' CONFIG_UML_SOUND
-+define_tristate CONFIG_SOUND $CONFIG_UML_SOUND
-+define_tristate CONFIG_HOSTAUDIO $CONFIG_UML_SOUND
-+
-+bool 'Enable tty logging' CONFIG_TTY_LOG
-+
-+endmenu
-diff -Naur -X ../exclude-files orig/arch/um/config_net.in um/arch/um/config_net.in
---- orig/arch/um/config_net.in	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/config_net.in	Wed Oct 23 21:08:04 2002
-@@ -0,0 +1,47 @@
-+mainmenu_option next_comment
-+comment 'Network Devices'
-+
-+# UML virtual driver
-+bool 'Virtual network device' CONFIG_UML_NET
-+
-+dep_bool '  Ethertap transport' CONFIG_UML_NET_ETHERTAP $CONFIG_UML_NET
-+dep_bool '  TUN/TAP transport' CONFIG_UML_NET_TUNTAP $CONFIG_UML_NET
-+dep_bool '  SLIP transport' CONFIG_UML_NET_SLIP $CONFIG_UML_NET
-+dep_bool '  SLiRP transport' CONFIG_UML_NET_SLIRP $CONFIG_UML_NET
-+dep_bool '  Daemon transport' CONFIG_UML_NET_DAEMON $CONFIG_UML_NET
-+dep_bool '  Multicast transport' CONFIG_UML_NET_MCAST $CONFIG_UML_NET
-+dep_bool '  pcap transport' CONFIG_UML_NET_PCAP $CONFIG_UML_NET
-+
-+# Below are hardware-independent drivers mirrored from
-+# drivers/net/Config.in. It would be nice if Linux
-+# had HW independent drivers separated from the other
-+# but it does not. Until then each non-ISA/PCI arch
-+# needs to provide it's own menu of network drivers
-+
-+tristate 'Dummy net driver support' CONFIG_DUMMY
-+tristate 'Bonding driver support' CONFIG_BONDING
-+tristate 'EQL (serial line load balancing) support' CONFIG_EQUALIZER
-+tristate 'Universal TUN/TAP device driver support' CONFIG_TUN
-+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-+   if [ "$CONFIG_NETLINK" = "y" ]; then
-+      tristate 'Ethertap network tap (OBSOLETE)' CONFIG_ETHERTAP
-+   fi
-+fi
-+
-+tristate 'PPP (point-to-point protocol) support' CONFIG_PPP
-+if [ ! "$CONFIG_PPP" = "n" ]; then
-+   dep_bool '  PPP multilink support (EXPERIMENTAL)' CONFIG_PPP_MULTILINK $CONFIG_EXPERIMENTAL
-+   dep_bool '  PPP filtering' CONFIG_PPP_FILTER $CONFIG_FILTER
-+   dep_tristate '  PPP support for async serial ports' CONFIG_PPP_ASYNC $CONFIG_PPP
-+   dep_tristate '  PPP support for sync tty ports' CONFIG_PPP_SYNC_TTY $CONFIG_PPP
-+   dep_tristate '  PPP Deflate compression' CONFIG_PPP_DEFLATE $CONFIG_PPP
-+   dep_tristate '  PPP BSD-Compress compression' CONFIG_PPP_BSDCOMP $CONFIG_PPP
-+   dep_tristate '  PPP over Ethernet (EXPERIMENTAL)' CONFIG_PPPOE $CONFIG_PPP $CONFIG_EXPERIMENTAL
-+fi
-+
-+tristate 'SLIP (serial line) support' CONFIG_SLIP
-+dep_bool '  CSLIP compressed headers' CONFIG_SLIP_COMPRESSED $CONFIG_SLIP
-+dep_bool '  Keepalive and linefill' CONFIG_SLIP_SMART $CONFIG_SLIP
-+dep_bool '  Six bit SLIP encapsulation' CONFIG_SLIP_MODE_SLIP6 $CONFIG_SLIP
-+
-+endmenu
 diff -Naur -X ../exclude-files orig/arch/um/config_scsi.in um/arch/um/config_scsi.in
---- orig/arch/um/config_scsi.in	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/config_scsi.in	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/config_scsi.in	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/config_scsi.in	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,30 @@
 +comment 'SCSI support type (disk, tape, CD-ROM)'
 +
@@ -1171,8 +616,8 @@ diff -Naur -X ../exclude-files orig/arch/um/config_scsi.in um/arch/um/config_scs
 +
 +dep_tristate 'SCSI debugging host simulator (EXPERIMENTAL)' CONFIG_SCSI_DEBUG $CONFIG_SCSI
 diff -Naur -X ../exclude-files orig/arch/um/defconfig um/arch/um/defconfig
---- orig/arch/um/defconfig	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/defconfig	Mon Jan 20 11:26:54 2003
+--- orig/arch/um/defconfig	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/defconfig	2003-01-20 11:26:54.000000000 -0500
 @@ -0,0 +1,396 @@
 +#
 +# Automatically generated make config: don't edit
@@ -1570,107 +1015,9 @@ diff -Naur -X ../exclude-files orig/arch/um/defconfig um/arch/um/defconfig
 +CONFIG_PT_PROXY=y
 +# CONFIG_GPROF is not set
 +# CONFIG_GCOV is not set
-diff -Naur -X ../exclude-files orig/arch/um/drivers/Makefile um/arch/um/drivers/Makefile
---- orig/arch/um/drivers/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/Makefile	Wed Oct 23 21:08:04 2002
-@@ -0,0 +1,94 @@
-+# 
-+# Copyright (C) 2000, 2002 Jeff Dike (jdike@karaya.com)
-+# Licensed under the GPL
-+#
-+
-+O_TARGET := built-in.o 
-+
-+CHAN_OBJS := chan_kern.o chan_user.o line.o 
-+
-+list-multi := slip.o slirp.o daemon.o mcast.o mconsole.o net.o ubd.o \
-+	hostaudio.o pcap.o port.o harddog.o
-+
-+slip-objs := slip_kern.o slip_user.o
-+slirp-objs := slirp_kern.o slirp_user.o
-+daemon-objs := daemon_kern.o daemon_user.o
-+mcast-objs := mcast_kern.o mcast_user.o
-+pcap-objs := pcap_kern.o pcap_user.o -lpcap -L/usr/lib
-+net-objs := net_kern.o net_user.o
-+mconsole-objs := mconsole_kern.o mconsole_user.o
-+hostaudio-objs := hostaudio_kern.o hostaudio_user.o
-+ubd-objs := ubd_kern.o ubd_user.o
-+port-objs := port_kern.o port_user.o
-+harddog-objs := harddog_kern.o harddog_user.o
-+
-+export-objs := mconsole_kern.o
-+
-+obj-y = 
-+obj-$(CONFIG_SSL) += ssl.o 
-+obj-$(CONFIG_UML_NET_SLIP) += slip.o
-+obj-$(CONFIG_UML_NET_SLIRP) += slirp.o
-+obj-$(CONFIG_UML_NET_DAEMON) += daemon.o 
-+obj-$(CONFIG_UML_NET_MCAST) += mcast.o 
-+obj-$(CONFIG_UML_NET_PCAP) += pcap.o 
-+obj-$(CONFIG_UML_NET) += net.o 
-+obj-$(CONFIG_MCONSOLE) += mconsole.o
-+obj-$(CONFIG_MMAPPER) += mmapper_kern.o 
-+obj-$(CONFIG_BLK_DEV_UBD) += ubd.o 
-+obj-$(CONFIG_HOSTAUDIO) += hostaudio.o
-+obj-$(CONFIG_FD_CHAN) += fd.o 
-+obj-$(CONFIG_NULL_CHAN) += null.o 
-+obj-$(CONFIG_PORT_CHAN) += port.o
-+obj-$(CONFIG_PTY_CHAN) += pty.o
-+obj-$(CONFIG_TTY_CHAN) += tty.o 
-+obj-$(CONFIG_XTERM_CHAN) += xterm.o xterm_kern.o
-+obj-$(CONFIG_UML_WATCHDOG) += harddog.o
-+
-+CFLAGS_pcap_user.o = -I/usr/include/pcap
-+
-+obj-y += stdio_console.o $(CHAN_OBJS)
-+
-+USER_SINGLE_OBJS = $(foreach f,$(patsubst %.o,%,$(obj-y) $(obj-m)),$($(f)-objs))
-+
-+USER_OBJS = $(filter %_user.o,$(obj-y) $(obj-m) $(USER_SINGLE_OBJS)) fd.o \
-+	null.o pty.o tty.o xterm.o
-+
-+include $(TOPDIR)/Rules.make
-+
-+$(USER_OBJS) : %.o: %.c
-+	$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $<
-+
-+clean:
-+
-+modules:
-+
-+fastdep:
-+
-+dep:
-+
-+archmrproper:
-+
-+daemon.o : $(daemon-objs)
-+
-+slip.o : $(slip-objs)
-+
-+slirp.o : $(slirp-objs)
-+
-+mcast.o : $(mcast-objs)
-+
-+pcap.o : $(pcap-objs)
-+
-+mconsole.o : $(mconsole-objs)
-+
-+net.o : $(net-objs)
-+
-+hostaudio.o : $(hostaudio-objs)
-+
-+ubd.o : $(ubd-objs)
-+
-+port.o : $(port-objs)
-+
-+harddog.o : $(harddog-objs)
-+
-+$(list-multi) : # This doesn't work, but should : '%.o : $(%-objs)'
-+	$(LD) $(LD_RFLAG) -r -o $@ $($(patsubst %.o,%,$@)-objs)
 diff -Naur -X ../exclude-files orig/arch/um/drivers/chan_kern.c um/arch/um/drivers/chan_kern.c
---- orig/arch/um/drivers/chan_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/chan_kern.c	Thu Mar  6 19:25:16 2003
+--- orig/arch/um/drivers/chan_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/chan_kern.c	2003-03-06 19:25:16.000000000 -0500
 @@ -0,0 +1,510 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -2183,8 +1530,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/chan_kern.c um/arch/um/drive
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/chan_user.c um/arch/um/drivers/chan_user.c
---- orig/arch/um/drivers/chan_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/chan_user.c	Wed Mar 26 13:23:48 2003
+--- orig/arch/um/drivers/chan_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/chan_user.c	2003-03-26 13:23:48.000000000 -0500
 @@ -0,0 +1,213 @@
 +/* 
 + * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com)
@@ -2399,9 +1746,390 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/chan_user.c um/arch/um/drive
 + * c-file-style: "linux"
 + * End:
 + */
+diff -Naur -X ../exclude-files orig/arch/um/drivers/cow.h um/arch/um/drivers/cow.h
+--- orig/arch/um/drivers/cow.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/cow.h	2003-06-05 14:28:44.000000000 -0400
+@@ -0,0 +1,34 @@
++#ifndef __COW_H__
++#define __COW_H__
++
++#include <asm/types.h>
++
++#if __BYTE_ORDER == __BIG_ENDIAN
++# define ntohll(x) (x)
++# define htonll(x) (x)
++#elif __BYTE_ORDER == __LITTLE_ENDIAN
++# define ntohll(x)  bswap_64(x)
++# define htonll(x)  bswap_64(x)
++#else
++#error "__BYTE_ORDER not defined"
++#endif
++
++extern int init_cow_file(int fd, char *cow_file, char *backing_file, 
++			 int sectorsize, int *bitmap_offset_out, 
++			 unsigned long *bitmap_len_out, int *data_offset_out);
++extern int read_cow_header(int fd, __u32 *magic_out, char **backing_file_out, 
++			   time_t *mtime_out, __u64 *size_out, 
++			   int *sectorsize_out, int *bitmap_offset_out);
++extern int write_cow_header(char *cow_file, int fd, char *backing_file, 
++			    int sectorsize, long long *size);
++extern void cow_sizes(__u64 size, int sectorsize, int bitmap_offset, 
++		      unsigned long *bitmap_len_out, int *data_offset_out);
++
++#endif
++
++/*
++ * ---------------------------------------------------------------------------
++ * Local variables:
++ * c-file-style: "linux"
++ * End:
++ */
+diff -Naur -X ../exclude-files orig/arch/um/drivers/cow_sys.h um/arch/um/drivers/cow_sys.h
+--- orig/arch/um/drivers/cow_sys.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/cow_sys.h	2003-06-05 14:29:25.000000000 -0400
+@@ -0,0 +1,48 @@
++#ifndef __COW_SYS_H__
++#define __COW_SYS_H__
++
++#include "kern_util.h"
++#include "user_util.h"
++#include "os.h"
++#include "user.h"
++
++static inline void *cow_malloc(int size)
++{
++	return(um_kmalloc(size));
++}
++
++static inline void cow_free(void *ptr)
++{
++	kfree(ptr);
++}
++
++#define cow_printf printk
++
++static inline char *cow_strdup(char *str)
++{
++	return(uml_strdup(str));
++}
++
++static inline int cow_seek_file(int fd, __u64 offset)
++{
++	return(os_seek_file(fd, offset));
++}
++
++static inline int cow_file_size(char *file, __u64 *size_out)
++{
++	return(os_file_size(file, size_out));
++}
++
++static inline int cow_write_file(int fd, char *buf, int size)
++{
++	return(os_write_file(fd, buf, size));
++}
++
++#endif
++
++/*
++ * ---------------------------------------------------------------------------
++ * Local variables:
++ * c-file-style: "linux"
++ * End:
++ */
+diff -Naur -X ../exclude-files orig/arch/um/drivers/cow_user.c um/arch/um/drivers/cow_user.c
+--- orig/arch/um/drivers/cow_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/cow_user.c	2003-06-05 14:39:18.000000000 -0400
+@@ -0,0 +1,287 @@
++#include <stddef.h>
++#include <string.h>
++#include <errno.h>
++#include <unistd.h>
++#include <byteswap.h>
++#include <sys/stat.h>
++#include <sys/time.h>
++#include <sys/param.h>
++#include <netinet/in.h>
++
++#include "cow.h"
++#include "cow_sys.h"
++
++#define PATH_LEN_V1 256
++
++struct cow_header_v1 {
++	int magic;
++	int version;
++	char backing_file[PATH_LEN_V1];
++	time_t mtime;
++	__u64 size;
++	int sectorsize;
++};
++
++#define PATH_LEN_V2 MAXPATHLEN
++
++struct cow_header_v2 {
++	unsigned long magic;
++	unsigned long version;
++	char backing_file[PATH_LEN_V2];
++	time_t mtime;
++	__u64 size;
++	int sectorsize;
++};
++
++union cow_header {
++	struct cow_header_v1 v1;
++	struct cow_header_v2 v2;
++};
++
++#define COW_MAGIC 0x4f4f4f4d  /* MOOO */
++#define COW_VERSION 2
++
++void cow_sizes(__u64 size, int sectorsize, int bitmap_offset, 
++	       unsigned long *bitmap_len_out, int *data_offset_out)
++{
++	*bitmap_len_out = (size + sectorsize - 1) / (8 * sectorsize);
++
++	*data_offset_out = bitmap_offset + *bitmap_len_out;
++	*data_offset_out = (*data_offset_out + sectorsize - 1) / sectorsize;
++	*data_offset_out *= sectorsize;
++}
++
++static int absolutize(char *to, int size, char *from)
++{
++	char save_cwd[256], *slash;
++	int remaining;
++
++	if(getcwd(save_cwd, sizeof(save_cwd)) == NULL) {
++		cow_printf("absolutize : unable to get cwd - errno = %d\n", 
++			   errno);
++		return(-1);
++	}
++	slash = strrchr(from, '/');
++	if(slash != NULL){
++		*slash = '\0';
++		if(chdir(from)){
++			*slash = '/';
++			cow_printf("absolutize : Can't cd to '%s' - " 
++				   "errno = %d\n", from, errno);
++			return(-1);
++		}
++		*slash = '/';
++		if(getcwd(to, size) == NULL){
++			cow_printf("absolutize : unable to get cwd of '%s' - "
++			       "errno = %d\n", from, errno);
++			return(-1);
++		}
++		remaining = size - strlen(to);
++		if(strlen(slash) + 1 > remaining){
++			cow_printf("absolutize : unable to fit '%s' into %d "
++			       "chars\n", from, size);
++			return(-1);
++		}
++		strcat(to, slash);
++	}
++	else {
++		if(strlen(save_cwd) + 1 + strlen(from) + 1 > size){
++			cow_printf("absolutize : unable to fit '%s' into %d "
++			       "chars\n", from, size);
++			return(-1);
++		}
++		strcpy(to, save_cwd);
++		strcat(to, "/");
++		strcat(to, from);
++	}
++	chdir(save_cwd);
++	return(0);
++}
++
++int write_cow_header(char *cow_file, int fd, char *backing_file, 
++		     int sectorsize, long long *size)
++{
++        struct cow_header_v2 *header;
++	struct stat64 buf;
++	int err;
++
++	err = cow_seek_file(fd, 0);
++	if(err != 0){
++		cow_printf("write_cow_header - lseek failed, errno = %d\n", 
++			   errno);
++		return(-errno);
++	}
++
++	err = -ENOMEM;
++	header = cow_malloc(sizeof(*header));
++	if(header == NULL){
++		cow_printf("Failed to allocate COW V2 header\n");
++		goto out;
++	}
++	header->magic = htonl(COW_MAGIC);
++	header->version = htonl(COW_VERSION);
++
++	err = -EINVAL;
++	if(strlen(backing_file) > sizeof(header->backing_file) - 1){
++		cow_printf("Backing file name \"%s\" is too long - names are "
++			   "limited to %d characters\n", backing_file, 
++			   sizeof(header->backing_file) - 1);
++		goto out_free;
++	}
++
++	if(absolutize(header->backing_file, sizeof(header->backing_file), 
++		      backing_file))
++		goto out_free;
++
++	err = stat64(header->backing_file, &buf);
++	if(err < 0){
++		cow_printf("Stat of backing file '%s' failed, errno = %d\n",
++			   header->backing_file, errno);
++		err = -errno;
++		goto out_free;
++	}
++
++	err = cow_file_size(header->backing_file, size);
++	if(err){
++		cow_printf("Couldn't get size of backing file '%s', "
++			   "errno = %d\n", header->backing_file, -*size);
++		goto out_free;
++	}
++
++	header->mtime = htonl(buf.st_mtime);
++	header->size = htonll(*size);
++	header->sectorsize = htonl(sectorsize);
++
++	err = write(fd, header, sizeof(*header));
++	if(err != sizeof(*header)){
++		cow_printf("Write of header to new COW file '%s' failed, "
++			   "errno = %d\n", cow_file, errno);
++		goto out_free;
++	}
++	err = 0;
++ out_free:
++	cow_free(header);
++ out:
++	return(err);
++}
++
++int read_cow_header(int fd, __u32 *magic_out, char **backing_file_out, 
++		    time_t *mtime_out, __u64 *size_out, 
++		    int *sectorsize_out, int *bitmap_offset_out)
++{
++	union cow_header *header;
++	char *file;
++	int err, n;
++	unsigned long version, magic;
++
++	header = cow_malloc(sizeof(*header));
++	if(header == NULL){
++	        cow_printf("read_cow_header - Failed to allocate header\n");
++		return(-ENOMEM);
++	}
++	err = -EINVAL;
++	n = read(fd, header, sizeof(*header));
++	if(n < offsetof(typeof(header->v1), backing_file)){
++		cow_printf("read_cow_header - short header\n");
++		goto out;
++	}
++
++	magic = header->v1.magic;
++	if(magic == COW_MAGIC) {
++		version = header->v1.version;
++	}
++	else if(magic == ntohl(COW_MAGIC)){
++		version = ntohl(header->v1.version);
++	}
++	else goto out;
++
++	*magic_out = COW_MAGIC;
++
++	if(version == 1){
++		if(n < sizeof(header->v1)){
++			cow_printf("read_cow_header - failed to read V1 "
++				   "header\n");
++			goto out;
++		}
++		*mtime_out = header->v1.mtime;
++		*size_out = header->v1.size;
++		*sectorsize_out = header->v1.sectorsize;
++		*bitmap_offset_out = sizeof(header->v1);
++		file = header->v1.backing_file;
++	}
++	else if(version == 2){
++		if(n < sizeof(header->v2)){
++			cow_printf("read_cow_header - failed to read V2 "
++				   "header\n");
++			goto out;
++		}
++		*mtime_out = ntohl(header->v2.mtime);
++		*size_out = ntohll(header->v2.size);
++		*sectorsize_out = ntohl(header->v2.sectorsize);
++		*bitmap_offset_out = sizeof(header->v2);
++		file = header->v2.backing_file;
++	}
++	else {
++		cow_printf("read_cow_header - invalid COW version\n");
++		goto out;
++	}
++	err = -ENOMEM;
++	*backing_file_out = cow_strdup(file);
++	if(*backing_file_out == NULL){
++		cow_printf("read_cow_header - failed to allocate backing "
++			   "file\n");
++		goto out;
++	}
++	err = 0;
++ out:
++	cow_free(header);
++	return(err);
++}
++
++int init_cow_file(int fd, char *cow_file, char *backing_file, int sectorsize,
++		  int *bitmap_offset_out, unsigned long *bitmap_len_out, 
++		  int *data_offset_out)
++{
++	__u64 size, offset;
++	char zero = 0;
++	int err;
++
++	err = write_cow_header(cow_file, fd, backing_file, sectorsize, &size);
++	if(err) 
++		goto out;
++	
++	cow_sizes(size, sectorsize, sizeof(struct cow_header_v2), 
++		  bitmap_len_out, data_offset_out);
++	*bitmap_offset_out = sizeof(struct cow_header_v2);
++
++	offset = *data_offset_out + size - sizeof(zero);
++	err = cow_seek_file(fd, offset);
++	if(err != 0){
++		cow_printf("cow bitmap lseek failed : errno = %d\n", errno);
++		goto out;
++	}
++
++	/* does not really matter how much we write it is just to set EOF 
++	 * this also sets the entire COW bitmap
++	 * to zero without having to allocate it 
++	 */
++	err = cow_write_file(fd, &zero, sizeof(zero));
++	if(err != sizeof(zero)){
++		err = -EINVAL;
++		cow_printf("Write of bitmap to new COW file '%s' failed, "
++			   "errno = %d\n", cow_file, errno);
++		goto out;
++	}
++
++	return(0);
++
++ out:
++	return(err);
++}
++
++/*
++ * ---------------------------------------------------------------------------
++ * Local variables:
++ * c-file-style: "linux"
++ * End:
++ */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/daemon.h um/arch/um/drivers/daemon.h
---- orig/arch/um/drivers/daemon.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/daemon.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/drivers/daemon.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/daemon.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,35 @@
 +/* 
 + * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
@@ -2439,8 +2167,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/daemon.h um/arch/um/drivers/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/daemon_kern.c um/arch/um/drivers/daemon_kern.c
---- orig/arch/um/drivers/daemon_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/daemon_kern.c	Sun Dec 15 21:19:17 2002
+--- orig/arch/um/drivers/daemon_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/daemon_kern.c	2002-12-15 21:19:17.000000000 -0500
 @@ -0,0 +1,113 @@
 +/*
 + * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) and 
@@ -2556,8 +2284,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/daemon_kern.c um/arch/um/dri
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/daemon_user.c um/arch/um/drivers/daemon_user.c
---- orig/arch/um/drivers/daemon_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/daemon_user.c	Fri Jan 17 13:48:59 2003
+--- orig/arch/um/drivers/daemon_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/daemon_user.c	2003-01-17 13:48:59.000000000 -0500
 @@ -0,0 +1,195 @@
 +/*
 + * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) and 
@@ -2755,8 +2483,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/daemon_user.c um/arch/um/dri
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/fd.c um/arch/um/drivers/fd.c
---- orig/arch/um/drivers/fd.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/fd.c	Sun Dec 15 20:57:25 2002
+--- orig/arch/um/drivers/fd.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/fd.c	2002-12-15 20:57:25.000000000 -0500
 @@ -0,0 +1,96 @@
 +/* 
 + * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
@@ -2855,8 +2583,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/fd.c um/arch/um/drivers/fd.c
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/harddog_kern.c um/arch/um/drivers/harddog_kern.c
---- orig/arch/um/drivers/harddog_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/harddog_kern.c	Sun Dec 15 20:57:42 2002
+--- orig/arch/um/drivers/harddog_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/harddog_kern.c	2002-12-15 20:57:42.000000000 -0500
 @@ -0,0 +1,194 @@
 +/* UML hardware watchdog, shamelessly stolen from:
 + *
@@ -3053,8 +2781,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/harddog_kern.c um/arch/um/dr
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/harddog_user.c um/arch/um/drivers/harddog_user.c
---- orig/arch/um/drivers/harddog_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/harddog_user.c	Wed Dec  4 16:38:05 2002
+--- orig/arch/um/drivers/harddog_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/harddog_user.c	2002-12-04 16:38:05.000000000 -0500
 @@ -0,0 +1,137 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -3194,8 +2922,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/harddog_user.c um/arch/um/dr
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/hostaudio_kern.c um/arch/um/drivers/hostaudio_kern.c
---- orig/arch/um/drivers/hostaudio_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/hostaudio_kern.c	Fri Mar 28 21:57:16 2003
+--- orig/arch/um/drivers/hostaudio_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/hostaudio_kern.c	2003-03-28 21:57:16.000000000 -0500
 @@ -0,0 +1,330 @@
 +/* 
 + * Copyright (C) 2002 Steve Schmidtke 
@@ -3528,8 +3256,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/hostaudio_kern.c um/arch/um/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/hostaudio_user.c um/arch/um/drivers/hostaudio_user.c
---- orig/arch/um/drivers/hostaudio_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/hostaudio_user.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/drivers/hostaudio_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/hostaudio_user.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,149 @@
 +/* 
 + * Copyright (C) 2002 Steve Schmidtke 
@@ -3681,8 +3409,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/hostaudio_user.c um/arch/um/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/line.c um/arch/um/drivers/line.c
---- orig/arch/um/drivers/line.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/line.c	Wed Mar 26 15:09:44 2003
+--- orig/arch/um/drivers/line.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/line.c	2003-03-26 15:09:44.000000000 -0500
 @@ -0,0 +1,589 @@
 +/* 
 + * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -4273,9 +4001,107 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/line.c um/arch/um/drivers/li
 + * c-file-style: "linux"
 + * End:
 + */
+diff -Naur -X ../exclude-files orig/arch/um/drivers/Makefile um/arch/um/drivers/Makefile
+--- orig/arch/um/drivers/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/Makefile	2003-06-05 13:48:51.000000000 -0400
+@@ -0,0 +1,94 @@
++# 
++# Copyright (C) 2000, 2002 Jeff Dike (jdike@karaya.com)
++# Licensed under the GPL
++#
++
++O_TARGET := built-in.o 
++
++CHAN_OBJS := chan_kern.o chan_user.o line.o 
++
++list-multi := slip.o slirp.o daemon.o mcast.o mconsole.o net.o ubd.o \
++	hostaudio.o pcap.o port.o harddog.o
++
++slip-objs := slip_kern.o slip_user.o
++slirp-objs := slirp_kern.o slirp_user.o
++daemon-objs := daemon_kern.o daemon_user.o
++mcast-objs := mcast_kern.o mcast_user.o
++pcap-objs := pcap_kern.o pcap_user.o -lpcap -L/usr/lib
++net-objs := net_kern.o net_user.o
++mconsole-objs := mconsole_kern.o mconsole_user.o
++hostaudio-objs := hostaudio_kern.o hostaudio_user.o
++ubd-objs := ubd_kern.o ubd_user.o cow_user.o
++port-objs := port_kern.o port_user.o
++harddog-objs := harddog_kern.o harddog_user.o
++
++export-objs := mconsole_kern.o
++
++obj-y = 
++obj-$(CONFIG_SSL) += ssl.o 
++obj-$(CONFIG_UML_NET_SLIP) += slip.o
++obj-$(CONFIG_UML_NET_SLIRP) += slirp.o
++obj-$(CONFIG_UML_NET_DAEMON) += daemon.o 
++obj-$(CONFIG_UML_NET_MCAST) += mcast.o 
++obj-$(CONFIG_UML_NET_PCAP) += pcap.o 
++obj-$(CONFIG_UML_NET) += net.o 
++obj-$(CONFIG_MCONSOLE) += mconsole.o
++obj-$(CONFIG_MMAPPER) += mmapper_kern.o 
++obj-$(CONFIG_BLK_DEV_UBD) += ubd.o 
++obj-$(CONFIG_HOSTAUDIO) += hostaudio.o
++obj-$(CONFIG_FD_CHAN) += fd.o 
++obj-$(CONFIG_NULL_CHAN) += null.o 
++obj-$(CONFIG_PORT_CHAN) += port.o
++obj-$(CONFIG_PTY_CHAN) += pty.o
++obj-$(CONFIG_TTY_CHAN) += tty.o 
++obj-$(CONFIG_XTERM_CHAN) += xterm.o xterm_kern.o
++obj-$(CONFIG_UML_WATCHDOG) += harddog.o
++
++CFLAGS_pcap_user.o = -I/usr/include/pcap
++
++obj-y += stdio_console.o $(CHAN_OBJS)
++
++USER_SINGLE_OBJS = $(foreach f,$(patsubst %.o,%,$(obj-y) $(obj-m)),$($(f)-objs))
++
++USER_OBJS = $(filter %_user.o,$(obj-y) $(obj-m) $(USER_SINGLE_OBJS)) fd.o \
++	null.o pty.o tty.o xterm.o
++
++include $(TOPDIR)/Rules.make
++
++$(USER_OBJS) : %.o: %.c
++	$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $<
++
++clean:
++
++modules:
++
++fastdep:
++
++dep:
++
++archmrproper:
++
++daemon.o : $(daemon-objs)
++
++slip.o : $(slip-objs)
++
++slirp.o : $(slirp-objs)
++
++mcast.o : $(mcast-objs)
++
++pcap.o : $(pcap-objs)
++
++mconsole.o : $(mconsole-objs)
++
++net.o : $(net-objs)
++
++hostaudio.o : $(hostaudio-objs)
++
++ubd.o : $(ubd-objs)
++
++port.o : $(port-objs)
++
++harddog.o : $(harddog-objs)
++
++$(list-multi) : # This doesn't work, but should : '%.o : $(%-objs)'
++	$(LD) $(LD_RFLAG) -r -o $@ $($(patsubst %.o,%,$@)-objs)
 diff -Naur -X ../exclude-files orig/arch/um/drivers/mcast.h um/arch/um/drivers/mcast.h
---- orig/arch/um/drivers/mcast.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/mcast.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/drivers/mcast.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/mcast.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,30 @@
 +/* 
 + * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
@@ -4308,8 +4134,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/mcast.h um/arch/um/drivers/m
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/mcast_kern.c um/arch/um/drivers/mcast_kern.c
---- orig/arch/um/drivers/mcast_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/mcast_kern.c	Sun Dec 15 20:58:55 2002
+--- orig/arch/um/drivers/mcast_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/mcast_kern.c	2002-12-15 20:58:55.000000000 -0500
 @@ -0,0 +1,145 @@
 +/*
 + * user-mode-linux networking multicast transport
@@ -4457,8 +4283,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/mcast_kern.c um/arch/um/driv
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/mcast_user.c um/arch/um/drivers/mcast_user.c
---- orig/arch/um/drivers/mcast_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/mcast_user.c	Sun Dec 15 21:19:16 2002
+--- orig/arch/um/drivers/mcast_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/mcast_user.c	2002-12-15 21:19:16.000000000 -0500
 @@ -0,0 +1,175 @@
 +/*
 + * user-mode-linux networking multicast transport
@@ -4636,8 +4462,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/mcast_user.c um/arch/um/driv
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/mconsole_kern.c um/arch/um/drivers/mconsole_kern.c
---- orig/arch/um/drivers/mconsole_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/mconsole_kern.c	Fri Mar 28 21:58:11 2003
+--- orig/arch/um/drivers/mconsole_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/mconsole_kern.c	2003-03-28 21:58:11.000000000 -0500
 @@ -0,0 +1,453 @@
 +/*
 + * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org)
@@ -5093,8 +4919,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/mconsole_kern.c um/arch/um/d
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/mconsole_user.c um/arch/um/drivers/mconsole_user.c
---- orig/arch/um/drivers/mconsole_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/mconsole_user.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/drivers/mconsole_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/mconsole_user.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,212 @@
 +/*
 + * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org)
@@ -5309,8 +5135,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/mconsole_user.c um/arch/um/d
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/mmapper_kern.c um/arch/um/drivers/mmapper_kern.c
---- orig/arch/um/drivers/mmapper_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/mmapper_kern.c	Sun Dec 15 21:03:08 2002
+--- orig/arch/um/drivers/mmapper_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/mmapper_kern.c	2002-12-15 21:03:08.000000000 -0500
 @@ -0,0 +1,148 @@
 +/*
 + * arch/um/drivers/mmapper_kern.c
@@ -5461,8 +5287,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/mmapper_kern.c um/arch/um/dr
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/net_kern.c um/arch/um/drivers/net_kern.c
---- orig/arch/um/drivers/net_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/net_kern.c	Sun Dec 15 21:19:16 2002
+--- orig/arch/um/drivers/net_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/net_kern.c	2002-12-15 21:19:16.000000000 -0500
 @@ -0,0 +1,870 @@
 +/*
 + * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) and 
@@ -6335,8 +6161,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/net_kern.c um/arch/um/driver
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/net_user.c um/arch/um/drivers/net_user.c
---- orig/arch/um/drivers/net_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/net_user.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/drivers/net_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/net_user.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,254 @@
 +/* 
 + * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -6593,8 +6419,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/net_user.c um/arch/um/driver
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/null.c um/arch/um/drivers/null.c
---- orig/arch/um/drivers/null.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/null.c	Sun Dec 15 21:04:00 2002
+--- orig/arch/um/drivers/null.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/null.c	2002-12-15 21:04:00.000000000 -0500
 @@ -0,0 +1,56 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -6653,8 +6479,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/null.c um/arch/um/drivers/nu
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/pcap_kern.c um/arch/um/drivers/pcap_kern.c
---- orig/arch/um/drivers/pcap_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/pcap_kern.c	Sun Dec 15 21:19:15 2002
+--- orig/arch/um/drivers/pcap_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/pcap_kern.c	2002-12-15 21:19:15.000000000 -0500
 @@ -0,0 +1,127 @@
 +/*
 + * Copyright (C) 2002 Jeff Dike <jdike@karaya.com>
@@ -6784,8 +6610,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/pcap_kern.c um/arch/um/drive
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/pcap_user.c um/arch/um/drivers/pcap_user.c
---- orig/arch/um/drivers/pcap_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/pcap_user.c	Sun Dec 15 21:04:39 2002
+--- orig/arch/um/drivers/pcap_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/pcap_user.c	2002-12-15 21:04:39.000000000 -0500
 @@ -0,0 +1,143 @@
 +/*
 + * Copyright (C) 2002 Jeff Dike <jdike@karaya.com>
@@ -6931,8 +6757,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/pcap_user.c um/arch/um/drive
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/pcap_user.h um/arch/um/drivers/pcap_user.h
---- orig/arch/um/drivers/pcap_user.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/pcap_user.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/drivers/pcap_user.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/pcap_user.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,31 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -6966,8 +6792,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/pcap_user.h um/arch/um/drive
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/port.h um/arch/um/drivers/port.h
---- orig/arch/um/drivers/port.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/port.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/drivers/port.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/port.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,30 @@
 +/* 
 + * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
@@ -7000,8 +6826,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/port.h um/arch/um/drivers/po
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/port_kern.c um/arch/um/drivers/port_kern.c
---- orig/arch/um/drivers/port_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/port_kern.c	Mon Dec 30 20:57:42 2002
+--- orig/arch/um/drivers/port_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/port_kern.c	2002-12-30 20:57:42.000000000 -0500
 @@ -0,0 +1,302 @@
 +/* 
 + * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -7306,8 +7132,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/port_kern.c um/arch/um/drive
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/port_user.c um/arch/um/drivers/port_user.c
---- orig/arch/um/drivers/port_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/port_user.c	Mon Dec 16 22:46:20 2002
+--- orig/arch/um/drivers/port_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/port_user.c	2002-12-16 22:46:20.000000000 -0500
 @@ -0,0 +1,206 @@
 +/* 
 + * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
@@ -7516,8 +7342,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/port_user.c um/arch/um/drive
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/pty.c um/arch/um/drivers/pty.c
---- orig/arch/um/drivers/pty.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/pty.c	Sun Dec 15 21:06:01 2002
+--- orig/arch/um/drivers/pty.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/pty.c	2002-12-15 21:06:01.000000000 -0500
 @@ -0,0 +1,148 @@
 +/* 
 + * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -7668,8 +7494,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/pty.c um/arch/um/drivers/pty
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/slip.h um/arch/um/drivers/slip.h
---- orig/arch/um/drivers/slip.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/slip.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/drivers/slip.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/slip.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,39 @@
 +#ifndef __UM_SLIP_H
 +#define __UM_SLIP_H
@@ -7711,8 +7537,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/slip.h um/arch/um/drivers/sl
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/slip_kern.c um/arch/um/drivers/slip_kern.c
---- orig/arch/um/drivers/slip_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/slip_kern.c	Sun Dec 15 21:06:24 2002
+--- orig/arch/um/drivers/slip_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/slip_kern.c	2002-12-15 21:06:24.000000000 -0500
 @@ -0,0 +1,109 @@
 +#include "linux/config.h"
 +#include "linux/kernel.h"
@@ -7824,8 +7650,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/slip_kern.c um/arch/um/drive
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/slip_proto.h um/arch/um/drivers/slip_proto.h
---- orig/arch/um/drivers/slip_proto.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/slip_proto.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/drivers/slip_proto.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/slip_proto.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,93 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -7921,8 +7747,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/slip_proto.h um/arch/um/driv
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/slip_user.c um/arch/um/drivers/slip_user.c
---- orig/arch/um/drivers/slip_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/slip_user.c	Sun Dec 15 21:06:35 2002
+--- orig/arch/um/drivers/slip_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/slip_user.c	2002-12-15 21:06:35.000000000 -0500
 @@ -0,0 +1,279 @@
 +#include <stdio.h>
 +#include <stdlib.h>
@@ -8204,8 +8030,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/slip_user.c um/arch/um/drive
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/slirp.h um/arch/um/drivers/slirp.h
---- orig/arch/um/drivers/slirp.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/slirp.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/drivers/slirp.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/slirp.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,51 @@
 +#ifndef __UM_SLIRP_H
 +#define __UM_SLIRP_H
@@ -8259,8 +8085,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/slirp.h um/arch/um/drivers/s
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/slirp_kern.c um/arch/um/drivers/slirp_kern.c
---- orig/arch/um/drivers/slirp_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/slirp_kern.c	Sun Dec 15 21:06:54 2002
+--- orig/arch/um/drivers/slirp_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/slirp_kern.c	2002-12-15 21:06:54.000000000 -0500
 @@ -0,0 +1,132 @@
 +#include "linux/kernel.h"
 +#include "linux/stddef.h"
@@ -8395,8 +8221,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/slirp_kern.c um/arch/um/driv
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/slirp_user.c um/arch/um/drivers/slirp_user.c
---- orig/arch/um/drivers/slirp_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/slirp_user.c	Sun Dec 15 21:07:08 2002
+--- orig/arch/um/drivers/slirp_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/slirp_user.c	2002-12-15 21:07:08.000000000 -0500
 @@ -0,0 +1,202 @@
 +#include <stdio.h>
 +#include <stdlib.h>
@@ -8601,8 +8427,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/slirp_user.c um/arch/um/driv
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/ssl.c um/arch/um/drivers/ssl.c
---- orig/arch/um/drivers/ssl.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/ssl.c	Thu Mar  6 18:55:01 2003
+--- orig/arch/um/drivers/ssl.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/ssl.c	2003-03-06 18:55:01.000000000 -0500
 @@ -0,0 +1,265 @@
 +/* 
 + * Copyright (C) 2000, 2002 Jeff Dike (jdike@karaya.com)
@@ -8870,8 +8696,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/ssl.c um/arch/um/drivers/ssl
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/ssl.h um/arch/um/drivers/ssl.h
---- orig/arch/um/drivers/ssl.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/ssl.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/drivers/ssl.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/ssl.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,23 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -8897,8 +8723,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/ssl.h um/arch/um/drivers/ssl
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/stdio_console.c um/arch/um/drivers/stdio_console.c
---- orig/arch/um/drivers/stdio_console.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/stdio_console.c	Sun Dec 15 21:08:20 2002
+--- orig/arch/um/drivers/stdio_console.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/stdio_console.c	2002-12-15 21:08:20.000000000 -0500
 @@ -0,0 +1,250 @@
 +/* 
 + * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com)
@@ -9151,8 +8977,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/stdio_console.c um/arch/um/d
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/stdio_console.h um/arch/um/drivers/stdio_console.h
---- orig/arch/um/drivers/stdio_console.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/stdio_console.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/drivers/stdio_console.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/stdio_console.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,21 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -9176,8 +9002,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/stdio_console.h um/arch/um/d
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/tty.c um/arch/um/drivers/tty.c
---- orig/arch/um/drivers/tty.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/tty.c	Sun Dec 15 21:08:41 2002
+--- orig/arch/um/drivers/tty.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/tty.c	2002-12-15 21:08:41.000000000 -0500
 @@ -0,0 +1,86 @@
 +/* 
 + * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
@@ -9266,8 +9092,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/tty.c um/arch/um/drivers/tty
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/ubd_kern.c um/arch/um/drivers/ubd_kern.c
---- orig/arch/um/drivers/ubd_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/ubd_kern.c	Tue Mar 11 15:46:36 2003
+--- orig/arch/um/drivers/ubd_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/ubd_kern.c	2003-03-11 15:46:36.000000000 -0500
 @@ -0,0 +1,1067 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -10337,9 +10163,9 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/ubd_kern.c um/arch/um/driver
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/ubd_user.c um/arch/um/drivers/ubd_user.c
---- orig/arch/um/drivers/ubd_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/ubd_user.c	Thu Mar  6 18:08:55 2003
-@@ -0,0 +1,626 @@
+--- orig/arch/um/drivers/ubd_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/ubd_user.c	2003-06-05 14:39:22.000000000 -0400
+@@ -0,0 +1,372 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
 + * Copyright (C) 2001 Ridgerun,Inc (glonnon@ridgerun.com)
@@ -10366,128 +10192,10 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/ubd_user.c um/arch/um/driver
 +#include "user.h"
 +#include "ubd_user.h"
 +#include "os.h"
++#include "cow.h"
 +
 +#include <endian.h>
 +#include <byteswap.h>
-+#if __BYTE_ORDER == __BIG_ENDIAN
-+# define ntohll(x) (x)
-+# define htonll(x) (x)
-+#elif __BYTE_ORDER == __LITTLE_ENDIAN
-+# define ntohll(x)  bswap_64(x)
-+# define htonll(x)  bswap_64(x)
-+#else
-+#error "__BYTE_ORDER not defined"
-+#endif
-+
-+#define PATH_LEN_V1 256
-+
-+struct cow_header_v1 {
-+	int magic;
-+	int version;
-+	char backing_file[PATH_LEN_V1];
-+	time_t mtime;
-+	__u64 size;
-+	int sectorsize;
-+};
-+
-+#define PATH_LEN_V2 MAXPATHLEN
-+
-+struct cow_header_v2 {
-+	unsigned long magic;
-+	unsigned long version;
-+	char backing_file[PATH_LEN_V2];
-+	time_t mtime;
-+	__u64 size;
-+	int sectorsize;
-+};
-+
-+union cow_header {
-+	struct cow_header_v1 v1;
-+	struct cow_header_v2 v2;
-+};
-+
-+#define COW_MAGIC 0x4f4f4f4d  /* MOOO */
-+#define COW_VERSION 2
-+
-+static void sizes(__u64 size, int sectorsize, int bitmap_offset, 
-+		  unsigned long *bitmap_len_out, int *data_offset_out)
-+{
-+	*bitmap_len_out = (size + sectorsize - 1) / (8 * sectorsize);
-+
-+	*data_offset_out = bitmap_offset + *bitmap_len_out;
-+	*data_offset_out = (*data_offset_out + sectorsize - 1) / sectorsize;
-+	*data_offset_out *= sectorsize;
-+}
-+
-+static int read_cow_header(int fd, int *magic_out, char **backing_file_out, 
-+			   time_t *mtime_out, __u64 *size_out, 
-+			   int *sectorsize_out, int *bitmap_offset_out)
-+{
-+	union cow_header *header;
-+	char *file;
-+	int err, n;
-+	unsigned long version, magic;
-+
-+	header = um_kmalloc(sizeof(*header));
-+	if(header == NULL){
-+		printk("read_cow_header - Failed to allocate header\n");
-+		return(-ENOMEM);
-+	}
-+	err = -EINVAL;
-+	n = read(fd, header, sizeof(*header));
-+	if(n < offsetof(typeof(header->v1), backing_file)){
-+		printk("read_cow_header - short header\n");
-+		goto out;
-+	}
-+
-+	magic = header->v1.magic;
-+	if(magic == COW_MAGIC) {
-+		version = header->v1.version;
-+	}
-+	else if(magic == ntohl(COW_MAGIC)){
-+		version = ntohl(header->v1.version);
-+	}
-+	else goto out;
-+
-+	*magic_out = COW_MAGIC;
-+
-+	if(version == 1){
-+		if(n < sizeof(header->v1)){
-+			printk("read_cow_header - failed to read V1 header\n");
-+			goto out;
-+		}
-+		*mtime_out = header->v1.mtime;
-+		*size_out = header->v1.size;
-+		*sectorsize_out = header->v1.sectorsize;
-+		*bitmap_offset_out = sizeof(header->v1);
-+		file = header->v1.backing_file;
-+	}
-+	else if(version == 2){
-+		if(n < sizeof(header->v2)){
-+			printk("read_cow_header - failed to read V2 header\n");
-+			goto out;
-+		}
-+		*mtime_out = ntohl(header->v2.mtime);
-+		*size_out = ntohll(header->v2.size);
-+		*sectorsize_out = ntohl(header->v2.sectorsize);
-+		*bitmap_offset_out = sizeof(header->v2);
-+		file = header->v2.backing_file;
-+	}
-+	else {
-+		printk("read_cow_header - invalid COW version\n");
-+		goto out;
-+	}
-+	err = -ENOMEM;
-+	*backing_file_out = uml_strdup(file);
-+	if(*backing_file_out == NULL){
-+		printk("read_cow_header - failed to allocate backing file\n");
-+		goto out;
-+	}
-+	err = 0;
-+ out:
-+	kfree(header);
-+	return(err);
-+}
 +
 +static int same_backing_files(char *from_cmdline, char *from_cow, char *cow)
 +{
@@ -10520,6 +10228,7 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/ubd_user.c um/arch/um/driver
 +	long long actual;
 +	int err;
 +
++	printk("%ld", htonll(size));
 +  	if(stat64(file, &buf) < 0){
 +		printk("Failed to stat backing file \"%s\", errno = %d\n",
 +		       file, errno);
@@ -10557,118 +10266,6 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/ubd_user.c um/arch/um/driver
 +	return(0);
 +}
 +
-+static int absolutize(char *to, int size, char *from)
-+{
-+	char save_cwd[256], *slash;
-+	int remaining;
-+
-+	if(getcwd(save_cwd, sizeof(save_cwd)) == NULL) {
-+		printk("absolutize : unable to get cwd - errno = %d\n", errno);
-+		return(-1);
-+	}
-+	slash = strrchr(from, '/');
-+	if(slash != NULL){
-+		*slash = '\0';
-+		if(chdir(from)){
-+			*slash = '/';
-+			printk("absolutize : Can't cd to '%s' - errno = %d\n",
-+			       from, errno);
-+			return(-1);
-+		}
-+		*slash = '/';
-+		if(getcwd(to, size) == NULL){
-+			printk("absolutize : unable to get cwd of '%s' - "
-+			       "errno = %d\n", from, errno);
-+			return(-1);
-+		}
-+		remaining = size - strlen(to);
-+		if(strlen(slash) + 1 > remaining){
-+			printk("absolutize : unable to fit '%s' into %d "
-+			       "chars\n", from, size);
-+			return(-1);
-+		}
-+		strcat(to, slash);
-+	}
-+	else {
-+		if(strlen(save_cwd) + 1 + strlen(from) + 1 > size){
-+			printk("absolutize : unable to fit '%s' into %d "
-+			       "chars\n", from, size);
-+			return(-1);
-+		}
-+		strcpy(to, save_cwd);
-+		strcat(to, "/");
-+		strcat(to, from);
-+	}
-+	chdir(save_cwd);
-+	return(0);
-+}
-+
-+static int write_cow_header(char *cow_file, int fd, char *backing_file, 
-+			    int sectorsize, long long *size)
-+{
-+        struct cow_header_v2 *header;
-+	struct stat64 buf;
-+	int err;
-+
-+	err = os_seek_file(fd, 0);
-+	if(err != 0){
-+		printk("write_cow_header - lseek failed, errno = %d\n", errno);
-+		return(-errno);
-+	}
-+
-+	err = -ENOMEM;
-+	header = um_kmalloc(sizeof(*header));
-+	if(header == NULL){
-+		printk("Failed to allocate COW V2 header\n");
-+		goto out;
-+	}
-+	header->magic = htonl(COW_MAGIC);
-+	header->version = htonl(COW_VERSION);
-+
-+	err = -EINVAL;
-+	if(strlen(backing_file) > sizeof(header->backing_file) - 1){
-+		printk("Backing file name \"%s\" is too long - names are "
-+		       "limited to %d characters\n", backing_file, 
-+		       sizeof(header->backing_file) - 1);
-+		goto out_free;
-+	}
-+
-+	if(absolutize(header->backing_file, sizeof(header->backing_file), 
-+		      backing_file))
-+		goto out_free;
-+
-+	err = stat64(header->backing_file, &buf);
-+	if(err < 0){
-+		printk("Stat of backing file '%s' failed, errno = %d\n",
-+		       header->backing_file, errno);
-+		err = -errno;
-+		goto out_free;
-+	}
-+
-+	err = os_file_size(header->backing_file, size);
-+	if(err){
-+		printk("Couldn't get size of backing file '%s', errno = %d\n",
-+		       header->backing_file, -*size);
-+		goto out_free;
-+	}
-+
-+	header->mtime = htonl(buf.st_mtime);
-+	header->size = htonll(*size);
-+	header->sectorsize = htonl(sectorsize);
-+
-+	err = write(fd, header, sizeof(*header));
-+	if(err != sizeof(*header)){
-+		printk("Write of header to new COW file '%s' failed, "
-+		       "errno = %d\n", cow_file, errno);
-+		goto out_free;
-+	}
-+	err = 0;
-+ out_free:
-+	kfree(header);
-+ out:
-+	return(err);
-+}
-+
 +int open_ubd_file(char *file, struct openflags *openflags, 
 +		  char **backing_file_out, int *bitmap_offset_out, 
 +		  unsigned long *bitmap_len_out, int *data_offset_out, 
@@ -10725,8 +10322,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/ubd_user.c um/arch/um/driver
 +		if(err) goto error;
 +	}
 +
-+	sizes(size, sectorsize, *bitmap_offset_out, bitmap_len_out, 
-+	      data_offset_out);
++	cow_sizes(size, sectorsize, *bitmap_offset_out, bitmap_len_out, 
++		  data_offset_out);
 +
 +        return(fd);
 + error:
@@ -10738,10 +10335,7 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/ubd_user.c um/arch/um/driver
 +		    int sectorsize, int *bitmap_offset_out, 
 +		    unsigned long *bitmap_len_out, int *data_offset_out)
 +{
-+	__u64 offset;
 +	int err, fd;
-+	long long size;
-+	char zero = 0;
 +
 +	flags.c = 1;
 +	fd = open_ubd_file(cow_file, &flags, NULL, NULL, NULL, NULL, NULL);
@@ -10752,35 +10346,13 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/ubd_user.c um/arch/um/driver
 +		goto out;
 +	}
 +
-+	err = write_cow_header(cow_file, fd, backing_file, sectorsize, &size);
-+	if(err) goto out_close;
-+
-+	sizes(size, sectorsize, sizeof(struct cow_header_v2), 
-+	      bitmap_len_out, data_offset_out);
-+	*bitmap_offset_out = sizeof(struct cow_header_v2);
-+
-+	offset = *data_offset_out + size - sizeof(zero);
-+	err = os_seek_file(fd, offset);
-+	if(err != 0){
-+		printk("cow bitmap lseek failed : errno = %d\n", errno);
-+		goto out_close;
-+	}
-+
-+	/* does not really matter how much we write it is just to set EOF 
-+	 * this also sets the entire COW bitmap
-+	 * to zero without having to allocate it 
-+	 */
-+	err = os_write_file(fd, &zero, sizeof(zero));
-+	if(err != sizeof(zero)){
-+		printk("Write of bitmap to new COW file '%s' failed, "
-+		       "errno = %d\n", cow_file, errno);
-+		goto out_close;
-+	}
-+
-+	return(fd);
++	err = init_cow_file(fd, cow_file, backing_file, sectorsize, 
++			    bitmap_offset_out, bitmap_len_out, 
++			    data_offset_out);
++	if(!err)
++		return(fd);
 +
-+ out_close:
-+	close(fd);
++	os_close_file(fd);
 + out:
 +	return(err);
 +}
@@ -10967,8 +10539,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/ubd_user.c um/arch/um/driver
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/xterm.c um/arch/um/drivers/xterm.c
---- orig/arch/um/drivers/xterm.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/xterm.c	Mon Dec 30 20:49:22 2002
+--- orig/arch/um/drivers/xterm.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/xterm.c	2002-12-30 20:49:22.000000000 -0500
 @@ -0,0 +1,200 @@
 +/* 
 + * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -11171,8 +10743,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/xterm.c um/arch/um/drivers/x
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/xterm.h um/arch/um/drivers/xterm.h
---- orig/arch/um/drivers/xterm.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/xterm.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/drivers/xterm.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/xterm.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,22 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -11197,8 +10769,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/xterm.h um/arch/um/drivers/x
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/drivers/xterm_kern.c um/arch/um/drivers/xterm_kern.c
---- orig/arch/um/drivers/xterm_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/drivers/xterm_kern.c	Tue Dec 17 17:31:20 2002
+--- orig/arch/um/drivers/xterm_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/drivers/xterm_kern.c	2002-12-17 17:31:20.000000000 -0500
 @@ -0,0 +1,79 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -11280,8 +10852,8 @@ diff -Naur -X ../exclude-files orig/arch/um/drivers/xterm_kern.c um/arch/um/driv
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/dyn_link.ld.in um/arch/um/dyn_link.ld.in
---- orig/arch/um/dyn_link.ld.in	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/dyn_link.ld.in	Fri Jan 17 23:37:27 2003
+--- orig/arch/um/dyn_link.ld.in	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/dyn_link.ld.in	2003-01-17 23:37:27.000000000 -0500
 @@ -0,0 +1,172 @@
 +OUTPUT_FORMAT("ELF_FORMAT")
 +OUTPUT_ARCH(ELF_ARCH)
@@ -11455,64 +11027,9 @@ diff -Naur -X ../exclude-files orig/arch/um/dyn_link.ld.in um/arch/um/dyn_link.l
 +  .debug_typenames 0 : { *(.debug_typenames) }
 +  .debug_varnames  0 : { *(.debug_varnames) }
 +}
-diff -Naur -X ../exclude-files orig/arch/um/fs/Makefile um/arch/um/fs/Makefile
---- orig/arch/um/fs/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/fs/Makefile	Wed Oct 23 21:08:04 2002
-@@ -0,0 +1,23 @@
-+# 
-+# Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
-+# Licensed under the GPL
-+#
-+
-+O_TARGET := built-in.o
-+
-+subdir-y =
-+subdir-m =
-+
-+subdir-$(CONFIG_HOSTFS) += hostfs
-+subdir-$(CONFIG_HPPFS) += hppfs
-+
-+obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o))
-+obj-m += $(join $(subdir-m),$(subdir-m:%=/%.o))
-+
-+include $(TOPDIR)/Rules.make
-+
-+dep:
-+
-+clean:
-+
-+archmrproper:
-diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/Makefile um/arch/um/fs/hostfs/Makefile
---- orig/arch/um/fs/hostfs/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/fs/hostfs/Makefile	Wed Oct 23 21:08:04 2002
-@@ -0,0 +1,24 @@
-+# 
-+# Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
-+# Licensed under the GPL
-+#
-+
-+# struct stat64 changed the inode field name between 2.2 and 2.4 from st_ino
-+# to __st_ino.  It stayed in the same place, so as long as the correct name
-+# is used, hostfs compiled on 2.2 should work on 2.4 and vice versa.
-+
-+STAT64_INO_FIELD := $(shell grep -q __st_ino /usr/include/bits/stat.h && \
-+				echo __)st_ino
-+
-+USER_CFLAGS := $(USER_CFLAGS) -DSTAT64_INO_FIELD=$(STAT64_INO_FIELD)
-+
-+O_TARGET := hostfs.o
-+obj-y = hostfs_kern.o hostfs_user.o
-+obj-m = $(O_TARGET)
-+
-+USER_OBJS = $(filter %_user.o,$(obj-y))
-+
-+include $(TOPDIR)/Rules.make
-+
-+$(USER_OBJS) : %.o: %.c
-+	$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $<
 diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs.h um/arch/um/fs/hostfs/hostfs.h
---- orig/arch/um/fs/hostfs/hostfs.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/fs/hostfs/hostfs.h	Mon Feb 24 23:00:47 2003
+--- orig/arch/um/fs/hostfs/hostfs.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/fs/hostfs/hostfs.h	2003-05-22 11:03:20.000000000 -0400
 @@ -0,0 +1,69 @@
 +#ifndef __UM_FS_HOSTFS
 +#define __UM_FS_HOSTFS
@@ -11554,7 +11071,7 @@ diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs.h um/arch/um/fs/hos
 +		     unsigned long *mtime_out, unsigned long *ctime_out, 
 +		     int *blksize_out, unsigned long long *blocks_out);
 +extern int access_file(char *path, int r, int w, int x);
-+extern int open_file(char *path, int r, int w);
++extern int open_file(char *path, int r, int w, int append);
 +extern int file_type(const char *path, int *rdev);
 +extern void *open_dir(char *path, int *err_out);
 +extern char *read_dir(void *stream, unsigned long long *pos, 
@@ -11584,9 +11101,9 @@ diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs.h um/arch/um/fs/hos
 +
 +#endif
 diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs_kern.c um/arch/um/fs/hostfs/hostfs_kern.c
---- orig/arch/um/fs/hostfs/hostfs_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/fs/hostfs/hostfs_kern.c	Sun Apr 13 21:29:33 2003
-@@ -0,0 +1,870 @@
+--- orig/arch/um/fs/hostfs/hostfs_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/fs/hostfs/hostfs_kern.c	2003-05-22 11:26:25.000000000 -0400
+@@ -0,0 +1,923 @@
 +/* 
 + * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com)
 + * Licensed under the GPL
@@ -11606,6 +11123,7 @@ diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs_kern.c um/arch/um/f
 +#include "kern.h"
 +#include "user_util.h"
 +#include "2_5compat.h"
++#include "init.h"
 +
 +#define file_hostfs_i(file) (&(file)->f_dentry->d_inode->u.hostfs_i)
 +
@@ -11618,8 +11136,9 @@ diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs_kern.c um/arch/um/f
 +	.d_delete		= hostfs_d_delete,
 +};
 +
-+/* Not changed */
++/* Changed in hostfs_args before the kernel starts running */
 +static char *root_ino = "/";
++static int append = 0;
 +
 +#define HOSTFS_SUPER_MAGIC 0x00c0ffee
 +
@@ -11627,6 +11146,43 @@ diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs_kern.c um/arch/um/f
 +static struct inode_operations hostfs_dir_iops;
 +static struct address_space_operations hostfs_link_aops;
 +
++static int __init hostfs_args(char *options, int *add)
++{
++	char *ptr;
++
++	ptr = strchr(options, ',');
++	if(ptr != NULL)
++		*ptr++ = '\0';
++	if(*options != '\0')
++		root_ino = options;
++
++	options = ptr;
++	while(options){
++		ptr = strchr(options, ',');
++		if(ptr != NULL)
++			*ptr++ = '\0';
++		if(*options != '\0'){
++			if(!strcmp(options, "append"))
++				append = 1;
++			else printf("hostfs_args - unsupported option - %s\n",
++				    options);
++		}
++		options = ptr;
++	}
++	return(0);
++}
++
++__uml_setup("hostfs=", hostfs_args,
++"hostfs=<root dir>,<flags>,...\n"
++"    This is used to set hostfs parameters.  The root directory argument\n"
++"    is used to confine all hostfs mounts to within the specified directory\n"
++"    tree on the host.  If this isn't specified, then a user inside UML can\n"
++"    mount anything on the host that's accessible to the user that's running\n"
++"    it.\n"
++"    The only flag currently supported is 'append', which specifies that all\n"
++"    files opened by hostfs will be opened in append mode.\n\n"
++);
++
 +static char *dentry_name(struct dentry *dentry, int extra)
 +{
 +	struct dentry *parent;
@@ -11863,7 +11419,7 @@ diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs_kern.c um/arch/um/f
 +	if(name == NULL) 
 +		return(-ENOMEM);
 +
-+	fd = open_file(name, r, w);
++	fd = open_file(name, r, w, append);
 +	kfree(name);
 +	if(fd < 0) return(fd);
 +	file_hostfs_i(file)->fd = fd;
@@ -11952,6 +11508,8 @@ diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs_kern.c um/arch/um/f
 +			PAGE_CACHE_SIZE);
 +	if(err < 0) goto out;
 +
++	memset(&buffer[err], 0, PAGE_CACHE_SIZE - err);
++
 +	flush_dcache_page(page);
 +	SetPageUptodate(page);
 +	if (PageError(page)) ClearPageError(page);
@@ -12013,6 +11571,7 @@ diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs_kern.c um/arch/um/f
 +static struct address_space_operations hostfs_aops = {
 +	.writepage 	= hostfs_writepage,
 +	.readpage	= hostfs_readpage,
++/* 	.set_page_dirty = __set_page_dirty_nobuffers, */
 +	.prepare_write	= hostfs_prepare_write,
 +	.commit_write	= hostfs_commit_write
 +};
@@ -12086,7 +11645,7 @@ diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs_kern.c um/arch/um/f
 +{
 +	struct inode *inode;
 +	char *name;
-+	int error;
++	int error, fd;
 +
 +	inode = get_inode(dir->i_sb, dentry, &error);
 +	if(error) return(error);
@@ -12095,16 +11654,21 @@ diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs_kern.c um/arch/um/f
 +		iput(inode);
 +		return(-ENOMEM);
 +	}
-+	error = file_create(name, 
-+			    mode & S_IRUSR, mode & S_IWUSR, mode & S_IXUSR, 
-+			    mode & S_IRGRP, mode & S_IWGRP, mode & S_IXGRP, 
-+			    mode & S_IROTH, mode & S_IWOTH, mode & S_IXOTH);
-+	if(!error) error = read_name(inode, name);
++	fd = file_create(name, 
++			 mode & S_IRUSR, mode & S_IWUSR, mode & S_IXUSR, 
++			 mode & S_IRGRP, mode & S_IWGRP, mode & S_IXGRP, 
++			 mode & S_IROTH, mode & S_IWOTH, mode & S_IXOTH);
++	if(fd < 0) 
++		error = fd;
++	else error = read_name(inode, name);
++
 +	kfree(name);
 +	if(error){
 +		iput(inode);
 +		return(error);
 +	}
++	inode->u.hostfs_i.fd = fd;
++	inode->u.hostfs_i.mode = FMODE_READ | FMODE_WRITE;
 +	d_instantiate(dentry, inode);
 +	return(0);
 +}
@@ -12169,6 +11733,9 @@ diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs_kern.c um/arch/um/f
 +	int err;
 +
 +	if((file = inode_dentry_name(ino, dentry)) == NULL) return(-ENOMEM);
++	if(append)
++		return(-EPERM);
++
 +	err = unlink_file(file);
 +	kfree(file);
 +	return(err);
@@ -12276,6 +11843,9 @@ diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs_kern.c um/arch/um/f
 +	struct hostfs_iattr attrs;
 +	char *name;
 +	int err;
++	
++	if(append) 
++		attr->ia_valid &= ~ATTR_SIZE;
 +
 +	attrs.ia_valid = 0;
 +	if(attr->ia_valid & ATTR_MODE){
@@ -12458,9 +12028,9 @@ diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs_kern.c um/arch/um/f
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs_user.c um/arch/um/fs/hostfs/hostfs_user.c
---- orig/arch/um/fs/hostfs/hostfs_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/fs/hostfs/hostfs_user.c	Fri Jan 31 21:48:30 2003
-@@ -0,0 +1,341 @@
+--- orig/arch/um/fs/hostfs/hostfs_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/fs/hostfs/hostfs_user.c	2003-05-22 11:06:46.000000000 -0400
+@@ -0,0 +1,347 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
 + * Licensed under the GPL
@@ -12538,14 +12108,20 @@ diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs_user.c um/arch/um/f
 +	else return(0);
 +}
 +
-+int open_file(char *path, int r, int w)
++int open_file(char *path, int r, int w, int append)
 +{
 +	int mode = 0, fd;
 +
-+	if(r && !w) mode = O_RDONLY;
-+	else if(!r && w) mode = O_WRONLY;
-+	else if(r && w) mode = O_RDWR;
++	if(r && !w) 
++		mode = O_RDONLY;
++	else if(!r && w) 
++		mode = O_WRONLY;
++	else if(r && w) 
++		mode = O_RDWR;
 +	else panic("Impossible mode in open_file");
++
++	if(append)
++		mode |= O_APPEND;
 +	fd = open64(path, mode);
 +	if(fd < 0) return(-errno);
 +	else return(fd);
@@ -12630,10 +12206,10 @@ diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs_user.c um/arch/um/f
 +	mode |= or ? S_IROTH : 0;
 +	mode |= ow ? S_IWOTH : 0;
 +	mode |= ox ? S_IXOTH : 0;
-+	fd = open64(name, O_CREAT, mode);
-+	if(fd < 0) return(-errno);
-+	close(fd);
-+	return(0);
++	fd = open64(name, O_CREAT | O_RDWR, mode);
++	if(fd < 0) 
++		return(-errno);
++	return(fd);
 +}
 +
 +int set_attr(const char *file, struct hostfs_iattr *attrs)
@@ -12802,23 +12378,37 @@ diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs_user.c um/arch/um/f
 + * c-file-style: "linux"
 + * End:
 + */
-diff -Naur -X ../exclude-files orig/arch/um/fs/hppfs/Makefile um/arch/um/fs/hppfs/Makefile
---- orig/arch/um/fs/hppfs/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/fs/hppfs/Makefile	Wed Oct 23 21:08:04 2002
-@@ -0,0 +1,10 @@
-+O_TARGET := hppfs.o
-+obj-y = hppfs_kern.o #hppfs_user.o
-+obj-m = $(O_TARGET)
+diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/Makefile um/arch/um/fs/hostfs/Makefile
+--- orig/arch/um/fs/hostfs/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/fs/hostfs/Makefile	2002-10-23 21:08:04.000000000 -0400
+@@ -0,0 +1,24 @@
++# 
++# Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
++# Licensed under the GPL
++#
 +
-+CFLAGS_hppfs_kern.o := $(CFLAGS)
-+#CFLAGS_hppfs_user.o := $(USER_CFLAGS)
++# struct stat64 changed the inode field name between 2.2 and 2.4 from st_ino
++# to __st_ino.  It stayed in the same place, so as long as the correct name
++# is used, hostfs compiled on 2.2 should work on 2.4 and vice versa.
 +
-+override CFLAGS =  
++STAT64_INO_FIELD := $(shell grep -q __st_ino /usr/include/bits/stat.h && \
++				echo __)st_ino
++
++USER_CFLAGS := $(USER_CFLAGS) -DSTAT64_INO_FIELD=$(STAT64_INO_FIELD)
++
++O_TARGET := hostfs.o
++obj-y = hostfs_kern.o hostfs_user.o
++obj-m = $(O_TARGET)
++
++USER_OBJS = $(filter %_user.o,$(obj-y))
 +
 +include $(TOPDIR)/Rules.make
++
++$(USER_OBJS) : %.o: %.c
++	$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $<
 diff -Naur -X ../exclude-files orig/arch/um/fs/hppfs/hppfs_kern.c um/arch/um/fs/hppfs/hppfs_kern.c
---- orig/arch/um/fs/hppfs/hppfs_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/fs/hppfs/hppfs_kern.c	Thu Feb 27 13:14:26 2003
+--- orig/arch/um/fs/hppfs/hppfs_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/fs/hppfs/hppfs_kern.c	2003-02-27 13:14:26.000000000 -0500
 @@ -0,0 +1,725 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -13545,9 +13135,50 @@ diff -Naur -X ../exclude-files orig/arch/um/fs/hppfs/hppfs_kern.c um/arch/um/fs/
 + * c-file-style: "linux"
 + * End:
 + */
+diff -Naur -X ../exclude-files orig/arch/um/fs/hppfs/Makefile um/arch/um/fs/hppfs/Makefile
+--- orig/arch/um/fs/hppfs/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/fs/hppfs/Makefile	2002-10-23 21:08:04.000000000 -0400
+@@ -0,0 +1,10 @@
++O_TARGET := hppfs.o
++obj-y = hppfs_kern.o #hppfs_user.o
++obj-m = $(O_TARGET)
++
++CFLAGS_hppfs_kern.o := $(CFLAGS)
++#CFLAGS_hppfs_user.o := $(USER_CFLAGS)
++
++override CFLAGS =  
++
++include $(TOPDIR)/Rules.make
+diff -Naur -X ../exclude-files orig/arch/um/fs/Makefile um/arch/um/fs/Makefile
+--- orig/arch/um/fs/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/fs/Makefile	2002-10-23 21:08:04.000000000 -0400
+@@ -0,0 +1,23 @@
++# 
++# Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
++# Licensed under the GPL
++#
++
++O_TARGET := built-in.o
++
++subdir-y =
++subdir-m =
++
++subdir-$(CONFIG_HOSTFS) += hostfs
++subdir-$(CONFIG_HPPFS) += hppfs
++
++obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o))
++obj-m += $(join $(subdir-m),$(subdir-m:%=/%.o))
++
++include $(TOPDIR)/Rules.make
++
++dep:
++
++clean:
++
++archmrproper:
 diff -Naur -X ../exclude-files orig/arch/um/include/2_5compat.h um/arch/um/include/2_5compat.h
---- orig/arch/um/include/2_5compat.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/2_5compat.h	Thu Feb 27 20:15:19 2003
+--- orig/arch/um/include/2_5compat.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/2_5compat.h	2003-02-27 20:15:19.000000000 -0500
 @@ -0,0 +1,46 @@
 +/* 
 + * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
@@ -13595,20 +13226,9 @@ diff -Naur -X ../exclude-files orig/arch/um/include/2_5compat.h um/arch/um/inclu
 + * c-file-style: "linux"
 + * End:
 + */
-diff -Naur -X ../exclude-files orig/arch/um/include/Makefile um/arch/um/include/Makefile
---- orig/arch/um/include/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/Makefile	Wed Oct 23 21:08:04 2002
-@@ -0,0 +1,7 @@
-+all : sc.h
-+
-+sc.h : ../util/mk_sc
-+	../util/mk_sc > $@
-+
-+../util/mk_sc :
-+	$(MAKE) -C ../util mk_sc
 diff -Naur -X ../exclude-files orig/arch/um/include/chan_kern.h um/arch/um/include/chan_kern.h
---- orig/arch/um/include/chan_kern.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/chan_kern.h	Fri Nov 15 13:32:35 2002
+--- orig/arch/um/include/chan_kern.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/chan_kern.h	2002-11-15 13:32:35.000000000 -0500
 @@ -0,0 +1,56 @@
 +/* 
 + * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com)
@@ -13667,8 +13287,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/chan_kern.h um/arch/um/inclu
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/chan_user.h um/arch/um/include/chan_user.h
---- orig/arch/um/include/chan_user.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/chan_user.h	Wed Nov  6 16:44:00 2002
+--- orig/arch/um/include/chan_user.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/chan_user.h	2002-11-06 16:44:00.000000000 -0500
 @@ -0,0 +1,66 @@
 +/* 
 + * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com)
@@ -13737,8 +13357,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/chan_user.h um/arch/um/inclu
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/choose-mode.h um/arch/um/include/choose-mode.h
---- orig/arch/um/include/choose-mode.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/choose-mode.h	Fri Jan 17 13:23:32 2003
+--- orig/arch/um/include/choose-mode.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/choose-mode.h	2003-01-17 13:23:32.000000000 -0500
 @@ -0,0 +1,35 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -13776,8 +13396,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/choose-mode.h um/arch/um/inc
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/frame.h um/arch/um/include/frame.h
---- orig/arch/um/include/frame.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/frame.h	Mon Dec  2 21:43:03 2002
+--- orig/arch/um/include/frame.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/frame.h	2002-12-02 21:43:03.000000000 -0500
 @@ -0,0 +1,53 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -13833,8 +13453,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/frame.h um/arch/um/include/f
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/frame_kern.h um/arch/um/include/frame_kern.h
---- orig/arch/um/include/frame_kern.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/frame_kern.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/frame_kern.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/frame_kern.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,34 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -13871,8 +13491,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/frame_kern.h um/arch/um/incl
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/frame_user.h um/arch/um/include/frame_user.h
---- orig/arch/um/include/frame_user.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/frame_user.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/frame_user.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/frame_user.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,23 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -13898,8 +13518,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/frame_user.h um/arch/um/incl
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/helper.h um/arch/um/include/helper.h
---- orig/arch/um/include/helper.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/helper.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/helper.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/helper.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,27 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -13929,8 +13549,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/helper.h um/arch/um/include/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/hostaudio.h um/arch/um/include/hostaudio.h
---- orig/arch/um/include/hostaudio.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/hostaudio.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/hostaudio.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/hostaudio.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,48 @@
 +/* 
 + * Copyright (C) 2002 Steve Schmidtke 
@@ -13981,8 +13601,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/hostaudio.h um/arch/um/inclu
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/init.h um/arch/um/include/init.h
---- orig/arch/um/include/init.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/init.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/init.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/init.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,114 @@
 +#ifndef _LINUX_UML_INIT_H
 +#define _LINUX_UML_INIT_H
@@ -14099,8 +13719,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/init.h um/arch/um/include/in
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/initrd.h um/arch/um/include/initrd.h
---- orig/arch/um/include/initrd.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/initrd.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/initrd.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/initrd.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,22 @@
 +/*
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -14124,9 +13744,40 @@ diff -Naur -X ../exclude-files orig/arch/um/include/initrd.h um/arch/um/include/
 + * c-file-style: "linux"
 + * End:
 + */
+diff -Naur -X ../exclude-files orig/arch/um/include/irq_kern.h um/arch/um/include/irq_kern.h
+--- orig/arch/um/include/irq_kern.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/irq_kern.h	2003-05-15 13:57:48.000000000 -0400
+@@ -0,0 +1,27 @@
++/* 
++ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
++ * Licensed under the GPL
++ */
++
++#ifndef __IRQ_KERN_H__
++#define __IRQ_KERN_H__
++
++#include "linux/interrupt.h"
++
++extern int um_request_irq(unsigned int irq, int fd, int type,
++			  void (*handler)(int, void *, struct pt_regs *),
++			  unsigned long irqflags,  const char * devname,
++			  void *dev_id);
++
++#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-file-style: "linux"
++ * End:
++ */
 diff -Naur -X ../exclude-files orig/arch/um/include/irq_user.h um/arch/um/include/irq_user.h
---- orig/arch/um/include/irq_user.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/irq_user.h	Sun Dec  8 20:38:42 2002
+--- orig/arch/um/include/irq_user.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/irq_user.h	2002-12-08 20:38:42.000000000 -0500
 @@ -0,0 +1,35 @@
 +/* 
 + * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -14164,8 +13815,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/irq_user.h um/arch/um/includ
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/kern.h um/arch/um/include/kern.h
---- orig/arch/um/include/kern.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/kern.h	Sat Nov  2 21:38:02 2002
+--- orig/arch/um/include/kern.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/kern.h	2002-11-02 21:38:02.000000000 -0500
 @@ -0,0 +1,48 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -14216,8 +13867,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/kern.h um/arch/um/include/ke
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/kern_util.h um/arch/um/include/kern_util.h
---- orig/arch/um/include/kern_util.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/kern_util.h	Wed Apr 16 16:00:11 2003
+--- orig/arch/um/include/kern_util.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/kern_util.h	2003-04-16 16:00:11.000000000 -0400
 @@ -0,0 +1,121 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -14341,8 +13992,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/kern_util.h um/arch/um/inclu
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/line.h um/arch/um/include/line.h
---- orig/arch/um/include/line.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/line.h	Fri Nov 15 13:44:44 2002
+--- orig/arch/um/include/line.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/line.h	2002-11-15 13:44:44.000000000 -0500
 @@ -0,0 +1,106 @@
 +/* 
 + * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -14450,9 +14101,20 @@ diff -Naur -X ../exclude-files orig/arch/um/include/line.h um/arch/um/include/li
 + * c-file-style: "linux"
 + * End:
 + */
+diff -Naur -X ../exclude-files orig/arch/um/include/Makefile um/arch/um/include/Makefile
+--- orig/arch/um/include/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/Makefile	2002-10-23 21:08:04.000000000 -0400
+@@ -0,0 +1,7 @@
++all : sc.h
++
++sc.h : ../util/mk_sc
++	../util/mk_sc > $@
++
++../util/mk_sc :
++	$(MAKE) -C ../util mk_sc
 diff -Naur -X ../exclude-files orig/arch/um/include/mconsole.h um/arch/um/include/mconsole.h
---- orig/arch/um/include/mconsole.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/mconsole.h	Fri Jan 17 13:48:25 2003
+--- orig/arch/um/include/mconsole.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/mconsole.h	2003-01-17 13:48:25.000000000 -0500
 @@ -0,0 +1,99 @@
 +/*
 + * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org)
@@ -14554,8 +14216,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/mconsole.h um/arch/um/includ
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/mconsole_kern.h um/arch/um/include/mconsole_kern.h
---- orig/arch/um/include/mconsole_kern.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/mconsole_kern.h	Fri Nov 15 15:21:58 2002
+--- orig/arch/um/include/mconsole_kern.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/mconsole_kern.h	2002-11-15 15:21:58.000000000 -0500
 @@ -0,0 +1,62 @@
 +/*
 + * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -14620,8 +14282,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/mconsole_kern.h um/arch/um/i
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/mem.h um/arch/um/include/mem.h
---- orig/arch/um/include/mem.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/mem.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/mem.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/mem.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,29 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -14653,8 +14315,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/mem.h um/arch/um/include/mem
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/mem_user.h um/arch/um/include/mem_user.h
---- orig/arch/um/include/mem_user.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/mem_user.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/mem_user.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/mem_user.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,87 @@
 +/*
 + * arch/um/include/mem_user.h
@@ -14744,8 +14406,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/mem_user.h um/arch/um/includ
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/mode.h um/arch/um/include/mode.h
---- orig/arch/um/include/mode.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/mode.h	Fri Jan 17 13:23:32 2003
+--- orig/arch/um/include/mode.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/mode.h	2003-01-17 13:23:32.000000000 -0500
 @@ -0,0 +1,30 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -14778,8 +14440,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/mode.h um/arch/um/include/mo
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/mode_kern.h um/arch/um/include/mode_kern.h
---- orig/arch/um/include/mode_kern.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/mode_kern.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/mode_kern.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/mode_kern.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,30 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -14812,8 +14474,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/mode_kern.h um/arch/um/inclu
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/net_kern.h um/arch/um/include/net_kern.h
---- orig/arch/um/include/net_kern.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/net_kern.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/net_kern.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/net_kern.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,81 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -14897,8 +14559,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/net_kern.h um/arch/um/includ
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/net_user.h um/arch/um/include/net_user.h
---- orig/arch/um/include/net_user.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/net_user.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/net_user.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/net_user.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,66 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -14967,8 +14629,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/net_user.h um/arch/um/includ
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/os.h um/arch/um/include/os.h
---- orig/arch/um/include/os.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/os.h	Tue Feb  4 19:11:32 2003
+--- orig/arch/um/include/os.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/os.h	2003-02-04 19:11:32.000000000 -0500
 @@ -0,0 +1,137 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -15108,8 +14770,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/os.h um/arch/um/include/os.h
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/process.h um/arch/um/include/process.h
---- orig/arch/um/include/process.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/process.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/process.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/process.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,25 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -15137,8 +14799,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/process.h um/arch/um/include
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/ptrace_user.h um/arch/um/include/ptrace_user.h
---- orig/arch/um/include/ptrace_user.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/ptrace_user.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/ptrace_user.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/ptrace_user.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,18 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -15159,8 +14821,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/ptrace_user.h um/arch/um/inc
 +
 +#endif
 diff -Naur -X ../exclude-files orig/arch/um/include/sigcontext.h um/arch/um/include/sigcontext.h
---- orig/arch/um/include/sigcontext.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/sigcontext.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/sigcontext.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/sigcontext.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,25 @@
 +/* 
 + * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -15188,8 +14850,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/sigcontext.h um/arch/um/incl
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/sigio.h um/arch/um/include/sigio.h
---- orig/arch/um/include/sigio.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/sigio.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/sigio.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/sigio.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,28 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -15220,8 +14882,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/sigio.h um/arch/um/include/s
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/signal_kern.h um/arch/um/include/signal_kern.h
---- orig/arch/um/include/signal_kern.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/signal_kern.h	Thu Dec  5 18:08:47 2002
+--- orig/arch/um/include/signal_kern.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/signal_kern.h	2002-12-05 18:08:47.000000000 -0500
 @@ -0,0 +1,22 @@
 +/* 
 + * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -15246,8 +14908,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/signal_kern.h um/arch/um/inc
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/signal_user.h um/arch/um/include/signal_user.h
---- orig/arch/um/include/signal_user.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/signal_user.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/signal_user.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/signal_user.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,26 @@
 +/* 
 + * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
@@ -15276,8 +14938,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/signal_user.h um/arch/um/inc
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/skas_ptrace.h um/arch/um/include/skas_ptrace.h
---- orig/arch/um/include/skas_ptrace.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/skas_ptrace.h	Mon Dec 16 11:54:52 2002
+--- orig/arch/um/include/skas_ptrace.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/skas_ptrace.h	2002-12-16 11:54:52.000000000 -0500
 @@ -0,0 +1,36 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -15316,8 +14978,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/skas_ptrace.h um/arch/um/inc
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/syscall_user.h um/arch/um/include/syscall_user.h
---- orig/arch/um/include/syscall_user.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/syscall_user.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/syscall_user.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/syscall_user.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,23 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -15343,8 +15005,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/syscall_user.h um/arch/um/in
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/checksum.h um/arch/um/include/sysdep-i386/checksum.h
---- orig/arch/um/include/sysdep-i386/checksum.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/sysdep-i386/checksum.h	Tue Oct 29 21:23:02 2002
+--- orig/arch/um/include/sysdep-i386/checksum.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/sysdep-i386/checksum.h	2002-10-29 21:23:02.000000000 -0500
 @@ -0,0 +1,217 @@
 +/* 
 + * Licensed under the GPL
@@ -15564,8 +15226,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/checksum.h um/ar
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/frame.h um/arch/um/include/sysdep-i386/frame.h
---- orig/arch/um/include/sysdep-i386/frame.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/sysdep-i386/frame.h	Fri Dec  6 14:07:54 2002
+--- orig/arch/um/include/sysdep-i386/frame.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/sysdep-i386/frame.h	2002-12-06 14:07:54.000000000 -0500
 @@ -0,0 +1,29 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -15597,8 +15259,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/frame.h um/arch/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/frame_kern.h um/arch/um/include/sysdep-i386/frame_kern.h
---- orig/arch/um/include/sysdep-i386/frame_kern.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/sysdep-i386/frame_kern.h	Mon Dec  2 21:45:04 2002
+--- orig/arch/um/include/sysdep-i386/frame_kern.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/sysdep-i386/frame_kern.h	2002-12-02 21:45:04.000000000 -0500
 @@ -0,0 +1,69 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -15670,8 +15332,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/frame_kern.h um/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/frame_user.h um/arch/um/include/sysdep-i386/frame_user.h
---- orig/arch/um/include/sysdep-i386/frame_user.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/sysdep-i386/frame_user.h	Fri Dec  6 14:13:59 2002
+--- orig/arch/um/include/sysdep-i386/frame_user.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/sysdep-i386/frame_user.h	2002-12-06 14:13:59.000000000 -0500
 @@ -0,0 +1,91 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -15765,8 +15427,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/frame_user.h um/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/ptrace.h um/arch/um/include/sysdep-i386/ptrace.h
---- orig/arch/um/include/sysdep-i386/ptrace.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/sysdep-i386/ptrace.h	Fri Jan 17 13:23:31 2003
+--- orig/arch/um/include/sysdep-i386/ptrace.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/sysdep-i386/ptrace.h	2003-01-17 13:23:31.000000000 -0500
 @@ -0,0 +1,193 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -15962,8 +15624,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/ptrace.h um/arch
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/ptrace_user.h um/arch/um/include/sysdep-i386/ptrace_user.h
---- orig/arch/um/include/sysdep-i386/ptrace_user.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/sysdep-i386/ptrace_user.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/sysdep-i386/ptrace_user.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/sysdep-i386/ptrace_user.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,62 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -16028,8 +15690,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/ptrace_user.h um
 +
 +#endif
 diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/sigcontext.h um/arch/um/include/sysdep-i386/sigcontext.h
---- orig/arch/um/include/sysdep-i386/sigcontext.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/sysdep-i386/sigcontext.h	Sun Dec  8 18:21:33 2002
+--- orig/arch/um/include/sysdep-i386/sigcontext.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/sysdep-i386/sigcontext.h	2002-12-08 18:21:33.000000000 -0500
 @@ -0,0 +1,49 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -16081,8 +15743,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/sigcontext.h um/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/syscalls.h um/arch/um/include/sysdep-i386/syscalls.h
---- orig/arch/um/include/sysdep-i386/syscalls.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/sysdep-i386/syscalls.h	Sun Dec  8 18:04:15 2002
+--- orig/arch/um/include/sysdep-i386/syscalls.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/sysdep-i386/syscalls.h	2002-12-08 18:04:15.000000000 -0500
 @@ -0,0 +1,61 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -16146,8 +15808,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/syscalls.h um/ar
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-ia64/ptrace.h um/arch/um/include/sysdep-ia64/ptrace.h
---- orig/arch/um/include/sysdep-ia64/ptrace.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/sysdep-ia64/ptrace.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/sysdep-ia64/ptrace.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/sysdep-ia64/ptrace.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,26 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -16176,8 +15838,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-ia64/ptrace.h um/arch
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-ia64/sigcontext.h um/arch/um/include/sysdep-ia64/sigcontext.h
---- orig/arch/um/include/sysdep-ia64/sigcontext.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/sysdep-ia64/sigcontext.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/sysdep-ia64/sigcontext.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/sysdep-ia64/sigcontext.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,20 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -16200,8 +15862,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-ia64/sigcontext.h um/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-ia64/syscalls.h um/arch/um/include/sysdep-ia64/syscalls.h
---- orig/arch/um/include/sysdep-ia64/syscalls.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/sysdep-ia64/syscalls.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/sysdep-ia64/syscalls.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/sysdep-ia64/syscalls.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,20 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -16224,8 +15886,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-ia64/syscalls.h um/ar
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-ppc/ptrace.h um/arch/um/include/sysdep-ppc/ptrace.h
---- orig/arch/um/include/sysdep-ppc/ptrace.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/sysdep-ppc/ptrace.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/sysdep-ppc/ptrace.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/sysdep-ppc/ptrace.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,104 @@
 +/* 
 + * Licensed under the GPL
@@ -16332,8 +15994,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-ppc/ptrace.h um/arch/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-ppc/sigcontext.h um/arch/um/include/sysdep-ppc/sigcontext.h
---- orig/arch/um/include/sysdep-ppc/sigcontext.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/sysdep-ppc/sigcontext.h	Sat Nov 23 22:02:19 2002
+--- orig/arch/um/include/sysdep-ppc/sigcontext.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/sysdep-ppc/sigcontext.h	2002-11-23 22:02:19.000000000 -0500
 @@ -0,0 +1,62 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -16398,8 +16060,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-ppc/sigcontext.h um/a
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-ppc/syscalls.h um/arch/um/include/sysdep-ppc/syscalls.h
---- orig/arch/um/include/sysdep-ppc/syscalls.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/sysdep-ppc/syscalls.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/sysdep-ppc/syscalls.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/sysdep-ppc/syscalls.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,50 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -16452,8 +16114,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-ppc/syscalls.h um/arc
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/sysrq.h um/arch/um/include/sysrq.h
---- orig/arch/um/include/sysrq.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/sysrq.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/sysrq.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/sysrq.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_SYSRQ_H
 +#define __UM_SYSRQ_H
@@ -16462,8 +16124,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/sysrq.h um/arch/um/include/s
 +
 +#endif
 diff -Naur -X ../exclude-files orig/arch/um/include/tempfile.h um/arch/um/include/tempfile.h
---- orig/arch/um/include/tempfile.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/tempfile.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/tempfile.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/tempfile.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,21 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -16487,8 +16149,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/tempfile.h um/arch/um/includ
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/time_user.h um/arch/um/include/time_user.h
---- orig/arch/um/include/time_user.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/time_user.h	Wed Jan  8 12:55:47 2003
+--- orig/arch/um/include/time_user.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/time_user.h	2003-01-08 12:55:47.000000000 -0500
 @@ -0,0 +1,17 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -16508,8 +16170,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/time_user.h um/arch/um/inclu
 +
 +#endif
 diff -Naur -X ../exclude-files orig/arch/um/include/tlb.h um/arch/um/include/tlb.h
---- orig/arch/um/include/tlb.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/tlb.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/tlb.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/tlb.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,23 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -16535,8 +16197,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/tlb.h um/arch/um/include/tlb
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/ubd_user.h um/arch/um/include/ubd_user.h
---- orig/arch/um/include/ubd_user.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/ubd_user.h	Thu Mar  6 18:09:14 2003
+--- orig/arch/um/include/ubd_user.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/ubd_user.h	2003-03-06 18:09:14.000000000 -0500
 @@ -0,0 +1,77 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -16615,37 +16277,19 @@ diff -Naur -X ../exclude-files orig/arch/um/include/ubd_user.h um/arch/um/includ
 + * c-file-style: "linux"
 + * End:
 + */
-diff -Naur -X ../exclude-files orig/arch/um/include/um_mmu.h um/arch/um/include/um_mmu.h
---- orig/arch/um/include/um_mmu.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/um_mmu.h	Sat Nov  9 12:51:43 2002
-@@ -0,0 +1,40 @@
-+/* 
-+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
+diff -Naur -X ../exclude-files orig/arch/um/include/umid.h um/arch/um/include/umid.h
+--- orig/arch/um/include/umid.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/umid.h	2002-12-16 20:52:19.000000000 -0500
+@@ -0,0 +1,22 @@
++/*
++ * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
 + * Licensed under the GPL
 + */
 +
-+#ifndef __ARCH_UM_MMU_H
-+#define __ARCH_UM_MMU_H
-+
-+#include "linux/config.h"
-+#include "choose-mode.h"
-+
-+#ifdef CONFIG_MODE_TT
-+#include "../kernel/tt/include/mmu.h"
-+#endif
-+
-+#ifdef CONFIG_MODE_SKAS
-+#include "../kernel/skas/include/mmu.h"
-+#endif
++#ifndef __UMID_H__
++#define __UMID_H__
 +
-+typedef union {
-+#ifdef CONFIG_MODE_TT
-+	struct mmu_context_tt tt;
-+#endif
-+#ifdef CONFIG_MODE_SKAS
-+	struct mmu_context_skas skas;
-+#endif
-+} mm_context_t;
++extern int umid_file_name(char *name, char *buf, int len);
 +
 +#endif
 +
@@ -16659,70 +16303,25 @@ diff -Naur -X ../exclude-files orig/arch/um/include/um_mmu.h um/arch/um/include/
 + * c-file-style: "linux"
 + * End:
 + */
-diff -Naur -X ../exclude-files orig/arch/um/include/um_uaccess.h um/arch/um/include/um_uaccess.h
---- orig/arch/um/include/um_uaccess.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/um_uaccess.h	Sat Nov 23 22:03:02 2002
-@@ -0,0 +1,73 @@
-+/* 
-+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
+diff -Naur -X ../exclude-files orig/arch/um/include/uml_uaccess.h um/arch/um/include/uml_uaccess.h
+--- orig/arch/um/include/uml_uaccess.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/uml_uaccess.h	2002-12-19 13:15:22.000000000 -0500
+@@ -0,0 +1,28 @@
++/*
++ * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
 + * Licensed under the GPL
 + */
 +
-+#ifndef __ARCH_UM_UACCESS_H
-+#define __ARCH_UM_UACCESS_H
-+
-+#include "linux/config.h"
-+#include "choose-mode.h"
-+
-+#ifdef CONFIG_MODE_TT
-+#include "../kernel/tt/include/uaccess.h"
-+#endif
-+
-+#ifdef CONFIG_MODE_SKAS
-+#include "../kernel/skas/include/uaccess.h"
-+#endif
-+
-+#define access_ok(type, addr, size) \
-+	CHOOSE_MODE_PROC(access_ok_tt, access_ok_skas, type, addr, size)
-+
-+static inline int verify_area(int type, const void * addr, unsigned long size)
-+{
-+	return(CHOOSE_MODE_PROC(verify_area_tt, verify_area_skas, type, addr,
-+				size));
-+}
-+
-+static inline int copy_from_user(void *to, const void *from, int n)
-+{
-+	return(CHOOSE_MODE_PROC(copy_from_user_tt, copy_from_user_skas, to,
-+				from, n));
-+}
-+
-+static inline int copy_to_user(void *to, const void *from, int n)
-+{
-+	return(CHOOSE_MODE_PROC(copy_to_user_tt, copy_to_user_skas, to, 
-+				from, n));
-+}
-+
-+static inline int strncpy_from_user(char *dst, const char *src, int count)
-+{
-+	return(CHOOSE_MODE_PROC(strncpy_from_user_tt, strncpy_from_user_skas,
-+				dst, src, count));
-+}
-+
-+static inline int __clear_user(void *mem, int len)
-+{
-+	return(CHOOSE_MODE_PROC(__clear_user_tt, __clear_user_skas, mem, len));
-+}
-+
-+static inline int clear_user(void *mem, int len)
-+{
-+	return(CHOOSE_MODE_PROC(clear_user_tt, clear_user_skas, mem, len));
-+}
++#ifndef __UML_UACCESS_H__
++#define __UML_UACCESS_H__
 +
-+static inline int strnlen_user(const void *str, int len)
-+{
-+	return(CHOOSE_MODE_PROC(strnlen_user_tt, strnlen_user_skas, str, len));
-+}
++extern int __do_copy_to_user(void *to, const void *from, int n,
++				  void **fault_addr, void **fault_catcher);
++extern unsigned long __do_user_copy(void *to, const void *from, int n,
++				    void **fault_addr, void **fault_catcher,
++				    void (*op)(void *to, const void *from,
++					       int n), int *faulted_out);
++void __do_copy(void *to, const void *from, int n);
 +
 +#endif
 +
@@ -16736,51 +16335,37 @@ diff -Naur -X ../exclude-files orig/arch/um/include/um_uaccess.h um/arch/um/incl
 + * c-file-style: "linux"
 + * End:
 + */
-diff -Naur -X ../exclude-files orig/arch/um/include/umid.h um/arch/um/include/umid.h
---- orig/arch/um/include/umid.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/umid.h	Mon Dec 16 20:52:19 2002
-@@ -0,0 +1,22 @@
-+/*
-+ * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
+diff -Naur -X ../exclude-files orig/arch/um/include/um_mmu.h um/arch/um/include/um_mmu.h
+--- orig/arch/um/include/um_mmu.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/um_mmu.h	2002-11-09 12:51:43.000000000 -0500
+@@ -0,0 +1,40 @@
++/* 
++ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
 + * Licensed under the GPL
 + */
 +
-+#ifndef __UMID_H__
-+#define __UMID_H__
++#ifndef __ARCH_UM_MMU_H
++#define __ARCH_UM_MMU_H
 +
-+extern int umid_file_name(char *name, char *buf, int len);
++#include "linux/config.h"
++#include "choose-mode.h"
 +
++#ifdef CONFIG_MODE_TT
++#include "../kernel/tt/include/mmu.h"
 +#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-file-style: "linux"
-+ * End:
-+ */
-diff -Naur -X ../exclude-files orig/arch/um/include/uml_uaccess.h um/arch/um/include/uml_uaccess.h
---- orig/arch/um/include/uml_uaccess.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/uml_uaccess.h	Thu Dec 19 13:15:22 2002
-@@ -0,0 +1,28 @@
-+/*
-+ * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef __UML_UACCESS_H__
-+#define __UML_UACCESS_H__
++#ifdef CONFIG_MODE_SKAS
++#include "../kernel/skas/include/mmu.h"
++#endif
 +
-+extern int __do_copy_to_user(void *to, const void *from, int n,
-+				  void **fault_addr, void **fault_catcher);
-+extern unsigned long __do_user_copy(void *to, const void *from, int n,
-+				    void **fault_addr, void **fault_catcher,
-+				    void (*op)(void *to, const void *from,
-+					       int n), int *faulted_out);
-+void __do_copy(void *to, const void *from, int n);
++typedef union {
++#ifdef CONFIG_MODE_TT
++	struct mmu_context_tt tt;
++#endif
++#ifdef CONFIG_MODE_SKAS
++	struct mmu_context_skas skas;
++#endif
++} mm_context_t;
 +
 +#endif
 +
@@ -16795,8 +16380,8 @@ diff -Naur -X ../exclude-files orig/arch/um/include/uml_uaccess.h um/arch/um/inc
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/umn.h um/arch/um/include/umn.h
---- orig/arch/um/include/umn.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/umn.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/umn.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/umn.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,27 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -16825,9 +16410,86 @@ diff -Naur -X ../exclude-files orig/arch/um/include/umn.h um/arch/um/include/umn
 + * c-file-style: "linux"
 + * End:
 + */
+diff -Naur -X ../exclude-files orig/arch/um/include/um_uaccess.h um/arch/um/include/um_uaccess.h
+--- orig/arch/um/include/um_uaccess.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/um_uaccess.h	2002-11-23 22:03:02.000000000 -0500
+@@ -0,0 +1,73 @@
++/* 
++ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
++ * Licensed under the GPL
++ */
++
++#ifndef __ARCH_UM_UACCESS_H
++#define __ARCH_UM_UACCESS_H
++
++#include "linux/config.h"
++#include "choose-mode.h"
++
++#ifdef CONFIG_MODE_TT
++#include "../kernel/tt/include/uaccess.h"
++#endif
++
++#ifdef CONFIG_MODE_SKAS
++#include "../kernel/skas/include/uaccess.h"
++#endif
++
++#define access_ok(type, addr, size) \
++	CHOOSE_MODE_PROC(access_ok_tt, access_ok_skas, type, addr, size)
++
++static inline int verify_area(int type, const void * addr, unsigned long size)
++{
++	return(CHOOSE_MODE_PROC(verify_area_tt, verify_area_skas, type, addr,
++				size));
++}
++
++static inline int copy_from_user(void *to, const void *from, int n)
++{
++	return(CHOOSE_MODE_PROC(copy_from_user_tt, copy_from_user_skas, to,
++				from, n));
++}
++
++static inline int copy_to_user(void *to, const void *from, int n)
++{
++	return(CHOOSE_MODE_PROC(copy_to_user_tt, copy_to_user_skas, to, 
++				from, n));
++}
++
++static inline int strncpy_from_user(char *dst, const char *src, int count)
++{
++	return(CHOOSE_MODE_PROC(strncpy_from_user_tt, strncpy_from_user_skas,
++				dst, src, count));
++}
++
++static inline int __clear_user(void *mem, int len)
++{
++	return(CHOOSE_MODE_PROC(__clear_user_tt, __clear_user_skas, mem, len));
++}
++
++static inline int clear_user(void *mem, int len)
++{
++	return(CHOOSE_MODE_PROC(clear_user_tt, clear_user_skas, mem, len));
++}
++
++static inline int strnlen_user(const void *str, int len)
++{
++	return(CHOOSE_MODE_PROC(strnlen_user_tt, strnlen_user_skas, str, len));
++}
++
++#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-file-style: "linux"
++ * End:
++ */
 diff -Naur -X ../exclude-files orig/arch/um/include/user.h um/arch/um/include/user.h
---- orig/arch/um/include/user.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/user.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/include/user.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/user.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,29 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -16859,9 +16521,9 @@ diff -Naur -X ../exclude-files orig/arch/um/include/user.h um/arch/um/include/us
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/include/user_util.h um/arch/um/include/user_util.h
---- orig/arch/um/include/user_util.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/include/user_util.h	Wed Apr 23 20:42:00 2003
-@@ -0,0 +1,103 @@
+--- orig/arch/um/include/user_util.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/include/user_util.h	2003-05-15 13:53:40.000000000 -0400
+@@ -0,0 +1,104 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
 + * Licensed under the GPL
@@ -16952,6 +16614,7 @@ diff -Naur -X ../exclude-files orig/arch/um/include/user_util.h um/arch/um/inclu
 +extern int arch_handle_signal(int sig, union uml_pt_regs *regs);
 +extern int arch_fixup(unsigned long address, void *sc_ptr);
 +extern int can_do_skas(void);
++extern void arch_init_thread(void);
 +
 +#endif
 +
@@ -16965,86 +16628,9 @@ diff -Naur -X ../exclude-files orig/arch/um/include/user_util.h um/arch/um/inclu
 + * c-file-style: "linux"
 + * End:
 + */
-diff -Naur -X ../exclude-files orig/arch/um/kernel/Makefile um/arch/um/kernel/Makefile
---- orig/arch/um/kernel/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/Makefile	Thu Apr 10 11:14:55 2003
-@@ -0,0 +1,73 @@
-+# 
-+# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+# Licensed under the GPL
-+#
-+
-+O_TARGET = built-in.o
-+
-+obj-y = config.o checksum.o exec_kern.o exitcode.o frame_kern.o frame.o \
-+	helper.o init_task.o irq.o irq_user.o ksyms.o mem.o mem_user.o \
-+	process.o process_kern.o ptrace.o reboot.o resource.o sigio_user.o \
-+	sigio_kern.o signal_kern.o signal_user.o smp.o syscall_kern.o \
-+	syscall_user.o sysrq.o sys_call_table.o tempfile.o time.o \
-+	time_kern.o tlb.o trap_kern.o trap_user.o uaccess_user.o um_arch.o \
-+	umid.o user_syms.o user_util.o
-+
-+obj-$(CONFIG_BLK_DEV_INITRD) += initrd_kern.o initrd_user.o
-+obj-$(CONFIG_GPROF) += gprof_syms.o
-+obj-$(CONFIG_GCOV) += gmon_syms.o
-+obj-$(CONFIG_TTY_LOG) += tty_log.o
-+
-+subdir-$(CONFIG_MODE_TT) += tt
-+subdir-$(CONFIG_MODE_SKAS) += skas
-+
-+user-objs-$(CONFIG_TTY_LOG) += tty_log.o
-+
-+obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o))
-+
-+# user_syms.o not included here because Rules.make has its own ideas about
-+# building anything in export-objs
-+
-+USER_OBJS = $(filter %_user.o,$(obj-y)) $(user-objs-y) config.o helper.o \
-+	process.o tempfile.o time.o umid.o user_util.o 
-+
-+DMODULES-$(CONFIG_MODULES) = -D__CONFIG_MODULES__
-+DMODVERSIONS-$(CONFIG_MODVERSIONS) = -D__CONFIG_MODVERSIONS__
-+
-+export-objs-$(CONFIG_GPROF) += gprof_syms.o
-+export-objs-$(CONFIG_GCOV) += gmon_syms.o
-+
-+export-objs = ksyms.o process_kern.o signal_kern.o user_syms.o $(export-objs-y)
-+
-+CFLAGS_user_syms.o = -D__AUTOCONF_INCLUDED__ $(DMODULES-y) $(DMODVERSIONS-y) \
-+	-I/usr/include -I../include
-+
-+CFLAGS_frame.o := $(patsubst -fomit-frame-pointer,,$(USER_CFLAGS))
-+
-+include $(TOPDIR)/Rules.make
-+
-+$(USER_OBJS) : %.o: %.c
-+	$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $<
-+
-+# This has to be separate because it needs be compiled with frame pointers
-+# regardless of how the rest of the kernel is built.
-+
-+frame.o: frame.c
-+	$(CC) $(CFLAGS_$@) -c -o $@ $<
-+
-+QUOTE = 'my $$config=`cat $(TOPDIR)/.config`; $$config =~ s/"/\\"/g ; $$config =~ s/\n/\\n"\n"/g ; while(<STDIN>) { $$_ =~ s/CONFIG/$$config/; print $$_ }'
-+
-+config.c : config.c.in $(TOPDIR)/.config
-+	$(PERL) -e $(QUOTE) < config.c.in > $@
-+
-+clean:
-+	$(RM) config.c
-+	for dir in $(subdir-y) ; do $(MAKE) -C $$dir clean; done
-+
-+modules:
-+
-+fastdep:
-+
-+dep:
-+
-+archmrproper: clean
 diff -Naur -X ../exclude-files orig/arch/um/kernel/checksum.c um/arch/um/kernel/checksum.c
---- orig/arch/um/kernel/checksum.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/checksum.c	Thu Oct 31 22:39:58 2002
+--- orig/arch/um/kernel/checksum.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/checksum.c	2002-10-31 22:39:58.000000000 -0500
 @@ -0,0 +1,42 @@
 +#include "asm/uaccess.h"
 +#include "linux/errno.h"
@@ -17089,8 +16675,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/checksum.c um/arch/um/kernel/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/config.c.in um/arch/um/kernel/config.c.in
---- orig/arch/um/kernel/config.c.in	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/config.c.in	Thu Apr 10 11:17:55 2003
+--- orig/arch/um/kernel/config.c.in	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/config.c.in	2003-04-10 11:17:55.000000000 -0400
 @@ -0,0 +1,32 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -17125,8 +16711,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/config.c.in um/arch/um/kernel
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/exec_kern.c um/arch/um/kernel/exec_kern.c
---- orig/arch/um/kernel/exec_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/exec_kern.c	Wed Apr 16 16:35:05 2003
+--- orig/arch/um/kernel/exec_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/exec_kern.c	2003-04-16 16:35:05.000000000 -0400
 @@ -0,0 +1,86 @@
 +/* 
 + * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com)
@@ -17215,8 +16801,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/exec_kern.c um/arch/um/kernel
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/exitcode.c um/arch/um/kernel/exitcode.c
---- orig/arch/um/kernel/exitcode.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/exitcode.c	Thu Nov  7 18:22:04 2002
+--- orig/arch/um/kernel/exitcode.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/exitcode.c	2002-11-07 18:22:04.000000000 -0500
 @@ -0,0 +1,73 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -17292,8 +16878,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/exitcode.c um/arch/um/kernel/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/frame.c um/arch/um/kernel/frame.c
---- orig/arch/um/kernel/frame.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/frame.c	Wed Dec 11 11:12:41 2002
+--- orig/arch/um/kernel/frame.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/frame.c	2002-12-11 11:12:41.000000000 -0500
 @@ -0,0 +1,342 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -17638,8 +17224,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/frame.c um/arch/um/kernel/fra
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/frame_kern.c um/arch/um/kernel/frame_kern.c
---- orig/arch/um/kernel/frame_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/frame_kern.c	Sun Dec  8 19:44:13 2002
+--- orig/arch/um/kernel/frame_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/frame_kern.c	2002-12-08 19:44:13.000000000 -0500
 @@ -0,0 +1,171 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -17813,8 +17399,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/frame_kern.c um/arch/um/kerne
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/gmon_syms.c um/arch/um/kernel/gmon_syms.c
---- orig/arch/um/kernel/gmon_syms.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/gmon_syms.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/gmon_syms.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/gmon_syms.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,20 @@
 +/* 
 + * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -17837,8 +17423,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/gmon_syms.c um/arch/um/kernel
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/gprof_syms.c um/arch/um/kernel/gprof_syms.c
---- orig/arch/um/kernel/gprof_syms.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/gprof_syms.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/gprof_syms.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/gprof_syms.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,20 @@
 +/* 
 + * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -17861,8 +17447,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/gprof_syms.c um/arch/um/kerne
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/helper.c um/arch/um/kernel/helper.c
---- orig/arch/um/kernel/helper.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/helper.c	Thu Oct 31 10:34:23 2002
+--- orig/arch/um/kernel/helper.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/helper.c	2002-10-31 10:34:23.000000000 -0500
 @@ -0,0 +1,153 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -18017,74 +17603,9 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/helper.c um/arch/um/kernel/he
 + * c-file-style: "linux"
 + * End:
 + */
-diff -Naur -X ../exclude-files orig/arch/um/kernel/init_task.c um/arch/um/kernel/init_task.c
---- orig/arch/um/kernel/init_task.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/init_task.c	Sat Dec 28 19:58:44 2002
-@@ -0,0 +1,61 @@
-+/* 
-+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#include "linux/config.h"
-+#include "linux/mm.h"
-+#include "linux/sched.h"
-+#include "linux/version.h"
-+#include "asm/uaccess.h"
-+#include "asm/pgtable.h"
-+#include "user_util.h"
-+#include "mem_user.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;
-+struct mm_struct init_mm = INIT_MM(init_mm);
-+
-+/*
-+ * Initial task structure.
-+ *
-+ * We need to make sure that this is 16384-byte aligned due to the
-+ * way process stacks are handled. This is done by having a special
-+ * "init_task" linker map entry..
-+ */
-+
-+union task_union init_task_union 
-+__attribute__((__section__(".data.init_task"))) = 
-+{ INIT_TASK(init_task_union.task) };
-+
-+struct task_struct *alloc_task_struct(void)
-+{
-+	return((struct task_struct *) 
-+	       __get_free_pages(GFP_KERNEL, CONFIG_KERNEL_STACK_ORDER));
-+}
-+
-+void unprotect_stack(unsigned long stack)
-+{
-+	protect_memory(stack, (1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE, 
-+		       1, 1, 0, 1);
-+}
-+
-+void free_task_struct(struct task_struct *task)
-+{
-+	/* free_pages decrements the page counter and only actually frees
-+	 * the pages if they are now not accessed by anything.
-+	 */
-+	free_pages((unsigned long) task, CONFIG_KERNEL_STACK_ORDER);
-+}
-+
-+/*
-+ * 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-file-style: "linux"
-+ * End:
-+ */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/initrd_kern.c um/arch/um/kernel/initrd_kern.c
---- orig/arch/um/kernel/initrd_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/initrd_kern.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/initrd_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/initrd_kern.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,59 @@
 +/*
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -18146,8 +17667,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/initrd_kern.c um/arch/um/kern
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/initrd_user.c um/arch/um/kernel/initrd_user.c
---- orig/arch/um/kernel/initrd_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/initrd_user.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/initrd_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/initrd_user.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,43 @@
 +/*
 + * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com)
@@ -18192,9 +17713,74 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/initrd_user.c um/arch/um/kern
 + * c-file-style: "linux"
 + * End:
 + */
+diff -Naur -X ../exclude-files orig/arch/um/kernel/init_task.c um/arch/um/kernel/init_task.c
+--- orig/arch/um/kernel/init_task.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/init_task.c	2002-12-28 19:58:44.000000000 -0500
+@@ -0,0 +1,61 @@
++/* 
++ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
++ * Licensed under the GPL
++ */
++
++#include "linux/config.h"
++#include "linux/mm.h"
++#include "linux/sched.h"
++#include "linux/version.h"
++#include "asm/uaccess.h"
++#include "asm/pgtable.h"
++#include "user_util.h"
++#include "mem_user.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;
++struct mm_struct init_mm = INIT_MM(init_mm);
++
++/*
++ * Initial task structure.
++ *
++ * We need to make sure that this is 16384-byte aligned due to the
++ * way process stacks are handled. This is done by having a special
++ * "init_task" linker map entry..
++ */
++
++union task_union init_task_union 
++__attribute__((__section__(".data.init_task"))) = 
++{ INIT_TASK(init_task_union.task) };
++
++struct task_struct *alloc_task_struct(void)
++{
++	return((struct task_struct *) 
++	       __get_free_pages(GFP_KERNEL, CONFIG_KERNEL_STACK_ORDER));
++}
++
++void unprotect_stack(unsigned long stack)
++{
++	protect_memory(stack, (1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE, 
++		       1, 1, 0, 1);
++}
++
++void free_task_struct(struct task_struct *task)
++{
++	/* free_pages decrements the page counter and only actually frees
++	 * the pages if they are now not accessed by anything.
++	 */
++	free_pages((unsigned long) task, CONFIG_KERNEL_STACK_ORDER);
++}
++
++/*
++ * 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-file-style: "linux"
++ * End:
++ */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/irq.c um/arch/um/kernel/irq.c
---- orig/arch/um/kernel/irq.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/irq.c	Wed Mar 26 14:45:29 2003
+--- orig/arch/um/kernel/irq.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/irq.c	2003-03-26 14:45:29.000000000 -0500
 @@ -0,0 +1,842 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -19039,8 +18625,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/irq.c um/arch/um/kernel/irq.c
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/irq_user.c um/arch/um/kernel/irq_user.c
---- orig/arch/um/kernel/irq_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/irq_user.c	Sun Dec 22 15:49:46 2002
+--- orig/arch/um/kernel/irq_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/irq_user.c	2002-12-22 15:49:46.000000000 -0500
 @@ -0,0 +1,427 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -19470,8 +19056,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/irq_user.c um/arch/um/kernel/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/ksyms.c um/arch/um/kernel/ksyms.c
---- orig/arch/um/kernel/ksyms.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/ksyms.c	Tue Dec 17 13:29:43 2002
+--- orig/arch/um/kernel/ksyms.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/ksyms.c	2002-12-17 13:29:43.000000000 -0500
 @@ -0,0 +1,94 @@
 +/* 
 + * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -19567,9 +19153,86 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/ksyms.c um/arch/um/kernel/ksy
 + * c-file-style: "linux"
 + * End:
 + */
+diff -Naur -X ../exclude-files orig/arch/um/kernel/Makefile um/arch/um/kernel/Makefile
+--- orig/arch/um/kernel/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/Makefile	2003-04-10 11:14:55.000000000 -0400
+@@ -0,0 +1,73 @@
++# 
++# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
++# Licensed under the GPL
++#
++
++O_TARGET = built-in.o
++
++obj-y = config.o checksum.o exec_kern.o exitcode.o frame_kern.o frame.o \
++	helper.o init_task.o irq.o irq_user.o ksyms.o mem.o mem_user.o \
++	process.o process_kern.o ptrace.o reboot.o resource.o sigio_user.o \
++	sigio_kern.o signal_kern.o signal_user.o smp.o syscall_kern.o \
++	syscall_user.o sysrq.o sys_call_table.o tempfile.o time.o \
++	time_kern.o tlb.o trap_kern.o trap_user.o uaccess_user.o um_arch.o \
++	umid.o user_syms.o user_util.o
++
++obj-$(CONFIG_BLK_DEV_INITRD) += initrd_kern.o initrd_user.o
++obj-$(CONFIG_GPROF) += gprof_syms.o
++obj-$(CONFIG_GCOV) += gmon_syms.o
++obj-$(CONFIG_TTY_LOG) += tty_log.o
++
++subdir-$(CONFIG_MODE_TT) += tt
++subdir-$(CONFIG_MODE_SKAS) += skas
++
++user-objs-$(CONFIG_TTY_LOG) += tty_log.o
++
++obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o))
++
++# user_syms.o not included here because Rules.make has its own ideas about
++# building anything in export-objs
++
++USER_OBJS = $(filter %_user.o,$(obj-y)) $(user-objs-y) config.o helper.o \
++	process.o tempfile.o time.o umid.o user_util.o 
++
++DMODULES-$(CONFIG_MODULES) = -D__CONFIG_MODULES__
++DMODVERSIONS-$(CONFIG_MODVERSIONS) = -D__CONFIG_MODVERSIONS__
++
++export-objs-$(CONFIG_GPROF) += gprof_syms.o
++export-objs-$(CONFIG_GCOV) += gmon_syms.o
++
++export-objs = ksyms.o process_kern.o signal_kern.o user_syms.o $(export-objs-y)
++
++CFLAGS_user_syms.o = -D__AUTOCONF_INCLUDED__ $(DMODULES-y) $(DMODVERSIONS-y) \
++	-I/usr/include -I../include
++
++CFLAGS_frame.o := $(patsubst -fomit-frame-pointer,,$(USER_CFLAGS))
++
++include $(TOPDIR)/Rules.make
++
++$(USER_OBJS) : %.o: %.c
++	$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $<
++
++# This has to be separate because it needs be compiled with frame pointers
++# regardless of how the rest of the kernel is built.
++
++frame.o: frame.c
++	$(CC) $(CFLAGS_$@) -c -o $@ $<
++
++QUOTE = 'my $$config=`cat $(TOPDIR)/.config`; $$config =~ s/"/\\"/g ; $$config =~ s/\n/\\n"\n"/g ; while(<STDIN>) { $$_ =~ s/CONFIG/$$config/; print $$_ }'
++
++config.c : config.c.in $(TOPDIR)/.config
++	$(PERL) -e $(QUOTE) < config.c.in > $@
++
++clean:
++	$(RM) config.c
++	for dir in $(subdir-y) ; do $(MAKE) -C $$dir clean; done
++
++modules:
++
++fastdep:
++
++dep:
++
++archmrproper: clean
 diff -Naur -X ../exclude-files orig/arch/um/kernel/mem.c um/arch/um/kernel/mem.c
---- orig/arch/um/kernel/mem.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/mem.c	Sun Mar 30 14:30:26 2003
+--- orig/arch/um/kernel/mem.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/mem.c	2003-03-30 14:30:26.000000000 -0500
 @@ -0,0 +1,852 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -20424,8 +20087,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/mem.c um/arch/um/kernel/mem.c
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/mem_user.c um/arch/um/kernel/mem_user.c
---- orig/arch/um/kernel/mem_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/mem_user.c	Thu Mar  6 16:05:21 2003
+--- orig/arch/um/kernel/mem_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/mem_user.c	2003-03-06 16:05:21.000000000 -0500
 @@ -0,0 +1,232 @@
 +/*
 + * arch/um/kernel/mem_user.c
@@ -20660,8 +20323,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/mem_user.c um/arch/um/kernel/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/mprot.h um/arch/um/kernel/mprot.h
---- orig/arch/um/kernel/mprot.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/mprot.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/mprot.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/mprot.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __MPROT_H__
 +#define __MPROT_H__
@@ -20670,8 +20333,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/mprot.h um/arch/um/kernel/mpr
 +
 +#endif
 diff -Naur -X ../exclude-files orig/arch/um/kernel/process.c um/arch/um/kernel/process.c
---- orig/arch/um/kernel/process.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/process.c	Wed Apr 23 20:36:15 2003
+--- orig/arch/um/kernel/process.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/process.c	2003-04-23 20:36:15.000000000 -0400
 @@ -0,0 +1,286 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -20960,8 +20623,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/process.c um/arch/um/kernel/p
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/process_kern.c um/arch/um/kernel/process_kern.c
---- orig/arch/um/kernel/process_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/process_kern.c	Wed Apr 16 16:02:09 2003
+--- orig/arch/um/kernel/process_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/process_kern.c	2003-04-16 16:02:09.000000000 -0400
 @@ -0,0 +1,391 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -21355,8 +21018,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/process_kern.c um/arch/um/ker
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/ptrace.c um/arch/um/kernel/ptrace.c
---- orig/arch/um/kernel/ptrace.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/ptrace.c	Sat Dec 28 22:50:21 2002
+--- orig/arch/um/kernel/ptrace.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/ptrace.c	2002-12-28 22:50:21.000000000 -0500
 @@ -0,0 +1,325 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -21684,8 +21347,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/ptrace.c um/arch/um/kernel/pt
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/reboot.c um/arch/um/kernel/reboot.c
---- orig/arch/um/kernel/reboot.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/reboot.c	Mon Dec 30 20:57:42 2002
+--- orig/arch/um/kernel/reboot.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/reboot.c	2002-12-30 20:57:42.000000000 -0500
 @@ -0,0 +1,71 @@
 +/* 
 + * Copyright (C) 2000, 2002 Jeff Dike (jdike@karaya.com)
@@ -21759,8 +21422,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/reboot.c um/arch/um/kernel/re
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/resource.c um/arch/um/kernel/resource.c
---- orig/arch/um/kernel/resource.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/resource.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/resource.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/resource.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,23 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -21786,9 +21449,9 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/resource.c um/arch/um/kernel/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/sigio_kern.c um/arch/um/kernel/sigio_kern.c
---- orig/arch/um/kernel/sigio_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/sigio_kern.c	Wed Oct 23 21:08:04 2002
-@@ -0,0 +1,56 @@
+--- orig/arch/um/kernel/sigio_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/sigio_kern.c	2003-05-11 18:34:01.000000000 -0400
+@@ -0,0 +1,57 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
 + * Licensed under the GPL
@@ -21801,6 +21464,7 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/sigio_kern.c um/arch/um/kerne
 +#include "init.h"
 +#include "sigio.h"
 +#include "irq_user.h"
++#include "irq_kern.h"
 +
 +/* Protected by sigio_lock() called from write_sigio_workaround */
 +static int sigio_irq_fd = -1;
@@ -21846,8 +21510,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/sigio_kern.c um/arch/um/kerne
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/sigio_user.c um/arch/um/kernel/sigio_user.c
---- orig/arch/um/kernel/sigio_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/sigio_user.c	Sun Dec 29 23:36:35 2002
+--- orig/arch/um/kernel/sigio_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/sigio_user.c	2002-12-29 23:36:35.000000000 -0500
 @@ -0,0 +1,440 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -22290,8 +21954,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/sigio_user.c um/arch/um/kerne
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/signal_kern.c um/arch/um/kernel/signal_kern.c
---- orig/arch/um/kernel/signal_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/signal_kern.c	Sun Dec  8 19:44:13 2002
+--- orig/arch/um/kernel/signal_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/signal_kern.c	2002-12-08 19:44:13.000000000 -0500
 @@ -0,0 +1,367 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -22661,8 +22325,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/signal_kern.c um/arch/um/kern
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/signal_user.c um/arch/um/kernel/signal_user.c
---- orig/arch/um/kernel/signal_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/signal_user.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/signal_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/signal_user.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,142 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -22806,43 +22470,9 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/signal_user.c um/arch/um/kern
 + * c-file-style: "linux"
 + * End:
 + */
-diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/Makefile um/arch/um/kernel/skas/Makefile
---- orig/arch/um/kernel/skas/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/Makefile	Fri Nov  1 16:05:44 2002
-@@ -0,0 +1,30 @@
-+# 
-+# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+# Licensed under the GPL
-+#
-+
-+O_TARGET = skas.o
-+
-+obj-y = exec_kern.o exec_user.o mem.o mem_user.o mmu.o process.o \
-+	process_kern.o syscall_kern.o syscall_user.o time.o tlb.o trap_user.o
-+
-+subdir-y = sys-$(SUBARCH)
-+
-+obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o))
-+
-+USER_OBJS = $(filter %_user.o,$(obj-y)) process.o time.o
-+
-+include $(TOPDIR)/Rules.make
-+
-+include/skas_ptregs.h : util/mk_ptregs
-+	util/mk_ptregs > $@
-+
-+util/mk_ptregs :
-+	$(MAKE) -C util
-+
-+$(USER_OBJS) : %.o: %.c
-+	$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $<
-+
-+clean :
-+	$(MAKE) -C util clean
-+	$(RM) -f include/skas_ptregs.h
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/exec_kern.c um/arch/um/kernel/skas/exec_kern.c
---- orig/arch/um/kernel/skas/exec_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/exec_kern.c	Mon Nov 11 18:57:19 2002
+--- orig/arch/um/kernel/skas/exec_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/exec_kern.c	2002-11-11 18:57:19.000000000 -0500
 @@ -0,0 +1,41 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -22886,8 +22516,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/exec_kern.c um/arch/um/k
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/exec_user.c um/arch/um/kernel/skas/exec_user.c
---- orig/arch/um/kernel/skas/exec_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/exec_user.c	Sun Nov  3 19:23:01 2002
+--- orig/arch/um/kernel/skas/exec_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/exec_user.c	2002-11-03 19:23:01.000000000 -0500
 @@ -0,0 +1,61 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -22951,8 +22581,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/exec_user.c um/arch/um/k
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/mmu.h um/arch/um/kernel/skas/include/mmu.h
---- orig/arch/um/kernel/skas/include/mmu.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/include/mmu.h	Sun Nov 10 21:21:50 2002
+--- orig/arch/um/kernel/skas/include/mmu.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/include/mmu.h	2002-11-10 21:21:50.000000000 -0500
 @@ -0,0 +1,27 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -22982,8 +22612,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/mmu.h um/arch/um
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/mode.h um/arch/um/kernel/skas/include/mode.h
---- orig/arch/um/kernel/skas/include/mode.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/include/mode.h	Wed Mar 26 13:27:46 2003
+--- orig/arch/um/kernel/skas/include/mode.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/include/mode.h	2003-03-26 13:27:46.000000000 -0500
 @@ -0,0 +1,36 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -23022,8 +22652,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/mode.h um/arch/u
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/mode_kern.h um/arch/um/kernel/skas/include/mode_kern.h
---- orig/arch/um/kernel/skas/include/mode_kern.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/include/mode_kern.h	Mon Dec 16 21:49:11 2002
+--- orig/arch/um/kernel/skas/include/mode_kern.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/include/mode_kern.h	2002-12-16 21:49:11.000000000 -0500
 @@ -0,0 +1,51 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -23077,8 +22707,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/mode_kern.h um/a
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/proc_mm.h um/arch/um/kernel/skas/include/proc_mm.h
---- orig/arch/um/kernel/skas/include/proc_mm.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/include/proc_mm.h	Wed Nov 13 11:57:23 2002
+--- orig/arch/um/kernel/skas/include/proc_mm.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/include/proc_mm.h	2002-11-13 11:57:23.000000000 -0500
 @@ -0,0 +1,55 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -23136,8 +22766,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/proc_mm.h um/arc
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/ptrace-skas.h um/arch/um/kernel/skas/include/ptrace-skas.h
---- orig/arch/um/kernel/skas/include/ptrace-skas.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/include/ptrace-skas.h	Fri Jan 17 13:22:09 2003
+--- orig/arch/um/kernel/skas/include/ptrace-skas.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/include/ptrace-skas.h	2003-01-17 13:22:09.000000000 -0500
 @@ -0,0 +1,57 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -23197,8 +22827,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/ptrace-skas.h um
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/skas.h um/arch/um/kernel/skas/include/skas.h
---- orig/arch/um/kernel/skas/include/skas.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/include/skas.h	Sun Dec  8 21:00:12 2002
+--- orig/arch/um/kernel/skas/include/skas.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/include/skas.h	2002-12-08 21:00:12.000000000 -0500
 @@ -0,0 +1,49 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -23250,8 +22880,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/skas.h um/arch/u
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/uaccess.h um/arch/um/kernel/skas/include/uaccess.h
---- orig/arch/um/kernel/skas/include/uaccess.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/include/uaccess.h	Fri Jan 31 23:05:56 2003
+--- orig/arch/um/kernel/skas/include/uaccess.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/include/uaccess.h	2003-01-31 23:05:56.000000000 -0500
 @@ -0,0 +1,232 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -23485,9 +23115,43 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/uaccess.h um/arc
 + * c-file-style: "linux"
 + * End:
 + */
+diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/Makefile um/arch/um/kernel/skas/Makefile
+--- orig/arch/um/kernel/skas/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/Makefile	2002-11-01 16:05:44.000000000 -0500
+@@ -0,0 +1,30 @@
++# 
++# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
++# Licensed under the GPL
++#
++
++O_TARGET = skas.o
++
++obj-y = exec_kern.o exec_user.o mem.o mem_user.o mmu.o process.o \
++	process_kern.o syscall_kern.o syscall_user.o time.o tlb.o trap_user.o
++
++subdir-y = sys-$(SUBARCH)
++
++obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o))
++
++USER_OBJS = $(filter %_user.o,$(obj-y)) process.o time.o
++
++include $(TOPDIR)/Rules.make
++
++include/skas_ptregs.h : util/mk_ptregs
++	util/mk_ptregs > $@
++
++util/mk_ptregs :
++	$(MAKE) -C util
++
++$(USER_OBJS) : %.o: %.c
++	$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $<
++
++clean :
++	$(MAKE) -C util clean
++	$(RM) -f include/skas_ptregs.h
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/mem.c um/arch/um/kernel/skas/mem.c
---- orig/arch/um/kernel/skas/mem.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/mem.c	Mon Dec 16 21:49:39 2002
+--- orig/arch/um/kernel/skas/mem.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/mem.c	2002-12-16 21:49:39.000000000 -0500
 @@ -0,0 +1,30 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -23520,8 +23184,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/mem.c um/arch/um/kernel/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/mem_user.c um/arch/um/kernel/skas/mem_user.c
---- orig/arch/um/kernel/skas/mem_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/mem_user.c	Tue Dec 31 00:13:18 2002
+--- orig/arch/um/kernel/skas/mem_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/mem_user.c	2002-12-31 00:13:18.000000000 -0500
 @@ -0,0 +1,95 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -23619,8 +23283,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/mem_user.c um/arch/um/ke
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/mmu.c um/arch/um/kernel/skas/mmu.c
---- orig/arch/um/kernel/skas/mmu.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/mmu.c	Wed Nov 13 13:09:57 2002
+--- orig/arch/um/kernel/skas/mmu.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/mmu.c	2002-11-13 13:09:57.000000000 -0500
 @@ -0,0 +1,44 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -23667,9 +23331,9 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/mmu.c um/arch/um/kernel/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/process.c um/arch/um/kernel/skas/process.c
---- orig/arch/um/kernel/skas/process.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/process.c	Wed Mar 26 14:43:19 2003
-@@ -0,0 +1,407 @@
+--- orig/arch/um/kernel/skas/process.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/process.c	2003-05-15 15:21:48.000000000 -0400
+@@ -0,0 +1,409 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
 + * Licensed under the GPL
@@ -24012,7 +23676,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/process.c um/arch/um/ker
 +int new_mm(int from)
 +{
 +	struct proc_mm_op copy;
-+	int n, fd = os_open_file("/proc/mm", of_write(OPENFLAGS()), 0);
++	int n, fd = os_open_file("/proc/mm", 
++				 of_cloexec(of_write(OPENFLAGS())), 0);
 +
 +	if(fd < 0)
 +		return(-errno);
@@ -24026,6 +23691,7 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/process.c um/arch/um/ker
 +			printk("new_mm : /proc/mm copy_segments failed, "
 +			       "errno = %d\n", errno);
 +	}
++
 +	return(fd);
 +}
 +
@@ -24078,8 +23744,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/process.c um/arch/um/ker
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/process_kern.c um/arch/um/kernel/skas/process_kern.c
---- orig/arch/um/kernel/skas/process_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/process_kern.c	Sun Dec 22 20:37:39 2002
+--- orig/arch/um/kernel/skas/process_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/process_kern.c	2002-12-22 20:37:39.000000000 -0500
 @@ -0,0 +1,191 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -24272,9 +23938,105 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/process_kern.c um/arch/u
 + * c-file-style: "linux"
 + * End:
 + */
+diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/syscall_kern.c um/arch/um/kernel/skas/syscall_kern.c
+--- orig/arch/um/kernel/skas/syscall_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/syscall_kern.c	2002-12-08 21:01:44.000000000 -0500
+@@ -0,0 +1,42 @@
++/* 
++ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
++ * Licensed under the GPL
++ */
++
++#include "linux/sys.h"
++#include "asm/errno.h"
++#include "asm/unistd.h"
++#include "asm/ptrace.h"
++#include "asm/current.h"
++#include "sysdep/syscalls.h"
++#include "kern_util.h"
++
++extern syscall_handler_t *sys_call_table[];
++
++long execute_syscall_skas(void *r)
++{
++	struct pt_regs *regs = r;
++	long res;
++	int syscall;
++
++	current->thread.nsyscalls++;
++	nsyscalls++;
++	syscall = UPT_SYSCALL_NR(&regs->regs);
++
++	if((syscall >= NR_syscalls) || (syscall < 0))
++		res = -ENOSYS;
++	else res = EXECUTE_SYSCALL(syscall, regs);
++
++	return(res);
++}
++
++/*
++ * 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-file-style: "linux"
++ * End:
++ */
+diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/syscall_user.c um/arch/um/kernel/skas/syscall_user.c
+--- orig/arch/um/kernel/skas/syscall_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/syscall_user.c	2002-12-08 21:00:12.000000000 -0500
+@@ -0,0 +1,46 @@
++/* 
++ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
++ * Licensed under the GPL
++ */
++
++#include <stdlib.h>
++#include <signal.h>
++#include "kern_util.h"
++#include "syscall_user.h"
++#include "sysdep/ptrace.h"
++#include "sysdep/sigcontext.h"
++
++/* XXX Bogus */
++#define ERESTARTSYS	512
++#define ERESTARTNOINTR	513
++#define ERESTARTNOHAND	514
++
++void handle_syscall(union uml_pt_regs *regs)
++{
++	long result;
++	int index;
++
++	index = record_syscall_start(UPT_SYSCALL_NR(regs));
++
++	syscall_trace();
++	result = execute_syscall(regs);
++
++	REGS_SET_SYSCALL_RETURN(regs->skas.regs, result);
++	if((result == -ERESTARTNOHAND) || (result == -ERESTARTSYS) || 
++	   (result == -ERESTARTNOINTR))
++		do_signal(result);
++
++	syscall_trace();
++	record_syscall_end(index, result);
++}
++
++/*
++ * 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-file-style: "linux"
++ * End:
++ */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/sys-i386/Makefile um/arch/um/kernel/skas/sys-i386/Makefile
---- orig/arch/um/kernel/skas/sys-i386/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/sys-i386/Makefile	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/skas/sys-i386/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/sys-i386/Makefile	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,17 @@
 +# 
 +# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -24294,8 +24056,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/sys-i386/Makefile um/arc
 +
 +clean :
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/sys-i386/sigcontext.c um/arch/um/kernel/skas/sys-i386/sigcontext.c
---- orig/arch/um/kernel/skas/sys-i386/sigcontext.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/sys-i386/sigcontext.c	Sun Dec  8 20:38:46 2002
+--- orig/arch/um/kernel/skas/sys-i386/sigcontext.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/sys-i386/sigcontext.c	2002-12-08 20:38:46.000000000 -0500
 @@ -0,0 +1,115 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -24412,105 +24174,9 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/sys-i386/sigcontext.c um
 + * c-file-style: "linux"
 + * End:
 + */
-diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/syscall_kern.c um/arch/um/kernel/skas/syscall_kern.c
---- orig/arch/um/kernel/skas/syscall_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/syscall_kern.c	Sun Dec  8 21:01:44 2002
-@@ -0,0 +1,42 @@
-+/* 
-+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#include "linux/sys.h"
-+#include "asm/errno.h"
-+#include "asm/unistd.h"
-+#include "asm/ptrace.h"
-+#include "asm/current.h"
-+#include "sysdep/syscalls.h"
-+#include "kern_util.h"
-+
-+extern syscall_handler_t *sys_call_table[];
-+
-+long execute_syscall_skas(void *r)
-+{
-+	struct pt_regs *regs = r;
-+	long res;
-+	int syscall;
-+
-+	current->thread.nsyscalls++;
-+	nsyscalls++;
-+	syscall = UPT_SYSCALL_NR(&regs->regs);
-+
-+	if((syscall >= NR_syscalls) || (syscall < 0))
-+		res = -ENOSYS;
-+	else res = EXECUTE_SYSCALL(syscall, regs);
-+
-+	return(res);
-+}
-+
-+/*
-+ * 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-file-style: "linux"
-+ * End:
-+ */
-diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/syscall_user.c um/arch/um/kernel/skas/syscall_user.c
---- orig/arch/um/kernel/skas/syscall_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/syscall_user.c	Sun Dec  8 21:00:12 2002
-@@ -0,0 +1,46 @@
-+/* 
-+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#include <stdlib.h>
-+#include <signal.h>
-+#include "kern_util.h"
-+#include "syscall_user.h"
-+#include "sysdep/ptrace.h"
-+#include "sysdep/sigcontext.h"
-+
-+/* XXX Bogus */
-+#define ERESTARTSYS	512
-+#define ERESTARTNOINTR	513
-+#define ERESTARTNOHAND	514
-+
-+void handle_syscall(union uml_pt_regs *regs)
-+{
-+	long result;
-+	int index;
-+
-+	index = record_syscall_start(UPT_SYSCALL_NR(regs));
-+
-+	syscall_trace();
-+	result = execute_syscall(regs);
-+
-+	REGS_SET_SYSCALL_RETURN(regs->skas.regs, result);
-+	if((result == -ERESTARTNOHAND) || (result == -ERESTARTSYS) || 
-+	   (result == -ERESTARTNOINTR))
-+		do_signal(result);
-+
-+	syscall_trace();
-+	record_syscall_end(index, result);
-+}
-+
-+/*
-+ * 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-file-style: "linux"
-+ * End:
-+ */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/time.c um/arch/um/kernel/skas/time.c
---- orig/arch/um/kernel/skas/time.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/time.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/skas/time.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/time.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,30 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -24543,8 +24209,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/time.c um/arch/um/kernel
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/tlb.c um/arch/um/kernel/skas/tlb.c
---- orig/arch/um/kernel/skas/tlb.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/tlb.c	Sun Dec 22 18:30:35 2002
+--- orig/arch/um/kernel/skas/tlb.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/tlb.c	2002-12-22 18:30:35.000000000 -0500
 @@ -0,0 +1,153 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -24700,8 +24366,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/tlb.c um/arch/um/kernel/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/trap_user.c um/arch/um/kernel/skas/trap_user.c
---- orig/arch/um/kernel/skas/trap_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/trap_user.c	Sun Dec 15 13:28:41 2002
+--- orig/arch/um/kernel/skas/trap_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/trap_user.c	2002-12-15 13:28:41.000000000 -0500
 @@ -0,0 +1,65 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -24769,8 +24435,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/trap_user.c um/arch/um/k
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/util/Makefile um/arch/um/kernel/skas/util/Makefile
---- orig/arch/um/kernel/skas/util/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/util/Makefile	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/skas/util/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/util/Makefile	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,10 @@
 +all: mk_ptregs
 +
@@ -24783,8 +24449,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/util/Makefile um/arch/um
 +clean : 
 +	$(RM) -f mk_ptregs *.o *~
 diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/util/mk_ptregs.c um/arch/um/kernel/skas/util/mk_ptregs.c
---- orig/arch/um/kernel/skas/util/mk_ptregs.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/skas/util/mk_ptregs.c	Mon Nov 11 12:10:06 2002
+--- orig/arch/um/kernel/skas/util/mk_ptregs.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/skas/util/mk_ptregs.c	2002-11-11 12:10:06.000000000 -0500
 @@ -0,0 +1,50 @@
 +#include <asm/ptrace.h>
 +#include <asm/user.h>
@@ -24837,8 +24503,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/util/mk_ptregs.c um/arch
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/smp.c um/arch/um/kernel/smp.c
---- orig/arch/um/kernel/smp.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/smp.c	Sat Feb 22 14:28:45 2003
+--- orig/arch/um/kernel/smp.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/smp.c	2003-02-22 14:28:45.000000000 -0500
 @@ -0,0 +1,324 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -25128,520 +24794,31 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/smp.c um/arch/um/kernel/smp.c
 +	int cpus = smp_num_cpus - 1;
 +	int i;
 +
-+	if (!cpus)
-+		return 0;
-+
-+	spin_lock_bh(&call_lock);
-+	atomic_set(&scf_started, 0);
-+	atomic_set(&scf_finished, 0);
-+	func = _func;
-+	info = _info;
-+
-+	for (i=0;i<NR_CPUS;i++)
-+		if (i != current->processor && test_bit(i, &cpu_online_map))
-+			write(cpu_data[i].ipi_pipe[1], "C", 1);
-+
-+	while (atomic_read(&scf_started) != cpus)
-+		barrier();
-+
-+	if (wait)
-+		while (atomic_read(&scf_finished) != cpus)
-+			barrier();
-+
-+	spin_unlock_bh(&call_lock);
-+	return 0;
-+}
-+
-+#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-file-style: "linux"
-+ * End:
-+ */
-diff -Naur -X ../exclude-files orig/arch/um/kernel/sys_call_table.c um/arch/um/kernel/sys_call_table.c
---- orig/arch/um/kernel/sys_call_table.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/sys_call_table.c	Thu Feb 27 13:33:23 2003
-@@ -0,0 +1,485 @@
-+/* 
-+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#include "linux/unistd.h"
-+#include "linux/version.h"
-+#include "linux/sys.h"
-+#include "asm/signal.h"
-+#include "sysdep/syscalls.h"
-+#include "kern_util.h"
-+
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_exit;
-+extern syscall_handler_t sys_fork;
-+extern syscall_handler_t sys_creat;
-+extern syscall_handler_t sys_link;
-+extern syscall_handler_t sys_unlink;
-+extern syscall_handler_t sys_chdir;
-+extern syscall_handler_t sys_mknod;
-+extern syscall_handler_t sys_chmod;
-+extern syscall_handler_t sys_lchown16;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_stat;
-+extern syscall_handler_t sys_getpid;
-+extern syscall_handler_t sys_oldumount;
-+extern syscall_handler_t sys_setuid16;
-+extern syscall_handler_t sys_getuid16;
-+extern syscall_handler_t sys_ptrace;
-+extern syscall_handler_t sys_alarm;
-+extern syscall_handler_t sys_fstat;
-+extern syscall_handler_t sys_pause;
-+extern syscall_handler_t sys_utime;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_access;
-+extern syscall_handler_t sys_nice;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_sync;
-+extern syscall_handler_t sys_kill;
-+extern syscall_handler_t sys_rename;
-+extern syscall_handler_t sys_mkdir;
-+extern syscall_handler_t sys_rmdir;
-+extern syscall_handler_t sys_pipe;
-+extern syscall_handler_t sys_times;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_brk;
-+extern syscall_handler_t sys_setgid16;
-+extern syscall_handler_t sys_getgid16;
-+extern syscall_handler_t sys_signal;
-+extern syscall_handler_t sys_geteuid16;
-+extern syscall_handler_t sys_getegid16;
-+extern syscall_handler_t sys_acct;
-+extern syscall_handler_t sys_umount;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_ioctl;
-+extern syscall_handler_t sys_fcntl;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_setpgid;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_olduname;
-+extern syscall_handler_t sys_umask;
-+extern syscall_handler_t sys_chroot;
-+extern syscall_handler_t sys_ustat;
-+extern syscall_handler_t sys_dup2;
-+extern syscall_handler_t sys_getppid;
-+extern syscall_handler_t sys_getpgrp;
-+extern syscall_handler_t sys_sigaction;
-+extern syscall_handler_t sys_sgetmask;
-+extern syscall_handler_t sys_ssetmask;
-+extern syscall_handler_t sys_setreuid16;
-+extern syscall_handler_t sys_setregid16;
-+extern syscall_handler_t sys_sigsuspend;
-+extern syscall_handler_t sys_sigpending;
-+extern syscall_handler_t sys_sethostname;
-+extern syscall_handler_t sys_setrlimit;
-+extern syscall_handler_t sys_old_getrlimit;
-+extern syscall_handler_t sys_getrusage;
-+extern syscall_handler_t sys_gettimeofday;
-+extern syscall_handler_t sys_settimeofday;
-+extern syscall_handler_t sys_getgroups16;
-+extern syscall_handler_t sys_setgroups16;
-+extern syscall_handler_t sys_symlink;
-+extern syscall_handler_t sys_lstat;
-+extern syscall_handler_t sys_readlink;
-+extern syscall_handler_t sys_uselib;
-+extern syscall_handler_t sys_swapon;
-+extern syscall_handler_t sys_reboot;
-+extern syscall_handler_t old_readdir;
-+extern syscall_handler_t sys_munmap;
-+extern syscall_handler_t sys_truncate;
-+extern syscall_handler_t sys_ftruncate;
-+extern syscall_handler_t sys_fchmod;
-+extern syscall_handler_t sys_fchown16;
-+extern syscall_handler_t sys_getpriority;
-+extern syscall_handler_t sys_setpriority;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_statfs;
-+extern syscall_handler_t sys_fstatfs;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_socketcall;
-+extern syscall_handler_t sys_syslog;
-+extern syscall_handler_t sys_setitimer;
-+extern syscall_handler_t sys_getitimer;
-+extern syscall_handler_t sys_newstat;
-+extern syscall_handler_t sys_newlstat;
-+extern syscall_handler_t sys_newfstat;
-+extern syscall_handler_t sys_uname;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_vhangup;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_swapoff;
-+extern syscall_handler_t sys_sysinfo;
-+extern syscall_handler_t sys_ipc;
-+extern syscall_handler_t sys_fsync;
-+extern syscall_handler_t sys_sigreturn;
-+extern syscall_handler_t sys_rt_sigreturn;
-+extern syscall_handler_t sys_clone;
-+extern syscall_handler_t sys_setdomainname;
-+extern syscall_handler_t sys_newuname;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_adjtimex;
-+extern syscall_handler_t sys_mprotect;
-+extern syscall_handler_t sys_sigprocmask;
-+extern syscall_handler_t sys_create_module;
-+extern syscall_handler_t sys_init_module;
-+extern syscall_handler_t sys_delete_module;
-+extern syscall_handler_t sys_get_kernel_syms;
-+extern syscall_handler_t sys_quotactl;
-+extern syscall_handler_t sys_getpgid;
-+extern syscall_handler_t sys_fchdir;
-+extern syscall_handler_t sys_bdflush;
-+extern syscall_handler_t sys_sysfs;
-+extern syscall_handler_t sys_personality;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_setfsuid16;
-+extern syscall_handler_t sys_setfsgid16;
-+extern syscall_handler_t sys_llseek;
-+extern syscall_handler_t sys_getdents;
-+extern syscall_handler_t sys_flock;
-+extern syscall_handler_t sys_msync;
-+extern syscall_handler_t sys_readv;
-+extern syscall_handler_t sys_writev;
-+extern syscall_handler_t sys_getsid;
-+extern syscall_handler_t sys_fdatasync;
-+extern syscall_handler_t sys_sysctl;
-+extern syscall_handler_t sys_mlock;
-+extern syscall_handler_t sys_munlock;
-+extern syscall_handler_t sys_mlockall;
-+extern syscall_handler_t sys_munlockall;
-+extern syscall_handler_t sys_sched_setparam;
-+extern syscall_handler_t sys_sched_getparam;
-+extern syscall_handler_t sys_sched_setscheduler;
-+extern syscall_handler_t sys_sched_getscheduler;
-+extern syscall_handler_t sys_sched_get_priority_max;
-+extern syscall_handler_t sys_sched_get_priority_min;
-+extern syscall_handler_t sys_sched_rr_get_interval;
-+extern syscall_handler_t sys_nanosleep;
-+extern syscall_handler_t sys_mremap;
-+extern syscall_handler_t sys_setresuid16;
-+extern syscall_handler_t sys_getresuid16;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_query_module;
-+extern syscall_handler_t sys_poll;
-+extern syscall_handler_t sys_nfsservctl;
-+extern syscall_handler_t sys_setresgid16;
-+extern syscall_handler_t sys_getresgid16;
-+extern syscall_handler_t sys_prctl;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_rt_sigaction;
-+extern syscall_handler_t sys_rt_sigprocmask;
-+extern syscall_handler_t sys_rt_sigpending;
-+extern syscall_handler_t sys_rt_sigtimedwait;
-+extern syscall_handler_t sys_rt_sigqueueinfo;
-+extern syscall_handler_t sys_rt_sigsuspend;
-+extern syscall_handler_t sys_pread;
-+extern syscall_handler_t sys_pwrite;
-+extern syscall_handler_t sys_chown16;
-+extern syscall_handler_t sys_getcwd;
-+extern syscall_handler_t sys_capget;
-+extern syscall_handler_t sys_capset;
-+extern syscall_handler_t sys_sigaltstack;
-+extern syscall_handler_t sys_sendfile;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_ni_syscall;
-+extern syscall_handler_t sys_vfork;
-+extern syscall_handler_t sys_getrlimit;
-+extern syscall_handler_t sys_mmap2;
-+extern syscall_handler_t sys_truncate64;
-+extern syscall_handler_t sys_ftruncate64;
-+extern syscall_handler_t sys_stat64;
-+extern syscall_handler_t sys_lstat64;
-+extern syscall_handler_t sys_fstat64;
-+extern syscall_handler_t sys_lchown;
-+extern syscall_handler_t sys_getuid;
-+extern syscall_handler_t sys_getgid;
-+extern syscall_handler_t sys_geteuid;
-+extern syscall_handler_t sys_getegid;
-+extern syscall_handler_t sys_setreuid;
-+extern syscall_handler_t sys_setregid;
-+extern syscall_handler_t sys_getgroups;
-+extern syscall_handler_t sys_setgroups;
-+extern syscall_handler_t sys_fchown;
-+extern syscall_handler_t sys_setresuid;
-+extern syscall_handler_t sys_getresuid;
-+extern syscall_handler_t sys_setresgid;
-+extern syscall_handler_t sys_getresgid;
-+extern syscall_handler_t sys_chown;
-+extern syscall_handler_t sys_setuid;
-+extern syscall_handler_t sys_setgid;
-+extern syscall_handler_t sys_setfsuid;
-+extern syscall_handler_t sys_setfsgid;
-+extern syscall_handler_t sys_pivot_root;
-+extern syscall_handler_t sys_mincore;
-+extern syscall_handler_t sys_madvise;
-+extern syscall_handler_t sys_fcntl64;
-+extern syscall_handler_t sys_getdents64;
-+extern syscall_handler_t sys_gettid;
-+extern syscall_handler_t sys_readahead;
-+extern syscall_handler_t sys_tkill;
-+extern syscall_handler_t sys_setxattr;
-+extern syscall_handler_t sys_lsetxattr;
-+extern syscall_handler_t sys_fsetxattr;
-+extern syscall_handler_t sys_getxattr;
-+extern syscall_handler_t sys_lgetxattr;
-+extern syscall_handler_t sys_fgetxattr;
-+extern syscall_handler_t sys_listxattr;
-+extern syscall_handler_t sys_llistxattr;
-+extern syscall_handler_t sys_flistxattr;
-+extern syscall_handler_t sys_removexattr;
-+extern syscall_handler_t sys_lremovexattr;
-+extern syscall_handler_t sys_fremovexattr;
-+
-+extern syscall_handler_t um_mount;
-+extern syscall_handler_t um_time;
-+extern syscall_handler_t um_stime;
-+
-+#define LAST_GENERIC_SYSCALL __NR_sched_getaffinity
++	if (!cpus)
++		return 0;
 +
-+#if LAST_GENERIC_SYSCALL > LAST_ARCH_SYSCALL
-+#define LAST_SYSCALL LAST_GENERIC_SYSCALL
-+#else
-+#define LAST_SYSCALL LAST_ARCH_SYSCALL
-+#endif
++	spin_lock_bh(&call_lock);
++	atomic_set(&scf_started, 0);
++	atomic_set(&scf_finished, 0);
++	func = _func;
++	info = _info;
 +
-+syscall_handler_t *sys_call_table[] = {
-+	[ 0 ] = sys_ni_syscall,
-+	[ __NR_exit ] = sys_exit,
-+	[ __NR_fork ] = sys_fork,
-+	[ __NR_read ] = (syscall_handler_t *) sys_read,
-+	[ __NR_write ] = (syscall_handler_t *) sys_write,
++	for (i=0;i<NR_CPUS;i++)
++		if (i != current->processor && test_bit(i, &cpu_online_map))
++			write(cpu_data[i].ipi_pipe[1], "C", 1);
 +
-+	/* These three are declared differently in asm/unistd.h */
-+	[ __NR_open ] = (syscall_handler_t *) sys_open,
-+	[ __NR_close ] = (syscall_handler_t *) sys_close,
-+	[ __NR_waitpid ] = (syscall_handler_t *) sys_waitpid,
-+	[ __NR_creat ] = sys_creat,
-+	[ __NR_link ] = sys_link,
-+	[ __NR_unlink ] = sys_unlink,
++	while (atomic_read(&scf_started) != cpus)
++		barrier();
 +
-+	/* declared differently in kern_util.h */
-+	[ __NR_execve ] = (syscall_handler_t *) sys_execve,
-+	[ __NR_chdir ] = sys_chdir,
-+	[ __NR_time ] = um_time,
-+	[ __NR_mknod ] = sys_mknod,
-+	[ __NR_chmod ] = sys_chmod,
-+	[ __NR_lchown ] = sys_lchown16,
-+	[ __NR_break ] = sys_ni_syscall,
-+	[ __NR_oldstat ] = sys_stat,
-+	[ __NR_lseek ] = (syscall_handler_t *) sys_lseek,
-+	[ __NR_getpid ] = sys_getpid,
-+	[ __NR_mount ] = um_mount,
-+	[ __NR_umount ] = sys_oldumount,
-+	[ __NR_setuid ] = sys_setuid16,
-+	[ __NR_getuid ] = sys_getuid16,
-+	[ __NR_stime ] = um_stime,
-+	[ __NR_ptrace ] = sys_ptrace,
-+	[ __NR_alarm ] = sys_alarm,
-+	[ __NR_oldfstat ] = sys_fstat,
-+	[ __NR_pause ] = sys_pause,
-+	[ __NR_utime ] = sys_utime,
-+	[ __NR_stty ] = sys_ni_syscall,
-+	[ __NR_gtty ] = sys_ni_syscall,
-+	[ __NR_access ] = sys_access,
-+	[ __NR_nice ] = sys_nice,
-+	[ __NR_ftime ] = sys_ni_syscall,
-+	[ __NR_sync ] = sys_sync,
-+	[ __NR_kill ] = sys_kill,
-+	[ __NR_rename ] = sys_rename,
-+	[ __NR_mkdir ] = sys_mkdir,
-+	[ __NR_rmdir ] = sys_rmdir,
++	if (wait)
++		while (atomic_read(&scf_finished) != cpus)
++			barrier();
 +
-+	/* Declared differently in asm/unistd.h */
-+	[ __NR_dup ] = (syscall_handler_t *) sys_dup,
-+	[ __NR_pipe ] = sys_pipe,
-+	[ __NR_times ] = sys_times,
-+	[ __NR_prof ] = sys_ni_syscall,
-+	[ __NR_brk ] = sys_brk,
-+	[ __NR_setgid ] = sys_setgid16,
-+	[ __NR_getgid ] = sys_getgid16,
-+	[ __NR_signal ] = sys_signal,
-+	[ __NR_geteuid ] = sys_geteuid16,
-+	[ __NR_getegid ] = sys_getegid16,
-+	[ __NR_acct ] = sys_acct,
-+	[ __NR_umount2 ] = sys_umount,
-+	[ __NR_lock ] = sys_ni_syscall,
-+	[ __NR_ioctl ] = sys_ioctl,
-+	[ __NR_fcntl ] = sys_fcntl,
-+	[ __NR_mpx ] = sys_ni_syscall,
-+	[ __NR_setpgid ] = sys_setpgid,
-+	[ __NR_ulimit ] = sys_ni_syscall,
-+	[ __NR_oldolduname ] = sys_olduname,
-+	[ __NR_umask ] = sys_umask,
-+	[ __NR_chroot ] = sys_chroot,
-+	[ __NR_ustat ] = sys_ustat,
-+	[ __NR_dup2 ] = sys_dup2,
-+	[ __NR_getppid ] = sys_getppid,
-+	[ __NR_getpgrp ] = sys_getpgrp,
-+	[ __NR_setsid ] = (syscall_handler_t *) sys_setsid,
-+	[ __NR_sigaction ] = sys_sigaction,
-+	[ __NR_sgetmask ] = sys_sgetmask,
-+	[ __NR_ssetmask ] = sys_ssetmask,
-+	[ __NR_setreuid ] = sys_setreuid16,
-+	[ __NR_setregid ] = sys_setregid16,
-+	[ __NR_sigsuspend ] = sys_sigsuspend,
-+	[ __NR_sigpending ] = sys_sigpending,
-+	[ __NR_sethostname ] = sys_sethostname,
-+	[ __NR_setrlimit ] = sys_setrlimit,
-+	[ __NR_getrlimit ] = sys_old_getrlimit,
-+	[ __NR_getrusage ] = sys_getrusage,
-+	[ __NR_gettimeofday ] = sys_gettimeofday,
-+	[ __NR_settimeofday ] = sys_settimeofday,
-+	[ __NR_getgroups ] = sys_getgroups16,
-+	[ __NR_setgroups ] = sys_setgroups16,
-+	[ __NR_symlink ] = sys_symlink,
-+	[ __NR_oldlstat ] = sys_lstat,
-+	[ __NR_readlink ] = sys_readlink,
-+	[ __NR_uselib ] = sys_uselib,
-+	[ __NR_swapon ] = sys_swapon,
-+	[ __NR_reboot ] = sys_reboot,
-+	[ __NR_readdir ] = old_readdir,
-+	[ __NR_munmap ] = sys_munmap,
-+	[ __NR_truncate ] = sys_truncate,
-+	[ __NR_ftruncate ] = sys_ftruncate,
-+	[ __NR_fchmod ] = sys_fchmod,
-+	[ __NR_fchown ] = sys_fchown16,
-+	[ __NR_getpriority ] = sys_getpriority,
-+	[ __NR_setpriority ] = sys_setpriority,
-+	[ __NR_profil ] = sys_ni_syscall,
-+	[ __NR_statfs ] = sys_statfs,
-+	[ __NR_fstatfs ] = sys_fstatfs,
-+	[ __NR_ioperm ] = sys_ni_syscall,
-+	[ __NR_socketcall ] = sys_socketcall,
-+	[ __NR_syslog ] = sys_syslog,
-+	[ __NR_setitimer ] = sys_setitimer,
-+	[ __NR_getitimer ] = sys_getitimer,
-+	[ __NR_stat ] = sys_newstat,
-+	[ __NR_lstat ] = sys_newlstat,
-+	[ __NR_fstat ] = sys_newfstat,
-+	[ __NR_olduname ] = sys_uname,
-+	[ __NR_iopl ] = sys_ni_syscall,
-+	[ __NR_vhangup ] = sys_vhangup,
-+	[ __NR_idle ] = sys_ni_syscall,
-+	[ __NR_wait4 ] = (syscall_handler_t *) sys_wait4,
-+	[ __NR_swapoff ] = sys_swapoff,
-+	[ __NR_sysinfo ] = sys_sysinfo,
-+	[ __NR_ipc ] = sys_ipc,
-+	[ __NR_fsync ] = sys_fsync,
-+	[ __NR_sigreturn ] = sys_sigreturn,
-+	[ __NR_clone ] = sys_clone,
-+	[ __NR_setdomainname ] = sys_setdomainname,
-+	[ __NR_uname ] = sys_newuname,
-+	[ __NR_adjtimex ] = sys_adjtimex,
-+	[ __NR_mprotect ] = sys_mprotect,
-+	[ __NR_sigprocmask ] = sys_sigprocmask,
-+	[ __NR_create_module ] = sys_create_module,
-+	[ __NR_init_module ] = sys_init_module,
-+	[ __NR_delete_module ] = sys_delete_module,
-+	[ __NR_get_kernel_syms ] = sys_get_kernel_syms,
-+	[ __NR_quotactl ] = sys_quotactl,
-+	[ __NR_getpgid ] = sys_getpgid,
-+	[ __NR_fchdir ] = sys_fchdir,
-+	[ __NR_bdflush ] = sys_bdflush,
-+	[ __NR_sysfs ] = sys_sysfs,
-+	[ __NR_personality ] = sys_personality,
-+	[ __NR_afs_syscall ] = sys_ni_syscall,
-+	[ __NR_setfsuid ] = sys_setfsuid16,
-+	[ __NR_setfsgid ] = sys_setfsgid16,
-+	[ __NR__llseek ] = sys_llseek,
-+	[ __NR_getdents ] = sys_getdents,
-+	[ __NR__newselect ] = (syscall_handler_t *) sys_select,
-+	[ __NR_flock ] = sys_flock,
-+	[ __NR_msync ] = sys_msync,
-+	[ __NR_readv ] = sys_readv,
-+	[ __NR_writev ] = sys_writev,
-+	[ __NR_getsid ] = sys_getsid,
-+	[ __NR_fdatasync ] = sys_fdatasync,
-+	[ __NR__sysctl ] = sys_sysctl,
-+	[ __NR_mlock ] = sys_mlock,
-+	[ __NR_munlock ] = sys_munlock,
-+	[ __NR_mlockall ] = sys_mlockall,
-+	[ __NR_munlockall ] = sys_munlockall,
-+	[ __NR_sched_setparam ] = sys_sched_setparam,
-+	[ __NR_sched_getparam ] = sys_sched_getparam,
-+	[ __NR_sched_setscheduler ] = sys_sched_setscheduler,
-+	[ __NR_sched_getscheduler ] = sys_sched_getscheduler,
-+	[ __NR_sched_yield ] = (syscall_handler_t *) yield,
-+	[ __NR_sched_get_priority_max ] = sys_sched_get_priority_max,
-+	[ __NR_sched_get_priority_min ] = sys_sched_get_priority_min,
-+	[ __NR_sched_rr_get_interval ] = sys_sched_rr_get_interval,
-+	[ __NR_nanosleep ] = sys_nanosleep,
-+	[ __NR_mremap ] = sys_mremap,
-+	[ __NR_setresuid ] = sys_setresuid16,
-+	[ __NR_getresuid ] = sys_getresuid16,
-+	[ __NR_vm86 ] = sys_ni_syscall,
-+	[ __NR_query_module ] = sys_query_module,
-+	[ __NR_poll ] = sys_poll,
-+	[ __NR_nfsservctl ] = sys_nfsservctl,
-+	[ __NR_setresgid ] = sys_setresgid16,
-+	[ __NR_getresgid ] = sys_getresgid16,
-+	[ __NR_prctl ] = sys_prctl,
-+	[ __NR_rt_sigreturn ] = sys_rt_sigreturn,
-+	[ __NR_rt_sigaction ] = sys_rt_sigaction,
-+	[ __NR_rt_sigprocmask ] = sys_rt_sigprocmask,
-+	[ __NR_rt_sigpending ] = sys_rt_sigpending,
-+	[ __NR_rt_sigtimedwait ] = sys_rt_sigtimedwait,
-+	[ __NR_rt_sigqueueinfo ] = sys_rt_sigqueueinfo,
-+	[ __NR_rt_sigsuspend ] = sys_rt_sigsuspend,
-+	[ __NR_pread ] = sys_pread,
-+	[ __NR_pwrite ] = sys_pwrite,
-+	[ __NR_chown ] = sys_chown16,
-+	[ __NR_getcwd ] = sys_getcwd,
-+	[ __NR_capget ] = sys_capget,
-+	[ __NR_capset ] = sys_capset,
-+	[ __NR_sigaltstack ] = sys_sigaltstack,
-+	[ __NR_sendfile ] = sys_sendfile,
-+	[ __NR_getpmsg ] = sys_ni_syscall,
-+	[ __NR_putpmsg ] = sys_ni_syscall,
-+	[ __NR_vfork ] = sys_vfork,
-+	[ __NR_ugetrlimit ] = sys_getrlimit,
-+	[ __NR_mmap2 ] = sys_mmap2,
-+	[ __NR_truncate64 ] = sys_truncate64,
-+	[ __NR_ftruncate64 ] = sys_ftruncate64,
-+	[ __NR_stat64 ] = sys_stat64,
-+	[ __NR_lstat64 ] = sys_lstat64,
-+	[ __NR_fstat64 ] = sys_fstat64,
-+	[ __NR_fcntl64 ] = sys_fcntl64,
-+	[ __NR_getdents64 ] = sys_getdents64,
-+        [ __NR_security ] = sys_ni_syscall,
-+	[ __NR_gettid ] = sys_gettid,
-+	[ __NR_readahead ] = sys_readahead,
-+	[ __NR_setxattr ] = sys_setxattr,
-+	[ __NR_lsetxattr ] = sys_lsetxattr,
-+	[ __NR_fsetxattr ] = sys_fsetxattr,
-+	[ __NR_getxattr ] = sys_getxattr,
-+	[ __NR_lgetxattr ] = sys_lgetxattr,
-+	[ __NR_fgetxattr ] = sys_fgetxattr,
-+	[ __NR_listxattr ] = sys_listxattr,
-+	[ __NR_llistxattr ] = sys_llistxattr,
-+	[ __NR_flistxattr ] = sys_flistxattr,
-+	[ __NR_removexattr ] = sys_removexattr,
-+	[ __NR_lremovexattr ] = sys_lremovexattr,
-+	[ __NR_fremovexattr ] = sys_fremovexattr,
-+	[ __NR_tkill ] = sys_tkill,
-+	[ __NR_sendfile64 ] = sys_ni_syscall,
-+	[ __NR_futex ] = sys_ni_syscall,
-+	[ __NR_sched_setaffinity ] = sys_ni_syscall,
-+	[ __NR_sched_getaffinity ] = sys_ni_syscall,
++	spin_unlock_bh(&call_lock);
++	return 0;
++}
 +
-+	ARCH_SYSCALLS
-+	[ LAST_SYSCALL + 1 ... NR_syscalls ] = 
-+	        (syscall_handler_t *) sys_ni_syscall
-+};
++#endif
 +
 +/*
 + * Overrides for Emacs so that we follow Linus's tabbing style.
@@ -25654,8 +24831,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/sys_call_table.c um/arch/um/k
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/syscall_kern.c um/arch/um/kernel/syscall_kern.c
---- orig/arch/um/kernel/syscall_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/syscall_kern.c	Fri Nov  8 14:04:10 2002
+--- orig/arch/um/kernel/syscall_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/syscall_kern.c	2002-11-08 14:04:10.000000000 -0500
 @@ -0,0 +1,343 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -25961,34 +25138,523 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/syscall_kern.c um/arch/um/ker
 +	
 +	error = error ? -EFAULT : 0;
 +
-+	return error;
-+}
++	return error;
++}
++
++int sys_sigaltstack(const stack_t *uss, stack_t *uoss)
++{
++	return(do_sigaltstack(uss, uoss, PT_REGS_SP(&current->thread.regs)));
++}
++
++long execute_syscall(void *r)
++{
++	return(CHOOSE_MODE_PROC(execute_syscall_tt, execute_syscall_skas, r));
++}
++
++spinlock_t syscall_lock = SPIN_LOCK_UNLOCKED;
++
++static int syscall_index = 0;
++
++int next_syscall_index(int limit)
++{
++	int ret;
++
++	spin_lock(&syscall_lock);
++	ret = syscall_index;
++	if(++syscall_index == limit)
++		syscall_index = 0;
++	spin_unlock(&syscall_lock);
++	return(ret);
++}
++
++/*
++ * 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-file-style: "linux"
++ * End:
++ */
+diff -Naur -X ../exclude-files orig/arch/um/kernel/sys_call_table.c um/arch/um/kernel/sys_call_table.c
+--- orig/arch/um/kernel/sys_call_table.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/sys_call_table.c	2003-02-27 13:33:23.000000000 -0500
+@@ -0,0 +1,485 @@
++/* 
++ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
++ * Licensed under the GPL
++ */
++
++#include "linux/unistd.h"
++#include "linux/version.h"
++#include "linux/sys.h"
++#include "asm/signal.h"
++#include "sysdep/syscalls.h"
++#include "kern_util.h"
++
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_exit;
++extern syscall_handler_t sys_fork;
++extern syscall_handler_t sys_creat;
++extern syscall_handler_t sys_link;
++extern syscall_handler_t sys_unlink;
++extern syscall_handler_t sys_chdir;
++extern syscall_handler_t sys_mknod;
++extern syscall_handler_t sys_chmod;
++extern syscall_handler_t sys_lchown16;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_stat;
++extern syscall_handler_t sys_getpid;
++extern syscall_handler_t sys_oldumount;
++extern syscall_handler_t sys_setuid16;
++extern syscall_handler_t sys_getuid16;
++extern syscall_handler_t sys_ptrace;
++extern syscall_handler_t sys_alarm;
++extern syscall_handler_t sys_fstat;
++extern syscall_handler_t sys_pause;
++extern syscall_handler_t sys_utime;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_access;
++extern syscall_handler_t sys_nice;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_sync;
++extern syscall_handler_t sys_kill;
++extern syscall_handler_t sys_rename;
++extern syscall_handler_t sys_mkdir;
++extern syscall_handler_t sys_rmdir;
++extern syscall_handler_t sys_pipe;
++extern syscall_handler_t sys_times;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_brk;
++extern syscall_handler_t sys_setgid16;
++extern syscall_handler_t sys_getgid16;
++extern syscall_handler_t sys_signal;
++extern syscall_handler_t sys_geteuid16;
++extern syscall_handler_t sys_getegid16;
++extern syscall_handler_t sys_acct;
++extern syscall_handler_t sys_umount;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_ioctl;
++extern syscall_handler_t sys_fcntl;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_setpgid;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_olduname;
++extern syscall_handler_t sys_umask;
++extern syscall_handler_t sys_chroot;
++extern syscall_handler_t sys_ustat;
++extern syscall_handler_t sys_dup2;
++extern syscall_handler_t sys_getppid;
++extern syscall_handler_t sys_getpgrp;
++extern syscall_handler_t sys_sigaction;
++extern syscall_handler_t sys_sgetmask;
++extern syscall_handler_t sys_ssetmask;
++extern syscall_handler_t sys_setreuid16;
++extern syscall_handler_t sys_setregid16;
++extern syscall_handler_t sys_sigsuspend;
++extern syscall_handler_t sys_sigpending;
++extern syscall_handler_t sys_sethostname;
++extern syscall_handler_t sys_setrlimit;
++extern syscall_handler_t sys_old_getrlimit;
++extern syscall_handler_t sys_getrusage;
++extern syscall_handler_t sys_gettimeofday;
++extern syscall_handler_t sys_settimeofday;
++extern syscall_handler_t sys_getgroups16;
++extern syscall_handler_t sys_setgroups16;
++extern syscall_handler_t sys_symlink;
++extern syscall_handler_t sys_lstat;
++extern syscall_handler_t sys_readlink;
++extern syscall_handler_t sys_uselib;
++extern syscall_handler_t sys_swapon;
++extern syscall_handler_t sys_reboot;
++extern syscall_handler_t old_readdir;
++extern syscall_handler_t sys_munmap;
++extern syscall_handler_t sys_truncate;
++extern syscall_handler_t sys_ftruncate;
++extern syscall_handler_t sys_fchmod;
++extern syscall_handler_t sys_fchown16;
++extern syscall_handler_t sys_getpriority;
++extern syscall_handler_t sys_setpriority;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_statfs;
++extern syscall_handler_t sys_fstatfs;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_socketcall;
++extern syscall_handler_t sys_syslog;
++extern syscall_handler_t sys_setitimer;
++extern syscall_handler_t sys_getitimer;
++extern syscall_handler_t sys_newstat;
++extern syscall_handler_t sys_newlstat;
++extern syscall_handler_t sys_newfstat;
++extern syscall_handler_t sys_uname;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_vhangup;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_swapoff;
++extern syscall_handler_t sys_sysinfo;
++extern syscall_handler_t sys_ipc;
++extern syscall_handler_t sys_fsync;
++extern syscall_handler_t sys_sigreturn;
++extern syscall_handler_t sys_rt_sigreturn;
++extern syscall_handler_t sys_clone;
++extern syscall_handler_t sys_setdomainname;
++extern syscall_handler_t sys_newuname;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_adjtimex;
++extern syscall_handler_t sys_mprotect;
++extern syscall_handler_t sys_sigprocmask;
++extern syscall_handler_t sys_create_module;
++extern syscall_handler_t sys_init_module;
++extern syscall_handler_t sys_delete_module;
++extern syscall_handler_t sys_get_kernel_syms;
++extern syscall_handler_t sys_quotactl;
++extern syscall_handler_t sys_getpgid;
++extern syscall_handler_t sys_fchdir;
++extern syscall_handler_t sys_bdflush;
++extern syscall_handler_t sys_sysfs;
++extern syscall_handler_t sys_personality;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_setfsuid16;
++extern syscall_handler_t sys_setfsgid16;
++extern syscall_handler_t sys_llseek;
++extern syscall_handler_t sys_getdents;
++extern syscall_handler_t sys_flock;
++extern syscall_handler_t sys_msync;
++extern syscall_handler_t sys_readv;
++extern syscall_handler_t sys_writev;
++extern syscall_handler_t sys_getsid;
++extern syscall_handler_t sys_fdatasync;
++extern syscall_handler_t sys_sysctl;
++extern syscall_handler_t sys_mlock;
++extern syscall_handler_t sys_munlock;
++extern syscall_handler_t sys_mlockall;
++extern syscall_handler_t sys_munlockall;
++extern syscall_handler_t sys_sched_setparam;
++extern syscall_handler_t sys_sched_getparam;
++extern syscall_handler_t sys_sched_setscheduler;
++extern syscall_handler_t sys_sched_getscheduler;
++extern syscall_handler_t sys_sched_get_priority_max;
++extern syscall_handler_t sys_sched_get_priority_min;
++extern syscall_handler_t sys_sched_rr_get_interval;
++extern syscall_handler_t sys_nanosleep;
++extern syscall_handler_t sys_mremap;
++extern syscall_handler_t sys_setresuid16;
++extern syscall_handler_t sys_getresuid16;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_query_module;
++extern syscall_handler_t sys_poll;
++extern syscall_handler_t sys_nfsservctl;
++extern syscall_handler_t sys_setresgid16;
++extern syscall_handler_t sys_getresgid16;
++extern syscall_handler_t sys_prctl;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_rt_sigaction;
++extern syscall_handler_t sys_rt_sigprocmask;
++extern syscall_handler_t sys_rt_sigpending;
++extern syscall_handler_t sys_rt_sigtimedwait;
++extern syscall_handler_t sys_rt_sigqueueinfo;
++extern syscall_handler_t sys_rt_sigsuspend;
++extern syscall_handler_t sys_pread;
++extern syscall_handler_t sys_pwrite;
++extern syscall_handler_t sys_chown16;
++extern syscall_handler_t sys_getcwd;
++extern syscall_handler_t sys_capget;
++extern syscall_handler_t sys_capset;
++extern syscall_handler_t sys_sigaltstack;
++extern syscall_handler_t sys_sendfile;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_ni_syscall;
++extern syscall_handler_t sys_vfork;
++extern syscall_handler_t sys_getrlimit;
++extern syscall_handler_t sys_mmap2;
++extern syscall_handler_t sys_truncate64;
++extern syscall_handler_t sys_ftruncate64;
++extern syscall_handler_t sys_stat64;
++extern syscall_handler_t sys_lstat64;
++extern syscall_handler_t sys_fstat64;
++extern syscall_handler_t sys_lchown;
++extern syscall_handler_t sys_getuid;
++extern syscall_handler_t sys_getgid;
++extern syscall_handler_t sys_geteuid;
++extern syscall_handler_t sys_getegid;
++extern syscall_handler_t sys_setreuid;
++extern syscall_handler_t sys_setregid;
++extern syscall_handler_t sys_getgroups;
++extern syscall_handler_t sys_setgroups;
++extern syscall_handler_t sys_fchown;
++extern syscall_handler_t sys_setresuid;
++extern syscall_handler_t sys_getresuid;
++extern syscall_handler_t sys_setresgid;
++extern syscall_handler_t sys_getresgid;
++extern syscall_handler_t sys_chown;
++extern syscall_handler_t sys_setuid;
++extern syscall_handler_t sys_setgid;
++extern syscall_handler_t sys_setfsuid;
++extern syscall_handler_t sys_setfsgid;
++extern syscall_handler_t sys_pivot_root;
++extern syscall_handler_t sys_mincore;
++extern syscall_handler_t sys_madvise;
++extern syscall_handler_t sys_fcntl64;
++extern syscall_handler_t sys_getdents64;
++extern syscall_handler_t sys_gettid;
++extern syscall_handler_t sys_readahead;
++extern syscall_handler_t sys_tkill;
++extern syscall_handler_t sys_setxattr;
++extern syscall_handler_t sys_lsetxattr;
++extern syscall_handler_t sys_fsetxattr;
++extern syscall_handler_t sys_getxattr;
++extern syscall_handler_t sys_lgetxattr;
++extern syscall_handler_t sys_fgetxattr;
++extern syscall_handler_t sys_listxattr;
++extern syscall_handler_t sys_llistxattr;
++extern syscall_handler_t sys_flistxattr;
++extern syscall_handler_t sys_removexattr;
++extern syscall_handler_t sys_lremovexattr;
++extern syscall_handler_t sys_fremovexattr;
++
++extern syscall_handler_t um_mount;
++extern syscall_handler_t um_time;
++extern syscall_handler_t um_stime;
 +
-+int sys_sigaltstack(const stack_t *uss, stack_t *uoss)
-+{
-+	return(do_sigaltstack(uss, uoss, PT_REGS_SP(&current->thread.regs)));
-+}
++#define LAST_GENERIC_SYSCALL __NR_sched_getaffinity
 +
-+long execute_syscall(void *r)
-+{
-+	return(CHOOSE_MODE_PROC(execute_syscall_tt, execute_syscall_skas, r));
-+}
++#if LAST_GENERIC_SYSCALL > LAST_ARCH_SYSCALL
++#define LAST_SYSCALL LAST_GENERIC_SYSCALL
++#else
++#define LAST_SYSCALL LAST_ARCH_SYSCALL
++#endif
 +
-+spinlock_t syscall_lock = SPIN_LOCK_UNLOCKED;
++syscall_handler_t *sys_call_table[] = {
++	[ 0 ] = sys_ni_syscall,
++	[ __NR_exit ] = sys_exit,
++	[ __NR_fork ] = sys_fork,
++	[ __NR_read ] = (syscall_handler_t *) sys_read,
++	[ __NR_write ] = (syscall_handler_t *) sys_write,
 +
-+static int syscall_index = 0;
++	/* These three are declared differently in asm/unistd.h */
++	[ __NR_open ] = (syscall_handler_t *) sys_open,
++	[ __NR_close ] = (syscall_handler_t *) sys_close,
++	[ __NR_waitpid ] = (syscall_handler_t *) sys_waitpid,
++	[ __NR_creat ] = sys_creat,
++	[ __NR_link ] = sys_link,
++	[ __NR_unlink ] = sys_unlink,
 +
-+int next_syscall_index(int limit)
-+{
-+	int ret;
++	/* declared differently in kern_util.h */
++	[ __NR_execve ] = (syscall_handler_t *) sys_execve,
++	[ __NR_chdir ] = sys_chdir,
++	[ __NR_time ] = um_time,
++	[ __NR_mknod ] = sys_mknod,
++	[ __NR_chmod ] = sys_chmod,
++	[ __NR_lchown ] = sys_lchown16,
++	[ __NR_break ] = sys_ni_syscall,
++	[ __NR_oldstat ] = sys_stat,
++	[ __NR_lseek ] = (syscall_handler_t *) sys_lseek,
++	[ __NR_getpid ] = sys_getpid,
++	[ __NR_mount ] = um_mount,
++	[ __NR_umount ] = sys_oldumount,
++	[ __NR_setuid ] = sys_setuid16,
++	[ __NR_getuid ] = sys_getuid16,
++	[ __NR_stime ] = um_stime,
++	[ __NR_ptrace ] = sys_ptrace,
++	[ __NR_alarm ] = sys_alarm,
++	[ __NR_oldfstat ] = sys_fstat,
++	[ __NR_pause ] = sys_pause,
++	[ __NR_utime ] = sys_utime,
++	[ __NR_stty ] = sys_ni_syscall,
++	[ __NR_gtty ] = sys_ni_syscall,
++	[ __NR_access ] = sys_access,
++	[ __NR_nice ] = sys_nice,
++	[ __NR_ftime ] = sys_ni_syscall,
++	[ __NR_sync ] = sys_sync,
++	[ __NR_kill ] = sys_kill,
++	[ __NR_rename ] = sys_rename,
++	[ __NR_mkdir ] = sys_mkdir,
++	[ __NR_rmdir ] = sys_rmdir,
 +
-+	spin_lock(&syscall_lock);
-+	ret = syscall_index;
-+	if(++syscall_index == limit)
-+		syscall_index = 0;
-+	spin_unlock(&syscall_lock);
-+	return(ret);
-+}
++	/* Declared differently in asm/unistd.h */
++	[ __NR_dup ] = (syscall_handler_t *) sys_dup,
++	[ __NR_pipe ] = sys_pipe,
++	[ __NR_times ] = sys_times,
++	[ __NR_prof ] = sys_ni_syscall,
++	[ __NR_brk ] = sys_brk,
++	[ __NR_setgid ] = sys_setgid16,
++	[ __NR_getgid ] = sys_getgid16,
++	[ __NR_signal ] = sys_signal,
++	[ __NR_geteuid ] = sys_geteuid16,
++	[ __NR_getegid ] = sys_getegid16,
++	[ __NR_acct ] = sys_acct,
++	[ __NR_umount2 ] = sys_umount,
++	[ __NR_lock ] = sys_ni_syscall,
++	[ __NR_ioctl ] = sys_ioctl,
++	[ __NR_fcntl ] = sys_fcntl,
++	[ __NR_mpx ] = sys_ni_syscall,
++	[ __NR_setpgid ] = sys_setpgid,
++	[ __NR_ulimit ] = sys_ni_syscall,
++	[ __NR_oldolduname ] = sys_olduname,
++	[ __NR_umask ] = sys_umask,
++	[ __NR_chroot ] = sys_chroot,
++	[ __NR_ustat ] = sys_ustat,
++	[ __NR_dup2 ] = sys_dup2,
++	[ __NR_getppid ] = sys_getppid,
++	[ __NR_getpgrp ] = sys_getpgrp,
++	[ __NR_setsid ] = (syscall_handler_t *) sys_setsid,
++	[ __NR_sigaction ] = sys_sigaction,
++	[ __NR_sgetmask ] = sys_sgetmask,
++	[ __NR_ssetmask ] = sys_ssetmask,
++	[ __NR_setreuid ] = sys_setreuid16,
++	[ __NR_setregid ] = sys_setregid16,
++	[ __NR_sigsuspend ] = sys_sigsuspend,
++	[ __NR_sigpending ] = sys_sigpending,
++	[ __NR_sethostname ] = sys_sethostname,
++	[ __NR_setrlimit ] = sys_setrlimit,
++	[ __NR_getrlimit ] = sys_old_getrlimit,
++	[ __NR_getrusage ] = sys_getrusage,
++	[ __NR_gettimeofday ] = sys_gettimeofday,
++	[ __NR_settimeofday ] = sys_settimeofday,
++	[ __NR_getgroups ] = sys_getgroups16,
++	[ __NR_setgroups ] = sys_setgroups16,
++	[ __NR_symlink ] = sys_symlink,
++	[ __NR_oldlstat ] = sys_lstat,
++	[ __NR_readlink ] = sys_readlink,
++	[ __NR_uselib ] = sys_uselib,
++	[ __NR_swapon ] = sys_swapon,
++	[ __NR_reboot ] = sys_reboot,
++	[ __NR_readdir ] = old_readdir,
++	[ __NR_munmap ] = sys_munmap,
++	[ __NR_truncate ] = sys_truncate,
++	[ __NR_ftruncate ] = sys_ftruncate,
++	[ __NR_fchmod ] = sys_fchmod,
++	[ __NR_fchown ] = sys_fchown16,
++	[ __NR_getpriority ] = sys_getpriority,
++	[ __NR_setpriority ] = sys_setpriority,
++	[ __NR_profil ] = sys_ni_syscall,
++	[ __NR_statfs ] = sys_statfs,
++	[ __NR_fstatfs ] = sys_fstatfs,
++	[ __NR_ioperm ] = sys_ni_syscall,
++	[ __NR_socketcall ] = sys_socketcall,
++	[ __NR_syslog ] = sys_syslog,
++	[ __NR_setitimer ] = sys_setitimer,
++	[ __NR_getitimer ] = sys_getitimer,
++	[ __NR_stat ] = sys_newstat,
++	[ __NR_lstat ] = sys_newlstat,
++	[ __NR_fstat ] = sys_newfstat,
++	[ __NR_olduname ] = sys_uname,
++	[ __NR_iopl ] = sys_ni_syscall,
++	[ __NR_vhangup ] = sys_vhangup,
++	[ __NR_idle ] = sys_ni_syscall,
++	[ __NR_wait4 ] = (syscall_handler_t *) sys_wait4,
++	[ __NR_swapoff ] = sys_swapoff,
++	[ __NR_sysinfo ] = sys_sysinfo,
++	[ __NR_ipc ] = sys_ipc,
++	[ __NR_fsync ] = sys_fsync,
++	[ __NR_sigreturn ] = sys_sigreturn,
++	[ __NR_clone ] = sys_clone,
++	[ __NR_setdomainname ] = sys_setdomainname,
++	[ __NR_uname ] = sys_newuname,
++	[ __NR_adjtimex ] = sys_adjtimex,
++	[ __NR_mprotect ] = sys_mprotect,
++	[ __NR_sigprocmask ] = sys_sigprocmask,
++	[ __NR_create_module ] = sys_create_module,
++	[ __NR_init_module ] = sys_init_module,
++	[ __NR_delete_module ] = sys_delete_module,
++	[ __NR_get_kernel_syms ] = sys_get_kernel_syms,
++	[ __NR_quotactl ] = sys_quotactl,
++	[ __NR_getpgid ] = sys_getpgid,
++	[ __NR_fchdir ] = sys_fchdir,
++	[ __NR_bdflush ] = sys_bdflush,
++	[ __NR_sysfs ] = sys_sysfs,
++	[ __NR_personality ] = sys_personality,
++	[ __NR_afs_syscall ] = sys_ni_syscall,
++	[ __NR_setfsuid ] = sys_setfsuid16,
++	[ __NR_setfsgid ] = sys_setfsgid16,
++	[ __NR__llseek ] = sys_llseek,
++	[ __NR_getdents ] = sys_getdents,
++	[ __NR__newselect ] = (syscall_handler_t *) sys_select,
++	[ __NR_flock ] = sys_flock,
++	[ __NR_msync ] = sys_msync,
++	[ __NR_readv ] = sys_readv,
++	[ __NR_writev ] = sys_writev,
++	[ __NR_getsid ] = sys_getsid,
++	[ __NR_fdatasync ] = sys_fdatasync,
++	[ __NR__sysctl ] = sys_sysctl,
++	[ __NR_mlock ] = sys_mlock,
++	[ __NR_munlock ] = sys_munlock,
++	[ __NR_mlockall ] = sys_mlockall,
++	[ __NR_munlockall ] = sys_munlockall,
++	[ __NR_sched_setparam ] = sys_sched_setparam,
++	[ __NR_sched_getparam ] = sys_sched_getparam,
++	[ __NR_sched_setscheduler ] = sys_sched_setscheduler,
++	[ __NR_sched_getscheduler ] = sys_sched_getscheduler,
++	[ __NR_sched_yield ] = (syscall_handler_t *) yield,
++	[ __NR_sched_get_priority_max ] = sys_sched_get_priority_max,
++	[ __NR_sched_get_priority_min ] = sys_sched_get_priority_min,
++	[ __NR_sched_rr_get_interval ] = sys_sched_rr_get_interval,
++	[ __NR_nanosleep ] = sys_nanosleep,
++	[ __NR_mremap ] = sys_mremap,
++	[ __NR_setresuid ] = sys_setresuid16,
++	[ __NR_getresuid ] = sys_getresuid16,
++	[ __NR_vm86 ] = sys_ni_syscall,
++	[ __NR_query_module ] = sys_query_module,
++	[ __NR_poll ] = sys_poll,
++	[ __NR_nfsservctl ] = sys_nfsservctl,
++	[ __NR_setresgid ] = sys_setresgid16,
++	[ __NR_getresgid ] = sys_getresgid16,
++	[ __NR_prctl ] = sys_prctl,
++	[ __NR_rt_sigreturn ] = sys_rt_sigreturn,
++	[ __NR_rt_sigaction ] = sys_rt_sigaction,
++	[ __NR_rt_sigprocmask ] = sys_rt_sigprocmask,
++	[ __NR_rt_sigpending ] = sys_rt_sigpending,
++	[ __NR_rt_sigtimedwait ] = sys_rt_sigtimedwait,
++	[ __NR_rt_sigqueueinfo ] = sys_rt_sigqueueinfo,
++	[ __NR_rt_sigsuspend ] = sys_rt_sigsuspend,
++	[ __NR_pread ] = sys_pread,
++	[ __NR_pwrite ] = sys_pwrite,
++	[ __NR_chown ] = sys_chown16,
++	[ __NR_getcwd ] = sys_getcwd,
++	[ __NR_capget ] = sys_capget,
++	[ __NR_capset ] = sys_capset,
++	[ __NR_sigaltstack ] = sys_sigaltstack,
++	[ __NR_sendfile ] = sys_sendfile,
++	[ __NR_getpmsg ] = sys_ni_syscall,
++	[ __NR_putpmsg ] = sys_ni_syscall,
++	[ __NR_vfork ] = sys_vfork,
++	[ __NR_ugetrlimit ] = sys_getrlimit,
++	[ __NR_mmap2 ] = sys_mmap2,
++	[ __NR_truncate64 ] = sys_truncate64,
++	[ __NR_ftruncate64 ] = sys_ftruncate64,
++	[ __NR_stat64 ] = sys_stat64,
++	[ __NR_lstat64 ] = sys_lstat64,
++	[ __NR_fstat64 ] = sys_fstat64,
++	[ __NR_fcntl64 ] = sys_fcntl64,
++	[ __NR_getdents64 ] = sys_getdents64,
++        [ __NR_security ] = sys_ni_syscall,
++	[ __NR_gettid ] = sys_gettid,
++	[ __NR_readahead ] = sys_readahead,
++	[ __NR_setxattr ] = sys_setxattr,
++	[ __NR_lsetxattr ] = sys_lsetxattr,
++	[ __NR_fsetxattr ] = sys_fsetxattr,
++	[ __NR_getxattr ] = sys_getxattr,
++	[ __NR_lgetxattr ] = sys_lgetxattr,
++	[ __NR_fgetxattr ] = sys_fgetxattr,
++	[ __NR_listxattr ] = sys_listxattr,
++	[ __NR_llistxattr ] = sys_llistxattr,
++	[ __NR_flistxattr ] = sys_flistxattr,
++	[ __NR_removexattr ] = sys_removexattr,
++	[ __NR_lremovexattr ] = sys_lremovexattr,
++	[ __NR_fremovexattr ] = sys_fremovexattr,
++	[ __NR_tkill ] = sys_tkill,
++	[ __NR_sendfile64 ] = sys_ni_syscall,
++	[ __NR_futex ] = sys_ni_syscall,
++	[ __NR_sched_setaffinity ] = sys_ni_syscall,
++	[ __NR_sched_getaffinity ] = sys_ni_syscall,
++
++	ARCH_SYSCALLS
++	[ LAST_SYSCALL + 1 ... NR_syscalls ] = 
++	        (syscall_handler_t *) sys_ni_syscall
++};
 +
 +/*
 + * Overrides for Emacs so that we follow Linus's tabbing style.
@@ -26001,8 +25667,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/syscall_kern.c um/arch/um/ker
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/syscall_user.c um/arch/um/kernel/syscall_user.c
---- orig/arch/um/kernel/syscall_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/syscall_user.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/syscall_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/syscall_user.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,48 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -26053,8 +25719,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/syscall_user.c um/arch/um/ker
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/sysrq.c um/arch/um/kernel/sysrq.c
---- orig/arch/um/kernel/sysrq.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/sysrq.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/sysrq.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/sysrq.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,98 @@
 +/* 
 + * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
@@ -26155,8 +25821,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/sysrq.c um/arch/um/kernel/sys
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tempfile.c um/arch/um/kernel/tempfile.c
---- orig/arch/um/kernel/tempfile.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tempfile.c	Fri Jan 17 23:16:19 2003
+--- orig/arch/um/kernel/tempfile.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tempfile.c	2003-01-17 23:16:19.000000000 -0500
 @@ -0,0 +1,80 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -26239,8 +25905,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tempfile.c um/arch/um/kernel/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/time.c um/arch/um/kernel/time.c
---- orig/arch/um/kernel/time.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/time.c	Wed Apr 23 20:45:19 2003
+--- orig/arch/um/kernel/time.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/time.c	2003-04-23 20:45:19.000000000 -0400
 @@ -0,0 +1,127 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -26370,8 +26036,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/time.c um/arch/um/kernel/time
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/time_kern.c um/arch/um/kernel/time_kern.c
---- orig/arch/um/kernel/time_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/time_kern.c	Wed Apr 23 22:19:08 2003
+--- orig/arch/um/kernel/time_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/time_kern.c	2003-04-23 22:19:08.000000000 -0400
 @@ -0,0 +1,172 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -26546,8 +26212,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/time_kern.c um/arch/um/kernel
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tlb.c um/arch/um/kernel/tlb.c
---- orig/arch/um/kernel/tlb.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tlb.c	Wed Oct 23 22:15:51 2002
+--- orig/arch/um/kernel/tlb.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tlb.c	2002-10-23 22:15:51.000000000 -0400
 @@ -0,0 +1,80 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -26630,8 +26296,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tlb.c um/arch/um/kernel/tlb.c
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/trap_kern.c um/arch/um/kernel/trap_kern.c
---- orig/arch/um/kernel/trap_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/trap_kern.c	Wed Mar 26 13:26:00 2003
+--- orig/arch/um/kernel/trap_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/trap_kern.c	2003-03-26 13:26:00.000000000 -0500
 @@ -0,0 +1,192 @@
 +/* 
 + * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com)
@@ -26826,8 +26492,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/trap_kern.c um/arch/um/kernel
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/trap_user.c um/arch/um/kernel/trap_user.c
---- orig/arch/um/kernel/trap_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/trap_user.c	Wed Mar 26 13:25:50 2003
+--- orig/arch/um/kernel/trap_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/trap_user.c	2003-03-26 13:25:50.000000000 -0500
 @@ -0,0 +1,140 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -26969,52 +26635,9 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/trap_user.c um/arch/um/kernel
 + * c-file-style: "linux"
 + * End:
 + */
-diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/Makefile um/arch/um/kernel/tt/Makefile
---- orig/arch/um/kernel/tt/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/Makefile	Fri Dec 20 23:29:42 2002
-@@ -0,0 +1,39 @@
-+# 
-+# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+# Licensed under the GPL
-+#
-+
-+O_TARGET = tt.o
-+
-+obj-y = exec_kern.o exec_user.o gdb.o ksyms.o mem.o mem_user.o process_kern.o \
-+	syscall_kern.o syscall_user.o time.o tlb.o tracer.o trap_user.o \
-+	uaccess_user.o
-+
-+obj-$(CONFIG_PT_PROXY) += gdb_kern.o 
-+
-+subdir-y = sys-$(SUBARCH)
-+subdir-$(CONFIG_PT_PROXY) += ptproxy
-+
-+obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o))
-+
-+export-objs = ksyms.o
-+
-+USER_OBJS = $(filter %_user.o,$(obj-y)) gdb.o time.o tracer.o
-+
-+UNMAP_CFLAGS := $(patsubst -pg -DPROFILING,,$(USER_CFLAGS))
-+UNMAP_CFLAGS := $(patsubst -fprofile-arcs -ftest-coverage,,$(UNMAP_CFLAGS))
-+
-+include $(TOPDIR)/Rules.make
-+
-+$(USER_OBJS) : %.o: %.c
-+	$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $<
-+
-+$(O_TARGET) : unmap_fin.o
-+
-+unmap.o: unmap.c
-+	$(CC) $(UNMAP_CFLAGS) -c -o $@ $<
-+
-+unmap_fin.o : unmap.o
-+	ld -r -o $@ $< -lc -L/usr/lib
-+
-+clean :
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/exec_kern.c um/arch/um/kernel/tt/exec_kern.c
---- orig/arch/um/kernel/tt/exec_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/exec_kern.c	Thu Oct 24 19:22:17 2002
+--- orig/arch/um/kernel/tt/exec_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/exec_kern.c	2002-10-24 19:22:17.000000000 -0400
 @@ -0,0 +1,83 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -27100,8 +26723,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/exec_kern.c um/arch/um/ker
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/exec_user.c um/arch/um/kernel/tt/exec_user.c
---- orig/arch/um/kernel/tt/exec_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/exec_user.c	Thu Dec  5 19:36:57 2002
+--- orig/arch/um/kernel/tt/exec_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/exec_user.c	2002-12-05 19:36:57.000000000 -0500
 @@ -0,0 +1,49 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -27153,8 +26776,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/exec_user.c um/arch/um/ker
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/gdb.c um/arch/um/kernel/tt/gdb.c
---- orig/arch/um/kernel/tt/gdb.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/gdb.c	Fri Jan 17 13:23:31 2003
+--- orig/arch/um/kernel/tt/gdb.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/gdb.c	2003-01-17 13:23:31.000000000 -0500
 @@ -0,0 +1,278 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -27435,8 +27058,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/gdb.c um/arch/um/kernel/tt
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/gdb_kern.c um/arch/um/kernel/tt/gdb_kern.c
---- orig/arch/um/kernel/tt/gdb_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/gdb_kern.c	Sun Dec 15 21:16:17 2002
+--- orig/arch/um/kernel/tt/gdb_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/gdb_kern.c	2002-12-15 21:16:17.000000000 -0500
 @@ -0,0 +1,40 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -27479,8 +27102,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/gdb_kern.c um/arch/um/kern
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/debug.h um/arch/um/kernel/tt/include/debug.h
---- orig/arch/um/kernel/tt/include/debug.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/include/debug.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/tt/include/debug.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/include/debug.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,29 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002  Jeff Dike (jdike@karaya.com) and
@@ -27512,8 +27135,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/debug.h um/arch/um
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/mmu.h um/arch/um/kernel/tt/include/mmu.h
---- orig/arch/um/kernel/tt/include/mmu.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/include/mmu.h	Sat Nov  9 12:51:32 2002
+--- orig/arch/um/kernel/tt/include/mmu.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/include/mmu.h	2002-11-09 12:51:32.000000000 -0500
 @@ -0,0 +1,23 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -27539,8 +27162,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/mmu.h um/arch/um/k
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/mode.h um/arch/um/kernel/tt/include/mode.h
---- orig/arch/um/kernel/tt/include/mode.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/include/mode.h	Mon Dec  9 00:34:40 2002
+--- orig/arch/um/kernel/tt/include/mode.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/include/mode.h	2002-12-09 00:34:40.000000000 -0500
 @@ -0,0 +1,36 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -27579,8 +27202,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/mode.h um/arch/um/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/mode_kern.h um/arch/um/kernel/tt/include/mode_kern.h
---- orig/arch/um/kernel/tt/include/mode_kern.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/include/mode_kern.h	Mon Dec 16 21:49:18 2002
+--- orig/arch/um/kernel/tt/include/mode_kern.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/include/mode_kern.h	2002-12-16 21:49:18.000000000 -0500
 @@ -0,0 +1,52 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -27635,8 +27258,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/mode_kern.h um/arc
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/ptrace-tt.h um/arch/um/kernel/tt/include/ptrace-tt.h
---- orig/arch/um/kernel/tt/include/ptrace-tt.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/include/ptrace-tt.h	Fri Jan 17 13:23:30 2003
+--- orig/arch/um/kernel/tt/include/ptrace-tt.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/include/ptrace-tt.h	2003-01-17 13:23:30.000000000 -0500
 @@ -0,0 +1,26 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -27665,8 +27288,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/ptrace-tt.h um/arc
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/tt.h um/arch/um/kernel/tt/include/tt.h
---- orig/arch/um/kernel/tt/include/tt.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/include/tt.h	Fri Dec 20 23:29:11 2002
+--- orig/arch/um/kernel/tt/include/tt.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/include/tt.h	2002-12-20 23:29:11.000000000 -0500
 @@ -0,0 +1,46 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -27715,8 +27338,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/tt.h um/arch/um/ke
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/uaccess.h um/arch/um/kernel/tt/include/uaccess.h
---- orig/arch/um/kernel/tt/include/uaccess.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/include/uaccess.h	Tue Mar 25 16:58:42 2003
+--- orig/arch/um/kernel/tt/include/uaccess.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/include/uaccess.h	2003-03-25 16:58:42.000000000 -0500
 @@ -0,0 +1,122 @@
 +/* 
 + * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com)
@@ -27841,8 +27464,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/uaccess.h um/arch/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ksyms.c um/arch/um/kernel/tt/ksyms.c
---- orig/arch/um/kernel/tt/ksyms.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/ksyms.c	Sun Oct 27 17:01:56 2002
+--- orig/arch/um/kernel/tt/ksyms.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/ksyms.c	2002-10-27 17:01:56.000000000 -0500
 @@ -0,0 +1,28 @@
 +/* 
 + * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -27872,9 +27495,52 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ksyms.c um/arch/um/kernel/
 + * c-file-style: "linux"
 + * End:
 + */
+diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/Makefile um/arch/um/kernel/tt/Makefile
+--- orig/arch/um/kernel/tt/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/Makefile	2002-12-20 23:29:42.000000000 -0500
+@@ -0,0 +1,39 @@
++# 
++# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
++# Licensed under the GPL
++#
++
++O_TARGET = tt.o
++
++obj-y = exec_kern.o exec_user.o gdb.o ksyms.o mem.o mem_user.o process_kern.o \
++	syscall_kern.o syscall_user.o time.o tlb.o tracer.o trap_user.o \
++	uaccess_user.o
++
++obj-$(CONFIG_PT_PROXY) += gdb_kern.o 
++
++subdir-y = sys-$(SUBARCH)
++subdir-$(CONFIG_PT_PROXY) += ptproxy
++
++obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o))
++
++export-objs = ksyms.o
++
++USER_OBJS = $(filter %_user.o,$(obj-y)) gdb.o time.o tracer.o
++
++UNMAP_CFLAGS := $(patsubst -pg -DPROFILING,,$(USER_CFLAGS))
++UNMAP_CFLAGS := $(patsubst -fprofile-arcs -ftest-coverage,,$(UNMAP_CFLAGS))
++
++include $(TOPDIR)/Rules.make
++
++$(USER_OBJS) : %.o: %.c
++	$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $<
++
++$(O_TARGET) : unmap_fin.o
++
++unmap.o: unmap.c
++	$(CC) $(UNMAP_CFLAGS) -c -o $@ $<
++
++unmap_fin.o : unmap.o
++	ld -r -o $@ $< -lc -L/usr/lib
++
++clean :
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/mem.c um/arch/um/kernel/tt/mem.c
---- orig/arch/um/kernel/tt/mem.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/mem.c	Mon Dec 16 21:49:51 2002
+--- orig/arch/um/kernel/tt/mem.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/mem.c	2002-12-16 21:49:51.000000000 -0500
 @@ -0,0 +1,51 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -27928,8 +27594,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/mem.c um/arch/um/kernel/tt
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/mem_user.c um/arch/um/kernel/tt/mem_user.c
---- orig/arch/um/kernel/tt/mem_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/mem_user.c	Fri Jan 17 22:07:31 2003
+--- orig/arch/um/kernel/tt/mem_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/mem_user.c	2003-01-17 22:07:31.000000000 -0500
 @@ -0,0 +1,50 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -27982,9 +27648,9 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/mem_user.c um/arch/um/kern
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/process_kern.c um/arch/um/kernel/tt/process_kern.c
---- orig/arch/um/kernel/tt/process_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/process_kern.c	Sun Feb 16 21:34:23 2003
-@@ -0,0 +1,516 @@
+--- orig/arch/um/kernel/tt/process_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/process_kern.c	2003-05-29 13:46:00.000000000 -0400
+@@ -0,0 +1,517 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
 + * Licensed under the GPL
@@ -28169,6 +27835,7 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/process_kern.c um/arch/um/
 +int fork_tramp(void *stack)
 +{
 +	cli();
++	arch_init_thread();
 +	init_new_thread_stack(stack, finish_fork_handler);
 +	os_usr1_process(os_getpid());
 +	return(0);
@@ -28502,8 +28169,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/process_kern.c um/arch/um/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/Makefile um/arch/um/kernel/tt/ptproxy/Makefile
---- orig/arch/um/kernel/tt/ptproxy/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/ptproxy/Makefile	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/tt/ptproxy/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/ptproxy/Makefile	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,12 @@
 +O_TARGET = ptproxy.o
 +
@@ -28518,8 +28185,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/Makefile um/arch/u
 +
 +clean:
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/proxy.c um/arch/um/kernel/tt/ptproxy/proxy.c
---- orig/arch/um/kernel/tt/ptproxy/proxy.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/ptproxy/proxy.c	Wed Apr 16 14:01:03 2003
+--- orig/arch/um/kernel/tt/ptproxy/proxy.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/ptproxy/proxy.c	2003-04-16 14:01:03.000000000 -0400
 @@ -0,0 +1,370 @@
 +/**********************************************************************
 +proxy.c
@@ -28892,8 +28559,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/proxy.c um/arch/um
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/ptproxy.h um/arch/um/kernel/tt/ptproxy/ptproxy.h
---- orig/arch/um/kernel/tt/ptproxy/ptproxy.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/ptproxy/ptproxy.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/tt/ptproxy/ptproxy.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/ptproxy/ptproxy.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,61 @@
 +/**********************************************************************
 +ptproxy.h
@@ -28957,8 +28624,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/ptproxy.h um/arch/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/ptrace.c um/arch/um/kernel/tt/ptproxy/ptrace.c
---- orig/arch/um/kernel/tt/ptproxy/ptrace.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/ptproxy/ptrace.c	Mon Nov 11 13:06:03 2002
+--- orig/arch/um/kernel/tt/ptproxy/ptrace.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/ptproxy/ptrace.c	2002-11-11 13:06:03.000000000 -0500
 @@ -0,0 +1,239 @@
 +/**********************************************************************
 +ptrace.c
@@ -29200,8 +28867,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/ptrace.c um/arch/u
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/sysdep.c um/arch/um/kernel/tt/ptproxy/sysdep.c
---- orig/arch/um/kernel/tt/ptproxy/sysdep.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/ptproxy/sysdep.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/tt/ptproxy/sysdep.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/ptproxy/sysdep.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,71 @@
 +/**********************************************************************
 +sysdep.c
@@ -29275,8 +28942,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/sysdep.c um/arch/u
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/sysdep.h um/arch/um/kernel/tt/ptproxy/sysdep.h
---- orig/arch/um/kernel/tt/ptproxy/sysdep.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/ptproxy/sysdep.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/tt/ptproxy/sysdep.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/ptproxy/sysdep.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,25 @@
 +/**********************************************************************
 +sysdep.h
@@ -29304,8 +28971,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/sysdep.h um/arch/u
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/wait.c um/arch/um/kernel/tt/ptproxy/wait.c
---- orig/arch/um/kernel/tt/ptproxy/wait.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/ptproxy/wait.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/tt/ptproxy/wait.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/ptproxy/wait.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,86 @@
 +/**********************************************************************
 +wait.c
@@ -29394,8 +29061,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/wait.c um/arch/um/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/wait.h um/arch/um/kernel/tt/ptproxy/wait.h
---- orig/arch/um/kernel/tt/ptproxy/wait.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/ptproxy/wait.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/tt/ptproxy/wait.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/ptproxy/wait.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,15 @@
 +/**********************************************************************
 +wait.h
@@ -29412,94 +29079,9 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/wait.h um/arch/um/
 +extern int parent_wait_return(struct debugger *debugger, pid_t unused);
 +
 +#endif
-diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/sys-i386/Makefile um/arch/um/kernel/tt/sys-i386/Makefile
---- orig/arch/um/kernel/tt/sys-i386/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/sys-i386/Makefile	Wed Oct 23 21:08:04 2002
-@@ -0,0 +1,17 @@
-+# 
-+# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+# Licensed under the GPL
-+#
-+
-+O_TARGET = sys-i386.o
-+
-+obj-y = sigcontext.o
-+
-+USER_OBJS = sigcontext.o
-+
-+include $(TOPDIR)/Rules.make
-+
-+$(USER_OBJS) : %.o: %.c
-+	$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $<
-+
-+clean :
-diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/sys-i386/sigcontext.c um/arch/um/kernel/tt/sys-i386/sigcontext.c
---- orig/arch/um/kernel/tt/sys-i386/sigcontext.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/sys-i386/sigcontext.c	Sun Dec  1 23:33:52 2002
-@@ -0,0 +1,60 @@
-+/* 
-+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#include <stdlib.h>
-+#include <asm/sigcontext.h>
-+#include "kern_util.h"
-+#include "sysdep/frame.h"
-+
-+int copy_sc_from_user_tt(void *to_ptr, void *from_ptr, void *data)
-+{
-+	struct arch_frame_data *arch = data;
-+	struct sigcontext *to = to_ptr, *from = from_ptr;
-+	struct _fpstate *to_fp, *from_fp;
-+	unsigned long sigs;
-+	int err;
-+
-+	to_fp = to->fpstate;
-+	from_fp = from->fpstate;
-+	sigs = to->oldmask;
-+	err = copy_from_user_proc(to, from, sizeof(*to));
-+	to->oldmask = sigs;
-+	if(to_fp != NULL){
-+		err |= copy_from_user_proc(&to->fpstate, &to_fp,
-+					   sizeof(to->fpstate));
-+		err |= copy_from_user_proc(to_fp, from_fp, arch->fpstate_size);
-+	}
-+	return(err);
-+}
-+
-+int copy_sc_to_user_tt(void *to_ptr, void *fp, void *from_ptr, void *data)
-+{
-+	struct arch_frame_data *arch = data;
-+	struct sigcontext *to = to_ptr, *from = from_ptr;
-+	struct _fpstate *to_fp, *from_fp;
-+	int err;
-+
-+	to_fp = (struct _fpstate *) 
-+		(fp ? (unsigned long) fp : ((unsigned long) to + sizeof(*to)));
-+	from_fp = from->fpstate;
-+	err = copy_to_user_proc(to, from, sizeof(*to));
-+	if(from_fp != NULL){
-+		err |= copy_to_user_proc(&to->fpstate, &to_fp,
-+					 sizeof(to->fpstate));
-+		err |= copy_to_user_proc(to_fp, from_fp, arch->fpstate_size);
-+	}
-+	return(err);
-+}
-+
-+/*
-+ * 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-file-style: "linux"
-+ * End:
-+ */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/syscall_kern.c um/arch/um/kernel/tt/syscall_kern.c
---- orig/arch/um/kernel/tt/syscall_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/syscall_kern.c	Sun Dec  8 19:32:53 2002
+--- orig/arch/um/kernel/tt/syscall_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/syscall_kern.c	2002-12-08 19:32:53.000000000 -0500
 @@ -0,0 +1,142 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -29644,8 +29226,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/syscall_kern.c um/arch/um/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/syscall_user.c um/arch/um/kernel/tt/syscall_user.c
---- orig/arch/um/kernel/tt/syscall_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/syscall_user.c	Sun Dec  8 21:00:11 2002
+--- orig/arch/um/kernel/tt/syscall_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/syscall_user.c	2002-12-08 21:00:11.000000000 -0500
 @@ -0,0 +1,89 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -29736,9 +29318,94 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/syscall_user.c um/arch/um/
 + * c-file-style: "linux"
 + * End:
 + */
+diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/sys-i386/Makefile um/arch/um/kernel/tt/sys-i386/Makefile
+--- orig/arch/um/kernel/tt/sys-i386/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/sys-i386/Makefile	2002-10-23 21:08:04.000000000 -0400
+@@ -0,0 +1,17 @@
++# 
++# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
++# Licensed under the GPL
++#
++
++O_TARGET = sys-i386.o
++
++obj-y = sigcontext.o
++
++USER_OBJS = sigcontext.o
++
++include $(TOPDIR)/Rules.make
++
++$(USER_OBJS) : %.o: %.c
++	$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $<
++
++clean :
+diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/sys-i386/sigcontext.c um/arch/um/kernel/tt/sys-i386/sigcontext.c
+--- orig/arch/um/kernel/tt/sys-i386/sigcontext.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/sys-i386/sigcontext.c	2002-12-01 23:33:52.000000000 -0500
+@@ -0,0 +1,60 @@
++/* 
++ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
++ * Licensed under the GPL
++ */
++
++#include <stdlib.h>
++#include <asm/sigcontext.h>
++#include "kern_util.h"
++#include "sysdep/frame.h"
++
++int copy_sc_from_user_tt(void *to_ptr, void *from_ptr, void *data)
++{
++	struct arch_frame_data *arch = data;
++	struct sigcontext *to = to_ptr, *from = from_ptr;
++	struct _fpstate *to_fp, *from_fp;
++	unsigned long sigs;
++	int err;
++
++	to_fp = to->fpstate;
++	from_fp = from->fpstate;
++	sigs = to->oldmask;
++	err = copy_from_user_proc(to, from, sizeof(*to));
++	to->oldmask = sigs;
++	if(to_fp != NULL){
++		err |= copy_from_user_proc(&to->fpstate, &to_fp,
++					   sizeof(to->fpstate));
++		err |= copy_from_user_proc(to_fp, from_fp, arch->fpstate_size);
++	}
++	return(err);
++}
++
++int copy_sc_to_user_tt(void *to_ptr, void *fp, void *from_ptr, void *data)
++{
++	struct arch_frame_data *arch = data;
++	struct sigcontext *to = to_ptr, *from = from_ptr;
++	struct _fpstate *to_fp, *from_fp;
++	int err;
++
++	to_fp = (struct _fpstate *) 
++		(fp ? (unsigned long) fp : ((unsigned long) to + sizeof(*to)));
++	from_fp = from->fpstate;
++	err = copy_to_user_proc(to, from, sizeof(*to));
++	if(from_fp != NULL){
++		err |= copy_to_user_proc(&to->fpstate, &to_fp,
++					 sizeof(to->fpstate));
++		err |= copy_to_user_proc(to_fp, from_fp, arch->fpstate_size);
++	}
++	return(err);
++}
++
++/*
++ * 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-file-style: "linux"
++ * End:
++ */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/time.c um/arch/um/kernel/tt/time.c
---- orig/arch/um/kernel/tt/time.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/time.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/tt/time.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/time.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,28 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -29769,8 +29436,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/time.c um/arch/um/kernel/t
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/tlb.c um/arch/um/kernel/tt/tlb.c
---- orig/arch/um/kernel/tt/tlb.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/tlb.c	Thu Dec 19 13:03:11 2002
+--- orig/arch/um/kernel/tt/tlb.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/tlb.c	2002-12-19 13:03:11.000000000 -0500
 @@ -0,0 +1,220 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -29993,8 +29660,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/tlb.c um/arch/um/kernel/tt
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/tracer.c um/arch/um/kernel/tt/tracer.c
---- orig/arch/um/kernel/tt/tracer.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/tracer.c	Wed Mar 26 10:01:33 2003
+--- orig/arch/um/kernel/tt/tracer.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/tracer.c	2003-03-26 10:01:33.000000000 -0500
 @@ -0,0 +1,453 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -30450,8 +30117,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/tracer.c um/arch/um/kernel
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/trap_user.c um/arch/um/kernel/tt/trap_user.c
---- orig/arch/um/kernel/tt/trap_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/trap_user.c	Mon Dec  9 13:14:42 2002
+--- orig/arch/um/kernel/tt/trap_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/trap_user.c	2002-12-09 13:14:42.000000000 -0500
 @@ -0,0 +1,59 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -30513,8 +30180,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/trap_user.c um/arch/um/ker
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/uaccess_user.c um/arch/um/kernel/tt/uaccess_user.c
---- orig/arch/um/kernel/tt/uaccess_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/uaccess_user.c	Tue Mar 25 17:10:54 2003
+--- orig/arch/um/kernel/tt/uaccess_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/uaccess_user.c	2003-03-25 17:10:54.000000000 -0500
 @@ -0,0 +1,100 @@
 +/* 
 + * Copyright (C) 2001 Chris Emerson (cemerson@chiark.greenend.org.uk)
@@ -30617,8 +30284,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/uaccess_user.c um/arch/um/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/unmap.c um/arch/um/kernel/tt/unmap.c
---- orig/arch/um/kernel/tt/unmap.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tt/unmap.c	Wed Dec 11 10:42:21 2002
+--- orig/arch/um/kernel/tt/unmap.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tt/unmap.c	2002-12-11 10:42:21.000000000 -0500
 @@ -0,0 +1,31 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -30652,8 +30319,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/unmap.c um/arch/um/kernel/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/tty_log.c um/arch/um/kernel/tty_log.c
---- orig/arch/um/kernel/tty_log.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/tty_log.c	Wed Apr 16 16:35:20 2003
+--- orig/arch/um/kernel/tty_log.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/tty_log.c	2003-04-16 16:35:20.000000000 -0400
 @@ -0,0 +1,213 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) and 
@@ -30869,8 +30536,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/tty_log.c um/arch/um/kernel/t
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/uaccess_user.c um/arch/um/kernel/uaccess_user.c
---- orig/arch/um/kernel/uaccess_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/uaccess_user.c	Tue Mar 25 17:06:05 2003
+--- orig/arch/um/kernel/uaccess_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/uaccess_user.c	2003-03-25 17:06:05.000000000 -0500
 @@ -0,0 +1,64 @@
 +/* 
 + * Copyright (C) 2001 Chris Emerson (cemerson@chiark.greenend.org.uk)
@@ -30937,8 +30604,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/uaccess_user.c um/arch/um/ker
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/um_arch.c um/arch/um/kernel/um_arch.c
---- orig/arch/um/kernel/um_arch.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/um_arch.c	Thu Mar  6 19:06:09 2003
+--- orig/arch/um/kernel/um_arch.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/um_arch.c	2003-03-06 19:06:09.000000000 -0500
 @@ -0,0 +1,425 @@
 +/* 
 + * Copyright (C) 2000, 2002 Jeff Dike (jdike@karaya.com)
@@ -31366,8 +31033,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/um_arch.c um/arch/um/kernel/u
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/umid.c um/arch/um/kernel/umid.c
---- orig/arch/um/kernel/umid.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/umid.c	Mon Feb 24 23:11:23 2003
+--- orig/arch/um/kernel/umid.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/umid.c	2003-02-24 23:11:23.000000000 -0500
 @@ -0,0 +1,319 @@
 +/* 
 + * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -31689,8 +31356,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/umid.c um/arch/um/kernel/umid
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/kernel/user_syms.c um/arch/um/kernel/user_syms.c
---- orig/arch/um/kernel/user_syms.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/user_syms.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/kernel/user_syms.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/user_syms.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,116 @@
 +#include <stdio.h>
 +#include <unistd.h>
@@ -31809,8 +31476,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/user_syms.c um/arch/um/kernel
 +
 +EXPORT_SYMBOL(find_iomem);
 diff -Naur -X ../exclude-files orig/arch/um/kernel/user_util.c um/arch/um/kernel/user_util.c
---- orig/arch/um/kernel/user_util.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/kernel/user_util.c	Wed Apr 23 20:41:54 2003
+--- orig/arch/um/kernel/user_util.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/kernel/user_util.c	2003-04-23 20:41:54.000000000 -0400
 @@ -0,0 +1,164 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -31977,8 +31644,8 @@ diff -Naur -X ../exclude-files orig/arch/um/kernel/user_util.c um/arch/um/kernel
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/link.ld.in um/arch/um/link.ld.in
---- orig/arch/um/link.ld.in	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/link.ld.in	Fri Jan 17 23:11:30 2003
+--- orig/arch/um/link.ld.in	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/link.ld.in	2003-01-17 23:11:30.000000000 -0500
 @@ -0,0 +1,95 @@
 +OUTPUT_FORMAT("ELF_FORMAT")
 +OUTPUT_ARCH(ELF_ARCH)
@@ -32076,8 +31743,8 @@ diff -Naur -X ../exclude-files orig/arch/um/link.ld.in um/arch/um/link.ld.in
 +  .comment 0 : { *(.comment) }
 +}
 diff -Naur -X ../exclude-files orig/arch/um/main.c um/arch/um/main.c
---- orig/arch/um/main.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/main.c	Fri Jan 17 13:22:40 2003
+--- orig/arch/um/main.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/main.c	2003-01-17 13:22:40.000000000 -0500
 @@ -0,0 +1,195 @@
 +/* 
 + * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com)
@@ -32274,65 +31941,284 @@ diff -Naur -X ../exclude-files orig/arch/um/main.c um/arch/um/main.c
 + * c-file-style: "linux"
 + * End:
 + */
-diff -Naur -X ../exclude-files orig/arch/um/os-Linux/Makefile um/arch/um/os-Linux/Makefile
---- orig/arch/um/os-Linux/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/os-Linux/Makefile	Wed Oct 23 21:08:04 2002
-@@ -0,0 +1,17 @@
+diff -Naur -X ../exclude-files orig/arch/um/Makefile um/arch/um/Makefile
+--- orig/arch/um/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/Makefile	2003-06-05 15:42:11.000000000 -0400
+@@ -0,0 +1,168 @@
 +# 
-+# Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
++# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
 +# Licensed under the GPL
 +#
 +
-+O_TARGET = built-in.o
++OS := $(shell uname -s)
 +
-+obj-y = file.o process.o tty.o
++ARCH_DIR = arch/um
 +
-+include $(TOPDIR)/Rules.make
++core-y := kernel sys-$(SUBARCH) os-$(OS)
++drivers-y := fs drivers
++subdir-y := $(core-y) $(drivers-y)
++SUBDIRS += $(foreach dir,$(subdir-y),$(ARCH_DIR)/$(dir))
 +
-+$(obj-y) : %.o: %.c
-+	$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $<
++CORE_FILES += $(foreach dir,$(core-y),$(ARCH_DIR)/$(dir)/built-in.o)
++DRIVERS += $(foreach dir,$(drivers-y),$(ARCH_DIR)/$(dir)/built-in.o)
 +
-+clean :
++include $(ARCH_DIR)/Makefile-$(SUBARCH)
++include $(ARCH_DIR)/Makefile-os-$(OS)
++
++MAKEFILE-$(CONFIG_MODE_TT) += Makefile-tt
++MAKEFILE-$(CONFIG_MODE_SKAS) += Makefile-skas
++
++ifneq ($(MAKEFILE-y),)
++  include $(addprefix $(ARCH_DIR)/,$(MAKEFILE-y))
++endif
++
++EXTRAVERSION := $(EXTRAVERSION)-6um
++
++include/linux/version.h: arch/$(ARCH)/Makefile
++
++# Recalculate MODLIB to reflect the EXTRAVERSION changes (via KERNELRELEASE)
++# The way the toplevel Makefile is written EXTRAVERSION is not supposed
++# to be changed outside the toplevel Makefile, but recalculating MODLIB is
++# a sufficient workaround until we no longer need architecture dependent
++# EXTRAVERSION...
++MODLIB := $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
++
++ifeq ($(CONFIG_DEBUGSYM),y)
++CFLAGS := $(subst -fomit-frame-pointer,,$(CFLAGS))
++endif
++
++CFLAGS-$(CONFIG_DEBUGSYM) += -g
++
++ARCH_INCLUDE = -I$(TOPDIR)/$(ARCH_DIR)/include
++
++# -Derrno=kernel_errno - This turns all kernel references to errno into
++# kernel_errno to separate them from the libc errno.  This allows -fno-common
++# in CFLAGS.  Otherwise, it would cause ld to complain about the two different
++# errnos.
++
++CFLAGS += $(ARCH_CFLAGS) $(CFLAGS-y) -D__arch_um__ -DSUBARCH=\"$(SUBARCH)\" \
++	-D_LARGEFILE64_SOURCE $(ARCH_INCLUDE) -Derrno=kernel_errno \
++	$(MODE_INCLUDE)
++
++LINKFLAGS += -r
++
++LINK_WRAPS = -Wl,--wrap,malloc -Wl,--wrap,free -Wl,--wrap,calloc
++
++SIZE = (($(CONFIG_NEST_LEVEL) + $(CONFIG_KERNEL_HALF_GIGS)) * 0x20000000)
++
++# These aren't in Makefile-tt because they are needed in the !CONFIG_MODE_TT +
++# CONFIG_MODE_SKAS + CONFIG_STATIC_LINK case.
++
++LINK_TT = -static
++LD_SCRIPT_TT := link.ld
++
++ifeq ($(CONFIG_STATIC_LINK),y)
++  LINK-y += $(LINK_TT)
++  LD_SCRIPT-y := $(LD_SCRIPT_TT)
++else
++ifeq ($(CONFIG_MODE_TT),y)
++  LINK-y += $(LINK_TT)
++  LD_SCRIPT-y := $(LD_SCRIPT_TT)
++else
++ifeq ($(CONFIG_MODE_SKAS),y)
++  LINK-y += $(LINK_SKAS)
++  LD_SCRIPT-y := $(LD_SCRIPT_SKAS)
++endif
++endif
++endif
++
++LD_SCRIPT-y := $(ARCH_DIR)/$(LD_SCRIPT-y)
++M4_MODE_TT := $(shell [ "$(CONFIG_MODE_TT)" = "y" ] && echo -DMODE_TT)
++
++$(LD_SCRIPT-y): $(LD_SCRIPT-y).in
++	pages=$$(( 1 << $(CONFIG_KERNEL_STACK_ORDER) )) ; \
++	m4 -DSTART=$$(($(TOP_ADDR) - $(SIZE))) -DELF_ARCH=$(ELF_ARCH) \
++		-DELF_FORMAT=$(ELF_FORMAT) $(M4_MODE_TT) \
++		-DKERNEL_STACK_SIZE=$$(( 4096 * $$pages )) $< > $@
++
++SYMLINK_HEADERS = include/asm-um/archparam.h include/asm-um/system.h \
++	include/asm-um/sigcontext.h include/asm-um/processor.h \
++	include/asm-um/ptrace.h include/asm-um/arch-signal.h
++
++ARCH_SYMLINKS = include/asm-um/arch arch/um/include/sysdep arch/um/os \
++	$(SYMLINK_HEADERS) $(ARCH_DIR)/include/uml-config.h
++
++ifeq ($(CONFIG_MODE_SKAS), y)
++$(SYS_HEADERS) : $(ARCH_DIR)/kernel/skas/include/skas_ptregs.h
++endif
++
++GEN_HEADERS += $(ARCH_DIR)/include/task.h $(ARCH_DIR)/include/kern_constants.h 
++
++setup: $(ARCH_SYMLINKS) $(SYS_HEADERS) $(GEN_HEADERS) 
++
++linux: setup $(ARCH_DIR)/main.o vmlinux $(LD_SCRIPT-y)
++	mv vmlinux vmlinux.o
++	$(CC) -Wl,-T,$(LD_SCRIPT-y) $(LINK-y) $(LINK_WRAPS) \
++		-o linux $(ARCH_DIR)/main.o vmlinux.o -L/usr/lib -lutil
++
++USER_CFLAGS := $(patsubst -I%,,$(CFLAGS))
++USER_CFLAGS := $(patsubst -Derrno=kernel_errno,,$(USER_CFLAGS))
++USER_CFLAGS := $(patsubst -D__KERNEL__,,$(USER_CFLAGS)) $(ARCH_INCLUDE) \
++	$(MODE_INCLUDE)
++
++# To get a definition of F_SETSIG
++USER_CFLAGS += -D_GNU_SOURCE
++
++CLEAN_FILES += linux x.i gmon.out $(ARCH_DIR)/link.ld $(ARCH_DIR)/dyn_link.ld \
++	$(GEN_HEADERS) $(ARCH_DIR)/include/uml-config.h
++
++$(ARCH_DIR)/main.o: $(ARCH_DIR)/main.c
++	$(CC) $(USER_CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $<
 +
 +archmrproper:
-diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/Makefile um/arch/um/os-Linux/drivers/Makefile
---- orig/arch/um/os-Linux/drivers/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/os-Linux/drivers/Makefile	Wed Oct 23 21:08:04 2002
-@@ -0,0 +1,31 @@
++	rm -f $(SYMLINK_HEADERS) $(ARCH_SYMLINKS) include/asm \
++		$(LD_SCRIPT) $(addprefix $(ARCH_DIR)/kernel/,$(KERN_SYMLINKS))
++
++archclean: sysclean
++	find . \( -name '*.bb' -o -name '*.bbg' -o -name '*.da' \
++		-o -name '*.gcov' \) -type f -print | xargs rm -f
++	cd $(ARCH_DIR) ; \
++	for dir in $(subdir-y) util ; do $(MAKE) -C $$dir clean; done
++
++archdep: 
++
++$(SYMLINK_HEADERS):
++	cd $(TOPDIR)/$(dir $@) ; \
++	ln -sf $(basename $(notdir $@))-$(SUBARCH)$(suffix $@) $(notdir $@)
++
++include/asm-um/arch:
++	cd $(TOPDIR)/include/asm-um && ln -sf ../asm-$(SUBARCH) arch
++
++arch/um/include/sysdep:
++	cd $(TOPDIR)/arch/um/include && ln -sf sysdep-$(SUBARCH) sysdep
++
++arch/um/os:
++	cd $(ARCH_DIR) && ln -sf os-$(OS) os
++
++$(ARCH_DIR)/include/task.h : $(ARCH_DIR)/util/mk_task
++	$< > $@
++
++$(ARCH_DIR)/include/kern_constants.h : $(ARCH_DIR)/util/mk_constants
++	$< > $@
++
++$(ARCH_DIR)/include/uml-config.h : $(TOPDIR)/include/linux/autoconf.h
++	sed 's/ CONFIG/ UML_CONFIG/' $(TOPDIR)/include/linux/autoconf.h > $@
++
++$(ARCH_DIR)/util/mk_task : $(ARCH_DIR)/util/mk_task_user.c \
++	$(ARCH_DIR)/util/mk_task_kern.c $(SYS_HEADERS)
++	$(MAKE) $(MFLAGS) -C $(ARCH_DIR)/util mk_task
++
++$(ARCH_DIR)/util/mk_constants : $(ARCH_DIR)/util/mk_constants_user.c \
++	$(ARCH_DIR)/util/mk_constants_kern.c 
++	$(MAKE) $(MFLAGS) -C $(ARCH_DIR)/util mk_constants
++
++export SUBARCH USER_CFLAGS OS
+diff -Naur -X ../exclude-files orig/arch/um/Makefile-i386 um/arch/um/Makefile-i386
+--- orig/arch/um/Makefile-i386	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/Makefile-i386	2002-10-23 21:08:04.000000000 -0400
+@@ -0,0 +1,35 @@
++ifeq ($(CONFIG_HOST_2G_2G), y)
++TOP_ADDR = 0x80000000
++else
++TOP_ADDR = 0xc0000000
++endif
++
++ARCH_CFLAGS = -U__$(SUBARCH)__ -U$(SUBARCH) -DUM_FASTCALL
++ELF_ARCH = $(SUBARCH)
++ELF_FORMAT = elf32-$(SUBARCH)
++
++I386_H = $(ARCH_DIR)/include/sysdep-i386
++SYS = $(ARCH_DIR)/sys-i386
++UTIL = $(SYS)/util
++SUBDIRS += $(UTIL)
++
++SYS_HEADERS = $(I386_H)/sc.h $(I386_H)/thread.h
++
++$(I386_H)/sc.h : $(UTIL)/mk_sc
++	$(UTIL)/mk_sc > $@
++
++$(I386_H)/thread.h : $(UTIL)/mk_thread
++	$(UTIL)/mk_thread > $@
++
++$(UTIL)/mk_sc : $(UTIL)/mk_sc.c
++	$(MAKE) -C $(UTIL) mk_sc
++
++$(UTIL)/mk_thread : $(UTIL)/mk_thread_user.c $(UTIL)/mk_thread_kern.c \
++	$(I386_H)/sc.h
++	$(MAKE) -C $(UTIL) mk_thread
++
++sysclean :
++	rm -f $(SYS_HEADERS)
++	$(MAKE) -C $(UTIL) clean
++	$(MAKE) -C $(SYS) clean
++
+diff -Naur -X ../exclude-files orig/arch/um/Makefile-ia64 um/arch/um/Makefile-ia64
+--- orig/arch/um/Makefile-ia64	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/Makefile-ia64	2002-10-23 21:08:04.000000000 -0400
+@@ -0,0 +1 @@
++START_ADDR = 0x1000000000000000
+diff -Naur -X ../exclude-files orig/arch/um/Makefile-os-Linux um/arch/um/Makefile-os-Linux
+--- orig/arch/um/Makefile-os-Linux	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/Makefile-os-Linux	2002-12-09 14:21:51.000000000 -0500
+@@ -0,0 +1,7 @@
 +# 
-+# Copyright (C) 2000, 2002 Jeff Dike (jdike@karaya.com)
++# Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
 +# Licensed under the GPL
 +#
 +
-+O_TARGET := drivers.o
-+
-+list-multi := tuntap.o ethertap.o
++SUBDIRS += $(ARCH_DIR)/os-$(OS)/drivers
++DRIVERS += $(ARCH_DIR)/os-$(OS)/drivers/drivers.o
+diff -Naur -X ../exclude-files orig/arch/um/Makefile-ppc um/arch/um/Makefile-ppc
+--- orig/arch/um/Makefile-ppc	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/Makefile-ppc	2002-10-23 21:08:04.000000000 -0400
+@@ -0,0 +1,9 @@
++ifeq ($(CONFIG_HOST_2G_2G), y)
++START_ADDR = 0x80000000
++else
++START_ADDR = 0xc0000000
++endif
++ARCH_CFLAGS = -U__powerpc__ -D__UM_PPC__
 +
-+ethertap-objs := ethertap_kern.o ethertap_user.o
-+tuntap-objs := tuntap_kern.o tuntap_user.o
++# The arch is ppc, but the elf32 name is powerpc
++ELF_SUBARCH = powerpc
+diff -Naur -X ../exclude-files orig/arch/um/Makefile-skas um/arch/um/Makefile-skas
+--- orig/arch/um/Makefile-skas	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/Makefile-skas	2002-12-15 22:02:57.000000000 -0500
+@@ -0,0 +1,20 @@
++# 
++# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
++# Licensed under the GPL
++#
 +
-+obj-y = 
-+obj-$(CONFIG_UML_NET_ETHERTAP) += ethertap.o
-+obj-$(CONFIG_UML_NET_TUNTAP) += tuntap.o
++PROFILE += -pg
 +
-+USER_SINGLE_OBJS = $(foreach f,$(patsubst %.o,%,$(obj-y)),$($(f)-objs))
++CFLAGS-$(CONFIG_GCOV) += -fprofile-arcs -ftest-coverage
++CFLAGS-$(CONFIG_GPROF) += $(PROFILE)
++LINK-$(CONFIG_GPROF) += $(PROFILE)
 +
-+USER_OBJS = $(filter %_user.o,$(obj-y) $(USER_SINGLE_OBJS))
++MODE_INCLUDE += -I$(TOPDIR)/$(ARCH_DIR)/kernel/skas/include
 +
-+include $(TOPDIR)/Rules.make
++LINK_SKAS = -Wl,-rpath,/lib 
++LD_SCRIPT_SKAS = dyn_link.ld
 +
-+$(USER_OBJS) : %.o: %.c
-+	$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $<
++GEN_HEADERS += $(ARCH_DIR)/kernel/skas/include/skas_ptregs.h
 +
-+ethertap.o : $(ethertap-objs)
++$(ARCH_DIR)/kernel/skas/include/skas_ptregs.h :
++	$(MAKE) -C $(ARCH_DIR)/kernel/skas include/skas_ptregs.h
+diff -Naur -X ../exclude-files orig/arch/um/Makefile-tt um/arch/um/Makefile-tt
+--- orig/arch/um/Makefile-tt	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/Makefile-tt	2002-12-16 20:22:23.000000000 -0500
+@@ -0,0 +1,7 @@
++# 
++# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
++# Licensed under the GPL
++#
 +
-+tuntap.o : $(tuntap-objs)
++MODE_INCLUDE += -I$(TOPDIR)/$(ARCH_DIR)/kernel/tt/include
 +
-+$(list-multi) : # This doesn't work, but should : '%.o : $(%-objs)'
-+	$(LD) $(LD_RFLAG) -r -o $@ $($(patsubst %.o,%,$@)-objs)
 diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/etap.h um/arch/um/os-Linux/drivers/etap.h
---- orig/arch/um/os-Linux/drivers/etap.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/os-Linux/drivers/etap.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/os-Linux/drivers/etap.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/os-Linux/drivers/etap.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,27 @@
 +/* 
 + * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
@@ -32362,8 +32248,8 @@ diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/etap.h um/arch/um/o
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/ethertap_kern.c um/arch/um/os-Linux/drivers/ethertap_kern.c
---- orig/arch/um/os-Linux/drivers/ethertap_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/os-Linux/drivers/ethertap_kern.c	Sun Dec 15 21:17:37 2002
+--- orig/arch/um/os-Linux/drivers/ethertap_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/os-Linux/drivers/ethertap_kern.c	2002-12-15 21:17:37.000000000 -0500
 @@ -0,0 +1,122 @@
 +/*
 + * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) and 
@@ -32488,8 +32374,8 @@ diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/ethertap_kern.c um/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/ethertap_user.c um/arch/um/os-Linux/drivers/ethertap_user.c
---- orig/arch/um/os-Linux/drivers/ethertap_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/os-Linux/drivers/ethertap_user.c	Sun Dec 15 21:17:52 2002
+--- orig/arch/um/os-Linux/drivers/ethertap_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/os-Linux/drivers/ethertap_user.c	2002-12-15 21:17:52.000000000 -0500
 @@ -0,0 +1,238 @@
 +/*
 + * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) and 
@@ -32729,9 +32615,44 @@ diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/ethertap_user.c um/
 + * c-file-style: "linux"
 + * End:
 + */
+diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/Makefile um/arch/um/os-Linux/drivers/Makefile
+--- orig/arch/um/os-Linux/drivers/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/os-Linux/drivers/Makefile	2002-10-23 21:08:04.000000000 -0400
+@@ -0,0 +1,31 @@
++# 
++# Copyright (C) 2000, 2002 Jeff Dike (jdike@karaya.com)
++# Licensed under the GPL
++#
++
++O_TARGET := drivers.o
++
++list-multi := tuntap.o ethertap.o
++
++ethertap-objs := ethertap_kern.o ethertap_user.o
++tuntap-objs := tuntap_kern.o tuntap_user.o
++
++obj-y = 
++obj-$(CONFIG_UML_NET_ETHERTAP) += ethertap.o
++obj-$(CONFIG_UML_NET_TUNTAP) += tuntap.o
++
++USER_SINGLE_OBJS = $(foreach f,$(patsubst %.o,%,$(obj-y)),$($(f)-objs))
++
++USER_OBJS = $(filter %_user.o,$(obj-y) $(USER_SINGLE_OBJS))
++
++include $(TOPDIR)/Rules.make
++
++$(USER_OBJS) : %.o: %.c
++	$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $<
++
++ethertap.o : $(ethertap-objs)
++
++tuntap.o : $(tuntap-objs)
++
++$(list-multi) : # This doesn't work, but should : '%.o : $(%-objs)'
++	$(LD) $(LD_RFLAG) -r -o $@ $($(patsubst %.o,%,$@)-objs)
 diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/tuntap.h um/arch/um/os-Linux/drivers/tuntap.h
---- orig/arch/um/os-Linux/drivers/tuntap.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/os-Linux/drivers/tuntap.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/os-Linux/drivers/tuntap.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/os-Linux/drivers/tuntap.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,32 @@
 +/* 
 + * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -32766,8 +32687,8 @@ diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/tuntap.h um/arch/um
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/tuntap_kern.c um/arch/um/os-Linux/drivers/tuntap_kern.c
---- orig/arch/um/os-Linux/drivers/tuntap_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/os-Linux/drivers/tuntap_kern.c	Sun Dec 15 21:18:16 2002
+--- orig/arch/um/os-Linux/drivers/tuntap_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/os-Linux/drivers/tuntap_kern.c	2002-12-15 21:18:16.000000000 -0500
 @@ -0,0 +1,105 @@
 +/* 
 + * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
@@ -32875,8 +32796,8 @@ diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/tuntap_kern.c um/ar
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/tuntap_user.c um/arch/um/os-Linux/drivers/tuntap_user.c
---- orig/arch/um/os-Linux/drivers/tuntap_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/os-Linux/drivers/tuntap_user.c	Sun Dec 15 21:18:25 2002
+--- orig/arch/um/os-Linux/drivers/tuntap_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/os-Linux/drivers/tuntap_user.c	2002-12-15 21:18:25.000000000 -0500
 @@ -0,0 +1,223 @@
 +/* 
 + * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -33102,8 +33023,8 @@ diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/tuntap_user.c um/ar
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/os-Linux/file.c um/arch/um/os-Linux/file.c
---- orig/arch/um/os-Linux/file.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/os-Linux/file.c	Tue Feb  4 19:32:10 2003
+--- orig/arch/um/os-Linux/file.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/os-Linux/file.c	2003-02-04 19:32:10.000000000 -0500
 @@ -0,0 +1,384 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -33490,8 +33411,8 @@ diff -Naur -X ../exclude-files orig/arch/um/os-Linux/file.c um/arch/um/os-Linux/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/os-Linux/include/file.h um/arch/um/os-Linux/include/file.h
---- orig/arch/um/os-Linux/include/file.h	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/os-Linux/include/file.h	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/os-Linux/include/file.h	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/os-Linux/include/file.h	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,22 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -33515,9 +33436,30 @@ diff -Naur -X ../exclude-files orig/arch/um/os-Linux/include/file.h um/arch/um/o
 + * c-file-style: "linux"
 + * End:
 + */
+diff -Naur -X ../exclude-files orig/arch/um/os-Linux/Makefile um/arch/um/os-Linux/Makefile
+--- orig/arch/um/os-Linux/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/os-Linux/Makefile	2002-10-23 21:08:04.000000000 -0400
+@@ -0,0 +1,17 @@
++# 
++# Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
++# Licensed under the GPL
++#
++
++O_TARGET = built-in.o
++
++obj-y = file.o process.o tty.o
++
++include $(TOPDIR)/Rules.make
++
++$(obj-y) : %.o: %.c
++	$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $<
++
++clean :
++
++archmrproper:
 diff -Naur -X ../exclude-files orig/arch/um/os-Linux/process.c um/arch/um/os-Linux/process.c
---- orig/arch/um/os-Linux/process.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/os-Linux/process.c	Wed Jan  8 14:19:00 2003
+--- orig/arch/um/os-Linux/process.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/os-Linux/process.c	2003-01-08 14:19:00.000000000 -0500
 @@ -0,0 +1,142 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -33662,8 +33604,8 @@ diff -Naur -X ../exclude-files orig/arch/um/os-Linux/process.c um/arch/um/os-Lin
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/os-Linux/tty.c um/arch/um/os-Linux/tty.c
---- orig/arch/um/os-Linux/tty.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/os-Linux/tty.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/os-Linux/tty.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/os-Linux/tty.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,61 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -33726,60 +33668,10 @@ diff -Naur -X ../exclude-files orig/arch/um/os-Linux/tty.c um/arch/um/os-Linux/t
 + * c-file-style: "linux"
 + * End:
 + */
-diff -Naur -X ../exclude-files orig/arch/um/sys-i386/Makefile um/arch/um/sys-i386/Makefile
---- orig/arch/um/sys-i386/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-i386/Makefile	Sat Nov 23 23:34:24 2002
-@@ -0,0 +1,46 @@
-+# 
-+# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+# Licensed under the GPL
-+#
-+
-+O_TARGET = built-in.o
-+
-+obj-y = bugs.o checksum.o extable.o fault.o ksyms.o ldt.o ptrace.o \
-+	ptrace_user.o semaphore.o sigcontext.o syscalls.o sysrq.o
-+export-objs = ksyms.o
-+
-+USER_OBJS = bugs.o ptrace_user.o sigcontext.o fault.o
-+
-+SYMLINKS = semaphore.c extable.c
-+
-+semaphore.c-dir = kernel
-+extable.c-dir = mm
-+
-+include $(TOPDIR)/Rules.make
-+
-+$(USER_OBJS) : %.o: %.c
-+	$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $<
-+
-+define make_link
-+	-rm -f $1
-+	ln -sf $(TOPDIR)/arch/i386/$($1-dir)/$1 $1
-+endef
-+
-+$(SYMLINKS): 
-+	$(call make_link,$@)
-+
-+clean:
-+	$(MAKE) -C util clean
-+	rm -f $(SYMLINKS)
-+
-+fastdep:
-+
-+dep:
-+
-+archmrproper:
-+
-+archclean:
-+
-+archdep:
-+
-+modules:
 diff -Naur -X ../exclude-files orig/arch/um/sys-i386/bugs.c um/arch/um/sys-i386/bugs.c
---- orig/arch/um/sys-i386/bugs.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-i386/bugs.c	Sun Dec  8 20:38:45 2002
-@@ -0,0 +1,157 @@
+--- orig/arch/um/sys-i386/bugs.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-i386/bugs.c	2003-05-29 13:46:50.000000000 -0400
+@@ -0,0 +1,177 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
 + * Licensed under the GPL
@@ -33790,6 +33682,7 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-i386/bugs.c um/arch/um/sys-i386/
 +#include <errno.h>
 +#include <string.h>
 +#include <sys/signal.h>
++#include <asm/ldt.h>
 +#include "kern_util.h"
 +#include "user.h"
 +#include "sysdep/ptrace.h"
@@ -33886,6 +33779,25 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-i386/bugs.c um/arch/um/sys-i386/
 +	return(1);
 +}
 +
++static void disable_lcall(void)
++{
++	struct modify_ldt_ldt_s ldt;
++	int err;
++
++	bzero(&ldt, sizeof(ldt));
++	ldt.entry_number = 7;
++	ldt.base_addr = 0;
++	ldt.limit = 0;
++	err = modify_ldt(1, &ldt, sizeof(ldt));
++	if(err)
++		printk("Failed to disable lcall7 - errno = %d\n", errno);
++}
++
++void arch_init_thread(void)
++{
++	disable_lcall();
++}
++
 +void arch_check_bugs(void)
 +{
 +	int have_it;
@@ -33938,8 +33850,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-i386/bugs.c um/arch/um/sys-i386/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/sys-i386/checksum.S um/arch/um/sys-i386/checksum.S
---- orig/arch/um/sys-i386/checksum.S	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-i386/checksum.S	Thu Oct 31 20:17:50 2002
+--- orig/arch/um/sys-i386/checksum.S	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-i386/checksum.S	2002-10-31 20:17:50.000000000 -0500
 @@ -0,0 +1,460 @@
 +/*
 + * INET		An implementation of the TCP/IP protocol suite for the LINUX
@@ -34402,8 +34314,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-i386/checksum.S um/arch/um/sys-i
 +		
 +#endif
 diff -Naur -X ../exclude-files orig/arch/um/sys-i386/fault.c um/arch/um/sys-i386/fault.c
---- orig/arch/um/sys-i386/fault.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-i386/fault.c	Sun Oct 27 16:49:35 2002
+--- orig/arch/um/sys-i386/fault.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-i386/fault.c	2002-10-27 16:49:35.000000000 -0500
 @@ -0,0 +1,34 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -34440,8 +34352,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-i386/fault.c um/arch/um/sys-i386
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/sys-i386/ksyms.c um/arch/um/sys-i386/ksyms.c
---- orig/arch/um/sys-i386/ksyms.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-i386/ksyms.c	Tue Oct 29 21:01:45 2002
+--- orig/arch/um/sys-i386/ksyms.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-i386/ksyms.c	2002-10-29 21:01:45.000000000 -0500
 @@ -0,0 +1,17 @@
 +#include "linux/module.h"
 +#include "linux/in6.h"
@@ -34461,8 +34373,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-i386/ksyms.c um/arch/um/sys-i386
 +EXPORT_SYMBOL(csum_partial_copy_from);
 +EXPORT_SYMBOL(csum_partial_copy_to);
 diff -Naur -X ../exclude-files orig/arch/um/sys-i386/ldt.c um/arch/um/sys-i386/ldt.c
---- orig/arch/um/sys-i386/ldt.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-i386/ldt.c	Wed Nov 13 12:43:04 2002
+--- orig/arch/um/sys-i386/ldt.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-i386/ldt.c	2002-11-13 12:43:04.000000000 -0500
 @@ -0,0 +1,92 @@
 +/*
 + * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -34556,9 +34468,59 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-i386/ldt.c um/arch/um/sys-i386/l
 + * c-file-style: "linux"
 + * End:
 + */
+diff -Naur -X ../exclude-files orig/arch/um/sys-i386/Makefile um/arch/um/sys-i386/Makefile
+--- orig/arch/um/sys-i386/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-i386/Makefile	2002-11-23 23:34:24.000000000 -0500
+@@ -0,0 +1,46 @@
++# 
++# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
++# Licensed under the GPL
++#
++
++O_TARGET = built-in.o
++
++obj-y = bugs.o checksum.o extable.o fault.o ksyms.o ldt.o ptrace.o \
++	ptrace_user.o semaphore.o sigcontext.o syscalls.o sysrq.o
++export-objs = ksyms.o
++
++USER_OBJS = bugs.o ptrace_user.o sigcontext.o fault.o
++
++SYMLINKS = semaphore.c extable.c
++
++semaphore.c-dir = kernel
++extable.c-dir = mm
++
++include $(TOPDIR)/Rules.make
++
++$(USER_OBJS) : %.o: %.c
++	$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $<
++
++define make_link
++	-rm -f $1
++	ln -sf $(TOPDIR)/arch/i386/$($1-dir)/$1 $1
++endef
++
++$(SYMLINKS): 
++	$(call make_link,$@)
++
++clean:
++	$(MAKE) -C util clean
++	rm -f $(SYMLINKS)
++
++fastdep:
++
++dep:
++
++archmrproper:
++
++archclean:
++
++archdep:
++
++modules:
 diff -Naur -X ../exclude-files orig/arch/um/sys-i386/ptrace.c um/arch/um/sys-i386/ptrace.c
---- orig/arch/um/sys-i386/ptrace.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-i386/ptrace.c	Sun Oct 27 16:49:35 2002
+--- orig/arch/um/sys-i386/ptrace.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-i386/ptrace.c	2002-10-27 16:49:35.000000000 -0500
 @@ -0,0 +1,365 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -34926,8 +34888,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-i386/ptrace.c um/arch/um/sys-i38
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/sys-i386/ptrace_user.c um/arch/um/sys-i386/ptrace_user.c
---- orig/arch/um/sys-i386/ptrace_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-i386/ptrace_user.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/sys-i386/ptrace_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-i386/ptrace_user.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,117 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -35047,8 +35009,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-i386/ptrace_user.c um/arch/um/sy
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/sys-i386/sigcontext.c um/arch/um/sys-i386/sigcontext.c
---- orig/arch/um/sys-i386/sigcontext.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-i386/sigcontext.c	Mon Dec  2 23:20:13 2002
+--- orig/arch/um/sys-i386/sigcontext.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-i386/sigcontext.c	2002-12-02 23:20:13.000000000 -0500
 @@ -0,0 +1,80 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -35131,8 +35093,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-i386/sigcontext.c um/arch/um/sys
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/sys-i386/syscalls.c um/arch/um/sys-i386/syscalls.c
---- orig/arch/um/sys-i386/syscalls.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-i386/syscalls.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/sys-i386/syscalls.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-i386/syscalls.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,68 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -35203,8 +35165,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-i386/syscalls.c um/arch/um/sys-i
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/sys-i386/sysrq.c um/arch/um/sys-i386/sysrq.c
---- orig/arch/um/sys-i386/sysrq.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-i386/sysrq.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/sys-i386/sysrq.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-i386/sysrq.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,30 @@
 +#include "linux/kernel.h"
 +#include "linux/smp.h"
@@ -35237,8 +35199,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-i386/sysrq.c um/arch/um/sys-i386
 +        show_trace((unsigned long *) &regs);
 +}
 diff -Naur -X ../exclude-files orig/arch/um/sys-i386/util/Makefile um/arch/um/sys-i386/util/Makefile
---- orig/arch/um/sys-i386/util/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-i386/util/Makefile	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/sys-i386/util/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-i386/util/Makefile	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,28 @@
 +EXE = mk_sc mk_thread
 +
@@ -35269,8 +35231,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-i386/util/Makefile um/arch/um/sy
 +fastdep :
 +
 diff -Naur -X ../exclude-files orig/arch/um/sys-i386/util/mk_sc.c um/arch/um/sys-i386/util/mk_sc.c
---- orig/arch/um/sys-i386/util/mk_sc.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-i386/util/mk_sc.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/sys-i386/util/mk_sc.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-i386/util/mk_sc.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,51 @@
 +#include <stdio.h>
 +#include <signal.h>
@@ -35324,8 +35286,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-i386/util/mk_sc.c um/arch/um/sys
 +  return(0);
 +}
 diff -Naur -X ../exclude-files orig/arch/um/sys-i386/util/mk_thread_kern.c um/arch/um/sys-i386/util/mk_thread_kern.c
---- orig/arch/um/sys-i386/util/mk_thread_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-i386/util/mk_thread_kern.c	Mon Dec  9 23:24:38 2002
+--- orig/arch/um/sys-i386/util/mk_thread_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-i386/util/mk_thread_kern.c	2002-12-09 23:24:38.000000000 -0500
 @@ -0,0 +1,22 @@
 +#include "linux/config.h"
 +#include "linux/stddef.h"
@@ -35350,8 +35312,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-i386/util/mk_thread_kern.c um/ar
 +}
 +
 diff -Naur -X ../exclude-files orig/arch/um/sys-i386/util/mk_thread_user.c um/arch/um/sys-i386/util/mk_thread_user.c
---- orig/arch/um/sys-i386/util/mk_thread_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-i386/util/mk_thread_user.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/sys-i386/util/mk_thread_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-i386/util/mk_thread_user.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,30 @@
 +#include <stdio.h>
 +
@@ -35384,8 +35346,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-i386/util/mk_thread_user.c um/ar
 +  printf("#endif\n");
 +}
 diff -Naur -X ../exclude-files orig/arch/um/sys-ia64/Makefile um/arch/um/sys-ia64/Makefile
---- orig/arch/um/sys-ia64/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-ia64/Makefile	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/sys-ia64/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-ia64/Makefile	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,26 @@
 +OBJ = sys.o
 +
@@ -35414,8 +35376,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-ia64/Makefile um/arch/um/sys-ia6
 +
 +include $(TOPDIR)/Rules.make
 diff -Naur -X ../exclude-files orig/arch/um/sys-ppc/Makefile um/arch/um/sys-ppc/Makefile
---- orig/arch/um/sys-ppc/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-ppc/Makefile	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/sys-ppc/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-ppc/Makefile	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,80 @@
 +OBJ = sys.o
 +
@@ -35498,8 +35460,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-ppc/Makefile um/arch/um/sys-ppc/
 +
 +include $(TOPDIR)/Rules.make
 diff -Naur -X ../exclude-files orig/arch/um/sys-ppc/misc.S um/arch/um/sys-ppc/misc.S
---- orig/arch/um/sys-ppc/misc.S	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-ppc/misc.S	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/sys-ppc/misc.S	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-ppc/misc.S	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,116 @@
 +/*
 + * This file contains miscellaneous low-level functions.
@@ -35618,8 +35580,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-ppc/misc.S um/arch/um/sys-ppc/mi
 +	bdnz	1b
 +	blr
 diff -Naur -X ../exclude-files orig/arch/um/sys-ppc/miscthings.c um/arch/um/sys-ppc/miscthings.c
---- orig/arch/um/sys-ppc/miscthings.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-ppc/miscthings.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/sys-ppc/miscthings.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-ppc/miscthings.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,53 @@
 +#include "linux/threads.h"
 +#include "linux/stddef.h"  // for NULL
@@ -35675,8 +35637,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-ppc/miscthings.c um/arch/um/sys-
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/sys-ppc/ptrace.c um/arch/um/sys-ppc/ptrace.c
---- orig/arch/um/sys-ppc/ptrace.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-ppc/ptrace.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/sys-ppc/ptrace.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-ppc/ptrace.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,28 @@
 +#include "linux/sched.h"
 +#include "asm/ptrace.h"
@@ -35707,8 +35669,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-ppc/ptrace.c um/arch/um/sys-ppc/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/sys-ppc/ptrace_user.c um/arch/um/sys-ppc/ptrace_user.c
---- orig/arch/um/sys-ppc/ptrace_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-ppc/ptrace_user.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/sys-ppc/ptrace_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-ppc/ptrace_user.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,40 @@
 +#include <sys/ptrace.h>
 +#include <errno.h>
@@ -35751,8 +35713,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-ppc/ptrace_user.c um/arch/um/sys
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/sys-ppc/sigcontext.c um/arch/um/sys-ppc/sigcontext.c
---- orig/arch/um/sys-ppc/sigcontext.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-ppc/sigcontext.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/sys-ppc/sigcontext.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-ppc/sigcontext.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,15 @@
 +#include "asm/ptrace.h"
 +#include "asm/sigcontext.h"
@@ -35770,8 +35732,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-ppc/sigcontext.c um/arch/um/sys-
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/sys-ppc/sysrq.c um/arch/um/sys-ppc/sysrq.c
---- orig/arch/um/sys-ppc/sysrq.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/sys-ppc/sysrq.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/sys-ppc/sysrq.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/sys-ppc/sysrq.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,43 @@
 +/* 
 + * Copyright (C) 2001 Chris Emerson (cemerson@chiark.greenend.org.uk)
@@ -35817,8 +35779,8 @@ diff -Naur -X ../exclude-files orig/arch/um/sys-ppc/sysrq.c um/arch/um/sys-ppc/s
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/arch/um/util/Makefile um/arch/um/util/Makefile
---- orig/arch/um/util/Makefile	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/util/Makefile	Wed Oct 23 21:09:14 2002
+--- orig/arch/um/util/Makefile	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/util/Makefile	2002-10-23 21:09:14.000000000 -0400
 @@ -0,0 +1,26 @@
 +ALL = mk_task mk_constants
 +
@@ -35847,8 +35809,8 @@ diff -Naur -X ../exclude-files orig/arch/um/util/Makefile um/arch/um/util/Makefi
 +
 +archmrproper : clean
 diff -Naur -X ../exclude-files orig/arch/um/util/mk_constants_kern.c um/arch/um/util/mk_constants_kern.c
---- orig/arch/um/util/mk_constants_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/util/mk_constants_kern.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/util/mk_constants_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/util/mk_constants_kern.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,24 @@
 +#include "linux/kernel.h"
 +#include "linux/stringify.h"
@@ -35875,8 +35837,8 @@ diff -Naur -X ../exclude-files orig/arch/um/util/mk_constants_kern.c um/arch/um/
 +  return(0);
 +}
 diff -Naur -X ../exclude-files orig/arch/um/util/mk_constants_user.c um/arch/um/util/mk_constants_user.c
---- orig/arch/um/util/mk_constants_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/util/mk_constants_user.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/util/mk_constants_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/util/mk_constants_user.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,28 @@
 +#include <stdio.h>
 +
@@ -35907,8 +35869,8 @@ diff -Naur -X ../exclude-files orig/arch/um/util/mk_constants_user.c um/arch/um/
 +  printf("#endif\n");
 +}
 diff -Naur -X ../exclude-files orig/arch/um/util/mk_task_kern.c um/arch/um/util/mk_task_kern.c
---- orig/arch/um/util/mk_task_kern.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/util/mk_task_kern.c	Sun Dec  8 21:03:34 2002
+--- orig/arch/um/util/mk_task_kern.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/util/mk_task_kern.c	2002-12-08 21:03:34.000000000 -0500
 @@ -0,0 +1,17 @@
 +#include "linux/sched.h"
 +#include "linux/stddef.h"
@@ -35928,8 +35890,8 @@ diff -Naur -X ../exclude-files orig/arch/um/util/mk_task_kern.c um/arch/um/util/
 +  return(0);
 +}
 diff -Naur -X ../exclude-files orig/arch/um/util/mk_task_user.c um/arch/um/util/mk_task_user.c
---- orig/arch/um/util/mk_task_user.c	Wed Dec 31 19:00:00 1969
-+++ um/arch/um/util/mk_task_user.c	Wed Oct 23 21:08:04 2002
+--- orig/arch/um/util/mk_task_user.c	1969-12-31 19:00:00.000000000 -0500
++++ um/arch/um/util/mk_task_user.c	2002-10-23 21:08:04.000000000 -0400
 @@ -0,0 +1,30 @@
 +#include <stdio.h>
 +
@@ -35961,9 +35923,252 @@ diff -Naur -X ../exclude-files orig/arch/um/util/mk_task_user.c um/arch/um/util/
 +  printf("\n");
 +  printf("#endif\n");
 +}
+diff -Naur -X ../exclude-files orig/CREDITS um/CREDITS
+--- orig/CREDITS	2003-02-27 13:04:11.000000000 -0500
++++ um/CREDITS	2003-02-27 13:05:17.000000000 -0500
+@@ -432,6 +432,7 @@
+ E: lars@nocrew.org
+ W: http://lars.nocrew.org/
+ D: dsp56k device driver
++D: ptrace proxy in user mode kernel port
+ S: Kopmansg 2
+ S: 411 13  Goteborg
+ S: Sweden
+@@ -721,7 +722,7 @@
+ E: jdike@karaya.com
+ W: http://user-mode-linux.sourceforge.net
+ D: User mode kernel port
+-S: RR1 Box 67C
++S: 375 Tubbs Hill Rd
+ S: Deering NH 03244
+ S: USA
+ 
+diff -Naur -X ../exclude-files orig/Documentation/Configure.help um/Documentation/Configure.help
+--- orig/Documentation/Configure.help	2003-02-27 13:04:11.000000000 -0500
++++ um/Documentation/Configure.help	2003-02-27 13:05:17.000000000 -0500
+@@ -14690,19 +14690,23 @@
+   The module will be called dsbr100.o. If you want to compile it as a
+   module, say M here and read <file:Documentation/modules.txt>.
+ 
+-Always do synchronous disk IO for UBD
+-CONFIG_BLK_DEV_UBD_SYNC
++CONFIG_BLK_DEV_UBD
+   The User-Mode Linux port includes a driver called UBD which will let
+   you access arbitrary files on the host computer as block devices.
+-  Writes to such a block device are not immediately written to the
+-  host's disk; this may cause problems if, for example, the User-Mode
+-  Linux 'Virtual Machine' uses a journalling file system and the host
+-  computer crashes.
++  Unless you know that you do not need such virtual block devices say
++  Y here.
++
++Always do synchronous disk IO for UBD
++CONFIG_BLK_DEV_UBD_SYNC
++  Writes to the virtual block device are not immediately written to the host's
++  disk; this may cause problems if, for example, the User-Mode Linux
++  'Virtual Machine' uses a journalling filesystem and the host computer
++  crashes.
+ 
+   Synchronous operation (i.e. always writing data to the host's disk
+   immediately) is configurable on a per-UBD basis by using a special
+   kernel command line option.  Alternatively, you can say Y here to
+-  turn on synchronous operation by default for all block.
++  turn on synchronous operation by default for all block devices.
+ 
+   If you're running a journalling file system (like reiserfs, for
+   example) in your virtual machine, you will want to say Y here.  If
+@@ -14714,6 +14718,7 @@
+ CONFIG_PT_PROXY
+   This option enables a debugging interface which allows gdb to debug
+   the kernel without needing to actually attach to kernel threads.
++  CONFIG_XTERM_CHAN must be enabled in order to enable CONFIG_PT_PROXY.
+   If you want to do kernel debugging, say Y here; otherwise say N.
+ 
+ Management console
+@@ -14908,26 +14913,174 @@
+ 
+ SLIP transport
+ CONFIG_UML_NET_SLIP
+-  The Slip User-Mode Linux network transport allows a running UML to
++  The slip User-Mode Linux network transport allows a running UML to
+   network with its host over a point-to-point link.  Unlike Ethertap,
+   which can carry any Ethernet frame (and hence even non-IP packets),
+-  the Slip transport can only carry IP packets.
++  the slip transport can only carry IP packets.
+ 
+-  To use this, your host must support Slip devices.
++  To use this, your host must support slip devices.
+ 
+   For more information, see
+   <http://user-mode-linux.sourceforge.net/networking.html>.  That site
+-  has examples of the UML command line to use to enable Slip
++  has examples of the UML command line to use to enable slip
+   networking, and details of a few quirks with it.
+ 
+-  The Ethertap Transport is preferred over Slip because of its
+-  limitation.  If you prefer Slip, however, say Y here.  Otherwise
++  The Ethertap Transport is preferred over slip because of its
++  limitations.  If you prefer slip, however, say Y here.  Otherwise
+   choose the Multicast transport (to network multiple UMLs on 
+   multiple hosts), Ethertap (to network with the host and the
+   outside world), and/or the Daemon transport (to network multiple
+   UMLs on a single host).  You may choose more than one without
+   conflict.  If you don't need UML networking, say N.
+ 
++SLiRP transport
++CONFIG_UML_NET_SLIRP
++  The SLiRP User-Mode Linux network transport allows a running UML
++  to network by invoking a program that can handle SLIP encapsulated
++  packets.  This is commonly (but not limited to) the application
++  known as SLiRP, a program that can re-socket IP packets back onto
++  the host on which it is run.  Only IP packets are supported,
++  unlike other network transports that can handle all Ethernet
++  frames.  In general, slirp allows the UML the same IP connectivity
++  to the outside world that the host user is permitted, and unlike
++  other transports, SLiRP works without the need of root level
++  privleges, setuid binaries, or SLIP devices on the host.  This
++  also means not every type of connection is possible, but most
++  situations can be accomodated with carefully crafted slirp
++  commands that can be passed along as part of the network device's
++  setup string.  The effect of this transport on the UML is similar
++  that of a host behind a firewall that masquerades all network
++  connections passing through it (but is less secure).
++
++  To use this you should first have slirp compiled somewhere
++  accessible on the host, and have read its documentation.  If you
++  don't need UML networking, say N.
++
++  Startup example: "eth0=slirp,FE:FD:01:02:03:04,/usr/local/bin/slirp"
++
++Default main console channel initialization
++CONFIG_CON_ZERO_CHAN
++  This is the string describing the channel to which the main console
++  will be attached by default.  This value can be overridden from the
++  command line.  The default value is "fd:0,fd:1", which attaches the
++  main console to stdin and stdout.
++  It is safe to leave this unchanged.
++
++Default console channel initialization
++CONFIG_CON_CHAN
++  This is the string describing the channel to which all consoles
++  except the main console will be attached by default.  This value can
++  be overridden from the command line.  The default value is "xterm",
++  which brings them up in xterms.
++  It is safe to leave this unchanged, although you may wish to change
++  this if you expect the UML that you build to be run in environments
++  which don't have X or xterm available.
++
++Default serial line channel initialization
++CONFIG_SSL_CHAN
++  This is the string describing the channel to which the serial lines
++  will be attached by default.  This value can be overridden from the
++  command line.  The default value is "pty", which attaches them to
++  traditional pseudo-terminals.
++  It is safe to leave this unchanged, although you may wish to change
++  this if you expect the UML that you build to be run in environments
++  which don't have a set of /dev/pty* devices.
++
++Nesting level
++CONFIG_NEST_LEVEL
++  This is set to the number of layers of UMLs that this UML will be run
++  in.  Normally, this is zero, meaning that it will run directly on the
++  host.  Setting it to one will build a UML that can run inside a UML
++  that is running on the host.  Generally, if you intend this UML to run
++  inside another UML, set CONFIG_NEST_LEVEL to one more than the host UML.
++  Note that if the hosting UML has its CONFIG_KERNEL_HALF_GIGS set to 
++  greater than one, then the guest UML should have its CONFIG_NEST_LEVEL 
++  set to the host's CONFIG_NEST_LEVEL + CONFIG_KERNEL_HALF_GIGS.
++  Only change this if you are running nested UMLs.
++
++Kernel address space size (in .5G units)
++CONFIG_KERNEL_HALF_GIGS
++  This determines the amount of address space that UML will allocate for
++  its own, measured in half Gigabyte units.  The default is 1.
++  Change this only if you need to boot UML with an unusually large amount
++  of physical memory.
++
++UML sound support
++CONFIG_UML_SOUND
++  This option enables UML sound support.  If enabled, it will pull in
++  soundcore and the UML hostaudio relay, which acts as a intermediary
++  between the host's dsp and mixer devices and the UML sound system.
++  It is safe to say 'Y' here.
++
++UML SMP support
++CONFIG_UML_SMP
++  This option enables UML SMP support.  UML implements virtual SMP by
++  allowing as many processes to run simultaneously on the host as
++  there are virtual processors configured.  Obviously, if the host is
++  a uniprocessor, those processes will timeshare, but, inside UML,
++  will appear to be running simultaneously.  If the host is a
++  multiprocessor, then UML processes may run simultaneously, depending
++  on the host scheduler.
++  CONFIG_SMP will be set to whatever this option is set to.
++  It is safe to leave this unchanged.
++
++file descriptor channel support
++CONFIG_FD_CHAN
++  This option enables support for attaching UML consoles and serial
++  lines to already set up file descriptors.  Generally, the main
++  console is attached to file descriptors 0 and 1 (stdin and stdout),
++  so it would be wise to leave this enabled unless you intend to
++  attach it to some other host device.
++
++null device channel support
++CONFIG_NULL_CHAN
++  This option enables support for attaching UML consoles and serial
++  lines to a device similar to /dev/null.  Data written to it disappears
++  and there is never any data to be read.
++
++port channel support
++CONFIG_PORT_CHAN
++  This option enables support for attaching UML consoles and serial
++  lines to host portals.  They may be accessed with 'telnet <host>
++  <port number>'.  Any number of consoles and serial lines may be
++  attached to a single portal, although what UML device you get when
++  you telnet to that portal will be unpredictable.
++  It is safe to say 'Y' here.
++
++pty channel support
++CONFIG_PTY_CHAN
++  This option enables support for attaching UML consoles and serial
++  lines to host pseudo-terminals.  Access to both traditional
++  pseudo-terminals (/dev/pty*) and pts pseudo-terminals are controlled
++  with this option.  The assignment of UML devices to host devices
++  will be announced in the kernel message log.
++  It is safe to say 'Y' here.
++
++tty channel support
++CONFIG_TTY_CHAN
++  This option enables support for attaching UML consoles and serial
++  lines to host terminals.  Access to both virtual consoles
++  (/dev/tty*) and the slave side of pseudo-terminals (/dev/ttyp* and
++  /dev/pts/*) are controlled by this option.
++  It is safe to say 'Y' here.
++
++xterm channel support
++CONFIG_XTERM_CHAN
++  This option enables support for attaching UML consoles and serial
++  lines to xterms.  Each UML device so assigned will be brought up in
++  its own xterm.
++  If you disable this option, then CONFIG_PT_PROXY will be disabled as
++  well, since UML's gdb currently requires an xterm.
++  It is safe to say 'Y' here.
++
++tty logging
++CONFIG_TTY_LOG
++  This option enables logging of all data going through pseudo-terminals
++  to the host.  This is primarily useful for honeypots, where you want
++  secure keystroke logging that can't be detected or disabled by root.
++  Say 'N' unless you are setting up a UML honeypot or otherwise know that
++  you want this option.
++
+ Microtek USB scanner support
+ CONFIG_USB_MICROTEK
+   Say Y here if you want support for the Microtek X6USB and
 diff -Naur -X ../exclude-files orig/drivers/char/Makefile um/drivers/char/Makefile
---- orig/drivers/char/Makefile	Thu Feb 27 13:04:15 2003
-+++ um/drivers/char/Makefile	Thu Feb 27 13:05:21 2003
+--- orig/drivers/char/Makefile	2003-02-27 13:04:15.000000000 -0500
++++ um/drivers/char/Makefile	2003-02-27 13:05:21.000000000 -0500
 @@ -95,6 +95,12 @@
    endif
  endif
@@ -35978,8 +36183,8 @@ diff -Naur -X ../exclude-files orig/drivers/char/Makefile um/drivers/char/Makefi
    KEYMAP   =
    KEYBD    =
 diff -Naur -X ../exclude-files orig/drivers/char/tty_io.c um/drivers/char/tty_io.c
---- orig/drivers/char/tty_io.c	Thu Feb 27 13:04:15 2003
-+++ um/drivers/char/tty_io.c	Thu Feb 27 13:05:21 2003
+--- orig/drivers/char/tty_io.c	2003-02-27 13:04:15.000000000 -0500
++++ um/drivers/char/tty_io.c	2003-02-27 13:05:21.000000000 -0500
 @@ -637,6 +637,9 @@
  	wake_up_interruptible(&tty->write_wait);
  }
@@ -36068,8 +36273,8 @@ diff -Naur -X ../exclude-files orig/drivers/char/tty_io.c um/drivers/char/tty_io
  }
  
 diff -Naur -X ../exclude-files orig/drivers/net/setup.c um/drivers/net/setup.c
---- orig/drivers/net/setup.c	Sun Sep 15 12:13:19 2002
-+++ um/drivers/net/setup.c	Wed Oct 23 21:08:05 2002
+--- orig/drivers/net/setup.c	2002-09-15 12:13:19.000000000 -0400
++++ um/drivers/net/setup.c	2002-10-23 21:08:05.000000000 -0400
 @@ -28,7 +28,6 @@
  extern int lmc_setup(void);
  
@@ -36078,19 +36283,19 @@ diff -Naur -X ../exclude-files orig/drivers/net/setup.c um/drivers/net/setup.c
  
  /* Pad device name to IFNAMSIZ=16. F.e. __PAD6 is string of 9 zeros. */
  #define __PAD6 "\0\0\0\0\0\0\0\0\0"
-@@ -102,9 +101,6 @@
-  */  
+@@ -103,9 +102,6 @@
  #ifdef CONFIG_MADGEMC
  	{madgemc_probe, 0},
--#endif
+ #endif
 -#ifdef CONFIG_UML_NET
 -	{uml_net_probe, 0},
- #endif
+-#endif
   
  	{NULL, 0},
+ };
 diff -Naur -X ../exclude-files orig/include/asm-i386/hardirq.h um/include/asm-i386/hardirq.h
---- orig/include/asm-i386/hardirq.h	Sun Sep 15 12:13:19 2002
-+++ um/include/asm-i386/hardirq.h	Wed Apr 16 13:59:04 2003
+--- orig/include/asm-i386/hardirq.h	2002-09-15 12:13:19.000000000 -0400
++++ um/include/asm-i386/hardirq.h	2003-05-28 11:02:07.000000000 -0400
 @@ -4,6 +4,7 @@
  #include <linux/config.h>
  #include <linux/threads.h>
@@ -36100,8 +36305,8 @@ diff -Naur -X ../exclude-files orig/include/asm-i386/hardirq.h um/include/asm-i3
  /* assembly code in softirq.h is sensitive to the offsets of these fields */
  typedef struct {
 diff -Naur -X ../exclude-files orig/include/asm-um/a.out.h um/include/asm-um/a.out.h
---- orig/include/asm-um/a.out.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/a.out.h	Sun Oct 27 11:54:50 2002
+--- orig/include/asm-um/a.out.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/a.out.h	2002-10-27 11:54:50.000000000 -0500
 @@ -0,0 +1,20 @@
 +#ifndef __UM_A_OUT_H
 +#define __UM_A_OUT_H
@@ -36123,37 +36328,9 @@ diff -Naur -X ../exclude-files orig/include/asm-um/a.out.h um/include/asm-um/a.o
 +	CHOOSE_MODE((honeypot ? host_task_size : task_size), task_size)
 +
 +#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/arch-signal-i386.h um/include/asm-um/arch-signal-i386.h
---- orig/include/asm-um/arch-signal-i386.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/arch-signal-i386.h	Wed Oct 23 21:08:05 2002
-@@ -0,0 +1,24 @@
-+/* 
-+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef __UM_ARCH_SIGNAL_I386_H
-+#define __UM_ARCH_SIGNAL_I386_H
-+
-+struct arch_signal_context {
-+	unsigned long extrasigs[_NSIG_WORDS];
-+};
-+
-+#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-file-style: "linux"
-+ * End:
-+ */
 diff -Naur -X ../exclude-files orig/include/asm-um/archparam-i386.h um/include/asm-um/archparam-i386.h
---- orig/include/asm-um/archparam-i386.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/archparam-i386.h	Sun Dec  8 20:09:11 2002
+--- orig/include/asm-um/archparam-i386.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/archparam-i386.h	2002-12-08 20:09:11.000000000 -0500
 @@ -0,0 +1,80 @@
 +/* 
 + * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com)
@@ -36236,8 +36413,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/archparam-i386.h um/include/a
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/include/asm-um/archparam-ppc.h um/include/asm-um/archparam-ppc.h
---- orig/include/asm-um/archparam-ppc.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/archparam-ppc.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/archparam-ppc.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/archparam-ppc.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,41 @@
 +#ifndef __UM_ARCHPARAM_PPC_H
 +#define __UM_ARCHPARAM_PPC_H
@@ -36280,9 +36457,37 @@ diff -Naur -X ../exclude-files orig/include/asm-um/archparam-ppc.h um/include/as
 +#define __HAVE_ARCH_STRRCHR
 +
 +#endif
+diff -Naur -X ../exclude-files orig/include/asm-um/arch-signal-i386.h um/include/asm-um/arch-signal-i386.h
+--- orig/include/asm-um/arch-signal-i386.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/arch-signal-i386.h	2002-10-23 21:08:05.000000000 -0400
+@@ -0,0 +1,24 @@
++/* 
++ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
++ * Licensed under the GPL
++ */
++
++#ifndef __UM_ARCH_SIGNAL_I386_H
++#define __UM_ARCH_SIGNAL_I386_H
++
++struct arch_signal_context {
++	unsigned long extrasigs[_NSIG_WORDS];
++};
++
++#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-file-style: "linux"
++ * End:
++ */
 diff -Naur -X ../exclude-files orig/include/asm-um/atomic.h um/include/asm-um/atomic.h
---- orig/include/asm-um/atomic.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/atomic.h	Wed Mar 26 22:01:25 2003
+--- orig/include/asm-um/atomic.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/atomic.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_ATOMIC_H
 +#define __UM_ATOMIC_H
@@ -36291,8 +36496,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/atomic.h um/include/asm-um/at
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/bitops.h um/include/asm-um/bitops.h
---- orig/include/asm-um/bitops.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/bitops.h	Wed Mar 26 22:01:25 2003
+--- orig/include/asm-um/bitops.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/bitops.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_BITOPS_H
 +#define __UM_BITOPS_H
@@ -36301,8 +36506,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/bitops.h um/include/asm-um/bi
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/boot.h um/include/asm-um/boot.h
---- orig/include/asm-um/boot.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/boot.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/boot.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/boot.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_BOOT_H
 +#define __UM_BOOT_H
@@ -36311,8 +36516,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/boot.h um/include/asm-um/boot
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/bugs.h um/include/asm-um/bugs.h
---- orig/include/asm-um/bugs.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/bugs.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/bugs.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/bugs.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_BUGS_H
 +#define __UM_BUGS_H
@@ -36321,8 +36526,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/bugs.h um/include/asm-um/bugs
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/byteorder.h um/include/asm-um/byteorder.h
---- orig/include/asm-um/byteorder.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/byteorder.h	Thu Feb 27 13:20:12 2003
+--- orig/include/asm-um/byteorder.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/byteorder.h	2003-02-27 13:20:12.000000000 -0500
 @@ -0,0 +1,6 @@
 +#ifndef __UM_BYTEORDER_H
 +#define __UM_BYTEORDER_H
@@ -36331,8 +36536,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/byteorder.h um/include/asm-um
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/cache.h um/include/asm-um/cache.h
---- orig/include/asm-um/cache.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/cache.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/cache.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/cache.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_CACHE_H
 +#define __UM_CACHE_H
@@ -36341,8 +36546,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/cache.h um/include/asm-um/cac
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/checksum.h um/include/asm-um/checksum.h
---- orig/include/asm-um/checksum.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/checksum.h	Tue Oct 29 17:25:12 2002
+--- orig/include/asm-um/checksum.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/checksum.h	2002-10-29 17:25:12.000000000 -0500
 @@ -0,0 +1,6 @@
 +#ifndef __UM_CHECKSUM_H
 +#define __UM_CHECKSUM_H
@@ -36351,8 +36556,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/checksum.h um/include/asm-um/
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/cobalt.h um/include/asm-um/cobalt.h
---- orig/include/asm-um/cobalt.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/cobalt.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/cobalt.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/cobalt.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_COBALT_H
 +#define __UM_COBALT_H
@@ -36361,8 +36566,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/cobalt.h um/include/asm-um/co
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/current.h um/include/asm-um/current.h
---- orig/include/asm-um/current.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/current.h	Wed Mar 26 22:01:25 2003
+--- orig/include/asm-um/current.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/current.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,34 @@
 +/* 
 + * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
@@ -36399,8 +36604,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/current.h um/include/asm-um/c
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/include/asm-um/delay.h um/include/asm-um/delay.h
---- orig/include/asm-um/delay.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/delay.h	Sun Dec  8 20:09:15 2002
+--- orig/include/asm-um/delay.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/delay.h	2002-12-08 20:09:15.000000000 -0500
 @@ -0,0 +1,7 @@
 +#ifndef __UM_DELAY_H
 +#define __UM_DELAY_H
@@ -36410,8 +36615,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/delay.h um/include/asm-um/del
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/desc.h um/include/asm-um/desc.h
---- orig/include/asm-um/desc.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/desc.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/desc.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/desc.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_DESC_H
 +#define __UM_DESC_H
@@ -36420,8 +36625,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/desc.h um/include/asm-um/desc
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/div64.h um/include/asm-um/div64.h
---- orig/include/asm-um/div64.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/div64.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/div64.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/div64.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef _UM_DIV64_H
 +#define _UM_DIV64_H
@@ -36430,8 +36635,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/div64.h um/include/asm-um/div
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/dma.h um/include/asm-um/dma.h
---- orig/include/asm-um/dma.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/dma.h	Sun Oct 27 16:53:42 2002
+--- orig/include/asm-um/dma.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/dma.h	2002-10-27 16:53:42.000000000 -0500
 @@ -0,0 +1,10 @@
 +#ifndef __UM_DMA_H
 +#define __UM_DMA_H
@@ -36444,8 +36649,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/dma.h um/include/asm-um/dma.h
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/elf.h um/include/asm-um/elf.h
---- orig/include/asm-um/elf.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/elf.h	Sun Dec  8 20:13:07 2002
+--- orig/include/asm-um/elf.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/elf.h	2002-12-08 20:13:07.000000000 -0500
 @@ -0,0 +1,18 @@
 +#ifndef __UM_ELF_H
 +#define __UM_ELF_H
@@ -36466,8 +36671,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/elf.h um/include/asm-um/elf.h
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/errno.h um/include/asm-um/errno.h
---- orig/include/asm-um/errno.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/errno.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/errno.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/errno.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_ERRNO_H
 +#define __UM_ERRNO_H
@@ -36476,8 +36681,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/errno.h um/include/asm-um/err
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/fcntl.h um/include/asm-um/fcntl.h
---- orig/include/asm-um/fcntl.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/fcntl.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/fcntl.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/fcntl.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_FCNTL_H
 +#define __UM_FCNTL_H
@@ -36486,8 +36691,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/fcntl.h um/include/asm-um/fcn
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/fixmap.h um/include/asm-um/fixmap.h
---- orig/include/asm-um/fixmap.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/fixmap.h	Wed Mar 26 22:01:27 2003
+--- orig/include/asm-um/fixmap.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/fixmap.h	2003-05-28 11:02:08.000000000 -0400
 @@ -0,0 +1,89 @@
 +#ifndef __UM_FIXMAP_H
 +#define __UM_FIXMAP_H
@@ -36579,8 +36784,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/fixmap.h um/include/asm-um/fi
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/floppy.h um/include/asm-um/floppy.h
---- orig/include/asm-um/floppy.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/floppy.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/floppy.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/floppy.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_FLOPPY_H
 +#define __UM_FLOPPY_H
@@ -36589,8 +36794,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/floppy.h um/include/asm-um/fl
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/hardirq.h um/include/asm-um/hardirq.h
---- orig/include/asm-um/hardirq.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/hardirq.h	Wed Apr 16 13:59:04 2003
+--- orig/include/asm-um/hardirq.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/hardirq.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_HARDIRQ_H
 +#define __UM_HARDIRQ_H
@@ -36599,8 +36804,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/hardirq.h um/include/asm-um/h
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/hdreg.h um/include/asm-um/hdreg.h
---- orig/include/asm-um/hdreg.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/hdreg.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/hdreg.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/hdreg.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_HDREG_H
 +#define __UM_HDREG_H
@@ -36609,8 +36814,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/hdreg.h um/include/asm-um/hdr
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/highmem.h um/include/asm-um/highmem.h
---- orig/include/asm-um/highmem.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/highmem.h	Wed Apr 16 13:59:04 2003
+--- orig/include/asm-um/highmem.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/highmem.h	2003-05-28 11:02:08.000000000 -0400
 @@ -0,0 +1,12 @@
 +#ifndef __UM_HIGHMEM_H
 +#define __UM_HIGHMEM_H
@@ -36625,8 +36830,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/highmem.h um/include/asm-um/h
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/hw_irq.h um/include/asm-um/hw_irq.h
---- orig/include/asm-um/hw_irq.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/hw_irq.h	Wed Mar 26 22:01:25 2003
+--- orig/include/asm-um/hw_irq.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/hw_irq.h	2003-05-11 18:31:58.000000000 -0400
 @@ -0,0 +1,10 @@
 +#ifndef _ASM_UM_HW_IRQ_H
 +#define _ASM_UM_HW_IRQ_H
@@ -36639,8 +36844,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/hw_irq.h um/include/asm-um/hw
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/ide.h um/include/asm-um/ide.h
---- orig/include/asm-um/ide.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/ide.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/ide.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/ide.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_IDE_H
 +#define __UM_IDE_H
@@ -36649,8 +36854,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/ide.h um/include/asm-um/ide.h
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/init.h um/include/asm-um/init.h
---- orig/include/asm-um/init.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/init.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/init.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/init.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,11 @@
 +#ifndef _UM_INIT_H
 +#define _UM_INIT_H
@@ -36663,9 +36868,29 @@ diff -Naur -X ../exclude-files orig/include/asm-um/init.h um/include/asm-um/init
 +#endif
 +
 +#endif
+diff -Naur -X ../exclude-files orig/include/asm-um/ioctl.h um/include/asm-um/ioctl.h
+--- orig/include/asm-um/ioctl.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/ioctl.h	2002-10-23 21:08:05.000000000 -0400
+@@ -0,0 +1,6 @@
++#ifndef __UM_IOCTL_H
++#define __UM_IOCTL_H
++
++#include "asm/arch/ioctl.h"
++
++#endif
+diff -Naur -X ../exclude-files orig/include/asm-um/ioctls.h um/include/asm-um/ioctls.h
+--- orig/include/asm-um/ioctls.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/ioctls.h	2002-10-23 21:11:14.000000000 -0400
+@@ -0,0 +1,6 @@
++#ifndef __UM_IOCTLS_H
++#define __UM_IOCTLS_H
++
++#include "asm/arch/ioctls.h"
++
++#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/io.h um/include/asm-um/io.h
---- orig/include/asm-um/io.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/io.h	Sun Oct 27 16:53:42 2002
+--- orig/include/asm-um/io.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/io.h	2002-10-27 16:53:42.000000000 -0500
 @@ -0,0 +1,25 @@
 +#ifndef __UM_IO_H
 +#define __UM_IO_H
@@ -36692,29 +36917,19 @@ diff -Naur -X ../exclude-files orig/include/asm-um/io.h um/include/asm-um/io.h
 +}
 +
 +#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/ioctl.h um/include/asm-um/ioctl.h
---- orig/include/asm-um/ioctl.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/ioctl.h	Wed Oct 23 21:08:05 2002
-@@ -0,0 +1,6 @@
-+#ifndef __UM_IOCTL_H
-+#define __UM_IOCTL_H
-+
-+#include "asm/arch/ioctl.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/ioctls.h um/include/asm-um/ioctls.h
---- orig/include/asm-um/ioctls.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/ioctls.h	Wed Oct 23 21:11:14 2002
+diff -Naur -X ../exclude-files orig/include/asm-um/ipcbuf.h um/include/asm-um/ipcbuf.h
+--- orig/include/asm-um/ipcbuf.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/ipcbuf.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
-+#ifndef __UM_IOCTLS_H
-+#define __UM_IOCTLS_H
++#ifndef __UM_IPCBUF_H
++#define __UM_IPCBUF_H
 +
-+#include "asm/arch/ioctls.h"
++#include "asm/arch/ipcbuf.h"
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/ipc.h um/include/asm-um/ipc.h
---- orig/include/asm-um/ipc.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/ipc.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/ipc.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/ipc.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_IPC_H
 +#define __UM_IPC_H
@@ -36722,33 +36937,13 @@ diff -Naur -X ../exclude-files orig/include/asm-um/ipc.h um/include/asm-um/ipc.h
 +#include "asm/arch/ipc.h"
 +
 +#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/ipcbuf.h um/include/asm-um/ipcbuf.h
---- orig/include/asm-um/ipcbuf.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/ipcbuf.h	Wed Oct 23 21:08:05 2002
-@@ -0,0 +1,6 @@
-+#ifndef __UM_IPCBUF_H
-+#define __UM_IPCBUF_H
-+
-+#include "asm/arch/ipcbuf.h"
-+
-+#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/irq.h um/include/asm-um/irq.h
---- orig/include/asm-um/irq.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/irq.h	Wed Mar 26 22:01:25 2003
-@@ -0,0 +1,36 @@
+--- orig/include/asm-um/irq.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/irq.h	2003-05-03 11:03:52.000000000 -0400
+@@ -0,0 +1,22 @@
 +#ifndef __UM_IRQ_H
 +#define __UM_IRQ_H
 +
-+/* The i386 irq.h has a struct task_struct in a prototype without including
-+ * sched.h.  This forward declaration kills the resulting warning.
-+ */
-+struct task_struct;
-+
-+#include "asm/arch/irq.h"
-+#include "asm/ptrace.h"
-+
-+#undef NR_IRQS
-+
 +#define TIMER_IRQ		0
 +#define UMN_IRQ			1
 +#define CONSOLE_IRQ		2
@@ -36767,14 +36962,10 @@ diff -Naur -X ../exclude-files orig/include/asm-um/irq.h um/include/asm-um/irq.h
 +#define LAST_IRQ XTERM_IRQ
 +#define NR_IRQS (LAST_IRQ + 1)
 +
-+extern int um_request_irq(unsigned int irq, int fd, int type,
-+			  void (*handler)(int, void *, struct pt_regs *),
-+			  unsigned long irqflags,  const char * devname,
-+			  void *dev_id);
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/keyboard.h um/include/asm-um/keyboard.h
---- orig/include/asm-um/keyboard.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/keyboard.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/keyboard.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/keyboard.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_KEYBOARD_H
 +#define __UM_KEYBOARD_H
@@ -36783,8 +36974,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/keyboard.h um/include/asm-um/
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/kmap_types.h um/include/asm-um/kmap_types.h
---- orig/include/asm-um/kmap_types.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/kmap_types.h	Thu Feb 27 13:20:14 2003
+--- orig/include/asm-um/kmap_types.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/kmap_types.h	2003-02-27 13:20:14.000000000 -0500
 @@ -0,0 +1,11 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -36798,8 +36989,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/kmap_types.h um/include/asm-u
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/linux_logo.h um/include/asm-um/linux_logo.h
---- orig/include/asm-um/linux_logo.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/linux_logo.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/linux_logo.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/linux_logo.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_LINUX_LOGO_H
 +#define __UM_LINUX_LOGO_H
@@ -36808,8 +36999,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/linux_logo.h um/include/asm-u
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/locks.h um/include/asm-um/locks.h
---- orig/include/asm-um/locks.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/locks.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/locks.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/locks.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_LOCKS_H
 +#define __UM_LOCKS_H
@@ -36818,8 +37009,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/locks.h um/include/asm-um/loc
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/mca_dma.h um/include/asm-um/mca_dma.h
---- orig/include/asm-um/mca_dma.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/mca_dma.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/mca_dma.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/mca_dma.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef mca___UM_DMA_H
 +#define mca___UM_DMA_H
@@ -36828,8 +37019,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/mca_dma.h um/include/asm-um/m
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/mman.h um/include/asm-um/mman.h
---- orig/include/asm-um/mman.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/mman.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/mman.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/mman.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_MMAN_H
 +#define __UM_MMAN_H
@@ -36837,35 +37028,9 @@ diff -Naur -X ../exclude-files orig/include/asm-um/mman.h um/include/asm-um/mman
 +#include "asm/arch/mman.h"
 +
 +#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/mmu.h um/include/asm-um/mmu.h
---- orig/include/asm-um/mmu.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/mmu.h	Sat Nov  9 12:51:11 2002
-@@ -0,0 +1,22 @@
-+/* 
-+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef __MMU_H
-+#define __MMU_H
-+
-+#include "um_mmu.h"
-+
-+#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-file-style: "linux"
-+ * End:
-+ */
 diff -Naur -X ../exclude-files orig/include/asm-um/mmu_context.h um/include/asm-um/mmu_context.h
---- orig/include/asm-um/mmu_context.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/mmu_context.h	Wed Apr 16 13:59:16 2003
+--- orig/include/asm-um/mmu_context.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/mmu_context.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,72 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -36939,9 +37104,35 @@ diff -Naur -X ../exclude-files orig/include/asm-um/mmu_context.h um/include/asm-
 + * c-file-style: "linux"
 + * End:
 + */
+diff -Naur -X ../exclude-files orig/include/asm-um/mmu.h um/include/asm-um/mmu.h
+--- orig/include/asm-um/mmu.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/mmu.h	2002-11-09 12:51:11.000000000 -0500
+@@ -0,0 +1,22 @@
++/* 
++ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
++ * Licensed under the GPL
++ */
++
++#ifndef __MMU_H
++#define __MMU_H
++
++#include "um_mmu.h"
++
++#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-file-style: "linux"
++ * End:
++ */
 diff -Naur -X ../exclude-files orig/include/asm-um/module.h um/include/asm-um/module.h
---- orig/include/asm-um/module.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/module.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/module.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/module.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_MODULE_H
 +#define __UM_MODULE_H
@@ -36950,8 +37141,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/module.h um/include/asm-um/mo
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/msgbuf.h um/include/asm-um/msgbuf.h
---- orig/include/asm-um/msgbuf.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/msgbuf.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/msgbuf.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/msgbuf.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_MSGBUF_H
 +#define __UM_MSGBUF_H
@@ -36960,8 +37151,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/msgbuf.h um/include/asm-um/ms
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/mtrr.h um/include/asm-um/mtrr.h
---- orig/include/asm-um/mtrr.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/mtrr.h	Thu Mar 27 15:11:56 2003
+--- orig/include/asm-um/mtrr.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/mtrr.h	2003-05-29 13:46:27.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_MTRR_H
 +#define __UM_MTRR_H
@@ -36970,8 +37161,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/mtrr.h um/include/asm-um/mtrr
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/namei.h um/include/asm-um/namei.h
---- orig/include/asm-um/namei.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/namei.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/namei.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/namei.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_NAMEI_H
 +#define __UM_NAMEI_H
@@ -36980,8 +37171,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/namei.h um/include/asm-um/nam
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/page.h um/include/asm-um/page.h
---- orig/include/asm-um/page.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/page.h	Sun Oct 27 16:49:35 2002
+--- orig/include/asm-um/page.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/page.h	2002-10-27 16:49:35.000000000 -0500
 @@ -0,0 +1,53 @@
 +#ifndef __UM_PAGE_H
 +#define __UM_PAGE_H
@@ -37037,13 +37228,13 @@ diff -Naur -X ../exclude-files orig/include/asm-um/page.h um/include/asm-um/page
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/page_offset.h um/include/asm-um/page_offset.h
---- orig/include/asm-um/page_offset.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/page_offset.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/page_offset.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/page_offset.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1 @@
 +#define PAGE_OFFSET_RAW (uml_physmem)
 diff -Naur -X ../exclude-files orig/include/asm-um/param.h um/include/asm-um/param.h
---- orig/include/asm-um/param.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/param.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/param.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/param.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,24 @@
 +#ifndef _UM_PARAM_H
 +#define _UM_PARAM_H
@@ -37070,8 +37261,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/param.h um/include/asm-um/par
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/pci.h um/include/asm-um/pci.h
---- orig/include/asm-um/pci.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/pci.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/pci.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/pci.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_PCI_H
 +#define __UM_PCI_H
@@ -37080,8 +37271,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/pci.h um/include/asm-um/pci.h
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/pgalloc.h um/include/asm-um/pgalloc.h
---- orig/include/asm-um/pgalloc.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/pgalloc.h	Wed Apr 16 13:59:04 2003
+--- orig/include/asm-um/pgalloc.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/pgalloc.h	2003-05-28 11:02:08.000000000 -0400
 @@ -0,0 +1,162 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -37246,8 +37437,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/pgalloc.h um/include/asm-um/p
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/include/asm-um/pgtable.h um/include/asm-um/pgtable.h
---- orig/include/asm-um/pgtable.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/pgtable.h	Wed Apr 16 13:59:04 2003
+--- orig/include/asm-um/pgtable.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/pgtable.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,428 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -37678,8 +37869,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/pgtable.h um/include/asm-um/p
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/include/asm-um/poll.h um/include/asm-um/poll.h
---- orig/include/asm-um/poll.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/poll.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/poll.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/poll.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_POLL_H
 +#define __UM_POLL_H
@@ -37688,8 +37879,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/poll.h um/include/asm-um/poll
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/posix_types.h um/include/asm-um/posix_types.h
---- orig/include/asm-um/posix_types.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/posix_types.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/posix_types.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/posix_types.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_POSIX_TYPES_H
 +#define __UM_POSIX_TYPES_H
@@ -37698,8 +37889,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/posix_types.h um/include/asm-
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/processor-generic.h um/include/asm-um/processor-generic.h
---- orig/include/asm-um/processor-generic.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/processor-generic.h	Wed Apr 16 13:59:03 2003
+--- orig/include/asm-um/processor-generic.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/processor-generic.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,182 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -37884,8 +38075,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/processor-generic.h um/includ
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/include/asm-um/processor-i386.h um/include/asm-um/processor-i386.h
---- orig/include/asm-um/processor-i386.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/processor-i386.h	Wed Apr 16 13:59:03 2003
+--- orig/include/asm-um/processor-i386.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/processor-i386.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,35 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -37923,8 +38114,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/processor-i386.h um/include/a
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/include/asm-um/processor-ppc.h um/include/asm-um/processor-ppc.h
---- orig/include/asm-um/processor-ppc.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/processor-ppc.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/processor-ppc.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/processor-ppc.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,15 @@
 +#ifndef __UM_PROCESSOR_PPC_H
 +#define __UM_PROCESSOR_PPC_H
@@ -37942,8 +38133,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/processor-ppc.h um/include/as
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/ptrace-generic.h um/include/asm-um/ptrace-generic.h
---- orig/include/asm-um/ptrace-generic.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/ptrace-generic.h	Wed Mar 26 22:01:25 2003
+--- orig/include/asm-um/ptrace-generic.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/ptrace-generic.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,74 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -38020,8 +38211,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/ptrace-generic.h um/include/a
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/include/asm-um/ptrace-i386.h um/include/asm-um/ptrace-i386.h
---- orig/include/asm-um/ptrace-i386.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/ptrace-i386.h	Wed Mar 26 22:01:25 2003
+--- orig/include/asm-um/ptrace-i386.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/ptrace-i386.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,46 @@
 +/* 
 + * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
@@ -38070,8 +38261,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/ptrace-i386.h um/include/asm-
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/include/asm-um/resource.h um/include/asm-um/resource.h
---- orig/include/asm-um/resource.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/resource.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/resource.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/resource.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_RESOURCE_H
 +#define __UM_RESOURCE_H
@@ -38080,8 +38271,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/resource.h um/include/asm-um/
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/rwlock.h um/include/asm-um/rwlock.h
---- orig/include/asm-um/rwlock.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/rwlock.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/rwlock.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/rwlock.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_RWLOCK_H
 +#define __UM_RWLOCK_H
@@ -38090,8 +38281,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/rwlock.h um/include/asm-um/rw
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/rwsem.h um/include/asm-um/rwsem.h
---- orig/include/asm-um/rwsem.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/rwsem.h	Wed Apr 16 13:59:03 2003
+--- orig/include/asm-um/rwsem.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/rwsem.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,10 @@
 +#ifndef __UM_RWSEM_H__
 +#define __UM_RWSEM_H__
@@ -38104,8 +38295,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/rwsem.h um/include/asm-um/rws
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/scatterlist.h um/include/asm-um/scatterlist.h
---- orig/include/asm-um/scatterlist.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/scatterlist.h	Thu Feb 27 13:21:49 2003
+--- orig/include/asm-um/scatterlist.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/scatterlist.h	2003-02-27 13:21:49.000000000 -0500
 @@ -0,0 +1,6 @@
 +#ifndef __UM_SCATTERLIST_H
 +#define __UM_SCATTERLIST_H
@@ -38114,16 +38305,16 @@ diff -Naur -X ../exclude-files orig/include/asm-um/scatterlist.h um/include/asm-
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/segment.h um/include/asm-um/segment.h
---- orig/include/asm-um/segment.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/segment.h	Fri Nov  1 19:45:34 2002
+--- orig/include/asm-um/segment.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/segment.h	2002-11-01 19:45:34.000000000 -0500
 @@ -0,0 +1,4 @@
 +#ifndef __UM_SEGMENT_H
 +#define __UM_SEGMENT_H
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/semaphore.h um/include/asm-um/semaphore.h
---- orig/include/asm-um/semaphore.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/semaphore.h	Wed Apr 16 13:59:03 2003
+--- orig/include/asm-um/semaphore.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/semaphore.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_SEMAPHORE_H
 +#define __UM_SEMAPHORE_H
@@ -38132,8 +38323,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/semaphore.h um/include/asm-um
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/sembuf.h um/include/asm-um/sembuf.h
---- orig/include/asm-um/sembuf.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/sembuf.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/sembuf.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/sembuf.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_SEMBUF_H
 +#define __UM_SEMBUF_H
@@ -38142,8 +38333,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/sembuf.h um/include/asm-um/se
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/serial.h um/include/asm-um/serial.h
---- orig/include/asm-um/serial.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/serial.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/serial.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/serial.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_SERIAL_H
 +#define __UM_SERIAL_H
@@ -38152,8 +38343,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/serial.h um/include/asm-um/se
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/shmbuf.h um/include/asm-um/shmbuf.h
---- orig/include/asm-um/shmbuf.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/shmbuf.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/shmbuf.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/shmbuf.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_SHMBUF_H
 +#define __UM_SHMBUF_H
@@ -38162,8 +38353,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/shmbuf.h um/include/asm-um/sh
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/shmparam.h um/include/asm-um/shmparam.h
---- orig/include/asm-um/shmparam.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/shmparam.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/shmparam.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/shmparam.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_SHMPARAM_H
 +#define __UM_SHMPARAM_H
@@ -38172,8 +38363,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/shmparam.h um/include/asm-um/
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/sigcontext-generic.h um/include/asm-um/sigcontext-generic.h
---- orig/include/asm-um/sigcontext-generic.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/sigcontext-generic.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/sigcontext-generic.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/sigcontext-generic.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_SIGCONTEXT_GENERIC_H
 +#define __UM_SIGCONTEXT_GENERIC_H
@@ -38182,8 +38373,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/sigcontext-generic.h um/inclu
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/sigcontext-i386.h um/include/asm-um/sigcontext-i386.h
---- orig/include/asm-um/sigcontext-i386.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/sigcontext-i386.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/sigcontext-i386.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/sigcontext-i386.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_SIGCONTEXT_I386_H
 +#define __UM_SIGCONTEXT_I386_H
@@ -38192,8 +38383,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/sigcontext-i386.h um/include/
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/sigcontext-ppc.h um/include/asm-um/sigcontext-ppc.h
---- orig/include/asm-um/sigcontext-ppc.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/sigcontext-ppc.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/sigcontext-ppc.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/sigcontext-ppc.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,10 @@
 +#ifndef __UM_SIGCONTEXT_PPC_H
 +#define __UM_SIGCONTEXT_PPC_H
@@ -38206,8 +38397,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/sigcontext-ppc.h um/include/a
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/siginfo.h um/include/asm-um/siginfo.h
---- orig/include/asm-um/siginfo.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/siginfo.h	Wed Mar 26 22:01:25 2003
+--- orig/include/asm-um/siginfo.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/siginfo.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_SIGINFO_H
 +#define __UM_SIGINFO_H
@@ -38216,8 +38407,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/siginfo.h um/include/asm-um/s
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/signal.h um/include/asm-um/signal.h
---- orig/include/asm-um/signal.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/signal.h	Wed Mar 26 22:01:25 2003
+--- orig/include/asm-um/signal.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/signal.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,22 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -38242,8 +38433,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/signal.h um/include/asm-um/si
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/include/asm-um/smp.h um/include/asm-um/smp.h
---- orig/include/asm-um/smp.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/smp.h	Wed Mar 26 22:01:25 2003
+--- orig/include/asm-um/smp.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/smp.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,19 @@
 +#ifndef __UM_SMP_H
 +#define __UM_SMP_H
@@ -38265,8 +38456,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/smp.h um/include/asm-um/smp.h
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/smplock.h um/include/asm-um/smplock.h
---- orig/include/asm-um/smplock.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/smplock.h	Wed Apr 16 13:59:04 2003
+--- orig/include/asm-um/smplock.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/smplock.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_SMPLOCK_H
 +#define __UM_SMPLOCK_H
@@ -38275,8 +38466,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/smplock.h um/include/asm-um/s
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/socket.h um/include/asm-um/socket.h
---- orig/include/asm-um/socket.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/socket.h	Thu Feb 27 13:20:13 2003
+--- orig/include/asm-um/socket.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/socket.h	2003-02-27 13:20:13.000000000 -0500
 @@ -0,0 +1,6 @@
 +#ifndef __UM_SOCKET_H
 +#define __UM_SOCKET_H
@@ -38285,8 +38476,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/socket.h um/include/asm-um/so
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/sockios.h um/include/asm-um/sockios.h
---- orig/include/asm-um/sockios.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/sockios.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/sockios.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/sockios.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_SOCKIOS_H
 +#define __UM_SOCKIOS_H
@@ -38295,8 +38486,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/sockios.h um/include/asm-um/s
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/softirq.h um/include/asm-um/softirq.h
---- orig/include/asm-um/softirq.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/softirq.h	Wed Apr 16 13:59:04 2003
+--- orig/include/asm-um/softirq.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/softirq.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,13 @@
 +#ifndef __UM_SOFTIRQ_H
 +#define __UM_SOFTIRQ_H
@@ -38312,8 +38503,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/softirq.h um/include/asm-um/s
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/spinlock.h um/include/asm-um/spinlock.h
---- orig/include/asm-um/spinlock.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/spinlock.h	Wed Mar 26 22:01:25 2003
+--- orig/include/asm-um/spinlock.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/spinlock.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,10 @@
 +#ifndef __UM_SPINLOCK_H
 +#define __UM_SPINLOCK_H
@@ -38325,19 +38516,9 @@ diff -Naur -X ../exclude-files orig/include/asm-um/spinlock.h um/include/asm-um/
 +#endif
 +
 +#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/stat.h um/include/asm-um/stat.h
---- orig/include/asm-um/stat.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/stat.h	Wed Oct 23 21:08:05 2002
-@@ -0,0 +1,6 @@
-+#ifndef __UM_STAT_H
-+#define __UM_STAT_H
-+
-+#include "asm/arch/stat.h"
-+
-+#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/statfs.h um/include/asm-um/statfs.h
---- orig/include/asm-um/statfs.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/statfs.h	Wed Mar 26 22:01:25 2003
+--- orig/include/asm-um/statfs.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/statfs.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef _UM_STATFS_H
 +#define _UM_STATFS_H
@@ -38345,9 +38526,19 @@ diff -Naur -X ../exclude-files orig/include/asm-um/statfs.h um/include/asm-um/st
 +#include "asm/arch/statfs.h"
 +
 +#endif
+diff -Naur -X ../exclude-files orig/include/asm-um/stat.h um/include/asm-um/stat.h
+--- orig/include/asm-um/stat.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/stat.h	2002-10-23 21:08:05.000000000 -0400
+@@ -0,0 +1,6 @@
++#ifndef __UM_STAT_H
++#define __UM_STAT_H
++
++#include "asm/arch/stat.h"
++
++#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/string.h um/include/asm-um/string.h
---- orig/include/asm-um/string.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/string.h	Mon Feb 24 22:52:09 2003
+--- orig/include/asm-um/string.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/string.h	2003-02-24 22:52:09.000000000 -0500
 @@ -0,0 +1,7 @@
 +#ifndef __UM_STRING_H
 +#define __UM_STRING_H
@@ -38357,8 +38548,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/string.h um/include/asm-um/st
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/system-generic.h um/include/asm-um/system-generic.h
---- orig/include/asm-um/system-generic.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/system-generic.h	Wed Mar 26 22:01:25 2003
+--- orig/include/asm-um/system-generic.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/system-generic.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,50 @@
 +#ifndef __UM_SYSTEM_GENERIC_H
 +#define __UM_SYSTEM_GENERIC_H
@@ -38411,8 +38602,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/system-generic.h um/include/a
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/system-i386.h um/include/asm-um/system-i386.h
---- orig/include/asm-um/system-i386.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/system-i386.h	Wed Mar 26 22:01:25 2003
+--- orig/include/asm-um/system-i386.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/system-i386.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,39 @@
 +#ifndef __UM_SYSTEM_I386_H
 +#define __UM_SYSTEM_I386_H
@@ -38454,8 +38645,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/system-i386.h um/include/asm-
 +    
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/system-ppc.h um/include/asm-um/system-ppc.h
---- orig/include/asm-um/system-ppc.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/system-ppc.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/system-ppc.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/system-ppc.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,12 @@
 +#ifndef __UM_SYSTEM_PPC_H
 +#define __UM_SYSTEM_PPC_H
@@ -38470,8 +38661,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/system-ppc.h um/include/asm-u
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/termbits.h um/include/asm-um/termbits.h
---- orig/include/asm-um/termbits.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/termbits.h	Wed Oct 23 21:11:14 2002
+--- orig/include/asm-um/termbits.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/termbits.h	2002-10-23 21:11:14.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_TERMBITS_H
 +#define __UM_TERMBITS_H
@@ -38480,8 +38671,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/termbits.h um/include/asm-um/
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/termios.h um/include/asm-um/termios.h
---- orig/include/asm-um/termios.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/termios.h	Thu Feb 27 13:20:13 2003
+--- orig/include/asm-um/termios.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/termios.h	2003-02-27 13:20:13.000000000 -0500
 @@ -0,0 +1,6 @@
 +#ifndef __UM_TERMIOS_H
 +#define __UM_TERMIOS_H
@@ -38490,8 +38681,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/termios.h um/include/asm-um/t
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/timex.h um/include/asm-um/timex.h
---- orig/include/asm-um/timex.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/timex.h	Wed Mar 26 22:01:25 2003
+--- orig/include/asm-um/timex.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/timex.h	2003-05-28 11:02:07.000000000 -0400
 @@ -0,0 +1,18 @@
 +#ifndef __UM_TIMEX_H
 +#define __UM_TIMEX_H
@@ -38512,13 +38703,13 @@ diff -Naur -X ../exclude-files orig/include/asm-um/timex.h um/include/asm-um/tim
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/tlb.h um/include/asm-um/tlb.h
---- orig/include/asm-um/tlb.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/tlb.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/tlb.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/tlb.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1 @@
 +#include <asm-generic/tlb.h>
 diff -Naur -X ../exclude-files orig/include/asm-um/types.h um/include/asm-um/types.h
---- orig/include/asm-um/types.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/types.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/types.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/types.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_TYPES_H
 +#define __UM_TYPES_H
@@ -38527,8 +38718,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/types.h um/include/asm-um/typ
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/uaccess.h um/include/asm-um/uaccess.h
---- orig/include/asm-um/uaccess.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/uaccess.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/uaccess.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/uaccess.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,97 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -38628,8 +38819,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/uaccess.h um/include/asm-um/u
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/include/asm-um/ucontext.h um/include/asm-um/ucontext.h
---- orig/include/asm-um/ucontext.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/ucontext.h	Sun Dec  1 13:20:58 2002
+--- orig/include/asm-um/ucontext.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/ucontext.h	2002-12-01 13:20:58.000000000 -0500
 @@ -0,0 +1,6 @@
 +#ifndef _ASM_UM_UCONTEXT_H
 +#define _ASM_UM_UCONTEXT_H
@@ -38638,8 +38829,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/ucontext.h um/include/asm-um/
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/unaligned.h um/include/asm-um/unaligned.h
---- orig/include/asm-um/unaligned.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/unaligned.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/unaligned.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/unaligned.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_UNALIGNED_H
 +#define __UM_UNALIGNED_H
@@ -38648,8 +38839,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/unaligned.h um/include/asm-um
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/unistd.h um/include/asm-um/unistd.h
---- orig/include/asm-um/unistd.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/unistd.h	Wed Mar 26 22:01:27 2003
+--- orig/include/asm-um/unistd.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/unistd.h	2003-05-28 11:02:08.000000000 -0400
 @@ -0,0 +1,118 @@
 +/* 
 + * Copyright (C) 2000, 2001  Jeff Dike (jdike@karaya.com)
@@ -38770,8 +38961,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/unistd.h um/include/asm-um/un
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/include/asm-um/user.h um/include/asm-um/user.h
---- orig/include/asm-um/user.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/user.h	Wed Apr 16 13:59:45 2003
+--- orig/include/asm-um/user.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/user.h	2003-05-28 11:04:47.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_USER_H
 +#define __UM_USER_H
@@ -38780,8 +38971,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/user.h um/include/asm-um/user
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/vga.h um/include/asm-um/vga.h
---- orig/include/asm-um/vga.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/vga.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/vga.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/vga.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_VGA_H
 +#define __UM_VGA_H
@@ -38790,8 +38981,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/vga.h um/include/asm-um/vga.h
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/asm-um/xor.h um/include/asm-um/xor.h
---- orig/include/asm-um/xor.h	Wed Dec 31 19:00:00 1969
-+++ um/include/asm-um/xor.h	Wed Oct 23 21:08:05 2002
+--- orig/include/asm-um/xor.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/asm-um/xor.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,6 @@
 +#ifndef __UM_XOR_H
 +#define __UM_XOR_H
@@ -38800,8 +38991,8 @@ diff -Naur -X ../exclude-files orig/include/asm-um/xor.h um/include/asm-um/xor.h
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/linux/blk.h um/include/linux/blk.h
---- orig/include/linux/blk.h	Sun Sep 15 12:13:19 2002
-+++ um/include/linux/blk.h	Wed Apr 16 13:59:04 2003
+--- orig/include/linux/blk.h	2002-09-15 12:13:19.000000000 -0400
++++ um/include/linux/blk.h	2003-05-28 11:02:34.000000000 -0400
 @@ -320,6 +320,15 @@
  #define DEVICE_REQUEST do_ida_request
  #define DEVICE_NR(device) (MINOR(device) >> 4)
@@ -38819,8 +39010,8 @@ diff -Naur -X ../exclude-files orig/include/linux/blk.h um/include/linux/blk.h
  
  /* provide DEVICE_xxx defaults, if not explicitly defined
 diff -Naur -X ../exclude-files orig/include/linux/fs.h um/include/linux/fs.h
---- orig/include/linux/fs.h	Thu Feb 27 13:04:27 2003
-+++ um/include/linux/fs.h	Wed Apr 16 13:59:03 2003
+--- orig/include/linux/fs.h	2003-02-27 13:04:27.000000000 -0500
++++ um/include/linux/fs.h	2003-05-28 11:02:07.000000000 -0400
 @@ -318,6 +318,8 @@
  #include <linux/ncp_fs_i.h>
  #include <linux/proc_fs_i.h>
@@ -38842,8 +39033,8 @@ diff -Naur -X ../exclude-files orig/include/linux/fs.h um/include/linux/fs.h
  	} u;
  };
 diff -Naur -X ../exclude-files orig/include/linux/hostfs_fs_i.h um/include/linux/hostfs_fs_i.h
---- orig/include/linux/hostfs_fs_i.h	Wed Dec 31 19:00:00 1969
-+++ um/include/linux/hostfs_fs_i.h	Wed Oct 23 21:08:05 2002
+--- orig/include/linux/hostfs_fs_i.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/linux/hostfs_fs_i.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,21 @@
 +#ifndef _HOSTFS_FS_I
 +#define _HOSTFS_FS_I
@@ -38867,8 +39058,8 @@ diff -Naur -X ../exclude-files orig/include/linux/hostfs_fs_i.h um/include/linux
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/include/linux/hppfs_fs_i.h um/include/linux/hppfs_fs_i.h
---- orig/include/linux/hppfs_fs_i.h	Wed Dec 31 19:00:00 1969
-+++ um/include/linux/hppfs_fs_i.h	Wed Oct 23 21:08:05 2002
+--- orig/include/linux/hppfs_fs_i.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/linux/hppfs_fs_i.h	2002-10-23 21:08:05.000000000 -0400
 @@ -0,0 +1,19 @@
 +#ifndef _HPPFS_FS_I
 +#define _HPPFS_FS_I
@@ -38890,8 +39081,8 @@ diff -Naur -X ../exclude-files orig/include/linux/hppfs_fs_i.h um/include/linux/
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/include/linux/kernel.h um/include/linux/kernel.h
---- orig/include/linux/kernel.h	Thu Feb 27 13:04:27 2003
-+++ um/include/linux/kernel.h	Wed Mar 26 22:01:25 2003
+--- orig/include/linux/kernel.h	2003-02-27 13:04:27.000000000 -0500
++++ um/include/linux/kernel.h	2003-05-28 11:02:07.000000000 -0400
 @@ -49,7 +49,7 @@
  # define ATTRIB_NORET  __attribute__((noreturn))
  # define NORET_AND     noreturn,
@@ -38902,8 +39093,8 @@ diff -Naur -X ../exclude-files orig/include/linux/kernel.h um/include/linux/kern
  #else
  #define FASTCALL(x)	x
 diff -Naur -X ../exclude-files orig/include/linux/kernel_stat.h um/include/linux/kernel_stat.h
---- orig/include/linux/kernel_stat.h	Thu Feb 27 13:04:27 2003
-+++ um/include/linux/kernel_stat.h	Wed Apr 16 13:59:39 2003
+--- orig/include/linux/kernel_stat.h	2003-02-27 13:04:27.000000000 -0500
++++ um/include/linux/kernel_stat.h	2003-05-28 11:02:07.000000000 -0400
 @@ -12,7 +12,7 @@
   * used by rstatd/perfmeter
   */
@@ -38914,8 +39105,8 @@ diff -Naur -X ../exclude-files orig/include/linux/kernel_stat.h um/include/linux
  
  struct kernel_stat {
 diff -Naur -X ../exclude-files orig/include/linux/mm.h um/include/linux/mm.h
---- orig/include/linux/mm.h	Sun Sep 15 12:13:19 2002
-+++ um/include/linux/mm.h	Wed Apr 16 13:59:04 2003
+--- orig/include/linux/mm.h	2002-09-15 12:13:19.000000000 -0400
++++ um/include/linux/mm.h	2003-05-28 11:02:07.000000000 -0400
 @@ -425,6 +425,14 @@
  extern struct page * FASTCALL(__alloc_pages(unsigned int gfp_mask, unsigned int order, zonelist_t *zonelist));
  extern struct page * alloc_pages_node(int nid, unsigned int gfp_mask, unsigned int order);
@@ -38975,8 +39166,8 @@ diff -Naur -X ../exclude-files orig/include/linux/mm.h um/include/linux/mm.h
  	return ret;
  }
 diff -Naur -X ../exclude-files orig/include/linux/proc_mm.h um/include/linux/proc_mm.h
---- orig/include/linux/proc_mm.h	Wed Dec 31 19:00:00 1969
-+++ um/include/linux/proc_mm.h	Wed Apr 16 13:59:47 2003
+--- orig/include/linux/proc_mm.h	1969-12-31 19:00:00.000000000 -0500
++++ um/include/linux/proc_mm.h	2003-05-28 11:03:43.000000000 -0400
 @@ -0,0 +1,48 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -39027,8 +39218,8 @@ diff -Naur -X ../exclude-files orig/include/linux/proc_mm.h um/include/linux/pro
 +
 +#endif
 diff -Naur -X ../exclude-files orig/include/linux/tty.h um/include/linux/tty.h
---- orig/include/linux/tty.h	Thu Feb 27 13:04:28 2003
-+++ um/include/linux/tty.h	Wed Apr 16 13:59:04 2003
+--- orig/include/linux/tty.h	2003-02-27 13:04:28.000000000 -0500
++++ um/include/linux/tty.h	2003-05-28 11:02:07.000000000 -0400
 @@ -309,6 +309,9 @@
  	spinlock_t read_lock;
  	/* If the tty has a pending do_SAK, queue it here - akpm */
@@ -39047,18 +39238,17 @@ diff -Naur -X ../exclude-files orig/include/linux/tty.h um/include/linux/tty.h
  extern int a2232board_init(void);
  
  extern int tty_paranoia_check(struct tty_struct *tty, kdev_t device,
-@@ -420,6 +424,8 @@
- 
+@@ -421,5 +425,7 @@
  extern int vt_ioctl(struct tty_struct *tty, struct file * file,
  		    unsigned int cmd, unsigned long arg);
-+
-+extern void stdio_console_init(void);
  
++extern void stdio_console_init(void);
++
  #endif /* __KERNEL__ */
  #endif
 diff -Naur -X ../exclude-files orig/init/do_mounts.c um/init/do_mounts.c
---- orig/init/do_mounts.c	Thu Feb 27 13:04:28 2003
-+++ um/init/do_mounts.c	Thu Feb 27 13:05:27 2003
+--- orig/init/do_mounts.c	2003-02-27 13:04:28.000000000 -0500
++++ um/init/do_mounts.c	2003-02-27 13:05:27.000000000 -0500
 @@ -153,6 +153,22 @@
  	{ "pf",		0x2f00 },
  	{ "apblock", APBLOCK_MAJOR << 8},
@@ -39083,8 +39273,8 @@ diff -Naur -X ../exclude-files orig/init/do_mounts.c um/init/do_mounts.c
  #if defined(CONFIG_ARCH_S390)
  	{ "dasda", (DASD_MAJOR << MINORBITS) },
 diff -Naur -X ../exclude-files orig/kernel/panic.c um/kernel/panic.c
---- orig/kernel/panic.c	Thu Feb 27 13:04:29 2003
-+++ um/kernel/panic.c	Thu Feb 27 13:05:27 2003
+--- orig/kernel/panic.c	2003-02-27 13:04:29.000000000 -0500
++++ um/kernel/panic.c	2003-02-27 13:05:27.000000000 -0500
 @@ -66,7 +66,7 @@
  	smp_send_stop();
  #endif
@@ -39094,9 +39284,47 @@ diff -Naur -X ../exclude-files orig/kernel/panic.c um/kernel/panic.c
  
  	if (panic_timeout > 0)
  	{
+diff -Naur -X ../exclude-files orig/MAINTAINERS um/MAINTAINERS
+--- orig/MAINTAINERS	2003-02-27 13:04:12.000000000 -0500
++++ um/MAINTAINERS	2003-02-27 13:05:17.000000000 -0500
+@@ -1841,6 +1841,14 @@
+ L:	linux-usb-devel@lists.sourceforge.net
+ W:	http://usb.in.tum.de
+ S:	Maintained
++
++USER-MODE PORT
++P:	Jeff Dike
++M:	jdike@karaya.com
++L:	user-mode-linux-devel@lists.sourceforge.net
++L:	user-mode-linux-user@lists.sourceforge.net
++W:	http://user-mode-linux.sourceforge.net
++S:	Maintained
+ 	
+ USB "USBNET" DRIVER
+ P:	David Brownell
+diff -Naur -X ../exclude-files orig/Makefile um/Makefile
+--- orig/Makefile	2003-02-27 13:04:12.000000000 -0500
++++ um/Makefile	2003-02-27 13:05:17.000000000 -0500
+@@ -5,7 +5,15 @@
+ 
+ KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
+ 
+-ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
++# SUBARCH tells the usermode build what the underlying arch is.  That is set
++# first, and if a usermode build is happening, the "ARCH=um" on the command
++# line overrides the setting of ARCH below.  If a native build is happening,
++# 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/)
++ARCH := $(SUBARCH)
++
+ KERNELPATH=kernel-$(shell echo $(KERNELRELEASE) | sed -e "s/-//g")
+ 
+ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
 diff -Naur -X ../exclude-files orig/mm/Makefile um/mm/Makefile
---- orig/mm/Makefile	Wed Aug 21 11:47:43 2002
-+++ um/mm/Makefile	Fri Nov  8 14:21:36 2002
+--- orig/mm/Makefile	2002-08-21 11:47:43.000000000 -0400
++++ um/mm/Makefile	2002-11-08 14:21:36.000000000 -0500
 @@ -17,5 +17,6 @@
  	    shmem.o
  
@@ -39105,8 +39333,8 @@ diff -Naur -X ../exclude-files orig/mm/Makefile um/mm/Makefile
  
  include $(TOPDIR)/Rules.make
 diff -Naur -X ../exclude-files orig/mm/mmap.c um/mm/mmap.c
---- orig/mm/mmap.c	Thu Feb 27 13:04:29 2003
-+++ um/mm/mmap.c	Thu Feb 27 13:05:27 2003
+--- orig/mm/mmap.c	2003-02-27 13:04:29.000000000 -0500
++++ um/mm/mmap.c	2003-02-27 13:05:27.000000000 -0500
 @@ -390,10 +390,11 @@
  	return 0;
  }
@@ -39123,8 +39351,8 @@ diff -Naur -X ../exclude-files orig/mm/mmap.c um/mm/mmap.c
  	unsigned int vm_flags;
  	int correct_wcount = 0;
 diff -Naur -X ../exclude-files orig/mm/mprotect.c um/mm/mprotect.c
---- orig/mm/mprotect.c	Wed Aug 21 11:47:43 2002
-+++ um/mm/mprotect.c	Sun Nov 10 20:24:32 2002
+--- orig/mm/mprotect.c	2002-08-21 11:47:43.000000000 -0400
++++ um/mm/mprotect.c	2002-11-10 20:24:32.000000000 -0500
 @@ -264,7 +264,8 @@
  	return 0;
  }
@@ -39154,15 +39382,15 @@ diff -Naur -X ../exclude-files orig/mm/mprotect.c um/mm/mprotect.c
 -	up_write(&current->mm->mmap_sem);
 +	up_write(&mm->mmap_sem);
  	return error;
-+}
+ }
 +
 +asmlinkage long sys_mprotect(unsigned long start, size_t len, unsigned long prot)
 +{
 +        return(do_mprotect(current->mm, start, len, prot));
- }
++}
 diff -Naur -X ../exclude-files orig/mm/proc_mm.c um/mm/proc_mm.c
---- orig/mm/proc_mm.c	Wed Dec 31 19:00:00 1969
-+++ um/mm/proc_mm.c	Tue Nov 19 14:20:26 2002
+--- orig/mm/proc_mm.c	1969-12-31 19:00:00.000000000 -0500
++++ um/mm/proc_mm.c	2002-11-19 14:20:26.000000000 -0500
 @@ -0,0 +1,173 @@
 +/* 
 + * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
@@ -39338,8 +39566,8 @@ diff -Naur -X ../exclude-files orig/mm/proc_mm.c um/mm/proc_mm.c
 + * End:
 + */
 diff -Naur -X ../exclude-files orig/mm/slab.c um/mm/slab.c
---- orig/mm/slab.c	Thu Feb 27 13:04:29 2003
-+++ um/mm/slab.c	Thu Feb 27 13:05:27 2003
+--- orig/mm/slab.c	2003-02-27 13:04:29.000000000 -0500
++++ um/mm/slab.c	2003-02-27 13:05:27.000000000 -0500
 @@ -1946,10 +1946,14 @@
  
  	name = cachep->name; 
diff --git a/lustre/kernel_patches/patches/uml_compile_fixes.patch b/lustre/kernel_patches/patches/uml_compile_fixes.patch
deleted file mode 100644
index 815bd92cfd..0000000000
--- a/lustre/kernel_patches/patches/uml_compile_fixes.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
- 0 files changed
-
---- linux-2.4.18-17.8.0/include/asm-um/pgtable.h~uml_compile_fixes	2002-12-06 15:46:21.000000000 -0800
-+++ linux-2.4.18-17.8.0-zab/include/asm-um/pgtable.h	2002-12-06 15:46:21.000000000 -0800
-@@ -200,7 +200,7 @@ static inline void pgd_clear(pgd_t * pgd
-  * called on a highmem page.
-  */
- 
--#define page_address(page) ({ if (!(page)->virtual) BUG(); (page)->virtual; })
-+//#define page_address(page) ({ if (!(page)->virtual) BUG(); (page)->virtual; })
- #define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT))
- 
- extern struct page *pte_mem_map(pte_t pte);
-
-_
diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.18-18.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.18-18-chaos65.patch
similarity index 64%
rename from lustre/kernel_patches/patches/vfs_intent-2.4.18-18.patch
rename to lustre/kernel_patches/patches/vfs_intent-2.4.18-18-chaos65.patch
index 141b5d4c35..d68a35161f 100644
--- a/lustre/kernel_patches/patches/vfs_intent-2.4.18-18.patch
+++ b/lustre/kernel_patches/patches/vfs_intent-2.4.18-18-chaos65.patch
@@ -1,17 +1,80 @@
- fs/dcache.c            |   20 ++
- fs/exec.c              |   19 +-
- fs/namei.c             |  378 +++++++++++++++++++++++++++++++++++++++++--------
- fs/nfsd/vfs.c          |    2 
- fs/open.c              |  120 +++++++++++++--
- fs/proc/base.c         |    1 
- fs/stat.c              |    8 -
- include/linux/dcache.h |   31 ++++
- include/linux/fs.h     |   28 +++
+ fs/dcache.c            |   19 ++
+ fs/exec.c              |   15 +-
+ fs/namei.c             |  355 +++++++++++++++++++++++++++++++++++++++++--------
+ fs/namespace.c         |   30 +++-
+ fs/open.c              |  122 ++++++++++++++--
+ fs/proc/base.c         |    3 
+ fs/stat.c              |   27 ++-
+ include/linux/dcache.h |   54 +++++++
+ include/linux/fs.h     |   31 ++++
+ kernel/exit.c          |    3 
+ kernel/fork.c          |    3 
  kernel/ksyms.c         |    1 
- 10 files changed, 522 insertions(+), 85 deletions(-)
+ 12 files changed, 564 insertions(+), 99 deletions(-)
 
---- linux-2.4.18-61chaos/fs/dcache.c~vfs_intent-2.4.18-18	Sun Jun  1 21:55:14 2003
-+++ linux-2.4.18-61chaos-root/fs/dcache.c	Sun Jun  1 21:59:04 2003
+--- linux-2.4.18-p4smp/fs/exec.c~vfs_intent-2.4.18-18-chaos65	2003-07-09 12:17:30.000000000 -0600
++++ linux-2.4.18-p4smp-braam/fs/exec.c	2003-07-09 13:20:37.000000000 -0600
+@@ -117,8 +117,9 @@ asmlinkage long sys_uselib(const char * 
+ 	struct file * file;
+ 	struct nameidata nd;
+ 	int error;
++	struct lookup_intent it = { .it_op = IT_OPEN, .it_flags = O_RDONLY };
+ 
+-	error = user_path_walk(library, &nd);
++	error = user_path_walk_it(library, &nd, &it);
+ 	if (error)
+ 		goto out;
+ 
+@@ -130,7 +131,8 @@ asmlinkage long sys_uselib(const char * 
+ 	if (error)
+ 		goto exit;
+ 
+-	file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
++	file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
++	intent_release(&it);
+ 	error = PTR_ERR(file);
+ 	if (IS_ERR(file))
+ 		goto out;
+@@ -359,8 +361,9 @@ struct file *open_exec(const char *name)
+ 	struct inode *inode;
+ 	struct file *file;
+ 	int err = 0;
++	struct lookup_intent it = { .it_op = IT_OPEN, .it_flags = O_RDONLY };
+ 
+-	err = path_lookup(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
++	err = path_lookup_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
+ 	file = ERR_PTR(err);
+ 	if (!err) {
+ 		inode = nd.dentry->d_inode;
+@@ -372,7 +375,8 @@ struct file *open_exec(const char *name)
+ 				err = -EACCES;
+ 			file = ERR_PTR(err);
+ 			if (!err) {
+-				file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
++				file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
++				intent_release(&it);
+ 				if (!IS_ERR(file)) {
+ 					err = deny_write_access(file);
+ 					if (err) {
+@@ -384,6 +388,7 @@ out:
+ 				return file;
+ 			}
+ 		}
++		intent_release(&it);
+ 		path_release(&nd);
+ 	}
+ 	goto out;
+@@ -1104,7 +1109,7 @@ int do_coredump(long signr, struct pt_re
+ 		goto close_fail;
+ 	if (!file->f_op->write)
+ 		goto close_fail;
+-	if (do_truncate(file->f_dentry, 0) != 0)
++	if (do_truncate(file->f_dentry, 0, 0) != 0)
+ 		goto close_fail;
+ 
+ 	retval = binfmt->core_dump(signr, regs, file);
+--- linux-2.4.18-p4smp/fs/dcache.c~vfs_intent-2.4.18-18-chaos65	2003-07-09 12:17:30.000000000 -0600
++++ linux-2.4.18-p4smp-braam/fs/dcache.c	2003-07-09 13:20:37.000000000 -0600
 @@ -186,6 +186,13 @@ int d_invalidate(struct dentry * dentry)
  		spin_unlock(&dcache_lock);
  		return 0;
@@ -26,15 +89,7 @@
  	/*
  	 * Check whether to do a partial shrink_dcache
  	 * to get rid of unused child entries.
-@@ -645,6 +652,7 @@ struct dentry * d_alloc(struct dentry * 
- 	dentry->d_fsdata = NULL;
- 	dentry->d_extra_attributes = NULL;
- 	dentry->d_mounted = 0;
-+	dentry->d_it = NULL;
- 	INIT_LIST_HEAD(&dentry->d_hash);
- 	INIT_LIST_HEAD(&dentry->d_lru);
- 	INIT_LIST_HEAD(&dentry->d_subdirs);
-@@ -859,13 +867,19 @@ void d_delete(struct dentry * dentry)
+@@ -859,13 +866,19 @@ void d_delete(struct dentry * dentry)
   * Adds a dentry to the hash according to its name.
   */
   
@@ -57,16 +112,133 @@
  }
  
  #define do_switch(x,y) do { \
---- linux-2.4.18-61chaos/fs/namei.c~vfs_intent-2.4.18-18	Sun Jun  1 21:55:14 2003
-+++ linux-2.4.18-61chaos-root/fs/namei.c	Sun Jun  1 23:14:49 2003
+--- linux-2.4.18-p4smp/fs/namespace.c~vfs_intent-2.4.18-18-chaos65	2002-06-25 22:16:14.000000000 -0600
++++ linux-2.4.18-p4smp-braam/fs/namespace.c	2003-07-09 13:20:37.000000000 -0600
+@@ -99,6 +99,7 @@ static void detach_mnt(struct vfsmount *
+ {
+ 	old_nd->dentry = mnt->mnt_mountpoint;
+ 	old_nd->mnt = mnt->mnt_parent;
++	UNPIN(old_nd->dentry, old_nd->mnt, 1);
+ 	mnt->mnt_parent = mnt;
+ 	mnt->mnt_mountpoint = mnt->mnt_root;
+ 	list_del_init(&mnt->mnt_child);
+@@ -110,6 +111,7 @@ static void attach_mnt(struct vfsmount *
+ {
+ 	mnt->mnt_parent = mntget(nd->mnt);
+ 	mnt->mnt_mountpoint = dget(nd->dentry);
++	PIN(nd->dentry, nd->mnt, 1);
+ 	list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry));
+ 	list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts);
+ 	nd->dentry->d_mounted++;
+@@ -485,14 +487,17 @@ static int do_loopback(struct nameidata 
+ {
+ 	struct nameidata old_nd;
+ 	struct vfsmount *mnt = NULL;
++	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 	int err = mount_is_safe(nd);
+ 	if (err)
+ 		return err;
+ 	if (!old_name || !*old_name)
+ 		return -EINVAL;
+-	err = path_lookup(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd);
+-	if (err)
++	err = path_lookup_it(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd, &it);
++	if (err) {
++		intent_release(&it);
+ 		return err;
++	}
+ 
+ 	down_write(&current->namespace->sem);
+ 	err = -EINVAL;
+@@ -515,6 +520,7 @@ static int do_loopback(struct nameidata 
+ 	}
+ 
+ 	up_write(&current->namespace->sem);
++	intent_release(&it);
+ 	path_release(&old_nd);
+ 	return err;
+ }
+@@ -698,7 +704,8 @@ long do_mount(char * dev_name, char * di
+ 		  unsigned long flags, void *data_page)
+ {
+ 	struct nameidata nd;
+-	int retval = 0;
++	struct lookup_intent it = { .it_op = IT_GETATTR };
++	int retval = 0;
+ 	int mnt_flags = 0;
+ 
+ 	/* Discard magic */
+@@ -722,10 +729,11 @@ long do_mount(char * dev_name, char * di
+ 	flags &= ~(MS_NOSUID|MS_NOEXEC|MS_NODEV);
+ 
+ 	/* ... and get the mountpoint */
+-	retval = path_lookup(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
+-	if (retval)
++	retval = path_lookup_it(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
++	if (retval) {
++		intent_release(&it);
+ 		return retval;
+-
++	}
+ 	if (flags & MS_REMOUNT)
+ 		retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags,
+ 				    data_page);
+@@ -736,6 +744,8 @@ long do_mount(char * dev_name, char * di
+ 	else
+ 		retval = do_add_mount(&nd, type_page, flags, mnt_flags,
+ 				      dev_name, data_page);
++
++	intent_release(&it);
+ 	path_release(&nd);
+ 	return retval;
+ }
+@@ -901,6 +911,8 @@ asmlinkage long sys_pivot_root(const cha
+ {
+ 	struct vfsmount *tmp;
+ 	struct nameidata new_nd, old_nd, parent_nd, root_parent, user_nd;
++	struct lookup_intent new_it = { .it_op = IT_GETATTR };
++	struct lookup_intent old_it = { .it_op = IT_GETATTR };
+ 	int error;
+ 
+ 	if (!capable(CAP_SYS_ADMIN))
+@@ -908,14 +920,14 @@ asmlinkage long sys_pivot_root(const cha
+ 
+ 	lock_kernel();
+ 
+-	error = __user_walk(new_root, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd);
++	error = __user_walk_it(new_root, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd, &new_it);
+ 	if (error)
+ 		goto out0;
+ 	error = -EINVAL;
+ 	if (!check_mnt(new_nd.mnt))
+ 		goto out1;
+ 
+-	error = __user_walk(put_old, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd);
++	error = __user_walk_it(put_old, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd, &old_it);
+ 	if (error)
+ 		goto out1;
+ 
+@@ -970,8 +982,10 @@ out2:
+ 	up(&old_nd.dentry->d_inode->i_zombie);
+ 	up_write(&current->namespace->sem);
+ 	path_release(&user_nd);
++	intent_release(&old_it);
+ 	path_release(&old_nd);
+ out1:
++	intent_release(&new_it);
+ 	path_release(&new_nd);
+ out0:
+ 	unlock_kernel();
+--- linux-2.4.18-p4smp/fs/namei.c~vfs_intent-2.4.18-18-chaos65	2003-07-09 12:17:30.000000000 -0600
++++ linux-2.4.18-p4smp-braam/fs/namei.c	2003-07-09 13:20:37.000000000 -0600
 @@ -94,6 +94,13 @@
   * XEmacs seems to be relying on it...
   */
  
-+void intent_release(struct dentry *de, struct lookup_intent *it)
++void intent_release(struct lookup_intent *it)
 +{
-+	if (it && de->d_op && de->d_op->d_intent_release)
-+		de->d_op->d_intent_release(de, it);
++	if (it && it->it_op_release)
++		it->it_op_release(it);
 +
 +}
 +
@@ -83,8 +255,8 @@
  {
  	struct dentry * dentry = d_lookup(parent, name);
  
-+	if (dentry && dentry->d_op && dentry->d_op->d_revalidate2) {
-+		if (!dentry->d_op->d_revalidate2(dentry, flags, it) &&
++	if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
++		if (!dentry->d_op->d_revalidate_it(dentry, flags, it) &&
 +		    !d_invalidate(dentry)) {
 +			dput(dentry);
 +			dentry = NULL;
@@ -114,8 +286,8 @@
  		result = ERR_PTR(-ENOMEM);
  		if (dentry) {
  			lock_kernel();
-+			if (dir->i_op->lookup2)
-+				result = dir->i_op->lookup2(dir, dentry, it);
++			if (dir->i_op->lookup_it)
++				result = dir->i_op->lookup_it(dir, dentry, it, flags);
 +			else
  			result = dir->i_op->lookup(dir, dentry);
  			unlock_kernel();
@@ -124,8 +296,8 @@
  			dput(result);
  			result = ERR_PTR(-ENOENT);
  		}
-+	} else if (result->d_op && result->d_op->d_revalidate2) {
-+		if (!result->d_op->d_revalidate2(result, flags, it) &&
++	} else if (result->d_op && result->d_op->d_revalidate_it) {
++		if (!result->d_op->d_revalidate_it(result, flags, it) &&
 +		    !d_invalidate(result)) {
 +			dput(result);
 +			goto again;
@@ -155,14 +327,14 @@
 +		err = dentry->d_inode->i_op->follow_link(dentry, nd);
 +	if (!err && it != NULL && !(it->it_int_flags & IT_FL_FOLLOWED)) {
 +		/* vfs_follow_link was never called */
-+		intent_release(dentry, it);
++		intent_release(it);
 +		path_release(nd);
 +		err = -ENOLINK;
 +	}
  	current->link_count--;
  	return err;
  loop:
-+	intent_release(dentry, it);
++	intent_release(it);
  	path_release(nd);
  	return -ELOOP;
  }
@@ -186,7 +358,7 @@
 +			opc = it->it_op;
 +			mode = it->it_mode;
 +		}
-+		intent_release(*dentry, it);
++		intent_release(it);
 +		if (it) {
 +			it->it_op = opc;
 +			it->it_mode = mode;
@@ -260,7 +432,7 @@
  		}
  		err = -ENOTDIR; 
 -		if (!inode->i_op->lookup)
-+		if (!inode->i_op->lookup && !inode->i_op->lookup2)
++		if (!inode->i_op->lookup && !inode->i_op->lookup_it)
  			break;
  		continue;
  		/* here ends the main loop */
@@ -299,7 +471,7 @@
  			err = -ENOTDIR; 
 -			if (!inode->i_op || !inode->i_op->lookup)
 +			if (!inode->i_op ||
-+			    (!inode->i_op->lookup && !inode->i_op->lookup2))
++			    (!inode->i_op->lookup && !inode->i_op->lookup_it))
  				break;
  		}
  		goto return_base;
@@ -308,24 +480,24 @@
  		 */
  		dentry = nd->dentry;
 -		if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
-+        revalidate_again:
-+		if (dentry && dentry->d_op && dentry->d_op->d_revalidate2) {
++	revalidate_again:
++		if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
 +			err = -ESTALE;
-+			if (!dentry->d_op->d_revalidate2(dentry, 0, it)) {
-+                                struct dentry *new;
-+                                err = permission(dentry->d_parent->d_inode,
-+                                                 MAY_EXEC);
-+                                if (err)
-+                                        break;
-+                                new = real_lookup(dentry->d_parent,
-+                                                  &dentry->d_name, 0, NULL);
++			if (!dentry->d_op->d_revalidate_it(dentry, 0, it)) {
++				struct dentry *new;
++				err = permission(dentry->d_parent->d_inode,
++						 MAY_EXEC);
++				if (err)
++					break;
++				new = real_lookup(dentry->d_parent,
++						  &dentry->d_name, 0, NULL);
 +				d_invalidate(dentry);
-+                                dput(dentry);
-+                                dentry = new;
-+                                goto revalidate_again;
++				dput(dentry);
++				dentry = new;
++				goto revalidate_again;
 +			}
-+		} 
-+                else if (dentry && dentry->d_op && dentry->d_op->d_revalidate){
++		}
++		else if (dentry && dentry->d_op && dentry->d_op->d_revalidate){
  			err = -ESTALE;
  			if (!dentry->d_op->d_revalidate(dentry, 0)) {
  				d_invalidate(dentry);
@@ -334,7 +506,7 @@
  		break;
  	}
 +	if (err)
-+		intent_release(nd->dentry, it);
++		intent_release(it);
  	path_release(nd);
  return_err:
  	return err;
@@ -407,8 +579,8 @@
  		if (!new)
  			goto out;
  		lock_kernel();
-+		if (inode->i_op->lookup2)
-+			dentry = inode->i_op->lookup2(inode, new, it);
++		if (inode->i_op->lookup_it)
++			dentry = inode->i_op->lookup_it(inode, new, it, 0);
 +		else
  		dentry = inode->i_op->lookup(inode, new);
  		unlock_kernel();
@@ -459,14 +631,62 @@
  /*
   * It's inline, so penalty for filesystems that don't use sticky bit is
   * minimal.
-@@ -1045,14 +1168,17 @@ int may_open(struct nameidata *nd, int a
+@@ -969,6 +1092,37 @@ static inline int lookup_flags(unsigned 
+ 	return retval;
+ }
+ 
++static int vfs_create_it(struct inode *dir, struct dentry *dentry, int mode,
++			 struct lookup_intent *it)
++{
++	int error;
++
++	mode &= S_IALLUGO;
++	mode |= S_IFREG;
++
++	down(&dir->i_zombie);
++	error = may_create(dir, dentry);
++	if (error)
++		goto exit_lock;
++
++	error = -EACCES;	/* shouldn't it be ENOSYS? */
++	if (!dir->i_op || (!dir->i_op->create && !dir->i_op->create_it))
++		goto exit_lock;
++
++	DQUOT_INIT(dir);
++	lock_kernel();
++	if (dir->i_op->create_it)
++		error = dir->i_op->create_it(dir, dentry, mode, it);
++	else
++		error = dir->i_op->create(dir, dentry, mode);
++	unlock_kernel();
++exit_lock:
++	up(&dir->i_zombie);
++	if (!error)
++		inode_dir_notify(dir, DN_CREATE);
++	return error;
++}
++
+ int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
+ {
+ 	int error;
+@@ -987,7 +1141,7 @@ int vfs_create(struct inode *dir, struct
+ 
+ 	DQUOT_INIT(dir);
+ 	lock_kernel();
+-	error = dir->i_op->create(dir, dentry, mode);
++	error = dir->i_op->create(dir, dentry, mode);
+ 	unlock_kernel();
+ exit_lock:
+ 	up(&dir->i_zombie);
+@@ -1045,14 +1199,17 @@ int may_open(struct nameidata *nd, int a
          return get_lease(inode, flag);
  }
  
+-struct file *filp_open(const char * pathname, int open_flags, int mode)
 +extern struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt,
 +				   int flags, struct lookup_intent *it);
 +
- struct file *filp_open(const char * pathname, int open_flags, int mode)
++struct file *filp_open(const char * pathname, int open_flags, int mode)
  {
  	int acc_mode, error = 0;
 -	struct inode *inode;
@@ -478,7 +698,7 @@
  	int count = 0;
  	
  	if (!capable(CAP_SYS_ADMIN))
-@@ -1069,7 +1195,7 @@ struct file *filp_open(const char * path
+@@ -1069,7 +1226,7 @@ struct file *filp_open(const char * path
  	 * The simplest case - just a plain lookup.
  	 */
  	if (!(flag & O_CREAT)) {
@@ -487,7 +707,7 @@
  		if (error)
  			return ERR_PTR(error);
  		dentry = nd.dentry;
-@@ -1079,6 +1205,8 @@ struct file *filp_open(const char * path
+@@ -1079,6 +1236,8 @@ struct file *filp_open(const char * path
  	/*
  	 * Create - we need to know the parent.
  	 */
@@ -496,7 +716,7 @@
  	error = path_lookup(pathname, LOOKUP_PARENT, &nd);
  	if (error)
  		return ERR_PTR(error);
-@@ -1094,7 +1222,7 @@ struct file *filp_open(const char * path
+@@ -1094,7 +1253,7 @@ struct file *filp_open(const char * path
  
  	dir = nd.dentry;
  	down(&dir->d_inode->i_sem);
@@ -505,31 +725,36 @@
  
  do_last:
  	error = PTR_ERR(dentry);
-@@ -1103,6 +1231,7 @@ do_last:
+@@ -1103,10 +1262,11 @@ do_last:
  		goto exit;
  	}
  
 +	it.it_mode = mode;
  	/* Negative dentry, just create the file */
  	if (!dentry->d_inode) {
- 		error = vfs_create(dir->d_inode, dentry,
-@@ -1132,12 +1261,13 @@ do_last:
+-		error = vfs_create(dir->d_inode, dentry,
+-				   mode & ~current->fs->umask);
++		error = vfs_create_it(dir->d_inode, dentry,
++				   mode & ~current->fs->umask, &it);
+ 		up(&dir->d_inode->i_sem);
+ 		dput(nd.dentry);
+ 		nd.dentry = dentry;
+@@ -1132,12 +1292,12 @@ do_last:
  		error = -ELOOP;
  		if (flag & O_NOFOLLOW)
  			goto exit_dput;
 -		while (__follow_down(&nd.mnt,&dentry) && d_mountpoint(dentry));
-+		while (__follow_down(&nd.mnt,&dentry,&it) && d_mountpoint(dentry));
++		while (__follow_down(&nd.mnt,&dentry, &it) && d_mountpoint(dentry));
  	}
  	error = -ENOENT;
  	if (!dentry->d_inode)
  		goto exit_dput;
 -	if (dentry->d_inode->i_op && dentry->d_inode->i_op->follow_link)
-+	if (dentry->d_inode->i_op && (dentry->d_inode->i_op->follow_link ||
-+				      dentry->d_inode->i_op->follow_link2))
++	if (dentry->d_inode->i_op && (dentry->d_inode->i_op->follow_link))
  		goto do_link;
  
  	dput(nd.dentry);
-@@ -1152,11 +1282,13 @@ ok:
+@@ -1152,11 +1312,13 @@ ok:
  	if (!S_ISREG(nd.dentry->d_inode->i_mode))
  		open_flags &= ~O_TRUNC;
  
@@ -537,28 +762,25 @@
 +	return dentry_open_it(nd.dentry, nd.mnt, open_flags, &it);
  
  exit_dput:
-+	intent_release(dentry, &it);
++	intent_release(&it);
  	dput(dentry);
  exit:
-+	intent_release(nd.dentry, &it);
++	intent_release(&it);
  	path_release(&nd);
  	return ERR_PTR(error);
  
-@@ -1175,10 +1307,22 @@ do_link:
+@@ -1175,10 +1337,19 @@ do_link:
  	 * are done. Procfs-like symlinks just set LAST_BIND.
  	 */
  	UPDATE_ATIME(dentry->d_inode);
 -	error = dentry->d_inode->i_op->follow_link(dentry, &nd);
 +	nd.it = &it;
-+	if (dentry->d_inode->i_op->follow_link2)
-+		error = dentry->d_inode->i_op->follow_link2(dentry, &nd, &it);
-+	else
-+		error = dentry->d_inode->i_op->follow_link(dentry, &nd);
++	error = dentry->d_inode->i_op->follow_link(dentry, &nd);
 +	if (error) {
-+		intent_release(dentry, &it);
++		intent_release(&it);
 +	} else if (!(it.it_int_flags & IT_FL_FOLLOWED)) {
 +		/* vfs_follow_link was never called */
-+		intent_release(dentry, &it);
++		intent_release(&it);
 +		path_release(&nd);
 +		error = -ENOLINK;
 +	}
@@ -569,7 +791,7 @@
  	if (nd.last_type == LAST_BIND) {
  		dentry = nd.dentry;
  		goto ok;
-@@ -1197,13 +1341,15 @@ do_link:
+@@ -1197,13 +1368,15 @@ do_link:
  	}
  	dir = nd.dentry;
  	down(&dir->d_inode->i_sem);
@@ -587,7 +809,7 @@
  {
  	struct dentry *dentry;
  
-@@ -1211,7 +1357,7 @@ static struct dentry *lookup_create(stru
+@@ -1211,7 +1384,7 @@ static struct dentry *lookup_create(stru
  	dentry = ERR_PTR(-EEXIST);
  	if (nd->last_type != LAST_NORM)
  		goto fail;
@@ -596,18 +818,15 @@
  	if (IS_ERR(dentry))
  		goto fail;
  	if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
-@@ -1267,7 +1413,19 @@ asmlinkage long sys_mknod(const char * f
+@@ -1267,7 +1440,16 @@ asmlinkage long sys_mknod(const char * f
  	error = path_lookup(tmp, LOOKUP_PARENT, &nd);
  	if (error)
  		goto out;
 -	dentry = lookup_create(&nd, 0);
 +
-+	if (nd.dentry->d_inode->i_op->mknod2) {
++	if (nd.dentry->d_inode->i_op->mknod_raw) {
 +		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->mknod2(nd.dentry->d_inode,
-+				   nd.last.name,
-+				   nd.last.len,
-+				   mode, dev);
++		error = op->mknod_raw(&nd, mode, dev);
 +		/* the file system wants to use normal vfs path now */
 +		if (error != -EOPNOTSUPP)
 +			goto out2;
@@ -617,7 +836,7 @@
  	error = PTR_ERR(dentry);
  
  	mode &= ~current->fs->umask;
-@@ -1288,6 +1446,7 @@ asmlinkage long sys_mknod(const char * f
+@@ -1288,6 +1470,7 @@ asmlinkage long sys_mknod(const char * f
  		dput(dentry);
  	}
  	up(&nd.dentry->d_inode->i_sem);
@@ -625,26 +844,23 @@
  	path_release(&nd);
  out:
  	putname(tmp);
-@@ -1335,7 +1494,17 @@ asmlinkage long sys_mkdir(const char * p
+@@ -1335,7 +1518,14 @@ asmlinkage long sys_mkdir(const char * p
  		error = path_lookup(tmp, LOOKUP_PARENT, &nd);
  		if (error)
  			goto out;
 -		dentry = lookup_create(&nd, 1);
-+		if (nd.dentry->d_inode->i_op->mkdir2) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->mkdir2(nd.dentry->d_inode,
-+					   nd.last.name,
-+					   nd.last.len,
-+					   mode);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out2;
-+		}
++ 		if (nd.dentry->d_inode->i_op->mkdir_raw) {
++ 			struct inode_operations *op = nd.dentry->d_inode->i_op;
++ 			error = op->mkdir_raw(&nd, mode);
++ 			/* the file system wants to use normal vfs path now */
++ 			if (error != -EOPNOTSUPP)
++ 				goto out2;
++ 		}
 +		dentry = lookup_create(&nd, 1, NULL);
  		error = PTR_ERR(dentry);
  		if (!IS_ERR(dentry)) {
  			error = vfs_mkdir(nd.dentry->d_inode, dentry,
-@@ -1343,6 +1512,7 @@ asmlinkage long sys_mkdir(const char * p
+@@ -1343,6 +1533,7 @@ asmlinkage long sys_mkdir(const char * p
  			dput(dentry);
  		}
  		up(&nd.dentry->d_inode->i_sem);
@@ -652,71 +868,49 @@
  		path_release(&nd);
  out:
  		putname(tmp);
-@@ -1443,8 +1613,33 @@ asmlinkage long sys_rmdir(const char * p
+@@ -1443,8 +1634,16 @@ asmlinkage long sys_rmdir(const char * p
  			error = -EBUSY;
  			goto exit1;
  	}
-+	if (nd.dentry->d_inode->i_op->rmdir2) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		struct dentry *last;
-+
-+		down(&nd.dentry->d_inode->i_sem);
-+		last = lookup_hash_it(&nd.last, nd.dentry, NULL);
-+		up(&nd.dentry->d_inode->i_sem);
-+		if (IS_ERR(last)) {
-+			error = PTR_ERR(last);
-+			goto exit1;
-+		}
-+		if (d_mountpoint(last)) {
-+			dput(last);
-+			error = -EBUSY;
-+			goto exit1;
-+		}
-+		dput(last);
++ 	if (nd.dentry->d_inode->i_op->rmdir_raw) {
++ 		struct inode_operations *op = nd.dentry->d_inode->i_op;
 +
-+		error = op->rmdir2(nd.dentry->d_inode,
-+				   nd.last.name,
-+				   nd.last.len);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
++ 		error = op->rmdir_raw(&nd);
++ 		/* the file system wants to use normal vfs path now */
++ 		if (error != -EOPNOTSUPP)
++ 			goto exit1;
++ 	}
  	down(&nd.dentry->d_inode->i_sem);
 -	dentry = lookup_hash(&nd.last, nd.dentry);
 +	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
  	error = PTR_ERR(dentry);
  	if (!IS_ERR(dentry)) {
  		error = vfs_rmdir(nd.dentry->d_inode, dentry);
-@@ -1502,8 +1697,17 @@ asmlinkage long sys_unlink(const char * 
+@@ -1502,8 +1701,15 @@ asmlinkage long sys_unlink(const char * 
  	error = -EISDIR;
  	if (nd.last_type != LAST_NORM)
  		goto exit1;
-+	if (nd.dentry->d_inode->i_op->unlink2) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->unlink2(nd.dentry->d_inode,
-+				    nd.last.name,
-+				    nd.last.len);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
++ 	if (nd.dentry->d_inode->i_op->unlink_raw) {
++ 		struct inode_operations *op = nd.dentry->d_inode->i_op;
++ 		error = op->unlink_raw(&nd);
++ 		/* the file system wants to use normal vfs path now */
++ 		if (error != -EOPNOTSUPP)
++ 			goto exit1;
++ 	}
  	down(&nd.dentry->d_inode->i_sem);
 -	dentry = lookup_hash(&nd.last, nd.dentry);
 +	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
  	error = PTR_ERR(dentry);
  	if (!IS_ERR(dentry)) {
  		/* Why not before? Because we want correct error value */
-@@ -1570,15 +1774,26 @@ asmlinkage long sys_symlink(const char *
+@@ -1570,15 +1776,23 @@ asmlinkage long sys_symlink(const char *
  		error = path_lookup(to, LOOKUP_PARENT, &nd);
  		if (error)
  			goto out;
 -		dentry = lookup_create(&nd, 0);
-+		if (nd.dentry->d_inode->i_op->symlink2) {
++		if (nd.dentry->d_inode->i_op->symlink_raw) {
 +			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->symlink2(nd.dentry->d_inode,
-+					     nd.last.name,
-+					     nd.last.len,
-+					     from);
++			error = op->symlink_raw(&nd, from);
 +			/* the file system wants to use normal vfs path now */
 +			if (error != -EOPNOTSUPP)
 +				goto out2;
@@ -735,26 +929,14 @@
  		putname(to);
  	}
  	putname(from);
-@@ -1645,7 +1860,7 @@ asmlinkage long sys_link(const char * ol
- 		struct dentry *new_dentry;
- 		struct nameidata nd, old_nd;
- 
--		error = __user_walk(oldname, LOOKUP_POSITIVE, &old_nd);
-+		error = __user_walk_it(oldname, LOOKUP_POSITIVE, &old_nd, NULL);
- 		if (error)
- 			goto exit;
- 		error = path_lookup(to, LOOKUP_PARENT, &nd);
-@@ -1654,7 +1869,17 @@ asmlinkage long sys_link(const char * ol
+@@ -1654,7 +1868,14 @@ asmlinkage long sys_link(const char * ol
  		error = -EXDEV;
  		if (old_nd.mnt != nd.mnt)
  			goto out_release;
 -		new_dentry = lookup_create(&nd, 0);
-+		if (nd.dentry->d_inode->i_op->link2) {
++		if (nd.dentry->d_inode->i_op->link_raw) {
 +			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->link2(old_nd.dentry->d_inode,
-+					  nd.dentry->d_inode,
-+					  nd.last.name,
-+					  nd.last.len);
++			error = op->link_raw(&old_nd, &nd);
 +			/* the file system wants to use normal vfs path now */
 +			if (error != -EOPNOTSUPP)
 +				goto out_release;
@@ -763,62 +945,37 @@
  		error = PTR_ERR(new_dentry);
  		if (!IS_ERR(new_dentry)) {
  			error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);
-@@ -1698,7 +1923,8 @@ exit:
+@@ -1698,7 +1919,7 @@ exit:
   *	   locking].
   */
  int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
 -	       struct inode *new_dir, struct dentry *new_dentry)
-+		   struct inode *new_dir, struct dentry *new_dentry,
-+		   struct lookup_intent *it)
++		   struct inode *new_dir, struct dentry *new_dentry)
  {
  	int error;
  	struct inode *target;
-@@ -1756,6 +1982,7 @@ int vfs_rename_dir(struct inode *old_dir
- 		error = -EBUSY;
- 	else 
- 		error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry);
-+	intent_release(new_dentry, it);
- 	if (target) {
- 		if (!error)
- 			target->i_flags |= S_DEAD;
-@@ -1777,7 +2004,8 @@ out_unlock:
+@@ -1777,7 +1998,7 @@ out_unlock:
  }
  
  int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
 -	       struct inode *new_dir, struct dentry *new_dentry)
-+		     struct inode *new_dir, struct dentry *new_dentry,
-+		     struct lookup_intent *it)
++		     struct inode *new_dir, struct dentry *new_dentry)
  {
  	int error;
  
-@@ -1808,6 +2036,7 @@ int vfs_rename_other(struct inode *old_d
- 		error = -EBUSY;
- 	else
- 		error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry);
-+	intent_release(new_dentry, it);
- 	double_up(&old_dir->i_zombie, &new_dir->i_zombie);
- 	if (error)
- 		return error;
-@@ -1819,13 +2048,14 @@ int vfs_rename_other(struct inode *old_d
- }
- 
- int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+	       struct inode *new_dir, struct dentry *new_dentry,
-+	       struct lookup_intent *it)
- {
- 	int error;
- 	if (S_ISDIR(old_dentry->d_inode->i_mode))
--		error = vfs_rename_dir(old_dir,old_dentry,new_dir,new_dentry);
-+		error = vfs_rename_dir(old_dir,old_dentry,new_dir,new_dentry,it);
- 	else
--		error = vfs_rename_other(old_dir,old_dentry,new_dir,new_dentry);
-+		error = vfs_rename_other(old_dir,old_dentry,new_dir,new_dentry,it);
- 	if (!error) {
- 		if (old_dir == new_dir)
- 			inode_dir_notify(old_dir, DN_RENAME);
-@@ -1867,7 +2097,7 @@ static inline int do_rename(const char *
+@@ -1865,9 +2086,18 @@ static inline int do_rename(const char *
+ 	if (newnd.last_type != LAST_NORM)
+ 		goto exit2;
  
++ 	if (old_dir->d_inode->i_op->rename_raw) {
++		lock_kernel();
++ 		error = old_dir->d_inode->i_op->rename_raw(&oldnd, &newnd);
++		unlock_kernel();
++ 		/* the file system wants to use normal vfs path now */
++ 		if (error != -EOPNOTSUPP)
++ 			goto exit2;
++ 	}
++
  	double_lock(new_dir, old_dir);
  
 -	old_dentry = lookup_hash(&oldnd.last, old_dir);
@@ -826,7 +983,7 @@
  	error = PTR_ERR(old_dentry);
  	if (IS_ERR(old_dentry))
  		goto exit3;
-@@ -1883,16 +2113,37 @@ static inline int do_rename(const char *
+@@ -1883,16 +2113,16 @@ static inline int do_rename(const char *
  		if (newnd.last.name[newnd.last.len])
  			goto exit4;
  	}
@@ -836,38 +993,16 @@
  	if (IS_ERR(new_dentry))
  		goto exit4;
  
-+	if (old_dir->d_inode->i_op->rename2) {
-+		lock_kernel();
-+		/* don't rename mount point. mds will take care of
-+		 * the rest sanity checking */
-+		if (d_mountpoint(old_dentry)||d_mountpoint(new_dentry)) {
-+			error = -EBUSY;
-+			goto exit5;
-+		}
-+
-+		error = old_dir->d_inode->i_op->rename2(old_dir->d_inode,
-+							new_dir->d_inode,
-+							oldnd.last.name,
-+							oldnd.last.len,
-+							newnd.last.name,
-+							newnd.last.len);
-+		unlock_kernel();
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit5;
-+	}
 +
  	lock_kernel();
  	error = vfs_rename(old_dir->d_inode, old_dentry,
--				   new_dir->d_inode, new_dentry);
-+				   new_dir->d_inode, new_dentry, NULL);
+ 				   new_dir->d_inode, new_dentry);
  	unlock_kernel();
 -
-+exit5:
  	dput(new_dentry);
  exit4:
  	dput(old_dentry);
-@@ -1943,12 +2194,19 @@ out:
+@@ -1943,12 +2173,19 @@ out:
  }
  
  static inline int
@@ -888,7 +1023,7 @@
  
  	if (*link == '/') {
  		path_release(nd);
-@@ -1956,7 +2214,7 @@ __vfs_follow_link(struct nameidata *nd, 
+@@ -1956,7 +2193,7 @@ __vfs_follow_link(struct nameidata *nd, 
  			/* weird __emul_prefix() stuff did it */
  			goto out;
  	}
@@ -897,7 +1032,7 @@
  out:
  	if (current->link_count || res || nd->last_type!=LAST_NORM)
  		return res;
-@@ -1978,7 +2236,13 @@ fail:
+@@ -1978,7 +2215,13 @@ fail:
  
  int vfs_follow_link(struct nameidata *nd, const char *link)
  {
@@ -912,7 +1047,7 @@
  }
  
  /* get the link contents into pagecache */
-@@ -2020,7 +2284,7 @@ int page_follow_link(struct dentry *dent
+@@ -2020,7 +2263,7 @@ int page_follow_link(struct dentry *dent
  {
  	struct page *page = NULL;
  	char *s = page_getlink(dentry, &page);
@@ -921,19 +1056,8 @@
  	if (page) {
  		kunmap(page);
  		page_cache_release(page);
---- linux-2.4.18-61chaos/fs/nfsd/vfs.c~vfs_intent-2.4.18-18	Sun Jun  1 21:55:14 2003
-+++ linux-2.4.18-61chaos-root/fs/nfsd/vfs.c	Sun Jun  1 21:59:04 2003
-@@ -1298,7 +1298,7 @@ nfsd_rename(struct svc_rqst *rqstp, stru
- 			err = nfserr_perm;
- 	} else
- #endif
--	err = vfs_rename(fdir, odentry, tdir, ndentry);
-+	err = vfs_rename(fdir, odentry, tdir, ndentry, NULL);
- 	unlock_kernel();
- 	if (!err && EX_ISSYNC(tfhp->fh_export)) {
- 		nfsd_sync_dir(tdentry);
---- linux-2.4.18-61chaos/fs/open.c~vfs_intent-2.4.18-18	Sun Jun  1 21:55:14 2003
-+++ linux-2.4.18-61chaos-root/fs/open.c	Sun Jun  1 21:59:04 2003
+--- linux-2.4.18-p4smp/fs/open.c~vfs_intent-2.4.18-18-chaos65	2003-07-09 12:17:30.000000000 -0600
++++ linux-2.4.18-p4smp-braam/fs/open.c	2003-07-09 13:20:37.000000000 -0600
 @@ -19,6 +19,8 @@
  #include <asm/uaccess.h>
  
@@ -955,7 +1079,7 @@
  	int error;
  	struct iattr newattrs;
  
-@@ -108,7 +111,14 @@ int do_truncate(struct dentry *dentry, l
+@@ -108,7 +111,13 @@ int do_truncate(struct dentry *dentry, l
  	down(&inode->i_sem);
  	newattrs.ia_size = length;
  	newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
@@ -964,9 +1088,8 @@
 +		newattrs.ia_valid |= ATTR_FROM_OPEN;
 +	if (op->setattr_raw) {
 +		newattrs.ia_valid |= ATTR_RAW;
-+		newattrs.ia_ctime = CURRENT_TIME;
 +		error = op->setattr_raw(inode, &newattrs);
-+	} else 
++	} else
 +		error = notify_change(dentry, &newattrs);
  	up(&inode->i_sem);
  	return error;
@@ -991,13 +1114,13 @@
  	if (!error) {
  		DQUOT_INIT(inode);
 -		error = do_truncate(nd.dentry, length);
-+		intent_release(nd.dentry, &it);
++		intent_release(&it);
 +		error = do_truncate(nd.dentry, length, 0);
  	}
  	put_write_access(inode);
  
  dput_and_out:
-+	intent_release(nd.dentry, &it);
++	intent_release(&it);
  	path_release(&nd);
  out:
  	return error;
@@ -1025,7 +1148,7 @@
  	error = -EROFS;
  	if (IS_RDONLY(inode))
  		goto dput_and_out;
-@@ -279,11 +294,29 @@ asmlinkage long sys_utime(char * filenam
+@@ -279,11 +294,25 @@ asmlinkage long sys_utime(char * filenam
  			goto dput_and_out;
  
  		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
@@ -1042,10 +1165,6 @@
 +			goto dput_and_out;
 +	}
 +
-+	error = -EROFS;
-+	if (IS_RDONLY(inode))
-+		goto dput_and_out;
-+
 +	error = -EPERM;
 +	if (!times) {
  		if (current->fsuid != inode->i_uid &&
@@ -1114,7 +1233,7 @@
  		if(!res && (mode & S_IWOTH) && IS_RDONLY(nd.dentry->d_inode)
  		   && !special_file(nd.dentry->d_inode->i_mode))
  			res = -EROFS;
-+		intent_release(nd.dentry, &it);
++		intent_release(&it);
  		path_release(&nd);
  	}
  
@@ -1135,7 +1254,7 @@
  	set_fs_pwd(current->fs, nd.mnt, nd.dentry);
  
  dput_and_out:
-+	intent_release(nd.dentry, &it);
++	intent_release(&it);
  	path_release(&nd);
  out:
  	return error;
@@ -1156,7 +1275,7 @@
  	set_fs_altroot();
  	error = 0;
  dput_and_out:
-+	intent_release(nd.dentry, &it);
++	intent_release(&it);
  	path_release(&nd);
  out:
  	return error;
@@ -1189,7 +1308,7 @@
 +
 +		newattrs.ia_uid = user;
 +		newattrs.ia_gid = group;
-+		newattrs.ia_valid = ATTR_UID | ATTR_GID;
++		newattrs.ia_valid = ATTR_UID | ATTR_GID | ATTR_CTIME;
 +		newattrs.ia_valid |= ATTR_RAW;
 +		error = op->setattr_raw(inode, &newattrs);
 +		/* the file system wants to use normal vfs path now */
@@ -1219,19 +1338,29 @@
  		}
  		if (error || !(f->f_mode & FMODE_WRITE))
  			put_write_access(inode);
-@@ -693,6 +776,7 @@ struct file *dentry_open(struct dentry *
+@@ -679,7 +762,9 @@ struct file *dentry_open(struct dentry *
+ 	}
+ 
+ 	if (f->f_op && f->f_op->open) {
++		f->f_it = it;
+ 		error = f->f_op->open(inode,f);
++		f->f_it = NULL;
+ 		if (error)
+ 			goto cleanup_all;
+ 	}
+@@ -693,6 +778,7 @@ struct file *dentry_open(struct dentry *
  		do_readahead(f, 0, (48 * 1024) >> PAGE_SHIFT);
  	
  
-+	intent_release(dentry, it);
++	intent_release(it);
  	return f;
  
  cleanup_all:
-@@ -707,11 +791,17 @@ cleanup_all:
+@@ -707,11 +793,17 @@ cleanup_all:
  cleanup_file:
  	put_filp(f);
  cleanup_dentry:
-+	intent_release(dentry, it);
++	intent_release(it);
  	dput(dentry);
  	mntput(mnt);
  	return ERR_PTR(error);
@@ -1245,9 +1374,38 @@
  /*
   * Find an empty file descriptor entry, and mark it busy.
   */
---- linux-2.4.18-61chaos/fs/stat.c~vfs_intent-2.4.18-18	Sun Jun  1 21:55:14 2003
-+++ linux-2.4.18-61chaos-root/fs/stat.c	Sun Jun  1 21:59:04 2003
-@@ -104,10 +104,12 @@ int vfs_stat(char *name, struct kstat *s
+--- linux-2.4.18-p4smp/fs/stat.c~vfs_intent-2.4.18-18-chaos65	2003-07-09 12:17:30.000000000 -0600
++++ linux-2.4.18-p4smp-braam/fs/stat.c	2003-07-09 13:20:37.000000000 -0600
+@@ -17,21 +17,24 @@
+  * Revalidate the inode. This is required for proper NFS attribute caching.
+  */
+ static __inline__ int
+-do_revalidate(struct dentry *dentry)
++do_revalidate(struct dentry *dentry, struct lookup_intent *it)
+ {
+ 	struct inode * inode = dentry->d_inode;
+-	if (inode->i_op && inode->i_op->revalidate)
++	if (inode->i_op && inode->i_op->revalidate_it)
++		return inode->i_op->revalidate_it(dentry, it);
++	else if (inode->i_op && inode->i_op->revalidate)
+ 		return inode->i_op->revalidate(dentry);
+ 	return 0;
+ }
+ 
+-static int do_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
++static int do_getattr(struct vfsmount *mnt, struct dentry *dentry,
++		      struct kstat *stat, struct lookup_intent *it)
+ {
+ 	int res = 0;
+ 	unsigned int blocks, indirect;
+ 	struct inode *inode = dentry->d_inode;
+ 
+-	res = do_revalidate(dentry);
++	res = do_revalidate(dentry, it);
+ 	if (res)
+ 		return res;
+ 
+@@ -104,10 +107,12 @@ int vfs_stat(char *name, struct kstat *s
  {
  	struct nameidata nd;
  	int error;
@@ -1256,12 +1414,13 @@
 -	error = user_path_walk(name, &nd);
 +	error = user_path_walk_it(name, &nd, &it);
  	if (!error) {
- 		error = do_getattr(nd.mnt, nd.dentry, stat);
-+		intent_release(nd.dentry, &it);
+-		error = do_getattr(nd.mnt, nd.dentry, stat);
++		error = do_getattr(nd.mnt, nd.dentry, stat, &it);
++		intent_release(&it);
  		path_release(&nd);
  	}
  	return error;
-@@ -117,10 +119,12 @@ int vfs_lstat(char *name, struct kstat *
+@@ -117,10 +122,12 @@ int vfs_lstat(char *name, struct kstat *
  {
  	struct nameidata nd;
  	int error;
@@ -1270,100 +1429,69 @@
 -	error = user_path_walk_link(name, &nd);
 +	error = user_path_walk_link_it(name, &nd, &it);
  	if (!error) {
- 		error = do_getattr(nd.mnt, nd.dentry, stat);
-+		intent_release(nd.dentry, &it);
+-		error = do_getattr(nd.mnt, nd.dentry, stat);
++		error = do_getattr(nd.mnt, nd.dentry, stat, &it);
++		intent_release(&it);
  		path_release(&nd);
  	}
  	return error;
---- linux-2.4.18-61chaos/fs/exec.c~vfs_intent-2.4.18-18	Sun Jun  1 21:55:14 2003
-+++ linux-2.4.18-61chaos-root/fs/exec.c	Sun Jun  1 21:59:04 2003
-@@ -112,13 +112,18 @@ static inline void put_binfmt(struct lin
-  *
-  * Also note that we take the address to load from from the file itself.
-  */
-+extern struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt,
-+			    int flags, struct lookup_intent *it);
-+int path_lookup_it(const char *path, unsigned flags, struct nameidata *nd,
-+		   struct lookup_intent *it);
- asmlinkage long sys_uselib(const char * library)
- {
- 	struct file * file;
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_OPEN, .it_flags = O_RDONLY };
- 
--	error = user_path_walk(library, &nd);
-+	error = user_path_walk_it(library, &nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -130,7 +135,8 @@ asmlinkage long sys_uselib(const char * 
- 	if (error)
- 		goto exit;
- 
--	file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-+	file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
-+	intent_release(nd.dentry, &it);
- 	error = PTR_ERR(file);
- 	if (IS_ERR(file))
- 		goto out;
-@@ -359,8 +365,9 @@ struct file *open_exec(const char *name)
- 	struct inode *inode;
- 	struct file *file;
- 	int err = 0;
-+	struct lookup_intent it = { .it_op = IT_OPEN, .it_flags = O_RDONLY };
+@@ -132,7 +139,7 @@ int vfs_fstat(unsigned int fd, struct ks
+ 	int error = -EBADF;
  
--	err = path_lookup(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
-+	err = path_lookup_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
- 	file = ERR_PTR(err);
- 	if (!err) {
- 		inode = nd.dentry->d_inode;
-@@ -372,8 +379,9 @@ struct file *open_exec(const char *name)
- 				err = -EACCES;
- 			file = ERR_PTR(err);
- 			if (!err) {
--				file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-+				file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
- 				if (!IS_ERR(file)) {
-+                                        intent_release(nd.dentry, &it);
- 					err = deny_write_access(file);
- 					if (err) {
- 						fput(file);
-@@ -384,6 +392,7 @@ out:
- 				return file;
- 			}
- 		}
-+                intent_release(nd.dentry, &it);
- 		path_release(&nd);
+ 	if (f) {
+-		error = do_getattr(f->f_vfsmnt, f->f_dentry, stat);
++		error = do_getattr(f->f_vfsmnt, f->f_dentry, stat, NULL);
+ 		fput(f);
  	}
- 	goto out;
-@@ -1104,7 +1113,7 @@ int do_coredump(long signr, struct pt_re
- 		goto close_fail;
- 	if (!file->f_op->write)
- 		goto close_fail;
--	if (do_truncate(file->f_dentry, 0) != 0)
-+	if (do_truncate(file->f_dentry, 0, 0) != 0)
- 		goto close_fail;
+ 	return error;
+@@ -279,7 +286,7 @@ asmlinkage long sys_readlink(const char 
+ 
+ 		error = -EINVAL;
+ 		if (inode->i_op && inode->i_op->readlink &&
+-		    !(error = do_revalidate(nd.dentry))) {
++		    !(error = do_revalidate(nd.dentry, NULL))) {
+ 			UPDATE_ATIME(inode);
+ 			error = inode->i_op->readlink(nd.dentry, buf, bufsiz);
+ 		}
+--- linux-2.4.18-p4smp/fs/proc/base.c~vfs_intent-2.4.18-18-chaos65	2003-07-09 12:20:46.000000000 -0600
++++ linux-2.4.18-p4smp-braam/fs/proc/base.c	2003-07-09 13:20:37.000000000 -0600
+@@ -465,6 +465,9 @@ static int proc_pid_follow_link(struct d
  
- 	retval = binfmt->core_dump(signr, regs, file);
---- linux-2.4.18-61chaos/include/linux/dcache.h~vfs_intent-2.4.18-18	Sun Jun  1 21:55:14 2003
-+++ linux-2.4.18-61chaos-root/include/linux/dcache.h	Sun Jun  1 22:02:31 2003
-@@ -6,6 +6,28 @@
+ 	error = inode->u.proc_i.op.proc_get_link(inode, &nd->dentry, &nd->mnt);
+ 	nd->last_type = LAST_BIND;
++
++	if (nd->it != NULL)
++		nd->it->it_int_flags |= IT_FL_FOLLOWED;
+ out:
+ 	return error;
+ }
+--- linux-2.4.18-p4smp/include/linux/dcache.h~vfs_intent-2.4.18-18-chaos65	2003-07-09 13:15:23.000000000 -0600
++++ linux-2.4.18-p4smp-braam/include/linux/dcache.h	2003-07-09 13:32:08.000000000 -0600
+@@ -6,6 +6,45 @@
  #include <asm/atomic.h>
+ #include <linux/gdb.h>
  #include <linux/mount.h>
- 
-+#define IT_OPEN     (1)
-+#define IT_CREAT    (1<<1)
-+#define IT_READDIR  (1<<2)
-+#define IT_GETATTR  (1<<3)
-+#define IT_LOOKUP   (1<<4)
-+#define IT_UNLINK   (1<<5)
++#include <linux/string.h>
 +
-+#define IT_FL_LOCKED   (1)
-+#define IT_FL_FOLLOWED (1<<1) /* set by vfs_follow_link */
++#define IT_OPEN     0x0001
++#define IT_CREAT    0x0002
++#define IT_READDIR  0x0004
++#define IT_GETATTR  0x0008
++#define IT_LOOKUP   0x0010
++#define IT_UNLINK   0x0020
++#define IT_GETXATTR 0x0040
++#define IT_EXEC     0x0080
++#define IT_PIN      0x0100
++
++#define IT_FL_LOCKED   0x0001
++#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */
++
++#define INTENT_MAGIC 0x19620323
 +
 +struct lookup_intent {
 +	int it_op;
++	void (*it_op_release)(struct lookup_intent *);
++	int it_magic;
 +	int it_mode;
 +	int it_flags;
 +	int it_disposition;
@@ -1374,34 +1502,41 @@
 +	void *it_data;
 +};
 +
++static inline void intent_init(struct lookup_intent *it, int op, int flags)
++{
++	memset(it, 0, sizeof(*it));
++	it->it_magic = INTENT_MAGIC;
++	it->it_op = op;
++	it->it_flags = flags;
++}
++
+ 
  /*
   * linux/include/linux/dcache.h
-  *
-@@ -78,6 +100,7 @@ struct dentry {
- 	unsigned long d_time;		/* used by d_revalidate */
- 	struct dentry_operations  *d_op;
- 	struct super_block * d_sb;	/* The root of the dentry tree */
-+	struct lookup_intent *d_it;
- 	unsigned long d_vfs_flags;
- 	void * d_fsdata;		/* fs-specific data */
- 	void * d_extra_attributes;	/* TUX-specific data */
-@@ -91,8 +114,15 @@ struct dentry_operations {
+@@ -92,8 +131,22 @@ struct dentry_operations {
  	int (*d_delete)(struct dentry *);
  	void (*d_release)(struct dentry *);
  	void (*d_iput)(struct dentry *, struct inode *);
-+	int (*d_revalidate2)(struct dentry *, int, struct lookup_intent *);
-+	void (*d_intent_release)(struct dentry *, struct lookup_intent *);
++	int (*d_revalidate_it)(struct dentry *, int, struct lookup_intent *);
++	void (*d_pin)(struct dentry *, struct vfsmount * , int);
++	void (*d_unpin)(struct dentry *, struct vfsmount *, int);
  };
  
++#define PIN(de,mnt,flag)  if (de->d_op && de->d_op->d_pin) \
++				de->d_op->d_pin(de, mnt, flag);
++#define UNPIN(de,mnt,flag)  if (de->d_op && de->d_op->d_unpin) \
++				de->d_op->d_unpin(de, mnt, flag);
++
++
 +/* defined in fs/namei.c */
-+extern void intent_release(struct dentry *de, struct lookup_intent *it);
++extern void intent_release(struct lookup_intent *it);
 +/* defined in fs/dcache.c */
 +extern void __d_rehash(struct dentry * entry, int lock);
 +
  /* the dentry parameter passed to d_hash and d_compare is the parent
   * directory of the entries to be compared. It is used in case these
   * functions need any directory specific information for determining
-@@ -124,6 +154,7 @@ d_iput:		no		no		yes
+@@ -125,6 +178,7 @@ d_iput:		no		no		yes
  					 * s_nfsd_free_path semaphore will be down
  					 */
  #define DCACHE_REFERENCED	0x0008  /* Recently used, don't discard. */
@@ -1409,14 +1544,15 @@
  
  extern spinlock_t dcache_lock;
  
---- linux-2.4.18-61chaos/include/linux/fs.h~vfs_intent-2.4.18-18	Sun Jun  1 21:59:03 2003
-+++ linux-2.4.18-61chaos-root/include/linux/fs.h	Sun Jun  1 22:01:46 2003
-@@ -339,6 +339,8 @@ extern void set_bh_page(struct buffer_he
+--- linux-2.4.18-p4smp/include/linux/fs.h~vfs_intent-2.4.18-18-chaos65	2003-07-08 14:41:47.000000000 -0600
++++ linux-2.4.18-p4smp-braam/include/linux/fs.h	2003-07-08 14:45:17.000000000 -0600
+@@ -339,6 +339,9 @@ extern void set_bh_page(struct buffer_he
  #define ATTR_MTIME_SET	256
  #define ATTR_FORCE	512	/* Not a change, but a change it */
  #define ATTR_ATTR_FLAG	1024
-+#define ATTR_RAW	2048	/* file system, not vfs will massage attrs */
-+#define ATTR_FROM_OPEN	4096	/* called from open path, ie O_TRUNC */
++#define ATTR_RAW	0x0800	/* file system, not vfs will massage attrs */
++#define ATTR_FROM_OPEN	0x1000	/* called from open path, ie O_TRUNC */
++#define ATTR_CTIME_SET	0x2000	/* called from open path, ie O_TRUNC */
  
  /*
   * This is the Inode Attributes structure, used for notify_change().  It
@@ -1424,7 +1560,7 @@
  
  	/* needed for tty driver, and maybe others */
  	void			*private_data;
-+	struct lookup_intent    *f_intent;
++	struct lookup_intent    *f_it;
  
  	/* preallocated helper kiobuf to speedup O_DIRECT */
  	struct kiobuf		*f_iobuf;
@@ -1436,39 +1572,38 @@
  };
  
  #define DQUOT_USR_ENABLED	0x01		/* User diskquotas enabled */
-@@ -840,7 +844,9 @@ extern int vfs_symlink(struct inode *, s
+@@ -840,7 +844,8 @@ extern int vfs_symlink(struct inode *, s
  extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
  extern int vfs_rmdir(struct inode *, struct dentry *);
  extern int vfs_unlink(struct inode *, struct dentry *);
 -extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
 +int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
-+		struct inode *new_dir, struct dentry *new_dentry,
-+		struct lookup_intent *it);
++	       struct inode *new_dir, struct dentry *new_dentry);
  
  /*
   * File types
-@@ -901,20 +907,33 @@ struct file_operations {
+@@ -900,21 +905,34 @@ struct file_operations {
+ 
  struct inode_operations {
  	int (*create) (struct inode *,struct dentry *,int);
++	int (*create_it) (struct inode *,struct dentry *,int, struct lookup_intent *);
  	struct dentry * (*lookup) (struct inode *,struct dentry *);
-+	struct dentry * (*lookup2) (struct inode *,struct dentry *, struct lookup_intent *);
++	struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct lookup_intent *, int flags);
  	int (*link) (struct dentry *,struct inode *,struct dentry *);
-+	int (*link2) (struct inode *,struct inode *, const char *, int);
++	int (*link_raw) (struct nameidata *,struct nameidata *);
  	int (*unlink) (struct inode *,struct dentry *);
-+	int (*unlink2) (struct inode *, const char *, int);
++	int (*unlink_raw) (struct nameidata *);
  	int (*symlink) (struct inode *,struct dentry *,const char *);
-+	int (*symlink2) (struct inode *, const char *, int, const char *);
++	int (*symlink_raw) (struct nameidata *,const char *);
  	int (*mkdir) (struct inode *,struct dentry *,int);
-+	int (*mkdir2) (struct inode *, const char *, int,int);
++	int (*mkdir_raw) (struct nameidata *,int);
  	int (*rmdir) (struct inode *,struct dentry *);
-+	int (*rmdir2) (struct inode *, const char *, int);
++	int (*rmdir_raw) (struct nameidata *);
  	int (*mknod) (struct inode *,struct dentry *,int,int);
-+	int (*mknod2) (struct inode *, const char *, int,int,int);
++	int (*mknod_raw) (struct nameidata *,int,dev_t);
  	int (*rename) (struct inode *, struct dentry *,
  			struct inode *, struct dentry *);
-+	int (*rename2) (struct inode *, struct inode *,
-+			const char *oldname, int oldlen,
-+			const char *newname, int newlen);
++	int (*rename_raw) (struct nameidata *, struct nameidata *);
  	int (*readlink) (struct dentry *, char *,int);
  	int (*follow_link) (struct dentry *, struct nameidata *);
 +	int (*follow_link2) (struct dentry *, struct nameidata *,
@@ -1476,12 +1611,13 @@
  	void (*truncate) (struct inode *);
  	int (*permission) (struct inode *, int);
  	int (*revalidate) (struct dentry *);
++	int (*revalidate_it) (struct dentry *, struct lookup_intent *);
  	int (*setattr) (struct dentry *, struct iattr *);
-+	int (*setattr_raw) (struct inode *, struct iattr *);
++ 	int (*setattr_raw) (struct inode *, struct iattr *);
  	int (*getattr) (struct dentry *, struct iattr *);
  };
  
-@@ -1119,7 +1138,7 @@ static inline int get_lease(struct inode
+@@ -1119,10 +1137,12 @@ static inline int get_lease(struct inode
  
  asmlinkage long sys_open(const char *, int, int);
  asmlinkage long sys_close(unsigned int);	/* yes, it's really unsigned */
@@ -1490,7 +1626,12 @@
  
  extern struct file *filp_open(const char *, int, int);
  extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
-@@ -1388,6 +1407,7 @@ typedef int (*read_actor_t)(read_descrip
++extern struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt,
++			    int flags, struct lookup_intent *it);
+ extern int filp_close(struct file *, fl_owner_t id);
+ extern char * getname(const char *);
+ 
+@@ -1388,9 +1408,12 @@ typedef int (*read_actor_t)(read_descrip
  extern loff_t default_llseek(struct file *file, loff_t offset, int origin);
  
  extern int FASTCALL(__user_walk(const char *, unsigned, struct nameidata *));
@@ -1498,7 +1639,12 @@
  extern int FASTCALL(path_init(const char *, unsigned, struct nameidata *));
  extern int FASTCALL(path_walk(const char *, struct nameidata *));
  extern int FASTCALL(path_lookup(const char *, unsigned, struct nameidata *));
-@@ -1399,6 +1419,8 @@ extern struct dentry * lookup_one_len(co
++extern int FASTCALL(path_lookup_it(const char *path, unsigned flags, struct nameidata *nd,
++		   struct lookup_intent *it));
+ extern int FASTCALL(link_path_walk(const char *, struct nameidata *));
+ extern void path_release(struct nameidata *);
+ extern int follow_down(struct vfsmount **, struct dentry **);
+@@ -1399,6 +1422,8 @@ extern struct dentry * lookup_one_len(co
  extern struct dentry * lookup_hash(struct qstr *, struct dentry *);
  #define user_path_walk(name,nd)	 __user_walk(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd)
  #define user_path_walk_link(name,nd) __user_walk(name, LOOKUP_POSITIVE, nd)
@@ -1507,7 +1653,7 @@
  
  extern void inode_init_once(struct inode *);
  extern void iput(struct inode *);
-@@ -1499,6 +1521,8 @@ extern struct file_operations generic_ro
+@@ -1499,6 +1524,8 @@ extern struct file_operations generic_ro
  
  extern int vfs_readlink(struct dentry *, char *, int, const char *);
  extern int vfs_follow_link(struct nameidata *, const char *);
@@ -1516,8 +1662,41 @@
  extern int page_readlink(struct dentry *, char *, int);
  extern int page_follow_link(struct dentry *, struct nameidata *);
  extern struct inode_operations page_symlink_inode_operations;
---- linux-2.4.18-61chaos/kernel/ksyms.c~vfs_intent-2.4.18-18	Sun Jun  1 21:59:03 2003
-+++ linux-2.4.18-61chaos-root/kernel/ksyms.c	Sun Jun  1 21:59:04 2003
+--- linux-2.4.18-p4smp/kernel/fork.c~vfs_intent-2.4.18-18-chaos65	2003-03-24 11:22:37.000000000 -0700
++++ linux-2.4.18-p4smp-braam/kernel/fork.c	2003-07-09 13:20:37.000000000 -0600
+@@ -399,10 +399,13 @@ static inline struct fs_struct *__copy_f
+ 		fs->umask = old->umask;
+ 		read_lock(&old->lock);
+ 		fs->rootmnt = mntget(old->rootmnt);
++		PIN(old->pwd, old->pwdmnt, 0);
++		PIN(old->root, old->rootmnt, 1);
+ 		fs->root = dget(old->root);
+ 		fs->pwdmnt = mntget(old->pwdmnt);
+ 		fs->pwd = dget(old->pwd);
+ 		if (old->altroot) {
++			PIN(old->altroot, old->altrootmnt, 1);
+ 			fs->altrootmnt = mntget(old->altrootmnt);
+ 			fs->altroot = dget(old->altroot);
+ 		} else {
+--- linux-2.4.18-p4smp/kernel/exit.c~vfs_intent-2.4.18-18-chaos65	2002-10-29 12:27:38.000000000 -0700
++++ linux-2.4.18-p4smp-braam/kernel/exit.c	2003-07-09 13:20:37.000000000 -0600
+@@ -303,11 +303,14 @@ static inline void __put_fs_struct(struc
+ {
+ 	/* No need to hold fs->lock if we are killing it */
+ 	if (atomic_dec_and_test(&fs->count)) {
++		UNPIN(fs->pwd, fs->pwdmnt, 0);
++		UNPIN(fs->root, fs->rootmnt, 1);
+ 		dput(fs->root);
+ 		mntput(fs->rootmnt);
+ 		dput(fs->pwd);
+ 		mntput(fs->pwdmnt);
+ 		if (fs->altroot) {
++			UNPIN(fs->altroot, fs->altrootmnt, 1);
+ 			dput(fs->altroot);
+ 			mntput(fs->altrootmnt);
+ 		}
+--- linux-2.4.18-p4smp/kernel/ksyms.c~vfs_intent-2.4.18-18-chaos65	2003-07-09 13:20:35.000000000 -0600
++++ linux-2.4.18-p4smp-braam/kernel/ksyms.c	2003-07-09 13:20:37.000000000 -0600
 @@ -294,6 +294,7 @@ EXPORT_SYMBOL(read_cache_page);
  EXPORT_SYMBOL(set_page_dirty);
  EXPORT_SYMBOL(vfs_readlink);
@@ -1528,15 +1707,3 @@
  EXPORT_SYMBOL(page_symlink_inode_operations);
 
 _
---- linux/fs/proc/base.c.old	Sat Jun  7 00:55:09 2003
-+++ linux/fs/proc/base.c	Sat Jun  7 00:55:33 2003
-@@ -465,6 +465,9 @@
- 
- 	error = inode->u.proc_i.op.proc_get_link(inode, &nd->dentry, &nd->mnt);
- 	nd->last_type = LAST_BIND;
-+
-+        if (nd->it != NULL)
-+                nd->it->it_int_flags |= IT_FL_FOLLOWED;
- out:
- 	return error;
- }
diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.20-hp.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.20-hp.patch
new file mode 100644
index 0000000000..55046eab32
--- /dev/null
+++ b/lustre/kernel_patches/patches/vfs_intent-2.4.20-hp.patch
@@ -0,0 +1,1793 @@
+ fs/dcache.c               |   19 ++
+ fs/exec.c                 |   15 +-
+ fs/namei.c                |  321 ++++++++++++++++++++++++++++++++++++++--------
+ fs/namespace.c            |   28 +++-
+ fs/open.c                 |  123 +++++++++++++++--
+ fs/proc/base.c            |    3 
+ fs/stat.c                 |   50 ++++---
+ include/linux/dcache.h    |   54 +++++++
+ include/linux/fs.h        |   30 ++++
+ include/linux/fs_struct.h |    4 
+ kernel/exit.c             |    3 
+ kernel/fork.c             |    3 
+ kernel/ksyms.c            |    1 
+ 13 files changed, 552 insertions(+), 102 deletions(-)
+
+--- linux/fs/exec.c~vfs_intent-2.4.20-hp	Sat Jul 12 14:04:49 2003
++++ linux-mmonroe/fs/exec.c	Sat Jul 12 14:05:24 2003
+@@ -116,8 +116,9 @@ asmlinkage long sys_uselib(const char * 
+ 	struct file * file;
+ 	struct nameidata nd;
+ 	int error;
++	struct lookup_intent it = { .it_op = IT_OPEN, .it_flags = O_RDONLY };
+ 
+-	error = user_path_walk(library, &nd);
++	error = user_path_walk_it(library, &nd, &it);
+ 	if (error)
+ 		goto out;
+ 
+@@ -129,7 +130,8 @@ asmlinkage long sys_uselib(const char * 
+ 	if (error)
+ 		goto exit;
+ 
+-	file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
++	file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
++	intent_release(&it);
+ 	error = PTR_ERR(file);
+ 	if (IS_ERR(file))
+ 		goto out;
+@@ -372,8 +374,9 @@ struct file *open_exec(const char *name)
+ 	struct inode *inode;
+ 	struct file *file;
+ 	int err = 0;
++	struct lookup_intent it = { .it_op = IT_OPEN, .it_flags = O_RDONLY };
+ 
+-	err = path_lookup(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
++	err = path_lookup_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
+ 	file = ERR_PTR(err);
+ 	if (!err) {
+ 		inode = nd.dentry->d_inode;
+@@ -385,7 +388,8 @@ struct file *open_exec(const char *name)
+ 				err = -EACCES;
+ 			file = ERR_PTR(err);
+ 			if (!err) {
+-				file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
++				file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
++				intent_release(&it);
+ 				if (!IS_ERR(file)) {
+ 					err = deny_write_access(file);
+ 					if (err) {
+@@ -397,6 +401,7 @@ out:
+ 				return file;
+ 			}
+ 		}
++		intent_release(&it);
+ 		path_release(&nd);
+ 	}
+ 	goto out;
+@@ -1128,7 +1133,7 @@ int do_coredump(long signr, struct pt_re
+ 		goto close_fail;
+ 	if (!file->f_op->write)
+ 		goto close_fail;
+-	if (do_truncate(file->f_dentry, 0) != 0)
++	if (do_truncate(file->f_dentry, 0, 0) != 0)
+ 		goto close_fail;
+ 
+ 	retval = binfmt->core_dump(signr, regs, file);
+--- linux/fs/dcache.c~vfs_intent-2.4.20-hp	Thu Nov 28 15:53:15 2002
++++ linux-mmonroe/fs/dcache.c	Sat Jul 12 14:05:24 2003
+@@ -181,6 +181,13 @@ int d_invalidate(struct dentry * dentry)
+ 		spin_unlock(&dcache_lock);
+ 		return 0;
+ 	}
++
++	/* network invalidation by Lustre */
++	if (dentry->d_flags & DCACHE_LUSTRE_INVALID) {
++		spin_unlock(&dcache_lock);
++		return 0;
++	}
++
+ 	/*
+ 	 * Check whether to do a partial shrink_dcache
+ 	 * to get rid of unused child entries.
+@@ -830,13 +837,19 @@ void d_delete(struct dentry * dentry)
+  * Adds a dentry to the hash according to its name.
+  */
+  
+-void d_rehash(struct dentry * entry)
++void __d_rehash(struct dentry * entry, int lock)
+ {
+ 	struct list_head *list = d_hash(entry->d_parent, entry->d_name.hash);
+ 	if (!list_empty(&entry->d_hash)) BUG();
+-	spin_lock(&dcache_lock);
++	if (lock) spin_lock(&dcache_lock);
+ 	list_add(&entry->d_hash, list);
+-	spin_unlock(&dcache_lock);
++	if (lock) spin_unlock(&dcache_lock);
++}
++EXPORT_SYMBOL(__d_rehash);
++
++void d_rehash(struct dentry * entry)
++{
++	__d_rehash(entry, 1);
+ }
+ 
+ #define do_switch(x,y) do { \
+--- linux/fs/namespace.c~vfs_intent-2.4.20-hp	Thu Nov 28 15:53:15 2002
++++ linux-mmonroe/fs/namespace.c	Sat Jul 12 14:05:24 2003
+@@ -99,6 +99,7 @@ static void detach_mnt(struct vfsmount *
+ {
+ 	old_nd->dentry = mnt->mnt_mountpoint;
+ 	old_nd->mnt = mnt->mnt_parent;
++	UNPIN(old_nd->dentry, old_nd->mnt, 1);
+ 	mnt->mnt_parent = mnt;
+ 	mnt->mnt_mountpoint = mnt->mnt_root;
+ 	list_del_init(&mnt->mnt_child);
+@@ -110,6 +111,7 @@ static void attach_mnt(struct vfsmount *
+ {
+ 	mnt->mnt_parent = mntget(nd->mnt);
+ 	mnt->mnt_mountpoint = dget(nd->dentry);
++	PIN(nd->dentry, nd->mnt, 1);
+ 	list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry));
+ 	list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts);
+ 	nd->dentry->d_mounted++;
+@@ -485,14 +487,17 @@ static int do_loopback(struct nameidata 
+ {
+ 	struct nameidata old_nd;
+ 	struct vfsmount *mnt = NULL;
++	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 	int err = mount_is_safe(nd);
+ 	if (err)
+ 		return err;
+ 	if (!old_name || !*old_name)
+ 		return -EINVAL;
+-	err = path_lookup(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd);
+-	if (err)
++	err = path_lookup_it(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd, &it);
++	if (err) {
++		intent_release(&it);
+ 		return err;
++	}
+ 
+ 	down_write(&current->namespace->sem);
+ 	err = -EINVAL;
+@@ -515,6 +520,7 @@ static int do_loopback(struct nameidata 
+ 	}
+ 
+ 	up_write(&current->namespace->sem);
++	intent_release(&it);
+ 	path_release(&old_nd);
+ 	return err;
+ }
+@@ -698,6 +704,7 @@ long do_mount(char * dev_name, char * di
+ 		  unsigned long flags, void *data_page)
+ {
+ 	struct nameidata nd;
++	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 	int retval = 0;
+ 	int mnt_flags = 0;
+ 
+@@ -722,10 +729,11 @@ long do_mount(char * dev_name, char * di
+ 	flags &= ~(MS_NOSUID|MS_NOEXEC|MS_NODEV);
+ 
+ 	/* ... and get the mountpoint */
+-	retval = path_lookup(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
+-	if (retval)
++	retval = path_lookup_it(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
++	if (retval) {
++		intent_release(&it);
+ 		return retval;
+-
++	}
+ 	if (flags & MS_REMOUNT)
+ 		retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags,
+ 				    data_page);
+@@ -736,6 +744,8 @@ long do_mount(char * dev_name, char * di
+ 	else
+ 		retval = do_add_mount(&nd, type_page, flags, mnt_flags,
+ 				      dev_name, data_page);
++
++	intent_release(&it);
+ 	path_release(&nd);
+ 	return retval;
+ }
+@@ -901,6 +911,8 @@ asmlinkage long sys_pivot_root(const cha
+ {
+ 	struct vfsmount *tmp;
+ 	struct nameidata new_nd, old_nd, parent_nd, root_parent, user_nd;
++	struct lookup_intent new_it = { .it_op = IT_GETATTR };
++	struct lookup_intent old_it = { .it_op = IT_GETATTR };
+ 	int error;
+ 
+ 	if (!capable(CAP_SYS_ADMIN))
+@@ -908,14 +920,14 @@ asmlinkage long sys_pivot_root(const cha
+ 
+ 	lock_kernel();
+ 
+-	error = __user_walk(new_root, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd);
++	error = __user_walk_it(new_root, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd, &new_it);
+ 	if (error)
+ 		goto out0;
+ 	error = -EINVAL;
+ 	if (!check_mnt(new_nd.mnt))
+ 		goto out1;
+ 
+-	error = __user_walk(put_old, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd);
++	error = __user_walk_it(put_old, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd, &old_it);
+ 	if (error)
+ 		goto out1;
+ 
+@@ -970,8 +982,10 @@ out2:
+ 	up(&old_nd.dentry->d_inode->i_zombie);
+ 	up_write(&current->namespace->sem);
+ 	path_release(&user_nd);
++	intent_release(&old_it);
+ 	path_release(&old_nd);
+ out1:
++	intent_release(&new_it);
+ 	path_release(&new_nd);
+ out0:
+ 	unlock_kernel();
+--- linux/fs/namei.c~vfs_intent-2.4.20-hp	Sat Jul 12 14:04:48 2003
++++ linux-mmonroe/fs/namei.c	Sat Jul 12 14:08:01 2003
+@@ -94,6 +94,13 @@
+  * XEmacs seems to be relying on it...
+  */
+ 
++void intent_release(struct lookup_intent *it)
++{
++	if (it && it->it_op_release)
++		it->it_op_release(it);
++
++}
++
+ /* In order to reduce some races, while at the same time doing additional
+  * checking and hopefully speeding things up, we copy filenames to the
+  * kernel data space before using them..
+@@ -260,10 +267,19 @@ void path_release(struct nameidata *nd)
+  * Internal lookup() using the new generic dcache.
+  * SMP-safe
+  */
+-static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags)
++static struct dentry *cached_lookup(struct dentry *parent, struct qstr *name,
++				    int flags, struct lookup_intent *it)
+ {
+ 	struct dentry * dentry = d_lookup(parent, name);
+ 
++	if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
++		if (!dentry->d_op->d_revalidate_it(dentry, flags, it) &&
++		    !d_invalidate(dentry)) {
++			dput(dentry);
++			dentry = NULL;
++		}
++		return dentry;
++	} else
+ 	if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
+ 		if (!dentry->d_op->d_revalidate(dentry, flags) && !d_invalidate(dentry)) {
+ 			dput(dentry);
+@@ -281,11 +297,14 @@ static struct dentry * cached_lookup(str
+  * make sure that nobody added the entry to the dcache in the meantime..
+  * SMP-safe
+  */
+-static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags)
++static struct dentry *real_lookup(struct dentry *parent, struct qstr *name,
++				  int flags, struct lookup_intent *it)
+ {
+ 	struct dentry * result;
+ 	struct inode *dir = parent->d_inode;
+ 
++again:
++
+ 	down(&dir->i_sem);
+ 	/*
+ 	 * First re-do the cached lookup just in case it was created
+@@ -300,6 +319,9 @@ static struct dentry * real_lookup(struc
+ 		result = ERR_PTR(-ENOMEM);
+ 		if (dentry) {
+ 			lock_kernel();
++			if (dir->i_op->lookup_it)
++				result = dir->i_op->lookup_it(dir, dentry, it, flags);
++			else
+ 			result = dir->i_op->lookup(dir, dentry);
+ 			unlock_kernel();
+ 			if (result)
+@@ -321,6 +343,12 @@ static struct dentry * real_lookup(struc
+ 			dput(result);
+ 			result = ERR_PTR(-ENOENT);
+ 		}
++	} else if (result->d_op && result->d_op->d_revalidate_it) {
++		if (!result->d_op->d_revalidate_it(result, flags, it) &&
++		    !d_invalidate(result)) {
++			dput(result);
++			goto again;
++		}
+ 	}
+ 	return result;
+ }
+@@ -332,7 +360,8 @@ static struct dentry * real_lookup(struc
+  * Without that kind of total limit, nasty chains of consecutive
+  * symlinks can cause almost arbitrarily long lookups. 
+  */
+-static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd)
++static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd,
++				 struct lookup_intent *it)
+ {
+ 	int err;
+ 	if (current->link_count >= 5)
+@@ -346,10 +375,18 @@ static inline int do_follow_link(struct 
+ 	current->link_count++;
+ 	current->total_link_count++;
+ 	UPDATE_ATIME(dentry->d_inode);
++	nd->it = it;
+ 	err = dentry->d_inode->i_op->follow_link(dentry, nd);
++	if (!err && it != NULL && !(it->it_int_flags & IT_FL_FOLLOWED)) {
++		/* vfs_follow_link was never called */
++		intent_release(it);
++		path_release(nd);
++		err = -ENOLINK;
++	}
+ 	current->link_count--;
+ 	return err;
+ loop:
++	intent_release(it);
+ 	path_release(nd);
+ 	return -ELOOP;
+ }
+@@ -379,15 +416,26 @@ int follow_up(struct vfsmount **mnt, str
+ 	return __follow_up(mnt, dentry);
+ }
+ 
+-static inline int __follow_down(struct vfsmount **mnt, struct dentry **dentry)
++static inline int __follow_down(struct vfsmount **mnt, struct dentry **dentry,
++				struct lookup_intent *it)
+ {
+ 	struct vfsmount *mounted;
+ 
+ 	spin_lock(&dcache_lock);
+ 	mounted = lookup_mnt(*mnt, *dentry);
+ 	if (mounted) {
++		int opc = 0, mode = 0;
+ 		*mnt = mntget(mounted);
+ 		spin_unlock(&dcache_lock);
++		if (it) {
++			opc = it->it_op;
++			mode = it->it_mode;
++		}
++		intent_release(it);
++		if (it) {
++			it->it_op = opc;
++			it->it_mode = mode;
++		}
+ 		dput(*dentry);
+ 		mntput(mounted->mnt_parent);
+ 		*dentry = dget(mounted->mnt_root);
+@@ -399,7 +447,7 @@ static inline int __follow_down(struct v
+ 
+ int follow_down(struct vfsmount **mnt, struct dentry **dentry)
+ {
+-	return __follow_down(mnt,dentry);
++	return __follow_down(mnt,dentry,NULL);
+ }
+  
+ static inline void follow_dotdot(struct nameidata *nd)
+@@ -435,7 +483,7 @@ static inline void follow_dotdot(struct 
+ 		mntput(nd->mnt);
+ 		nd->mnt = parent;
+ 	}
+-	while (d_mountpoint(nd->dentry) && __follow_down(&nd->mnt, &nd->dentry))
++	while (d_mountpoint(nd->dentry) && __follow_down(&nd->mnt, &nd->dentry, NULL))
+ 		;
+ }
+ 
+@@ -447,7 +495,8 @@ static inline void follow_dotdot(struct 
+  *
+  * We expect 'base' to be positive and a directory.
+  */
+-int link_path_walk(const char * name, struct nameidata *nd)
++int link_path_walk_it(const char *name, struct nameidata *nd,
++		      struct lookup_intent *it)
+ {
+ 	struct dentry *dentry;
+ 	struct inode *inode;
+@@ -520,15 +569,15 @@ int link_path_walk(const char * name, st
+ 				break;
+ 		}
+ 		/* This does the actual lookups.. */
+-		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
++		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL);
+ 		if (!dentry) {
+-			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
++			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL);
+ 			err = PTR_ERR(dentry);
+ 			if (IS_ERR(dentry))
+ 				break;
+ 		}
+ 		/* Check mountpoints.. */
+-		while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry))
++		while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry, NULL))
+ 			;
+ 
+ 		err = -ENOENT;
+@@ -540,7 +589,7 @@ int link_path_walk(const char * name, st
+ 			goto out_dput;
+ 
+ 		if (inode->i_op->follow_link) {
+-			err = do_follow_link(dentry, nd);
++			err = do_follow_link(dentry, nd, NULL);
+ 			dput(dentry);
+ 			if (err)
+ 				goto return_err;
+@@ -556,7 +605,7 @@ int link_path_walk(const char * name, st
+ 			nd->dentry = dentry;
+ 		}
+ 		err = -ENOTDIR; 
+-		if (!inode->i_op->lookup)
++		if (!inode->i_op->lookup && !inode->i_op->lookup_it)
+ 			break;
+ 		continue;
+ 		/* here ends the main loop */
+@@ -583,19 +632,19 @@ last_component:
+ 			if (err < 0)
+ 				break;
+ 		}
+-		dentry = cached_lookup(nd->dentry, &this, 0);
++		dentry = cached_lookup(nd->dentry, &this, 0, it);
+ 		if (!dentry) {
+-			dentry = real_lookup(nd->dentry, &this, 0);
++			dentry = real_lookup(nd->dentry, &this, 0, it);
+ 			err = PTR_ERR(dentry);
+ 			if (IS_ERR(dentry))
+ 				break;
+ 		}
+-		while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry))
++		while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry, it))
+ 			;
+ 		inode = dentry->d_inode;
+ 		if ((lookup_flags & LOOKUP_FOLLOW)
+ 		    && inode && inode->i_op && inode->i_op->follow_link) {
+-			err = do_follow_link(dentry, nd);
++			err = do_follow_link(dentry, nd, it);
+ 			dput(dentry);
+ 			if (err)
+ 				goto return_err;
+@@ -609,7 +658,8 @@ last_component:
+ 			goto no_inode;
+ 		if (lookup_flags & LOOKUP_DIRECTORY) {
+ 			err = -ENOTDIR; 
+-			if (!inode->i_op || !inode->i_op->lookup)
++			if (!inode->i_op ||
++			    (!inode->i_op->lookup && !inode->i_op->lookup_it))
+ 				break;
+ 		}
+ 		goto return_base;
+@@ -633,6 +683,23 @@ return_reval:
+ 		 * Check the cached dentry for staleness.
+ 		 */
+ 		dentry = nd->dentry;
++	revalidate_again:
++		if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
++			err = -ESTALE;
++			if (!dentry->d_op->d_revalidate_it(dentry, 0, it)) {
++				struct dentry *new;
++				err = permission(dentry->d_parent->d_inode,
++						 MAY_EXEC);
++				if (err)
++					break;
++				new = real_lookup(dentry->d_parent,
++						  &dentry->d_name, 0, NULL);
++				d_invalidate(dentry);
++				dput(dentry);
++				dentry = new;
++				goto revalidate_again;
++			}
++		} else
+ 		if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
+ 			err = -ESTALE;
+ 			if (!dentry->d_op->d_revalidate(dentry, 0)) {
+@@ -646,15 +713,28 @@ out_dput:
+ 		dput(dentry);
+ 		break;
+ 	}
++	if (err)
++		intent_release(it);
+ 	path_release(nd);
+ return_err:
+ 	return err;
+ }
+ 
++int link_path_walk(const char * name, struct nameidata *nd)
++{
++	return link_path_walk_it(name, nd, NULL);
++}
++
++int path_walk_it(const char * name, struct nameidata *nd, struct lookup_intent *it)
++{
++	current->total_link_count = 0;
++	return link_path_walk_it(name, nd, it);
++}
++
+ int path_walk(const char * name, struct nameidata *nd)
+ {
+ 	current->total_link_count = 0;
+-	return link_path_walk(name, nd);
++	return link_path_walk_it(name, nd, NULL);
+ }
+ 
+ /* SMP-safe */
+@@ -739,6 +819,17 @@ walk_init_root(const char *name, struct 
+ }
+ 
+ /* SMP-safe */
++int path_lookup_it(const char *path, unsigned flags, struct nameidata *nd,
++		   struct lookup_intent *it)
++{
++	int error = 0;
++	if (path_init(path, flags, nd))
++		error = path_walk_it(path, nd, it);
++	return error;
++}
++
++
++/* SMP-safe */
+ int path_lookup(const char *path, unsigned flags, struct nameidata *nd)
+ {
+ 	int error = 0;
+@@ -753,6 +844,7 @@ int path_init(const char *name, unsigned
+ {
+ 	nd->last_type = LAST_ROOT; /* if there are only slashes... */
+ 	nd->flags = flags;
++	nd->it = NULL;
+ 	if (*name=='/')
+ 		return walk_init_root(name,nd);
+ 	read_lock(&current->fs->lock);
+@@ -767,7 +859,8 @@ int path_init(const char *name, unsigned
+  * needs parent already locked. Doesn't follow mounts.
+  * SMP-safe.
+  */
+-struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
++struct dentry * lookup_hash_it(struct qstr *name, struct dentry * base,
++			       struct lookup_intent *it)
+ {
+ 	struct dentry * dentry;
+ 	struct inode *inode;
+@@ -790,13 +883,16 @@ struct dentry * lookup_hash(struct qstr 
+ 			goto out;
+ 	}
+ 
+-	dentry = cached_lookup(base, name, 0);
++	dentry = cached_lookup(base, name, 0, it);
+ 	if (!dentry) {
+ 		struct dentry *new = d_alloc(base, name);
+ 		dentry = ERR_PTR(-ENOMEM);
+ 		if (!new)
+ 			goto out;
+ 		lock_kernel();
++		if (inode->i_op->lookup_it)
++			dentry = inode->i_op->lookup_it(inode, new, it, 0);
++		else
+ 		dentry = inode->i_op->lookup(inode, new);
+ 		unlock_kernel();
+ 		if (!dentry)
+@@ -808,6 +904,12 @@ out:
+ 	return dentry;
+ }
+ 
++struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
++{
++	return lookup_hash_it(name, base, NULL);
++}
++
++
+ /* SMP-safe */
+ struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
+ {
+@@ -829,7 +931,7 @@ struct dentry * lookup_one_len(const cha
+ 	}
+ 	this.hash = end_name_hash(hash);
+ 
+-	return lookup_hash(&this, base);
++	return lookup_hash_it(&this, base, NULL);
+ access:
+ 	return ERR_PTR(-EACCES);
+ }
+@@ -860,6 +962,23 @@ int __user_walk(const char *name, unsign
+ 	return err;
+ }
+ 
++int __user_walk_it(const char *name, unsigned flags, struct nameidata *nd,
++		   struct lookup_intent *it)
++{
++	char *tmp;
++	int err;
++
++	tmp = getname(name);
++	err = PTR_ERR(tmp);
++	if (!IS_ERR(tmp)) {
++		err = 0;
++		if (path_init(tmp, flags, nd))
++			err = path_walk_it(tmp, nd, it);
++		putname(tmp);
++	}
++	return err;
++}
++
+ /*
+  * It's inline, so penalty for filesystems that don't use sticky bit is
+  * minimal.
+@@ -955,7 +1074,8 @@ static inline int lookup_flags(unsigned 
+ 	return retval;
+ }
+ 
+-int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
++static int vfs_create_it(struct inode *dir, struct dentry *dentry, int mode,
++			 struct lookup_intent *it)
+ {
+ 	int error;
+ 
+@@ -968,12 +1088,15 @@ int vfs_create(struct inode *dir, struct
+ 		goto exit_lock;
+ 
+ 	error = -EACCES;	/* shouldn't it be ENOSYS? */
+-	if (!dir->i_op || !dir->i_op->create)
++	if (!dir->i_op || (!dir->i_op->create && !dir->i_op->create_it))
+ 		goto exit_lock;
+ 
+ 	DQUOT_INIT(dir);
+ 	lock_kernel();
+-	error = dir->i_op->create(dir, dentry, mode);
++	if (dir->i_op->create_it)
++		error = dir->i_op->create_it(dir, dentry, mode, it);
++	else
++		error = dir->i_op->create(dir, dentry, mode);
+ 	unlock_kernel();
+ exit_lock:
+ 	up(&dir->i_zombie);
+@@ -982,6 +1105,11 @@ exit_lock:
+ 	return error;
+ }
+ 
++int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
++{
++	return vfs_create_it(dir, dentry, mode, NULL);
++}
++
+ /*
+  *	open_namei()
+  *
+@@ -996,7 +1124,8 @@ exit_lock:
+  * for symlinks (where the permissions are checked later).
+  * SMP-safe
+  */
+-int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd)
++int open_namei_it(const char *pathname, int flag, int mode,
++		  struct nameidata *nd, struct lookup_intent *it)
+ {
+ 	int acc_mode, error = 0;
+ 	struct inode *inode;
+@@ -1010,7 +1139,7 @@ int open_namei(const char * pathname, in
+ 	 * The simplest case - just a plain lookup.
+ 	 */
+ 	if (!(flag & O_CREAT)) {
+-		error = path_lookup(pathname, lookup_flags(flag), nd);
++		error = path_lookup_it(pathname, lookup_flags(flag), nd, it);
+ 		if (error)
+ 			return error;
+ 		dentry = nd->dentry;
+@@ -1020,6 +1149,10 @@ int open_namei(const char * pathname, in
+ 	/*
+ 	 * Create - we need to know the parent.
+ 	 */
++ 	if (it) {
++ 		it->it_mode = mode;
++ 		it->it_op |= IT_CREAT;
++ 	}
+ 	error = path_lookup(pathname, LOOKUP_PARENT, nd);
+ 	if (error)
+ 		return error;
+@@ -1035,7 +1168,7 @@ int open_namei(const char * pathname, in
+ 
+ 	dir = nd->dentry;
+ 	down(&dir->d_inode->i_sem);
+-	dentry = lookup_hash(&nd->last, nd->dentry);
++	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
+ 
+ do_last:
+ 	error = PTR_ERR(dentry);
+@@ -1044,11 +1177,12 @@ do_last:
+ 		goto exit;
+ 	}
+ 
++	it->it_mode = mode;
+ 	/* Negative dentry, just create the file */
+ 	if (!dentry->d_inode) {
+ 		if (!IS_POSIXACL(dir->d_inode))
+ 			mode &= ~current->fs->umask;
+-		error = vfs_create(dir->d_inode, dentry, mode);
++		error = vfs_create_it(dir->d_inode, dentry, mode, it);
+ 		up(&dir->d_inode->i_sem);
+ 		dput(nd->dentry);
+ 		nd->dentry = dentry;
+@@ -1073,7 +1207,7 @@ do_last:
+ 		error = -ELOOP;
+ 		if (flag & O_NOFOLLOW)
+ 			goto exit_dput;
+-		while (__follow_down(&nd->mnt,&dentry) && d_mountpoint(dentry));
++		while (__follow_down(&nd->mnt,&dentry,it) && d_mountpoint(dentry));
+ 	}
+ 	error = -ENOENT;
+ 	if (!dentry->d_inode)
+@@ -1152,7 +1286,7 @@ ok:
+ 		if (!error) {
+ 			DQUOT_INIT(inode);
+ 			
+-			error = do_truncate(dentry, 0);
++			error = do_truncate(dentry, 0, 1);
+ 		}
+ 		put_write_access(inode);
+ 		if (error)
+@@ -1164,8 +1298,10 @@ ok:
+ 	return 0;
+ 
+ exit_dput:
++	intent_release(it);
+ 	dput(dentry);
+ exit:
++	intent_release(it);
+ 	path_release(nd);
+ 	return error;
+ 
+@@ -1184,7 +1320,16 @@ do_link:
+ 	 * are done. Procfs-like symlinks just set LAST_BIND.
+ 	 */
+ 	UPDATE_ATIME(dentry->d_inode);
++	nd->it = it;
+ 	error = dentry->d_inode->i_op->follow_link(dentry, nd);
++	if (error) {
++		intent_release(it);
++	} else if (it != NULL && !(it->it_int_flags & IT_FL_FOLLOWED)) {
++		/* vfs_follow_link was never called */
++		intent_release(it);
++		path_release(nd);
++		error = -ENOLINK;
++	}
+ 	dput(dentry);
+ 	if (error)
+ 		return error;
+@@ -1206,13 +1351,20 @@ do_link:
+ 	}
+ 	dir = nd->dentry;
+ 	down(&dir->d_inode->i_sem);
+-	dentry = lookup_hash(&nd->last, nd->dentry);
++	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
+ 	putname(nd->last.name);
+ 	goto do_last;
+ }
+ 
++int open_namei(const char *pathname, int flag, int mode, struct nameidata *nd)
++{
++	return open_namei_it(pathname, flag, mode, nd, NULL);
++}
++
++
+ /* SMP-safe */
+-static struct dentry *lookup_create(struct nameidata *nd, int is_dir)
++static struct dentry *lookup_create(struct nameidata *nd, int is_dir,
++				    struct lookup_intent *it)
+ {
+ 	struct dentry *dentry;
+ 
+@@ -1220,7 +1372,7 @@ static struct dentry *lookup_create(stru
+ 	dentry = ERR_PTR(-EEXIST);
+ 	if (nd->last_type != LAST_NORM)
+ 		goto fail;
+-	dentry = lookup_hash(&nd->last, nd->dentry);
++	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
+ 	if (IS_ERR(dentry))
+ 		goto fail;
+ 	if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
+@@ -1276,7 +1428,16 @@ asmlinkage long sys_mknod(const char * f
+ 	error = path_lookup(tmp, LOOKUP_PARENT, &nd);
+ 	if (error)
+ 		goto out;
+-	dentry = lookup_create(&nd, 0);
++
++	if (nd.dentry->d_inode->i_op->mknod_raw) {
++		struct inode_operations *op = nd.dentry->d_inode->i_op;
++		error = op->mknod_raw(&nd, mode, dev);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			goto out2;
++	}
++
++	dentry = lookup_create(&nd, 0, NULL);
+ 	error = PTR_ERR(dentry);
+ 
+ 	if (!IS_POSIXACL(nd.dentry->d_inode))
+@@ -1298,6 +1459,7 @@ asmlinkage long sys_mknod(const char * f
+ 		dput(dentry);
+ 	}
+ 	up(&nd.dentry->d_inode->i_sem);
++out2:
+ 	path_release(&nd);
+ out:
+ 	putname(tmp);
+@@ -1345,7 +1507,14 @@ asmlinkage long sys_mkdir(const char * p
+ 		error = path_lookup(tmp, LOOKUP_PARENT, &nd);
+ 		if (error)
+ 			goto out;
+-		dentry = lookup_create(&nd, 1);
++ 		if (nd.dentry->d_inode->i_op->mkdir_raw) {
++ 			struct inode_operations *op = nd.dentry->d_inode->i_op;
++ 			error = op->mkdir_raw(&nd, mode);
++ 			/* the file system wants to use normal vfs path now */
++ 			if (error != -EOPNOTSUPP)
++ 				goto out2;
++ 		}
++		dentry = lookup_create(&nd, 1, NULL);
+ 		error = PTR_ERR(dentry);
+ 		if (!IS_ERR(dentry)) {
+ 			if (!IS_POSIXACL(nd.dentry->d_inode))
+@@ -1354,6 +1523,7 @@ asmlinkage long sys_mkdir(const char * p
+ 			dput(dentry);
+ 		}
+ 		up(&nd.dentry->d_inode->i_sem);
++out2:
+ 		path_release(&nd);
+ out:
+ 		putname(tmp);
+@@ -1454,8 +1624,16 @@ asmlinkage long sys_rmdir(const char * p
+ 			error = -EBUSY;
+ 			goto exit1;
+ 	}
++ 	if (nd.dentry->d_inode->i_op->rmdir_raw) {
++ 		struct inode_operations *op = nd.dentry->d_inode->i_op;
++
++ 		error = op->rmdir_raw(&nd);
++ 		/* the file system wants to use normal vfs path now */
++ 		if (error != -EOPNOTSUPP)
++ 			goto exit1;
++ 	}
+ 	down(&nd.dentry->d_inode->i_sem);
+-	dentry = lookup_hash(&nd.last, nd.dentry);
++	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
+ 	error = PTR_ERR(dentry);
+ 	if (!IS_ERR(dentry)) {
+ 		error = vfs_rmdir(nd.dentry->d_inode, dentry);
+@@ -1513,8 +1691,15 @@ asmlinkage long sys_unlink(const char * 
+ 	error = -EISDIR;
+ 	if (nd.last_type != LAST_NORM)
+ 		goto exit1;
++ 	if (nd.dentry->d_inode->i_op->unlink_raw) {
++ 		struct inode_operations *op = nd.dentry->d_inode->i_op;
++ 		error = op->unlink_raw(&nd);
++ 		/* the file system wants to use normal vfs path now */
++ 		if (error != -EOPNOTSUPP)
++ 			goto exit1;
++ 	}
+ 	down(&nd.dentry->d_inode->i_sem);
+-	dentry = lookup_hash(&nd.last, nd.dentry);
++	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
+ 	error = PTR_ERR(dentry);
+ 	if (!IS_ERR(dentry)) {
+ 		/* Why not before? Because we want correct error value */
+@@ -1581,15 +1766,23 @@ asmlinkage long sys_symlink(const char *
+ 		error = path_lookup(to, LOOKUP_PARENT, &nd);
+ 		if (error)
+ 			goto out;
+-		dentry = lookup_create(&nd, 0);
++		if (nd.dentry->d_inode->i_op->symlink_raw) {
++			struct inode_operations *op = nd.dentry->d_inode->i_op;
++			error = op->symlink_raw(&nd, from);
++			/* the file system wants to use normal vfs path now */
++			if (error != -EOPNOTSUPP)
++				goto out2;
++		}
++		dentry = lookup_create(&nd, 0, NULL);
+ 		error = PTR_ERR(dentry);
+ 		if (!IS_ERR(dentry)) {
+ 			error = vfs_symlink(nd.dentry->d_inode, dentry, from);
+ 			dput(dentry);
+ 		}
+ 		up(&nd.dentry->d_inode->i_sem);
++	out2:
+ 		path_release(&nd);
+-out:
++	out:
+ 		putname(to);
+ 	}
+ 	putname(from);
+@@ -1665,7 +1858,14 @@ asmlinkage long sys_link(const char * ol
+ 		error = -EXDEV;
+ 		if (old_nd.mnt != nd.mnt)
+ 			goto out_release;
+-		new_dentry = lookup_create(&nd, 0);
++		if (nd.dentry->d_inode->i_op->link_raw) {
++			struct inode_operations *op = nd.dentry->d_inode->i_op;
++			error = op->link_raw(&old_nd, &nd);
++			/* the file system wants to use normal vfs path now */
++			if (error != -EOPNOTSUPP)
++				goto out_release;
++		}
++		new_dentry = lookup_create(&nd, 0, NULL);
+ 		error = PTR_ERR(new_dentry);
+ 		if (!IS_ERR(new_dentry)) {
+ 			error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);
+@@ -1709,7 +1909,7 @@ exit:
+  *	   locking].
+  */
+ int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
+-	       struct inode *new_dir, struct dentry *new_dentry)
++		   struct inode *new_dir, struct dentry *new_dentry)
+ {
+ 	int error;
+ 	struct inode *target;
+@@ -1788,7 +1988,7 @@ out_unlock:
+ }
+ 
+ int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
+-	       struct inode *new_dir, struct dentry *new_dentry)
++		     struct inode *new_dir, struct dentry *new_dentry)
+ {
+ 	int error;
+ 
+@@ -1876,9 +2076,18 @@ static inline int do_rename(const char *
+ 	if (newnd.last_type != LAST_NORM)
+ 		goto exit2;
+ 
++ 	if (old_dir->d_inode->i_op->rename_raw) {
++		lock_kernel();
++ 		error = old_dir->d_inode->i_op->rename_raw(&oldnd, &newnd);
++		unlock_kernel();
++ 		/* the file system wants to use normal vfs path now */
++ 		if (error != -EOPNOTSUPP)
++ 			goto exit2;
++ 	}
++
+ 	double_lock(new_dir, old_dir);
+ 
+-	old_dentry = lookup_hash(&oldnd.last, old_dir);
++	old_dentry = lookup_hash_it(&oldnd.last, old_dir, NULL);
+ 	error = PTR_ERR(old_dentry);
+ 	if (IS_ERR(old_dentry))
+ 		goto exit3;
+@@ -1894,16 +2103,16 @@ static inline int do_rename(const char *
+ 		if (newnd.last.name[newnd.last.len])
+ 			goto exit4;
+ 	}
+-	new_dentry = lookup_hash(&newnd.last, new_dir);
++	new_dentry = lookup_hash_it(&newnd.last, new_dir, NULL);
+ 	error = PTR_ERR(new_dentry);
+ 	if (IS_ERR(new_dentry))
+ 		goto exit4;
+ 
++
+ 	lock_kernel();
+ 	error = vfs_rename(old_dir->d_inode, old_dentry,
+ 				   new_dir->d_inode, new_dentry);
+ 	unlock_kernel();
+-
+ 	dput(new_dentry);
+ exit4:
+ 	dput(old_dentry);
+@@ -1954,20 +2163,28 @@ out:
+ }
+ 
+ static inline int
+-__vfs_follow_link(struct nameidata *nd, const char *link)
++__vfs_follow_link(struct nameidata *nd, const char *link,
++		  struct lookup_intent *it)
+ {
+ 	int res = 0;
+ 	char *name;
+ 	if (IS_ERR(link))
+ 		goto fail;
+ 
++	if (it == NULL)
++		it = nd->it;
++	else if (it != nd->it)
++		printk("it != nd->it: tell phil@clusterfs.com\n");
++	if (it != NULL)
++		it->it_int_flags |= IT_FL_FOLLOWED;
++
+ 	if (*link == '/') {
+ 		path_release(nd);
+ 		if (!walk_init_root(link, nd))
+ 			/* weird __emul_prefix() stuff did it */
+ 			goto out;
+ 	}
+-	res = link_path_walk(link, nd);
++	res = link_path_walk_it(link, nd, it);
+ out:
+ 	if (current->link_count || res || nd->last_type!=LAST_NORM)
+ 		return res;
+@@ -1989,7 +2206,13 @@ fail:
+ 
+ int vfs_follow_link(struct nameidata *nd, const char *link)
+ {
+-	return __vfs_follow_link(nd, link);
++	return __vfs_follow_link(nd, link, NULL);
++}
++
++int vfs_follow_link_it(struct nameidata *nd, const char *link,
++		       struct lookup_intent *it)
++{
++	return __vfs_follow_link(nd, link, it);
+ }
+ 
+ /* get the link contents into pagecache */
+@@ -2031,7 +2254,7 @@ int page_follow_link(struct dentry *dent
+ {
+ 	struct page *page = NULL;
+ 	char *s = page_getlink(dentry, &page);
+-	int res = __vfs_follow_link(nd, s);
++	int res = __vfs_follow_link(nd, s, NULL);
+ 	if (page) {
+ 		kunmap(page);
+ 		page_cache_release(page);
+--- linux/fs/open.c~vfs_intent-2.4.20-hp	Thu Nov 28 15:53:15 2002
++++ linux-mmonroe/fs/open.c	Sat Jul 12 14:05:24 2003
+@@ -19,6 +19,8 @@
+ #include <asm/uaccess.h>
+ 
+ #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
++extern int path_walk_it(const char *name, struct nameidata *nd,
++			struct lookup_intent *it);
+ 
+ int vfs_statfs(struct super_block *sb, struct statfs *buf)
+ {
+@@ -95,9 +97,10 @@ void fd_install(unsigned int fd, struct 
+ 	write_unlock(&files->file_lock);
+ }
+ 
+-int do_truncate(struct dentry *dentry, loff_t length)
++int do_truncate(struct dentry *dentry, loff_t length, int called_from_open)
+ {
+ 	struct inode *inode = dentry->d_inode;
++	struct inode_operations *op = dentry->d_inode->i_op;
+ 	int error;
+ 	struct iattr newattrs;
+ 
+@@ -108,7 +111,13 @@ int do_truncate(struct dentry *dentry, l
+ 	down(&inode->i_sem);
+ 	newattrs.ia_size = length;
+ 	newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
+-	error = notify_change(dentry, &newattrs);
++	if (called_from_open)
++		newattrs.ia_valid |= ATTR_FROM_OPEN;
++	if (op->setattr_raw) {
++		newattrs.ia_valid |= ATTR_RAW;
++		error = op->setattr_raw(inode, &newattrs);
++	} else
++		error = notify_change(dentry, &newattrs);
+ 	up(&inode->i_sem);
+ 	return error;
+ }
+@@ -118,12 +127,13 @@ static inline long do_sys_truncate(const
+ 	struct nameidata nd;
+ 	struct inode * inode;
+ 	int error;
++	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 
+ 	error = -EINVAL;
+ 	if (length < 0)	/* sorry, but loff_t says... */
+ 		goto out;
+ 
+-	error = user_path_walk(path, &nd);
++	error = user_path_walk_it(path, &nd, &it);
+ 	if (error)
+ 		goto out;
+ 	inode = nd.dentry->d_inode;
+@@ -163,11 +173,13 @@ static inline long do_sys_truncate(const
+ 	error = locks_verify_truncate(inode, NULL, length);
+ 	if (!error) {
+ 		DQUOT_INIT(inode);
+-		error = do_truncate(nd.dentry, length);
++		intent_release(&it);
++		error = do_truncate(nd.dentry, length, 0);
+ 	}
+ 	put_write_access(inode);
+ 
+ dput_and_out:
++	intent_release(&it);
+ 	path_release(&nd);
+ out:
+ 	return error;
+@@ -215,7 +227,7 @@ static inline long do_sys_ftruncate(unsi
+ 
+ 	error = locks_verify_truncate(inode, file, length);
+ 	if (!error)
+-		error = do_truncate(dentry, length);
++		error = do_truncate(dentry, length, 0);
+ out_putf:
+ 	fput(file);
+ out:
+@@ -260,11 +272,13 @@ asmlinkage long sys_utime(char * filenam
+ 	struct inode * inode;
+ 	struct iattr newattrs;
+ 
+-	error = user_path_walk(filename, &nd);
++	error = user_path_walk_it(filename, &nd, NULL);
+ 	if (error)
+ 		goto out;
+ 	inode = nd.dentry->d_inode;
+ 
++	/* this is safe without a Lustre lock because it only depends
++	   on the super block */
+ 	error = -EROFS;
+ 	if (IS_RDONLY(inode))
+ 		goto dput_and_out;
+@@ -279,11 +293,25 @@ asmlinkage long sys_utime(char * filenam
+ 			goto dput_and_out;
+ 
+ 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
+-	} else {
++	}
++
++	if (inode->i_op->setattr_raw) {
++		struct inode_operations *op = nd.dentry->d_inode->i_op;
++
++		newattrs.ia_valid |= ATTR_RAW;
++		error = op->setattr_raw(inode, &newattrs);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			goto dput_and_out;
++	}
++
++	error = -EPERM;
++	if (!times) {
+ 		if (current->fsuid != inode->i_uid &&
+ 		    (error = permission(inode,MAY_WRITE)) != 0)
+ 			goto dput_and_out;
+ 	}
++
+ 	error = notify_change(nd.dentry, &newattrs);
+ dput_and_out:
+ 	path_release(&nd);
+@@ -304,12 +332,14 @@ asmlinkage long sys_utimes(char * filena
+ 	struct inode * inode;
+ 	struct iattr newattrs;
+ 
+-	error = user_path_walk(filename, &nd);
++	error = user_path_walk_it(filename, &nd, NULL);
+ 
+ 	if (error)
+ 		goto out;
+ 	inode = nd.dentry->d_inode;
+ 
++	/* this is safe without a Lustre lock because it only depends
++	   on the super block */
+ 	error = -EROFS;
+ 	if (IS_RDONLY(inode))
+ 		goto dput_and_out;
+@@ -324,7 +354,20 @@ asmlinkage long sys_utimes(char * filena
+ 		newattrs.ia_atime = times[0].tv_sec;
+ 		newattrs.ia_mtime = times[1].tv_sec;
+ 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
+-	} else {
++	}
++
++	if (inode->i_op->setattr_raw) {
++		struct inode_operations *op = nd.dentry->d_inode->i_op;
++
++		newattrs.ia_valid |= ATTR_RAW;
++		error = op->setattr_raw(inode, &newattrs);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			goto dput_and_out;
++	}
++
++	error = -EPERM;
++	if (!utimes) {
+ 		if (current->fsuid != inode->i_uid &&
+ 		    (error = permission(inode,MAY_WRITE)) != 0)
+ 			goto dput_and_out;
+@@ -347,6 +390,7 @@ asmlinkage long sys_access(const char * 
+ 	int old_fsuid, old_fsgid;
+ 	kernel_cap_t old_cap;
+ 	int res;
++	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 
+ 	if (mode & ~S_IRWXO)	/* where's F_OK, X_OK, W_OK, R_OK? */
+ 		return -EINVAL;
+@@ -364,13 +408,14 @@ asmlinkage long sys_access(const char * 
+ 	else
+ 		current->cap_effective = current->cap_permitted;
+ 
+-	res = user_path_walk(filename, &nd);
++	res = user_path_walk_it(filename, &nd, &it);
+ 	if (!res) {
+ 		res = permission(nd.dentry->d_inode, mode);
+ 		/* SuS v2 requires we report a read only fs too */
+ 		if(!res && (mode & S_IWOTH) && IS_RDONLY(nd.dentry->d_inode)
+ 		   && !special_file(nd.dentry->d_inode->i_mode))
+ 			res = -EROFS;
++		intent_release(&it);
+ 		path_release(&nd);
+ 	}
+ 
+@@ -385,8 +430,9 @@ asmlinkage long sys_chdir(const char * f
+ {
+ 	int error;
+ 	struct nameidata nd;
++ 	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 
+-	error = __user_walk(filename,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd);
++	error = __user_walk_it(filename,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd, &it);
+ 	if (error)
+ 		goto out;
+ 
+@@ -397,6 +443,7 @@ asmlinkage long sys_chdir(const char * f
+ 	set_fs_pwd(current->fs, nd.mnt, nd.dentry);
+ 
+ dput_and_out:
++	intent_release(&it);
+ 	path_release(&nd);
+ out:
+ 	return error;
+@@ -436,9 +483,10 @@ asmlinkage long sys_chroot(const char * 
+ {
+ 	int error;
+ 	struct nameidata nd;
++ 	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 
+-	error = __user_walk(filename, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
+-		      LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
++	error = __user_walk_it(filename, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
++		      LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd, &it);
+ 	if (error)
+ 		goto out;
+ 
+@@ -454,6 +502,7 @@ asmlinkage long sys_chroot(const char * 
+ 	set_fs_altroot();
+ 	error = 0;
+ dput_and_out:
++	intent_release(&it);
+ 	path_release(&nd);
+ out:
+ 	return error;
+@@ -508,6 +557,18 @@ asmlinkage long sys_chmod(const char * f
+ 	if (IS_RDONLY(inode))
+ 		goto dput_and_out;
+ 
++	if (inode->i_op->setattr_raw) {
++		struct inode_operations *op = nd.dentry->d_inode->i_op;
++
++		newattrs.ia_mode = mode;
++		newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
++		newattrs.ia_valid |= ATTR_RAW;
++		error = op->setattr_raw(inode, &newattrs);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			goto dput_and_out;
++	}
++
+ 	error = -EPERM;
+ 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
+ 		goto dput_and_out;
+@@ -538,6 +599,20 @@ static int chown_common(struct dentry * 
+ 	error = -EROFS;
+ 	if (IS_RDONLY(inode))
+ 		goto out;
++
++	if (inode->i_op->setattr_raw) {
++		struct inode_operations *op = dentry->d_inode->i_op;
++
++		newattrs.ia_uid = user;
++		newattrs.ia_gid = group;
++		newattrs.ia_valid = ATTR_UID | ATTR_GID | ATTR_CTIME;
++		newattrs.ia_valid |= ATTR_RAW;
++		error = op->setattr_raw(inode, &newattrs);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			return error;
++	}
++
+ 	error = -EPERM;
+ 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
+ 		goto out;
+@@ -638,10 +713,12 @@ asmlinkage long sys_fchown(unsigned int 
+  * for the internal routines (ie open_namei()/follow_link() etc). 00 is
+  * used by symlinks.
+  */
++
+ struct file *filp_open(const char * filename, int flags, int mode)
+ {
+ 	int namei_flags, error;
+ 	struct nameidata nd;
++	struct lookup_intent it = { .it_op = IT_OPEN, .it_flags = flags };
+ 
+ 	namei_flags = flags;
+ 	if ((namei_flags+1) & O_ACCMODE)
+@@ -649,14 +726,15 @@ struct file *filp_open(const char * file
+ 	if (namei_flags & O_TRUNC)
+ 		namei_flags |= 2;
+ 
+-	error = open_namei(filename, namei_flags, mode, &nd);
+-	if (!error)
+-		return dentry_open(nd.dentry, nd.mnt, flags);
++	error = open_namei_it(filename, namei_flags, mode, &nd, &it);
++	if (error)
++		return ERR_PTR(error);
+ 
+-	return ERR_PTR(error);
++	return dentry_open_it(nd.dentry, nd.mnt, flags, &it);
+ }
+ 
+-struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
++struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt,
++			    int flags, struct lookup_intent *it)
+ {
+ 	struct file * f;
+ 	struct inode *inode;
+@@ -693,12 +771,15 @@ struct file *dentry_open(struct dentry *
+ 	}
+ 
+ 	if (f->f_op && f->f_op->open) {
++		f->f_it = it;
+ 		error = f->f_op->open(inode,f);
++		f->f_it = NULL;
+ 		if (error)
+ 			goto cleanup_all;
+ 	}
+ 	f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
+ 
++	intent_release(it);
+ 	return f;
+ 
+ cleanup_all:
+@@ -713,11 +794,17 @@ cleanup_all:
+ cleanup_file:
+ 	put_filp(f);
+ cleanup_dentry:
++	intent_release(it);
+ 	dput(dentry);
+ 	mntput(mnt);
+ 	return ERR_PTR(error);
+ }
+ 
++struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
++{
++	return dentry_open_it(dentry, mnt, flags, NULL);
++}
++
+ /*
+  * Find an empty file descriptor entry, and mark it busy.
+  */
+--- linux/fs/stat.c~vfs_intent-2.4.20-hp	Thu Sep 13 16:04:43 2001
++++ linux-mmonroe/fs/stat.c	Sat Jul 12 14:05:24 2003
+@@ -17,10 +17,12 @@
+  * Revalidate the inode. This is required for proper NFS attribute caching.
+  */
+ static __inline__ int
+-do_revalidate(struct dentry *dentry)
++do_revalidate(struct dentry *dentry, struct lookup_intent *it)
+ {
+ 	struct inode * inode = dentry->d_inode;
+-	if (inode->i_op && inode->i_op->revalidate)
++	if (inode->i_op && inode->i_op->revalidate_it)
++		return inode->i_op->revalidate_it(dentry, it);
++	else if (inode->i_op && inode->i_op->revalidate)
+ 		return inode->i_op->revalidate(dentry);
+ 	return 0;
+ }
+@@ -135,13 +137,15 @@ static int cp_new_stat(struct inode * in
+ asmlinkage long sys_stat(char * filename, struct __old_kernel_stat * statbuf)
+ {
+ 	struct nameidata nd;
++	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 	int error;
+ 
+-	error = user_path_walk(filename, &nd);
++	error = user_path_walk_it(filename, &nd, &it);
+ 	if (!error) {
+-		error = do_revalidate(nd.dentry);
++		error = do_revalidate(nd.dentry, &it);
+ 		if (!error)
+ 			error = cp_old_stat(nd.dentry->d_inode, statbuf);
++		intent_release(&it);
+ 		path_release(&nd);
+ 	}
+ 	return error;
+@@ -151,13 +155,15 @@ asmlinkage long sys_stat(char * filename
+ asmlinkage long sys_newstat(char * filename, struct stat * statbuf)
+ {
+ 	struct nameidata nd;
++	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 	int error;
+ 
+-	error = user_path_walk(filename, &nd);
++	error = user_path_walk_it(filename, &nd, &it);
+ 	if (!error) {
+-		error = do_revalidate(nd.dentry);
++		error = do_revalidate(nd.dentry, &it);
+ 		if (!error)
+ 			error = cp_new_stat(nd.dentry->d_inode, statbuf);
++		intent_release(&it);
+ 		path_release(&nd);
+ 	}
+ 	return error;
+@@ -172,13 +178,15 @@ asmlinkage long sys_newstat(char * filen
+ asmlinkage long sys_lstat(char * filename, struct __old_kernel_stat * statbuf)
+ {
+ 	struct nameidata nd;
++	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 	int error;
+ 
+-	error = user_path_walk_link(filename, &nd);
++	error = user_path_walk_link_it(filename, &nd, &it);
+ 	if (!error) {
+-		error = do_revalidate(nd.dentry);
++		error = do_revalidate(nd.dentry, &it);
+ 		if (!error)
+ 			error = cp_old_stat(nd.dentry->d_inode, statbuf);
++		intent_release(&it);
+ 		path_release(&nd);
+ 	}
+ 	return error;
+@@ -189,13 +197,15 @@ asmlinkage long sys_lstat(char * filenam
+ asmlinkage long sys_newlstat(char * filename, struct stat * statbuf)
+ {
+ 	struct nameidata nd;
++	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 	int error;
+ 
+-	error = user_path_walk_link(filename, &nd);
++	error = user_path_walk_link_it(filename, &nd, &it);
+ 	if (!error) {
+-		error = do_revalidate(nd.dentry);
++		error = do_revalidate(nd.dentry, &it);
+ 		if (!error)
+ 			error = cp_new_stat(nd.dentry->d_inode, statbuf);
++		intent_release(&it);
+ 		path_release(&nd);
+ 	}
+ 	return error;
+@@ -216,7 +226,7 @@ asmlinkage long sys_fstat(unsigned int f
+ 	if (f) {
+ 		struct dentry * dentry = f->f_dentry;
+ 
+-		err = do_revalidate(dentry);
++		err = do_revalidate(dentry, NULL);
+ 		if (!err)
+ 			err = cp_old_stat(dentry->d_inode, statbuf);
+ 		fput(f);
+@@ -235,7 +245,7 @@ asmlinkage long sys_newfstat(unsigned in
+ 	if (f) {
+ 		struct dentry * dentry = f->f_dentry;
+ 
+-		err = do_revalidate(dentry);
++		err = do_revalidate(dentry, NULL);
+ 		if (!err)
+ 			err = cp_new_stat(dentry->d_inode, statbuf);
+ 		fput(f);
+@@ -257,7 +267,7 @@ asmlinkage long sys_readlink(const char 
+ 
+ 		error = -EINVAL;
+ 		if (inode->i_op && inode->i_op->readlink &&
+-		    !(error = do_revalidate(nd.dentry))) {
++		    !(error = do_revalidate(nd.dentry, NULL))) {
+ 			UPDATE_ATIME(inode);
+ 			error = inode->i_op->readlink(nd.dentry, buf, bufsiz);
+ 		}
+@@ -333,12 +343,14 @@ asmlinkage long sys_stat64(char * filena
+ {
+ 	struct nameidata nd;
+ 	int error;
++	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 
+-	error = user_path_walk(filename, &nd);
++	error = user_path_walk_it(filename, &nd, &it);
+ 	if (!error) {
+-		error = do_revalidate(nd.dentry);
++		error = do_revalidate(nd.dentry, &it);
+ 		if (!error)
+ 			error = cp_new_stat64(nd.dentry->d_inode, statbuf);
++		intent_release(&it);
+ 		path_release(&nd);
+ 	}
+ 	return error;
+@@ -348,12 +360,14 @@ asmlinkage long sys_lstat64(char * filen
+ {
+ 	struct nameidata nd;
+ 	int error;
++	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 
+-	error = user_path_walk_link(filename, &nd);
++	error = user_path_walk_link_it(filename, &nd, &it);
+ 	if (!error) {
+-		error = do_revalidate(nd.dentry);
++		error = do_revalidate(nd.dentry, &it);
+ 		if (!error)
+ 			error = cp_new_stat64(nd.dentry->d_inode, statbuf);
++		intent_release(&it);
+ 		path_release(&nd);
+ 	}
+ 	return error;
+@@ -368,7 +382,7 @@ asmlinkage long sys_fstat64(unsigned lon
+ 	if (f) {
+ 		struct dentry * dentry = f->f_dentry;
+ 
+-		err = do_revalidate(dentry);
++		err = do_revalidate(dentry, NULL);
+ 		if (!err)
+ 			err = cp_new_stat64(dentry->d_inode, statbuf);
+ 		fput(f);
+--- linux/fs/proc/base.c~vfs_intent-2.4.20-hp	Sat Jul 12 14:04:46 2003
++++ linux-mmonroe/fs/proc/base.c	Sat Jul 12 14:05:24 2003
+@@ -481,6 +481,9 @@ static int proc_pid_follow_link(struct d
+ 
+ 	error = inode->u.proc_i.op.proc_get_link(inode, &nd->dentry, &nd->mnt);
+ 	nd->last_type = LAST_BIND;
++
++	if (nd->it != NULL)
++		nd->it->it_int_flags |= IT_FL_FOLLOWED;
+ out:
+ 	return error;
+ }
+--- linux/include/linux/dcache.h~vfs_intent-2.4.20-hp	Thu Nov 28 15:53:15 2002
++++ linux-mmonroe/include/linux/dcache.h	Sat Jul 12 14:06:04 2003
+@@ -5,8 +5,47 @@
+ 
+ #include <asm/atomic.h>
+ #include <linux/mount.h>
++#include <linux/string.h>
+ #include <linux/kernel.h>
+ 
++#define IT_OPEN     0x0001
++#define IT_CREAT    0x0002
++#define IT_READDIR  0x0004
++#define IT_GETATTR  0x0008
++#define IT_LOOKUP   0x0010
++#define IT_UNLINK   0x0020
++#define IT_GETXATTR 0x0040
++#define IT_EXEC     0x0080
++#define IT_PIN      0x0100
++
++#define IT_FL_LOCKED   0x0001
++#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */
++
++#define INTENT_MAGIC 0x19620323
++
++struct lookup_intent {
++	int it_op;
++	void (*it_op_release)(struct lookup_intent *);
++	int it_magic;
++	int it_mode;
++	int it_flags;
++	int it_disposition;
++	int it_status;
++	int it_int_flags;
++	__u64 it_lock_handle[2];
++	int it_lock_mode;
++	void *it_data;
++};
++
++static inline void intent_init(struct lookup_intent *it, int op, int flags)
++{
++	memset(it, 0, sizeof(*it));
++	it->it_magic = INTENT_MAGIC;
++	it->it_op = op;
++	it->it_flags = flags;
++}
++
++
+ /*
+  * linux/include/linux/dcache.h
+  *
+@@ -91,8 +130,22 @@ struct dentry_operations {
+ 	int (*d_delete)(struct dentry *);
+ 	void (*d_release)(struct dentry *);
+ 	void (*d_iput)(struct dentry *, struct inode *);
++	int (*d_revalidate_it)(struct dentry *, int, struct lookup_intent *);
++	void (*d_pin)(struct dentry *, struct vfsmount * , int);
++	void (*d_unpin)(struct dentry *, struct vfsmount *, int);
+ };
+ 
++#define PIN(de,mnt,flag)  if (de->d_op && de->d_op->d_pin) \
++				de->d_op->d_pin(de, mnt, flag);
++#define UNPIN(de,mnt,flag)  if (de->d_op && de->d_op->d_unpin) \
++				de->d_op->d_unpin(de, mnt, flag);
++
++
++/* defined in fs/namei.c */
++extern void intent_release(struct lookup_intent *it);
++/* defined in fs/dcache.c */
++extern void __d_rehash(struct dentry * entry, int lock);
++
+ /* the dentry parameter passed to d_hash and d_compare is the parent
+  * directory of the entries to be compared. It is used in case these
+  * functions need any directory specific information for determining
+@@ -124,6 +177,7 @@ d_iput:		no		no		yes
+ 					 * s_nfsd_free_path semaphore will be down
+ 					 */
+ #define DCACHE_REFERENCED	0x0008  /* Recently used, don't discard. */
++#define DCACHE_LUSTRE_INVALID	0x0010  /* Lustre invalidated */
+ 
+ extern spinlock_t dcache_lock;
+ 
+--- linux/include/linux/fs.h~vfs_intent-2.4.20-hp	Sat Jul 12 14:05:20 2003
++++ linux-mmonroe/include/linux/fs.h	Sat Jul 12 14:05:24 2003
+@@ -340,6 +340,9 @@ extern void set_bh_page(struct buffer_he
+ #define ATTR_MTIME_SET	256
+ #define ATTR_FORCE	512	/* Not a change, but a change it */
+ #define ATTR_ATTR_FLAG	1024
++#define ATTR_RAW	0x0800	/* file system, not vfs will massage attrs */
++#define ATTR_FROM_OPEN	0x1000	/* called from open path, ie O_TRUNC */
++#define ATTR_CTIME_SET 0x2000
+ 
+ /*
+  * This is the Inode Attributes structure, used for notify_change().  It
+@@ -576,6 +579,7 @@ struct file {
+ 
+ 	/* needed for tty driver, and maybe others */
+ 	void			*private_data;
++	struct lookup_intent    *f_it;
+ 
+ 	/* preallocated helper kiobuf to speedup O_DIRECT */
+ 	struct kiobuf		*f_iobuf;
+@@ -697,6 +701,7 @@ struct nameidata {
+ 	struct qstr last;
+ 	unsigned int flags;
+ 	int last_type;
++	struct lookup_intent *it;
+ };
+ 
+ /*
+@@ -817,7 +822,8 @@ extern int vfs_symlink(struct inode *, s
+ extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
+ extern int vfs_rmdir(struct inode *, struct dentry *);
+ extern int vfs_unlink(struct inode *, struct dentry *);
+-extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
++int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
++	       struct inode *new_dir, struct dentry *new_dentry);
+ 
+ /*
+  * File types
+@@ -877,21 +883,32 @@ struct file_operations {
+ 
+ struct inode_operations {
+ 	int (*create) (struct inode *,struct dentry *,int);
++	int (*create_it) (struct inode *,struct dentry *,int, struct lookup_intent *);
+ 	struct dentry * (*lookup) (struct inode *,struct dentry *);
++	struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct lookup_intent *, int flags);
+ 	int (*link) (struct dentry *,struct inode *,struct dentry *);
++	int (*link_raw) (struct nameidata *,struct nameidata *);
+ 	int (*unlink) (struct inode *,struct dentry *);
++	int (*unlink_raw) (struct nameidata *);
+ 	int (*symlink) (struct inode *,struct dentry *,const char *);
++	int (*symlink_raw) (struct nameidata *,const char *);
+ 	int (*mkdir) (struct inode *,struct dentry *,int);
++	int (*mkdir_raw) (struct nameidata *,int);
+ 	int (*rmdir) (struct inode *,struct dentry *);
++	int (*rmdir_raw) (struct nameidata *);
+ 	int (*mknod) (struct inode *,struct dentry *,int,int);
++	int (*mknod_raw) (struct nameidata *,int,dev_t);
+ 	int (*rename) (struct inode *, struct dentry *,
+ 			struct inode *, struct dentry *);
++	int (*rename_raw) (struct nameidata *, struct nameidata *);
+ 	int (*readlink) (struct dentry *, char *,int);
+ 	int (*follow_link) (struct dentry *, struct nameidata *);
+ 	void (*truncate) (struct inode *);
+ 	int (*permission) (struct inode *, int);
+ 	int (*revalidate) (struct dentry *);
++	int (*revalidate_it) (struct dentry *, struct lookup_intent *);
+ 	int (*setattr) (struct dentry *, struct iattr *);
++ 	int (*setattr_raw) (struct inode *, struct iattr *);
+ 	int (*getattr) (struct dentry *, struct iattr *);
+ 	int (*setxattr) (struct dentry *, const char *, void *, size_t, int);
+ 	ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
+@@ -1088,10 +1105,14 @@ static inline int get_lease(struct inode
+ 
+ asmlinkage long sys_open(const char *, int, int);
+ asmlinkage long sys_close(unsigned int);	/* yes, it's really unsigned */
+-extern int do_truncate(struct dentry *, loff_t start);
++extern int do_truncate(struct dentry *, loff_t start, int called_from_open);
+ 
+ extern struct file *filp_open(const char *, int, int);
+ extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
++extern int open_namei_it(const char *filename, int namei_flags, int mode,
++			 struct nameidata *nd, struct lookup_intent *it);
++extern struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt,
++			    int flags, struct lookup_intent *it);
+ extern int filp_close(struct file *, fl_owner_t id);
+ extern char * getname(const char *);
+ 
+@@ -1353,6 +1374,7 @@ typedef int (*read_actor_t)(read_descrip
+ extern loff_t default_llseek(struct file *file, loff_t offset, int origin);
+ 
+ extern int FASTCALL(__user_walk(const char *, unsigned, struct nameidata *));
++extern int FASTCALL(__user_walk_it(const char *, unsigned, struct nameidata *, struct lookup_intent *it));
+ extern int FASTCALL(path_init(const char *, unsigned, struct nameidata *));
+ extern int FASTCALL(path_walk(const char *, struct nameidata *));
+ extern int FASTCALL(path_lookup(const char *, unsigned, struct nameidata *));
+@@ -1364,6 +1386,8 @@ extern struct dentry * lookup_one_len(co
+ extern struct dentry * lookup_hash(struct qstr *, struct dentry *);
+ #define user_path_walk(name,nd)	 __user_walk(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd)
+ #define user_path_walk_link(name,nd) __user_walk(name, LOOKUP_POSITIVE, nd)
++#define user_path_walk_it(name,nd,it)  __user_walk_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd, it)
++#define user_path_walk_link_it(name,nd,it) __user_walk_it(name, LOOKUP_POSITIVE, nd, it)
+ 
+ extern void inode_init_once(struct inode *);
+ extern void iput(struct inode *);
+@@ -1499,6 +1523,8 @@ extern struct file_operations generic_ro
+ 
+ extern int vfs_readlink(struct dentry *, char *, int, const char *);
+ extern int vfs_follow_link(struct nameidata *, const char *);
++extern int vfs_follow_link_it(struct nameidata *, const char *,
++			      struct lookup_intent *it);
+ extern int page_readlink(struct dentry *, char *, int);
+ extern int page_follow_link(struct dentry *, struct nameidata *);
+ extern struct inode_operations page_symlink_inode_operations;
+--- linux/include/linux/fs_struct.h~vfs_intent-2.4.20-hp	Fri Jul 13 15:10:44 2001
++++ linux-mmonroe/include/linux/fs_struct.h	Sat Jul 12 14:05:24 2003
+@@ -34,10 +34,12 @@ static inline void set_fs_root(struct fs
+ 	write_lock(&fs->lock);
+ 	old_root = fs->root;
+ 	old_rootmnt = fs->rootmnt;
++	PIN(dentry, mnt, 1);
+ 	fs->rootmnt = mntget(mnt);
+ 	fs->root = dget(dentry);
+ 	write_unlock(&fs->lock);
+ 	if (old_root) {
++		UNPIN(old_root, old_rootmnt, 1);
+ 		dput(old_root);
+ 		mntput(old_rootmnt);
+ 	}
+@@ -57,10 +59,12 @@ static inline void set_fs_pwd(struct fs_
+ 	write_lock(&fs->lock);
+ 	old_pwd = fs->pwd;
+ 	old_pwdmnt = fs->pwdmnt;
++	PIN(dentry, mnt, 0);
+ 	fs->pwdmnt = mntget(mnt);
+ 	fs->pwd = dget(dentry);
+ 	write_unlock(&fs->lock);
+ 	if (old_pwd) {
++		UNPIN(old_pwd, old_pwdmnt, 0);
+ 		dput(old_pwd);
+ 		mntput(old_pwdmnt);
+ 	}
+--- linux/kernel/ksyms.c~vfs_intent-2.4.20-hp	Sat Jul 12 14:05:21 2003
++++ linux-mmonroe/kernel/ksyms.c	Sat Jul 12 14:05:24 2003
+@@ -296,6 +296,7 @@ EXPORT_SYMBOL(read_cache_page);
+ EXPORT_SYMBOL(set_page_dirty);
+ EXPORT_SYMBOL(vfs_readlink);
+ EXPORT_SYMBOL(vfs_follow_link);
++EXPORT_SYMBOL(vfs_follow_link_it);
+ EXPORT_SYMBOL(page_readlink);
+ EXPORT_SYMBOL(page_follow_link);
+ EXPORT_SYMBOL(page_symlink_inode_operations);
+--- linux/kernel/fork.c~vfs_intent-2.4.20-hp	Sat Jul 12 14:04:49 2003
++++ linux-mmonroe/kernel/fork.c	Sat Jul 12 14:05:24 2003
+@@ -388,10 +388,13 @@ static inline struct fs_struct *__copy_f
+ 		fs->umask = old->umask;
+ 		read_lock(&old->lock);
+ 		fs->rootmnt = mntget(old->rootmnt);
++		PIN(old->pwd, old->pwdmnt, 0);
++		PIN(old->root, old->rootmnt, 1);
+ 		fs->root = dget(old->root);
+ 		fs->pwdmnt = mntget(old->pwdmnt);
+ 		fs->pwd = dget(old->pwd);
+ 		if (old->altroot) {
++			PIN(old->altroot, old->altrootmnt, 1);
+ 			fs->altrootmnt = mntget(old->altrootmnt);
+ 			fs->altroot = dget(old->altroot);
+ 		} else {
+--- linux/kernel/exit.c~vfs_intent-2.4.20-hp	Sat Jul 12 14:04:49 2003
++++ linux-mmonroe/kernel/exit.c	Sat Jul 12 14:05:24 2003
+@@ -239,11 +239,14 @@ static inline void __put_fs_struct(struc
+ {
+ 	/* No need to hold fs->lock if we are killing it */
+ 	if (atomic_dec_and_test(&fs->count)) {
++		UNPIN(fs->pwd, fs->pwdmnt, 0);
++		UNPIN(fs->root, fs->rootmnt, 1);
+ 		dput(fs->root);
+ 		mntput(fs->rootmnt);
+ 		dput(fs->pwd);
+ 		mntput(fs->pwdmnt);
+ 		if (fs->altroot) {
++			UNPIN(fs->altroot, fs->altrootmnt, 1);
+ 			dput(fs->altroot);
+ 			mntput(fs->altrootmnt);
+ 		}
+
+_
diff --git a/lustre/kernel_patches/patches/vfs_intent_2.4.20_chaos.patch b/lustre/kernel_patches/patches/vfs_intent_2.4.20_chaos.patch
new file mode 100644
index 0000000000..3d6dd56c52
--- /dev/null
+++ b/lustre/kernel_patches/patches/vfs_intent_2.4.20_chaos.patch
@@ -0,0 +1,1716 @@
+ fs/dcache.c               |   19 ++
+ fs/exec.c                 |   15 +-
+ fs/namei.c                |  324 ++++++++++++++++++++++++++++++++++++++--------
+ fs/namespace.c            |   28 ++-
+ fs/open.c                 |  126 +++++++++++++++--
+ fs/proc/base.c            |    3 
+ fs/stat.c                 |   26 ++-
+ include/linux/dcache.h    |   54 +++++++
+ include/linux/fs.h        |   30 +++-
+ include/linux/fs_struct.h |    4 
+ kernel/exit.c             |    3 
+ kernel/fork.c             |    3 
+ kernel/ksyms.c            |    1 
+ 13 files changed, 538 insertions(+), 98 deletions(-)
+
+--- kernel-2.4.20-6chaos_18_7/fs/exec.c~vfs_intent_2.4.20_chaos	Thu Jun 19 10:06:09 2003
++++ kernel-2.4.20-6chaos_18_7-shaver/fs/exec.c	Wed Jul 16 04:21:21 2003
+@@ -113,8 +113,9 @@ asmlinkage long sys_uselib(const char * 
+ 	struct file * file;
+ 	struct nameidata nd;
+ 	int error;
++	struct lookup_intent it = { .it_op = IT_OPEN, .it_flags = O_RDONLY };
+ 
+-	error = user_path_walk(library, &nd);
++	error = user_path_walk_it(library, &nd, &it);
+ 	if (error)
+ 		goto out;
+ 
+@@ -126,7 +127,8 @@ asmlinkage long sys_uselib(const char * 
+ 	if (error)
+ 		goto exit;
+ 
+-	file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
++	file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
++	intent_release(&it);
+ 	error = PTR_ERR(file);
+ 	if (IS_ERR(file))
+ 		goto out;
+@@ -381,8 +383,9 @@ struct file *open_exec(const char *name)
+ 	struct inode *inode;
+ 	struct file *file;
+ 	int err = 0;
++	struct lookup_intent it = { .it_op = IT_OPEN, .it_flags = O_RDONLY };
+ 
+-	err = path_lookup(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
++	err = path_lookup_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
+ 	file = ERR_PTR(err);
+ 	if (!err) {
+ 		inode = nd.dentry->d_inode;
+@@ -394,7 +397,8 @@ struct file *open_exec(const char *name)
+ 				err = -EACCES;
+ 			file = ERR_PTR(err);
+ 			if (!err) {
+-				file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
++				file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
++				intent_release(&it);
+ 				if (!IS_ERR(file)) {
+ 					err = deny_write_access(file);
+ 					if (err) {
+@@ -406,6 +410,7 @@ out:
+ 				return file;
+ 			}
+ 		}
++		intent_release(&it);
+ 		path_release(&nd);
+ 	}
+ 	goto out;
+@@ -1134,7 +1139,7 @@ int do_coredump(long signr, struct pt_re
+ 		goto close_fail;
+ 	if (!file->f_op->write)
+ 		goto close_fail;
+-	if (do_truncate(file->f_dentry, 0) != 0)
++	if (do_truncate(file->f_dentry, 0, 0) != 0)
+ 		goto close_fail;
+ 
+ 	retval = binfmt->core_dump(signr, regs, file);
+--- kernel-2.4.20-6chaos_18_7/fs/dcache.c~vfs_intent_2.4.20_chaos	Thu May 15 20:14:24 2003
++++ kernel-2.4.20-6chaos_18_7-shaver/fs/dcache.c	Wed Jul 16 04:21:21 2003
+@@ -186,6 +186,13 @@ int d_invalidate(struct dentry * dentry)
+ 		spin_unlock(&dcache_lock);
+ 		return 0;
+ 	}
++
++	/* network invalidation by Lustre */
++	if (dentry->d_flags & DCACHE_LUSTRE_INVALID) {
++		spin_unlock(&dcache_lock);
++		return 0;
++	}
++
+ 	/*
+ 	 * Check whether to do a partial shrink_dcache
+ 	 * to get rid of unused child entries.
+@@ -839,13 +846,19 @@ void d_delete(struct dentry * dentry)
+  * Adds a dentry to the hash according to its name.
+  */
+  
+-void d_rehash(struct dentry * entry)
++void __d_rehash(struct dentry * entry, int lock)
+ {
+ 	struct list_head *list = d_hash(entry->d_parent, entry->d_name.hash);
+ 	if (!list_empty(&entry->d_hash)) BUG();
+-	spin_lock(&dcache_lock);
++	if (lock) spin_lock(&dcache_lock);
+ 	list_add(&entry->d_hash, list);
+-	spin_unlock(&dcache_lock);
++	if (lock) spin_unlock(&dcache_lock);
++}
++EXPORT_SYMBOL(__d_rehash);
++
++void d_rehash(struct dentry * entry)
++{
++	__d_rehash(entry, 1);
+ }
+ 
+ #define do_switch(x,y) do { \
+--- kernel-2.4.20-6chaos_18_7/fs/namespace.c~vfs_intent_2.4.20_chaos	Thu May 15 20:14:25 2003
++++ kernel-2.4.20-6chaos_18_7-shaver/fs/namespace.c	Wed Jul 16 04:21:21 2003
+@@ -99,6 +99,7 @@ static void detach_mnt(struct vfsmount *
+ {
+ 	old_nd->dentry = mnt->mnt_mountpoint;
+ 	old_nd->mnt = mnt->mnt_parent;
++	UNPIN(old_nd->dentry, old_nd->mnt, 1);
+ 	mnt->mnt_parent = mnt;
+ 	mnt->mnt_mountpoint = mnt->mnt_root;
+ 	list_del_init(&mnt->mnt_child);
+@@ -110,6 +111,7 @@ static void attach_mnt(struct vfsmount *
+ {
+ 	mnt->mnt_parent = mntget(nd->mnt);
+ 	mnt->mnt_mountpoint = dget(nd->dentry);
++	PIN(nd->dentry, nd->mnt, 1);
+ 	list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry));
+ 	list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts);
+ 	nd->dentry->d_mounted++;
+@@ -485,14 +487,17 @@ static int do_loopback(struct nameidata 
+ {
+ 	struct nameidata old_nd;
+ 	struct vfsmount *mnt = NULL;
++	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 	int err = mount_is_safe(nd);
+ 	if (err)
+ 		return err;
+ 	if (!old_name || !*old_name)
+ 		return -EINVAL;
+-	err = path_lookup(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd);
+-	if (err)
++	err = path_lookup_it(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd, &it);
++	if (err) {
++		intent_release(&it);
+ 		return err;
++	}
+ 
+ 	down_write(&current->namespace->sem);
+ 	err = -EINVAL;
+@@ -515,6 +520,7 @@ static int do_loopback(struct nameidata 
+ 	}
+ 
+ 	up_write(&current->namespace->sem);
++	intent_release(&it);
+ 	path_release(&old_nd);
+ 	return err;
+ }
+@@ -698,6 +704,7 @@ long do_mount(char * dev_name, char * di
+ 		  unsigned long flags, void *data_page)
+ {
+ 	struct nameidata nd;
++	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 	int retval = 0;
+ 	int mnt_flags = 0;
+ 
+@@ -722,10 +729,11 @@ long do_mount(char * dev_name, char * di
+ 	flags &= ~(MS_NOSUID|MS_NOEXEC|MS_NODEV);
+ 
+ 	/* ... and get the mountpoint */
+-	retval = path_lookup(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
+-	if (retval)
++	retval = path_lookup_it(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
++	if (retval) {
++		intent_release(&it);
+ 		return retval;
+-
++	}
+ 	if (flags & MS_REMOUNT)
+ 		retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags,
+ 				    data_page);
+@@ -736,6 +744,8 @@ long do_mount(char * dev_name, char * di
+ 	else
+ 		retval = do_add_mount(&nd, type_page, flags, mnt_flags,
+ 				      dev_name, data_page);
++
++	intent_release(&it);
+ 	path_release(&nd);
+ 	return retval;
+ }
+@@ -901,6 +911,8 @@ asmlinkage long sys_pivot_root(const cha
+ {
+ 	struct vfsmount *tmp;
+ 	struct nameidata new_nd, old_nd, parent_nd, root_parent, user_nd;
++	struct lookup_intent new_it = { .it_op = IT_GETATTR };
++	struct lookup_intent old_it = { .it_op = IT_GETATTR };
+ 	int error;
+ 
+ 	if (!capable(CAP_SYS_ADMIN))
+@@ -908,14 +920,14 @@ asmlinkage long sys_pivot_root(const cha
+ 
+ 	lock_kernel();
+ 
+-	error = __user_walk(new_root, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd);
++	error = __user_walk_it(new_root, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd, &new_it);
+ 	if (error)
+ 		goto out0;
+ 	error = -EINVAL;
+ 	if (!check_mnt(new_nd.mnt))
+ 		goto out1;
+ 
+-	error = __user_walk(put_old, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd);
++	error = __user_walk_it(put_old, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd, &old_it);
+ 	if (error)
+ 		goto out1;
+ 
+@@ -970,8 +982,10 @@ out2:
+ 	up(&old_nd.dentry->d_inode->i_zombie);
+ 	up_write(&current->namespace->sem);
+ 	path_release(&user_nd);
++	intent_release(&old_it);
+ 	path_release(&old_nd);
+ out1:
++	intent_release(&new_it);
+ 	path_release(&new_nd);
+ out0:
+ 	unlock_kernel();
+--- kernel-2.4.20-6chaos_18_7/fs/namei.c~vfs_intent_2.4.20_chaos	Thu May 15 20:14:25 2003
++++ kernel-2.4.20-6chaos_18_7-shaver/fs/namei.c	Wed Jul 16 04:21:21 2003
+@@ -94,6 +94,13 @@
+  * XEmacs seems to be relying on it...
+  */
+ 
++void intent_release(struct lookup_intent *it)
++{
++	if (it && it->it_op_release)
++		it->it_op_release(it);
++
++}
++
+ /* In order to reduce some races, while at the same time doing additional
+  * checking and hopefully speeding things up, we copy filenames to the
+  * kernel data space before using them..
+@@ -260,10 +267,19 @@ void path_release(struct nameidata *nd)
+  * Internal lookup() using the new generic dcache.
+  * SMP-safe
+  */
+-static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags)
++static struct dentry *cached_lookup(struct dentry *parent, struct qstr *name,
++				    int flags, struct lookup_intent *it)
+ {
+ 	struct dentry * dentry = d_lookup(parent, name);
+ 
++	if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
++		if (!dentry->d_op->d_revalidate_it(dentry, flags, it) &&
++		    !d_invalidate(dentry)) {
++			dput(dentry);
++			dentry = NULL;
++		}
++		return dentry;
++	} else
+ 	if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
+ 		if (!dentry->d_op->d_revalidate(dentry, flags) && !d_invalidate(dentry)) {
+ 			dput(dentry);
+@@ -281,11 +297,14 @@ static struct dentry * cached_lookup(str
+  * make sure that nobody added the entry to the dcache in the meantime..
+  * SMP-safe
+  */
+-static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags)
++static struct dentry *real_lookup(struct dentry *parent, struct qstr *name,
++				  int flags, struct lookup_intent *it)
+ {
+ 	struct dentry * result;
+ 	struct inode *dir = parent->d_inode;
+ 
++again:
++
+ 	down(&dir->i_sem);
+ 	/*
+ 	 * First re-do the cached lookup just in case it was created
+@@ -300,6 +319,9 @@ static struct dentry * real_lookup(struc
+ 		result = ERR_PTR(-ENOMEM);
+ 		if (dentry) {
+ 			lock_kernel();
++			if (dir->i_op->lookup_it)
++				result = dir->i_op->lookup_it(dir, dentry, it, flags);
++			else
+ 			result = dir->i_op->lookup(dir, dentry);
+ 			unlock_kernel();
+ 			if (result)
+@@ -321,6 +343,12 @@ static struct dentry * real_lookup(struc
+ 			dput(result);
+ 			result = ERR_PTR(-ENOENT);
+ 		}
++	} else if (result->d_op && result->d_op->d_revalidate_it) {
++		if (!result->d_op->d_revalidate_it(result, flags, it) &&
++		    !d_invalidate(result)) {
++			dput(result);
++			goto again;
++		}
+ 	}
+ 	return result;
+ }
+@@ -334,7 +362,8 @@ int max_recursive_link = 5;
+  * Without that kind of total limit, nasty chains of consecutive
+  * symlinks can cause almost arbitrarily long lookups. 
+  */
+-static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd)
++static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd,
++				 struct lookup_intent *it)
+ {
+ 	int err;
+ 	if (current->link_count >= max_recursive_link)
+@@ -348,10 +377,18 @@ static inline int do_follow_link(struct 
+ 	current->link_count++;
+ 	current->total_link_count++;
+ 	UPDATE_ATIME(dentry->d_inode);
++	nd->it = it;
+ 	err = dentry->d_inode->i_op->follow_link(dentry, nd);
++	if (!err && it != NULL && !(it->it_int_flags & IT_FL_FOLLOWED)) {
++		/* vfs_follow_link was never called */
++		intent_release(it);
++		path_release(nd);
++		err = -ENOLINK;
++	}
+ 	current->link_count--;
+ 	return err;
+ loop:
++	intent_release(it);
+ 	path_release(nd);
+ 	return -ELOOP;
+ }
+@@ -381,15 +418,26 @@ int follow_up(struct vfsmount **mnt, str
+ 	return __follow_up(mnt, dentry);
+ }
+ 
+-static inline int __follow_down(struct vfsmount **mnt, struct dentry **dentry)
++static inline int __follow_down(struct vfsmount **mnt, struct dentry **dentry,
++				struct lookup_intent *it)
+ {
+ 	struct vfsmount *mounted;
+ 
+ 	spin_lock(&dcache_lock);
+ 	mounted = lookup_mnt(*mnt, *dentry);
+ 	if (mounted) {
++		int opc = 0, mode = 0;
+ 		*mnt = mntget(mounted);
+ 		spin_unlock(&dcache_lock);
++		if (it) {
++			opc = it->it_op;
++			mode = it->it_mode;
++		}
++		intent_release(it);
++		if (it) {
++			it->it_op = opc;
++			it->it_mode = mode;
++		}
+ 		dput(*dentry);
+ 		mntput(mounted->mnt_parent);
+ 		*dentry = dget(mounted->mnt_root);
+@@ -401,7 +449,7 @@ static inline int __follow_down(struct v
+ 
+ int follow_down(struct vfsmount **mnt, struct dentry **dentry)
+ {
+-	return __follow_down(mnt,dentry);
++	return __follow_down(mnt,dentry,NULL);
+ }
+  
+ static inline void follow_dotdot(struct nameidata *nd)
+@@ -437,7 +485,7 @@ static inline void follow_dotdot(struct 
+ 		mntput(nd->mnt);
+ 		nd->mnt = parent;
+ 	}
+-	while (d_mountpoint(nd->dentry) && __follow_down(&nd->mnt, &nd->dentry))
++	while (d_mountpoint(nd->dentry) && __follow_down(&nd->mnt, &nd->dentry, NULL))
+ 		;
+ }
+ 
+@@ -449,7 +497,8 @@ static inline void follow_dotdot(struct 
+  *
+  * We expect 'base' to be positive and a directory.
+  */
+-int link_path_walk(const char * name, struct nameidata *nd)
++int link_path_walk_it(const char *name, struct nameidata *nd,
++		      struct lookup_intent *it)
+ {
+ 	struct dentry *dentry;
+ 	struct inode *inode;
+@@ -526,19 +575,18 @@ int link_path_walk(const char * name, st
+ 				break;
+ 		}
+ 		/* This does the actual lookups.. */
+-		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
++		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL);
+ 		if (!dentry) {
+ 			err = -EWOULDBLOCKIO;
+ 			if (atomic)
+ 				break;
+-			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
++			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL);
+ 			err = PTR_ERR(dentry);
+ 			if (IS_ERR(dentry))
+ 				break;
+ 		}
+ 		/* Check mountpoints.. */
+-		while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry))
+-			;
++		while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry, NULL));
+ 
+ 		err = -ENOENT;
+ 		inode = dentry->d_inode;
+@@ -549,7 +597,7 @@ int link_path_walk(const char * name, st
+ 			goto out_dput;
+ 
+ 		if (inode->i_op->follow_link) {
+-			err = do_follow_link(dentry, nd);
++			err = do_follow_link(dentry, nd, NULL);
+ 			dput(dentry);
+ 			if (err)
+ 				goto return_err;
+@@ -565,7 +613,7 @@ int link_path_walk(const char * name, st
+ 			nd->dentry = dentry;
+ 		}
+ 		err = -ENOTDIR; 
+-		if (!inode->i_op->lookup)
++		if (!inode->i_op->lookup && !inode->i_op->lookup_it)
+ 			break;
+ 		continue;
+ 		/* here ends the main loop */
+@@ -592,22 +640,22 @@ last_component:
+ 			if (err < 0)
+ 				break;
+ 		}
+-		dentry = cached_lookup(nd->dentry, &this, 0);
++		dentry = cached_lookup(nd->dentry, &this, 0, it);
+ 		if (!dentry) {
+ 			err = -EWOULDBLOCKIO;
+ 			if (atomic)
+ 				break;
+-			dentry = real_lookup(nd->dentry, &this, 0);
++			dentry = real_lookup(nd->dentry, &this, 0, it);
+ 			err = PTR_ERR(dentry);
+ 			if (IS_ERR(dentry))
+ 				break;
+ 		}
+-		while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry))
++		while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry, it))
+ 			;
+ 		inode = dentry->d_inode;
+ 		if ((lookup_flags & LOOKUP_FOLLOW)
+ 		    && inode && inode->i_op && inode->i_op->follow_link) {
+-			err = do_follow_link(dentry, nd);
++			err = do_follow_link(dentry, nd, it);
+ 			dput(dentry);
+ 			if (err)
+ 				goto return_err;
+@@ -621,7 +669,8 @@ last_component:
+ 			goto no_inode;
+ 		if (lookup_flags & LOOKUP_DIRECTORY) {
+ 			err = -ENOTDIR; 
+-			if (!inode->i_op || !inode->i_op->lookup)
++			if (!inode->i_op ||
++			    (!inode->i_op->lookup && !inode->i_op->lookup_it))
+ 				break;
+ 		}
+ 		goto return_base;
+@@ -645,6 +694,23 @@ return_reval:
+ 		 * Check the cached dentry for staleness.
+ 		 */
+ 		dentry = nd->dentry;
++	revalidate_again:
++		if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
++			err = -ESTALE;
++			if (!dentry->d_op->d_revalidate_it(dentry, 0, it)) {
++				struct dentry *new;
++				err = permission(dentry->d_parent->d_inode,
++						 MAY_EXEC);
++				if (err)
++					break;
++				new = real_lookup(dentry->d_parent,
++						  &dentry->d_name, 0, NULL);
++				d_invalidate(dentry);
++				dput(dentry);
++				dentry = new;
++				goto revalidate_again;
++			}
++		} else
+ 		if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
+ 			err = -ESTALE;
+ 			if (!dentry->d_op->d_revalidate(dentry, 0)) {
+@@ -658,15 +724,28 @@ out_dput:
+ 		dput(dentry);
+ 		break;
+ 	}
++	if (err)
++		intent_release(it);
+ 	path_release(nd);
+ return_err:
+ 	return err;
+ }
+ 
++int link_path_walk(const char * name, struct nameidata *nd)
++{
++	return link_path_walk_it(name, nd, NULL);
++}
++
++int path_walk_it(const char * name, struct nameidata *nd, struct lookup_intent *it)
++{
++	current->total_link_count = 0;
++	return link_path_walk_it(name, nd, it);
++}
++
+ int path_walk(const char * name, struct nameidata *nd)
+ {
+ 	current->total_link_count = 0;
+-	return link_path_walk(name, nd);
++	return link_path_walk_it(name, nd, NULL);
+ }
+ 
+ /* SMP-safe */
+@@ -751,6 +830,17 @@ walk_init_root(const char *name, struct 
+ }
+ 
+ /* SMP-safe */
++int path_lookup_it(const char *path, unsigned flags, struct nameidata *nd,
++		   struct lookup_intent *it)
++{
++	int error = 0;
++	if (path_init(path, flags, nd))
++		error = path_walk_it(path, nd, it);
++	return error;
++}
++
++
++/* SMP-safe */
+ int path_lookup(const char *path, unsigned flags, struct nameidata *nd)
+ {
+ 	int error = 0;
+@@ -765,6 +855,7 @@ int path_init(const char *name, unsigned
+ {
+ 	nd->last_type = LAST_ROOT; /* if there are only slashes... */
+ 	nd->flags = flags;
++	nd->it = NULL;
+ 	if (*name=='/')
+ 		return walk_init_root(name,nd);
+ 	read_lock(&current->fs->lock);
+@@ -779,7 +870,8 @@ int path_init(const char *name, unsigned
+  * needs parent already locked. Doesn't follow mounts.
+  * SMP-safe.
+  */
+-struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
++struct dentry * lookup_hash_it(struct qstr *name, struct dentry * base,
++			       struct lookup_intent *it)
+ {
+ 	struct dentry * dentry;
+ 	struct inode *inode;
+@@ -802,13 +894,16 @@ struct dentry * lookup_hash(struct qstr 
+ 			goto out;
+ 	}
+ 
+-	dentry = cached_lookup(base, name, 0);
++	dentry = cached_lookup(base, name, 0, it);
+ 	if (!dentry) {
+ 		struct dentry *new = d_alloc(base, name);
+ 		dentry = ERR_PTR(-ENOMEM);
+ 		if (!new)
+ 			goto out;
+ 		lock_kernel();
++		if (inode->i_op->lookup_it)
++			dentry = inode->i_op->lookup_it(inode, new, it, 0);
++		else
+ 		dentry = inode->i_op->lookup(inode, new);
+ 		unlock_kernel();
+ 		if (!dentry)
+@@ -820,6 +915,12 @@ out:
+ 	return dentry;
+ }
+ 
++struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
++{
++	return lookup_hash_it(name, base, NULL);
++}
++
++
+ /* SMP-safe */
+ struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
+ {
+@@ -841,7 +942,7 @@ struct dentry * lookup_one_len(const cha
+ 	}
+ 	this.hash = end_name_hash(hash);
+ 
+-	return lookup_hash(&this, base);
++	return lookup_hash_it(&this, base, NULL);
+ access:
+ 	return ERR_PTR(-EACCES);
+ }
+@@ -872,6 +973,23 @@ int __user_walk(const char *name, unsign
+ 	return err;
+ }
+ 
++int __user_walk_it(const char *name, unsigned flags, struct nameidata *nd,
++		   struct lookup_intent *it)
++{
++	char *tmp;
++	int err;
++
++	tmp = getname(name);
++	err = PTR_ERR(tmp);
++	if (!IS_ERR(tmp)) {
++		err = 0;
++		if (path_init(tmp, flags, nd))
++			err = path_walk_it(tmp, nd, it);
++		putname(tmp);
++	}
++	return err;
++}
++
+ /*
+  * It's inline, so penalty for filesystems that don't use sticky bit is
+  * minimal.
+@@ -969,7 +1087,8 @@ static inline int lookup_flags(unsigned 
+ 	return retval;
+ }
+ 
+-int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
++static int vfs_create_it(struct inode *dir, struct dentry *dentry, int mode,
++			 struct lookup_intent *it)
+ {
+ 	int error;
+ 
+@@ -982,12 +1101,15 @@ int vfs_create(struct inode *dir, struct
+ 		goto exit_lock;
+ 
+ 	error = -EACCES;	/* shouldn't it be ENOSYS? */
+-	if (!dir->i_op || !dir->i_op->create)
++	if (!dir->i_op || (!dir->i_op->create && !dir->i_op->create_it))
+ 		goto exit_lock;
+ 
+ 	DQUOT_INIT(dir);
+ 	lock_kernel();
+-	error = dir->i_op->create(dir, dentry, mode);
++	if (dir->i_op->create_it)
++		error = dir->i_op->create_it(dir, dentry, mode, it);
++	else
++		error = dir->i_op->create(dir, dentry, mode);
+ 	unlock_kernel();
+ exit_lock:
+ 	up(&dir->i_zombie);
+@@ -996,6 +1118,11 @@ exit_lock:
+ 	return error;
+ }
+ 
++int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
++{
++	return vfs_create_it(dir, dentry, mode, NULL);
++}
++
+ /*
+  *	open_namei()
+  *
+@@ -1010,7 +1137,8 @@ exit_lock:
+  * for symlinks (where the permissions are checked later).
+  * SMP-safe
+  */
+-int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd)
++int open_namei_it(const char *pathname, int flag, int mode,
++		  struct nameidata *nd, struct lookup_intent *it)
+ {
+ 	int acc_mode, error = 0;
+ 	struct inode *inode;
+@@ -1024,7 +1152,7 @@ int open_namei(const char * pathname, in
+ 	 * The simplest case - just a plain lookup.
+ 	 */
+ 	if (!(flag & O_CREAT)) {
+-		error = path_lookup(pathname, lookup_flags(flag), nd);
++		error = path_lookup_it(pathname, lookup_flags(flag), nd, it);
+ 		if (error)
+ 			return error;
+ 		dentry = nd->dentry;
+@@ -1034,6 +1162,10 @@ int open_namei(const char * pathname, in
+ 	/*
+ 	 * Create - we need to know the parent.
+ 	 */
++ 	if (it) {
++ 		it->it_mode = mode;
++ 		it->it_op |= IT_CREAT;
++ 	}
+ 	error = path_lookup(pathname, LOOKUP_PARENT, nd);
+ 	if (error)
+ 		return error;
+@@ -1049,7 +1181,7 @@ int open_namei(const char * pathname, in
+ 
+ 	dir = nd->dentry;
+ 	down(&dir->d_inode->i_sem);
+-	dentry = lookup_hash(&nd->last, nd->dentry);
++	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
+ 
+ do_last:
+ 	error = PTR_ERR(dentry);
+@@ -1058,10 +1190,11 @@ do_last:
+ 		goto exit;
+ 	}
+ 
++	it->it_mode = mode;
+ 	/* Negative dentry, just create the file */
+ 	if (!dentry->d_inode) {
+-		error = vfs_create(dir->d_inode, dentry,
+-				   mode & ~current->fs->umask);
++		error = vfs_create_it(dir->d_inode, dentry,
++				   mode & ~current->fs->umask, it);
+ 		up(&dir->d_inode->i_sem);
+ 		dput(nd->dentry);
+ 		nd->dentry = dentry;
+@@ -1086,7 +1219,7 @@ do_last:
+ 		error = -ELOOP;
+ 		if (flag & O_NOFOLLOW)
+ 			goto exit_dput;
+-		while (__follow_down(&nd->mnt,&dentry) && d_mountpoint(dentry));
++		while (__follow_down(&nd->mnt,&dentry,it) && d_mountpoint(dentry));
+ 	}
+ 	error = -ENOENT;
+ 	if (!dentry->d_inode)
+@@ -1165,7 +1298,7 @@ ok:
+ 		if (!error) {
+ 			DQUOT_INIT(inode);
+ 			
+-			error = do_truncate(dentry, 0);
++			error = do_truncate(dentry, 0, 1);
+ 		}
+ 		put_write_access(inode);
+ 		if (error)
+@@ -1177,8 +1310,10 @@ ok:
+ 	return 0;
+ 
+ exit_dput:
++	intent_release(it);
+ 	dput(dentry);
+ exit:
++	intent_release(it);
+ 	path_release(nd);
+ 	return error;
+ 
+@@ -1197,7 +1332,16 @@ do_link:
+ 	 * are done. Procfs-like symlinks just set LAST_BIND.
+ 	 */
+ 	UPDATE_ATIME(dentry->d_inode);
++	nd->it = it;
+ 	error = dentry->d_inode->i_op->follow_link(dentry, nd);
++	if (error) {
++		intent_release(it);
++	} else if (it != NULL && !(it->it_int_flags & IT_FL_FOLLOWED)) {
++		/* vfs_follow_link was never called */
++		intent_release(it);
++		path_release(nd);
++		error = -ENOLINK;
++	}
+ 	dput(dentry);
+ 	if (error)
+ 		return error;
+@@ -1219,13 +1363,20 @@ do_link:
+ 	}
+ 	dir = nd->dentry;
+ 	down(&dir->d_inode->i_sem);
+-	dentry = lookup_hash(&nd->last, nd->dentry);
++	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
+ 	putname(nd->last.name);
+ 	goto do_last;
+ }
+ 
++int open_namei(const char *pathname, int flag, int mode, struct nameidata *nd)
++{
++	return open_namei_it(pathname, flag, mode, nd, NULL);
++}
++
++
+ /* SMP-safe */
+-static struct dentry *lookup_create(struct nameidata *nd, int is_dir)
++static struct dentry *lookup_create(struct nameidata *nd, int is_dir,
++				    struct lookup_intent *it)
+ {
+ 	struct dentry *dentry;
+ 
+@@ -1233,7 +1384,7 @@ static struct dentry *lookup_create(stru
+ 	dentry = ERR_PTR(-EEXIST);
+ 	if (nd->last_type != LAST_NORM)
+ 		goto fail;
+-	dentry = lookup_hash(&nd->last, nd->dentry);
++	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
+ 	if (IS_ERR(dentry))
+ 		goto fail;
+ 	if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
+@@ -1289,7 +1440,16 @@ asmlinkage long sys_mknod(const char * f
+ 	error = path_lookup(tmp, LOOKUP_PARENT, &nd);
+ 	if (error)
+ 		goto out;
+-	dentry = lookup_create(&nd, 0);
++
++	if (nd.dentry->d_inode->i_op->mknod_raw) {
++		struct inode_operations *op = nd.dentry->d_inode->i_op;
++		error = op->mknod_raw(&nd, mode, dev);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			goto out2;
++	}
++
++	dentry = lookup_create(&nd, 0, NULL);
+ 	error = PTR_ERR(dentry);
+ 
+ 	mode &= ~current->fs->umask;
+@@ -1310,6 +1470,7 @@ asmlinkage long sys_mknod(const char * f
+ 		dput(dentry);
+ 	}
+ 	up(&nd.dentry->d_inode->i_sem);
++out2:
+ 	path_release(&nd);
+ out:
+ 	putname(tmp);
+@@ -1357,7 +1518,14 @@ asmlinkage long sys_mkdir(const char * p
+ 		error = path_lookup(tmp, LOOKUP_PARENT, &nd);
+ 		if (error)
+ 			goto out;
+-		dentry = lookup_create(&nd, 1);
++ 		if (nd.dentry->d_inode->i_op->mkdir_raw) {
++ 			struct inode_operations *op = nd.dentry->d_inode->i_op;
++ 			error = op->mkdir_raw(&nd, mode);
++ 			/* the file system wants to use normal vfs path now */
++ 			if (error != -EOPNOTSUPP)
++ 				goto out2;
++ 		}
++		dentry = lookup_create(&nd, 1, NULL);
+ 		error = PTR_ERR(dentry);
+ 		if (!IS_ERR(dentry)) {
+ 			error = vfs_mkdir(nd.dentry->d_inode, dentry,
+@@ -1365,6 +1533,7 @@ asmlinkage long sys_mkdir(const char * p
+ 			dput(dentry);
+ 		}
+ 		up(&nd.dentry->d_inode->i_sem);
++out2:
+ 		path_release(&nd);
+ out:
+ 		putname(tmp);
+@@ -1465,8 +1634,16 @@ asmlinkage long sys_rmdir(const char * p
+ 			error = -EBUSY;
+ 			goto exit1;
+ 	}
++ 	if (nd.dentry->d_inode->i_op->rmdir_raw) {
++ 		struct inode_operations *op = nd.dentry->d_inode->i_op;
++
++ 		error = op->rmdir_raw(&nd);
++ 		/* the file system wants to use normal vfs path now */
++ 		if (error != -EOPNOTSUPP)
++ 			goto exit1;
++ 	}
+ 	down(&nd.dentry->d_inode->i_sem);
+-	dentry = lookup_hash(&nd.last, nd.dentry);
++	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
+ 	error = PTR_ERR(dentry);
+ 	if (!IS_ERR(dentry)) {
+ 		error = vfs_rmdir(nd.dentry->d_inode, dentry);
+@@ -1524,8 +1701,15 @@ asmlinkage long sys_unlink(const char * 
+ 	error = -EISDIR;
+ 	if (nd.last_type != LAST_NORM)
+ 		goto exit1;
++ 	if (nd.dentry->d_inode->i_op->unlink_raw) {
++ 		struct inode_operations *op = nd.dentry->d_inode->i_op;
++ 		error = op->unlink_raw(&nd);
++ 		/* the file system wants to use normal vfs path now */
++ 		if (error != -EOPNOTSUPP)
++ 			goto exit1;
++ 	}
+ 	down(&nd.dentry->d_inode->i_sem);
+-	dentry = lookup_hash(&nd.last, nd.dentry);
++	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
+ 	error = PTR_ERR(dentry);
+ 	if (!IS_ERR(dentry)) {
+ 		/* Why not before? Because we want correct error value */
+@@ -1592,15 +1776,23 @@ asmlinkage long sys_symlink(const char *
+ 		error = path_lookup(to, LOOKUP_PARENT, &nd);
+ 		if (error)
+ 			goto out;
+-		dentry = lookup_create(&nd, 0);
++		if (nd.dentry->d_inode->i_op->symlink_raw) {
++			struct inode_operations *op = nd.dentry->d_inode->i_op;
++			error = op->symlink_raw(&nd, from);
++			/* the file system wants to use normal vfs path now */
++			if (error != -EOPNOTSUPP)
++				goto out2;
++		}
++		dentry = lookup_create(&nd, 0, NULL);
+ 		error = PTR_ERR(dentry);
+ 		if (!IS_ERR(dentry)) {
+ 			error = vfs_symlink(nd.dentry->d_inode, dentry, from);
+ 			dput(dentry);
+ 		}
+ 		up(&nd.dentry->d_inode->i_sem);
++	out2:
+ 		path_release(&nd);
+-out:
++	out:
+ 		putname(to);
+ 	}
+ 	putname(from);
+@@ -1676,7 +1868,14 @@ asmlinkage long sys_link(const char * ol
+ 		error = -EXDEV;
+ 		if (old_nd.mnt != nd.mnt)
+ 			goto out_release;
+-		new_dentry = lookup_create(&nd, 0);
++		if (nd.dentry->d_inode->i_op->link_raw) {
++			struct inode_operations *op = nd.dentry->d_inode->i_op;
++			error = op->link_raw(&old_nd, &nd);
++			/* the file system wants to use normal vfs path now */
++			if (error != -EOPNOTSUPP)
++				goto out_release;
++		}
++		new_dentry = lookup_create(&nd, 0, NULL);
+ 		error = PTR_ERR(new_dentry);
+ 		if (!IS_ERR(new_dentry)) {
+ 			error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);
+@@ -1720,7 +1919,7 @@ exit:
+  *	   locking].
+  */
+ int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
+-	       struct inode *new_dir, struct dentry *new_dentry)
++		   struct inode *new_dir, struct dentry *new_dentry)
+ {
+ 	int error;
+ 	struct inode *target;
+@@ -1799,7 +1998,7 @@ out_unlock:
+ }
+ 
+ int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
+-	       struct inode *new_dir, struct dentry *new_dentry)
++		     struct inode *new_dir, struct dentry *new_dentry)
+ {
+ 	int error;
+ 
+@@ -1887,9 +2086,18 @@ static inline int do_rename(const char *
+ 	if (newnd.last_type != LAST_NORM)
+ 		goto exit2;
+ 
++ 	if (old_dir->d_inode->i_op->rename_raw) {
++		lock_kernel();
++ 		error = old_dir->d_inode->i_op->rename_raw(&oldnd, &newnd);
++		unlock_kernel();
++ 		/* the file system wants to use normal vfs path now */
++ 		if (error != -EOPNOTSUPP)
++ 			goto exit2;
++ 	}
++
+ 	double_lock(new_dir, old_dir);
+ 
+-	old_dentry = lookup_hash(&oldnd.last, old_dir);
++	old_dentry = lookup_hash_it(&oldnd.last, old_dir, NULL);
+ 	error = PTR_ERR(old_dentry);
+ 	if (IS_ERR(old_dentry))
+ 		goto exit3;
+@@ -1905,16 +2113,16 @@ static inline int do_rename(const char *
+ 		if (newnd.last.name[newnd.last.len])
+ 			goto exit4;
+ 	}
+-	new_dentry = lookup_hash(&newnd.last, new_dir);
++	new_dentry = lookup_hash_it(&newnd.last, new_dir, NULL);
+ 	error = PTR_ERR(new_dentry);
+ 	if (IS_ERR(new_dentry))
+ 		goto exit4;
+ 
++
+ 	lock_kernel();
+ 	error = vfs_rename(old_dir->d_inode, old_dentry,
+ 				   new_dir->d_inode, new_dentry);
+ 	unlock_kernel();
+-
+ 	dput(new_dentry);
+ exit4:
+ 	dput(old_dentry);
+@@ -1965,20 +2173,28 @@ out:
+ }
+ 
+ static inline int
+-__vfs_follow_link(struct nameidata *nd, const char *link)
++__vfs_follow_link(struct nameidata *nd, const char *link,
++		  struct lookup_intent *it)
+ {
+ 	int res = 0;
+ 	char *name;
+ 	if (IS_ERR(link))
+ 		goto fail;
+ 
++	if (it == NULL)
++		it = nd->it;
++	else if (it != nd->it)
++		printk("it != nd->it: tell phil@clusterfs.com\n");
++	if (it != NULL)
++		it->it_int_flags |= IT_FL_FOLLOWED;
++
+ 	if (*link == '/') {
+ 		path_release(nd);
+ 		if (!walk_init_root(link, nd))
+ 			/* weird __emul_prefix() stuff did it */
+ 			goto out;
+ 	}
+-	res = link_path_walk(link, nd);
++	res = link_path_walk_it(link, nd, it);
+ out:
+ 	if (current->link_count || res || nd->last_type!=LAST_NORM)
+ 		return res;
+@@ -2002,7 +2218,13 @@ fail:
+ 
+ int vfs_follow_link(struct nameidata *nd, const char *link)
+ {
+-	return __vfs_follow_link(nd, link);
++	return __vfs_follow_link(nd, link, NULL);
++}
++
++int vfs_follow_link_it(struct nameidata *nd, const char *link,
++		       struct lookup_intent *it)
++{
++	return __vfs_follow_link(nd, link, it);
+ }
+ 
+ /* get the link contents into pagecache */
+@@ -2044,7 +2266,7 @@ int page_follow_link(struct dentry *dent
+ {
+ 	struct page *page = NULL;
+ 	char *s = page_getlink(dentry, &page);
+-	int res = __vfs_follow_link(nd, s);
++	int res = __vfs_follow_link(nd, s, NULL);
+ 	if (page) {
+ 		kunmap(page);
+ 		page_cache_release(page);
+--- kernel-2.4.20-6chaos_18_7/fs/open.c~vfs_intent_2.4.20_chaos	Tue Jun 24 09:11:51 2003
++++ kernel-2.4.20-6chaos_18_7-shaver/fs/open.c	Wed Jul 16 04:21:21 2003
+@@ -19,6 +19,8 @@
+ #include <asm/uaccess.h>
+ 
+ #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
++extern int path_walk_it(const char *name, struct nameidata *nd,
++			struct lookup_intent *it);
+ 
+ int vfs_statfs(struct super_block *sb, struct statfs *buf)
+ {
+@@ -95,9 +97,10 @@ void fd_install(unsigned int fd, struct 
+ 	write_unlock(&files->file_lock);
+ }
+ 
+-int do_truncate(struct dentry *dentry, loff_t length)
++int do_truncate(struct dentry *dentry, loff_t length, int called_from_open)
+ {
+ 	struct inode *inode = dentry->d_inode;
++	struct inode_operations *op = dentry->d_inode->i_op;
+ 	int error;
+ 	struct iattr newattrs;
+ 
+@@ -108,7 +111,13 @@ int do_truncate(struct dentry *dentry, l
+ 	down(&inode->i_sem);
+ 	newattrs.ia_size = length;
+ 	newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
+-	error = notify_change(dentry, &newattrs);
++	if (called_from_open)
++		newattrs.ia_valid |= ATTR_FROM_OPEN;
++	if (op->setattr_raw) {
++		newattrs.ia_valid |= ATTR_RAW;
++		error = op->setattr_raw(inode, &newattrs);
++	} else
++		error = notify_change(dentry, &newattrs);
+ 	up(&inode->i_sem);
+ 	return error;
+ }
+@@ -118,12 +127,13 @@ static inline long do_sys_truncate(const
+ 	struct nameidata nd;
+ 	struct inode * inode;
+ 	int error;
++	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 
+ 	error = -EINVAL;
+ 	if (length < 0)	/* sorry, but loff_t says... */
+ 		goto out;
+ 
+-	error = user_path_walk(path, &nd);
++	error = user_path_walk_it(path, &nd, &it);
+ 	if (error)
+ 		goto out;
+ 	inode = nd.dentry->d_inode;
+@@ -163,11 +173,13 @@ static inline long do_sys_truncate(const
+ 	error = locks_verify_truncate(inode, NULL, length);
+ 	if (!error) {
+ 		DQUOT_INIT(inode);
+-		error = do_truncate(nd.dentry, length);
++		intent_release(&it);
++		error = do_truncate(nd.dentry, length, 0);
+ 	}
+ 	put_write_access(inode);
+ 
+ dput_and_out:
++	intent_release(&it);
+ 	path_release(&nd);
+ out:
+ 	return error;
+@@ -215,7 +227,7 @@ static inline long do_sys_ftruncate(unsi
+ 
+ 	error = locks_verify_truncate(inode, file, length);
+ 	if (!error)
+-		error = do_truncate(dentry, length);
++		error = do_truncate(dentry, length, 0);
+ out_putf:
+ 	fput(file);
+ out:
+@@ -260,11 +272,13 @@ asmlinkage long sys_utime(char * filenam
+ 	struct inode * inode;
+ 	struct iattr newattrs;
+ 
+-	error = user_path_walk(filename, &nd);
++	error = user_path_walk_it(filename, &nd, NULL);
+ 	if (error)
+ 		goto out;
+ 	inode = nd.dentry->d_inode;
+ 
++	/* this is safe without a Lustre lock because it only depends
++	   on the super block */
+ 	error = -EROFS;
+ 	if (IS_RDONLY(inode))
+ 		goto dput_and_out;
+@@ -279,11 +293,25 @@ asmlinkage long sys_utime(char * filenam
+ 			goto dput_and_out;
+ 
+ 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
+-	} else {
++	}
++
++	if (inode->i_op->setattr_raw) {
++		struct inode_operations *op = nd.dentry->d_inode->i_op;
++
++		newattrs.ia_valid |= ATTR_RAW;
++		error = op->setattr_raw(inode, &newattrs);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			goto dput_and_out;
++	}
++
++	error = -EPERM;
++	if (!times) {
+ 		if (current->fsuid != inode->i_uid &&
+ 		    (error = permission(inode,MAY_WRITE)) != 0)
+ 			goto dput_and_out;
+ 	}
++
+ 	error = notify_change(nd.dentry, &newattrs);
+ dput_and_out:
+ 	path_release(&nd);
+@@ -304,12 +332,14 @@ asmlinkage long sys_utimes(char * filena
+ 	struct inode * inode;
+ 	struct iattr newattrs;
+ 
+-	error = user_path_walk(filename, &nd);
++	error = user_path_walk_it(filename, &nd, NULL);
+ 
+ 	if (error)
+ 		goto out;
+ 	inode = nd.dentry->d_inode;
+ 
++	/* this is safe without a Lustre lock because it only depends
++	   on the super block */
+ 	error = -EROFS;
+ 	if (IS_RDONLY(inode))
+ 		goto dput_and_out;
+@@ -324,7 +354,20 @@ asmlinkage long sys_utimes(char * filena
+ 		newattrs.ia_atime = times[0].tv_sec;
+ 		newattrs.ia_mtime = times[1].tv_sec;
+ 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
+-	} else {
++	}
++
++	if (inode->i_op->setattr_raw) {
++		struct inode_operations *op = nd.dentry->d_inode->i_op;
++
++		newattrs.ia_valid |= ATTR_RAW;
++		error = op->setattr_raw(inode, &newattrs);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			goto dput_and_out;
++	}
++
++	error = -EPERM;
++	if (!utimes) {
+ 		if (current->fsuid != inode->i_uid &&
+ 		    (error = permission(inode,MAY_WRITE)) != 0)
+ 			goto dput_and_out;
+@@ -347,6 +390,7 @@ asmlinkage long sys_access(const char * 
+ 	int old_fsuid, old_fsgid;
+ 	kernel_cap_t old_cap;
+ 	int res;
++	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 
+ 	if (mode & ~S_IRWXO)	/* where's F_OK, X_OK, W_OK, R_OK? */
+ 		return -EINVAL;
+@@ -364,13 +408,14 @@ asmlinkage long sys_access(const char * 
+ 	else
+ 		current->cap_effective = current->cap_permitted;
+ 
+-	res = user_path_walk(filename, &nd);
++	res = user_path_walk_it(filename, &nd, &it);
+ 	if (!res) {
+ 		res = permission(nd.dentry->d_inode, mode);
+ 		/* SuS v2 requires we report a read only fs too */
+ 		if(!res && (mode & S_IWOTH) && IS_RDONLY(nd.dentry->d_inode)
+ 		   && !special_file(nd.dentry->d_inode->i_mode))
+ 			res = -EROFS;
++		intent_release(&it);
+ 		path_release(&nd);
+ 	}
+ 
+@@ -385,8 +430,9 @@ asmlinkage long sys_chdir(const char * f
+ {
+ 	int error;
+ 	struct nameidata nd;
++ 	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 
+-	error = __user_walk(filename,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd);
++	error = __user_walk_it(filename,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd, &it);
+ 	if (error)
+ 		goto out;
+ 
+@@ -397,6 +443,7 @@ asmlinkage long sys_chdir(const char * f
+ 	set_fs_pwd(current->fs, nd.mnt, nd.dentry);
+ 
+ dput_and_out:
++	intent_release(&it);
+ 	path_release(&nd);
+ out:
+ 	return error;
+@@ -436,9 +483,10 @@ asmlinkage long sys_chroot(const char * 
+ {
+ 	int error;
+ 	struct nameidata nd;
++ 	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 
+-	error = __user_walk(filename, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
+-		      LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
++	error = __user_walk_it(filename, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
++		      LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd, &it);
+ 	if (error)
+ 		goto out;
+ 
+@@ -454,6 +502,7 @@ asmlinkage long sys_chroot(const char * 
+ 	set_fs_altroot();
+ 	error = 0;
+ dput_and_out:
++	intent_release(&it);
+ 	path_release(&nd);
+ out:
+ 	return error;
+@@ -508,6 +557,18 @@ asmlinkage long sys_chmod(const char * f
+ 	if (IS_RDONLY(inode))
+ 		goto dput_and_out;
+ 
++	if (inode->i_op->setattr_raw) {
++		struct inode_operations *op = nd.dentry->d_inode->i_op;
++
++		newattrs.ia_mode = mode;
++		newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
++		newattrs.ia_valid |= ATTR_RAW;
++		error = op->setattr_raw(inode, &newattrs);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			goto dput_and_out;
++	}
++
+ 	error = -EPERM;
+ 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
+ 		goto dput_and_out;
+@@ -538,6 +599,20 @@ static int chown_common(struct dentry * 
+ 	error = -EROFS;
+ 	if (IS_RDONLY(inode))
+ 		goto out;
++
++	if (inode->i_op->setattr_raw) {
++		struct inode_operations *op = dentry->d_inode->i_op;
++
++		newattrs.ia_uid = user;
++		newattrs.ia_gid = group;
++		newattrs.ia_valid = ATTR_UID | ATTR_GID | ATTR_CTIME;
++		newattrs.ia_valid |= ATTR_RAW;
++		error = op->setattr_raw(inode, &newattrs);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			return error;
++	}
++
+ 	error = -EPERM;
+ 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
+ 		goto out;
+@@ -642,8 +717,9 @@ struct file *filp_open(const char * file
+ {
+ 	int namei_flags, error;
+ 	struct nameidata nd;
+-	
+-	flags &= ~O_DIRECT;
++	struct lookup_intent it = { .it_op = IT_OPEN, .it_flags = flags };
++
++	//flags &= ~O_DIRECT;
+ 
+ 	namei_flags = flags;
+ 	if ((namei_flags+1) & O_ACCMODE)
+@@ -651,14 +727,15 @@ struct file *filp_open(const char * file
+ 	if (namei_flags & O_TRUNC)
+ 		namei_flags |= 2;
+ 
+-	error = open_namei(filename, namei_flags, mode, &nd);
+-	if (!error)
+-		return dentry_open(nd.dentry, nd.mnt, flags);
++	error = open_namei_it(filename, namei_flags, mode, &nd, &it);
++	if (error)
++		return ERR_PTR(error);
+ 
+-	return ERR_PTR(error);
++	return dentry_open_it(nd.dentry, nd.mnt, flags, &it);
+ }
+ 
+-struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
++struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt,
++			    int flags, struct lookup_intent *it)
+ {
+ 	struct file * f;
+ 	struct inode *inode;
+@@ -695,12 +772,15 @@ struct file *dentry_open(struct dentry *
+ 	}
+ 
+ 	if (f->f_op && f->f_op->open) {
++		f->f_it = it;
+ 		error = f->f_op->open(inode,f);
++		f->f_it = NULL;
+ 		if (error)
+ 			goto cleanup_all;
+ 	}
+ 	f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
+ 
++	intent_release(it);
+ 	return f;
+ 
+ cleanup_all:
+@@ -715,11 +795,17 @@ cleanup_all:
+ cleanup_file:
+ 	put_filp(f);
+ cleanup_dentry:
++	intent_release(it);
+ 	dput(dentry);
+ 	mntput(mnt);
+ 	return ERR_PTR(error);
+ }
+ 
++struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
++{
++	return dentry_open_it(dentry, mnt, flags, NULL);
++}
++
+ /*
+  * Find an empty file descriptor entry, and mark it busy.
+  */
+--- kernel-2.4.20-6chaos_18_7/fs/stat.c~vfs_intent_2.4.20_chaos	Thu May 15 20:14:25 2003
++++ kernel-2.4.20-6chaos_18_7-shaver/fs/stat.c	Wed Jul 16 04:21:21 2003
+@@ -17,21 +17,23 @@
+  * Revalidate the inode. This is required for proper NFS attribute caching.
+  */
+ static __inline__ int
+-do_revalidate(struct dentry *dentry)
++do_revalidate(struct dentry *dentry, struct lookup_intent *it)
+ {
+ 	struct inode * inode = dentry->d_inode;
+-	if (inode->i_op && inode->i_op->revalidate)
++	if (inode->i_op && inode->i_op->revalidate_it)
++		return inode->i_op->revalidate_it(dentry, it);
++	else if (inode->i_op && inode->i_op->revalidate)
+ 		return inode->i_op->revalidate(dentry);
+ 	return 0;
+ }
+ 
+-static int do_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
++static int do_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat, struct lookup_intent *it)
+ {
+ 	int res = 0;
+ 	unsigned int blocks, indirect;
+ 	struct inode *inode = dentry->d_inode;
+ 
+-	res = do_revalidate(dentry);
++	res = do_revalidate(dentry, it);
+ 	if (res)
+ 		return res;
+ 
+@@ -104,10 +106,12 @@ int vfs_stat(char *name, struct kstat *s
+ {
+ 	struct nameidata nd;
+ 	int error;
++ 	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 
+-	error = user_path_walk(name, &nd);
++	error = user_path_walk_it(name, &nd, &it);
+ 	if (!error) {
+-		error = do_getattr(nd.mnt, nd.dentry, stat);
++		error = do_getattr(nd.mnt, nd.dentry, stat, &it);
++ 		intent_release(&it);
+ 		path_release(&nd);
+ 	}
+ 	return error;
+@@ -117,10 +121,12 @@ int vfs_lstat(char *name, struct kstat *
+ {
+ 	struct nameidata nd;
+ 	int error;
++ 	struct lookup_intent it = { .it_op = IT_GETATTR };
+ 
+-	error = user_path_walk_link(name, &nd);
++	error = user_path_walk_link_it(name, &nd, &it);
+ 	if (!error) {
+-		error = do_getattr(nd.mnt, nd.dentry, stat);
++		error = do_getattr(nd.mnt, nd.dentry, stat, &it);
++ 		intent_release(&it);
+ 		path_release(&nd);
+ 	}
+ 	return error;
+@@ -132,7 +138,7 @@ int vfs_fstat(unsigned int fd, struct ks
+ 	int error = -EBADF;
+ 
+ 	if (f) {
+-		error = do_getattr(f->f_vfsmnt, f->f_dentry, stat);
++		error = do_getattr(f->f_vfsmnt, f->f_dentry, stat, NULL);
+ 		fput(f);
+ 	}
+ 	return error;
+@@ -279,7 +285,7 @@ asmlinkage long sys_readlink(const char 
+ 
+ 		error = -EINVAL;
+ 		if (inode->i_op && inode->i_op->readlink &&
+-		    !(error = do_revalidate(nd.dentry))) {
++		    !(error = do_revalidate(nd.dentry, NULL))) {
+ 			UPDATE_ATIME(inode);
+ 			error = inode->i_op->readlink(nd.dentry, buf, bufsiz);
+ 		}
+--- kernel-2.4.20-6chaos_18_7/fs/proc/base.c~vfs_intent_2.4.20_chaos	Mon Jun 23 05:49:00 2003
++++ kernel-2.4.20-6chaos_18_7-shaver/fs/proc/base.c	Wed Jul 16 04:21:21 2003
+@@ -465,6 +465,9 @@ static int proc_pid_follow_link(struct d
+ 
+ 	error = inode->u.proc_i.op.proc_get_link(inode, &nd->dentry, &nd->mnt);
+ 	nd->last_type = LAST_BIND;
++
++	if (nd->it != NULL)
++		nd->it->it_int_flags |= IT_FL_FOLLOWED;
+ out:
+ 	return error;
+ }
+--- kernel-2.4.20-6chaos_18_7/include/linux/dcache.h~vfs_intent_2.4.20_chaos	Tue Jun 24 10:31:16 2003
++++ kernel-2.4.20-6chaos_18_7-shaver/include/linux/dcache.h	Wed Jul 16 04:22:30 2003
+@@ -6,6 +6,45 @@
+ #include <asm/atomic.h>
+ #include <linux/mount.h>
+ #include <linux/kernel.h>
++#include <linux/string.h>
++
++#define IT_OPEN     0x0001
++#define IT_CREAT    0x0002
++#define IT_READDIR  0x0004
++#define IT_GETATTR  0x0008
++#define IT_LOOKUP   0x0010
++#define IT_UNLINK   0x0020
++#define IT_GETXATTR 0x0040
++#define IT_EXEC     0x0080
++#define IT_PIN      0x0100
++
++#define IT_FL_LOCKED   0x0001
++#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */
++
++#define INTENT_MAGIC 0x19620323
++
++struct lookup_intent {
++	int it_op;
++	void (*it_op_release)(struct lookup_intent *);
++	int it_magic;
++	int it_mode;
++	int it_flags;
++	int it_disposition;
++	int it_status;
++	int it_int_flags;
++	__u64 it_lock_handle[2];
++	int it_lock_mode;
++	void *it_data;
++};
++
++static inline void intent_init(struct lookup_intent *it, int op, int flags)
++{
++	memset(it, 0, sizeof(*it));
++	it->it_magic = INTENT_MAGIC;
++	it->it_op = op;
++	it->it_flags = flags;
++}
++
+ 
+ /*
+  * linux/include/linux/dcache.h
+@@ -96,8 +135,22 @@ struct dentry_operations {
+ 	int (*d_delete)(struct dentry *);
+ 	void (*d_release)(struct dentry *);
+ 	void (*d_iput)(struct dentry *, struct inode *);
++	int (*d_revalidate_it)(struct dentry *, int, struct lookup_intent *);
++	void (*d_pin)(struct dentry *, struct vfsmount * , int);
++	void (*d_unpin)(struct dentry *, struct vfsmount *, int);
+ };
+ 
++#define PIN(de,mnt,flag)  if (de->d_op && de->d_op->d_pin) \
++				de->d_op->d_pin(de, mnt, flag);
++#define UNPIN(de,mnt,flag)  if (de->d_op && de->d_op->d_unpin) \
++				de->d_op->d_unpin(de, mnt, flag);
++
++
++/* defined in fs/namei.c */
++extern void intent_release(struct lookup_intent *it);
++/* defined in fs/dcache.c */
++extern void __d_rehash(struct dentry * entry, int lock);
++
+ /* the dentry parameter passed to d_hash and d_compare is the parent
+  * directory of the entries to be compared. It is used in case these
+  * functions need any directory specific information for determining
+@@ -129,6 +182,7 @@ d_iput:		no		no		yes
+ 					 * s_nfsd_free_path semaphore will be down
+ 					 */
+ #define DCACHE_REFERENCED	0x0008  /* Recently used, don't discard. */
++#define DCACHE_LUSTRE_INVALID	0x0010  /* Lustre invalidated */
+ 
+ extern spinlock_t dcache_lock;
+ 
+--- kernel-2.4.20-6chaos_18_7/include/linux/fs.h~vfs_intent_2.4.20_chaos	Wed Jul 16 04:21:20 2003
++++ kernel-2.4.20-6chaos_18_7-shaver/include/linux/fs.h	Wed Jul 16 04:21:21 2003
+@@ -337,6 +337,9 @@ extern void set_bh_page(struct buffer_he
+ #define ATTR_MTIME_SET	256
+ #define ATTR_FORCE	512	/* Not a change, but a change it */
+ #define ATTR_ATTR_FLAG	1024
++#define ATTR_RAW	0x0800	/* file system, not vfs will massage attrs */
++#define ATTR_FROM_OPEN	0x1000	/* called from open path, ie O_TRUNC */
++#define ATTR_CTIME_SET 0x2000
+ 
+ /*
+  * This is the Inode Attributes structure, used for notify_change().  It
+@@ -574,6 +577,7 @@ struct file {
+ 
+ 	/* needed for tty driver, and maybe others */
+ 	void			*private_data;
++	struct lookup_intent    *f_it;
+ 
+ 	/* preallocated helper kiobuf to speedup O_DIRECT */
+ 	struct kiobuf		*f_iobuf;
+@@ -701,6 +705,7 @@ struct nameidata {
+ 	struct qstr last;
+ 	unsigned int flags;
+ 	int last_type;
++	struct lookup_intent *it;
+ };
+ 
+ /*
+@@ -821,7 +826,8 @@ extern int vfs_symlink(struct inode *, s
+ extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
+ extern int vfs_rmdir(struct inode *, struct dentry *);
+ extern int vfs_unlink(struct inode *, struct dentry *);
+-extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
++int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
++	       struct inode *new_dir, struct dentry *new_dentry);
+ 
+ /*
+  * File types
+@@ -881,21 +887,32 @@ struct file_operations {
+ 
+ struct inode_operations {
+ 	int (*create) (struct inode *,struct dentry *,int);
++	int (*create_it) (struct inode *,struct dentry *,int, struct lookup_intent *);
+ 	struct dentry * (*lookup) (struct inode *,struct dentry *);
++	struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct lookup_intent *, int flags);
+ 	int (*link) (struct dentry *,struct inode *,struct dentry *);
++	int (*link_raw) (struct nameidata *,struct nameidata *);
+ 	int (*unlink) (struct inode *,struct dentry *);
++	int (*unlink_raw) (struct nameidata *);
+ 	int (*symlink) (struct inode *,struct dentry *,const char *);
++	int (*symlink_raw) (struct nameidata *,const char *);
+ 	int (*mkdir) (struct inode *,struct dentry *,int);
++	int (*mkdir_raw) (struct nameidata *,int);
+ 	int (*rmdir) (struct inode *,struct dentry *);
++	int (*rmdir_raw) (struct nameidata *);
+ 	int (*mknod) (struct inode *,struct dentry *,int,int);
++	int (*mknod_raw) (struct nameidata *,int,dev_t);
+ 	int (*rename) (struct inode *, struct dentry *,
+ 			struct inode *, struct dentry *);
++	int (*rename_raw) (struct nameidata *, struct nameidata *);
+ 	int (*readlink) (struct dentry *, char *,int);
+ 	int (*follow_link) (struct dentry *, struct nameidata *);
+ 	void (*truncate) (struct inode *);
+ 	int (*permission) (struct inode *, int);
+ 	int (*revalidate) (struct dentry *);
++	int (*revalidate_it) (struct dentry *, struct lookup_intent *);
+ 	int (*setattr) (struct dentry *, struct iattr *);
++ 	int (*setattr_raw) (struct inode *, struct iattr *);
+ 	int (*getattr) (struct dentry *, struct iattr *);
+ 	int (*setxattr) (struct dentry *, const char *, void *, size_t, int);
+ 	ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
+@@ -1093,10 +1110,14 @@ static inline int get_lease(struct inode
+ 
+ asmlinkage long sys_open(const char *, int, int);
+ asmlinkage long sys_close(unsigned int);	/* yes, it's really unsigned */
+-extern int do_truncate(struct dentry *, loff_t start);
++extern int do_truncate(struct dentry *, loff_t start, int called_from_open);
+ 
+ extern struct file *filp_open(const char *, int, int);
+ extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
++extern int open_namei_it(const char *filename, int namei_flags, int mode,
++			 struct nameidata *nd, struct lookup_intent *it);
++extern struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt,
++			    int flags, struct lookup_intent *it);
+ extern int filp_close(struct file *, fl_owner_t id);
+ extern char * getname(const char *);
+ 
+@@ -1387,6 +1408,7 @@ typedef int (*read_actor_t)(read_descrip
+ extern loff_t default_llseek(struct file *file, loff_t offset, int origin);
+ 
+ extern int FASTCALL(__user_walk(const char *, unsigned, struct nameidata *));
++extern int FASTCALL(__user_walk_it(const char *, unsigned, struct nameidata *, struct lookup_intent *it));
+ extern int FASTCALL(path_init(const char *, unsigned, struct nameidata *));
+ extern int FASTCALL(path_walk(const char *, struct nameidata *));
+ extern int FASTCALL(path_lookup(const char *, unsigned, struct nameidata *));
+@@ -1398,6 +1420,8 @@ extern struct dentry * lookup_one_len(co
+ extern struct dentry * lookup_hash(struct qstr *, struct dentry *);
+ #define user_path_walk(name,nd)	 __user_walk(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd)
+ #define user_path_walk_link(name,nd) __user_walk(name, LOOKUP_POSITIVE, nd)
++#define user_path_walk_it(name,nd,it)  __user_walk_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd, it)
++#define user_path_walk_link_it(name,nd,it) __user_walk_it(name, LOOKUP_POSITIVE, nd, it)
+ 
+ extern void inode_init_once(struct inode *);
+ extern void iput(struct inode *);
+@@ -1497,6 +1521,8 @@ extern struct file_operations generic_ro
+ 
+ extern int vfs_readlink(struct dentry *, char *, int, const char *);
+ extern int vfs_follow_link(struct nameidata *, const char *);
++extern int vfs_follow_link_it(struct nameidata *, const char *,
++			      struct lookup_intent *it);
+ extern int page_readlink(struct dentry *, char *, int);
+ extern int page_follow_link(struct dentry *, struct nameidata *);
+ extern struct inode_operations page_symlink_inode_operations;
+--- kernel-2.4.20-6chaos_18_7/include/linux/fs_struct.h~vfs_intent_2.4.20_chaos	Tue Jun 24 10:31:16 2003
++++ kernel-2.4.20-6chaos_18_7-shaver/include/linux/fs_struct.h	Wed Jul 16 04:21:21 2003
+@@ -37,10 +37,12 @@ static inline void set_fs_root(struct fs
+ 	write_lock(&fs->lock);
+ 	old_root = fs->root;
+ 	old_rootmnt = fs->rootmnt;
++	PIN(dentry, mnt, 1);
+ 	fs->rootmnt = mntget(mnt);
+ 	fs->root = dget(dentry);
+ 	write_unlock(&fs->lock);
+ 	if (old_root) {
++		UNPIN(old_root, old_rootmnt, 1);
+ 		dput(old_root);
+ 		mntput(old_rootmnt);
+ 	}
+@@ -60,10 +62,12 @@ static inline void set_fs_pwd(struct fs_
+ 	write_lock(&fs->lock);
+ 	old_pwd = fs->pwd;
+ 	old_pwdmnt = fs->pwdmnt;
++	PIN(dentry, mnt, 0);
+ 	fs->pwdmnt = mntget(mnt);
+ 	fs->pwd = dget(dentry);
+ 	write_unlock(&fs->lock);
+ 	if (old_pwd) {
++		UNPIN(old_pwd, old_pwdmnt, 0);
+ 		dput(old_pwd);
+ 		mntput(old_pwdmnt);
+ 	}
+--- kernel-2.4.20-6chaos_18_7/kernel/ksyms.c~vfs_intent_2.4.20_chaos	Wed Jul 16 04:21:20 2003
++++ kernel-2.4.20-6chaos_18_7-shaver/kernel/ksyms.c	Wed Jul 16 04:21:21 2003
+@@ -299,6 +299,7 @@ EXPORT_SYMBOL(read_cache_page);
+ EXPORT_SYMBOL(set_page_dirty);
+ EXPORT_SYMBOL(vfs_readlink);
+ EXPORT_SYMBOL(vfs_follow_link);
++EXPORT_SYMBOL(vfs_follow_link_it);
+ EXPORT_SYMBOL(page_readlink);
+ EXPORT_SYMBOL(page_follow_link);
+ EXPORT_SYMBOL(page_symlink_inode_operations);
+--- kernel-2.4.20-6chaos_18_7/kernel/fork.c~vfs_intent_2.4.20_chaos	Thu Jun 19 10:06:09 2003
++++ kernel-2.4.20-6chaos_18_7-shaver/kernel/fork.c	Wed Jul 16 04:21:21 2003
+@@ -385,10 +385,13 @@ static inline struct fs_struct *__copy_f
+ 		fs->umask = old->umask;
+ 		read_lock(&old->lock);
+ 		fs->rootmnt = mntget(old->rootmnt);
++		PIN(old->pwd, old->pwdmnt, 0);
++		PIN(old->root, old->rootmnt, 1);
+ 		fs->root = dget(old->root);
+ 		fs->pwdmnt = mntget(old->pwdmnt);
+ 		fs->pwd = dget(old->pwd);
+ 		if (old->altroot) {
++			PIN(old->altroot, old->altrootmnt, 1);
+ 			fs->altrootmnt = mntget(old->altrootmnt);
+ 			fs->altroot = dget(old->altroot);
+ 		} else {
+--- kernel-2.4.20-6chaos_18_7/kernel/exit.c~vfs_intent_2.4.20_chaos	Thu Jun 19 10:06:09 2003
++++ kernel-2.4.20-6chaos_18_7-shaver/kernel/exit.c	Wed Jul 16 04:21:21 2003
+@@ -241,11 +241,14 @@ static inline void __put_fs_struct(struc
+ {
+ 	/* No need to hold fs->lock if we are killing it */
+ 	if (atomic_dec_and_test(&fs->count)) {
++		UNPIN(fs->pwd, fs->pwdmnt, 0);
++		UNPIN(fs->root, fs->rootmnt, 1);
+ 		dput(fs->root);
+ 		mntput(fs->rootmnt);
+ 		dput(fs->pwd);
+ 		mntput(fs->pwdmnt);
+ 		if (fs->altroot) {
++			UNPIN(fs->altroot, fs->altrootmnt, 1);
+ 			dput(fs->altroot);
+ 			mntput(fs->altrootmnt);
+ 		}
+
+_
diff --git a/lustre/kernel_patches/patches/vfs_intent_2.5.72_rev1.patch b/lustre/kernel_patches/patches/vfs_intent_2.5.72_rev1.patch
new file mode 100644
index 0000000000..566dec9f60
--- /dev/null
+++ b/lustre/kernel_patches/patches/vfs_intent_2.5.72_rev1.patch
@@ -0,0 +1,1031 @@
+ fs/exec.c              |   15 ++-
+ fs/namei.c             |  189 ++++++++++++++++++++++++++++++++++++++++++-------
+ fs/namespace.c         |    2 
+ fs/open.c              |   64 ++++++++++------
+ fs/stat.c              |   28 +++++--
+ fs/sysfs/inode.c       |    2 
+ include/linux/dcache.h |   36 +++++++++
+ include/linux/fs.h     |   10 ++
+ include/linux/namei.h  |   19 +++-
+ kernel/ksyms.c         |    8 ++
+ net/sunrpc/rpc_pipe.c  |    6 -
+ net/unix/af_unix.c     |    2 
+ 12 files changed, 310 insertions(+), 71 deletions(-)
+
+--- linux-2.5.73/fs/sysfs/inode.c~vfs_intent_2.5.72_rev1	2003-06-22 12:33:11.000000000 -0600
++++ linux-2.5.73-braam/fs/sysfs/inode.c	2003-07-15 02:23:28.000000000 -0600
+@@ -81,7 +81,7 @@ struct dentry * sysfs_get_dentry(struct 
+ 	qstr.name = name;
+ 	qstr.len = strlen(name);
+ 	qstr.hash = full_name_hash(name,qstr.len);
+-	return lookup_hash(&qstr,parent);
++	return lookup_hash(&qstr,parent, NULL);
+ }
+ 
+ void sysfs_hash_and_remove(struct dentry * dir, const char * name)
+--- linux-2.5.73/fs/exec.c~vfs_intent_2.5.72_rev1	2003-06-22 12:32:41.000000000 -0600
++++ linux-2.5.73-braam/fs/exec.c	2003-07-15 02:23:28.000000000 -0600
+@@ -116,6 +116,9 @@ asmlinkage long sys_uselib(const char __
+ 	struct file * file;
+ 	struct nameidata nd;
+ 	int error;
++        intent_init(&nd.it, IT_OPEN, O_RDONLY);
++  
++ 	error = user_path_walk_it(library, &nd);
+ 
+ 	error = user_path_walk(library, &nd);
+ 	if (error)
+@@ -129,7 +132,7 @@ asmlinkage long sys_uselib(const char __
+ 	if (error)
+ 		goto exit;
+ 
+-	file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
++	file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &nd.it);
+ 	error = PTR_ERR(file);
+ 	if (IS_ERR(file))
+ 		goto out;
+@@ -453,8 +456,12 @@ static inline void free_arg_pages(struct
+ struct file *open_exec(const char *name)
+ {
+ 	struct nameidata nd;
+-	int err = path_lookup(name, LOOKUP_FOLLOW, &nd);
+-	struct file *file = ERR_PTR(err);
++ 	int err;
++ 	struct file *file;
++         
++        intent_init(&nd.it, IT_OPEN, O_RDONLY);
++        err = path_lookup(name, LOOKUP_FOLLOW, &nd);
++        file = ERR_PTR(err);
+ 
+ 	if (!err) {
+ 		struct inode *inode = nd.dentry->d_inode;
+@@ -466,7 +473,7 @@ struct file *open_exec(const char *name)
+ 				err = -EACCES;
+ 			file = ERR_PTR(err);
+ 			if (!err) {
+-				file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
++				file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &nd.it);
+ 				if (!IS_ERR(file)) {
+ 					err = deny_write_access(file);
+ 					if (err) {
+--- linux-2.5.73/fs/namei.c~vfs_intent_2.5.72_rev1	2003-06-22 12:32:41.000000000 -0600
++++ linux-2.5.73-braam/fs/namei.c	2003-07-15 02:23:28.000000000 -0600
+@@ -263,8 +263,19 @@ int deny_write_access(struct file * file
+ 	return 0;
+ }
+ 
++void intent_release(struct lookup_intent *it)
++{
++        if (!it) 
++                return;
++        if (it->it_magic != INTENT_MAGIC)
++                return;
++        if (it->it_op_release)
++                it->it_op_release(it);
++}
++
+ void path_release(struct nameidata *nd)
+ {
++        intent_release(&nd->it);
+ 	dput(nd->dentry);
+ 	mntput(nd->mnt);
+ }
+@@ -273,7 +284,7 @@ void path_release(struct nameidata *nd)
+  * Internal lookup() using the new generic dcache.
+  * SMP-safe
+  */
+-static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags)
++static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags, struct nameidata *nd)
+ {
+ 	struct dentry * dentry = __d_lookup(parent, name);
+ 
+@@ -283,6 +294,14 @@ static struct dentry * cached_lookup(str
+ 	if (!dentry)
+ 		dentry = d_lookup(parent, name);
+ 
++	if (dentry && dentry->d_op && dentry->d_op->d_revalidate_nd) {
++		if (!dentry->d_op->d_revalidate_nd(dentry, flags, nd) &&
++		    !d_invalidate(dentry)) {
++			dput(dentry);
++			dentry = NULL;
++		}
++		return dentry;
++	} else
+ 	if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
+ 		if (!dentry->d_op->d_revalidate(dentry, flags) && !d_invalidate(dentry)) {
+ 			dput(dentry);
+@@ -336,7 +355,7 @@ ok:
+  * make sure that nobody added the entry to the dcache in the meantime..
+  * SMP-safe
+  */
+-static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags)
++static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags, struct nameidata *nd)
+ {
+ 	struct dentry * result;
+ 	struct inode *dir = parent->d_inode;
+@@ -361,7 +380,10 @@ static struct dentry * real_lookup(struc
+ 		struct dentry * dentry = d_alloc(parent, name);
+ 		result = ERR_PTR(-ENOMEM);
+ 		if (dentry) {
+-			result = dir->i_op->lookup(dir, dentry);
++			if (dir->i_op->lookup_it)
++				result = dir->i_op->lookup_it(dir, dentry, nd);
++			else
++                                result = dir->i_op->lookup(dir, dentry);
+ 			if (result)
+ 				dput(dentry);
+ 			else
+@@ -381,6 +403,12 @@ static struct dentry * real_lookup(struc
+ 			dput(result);
+ 			result = ERR_PTR(-ENOENT);
+ 		}
++	} else if (result->d_op && result->d_op->d_revalidate_nd) {
++		if (!result->d_op->d_revalidate_nd(result, flags, nd) &&
++		    !d_invalidate(result)) {
++			dput(result);
++			result = ERR_PTR(-ENOENT);
++		}
+ 	}
+ 	return result;
+ }
+@@ -455,15 +483,25 @@ static int follow_mount(struct vfsmount 
+ 	return res;
+ }
+ 
+-static inline int __follow_down(struct vfsmount **mnt, struct dentry **dentry)
++static inline int __follow_down(struct vfsmount **mnt, struct dentry **dentry,
++                              struct lookup_intent *it)
+ {
+ 	struct vfsmount *mounted;
+ 
+ 	spin_lock(&dcache_lock);
+ 	mounted = lookup_mnt(*mnt, *dentry);
+ 	if (mounted) {
++		int opc = 0, mode = 0;
+ 		*mnt = mntget(mounted);
+ 		spin_unlock(&dcache_lock);
++		if (it) {
++			opc = it->it_op;
++			mode = it->it_mode;
++		}
++		if (it) {
++			it->it_op = opc;
++			it->it_mode = mode;
++		}
+ 		dput(*dentry);
+ 		mntput(mounted->mnt_parent);
+ 		*dentry = dget(mounted->mnt_root);
+@@ -475,7 +513,7 @@ static inline int __follow_down(struct v
+ 
+ int follow_down(struct vfsmount **mnt, struct dentry **dentry)
+ {
+-	return __follow_down(mnt,dentry);
++	return __follow_down(mnt,dentry,NULL);
+ }
+  
+ static inline void follow_dotdot(struct vfsmount **mnt, struct dentry **dentry)
+@@ -531,7 +569,8 @@ static int do_lookup(struct nameidata *n
+ 
+ 	if (!dentry)
+ 		goto need_lookup;
+-	if (dentry->d_op && dentry->d_op->d_revalidate)
++	if (dentry->d_op && (dentry->d_op->d_revalidate || 
++                             dentry->d_op->d_revalidate_nd) )
+ 		goto need_revalidate;
+ done:
+ 	path->mnt = mnt;
+@@ -539,13 +578,17 @@ done:
+ 	return 0;
+ 
+ need_lookup:
+-	dentry = real_lookup(nd->dentry, name, LOOKUP_CONTINUE);
++	dentry = real_lookup(nd->dentry, name, LOOKUP_CONTINUE, nd);
+ 	if (IS_ERR(dentry))
+ 		goto fail;
+ 	goto done;
+ 
+ need_revalidate:
+-	if (dentry->d_op->d_revalidate(dentry, flags))
++	if (dentry->d_op->d_revalidate && 
++            dentry->d_op->d_revalidate(dentry, flags))
++		goto done;
++	if (dentry->d_op->d_revalidate_nd && 
++            dentry->d_op->d_revalidate_nd(dentry, flags, nd))
+ 		goto done;
+ 	if (d_invalidate(dentry))
+ 		goto done;
+@@ -556,6 +599,32 @@ fail:
+ 	return PTR_ERR(dentry);
+ }
+ 
++
++static int revalidate_special(struct nameidata *nd)
++{
++        struct dentry *dentry = nd->dentry;
++        int err, counter = 0;
++
++        if (!dentry->d_op || !dentry->d_op->d_revalidate_nd)
++                return 0;
++ revalidate_again:
++        if (!dentry->d_op->d_revalidate_nd(dentry, 0, nd)) {
++                struct dentry *new;
++                if ((err = permission(dentry->d_parent->d_inode, MAY_EXEC)))
++                        return err;
++                new = real_lookup(dentry->d_parent, &dentry->d_name, 0, nd);
++                d_invalidate(dentry);
++                dput(dentry);
++                dentry = new;
++                counter++;
++                if (counter < 10)
++                        goto revalidate_again;
++                printk("excessive revalidate_it loops\n");
++                return -ESTALE;
++        }
++        return 0;
++}
++
+ /*
+  * Name resolution.
+  *
+@@ -655,7 +724,9 @@ int link_path_walk(const char * name, st
+ 
+ 		if (inode->i_op->follow_link) {
+ 			mntget(next.mnt);
++                        nd->flags |= LOOKUP_LINK_NOTLAST;
+ 			err = do_follow_link(next.dentry, nd);
++                        nd->flags &= ~LOOKUP_LINK_NOTLAST;
+ 			dput(next.dentry);
+ 			mntput(next.mnt);
+ 			if (err)
+@@ -673,7 +744,7 @@ int link_path_walk(const char * name, st
+ 			nd->dentry = next.dentry;
+ 		}
+ 		err = -ENOTDIR; 
+-		if (!inode->i_op->lookup)
++		if (!inode->i_op->lookup && !inode->i_op->lookup_it)
+ 			break;
+ 		continue;
+ 		/* here ends the main loop */
+@@ -693,6 +764,11 @@ last_component:
+ 				inode = nd->dentry->d_inode;
+ 				/* fallthrough */
+ 			case 1:
++                                nd->flags |= LOOKUP_LAST;
++                                err = revalidate_special(nd);
++                                nd->flags &= ~LOOKUP_LAST;
++                                if (err)
++                                        break;
+ 				goto return_base;
+ 		}
+ 		if (nd->dentry->d_op && nd->dentry->d_op->d_hash) {
+@@ -700,7 +776,9 @@ last_component:
+ 			if (err < 0)
+ 				break;
+ 		}
++                nd->flags |= LOOKUP_LAST;
+ 		err = do_lookup(nd, &this, &next, 0);
++                nd->flags &= ~LOOKUP_LAST;
+ 		if (err)
+ 			break;
+ 		follow_mount(&next.mnt, &next.dentry);
+@@ -724,7 +802,8 @@ last_component:
+ 			break;
+ 		if (lookup_flags & LOOKUP_DIRECTORY) {
+ 			err = -ENOTDIR; 
+-			if (!inode->i_op || !inode->i_op->lookup)
++			if (!inode->i_op || 
++                            (!inode->i_op->lookup && !inode->i_op->lookup_it))
+ 				break;
+ 		}
+ 		goto return_base;
+@@ -743,7 +822,7 @@ out_dput:
+ 		dput(next.dentry);
+ 		break;
+ 	}
+-	path_release(nd);
++        path_release(nd);
+ return_err:
+ 	return err;
+ }
+@@ -866,7 +945,8 @@ int path_lookup(const char *name, unsign
+  * needs parent already locked. Doesn't follow mounts.
+  * SMP-safe.
+  */
+-struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
++struct dentry * lookup_hash(struct qstr *name, struct dentry * base, 
++                            struct nameidata *nd)
+ {
+ 	struct dentry * dentry;
+ 	struct inode *inode;
+@@ -889,13 +969,16 @@ struct dentry * lookup_hash(struct qstr 
+ 			goto out;
+ 	}
+ 
+-	dentry = cached_lookup(base, name, 0);
++	dentry = cached_lookup(base, name, 0, nd);
+ 	if (!dentry) {
+ 		struct dentry *new = d_alloc(base, name);
+ 		dentry = ERR_PTR(-ENOMEM);
+ 		if (!new)
+ 			goto out;
+-		dentry = inode->i_op->lookup(inode, new);
++		if (inode->i_op->lookup_it)
++			dentry = inode->i_op->lookup_it(inode, new, nd);
++		else
++			dentry = inode->i_op->lookup(inode, new);
+ 		if (!dentry)
+ 			dentry = new;
+ 		else
+@@ -906,7 +989,7 @@ out:
+ }
+ 
+ /* SMP-safe */
+-struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
++struct dentry * lookup_one_len_it(const char * name, struct dentry * base, int len, struct nameidata *nd)
+ {
+ 	unsigned long hash;
+ 	struct qstr this;
+@@ -926,11 +1009,16 @@ struct dentry * lookup_one_len(const cha
+ 	}
+ 	this.hash = end_name_hash(hash);
+ 
+-	return lookup_hash(&this, base);
++	return lookup_hash(&this, base, nd);
+ access:
+ 	return ERR_PTR(-EACCES);
+ }
+ 
++struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
++{
++        return lookup_one_len_it(name, base, len, NULL);
++}
++
+ /*
+  *	namei()
+  *
+@@ -942,10 +1030,11 @@ access:
+  * that namei follows links, while lnamei does not.
+  * SMP-safe
+  */
+-int __user_walk(const char __user *name, unsigned flags, struct nameidata *nd)
++int __user_walk_it(const char __user *name, unsigned flags, struct nameidata *nd)
+ {
+ 	char *tmp = getname(name);
+ 	int err = PTR_ERR(tmp);
++ 
+ 
+ 	if (!IS_ERR(tmp)) {
+ 		err = path_lookup(tmp, flags, nd);
+@@ -954,6 +1043,12 @@ int __user_walk(const char __user *name,
+ 	return err;
+ }
+ 
++int __user_walk(const char __user *name, unsigned flags, struct nameidata *nd)
++{
++        intent_init(&nd->it, IT_LOOKUP, 0);
++        return __user_walk_it(name, flags, nd);
++}
++
+ /*
+  * It's inline, so penalty for filesystems that don't use sticky bit is
+  * minimal.
+@@ -1097,6 +1192,32 @@ void unlock_rename(struct dentry *p1, st
+ 	}
+ }
+ 
++int vfs_create_it(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *nd)
++{
++	int error = may_create(dir, dentry);
++
++	if (error)
++		return error;
++
++	if (!dir->i_op || (!dir->i_op->create && !dir->i_op->create_nd))
++		return -EACCES;	/* shouldn't it be ENOSYS? */
++	mode &= S_IALLUGO;
++	mode |= S_IFREG;
++	error = security_inode_create(dir, dentry, mode);
++	if (error)
++		return error;
++	DQUOT_INIT(dir);
++        if (dir->i_op->create_nd)
++                error = dir->i_op->create_nd(dir, dentry, mode, nd);
++        else 
++                error = dir->i_op->create(dir, dentry, mode);
++	if (!error) {
++		inode_dir_notify(dir, DN_CREATE);
++		security_inode_post_create(dir, dentry, mode);
++	}
++	return error;
++}
++
+ int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
+ {
+ 	int error = may_create(dir, dentry);
+@@ -1236,6 +1357,9 @@ int open_namei(const char * pathname, in
+ 	/*
+ 	 * Create - we need to know the parent.
+ 	 */
++	nd->it.it_mode = mode;
++	nd->it.it_op |= IT_CREAT;
++		
+ 	error = path_lookup(pathname, LOOKUP_PARENT, nd);
+ 	if (error)
+ 		return error;
+@@ -1251,7 +1375,9 @@ int open_namei(const char * pathname, in
+ 
+ 	dir = nd->dentry;
+ 	down(&dir->d_inode->i_sem);
+-	dentry = lookup_hash(&nd->last, nd->dentry);
++        nd->flags |= LOOKUP_LAST;
++	dentry = lookup_hash(&nd->last, nd->dentry, nd);
++        nd->flags &= ~LOOKUP_LAST;
+ 
+ do_last:
+ 	error = PTR_ERR(dentry);
+@@ -1259,12 +1385,13 @@ do_last:
+ 		up(&dir->d_inode->i_sem);
+ 		goto exit;
+ 	}
+-
++        
++	nd->it.it_mode = mode;
+ 	/* Negative dentry, just create the file */
+ 	if (!dentry->d_inode) {
+ 		if (!IS_POSIXACL(dir->d_inode))
+ 			mode &= ~current->fs->umask;
+-		error = vfs_create(dir->d_inode, dentry, mode);
++		error = vfs_create_it(dir->d_inode, dentry, mode, nd);
+ 		up(&dir->d_inode->i_sem);
+ 		dput(nd->dentry);
+ 		nd->dentry = dentry;
+@@ -1289,7 +1416,7 @@ do_last:
+ 		error = -ELOOP;
+ 		if (flag & O_NOFOLLOW)
+ 			goto exit_dput;
+-		while (__follow_down(&nd->mnt,&dentry) && d_mountpoint(dentry));
++		while (__follow_down(&nd->mnt,&dentry,&nd->it) && d_mountpoint(dentry));
+ 	}
+ 	error = -ENOENT;
+ 	if (!dentry->d_inode)
+@@ -1354,7 +1481,9 @@ do_link:
+ 	}
+ 	dir = nd->dentry;
+ 	down(&dir->d_inode->i_sem);
+-	dentry = lookup_hash(&nd->last, nd->dentry);
++        nd->flags |= LOOKUP_LAST;
++	dentry = lookup_hash(&nd->last, nd->dentry, nd);
++        nd->flags &= ~LOOKUP_LAST;
+ 	putname(nd->last.name);
+ 	goto do_last;
+ }
+@@ -1368,7 +1497,7 @@ static struct dentry *lookup_create(stru
+ 	dentry = ERR_PTR(-EEXIST);
+ 	if (nd->last_type != LAST_NORM)
+ 		goto fail;
+-	dentry = lookup_hash(&nd->last, nd->dentry);
++	dentry = lookup_hash(&nd->last, nd->dentry, nd);
+ 	if (IS_ERR(dentry))
+ 		goto fail;
+ 	if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
+@@ -1600,7 +1729,7 @@ asmlinkage long sys_rmdir(const char __u
+ 			goto exit1;
+ 	}
+ 	down(&nd.dentry->d_inode->i_sem);
+-	dentry = lookup_hash(&nd.last, nd.dentry);
++	dentry = lookup_hash(&nd.last, nd.dentry, &nd);
+ 	error = PTR_ERR(dentry);
+ 	if (!IS_ERR(dentry)) {
+ 		error = vfs_rmdir(nd.dentry->d_inode, dentry);
+@@ -1669,7 +1798,7 @@ asmlinkage long sys_unlink(const char __
+ 	if (nd.last_type != LAST_NORM)
+ 		goto exit1;
+ 	down(&nd.dentry->d_inode->i_sem);
+-	dentry = lookup_hash(&nd.last, nd.dentry);
++	dentry = lookup_hash(&nd.last, nd.dentry, &nd);
+ 	error = PTR_ERR(dentry);
+ 	if (!IS_ERR(dentry)) {
+ 		/* Why not before? Because we want correct error value */
+@@ -2019,7 +2148,7 @@ static inline int do_rename(const char *
+ 
+ 	trap = lock_rename(new_dir, old_dir);
+ 
+-	old_dentry = lookup_hash(&oldnd.last, old_dir);
++	old_dentry = lookup_hash(&oldnd.last, old_dir, &oldnd);
+ 	error = PTR_ERR(old_dentry);
+ 	if (IS_ERR(old_dentry))
+ 		goto exit3;
+@@ -2039,7 +2168,7 @@ static inline int do_rename(const char *
+ 	error = -EINVAL;
+ 	if (old_dentry == trap)
+ 		goto exit4;
+-	new_dentry = lookup_hash(&newnd.last, new_dir);
++	new_dentry = lookup_hash(&newnd.last, new_dir, &newnd);
+ 	error = PTR_ERR(new_dentry);
+ 	if (IS_ERR(new_dentry))
+ 		goto exit4;
+@@ -2104,7 +2233,10 @@ static inline int
+ __vfs_follow_link(struct nameidata *nd, const char *link)
+ {
+ 	int res = 0;
++        struct lookup_intent it = nd->it;
++        int mode = it.it_mode;
+ 	char *name;
++
+ 	if (IS_ERR(link))
+ 		goto fail;
+ 
+@@ -2114,6 +2246,9 @@ __vfs_follow_link(struct nameidata *nd, 
+ 			/* weird __emul_prefix() stuff did it */
+ 			goto out;
+ 	}
++
++        intent_init(&nd->it, it.it_op, it.it_flags);
++        nd->it.it_mode = mode;
+ 	res = link_path_walk(link, nd);
+ out:
+ 	if (current->link_count || res || nd->last_type!=LAST_NORM)
+--- linux-2.5.73/fs/namespace.c~vfs_intent_2.5.72_rev1	2003-06-22 12:32:57.000000000 -0600
++++ linux-2.5.73-braam/fs/namespace.c	2003-07-15 02:23:28.000000000 -0600
+@@ -728,6 +728,7 @@ long do_mount(char * dev_name, char * di
+ 	int retval = 0;
+ 	int mnt_flags = 0;
+ 
++        intent_init(&nd.it, IT_LOOKUP, 0);
+ 	/* Discard magic */
+ 	if ((flags & MS_MGC_MSK) == MS_MGC_VAL)
+ 		flags &= ~MS_MGC_MSK;
+@@ -937,6 +938,7 @@ void set_fs_pwd(struct fs_struct *fs, st
+ 		mntput(old_pwdmnt);
+ 	}
+ }
++EXPORT_SYMBOL(set_fs_pwd);
+ 
+ static void chroot_fs_refs(struct nameidata *old_nd, struct nameidata *new_nd)
+ {
+--- linux-2.5.73/fs/open.c~vfs_intent_2.5.72_rev1	2003-06-22 12:32:31.000000000 -0600
++++ linux-2.5.73-braam/fs/open.c	2003-07-15 02:23:28.000000000 -0600
+@@ -200,7 +200,7 @@ static inline long do_sys_truncate(const
+ 	struct nameidata nd;
+ 	struct inode * inode;
+ 	int error;
+-
++	intent_init(&nd.it, IT_GETATTR, 0);
+ 	error = -EINVAL;
+ 	if (length < 0)	/* sorry, but loff_t says... */
+ 		goto out;
+@@ -443,6 +443,7 @@ asmlinkage long sys_access(const char __
+ 	int old_fsuid, old_fsgid;
+ 	kernel_cap_t old_cap;
+ 	int res;
++	intent_init(&nd.it, IT_GETATTR, 0);
+ 
+ 	if (mode & ~S_IRWXO)	/* where's F_OK, X_OK, W_OK, R_OK? */
+ 		return -EINVAL;
+@@ -474,6 +475,7 @@ asmlinkage long sys_access(const char __
+ 		if(!res && (mode & S_IWOTH) && IS_RDONLY(nd.dentry->d_inode)
+ 		   && !special_file(nd.dentry->d_inode->i_mode))
+ 			res = -EROFS;
++		                
+ 		path_release(&nd);
+ 	}
+ 
+@@ -488,6 +490,7 @@ asmlinkage long sys_chdir(const char __u
+ {
+ 	struct nameidata nd;
+ 	int error;
++	intent_init(&nd.it, IT_GETATTR, 0);
+ 
+ 	error = __user_walk(filename, LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &nd);
+ 	if (error)
+@@ -539,6 +542,7 @@ asmlinkage long sys_chroot(const char __
+ {
+ 	struct nameidata nd;
+ 	int error;
++	intent_init(&nd.it, IT_GETATTR, 0);
+ 
+ 	error = __user_walk(filename, LOOKUP_FOLLOW | LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
+ 	if (error)
+@@ -611,7 +615,7 @@ asmlinkage long sys_chmod(const char __u
+ 	error = -EROFS;
+ 	if (IS_RDONLY(inode))
+ 		goto dput_and_out;
+-
++	
+ 	error = -EPERM;
+ 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
+ 		goto dput_and_out;
+@@ -719,25 +723,8 @@ asmlinkage long sys_fchown(unsigned int 
+  * for the internal routines (ie open_namei()/follow_link() etc). 00 is
+  * used by symlinks.
+  */
+-struct file *filp_open(const char * filename, int flags, int mode)
+-{
+-	int namei_flags, error;
+-	struct nameidata nd;
+-
+-	namei_flags = flags;
+-	if ((namei_flags+1) & O_ACCMODE)
+-		namei_flags++;
+-	if (namei_flags & O_TRUNC)
+-		namei_flags |= 2;
+-
+-	error = open_namei(filename, namei_flags, mode, &nd);
+-	if (!error)
+-		return dentry_open(nd.dentry, nd.mnt, flags);
+-
+-	return ERR_PTR(error);
+-}
+-
+-struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
++struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt, int flags, 
++                            struct lookup_intent *it)
+ {
+ 	struct file * f;
+ 	struct inode *inode;
+@@ -749,6 +736,7 @@ struct file *dentry_open(struct dentry *
+ 		goto cleanup_dentry;
+ 	f->f_flags = flags;
+ 	f->f_mode = (flags+1) & O_ACCMODE;
++        f->f_it = it;
+ 	inode = dentry->d_inode;
+ 	if (f->f_mode & FMODE_WRITE) {
+ 		error = get_write_access(inode);
+@@ -767,6 +755,7 @@ struct file *dentry_open(struct dentry *
+ 		error = f->f_op->open(inode,f);
+ 		if (error)
+ 			goto cleanup_all;
++                intent_release(it);
+ 	}
+ 	f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
+ 
+@@ -778,7 +767,7 @@ struct file *dentry_open(struct dentry *
+ 				f = ERR_PTR(-EINVAL);
+ 		}
+ 	}
+-
++        
+ 	return f;
+ 
+ cleanup_all:
+@@ -791,11 +780,42 @@ cleanup_all:
+ cleanup_file:
+ 	put_filp(f);
+ cleanup_dentry:
++        intent_release(it);
+ 	dput(dentry);
+ 	mntput(mnt);
+ 	return ERR_PTR(error);
+ }
+ 
++struct file *filp_open(const char * filename, int flags, int mode)
++{
++	int namei_flags, error;
++	struct file * temp_filp;
++        struct nameidata nd;
++	intent_init(&nd.it, IT_OPEN, flags);
++
++	namei_flags = flags;
++	if ((namei_flags+1) & O_ACCMODE)
++		namei_flags++;
++	if (namei_flags & O_TRUNC)
++		namei_flags |= 2;
++
++	error = open_namei(filename, namei_flags, mode, &nd);
++	if (!error) {
++		temp_filp = dentry_open_it(nd.dentry, nd.mnt, flags, &nd.it);
++		return temp_filp;
++	}	
++	return ERR_PTR(error);
++}
++
++
++struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
++{
++        struct lookup_intent it;
++	intent_init(&it, IT_LOOKUP, 0);
++
++        return dentry_open_it(dentry, mnt, flags, &it);
++}
++
+ /*
+  * Find an empty file descriptor entry, and mark it busy.
+  */
+--- linux-2.5.73/fs/stat.c~vfs_intent_2.5.72_rev1	2003-06-22 12:32:35.000000000 -0600
++++ linux-2.5.73-braam/fs/stat.c	2003-07-15 02:23:28.000000000 -0600
+@@ -33,7 +33,7 @@ void generic_fillattr(struct inode *inod
+ 	stat->blksize = inode->i_blksize;
+ }
+ 
+-int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
++int vfs_getattr_it(struct vfsmount *mnt, struct dentry *dentry, struct lookup_intent *it, struct kstat *stat)
+ {
+ 	struct inode *inode = dentry->d_inode;
+ 	int retval;
+@@ -44,6 +44,8 @@ int vfs_getattr(struct vfsmount *mnt, st
+ 
+ 	if (inode->i_op->getattr)
+ 		return inode->i_op->getattr(mnt, dentry, stat);
++	if (inode->i_op->getattr_it)
++		return inode->i_op->getattr_it(mnt, dentry, it, stat);
+ 
+ 	generic_fillattr(inode, stat);
+ 	if (!stat->blksize) {
+@@ -56,15 +58,21 @@ int vfs_getattr(struct vfsmount *mnt, st
+ 	return 0;
+ }
+ 
++int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
++{
++        return vfs_getattr_it(mnt, dentry, NULL, stat);
++}
++
+ int vfs_stat(char __user *name, struct kstat *stat)
+ {
+ 	struct nameidata nd;
+ 	int error;
++	intent_init(&nd.it, IT_GETATTR, 0);
+ 
+-	error = user_path_walk(name, &nd);
++	error = user_path_walk_it(name, &nd);
+ 	if (!error) {
+-		error = vfs_getattr(nd.mnt, nd.dentry, stat);
+-		path_release(&nd);
++		error = vfs_getattr_it(nd.mnt, nd.dentry, &nd.it, stat);
++                path_release(&nd);
+ 	}
+ 	return error;
+ }
+@@ -73,11 +81,12 @@ int vfs_lstat(char __user *name, struct 
+ {
+ 	struct nameidata nd;
+ 	int error;
++	intent_init(&nd.it, IT_GETATTR, 0);
+ 
+-	error = user_path_walk_link(name, &nd);
++	error = user_path_walk_link_it(name, &nd);
+ 	if (!error) {
+-		error = vfs_getattr(nd.mnt, nd.dentry, stat);
+-		path_release(&nd);
++		error = vfs_getattr_it(nd.mnt, nd.dentry, &nd.it, stat);
++                path_release(&nd);
+ 	}
+ 	return error;
+ }
+@@ -86,9 +95,12 @@ int vfs_fstat(unsigned int fd, struct ks
+ {
+ 	struct file *f = fget(fd);
+ 	int error = -EBADF;
++        struct nameidata nd;
++	intent_init(&nd.it, IT_GETATTR, 0);
+ 
+ 	if (f) {
+-		error = vfs_getattr(f->f_vfsmnt, f->f_dentry, stat);
++		error = vfs_getattr_it(f->f_vfsmnt, f->f_dentry, &nd.it, stat);
++                intent_release(&nd.it);
+ 		fput(f);
+ 	}
+ 	return error;
+--- linux-2.5.73/include/linux/dcache.h~vfs_intent_2.5.72_rev1	2003-06-22 12:33:35.000000000 -0600
++++ linux-2.5.73-braam/include/linux/dcache.h	2003-07-15 02:23:28.000000000 -0600
+@@ -4,6 +4,7 @@
+ #ifdef __KERNEL__
+ 
+ #include <asm/atomic.h>
++#include <linux/string.h>
+ #include <linux/list.h>
+ #include <linux/spinlock.h>
+ #include <linux/cache.h>
+@@ -12,6 +13,38 @@
+ 
+ struct vfsmount;
+ 
++#define IT_OPEN     (1)
++#define IT_CREAT    (1<<1)
++#define IT_READDIR  (1<<2)
++#define IT_GETATTR  (1<<3)
++#define IT_LOOKUP   (1<<4)
++#define IT_UNLINK   (1<<5)
++#define IT_GETXATTR (1<<6)
++
++struct nameidata;
++#define INTENT_MAGIC 0x19620323
++struct lookup_intent {
++        int it_op;
++        int it_mode;
++        void (*it_op_release)(struct lookup_intent *);
++        int it_magic;
++        int it_flags;
++        int it_disposition;
++        int it_status;
++        struct iattr *it_iattr;
++        __u64 it_lock_handle[2];
++        int it_lock_mode;
++        void *it_data;
++};
++
++static inline void intent_init(struct lookup_intent *it, int op, int flags)
++{
++        memset(it, 0, sizeof(*it));
++        it->it_magic = INTENT_MAGIC;
++        it->it_op = op;
++        it->it_flags = flags;
++}
++
+ /*
+  * linux/include/linux/dcache.h
+  *
+@@ -34,6 +67,8 @@ struct qstr {
+ 	char name_str[0];
+ };
+ 
++#include <linux/namei.h>
++
+ struct dentry_stat_t {
+ 	int nr_dentry;
+ 	int nr_unused;
+@@ -112,6 +147,7 @@ struct dentry_operations {
+ 	int (*d_delete)(struct dentry *);
+ 	void (*d_release)(struct dentry *);
+ 	void (*d_iput)(struct dentry *, struct inode *);
++ 	int (*d_revalidate_nd)(struct dentry *, int, struct nameidata *);
+ };
+ 
+ /* the dentry parameter passed to d_hash and d_compare is the parent
+--- linux-2.5.73/include/linux/fs.h~vfs_intent_2.5.72_rev1	2003-06-22 12:32:38.000000000 -0600
++++ linux-2.5.73-braam/include/linux/fs.h	2003-07-15 02:23:28.000000000 -0600
+@@ -237,6 +237,8 @@ typedef int (get_blocks_t)(struct inode 
+ #define ATTR_ATTR_FLAG	1024
+ #define ATTR_KILL_SUID	2048
+ #define ATTR_KILL_SGID	4096
++#define ATTR_RAW       	8192    /* file system, not vfs will massage attrs */
++#define ATTR_FROM_OPEN 	16384    /* called from open path, ie O_TRUNC */
+ 
+ /*
+  * This is the Inode Attributes structure, used for notify_change().  It
+@@ -445,6 +447,7 @@ struct file {
+ 	/* Used by fs/eventpoll.c to link all the hooks to this file */
+ 	struct list_head	f_ep_links;
+ 	spinlock_t		f_ep_lock;
++        struct lookup_intent    *f_it;
+ };
+ extern spinlock_t files_lock;
+ #define file_list_lock() spin_lock(&files_lock);
+@@ -731,7 +734,10 @@ struct file_operations {
+ 
+ struct inode_operations {
+ 	int (*create) (struct inode *,struct dentry *,int);
++	int (*create_nd) (struct inode *,struct dentry *,int, struct nameidata *);
+ 	struct dentry * (*lookup) (struct inode *,struct dentry *);
++ 	struct dentry * (*lookup_it) (struct inode *,struct dentry *,
++                                      struct nameidata *);
+ 	int (*link) (struct dentry *,struct inode *,struct dentry *);
+ 	int (*unlink) (struct inode *,struct dentry *);
+ 	int (*symlink) (struct inode *,struct dentry *,const char *);
+@@ -745,7 +751,9 @@ struct inode_operations {
+ 	void (*truncate) (struct inode *);
+ 	int (*permission) (struct inode *, int);
+ 	int (*setattr) (struct dentry *, struct iattr *);
++ 	int (*setattr_raw) (struct inode *, struct iattr *);
+ 	int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);
++ 	int (*getattr_it) (struct vfsmount *, struct dentry *, struct lookup_intent *, struct kstat *);
+ 	int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
+ 	ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
+ 	ssize_t (*listxattr) (struct dentry *, char *, size_t);
+@@ -958,6 +966,7 @@ extern int register_filesystem(struct fi
+ extern int unregister_filesystem(struct file_system_type *);
+ extern struct vfsmount *kern_mount(struct file_system_type *);
+ extern int may_umount(struct vfsmount *);
++struct vfsmount *do_kern_mount(const char *type, int flags, const char *name, void *data);
+ extern long do_mount(char *, char *, char *, unsigned long, void *);
+ 
+ extern int vfs_statfs(struct super_block *, struct kstatfs *);
+@@ -1025,6 +1034,7 @@ extern int do_truncate(struct dentry *, 
+ 
+ extern struct file *filp_open(const char *, int, int);
+ extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
++extern struct file * dentry_open_it(struct dentry *, struct vfsmount *, int, struct lookup_intent *);
+ extern int filp_close(struct file *, fl_owner_t id);
+ extern char * getname(const char __user *);
+ 
+--- linux-2.5.73/include/linux/namei.h~vfs_intent_2.5.72_rev1	2003-06-22 12:32:40.000000000 -0600
++++ linux-2.5.73-braam/include/linux/namei.h	2003-07-15 02:23:28.000000000 -0600
+@@ -11,6 +11,7 @@ struct nameidata {
+ 	struct qstr	last;
+ 	unsigned int	flags;
+ 	int		last_type;
++        struct lookup_intent it;
+ };
+ 
+ /*
+@@ -27,24 +28,32 @@ enum {LAST_NORM, LAST_ROOT, LAST_DOT, LA
+  *  - locked when lookup done with dcache_lock held
+  */
+ #define LOOKUP_FOLLOW		 1
+-#define LOOKUP_DIRECTORY	 2
+-#define LOOKUP_CONTINUE		 4
+-#define LOOKUP_PARENT		16
+-#define LOOKUP_NOALT		32
++#define LOOKUP_DIRECTORY	 (1<<1)
++#define LOOKUP_CONTINUE		 (1<<2)
++#define LOOKUP_PARENT		 (1<<3)
++#define LOOKUP_NOALT		 (1<<4)
++#define LOOKUP_LAST		 (1<<5)
++#define LOOKUP_LINK_NOTLAST	 (1<<6)
+ 
+ 
+ extern int FASTCALL(__user_walk(const char __user *, unsigned, struct nameidata *));
++extern int FASTCALL(__user_walk_it(const char __user *name, unsigned flags, struct nameidata *nd));
+ #define user_path_walk(name,nd) \
+ 	__user_walk(name, LOOKUP_FOLLOW, nd)
+ #define user_path_walk_link(name,nd) \
+ 	__user_walk(name, 0, nd)
++#define user_path_walk_it(name,nd) \
++	__user_walk_it(name, LOOKUP_FOLLOW, nd)
++#define user_path_walk_link_it(name,nd) \
++	__user_walk_it(name, 0, nd)
++extern void intent_release(struct lookup_intent *);
+ extern int FASTCALL(path_lookup(const char *, unsigned, struct nameidata *));
+ extern int FASTCALL(path_walk(const char *, struct nameidata *));
+ extern int FASTCALL(link_path_walk(const char *, struct nameidata *));
+ extern void path_release(struct nameidata *);
+ 
+ extern struct dentry * lookup_one_len(const char *, struct dentry *, int);
+-extern struct dentry * lookup_hash(struct qstr *, struct dentry *);
++extern struct dentry * lookup_hash(struct qstr *, struct dentry *, struct nameidata *);
+ 
+ extern int follow_down(struct vfsmount **, struct dentry **);
+ extern int follow_up(struct vfsmount **, struct dentry **);
+--- linux-2.5.73/kernel/ksyms.c~vfs_intent_2.5.72_rev1	2003-07-15 02:21:56.000000000 -0600
++++ linux-2.5.73-braam/kernel/ksyms.c	2003-07-16 16:36:31.000000000 -0600
+@@ -377,6 +377,7 @@ EXPORT_SYMBOL(unregister_filesystem);
+ EXPORT_SYMBOL(kern_mount);
+ EXPORT_SYMBOL(__mntput);
+ EXPORT_SYMBOL(may_umount);
++EXPORT_SYMBOL(reparent_to_init);
+ 
+ /* executable format registration */
+ EXPORT_SYMBOL(register_binfmt);
+@@ -406,6 +407,12 @@ EXPORT_SYMBOL(del_timer);
+ EXPORT_SYMBOL(request_irq);
+ EXPORT_SYMBOL(free_irq);
+ 
++/* lustre */
++EXPORT_SYMBOL(do_kern_mount);
++EXPORT_SYMBOL(exit_files);
++//EXPORT_SYMBOL(kmem_cache_validate);
++
++
+ /* waitqueue handling */
+ EXPORT_SYMBOL(add_wait_queue);
+ EXPORT_SYMBOL(add_wait_queue_exclusive);
+@@ -551,6 +558,7 @@ EXPORT_SYMBOL(sys_tz);
+ EXPORT_SYMBOL(file_fsync);
+ EXPORT_SYMBOL(fsync_buffers_list);
+ EXPORT_SYMBOL(clear_inode);
++EXPORT_SYMBOL(__iget);
+ EXPORT_SYMBOL(init_special_inode);
+ EXPORT_SYMBOL(new_inode);
+ EXPORT_SYMBOL(__insert_inode_hash);
+--- linux-2.5.73/net/unix/af_unix.c~vfs_intent_2.5.72_rev1	2003-06-22 12:32:57.000000000 -0600
++++ linux-2.5.73-braam/net/unix/af_unix.c	2003-07-15 02:23:28.000000000 -0600
+@@ -702,7 +702,7 @@ static int unix_bind(struct socket *sock
+ 		/*
+ 		 * Do the final lookup.
+ 		 */
+-		dentry = lookup_hash(&nd.last, nd.dentry);
++		dentry = lookup_hash(&nd.last, nd.dentry, NULL);
+ 		err = PTR_ERR(dentry);
+ 		if (IS_ERR(dentry))
+ 			goto out_mknod_unlock;
+--- linux-2.5.73/net/sunrpc/rpc_pipe.c~vfs_intent_2.5.72_rev1	2003-06-22 12:32:39.000000000 -0600
++++ linux-2.5.73-braam/net/sunrpc/rpc_pipe.c	2003-07-15 02:23:28.000000000 -0600
+@@ -598,7 +598,7 @@ rpc_lookup_negative(char *path, struct n
+ 		return ERR_PTR(error);
+ 	dir = nd->dentry->d_inode;
+ 	down(&dir->i_sem);
+-	dentry = lookup_hash(&nd->last, nd->dentry);
++	dentry = lookup_hash(&nd->last, nd->dentry, NULL);
+ 	if (IS_ERR(dentry))
+ 		goto out_err;
+ 	if (dentry->d_inode) {
+@@ -660,7 +660,7 @@ rpc_rmdir(char *path)
+ 		return error;
+ 	dir = nd.dentry->d_inode;
+ 	down(&dir->i_sem);
+-	dentry = lookup_hash(&nd.last, nd.dentry);
++	dentry = lookup_hash(&nd.last, nd.dentry, NULL);
+ 	if (IS_ERR(dentry)) {
+ 		error = PTR_ERR(dentry);
+ 		goto out_release;
+@@ -721,7 +721,7 @@ rpc_unlink(char *path)
+ 		return error;
+ 	dir = nd.dentry->d_inode;
+ 	down(&dir->i_sem);
+-	dentry = lookup_hash(&nd.last, nd.dentry);
++	dentry = lookup_hash(&nd.last, nd.dentry, NULL);
+ 	if (IS_ERR(dentry)) {
+ 		error = PTR_ERR(dentry);
+ 		goto out_release;
+
+_
diff --git a/lustre/kernel_patches/patches/vfs_intent_2.6.0-test1.patch b/lustre/kernel_patches/patches/vfs_intent_2.6.0-test1.patch
new file mode 100644
index 0000000000..96a0839f57
--- /dev/null
+++ b/lustre/kernel_patches/patches/vfs_intent_2.6.0-test1.patch
@@ -0,0 +1,764 @@
+ fs/exec.c              |   18 +++++++---
+ fs/namei.c             |   81 +++++++++++++++++++++++++++++++++++++++++++++----
+ fs/namespace.c         |    2 +
+ fs/open.c              |   64 +++++++++++++++++++++++++-------------
+ fs/stat.c              |   28 ++++++++++++----
+ fs/sysfs/inode.c       |    2 -
+ include/linux/dcache.h |    3 +
+ include/linux/fs.h     |    7 ++++
+ include/linux/namei.h  |   59 ++++++++++++++++++++++++++++++++---
+ kernel/ksyms.c         |    8 ++++
+ net/sunrpc/rpc_pipe.c  |    6 +--
+ net/unix/af_unix.c     |    2 -
+ 12 files changed, 228 insertions(+), 52 deletions(-)
+
+--- linux-2.6.0-test1/fs/sysfs/inode.c~vfs_intent_2.6.0-test1	2003-07-13 21:37:23.000000000 -0600
++++ linux-2.6.0-test1-braam/fs/sysfs/inode.c	2003-07-16 17:32:36.000000000 -0600
+@@ -81,7 +81,7 @@ struct dentry * sysfs_get_dentry(struct 
+ 	qstr.name = name;
+ 	qstr.len = strlen(name);
+ 	qstr.hash = full_name_hash(name,qstr.len);
+-	return lookup_hash(&qstr,parent);
++	return lookup_hash(&qstr,parent, NULL);
+ }
+ 
+ void sysfs_hash_and_remove(struct dentry * dir, const char * name)
+--- linux-2.6.0-test1/fs/exec.c~vfs_intent_2.6.0-test1	2003-07-16 17:19:46.000000000 -0600
++++ linux-2.6.0-test1-braam/fs/exec.c	2003-07-16 18:42:40.000000000 -0600
+@@ -116,8 +116,11 @@ asmlinkage long sys_uselib(const char __
+ 	struct file * file;
+ 	struct nameidata nd;
+ 	int error;
++        intent_init(&nd.intent, IT_OPEN);
++  
++ 	error = user_path_walk_it(library, &nd);
+ 
+-	nd.intent.open.flags = O_RDONLY;
++	nd.intent.intent.open.flags = O_RDONLY;
+ 	error = __user_walk(library, LOOKUP_FOLLOW|LOOKUP_OPEN, &nd);
+ 	if (error)
+ 		goto out;
+@@ -130,7 +133,7 @@ asmlinkage long sys_uselib(const char __
+ 	if (error)
+ 		goto exit;
+ 
+-	file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
++	file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &nd.intent);
+ 	error = PTR_ERR(file);
+ 	if (IS_ERR(file))
+ 		goto out;
+@@ -457,8 +460,13 @@ static inline void free_arg_pages(struct
+ struct file *open_exec(const char *name)
+ {
+ 	struct nameidata nd;
+-	int err = path_lookup(name, LOOKUP_FOLLOW, &nd);
+-	struct file *file = ERR_PTR(err);
++ 	int err;
++ 	struct file *file;
++         
++        intent_init(&nd.intent, IT_OPEN);
++        nd.intent.intent.open.flags = O_RDONLY;
++        err = path_lookup(name, LOOKUP_FOLLOW, &nd);
++        file = ERR_PTR(err);
+ 
+ 	if (!err) {
+ 		struct inode *inode = nd.dentry->d_inode;
+@@ -470,7 +478,7 @@ struct file *open_exec(const char *name)
+ 				err = -EACCES;
+ 			file = ERR_PTR(err);
+ 			if (!err) {
+-				file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
++				file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &nd.intent);
+ 				if (!IS_ERR(file)) {
+ 					err = deny_write_access(file);
+ 					if (err) {
+--- linux-2.6.0-test1/fs/namei.c~vfs_intent_2.6.0-test1	2003-07-16 17:19:46.000000000 -0600
++++ linux-2.6.0-test1-braam/fs/namei.c	2003-07-16 18:37:11.000000000 -0600
+@@ -263,8 +263,19 @@ int deny_write_access(struct file * file
+ 	return 0;
+ }
+ 
++void intent_release(struct lookup_intent *it)
++{
++        if (!it) 
++                return;
++        if (it->it_magic != INTENT_MAGIC)
++                return;
++        if (it->it_op_release)
++                it->it_op_release(it);
++}
++
+ void path_release(struct nameidata *nd)
+ {
++        intent_release(&nd->intent);
+ 	dput(nd->dentry);
+ 	mntput(nd->mnt);
+ }
+@@ -554,6 +565,32 @@ fail:
+ 	return PTR_ERR(dentry);
+ }
+ 
++
++static int revalidate_special(struct nameidata *nd)
++{
++        struct dentry *dentry = nd->dentry;
++        int err, counter = 0;
++
++        if (!dentry->d_op || !dentry->d_op->d_revalidate)
++                return 0;
++ revalidate_again:
++        if (!dentry->d_op->d_revalidate(dentry, nd)) {
++                struct dentry *new;
++                if ((err = permission(dentry->d_parent->d_inode, MAY_EXEC,nd)))
++                        return err;
++                new = real_lookup(dentry->d_parent, &dentry->d_name, nd);
++                d_invalidate(dentry);
++                dput(dentry);
++                dentry = new;
++                counter++;
++                if (counter < 10)
++                        goto revalidate_again;
++                printk("excessive revalidate_it loops\n");
++                return -ESTALE;
++        }
++        return 0;
++}
++
+ /*
+  * Name resolution.
+  *
+@@ -654,7 +691,9 @@ int link_path_walk(const char * name, st
+ 
+ 		if (inode->i_op->follow_link) {
+ 			mntget(next.mnt);
++                        nd->flags |= LOOKUP_LINK_NOTLAST;
+ 			err = do_follow_link(next.dentry, nd);
++                        nd->flags &= ~LOOKUP_LINK_NOTLAST;
+ 			dput(next.dentry);
+ 			mntput(next.mnt);
+ 			if (err)
+@@ -693,6 +732,11 @@ last_component:
+ 				inode = nd->dentry->d_inode;
+ 				/* fallthrough */
+ 			case 1:
++                                nd->flags |= LOOKUP_LAST;
++                                err = revalidate_special(nd);
++                                nd->flags &= ~LOOKUP_LAST;
++                                if (err)
++                                        break;
+ 				goto return_base;
+ 		}
+ 		if (nd->dentry->d_op && nd->dentry->d_op->d_hash) {
+@@ -700,7 +744,9 @@ last_component:
+ 			if (err < 0)
+ 				break;
+ 		}
++                nd->flags |= LOOKUP_LAST;
+ 		err = do_lookup(nd, &this, &next);
++                nd->flags &= ~LOOKUP_LAST;
+ 		if (err)
+ 			break;
+ 		follow_mount(&next.mnt, &next.dentry);
+@@ -743,7 +789,7 @@ out_dput:
+ 		dput(next.dentry);
+ 		break;
+ 	}
+-	path_release(nd);
++        path_release(nd);
+ return_err:
+ 	return err;
+ }
+@@ -912,7 +958,7 @@ struct dentry * lookup_hash(struct qstr 
+ }
+ 
+ /* SMP-safe */
+-struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
++struct dentry * lookup_one_len_it(const char * name, struct dentry * base, int len, struct nameidata *nd)
+ {
+ 	unsigned long hash;
+ 	struct qstr this;
+@@ -932,11 +978,16 @@ struct dentry * lookup_one_len(const cha
+ 	}
+ 	this.hash = end_name_hash(hash);
+ 
+-	return lookup_hash(&this, base);
++	return __lookup_hash(&this, base, nd);
+ access:
+ 	return ERR_PTR(-EACCES);
+ }
+ 
++struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
++{
++        return lookup_one_len_it(name, base, len, NULL);
++}
++
+ /*
+  *	namei()
+  *
+@@ -948,10 +999,11 @@ access:
+  * that namei follows links, while lnamei does not.
+  * SMP-safe
+  */
+-int __user_walk(const char __user *name, unsigned flags, struct nameidata *nd)
++int __user_walk_it(const char __user *name, unsigned flags, struct nameidata *nd)
+ {
+ 	char *tmp = getname(name);
+ 	int err = PTR_ERR(tmp);
++ 
+ 
+ 	if (!IS_ERR(tmp)) {
+ 		err = path_lookup(tmp, flags, nd);
+@@ -960,6 +1012,12 @@ int __user_walk(const char __user *name,
+ 	return err;
+ }
+ 
++int __user_walk(const char __user *name, unsigned flags, struct nameidata *nd)
++{
++        intent_init(&nd->intent, IT_LOOKUP);
++        return __user_walk_it(name, flags, nd);
++}
++
+ /*
+  * It's inline, so penalty for filesystems that don't use sticky bit is
+  * minimal.
+@@ -1232,8 +1290,8 @@ int open_namei(const char * pathname, in
+ 		acc_mode |= MAY_APPEND;
+ 
+ 	/* Fill in the open() intent data */
+-	nd->intent.open.flags = flag;
+-	nd->intent.open.create_mode = mode;
++	nd->intent.intent.open.flags = flag;
++	nd->intent.intent.open.create_mode = mode;
+ 
+ 	/*
+ 	 * The simplest case - just a plain lookup.
+@@ -1249,6 +1307,7 @@ int open_namei(const char * pathname, in
+ 	/*
+ 	 * Create - we need to know the parent.
+ 	 */
++        nd->intent.it_op |= IT_CREAT;
+ 	error = path_lookup(pathname, LOOKUP_PARENT|LOOKUP_OPEN|LOOKUP_CREATE, nd);
+ 	if (error)
+ 		return error;
+@@ -1265,7 +1324,9 @@ int open_namei(const char * pathname, in
+ 	dir = nd->dentry;
+ 	nd->flags &= ~LOOKUP_PARENT;
+ 	down(&dir->d_inode->i_sem);
++        nd->flags |= LOOKUP_LAST;
+ 	dentry = __lookup_hash(&nd->last, nd->dentry, nd);
++        nd->flags &= ~LOOKUP_LAST;
+ 
+ do_last:
+ 	error = PTR_ERR(dentry);
+@@ -1370,7 +1431,9 @@ do_link:
+ 	}
+ 	dir = nd->dentry;
+ 	down(&dir->d_inode->i_sem);
++        nd->flags |= LOOKUP_LAST;
+ 	dentry = __lookup_hash(&nd->last, nd->dentry, nd);
++        nd->flags &= ~LOOKUP_LAST;
+ 	putname(nd->last.name);
+ 	goto do_last;
+ }
+@@ -2143,7 +2206,9 @@ static inline int
+ __vfs_follow_link(struct nameidata *nd, const char *link)
+ {
+ 	int res = 0;
++        struct lookup_intent it = nd->intent;
+ 	char *name;
++
+ 	if (IS_ERR(link))
+ 		goto fail;
+ 
+@@ -2153,6 +2218,10 @@ __vfs_follow_link(struct nameidata *nd, 
+ 			/* weird __emul_prefix() stuff did it */
+ 			goto out;
+ 	}
++
++        intent_init(&nd->intent, it.it_op);
++        nd->intent.intent.open.flags = it.intent.open.flags;
++        nd->intent.intent.open.create_mode = it.intent.open.create_mode;
+ 	res = link_path_walk(link, nd);
+ out:
+ 	if (current->link_count || res || nd->last_type!=LAST_NORM)
+--- linux-2.6.0-test1/fs/namespace.c~vfs_intent_2.6.0-test1	2003-07-16 17:19:46.000000000 -0600
++++ linux-2.6.0-test1-braam/fs/namespace.c	2003-07-16 18:44:38.000000000 -0600
+@@ -738,6 +738,7 @@ long do_mount(char * dev_name, char * di
+ 	int retval = 0;
+ 	int mnt_flags = 0;
+ 
++        intent_init(&nd.intent, IT_LOOKUP);
+ 	/* Discard magic */
+ 	if ((flags & MS_MGC_MSK) == MS_MGC_VAL)
+ 		flags &= ~MS_MGC_MSK;
+@@ -947,6 +948,7 @@ void set_fs_pwd(struct fs_struct *fs, st
+ 		mntput(old_pwdmnt);
+ 	}
+ }
++EXPORT_SYMBOL(set_fs_pwd);
+ 
+ static void chroot_fs_refs(struct nameidata *old_nd, struct nameidata *new_nd)
+ {
+--- linux-2.6.0-test1/fs/open.c~vfs_intent_2.6.0-test1	2003-07-13 21:29:30.000000000 -0600
++++ linux-2.6.0-test1-braam/fs/open.c	2003-07-16 18:39:48.000000000 -0600
+@@ -200,7 +200,7 @@ static inline long do_sys_truncate(const
+ 	struct nameidata nd;
+ 	struct inode * inode;
+ 	int error;
+-
++	intent_init(&nd.intent, IT_GETATTR);
+ 	error = -EINVAL;
+ 	if (length < 0)	/* sorry, but loff_t says... */
+ 		goto out;
+@@ -443,6 +443,7 @@ asmlinkage long sys_access(const char __
+ 	int old_fsuid, old_fsgid;
+ 	kernel_cap_t old_cap;
+ 	int res;
++	intent_init(&nd.intent, IT_GETATTR);
+ 
+ 	if (mode & ~S_IRWXO)	/* where's F_OK, X_OK, W_OK, R_OK? */
+ 		return -EINVAL;
+@@ -474,6 +475,7 @@ asmlinkage long sys_access(const char __
+ 		if(!res && (mode & S_IWOTH) && IS_RDONLY(nd.dentry->d_inode)
+ 		   && !special_file(nd.dentry->d_inode->i_mode))
+ 			res = -EROFS;
++		                
+ 		path_release(&nd);
+ 	}
+ 
+@@ -488,6 +490,7 @@ asmlinkage long sys_chdir(const char __u
+ {
+ 	struct nameidata nd;
+ 	int error;
++	intent_init(&nd.intent, IT_GETATTR);
+ 
+ 	error = __user_walk(filename, LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &nd);
+ 	if (error)
+@@ -539,6 +542,7 @@ asmlinkage long sys_chroot(const char __
+ {
+ 	struct nameidata nd;
+ 	int error;
++	intent_init(&nd.intent, IT_GETATTR);
+ 
+ 	error = __user_walk(filename, LOOKUP_FOLLOW | LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
+ 	if (error)
+@@ -611,7 +615,7 @@ asmlinkage long sys_chmod(const char __u
+ 	error = -EROFS;
+ 	if (IS_RDONLY(inode))
+ 		goto dput_and_out;
+-
++	
+ 	error = -EPERM;
+ 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
+ 		goto dput_and_out;
+@@ -719,25 +723,8 @@ asmlinkage long sys_fchown(unsigned int 
+  * for the internal routines (ie open_namei()/follow_link() etc). 00 is
+  * used by symlinks.
+  */
+-struct file *filp_open(const char * filename, int flags, int mode)
+-{
+-	int namei_flags, error;
+-	struct nameidata nd;
+-
+-	namei_flags = flags;
+-	if ((namei_flags+1) & O_ACCMODE)
+-		namei_flags++;
+-	if (namei_flags & O_TRUNC)
+-		namei_flags |= 2;
+-
+-	error = open_namei(filename, namei_flags, mode, &nd);
+-	if (!error)
+-		return dentry_open(nd.dentry, nd.mnt, flags);
+-
+-	return ERR_PTR(error);
+-}
+-
+-struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
++struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt, int flags, 
++                            struct lookup_intent *it)
+ {
+ 	struct file * f;
+ 	struct inode *inode;
+@@ -749,6 +736,7 @@ struct file *dentry_open(struct dentry *
+ 		goto cleanup_dentry;
+ 	f->f_flags = flags;
+ 	f->f_mode = (flags+1) & O_ACCMODE;
++        f->f_it = it;
+ 	inode = dentry->d_inode;
+ 	if (f->f_mode & FMODE_WRITE) {
+ 		error = get_write_access(inode);
+@@ -767,6 +755,7 @@ struct file *dentry_open(struct dentry *
+ 		error = f->f_op->open(inode,f);
+ 		if (error)
+ 			goto cleanup_all;
++                intent_release(it);
+ 	}
+ 	f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
+ 
+@@ -778,7 +767,7 @@ struct file *dentry_open(struct dentry *
+ 				f = ERR_PTR(-EINVAL);
+ 		}
+ 	}
+-
++        
+ 	return f;
+ 
+ cleanup_all:
+@@ -791,11 +780,42 @@ cleanup_all:
+ cleanup_file:
+ 	put_filp(f);
+ cleanup_dentry:
++        intent_release(it);
+ 	dput(dentry);
+ 	mntput(mnt);
+ 	return ERR_PTR(error);
+ }
+ 
++struct file *filp_open(const char * filename, int flags, int mode)
++{
++	int namei_flags, error;
++	struct file * temp_filp;
++        struct nameidata nd;
++	intent_init(&nd.intent, IT_OPEN);
++
++	namei_flags = flags;
++	if ((namei_flags+1) & O_ACCMODE)
++		namei_flags++;
++	if (namei_flags & O_TRUNC)
++		namei_flags |= 2;
++
++	error = open_namei(filename, namei_flags, mode, &nd);
++	if (!error) {
++		temp_filp = dentry_open_it(nd.dentry, nd.mnt, flags, &nd.intent);
++		return temp_filp;
++	}	
++	return ERR_PTR(error);
++}
++
++
++struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
++{
++        struct lookup_intent it;
++	intent_init(&it, IT_LOOKUP);
++
++        return dentry_open_it(dentry, mnt, flags, &it);
++}
++
+ /*
+  * Find an empty file descriptor entry, and mark it busy.
+  */
+--- linux-2.6.0-test1/fs/stat.c~vfs_intent_2.6.0-test1	2003-07-13 21:31:21.000000000 -0600
++++ linux-2.6.0-test1-braam/fs/stat.c	2003-07-16 18:44:27.000000000 -0600
+@@ -33,7 +33,7 @@ void generic_fillattr(struct inode *inod
+ 	stat->blksize = inode->i_blksize;
+ }
+ 
+-int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
++int vfs_getattr_it(struct vfsmount *mnt, struct dentry *dentry, struct lookup_intent *it, struct kstat *stat)
+ {
+ 	struct inode *inode = dentry->d_inode;
+ 	int retval;
+@@ -44,6 +44,8 @@ int vfs_getattr(struct vfsmount *mnt, st
+ 
+ 	if (inode->i_op->getattr)
+ 		return inode->i_op->getattr(mnt, dentry, stat);
++	if (inode->i_op->getattr_it)
++		return inode->i_op->getattr_it(mnt, dentry, it, stat);
+ 
+ 	generic_fillattr(inode, stat);
+ 	if (!stat->blksize) {
+@@ -56,15 +58,21 @@ int vfs_getattr(struct vfsmount *mnt, st
+ 	return 0;
+ }
+ 
++int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
++{
++        return vfs_getattr_it(mnt, dentry, NULL, stat);
++}
++
+ int vfs_stat(char __user *name, struct kstat *stat)
+ {
+ 	struct nameidata nd;
+ 	int error;
++	intent_init(&nd.intent, IT_GETATTR);
+ 
+-	error = user_path_walk(name, &nd);
++	error = user_path_walk_it(name, &nd);
+ 	if (!error) {
+-		error = vfs_getattr(nd.mnt, nd.dentry, stat);
+-		path_release(&nd);
++		error = vfs_getattr_it(nd.mnt, nd.dentry, &nd.intent, stat);
++                path_release(&nd);
+ 	}
+ 	return error;
+ }
+@@ -73,11 +81,12 @@ int vfs_lstat(char __user *name, struct 
+ {
+ 	struct nameidata nd;
+ 	int error;
++	intent_init(&nd.intent, IT_GETATTR);
+ 
+-	error = user_path_walk_link(name, &nd);
++	error = user_path_walk_link_it(name, &nd);
+ 	if (!error) {
+-		error = vfs_getattr(nd.mnt, nd.dentry, stat);
+-		path_release(&nd);
++		error = vfs_getattr_it(nd.mnt, nd.dentry, &nd.intent, stat);
++                path_release(&nd);
+ 	}
+ 	return error;
+ }
+@@ -86,9 +95,12 @@ int vfs_fstat(unsigned int fd, struct ks
+ {
+ 	struct file *f = fget(fd);
+ 	int error = -EBADF;
++        struct nameidata nd;
++	intent_init(&nd.intent, IT_GETATTR);
+ 
+ 	if (f) {
+-		error = vfs_getattr(f->f_vfsmnt, f->f_dentry, stat);
++		error = vfs_getattr_it(f->f_vfsmnt, f->f_dentry, &nd.intent, stat);
++                intent_release(&nd.intent);
+ 		fput(f);
+ 	}
+ 	return error;
+--- linux-2.6.0-test1/include/linux/dcache.h~vfs_intent_2.6.0-test1	2003-07-13 21:39:22.000000000 -0600
++++ linux-2.6.0-test1-braam/include/linux/dcache.h	2003-07-16 17:49:49.000000000 -0600
+@@ -4,6 +4,7 @@
+ #ifdef __KERNEL__
+ 
+ #include <asm/atomic.h>
++#include <linux/string.h>
+ #include <linux/list.h>
+ #include <linux/spinlock.h>
+ #include <linux/cache.h>
+@@ -35,6 +36,8 @@ struct qstr {
+ 	char name_str[0];
+ };
+ 
++#include <linux/namei.h>
++
+ struct dentry_stat_t {
+ 	int nr_dentry;
+ 	int nr_unused;
+--- linux-2.6.0-test1/include/linux/fs.h~vfs_intent_2.6.0-test1	2003-07-16 17:19:46.000000000 -0600
++++ linux-2.6.0-test1-braam/include/linux/fs.h	2003-07-16 17:32:36.000000000 -0600
+@@ -237,6 +237,8 @@ typedef int (get_blocks_t)(struct inode 
+ #define ATTR_ATTR_FLAG	1024
+ #define ATTR_KILL_SUID	2048
+ #define ATTR_KILL_SGID	4096
++#define ATTR_RAW       	8192    /* file system, not vfs will massage attrs */
++#define ATTR_FROM_OPEN 	16384    /* called from open path, ie O_TRUNC */
+ 
+ /*
+  * This is the Inode Attributes structure, used for notify_change().  It
+@@ -511,6 +513,7 @@ struct file {
+ 	/* Used by fs/eventpoll.c to link all the hooks to this file */
+ 	struct list_head	f_ep_links;
+ 	spinlock_t		f_ep_lock;
++        struct lookup_intent    *f_it;
+ };
+ extern spinlock_t files_lock;
+ #define file_list_lock() spin_lock(&files_lock);
+@@ -816,7 +819,9 @@ struct inode_operations {
+ 	void (*truncate) (struct inode *);
+ 	int (*permission) (struct inode *, int, struct nameidata *);
+ 	int (*setattr) (struct dentry *, struct iattr *);
++ 	int (*setattr_raw) (struct inode *, struct iattr *);
+ 	int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);
++ 	int (*getattr_it) (struct vfsmount *, struct dentry *, struct lookup_intent *, struct kstat *);
+ 	int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
+ 	ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
+ 	ssize_t (*listxattr) (struct dentry *, char *, size_t);
+@@ -1029,6 +1034,7 @@ extern int register_filesystem(struct fi
+ extern int unregister_filesystem(struct file_system_type *);
+ extern struct vfsmount *kern_mount(struct file_system_type *);
+ extern int may_umount(struct vfsmount *);
++struct vfsmount *do_kern_mount(const char *type, int flags, const char *name, void *data);
+ extern long do_mount(char *, char *, char *, unsigned long, void *);
+ 
+ extern int vfs_statfs(struct super_block *, struct kstatfs *);
+@@ -1096,6 +1102,7 @@ extern int do_truncate(struct dentry *, 
+ 
+ extern struct file *filp_open(const char *, int, int);
+ extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
++extern struct file * dentry_open_it(struct dentry *, struct vfsmount *, int, struct lookup_intent *);
+ extern int filp_close(struct file *, fl_owner_t id);
+ extern char * getname(const char __user *);
+ 
+--- linux-2.6.0-test1/include/linux/namei.h~vfs_intent_2.6.0-test1	2003-07-13 21:32:39.000000000 -0600
++++ linux-2.6.0-test1-braam/include/linux/namei.h	2003-07-16 18:38:10.000000000 -0600
+@@ -2,25 +2,64 @@
+ #define _LINUX_NAMEI_H
+ 
+ #include <linux/linkage.h>
++#include <linux/string.h>
+ 
+ struct vfsmount;
++struct nameidata;
++
++/* intent opcodes */
++#define IT_OPEN     (1)
++#define IT_CREAT    (1<<1)
++#define IT_READDIR  (1<<2)
++#define IT_GETATTR  (1<<3)
++#define IT_LOOKUP   (1<<4)
++#define IT_UNLINK   (1<<5)
++#define IT_TRUNC    (1<<6)
++#define IT_GETXATTR (1<<7)
+ 
+ struct open_intent {
+ 	int	flags;
+ 	int	create_mode;
+ };
+ 
++struct lustre_intent_data {
++        int it_mode;
++        int it_flags;
++        int it_disposition;
++        int it_status;
++        struct iattr *it_iattr;
++        __u64 it_lock_handle[2];
++        int it_lock_mode;
++        void *it_data;
++};
++
++#define INTENT_MAGIC 0x19620323
++struct lookup_intent {
++        int it_magic;
++        void (*it_op_release)(struct lookup_intent *);
++        int it_op;
++	union {
++		struct open_intent open;
++	} intent;
++        union {
++                struct lustre_intent_data lustre;
++        } fsdata;
++};
++
++static inline void intent_init(struct lookup_intent *it, int op)
++{
++        memset(it, 0, sizeof(*it));
++        it->it_magic = INTENT_MAGIC;
++        it->it_op = op;
++}
++
+ struct nameidata {
+ 	struct dentry	*dentry;
+ 	struct vfsmount *mnt;
+ 	struct qstr	last;
+ 	unsigned int	flags;
+ 	int		last_type;
+-
+-	/* Intent data */
+-	union {
+-		struct open_intent open;
+-	} intent;
++        struct lookup_intent intent;
+ };
+ 
+ /*
+@@ -41,6 +80,9 @@ enum {LAST_NORM, LAST_ROOT, LAST_DOT, LA
+ #define LOOKUP_CONTINUE		 4
+ #define LOOKUP_PARENT		16
+ #define LOOKUP_NOALT		32
++#define LOOKUP_LAST		 (1<<6)
++#define LOOKUP_LINK_NOTLAST	 (1<<7)
++
+ /*
+  * Intent data
+  */
+@@ -49,6 +91,12 @@ enum {LAST_NORM, LAST_ROOT, LAST_DOT, LA
+ #define LOOKUP_ACCESS		(0x0400)
+ 
+ extern int FASTCALL(__user_walk(const char __user *, unsigned, struct nameidata *));
++extern int FASTCALL(__user_walk_it(const char __user *name, unsigned flags, struct nameidata *nd));
++#define user_path_walk_it(name,nd) \
++	__user_walk_it(name, LOOKUP_FOLLOW, nd)
++#define user_path_walk_link_it(name,nd) \
++	__user_walk_it(name, 0, nd)
++extern void intent_release(struct lookup_intent *);
+ #define user_path_walk(name,nd) \
+ 	__user_walk(name, LOOKUP_FOLLOW, nd)
+ #define user_path_walk_link(name,nd) \
+@@ -60,7 +108,6 @@ extern void path_release(struct nameidat
+ 
+ extern struct dentry * lookup_one_len(const char *, struct dentry *, int);
+ extern struct dentry * lookup_hash(struct qstr *, struct dentry *);
+-
+ extern int follow_down(struct vfsmount **, struct dentry **);
+ extern int follow_up(struct vfsmount **, struct dentry **);
+ 
+--- linux-2.6.0-test1/kernel/ksyms.c~vfs_intent_2.6.0-test1	2003-07-16 17:20:31.000000000 -0600
++++ linux-2.6.0-test1-braam/kernel/ksyms.c	2003-07-16 17:32:36.000000000 -0600
+@@ -383,6 +383,7 @@ EXPORT_SYMBOL(unregister_filesystem);
+ EXPORT_SYMBOL(kern_mount);
+ EXPORT_SYMBOL(__mntput);
+ EXPORT_SYMBOL(may_umount);
++EXPORT_SYMBOL(reparent_to_init);
+ 
+ /* executable format registration */
+ EXPORT_SYMBOL(register_binfmt);
+@@ -412,6 +413,12 @@ EXPORT_SYMBOL(del_timer);
+ EXPORT_SYMBOL(request_irq);
+ EXPORT_SYMBOL(free_irq);
+ 
++/* lustre */
++EXPORT_SYMBOL(do_kern_mount);
++EXPORT_SYMBOL(exit_files);
++//EXPORT_SYMBOL(kmem_cache_validate);
++
++
+ /* waitqueue handling */
+ EXPORT_SYMBOL(add_wait_queue);
+ EXPORT_SYMBOL(add_wait_queue_exclusive);
+@@ -559,6 +566,7 @@ EXPORT_SYMBOL(sys_tz);
+ EXPORT_SYMBOL(file_fsync);
+ EXPORT_SYMBOL(fsync_buffers_list);
+ EXPORT_SYMBOL(clear_inode);
++EXPORT_SYMBOL(__iget);
+ EXPORT_SYMBOL(init_special_inode);
+ EXPORT_SYMBOL(new_inode);
+ EXPORT_SYMBOL(__insert_inode_hash);
+--- linux-2.6.0-test1/net/unix/af_unix.c~vfs_intent_2.6.0-test1	2003-07-13 21:35:16.000000000 -0600
++++ linux-2.6.0-test1-braam/net/unix/af_unix.c	2003-07-16 17:32:36.000000000 -0600
+@@ -702,7 +702,7 @@ static int unix_bind(struct socket *sock
+ 		/*
+ 		 * Do the final lookup.
+ 		 */
+-		dentry = lookup_hash(&nd.last, nd.dentry);
++		dentry = lookup_hash(&nd.last, nd.dentry, NULL);
+ 		err = PTR_ERR(dentry);
+ 		if (IS_ERR(dentry))
+ 			goto out_mknod_unlock;
+--- linux-2.6.0-test1/net/sunrpc/rpc_pipe.c~vfs_intent_2.6.0-test1	2003-07-13 21:32:34.000000000 -0600
++++ linux-2.6.0-test1-braam/net/sunrpc/rpc_pipe.c	2003-07-16 17:32:36.000000000 -0600
+@@ -598,7 +598,7 @@ rpc_lookup_negative(char *path, struct n
+ 		return ERR_PTR(error);
+ 	dir = nd->dentry->d_inode;
+ 	down(&dir->i_sem);
+-	dentry = lookup_hash(&nd->last, nd->dentry);
++	dentry = lookup_hash(&nd->last, nd->dentry, NULL);
+ 	if (IS_ERR(dentry))
+ 		goto out_err;
+ 	if (dentry->d_inode) {
+@@ -660,7 +660,7 @@ rpc_rmdir(char *path)
+ 		return error;
+ 	dir = nd.dentry->d_inode;
+ 	down(&dir->i_sem);
+-	dentry = lookup_hash(&nd.last, nd.dentry);
++	dentry = lookup_hash(&nd.last, nd.dentry, NULL);
+ 	if (IS_ERR(dentry)) {
+ 		error = PTR_ERR(dentry);
+ 		goto out_release;
+@@ -721,7 +721,7 @@ rpc_unlink(char *path)
+ 		return error;
+ 	dir = nd.dentry->d_inode;
+ 	down(&dir->i_sem);
+-	dentry = lookup_hash(&nd.last, nd.dentry);
++	dentry = lookup_hash(&nd.last, nd.dentry, NULL);
+ 	if (IS_ERR(dentry)) {
+ 		error = PTR_ERR(dentry);
+ 		goto out_release;
+
+_
diff --git a/lustre/kernel_patches/patches/vfs_mntcwd_2.5.72_rev1.patch b/lustre/kernel_patches/patches/vfs_mntcwd_2.5.72_rev1.patch
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/lustre/kernel_patches/patches/vfs_nointent_2.5.69_rev1.patch b/lustre/kernel_patches/patches/vfs_nointent_2.5.69_rev1.patch
new file mode 100644
index 0000000000..e2b086bbd1
--- /dev/null
+++ b/lustre/kernel_patches/patches/vfs_nointent_2.5.69_rev1.patch
@@ -0,0 +1,409 @@
+ fs/exec.c          |    2 -
+ fs/namei.c         |   75 +++++++++++++++++++++++++++++++++++++++++++++++++----
+ fs/open.c          |   73 ++++++++++++++++++++++++++++++++++++++++++++-------
+ include/linux/fs.h |    9 +++++-
+ 4 files changed, 142 insertions(+), 17 deletions(-)
+
+--- uml-2.5/fs/namei.c~vfs_nointent_2.5.69_rev1	2003-06-20 00:04:07.000000000 -0600
++++ uml-2.5-braam/fs/namei.c	2003-06-20 06:22:37.000000000 -0600
+@@ -1279,7 +1279,7 @@ int may_open(struct nameidata *nd, int a
+ 		if (!error) {
+ 			DQUOT_INIT(inode);
+ 			
+-			error = do_truncate(dentry, 0);
++			error = do_truncate(dentry, 0, 1);
+ 		}
+ 		put_write_access(inode);
+ 		if (error)
+@@ -1517,6 +1517,7 @@ asmlinkage long sys_mknod(const char __u
+ 	char * tmp;
+ 	struct dentry * dentry;
+ 	struct nameidata nd;
++	intent_init(&nd.it, IT_LOOKUP, 0);
+ 
+ 	if (S_ISDIR(mode))
+ 		return -EPERM;
+@@ -1527,6 +1528,15 @@ asmlinkage long sys_mknod(const char __u
+ 	error = path_lookup(tmp, LOOKUP_PARENT, &nd);
+ 	if (error)
+ 		goto out;
++
++	if (nd.dentry->d_inode->i_op->mknod_raw) {
++		struct inode_operations *op = nd.dentry->d_inode->i_op;
++		error = op->mknod_raw(&nd, mode, dev);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			goto out2;
++	}
++
+ 	dentry = lookup_create(&nd, 0);
+ 	error = PTR_ERR(dentry);
+ 
+@@ -1549,6 +1559,7 @@ asmlinkage long sys_mknod(const char __u
+ 		dput(dentry);
+ 	}
+ 	up(&nd.dentry->d_inode->i_sem);
++out2:
+ 	path_release(&nd);
+ out:
+ 	putname(tmp);
+@@ -1590,10 +1601,18 @@ asmlinkage long sys_mkdir(const char __u
+ 	if (!IS_ERR(tmp)) {
+ 		struct dentry *dentry;
+ 		struct nameidata nd;
++                intent_init(&nd.it, IT_LOOKUP, 0);
+ 
+ 		error = path_lookup(tmp, LOOKUP_PARENT, &nd);
+ 		if (error)
+ 			goto out;
++ 		if (nd.dentry->d_inode->i_op->mkdir_raw) {
++ 			struct inode_operations *op = nd.dentry->d_inode->i_op;
++ 			error = op->mkdir_raw(&nd, mode);
++ 			/* the file system wants to use normal vfs path now */
++ 			if (error != -EOPNOTSUPP)
++ 				goto out2;
++ 		}
+ 		dentry = lookup_create(&nd, 1);
+ 		error = PTR_ERR(dentry);
+ 		if (!IS_ERR(dentry)) {
+@@ -1603,6 +1622,7 @@ asmlinkage long sys_mkdir(const char __u
+ 			dput(dentry);
+ 		}
+ 		up(&nd.dentry->d_inode->i_sem);
++out2:
+ 		path_release(&nd);
+ out:
+ 		putname(tmp);
+@@ -1683,6 +1703,7 @@ asmlinkage long sys_rmdir(const char __u
+ 	char * name;
+ 	struct dentry *dentry;
+ 	struct nameidata nd;
++        intent_init(&nd.it, IT_LOOKUP, 0);
+ 
+ 	name = getname(pathname);
+ 	if(IS_ERR(name))
+@@ -1703,6 +1724,16 @@ asmlinkage long sys_rmdir(const char __u
+ 			error = -EBUSY;
+ 			goto exit1;
+ 	}
++ 
++ 	if (nd.dentry->d_inode->i_op->rmdir_raw) {
++ 		struct inode_operations *op = nd.dentry->d_inode->i_op;
++ 
++ 		error = op->rmdir_raw(&nd);
++ 		/* the file system wants to use normal vfs path now */
++ 		if (error != -EOPNOTSUPP)
++ 			goto exit1;
++ 	}
++ 
+ 	down(&nd.dentry->d_inode->i_sem);
+ 	dentry = lookup_hash(&nd.last, nd.dentry, &nd);
+ 	error = PTR_ERR(dentry);
+@@ -1759,6 +1790,7 @@ asmlinkage long sys_unlink(const char __
+ 	struct dentry *dentry;
+ 	struct nameidata nd;
+ 	struct inode *inode = NULL;
++        intent_init(&nd.it, IT_LOOKUP, 0);
+ 
+ 	name = getname(pathname);
+ 	if(IS_ERR(name))
+@@ -1770,6 +1802,13 @@ asmlinkage long sys_unlink(const char __
+ 	error = -EISDIR;
+ 	if (nd.last_type != LAST_NORM)
+ 		goto exit1;
++ 	if (nd.dentry->d_inode->i_op->unlink_raw) {
++ 		struct inode_operations *op = nd.dentry->d_inode->i_op;
++ 		error = op->unlink_raw(&nd);
++ 		/* the file system wants to use normal vfs path now */
++ 		if (error != -EOPNOTSUPP)
++ 			goto exit1;
++ 	}
+ 	down(&nd.dentry->d_inode->i_sem);
+ 	dentry = lookup_hash(&nd.last, nd.dentry, &nd);
+ 	error = PTR_ERR(dentry);
+@@ -1837,10 +1876,18 @@ asmlinkage long sys_symlink(const char _
+ 	if (!IS_ERR(to)) {
+ 		struct dentry *dentry;
+ 		struct nameidata nd;
++                intent_init(&nd.it, IT_LOOKUP, 0);
+ 
+ 		error = path_lookup(to, LOOKUP_PARENT, &nd);
+ 		if (error)
+ 			goto out;
++		if (nd.dentry->d_inode->i_op->symlink_raw) {
++			struct inode_operations *op = nd.dentry->d_inode->i_op;
++			error = op->symlink_raw(&nd, from);
++			/* the file system wants to use normal vfs path now */
++			if (error != -EOPNOTSUPP)
++				goto out2;
++		}
+ 		dentry = lookup_create(&nd, 0);
+ 		error = PTR_ERR(dentry);
+ 		if (!IS_ERR(dentry)) {
+@@ -1848,6 +1895,7 @@ asmlinkage long sys_symlink(const char _
+ 			dput(dentry);
+ 		}
+ 		up(&nd.dentry->d_inode->i_sem);
++out2:
+ 		path_release(&nd);
+ out:
+ 		putname(to);
+@@ -1911,6 +1959,8 @@ asmlinkage long sys_link(const char __us
+ 	struct nameidata nd, old_nd;
+ 	int error;
+ 	char * to;
++        intent_init(&nd.it, IT_LOOKUP, 0);
++        intent_init(&old_nd.it, IT_LOOKUP, 0);
+ 
+ 	to = getname(newname);
+ 	if (IS_ERR(to))
+@@ -1925,6 +1975,13 @@ asmlinkage long sys_link(const char __us
+ 	error = -EXDEV;
+ 	if (old_nd.mnt != nd.mnt)
+ 		goto out_release;
++        if (nd.dentry->d_inode->i_op->link_raw) {
++                struct inode_operations *op = nd.dentry->d_inode->i_op;
++                error = op->link_raw(&old_nd, &nd);
++                /* the file system wants to use normal vfs path now */
++                if (error != -EOPNOTSUPP)
++                        goto out_release;
++        }
+ 	new_dentry = lookup_create(&nd, 0);
+ 	error = PTR_ERR(new_dentry);
+ 	if (!IS_ERR(new_dentry)) {
+@@ -1975,7 +2032,7 @@ exit:
+  *	   locking].
+  */
+ int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
+-	       struct inode *new_dir, struct dentry *new_dentry)
++                   struct inode *new_dir, struct dentry *new_dentry)
+ {
+ 	int error = 0;
+ 	struct inode *target;
+@@ -2020,7 +2077,7 @@ int vfs_rename_dir(struct inode *old_dir
+ }
+ 
+ int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
+-	       struct inode *new_dir, struct dentry *new_dentry)
++                     struct inode *new_dir, struct dentry *new_dentry)
+ {
+ 	struct inode *target;
+ 	int error;
+@@ -2097,6 +2154,8 @@ static inline int do_rename(const char *
+ 	struct dentry * old_dentry, *new_dentry;
+ 	struct dentry * trap;
+ 	struct nameidata oldnd, newnd;
++        intent_init(&oldnd.it, IT_LOOKUP, 0);
++        intent_init(&newnd.it, IT_LOOKUP, 0);
+ 
+ 	error = path_lookup(oldname, LOOKUP_PARENT, &oldnd);
+ 	if (error)
+@@ -2119,6 +2178,13 @@ static inline int do_rename(const char *
+ 	if (newnd.last_type != LAST_NORM)
+ 		goto exit2;
+ 
++ 	if (old_dir->d_inode->i_op->rename_raw) {
++ 		error = old_dir->d_inode->i_op->rename_raw(&oldnd, &newnd);
++ 		/* the file system wants to use normal vfs path now */
++ 		if (error != -EOPNOTSUPP)
++ 			goto exit2;
++ 	}
++
+ 	trap = lock_rename(new_dir, old_dir);
+ 
+ 	old_dentry = lookup_hash(&oldnd.last, old_dir, &oldnd);
+@@ -2150,8 +2216,7 @@ static inline int do_rename(const char *
+ 	if (new_dentry == trap)
+ 		goto exit5;
+ 
+-	error = vfs_rename(old_dir->d_inode, old_dentry,
+-				   new_dir->d_inode, new_dentry);
++	error = vfs_rename(old_dir->d_inode, old_dentry, new_dir->d_inode, new_dentry);
+ exit5:
+ 	dput(new_dentry);
+ exit4:
+--- uml-2.5/fs/open.c~vfs_nointent_2.5.69_rev1	2003-06-18 21:42:57.000000000 -0600
++++ uml-2.5-braam/fs/open.c	2003-06-20 06:22:37.000000000 -0600
+@@ -75,9 +75,10 @@ out:
+ 	return error;
+ }
+ 
+-int do_truncate(struct dentry *dentry, loff_t length)
++int do_truncate(struct dentry *dentry, loff_t length, int called_from_open)
+ {
+ 	int err;
++	struct inode_operations *op = dentry->d_inode->i_op;
+ 	struct iattr newattrs;
+ 
+ 	/* Not pretty: "inode->i_size" shouldn't really be signed. But it is. */
+@@ -87,7 +88,14 @@ int do_truncate(struct dentry *dentry, l
+ 	newattrs.ia_size = length;
+ 	newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
+ 	down(&dentry->d_inode->i_sem);
+-	err = notify_change(dentry, &newattrs);
++	if (called_from_open)
++		newattrs.ia_valid |= ATTR_FROM_OPEN;
++	if (op->setattr_raw) {
++		newattrs.ia_valid |= ATTR_RAW;
++		newattrs.ia_ctime = CURRENT_TIME;
++		err = op->setattr_raw(dentry->d_inode, &newattrs);
++	} else 
++                err = notify_change(dentry, &newattrs);
+ 	up(&dentry->d_inode->i_sem);
+ 	return err;
+ }
+@@ -142,7 +150,7 @@ static inline long do_sys_truncate(const
+ 	error = locks_verify_truncate(inode, NULL, length);
+ 	if (!error) {
+ 		DQUOT_INIT(inode);
+-		error = do_truncate(nd.dentry, length);
++		error = do_truncate(nd.dentry, length, 0);
+ 	}
+ 	put_write_access(inode);
+ 
+@@ -194,7 +202,7 @@ static inline long do_sys_ftruncate(unsi
+ 
+ 	error = locks_verify_truncate(inode, file, length);
+ 	if (!error)
+-		error = do_truncate(dentry, length);
++		error = do_truncate(dentry, length, 0);
+ out_putf:
+ 	fput(file);
+ out:
+@@ -265,9 +273,19 @@ asmlinkage long sys_utime(char __user * 
+ 		    (error = permission(inode,MAY_WRITE)) != 0)
+ 			goto dput_and_out;
+ 	}
+-	down(&inode->i_sem);
+-	error = notify_change(nd.dentry, &newattrs);
+-	up(&inode->i_sem);
++	if (inode->i_op->setattr_raw) {
++		struct inode_operations *op = nd.dentry->d_inode->i_op;
++
++		newattrs.ia_valid |= ATTR_RAW;
++		error = op->setattr_raw(inode, &newattrs);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			goto dput_and_out;
++	} else {
++                down(&inode->i_sem);
++                error = notify_change(nd.dentry, &newattrs);
++                up(&inode->i_sem);
++        }
+ dput_and_out:
+ 	path_release(&nd);
+ out:
+@@ -310,9 +328,19 @@ long do_utimes(char __user * filename, s
+ 		    (error = permission(inode,MAY_WRITE)) != 0)
+ 			goto dput_and_out;
+ 	}
+-	down(&inode->i_sem);
+-	error = notify_change(nd.dentry, &newattrs);
+-	up(&inode->i_sem);
++	if (inode->i_op->setattr_raw) {
++		struct inode_operations *op = nd.dentry->d_inode->i_op;
++
++		newattrs.ia_valid |= ATTR_RAW;
++		error = op->setattr_raw(inode, &newattrs);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			goto dput_and_out;
++	} else {
++                down(&inode->i_sem);
++                error = notify_change(nd.dentry, &newattrs);
++                up(&inode->i_sem);
++        }
+ dput_and_out:
+ 	path_release(&nd);
+ out:
+@@ -513,6 +541,18 @@ asmlinkage long sys_chmod(const char __u
+ 	if (IS_RDONLY(inode))
+ 		goto dput_and_out;
+ 	
++	if (inode->i_op->setattr_raw) {
++		struct inode_operations *op = nd.dentry->d_inode->i_op;
++
++		newattrs.ia_mode = mode;
++		newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
++		newattrs.ia_valid |= ATTR_RAW;
++		error = op->setattr_raw(inode, &newattrs);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			goto dput_and_out;
++	}
++
+ 	error = -EPERM;
+ 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
+ 		goto dput_and_out;
+@@ -546,6 +586,18 @@ static int chown_common(struct dentry * 
+ 	if (IS_RDONLY(inode))
+ 		goto out;
+ 	error = -EPERM;
++	if (inode->i_op->setattr_raw) {
++		struct inode_operations *op = dentry->d_inode->i_op;
++
++		newattrs.ia_uid = user;
++		newattrs.ia_gid = group;
++		newattrs.ia_valid = ATTR_UID | ATTR_GID;
++		newattrs.ia_valid |= ATTR_RAW;
++		error = op->setattr_raw(inode, &newattrs);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			return error;
++	}
+ 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
+ 		goto out;
+ 	newattrs.ia_valid =  ATTR_CTIME;
+@@ -559,6 +611,7 @@ static int chown_common(struct dentry * 
+ 	}
+ 	if (!S_ISDIR(inode->i_mode))
+ 		newattrs.ia_valid |= ATTR_KILL_SUID|ATTR_KILL_SGID;
++
+ 	down(&inode->i_sem);
+ 	error = notify_change(dentry, &newattrs);
+ 	up(&inode->i_sem);
+--- uml-2.5/include/linux/fs.h~vfs_nointent_2.5.69_rev1	2003-06-18 21:40:58.000000000 -0600
++++ uml-2.5-braam/include/linux/fs.h	2003-06-20 06:22:37.000000000 -0600
+@@ -738,13 +738,20 @@ struct inode_operations {
+ 	struct dentry * (*lookup_it) (struct inode *,struct dentry *,
+ 					struct nameidata *);
+ 	int (*link) (struct dentry *,struct inode *,struct dentry *);
++	int (*link_raw) (struct nameidata *,struct nameidata *);
+ 	int (*unlink) (struct inode *,struct dentry *);
++	int (*unlink_raw) (struct nameidata *);
+ 	int (*symlink) (struct inode *,struct dentry *,const char *);
++	int (*symlink_raw) (struct nameidata *,const char *);
+ 	int (*mkdir) (struct inode *,struct dentry *,int);
++	int (*mkdir_raw) (struct nameidata *,int);
+ 	int (*rmdir) (struct inode *,struct dentry *);
++	int (*rmdir_raw) (struct nameidata *);
+ 	int (*mknod) (struct inode *,struct dentry *,int,dev_t);
++	int (*mknod_raw) (struct nameidata *,int,dev_t);
+ 	int (*rename) (struct inode *, struct dentry *,
+ 			struct inode *, struct dentry *);
++	int (*rename_raw) (struct nameidata *, struct nameidata *);
+ 	int (*readlink) (struct dentry *, char __user *,int);
+ 	int (*follow_link) (struct dentry *, struct nameidata *);
+ 	void (*truncate) (struct inode *);
+@@ -1029,7 +1036,7 @@ static inline int break_lease(struct ino
+ 
+ asmlinkage long sys_open(const char *, int, int);
+ asmlinkage long sys_close(unsigned int);	/* yes, it's really unsigned */
+-extern int do_truncate(struct dentry *, loff_t start);
++extern int do_truncate(struct dentry *, loff_t start, int called_from_open);
+ 
+ extern struct file *filp_open(const char *, int, int);
+ extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
+--- uml-2.5/fs/exec.c~vfs_nointent_2.5.69_rev1	2003-06-04 21:29:14.000000000 -0600
++++ uml-2.5-braam/fs/exec.c	2003-06-20 06:22:37.000000000 -0600
+@@ -1358,7 +1358,7 @@ int do_coredump(long signr, int exit_cod
+ 		goto close_fail;
+ 	if (!file->f_op->write)
+ 		goto close_fail;
+-	if (do_truncate(file->f_dentry, 0) != 0)
++	if (do_truncate(file->f_dentry, 0, 0) != 0)
+ 		goto close_fail;
+ 
+ 	retval = binfmt->core_dump(signr, regs, file);
+
+_
diff --git a/lustre/kernel_patches/patches/vfs_races_2.5.72_rev1.patch b/lustre/kernel_patches/patches/vfs_races_2.5.72_rev1.patch
new file mode 100644
index 0000000000..f1eeb01687
--- /dev/null
+++ b/lustre/kernel_patches/patches/vfs_races_2.5.72_rev1.patch
@@ -0,0 +1,83 @@
+ fs/dcache.c            |   24 ++++++++++++++++++++----
+ fs/namei.c             |    4 +++-
+ include/linux/dcache.h |    2 ++
+ 3 files changed, 25 insertions(+), 5 deletions(-)
+
+--- linux-2.5.72/fs/dcache.c~vfs_races_2.5.72_rev1	2003-06-16 22:19:41.000000000 -0600
++++ linux-2.5.72-braam/fs/dcache.c	2003-06-25 08:33:08.000000000 -0600
+@@ -212,7 +212,14 @@ int d_invalidate(struct dentry * dentry)
+ 		spin_unlock(&dcache_lock);
+ 		return 0;
+ 	}
+-	/*
++
++        /* network invalidation by Lustre */
++	if (dentry->d_flags & DCACHE_LUSTRE_INVALID) {
++		spin_unlock(&dcache_lock);
++		return 0;
++	}
++
++        /*
+ 	 * Check whether to do a partial shrink_dcache
+ 	 * to get rid of unused child entries.
+ 	 */
+@@ -1132,14 +1139,23 @@ void d_delete(struct dentry * dentry)
+  * Adds a dentry to the hash according to its name.
+  */
+  
+-void d_rehash(struct dentry * entry)
++void __d_rehash(struct dentry * entry, int lock)
+ {
+ 	struct hlist_head *list = d_hash(entry->d_parent, entry->d_name.hash);
+-	spin_lock(&dcache_lock);
++	if (lock)
++		spin_lock(&dcache_lock);
+  	entry->d_vfs_flags &= ~DCACHE_UNHASHED;
+ 	entry->d_bucket = list;
+  	hlist_add_head_rcu(&entry->d_hash, list);
+-	spin_unlock(&dcache_lock);
++	if (lock)
++		spin_unlock(&dcache_lock);
++}
++
++EXPORT_SYMBOL(__d_rehash);
++
++void d_rehash(struct dentry * entry)
++{
++	__d_rehash(entry, 1);
+ }
+ 
+ #define do_switch(x,y) do { \
+--- linux-2.5.72/fs/namei.c~vfs_races_2.5.72_rev1	2003-06-25 08:33:06.000000000 -0600
++++ linux-2.5.72-braam/fs/namei.c	2003-06-25 08:50:18.000000000 -0600
+@@ -368,6 +368,8 @@ static struct dentry * real_lookup(struc
+ 	struct dentry * result;
+ 	struct inode *dir = parent->d_inode;
+ 
++ again: 
++
+ 	down(&dir->i_sem);
+ 	/*
+ 	 * First re-do the cached lookup just in case it was created
+@@ -415,7 +417,7 @@ static struct dentry * real_lookup(struc
+ 		if (!result->d_op->d_revalidate_it(result, flags, nd) &&
+ 		    !d_invalidate(result)) {
+ 			dput(result);
+-			result = ERR_PTR(-ENOENT);
++			goto again;
+ 		}
+ 	}
+ 	return result;
+--- linux-2.5.72/include/linux/dcache.h~vfs_races_2.5.72_rev1	2003-06-25 08:25:04.000000000 -0600
++++ linux-2.5.72-braam/include/linux/dcache.h	2003-06-25 08:33:08.000000000 -0600
+@@ -180,6 +180,8 @@ d_iput:		no		no		yes
+ 
+ #define DCACHE_REFERENCED	0x0008  /* Recently used, don't discard. */
+ #define DCACHE_UNHASHED		0x0010	
++#define DCACHE_LUSTRE_INVALID     0x0020  /* Lustre invalidated */
++
+ 
+ extern spinlock_t dcache_lock;
+ 
+
+_
diff --git a/lustre/kernel_patches/pc/2.6.0-test1-mm2.pc b/lustre/kernel_patches/pc/2.6.0-test1-mm2.pc
new file mode 100644
index 0000000000..33e717923c
--- /dev/null
+++ b/lustre/kernel_patches/pc/2.6.0-test1-mm2.pc
@@ -0,0 +1,1202 @@
+arch/alpha/kernel/irq.c
+arch/alpha/kernel/smp.c
+arch/alpha/mm/init.c
+arch/alpha/mm/remap.c
+arch/arm26/kernel/setup.c
+arch/arm26/mm/init.c
+arch/arm26/mm/mm-memc.c
+arch/arm/mach-arc/mm.c
+arch/arm/mach-clps711x/autcpu12.c
+arch/arm/mm/consistent.c
+arch/arm/mm/ioremap.c
+arch/arm/mm/minicache.c
+arch/arm/mm/mm-armv.c
+arch/cris/mm/ioremap.c
+arch/h8300/kernel/setup.c
+arch/h8300/mm/init.c
+arch/i386/Kconfig
+arch/i386/kernel/apic.c
+arch/i386/kernel/apm.c
+arch/i386/kernel/cpu/cpufreq/p4-clockmod.c
+arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
+arch/i386/kernel/cpu/cpufreq/speedstep-ich.c
+arch/i386/kernel/cpuid.c
+arch/i386/kernel/cpu/mtrr/cyrix.c
+arch/i386/kernel/cpu/mtrr/main.c
+arch/i386/kernel/cpu/proc.c
+arch/i386/kernel/entry.S
+arch/i386/kernel/io_apic.c
+arch/i386/kernel/irq.c
+arch/i386/kernel/kgdb_stub.c
+arch/i386/kernel/ldt.c
+arch/i386/kernel/Makefile
+arch/i386/kernel/mpparse.c
+arch/i386/kernel/msr.c
+arch/i386/kernel/nmi.c
+arch/i386/kernel/reboot.c
+arch/i386/kernel/setup.c
+arch/i386/kernel/smpboot.c
+arch/i386/kernel/smp.c
+arch/i386/kernel/traps.c
+arch/i386/kernel/vm86.c
+arch/i386/lib/dec_and_lock.c
+arch/i386/lib/kgdb_serial.c
+arch/i386/lib/Makefile
+arch/i386/mach-generic/bigsmp.c
+arch/i386/mach-generic/default.c
+arch/i386/mach-generic/probe.c
+arch/i386/mach-generic/summit.c
+arch/i386/mach-visws/mpparse.c
+arch/i386/mach-voyager/voyager_smp.c
+arch/i386/Makefile
+arch/i386/mm/fault.c
+arch/i386/mm/hugetlbpage.c
+arch/i386/mm/init.c
+arch/i386/mm/ioremap.c
+arch/i386/mm/pageattr.c
+arch/i386/mm/pgtable.c
+arch/i386/pci/legacy.c
+arch/i386/pci/visws.c
+arch/ia64/hp/sim/simscsi.c
+arch/ia64/ia32/ia32_ioctl.c
+arch/ia64/kernel/acpi.c
+arch/ia64/kernel/entry.S
+arch/ia64/kernel/fsys.S
+arch/ia64/kernel/ia64_ksyms.c
+arch/ia64/kernel/init_task.c
+arch/ia64/kernel/iosapic.c
+arch/ia64/kernel/irq.c
+arch/ia64/kernel/module.c
+arch/ia64/kernel/perfmon.c
+arch/ia64/kernel/ptrace.c
+arch/ia64/kernel/setup.c
+arch/ia64/kernel/smpboot.c
+arch/ia64/kernel/smp.c
+arch/ia64/kernel/time.c
+arch/ia64/Makefile
+arch/ia64/mm/hugetlbpage.c
+arch/ia64/mm/init.c
+arch/ia64/pci/pci.c
+arch/ia64/scripts/check-model.c
+arch/ia64/scripts/toolchain-flags
+arch/m68k/apollo/dn_ints.c
+arch/m68k/atari/stram.c
+arch/m68k/kernel/head.S
+arch/m68k/mm/init.c
+arch/m68k/mm/kmap.c
+arch/m68k/mm/motorola.c
+arch/m68k/mm/sun3mmu.c
+arch/m68knommu/kernel/setup.c
+arch/m68knommu/mm/init.c
+arch/m68k/q40/q40ints.c
+arch/m68k/sun3x/dvma.c
+arch/mips64/kernel/irq.c
+arch/mips64/kernel/proc.c
+arch/mips64/kernel/setup.c
+arch/mips64/kernel/smp.c
+arch/mips/kernel/irq.c
+arch/mips/kernel/proc.c
+arch/mips/kernel/smp.c
+arch/mips/mm/fault.c
+arch/mips/mm/init.c
+arch/mips/mm/ioremap.c
+arch/mips/momentum/ocelot_c/setup.c
+arch/mips/momentum/ocelot_g/setup.c
+arch/mips/ramdisk/Makefile
+arch/mips/sgi-ip27/ip27-init.c
+arch/mips/sibyte/cfe/setup.c
+arch/mips/sibyte/cfe/smp.c
+arch/mips/sibyte/sb1250/prom.c
+arch/mips/sibyte/sb1250/smp.c
+arch/mips/sibyte/swarm/setup.c
+arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c
+arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c
+arch/mips/vr41xx/tanbac-tb0229/setup.c
+arch/parisc/kernel/ioctl32.c
+arch/parisc/kernel/pci-dma.c
+arch/parisc/kernel/smp.c
+arch/parisc/mm/ioremap.c
+arch/ppc64/boot/Makefile
+arch/ppc64/Kconfig
+arch/ppc64/kernel/htab.c
+arch/ppc64/kernel/irq.c
+arch/ppc64/kernel/iSeries_irq.c
+arch/ppc64/kernel/open_pic.c
+arch/ppc64/kernel/open_pic.h
+arch/ppc64/kernel/pacaData.c
+arch/ppc64/kernel/prom.c
+arch/ppc64/kernel/rtasd.c
+arch/ppc64/kernel/semaphore.c
+arch/ppc64/kernel/setup.c
+arch/ppc64/kernel/smp.c
+arch/ppc64/kernel/xics.c
+arch/ppc64/kernel/XmPciLpEvent.c
+arch/ppc64/mm/init.c
+arch/ppc/kernel/irq.c
+arch/ppc/kernel/misc.S
+arch/ppc/kernel/setup.c
+arch/ppc/kernel/smp.c
+arch/ppc/kernel/syscalls.c
+arch/ppc/kernel/time.c
+arch/ppc/mm/mem_pieces.c
+arch/ppc/platforms/4xx/beech.c
+arch/ppc/platforms/4xx/sycamore.c
+arch/ppc/platforms/4xx/walnut.c
+arch/ppc/platforms/pmac_cpufreq.c
+arch/ppc/platforms/residual.c
+arch/s390/defconfig
+arch/s390/kernel/compat_ioctl.c
+arch/s390/kernel/compat_linux.c
+arch/s390/kernel/entry64.S
+arch/s390/kernel/entry.S
+arch/s390/kernel/s390_ext.c
+arch/s390/kernel/setup.c
+arch/s390/kernel/smp.c
+arch/s390/mm/init.c
+arch/s390/mm/ioremap.c
+arch/sh/mm/init.c
+arch/sh/mm/ioremap.c
+arch/sparc64/kernel/devices.c
+arch/sparc64/kernel/head.S
+arch/sparc64/kernel/irq.c
+arch/sparc64/kernel/pci.c
+arch/sparc64/kernel/setup.c
+arch/sparc64/kernel/smp.c
+arch/sparc64/kernel/sparc64_ksyms.c
+arch/sparc64/kernel/time.c
+arch/sparc64/kernel/us2e_cpufreq.c
+arch/sparc64/kernel/us3_cpufreq.c
+arch/sparc64/lib/atomic.S
+arch/sparc64/lib/rwlock.S
+arch/sparc64/mm/fault.c
+arch/sparc64/mm/generic.c
+arch/sparc64/mm/hugetlbpage.c
+arch/sparc64/mm/init.c
+arch/sparc64/prom/bootstr.c
+arch/sparc/kernel/process.c
+arch/sparc/kernel/setup.c
+arch/sparc/mm/generic.c
+arch/sparc/mm/srmmu.c
+arch/sparc/mm/sun4c.c
+arch/um/drivers/ubd_kern.c
+arch/um/kernel/irq.c
+arch/um/kernel/skas/process_kern.c
+arch/um/kernel/smp.c
+arch/um/kernel/tt/process_kern.c
+arch/um/kernel/um_arch.c
+arch/v850/Kconfig
+arch/v850/kernel/anna.c
+arch/v850/kernel/as85ep1.c
+arch/v850/kernel/fpga85e2c.c
+arch/v850/kernel/gbus_int.c
+arch/v850/kernel/head.S
+arch/v850/kernel/highres_timer.c
+arch/v850/kernel/intv.S
+arch/v850/kernel/ma.c
+arch/v850/kernel/Makefile
+arch/v850/kernel/me2.c
+arch/v850/kernel/nb85e_cache.c
+arch/v850/kernel/nb85e_intc.c
+arch/v850/kernel/nb85e_timer_d.c
+arch/v850/kernel/nb85e_utils.c
+arch/v850/kernel/rte_cb.c
+arch/v850/kernel/rte_ma1_cb.c
+arch/v850/kernel/rte_me2_cb.c
+arch/v850/kernel/rte_nb85e_cb.c
+arch/v850/kernel/sim85e2.c
+arch/v850/kernel/sim85e2c.c
+arch/v850/kernel/teg.c
+arch/v850/kernel/v850e2_cache.c
+arch/v850/kernel/v850e_cache.c
+arch/v850/kernel/v850e_intc.c
+arch/v850/kernel/v850e_timer_d.c
+arch/v850/kernel/v850e_utils.c
+arch/v850/rte_me2_cb.ld
+arch/v850/sim85e2c.ld
+arch/v850/sim85e2.ld
+arch/v850/vmlinux.lds.S
+arch/x86_64/boot/compressed/head.S
+arch/x86_64/boot/compressed/misc.c
+arch/x86_64/ia32/syscall32.c
+arch/x86_64/kernel/apic.c
+arch/x86_64/kernel/io_apic.c
+arch/x86_64/kernel/irq.c
+arch/x86_64/kernel/ldt.c
+arch/x86_64/kernel/mpparse.c
+arch/x86_64/kernel/msr.c
+arch/x86_64/kernel/reboot.c
+arch/x86_64/kernel/setup.c
+arch/x86_64/kernel/smpboot.c
+arch/x86_64/kernel/smp.c
+arch/x86_64/mm/init.c
+arch/x86_64/mm/ioremap.c
+arch/x86_64/mm/numa.c
+Documentation/fb/neofb.txt
+Documentation/filesystems/proc.txt
+Documentation/i386/kgdb/andthen
+Documentation/i386/kgdb/debug-nmi.txt
+Documentation/i386/kgdb/gdb-globals.txt
+Documentation/i386/kgdb/gdbinit
+Documentation/i386/kgdb/gdbinit.hw
+Documentation/i386/kgdb/gdbinit-modules
+Documentation/i386/kgdb/kgdb.txt
+Documentation/i386/kgdb/loadmodule.sh
+Documentation/magic-number.txt
+Documentation/networking/vortex.txt
+Documentation/pnp.txt
+drivers/acorn/block/fd1772.c
+drivers/acorn/block/mfmhd.c
+drivers/acpi/executer/exutils.c
+drivers/acpi/hardware/hwregs.c
+drivers/acpi/osl.c
+drivers/acpi/processor.c
+drivers/acpi/tables.c
+drivers/acpi/tables/tbconvrt.c
+drivers/acpi/tables/tbget.c
+drivers/acpi/tables/tbinstal.c
+drivers/acpi/tables/tbrsdt.c
+drivers/acpi/tables/tbxfroot.c
+drivers/acpi/thermal.c
+drivers/acpi/utilities/utglobal.c
+drivers/atm/atmtcp.c
+drivers/base/node.c
+drivers/block/acsi.c
+drivers/block/amiflop.c
+drivers/block/as-iosched.c
+drivers/block/ataflop.c
+drivers/block/cciss.c
+drivers/block/cciss_scsi.c
+drivers/block/cpqarray.c
+drivers/block/cryptoloop.c
+drivers/block/DAC960.c
+drivers/block/deadline-iosched.c
+drivers/block/elevator.c
+drivers/block/floppy98.c
+drivers/block/floppy.c
+drivers/block/genhd.c
+drivers/block/ioctl.c
+drivers/block/Kconfig
+drivers/block/ll_rw_blk.c
+drivers/block/nbd.c
+drivers/block/paride/pcd.c
+drivers/block/paride/pd.c
+drivers/block/paride/pf.c
+drivers/block/ps2esdi.c
+drivers/block/swim3.c
+drivers/block/swim_iop.c
+drivers/block/umem.c
+drivers/block/xd.c
+drivers/block/z2ram.c
+drivers/cdrom/aztcd.c
+drivers/cdrom/cdrom.c
+drivers/cdrom/cdu31a.c
+drivers/cdrom/cm206.c
+drivers/cdrom/gscd.c
+drivers/cdrom/mcd.c
+drivers/cdrom/mcdx.c
+drivers/cdrom/optcd.c
+drivers/cdrom/sbpcd.c
+drivers/cdrom/sjcd.c
+drivers/cdrom/sonycd535.c
+drivers/char/agp/i460-agp.c
+drivers/char/busmouse.c
+drivers/char/drm/drm_memory.h
+drivers/char/ftape/lowlevel/fdc-io.c
+drivers/char/ftape/lowlevel/ftape-calibr.c
+drivers/char/ftape/lowlevel/ftape-format.c
+drivers/char/ftape/zftape/zftape-init.c
+drivers/char/ip2.c
+drivers/char/ip2/i2lib.c
+drivers/char/ip2/i2os.h
+drivers/char/ip2main.c
+drivers/char/istallion.c
+drivers/char/keyboard.c
+drivers/char/moxa.c
+drivers/char/nwbutton.h
+drivers/char/pcxx.c
+drivers/char/stallion.c
+drivers/char/sysrq.c
+drivers/char/tty_io.c
+drivers/char/watchdog/acquirewdt.c
+drivers/char/watchdog/i810-tco.c
+drivers/char/watchdog/i810-tco.h
+drivers/char/watchdog/ib700wdt.c
+drivers/char/watchdog/indydog.c
+drivers/char/watchdog/machzwd.c
+drivers/char/watchdog/pcwd.c
+drivers/char/watchdog/sbc60xxwdt.c
+drivers/char/watchdog/sc520_wdt.c
+drivers/char/watchdog/shwdt.c
+drivers/char/watchdog/softdog.c
+drivers/char/watchdog/wdt977.c
+drivers/char/watchdog/wdt_pci.c
+drivers/fc4/fc.c
+drivers/fc4/fcp_impl.h
+drivers/i2c/i2c-dev.c
+drivers/ide/ide-disk.c
+drivers/ide/ide-dma.c
+drivers/ide/ide-io.c
+drivers/ide/Kconfig
+drivers/ide/legacy/hd98.c
+drivers/ide/legacy/hd.c
+drivers/ide/ppc/mpc8xx.c
+drivers/ieee1394/amdtp.c
+drivers/ieee1394/sbp2.c
+drivers/input/keyboard/sunkbd.c
+drivers/input/mouse/psmouse-base.c
+drivers/md/dm.c
+drivers/md/dm.h
+drivers/md/dm-ioctl.c
+drivers/md/dm-ioctl-v1.c
+drivers/md/dm-ioctl-v4.c
+drivers/md/dm-table.c
+drivers/md/Kconfig
+drivers/md/linear.c
+drivers/md/md.c
+drivers/md/multipath.c
+drivers/md/raid0.c
+drivers/md/raid1.c
+drivers/media/common/Makefile
+drivers/media/common/saa7146_core.c
+drivers/media/common/saa7146_fops.c
+drivers/media/common/saa7146_hlp.c
+drivers/media/common/saa7146_i2c.c
+drivers/media/common/saa7146_vbi.c
+drivers/media/common/saa7146_video.c
+drivers/media/common/saa7146_vv_ksyms.c
+drivers/media/dvb/b2c2/Kconfig
+drivers/media/dvb/b2c2/Makefile
+drivers/media/dvb/b2c2/skystar2.c
+drivers/media/dvb/dvb-core/dvb_demux.c
+drivers/media/dvb/dvb-core/dvbdev.c
+drivers/media/dvb/dvb-core/dvbdev.h
+drivers/media/dvb/dvb-core/dvb_frontend.c
+drivers/media/dvb/dvb-core/dvb_functions.c
+drivers/media/dvb/dvb-core/dvb_functions.h
+drivers/media/dvb/dvb-core/dvb_net.c
+drivers/media/dvb/dvb-core/dvb_net.h
+drivers/media/dvb/frontends/alps_bsrv2.c
+drivers/media/dvb/frontends/alps_tdlb7.c
+drivers/media/dvb/frontends/grundig_29504-401.c
+drivers/media/dvb/frontends/grundig_29504-491.c
+drivers/media/dvb/frontends/Kconfig
+drivers/media/dvb/frontends/Makefile
+drivers/media/dvb/frontends/mt312.c
+drivers/media/dvb/frontends/mt312.h
+drivers/media/dvb/frontends/nxt6000.c
+drivers/media/dvb/frontends/tda1004x.c
+drivers/media/dvb/frontends/ves1820.c
+drivers/media/dvb/Kconfig
+drivers/media/dvb/Makefile
+drivers/media/dvb/ttpci/av7110.c
+drivers/media/dvb/ttpci/av7110.h
+drivers/media/dvb/ttpci/budget-av.c
+drivers/media/dvb/ttpci/budget.c
+drivers/media/dvb/ttpci/budget-ci.c
+drivers/media/dvb/ttpci/budget-core.c
+drivers/media/dvb/ttpci/budget-patch.c
+drivers/media/dvb/ttpci/Makefile
+drivers/media/dvb/ttpci/ttpci-eeprom.c
+drivers/media/dvb/ttpci/ttpci-eeprom.h
+drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
+drivers/media/dvb/ttusb-budget/dvb-ttusb-dspbootcode.h
+drivers/media/dvb/ttusb-budget/Kconfig
+drivers/media/dvb/ttusb-budget/Makefile
+drivers/media/dvb/ttusb-dec/dec2000_frontend.c
+drivers/media/dvb/ttusb-dec/fdump.c
+drivers/media/dvb/ttusb-dec/Kconfig
+drivers/media/dvb/ttusb-dec/Makefile
+drivers/media/dvb/ttusb-dec/ttusb_dec.c
+drivers/media/dvb/ttusb-dec/ttusb_dec.h
+drivers/media/video/dpc7146.c
+drivers/media/video/hexium_gemini.c
+drivers/media/video/hexium_gemini.h
+drivers/media/video/hexium.h
+drivers/media/video/hexium_orion.c
+drivers/media/video/hexium_orion.h
+drivers/media/video/Kconfig
+drivers/media/video/Makefile
+drivers/media/video/mxb.c
+drivers/media/video/pms.c
+drivers/message/fusion/mptctl.c
+drivers/message/fusion/mptscsih.c
+drivers/message/i2o/i2o_block.c
+drivers/message/i2o/i2o_scsi.c
+drivers/mtd/devices/blkmtd.c
+drivers/mtd/mtd_blkdevs.c
+drivers/net/3c59x.c
+drivers/net/eql.c
+drivers/net/fc/iph5526.c
+drivers/net/irda/vlsi_ir.c
+drivers/net/Kconfig
+drivers/net/ni65.c
+drivers/net/ni65.h
+drivers/net/pcmcia/Kconfig
+drivers/net/seeq8005.c
+drivers/net/wan/comx-hw-comx.c
+drivers/net/wan/sdladrv.c
+drivers/net/wan/sdlamain.c
+drivers/net/wan/syncppp.c
+drivers/net/wireless/airo.c
+drivers/net/wireless/ray_cs.c
+drivers/parisc/led.c
+drivers/parport/parport_pc.c
+drivers/pci/hotplug/acpiphp_glue.c
+drivers/pci/hotplug/acpiphp_pci.c
+drivers/pci/hotplug.c
+drivers/pci/hotplug/cpci_hotplug_core.c
+drivers/pci/hotplug/cpci_hotplug.h
+drivers/pci/hotplug/cpci_hotplug_pci.c
+drivers/pci/hotplug/Kconfig
+drivers/pci/Makefile
+drivers/pci/pci.c
+drivers/pci/pool.c
+drivers/pci/probe.c
+drivers/pci/quirks.c
+drivers/pci/remove.c
+drivers/pci/setup-bus.c
+drivers/pci/setup-res.c
+drivers/pcmcia/hd64465_ss.c
+drivers/pcmcia/ricoh.h
+drivers/pcmcia/ti113x.h
+drivers/pcmcia/yenta_socket.c
+drivers/pnp/isapnp/core.c
+drivers/s390/block/dasd.c
+drivers/s390/block/dasd_genhd.c
+drivers/s390/block/dasd_int.h
+drivers/s390/block/dasd_ioctl.c
+drivers/s390/block/xpram.c
+drivers/s390/char/sclp.c
+drivers/s390/char/tape_block.c
+drivers/s390/cio/chsc.c
+drivers/s390/cio/cio.c
+drivers/s390/cio/device.c
+drivers/s390/cio/device_fsm.c
+drivers/s390/cio/device.h
+drivers/s390/cio/qdio.c
+drivers/s390/net/qeth.c
+drivers/s390/net/qeth.h
+drivers/s390/net/qeth_mpc.h
+drivers/sbus/char/envctrl.c
+drivers/sbus/char/jsflash.c
+drivers/scsi/3w-xxxx.c
+drivers/scsi/53c700.c
+drivers/scsi/53c7xx.c
+drivers/scsi/a2091.c
+drivers/scsi/a3000.c
+drivers/scsi/aacraid/aachba.c
+drivers/scsi/aacraid/commctrl.c
+drivers/scsi/aacraid/comminit.c
+drivers/scsi/aacraid/commsup.c
+drivers/scsi/aacraid/dpcsup.c
+drivers/scsi/aacraid/linit.c
+drivers/scsi/aacraid/rx.c
+drivers/scsi/aacraid/sa.c
+drivers/scsi/advansys.c
+drivers/scsi/aha152x.c
+drivers/scsi/aha1542.c
+drivers/scsi/aha1542.h
+drivers/scsi/aha1740.c
+drivers/scsi/aic7xxx/aic79xx_osm.c
+drivers/scsi/aic7xxx/aic79xx_osm.h
+drivers/scsi/aic7xxx/aic7xxx_osm.c
+drivers/scsi/aic7xxx/aic7xxx_osm.h
+drivers/scsi/aic7xxx/aiclib.c
+drivers/scsi/aic7xxx_old.c
+drivers/scsi/AM53C974.c
+drivers/scsi/amiga7xx.c
+drivers/scsi/arm/acornscsi.c
+drivers/scsi/arm/arxescsi.c
+drivers/scsi/arm/cumana_1.c
+drivers/scsi/arm/cumana_2.c
+drivers/scsi/arm/ecoscsi.c
+drivers/scsi/arm/eesox.c
+drivers/scsi/arm/fas216.c
+drivers/scsi/arm/oak.c
+drivers/scsi/arm/powertec.c
+drivers/scsi/arm/queue.c
+drivers/scsi/atari_scsi.c
+drivers/scsi/atp870u.c
+drivers/scsi/blz1230.c
+drivers/scsi/blz2060.c
+drivers/scsi/BusLogic.c
+drivers/scsi/bvme6000.c
+drivers/scsi/constants.c
+drivers/scsi/cpqfcTScontrol.c
+drivers/scsi/cpqfcTSinit.c
+drivers/scsi/cpqfcTSworker.c
+drivers/scsi/cyberstorm.c
+drivers/scsi/cyberstormII.c
+drivers/scsi/dc395x.c
+drivers/scsi/dec_esp.c
+drivers/scsi/dmx3191d.c
+drivers/scsi/dpt_i2o.c
+drivers/scsi/dtc.c
+drivers/scsi/eata.c
+drivers/scsi/eata_pio.c
+drivers/scsi/esp.c
+drivers/scsi/fastlane.c
+drivers/scsi/fcal.c
+drivers/scsi/fd_mcs.c
+drivers/scsi/fdomain.c
+drivers/scsi/gdth.c
+drivers/scsi/g_NCR5380.c
+drivers/scsi/gvp11.c
+drivers/scsi/hosts.c
+drivers/scsi/i91uscsi.c
+drivers/scsi/ibmmca.c
+drivers/scsi/ide-scsi.c
+drivers/scsi/imm.c
+drivers/scsi/imm.h
+drivers/scsi/in2000.c
+drivers/scsi/ini9100u.c
+drivers/scsi/inia100.c
+drivers/scsi/ips.c
+drivers/scsi/ips.h
+drivers/scsi/isp/asm_1000.h
+drivers/scsi/isp/asm_1040.h
+drivers/scsi/isp/asm_1080.h
+drivers/scsi/isp/asm_12160.h
+drivers/scsi/isp/asm_2100.h
+drivers/scsi/isp/asm_2200.h
+drivers/scsi/isp/asm_2300.h
+drivers/scsi/isp/isp.c
+drivers/scsi/isp/isp_cb_ops.c
+drivers/scsi/isp/isp_inline.h
+drivers/scsi/isp/isp_ioctl.h
+drivers/scsi/isp/isp_linux.c
+drivers/scsi/isp/isp_linux.h
+drivers/scsi/isp/ispmbox.h
+drivers/scsi/isp/isp_pci.c
+drivers/scsi/isp/ispreg.h
+drivers/scsi/isp/isp_target.c
+drivers/scsi/isp/isp_target.h
+drivers/scsi/isp/isp_tpublic.h
+drivers/scsi/isp/ispvar.h
+drivers/scsi/isp/Makefile
+drivers/scsi/jazz_esp.c
+drivers/scsi/Kconfig
+drivers/scsi/lasi700.c
+drivers/scsi/mac53c94.c
+drivers/scsi/mac_esp.c
+drivers/scsi/mac_scsi.c
+drivers/scsi/Makefile
+drivers/scsi/mca_53c9x.c
+drivers/scsi/megaraid.c
+drivers/scsi/mesh.c
+drivers/scsi/mvme147.c
+drivers/scsi/mvme16x.c
+drivers/scsi/NCR53c406a.c
+drivers/scsi/ncr53c8xx.c
+drivers/scsi/NCR53C9x.c
+drivers/scsi/NCR_D700.c
+drivers/scsi/NCR_Q720.c
+drivers/scsi/nsp32.c
+drivers/scsi/oktagon_esp.c
+drivers/scsi/osst.c
+drivers/scsi/pas16.c
+drivers/scsi/pc980155.c
+drivers/scsi/pci2000.c
+drivers/scsi/pci2220i.c
+drivers/scsi/pcmcia/aha152x_stub.c
+drivers/scsi/pcmcia/fdomain_stub.c
+drivers/scsi/pcmcia/nsp_cs.c
+drivers/scsi/pcmcia/qlogic_stub.c
+drivers/scsi/pluto.c
+drivers/scsi/ppa.c
+drivers/scsi/ppa.h
+drivers/scsi/psi240i.c
+drivers/scsi/qla1280.c
+drivers/scsi/qlogicfas.c
+drivers/scsi/qlogicfc.c
+drivers/scsi/qlogicisp.c
+drivers/scsi/qlogicpti.c
+drivers/scsi/scsicam.c
+drivers/scsi/scsi_debug.c
+drivers/scsi/scsi.h
+drivers/scsi/scsi_ioctl.c
+drivers/scsi/scsi_lib.c
+drivers/scsi/scsi_module.c
+drivers/scsi/scsi_pc98.c
+drivers/scsi/scsi_priv.h
+drivers/scsi/scsi_proc.c
+drivers/scsi/scsi_scan.c
+drivers/scsi/scsi_syms.c
+drivers/scsi/scsi_sysfs.c
+drivers/scsi/sd.c
+drivers/scsi/seagate.c
+drivers/scsi/sg.c
+drivers/scsi/sgiwd93.c
+drivers/scsi/sim710.c
+drivers/scsi/sr.c
+drivers/scsi/sr_ioctl.c
+drivers/scsi/sr_vendor.c
+drivers/scsi/st.c
+drivers/scsi/sun3_scsi.c
+drivers/scsi/sun3_scsi_vme.c
+drivers/scsi/sun3x_esp.c
+drivers/scsi/sym53c416.c
+drivers/scsi/sym53c8xx_2/sym_glue.c
+drivers/scsi/sym53c8xx_2/sym_glue.h
+drivers/scsi/sym53c8xx_2/sym_hipd.c
+drivers/scsi/sym53c8xx.c
+drivers/scsi/t128.c
+drivers/scsi/tmscsim.c
+drivers/scsi/u14-34f.c
+drivers/scsi/ultrastor.c
+drivers/scsi/wd33c93.c
+drivers/scsi/wd7000.c
+drivers/scsi/zalon.c
+drivers/serial/8250.c
+drivers/serial/core.c
+drivers/serial/Kconfig
+drivers/serial/Makefile
+drivers/serial/nb85e_uart.c
+drivers/serial/sunsu.c
+drivers/serial/sunzilog.c
+drivers/serial/v850e_uart.c
+drivers/telephony/ixj.c
+drivers/telephony/Kconfig
+drivers/usb/class/bluetty.c
+drivers/usb/class/cdc-acm.c
+drivers/usb/class/usblp.c
+drivers/usb/core/file.c
+drivers/usb/core/hcd.c
+drivers/usb/core/hcd-pci.c
+drivers/usb/core/usb.c
+drivers/usb/gadget/ether.c
+drivers/usb/gadget/net2280.c
+drivers/usb/gadget/net2280.h
+drivers/usb/gadget/zero.c
+drivers/usb/host/ohci-hcd.c
+drivers/usb/host/ohci-q.c
+drivers/usb/host/uhci-hcd.c
+drivers/usb/image/hpusbscsi.c
+drivers/usb/image/microtek.c
+drivers/usb/image/scanner.c
+drivers/usb/image/scanner.h
+drivers/usb/media/dabusb.c
+drivers/usb/media/vicam.c
+drivers/usb/misc/usblcd.c
+drivers/usb/misc/usbtest.c
+drivers/usb/net/ax8817x.c
+drivers/usb/net/catc.c
+drivers/usb/net/kaweth.c
+drivers/usb/net/pegasus.c
+drivers/usb/net/rtl8150.c
+drivers/usb/net/usbnet.c
+drivers/usb/serial/ftdi_sio.c
+drivers/usb/serial/ftdi_sio.h
+drivers/usb/serial/ipaq.c
+drivers/usb/serial/ipaq.h
+drivers/usb/serial/usb-serial.c
+drivers/usb/serial/visor.c
+drivers/usb/storage/debug.h
+drivers/usb/storage/isd200.c
+drivers/usb/storage/jumpshot.c
+drivers/usb/storage/protocol.c
+drivers/usb/storage/protocol.h
+drivers/usb/storage/scsiglue.c
+drivers/usb/storage/scsiglue.h
+drivers/usb/storage/sddr09.c
+drivers/usb/storage/sddr55.c
+drivers/usb/storage/transport.h
+drivers/usb/storage/unusual_devs.h
+drivers/usb/storage/usb.c
+drivers/usb/storage/usb.h
+drivers/usb/usb-skeleton.c
+drivers/video/cfbimgblt.c
+drivers/video/chipsfb.c
+drivers/video/console/fbcon.c
+drivers/video/controlfb.c
+drivers/video/epson1355fb.c
+drivers/video/fbmem.c
+drivers/video/g364fb.c
+drivers/video/i2c.c
+drivers/video/i2c.h
+drivers/video/Kconfig
+drivers/video/logo/logo.c
+drivers/video/macfb.c
+drivers/video/Makefile
+drivers/video/neofb.c
+drivers/video/platinumfb.c
+drivers/video/pvr2fb.c
+drivers/video/sis/300vtbl.h
+drivers/video/sis/310vtbl.h
+drivers/video/sis/init301.c
+drivers/video/sis/init301.h
+drivers/video/sis/init.c
+drivers/video/sis/initdef.h
+drivers/video/sis/init.h
+drivers/video/sis/oem300.h
+drivers/video/sis/oem310.h
+drivers/video/sis/osdef.h
+drivers/video/sis/sis_accel.c
+drivers/video/sis/sis_accel.h
+drivers/video/sis/sis_main.c
+drivers/video/sis/sis_main.h
+drivers/video/sis/vgatypes.h
+drivers/video/sis/vstruct.h
+drivers/video/skeletonfb.c
+drivers/video/softcursor.c
+drivers/video/valkyriefb.c
+drivers/video/vesafb.c
+fs/aio.c
+fs/binfmt_elf.c
+fs/bio.c
+fs/buffer.c
+fs/cifs/CHANGES
+fs/cifs/cifsfs.c
+fs/cifs/cifsglob.h
+fs/cifs/connect.c
+fs/cifs/misc.c
+fs/cifs/TODO
+fs/cifs/transport.c
+fs/compat_ioctl.c
+fs/devfs/base.c
+fs/exec.c
+fs/ext2/inode.c
+fs/ext3/acl.c
+fs/ext3/balloc.c
+fs/ext3/inode.c
+fs/ext3/super.c
+fs/ext3/xattr.c
+fs/inode.c
+fs/intermezzo/sysctl.c
+fs/intermezzo/vfs.c
+fs/jbd/journal.c
+fs/jbd/transaction.c
+fs/jffs2/Makefile
+fs/Kconfig
+fs/lockd/clntlock.c
+fs/lockd/svc.c
+fs/namei.c
+fs/namespace.c
+fs/nfs/direct.c
+fs/nfsd/nfssvc.c
+fs/nfs/inode.c
+fs/nfs/nfs3proc.c
+fs/nfs/nfs3xdr.c
+fs/nfs/nfs4proc.c
+fs/nfs/pagelist.c
+fs/nfs/proc.c
+fs/nfs/read.c
+fs/nfs/write.c
+fs/partitions/check.c
+fs/partitions/efi.h
+fs/partitions/nec98.c
+fs/proc/array.c
+fs/proc/proc_misc.c
+fs/stat.c
+fs/umsdos/ioctl.c
+fs/vfat/namei.c
+include/acpi/acconfig.h
+include/acpi/platform/acenv.h
+include/asm-alpha/lockmeter.h
+include/asm-alpha/pgalloc.h
+include/asm-alpha/pgtable.h
+include/asm-alpha/posix_types.h
+include/asm-alpha/smp.h
+include/asm-alpha/spinlock.h
+include/asm-arm26/pgalloc.h
+include/asm-arm26/pgtable.h
+include/asm-arm26/posix_types.h
+include/asm-arm/pgalloc.h
+include/asm-arm/pgtable.h
+include/asm-arm/posix_types.h
+include/asm-cris/pgalloc.h
+include/asm-cris/pgtable.h
+include/asm-cris/posix_types.h
+include/asm-generic/cpumask_array.h
+include/asm-generic/cpumask_const_reference.h
+include/asm-generic/cpumask_const_value.h
+include/asm-generic/cpumask_up.h
+include/asm-generic/local.h
+include/asm-generic/percpu.h
+include/asm-generic/sections.h
+include/asm-h8300/pgtable.h
+include/asm-h8300/posix_types.h
+include/asm-i386/atomic.h
+include/asm-i386/bitops.h
+include/asm-i386/bugs.h
+include/asm-i386/genapic.h
+include/asm-i386/highmem.h
+include/asm-i386/hw_irq.h
+include/asm-i386/kgdb.h
+include/asm-i386/kgdb_local.h
+include/asm-i386/kmap_types.h
+include/asm-i386/local.h
+include/asm-i386/lockmeter.h
+include/asm-i386/mach-bigsmp/mach_apic.h
+include/asm-i386/mach-bigsmp/mach_ipi.h
+include/asm-i386/mach-default/mach_apic.h
+include/asm-i386/mach-default/mach_ipi.h
+include/asm-i386/mach-es7000/mach_apic.h
+include/asm-i386/mach-es7000/mach_ipi.h
+include/asm-i386/mach-numaq/mach_apic.h
+include/asm-i386/mach-numaq/mach_ipi.h
+include/asm-i386/mach-summit/mach_apic.h
+include/asm-i386/mach-summit/mach_ipi.h
+include/asm-i386/mach-visws/mach_apic.h
+include/asm-i386/mmu_context.h
+include/asm-i386/mpspec.h
+include/asm-i386/numaq.h
+include/asm-i386/pgalloc.h
+include/asm-i386/pgtable-2level.h
+include/asm-i386/pgtable-3level.h
+include/asm-i386/pgtable.h
+include/asm-i386/posix_types.h
+include/asm-i386/rwlock.h
+include/asm-i386/smp.h
+include/asm-i386/spinlock.h
+include/asm-i386/stat.h
+include/asm-i386/thread_info.h
+include/asm-i386/topology.h
+include/asm-i386/unistd.h
+include/asm-ia64/atomic.h
+include/asm-ia64/bitops.h
+include/asm-ia64/elf.h
+include/asm-ia64/local.h
+include/asm-ia64/lockmeter.h
+include/asm-ia64/mmu_context.h
+include/asm-ia64/percpu.h
+include/asm-ia64/pgalloc.h
+include/asm-ia64/pgtable.h
+include/asm-ia64/posix_types.h
+include/asm-ia64/processor.h
+include/asm-ia64/smp.h
+include/asm-ia64/spinlock.h
+include/asm-ia64/system.h
+include/asm-ia64/tlb.h
+include/asm-m68k/motorola_pgalloc.h
+include/asm-m68k/motorola_pgtable.h
+include/asm-m68knommu/pgtable.h
+include/asm-m68k/posix_types.h
+include/asm-m68k/sun3_pgalloc.h
+include/asm-mips64/lockmeter.h
+include/asm-mips64/pgalloc.h
+include/asm-mips64/pgtable.h
+include/asm-mips64/posix_types.h
+include/asm-mips64/smp.h
+include/asm-mips/lockmeter.h
+include/asm-mips/pgalloc.h
+include/asm-mips/pgtable.h
+include/asm-mips/posix_types.h
+include/asm-mips/smp.h
+include/asm-mips/spinlock.h
+include/asm-parisc/pgalloc.h
+include/asm-parisc/pgtable.h
+include/asm-parisc/posix_types.h
+include/asm-parisc/smp.h
+include/asm-ppc64/mmu_context.h
+include/asm-ppc64/pgalloc.h
+include/asm-ppc64/pgtable.h
+include/asm-ppc64/semaphore.h
+include/asm-ppc64/smp.h
+include/asm-ppc64/tlb.h
+include/asm-ppc/hardirq.h
+include/asm-ppc/ipc.h
+include/asm-ppc/pci.h
+include/asm-ppc/pgalloc.h
+include/asm-ppc/pgtable.h
+include/asm-ppc/posix_types.h
+include/asm-ppc/processor.h
+include/asm-ppc/smp.h
+include/asm-ppc/uaccess.h
+include/asm-ppc/unistd.h
+include/asm-s390/bitops.h
+include/asm-s390/dma.h
+include/asm-s390/dma-mapping.h
+include/asm-s390/irq.h
+include/asm-s390/mmu_context.h
+include/asm-s390/pgalloc.h
+include/asm-s390/pgtable.h
+include/asm-s390/posix_types.h
+include/asm-s390/siginfo.h
+include/asm-s390/smp.h
+include/asm-s390/tlbflush.h
+include/asm-sh/pgalloc.h
+include/asm-sh/pgtable-2level.h
+include/asm-sh/posix_types.h
+include/asm-sparc64/atomic.h
+include/asm-sparc64/bitops.h
+include/asm-sparc64/local.h
+include/asm-sparc64/lockmeter.h
+include/asm-sparc64/mmu_context.h
+include/asm-sparc64/pgalloc.h
+include/asm-sparc64/pgtable.h
+include/asm-sparc64/posix_types.h
+include/asm-sparc64/sections.h
+include/asm-sparc64/smp.h
+include/asm-sparc64/spinlock.h
+include/asm-sparc/pgalloc.h
+include/asm-sparc/pgtable.h
+include/asm-sparc/posix_types.h
+include/asm-sparc/smp.h
+include/asm-um/pgalloc.h
+include/asm-um/pgtable.h
+include/asm-um/smp.h
+include/asm-v850/anna.h
+include/asm-v850/as85ep1.h
+include/asm-v850/asm.h
+include/asm-v850/cacheflush.h
+include/asm-v850/entry.h
+include/asm-v850/fpga85e2c.h
+include/asm-v850/highres_timer.h
+include/asm-v850/ma1.h
+include/asm-v850/machdep.h
+include/asm-v850/ma.h
+include/asm-v850/me2.h
+include/asm-v850/nb85e_cache.h
+include/asm-v850/nb85e.h
+include/asm-v850/nb85e_intc.h
+include/asm-v850/nb85e_timer_c.h
+include/asm-v850/nb85e_timer_d.h
+include/asm-v850/nb85e_uart.h
+include/asm-v850/nb85e_utils.h
+include/asm-v850/pgtable.h
+include/asm-v850/posix_types.h
+include/asm-v850/processor.h
+include/asm-v850/ptrace.h
+include/asm-v850/rte_cb.h
+include/asm-v850/rte_ma1_cb.h
+include/asm-v850/rte_me2_cb.h
+include/asm-v850/rte_nb85e_cb.h
+include/asm-v850/serial.h
+include/asm-v850/sim85e2c.h
+include/asm-v850/sim85e2.h
+include/asm-v850/sim85e2s.h
+include/asm-v850/stat.h
+include/asm-v850/system.h
+include/asm-v850/teg.h
+include/asm-v850/v850e2_cache.h
+include/asm-v850/v850e2.h
+include/asm-v850/v850e_cache.h
+include/asm-v850/v850e.h
+include/asm-v850/v850e_intc.h
+include/asm-v850/v850e_timer_c.h
+include/asm-v850/v850e_timer_d.h
+include/asm-v850/v850e_uarta.h
+include/asm-v850/v850e_uartb.h
+include/asm-v850/v850e_uart.h
+include/asm-v850/v850e_utils.h
+include/asm-x86_64/bitops.h
+include/asm-x86_64/mpspec.h
+include/asm-x86_64/pgalloc.h
+include/asm-x86_64/pgtable.h
+include/asm-x86_64/posix_types.h
+include/asm-x86_64/smp.h
+include/asm-x86_64/topology.h
+include/linux/aio.h
+include/linux/atmdev.h
+include/linux/bitmap.h
+include/linux/blkdev.h
+include/linux/blk.h
+include/linux/buffer_head.h
+include/linux/compiler.h
+include/linux/config.h
+include/linux/cpumask.h
+include/linux/dm-ioctl.h
+include/linux/dm-ioctl-v1.h
+include/linux/dm-ioctl-v4.h
+include/linux/elevator.h
+include/linux/elfcore.h
+include/linux/errno.h
+include/linux/ext3_fs.h
+include/linux/ext3_jbd.h
+include/linux/fb.h
+include/linux/fs.h
+include/linux/hfs_sysdep.h
+include/linux/ide.h
+include/linux/init_task.h
+include/linux/irq.h
+include/linux/kdev_t.h
+include/linux/kernel_stat.h
+include/linux/linux_logo.h
+include/linux/list.h
+include/linux/lockmeter.h
+include/linux/loop.h
+include/linux/mm.h
+include/linux/module.h
+include/linux/namespace.h
+include/linux/netdevice.h
+include/linux/nfs_fs.h
+include/linux/nfs_fs_sb.h
+include/linux/nfs_mount.h
+include/linux/nfs_page.h
+include/linux/nfs_xdr.h
+include/linux/node.h
+include/linux/pagemap.h
+include/linux/pci.h
+include/linux/raid/md_k.h
+include/linux/rcupdate.h
+include/linux/root_dev.h
+include/linux/sched.h
+include/linux/serial_core.h
+include/linux/smp.h
+include/linux/spinlock.h
+include/linux/times.h
+include/linux/topology.h
+include/linux/tty.h
+include/linux/usb.h
+include/linux/wait.h
+include/linux/writeback.h
+include/media/saa7146.h
+include/media/saa7146_vv.h
+include/net/ip_vs.h
+include/pcmcia/ss.h
+include/scsi/scsi_device.h
+include/scsi/scsi_host.h
+include/scsi/scsi_request.h
+include/video/epson1355.h
+include/video/neomagic.h
+include/video/sisfb.h
+init/do_mounts.h
+init/do_mounts_initrd.c
+init/do_mounts_rd.c
+init/main.c
+kernel/compat.c
+kernel/extable.c
+kernel/fork.c
+kernel/ksyms.c
+kernel/lockmeter.c
+kernel/Makefile
+kernel/module.c
+kernel/printk.c
+kernel/profile.c
+kernel/rcupdate.c
+kernel/sched.c
+kernel/softirq.c
+kernel/suspend.c
+kernel/sys.c
+kernel/time.c
+kernel/timer.c
+kernel/workqueue.c
+MAINTAINERS
+Makefile
+mm/bootmem.c
+mm/filemap.c
+mm/fremap.c
+mm/memory.c
+mm/mprotect.c
+mm/mremap.c
+mm/msync.c
+mm/page-writeback.c
+mm/slab.c
+mm/swapfile.c
+mm/swap_state.c
+mm/vmalloc.c
+mm/vmscan.c
+net/atm/br2684.c
+net/atm/clip.c
+net/atm/common.c
+net/atm/common.h
+net/atm/lec.c
+net/atm/mpc.c
+net/atm/pppoatm.c
+net/atm/proc.c
+net/atm/pvc.c
+net/atm/raw.c
+net/atm/signaling.c
+net/atm/signaling.h
+net/atm/svc.c
+net/core/dev.c
+net/ipv4/ip_gre.c
+net/ipv4/ipip.c
+net/ipv4/ipvs/ip_vs_conn.c
+net/ipv4/ipvs/ip_vs_ctl.c
+net/ipv4/ipvs/ip_vs_xmit.c
+net/ipv4/ipvs/Kconfig
+net/ipv4/tcp_input.c
+net/ipv6/addrconf.c
+net/ipv6/ah6.c
+net/ipv6/esp6.c
+net/ipv6/route.c
+net/ipv6/sit.c
+net/ipv6/tcp_ipv6.c
+net/ipv6/xfrm6_input.c
+net/ipv6/xfrm6_policy.c
+net/ipv6/xfrm6_state.c
+net/netsyms.c
+net/sunrpc/auth_gss/auth_gss.c
+net/sunrpc/clnt.c
+net/sunrpc/xprt.c
+net/wanrouter/wanmain.c
+net/xfrm/xfrm_policy.c
+net/xfrm/xfrm_state.c
+net/xfrm/xfrm_user.c
+scripts/ver_linux
+security/Kconfig
+security/Makefile
+security/selinux/avc.c
+security/selinux/hooks.c
+security/selinux/include/avc.h
+security/selinux/include/avc_ss.h
+security/selinux/include/av_inherit.h
+security/selinux/include/av_permissions.h
+security/selinux/include/av_perm_to_string.h
+security/selinux/include/class_to_string.h
+security/selinux/include/common_perm_to_string.h
+security/selinux/include/flask.h
+security/selinux/include/initial_sid_to_string.h
+security/selinux/include/objsec.h
+security/selinux/include/security.h
+security/selinux/Kconfig
+security/selinux/Makefile
+security/selinux/selinuxfs.c
+security/selinux/ss/avtab.c
+security/selinux/ss/avtab.h
+security/selinux/ss/constraint.h
+security/selinux/ss/context.h
+security/selinux/ss/ebitmap.c
+security/selinux/ss/ebitmap.h
+security/selinux/ss/global.h
+security/selinux/ss/hashtab.c
+security/selinux/ss/hashtab.h
+security/selinux/ss/Makefile
+security/selinux/ss/mls.c
+security/selinux/ss/mls.h
+security/selinux/ss/mls_types.h
+security/selinux/ss/policydb.c
+security/selinux/ss/policydb.h
+security/selinux/ss/services.c
+security/selinux/ss/services.h
+security/selinux/ss/sidtab.c
+security/selinux/ss/sidtab.h
+security/selinux/ss/symtab.c
+security/selinux/ss/symtab.h
+sound/core/timer.c
+sound/isa/cmi8330.c
+sound/isa/es18xx.c
+sound/oss/ac97_plugin_ad1980.c
+sound/oss/ad1816.c
+sound/oss/ad1889.c
+sound/oss/btaudio.c
+sound/oss/dmasound/dmasound_core.c
+sound/oss/emu10k1/8010.h
+sound/oss/emu10k1/audio.c
+sound/oss/emu10k1/cardmi.c
+sound/oss/emu10k1/cardmo.c
+sound/oss/emu10k1/cardwo.c
+sound/oss/emu10k1/efxmgr.c
+sound/oss/emu10k1/efxmgr.h
+sound/oss/emu10k1/hwaccess.c
+sound/oss/emu10k1/hwaccess.h
+sound/oss/emu10k1/irqmgr.h
+sound/oss/emu10k1/main.c
+sound/oss/emu10k1/midi.h
+sound/oss/emu10k1/mixer.c
+sound/oss/emu10k1/passthrough.c
+sound/oss/emu10k1/passthrough.h
+sound/oss/emu10k1/recmgr.c
+sound/oss/emu10k1/voicemgr.c
+sound/oss/emu10k1/voicemgr.h
+sound/oss/hal2.c
+sound/oss/hal2.h
+sound/oss/harmony.c
+sound/oss/kahlua.c
+sound/oss/Kconfig
+sound/oss/Makefile
+sound/pci/ice1712/ak4xxx.c
+sound/pci/intel8x0.c
+usr/Makefile
diff --git a/lustre/kernel_patches/pc/dump_netdev.pc b/lustre/kernel_patches/pc/dump_netdev.pc
new file mode 100644
index 0000000000..bb2fde5fdb
--- /dev/null
+++ b/lustre/kernel_patches/pc/dump_netdev.pc
@@ -0,0 +1,9 @@
+drivers/net/3c59x.c
+drivers/net/e100/e100_main.c
+drivers/net/e1000/e1000_main.c
+drivers/net/eepro100.c
+drivers/net/smc-ultra.c
+drivers/net/tlan.c
+drivers/net/tulip/tulip_core.c
+include/linux/netdevice.h
+net/core/dev.c
diff --git a/lustre/kernel_patches/pc/ext3-2.4.18-fixes.pc b/lustre/kernel_patches/pc/ext3-2.4.18-fixes.pc
deleted file mode 100644
index 0822c5e650..0000000000
--- a/lustre/kernel_patches/pc/ext3-2.4.18-fixes.pc
+++ /dev/null
@@ -1,7 +0,0 @@
-fs/ext3/balloc.c
-fs/ext3/file.c
-fs/ext3/fsync.c
-fs/ext3/ialloc.c
-fs/ext3/inode.c
-fs/ext3/namei.c
-fs/ext3/super.c
diff --git a/lustre/kernel_patches/pc/ext3-2.5.63.pc b/lustre/kernel_patches/pc/ext3-2.5.63.pc
deleted file mode 100644
index b1e5de5265..0000000000
--- a/lustre/kernel_patches/pc/ext3-2.5.63.pc
+++ /dev/null
@@ -1,4 +0,0 @@
-fs/ext3/xattr.c
-fs/ext3/inode.c
-fs/ext3/super.c
-fs/ext3/xattr.h
diff --git a/lustre/kernel_patches/pc/ext3-error-export.pc b/lustre/kernel_patches/pc/ext3-error-export.pc
new file mode 100644
index 0000000000..efd7db0086
--- /dev/null
+++ b/lustre/kernel_patches/pc/ext3-error-export.pc
@@ -0,0 +1 @@
+fs/ext3/ext3-exports.c
diff --git a/lustre/kernel_patches/pc/ext3-map_inode_page.pc b/lustre/kernel_patches/pc/ext3-map_inode_page.pc
new file mode 100644
index 0000000000..6631de4eab
--- /dev/null
+++ b/lustre/kernel_patches/pc/ext3-map_inode_page.pc
@@ -0,0 +1,3 @@
+fs/ext3/inode.c
+fs/ext3/ext3-exports.c
+fs/ext3/Makefile
diff --git a/lustre/kernel_patches/pc/ext3-map_inode_page_2.4.18.pc b/lustre/kernel_patches/pc/ext3-map_inode_page_2.4.18.pc
new file mode 100644
index 0000000000..6631de4eab
--- /dev/null
+++ b/lustre/kernel_patches/pc/ext3-map_inode_page_2.4.18.pc
@@ -0,0 +1,3 @@
+fs/ext3/inode.c
+fs/ext3/ext3-exports.c
+fs/ext3/Makefile
diff --git a/lustre/kernel_patches/pc/ext3-2.5-noread.pc b/lustre/kernel_patches/pc/ext3-noread-inode.pc
similarity index 100%
rename from lustre/kernel_patches/pc/ext3-2.5-noread.pc
rename to lustre/kernel_patches/pc/ext3-noread-inode.pc
diff --git a/lustre/kernel_patches/pc/extN-san.pc b/lustre/kernel_patches/pc/ext3-san-jdike-2.5.73.pc
similarity index 100%
rename from lustre/kernel_patches/pc/extN-san.pc
rename to lustre/kernel_patches/pc/ext3-san-jdike-2.5.73.pc
diff --git a/lustre/kernel_patches/pc/ext3-truncate_blocks-chaos.patch.pc b/lustre/kernel_patches/pc/ext3-truncate_blocks-chaos.patch.pc
deleted file mode 100644
index 76d683f8bc..0000000000
--- a/lustre/kernel_patches/pc/ext3-truncate_blocks-chaos.patch.pc
+++ /dev/null
@@ -1 +0,0 @@
-fs/ext3/inode.c
diff --git a/lustre/kernel_patches/pc/extN-delete_thread.pc b/lustre/kernel_patches/pc/ext3_delete_thread_2.4.20_chaos.pc
similarity index 68%
rename from lustre/kernel_patches/pc/extN-delete_thread.pc
rename to lustre/kernel_patches/pc/ext3_delete_thread_2.4.20_chaos.pc
index bc817329e2..a2c3109470 100644
--- a/lustre/kernel_patches/pc/extN-delete_thread.pc
+++ b/lustre/kernel_patches/pc/ext3_delete_thread_2.4.20_chaos.pc
@@ -1,3 +1,5 @@
+fs/ext3/super.c
+fs/ext3/inode.c
+fs/ext3/file.c
 include/linux/ext3_fs.h
 include/linux/ext3_fs_sb.h
-fs/ext3/super.c
diff --git a/lustre/kernel_patches/pc/extN-iget-debug.pc b/lustre/kernel_patches/pc/extN-iget-debug.pc
deleted file mode 100644
index e9fe01e331..0000000000
--- a/lustre/kernel_patches/pc/extN-iget-debug.pc
+++ /dev/null
@@ -1,2 +0,0 @@
-fs/ext3/namei.c
-fs/ext3/inode.c
diff --git a/lustre/kernel_patches/pc/gpl_header-chaos-2.4.20.pc b/lustre/kernel_patches/pc/gpl_header-chaos-2.4.20.pc
new file mode 100644
index 0000000000..0c29f3651b
--- /dev/null
+++ b/lustre/kernel_patches/pc/gpl_header-chaos-2.4.20.pc
@@ -0,0 +1 @@
+include/linux/module.h
diff --git a/lustre/kernel_patches/pc/inode-protection-from-pdflush.pc b/lustre/kernel_patches/pc/inode-protection-from-pdflush.pc
new file mode 100644
index 0000000000..c1b89a1817
--- /dev/null
+++ b/lustre/kernel_patches/pc/inode-protection-from-pdflush.pc
@@ -0,0 +1,2 @@
+fs/fs-writeback.c
+include/linux/fs.h
diff --git a/lustre/kernel_patches/pc/inode-unhash_2.5.75.pc b/lustre/kernel_patches/pc/inode-unhash_2.5.75.pc
new file mode 100644
index 0000000000..7d04f84039
--- /dev/null
+++ b/lustre/kernel_patches/pc/inode-unhash_2.5.75.pc
@@ -0,0 +1,2 @@
+fs/inode.c
+include/linux/fs.h
diff --git a/lustre/kernel_patches/pc/invalidate_show_2.4.20_chaos.pc b/lustre/kernel_patches/pc/invalidate_show_2.4.20_chaos.pc
new file mode 100644
index 0000000000..1d4ed77bf9
--- /dev/null
+++ b/lustre/kernel_patches/pc/invalidate_show_2.4.20_chaos.pc
@@ -0,0 +1,4 @@
+fs/inode.c
+fs/super.c
+include/linux/fs.h
+fs/smbfs/inode.c
diff --git a/lustre/kernel_patches/pc/iopen-2.5.73.pc b/lustre/kernel_patches/pc/iopen-2.5.73.pc
new file mode 100644
index 0000000000..b40b1f3af3
--- /dev/null
+++ b/lustre/kernel_patches/pc/iopen-2.5.73.pc
@@ -0,0 +1,8 @@
+Documentation/filesystems/ext2.txt
+fs/ext3/Makefile
+fs/ext3/inode.c
+fs/ext3/iopen.c
+fs/ext3/iopen.h
+fs/ext3/namei.c
+fs/ext3/super.c
+include/linux/ext3_fs.h
diff --git a/lustre/kernel_patches/pc/jbd-transno-cb.pc b/lustre/kernel_patches/pc/jbd-transno-cb.pc
deleted file mode 100644
index cde73d8763..0000000000
--- a/lustre/kernel_patches/pc/jbd-transno-cb.pc
+++ /dev/null
@@ -1,4 +0,0 @@
-fs/jbd/commit.c
-fs/jbd/journal.c
-fs/jbd/transaction.c
-include/linux/jbd.h
diff --git a/lustre/kernel_patches/pc/kexec-2.5.73-full.pc b/lustre/kernel_patches/pc/kexec-2.5.73-full.pc
new file mode 100644
index 0000000000..939f3d4a90
--- /dev/null
+++ b/lustre/kernel_patches/pc/kexec-2.5.73-full.pc
@@ -0,0 +1,23 @@
+MAINTAINERS
+arch/i386/Kconfig
+arch/i386/defconfig
+arch/i386/kernel/Makefile
+arch/i386/kernel/apic.c
+arch/i386/kernel/dmi_scan.c
+arch/i386/kernel/entry.S
+arch/i386/kernel/i8259.c
+arch/i386/kernel/io_apic.c
+arch/i386/kernel/machine_kexec.c
+arch/i386/kernel/reboot.c
+arch/i386/kernel/relocate_kernel.S
+arch/i386/kernel/smp.c
+fs/aio.c
+include/asm-i386/apic.h
+include/asm-i386/apicdef.h
+include/asm-i386/kexec.h
+include/asm-i386/unistd.h
+include/linux/kexec.h
+include/linux/reboot.h
+kernel/Makefile
+kernel/kexec.c
+kernel/sys.c
diff --git a/lustre/kernel_patches/pc/kexec-2.6.0-full.pc b/lustre/kernel_patches/pc/kexec-2.6.0-full.pc
new file mode 100644
index 0000000000..939f3d4a90
--- /dev/null
+++ b/lustre/kernel_patches/pc/kexec-2.6.0-full.pc
@@ -0,0 +1,23 @@
+MAINTAINERS
+arch/i386/Kconfig
+arch/i386/defconfig
+arch/i386/kernel/Makefile
+arch/i386/kernel/apic.c
+arch/i386/kernel/dmi_scan.c
+arch/i386/kernel/entry.S
+arch/i386/kernel/i8259.c
+arch/i386/kernel/io_apic.c
+arch/i386/kernel/machine_kexec.c
+arch/i386/kernel/reboot.c
+arch/i386/kernel/relocate_kernel.S
+arch/i386/kernel/smp.c
+fs/aio.c
+include/asm-i386/apic.h
+include/asm-i386/apicdef.h
+include/asm-i386/kexec.h
+include/asm-i386/unistd.h
+include/linux/kexec.h
+include/linux/reboot.h
+kernel/Makefile
+kernel/kexec.c
+kernel/sys.c
diff --git a/lustre/kernel_patches/pc/kgdb-ga-2.5.73.pc b/lustre/kernel_patches/pc/kgdb-ga-2.5.73.pc
new file mode 100644
index 0000000000..1d99524568
--- /dev/null
+++ b/lustre/kernel_patches/pc/kgdb-ga-2.5.73.pc
@@ -0,0 +1,28 @@
+arch/i386/Kconfig
+arch/i386/kernel/entry.S
+arch/i386/kernel/kgdb_stub.c
+arch/i386/kernel/Makefile
+arch/i386/kernel/nmi.c
+arch/i386/kernel/smp.c
+arch/i386/kernel/traps.c
+arch/i386/lib/kgdb_serial.c
+arch/i386/lib/Makefile
+arch/i386/Makefile
+arch/i386/mm/fault.c
+Documentation/i386/kgdb/andthen
+Documentation/i386/kgdb/debug-nmi.txt
+Documentation/i386/kgdb/gdb-globals.txt
+Documentation/i386/kgdb/gdbinit
+Documentation/i386/kgdb/gdbinit.hw
+Documentation/i386/kgdb/gdbinit-modules
+Documentation/i386/kgdb/kgdb.txt
+Documentation/i386/kgdb/loadmodule.sh
+drivers/char/keyboard.c
+drivers/char/sysrq.c
+drivers/serial/8250.c
+include/asm-i386/bugs.h
+include/asm-i386/kgdb.h
+include/asm-i386/kgdb_local.h
+include/linux/config.h
+kernel/sched.c
+MAINTAINERS
diff --git a/lustre/kernel_patches/pc/kgdb-ga-docco-fixes-2.5.73.pc b/lustre/kernel_patches/pc/kgdb-ga-docco-fixes-2.5.73.pc
new file mode 100644
index 0000000000..87e2eca597
--- /dev/null
+++ b/lustre/kernel_patches/pc/kgdb-ga-docco-fixes-2.5.73.pc
@@ -0,0 +1 @@
+Documentation/i386/kgdb/kgdb.txt
diff --git a/lustre/kernel_patches/pc/kgdb-use-ggdb-2.5.73.pc b/lustre/kernel_patches/pc/kgdb-use-ggdb-2.5.73.pc
new file mode 100644
index 0000000000..43f4115564
--- /dev/null
+++ b/lustre/kernel_patches/pc/kgdb-use-ggdb-2.5.73.pc
@@ -0,0 +1 @@
+arch/i386/Makefile
diff --git a/lustre/kernel_patches/pc/lkcd-cvs-2.5.69.pc b/lustre/kernel_patches/pc/lkcd-cvs-2.5.69.pc
new file mode 100644
index 0000000000..2799a8eaf1
--- /dev/null
+++ b/lustre/kernel_patches/pc/lkcd-cvs-2.5.69.pc
@@ -0,0 +1,19 @@
+drivers/dump/Makefile
+drivers/dump/dump_blockdev.c
+drivers/dump/dump_execute.c
+drivers/dump/dump_filters.c
+drivers/dump/dump_fmt.c
+drivers/dump/dump_gzip.c
+drivers/dump/dump_i386.c
+drivers/dump/dump_memdev.c
+drivers/dump/dump_netdev.c
+drivers/dump/dump_overlay.c
+drivers/dump/dump_rle.c
+drivers/dump/dump_scheme.c
+drivers/dump/dump_setup.c
+include/linux/dumpdev.h
+include/linux/dump.h
+include/linux/dump_netdev.h
+include/asm-i386/dump.h
+init/kerntypes.c
+drivers/dump/dump_methods.h
diff --git a/lustre/kernel_patches/pc/lkcd-kernel-changes-2.5.73.pc b/lustre/kernel_patches/pc/lkcd-kernel-changes-2.5.73.pc
new file mode 100644
index 0000000000..722bb20383
--- /dev/null
+++ b/lustre/kernel_patches/pc/lkcd-kernel-changes-2.5.73.pc
@@ -0,0 +1,25 @@
+drivers/Makefile
+include/linux/major.h
+include/linux/sysctl.h
+include/asm-i386/mach-default/irq_vectors.h
+include/asm-i386/kmap_types.h
+include/asm-i386/smp.h
+arch/i386/kernel/i386_ksyms.c
+arch/i386/kernel/nmi.c
+arch/i386/kernel/setup.c
+arch/i386/kernel/smp.c
+arch/i386/kernel/traps.c
+arch/i386/mm/init.c
+arch/i386/boot/Makefile
+arch/i386/Kconfig
+arch/s390/boot/Makefile
+arch/s390/boot/install.sh
+scripts/mkcompile_h
+kernel/ksyms.c
+kernel/panic.c
+kernel/sched.c
+lib/Kconfig
+mm/page_alloc.c
+init/Makefile
+init/main.c
+init/version.c
diff --git a/lustre/kernel_patches/pc/lkcd-kernel-changes-2.6.0-test1.pc b/lustre/kernel_patches/pc/lkcd-kernel-changes-2.6.0-test1.pc
new file mode 100644
index 0000000000..722bb20383
--- /dev/null
+++ b/lustre/kernel_patches/pc/lkcd-kernel-changes-2.6.0-test1.pc
@@ -0,0 +1,25 @@
+drivers/Makefile
+include/linux/major.h
+include/linux/sysctl.h
+include/asm-i386/mach-default/irq_vectors.h
+include/asm-i386/kmap_types.h
+include/asm-i386/smp.h
+arch/i386/kernel/i386_ksyms.c
+arch/i386/kernel/nmi.c
+arch/i386/kernel/setup.c
+arch/i386/kernel/smp.c
+arch/i386/kernel/traps.c
+arch/i386/mm/init.c
+arch/i386/boot/Makefile
+arch/i386/Kconfig
+arch/s390/boot/Makefile
+arch/s390/boot/install.sh
+scripts/mkcompile_h
+kernel/ksyms.c
+kernel/panic.c
+kernel/sched.c
+lib/Kconfig
+mm/page_alloc.c
+init/Makefile
+init/main.c
+init/version.c
diff --git a/lustre/kernel_patches/pc/lustre_build.pc b/lustre/kernel_patches/pc/lustre_build.pc
new file mode 100644
index 0000000000..98afcc65a0
--- /dev/null
+++ b/lustre/kernel_patches/pc/lustre_build.pc
@@ -0,0 +1,5 @@
+Makefile
+init/main.c
+fs/Makefile
+mm/Makefile
+fs/Kconfig
diff --git a/lustre/kernel_patches/pc/netconsole_sysrq.pc b/lustre/kernel_patches/pc/netconsole_sysrq.pc
deleted file mode 100644
index 030fc1978f..0000000000
--- a/lustre/kernel_patches/pc/netconsole_sysrq.pc
+++ /dev/null
@@ -1,2 +0,0 @@
-drivers/net/netconsole.c
-drivers/net/netconsole.h
diff --git a/lustre/kernel_patches/pc/qla2xxx-v8.00.00b1-2.5.73.pc b/lustre/kernel_patches/pc/qla2xxx-v8.00.00b1-2.5.73.pc
new file mode 100644
index 0000000000..06952b0fc2
--- /dev/null
+++ b/lustre/kernel_patches/pc/qla2xxx-v8.00.00b1-2.5.73.pc
@@ -0,0 +1,42 @@
+drivers/scsi/Makefile
+drivers/scsi/Kconfig
+drivers/scsi/qla2xxx/Kconfig
+drivers/scsi/qla2xxx/Makefile
+drivers/scsi/qla2xxx/README.qla2x00
+drivers/scsi/qla2xxx/exioct.h
+drivers/scsi/qla2xxx/exioctln.h
+drivers/scsi/qla2xxx/inioct.h
+drivers/scsi/qla2xxx/ql2100tp_fw.c
+drivers/scsi/qla2xxx/ql2200ip_fw.c
+drivers/scsi/qla2xxx/ql2300tpx_fw.c
+drivers/scsi/qla2xxx/qla_cfg.c
+drivers/scsi/qla2xxx/qla_cfg.h
+drivers/scsi/qla2xxx/qla_cfgln.c
+drivers/scsi/qla2xxx/qla_dbg.c
+drivers/scsi/qla2xxx/qla_dbg.h
+drivers/scsi/qla2xxx/qla_def.h
+drivers/scsi/qla2xxx/qla_fo.c
+drivers/scsi/qla2xxx/qla_fo.cfg
+drivers/scsi/qla2xxx/qla_fo.h
+drivers/scsi/qla2xxx/qla_gbl.h
+drivers/scsi/qla2xxx/qla_inioct.c
+drivers/scsi/qla2xxx/qla_init.c
+drivers/scsi/qla2xxx/qla_inline.h
+drivers/scsi/qla2xxx/qla_iocb.c
+drivers/scsi/qla2xxx/qla_ip.c
+drivers/scsi/qla2xxx/qla_ip.h
+drivers/scsi/qla2xxx/qla_isr.c
+drivers/scsi/qla2xxx/qla_listops.h
+drivers/scsi/qla2xxx/qla_mbx.c
+drivers/scsi/qla2xxx/qla_os.c
+drivers/scsi/qla2xxx/qla_os.h
+drivers/scsi/qla2xxx/qla_settings.h
+drivers/scsi/qla2xxx/qla_sup.c
+drivers/scsi/qla2xxx/qla_vendor.c
+drivers/scsi/qla2xxx/qla_version.h
+drivers/scsi/qla2xxx/qla_xioct.c
+drivers/scsi/qla2xxx/qlfo.h
+drivers/scsi/qla2xxx/qlfolimits.h
+drivers/scsi/qla2xxx/qlfoln.h
+drivers/scsi/qla2xxx/release.txt
+drivers/scsi/qla2xxx/revision.notes
diff --git a/lustre/kernel_patches/pc/tcp_zero_copy_2.4.20_chaos.pc b/lustre/kernel_patches/pc/tcp_zero_copy_2.4.20_chaos.pc
new file mode 100644
index 0000000000..02877c058d
--- /dev/null
+++ b/lustre/kernel_patches/pc/tcp_zero_copy_2.4.20_chaos.pc
@@ -0,0 +1,5 @@
+include/linux/skbuff.h
+include/net/tcp.h
+net/netsyms.c
+net/core/skbuff.c
+net/ipv4/tcp.c
diff --git a/lustre/kernel_patches/pc/tg3_netconsole.pc b/lustre/kernel_patches/pc/tg3_netconsole.pc
deleted file mode 100644
index 6653b7b490..0000000000
--- a/lustre/kernel_patches/pc/tg3_netconsole.pc
+++ /dev/null
@@ -1 +0,0 @@
-drivers/net/tg3.c
diff --git a/lustre/kernel_patches/pc/uml-patch-2.4.20-4.pc b/lustre/kernel_patches/pc/uml-patch-2.4.20-6.pc
similarity index 99%
rename from lustre/kernel_patches/pc/uml-patch-2.4.20-4.pc
rename to lustre/kernel_patches/pc/uml-patch-2.4.20-6.pc
index 887e3faf02..cad8767345 100644
--- a/lustre/kernel_patches/pc/uml-patch-2.4.20-4.pc
+++ b/lustre/kernel_patches/pc/uml-patch-2.4.20-6.pc
@@ -1,25 +1,16 @@
-CREDITS
-Documentation/Configure.help
-MAINTAINERS
-Makefile
-arch/um/Makefile
-arch/um/Makefile-i386
-arch/um/Makefile-ia64
-arch/um/Makefile-os-Linux
-arch/um/Makefile-ppc
-arch/um/Makefile-skas
-arch/um/Makefile-tt
 arch/um/common.ld.in
-arch/um/config.in
-arch/um/config.release
 arch/um/config_block.in
 arch/um/config_char.in
+arch/um/config.in
 arch/um/config_net.in
+arch/um/config.release
 arch/um/config_scsi.in
 arch/um/defconfig
-arch/um/drivers/Makefile
 arch/um/drivers/chan_kern.c
 arch/um/drivers/chan_user.c
+arch/um/drivers/cow.h
+arch/um/drivers/cow_sys.h
+arch/um/drivers/cow_user.c
 arch/um/drivers/daemon.h
 arch/um/drivers/daemon_kern.c
 arch/um/drivers/daemon_user.c
@@ -29,6 +20,7 @@ arch/um/drivers/harddog_user.c
 arch/um/drivers/hostaudio_kern.c
 arch/um/drivers/hostaudio_user.c
 arch/um/drivers/line.c
+arch/um/drivers/Makefile
 arch/um/drivers/mcast.h
 arch/um/drivers/mcast_kern.c
 arch/um/drivers/mcast_user.c
@@ -63,15 +55,14 @@ arch/um/drivers/xterm.c
 arch/um/drivers/xterm.h
 arch/um/drivers/xterm_kern.c
 arch/um/dyn_link.ld.in
-arch/um/fs/Makefile
-arch/um/fs/hostfs/Makefile
 arch/um/fs/hostfs/hostfs.h
 arch/um/fs/hostfs/hostfs_kern.c
 arch/um/fs/hostfs/hostfs_user.c
-arch/um/fs/hppfs/Makefile
+arch/um/fs/hostfs/Makefile
 arch/um/fs/hppfs/hppfs_kern.c
+arch/um/fs/hppfs/Makefile
+arch/um/fs/Makefile
 arch/um/include/2_5compat.h
-arch/um/include/Makefile
 arch/um/include/chan_kern.h
 arch/um/include/chan_user.h
 arch/um/include/choose-mode.h
@@ -82,10 +73,12 @@ arch/um/include/helper.h
 arch/um/include/hostaudio.h
 arch/um/include/init.h
 arch/um/include/initrd.h
+arch/um/include/irq_kern.h
 arch/um/include/irq_user.h
 arch/um/include/kern.h
 arch/um/include/kern_util.h
 arch/um/include/line.h
+arch/um/include/Makefile
 arch/um/include/mconsole.h
 arch/um/include/mconsole_kern.h
 arch/um/include/mem.h
@@ -122,14 +115,13 @@ arch/um/include/tempfile.h
 arch/um/include/time_user.h
 arch/um/include/tlb.h
 arch/um/include/ubd_user.h
-arch/um/include/um_mmu.h
-arch/um/include/um_uaccess.h
 arch/um/include/umid.h
 arch/um/include/uml_uaccess.h
+arch/um/include/um_mmu.h
 arch/um/include/umn.h
+arch/um/include/um_uaccess.h
 arch/um/include/user.h
 arch/um/include/user_util.h
-arch/um/kernel/Makefile
 arch/um/kernel/checksum.c
 arch/um/kernel/config.c.in
 arch/um/kernel/exec_kern.c
@@ -139,12 +131,13 @@ arch/um/kernel/frame_kern.c
 arch/um/kernel/gmon_syms.c
 arch/um/kernel/gprof_syms.c
 arch/um/kernel/helper.c
-arch/um/kernel/init_task.c
 arch/um/kernel/initrd_kern.c
 arch/um/kernel/initrd_user.c
+arch/um/kernel/init_task.c
 arch/um/kernel/irq.c
 arch/um/kernel/irq_user.c
 arch/um/kernel/ksyms.c
+arch/um/kernel/Makefile
 arch/um/kernel/mem.c
 arch/um/kernel/mem_user.c
 arch/um/kernel/mprot.h
@@ -157,7 +150,6 @@ arch/um/kernel/sigio_kern.c
 arch/um/kernel/sigio_user.c
 arch/um/kernel/signal_kern.c
 arch/um/kernel/signal_user.c
-arch/um/kernel/skas/Makefile
 arch/um/kernel/skas/exec_kern.c
 arch/um/kernel/skas/exec_user.c
 arch/um/kernel/skas/include/mmu.h
@@ -167,23 +159,24 @@ arch/um/kernel/skas/include/proc_mm.h
 arch/um/kernel/skas/include/ptrace-skas.h
 arch/um/kernel/skas/include/skas.h
 arch/um/kernel/skas/include/uaccess.h
+arch/um/kernel/skas/Makefile
 arch/um/kernel/skas/mem.c
 arch/um/kernel/skas/mem_user.c
 arch/um/kernel/skas/mmu.c
 arch/um/kernel/skas/process.c
 arch/um/kernel/skas/process_kern.c
-arch/um/kernel/skas/sys-i386/Makefile
-arch/um/kernel/skas/sys-i386/sigcontext.c
 arch/um/kernel/skas/syscall_kern.c
 arch/um/kernel/skas/syscall_user.c
+arch/um/kernel/skas/sys-i386/Makefile
+arch/um/kernel/skas/sys-i386/sigcontext.c
 arch/um/kernel/skas/time.c
 arch/um/kernel/skas/tlb.c
 arch/um/kernel/skas/trap_user.c
 arch/um/kernel/skas/util/Makefile
 arch/um/kernel/skas/util/mk_ptregs.c
 arch/um/kernel/smp.c
-arch/um/kernel/sys_call_table.c
 arch/um/kernel/syscall_kern.c
+arch/um/kernel/sys_call_table.c
 arch/um/kernel/syscall_user.c
 arch/um/kernel/sysrq.c
 arch/um/kernel/tempfile.c
@@ -192,7 +185,6 @@ arch/um/kernel/time_kern.c
 arch/um/kernel/tlb.c
 arch/um/kernel/trap_kern.c
 arch/um/kernel/trap_user.c
-arch/um/kernel/tt/Makefile
 arch/um/kernel/tt/exec_kern.c
 arch/um/kernel/tt/exec_user.c
 arch/um/kernel/tt/gdb.c
@@ -205,6 +197,7 @@ arch/um/kernel/tt/include/ptrace-tt.h
 arch/um/kernel/tt/include/tt.h
 arch/um/kernel/tt/include/uaccess.h
 arch/um/kernel/tt/ksyms.c
+arch/um/kernel/tt/Makefile
 arch/um/kernel/tt/mem.c
 arch/um/kernel/tt/mem_user.c
 arch/um/kernel/tt/process_kern.c
@@ -216,10 +209,10 @@ arch/um/kernel/tt/ptproxy/sysdep.c
 arch/um/kernel/tt/ptproxy/sysdep.h
 arch/um/kernel/tt/ptproxy/wait.c
 arch/um/kernel/tt/ptproxy/wait.h
-arch/um/kernel/tt/sys-i386/Makefile
-arch/um/kernel/tt/sys-i386/sigcontext.c
 arch/um/kernel/tt/syscall_kern.c
 arch/um/kernel/tt/syscall_user.c
+arch/um/kernel/tt/sys-i386/Makefile
+arch/um/kernel/tt/sys-i386/sigcontext.c
 arch/um/kernel/tt/time.c
 arch/um/kernel/tt/tlb.c
 arch/um/kernel/tt/tracer.c
@@ -234,24 +227,31 @@ arch/um/kernel/user_syms.c
 arch/um/kernel/user_util.c
 arch/um/link.ld.in
 arch/um/main.c
-arch/um/os-Linux/Makefile
-arch/um/os-Linux/drivers/Makefile
+arch/um/Makefile
+arch/um/Makefile-i386
+arch/um/Makefile-ia64
+arch/um/Makefile-os-Linux
+arch/um/Makefile-ppc
+arch/um/Makefile-skas
+arch/um/Makefile-tt
 arch/um/os-Linux/drivers/etap.h
 arch/um/os-Linux/drivers/ethertap_kern.c
 arch/um/os-Linux/drivers/ethertap_user.c
+arch/um/os-Linux/drivers/Makefile
 arch/um/os-Linux/drivers/tuntap.h
 arch/um/os-Linux/drivers/tuntap_kern.c
 arch/um/os-Linux/drivers/tuntap_user.c
 arch/um/os-Linux/file.c
 arch/um/os-Linux/include/file.h
+arch/um/os-Linux/Makefile
 arch/um/os-Linux/process.c
 arch/um/os-Linux/tty.c
-arch/um/sys-i386/Makefile
 arch/um/sys-i386/bugs.c
 arch/um/sys-i386/checksum.S
 arch/um/sys-i386/fault.c
 arch/um/sys-i386/ksyms.c
 arch/um/sys-i386/ldt.c
+arch/um/sys-i386/Makefile
 arch/um/sys-i386/ptrace.c
 arch/um/sys-i386/ptrace_user.c
 arch/um/sys-i386/sigcontext.c
@@ -274,14 +274,16 @@ arch/um/util/mk_constants_kern.c
 arch/um/util/mk_constants_user.c
 arch/um/util/mk_task_kern.c
 arch/um/util/mk_task_user.c
+CREDITS
+Documentation/Configure.help
 drivers/char/Makefile
 drivers/char/tty_io.c
 drivers/net/setup.c
 include/asm-i386/hardirq.h
 include/asm-um/a.out.h
-include/asm-um/arch-signal-i386.h
 include/asm-um/archparam-i386.h
 include/asm-um/archparam-ppc.h
+include/asm-um/arch-signal-i386.h
 include/asm-um/atomic.h
 include/asm-um/bitops.h
 include/asm-um/boot.h
@@ -306,11 +308,11 @@ include/asm-um/highmem.h
 include/asm-um/hw_irq.h
 include/asm-um/ide.h
 include/asm-um/init.h
-include/asm-um/io.h
 include/asm-um/ioctl.h
 include/asm-um/ioctls.h
-include/asm-um/ipc.h
+include/asm-um/io.h
 include/asm-um/ipcbuf.h
+include/asm-um/ipc.h
 include/asm-um/irq.h
 include/asm-um/keyboard.h
 include/asm-um/kmap_types.h
@@ -318,8 +320,8 @@ include/asm-um/linux_logo.h
 include/asm-um/locks.h
 include/asm-um/mca_dma.h
 include/asm-um/mman.h
-include/asm-um/mmu.h
 include/asm-um/mmu_context.h
+include/asm-um/mmu.h
 include/asm-um/module.h
 include/asm-um/msgbuf.h
 include/asm-um/mtrr.h
@@ -358,8 +360,8 @@ include/asm-um/socket.h
 include/asm-um/sockios.h
 include/asm-um/softirq.h
 include/asm-um/spinlock.h
-include/asm-um/stat.h
 include/asm-um/statfs.h
+include/asm-um/stat.h
 include/asm-um/string.h
 include/asm-um/system-generic.h
 include/asm-um/system-i386.h
@@ -387,6 +389,8 @@ include/linux/proc_mm.h
 include/linux/tty.h
 init/do_mounts.c
 kernel/panic.c
+MAINTAINERS
+Makefile
 mm/Makefile
 mm/mmap.c
 mm/mprotect.c
diff --git a/lustre/kernel_patches/pc/uml_compile_fixes.pc b/lustre/kernel_patches/pc/uml_compile_fixes.pc
deleted file mode 100644
index cd28cbd1a1..0000000000
--- a/lustre/kernel_patches/pc/uml_compile_fixes.pc
+++ /dev/null
@@ -1 +0,0 @@
-include/asm-um/pgtable.h
diff --git a/lustre/kernel_patches/pc/vfs_intent-2.4.18-18.pc b/lustre/kernel_patches/pc/vfs_intent-2.4.18-18-chaos65.pc
similarity index 74%
rename from lustre/kernel_patches/pc/vfs_intent-2.4.18-18.pc
rename to lustre/kernel_patches/pc/vfs_intent-2.4.18-18-chaos65.pc
index 8801aa763a..adb81005e3 100644
--- a/lustre/kernel_patches/pc/vfs_intent-2.4.18-18.pc
+++ b/lustre/kernel_patches/pc/vfs_intent-2.4.18-18-chaos65.pc
@@ -1,10 +1,12 @@
+fs/exec.c
 fs/dcache.c
+fs/namespace.c
 fs/namei.c
-fs/nfsd/vfs.c
 fs/open.c
-fs/proc/base.c
 fs/stat.c
-fs/exec.c
+fs/proc/base.c
 include/linux/dcache.h
 include/linux/fs.h
+kernel/fork.c
+kernel/exit.c
 kernel/ksyms.c
diff --git a/lustre/kernel_patches/pc/vfs_intent-2.4.20-hp.pc b/lustre/kernel_patches/pc/vfs_intent-2.4.20-hp.pc
new file mode 100644
index 0000000000..f3375a39ce
--- /dev/null
+++ b/lustre/kernel_patches/pc/vfs_intent-2.4.20-hp.pc
@@ -0,0 +1,14 @@
+fs/exec.c
+fs/dcache.c
+fs/namespace.c
+fs/namei.c
+fs/nfsd/vfs.c
+fs/open.c
+fs/stat.c
+fs/proc/base.c
+include/linux/dcache.h
+include/linux/fs.h
+include/linux/fs_struct.h
+kernel/ksyms.c
+kernel/fork.c
+kernel/exit.c
diff --git a/lustre/kernel_patches/pc/vfs_intent_2.4.20_chaos.pc b/lustre/kernel_patches/pc/vfs_intent_2.4.20_chaos.pc
new file mode 100644
index 0000000000..f3375a39ce
--- /dev/null
+++ b/lustre/kernel_patches/pc/vfs_intent_2.4.20_chaos.pc
@@ -0,0 +1,14 @@
+fs/exec.c
+fs/dcache.c
+fs/namespace.c
+fs/namei.c
+fs/nfsd/vfs.c
+fs/open.c
+fs/stat.c
+fs/proc/base.c
+include/linux/dcache.h
+include/linux/fs.h
+include/linux/fs_struct.h
+kernel/ksyms.c
+kernel/fork.c
+kernel/exit.c
diff --git a/lustre/kernel_patches/pc/lustre-2.5.63.pc b/lustre/kernel_patches/pc/vfs_intent_2.5.72_rev1.pc
similarity index 63%
rename from lustre/kernel_patches/pc/lustre-2.5.63.pc
rename to lustre/kernel_patches/pc/vfs_intent_2.5.72_rev1.pc
index daeea175cc..24a460363c 100644
--- a/lustre/kernel_patches/pc/lustre-2.5.63.pc
+++ b/lustre/kernel_patches/pc/vfs_intent_2.5.72_rev1.pc
@@ -1,12 +1,14 @@
-arch/um/kernel/mem.c
-fs/namei.c
-fs/nfsd/vfs.c
 fs/sysfs/inode.c
+fs/dcache.c
+fs/exec.c
+fs/xattr.c
+fs/namei.c
+fs/namespace.c
+fs/open.c
+fs/stat.c
 include/linux/dcache.h
 include/linux/fs.h
 include/linux/namei.h
-include/linux/slab.h
 kernel/ksyms.c
-mm/slab.c
 net/unix/af_unix.c
-fs/dcache.c
+net/sunrpc/rpc_pipe.c
diff --git a/lustre/kernel_patches/pc/vfs_intent_2.6.0-test1.pc b/lustre/kernel_patches/pc/vfs_intent_2.6.0-test1.pc
new file mode 100644
index 0000000000..24a460363c
--- /dev/null
+++ b/lustre/kernel_patches/pc/vfs_intent_2.6.0-test1.pc
@@ -0,0 +1,14 @@
+fs/sysfs/inode.c
+fs/dcache.c
+fs/exec.c
+fs/xattr.c
+fs/namei.c
+fs/namespace.c
+fs/open.c
+fs/stat.c
+include/linux/dcache.h
+include/linux/fs.h
+include/linux/namei.h
+kernel/ksyms.c
+net/unix/af_unix.c
+net/sunrpc/rpc_pipe.c
diff --git a/lustre/kernel_patches/pc/vfs_mntcwd_2.5.72_rev1.pc b/lustre/kernel_patches/pc/vfs_mntcwd_2.5.72_rev1.pc
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/lustre/kernel_patches/pc/vfs_nointent_2.5.69_rev1.pc b/lustre/kernel_patches/pc/vfs_nointent_2.5.69_rev1.pc
new file mode 100644
index 0000000000..2849da1e0a
--- /dev/null
+++ b/lustre/kernel_patches/pc/vfs_nointent_2.5.69_rev1.pc
@@ -0,0 +1,4 @@
+fs/namei.c
+fs/open.c
+include/linux/fs.h
+fs/exec.c
diff --git a/lustre/kernel_patches/pc/vfs_races_2.5.72_rev1.pc b/lustre/kernel_patches/pc/vfs_races_2.5.72_rev1.pc
new file mode 100644
index 0000000000..95a8dfd560
--- /dev/null
+++ b/lustre/kernel_patches/pc/vfs_races_2.5.72_rev1.pc
@@ -0,0 +1,3 @@
+fs/dcache.c
+fs/namei.c
+include/linux/dcache.h
diff --git a/lustre/kernel_patches/series/chaos b/lustre/kernel_patches/series/chaos-2.4.18
similarity index 82%
rename from lustre/kernel_patches/series/chaos
rename to lustre/kernel_patches/series/chaos-2.4.18
index 00ae7fd463..4c32051391 100644
--- a/lustre/kernel_patches/series/chaos
+++ b/lustre/kernel_patches/series/chaos-2.4.18
@@ -2,7 +2,7 @@ dev_read_only.patch
 exports.patch
 kmem_cache_validate.patch
 lustre_version.patch
-vfs_intent-2.4.18-18.patch
+vfs_intent-2.4.18-18-chaos65.patch
 invalidate_show.patch
 iod-rmap-exports.patch
 export-truncate.patch
@@ -15,6 +15,7 @@ ext3-delete_thread-2.4.18.patch
 extN-misc-fixup.patch
 extN-noread.patch
 extN-wantedi.patch
-extN-san.patch
+ext3-san-2.4.20.patch
 extN-2.4.18-ino_sb_fixup.patch
+ext3-map_inode_page_2.4.18.patch
 iopen-2.4.18.patch
diff --git a/lustre/kernel_patches/series/chaos-2.4.20 b/lustre/kernel_patches/series/chaos-2.4.20
new file mode 100644
index 0000000000..0ab55547ba
--- /dev/null
+++ b/lustre/kernel_patches/series/chaos-2.4.20
@@ -0,0 +1,24 @@
+dev_read_only_2.4.20-rh.patch
+exports_2.4.20-rh-hp.patch
+kmem_cache_validate_2.4.20-rh.patch
+lustre_version.patch
+vfs_intent_2.4.20_chaos.patch
+invalidate_show_2.4.20_chaos.patch
+iod-rmap-exports-2.4.20.patch
+export-truncate.patch
+ext-2.4-patch-1-chaos.patch
+ext-2.4-patch-2.patch
+ext-2.4-patch-3.patch
+ext-2.4-patch-4.patch
+linux-2.4.20-xattr-0.8.54-chaos.patch
+ext3-2.4.20-fixes.patch
+ext3_orphan_lock-2.4.20-rh.patch
+ext3_delete_thread_2.4.20_chaos.patch
+ext3-noread-2.4.20.patch
+extN-wantedi.patch
+ext3-san-2.4.20.patch
+ext3-map_inode_page.patch
+ext3-error-export.patch
+iopen-2.4.20.patch
+tcp_zero_copy_2.4.20_chaos.patch
+gpl_header-chaos-2.4.20.patch
diff --git a/lustre/kernel_patches/series/kgdb-2.5.73 b/lustre/kernel_patches/series/kgdb-2.5.73
new file mode 100644
index 0000000000..8ce37c38eb
--- /dev/null
+++ b/lustre/kernel_patches/series/kgdb-2.5.73
@@ -0,0 +1,19 @@
+lkcd-cvs-2.5.69.patch
+lkcd-kernel-changes-2.5.73.patch
+kexec-2.5.73-full.patch
+dump_netdev.patch
+kgdb-ga-2.5.73.patch
+kgdb-use-ggdb-2.5.73.patch
+kgdb-ga-docco-fixes-2.5.73.patch
+lustre_build.patch
+lustre_version.patch
+vfs_intent_2.5.72_rev1.patch
+vfs_nointent_2.5.69_rev1.patch
+vfs_races_2.5.72_rev1.patch
+vfs_mntcwd_2.5.72_rev1.patch
+ext3-san-jdike-2.5.73.patch
+iopen-2.5.73.patch
+export-truncate-2.5.63.patch
+qla2xxx-v8.00.00b1-2.5.73.patch
+ext3-noread-inode.patch
+inode-protection-from-pdflush.patch
diff --git a/lustre/kernel_patches/series/kgdb_2.6.0_test1 b/lustre/kernel_patches/series/kgdb_2.6.0_test1
new file mode 100644
index 0000000000..dbafd56592
--- /dev/null
+++ b/lustre/kernel_patches/series/kgdb_2.6.0_test1
@@ -0,0 +1,15 @@
+2.6.0-test1-mm2.patch
+lkcd-cvs-2.5.69.patch
+lkcd-kernel-changes-2.6.0-test1.patch
+kexec-2.6.0-full.patch
+dump_netdev.patch
+lustre_build.patch
+lustre_version.patch
+vfs_intent_2.6.0-test1.patch
+vfs_nointent_2.5.69_rev1.patch
+vfs_races_2.5.72_rev1.patch
+vfs_mntcwd_2.5.72_rev1.patch
+ext3-san-jdike-2.5.73.patch
+iopen-2.5.73.patch
+export-truncate-2.5.63.patch
+qla2xxx-v8.00.00b1-2.5.73.patch
diff --git a/lustre/kernel_patches/series/rh-2.4.18-18 b/lustre/kernel_patches/series/rh-2.4.18-18
deleted file mode 100644
index df7f536076..0000000000
--- a/lustre/kernel_patches/series/rh-2.4.18-18
+++ /dev/null
@@ -1,24 +0,0 @@
-dev_read_only.patch
-exports.patch
-kmem_cache_validate.patch
-lustre_version.patch
-uml_check_get_page.patch
-uml_no_panic.patch
-vfs_intent-2.4.18-18.patch
-uml_compile_fixes.patch
-invalidate_show.patch
-export-truncate.patch
-iod-rmap-exports.patch
-htree-ext3-2.4.18.patch
-linux-2.4.18ea-0.8.26.patch
-ext3-2.4-ino_t.patch
-ext3-2.4.18-ino_sb_macro.patch
-ext3-orphan_lock.patch
-ext3-delete_thread-2.4.18.patch
-extN-misc-fixup.patch
-extN-noread.patch
-extN-wantedi.patch
-extN-san.patch
-extN-2.4.18-ino_sb_fixup.patch
-iopen-2.4.18.patch
-tcp-zero-copy.patch
diff --git a/lustre/kernel_patches/series/vanilla-2.5 b/lustre/kernel_patches/series/vanilla-2.5
deleted file mode 100644
index b77c77b317..0000000000
--- a/lustre/kernel_patches/series/vanilla-2.5
+++ /dev/null
@@ -1,2 +0,0 @@
-lustre_version.patch
-lustre-2.5.63.patch
diff --git a/lustre/kernel_patches/txt/uml_compile_fixes.txt b/lustre/kernel_patches/txt/ext3-map_inode_page.txt
similarity index 100%
rename from lustre/kernel_patches/txt/uml_compile_fixes.txt
rename to lustre/kernel_patches/txt/ext3-map_inode_page.txt
diff --git a/lustre/kernel_patches/txt/ext3-map_inode_page_2.4.18.txt b/lustre/kernel_patches/txt/ext3-map_inode_page_2.4.18.txt
new file mode 100644
index 0000000000..010cdb76af
--- /dev/null
+++ b/lustre/kernel_patches/txt/ext3-map_inode_page_2.4.18.txt
@@ -0,0 +1,3 @@
+DESC
+(undescribed patch)
+EDESC
diff --git a/lustre/ldlm/Makefile.mk b/lustre/ldlm/Makefile.mk
new file mode 100644
index 0000000000..04402a74de
--- /dev/null
+++ b/lustre/ldlm/Makefile.mk
@@ -0,0 +1,10 @@
+# Copyright (C) 2001  Cluster File Systems, Inc.
+#
+# This code is issued under the GNU General Public License.
+# See the file COPYING in this distribution
+
+include $(src)/../portals/Kernelenv
+
+obj-y += ldlm.o
+ldlm-objs := l_lock.o ldlm_lock.o ldlm_resource.o ldlm_extent.o ldlm_request.o \
+		ldlm_lockd.o ldlm_lib.o
diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c
new file mode 100644
index 0000000000..e64c5da1a0
--- /dev/null
+++ b/lustre/llite/llite_lib.c
@@ -0,0 +1,951 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ * Lustre Light Super operations
+ *
+ *  Copyright (c) 2002, 2003 Cluster File Systems, Inc.
+ *
+ *   This file is part of Lustre, http://www.lustre.org.
+ *
+ *   Lustre 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.
+ *
+ *   Lustre 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 Lustre; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define DEBUG_SUBSYSTEM S_LLITE
+
+#include <linux/module.h>
+#include <linux/random.h>
+#include <linux/version.h>
+#include <linux/lustre_lite.h>
+#include <linux/lustre_ha.h>
+#include <linux/lustre_dlm.h>
+#include <linux/init.h>
+#include <linux/fs.h>
+#include <linux/lprocfs_status.h>
+#include "llite_internal.h"
+
+kmem_cache_t *ll_file_data_slab;
+
+extern struct address_space_operations ll_aops;
+extern struct address_space_operations ll_dir_aops;
+extern struct super_operations ll_super_operations;
+
+#ifndef log2
+#define log2(n) ffz(~(n))
+#endif
+
+char *ll_read_opt(const char *opt, char *data)
+{
+        char *value;
+        char *retval;
+        ENTRY;
+
+        CDEBUG(D_SUPER, "option: %s, data %s\n", opt, data);
+        if (strncmp(opt, data, strlen(opt)))
+                RETURN(NULL);
+        if ((value = strchr(data, '=')) == NULL)
+                RETURN(NULL);
+
+        value++;
+        OBD_ALLOC(retval, strlen(value) + 1);
+        if (!retval) {
+                CERROR("out of memory!\n");
+                RETURN(NULL);
+        }
+
+        memcpy(retval, value, strlen(value)+1);
+        CDEBUG(D_SUPER, "Assigned option: %s, value %s\n", opt, retval);
+        RETURN(retval);
+}
+
+int ll_set_opt(const char *opt, char *data, int fl)
+{
+        ENTRY;
+
+        CDEBUG(D_SUPER, "option: %s, data %s\n", opt, data);
+        if (strncmp(opt, data, strlen(opt)))
+                RETURN(0);
+        else
+                RETURN(fl);
+}
+
+void ll_options(char *options, char **ost, char **mds, int *flags)
+{
+        char *this_char;
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
+        char *opt_ptr = options;
+#endif
+        ENTRY;
+
+        if (!options) {
+                EXIT;
+                return;
+        }
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+        for (this_char = strtok (options, ",");
+             this_char != NULL;
+             this_char = strtok (NULL, ",")) {
+#else
+        while ((this_char = strsep (&opt_ptr, ",")) != NULL) {
+#endif
+                CDEBUG(D_SUPER, "this_char %s\n", this_char);
+                if ((!*ost && (*ost = ll_read_opt("osc", this_char)))||
+                    (!*mds && (*mds = ll_read_opt("mdc", this_char)))||
+                    (!(*flags & LL_SBI_NOLCK) &&
+                     ((*flags) = (*flags) |
+                      ll_set_opt("nolock", this_char, LL_SBI_NOLCK))))
+                        continue;
+        }
+        EXIT;
+}
+
+void ll_lli_init(struct ll_inode_info *lli)
+{
+        sema_init(&lli->lli_open_sem, 1);
+        spin_lock_init(&lli->lli_read_extent_lock);
+        INIT_LIST_HEAD(&lli->lli_read_extents);
+        lli->lli_flags = 0;
+        lli->lli_maxbytes = PAGE_CACHE_MAXBYTES;
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+        ll_lldo_init(&lli->lli_dirty);
+        spin_lock_init(&lli->lli_pg_lock);
+        INIT_LIST_HEAD(&lli->lli_lc_item);
+        plist_init(&lli->lli_pl_read);
+        plist_init(&lli->lli_pl_write);
+        atomic_set(&lli->lli_in_writepages, 0);
+#endif
+}
+
+int ll_fill_super(struct super_block *sb, void *data, int silent)
+{
+        struct inode *root = 0;
+        struct obd_device *obd;
+        struct ll_sb_info *sbi;
+        char *osc = NULL;
+        char *mdc = NULL;
+        int err;
+        struct ll_fid rootfid;
+        struct obd_statfs osfs;
+        struct ptlrpc_request *request = NULL;
+        struct ptlrpc_connection *mdc_conn;
+        struct lustre_md md;
+        class_uuid_t uuid;
+
+        ENTRY;
+
+        CDEBUG(D_VFSTRACE, "VFS Op: sb %p\n", sb);
+        OBD_ALLOC(sbi, sizeof(*sbi));
+        if (!sbi)
+                RETURN(-ENOMEM);
+
+        INIT_LIST_HEAD(&sbi->ll_conn_chain);
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+        INIT_LIST_HEAD(&sbi->ll_orphan_dentry_list);
+        sb->u.generic_sbp = sbi;
+#else
+        INIT_HLIST_HEAD(&sbi->ll_orphan_dentry_list);
+        spin_lock_init(&sbi->ll_iostats.fis_lock);
+        ll_s2sbi(sb) = sbi;
+#endif
+        generate_random_uuid(uuid);
+        class_uuid_unparse(uuid, &sbi->ll_sb_uuid);
+
+        ll_options(data, &osc, &mdc, &sbi->ll_flags);
+
+        if (!osc) {
+                CERROR("no osc\n");
+                GOTO(out_free, err = -EINVAL);
+        }
+
+        if (!mdc) {
+                CERROR("no mdc\n");
+                GOTO(out_free, err = -EINVAL);
+        }
+
+        obd = class_name2obd(mdc);
+        if (!obd) {
+                CERROR("MDC %s: not setup or attached\n", mdc);
+                GOTO(out_free, err = -EINVAL);
+        }
+
+        err = obd_connect(&sbi->ll_mdc_conn, obd, &sbi->ll_sb_uuid);
+        if (err) {
+                CERROR("cannot connect to %s: rc = %d\n", mdc, err);
+                GOTO(out_free, err);
+        }
+
+        err = obd_statfs(obd, &osfs, jiffies - HZ);
+        if (err)
+                GOTO(out_mdc, err);
+
+        LASSERT(osfs.os_bsize);
+        sb->s_blocksize = osfs.os_bsize;
+        sb->s_blocksize_bits = log2(osfs.os_bsize);
+        sb->s_magic = LL_SUPER_MAGIC;
+        sb->s_maxbytes = PAGE_CACHE_MAXBYTES;
+
+        mdc_conn = sbi2mdc(sbi)->cl_import->imp_connection;
+
+        obd = class_name2obd(osc);
+        if (!obd) {
+                CERROR("OSC %s: not setup or attached\n", osc);
+                GOTO(out_mdc, err);
+        }
+
+        err = obd_connect(&sbi->ll_osc_conn, obd, &sbi->ll_sb_uuid);
+        if (err) {
+                CERROR("cannot connect to %s: rc = %d\n", osc, err);
+                GOTO(out_mdc, err);
+        }
+
+        err = mdc_getstatus(&sbi->ll_mdc_conn, &rootfid);
+        if (err) {
+                CERROR("cannot mds_connect: rc = %d\n", err);
+                GOTO(out_osc, err);
+        }
+        CDEBUG(D_SUPER, "rootfid "LPU64"\n", rootfid.id);
+        sbi->ll_rootino = rootfid.id;
+
+        sb->s_op = &ll_super_operations;
+
+        /* make root inode 
+         * XXX: move this to after cbd setup? */
+        err = mdc_getattr(&sbi->ll_mdc_conn, &rootfid,
+                          OBD_MD_FLNOTOBD|OBD_MD_FLBLOCKS, 0, &request);
+        if (err) {
+                CERROR("mdc_getattr failed for root: rc = %d\n", err);
+                GOTO(out_osc, err);
+        }
+
+        /* initialize committed transaction callback daemon */
+        spin_lock_init(&sbi->ll_commitcbd_lock);
+        init_waitqueue_head(&sbi->ll_commitcbd_waitq);
+        init_waitqueue_head(&sbi->ll_commitcbd_ctl_waitq);
+        sbi->ll_commitcbd_flags = 0;
+        err = ll_commitcbd_setup(sbi);
+        if (err) {
+                CERROR("failed to start commit callback daemon: rc = %d\n",err);
+                ptlrpc_req_finished (request);
+                GOTO(out_lliod, err);
+        }
+
+        err = mdc_req2lustre_md(request, 0, &sbi->ll_osc_conn, &md);
+        if (err) {
+                CERROR("failed to understand root inode md: rc = %d\n",err);
+                ptlrpc_req_finished (request);
+                GOTO(out_lliod, err);
+        }
+
+        LASSERT(sbi->ll_rootino != 0);
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+        root = iget4(sb, sbi->ll_rootino, NULL, &md);
+#else
+        root = ll_iget(sb, sbi->ll_rootino, &md);
+#endif
+
+        ptlrpc_req_finished(request);
+
+        if (root == NULL || is_bad_inode(root)) {
+                /* XXX might need iput() for bad inode */
+                CERROR("lustre_lite: bad iget4 for root\n");
+                GOTO(out_cbd, err = -EBADF);
+        }
+
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+        /* initialize the pagecache writeback thread */
+        err = lliod_start(sbi, root);
+        if (err) {
+                CERROR("failed to start lliod: rc = %d\n",err);
+                GOTO(out_root, sb = NULL);
+        }
+#endif
+        sb->s_root = d_alloc_root(root);
+
+        if (proc_lustre_fs_root) {
+                err = lprocfs_register_mountpoint(proc_lustre_fs_root, sb,
+                                                  osc, mdc);
+                if (err < 0)
+                        CERROR("could not register mount in /proc/lustre");
+        }
+
+out_dev:
+        if (mdc)
+                OBD_FREE(mdc, strlen(mdc) + 1);
+        if (osc)
+                OBD_FREE(osc, strlen(osc) + 1);
+
+        RETURN(err);
+
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+out_root:
+        iput(root);
+#endif
+out_cbd:
+        ll_commitcbd_cleanup(sbi);
+out_lliod:
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+        lliod_stop(sbi);
+#endif
+out_osc:
+        obd_disconnect(&sbi->ll_osc_conn, 0);
+out_mdc:
+        obd_disconnect(&sbi->ll_mdc_conn, 0);
+out_free:
+        lprocfs_unregister_mountpoint(sbi);
+        OBD_FREE(sbi, sizeof(*sbi));
+
+        goto out_dev;
+} /* ll_read_super */
+
+void ll_put_super(struct super_block *sb)
+{
+        struct ll_sb_info *sbi = ll_s2sbi(sb);
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+        struct obd_device *obd = class_conn2obd(&sbi->ll_mdc_conn);
+        struct list_head *tmp, *next;
+#else
+        struct hlist_node *tmp, *next;
+#endif
+        struct ll_fid rootfid;
+        ENTRY;
+
+        CDEBUG(D_VFSTRACE, "VFS Op: sb %p\n", sb);
+        list_del(&sbi->ll_conn_chain);
+        ll_commitcbd_cleanup(sbi);
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+        lliod_stop(sbi);
+#endif
+        obd_disconnect(&sbi->ll_osc_conn, 0);
+
+        /* NULL request to force sync on the MDS, and get the last_committed
+         * value to flush remaining RPCs from the sending queue on client.
+         *
+         * XXX This should be an mdc_sync() call to sync the whole MDS fs,
+         *     which we can call for other reasons as well.
+         */
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+        if (!obd->obd_no_recov)
+#endif
+                mdc_getstatus(&sbi->ll_mdc_conn, &rootfid);
+
+        lprocfs_unregister_mountpoint(sbi);
+        if (sbi->ll_proc_root) {
+                lprocfs_remove(sbi->ll_proc_root);
+                sbi->ll_proc_root = NULL;
+        }
+
+        obd_disconnect(&sbi->ll_mdc_conn, 0);
+
+        spin_lock(&dcache_lock);
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+        list_for_each_safe(tmp, next, &sbi->ll_orphan_dentry_list) {
+                struct dentry *dentry = list_entry(tmp, struct dentry, d_hash);
+                shrink_dcache_parent(dentry);
+        }
+#else
+        hlist_for_each_safe(tmp, next, &sbi->ll_orphan_dentry_list) {
+                struct dentry *dentry = hlist_entry(tmp, struct dentry, d_hash);
+                shrink_dcache_parent(dentry);
+        }
+#endif
+        spin_unlock(&dcache_lock);
+
+        OBD_FREE(sbi, sizeof(*sbi));
+
+        EXIT;
+} /* ll_put_super */
+
+void ll_clear_inode(struct inode *inode)
+{
+        struct ll_sb_info *sbi = ll_i2sbi(inode);
+        struct ll_inode_info *lli = ll_i2info(inode);
+        int rc;
+        ENTRY;
+
+        CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p)\n", inode->i_ino,
+               inode->i_generation, inode);
+        rc = ll_mdc_cancel_unused(&sbi->ll_mdc_conn, inode,
+                                  LDLM_FL_WARN | LDLM_FL_NO_CALLBACK, inode);
+        if (rc < 0) {
+                CERROR("ll_mdc_cancel_unused: %d\n", rc);
+                /* XXX FIXME do something dramatic */
+        }
+
+        if (atomic_read(&inode->i_count) != 0)
+                CERROR("clearing in-use inode %lu: count = %d\n",
+                       inode->i_ino, atomic_read(&inode->i_count));
+
+        if (lli->lli_smd) {
+                rc = obd_cancel_unused(&sbi->ll_osc_conn, lli->lli_smd,
+                                       LDLM_FL_WARN, inode);
+                if (rc < 0) {
+                        CERROR("obd_cancel_unused: %d\n", rc);
+                        /* XXX FIXME do something dramatic */
+                }
+                obd_free_memmd(&sbi->ll_osc_conn, &lli->lli_smd);
+                lli->lli_smd = NULL;
+        }
+
+        if (lli->lli_symlink_name) {
+                OBD_FREE(lli->lli_symlink_name,
+                         strlen(lli->lli_symlink_name) + 1);
+                lli->lli_symlink_name = NULL;
+        }
+
+        EXIT;
+}
+
+#if 0
+static void ll_delete_inode(struct inode *inode)
+{
+        ENTRY;
+        CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu(%p)\n", inode->i_ino, inode);
+        if (S_ISREG(inode->i_mode)) {
+                int err;
+                struct obdo *oa;
+                struct lov_stripe_md *lsm = ll_i2info(inode)->lli_smd;
+
+                /* mcreate with no open */
+                if (!lsm)
+                        GOTO(out, 0);
+
+                if (lsm->lsm_object_id == 0) {
+                        CERROR("This really happens\n");
+                        /* No obdo was ever created */
+                        GOTO(out, 0);
+                }
+
+                oa = obdo_alloc();
+                if (oa == NULL)
+                        GOTO(out, -ENOMEM);
+
+                oa->o_id = lsm->lsm_object_id;
+                oa->o_valid = OBD_MD_FLID;
+                obdo_from_inode(oa, inode, OBD_MD_FLTYPE);
+
+                err = obd_destroy(ll_i2obdconn(inode), oa, lsm, NULL);
+                obdo_free(oa);
+                if (err)
+                        CDEBUG(D_INODE,
+                               "inode %lu obd_destroy objid "LPX64" error %d\n",
+                               inode->i_ino, lsm->lsm_object_id, err);
+        }
+out:
+        clear_inode(inode);
+        EXIT;
+}
+#endif
+
+/* like inode_setattr, but doesn't mark the inode dirty */
+int ll_attr2inode(struct inode *inode, struct iattr *attr, int trunc)
+{
+        unsigned int ia_valid = attr->ia_valid;
+        int error = 0;
+
+        if ((ia_valid & ATTR_SIZE) && trunc) {
+                if (attr->ia_size > ll_file_maxbytes(inode)) {
+                        error = -EFBIG;
+                        goto out;
+                }
+                error = vmtruncate(inode, attr->ia_size);
+                if (error)
+                        goto out;
+        } else if (ia_valid & ATTR_SIZE)
+                inode->i_size = attr->ia_size;
+
+        if (ia_valid & ATTR_UID)
+                inode->i_uid = attr->ia_uid;
+        if (ia_valid & ATTR_GID)
+                inode->i_gid = attr->ia_gid;
+        if (ia_valid & ATTR_ATIME)
+                inode->i_atime = attr->ia_atime;
+        if (ia_valid & ATTR_MTIME)
+                inode->i_mtime = attr->ia_mtime;
+        if (ia_valid & ATTR_CTIME)
+                inode->i_ctime = attr->ia_ctime;
+        if (ia_valid & ATTR_MODE) {
+                inode->i_mode = attr->ia_mode;
+                if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
+                        inode->i_mode &= ~S_ISGID;
+        }
+out:
+        return error;
+}
+
+int ll_inode_setattr(struct inode *inode, struct iattr *attr, int do_trunc)
+{
+        struct ptlrpc_request *request = NULL;
+        struct ll_sb_info *sbi = ll_i2sbi(inode);
+        int err = 0;
+        ENTRY;
+
+        /* change incore inode */
+        err = ll_attr2inode(inode, attr, do_trunc);
+        if (err)
+                RETURN(err);
+
+        /* Don't send size changes to MDS to avoid "fast EA" problems, and
+         * also avoid a pointless RPC (we get file size from OST anyways).
+         */
+        attr->ia_valid &= ~ATTR_SIZE;
+        if (attr->ia_valid) {
+                struct mdc_op_data op_data;
+
+                ll_prepare_mdc_op_data(&op_data, inode, NULL, NULL, 0, 0);
+                err = mdc_setattr(&sbi->ll_mdc_conn, &op_data,
+                                  attr, NULL, 0, NULL, 0, &request);
+                if (err)
+                        CERROR("mdc_setattr fails: err = %d\n", err);
+
+                ptlrpc_req_finished(request);
+                if (S_ISREG(inode->i_mode) && attr->ia_valid & ATTR_MTIME_SET) {
+                        struct lov_stripe_md *lsm = ll_i2info(inode)->lli_smd;
+                        struct obdo oa;
+                        int err2;
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+                        CDEBUG(D_INODE, "set mtime on OST inode %lu to %lu\n",
+                               inode->i_ino, attr->ia_mtime);
+                        oa.o_mtime = attr->ia_mtime;
+#else
+                        CDEBUG(D_INODE, "set mtime on OST inode %lu to "
+                               LPU64"\n", inode->i_ino, 
+                               ll_ts2u64(&attr->ia_mtime));
+                        oa.o_mtime = ll_ts2u64(&attr->ia_mtime);
+#endif
+                        oa.o_id = lsm->lsm_object_id;
+                        oa.o_mode = S_IFREG;
+                        oa.o_valid = OBD_MD_FLID |OBD_MD_FLTYPE |OBD_MD_FLMTIME;
+                        err2 = obd_setattr(&sbi->ll_osc_conn, &oa, lsm, NULL);
+                        if (err2) {
+                                CERROR("obd_setattr fails: rc=%d\n", err);
+                                if (!err)
+                                        err = err2;
+                        }
+                }
+        }
+
+        RETURN(err);
+}
+
+/* If this inode has objects allocated to it (lsm != NULL), then the OST
+ * object(s) determine the file size and mtime.  Otherwise, the MDS will
+ * keep these values until such a time that objects are allocated for it.
+ * We do the MDS operations first, as it is checking permissions for us.
+ * We don't to the MDS RPC if there is nothing that we want to store there,
+ * otherwise there is no harm in updating mtime/atime on the MDS if we are
+ * going to do an RPC anyways.
+ *
+ * If we are doing a truncate, we will send the mtime and ctime updates
+ * to the OST with the punch RPC, otherwise we do an explicit setattr RPC.
+ * I don't believe it is possible to get e.g. ATTR_MTIME_SET and ATTR_SIZE
+ * at the same time.
+ */
+#define OST_ATTR (ATTR_MTIME | ATTR_MTIME_SET | ATTR_CTIME | \
+                  ATTR_ATIME | ATTR_ATIME_SET | ATTR_SIZE)
+int ll_setattr_raw(struct inode *inode, struct iattr *attr)
+{
+        struct lov_stripe_md *lsm = ll_i2info(inode)->lli_smd;
+        struct ll_sb_info *sbi = ll_i2sbi(inode);
+        struct ptlrpc_request *request = NULL;
+        struct mdc_op_data op_data;
+        time_t now = LTIME_S(CURRENT_TIME);
+        int ia_valid = attr->ia_valid;
+        int rc = 0;
+        ENTRY;
+
+        CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu\n", inode->i_ino);
+
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+        lprocfs_counter_incr(ll_i2sbi(inode)->ll_stats, LPROC_LL_SETATTR);
+#endif
+
+        if (ia_valid & ATTR_SIZE) {
+                if (attr->ia_size > ll_file_maxbytes(inode)) {
+                        CDEBUG(D_INODE, "file too large %llu > "LPU64"\n",
+                               attr->ia_size, ll_file_maxbytes(inode));
+                        RETURN(-EFBIG);
+                }
+
+                attr->ia_valid |= ATTR_MTIME | ATTR_CTIME;
+        }
+
+        /* We mark all of the fields "set" so MDS/OST does not re-set them */
+        if (attr->ia_valid & ATTR_CTIME) {
+                attr->ia_ctime = now;
+                attr->ia_valid |= ATTR_CTIME_SET;
+        }
+        if (!(ia_valid & ATTR_ATIME_SET) && (attr->ia_valid & ATTR_ATIME)) {
+                attr->ia_atime = now;
+                attr->ia_valid |= ATTR_ATIME_SET;
+        }
+        if (!(ia_valid & ATTR_MTIME_SET) && (attr->ia_valid & ATTR_MTIME)) {
+                attr->ia_mtime = now;
+                attr->ia_valid |= ATTR_MTIME_SET;
+        }
+
+        if (attr->ia_valid & (ATTR_MTIME | ATTR_CTIME))
+                CDEBUG(D_INODE, "setting mtime %lu, ctime %lu, now = %lu\n",
+                       attr->ia_mtime, attr->ia_ctime, now);
+        if (lsm)
+                attr->ia_valid &= ~ATTR_SIZE;
+
+        /* If only OST attributes being set on objects, don't do MDS RPC.
+         * In that case, we need to check permissions and update the local
+         * inode ourselves so we can call obdo_from_inode() always. */
+        if (ia_valid & (lsm ? ~(OST_ATTR | ATTR_FROM_OPEN | ATTR_RAW) : ~0)) {
+                struct lustre_md md;
+                ll_prepare_mdc_op_data(&op_data, inode, NULL, NULL, 0, 0);
+
+                rc = mdc_setattr(&sbi->ll_mdc_conn, &op_data,
+                                  attr, NULL, 0, NULL, 0, &request);
+
+                if (rc) {
+                        ptlrpc_req_finished(request);
+                        if (rc != -EPERM && rc != -EACCES)
+                                CERROR("mdc_setattr fails: rc = %d\n", rc);
+                        RETURN(rc);
+                }
+
+                rc = mdc_req2lustre_md(request, 0, &sbi->ll_osc_conn, &md);
+                if (rc) {
+                        ptlrpc_req_finished(request);
+                        RETURN(rc);
+                }
+                ll_update_inode(inode, md.body, md.lsm);
+                ptlrpc_req_finished(request);
+
+                if (!md.lsm || !S_ISREG(inode->i_mode)) {
+                        CDEBUG(D_INODE, "no lsm: not setting attrs on OST\n");
+                        RETURN(0);
+                }
+        } else {
+                /* The OST doesn't check permissions, but the alternative is
+                 * a gratuitous RPC to the MDS.  We already rely on the client
+                 * to do read/write/truncate permission checks, so is mtime OK?
+                 */
+                if (ia_valid & (ATTR_MTIME | ATTR_ATIME)) {
+                        /* from sys_utime() */
+                        if (!(ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET))) {
+                                if (current->fsuid != inode->i_uid &&
+                                    (rc = permission(inode, MAY_WRITE)) != 0)
+                                        RETURN(rc);
+                        } else {
+				/* from inode_change_ok() */
+				if (current->fsuid != inode->i_uid &&
+				    !capable(CAP_FOWNER))
+					RETURN(-EPERM);
+                        }
+                }
+
+                /* Won't invoke vmtruncate, as we already cleared ATTR_SIZE */
+                inode_setattr(inode, attr);
+        }
+
+        if (ia_valid & ATTR_SIZE) {
+                struct ldlm_extent extent = { .start = attr->ia_size,
+                                              .end = OBD_OBJECT_EOF };
+                struct lustre_handle lockh = { 0 };
+                int err;
+
+                /* Writeback uses inode->i_size to determine how far out
+                 * its cached pages go.  ll_truncate gets a PW lock, canceling
+                 * our lock, _after_ it has updated i_size.  this can confuse
+                 *
+                 * We really need to get our PW lock before we change
+                 * inode->i_size.  If we don't we can race with other
+                 * i_size updaters on our node, like ll_file_read.  We
+                 * can also race with i_size propogation to other
+                 * nodes through dirtying and writeback of final cached
+                 * pages.  This last one is especially bad for racing
+                 * o_append users on other nodes. */
+                rc = ll_extent_lock_no_validate(NULL, inode, lsm, LCK_PW,
+                                                 &extent, &lockh);
+                if (rc != ELDLM_OK) {
+                        if (rc > 0)
+                                RETURN(-ENOLCK);
+                        RETURN(rc);
+                }
+
+                rc = vmtruncate(inode, attr->ia_size);
+                if (rc == 0)
+                        set_bit(LLI_F_HAVE_SIZE_LOCK,
+                                &ll_i2info(inode)->lli_flags);
+
+                /* unlock now as we don't mind others file lockers racing with
+                 * the mds updates below? */
+                err = ll_extent_unlock(NULL, inode, lsm, LCK_PW, &lockh);
+                if (err) {
+                        CERROR("ll_extent_unlock failed: %d\n", err);
+                        if (!rc)
+                                rc = err;
+                }
+        } else if (ia_valid & (ATTR_MTIME | ATTR_MTIME_SET)) {
+                struct obdo oa;
+
+                CDEBUG(D_INODE, "set mtime on OST inode %lu to %lu\n",
+                       inode->i_ino, attr->ia_mtime);
+                oa.o_id = lsm->lsm_object_id;
+                oa.o_valid = OBD_MD_FLID;
+                obdo_from_inode(&oa, inode, OBD_MD_FLTYPE | OBD_MD_FLATIME |
+                                            OBD_MD_FLMTIME | OBD_MD_FLCTIME);
+                rc = obd_setattr(&sbi->ll_osc_conn, &oa, lsm, NULL);
+                if (rc)
+                        CERROR("obd_setattr fails: rc=%d\n", rc);
+        }
+        RETURN(rc);
+}
+
+int ll_setattr(struct dentry *de, struct iattr *attr)
+{
+        int rc = inode_change_ok(de->d_inode, attr);
+        CDEBUG(D_VFSTRACE, "VFS Op:name=%s\n", de->d_name.name);
+        if (rc)
+                return rc;
+
+        lprocfs_counter_incr(ll_i2sbi(de->d_inode)->ll_stats, LPROC_LL_SETATTR);
+        return ll_inode_setattr(de->d_inode, attr, 1);
+}
+
+int ll_statfs_internal(struct super_block *sb, struct obd_statfs *osfs,
+                       unsigned long max_age)
+{
+        struct ll_sb_info *sbi = ll_s2sbi(sb);
+        struct obd_statfs obd_osfs;
+        int rc;
+        ENTRY;
+
+        rc = obd_statfs(class_conn2obd(&sbi->ll_mdc_conn), osfs, max_age);
+        if (rc) {
+                CERROR("mdc_statfs fails: rc = %d\n", rc);
+                RETURN(rc);
+        }
+
+        CDEBUG(D_SUPER, "MDC blocks "LPU64"/"LPU64" objects "LPU64"/"LPU64"\n",
+               osfs->os_bavail, osfs->os_blocks, osfs->os_ffree,osfs->os_files);
+
+        rc = obd_statfs(class_conn2obd(&sbi->ll_osc_conn), &obd_osfs, max_age);
+        if (rc) {
+                CERROR("obd_statfs fails: rc = %d\n", rc);
+                RETURN(rc);
+        }
+
+        CDEBUG(D_SUPER, "OSC blocks "LPU64"/"LPU64" objects "LPU64"/"LPU64"\n",
+               obd_osfs.os_bavail, obd_osfs.os_blocks, obd_osfs.os_ffree,
+               obd_osfs.os_files);
+
+        osfs->os_blocks = obd_osfs.os_blocks;
+        osfs->os_bfree = obd_osfs.os_bfree;
+        osfs->os_bavail = obd_osfs.os_bavail;
+
+        /* If we don't have as many objects free on the OST as inodes
+         * on the MDS, we reduce the total number of inodes to
+         * compensate, so that the "inodes in use" number is correct.
+         */
+        if (obd_osfs.os_ffree < osfs->os_ffree) {
+                osfs->os_files = (osfs->os_files - osfs->os_ffree) +
+                        obd_osfs.os_ffree;
+                osfs->os_ffree = obd_osfs.os_ffree;
+        }
+
+        RETURN(rc);
+}
+
+int ll_statfs(struct super_block *sb, struct kstatfs *sfs)
+{
+        struct obd_statfs osfs;
+        int rc;
+
+        CDEBUG(D_VFSTRACE, "VFS Op:\n");
+        lprocfs_counter_incr(ll_s2sbi(sb)->ll_stats, LPROC_LL_STAFS);
+
+        /* For now we will always get up-to-date statfs values, but in the
+         * future we may allow some amount of caching on the client (e.g.
+         * from QOS or lprocfs updates). */
+        rc = ll_statfs_internal(sb, &osfs, jiffies - 1);
+        if (rc)
+                return rc;
+
+        statfs_unpack(sfs, &osfs);
+
+        if (sizeof(sfs->f_blocks) == 4) {
+                while (osfs.os_blocks > ~0UL) {
+                        sfs->f_bsize <<= 1;
+
+                        osfs.os_blocks >>= 1;
+                        osfs.os_bfree >>= 1;
+                        osfs.os_bavail >>= 1;
+                }
+        }
+
+        sfs->f_blocks = osfs.os_blocks;
+        sfs->f_bfree = osfs.os_bfree;
+        sfs->f_bavail = osfs.os_bavail;
+
+        return 0;
+}
+
+void dump_lsm(int level, struct lov_stripe_md *lsm)
+{
+        CDEBUG(level, "objid "LPX64", maxbytes "LPX64", magic %#08x, "
+               "stripe_size %#08x, offset %u, stripe_count %u\n",
+               lsm->lsm_object_id, lsm->lsm_maxbytes, lsm->lsm_magic,
+               lsm->lsm_stripe_size, lsm->lsm_stripe_offset,
+               lsm->lsm_stripe_count);
+}
+
+void ll_update_inode(struct inode *inode, struct mds_body *body,
+                     struct lov_stripe_md *lsm)
+{
+        struct ll_inode_info *lli = ll_i2info(inode);
+
+        LASSERT ((lsm != NULL) == ((body->valid & OBD_MD_FLEASIZE) != 0));
+        if (lsm != NULL) {
+                if (lli->lli_smd == NULL) {
+                        lli->lli_smd = lsm;
+                        lli->lli_maxbytes = lsm->lsm_maxbytes;
+                        if (lli->lli_maxbytes > PAGE_CACHE_MAXBYTES)
+                                lli->lli_maxbytes = PAGE_CACHE_MAXBYTES;
+                } else {
+                        if (memcmp(lli->lli_smd, lsm, sizeof(*lsm))) {
+                                CERROR("lsm mismatch for inode %ld\n",
+                                       inode->i_ino);
+                                CERROR("lli_smd:\n");
+                                dump_lsm(D_ERROR, lli->lli_smd);
+                                CERROR("lsm:\n");
+                                dump_lsm(D_ERROR, lsm);
+                                LBUG();
+                        }
+                }
+        }
+
+        if (body->valid & OBD_MD_FLID)
+                inode->i_ino = body->ino;
+        if (body->valid & OBD_MD_FLATIME)
+                LTIME_S(inode->i_atime) = body->atime;
+        if (body->valid & OBD_MD_FLMTIME)
+                LTIME_S(inode->i_mtime) = body->mtime;
+        if (body->valid & OBD_MD_FLCTIME)
+                LTIME_S(inode->i_ctime) = body->ctime;
+        if (body->valid & OBD_MD_FLMODE)
+                inode->i_mode = (inode->i_mode & S_IFMT)|(body->mode & ~S_IFMT);
+        if (body->valid & OBD_MD_FLTYPE)
+                inode->i_mode = (inode->i_mode & ~S_IFMT)|(body->mode & S_IFMT);
+        if (body->valid & OBD_MD_FLUID)
+                inode->i_uid = body->uid;
+        if (body->valid & OBD_MD_FLGID)
+                inode->i_gid = body->gid;
+        if (body->valid & OBD_MD_FLFLAGS)
+                inode->i_flags = body->flags;
+        if (body->valid & OBD_MD_FLNLINK)
+                inode->i_nlink = body->nlink;
+        if (body->valid & OBD_MD_FLGENER)
+                inode->i_generation = body->generation;
+        if (body->valid & OBD_MD_FLRDEV)
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+                inode->i_rdev = body->rdev;
+#else
+                inode->i_rdev = to_kdev_t(body->rdev);
+#endif
+        if (body->valid & OBD_MD_FLSIZE)
+                inode->i_size = body->size;
+        if (body->valid & OBD_MD_FLBLOCKS)
+                inode->i_blocks = body->blocks;
+}
+
+void ll_read_inode2(struct inode *inode, void *opaque)
+{
+        struct lustre_md *md = opaque;
+        struct ll_inode_info *lli = ll_i2info(inode);
+        ENTRY;
+
+        CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p)\n", inode->i_ino,
+               inode->i_generation, inode);
+
+        ll_lli_init(lli);
+
+        LASSERT(!lli->lli_smd);
+
+        /* core attributes from the MDS first */
+        ll_update_inode(inode, md->body, md->lsm);
+
+        /* OIDEBUG(inode); */
+
+        if (S_ISREG(inode->i_mode)) {
+                inode->i_op = &ll_file_inode_operations;
+                inode->i_fop = &ll_file_operations;
+                inode->i_mapping->a_ops = &ll_aops;
+                EXIT;
+        } else if (S_ISDIR(inode->i_mode)) {
+                inode->i_op = &ll_dir_inode_operations;
+                inode->i_fop = &ll_dir_operations;
+                inode->i_mapping->a_ops = &ll_dir_aops;
+                EXIT;
+        } else if (S_ISLNK(inode->i_mode)) {
+                inode->i_op = &ll_fast_symlink_inode_operations;
+                EXIT;
+        } else {
+                inode->i_op = &ll_special_inode_operations;
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+                init_special_inode(inode, inode->i_mode, 
+                                   kdev_t_to_nr(inode->i_rdev));
+#else
+                init_special_inode(inode, inode->i_mode, inode->i_rdev);
+#endif
+                EXIT;
+        }
+}
+
+int it_disposition(struct lookup_intent *it, int flag)
+{
+        return it->it_disposition & flag;
+}
+
+void it_set_disposition(struct lookup_intent *it, int flag)
+{
+        it->it_disposition |= flag;
+}
+
+void ll_umount_begin(struct super_block *sb)
+{
+        struct ll_sb_info *sbi = ll_s2sbi(sb);
+        struct obd_device *obd;
+        struct obd_ioctl_data ioc_data = { 0 };
+        ENTRY;
+        CDEBUG(D_VFSTRACE, "VFS Op:\n");
+
+        obd = class_conn2obd(&sbi->ll_mdc_conn);
+        if (obd == NULL) {
+                CERROR("Invalid MDC connection handle "LPX64"\n",
+                       sbi->ll_mdc_conn.cookie);
+                EXIT;
+                return;
+        }
+        obd->obd_no_recov = 1;
+        obd_iocontrol(IOC_OSC_SET_ACTIVE, &sbi->ll_mdc_conn, sizeof ioc_data,
+                      &ioc_data, NULL);
+
+        obd = class_conn2obd(&sbi->ll_osc_conn);
+        obd->obd_no_recov = 1;
+        obd_iocontrol(IOC_OSC_SET_ACTIVE, &sbi->ll_osc_conn, sizeof ioc_data,
+                      &ioc_data, NULL);
+
+        /* Really, we'd like to wait until there are no requests outstanding,
+         * and then continue.  For now, we just invalidate the requests,
+         * schedule, and hope.
+         */
+        schedule();
+
+        EXIT;
+}
diff --git a/lustre/lov/lov_internal.h b/lustre/lov/lov_internal.h
new file mode 100644
index 0000000000..f3bc191967
--- /dev/null
+++ b/lustre/lov/lov_internal.h
@@ -0,0 +1,26 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ * Copyright (C) 2003 Cluster File Systems, Inc.
+ *
+ * This code is issued under the GNU General Public License.
+ * See the file COPYING in this distribution
+ */
+
+/* lov_obd.c */
+int lov_get_stripecnt(struct lov_obd *lov, int stripe_count);
+int lov_alloc_memmd(struct lov_stripe_md **lsmp, int stripe_count);
+void lov_free_memmd(struct lov_stripe_md **lsmp);
+
+/* lov_pack.c */
+int lov_packmd(struct lustre_handle *conn, struct lov_mds_md **lmm,
+               struct lov_stripe_md *lsm);
+int lov_unpackmd(struct lustre_handle *conn, struct lov_stripe_md **lsm,
+                 struct lov_mds_md *lmm, int lmmsize);
+int lov_setstripe(struct lustre_handle *conn,
+                  struct lov_stripe_md **lsmp, struct lov_mds_md *lmmu);
+int lov_getstripe(struct lustre_handle *conn,
+                  struct lov_stripe_md *lsm, struct lov_mds_md *lmmu);
+
+/* lproc_lov.c */
+extern struct file_operations lov_proc_target_fops;
diff --git a/lustre/mdc/Makefile.mk b/lustre/mdc/Makefile.mk
new file mode 100644
index 0000000000..b12e5fcb92
--- /dev/null
+++ b/lustre/mdc/Makefile.mk
@@ -0,0 +1,9 @@
+# Copyright (C) 2003  Cluster File Systems, Inc.
+#
+# This code is issued under the GNU General Public License.
+# See the file COPYING in this distribution
+
+include $(src)/../portals/Kernelenv
+
+obj-y += mdc.o
+mdc-objs := mdc_request.o mdc_reint.o lproc_mdc.o mdc_lib.o
diff --git a/lustre/mds/commit_confd.c b/lustre/mds/commit_confd.c
new file mode 100644
index 0000000000..557dc55477
--- /dev/null
+++ b/lustre/mds/commit_confd.c
@@ -0,0 +1,76 @@
+
+
+void commit_add(struct )
+{
+        struct obd_import *import = commit_uuid2import(rec->  uuid);
+
+        if (!import) {
+                CERROR("unaware of OST UUID %s - dorpping\n", rec-> uuid);
+                EXIT;
+                return;
+        }
+
+        spin_lock(&import->llcconf_lock);
+        list_add(&rec->  &import);
+        spin_unlock(&import->llcconf_lock);
+        EXIT;
+        return;
+}
+
+void commit_confd_conf_import(struct obd_import *import,
+                              struct llog_commit_confirm_daemon *lccd)
+{
+        struct list_head *tmp, *save;
+
+
+        list_for_each_safe(&import->import_cc_list, tmp, save) {
+                struct llog_commit_data *cd;
+
+                if (atomic_read(import->import_cc_count) <=
+                    lccd->llcconf_lowwater)
+                        break;
+
+                cd = list_entry(tmp, struct llog_commit_data *, llcconf_entry);
+                atomic_dec(&import->import_cc_count);
+                commit_confd_add_and_fire(cd);
+        }
+        EXIT;
+        return;
+}
+
+
+int commit_confd_main(void *data)
+{
+        struct llog_commit_confirm_daemon *lccd = data;
+
+        while (1) {
+                /* something has happened */
+                event_wait();
+
+                if (lccd->flags & LCCD_STOP)
+                        break;
+
+
+                /* lock llccd imporlist */
+                spin_lock(&lccd->llcconf_lock);
+                list_for_each_safe(&lccd->llcconf_list,   ) {
+                        struct obd_import *import;
+                        import = list_entry(&lccd->llcconf_list,
+                                            struct obd_import,
+                                            import_entry);
+                        get_import(import);
+                        spin_unlock(&lccd->llcconf_lock);
+                        if (atomic_read(import->import_cc_count) >
+                            lccd->llcconf_highwater)
+                                commit_confd_conf_import(import);
+                        put_import(import);
+                        spin_lock(&lccd->llcconf_lock);
+
+                }
+                spin_unlock(&lccd->llcconf_lock);
+
+        }
+
+        lccd->flags = LCCD_STOPPED;
+        RETURN(0);
+}
diff --git a/lustre/obdclass/obdo.c b/lustre/obdclass/obdo.c
new file mode 100644
index 0000000000..4532534891
--- /dev/null
+++ b/lustre/obdclass/obdo.c
@@ -0,0 +1,343 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ * Object Devices Class Driver
+ *
+ *  Copyright (C) 2001-2003 Cluster File Systems, Inc.
+ *
+ *   This file is part of Lustre, http://www.lustre.org.
+ *
+ *   Lustre 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.
+ *
+ *   Lustre 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 Lustre; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * These are the only exported functions, they provide some generic
+ * infrastructure for managing object devices
+ */
+
+#define DEBUG_SUBSYSTEM S_CLASS
+#define EXPORT_SYMTAB
+
+#include <linux/module.h>
+#include <linux/obd_class.h>
+#include <linux/lustre_idl.h>
+
+#ifdef __KERNEL__
+#include <linux/fs.h>
+
+void obdo_from_iattr(struct obdo *oa, struct iattr *attr, unsigned int ia_valid)
+{
+        if (ia_valid & ATTR_ATIME) {
+                oa->o_atime = LTIME_S(attr->ia_atime);
+                oa->o_valid |= OBD_MD_FLATIME;
+        }
+        if (ia_valid & ATTR_MTIME) {
+                oa->o_mtime = LTIME_S(attr->ia_mtime);
+                oa->o_valid |= OBD_MD_FLMTIME;
+        }
+        if (ia_valid & ATTR_CTIME) {
+                oa->o_ctime = LTIME_S(attr->ia_ctime);
+                oa->o_valid |= OBD_MD_FLCTIME;
+        }
+        if (ia_valid & ATTR_SIZE) {
+                oa->o_size = attr->ia_size;
+                oa->o_valid |= OBD_MD_FLSIZE;
+        }
+        if (ia_valid & ATTR_MODE) {
+                oa->o_mode = attr->ia_mode;
+                oa->o_valid |= OBD_MD_FLTYPE | OBD_MD_FLMODE;
+                if (!in_group_p(oa->o_gid) && !capable(CAP_FSETID))
+                        oa->o_mode &= ~S_ISGID;
+        }
+        if (ia_valid & ATTR_UID) {
+                oa->o_uid = attr->ia_uid;
+                oa->o_valid |= OBD_MD_FLUID;
+        }
+        if (ia_valid & ATTR_GID) {
+                oa->o_gid = attr->ia_gid;
+                oa->o_valid |= OBD_MD_FLGID;
+        }
+}
+EXPORT_SYMBOL(obdo_from_iattr);
+
+void iattr_from_obdo(struct iattr *attr, struct obdo *oa, obd_flag valid)
+{
+        valid &= oa->o_valid;
+
+        if (valid & (OBD_MD_FLCTIME | OBD_MD_FLMTIME))
+                CDEBUG(D_INODE, "valid %x, new time %lu/%lu\n",
+                       oa->o_valid, (long)oa->o_mtime, (long)oa->o_ctime);
+
+        attr->ia_valid = 0;
+        if (valid & OBD_MD_FLATIME) {
+                LTIME_S(attr->ia_atime) = oa->o_atime;
+                attr->ia_valid |= ATTR_ATIME;
+        }
+        if (valid & OBD_MD_FLMTIME) {
+                LTIME_S(attr->ia_mtime) = oa->o_mtime;
+                attr->ia_valid |= ATTR_MTIME;
+        }
+        if (valid & OBD_MD_FLCTIME) {
+                LTIME_S(attr->ia_ctime) = oa->o_ctime;
+                attr->ia_valid |= ATTR_CTIME;
+        }
+        if (valid & OBD_MD_FLSIZE) {
+                attr->ia_size = oa->o_size;
+                attr->ia_valid |= ATTR_SIZE;
+        }
+#if 0   /* you shouldn't be able to change a file's type with setattr */
+        if (valid & OBD_MD_FLTYPE) {
+                attr->ia_mode = (attr->ia_mode & ~S_IFMT)|(oa->o_mode & S_IFMT);
+                attr->ia_valid |= ATTR_MODE;
+        }
+#endif
+        if (valid & OBD_MD_FLMODE) {
+                attr->ia_mode = (attr->ia_mode & S_IFMT)|(oa->o_mode & ~S_IFMT);
+                attr->ia_valid |= ATTR_MODE;
+                if (!in_group_p(oa->o_gid) && !capable(CAP_FSETID))
+                        attr->ia_mode &= ~S_ISGID;
+        }
+        if (valid & OBD_MD_FLUID) {
+                attr->ia_uid = oa->o_uid;
+                attr->ia_valid |= ATTR_UID;
+        }
+        if (valid & OBD_MD_FLGID) {
+                attr->ia_gid = oa->o_gid;
+                attr->ia_valid |= ATTR_GID;
+        }
+}
+EXPORT_SYMBOL(iattr_from_obdo);
+
+/* WARNING: the file systems must take care not to tinker with
+   attributes they don't manage (such as blocks). */
+void obdo_from_inode(struct obdo *dst, struct inode *src, obd_flag valid)
+{
+        obd_flag newvalid = 0;
+
+        if (valid & (OBD_MD_FLCTIME | OBD_MD_FLMTIME))
+                CDEBUG(D_INODE, "valid %x, new time %lu/%lu\n",
+                       valid, src->i_mtime, src->i_ctime);
+
+        if (valid & OBD_MD_FLATIME) {
+                dst->o_atime = LTIME_S(src->i_atime);
+                newvalid |= OBD_MD_FLATIME;
+        }
+        if (valid & OBD_MD_FLMTIME) {
+                dst->o_mtime = LTIME_S(src->i_mtime);
+                newvalid |= OBD_MD_FLMTIME;
+        }
+        if (valid & OBD_MD_FLCTIME) {
+                dst->o_ctime = LTIME_S(src->i_ctime);
+                newvalid |= OBD_MD_FLCTIME;
+        }
+        if (valid & OBD_MD_FLSIZE) {
+                dst->o_size = src->i_size;
+                newvalid |= OBD_MD_FLSIZE;
+        }
+        if (valid & OBD_MD_FLBLOCKS) {  /* allocation of space (x512 bytes) */
+                dst->o_blocks = src->i_blocks;
+                newvalid |= OBD_MD_FLBLOCKS;
+        }
+        if (valid & OBD_MD_FLBLKSZ) {   /* optimal block size */
+                dst->o_blksize = src->i_blksize;
+                newvalid |= OBD_MD_FLBLKSZ;
+        }
+        if (valid & OBD_MD_FLTYPE) {
+                dst->o_mode = (dst->o_mode & S_IALLUGO)|(src->i_mode & S_IFMT);
+                newvalid |= OBD_MD_FLTYPE;
+        }
+        if (valid & OBD_MD_FLMODE) {
+                dst->o_mode = (dst->o_mode & S_IFMT)|(src->i_mode & S_IALLUGO);
+                newvalid |= OBD_MD_FLMODE;
+        }
+        if (valid & OBD_MD_FLUID) {
+                dst->o_uid = src->i_uid;
+                newvalid |= OBD_MD_FLUID;
+        }
+        if (valid & OBD_MD_FLGID) {
+                dst->o_gid = src->i_gid;
+                newvalid |= OBD_MD_FLGID;
+        }
+        if (valid & OBD_MD_FLFLAGS) {
+                dst->o_flags = src->i_flags;
+                newvalid |= OBD_MD_FLFLAGS;
+        }
+        if (valid & OBD_MD_FLNLINK) {
+                dst->o_nlink = src->i_nlink;
+                newvalid |= OBD_MD_FLNLINK;
+        }
+        if (valid & OBD_MD_FLGENER) {
+                dst->o_generation = src->i_generation;
+                newvalid |= OBD_MD_FLGENER;
+        }
+        if (valid & OBD_MD_FLRDEV) {
+                dst->o_rdev = (__u32)kdev_t_to_nr(src->i_rdev);
+                newvalid |= OBD_MD_FLRDEV;
+        }
+
+        dst->o_valid |= newvalid;
+}
+EXPORT_SYMBOL(obdo_from_inode);
+
+void obdo_refresh_inode(struct inode *dst, struct obdo *src, obd_flag valid)
+{
+        valid &= src->o_valid;
+
+        if (valid & (OBD_MD_FLCTIME | OBD_MD_FLMTIME))
+                CDEBUG(D_INODE, "valid %x, cur time %lu/%lu, new %lu/%lu\n",
+                       src->o_valid, dst->i_mtime, dst->i_ctime,
+                       (long)src->o_mtime, (long)src->o_ctime);
+
+        if (valid & OBD_MD_FLATIME && src->o_atime > LTIME_S(dst->i_atime))
+                LTIME_S(dst->i_atime) = src->o_atime;
+        if (valid & OBD_MD_FLMTIME && src->o_mtime > LTIME_S(dst->i_mtime))
+                LTIME_S(dst->i_mtime) = src->o_mtime;
+        if (valid & OBD_MD_FLCTIME && src->o_ctime > LTIME_S(dst->i_ctime))
+                LTIME_S(dst->i_ctime) = src->o_ctime;
+        if (valid & OBD_MD_FLSIZE && src->o_size > dst->i_size)
+                dst->i_size = src->o_size;
+        /* optimum IO size */
+        if (valid & OBD_MD_FLBLKSZ)
+                dst->i_blksize = src->o_blksize;
+        /* allocation of space */
+        if (valid & OBD_MD_FLBLOCKS && src->o_blocks > dst->i_blocks)
+                dst->i_blocks = src->o_blocks;
+}
+EXPORT_SYMBOL(obdo_refresh_inode);
+
+void obdo_to_inode(struct inode *dst, struct obdo *src, obd_flag valid)
+{
+        valid &= src->o_valid;
+
+        if (valid & (OBD_MD_FLCTIME | OBD_MD_FLMTIME))
+                CDEBUG(D_INODE, "valid %x, cur time %lu/%lu, new %lu/%lu\n",
+                       src->o_valid, dst->i_mtime, dst->i_ctime,
+                       (long)src->o_mtime, (long)src->o_ctime);
+
+        if (valid & OBD_MD_FLATIME)
+                LTIME_S(dst->i_atime) = src->o_atime;
+        if (valid & OBD_MD_FLMTIME)
+                LTIME_S(dst->i_mtime) = src->o_mtime;
+        if (valid & OBD_MD_FLCTIME && src->o_ctime > LTIME_S(dst->i_ctime))
+                LTIME_S(dst->i_ctime) = src->o_ctime;
+        if (valid & OBD_MD_FLSIZE)
+                dst->i_size = src->o_size;
+        if (valid & OBD_MD_FLBLOCKS) /* allocation of space */
+                dst->i_blocks = src->o_blocks;
+        if (valid & OBD_MD_FLBLKSZ)
+                dst->i_blksize = src->o_blksize;
+        if (valid & OBD_MD_FLTYPE)
+                dst->i_mode = (dst->i_mode & ~S_IFMT) | (src->o_mode & S_IFMT);
+        if (valid & OBD_MD_FLMODE)
+                dst->i_mode = (dst->i_mode & S_IFMT) | (src->o_mode & ~S_IFMT);
+        if (valid & OBD_MD_FLUID)
+                dst->i_uid = src->o_uid;
+        if (valid & OBD_MD_FLGID)
+                dst->i_gid = src->o_gid;
+        if (valid & OBD_MD_FLFLAGS)
+                dst->i_flags = src->o_flags;
+        if (valid & OBD_MD_FLNLINK)
+                dst->i_nlink = src->o_nlink;
+        if (valid & OBD_MD_FLGENER)
+                dst->i_generation = src->o_generation;
+        if (valid & OBD_MD_FLRDEV)
+                dst->i_rdev = to_kdev_t(src->o_rdev);
+}
+EXPORT_SYMBOL(obdo_to_inode);
+#endif
+
+void obdo_cpy_md(struct obdo *dst, struct obdo *src, obd_flag valid)
+{
+#ifdef __KERNEL__
+        CDEBUG(D_INODE, "src obdo "LPX64" valid 0x%x, dst obdo "LPX64"\n",
+               src->o_id, src->o_valid, dst->o_id);
+#endif
+        if (valid & OBD_MD_FLATIME)
+                dst->o_atime = src->o_atime;
+        if (valid & OBD_MD_FLMTIME)
+                dst->o_mtime = src->o_mtime;
+        if (valid & OBD_MD_FLCTIME)
+                dst->o_ctime = src->o_ctime;
+        if (valid & OBD_MD_FLSIZE)
+                dst->o_size = src->o_size;
+        if (valid & OBD_MD_FLBLOCKS) /* allocation of space */
+                dst->o_blocks = src->o_blocks;
+        if (valid & OBD_MD_FLBLKSZ)
+                dst->o_blksize = src->o_blksize;
+        if (valid & OBD_MD_FLTYPE)
+                dst->o_mode = (dst->o_mode & ~S_IFMT) | (src->o_mode & S_IFMT);
+        if (valid & OBD_MD_FLMODE)
+                dst->o_mode = (dst->o_mode & S_IFMT) | (src->o_mode & ~S_IFMT);
+        if (valid & OBD_MD_FLUID)
+                dst->o_uid = src->o_uid;
+        if (valid & OBD_MD_FLGID)
+                dst->o_gid = src->o_gid;
+        if (valid & OBD_MD_FLFLAGS)
+                dst->o_flags = src->o_flags;
+        /*
+        if (valid & OBD_MD_FLOBDFLG)
+                dst->o_obdflags = src->o_obdflags;
+        */
+        if (valid & OBD_MD_FLNLINK)
+                dst->o_nlink = src->o_nlink;
+        if (valid & OBD_MD_FLGENER)
+                dst->o_generation = src->o_generation;
+        if (valid & OBD_MD_FLRDEV)
+                dst->o_rdev = src->o_rdev;
+        if (valid & OBD_MD_FLINLINE &&
+             src->o_obdflags & OBD_FL_INLINEDATA) {
+                memcpy(dst->o_inline, src->o_inline, sizeof(src->o_inline));
+                dst->o_obdflags |= OBD_FL_INLINEDATA;
+        }
+
+        dst->o_valid |= valid;
+}
+EXPORT_SYMBOL(obdo_cpy_md);
+
+/* returns FALSE if comparison (by flags) is same, TRUE if changed */
+int obdo_cmp_md(struct obdo *dst, struct obdo *src, obd_flag compare)
+{
+        int res = 0;
+
+        if ( compare & OBD_MD_FLATIME )
+                res = (res || (dst->o_atime != src->o_atime));
+        if ( compare & OBD_MD_FLMTIME )
+                res = (res || (dst->o_mtime != src->o_mtime));
+        if ( compare & OBD_MD_FLCTIME )
+                res = (res || (dst->o_ctime != src->o_ctime));
+        if ( compare & OBD_MD_FLSIZE )
+                res = (res || (dst->o_size != src->o_size));
+        if ( compare & OBD_MD_FLBLOCKS ) /* allocation of space */
+                res = (res || (dst->o_blocks != src->o_blocks));
+        if ( compare & OBD_MD_FLBLKSZ )
+                res = (res || (dst->o_blksize != src->o_blksize));
+        if ( compare & OBD_MD_FLTYPE )
+                res = (res || (((dst->o_mode ^ src->o_mode) & S_IFMT) != 0));
+        if ( compare & OBD_MD_FLMODE )
+                res = (res || (((dst->o_mode ^ src->o_mode) & ~S_IFMT) != 0));
+        if ( compare & OBD_MD_FLUID )
+                res = (res || (dst->o_uid != src->o_uid));
+        if ( compare & OBD_MD_FLGID )
+                res = (res || (dst->o_gid != src->o_gid));
+        if ( compare & OBD_MD_FLFLAGS )
+                res = (res || (dst->o_flags != src->o_flags));
+        if ( compare & OBD_MD_FLNLINK )
+                res = (res || (dst->o_nlink != src->o_nlink));
+        if ( compare & OBD_MD_FLGENER )
+                res = (res || (dst->o_generation != src->o_generation));
+        /* XXX Don't know if thses should be included here - wasn't previously
+        if ( compare & OBD_MD_FLINLINE )
+                res = (res || memcmp(dst->o_inline, src->o_inline));
+        */
+        return res;
+}
+EXPORT_SYMBOL(obdo_cmp_md);
diff --git a/lustre/obdclass/recov_log.c b/lustre/obdclass/recov_log.c
new file mode 100644
index 0000000000..bff90f3f5c
--- /dev/null
+++ b/lustre/obdclass/recov_log.c
@@ -0,0 +1,470 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ *  Copyright (C) 2001-2003 Cluster File Systems, Inc.
+ *   Author: Andreas Dilger <adilger@clusterfs.com>
+ *
+ *   This file is part of Lustre, http://www.lustre.org.
+ *
+ *   Lustre 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.
+ *
+ *   Lustre 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 Lustre; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * OST<->MDS recovery logging infrastructure.
+ *
+ * Invariants in implementation:
+ * - we do not share logs among different OST<->MDS connections, so that
+ *   if an OST or MDS fails it need only look at log(s) relevant to itself
+ */
+
+#define DEBUG_SUBSYSTEM S_LOG
+
+#ifndef EXPORT_SYMTAB
+#define EXPORT_SYMTAB
+#endif
+
+#include <linux/fs.h>
+#include <linux/obd_class.h>
+#include <linux/lustre_log.h>
+#include <portals/list.h>
+
+/* Allocate a new log or catalog handle */
+struct llog_handle *llog_alloc_handle(void)
+{
+        struct llog_handle *loghandle;
+        ENTRY;
+
+        OBD_ALLOC(loghandle, sizeof(*loghandle));
+        if (loghandle == NULL)
+                RETURN(ERR_PTR(-ENOMEM));
+
+        OBD_ALLOC(loghandle->lgh_hdr, LLOG_CHUNK_SIZE);
+        if (loghandle->lgh_hdr == NULL) {
+                OBD_FREE(loghandle, sizeof(*loghandle));
+                RETURN(ERR_PTR(-ENOMEM));
+        }
+
+        INIT_LIST_HEAD(&loghandle->lgh_list);
+        sema_init(&loghandle->lgh_lock, 1);
+
+        RETURN(loghandle);
+}
+EXPORT_SYMBOL(llog_alloc_handle);
+
+void llog_free_handle(struct llog_handle *loghandle)
+{
+        if (!loghandle)
+                return;
+
+        list_del_init(&loghandle->lgh_list);
+        OBD_FREE(loghandle->lgh_hdr, LLOG_CHUNK_SIZE);
+        OBD_FREE(loghandle, sizeof(*loghandle));
+}
+EXPORT_SYMBOL(llog_free_handle);
+
+/* Create a new log handle and add it to the open list.
+ * This log handle will be closed when all of the records in it are removed.
+ *
+ * Assumes caller has already pushed us into the kernel context and is locking.
+ */
+struct llog_handle *llog_new_log(struct llog_handle *cathandle,
+                                 struct obd_uuid *tgtuuid)
+{
+        struct llog_handle *loghandle;
+        struct llog_object_hdr *llh;
+        loff_t offset;
+        int rc, index, bitmap_size, i;
+        ENTRY;
+
+        LASSERT(sizeof(*llh) == LLOG_CHUNK_SIZE);
+
+        loghandle = cathandle->lgh_log_create(cathandle->lgh_obd);
+        if (IS_ERR(loghandle))
+                RETURN(loghandle);
+
+        llh = loghandle->lgh_hdr;
+        llh->llh_hdr.lth_type = LLOG_OBJECT_MAGIC;
+        llh->llh_hdr.lth_len = llh->llh_hdr_end_len = sizeof(*llh);
+        llh->llh_timestamp = LTIME_S(CURRENT_TIME);
+        llh->llh_bitmap_offset = offsetof(typeof(*llh), llh_bitmap);
+        memcpy(&llh->llh_tgtuuid, tgtuuid, sizeof(llh->llh_tgtuuid));
+        loghandle->lgh_tgtuuid = &llh->llh_tgtuuid;
+
+        llh = cathandle->lgh_hdr;
+        bitmap_size = sizeof(llh->llh_bitmap) * 8;
+        /* This should basically always find the first entry free */
+        for (i = 0, index = llh->llh_count; i < bitmap_size; i++, index++) {
+                index %= bitmap_size;
+                if (ext2_set_bit(index, llh->llh_bitmap)) {
+                        /* XXX This should trigger log clean up or similar */
+                        CERROR("catalog index %d is still in use\n", index);
+                } else {
+                        llh->llh_count = (index + 1) % bitmap_size;
+                        break;
+                }
+        }
+        if (i == bitmap_size)
+                CERROR("no free catalog slots for log...\n");
+
+        CDEBUG(D_HA, "new recovery log "LPX64":%x catalog index %u\n",
+               loghandle->lgh_cookie.lgc_lgl.lgl_oid,
+               loghandle->lgh_cookie.lgc_lgl.lgl_ogen, index);
+        loghandle->lgh_cookie.lgc_index = index;
+
+        offset = sizeof(*llh) + index * sizeof(loghandle->lgh_cookie);
+
+        /* XXX Hmm, what to do if the catalog update fails?  Under normal
+         *     operations we would clean this handle up anyways, and at
+         *     worst we leak some objects, but there is little point in
+         *     doing the logging in that case...
+         *
+         *     We don't want to mark a catalog in-use if it wasn't written.
+         *     The only danger is if the OST crashes - the log is lost.
+         */
+        rc = lustre_fwrite(cathandle->lgh_file, &loghandle->lgh_cookie,
+                           sizeof(loghandle->lgh_cookie), &offset);
+        if (rc != sizeof(loghandle->lgh_cookie)) {
+                CERROR("error adding log "LPX64" to catalog: rc %d\n",
+                       loghandle->lgh_cookie.lgc_lgl.lgl_oid, rc);
+                rc = rc < 0 ? : -ENOSPC;
+        } else {
+                offset = 0;
+                rc = lustre_fwrite(cathandle->lgh_file, llh, sizeof(*llh),
+                                   &offset);
+                if (rc != sizeof(*llh)) {
+                        CERROR("error marking catalog entry %d in use: rc %d\n",
+                               index, rc);
+                        rc = rc < 0 ? : -ENOSPC;
+                }
+        }
+        cathandle->lgh_current = loghandle;
+        list_add_tail(&loghandle->lgh_list, &cathandle->lgh_list);
+
+        RETURN(loghandle);
+}
+EXPORT_SYMBOL(llog_new_log);
+
+/* Assumes caller has already pushed us into the kernel context. */
+int llog_init_catalog(struct llog_handle *cathandle, struct obd_uuid *tgtuuid)
+{
+        struct llog_object_hdr *llh;
+        loff_t offset = 0;
+        int rc = 0;
+        ENTRY;
+
+        LASSERT(sizeof(*llh) == LLOG_CHUNK_SIZE);
+
+        down(&cathandle->lgh_lock);
+        llh = cathandle->lgh_hdr;
+
+        if (cathandle->lgh_file->f_dentry->d_inode->i_size == 0) {
+write_hdr:      llh->llh_hdr.lth_type = LLOG_CATALOG_MAGIC;
+                llh->llh_hdr.lth_len = llh->llh_hdr_end_len = LLOG_CHUNK_SIZE;
+                llh->llh_timestamp = LTIME_S(CURRENT_TIME);
+                llh->llh_bitmap_offset = offsetof(typeof(*llh), llh_bitmap);
+                memcpy(&llh->llh_tgtuuid, tgtuuid, sizeof(llh->llh_tgtuuid));
+                rc = lustre_fwrite(cathandle->lgh_file, llh, LLOG_CHUNK_SIZE,
+                                   &offset);
+                if (rc != LLOG_CHUNK_SIZE) {
+                        CERROR("error writing catalog header: rc %d\n", rc);
+                        OBD_FREE(llh, sizeof(*llh));
+                        if (rc >= 0)
+                                rc = -ENOSPC;
+                } else
+                        rc = 0;
+        } else {
+                rc = lustre_fread(cathandle->lgh_file, llh, LLOG_CHUNK_SIZE,
+                                  &offset);
+                if (rc != LLOG_CHUNK_SIZE) {
+                        CERROR("error reading catalog header: rc %d\n", rc);
+                        /* Can we do much else if the header is bad? */
+                        goto write_hdr;
+                } else
+                        rc = 0;
+        }
+
+        cathandle->lgh_tgtuuid = &llh->llh_tgtuuid;
+        up(&cathandle->lgh_lock);
+        RETURN(rc);
+}
+EXPORT_SYMBOL(llog_init_catalog);
+
+/* Return the currently active log handle.  If the current log handle doesn't
+ * have enough space left for the current record, start a new one.
+ *
+ * If reclen is 0, we only want to know what the currently active log is,
+ * otherwise we get a lock on this log so nobody can steal our space.
+ *
+ * Assumes caller has already pushed us into the kernel context and is locking.
+ */
+static struct llog_handle *llog_current_log(struct llog_handle *cathandle,
+                                            int reclen)
+{
+        struct llog_handle *loghandle = NULL;
+        ENTRY;
+
+        loghandle = cathandle->lgh_current;
+        if (loghandle) {
+                struct llog_object_hdr *llh = loghandle->lgh_hdr;
+                if (llh->llh_count < sizeof(llh->llh_bitmap) * 8)
+                        RETURN(loghandle);
+        }
+
+        if (reclen)
+                loghandle = llog_new_log(cathandle, cathandle->lgh_tgtuuid);
+        RETURN(loghandle);
+}
+
+/* Add a single record to the recovery log(s).
+ * Returns number of bytes in returned logcookies, or negative error code.
+ *
+ * Assumes caller has already pushed us into the kernel context.
+ */
+int llog_add_record(struct llog_handle *cathandle, struct llog_trans_hdr *rec,
+                    struct llog_cookie *logcookies)
+{
+        struct llog_handle *loghandle;
+        struct llog_object_hdr *llh;
+        int reclen = rec->lth_len;
+        struct file *file;
+        loff_t offset;
+        size_t left;
+        int index;
+        int rc;
+        ENTRY;
+
+        LASSERT(rec->lth_len <= LLOG_CHUNK_SIZE);
+        down(&cathandle->lgh_lock);
+        loghandle = llog_current_log(cathandle, reclen);
+        if (IS_ERR(loghandle)) {
+                up(&cathandle->lgh_lock);
+                RETURN(PTR_ERR(loghandle));
+        }
+        down(&loghandle->lgh_lock);
+        up(&cathandle->lgh_lock);
+
+        llh = loghandle->lgh_hdr;
+        file = loghandle->lgh_file;
+
+        /* Make sure that records don't cross a chunk boundary, so we can
+         * process them page-at-a-time if needed.  If it will cross a chunk
+         * boundary, write in a fake (but referenced) entry to pad the chunk.
+         *
+         * We know that llog_current_log() will return a loghandle that is
+         * big enough to hold reclen, so all we care about is padding here.
+         */
+        left = LLOG_CHUNK_SIZE - (file->f_pos & (LLOG_CHUNK_SIZE - 1));
+        if (left != 0 && left != reclen && left < reclen + LLOG_MIN_REC_SIZE) {
+                struct llog_null_trans {
+                        struct llog_trans_hdr hdr;
+                        __u32 padding[6];
+                } pad = { .hdr = { .lth_len = left } };
+
+                LASSERT(left >= LLOG_MIN_REC_SIZE);
+                if (left <= sizeof(pad))
+                        *(__u32 *)((char *)&pad + left - sizeof(__u32)) = left;
+
+                rc = lustre_fwrite(loghandle->lgh_file, &pad,
+                                   min(sizeof(pad), left),
+                                   &loghandle->lgh_file->f_pos);
+                if (rc != min(sizeof(pad), left)) {
+                        CERROR("error writing padding record: rc %d\n", rc);
+                        GOTO(out, rc = rc < 0 ? rc : -EIO);
+                }
+
+                left -= rc;
+                if (left) {
+                        LASSERT(left >= sizeof(__u32));
+                        loghandle->lgh_file->f_pos += left - sizeof(__u32);
+                        rc = lustre_fwrite(loghandle->lgh_file, &pad,
+                                           sizeof(__u32),
+                                           &loghandle->lgh_file->f_pos);
+                        if (rc != sizeof(__u32)) {
+                                CERROR("error writing padding end: rc %d\n",
+                                       rc);
+                                GOTO(out, rc < 0 ? rc : -ENOSPC);
+                        }
+                }
+
+                loghandle->lgh_index++;
+        }
+
+        index = loghandle->lgh_index++;
+        if (ext2_set_bit(index, llh->llh_bitmap)) {
+                CERROR("argh, index %u already set in log bitmap?\n", index);
+                LBUG(); /* should never happen */
+        }
+        llh->llh_count++;
+
+        offset = 0;
+        rc = lustre_fwrite(loghandle->lgh_file, llh, sizeof(*llh), &offset);
+        if (rc != sizeof(*llh)) {
+                CERROR("error writing log header: rc %d\n", rc);
+                GOTO(out, rc < 0 ? rc : -EIO);
+        }
+
+        rc = lustre_fwrite(loghandle->lgh_file, rec, reclen,
+                           &loghandle->lgh_file->f_pos);
+        if (rc != reclen) {
+                CERROR("error writing log record: rc %d\n", rc);
+                GOTO(out, rc < 0 ? rc : -ENOSPC);
+        }
+
+        CDEBUG(D_HA, "added record "LPX64":%x+%u, %u bytes\n",
+               loghandle->lgh_cookie.lgc_lgl.lgl_oid,
+               loghandle->lgh_cookie.lgc_lgl.lgl_ogen, index, rec->lth_len);
+        *logcookies = loghandle->lgh_cookie;
+        logcookies->lgc_index = index;
+
+        rc = 0;
+out:
+        up(&loghandle->lgh_lock);
+        RETURN(rc);
+}
+EXPORT_SYMBOL(llog_add_record);
+
+/* Remove a log entry from the catalog.
+ * Assumes caller has already pushed us into the kernel context and is locking.
+ */
+int llog_delete_log(struct llog_handle *cathandle,struct llog_handle *loghandle)
+{
+        struct llog_cookie *lgc = &loghandle->lgh_cookie;
+        int catindex = lgc->lgc_index;
+        struct llog_object_hdr *llh = cathandle->lgh_hdr;
+        loff_t offset = 0;
+        int rc = 0;
+        ENTRY;
+
+        CDEBUG(D_HA, "log "LPX64":%x empty, closing\n",
+               lgc->lgc_lgl.lgl_oid, lgc->lgc_lgl.lgl_ogen);
+
+        if (ext2_clear_bit(catindex, llh->llh_bitmap)) {
+                CERROR("catalog index %u already clear?\n", catindex);
+                LBUG();
+        } else {
+                rc = lustre_fwrite(cathandle->lgh_file, llh, sizeof(*llh),
+                                   &offset);
+
+                if (rc != sizeof(*llh)) {
+                        CERROR("log %u cancel error: rc %d\n", catindex, rc);
+                        if (rc >= 0)
+                                rc = -EIO;
+                } else
+                        rc = 0;
+        }
+        RETURN(rc);
+}
+EXPORT_SYMBOL(llog_delete_log);
+
+/* Assumes caller has already pushed us into the kernel context and is locking.
+ * We return a lock on the handle to ensure nobody yanks it from us.
+ */
+static struct llog_handle *llog_id2handle(struct llog_handle *cathandle,
+                                          struct llog_cookie *logcookie)
+{
+        struct llog_handle *loghandle;
+        struct llog_logid *lgl = &logcookie->lgc_lgl;
+        ENTRY;
+
+        if (cathandle == NULL)
+                RETURN(ERR_PTR(-EBADF));
+
+        list_for_each_entry(loghandle, &cathandle->lgh_list, lgh_list) {
+                struct llog_logid *cgl = &loghandle->lgh_cookie.lgc_lgl;
+                if (cgl->lgl_oid == lgl->lgl_oid) {
+                        if (cgl->lgl_ogen != lgl->lgl_ogen) {
+                                CERROR("log "LPX64" generation %x != %x\n",
+                                       lgl->lgl_oid, cgl->lgl_ogen,
+                                       lgl->lgl_ogen);
+                                continue;
+                        }
+                        GOTO(out, loghandle);
+                }
+        }
+
+        loghandle = cathandle->lgh_log_open(cathandle->lgh_obd, logcookie);
+        if (IS_ERR(loghandle)) {
+                CERROR("error opening log id "LPX64":%x: rc %d\n",
+                       lgl->lgl_oid, lgl->lgl_ogen, (int)PTR_ERR(loghandle));
+        } else {
+                list_add(&loghandle->lgh_list, &cathandle->lgh_list);
+        }
+
+out:
+        RETURN(loghandle);
+}
+
+/* For each cookie in the cookie array, we clear the log in-use bit and either:
+ * - the log is empty, so mark it free in the catalog header and delete it
+ * - the log is not empty, just write out the log header
+ *
+ * The cookies may be in different log files, so we need to get new logs
+ * each time.
+ *
+ * Assumes caller has already pushed us into the kernel context.
+ */
+int llog_cancel_records(struct llog_handle *cathandle, int count,
+                        struct llog_cookie *cookies)
+{
+        int i, rc = 0;
+        ENTRY;
+
+        down(&cathandle->lgh_lock);
+        for (i = 0; i < count; i++, cookies++) {
+                struct llog_handle *loghandle;
+                struct llog_object_hdr *llh;
+                struct llog_logid *lgl = &cookies->lgc_lgl;
+
+                loghandle = llog_id2handle(cathandle, cookies);
+                if (IS_ERR(loghandle)) {
+                        if (!rc)
+                                rc = PTR_ERR(loghandle);
+                        continue;
+                }
+
+                down(&loghandle->lgh_lock);
+                llh = loghandle->lgh_hdr;
+                CDEBUG(D_HA, "cancelling "LPX64" index %u: %u\n",
+                       lgl->lgl_oid, cookies->lgc_index,
+                       ext2_test_bit(cookies->lgc_index, llh->llh_bitmap));
+                if (!ext2_clear_bit(cookies->lgc_index, llh->llh_bitmap)) {
+                        CERROR("log index %u in "LPX64":%x already clear?\n",
+                               cookies->lgc_index, lgl->lgl_oid, lgl->lgl_ogen);
+                } else if (--llh->llh_count == 0 &&
+                           loghandle != llog_current_log(cathandle, 0)) {
+                        loghandle->lgh_log_close(cathandle, loghandle);
+                } else {
+                        loff_t offset = 0;
+                        int ret = lustre_fwrite(loghandle->lgh_file, llh,
+                                                sizeof(*llh), &offset);
+
+                        if (ret != sizeof(*llh)) {
+                                CERROR("error cancelling index %u: rc %d\n",
+                                       cookies->lgc_index, ret);
+                                /* XXX mark handle bad? */
+                                if (!rc)
+                                        rc = ret;
+                        }
+                }
+                up(&loghandle->lgh_lock);
+        }
+        up(&cathandle->lgh_lock);
+
+        RETURN(rc);
+}
+EXPORT_SYMBOL(llog_cancel_records);
+
+int llog_close_log(struct llog_handle *cathandle, struct llog_handle *loghandle)
+{
+        return loghandle->lgh_log_close(cathandle, loghandle);
+}
+EXPORT_SYMBOL(llog_close_log);
diff --git a/lustre/obdfilter/filter_internal.h b/lustre/obdfilter/filter_internal.h
new file mode 100644
index 0000000000..4207056b7d
--- /dev/null
+++ b/lustre/obdfilter/filter_internal.h
@@ -0,0 +1,152 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ * Copyright (C) 2003 Cluster File Systems, Inc.
+ *
+ * This code is issued under the GNU General Public License.
+ * See the file COPYING in this distribution
+ */
+
+#ifndef _FILTER_INTERNAL_H
+#define _FILTER_INTERNAL_H
+
+#ifdef __KERNEL__
+# include <linux/spinlock.h>
+#endif
+#include <linux/lustre_handles.h>
+#include <linux/obd.h>
+
+#ifndef OBD_FILTER_DEVICENAME
+# define OBD_FILTER_DEVICENAME "obdfilter"
+#endif
+
+#ifndef OBD_FILTER_SAN_DEVICENAME
+# define OBD_FILTER_SAN_DEVICENAME "sanobdfilter"
+#endif
+
+#define LAST_RCVD "last_rcvd"
+#define FILTER_INIT_OBJID 2
+/* max creates/sec * journal->j_commit_interval */
+#define FILTER_SKIP_OBJID (10000 * 5)
+
+#define FILTER_LR_SERVER_SIZE    512
+
+#define FILTER_LR_CLIENT_START   8192
+#define FILTER_LR_CLIENT_SIZE    128
+
+/* This limit is arbitrary, but for now we fit it in 1 page (32k clients) */
+#define FILTER_LR_MAX_CLIENTS (PAGE_SIZE * 8)
+#define FILTER_LR_MAX_CLIENT_WORDS (FILTER_LR_MAX_CLIENTS/sizeof(unsigned long))
+
+#define FILTER_SUBDIR_COUNT      32            /* set to zero for no subdirs */
+
+#define FILTER_MOUNT_RECOV 2
+#define FILTER_RECOVERY_TIMEOUT (obd_timeout * 5 * HZ / 2) /* *waves hands* */
+
+/* Data stored per server at the head of the last_rcvd file.  In le32 order. */
+struct filter_server_data {
+        __u8  fsd_uuid[37];        /* server UUID */
+        __u8  fsd_uuid_padding[3]; /* unused */
+        __u64 fsd_last_objid;      /* last created object ID */
+        __u64 fsd_last_transno;    /* last completed transaction ID */
+        __u64 fsd_mount_count;     /* FILTER incarnation number */
+        __u32 fsd_feature_compat;  /* compatible feature flags */
+        __u32 fsd_feature_rocompat;/* read-only compatible feature flags */
+        __u32 fsd_feature_incompat;/* incompatible feature flags */
+        __u32 fsd_server_size;     /* size of server data area */
+        __u32 fsd_client_start;    /* start of per-client data area */
+        __u16 fsd_client_size;     /* size of per-client data area */
+        __u16 fsd_subdir_count;    /* number of subdirectories for objects */
+        __u64 fsd_catalog_oid;     /* recovery catalog object id */
+        __u32 fsd_catalog_ogen;    /* recovery catalog inode generation */
+        __u8  fsd_peeruuid[37];    /* UUID of MDS associated with this OST */
+        __u8  peer_padding[3];     /* unused */
+        __u8  fsd_padding[FILTER_LR_SERVER_SIZE - 140];
+};
+
+/* Data stored per client in the last_rcvd file.  In le32 order. */
+struct filter_client_data {
+        __u8  fcd_uuid[37];        /* client UUID */
+        __u8  fcd_uuid_padding[3]; /* unused */
+        __u64 fcd_last_rcvd;       /* last completed transaction ID */
+        __u64 fcd_mount_count;     /* FILTER incarnation number */
+        __u64 fcd_last_xid;        /* client RPC xid for the last transaction */
+        __u8  fcd_padding[FILTER_LR_CLIENT_SIZE - 64];
+};
+
+/* file data for open files on OST */
+struct filter_file_data {
+        struct portals_handle ffd_handle;
+        atomic_t              ffd_refcount;
+        struct list_head      ffd_export_list; /* export open list - fed_lock */
+        struct file          *ffd_file;         /* file handle */
+};
+
+struct filter_dentry_data {
+        struct llog_cookie      fdd_cookie;
+        obd_id                  fdd_objid;
+        __u32                   fdd_magic;
+        atomic_t                fdd_open_count;
+        int                     fdd_flags;
+};
+
+#define FILTER_DENTRY_MAGIC 0x9efba101
+#define FILTER_FLAG_DESTROY 0x0001      /* destroy dentry on last file close */
+
+/* Limit the returned fields marked valid to those that we actually might set */
+#define FILTER_VALID_FLAGS (OBD_MD_FLTYPE | OBD_MD_FLMODE | OBD_MD_FLGENER  |\
+                            OBD_MD_FLSIZE | OBD_MD_FLBLOCKS | OBD_MD_FLBLKSZ|\
+                            OBD_MD_FLATIME | OBD_MD_FLMTIME | OBD_MD_FLCTIME)
+
+enum {
+        LPROC_FILTER_READ_BYTES = 0,
+        LPROC_FILTER_WRITE_BYTES = 1,
+        LPROC_FILTER_LAST,
+};
+
+/* filter.c */
+struct dentry *filter_parent(struct obd_device *, obd_mode mode, obd_id objid);
+struct dentry *filter_parent_lock(struct obd_device *, obd_mode mode,
+                                  obd_id objid, ldlm_mode_t lock_mode,
+                                  struct lustre_handle *lockh);
+void f_dput(struct dentry *);
+struct dentry *filter_fid2dentry(struct obd_device *, struct dentry *dir,
+                                 obd_mode mode, obd_id id);
+struct dentry *__filter_oa2dentry(struct obd_device *obd, struct obdo *oa,
+                                  const char *what);
+#define filter_oa2dentry(obd, oa) __filter_oa2dentry(obd, oa, __FUNCTION__)
+
+int filter_finish_transno(struct obd_export *, struct obd_trans_info *, int rc);
+__u64 filter_next_id(struct filter_obd *);
+int filter_update_server_data(struct obd_device *, struct file *,
+                              struct filter_server_data *);
+int filter_common_setup(struct obd_device *, obd_count len, void *buf,
+                        char *option);
+
+/* filter_io.c */
+int filter_preprw(int cmd, struct obd_export *, struct obdo *, int objcount,
+                  struct obd_ioobj *, int niocount, struct niobuf_remote *,
+                  struct niobuf_local *, struct obd_trans_info *);
+int filter_commitrw(int cmd, struct obd_export *, struct obdo *, int objcount,
+                    struct obd_ioobj *, int niocount, struct niobuf_local *,
+                    struct obd_trans_info *);
+int filter_brw(int cmd, struct lustre_handle *, struct obdo *,
+	       struct lov_stripe_md *, obd_count oa_bufs, struct brw_page *,
+	       struct obd_trans_info *);
+
+/* filter_log.c */
+int filter_log_cancel(struct lustre_handle *, struct lov_stripe_md *,
+                      int num_cookies, struct llog_cookie *, int flags);
+int filter_log_op_create(struct llog_handle *cathandle, struct ll_fid *mds_fid,
+                         obd_id oid, obd_count ogen, struct llog_cookie *);
+int filter_log_op_orphan(struct llog_handle *cathandle, obd_id oid,
+                         obd_count ogen, struct llog_cookie *);
+struct llog_handle *filter_get_catalog(struct obd_device *);
+void filter_put_catalog(struct llog_handle *cathandle);
+
+/* filter_san.c */
+int filter_san_setup(struct obd_device *obd, obd_count len, void *buf);
+int filter_san_preprw(int cmd, struct obd_export *, struct obdo *, int objcount,
+                      struct obd_ioobj *, int niocount, struct niobuf_remote *);
+
+#endif
diff --git a/lustre/obdfilter/filter_io.c b/lustre/obdfilter/filter_io.c
new file mode 100644
index 0000000000..1526295938
--- /dev/null
+++ b/lustre/obdfilter/filter_io.c
@@ -0,0 +1,806 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ *  linux/fs/obdfilter/filter_io.c
+ *
+ *  Copyright (c) 2001-2003 Cluster File Systems, Inc.
+ *   Author: Peter Braam <braam@clusterfs.com>
+ *   Author: Andreas Dilger <adilger@clusterfs.com>
+ *   Author: Phil Schwan <phil@clusterfs.com>
+ *
+ *   This file is part of Lustre, http://www.lustre.org.
+ *
+ *   Lustre 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.
+ *
+ *   Lustre 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 Lustre; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define DEBUG_SUBSYSTEM S_FILTER
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/pagemap.h> // XXX kill me soon
+#include <linux/version.h>
+
+#include <linux/obd_class.h>
+#include <linux/lustre_fsfilt.h>
+#include "filter_internal.h"
+
+static int filter_start_page_read(struct inode *inode, struct niobuf_local *lnb)
+{
+        struct address_space *mapping = inode->i_mapping;
+        struct page *page;
+        unsigned long index = lnb->offset >> PAGE_SHIFT;
+        int rc;
+
+        page = grab_cache_page(mapping, index); /* locked page */
+        if (IS_ERR(page))
+                return lnb->rc = PTR_ERR(page);
+
+        lnb->page = page;
+
+        if (inode->i_size < lnb->offset + lnb->len - 1)
+                lnb->rc = inode->i_size - lnb->offset;
+        else
+                lnb->rc = lnb->len;
+
+        if (PageUptodate(page)) {
+                unlock_page(page);
+                return 0;
+        }
+
+        rc = mapping->a_ops->readpage(NULL, page);
+        if (rc < 0) {
+                CERROR("page index %lu, rc = %d\n", index, rc);
+                lnb->page = NULL;
+                page_cache_release(page);
+                return lnb->rc = rc;
+        }
+
+        return 0;
+}
+
+static int filter_finish_page_read(struct niobuf_local *lnb)
+{
+        if (lnb->page == NULL)
+                return 0;
+
+        if (PageUptodate(lnb->page))
+                return 0;
+
+        wait_on_page(lnb->page);
+        if (!PageUptodate(lnb->page)) {
+                CERROR("page index %lu/offset "LPX64" not uptodate\n",
+                       lnb->page->index, lnb->offset);
+                GOTO(err_page, lnb->rc = -EIO);
+        }
+        if (PageError(lnb->page)) {
+                CERROR("page index %lu/offset "LPX64" has error\n",
+                       lnb->page->index, lnb->offset);
+                GOTO(err_page, lnb->rc = -EIO);
+        }
+
+        return 0;
+
+err_page:
+        page_cache_release(lnb->page);
+        lnb->page = NULL;
+        return lnb->rc;
+}
+
+static struct page *lustre_get_page_write(struct inode *inode,
+                                          unsigned long index)
+{
+        struct address_space *mapping = inode->i_mapping;
+        struct page *page;
+        int rc;
+
+        page = grab_cache_page(mapping, index); /* locked page */
+
+        if (!IS_ERR(page)) {
+                /* Note: Called with "O" and "PAGE_SIZE" this is essentially
+                 * a no-op for most filesystems, because we write the whole
+                 * page.  For partial-page I/O this will read in the page.
+                 */
+                rc = mapping->a_ops->prepare_write(NULL, page, 0, PAGE_SIZE);
+                if (rc) {
+                        CERROR("page index %lu, rc = %d\n", index, rc);
+                        if (rc != -ENOSPC)
+                                LBUG();
+                        GOTO(err_unlock, rc);
+                }
+                /* XXX not sure if we need this if we are overwriting page */
+                if (PageError(page)) {
+                        CERROR("error on page index %lu, rc = %d\n", index, rc);
+                        LBUG();
+                        GOTO(err_unlock, rc = -EIO);
+                }
+        }
+        return page;
+
+err_unlock:
+        unlock_page(page);
+        page_cache_release(page);
+        return ERR_PTR(rc);
+}
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+int wait_on_page_locked(struct page *page)
+{
+        waitfor_one_page(page);
+        return 0;
+}
+
+/* We should only change the file mtime (and not the ctime, like
+ * update_inode_times() in generic_file_write()) when we only change data. */
+static inline void inode_update_time(struct inode *inode, int ctime_too)
+{
+        time_t now = CURRENT_TIME;
+        if (inode->i_mtime == now && (!ctime_too || inode->i_ctime == now))
+                return;
+        inode->i_mtime = now;
+        if (ctime_too)
+                inode->i_ctime = now;
+        mark_inode_dirty_sync(inode);
+}
+#endif
+
+static int lustre_commit_write(struct niobuf_local *lnb)
+{
+        struct page *page = lnb->page;
+        unsigned from = lnb->offset & ~PAGE_MASK;
+        unsigned to = from + lnb->len;
+        struct inode *inode = page->mapping->host;
+        int err;
+
+        LASSERT(to <= PAGE_SIZE);
+        err = page->mapping->a_ops->commit_write(NULL, page, from, to);
+#warning 2.4 folks: wait_on_page_locked does NOT return its error here.
+        if (!err && IS_SYNC(inode))
+                wait_on_page_locked(page);
+        //SetPageUptodate(page); // the client commit_write will do this
+
+        SetPageReferenced(page);
+        unlock_page(page);
+        page_cache_release(page);
+        return err;
+}
+
+int filter_get_page_write(struct inode *inode, struct niobuf_local *lnb,
+                          int *pglocked)
+{
+        unsigned long index = lnb->offset >> PAGE_SHIFT;
+        struct address_space *mapping = inode->i_mapping;
+        struct page *page;
+        int rc;
+
+        //ASSERT_PAGE_INDEX(index, GOTO(err, rc = -EINVAL));
+        if (*pglocked)
+                page = grab_cache_page_nowait(mapping, index); /* locked page */
+        else
+                page = grab_cache_page(mapping, index); /* locked page */
+
+
+        /* This page is currently locked, so get a temporary page instead. */
+        if (page == NULL) {
+                CDEBUG(D_INFO, "ino %lu page %ld locked\n", inode->i_ino,index);
+                page = alloc_pages(GFP_KERNEL, 0); /* locked page */
+                if (page == NULL) {
+                        CERROR("no memory for a temp page\n");
+                        GOTO(err, rc = -ENOMEM);
+                }
+                page->index = index;
+                lnb->page = page;
+                lnb->flags |= N_LOCAL_TEMP_PAGE;
+        } else if (!IS_ERR(page)) {
+                (*pglocked)++;
+
+                rc = mapping->a_ops->prepare_write(NULL, page,
+                                                   lnb->offset & ~PAGE_MASK,
+                                                   lnb->len);
+                if (rc) {
+                        if (rc != -ENOSPC)
+                                CERROR("page index %lu, rc = %d\n", index, rc);
+                        GOTO(err_unlock, rc);
+                }
+                /* XXX not sure if we need this if we are overwriting page */
+                if (PageError(page)) {
+                        CERROR("error on page index %lu, rc = %d\n", index, rc);
+                        LBUG();
+                        GOTO(err_unlock, rc = -EIO);
+                }
+                lnb->page = page;
+        }
+
+        return 0;
+
+err_unlock:
+        unlock_page(page);
+        page_cache_release(page);
+err:
+        return lnb->rc = rc;
+}
+
+static int filter_preprw_read(int cmd, struct obd_export *exp, struct obdo *oa,
+                              int objcount, struct obd_ioobj *obj,
+                              int niocount, struct niobuf_remote *nb,
+                              struct niobuf_local *res,
+                              struct obd_trans_info *oti)
+{
+        struct obd_run_ctxt saved;
+        struct obd_ioobj *o;
+        struct niobuf_remote *rnb;
+        struct niobuf_local *lnb;
+        struct fsfilt_objinfo *fso;
+        struct dentry *dentry;
+        struct inode *inode;
+        int rc = 0, i, j, tot_bytes = 0;
+        unsigned long now = jiffies;
+        ENTRY;
+
+        /* We are currently not supporting multi-obj BRW_READ RPCS at all */
+        LASSERT(objcount == 1);
+
+        OBD_ALLOC(fso, objcount * sizeof(*fso));
+        if (fso == NULL)
+                RETURN(-ENOMEM);
+
+        memset(res, 0, niocount * sizeof(*res));
+
+        push_ctxt(&saved, &exp->exp_obd->u.filter.fo_ctxt, NULL);
+        for (i = 0, o = obj; i < objcount; i++, o++) {
+                struct filter_dentry_data *fdd;
+                LASSERT(o->ioo_bufcnt);
+
+                dentry = filter_oa2dentry(exp->exp_obd, oa);
+                if (IS_ERR(dentry))
+                        GOTO(out_objinfo, rc = PTR_ERR(dentry));
+
+                if (dentry->d_inode == NULL) {
+                        CERROR("trying to BRW to non-existent file "LPU64"\n",
+                               o->ioo_id);
+                        f_dput(dentry);
+                        GOTO(out_objinfo, rc = -ENOENT);
+                }
+
+                fso[i].fso_dentry = dentry;
+                fso[i].fso_bufcnt = o->ioo_bufcnt;
+
+                fdd = dentry->d_fsdata;
+                if (fdd == NULL || !atomic_read(&fdd->fdd_open_count))
+                        CDEBUG(D_PAGE, "I/O to unopened object "LPU64"\n",
+                               o->ioo_id);
+        }
+
+        if (time_after(jiffies, now + 15 * HZ))
+                CERROR("slow prep setup %lus\n", (jiffies - now) / HZ);
+
+        for (i = 0, o = obj, rnb = nb, lnb = res; i < objcount; i++, o++) {
+                dentry = fso[i].fso_dentry;
+                inode = dentry->d_inode;
+
+                for (j = 0; j < o->ioo_bufcnt; j++, rnb++, lnb++) {
+                        if (j == 0)
+                                lnb->dentry = dentry;
+                        else
+                                lnb->dentry = dget(dentry);
+
+                        lnb->offset = rnb->offset;
+                        lnb->len    = rnb->len;
+                        lnb->flags  = rnb->flags;
+                        lnb->start  = jiffies;
+
+                        if (inode->i_size <= rnb->offset) {
+                                /* If there's no more data, abort early.
+                                 * lnb->page == NULL and lnb->rc == 0, so it's
+                                 * easy to detect later. */
+                                f_dput(dentry);
+                                lnb->dentry = NULL;
+                                break;
+                        } else {
+                                rc = filter_start_page_read(inode, lnb);
+                        }
+
+                        if (rc) {
+                                CDEBUG(rc == -ENOSPC ? D_INODE : D_ERROR,
+                                       "page err %u@"LPU64" %u/%u %p: rc %d\n",
+                                       lnb->len, lnb->offset, j, o->ioo_bufcnt,
+                                       dentry, rc);
+                                f_dput(dentry);
+                                GOTO(out_pages, rc);
+                        }
+
+                        tot_bytes += lnb->rc;
+                        if (lnb->rc < lnb->len)
+                                break; /* short read */
+                }
+        }
+
+        if (time_after(jiffies, now + 15 * HZ))
+                CERROR("slow prep get page %lus\n", (jiffies - now) / HZ);
+
+        lprocfs_counter_add(exp->exp_obd->obd_stats, LPROC_FILTER_READ_BYTES,
+                            tot_bytes);
+        while (lnb-- > res) {
+                rc = filter_finish_page_read(lnb);
+                if (rc) {
+                        CERROR("error page %u@"LPU64" %u %p: rc %d\n", lnb->len,
+                               lnb->offset, (int)(lnb - res), lnb->dentry, rc);
+                        f_dput(lnb->dentry);
+                        GOTO(out_pages, rc);
+                }
+        }
+
+        if (time_after(jiffies, now + 15 * HZ))
+                CERROR("slow prep finish page %lus\n", (jiffies - now) / HZ);
+
+        EXIT;
+out:
+        OBD_FREE(fso, objcount * sizeof(*fso));
+        /* we saved the journal handle into oti->oti_handle instead */
+        current->journal_info = NULL;
+        pop_ctxt(&saved, &exp->exp_obd->u.filter.fo_ctxt, NULL);
+        return rc;
+
+out_pages:
+        while (lnb-- > res) {
+                page_cache_release(lnb->page);
+                f_dput(lnb->dentry);
+        }
+        goto out; /* dropped the dentry refs already (one per page) */
+
+out_objinfo:
+        for (i = 0; i < objcount && fso[i].fso_dentry; i++)
+                f_dput(fso[i].fso_dentry);
+        goto out;
+}
+
+/* We need to balance prepare_write() calls with commit_write() calls.
+ * If the page has been prepared, but we have no data for it, we don't
+ * want to overwrite valid data on disk, but we still need to zero out
+ * data for space which was newly allocated.  Like part of what happens
+ * in __block_prepare_write() for newly allocated blocks.
+ *
+ * XXX currently __block_prepare_write() creates buffers for all the
+ *     pages, and the filesystems mark these buffers as BH_New if they
+ *     were newly allocated from disk. We use the BH_New flag similarly. */
+static int filter_commit_write(struct niobuf_local *lnb, int err)
+{
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+        if (err) {
+                unsigned block_start, block_end;
+                struct buffer_head *bh, *head = lnb->page->buffers;
+                unsigned blocksize = head->b_size;
+
+                /* debugging: just seeing if this ever happens */
+                CDEBUG(err == -ENOSPC ? D_INODE : D_ERROR,
+                       "called for ino %lu:%lu on err %d\n",
+                       lnb->page->mapping->host->i_ino, lnb->page->index, err);
+
+                /* Currently one buffer per page, but in the future... */
+                for (bh = head, block_start = 0; bh != head || !block_start;
+                     block_start = block_end, bh = bh->b_this_page) {
+                        block_end = block_start + blocksize;
+                        if (buffer_new(bh)) {
+                                memset(kmap(lnb->page) + block_start, 0,
+                                       blocksize);
+                                kunmap(lnb->page);
+                        }
+                }
+        }
+#endif
+        return lustre_commit_write(lnb);
+}
+
+/* If we ever start to support multi-object BRW RPCs, we will need to get locks
+ * on mulitple inodes.  That isn't all, because there still exists the
+ * possibility of a truncate starting a new transaction while holding the ext3
+ * rwsem = write while some writes (which have started their transactions here)
+ * blocking on the ext3 rwsem = read => lock inversion.
+ *
+ * The handling gets very ugly when dealing with locked pages.  It may be easier
+ * to just get rid of the locked page code (which has problems of its own) and
+ * either discover we do not need it anymore (i.e. it was a symptom of another
+ * bug) or ensure we get the page locks in an appropriate order. */
+static int filter_preprw_write(int cmd, struct obd_export *exp, struct obdo *oa,
+                               int objcount, struct obd_ioobj *obj,
+                               int niocount, struct niobuf_remote *nb,
+                               struct niobuf_local *res,
+                               struct obd_trans_info *oti)
+{
+        struct obd_run_ctxt saved;
+        struct obd_ioobj *o;
+        struct niobuf_remote *rnb;
+        struct niobuf_local *lnb;
+        struct fsfilt_objinfo *fso;
+        struct dentry *dentry;
+        int pglocked = 0, rc = 0, i, j, tot_bytes = 0;
+        unsigned long now = jiffies;
+        ENTRY;
+        LASSERT(objcount == 1);
+
+        OBD_ALLOC(fso, objcount * sizeof(*fso));
+        if (fso == NULL)
+                RETURN(-ENOMEM);
+
+        memset(res, 0, niocount * sizeof(*res));
+
+        push_ctxt(&saved, &exp->exp_obd->u.filter.fo_ctxt, NULL);
+        for (i = 0, o = obj; i < objcount; i++, o++) {
+                struct filter_dentry_data *fdd;
+                LASSERT(o->ioo_bufcnt);
+
+                dentry = filter_oa2dentry(exp->exp_obd, oa);
+                if (IS_ERR(dentry))
+                        GOTO(out_objinfo, rc = PTR_ERR(dentry));
+
+                if (dentry->d_inode == NULL) {
+                        CERROR("trying to BRW to non-existent file "LPU64"\n",
+                               o->ioo_id);
+                        f_dput(dentry);
+                        GOTO(out_objinfo, rc = -ENOENT);
+                }
+
+                fso[i].fso_dentry = dentry;
+                fso[i].fso_bufcnt = o->ioo_bufcnt;
+
+                down(&dentry->d_inode->i_sem);
+                fdd = dentry->d_fsdata;
+                if (fdd == NULL || !atomic_read(&fdd->fdd_open_count))
+                        CDEBUG(D_PAGE, "I/O to unopened object "LPU64"\n",
+                               o->ioo_id);
+        }
+
+        if (time_after(jiffies, now + 15 * HZ))
+                CERROR("slow prep setup %lus\n", (jiffies - now) / HZ);
+
+        LASSERT(oti != NULL);
+        oti->oti_handle = fsfilt_brw_start(exp->exp_obd, objcount, fso,
+                                           niocount, oti);
+        if (IS_ERR(oti->oti_handle)) {
+                rc = PTR_ERR(oti->oti_handle);
+                CDEBUG(rc == -ENOSPC ? D_INODE : D_ERROR,
+                       "error starting transaction: rc = %d\n", rc);
+                oti->oti_handle = NULL;
+                GOTO(out_objinfo, rc);
+        }
+
+        for (i = 0, o = obj, rnb = nb, lnb = res; i < objcount; i++, o++) {
+                dentry = fso[i].fso_dentry;
+                for (j = 0; j < o->ioo_bufcnt; j++, rnb++, lnb++) {
+                        if (j == 0)
+                                lnb->dentry = dentry;
+                        else
+                                lnb->dentry = dget(dentry);
+
+                        lnb->offset = rnb->offset;
+                        lnb->len    = rnb->len;
+                        lnb->flags  = rnb->flags;
+                        lnb->start  = jiffies;
+
+                        rc = filter_get_page_write(dentry->d_inode, lnb,
+                                                   &pglocked);
+                        if (rc)
+                                up(&dentry->d_inode->i_sem);
+
+                        if (rc) {
+                                CDEBUG(rc == -ENOSPC ? D_INODE : D_ERROR,
+                                       "page err %u@"LPU64" %u/%u %p: rc %d\n",
+                                       lnb->len, lnb->offset, j, o->ioo_bufcnt,
+                                       dentry, rc);
+                                f_dput(dentry);
+                                GOTO(out_pages, rc);
+                        }
+                        tot_bytes += lnb->len;
+                }
+        }
+
+        if (time_after(jiffies, now + 15 * HZ))
+                CERROR("slow prep get page %lus\n", (jiffies - now) / HZ);
+
+        lprocfs_counter_add(exp->exp_obd->obd_stats, LPROC_FILTER_WRITE_BYTES,
+                            tot_bytes);
+
+        EXIT;
+out:
+        OBD_FREE(fso, objcount * sizeof(*fso));
+        /* we saved the journal handle into oti->oti_handle instead */
+        current->journal_info = NULL;
+        pop_ctxt(&saved, &exp->exp_obd->u.filter.fo_ctxt, NULL);
+        return rc;
+
+out_pages:
+        while (lnb-- > res) {
+                filter_commit_write(lnb, rc);
+                up(&lnb->dentry->d_inode->i_sem);
+                f_dput(lnb->dentry);
+        }
+        filter_finish_transno(exp, oti, rc);
+        fsfilt_commit(exp->exp_obd,
+                      filter_parent(exp->exp_obd,S_IFREG,obj->ioo_id)->d_inode,
+                      oti->oti_handle, 0);
+        goto out; /* dropped the dentry refs already (one per page) */
+
+out_objinfo:
+        for (i = 0; i < objcount && fso[i].fso_dentry; i++) {
+                up(&fso[i].fso_dentry->d_inode->i_sem);
+                f_dput(fso[i].fso_dentry);
+        }
+        goto out;
+}
+
+int filter_preprw(int cmd, struct obd_export *exp, struct obdo *oa,
+                  int objcount, struct obd_ioobj *obj, int niocount,
+                  struct niobuf_remote *nb, struct niobuf_local *res,
+                  struct obd_trans_info *oti)
+{
+        if (cmd == OBD_BRW_WRITE)
+                return filter_preprw_write(cmd, exp, oa, objcount, obj,
+                                           niocount, nb, res, oti);
+
+        if (cmd == OBD_BRW_READ)
+                return filter_preprw_read(cmd, exp, oa, objcount, obj,
+                                          niocount, nb, res, oti);
+
+        LBUG();
+
+        return -EPROTO;
+}
+
+/* It is highly unlikely that we would ever get an error here.  The page we want
+ * to get was previously locked, so it had to have already allocated the space,
+ * and we were just writing over the same data, so there would be no hole in the
+ * file.
+ *
+ * XXX: possibility of a race with truncate could exist, need to check that.
+ *      There are no guarantees w.r.t. write order even on a local filesystem,
+ *      although the normal response would be to return the number of bytes
+ *      successfully written and leave the rest to the app. */
+static int filter_write_locked_page(struct niobuf_local *lnb)
+{
+        struct page *lpage;
+        void *lpage_addr, *lnb_addr;
+        int rc;
+        ENTRY;
+
+        lpage = lustre_get_page_write(lnb->dentry->d_inode, lnb->page->index);
+        if (IS_ERR(lpage)) {
+                rc = PTR_ERR(lpage);
+                CERROR("error getting locked page index %ld: rc = %d\n",
+                       lnb->page->index, rc);
+                LBUG();
+                lustre_commit_write(lnb);
+                RETURN(rc);
+        }
+
+        /* 2 kmaps == vanishingly small deadlock opportunity */
+        lpage_addr = kmap(lpage);
+        lnb_addr = kmap(lnb->page);
+
+        memcpy(lpage_addr, lnb_addr, PAGE_SIZE);
+
+        kunmap(lnb->page);
+        kunmap(lpage);
+
+        page_cache_release(lnb->page);
+
+        lnb->page = lpage;
+        rc = lustre_commit_write(lnb);
+        if (rc)
+                CERROR("error committing locked page %ld: rc = %d\n",
+                       lnb->page->index, rc);
+        RETURN(rc);
+}
+
+int filter_commitrw(int cmd, struct obd_export *exp, struct obdo *oa,
+                    int objcount, struct obd_ioobj *obj, int niocount,
+                    struct niobuf_local *res, struct obd_trans_info *oti)
+{
+        struct obd_run_ctxt saved;
+        struct obd_ioobj *o;
+        struct niobuf_local *lnb;
+        struct obd_device *obd = exp->exp_obd;
+        int found_locked = 0, rc = 0, i;
+        int nested_trans = current->journal_info != NULL;
+        unsigned long now = jiffies;  /* DEBUGGING OST TIMEOUTS */
+        ENTRY;
+
+        push_ctxt(&saved, &obd->u.filter.fo_ctxt, NULL);
+
+        if (cmd & OBD_BRW_WRITE) {
+                LASSERT(oti);
+                LASSERT(current->journal_info == NULL ||
+                        current->journal_info == oti->oti_handle);
+                current->journal_info = oti->oti_handle;
+        }
+
+        for (i = 0, o = obj, lnb = res; i < objcount; i++, o++) {
+                struct inode *inode;
+                int j;
+
+                /* If all of the page reads were beyond EOF, let's pretend
+                 * this read didn't really happen at all. */
+                if (lnb->dentry == NULL) {
+                        oa->o_valid = OBD_MD_FLID|(oa->o_valid&OBD_MD_FLCKSUM);
+                        continue;
+                }
+
+                inode = igrab(lnb->dentry->d_inode);
+
+                if (cmd & OBD_BRW_WRITE) {
+                        /* FIXME: MULTI OBJECT BRW */
+                        if (oa && oa->o_valid & (OBD_MD_FLMTIME|OBD_MD_FLCTIME))
+                                obdo_refresh_inode(inode, oa, OBD_MD_FLATIME |
+                                                   OBD_MD_FLMTIME |
+                                                   OBD_MD_FLCTIME);
+                        else
+                                inode_update_time(lnb->dentry->d_inode, 1);
+                } else if (oa && oa->o_valid & OBD_MD_FLATIME) {
+                        /* Note that we don't necessarily write this to disk */
+                        obdo_refresh_inode(inode, oa, OBD_MD_FLATIME);
+                }
+
+                for (j = 0 ; j < o->ioo_bufcnt ; j++, lnb++) {
+                        if (lnb->page == NULL) {
+                                continue;
+                        }
+
+                        if (lnb->flags & N_LOCAL_TEMP_PAGE) {
+                                found_locked++;
+                                continue;
+                        }
+
+                        if (time_after(jiffies, lnb->start + 15 * HZ))
+                                CERROR("slow commitrw %lusi (%lus)\n",
+                                       (jiffies - lnb->start) / HZ,
+                                       (jiffies - now) / HZ);
+
+                        if (cmd & OBD_BRW_WRITE) {
+                                int err = filter_commit_write(lnb, 0);
+
+                                if (!rc)
+                                        rc = err;
+                        } else {
+                                page_cache_release(lnb->page);
+                        }
+
+                        f_dput(lnb->dentry);
+                        if (time_after(jiffies, lnb->start + 15 * HZ))
+                                CERROR("slow commit_write %lus (%lus)\n",
+                                       (jiffies - lnb->start) / HZ,
+                                       (jiffies - now) / HZ);
+                }
+
+                /* FIXME: MULTI OBJECT BRW */
+                if (oa) {
+                        oa->o_valid = OBD_MD_FLID|(oa->o_valid&OBD_MD_FLCKSUM);
+                        obdo_from_inode(oa, inode, FILTER_VALID_FLAGS);
+                }
+
+                if (cmd & OBD_BRW_WRITE)
+                        up(&inode->i_sem);
+
+                iput(inode);
+        }
+
+        for (i = 0, o = obj, lnb = res; found_locked > 0 && i < objcount;
+             i++, o++) {
+                int j;
+
+                for (j = 0 ; j < o->ioo_bufcnt ; j++, lnb++) {
+                        int err;
+                        if (!(lnb->flags & N_LOCAL_TEMP_PAGE))
+                                continue;
+
+                        if (time_after(jiffies, lnb->start + 15 * HZ))
+                                CERROR("slow commitrw locked %lus (%lus)\n",
+                                       (jiffies - lnb->start) / HZ,
+                                       (jiffies - now) / HZ);
+
+                        err = filter_write_locked_page(lnb);
+                        if (!rc)
+                                rc = err;
+                        f_dput(lnb->dentry);
+                        found_locked--;
+
+                        if (time_after(jiffies, lnb->start + 15 * HZ))
+                                CERROR("slow commit_write locked %lus (%lus)\n",
+                                       (jiffies - lnb->start) / HZ,
+                                       (jiffies - now) / HZ);
+                }
+        }
+
+        if (cmd & OBD_BRW_WRITE) {
+                /* We just want any dentry for the commit, for now */
+                struct dentry *dparent = filter_parent(obd, S_IFREG, 0);
+                int err;
+
+                rc = filter_finish_transno(exp, oti, rc);
+                err = fsfilt_commit(obd, dparent->d_inode, oti->oti_handle,
+                                    obd_sync_filter);
+                if (err)
+                        rc = err;
+                if (obd_sync_filter)
+                        LASSERT(oti->oti_transno <= obd->obd_last_committed);
+                if (time_after(jiffies, now + 15 * HZ))
+                        CERROR("slow commitrw commit %lus\n", (jiffies-now)/HZ);
+        }
+
+        LASSERT(nested_trans || current->journal_info == NULL);
+        pop_ctxt(&saved, &obd->u.filter.fo_ctxt, NULL);
+        RETURN(rc);
+}
+
+int filter_brw(int cmd, struct lustre_handle *conn, struct obdo *oa,
+               struct lov_stripe_md *lsm, obd_count oa_bufs,
+               struct brw_page *pga, struct obd_trans_info *oti)
+{
+        struct obd_export *exp;
+        struct obd_ioobj ioo;
+        struct niobuf_local *lnb;
+        struct niobuf_remote *rnb;
+        obd_count i;
+        int ret = 0;
+        ENTRY;
+
+        exp = class_conn2export(conn);
+        if (exp == NULL) {
+                CDEBUG(D_IOCTL, "invalid client cookie "LPX64"\n",conn->cookie);
+                RETURN(-EINVAL);
+        }
+
+        OBD_ALLOC(lnb, oa_bufs * sizeof(struct niobuf_local));
+        OBD_ALLOC(rnb, oa_bufs * sizeof(struct niobuf_remote));
+
+        if (lnb == NULL || rnb == NULL)
+                GOTO(out, ret = -ENOMEM);
+
+        for (i = 0; i < oa_bufs; i++) {
+                rnb[i].offset = pga[i].off;
+                rnb[i].len = pga[i].count;
+        }
+
+        ioo.ioo_id = oa->o_id;
+        ioo.ioo_gr = 0;
+        ioo.ioo_type = oa->o_mode & S_IFMT;
+        ioo.ioo_bufcnt = oa_bufs;
+
+        ret = filter_preprw(cmd, exp, oa, 1, &ioo, oa_bufs, rnb, lnb, oti);
+        if (ret != 0)
+                GOTO(out, ret);
+
+        for (i = 0; i < oa_bufs; i++) {
+                void *virt = kmap(pga[i].pg);
+                obd_off off = pga[i].off & ~PAGE_MASK;
+                void *addr = kmap(lnb[i].page);
+
+                /* 2 kmaps == vanishingly small deadlock opportunity */
+
+                if (cmd & OBD_BRW_WRITE)
+                        memcpy(addr + off, virt + off, pga[i].count);
+                else
+                        memcpy(virt + off, addr + off, pga[i].count);
+
+                kunmap(addr);
+                kunmap(virt);
+        }
+
+        ret = filter_commitrw(cmd, exp, oa, 1, &ioo, oa_bufs, lnb, oti);
+
+out:
+        if (lnb)
+                OBD_FREE(lnb, oa_bufs * sizeof(struct niobuf_local));
+        if (rnb)
+                OBD_FREE(rnb, oa_bufs * sizeof(struct niobuf_remote));
+        class_export_put(exp);
+        RETURN(ret);
+}
diff --git a/lustre/obdfilter/filter_log.c b/lustre/obdfilter/filter_log.c
new file mode 100644
index 0000000000..d91e1e853a
--- /dev/null
+++ b/lustre/obdfilter/filter_log.c
@@ -0,0 +1,380 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ *  linux/fs/obdfilter/filter_log.c
+ *
+ *  Copyright (c) 2001-2003 Cluster File Systems, Inc.
+ *   Author: Peter Braam <braam@clusterfs.com>
+ *   Author: Andreas Dilger <adilger@clusterfs.com>
+ *   Author: Phil Schwan <phil@clusterfs.com>
+ *
+ *   This file is part of Lustre, http://www.lustre.org.
+ *
+ *   Lustre 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.
+ *
+ *   Lustre 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 Lustre; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define DEBUG_SUBSYSTEM S_FILTER
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/version.h>
+
+#include <portals/list.h>
+#include <linux/obd_class.h>
+#include <linux/lustre_fsfilt.h>
+#include <linux/lustre_commit_confd.h>
+
+#include "filter_internal.h"
+
+static struct llog_handle *filter_log_create(struct obd_device *obd);
+
+/* This is a callback from the llog_* functions.
+ * Assumes caller has already pushed us into the kernel context. */
+static int filter_log_close(struct llog_handle *cathandle,
+                            struct llog_handle *loghandle)
+{
+        struct llog_object_hdr *llh = loghandle->lgh_hdr;
+        struct file *file = loghandle->lgh_file;
+        struct dentry *dparent = NULL, *dchild = NULL;
+        struct lustre_handle parent_lockh;
+        struct llog_logid *lgl = &loghandle->lgh_cookie.lgc_lgl;
+        int rc;
+        ENTRY;
+
+        /* If we are going to delete this log, grab a ref before we close
+         * it so we don't have to immediately do another lookup. */
+        if (llh->llh_hdr.lth_type != LLOG_CATALOG_MAGIC && llh->llh_count == 0){
+                CDEBUG(D_INODE, "deleting log file "LPX64":%x\n",
+                       lgl->lgl_oid, lgl->lgl_ogen);
+                dparent = filter_parent_lock(loghandle->lgh_obd, S_IFREG,
+                                             lgl->lgl_oid,LCK_PW,&parent_lockh);
+                if (IS_ERR(dparent)) {
+                        rc = PTR_ERR(dparent);
+                        CERROR("error locking parent, orphan log %*s: rc %d\n",
+                               file->f_dentry->d_name.len,
+                               file->f_dentry->d_name.name, rc);
+                        RETURN(rc);
+                } else {
+                        dchild = dget(file->f_dentry);
+                        llog_delete_log(cathandle, loghandle);
+                }
+        } else {
+                CDEBUG(D_INODE, "closing log file "LPX64":%x\n",
+                       lgl->lgl_oid, lgl->lgl_ogen);
+        }
+
+        rc = filp_close(file, 0);
+
+        llog_free_handle(loghandle); /* also removes loghandle from list */
+
+        if (dchild != NULL) {
+                int err = vfs_unlink(dparent->d_inode, dchild);
+                if (err) {
+                        CERROR("error unlinking empty log %*s: rc %d\n",
+                               dchild->d_name.len, dchild->d_name.name, err);
+                        if (!rc)
+                                rc = err;
+                }
+                f_dput(dchild);
+                ldlm_lock_decref(&parent_lockh, LCK_PW);
+        }
+        RETURN(rc);
+}
+
+/* This is a callback from the llog_* functions.
+ * Assumes caller has already pushed us into the kernel context. */
+static struct llog_handle *filter_log_open(struct obd_device *obd,
+                                           struct llog_cookie *logcookie)
+{
+        struct llog_logid *lgl = &logcookie->lgc_lgl;
+        struct llog_handle *loghandle;
+        struct dentry *dchild;
+        int rc;
+        ENTRY;
+
+        loghandle = llog_alloc_handle();
+        if (!loghandle)
+                RETURN(ERR_PTR(-ENOMEM));
+
+        dchild = filter_fid2dentry(obd, NULL, S_IFREG, lgl->lgl_oid);
+        if (IS_ERR(dchild))
+                GOTO(out_handle, rc = PTR_ERR(dchild));
+
+        if (dchild->d_inode == NULL) {
+                CERROR("logcookie references non-existent object %*s\n",
+                       dchild->d_name.len, dchild->d_name.name);
+                GOTO(out_dentry, rc = -ENOENT);
+        }
+
+        if (dchild->d_inode->i_generation != lgl->lgl_ogen) {
+                CERROR("logcookie for %*s had different generation %x != %x\n",
+                       dchild->d_name.len, dchild->d_name.name,
+                       dchild->d_inode->i_generation, lgl->lgl_ogen);
+                GOTO(out_dentry, rc = -ESTALE);
+        }
+
+        /* dentry_open does a dput(dchild) and mntput(mnt) on error */
+        mntget(obd->u.filter.fo_vfsmnt);
+        loghandle->lgh_file = dentry_open(dchild, obd->u.filter.fo_vfsmnt,
+                                          O_RDWR);
+        if (IS_ERR(loghandle->lgh_file)) {
+                rc = PTR_ERR(loghandle->lgh_file);
+                CERROR("error opening logfile %*s: rc %d\n",
+                       dchild->d_name.len, dchild->d_name.name, rc);
+                GOTO(out_dentry, rc);
+        }
+        memcpy(&loghandle->lgh_cookie, logcookie, sizeof(*logcookie));
+        loghandle->lgh_log_create = filter_log_create;
+        loghandle->lgh_log_open = filter_log_open;
+        loghandle->lgh_log_close = filter_log_close;
+        loghandle->lgh_obd = obd;
+        RETURN(loghandle);
+
+out_dentry:
+        f_dput(dchild);
+out_handle:
+        llog_free_handle(loghandle);
+        RETURN(ERR_PTR(rc));
+}
+
+/* This is a callback from the llog_* functions.
+ * Assumes caller has already pushed us into the kernel context. */
+static struct llog_handle *filter_log_create(struct obd_device *obd)
+{
+        struct filter_obd *filter = &obd->u.filter;
+        struct lustre_handle parent_lockh;
+        struct dentry *dparent, *dchild;
+        struct llog_handle *loghandle;
+        struct file *file;
+        int err, rc;
+        obd_id id;
+        ENTRY;
+
+        loghandle = llog_alloc_handle();
+        if (!loghandle)
+                RETURN(ERR_PTR(-ENOMEM));
+
+ retry:
+        id = filter_next_id(filter);
+
+        dparent = filter_parent_lock(obd, S_IFREG, id, LCK_PW, &parent_lockh);
+        if (IS_ERR(dparent))
+                GOTO(out_ctxt, rc = PTR_ERR(dparent));
+
+        dchild = filter_fid2dentry(obd, dparent, S_IFREG, id);
+        if (IS_ERR(dchild))
+                GOTO(out_lock, rc = PTR_ERR(dchild));
+
+        if (dchild->d_inode != NULL) {
+                /* This would only happen if lastobjid was bad on disk */
+                CERROR("Serious error: objid %*s already exists; is this "
+                       "filesystem corrupt?  I will try to work around it.\n",
+                       dchild->d_name.len, dchild->d_name.name);
+                f_dput(dchild);
+                ldlm_lock_decref(&parent_lockh, LCK_PW);
+                goto retry;
+        }
+
+        rc = vfs_create(dparent->d_inode, dchild, S_IFREG);
+        if (rc) {
+                CERROR("log create failed rc = %d\n", rc);
+                GOTO(out_child, rc);
+        }
+
+        rc = filter_update_server_data(obd, filter->fo_rcvd_filp,
+                                       filter->fo_fsd);
+        if (rc) {
+                CERROR("can't write lastobjid but log created: rc %d\n",rc);
+                GOTO(out_destroy, rc);
+        }
+
+        /* dentry_open does a dput(dchild) and mntput(mnt) on error */
+        mntget(filter->fo_vfsmnt);
+        file = dentry_open(dchild, filter->fo_vfsmnt, O_RDWR | O_LARGEFILE);
+        if (IS_ERR(file)) {
+                rc = PTR_ERR(file);
+                CERROR("error opening log file "LPX64": rc %d\n", id, rc);
+                GOTO(out_destroy, rc);
+        }
+        ldlm_lock_decref(&parent_lockh, LCK_PW);
+
+        loghandle->lgh_file = file;
+        loghandle->lgh_cookie.lgc_lgl.lgl_oid = id;
+        loghandle->lgh_cookie.lgc_lgl.lgl_ogen = dchild->d_inode->i_generation;
+        loghandle->lgh_log_create = filter_log_create;
+        loghandle->lgh_log_open = filter_log_open;
+        loghandle->lgh_log_close = filter_log_close;
+        loghandle->lgh_obd = obd;
+
+        RETURN(loghandle);
+
+out_destroy:
+        err = vfs_unlink(dparent->d_inode, dchild);
+        if (err)
+                CERROR("error unlinking %*s on error: rc %d\n",
+                       dchild->d_name.len, dchild->d_name.name, err);
+out_child:
+        f_dput(dchild);
+out_lock:
+        ldlm_lock_decref(&parent_lockh, LCK_PW);
+out_ctxt:
+        llog_free_handle(loghandle);
+        RETURN(ERR_PTR(rc));
+}
+
+/* This is called from filter_setup() and should be single threaded */
+struct llog_handle *filter_get_catalog(struct obd_device *obd)
+{
+        struct filter_obd *filter = &obd->u.filter;
+        struct filter_server_data *fsd = filter->fo_fsd;
+        struct obd_run_ctxt saved;
+        struct llog_handle *cathandle = NULL;
+        int rc;
+        ENTRY;
+
+        push_ctxt(&saved, &filter->fo_ctxt, NULL);
+        if (fsd->fsd_catalog_oid) {
+                struct llog_cookie catcookie;
+
+                catcookie.lgc_lgl.lgl_oid = le64_to_cpu(fsd->fsd_catalog_oid);
+                catcookie.lgc_lgl.lgl_ogen = le32_to_cpu(fsd->fsd_catalog_ogen);
+                cathandle = filter_log_open(obd, &catcookie);
+                if (IS_ERR(cathandle)) {
+                        CERROR("error opening catalog "LPX64":%x: rc %d\n",
+                               catcookie.lgc_lgl.lgl_oid,
+                               catcookie.lgc_lgl.lgl_ogen,
+                               (int)PTR_ERR(cathandle));
+                        fsd->fsd_catalog_oid = 0;
+                        fsd->fsd_catalog_ogen = 0;
+                }
+        }
+
+        if (!fsd->fsd_catalog_oid) {
+                struct llog_logid *lgl;
+
+                cathandle = filter_log_create(obd);
+                if (IS_ERR(cathandle)) {
+                        CERROR("error creating new catalog: rc %d\n",
+                               (int)PTR_ERR(cathandle));
+                        GOTO(out, cathandle);
+                }
+                lgl = &cathandle->lgh_cookie.lgc_lgl;
+                fsd->fsd_catalog_oid = cpu_to_le64(lgl->lgl_oid);
+                fsd->fsd_catalog_ogen = cpu_to_le32(lgl->lgl_ogen);
+                rc = filter_update_server_data(obd, filter->fo_rcvd_filp, fsd);
+                if (rc) {
+                        CERROR("error writing new catalog to disk: rc %d\n",rc);
+                        GOTO(out_handle, rc);
+                }
+        }
+
+        rc = llog_init_catalog(cathandle, &obd->u.filter.fo_mdc_uuid);
+        if (rc)
+                GOTO(out_handle, rc);
+out:
+        pop_ctxt(&saved, &filter->fo_ctxt, NULL);
+        RETURN(cathandle);
+
+out_handle:
+        filter_log_close(cathandle, cathandle);
+        cathandle = ERR_PTR(rc);
+        goto out;
+}
+
+void filter_put_catalog(struct llog_handle *cathandle)
+{
+        struct llog_handle *loghandle, *n;
+        int rc;
+        ENTRY;
+
+        list_for_each_entry_safe(loghandle, n, &cathandle->lgh_list, lgh_list)
+                filter_log_close(cathandle, loghandle);
+
+        rc = filp_close(cathandle->lgh_file, 0);
+        if (rc)
+                CERROR("error closing catalog: rc %d\n", rc);
+
+        llog_free_handle(cathandle);
+        EXIT;
+}
+
+int filter_log_cancel(struct lustre_handle *conn, struct lov_stripe_md *lsm,
+                      int num_cookies, struct llog_cookie *logcookies,
+                      int flags)
+{
+        struct obd_device *obd = class_conn2obd(conn);
+        struct obd_run_ctxt saved;
+        int rc;
+        ENTRY;
+
+        push_ctxt(&saved, &obd->u.filter.fo_ctxt, NULL);
+        rc = llog_cancel_records(obd->u.filter.fo_catalog, num_cookies,
+                                 logcookies);
+        pop_ctxt(&saved, &obd->u.filter.fo_ctxt, NULL);
+
+        RETURN(rc);
+}
+
+int filter_log_op_create(struct llog_handle *cathandle, struct ll_fid *mds_fid,
+                         obd_id oid, obd_count ogen,
+                         struct llog_cookie *logcookie)
+{
+        struct llog_create_rec *lcr;
+        int rc;
+        ENTRY;
+
+        OBD_ALLOC(lcr, sizeof(*lcr));
+        if (lcr == NULL)
+                RETURN(-ENOMEM);
+        lcr->lcr_hdr.lth_len = lcr->lcr_end_len = sizeof(*lcr);
+        lcr->lcr_hdr.lth_type = OST_CREATE_REC;
+        lcr->lcr_fid.id = mds_fid->id;
+        lcr->lcr_fid.generation = mds_fid->generation;
+        lcr->lcr_fid.f_type = mds_fid->f_type;
+        lcr->lcr_oid = oid;
+        lcr->lcr_ogen = ogen;
+
+        rc = llog_add_record(cathandle, &lcr->lcr_hdr, logcookie);
+        OBD_FREE(lcr, sizeof(*lcr));
+
+        if (rc > 0) {
+                LASSERT(rc == sizeof(*logcookie));
+                rc = 0;
+        }
+        RETURN(rc);
+}
+
+int filter_log_op_orphan(struct llog_handle *cathandle, obd_id oid,
+                         obd_count ogen, struct llog_cookie *logcookie)
+{
+        struct llog_orphan_rec *lor;
+        int rc;
+        ENTRY;
+
+        OBD_ALLOC(lor, sizeof(*lor));
+        if (lor == NULL)
+                RETURN(-ENOMEM);
+        lor->lor_hdr.lth_len = lor->lor_end_len = sizeof(*lor);
+        lor->lor_hdr.lth_type = OST_ORPHAN_REC;
+        lor->lor_oid = oid;
+        lor->lor_ogen = ogen;
+
+        rc = llog_add_record(cathandle, &lor->lor_hdr, logcookie);
+
+        if (rc > 0) {
+                LASSERT(rc == sizeof(*logcookie));
+                rc = 0;
+        }
+        RETURN(rc);
+}
diff --git a/lustre/obdfilter/filter_san.c b/lustre/obdfilter/filter_san.c
new file mode 100644
index 0000000000..30ce9d701a
--- /dev/null
+++ b/lustre/obdfilter/filter_san.c
@@ -0,0 +1,124 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ *  linux/fs/obdfilter/filter_san.c
+ *
+ *  Copyright (c) 2001-2003 Cluster File Systems, Inc.
+ *   Author: Peter Braam <braam@clusterfs.com>
+ *   Author: Andreas Dilger <adilger@clusterfs.com>
+ *
+ *   This file is part of Lustre, http://www.lustre.org.
+ *
+ *   Lustre 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.
+ *
+ *   Lustre 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 Lustre; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define DEBUG_SUBSYSTEM S_FILTER
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/pagemap.h> // XXX kill me soon
+#include <linux/version.h>
+
+#include <linux/obd_class.h>
+#include <linux/lustre_fsfilt.h>
+#include "filter_internal.h"
+
+/* sanobd setup methods - use a specific mount option */
+int filter_san_setup(struct obd_device *obd, obd_count len, void *buf)
+{
+        struct obd_ioctl_data* data = buf;
+        char *option = NULL;
+
+        if (!data->ioc_inlbuf2)
+                RETURN(-EINVAL);
+
+        /* for extN/ext3 filesystem, we must mount it with 'writeback' mode */
+        if (!strcmp(data->ioc_inlbuf2, "extN"))
+                option = "data=writeback";
+        else if (!strcmp(data->ioc_inlbuf2, "ext3"))
+                option = "data=writeback,asyncdel";
+        else
+                LBUG(); /* just a reminder */
+
+        return filter_common_setup(obd, len, buf, option);
+}
+
+int filter_san_preprw(int cmd, struct obd_export *exp, struct obdo *oa,
+                      int objcount, struct obd_ioobj *obj, int niocount,
+                      struct niobuf_remote *nb)
+{
+        struct obd_ioobj *o = obj;
+        struct niobuf_remote *rnb = nb;
+        int rc = 0;
+        int i;
+        ENTRY;
+        LASSERT(objcount == 1);
+
+        for (i = 0; i < objcount; i++, o++) {
+                struct dentry *dentry;
+                struct inode *inode;
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+                sector_t (*fs_bmap)(struct address_space *, sector_t);
+#else
+                int (*fs_bmap)(struct address_space *, long);
+#endif
+                int j;
+
+                dentry = filter_oa2dentry(exp->exp_obd, oa);
+                if (IS_ERR(dentry))
+                        GOTO(out, rc = PTR_ERR(dentry));
+
+                inode = dentry->d_inode;
+                if (!inode) {
+                        CERROR("trying to BRW to non-existent file "LPU64"\n",
+                               o->ioo_id);
+                        f_dput(dentry);
+                        GOTO(out, rc = -ENOENT);
+                }
+                fs_bmap = inode->i_mapping->a_ops->bmap;
+
+                for (j = 0; j < o->ioo_bufcnt; j++, rnb++) {
+                        long block;
+
+                        block = rnb->offset >> inode->i_blkbits;
+
+                        if (cmd == OBD_BRW_READ) {
+                                block = fs_bmap(inode->i_mapping, block);
+                        } else {
+                                loff_t newsize = rnb->offset + rnb->len;
+                                /* fs_prep_san_write will also update inode
+                                 * size for us:
+                                 * (1) new alloced block
+                                 * (2) existed block but size extented
+                                 */
+                                /* FIXME We could call fs_prep_san_write()
+                                 * only once for all the blocks allocation.
+                                 * Now call it once for each block, for
+                                 * simplicity. And if error happens, we
+                                 * probably need to release previous alloced
+                                 * block */
+                                rc = fs_prep_san_write(exp->exp_obd, inode,
+                                                       &block, 1, newsize);
+                                if (rc)
+                                        break;
+                        }
+
+                        rnb->offset = block;
+                }
+                f_dput(dentry);
+        }
+out:
+        RETURN(rc);
+}
+
diff --git a/lustre/ost/Makefile.mk b/lustre/ost/Makefile.mk
new file mode 100644
index 0000000000..08c7dae4bc
--- /dev/null
+++ b/lustre/ost/Makefile.mk
@@ -0,0 +1,9 @@
+# Copyright (C) 2003  Cluster File Systems, Inc.
+#
+# This code is issued under the GNU General Public License.
+# See the file COPYING in this distribution
+
+include $(src)/../portals/Kernelenv
+
+obj-y += ost.o
+ost-objs := ost_handler.o lproc_ost.o
diff --git a/lustre/portals/tests/Makefile.mk b/lustre/portals/tests/Makefile.mk
new file mode 100644
index 0000000000..751c0a002a
--- /dev/null
+++ b/lustre/portals/tests/Makefile.mk
@@ -0,0 +1,9 @@
+# Copyright (C) 2001  Cluster File Systems, Inc.
+#
+# This code is issued under the GNU General Public License.
+# See the file COPYING in this distribution
+
+include $(src)/../Kernelenv
+
+obj-y += ping_cli.o
+obj-y += ping_srv.o
diff --git a/lustre/portals/utils/Makefile.mk b/lustre/portals/utils/Makefile.mk
new file mode 100644
index 0000000000..cbbe6d5e99
--- /dev/null
+++ b/lustre/portals/utils/Makefile.mk
@@ -0,0 +1,6 @@
+include $(src)/../Kernelenv
+
+host-progs := acceptor ptlctl
+always := $(host-progs)
+
+ptlctl-objs := ptlctl.o $(PTLCTLOBJS)
diff --git a/lustre/ptlrpc/Makefile.mk b/lustre/ptlrpc/Makefile.mk
new file mode 100644
index 0000000000..064cf51065
--- /dev/null
+++ b/lustre/ptlrpc/Makefile.mk
@@ -0,0 +1,11 @@
+# Copyright (C) 2003  Cluster File Systems, Inc.
+#
+# This code is issued under the GNU General Public License.
+# See the file COPYING in this distribution
+
+include $(src)/../portals/Kernelenv
+
+obj-y += ptlrpc.o
+ptlrpc-objs := recover.o connection.o ptlrpc_module.o events.o service.o \
+		client.o niobuf.o pack_generic.o lproc_ptlrpc.o pinger.o \
+		recov_thread.o ptlrpc_lib.o
diff --git a/lustre/ptlrpc/recov_thread.c b/lustre/ptlrpc/recov_thread.c
new file mode 100644
index 0000000000..45cda954d1
--- /dev/null
+++ b/lustre/ptlrpc/recov_thread.c
@@ -0,0 +1,358 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ *  Copyright (C) 2003 Cluster File Systems, Inc.
+ *   Author: Andreas Dilger <adilger@clusterfs.com>
+ *
+ *   This file is part of Lustre, http://www.lustre.org.
+ *
+ *   Lustre 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.
+ *
+ *   Lustre 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 Lustre; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * OST<->MDS recovery logging thread.
+ *
+ * Invariants in implementation:
+ * - we do not share logs among different OST<->MDS connections, so that
+ *   if an OST or MDS fails it need only look at log(s) relevant to itself
+ */
+
+#define DEBUG_SUBSYSTEM S_LOG
+
+#ifndef EXPORT_SYMTAB
+# define EXPORT_SYMTAB
+#endif
+
+#ifndef __KERNEL__
+# include <portals/list.h>
+# include <liblustre.h>
+#endif
+#include <linux/kp30.h>
+#include <linux/fs.h>
+#include <linux/obd_class.h>
+#include <linux/lustre_commit_confd.h>
+#include <linux/obd_support.h>
+#include <linux/obd_class.h>
+#include <linux/lustre_net.h>
+#include <portals/types.h>
+#include <portals/list.h>
+#include "ptlrpc_internal.h"
+
+static struct llog_commit_master lustre_lcm;
+static struct llog_commit_master *lcm = &lustre_lcm;
+
+/* Allocate new commit structs in case we do not have enough */
+static int llcd_alloc(void)
+{
+        struct llog_commit_data *llcd;
+
+        OBD_ALLOC(llcd, PAGE_SIZE);
+        if (llcd == NULL)
+                return -ENOMEM;
+
+        llcd->llcd_lcm = lcm;
+
+        spin_lock(&lcm->lcm_llcd_lock);
+        list_add(&llcd->llcd_list, &lcm->lcm_llcd_free);
+        atomic_inc(&lcm->lcm_llcd_numfree);
+        spin_unlock(&lcm->lcm_llcd_lock);
+
+        return 0;
+}
+
+/* Get a free cookie struct from the list */
+struct llog_commit_data *llcd_grab(void)
+{
+        struct llog_commit_data *llcd;
+
+        spin_lock(&lcm->lcm_llcd_lock);
+        if (list_empty(&lcm->lcm_llcd_free)) {
+                spin_unlock(&lcm->lcm_llcd_lock);
+                if (llcd_alloc() < 0) {
+                        CERROR("unable to allocate log commit data!\n");
+                        return NULL;
+                }
+                spin_lock(&lcm->lcm_llcd_lock);
+        }
+
+        llcd = list_entry(lcm->lcm_llcd_free.next, typeof(*llcd), llcd_list);
+        list_del(&llcd->llcd_list);
+        atomic_dec(&lcm->lcm_llcd_numfree);
+        spin_unlock(&lcm->lcm_llcd_lock);
+
+        llcd->llcd_tries = 0;
+        llcd->llcd_cookiebytes = 0;
+
+        return llcd;
+}
+EXPORT_SYMBOL(llcd_grab);
+
+static void llcd_put(struct llog_commit_data *llcd)
+{
+        if (atomic_read(&lcm->lcm_llcd_numfree) >= lcm->lcm_llcd_maxfree) {
+                OBD_FREE(llcd, PAGE_SIZE);
+        } else {
+                spin_lock(&lcm->lcm_llcd_lock);
+                list_add(&llcd->llcd_list, &lcm->lcm_llcd_free);
+                atomic_inc(&lcm->lcm_llcd_numfree);
+                spin_unlock(&lcm->lcm_llcd_lock);
+        }
+}
+
+/* Send some cookies to the appropriate target */
+void llcd_send(struct llog_commit_data *llcd)
+{
+        spin_lock(&llcd->llcd_lcm->lcm_llcd_lock);
+        list_add_tail(&llcd->llcd_list, &llcd->llcd_lcm->lcm_llcd_pending);
+        spin_unlock(&llcd->llcd_lcm->lcm_llcd_lock);
+
+        wake_up_nr(&llcd->llcd_lcm->lcm_waitq, 1);
+}
+EXPORT_SYMBOL(llcd_send);
+
+static int log_commit_thread(void *arg)
+{
+        struct llog_commit_master *lcm = arg;
+        struct llog_commit_daemon *lcd;
+        struct llog_commit_data *llcd, *n;
+        unsigned long flags;
+        ENTRY;
+
+        OBD_ALLOC(lcd, sizeof(*lcd));
+        if (lcd == NULL)
+                RETURN(-ENOMEM);
+
+        lock_kernel();
+        ptlrpc_daemonize(); /* thread never needs to do IO */
+
+        SIGNAL_MASK_LOCK(current, flags);
+        sigfillset(&current->blocked);
+        RECALC_SIGPENDING;
+        SIGNAL_MASK_UNLOCK(current, flags);
+
+        spin_lock(&lcm->lcm_thread_lock);
+        THREAD_NAME(current->comm, "ll_log_commit_%d",
+                    atomic_read(&lcm->lcm_thread_total));
+        atomic_inc(&lcm->lcm_thread_total);
+        spin_unlock(&lcm->lcm_thread_lock);
+        unlock_kernel();
+
+        INIT_LIST_HEAD(&lcd->lcd_lcm_list);
+        INIT_LIST_HEAD(&lcd->lcd_llcd_list);
+        lcd->lcd_lcm = lcm;
+
+        CDEBUG(D_HA, "%s started\n", current->comm);
+        do {
+                struct ptlrpc_request *request;
+                struct obd_import *import = NULL;
+                struct list_head *sending_list;
+                int rc = 0;
+
+                /* If we do not have enough pages available, allocate some */
+                while (atomic_read(&lcm->lcm_llcd_numfree) <
+                       lcm->lcm_llcd_minfree) {
+                        if (llcd_alloc() < 0)
+                                break;
+                }
+
+                spin_lock(&lcm->lcm_thread_lock);
+                atomic_inc(&lcm->lcm_thread_numidle);
+                list_move(&lcd->lcd_lcm_list, &lcm->lcm_thread_idle);
+                spin_unlock(&lcm->lcm_thread_lock);
+
+                wait_event_interruptible(lcm->lcm_waitq,
+                                         !list_empty(&lcm->lcm_llcd_pending) ||
+                                         lcm->lcm_flags & LLOG_LCM_FL_EXIT);
+
+                /* If we are the last available thread, start a new one in case
+                 * we get blocked on an RPC (nobody else will start a new one)*/
+                spin_lock(&lcm->lcm_thread_lock);
+                atomic_dec(&lcm->lcm_thread_numidle);
+                list_move(&lcd->lcd_lcm_list, &lcm->lcm_thread_busy);
+                spin_unlock(&lcm->lcm_thread_lock);
+
+                sending_list = &lcm->lcm_llcd_pending;
+        resend:
+                if (lcm->lcm_flags & LLOG_LCM_FL_EXIT) {
+                        lcm->lcm_llcd_maxfree = 0;
+                        lcm->lcm_llcd_minfree = 0;
+                        lcm->lcm_thread_max = 0;
+
+                        if (list_empty(&lcm->lcm_llcd_pending) ||
+                            lcm->lcm_flags & LLOG_LCM_FL_EXIT_FORCE)
+                                break;
+                }
+
+                if (atomic_read(&lcm->lcm_thread_numidle) <= 1 &&
+                    atomic_read(&lcm->lcm_thread_total) < lcm->lcm_thread_max) {
+                        rc = llog_start_commit_thread();
+                        if (rc < 0)
+                                CERROR("error starting thread: rc %d\n", rc);
+                }
+
+                /* Move all of the pending cancels from the same OST off of
+                 * the list, so we don't get multiple threads blocked and/or
+                 * doing upcalls on the same OST in case of failure. */
+                spin_lock(&lcm->lcm_llcd_lock);
+                if (!list_empty(sending_list)) {
+                        list_move_tail(sending_list->next,
+                                       &lcd->lcd_llcd_list);
+                        llcd = list_entry(lcd->lcd_llcd_list.next,
+                                          typeof(*llcd), llcd_list);
+                        LASSERT(llcd->llcd_lcm == lcm);
+                        import = llcd->llcd_import;
+                }
+                list_for_each_entry_safe(llcd, n, sending_list, llcd_list) {
+                        LASSERT(llcd->llcd_lcm == lcm);
+                        if (import == llcd->llcd_import)
+                                list_move_tail(&llcd->llcd_list,
+                                               &lcd->lcd_llcd_list);
+                }
+                if (sending_list != &lcm->lcm_llcd_resend) {
+                        list_for_each_entry_safe(llcd, n, &lcm->lcm_llcd_resend,
+                                                 llcd_list) {
+                                LASSERT(llcd->llcd_lcm == lcm);
+                                if (import == llcd->llcd_import)
+                                        list_move_tail(&llcd->llcd_list,
+                                                       &lcd->lcd_llcd_list);
+                        }
+                }
+                spin_unlock(&lcm->lcm_llcd_lock);
+
+                /* We are the only one manipulating our local list - no lock */
+                list_for_each_entry_safe(llcd,n, &lcd->lcd_llcd_list,llcd_list){
+                        char *bufs[1] = {(char *)llcd->llcd_cookies};
+                        list_del(&llcd->llcd_list);
+
+                        request = ptlrpc_prep_req(import, OBD_LOG_CANCEL, 1,
+                                                  &llcd->llcd_cookiebytes,
+                                                  bufs);
+                        if (request == NULL) {
+                                rc = -ENOMEM;
+                                CERROR("error preparing commit: rc %d\n", rc);
+
+                                spin_lock(&lcm->lcm_llcd_lock);
+                                list_splice(&lcd->lcd_llcd_list,
+                                            &lcm->lcm_llcd_resend);
+                                INIT_LIST_HEAD(&lcd->lcd_llcd_list);
+                                spin_unlock(&lcm->lcm_llcd_lock);
+                                break;
+                        }
+
+                        request->rq_replen = lustre_msg_size(0, NULL);
+                        rc = ptlrpc_queue_wait(request);
+                        ptlrpc_req_finished(request);
+
+                        /* If the RPC failed, we put this and the remaining
+                         * messages onto the resend list for another time. */
+                        if (rc == 0) {
+                                llcd_put(llcd);
+                                continue;
+                        }
+
+                        spin_lock(&lcm->lcm_llcd_lock);
+                        list_splice(&lcd->lcd_llcd_list, &lcm->lcm_llcd_resend);
+                        if (++llcd->llcd_tries < 5) {
+                                CERROR("commit %p failed %dx: rc %d\n",
+                                       llcd, llcd->llcd_tries, rc);
+
+                                list_add_tail(&llcd->llcd_list,
+                                              &lcm->lcm_llcd_resend);
+                                spin_unlock(&lcm->lcm_llcd_lock);
+                        } else {
+                                spin_unlock(&lcm->lcm_llcd_lock);
+                                CERROR("commit %p dropped %d cookies: rc %d\n",
+                                       llcd, (int)(llcd->llcd_cookiebytes /
+                                                   sizeof(*llcd->llcd_cookies)),
+                                       rc);
+                                llcd_put(llcd);
+                        }
+                        break;
+                }
+
+                if (rc == 0) {
+                        sending_list = &lcm->lcm_llcd_resend;
+                        if (!list_empty(sending_list))
+                                goto resend;
+                }
+        } while(1);
+
+        /* If we are force exiting, just drop all of the cookies. */
+        if (lcm->lcm_flags & LLOG_LCM_FL_EXIT_FORCE) {
+                spin_lock(&lcm->lcm_llcd_lock);
+                list_splice(&lcm->lcm_llcd_pending, &lcd->lcd_llcd_list);
+                list_splice(&lcm->lcm_llcd_resend, &lcd->lcd_llcd_list);
+                list_splice(&lcm->lcm_llcd_free, &lcd->lcd_llcd_list);
+                spin_unlock(&lcm->lcm_llcd_lock);
+
+                list_for_each_entry_safe(llcd, n, &lcd->lcd_llcd_list,llcd_list)
+                        llcd_put(llcd);
+        }
+
+        OBD_FREE(lcd, sizeof(*lcd));
+
+        spin_lock(&lcm->lcm_thread_lock);
+        atomic_dec(&lcm->lcm_thread_total);
+        spin_unlock(&lcm->lcm_thread_lock);
+        wake_up(&lcm->lcm_waitq);
+
+        CDEBUG(D_HA, "%s exiting\n", current->comm);
+        return 0;
+}
+
+int llog_start_commit_thread(void)
+{
+        int rc;
+        ENTRY;
+
+        if (atomic_read(&lcm->lcm_thread_total) >= lcm->lcm_thread_max)
+                RETURN(0);
+
+        rc = kernel_thread(log_commit_thread, lcm, CLONE_VM | CLONE_FILES);
+        if (rc < 0) {
+                CERROR("error starting thread #%d: %d\n",
+                       atomic_read(&lcm->lcm_thread_total), rc);
+                RETURN(rc);
+        }
+
+        RETURN(0);
+}
+EXPORT_SYMBOL(llog_start_commit_thread);
+
+int llog_init_commit_master(void)
+{
+        INIT_LIST_HEAD(&lcm->lcm_thread_busy);
+        INIT_LIST_HEAD(&lcm->lcm_thread_idle);
+        spin_lock_init(&lcm->lcm_thread_lock);
+        atomic_set(&lcm->lcm_thread_numidle, 0);
+        init_waitqueue_head(&lcm->lcm_waitq);
+        INIT_LIST_HEAD(&lcm->lcm_llcd_pending);
+        INIT_LIST_HEAD(&lcm->lcm_llcd_resend);
+        INIT_LIST_HEAD(&lcm->lcm_llcd_free);
+        spin_lock_init(&lcm->lcm_llcd_lock);
+        atomic_set(&lcm->lcm_llcd_numfree, 0);
+        lcm->lcm_llcd_minfree = 0;
+        lcm->lcm_thread_max = 5;
+        return 0;
+}
+
+int llog_cleanup_commit_master(int force)
+{
+        lcm->lcm_flags |= LLOG_LCM_FL_EXIT;
+        if (force)
+                lcm->lcm_flags |= LLOG_LCM_FL_EXIT_FORCE;
+        wake_up(&lcm->lcm_waitq);
+
+        wait_event_interruptible(lcm->lcm_waitq,
+                                 atomic_read(&lcm->lcm_thread_total) == 0);
+        return 0;
+}
diff --git a/lustre/tests/client-echo.cfg b/lustre/tests/client-echo.cfg
deleted file mode 100644
index 83856eccfe..0000000000
--- a/lustre/tests/client-echo.cfg
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-# Config file for setting up a client to talk to an echo OST
-SETUP_OSC=y
diff --git a/lustre/tests/client-mount.cfg b/lustre/tests/client-mount.cfg
deleted file mode 100644
index 6f2addb1fc..0000000000
--- a/lustre/tests/client-mount.cfg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-# Config file for mounting a client Lustre filesystem
-SETUP_MDC=y
-SETUP_OSC=y
-OSCMT=/mnt/lustre
-SETUP_MOUNT=y
diff --git a/lustre/tests/client-mount2.cfg b/lustre/tests/client-mount2.cfg
deleted file mode 100644
index cb210c8019..0000000000
--- a/lustre/tests/client-mount2.cfg
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-# Config file for mounting a client Lustre filesystem
-MDC_NAMES="MDCDEV1 MDCDEV2"
-OSC_NAMES="OSCDEV1 OSCDEV2"
-SETUP_MDC=y
-SETUP_OSC=y
-MT1="/mnt/lustre1 OSCDEV1 MDCDEV1"
-MT2="/mnt/lustre2 OSCDEV2 MDCDEV2"
-MOUNT_LIST="MT1 MT2"
-SETUP_MOUNT=y
diff --git a/lustre/tests/common.sh b/lustre/tests/common.sh
deleted file mode 100644
index 6a4429eda9..0000000000
--- a/lustre/tests/common.sh
+++ /dev/null
@@ -1,713 +0,0 @@
-#!/bin/sh
-export PATH=$PATH:/sbin:/usr/sbin
-
-[ -d /r ] && R=/r
-
-# check if running in source directory
-# will probably need to create variable for each module.
-if [ -f $SRCDIR/Makefile.am ]; then
-	USEDEV=yes
-	PORTALS=$SRCDIR/../../portals
-	LUSTRE=$SRCDIR/..
-
-	PTLCTL=$LUSTRE/utils/lctl
-	DBGCTL=$LUSTRE/utils/lctl
-	ACCEPTOR=$PORTALS/linux/utils/acceptor
-
-	OBDCTL=$LUSTRE/utils/lctl
-else
-	USEDEV=no
-	# should have configure set the paths here
-	BINDIR=/usr/sbin
-	PORTALS=/lib/modules
-	LUSTRE=/lib/modules
-
-	PTLCTL=$BINDIR/lctl
-	DBGCTL=$BINDIR/lctl
-	ACCEPTOR=$BINDIR/acceptor
-	OBDCTL=$BINDIR/lctl
-fi
-
-LOOPNUM=0; export LOOPNUM
-if [ -b /dev/loop0 ]; then
-	LOOP=/dev/loop
-elif [ -b /dev/loop/0 ]; then
-	LOOP=/dev/loop/
-else
-	echo "Cannot find /dev/loop0 or /dev/loop/0" 1>&2 && exit -1
-fi
-
-do_insmod() {
-	MODULE=$1
-	BASE=`echo $MODULE | sed -e "s^.*/^^" -e "s/\.o$//"`
-
-	lsmod | grep -q "\<$BASE\>" && return 0
-	[ "$MODULE" ] || fail "usage: $0 <module>"
-
-	if [ "$USEDEV" = "yes" ]; then
-		[ -f $MODULE ] || echo "$0: module '$MODULE' not found" 1>&2
-		insmod $MODULE
-	else
-		modprobe $BASE
-	fi
-}
-
-do_rmmod() {
-	MODULE=$1
-	[ "$MODULE" ] || fail "usage: $0 <module>"
-	lsmod | grep -q $MODULE || return 0
-	rmmod $MODULE || lsmod | sed "s/^/$MODULE failed: /"
-}
-
-# Return the next unused loop device on stdout and in the $LOOPDEV
-# environment variable.
-next_loop_dev() {
-	NEXT=
-	while [ -b ${LOOP}${LOOPNUM} ]; do
-		LOOPDEV=${LOOP}${LOOPNUM}
-		losetup ${LOOPDEV} > /dev/null 2>&1 || NEXT=${LOOPDEV}
-		LOOPNUM=`expr ${LOOPNUM} + 1`
-		[ "$NEXT" ] && echo ${NEXT} && break
-	done
-}
-
-# Create a new filesystem.  If we are using a loopback device, we check
-# for existing "template" filesystems instead of creating a new one,
-# because it is _much_ faster to gunzip the empty filesystem instead of
-# creating a new one from scratch.  Conversely, if we are creating a
-# filesystem on a device we use mkfs, because that only writes sparsely
-# to the device.  The empty filesystems are also highly compressed (1000:1)
-# so they don't take too much space.
-#
-new_fs_usage() {
-	echo "new_fs <fstype> {device | file} [size]" 1>&2
-	exit -1
-}
-new_fs () {
- 	EFILE="$1_$3.gz"
-	MKFS="mkfs.$1"
-	MKFSOPT="-b 4096"
-
-	[ "$1" = "ext3" ] && MKFS="mkfs.ext2 -j"
-	if [ "$1" = "extN" ]; then
-		MKFS="mkfs.ext2 -j"
-		EFILE="ext3_$3.gz"
-	fi
-
-	if [ -b "$2" ]; then
-		[ $# -lt 2 -o $# -gt 3 ] && new_fs_usage
-
-		PM="/proc/mounts"
-		[ -r "$PM" ] || PM="/etc/mtab"
-
-		grep "$2 " $PM 1>&2 && echo "$0: $2 is in $PM!" 1>&2 && exit -1
-
-		$MKFS $MKFSOPT $2 $3 || exit -1
-		LOOPDEV=$2	# Not really a loop device
-	else
-		[ $# -ne 3 ] && new_fs_usage
-
-		if [ -r "$EFILE" ]; then
-			echo "using prepared filesystem $EFILE for $2"
-			zcat "$EFILE" > $2 || exit -1
-			sync
-		else
-			echo "creating new sparse filesystem on $2"
-			dd if=/dev/zero of=$2 bs=1k seek=$3 count=1 1>&2 || exit -1
-			$MKFS $MKFSOPT -F $2 1>&2 || exit -1
-		fi
-		LOOPDEV=`next_loop_dev`
-		losetup ${LOOPDEV} $2 1>&2 || exit -1
-	fi
-
-	# Enable hash-indexed directories for extN filesystems
-	[ "$1" = "extN" ] && echo "feature FEATURE_C5" | debugfs -w $2
-}
-
-# Set up to use an existing filesystem.  We take the same parameters as
-# new_fs, even though we only use the <fstype> and <file> parameters, to
-# make it easy to convert between new_fs and old_fs in testing scripts.
-old_fs () {
-	[ -e $2 ] || exit -1
-
-	if [ -b "$2" ]; then
-		LOOPDEV=$2	# Not really a loop device
-	else
-		LOOPDEV=`next_loop_dev`
-		losetup ${LOOPDEV} $2 1>&2 || exit -1
-	fi
-}
-
-list_mods() {
-	$DBGCTL modules > $R/tmp/ogdb
-	echo "The GDB module script is in $R/tmp/ogdb"
-	[ "$DEBUG_WAIT" = "yes" ] && echo -n "Press ENTER to continue" && read < /dev/tty
-	return 0
-}
-
-# start acceptor for a given network and port.
-# not all networks need an acceptor
-start_acceptor() {
-	case $NETWORK in
-	elan)   [ "$PORT" ] && fail "$0: NETWORK is elan but PORT is set"
-		;;
-	tcp)    [ "$PORT" ] || fail "$0: NETWORK is tcp but PORT is not set"
-		$ACCEPTOR -r 1048576 -s 1048576 $PORT
-		;;
-	*) 	fail "$0: unknown NETWORK '$NETWORK'" ;;
-	esac
-
-}
-
-# We need at least one setup file to be given.  It can be passed on
-# the command-line, or it can be found in the home directory, or it
-# can even be sourced into the current shell environment.
-setup_opts() {
-	DEF=/etc/lustre/lustre.cfg
-	if [ "$#" = 0 -a -r $DEF ]; then
-		. $DEF && SETUP=y
-	fi
-
-	for CFG in "$@" ; do
-		case $CFG  in
-		*.cfg) [ -r "$CFG" ] && . $CFG && SETUP=y ;;
-		*) echo "unknown option '$CFG'" 1>&2
-		esac
-	done
-
-	if [ "$SETUP" != "y" ]; then
-		echo "error: no config file on command-line and no $DEF" 1>&2
-		exit -1
-	fi
-	
-	[ "$MDC_NAMES" ] || export MDC_NAMES=MDCDEV
-	[ "$OSC_NAMES" ] || export OSC_NAMES=OSCDEV
-	[ -z "$MOUNT_LIST" -a "$OSCMT" ] && export MOUNT_LIST="MT" && export MT="$OSCMT OSCDEV MDCDEV"
-}
-
-setup_variables() {
-	[ -z "$OSTNODE" ] && OSTNODE=$SERVER
-	[ -z "$MDSNODE" ] && MDSNODE=$SERVER
-	[ -z "$DLM" ] && DLM=$SERVER
-}
-
-setup_portals() {
-	setup_variables
-
-	if egrep -q "ksocknal|kqswnal" /proc/modules; then
-		echo "$0: portals already appears to be set up, skipping"
-		return 0
-	fi
-
-	if [ -z "$NETWORK" -o -z "$LOCALHOST" ]; then
-		echo "$0: NETWORK or LOCALHOST is not set" 1>&2
-		exit -1
-	fi
-
-	if [ -z "$OSTNODE" -a -z "$MDSNODE" -a -z "$DLM" ]; then
-		echo "$0: SERVER (or OSTNODE and MDSNODE and DLM) not set" 1>&2
-		exit -1
-	fi
-
-	[ -c /dev/portals ] || mknod /dev/portals c 10 240
-
-  	do_insmod $PORTALS/linux/oslib/portals.o || exit -1
-  	#do_insmod $PORTALS/linux/router/kptlrouter.o || exit -1
-
-	case $NETWORK in
-	elan)  do_insmod $PORTALS/linux/rqswnal/kqswnal.o || exit -1
-                MYNID=
-		RECV_MEM=
-		SEND_MEM=
-		    ;;
-	tcp)   do_insmod $PORTALS/linux/socknal/ksocknal.o || exit -1
-                MYNID="mynid $LOCALHOST"
-		RECV_MEM="recv_mem 1048576"
-		SEND_MEM="send_mem 1048576"
-		   ;;
-	*) 	fail "$0: unknown NETWORK '$NETWORK'" ;;
-	esac
-
-	start_acceptor
-
-	$PTLCTL <<- EOF
-	network $NETWORK
-	$SEND_MEM
-	$RECV_MEM
-	$MYNID
-	connect $DLM $PORT
-	add_uuid $DLM $DLM
-	add_uuid self $LOCALHOST
-	quit
-	EOF
-
-	if [ "$SETUP_MDS" -o "$SETUP_MDC" ]; then
-		$PTLCTL <<- EOF
-		network $NETWORK
-		connect $MDSNODE $PORT
-		add_uuid $MDSNODE $MDSNODE
-		quit
-		EOF
-	fi
-
-
-	if [ "$SETUP_OST" -o "$SETUP_OSC" ]; then
-		$PTLCTL <<- EOF
-		network $NETWORK
-		connect $OSTNODE $PORT
-		add_uuid $OSTNODE $OSTNODE
-		quit
-		EOF
-	fi
-}
-
-setup_lustre() {
-	[ -c /dev/obd ] || mknod /dev/obd c 10 241
-
-	do_insmod $LUSTRE/obdclass/obdclass.o || exit -1
-	do_insmod $LUSTRE/ptlrpc/ptlrpc.o || exit -1
-	do_insmod $LUSTRE/ldlm/ldlm.o || exit -1
-	do_insmod $LUSTRE/extN/extN.o || \
-		echo "info: can't load extN.o module, not fatal if using ext3"
-	do_insmod $LUSTRE/mds/mds.o || exit -1
-	#do_insmod $LUSTRE/obdclass/fsfilt_ext2.o || exit -1
-	#do_insmod $LUSTRE/obdclass/fsfilt_ext3.o || exit -1
-	do_insmod $LUSTRE/obdclass/fsfilt_extN.o || \
-		echo "info: can't load fsfilt_extN.o module, needs extN.o"
-	do_insmod $LUSTRE/obdecho/obdecho.o || exit -1
-	#do_insmod $LUSTRE/obdext2/obdext2.o || exit -1
-	do_insmod $LUSTRE/obdfilter/obdfilter.o || exit -1
-	do_insmod $LUSTRE/ost/ost.o || exit -1
-	do_insmod $LUSTRE/osc/osc.o || exit -1
-	do_insmod $LUSTRE/mdc/mdc.o || exit -1
-		do_insmod $LUSTRE/lov/lov.o || exit -1
-	do_insmod $LUSTRE/llite/llite.o || exit -1
-
-	echo "$R/tmp/lustre-log" > /proc/sys/portals/debug_path
-
-	if $OBDCTL name2dev RPCDEV > /dev/null 2>&1; then
-		echo "$0: RPCDEV is already configured, skipping"
-		return 0
-	fi
-	list_mods
-
-	$OBDCTL <<- EOF || return $?
-	newdev
-	attach ptlrpc RPCDEV
-	setup
-	quit
-	EOF
-
-	[ -d /mnt/lustre ] || mkdir /mnt/lustre
-}
-
-setup_ldlm() {
-	[ "$SETUP_LDLM" = "y" ] || return 0
-
-	[ -c /dev/portals ] || mknod /dev/portals c 10 240
-
-	$OBDCTL <<- EOF || return $?
-	newdev
-	attach ldlm LDLMDEV LDLMUUID
-	setup
-	quit
-	EOF
-}
-
-find_devno() {
-	if [ -z "$1" ]; then
-		echo "usage: $0 <devname>" 1>&2
-		return -1
-	fi
-
-	$OBDCTL name2dev $1
-}
-
-setup_mds() {
-	[ "$SETUP_MDS" = "y" ] || return 0
-
-	if [ -z "$MDSFS" -o -z "$MDSDEV" ]; then
-		echo "error: setup_mds: MDSFS or MDSDEV unset" 1>&2
-		return -1
-	fi
-
-	[ "$1" ] && DO_FS=$1
-	if [ "$DO_FS" != "new_fs" -a "$DO_FS" != "old_fs" ]; then
-		echo "usage: setup_mds {new_fs|old_fs}" 1>&2
-		return -1
-	fi
-
-	if $OBDCTL name2dev MDSDEV > /dev/null 2>&1; then
-		echo "$0: MDSDEV is already configured"
-		return 0
-	fi
-
-	$DO_FS ${MDSFS} ${MDSDEV} ${MDSSIZE}
-	MDS=${LOOPDEV}
-
-	$OBDCTL <<- EOF || return $?
-	newdev
-	attach mds MDSDEV MDSUUID
-	setup ${MDS} ${MDSFS}
-	quit
-	EOF
-}
-
-setup_mds_lov() { 
-	[ "$SETUP_MDS" = "y" ] || return 0
-
-	if [ -z "$LOVUUID" ]; then
-		echo "No LOV configured"
-			return
-	fi
-
-	$OBDCTL <<- EOF || return $?
-	name2dev MDSDEV
-	connect 
-	lov_setconfig ${LOVUUID} 1 65536 0 OSCDEV-`hostname`
-	disconnect
-	quit
-	EOF
-}
-
-
-setup_ost() {
-	[ "$SETUP_OST" = "y" ] || return 0
-
-	if [ -z "$OSTTYPE" ]; then
-		echo "error: setup_ost: OSTTYPE unset" 1>&2
-		return -1
-	fi
-
-	case $OSTTYPE in
-	obdecho)	OBD=
-			OBDARG=
-			NEED_FS=n
-		;;
-	obdext2)	OBDARG=
-			NEED_FS=y
-		;;
-	obdfilter)	OBDARG=$OSTFS
-			NEED_FS=y
-		;;
-	*)	echo "error: setup_ost: unknown OSTTYPE '$OSTTYPE'" 1>&2
-		return -1
-		;;
-	esac
-
-	if $OBDCTL name2dev OBDDEV > /dev/null 2>&1; then
-		echo "$0: OBDDEV is already configured"
-		return 0
-	fi
-
-	if [ "$NEED_FS" = "y" ]; then
-		[ "$1" ] && DO_FS=$1
-		if [ -z "$OSTFS" -o -z "$OSTDEV" ]; then
-			echo "error: setup_ost: OSTFS or OSTDEV unset" 1>&2
-			return -1
-		fi
-
-		if [ "$DO_FS" != "new_fs" -a "$DO_FS" != "old_fs" ]; then
-			echo "usage: setup_ost {new_fs|old_fs}" 1>&2
-			return -1
-		fi
-
-		$DO_FS ${OSTFS} ${OSTDEV} ${OSTSIZE}
-		OBD=${LOOPDEV}
-	fi
-
-	$OBDCTL <<- EOF || return $?
-	newdev
-	attach ${OSTTYPE} OBDDEV OBDUUID
-	setup ${OBD} ${OBDARG}
-	quit
-	EOF
-
-	$OBDCTL <<- EOF || return $?
-	newdev
-	attach ost OSTDEV OSTUUID
-	setup OBDUUID
-	quit
-	EOF
-}
-
-setup_server() {
-	#setup_mds $1 && setup_mds_lov $1 && setup_ost $1
-	setup_mds $1 && setup_ost $1
-}
-
-setup_osc() {
-	[ "$SETUP_OSC" != "y" ] && return 0
-	[ "$OSC_NAMES" ] || OSC_NAMES=OSCDEV
-
-	for THEOSC in $OSC_NAMES ; do 
-		if $OBDCTL name2dev $THEOSC > /dev/null 2>&1; then
-			echo "$0: OSCDEV is already configured"
-			continue
-		fi
-
-		[ -z "$OBD_UUID" ] && OBD_UUID="OBDUUID"
-		$OBDCTL <<- EOF || return $rc
-		newdev
-		attach osc $THEOSC ${THEOSC}-`hostname`
-		setup $OBD_UUID $OSTNODE
-		quit
-		EOF
-	done
-}
-
-setup_mdc() {
-	[ "$SETUP_MDC" != "y" ] && return 0
-	[ "$MDC_NAMES" ] || MDC_NAMES=MDCDEV
-
-	for THEMDC in $MDC_NAMES ; do 
-		if $OBDCTL name2dev $THEMDC > /dev/null 2>&1; then
-			echo "$0: MDCDEV is already configured"
-			continue
-		fi
-
-		$OBDCTL <<- EOF || return $?
-		newdev
-		attach mdc $THEMDC ${THEMDC}-`hostname`
-		setup MDSUUID $MDSNODE
-		quit
-		EOF
-	done
-}
-
-setup_lov () { 
-	[ "$SETUP_MDC" != "y" ] && return 0
-
-	if [ -z "$LOVUUID" ]; then
-		echo "No LOV configured"
-		return
-	fi
-
-	$OBDCTL <<- EOF || return $?
-	newdev
-	attach lov LOVNAME ${LOVUUID}
-	setup MDCDEV-`hostname`
-	quit
-	EOF
-}        
-
-
-setup_mount() {
-	[ "$SETUP_MOUNT" != "y" ] && return 0
-
-	[ "$MOUNT_LIST" ] || fail "error: $0: MOUNT_LIST unset"
-
-	for THEMOUNT in $MOUNT_LIST; do
-	    eval "echo \$$THEMOUNT" | while read MTPT THEOSC THEMDC; do
-		if mount | grep -q $MTPT; then
-		    echo "$0: $MTPT is already mounted"
-		    return 0
-		fi
-
-		[ ! -d $MTPT ] && mkdir $MTPT
-		echo mount -t lustre_lite -o osc=${THEOSC}-`hostname`,mdc=${THEMDC}-`hostname` none $MTPT
-		mount -t lustre_lite -o osc=${THEOSC}-`hostname`,mdc=${THEMDC}-`hostname` none $MTPT
-	    done
-	done
-}
-
-setup_client() {
-	# setup_osc && setup_mdc && setup_lov  && setup_mount
-	setup_osc && setup_mdc && setup_mount
-}
-
-DEBUG_ON="echo 0xffffffff > /proc/sys/portals/debug"
-DEBUG_OFF="echo 0 > /proc/sys/portals/debug"
-
-debug_server_off() {
-	echo "Turn OFF debug" && eval "$DEBUG_OFF"
-}
-
-debug_server_on() {
-	echo "Turn ON debug" && eval "$DEBUG_ON"
-}
-
-debug_client_off() {
-	echo "Turning OFF debug on client" && eval "$DEBUG_OFF"
-}
-
-debug_client_on() {
-	echo "Turning ON debug on client" && eval "$DEBUG_ON"
-}
-
-cleanup_portals() {
-	[ -z "$NETWORK" ] && NETWORK=tcp
-
-	setup_variables
-
-	$PTLCTL <<- EOF
-	network $NETWORK
-	disconnect
-	del_uuid self
-	del_uuid $MDSNODE
-	del_uuid $OSTNODE
-	del_uuid $DLM
-	quit
-	EOF
-
-	do_rmmod ldlm
-	do_rmmod ptlrpc
-	do_rmmod obdclass
-
-	do_rmmod kqswnal
-	do_rmmod ksocknal
-	do_rmmod kptlrouter
-
-        [ "$TIME" ] && $DBGCTL debug_kernel $R/tmp/debug.5.$TIME
-
-	do_rmmod portals
-}
-
-cleanup_lustre() {
-	killall acceptor
-
-	do_rmmod llite
-	do_rmmod lov
-	do_rmmod mdc
-	do_rmmod osc
-
-	do_rmmod fsfilt_extN
-	do_rmmod fsfilt_ext3
-	do_rmmod fsfilt_ext2
-	do_rmmod mds
-	do_rmmod ost
-	do_rmmod obdecho
-	do_rmmod obdfilter
-	do_rmmod obdext2
-	do_rmmod extN
-
-	losetup -d ${LOOP}0
-	losetup -d ${LOOP}1
-	losetup -d ${LOOP}2
-}
-
-cleanup_ldlm() {
-	[ "$SETUP" -a -z "$SETUP_LDLM" ] && return 0
-
-	LDLMDEVNO=`find_devno LDLMDEV`
-	if [ "$LDLMDEVNO" ]; then
-		$OBDCTL <<- EOF
-		device $LDLMDEVNO
-		cleanup
-		detach
-		quit
-		EOF
-	fi
-}
-
-cleanup_mds() {
-	[ "$SETUP" -a -z "$SETUP_MDS" ] && return 0
-
-	MDSDEVNO=`find_devno MDSDEV`
-	if [ "$MDSDEVNO" ]; then
-		$OBDCTL <<- EOF
-		device $MDSDEVNO
-		cleanup
-		detach
-		quit
-		EOF
-	fi
-}
-
-cleanup_ost() {
-	[ "$SETUP" -a -z "$SETUP_OST" ] && return 0
-
-	OSTDEVNO=`find_devno OSTDEV`
-	if [ "$OSTDEVNO" ]; then
-		$OBDCTL <<- EOF
-		device $OSTDEVNO
-		cleanup
-		detach
-		quit
-		EOF
-	fi
-
-	OBDDEVNO=`find_devno OBDDEV`
-	if [ "$OBDDEVNO" ]; then
-		$OBDCTL <<- EOF
-		device $OBDDEVNO
-		cleanup
-		detach
-		quit
-		EOF
-	fi
-}
-
-cleanup_server() {
-	cleanup_ost && cleanup_mds
-}
-
-cleanup_mount() {
-	[ "$SETUP_MOUNT" != "y" ] && return 0
-
-	[ "$MOUNT_LIST" ] || fail "error: $0: MOUNT_LIST unset"
-
-	for THEMOUNT in $MOUNT_LIST; do
-		eval "echo \$$THEMOUNT" | while read MTPT THEOSC THEMDC; do
-			if [ "`mount | grep $MTPT`" ]; then
-				umount $MTPT || fail "unable to unmount $MTPT"
-			fi
-		done
-	done
-}
-
-cleanup_osc() {
-	[ "$SETUP" -a -z "$SETUP_OSC" ] && return 0
-	[ "$OSC_NAMES" ] || OSC_NAMES=OSCDEV
-
-	for THEOSC in $OSC_NAMES ; do 
-		OSCDEVNO=`find_devno $THEOSC`
-		if [ "$OSCDEVNO" ]; then
-			$OBDCTL <<- EOF
-			device $OSCDEVNO
-			cleanup
-			detach
-			quit
-			EOF
-		fi
-	done
-}
-
-cleanup_mdc() {
-	[ "$SETUP" -a -z "$SETUP_MDC" ] && return 0
-	[ "$MDC_NAMES" ] || MDC_NAMES=MDCDEV
-
-	for THEMDC in $MDC_NAMES ; do 
-		MDCDEVNO=`find_devno $THEMDC`
-		if [ "$MDCDEVNO" ]; then
-			$OBDCTL <<- EOF
-			device $MDCDEVNO
-			cleanup
-			detach
-			quit
-			EOF
-		fi
-	done
-}
-
-cleanup_rpc() {
-	RPCDEVNO=`find_devno RPCDEV`
-	if [ "$RPCDEVNO" ]; then
-		$OBDCTL <<- EOF
-		device $RPCDEVNO
-		cleanup
-		detach
-		quit
-		EOF
-	fi
-}
-
-cleanup_client() {
-	cleanup_mount && cleanup_osc && cleanup_mdc && cleanup_rpc
-}
-
-fail() { 
-	echo "ERROR: $1" 1>&2
-	[ $2 ] && RC=$2 || RC=1
-	exit $RC
-}
diff --git a/lustre/tests/elan-client.cfg b/lustre/tests/elan-client.cfg
deleted file mode 100644
index 120b605268..0000000000
--- a/lustre/tests/elan-client.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-# Config file for setting up a remote server with a real OST
-NETWORK=elan
-LOCALHOST=5
-SERVER=4
diff --git a/lustre/tests/elan-server.cfg b/lustre/tests/elan-server.cfg
deleted file mode 100644
index 7520840eba..0000000000
--- a/lustre/tests/elan-server.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-# Config file for setting up a remote server with a real OST
-NETWORK=elan
-LOCALHOST=4
-SERVER=4
diff --git a/lustre/tests/ext2_10000.gz b/lustre/tests/ext2_10000.gz
deleted file mode 100644
index e700ad021894b9a311eb82fd2870eb3c9cdc906d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 10228
zcmb2|=HR%vaG?zob4dxqn;U!eSOO*39vG*qmaT1ZTO6b;6zI8a!R3I6H@qEQIgLS&
zm|_}q&DS|UXA|L?8?@PRQE<Vx>u%d7Dy(_#d2gn%aeCUM^)t?tJ2CuQz1xW+TvI)B
z&-`!Zt>1p$@U+NXZkcZxuN`~+^-_UlPCpg7BX?b~x|gx#-ASwSI%RpU?Uq;8<$f#r
z_bq8}QRP3Ay*qvuE&Ig4@Zs~U|Ic?$nRxC0e_ur{P6h@Bp1Ie{yFPOEuLrU}wD-Jv
zx<BD93y@v6HBW!{l=V}0{X8kRYvU}l$<6oXbN}2|nR=S{KzU7l7+Y<9(u|k0w@=+P
zchlscKr^70Q9ybKG|Zb}B)4hD1?l5ECh&D-*4P`0eP7+~UR-_kadYfeCI*Iv{i}W~
z{9ivW<NJT0=?5mv3;_x<T=>rnB!AVDZsDko(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7
zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@Rz!Cxt
x+rK@S01|h&@c;Tg14b-LMukR0U^E0qLtr!nMnhn@gus4=%TYIi864&?007gFqXqx~

diff --git a/lustre/tests/ext2_25000.gz b/lustre/tests/ext2_25000.gz
deleted file mode 100644
index 122ed792d8accfd9ecbcf02cec89ffe4acc137c5..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 25136
zcmeI(-%Ha`7{~FWfsRTdkba{uqZ>oUqLirgBB>TMu>!M5Z$vV35xY<_S`BPER*NwN
zEtv(eEpXwOl9f&(Rw27c=+|&gyKvyj<=8L7zD@s$ki9<_=kQz{&Us$f&nY&_WV>c<
zM{+kbwP}?N%7Y4pLPP>bPrt1x%nMo0)znY4ZrfgcV!*A}-*p?^eHDhf<FAtHims3=
zTAuQ}+;nEtZhUGRIkfd*x21X^=G}cmGZxz1^QcO$lblnAuc{00<@fiMd^ZI<F7G}3
zM%$fs^!<2e_*QpwQeNtNp49k;=K4KzLrce|)6)yT1O5-HcxX1-GT1&mxFm$4Z8{lK
zeLSh1kpiYmr-TrV;ny8a_199({SBF_^NW3W%h*a$o)A%=^_DtW8C2>cBfom4o&^`v
z)*XMY2OXaaQ(f_9$IP<DH+e7Sul1iTt1Yt@WKI(VvRy#eAXo2vuwOH_INyGtpyi6x
z`lMGgl1R*#U;O#Fz>_P4Zrqu0NVj{#aVdl4H9JakGJ9BBT~{iz-H-keKmY**5I_I{
z1Q0*~0R#|0009ILKmY**5I_I{1Q0;re+sxF6L;3`H%nJb>`sCJ0tg_000IagfB*sr
zAb<b@2q1s}0tg_000IagfB*srAb<b@>s{bQetzbQvk+B(T_)RlZ-)0HfB*srAb<b@
z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0fb&z)9`ouffNWVBEgo1K3s^0)KHl>h
L_r^wH>&*EFvEw*O

diff --git a/lustre/tests/ext3_10000.gz b/lustre/tests/ext3_10000.gz
deleted file mode 100644
index b372fbdeaf91970c5b33eb16ade22e901894745b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12172
zcmeIzeNYo;8UXNAPQZakJIv`doMjwZJ;#e5r7Krxw2VC{dQl*fzy=bnD6-4PC@$1!
zNExs3Ivk?s2W>2Z@|A?_rie>wAYkh$wTQJPyIbPL)N+dK3c|sP1d<%R|8C~~@y{FI
z=bv|;d7pXTd4A73^F~*OhE`GM-dPZ|=fi`s;`Qt1L-6=6=DfV8;_CgH>WKVjq4_8N
zc6xFCs+3hDFP~VGn0`7be^FD^!p6=-(TH3$QuI>OE?p>V=f(zoz3rD6?4D<G<K(Tb
z*u1erb#Iq=hHqUJj0dR5YZ2l9NKGJnZmtUonid8IClc%8zTomC6EhROCkdMK6%}nE
zXLVX*#RdO?LnDg75qD~xXZSC5fx(}?donaI6iGb$#uDRj-17J0*sT+e;Qlx7Z{lWz
z!*2u&KI-vKP0rk@)5$%#pU&!|bKe&T1V4ohp9&=C{R)vSZsSV=!AH8~*WjR;1(w?R
z&8s?YZOP#Fp5ECS|7RtS6ifHT{xe$QzoVOWyB~<-#ur}Zit37n1Dz$~?WkV#n>Qys
zMYb(C+)A-zlD37mkjSXF2$ylRM*mdj_s0e{X#%glHU31e+xaovCO4lEM$KOX;`s%x
zs)gp0!FthKKJ|2n(9j(g(-HXE7!&R)sKjlbl^zv$xQ|G7FPuL(U{0Egm<-sGeFgrA
z`TWRN;p=}jzwZ1`_GuvKmztWK*y+!cr_gcFk_G;*1n01C<^Ot0IxJzn`g!7+C$ndR
zQHVCUzT9AvqU~N)p-SnTM*Cdm4x$jb>mtfi?=lfwGP!v)Gl9BIZXJa?sWE=Yn=+bq
zm{yTxqq14LoF8!YEH(yl_1-LB*J5Hbdnewq*c!ur6K_6F>}G$ACyrYq*`<76eA_nj
zDNccHsfAmp5iF@TD~}q)w$&<!sTnLWCvz!v9ZSi9Yp4g<AANSh(#o>-W&-C}ul+)~
zERL39CGK<^U5Fiar<Kt;SeaWkO&4=znA)w5a31ATCE3-^27Xp!dCj_#y{R#uC-T@q
z4RPMOl)bJosR#v2X>gS_j*Z~=Ix>oxXl^^d&7pik&GL!b%xJ2Yzu6Kf*v!k0B9BDb
z*PJ!Tk0L^EeFgcu$dp8+Ax=?x1N8_>s>)ImZOCI$%ME-2nKRU{uzbR<hW1O-Ptm#1
zAuZW#T!oqq_GVK)heA10b*%HRkgPwu-D!c8{VKKfZRED0^&xQxxo5C;r%f^o$erRH
zVN4u)6282o^*Z_qe5pHQEA<2UC$X}RvY|8Z1-a!6@&Im<;}pWf4c#)7hRIT`jW%JZ
z0|rz4?<uAT!`V4&B6Ltl>|(b<1wzF&CKURhYDWz7I|vb)zDK4+4L2-nnM|m(N;X7)
z2$f4yBkA|}Glnl$m{QP7hOTZ{<~$8$NOK09mwD1aG+SRqZWv5^i7bRR;CroB=C@E@
ze?|%O4piK)@EB*%3iyj9=8w5^<ojZ{lKPo^Pn_j3Hz6Z%^I7}>dzU<dr>>^AkO%Pe
zRvIBSc$&uqp*Y;xt>m0`QiZFdoO&{?F#DXdnat8!H(15&EV-vJL&<C)3kwySjHBE!
zzQJ{&)KZHKyP8UIH!|(r?`wQ&l%Q5u=Tnmw?eXT1szaO=SgOxbt_oq6WBZoLk1?-c
zxyv$=ne|w~GDR=5h_CeSsm)wT-Q-*2o3`Nt>{NWiZA&}*IKJgJKFQA6>(^K+*`Mu=
zYw$kyU-paTISM)h!*XN{jbU1MYL6+3Yqno0GAX$ZyJO6lz!CP&G1Fnr#&_DSW7ZJ%
zD~<6rBANZ(tCh&BnMgiYlChnM<qIT=@0c+D1ILcF%xWHS$gNBie@xSU&urtW`4&yf
zJ$#z=dFwY?s@WlLW3YY<4DtVdh{0ukre0(ZX4dgdq7HrQee}<wwj}dO^t6c7JNH4F
zs<hp74Qdf}-Z1S)yF@)JjEm5V-YwGXQ_e;xOR7@itB`LE=4K)vad}~>Vt@&UcK7dy
zWquE#{qlB(L5~~SADXYA=MA=pt;Nnc@?CLe81*&Z4>vBsuOk!i#j}=TDxEwimi5sG
z_))l9Zu~Xc1YePxGD4IC&+}t~S|9)ffB+Bx0zd!=00AHX1b_e#00KY&2mk>f00e*l
z5C8%|00;m9AOHkj00BQP`NQkK^!f5sfQ$=&0XhaP0s$ZZ1b_e#00J+vz}&)}%Xj4n
I-u+zgZ_NV*-2eap

diff --git a/lustre/tests/fs.sh b/lustre/tests/fs.sh
deleted file mode 100644
index b158c6e055..0000000000
--- a/lustre/tests/fs.sh
+++ /dev/null
@@ -1,27 +0,0 @@
-#! /bin/bash
-# Copyright (C) 2001  Cluster File Systems, Inc.
-#
-# This code is issued under the GNU General Public License.
-# See the file COPYING in this distribution
-#!/bin/sh
-
-R=/r
-
-insmod /lib/modules/2.4.17/kernel/drivers/block/loop.o
-dd if=/dev/zero of=/tmp/fs bs=1024 count=10000
-mke2fs -b 4096 -F /tmp/fs
-losetup /dev/loop/0 /tmp/fs
-
-insmod $R/usr/src/lustre/obdclass/obdclass.o 
-insmod $R/usr/src/lustre/obdext2/obdext2.o
-mknod /dev/obd c 10 241
-
-$R/usr/src/lustre/utils/obdctl <<EOF
-device 0
-attach obdext2 OBDEXT2DEV
-setup /dev/loop/0
-quit
-EOF
-
-insmod $R/usr/src/lustre/obdfs/obdfs.o
-mount -t obdfs -o device=0 none /mnt
diff --git a/lustre/tests/intent-test.sh b/lustre/tests/intent-test.sh
deleted file mode 100755
index 9113f17a9a..0000000000
--- a/lustre/tests/intent-test.sh
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/bin/bash -x
-
-MTPT=/mnt/lustre
-
-remount() {
-    umount $MTPT || exit -1
-    debugctl clear
-    mount -t lustre_lite -o osc=OSCDEV-UUID,mdc=MDCDEV-UUID none $MTPT
-}
-
-# Test mkdir
-mkdir $MTPT/dir
-mkdir $MTPT/dir2
-
-# Test mkdir on existing directory
-mkdir $MTPT/dir
-
-remount
-
-# Test mkdir on existing directory with no locks already held
-mkdir $MTPT/dir
-
-remount
-
-# Use mknod to create a file
-./mcreate $MTPT/file
-# ...on an existing file.
-./mcreate $MTPT/file
-
-remount
-
-# Use mknod to create a file with no locks already held
-./mcreate $MTPT/file
-
-remount
-
-ls -l $MTPT/file
-
-remount
-
-cat $MTPT/file
-./mcreate $MTPT/file2
-cat $MTPT/file2
-./mcreate $MTPT/file3
-
-remount
-
-./tchmod 777 $MTPT/file3
-
-remount
-
-./mcreate $MTPT/file4
-./tchmod 777 $MTPT/file4
-
-remount
-
-ls -l $MTPT/file4
-./tchmod 777 $MTPT/file4
-
-remount
-
-cat $MTPT/file4
-./tchmod 777 $MTPT/file4
-
-remount
-
-touch $MTPT/file5
-touch $MTPT/file6
-touch $MTPT/file5
-
-remount
-
-touch $MTPT/file5
-
-remount
-
-echo foo >> $MTPT/file
-cat $MTPT/file
-
-remount
-
-cat $MTPT/file
-
-echo foo >> $MTPT/iotest
-echo bar >> $MTPT/iotest
-cat $MTPT/iotest
-
-remount
-
-cat $MTPT/iotest
-echo baz >> $MTPT/iotest
-
-remount
-
-ls $MTPT
-
-remount
-
-mkdir $MTPT/new
-ls $MTPT
-
-remount
-
-ls $MTPT
-mkdir $MTPT/newer
-ls $MTPT
-
-remount
-
-cat $MTPT/iotest
-echo "Testing truncation..."
-echo foo > $MTPT/iotest
-echo bar >> $MTPT/iotest
-cat  $MTPT/iotest
-echo "trucating to 4 bytes now..."
-./truncate $MTPT/iotest 4
-cat  $MTPT/iotest
-
-remount
-
-ls $MTPT
-rmdir $MTPT/foo
diff --git a/lustre/tests/intent-test2.sh b/lustre/tests/intent-test2.sh
deleted file mode 100644
index 428039c2b0..0000000000
--- a/lustre/tests/intent-test2.sh
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/bin/bash
-
-SRCDIR="`dirname $0`"
-. $SRCDIR/common.sh
-
-setup_opts "$@"
-
-set -vx
-
-MTPT1=/mnt/lustre1
-MTPT2=/mnt/lustre2
-
-remount() {
-    umount $MTPT1 || exit -1
-    umount $MTPT2 || exit -1
-    debugctl clear
-    setup_mount || fail "cannot remount /mnt/lustre"
-}
-
-fail() {
-    echo "unexpected failure"
-    exit -1
-}
-
-[ "`mount | grep $MTPT1`" ] || . llsetup.sh "$@" || exit -1
-
-mkdir $MTPT1/dir1 || fail
-echo "Next mkdir should fail"
-mkdir $MTPT2/dir1 && fail
-mkdir $MTPT2/dir2 || fail
-echo "Next mkdirs should fail"
-mkdir $MTPT1/dir2 && fail
-
-remount
-
-echo "Next 2 mkdir should fail"
-mkdir $MTPT2/dir1 && fail
-mkdir $MTPT1/dir2 && fail
-
-./mcreate $MTPT2/file1
-echo "Next mcreate should fail"
-./mcreate $MTPT2/file1 && fail
-./mcreate $MTPT2/file2 || fail
-echo "Next mcreate should fail"
-./mcreate $MTPT1/file2 && fail
-
-remount
-
-echo "Next 2 mcreates should fail"
-./mcreate $MTPT2/file1 && fail
-./mcreate $MTPT1/file2 && fail
-
-rmdir $MTPT1/dir2 || fail
-echo "Next rmdir should fail"
-rmdir $MTPT2/dir2 && fail
-rmdir $MTPT2/dir1 || fail
-
-remount
-
-echo "Next rpmdir should fail"
-
-echo "File I/O: you should see increasing sequences of contiguous numbers"
-echo 1 >> $MTPT1/file1
-cat $MTPT2/file1
-echo 2 >> $MTPT2/file1
-cat $MTPT1/file1
-echo 3 >> $MTPT2/file1
-cat $MTPT1/file1
-echo 4 >> $MTPT1/file1
-cat $MTPT1/file1
diff --git a/lustre/tests/ldlm.cfg b/lustre/tests/ldlm.cfg
deleted file mode 100644
index 054f98349c..0000000000
--- a/lustre/tests/ldlm.cfg
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-# Config file for setting up the lock manager
-SETUP_LDLM=y
diff --git a/lustre/tests/llcleanup.sh b/lustre/tests/llcleanup.sh
deleted file mode 100755
index b718e9356f..0000000000
--- a/lustre/tests/llcleanup.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/sh
-
-SRCDIR="`dirname $0`/"
-[ -f $SRCDIR/common.sh ] || SRCDIR="/lib/lustre"
-
-. $SRCDIR/common.sh
-
-setup_opts "$@"
-
-TIME=`date +'%s'`
-
-$DBGCTL debug_kernel /tmp/debug.1.$TIME
-cleanup_client
-$DBGCTL debug_kernel /tmp/debug.2.$TIME
-cleanup_server
-
-cleanup_ldlm
-cleanup_lustre
-cleanup_portals
diff --git a/lustre/tests/lldlm.sh b/lustre/tests/lldlm.sh
deleted file mode 100755
index 58da4708f8..0000000000
--- a/lustre/tests/lldlm.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/sh
-
-SRCDIR="`dirname $0`/"
-. $SRCDIR/common.sh
-
-export DEBUG_WAIT=yes
-. $SRCDIR/llsetup.sh $SRCDIR/net-local.cfg $SRCDIR/ldlm.cfg $SRCDIR/obdecho.cfg $SRCDIR/client-echo.cfg || exit 2
-
-cat <<EOF
-**********************************************
-To run tests, use $OBDCTL.
-$OBDCTL
-device `$OBDCTL name2dev OSCDEV`
-probe
-
-To test basic locking functionality:
-test_ldlm
-
-The regression stress test will start some
-number of threads, each locking and unlocking
-extents from a set of resources. To run it:
-ldlm_regress_start [numthreads [refheld [numres [numext]]]] 
-numthreads is the number of threads to start.
-       (default 1)
-refheld is the total number of resources to hold,
-       between all the threads. Once this number
-       is reached, every time a lock is granted
-       or matched, the oldest reference is
-       decremented.
-       (default 10)
-numres is the number of resources to use
-       (default 10)
-numext is the number of extents to divide
-       each resource into
-       (default 10)
-
-To stop the test:
-ldlm_regress_stop
-**********************************************
-EOF
diff --git a/lustre/tests/llext3.sh b/lustre/tests/llext3.sh
deleted file mode 100755
index 9826ac7fb2..0000000000
--- a/lustre/tests/llext3.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-
-SRCDIR="`dirname $0`/"
-. $SRCDIR/common.sh
-
-export DEBUG_WAIT=yes
-. $SRCDIR/llsetup.sh $SRCDIR/net-local.cfg $SRCDIR/client-mount.cfg $SRCDIR/mds.cfg $SRCDIR/obdext2.cfg || exit 2
-
-debug_client_on
-#debug_client_off
diff --git a/lustre/tests/llmodules.sh b/lustre/tests/llmodules.sh
deleted file mode 100644
index a39b73c329..0000000000
--- a/lustre/tests/llmodules.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/sh
-
-SRCDIR="`dirname $0`/"
-[ -f $SRCDIR/common.sh ] || SRCDIR="/lib/lustre"
-
-. $SRCDIR/common.sh
-
-setup_opts "$@"
-
-[ -c /dev/portals ] || mknod /dev/portals c 10 240
-do_insmod $PORTALS/linux/oslib/portals.o || exit -1
-case $NETWORK in
-elan)  do_insmod $PORTALS/linux/rqswnal/kqswnal.o || exit -1
-	    ;;
-tcp)   do_insmod $PORTALS/linux/socknal/ksocknal.o || exit -1
-	   ;;
-*) 	fail "$0: unknown NETWORK '$NETWORK'" ;;
-esac
-
-[ -c /dev/obd ] || mknod /dev/obd c 10 241
-
-do_insmod $LUSTRE/obdclass/obdclass.o || exit -1
-do_insmod $LUSTRE/ptlrpc/ptlrpc.o || exit -1
-do_insmod $LUSTRE/ldlm/ldlm.o || exit -1
-do_insmod $LUSTRE/extN/extN.o || \
-    echo "info: can't load extN.o module, not fatal if using ext3"
-do_insmod $LUSTRE/mds/mds.o || exit -1
-do_insmod $LUSTRE/obdclass/fsfilt_extN.o || \
-    echo "info: can't load fsfilt_extN.o module, needs extN.o"
-do_insmod $LUSTRE/obdecho/obdecho.o || exit -1
-do_insmod $LUSTRE/obdfilter/obdfilter.o || exit -1
-do_insmod $LUSTRE/ost/ost.o || exit -1
-do_insmod $LUSTRE/osc/osc.o || exit -1
-do_insmod $LUSTRE/mdc/mdc.o || exit -1
-do_insmod $LUSTRE/lov/lov.o || exit -1
-do_insmod $LUSTRE/llite/llite.o || exit -1
-echo "$R/tmp/lustre-log" > /proc/sys/portals/debug_path
-
-list_mods
-
-
diff --git a/lustre/tests/llmount-client.sh b/lustre/tests/llmount-client.sh
deleted file mode 100644
index 503f93fc10..0000000000
--- a/lustre/tests/llmount-client.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/sh
-SRCDIR="`dirname $0`/"
-. $SRCDIR/common.sh
-
-export DEBUG_WAIT=yes
-. $SRCDIR/llsetup.sh $SRCDIR/net-client.cfg $SRCDIR/ldlm.cfg $SRCDIR/client-mount.cfg || exit 2
-
-debug_client_on
-#debug_client_off
diff --git a/lustre/tests/llmount-server.sh b/lustre/tests/llmount-server.sh
deleted file mode 100644
index d31f033509..0000000000
--- a/lustre/tests/llmount-server.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/sh
-SRCDIR="`dirname $0`/"
-. $SRCDIR/common.sh
-
-export DEBUG_WAIT=yes
-. $SRCDIR/llsetup.sh $SRCDIR/net-server.cfg $SRCDIR/ldlm.cfg $SRCDIR/mds.cfg $SRCDIR/obdfilter.cfg || exit 2
-
-debug_client_on
-#debug_client_off
diff --git a/lustre/tests/llrext3.sh b/lustre/tests/llrext3.sh
deleted file mode 100755
index c47fe9b94a..0000000000
--- a/lustre/tests/llrext3.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-
-SRCDIR="`dirname $0`/"
-. $SRCDIR/common.sh
-
-export DEBUG_WAIT=yes
-. $SRCDIR/llrsetup.sh $SRCDIR/net-local.cfg $SRCDIR/client-mount.cfg $SRCDIR/mds.cfg $SRCDIR/obdext2.cfg || exit 2
-
-debug_client_on
-#debug_client_off
diff --git a/lustre/tests/llrsetup.sh b/lustre/tests/llrsetup.sh
deleted file mode 100644
index 44bfcae442..0000000000
--- a/lustre/tests/llrsetup.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-
-SRCDIR="`dirname $0`/"
-[ -f $SRCDIR/common.sh ] || SRCDIR="/lib/lustre"
-
-. $SRCDIR/common.sh
-
-setup_opts "$@"
-
-setup_portals
-setup_lustre
-setup_ldlm
-
-setup_server old_fs
-setup_client
diff --git a/lustre/tests/llsetup.sh b/lustre/tests/llsetup.sh
deleted file mode 100644
index 4828f26849..0000000000
--- a/lustre/tests/llsetup.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh -vx
-
-SRCDIR="`dirname $0`/"
-[ -f $SRCDIR/common.sh ] || SRCDIR="/lib/lustre"
-
-. $SRCDIR/common.sh
-
-setup_opts "$@"
-
-setup_portals || exit $?
-setup_lustre || exit $?
-setup_ldlm || exit $?
-
-setup_server new_fs || exit $?
-setup_client || exit $?
diff --git a/lustre/tests/llsimple.sh b/lustre/tests/llsimple.sh
deleted file mode 100755
index d22ddc6eaa..0000000000
--- a/lustre/tests/llsimple.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-SRCDIR="`dirname $0`/"
-[ -f $SRCDIR/common.sh ] || SRCDIR="/lib/lustre"
-
-. $SRCDIR/common.sh
-
-setup_opts "$@"
-
-setup_portals || exit $?
-setup_lustre || exit $?
diff --git a/lustre/tests/lustre.cfg b/lustre/tests/lustre.cfg
deleted file mode 100644
index cc97b1b014..0000000000
--- a/lustre/tests/lustre.cfg
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/bin/sh
-
-### REMOVE THE FOLLOWING LINES IN ORDER TO TEST LUSTRE WITH THIS CONFIG ###
-echo "lustre: edit /etc/lustre/lustre.cfg to enable, exiting" 1>&2
-exit 1
-
-# Common configuration options
-# Config file for setting up a local OST and MDS server
-NETWORK=tcp
-LOCALHOST=`hostname`
-SERVER=$LOCALHOST
-OSTNODE=$LOCALHOST
-CLIENTS=*
-PORT=988
-
-# Set up the lock manager (required)
-SETUP_LDLM=y
-
-#case `echo $LOCALHOST | sed "s/\.[^|]*//"` in
-case $LOCALHOST in
-$SERVER)
-	# Config for setting up a metadata server
-	MDSFS=extN
-	MDSDEV=/tmp/mds
-	MDSSIZE=50000
-	SETUP_MDS=y
-	;;
-esac
-
-case $LOCALHOST in
-$OSTNODE)
-	# Config for setting up an object storage target with obdfilter
-	OSTDEV=/tmp/ost
-	OSTSIZE=200000
-	OSTFS=extN
-	OSTTYPE=obdfilter
-	SETUP_OST=y
-	;;
-esac
-
-case $LOCALHOST in
-$CLIENTS)
-	# Config for setting up a client filesystem mount
-	SETUP_MDC=y
-	SETUP_OSC=y
-	OSCMT=/mnt/lustre
-	SETUP_MOUNT=y
-	;;
-esac
diff --git a/lustre/tests/mdcreq.sh b/lustre/tests/mdcreq.sh
deleted file mode 100644
index bd54c9651a..0000000000
--- a/lustre/tests/mdcreq.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/sh
-
-SRCDIR="`dirname $0`"
-. $SRCDIR/common.sh
-
-NETWORK=tcp
-LOCALHOST=localhost
-SERVER=localhost
-PORT=988
-TMP=${TMP:-/tmp}
-
-setup_portals
-setup_lustre
-
-MDSFS=ext2
-new_fs ${MDSFS} $TMP/mds 1000
-MDS=$LOOPDEV
-
-echo 0xffffffff > /proc/sys/portals/debug
-
-$OBDCTL <<EOF
-device 0
-attach mds MDSDEV
-setup ${MDS} ${MDSFS}
-quit
-EOF
-
-mknod /dev/request c 10 244
-
-./testreq --getattr
-./testreq --setattr
-./testreq --readpage
-./testreq --open
-./testreq --close junk_file_handle
-./testreq --create
-
-echo "Done."
diff --git a/lustre/tests/mdcreqcleanup.sh b/lustre/tests/mdcreqcleanup.sh
deleted file mode 100755
index 3cacfbd910..0000000000
--- a/lustre/tests/mdcreqcleanup.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/sh
-
-SRCDIR="`dirname $0`/"
-. $SRCDIR/common.sh
-
-rmmod llite
-rmmod mdc
-
-$OBDCTL <<EOF
-device 0
-cleanup
-detach
-quit
-EOF
-
-rmmod mds
-rmmod osc
-rmmod ost
-rmmod obdext2
-rmmod obdclass
-rmmod ptlrpc
-
-$PTLCTL <<EOF
-setup tcp
-disconnect localhost
-del_uuid self
-del_uuid mds
-EOF
-
-losetup -d ${LOOP}0
-
-killall acceptor
-rmmod ksocknal
-rmmod portals
diff --git a/lustre/tests/mds.cfg b/lustre/tests/mds.cfg
deleted file mode 100644
index b9b9f780be..0000000000
--- a/lustre/tests/mds.cfg
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-# Config file for setting up a metadata server
-MDSFS=extN
-MDSDEV=/tmp/mds
-MDSSIZE=25000
-SETUP_MDS=y
-# LOVUUID=LovUUID
diff --git a/lustre/tests/modules.cfg b/lustre/tests/modules.cfg
deleted file mode 100755
index 10fb9a7150..0000000000
--- a/lustre/tests/modules.cfg
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-# Config file for running tests on a single host over loopback TCP
-NETWORK=tcp
diff --git a/lustre/tests/net-client.cfg b/lustre/tests/net-client.cfg
deleted file mode 100644
index 7cd4a8de63..0000000000
--- a/lustre/tests/net-client.cfg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-# Config file for setting up a remote server with a real OST
-NETWORK=tcp
-LOCALHOST=dev5
-SERVER=dev4
-PORT=988
diff --git a/lustre/tests/net-local.cfg b/lustre/tests/net-local.cfg
deleted file mode 100644
index 2ce3abe086..0000000000
--- a/lustre/tests/net-local.cfg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-# Config file for running tests on a single host over loopback TCP
-NETWORK=tcp
-LOCALHOST=localhost
-SERVER=localhost
-PORT=988
diff --git a/lustre/tests/net-server.cfg b/lustre/tests/net-server.cfg
deleted file mode 100644
index 83865253b0..0000000000
--- a/lustre/tests/net-server.cfg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-# Config file for setting up a remote server with a real OST
-NETWORK=tcp
-LOCALHOST=dev4
-SERVER=dev4
-PORT=988
diff --git a/lustre/tests/obddisk.cfg b/lustre/tests/obddisk.cfg
deleted file mode 100644
index 22e6ef2b40..0000000000
--- a/lustre/tests/obddisk.cfg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-# Config file for setting up an object storage target with obdfilter
-OSTDEV=/dev/hda7
-OSTFS=ext2
-OSTTYPE=obdfilter
-SETUP_OST=y
diff --git a/lustre/tests/obdecho.cfg b/lustre/tests/obdecho.cfg
deleted file mode 100644
index 2c2b40fa8f..0000000000
--- a/lustre/tests/obdecho.cfg
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-# Config file for setting up a test (echo) OST
-OSTTYPE=obdecho
-SETUP_OST=y
diff --git a/lustre/tests/obdfilter.cfg b/lustre/tests/obdfilter.cfg
deleted file mode 100644
index e9021c20ab..0000000000
--- a/lustre/tests/obdfilter.cfg
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-# Config file for setting up an object storage target with obdfilter
-OSTDEV=/tmp/ost
-OSTSIZE=10000
-OSTFS=extN
-OSTTYPE=obdfilter
-SETUP_OST=y
diff --git a/lustre/tests/ostreq.sh b/lustre/tests/ostreq.sh
deleted file mode 100644
index 2d600ca247..0000000000
--- a/lustre/tests/ostreq.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/sh
-
-SRCDIR="`dirname $0`/"
-. $SRCDIR/common.sh
-
-SERVER=localhost
-PORT=988
-TMP=${TMP:-/tmp}
-
-$ACCEPTOR $PORT
-
-$PTLCTL <<EOF
-mynid localhost
-setup tcp
-connect $SERVER $PORT
-add_uuid $SERVER
-add_uuid self
-quit
-EOF
-
-setup_lustre
-
-tmp_fs ext2 $TMP/fs 10000
-OBD=${LOOPDEV}
-
-$OBDCTL <<EOF
-device 0
-attach obdext2 OBDEXT2DEV
-setup ${OBD}
-device 1
-attach ost OSTDEV
-setup 0
-device 2
-attach osc OSCDEV
-setup -1
-quit
-EOF
diff --git a/lustre/tests/replay-single.sh b/lustre/tests/replay-single.sh
new file mode 100755
index 0000000000..3203044b55
--- /dev/null
+++ b/lustre/tests/replay-single.sh
@@ -0,0 +1,81 @@
+#!/bin/sh
+
+set -e
+
+LUSTRE=${LUSTRE:-`dirname $0`/..}
+LTESTDIR=${LTESTDIR:-$LUSTRE/../ltest}
+PATH=$PATH:$LUSTRE/utils:$LUSTRE/tests
+
+RLUSTRE=${RLUSTRE:-$LUSTRE}
+RPWD=${RPWD:-$PWD}
+
+. $LTESTDIR/functional/llite/common/common.sh
+
+# XXX I wish all this stuff was in some default-config.sh somewhere
+MOUNTPT=${MOUNTPT:-/mnt/lustre}
+MDSDEV=${MDSDEV:-/tmp/mds-`hostname`}
+MDSSIZE=${MDSSIZE:-100000}
+OSTDEV=${OSTDEV:-/tmp/ost-`hostname`}
+OSTSIZE=${OSTSIZE:-100000}
+UPCALL=${UPCALL:-$PWD/replay-single-upcall.sh}
+FSTYPE=${FSTYPE:-ext3}
+TIMEOUT=${TIMEOUT:-5}
+
+start() {
+    facet=$1
+    shift
+    lconf --node ${facet}_facet $@ replay-single.xml
+}
+
+stop() {
+    facet=$1
+    shift
+    lconf --node ${facet}_facet $@ -d replay-single.xml
+}
+
+replay_barrier() {
+    local dev=$1
+    sync
+    lctl --device %${dev}1 readonly
+    lctl --device %${dev}1 notransno
+}
+
+fail() {
+    stop mds
+    start mds
+    df $MOUNTPT
+}
+
+do_lmc() {
+    lmc -m replay-single.xml $@
+}
+
+add_facet() {
+    local facet=$1
+    shift
+    do_lmc --add node --node ${facet}_facet $@ --timeout $TIMEOUT
+    do_lmc --add net --node ${facet}_facet --nid localhost --nettype tcp
+}
+
+gen_config() {
+    rm -f replay-single.xml
+    add_facet mds
+    add_facet ost
+    add_facet client --lustre_upcall $UPCALL
+    do_lmc --add mds --node mds_facet --mds mds1 --dev $MDSDEV --size $MDSSIZE
+    do_lmc --add ost --node ost_facet --ost ost1 --dev $OSTDEV --size $OSTSIZE
+    do_lmc --add mtpt --node client_facet --path $MOUNTPT --mds mds1 --ost ost1
+}
+
+gen_config
+start mds
+start ost
+start client
+
+touch $MOUNTPT/lustre-works
+replay_barrier mds
+touch $MOUNTPT/lustre-does-not-work
+
+stop client
+stop ost
+stop mds
diff --git a/lustre/tests/runfailure-client-mds-recover.sh b/lustre/tests/runfailure-client-mds-recover.sh
deleted file mode 100755
index 8ea79df695..0000000000
--- a/lustre/tests/runfailure-client-mds-recover.sh
+++ /dev/null
@@ -1,103 +0,0 @@
-#!/bin/sh
-SRCDIR=.
-
-. common.sh
-
-reconnect () { 
-
-$OBDCTL <<EOF
-name2dev RPCDEV
-newconn
-quit
-EOF
-
-}
-
-
-
-echo 
-echo "Test 1 drop request:" `date` "creating /mnt/lustre/foo"
-echo
-rm -rf /mnt/lustre/*
-echo 0x80000107 > /proc/sys/lustre/fail_loc
-touch /mnt/lustre/foo &
-ps axww | grep touch
-echo "MDS dropped create request -- sleep 4 secs - watch for timeout"
-sleep 7
-# reconnect
-sleep 1
-echo "did things recover? check for file foo."
-ls -l /mnt/lustre
-echo "Test 1 done"
-
-
-echo
-echo "Test 2 test delay queue:" `date` "creating /mnt/lustre/foo"
-echo
-rm -rf /mnt/lustre/*
-mkdir /mnt/lustre/a
-echo 0x80000107 > /proc/sys/lustre/fail_loc
-touch /mnt/lustre/foo &
-ps axww | grep touch
-echo "MDS dropped create request -- sleep 4 secs - watch for timeout"
-sleep 4
-touch /mnt/lustre/a/f &
-#reconnect
-sleep 5
-echo "did things recover? check for file foo and a/f"
-ls -l /mnt/lustre
-ls -l /mnt/lustre/a
-echo "Test 2 done"
-
-echo
-echo "Test 3 dropped reply:" `date` "creating /mnt/lustre/foo2"
-echo
-rm -rf /mnt/lustre/*
-echo 0x80000119 > /proc/sys/lustre/fail_loc
-touch /mnt/lustre/foo2 &
-ps axww | grep touch
-echo "MDS dropped create request -- sleep 4 secs - watch for timeout"
-sleep 4
-# reconnect
-echo failure cleared
-sleep 4
-echo "did things recover? check for file foo2"
-ls -l /mnt/lustre
-echo "Test 3 done"
-
-
-echo
-echo "Test 4: Multiple failures"
-echo
-echo 0x0000107 > /proc/sys/lustre/fail_loc
-touch /mnt/lustre/bar &
-ps axww | grep touch
-echo "touch program will have repeated failures sleeping 10"
-sleep 10
-echo 0 > /proc/sys/lustre/fail_loc
-# reconnect
-sleep 6
-echo "failure cleared"
-echo "did things recover? Check for file bar"
-ls -l /mnt/lustre/bar
-
-echo "Test 4 done"
-
-
-echo 
-echo "Test 5: Continue writing during recovery:" `date` "creating and writing/mnt/lustre/foo"
-echo
-rm -rf /mnt/lustre/*
-./openme /mnt/lustre/foo3 & 
-./writeme /mnt/lustre/iogoeson & 
-sleep 1
-ls -l /mnt/lustre
-echo 0x80000107 > /proc/sys/lustre/fail_loc
-mknod /mnt/lustre/dev c 10 240 &
-echo "MDS dropped create request -- sleep 4 secs - watch for timeout"
-sleep 6
-# reconnect
-sleep 1
-echo "did things recover? check for file foo, bar, check log for reopen."
-ls -l /mnt/lustre
-echo "Test 5 done"
diff --git a/lustre/tests/small_write.c b/lustre/tests/small_write.c
new file mode 100644
index 0000000000..5bc2d950da
--- /dev/null
+++ b/lustre/tests/small_write.c
@@ -0,0 +1,134 @@
+#include <stdio.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main (int argc, char **argv) {
+	int fd, i, rc;
+	unsigned long bytes, lbytes;
+	struct stat st;
+	char *str, *str2, *readbuf;
+
+	if (argc != 3) {
+		fprintf(stderr, "usage: %s <filename> <bytes>\n", argv[0]);
+		return 1;
+	}
+
+	bytes = strtoul(argv[2], NULL, 10);
+	if (!bytes) {
+		printf("No bytes!\n");
+		return 1;
+	}
+	if (bytes % 2) {
+		printf("Need an even number of bytes!\n");
+		return 1;
+	}
+	lbytes = 3*bytes/2;
+
+	str = malloc(bytes+1);
+	if (!str) {
+		printf("No enough memory for %lu bytes.\n", bytes);
+		return 1;
+	}
+	str2 = malloc(lbytes+1);
+	if (!str) {
+		printf("No enough memory for %lu bytes.\n", lbytes);
+		return 1;
+	}
+	readbuf = malloc(bytes*2);
+	if (!str) {
+		printf("No enough memory for %lu bytes.\n", bytes*2);
+		return 1;
+	}
+
+	for(i=0; i < bytes; i++)
+		str[i] = 'a' + (i % 26);
+	str[i] = '\0';
+
+	memcpy(str2, str, bytes);
+	memcpy(str2+(bytes/2), str, bytes);
+	str2[lbytes] = '\0';
+
+	if (bytes < 320)
+		printf("First  String: %s\nSecond String: %s\n", str, str2);
+
+	fd = open(argv[1], O_CREAT|O_RDWR|O_TRUNC, 0700);
+	if (fd == -1) {
+		printf("Could not open file %s.\n", argv[1]);
+		return 1;
+	}
+
+	rc = write(fd, str, bytes);
+	if (rc != bytes) {
+		printf("Write failed!\n");
+		return 1;
+	}
+
+	sleep(1);
+	rc = fstat(fd, &st);
+	if (rc < 0 || st.st_size != bytes) {
+		printf("bad file %lu size first write %lu != %lu: rc %d\n",
+		       st.st_ino, st.st_size, bytes, rc);
+		return 1;
+	}
+
+	rc = lseek(fd, bytes / 2, SEEK_SET);
+	if (rc != bytes / 2) {
+		printf("Seek failed!\n");
+		return 1;
+	}
+
+	rc = write(fd, str, bytes);
+	if (rc != bytes) {
+		printf("Write failed!\n");
+		return 1;
+	}
+
+	rc = fstat(fd, &st);
+	if (rc < 0 || st.st_size != bytes + bytes / 2) {
+		printf("bad file %lu size second write %lu != %lu: rc %d\n",
+		       st.st_ino, st.st_size, bytes, rc);
+		return 1;
+	}
+
+	rc = lseek(fd, 0, SEEK_SET);
+	if (rc != 0) {
+		printf("Seek failed!\n");
+		return 1;
+	}
+
+	rc = read(fd, readbuf, bytes * 2);
+	if (rc != lbytes) {
+		printf("Read %d bytes instead of %lu.\n", rc, lbytes);
+		if (rc == -1)
+			perror("");
+		else
+			printf("%s\n%s\n", readbuf, str2);
+		rc = fstat(fd, &st);
+		if (rc < 0 || st.st_size != bytes + bytes / 2) {
+			printf("bad file size after read %lu != %lu: rc %d\n",
+			       st.st_size, bytes + bytes / 2, rc);
+			return 1;
+		}
+
+		return 1;
+	}
+
+	fd = close(fd);
+	if (fd == -1)
+		return 1;
+
+	if (bytes < 320)
+		printf("%s\n%s\n", readbuf, str2);
+	if (strcmp(readbuf, str2)) {
+		printf("No match!\n");
+		return 1;
+	}
+
+	printf("Pass!\n");
+	return 0;
+}
diff --git a/lustre/tests/snaprun.sh b/lustre/tests/snaprun.sh
deleted file mode 100755
index ea77cfb704..0000000000
--- a/lustre/tests/snaprun.sh
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/sh
-# Utility script to test several features of a snapshot filesystem
-# Assumes that snapshot has already been configured
-#
-# Copyright (C) 2001  Cluster File Systems, Inc.
-#
-# This code is issued under the GNU General Public License.
-# See the file COPYING in this distribution
-
-OBDDIR="`dirname $0`/.."
-. $OBDDIR/demos/config.sh
-
-qrun ls $MNTOBD
-qrun chown bin.bin $MNTOBD
-qrun ls -ld $MNTOBD
-qrun ls -ld $MNTSNAP
-qrun cp /etc/hosts $MNTOBD
-qrun ls $MNTOBD
-qrun ls $MNTSNAP
-
-# More complicated because we can't pass ">>" as an argument easily
-echo -n "Run 'echo today >> $MNTOBD/hello' [Y/n]" ; read JUNK
-case $JUNK in
-    n*|N*) echo "not run" ;;
-    *)	plog log "echo today >> $MNTOBD/hello"
-	echo "today" >> $MNTOBD/hello ;;
-esac
-
-qrun cat $MNTOBD/hello
-qrun cat $MNTSNAP/hello
-qrun cat $MNTOBD/link
-qrun cat $MNTSNAP/link
-qrun rm $MNTOBD/goodbye
-qrun ls $MNTOBD
-qrun ls $MNTSNAP
-qrun cat $MNTSNAP/goodbye
diff --git a/lustre/tests/trivial.sh b/lustre/tests/trivial.sh
deleted file mode 100755
index abfecf0b54..0000000000
--- a/lustre/tests/trivial.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-# Simple test of mount and unmount
-sh llsetup.sh obdecho.cfg net-local.cfg client-echo.cfg || exit 1
-# FIXME: Scan logs for any unusual things (unbalanced allocations, errors)
-sh llcleanup.sh obdecho.cfg net-local.cfg client-echo.cfg
-OBD_LEAK=`dmesg | awk '/obd memory leaked/ { print $7 }'`
-[ "$OBD_LEAK" != "0" ] && echo "OBD memory leak: $OBD_LEAK bytes" && ERR=1
-NAL_LEAK=`dmesg | awk '/NAL unloaded/ { print $7 }'
-[ "$NAL_LEAK" != "0)" ] && echo "Portals memory leak: $NAL_LEAK" && ERR=1
-/sbin/lsmod | grep -q portals && "Portals module still loaded" && ERR=1
-exit $ERR
-- 
GitLab